OZE_Main.list 4.1 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937
  1. OZE_Main.elf: file format elf32-littlearm
  2. Sections:
  3. Idx Name Size VMA LMA File off Algn
  4. 0 .isr_vector 00000298 08000000 08000000 00001000 2**0
  5. CONTENTS, ALLOC, LOAD, READONLY, DATA
  6. 1 .text 0002c1b0 080002a0 080002a0 000012a0 2**4
  7. CONTENTS, ALLOC, LOAD, READONLY, CODE
  8. 2 .rodata 00004c54 0802c450 0802c450 0002d450 2**3
  9. CONTENTS, ALLOC, LOAD, READONLY, DATA
  10. 3 .ARM 00000008 080310a4 080310a4 000320a4 2**2
  11. CONTENTS, ALLOC, LOAD, READONLY, DATA
  12. 4 .init_array 00000004 080310ac 080310ac 000320ac 2**2
  13. CONTENTS, ALLOC, LOAD, READONLY, DATA
  14. 5 .fini_array 00000004 080310b0 080310b0 000320b0 2**2
  15. CONTENTS, ALLOC, LOAD, READONLY, DATA
  16. 6 .data 00000224 24000000 080310b4 00033000 2**2
  17. CONTENTS, ALLOC, LOAD, DATA
  18. 7 .bss 0002af64 24000224 080312d8 00033224 2**2
  19. ALLOC
  20. 8 ._user_heap_stack 00000600 2402b188 080312d8 00034188 2**0
  21. ALLOC
  22. 9 .lwip_sec 000193fb 2402b788 080312d8 00033788 2**2
  23. ALLOC
  24. 10 .ARM.attributes 0000002e 00000000 00000000 00033224 2**0
  25. CONTENTS, READONLY
  26. 11 .debug_info 00050ec2 00000000 00000000 00033252 2**0
  27. CONTENTS, READONLY, DEBUGGING, OCTETS
  28. 12 .debug_abbrev 0000b5ee 00000000 00000000 00084114 2**0
  29. CONTENTS, READONLY, DEBUGGING, OCTETS
  30. 13 .debug_aranges 00003788 00000000 00000000 0008f708 2**3
  31. CONTENTS, READONLY, DEBUGGING, OCTETS
  32. 14 .debug_rnglists 00002c6b 00000000 00000000 00092e90 2**0
  33. CONTENTS, READONLY, DEBUGGING, OCTETS
  34. 15 .debug_macro 0004f03f 00000000 00000000 00095afb 2**0
  35. CONTENTS, READONLY, DEBUGGING, OCTETS
  36. 16 .debug_line 000570dd 00000000 00000000 000e4b3a 2**0
  37. CONTENTS, READONLY, DEBUGGING, OCTETS
  38. 17 .debug_str 0018e539 00000000 00000000 0013bc17 2**0
  39. CONTENTS, READONLY, DEBUGGING, OCTETS
  40. 18 .comment 00000043 00000000 00000000 002ca150 2**0
  41. CONTENTS, READONLY
  42. 19 .debug_frame 0000f94c 00000000 00000000 002ca194 2**2
  43. CONTENTS, READONLY, DEBUGGING, OCTETS
  44. 20 .debug_line_str 00000064 00000000 00000000 002d9ae0 2**0
  45. CONTENTS, READONLY, DEBUGGING, OCTETS
  46. Disassembly of section .text:
  47. 080002a0 <__do_global_dtors_aux>:
  48. 80002a0: b510 push {r4, lr}
  49. 80002a2: 4c05 ldr r4, [pc, #20] @ (80002b8 <__do_global_dtors_aux+0x18>)
  50. 80002a4: 7823 ldrb r3, [r4, #0]
  51. 80002a6: b933 cbnz r3, 80002b6 <__do_global_dtors_aux+0x16>
  52. 80002a8: 4b04 ldr r3, [pc, #16] @ (80002bc <__do_global_dtors_aux+0x1c>)
  53. 80002aa: b113 cbz r3, 80002b2 <__do_global_dtors_aux+0x12>
  54. 80002ac: 4804 ldr r0, [pc, #16] @ (80002c0 <__do_global_dtors_aux+0x20>)
  55. 80002ae: f3af 8000 nop.w
  56. 80002b2: 2301 movs r3, #1
  57. 80002b4: 7023 strb r3, [r4, #0]
  58. 80002b6: bd10 pop {r4, pc}
  59. 80002b8: 24000224 .word 0x24000224
  60. 80002bc: 00000000 .word 0x00000000
  61. 80002c0: 0802c438 .word 0x0802c438
  62. 080002c4 <frame_dummy>:
  63. 80002c4: b508 push {r3, lr}
  64. 80002c6: 4b03 ldr r3, [pc, #12] @ (80002d4 <frame_dummy+0x10>)
  65. 80002c8: b11b cbz r3, 80002d2 <frame_dummy+0xe>
  66. 80002ca: 4903 ldr r1, [pc, #12] @ (80002d8 <frame_dummy+0x14>)
  67. 80002cc: 4803 ldr r0, [pc, #12] @ (80002dc <frame_dummy+0x18>)
  68. 80002ce: f3af 8000 nop.w
  69. 80002d2: bd08 pop {r3, pc}
  70. 80002d4: 00000000 .word 0x00000000
  71. 80002d8: 24000228 .word 0x24000228
  72. 80002dc: 0802c438 .word 0x0802c438
  73. 080002e0 <strcmp>:
  74. 80002e0: f810 2b01 ldrb.w r2, [r0], #1
  75. 80002e4: f811 3b01 ldrb.w r3, [r1], #1
  76. 80002e8: 2a01 cmp r2, #1
  77. 80002ea: bf28 it cs
  78. 80002ec: 429a cmpcs r2, r3
  79. 80002ee: d0f7 beq.n 80002e0 <strcmp>
  80. 80002f0: 1ad0 subs r0, r2, r3
  81. 80002f2: 4770 bx lr
  82. ...
  83. 08000300 <memchr>:
  84. 8000300: f001 01ff and.w r1, r1, #255 @ 0xff
  85. 8000304: 2a10 cmp r2, #16
  86. 8000306: db2b blt.n 8000360 <memchr+0x60>
  87. 8000308: f010 0f07 tst.w r0, #7
  88. 800030c: d008 beq.n 8000320 <memchr+0x20>
  89. 800030e: f810 3b01 ldrb.w r3, [r0], #1
  90. 8000312: 3a01 subs r2, #1
  91. 8000314: 428b cmp r3, r1
  92. 8000316: d02d beq.n 8000374 <memchr+0x74>
  93. 8000318: f010 0f07 tst.w r0, #7
  94. 800031c: b342 cbz r2, 8000370 <memchr+0x70>
  95. 800031e: d1f6 bne.n 800030e <memchr+0xe>
  96. 8000320: b4f0 push {r4, r5, r6, r7}
  97. 8000322: ea41 2101 orr.w r1, r1, r1, lsl #8
  98. 8000326: ea41 4101 orr.w r1, r1, r1, lsl #16
  99. 800032a: f022 0407 bic.w r4, r2, #7
  100. 800032e: f07f 0700 mvns.w r7, #0
  101. 8000332: 2300 movs r3, #0
  102. 8000334: e8f0 5602 ldrd r5, r6, [r0], #8
  103. 8000338: 3c08 subs r4, #8
  104. 800033a: ea85 0501 eor.w r5, r5, r1
  105. 800033e: ea86 0601 eor.w r6, r6, r1
  106. 8000342: fa85 f547 uadd8 r5, r5, r7
  107. 8000346: faa3 f587 sel r5, r3, r7
  108. 800034a: fa86 f647 uadd8 r6, r6, r7
  109. 800034e: faa5 f687 sel r6, r5, r7
  110. 8000352: b98e cbnz r6, 8000378 <memchr+0x78>
  111. 8000354: d1ee bne.n 8000334 <memchr+0x34>
  112. 8000356: bcf0 pop {r4, r5, r6, r7}
  113. 8000358: f001 01ff and.w r1, r1, #255 @ 0xff
  114. 800035c: f002 0207 and.w r2, r2, #7
  115. 8000360: b132 cbz r2, 8000370 <memchr+0x70>
  116. 8000362: f810 3b01 ldrb.w r3, [r0], #1
  117. 8000366: 3a01 subs r2, #1
  118. 8000368: ea83 0301 eor.w r3, r3, r1
  119. 800036c: b113 cbz r3, 8000374 <memchr+0x74>
  120. 800036e: d1f8 bne.n 8000362 <memchr+0x62>
  121. 8000370: 2000 movs r0, #0
  122. 8000372: 4770 bx lr
  123. 8000374: 3801 subs r0, #1
  124. 8000376: 4770 bx lr
  125. 8000378: 2d00 cmp r5, #0
  126. 800037a: bf06 itte eq
  127. 800037c: 4635 moveq r5, r6
  128. 800037e: 3803 subeq r0, #3
  129. 8000380: 3807 subne r0, #7
  130. 8000382: f015 0f01 tst.w r5, #1
  131. 8000386: d107 bne.n 8000398 <memchr+0x98>
  132. 8000388: 3001 adds r0, #1
  133. 800038a: f415 7f80 tst.w r5, #256 @ 0x100
  134. 800038e: bf02 ittt eq
  135. 8000390: 3001 addeq r0, #1
  136. 8000392: f415 3fc0 tsteq.w r5, #98304 @ 0x18000
  137. 8000396: 3001 addeq r0, #1
  138. 8000398: bcf0 pop {r4, r5, r6, r7}
  139. 800039a: 3801 subs r0, #1
  140. 800039c: 4770 bx lr
  141. 800039e: bf00 nop
  142. 080003a0 <strlen>:
  143. 80003a0: 4603 mov r3, r0
  144. 80003a2: f813 2b01 ldrb.w r2, [r3], #1
  145. 80003a6: 2a00 cmp r2, #0
  146. 80003a8: d1fb bne.n 80003a2 <strlen+0x2>
  147. 80003aa: 1a18 subs r0, r3, r0
  148. 80003ac: 3801 subs r0, #1
  149. 80003ae: 4770 bx lr
  150. 080003b0 <__aeabi_drsub>:
  151. 80003b0: f081 4100 eor.w r1, r1, #2147483648 @ 0x80000000
  152. 80003b4: e002 b.n 80003bc <__adddf3>
  153. 80003b6: bf00 nop
  154. 080003b8 <__aeabi_dsub>:
  155. 80003b8: f083 4300 eor.w r3, r3, #2147483648 @ 0x80000000
  156. 080003bc <__adddf3>:
  157. 80003bc: b530 push {r4, r5, lr}
  158. 80003be: ea4f 0441 mov.w r4, r1, lsl #1
  159. 80003c2: ea4f 0543 mov.w r5, r3, lsl #1
  160. 80003c6: ea94 0f05 teq r4, r5
  161. 80003ca: bf08 it eq
  162. 80003cc: ea90 0f02 teqeq r0, r2
  163. 80003d0: bf1f itttt ne
  164. 80003d2: ea54 0c00 orrsne.w ip, r4, r0
  165. 80003d6: ea55 0c02 orrsne.w ip, r5, r2
  166. 80003da: ea7f 5c64 mvnsne.w ip, r4, asr #21
  167. 80003de: ea7f 5c65 mvnsne.w ip, r5, asr #21
  168. 80003e2: f000 80e2 beq.w 80005aa <__adddf3+0x1ee>
  169. 80003e6: ea4f 5454 mov.w r4, r4, lsr #21
  170. 80003ea: ebd4 5555 rsbs r5, r4, r5, lsr #21
  171. 80003ee: bfb8 it lt
  172. 80003f0: 426d neglt r5, r5
  173. 80003f2: dd0c ble.n 800040e <__adddf3+0x52>
  174. 80003f4: 442c add r4, r5
  175. 80003f6: ea80 0202 eor.w r2, r0, r2
  176. 80003fa: ea81 0303 eor.w r3, r1, r3
  177. 80003fe: ea82 0000 eor.w r0, r2, r0
  178. 8000402: ea83 0101 eor.w r1, r3, r1
  179. 8000406: ea80 0202 eor.w r2, r0, r2
  180. 800040a: ea81 0303 eor.w r3, r1, r3
  181. 800040e: 2d36 cmp r5, #54 @ 0x36
  182. 8000410: bf88 it hi
  183. 8000412: bd30 pophi {r4, r5, pc}
  184. 8000414: f011 4f00 tst.w r1, #2147483648 @ 0x80000000
  185. 8000418: ea4f 3101 mov.w r1, r1, lsl #12
  186. 800041c: f44f 1c80 mov.w ip, #1048576 @ 0x100000
  187. 8000420: ea4c 3111 orr.w r1, ip, r1, lsr #12
  188. 8000424: d002 beq.n 800042c <__adddf3+0x70>
  189. 8000426: 4240 negs r0, r0
  190. 8000428: eb61 0141 sbc.w r1, r1, r1, lsl #1
  191. 800042c: f013 4f00 tst.w r3, #2147483648 @ 0x80000000
  192. 8000430: ea4f 3303 mov.w r3, r3, lsl #12
  193. 8000434: ea4c 3313 orr.w r3, ip, r3, lsr #12
  194. 8000438: d002 beq.n 8000440 <__adddf3+0x84>
  195. 800043a: 4252 negs r2, r2
  196. 800043c: eb63 0343 sbc.w r3, r3, r3, lsl #1
  197. 8000440: ea94 0f05 teq r4, r5
  198. 8000444: f000 80a7 beq.w 8000596 <__adddf3+0x1da>
  199. 8000448: f1a4 0401 sub.w r4, r4, #1
  200. 800044c: f1d5 0e20 rsbs lr, r5, #32
  201. 8000450: db0d blt.n 800046e <__adddf3+0xb2>
  202. 8000452: fa02 fc0e lsl.w ip, r2, lr
  203. 8000456: fa22 f205 lsr.w r2, r2, r5
  204. 800045a: 1880 adds r0, r0, r2
  205. 800045c: f141 0100 adc.w r1, r1, #0
  206. 8000460: fa03 f20e lsl.w r2, r3, lr
  207. 8000464: 1880 adds r0, r0, r2
  208. 8000466: fa43 f305 asr.w r3, r3, r5
  209. 800046a: 4159 adcs r1, r3
  210. 800046c: e00e b.n 800048c <__adddf3+0xd0>
  211. 800046e: f1a5 0520 sub.w r5, r5, #32
  212. 8000472: f10e 0e20 add.w lr, lr, #32
  213. 8000476: 2a01 cmp r2, #1
  214. 8000478: fa03 fc0e lsl.w ip, r3, lr
  215. 800047c: bf28 it cs
  216. 800047e: f04c 0c02 orrcs.w ip, ip, #2
  217. 8000482: fa43 f305 asr.w r3, r3, r5
  218. 8000486: 18c0 adds r0, r0, r3
  219. 8000488: eb51 71e3 adcs.w r1, r1, r3, asr #31
  220. 800048c: f001 4500 and.w r5, r1, #2147483648 @ 0x80000000
  221. 8000490: d507 bpl.n 80004a2 <__adddf3+0xe6>
  222. 8000492: f04f 0e00 mov.w lr, #0
  223. 8000496: f1dc 0c00 rsbs ip, ip, #0
  224. 800049a: eb7e 0000 sbcs.w r0, lr, r0
  225. 800049e: eb6e 0101 sbc.w r1, lr, r1
  226. 80004a2: f5b1 1f80 cmp.w r1, #1048576 @ 0x100000
  227. 80004a6: d31b bcc.n 80004e0 <__adddf3+0x124>
  228. 80004a8: f5b1 1f00 cmp.w r1, #2097152 @ 0x200000
  229. 80004ac: d30c bcc.n 80004c8 <__adddf3+0x10c>
  230. 80004ae: 0849 lsrs r1, r1, #1
  231. 80004b0: ea5f 0030 movs.w r0, r0, rrx
  232. 80004b4: ea4f 0c3c mov.w ip, ip, rrx
  233. 80004b8: f104 0401 add.w r4, r4, #1
  234. 80004bc: ea4f 5244 mov.w r2, r4, lsl #21
  235. 80004c0: f512 0f80 cmn.w r2, #4194304 @ 0x400000
  236. 80004c4: f080 809a bcs.w 80005fc <__adddf3+0x240>
  237. 80004c8: f1bc 4f00 cmp.w ip, #2147483648 @ 0x80000000
  238. 80004cc: bf08 it eq
  239. 80004ce: ea5f 0c50 movseq.w ip, r0, lsr #1
  240. 80004d2: f150 0000 adcs.w r0, r0, #0
  241. 80004d6: eb41 5104 adc.w r1, r1, r4, lsl #20
  242. 80004da: ea41 0105 orr.w r1, r1, r5
  243. 80004de: bd30 pop {r4, r5, pc}
  244. 80004e0: ea5f 0c4c movs.w ip, ip, lsl #1
  245. 80004e4: 4140 adcs r0, r0
  246. 80004e6: eb41 0101 adc.w r1, r1, r1
  247. 80004ea: 3c01 subs r4, #1
  248. 80004ec: bf28 it cs
  249. 80004ee: f5b1 1f80 cmpcs.w r1, #1048576 @ 0x100000
  250. 80004f2: d2e9 bcs.n 80004c8 <__adddf3+0x10c>
  251. 80004f4: f091 0f00 teq r1, #0
  252. 80004f8: bf04 itt eq
  253. 80004fa: 4601 moveq r1, r0
  254. 80004fc: 2000 moveq r0, #0
  255. 80004fe: fab1 f381 clz r3, r1
  256. 8000502: bf08 it eq
  257. 8000504: 3320 addeq r3, #32
  258. 8000506: f1a3 030b sub.w r3, r3, #11
  259. 800050a: f1b3 0220 subs.w r2, r3, #32
  260. 800050e: da0c bge.n 800052a <__adddf3+0x16e>
  261. 8000510: 320c adds r2, #12
  262. 8000512: dd08 ble.n 8000526 <__adddf3+0x16a>
  263. 8000514: f102 0c14 add.w ip, r2, #20
  264. 8000518: f1c2 020c rsb r2, r2, #12
  265. 800051c: fa01 f00c lsl.w r0, r1, ip
  266. 8000520: fa21 f102 lsr.w r1, r1, r2
  267. 8000524: e00c b.n 8000540 <__adddf3+0x184>
  268. 8000526: f102 0214 add.w r2, r2, #20
  269. 800052a: bfd8 it le
  270. 800052c: f1c2 0c20 rsble ip, r2, #32
  271. 8000530: fa01 f102 lsl.w r1, r1, r2
  272. 8000534: fa20 fc0c lsr.w ip, r0, ip
  273. 8000538: bfdc itt le
  274. 800053a: ea41 010c orrle.w r1, r1, ip
  275. 800053e: 4090 lslle r0, r2
  276. 8000540: 1ae4 subs r4, r4, r3
  277. 8000542: bfa2 ittt ge
  278. 8000544: eb01 5104 addge.w r1, r1, r4, lsl #20
  279. 8000548: 4329 orrge r1, r5
  280. 800054a: bd30 popge {r4, r5, pc}
  281. 800054c: ea6f 0404 mvn.w r4, r4
  282. 8000550: 3c1f subs r4, #31
  283. 8000552: da1c bge.n 800058e <__adddf3+0x1d2>
  284. 8000554: 340c adds r4, #12
  285. 8000556: dc0e bgt.n 8000576 <__adddf3+0x1ba>
  286. 8000558: f104 0414 add.w r4, r4, #20
  287. 800055c: f1c4 0220 rsb r2, r4, #32
  288. 8000560: fa20 f004 lsr.w r0, r0, r4
  289. 8000564: fa01 f302 lsl.w r3, r1, r2
  290. 8000568: ea40 0003 orr.w r0, r0, r3
  291. 800056c: fa21 f304 lsr.w r3, r1, r4
  292. 8000570: ea45 0103 orr.w r1, r5, r3
  293. 8000574: bd30 pop {r4, r5, pc}
  294. 8000576: f1c4 040c rsb r4, r4, #12
  295. 800057a: f1c4 0220 rsb r2, r4, #32
  296. 800057e: fa20 f002 lsr.w r0, r0, r2
  297. 8000582: fa01 f304 lsl.w r3, r1, r4
  298. 8000586: ea40 0003 orr.w r0, r0, r3
  299. 800058a: 4629 mov r1, r5
  300. 800058c: bd30 pop {r4, r5, pc}
  301. 800058e: fa21 f004 lsr.w r0, r1, r4
  302. 8000592: 4629 mov r1, r5
  303. 8000594: bd30 pop {r4, r5, pc}
  304. 8000596: f094 0f00 teq r4, #0
  305. 800059a: f483 1380 eor.w r3, r3, #1048576 @ 0x100000
  306. 800059e: bf06 itte eq
  307. 80005a0: f481 1180 eoreq.w r1, r1, #1048576 @ 0x100000
  308. 80005a4: 3401 addeq r4, #1
  309. 80005a6: 3d01 subne r5, #1
  310. 80005a8: e74e b.n 8000448 <__adddf3+0x8c>
  311. 80005aa: ea7f 5c64 mvns.w ip, r4, asr #21
  312. 80005ae: bf18 it ne
  313. 80005b0: ea7f 5c65 mvnsne.w ip, r5, asr #21
  314. 80005b4: d029 beq.n 800060a <__adddf3+0x24e>
  315. 80005b6: ea94 0f05 teq r4, r5
  316. 80005ba: bf08 it eq
  317. 80005bc: ea90 0f02 teqeq r0, r2
  318. 80005c0: d005 beq.n 80005ce <__adddf3+0x212>
  319. 80005c2: ea54 0c00 orrs.w ip, r4, r0
  320. 80005c6: bf04 itt eq
  321. 80005c8: 4619 moveq r1, r3
  322. 80005ca: 4610 moveq r0, r2
  323. 80005cc: bd30 pop {r4, r5, pc}
  324. 80005ce: ea91 0f03 teq r1, r3
  325. 80005d2: bf1e ittt ne
  326. 80005d4: 2100 movne r1, #0
  327. 80005d6: 2000 movne r0, #0
  328. 80005d8: bd30 popne {r4, r5, pc}
  329. 80005da: ea5f 5c54 movs.w ip, r4, lsr #21
  330. 80005de: d105 bne.n 80005ec <__adddf3+0x230>
  331. 80005e0: 0040 lsls r0, r0, #1
  332. 80005e2: 4149 adcs r1, r1
  333. 80005e4: bf28 it cs
  334. 80005e6: f041 4100 orrcs.w r1, r1, #2147483648 @ 0x80000000
  335. 80005ea: bd30 pop {r4, r5, pc}
  336. 80005ec: f514 0480 adds.w r4, r4, #4194304 @ 0x400000
  337. 80005f0: bf3c itt cc
  338. 80005f2: f501 1180 addcc.w r1, r1, #1048576 @ 0x100000
  339. 80005f6: bd30 popcc {r4, r5, pc}
  340. 80005f8: f001 4500 and.w r5, r1, #2147483648 @ 0x80000000
  341. 80005fc: f045 41fe orr.w r1, r5, #2130706432 @ 0x7f000000
  342. 8000600: f441 0170 orr.w r1, r1, #15728640 @ 0xf00000
  343. 8000604: f04f 0000 mov.w r0, #0
  344. 8000608: bd30 pop {r4, r5, pc}
  345. 800060a: ea7f 5c64 mvns.w ip, r4, asr #21
  346. 800060e: bf1a itte ne
  347. 8000610: 4619 movne r1, r3
  348. 8000612: 4610 movne r0, r2
  349. 8000614: ea7f 5c65 mvnseq.w ip, r5, asr #21
  350. 8000618: bf1c itt ne
  351. 800061a: 460b movne r3, r1
  352. 800061c: 4602 movne r2, r0
  353. 800061e: ea50 3401 orrs.w r4, r0, r1, lsl #12
  354. 8000622: bf06 itte eq
  355. 8000624: ea52 3503 orrseq.w r5, r2, r3, lsl #12
  356. 8000628: ea91 0f03 teqeq r1, r3
  357. 800062c: f441 2100 orrne.w r1, r1, #524288 @ 0x80000
  358. 8000630: bd30 pop {r4, r5, pc}
  359. 8000632: bf00 nop
  360. 08000634 <__aeabi_ui2d>:
  361. 8000634: f090 0f00 teq r0, #0
  362. 8000638: bf04 itt eq
  363. 800063a: 2100 moveq r1, #0
  364. 800063c: 4770 bxeq lr
  365. 800063e: b530 push {r4, r5, lr}
  366. 8000640: f44f 6480 mov.w r4, #1024 @ 0x400
  367. 8000644: f104 0432 add.w r4, r4, #50 @ 0x32
  368. 8000648: f04f 0500 mov.w r5, #0
  369. 800064c: f04f 0100 mov.w r1, #0
  370. 8000650: e750 b.n 80004f4 <__adddf3+0x138>
  371. 8000652: bf00 nop
  372. 08000654 <__aeabi_i2d>:
  373. 8000654: f090 0f00 teq r0, #0
  374. 8000658: bf04 itt eq
  375. 800065a: 2100 moveq r1, #0
  376. 800065c: 4770 bxeq lr
  377. 800065e: b530 push {r4, r5, lr}
  378. 8000660: f44f 6480 mov.w r4, #1024 @ 0x400
  379. 8000664: f104 0432 add.w r4, r4, #50 @ 0x32
  380. 8000668: f010 4500 ands.w r5, r0, #2147483648 @ 0x80000000
  381. 800066c: bf48 it mi
  382. 800066e: 4240 negmi r0, r0
  383. 8000670: f04f 0100 mov.w r1, #0
  384. 8000674: e73e b.n 80004f4 <__adddf3+0x138>
  385. 8000676: bf00 nop
  386. 08000678 <__aeabi_f2d>:
  387. 8000678: 0042 lsls r2, r0, #1
  388. 800067a: ea4f 01e2 mov.w r1, r2, asr #3
  389. 800067e: ea4f 0131 mov.w r1, r1, rrx
  390. 8000682: ea4f 7002 mov.w r0, r2, lsl #28
  391. 8000686: bf1f itttt ne
  392. 8000688: f012 437f andsne.w r3, r2, #4278190080 @ 0xff000000
  393. 800068c: f093 4f7f teqne r3, #4278190080 @ 0xff000000
  394. 8000690: f081 5160 eorne.w r1, r1, #939524096 @ 0x38000000
  395. 8000694: 4770 bxne lr
  396. 8000696: f032 427f bics.w r2, r2, #4278190080 @ 0xff000000
  397. 800069a: bf08 it eq
  398. 800069c: 4770 bxeq lr
  399. 800069e: f093 4f7f teq r3, #4278190080 @ 0xff000000
  400. 80006a2: bf04 itt eq
  401. 80006a4: f441 2100 orreq.w r1, r1, #524288 @ 0x80000
  402. 80006a8: 4770 bxeq lr
  403. 80006aa: b530 push {r4, r5, lr}
  404. 80006ac: f44f 7460 mov.w r4, #896 @ 0x380
  405. 80006b0: f001 4500 and.w r5, r1, #2147483648 @ 0x80000000
  406. 80006b4: f021 4100 bic.w r1, r1, #2147483648 @ 0x80000000
  407. 80006b8: e71c b.n 80004f4 <__adddf3+0x138>
  408. 80006ba: bf00 nop
  409. 080006bc <__aeabi_ul2d>:
  410. 80006bc: ea50 0201 orrs.w r2, r0, r1
  411. 80006c0: bf08 it eq
  412. 80006c2: 4770 bxeq lr
  413. 80006c4: b530 push {r4, r5, lr}
  414. 80006c6: f04f 0500 mov.w r5, #0
  415. 80006ca: e00a b.n 80006e2 <__aeabi_l2d+0x16>
  416. 080006cc <__aeabi_l2d>:
  417. 80006cc: ea50 0201 orrs.w r2, r0, r1
  418. 80006d0: bf08 it eq
  419. 80006d2: 4770 bxeq lr
  420. 80006d4: b530 push {r4, r5, lr}
  421. 80006d6: f011 4500 ands.w r5, r1, #2147483648 @ 0x80000000
  422. 80006da: d502 bpl.n 80006e2 <__aeabi_l2d+0x16>
  423. 80006dc: 4240 negs r0, r0
  424. 80006de: eb61 0141 sbc.w r1, r1, r1, lsl #1
  425. 80006e2: f44f 6480 mov.w r4, #1024 @ 0x400
  426. 80006e6: f104 0432 add.w r4, r4, #50 @ 0x32
  427. 80006ea: ea5f 5c91 movs.w ip, r1, lsr #22
  428. 80006ee: f43f aed8 beq.w 80004a2 <__adddf3+0xe6>
  429. 80006f2: f04f 0203 mov.w r2, #3
  430. 80006f6: ea5f 0cdc movs.w ip, ip, lsr #3
  431. 80006fa: bf18 it ne
  432. 80006fc: 3203 addne r2, #3
  433. 80006fe: ea5f 0cdc movs.w ip, ip, lsr #3
  434. 8000702: bf18 it ne
  435. 8000704: 3203 addne r2, #3
  436. 8000706: eb02 02dc add.w r2, r2, ip, lsr #3
  437. 800070a: f1c2 0320 rsb r3, r2, #32
  438. 800070e: fa00 fc03 lsl.w ip, r0, r3
  439. 8000712: fa20 f002 lsr.w r0, r0, r2
  440. 8000716: fa01 fe03 lsl.w lr, r1, r3
  441. 800071a: ea40 000e orr.w r0, r0, lr
  442. 800071e: fa21 f102 lsr.w r1, r1, r2
  443. 8000722: 4414 add r4, r2
  444. 8000724: e6bd b.n 80004a2 <__adddf3+0xe6>
  445. 8000726: bf00 nop
  446. 08000728 <__aeabi_uldivmod>:
  447. 8000728: b953 cbnz r3, 8000740 <__aeabi_uldivmod+0x18>
  448. 800072a: b94a cbnz r2, 8000740 <__aeabi_uldivmod+0x18>
  449. 800072c: 2900 cmp r1, #0
  450. 800072e: bf08 it eq
  451. 8000730: 2800 cmpeq r0, #0
  452. 8000732: bf1c itt ne
  453. 8000734: f04f 31ff movne.w r1, #4294967295 @ 0xffffffff
  454. 8000738: f04f 30ff movne.w r0, #4294967295 @ 0xffffffff
  455. 800073c: f000 b9a2 b.w 8000a84 <__aeabi_idiv0>
  456. 8000740: f1ad 0c08 sub.w ip, sp, #8
  457. 8000744: e96d ce04 strd ip, lr, [sp, #-16]!
  458. 8000748: f000 f83e bl 80007c8 <__udivmoddi4>
  459. 800074c: f8dd e004 ldr.w lr, [sp, #4]
  460. 8000750: e9dd 2302 ldrd r2, r3, [sp, #8]
  461. 8000754: b004 add sp, #16
  462. 8000756: 4770 bx lr
  463. 08000758 <__aeabi_d2lz>:
  464. 8000758: b508 push {r3, lr}
  465. 800075a: 4602 mov r2, r0
  466. 800075c: 460b mov r3, r1
  467. 800075e: ec43 2b17 vmov d7, r2, r3
  468. 8000762: eeb5 7bc0 vcmpe.f64 d7, #0.0
  469. 8000766: eef1 fa10 vmrs APSR_nzcv, fpscr
  470. 800076a: d403 bmi.n 8000774 <__aeabi_d2lz+0x1c>
  471. 800076c: e8bd 4008 ldmia.w sp!, {r3, lr}
  472. 8000770: f000 b80a b.w 8000788 <__aeabi_d2ulz>
  473. 8000774: eeb1 7b47 vneg.f64 d7, d7
  474. 8000778: ec51 0b17 vmov r0, r1, d7
  475. 800077c: f000 f804 bl 8000788 <__aeabi_d2ulz>
  476. 8000780: 4240 negs r0, r0
  477. 8000782: eb61 0141 sbc.w r1, r1, r1, lsl #1
  478. 8000786: bd08 pop {r3, pc}
  479. 08000788 <__aeabi_d2ulz>:
  480. 8000788: ed9f 6b0b vldr d6, [pc, #44] @ 80007b8 <__aeabi_d2ulz+0x30>
  481. 800078c: ec41 0b17 vmov d7, r0, r1
  482. 8000790: ed9f 5b0b vldr d5, [pc, #44] @ 80007c0 <__aeabi_d2ulz+0x38>
  483. 8000794: ee27 6b06 vmul.f64 d6, d7, d6
  484. 8000798: eebc 6bc6 vcvt.u32.f64 s12, d6
  485. 800079c: eeb8 4b46 vcvt.f64.u32 d4, s12
  486. 80007a0: eea4 7b45 vfms.f64 d7, d4, d5
  487. 80007a4: eefc 7bc7 vcvt.u32.f64 s15, d7
  488. 80007a8: ee16 1a10 vmov r1, s12
  489. 80007ac: ee17 0a90 vmov r0, s15
  490. 80007b0: 4770 bx lr
  491. 80007b2: bf00 nop
  492. 80007b4: f3af 8000 nop.w
  493. 80007b8: 00000000 .word 0x00000000
  494. 80007bc: 3df00000 .word 0x3df00000
  495. 80007c0: 00000000 .word 0x00000000
  496. 80007c4: 41f00000 .word 0x41f00000
  497. 080007c8 <__udivmoddi4>:
  498. 80007c8: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  499. 80007cc: 9d08 ldr r5, [sp, #32]
  500. 80007ce: 460c mov r4, r1
  501. 80007d0: 2b00 cmp r3, #0
  502. 80007d2: d14e bne.n 8000872 <__udivmoddi4+0xaa>
  503. 80007d4: 4694 mov ip, r2
  504. 80007d6: 458c cmp ip, r1
  505. 80007d8: 4686 mov lr, r0
  506. 80007da: fab2 f282 clz r2, r2
  507. 80007de: d962 bls.n 80008a6 <__udivmoddi4+0xde>
  508. 80007e0: b14a cbz r2, 80007f6 <__udivmoddi4+0x2e>
  509. 80007e2: f1c2 0320 rsb r3, r2, #32
  510. 80007e6: 4091 lsls r1, r2
  511. 80007e8: fa20 f303 lsr.w r3, r0, r3
  512. 80007ec: fa0c fc02 lsl.w ip, ip, r2
  513. 80007f0: 4319 orrs r1, r3
  514. 80007f2: fa00 fe02 lsl.w lr, r0, r2
  515. 80007f6: ea4f 471c mov.w r7, ip, lsr #16
  516. 80007fa: fa1f f68c uxth.w r6, ip
  517. 80007fe: fbb1 f4f7 udiv r4, r1, r7
  518. 8000802: ea4f 431e mov.w r3, lr, lsr #16
  519. 8000806: fb07 1114 mls r1, r7, r4, r1
  520. 800080a: ea43 4301 orr.w r3, r3, r1, lsl #16
  521. 800080e: fb04 f106 mul.w r1, r4, r6
  522. 8000812: 4299 cmp r1, r3
  523. 8000814: d90a bls.n 800082c <__udivmoddi4+0x64>
  524. 8000816: eb1c 0303 adds.w r3, ip, r3
  525. 800081a: f104 30ff add.w r0, r4, #4294967295 @ 0xffffffff
  526. 800081e: f080 8112 bcs.w 8000a46 <__udivmoddi4+0x27e>
  527. 8000822: 4299 cmp r1, r3
  528. 8000824: f240 810f bls.w 8000a46 <__udivmoddi4+0x27e>
  529. 8000828: 3c02 subs r4, #2
  530. 800082a: 4463 add r3, ip
  531. 800082c: 1a59 subs r1, r3, r1
  532. 800082e: fa1f f38e uxth.w r3, lr
  533. 8000832: fbb1 f0f7 udiv r0, r1, r7
  534. 8000836: fb07 1110 mls r1, r7, r0, r1
  535. 800083a: ea43 4301 orr.w r3, r3, r1, lsl #16
  536. 800083e: fb00 f606 mul.w r6, r0, r6
  537. 8000842: 429e cmp r6, r3
  538. 8000844: d90a bls.n 800085c <__udivmoddi4+0x94>
  539. 8000846: eb1c 0303 adds.w r3, ip, r3
  540. 800084a: f100 31ff add.w r1, r0, #4294967295 @ 0xffffffff
  541. 800084e: f080 80fc bcs.w 8000a4a <__udivmoddi4+0x282>
  542. 8000852: 429e cmp r6, r3
  543. 8000854: f240 80f9 bls.w 8000a4a <__udivmoddi4+0x282>
  544. 8000858: 4463 add r3, ip
  545. 800085a: 3802 subs r0, #2
  546. 800085c: 1b9b subs r3, r3, r6
  547. 800085e: ea40 4004 orr.w r0, r0, r4, lsl #16
  548. 8000862: 2100 movs r1, #0
  549. 8000864: b11d cbz r5, 800086e <__udivmoddi4+0xa6>
  550. 8000866: 40d3 lsrs r3, r2
  551. 8000868: 2200 movs r2, #0
  552. 800086a: e9c5 3200 strd r3, r2, [r5]
  553. 800086e: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  554. 8000872: 428b cmp r3, r1
  555. 8000874: d905 bls.n 8000882 <__udivmoddi4+0xba>
  556. 8000876: b10d cbz r5, 800087c <__udivmoddi4+0xb4>
  557. 8000878: e9c5 0100 strd r0, r1, [r5]
  558. 800087c: 2100 movs r1, #0
  559. 800087e: 4608 mov r0, r1
  560. 8000880: e7f5 b.n 800086e <__udivmoddi4+0xa6>
  561. 8000882: fab3 f183 clz r1, r3
  562. 8000886: 2900 cmp r1, #0
  563. 8000888: d146 bne.n 8000918 <__udivmoddi4+0x150>
  564. 800088a: 42a3 cmp r3, r4
  565. 800088c: d302 bcc.n 8000894 <__udivmoddi4+0xcc>
  566. 800088e: 4290 cmp r0, r2
  567. 8000890: f0c0 80f0 bcc.w 8000a74 <__udivmoddi4+0x2ac>
  568. 8000894: 1a86 subs r6, r0, r2
  569. 8000896: eb64 0303 sbc.w r3, r4, r3
  570. 800089a: 2001 movs r0, #1
  571. 800089c: 2d00 cmp r5, #0
  572. 800089e: d0e6 beq.n 800086e <__udivmoddi4+0xa6>
  573. 80008a0: e9c5 6300 strd r6, r3, [r5]
  574. 80008a4: e7e3 b.n 800086e <__udivmoddi4+0xa6>
  575. 80008a6: 2a00 cmp r2, #0
  576. 80008a8: f040 8090 bne.w 80009cc <__udivmoddi4+0x204>
  577. 80008ac: eba1 040c sub.w r4, r1, ip
  578. 80008b0: ea4f 481c mov.w r8, ip, lsr #16
  579. 80008b4: fa1f f78c uxth.w r7, ip
  580. 80008b8: 2101 movs r1, #1
  581. 80008ba: fbb4 f6f8 udiv r6, r4, r8
  582. 80008be: ea4f 431e mov.w r3, lr, lsr #16
  583. 80008c2: fb08 4416 mls r4, r8, r6, r4
  584. 80008c6: ea43 4304 orr.w r3, r3, r4, lsl #16
  585. 80008ca: fb07 f006 mul.w r0, r7, r6
  586. 80008ce: 4298 cmp r0, r3
  587. 80008d0: d908 bls.n 80008e4 <__udivmoddi4+0x11c>
  588. 80008d2: eb1c 0303 adds.w r3, ip, r3
  589. 80008d6: f106 34ff add.w r4, r6, #4294967295 @ 0xffffffff
  590. 80008da: d202 bcs.n 80008e2 <__udivmoddi4+0x11a>
  591. 80008dc: 4298 cmp r0, r3
  592. 80008de: f200 80cd bhi.w 8000a7c <__udivmoddi4+0x2b4>
  593. 80008e2: 4626 mov r6, r4
  594. 80008e4: 1a1c subs r4, r3, r0
  595. 80008e6: fa1f f38e uxth.w r3, lr
  596. 80008ea: fbb4 f0f8 udiv r0, r4, r8
  597. 80008ee: fb08 4410 mls r4, r8, r0, r4
  598. 80008f2: ea43 4304 orr.w r3, r3, r4, lsl #16
  599. 80008f6: fb00 f707 mul.w r7, r0, r7
  600. 80008fa: 429f cmp r7, r3
  601. 80008fc: d908 bls.n 8000910 <__udivmoddi4+0x148>
  602. 80008fe: eb1c 0303 adds.w r3, ip, r3
  603. 8000902: f100 34ff add.w r4, r0, #4294967295 @ 0xffffffff
  604. 8000906: d202 bcs.n 800090e <__udivmoddi4+0x146>
  605. 8000908: 429f cmp r7, r3
  606. 800090a: f200 80b0 bhi.w 8000a6e <__udivmoddi4+0x2a6>
  607. 800090e: 4620 mov r0, r4
  608. 8000910: 1bdb subs r3, r3, r7
  609. 8000912: ea40 4006 orr.w r0, r0, r6, lsl #16
  610. 8000916: e7a5 b.n 8000864 <__udivmoddi4+0x9c>
  611. 8000918: f1c1 0620 rsb r6, r1, #32
  612. 800091c: 408b lsls r3, r1
  613. 800091e: fa22 f706 lsr.w r7, r2, r6
  614. 8000922: 431f orrs r7, r3
  615. 8000924: fa20 fc06 lsr.w ip, r0, r6
  616. 8000928: fa04 f301 lsl.w r3, r4, r1
  617. 800092c: ea43 030c orr.w r3, r3, ip
  618. 8000930: 40f4 lsrs r4, r6
  619. 8000932: fa00 f801 lsl.w r8, r0, r1
  620. 8000936: 0c38 lsrs r0, r7, #16
  621. 8000938: ea4f 4913 mov.w r9, r3, lsr #16
  622. 800093c: fbb4 fef0 udiv lr, r4, r0
  623. 8000940: fa1f fc87 uxth.w ip, r7
  624. 8000944: fb00 441e mls r4, r0, lr, r4
  625. 8000948: ea49 4404 orr.w r4, r9, r4, lsl #16
  626. 800094c: fb0e f90c mul.w r9, lr, ip
  627. 8000950: 45a1 cmp r9, r4
  628. 8000952: fa02 f201 lsl.w r2, r2, r1
  629. 8000956: d90a bls.n 800096e <__udivmoddi4+0x1a6>
  630. 8000958: 193c adds r4, r7, r4
  631. 800095a: f10e 3aff add.w sl, lr, #4294967295 @ 0xffffffff
  632. 800095e: f080 8084 bcs.w 8000a6a <__udivmoddi4+0x2a2>
  633. 8000962: 45a1 cmp r9, r4
  634. 8000964: f240 8081 bls.w 8000a6a <__udivmoddi4+0x2a2>
  635. 8000968: f1ae 0e02 sub.w lr, lr, #2
  636. 800096c: 443c add r4, r7
  637. 800096e: eba4 0409 sub.w r4, r4, r9
  638. 8000972: fa1f f983 uxth.w r9, r3
  639. 8000976: fbb4 f3f0 udiv r3, r4, r0
  640. 800097a: fb00 4413 mls r4, r0, r3, r4
  641. 800097e: ea49 4404 orr.w r4, r9, r4, lsl #16
  642. 8000982: fb03 fc0c mul.w ip, r3, ip
  643. 8000986: 45a4 cmp ip, r4
  644. 8000988: d907 bls.n 800099a <__udivmoddi4+0x1d2>
  645. 800098a: 193c adds r4, r7, r4
  646. 800098c: f103 30ff add.w r0, r3, #4294967295 @ 0xffffffff
  647. 8000990: d267 bcs.n 8000a62 <__udivmoddi4+0x29a>
  648. 8000992: 45a4 cmp ip, r4
  649. 8000994: d965 bls.n 8000a62 <__udivmoddi4+0x29a>
  650. 8000996: 3b02 subs r3, #2
  651. 8000998: 443c add r4, r7
  652. 800099a: ea43 400e orr.w r0, r3, lr, lsl #16
  653. 800099e: fba0 9302 umull r9, r3, r0, r2
  654. 80009a2: eba4 040c sub.w r4, r4, ip
  655. 80009a6: 429c cmp r4, r3
  656. 80009a8: 46ce mov lr, r9
  657. 80009aa: 469c mov ip, r3
  658. 80009ac: d351 bcc.n 8000a52 <__udivmoddi4+0x28a>
  659. 80009ae: d04e beq.n 8000a4e <__udivmoddi4+0x286>
  660. 80009b0: b155 cbz r5, 80009c8 <__udivmoddi4+0x200>
  661. 80009b2: ebb8 030e subs.w r3, r8, lr
  662. 80009b6: eb64 040c sbc.w r4, r4, ip
  663. 80009ba: fa04 f606 lsl.w r6, r4, r6
  664. 80009be: 40cb lsrs r3, r1
  665. 80009c0: 431e orrs r6, r3
  666. 80009c2: 40cc lsrs r4, r1
  667. 80009c4: e9c5 6400 strd r6, r4, [r5]
  668. 80009c8: 2100 movs r1, #0
  669. 80009ca: e750 b.n 800086e <__udivmoddi4+0xa6>
  670. 80009cc: f1c2 0320 rsb r3, r2, #32
  671. 80009d0: fa20 f103 lsr.w r1, r0, r3
  672. 80009d4: fa0c fc02 lsl.w ip, ip, r2
  673. 80009d8: fa24 f303 lsr.w r3, r4, r3
  674. 80009dc: 4094 lsls r4, r2
  675. 80009de: 430c orrs r4, r1
  676. 80009e0: ea4f 481c mov.w r8, ip, lsr #16
  677. 80009e4: fa00 fe02 lsl.w lr, r0, r2
  678. 80009e8: fa1f f78c uxth.w r7, ip
  679. 80009ec: fbb3 f0f8 udiv r0, r3, r8
  680. 80009f0: fb08 3110 mls r1, r8, r0, r3
  681. 80009f4: 0c23 lsrs r3, r4, #16
  682. 80009f6: ea43 4301 orr.w r3, r3, r1, lsl #16
  683. 80009fa: fb00 f107 mul.w r1, r0, r7
  684. 80009fe: 4299 cmp r1, r3
  685. 8000a00: d908 bls.n 8000a14 <__udivmoddi4+0x24c>
  686. 8000a02: eb1c 0303 adds.w r3, ip, r3
  687. 8000a06: f100 36ff add.w r6, r0, #4294967295 @ 0xffffffff
  688. 8000a0a: d22c bcs.n 8000a66 <__udivmoddi4+0x29e>
  689. 8000a0c: 4299 cmp r1, r3
  690. 8000a0e: d92a bls.n 8000a66 <__udivmoddi4+0x29e>
  691. 8000a10: 3802 subs r0, #2
  692. 8000a12: 4463 add r3, ip
  693. 8000a14: 1a5b subs r3, r3, r1
  694. 8000a16: b2a4 uxth r4, r4
  695. 8000a18: fbb3 f1f8 udiv r1, r3, r8
  696. 8000a1c: fb08 3311 mls r3, r8, r1, r3
  697. 8000a20: ea44 4403 orr.w r4, r4, r3, lsl #16
  698. 8000a24: fb01 f307 mul.w r3, r1, r7
  699. 8000a28: 42a3 cmp r3, r4
  700. 8000a2a: d908 bls.n 8000a3e <__udivmoddi4+0x276>
  701. 8000a2c: eb1c 0404 adds.w r4, ip, r4
  702. 8000a30: f101 36ff add.w r6, r1, #4294967295 @ 0xffffffff
  703. 8000a34: d213 bcs.n 8000a5e <__udivmoddi4+0x296>
  704. 8000a36: 42a3 cmp r3, r4
  705. 8000a38: d911 bls.n 8000a5e <__udivmoddi4+0x296>
  706. 8000a3a: 3902 subs r1, #2
  707. 8000a3c: 4464 add r4, ip
  708. 8000a3e: 1ae4 subs r4, r4, r3
  709. 8000a40: ea41 4100 orr.w r1, r1, r0, lsl #16
  710. 8000a44: e739 b.n 80008ba <__udivmoddi4+0xf2>
  711. 8000a46: 4604 mov r4, r0
  712. 8000a48: e6f0 b.n 800082c <__udivmoddi4+0x64>
  713. 8000a4a: 4608 mov r0, r1
  714. 8000a4c: e706 b.n 800085c <__udivmoddi4+0x94>
  715. 8000a4e: 45c8 cmp r8, r9
  716. 8000a50: d2ae bcs.n 80009b0 <__udivmoddi4+0x1e8>
  717. 8000a52: ebb9 0e02 subs.w lr, r9, r2
  718. 8000a56: eb63 0c07 sbc.w ip, r3, r7
  719. 8000a5a: 3801 subs r0, #1
  720. 8000a5c: e7a8 b.n 80009b0 <__udivmoddi4+0x1e8>
  721. 8000a5e: 4631 mov r1, r6
  722. 8000a60: e7ed b.n 8000a3e <__udivmoddi4+0x276>
  723. 8000a62: 4603 mov r3, r0
  724. 8000a64: e799 b.n 800099a <__udivmoddi4+0x1d2>
  725. 8000a66: 4630 mov r0, r6
  726. 8000a68: e7d4 b.n 8000a14 <__udivmoddi4+0x24c>
  727. 8000a6a: 46d6 mov lr, sl
  728. 8000a6c: e77f b.n 800096e <__udivmoddi4+0x1a6>
  729. 8000a6e: 4463 add r3, ip
  730. 8000a70: 3802 subs r0, #2
  731. 8000a72: e74d b.n 8000910 <__udivmoddi4+0x148>
  732. 8000a74: 4606 mov r6, r0
  733. 8000a76: 4623 mov r3, r4
  734. 8000a78: 4608 mov r0, r1
  735. 8000a7a: e70f b.n 800089c <__udivmoddi4+0xd4>
  736. 8000a7c: 3e02 subs r6, #2
  737. 8000a7e: 4463 add r3, ip
  738. 8000a80: e730 b.n 80008e4 <__udivmoddi4+0x11c>
  739. 8000a82: bf00 nop
  740. 08000a84 <__aeabi_idiv0>:
  741. 8000a84: 4770 bx lr
  742. 8000a86: bf00 nop
  743. 08000a88 <case_insensitive_strcmp>:
  744. return version;
  745. }
  746. /* Case insensitive string comparison, doesn't consider two NULL pointers equal though */
  747. static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2)
  748. {
  749. 8000a88: b480 push {r7}
  750. 8000a8a: b085 sub sp, #20
  751. 8000a8c: af00 add r7, sp, #0
  752. 8000a8e: 6078 str r0, [r7, #4]
  753. 8000a90: 6039 str r1, [r7, #0]
  754. if ((string1 == NULL) || (string2 == NULL))
  755. 8000a92: 687b ldr r3, [r7, #4]
  756. 8000a94: 2b00 cmp r3, #0
  757. 8000a96: d002 beq.n 8000a9e <case_insensitive_strcmp+0x16>
  758. 8000a98: 683b ldr r3, [r7, #0]
  759. 8000a9a: 2b00 cmp r3, #0
  760. 8000a9c: d101 bne.n 8000aa2 <case_insensitive_strcmp+0x1a>
  761. {
  762. return 1;
  763. 8000a9e: 2301 movs r3, #1
  764. 8000aa0: e056 b.n 8000b50 <case_insensitive_strcmp+0xc8>
  765. }
  766. if (string1 == string2)
  767. 8000aa2: 687a ldr r2, [r7, #4]
  768. 8000aa4: 683b ldr r3, [r7, #0]
  769. 8000aa6: 429a cmp r2, r3
  770. 8000aa8: d10d bne.n 8000ac6 <case_insensitive_strcmp+0x3e>
  771. {
  772. return 0;
  773. 8000aaa: 2300 movs r3, #0
  774. 8000aac: e050 b.n 8000b50 <case_insensitive_strcmp+0xc8>
  775. }
  776. for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++)
  777. {
  778. if (*string1 == '\0')
  779. 8000aae: 687b ldr r3, [r7, #4]
  780. 8000ab0: 781b ldrb r3, [r3, #0]
  781. 8000ab2: 2b00 cmp r3, #0
  782. 8000ab4: d101 bne.n 8000aba <case_insensitive_strcmp+0x32>
  783. {
  784. return 0;
  785. 8000ab6: 2300 movs r3, #0
  786. 8000ab8: e04a b.n 8000b50 <case_insensitive_strcmp+0xc8>
  787. for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++)
  788. 8000aba: 687b ldr r3, [r7, #4]
  789. 8000abc: 3301 adds r3, #1
  790. 8000abe: 607b str r3, [r7, #4]
  791. 8000ac0: 683b ldr r3, [r7, #0]
  792. 8000ac2: 3301 adds r3, #1
  793. 8000ac4: 603b str r3, [r7, #0]
  794. 8000ac6: 687b ldr r3, [r7, #4]
  795. 8000ac8: 781b ldrb r3, [r3, #0]
  796. 8000aca: 73fb strb r3, [r7, #15]
  797. 8000acc: 7bfb ldrb r3, [r7, #15]
  798. 8000ace: 3301 adds r3, #1
  799. 8000ad0: 4a22 ldr r2, [pc, #136] @ (8000b5c <case_insensitive_strcmp+0xd4>)
  800. 8000ad2: 4413 add r3, r2
  801. 8000ad4: 781b ldrb r3, [r3, #0]
  802. 8000ad6: f003 0303 and.w r3, r3, #3
  803. 8000ada: 2b01 cmp r3, #1
  804. 8000adc: d103 bne.n 8000ae6 <case_insensitive_strcmp+0x5e>
  805. 8000ade: 7bfb ldrb r3, [r7, #15]
  806. 8000ae0: f103 0220 add.w r2, r3, #32
  807. 8000ae4: e000 b.n 8000ae8 <case_insensitive_strcmp+0x60>
  808. 8000ae6: 7bfa ldrb r2, [r7, #15]
  809. 8000ae8: 683b ldr r3, [r7, #0]
  810. 8000aea: 781b ldrb r3, [r3, #0]
  811. 8000aec: 73bb strb r3, [r7, #14]
  812. 8000aee: 7bbb ldrb r3, [r7, #14]
  813. 8000af0: 3301 adds r3, #1
  814. 8000af2: 491a ldr r1, [pc, #104] @ (8000b5c <case_insensitive_strcmp+0xd4>)
  815. 8000af4: 440b add r3, r1
  816. 8000af6: 781b ldrb r3, [r3, #0]
  817. 8000af8: f003 0303 and.w r3, r3, #3
  818. 8000afc: 2b01 cmp r3, #1
  819. 8000afe: d102 bne.n 8000b06 <case_insensitive_strcmp+0x7e>
  820. 8000b00: 7bbb ldrb r3, [r7, #14]
  821. 8000b02: 3320 adds r3, #32
  822. 8000b04: e000 b.n 8000b08 <case_insensitive_strcmp+0x80>
  823. 8000b06: 7bbb ldrb r3, [r7, #14]
  824. 8000b08: 429a cmp r2, r3
  825. 8000b0a: d0d0 beq.n 8000aae <case_insensitive_strcmp+0x26>
  826. }
  827. }
  828. return tolower(*string1) - tolower(*string2);
  829. 8000b0c: 687b ldr r3, [r7, #4]
  830. 8000b0e: 781b ldrb r3, [r3, #0]
  831. 8000b10: 737b strb r3, [r7, #13]
  832. 8000b12: 7b7b ldrb r3, [r7, #13]
  833. 8000b14: 3301 adds r3, #1
  834. 8000b16: 4a11 ldr r2, [pc, #68] @ (8000b5c <case_insensitive_strcmp+0xd4>)
  835. 8000b18: 4413 add r3, r2
  836. 8000b1a: 781b ldrb r3, [r3, #0]
  837. 8000b1c: f003 0303 and.w r3, r3, #3
  838. 8000b20: 2b01 cmp r3, #1
  839. 8000b22: d103 bne.n 8000b2c <case_insensitive_strcmp+0xa4>
  840. 8000b24: 7b7b ldrb r3, [r7, #13]
  841. 8000b26: f103 0220 add.w r2, r3, #32
  842. 8000b2a: e000 b.n 8000b2e <case_insensitive_strcmp+0xa6>
  843. 8000b2c: 7b7a ldrb r2, [r7, #13]
  844. 8000b2e: 683b ldr r3, [r7, #0]
  845. 8000b30: 781b ldrb r3, [r3, #0]
  846. 8000b32: 733b strb r3, [r7, #12]
  847. 8000b34: 7b3b ldrb r3, [r7, #12]
  848. 8000b36: 3301 adds r3, #1
  849. 8000b38: 4908 ldr r1, [pc, #32] @ (8000b5c <case_insensitive_strcmp+0xd4>)
  850. 8000b3a: 440b add r3, r1
  851. 8000b3c: 781b ldrb r3, [r3, #0]
  852. 8000b3e: f003 0303 and.w r3, r3, #3
  853. 8000b42: 2b01 cmp r3, #1
  854. 8000b44: d102 bne.n 8000b4c <case_insensitive_strcmp+0xc4>
  855. 8000b46: 7b3b ldrb r3, [r7, #12]
  856. 8000b48: 3320 adds r3, #32
  857. 8000b4a: e000 b.n 8000b4e <case_insensitive_strcmp+0xc6>
  858. 8000b4c: 7b3b ldrb r3, [r7, #12]
  859. 8000b4e: 1ad3 subs r3, r2, r3
  860. }
  861. 8000b50: 4618 mov r0, r3
  862. 8000b52: 3714 adds r7, #20
  863. 8000b54: 46bd mov sp, r7
  864. 8000b56: f85d 7b04 ldr.w r7, [sp], #4
  865. 8000b5a: 4770 bx lr
  866. 8000b5c: 08030ce8 .word 0x08030ce8
  867. 08000b60 <cJSON_New_Item>:
  868. }
  869. }
  870. /* Internal constructor. */
  871. static cJSON *cJSON_New_Item(const internal_hooks * const hooks)
  872. {
  873. 8000b60: b580 push {r7, lr}
  874. 8000b62: b084 sub sp, #16
  875. 8000b64: af00 add r7, sp, #0
  876. 8000b66: 6078 str r0, [r7, #4]
  877. cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON));
  878. 8000b68: 687b ldr r3, [r7, #4]
  879. 8000b6a: 681b ldr r3, [r3, #0]
  880. 8000b6c: 2028 movs r0, #40 @ 0x28
  881. 8000b6e: 4798 blx r3
  882. 8000b70: 60f8 str r0, [r7, #12]
  883. if (node)
  884. 8000b72: 68fb ldr r3, [r7, #12]
  885. 8000b74: 2b00 cmp r3, #0
  886. 8000b76: d004 beq.n 8000b82 <cJSON_New_Item+0x22>
  887. {
  888. memset(node, '\0', sizeof(cJSON));
  889. 8000b78: 2228 movs r2, #40 @ 0x28
  890. 8000b7a: 2100 movs r1, #0
  891. 8000b7c: 68f8 ldr r0, [r7, #12]
  892. 8000b7e: f029 f8b7 bl 8029cf0 <memset>
  893. }
  894. return node;
  895. 8000b82: 68fb ldr r3, [r7, #12]
  896. }
  897. 8000b84: 4618 mov r0, r3
  898. 8000b86: 3710 adds r7, #16
  899. 8000b88: 46bd mov sp, r7
  900. 8000b8a: bd80 pop {r7, pc}
  901. 08000b8c <cJSON_Delete>:
  902. /* Delete a cJSON structure. */
  903. CJSON_PUBLIC(void) cJSON_Delete(cJSON *item)
  904. {
  905. 8000b8c: b580 push {r7, lr}
  906. 8000b8e: b084 sub sp, #16
  907. 8000b90: af00 add r7, sp, #0
  908. 8000b92: 6078 str r0, [r7, #4]
  909. cJSON *next = NULL;
  910. 8000b94: 2300 movs r3, #0
  911. 8000b96: 60fb str r3, [r7, #12]
  912. while (item != NULL)
  913. 8000b98: e03d b.n 8000c16 <cJSON_Delete+0x8a>
  914. {
  915. next = item->next;
  916. 8000b9a: 687b ldr r3, [r7, #4]
  917. 8000b9c: 681b ldr r3, [r3, #0]
  918. 8000b9e: 60fb str r3, [r7, #12]
  919. if (!(item->type & cJSON_IsReference) && (item->child != NULL))
  920. 8000ba0: 687b ldr r3, [r7, #4]
  921. 8000ba2: 68db ldr r3, [r3, #12]
  922. 8000ba4: f403 7380 and.w r3, r3, #256 @ 0x100
  923. 8000ba8: 2b00 cmp r3, #0
  924. 8000baa: d108 bne.n 8000bbe <cJSON_Delete+0x32>
  925. 8000bac: 687b ldr r3, [r7, #4]
  926. 8000bae: 689b ldr r3, [r3, #8]
  927. 8000bb0: 2b00 cmp r3, #0
  928. 8000bb2: d004 beq.n 8000bbe <cJSON_Delete+0x32>
  929. {
  930. cJSON_Delete(item->child);
  931. 8000bb4: 687b ldr r3, [r7, #4]
  932. 8000bb6: 689b ldr r3, [r3, #8]
  933. 8000bb8: 4618 mov r0, r3
  934. 8000bba: f7ff ffe7 bl 8000b8c <cJSON_Delete>
  935. }
  936. if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL))
  937. 8000bbe: 687b ldr r3, [r7, #4]
  938. 8000bc0: 68db ldr r3, [r3, #12]
  939. 8000bc2: f403 7380 and.w r3, r3, #256 @ 0x100
  940. 8000bc6: 2b00 cmp r3, #0
  941. 8000bc8: d10c bne.n 8000be4 <cJSON_Delete+0x58>
  942. 8000bca: 687b ldr r3, [r7, #4]
  943. 8000bcc: 691b ldr r3, [r3, #16]
  944. 8000bce: 2b00 cmp r3, #0
  945. 8000bd0: d008 beq.n 8000be4 <cJSON_Delete+0x58>
  946. {
  947. global_hooks.deallocate(item->valuestring);
  948. 8000bd2: 4b15 ldr r3, [pc, #84] @ (8000c28 <cJSON_Delete+0x9c>)
  949. 8000bd4: 685b ldr r3, [r3, #4]
  950. 8000bd6: 687a ldr r2, [r7, #4]
  951. 8000bd8: 6912 ldr r2, [r2, #16]
  952. 8000bda: 4610 mov r0, r2
  953. 8000bdc: 4798 blx r3
  954. item->valuestring = NULL;
  955. 8000bde: 687b ldr r3, [r7, #4]
  956. 8000be0: 2200 movs r2, #0
  957. 8000be2: 611a str r2, [r3, #16]
  958. }
  959. if (!(item->type & cJSON_StringIsConst) && (item->string != NULL))
  960. 8000be4: 687b ldr r3, [r7, #4]
  961. 8000be6: 68db ldr r3, [r3, #12]
  962. 8000be8: f403 7300 and.w r3, r3, #512 @ 0x200
  963. 8000bec: 2b00 cmp r3, #0
  964. 8000bee: d10c bne.n 8000c0a <cJSON_Delete+0x7e>
  965. 8000bf0: 687b ldr r3, [r7, #4]
  966. 8000bf2: 6a1b ldr r3, [r3, #32]
  967. 8000bf4: 2b00 cmp r3, #0
  968. 8000bf6: d008 beq.n 8000c0a <cJSON_Delete+0x7e>
  969. {
  970. global_hooks.deallocate(item->string);
  971. 8000bf8: 4b0b ldr r3, [pc, #44] @ (8000c28 <cJSON_Delete+0x9c>)
  972. 8000bfa: 685b ldr r3, [r3, #4]
  973. 8000bfc: 687a ldr r2, [r7, #4]
  974. 8000bfe: 6a12 ldr r2, [r2, #32]
  975. 8000c00: 4610 mov r0, r2
  976. 8000c02: 4798 blx r3
  977. item->string = NULL;
  978. 8000c04: 687b ldr r3, [r7, #4]
  979. 8000c06: 2200 movs r2, #0
  980. 8000c08: 621a str r2, [r3, #32]
  981. }
  982. global_hooks.deallocate(item);
  983. 8000c0a: 4b07 ldr r3, [pc, #28] @ (8000c28 <cJSON_Delete+0x9c>)
  984. 8000c0c: 685b ldr r3, [r3, #4]
  985. 8000c0e: 6878 ldr r0, [r7, #4]
  986. 8000c10: 4798 blx r3
  987. item = next;
  988. 8000c12: 68fb ldr r3, [r7, #12]
  989. 8000c14: 607b str r3, [r7, #4]
  990. while (item != NULL)
  991. 8000c16: 687b ldr r3, [r7, #4]
  992. 8000c18: 2b00 cmp r3, #0
  993. 8000c1a: d1be bne.n 8000b9a <cJSON_Delete+0xe>
  994. }
  995. }
  996. 8000c1c: bf00 nop
  997. 8000c1e: bf00 nop
  998. 8000c20: 3710 adds r7, #16
  999. 8000c22: 46bd mov sp, r7
  1000. 8000c24: bd80 pop {r7, pc}
  1001. 8000c26: bf00 nop
  1002. 8000c28: 24000000 .word 0x24000000
  1003. 08000c2c <get_decimal_point>:
  1004. /* get the decimal point character of the current locale */
  1005. static unsigned char get_decimal_point(void)
  1006. {
  1007. 8000c2c: b480 push {r7}
  1008. 8000c2e: af00 add r7, sp, #0
  1009. #ifdef ENABLE_LOCALES
  1010. struct lconv *lconv = localeconv();
  1011. return (unsigned char) lconv->decimal_point[0];
  1012. #else
  1013. return '.';
  1014. 8000c30: 232e movs r3, #46 @ 0x2e
  1015. #endif
  1016. }
  1017. 8000c32: 4618 mov r0, r3
  1018. 8000c34: 46bd mov sp, r7
  1019. 8000c36: f85d 7b04 ldr.w r7, [sp], #4
  1020. 8000c3a: 4770 bx lr
  1021. 8000c3c: 0000 movs r0, r0
  1022. ...
  1023. 08000c40 <parse_number>:
  1024. /* get a pointer to the buffer at the position */
  1025. #define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset)
  1026. /* Parse the input text to generate a number, and populate the result into item. */
  1027. static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer)
  1028. {
  1029. 8000c40: b580 push {r7, lr}
  1030. 8000c42: b098 sub sp, #96 @ 0x60
  1031. 8000c44: af00 add r7, sp, #0
  1032. 8000c46: 6078 str r0, [r7, #4]
  1033. 8000c48: 6039 str r1, [r7, #0]
  1034. double number = 0;
  1035. 8000c4a: f04f 0200 mov.w r2, #0
  1036. 8000c4e: f04f 0300 mov.w r3, #0
  1037. 8000c52: e9c7 2314 strd r2, r3, [r7, #80] @ 0x50
  1038. unsigned char *after_end = NULL;
  1039. 8000c56: 2300 movs r3, #0
  1040. 8000c58: 64bb str r3, [r7, #72] @ 0x48
  1041. unsigned char number_c_string[64];
  1042. unsigned char decimal_point = get_decimal_point();
  1043. 8000c5a: f7ff ffe7 bl 8000c2c <get_decimal_point>
  1044. 8000c5e: 4603 mov r3, r0
  1045. 8000c60: f887 304f strb.w r3, [r7, #79] @ 0x4f
  1046. size_t i = 0;
  1047. 8000c64: 2300 movs r3, #0
  1048. 8000c66: 65fb str r3, [r7, #92] @ 0x5c
  1049. if ((input_buffer == NULL) || (input_buffer->content == NULL))
  1050. 8000c68: 683b ldr r3, [r7, #0]
  1051. 8000c6a: 2b00 cmp r3, #0
  1052. 8000c6c: d003 beq.n 8000c76 <parse_number+0x36>
  1053. 8000c6e: 683b ldr r3, [r7, #0]
  1054. 8000c70: 681b ldr r3, [r3, #0]
  1055. 8000c72: 2b00 cmp r3, #0
  1056. 8000c74: d101 bne.n 8000c7a <parse_number+0x3a>
  1057. {
  1058. return false;
  1059. 8000c76: 2300 movs r3, #0
  1060. 8000c78: e09f b.n 8000dba <parse_number+0x17a>
  1061. }
  1062. /* copy the number into a temporary buffer and replace '.' with the decimal point
  1063. * of the current locale (for strtod)
  1064. * This also takes care of '\0' not necessarily being available for marking the end of the input */
  1065. for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++)
  1066. 8000c7a: 2300 movs r3, #0
  1067. 8000c7c: 65fb str r3, [r7, #92] @ 0x5c
  1068. 8000c7e: e03d b.n 8000cfc <parse_number+0xbc>
  1069. {
  1070. switch (buffer_at_offset(input_buffer)[i])
  1071. 8000c80: 683b ldr r3, [r7, #0]
  1072. 8000c82: 681a ldr r2, [r3, #0]
  1073. 8000c84: 683b ldr r3, [r7, #0]
  1074. 8000c86: 6899 ldr r1, [r3, #8]
  1075. 8000c88: 6dfb ldr r3, [r7, #92] @ 0x5c
  1076. 8000c8a: 440b add r3, r1
  1077. 8000c8c: 4413 add r3, r2
  1078. 8000c8e: 781b ldrb r3, [r3, #0]
  1079. 8000c90: 2b45 cmp r3, #69 @ 0x45
  1080. 8000c92: dc17 bgt.n 8000cc4 <parse_number+0x84>
  1081. 8000c94: 2b2b cmp r3, #43 @ 0x2b
  1082. 8000c96: db40 blt.n 8000d1a <parse_number+0xda>
  1083. 8000c98: 3b2b subs r3, #43 @ 0x2b
  1084. 8000c9a: 2201 movs r2, #1
  1085. 8000c9c: 409a lsls r2, r3
  1086. 8000c9e: 4b4e ldr r3, [pc, #312] @ (8000dd8 <parse_number+0x198>)
  1087. 8000ca0: 4013 ands r3, r2
  1088. 8000ca2: 2b00 cmp r3, #0
  1089. 8000ca4: bf14 ite ne
  1090. 8000ca6: 2301 movne r3, #1
  1091. 8000ca8: 2300 moveq r3, #0
  1092. 8000caa: b2db uxtb r3, r3
  1093. 8000cac: 2b00 cmp r3, #0
  1094. 8000cae: d10b bne.n 8000cc8 <parse_number+0x88>
  1095. 8000cb0: f002 0308 and.w r3, r2, #8
  1096. 8000cb4: 2b00 cmp r3, #0
  1097. 8000cb6: bf14 ite ne
  1098. 8000cb8: 2301 movne r3, #1
  1099. 8000cba: 2300 moveq r3, #0
  1100. 8000cbc: b2db uxtb r3, r3
  1101. 8000cbe: 2b00 cmp r3, #0
  1102. 8000cc0: d111 bne.n 8000ce6 <parse_number+0xa6>
  1103. case '.':
  1104. number_c_string[i] = decimal_point;
  1105. break;
  1106. default:
  1107. goto loop_end;
  1108. 8000cc2: e02a b.n 8000d1a <parse_number+0xda>
  1109. switch (buffer_at_offset(input_buffer)[i])
  1110. 8000cc4: 2b65 cmp r3, #101 @ 0x65
  1111. 8000cc6: d128 bne.n 8000d1a <parse_number+0xda>
  1112. number_c_string[i] = buffer_at_offset(input_buffer)[i];
  1113. 8000cc8: 683b ldr r3, [r7, #0]
  1114. 8000cca: 681a ldr r2, [r3, #0]
  1115. 8000ccc: 683b ldr r3, [r7, #0]
  1116. 8000cce: 6899 ldr r1, [r3, #8]
  1117. 8000cd0: 6dfb ldr r3, [r7, #92] @ 0x5c
  1118. 8000cd2: 440b add r3, r1
  1119. 8000cd4: 4413 add r3, r2
  1120. 8000cd6: 7819 ldrb r1, [r3, #0]
  1121. 8000cd8: f107 0208 add.w r2, r7, #8
  1122. 8000cdc: 6dfb ldr r3, [r7, #92] @ 0x5c
  1123. 8000cde: 4413 add r3, r2
  1124. 8000ce0: 460a mov r2, r1
  1125. 8000ce2: 701a strb r2, [r3, #0]
  1126. break;
  1127. 8000ce4: e007 b.n 8000cf6 <parse_number+0xb6>
  1128. number_c_string[i] = decimal_point;
  1129. 8000ce6: f107 0208 add.w r2, r7, #8
  1130. 8000cea: 6dfb ldr r3, [r7, #92] @ 0x5c
  1131. 8000cec: 4413 add r3, r2
  1132. 8000cee: f897 204f ldrb.w r2, [r7, #79] @ 0x4f
  1133. 8000cf2: 701a strb r2, [r3, #0]
  1134. break;
  1135. 8000cf4: bf00 nop
  1136. for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++)
  1137. 8000cf6: 6dfb ldr r3, [r7, #92] @ 0x5c
  1138. 8000cf8: 3301 adds r3, #1
  1139. 8000cfa: 65fb str r3, [r7, #92] @ 0x5c
  1140. 8000cfc: 6dfb ldr r3, [r7, #92] @ 0x5c
  1141. 8000cfe: 2b3e cmp r3, #62 @ 0x3e
  1142. 8000d00: d80d bhi.n 8000d1e <parse_number+0xde>
  1143. 8000d02: 683b ldr r3, [r7, #0]
  1144. 8000d04: 2b00 cmp r3, #0
  1145. 8000d06: d00a beq.n 8000d1e <parse_number+0xde>
  1146. 8000d08: 683b ldr r3, [r7, #0]
  1147. 8000d0a: 689a ldr r2, [r3, #8]
  1148. 8000d0c: 6dfb ldr r3, [r7, #92] @ 0x5c
  1149. 8000d0e: 441a add r2, r3
  1150. 8000d10: 683b ldr r3, [r7, #0]
  1151. 8000d12: 685b ldr r3, [r3, #4]
  1152. 8000d14: 429a cmp r2, r3
  1153. 8000d16: d3b3 bcc.n 8000c80 <parse_number+0x40>
  1154. }
  1155. }
  1156. loop_end:
  1157. 8000d18: e001 b.n 8000d1e <parse_number+0xde>
  1158. goto loop_end;
  1159. 8000d1a: bf00 nop
  1160. 8000d1c: e000 b.n 8000d20 <parse_number+0xe0>
  1161. loop_end:
  1162. 8000d1e: bf00 nop
  1163. number_c_string[i] = '\0';
  1164. 8000d20: f107 0208 add.w r2, r7, #8
  1165. 8000d24: 6dfb ldr r3, [r7, #92] @ 0x5c
  1166. 8000d26: 4413 add r3, r2
  1167. 8000d28: 2200 movs r2, #0
  1168. 8000d2a: 701a strb r2, [r3, #0]
  1169. number = strtod((const char*)number_c_string, (char**)&after_end);
  1170. 8000d2c: f107 0248 add.w r2, r7, #72 @ 0x48
  1171. 8000d30: f107 0308 add.w r3, r7, #8
  1172. 8000d34: 4611 mov r1, r2
  1173. 8000d36: 4618 mov r0, r3
  1174. 8000d38: f028 f944 bl 8028fc4 <strtod>
  1175. 8000d3c: ed87 0b14 vstr d0, [r7, #80] @ 0x50
  1176. if (number_c_string == after_end)
  1177. 8000d40: 6cba ldr r2, [r7, #72] @ 0x48
  1178. 8000d42: f107 0308 add.w r3, r7, #8
  1179. 8000d46: 429a cmp r2, r3
  1180. 8000d48: d101 bne.n 8000d4e <parse_number+0x10e>
  1181. {
  1182. return false; /* parse_error */
  1183. 8000d4a: 2300 movs r3, #0
  1184. 8000d4c: e035 b.n 8000dba <parse_number+0x17a>
  1185. }
  1186. item->valuedouble = number;
  1187. 8000d4e: 6879 ldr r1, [r7, #4]
  1188. 8000d50: e9d7 2314 ldrd r2, r3, [r7, #80] @ 0x50
  1189. 8000d54: e9c1 2306 strd r2, r3, [r1, #24]
  1190. /* use saturation in case of overflow */
  1191. if (number >= INT_MAX)
  1192. 8000d58: ed97 7b14 vldr d7, [r7, #80] @ 0x50
  1193. 8000d5c: ed9f 6b1a vldr d6, [pc, #104] @ 8000dc8 <parse_number+0x188>
  1194. 8000d60: eeb4 7bc6 vcmpe.f64 d7, d6
  1195. 8000d64: eef1 fa10 vmrs APSR_nzcv, fpscr
  1196. 8000d68: db04 blt.n 8000d74 <parse_number+0x134>
  1197. {
  1198. item->valueint = INT_MAX;
  1199. 8000d6a: 687b ldr r3, [r7, #4]
  1200. 8000d6c: f06f 4200 mvn.w r2, #2147483648 @ 0x80000000
  1201. 8000d70: 615a str r2, [r3, #20]
  1202. 8000d72: e015 b.n 8000da0 <parse_number+0x160>
  1203. }
  1204. else if (number <= (double)INT_MIN)
  1205. 8000d74: ed97 7b14 vldr d7, [r7, #80] @ 0x50
  1206. 8000d78: ed9f 6b15 vldr d6, [pc, #84] @ 8000dd0 <parse_number+0x190>
  1207. 8000d7c: eeb4 7bc6 vcmpe.f64 d7, d6
  1208. 8000d80: eef1 fa10 vmrs APSR_nzcv, fpscr
  1209. 8000d84: d804 bhi.n 8000d90 <parse_number+0x150>
  1210. {
  1211. item->valueint = INT_MIN;
  1212. 8000d86: 687b ldr r3, [r7, #4]
  1213. 8000d88: f04f 4200 mov.w r2, #2147483648 @ 0x80000000
  1214. 8000d8c: 615a str r2, [r3, #20]
  1215. 8000d8e: e007 b.n 8000da0 <parse_number+0x160>
  1216. }
  1217. else
  1218. {
  1219. item->valueint = (int)number;
  1220. 8000d90: ed97 7b14 vldr d7, [r7, #80] @ 0x50
  1221. 8000d94: eefd 7bc7 vcvt.s32.f64 s15, d7
  1222. 8000d98: ee17 2a90 vmov r2, s15
  1223. 8000d9c: 687b ldr r3, [r7, #4]
  1224. 8000d9e: 615a str r2, [r3, #20]
  1225. }
  1226. item->type = cJSON_Number;
  1227. 8000da0: 687b ldr r3, [r7, #4]
  1228. 8000da2: 2208 movs r2, #8
  1229. 8000da4: 60da str r2, [r3, #12]
  1230. input_buffer->offset += (size_t)(after_end - number_c_string);
  1231. 8000da6: 683b ldr r3, [r7, #0]
  1232. 8000da8: 689b ldr r3, [r3, #8]
  1233. 8000daa: 6cb9 ldr r1, [r7, #72] @ 0x48
  1234. 8000dac: f107 0208 add.w r2, r7, #8
  1235. 8000db0: 1a8a subs r2, r1, r2
  1236. 8000db2: 441a add r2, r3
  1237. 8000db4: 683b ldr r3, [r7, #0]
  1238. 8000db6: 609a str r2, [r3, #8]
  1239. return true;
  1240. 8000db8: 2301 movs r3, #1
  1241. }
  1242. 8000dba: 4618 mov r0, r3
  1243. 8000dbc: 3760 adds r7, #96 @ 0x60
  1244. 8000dbe: 46bd mov sp, r7
  1245. 8000dc0: bd80 pop {r7, pc}
  1246. 8000dc2: bf00 nop
  1247. 8000dc4: f3af 8000 nop.w
  1248. 8000dc8: ffc00000 .word 0xffc00000
  1249. 8000dcc: 41dfffff .word 0x41dfffff
  1250. 8000dd0: 00000000 .word 0x00000000
  1251. 8000dd4: c1e00000 .word 0xc1e00000
  1252. 8000dd8: 04007fe5 .word 0x04007fe5
  1253. 08000ddc <parse_hex4>:
  1254. return true;
  1255. }
  1256. /* parse 4 digit hexadecimal number */
  1257. static unsigned parse_hex4(const unsigned char * const input)
  1258. {
  1259. 8000ddc: b480 push {r7}
  1260. 8000dde: b085 sub sp, #20
  1261. 8000de0: af00 add r7, sp, #0
  1262. 8000de2: 6078 str r0, [r7, #4]
  1263. unsigned int h = 0;
  1264. 8000de4: 2300 movs r3, #0
  1265. 8000de6: 60fb str r3, [r7, #12]
  1266. size_t i = 0;
  1267. 8000de8: 2300 movs r3, #0
  1268. 8000dea: 60bb str r3, [r7, #8]
  1269. for (i = 0; i < 4; i++)
  1270. 8000dec: 2300 movs r3, #0
  1271. 8000dee: 60bb str r3, [r7, #8]
  1272. 8000df0: e04c b.n 8000e8c <parse_hex4+0xb0>
  1273. {
  1274. /* parse digit */
  1275. if ((input[i] >= '0') && (input[i] <= '9'))
  1276. 8000df2: 687a ldr r2, [r7, #4]
  1277. 8000df4: 68bb ldr r3, [r7, #8]
  1278. 8000df6: 4413 add r3, r2
  1279. 8000df8: 781b ldrb r3, [r3, #0]
  1280. 8000dfa: 2b2f cmp r3, #47 @ 0x2f
  1281. 8000dfc: d90f bls.n 8000e1e <parse_hex4+0x42>
  1282. 8000dfe: 687a ldr r2, [r7, #4]
  1283. 8000e00: 68bb ldr r3, [r7, #8]
  1284. 8000e02: 4413 add r3, r2
  1285. 8000e04: 781b ldrb r3, [r3, #0]
  1286. 8000e06: 2b39 cmp r3, #57 @ 0x39
  1287. 8000e08: d809 bhi.n 8000e1e <parse_hex4+0x42>
  1288. {
  1289. h += (unsigned int) input[i] - '0';
  1290. 8000e0a: 687a ldr r2, [r7, #4]
  1291. 8000e0c: 68bb ldr r3, [r7, #8]
  1292. 8000e0e: 4413 add r3, r2
  1293. 8000e10: 781b ldrb r3, [r3, #0]
  1294. 8000e12: 461a mov r2, r3
  1295. 8000e14: 68fb ldr r3, [r7, #12]
  1296. 8000e16: 4413 add r3, r2
  1297. 8000e18: 3b30 subs r3, #48 @ 0x30
  1298. 8000e1a: 60fb str r3, [r7, #12]
  1299. 8000e1c: e02d b.n 8000e7a <parse_hex4+0x9e>
  1300. }
  1301. else if ((input[i] >= 'A') && (input[i] <= 'F'))
  1302. 8000e1e: 687a ldr r2, [r7, #4]
  1303. 8000e20: 68bb ldr r3, [r7, #8]
  1304. 8000e22: 4413 add r3, r2
  1305. 8000e24: 781b ldrb r3, [r3, #0]
  1306. 8000e26: 2b40 cmp r3, #64 @ 0x40
  1307. 8000e28: d90f bls.n 8000e4a <parse_hex4+0x6e>
  1308. 8000e2a: 687a ldr r2, [r7, #4]
  1309. 8000e2c: 68bb ldr r3, [r7, #8]
  1310. 8000e2e: 4413 add r3, r2
  1311. 8000e30: 781b ldrb r3, [r3, #0]
  1312. 8000e32: 2b46 cmp r3, #70 @ 0x46
  1313. 8000e34: d809 bhi.n 8000e4a <parse_hex4+0x6e>
  1314. {
  1315. h += (unsigned int) 10 + input[i] - 'A';
  1316. 8000e36: 687a ldr r2, [r7, #4]
  1317. 8000e38: 68bb ldr r3, [r7, #8]
  1318. 8000e3a: 4413 add r3, r2
  1319. 8000e3c: 781b ldrb r3, [r3, #0]
  1320. 8000e3e: 461a mov r2, r3
  1321. 8000e40: 68fb ldr r3, [r7, #12]
  1322. 8000e42: 4413 add r3, r2
  1323. 8000e44: 3b37 subs r3, #55 @ 0x37
  1324. 8000e46: 60fb str r3, [r7, #12]
  1325. 8000e48: e017 b.n 8000e7a <parse_hex4+0x9e>
  1326. }
  1327. else if ((input[i] >= 'a') && (input[i] <= 'f'))
  1328. 8000e4a: 687a ldr r2, [r7, #4]
  1329. 8000e4c: 68bb ldr r3, [r7, #8]
  1330. 8000e4e: 4413 add r3, r2
  1331. 8000e50: 781b ldrb r3, [r3, #0]
  1332. 8000e52: 2b60 cmp r3, #96 @ 0x60
  1333. 8000e54: d90f bls.n 8000e76 <parse_hex4+0x9a>
  1334. 8000e56: 687a ldr r2, [r7, #4]
  1335. 8000e58: 68bb ldr r3, [r7, #8]
  1336. 8000e5a: 4413 add r3, r2
  1337. 8000e5c: 781b ldrb r3, [r3, #0]
  1338. 8000e5e: 2b66 cmp r3, #102 @ 0x66
  1339. 8000e60: d809 bhi.n 8000e76 <parse_hex4+0x9a>
  1340. {
  1341. h += (unsigned int) 10 + input[i] - 'a';
  1342. 8000e62: 687a ldr r2, [r7, #4]
  1343. 8000e64: 68bb ldr r3, [r7, #8]
  1344. 8000e66: 4413 add r3, r2
  1345. 8000e68: 781b ldrb r3, [r3, #0]
  1346. 8000e6a: 461a mov r2, r3
  1347. 8000e6c: 68fb ldr r3, [r7, #12]
  1348. 8000e6e: 4413 add r3, r2
  1349. 8000e70: 3b57 subs r3, #87 @ 0x57
  1350. 8000e72: 60fb str r3, [r7, #12]
  1351. 8000e74: e001 b.n 8000e7a <parse_hex4+0x9e>
  1352. }
  1353. else /* invalid */
  1354. {
  1355. return 0;
  1356. 8000e76: 2300 movs r3, #0
  1357. 8000e78: e00c b.n 8000e94 <parse_hex4+0xb8>
  1358. }
  1359. if (i < 3)
  1360. 8000e7a: 68bb ldr r3, [r7, #8]
  1361. 8000e7c: 2b02 cmp r3, #2
  1362. 8000e7e: d802 bhi.n 8000e86 <parse_hex4+0xaa>
  1363. {
  1364. /* shift left to make place for the next nibble */
  1365. h = h << 4;
  1366. 8000e80: 68fb ldr r3, [r7, #12]
  1367. 8000e82: 011b lsls r3, r3, #4
  1368. 8000e84: 60fb str r3, [r7, #12]
  1369. for (i = 0; i < 4; i++)
  1370. 8000e86: 68bb ldr r3, [r7, #8]
  1371. 8000e88: 3301 adds r3, #1
  1372. 8000e8a: 60bb str r3, [r7, #8]
  1373. 8000e8c: 68bb ldr r3, [r7, #8]
  1374. 8000e8e: 2b03 cmp r3, #3
  1375. 8000e90: d9af bls.n 8000df2 <parse_hex4+0x16>
  1376. }
  1377. }
  1378. return h;
  1379. 8000e92: 68fb ldr r3, [r7, #12]
  1380. }
  1381. 8000e94: 4618 mov r0, r3
  1382. 8000e96: 3714 adds r7, #20
  1383. 8000e98: 46bd mov sp, r7
  1384. 8000e9a: f85d 7b04 ldr.w r7, [sp], #4
  1385. 8000e9e: 4770 bx lr
  1386. 08000ea0 <utf16_literal_to_utf8>:
  1387. /* converts a UTF-16 literal to UTF-8
  1388. * A literal can be one or two sequences of the form \uXXXX */
  1389. static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer)
  1390. {
  1391. 8000ea0: b580 push {r7, lr}
  1392. 8000ea2: b08a sub sp, #40 @ 0x28
  1393. 8000ea4: af00 add r7, sp, #0
  1394. 8000ea6: 60f8 str r0, [r7, #12]
  1395. 8000ea8: 60b9 str r1, [r7, #8]
  1396. 8000eaa: 607a str r2, [r7, #4]
  1397. long unsigned int codepoint = 0;
  1398. 8000eac: 2300 movs r3, #0
  1399. 8000eae: 627b str r3, [r7, #36] @ 0x24
  1400. unsigned int first_code = 0;
  1401. 8000eb0: 2300 movs r3, #0
  1402. 8000eb2: 61fb str r3, [r7, #28]
  1403. const unsigned char *first_sequence = input_pointer;
  1404. 8000eb4: 68fb ldr r3, [r7, #12]
  1405. 8000eb6: 61bb str r3, [r7, #24]
  1406. unsigned char utf8_length = 0;
  1407. 8000eb8: 2300 movs r3, #0
  1408. 8000eba: f887 3023 strb.w r3, [r7, #35] @ 0x23
  1409. unsigned char utf8_position = 0;
  1410. 8000ebe: 2300 movs r3, #0
  1411. 8000ec0: f887 3022 strb.w r3, [r7, #34] @ 0x22
  1412. unsigned char sequence_length = 0;
  1413. 8000ec4: 2300 movs r3, #0
  1414. 8000ec6: f887 3021 strb.w r3, [r7, #33] @ 0x21
  1415. unsigned char first_byte_mark = 0;
  1416. 8000eca: 2300 movs r3, #0
  1417. 8000ecc: f887 3020 strb.w r3, [r7, #32]
  1418. if ((input_end - first_sequence) < 6)
  1419. 8000ed0: 68ba ldr r2, [r7, #8]
  1420. 8000ed2: 69bb ldr r3, [r7, #24]
  1421. 8000ed4: 1ad3 subs r3, r2, r3
  1422. 8000ed6: 2b05 cmp r3, #5
  1423. 8000ed8: f340 80b7 ble.w 800104a <utf16_literal_to_utf8+0x1aa>
  1424. /* input ends unexpectedly */
  1425. goto fail;
  1426. }
  1427. /* get the first utf16 sequence */
  1428. first_code = parse_hex4(first_sequence + 2);
  1429. 8000edc: 69bb ldr r3, [r7, #24]
  1430. 8000ede: 3302 adds r3, #2
  1431. 8000ee0: 4618 mov r0, r3
  1432. 8000ee2: f7ff ff7b bl 8000ddc <parse_hex4>
  1433. 8000ee6: 61f8 str r0, [r7, #28]
  1434. /* check that the code is valid */
  1435. if (((first_code >= 0xDC00) && (first_code <= 0xDFFF)))
  1436. 8000ee8: 69fb ldr r3, [r7, #28]
  1437. 8000eea: f5b3 4f5c cmp.w r3, #56320 @ 0xdc00
  1438. 8000eee: d304 bcc.n 8000efa <utf16_literal_to_utf8+0x5a>
  1439. 8000ef0: 69fb ldr r3, [r7, #28]
  1440. 8000ef2: f5b3 4f60 cmp.w r3, #57344 @ 0xe000
  1441. 8000ef6: f0c0 80aa bcc.w 800104e <utf16_literal_to_utf8+0x1ae>
  1442. {
  1443. goto fail;
  1444. }
  1445. /* UTF16 surrogate pair */
  1446. if ((first_code >= 0xD800) && (first_code <= 0xDBFF))
  1447. 8000efa: 69fb ldr r3, [r7, #28]
  1448. 8000efc: f5b3 4f58 cmp.w r3, #55296 @ 0xd800
  1449. 8000f00: d337 bcc.n 8000f72 <utf16_literal_to_utf8+0xd2>
  1450. 8000f02: 69fb ldr r3, [r7, #28]
  1451. 8000f04: f5b3 4f5c cmp.w r3, #56320 @ 0xdc00
  1452. 8000f08: d233 bcs.n 8000f72 <utf16_literal_to_utf8+0xd2>
  1453. {
  1454. const unsigned char *second_sequence = first_sequence + 6;
  1455. 8000f0a: 69bb ldr r3, [r7, #24]
  1456. 8000f0c: 3306 adds r3, #6
  1457. 8000f0e: 617b str r3, [r7, #20]
  1458. unsigned int second_code = 0;
  1459. 8000f10: 2300 movs r3, #0
  1460. 8000f12: 613b str r3, [r7, #16]
  1461. sequence_length = 12; /* \uXXXX\uXXXX */
  1462. 8000f14: 230c movs r3, #12
  1463. 8000f16: f887 3021 strb.w r3, [r7, #33] @ 0x21
  1464. if ((input_end - second_sequence) < 6)
  1465. 8000f1a: 68ba ldr r2, [r7, #8]
  1466. 8000f1c: 697b ldr r3, [r7, #20]
  1467. 8000f1e: 1ad3 subs r3, r2, r3
  1468. 8000f20: 2b05 cmp r3, #5
  1469. 8000f22: f340 8096 ble.w 8001052 <utf16_literal_to_utf8+0x1b2>
  1470. {
  1471. /* input ends unexpectedly */
  1472. goto fail;
  1473. }
  1474. if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u'))
  1475. 8000f26: 697b ldr r3, [r7, #20]
  1476. 8000f28: 781b ldrb r3, [r3, #0]
  1477. 8000f2a: 2b5c cmp r3, #92 @ 0x5c
  1478. 8000f2c: f040 8093 bne.w 8001056 <utf16_literal_to_utf8+0x1b6>
  1479. 8000f30: 697b ldr r3, [r7, #20]
  1480. 8000f32: 3301 adds r3, #1
  1481. 8000f34: 781b ldrb r3, [r3, #0]
  1482. 8000f36: 2b75 cmp r3, #117 @ 0x75
  1483. 8000f38: f040 808d bne.w 8001056 <utf16_literal_to_utf8+0x1b6>
  1484. /* missing second half of the surrogate pair */
  1485. goto fail;
  1486. }
  1487. /* get the second utf16 sequence */
  1488. second_code = parse_hex4(second_sequence + 2);
  1489. 8000f3c: 697b ldr r3, [r7, #20]
  1490. 8000f3e: 3302 adds r3, #2
  1491. 8000f40: 4618 mov r0, r3
  1492. 8000f42: f7ff ff4b bl 8000ddc <parse_hex4>
  1493. 8000f46: 6138 str r0, [r7, #16]
  1494. /* check that the code is valid */
  1495. if ((second_code < 0xDC00) || (second_code > 0xDFFF))
  1496. 8000f48: 693b ldr r3, [r7, #16]
  1497. 8000f4a: f5b3 4f5c cmp.w r3, #56320 @ 0xdc00
  1498. 8000f4e: f0c0 8084 bcc.w 800105a <utf16_literal_to_utf8+0x1ba>
  1499. 8000f52: 693b ldr r3, [r7, #16]
  1500. 8000f54: f5b3 4f60 cmp.w r3, #57344 @ 0xe000
  1501. 8000f58: d27f bcs.n 800105a <utf16_literal_to_utf8+0x1ba>
  1502. goto fail;
  1503. }
  1504. /* calculate the unicode codepoint from the surrogate pair */
  1505. codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF));
  1506. 8000f5a: 69fb ldr r3, [r7, #28]
  1507. 8000f5c: 029a lsls r2, r3, #10
  1508. 8000f5e: 4b43 ldr r3, [pc, #268] @ (800106c <utf16_literal_to_utf8+0x1cc>)
  1509. 8000f60: 4013 ands r3, r2
  1510. 8000f62: 693a ldr r2, [r7, #16]
  1511. 8000f64: f3c2 0209 ubfx r2, r2, #0, #10
  1512. 8000f68: 4313 orrs r3, r2
  1513. 8000f6a: f503 3380 add.w r3, r3, #65536 @ 0x10000
  1514. 8000f6e: 627b str r3, [r7, #36] @ 0x24
  1515. {
  1516. 8000f70: e004 b.n 8000f7c <utf16_literal_to_utf8+0xdc>
  1517. }
  1518. else
  1519. {
  1520. sequence_length = 6; /* \uXXXX */
  1521. 8000f72: 2306 movs r3, #6
  1522. 8000f74: f887 3021 strb.w r3, [r7, #33] @ 0x21
  1523. codepoint = first_code;
  1524. 8000f78: 69fb ldr r3, [r7, #28]
  1525. 8000f7a: 627b str r3, [r7, #36] @ 0x24
  1526. }
  1527. /* encode as UTF-8
  1528. * takes at maximum 4 bytes to encode:
  1529. * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
  1530. if (codepoint < 0x80)
  1531. 8000f7c: 6a7b ldr r3, [r7, #36] @ 0x24
  1532. 8000f7e: 2b7f cmp r3, #127 @ 0x7f
  1533. 8000f80: d803 bhi.n 8000f8a <utf16_literal_to_utf8+0xea>
  1534. {
  1535. /* normal ascii, encoding 0xxxxxxx */
  1536. utf8_length = 1;
  1537. 8000f82: 2301 movs r3, #1
  1538. 8000f84: f887 3023 strb.w r3, [r7, #35] @ 0x23
  1539. 8000f88: e01f b.n 8000fca <utf16_literal_to_utf8+0x12a>
  1540. }
  1541. else if (codepoint < 0x800)
  1542. 8000f8a: 6a7b ldr r3, [r7, #36] @ 0x24
  1543. 8000f8c: f5b3 6f00 cmp.w r3, #2048 @ 0x800
  1544. 8000f90: d206 bcs.n 8000fa0 <utf16_literal_to_utf8+0x100>
  1545. {
  1546. /* two bytes, encoding 110xxxxx 10xxxxxx */
  1547. utf8_length = 2;
  1548. 8000f92: 2302 movs r3, #2
  1549. 8000f94: f887 3023 strb.w r3, [r7, #35] @ 0x23
  1550. first_byte_mark = 0xC0; /* 11000000 */
  1551. 8000f98: 23c0 movs r3, #192 @ 0xc0
  1552. 8000f9a: f887 3020 strb.w r3, [r7, #32]
  1553. 8000f9e: e014 b.n 8000fca <utf16_literal_to_utf8+0x12a>
  1554. }
  1555. else if (codepoint < 0x10000)
  1556. 8000fa0: 6a7b ldr r3, [r7, #36] @ 0x24
  1557. 8000fa2: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  1558. 8000fa6: d206 bcs.n 8000fb6 <utf16_literal_to_utf8+0x116>
  1559. {
  1560. /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */
  1561. utf8_length = 3;
  1562. 8000fa8: 2303 movs r3, #3
  1563. 8000faa: f887 3023 strb.w r3, [r7, #35] @ 0x23
  1564. first_byte_mark = 0xE0; /* 11100000 */
  1565. 8000fae: 23e0 movs r3, #224 @ 0xe0
  1566. 8000fb0: f887 3020 strb.w r3, [r7, #32]
  1567. 8000fb4: e009 b.n 8000fca <utf16_literal_to_utf8+0x12a>
  1568. }
  1569. else if (codepoint <= 0x10FFFF)
  1570. 8000fb6: 6a7b ldr r3, [r7, #36] @ 0x24
  1571. 8000fb8: f5b3 1f88 cmp.w r3, #1114112 @ 0x110000
  1572. 8000fbc: d24f bcs.n 800105e <utf16_literal_to_utf8+0x1be>
  1573. {
  1574. /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */
  1575. utf8_length = 4;
  1576. 8000fbe: 2304 movs r3, #4
  1577. 8000fc0: f887 3023 strb.w r3, [r7, #35] @ 0x23
  1578. first_byte_mark = 0xF0; /* 11110000 */
  1579. 8000fc4: 23f0 movs r3, #240 @ 0xf0
  1580. 8000fc6: f887 3020 strb.w r3, [r7, #32]
  1581. /* invalid unicode codepoint */
  1582. goto fail;
  1583. }
  1584. /* encode as utf8 */
  1585. for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--)
  1586. 8000fca: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  1587. 8000fce: 3b01 subs r3, #1
  1588. 8000fd0: f887 3022 strb.w r3, [r7, #34] @ 0x22
  1589. 8000fd4: e015 b.n 8001002 <utf16_literal_to_utf8+0x162>
  1590. {
  1591. /* 10xxxxxx */
  1592. (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF);
  1593. 8000fd6: 6a7b ldr r3, [r7, #36] @ 0x24
  1594. 8000fd8: b2db uxtb r3, r3
  1595. 8000fda: f003 033f and.w r3, r3, #63 @ 0x3f
  1596. 8000fde: b2da uxtb r2, r3
  1597. 8000fe0: 687b ldr r3, [r7, #4]
  1598. 8000fe2: 6819 ldr r1, [r3, #0]
  1599. 8000fe4: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  1600. 8000fe8: 440b add r3, r1
  1601. 8000fea: f062 027f orn r2, r2, #127 @ 0x7f
  1602. 8000fee: b2d2 uxtb r2, r2
  1603. 8000ff0: 701a strb r2, [r3, #0]
  1604. codepoint >>= 6;
  1605. 8000ff2: 6a7b ldr r3, [r7, #36] @ 0x24
  1606. 8000ff4: 099b lsrs r3, r3, #6
  1607. 8000ff6: 627b str r3, [r7, #36] @ 0x24
  1608. for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--)
  1609. 8000ff8: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  1610. 8000ffc: 3b01 subs r3, #1
  1611. 8000ffe: f887 3022 strb.w r3, [r7, #34] @ 0x22
  1612. 8001002: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  1613. 8001006: 2b00 cmp r3, #0
  1614. 8001008: d1e5 bne.n 8000fd6 <utf16_literal_to_utf8+0x136>
  1615. }
  1616. /* encode first byte */
  1617. if (utf8_length > 1)
  1618. 800100a: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  1619. 800100e: 2b01 cmp r3, #1
  1620. 8001010: d909 bls.n 8001026 <utf16_literal_to_utf8+0x186>
  1621. {
  1622. (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF);
  1623. 8001012: 6a7b ldr r3, [r7, #36] @ 0x24
  1624. 8001014: b2d9 uxtb r1, r3
  1625. 8001016: 687b ldr r3, [r7, #4]
  1626. 8001018: 681b ldr r3, [r3, #0]
  1627. 800101a: f897 2020 ldrb.w r2, [r7, #32]
  1628. 800101e: 430a orrs r2, r1
  1629. 8001020: b2d2 uxtb r2, r2
  1630. 8001022: 701a strb r2, [r3, #0]
  1631. 8001024: e007 b.n 8001036 <utf16_literal_to_utf8+0x196>
  1632. }
  1633. else
  1634. {
  1635. (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F);
  1636. 8001026: 6a7b ldr r3, [r7, #36] @ 0x24
  1637. 8001028: b2da uxtb r2, r3
  1638. 800102a: 687b ldr r3, [r7, #4]
  1639. 800102c: 681b ldr r3, [r3, #0]
  1640. 800102e: f002 027f and.w r2, r2, #127 @ 0x7f
  1641. 8001032: b2d2 uxtb r2, r2
  1642. 8001034: 701a strb r2, [r3, #0]
  1643. }
  1644. *output_pointer += utf8_length;
  1645. 8001036: 687b ldr r3, [r7, #4]
  1646. 8001038: 681a ldr r2, [r3, #0]
  1647. 800103a: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  1648. 800103e: 441a add r2, r3
  1649. 8001040: 687b ldr r3, [r7, #4]
  1650. 8001042: 601a str r2, [r3, #0]
  1651. return sequence_length;
  1652. 8001044: f897 3021 ldrb.w r3, [r7, #33] @ 0x21
  1653. 8001048: e00b b.n 8001062 <utf16_literal_to_utf8+0x1c2>
  1654. goto fail;
  1655. 800104a: bf00 nop
  1656. 800104c: e008 b.n 8001060 <utf16_literal_to_utf8+0x1c0>
  1657. goto fail;
  1658. 800104e: bf00 nop
  1659. 8001050: e006 b.n 8001060 <utf16_literal_to_utf8+0x1c0>
  1660. goto fail;
  1661. 8001052: bf00 nop
  1662. 8001054: e004 b.n 8001060 <utf16_literal_to_utf8+0x1c0>
  1663. goto fail;
  1664. 8001056: bf00 nop
  1665. 8001058: e002 b.n 8001060 <utf16_literal_to_utf8+0x1c0>
  1666. goto fail;
  1667. 800105a: bf00 nop
  1668. 800105c: e000 b.n 8001060 <utf16_literal_to_utf8+0x1c0>
  1669. goto fail;
  1670. 800105e: bf00 nop
  1671. fail:
  1672. return 0;
  1673. 8001060: 2300 movs r3, #0
  1674. }
  1675. 8001062: 4618 mov r0, r3
  1676. 8001064: 3728 adds r7, #40 @ 0x28
  1677. 8001066: 46bd mov sp, r7
  1678. 8001068: bd80 pop {r7, pc}
  1679. 800106a: bf00 nop
  1680. 800106c: 000ffc00 .word 0x000ffc00
  1681. 08001070 <parse_string>:
  1682. /* Parse the input text into an unescaped cinput, and populate item. */
  1683. static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer)
  1684. {
  1685. 8001070: b580 push {r7, lr}
  1686. 8001072: b08a sub sp, #40 @ 0x28
  1687. 8001074: af00 add r7, sp, #0
  1688. 8001076: 6078 str r0, [r7, #4]
  1689. 8001078: 6039 str r1, [r7, #0]
  1690. const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1;
  1691. 800107a: 683b ldr r3, [r7, #0]
  1692. 800107c: 681a ldr r2, [r3, #0]
  1693. 800107e: 683b ldr r3, [r7, #0]
  1694. 8001080: 689b ldr r3, [r3, #8]
  1695. 8001082: 3301 adds r3, #1
  1696. 8001084: 4413 add r3, r2
  1697. 8001086: 627b str r3, [r7, #36] @ 0x24
  1698. const unsigned char *input_end = buffer_at_offset(input_buffer) + 1;
  1699. 8001088: 683b ldr r3, [r7, #0]
  1700. 800108a: 681a ldr r2, [r3, #0]
  1701. 800108c: 683b ldr r3, [r7, #0]
  1702. 800108e: 689b ldr r3, [r3, #8]
  1703. 8001090: 3301 adds r3, #1
  1704. 8001092: 4413 add r3, r2
  1705. 8001094: 623b str r3, [r7, #32]
  1706. unsigned char *output_pointer = NULL;
  1707. 8001096: 2300 movs r3, #0
  1708. 8001098: 60fb str r3, [r7, #12]
  1709. unsigned char *output = NULL;
  1710. 800109a: 2300 movs r3, #0
  1711. 800109c: 61fb str r3, [r7, #28]
  1712. /* not a string */
  1713. if (buffer_at_offset(input_buffer)[0] != '\"')
  1714. 800109e: 683b ldr r3, [r7, #0]
  1715. 80010a0: 681a ldr r2, [r3, #0]
  1716. 80010a2: 683b ldr r3, [r7, #0]
  1717. 80010a4: 689b ldr r3, [r3, #8]
  1718. 80010a6: 4413 add r3, r2
  1719. 80010a8: 781b ldrb r3, [r3, #0]
  1720. 80010aa: 2b22 cmp r3, #34 @ 0x22
  1721. 80010ac: f040 8103 bne.w 80012b6 <parse_string+0x246>
  1722. goto fail;
  1723. }
  1724. {
  1725. /* calculate approximate size of the output (overestimate) */
  1726. size_t allocation_length = 0;
  1727. 80010b0: 2300 movs r3, #0
  1728. 80010b2: 613b str r3, [r7, #16]
  1729. size_t skipped_bytes = 0;
  1730. 80010b4: 2300 movs r3, #0
  1731. 80010b6: 61bb str r3, [r7, #24]
  1732. while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"'))
  1733. 80010b8: e017 b.n 80010ea <parse_string+0x7a>
  1734. {
  1735. /* is escape sequence */
  1736. if (input_end[0] == '\\')
  1737. 80010ba: 6a3b ldr r3, [r7, #32]
  1738. 80010bc: 781b ldrb r3, [r3, #0]
  1739. 80010be: 2b5c cmp r3, #92 @ 0x5c
  1740. 80010c0: d110 bne.n 80010e4 <parse_string+0x74>
  1741. {
  1742. if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length)
  1743. 80010c2: 6a3b ldr r3, [r7, #32]
  1744. 80010c4: 1c5a adds r2, r3, #1
  1745. 80010c6: 683b ldr r3, [r7, #0]
  1746. 80010c8: 681b ldr r3, [r3, #0]
  1747. 80010ca: 1ad3 subs r3, r2, r3
  1748. 80010cc: 461a mov r2, r3
  1749. 80010ce: 683b ldr r3, [r7, #0]
  1750. 80010d0: 685b ldr r3, [r3, #4]
  1751. 80010d2: 429a cmp r2, r3
  1752. 80010d4: f080 80f1 bcs.w 80012ba <parse_string+0x24a>
  1753. {
  1754. /* prevent buffer overflow when last input character is a backslash */
  1755. goto fail;
  1756. }
  1757. skipped_bytes++;
  1758. 80010d8: 69bb ldr r3, [r7, #24]
  1759. 80010da: 3301 adds r3, #1
  1760. 80010dc: 61bb str r3, [r7, #24]
  1761. input_end++;
  1762. 80010de: 6a3b ldr r3, [r7, #32]
  1763. 80010e0: 3301 adds r3, #1
  1764. 80010e2: 623b str r3, [r7, #32]
  1765. }
  1766. input_end++;
  1767. 80010e4: 6a3b ldr r3, [r7, #32]
  1768. 80010e6: 3301 adds r3, #1
  1769. 80010e8: 623b str r3, [r7, #32]
  1770. while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"'))
  1771. 80010ea: 683b ldr r3, [r7, #0]
  1772. 80010ec: 681b ldr r3, [r3, #0]
  1773. 80010ee: 6a3a ldr r2, [r7, #32]
  1774. 80010f0: 1ad3 subs r3, r2, r3
  1775. 80010f2: 461a mov r2, r3
  1776. 80010f4: 683b ldr r3, [r7, #0]
  1777. 80010f6: 685b ldr r3, [r3, #4]
  1778. 80010f8: 429a cmp r2, r3
  1779. 80010fa: d203 bcs.n 8001104 <parse_string+0x94>
  1780. 80010fc: 6a3b ldr r3, [r7, #32]
  1781. 80010fe: 781b ldrb r3, [r3, #0]
  1782. 8001100: 2b22 cmp r3, #34 @ 0x22
  1783. 8001102: d1da bne.n 80010ba <parse_string+0x4a>
  1784. }
  1785. if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"'))
  1786. 8001104: 683b ldr r3, [r7, #0]
  1787. 8001106: 681b ldr r3, [r3, #0]
  1788. 8001108: 6a3a ldr r2, [r7, #32]
  1789. 800110a: 1ad3 subs r3, r2, r3
  1790. 800110c: 461a mov r2, r3
  1791. 800110e: 683b ldr r3, [r7, #0]
  1792. 8001110: 685b ldr r3, [r3, #4]
  1793. 8001112: 429a cmp r2, r3
  1794. 8001114: f080 80d3 bcs.w 80012be <parse_string+0x24e>
  1795. 8001118: 6a3b ldr r3, [r7, #32]
  1796. 800111a: 781b ldrb r3, [r3, #0]
  1797. 800111c: 2b22 cmp r3, #34 @ 0x22
  1798. 800111e: f040 80ce bne.w 80012be <parse_string+0x24e>
  1799. {
  1800. goto fail; /* string ended unexpectedly */
  1801. }
  1802. /* This is at most how much we need for the output */
  1803. allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes;
  1804. 8001122: 683b ldr r3, [r7, #0]
  1805. 8001124: 681a ldr r2, [r3, #0]
  1806. 8001126: 683b ldr r3, [r7, #0]
  1807. 8001128: 689b ldr r3, [r3, #8]
  1808. 800112a: 4413 add r3, r2
  1809. 800112c: 6a3a ldr r2, [r7, #32]
  1810. 800112e: 1ad3 subs r3, r2, r3
  1811. 8001130: 461a mov r2, r3
  1812. 8001132: 69bb ldr r3, [r7, #24]
  1813. 8001134: 1ad3 subs r3, r2, r3
  1814. 8001136: 613b str r3, [r7, #16]
  1815. output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof(""));
  1816. 8001138: 683b ldr r3, [r7, #0]
  1817. 800113a: 691b ldr r3, [r3, #16]
  1818. 800113c: 693a ldr r2, [r7, #16]
  1819. 800113e: 3201 adds r2, #1
  1820. 8001140: 4610 mov r0, r2
  1821. 8001142: 4798 blx r3
  1822. 8001144: 61f8 str r0, [r7, #28]
  1823. if (output == NULL)
  1824. 8001146: 69fb ldr r3, [r7, #28]
  1825. 8001148: 2b00 cmp r3, #0
  1826. 800114a: f000 80ba beq.w 80012c2 <parse_string+0x252>
  1827. {
  1828. goto fail; /* allocation failure */
  1829. }
  1830. }
  1831. output_pointer = output;
  1832. 800114e: 69fb ldr r3, [r7, #28]
  1833. 8001150: 60fb str r3, [r7, #12]
  1834. /* loop through the string literal */
  1835. while (input_pointer < input_end)
  1836. 8001152: e094 b.n 800127e <parse_string+0x20e>
  1837. {
  1838. if (*input_pointer != '\\')
  1839. 8001154: 6a7b ldr r3, [r7, #36] @ 0x24
  1840. 8001156: 781b ldrb r3, [r3, #0]
  1841. 8001158: 2b5c cmp r3, #92 @ 0x5c
  1842. 800115a: d008 beq.n 800116e <parse_string+0xfe>
  1843. {
  1844. *output_pointer++ = *input_pointer++;
  1845. 800115c: 6a7a ldr r2, [r7, #36] @ 0x24
  1846. 800115e: 1c53 adds r3, r2, #1
  1847. 8001160: 627b str r3, [r7, #36] @ 0x24
  1848. 8001162: 68fb ldr r3, [r7, #12]
  1849. 8001164: 1c59 adds r1, r3, #1
  1850. 8001166: 60f9 str r1, [r7, #12]
  1851. 8001168: 7812 ldrb r2, [r2, #0]
  1852. 800116a: 701a strb r2, [r3, #0]
  1853. 800116c: e087 b.n 800127e <parse_string+0x20e>
  1854. }
  1855. /* escape sequence */
  1856. else
  1857. {
  1858. unsigned char sequence_length = 2;
  1859. 800116e: 2302 movs r3, #2
  1860. 8001170: 75fb strb r3, [r7, #23]
  1861. if ((input_end - input_pointer) < 1)
  1862. 8001172: 6a3a ldr r2, [r7, #32]
  1863. 8001174: 6a7b ldr r3, [r7, #36] @ 0x24
  1864. 8001176: 1ad3 subs r3, r2, r3
  1865. 8001178: 2b00 cmp r3, #0
  1866. 800117a: f340 80a4 ble.w 80012c6 <parse_string+0x256>
  1867. {
  1868. goto fail;
  1869. }
  1870. switch (input_pointer[1])
  1871. 800117e: 6a7b ldr r3, [r7, #36] @ 0x24
  1872. 8001180: 3301 adds r3, #1
  1873. 8001182: 781b ldrb r3, [r3, #0]
  1874. 8001184: 2b75 cmp r3, #117 @ 0x75
  1875. 8001186: f300 80a0 bgt.w 80012ca <parse_string+0x25a>
  1876. 800118a: 2b5c cmp r3, #92 @ 0x5c
  1877. 800118c: da04 bge.n 8001198 <parse_string+0x128>
  1878. 800118e: 2b22 cmp r3, #34 @ 0x22
  1879. 8001190: d05c beq.n 800124c <parse_string+0x1dc>
  1880. 8001192: 2b2f cmp r3, #47 @ 0x2f
  1881. 8001194: d05a beq.n 800124c <parse_string+0x1dc>
  1882. goto fail;
  1883. }
  1884. break;
  1885. default:
  1886. goto fail;
  1887. 8001196: e098 b.n 80012ca <parse_string+0x25a>
  1888. switch (input_pointer[1])
  1889. 8001198: 3b5c subs r3, #92 @ 0x5c
  1890. 800119a: 2b19 cmp r3, #25
  1891. 800119c: f200 8095 bhi.w 80012ca <parse_string+0x25a>
  1892. 80011a0: a201 add r2, pc, #4 @ (adr r2, 80011a8 <parse_string+0x138>)
  1893. 80011a2: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  1894. 80011a6: bf00 nop
  1895. 80011a8: 0800124d .word 0x0800124d
  1896. 80011ac: 080012cb .word 0x080012cb
  1897. 80011b0: 080012cb .word 0x080012cb
  1898. 80011b4: 080012cb .word 0x080012cb
  1899. 80011b8: 080012cb .word 0x080012cb
  1900. 80011bc: 080012cb .word 0x080012cb
  1901. 80011c0: 08001211 .word 0x08001211
  1902. 80011c4: 080012cb .word 0x080012cb
  1903. 80011c8: 080012cb .word 0x080012cb
  1904. 80011cc: 080012cb .word 0x080012cb
  1905. 80011d0: 0800121d .word 0x0800121d
  1906. 80011d4: 080012cb .word 0x080012cb
  1907. 80011d8: 080012cb .word 0x080012cb
  1908. 80011dc: 080012cb .word 0x080012cb
  1909. 80011e0: 080012cb .word 0x080012cb
  1910. 80011e4: 080012cb .word 0x080012cb
  1911. 80011e8: 080012cb .word 0x080012cb
  1912. 80011ec: 080012cb .word 0x080012cb
  1913. 80011f0: 08001229 .word 0x08001229
  1914. 80011f4: 080012cb .word 0x080012cb
  1915. 80011f8: 080012cb .word 0x080012cb
  1916. 80011fc: 080012cb .word 0x080012cb
  1917. 8001200: 08001235 .word 0x08001235
  1918. 8001204: 080012cb .word 0x080012cb
  1919. 8001208: 08001241 .word 0x08001241
  1920. 800120c: 0800125d .word 0x0800125d
  1921. *output_pointer++ = '\b';
  1922. 8001210: 68fb ldr r3, [r7, #12]
  1923. 8001212: 1c5a adds r2, r3, #1
  1924. 8001214: 60fa str r2, [r7, #12]
  1925. 8001216: 2208 movs r2, #8
  1926. 8001218: 701a strb r2, [r3, #0]
  1927. break;
  1928. 800121a: e02c b.n 8001276 <parse_string+0x206>
  1929. *output_pointer++ = '\f';
  1930. 800121c: 68fb ldr r3, [r7, #12]
  1931. 800121e: 1c5a adds r2, r3, #1
  1932. 8001220: 60fa str r2, [r7, #12]
  1933. 8001222: 220c movs r2, #12
  1934. 8001224: 701a strb r2, [r3, #0]
  1935. break;
  1936. 8001226: e026 b.n 8001276 <parse_string+0x206>
  1937. *output_pointer++ = '\n';
  1938. 8001228: 68fb ldr r3, [r7, #12]
  1939. 800122a: 1c5a adds r2, r3, #1
  1940. 800122c: 60fa str r2, [r7, #12]
  1941. 800122e: 220a movs r2, #10
  1942. 8001230: 701a strb r2, [r3, #0]
  1943. break;
  1944. 8001232: e020 b.n 8001276 <parse_string+0x206>
  1945. *output_pointer++ = '\r';
  1946. 8001234: 68fb ldr r3, [r7, #12]
  1947. 8001236: 1c5a adds r2, r3, #1
  1948. 8001238: 60fa str r2, [r7, #12]
  1949. 800123a: 220d movs r2, #13
  1950. 800123c: 701a strb r2, [r3, #0]
  1951. break;
  1952. 800123e: e01a b.n 8001276 <parse_string+0x206>
  1953. *output_pointer++ = '\t';
  1954. 8001240: 68fb ldr r3, [r7, #12]
  1955. 8001242: 1c5a adds r2, r3, #1
  1956. 8001244: 60fa str r2, [r7, #12]
  1957. 8001246: 2209 movs r2, #9
  1958. 8001248: 701a strb r2, [r3, #0]
  1959. break;
  1960. 800124a: e014 b.n 8001276 <parse_string+0x206>
  1961. *output_pointer++ = input_pointer[1];
  1962. 800124c: 6a7b ldr r3, [r7, #36] @ 0x24
  1963. 800124e: 1c5a adds r2, r3, #1
  1964. 8001250: 68fb ldr r3, [r7, #12]
  1965. 8001252: 1c59 adds r1, r3, #1
  1966. 8001254: 60f9 str r1, [r7, #12]
  1967. 8001256: 7812 ldrb r2, [r2, #0]
  1968. 8001258: 701a strb r2, [r3, #0]
  1969. break;
  1970. 800125a: e00c b.n 8001276 <parse_string+0x206>
  1971. sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer);
  1972. 800125c: f107 030c add.w r3, r7, #12
  1973. 8001260: 461a mov r2, r3
  1974. 8001262: 6a39 ldr r1, [r7, #32]
  1975. 8001264: 6a78 ldr r0, [r7, #36] @ 0x24
  1976. 8001266: f7ff fe1b bl 8000ea0 <utf16_literal_to_utf8>
  1977. 800126a: 4603 mov r3, r0
  1978. 800126c: 75fb strb r3, [r7, #23]
  1979. if (sequence_length == 0)
  1980. 800126e: 7dfb ldrb r3, [r7, #23]
  1981. 8001270: 2b00 cmp r3, #0
  1982. 8001272: d02c beq.n 80012ce <parse_string+0x25e>
  1983. break;
  1984. 8001274: bf00 nop
  1985. }
  1986. input_pointer += sequence_length;
  1987. 8001276: 7dfb ldrb r3, [r7, #23]
  1988. 8001278: 6a7a ldr r2, [r7, #36] @ 0x24
  1989. 800127a: 4413 add r3, r2
  1990. 800127c: 627b str r3, [r7, #36] @ 0x24
  1991. while (input_pointer < input_end)
  1992. 800127e: 6a7a ldr r2, [r7, #36] @ 0x24
  1993. 8001280: 6a3b ldr r3, [r7, #32]
  1994. 8001282: 429a cmp r2, r3
  1995. 8001284: f4ff af66 bcc.w 8001154 <parse_string+0xe4>
  1996. }
  1997. }
  1998. /* zero terminate the output */
  1999. *output_pointer = '\0';
  2000. 8001288: 68fb ldr r3, [r7, #12]
  2001. 800128a: 2200 movs r2, #0
  2002. 800128c: 701a strb r2, [r3, #0]
  2003. item->type = cJSON_String;
  2004. 800128e: 687b ldr r3, [r7, #4]
  2005. 8001290: 2210 movs r2, #16
  2006. 8001292: 60da str r2, [r3, #12]
  2007. item->valuestring = (char*)output;
  2008. 8001294: 687b ldr r3, [r7, #4]
  2009. 8001296: 69fa ldr r2, [r7, #28]
  2010. 8001298: 611a str r2, [r3, #16]
  2011. input_buffer->offset = (size_t) (input_end - input_buffer->content);
  2012. 800129a: 683b ldr r3, [r7, #0]
  2013. 800129c: 681b ldr r3, [r3, #0]
  2014. 800129e: 6a3a ldr r2, [r7, #32]
  2015. 80012a0: 1ad3 subs r3, r2, r3
  2016. 80012a2: 461a mov r2, r3
  2017. 80012a4: 683b ldr r3, [r7, #0]
  2018. 80012a6: 609a str r2, [r3, #8]
  2019. input_buffer->offset++;
  2020. 80012a8: 683b ldr r3, [r7, #0]
  2021. 80012aa: 689b ldr r3, [r3, #8]
  2022. 80012ac: 1c5a adds r2, r3, #1
  2023. 80012ae: 683b ldr r3, [r7, #0]
  2024. 80012b0: 609a str r2, [r3, #8]
  2025. return true;
  2026. 80012b2: 2301 movs r3, #1
  2027. 80012b4: e020 b.n 80012f8 <parse_string+0x288>
  2028. goto fail;
  2029. 80012b6: bf00 nop
  2030. 80012b8: e00a b.n 80012d0 <parse_string+0x260>
  2031. goto fail;
  2032. 80012ba: bf00 nop
  2033. 80012bc: e008 b.n 80012d0 <parse_string+0x260>
  2034. goto fail; /* string ended unexpectedly */
  2035. 80012be: bf00 nop
  2036. 80012c0: e006 b.n 80012d0 <parse_string+0x260>
  2037. goto fail; /* allocation failure */
  2038. 80012c2: bf00 nop
  2039. 80012c4: e004 b.n 80012d0 <parse_string+0x260>
  2040. goto fail;
  2041. 80012c6: bf00 nop
  2042. 80012c8: e002 b.n 80012d0 <parse_string+0x260>
  2043. goto fail;
  2044. 80012ca: bf00 nop
  2045. 80012cc: e000 b.n 80012d0 <parse_string+0x260>
  2046. goto fail;
  2047. 80012ce: bf00 nop
  2048. fail:
  2049. if (output != NULL)
  2050. 80012d0: 69fb ldr r3, [r7, #28]
  2051. 80012d2: 2b00 cmp r3, #0
  2052. 80012d4: d005 beq.n 80012e2 <parse_string+0x272>
  2053. {
  2054. input_buffer->hooks.deallocate(output);
  2055. 80012d6: 683b ldr r3, [r7, #0]
  2056. 80012d8: 695b ldr r3, [r3, #20]
  2057. 80012da: 69f8 ldr r0, [r7, #28]
  2058. 80012dc: 4798 blx r3
  2059. output = NULL;
  2060. 80012de: 2300 movs r3, #0
  2061. 80012e0: 61fb str r3, [r7, #28]
  2062. }
  2063. if (input_pointer != NULL)
  2064. 80012e2: 6a7b ldr r3, [r7, #36] @ 0x24
  2065. 80012e4: 2b00 cmp r3, #0
  2066. 80012e6: d006 beq.n 80012f6 <parse_string+0x286>
  2067. {
  2068. input_buffer->offset = (size_t)(input_pointer - input_buffer->content);
  2069. 80012e8: 683b ldr r3, [r7, #0]
  2070. 80012ea: 681b ldr r3, [r3, #0]
  2071. 80012ec: 6a7a ldr r2, [r7, #36] @ 0x24
  2072. 80012ee: 1ad3 subs r3, r2, r3
  2073. 80012f0: 461a mov r2, r3
  2074. 80012f2: 683b ldr r3, [r7, #0]
  2075. 80012f4: 609a str r2, [r3, #8]
  2076. }
  2077. return false;
  2078. 80012f6: 2300 movs r3, #0
  2079. }
  2080. 80012f8: 4618 mov r0, r3
  2081. 80012fa: 3728 adds r7, #40 @ 0x28
  2082. 80012fc: 46bd mov sp, r7
  2083. 80012fe: bd80 pop {r7, pc}
  2084. 08001300 <buffer_skip_whitespace>:
  2085. static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer);
  2086. static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer);
  2087. /* Utility to jump whitespace and cr/lf */
  2088. static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer)
  2089. {
  2090. 8001300: b480 push {r7}
  2091. 8001302: b083 sub sp, #12
  2092. 8001304: af00 add r7, sp, #0
  2093. 8001306: 6078 str r0, [r7, #4]
  2094. if ((buffer == NULL) || (buffer->content == NULL))
  2095. 8001308: 687b ldr r3, [r7, #4]
  2096. 800130a: 2b00 cmp r3, #0
  2097. 800130c: d003 beq.n 8001316 <buffer_skip_whitespace+0x16>
  2098. 800130e: 687b ldr r3, [r7, #4]
  2099. 8001310: 681b ldr r3, [r3, #0]
  2100. 8001312: 2b00 cmp r3, #0
  2101. 8001314: d101 bne.n 800131a <buffer_skip_whitespace+0x1a>
  2102. {
  2103. return NULL;
  2104. 8001316: 2300 movs r3, #0
  2105. 8001318: e02c b.n 8001374 <buffer_skip_whitespace+0x74>
  2106. }
  2107. if (cannot_access_at_index(buffer, 0))
  2108. 800131a: 687b ldr r3, [r7, #4]
  2109. 800131c: 2b00 cmp r3, #0
  2110. 800131e: d005 beq.n 800132c <buffer_skip_whitespace+0x2c>
  2111. 8001320: 687b ldr r3, [r7, #4]
  2112. 8001322: 689a ldr r2, [r3, #8]
  2113. 8001324: 687b ldr r3, [r7, #4]
  2114. 8001326: 685b ldr r3, [r3, #4]
  2115. 8001328: 429a cmp r2, r3
  2116. 800132a: d306 bcc.n 800133a <buffer_skip_whitespace+0x3a>
  2117. {
  2118. return buffer;
  2119. 800132c: 687b ldr r3, [r7, #4]
  2120. 800132e: e021 b.n 8001374 <buffer_skip_whitespace+0x74>
  2121. }
  2122. while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32))
  2123. {
  2124. buffer->offset++;
  2125. 8001330: 687b ldr r3, [r7, #4]
  2126. 8001332: 689b ldr r3, [r3, #8]
  2127. 8001334: 1c5a adds r2, r3, #1
  2128. 8001336: 687b ldr r3, [r7, #4]
  2129. 8001338: 609a str r2, [r3, #8]
  2130. while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32))
  2131. 800133a: 687b ldr r3, [r7, #4]
  2132. 800133c: 2b00 cmp r3, #0
  2133. 800133e: d00d beq.n 800135c <buffer_skip_whitespace+0x5c>
  2134. 8001340: 687b ldr r3, [r7, #4]
  2135. 8001342: 689a ldr r2, [r3, #8]
  2136. 8001344: 687b ldr r3, [r7, #4]
  2137. 8001346: 685b ldr r3, [r3, #4]
  2138. 8001348: 429a cmp r2, r3
  2139. 800134a: d207 bcs.n 800135c <buffer_skip_whitespace+0x5c>
  2140. 800134c: 687b ldr r3, [r7, #4]
  2141. 800134e: 681a ldr r2, [r3, #0]
  2142. 8001350: 687b ldr r3, [r7, #4]
  2143. 8001352: 689b ldr r3, [r3, #8]
  2144. 8001354: 4413 add r3, r2
  2145. 8001356: 781b ldrb r3, [r3, #0]
  2146. 8001358: 2b20 cmp r3, #32
  2147. 800135a: d9e9 bls.n 8001330 <buffer_skip_whitespace+0x30>
  2148. }
  2149. if (buffer->offset == buffer->length)
  2150. 800135c: 687b ldr r3, [r7, #4]
  2151. 800135e: 689a ldr r2, [r3, #8]
  2152. 8001360: 687b ldr r3, [r7, #4]
  2153. 8001362: 685b ldr r3, [r3, #4]
  2154. 8001364: 429a cmp r2, r3
  2155. 8001366: d104 bne.n 8001372 <buffer_skip_whitespace+0x72>
  2156. {
  2157. buffer->offset--;
  2158. 8001368: 687b ldr r3, [r7, #4]
  2159. 800136a: 689b ldr r3, [r3, #8]
  2160. 800136c: 1e5a subs r2, r3, #1
  2161. 800136e: 687b ldr r3, [r7, #4]
  2162. 8001370: 609a str r2, [r3, #8]
  2163. }
  2164. return buffer;
  2165. 8001372: 687b ldr r3, [r7, #4]
  2166. }
  2167. 8001374: 4618 mov r0, r3
  2168. 8001376: 370c adds r7, #12
  2169. 8001378: 46bd mov sp, r7
  2170. 800137a: f85d 7b04 ldr.w r7, [sp], #4
  2171. 800137e: 4770 bx lr
  2172. 08001380 <skip_utf8_bom>:
  2173. /* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */
  2174. static parse_buffer *skip_utf8_bom(parse_buffer * const buffer)
  2175. {
  2176. 8001380: b580 push {r7, lr}
  2177. 8001382: b082 sub sp, #8
  2178. 8001384: af00 add r7, sp, #0
  2179. 8001386: 6078 str r0, [r7, #4]
  2180. if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0))
  2181. 8001388: 687b ldr r3, [r7, #4]
  2182. 800138a: 2b00 cmp r3, #0
  2183. 800138c: d007 beq.n 800139e <skip_utf8_bom+0x1e>
  2184. 800138e: 687b ldr r3, [r7, #4]
  2185. 8001390: 681b ldr r3, [r3, #0]
  2186. 8001392: 2b00 cmp r3, #0
  2187. 8001394: d003 beq.n 800139e <skip_utf8_bom+0x1e>
  2188. 8001396: 687b ldr r3, [r7, #4]
  2189. 8001398: 689b ldr r3, [r3, #8]
  2190. 800139a: 2b00 cmp r3, #0
  2191. 800139c: d001 beq.n 80013a2 <skip_utf8_bom+0x22>
  2192. {
  2193. return NULL;
  2194. 800139e: 2300 movs r3, #0
  2195. 80013a0: e01c b.n 80013dc <skip_utf8_bom+0x5c>
  2196. }
  2197. if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0))
  2198. 80013a2: 687b ldr r3, [r7, #4]
  2199. 80013a4: 2b00 cmp r3, #0
  2200. 80013a6: d018 beq.n 80013da <skip_utf8_bom+0x5a>
  2201. 80013a8: 687b ldr r3, [r7, #4]
  2202. 80013aa: 689b ldr r3, [r3, #8]
  2203. 80013ac: 1d1a adds r2, r3, #4
  2204. 80013ae: 687b ldr r3, [r7, #4]
  2205. 80013b0: 685b ldr r3, [r3, #4]
  2206. 80013b2: 429a cmp r2, r3
  2207. 80013b4: d211 bcs.n 80013da <skip_utf8_bom+0x5a>
  2208. 80013b6: 687b ldr r3, [r7, #4]
  2209. 80013b8: 681a ldr r2, [r3, #0]
  2210. 80013ba: 687b ldr r3, [r7, #4]
  2211. 80013bc: 689b ldr r3, [r3, #8]
  2212. 80013be: 4413 add r3, r2
  2213. 80013c0: 2203 movs r2, #3
  2214. 80013c2: 4908 ldr r1, [pc, #32] @ (80013e4 <skip_utf8_bom+0x64>)
  2215. 80013c4: 4618 mov r0, r3
  2216. 80013c6: f028 fc9b bl 8029d00 <strncmp>
  2217. 80013ca: 4603 mov r3, r0
  2218. 80013cc: 2b00 cmp r3, #0
  2219. 80013ce: d104 bne.n 80013da <skip_utf8_bom+0x5a>
  2220. {
  2221. buffer->offset += 3;
  2222. 80013d0: 687b ldr r3, [r7, #4]
  2223. 80013d2: 689b ldr r3, [r3, #8]
  2224. 80013d4: 1cda adds r2, r3, #3
  2225. 80013d6: 687b ldr r3, [r7, #4]
  2226. 80013d8: 609a str r2, [r3, #8]
  2227. }
  2228. return buffer;
  2229. 80013da: 687b ldr r3, [r7, #4]
  2230. }
  2231. 80013dc: 4618 mov r0, r3
  2232. 80013de: 3708 adds r7, #8
  2233. 80013e0: 46bd mov sp, r7
  2234. 80013e2: bd80 pop {r7, pc}
  2235. 80013e4: 0802c488 .word 0x0802c488
  2236. 080013e8 <cJSON_ParseWithOpts>:
  2237. CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated)
  2238. {
  2239. 80013e8: b580 push {r7, lr}
  2240. 80013ea: b086 sub sp, #24
  2241. 80013ec: af00 add r7, sp, #0
  2242. 80013ee: 60f8 str r0, [r7, #12]
  2243. 80013f0: 60b9 str r1, [r7, #8]
  2244. 80013f2: 607a str r2, [r7, #4]
  2245. size_t buffer_length;
  2246. if (NULL == value)
  2247. 80013f4: 68fb ldr r3, [r7, #12]
  2248. 80013f6: 2b00 cmp r3, #0
  2249. 80013f8: d101 bne.n 80013fe <cJSON_ParseWithOpts+0x16>
  2250. {
  2251. return NULL;
  2252. 80013fa: 2300 movs r3, #0
  2253. 80013fc: e00c b.n 8001418 <cJSON_ParseWithOpts+0x30>
  2254. }
  2255. /* Adding null character size due to require_null_terminated. */
  2256. buffer_length = strlen(value) + sizeof("");
  2257. 80013fe: 68f8 ldr r0, [r7, #12]
  2258. 8001400: f7fe ffce bl 80003a0 <strlen>
  2259. 8001404: 4603 mov r3, r0
  2260. 8001406: 3301 adds r3, #1
  2261. 8001408: 617b str r3, [r7, #20]
  2262. return cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, require_null_terminated);
  2263. 800140a: 687b ldr r3, [r7, #4]
  2264. 800140c: 68ba ldr r2, [r7, #8]
  2265. 800140e: 6979 ldr r1, [r7, #20]
  2266. 8001410: 68f8 ldr r0, [r7, #12]
  2267. 8001412: f000 f805 bl 8001420 <cJSON_ParseWithLengthOpts>
  2268. 8001416: 4603 mov r3, r0
  2269. }
  2270. 8001418: 4618 mov r0, r3
  2271. 800141a: 3718 adds r7, #24
  2272. 800141c: 46bd mov sp, r7
  2273. 800141e: bd80 pop {r7, pc}
  2274. 08001420 <cJSON_ParseWithLengthOpts>:
  2275. /* Parse an object - create a new root, and populate. */
  2276. CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated)
  2277. {
  2278. 8001420: b580 push {r7, lr}
  2279. 8001422: b08e sub sp, #56 @ 0x38
  2280. 8001424: af00 add r7, sp, #0
  2281. 8001426: 60f8 str r0, [r7, #12]
  2282. 8001428: 60b9 str r1, [r7, #8]
  2283. 800142a: 607a str r2, [r7, #4]
  2284. 800142c: 603b str r3, [r7, #0]
  2285. parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
  2286. 800142e: f107 0318 add.w r3, r7, #24
  2287. 8001432: 2200 movs r2, #0
  2288. 8001434: 601a str r2, [r3, #0]
  2289. 8001436: 605a str r2, [r3, #4]
  2290. 8001438: 609a str r2, [r3, #8]
  2291. 800143a: 60da str r2, [r3, #12]
  2292. 800143c: 611a str r2, [r3, #16]
  2293. 800143e: 615a str r2, [r3, #20]
  2294. 8001440: 619a str r2, [r3, #24]
  2295. cJSON *item = NULL;
  2296. 8001442: 2300 movs r3, #0
  2297. 8001444: 637b str r3, [r7, #52] @ 0x34
  2298. /* reset error position */
  2299. global_error.json = NULL;
  2300. 8001446: 4b41 ldr r3, [pc, #260] @ (800154c <cJSON_ParseWithLengthOpts+0x12c>)
  2301. 8001448: 2200 movs r2, #0
  2302. 800144a: 601a str r2, [r3, #0]
  2303. global_error.position = 0;
  2304. 800144c: 4b3f ldr r3, [pc, #252] @ (800154c <cJSON_ParseWithLengthOpts+0x12c>)
  2305. 800144e: 2200 movs r2, #0
  2306. 8001450: 605a str r2, [r3, #4]
  2307. if (value == NULL || 0 == buffer_length)
  2308. 8001452: 68fb ldr r3, [r7, #12]
  2309. 8001454: 2b00 cmp r3, #0
  2310. 8001456: d042 beq.n 80014de <cJSON_ParseWithLengthOpts+0xbe>
  2311. 8001458: 68bb ldr r3, [r7, #8]
  2312. 800145a: 2b00 cmp r3, #0
  2313. 800145c: d03f beq.n 80014de <cJSON_ParseWithLengthOpts+0xbe>
  2314. {
  2315. goto fail;
  2316. }
  2317. buffer.content = (const unsigned char*)value;
  2318. 800145e: 68fb ldr r3, [r7, #12]
  2319. 8001460: 61bb str r3, [r7, #24]
  2320. buffer.length = buffer_length;
  2321. 8001462: 68bb ldr r3, [r7, #8]
  2322. 8001464: 61fb str r3, [r7, #28]
  2323. buffer.offset = 0;
  2324. 8001466: 2300 movs r3, #0
  2325. 8001468: 623b str r3, [r7, #32]
  2326. buffer.hooks = global_hooks;
  2327. 800146a: 4a39 ldr r2, [pc, #228] @ (8001550 <cJSON_ParseWithLengthOpts+0x130>)
  2328. 800146c: f107 0328 add.w r3, r7, #40 @ 0x28
  2329. 8001470: ca07 ldmia r2, {r0, r1, r2}
  2330. 8001472: e883 0007 stmia.w r3, {r0, r1, r2}
  2331. item = cJSON_New_Item(&global_hooks);
  2332. 8001476: 4836 ldr r0, [pc, #216] @ (8001550 <cJSON_ParseWithLengthOpts+0x130>)
  2333. 8001478: f7ff fb72 bl 8000b60 <cJSON_New_Item>
  2334. 800147c: 6378 str r0, [r7, #52] @ 0x34
  2335. if (item == NULL) /* memory fail */
  2336. 800147e: 6b7b ldr r3, [r7, #52] @ 0x34
  2337. 8001480: 2b00 cmp r3, #0
  2338. 8001482: d02e beq.n 80014e2 <cJSON_ParseWithLengthOpts+0xc2>
  2339. {
  2340. goto fail;
  2341. }
  2342. if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer))))
  2343. 8001484: f107 0318 add.w r3, r7, #24
  2344. 8001488: 4618 mov r0, r3
  2345. 800148a: f7ff ff79 bl 8001380 <skip_utf8_bom>
  2346. 800148e: 4603 mov r3, r0
  2347. 8001490: 4618 mov r0, r3
  2348. 8001492: f7ff ff35 bl 8001300 <buffer_skip_whitespace>
  2349. 8001496: 4603 mov r3, r0
  2350. 8001498: 4619 mov r1, r3
  2351. 800149a: 6b78 ldr r0, [r7, #52] @ 0x34
  2352. 800149c: f000 f868 bl 8001570 <parse_value>
  2353. 80014a0: 4603 mov r3, r0
  2354. 80014a2: 2b00 cmp r3, #0
  2355. 80014a4: d01f beq.n 80014e6 <cJSON_ParseWithLengthOpts+0xc6>
  2356. /* parse failure. ep is set. */
  2357. goto fail;
  2358. }
  2359. /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */
  2360. if (require_null_terminated)
  2361. 80014a6: 683b ldr r3, [r7, #0]
  2362. 80014a8: 2b00 cmp r3, #0
  2363. 80014aa: d00e beq.n 80014ca <cJSON_ParseWithLengthOpts+0xaa>
  2364. {
  2365. buffer_skip_whitespace(&buffer);
  2366. 80014ac: f107 0318 add.w r3, r7, #24
  2367. 80014b0: 4618 mov r0, r3
  2368. 80014b2: f7ff ff25 bl 8001300 <buffer_skip_whitespace>
  2369. if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0')
  2370. 80014b6: 6a3a ldr r2, [r7, #32]
  2371. 80014b8: 69fb ldr r3, [r7, #28]
  2372. 80014ba: 429a cmp r2, r3
  2373. 80014bc: d215 bcs.n 80014ea <cJSON_ParseWithLengthOpts+0xca>
  2374. 80014be: 69ba ldr r2, [r7, #24]
  2375. 80014c0: 6a3b ldr r3, [r7, #32]
  2376. 80014c2: 4413 add r3, r2
  2377. 80014c4: 781b ldrb r3, [r3, #0]
  2378. 80014c6: 2b00 cmp r3, #0
  2379. 80014c8: d10f bne.n 80014ea <cJSON_ParseWithLengthOpts+0xca>
  2380. {
  2381. goto fail;
  2382. }
  2383. }
  2384. if (return_parse_end)
  2385. 80014ca: 687b ldr r3, [r7, #4]
  2386. 80014cc: 2b00 cmp r3, #0
  2387. 80014ce: d004 beq.n 80014da <cJSON_ParseWithLengthOpts+0xba>
  2388. {
  2389. *return_parse_end = (const char*)buffer_at_offset(&buffer);
  2390. 80014d0: 69ba ldr r2, [r7, #24]
  2391. 80014d2: 6a3b ldr r3, [r7, #32]
  2392. 80014d4: 441a add r2, r3
  2393. 80014d6: 687b ldr r3, [r7, #4]
  2394. 80014d8: 601a str r2, [r3, #0]
  2395. }
  2396. return item;
  2397. 80014da: 6b7b ldr r3, [r7, #52] @ 0x34
  2398. 80014dc: e031 b.n 8001542 <cJSON_ParseWithLengthOpts+0x122>
  2399. goto fail;
  2400. 80014de: bf00 nop
  2401. 80014e0: e004 b.n 80014ec <cJSON_ParseWithLengthOpts+0xcc>
  2402. goto fail;
  2403. 80014e2: bf00 nop
  2404. 80014e4: e002 b.n 80014ec <cJSON_ParseWithLengthOpts+0xcc>
  2405. goto fail;
  2406. 80014e6: bf00 nop
  2407. 80014e8: e000 b.n 80014ec <cJSON_ParseWithLengthOpts+0xcc>
  2408. goto fail;
  2409. 80014ea: bf00 nop
  2410. fail:
  2411. if (item != NULL)
  2412. 80014ec: 6b7b ldr r3, [r7, #52] @ 0x34
  2413. 80014ee: 2b00 cmp r3, #0
  2414. 80014f0: d002 beq.n 80014f8 <cJSON_ParseWithLengthOpts+0xd8>
  2415. {
  2416. cJSON_Delete(item);
  2417. 80014f2: 6b78 ldr r0, [r7, #52] @ 0x34
  2418. 80014f4: f7ff fb4a bl 8000b8c <cJSON_Delete>
  2419. }
  2420. if (value != NULL)
  2421. 80014f8: 68fb ldr r3, [r7, #12]
  2422. 80014fa: 2b00 cmp r3, #0
  2423. 80014fc: d020 beq.n 8001540 <cJSON_ParseWithLengthOpts+0x120>
  2424. {
  2425. error local_error;
  2426. local_error.json = (const unsigned char*)value;
  2427. 80014fe: 68fb ldr r3, [r7, #12]
  2428. 8001500: 613b str r3, [r7, #16]
  2429. local_error.position = 0;
  2430. 8001502: 2300 movs r3, #0
  2431. 8001504: 617b str r3, [r7, #20]
  2432. if (buffer.offset < buffer.length)
  2433. 8001506: 6a3a ldr r2, [r7, #32]
  2434. 8001508: 69fb ldr r3, [r7, #28]
  2435. 800150a: 429a cmp r2, r3
  2436. 800150c: d202 bcs.n 8001514 <cJSON_ParseWithLengthOpts+0xf4>
  2437. {
  2438. local_error.position = buffer.offset;
  2439. 800150e: 6a3b ldr r3, [r7, #32]
  2440. 8001510: 617b str r3, [r7, #20]
  2441. 8001512: e005 b.n 8001520 <cJSON_ParseWithLengthOpts+0x100>
  2442. }
  2443. else if (buffer.length > 0)
  2444. 8001514: 69fb ldr r3, [r7, #28]
  2445. 8001516: 2b00 cmp r3, #0
  2446. 8001518: d002 beq.n 8001520 <cJSON_ParseWithLengthOpts+0x100>
  2447. {
  2448. local_error.position = buffer.length - 1;
  2449. 800151a: 69fb ldr r3, [r7, #28]
  2450. 800151c: 3b01 subs r3, #1
  2451. 800151e: 617b str r3, [r7, #20]
  2452. }
  2453. if (return_parse_end != NULL)
  2454. 8001520: 687b ldr r3, [r7, #4]
  2455. 8001522: 2b00 cmp r3, #0
  2456. 8001524: d004 beq.n 8001530 <cJSON_ParseWithLengthOpts+0x110>
  2457. {
  2458. *return_parse_end = (const char*)local_error.json + local_error.position;
  2459. 8001526: 693a ldr r2, [r7, #16]
  2460. 8001528: 697b ldr r3, [r7, #20]
  2461. 800152a: 441a add r2, r3
  2462. 800152c: 687b ldr r3, [r7, #4]
  2463. 800152e: 601a str r2, [r3, #0]
  2464. }
  2465. global_error = local_error;
  2466. 8001530: 4b06 ldr r3, [pc, #24] @ (800154c <cJSON_ParseWithLengthOpts+0x12c>)
  2467. 8001532: 461a mov r2, r3
  2468. 8001534: f107 0310 add.w r3, r7, #16
  2469. 8001538: e893 0003 ldmia.w r3, {r0, r1}
  2470. 800153c: e882 0003 stmia.w r2, {r0, r1}
  2471. }
  2472. return NULL;
  2473. 8001540: 2300 movs r3, #0
  2474. }
  2475. 8001542: 4618 mov r0, r3
  2476. 8001544: 3738 adds r7, #56 @ 0x38
  2477. 8001546: 46bd mov sp, r7
  2478. 8001548: bd80 pop {r7, pc}
  2479. 800154a: bf00 nop
  2480. 800154c: 24000240 .word 0x24000240
  2481. 8001550: 24000000 .word 0x24000000
  2482. 08001554 <cJSON_Parse>:
  2483. /* Default options for cJSON_Parse */
  2484. CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value)
  2485. {
  2486. 8001554: b580 push {r7, lr}
  2487. 8001556: b082 sub sp, #8
  2488. 8001558: af00 add r7, sp, #0
  2489. 800155a: 6078 str r0, [r7, #4]
  2490. return cJSON_ParseWithOpts(value, 0, 0);
  2491. 800155c: 2200 movs r2, #0
  2492. 800155e: 2100 movs r1, #0
  2493. 8001560: 6878 ldr r0, [r7, #4]
  2494. 8001562: f7ff ff41 bl 80013e8 <cJSON_ParseWithOpts>
  2495. 8001566: 4603 mov r3, r0
  2496. }
  2497. 8001568: 4618 mov r0, r3
  2498. 800156a: 3708 adds r7, #8
  2499. 800156c: 46bd mov sp, r7
  2500. 800156e: bd80 pop {r7, pc}
  2501. 08001570 <parse_value>:
  2502. return print_value(item, &p);
  2503. }
  2504. /* Parser core - when encountering text, process appropriately. */
  2505. static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer)
  2506. {
  2507. 8001570: b580 push {r7, lr}
  2508. 8001572: b082 sub sp, #8
  2509. 8001574: af00 add r7, sp, #0
  2510. 8001576: 6078 str r0, [r7, #4]
  2511. 8001578: 6039 str r1, [r7, #0]
  2512. if ((input_buffer == NULL) || (input_buffer->content == NULL))
  2513. 800157a: 683b ldr r3, [r7, #0]
  2514. 800157c: 2b00 cmp r3, #0
  2515. 800157e: d003 beq.n 8001588 <parse_value+0x18>
  2516. 8001580: 683b ldr r3, [r7, #0]
  2517. 8001582: 681b ldr r3, [r3, #0]
  2518. 8001584: 2b00 cmp r3, #0
  2519. 8001586: d101 bne.n 800158c <parse_value+0x1c>
  2520. {
  2521. return false; /* no input */
  2522. 8001588: 2300 movs r3, #0
  2523. 800158a: e0d2 b.n 8001732 <parse_value+0x1c2>
  2524. }
  2525. /* parse the different types of values */
  2526. /* null */
  2527. if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0))
  2528. 800158c: 683b ldr r3, [r7, #0]
  2529. 800158e: 2b00 cmp r3, #0
  2530. 8001590: d01d beq.n 80015ce <parse_value+0x5e>
  2531. 8001592: 683b ldr r3, [r7, #0]
  2532. 8001594: 689b ldr r3, [r3, #8]
  2533. 8001596: 1d1a adds r2, r3, #4
  2534. 8001598: 683b ldr r3, [r7, #0]
  2535. 800159a: 685b ldr r3, [r3, #4]
  2536. 800159c: 429a cmp r2, r3
  2537. 800159e: d816 bhi.n 80015ce <parse_value+0x5e>
  2538. 80015a0: 683b ldr r3, [r7, #0]
  2539. 80015a2: 681a ldr r2, [r3, #0]
  2540. 80015a4: 683b ldr r3, [r7, #0]
  2541. 80015a6: 689b ldr r3, [r3, #8]
  2542. 80015a8: 4413 add r3, r2
  2543. 80015aa: 2204 movs r2, #4
  2544. 80015ac: 4963 ldr r1, [pc, #396] @ (800173c <parse_value+0x1cc>)
  2545. 80015ae: 4618 mov r0, r3
  2546. 80015b0: f028 fba6 bl 8029d00 <strncmp>
  2547. 80015b4: 4603 mov r3, r0
  2548. 80015b6: 2b00 cmp r3, #0
  2549. 80015b8: d109 bne.n 80015ce <parse_value+0x5e>
  2550. {
  2551. item->type = cJSON_NULL;
  2552. 80015ba: 687b ldr r3, [r7, #4]
  2553. 80015bc: 2204 movs r2, #4
  2554. 80015be: 60da str r2, [r3, #12]
  2555. input_buffer->offset += 4;
  2556. 80015c0: 683b ldr r3, [r7, #0]
  2557. 80015c2: 689b ldr r3, [r3, #8]
  2558. 80015c4: 1d1a adds r2, r3, #4
  2559. 80015c6: 683b ldr r3, [r7, #0]
  2560. 80015c8: 609a str r2, [r3, #8]
  2561. return true;
  2562. 80015ca: 2301 movs r3, #1
  2563. 80015cc: e0b1 b.n 8001732 <parse_value+0x1c2>
  2564. }
  2565. /* false */
  2566. if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0))
  2567. 80015ce: 683b ldr r3, [r7, #0]
  2568. 80015d0: 2b00 cmp r3, #0
  2569. 80015d2: d01d beq.n 8001610 <parse_value+0xa0>
  2570. 80015d4: 683b ldr r3, [r7, #0]
  2571. 80015d6: 689b ldr r3, [r3, #8]
  2572. 80015d8: 1d5a adds r2, r3, #5
  2573. 80015da: 683b ldr r3, [r7, #0]
  2574. 80015dc: 685b ldr r3, [r3, #4]
  2575. 80015de: 429a cmp r2, r3
  2576. 80015e0: d816 bhi.n 8001610 <parse_value+0xa0>
  2577. 80015e2: 683b ldr r3, [r7, #0]
  2578. 80015e4: 681a ldr r2, [r3, #0]
  2579. 80015e6: 683b ldr r3, [r7, #0]
  2580. 80015e8: 689b ldr r3, [r3, #8]
  2581. 80015ea: 4413 add r3, r2
  2582. 80015ec: 2205 movs r2, #5
  2583. 80015ee: 4954 ldr r1, [pc, #336] @ (8001740 <parse_value+0x1d0>)
  2584. 80015f0: 4618 mov r0, r3
  2585. 80015f2: f028 fb85 bl 8029d00 <strncmp>
  2586. 80015f6: 4603 mov r3, r0
  2587. 80015f8: 2b00 cmp r3, #0
  2588. 80015fa: d109 bne.n 8001610 <parse_value+0xa0>
  2589. {
  2590. item->type = cJSON_False;
  2591. 80015fc: 687b ldr r3, [r7, #4]
  2592. 80015fe: 2201 movs r2, #1
  2593. 8001600: 60da str r2, [r3, #12]
  2594. input_buffer->offset += 5;
  2595. 8001602: 683b ldr r3, [r7, #0]
  2596. 8001604: 689b ldr r3, [r3, #8]
  2597. 8001606: 1d5a adds r2, r3, #5
  2598. 8001608: 683b ldr r3, [r7, #0]
  2599. 800160a: 609a str r2, [r3, #8]
  2600. return true;
  2601. 800160c: 2301 movs r3, #1
  2602. 800160e: e090 b.n 8001732 <parse_value+0x1c2>
  2603. }
  2604. /* true */
  2605. if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0))
  2606. 8001610: 683b ldr r3, [r7, #0]
  2607. 8001612: 2b00 cmp r3, #0
  2608. 8001614: d020 beq.n 8001658 <parse_value+0xe8>
  2609. 8001616: 683b ldr r3, [r7, #0]
  2610. 8001618: 689b ldr r3, [r3, #8]
  2611. 800161a: 1d1a adds r2, r3, #4
  2612. 800161c: 683b ldr r3, [r7, #0]
  2613. 800161e: 685b ldr r3, [r3, #4]
  2614. 8001620: 429a cmp r2, r3
  2615. 8001622: d819 bhi.n 8001658 <parse_value+0xe8>
  2616. 8001624: 683b ldr r3, [r7, #0]
  2617. 8001626: 681a ldr r2, [r3, #0]
  2618. 8001628: 683b ldr r3, [r7, #0]
  2619. 800162a: 689b ldr r3, [r3, #8]
  2620. 800162c: 4413 add r3, r2
  2621. 800162e: 2204 movs r2, #4
  2622. 8001630: 4944 ldr r1, [pc, #272] @ (8001744 <parse_value+0x1d4>)
  2623. 8001632: 4618 mov r0, r3
  2624. 8001634: f028 fb64 bl 8029d00 <strncmp>
  2625. 8001638: 4603 mov r3, r0
  2626. 800163a: 2b00 cmp r3, #0
  2627. 800163c: d10c bne.n 8001658 <parse_value+0xe8>
  2628. {
  2629. item->type = cJSON_True;
  2630. 800163e: 687b ldr r3, [r7, #4]
  2631. 8001640: 2202 movs r2, #2
  2632. 8001642: 60da str r2, [r3, #12]
  2633. item->valueint = 1;
  2634. 8001644: 687b ldr r3, [r7, #4]
  2635. 8001646: 2201 movs r2, #1
  2636. 8001648: 615a str r2, [r3, #20]
  2637. input_buffer->offset += 4;
  2638. 800164a: 683b ldr r3, [r7, #0]
  2639. 800164c: 689b ldr r3, [r3, #8]
  2640. 800164e: 1d1a adds r2, r3, #4
  2641. 8001650: 683b ldr r3, [r7, #0]
  2642. 8001652: 609a str r2, [r3, #8]
  2643. return true;
  2644. 8001654: 2301 movs r3, #1
  2645. 8001656: e06c b.n 8001732 <parse_value+0x1c2>
  2646. }
  2647. /* string */
  2648. if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"'))
  2649. 8001658: 683b ldr r3, [r7, #0]
  2650. 800165a: 2b00 cmp r3, #0
  2651. 800165c: d013 beq.n 8001686 <parse_value+0x116>
  2652. 800165e: 683b ldr r3, [r7, #0]
  2653. 8001660: 689a ldr r2, [r3, #8]
  2654. 8001662: 683b ldr r3, [r7, #0]
  2655. 8001664: 685b ldr r3, [r3, #4]
  2656. 8001666: 429a cmp r2, r3
  2657. 8001668: d20d bcs.n 8001686 <parse_value+0x116>
  2658. 800166a: 683b ldr r3, [r7, #0]
  2659. 800166c: 681a ldr r2, [r3, #0]
  2660. 800166e: 683b ldr r3, [r7, #0]
  2661. 8001670: 689b ldr r3, [r3, #8]
  2662. 8001672: 4413 add r3, r2
  2663. 8001674: 781b ldrb r3, [r3, #0]
  2664. 8001676: 2b22 cmp r3, #34 @ 0x22
  2665. 8001678: d105 bne.n 8001686 <parse_value+0x116>
  2666. {
  2667. return parse_string(item, input_buffer);
  2668. 800167a: 6839 ldr r1, [r7, #0]
  2669. 800167c: 6878 ldr r0, [r7, #4]
  2670. 800167e: f7ff fcf7 bl 8001070 <parse_string>
  2671. 8001682: 4603 mov r3, r0
  2672. 8001684: e055 b.n 8001732 <parse_value+0x1c2>
  2673. }
  2674. /* number */
  2675. if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9'))))
  2676. 8001686: 683b ldr r3, [r7, #0]
  2677. 8001688: 2b00 cmp r3, #0
  2678. 800168a: d023 beq.n 80016d4 <parse_value+0x164>
  2679. 800168c: 683b ldr r3, [r7, #0]
  2680. 800168e: 689a ldr r2, [r3, #8]
  2681. 8001690: 683b ldr r3, [r7, #0]
  2682. 8001692: 685b ldr r3, [r3, #4]
  2683. 8001694: 429a cmp r2, r3
  2684. 8001696: d21d bcs.n 80016d4 <parse_value+0x164>
  2685. 8001698: 683b ldr r3, [r7, #0]
  2686. 800169a: 681a ldr r2, [r3, #0]
  2687. 800169c: 683b ldr r3, [r7, #0]
  2688. 800169e: 689b ldr r3, [r3, #8]
  2689. 80016a0: 4413 add r3, r2
  2690. 80016a2: 781b ldrb r3, [r3, #0]
  2691. 80016a4: 2b2d cmp r3, #45 @ 0x2d
  2692. 80016a6: d00f beq.n 80016c8 <parse_value+0x158>
  2693. 80016a8: 683b ldr r3, [r7, #0]
  2694. 80016aa: 681a ldr r2, [r3, #0]
  2695. 80016ac: 683b ldr r3, [r7, #0]
  2696. 80016ae: 689b ldr r3, [r3, #8]
  2697. 80016b0: 4413 add r3, r2
  2698. 80016b2: 781b ldrb r3, [r3, #0]
  2699. 80016b4: 2b2f cmp r3, #47 @ 0x2f
  2700. 80016b6: d90d bls.n 80016d4 <parse_value+0x164>
  2701. 80016b8: 683b ldr r3, [r7, #0]
  2702. 80016ba: 681a ldr r2, [r3, #0]
  2703. 80016bc: 683b ldr r3, [r7, #0]
  2704. 80016be: 689b ldr r3, [r3, #8]
  2705. 80016c0: 4413 add r3, r2
  2706. 80016c2: 781b ldrb r3, [r3, #0]
  2707. 80016c4: 2b39 cmp r3, #57 @ 0x39
  2708. 80016c6: d805 bhi.n 80016d4 <parse_value+0x164>
  2709. {
  2710. return parse_number(item, input_buffer);
  2711. 80016c8: 6839 ldr r1, [r7, #0]
  2712. 80016ca: 6878 ldr r0, [r7, #4]
  2713. 80016cc: f7ff fab8 bl 8000c40 <parse_number>
  2714. 80016d0: 4603 mov r3, r0
  2715. 80016d2: e02e b.n 8001732 <parse_value+0x1c2>
  2716. }
  2717. /* array */
  2718. if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '['))
  2719. 80016d4: 683b ldr r3, [r7, #0]
  2720. 80016d6: 2b00 cmp r3, #0
  2721. 80016d8: d013 beq.n 8001702 <parse_value+0x192>
  2722. 80016da: 683b ldr r3, [r7, #0]
  2723. 80016dc: 689a ldr r2, [r3, #8]
  2724. 80016de: 683b ldr r3, [r7, #0]
  2725. 80016e0: 685b ldr r3, [r3, #4]
  2726. 80016e2: 429a cmp r2, r3
  2727. 80016e4: d20d bcs.n 8001702 <parse_value+0x192>
  2728. 80016e6: 683b ldr r3, [r7, #0]
  2729. 80016e8: 681a ldr r2, [r3, #0]
  2730. 80016ea: 683b ldr r3, [r7, #0]
  2731. 80016ec: 689b ldr r3, [r3, #8]
  2732. 80016ee: 4413 add r3, r2
  2733. 80016f0: 781b ldrb r3, [r3, #0]
  2734. 80016f2: 2b5b cmp r3, #91 @ 0x5b
  2735. 80016f4: d105 bne.n 8001702 <parse_value+0x192>
  2736. {
  2737. return parse_array(item, input_buffer);
  2738. 80016f6: 6839 ldr r1, [r7, #0]
  2739. 80016f8: 6878 ldr r0, [r7, #4]
  2740. 80016fa: f000 f825 bl 8001748 <parse_array>
  2741. 80016fe: 4603 mov r3, r0
  2742. 8001700: e017 b.n 8001732 <parse_value+0x1c2>
  2743. }
  2744. /* object */
  2745. if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{'))
  2746. 8001702: 683b ldr r3, [r7, #0]
  2747. 8001704: 2b00 cmp r3, #0
  2748. 8001706: d013 beq.n 8001730 <parse_value+0x1c0>
  2749. 8001708: 683b ldr r3, [r7, #0]
  2750. 800170a: 689a ldr r2, [r3, #8]
  2751. 800170c: 683b ldr r3, [r7, #0]
  2752. 800170e: 685b ldr r3, [r3, #4]
  2753. 8001710: 429a cmp r2, r3
  2754. 8001712: d20d bcs.n 8001730 <parse_value+0x1c0>
  2755. 8001714: 683b ldr r3, [r7, #0]
  2756. 8001716: 681a ldr r2, [r3, #0]
  2757. 8001718: 683b ldr r3, [r7, #0]
  2758. 800171a: 689b ldr r3, [r3, #8]
  2759. 800171c: 4413 add r3, r2
  2760. 800171e: 781b ldrb r3, [r3, #0]
  2761. 8001720: 2b7b cmp r3, #123 @ 0x7b
  2762. 8001722: d105 bne.n 8001730 <parse_value+0x1c0>
  2763. {
  2764. return parse_object(item, input_buffer);
  2765. 8001724: 6839 ldr r1, [r7, #0]
  2766. 8001726: 6878 ldr r0, [r7, #4]
  2767. 8001728: f000 f8d2 bl 80018d0 <parse_object>
  2768. 800172c: 4603 mov r3, r0
  2769. 800172e: e000 b.n 8001732 <parse_value+0x1c2>
  2770. }
  2771. return false;
  2772. 8001730: 2300 movs r3, #0
  2773. }
  2774. 8001732: 4618 mov r0, r3
  2775. 8001734: 3708 adds r7, #8
  2776. 8001736: 46bd mov sp, r7
  2777. 8001738: bd80 pop {r7, pc}
  2778. 800173a: bf00 nop
  2779. 800173c: 0802c45c .word 0x0802c45c
  2780. 8001740: 0802c48c .word 0x0802c48c
  2781. 8001744: 0802c494 .word 0x0802c494
  2782. 08001748 <parse_array>:
  2783. }
  2784. }
  2785. /* Build an array from input text. */
  2786. static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer)
  2787. {
  2788. 8001748: b580 push {r7, lr}
  2789. 800174a: b086 sub sp, #24
  2790. 800174c: af00 add r7, sp, #0
  2791. 800174e: 6078 str r0, [r7, #4]
  2792. 8001750: 6039 str r1, [r7, #0]
  2793. cJSON *head = NULL; /* head of the linked list */
  2794. 8001752: 2300 movs r3, #0
  2795. 8001754: 617b str r3, [r7, #20]
  2796. cJSON *current_item = NULL;
  2797. 8001756: 2300 movs r3, #0
  2798. 8001758: 613b str r3, [r7, #16]
  2799. if (input_buffer->depth >= CJSON_NESTING_LIMIT)
  2800. 800175a: 683b ldr r3, [r7, #0]
  2801. 800175c: 68db ldr r3, [r3, #12]
  2802. 800175e: f5b3 7f7a cmp.w r3, #1000 @ 0x3e8
  2803. 8001762: d301 bcc.n 8001768 <parse_array+0x20>
  2804. {
  2805. return false; /* to deeply nested */
  2806. 8001764: 2300 movs r3, #0
  2807. 8001766: e0af b.n 80018c8 <parse_array+0x180>
  2808. }
  2809. input_buffer->depth++;
  2810. 8001768: 683b ldr r3, [r7, #0]
  2811. 800176a: 68db ldr r3, [r3, #12]
  2812. 800176c: 1c5a adds r2, r3, #1
  2813. 800176e: 683b ldr r3, [r7, #0]
  2814. 8001770: 60da str r2, [r3, #12]
  2815. if (buffer_at_offset(input_buffer)[0] != '[')
  2816. 8001772: 683b ldr r3, [r7, #0]
  2817. 8001774: 681a ldr r2, [r3, #0]
  2818. 8001776: 683b ldr r3, [r7, #0]
  2819. 8001778: 689b ldr r3, [r3, #8]
  2820. 800177a: 4413 add r3, r2
  2821. 800177c: 781b ldrb r3, [r3, #0]
  2822. 800177e: 2b5b cmp r3, #91 @ 0x5b
  2823. 8001780: f040 8094 bne.w 80018ac <parse_array+0x164>
  2824. {
  2825. /* not an array */
  2826. goto fail;
  2827. }
  2828. input_buffer->offset++;
  2829. 8001784: 683b ldr r3, [r7, #0]
  2830. 8001786: 689b ldr r3, [r3, #8]
  2831. 8001788: 1c5a adds r2, r3, #1
  2832. 800178a: 683b ldr r3, [r7, #0]
  2833. 800178c: 609a str r2, [r3, #8]
  2834. buffer_skip_whitespace(input_buffer);
  2835. 800178e: 6838 ldr r0, [r7, #0]
  2836. 8001790: f7ff fdb6 bl 8001300 <buffer_skip_whitespace>
  2837. if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']'))
  2838. 8001794: 683b ldr r3, [r7, #0]
  2839. 8001796: 2b00 cmp r3, #0
  2840. 8001798: d00d beq.n 80017b6 <parse_array+0x6e>
  2841. 800179a: 683b ldr r3, [r7, #0]
  2842. 800179c: 689a ldr r2, [r3, #8]
  2843. 800179e: 683b ldr r3, [r7, #0]
  2844. 80017a0: 685b ldr r3, [r3, #4]
  2845. 80017a2: 429a cmp r2, r3
  2846. 80017a4: d207 bcs.n 80017b6 <parse_array+0x6e>
  2847. 80017a6: 683b ldr r3, [r7, #0]
  2848. 80017a8: 681a ldr r2, [r3, #0]
  2849. 80017aa: 683b ldr r3, [r7, #0]
  2850. 80017ac: 689b ldr r3, [r3, #8]
  2851. 80017ae: 4413 add r3, r2
  2852. 80017b0: 781b ldrb r3, [r3, #0]
  2853. 80017b2: 2b5d cmp r3, #93 @ 0x5d
  2854. 80017b4: d061 beq.n 800187a <parse_array+0x132>
  2855. /* empty array */
  2856. goto success;
  2857. }
  2858. /* check if we skipped to the end of the buffer */
  2859. if (cannot_access_at_index(input_buffer, 0))
  2860. 80017b6: 683b ldr r3, [r7, #0]
  2861. 80017b8: 2b00 cmp r3, #0
  2862. 80017ba: d005 beq.n 80017c8 <parse_array+0x80>
  2863. 80017bc: 683b ldr r3, [r7, #0]
  2864. 80017be: 689a ldr r2, [r3, #8]
  2865. 80017c0: 683b ldr r3, [r7, #0]
  2866. 80017c2: 685b ldr r3, [r3, #4]
  2867. 80017c4: 429a cmp r2, r3
  2868. 80017c6: d305 bcc.n 80017d4 <parse_array+0x8c>
  2869. {
  2870. input_buffer->offset--;
  2871. 80017c8: 683b ldr r3, [r7, #0]
  2872. 80017ca: 689b ldr r3, [r3, #8]
  2873. 80017cc: 1e5a subs r2, r3, #1
  2874. 80017ce: 683b ldr r3, [r7, #0]
  2875. 80017d0: 609a str r2, [r3, #8]
  2876. goto fail;
  2877. 80017d2: e072 b.n 80018ba <parse_array+0x172>
  2878. }
  2879. /* step back to character in front of the first element */
  2880. input_buffer->offset--;
  2881. 80017d4: 683b ldr r3, [r7, #0]
  2882. 80017d6: 689b ldr r3, [r3, #8]
  2883. 80017d8: 1e5a subs r2, r3, #1
  2884. 80017da: 683b ldr r3, [r7, #0]
  2885. 80017dc: 609a str r2, [r3, #8]
  2886. /* loop through the comma separated array elements */
  2887. do
  2888. {
  2889. /* allocate next item */
  2890. cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks));
  2891. 80017de: 683b ldr r3, [r7, #0]
  2892. 80017e0: 3310 adds r3, #16
  2893. 80017e2: 4618 mov r0, r3
  2894. 80017e4: f7ff f9bc bl 8000b60 <cJSON_New_Item>
  2895. 80017e8: 60f8 str r0, [r7, #12]
  2896. if (new_item == NULL)
  2897. 80017ea: 68fb ldr r3, [r7, #12]
  2898. 80017ec: 2b00 cmp r3, #0
  2899. 80017ee: d05f beq.n 80018b0 <parse_array+0x168>
  2900. {
  2901. goto fail; /* allocation failure */
  2902. }
  2903. /* attach next item to list */
  2904. if (head == NULL)
  2905. 80017f0: 697b ldr r3, [r7, #20]
  2906. 80017f2: 2b00 cmp r3, #0
  2907. 80017f4: d104 bne.n 8001800 <parse_array+0xb8>
  2908. {
  2909. /* start the linked list */
  2910. current_item = head = new_item;
  2911. 80017f6: 68fb ldr r3, [r7, #12]
  2912. 80017f8: 617b str r3, [r7, #20]
  2913. 80017fa: 697b ldr r3, [r7, #20]
  2914. 80017fc: 613b str r3, [r7, #16]
  2915. 80017fe: e007 b.n 8001810 <parse_array+0xc8>
  2916. }
  2917. else
  2918. {
  2919. /* add to the end and advance */
  2920. current_item->next = new_item;
  2921. 8001800: 693b ldr r3, [r7, #16]
  2922. 8001802: 68fa ldr r2, [r7, #12]
  2923. 8001804: 601a str r2, [r3, #0]
  2924. new_item->prev = current_item;
  2925. 8001806: 68fb ldr r3, [r7, #12]
  2926. 8001808: 693a ldr r2, [r7, #16]
  2927. 800180a: 605a str r2, [r3, #4]
  2928. current_item = new_item;
  2929. 800180c: 68fb ldr r3, [r7, #12]
  2930. 800180e: 613b str r3, [r7, #16]
  2931. }
  2932. /* parse next value */
  2933. input_buffer->offset++;
  2934. 8001810: 683b ldr r3, [r7, #0]
  2935. 8001812: 689b ldr r3, [r3, #8]
  2936. 8001814: 1c5a adds r2, r3, #1
  2937. 8001816: 683b ldr r3, [r7, #0]
  2938. 8001818: 609a str r2, [r3, #8]
  2939. buffer_skip_whitespace(input_buffer);
  2940. 800181a: 6838 ldr r0, [r7, #0]
  2941. 800181c: f7ff fd70 bl 8001300 <buffer_skip_whitespace>
  2942. if (!parse_value(current_item, input_buffer))
  2943. 8001820: 6839 ldr r1, [r7, #0]
  2944. 8001822: 6938 ldr r0, [r7, #16]
  2945. 8001824: f7ff fea4 bl 8001570 <parse_value>
  2946. 8001828: 4603 mov r3, r0
  2947. 800182a: 2b00 cmp r3, #0
  2948. 800182c: d042 beq.n 80018b4 <parse_array+0x16c>
  2949. {
  2950. goto fail; /* failed to parse value */
  2951. }
  2952. buffer_skip_whitespace(input_buffer);
  2953. 800182e: 6838 ldr r0, [r7, #0]
  2954. 8001830: f7ff fd66 bl 8001300 <buffer_skip_whitespace>
  2955. }
  2956. while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ','));
  2957. 8001834: 683b ldr r3, [r7, #0]
  2958. 8001836: 2b00 cmp r3, #0
  2959. 8001838: d00d beq.n 8001856 <parse_array+0x10e>
  2960. 800183a: 683b ldr r3, [r7, #0]
  2961. 800183c: 689a ldr r2, [r3, #8]
  2962. 800183e: 683b ldr r3, [r7, #0]
  2963. 8001840: 685b ldr r3, [r3, #4]
  2964. 8001842: 429a cmp r2, r3
  2965. 8001844: d207 bcs.n 8001856 <parse_array+0x10e>
  2966. 8001846: 683b ldr r3, [r7, #0]
  2967. 8001848: 681a ldr r2, [r3, #0]
  2968. 800184a: 683b ldr r3, [r7, #0]
  2969. 800184c: 689b ldr r3, [r3, #8]
  2970. 800184e: 4413 add r3, r2
  2971. 8001850: 781b ldrb r3, [r3, #0]
  2972. 8001852: 2b2c cmp r3, #44 @ 0x2c
  2973. 8001854: d0c3 beq.n 80017de <parse_array+0x96>
  2974. if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']')
  2975. 8001856: 683b ldr r3, [r7, #0]
  2976. 8001858: 2b00 cmp r3, #0
  2977. 800185a: d02d beq.n 80018b8 <parse_array+0x170>
  2978. 800185c: 683b ldr r3, [r7, #0]
  2979. 800185e: 689a ldr r2, [r3, #8]
  2980. 8001860: 683b ldr r3, [r7, #0]
  2981. 8001862: 685b ldr r3, [r3, #4]
  2982. 8001864: 429a cmp r2, r3
  2983. 8001866: d227 bcs.n 80018b8 <parse_array+0x170>
  2984. 8001868: 683b ldr r3, [r7, #0]
  2985. 800186a: 681a ldr r2, [r3, #0]
  2986. 800186c: 683b ldr r3, [r7, #0]
  2987. 800186e: 689b ldr r3, [r3, #8]
  2988. 8001870: 4413 add r3, r2
  2989. 8001872: 781b ldrb r3, [r3, #0]
  2990. 8001874: 2b5d cmp r3, #93 @ 0x5d
  2991. 8001876: d11f bne.n 80018b8 <parse_array+0x170>
  2992. {
  2993. goto fail; /* expected end of array */
  2994. }
  2995. success:
  2996. 8001878: e000 b.n 800187c <parse_array+0x134>
  2997. goto success;
  2998. 800187a: bf00 nop
  2999. input_buffer->depth--;
  3000. 800187c: 683b ldr r3, [r7, #0]
  3001. 800187e: 68db ldr r3, [r3, #12]
  3002. 8001880: 1e5a subs r2, r3, #1
  3003. 8001882: 683b ldr r3, [r7, #0]
  3004. 8001884: 60da str r2, [r3, #12]
  3005. if (head != NULL) {
  3006. 8001886: 697b ldr r3, [r7, #20]
  3007. 8001888: 2b00 cmp r3, #0
  3008. 800188a: d002 beq.n 8001892 <parse_array+0x14a>
  3009. head->prev = current_item;
  3010. 800188c: 697b ldr r3, [r7, #20]
  3011. 800188e: 693a ldr r2, [r7, #16]
  3012. 8001890: 605a str r2, [r3, #4]
  3013. }
  3014. item->type = cJSON_Array;
  3015. 8001892: 687b ldr r3, [r7, #4]
  3016. 8001894: 2220 movs r2, #32
  3017. 8001896: 60da str r2, [r3, #12]
  3018. item->child = head;
  3019. 8001898: 687b ldr r3, [r7, #4]
  3020. 800189a: 697a ldr r2, [r7, #20]
  3021. 800189c: 609a str r2, [r3, #8]
  3022. input_buffer->offset++;
  3023. 800189e: 683b ldr r3, [r7, #0]
  3024. 80018a0: 689b ldr r3, [r3, #8]
  3025. 80018a2: 1c5a adds r2, r3, #1
  3026. 80018a4: 683b ldr r3, [r7, #0]
  3027. 80018a6: 609a str r2, [r3, #8]
  3028. return true;
  3029. 80018a8: 2301 movs r3, #1
  3030. 80018aa: e00d b.n 80018c8 <parse_array+0x180>
  3031. goto fail;
  3032. 80018ac: bf00 nop
  3033. 80018ae: e004 b.n 80018ba <parse_array+0x172>
  3034. goto fail; /* allocation failure */
  3035. 80018b0: bf00 nop
  3036. 80018b2: e002 b.n 80018ba <parse_array+0x172>
  3037. goto fail; /* failed to parse value */
  3038. 80018b4: bf00 nop
  3039. 80018b6: e000 b.n 80018ba <parse_array+0x172>
  3040. goto fail; /* expected end of array */
  3041. 80018b8: bf00 nop
  3042. fail:
  3043. if (head != NULL)
  3044. 80018ba: 697b ldr r3, [r7, #20]
  3045. 80018bc: 2b00 cmp r3, #0
  3046. 80018be: d002 beq.n 80018c6 <parse_array+0x17e>
  3047. {
  3048. cJSON_Delete(head);
  3049. 80018c0: 6978 ldr r0, [r7, #20]
  3050. 80018c2: f7ff f963 bl 8000b8c <cJSON_Delete>
  3051. }
  3052. return false;
  3053. 80018c6: 2300 movs r3, #0
  3054. }
  3055. 80018c8: 4618 mov r0, r3
  3056. 80018ca: 3718 adds r7, #24
  3057. 80018cc: 46bd mov sp, r7
  3058. 80018ce: bd80 pop {r7, pc}
  3059. 080018d0 <parse_object>:
  3060. return true;
  3061. }
  3062. /* Build an object from the text. */
  3063. static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer)
  3064. {
  3065. 80018d0: b580 push {r7, lr}
  3066. 80018d2: b086 sub sp, #24
  3067. 80018d4: af00 add r7, sp, #0
  3068. 80018d6: 6078 str r0, [r7, #4]
  3069. 80018d8: 6039 str r1, [r7, #0]
  3070. cJSON *head = NULL; /* linked list head */
  3071. 80018da: 2300 movs r3, #0
  3072. 80018dc: 617b str r3, [r7, #20]
  3073. cJSON *current_item = NULL;
  3074. 80018de: 2300 movs r3, #0
  3075. 80018e0: 613b str r3, [r7, #16]
  3076. if (input_buffer->depth >= CJSON_NESTING_LIMIT)
  3077. 80018e2: 683b ldr r3, [r7, #0]
  3078. 80018e4: 68db ldr r3, [r3, #12]
  3079. 80018e6: f5b3 7f7a cmp.w r3, #1000 @ 0x3e8
  3080. 80018ea: d301 bcc.n 80018f0 <parse_object+0x20>
  3081. {
  3082. return false; /* to deeply nested */
  3083. 80018ec: 2300 movs r3, #0
  3084. 80018ee: e0f7 b.n 8001ae0 <parse_object+0x210>
  3085. }
  3086. input_buffer->depth++;
  3087. 80018f0: 683b ldr r3, [r7, #0]
  3088. 80018f2: 68db ldr r3, [r3, #12]
  3089. 80018f4: 1c5a adds r2, r3, #1
  3090. 80018f6: 683b ldr r3, [r7, #0]
  3091. 80018f8: 60da str r2, [r3, #12]
  3092. if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{'))
  3093. 80018fa: 683b ldr r3, [r7, #0]
  3094. 80018fc: 2b00 cmp r3, #0
  3095. 80018fe: f000 80db beq.w 8001ab8 <parse_object+0x1e8>
  3096. 8001902: 683b ldr r3, [r7, #0]
  3097. 8001904: 689a ldr r2, [r3, #8]
  3098. 8001906: 683b ldr r3, [r7, #0]
  3099. 8001908: 685b ldr r3, [r3, #4]
  3100. 800190a: 429a cmp r2, r3
  3101. 800190c: f080 80d4 bcs.w 8001ab8 <parse_object+0x1e8>
  3102. 8001910: 683b ldr r3, [r7, #0]
  3103. 8001912: 681a ldr r2, [r3, #0]
  3104. 8001914: 683b ldr r3, [r7, #0]
  3105. 8001916: 689b ldr r3, [r3, #8]
  3106. 8001918: 4413 add r3, r2
  3107. 800191a: 781b ldrb r3, [r3, #0]
  3108. 800191c: 2b7b cmp r3, #123 @ 0x7b
  3109. 800191e: f040 80cb bne.w 8001ab8 <parse_object+0x1e8>
  3110. {
  3111. goto fail; /* not an object */
  3112. }
  3113. input_buffer->offset++;
  3114. 8001922: 683b ldr r3, [r7, #0]
  3115. 8001924: 689b ldr r3, [r3, #8]
  3116. 8001926: 1c5a adds r2, r3, #1
  3117. 8001928: 683b ldr r3, [r7, #0]
  3118. 800192a: 609a str r2, [r3, #8]
  3119. buffer_skip_whitespace(input_buffer);
  3120. 800192c: 6838 ldr r0, [r7, #0]
  3121. 800192e: f7ff fce7 bl 8001300 <buffer_skip_whitespace>
  3122. if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}'))
  3123. 8001932: 683b ldr r3, [r7, #0]
  3124. 8001934: 2b00 cmp r3, #0
  3125. 8001936: d00e beq.n 8001956 <parse_object+0x86>
  3126. 8001938: 683b ldr r3, [r7, #0]
  3127. 800193a: 689a ldr r2, [r3, #8]
  3128. 800193c: 683b ldr r3, [r7, #0]
  3129. 800193e: 685b ldr r3, [r3, #4]
  3130. 8001940: 429a cmp r2, r3
  3131. 8001942: d208 bcs.n 8001956 <parse_object+0x86>
  3132. 8001944: 683b ldr r3, [r7, #0]
  3133. 8001946: 681a ldr r2, [r3, #0]
  3134. 8001948: 683b ldr r3, [r7, #0]
  3135. 800194a: 689b ldr r3, [r3, #8]
  3136. 800194c: 4413 add r3, r2
  3137. 800194e: 781b ldrb r3, [r3, #0]
  3138. 8001950: 2b7d cmp r3, #125 @ 0x7d
  3139. 8001952: f000 8098 beq.w 8001a86 <parse_object+0x1b6>
  3140. {
  3141. goto success; /* empty object */
  3142. }
  3143. /* check if we skipped to the end of the buffer */
  3144. if (cannot_access_at_index(input_buffer, 0))
  3145. 8001956: 683b ldr r3, [r7, #0]
  3146. 8001958: 2b00 cmp r3, #0
  3147. 800195a: d005 beq.n 8001968 <parse_object+0x98>
  3148. 800195c: 683b ldr r3, [r7, #0]
  3149. 800195e: 689a ldr r2, [r3, #8]
  3150. 8001960: 683b ldr r3, [r7, #0]
  3151. 8001962: 685b ldr r3, [r3, #4]
  3152. 8001964: 429a cmp r2, r3
  3153. 8001966: d305 bcc.n 8001974 <parse_object+0xa4>
  3154. {
  3155. input_buffer->offset--;
  3156. 8001968: 683b ldr r3, [r7, #0]
  3157. 800196a: 689b ldr r3, [r3, #8]
  3158. 800196c: 1e5a subs r2, r3, #1
  3159. 800196e: 683b ldr r3, [r7, #0]
  3160. 8001970: 609a str r2, [r3, #8]
  3161. goto fail;
  3162. 8001972: e0ae b.n 8001ad2 <parse_object+0x202>
  3163. }
  3164. /* step back to character in front of the first element */
  3165. input_buffer->offset--;
  3166. 8001974: 683b ldr r3, [r7, #0]
  3167. 8001976: 689b ldr r3, [r3, #8]
  3168. 8001978: 1e5a subs r2, r3, #1
  3169. 800197a: 683b ldr r3, [r7, #0]
  3170. 800197c: 609a str r2, [r3, #8]
  3171. /* loop through the comma separated array elements */
  3172. do
  3173. {
  3174. /* allocate next item */
  3175. cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks));
  3176. 800197e: 683b ldr r3, [r7, #0]
  3177. 8001980: 3310 adds r3, #16
  3178. 8001982: 4618 mov r0, r3
  3179. 8001984: f7ff f8ec bl 8000b60 <cJSON_New_Item>
  3180. 8001988: 60f8 str r0, [r7, #12]
  3181. if (new_item == NULL)
  3182. 800198a: 68fb ldr r3, [r7, #12]
  3183. 800198c: 2b00 cmp r3, #0
  3184. 800198e: f000 8095 beq.w 8001abc <parse_object+0x1ec>
  3185. {
  3186. goto fail; /* allocation failure */
  3187. }
  3188. /* attach next item to list */
  3189. if (head == NULL)
  3190. 8001992: 697b ldr r3, [r7, #20]
  3191. 8001994: 2b00 cmp r3, #0
  3192. 8001996: d104 bne.n 80019a2 <parse_object+0xd2>
  3193. {
  3194. /* start the linked list */
  3195. current_item = head = new_item;
  3196. 8001998: 68fb ldr r3, [r7, #12]
  3197. 800199a: 617b str r3, [r7, #20]
  3198. 800199c: 697b ldr r3, [r7, #20]
  3199. 800199e: 613b str r3, [r7, #16]
  3200. 80019a0: e007 b.n 80019b2 <parse_object+0xe2>
  3201. }
  3202. else
  3203. {
  3204. /* add to the end and advance */
  3205. current_item->next = new_item;
  3206. 80019a2: 693b ldr r3, [r7, #16]
  3207. 80019a4: 68fa ldr r2, [r7, #12]
  3208. 80019a6: 601a str r2, [r3, #0]
  3209. new_item->prev = current_item;
  3210. 80019a8: 68fb ldr r3, [r7, #12]
  3211. 80019aa: 693a ldr r2, [r7, #16]
  3212. 80019ac: 605a str r2, [r3, #4]
  3213. current_item = new_item;
  3214. 80019ae: 68fb ldr r3, [r7, #12]
  3215. 80019b0: 613b str r3, [r7, #16]
  3216. }
  3217. if (cannot_access_at_index(input_buffer, 1))
  3218. 80019b2: 683b ldr r3, [r7, #0]
  3219. 80019b4: 2b00 cmp r3, #0
  3220. 80019b6: f000 8083 beq.w 8001ac0 <parse_object+0x1f0>
  3221. 80019ba: 683b ldr r3, [r7, #0]
  3222. 80019bc: 689b ldr r3, [r3, #8]
  3223. 80019be: 1c5a adds r2, r3, #1
  3224. 80019c0: 683b ldr r3, [r7, #0]
  3225. 80019c2: 685b ldr r3, [r3, #4]
  3226. 80019c4: 429a cmp r2, r3
  3227. 80019c6: d27b bcs.n 8001ac0 <parse_object+0x1f0>
  3228. {
  3229. goto fail; /* nothing comes after the comma */
  3230. }
  3231. /* parse the name of the child */
  3232. input_buffer->offset++;
  3233. 80019c8: 683b ldr r3, [r7, #0]
  3234. 80019ca: 689b ldr r3, [r3, #8]
  3235. 80019cc: 1c5a adds r2, r3, #1
  3236. 80019ce: 683b ldr r3, [r7, #0]
  3237. 80019d0: 609a str r2, [r3, #8]
  3238. buffer_skip_whitespace(input_buffer);
  3239. 80019d2: 6838 ldr r0, [r7, #0]
  3240. 80019d4: f7ff fc94 bl 8001300 <buffer_skip_whitespace>
  3241. if (!parse_string(current_item, input_buffer))
  3242. 80019d8: 6839 ldr r1, [r7, #0]
  3243. 80019da: 6938 ldr r0, [r7, #16]
  3244. 80019dc: f7ff fb48 bl 8001070 <parse_string>
  3245. 80019e0: 4603 mov r3, r0
  3246. 80019e2: 2b00 cmp r3, #0
  3247. 80019e4: d06e beq.n 8001ac4 <parse_object+0x1f4>
  3248. {
  3249. goto fail; /* failed to parse name */
  3250. }
  3251. buffer_skip_whitespace(input_buffer);
  3252. 80019e6: 6838 ldr r0, [r7, #0]
  3253. 80019e8: f7ff fc8a bl 8001300 <buffer_skip_whitespace>
  3254. /* swap valuestring and string, because we parsed the name */
  3255. current_item->string = current_item->valuestring;
  3256. 80019ec: 693b ldr r3, [r7, #16]
  3257. 80019ee: 691a ldr r2, [r3, #16]
  3258. 80019f0: 693b ldr r3, [r7, #16]
  3259. 80019f2: 621a str r2, [r3, #32]
  3260. current_item->valuestring = NULL;
  3261. 80019f4: 693b ldr r3, [r7, #16]
  3262. 80019f6: 2200 movs r2, #0
  3263. 80019f8: 611a str r2, [r3, #16]
  3264. if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':'))
  3265. 80019fa: 683b ldr r3, [r7, #0]
  3266. 80019fc: 2b00 cmp r3, #0
  3267. 80019fe: d063 beq.n 8001ac8 <parse_object+0x1f8>
  3268. 8001a00: 683b ldr r3, [r7, #0]
  3269. 8001a02: 689a ldr r2, [r3, #8]
  3270. 8001a04: 683b ldr r3, [r7, #0]
  3271. 8001a06: 685b ldr r3, [r3, #4]
  3272. 8001a08: 429a cmp r2, r3
  3273. 8001a0a: d25d bcs.n 8001ac8 <parse_object+0x1f8>
  3274. 8001a0c: 683b ldr r3, [r7, #0]
  3275. 8001a0e: 681a ldr r2, [r3, #0]
  3276. 8001a10: 683b ldr r3, [r7, #0]
  3277. 8001a12: 689b ldr r3, [r3, #8]
  3278. 8001a14: 4413 add r3, r2
  3279. 8001a16: 781b ldrb r3, [r3, #0]
  3280. 8001a18: 2b3a cmp r3, #58 @ 0x3a
  3281. 8001a1a: d155 bne.n 8001ac8 <parse_object+0x1f8>
  3282. {
  3283. goto fail; /* invalid object */
  3284. }
  3285. /* parse the value */
  3286. input_buffer->offset++;
  3287. 8001a1c: 683b ldr r3, [r7, #0]
  3288. 8001a1e: 689b ldr r3, [r3, #8]
  3289. 8001a20: 1c5a adds r2, r3, #1
  3290. 8001a22: 683b ldr r3, [r7, #0]
  3291. 8001a24: 609a str r2, [r3, #8]
  3292. buffer_skip_whitespace(input_buffer);
  3293. 8001a26: 6838 ldr r0, [r7, #0]
  3294. 8001a28: f7ff fc6a bl 8001300 <buffer_skip_whitespace>
  3295. if (!parse_value(current_item, input_buffer))
  3296. 8001a2c: 6839 ldr r1, [r7, #0]
  3297. 8001a2e: 6938 ldr r0, [r7, #16]
  3298. 8001a30: f7ff fd9e bl 8001570 <parse_value>
  3299. 8001a34: 4603 mov r3, r0
  3300. 8001a36: 2b00 cmp r3, #0
  3301. 8001a38: d048 beq.n 8001acc <parse_object+0x1fc>
  3302. {
  3303. goto fail; /* failed to parse value */
  3304. }
  3305. buffer_skip_whitespace(input_buffer);
  3306. 8001a3a: 6838 ldr r0, [r7, #0]
  3307. 8001a3c: f7ff fc60 bl 8001300 <buffer_skip_whitespace>
  3308. }
  3309. while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ','));
  3310. 8001a40: 683b ldr r3, [r7, #0]
  3311. 8001a42: 2b00 cmp r3, #0
  3312. 8001a44: d00d beq.n 8001a62 <parse_object+0x192>
  3313. 8001a46: 683b ldr r3, [r7, #0]
  3314. 8001a48: 689a ldr r2, [r3, #8]
  3315. 8001a4a: 683b ldr r3, [r7, #0]
  3316. 8001a4c: 685b ldr r3, [r3, #4]
  3317. 8001a4e: 429a cmp r2, r3
  3318. 8001a50: d207 bcs.n 8001a62 <parse_object+0x192>
  3319. 8001a52: 683b ldr r3, [r7, #0]
  3320. 8001a54: 681a ldr r2, [r3, #0]
  3321. 8001a56: 683b ldr r3, [r7, #0]
  3322. 8001a58: 689b ldr r3, [r3, #8]
  3323. 8001a5a: 4413 add r3, r2
  3324. 8001a5c: 781b ldrb r3, [r3, #0]
  3325. 8001a5e: 2b2c cmp r3, #44 @ 0x2c
  3326. 8001a60: d08d beq.n 800197e <parse_object+0xae>
  3327. if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}'))
  3328. 8001a62: 683b ldr r3, [r7, #0]
  3329. 8001a64: 2b00 cmp r3, #0
  3330. 8001a66: d033 beq.n 8001ad0 <parse_object+0x200>
  3331. 8001a68: 683b ldr r3, [r7, #0]
  3332. 8001a6a: 689a ldr r2, [r3, #8]
  3333. 8001a6c: 683b ldr r3, [r7, #0]
  3334. 8001a6e: 685b ldr r3, [r3, #4]
  3335. 8001a70: 429a cmp r2, r3
  3336. 8001a72: d22d bcs.n 8001ad0 <parse_object+0x200>
  3337. 8001a74: 683b ldr r3, [r7, #0]
  3338. 8001a76: 681a ldr r2, [r3, #0]
  3339. 8001a78: 683b ldr r3, [r7, #0]
  3340. 8001a7a: 689b ldr r3, [r3, #8]
  3341. 8001a7c: 4413 add r3, r2
  3342. 8001a7e: 781b ldrb r3, [r3, #0]
  3343. 8001a80: 2b7d cmp r3, #125 @ 0x7d
  3344. 8001a82: d125 bne.n 8001ad0 <parse_object+0x200>
  3345. {
  3346. goto fail; /* expected end of object */
  3347. }
  3348. success:
  3349. 8001a84: e000 b.n 8001a88 <parse_object+0x1b8>
  3350. goto success; /* empty object */
  3351. 8001a86: bf00 nop
  3352. input_buffer->depth--;
  3353. 8001a88: 683b ldr r3, [r7, #0]
  3354. 8001a8a: 68db ldr r3, [r3, #12]
  3355. 8001a8c: 1e5a subs r2, r3, #1
  3356. 8001a8e: 683b ldr r3, [r7, #0]
  3357. 8001a90: 60da str r2, [r3, #12]
  3358. if (head != NULL) {
  3359. 8001a92: 697b ldr r3, [r7, #20]
  3360. 8001a94: 2b00 cmp r3, #0
  3361. 8001a96: d002 beq.n 8001a9e <parse_object+0x1ce>
  3362. head->prev = current_item;
  3363. 8001a98: 697b ldr r3, [r7, #20]
  3364. 8001a9a: 693a ldr r2, [r7, #16]
  3365. 8001a9c: 605a str r2, [r3, #4]
  3366. }
  3367. item->type = cJSON_Object;
  3368. 8001a9e: 687b ldr r3, [r7, #4]
  3369. 8001aa0: 2240 movs r2, #64 @ 0x40
  3370. 8001aa2: 60da str r2, [r3, #12]
  3371. item->child = head;
  3372. 8001aa4: 687b ldr r3, [r7, #4]
  3373. 8001aa6: 697a ldr r2, [r7, #20]
  3374. 8001aa8: 609a str r2, [r3, #8]
  3375. input_buffer->offset++;
  3376. 8001aaa: 683b ldr r3, [r7, #0]
  3377. 8001aac: 689b ldr r3, [r3, #8]
  3378. 8001aae: 1c5a adds r2, r3, #1
  3379. 8001ab0: 683b ldr r3, [r7, #0]
  3380. 8001ab2: 609a str r2, [r3, #8]
  3381. return true;
  3382. 8001ab4: 2301 movs r3, #1
  3383. 8001ab6: e013 b.n 8001ae0 <parse_object+0x210>
  3384. goto fail; /* not an object */
  3385. 8001ab8: bf00 nop
  3386. 8001aba: e00a b.n 8001ad2 <parse_object+0x202>
  3387. goto fail; /* allocation failure */
  3388. 8001abc: bf00 nop
  3389. 8001abe: e008 b.n 8001ad2 <parse_object+0x202>
  3390. goto fail; /* nothing comes after the comma */
  3391. 8001ac0: bf00 nop
  3392. 8001ac2: e006 b.n 8001ad2 <parse_object+0x202>
  3393. goto fail; /* failed to parse name */
  3394. 8001ac4: bf00 nop
  3395. 8001ac6: e004 b.n 8001ad2 <parse_object+0x202>
  3396. goto fail; /* invalid object */
  3397. 8001ac8: bf00 nop
  3398. 8001aca: e002 b.n 8001ad2 <parse_object+0x202>
  3399. goto fail; /* failed to parse value */
  3400. 8001acc: bf00 nop
  3401. 8001ace: e000 b.n 8001ad2 <parse_object+0x202>
  3402. goto fail; /* expected end of object */
  3403. 8001ad0: bf00 nop
  3404. fail:
  3405. if (head != NULL)
  3406. 8001ad2: 697b ldr r3, [r7, #20]
  3407. 8001ad4: 2b00 cmp r3, #0
  3408. 8001ad6: d002 beq.n 8001ade <parse_object+0x20e>
  3409. {
  3410. cJSON_Delete(head);
  3411. 8001ad8: 6978 ldr r0, [r7, #20]
  3412. 8001ada: f7ff f857 bl 8000b8c <cJSON_Delete>
  3413. }
  3414. return false;
  3415. 8001ade: 2300 movs r3, #0
  3416. }
  3417. 8001ae0: 4618 mov r0, r3
  3418. 8001ae2: 3718 adds r7, #24
  3419. 8001ae4: 46bd mov sp, r7
  3420. 8001ae6: bd80 pop {r7, pc}
  3421. 08001ae8 <cJSON_GetArraySize>:
  3422. return true;
  3423. }
  3424. /* Get Array size/item / object item. */
  3425. CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array)
  3426. {
  3427. 8001ae8: b480 push {r7}
  3428. 8001aea: b085 sub sp, #20
  3429. 8001aec: af00 add r7, sp, #0
  3430. 8001aee: 6078 str r0, [r7, #4]
  3431. cJSON *child = NULL;
  3432. 8001af0: 2300 movs r3, #0
  3433. 8001af2: 60fb str r3, [r7, #12]
  3434. size_t size = 0;
  3435. 8001af4: 2300 movs r3, #0
  3436. 8001af6: 60bb str r3, [r7, #8]
  3437. if (array == NULL)
  3438. 8001af8: 687b ldr r3, [r7, #4]
  3439. 8001afa: 2b00 cmp r3, #0
  3440. 8001afc: d101 bne.n 8001b02 <cJSON_GetArraySize+0x1a>
  3441. {
  3442. return 0;
  3443. 8001afe: 2300 movs r3, #0
  3444. 8001b00: e00d b.n 8001b1e <cJSON_GetArraySize+0x36>
  3445. }
  3446. child = array->child;
  3447. 8001b02: 687b ldr r3, [r7, #4]
  3448. 8001b04: 689b ldr r3, [r3, #8]
  3449. 8001b06: 60fb str r3, [r7, #12]
  3450. while(child != NULL)
  3451. 8001b08: e005 b.n 8001b16 <cJSON_GetArraySize+0x2e>
  3452. {
  3453. size++;
  3454. 8001b0a: 68bb ldr r3, [r7, #8]
  3455. 8001b0c: 3301 adds r3, #1
  3456. 8001b0e: 60bb str r3, [r7, #8]
  3457. child = child->next;
  3458. 8001b10: 68fb ldr r3, [r7, #12]
  3459. 8001b12: 681b ldr r3, [r3, #0]
  3460. 8001b14: 60fb str r3, [r7, #12]
  3461. while(child != NULL)
  3462. 8001b16: 68fb ldr r3, [r7, #12]
  3463. 8001b18: 2b00 cmp r3, #0
  3464. 8001b1a: d1f6 bne.n 8001b0a <cJSON_GetArraySize+0x22>
  3465. }
  3466. /* FIXME: Can overflow here. Cannot be fixed without breaking the API */
  3467. return (int)size;
  3468. 8001b1c: 68bb ldr r3, [r7, #8]
  3469. }
  3470. 8001b1e: 4618 mov r0, r3
  3471. 8001b20: 3714 adds r7, #20
  3472. 8001b22: 46bd mov sp, r7
  3473. 8001b24: f85d 7b04 ldr.w r7, [sp], #4
  3474. 8001b28: 4770 bx lr
  3475. 08001b2a <get_array_item>:
  3476. static cJSON* get_array_item(const cJSON *array, size_t index)
  3477. {
  3478. 8001b2a: b480 push {r7}
  3479. 8001b2c: b085 sub sp, #20
  3480. 8001b2e: af00 add r7, sp, #0
  3481. 8001b30: 6078 str r0, [r7, #4]
  3482. 8001b32: 6039 str r1, [r7, #0]
  3483. cJSON *current_child = NULL;
  3484. 8001b34: 2300 movs r3, #0
  3485. 8001b36: 60fb str r3, [r7, #12]
  3486. if (array == NULL)
  3487. 8001b38: 687b ldr r3, [r7, #4]
  3488. 8001b3a: 2b00 cmp r3, #0
  3489. 8001b3c: d101 bne.n 8001b42 <get_array_item+0x18>
  3490. {
  3491. return NULL;
  3492. 8001b3e: 2300 movs r3, #0
  3493. 8001b40: e010 b.n 8001b64 <get_array_item+0x3a>
  3494. }
  3495. current_child = array->child;
  3496. 8001b42: 687b ldr r3, [r7, #4]
  3497. 8001b44: 689b ldr r3, [r3, #8]
  3498. 8001b46: 60fb str r3, [r7, #12]
  3499. while ((current_child != NULL) && (index > 0))
  3500. 8001b48: e005 b.n 8001b56 <get_array_item+0x2c>
  3501. {
  3502. index--;
  3503. 8001b4a: 683b ldr r3, [r7, #0]
  3504. 8001b4c: 3b01 subs r3, #1
  3505. 8001b4e: 603b str r3, [r7, #0]
  3506. current_child = current_child->next;
  3507. 8001b50: 68fb ldr r3, [r7, #12]
  3508. 8001b52: 681b ldr r3, [r3, #0]
  3509. 8001b54: 60fb str r3, [r7, #12]
  3510. while ((current_child != NULL) && (index > 0))
  3511. 8001b56: 68fb ldr r3, [r7, #12]
  3512. 8001b58: 2b00 cmp r3, #0
  3513. 8001b5a: d002 beq.n 8001b62 <get_array_item+0x38>
  3514. 8001b5c: 683b ldr r3, [r7, #0]
  3515. 8001b5e: 2b00 cmp r3, #0
  3516. 8001b60: d1f3 bne.n 8001b4a <get_array_item+0x20>
  3517. }
  3518. return current_child;
  3519. 8001b62: 68fb ldr r3, [r7, #12]
  3520. }
  3521. 8001b64: 4618 mov r0, r3
  3522. 8001b66: 3714 adds r7, #20
  3523. 8001b68: 46bd mov sp, r7
  3524. 8001b6a: f85d 7b04 ldr.w r7, [sp], #4
  3525. 8001b6e: 4770 bx lr
  3526. 08001b70 <cJSON_GetArrayItem>:
  3527. CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index)
  3528. {
  3529. 8001b70: b580 push {r7, lr}
  3530. 8001b72: b082 sub sp, #8
  3531. 8001b74: af00 add r7, sp, #0
  3532. 8001b76: 6078 str r0, [r7, #4]
  3533. 8001b78: 6039 str r1, [r7, #0]
  3534. if (index < 0)
  3535. 8001b7a: 683b ldr r3, [r7, #0]
  3536. 8001b7c: 2b00 cmp r3, #0
  3537. 8001b7e: da01 bge.n 8001b84 <cJSON_GetArrayItem+0x14>
  3538. {
  3539. return NULL;
  3540. 8001b80: 2300 movs r3, #0
  3541. 8001b82: e005 b.n 8001b90 <cJSON_GetArrayItem+0x20>
  3542. }
  3543. return get_array_item(array, (size_t)index);
  3544. 8001b84: 683b ldr r3, [r7, #0]
  3545. 8001b86: 4619 mov r1, r3
  3546. 8001b88: 6878 ldr r0, [r7, #4]
  3547. 8001b8a: f7ff ffce bl 8001b2a <get_array_item>
  3548. 8001b8e: 4603 mov r3, r0
  3549. }
  3550. 8001b90: 4618 mov r0, r3
  3551. 8001b92: 3708 adds r7, #8
  3552. 8001b94: 46bd mov sp, r7
  3553. 8001b96: bd80 pop {r7, pc}
  3554. 08001b98 <get_object_item>:
  3555. static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive)
  3556. {
  3557. 8001b98: b580 push {r7, lr}
  3558. 8001b9a: b086 sub sp, #24
  3559. 8001b9c: af00 add r7, sp, #0
  3560. 8001b9e: 60f8 str r0, [r7, #12]
  3561. 8001ba0: 60b9 str r1, [r7, #8]
  3562. 8001ba2: 607a str r2, [r7, #4]
  3563. cJSON *current_element = NULL;
  3564. 8001ba4: 2300 movs r3, #0
  3565. 8001ba6: 617b str r3, [r7, #20]
  3566. if ((object == NULL) || (name == NULL))
  3567. 8001ba8: 68fb ldr r3, [r7, #12]
  3568. 8001baa: 2b00 cmp r3, #0
  3569. 8001bac: d002 beq.n 8001bb4 <get_object_item+0x1c>
  3570. 8001bae: 68bb ldr r3, [r7, #8]
  3571. 8001bb0: 2b00 cmp r3, #0
  3572. 8001bb2: d101 bne.n 8001bb8 <get_object_item+0x20>
  3573. {
  3574. return NULL;
  3575. 8001bb4: 2300 movs r3, #0
  3576. 8001bb6: e033 b.n 8001c20 <get_object_item+0x88>
  3577. }
  3578. current_element = object->child;
  3579. 8001bb8: 68fb ldr r3, [r7, #12]
  3580. 8001bba: 689b ldr r3, [r3, #8]
  3581. 8001bbc: 617b str r3, [r7, #20]
  3582. if (case_sensitive)
  3583. 8001bbe: 687b ldr r3, [r7, #4]
  3584. 8001bc0: 2b00 cmp r3, #0
  3585. 8001bc2: d017 beq.n 8001bf4 <get_object_item+0x5c>
  3586. {
  3587. while ((current_element != NULL) && (current_element->string != NULL) && (strcmp(name, current_element->string) != 0))
  3588. 8001bc4: e002 b.n 8001bcc <get_object_item+0x34>
  3589. {
  3590. current_element = current_element->next;
  3591. 8001bc6: 697b ldr r3, [r7, #20]
  3592. 8001bc8: 681b ldr r3, [r3, #0]
  3593. 8001bca: 617b str r3, [r7, #20]
  3594. while ((current_element != NULL) && (current_element->string != NULL) && (strcmp(name, current_element->string) != 0))
  3595. 8001bcc: 697b ldr r3, [r7, #20]
  3596. 8001bce: 2b00 cmp r3, #0
  3597. 8001bd0: d01c beq.n 8001c0c <get_object_item+0x74>
  3598. 8001bd2: 697b ldr r3, [r7, #20]
  3599. 8001bd4: 6a1b ldr r3, [r3, #32]
  3600. 8001bd6: 2b00 cmp r3, #0
  3601. 8001bd8: d018 beq.n 8001c0c <get_object_item+0x74>
  3602. 8001bda: 697b ldr r3, [r7, #20]
  3603. 8001bdc: 6a1b ldr r3, [r3, #32]
  3604. 8001bde: 4619 mov r1, r3
  3605. 8001be0: 68b8 ldr r0, [r7, #8]
  3606. 8001be2: f7fe fb7d bl 80002e0 <strcmp>
  3607. 8001be6: 4603 mov r3, r0
  3608. 8001be8: 2b00 cmp r3, #0
  3609. 8001bea: d1ec bne.n 8001bc6 <get_object_item+0x2e>
  3610. 8001bec: e00e b.n 8001c0c <get_object_item+0x74>
  3611. }
  3612. else
  3613. {
  3614. while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0))
  3615. {
  3616. current_element = current_element->next;
  3617. 8001bee: 697b ldr r3, [r7, #20]
  3618. 8001bf0: 681b ldr r3, [r3, #0]
  3619. 8001bf2: 617b str r3, [r7, #20]
  3620. while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0))
  3621. 8001bf4: 697b ldr r3, [r7, #20]
  3622. 8001bf6: 2b00 cmp r3, #0
  3623. 8001bf8: d008 beq.n 8001c0c <get_object_item+0x74>
  3624. 8001bfa: 697b ldr r3, [r7, #20]
  3625. 8001bfc: 6a1b ldr r3, [r3, #32]
  3626. 8001bfe: 4619 mov r1, r3
  3627. 8001c00: 68b8 ldr r0, [r7, #8]
  3628. 8001c02: f7fe ff41 bl 8000a88 <case_insensitive_strcmp>
  3629. 8001c06: 4603 mov r3, r0
  3630. 8001c08: 2b00 cmp r3, #0
  3631. 8001c0a: d1f0 bne.n 8001bee <get_object_item+0x56>
  3632. }
  3633. }
  3634. if ((current_element == NULL) || (current_element->string == NULL)) {
  3635. 8001c0c: 697b ldr r3, [r7, #20]
  3636. 8001c0e: 2b00 cmp r3, #0
  3637. 8001c10: d003 beq.n 8001c1a <get_object_item+0x82>
  3638. 8001c12: 697b ldr r3, [r7, #20]
  3639. 8001c14: 6a1b ldr r3, [r3, #32]
  3640. 8001c16: 2b00 cmp r3, #0
  3641. 8001c18: d101 bne.n 8001c1e <get_object_item+0x86>
  3642. return NULL;
  3643. 8001c1a: 2300 movs r3, #0
  3644. 8001c1c: e000 b.n 8001c20 <get_object_item+0x88>
  3645. }
  3646. return current_element;
  3647. 8001c1e: 697b ldr r3, [r7, #20]
  3648. }
  3649. 8001c20: 4618 mov r0, r3
  3650. 8001c22: 3718 adds r7, #24
  3651. 8001c24: 46bd mov sp, r7
  3652. 8001c26: bd80 pop {r7, pc}
  3653. 08001c28 <cJSON_GetObjectItemCaseSensitive>:
  3654. {
  3655. return get_object_item(object, string, false);
  3656. }
  3657. CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string)
  3658. {
  3659. 8001c28: b580 push {r7, lr}
  3660. 8001c2a: b082 sub sp, #8
  3661. 8001c2c: af00 add r7, sp, #0
  3662. 8001c2e: 6078 str r0, [r7, #4]
  3663. 8001c30: 6039 str r1, [r7, #0]
  3664. return get_object_item(object, string, true);
  3665. 8001c32: 2201 movs r2, #1
  3666. 8001c34: 6839 ldr r1, [r7, #0]
  3667. 8001c36: 6878 ldr r0, [r7, #4]
  3668. 8001c38: f7ff ffae bl 8001b98 <get_object_item>
  3669. 8001c3c: 4603 mov r3, r0
  3670. }
  3671. 8001c3e: 4618 mov r0, r3
  3672. 8001c40: 3708 adds r7, #8
  3673. 8001c42: 46bd mov sp, r7
  3674. 8001c44: bd80 pop {r7, pc}
  3675. 08001c46 <cJSON_IsNumber>:
  3676. return (item->type & 0xFF) == cJSON_NULL;
  3677. }
  3678. CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item)
  3679. {
  3680. 8001c46: b480 push {r7}
  3681. 8001c48: b083 sub sp, #12
  3682. 8001c4a: af00 add r7, sp, #0
  3683. 8001c4c: 6078 str r0, [r7, #4]
  3684. if (item == NULL)
  3685. 8001c4e: 687b ldr r3, [r7, #4]
  3686. 8001c50: 2b00 cmp r3, #0
  3687. 8001c52: d101 bne.n 8001c58 <cJSON_IsNumber+0x12>
  3688. {
  3689. return false;
  3690. 8001c54: 2300 movs r3, #0
  3691. 8001c56: e007 b.n 8001c68 <cJSON_IsNumber+0x22>
  3692. }
  3693. return (item->type & 0xFF) == cJSON_Number;
  3694. 8001c58: 687b ldr r3, [r7, #4]
  3695. 8001c5a: 68db ldr r3, [r3, #12]
  3696. 8001c5c: b2db uxtb r3, r3
  3697. 8001c5e: 2b08 cmp r3, #8
  3698. 8001c60: bf0c ite eq
  3699. 8001c62: 2301 moveq r3, #1
  3700. 8001c64: 2300 movne r3, #0
  3701. 8001c66: b2db uxtb r3, r3
  3702. }
  3703. 8001c68: 4618 mov r0, r3
  3704. 8001c6a: 370c adds r7, #12
  3705. 8001c6c: 46bd mov sp, r7
  3706. 8001c6e: f85d 7b04 ldr.w r7, [sp], #4
  3707. 8001c72: 4770 bx lr
  3708. 08001c74 <cJSON_IsArray>:
  3709. return (item->type & 0xFF) == cJSON_String;
  3710. }
  3711. CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item)
  3712. {
  3713. 8001c74: b480 push {r7}
  3714. 8001c76: b083 sub sp, #12
  3715. 8001c78: af00 add r7, sp, #0
  3716. 8001c7a: 6078 str r0, [r7, #4]
  3717. if (item == NULL)
  3718. 8001c7c: 687b ldr r3, [r7, #4]
  3719. 8001c7e: 2b00 cmp r3, #0
  3720. 8001c80: d101 bne.n 8001c86 <cJSON_IsArray+0x12>
  3721. {
  3722. return false;
  3723. 8001c82: 2300 movs r3, #0
  3724. 8001c84: e007 b.n 8001c96 <cJSON_IsArray+0x22>
  3725. }
  3726. return (item->type & 0xFF) == cJSON_Array;
  3727. 8001c86: 687b ldr r3, [r7, #4]
  3728. 8001c88: 68db ldr r3, [r3, #12]
  3729. 8001c8a: b2db uxtb r3, r3
  3730. 8001c8c: 2b20 cmp r3, #32
  3731. 8001c8e: bf0c ite eq
  3732. 8001c90: 2301 moveq r3, #1
  3733. 8001c92: 2300 movne r3, #0
  3734. 8001c94: b2db uxtb r3, r3
  3735. }
  3736. 8001c96: 4618 mov r0, r3
  3737. 8001c98: 370c adds r7, #12
  3738. 8001c9a: 46bd mov sp, r7
  3739. 8001c9c: f85d 7b04 ldr.w r7, [sp], #4
  3740. 8001ca0: 4770 bx lr
  3741. 08001ca2 <vApplicationStackOverflowHook>:
  3742. /* Hook prototypes */
  3743. void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName);
  3744. /* USER CODE BEGIN 4 */
  3745. void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)
  3746. {
  3747. 8001ca2: b480 push {r7}
  3748. 8001ca4: b083 sub sp, #12
  3749. 8001ca6: af00 add r7, sp, #0
  3750. 8001ca8: 6078 str r0, [r7, #4]
  3751. 8001caa: 6039 str r1, [r7, #0]
  3752. /* Run time stack overflow checking is performed if
  3753. configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook function is
  3754. called if a stack overflow is detected. */
  3755. }
  3756. 8001cac: bf00 nop
  3757. 8001cae: 370c adds r7, #12
  3758. 8001cb0: 46bd mov sp, r7
  3759. 8001cb2: f85d 7b04 ldr.w r7, [sp], #4
  3760. 8001cb6: 4770 bx lr
  3761. 08001cb8 <main>:
  3762. /**
  3763. * @brief The application entry point.
  3764. * @retval int
  3765. */
  3766. int main(void)
  3767. {
  3768. 8001cb8: b580 push {r7, lr}
  3769. 8001cba: b084 sub sp, #16
  3770. 8001cbc: af00 add r7, sp, #0
  3771. /* USER CODE BEGIN 1 */
  3772. /* USER CODE END 1 */
  3773. /* MPU Configuration--------------------------------------------------------*/
  3774. MPU_Config();
  3775. 8001cbe: f000 fbb3 bl 8002428 <MPU_Config>
  3776. \details Turns on I-Cache
  3777. */
  3778. __STATIC_FORCEINLINE void SCB_EnableICache (void)
  3779. {
  3780. #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)
  3781. if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */
  3782. 8001cc2: 4b4c ldr r3, [pc, #304] @ (8001df4 <main+0x13c>)
  3783. 8001cc4: 695b ldr r3, [r3, #20]
  3784. 8001cc6: f403 3300 and.w r3, r3, #131072 @ 0x20000
  3785. 8001cca: 2b00 cmp r3, #0
  3786. 8001ccc: d11b bne.n 8001d06 <main+0x4e>
  3787. \details Acts as a special kind of Data Memory Barrier.
  3788. It completes when all explicit memory accesses before this instruction complete.
  3789. */
  3790. __STATIC_FORCEINLINE void __DSB(void)
  3791. {
  3792. __ASM volatile ("dsb 0xF":::"memory");
  3793. 8001cce: f3bf 8f4f dsb sy
  3794. }
  3795. 8001cd2: bf00 nop
  3796. __ASM volatile ("isb 0xF":::"memory");
  3797. 8001cd4: f3bf 8f6f isb sy
  3798. }
  3799. 8001cd8: bf00 nop
  3800. __DSB();
  3801. __ISB();
  3802. SCB->ICIALLU = 0UL; /* invalidate I-Cache */
  3803. 8001cda: 4b46 ldr r3, [pc, #280] @ (8001df4 <main+0x13c>)
  3804. 8001cdc: 2200 movs r2, #0
  3805. 8001cde: f8c3 2250 str.w r2, [r3, #592] @ 0x250
  3806. __ASM volatile ("dsb 0xF":::"memory");
  3807. 8001ce2: f3bf 8f4f dsb sy
  3808. }
  3809. 8001ce6: bf00 nop
  3810. __ASM volatile ("isb 0xF":::"memory");
  3811. 8001ce8: f3bf 8f6f isb sy
  3812. }
  3813. 8001cec: bf00 nop
  3814. __DSB();
  3815. __ISB();
  3816. SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */
  3817. 8001cee: 4b41 ldr r3, [pc, #260] @ (8001df4 <main+0x13c>)
  3818. 8001cf0: 695b ldr r3, [r3, #20]
  3819. 8001cf2: 4a40 ldr r2, [pc, #256] @ (8001df4 <main+0x13c>)
  3820. 8001cf4: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  3821. 8001cf8: 6153 str r3, [r2, #20]
  3822. __ASM volatile ("dsb 0xF":::"memory");
  3823. 8001cfa: f3bf 8f4f dsb sy
  3824. }
  3825. 8001cfe: bf00 nop
  3826. __ASM volatile ("isb 0xF":::"memory");
  3827. 8001d00: f3bf 8f6f isb sy
  3828. }
  3829. 8001d04: e000 b.n 8001d08 <main+0x50>
  3830. if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */
  3831. 8001d06: bf00 nop
  3832. #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
  3833. uint32_t ccsidr;
  3834. uint32_t sets;
  3835. uint32_t ways;
  3836. if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */
  3837. 8001d08: 4b3a ldr r3, [pc, #232] @ (8001df4 <main+0x13c>)
  3838. 8001d0a: 695b ldr r3, [r3, #20]
  3839. 8001d0c: f403 3380 and.w r3, r3, #65536 @ 0x10000
  3840. 8001d10: 2b00 cmp r3, #0
  3841. 8001d12: d138 bne.n 8001d86 <main+0xce>
  3842. SCB->CSSELR = 0U; /* select Level 1 data cache */
  3843. 8001d14: 4b37 ldr r3, [pc, #220] @ (8001df4 <main+0x13c>)
  3844. 8001d16: 2200 movs r2, #0
  3845. 8001d18: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  3846. __ASM volatile ("dsb 0xF":::"memory");
  3847. 8001d1c: f3bf 8f4f dsb sy
  3848. }
  3849. 8001d20: bf00 nop
  3850. __DSB();
  3851. ccsidr = SCB->CCSIDR;
  3852. 8001d22: 4b34 ldr r3, [pc, #208] @ (8001df4 <main+0x13c>)
  3853. 8001d24: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  3854. 8001d28: 60fb str r3, [r7, #12]
  3855. /* invalidate D-Cache */
  3856. sets = (uint32_t)(CCSIDR_SETS(ccsidr));
  3857. 8001d2a: 68fb ldr r3, [r7, #12]
  3858. 8001d2c: 0b5b lsrs r3, r3, #13
  3859. 8001d2e: f3c3 030e ubfx r3, r3, #0, #15
  3860. 8001d32: 60bb str r3, [r7, #8]
  3861. do {
  3862. ways = (uint32_t)(CCSIDR_WAYS(ccsidr));
  3863. 8001d34: 68fb ldr r3, [r7, #12]
  3864. 8001d36: 08db lsrs r3, r3, #3
  3865. 8001d38: f3c3 0309 ubfx r3, r3, #0, #10
  3866. 8001d3c: 607b str r3, [r7, #4]
  3867. do {
  3868. SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) |
  3869. 8001d3e: 68bb ldr r3, [r7, #8]
  3870. 8001d40: 015a lsls r2, r3, #5
  3871. 8001d42: f643 73e0 movw r3, #16352 @ 0x3fe0
  3872. 8001d46: 4013 ands r3, r2
  3873. ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) );
  3874. 8001d48: 687a ldr r2, [r7, #4]
  3875. 8001d4a: 0792 lsls r2, r2, #30
  3876. SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) |
  3877. 8001d4c: 4929 ldr r1, [pc, #164] @ (8001df4 <main+0x13c>)
  3878. 8001d4e: 4313 orrs r3, r2
  3879. 8001d50: f8c1 3260 str.w r3, [r1, #608] @ 0x260
  3880. #if defined ( __CC_ARM )
  3881. __schedule_barrier();
  3882. #endif
  3883. } while (ways-- != 0U);
  3884. 8001d54: 687b ldr r3, [r7, #4]
  3885. 8001d56: 1e5a subs r2, r3, #1
  3886. 8001d58: 607a str r2, [r7, #4]
  3887. 8001d5a: 2b00 cmp r3, #0
  3888. 8001d5c: d1ef bne.n 8001d3e <main+0x86>
  3889. } while(sets-- != 0U);
  3890. 8001d5e: 68bb ldr r3, [r7, #8]
  3891. 8001d60: 1e5a subs r2, r3, #1
  3892. 8001d62: 60ba str r2, [r7, #8]
  3893. 8001d64: 2b00 cmp r3, #0
  3894. 8001d66: d1e5 bne.n 8001d34 <main+0x7c>
  3895. __ASM volatile ("dsb 0xF":::"memory");
  3896. 8001d68: f3bf 8f4f dsb sy
  3897. }
  3898. 8001d6c: bf00 nop
  3899. __DSB();
  3900. SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */
  3901. 8001d6e: 4b21 ldr r3, [pc, #132] @ (8001df4 <main+0x13c>)
  3902. 8001d70: 695b ldr r3, [r3, #20]
  3903. 8001d72: 4a20 ldr r2, [pc, #128] @ (8001df4 <main+0x13c>)
  3904. 8001d74: f443 3380 orr.w r3, r3, #65536 @ 0x10000
  3905. 8001d78: 6153 str r3, [r2, #20]
  3906. __ASM volatile ("dsb 0xF":::"memory");
  3907. 8001d7a: f3bf 8f4f dsb sy
  3908. }
  3909. 8001d7e: bf00 nop
  3910. __ASM volatile ("isb 0xF":::"memory");
  3911. 8001d80: f3bf 8f6f isb sy
  3912. }
  3913. 8001d84: e000 b.n 8001d88 <main+0xd0>
  3914. if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */
  3915. 8001d86: bf00 nop
  3916. SCB_EnableDCache();
  3917. /* MCU Configuration--------------------------------------------------------*/
  3918. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  3919. HAL_Init();
  3920. 8001d88: f003 f902 bl 8004f90 <HAL_Init>
  3921. /* USER CODE BEGIN Init */
  3922. /* USER CODE END Init */
  3923. /* Configure the system clock */
  3924. SystemClock_Config();
  3925. 8001d8c: f000 f83e bl 8001e0c <SystemClock_Config>
  3926. /* USER CODE BEGIN SysInit */
  3927. /* USER CODE END SysInit */
  3928. /* Initialize all configured peripherals */
  3929. MX_GPIO_Init();
  3930. 8001d90: f000 faac bl 80022ec <MX_GPIO_Init>
  3931. MX_DMA_Init();
  3932. 8001d94: f000 fa82 bl 800229c <MX_DMA_Init>
  3933. MX_UART8_Init();
  3934. 8001d98: f000 f8f4 bl 8001f84 <MX_UART8_Init>
  3935. MX_CRC_Init();
  3936. 8001d9c: f000 f8b2 bl 8001f04 <MX_CRC_Init>
  3937. MX_RNG_Init();
  3938. 8001da0: f000 f8da bl 8001f58 <MX_RNG_Init>
  3939. MX_USART1_UART_Init();
  3940. 8001da4: f000 f93a bl 800201c <MX_USART1_UART_Init>
  3941. MX_USART2_UART_Init();
  3942. 8001da8: f000 f988 bl 80020bc <MX_USART2_UART_Init>
  3943. MX_USART3_UART_Init();
  3944. 8001dac: f000 f9d6 bl 800215c <MX_USART3_UART_Init>
  3945. MX_USART6_UART_Init();
  3946. 8001db0: f000 fa24 bl 80021fc <MX_USART6_UART_Init>
  3947. // HAL_DMA_RegisterCallback(&hdma_uart8_rx, HAL_DMA_XFER_CPLT_CB_ID, dmaCallback);
  3948. /* USER CODE END 2 */
  3949. /* Init scheduler */
  3950. osKernelInitialize();
  3951. 8001db4: f00e fce8 bl 8010788 <osKernelInitialize>
  3952. /* USER CODE BEGIN RTOS_MUTEX */
  3953. /* add mutexes, ... */
  3954. resMeasurementsMutex = osMutexNew (NULL);
  3955. 8001db8: 2000 movs r0, #0
  3956. 8001dba: f00e fdfd bl 80109b8 <osMutexNew>
  3957. 8001dbe: 4603 mov r3, r0
  3958. 8001dc0: 4a0d ldr r2, [pc, #52] @ (8001df8 <main+0x140>)
  3959. 8001dc2: 6013 str r3, [r2, #0]
  3960. sensorsInfoMutex = osMutexNew (NULL);
  3961. 8001dc4: 2000 movs r0, #0
  3962. 8001dc6: f00e fdf7 bl 80109b8 <osMutexNew>
  3963. 8001dca: 4603 mov r3, r0
  3964. 8001dcc: 4a0b ldr r2, [pc, #44] @ (8001dfc <main+0x144>)
  3965. 8001dce: 6013 str r3, [r2, #0]
  3966. /* add queues, ... */
  3967. /* USER CODE END RTOS_QUEUES */
  3968. /* Create the thread(s) */
  3969. /* creation of defaultTask */
  3970. defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
  3971. 8001dd0: 4a0b ldr r2, [pc, #44] @ (8001e00 <main+0x148>)
  3972. 8001dd2: 2100 movs r1, #0
  3973. 8001dd4: 480b ldr r0, [pc, #44] @ (8001e04 <main+0x14c>)
  3974. 8001dd6: f00e fd36 bl 8010846 <osThreadNew>
  3975. 8001dda: 4603 mov r3, r0
  3976. 8001ddc: 4a0a ldr r2, [pc, #40] @ (8001e08 <main+0x150>)
  3977. 8001dde: 6013 str r3, [r2, #0]
  3978. /* USER CODE BEGIN RTOS_THREADS */
  3979. /* add threads, ... */
  3980. mqtt_cli_init();
  3981. 8001de0: f001 f8ae bl 8002f40 <mqtt_cli_init>
  3982. // Uart8TasksInit();
  3983. UartTasksInit();
  3984. 8001de4: f001 ffda bl 8003d9c <UartTasksInit>
  3985. #ifdef USER_MOCKS
  3986. MockMeasurmetsTaskInit();
  3987. #else
  3988. MeasurmentsReqSchedulerTaskInit();
  3989. 8001de8: f002 ff20 bl 8004c2c <MeasurmentsReqSchedulerTaskInit>
  3990. /* USER CODE BEGIN RTOS_EVENTS */
  3991. /* add events, ... */
  3992. /* USER CODE END RTOS_EVENTS */
  3993. /* Start scheduler */
  3994. osKernelStart();
  3995. 8001dec: f00e fcf0 bl 80107d0 <osKernelStart>
  3996. /* We should never get here as control is now taken by the scheduler */
  3997. /* Infinite loop */
  3998. /* USER CODE BEGIN WHILE */
  3999. while (1)
  4000. 8001df0: bf00 nop
  4001. 8001df2: e7fd b.n 8001df0 <main+0x138>
  4002. 8001df4: e000ed00 .word 0xe000ed00
  4003. 8001df8: 24002168 .word 0x24002168
  4004. 8001dfc: 2400216c .word 0x2400216c
  4005. 8001e00: 08030990 .word 0x08030990
  4006. 8001e04: 08002411 .word 0x08002411
  4007. 8001e08: 24000654 .word 0x24000654
  4008. 08001e0c <SystemClock_Config>:
  4009. /**
  4010. * @brief System Clock Configuration
  4011. * @retval None
  4012. */
  4013. void SystemClock_Config(void)
  4014. {
  4015. 8001e0c: b580 push {r7, lr}
  4016. 8001e0e: b09c sub sp, #112 @ 0x70
  4017. 8001e10: af00 add r7, sp, #0
  4018. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  4019. 8001e12: f107 0324 add.w r3, r7, #36 @ 0x24
  4020. 8001e16: 224c movs r2, #76 @ 0x4c
  4021. 8001e18: 2100 movs r1, #0
  4022. 8001e1a: 4618 mov r0, r3
  4023. 8001e1c: f027 ff68 bl 8029cf0 <memset>
  4024. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  4025. 8001e20: 1d3b adds r3, r7, #4
  4026. 8001e22: 2220 movs r2, #32
  4027. 8001e24: 2100 movs r1, #0
  4028. 8001e26: 4618 mov r0, r3
  4029. 8001e28: f027 ff62 bl 8029cf0 <memset>
  4030. /** Supply configuration update enable
  4031. */
  4032. HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  4033. 8001e2c: 2002 movs r0, #2
  4034. 8001e2e: f007 fdf9 bl 8009a24 <HAL_PWREx_ConfigSupply>
  4035. /** Configure the main internal regulator output voltage
  4036. */
  4037. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  4038. 8001e32: 2300 movs r3, #0
  4039. 8001e34: 603b str r3, [r7, #0]
  4040. 8001e36: 4b31 ldr r3, [pc, #196] @ (8001efc <SystemClock_Config+0xf0>)
  4041. 8001e38: 6adb ldr r3, [r3, #44] @ 0x2c
  4042. 8001e3a: 4a30 ldr r2, [pc, #192] @ (8001efc <SystemClock_Config+0xf0>)
  4043. 8001e3c: f023 0301 bic.w r3, r3, #1
  4044. 8001e40: 62d3 str r3, [r2, #44] @ 0x2c
  4045. 8001e42: 4b2e ldr r3, [pc, #184] @ (8001efc <SystemClock_Config+0xf0>)
  4046. 8001e44: 6adb ldr r3, [r3, #44] @ 0x2c
  4047. 8001e46: f003 0301 and.w r3, r3, #1
  4048. 8001e4a: 603b str r3, [r7, #0]
  4049. 8001e4c: 4b2c ldr r3, [pc, #176] @ (8001f00 <SystemClock_Config+0xf4>)
  4050. 8001e4e: 699b ldr r3, [r3, #24]
  4051. 8001e50: 4a2b ldr r2, [pc, #172] @ (8001f00 <SystemClock_Config+0xf4>)
  4052. 8001e52: f443 4340 orr.w r3, r3, #49152 @ 0xc000
  4053. 8001e56: 6193 str r3, [r2, #24]
  4054. 8001e58: 4b29 ldr r3, [pc, #164] @ (8001f00 <SystemClock_Config+0xf4>)
  4055. 8001e5a: 699b ldr r3, [r3, #24]
  4056. 8001e5c: f403 4340 and.w r3, r3, #49152 @ 0xc000
  4057. 8001e60: 603b str r3, [r7, #0]
  4058. 8001e62: 683b ldr r3, [r7, #0]
  4059. while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  4060. 8001e64: bf00 nop
  4061. 8001e66: 4b26 ldr r3, [pc, #152] @ (8001f00 <SystemClock_Config+0xf4>)
  4062. 8001e68: 699b ldr r3, [r3, #24]
  4063. 8001e6a: f403 5300 and.w r3, r3, #8192 @ 0x2000
  4064. 8001e6e: f5b3 5f00 cmp.w r3, #8192 @ 0x2000
  4065. 8001e72: d1f8 bne.n 8001e66 <SystemClock_Config+0x5a>
  4066. /** Initializes the RCC Oscillators according to the specified parameters
  4067. * in the RCC_OscInitTypeDef structure.
  4068. */
  4069. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSE;
  4070. 8001e74: 2321 movs r3, #33 @ 0x21
  4071. 8001e76: 627b str r3, [r7, #36] @ 0x24
  4072. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  4073. 8001e78: f44f 3380 mov.w r3, #65536 @ 0x10000
  4074. 8001e7c: 62bb str r3, [r7, #40] @ 0x28
  4075. RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
  4076. 8001e7e: 2301 movs r3, #1
  4077. 8001e80: 63fb str r3, [r7, #60] @ 0x3c
  4078. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  4079. 8001e82: 2302 movs r3, #2
  4080. 8001e84: 64bb str r3, [r7, #72] @ 0x48
  4081. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  4082. 8001e86: 2302 movs r3, #2
  4083. 8001e88: 64fb str r3, [r7, #76] @ 0x4c
  4084. RCC_OscInitStruct.PLL.PLLM = 5;
  4085. 8001e8a: 2305 movs r3, #5
  4086. 8001e8c: 653b str r3, [r7, #80] @ 0x50
  4087. RCC_OscInitStruct.PLL.PLLN = 160;
  4088. 8001e8e: 23a0 movs r3, #160 @ 0xa0
  4089. 8001e90: 657b str r3, [r7, #84] @ 0x54
  4090. RCC_OscInitStruct.PLL.PLLP = 2;
  4091. 8001e92: 2302 movs r3, #2
  4092. 8001e94: 65bb str r3, [r7, #88] @ 0x58
  4093. RCC_OscInitStruct.PLL.PLLQ = 2;
  4094. 8001e96: 2302 movs r3, #2
  4095. 8001e98: 65fb str r3, [r7, #92] @ 0x5c
  4096. RCC_OscInitStruct.PLL.PLLR = 2;
  4097. 8001e9a: 2302 movs r3, #2
  4098. 8001e9c: 663b str r3, [r7, #96] @ 0x60
  4099. RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  4100. 8001e9e: 2308 movs r3, #8
  4101. 8001ea0: 667b str r3, [r7, #100] @ 0x64
  4102. RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  4103. 8001ea2: 2300 movs r3, #0
  4104. 8001ea4: 66bb str r3, [r7, #104] @ 0x68
  4105. RCC_OscInitStruct.PLL.PLLFRACN = 0;
  4106. 8001ea6: 2300 movs r3, #0
  4107. 8001ea8: 66fb str r3, [r7, #108] @ 0x6c
  4108. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  4109. 8001eaa: f107 0324 add.w r3, r7, #36 @ 0x24
  4110. 8001eae: 4618 mov r0, r3
  4111. 8001eb0: f007 fdf2 bl 8009a98 <HAL_RCC_OscConfig>
  4112. 8001eb4: 4603 mov r3, r0
  4113. 8001eb6: 2b00 cmp r3, #0
  4114. 8001eb8: d001 beq.n 8001ebe <SystemClock_Config+0xb2>
  4115. {
  4116. Error_Handler();
  4117. 8001eba: f000 fb25 bl 8002508 <Error_Handler>
  4118. }
  4119. /** Initializes the CPU, AHB and APB buses clocks
  4120. */
  4121. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  4122. 8001ebe: 233f movs r3, #63 @ 0x3f
  4123. 8001ec0: 607b str r3, [r7, #4]
  4124. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  4125. |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  4126. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  4127. 8001ec2: 2303 movs r3, #3
  4128. 8001ec4: 60bb str r3, [r7, #8]
  4129. RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  4130. 8001ec6: 2300 movs r3, #0
  4131. 8001ec8: 60fb str r3, [r7, #12]
  4132. RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  4133. 8001eca: 2308 movs r3, #8
  4134. 8001ecc: 613b str r3, [r7, #16]
  4135. RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  4136. 8001ece: 2340 movs r3, #64 @ 0x40
  4137. 8001ed0: 617b str r3, [r7, #20]
  4138. RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  4139. 8001ed2: 2340 movs r3, #64 @ 0x40
  4140. 8001ed4: 61bb str r3, [r7, #24]
  4141. RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  4142. 8001ed6: f44f 6380 mov.w r3, #1024 @ 0x400
  4143. 8001eda: 61fb str r3, [r7, #28]
  4144. RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  4145. 8001edc: 2340 movs r3, #64 @ 0x40
  4146. 8001ede: 623b str r3, [r7, #32]
  4147. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  4148. 8001ee0: 1d3b adds r3, r7, #4
  4149. 8001ee2: 2102 movs r1, #2
  4150. 8001ee4: 4618 mov r0, r3
  4151. 8001ee6: f008 fa31 bl 800a34c <HAL_RCC_ClockConfig>
  4152. 8001eea: 4603 mov r3, r0
  4153. 8001eec: 2b00 cmp r3, #0
  4154. 8001eee: d001 beq.n 8001ef4 <SystemClock_Config+0xe8>
  4155. {
  4156. Error_Handler();
  4157. 8001ef0: f000 fb0a bl 8002508 <Error_Handler>
  4158. }
  4159. }
  4160. 8001ef4: bf00 nop
  4161. 8001ef6: 3770 adds r7, #112 @ 0x70
  4162. 8001ef8: 46bd mov sp, r7
  4163. 8001efa: bd80 pop {r7, pc}
  4164. 8001efc: 58000400 .word 0x58000400
  4165. 8001f00: 58024800 .word 0x58024800
  4166. 08001f04 <MX_CRC_Init>:
  4167. * @brief CRC Initialization Function
  4168. * @param None
  4169. * @retval None
  4170. */
  4171. static void MX_CRC_Init(void)
  4172. {
  4173. 8001f04: b580 push {r7, lr}
  4174. 8001f06: af00 add r7, sp, #0
  4175. /* USER CODE END CRC_Init 0 */
  4176. /* USER CODE BEGIN CRC_Init 1 */
  4177. /* USER CODE END CRC_Init 1 */
  4178. hcrc.Instance = CRC;
  4179. 8001f08: 4b11 ldr r3, [pc, #68] @ (8001f50 <MX_CRC_Init+0x4c>)
  4180. 8001f0a: 4a12 ldr r2, [pc, #72] @ (8001f54 <MX_CRC_Init+0x50>)
  4181. 8001f0c: 601a str r2, [r3, #0]
  4182. hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;
  4183. 8001f0e: 4b10 ldr r3, [pc, #64] @ (8001f50 <MX_CRC_Init+0x4c>)
  4184. 8001f10: 2201 movs r2, #1
  4185. 8001f12: 711a strb r2, [r3, #4]
  4186. hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
  4187. 8001f14: 4b0e ldr r3, [pc, #56] @ (8001f50 <MX_CRC_Init+0x4c>)
  4188. 8001f16: 2200 movs r2, #0
  4189. 8001f18: 715a strb r2, [r3, #5]
  4190. hcrc.Init.GeneratingPolynomial = 4129;
  4191. 8001f1a: 4b0d ldr r3, [pc, #52] @ (8001f50 <MX_CRC_Init+0x4c>)
  4192. 8001f1c: f241 0221 movw r2, #4129 @ 0x1021
  4193. 8001f20: 609a str r2, [r3, #8]
  4194. hcrc.Init.CRCLength = CRC_POLYLENGTH_16B;
  4195. 8001f22: 4b0b ldr r3, [pc, #44] @ (8001f50 <MX_CRC_Init+0x4c>)
  4196. 8001f24: 2208 movs r2, #8
  4197. 8001f26: 60da str r2, [r3, #12]
  4198. hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
  4199. 8001f28: 4b09 ldr r3, [pc, #36] @ (8001f50 <MX_CRC_Init+0x4c>)
  4200. 8001f2a: 2200 movs r2, #0
  4201. 8001f2c: 615a str r2, [r3, #20]
  4202. hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
  4203. 8001f2e: 4b08 ldr r3, [pc, #32] @ (8001f50 <MX_CRC_Init+0x4c>)
  4204. 8001f30: 2200 movs r2, #0
  4205. 8001f32: 619a str r2, [r3, #24]
  4206. hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
  4207. 8001f34: 4b06 ldr r3, [pc, #24] @ (8001f50 <MX_CRC_Init+0x4c>)
  4208. 8001f36: 2201 movs r2, #1
  4209. 8001f38: 621a str r2, [r3, #32]
  4210. if (HAL_CRC_Init(&hcrc) != HAL_OK)
  4211. 8001f3a: 4805 ldr r0, [pc, #20] @ (8001f50 <MX_CRC_Init+0x4c>)
  4212. 8001f3c: f003 fa20 bl 8005380 <HAL_CRC_Init>
  4213. 8001f40: 4603 mov r3, r0
  4214. 8001f42: 2b00 cmp r3, #0
  4215. 8001f44: d001 beq.n 8001f4a <MX_CRC_Init+0x46>
  4216. {
  4217. Error_Handler();
  4218. 8001f46: f000 fadf bl 8002508 <Error_Handler>
  4219. }
  4220. /* USER CODE BEGIN CRC_Init 2 */
  4221. /* USER CODE END CRC_Init 2 */
  4222. }
  4223. 8001f4a: bf00 nop
  4224. 8001f4c: bd80 pop {r7, pc}
  4225. 8001f4e: bf00 nop
  4226. 8001f50: 24000248 .word 0x24000248
  4227. 8001f54: 58024c00 .word 0x58024c00
  4228. 08001f58 <MX_RNG_Init>:
  4229. * @brief RNG Initialization Function
  4230. * @param None
  4231. * @retval None
  4232. */
  4233. static void MX_RNG_Init(void)
  4234. {
  4235. 8001f58: b580 push {r7, lr}
  4236. 8001f5a: af00 add r7, sp, #0
  4237. /* USER CODE END RNG_Init 0 */
  4238. /* USER CODE BEGIN RNG_Init 1 */
  4239. /* USER CODE END RNG_Init 1 */
  4240. hrng.Instance = RNG;
  4241. 8001f5c: 4b07 ldr r3, [pc, #28] @ (8001f7c <MX_RNG_Init+0x24>)
  4242. 8001f5e: 4a08 ldr r2, [pc, #32] @ (8001f80 <MX_RNG_Init+0x28>)
  4243. 8001f60: 601a str r2, [r3, #0]
  4244. hrng.Init.ClockErrorDetection = RNG_CED_ENABLE;
  4245. 8001f62: 4b06 ldr r3, [pc, #24] @ (8001f7c <MX_RNG_Init+0x24>)
  4246. 8001f64: 2200 movs r2, #0
  4247. 8001f66: 605a str r2, [r3, #4]
  4248. if (HAL_RNG_Init(&hrng) != HAL_OK)
  4249. 8001f68: 4804 ldr r0, [pc, #16] @ (8001f7c <MX_RNG_Init+0x24>)
  4250. 8001f6a: f00a fbcd bl 800c708 <HAL_RNG_Init>
  4251. 8001f6e: 4603 mov r3, r0
  4252. 8001f70: 2b00 cmp r3, #0
  4253. 8001f72: d001 beq.n 8001f78 <MX_RNG_Init+0x20>
  4254. {
  4255. Error_Handler();
  4256. 8001f74: f000 fac8 bl 8002508 <Error_Handler>
  4257. }
  4258. /* USER CODE BEGIN RNG_Init 2 */
  4259. /* USER CODE END RNG_Init 2 */
  4260. }
  4261. 8001f78: bf00 nop
  4262. 8001f7a: bd80 pop {r7, pc}
  4263. 8001f7c: 2400026c .word 0x2400026c
  4264. 8001f80: 48021800 .word 0x48021800
  4265. 08001f84 <MX_UART8_Init>:
  4266. * @brief UART8 Initialization Function
  4267. * @param None
  4268. * @retval None
  4269. */
  4270. static void MX_UART8_Init(void)
  4271. {
  4272. 8001f84: b580 push {r7, lr}
  4273. 8001f86: af00 add r7, sp, #0
  4274. /* USER CODE END UART8_Init 0 */
  4275. /* USER CODE BEGIN UART8_Init 1 */
  4276. /* USER CODE END UART8_Init 1 */
  4277. huart8.Instance = UART8;
  4278. 8001f88: 4b22 ldr r3, [pc, #136] @ (8002014 <MX_UART8_Init+0x90>)
  4279. 8001f8a: 4a23 ldr r2, [pc, #140] @ (8002018 <MX_UART8_Init+0x94>)
  4280. 8001f8c: 601a str r2, [r3, #0]
  4281. huart8.Init.BaudRate = 115200;
  4282. 8001f8e: 4b21 ldr r3, [pc, #132] @ (8002014 <MX_UART8_Init+0x90>)
  4283. 8001f90: f44f 32e1 mov.w r2, #115200 @ 0x1c200
  4284. 8001f94: 605a str r2, [r3, #4]
  4285. huart8.Init.WordLength = UART_WORDLENGTH_8B;
  4286. 8001f96: 4b1f ldr r3, [pc, #124] @ (8002014 <MX_UART8_Init+0x90>)
  4287. 8001f98: 2200 movs r2, #0
  4288. 8001f9a: 609a str r2, [r3, #8]
  4289. huart8.Init.StopBits = UART_STOPBITS_1;
  4290. 8001f9c: 4b1d ldr r3, [pc, #116] @ (8002014 <MX_UART8_Init+0x90>)
  4291. 8001f9e: 2200 movs r2, #0
  4292. 8001fa0: 60da str r2, [r3, #12]
  4293. huart8.Init.Parity = UART_PARITY_NONE;
  4294. 8001fa2: 4b1c ldr r3, [pc, #112] @ (8002014 <MX_UART8_Init+0x90>)
  4295. 8001fa4: 2200 movs r2, #0
  4296. 8001fa6: 611a str r2, [r3, #16]
  4297. huart8.Init.Mode = UART_MODE_TX_RX;
  4298. 8001fa8: 4b1a ldr r3, [pc, #104] @ (8002014 <MX_UART8_Init+0x90>)
  4299. 8001faa: 220c movs r2, #12
  4300. 8001fac: 615a str r2, [r3, #20]
  4301. huart8.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  4302. 8001fae: 4b19 ldr r3, [pc, #100] @ (8002014 <MX_UART8_Init+0x90>)
  4303. 8001fb0: 2200 movs r2, #0
  4304. 8001fb2: 619a str r2, [r3, #24]
  4305. huart8.Init.OverSampling = UART_OVERSAMPLING_16;
  4306. 8001fb4: 4b17 ldr r3, [pc, #92] @ (8002014 <MX_UART8_Init+0x90>)
  4307. 8001fb6: 2200 movs r2, #0
  4308. 8001fb8: 61da str r2, [r3, #28]
  4309. huart8.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  4310. 8001fba: 4b16 ldr r3, [pc, #88] @ (8002014 <MX_UART8_Init+0x90>)
  4311. 8001fbc: 2200 movs r2, #0
  4312. 8001fbe: 621a str r2, [r3, #32]
  4313. huart8.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  4314. 8001fc0: 4b14 ldr r3, [pc, #80] @ (8002014 <MX_UART8_Init+0x90>)
  4315. 8001fc2: 2200 movs r2, #0
  4316. 8001fc4: 625a str r2, [r3, #36] @ 0x24
  4317. huart8.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  4318. 8001fc6: 4b13 ldr r3, [pc, #76] @ (8002014 <MX_UART8_Init+0x90>)
  4319. 8001fc8: 2200 movs r2, #0
  4320. 8001fca: 629a str r2, [r3, #40] @ 0x28
  4321. if (HAL_UART_Init(&huart8) != HAL_OK)
  4322. 8001fcc: 4811 ldr r0, [pc, #68] @ (8002014 <MX_UART8_Init+0x90>)
  4323. 8001fce: f00a ff21 bl 800ce14 <HAL_UART_Init>
  4324. 8001fd2: 4603 mov r3, r0
  4325. 8001fd4: 2b00 cmp r3, #0
  4326. 8001fd6: d001 beq.n 8001fdc <MX_UART8_Init+0x58>
  4327. {
  4328. Error_Handler();
  4329. 8001fd8: f000 fa96 bl 8002508 <Error_Handler>
  4330. }
  4331. if (HAL_UARTEx_SetTxFifoThreshold(&huart8, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  4332. 8001fdc: 2100 movs r1, #0
  4333. 8001fde: 480d ldr r0, [pc, #52] @ (8002014 <MX_UART8_Init+0x90>)
  4334. 8001fe0: f00d fbc1 bl 800f766 <HAL_UARTEx_SetTxFifoThreshold>
  4335. 8001fe4: 4603 mov r3, r0
  4336. 8001fe6: 2b00 cmp r3, #0
  4337. 8001fe8: d001 beq.n 8001fee <MX_UART8_Init+0x6a>
  4338. {
  4339. Error_Handler();
  4340. 8001fea: f000 fa8d bl 8002508 <Error_Handler>
  4341. }
  4342. if (HAL_UARTEx_SetRxFifoThreshold(&huart8, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  4343. 8001fee: 2100 movs r1, #0
  4344. 8001ff0: 4808 ldr r0, [pc, #32] @ (8002014 <MX_UART8_Init+0x90>)
  4345. 8001ff2: f00d fbf6 bl 800f7e2 <HAL_UARTEx_SetRxFifoThreshold>
  4346. 8001ff6: 4603 mov r3, r0
  4347. 8001ff8: 2b00 cmp r3, #0
  4348. 8001ffa: d001 beq.n 8002000 <MX_UART8_Init+0x7c>
  4349. {
  4350. Error_Handler();
  4351. 8001ffc: f000 fa84 bl 8002508 <Error_Handler>
  4352. }
  4353. if (HAL_UARTEx_DisableFifoMode(&huart8) != HAL_OK)
  4354. 8002000: 4804 ldr r0, [pc, #16] @ (8002014 <MX_UART8_Init+0x90>)
  4355. 8002002: f00d fb77 bl 800f6f4 <HAL_UARTEx_DisableFifoMode>
  4356. 8002006: 4603 mov r3, r0
  4357. 8002008: 2b00 cmp r3, #0
  4358. 800200a: d001 beq.n 8002010 <MX_UART8_Init+0x8c>
  4359. {
  4360. Error_Handler();
  4361. 800200c: f000 fa7c bl 8002508 <Error_Handler>
  4362. }
  4363. /* USER CODE BEGIN UART8_Init 2 */
  4364. /* USER CODE END UART8_Init 2 */
  4365. }
  4366. 8002010: bf00 nop
  4367. 8002012: bd80 pop {r7, pc}
  4368. 8002014: 24000280 .word 0x24000280
  4369. 8002018: 40007c00 .word 0x40007c00
  4370. 0800201c <MX_USART1_UART_Init>:
  4371. * @brief USART1 Initialization Function
  4372. * @param None
  4373. * @retval None
  4374. */
  4375. static void MX_USART1_UART_Init(void)
  4376. {
  4377. 800201c: b580 push {r7, lr}
  4378. 800201e: af00 add r7, sp, #0
  4379. /* USER CODE END USART1_Init 0 */
  4380. /* USER CODE BEGIN USART1_Init 1 */
  4381. /* USER CODE END USART1_Init 1 */
  4382. huart1.Instance = USART1;
  4383. 8002020: 4b24 ldr r3, [pc, #144] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4384. 8002022: 4a25 ldr r2, [pc, #148] @ (80020b8 <MX_USART1_UART_Init+0x9c>)
  4385. 8002024: 601a str r2, [r3, #0]
  4386. huart1.Init.BaudRate = 115200;
  4387. 8002026: 4b23 ldr r3, [pc, #140] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4388. 8002028: f44f 32e1 mov.w r2, #115200 @ 0x1c200
  4389. 800202c: 605a str r2, [r3, #4]
  4390. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  4391. 800202e: 4b21 ldr r3, [pc, #132] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4392. 8002030: 2200 movs r2, #0
  4393. 8002032: 609a str r2, [r3, #8]
  4394. huart1.Init.StopBits = UART_STOPBITS_1;
  4395. 8002034: 4b1f ldr r3, [pc, #124] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4396. 8002036: 2200 movs r2, #0
  4397. 8002038: 60da str r2, [r3, #12]
  4398. huart1.Init.Parity = UART_PARITY_NONE;
  4399. 800203a: 4b1e ldr r3, [pc, #120] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4400. 800203c: 2200 movs r2, #0
  4401. 800203e: 611a str r2, [r3, #16]
  4402. huart1.Init.Mode = UART_MODE_TX_RX;
  4403. 8002040: 4b1c ldr r3, [pc, #112] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4404. 8002042: 220c movs r2, #12
  4405. 8002044: 615a str r2, [r3, #20]
  4406. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  4407. 8002046: 4b1b ldr r3, [pc, #108] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4408. 8002048: 2200 movs r2, #0
  4409. 800204a: 619a str r2, [r3, #24]
  4410. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  4411. 800204c: 4b19 ldr r3, [pc, #100] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4412. 800204e: 2200 movs r2, #0
  4413. 8002050: 61da str r2, [r3, #28]
  4414. huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  4415. 8002052: 4b18 ldr r3, [pc, #96] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4416. 8002054: 2200 movs r2, #0
  4417. 8002056: 621a str r2, [r3, #32]
  4418. huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  4419. 8002058: 4b16 ldr r3, [pc, #88] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4420. 800205a: 2200 movs r2, #0
  4421. 800205c: 625a str r2, [r3, #36] @ 0x24
  4422. huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
  4423. 800205e: 4b15 ldr r3, [pc, #84] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4424. 8002060: 2202 movs r2, #2
  4425. 8002062: 629a str r2, [r3, #40] @ 0x28
  4426. huart1.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
  4427. 8002064: 4b13 ldr r3, [pc, #76] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4428. 8002066: f44f 3280 mov.w r2, #65536 @ 0x10000
  4429. 800206a: 631a str r2, [r3, #48] @ 0x30
  4430. if (HAL_UART_Init(&huart1) != HAL_OK)
  4431. 800206c: 4811 ldr r0, [pc, #68] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4432. 800206e: f00a fed1 bl 800ce14 <HAL_UART_Init>
  4433. 8002072: 4603 mov r3, r0
  4434. 8002074: 2b00 cmp r3, #0
  4435. 8002076: d001 beq.n 800207c <MX_USART1_UART_Init+0x60>
  4436. {
  4437. Error_Handler();
  4438. 8002078: f000 fa46 bl 8002508 <Error_Handler>
  4439. }
  4440. if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  4441. 800207c: 2100 movs r1, #0
  4442. 800207e: 480d ldr r0, [pc, #52] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4443. 8002080: f00d fb71 bl 800f766 <HAL_UARTEx_SetTxFifoThreshold>
  4444. 8002084: 4603 mov r3, r0
  4445. 8002086: 2b00 cmp r3, #0
  4446. 8002088: d001 beq.n 800208e <MX_USART1_UART_Init+0x72>
  4447. {
  4448. Error_Handler();
  4449. 800208a: f000 fa3d bl 8002508 <Error_Handler>
  4450. }
  4451. if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  4452. 800208e: 2100 movs r1, #0
  4453. 8002090: 4808 ldr r0, [pc, #32] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4454. 8002092: f00d fba6 bl 800f7e2 <HAL_UARTEx_SetRxFifoThreshold>
  4455. 8002096: 4603 mov r3, r0
  4456. 8002098: 2b00 cmp r3, #0
  4457. 800209a: d001 beq.n 80020a0 <MX_USART1_UART_Init+0x84>
  4458. {
  4459. Error_Handler();
  4460. 800209c: f000 fa34 bl 8002508 <Error_Handler>
  4461. }
  4462. if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  4463. 80020a0: 4804 ldr r0, [pc, #16] @ (80020b4 <MX_USART1_UART_Init+0x98>)
  4464. 80020a2: f00d fb27 bl 800f6f4 <HAL_UARTEx_DisableFifoMode>
  4465. 80020a6: 4603 mov r3, r0
  4466. 80020a8: 2b00 cmp r3, #0
  4467. 80020aa: d001 beq.n 80020b0 <MX_USART1_UART_Init+0x94>
  4468. {
  4469. Error_Handler();
  4470. 80020ac: f000 fa2c bl 8002508 <Error_Handler>
  4471. }
  4472. /* USER CODE BEGIN USART1_Init 2 */
  4473. /* USER CODE END USART1_Init 2 */
  4474. }
  4475. 80020b0: bf00 nop
  4476. 80020b2: bd80 pop {r7, pc}
  4477. 80020b4: 24000314 .word 0x24000314
  4478. 80020b8: 40011000 .word 0x40011000
  4479. 080020bc <MX_USART2_UART_Init>:
  4480. * @brief USART2 Initialization Function
  4481. * @param None
  4482. * @retval None
  4483. */
  4484. static void MX_USART2_UART_Init(void)
  4485. {
  4486. 80020bc: b580 push {r7, lr}
  4487. 80020be: af00 add r7, sp, #0
  4488. /* USER CODE END USART2_Init 0 */
  4489. /* USER CODE BEGIN USART2_Init 1 */
  4490. /* USER CODE END USART2_Init 1 */
  4491. huart2.Instance = USART2;
  4492. 80020c0: 4b24 ldr r3, [pc, #144] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4493. 80020c2: 4a25 ldr r2, [pc, #148] @ (8002158 <MX_USART2_UART_Init+0x9c>)
  4494. 80020c4: 601a str r2, [r3, #0]
  4495. huart2.Init.BaudRate = 115200;
  4496. 80020c6: 4b23 ldr r3, [pc, #140] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4497. 80020c8: f44f 32e1 mov.w r2, #115200 @ 0x1c200
  4498. 80020cc: 605a str r2, [r3, #4]
  4499. huart2.Init.WordLength = UART_WORDLENGTH_8B;
  4500. 80020ce: 4b21 ldr r3, [pc, #132] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4501. 80020d0: 2200 movs r2, #0
  4502. 80020d2: 609a str r2, [r3, #8]
  4503. huart2.Init.StopBits = UART_STOPBITS_1;
  4504. 80020d4: 4b1f ldr r3, [pc, #124] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4505. 80020d6: 2200 movs r2, #0
  4506. 80020d8: 60da str r2, [r3, #12]
  4507. huart2.Init.Parity = UART_PARITY_NONE;
  4508. 80020da: 4b1e ldr r3, [pc, #120] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4509. 80020dc: 2200 movs r2, #0
  4510. 80020de: 611a str r2, [r3, #16]
  4511. huart2.Init.Mode = UART_MODE_TX_RX;
  4512. 80020e0: 4b1c ldr r3, [pc, #112] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4513. 80020e2: 220c movs r2, #12
  4514. 80020e4: 615a str r2, [r3, #20]
  4515. huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  4516. 80020e6: 4b1b ldr r3, [pc, #108] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4517. 80020e8: 2200 movs r2, #0
  4518. 80020ea: 619a str r2, [r3, #24]
  4519. huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  4520. 80020ec: 4b19 ldr r3, [pc, #100] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4521. 80020ee: 2200 movs r2, #0
  4522. 80020f0: 61da str r2, [r3, #28]
  4523. huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  4524. 80020f2: 4b18 ldr r3, [pc, #96] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4525. 80020f4: 2200 movs r2, #0
  4526. 80020f6: 621a str r2, [r3, #32]
  4527. huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  4528. 80020f8: 4b16 ldr r3, [pc, #88] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4529. 80020fa: 2200 movs r2, #0
  4530. 80020fc: 625a str r2, [r3, #36] @ 0x24
  4531. huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
  4532. 80020fe: 4b15 ldr r3, [pc, #84] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4533. 8002100: 2202 movs r2, #2
  4534. 8002102: 629a str r2, [r3, #40] @ 0x28
  4535. huart2.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
  4536. 8002104: 4b13 ldr r3, [pc, #76] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4537. 8002106: f44f 3280 mov.w r2, #65536 @ 0x10000
  4538. 800210a: 631a str r2, [r3, #48] @ 0x30
  4539. if (HAL_UART_Init(&huart2) != HAL_OK)
  4540. 800210c: 4811 ldr r0, [pc, #68] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4541. 800210e: f00a fe81 bl 800ce14 <HAL_UART_Init>
  4542. 8002112: 4603 mov r3, r0
  4543. 8002114: 2b00 cmp r3, #0
  4544. 8002116: d001 beq.n 800211c <MX_USART2_UART_Init+0x60>
  4545. {
  4546. Error_Handler();
  4547. 8002118: f000 f9f6 bl 8002508 <Error_Handler>
  4548. }
  4549. if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  4550. 800211c: 2100 movs r1, #0
  4551. 800211e: 480d ldr r0, [pc, #52] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4552. 8002120: f00d fb21 bl 800f766 <HAL_UARTEx_SetTxFifoThreshold>
  4553. 8002124: 4603 mov r3, r0
  4554. 8002126: 2b00 cmp r3, #0
  4555. 8002128: d001 beq.n 800212e <MX_USART2_UART_Init+0x72>
  4556. {
  4557. Error_Handler();
  4558. 800212a: f000 f9ed bl 8002508 <Error_Handler>
  4559. }
  4560. if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  4561. 800212e: 2100 movs r1, #0
  4562. 8002130: 4808 ldr r0, [pc, #32] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4563. 8002132: f00d fb56 bl 800f7e2 <HAL_UARTEx_SetRxFifoThreshold>
  4564. 8002136: 4603 mov r3, r0
  4565. 8002138: 2b00 cmp r3, #0
  4566. 800213a: d001 beq.n 8002140 <MX_USART2_UART_Init+0x84>
  4567. {
  4568. Error_Handler();
  4569. 800213c: f000 f9e4 bl 8002508 <Error_Handler>
  4570. }
  4571. if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK)
  4572. 8002140: 4804 ldr r0, [pc, #16] @ (8002154 <MX_USART2_UART_Init+0x98>)
  4573. 8002142: f00d fad7 bl 800f6f4 <HAL_UARTEx_DisableFifoMode>
  4574. 8002146: 4603 mov r3, r0
  4575. 8002148: 2b00 cmp r3, #0
  4576. 800214a: d001 beq.n 8002150 <MX_USART2_UART_Init+0x94>
  4577. {
  4578. Error_Handler();
  4579. 800214c: f000 f9dc bl 8002508 <Error_Handler>
  4580. }
  4581. /* USER CODE BEGIN USART2_Init 2 */
  4582. /* USER CODE END USART2_Init 2 */
  4583. }
  4584. 8002150: bf00 nop
  4585. 8002152: bd80 pop {r7, pc}
  4586. 8002154: 240003a8 .word 0x240003a8
  4587. 8002158: 40004400 .word 0x40004400
  4588. 0800215c <MX_USART3_UART_Init>:
  4589. * @brief USART3 Initialization Function
  4590. * @param None
  4591. * @retval None
  4592. */
  4593. static void MX_USART3_UART_Init(void)
  4594. {
  4595. 800215c: b580 push {r7, lr}
  4596. 800215e: af00 add r7, sp, #0
  4597. /* USER CODE END USART3_Init 0 */
  4598. /* USER CODE BEGIN USART3_Init 1 */
  4599. /* USER CODE END USART3_Init 1 */
  4600. huart3.Instance = USART3;
  4601. 8002160: 4b24 ldr r3, [pc, #144] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4602. 8002162: 4a25 ldr r2, [pc, #148] @ (80021f8 <MX_USART3_UART_Init+0x9c>)
  4603. 8002164: 601a str r2, [r3, #0]
  4604. huart3.Init.BaudRate = 115200;
  4605. 8002166: 4b23 ldr r3, [pc, #140] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4606. 8002168: f44f 32e1 mov.w r2, #115200 @ 0x1c200
  4607. 800216c: 605a str r2, [r3, #4]
  4608. huart3.Init.WordLength = UART_WORDLENGTH_8B;
  4609. 800216e: 4b21 ldr r3, [pc, #132] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4610. 8002170: 2200 movs r2, #0
  4611. 8002172: 609a str r2, [r3, #8]
  4612. huart3.Init.StopBits = UART_STOPBITS_1;
  4613. 8002174: 4b1f ldr r3, [pc, #124] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4614. 8002176: 2200 movs r2, #0
  4615. 8002178: 60da str r2, [r3, #12]
  4616. huart3.Init.Parity = UART_PARITY_NONE;
  4617. 800217a: 4b1e ldr r3, [pc, #120] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4618. 800217c: 2200 movs r2, #0
  4619. 800217e: 611a str r2, [r3, #16]
  4620. huart3.Init.Mode = UART_MODE_TX_RX;
  4621. 8002180: 4b1c ldr r3, [pc, #112] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4622. 8002182: 220c movs r2, #12
  4623. 8002184: 615a str r2, [r3, #20]
  4624. huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  4625. 8002186: 4b1b ldr r3, [pc, #108] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4626. 8002188: 2200 movs r2, #0
  4627. 800218a: 619a str r2, [r3, #24]
  4628. huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  4629. 800218c: 4b19 ldr r3, [pc, #100] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4630. 800218e: 2200 movs r2, #0
  4631. 8002190: 61da str r2, [r3, #28]
  4632. huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  4633. 8002192: 4b18 ldr r3, [pc, #96] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4634. 8002194: 2200 movs r2, #0
  4635. 8002196: 621a str r2, [r3, #32]
  4636. huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  4637. 8002198: 4b16 ldr r3, [pc, #88] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4638. 800219a: 2200 movs r2, #0
  4639. 800219c: 625a str r2, [r3, #36] @ 0x24
  4640. huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
  4641. 800219e: 4b15 ldr r3, [pc, #84] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4642. 80021a0: 2202 movs r2, #2
  4643. 80021a2: 629a str r2, [r3, #40] @ 0x28
  4644. huart3.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
  4645. 80021a4: 4b13 ldr r3, [pc, #76] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4646. 80021a6: f44f 3280 mov.w r2, #65536 @ 0x10000
  4647. 80021aa: 631a str r2, [r3, #48] @ 0x30
  4648. if (HAL_UART_Init(&huart3) != HAL_OK)
  4649. 80021ac: 4811 ldr r0, [pc, #68] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4650. 80021ae: f00a fe31 bl 800ce14 <HAL_UART_Init>
  4651. 80021b2: 4603 mov r3, r0
  4652. 80021b4: 2b00 cmp r3, #0
  4653. 80021b6: d001 beq.n 80021bc <MX_USART3_UART_Init+0x60>
  4654. {
  4655. Error_Handler();
  4656. 80021b8: f000 f9a6 bl 8002508 <Error_Handler>
  4657. }
  4658. if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  4659. 80021bc: 2100 movs r1, #0
  4660. 80021be: 480d ldr r0, [pc, #52] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4661. 80021c0: f00d fad1 bl 800f766 <HAL_UARTEx_SetTxFifoThreshold>
  4662. 80021c4: 4603 mov r3, r0
  4663. 80021c6: 2b00 cmp r3, #0
  4664. 80021c8: d001 beq.n 80021ce <MX_USART3_UART_Init+0x72>
  4665. {
  4666. Error_Handler();
  4667. 80021ca: f000 f99d bl 8002508 <Error_Handler>
  4668. }
  4669. if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  4670. 80021ce: 2100 movs r1, #0
  4671. 80021d0: 4808 ldr r0, [pc, #32] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4672. 80021d2: f00d fb06 bl 800f7e2 <HAL_UARTEx_SetRxFifoThreshold>
  4673. 80021d6: 4603 mov r3, r0
  4674. 80021d8: 2b00 cmp r3, #0
  4675. 80021da: d001 beq.n 80021e0 <MX_USART3_UART_Init+0x84>
  4676. {
  4677. Error_Handler();
  4678. 80021dc: f000 f994 bl 8002508 <Error_Handler>
  4679. }
  4680. if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK)
  4681. 80021e0: 4804 ldr r0, [pc, #16] @ (80021f4 <MX_USART3_UART_Init+0x98>)
  4682. 80021e2: f00d fa87 bl 800f6f4 <HAL_UARTEx_DisableFifoMode>
  4683. 80021e6: 4603 mov r3, r0
  4684. 80021e8: 2b00 cmp r3, #0
  4685. 80021ea: d001 beq.n 80021f0 <MX_USART3_UART_Init+0x94>
  4686. {
  4687. Error_Handler();
  4688. 80021ec: f000 f98c bl 8002508 <Error_Handler>
  4689. }
  4690. /* USER CODE BEGIN USART3_Init 2 */
  4691. /* USER CODE END USART3_Init 2 */
  4692. }
  4693. 80021f0: bf00 nop
  4694. 80021f2: bd80 pop {r7, pc}
  4695. 80021f4: 2400043c .word 0x2400043c
  4696. 80021f8: 40004800 .word 0x40004800
  4697. 080021fc <MX_USART6_UART_Init>:
  4698. * @brief USART6 Initialization Function
  4699. * @param None
  4700. * @retval None
  4701. */
  4702. static void MX_USART6_UART_Init(void)
  4703. {
  4704. 80021fc: b580 push {r7, lr}
  4705. 80021fe: af00 add r7, sp, #0
  4706. /* USER CODE END USART6_Init 0 */
  4707. /* USER CODE BEGIN USART6_Init 1 */
  4708. /* USER CODE END USART6_Init 1 */
  4709. huart6.Instance = USART6;
  4710. 8002200: 4b24 ldr r3, [pc, #144] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4711. 8002202: 4a25 ldr r2, [pc, #148] @ (8002298 <MX_USART6_UART_Init+0x9c>)
  4712. 8002204: 601a str r2, [r3, #0]
  4713. huart6.Init.BaudRate = 115200;
  4714. 8002206: 4b23 ldr r3, [pc, #140] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4715. 8002208: f44f 32e1 mov.w r2, #115200 @ 0x1c200
  4716. 800220c: 605a str r2, [r3, #4]
  4717. huart6.Init.WordLength = UART_WORDLENGTH_8B;
  4718. 800220e: 4b21 ldr r3, [pc, #132] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4719. 8002210: 2200 movs r2, #0
  4720. 8002212: 609a str r2, [r3, #8]
  4721. huart6.Init.StopBits = UART_STOPBITS_1;
  4722. 8002214: 4b1f ldr r3, [pc, #124] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4723. 8002216: 2200 movs r2, #0
  4724. 8002218: 60da str r2, [r3, #12]
  4725. huart6.Init.Parity = UART_PARITY_NONE;
  4726. 800221a: 4b1e ldr r3, [pc, #120] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4727. 800221c: 2200 movs r2, #0
  4728. 800221e: 611a str r2, [r3, #16]
  4729. huart6.Init.Mode = UART_MODE_TX_RX;
  4730. 8002220: 4b1c ldr r3, [pc, #112] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4731. 8002222: 220c movs r2, #12
  4732. 8002224: 615a str r2, [r3, #20]
  4733. huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  4734. 8002226: 4b1b ldr r3, [pc, #108] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4735. 8002228: 2200 movs r2, #0
  4736. 800222a: 619a str r2, [r3, #24]
  4737. huart6.Init.OverSampling = UART_OVERSAMPLING_16;
  4738. 800222c: 4b19 ldr r3, [pc, #100] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4739. 800222e: 2200 movs r2, #0
  4740. 8002230: 61da str r2, [r3, #28]
  4741. huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  4742. 8002232: 4b18 ldr r3, [pc, #96] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4743. 8002234: 2200 movs r2, #0
  4744. 8002236: 621a str r2, [r3, #32]
  4745. huart6.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  4746. 8002238: 4b16 ldr r3, [pc, #88] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4747. 800223a: 2200 movs r2, #0
  4748. 800223c: 625a str r2, [r3, #36] @ 0x24
  4749. huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
  4750. 800223e: 4b15 ldr r3, [pc, #84] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4751. 8002240: 2202 movs r2, #2
  4752. 8002242: 629a str r2, [r3, #40] @ 0x28
  4753. huart6.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
  4754. 8002244: 4b13 ldr r3, [pc, #76] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4755. 8002246: f44f 3280 mov.w r2, #65536 @ 0x10000
  4756. 800224a: 631a str r2, [r3, #48] @ 0x30
  4757. if (HAL_UART_Init(&huart6) != HAL_OK)
  4758. 800224c: 4811 ldr r0, [pc, #68] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4759. 800224e: f00a fde1 bl 800ce14 <HAL_UART_Init>
  4760. 8002252: 4603 mov r3, r0
  4761. 8002254: 2b00 cmp r3, #0
  4762. 8002256: d001 beq.n 800225c <MX_USART6_UART_Init+0x60>
  4763. {
  4764. Error_Handler();
  4765. 8002258: f000 f956 bl 8002508 <Error_Handler>
  4766. }
  4767. if (HAL_UARTEx_SetTxFifoThreshold(&huart6, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  4768. 800225c: 2100 movs r1, #0
  4769. 800225e: 480d ldr r0, [pc, #52] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4770. 8002260: f00d fa81 bl 800f766 <HAL_UARTEx_SetTxFifoThreshold>
  4771. 8002264: 4603 mov r3, r0
  4772. 8002266: 2b00 cmp r3, #0
  4773. 8002268: d001 beq.n 800226e <MX_USART6_UART_Init+0x72>
  4774. {
  4775. Error_Handler();
  4776. 800226a: f000 f94d bl 8002508 <Error_Handler>
  4777. }
  4778. if (HAL_UARTEx_SetRxFifoThreshold(&huart6, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  4779. 800226e: 2100 movs r1, #0
  4780. 8002270: 4808 ldr r0, [pc, #32] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4781. 8002272: f00d fab6 bl 800f7e2 <HAL_UARTEx_SetRxFifoThreshold>
  4782. 8002276: 4603 mov r3, r0
  4783. 8002278: 2b00 cmp r3, #0
  4784. 800227a: d001 beq.n 8002280 <MX_USART6_UART_Init+0x84>
  4785. {
  4786. Error_Handler();
  4787. 800227c: f000 f944 bl 8002508 <Error_Handler>
  4788. }
  4789. if (HAL_UARTEx_DisableFifoMode(&huart6) != HAL_OK)
  4790. 8002280: 4804 ldr r0, [pc, #16] @ (8002294 <MX_USART6_UART_Init+0x98>)
  4791. 8002282: f00d fa37 bl 800f6f4 <HAL_UARTEx_DisableFifoMode>
  4792. 8002286: 4603 mov r3, r0
  4793. 8002288: 2b00 cmp r3, #0
  4794. 800228a: d001 beq.n 8002290 <MX_USART6_UART_Init+0x94>
  4795. {
  4796. Error_Handler();
  4797. 800228c: f000 f93c bl 8002508 <Error_Handler>
  4798. }
  4799. /* USER CODE BEGIN USART6_Init 2 */
  4800. /* USER CODE END USART6_Init 2 */
  4801. }
  4802. 8002290: bf00 nop
  4803. 8002292: bd80 pop {r7, pc}
  4804. 8002294: 240004d0 .word 0x240004d0
  4805. 8002298: 40011400 .word 0x40011400
  4806. 0800229c <MX_DMA_Init>:
  4807. /**
  4808. * Enable DMA controller clock
  4809. */
  4810. static void MX_DMA_Init(void)
  4811. {
  4812. 800229c: b580 push {r7, lr}
  4813. 800229e: b082 sub sp, #8
  4814. 80022a0: af00 add r7, sp, #0
  4815. /* DMA controller clock enable */
  4816. __HAL_RCC_DMA2_CLK_ENABLE();
  4817. 80022a2: 4b11 ldr r3, [pc, #68] @ (80022e8 <MX_DMA_Init+0x4c>)
  4818. 80022a4: f8d3 30d8 ldr.w r3, [r3, #216] @ 0xd8
  4819. 80022a8: 4a0f ldr r2, [pc, #60] @ (80022e8 <MX_DMA_Init+0x4c>)
  4820. 80022aa: f043 0302 orr.w r3, r3, #2
  4821. 80022ae: f8c2 30d8 str.w r3, [r2, #216] @ 0xd8
  4822. 80022b2: 4b0d ldr r3, [pc, #52] @ (80022e8 <MX_DMA_Init+0x4c>)
  4823. 80022b4: f8d3 30d8 ldr.w r3, [r3, #216] @ 0xd8
  4824. 80022b8: f003 0302 and.w r3, r3, #2
  4825. 80022bc: 607b str r3, [r7, #4]
  4826. 80022be: 687b ldr r3, [r7, #4]
  4827. /* DMA interrupt init */
  4828. /* DMA2_Stream6_IRQn interrupt configuration */
  4829. HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 5, 0);
  4830. 80022c0: 2200 movs r2, #0
  4831. 80022c2: 2105 movs r1, #5
  4832. 80022c4: 2045 movs r0, #69 @ 0x45
  4833. 80022c6: f002 ffbb bl 8005240 <HAL_NVIC_SetPriority>
  4834. HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn);
  4835. 80022ca: 2045 movs r0, #69 @ 0x45
  4836. 80022cc: f002 ffd2 bl 8005274 <HAL_NVIC_EnableIRQ>
  4837. /* DMA2_Stream7_IRQn interrupt configuration */
  4838. HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 5, 0);
  4839. 80022d0: 2200 movs r2, #0
  4840. 80022d2: 2105 movs r1, #5
  4841. 80022d4: 2046 movs r0, #70 @ 0x46
  4842. 80022d6: f002 ffb3 bl 8005240 <HAL_NVIC_SetPriority>
  4843. HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
  4844. 80022da: 2046 movs r0, #70 @ 0x46
  4845. 80022dc: f002 ffca bl 8005274 <HAL_NVIC_EnableIRQ>
  4846. }
  4847. 80022e0: bf00 nop
  4848. 80022e2: 3708 adds r7, #8
  4849. 80022e4: 46bd mov sp, r7
  4850. 80022e6: bd80 pop {r7, pc}
  4851. 80022e8: 58024400 .word 0x58024400
  4852. 080022ec <MX_GPIO_Init>:
  4853. * @brief GPIO Initialization Function
  4854. * @param None
  4855. * @retval None
  4856. */
  4857. static void MX_GPIO_Init(void)
  4858. {
  4859. 80022ec: b580 push {r7, lr}
  4860. 80022ee: b08c sub sp, #48 @ 0x30
  4861. 80022f0: af00 add r7, sp, #0
  4862. /* USER CODE BEGIN MX_GPIO_Init_1 */
  4863. GPIO_InitTypeDef GPIO_InitStruct = {0};
  4864. 80022f2: f107 031c add.w r3, r7, #28
  4865. 80022f6: 2200 movs r2, #0
  4866. 80022f8: 601a str r2, [r3, #0]
  4867. 80022fa: 605a str r2, [r3, #4]
  4868. 80022fc: 609a str r2, [r3, #8]
  4869. 80022fe: 60da str r2, [r3, #12]
  4870. 8002300: 611a str r2, [r3, #16]
  4871. /* USER CODE END MX_GPIO_Init_1 */
  4872. /* GPIO Ports Clock Enable */
  4873. __HAL_RCC_GPIOH_CLK_ENABLE();
  4874. 8002302: 4b41 ldr r3, [pc, #260] @ (8002408 <MX_GPIO_Init+0x11c>)
  4875. 8002304: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4876. 8002308: 4a3f ldr r2, [pc, #252] @ (8002408 <MX_GPIO_Init+0x11c>)
  4877. 800230a: f043 0380 orr.w r3, r3, #128 @ 0x80
  4878. 800230e: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  4879. 8002312: 4b3d ldr r3, [pc, #244] @ (8002408 <MX_GPIO_Init+0x11c>)
  4880. 8002314: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4881. 8002318: f003 0380 and.w r3, r3, #128 @ 0x80
  4882. 800231c: 61bb str r3, [r7, #24]
  4883. 800231e: 69bb ldr r3, [r7, #24]
  4884. __HAL_RCC_GPIOC_CLK_ENABLE();
  4885. 8002320: 4b39 ldr r3, [pc, #228] @ (8002408 <MX_GPIO_Init+0x11c>)
  4886. 8002322: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4887. 8002326: 4a38 ldr r2, [pc, #224] @ (8002408 <MX_GPIO_Init+0x11c>)
  4888. 8002328: f043 0304 orr.w r3, r3, #4
  4889. 800232c: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  4890. 8002330: 4b35 ldr r3, [pc, #212] @ (8002408 <MX_GPIO_Init+0x11c>)
  4891. 8002332: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4892. 8002336: f003 0304 and.w r3, r3, #4
  4893. 800233a: 617b str r3, [r7, #20]
  4894. 800233c: 697b ldr r3, [r7, #20]
  4895. __HAL_RCC_GPIOA_CLK_ENABLE();
  4896. 800233e: 4b32 ldr r3, [pc, #200] @ (8002408 <MX_GPIO_Init+0x11c>)
  4897. 8002340: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4898. 8002344: 4a30 ldr r2, [pc, #192] @ (8002408 <MX_GPIO_Init+0x11c>)
  4899. 8002346: f043 0301 orr.w r3, r3, #1
  4900. 800234a: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  4901. 800234e: 4b2e ldr r3, [pc, #184] @ (8002408 <MX_GPIO_Init+0x11c>)
  4902. 8002350: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4903. 8002354: f003 0301 and.w r3, r3, #1
  4904. 8002358: 613b str r3, [r7, #16]
  4905. 800235a: 693b ldr r3, [r7, #16]
  4906. __HAL_RCC_GPIOB_CLK_ENABLE();
  4907. 800235c: 4b2a ldr r3, [pc, #168] @ (8002408 <MX_GPIO_Init+0x11c>)
  4908. 800235e: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4909. 8002362: 4a29 ldr r2, [pc, #164] @ (8002408 <MX_GPIO_Init+0x11c>)
  4910. 8002364: f043 0302 orr.w r3, r3, #2
  4911. 8002368: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  4912. 800236c: 4b26 ldr r3, [pc, #152] @ (8002408 <MX_GPIO_Init+0x11c>)
  4913. 800236e: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4914. 8002372: f003 0302 and.w r3, r3, #2
  4915. 8002376: 60fb str r3, [r7, #12]
  4916. 8002378: 68fb ldr r3, [r7, #12]
  4917. __HAL_RCC_GPIOD_CLK_ENABLE();
  4918. 800237a: 4b23 ldr r3, [pc, #140] @ (8002408 <MX_GPIO_Init+0x11c>)
  4919. 800237c: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4920. 8002380: 4a21 ldr r2, [pc, #132] @ (8002408 <MX_GPIO_Init+0x11c>)
  4921. 8002382: f043 0308 orr.w r3, r3, #8
  4922. 8002386: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  4923. 800238a: 4b1f ldr r3, [pc, #124] @ (8002408 <MX_GPIO_Init+0x11c>)
  4924. 800238c: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4925. 8002390: f003 0308 and.w r3, r3, #8
  4926. 8002394: 60bb str r3, [r7, #8]
  4927. 8002396: 68bb ldr r3, [r7, #8]
  4928. __HAL_RCC_GPIOE_CLK_ENABLE();
  4929. 8002398: 4b1b ldr r3, [pc, #108] @ (8002408 <MX_GPIO_Init+0x11c>)
  4930. 800239a: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4931. 800239e: 4a1a ldr r2, [pc, #104] @ (8002408 <MX_GPIO_Init+0x11c>)
  4932. 80023a0: f043 0310 orr.w r3, r3, #16
  4933. 80023a4: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  4934. 80023a8: 4b17 ldr r3, [pc, #92] @ (8002408 <MX_GPIO_Init+0x11c>)
  4935. 80023aa: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  4936. 80023ae: f003 0310 and.w r3, r3, #16
  4937. 80023b2: 607b str r3, [r7, #4]
  4938. 80023b4: 687b ldr r3, [r7, #4]
  4939. /* USER CODE BEGIN MX_GPIO_Init_2 */
  4940. GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
  4941. 80023b6: f44f 4340 mov.w r3, #49152 @ 0xc000
  4942. 80023ba: 61fb str r3, [r7, #28]
  4943. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  4944. 80023bc: 2301 movs r3, #1
  4945. 80023be: 623b str r3, [r7, #32]
  4946. GPIO_InitStruct.Pull = GPIO_PULLUP;
  4947. 80023c0: 2301 movs r3, #1
  4948. 80023c2: 627b str r3, [r7, #36] @ 0x24
  4949. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  4950. 80023c4: 2300 movs r3, #0
  4951. 80023c6: 62bb str r3, [r7, #40] @ 0x28
  4952. HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  4953. 80023c8: f107 031c add.w r3, r7, #28
  4954. 80023cc: 4619 mov r1, r3
  4955. 80023ce: 480f ldr r0, [pc, #60] @ (800240c <MX_GPIO_Init+0x120>)
  4956. 80023d0: f007 f95e bl 8009690 <HAL_GPIO_Init>
  4957. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_14, GPIO_PIN_RESET);
  4958. 80023d4: 2200 movs r2, #0
  4959. 80023d6: f44f 4180 mov.w r1, #16384 @ 0x4000
  4960. 80023da: 480c ldr r0, [pc, #48] @ (800240c <MX_GPIO_Init+0x120>)
  4961. 80023dc: f007 fb08 bl 80099f0 <HAL_GPIO_WritePin>
  4962. HAL_Delay(100);
  4963. 80023e0: 2064 movs r0, #100 @ 0x64
  4964. 80023e2: f002 fe31 bl 8005048 <HAL_Delay>
  4965. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_14, GPIO_PIN_SET);
  4966. 80023e6: 2201 movs r2, #1
  4967. 80023e8: f44f 4180 mov.w r1, #16384 @ 0x4000
  4968. 80023ec: 4807 ldr r0, [pc, #28] @ (800240c <MX_GPIO_Init+0x120>)
  4969. 80023ee: f007 faff bl 80099f0 <HAL_GPIO_WritePin>
  4970. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_SET);
  4971. 80023f2: 2201 movs r2, #1
  4972. 80023f4: f44f 4100 mov.w r1, #32768 @ 0x8000
  4973. 80023f8: 4804 ldr r0, [pc, #16] @ (800240c <MX_GPIO_Init+0x120>)
  4974. 80023fa: f007 faf9 bl 80099f0 <HAL_GPIO_WritePin>
  4975. // HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  4976. // HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  4977. // HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  4978. // HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  4979. /* USER CODE END MX_GPIO_Init_2 */
  4980. }
  4981. 80023fe: bf00 nop
  4982. 8002400: 3730 adds r7, #48 @ 0x30
  4983. 8002402: 46bd mov sp, r7
  4984. 8002404: bd80 pop {r7, pc}
  4985. 8002406: bf00 nop
  4986. 8002408: 58024400 .word 0x58024400
  4987. 800240c: 58021000 .word 0x58021000
  4988. 08002410 <StartDefaultTask>:
  4989. * @param argument: Not used
  4990. * @retval None
  4991. */
  4992. /* USER CODE END Header_StartDefaultTask */
  4993. void StartDefaultTask(void *argument)
  4994. {
  4995. 8002410: b580 push {r7, lr}
  4996. 8002412: b082 sub sp, #8
  4997. 8002414: af00 add r7, sp, #0
  4998. 8002416: 6078 str r0, [r7, #4]
  4999. /* init code for LWIP */
  5000. MX_LWIP_Init();
  5001. 8002418: f00d fae0 bl 800f9dc <MX_LWIP_Init>
  5002. /* USER CODE BEGIN 5 */
  5003. /* Infinite loop */
  5004. for(;;)
  5005. {
  5006. osDelay(pdMS_TO_TICKS(1000));
  5007. 800241c: f44f 707a mov.w r0, #1000 @ 0x3e8
  5008. 8002420: f00e faaf bl 8010982 <osDelay>
  5009. 8002424: e7fa b.n 800241c <StartDefaultTask+0xc>
  5010. ...
  5011. 08002428 <MPU_Config>:
  5012. }
  5013. /* MPU Configuration */
  5014. void MPU_Config(void)
  5015. {
  5016. 8002428: b580 push {r7, lr}
  5017. 800242a: b084 sub sp, #16
  5018. 800242c: af00 add r7, sp, #0
  5019. MPU_Region_InitTypeDef MPU_InitStruct = {0};
  5020. 800242e: 463b mov r3, r7
  5021. 8002430: 2200 movs r2, #0
  5022. 8002432: 601a str r2, [r3, #0]
  5023. 8002434: 605a str r2, [r3, #4]
  5024. 8002436: 609a str r2, [r3, #8]
  5025. 8002438: 60da str r2, [r3, #12]
  5026. /* Disables the MPU */
  5027. HAL_MPU_Disable();
  5028. 800243a: f002 ff29 bl 8005290 <HAL_MPU_Disable>
  5029. /** Initializes and configures the Region and the memory to be protected
  5030. */
  5031. MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  5032. 800243e: 2301 movs r3, #1
  5033. 8002440: 703b strb r3, [r7, #0]
  5034. MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  5035. 8002442: 2300 movs r3, #0
  5036. 8002444: 707b strb r3, [r7, #1]
  5037. MPU_InitStruct.BaseAddress = 0x0;
  5038. 8002446: 2300 movs r3, #0
  5039. 8002448: 607b str r3, [r7, #4]
  5040. MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  5041. 800244a: 231f movs r3, #31
  5042. 800244c: 723b strb r3, [r7, #8]
  5043. MPU_InitStruct.SubRegionDisable = 0x87;
  5044. 800244e: 2387 movs r3, #135 @ 0x87
  5045. 8002450: 727b strb r3, [r7, #9]
  5046. MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  5047. 8002452: 2300 movs r3, #0
  5048. 8002454: 72bb strb r3, [r7, #10]
  5049. MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  5050. 8002456: 2300 movs r3, #0
  5051. 8002458: 72fb strb r3, [r7, #11]
  5052. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  5053. 800245a: 2301 movs r3, #1
  5054. 800245c: 733b strb r3, [r7, #12]
  5055. MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  5056. 800245e: 2301 movs r3, #1
  5057. 8002460: 737b strb r3, [r7, #13]
  5058. MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  5059. 8002462: 2300 movs r3, #0
  5060. 8002464: 73bb strb r3, [r7, #14]
  5061. MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  5062. 8002466: 2300 movs r3, #0
  5063. 8002468: 73fb strb r3, [r7, #15]
  5064. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  5065. 800246a: 463b mov r3, r7
  5066. 800246c: 4618 mov r0, r3
  5067. 800246e: f002 ff47 bl 8005300 <HAL_MPU_ConfigRegion>
  5068. /** Initializes and configures the Region and the memory to be protected
  5069. */
  5070. MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  5071. 8002472: 2301 movs r3, #1
  5072. 8002474: 707b strb r3, [r7, #1]
  5073. MPU_InitStruct.BaseAddress = 0x24020000;
  5074. 8002476: 4b13 ldr r3, [pc, #76] @ (80024c4 <MPU_Config+0x9c>)
  5075. 8002478: 607b str r3, [r7, #4]
  5076. MPU_InitStruct.Size = MPU_REGION_SIZE_128KB;
  5077. 800247a: 2310 movs r3, #16
  5078. 800247c: 723b strb r3, [r7, #8]
  5079. MPU_InitStruct.SubRegionDisable = 0x0;
  5080. 800247e: 2300 movs r3, #0
  5081. 8002480: 727b strb r3, [r7, #9]
  5082. MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  5083. 8002482: 2301 movs r3, #1
  5084. 8002484: 72bb strb r3, [r7, #10]
  5085. MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  5086. 8002486: 2303 movs r3, #3
  5087. 8002488: 72fb strb r3, [r7, #11]
  5088. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  5089. 800248a: 2300 movs r3, #0
  5090. 800248c: 737b strb r3, [r7, #13]
  5091. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  5092. 800248e: 463b mov r3, r7
  5093. 8002490: 4618 mov r0, r3
  5094. 8002492: f002 ff35 bl 8005300 <HAL_MPU_ConfigRegion>
  5095. /** Initializes and configures the Region and the memory to be protected
  5096. */
  5097. MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  5098. 8002496: 2302 movs r3, #2
  5099. 8002498: 707b strb r3, [r7, #1]
  5100. MPU_InitStruct.BaseAddress = 0x24040000;
  5101. 800249a: 4b0b ldr r3, [pc, #44] @ (80024c8 <MPU_Config+0xa0>)
  5102. 800249c: 607b str r3, [r7, #4]
  5103. MPU_InitStruct.Size = MPU_REGION_SIZE_512B;
  5104. 800249e: 2308 movs r3, #8
  5105. 80024a0: 723b strb r3, [r7, #8]
  5106. MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  5107. 80024a2: 2300 movs r3, #0
  5108. 80024a4: 72bb strb r3, [r7, #10]
  5109. MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  5110. 80024a6: 2301 movs r3, #1
  5111. 80024a8: 737b strb r3, [r7, #13]
  5112. MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
  5113. 80024aa: 2301 movs r3, #1
  5114. 80024ac: 73fb strb r3, [r7, #15]
  5115. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  5116. 80024ae: 463b mov r3, r7
  5117. 80024b0: 4618 mov r0, r3
  5118. 80024b2: f002 ff25 bl 8005300 <HAL_MPU_ConfigRegion>
  5119. /* Enables the MPU */
  5120. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  5121. 80024b6: 2004 movs r0, #4
  5122. 80024b8: f002 ff02 bl 80052c0 <HAL_MPU_Enable>
  5123. }
  5124. 80024bc: bf00 nop
  5125. 80024be: 3710 adds r7, #16
  5126. 80024c0: 46bd mov sp, r7
  5127. 80024c2: bd80 pop {r7, pc}
  5128. 80024c4: 24020000 .word 0x24020000
  5129. 80024c8: 24040000 .word 0x24040000
  5130. 080024cc <HAL_TIM_PeriodElapsedCallback>:
  5131. * a global variable "uwTick" used as application time base.
  5132. * @param htim : TIM handle
  5133. * @retval None
  5134. */
  5135. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  5136. {
  5137. 80024cc: b580 push {r7, lr}
  5138. 80024ce: b082 sub sp, #8
  5139. 80024d0: af00 add r7, sp, #0
  5140. 80024d2: 6078 str r0, [r7, #4]
  5141. /* USER CODE BEGIN Callback 0 */
  5142. /* USER CODE END Callback 0 */
  5143. if (htim->Instance == TIM6) {
  5144. 80024d4: 687b ldr r3, [r7, #4]
  5145. 80024d6: 681b ldr r3, [r3, #0]
  5146. 80024d8: 4a09 ldr r2, [pc, #36] @ (8002500 <HAL_TIM_PeriodElapsedCallback+0x34>)
  5147. 80024da: 4293 cmp r3, r2
  5148. 80024dc: d101 bne.n 80024e2 <HAL_TIM_PeriodElapsedCallback+0x16>
  5149. HAL_IncTick();
  5150. 80024de: f002 fd93 bl 8005008 <HAL_IncTick>
  5151. }
  5152. /* USER CODE BEGIN Callback 1 */
  5153. if (htim->Instance == TIM6) {
  5154. 80024e2: 687b ldr r3, [r7, #4]
  5155. 80024e4: 681b ldr r3, [r3, #0]
  5156. 80024e6: 4a06 ldr r2, [pc, #24] @ (8002500 <HAL_TIM_PeriodElapsedCallback+0x34>)
  5157. 80024e8: 4293 cmp r3, r2
  5158. 80024ea: d104 bne.n 80024f6 <HAL_TIM_PeriodElapsedCallback+0x2a>
  5159. MilliTimer++;
  5160. 80024ec: 4b05 ldr r3, [pc, #20] @ (8002504 <HAL_TIM_PeriodElapsedCallback+0x38>)
  5161. 80024ee: 681b ldr r3, [r3, #0]
  5162. 80024f0: 3301 adds r3, #1
  5163. 80024f2: 4a04 ldr r2, [pc, #16] @ (8002504 <HAL_TIM_PeriodElapsedCallback+0x38>)
  5164. 80024f4: 6013 str r3, [r2, #0]
  5165. }
  5166. /* USER CODE END Callback 1 */
  5167. }
  5168. 80024f6: bf00 nop
  5169. 80024f8: 3708 adds r7, #8
  5170. 80024fa: 46bd mov sp, r7
  5171. 80024fc: bd80 pop {r7, pc}
  5172. 80024fe: bf00 nop
  5173. 8002500: 40001000 .word 0x40001000
  5174. 8002504: 2402b034 .word 0x2402b034
  5175. 08002508 <Error_Handler>:
  5176. /**
  5177. * @brief This function is executed in case of error occurrence.
  5178. * @retval None
  5179. */
  5180. void Error_Handler(void)
  5181. {
  5182. 8002508: b480 push {r7}
  5183. 800250a: af00 add r7, sp, #0
  5184. __ASM volatile ("cpsid i" : : : "memory");
  5185. 800250c: b672 cpsid i
  5186. }
  5187. 800250e: bf00 nop
  5188. /* USER CODE BEGIN Error_Handler_Debug */
  5189. /* User can add his own implementation to report the HAL error return state */
  5190. __disable_irq();
  5191. while (1)
  5192. 8002510: bf00 nop
  5193. 8002512: e7fd b.n 8002510 <Error_Handler+0x8>
  5194. 08002514 <MqttClientSubTask>:
  5195. void MqttClientSubTask(void *argument); //mqtt client subscribe task function
  5196. void MqttClientPubTask(void *argument); //mqtt client publish task function
  5197. int MqttConnectBroker(void); //mqtt broker connect function
  5198. void MqttMessageArrived(MessageData *msg); //mqtt message callback function
  5199. void MqttClientSubTask (void* argument) {
  5200. 8002514: b580 push {r7, lr}
  5201. 8002516: b082 sub sp, #8
  5202. 8002518: af00 add r7, sp, #0
  5203. 800251a: 6078 str r0, [r7, #4]
  5204. while (1) {
  5205. // waiting for valid ip address
  5206. if (gnetif.ip_addr.addr == 0 || gnetif.netmask.addr == 0 || gnetif.gw.addr == 0) // system has no valid ip address
  5207. 800251c: 4b16 ldr r3, [pc, #88] @ (8002578 <MqttClientSubTask+0x64>)
  5208. 800251e: 685b ldr r3, [r3, #4]
  5209. 8002520: 2b00 cmp r3, #0
  5210. 8002522: d007 beq.n 8002534 <MqttClientSubTask+0x20>
  5211. 8002524: 4b14 ldr r3, [pc, #80] @ (8002578 <MqttClientSubTask+0x64>)
  5212. 8002526: 689b ldr r3, [r3, #8]
  5213. 8002528: 2b00 cmp r3, #0
  5214. 800252a: d003 beq.n 8002534 <MqttClientSubTask+0x20>
  5215. 800252c: 4b12 ldr r3, [pc, #72] @ (8002578 <MqttClientSubTask+0x64>)
  5216. 800252e: 68db ldr r3, [r3, #12]
  5217. 8002530: 2b00 cmp r3, #0
  5218. 8002532: d104 bne.n 800253e <MqttClientSubTask+0x2a>
  5219. {
  5220. osDelay (pdMS_TO_TICKS (1000));
  5221. 8002534: f44f 707a mov.w r0, #1000 @ 0x3e8
  5222. 8002538: f00e fa23 bl 8010982 <osDelay>
  5223. continue;
  5224. 800253c: e003 b.n 8002546 <MqttClientSubTask+0x32>
  5225. } else {
  5226. printf ("DHCP/Static IP O.K.\n");
  5227. 800253e: 480f ldr r0, [pc, #60] @ (800257c <MqttClientSubTask+0x68>)
  5228. 8002540: f027 faac bl 8029a9c <puts>
  5229. break;
  5230. 8002544: e000 b.n 8002548 <MqttClientSubTask+0x34>
  5231. if (gnetif.ip_addr.addr == 0 || gnetif.netmask.addr == 0 || gnetif.gw.addr == 0) // system has no valid ip address
  5232. 8002546: e7e9 b.n 800251c <MqttClientSubTask+0x8>
  5233. }
  5234. }
  5235. while (1) {
  5236. if (!mqttClient.isconnected) {
  5237. 8002548: 4b0d ldr r3, [pc, #52] @ (8002580 <MqttClientSubTask+0x6c>)
  5238. 800254a: 6a1b ldr r3, [r3, #32]
  5239. 800254c: 2b00 cmp r3, #0
  5240. 800254e: d109 bne.n 8002564 <MqttClientSubTask+0x50>
  5241. // try to connect to the broker
  5242. if (MqttConnectBroker () != MQTT_SUCCESS) {
  5243. 8002550: f000 fb02 bl 8002b58 <MqttConnectBroker>
  5244. 8002554: 4603 mov r3, r0
  5245. 8002556: 2b00 cmp r3, #0
  5246. 8002558: d0f6 beq.n 8002548 <MqttClientSubTask+0x34>
  5247. osDelay (pdMS_TO_TICKS (1000));
  5248. 800255a: f44f 707a mov.w r0, #1000 @ 0x3e8
  5249. 800255e: f00e fa10 bl 8010982 <osDelay>
  5250. 8002562: e7f1 b.n 8002548 <MqttClientSubTask+0x34>
  5251. }
  5252. } else {
  5253. MQTTYield (&mqttClient, 500); // handle timer
  5254. 8002564: f44f 71fa mov.w r1, #500 @ 0x1f4
  5255. 8002568: 4805 ldr r0, [pc, #20] @ (8002580 <MqttClientSubTask+0x6c>)
  5256. 800256a: f024 fb99 bl 8026ca0 <MQTTYield>
  5257. osDelay (pdMS_TO_TICKS (100));
  5258. 800256e: 2064 movs r0, #100 @ 0x64
  5259. 8002570: f00e fa07 bl 8010982 <osDelay>
  5260. if (!mqttClient.isconnected) {
  5261. 8002574: e7e8 b.n 8002548 <MqttClientSubTask+0x34>
  5262. 8002576: bf00 nop
  5263. 8002578: 24002174 .word 0x24002174
  5264. 800257c: 0802c554 .word 0x0802c554
  5265. 8002580: 24000670 .word 0x24000670
  5266. 08002584 <MqttClientPubTask>:
  5267. }
  5268. }
  5269. }
  5270. void MqttClientPubTask (void* argument) {
  5271. 8002584: b580 push {r7, lr}
  5272. 8002586: f5ad 7d16 sub.w sp, sp, #600 @ 0x258
  5273. 800258a: af04 add r7, sp, #16
  5274. 800258c: f507 7312 add.w r3, r7, #584 @ 0x248
  5275. 8002590: f5a3 7311 sub.w r3, r3, #580 @ 0x244
  5276. 8002594: 6018 str r0, [r3, #0]
  5277. char messageBuffer[512] = { 0x00 };
  5278. 8002596: f507 7312 add.w r3, r7, #584 @ 0x248
  5279. 800259a: f5a3 7304 sub.w r3, r3, #528 @ 0x210
  5280. 800259e: 2200 movs r2, #0
  5281. 80025a0: 601a str r2, [r3, #0]
  5282. 80025a2: 3304 adds r3, #4
  5283. 80025a4: f44f 72fe mov.w r2, #508 @ 0x1fc
  5284. 80025a8: 2100 movs r1, #0
  5285. 80025aa: 4618 mov r0, r3
  5286. 80025ac: f027 fba0 bl 8029cf0 <memset>
  5287. char topicTextBuffer[32] = { 0x00 };
  5288. 80025b0: f507 7312 add.w r3, r7, #584 @ 0x248
  5289. 80025b4: f5a3 730c sub.w r3, r3, #560 @ 0x230
  5290. 80025b8: 2200 movs r2, #0
  5291. 80025ba: 601a str r2, [r3, #0]
  5292. 80025bc: 3304 adds r3, #4
  5293. 80025be: 2200 movs r2, #0
  5294. 80025c0: 601a str r2, [r3, #0]
  5295. 80025c2: 605a str r2, [r3, #4]
  5296. 80025c4: 609a str r2, [r3, #8]
  5297. 80025c6: 60da str r2, [r3, #12]
  5298. 80025c8: 611a str r2, [r3, #16]
  5299. 80025ca: 615a str r2, [r3, #20]
  5300. 80025cc: 619a str r2, [r3, #24]
  5301. uint32_t bytesInBuffer = 0;
  5302. 80025ce: 2300 movs r3, #0
  5303. 80025d0: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5304. uint8_t boardNumber = 0;
  5305. 80025d4: 2300 movs r3, #0
  5306. 80025d6: f887 3247 strb.w r3, [r7, #583] @ 0x247
  5307. MQTTMessage message;
  5308. while (1) {
  5309. if (mqttClient.isconnected) {
  5310. 80025da: 4b93 ldr r3, [pc, #588] @ (8002828 <MqttClientPubTask+0x2a4>)
  5311. 80025dc: 6a1b ldr r3, [r3, #32]
  5312. 80025de: 2b00 cmp r3, #0
  5313. 80025e0: f000 8293 beq.w 8002b0a <MqttClientPubTask+0x586>
  5314. if (is_link_up ()) {
  5315. 80025e4: f00d f9ea bl 800f9bc <is_link_up>
  5316. 80025e8: 4603 mov r3, r0
  5317. 80025ea: 2b00 cmp r3, #0
  5318. 80025ec: f000 828d beq.w 8002b0a <MqttClientPubTask+0x586>
  5319. for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
  5320. 80025f0: 2300 movs r3, #0
  5321. 80025f2: f887 3247 strb.w r3, [r7, #583] @ 0x247
  5322. 80025f6: e10e b.n 8002816 <MqttClientPubTask+0x292>
  5323. osMutexAcquire (resMeasurementsMutex, osWaitForever);
  5324. 80025f8: 4b8c ldr r3, [pc, #560] @ (800282c <MqttClientPubTask+0x2a8>)
  5325. 80025fa: 681b ldr r3, [r3, #0]
  5326. 80025fc: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  5327. 8002600: 4618 mov r0, r3
  5328. 8002602: f00e fa5f bl 8010ac4 <osMutexAcquire>
  5329. RESMeasurements* resMeas = &resMeasurements[boardNumber];
  5330. 8002606: f897 2247 ldrb.w r2, [r7, #583] @ 0x247
  5331. 800260a: 4613 mov r3, r2
  5332. 800260c: 011b lsls r3, r3, #4
  5333. 800260e: 1a9b subs r3, r3, r2
  5334. 8002610: 009b lsls r3, r3, #2
  5335. 8002612: 4a87 ldr r2, [pc, #540] @ (8002830 <MqttClientPubTask+0x2ac>)
  5336. 8002614: 4413 add r3, r2
  5337. 8002616: f8c7 3238 str.w r3, [r7, #568] @ 0x238
  5338. sprintf (topicTextBuffer, "RESmeasurments/%d", boardNumber + 1);
  5339. 800261a: f897 3247 ldrb.w r3, [r7, #583] @ 0x247
  5340. 800261e: 1c5a adds r2, r3, #1
  5341. 8002620: f107 0318 add.w r3, r7, #24
  5342. 8002624: 4983 ldr r1, [pc, #524] @ (8002834 <MqttClientPubTask+0x2b0>)
  5343. 8002626: 4618 mov r0, r3
  5344. 8002628: f027 fa40 bl 8029aac <siprintf>
  5345. bytesInBuffer = sprintf (messageBuffer, "{\"voltageRMS\":[%.2f, %.2f, %.2f], ", resMeas->voltageRMS[0], resMeas->voltageRMS[1], resMeas->voltageRMS[2]);
  5346. 800262c: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5347. 8002630: edd3 7a00 vldr s15, [r3]
  5348. 8002634: eeb7 5ae7 vcvt.f64.f32 d5, s15
  5349. 8002638: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5350. 800263c: edd3 7a01 vldr s15, [r3, #4]
  5351. 8002640: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5352. 8002644: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5353. 8002648: edd3 6a02 vldr s13, [r3, #8]
  5354. 800264c: eeb7 6ae6 vcvt.f64.f32 d6, s13
  5355. 8002650: f107 0038 add.w r0, r7, #56 @ 0x38
  5356. 8002654: ed8d 6b02 vstr d6, [sp, #8]
  5357. 8002658: ed8d 7b00 vstr d7, [sp]
  5358. 800265c: ec53 2b15 vmov r2, r3, d5
  5359. 8002660: 4975 ldr r1, [pc, #468] @ (8002838 <MqttClientPubTask+0x2b4>)
  5360. 8002662: f027 fa23 bl 8029aac <siprintf>
  5361. 8002666: 4603 mov r3, r0
  5362. 8002668: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5363. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"voltagePeak\":[%.2f, %.2f, %.2f], ", resMeas->voltagePeak[0], resMeas->voltagePeak[1], resMeas->voltagePeak[2]);
  5364. 800266c: f107 0238 add.w r2, r7, #56 @ 0x38
  5365. 8002670: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5366. 8002674: 18d0 adds r0, r2, r3
  5367. 8002676: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5368. 800267a: edd3 7a03 vldr s15, [r3, #12]
  5369. 800267e: eeb7 5ae7 vcvt.f64.f32 d5, s15
  5370. 8002682: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5371. 8002686: edd3 7a04 vldr s15, [r3, #16]
  5372. 800268a: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5373. 800268e: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5374. 8002692: edd3 6a05 vldr s13, [r3, #20]
  5375. 8002696: eeb7 6ae6 vcvt.f64.f32 d6, s13
  5376. 800269a: ed8d 6b02 vstr d6, [sp, #8]
  5377. 800269e: ed8d 7b00 vstr d7, [sp]
  5378. 80026a2: ec53 2b15 vmov r2, r3, d5
  5379. 80026a6: 4965 ldr r1, [pc, #404] @ (800283c <MqttClientPubTask+0x2b8>)
  5380. 80026a8: f027 fa00 bl 8029aac <siprintf>
  5381. 80026ac: 4603 mov r3, r0
  5382. 80026ae: 461a mov r2, r3
  5383. 80026b0: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5384. 80026b4: 4413 add r3, r2
  5385. 80026b6: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5386. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"currentRMS\":[%.3f, %.3f, %.3f], ", resMeas->currentRMS[0], resMeas->currentRMS[1], resMeas->currentRMS[2]);
  5387. 80026ba: f107 0238 add.w r2, r7, #56 @ 0x38
  5388. 80026be: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5389. 80026c2: 18d0 adds r0, r2, r3
  5390. 80026c4: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5391. 80026c8: edd3 7a06 vldr s15, [r3, #24]
  5392. 80026cc: eeb7 5ae7 vcvt.f64.f32 d5, s15
  5393. 80026d0: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5394. 80026d4: edd3 7a07 vldr s15, [r3, #28]
  5395. 80026d8: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5396. 80026dc: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5397. 80026e0: edd3 6a08 vldr s13, [r3, #32]
  5398. 80026e4: eeb7 6ae6 vcvt.f64.f32 d6, s13
  5399. 80026e8: ed8d 6b02 vstr d6, [sp, #8]
  5400. 80026ec: ed8d 7b00 vstr d7, [sp]
  5401. 80026f0: ec53 2b15 vmov r2, r3, d5
  5402. 80026f4: 4952 ldr r1, [pc, #328] @ (8002840 <MqttClientPubTask+0x2bc>)
  5403. 80026f6: f027 f9d9 bl 8029aac <siprintf>
  5404. 80026fa: 4603 mov r3, r0
  5405. 80026fc: 461a mov r2, r3
  5406. 80026fe: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5407. 8002702: 4413 add r3, r2
  5408. 8002704: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5409. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"currentPeak\":[%.3f, %.3f, %.3f], ", resMeas->currentPeak[0], resMeas->currentPeak[1], resMeas->currentPeak[2]);
  5410. 8002708: f107 0238 add.w r2, r7, #56 @ 0x38
  5411. 800270c: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5412. 8002710: 18d0 adds r0, r2, r3
  5413. 8002712: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5414. 8002716: edd3 7a09 vldr s15, [r3, #36] @ 0x24
  5415. 800271a: eeb7 5ae7 vcvt.f64.f32 d5, s15
  5416. 800271e: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5417. 8002722: edd3 7a0a vldr s15, [r3, #40] @ 0x28
  5418. 8002726: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5419. 800272a: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5420. 800272e: edd3 6a0b vldr s13, [r3, #44] @ 0x2c
  5421. 8002732: eeb7 6ae6 vcvt.f64.f32 d6, s13
  5422. 8002736: ed8d 6b02 vstr d6, [sp, #8]
  5423. 800273a: ed8d 7b00 vstr d7, [sp]
  5424. 800273e: ec53 2b15 vmov r2, r3, d5
  5425. 8002742: 4940 ldr r1, [pc, #256] @ (8002844 <MqttClientPubTask+0x2c0>)
  5426. 8002744: f027 f9b2 bl 8029aac <siprintf>
  5427. 8002748: 4603 mov r3, r0
  5428. 800274a: 461a mov r2, r3
  5429. 800274c: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5430. 8002750: 4413 add r3, r2
  5431. 8002752: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5432. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"power\":[%.2f, %.2f, %.2f], ", resMeas->power[0], resMeas->power[1], resMeas->power[2]);
  5433. 8002756: f107 0238 add.w r2, r7, #56 @ 0x38
  5434. 800275a: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5435. 800275e: 18d0 adds r0, r2, r3
  5436. 8002760: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5437. 8002764: edd3 7a0c vldr s15, [r3, #48] @ 0x30
  5438. 8002768: eeb7 5ae7 vcvt.f64.f32 d5, s15
  5439. 800276c: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5440. 8002770: edd3 7a0d vldr s15, [r3, #52] @ 0x34
  5441. 8002774: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5442. 8002778: f8d7 3238 ldr.w r3, [r7, #568] @ 0x238
  5443. 800277c: edd3 6a0e vldr s13, [r3, #56] @ 0x38
  5444. 8002780: eeb7 6ae6 vcvt.f64.f32 d6, s13
  5445. 8002784: ed8d 6b02 vstr d6, [sp, #8]
  5446. 8002788: ed8d 7b00 vstr d7, [sp]
  5447. 800278c: ec53 2b15 vmov r2, r3, d5
  5448. 8002790: 492d ldr r1, [pc, #180] @ (8002848 <MqttClientPubTask+0x2c4>)
  5449. 8002792: f027 f98b bl 8029aac <siprintf>
  5450. 8002796: 4603 mov r3, r0
  5451. 8002798: 461a mov r2, r3
  5452. 800279a: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5453. 800279e: 4413 add r3, r2
  5454. 80027a0: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5455. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"lastSeen\": %ld}", slaveLastSeen[boardNumber]);
  5456. 80027a4: f107 0238 add.w r2, r7, #56 @ 0x38
  5457. 80027a8: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5458. 80027ac: 18d0 adds r0, r2, r3
  5459. 80027ae: f897 3247 ldrb.w r3, [r7, #583] @ 0x247
  5460. 80027b2: 4a26 ldr r2, [pc, #152] @ (800284c <MqttClientPubTask+0x2c8>)
  5461. 80027b4: f852 3023 ldr.w r3, [r2, r3, lsl #2]
  5462. 80027b8: 461a mov r2, r3
  5463. 80027ba: 4925 ldr r1, [pc, #148] @ (8002850 <MqttClientPubTask+0x2cc>)
  5464. 80027bc: f027 f976 bl 8029aac <siprintf>
  5465. 80027c0: 4603 mov r3, r0
  5466. 80027c2: 461a mov r2, r3
  5467. 80027c4: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5468. 80027c8: 4413 add r3, r2
  5469. 80027ca: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5470. osMutexRelease (resMeasurementsMutex);
  5471. 80027ce: 4b17 ldr r3, [pc, #92] @ (800282c <MqttClientPubTask+0x2a8>)
  5472. 80027d0: 681b ldr r3, [r3, #0]
  5473. 80027d2: 4618 mov r0, r3
  5474. 80027d4: f00e f9c1 bl 8010b5a <osMutexRelease>
  5475. message.payload = (void*)messageBuffer;
  5476. 80027d8: f507 7312 add.w r3, r7, #584 @ 0x248
  5477. 80027dc: f5a3 7310 sub.w r3, r3, #576 @ 0x240
  5478. 80027e0: f107 0238 add.w r2, r7, #56 @ 0x38
  5479. 80027e4: 609a str r2, [r3, #8]
  5480. message.payloadlen = strlen (messageBuffer);
  5481. 80027e6: f107 0338 add.w r3, r7, #56 @ 0x38
  5482. 80027ea: 4618 mov r0, r3
  5483. 80027ec: f7fd fdd8 bl 80003a0 <strlen>
  5484. 80027f0: 4602 mov r2, r0
  5485. 80027f2: f507 7312 add.w r3, r7, #584 @ 0x248
  5486. 80027f6: f5a3 7310 sub.w r3, r3, #576 @ 0x240
  5487. 80027fa: 60da str r2, [r3, #12]
  5488. MQTTPublish (&mqttClient, topicTextBuffer, &message); // publish a message
  5489. 80027fc: f107 0208 add.w r2, r7, #8
  5490. 8002800: f107 0318 add.w r3, r7, #24
  5491. 8002804: 4619 mov r1, r3
  5492. 8002806: 4808 ldr r0, [pc, #32] @ (8002828 <MqttClientPubTask+0x2a4>)
  5493. 8002808: f024 fc69 bl 80270de <MQTTPublish>
  5494. for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
  5495. 800280c: f897 3247 ldrb.w r3, [r7, #583] @ 0x247
  5496. 8002810: 3301 adds r3, #1
  5497. 8002812: f887 3247 strb.w r3, [r7, #583] @ 0x247
  5498. 8002816: f897 3247 ldrb.w r3, [r7, #583] @ 0x247
  5499. 800281a: 2b03 cmp r3, #3
  5500. 800281c: f67f aeec bls.w 80025f8 <MqttClientPubTask+0x74>
  5501. }
  5502. for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
  5503. 8002820: 2300 movs r3, #0
  5504. 8002822: f887 3247 strb.w r3, [r7, #583] @ 0x247
  5505. 8002826: e16b b.n 8002b00 <MqttClientPubTask+0x57c>
  5506. 8002828: 24000670 .word 0x24000670
  5507. 800282c: 24002168 .word 0x24002168
  5508. 8002830: 24001fc8 .word 0x24001fc8
  5509. 8002834: 0802c568 .word 0x0802c568
  5510. 8002838: 0802c57c .word 0x0802c57c
  5511. 800283c: 0802c5a0 .word 0x0802c5a0
  5512. 8002840: 0802c5c4 .word 0x0802c5c4
  5513. 8002844: 0802c5e8 .word 0x0802c5e8
  5514. 8002848: 0802c60c .word 0x0802c60c
  5515. 800284c: 24002158 .word 0x24002158
  5516. 8002850: 0802c62c .word 0x0802c62c
  5517. osMutexAcquire (sensorsInfoMutex, osWaitForever);
  5518. 8002854: 4baf ldr r3, [pc, #700] @ (8002b14 <MqttClientPubTask+0x590>)
  5519. 8002856: 681b ldr r3, [r3, #0]
  5520. 8002858: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  5521. 800285c: 4618 mov r0, r3
  5522. 800285e: f00e f931 bl 8010ac4 <osMutexAcquire>
  5523. SesnorsInfo* sensors = &sensorsInfo[boardNumber];
  5524. 8002862: f897 2247 ldrb.w r2, [r7, #583] @ 0x247
  5525. 8002866: 4613 mov r3, r2
  5526. 8002868: 009b lsls r3, r3, #2
  5527. 800286a: 4413 add r3, r2
  5528. 800286c: 00db lsls r3, r3, #3
  5529. 800286e: 4aaa ldr r2, [pc, #680] @ (8002b18 <MqttClientPubTask+0x594>)
  5530. 8002870: 4413 add r3, r2
  5531. 8002872: f8c7 323c str.w r3, [r7, #572] @ 0x23c
  5532. sprintf (topicTextBuffer, "Sensors/%d", boardNumber + 1);
  5533. 8002876: f897 3247 ldrb.w r3, [r7, #583] @ 0x247
  5534. 800287a: 1c5a adds r2, r3, #1
  5535. 800287c: f107 0318 add.w r3, r7, #24
  5536. 8002880: 49a6 ldr r1, [pc, #664] @ (8002b1c <MqttClientPubTask+0x598>)
  5537. 8002882: 4618 mov r0, r3
  5538. 8002884: f027 f912 bl 8029aac <siprintf>
  5539. bytesInBuffer = sprintf (messageBuffer, "{\"pvTemperature\":[%.1f, %.1f], ", sensors->pvTemperature[0], sensors->pvTemperature[1]);
  5540. 8002888: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5541. 800288c: edd3 7a00 vldr s15, [r3]
  5542. 8002890: eeb7 6ae7 vcvt.f64.f32 d6, s15
  5543. 8002894: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5544. 8002898: edd3 7a01 vldr s15, [r3, #4]
  5545. 800289c: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5546. 80028a0: f107 0038 add.w r0, r7, #56 @ 0x38
  5547. 80028a4: ed8d 7b00 vstr d7, [sp]
  5548. 80028a8: ec53 2b16 vmov r2, r3, d6
  5549. 80028ac: 499c ldr r1, [pc, #624] @ (8002b20 <MqttClientPubTask+0x59c>)
  5550. 80028ae: f027 f8fd bl 8029aac <siprintf>
  5551. 80028b2: 4603 mov r3, r0
  5552. 80028b4: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5553. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"fanVoltage\":%.2f, ", sensors->fanVoltage);
  5554. 80028b8: f107 0238 add.w r2, r7, #56 @ 0x38
  5555. 80028bc: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5556. 80028c0: 18d0 adds r0, r2, r3
  5557. 80028c2: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5558. 80028c6: edd3 7a02 vldr s15, [r3, #8]
  5559. 80028ca: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5560. 80028ce: ec53 2b17 vmov r2, r3, d7
  5561. 80028d2: 4994 ldr r1, [pc, #592] @ (8002b24 <MqttClientPubTask+0x5a0>)
  5562. 80028d4: f027 f8ea bl 8029aac <siprintf>
  5563. 80028d8: 4603 mov r3, r0
  5564. 80028da: 461a mov r2, r3
  5565. 80028dc: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5566. 80028e0: 4413 add r3, r2
  5567. 80028e2: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5568. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"pvEncoder\":%.2f, ", sensors->pvEncoder);
  5569. 80028e6: f107 0238 add.w r2, r7, #56 @ 0x38
  5570. 80028ea: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5571. 80028ee: 18d0 adds r0, r2, r3
  5572. 80028f0: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5573. 80028f4: edd3 7a03 vldr s15, [r3, #12]
  5574. 80028f8: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5575. 80028fc: ec53 2b17 vmov r2, r3, d7
  5576. 8002900: 4989 ldr r1, [pc, #548] @ (8002b28 <MqttClientPubTask+0x5a4>)
  5577. 8002902: f027 f8d3 bl 8029aac <siprintf>
  5578. 8002906: 4603 mov r3, r0
  5579. 8002908: 461a mov r2, r3
  5580. 800290a: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5581. 800290e: 4413 add r3, r2
  5582. 8002910: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5583. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorXStatus\":%d, ", sensors->motorXStatus);
  5584. 8002914: f107 0238 add.w r2, r7, #56 @ 0x38
  5585. 8002918: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5586. 800291c: 18d0 adds r0, r2, r3
  5587. 800291e: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5588. 8002922: 7c1b ldrb r3, [r3, #16]
  5589. 8002924: 461a mov r2, r3
  5590. 8002926: 4981 ldr r1, [pc, #516] @ (8002b2c <MqttClientPubTask+0x5a8>)
  5591. 8002928: f027 f8c0 bl 8029aac <siprintf>
  5592. 800292c: 4603 mov r3, r0
  5593. 800292e: 461a mov r2, r3
  5594. 8002930: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5595. 8002934: 4413 add r3, r2
  5596. 8002936: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5597. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorYStatus\":%d, ", sensors->motorYStatus);
  5598. 800293a: f107 0238 add.w r2, r7, #56 @ 0x38
  5599. 800293e: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5600. 8002942: 18d0 adds r0, r2, r3
  5601. 8002944: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5602. 8002948: 7c5b ldrb r3, [r3, #17]
  5603. 800294a: 461a mov r2, r3
  5604. 800294c: 4978 ldr r1, [pc, #480] @ (8002b30 <MqttClientPubTask+0x5ac>)
  5605. 800294e: f027 f8ad bl 8029aac <siprintf>
  5606. 8002952: 4603 mov r3, r0
  5607. 8002954: 461a mov r2, r3
  5608. 8002956: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5609. 800295a: 4413 add r3, r2
  5610. 800295c: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5611. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorXAveCurrent\":%.3f, ", sensors->motorXAveCurrent);
  5612. 8002960: f107 0238 add.w r2, r7, #56 @ 0x38
  5613. 8002964: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5614. 8002968: 18d0 adds r0, r2, r3
  5615. 800296a: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5616. 800296e: edd3 7a05 vldr s15, [r3, #20]
  5617. 8002972: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5618. 8002976: ec53 2b17 vmov r2, r3, d7
  5619. 800297a: 496e ldr r1, [pc, #440] @ (8002b34 <MqttClientPubTask+0x5b0>)
  5620. 800297c: f027 f896 bl 8029aac <siprintf>
  5621. 8002980: 4603 mov r3, r0
  5622. 8002982: 461a mov r2, r3
  5623. 8002984: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5624. 8002988: 4413 add r3, r2
  5625. 800298a: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5626. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorYAveCurrent\":%.3f, ", sensors->motorYAveCurrent);
  5627. 800298e: f107 0238 add.w r2, r7, #56 @ 0x38
  5628. 8002992: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5629. 8002996: 18d0 adds r0, r2, r3
  5630. 8002998: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5631. 800299c: edd3 7a06 vldr s15, [r3, #24]
  5632. 80029a0: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5633. 80029a4: ec53 2b17 vmov r2, r3, d7
  5634. 80029a8: 4963 ldr r1, [pc, #396] @ (8002b38 <MqttClientPubTask+0x5b4>)
  5635. 80029aa: f027 f87f bl 8029aac <siprintf>
  5636. 80029ae: 4603 mov r3, r0
  5637. 80029b0: 461a mov r2, r3
  5638. 80029b2: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5639. 80029b6: 4413 add r3, r2
  5640. 80029b8: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5641. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorXPeakCurrent\":%.3f, ", sensors->motorXPeakCurrent);
  5642. 80029bc: f107 0238 add.w r2, r7, #56 @ 0x38
  5643. 80029c0: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5644. 80029c4: 18d0 adds r0, r2, r3
  5645. 80029c6: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5646. 80029ca: edd3 7a07 vldr s15, [r3, #28]
  5647. 80029ce: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5648. 80029d2: ec53 2b17 vmov r2, r3, d7
  5649. 80029d6: 4959 ldr r1, [pc, #356] @ (8002b3c <MqttClientPubTask+0x5b8>)
  5650. 80029d8: f027 f868 bl 8029aac <siprintf>
  5651. 80029dc: 4603 mov r3, r0
  5652. 80029de: 461a mov r2, r3
  5653. 80029e0: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5654. 80029e4: 4413 add r3, r2
  5655. 80029e6: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5656. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorYPeakCurrent\":%.3f, ", sensors->motorYPeakCurrent);
  5657. 80029ea: f107 0238 add.w r2, r7, #56 @ 0x38
  5658. 80029ee: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5659. 80029f2: 18d0 adds r0, r2, r3
  5660. 80029f4: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5661. 80029f8: edd3 7a08 vldr s15, [r3, #32]
  5662. 80029fc: eeb7 7ae7 vcvt.f64.f32 d7, s15
  5663. 8002a00: ec53 2b17 vmov r2, r3, d7
  5664. 8002a04: 494e ldr r1, [pc, #312] @ (8002b40 <MqttClientPubTask+0x5bc>)
  5665. 8002a06: f027 f851 bl 8029aac <siprintf>
  5666. 8002a0a: 4603 mov r3, r0
  5667. 8002a0c: 461a mov r2, r3
  5668. 8002a0e: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5669. 8002a12: 4413 add r3, r2
  5670. 8002a14: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5671. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitSwitchUp\":%d, ", sensors->limitSwitchUp);
  5672. 8002a18: f107 0238 add.w r2, r7, #56 @ 0x38
  5673. 8002a1c: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5674. 8002a20: 18d0 adds r0, r2, r3
  5675. 8002a22: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5676. 8002a26: f893 3024 ldrb.w r3, [r3, #36] @ 0x24
  5677. 8002a2a: 461a mov r2, r3
  5678. 8002a2c: 4945 ldr r1, [pc, #276] @ (8002b44 <MqttClientPubTask+0x5c0>)
  5679. 8002a2e: f027 f83d bl 8029aac <siprintf>
  5680. 8002a32: 4603 mov r3, r0
  5681. 8002a34: 461a mov r2, r3
  5682. 8002a36: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5683. 8002a3a: 4413 add r3, r2
  5684. 8002a3c: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5685. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitSwitchDown\":%d, ", sensors->limitSwitchDown);
  5686. 8002a40: f107 0238 add.w r2, r7, #56 @ 0x38
  5687. 8002a44: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5688. 8002a48: 18d0 adds r0, r2, r3
  5689. 8002a4a: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5690. 8002a4e: f893 3025 ldrb.w r3, [r3, #37] @ 0x25
  5691. 8002a52: 461a mov r2, r3
  5692. 8002a54: 493c ldr r1, [pc, #240] @ (8002b48 <MqttClientPubTask+0x5c4>)
  5693. 8002a56: f027 f829 bl 8029aac <siprintf>
  5694. 8002a5a: 4603 mov r3, r0
  5695. 8002a5c: 461a mov r2, r3
  5696. 8002a5e: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5697. 8002a62: 4413 add r3, r2
  5698. 8002a64: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5699. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitSwitchCenter\":%d, ", sensors->limitSwitchCenter);
  5700. 8002a68: f107 0238 add.w r2, r7, #56 @ 0x38
  5701. 8002a6c: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5702. 8002a70: 18d0 adds r0, r2, r3
  5703. 8002a72: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5704. 8002a76: f893 3026 ldrb.w r3, [r3, #38] @ 0x26
  5705. 8002a7a: 461a mov r2, r3
  5706. 8002a7c: 4933 ldr r1, [pc, #204] @ (8002b4c <MqttClientPubTask+0x5c8>)
  5707. 8002a7e: f027 f815 bl 8029aac <siprintf>
  5708. 8002a82: 4603 mov r3, r0
  5709. 8002a84: 461a mov r2, r3
  5710. 8002a86: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5711. 8002a8a: 4413 add r3, r2
  5712. 8002a8c: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5713. bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"powerSupplyFailMask\":%d}", sensors->powerSupplyFailMask);
  5714. 8002a90: f107 0238 add.w r2, r7, #56 @ 0x38
  5715. 8002a94: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5716. 8002a98: 18d0 adds r0, r2, r3
  5717. 8002a9a: f8d7 323c ldr.w r3, [r7, #572] @ 0x23c
  5718. 8002a9e: f893 3027 ldrb.w r3, [r3, #39] @ 0x27
  5719. 8002aa2: 461a mov r2, r3
  5720. 8002aa4: 492a ldr r1, [pc, #168] @ (8002b50 <MqttClientPubTask+0x5cc>)
  5721. 8002aa6: f027 f801 bl 8029aac <siprintf>
  5722. 8002aaa: 4603 mov r3, r0
  5723. 8002aac: 461a mov r2, r3
  5724. 8002aae: f8d7 3240 ldr.w r3, [r7, #576] @ 0x240
  5725. 8002ab2: 4413 add r3, r2
  5726. 8002ab4: f8c7 3240 str.w r3, [r7, #576] @ 0x240
  5727. osMutexRelease (sensorsInfoMutex);
  5728. 8002ab8: 4b16 ldr r3, [pc, #88] @ (8002b14 <MqttClientPubTask+0x590>)
  5729. 8002aba: 681b ldr r3, [r3, #0]
  5730. 8002abc: 4618 mov r0, r3
  5731. 8002abe: f00e f84c bl 8010b5a <osMutexRelease>
  5732. message.payload = (void*)messageBuffer;
  5733. 8002ac2: f507 7312 add.w r3, r7, #584 @ 0x248
  5734. 8002ac6: f5a3 7310 sub.w r3, r3, #576 @ 0x240
  5735. 8002aca: f107 0238 add.w r2, r7, #56 @ 0x38
  5736. 8002ace: 609a str r2, [r3, #8]
  5737. message.payloadlen = strlen (messageBuffer);
  5738. 8002ad0: f107 0338 add.w r3, r7, #56 @ 0x38
  5739. 8002ad4: 4618 mov r0, r3
  5740. 8002ad6: f7fd fc63 bl 80003a0 <strlen>
  5741. 8002ada: 4602 mov r2, r0
  5742. 8002adc: f507 7312 add.w r3, r7, #584 @ 0x248
  5743. 8002ae0: f5a3 7310 sub.w r3, r3, #576 @ 0x240
  5744. 8002ae4: 60da str r2, [r3, #12]
  5745. MQTTPublish (&mqttClient, topicTextBuffer, &message); // publish a message
  5746. 8002ae6: f107 0208 add.w r2, r7, #8
  5747. 8002aea: f107 0318 add.w r3, r7, #24
  5748. 8002aee: 4619 mov r1, r3
  5749. 8002af0: 4818 ldr r0, [pc, #96] @ (8002b54 <MqttClientPubTask+0x5d0>)
  5750. 8002af2: f024 faf4 bl 80270de <MQTTPublish>
  5751. for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
  5752. 8002af6: f897 3247 ldrb.w r3, [r7, #583] @ 0x247
  5753. 8002afa: 3301 adds r3, #1
  5754. 8002afc: f887 3247 strb.w r3, [r7, #583] @ 0x247
  5755. 8002b00: f897 3247 ldrb.w r3, [r7, #583] @ 0x247
  5756. 8002b04: 2b03 cmp r3, #3
  5757. 8002b06: f67f aea5 bls.w 8002854 <MqttClientPubTask+0x2d0>
  5758. }
  5759. }
  5760. }
  5761. osDelay (pdMS_TO_TICKS (1000));
  5762. 8002b0a: f44f 707a mov.w r0, #1000 @ 0x3e8
  5763. 8002b0e: f00d ff38 bl 8010982 <osDelay>
  5764. if (mqttClient.isconnected) {
  5765. 8002b12: e562 b.n 80025da <MqttClientPubTask+0x56>
  5766. 8002b14: 2400216c .word 0x2400216c
  5767. 8002b18: 240020b8 .word 0x240020b8
  5768. 8002b1c: 0802c640 .word 0x0802c640
  5769. 8002b20: 0802c64c .word 0x0802c64c
  5770. 8002b24: 0802c66c .word 0x0802c66c
  5771. 8002b28: 0802c680 .word 0x0802c680
  5772. 8002b2c: 0802c694 .word 0x0802c694
  5773. 8002b30: 0802c6a8 .word 0x0802c6a8
  5774. 8002b34: 0802c6bc .word 0x0802c6bc
  5775. 8002b38: 0802c6d8 .word 0x0802c6d8
  5776. 8002b3c: 0802c6f4 .word 0x0802c6f4
  5777. 8002b40: 0802c710 .word 0x0802c710
  5778. 8002b44: 0802c72c .word 0x0802c72c
  5779. 8002b48: 0802c744 .word 0x0802c744
  5780. 8002b4c: 0802c75c .word 0x0802c75c
  5781. 8002b50: 0802c778 .word 0x0802c778
  5782. 8002b54: 24000670 .word 0x24000670
  5783. 08002b58 <MqttConnectBroker>:
  5784. }
  5785. }
  5786. int MqttConnectBroker () {
  5787. 8002b58: b580 push {r7, lr}
  5788. 8002b5a: b09c sub sp, #112 @ 0x70
  5789. 8002b5c: af04 add r7, sp, #16
  5790. uint8_t boardNumber = 0;
  5791. 8002b5e: 2300 movs r3, #0
  5792. 8002b60: f887 305f strb.w r3, [r7, #95] @ 0x5f
  5793. int ret;
  5794. NewNetwork (&net);
  5795. 8002b64: 4839 ldr r0, [pc, #228] @ (8002c4c <MqttConnectBroker+0xf4>)
  5796. 8002b66: f024 fbf3 bl 8027350 <NewNetwork>
  5797. ret = ConnectNetwork (&net, BROKER_IP, MQTT_PORT);
  5798. 8002b6a: f240 725b movw r2, #1883 @ 0x75b
  5799. 8002b6e: 4938 ldr r1, [pc, #224] @ (8002c50 <MqttConnectBroker+0xf8>)
  5800. 8002b70: 4836 ldr r0, [pc, #216] @ (8002c4c <MqttConnectBroker+0xf4>)
  5801. 8002b72: f024 fc09 bl 8027388 <ConnectNetwork>
  5802. 8002b76: 65b8 str r0, [r7, #88] @ 0x58
  5803. if (ret != MQTT_SUCCESS) {
  5804. 8002b78: 6dbb ldr r3, [r7, #88] @ 0x58
  5805. 8002b7a: 2b00 cmp r3, #0
  5806. 8002b7c: d005 beq.n 8002b8a <MqttConnectBroker+0x32>
  5807. printf ("ConnectNetwork failed.\n");
  5808. 8002b7e: 4835 ldr r0, [pc, #212] @ (8002c54 <MqttConnectBroker+0xfc>)
  5809. 8002b80: f026 ff8c bl 8029a9c <puts>
  5810. return -1;
  5811. 8002b84: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  5812. 8002b88: e05c b.n 8002c44 <MqttConnectBroker+0xec>
  5813. }
  5814. MQTTClientInit (&mqttClient, &net, 1000, sndBuffer, sizeof (sndBuffer), rcvBuffer, sizeof (rcvBuffer));
  5815. 8002b8a: f44f 6380 mov.w r3, #1024 @ 0x400
  5816. 8002b8e: 9302 str r3, [sp, #8]
  5817. 8002b90: 4b31 ldr r3, [pc, #196] @ (8002c58 <MqttConnectBroker+0x100>)
  5818. 8002b92: 9301 str r3, [sp, #4]
  5819. 8002b94: f44f 6380 mov.w r3, #1024 @ 0x400
  5820. 8002b98: 9300 str r3, [sp, #0]
  5821. 8002b9a: 4b30 ldr r3, [pc, #192] @ (8002c5c <MqttConnectBroker+0x104>)
  5822. 8002b9c: f44f 727a mov.w r2, #1000 @ 0x3e8
  5823. 8002ba0: 492a ldr r1, [pc, #168] @ (8002c4c <MqttConnectBroker+0xf4>)
  5824. 8002ba2: 482f ldr r0, [pc, #188] @ (8002c60 <MqttConnectBroker+0x108>)
  5825. 8002ba4: f023 fd0e bl 80265c4 <MQTTClientInit>
  5826. MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
  5827. 8002ba8: 4a2e ldr r2, [pc, #184] @ (8002c64 <MqttConnectBroker+0x10c>)
  5828. 8002baa: 463b mov r3, r7
  5829. 8002bac: 4611 mov r1, r2
  5830. 8002bae: 2258 movs r2, #88 @ 0x58
  5831. 8002bb0: 4618 mov r0, r3
  5832. 8002bb2: f027 f994 bl 8029ede <memcpy>
  5833. data.willFlag = 0;
  5834. 8002bb6: 2300 movs r3, #0
  5835. 8002bb8: 76fb strb r3, [r7, #27]
  5836. data.MQTTVersion = 3;
  5837. 8002bba: 2303 movs r3, #3
  5838. 8002bbc: 723b strb r3, [r7, #8]
  5839. data.clientID.cstring = "test_user1";
  5840. 8002bbe: 4b2a ldr r3, [pc, #168] @ (8002c68 <MqttConnectBroker+0x110>)
  5841. 8002bc0: 60fb str r3, [r7, #12]
  5842. data.username.cstring = "test_user1";
  5843. 8002bc2: 4b29 ldr r3, [pc, #164] @ (8002c68 <MqttConnectBroker+0x110>)
  5844. 8002bc4: 643b str r3, [r7, #64] @ 0x40
  5845. data.password.cstring = "1234";
  5846. 8002bc6: 4b29 ldr r3, [pc, #164] @ (8002c6c <MqttConnectBroker+0x114>)
  5847. 8002bc8: 64fb str r3, [r7, #76] @ 0x4c
  5848. data.keepAliveInterval = 100;
  5849. 8002bca: 2364 movs r3, #100 @ 0x64
  5850. 8002bcc: 833b strh r3, [r7, #24]
  5851. data.cleansession = 1;
  5852. 8002bce: 2301 movs r3, #1
  5853. 8002bd0: 76bb strb r3, [r7, #26]
  5854. ret = MQTTConnect (&mqttClient, &data);
  5855. 8002bd2: 463b mov r3, r7
  5856. 8002bd4: 4619 mov r1, r3
  5857. 8002bd6: 4822 ldr r0, [pc, #136] @ (8002c60 <MqttConnectBroker+0x108>)
  5858. 8002bd8: f024 f950 bl 8026e7c <MQTTConnect>
  5859. 8002bdc: 65b8 str r0, [r7, #88] @ 0x58
  5860. if (ret != MQTT_SUCCESS) {
  5861. 8002bde: 6dbb ldr r3, [r7, #88] @ 0x58
  5862. 8002be0: 2b00 cmp r3, #0
  5863. 8002be2: d008 beq.n 8002bf6 <MqttConnectBroker+0x9e>
  5864. net_disconnect (&net);
  5865. 8002be4: 4819 ldr r0, [pc, #100] @ (8002c4c <MqttConnectBroker+0xf4>)
  5866. 8002be6: f024 fc58 bl 802749a <net_disconnect>
  5867. printf ("MQTTConnect failed. Code %d\n", ret);
  5868. 8002bea: 6db9 ldr r1, [r7, #88] @ 0x58
  5869. 8002bec: 4820 ldr r0, [pc, #128] @ (8002c70 <MqttConnectBroker+0x118>)
  5870. 8002bee: f026 feed bl 80299cc <iprintf>
  5871. return ret;
  5872. 8002bf2: 6dbb ldr r3, [r7, #88] @ 0x58
  5873. 8002bf4: e026 b.n 8002c44 <MqttConnectBroker+0xec>
  5874. }
  5875. for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
  5876. 8002bf6: 2300 movs r3, #0
  5877. 8002bf8: f887 305f strb.w r3, [r7, #95] @ 0x5f
  5878. 8002bfc: e01a b.n 8002c34 <MqttConnectBroker+0xdc>
  5879. ret = MQTTSubscribe (&mqttClient, subscribeTopicNames[boardNumber], QOS0, MqttMessageArrived);
  5880. 8002bfe: f897 305f ldrb.w r3, [r7, #95] @ 0x5f
  5881. 8002c02: 4a1c ldr r2, [pc, #112] @ (8002c74 <MqttConnectBroker+0x11c>)
  5882. 8002c04: f852 1023 ldr.w r1, [r2, r3, lsl #2]
  5883. 8002c08: 4b1b ldr r3, [pc, #108] @ (8002c78 <MqttConnectBroker+0x120>)
  5884. 8002c0a: 2200 movs r2, #0
  5885. 8002c0c: 4814 ldr r0, [pc, #80] @ (8002c60 <MqttConnectBroker+0x108>)
  5886. 8002c0e: f024 fa50 bl 80270b2 <MQTTSubscribe>
  5887. 8002c12: 65b8 str r0, [r7, #88] @ 0x58
  5888. if (ret != MQTT_SUCCESS) {
  5889. 8002c14: 6dbb ldr r3, [r7, #88] @ 0x58
  5890. 8002c16: 2b00 cmp r3, #0
  5891. 8002c18: d007 beq.n 8002c2a <MqttConnectBroker+0xd2>
  5892. net_disconnect (&net);
  5893. 8002c1a: 480c ldr r0, [pc, #48] @ (8002c4c <MqttConnectBroker+0xf4>)
  5894. 8002c1c: f024 fc3d bl 802749a <net_disconnect>
  5895. printf ("MQTTSubscribe failed.\n");
  5896. 8002c20: 4816 ldr r0, [pc, #88] @ (8002c7c <MqttConnectBroker+0x124>)
  5897. 8002c22: f026 ff3b bl 8029a9c <puts>
  5898. return ret;
  5899. 8002c26: 6dbb ldr r3, [r7, #88] @ 0x58
  5900. 8002c28: e00c b.n 8002c44 <MqttConnectBroker+0xec>
  5901. for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
  5902. 8002c2a: f897 305f ldrb.w r3, [r7, #95] @ 0x5f
  5903. 8002c2e: 3301 adds r3, #1
  5904. 8002c30: f887 305f strb.w r3, [r7, #95] @ 0x5f
  5905. 8002c34: f897 305f ldrb.w r3, [r7, #95] @ 0x5f
  5906. 8002c38: 2b03 cmp r3, #3
  5907. 8002c3a: d9e0 bls.n 8002bfe <MqttConnectBroker+0xa6>
  5908. }
  5909. }
  5910. printf ("MQTT_ConnectBroker O.K.\n");
  5911. 8002c3c: 4810 ldr r0, [pc, #64] @ (8002c80 <MqttConnectBroker+0x128>)
  5912. 8002c3e: f026 ff2d bl 8029a9c <puts>
  5913. return MQTT_SUCCESS;
  5914. 8002c42: 2300 movs r3, #0
  5915. }
  5916. 8002c44: 4618 mov r0, r3
  5917. 8002c46: 3760 adds r7, #96 @ 0x60
  5918. 8002c48: 46bd mov sp, r7
  5919. 8002c4a: bd80 pop {r7, pc}
  5920. 8002c4c: 24000660 .word 0x24000660
  5921. 8002c50: 0802c794 .word 0x0802c794
  5922. 8002c54: 0802c7a4 .word 0x0802c7a4
  5923. 8002c58: 24000adc .word 0x24000adc
  5924. 8002c5c: 240006dc .word 0x240006dc
  5925. 8002c60: 24000670 .word 0x24000670
  5926. 8002c64: 0802c820 .word 0x0802c820
  5927. 8002c68: 0802c7bc .word 0x0802c7bc
  5928. 8002c6c: 0802c7c8 .word 0x0802c7c8
  5929. 8002c70: 0802c7d0 .word 0x0802c7d0
  5930. 8002c74: 080309b4 .word 0x080309b4
  5931. 8002c78: 08002c85 .word 0x08002c85
  5932. 8002c7c: 0802c7f0 .word 0x0802c7f0
  5933. 8002c80: 0802c808 .word 0x0802c808
  5934. 08002c84 <MqttMessageArrived>:
  5935. void MqttMessageArrived (MessageData* msg) {
  5936. 8002c84: b580 push {r7, lr}
  5937. 8002c86: b096 sub sp, #88 @ 0x58
  5938. 8002c88: af00 add r7, sp, #0
  5939. 8002c8a: 6078 str r0, [r7, #4]
  5940. SerialProtocolCommands spCommand = spUnknown;
  5941. 8002c8c: 2308 movs r3, #8
  5942. 8002c8e: f887 3057 strb.w r3, [r7, #87] @ 0x57
  5943. BoardNoOverTopic topicForBoard = unknownBoard;
  5944. 8002c92: 2305 movs r3, #5
  5945. 8002c94: f887 3056 strb.w r3, [r7, #86] @ 0x56
  5946. uint8_t boardNumber = 0;
  5947. 8002c98: 2300 movs r3, #0
  5948. 8002c9a: f887 3055 strb.w r3, [r7, #85] @ 0x55
  5949. MQTTMessage* message = msg->message;
  5950. 8002c9e: 687b ldr r3, [r7, #4]
  5951. 8002ca0: 681b ldr r3, [r3, #0]
  5952. 8002ca2: 64bb str r3, [r7, #72] @ 0x48
  5953. char topicName[32] = { 0 };
  5954. 8002ca4: 2300 movs r3, #0
  5955. 8002ca6: 61bb str r3, [r7, #24]
  5956. 8002ca8: f107 031c add.w r3, r7, #28
  5957. 8002cac: 2200 movs r2, #0
  5958. 8002cae: 601a str r2, [r3, #0]
  5959. 8002cb0: 605a str r2, [r3, #4]
  5960. 8002cb2: 609a str r2, [r3, #8]
  5961. 8002cb4: 60da str r2, [r3, #12]
  5962. 8002cb6: 611a str r2, [r3, #16]
  5963. 8002cb8: 615a str r2, [r3, #20]
  5964. 8002cba: 619a str r2, [r3, #24]
  5965. memcpy (topicName, msg->topicName->lenstring.data, msg->topicName->lenstring.len);
  5966. 8002cbc: 687b ldr r3, [r7, #4]
  5967. 8002cbe: 685b ldr r3, [r3, #4]
  5968. 8002cc0: 6899 ldr r1, [r3, #8]
  5969. 8002cc2: 687b ldr r3, [r7, #4]
  5970. 8002cc4: 685b ldr r3, [r3, #4]
  5971. 8002cc6: 685b ldr r3, [r3, #4]
  5972. 8002cc8: 461a mov r2, r3
  5973. 8002cca: f107 0318 add.w r3, r7, #24
  5974. 8002cce: 4618 mov r0, r3
  5975. 8002cd0: f027 f905 bl 8029ede <memcpy>
  5976. for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
  5977. 8002cd4: 2300 movs r3, #0
  5978. 8002cd6: f887 3055 strb.w r3, [r7, #85] @ 0x55
  5979. 8002cda: e017 b.n 8002d0c <MqttMessageArrived+0x88>
  5980. if (strcmp (topicName, subscribeTopicNames[boardNumber]) == 0) {
  5981. 8002cdc: f897 3055 ldrb.w r3, [r7, #85] @ 0x55
  5982. 8002ce0: 4a8c ldr r2, [pc, #560] @ (8002f14 <MqttMessageArrived+0x290>)
  5983. 8002ce2: f852 2023 ldr.w r2, [r2, r3, lsl #2]
  5984. 8002ce6: f107 0318 add.w r3, r7, #24
  5985. 8002cea: 4611 mov r1, r2
  5986. 8002cec: 4618 mov r0, r3
  5987. 8002cee: f7fd faf7 bl 80002e0 <strcmp>
  5988. 8002cf2: 4603 mov r3, r0
  5989. 8002cf4: 2b00 cmp r3, #0
  5990. 8002cf6: d104 bne.n 8002d02 <MqttMessageArrived+0x7e>
  5991. topicForBoard = (BoardNoOverTopic)(boardNumber + 1);
  5992. 8002cf8: f897 3055 ldrb.w r3, [r7, #85] @ 0x55
  5993. 8002cfc: 3301 adds r3, #1
  5994. 8002cfe: f887 3056 strb.w r3, [r7, #86] @ 0x56
  5995. for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
  5996. 8002d02: f897 3055 ldrb.w r3, [r7, #85] @ 0x55
  5997. 8002d06: 3301 adds r3, #1
  5998. 8002d08: f887 3055 strb.w r3, [r7, #85] @ 0x55
  5999. 8002d0c: f897 3055 ldrb.w r3, [r7, #85] @ 0x55
  6000. 8002d10: 2b03 cmp r3, #3
  6001. 8002d12: d9e3 bls.n 8002cdc <MqttMessageArrived+0x58>
  6002. }
  6003. }
  6004. cJSON* json = cJSON_Parse (message->payload);
  6005. 8002d14: 6cbb ldr r3, [r7, #72] @ 0x48
  6006. 8002d16: 689b ldr r3, [r3, #8]
  6007. 8002d18: 4618 mov r0, r3
  6008. 8002d1a: f7fe fc1b bl 8001554 <cJSON_Parse>
  6009. 8002d1e: 6478 str r0, [r7, #68] @ 0x44
  6010. const cJSON* objectItem = NULL;
  6011. 8002d20: 2300 movs r3, #0
  6012. 8002d22: 643b str r3, [r7, #64] @ 0x40
  6013. InterProcessData data = { 0 };
  6014. 8002d24: f107 030c add.w r3, r7, #12
  6015. 8002d28: 2200 movs r2, #0
  6016. 8002d2a: 601a str r2, [r3, #0]
  6017. 8002d2c: 605a str r2, [r3, #4]
  6018. 8002d2e: 609a str r2, [r3, #8]
  6019. for (int topicCmdNumber = 0; topicCmdNumber < 6; topicCmdNumber++) {
  6020. 8002d30: 2300 movs r3, #0
  6021. 8002d32: 653b str r3, [r7, #80] @ 0x50
  6022. 8002d34: e0d8 b.n 8002ee8 <MqttMessageArrived+0x264>
  6023. spCommand = spUnknown;
  6024. 8002d36: 2308 movs r3, #8
  6025. 8002d38: f887 3057 strb.w r3, [r7, #87] @ 0x57
  6026. objectItem = cJSON_GetObjectItemCaseSensitive (json, topicCommands[topicCmdNumber]);
  6027. 8002d3c: 4a76 ldr r2, [pc, #472] @ (8002f18 <MqttMessageArrived+0x294>)
  6028. 8002d3e: 6d3b ldr r3, [r7, #80] @ 0x50
  6029. 8002d40: f852 3023 ldr.w r3, [r2, r3, lsl #2]
  6030. 8002d44: 4619 mov r1, r3
  6031. 8002d46: 6c78 ldr r0, [r7, #68] @ 0x44
  6032. 8002d48: f7fe ff6e bl 8001c28 <cJSON_GetObjectItemCaseSensitive>
  6033. 8002d4c: 6438 str r0, [r7, #64] @ 0x40
  6034. if (objectItem != NULL) {
  6035. 8002d4e: 6c3b ldr r3, [r7, #64] @ 0x40
  6036. 8002d50: 2b00 cmp r3, #0
  6037. 8002d52: f000 80c6 beq.w 8002ee2 <MqttMessageArrived+0x25e>
  6038. switch (topicCmdNumber) {
  6039. 8002d56: 6d3b ldr r3, [r7, #80] @ 0x50
  6040. 8002d58: 2b05 cmp r3, #5
  6041. 8002d5a: d86e bhi.n 8002e3a <MqttMessageArrived+0x1b6>
  6042. 8002d5c: a201 add r2, pc, #4 @ (adr r2, 8002d64 <MqttMessageArrived+0xe0>)
  6043. 8002d5e: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  6044. 8002d62: bf00 nop
  6045. 8002d64: 08002d7d .word 0x08002d7d
  6046. 8002d68: 08002d83 .word 0x08002d83
  6047. 8002d6c: 08002d91 .word 0x08002d91
  6048. 8002d70: 08002dfb .word 0x08002dfb
  6049. 8002d74: 08002e0b .word 0x08002e0b
  6050. 8002d78: 08002e11 .word 0x08002e11
  6051. case 0: spCommand = spSetFanSpeed;
  6052. 8002d7c: 2302 movs r3, #2
  6053. 8002d7e: f887 3057 strb.w r3, [r7, #87] @ 0x57
  6054. case 1:
  6055. if (spCommand == spUnknown) {
  6056. 8002d82: f897 3057 ldrb.w r3, [r7, #87] @ 0x57
  6057. 8002d86: 2b08 cmp r3, #8
  6058. 8002d88: d102 bne.n 8002d90 <MqttMessageArrived+0x10c>
  6059. spCommand = spSetMotorXOn;
  6060. 8002d8a: 2303 movs r3, #3
  6061. 8002d8c: f887 3057 strb.w r3, [r7, #87] @ 0x57
  6062. }
  6063. case 2:
  6064. if (spCommand == spUnknown) {
  6065. 8002d90: f897 3057 ldrb.w r3, [r7, #87] @ 0x57
  6066. 8002d94: 2b08 cmp r3, #8
  6067. 8002d96: d102 bne.n 8002d9e <MqttMessageArrived+0x11a>
  6068. spCommand = spSetMotorYOn;
  6069. 8002d98: 2304 movs r3, #4
  6070. 8002d9a: f887 3057 strb.w r3, [r7, #87] @ 0x57
  6071. }
  6072. if (cJSON_IsArray (objectItem)) {
  6073. 8002d9e: 6c38 ldr r0, [r7, #64] @ 0x40
  6074. 8002da0: f7fe ff68 bl 8001c74 <cJSON_IsArray>
  6075. 8002da4: 4603 mov r3, r0
  6076. 8002da6: 2b00 cmp r3, #0
  6077. 8002da8: d049 beq.n 8002e3e <MqttMessageArrived+0x1ba>
  6078. data.spCommand = spCommand;
  6079. 8002daa: f897 3057 ldrb.w r3, [r7, #87] @ 0x57
  6080. 8002dae: 733b strb r3, [r7, #12]
  6081. int arraySize = cJSON_GetArraySize (objectItem);
  6082. 8002db0: 6c38 ldr r0, [r7, #64] @ 0x40
  6083. 8002db2: f7fe fe99 bl 8001ae8 <cJSON_GetArraySize>
  6084. 8002db6: 63f8 str r0, [r7, #60] @ 0x3c
  6085. if (arraySize == 2) {
  6086. 8002db8: 6bfb ldr r3, [r7, #60] @ 0x3c
  6087. 8002dba: 2b02 cmp r3, #2
  6088. 8002dbc: d13f bne.n 8002e3e <MqttMessageArrived+0x1ba>
  6089. for (int i = 0; i < arraySize; i++) {
  6090. 8002dbe: 2300 movs r3, #0
  6091. 8002dc0: 64fb str r3, [r7, #76] @ 0x4c
  6092. 8002dc2: e015 b.n 8002df0 <MqttMessageArrived+0x16c>
  6093. cJSON* item = cJSON_GetArrayItem (objectItem, i);
  6094. 8002dc4: 6cf9 ldr r1, [r7, #76] @ 0x4c
  6095. 8002dc6: 6c38 ldr r0, [r7, #64] @ 0x40
  6096. 8002dc8: f7fe fed2 bl 8001b70 <cJSON_GetArrayItem>
  6097. 8002dcc: 63b8 str r0, [r7, #56] @ 0x38
  6098. if (cJSON_IsNumber (item)) {
  6099. 8002dce: 6bb8 ldr r0, [r7, #56] @ 0x38
  6100. 8002dd0: f7fe ff39 bl 8001c46 <cJSON_IsNumber>
  6101. 8002dd4: 4603 mov r3, r0
  6102. 8002dd6: 2b00 cmp r3, #0
  6103. 8002dd8: d007 beq.n 8002dea <MqttMessageArrived+0x166>
  6104. data.values.integerValues.value[i] = item->valueint;
  6105. 8002dda: 6bbb ldr r3, [r7, #56] @ 0x38
  6106. 8002ddc: 695a ldr r2, [r3, #20]
  6107. 8002dde: 6cfb ldr r3, [r7, #76] @ 0x4c
  6108. 8002de0: 009b lsls r3, r3, #2
  6109. 8002de2: 3358 adds r3, #88 @ 0x58
  6110. 8002de4: 443b add r3, r7
  6111. 8002de6: f843 2c48 str.w r2, [r3, #-72]
  6112. for (int i = 0; i < arraySize; i++) {
  6113. 8002dea: 6cfb ldr r3, [r7, #76] @ 0x4c
  6114. 8002dec: 3301 adds r3, #1
  6115. 8002dee: 64fb str r3, [r7, #76] @ 0x4c
  6116. 8002df0: 6cfa ldr r2, [r7, #76] @ 0x4c
  6117. 8002df2: 6bfb ldr r3, [r7, #60] @ 0x3c
  6118. 8002df4: 429a cmp r2, r3
  6119. 8002df6: dbe5 blt.n 8002dc4 <MqttMessageArrived+0x140>
  6120. }
  6121. }
  6122. }
  6123. }
  6124. break;
  6125. 8002df8: e021 b.n 8002e3e <MqttMessageArrived+0x1ba>
  6126. case 3:
  6127. data.spCommand = spSetDiodeOn;
  6128. 8002dfa: 2307 movs r3, #7
  6129. 8002dfc: 733b strb r3, [r7, #12]
  6130. data.values.integerValues.value[0] = objectItem->valueint;
  6131. 8002dfe: 6c3b ldr r3, [r7, #64] @ 0x40
  6132. 8002e00: 695b ldr r3, [r3, #20]
  6133. 8002e02: 613b str r3, [r7, #16]
  6134. data.values.integerValues.value[1] = 0;
  6135. 8002e04: 2300 movs r3, #0
  6136. 8002e06: 617b str r3, [r7, #20]
  6137. break;
  6138. 8002e08: e01a b.n 8002e40 <MqttMessageArrived+0x1bc>
  6139. case 4: spCommand = spSetmotorXMaxCurrent;
  6140. 8002e0a: 2305 movs r3, #5
  6141. 8002e0c: f887 3057 strb.w r3, [r7, #87] @ 0x57
  6142. case 5:
  6143. if (spCommand == spUnknown) {
  6144. 8002e10: f897 3057 ldrb.w r3, [r7, #87] @ 0x57
  6145. 8002e14: 2b08 cmp r3, #8
  6146. 8002e16: d102 bne.n 8002e1e <MqttMessageArrived+0x19a>
  6147. spCommand = spSetmotorYMaxCurrent;
  6148. 8002e18: 2306 movs r3, #6
  6149. 8002e1a: f887 3057 strb.w r3, [r7, #87] @ 0x57
  6150. }
  6151. data.spCommand = spCommand;
  6152. 8002e1e: f897 3057 ldrb.w r3, [r7, #87] @ 0x57
  6153. 8002e22: 733b strb r3, [r7, #12]
  6154. data.values.flaotValues.value[0] = objectItem->valuedouble;
  6155. 8002e24: 6c3b ldr r3, [r7, #64] @ 0x40
  6156. 8002e26: ed93 7b06 vldr d7, [r3, #24]
  6157. 8002e2a: eef7 7bc7 vcvt.f32.f64 s15, d7
  6158. 8002e2e: edc7 7a04 vstr s15, [r7, #16]
  6159. data.values.flaotValues.value[1] = 0.0;
  6160. 8002e32: f04f 0300 mov.w r3, #0
  6161. 8002e36: 617b str r3, [r7, #20]
  6162. break;
  6163. 8002e38: e002 b.n 8002e40 <MqttMessageArrived+0x1bc>
  6164. default: break;
  6165. 8002e3a: bf00 nop
  6166. 8002e3c: e000 b.n 8002e40 <MqttMessageArrived+0x1bc>
  6167. break;
  6168. 8002e3e: bf00 nop
  6169. }
  6170. switch (topicForBoard) {
  6171. 8002e40: f897 3056 ldrb.w r3, [r7, #86] @ 0x56
  6172. 8002e44: 3b01 subs r3, #1
  6173. 8002e46: 2b03 cmp r3, #3
  6174. 8002e48: d84a bhi.n 8002ee0 <MqttMessageArrived+0x25c>
  6175. 8002e4a: a201 add r2, pc, #4 @ (adr r2, 8002e50 <MqttMessageArrived+0x1cc>)
  6176. 8002e4c: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  6177. 8002e50: 08002e61 .word 0x08002e61
  6178. 8002e54: 08002e81 .word 0x08002e81
  6179. 8002e58: 08002ea1 .word 0x08002ea1
  6180. 8002e5c: 08002ec1 .word 0x08002ec1
  6181. if (uart1TaskData.sendCmdToSlaveQueue != NULL) {
  6182. osMessageQueuePut (
  6183. uart1TaskData.sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
  6184. }
  6185. #else
  6186. if (uart8TaskData.sendCmdToSlaveQueue != NULL) {
  6187. 8002e60: 4b2e ldr r3, [pc, #184] @ (8002f1c <MqttMessageArrived+0x298>)
  6188. 8002e62: 6adb ldr r3, [r3, #44] @ 0x2c
  6189. 8002e64: 2b00 cmp r3, #0
  6190. 8002e66: d007 beq.n 8002e78 <MqttMessageArrived+0x1f4>
  6191. osMessageQueuePut (uart8TaskData.sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
  6192. 8002e68: 4b2c ldr r3, [pc, #176] @ (8002f1c <MqttMessageArrived+0x298>)
  6193. 8002e6a: 6ad8 ldr r0, [r3, #44] @ 0x2c
  6194. 8002e6c: f107 010c add.w r1, r7, #12
  6195. 8002e70: 2364 movs r3, #100 @ 0x64
  6196. 8002e72: 2200 movs r2, #0
  6197. 8002e74: f00e f866 bl 8010f44 <osMessageQueuePut>
  6198. }
  6199. #endif
  6200. printf ("Send cmd to board 1\n");
  6201. 8002e78: 4829 ldr r0, [pc, #164] @ (8002f20 <MqttMessageArrived+0x29c>)
  6202. 8002e7a: f026 fe0f bl 8029a9c <puts>
  6203. break;
  6204. 8002e7e: e030 b.n 8002ee2 <MqttMessageArrived+0x25e>
  6205. case board_2:
  6206. if (uart3TaskData.sendCmdToSlaveQueue != NULL) {
  6207. 8002e80: 4b28 ldr r3, [pc, #160] @ (8002f24 <MqttMessageArrived+0x2a0>)
  6208. 8002e82: 6adb ldr r3, [r3, #44] @ 0x2c
  6209. 8002e84: 2b00 cmp r3, #0
  6210. 8002e86: d007 beq.n 8002e98 <MqttMessageArrived+0x214>
  6211. osMessageQueuePut (uart3TaskData.sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
  6212. 8002e88: 4b26 ldr r3, [pc, #152] @ (8002f24 <MqttMessageArrived+0x2a0>)
  6213. 8002e8a: 6ad8 ldr r0, [r3, #44] @ 0x2c
  6214. 8002e8c: f107 010c add.w r1, r7, #12
  6215. 8002e90: 2364 movs r3, #100 @ 0x64
  6216. 8002e92: 2200 movs r2, #0
  6217. 8002e94: f00e f856 bl 8010f44 <osMessageQueuePut>
  6218. }
  6219. printf ("Send cmd to board 2\n");
  6220. 8002e98: 4823 ldr r0, [pc, #140] @ (8002f28 <MqttMessageArrived+0x2a4>)
  6221. 8002e9a: f026 fdff bl 8029a9c <puts>
  6222. break;
  6223. 8002e9e: e020 b.n 8002ee2 <MqttMessageArrived+0x25e>
  6224. case board_3:
  6225. if (uart6TaskData.sendCmdToSlaveQueue != NULL) {
  6226. 8002ea0: 4b22 ldr r3, [pc, #136] @ (8002f2c <MqttMessageArrived+0x2a8>)
  6227. 8002ea2: 6adb ldr r3, [r3, #44] @ 0x2c
  6228. 8002ea4: 2b00 cmp r3, #0
  6229. 8002ea6: d007 beq.n 8002eb8 <MqttMessageArrived+0x234>
  6230. osMessageQueuePut (uart6TaskData.sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
  6231. 8002ea8: 4b20 ldr r3, [pc, #128] @ (8002f2c <MqttMessageArrived+0x2a8>)
  6232. 8002eaa: 6ad8 ldr r0, [r3, #44] @ 0x2c
  6233. 8002eac: f107 010c add.w r1, r7, #12
  6234. 8002eb0: 2364 movs r3, #100 @ 0x64
  6235. 8002eb2: 2200 movs r2, #0
  6236. 8002eb4: f00e f846 bl 8010f44 <osMessageQueuePut>
  6237. }
  6238. printf ("Send cmd to board 3\n");
  6239. 8002eb8: 481d ldr r0, [pc, #116] @ (8002f30 <MqttMessageArrived+0x2ac>)
  6240. 8002eba: f026 fdef bl 8029a9c <puts>
  6241. break;
  6242. 8002ebe: e010 b.n 8002ee2 <MqttMessageArrived+0x25e>
  6243. case board_4:
  6244. if (uart2TaskData.sendCmdToSlaveQueue != NULL) {
  6245. 8002ec0: 4b1c ldr r3, [pc, #112] @ (8002f34 <MqttMessageArrived+0x2b0>)
  6246. 8002ec2: 6adb ldr r3, [r3, #44] @ 0x2c
  6247. 8002ec4: 2b00 cmp r3, #0
  6248. 8002ec6: d007 beq.n 8002ed8 <MqttMessageArrived+0x254>
  6249. osMessageQueuePut (uart2TaskData.sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
  6250. 8002ec8: 4b1a ldr r3, [pc, #104] @ (8002f34 <MqttMessageArrived+0x2b0>)
  6251. 8002eca: 6ad8 ldr r0, [r3, #44] @ 0x2c
  6252. 8002ecc: f107 010c add.w r1, r7, #12
  6253. 8002ed0: 2364 movs r3, #100 @ 0x64
  6254. 8002ed2: 2200 movs r2, #0
  6255. 8002ed4: f00e f836 bl 8010f44 <osMessageQueuePut>
  6256. }
  6257. printf ("Send cmd to board 4\n");
  6258. 8002ed8: 4817 ldr r0, [pc, #92] @ (8002f38 <MqttMessageArrived+0x2b4>)
  6259. 8002eda: f026 fddf bl 8029a9c <puts>
  6260. break;
  6261. 8002ede: e000 b.n 8002ee2 <MqttMessageArrived+0x25e>
  6262. default: break;
  6263. 8002ee0: bf00 nop
  6264. for (int topicCmdNumber = 0; topicCmdNumber < 6; topicCmdNumber++) {
  6265. 8002ee2: 6d3b ldr r3, [r7, #80] @ 0x50
  6266. 8002ee4: 3301 adds r3, #1
  6267. 8002ee6: 653b str r3, [r7, #80] @ 0x50
  6268. 8002ee8: 6d3b ldr r3, [r7, #80] @ 0x50
  6269. 8002eea: 2b05 cmp r3, #5
  6270. 8002eec: f77f af23 ble.w 8002d36 <MqttMessageArrived+0xb2>
  6271. }
  6272. }
  6273. }
  6274. cJSON_Delete (json);
  6275. 8002ef0: 6c78 ldr r0, [r7, #68] @ 0x44
  6276. 8002ef2: f7fd fe4b bl 8000b8c <cJSON_Delete>
  6277. // printf ("MQTT MSG[%d]:%s\n", (int)message->payloadlen, (char*)message->payload);
  6278. printf ("MQTT Topic:%s, MSG[%d]:%s\n", topicName, (int)message->payloadlen, (char*)message->payload);
  6279. 8002ef6: 6cbb ldr r3, [r7, #72] @ 0x48
  6280. 8002ef8: 68db ldr r3, [r3, #12]
  6281. 8002efa: 461a mov r2, r3
  6282. 8002efc: 6cbb ldr r3, [r7, #72] @ 0x48
  6283. 8002efe: 689b ldr r3, [r3, #8]
  6284. 8002f00: f107 0118 add.w r1, r7, #24
  6285. 8002f04: 480d ldr r0, [pc, #52] @ (8002f3c <MqttMessageArrived+0x2b8>)
  6286. 8002f06: f026 fd61 bl 80299cc <iprintf>
  6287. }
  6288. 8002f0a: bf00 nop
  6289. 8002f0c: 3758 adds r7, #88 @ 0x58
  6290. 8002f0e: 46bd mov sp, r7
  6291. 8002f10: bd80 pop {r7, pc}
  6292. 8002f12: bf00 nop
  6293. 8002f14: 080309b4 .word 0x080309b4
  6294. 8002f18: 080309c4 .word 0x080309c4
  6295. 8002f1c: 24001f0c .word 0x24001f0c
  6296. 8002f20: 0802c878 .word 0x0802c878
  6297. 8002f24: 24001e64 .word 0x24001e64
  6298. 8002f28: 0802c88c .word 0x0802c88c
  6299. 8002f2c: 24001e9c .word 0x24001e9c
  6300. 8002f30: 0802c8a0 .word 0x0802c8a0
  6301. 8002f34: 24001ed4 .word 0x24001ed4
  6302. 8002f38: 0802c8b4 .word 0x0802c8b4
  6303. 8002f3c: 0802c8c8 .word 0x0802c8c8
  6304. 08002f40 <mqtt_cli_init>:
  6305. void mqtt_cli_init (void) {
  6306. 8002f40: b580 push {r7, lr}
  6307. 8002f42: af00 add r7, sp, #0
  6308. mqttClientSubTaskHandle = osThreadNew (MqttClientSubTask, NULL, &mqttClientSubTaskAttr); // subscribe task
  6309. 8002f44: 4a08 ldr r2, [pc, #32] @ (8002f68 <mqtt_cli_init+0x28>)
  6310. 8002f46: 2100 movs r1, #0
  6311. 8002f48: 4808 ldr r0, [pc, #32] @ (8002f6c <mqtt_cli_init+0x2c>)
  6312. 8002f4a: f00d fc7c bl 8010846 <osThreadNew>
  6313. 8002f4e: 4603 mov r3, r0
  6314. 8002f50: 4a07 ldr r2, [pc, #28] @ (8002f70 <mqtt_cli_init+0x30>)
  6315. 8002f52: 6013 str r3, [r2, #0]
  6316. mqttClientPubTaskHandle = osThreadNew (MqttClientPubTask, NULL, &mqttClientPubTaskAttr); // publish task
  6317. 8002f54: 4a07 ldr r2, [pc, #28] @ (8002f74 <mqtt_cli_init+0x34>)
  6318. 8002f56: 2100 movs r1, #0
  6319. 8002f58: 4807 ldr r0, [pc, #28] @ (8002f78 <mqtt_cli_init+0x38>)
  6320. 8002f5a: f00d fc74 bl 8010846 <osThreadNew>
  6321. 8002f5e: 4603 mov r3, r0
  6322. 8002f60: 4a06 ldr r2, [pc, #24] @ (8002f7c <mqtt_cli_init+0x3c>)
  6323. 8002f62: 6013 str r3, [r2, #0]
  6324. }
  6325. 8002f64: bf00 nop
  6326. 8002f66: bd80 pop {r7, pc}
  6327. 8002f68: 080309dc .word 0x080309dc
  6328. 8002f6c: 08002515 .word 0x08002515
  6329. 8002f70: 24000658 .word 0x24000658
  6330. 8002f74: 08030a00 .word 0x08030a00
  6331. 8002f78: 08002585 .word 0x08002585
  6332. 8002f7c: 2400065c .word 0x2400065c
  6333. 08002f80 <WriteDataToBuffer>:
  6334. buff[newBuffPos++] = (uint8_t)((uData >> (i * 8)) & 0xFF);
  6335. }
  6336. *buffPos = newBuffPos;
  6337. }
  6338. void WriteDataToBuffer (uint8_t* buff, uint16_t* buffPos, void* data, uint8_t dataSize) {
  6339. 8002f80: b480 push {r7}
  6340. 8002f82: b089 sub sp, #36 @ 0x24
  6341. 8002f84: af00 add r7, sp, #0
  6342. 8002f86: 60f8 str r0, [r7, #12]
  6343. 8002f88: 60b9 str r1, [r7, #8]
  6344. 8002f8a: 607a str r2, [r7, #4]
  6345. 8002f8c: 70fb strb r3, [r7, #3]
  6346. uint32_t* uDataPtr = data;
  6347. 8002f8e: 687b ldr r3, [r7, #4]
  6348. 8002f90: 61bb str r3, [r7, #24]
  6349. uint32_t uData = *uDataPtr;
  6350. 8002f92: 69bb ldr r3, [r7, #24]
  6351. 8002f94: 681b ldr r3, [r3, #0]
  6352. 8002f96: 617b str r3, [r7, #20]
  6353. uint8_t i = 0;
  6354. 8002f98: 2300 movs r3, #0
  6355. 8002f9a: 77fb strb r3, [r7, #31]
  6356. uint8_t newBuffPos = *buffPos;
  6357. 8002f9c: 68bb ldr r3, [r7, #8]
  6358. 8002f9e: 881b ldrh r3, [r3, #0]
  6359. 8002fa0: 77bb strb r3, [r7, #30]
  6360. for (i = 0; i < dataSize; i++) {
  6361. 8002fa2: 2300 movs r3, #0
  6362. 8002fa4: 77fb strb r3, [r7, #31]
  6363. 8002fa6: e00e b.n 8002fc6 <WriteDataToBuffer+0x46>
  6364. buff[newBuffPos++] = (uint8_t)((uData >> (i * 8)) & 0xFF);
  6365. 8002fa8: 7ffb ldrb r3, [r7, #31]
  6366. 8002faa: 00db lsls r3, r3, #3
  6367. 8002fac: 697a ldr r2, [r7, #20]
  6368. 8002fae: 40da lsrs r2, r3
  6369. 8002fb0: 7fbb ldrb r3, [r7, #30]
  6370. 8002fb2: 1c59 adds r1, r3, #1
  6371. 8002fb4: 77b9 strb r1, [r7, #30]
  6372. 8002fb6: 4619 mov r1, r3
  6373. 8002fb8: 68fb ldr r3, [r7, #12]
  6374. 8002fba: 440b add r3, r1
  6375. 8002fbc: b2d2 uxtb r2, r2
  6376. 8002fbe: 701a strb r2, [r3, #0]
  6377. for (i = 0; i < dataSize; i++) {
  6378. 8002fc0: 7ffb ldrb r3, [r7, #31]
  6379. 8002fc2: 3301 adds r3, #1
  6380. 8002fc4: 77fb strb r3, [r7, #31]
  6381. 8002fc6: 7ffa ldrb r2, [r7, #31]
  6382. 8002fc8: 78fb ldrb r3, [r7, #3]
  6383. 8002fca: 429a cmp r2, r3
  6384. 8002fcc: d3ec bcc.n 8002fa8 <WriteDataToBuffer+0x28>
  6385. }
  6386. *buffPos = newBuffPos;
  6387. 8002fce: 7fbb ldrb r3, [r7, #30]
  6388. 8002fd0: b29a uxth r2, r3
  6389. 8002fd2: 68bb ldr r3, [r7, #8]
  6390. 8002fd4: 801a strh r2, [r3, #0]
  6391. }
  6392. 8002fd6: bf00 nop
  6393. 8002fd8: 3724 adds r7, #36 @ 0x24
  6394. 8002fda: 46bd mov sp, r7
  6395. 8002fdc: f85d 7b04 ldr.w r7, [sp], #4
  6396. 8002fe0: 4770 bx lr
  6397. 08002fe2 <ReadFloatFromBuffer>:
  6398. void ReadFloatFromBuffer(uint8_t* buff, uint16_t* buffPos, float* data)
  6399. {
  6400. 8002fe2: b480 push {r7}
  6401. 8002fe4: b087 sub sp, #28
  6402. 8002fe6: af00 add r7, sp, #0
  6403. 8002fe8: 60f8 str r0, [r7, #12]
  6404. 8002fea: 60b9 str r1, [r7, #8]
  6405. 8002fec: 607a str r2, [r7, #4]
  6406. uint32_t* word = (uint32_t *)data;
  6407. 8002fee: 687b ldr r3, [r7, #4]
  6408. 8002ff0: 617b str r3, [r7, #20]
  6409. *word = CONVERT_BYTES_TO_WORD(&buff[*buffPos]);
  6410. 8002ff2: 68bb ldr r3, [r7, #8]
  6411. 8002ff4: 881b ldrh r3, [r3, #0]
  6412. 8002ff6: 3303 adds r3, #3
  6413. 8002ff8: 68fa ldr r2, [r7, #12]
  6414. 8002ffa: 4413 add r3, r2
  6415. 8002ffc: 781b ldrb r3, [r3, #0]
  6416. 8002ffe: 061a lsls r2, r3, #24
  6417. 8003000: 68bb ldr r3, [r7, #8]
  6418. 8003002: 881b ldrh r3, [r3, #0]
  6419. 8003004: 3302 adds r3, #2
  6420. 8003006: 68f9 ldr r1, [r7, #12]
  6421. 8003008: 440b add r3, r1
  6422. 800300a: 781b ldrb r3, [r3, #0]
  6423. 800300c: 041b lsls r3, r3, #16
  6424. 800300e: 431a orrs r2, r3
  6425. 8003010: 68bb ldr r3, [r7, #8]
  6426. 8003012: 881b ldrh r3, [r3, #0]
  6427. 8003014: 3301 adds r3, #1
  6428. 8003016: 68f9 ldr r1, [r7, #12]
  6429. 8003018: 440b add r3, r1
  6430. 800301a: 781b ldrb r3, [r3, #0]
  6431. 800301c: 021b lsls r3, r3, #8
  6432. 800301e: 4313 orrs r3, r2
  6433. 8003020: 68ba ldr r2, [r7, #8]
  6434. 8003022: 8812 ldrh r2, [r2, #0]
  6435. 8003024: 4611 mov r1, r2
  6436. 8003026: 68fa ldr r2, [r7, #12]
  6437. 8003028: 440a add r2, r1
  6438. 800302a: 7812 ldrb r2, [r2, #0]
  6439. 800302c: 4313 orrs r3, r2
  6440. 800302e: 461a mov r2, r3
  6441. 8003030: 697b ldr r3, [r7, #20]
  6442. 8003032: 601a str r2, [r3, #0]
  6443. *buffPos += sizeof(float);
  6444. 8003034: 68bb ldr r3, [r7, #8]
  6445. 8003036: 881b ldrh r3, [r3, #0]
  6446. 8003038: 3304 adds r3, #4
  6447. 800303a: b29a uxth r2, r3
  6448. 800303c: 68bb ldr r3, [r7, #8]
  6449. 800303e: 801a strh r2, [r3, #0]
  6450. }
  6451. 8003040: bf00 nop
  6452. 8003042: 371c adds r7, #28
  6453. 8003044: 46bd mov sp, r7
  6454. 8003046: f85d 7b04 ldr.w r7, [sp], #4
  6455. 800304a: 4770 bx lr
  6456. 0800304c <ReadByteFromBufer>:
  6457. *data = CONVERT_BYTES_TO_SHORT_WORD(&buff[*buffPos]);
  6458. *buffPos += sizeof(uint32_t);
  6459. }
  6460. void ReadByteFromBufer(uint8_t* buff, uint16_t* buffPos, uint8_t* data)
  6461. {
  6462. 800304c: b480 push {r7}
  6463. 800304e: b085 sub sp, #20
  6464. 8003050: af00 add r7, sp, #0
  6465. 8003052: 60f8 str r0, [r7, #12]
  6466. 8003054: 60b9 str r1, [r7, #8]
  6467. 8003056: 607a str r2, [r7, #4]
  6468. *data = CONVERT_BYTES_TO_SHORT_WORD(&buff[*buffPos]);
  6469. 8003058: 68bb ldr r3, [r7, #8]
  6470. 800305a: 881b ldrh r3, [r3, #0]
  6471. 800305c: 3301 adds r3, #1
  6472. 800305e: 68fa ldr r2, [r7, #12]
  6473. 8003060: 4413 add r3, r2
  6474. 8003062: 781b ldrb r3, [r3, #0]
  6475. 8003064: 021b lsls r3, r3, #8
  6476. 8003066: b25a sxtb r2, r3
  6477. 8003068: 68bb ldr r3, [r7, #8]
  6478. 800306a: 881b ldrh r3, [r3, #0]
  6479. 800306c: 4619 mov r1, r3
  6480. 800306e: 68fb ldr r3, [r7, #12]
  6481. 8003070: 440b add r3, r1
  6482. 8003072: 781b ldrb r3, [r3, #0]
  6483. 8003074: b25b sxtb r3, r3
  6484. 8003076: 4313 orrs r3, r2
  6485. 8003078: b25b sxtb r3, r3
  6486. 800307a: b2da uxtb r2, r3
  6487. 800307c: 687b ldr r3, [r7, #4]
  6488. 800307e: 701a strb r2, [r3, #0]
  6489. *buffPos += sizeof(uint8_t);
  6490. 8003080: 68bb ldr r3, [r7, #8]
  6491. 8003082: 881b ldrh r3, [r3, #0]
  6492. 8003084: 3301 adds r3, #1
  6493. 8003086: b29a uxth r2, r3
  6494. 8003088: 68bb ldr r3, [r7, #8]
  6495. 800308a: 801a strh r2, [r3, #0]
  6496. }
  6497. 800308c: bf00 nop
  6498. 800308e: 3714 adds r7, #20
  6499. 8003090: 46bd mov sp, r7
  6500. 8003092: f85d 7b04 ldr.w r7, [sp], #4
  6501. 8003096: 4770 bx lr
  6502. 08003098 <PrepareReqFrame>:
  6503. uint16_t PrepareReqFrame (uint8_t* txBuffer, uint16_t frameId, SerialProtocolCommands frameCommand, uint8_t* dataBuffer, uint16_t dataLength) {
  6504. 8003098: b580 push {r7, lr}
  6505. 800309a: b086 sub sp, #24
  6506. 800309c: af00 add r7, sp, #0
  6507. 800309e: 60f8 str r0, [r7, #12]
  6508. 80030a0: 607b str r3, [r7, #4]
  6509. 80030a2: 460b mov r3, r1
  6510. 80030a4: 817b strh r3, [r7, #10]
  6511. 80030a6: 4613 mov r3, r2
  6512. 80030a8: 727b strb r3, [r7, #9]
  6513. uint16_t crc = 0;
  6514. 80030aa: 2300 movs r3, #0
  6515. 80030ac: 82bb strh r3, [r7, #20]
  6516. uint16_t txBufferPos = 0;
  6517. 80030ae: 2300 movs r3, #0
  6518. 80030b0: 82fb strh r3, [r7, #22]
  6519. uint16_t frameCmd = ((uint16_t)frameCommand);
  6520. 80030b2: 7a7b ldrb r3, [r7, #9]
  6521. 80030b4: 827b strh r3, [r7, #18]
  6522. memset (txBuffer, 0x00, dataLength);
  6523. 80030b6: 8c3b ldrh r3, [r7, #32]
  6524. 80030b8: 461a mov r2, r3
  6525. 80030ba: 2100 movs r1, #0
  6526. 80030bc: 68f8 ldr r0, [r7, #12]
  6527. 80030be: f026 fe17 bl 8029cf0 <memset>
  6528. txBuffer[txBufferPos++] = FRAME_INDICATOR;
  6529. 80030c2: 8afb ldrh r3, [r7, #22]
  6530. 80030c4: 1c5a adds r2, r3, #1
  6531. 80030c6: 82fa strh r2, [r7, #22]
  6532. 80030c8: 461a mov r2, r3
  6533. 80030ca: 68fb ldr r3, [r7, #12]
  6534. 80030cc: 4413 add r3, r2
  6535. 80030ce: 22aa movs r2, #170 @ 0xaa
  6536. 80030d0: 701a strb r2, [r3, #0]
  6537. txBuffer[txBufferPos++] = GET_SHORT_WORD_FIRST_BYTE (frameId);
  6538. 80030d2: 8afb ldrh r3, [r7, #22]
  6539. 80030d4: 1c5a adds r2, r3, #1
  6540. 80030d6: 82fa strh r2, [r7, #22]
  6541. 80030d8: 461a mov r2, r3
  6542. 80030da: 68fb ldr r3, [r7, #12]
  6543. 80030dc: 4413 add r3, r2
  6544. 80030de: 897a ldrh r2, [r7, #10]
  6545. 80030e0: b2d2 uxtb r2, r2
  6546. 80030e2: 701a strb r2, [r3, #0]
  6547. txBuffer[txBufferPos++] = GET_SHORT_WORD_SECOND_BYTE (frameId);
  6548. 80030e4: 897b ldrh r3, [r7, #10]
  6549. 80030e6: 0a1b lsrs r3, r3, #8
  6550. 80030e8: b29a uxth r2, r3
  6551. 80030ea: 8afb ldrh r3, [r7, #22]
  6552. 80030ec: 1c59 adds r1, r3, #1
  6553. 80030ee: 82f9 strh r1, [r7, #22]
  6554. 80030f0: 4619 mov r1, r3
  6555. 80030f2: 68fb ldr r3, [r7, #12]
  6556. 80030f4: 440b add r3, r1
  6557. 80030f6: b2d2 uxtb r2, r2
  6558. 80030f8: 701a strb r2, [r3, #0]
  6559. txBuffer[txBufferPos++] = GET_SHORT_WORD_FIRST_BYTE (frameCmd);
  6560. 80030fa: 8afb ldrh r3, [r7, #22]
  6561. 80030fc: 1c5a adds r2, r3, #1
  6562. 80030fe: 82fa strh r2, [r7, #22]
  6563. 8003100: 461a mov r2, r3
  6564. 8003102: 68fb ldr r3, [r7, #12]
  6565. 8003104: 4413 add r3, r2
  6566. 8003106: 8a7a ldrh r2, [r7, #18]
  6567. 8003108: b2d2 uxtb r2, r2
  6568. 800310a: 701a strb r2, [r3, #0]
  6569. txBuffer[txBufferPos++] = GET_SHORT_WORD_SECOND_BYTE (frameCmd);
  6570. 800310c: 8a7b ldrh r3, [r7, #18]
  6571. 800310e: 0a1b lsrs r3, r3, #8
  6572. 8003110: b29a uxth r2, r3
  6573. 8003112: 8afb ldrh r3, [r7, #22]
  6574. 8003114: 1c59 adds r1, r3, #1
  6575. 8003116: 82f9 strh r1, [r7, #22]
  6576. 8003118: 4619 mov r1, r3
  6577. 800311a: 68fb ldr r3, [r7, #12]
  6578. 800311c: 440b add r3, r1
  6579. 800311e: b2d2 uxtb r2, r2
  6580. 8003120: 701a strb r2, [r3, #0]
  6581. txBuffer[txBufferPos++] = GET_SHORT_WORD_FIRST_BYTE (dataLength);
  6582. 8003122: 8afb ldrh r3, [r7, #22]
  6583. 8003124: 1c5a adds r2, r3, #1
  6584. 8003126: 82fa strh r2, [r7, #22]
  6585. 8003128: 461a mov r2, r3
  6586. 800312a: 68fb ldr r3, [r7, #12]
  6587. 800312c: 4413 add r3, r2
  6588. 800312e: 8c3a ldrh r2, [r7, #32]
  6589. 8003130: b2d2 uxtb r2, r2
  6590. 8003132: 701a strb r2, [r3, #0]
  6591. txBuffer[txBufferPos++] = GET_SHORT_WORD_SECOND_BYTE (dataLength);
  6592. 8003134: 8c3b ldrh r3, [r7, #32]
  6593. 8003136: 0a1b lsrs r3, r3, #8
  6594. 8003138: b29a uxth r2, r3
  6595. 800313a: 8afb ldrh r3, [r7, #22]
  6596. 800313c: 1c59 adds r1, r3, #1
  6597. 800313e: 82f9 strh r1, [r7, #22]
  6598. 8003140: 4619 mov r1, r3
  6599. 8003142: 68fb ldr r3, [r7, #12]
  6600. 8003144: 440b add r3, r1
  6601. 8003146: b2d2 uxtb r2, r2
  6602. 8003148: 701a strb r2, [r3, #0]
  6603. txBuffer[txBufferPos++] = 0x00;
  6604. 800314a: 8afb ldrh r3, [r7, #22]
  6605. 800314c: 1c5a adds r2, r3, #1
  6606. 800314e: 82fa strh r2, [r7, #22]
  6607. 8003150: 461a mov r2, r3
  6608. 8003152: 68fb ldr r3, [r7, #12]
  6609. 8003154: 4413 add r3, r2
  6610. 8003156: 2200 movs r2, #0
  6611. 8003158: 701a strb r2, [r3, #0]
  6612. if (dataLength > 0) {
  6613. 800315a: 8c3b ldrh r3, [r7, #32]
  6614. 800315c: 2b00 cmp r3, #0
  6615. 800315e: d00b beq.n 8003178 <PrepareReqFrame+0xe0>
  6616. memcpy (&txBuffer[txBufferPos], dataBuffer, dataLength);
  6617. 8003160: 8afb ldrh r3, [r7, #22]
  6618. 8003162: 68fa ldr r2, [r7, #12]
  6619. 8003164: 4413 add r3, r2
  6620. 8003166: 8c3a ldrh r2, [r7, #32]
  6621. 8003168: 6879 ldr r1, [r7, #4]
  6622. 800316a: 4618 mov r0, r3
  6623. 800316c: f026 feb7 bl 8029ede <memcpy>
  6624. txBufferPos += dataLength;
  6625. 8003170: 8afa ldrh r2, [r7, #22]
  6626. 8003172: 8c3b ldrh r3, [r7, #32]
  6627. 8003174: 4413 add r3, r2
  6628. 8003176: 82fb strh r3, [r7, #22]
  6629. }
  6630. crc = HAL_CRC_Calculate (&hcrc, (uint32_t*)txBuffer, txBufferPos);
  6631. 8003178: 8afb ldrh r3, [r7, #22]
  6632. 800317a: 461a mov r2, r3
  6633. 800317c: 68f9 ldr r1, [r7, #12]
  6634. 800317e: 480f ldr r0, [pc, #60] @ (80031bc <PrepareReqFrame+0x124>)
  6635. 8003180: f002 f962 bl 8005448 <HAL_CRC_Calculate>
  6636. 8003184: 4603 mov r3, r0
  6637. 8003186: 82bb strh r3, [r7, #20]
  6638. txBuffer[txBufferPos++] = GET_SHORT_WORD_FIRST_BYTE (crc);
  6639. 8003188: 8afb ldrh r3, [r7, #22]
  6640. 800318a: 1c5a adds r2, r3, #1
  6641. 800318c: 82fa strh r2, [r7, #22]
  6642. 800318e: 461a mov r2, r3
  6643. 8003190: 68fb ldr r3, [r7, #12]
  6644. 8003192: 4413 add r3, r2
  6645. 8003194: 8aba ldrh r2, [r7, #20]
  6646. 8003196: b2d2 uxtb r2, r2
  6647. 8003198: 701a strb r2, [r3, #0]
  6648. txBuffer[txBufferPos++] = GET_SHORT_WORD_SECOND_BYTE (crc);
  6649. 800319a: 8abb ldrh r3, [r7, #20]
  6650. 800319c: 0a1b lsrs r3, r3, #8
  6651. 800319e: b29a uxth r2, r3
  6652. 80031a0: 8afb ldrh r3, [r7, #22]
  6653. 80031a2: 1c59 adds r1, r3, #1
  6654. 80031a4: 82f9 strh r1, [r7, #22]
  6655. 80031a6: 4619 mov r1, r3
  6656. 80031a8: 68fb ldr r3, [r7, #12]
  6657. 80031aa: 440b add r3, r1
  6658. 80031ac: b2d2 uxtb r2, r2
  6659. 80031ae: 701a strb r2, [r3, #0]
  6660. return txBufferPos;
  6661. 80031b0: 8afb ldrh r3, [r7, #22]
  6662. }
  6663. 80031b2: 4618 mov r0, r3
  6664. 80031b4: 3718 adds r7, #24
  6665. 80031b6: 46bd mov sp, r7
  6666. 80031b8: bd80 pop {r7, pc}
  6667. 80031ba: bf00 nop
  6668. 80031bc: 24000248 .word 0x24000248
  6669. 080031c0 <PrepareRespFrame>:
  6670. uint16_t PrepareRespFrame (uint8_t* txBuffer, uint16_t frameId, SerialProtocolCommands frameCommand, SerialProtocolRespStatus respStatus, uint8_t* dataBuffer, uint16_t dataLength) {
  6671. 80031c0: b580 push {r7, lr}
  6672. 80031c2: b084 sub sp, #16
  6673. 80031c4: af00 add r7, sp, #0
  6674. 80031c6: 6078 str r0, [r7, #4]
  6675. 80031c8: 4608 mov r0, r1
  6676. 80031ca: 4611 mov r1, r2
  6677. 80031cc: 461a mov r2, r3
  6678. 80031ce: 4603 mov r3, r0
  6679. 80031d0: 807b strh r3, [r7, #2]
  6680. 80031d2: 460b mov r3, r1
  6681. 80031d4: 707b strb r3, [r7, #1]
  6682. 80031d6: 4613 mov r3, r2
  6683. 80031d8: 703b strb r3, [r7, #0]
  6684. uint16_t crc = 0;
  6685. 80031da: 2300 movs r3, #0
  6686. 80031dc: 81bb strh r3, [r7, #12]
  6687. uint16_t txBufferPos = 0;
  6688. 80031de: 2300 movs r3, #0
  6689. 80031e0: 81fb strh r3, [r7, #14]
  6690. uint16_t frameCmd = ((uint16_t)frameCommand) | 0x8000; // MSB set means response
  6691. 80031e2: 787b ldrb r3, [r7, #1]
  6692. 80031e4: b21a sxth r2, r3
  6693. 80031e6: 4b43 ldr r3, [pc, #268] @ (80032f4 <PrepareRespFrame+0x134>)
  6694. 80031e8: 4313 orrs r3, r2
  6695. 80031ea: b21b sxth r3, r3
  6696. 80031ec: 817b strh r3, [r7, #10]
  6697. memset (txBuffer, 0x00, dataLength);
  6698. 80031ee: 8bbb ldrh r3, [r7, #28]
  6699. 80031f0: 461a mov r2, r3
  6700. 80031f2: 2100 movs r1, #0
  6701. 80031f4: 6878 ldr r0, [r7, #4]
  6702. 80031f6: f026 fd7b bl 8029cf0 <memset>
  6703. txBuffer[txBufferPos++] = FRAME_INDICATOR;
  6704. 80031fa: 89fb ldrh r3, [r7, #14]
  6705. 80031fc: 1c5a adds r2, r3, #1
  6706. 80031fe: 81fa strh r2, [r7, #14]
  6707. 8003200: 461a mov r2, r3
  6708. 8003202: 687b ldr r3, [r7, #4]
  6709. 8003204: 4413 add r3, r2
  6710. 8003206: 22aa movs r2, #170 @ 0xaa
  6711. 8003208: 701a strb r2, [r3, #0]
  6712. txBuffer[txBufferPos++] = GET_SHORT_WORD_FIRST_BYTE (frameId);
  6713. 800320a: 89fb ldrh r3, [r7, #14]
  6714. 800320c: 1c5a adds r2, r3, #1
  6715. 800320e: 81fa strh r2, [r7, #14]
  6716. 8003210: 461a mov r2, r3
  6717. 8003212: 687b ldr r3, [r7, #4]
  6718. 8003214: 4413 add r3, r2
  6719. 8003216: 887a ldrh r2, [r7, #2]
  6720. 8003218: b2d2 uxtb r2, r2
  6721. 800321a: 701a strb r2, [r3, #0]
  6722. txBuffer[txBufferPos++] = GET_SHORT_WORD_SECOND_BYTE (frameId);
  6723. 800321c: 887b ldrh r3, [r7, #2]
  6724. 800321e: 0a1b lsrs r3, r3, #8
  6725. 8003220: b29a uxth r2, r3
  6726. 8003222: 89fb ldrh r3, [r7, #14]
  6727. 8003224: 1c59 adds r1, r3, #1
  6728. 8003226: 81f9 strh r1, [r7, #14]
  6729. 8003228: 4619 mov r1, r3
  6730. 800322a: 687b ldr r3, [r7, #4]
  6731. 800322c: 440b add r3, r1
  6732. 800322e: b2d2 uxtb r2, r2
  6733. 8003230: 701a strb r2, [r3, #0]
  6734. txBuffer[txBufferPos++] = GET_SHORT_WORD_FIRST_BYTE (frameCmd);
  6735. 8003232: 89fb ldrh r3, [r7, #14]
  6736. 8003234: 1c5a adds r2, r3, #1
  6737. 8003236: 81fa strh r2, [r7, #14]
  6738. 8003238: 461a mov r2, r3
  6739. 800323a: 687b ldr r3, [r7, #4]
  6740. 800323c: 4413 add r3, r2
  6741. 800323e: 897a ldrh r2, [r7, #10]
  6742. 8003240: b2d2 uxtb r2, r2
  6743. 8003242: 701a strb r2, [r3, #0]
  6744. txBuffer[txBufferPos++] = GET_SHORT_WORD_SECOND_BYTE (frameCmd);
  6745. 8003244: 897b ldrh r3, [r7, #10]
  6746. 8003246: 0a1b lsrs r3, r3, #8
  6747. 8003248: b29a uxth r2, r3
  6748. 800324a: 89fb ldrh r3, [r7, #14]
  6749. 800324c: 1c59 adds r1, r3, #1
  6750. 800324e: 81f9 strh r1, [r7, #14]
  6751. 8003250: 4619 mov r1, r3
  6752. 8003252: 687b ldr r3, [r7, #4]
  6753. 8003254: 440b add r3, r1
  6754. 8003256: b2d2 uxtb r2, r2
  6755. 8003258: 701a strb r2, [r3, #0]
  6756. txBuffer[txBufferPos++] = GET_SHORT_WORD_FIRST_BYTE (dataLength);
  6757. 800325a: 89fb ldrh r3, [r7, #14]
  6758. 800325c: 1c5a adds r2, r3, #1
  6759. 800325e: 81fa strh r2, [r7, #14]
  6760. 8003260: 461a mov r2, r3
  6761. 8003262: 687b ldr r3, [r7, #4]
  6762. 8003264: 4413 add r3, r2
  6763. 8003266: 8bba ldrh r2, [r7, #28]
  6764. 8003268: b2d2 uxtb r2, r2
  6765. 800326a: 701a strb r2, [r3, #0]
  6766. txBuffer[txBufferPos++] = GET_SHORT_WORD_SECOND_BYTE (dataLength);
  6767. 800326c: 8bbb ldrh r3, [r7, #28]
  6768. 800326e: 0a1b lsrs r3, r3, #8
  6769. 8003270: b29a uxth r2, r3
  6770. 8003272: 89fb ldrh r3, [r7, #14]
  6771. 8003274: 1c59 adds r1, r3, #1
  6772. 8003276: 81f9 strh r1, [r7, #14]
  6773. 8003278: 4619 mov r1, r3
  6774. 800327a: 687b ldr r3, [r7, #4]
  6775. 800327c: 440b add r3, r1
  6776. 800327e: b2d2 uxtb r2, r2
  6777. 8003280: 701a strb r2, [r3, #0]
  6778. txBuffer[txBufferPos++] = (uint8_t)respStatus;
  6779. 8003282: 89fb ldrh r3, [r7, #14]
  6780. 8003284: 1c5a adds r2, r3, #1
  6781. 8003286: 81fa strh r2, [r7, #14]
  6782. 8003288: 461a mov r2, r3
  6783. 800328a: 687b ldr r3, [r7, #4]
  6784. 800328c: 4413 add r3, r2
  6785. 800328e: 783a ldrb r2, [r7, #0]
  6786. 8003290: 701a strb r2, [r3, #0]
  6787. if (dataLength > 0) {
  6788. 8003292: 8bbb ldrh r3, [r7, #28]
  6789. 8003294: 2b00 cmp r3, #0
  6790. 8003296: d00b beq.n 80032b0 <PrepareRespFrame+0xf0>
  6791. memcpy (&txBuffer[txBufferPos], dataBuffer, dataLength);
  6792. 8003298: 89fb ldrh r3, [r7, #14]
  6793. 800329a: 687a ldr r2, [r7, #4]
  6794. 800329c: 4413 add r3, r2
  6795. 800329e: 8bba ldrh r2, [r7, #28]
  6796. 80032a0: 69b9 ldr r1, [r7, #24]
  6797. 80032a2: 4618 mov r0, r3
  6798. 80032a4: f026 fe1b bl 8029ede <memcpy>
  6799. txBufferPos += dataLength;
  6800. 80032a8: 89fa ldrh r2, [r7, #14]
  6801. 80032aa: 8bbb ldrh r3, [r7, #28]
  6802. 80032ac: 4413 add r3, r2
  6803. 80032ae: 81fb strh r3, [r7, #14]
  6804. }
  6805. crc = HAL_CRC_Calculate (&hcrc, (uint32_t*)txBuffer, txBufferPos);
  6806. 80032b0: 89fb ldrh r3, [r7, #14]
  6807. 80032b2: 461a mov r2, r3
  6808. 80032b4: 6879 ldr r1, [r7, #4]
  6809. 80032b6: 4810 ldr r0, [pc, #64] @ (80032f8 <PrepareRespFrame+0x138>)
  6810. 80032b8: f002 f8c6 bl 8005448 <HAL_CRC_Calculate>
  6811. 80032bc: 4603 mov r3, r0
  6812. 80032be: 81bb strh r3, [r7, #12]
  6813. txBuffer[txBufferPos++] = GET_SHORT_WORD_FIRST_BYTE (crc);
  6814. 80032c0: 89fb ldrh r3, [r7, #14]
  6815. 80032c2: 1c5a adds r2, r3, #1
  6816. 80032c4: 81fa strh r2, [r7, #14]
  6817. 80032c6: 461a mov r2, r3
  6818. 80032c8: 687b ldr r3, [r7, #4]
  6819. 80032ca: 4413 add r3, r2
  6820. 80032cc: 89ba ldrh r2, [r7, #12]
  6821. 80032ce: b2d2 uxtb r2, r2
  6822. 80032d0: 701a strb r2, [r3, #0]
  6823. txBuffer[txBufferPos++] = GET_SHORT_WORD_SECOND_BYTE (crc);
  6824. 80032d2: 89bb ldrh r3, [r7, #12]
  6825. 80032d4: 0a1b lsrs r3, r3, #8
  6826. 80032d6: b29a uxth r2, r3
  6827. 80032d8: 89fb ldrh r3, [r7, #14]
  6828. 80032da: 1c59 adds r1, r3, #1
  6829. 80032dc: 81f9 strh r1, [r7, #14]
  6830. 80032de: 4619 mov r1, r3
  6831. 80032e0: 687b ldr r3, [r7, #4]
  6832. 80032e2: 440b add r3, r1
  6833. 80032e4: b2d2 uxtb r2, r2
  6834. 80032e6: 701a strb r2, [r3, #0]
  6835. return txBufferPos;
  6836. 80032e8: 89fb ldrh r3, [r7, #14]
  6837. }
  6838. 80032ea: 4618 mov r0, r3
  6839. 80032ec: 3710 adds r7, #16
  6840. 80032ee: 46bd mov sp, r7
  6841. 80032f0: bd80 pop {r7, pc}
  6842. 80032f2: bf00 nop
  6843. 80032f4: ffff8000 .word 0xffff8000
  6844. 80032f8: 24000248 .word 0x24000248
  6845. 080032fc <HAL_MspInit>:
  6846. /* USER CODE END 0 */
  6847. /**
  6848. * Initializes the Global MSP.
  6849. */
  6850. void HAL_MspInit(void)
  6851. {
  6852. 80032fc: b580 push {r7, lr}
  6853. 80032fe: b082 sub sp, #8
  6854. 8003300: af00 add r7, sp, #0
  6855. /* USER CODE BEGIN MspInit 0 */
  6856. /* USER CODE END MspInit 0 */
  6857. __HAL_RCC_SYSCFG_CLK_ENABLE();
  6858. 8003302: 4b10 ldr r3, [pc, #64] @ (8003344 <HAL_MspInit+0x48>)
  6859. 8003304: f8d3 30f4 ldr.w r3, [r3, #244] @ 0xf4
  6860. 8003308: 4a0e ldr r2, [pc, #56] @ (8003344 <HAL_MspInit+0x48>)
  6861. 800330a: f043 0302 orr.w r3, r3, #2
  6862. 800330e: f8c2 30f4 str.w r3, [r2, #244] @ 0xf4
  6863. 8003312: 4b0c ldr r3, [pc, #48] @ (8003344 <HAL_MspInit+0x48>)
  6864. 8003314: f8d3 30f4 ldr.w r3, [r3, #244] @ 0xf4
  6865. 8003318: f003 0302 and.w r3, r3, #2
  6866. 800331c: 607b str r3, [r7, #4]
  6867. 800331e: 687b ldr r3, [r7, #4]
  6868. /* System interrupt init*/
  6869. /* PendSV_IRQn interrupt configuration */
  6870. HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);
  6871. 8003320: 2200 movs r2, #0
  6872. 8003322: 210f movs r1, #15
  6873. 8003324: f06f 0001 mvn.w r0, #1
  6874. 8003328: f001 ff8a bl 8005240 <HAL_NVIC_SetPriority>
  6875. /* Peripheral interrupt init */
  6876. /* RCC_IRQn interrupt configuration */
  6877. HAL_NVIC_SetPriority(RCC_IRQn, 5, 0);
  6878. 800332c: 2200 movs r2, #0
  6879. 800332e: 2105 movs r1, #5
  6880. 8003330: 2005 movs r0, #5
  6881. 8003332: f001 ff85 bl 8005240 <HAL_NVIC_SetPriority>
  6882. HAL_NVIC_EnableIRQ(RCC_IRQn);
  6883. 8003336: 2005 movs r0, #5
  6884. 8003338: f001 ff9c bl 8005274 <HAL_NVIC_EnableIRQ>
  6885. /* USER CODE BEGIN MspInit 1 */
  6886. /* USER CODE END MspInit 1 */
  6887. }
  6888. 800333c: bf00 nop
  6889. 800333e: 3708 adds r7, #8
  6890. 8003340: 46bd mov sp, r7
  6891. 8003342: bd80 pop {r7, pc}
  6892. 8003344: 58024400 .word 0x58024400
  6893. 08003348 <HAL_CRC_MspInit>:
  6894. * This function configures the hardware resources used in this example
  6895. * @param hcrc: CRC handle pointer
  6896. * @retval None
  6897. */
  6898. void HAL_CRC_MspInit(CRC_HandleTypeDef* hcrc)
  6899. {
  6900. 8003348: b480 push {r7}
  6901. 800334a: b085 sub sp, #20
  6902. 800334c: af00 add r7, sp, #0
  6903. 800334e: 6078 str r0, [r7, #4]
  6904. if(hcrc->Instance==CRC)
  6905. 8003350: 687b ldr r3, [r7, #4]
  6906. 8003352: 681b ldr r3, [r3, #0]
  6907. 8003354: 4a0b ldr r2, [pc, #44] @ (8003384 <HAL_CRC_MspInit+0x3c>)
  6908. 8003356: 4293 cmp r3, r2
  6909. 8003358: d10e bne.n 8003378 <HAL_CRC_MspInit+0x30>
  6910. {
  6911. /* USER CODE BEGIN CRC_MspInit 0 */
  6912. /* USER CODE END CRC_MspInit 0 */
  6913. /* Peripheral clock enable */
  6914. __HAL_RCC_CRC_CLK_ENABLE();
  6915. 800335a: 4b0b ldr r3, [pc, #44] @ (8003388 <HAL_CRC_MspInit+0x40>)
  6916. 800335c: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  6917. 8003360: 4a09 ldr r2, [pc, #36] @ (8003388 <HAL_CRC_MspInit+0x40>)
  6918. 8003362: f443 2300 orr.w r3, r3, #524288 @ 0x80000
  6919. 8003366: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  6920. 800336a: 4b07 ldr r3, [pc, #28] @ (8003388 <HAL_CRC_MspInit+0x40>)
  6921. 800336c: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  6922. 8003370: f403 2300 and.w r3, r3, #524288 @ 0x80000
  6923. 8003374: 60fb str r3, [r7, #12]
  6924. 8003376: 68fb ldr r3, [r7, #12]
  6925. /* USER CODE BEGIN CRC_MspInit 1 */
  6926. /* USER CODE END CRC_MspInit 1 */
  6927. }
  6928. }
  6929. 8003378: bf00 nop
  6930. 800337a: 3714 adds r7, #20
  6931. 800337c: 46bd mov sp, r7
  6932. 800337e: f85d 7b04 ldr.w r7, [sp], #4
  6933. 8003382: 4770 bx lr
  6934. 8003384: 58024c00 .word 0x58024c00
  6935. 8003388: 58024400 .word 0x58024400
  6936. 0800338c <HAL_RNG_MspInit>:
  6937. * This function configures the hardware resources used in this example
  6938. * @param hrng: RNG handle pointer
  6939. * @retval None
  6940. */
  6941. void HAL_RNG_MspInit(RNG_HandleTypeDef* hrng)
  6942. {
  6943. 800338c: b580 push {r7, lr}
  6944. 800338e: b0b4 sub sp, #208 @ 0xd0
  6945. 8003390: af00 add r7, sp, #0
  6946. 8003392: 6078 str r0, [r7, #4]
  6947. RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  6948. 8003394: f107 0310 add.w r3, r7, #16
  6949. 8003398: 22c0 movs r2, #192 @ 0xc0
  6950. 800339a: 2100 movs r1, #0
  6951. 800339c: 4618 mov r0, r3
  6952. 800339e: f026 fca7 bl 8029cf0 <memset>
  6953. if(hrng->Instance==RNG)
  6954. 80033a2: 687b ldr r3, [r7, #4]
  6955. 80033a4: 681b ldr r3, [r3, #0]
  6956. 80033a6: 4a14 ldr r2, [pc, #80] @ (80033f8 <HAL_RNG_MspInit+0x6c>)
  6957. 80033a8: 4293 cmp r3, r2
  6958. 80033aa: d121 bne.n 80033f0 <HAL_RNG_MspInit+0x64>
  6959. /* USER CODE END RNG_MspInit 0 */
  6960. /** Initializes the peripherals clock
  6961. */
  6962. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RNG;
  6963. 80033ac: f44f 3200 mov.w r2, #131072 @ 0x20000
  6964. 80033b0: f04f 0300 mov.w r3, #0
  6965. 80033b4: e9c7 2304 strd r2, r3, [r7, #16]
  6966. PeriphClkInitStruct.RngClockSelection = RCC_RNGCLKSOURCE_HSI48;
  6967. 80033b8: 2300 movs r3, #0
  6968. 80033ba: f8c7 3090 str.w r3, [r7, #144] @ 0x90
  6969. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  6970. 80033be: f107 0310 add.w r3, r7, #16
  6971. 80033c2: 4618 mov r0, r3
  6972. 80033c4: f007 fb90 bl 800aae8 <HAL_RCCEx_PeriphCLKConfig>
  6973. 80033c8: 4603 mov r3, r0
  6974. 80033ca: 2b00 cmp r3, #0
  6975. 80033cc: d001 beq.n 80033d2 <HAL_RNG_MspInit+0x46>
  6976. {
  6977. Error_Handler();
  6978. 80033ce: f7ff f89b bl 8002508 <Error_Handler>
  6979. }
  6980. /* Peripheral clock enable */
  6981. __HAL_RCC_RNG_CLK_ENABLE();
  6982. 80033d2: 4b0a ldr r3, [pc, #40] @ (80033fc <HAL_RNG_MspInit+0x70>)
  6983. 80033d4: f8d3 30dc ldr.w r3, [r3, #220] @ 0xdc
  6984. 80033d8: 4a08 ldr r2, [pc, #32] @ (80033fc <HAL_RNG_MspInit+0x70>)
  6985. 80033da: f043 0340 orr.w r3, r3, #64 @ 0x40
  6986. 80033de: f8c2 30dc str.w r3, [r2, #220] @ 0xdc
  6987. 80033e2: 4b06 ldr r3, [pc, #24] @ (80033fc <HAL_RNG_MspInit+0x70>)
  6988. 80033e4: f8d3 30dc ldr.w r3, [r3, #220] @ 0xdc
  6989. 80033e8: f003 0340 and.w r3, r3, #64 @ 0x40
  6990. 80033ec: 60fb str r3, [r7, #12]
  6991. 80033ee: 68fb ldr r3, [r7, #12]
  6992. /* USER CODE BEGIN RNG_MspInit 1 */
  6993. /* USER CODE END RNG_MspInit 1 */
  6994. }
  6995. }
  6996. 80033f0: bf00 nop
  6997. 80033f2: 37d0 adds r7, #208 @ 0xd0
  6998. 80033f4: 46bd mov sp, r7
  6999. 80033f6: bd80 pop {r7, pc}
  7000. 80033f8: 48021800 .word 0x48021800
  7001. 80033fc: 58024400 .word 0x58024400
  7002. 08003400 <HAL_UART_MspInit>:
  7003. * This function configures the hardware resources used in this example
  7004. * @param huart: UART handle pointer
  7005. * @retval None
  7006. */
  7007. void HAL_UART_MspInit(UART_HandleTypeDef* huart)
  7008. {
  7009. 8003400: b580 push {r7, lr}
  7010. 8003402: b0c2 sub sp, #264 @ 0x108
  7011. 8003404: af00 add r7, sp, #0
  7012. 8003406: f507 7384 add.w r3, r7, #264 @ 0x108
  7013. 800340a: f5a3 7382 sub.w r3, r3, #260 @ 0x104
  7014. 800340e: 6018 str r0, [r3, #0]
  7015. GPIO_InitTypeDef GPIO_InitStruct = {0};
  7016. 8003410: f107 03f4 add.w r3, r7, #244 @ 0xf4
  7017. 8003414: 2200 movs r2, #0
  7018. 8003416: 601a str r2, [r3, #0]
  7019. 8003418: 605a str r2, [r3, #4]
  7020. 800341a: 609a str r2, [r3, #8]
  7021. 800341c: 60da str r2, [r3, #12]
  7022. 800341e: 611a str r2, [r3, #16]
  7023. RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  7024. 8003420: f107 0330 add.w r3, r7, #48 @ 0x30
  7025. 8003424: 22c0 movs r2, #192 @ 0xc0
  7026. 8003426: 2100 movs r1, #0
  7027. 8003428: 4618 mov r0, r3
  7028. 800342a: f026 fc61 bl 8029cf0 <memset>
  7029. if(huart->Instance==UART8)
  7030. 800342e: f507 7384 add.w r3, r7, #264 @ 0x108
  7031. 8003432: f5a3 7382 sub.w r3, r3, #260 @ 0x104
  7032. 8003436: 681b ldr r3, [r3, #0]
  7033. 8003438: 681b ldr r3, [r3, #0]
  7034. 800343a: 4ab8 ldr r2, [pc, #736] @ (800371c <HAL_UART_MspInit+0x31c>)
  7035. 800343c: 4293 cmp r3, r2
  7036. 800343e: f040 80bc bne.w 80035ba <HAL_UART_MspInit+0x1ba>
  7037. /* USER CODE END UART8_MspInit 0 */
  7038. /** Initializes the peripherals clock
  7039. */
  7040. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_UART8;
  7041. 8003442: f04f 0202 mov.w r2, #2
  7042. 8003446: f04f 0300 mov.w r3, #0
  7043. 800344a: e9c7 230c strd r2, r3, [r7, #48] @ 0x30
  7044. PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
  7045. 800344e: 2300 movs r3, #0
  7046. 8003450: f8c7 30a8 str.w r3, [r7, #168] @ 0xa8
  7047. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  7048. 8003454: f107 0330 add.w r3, r7, #48 @ 0x30
  7049. 8003458: 4618 mov r0, r3
  7050. 800345a: f007 fb45 bl 800aae8 <HAL_RCCEx_PeriphCLKConfig>
  7051. 800345e: 4603 mov r3, r0
  7052. 8003460: 2b00 cmp r3, #0
  7053. 8003462: d001 beq.n 8003468 <HAL_UART_MspInit+0x68>
  7054. {
  7055. Error_Handler();
  7056. 8003464: f7ff f850 bl 8002508 <Error_Handler>
  7057. }
  7058. /* Peripheral clock enable */
  7059. __HAL_RCC_UART8_CLK_ENABLE();
  7060. 8003468: 4bad ldr r3, [pc, #692] @ (8003720 <HAL_UART_MspInit+0x320>)
  7061. 800346a: f8d3 30e8 ldr.w r3, [r3, #232] @ 0xe8
  7062. 800346e: 4aac ldr r2, [pc, #688] @ (8003720 <HAL_UART_MspInit+0x320>)
  7063. 8003470: f043 4300 orr.w r3, r3, #2147483648 @ 0x80000000
  7064. 8003474: f8c2 30e8 str.w r3, [r2, #232] @ 0xe8
  7065. 8003478: 4ba9 ldr r3, [pc, #676] @ (8003720 <HAL_UART_MspInit+0x320>)
  7066. 800347a: f8d3 30e8 ldr.w r3, [r3, #232] @ 0xe8
  7067. 800347e: f003 4300 and.w r3, r3, #2147483648 @ 0x80000000
  7068. 8003482: 62fb str r3, [r7, #44] @ 0x2c
  7069. 8003484: 6afb ldr r3, [r7, #44] @ 0x2c
  7070. __HAL_RCC_GPIOE_CLK_ENABLE();
  7071. 8003486: 4ba6 ldr r3, [pc, #664] @ (8003720 <HAL_UART_MspInit+0x320>)
  7072. 8003488: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  7073. 800348c: 4aa4 ldr r2, [pc, #656] @ (8003720 <HAL_UART_MspInit+0x320>)
  7074. 800348e: f043 0310 orr.w r3, r3, #16
  7075. 8003492: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  7076. 8003496: 4ba2 ldr r3, [pc, #648] @ (8003720 <HAL_UART_MspInit+0x320>)
  7077. 8003498: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  7078. 800349c: f003 0310 and.w r3, r3, #16
  7079. 80034a0: 62bb str r3, [r7, #40] @ 0x28
  7080. 80034a2: 6abb ldr r3, [r7, #40] @ 0x28
  7081. /**UART8 GPIO Configuration
  7082. PE0 ------> UART8_RX
  7083. PE1 ------> UART8_TX
  7084. */
  7085. GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  7086. 80034a4: 2303 movs r3, #3
  7087. 80034a6: f8c7 30f4 str.w r3, [r7, #244] @ 0xf4
  7088. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  7089. 80034aa: 2302 movs r3, #2
  7090. 80034ac: f8c7 30f8 str.w r3, [r7, #248] @ 0xf8
  7091. GPIO_InitStruct.Pull = GPIO_NOPULL;
  7092. 80034b0: 2300 movs r3, #0
  7093. 80034b2: f8c7 30fc str.w r3, [r7, #252] @ 0xfc
  7094. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  7095. 80034b6: 2300 movs r3, #0
  7096. 80034b8: f8c7 3100 str.w r3, [r7, #256] @ 0x100
  7097. GPIO_InitStruct.Alternate = GPIO_AF8_UART8;
  7098. 80034bc: 2308 movs r3, #8
  7099. 80034be: f8c7 3104 str.w r3, [r7, #260] @ 0x104
  7100. HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  7101. 80034c2: f107 03f4 add.w r3, r7, #244 @ 0xf4
  7102. 80034c6: 4619 mov r1, r3
  7103. 80034c8: 4896 ldr r0, [pc, #600] @ (8003724 <HAL_UART_MspInit+0x324>)
  7104. 80034ca: f006 f8e1 bl 8009690 <HAL_GPIO_Init>
  7105. /* UART8 DMA Init */
  7106. /* UART8_RX Init */
  7107. hdma_uart8_rx.Instance = DMA2_Stream7;
  7108. 80034ce: 4b96 ldr r3, [pc, #600] @ (8003728 <HAL_UART_MspInit+0x328>)
  7109. 80034d0: 4a96 ldr r2, [pc, #600] @ (800372c <HAL_UART_MspInit+0x32c>)
  7110. 80034d2: 601a str r2, [r3, #0]
  7111. hdma_uart8_rx.Init.Request = DMA_REQUEST_UART8_RX;
  7112. 80034d4: 4b94 ldr r3, [pc, #592] @ (8003728 <HAL_UART_MspInit+0x328>)
  7113. 80034d6: 2251 movs r2, #81 @ 0x51
  7114. 80034d8: 605a str r2, [r3, #4]
  7115. hdma_uart8_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  7116. 80034da: 4b93 ldr r3, [pc, #588] @ (8003728 <HAL_UART_MspInit+0x328>)
  7117. 80034dc: 2200 movs r2, #0
  7118. 80034de: 609a str r2, [r3, #8]
  7119. hdma_uart8_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  7120. 80034e0: 4b91 ldr r3, [pc, #580] @ (8003728 <HAL_UART_MspInit+0x328>)
  7121. 80034e2: 2200 movs r2, #0
  7122. 80034e4: 60da str r2, [r3, #12]
  7123. hdma_uart8_rx.Init.MemInc = DMA_MINC_ENABLE;
  7124. 80034e6: 4b90 ldr r3, [pc, #576] @ (8003728 <HAL_UART_MspInit+0x328>)
  7125. 80034e8: f44f 6280 mov.w r2, #1024 @ 0x400
  7126. 80034ec: 611a str r2, [r3, #16]
  7127. hdma_uart8_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  7128. 80034ee: 4b8e ldr r3, [pc, #568] @ (8003728 <HAL_UART_MspInit+0x328>)
  7129. 80034f0: 2200 movs r2, #0
  7130. 80034f2: 615a str r2, [r3, #20]
  7131. hdma_uart8_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  7132. 80034f4: 4b8c ldr r3, [pc, #560] @ (8003728 <HAL_UART_MspInit+0x328>)
  7133. 80034f6: 2200 movs r2, #0
  7134. 80034f8: 619a str r2, [r3, #24]
  7135. hdma_uart8_rx.Init.Mode = DMA_NORMAL;
  7136. 80034fa: 4b8b ldr r3, [pc, #556] @ (8003728 <HAL_UART_MspInit+0x328>)
  7137. 80034fc: 2200 movs r2, #0
  7138. 80034fe: 61da str r2, [r3, #28]
  7139. hdma_uart8_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
  7140. 8003500: 4b89 ldr r3, [pc, #548] @ (8003728 <HAL_UART_MspInit+0x328>)
  7141. 8003502: f44f 3240 mov.w r2, #196608 @ 0x30000
  7142. 8003506: 621a str r2, [r3, #32]
  7143. hdma_uart8_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  7144. 8003508: 4b87 ldr r3, [pc, #540] @ (8003728 <HAL_UART_MspInit+0x328>)
  7145. 800350a: 2200 movs r2, #0
  7146. 800350c: 625a str r2, [r3, #36] @ 0x24
  7147. if (HAL_DMA_Init(&hdma_uart8_rx) != HAL_OK)
  7148. 800350e: 4886 ldr r0, [pc, #536] @ (8003728 <HAL_UART_MspInit+0x328>)
  7149. 8003510: f002 f93c bl 800578c <HAL_DMA_Init>
  7150. 8003514: 4603 mov r3, r0
  7151. 8003516: 2b00 cmp r3, #0
  7152. 8003518: d001 beq.n 800351e <HAL_UART_MspInit+0x11e>
  7153. {
  7154. Error_Handler();
  7155. 800351a: f7fe fff5 bl 8002508 <Error_Handler>
  7156. }
  7157. __HAL_LINKDMA(huart,hdmarx,hdma_uart8_rx);
  7158. 800351e: f507 7384 add.w r3, r7, #264 @ 0x108
  7159. 8003522: f5a3 7382 sub.w r3, r3, #260 @ 0x104
  7160. 8003526: 681b ldr r3, [r3, #0]
  7161. 8003528: 4a7f ldr r2, [pc, #508] @ (8003728 <HAL_UART_MspInit+0x328>)
  7162. 800352a: f8c3 2080 str.w r2, [r3, #128] @ 0x80
  7163. 800352e: 4a7e ldr r2, [pc, #504] @ (8003728 <HAL_UART_MspInit+0x328>)
  7164. 8003530: f507 7384 add.w r3, r7, #264 @ 0x108
  7165. 8003534: f5a3 7382 sub.w r3, r3, #260 @ 0x104
  7166. 8003538: 681b ldr r3, [r3, #0]
  7167. 800353a: 6393 str r3, [r2, #56] @ 0x38
  7168. /* UART8_TX Init */
  7169. hdma_uart8_tx.Instance = DMA2_Stream6;
  7170. 800353c: 4b7c ldr r3, [pc, #496] @ (8003730 <HAL_UART_MspInit+0x330>)
  7171. 800353e: 4a7d ldr r2, [pc, #500] @ (8003734 <HAL_UART_MspInit+0x334>)
  7172. 8003540: 601a str r2, [r3, #0]
  7173. hdma_uart8_tx.Init.Request = DMA_REQUEST_UART8_TX;
  7174. 8003542: 4b7b ldr r3, [pc, #492] @ (8003730 <HAL_UART_MspInit+0x330>)
  7175. 8003544: 2252 movs r2, #82 @ 0x52
  7176. 8003546: 605a str r2, [r3, #4]
  7177. hdma_uart8_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  7178. 8003548: 4b79 ldr r3, [pc, #484] @ (8003730 <HAL_UART_MspInit+0x330>)
  7179. 800354a: 2240 movs r2, #64 @ 0x40
  7180. 800354c: 609a str r2, [r3, #8]
  7181. hdma_uart8_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  7182. 800354e: 4b78 ldr r3, [pc, #480] @ (8003730 <HAL_UART_MspInit+0x330>)
  7183. 8003550: 2200 movs r2, #0
  7184. 8003552: 60da str r2, [r3, #12]
  7185. hdma_uart8_tx.Init.MemInc = DMA_MINC_ENABLE;
  7186. 8003554: 4b76 ldr r3, [pc, #472] @ (8003730 <HAL_UART_MspInit+0x330>)
  7187. 8003556: f44f 6280 mov.w r2, #1024 @ 0x400
  7188. 800355a: 611a str r2, [r3, #16]
  7189. hdma_uart8_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  7190. 800355c: 4b74 ldr r3, [pc, #464] @ (8003730 <HAL_UART_MspInit+0x330>)
  7191. 800355e: 2200 movs r2, #0
  7192. 8003560: 615a str r2, [r3, #20]
  7193. hdma_uart8_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  7194. 8003562: 4b73 ldr r3, [pc, #460] @ (8003730 <HAL_UART_MspInit+0x330>)
  7195. 8003564: 2200 movs r2, #0
  7196. 8003566: 619a str r2, [r3, #24]
  7197. hdma_uart8_tx.Init.Mode = DMA_NORMAL;
  7198. 8003568: 4b71 ldr r3, [pc, #452] @ (8003730 <HAL_UART_MspInit+0x330>)
  7199. 800356a: 2200 movs r2, #0
  7200. 800356c: 61da str r2, [r3, #28]
  7201. hdma_uart8_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
  7202. 800356e: 4b70 ldr r3, [pc, #448] @ (8003730 <HAL_UART_MspInit+0x330>)
  7203. 8003570: f44f 3240 mov.w r2, #196608 @ 0x30000
  7204. 8003574: 621a str r2, [r3, #32]
  7205. hdma_uart8_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  7206. 8003576: 4b6e ldr r3, [pc, #440] @ (8003730 <HAL_UART_MspInit+0x330>)
  7207. 8003578: 2200 movs r2, #0
  7208. 800357a: 625a str r2, [r3, #36] @ 0x24
  7209. if (HAL_DMA_Init(&hdma_uart8_tx) != HAL_OK)
  7210. 800357c: 486c ldr r0, [pc, #432] @ (8003730 <HAL_UART_MspInit+0x330>)
  7211. 800357e: f002 f905 bl 800578c <HAL_DMA_Init>
  7212. 8003582: 4603 mov r3, r0
  7213. 8003584: 2b00 cmp r3, #0
  7214. 8003586: d001 beq.n 800358c <HAL_UART_MspInit+0x18c>
  7215. {
  7216. Error_Handler();
  7217. 8003588: f7fe ffbe bl 8002508 <Error_Handler>
  7218. }
  7219. __HAL_LINKDMA(huart,hdmatx,hdma_uart8_tx);
  7220. 800358c: f507 7384 add.w r3, r7, #264 @ 0x108
  7221. 8003590: f5a3 7382 sub.w r3, r3, #260 @ 0x104
  7222. 8003594: 681b ldr r3, [r3, #0]
  7223. 8003596: 4a66 ldr r2, [pc, #408] @ (8003730 <HAL_UART_MspInit+0x330>)
  7224. 8003598: 67da str r2, [r3, #124] @ 0x7c
  7225. 800359a: 4a65 ldr r2, [pc, #404] @ (8003730 <HAL_UART_MspInit+0x330>)
  7226. 800359c: f507 7384 add.w r3, r7, #264 @ 0x108
  7227. 80035a0: f5a3 7382 sub.w r3, r3, #260 @ 0x104
  7228. 80035a4: 681b ldr r3, [r3, #0]
  7229. 80035a6: 6393 str r3, [r2, #56] @ 0x38
  7230. /* UART8 interrupt Init */
  7231. HAL_NVIC_SetPriority(UART8_IRQn, 5, 0);
  7232. 80035a8: 2200 movs r2, #0
  7233. 80035aa: 2105 movs r1, #5
  7234. 80035ac: 2053 movs r0, #83 @ 0x53
  7235. 80035ae: f001 fe47 bl 8005240 <HAL_NVIC_SetPriority>
  7236. HAL_NVIC_EnableIRQ(UART8_IRQn);
  7237. 80035b2: 2053 movs r0, #83 @ 0x53
  7238. 80035b4: f001 fe5e bl 8005274 <HAL_NVIC_EnableIRQ>
  7239. /* USER CODE BEGIN USART6_MspInit 1 */
  7240. /* USER CODE END USART6_MspInit 1 */
  7241. }
  7242. }
  7243. 80035b8: e17e b.n 80038b8 <HAL_UART_MspInit+0x4b8>
  7244. else if(huart->Instance==USART1)
  7245. 80035ba: f507 7384 add.w r3, r7, #264 @ 0x108
  7246. 80035be: f5a3 7382 sub.w r3, r3, #260 @ 0x104
  7247. 80035c2: 681b ldr r3, [r3, #0]
  7248. 80035c4: 681b ldr r3, [r3, #0]
  7249. 80035c6: 4a5c ldr r2, [pc, #368] @ (8003738 <HAL_UART_MspInit+0x338>)
  7250. 80035c8: 4293 cmp r3, r2
  7251. 80035ca: d14f bne.n 800366c <HAL_UART_MspInit+0x26c>
  7252. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  7253. 80035cc: f04f 0201 mov.w r2, #1
  7254. 80035d0: f04f 0300 mov.w r3, #0
  7255. 80035d4: e9c7 230c strd r2, r3, [r7, #48] @ 0x30
  7256. PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
  7257. 80035d8: 2300 movs r3, #0
  7258. 80035da: f8c7 30ac str.w r3, [r7, #172] @ 0xac
  7259. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  7260. 80035de: f107 0330 add.w r3, r7, #48 @ 0x30
  7261. 80035e2: 4618 mov r0, r3
  7262. 80035e4: f007 fa80 bl 800aae8 <HAL_RCCEx_PeriphCLKConfig>
  7263. 80035e8: 4603 mov r3, r0
  7264. 80035ea: 2b00 cmp r3, #0
  7265. 80035ec: d001 beq.n 80035f2 <HAL_UART_MspInit+0x1f2>
  7266. Error_Handler();
  7267. 80035ee: f7fe ff8b bl 8002508 <Error_Handler>
  7268. __HAL_RCC_USART1_CLK_ENABLE();
  7269. 80035f2: 4b4b ldr r3, [pc, #300] @ (8003720 <HAL_UART_MspInit+0x320>)
  7270. 80035f4: f8d3 30f0 ldr.w r3, [r3, #240] @ 0xf0
  7271. 80035f8: 4a49 ldr r2, [pc, #292] @ (8003720 <HAL_UART_MspInit+0x320>)
  7272. 80035fa: f043 0310 orr.w r3, r3, #16
  7273. 80035fe: f8c2 30f0 str.w r3, [r2, #240] @ 0xf0
  7274. 8003602: 4b47 ldr r3, [pc, #284] @ (8003720 <HAL_UART_MspInit+0x320>)
  7275. 8003604: f8d3 30f0 ldr.w r3, [r3, #240] @ 0xf0
  7276. 8003608: f003 0310 and.w r3, r3, #16
  7277. 800360c: 627b str r3, [r7, #36] @ 0x24
  7278. 800360e: 6a7b ldr r3, [r7, #36] @ 0x24
  7279. __HAL_RCC_GPIOB_CLK_ENABLE();
  7280. 8003610: 4b43 ldr r3, [pc, #268] @ (8003720 <HAL_UART_MspInit+0x320>)
  7281. 8003612: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  7282. 8003616: 4a42 ldr r2, [pc, #264] @ (8003720 <HAL_UART_MspInit+0x320>)
  7283. 8003618: f043 0302 orr.w r3, r3, #2
  7284. 800361c: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  7285. 8003620: 4b3f ldr r3, [pc, #252] @ (8003720 <HAL_UART_MspInit+0x320>)
  7286. 8003622: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  7287. 8003626: f003 0302 and.w r3, r3, #2
  7288. 800362a: 623b str r3, [r7, #32]
  7289. 800362c: 6a3b ldr r3, [r7, #32]
  7290. GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
  7291. 800362e: f44f 4340 mov.w r3, #49152 @ 0xc000
  7292. 8003632: f8c7 30f4 str.w r3, [r7, #244] @ 0xf4
  7293. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  7294. 8003636: 2302 movs r3, #2
  7295. 8003638: f8c7 30f8 str.w r3, [r7, #248] @ 0xf8
  7296. GPIO_InitStruct.Pull = GPIO_NOPULL;
  7297. 800363c: 2300 movs r3, #0
  7298. 800363e: f8c7 30fc str.w r3, [r7, #252] @ 0xfc
  7299. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  7300. 8003642: 2302 movs r3, #2
  7301. 8003644: f8c7 3100 str.w r3, [r7, #256] @ 0x100
  7302. GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
  7303. 8003648: 2304 movs r3, #4
  7304. 800364a: f8c7 3104 str.w r3, [r7, #260] @ 0x104
  7305. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  7306. 800364e: f107 03f4 add.w r3, r7, #244 @ 0xf4
  7307. 8003652: 4619 mov r1, r3
  7308. 8003654: 4839 ldr r0, [pc, #228] @ (800373c <HAL_UART_MspInit+0x33c>)
  7309. 8003656: f006 f81b bl 8009690 <HAL_GPIO_Init>
  7310. HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
  7311. 800365a: 2200 movs r2, #0
  7312. 800365c: 2105 movs r1, #5
  7313. 800365e: 2025 movs r0, #37 @ 0x25
  7314. 8003660: f001 fdee bl 8005240 <HAL_NVIC_SetPriority>
  7315. HAL_NVIC_EnableIRQ(USART1_IRQn);
  7316. 8003664: 2025 movs r0, #37 @ 0x25
  7317. 8003666: f001 fe05 bl 8005274 <HAL_NVIC_EnableIRQ>
  7318. }
  7319. 800366a: e125 b.n 80038b8 <HAL_UART_MspInit+0x4b8>
  7320. else if(huart->Instance==USART2)
  7321. 800366c: f507 7384 add.w r3, r7, #264 @ 0x108
  7322. 8003670: f5a3 7382 sub.w r3, r3, #260 @ 0x104
  7323. 8003674: 681b ldr r3, [r3, #0]
  7324. 8003676: 681b ldr r3, [r3, #0]
  7325. 8003678: 4a31 ldr r2, [pc, #196] @ (8003740 <HAL_UART_MspInit+0x340>)
  7326. 800367a: 4293 cmp r3, r2
  7327. 800367c: d164 bne.n 8003748 <HAL_UART_MspInit+0x348>
  7328. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART2;
  7329. 800367e: f04f 0202 mov.w r2, #2
  7330. 8003682: f04f 0300 mov.w r3, #0
  7331. 8003686: e9c7 230c strd r2, r3, [r7, #48] @ 0x30
  7332. PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
  7333. 800368a: 2300 movs r3, #0
  7334. 800368c: f8c7 30a8 str.w r3, [r7, #168] @ 0xa8
  7335. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  7336. 8003690: f107 0330 add.w r3, r7, #48 @ 0x30
  7337. 8003694: 4618 mov r0, r3
  7338. 8003696: f007 fa27 bl 800aae8 <HAL_RCCEx_PeriphCLKConfig>
  7339. 800369a: 4603 mov r3, r0
  7340. 800369c: 2b00 cmp r3, #0
  7341. 800369e: d001 beq.n 80036a4 <HAL_UART_MspInit+0x2a4>
  7342. Error_Handler();
  7343. 80036a0: f7fe ff32 bl 8002508 <Error_Handler>
  7344. __HAL_RCC_USART2_CLK_ENABLE();
  7345. 80036a4: 4b1e ldr r3, [pc, #120] @ (8003720 <HAL_UART_MspInit+0x320>)
  7346. 80036a6: f8d3 30e8 ldr.w r3, [r3, #232] @ 0xe8
  7347. 80036aa: 4a1d ldr r2, [pc, #116] @ (8003720 <HAL_UART_MspInit+0x320>)
  7348. 80036ac: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  7349. 80036b0: f8c2 30e8 str.w r3, [r2, #232] @ 0xe8
  7350. 80036b4: 4b1a ldr r3, [pc, #104] @ (8003720 <HAL_UART_MspInit+0x320>)
  7351. 80036b6: f8d3 30e8 ldr.w r3, [r3, #232] @ 0xe8
  7352. 80036ba: f403 3300 and.w r3, r3, #131072 @ 0x20000
  7353. 80036be: 61fb str r3, [r7, #28]
  7354. 80036c0: 69fb ldr r3, [r7, #28]
  7355. __HAL_RCC_GPIOD_CLK_ENABLE();
  7356. 80036c2: 4b17 ldr r3, [pc, #92] @ (8003720 <HAL_UART_MspInit+0x320>)
  7357. 80036c4: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  7358. 80036c8: 4a15 ldr r2, [pc, #84] @ (8003720 <HAL_UART_MspInit+0x320>)
  7359. 80036ca: f043 0308 orr.w r3, r3, #8
  7360. 80036ce: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  7361. 80036d2: 4b13 ldr r3, [pc, #76] @ (8003720 <HAL_UART_MspInit+0x320>)
  7362. 80036d4: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  7363. 80036d8: f003 0308 and.w r3, r3, #8
  7364. 80036dc: 61bb str r3, [r7, #24]
  7365. 80036de: 69bb ldr r3, [r7, #24]
  7366. GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
  7367. 80036e0: 2360 movs r3, #96 @ 0x60
  7368. 80036e2: f8c7 30f4 str.w r3, [r7, #244] @ 0xf4
  7369. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  7370. 80036e6: 2302 movs r3, #2
  7371. 80036e8: f8c7 30f8 str.w r3, [r7, #248] @ 0xf8
  7372. GPIO_InitStruct.Pull = GPIO_NOPULL;
  7373. 80036ec: 2300 movs r3, #0
  7374. 80036ee: f8c7 30fc str.w r3, [r7, #252] @ 0xfc
  7375. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  7376. 80036f2: 2302 movs r3, #2
  7377. 80036f4: f8c7 3100 str.w r3, [r7, #256] @ 0x100
  7378. GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
  7379. 80036f8: 2307 movs r3, #7
  7380. 80036fa: f8c7 3104 str.w r3, [r7, #260] @ 0x104
  7381. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  7382. 80036fe: f107 03f4 add.w r3, r7, #244 @ 0xf4
  7383. 8003702: 4619 mov r1, r3
  7384. 8003704: 480f ldr r0, [pc, #60] @ (8003744 <HAL_UART_MspInit+0x344>)
  7385. 8003706: f005 ffc3 bl 8009690 <HAL_GPIO_Init>
  7386. HAL_NVIC_SetPriority(USART2_IRQn, 5, 0);
  7387. 800370a: 2200 movs r2, #0
  7388. 800370c: 2105 movs r1, #5
  7389. 800370e: 2026 movs r0, #38 @ 0x26
  7390. 8003710: f001 fd96 bl 8005240 <HAL_NVIC_SetPriority>
  7391. HAL_NVIC_EnableIRQ(USART2_IRQn);
  7392. 8003714: 2026 movs r0, #38 @ 0x26
  7393. 8003716: f001 fdad bl 8005274 <HAL_NVIC_EnableIRQ>
  7394. }
  7395. 800371a: e0cd b.n 80038b8 <HAL_UART_MspInit+0x4b8>
  7396. 800371c: 40007c00 .word 0x40007c00
  7397. 8003720: 58024400 .word 0x58024400
  7398. 8003724: 58021000 .word 0x58021000
  7399. 8003728: 24000564 .word 0x24000564
  7400. 800372c: 400204b8 .word 0x400204b8
  7401. 8003730: 240005dc .word 0x240005dc
  7402. 8003734: 400204a0 .word 0x400204a0
  7403. 8003738: 40011000 .word 0x40011000
  7404. 800373c: 58020400 .word 0x58020400
  7405. 8003740: 40004400 .word 0x40004400
  7406. 8003744: 58020c00 .word 0x58020c00
  7407. else if(huart->Instance==USART3)
  7408. 8003748: f507 7384 add.w r3, r7, #264 @ 0x108
  7409. 800374c: f5a3 7382 sub.w r3, r3, #260 @ 0x104
  7410. 8003750: 681b ldr r3, [r3, #0]
  7411. 8003752: 681b ldr r3, [r3, #0]
  7412. 8003754: 4a5b ldr r2, [pc, #364] @ (80038c4 <HAL_UART_MspInit+0x4c4>)
  7413. 8003756: 4293 cmp r3, r2
  7414. 8003758: d14f bne.n 80037fa <HAL_UART_MspInit+0x3fa>
  7415. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART3;
  7416. 800375a: f04f 0202 mov.w r2, #2
  7417. 800375e: f04f 0300 mov.w r3, #0
  7418. 8003762: e9c7 230c strd r2, r3, [r7, #48] @ 0x30
  7419. PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
  7420. 8003766: 2300 movs r3, #0
  7421. 8003768: f8c7 30a8 str.w r3, [r7, #168] @ 0xa8
  7422. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  7423. 800376c: f107 0330 add.w r3, r7, #48 @ 0x30
  7424. 8003770: 4618 mov r0, r3
  7425. 8003772: f007 f9b9 bl 800aae8 <HAL_RCCEx_PeriphCLKConfig>
  7426. 8003776: 4603 mov r3, r0
  7427. 8003778: 2b00 cmp r3, #0
  7428. 800377a: d001 beq.n 8003780 <HAL_UART_MspInit+0x380>
  7429. Error_Handler();
  7430. 800377c: f7fe fec4 bl 8002508 <Error_Handler>
  7431. __HAL_RCC_USART3_CLK_ENABLE();
  7432. 8003780: 4b51 ldr r3, [pc, #324] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7433. 8003782: f8d3 30e8 ldr.w r3, [r3, #232] @ 0xe8
  7434. 8003786: 4a50 ldr r2, [pc, #320] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7435. 8003788: f443 2380 orr.w r3, r3, #262144 @ 0x40000
  7436. 800378c: f8c2 30e8 str.w r3, [r2, #232] @ 0xe8
  7437. 8003790: 4b4d ldr r3, [pc, #308] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7438. 8003792: f8d3 30e8 ldr.w r3, [r3, #232] @ 0xe8
  7439. 8003796: f403 2380 and.w r3, r3, #262144 @ 0x40000
  7440. 800379a: 617b str r3, [r7, #20]
  7441. 800379c: 697b ldr r3, [r7, #20]
  7442. __HAL_RCC_GPIOD_CLK_ENABLE();
  7443. 800379e: 4b4a ldr r3, [pc, #296] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7444. 80037a0: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  7445. 80037a4: 4a48 ldr r2, [pc, #288] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7446. 80037a6: f043 0308 orr.w r3, r3, #8
  7447. 80037aa: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  7448. 80037ae: 4b46 ldr r3, [pc, #280] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7449. 80037b0: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  7450. 80037b4: f003 0308 and.w r3, r3, #8
  7451. 80037b8: 613b str r3, [r7, #16]
  7452. 80037ba: 693b ldr r3, [r7, #16]
  7453. GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
  7454. 80037bc: f44f 7340 mov.w r3, #768 @ 0x300
  7455. 80037c0: f8c7 30f4 str.w r3, [r7, #244] @ 0xf4
  7456. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  7457. 80037c4: 2302 movs r3, #2
  7458. 80037c6: f8c7 30f8 str.w r3, [r7, #248] @ 0xf8
  7459. GPIO_InitStruct.Pull = GPIO_NOPULL;
  7460. 80037ca: 2300 movs r3, #0
  7461. 80037cc: f8c7 30fc str.w r3, [r7, #252] @ 0xfc
  7462. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  7463. 80037d0: 2302 movs r3, #2
  7464. 80037d2: f8c7 3100 str.w r3, [r7, #256] @ 0x100
  7465. GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
  7466. 80037d6: 2307 movs r3, #7
  7467. 80037d8: f8c7 3104 str.w r3, [r7, #260] @ 0x104
  7468. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  7469. 80037dc: f107 03f4 add.w r3, r7, #244 @ 0xf4
  7470. 80037e0: 4619 mov r1, r3
  7471. 80037e2: 483a ldr r0, [pc, #232] @ (80038cc <HAL_UART_MspInit+0x4cc>)
  7472. 80037e4: f005 ff54 bl 8009690 <HAL_GPIO_Init>
  7473. HAL_NVIC_SetPriority(USART3_IRQn, 5, 0);
  7474. 80037e8: 2200 movs r2, #0
  7475. 80037ea: 2105 movs r1, #5
  7476. 80037ec: 2027 movs r0, #39 @ 0x27
  7477. 80037ee: f001 fd27 bl 8005240 <HAL_NVIC_SetPriority>
  7478. HAL_NVIC_EnableIRQ(USART3_IRQn);
  7479. 80037f2: 2027 movs r0, #39 @ 0x27
  7480. 80037f4: f001 fd3e bl 8005274 <HAL_NVIC_EnableIRQ>
  7481. }
  7482. 80037f8: e05e b.n 80038b8 <HAL_UART_MspInit+0x4b8>
  7483. else if(huart->Instance==USART6)
  7484. 80037fa: f507 7384 add.w r3, r7, #264 @ 0x108
  7485. 80037fe: f5a3 7382 sub.w r3, r3, #260 @ 0x104
  7486. 8003802: 681b ldr r3, [r3, #0]
  7487. 8003804: 681b ldr r3, [r3, #0]
  7488. 8003806: 4a32 ldr r2, [pc, #200] @ (80038d0 <HAL_UART_MspInit+0x4d0>)
  7489. 8003808: 4293 cmp r3, r2
  7490. 800380a: d155 bne.n 80038b8 <HAL_UART_MspInit+0x4b8>
  7491. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART6;
  7492. 800380c: f04f 0201 mov.w r2, #1
  7493. 8003810: f04f 0300 mov.w r3, #0
  7494. 8003814: e9c7 230c strd r2, r3, [r7, #48] @ 0x30
  7495. PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
  7496. 8003818: 2300 movs r3, #0
  7497. 800381a: f8c7 30ac str.w r3, [r7, #172] @ 0xac
  7498. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  7499. 800381e: f107 0330 add.w r3, r7, #48 @ 0x30
  7500. 8003822: 4618 mov r0, r3
  7501. 8003824: f007 f960 bl 800aae8 <HAL_RCCEx_PeriphCLKConfig>
  7502. 8003828: 4603 mov r3, r0
  7503. 800382a: 2b00 cmp r3, #0
  7504. 800382c: d001 beq.n 8003832 <HAL_UART_MspInit+0x432>
  7505. Error_Handler();
  7506. 800382e: f7fe fe6b bl 8002508 <Error_Handler>
  7507. __HAL_RCC_USART6_CLK_ENABLE();
  7508. 8003832: 4b25 ldr r3, [pc, #148] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7509. 8003834: f8d3 30f0 ldr.w r3, [r3, #240] @ 0xf0
  7510. 8003838: 4a23 ldr r2, [pc, #140] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7511. 800383a: f043 0320 orr.w r3, r3, #32
  7512. 800383e: f8c2 30f0 str.w r3, [r2, #240] @ 0xf0
  7513. 8003842: 4b21 ldr r3, [pc, #132] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7514. 8003844: f8d3 30f0 ldr.w r3, [r3, #240] @ 0xf0
  7515. 8003848: f003 0320 and.w r3, r3, #32
  7516. 800384c: 60fb str r3, [r7, #12]
  7517. 800384e: 68fb ldr r3, [r7, #12]
  7518. __HAL_RCC_GPIOC_CLK_ENABLE();
  7519. 8003850: 4b1d ldr r3, [pc, #116] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7520. 8003852: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  7521. 8003856: 4a1c ldr r2, [pc, #112] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7522. 8003858: f043 0304 orr.w r3, r3, #4
  7523. 800385c: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  7524. 8003860: 4b19 ldr r3, [pc, #100] @ (80038c8 <HAL_UART_MspInit+0x4c8>)
  7525. 8003862: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  7526. 8003866: f003 0204 and.w r2, r3, #4
  7527. 800386a: f507 7384 add.w r3, r7, #264 @ 0x108
  7528. 800386e: f5a3 7380 sub.w r3, r3, #256 @ 0x100
  7529. 8003872: 601a str r2, [r3, #0]
  7530. 8003874: f507 7384 add.w r3, r7, #264 @ 0x108
  7531. 8003878: f5a3 7380 sub.w r3, r3, #256 @ 0x100
  7532. 800387c: 681b ldr r3, [r3, #0]
  7533. GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
  7534. 800387e: 23c0 movs r3, #192 @ 0xc0
  7535. 8003880: f8c7 30f4 str.w r3, [r7, #244] @ 0xf4
  7536. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  7537. 8003884: 2302 movs r3, #2
  7538. 8003886: f8c7 30f8 str.w r3, [r7, #248] @ 0xf8
  7539. GPIO_InitStruct.Pull = GPIO_NOPULL;
  7540. 800388a: 2300 movs r3, #0
  7541. 800388c: f8c7 30fc str.w r3, [r7, #252] @ 0xfc
  7542. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  7543. 8003890: 2302 movs r3, #2
  7544. 8003892: f8c7 3100 str.w r3, [r7, #256] @ 0x100
  7545. GPIO_InitStruct.Alternate = GPIO_AF7_USART6;
  7546. 8003896: 2307 movs r3, #7
  7547. 8003898: f8c7 3104 str.w r3, [r7, #260] @ 0x104
  7548. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  7549. 800389c: f107 03f4 add.w r3, r7, #244 @ 0xf4
  7550. 80038a0: 4619 mov r1, r3
  7551. 80038a2: 480c ldr r0, [pc, #48] @ (80038d4 <HAL_UART_MspInit+0x4d4>)
  7552. 80038a4: f005 fef4 bl 8009690 <HAL_GPIO_Init>
  7553. HAL_NVIC_SetPriority(USART6_IRQn, 5, 0);
  7554. 80038a8: 2200 movs r2, #0
  7555. 80038aa: 2105 movs r1, #5
  7556. 80038ac: 2047 movs r0, #71 @ 0x47
  7557. 80038ae: f001 fcc7 bl 8005240 <HAL_NVIC_SetPriority>
  7558. HAL_NVIC_EnableIRQ(USART6_IRQn);
  7559. 80038b2: 2047 movs r0, #71 @ 0x47
  7560. 80038b4: f001 fcde bl 8005274 <HAL_NVIC_EnableIRQ>
  7561. }
  7562. 80038b8: bf00 nop
  7563. 80038ba: f507 7784 add.w r7, r7, #264 @ 0x108
  7564. 80038be: 46bd mov sp, r7
  7565. 80038c0: bd80 pop {r7, pc}
  7566. 80038c2: bf00 nop
  7567. 80038c4: 40004800 .word 0x40004800
  7568. 80038c8: 58024400 .word 0x58024400
  7569. 80038cc: 58020c00 .word 0x58020c00
  7570. 80038d0: 40011400 .word 0x40011400
  7571. 80038d4: 58020800 .word 0x58020800
  7572. 080038d8 <HAL_InitTick>:
  7573. * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
  7574. * @param TickPriority: Tick interrupt priority.
  7575. * @retval HAL status
  7576. */
  7577. HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
  7578. {
  7579. 80038d8: b580 push {r7, lr}
  7580. 80038da: b090 sub sp, #64 @ 0x40
  7581. 80038dc: af00 add r7, sp, #0
  7582. 80038de: 6078 str r0, [r7, #4]
  7583. uint32_t uwTimclock, uwAPB1Prescaler;
  7584. uint32_t uwPrescalerValue;
  7585. uint32_t pFLatency;
  7586. /*Configure the TIM6 IRQ priority */
  7587. if (TickPriority < (1UL << __NVIC_PRIO_BITS))
  7588. 80038e0: 687b ldr r3, [r7, #4]
  7589. 80038e2: 2b0f cmp r3, #15
  7590. 80038e4: d827 bhi.n 8003936 <HAL_InitTick+0x5e>
  7591. {
  7592. HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority ,0U);
  7593. 80038e6: 2200 movs r2, #0
  7594. 80038e8: 6879 ldr r1, [r7, #4]
  7595. 80038ea: 2036 movs r0, #54 @ 0x36
  7596. 80038ec: f001 fca8 bl 8005240 <HAL_NVIC_SetPriority>
  7597. /* Enable the TIM6 global Interrupt */
  7598. HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
  7599. 80038f0: 2036 movs r0, #54 @ 0x36
  7600. 80038f2: f001 fcbf bl 8005274 <HAL_NVIC_EnableIRQ>
  7601. uwTickPrio = TickPriority;
  7602. 80038f6: 4a29 ldr r2, [pc, #164] @ (800399c <HAL_InitTick+0xc4>)
  7603. 80038f8: 687b ldr r3, [r7, #4]
  7604. 80038fa: 6013 str r3, [r2, #0]
  7605. {
  7606. return HAL_ERROR;
  7607. }
  7608. /* Enable TIM6 clock */
  7609. __HAL_RCC_TIM6_CLK_ENABLE();
  7610. 80038fc: 4b28 ldr r3, [pc, #160] @ (80039a0 <HAL_InitTick+0xc8>)
  7611. 80038fe: f8d3 30e8 ldr.w r3, [r3, #232] @ 0xe8
  7612. 8003902: 4a27 ldr r2, [pc, #156] @ (80039a0 <HAL_InitTick+0xc8>)
  7613. 8003904: f043 0310 orr.w r3, r3, #16
  7614. 8003908: f8c2 30e8 str.w r3, [r2, #232] @ 0xe8
  7615. 800390c: 4b24 ldr r3, [pc, #144] @ (80039a0 <HAL_InitTick+0xc8>)
  7616. 800390e: f8d3 30e8 ldr.w r3, [r3, #232] @ 0xe8
  7617. 8003912: f003 0310 and.w r3, r3, #16
  7618. 8003916: 60fb str r3, [r7, #12]
  7619. 8003918: 68fb ldr r3, [r7, #12]
  7620. /* Get clock configuration */
  7621. HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
  7622. 800391a: f107 0210 add.w r2, r7, #16
  7623. 800391e: f107 0314 add.w r3, r7, #20
  7624. 8003922: 4611 mov r1, r2
  7625. 8003924: 4618 mov r0, r3
  7626. 8003926: f007 f89d bl 800aa64 <HAL_RCC_GetClockConfig>
  7627. /* Get APB1 prescaler */
  7628. uwAPB1Prescaler = clkconfig.APB1CLKDivider;
  7629. 800392a: 6abb ldr r3, [r7, #40] @ 0x28
  7630. 800392c: 63bb str r3, [r7, #56] @ 0x38
  7631. /* Compute TIM6 clock */
  7632. if (uwAPB1Prescaler == RCC_HCLK_DIV1)
  7633. 800392e: 6bbb ldr r3, [r7, #56] @ 0x38
  7634. 8003930: 2b00 cmp r3, #0
  7635. 8003932: d106 bne.n 8003942 <HAL_InitTick+0x6a>
  7636. 8003934: e001 b.n 800393a <HAL_InitTick+0x62>
  7637. return HAL_ERROR;
  7638. 8003936: 2301 movs r3, #1
  7639. 8003938: e02b b.n 8003992 <HAL_InitTick+0xba>
  7640. {
  7641. uwTimclock = HAL_RCC_GetPCLK1Freq();
  7642. 800393a: f007 f867 bl 800aa0c <HAL_RCC_GetPCLK1Freq>
  7643. 800393e: 63f8 str r0, [r7, #60] @ 0x3c
  7644. 8003940: e004 b.n 800394c <HAL_InitTick+0x74>
  7645. }
  7646. else
  7647. {
  7648. uwTimclock = 2UL * HAL_RCC_GetPCLK1Freq();
  7649. 8003942: f007 f863 bl 800aa0c <HAL_RCC_GetPCLK1Freq>
  7650. 8003946: 4603 mov r3, r0
  7651. 8003948: 005b lsls r3, r3, #1
  7652. 800394a: 63fb str r3, [r7, #60] @ 0x3c
  7653. }
  7654. /* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */
  7655. uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);
  7656. 800394c: 6bfb ldr r3, [r7, #60] @ 0x3c
  7657. 800394e: 4a15 ldr r2, [pc, #84] @ (80039a4 <HAL_InitTick+0xcc>)
  7658. 8003950: fba2 2303 umull r2, r3, r2, r3
  7659. 8003954: 0c9b lsrs r3, r3, #18
  7660. 8003956: 3b01 subs r3, #1
  7661. 8003958: 637b str r3, [r7, #52] @ 0x34
  7662. /* Initialize TIM6 */
  7663. htim6.Instance = TIM6;
  7664. 800395a: 4b13 ldr r3, [pc, #76] @ (80039a8 <HAL_InitTick+0xd0>)
  7665. 800395c: 4a13 ldr r2, [pc, #76] @ (80039ac <HAL_InitTick+0xd4>)
  7666. 800395e: 601a str r2, [r3, #0]
  7667. + Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base.
  7668. + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
  7669. + ClockDivision = 0
  7670. + Counter direction = Up
  7671. */
  7672. htim6.Init.Period = (1000000U / 1000U) - 1U;
  7673. 8003960: 4b11 ldr r3, [pc, #68] @ (80039a8 <HAL_InitTick+0xd0>)
  7674. 8003962: f240 32e7 movw r2, #999 @ 0x3e7
  7675. 8003966: 60da str r2, [r3, #12]
  7676. htim6.Init.Prescaler = uwPrescalerValue;
  7677. 8003968: 4a0f ldr r2, [pc, #60] @ (80039a8 <HAL_InitTick+0xd0>)
  7678. 800396a: 6b7b ldr r3, [r7, #52] @ 0x34
  7679. 800396c: 6053 str r3, [r2, #4]
  7680. htim6.Init.ClockDivision = 0;
  7681. 800396e: 4b0e ldr r3, [pc, #56] @ (80039a8 <HAL_InitTick+0xd0>)
  7682. 8003970: 2200 movs r2, #0
  7683. 8003972: 611a str r2, [r3, #16]
  7684. htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  7685. 8003974: 4b0c ldr r3, [pc, #48] @ (80039a8 <HAL_InitTick+0xd0>)
  7686. 8003976: 2200 movs r2, #0
  7687. 8003978: 609a str r2, [r3, #8]
  7688. if(HAL_TIM_Base_Init(&htim6) == HAL_OK)
  7689. 800397a: 480b ldr r0, [pc, #44] @ (80039a8 <HAL_InitTick+0xd0>)
  7690. 800397c: f008 ff7c bl 800c878 <HAL_TIM_Base_Init>
  7691. 8003980: 4603 mov r3, r0
  7692. 8003982: 2b00 cmp r3, #0
  7693. 8003984: d104 bne.n 8003990 <HAL_InitTick+0xb8>
  7694. {
  7695. /* Start the TIM time Base generation in interrupt mode */
  7696. return HAL_TIM_Base_Start_IT(&htim6);
  7697. 8003986: 4808 ldr r0, [pc, #32] @ (80039a8 <HAL_InitTick+0xd0>)
  7698. 8003988: f008 ffd8 bl 800c93c <HAL_TIM_Base_Start_IT>
  7699. 800398c: 4603 mov r3, r0
  7700. 800398e: e000 b.n 8003992 <HAL_InitTick+0xba>
  7701. }
  7702. /* Return function status */
  7703. return HAL_ERROR;
  7704. 8003990: 2301 movs r3, #1
  7705. }
  7706. 8003992: 4618 mov r0, r3
  7707. 8003994: 3740 adds r7, #64 @ 0x40
  7708. 8003996: 46bd mov sp, r7
  7709. 8003998: bd80 pop {r7, pc}
  7710. 800399a: bf00 nop
  7711. 800399c: 2400002c .word 0x2400002c
  7712. 80039a0: 58024400 .word 0x58024400
  7713. 80039a4: 431bde83 .word 0x431bde83
  7714. 80039a8: 24000edc .word 0x24000edc
  7715. 80039ac: 40001000 .word 0x40001000
  7716. 080039b0 <NMI_Handler>:
  7717. /******************************************************************************/
  7718. /**
  7719. * @brief This function handles Non maskable interrupt.
  7720. */
  7721. void NMI_Handler(void)
  7722. {
  7723. 80039b0: b480 push {r7}
  7724. 80039b2: af00 add r7, sp, #0
  7725. /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
  7726. /* USER CODE END NonMaskableInt_IRQn 0 */
  7727. /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
  7728. while (1)
  7729. 80039b4: bf00 nop
  7730. 80039b6: e7fd b.n 80039b4 <NMI_Handler+0x4>
  7731. 080039b8 <HardFault_Handler>:
  7732. /**
  7733. * @brief This function handles Hard fault interrupt.
  7734. */
  7735. void HardFault_Handler(void)
  7736. {
  7737. 80039b8: b480 push {r7}
  7738. 80039ba: af00 add r7, sp, #0
  7739. /* USER CODE BEGIN HardFault_IRQn 0 */
  7740. /* USER CODE END HardFault_IRQn 0 */
  7741. while (1)
  7742. 80039bc: bf00 nop
  7743. 80039be: e7fd b.n 80039bc <HardFault_Handler+0x4>
  7744. 080039c0 <MemManage_Handler>:
  7745. /**
  7746. * @brief This function handles Memory management fault.
  7747. */
  7748. void MemManage_Handler(void)
  7749. {
  7750. 80039c0: b480 push {r7}
  7751. 80039c2: af00 add r7, sp, #0
  7752. /* USER CODE BEGIN MemoryManagement_IRQn 0 */
  7753. /* USER CODE END MemoryManagement_IRQn 0 */
  7754. while (1)
  7755. 80039c4: bf00 nop
  7756. 80039c6: e7fd b.n 80039c4 <MemManage_Handler+0x4>
  7757. 080039c8 <BusFault_Handler>:
  7758. /**
  7759. * @brief This function handles Pre-fetch fault, memory access fault.
  7760. */
  7761. void BusFault_Handler(void)
  7762. {
  7763. 80039c8: b480 push {r7}
  7764. 80039ca: af00 add r7, sp, #0
  7765. /* USER CODE BEGIN BusFault_IRQn 0 */
  7766. /* USER CODE END BusFault_IRQn 0 */
  7767. while (1)
  7768. 80039cc: bf00 nop
  7769. 80039ce: e7fd b.n 80039cc <BusFault_Handler+0x4>
  7770. 080039d0 <UsageFault_Handler>:
  7771. /**
  7772. * @brief This function handles Undefined instruction or illegal state.
  7773. */
  7774. void UsageFault_Handler(void)
  7775. {
  7776. 80039d0: b480 push {r7}
  7777. 80039d2: af00 add r7, sp, #0
  7778. /* USER CODE BEGIN UsageFault_IRQn 0 */
  7779. /* USER CODE END UsageFault_IRQn 0 */
  7780. while (1)
  7781. 80039d4: bf00 nop
  7782. 80039d6: e7fd b.n 80039d4 <UsageFault_Handler+0x4>
  7783. 080039d8 <DebugMon_Handler>:
  7784. /**
  7785. * @brief This function handles Debug monitor.
  7786. */
  7787. void DebugMon_Handler(void)
  7788. {
  7789. 80039d8: b480 push {r7}
  7790. 80039da: af00 add r7, sp, #0
  7791. /* USER CODE END DebugMonitor_IRQn 0 */
  7792. /* USER CODE BEGIN DebugMonitor_IRQn 1 */
  7793. /* USER CODE END DebugMonitor_IRQn 1 */
  7794. }
  7795. 80039dc: bf00 nop
  7796. 80039de: 46bd mov sp, r7
  7797. 80039e0: f85d 7b04 ldr.w r7, [sp], #4
  7798. 80039e4: 4770 bx lr
  7799. 080039e6 <RCC_IRQHandler>:
  7800. /**
  7801. * @brief This function handles RCC global interrupt.
  7802. */
  7803. void RCC_IRQHandler(void)
  7804. {
  7805. 80039e6: b480 push {r7}
  7806. 80039e8: af00 add r7, sp, #0
  7807. /* USER CODE END RCC_IRQn 0 */
  7808. /* USER CODE BEGIN RCC_IRQn 1 */
  7809. /* USER CODE END RCC_IRQn 1 */
  7810. }
  7811. 80039ea: bf00 nop
  7812. 80039ec: 46bd mov sp, r7
  7813. 80039ee: f85d 7b04 ldr.w r7, [sp], #4
  7814. 80039f2: 4770 bx lr
  7815. 080039f4 <USART1_IRQHandler>:
  7816. /**
  7817. * @brief This function handles USART1 global interrupt.
  7818. */
  7819. void USART1_IRQHandler(void)
  7820. {
  7821. 80039f4: b580 push {r7, lr}
  7822. 80039f6: af00 add r7, sp, #0
  7823. /* USER CODE BEGIN USART1_IRQn 0 */
  7824. /* USER CODE END USART1_IRQn 0 */
  7825. HAL_UART_IRQHandler(&huart1);
  7826. 80039f8: 4802 ldr r0, [pc, #8] @ (8003a04 <USART1_IRQHandler+0x10>)
  7827. 80039fa: f009 faef bl 800cfdc <HAL_UART_IRQHandler>
  7828. /* USER CODE BEGIN USART1_IRQn 1 */
  7829. /* USER CODE END USART1_IRQn 1 */
  7830. }
  7831. 80039fe: bf00 nop
  7832. 8003a00: bd80 pop {r7, pc}
  7833. 8003a02: bf00 nop
  7834. 8003a04: 24000314 .word 0x24000314
  7835. 08003a08 <USART2_IRQHandler>:
  7836. /**
  7837. * @brief This function handles USART2 global interrupt.
  7838. */
  7839. void USART2_IRQHandler(void)
  7840. {
  7841. 8003a08: b580 push {r7, lr}
  7842. 8003a0a: af00 add r7, sp, #0
  7843. /* USER CODE BEGIN USART2_IRQn 0 */
  7844. /* USER CODE END USART2_IRQn 0 */
  7845. HAL_UART_IRQHandler(&huart2);
  7846. 8003a0c: 4802 ldr r0, [pc, #8] @ (8003a18 <USART2_IRQHandler+0x10>)
  7847. 8003a0e: f009 fae5 bl 800cfdc <HAL_UART_IRQHandler>
  7848. /* USER CODE BEGIN USART2_IRQn 1 */
  7849. /* USER CODE END USART2_IRQn 1 */
  7850. }
  7851. 8003a12: bf00 nop
  7852. 8003a14: bd80 pop {r7, pc}
  7853. 8003a16: bf00 nop
  7854. 8003a18: 240003a8 .word 0x240003a8
  7855. 08003a1c <USART3_IRQHandler>:
  7856. /**
  7857. * @brief This function handles USART3 global interrupt.
  7858. */
  7859. void USART3_IRQHandler(void)
  7860. {
  7861. 8003a1c: b580 push {r7, lr}
  7862. 8003a1e: af00 add r7, sp, #0
  7863. /* USER CODE BEGIN USART3_IRQn 0 */
  7864. /* USER CODE END USART3_IRQn 0 */
  7865. HAL_UART_IRQHandler(&huart3);
  7866. 8003a20: 4802 ldr r0, [pc, #8] @ (8003a2c <USART3_IRQHandler+0x10>)
  7867. 8003a22: f009 fadb bl 800cfdc <HAL_UART_IRQHandler>
  7868. /* USER CODE BEGIN USART3_IRQn 1 */
  7869. /* USER CODE END USART3_IRQn 1 */
  7870. }
  7871. 8003a26: bf00 nop
  7872. 8003a28: bd80 pop {r7, pc}
  7873. 8003a2a: bf00 nop
  7874. 8003a2c: 2400043c .word 0x2400043c
  7875. 08003a30 <TIM6_DAC_IRQHandler>:
  7876. /**
  7877. * @brief This function handles TIM6 global interrupt, DAC1_CH1 and DAC1_CH2 underrun error interrupts.
  7878. */
  7879. void TIM6_DAC_IRQHandler(void)
  7880. {
  7881. 8003a30: b580 push {r7, lr}
  7882. 8003a32: af00 add r7, sp, #0
  7883. /* USER CODE BEGIN TIM6_DAC_IRQn 0 */
  7884. /* USER CODE END TIM6_DAC_IRQn 0 */
  7885. HAL_TIM_IRQHandler(&htim6);
  7886. 8003a34: 4802 ldr r0, [pc, #8] @ (8003a40 <TIM6_DAC_IRQHandler+0x10>)
  7887. 8003a36: f008 fff9 bl 800ca2c <HAL_TIM_IRQHandler>
  7888. /* USER CODE BEGIN TIM6_DAC_IRQn 1 */
  7889. /* USER CODE END TIM6_DAC_IRQn 1 */
  7890. }
  7891. 8003a3a: bf00 nop
  7892. 8003a3c: bd80 pop {r7, pc}
  7893. 8003a3e: bf00 nop
  7894. 8003a40: 24000edc .word 0x24000edc
  7895. 08003a44 <ETH_IRQHandler>:
  7896. /**
  7897. * @brief This function handles Ethernet global interrupt.
  7898. */
  7899. void ETH_IRQHandler(void)
  7900. {
  7901. 8003a44: b580 push {r7, lr}
  7902. 8003a46: af00 add r7, sp, #0
  7903. /* USER CODE BEGIN ETH_IRQn 0 */
  7904. /* USER CODE END ETH_IRQn 0 */
  7905. HAL_ETH_IRQHandler(&heth);
  7906. 8003a48: 4802 ldr r0, [pc, #8] @ (8003a54 <ETH_IRQHandler+0x10>)
  7907. 8003a4a: f004 fc99 bl 8008380 <HAL_ETH_IRQHandler>
  7908. /* USER CODE BEGIN ETH_IRQn 1 */
  7909. /* USER CODE END ETH_IRQn 1 */
  7910. }
  7911. 8003a4e: bf00 nop
  7912. 8003a50: bd80 pop {r7, pc}
  7913. 8003a52: bf00 nop
  7914. 8003a54: 240021ec .word 0x240021ec
  7915. 08003a58 <DMA2_Stream6_IRQHandler>:
  7916. /**
  7917. * @brief This function handles DMA2 stream6 global interrupt.
  7918. */
  7919. void DMA2_Stream6_IRQHandler(void)
  7920. {
  7921. 8003a58: b580 push {r7, lr}
  7922. 8003a5a: af00 add r7, sp, #0
  7923. /* USER CODE BEGIN DMA2_Stream6_IRQn 0 */
  7924. /* USER CODE END DMA2_Stream6_IRQn 0 */
  7925. HAL_DMA_IRQHandler(&hdma_uart8_tx);
  7926. 8003a5c: 4802 ldr r0, [pc, #8] @ (8003a68 <DMA2_Stream6_IRQHandler+0x10>)
  7927. 8003a5e: f002 ff55 bl 800690c <HAL_DMA_IRQHandler>
  7928. /* USER CODE BEGIN DMA2_Stream6_IRQn 1 */
  7929. /* USER CODE END DMA2_Stream6_IRQn 1 */
  7930. }
  7931. 8003a62: bf00 nop
  7932. 8003a64: bd80 pop {r7, pc}
  7933. 8003a66: bf00 nop
  7934. 8003a68: 240005dc .word 0x240005dc
  7935. 08003a6c <DMA2_Stream7_IRQHandler>:
  7936. /**
  7937. * @brief This function handles DMA2 stream7 global interrupt.
  7938. */
  7939. void DMA2_Stream7_IRQHandler(void)
  7940. {
  7941. 8003a6c: b580 push {r7, lr}
  7942. 8003a6e: af00 add r7, sp, #0
  7943. /* USER CODE BEGIN DMA2_Stream7_IRQn 0 */
  7944. /* USER CODE END DMA2_Stream7_IRQn 0 */
  7945. HAL_DMA_IRQHandler(&hdma_uart8_rx);
  7946. 8003a70: 4802 ldr r0, [pc, #8] @ (8003a7c <DMA2_Stream7_IRQHandler+0x10>)
  7947. 8003a72: f002 ff4b bl 800690c <HAL_DMA_IRQHandler>
  7948. /* USER CODE BEGIN DMA2_Stream7_IRQn 1 */
  7949. /* USER CODE END DMA2_Stream7_IRQn 1 */
  7950. }
  7951. 8003a76: bf00 nop
  7952. 8003a78: bd80 pop {r7, pc}
  7953. 8003a7a: bf00 nop
  7954. 8003a7c: 24000564 .word 0x24000564
  7955. 08003a80 <USART6_IRQHandler>:
  7956. /**
  7957. * @brief This function handles USART6 global interrupt.
  7958. */
  7959. void USART6_IRQHandler(void)
  7960. {
  7961. 8003a80: b580 push {r7, lr}
  7962. 8003a82: af00 add r7, sp, #0
  7963. /* USER CODE BEGIN USART6_IRQn 0 */
  7964. /* USER CODE END USART6_IRQn 0 */
  7965. HAL_UART_IRQHandler(&huart6);
  7966. 8003a84: 4802 ldr r0, [pc, #8] @ (8003a90 <USART6_IRQHandler+0x10>)
  7967. 8003a86: f009 faa9 bl 800cfdc <HAL_UART_IRQHandler>
  7968. /* USER CODE BEGIN USART6_IRQn 1 */
  7969. /* USER CODE END USART6_IRQn 1 */
  7970. }
  7971. 8003a8a: bf00 nop
  7972. 8003a8c: bd80 pop {r7, pc}
  7973. 8003a8e: bf00 nop
  7974. 8003a90: 240004d0 .word 0x240004d0
  7975. 08003a94 <UART8_IRQHandler>:
  7976. /**
  7977. * @brief This function handles UART8 global interrupt.
  7978. */
  7979. void UART8_IRQHandler(void)
  7980. {
  7981. 8003a94: b580 push {r7, lr}
  7982. 8003a96: af00 add r7, sp, #0
  7983. /* USER CODE BEGIN UART8_IRQn 0 */
  7984. /* USER CODE END UART8_IRQn 0 */
  7985. HAL_UART_IRQHandler(&huart8);
  7986. 8003a98: 4802 ldr r0, [pc, #8] @ (8003aa4 <UART8_IRQHandler+0x10>)
  7987. 8003a9a: f009 fa9f bl 800cfdc <HAL_UART_IRQHandler>
  7988. /* USER CODE BEGIN UART8_IRQn 1 */
  7989. /* USER CODE END UART8_IRQn 1 */
  7990. }
  7991. 8003a9e: bf00 nop
  7992. 8003aa0: bd80 pop {r7, pc}
  7993. 8003aa2: bf00 nop
  7994. 8003aa4: 24000280 .word 0x24000280
  7995. 08003aa8 <ITM_SendChar>:
  7996. \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.
  7997. \param [in] ch Character to transmit.
  7998. \returns Character to transmit.
  7999. */
  8000. __STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
  8001. {
  8002. 8003aa8: b480 push {r7}
  8003. 8003aaa: b083 sub sp, #12
  8004. 8003aac: af00 add r7, sp, #0
  8005. 8003aae: 6078 str r0, [r7, #4]
  8006. if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */
  8007. 8003ab0: f04f 4360 mov.w r3, #3758096384 @ 0xe0000000
  8008. 8003ab4: f8d3 3e80 ldr.w r3, [r3, #3712] @ 0xe80
  8009. 8003ab8: f003 0301 and.w r3, r3, #1
  8010. 8003abc: 2b00 cmp r3, #0
  8011. 8003abe: d013 beq.n 8003ae8 <ITM_SendChar+0x40>
  8012. ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */
  8013. 8003ac0: f04f 4360 mov.w r3, #3758096384 @ 0xe0000000
  8014. 8003ac4: f8d3 3e00 ldr.w r3, [r3, #3584] @ 0xe00
  8015. 8003ac8: f003 0301 and.w r3, r3, #1
  8016. if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */
  8017. 8003acc: 2b00 cmp r3, #0
  8018. 8003ace: d00b beq.n 8003ae8 <ITM_SendChar+0x40>
  8019. {
  8020. while (ITM->PORT[0U].u32 == 0UL)
  8021. 8003ad0: e000 b.n 8003ad4 <ITM_SendChar+0x2c>
  8022. {
  8023. __NOP();
  8024. 8003ad2: bf00 nop
  8025. while (ITM->PORT[0U].u32 == 0UL)
  8026. 8003ad4: f04f 4360 mov.w r3, #3758096384 @ 0xe0000000
  8027. 8003ad8: 681b ldr r3, [r3, #0]
  8028. 8003ada: 2b00 cmp r3, #0
  8029. 8003adc: d0f9 beq.n 8003ad2 <ITM_SendChar+0x2a>
  8030. }
  8031. ITM->PORT[0U].u8 = (uint8_t)ch;
  8032. 8003ade: f04f 4360 mov.w r3, #3758096384 @ 0xe0000000
  8033. 8003ae2: 687a ldr r2, [r7, #4]
  8034. 8003ae4: b2d2 uxtb r2, r2
  8035. 8003ae6: 701a strb r2, [r3, #0]
  8036. }
  8037. return (ch);
  8038. 8003ae8: 687b ldr r3, [r7, #4]
  8039. }
  8040. 8003aea: 4618 mov r0, r3
  8041. 8003aec: 370c adds r7, #12
  8042. 8003aee: 46bd mov sp, r7
  8043. 8003af0: f85d 7b04 ldr.w r7, [sp], #4
  8044. 8003af4: 4770 bx lr
  8045. 08003af6 <_getpid>:
  8046. void initialise_monitor_handles()
  8047. {
  8048. }
  8049. int _getpid(void)
  8050. {
  8051. 8003af6: b480 push {r7}
  8052. 8003af8: af00 add r7, sp, #0
  8053. return 1;
  8054. 8003afa: 2301 movs r3, #1
  8055. }
  8056. 8003afc: 4618 mov r0, r3
  8057. 8003afe: 46bd mov sp, r7
  8058. 8003b00: f85d 7b04 ldr.w r7, [sp], #4
  8059. 8003b04: 4770 bx lr
  8060. ...
  8061. 08003b08 <_kill>:
  8062. int _kill(int pid, int sig)
  8063. {
  8064. 8003b08: b480 push {r7}
  8065. 8003b0a: b083 sub sp, #12
  8066. 8003b0c: af00 add r7, sp, #0
  8067. 8003b0e: 6078 str r0, [r7, #4]
  8068. 8003b10: 6039 str r1, [r7, #0]
  8069. (void)pid;
  8070. (void)sig;
  8071. errno = EINVAL;
  8072. 8003b12: 4b05 ldr r3, [pc, #20] @ (8003b28 <_kill+0x20>)
  8073. 8003b14: 2216 movs r2, #22
  8074. 8003b16: 601a str r2, [r3, #0]
  8075. return -1;
  8076. 8003b18: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  8077. }
  8078. 8003b1c: 4618 mov r0, r3
  8079. 8003b1e: 370c adds r7, #12
  8080. 8003b20: 46bd mov sp, r7
  8081. 8003b22: f85d 7b04 ldr.w r7, [sp], #4
  8082. 8003b26: 4770 bx lr
  8083. 8003b28: 2402b180 .word 0x2402b180
  8084. 08003b2c <_exit>:
  8085. void _exit (int status)
  8086. {
  8087. 8003b2c: b580 push {r7, lr}
  8088. 8003b2e: b082 sub sp, #8
  8089. 8003b30: af00 add r7, sp, #0
  8090. 8003b32: 6078 str r0, [r7, #4]
  8091. _kill(status, -1);
  8092. 8003b34: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  8093. 8003b38: 6878 ldr r0, [r7, #4]
  8094. 8003b3a: f7ff ffe5 bl 8003b08 <_kill>
  8095. while (1) {} /* Make sure we hang here */
  8096. 8003b3e: bf00 nop
  8097. 8003b40: e7fd b.n 8003b3e <_exit+0x12>
  8098. 08003b42 <_read>:
  8099. }
  8100. __attribute__((weak)) int _read(int file, char *ptr, int len)
  8101. {
  8102. 8003b42: b580 push {r7, lr}
  8103. 8003b44: b086 sub sp, #24
  8104. 8003b46: af00 add r7, sp, #0
  8105. 8003b48: 60f8 str r0, [r7, #12]
  8106. 8003b4a: 60b9 str r1, [r7, #8]
  8107. 8003b4c: 607a str r2, [r7, #4]
  8108. (void)file;
  8109. int DataIdx;
  8110. for (DataIdx = 0; DataIdx < len; DataIdx++)
  8111. 8003b4e: 2300 movs r3, #0
  8112. 8003b50: 617b str r3, [r7, #20]
  8113. 8003b52: e00a b.n 8003b6a <_read+0x28>
  8114. {
  8115. *ptr++ = __io_getchar();
  8116. 8003b54: f3af 8000 nop.w
  8117. 8003b58: 4601 mov r1, r0
  8118. 8003b5a: 68bb ldr r3, [r7, #8]
  8119. 8003b5c: 1c5a adds r2, r3, #1
  8120. 8003b5e: 60ba str r2, [r7, #8]
  8121. 8003b60: b2ca uxtb r2, r1
  8122. 8003b62: 701a strb r2, [r3, #0]
  8123. for (DataIdx = 0; DataIdx < len; DataIdx++)
  8124. 8003b64: 697b ldr r3, [r7, #20]
  8125. 8003b66: 3301 adds r3, #1
  8126. 8003b68: 617b str r3, [r7, #20]
  8127. 8003b6a: 697a ldr r2, [r7, #20]
  8128. 8003b6c: 687b ldr r3, [r7, #4]
  8129. 8003b6e: 429a cmp r2, r3
  8130. 8003b70: dbf0 blt.n 8003b54 <_read+0x12>
  8131. }
  8132. return len;
  8133. 8003b72: 687b ldr r3, [r7, #4]
  8134. }
  8135. 8003b74: 4618 mov r0, r3
  8136. 8003b76: 3718 adds r7, #24
  8137. 8003b78: 46bd mov sp, r7
  8138. 8003b7a: bd80 pop {r7, pc}
  8139. 08003b7c <_write>:
  8140. __attribute__((weak)) int _write(int file, char *ptr, int len)
  8141. {
  8142. 8003b7c: b580 push {r7, lr}
  8143. 8003b7e: b086 sub sp, #24
  8144. 8003b80: af00 add r7, sp, #0
  8145. 8003b82: 60f8 str r0, [r7, #12]
  8146. 8003b84: 60b9 str r1, [r7, #8]
  8147. 8003b86: 607a str r2, [r7, #4]
  8148. (void)file;
  8149. int DataIdx;
  8150. for (DataIdx = 0; DataIdx < len; DataIdx++)
  8151. 8003b88: 2300 movs r3, #0
  8152. 8003b8a: 617b str r3, [r7, #20]
  8153. 8003b8c: e009 b.n 8003ba2 <_write+0x26>
  8154. {
  8155. // __io_putchar(*ptr++);
  8156. ITM_SendChar(*ptr++);
  8157. 8003b8e: 68bb ldr r3, [r7, #8]
  8158. 8003b90: 1c5a adds r2, r3, #1
  8159. 8003b92: 60ba str r2, [r7, #8]
  8160. 8003b94: 781b ldrb r3, [r3, #0]
  8161. 8003b96: 4618 mov r0, r3
  8162. 8003b98: f7ff ff86 bl 8003aa8 <ITM_SendChar>
  8163. for (DataIdx = 0; DataIdx < len; DataIdx++)
  8164. 8003b9c: 697b ldr r3, [r7, #20]
  8165. 8003b9e: 3301 adds r3, #1
  8166. 8003ba0: 617b str r3, [r7, #20]
  8167. 8003ba2: 697a ldr r2, [r7, #20]
  8168. 8003ba4: 687b ldr r3, [r7, #4]
  8169. 8003ba6: 429a cmp r2, r3
  8170. 8003ba8: dbf1 blt.n 8003b8e <_write+0x12>
  8171. }
  8172. return len;
  8173. 8003baa: 687b ldr r3, [r7, #4]
  8174. }
  8175. 8003bac: 4618 mov r0, r3
  8176. 8003bae: 3718 adds r7, #24
  8177. 8003bb0: 46bd mov sp, r7
  8178. 8003bb2: bd80 pop {r7, pc}
  8179. 08003bb4 <_close>:
  8180. int _close(int file)
  8181. {
  8182. 8003bb4: b480 push {r7}
  8183. 8003bb6: b083 sub sp, #12
  8184. 8003bb8: af00 add r7, sp, #0
  8185. 8003bba: 6078 str r0, [r7, #4]
  8186. (void)file;
  8187. return -1;
  8188. 8003bbc: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  8189. }
  8190. 8003bc0: 4618 mov r0, r3
  8191. 8003bc2: 370c adds r7, #12
  8192. 8003bc4: 46bd mov sp, r7
  8193. 8003bc6: f85d 7b04 ldr.w r7, [sp], #4
  8194. 8003bca: 4770 bx lr
  8195. 08003bcc <_fstat>:
  8196. int _fstat(int file, struct stat *st)
  8197. {
  8198. 8003bcc: b480 push {r7}
  8199. 8003bce: b083 sub sp, #12
  8200. 8003bd0: af00 add r7, sp, #0
  8201. 8003bd2: 6078 str r0, [r7, #4]
  8202. 8003bd4: 6039 str r1, [r7, #0]
  8203. (void)file;
  8204. st->st_mode = S_IFCHR;
  8205. 8003bd6: 683b ldr r3, [r7, #0]
  8206. 8003bd8: f44f 5200 mov.w r2, #8192 @ 0x2000
  8207. 8003bdc: 605a str r2, [r3, #4]
  8208. return 0;
  8209. 8003bde: 2300 movs r3, #0
  8210. }
  8211. 8003be0: 4618 mov r0, r3
  8212. 8003be2: 370c adds r7, #12
  8213. 8003be4: 46bd mov sp, r7
  8214. 8003be6: f85d 7b04 ldr.w r7, [sp], #4
  8215. 8003bea: 4770 bx lr
  8216. 08003bec <_isatty>:
  8217. int _isatty(int file)
  8218. {
  8219. 8003bec: b480 push {r7}
  8220. 8003bee: b083 sub sp, #12
  8221. 8003bf0: af00 add r7, sp, #0
  8222. 8003bf2: 6078 str r0, [r7, #4]
  8223. (void)file;
  8224. return 1;
  8225. 8003bf4: 2301 movs r3, #1
  8226. }
  8227. 8003bf6: 4618 mov r0, r3
  8228. 8003bf8: 370c adds r7, #12
  8229. 8003bfa: 46bd mov sp, r7
  8230. 8003bfc: f85d 7b04 ldr.w r7, [sp], #4
  8231. 8003c00: 4770 bx lr
  8232. 08003c02 <_lseek>:
  8233. int _lseek(int file, int ptr, int dir)
  8234. {
  8235. 8003c02: b480 push {r7}
  8236. 8003c04: b085 sub sp, #20
  8237. 8003c06: af00 add r7, sp, #0
  8238. 8003c08: 60f8 str r0, [r7, #12]
  8239. 8003c0a: 60b9 str r1, [r7, #8]
  8240. 8003c0c: 607a str r2, [r7, #4]
  8241. (void)file;
  8242. (void)ptr;
  8243. (void)dir;
  8244. return 0;
  8245. 8003c0e: 2300 movs r3, #0
  8246. }
  8247. 8003c10: 4618 mov r0, r3
  8248. 8003c12: 3714 adds r7, #20
  8249. 8003c14: 46bd mov sp, r7
  8250. 8003c16: f85d 7b04 ldr.w r7, [sp], #4
  8251. 8003c1a: 4770 bx lr
  8252. 08003c1c <_sbrk>:
  8253. *
  8254. * @param incr Memory size
  8255. * @return Pointer to allocated memory
  8256. */
  8257. void *_sbrk(ptrdiff_t incr)
  8258. {
  8259. 8003c1c: b480 push {r7}
  8260. 8003c1e: b087 sub sp, #28
  8261. 8003c20: af00 add r7, sp, #0
  8262. 8003c22: 6078 str r0, [r7, #4]
  8263. extern uint8_t _end; /* Symbol defined in the linker script */
  8264. extern uint8_t _estack; /* Symbol defined in the linker script */
  8265. extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */
  8266. const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size;
  8267. 8003c24: 4a14 ldr r2, [pc, #80] @ (8003c78 <_sbrk+0x5c>)
  8268. 8003c26: 4b15 ldr r3, [pc, #84] @ (8003c7c <_sbrk+0x60>)
  8269. 8003c28: 1ad3 subs r3, r2, r3
  8270. 8003c2a: 617b str r3, [r7, #20]
  8271. const uint8_t *max_heap = (uint8_t *)stack_limit;
  8272. 8003c2c: 697b ldr r3, [r7, #20]
  8273. 8003c2e: 613b str r3, [r7, #16]
  8274. uint8_t *prev_heap_end;
  8275. /* Initialize heap end at first call */
  8276. if (NULL == __sbrk_heap_end)
  8277. 8003c30: 4b13 ldr r3, [pc, #76] @ (8003c80 <_sbrk+0x64>)
  8278. 8003c32: 681b ldr r3, [r3, #0]
  8279. 8003c34: 2b00 cmp r3, #0
  8280. 8003c36: d102 bne.n 8003c3e <_sbrk+0x22>
  8281. {
  8282. __sbrk_heap_end = &_end;
  8283. 8003c38: 4b11 ldr r3, [pc, #68] @ (8003c80 <_sbrk+0x64>)
  8284. 8003c3a: 4a12 ldr r2, [pc, #72] @ (8003c84 <_sbrk+0x68>)
  8285. 8003c3c: 601a str r2, [r3, #0]
  8286. }
  8287. /* Protect heap from growing into the reserved MSP stack */
  8288. if (__sbrk_heap_end + incr > max_heap)
  8289. 8003c3e: 4b10 ldr r3, [pc, #64] @ (8003c80 <_sbrk+0x64>)
  8290. 8003c40: 681a ldr r2, [r3, #0]
  8291. 8003c42: 687b ldr r3, [r7, #4]
  8292. 8003c44: 4413 add r3, r2
  8293. 8003c46: 693a ldr r2, [r7, #16]
  8294. 8003c48: 429a cmp r2, r3
  8295. 8003c4a: d205 bcs.n 8003c58 <_sbrk+0x3c>
  8296. {
  8297. errno = ENOMEM;
  8298. 8003c4c: 4b0e ldr r3, [pc, #56] @ (8003c88 <_sbrk+0x6c>)
  8299. 8003c4e: 220c movs r2, #12
  8300. 8003c50: 601a str r2, [r3, #0]
  8301. return (void *)-1;
  8302. 8003c52: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  8303. 8003c56: e009 b.n 8003c6c <_sbrk+0x50>
  8304. }
  8305. prev_heap_end = __sbrk_heap_end;
  8306. 8003c58: 4b09 ldr r3, [pc, #36] @ (8003c80 <_sbrk+0x64>)
  8307. 8003c5a: 681b ldr r3, [r3, #0]
  8308. 8003c5c: 60fb str r3, [r7, #12]
  8309. __sbrk_heap_end += incr;
  8310. 8003c5e: 4b08 ldr r3, [pc, #32] @ (8003c80 <_sbrk+0x64>)
  8311. 8003c60: 681a ldr r2, [r3, #0]
  8312. 8003c62: 687b ldr r3, [r7, #4]
  8313. 8003c64: 4413 add r3, r2
  8314. 8003c66: 4a06 ldr r2, [pc, #24] @ (8003c80 <_sbrk+0x64>)
  8315. 8003c68: 6013 str r3, [r2, #0]
  8316. return (void *)prev_heap_end;
  8317. 8003c6a: 68fb ldr r3, [r7, #12]
  8318. }
  8319. 8003c6c: 4618 mov r0, r3
  8320. 8003c6e: 371c adds r7, #28
  8321. 8003c70: 46bd mov sp, r7
  8322. 8003c72: f85d 7b04 ldr.w r7, [sp], #4
  8323. 8003c76: 4770 bx lr
  8324. 8003c78: 24060000 .word 0x24060000
  8325. 8003c7c: 00000400 .word 0x00000400
  8326. 8003c80: 24000f28 .word 0x24000f28
  8327. 8003c84: 2402b188 .word 0x2402b188
  8328. 8003c88: 2402b180 .word 0x2402b180
  8329. 08003c8c <SystemInit>:
  8330. * configuration.
  8331. * @param None
  8332. * @retval None
  8333. */
  8334. void SystemInit (void)
  8335. {
  8336. 8003c8c: b480 push {r7}
  8337. 8003c8e: af00 add r7, sp, #0
  8338. __IO uint32_t tmpreg;
  8339. #endif /* DATA_IN_D2_SRAM */
  8340. /* FPU settings ------------------------------------------------------------*/
  8341. #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
  8342. SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */
  8343. 8003c90: 4b37 ldr r3, [pc, #220] @ (8003d70 <SystemInit+0xe4>)
  8344. 8003c92: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  8345. 8003c96: 4a36 ldr r2, [pc, #216] @ (8003d70 <SystemInit+0xe4>)
  8346. 8003c98: f443 0370 orr.w r3, r3, #15728640 @ 0xf00000
  8347. 8003c9c: f8c2 3088 str.w r3, [r2, #136] @ 0x88
  8348. #endif
  8349. /* Reset the RCC clock configuration to the default reset state ------------*/
  8350. /* Increasing the CPU frequency */
  8351. if(FLASH_LATENCY_DEFAULT > (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)))
  8352. 8003ca0: 4b34 ldr r3, [pc, #208] @ (8003d74 <SystemInit+0xe8>)
  8353. 8003ca2: 681b ldr r3, [r3, #0]
  8354. 8003ca4: f003 030f and.w r3, r3, #15
  8355. 8003ca8: 2b06 cmp r3, #6
  8356. 8003caa: d807 bhi.n 8003cbc <SystemInit+0x30>
  8357. {
  8358. /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
  8359. MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT));
  8360. 8003cac: 4b31 ldr r3, [pc, #196] @ (8003d74 <SystemInit+0xe8>)
  8361. 8003cae: 681b ldr r3, [r3, #0]
  8362. 8003cb0: f023 030f bic.w r3, r3, #15
  8363. 8003cb4: 4a2f ldr r2, [pc, #188] @ (8003d74 <SystemInit+0xe8>)
  8364. 8003cb6: f043 0307 orr.w r3, r3, #7
  8365. 8003cba: 6013 str r3, [r2, #0]
  8366. }
  8367. /* Set HSION bit */
  8368. RCC->CR |= RCC_CR_HSION;
  8369. 8003cbc: 4b2e ldr r3, [pc, #184] @ (8003d78 <SystemInit+0xec>)
  8370. 8003cbe: 681b ldr r3, [r3, #0]
  8371. 8003cc0: 4a2d ldr r2, [pc, #180] @ (8003d78 <SystemInit+0xec>)
  8372. 8003cc2: f043 0301 orr.w r3, r3, #1
  8373. 8003cc6: 6013 str r3, [r2, #0]
  8374. /* Reset CFGR register */
  8375. RCC->CFGR = 0x00000000;
  8376. 8003cc8: 4b2b ldr r3, [pc, #172] @ (8003d78 <SystemInit+0xec>)
  8377. 8003cca: 2200 movs r2, #0
  8378. 8003ccc: 611a str r2, [r3, #16]
  8379. /* Reset HSEON, HSECSSON, CSION, HSI48ON, CSIKERON, PLL1ON, PLL2ON and PLL3ON bits */
  8380. RCC->CR &= 0xEAF6ED7FU;
  8381. 8003cce: 4b2a ldr r3, [pc, #168] @ (8003d78 <SystemInit+0xec>)
  8382. 8003cd0: 681a ldr r2, [r3, #0]
  8383. 8003cd2: 4929 ldr r1, [pc, #164] @ (8003d78 <SystemInit+0xec>)
  8384. 8003cd4: 4b29 ldr r3, [pc, #164] @ (8003d7c <SystemInit+0xf0>)
  8385. 8003cd6: 4013 ands r3, r2
  8386. 8003cd8: 600b str r3, [r1, #0]
  8387. /* Decreasing the number of wait states because of lower CPU frequency */
  8388. if(FLASH_LATENCY_DEFAULT < (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)))
  8389. 8003cda: 4b26 ldr r3, [pc, #152] @ (8003d74 <SystemInit+0xe8>)
  8390. 8003cdc: 681b ldr r3, [r3, #0]
  8391. 8003cde: f003 0308 and.w r3, r3, #8
  8392. 8003ce2: 2b00 cmp r3, #0
  8393. 8003ce4: d007 beq.n 8003cf6 <SystemInit+0x6a>
  8394. {
  8395. /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
  8396. MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT));
  8397. 8003ce6: 4b23 ldr r3, [pc, #140] @ (8003d74 <SystemInit+0xe8>)
  8398. 8003ce8: 681b ldr r3, [r3, #0]
  8399. 8003cea: f023 030f bic.w r3, r3, #15
  8400. 8003cee: 4a21 ldr r2, [pc, #132] @ (8003d74 <SystemInit+0xe8>)
  8401. 8003cf0: f043 0307 orr.w r3, r3, #7
  8402. 8003cf4: 6013 str r3, [r2, #0]
  8403. }
  8404. #if defined(D3_SRAM_BASE)
  8405. /* Reset D1CFGR register */
  8406. RCC->D1CFGR = 0x00000000;
  8407. 8003cf6: 4b20 ldr r3, [pc, #128] @ (8003d78 <SystemInit+0xec>)
  8408. 8003cf8: 2200 movs r2, #0
  8409. 8003cfa: 619a str r2, [r3, #24]
  8410. /* Reset D2CFGR register */
  8411. RCC->D2CFGR = 0x00000000;
  8412. 8003cfc: 4b1e ldr r3, [pc, #120] @ (8003d78 <SystemInit+0xec>)
  8413. 8003cfe: 2200 movs r2, #0
  8414. 8003d00: 61da str r2, [r3, #28]
  8415. /* Reset D3CFGR register */
  8416. RCC->D3CFGR = 0x00000000;
  8417. 8003d02: 4b1d ldr r3, [pc, #116] @ (8003d78 <SystemInit+0xec>)
  8418. 8003d04: 2200 movs r2, #0
  8419. 8003d06: 621a str r2, [r3, #32]
  8420. /* Reset SRDCFGR register */
  8421. RCC->SRDCFGR = 0x00000000;
  8422. #endif
  8423. /* Reset PLLCKSELR register */
  8424. RCC->PLLCKSELR = 0x02020200;
  8425. 8003d08: 4b1b ldr r3, [pc, #108] @ (8003d78 <SystemInit+0xec>)
  8426. 8003d0a: 4a1d ldr r2, [pc, #116] @ (8003d80 <SystemInit+0xf4>)
  8427. 8003d0c: 629a str r2, [r3, #40] @ 0x28
  8428. /* Reset PLLCFGR register */
  8429. RCC->PLLCFGR = 0x01FF0000;
  8430. 8003d0e: 4b1a ldr r3, [pc, #104] @ (8003d78 <SystemInit+0xec>)
  8431. 8003d10: 4a1c ldr r2, [pc, #112] @ (8003d84 <SystemInit+0xf8>)
  8432. 8003d12: 62da str r2, [r3, #44] @ 0x2c
  8433. /* Reset PLL1DIVR register */
  8434. RCC->PLL1DIVR = 0x01010280;
  8435. 8003d14: 4b18 ldr r3, [pc, #96] @ (8003d78 <SystemInit+0xec>)
  8436. 8003d16: 4a1c ldr r2, [pc, #112] @ (8003d88 <SystemInit+0xfc>)
  8437. 8003d18: 631a str r2, [r3, #48] @ 0x30
  8438. /* Reset PLL1FRACR register */
  8439. RCC->PLL1FRACR = 0x00000000;
  8440. 8003d1a: 4b17 ldr r3, [pc, #92] @ (8003d78 <SystemInit+0xec>)
  8441. 8003d1c: 2200 movs r2, #0
  8442. 8003d1e: 635a str r2, [r3, #52] @ 0x34
  8443. /* Reset PLL2DIVR register */
  8444. RCC->PLL2DIVR = 0x01010280;
  8445. 8003d20: 4b15 ldr r3, [pc, #84] @ (8003d78 <SystemInit+0xec>)
  8446. 8003d22: 4a19 ldr r2, [pc, #100] @ (8003d88 <SystemInit+0xfc>)
  8447. 8003d24: 639a str r2, [r3, #56] @ 0x38
  8448. /* Reset PLL2FRACR register */
  8449. RCC->PLL2FRACR = 0x00000000;
  8450. 8003d26: 4b14 ldr r3, [pc, #80] @ (8003d78 <SystemInit+0xec>)
  8451. 8003d28: 2200 movs r2, #0
  8452. 8003d2a: 63da str r2, [r3, #60] @ 0x3c
  8453. /* Reset PLL3DIVR register */
  8454. RCC->PLL3DIVR = 0x01010280;
  8455. 8003d2c: 4b12 ldr r3, [pc, #72] @ (8003d78 <SystemInit+0xec>)
  8456. 8003d2e: 4a16 ldr r2, [pc, #88] @ (8003d88 <SystemInit+0xfc>)
  8457. 8003d30: 641a str r2, [r3, #64] @ 0x40
  8458. /* Reset PLL3FRACR register */
  8459. RCC->PLL3FRACR = 0x00000000;
  8460. 8003d32: 4b11 ldr r3, [pc, #68] @ (8003d78 <SystemInit+0xec>)
  8461. 8003d34: 2200 movs r2, #0
  8462. 8003d36: 645a str r2, [r3, #68] @ 0x44
  8463. /* Reset HSEBYP bit */
  8464. RCC->CR &= 0xFFFBFFFFU;
  8465. 8003d38: 4b0f ldr r3, [pc, #60] @ (8003d78 <SystemInit+0xec>)
  8466. 8003d3a: 681b ldr r3, [r3, #0]
  8467. 8003d3c: 4a0e ldr r2, [pc, #56] @ (8003d78 <SystemInit+0xec>)
  8468. 8003d3e: f423 2380 bic.w r3, r3, #262144 @ 0x40000
  8469. 8003d42: 6013 str r3, [r2, #0]
  8470. /* Disable all interrupts */
  8471. RCC->CIER = 0x00000000;
  8472. 8003d44: 4b0c ldr r3, [pc, #48] @ (8003d78 <SystemInit+0xec>)
  8473. 8003d46: 2200 movs r2, #0
  8474. 8003d48: 661a str r2, [r3, #96] @ 0x60
  8475. #if (STM32H7_DEV_ID == 0x450UL)
  8476. /* dual core CM7 or single core line */
  8477. if((DBGMCU->IDCODE & 0xFFFF0000U) < 0x20000000U)
  8478. 8003d4a: 4b10 ldr r3, [pc, #64] @ (8003d8c <SystemInit+0x100>)
  8479. 8003d4c: 681a ldr r2, [r3, #0]
  8480. 8003d4e: 4b10 ldr r3, [pc, #64] @ (8003d90 <SystemInit+0x104>)
  8481. 8003d50: 4013 ands r3, r2
  8482. 8003d52: f1b3 5f00 cmp.w r3, #536870912 @ 0x20000000
  8483. 8003d56: d202 bcs.n 8003d5e <SystemInit+0xd2>
  8484. {
  8485. /* if stm32h7 revY*/
  8486. /* Change the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */
  8487. *((__IO uint32_t*)0x51008108) = 0x000000001U;
  8488. 8003d58: 4b0e ldr r3, [pc, #56] @ (8003d94 <SystemInit+0x108>)
  8489. 8003d5a: 2201 movs r2, #1
  8490. 8003d5c: 601a str r2, [r3, #0]
  8491. /*
  8492. * Disable the FMC bank1 (enabled after reset).
  8493. * This, prevents CPU speculation access on this bank which blocks the use of FMC during
  8494. * 24us. During this time the others FMC master (such as LTDC) cannot use it!
  8495. */
  8496. FMC_Bank1_R->BTCR[0] = 0x000030D2;
  8497. 8003d5e: 4b0e ldr r3, [pc, #56] @ (8003d98 <SystemInit+0x10c>)
  8498. 8003d60: f243 02d2 movw r2, #12498 @ 0x30d2
  8499. 8003d64: 601a str r2, [r3, #0]
  8500. #if defined(USER_VECT_TAB_ADDRESS)
  8501. SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal D1 AXI-RAM or in Internal FLASH */
  8502. #endif /* USER_VECT_TAB_ADDRESS */
  8503. #endif /*DUAL_CORE && CORE_CM4*/
  8504. }
  8505. 8003d66: bf00 nop
  8506. 8003d68: 46bd mov sp, r7
  8507. 8003d6a: f85d 7b04 ldr.w r7, [sp], #4
  8508. 8003d6e: 4770 bx lr
  8509. 8003d70: e000ed00 .word 0xe000ed00
  8510. 8003d74: 52002000 .word 0x52002000
  8511. 8003d78: 58024400 .word 0x58024400
  8512. 8003d7c: eaf6ed7f .word 0xeaf6ed7f
  8513. 8003d80: 02020200 .word 0x02020200
  8514. 8003d84: 01ff0000 .word 0x01ff0000
  8515. 8003d88: 01010280 .word 0x01010280
  8516. 8003d8c: 5c001000 .word 0x5c001000
  8517. 8003d90: ffff0000 .word 0xffff0000
  8518. 8003d94: 51008108 .word 0x51008108
  8519. 8003d98: 52004000 .word 0x52004000
  8520. 08003d9c <UartTasksInit>:
  8521. osMutexId_t resMeasurementsMutex;
  8522. osMutexId_t sensorsInfoMutex;
  8523. extern RNG_HandleTypeDef hrng;
  8524. void UartTasksInit (void) {
  8525. 8003d9c: b580 push {r7, lr}
  8526. 8003d9e: af00 add r7, sp, #0
  8527. uart1TaskData.uartRxBuffer = uart1RxBuffer;
  8528. 8003da0: 4b4e ldr r3, [pc, #312] @ (8003edc <UartTasksInit+0x140>)
  8529. 8003da2: 4a4f ldr r2, [pc, #316] @ (8003ee0 <UartTasksInit+0x144>)
  8530. 8003da4: 601a str r2, [r3, #0]
  8531. uart1TaskData.uartRxBufferLen = UART1_RX_BUFF_SIZE;
  8532. 8003da6: 4b4d ldr r3, [pc, #308] @ (8003edc <UartTasksInit+0x140>)
  8533. 8003da8: f44f 7280 mov.w r2, #256 @ 0x100
  8534. 8003dac: 809a strh r2, [r3, #4]
  8535. uart1TaskData.uartTxBuffer = uart1TxBuffer;
  8536. 8003dae: 4b4b ldr r3, [pc, #300] @ (8003edc <UartTasksInit+0x140>)
  8537. 8003db0: 4a4c ldr r2, [pc, #304] @ (8003ee4 <UartTasksInit+0x148>)
  8538. 8003db2: 609a str r2, [r3, #8]
  8539. uart1TaskData.uartRxBufferLen = UART1_TX_BUFF_SIZE;
  8540. 8003db4: 4b49 ldr r3, [pc, #292] @ (8003edc <UartTasksInit+0x140>)
  8541. 8003db6: f44f 7280 mov.w r2, #256 @ 0x100
  8542. 8003dba: 809a strh r2, [r3, #4]
  8543. uart1TaskData.frameData = uart1TaskFrameData;
  8544. 8003dbc: 4b47 ldr r3, [pc, #284] @ (8003edc <UartTasksInit+0x140>)
  8545. 8003dbe: 4a4a ldr r2, [pc, #296] @ (8003ee8 <UartTasksInit+0x14c>)
  8546. 8003dc0: 611a str r2, [r3, #16]
  8547. uart1TaskData.frameDataLen = UART1_RX_BUFF_SIZE;
  8548. 8003dc2: 4b46 ldr r3, [pc, #280] @ (8003edc <UartTasksInit+0x140>)
  8549. 8003dc4: f44f 7280 mov.w r2, #256 @ 0x100
  8550. 8003dc8: 829a strh r2, [r3, #20]
  8551. uart1TaskData.huart = &huart1;
  8552. 8003dca: 4b44 ldr r3, [pc, #272] @ (8003edc <UartTasksInit+0x140>)
  8553. 8003dcc: 4a47 ldr r2, [pc, #284] @ (8003eec <UartTasksInit+0x150>)
  8554. 8003dce: 631a str r2, [r3, #48] @ 0x30
  8555. uart1TaskData.uartNumber = 1;
  8556. 8003dd0: 4b42 ldr r3, [pc, #264] @ (8003edc <UartTasksInit+0x140>)
  8557. 8003dd2: 2201 movs r2, #1
  8558. 8003dd4: f883 2034 strb.w r2, [r3, #52] @ 0x34
  8559. uart2TaskData.uartRxBuffer = uart2RxBuffer;
  8560. 8003dd8: 4b45 ldr r3, [pc, #276] @ (8003ef0 <UartTasksInit+0x154>)
  8561. 8003dda: 4a46 ldr r2, [pc, #280] @ (8003ef4 <UartTasksInit+0x158>)
  8562. 8003ddc: 601a str r2, [r3, #0]
  8563. uart2TaskData.uartRxBufferLen = UART2_RX_BUFF_SIZE;
  8564. 8003dde: 4b44 ldr r3, [pc, #272] @ (8003ef0 <UartTasksInit+0x154>)
  8565. 8003de0: f44f 7280 mov.w r2, #256 @ 0x100
  8566. 8003de4: 809a strh r2, [r3, #4]
  8567. uart2TaskData.uartTxBuffer = uart2TxBuffer;
  8568. 8003de6: 4b42 ldr r3, [pc, #264] @ (8003ef0 <UartTasksInit+0x154>)
  8569. 8003de8: 4a43 ldr r2, [pc, #268] @ (8003ef8 <UartTasksInit+0x15c>)
  8570. 8003dea: 609a str r2, [r3, #8]
  8571. uart2TaskData.uartRxBufferLen = UART2_TX_BUFF_SIZE;
  8572. 8003dec: 4b40 ldr r3, [pc, #256] @ (8003ef0 <UartTasksInit+0x154>)
  8573. 8003dee: f44f 7280 mov.w r2, #256 @ 0x100
  8574. 8003df2: 809a strh r2, [r3, #4]
  8575. uart2TaskData.frameData = uart2TaskFrameData;
  8576. 8003df4: 4b3e ldr r3, [pc, #248] @ (8003ef0 <UartTasksInit+0x154>)
  8577. 8003df6: 4a41 ldr r2, [pc, #260] @ (8003efc <UartTasksInit+0x160>)
  8578. 8003df8: 611a str r2, [r3, #16]
  8579. uart2TaskData.frameDataLen = UART2_RX_BUFF_SIZE;
  8580. 8003dfa: 4b3d ldr r3, [pc, #244] @ (8003ef0 <UartTasksInit+0x154>)
  8581. 8003dfc: f44f 7280 mov.w r2, #256 @ 0x100
  8582. 8003e00: 829a strh r2, [r3, #20]
  8583. uart2TaskData.huart = &huart2;
  8584. 8003e02: 4b3b ldr r3, [pc, #236] @ (8003ef0 <UartTasksInit+0x154>)
  8585. 8003e04: 4a3e ldr r2, [pc, #248] @ (8003f00 <UartTasksInit+0x164>)
  8586. 8003e06: 631a str r2, [r3, #48] @ 0x30
  8587. uart2TaskData.uartNumber = 2;
  8588. 8003e08: 4b39 ldr r3, [pc, #228] @ (8003ef0 <UartTasksInit+0x154>)
  8589. 8003e0a: 2202 movs r2, #2
  8590. 8003e0c: f883 2034 strb.w r2, [r3, #52] @ 0x34
  8591. uart3TaskData.uartRxBuffer = uart3RxBuffer;
  8592. 8003e10: 4b3c ldr r3, [pc, #240] @ (8003f04 <UartTasksInit+0x168>)
  8593. 8003e12: 4a3d ldr r2, [pc, #244] @ (8003f08 <UartTasksInit+0x16c>)
  8594. 8003e14: 601a str r2, [r3, #0]
  8595. uart3TaskData.uartRxBufferLen = UART3_RX_BUFF_SIZE;
  8596. 8003e16: 4b3b ldr r3, [pc, #236] @ (8003f04 <UartTasksInit+0x168>)
  8597. 8003e18: f44f 7280 mov.w r2, #256 @ 0x100
  8598. 8003e1c: 809a strh r2, [r3, #4]
  8599. uart3TaskData.uartTxBuffer = uart3TxBuffer;
  8600. 8003e1e: 4b39 ldr r3, [pc, #228] @ (8003f04 <UartTasksInit+0x168>)
  8601. 8003e20: 4a3a ldr r2, [pc, #232] @ (8003f0c <UartTasksInit+0x170>)
  8602. 8003e22: 609a str r2, [r3, #8]
  8603. uart3TaskData.uartRxBufferLen = UART3_TX_BUFF_SIZE;
  8604. 8003e24: 4b37 ldr r3, [pc, #220] @ (8003f04 <UartTasksInit+0x168>)
  8605. 8003e26: f44f 7280 mov.w r2, #256 @ 0x100
  8606. 8003e2a: 809a strh r2, [r3, #4]
  8607. uart3TaskData.frameData = uart3TaskFrameData;
  8608. 8003e2c: 4b35 ldr r3, [pc, #212] @ (8003f04 <UartTasksInit+0x168>)
  8609. 8003e2e: 4a38 ldr r2, [pc, #224] @ (8003f10 <UartTasksInit+0x174>)
  8610. 8003e30: 611a str r2, [r3, #16]
  8611. uart3TaskData.frameDataLen = UART3_RX_BUFF_SIZE;
  8612. 8003e32: 4b34 ldr r3, [pc, #208] @ (8003f04 <UartTasksInit+0x168>)
  8613. 8003e34: f44f 7280 mov.w r2, #256 @ 0x100
  8614. 8003e38: 829a strh r2, [r3, #20]
  8615. uart3TaskData.huart = &huart3;
  8616. 8003e3a: 4b32 ldr r3, [pc, #200] @ (8003f04 <UartTasksInit+0x168>)
  8617. 8003e3c: 4a35 ldr r2, [pc, #212] @ (8003f14 <UartTasksInit+0x178>)
  8618. 8003e3e: 631a str r2, [r3, #48] @ 0x30
  8619. uart3TaskData.uartNumber = 3;
  8620. 8003e40: 4b30 ldr r3, [pc, #192] @ (8003f04 <UartTasksInit+0x168>)
  8621. 8003e42: 2203 movs r2, #3
  8622. 8003e44: f883 2034 strb.w r2, [r3, #52] @ 0x34
  8623. uart6TaskData.uartRxBuffer = uart6RxBuffer;
  8624. 8003e48: 4b33 ldr r3, [pc, #204] @ (8003f18 <UartTasksInit+0x17c>)
  8625. 8003e4a: 4a34 ldr r2, [pc, #208] @ (8003f1c <UartTasksInit+0x180>)
  8626. 8003e4c: 601a str r2, [r3, #0]
  8627. uart6TaskData.uartRxBufferLen = UART6_RX_BUFF_SIZE;
  8628. 8003e4e: 4b32 ldr r3, [pc, #200] @ (8003f18 <UartTasksInit+0x17c>)
  8629. 8003e50: f44f 7280 mov.w r2, #256 @ 0x100
  8630. 8003e54: 809a strh r2, [r3, #4]
  8631. uart6TaskData.uartTxBuffer = uart6TxBuffer;
  8632. 8003e56: 4b30 ldr r3, [pc, #192] @ (8003f18 <UartTasksInit+0x17c>)
  8633. 8003e58: 4a31 ldr r2, [pc, #196] @ (8003f20 <UartTasksInit+0x184>)
  8634. 8003e5a: 609a str r2, [r3, #8]
  8635. uart6TaskData.uartRxBufferLen = UART6_TX_BUFF_SIZE;
  8636. 8003e5c: 4b2e ldr r3, [pc, #184] @ (8003f18 <UartTasksInit+0x17c>)
  8637. 8003e5e: f44f 7280 mov.w r2, #256 @ 0x100
  8638. 8003e62: 809a strh r2, [r3, #4]
  8639. uart6TaskData.frameData = uart6TaskFrameData;
  8640. 8003e64: 4b2c ldr r3, [pc, #176] @ (8003f18 <UartTasksInit+0x17c>)
  8641. 8003e66: 4a2f ldr r2, [pc, #188] @ (8003f24 <UartTasksInit+0x188>)
  8642. 8003e68: 611a str r2, [r3, #16]
  8643. uart6TaskData.frameDataLen = UART6_RX_BUFF_SIZE;
  8644. 8003e6a: 4b2b ldr r3, [pc, #172] @ (8003f18 <UartTasksInit+0x17c>)
  8645. 8003e6c: f44f 7280 mov.w r2, #256 @ 0x100
  8646. 8003e70: 829a strh r2, [r3, #20]
  8647. uart6TaskData.huart = &huart6;
  8648. 8003e72: 4b29 ldr r3, [pc, #164] @ (8003f18 <UartTasksInit+0x17c>)
  8649. 8003e74: 4a2c ldr r2, [pc, #176] @ (8003f28 <UartTasksInit+0x18c>)
  8650. 8003e76: 631a str r2, [r3, #48] @ 0x30
  8651. uart6TaskData.uartNumber = 6;
  8652. 8003e78: 4b27 ldr r3, [pc, #156] @ (8003f18 <UartTasksInit+0x17c>)
  8653. 8003e7a: 2206 movs r2, #6
  8654. 8003e7c: f883 2034 strb.w r2, [r3, #52] @ 0x34
  8655. uart8TaskData.uartRxBuffer = uart8RxBuffer;
  8656. 8003e80: 4b2a ldr r3, [pc, #168] @ (8003f2c <UartTasksInit+0x190>)
  8657. 8003e82: 4a2b ldr r2, [pc, #172] @ (8003f30 <UartTasksInit+0x194>)
  8658. 8003e84: 601a str r2, [r3, #0]
  8659. uart8TaskData.uartRxBufferLen = UART8_RX_BUFF_SIZE;
  8660. 8003e86: 4b29 ldr r3, [pc, #164] @ (8003f2c <UartTasksInit+0x190>)
  8661. 8003e88: f44f 7280 mov.w r2, #256 @ 0x100
  8662. 8003e8c: 809a strh r2, [r3, #4]
  8663. uart8TaskData.uartTxBuffer = uart8TxBuffer;
  8664. 8003e8e: 4b27 ldr r3, [pc, #156] @ (8003f2c <UartTasksInit+0x190>)
  8665. 8003e90: 4a28 ldr r2, [pc, #160] @ (8003f34 <UartTasksInit+0x198>)
  8666. 8003e92: 609a str r2, [r3, #8]
  8667. uart8TaskData.uartRxBufferLen = UART8_TX_BUFF_SIZE;
  8668. 8003e94: 4b25 ldr r3, [pc, #148] @ (8003f2c <UartTasksInit+0x190>)
  8669. 8003e96: f44f 7280 mov.w r2, #256 @ 0x100
  8670. 8003e9a: 809a strh r2, [r3, #4]
  8671. uart8TaskData.frameData = uart8TaskFrameData;
  8672. 8003e9c: 4b23 ldr r3, [pc, #140] @ (8003f2c <UartTasksInit+0x190>)
  8673. 8003e9e: 4a26 ldr r2, [pc, #152] @ (8003f38 <UartTasksInit+0x19c>)
  8674. 8003ea0: 611a str r2, [r3, #16]
  8675. uart8TaskData.frameDataLen = UART8_RX_BUFF_SIZE;
  8676. 8003ea2: 4b22 ldr r3, [pc, #136] @ (8003f2c <UartTasksInit+0x190>)
  8677. 8003ea4: f44f 7280 mov.w r2, #256 @ 0x100
  8678. 8003ea8: 829a strh r2, [r3, #20]
  8679. uart8TaskData.huart = &huart8;
  8680. 8003eaa: 4b20 ldr r3, [pc, #128] @ (8003f2c <UartTasksInit+0x190>)
  8681. 8003eac: 4a23 ldr r2, [pc, #140] @ (8003f3c <UartTasksInit+0x1a0>)
  8682. 8003eae: 631a str r2, [r3, #48] @ 0x30
  8683. uart8TaskData.uartNumber = 8;
  8684. 8003eb0: 4b1e ldr r3, [pc, #120] @ (8003f2c <UartTasksInit+0x190>)
  8685. 8003eb2: 2208 movs r2, #8
  8686. 8003eb4: f883 2034 strb.w r2, [r3, #52] @ 0x34
  8687. UartTaskCreate (&uart1TaskData);
  8688. 8003eb8: 4808 ldr r0, [pc, #32] @ (8003edc <UartTasksInit+0x140>)
  8689. 8003eba: f000 f841 bl 8003f40 <UartTaskCreate>
  8690. UartTaskCreate (&uart2TaskData);
  8691. 8003ebe: 480c ldr r0, [pc, #48] @ (8003ef0 <UartTasksInit+0x154>)
  8692. 8003ec0: f000 f83e bl 8003f40 <UartTaskCreate>
  8693. UartTaskCreate (&uart3TaskData);
  8694. 8003ec4: 480f ldr r0, [pc, #60] @ (8003f04 <UartTasksInit+0x168>)
  8695. 8003ec6: f000 f83b bl 8003f40 <UartTaskCreate>
  8696. UartTaskCreate (&uart6TaskData);
  8697. 8003eca: 4813 ldr r0, [pc, #76] @ (8003f18 <UartTasksInit+0x17c>)
  8698. 8003ecc: f000 f838 bl 8003f40 <UartTaskCreate>
  8699. UartTaskCreate (&uart8TaskData);
  8700. 8003ed0: 4816 ldr r0, [pc, #88] @ (8003f2c <UartTasksInit+0x190>)
  8701. 8003ed2: f000 f835 bl 8003f40 <UartTaskCreate>
  8702. }
  8703. 8003ed6: bf00 nop
  8704. 8003ed8: bd80 pop {r7, pc}
  8705. 8003eda: bf00 nop
  8706. 8003edc: 24001e2c .word 0x24001e2c
  8707. 8003ee0: 24000f2c .word 0x24000f2c
  8708. 8003ee4: 2400102c .word 0x2400102c
  8709. 8003ee8: 2400112c .word 0x2400112c
  8710. 8003eec: 24000314 .word 0x24000314
  8711. 8003ef0: 24001ed4 .word 0x24001ed4
  8712. 8003ef4: 2400122c .word 0x2400122c
  8713. 8003ef8: 2400132c .word 0x2400132c
  8714. 8003efc: 2400142c .word 0x2400142c
  8715. 8003f00: 240003a8 .word 0x240003a8
  8716. 8003f04: 24001e64 .word 0x24001e64
  8717. 8003f08: 2400152c .word 0x2400152c
  8718. 8003f0c: 2400162c .word 0x2400162c
  8719. 8003f10: 2400172c .word 0x2400172c
  8720. 8003f14: 2400043c .word 0x2400043c
  8721. 8003f18: 24001e9c .word 0x24001e9c
  8722. 8003f1c: 2400182c .word 0x2400182c
  8723. 8003f20: 2400192c .word 0x2400192c
  8724. 8003f24: 24001a2c .word 0x24001a2c
  8725. 8003f28: 240004d0 .word 0x240004d0
  8726. 8003f2c: 24001f0c .word 0x24001f0c
  8727. 8003f30: 24001b2c .word 0x24001b2c
  8728. 8003f34: 24001c2c .word 0x24001c2c
  8729. 8003f38: 24001d2c .word 0x24001d2c
  8730. 8003f3c: 24000280 .word 0x24000280
  8731. 08003f40 <UartTaskCreate>:
  8732. void UartTaskCreate (UartTaskData* uartTaskData) {
  8733. 8003f40: b580 push {r7, lr}
  8734. 8003f42: b09a sub sp, #104 @ 0x68
  8735. 8003f44: af00 add r7, sp, #0
  8736. 8003f46: 6078 str r0, [r7, #4]
  8737. osThreadAttr_t osThreadAttrRxUart = { 0 };
  8738. 8003f48: f107 0344 add.w r3, r7, #68 @ 0x44
  8739. 8003f4c: 2224 movs r2, #36 @ 0x24
  8740. 8003f4e: 2100 movs r1, #0
  8741. 8003f50: 4618 mov r0, r3
  8742. 8003f52: f025 fecd bl 8029cf0 <memset>
  8743. osThreadAttr_t osThreadAttrTxUart = { 0 };
  8744. 8003f56: f107 0320 add.w r3, r7, #32
  8745. 8003f5a: 2224 movs r2, #36 @ 0x24
  8746. 8003f5c: 2100 movs r1, #0
  8747. 8003f5e: 4618 mov r0, r3
  8748. 8003f60: f025 fec6 bl 8029cf0 <memset>
  8749. uartTaskData->processRxDataMsgBuffer = xMessageBufferCreate (INPUT_DATA_BUFF_SIZE);
  8750. 8003f64: 2201 movs r2, #1
  8751. 8003f66: 2100 movs r1, #0
  8752. 8003f68: f44f 7080 mov.w r0, #256 @ 0x100
  8753. 8003f6c: f00e faf6 bl 801255c <xStreamBufferGenericCreate>
  8754. 8003f70: 4602 mov r2, r0
  8755. 8003f72: 687b ldr r3, [r7, #4]
  8756. 8003f74: 625a str r2, [r3, #36] @ 0x24
  8757. uartTaskData->processDataCb = NULL;
  8758. 8003f76: 687b ldr r3, [r7, #4]
  8759. 8003f78: 2200 movs r2, #0
  8760. 8003f7a: 629a str r2, [r3, #40] @ 0x28
  8761. // osThreadAttrRxUart.name = "os_thread_uart1_rx";
  8762. osThreadAttrRxUart.stack_size = configMINIMAL_STACK_SIZE * 2;
  8763. 8003f7c: f44f 6380 mov.w r3, #1024 @ 0x400
  8764. 8003f80: 65bb str r3, [r7, #88] @ 0x58
  8765. osThreadAttrRxUart.priority = (osPriority_t)osPriorityHigh;
  8766. 8003f82: 2328 movs r3, #40 @ 0x28
  8767. 8003f84: 65fb str r3, [r7, #92] @ 0x5c
  8768. uartTaskData->uartRecieveTaskHandle = osThreadNew (UartRxTask, uartTaskData, &osThreadAttrRxUart);
  8769. 8003f86: f107 0344 add.w r3, r7, #68 @ 0x44
  8770. 8003f8a: 461a mov r2, r3
  8771. 8003f8c: 6879 ldr r1, [r7, #4]
  8772. 8003f8e: 4816 ldr r0, [pc, #88] @ (8003fe8 <UartTaskCreate+0xa8>)
  8773. 8003f90: f00c fc59 bl 8010846 <osThreadNew>
  8774. 8003f94: 4602 mov r2, r0
  8775. 8003f96: 687b ldr r3, [r7, #4]
  8776. 8003f98: 619a str r2, [r3, #24]
  8777. osMessageQueueAttr_t uartTxMsgQueueAttr = { 0 };
  8778. 8003f9a: f107 0308 add.w r3, r7, #8
  8779. 8003f9e: 2200 movs r2, #0
  8780. 8003fa0: 601a str r2, [r3, #0]
  8781. 8003fa2: 605a str r2, [r3, #4]
  8782. 8003fa4: 609a str r2, [r3, #8]
  8783. 8003fa6: 60da str r2, [r3, #12]
  8784. 8003fa8: 611a str r2, [r3, #16]
  8785. 8003faa: 615a str r2, [r3, #20]
  8786. // uartTxMsgQueueAttr.name = "uart1TxMsgQueue";
  8787. uartTaskData->sendCmdToSlaveQueue = osMessageQueueNew (16, sizeof (InterProcessData), &uartTxMsgQueueAttr);
  8788. 8003fac: f107 0308 add.w r3, r7, #8
  8789. 8003fb0: 461a mov r2, r3
  8790. 8003fb2: 210c movs r1, #12
  8791. 8003fb4: 2010 movs r0, #16
  8792. 8003fb6: f00c ff51 bl 8010e5c <osMessageQueueNew>
  8793. 8003fba: 4602 mov r2, r0
  8794. 8003fbc: 687b ldr r3, [r7, #4]
  8795. 8003fbe: 62da str r2, [r3, #44] @ 0x2c
  8796. // osThreadAttrTxUart.name = "os_thread_uart1_tx";
  8797. osThreadAttrTxUart.stack_size = configMINIMAL_STACK_SIZE * 4;
  8798. 8003fc0: f44f 6300 mov.w r3, #2048 @ 0x800
  8799. 8003fc4: 637b str r3, [r7, #52] @ 0x34
  8800. osThreadAttrTxUart.priority = (osPriority_t)osPriorityNormal;
  8801. 8003fc6: 2318 movs r3, #24
  8802. 8003fc8: 63bb str r3, [r7, #56] @ 0x38
  8803. uartTaskData->uartTransmitTaskHandle = osThreadNew (UartTxTask, uartTaskData, &osThreadAttrTxUart);
  8804. 8003fca: f107 0320 add.w r3, r7, #32
  8805. 8003fce: 461a mov r2, r3
  8806. 8003fd0: 6879 ldr r1, [r7, #4]
  8807. 8003fd2: 4806 ldr r0, [pc, #24] @ (8003fec <UartTaskCreate+0xac>)
  8808. 8003fd4: f00c fc37 bl 8010846 <osThreadNew>
  8809. 8003fd8: 4602 mov r2, r0
  8810. 8003fda: 687b ldr r3, [r7, #4]
  8811. 8003fdc: 61da str r2, [r3, #28]
  8812. }
  8813. 8003fde: bf00 nop
  8814. 8003fe0: 3768 adds r7, #104 @ 0x68
  8815. 8003fe2: 46bd mov sp, r7
  8816. 8003fe4: bd80 pop {r7, pc}
  8817. 8003fe6: bf00 nop
  8818. 8003fe8: 08004165 .word 0x08004165
  8819. 8003fec: 08004751 .word 0x08004751
  8820. 08003ff0 <HAL_UART_RxCpltCallback>:
  8821. void HAL_UART_RxCpltCallback (UART_HandleTypeDef* huart) {
  8822. 8003ff0: b480 push {r7}
  8823. 8003ff2: b083 sub sp, #12
  8824. 8003ff4: af00 add r7, sp, #0
  8825. 8003ff6: 6078 str r0, [r7, #4]
  8826. // osSemaphoreRelease(uart8RxSemaphore);
  8827. }
  8828. 8003ff8: bf00 nop
  8829. 8003ffa: 370c adds r7, #12
  8830. 8003ffc: 46bd mov sp, r7
  8831. 8003ffe: f85d 7b04 ldr.w r7, [sp], #4
  8832. 8004002: 4770 bx lr
  8833. 08004004 <HAL_UARTEx_RxEventCallback>:
  8834. void HAL_UARTEx_RxEventCallback (UART_HandleTypeDef* huart, uint16_t Size) {
  8835. 8004004: b580 push {r7, lr}
  8836. 8004006: b082 sub sp, #8
  8837. 8004008: af00 add r7, sp, #0
  8838. 800400a: 6078 str r0, [r7, #4]
  8839. 800400c: 460b mov r3, r1
  8840. 800400e: 807b strh r3, [r7, #2]
  8841. if (huart->Instance == USART1) {
  8842. 8004010: 687b ldr r3, [r7, #4]
  8843. 8004012: 681b ldr r3, [r3, #0]
  8844. 8004014: 4a1e ldr r2, [pc, #120] @ (8004090 <HAL_UARTEx_RxEventCallback+0x8c>)
  8845. 8004016: 4293 cmp r3, r2
  8846. 8004018: d106 bne.n 8004028 <HAL_UARTEx_RxEventCallback+0x24>
  8847. HandleUartRxCallback (&uart1TaskData, huart, Size);
  8848. 800401a: 887b ldrh r3, [r7, #2]
  8849. 800401c: 461a mov r2, r3
  8850. 800401e: 6879 ldr r1, [r7, #4]
  8851. 8004020: 481c ldr r0, [pc, #112] @ (8004094 <HAL_UARTEx_RxEventCallback+0x90>)
  8852. 8004022: f000 f853 bl 80040cc <HandleUartRxCallback>
  8853. } else if (huart->Instance == USART6) {
  8854. HandleUartRxCallback (&uart6TaskData, huart, Size);
  8855. } else if (huart->Instance == UART8) {
  8856. HandleUartRxCallback (&uart8TaskData, huart, Size);
  8857. }
  8858. }
  8859. 8004026: e02e b.n 8004086 <HAL_UARTEx_RxEventCallback+0x82>
  8860. } else if (huart->Instance == USART2) {
  8861. 8004028: 687b ldr r3, [r7, #4]
  8862. 800402a: 681b ldr r3, [r3, #0]
  8863. 800402c: 4a1a ldr r2, [pc, #104] @ (8004098 <HAL_UARTEx_RxEventCallback+0x94>)
  8864. 800402e: 4293 cmp r3, r2
  8865. 8004030: d106 bne.n 8004040 <HAL_UARTEx_RxEventCallback+0x3c>
  8866. HandleUartRxCallback (&uart2TaskData, huart, Size);
  8867. 8004032: 887b ldrh r3, [r7, #2]
  8868. 8004034: 461a mov r2, r3
  8869. 8004036: 6879 ldr r1, [r7, #4]
  8870. 8004038: 4818 ldr r0, [pc, #96] @ (800409c <HAL_UARTEx_RxEventCallback+0x98>)
  8871. 800403a: f000 f847 bl 80040cc <HandleUartRxCallback>
  8872. }
  8873. 800403e: e022 b.n 8004086 <HAL_UARTEx_RxEventCallback+0x82>
  8874. } else if (huart->Instance == USART3) {
  8875. 8004040: 687b ldr r3, [r7, #4]
  8876. 8004042: 681b ldr r3, [r3, #0]
  8877. 8004044: 4a16 ldr r2, [pc, #88] @ (80040a0 <HAL_UARTEx_RxEventCallback+0x9c>)
  8878. 8004046: 4293 cmp r3, r2
  8879. 8004048: d106 bne.n 8004058 <HAL_UARTEx_RxEventCallback+0x54>
  8880. HandleUartRxCallback (&uart3TaskData, huart, Size);
  8881. 800404a: 887b ldrh r3, [r7, #2]
  8882. 800404c: 461a mov r2, r3
  8883. 800404e: 6879 ldr r1, [r7, #4]
  8884. 8004050: 4814 ldr r0, [pc, #80] @ (80040a4 <HAL_UARTEx_RxEventCallback+0xa0>)
  8885. 8004052: f000 f83b bl 80040cc <HandleUartRxCallback>
  8886. }
  8887. 8004056: e016 b.n 8004086 <HAL_UARTEx_RxEventCallback+0x82>
  8888. } else if (huart->Instance == USART6) {
  8889. 8004058: 687b ldr r3, [r7, #4]
  8890. 800405a: 681b ldr r3, [r3, #0]
  8891. 800405c: 4a12 ldr r2, [pc, #72] @ (80040a8 <HAL_UARTEx_RxEventCallback+0xa4>)
  8892. 800405e: 4293 cmp r3, r2
  8893. 8004060: d106 bne.n 8004070 <HAL_UARTEx_RxEventCallback+0x6c>
  8894. HandleUartRxCallback (&uart6TaskData, huart, Size);
  8895. 8004062: 887b ldrh r3, [r7, #2]
  8896. 8004064: 461a mov r2, r3
  8897. 8004066: 6879 ldr r1, [r7, #4]
  8898. 8004068: 4810 ldr r0, [pc, #64] @ (80040ac <HAL_UARTEx_RxEventCallback+0xa8>)
  8899. 800406a: f000 f82f bl 80040cc <HandleUartRxCallback>
  8900. }
  8901. 800406e: e00a b.n 8004086 <HAL_UARTEx_RxEventCallback+0x82>
  8902. } else if (huart->Instance == UART8) {
  8903. 8004070: 687b ldr r3, [r7, #4]
  8904. 8004072: 681b ldr r3, [r3, #0]
  8905. 8004074: 4a0e ldr r2, [pc, #56] @ (80040b0 <HAL_UARTEx_RxEventCallback+0xac>)
  8906. 8004076: 4293 cmp r3, r2
  8907. 8004078: d105 bne.n 8004086 <HAL_UARTEx_RxEventCallback+0x82>
  8908. HandleUartRxCallback (&uart8TaskData, huart, Size);
  8909. 800407a: 887b ldrh r3, [r7, #2]
  8910. 800407c: 461a mov r2, r3
  8911. 800407e: 6879 ldr r1, [r7, #4]
  8912. 8004080: 480c ldr r0, [pc, #48] @ (80040b4 <HAL_UARTEx_RxEventCallback+0xb0>)
  8913. 8004082: f000 f823 bl 80040cc <HandleUartRxCallback>
  8914. }
  8915. 8004086: bf00 nop
  8916. 8004088: 3708 adds r7, #8
  8917. 800408a: 46bd mov sp, r7
  8918. 800408c: bd80 pop {r7, pc}
  8919. 800408e: bf00 nop
  8920. 8004090: 40011000 .word 0x40011000
  8921. 8004094: 24001e2c .word 0x24001e2c
  8922. 8004098: 40004400 .word 0x40004400
  8923. 800409c: 24001ed4 .word 0x24001ed4
  8924. 80040a0: 40004800 .word 0x40004800
  8925. 80040a4: 24001e64 .word 0x24001e64
  8926. 80040a8: 40011400 .word 0x40011400
  8927. 80040ac: 24001e9c .word 0x24001e9c
  8928. 80040b0: 40007c00 .word 0x40007c00
  8929. 80040b4: 24001f0c .word 0x24001f0c
  8930. 080040b8 <HAL_UART_TxCpltCallback>:
  8931. void HAL_UART_TxCpltCallback (UART_HandleTypeDef* huart) {
  8932. 80040b8: b480 push {r7}
  8933. 80040ba: b083 sub sp, #12
  8934. 80040bc: af00 add r7, sp, #0
  8935. 80040be: 6078 str r0, [r7, #4]
  8936. if (huart->Instance == UART8) {
  8937. }
  8938. }
  8939. 80040c0: bf00 nop
  8940. 80040c2: 370c adds r7, #12
  8941. 80040c4: 46bd mov sp, r7
  8942. 80040c6: f85d 7b04 ldr.w r7, [sp], #4
  8943. 80040ca: 4770 bx lr
  8944. 080040cc <HandleUartRxCallback>:
  8945. void HandleUartRxCallback (UartTaskData* uartTaskData, UART_HandleTypeDef* huart, uint16_t Size) {
  8946. 80040cc: b580 push {r7, lr}
  8947. 80040ce: b088 sub sp, #32
  8948. 80040d0: af02 add r7, sp, #8
  8949. 80040d2: 60f8 str r0, [r7, #12]
  8950. 80040d4: 60b9 str r1, [r7, #8]
  8951. 80040d6: 4613 mov r3, r2
  8952. 80040d8: 80fb strh r3, [r7, #6]
  8953. BaseType_t pxHigherPriorityTaskWoken = pdFALSE;
  8954. 80040da: 2300 movs r3, #0
  8955. 80040dc: 617b str r3, [r7, #20]
  8956. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  8957. 80040de: 68fb ldr r3, [r7, #12]
  8958. 80040e0: 6a1b ldr r3, [r3, #32]
  8959. 80040e2: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  8960. 80040e6: 4618 mov r0, r3
  8961. 80040e8: f00c fcec bl 8010ac4 <osMutexAcquire>
  8962. memcpy (&(uartTaskData->frameData[uartTaskData->frameBytesCount]), uartTaskData->uartRxBuffer, Size);
  8963. 80040ec: 68fb ldr r3, [r7, #12]
  8964. 80040ee: 691b ldr r3, [r3, #16]
  8965. 80040f0: 68fa ldr r2, [r7, #12]
  8966. 80040f2: 8ad2 ldrh r2, [r2, #22]
  8967. 80040f4: 1898 adds r0, r3, r2
  8968. 80040f6: 68fb ldr r3, [r7, #12]
  8969. 80040f8: 681b ldr r3, [r3, #0]
  8970. 80040fa: 88fa ldrh r2, [r7, #6]
  8971. 80040fc: 4619 mov r1, r3
  8972. 80040fe: f025 feee bl 8029ede <memcpy>
  8973. uartTaskData->frameBytesCount += Size;
  8974. 8004102: 68fb ldr r3, [r7, #12]
  8975. 8004104: 8ada ldrh r2, [r3, #22]
  8976. 8004106: 88fb ldrh r3, [r7, #6]
  8977. 8004108: 4413 add r3, r2
  8978. 800410a: b29a uxth r2, r3
  8979. 800410c: 68fb ldr r3, [r7, #12]
  8980. 800410e: 82da strh r2, [r3, #22]
  8981. osMutexRelease (uartTaskData->rxDataBufferMutex);
  8982. 8004110: 68fb ldr r3, [r7, #12]
  8983. 8004112: 6a1b ldr r3, [r3, #32]
  8984. 8004114: 4618 mov r0, r3
  8985. 8004116: f00c fd20 bl 8010b5a <osMutexRelease>
  8986. xTaskNotifyFromISR (uartTaskData->uartRecieveTaskHandle, Size, eSetValueWithOverwrite, &pxHigherPriorityTaskWoken);
  8987. 800411a: 68fb ldr r3, [r7, #12]
  8988. 800411c: 6998 ldr r0, [r3, #24]
  8989. 800411e: 88f9 ldrh r1, [r7, #6]
  8990. 8004120: f107 0314 add.w r3, r7, #20
  8991. 8004124: 9300 str r3, [sp, #0]
  8992. 8004126: 2300 movs r3, #0
  8993. 8004128: 2203 movs r2, #3
  8994. 800412a: f00f ff0f bl 8013f4c <xTaskGenericNotifyFromISR>
  8995. // HAL_UARTEx_ReceiveToIdle_DMA(huart, uart8RxBuffer, UART8_RX_BUFF_SIZE);
  8996. // __HAL_DMA_DISABLE_IT(&hdma_uart8_rx, DMA_IT_HT);
  8997. HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
  8998. 800412e: 68fb ldr r3, [r7, #12]
  8999. 8004130: 6b18 ldr r0, [r3, #48] @ 0x30
  9000. 8004132: 68fb ldr r3, [r7, #12]
  9001. 8004134: 6819 ldr r1, [r3, #0]
  9002. 8004136: 68fb ldr r3, [r7, #12]
  9003. 8004138: 889b ldrh r3, [r3, #4]
  9004. 800413a: 461a mov r2, r3
  9005. 800413c: f00b fb8f bl 800f85e <HAL_UARTEx_ReceiveToIdle_IT>
  9006. portEND_SWITCHING_ISR (pxHigherPriorityTaskWoken);
  9007. 8004140: 697b ldr r3, [r7, #20]
  9008. 8004142: 2b00 cmp r3, #0
  9009. 8004144: d007 beq.n 8004156 <HandleUartRxCallback+0x8a>
  9010. 8004146: 4b06 ldr r3, [pc, #24] @ (8004160 <HandleUartRxCallback+0x94>)
  9011. 8004148: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  9012. 800414c: 601a str r2, [r3, #0]
  9013. 800414e: f3bf 8f4f dsb sy
  9014. 8004152: f3bf 8f6f isb sy
  9015. }
  9016. 8004156: bf00 nop
  9017. 8004158: 3718 adds r7, #24
  9018. 800415a: 46bd mov sp, r7
  9019. 800415c: bd80 pop {r7, pc}
  9020. 800415e: bf00 nop
  9021. 8004160: e000ed04 .word 0xe000ed04
  9022. 08004164 <UartRxTask>:
  9023. void UartRxTask (void* argument) {
  9024. 8004164: b580 push {r7, lr}
  9025. 8004166: b0d2 sub sp, #328 @ 0x148
  9026. 8004168: af02 add r7, sp, #8
  9027. 800416a: f507 73a0 add.w r3, r7, #320 @ 0x140
  9028. 800416e: f5a3 739e sub.w r3, r3, #316 @ 0x13c
  9029. 8004172: 6018 str r0, [r3, #0]
  9030. UartTaskData* uartTaskData = (UartTaskData*)argument;
  9031. 8004174: f507 73a0 add.w r3, r7, #320 @ 0x140
  9032. 8004178: f5a3 739e sub.w r3, r3, #316 @ 0x13c
  9033. 800417c: 681b ldr r3, [r3, #0]
  9034. 800417e: f8c7 312c str.w r3, [r7, #300] @ 0x12c
  9035. SerialProtocolFrameData spFrameData = { 0 };
  9036. 8004182: f507 73a0 add.w r3, r7, #320 @ 0x140
  9037. 8004186: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9038. 800418a: 4618 mov r0, r3
  9039. 800418c: f44f 7386 mov.w r3, #268 @ 0x10c
  9040. 8004190: 461a mov r2, r3
  9041. 8004192: 2100 movs r1, #0
  9042. 8004194: f025 fdac bl 8029cf0 <memset>
  9043. uint32_t bytesRec = 0;
  9044. 8004198: f507 73a0 add.w r3, r7, #320 @ 0x140
  9045. 800419c: f5a3 739a sub.w r3, r3, #308 @ 0x134
  9046. 80041a0: 2200 movs r2, #0
  9047. 80041a2: 601a str r2, [r3, #0]
  9048. uint32_t crc = 0;
  9049. 80041a4: 2300 movs r3, #0
  9050. 80041a6: f8c7 3128 str.w r3, [r7, #296] @ 0x128
  9051. uint16_t frameCommandRaw = 0x0000;
  9052. 80041aa: 2300 movs r3, #0
  9053. 80041ac: f8a7 3126 strh.w r3, [r7, #294] @ 0x126
  9054. uint16_t frameBytesCount = 0;
  9055. 80041b0: 2300 movs r3, #0
  9056. 80041b2: f8a7 3124 strh.w r3, [r7, #292] @ 0x124
  9057. uint16_t frameCrc = 0;
  9058. 80041b6: 2300 movs r3, #0
  9059. 80041b8: f8a7 3122 strh.w r3, [r7, #290] @ 0x122
  9060. uint16_t frameTotalLength = 0;
  9061. 80041bc: 2300 movs r3, #0
  9062. 80041be: f8a7 313e strh.w r3, [r7, #318] @ 0x13e
  9063. uint16_t dataToSend = 0;
  9064. 80041c2: 2300 movs r3, #0
  9065. 80041c4: f8a7 313c strh.w r3, [r7, #316] @ 0x13c
  9066. portBASE_TYPE crcPass = pdFAIL;
  9067. 80041c8: 2300 movs r3, #0
  9068. 80041ca: f8c7 3138 str.w r3, [r7, #312] @ 0x138
  9069. portBASE_TYPE proceed = pdFALSE;
  9070. 80041ce: 2300 movs r3, #0
  9071. 80041d0: f8c7 3134 str.w r3, [r7, #308] @ 0x134
  9072. portBASE_TYPE frameTimeout = pdFAIL;
  9073. 80041d4: 2300 movs r3, #0
  9074. 80041d6: f8c7 311c str.w r3, [r7, #284] @ 0x11c
  9075. enum SerialReceiverStates receverState = srWaitForHeader;
  9076. 80041da: 2300 movs r3, #0
  9077. 80041dc: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9078. uartTaskData->rxDataBufferMutex = osMutexNew (NULL);
  9079. 80041e0: 2000 movs r0, #0
  9080. 80041e2: f00c fbe9 bl 80109b8 <osMutexNew>
  9081. 80041e6: 4602 mov r2, r0
  9082. 80041e8: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9083. 80041ec: 621a str r2, [r3, #32]
  9084. HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
  9085. 80041ee: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9086. 80041f2: 6b18 ldr r0, [r3, #48] @ 0x30
  9087. 80041f4: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9088. 80041f8: 6819 ldr r1, [r3, #0]
  9089. 80041fa: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9090. 80041fe: 889b ldrh r3, [r3, #4]
  9091. 8004200: 461a mov r2, r3
  9092. 8004202: f00b fb2c bl 800f85e <HAL_UARTEx_ReceiveToIdle_IT>
  9093. // HAL_UARTEx_ReceiveToIdle_DMA(&huart8, uart8RxBuffer, 32);
  9094. while (pdTRUE) {
  9095. // HAL_UART_Receive_IT(&huart8, uart8RxBuffer, 1);
  9096. // if(osSemaphoreAcquire(uart8RxSemaphore, pdMS_TO_TICKS(1000)) !=
  9097. // osOK) if(xTaskNotifyWait(0, 0, &bytesRec, portMAX_DELAY) == pdTrue)
  9098. frameTimeout = !(xTaskNotifyWait (0, 0, &bytesRec, pdMS_TO_TICKS (FRAME_TIMEOUT_MS)));
  9099. 8004206: f107 020c add.w r2, r7, #12
  9100. 800420a: f44f 63fa mov.w r3, #2000 @ 0x7d0
  9101. 800420e: 2100 movs r1, #0
  9102. 8004210: 2000 movs r0, #0
  9103. 8004212: f00f fd79 bl 8013d08 <xTaskNotifyWait>
  9104. 8004216: 4603 mov r3, r0
  9105. 8004218: 2b00 cmp r3, #0
  9106. 800421a: bf0c ite eq
  9107. 800421c: 2301 moveq r3, #1
  9108. 800421e: 2300 movne r3, #0
  9109. 8004220: b2db uxtb r3, r3
  9110. 8004222: f8c7 311c str.w r3, [r7, #284] @ 0x11c
  9111. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  9112. 8004226: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9113. 800422a: 6a1b ldr r3, [r3, #32]
  9114. 800422c: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  9115. 8004230: 4618 mov r0, r3
  9116. 8004232: f00c fc47 bl 8010ac4 <osMutexAcquire>
  9117. frameBytesCount = uartTaskData->frameBytesCount;
  9118. 8004236: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9119. 800423a: 8adb ldrh r3, [r3, #22]
  9120. 800423c: f8a7 3124 strh.w r3, [r7, #292] @ 0x124
  9121. osMutexRelease (uartTaskData->rxDataBufferMutex);
  9122. 8004240: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9123. 8004244: 6a1b ldr r3, [r3, #32]
  9124. 8004246: 4618 mov r0, r3
  9125. 8004248: f00c fc87 bl 8010b5a <osMutexRelease>
  9126. if ((frameTimeout == pdTRUE) && (frameBytesCount > 0)) {
  9127. 800424c: f8d7 311c ldr.w r3, [r7, #284] @ 0x11c
  9128. 8004250: 2b01 cmp r3, #1
  9129. 8004252: d10a bne.n 800426a <UartRxTask+0x106>
  9130. 8004254: f8b7 3124 ldrh.w r3, [r7, #292] @ 0x124
  9131. 8004258: 2b00 cmp r3, #0
  9132. 800425a: d006 beq.n 800426a <UartRxTask+0x106>
  9133. receverState = srFail;
  9134. 800425c: 2304 movs r3, #4
  9135. 800425e: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9136. proceed = pdTRUE;
  9137. 8004262: 2301 movs r3, #1
  9138. 8004264: f8c7 3134 str.w r3, [r7, #308] @ 0x134
  9139. 8004268: e029 b.n 80042be <UartRxTask+0x15a>
  9140. } else {
  9141. if (frameTimeout == pdFALSE) {
  9142. 800426a: f8d7 311c ldr.w r3, [r7, #284] @ 0x11c
  9143. 800426e: 2b00 cmp r3, #0
  9144. 8004270: d111 bne.n 8004296 <UartRxTask+0x132>
  9145. proceed = pdTRUE;
  9146. 8004272: 2301 movs r3, #1
  9147. 8004274: f8c7 3134 str.w r3, [r7, #308] @ 0x134
  9148. #if UART_TASK_LOGS
  9149. printf ("Uart%d: RX bytes received: %ld\n", uartTaskData->uartNumber, bytesRec);
  9150. 8004278: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9151. 800427c: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  9152. 8004280: 4619 mov r1, r3
  9153. 8004282: f507 73a0 add.w r3, r7, #320 @ 0x140
  9154. 8004286: f5a3 739a sub.w r3, r3, #308 @ 0x134
  9155. 800428a: 681b ldr r3, [r3, #0]
  9156. 800428c: 461a mov r2, r3
  9157. 800428e: 48c1 ldr r0, [pc, #772] @ (8004594 <UartRxTask+0x430>)
  9158. 8004290: f025 fb9c bl 80299cc <iprintf>
  9159. 8004294: e22f b.n 80046f6 <UartRxTask+0x592>
  9160. #endif
  9161. } else {
  9162. if (uartTaskData->huart->RxState == HAL_UART_STATE_READY) {
  9163. 8004296: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9164. 800429a: 6b1b ldr r3, [r3, #48] @ 0x30
  9165. 800429c: f8d3 308c ldr.w r3, [r3, #140] @ 0x8c
  9166. 80042a0: 2b20 cmp r3, #32
  9167. 80042a2: f040 8228 bne.w 80046f6 <UartRxTask+0x592>
  9168. HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
  9169. 80042a6: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9170. 80042aa: 6b18 ldr r0, [r3, #48] @ 0x30
  9171. 80042ac: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9172. 80042b0: 6819 ldr r1, [r3, #0]
  9173. 80042b2: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9174. 80042b6: 889b ldrh r3, [r3, #4]
  9175. 80042b8: 461a mov r2, r3
  9176. 80042ba: f00b fad0 bl 800f85e <HAL_UARTEx_ReceiveToIdle_IT>
  9177. }
  9178. }
  9179. }
  9180. while (proceed) {
  9181. 80042be: e21a b.n 80046f6 <UartRxTask+0x592>
  9182. switch (receverState) {
  9183. 80042c0: f897 3133 ldrb.w r3, [r7, #307] @ 0x133
  9184. 80042c4: 2b04 cmp r3, #4
  9185. 80042c6: f200 81f1 bhi.w 80046ac <UartRxTask+0x548>
  9186. 80042ca: a201 add r2, pc, #4 @ (adr r2, 80042d0 <UartRxTask+0x16c>)
  9187. 80042cc: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  9188. 80042d0: 080042e5 .word 0x080042e5
  9189. 80042d4: 08004447 .word 0x08004447
  9190. 80042d8: 0800442b .word 0x0800442b
  9191. 80042dc: 080044e7 .word 0x080044e7
  9192. 80042e0: 080045a1 .word 0x080045a1
  9193. case srWaitForHeader:
  9194. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  9195. 80042e4: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9196. 80042e8: 6a1b ldr r3, [r3, #32]
  9197. 80042ea: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  9198. 80042ee: 4618 mov r0, r3
  9199. 80042f0: f00c fbe8 bl 8010ac4 <osMutexAcquire>
  9200. if (uartTaskData->frameData[0] == FRAME_INDICATOR) {
  9201. 80042f4: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9202. 80042f8: 691b ldr r3, [r3, #16]
  9203. 80042fa: 781b ldrb r3, [r3, #0]
  9204. 80042fc: 2baa cmp r3, #170 @ 0xaa
  9205. 80042fe: f040 8082 bne.w 8004406 <UartRxTask+0x2a2>
  9206. if (frameBytesCount > FRAME_ID_LENGTH) {
  9207. 8004302: f8b7 3124 ldrh.w r3, [r7, #292] @ 0x124
  9208. 8004306: 2b02 cmp r3, #2
  9209. 8004308: d914 bls.n 8004334 <UartRxTask+0x1d0>
  9210. spFrameData.frameHeader.frameId =
  9211. CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH - FRAME_ID_LENGTH - FRAME_COMMAND_LENGTH]));
  9212. 800430a: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9213. 800430e: 691b ldr r3, [r3, #16]
  9214. 8004310: 3302 adds r3, #2
  9215. 8004312: 781b ldrb r3, [r3, #0]
  9216. 8004314: 021b lsls r3, r3, #8
  9217. 8004316: b21a sxth r2, r3
  9218. 8004318: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9219. 800431c: 691b ldr r3, [r3, #16]
  9220. 800431e: 3301 adds r3, #1
  9221. 8004320: 781b ldrb r3, [r3, #0]
  9222. 8004322: b21b sxth r3, r3
  9223. 8004324: 4313 orrs r3, r2
  9224. 8004326: b21b sxth r3, r3
  9225. 8004328: b29a uxth r2, r3
  9226. spFrameData.frameHeader.frameId =
  9227. 800432a: f507 73a0 add.w r3, r7, #320 @ 0x140
  9228. 800432e: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9229. 8004332: 801a strh r2, [r3, #0]
  9230. }
  9231. if (frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH) {
  9232. 8004334: f8b7 3124 ldrh.w r3, [r7, #292] @ 0x124
  9233. 8004338: 2b04 cmp r3, #4
  9234. 800433a: d923 bls.n 8004384 <UartRxTask+0x220>
  9235. frameCommandRaw = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH - FRAME_COMMAND_LENGTH]));
  9236. 800433c: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9237. 8004340: 691b ldr r3, [r3, #16]
  9238. 8004342: 3304 adds r3, #4
  9239. 8004344: 781b ldrb r3, [r3, #0]
  9240. 8004346: 021b lsls r3, r3, #8
  9241. 8004348: b21a sxth r2, r3
  9242. 800434a: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9243. 800434e: 691b ldr r3, [r3, #16]
  9244. 8004350: 3303 adds r3, #3
  9245. 8004352: 781b ldrb r3, [r3, #0]
  9246. 8004354: b21b sxth r3, r3
  9247. 8004356: 4313 orrs r3, r2
  9248. 8004358: b21b sxth r3, r3
  9249. 800435a: f8a7 3126 strh.w r3, [r7, #294] @ 0x126
  9250. spFrameData.frameHeader.frameCommand = (SerialProtocolCommands)(frameCommandRaw & 0x7FFF);
  9251. 800435e: f8b7 3126 ldrh.w r3, [r7, #294] @ 0x126
  9252. 8004362: b2da uxtb r2, r3
  9253. 8004364: f507 73a0 add.w r3, r7, #320 @ 0x140
  9254. 8004368: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9255. 800436c: 709a strb r2, [r3, #2]
  9256. spFrameData.frameHeader.isResponseFrame = (frameCommandRaw & 0x8000) != 0 ? pdTRUE : pdFALSE;
  9257. 800436e: f9b7 3126 ldrsh.w r3, [r7, #294] @ 0x126
  9258. 8004372: 13db asrs r3, r3, #15
  9259. 8004374: b21b sxth r3, r3
  9260. 8004376: f003 0201 and.w r2, r3, #1
  9261. 800437a: f507 73a0 add.w r3, r7, #320 @ 0x140
  9262. 800437e: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9263. 8004382: 609a str r2, [r3, #8]
  9264. }
  9265. if ((frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH) && ((spFrameData.frameHeader.frameCommand & 0x8000) != 0)) {
  9266. 8004384: f8b7 3124 ldrh.w r3, [r7, #292] @ 0x124
  9267. 8004388: 2b05 cmp r3, #5
  9268. 800438a: d913 bls.n 80043b4 <UartRxTask+0x250>
  9269. 800438c: f507 73a0 add.w r3, r7, #320 @ 0x140
  9270. 8004390: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9271. 8004394: 789b ldrb r3, [r3, #2]
  9272. 8004396: f403 4300 and.w r3, r3, #32768 @ 0x8000
  9273. 800439a: 2b00 cmp r3, #0
  9274. 800439c: d00a beq.n 80043b4 <UartRxTask+0x250>
  9275. spFrameData.frameHeader.respStatus = (SerialProtocolRespStatus)(uartTaskData->frameData[FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH]);
  9276. 800439e: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9277. 80043a2: 691b ldr r3, [r3, #16]
  9278. 80043a4: 3305 adds r3, #5
  9279. 80043a6: 781b ldrb r3, [r3, #0]
  9280. 80043a8: b25a sxtb r2, r3
  9281. 80043aa: f507 73a0 add.w r3, r7, #320 @ 0x140
  9282. 80043ae: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9283. 80043b2: 70da strb r2, [r3, #3]
  9284. }
  9285. if (frameBytesCount >= FRAME_HEADER_LENGTH) {
  9286. 80043b4: f8b7 3124 ldrh.w r3, [r7, #292] @ 0x124
  9287. 80043b8: 2b07 cmp r3, #7
  9288. 80043ba: d920 bls.n 80043fe <UartRxTask+0x29a>
  9289. spFrameData.frameHeader.frameDataLength = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH]));
  9290. 80043bc: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9291. 80043c0: 691b ldr r3, [r3, #16]
  9292. 80043c2: 3306 adds r3, #6
  9293. 80043c4: 781b ldrb r3, [r3, #0]
  9294. 80043c6: 021b lsls r3, r3, #8
  9295. 80043c8: b21a sxth r2, r3
  9296. 80043ca: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9297. 80043ce: 691b ldr r3, [r3, #16]
  9298. 80043d0: 3305 adds r3, #5
  9299. 80043d2: 781b ldrb r3, [r3, #0]
  9300. 80043d4: b21b sxth r3, r3
  9301. 80043d6: 4313 orrs r3, r2
  9302. 80043d8: b21b sxth r3, r3
  9303. 80043da: b29a uxth r2, r3
  9304. 80043dc: f507 73a0 add.w r3, r7, #320 @ 0x140
  9305. 80043e0: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9306. 80043e4: 809a strh r2, [r3, #4]
  9307. frameTotalLength = FRAME_HEADER_LENGTH + spFrameData.frameHeader.frameDataLength + FRAME_CRC_LENGTH;
  9308. 80043e6: f507 73a0 add.w r3, r7, #320 @ 0x140
  9309. 80043ea: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9310. 80043ee: 889b ldrh r3, [r3, #4]
  9311. 80043f0: 330a adds r3, #10
  9312. 80043f2: f8a7 313e strh.w r3, [r7, #318] @ 0x13e
  9313. receverState = srRecieveData;
  9314. 80043f6: 2302 movs r3, #2
  9315. 80043f8: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9316. 80043fc: e00e b.n 800441c <UartRxTask+0x2b8>
  9317. } else {
  9318. proceed = pdFALSE;
  9319. 80043fe: 2300 movs r3, #0
  9320. 8004400: f8c7 3134 str.w r3, [r7, #308] @ 0x134
  9321. 8004404: e00a b.n 800441c <UartRxTask+0x2b8>
  9322. }
  9323. } else {
  9324. if (frameBytesCount > 0) {
  9325. 8004406: f8b7 3124 ldrh.w r3, [r7, #292] @ 0x124
  9326. 800440a: 2b00 cmp r3, #0
  9327. 800440c: d003 beq.n 8004416 <UartRxTask+0x2b2>
  9328. receverState = srFail;
  9329. 800440e: 2304 movs r3, #4
  9330. 8004410: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9331. 8004414: e002 b.n 800441c <UartRxTask+0x2b8>
  9332. } else {
  9333. proceed = pdFALSE;
  9334. 8004416: 2300 movs r3, #0
  9335. 8004418: f8c7 3134 str.w r3, [r7, #308] @ 0x134
  9336. }
  9337. }
  9338. osMutexRelease (uartTaskData->rxDataBufferMutex);
  9339. 800441c: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9340. 8004420: 6a1b ldr r3, [r3, #32]
  9341. 8004422: 4618 mov r0, r3
  9342. 8004424: f00c fb99 bl 8010b5a <osMutexRelease>
  9343. break;
  9344. 8004428: e165 b.n 80046f6 <UartRxTask+0x592>
  9345. case srRecieveData:
  9346. if (frameBytesCount >= frameTotalLength) {
  9347. 800442a: f8b7 2124 ldrh.w r2, [r7, #292] @ 0x124
  9348. 800442e: f8b7 313e ldrh.w r3, [r7, #318] @ 0x13e
  9349. 8004432: 429a cmp r2, r3
  9350. 8004434: d303 bcc.n 800443e <UartRxTask+0x2da>
  9351. receverState = srCheckCrc;
  9352. 8004436: 2301 movs r3, #1
  9353. 8004438: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9354. } else {
  9355. proceed = pdFALSE;
  9356. }
  9357. break;
  9358. 800443c: e15b b.n 80046f6 <UartRxTask+0x592>
  9359. proceed = pdFALSE;
  9360. 800443e: 2300 movs r3, #0
  9361. 8004440: f8c7 3134 str.w r3, [r7, #308] @ 0x134
  9362. break;
  9363. 8004444: e157 b.n 80046f6 <UartRxTask+0x592>
  9364. case srCheckCrc:
  9365. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  9366. 8004446: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9367. 800444a: 6a1b ldr r3, [r3, #32]
  9368. 800444c: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  9369. 8004450: 4618 mov r0, r3
  9370. 8004452: f00c fb37 bl 8010ac4 <osMutexAcquire>
  9371. frameCrc = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[frameTotalLength - FRAME_CRC_LENGTH]));
  9372. 8004456: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9373. 800445a: 691a ldr r2, [r3, #16]
  9374. 800445c: f8b7 313e ldrh.w r3, [r7, #318] @ 0x13e
  9375. 8004460: 3b01 subs r3, #1
  9376. 8004462: 4413 add r3, r2
  9377. 8004464: 781b ldrb r3, [r3, #0]
  9378. 8004466: 021b lsls r3, r3, #8
  9379. 8004468: b21a sxth r2, r3
  9380. 800446a: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9381. 800446e: 6919 ldr r1, [r3, #16]
  9382. 8004470: f8b7 313e ldrh.w r3, [r7, #318] @ 0x13e
  9383. 8004474: 3b02 subs r3, #2
  9384. 8004476: 440b add r3, r1
  9385. 8004478: 781b ldrb r3, [r3, #0]
  9386. 800447a: b21b sxth r3, r3
  9387. 800447c: 4313 orrs r3, r2
  9388. 800447e: b21b sxth r3, r3
  9389. 8004480: f8a7 3122 strh.w r3, [r7, #290] @ 0x122
  9390. crc = HAL_CRC_Calculate (&hcrc, (uint32_t*)(uartTaskData->frameData), frameTotalLength - FRAME_CRC_LENGTH);
  9391. 8004484: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9392. 8004488: 6919 ldr r1, [r3, #16]
  9393. 800448a: f8b7 313e ldrh.w r3, [r7, #318] @ 0x13e
  9394. 800448e: 3b02 subs r3, #2
  9395. 8004490: 461a mov r2, r3
  9396. 8004492: 4841 ldr r0, [pc, #260] @ (8004598 <UartRxTask+0x434>)
  9397. 8004494: f000 ffd8 bl 8005448 <HAL_CRC_Calculate>
  9398. 8004498: f8c7 0128 str.w r0, [r7, #296] @ 0x128
  9399. osMutexRelease (uartTaskData->rxDataBufferMutex);
  9400. 800449c: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9401. 80044a0: 6a1b ldr r3, [r3, #32]
  9402. 80044a2: 4618 mov r0, r3
  9403. 80044a4: f00c fb59 bl 8010b5a <osMutexRelease>
  9404. crcPass = frameCrc == crc;
  9405. 80044a8: f8b7 3122 ldrh.w r3, [r7, #290] @ 0x122
  9406. 80044ac: f8d7 2128 ldr.w r2, [r7, #296] @ 0x128
  9407. 80044b0: 429a cmp r2, r3
  9408. 80044b2: bf0c ite eq
  9409. 80044b4: 2301 moveq r3, #1
  9410. 80044b6: 2300 movne r3, #0
  9411. 80044b8: b2db uxtb r3, r3
  9412. 80044ba: f8c7 3138 str.w r3, [r7, #312] @ 0x138
  9413. if (crcPass) {
  9414. 80044be: f8d7 3138 ldr.w r3, [r7, #312] @ 0x138
  9415. 80044c2: 2b00 cmp r3, #0
  9416. 80044c4: d00b beq.n 80044de <UartRxTask+0x37a>
  9417. #if UART_TASK_LOGS
  9418. printf ("Uart%d: Frame CRC PASS\n", uartTaskData->uartNumber);
  9419. 80044c6: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9420. 80044ca: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  9421. 80044ce: 4619 mov r1, r3
  9422. 80044d0: 4832 ldr r0, [pc, #200] @ (800459c <UartRxTask+0x438>)
  9423. 80044d2: f025 fa7b bl 80299cc <iprintf>
  9424. #endif
  9425. receverState = srExecuteCmd;
  9426. 80044d6: 2303 movs r3, #3
  9427. 80044d8: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9428. } else {
  9429. receverState = srFail;
  9430. }
  9431. break;
  9432. 80044dc: e10b b.n 80046f6 <UartRxTask+0x592>
  9433. receverState = srFail;
  9434. 80044de: 2304 movs r3, #4
  9435. 80044e0: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9436. break;
  9437. 80044e4: e107 b.n 80046f6 <UartRxTask+0x592>
  9438. case srExecuteCmd:
  9439. if ((uartTaskData->processDataCb != NULL) || (uartTaskData->processRxDataMsgBuffer != NULL)) {
  9440. 80044e6: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9441. 80044ea: 6a9b ldr r3, [r3, #40] @ 0x28
  9442. 80044ec: 2b00 cmp r3, #0
  9443. 80044ee: d104 bne.n 80044fa <UartRxTask+0x396>
  9444. 80044f0: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9445. 80044f4: 6a5b ldr r3, [r3, #36] @ 0x24
  9446. 80044f6: 2b00 cmp r3, #0
  9447. 80044f8: d01e beq.n 8004538 <UartRxTask+0x3d4>
  9448. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  9449. 80044fa: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9450. 80044fe: 6a1b ldr r3, [r3, #32]
  9451. 8004500: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  9452. 8004504: 4618 mov r0, r3
  9453. 8004506: f00c fadd bl 8010ac4 <osMutexAcquire>
  9454. memcpy (spFrameData.dataBuffer, &(uartTaskData->frameData[FRAME_HEADER_LENGTH]), spFrameData.frameHeader.frameDataLength);
  9455. 800450a: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9456. 800450e: 691b ldr r3, [r3, #16]
  9457. 8004510: f103 0108 add.w r1, r3, #8
  9458. 8004514: f507 73a0 add.w r3, r7, #320 @ 0x140
  9459. 8004518: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9460. 800451c: 889b ldrh r3, [r3, #4]
  9461. 800451e: 461a mov r2, r3
  9462. 8004520: f107 0310 add.w r3, r7, #16
  9463. 8004524: 330c adds r3, #12
  9464. 8004526: 4618 mov r0, r3
  9465. 8004528: f025 fcd9 bl 8029ede <memcpy>
  9466. osMutexRelease (uartTaskData->rxDataBufferMutex);
  9467. 800452c: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9468. 8004530: 6a1b ldr r3, [r3, #32]
  9469. 8004532: 4618 mov r0, r3
  9470. 8004534: f00c fb11 bl 8010b5a <osMutexRelease>
  9471. }
  9472. if (uartTaskData->processRxDataMsgBuffer != NULL) {
  9473. 8004538: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9474. 800453c: 6a5b ldr r3, [r3, #36] @ 0x24
  9475. 800453e: 2b00 cmp r3, #0
  9476. 8004540: d015 beq.n 800456e <UartRxTask+0x40a>
  9477. if(xMessageBufferSend (uartTaskData->processRxDataMsgBuffer, &spFrameData, sizeof (SerialProtocolFrameHeader) + spFrameData.frameHeader.frameDataLength, pdMS_TO_TICKS (200)) == pdFALSE)
  9478. 8004542: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9479. 8004546: 6a58 ldr r0, [r3, #36] @ 0x24
  9480. 8004548: f507 73a0 add.w r3, r7, #320 @ 0x140
  9481. 800454c: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9482. 8004550: 889b ldrh r3, [r3, #4]
  9483. 8004552: f103 020c add.w r2, r3, #12
  9484. 8004556: f107 0110 add.w r1, r7, #16
  9485. 800455a: 23c8 movs r3, #200 @ 0xc8
  9486. 800455c: f00e f890 bl 8012680 <xStreamBufferSend>
  9487. 8004560: 4603 mov r3, r0
  9488. 8004562: 2b00 cmp r3, #0
  9489. 8004564: d103 bne.n 800456e <UartRxTask+0x40a>
  9490. {
  9491. receverState = srFail;
  9492. 8004566: 2304 movs r3, #4
  9493. 8004568: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9494. break;
  9495. 800456c: e0c3 b.n 80046f6 <UartRxTask+0x592>
  9496. }
  9497. }
  9498. if (uartTaskData->processDataCb != NULL) {
  9499. 800456e: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9500. 8004572: 6a9b ldr r3, [r3, #40] @ 0x28
  9501. 8004574: 2b00 cmp r3, #0
  9502. 8004576: d008 beq.n 800458a <UartRxTask+0x426>
  9503. uartTaskData->processDataCb (uartTaskData, &spFrameData);
  9504. 8004578: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9505. 800457c: 6a9b ldr r3, [r3, #40] @ 0x28
  9506. 800457e: f107 0210 add.w r2, r7, #16
  9507. 8004582: 4611 mov r1, r2
  9508. 8004584: f8d7 012c ldr.w r0, [r7, #300] @ 0x12c
  9509. 8004588: 4798 blx r3
  9510. }
  9511. receverState = srFinish;
  9512. 800458a: 2305 movs r3, #5
  9513. 800458c: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9514. break;
  9515. 8004590: e0b1 b.n 80046f6 <UartRxTask+0x592>
  9516. 8004592: bf00 nop
  9517. 8004594: 0802c8e4 .word 0x0802c8e4
  9518. 8004598: 24000248 .word 0x24000248
  9519. 800459c: 0802c904 .word 0x0802c904
  9520. case srFail:
  9521. dataToSend = 0;
  9522. 80045a0: 2300 movs r3, #0
  9523. 80045a2: f8a7 313c strh.w r3, [r7, #316] @ 0x13c
  9524. if ((frameTimeout == pdTRUE) && (frameBytesCount > 2)) {
  9525. 80045a6: f8d7 311c ldr.w r3, [r7, #284] @ 0x11c
  9526. 80045aa: 2b01 cmp r3, #1
  9527. 80045ac: d124 bne.n 80045f8 <UartRxTask+0x494>
  9528. 80045ae: f8b7 3124 ldrh.w r3, [r7, #292] @ 0x124
  9529. 80045b2: 2b02 cmp r3, #2
  9530. 80045b4: d920 bls.n 80045f8 <UartRxTask+0x494>
  9531. dataToSend = PrepareRespFrame (uartTaskData->uartTxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spTimeout, NULL, 0);
  9532. 80045b6: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9533. 80045ba: 6898 ldr r0, [r3, #8]
  9534. 80045bc: f507 73a0 add.w r3, r7, #320 @ 0x140
  9535. 80045c0: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9536. 80045c4: 8819 ldrh r1, [r3, #0]
  9537. 80045c6: f507 73a0 add.w r3, r7, #320 @ 0x140
  9538. 80045ca: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9539. 80045ce: 789a ldrb r2, [r3, #2]
  9540. 80045d0: 2300 movs r3, #0
  9541. 80045d2: 9301 str r3, [sp, #4]
  9542. 80045d4: 2300 movs r3, #0
  9543. 80045d6: 9300 str r3, [sp, #0]
  9544. 80045d8: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  9545. 80045dc: f7fe fdf0 bl 80031c0 <PrepareRespFrame>
  9546. 80045e0: 4603 mov r3, r0
  9547. 80045e2: f8a7 313c strh.w r3, [r7, #316] @ 0x13c
  9548. #if UART_TASK_LOGS
  9549. printf ("Uart%d: RX data receiver timeout!\n", uartTaskData->uartNumber);
  9550. 80045e6: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9551. 80045ea: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  9552. 80045ee: 4619 mov r1, r3
  9553. 80045f0: 4844 ldr r0, [pc, #272] @ (8004704 <UartRxTask+0x5a0>)
  9554. 80045f2: f025 f9eb bl 80299cc <iprintf>
  9555. 80045f6: e03c b.n 8004672 <UartRxTask+0x50e>
  9556. #endif
  9557. } else if (!crcPass) {
  9558. 80045f8: f8d7 3138 ldr.w r3, [r7, #312] @ 0x138
  9559. 80045fc: 2b00 cmp r3, #0
  9560. 80045fe: d120 bne.n 8004642 <UartRxTask+0x4de>
  9561. dataToSend = PrepareRespFrame (uartTaskData->uartTxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spCrcFail, NULL, 0);
  9562. 8004600: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9563. 8004604: 6898 ldr r0, [r3, #8]
  9564. 8004606: f507 73a0 add.w r3, r7, #320 @ 0x140
  9565. 800460a: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9566. 800460e: 8819 ldrh r1, [r3, #0]
  9567. 8004610: f507 73a0 add.w r3, r7, #320 @ 0x140
  9568. 8004614: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9569. 8004618: 789a ldrb r2, [r3, #2]
  9570. 800461a: 2300 movs r3, #0
  9571. 800461c: 9301 str r3, [sp, #4]
  9572. 800461e: 2300 movs r3, #0
  9573. 8004620: 9300 str r3, [sp, #0]
  9574. 8004622: f06f 0301 mvn.w r3, #1
  9575. 8004626: f7fe fdcb bl 80031c0 <PrepareRespFrame>
  9576. 800462a: 4603 mov r3, r0
  9577. 800462c: f8a7 313c strh.w r3, [r7, #316] @ 0x13c
  9578. #if UART_TASK_LOGS
  9579. printf ("Uart%d: Frame CRC FAIL\n", uartTaskData->uartNumber);
  9580. 8004630: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9581. 8004634: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  9582. 8004638: 4619 mov r1, r3
  9583. 800463a: 4833 ldr r0, [pc, #204] @ (8004708 <UartRxTask+0x5a4>)
  9584. 800463c: f025 f9c6 bl 80299cc <iprintf>
  9585. 8004640: e017 b.n 8004672 <UartRxTask+0x50e>
  9586. #endif
  9587. }
  9588. else
  9589. {
  9590. dataToSend = PrepareRespFrame (uartTaskData->uartTxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spInternalError, NULL, 0);
  9591. 8004642: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9592. 8004646: 6898 ldr r0, [r3, #8]
  9593. 8004648: f507 73a0 add.w r3, r7, #320 @ 0x140
  9594. 800464c: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9595. 8004650: 8819 ldrh r1, [r3, #0]
  9596. 8004652: f507 73a0 add.w r3, r7, #320 @ 0x140
  9597. 8004656: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9598. 800465a: 789a ldrb r2, [r3, #2]
  9599. 800465c: 2300 movs r3, #0
  9600. 800465e: 9301 str r3, [sp, #4]
  9601. 8004660: 2300 movs r3, #0
  9602. 8004662: 9300 str r3, [sp, #0]
  9603. 8004664: f06f 0302 mvn.w r3, #2
  9604. 8004668: f7fe fdaa bl 80031c0 <PrepareRespFrame>
  9605. 800466c: 4603 mov r3, r0
  9606. 800466e: f8a7 313c strh.w r3, [r7, #316] @ 0x13c
  9607. }
  9608. if (dataToSend > 0) {
  9609. 8004672: f8b7 313c ldrh.w r3, [r7, #316] @ 0x13c
  9610. 8004676: 2b00 cmp r3, #0
  9611. 8004678: d00a beq.n 8004690 <UartRxTask+0x52c>
  9612. HAL_UART_Transmit_IT (uartTaskData->huart, uartTaskData->uartTxBuffer, dataToSend);
  9613. 800467a: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9614. 800467e: 6b18 ldr r0, [r3, #48] @ 0x30
  9615. 8004680: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9616. 8004684: 689b ldr r3, [r3, #8]
  9617. 8004686: f8b7 213c ldrh.w r2, [r7, #316] @ 0x13c
  9618. 800468a: 4619 mov r1, r3
  9619. 800468c: f008 fc12 bl 800ceb4 <HAL_UART_Transmit_IT>
  9620. }
  9621. #if UART_TASK_LOGS
  9622. printf ("Uart%d: TX bytes sent: %d\n", dataToSend, uartTaskData->uartNumber);
  9623. 8004690: f8b7 113c ldrh.w r1, [r7, #316] @ 0x13c
  9624. 8004694: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9625. 8004698: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  9626. 800469c: 461a mov r2, r3
  9627. 800469e: 481b ldr r0, [pc, #108] @ (800470c <UartRxTask+0x5a8>)
  9628. 80046a0: f025 f994 bl 80299cc <iprintf>
  9629. #endif
  9630. receverState = srFinish;
  9631. 80046a4: 2305 movs r3, #5
  9632. 80046a6: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9633. break;
  9634. 80046aa: e024 b.n 80046f6 <UartRxTask+0x592>
  9635. case srFinish:
  9636. default:
  9637. osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
  9638. 80046ac: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9639. 80046b0: 6a1b ldr r3, [r3, #32]
  9640. 80046b2: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  9641. 80046b6: 4618 mov r0, r3
  9642. 80046b8: f00c fa04 bl 8010ac4 <osMutexAcquire>
  9643. uartTaskData->frameBytesCount = 0;
  9644. 80046bc: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9645. 80046c0: 2200 movs r2, #0
  9646. 80046c2: 82da strh r2, [r3, #22]
  9647. osMutexRelease (uartTaskData->rxDataBufferMutex);
  9648. 80046c4: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  9649. 80046c8: 6a1b ldr r3, [r3, #32]
  9650. 80046ca: 4618 mov r0, r3
  9651. 80046cc: f00c fa45 bl 8010b5a <osMutexRelease>
  9652. spFrameData.frameHeader.frameCommand = spUnknown;
  9653. 80046d0: f507 73a0 add.w r3, r7, #320 @ 0x140
  9654. 80046d4: f5a3 7398 sub.w r3, r3, #304 @ 0x130
  9655. 80046d8: 2208 movs r2, #8
  9656. 80046da: 709a strb r2, [r3, #2]
  9657. frameTotalLength = 0;
  9658. 80046dc: 2300 movs r3, #0
  9659. 80046de: f8a7 313e strh.w r3, [r7, #318] @ 0x13e
  9660. outputDataBufferPos = 0;
  9661. 80046e2: 4b0b ldr r3, [pc, #44] @ (8004710 <UartRxTask+0x5ac>)
  9662. 80046e4: 2200 movs r2, #0
  9663. 80046e6: 801a strh r2, [r3, #0]
  9664. receverState = srWaitForHeader;
  9665. 80046e8: 2300 movs r3, #0
  9666. 80046ea: f887 3133 strb.w r3, [r7, #307] @ 0x133
  9667. proceed = pdFALSE;
  9668. 80046ee: 2300 movs r3, #0
  9669. 80046f0: f8c7 3134 str.w r3, [r7, #308] @ 0x134
  9670. break;
  9671. 80046f4: bf00 nop
  9672. while (proceed) {
  9673. 80046f6: f8d7 3134 ldr.w r3, [r7, #308] @ 0x134
  9674. 80046fa: 2b00 cmp r3, #0
  9675. 80046fc: f47f ade0 bne.w 80042c0 <UartRxTask+0x15c>
  9676. frameTimeout = !(xTaskNotifyWait (0, 0, &bytesRec, pdMS_TO_TICKS (FRAME_TIMEOUT_MS)));
  9677. 8004700: e581 b.n 8004206 <UartRxTask+0xa2>
  9678. 8004702: bf00 nop
  9679. 8004704: 0802c91c .word 0x0802c91c
  9680. 8004708: 0802c940 .word 0x0802c940
  9681. 800470c: 0802c958 .word 0x0802c958
  9682. 8004710: 24001fc4 .word 0x24001fc4
  9683. 08004714 <ReadMeasSetFromBuffer>:
  9684. }
  9685. }
  9686. }
  9687. void ReadMeasSetFromBuffer(uint8_t* buff, uint16_t* buffPos, float* dataSet)
  9688. {
  9689. 8004714: b580 push {r7, lr}
  9690. 8004716: b086 sub sp, #24
  9691. 8004718: af00 add r7, sp, #0
  9692. 800471a: 60f8 str r0, [r7, #12]
  9693. 800471c: 60b9 str r1, [r7, #8]
  9694. 800471e: 607a str r2, [r7, #4]
  9695. for(uint8_t i = 0; i < 3; i++)
  9696. 8004720: 2300 movs r3, #0
  9697. 8004722: 75fb strb r3, [r7, #23]
  9698. 8004724: e00b b.n 800473e <ReadMeasSetFromBuffer+0x2a>
  9699. {
  9700. ReadFloatFromBuffer(buff, buffPos, &dataSet[i]);
  9701. 8004726: 7dfb ldrb r3, [r7, #23]
  9702. 8004728: 009b lsls r3, r3, #2
  9703. 800472a: 687a ldr r2, [r7, #4]
  9704. 800472c: 4413 add r3, r2
  9705. 800472e: 461a mov r2, r3
  9706. 8004730: 68b9 ldr r1, [r7, #8]
  9707. 8004732: 68f8 ldr r0, [r7, #12]
  9708. 8004734: f7fe fc55 bl 8002fe2 <ReadFloatFromBuffer>
  9709. for(uint8_t i = 0; i < 3; i++)
  9710. 8004738: 7dfb ldrb r3, [r7, #23]
  9711. 800473a: 3301 adds r3, #1
  9712. 800473c: 75fb strb r3, [r7, #23]
  9713. 800473e: 7dfb ldrb r3, [r7, #23]
  9714. 8004740: 2b02 cmp r3, #2
  9715. 8004742: d9f0 bls.n 8004726 <ReadMeasSetFromBuffer+0x12>
  9716. }
  9717. }
  9718. 8004744: bf00 nop
  9719. 8004746: bf00 nop
  9720. 8004748: 3718 adds r7, #24
  9721. 800474a: 46bd mov sp, r7
  9722. 800474c: bd80 pop {r7, pc}
  9723. ...
  9724. 08004750 <UartTxTask>:
  9725. void UartTxTask (void* argument) {
  9726. 8004750: b580 push {r7, lr}
  9727. 8004752: b0d4 sub sp, #336 @ 0x150
  9728. 8004754: af02 add r7, sp, #8
  9729. 8004756: f507 73a4 add.w r3, r7, #328 @ 0x148
  9730. 800475a: f5a3 73a2 sub.w r3, r3, #324 @ 0x144
  9731. 800475e: 6018 str r0, [r3, #0]
  9732. UartTaskData* const uartTaskData = (UartTaskData*)argument;
  9733. 8004760: f507 73a4 add.w r3, r7, #328 @ 0x148
  9734. 8004764: f5a3 73a2 sub.w r3, r3, #324 @ 0x144
  9735. 8004768: 681b ldr r3, [r3, #0]
  9736. 800476a: f8c7 3140 str.w r3, [r7, #320] @ 0x140
  9737. InterProcessData data = { 0 };
  9738. 800476e: f507 7390 add.w r3, r7, #288 @ 0x120
  9739. 8004772: 2200 movs r2, #0
  9740. 8004774: 601a str r2, [r3, #0]
  9741. 8004776: 605a str r2, [r3, #4]
  9742. 8004778: 609a str r2, [r3, #8]
  9743. SerialProtocolFrameData frameData = { 0 };
  9744. 800477a: f507 73a4 add.w r3, r7, #328 @ 0x148
  9745. 800477e: f5a3 739a sub.w r3, r3, #308 @ 0x134
  9746. 8004782: 4618 mov r0, r3
  9747. 8004784: f44f 7386 mov.w r3, #268 @ 0x10c
  9748. 8004788: 461a mov r2, r3
  9749. 800478a: 2100 movs r1, #0
  9750. 800478c: f025 fab0 bl 8029cf0 <memset>
  9751. size_t bytesInMsg;
  9752. uint16_t frameId = 0;
  9753. 8004790: 2300 movs r3, #0
  9754. 8004792: f8a7 313e strh.w r3, [r7, #318] @ 0x13e
  9755. uint32_t rndVal = 0;
  9756. 8004796: f507 73a4 add.w r3, r7, #328 @ 0x148
  9757. 800479a: f5a3 739c sub.w r3, r3, #312 @ 0x138
  9758. 800479e: 2200 movs r2, #0
  9759. 80047a0: 601a str r2, [r3, #0]
  9760. uint16_t bytesToSend = 0;
  9761. 80047a2: 2300 movs r3, #0
  9762. 80047a4: f8a7 313c strh.w r3, [r7, #316] @ 0x13c
  9763. SerialProtocolCommands frameCommand = spUnknown;
  9764. 80047a8: 2308 movs r3, #8
  9765. 80047aa: f887 313b strb.w r3, [r7, #315] @ 0x13b
  9766. uint16_t inputDataBufferPos = 0;
  9767. 80047ae: f507 73a4 add.w r3, r7, #328 @ 0x148
  9768. 80047b2: f5a3 739d sub.w r3, r3, #314 @ 0x13a
  9769. 80047b6: 2200 movs r2, #0
  9770. 80047b8: 801a strh r2, [r3, #0]
  9771. uint8_t boardNumber = 0;
  9772. 80047ba: 2300 movs r3, #0
  9773. 80047bc: f887 3147 strb.w r3, [r7, #327] @ 0x147
  9774. while (pdTRUE) {
  9775. if (uartTaskData->sendCmdToSlaveQueue != NULL) {
  9776. 80047c0: f8d7 3140 ldr.w r3, [r7, #320] @ 0x140
  9777. 80047c4: 6adb ldr r3, [r3, #44] @ 0x2c
  9778. 80047c6: 2b00 cmp r3, #0
  9779. 80047c8: f000 8224 beq.w 8004c14 <UartTxTask+0x4c4>
  9780. osMessageQueueGet (uartTaskData->sendCmdToSlaveQueue, &data, 0, osWaitForever);
  9781. 80047cc: f8d7 3140 ldr.w r3, [r7, #320] @ 0x140
  9782. 80047d0: 6ad8 ldr r0, [r3, #44] @ 0x2c
  9783. 80047d2: f507 7190 add.w r1, r7, #288 @ 0x120
  9784. 80047d6: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  9785. 80047da: 2200 movs r2, #0
  9786. 80047dc: f00c fc12 bl 8011004 <osMessageQueueGet>
  9787. HAL_RNG_GenerateRandomNumber (&hrng, &rndVal);
  9788. 80047e0: f107 0310 add.w r3, r7, #16
  9789. 80047e4: 4619 mov r1, r3
  9790. 80047e6: 48a1 ldr r0, [pc, #644] @ (8004a6c <UartTxTask+0x31c>)
  9791. 80047e8: f007 fff0 bl 800c7cc <HAL_RNG_GenerateRandomNumber>
  9792. frameId = (uint16_t)(rndVal & 0xFFFF);
  9793. 80047ec: f507 73a4 add.w r3, r7, #328 @ 0x148
  9794. 80047f0: f5a3 739c sub.w r3, r3, #312 @ 0x138
  9795. 80047f4: 681b ldr r3, [r3, #0]
  9796. 80047f6: f8a7 313e strh.w r3, [r7, #318] @ 0x13e
  9797. frameCommand = data.spCommand;
  9798. 80047fa: f897 3120 ldrb.w r3, [r7, #288] @ 0x120
  9799. 80047fe: f887 313b strb.w r3, [r7, #315] @ 0x13b
  9800. outputDataBufferPos = 0;
  9801. 8004802: 4b9b ldr r3, [pc, #620] @ (8004a70 <UartTxTask+0x320>)
  9802. 8004804: 2200 movs r2, #0
  9803. 8004806: 801a strh r2, [r3, #0]
  9804. memset (outputDataBuffer, 0x00, OUTPUT_DATA_BUFF_SIZE);
  9805. 8004808: 2280 movs r2, #128 @ 0x80
  9806. 800480a: 2100 movs r1, #0
  9807. 800480c: 4899 ldr r0, [pc, #612] @ (8004a74 <UartTxTask+0x324>)
  9808. 800480e: f025 fa6f bl 8029cf0 <memset>
  9809. switch (frameCommand) {
  9810. 8004812: f897 313b ldrb.w r3, [r7, #315] @ 0x13b
  9811. 8004816: 2b07 cmp r3, #7
  9812. 8004818: f200 8201 bhi.w 8004c1e <UartTxTask+0x4ce>
  9813. 800481c: a201 add r2, pc, #4 @ (adr r2, 8004824 <UartTxTask+0xd4>)
  9814. 800481e: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  9815. 8004822: bf00 nop
  9816. 8004824: 0800488d .word 0x0800488d
  9817. 8004828: 0800488d .word 0x0800488d
  9818. 800482c: 08004845 .word 0x08004845
  9819. 8004830: 08004845 .word 0x08004845
  9820. 8004834: 08004845 .word 0x08004845
  9821. 8004838: 0800487b .word 0x0800487b
  9822. 800483c: 0800487b .word 0x0800487b
  9823. 8004840: 08004869 .word 0x08004869
  9824. case spSetFanSpeed:
  9825. case spSetMotorXOn:
  9826. case spSetMotorYOn:
  9827. WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (float));
  9828. 8004844: f507 7390 add.w r3, r7, #288 @ 0x120
  9829. 8004848: 1d1a adds r2, r3, #4
  9830. 800484a: 2304 movs r3, #4
  9831. 800484c: 4988 ldr r1, [pc, #544] @ (8004a70 <UartTxTask+0x320>)
  9832. 800484e: 4889 ldr r0, [pc, #548] @ (8004a74 <UartTxTask+0x324>)
  9833. 8004850: f7fe fb96 bl 8002f80 <WriteDataToBuffer>
  9834. WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[1], sizeof (float));
  9835. 8004854: f507 7390 add.w r3, r7, #288 @ 0x120
  9836. 8004858: f103 0208 add.w r2, r3, #8
  9837. 800485c: 2304 movs r3, #4
  9838. 800485e: 4984 ldr r1, [pc, #528] @ (8004a70 <UartTxTask+0x320>)
  9839. 8004860: 4884 ldr r0, [pc, #528] @ (8004a74 <UartTxTask+0x324>)
  9840. 8004862: f7fe fb8d bl 8002f80 <WriteDataToBuffer>
  9841. break;
  9842. 8004866: e012 b.n 800488e <UartTxTask+0x13e>
  9843. case spSetDiodeOn: WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (float)); break;
  9844. 8004868: f507 7390 add.w r3, r7, #288 @ 0x120
  9845. 800486c: 1d1a adds r2, r3, #4
  9846. 800486e: 2304 movs r3, #4
  9847. 8004870: 497f ldr r1, [pc, #508] @ (8004a70 <UartTxTask+0x320>)
  9848. 8004872: 4880 ldr r0, [pc, #512] @ (8004a74 <UartTxTask+0x324>)
  9849. 8004874: f7fe fb84 bl 8002f80 <WriteDataToBuffer>
  9850. 8004878: e009 b.n 800488e <UartTxTask+0x13e>
  9851. case spSetmotorXMaxCurrent:
  9852. case spSetmotorYMaxCurrent: WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.flaotValues.value[0], sizeof (float)); break;
  9853. 800487a: f507 7390 add.w r3, r7, #288 @ 0x120
  9854. 800487e: 1d1a adds r2, r3, #4
  9855. 8004880: 2304 movs r3, #4
  9856. 8004882: 497b ldr r1, [pc, #492] @ (8004a70 <UartTxTask+0x320>)
  9857. 8004884: 487b ldr r0, [pc, #492] @ (8004a74 <UartTxTask+0x324>)
  9858. 8004886: f7fe fb7b bl 8002f80 <WriteDataToBuffer>
  9859. 800488a: e000 b.n 800488e <UartTxTask+0x13e>
  9860. case spGetElectricalMeasurments:
  9861. case spGetSensorMeasurments: break;
  9862. 800488c: bf00 nop
  9863. default: continue; break;
  9864. }
  9865. bytesToSend = PrepareReqFrame (uartTaskData->uartTxBuffer, frameId, frameCommand, outputDataBuffer, outputDataBufferPos);
  9866. 800488e: f8d7 3140 ldr.w r3, [r7, #320] @ 0x140
  9867. 8004892: 6898 ldr r0, [r3, #8]
  9868. 8004894: 4b76 ldr r3, [pc, #472] @ (8004a70 <UartTxTask+0x320>)
  9869. 8004896: 881b ldrh r3, [r3, #0]
  9870. 8004898: f897 213b ldrb.w r2, [r7, #315] @ 0x13b
  9871. 800489c: f8b7 113e ldrh.w r1, [r7, #318] @ 0x13e
  9872. 80048a0: 9300 str r3, [sp, #0]
  9873. 80048a2: 4b74 ldr r3, [pc, #464] @ (8004a74 <UartTxTask+0x324>)
  9874. 80048a4: f7fe fbf8 bl 8003098 <PrepareReqFrame>
  9875. 80048a8: 4603 mov r3, r0
  9876. 80048aa: f8a7 313c strh.w r3, [r7, #316] @ 0x13c
  9877. HAL_UART_Transmit_IT (uartTaskData->huart, uartTaskData->uartTxBuffer, bytesToSend);
  9878. 80048ae: f8d7 3140 ldr.w r3, [r7, #320] @ 0x140
  9879. 80048b2: 6b18 ldr r0, [r3, #48] @ 0x30
  9880. 80048b4: f8d7 3140 ldr.w r3, [r7, #320] @ 0x140
  9881. 80048b8: 689b ldr r3, [r3, #8]
  9882. 80048ba: f8b7 213c ldrh.w r2, [r7, #316] @ 0x13c
  9883. 80048be: 4619 mov r1, r3
  9884. 80048c0: f008 faf8 bl 800ceb4 <HAL_UART_Transmit_IT>
  9885. bytesInMsg = xMessageBufferReceive (uartTaskData->processRxDataMsgBuffer, &frameData, INPUT_DATA_BUFF_SIZE, pdMS_TO_TICKS (1000));
  9886. 80048c4: f8d7 3140 ldr.w r3, [r7, #320] @ 0x140
  9887. 80048c8: 6a58 ldr r0, [r3, #36] @ 0x24
  9888. 80048ca: f107 0114 add.w r1, r7, #20
  9889. 80048ce: f44f 737a mov.w r3, #1000 @ 0x3e8
  9890. 80048d2: f44f 7280 mov.w r2, #256 @ 0x100
  9891. 80048d6: f00d ffc9 bl 801286c <xStreamBufferReceive>
  9892. 80048da: f8c7 0134 str.w r0, [r7, #308] @ 0x134
  9893. for(boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++)
  9894. 80048de: 2300 movs r3, #0
  9895. 80048e0: f887 3147 strb.w r3, [r7, #327] @ 0x147
  9896. 80048e4: e00e b.n 8004904 <UartTxTask+0x1b4>
  9897. {
  9898. if(boardToUartNumberMap[boardNumber] == uartTaskData->uartNumber)
  9899. 80048e6: f897 3147 ldrb.w r3, [r7, #327] @ 0x147
  9900. 80048ea: 4a63 ldr r2, [pc, #396] @ (8004a78 <UartTxTask+0x328>)
  9901. 80048ec: 5cd2 ldrb r2, [r2, r3]
  9902. 80048ee: f8d7 3140 ldr.w r3, [r7, #320] @ 0x140
  9903. 80048f2: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  9904. 80048f6: 429a cmp r2, r3
  9905. 80048f8: d009 beq.n 800490e <UartTxTask+0x1be>
  9906. for(boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++)
  9907. 80048fa: f897 3147 ldrb.w r3, [r7, #327] @ 0x147
  9908. 80048fe: 3301 adds r3, #1
  9909. 8004900: f887 3147 strb.w r3, [r7, #327] @ 0x147
  9910. 8004904: f897 3147 ldrb.w r3, [r7, #327] @ 0x147
  9911. 8004908: 2b03 cmp r3, #3
  9912. 800490a: d9ec bls.n 80048e6 <UartTxTask+0x196>
  9913. 800490c: e000 b.n 8004910 <UartTxTask+0x1c0>
  9914. {
  9915. break;
  9916. 800490e: bf00 nop
  9917. }
  9918. }
  9919. if (bytesInMsg == 0) {
  9920. 8004910: f8d7 3134 ldr.w r3, [r7, #308] @ 0x134
  9921. 8004914: 2b00 cmp r3, #0
  9922. 8004916: d124 bne.n 8004962 <UartTxTask+0x212>
  9923. if (frameCommand == spGetElectricalMeasurments)
  9924. 8004918: f897 313b ldrb.w r3, [r7, #315] @ 0x13b
  9925. 800491c: 2b00 cmp r3, #0
  9926. 800491e: d114 bne.n 800494a <UartTxTask+0x1fa>
  9927. {
  9928. osMutexAcquire (resMeasurementsMutex, osWaitForever);
  9929. 8004920: 4b56 ldr r3, [pc, #344] @ (8004a7c <UartTxTask+0x32c>)
  9930. 8004922: 681b ldr r3, [r3, #0]
  9931. 8004924: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  9932. 8004928: 4618 mov r0, r3
  9933. 800492a: f00c f8cb bl 8010ac4 <osMutexAcquire>
  9934. slaveLastSeen[boardNumber]++;
  9935. 800492e: f897 3147 ldrb.w r3, [r7, #327] @ 0x147
  9936. 8004932: 4a53 ldr r2, [pc, #332] @ (8004a80 <UartTxTask+0x330>)
  9937. 8004934: f852 2023 ldr.w r2, [r2, r3, lsl #2]
  9938. 8004938: 3201 adds r2, #1
  9939. 800493a: 4951 ldr r1, [pc, #324] @ (8004a80 <UartTxTask+0x330>)
  9940. 800493c: f841 2023 str.w r2, [r1, r3, lsl #2]
  9941. osMutexRelease(resMeasurementsMutex);
  9942. 8004940: 4b4e ldr r3, [pc, #312] @ (8004a7c <UartTxTask+0x32c>)
  9943. 8004942: 681b ldr r3, [r3, #0]
  9944. 8004944: 4618 mov r0, r3
  9945. 8004946: f00c f908 bl 8010b5a <osMutexRelease>
  9946. }
  9947. #if UART_TASK_LOGS
  9948. printf ("Uart%d: Response timeout for frameId 0x%x\n", uartTaskData->uartNumber, frameId);
  9949. 800494a: f8d7 3140 ldr.w r3, [r7, #320] @ 0x140
  9950. 800494e: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  9951. 8004952: 4619 mov r1, r3
  9952. 8004954: f8b7 313e ldrh.w r3, [r7, #318] @ 0x13e
  9953. 8004958: 461a mov r2, r3
  9954. 800495a: 484a ldr r0, [pc, #296] @ (8004a84 <UartTxTask+0x334>)
  9955. 800495c: f025 f836 bl 80299cc <iprintf>
  9956. 8004960: e72e b.n 80047c0 <UartTxTask+0x70>
  9957. #endif
  9958. } else {
  9959. if ((frameId == frameData.frameHeader.frameId) && (frameData.frameHeader.respStatus == spOK)) {
  9960. 8004962: f507 73a4 add.w r3, r7, #328 @ 0x148
  9961. 8004966: f5a3 739a sub.w r3, r3, #308 @ 0x134
  9962. 800496a: 881b ldrh r3, [r3, #0]
  9963. 800496c: f8b7 213e ldrh.w r2, [r7, #318] @ 0x13e
  9964. 8004970: 429a cmp r2, r3
  9965. 8004972: f47f af25 bne.w 80047c0 <UartTxTask+0x70>
  9966. 8004976: f507 73a4 add.w r3, r7, #328 @ 0x148
  9967. 800497a: f5a3 739a sub.w r3, r3, #308 @ 0x134
  9968. 800497e: f993 3003 ldrsb.w r3, [r3, #3]
  9969. 8004982: 2b00 cmp r3, #0
  9970. 8004984: f47f af1c bne.w 80047c0 <UartTxTask+0x70>
  9971. #if UART_TASK_LOGS
  9972. printf ("Uart%d: Response for frameId 0x%x OK\n", uartTaskData->uartNumber, frameId);
  9973. 8004988: f8d7 3140 ldr.w r3, [r7, #320] @ 0x140
  9974. 800498c: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  9975. 8004990: 4619 mov r1, r3
  9976. 8004992: f8b7 313e ldrh.w r3, [r7, #318] @ 0x13e
  9977. 8004996: 461a mov r2, r3
  9978. 8004998: 483b ldr r0, [pc, #236] @ (8004a88 <UartTxTask+0x338>)
  9979. 800499a: f025 f817 bl 80299cc <iprintf>
  9980. #endif
  9981. slaveLastSeen[boardNumber] = 0;
  9982. 800499e: f897 3147 ldrb.w r3, [r7, #327] @ 0x147
  9983. 80049a2: 4a37 ldr r2, [pc, #220] @ (8004a80 <UartTxTask+0x330>)
  9984. 80049a4: 2100 movs r1, #0
  9985. 80049a6: f842 1023 str.w r1, [r2, r3, lsl #2]
  9986. switch(frameData.frameHeader.frameCommand)
  9987. 80049aa: f507 73a4 add.w r3, r7, #328 @ 0x148
  9988. 80049ae: f5a3 739a sub.w r3, r3, #308 @ 0x134
  9989. 80049b2: 789b ldrb r3, [r3, #2]
  9990. 80049b4: 2b00 cmp r3, #0
  9991. 80049b6: d002 beq.n 80049be <UartTxTask+0x26e>
  9992. 80049b8: 2b01 cmp r3, #1
  9993. 80049ba: d069 beq.n 8004a90 <UartTxTask+0x340>
  9994. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitSwitchCenter);
  9995. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->powerSupplyFailMask);
  9996. osMutexRelease(sensorsInfoMutex);
  9997. break;
  9998. default:
  9999. break;
  10000. 80049bc: e130 b.n 8004c20 <UartTxTask+0x4d0>
  10001. osMutexAcquire (resMeasurementsMutex, osWaitForever);
  10002. 80049be: 4b2f ldr r3, [pc, #188] @ (8004a7c <UartTxTask+0x32c>)
  10003. 80049c0: 681b ldr r3, [r3, #0]
  10004. 80049c2: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  10005. 80049c6: 4618 mov r0, r3
  10006. 80049c8: f00c f87c bl 8010ac4 <osMutexAcquire>
  10007. RESMeasurements *resMeas = &resMeasurements[boardNumber];
  10008. 80049cc: f897 2147 ldrb.w r2, [r7, #327] @ 0x147
  10009. 80049d0: 4613 mov r3, r2
  10010. 80049d2: 011b lsls r3, r3, #4
  10011. 80049d4: 1a9b subs r3, r3, r2
  10012. 80049d6: 009b lsls r3, r3, #2
  10013. 80049d8: 4a2c ldr r2, [pc, #176] @ (8004a8c <UartTxTask+0x33c>)
  10014. 80049da: 4413 add r3, r2
  10015. 80049dc: f8c7 312c str.w r3, [r7, #300] @ 0x12c
  10016. inputDataBufferPos = 0;
  10017. 80049e0: f507 73a4 add.w r3, r7, #328 @ 0x148
  10018. 80049e4: f5a3 739d sub.w r3, r3, #314 @ 0x13a
  10019. 80049e8: 2200 movs r2, #0
  10020. 80049ea: 801a strh r2, [r3, #0]
  10021. ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->voltageRMS);
  10022. 80049ec: f8d7 212c ldr.w r2, [r7, #300] @ 0x12c
  10023. 80049f0: f107 010e add.w r1, r7, #14
  10024. 80049f4: f107 0314 add.w r3, r7, #20
  10025. 80049f8: 330c adds r3, #12
  10026. 80049fa: 4618 mov r0, r3
  10027. 80049fc: f7ff fe8a bl 8004714 <ReadMeasSetFromBuffer>
  10028. ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->voltagePeak);
  10029. 8004a00: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  10030. 8004a04: f103 020c add.w r2, r3, #12
  10031. 8004a08: f107 010e add.w r1, r7, #14
  10032. 8004a0c: f107 0314 add.w r3, r7, #20
  10033. 8004a10: 330c adds r3, #12
  10034. 8004a12: 4618 mov r0, r3
  10035. 8004a14: f7ff fe7e bl 8004714 <ReadMeasSetFromBuffer>
  10036. ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->currentRMS);
  10037. 8004a18: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  10038. 8004a1c: f103 0218 add.w r2, r3, #24
  10039. 8004a20: f107 010e add.w r1, r7, #14
  10040. 8004a24: f107 0314 add.w r3, r7, #20
  10041. 8004a28: 330c adds r3, #12
  10042. 8004a2a: 4618 mov r0, r3
  10043. 8004a2c: f7ff fe72 bl 8004714 <ReadMeasSetFromBuffer>
  10044. ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->currentPeak);
  10045. 8004a30: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  10046. 8004a34: f103 0224 add.w r2, r3, #36 @ 0x24
  10047. 8004a38: f107 010e add.w r1, r7, #14
  10048. 8004a3c: f107 0314 add.w r3, r7, #20
  10049. 8004a40: 330c adds r3, #12
  10050. 8004a42: 4618 mov r0, r3
  10051. 8004a44: f7ff fe66 bl 8004714 <ReadMeasSetFromBuffer>
  10052. ReadMeasSetFromBuffer(frameData.dataBuffer, &inputDataBufferPos, resMeas->power);
  10053. 8004a48: f8d7 312c ldr.w r3, [r7, #300] @ 0x12c
  10054. 8004a4c: f103 0230 add.w r2, r3, #48 @ 0x30
  10055. 8004a50: f107 010e add.w r1, r7, #14
  10056. 8004a54: f107 0314 add.w r3, r7, #20
  10057. 8004a58: 330c adds r3, #12
  10058. 8004a5a: 4618 mov r0, r3
  10059. 8004a5c: f7ff fe5a bl 8004714 <ReadMeasSetFromBuffer>
  10060. osMutexRelease(resMeasurementsMutex);
  10061. 8004a60: 4b06 ldr r3, [pc, #24] @ (8004a7c <UartTxTask+0x32c>)
  10062. 8004a62: 681b ldr r3, [r3, #0]
  10063. 8004a64: 4618 mov r0, r3
  10064. 8004a66: f00c f878 bl 8010b5a <osMutexRelease>
  10065. break;
  10066. 8004a6a: e0d9 b.n 8004c20 <UartTxTask+0x4d0>
  10067. 8004a6c: 2400026c .word 0x2400026c
  10068. 8004a70: 24001fc4 .word 0x24001fc4
  10069. 8004a74: 24001f44 .word 0x24001f44
  10070. 8004a78: 24000014 .word 0x24000014
  10071. 8004a7c: 24002168 .word 0x24002168
  10072. 8004a80: 24002158 .word 0x24002158
  10073. 8004a84: 0802c974 .word 0x0802c974
  10074. 8004a88: 0802c9a0 .word 0x0802c9a0
  10075. 8004a8c: 24001fc8 .word 0x24001fc8
  10076. osMutexAcquire (sensorsInfoMutex, osWaitForever);
  10077. 8004a90: 4b64 ldr r3, [pc, #400] @ (8004c24 <UartTxTask+0x4d4>)
  10078. 8004a92: 681b ldr r3, [r3, #0]
  10079. 8004a94: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  10080. 8004a98: 4618 mov r0, r3
  10081. 8004a9a: f00c f813 bl 8010ac4 <osMutexAcquire>
  10082. inputDataBufferPos = 0;
  10083. 8004a9e: f507 73a4 add.w r3, r7, #328 @ 0x148
  10084. 8004aa2: f5a3 739d sub.w r3, r3, #314 @ 0x13a
  10085. 8004aa6: 2200 movs r2, #0
  10086. 8004aa8: 801a strh r2, [r3, #0]
  10087. SesnorsInfo* sensors = &sensorsInfo[boardNumber];
  10088. 8004aaa: f897 2147 ldrb.w r2, [r7, #327] @ 0x147
  10089. 8004aae: 4613 mov r3, r2
  10090. 8004ab0: 009b lsls r3, r3, #2
  10091. 8004ab2: 4413 add r3, r2
  10092. 8004ab4: 00db lsls r3, r3, #3
  10093. 8004ab6: 4a5c ldr r2, [pc, #368] @ (8004c28 <UartTxTask+0x4d8>)
  10094. 8004ab8: 4413 add r3, r2
  10095. 8004aba: f8c7 3130 str.w r3, [r7, #304] @ 0x130
  10096. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->pvTemperature[0]);
  10097. 8004abe: f8d7 2130 ldr.w r2, [r7, #304] @ 0x130
  10098. 8004ac2: f107 010e add.w r1, r7, #14
  10099. 8004ac6: f107 0314 add.w r3, r7, #20
  10100. 8004aca: 330c adds r3, #12
  10101. 8004acc: 4618 mov r0, r3
  10102. 8004ace: f7fe fa88 bl 8002fe2 <ReadFloatFromBuffer>
  10103. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->pvTemperature[1]);
  10104. 8004ad2: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10105. 8004ad6: 1d1a adds r2, r3, #4
  10106. 8004ad8: f107 010e add.w r1, r7, #14
  10107. 8004adc: f107 0314 add.w r3, r7, #20
  10108. 8004ae0: 330c adds r3, #12
  10109. 8004ae2: 4618 mov r0, r3
  10110. 8004ae4: f7fe fa7d bl 8002fe2 <ReadFloatFromBuffer>
  10111. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->fanVoltage);
  10112. 8004ae8: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10113. 8004aec: f103 0208 add.w r2, r3, #8
  10114. 8004af0: f107 010e add.w r1, r7, #14
  10115. 8004af4: f107 0314 add.w r3, r7, #20
  10116. 8004af8: 330c adds r3, #12
  10117. 8004afa: 4618 mov r0, r3
  10118. 8004afc: f7fe fa71 bl 8002fe2 <ReadFloatFromBuffer>
  10119. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->pvEncoder);
  10120. 8004b00: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10121. 8004b04: f103 020c add.w r2, r3, #12
  10122. 8004b08: f107 010e add.w r1, r7, #14
  10123. 8004b0c: f107 0314 add.w r3, r7, #20
  10124. 8004b10: 330c adds r3, #12
  10125. 8004b12: 4618 mov r0, r3
  10126. 8004b14: f7fe fa65 bl 8002fe2 <ReadFloatFromBuffer>
  10127. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorXStatus);
  10128. 8004b18: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10129. 8004b1c: f103 0210 add.w r2, r3, #16
  10130. 8004b20: f107 010e add.w r1, r7, #14
  10131. 8004b24: f107 0314 add.w r3, r7, #20
  10132. 8004b28: 330c adds r3, #12
  10133. 8004b2a: 4618 mov r0, r3
  10134. 8004b2c: f7fe fa8e bl 800304c <ReadByteFromBufer>
  10135. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorYStatus);
  10136. 8004b30: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10137. 8004b34: f103 0211 add.w r2, r3, #17
  10138. 8004b38: f107 010e add.w r1, r7, #14
  10139. 8004b3c: f107 0314 add.w r3, r7, #20
  10140. 8004b40: 330c adds r3, #12
  10141. 8004b42: 4618 mov r0, r3
  10142. 8004b44: f7fe fa82 bl 800304c <ReadByteFromBufer>
  10143. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorXAveCurrent);
  10144. 8004b48: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10145. 8004b4c: f103 0214 add.w r2, r3, #20
  10146. 8004b50: f107 010e add.w r1, r7, #14
  10147. 8004b54: f107 0314 add.w r3, r7, #20
  10148. 8004b58: 330c adds r3, #12
  10149. 8004b5a: 4618 mov r0, r3
  10150. 8004b5c: f7fe fa41 bl 8002fe2 <ReadFloatFromBuffer>
  10151. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorYAveCurrent);
  10152. 8004b60: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10153. 8004b64: f103 0218 add.w r2, r3, #24
  10154. 8004b68: f107 010e add.w r1, r7, #14
  10155. 8004b6c: f107 0314 add.w r3, r7, #20
  10156. 8004b70: 330c adds r3, #12
  10157. 8004b72: 4618 mov r0, r3
  10158. 8004b74: f7fe fa35 bl 8002fe2 <ReadFloatFromBuffer>
  10159. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorXPeakCurrent);
  10160. 8004b78: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10161. 8004b7c: f103 021c add.w r2, r3, #28
  10162. 8004b80: f107 010e add.w r1, r7, #14
  10163. 8004b84: f107 0314 add.w r3, r7, #20
  10164. 8004b88: 330c adds r3, #12
  10165. 8004b8a: 4618 mov r0, r3
  10166. 8004b8c: f7fe fa29 bl 8002fe2 <ReadFloatFromBuffer>
  10167. ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorYPeakCurrent);
  10168. 8004b90: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10169. 8004b94: f103 0220 add.w r2, r3, #32
  10170. 8004b98: f107 010e add.w r1, r7, #14
  10171. 8004b9c: f107 0314 add.w r3, r7, #20
  10172. 8004ba0: 330c adds r3, #12
  10173. 8004ba2: 4618 mov r0, r3
  10174. 8004ba4: f7fe fa1d bl 8002fe2 <ReadFloatFromBuffer>
  10175. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitSwitchUp);
  10176. 8004ba8: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10177. 8004bac: f103 0224 add.w r2, r3, #36 @ 0x24
  10178. 8004bb0: f107 010e add.w r1, r7, #14
  10179. 8004bb4: f107 0314 add.w r3, r7, #20
  10180. 8004bb8: 330c adds r3, #12
  10181. 8004bba: 4618 mov r0, r3
  10182. 8004bbc: f7fe fa46 bl 800304c <ReadByteFromBufer>
  10183. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitSwitchDown);
  10184. 8004bc0: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10185. 8004bc4: f103 0225 add.w r2, r3, #37 @ 0x25
  10186. 8004bc8: f107 010e add.w r1, r7, #14
  10187. 8004bcc: f107 0314 add.w r3, r7, #20
  10188. 8004bd0: 330c adds r3, #12
  10189. 8004bd2: 4618 mov r0, r3
  10190. 8004bd4: f7fe fa3a bl 800304c <ReadByteFromBufer>
  10191. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitSwitchCenter);
  10192. 8004bd8: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10193. 8004bdc: f103 0226 add.w r2, r3, #38 @ 0x26
  10194. 8004be0: f107 010e add.w r1, r7, #14
  10195. 8004be4: f107 0314 add.w r3, r7, #20
  10196. 8004be8: 330c adds r3, #12
  10197. 8004bea: 4618 mov r0, r3
  10198. 8004bec: f7fe fa2e bl 800304c <ReadByteFromBufer>
  10199. ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->powerSupplyFailMask);
  10200. 8004bf0: f8d7 3130 ldr.w r3, [r7, #304] @ 0x130
  10201. 8004bf4: f103 0227 add.w r2, r3, #39 @ 0x27
  10202. 8004bf8: f107 010e add.w r1, r7, #14
  10203. 8004bfc: f107 0314 add.w r3, r7, #20
  10204. 8004c00: 330c adds r3, #12
  10205. 8004c02: 4618 mov r0, r3
  10206. 8004c04: f7fe fa22 bl 800304c <ReadByteFromBufer>
  10207. osMutexRelease(sensorsInfoMutex);
  10208. 8004c08: 4b06 ldr r3, [pc, #24] @ (8004c24 <UartTxTask+0x4d4>)
  10209. 8004c0a: 681b ldr r3, [r3, #0]
  10210. 8004c0c: 4618 mov r0, r3
  10211. 8004c0e: f00b ffa4 bl 8010b5a <osMutexRelease>
  10212. break;
  10213. 8004c12: e005 b.n 8004c20 <UartTxTask+0x4d0>
  10214. }
  10215. }
  10216. }
  10217. } else {
  10218. osDelay (pdMS_TO_TICKS (1000));
  10219. 8004c14: f44f 707a mov.w r0, #1000 @ 0x3e8
  10220. 8004c18: f00b feb3 bl 8010982 <osDelay>
  10221. 8004c1c: e5d0 b.n 80047c0 <UartTxTask+0x70>
  10222. default: continue; break;
  10223. 8004c1e: bf00 nop
  10224. if (uartTaskData->sendCmdToSlaveQueue != NULL) {
  10225. 8004c20: e5ce b.n 80047c0 <UartTxTask+0x70>
  10226. 8004c22: bf00 nop
  10227. 8004c24: 2400216c .word 0x2400216c
  10228. 8004c28: 240020b8 .word 0x240020b8
  10229. 08004c2c <MeasurmentsReqSchedulerTaskInit>:
  10230. }
  10231. }
  10232. }
  10233. void MeasurmentsReqSchedulerTaskInit (void) {
  10234. 8004c2c: b580 push {r7, lr}
  10235. 8004c2e: b08a sub sp, #40 @ 0x28
  10236. 8004c30: af00 add r7, sp, #0
  10237. osThreadAttr_t osThreadAttrMeasurmentsReqSchedulerTask = { 0 };
  10238. 8004c32: 1d3b adds r3, r7, #4
  10239. 8004c34: 2224 movs r2, #36 @ 0x24
  10240. 8004c36: 2100 movs r1, #0
  10241. 8004c38: 4618 mov r0, r3
  10242. 8004c3a: f025 f859 bl 8029cf0 <memset>
  10243. osThreadAttrMeasurmentsReqSchedulerTask.name = "os_thread_XXX";
  10244. 8004c3e: 4b08 ldr r3, [pc, #32] @ (8004c60 <MeasurmentsReqSchedulerTaskInit+0x34>)
  10245. 8004c40: 607b str r3, [r7, #4]
  10246. osThreadAttrMeasurmentsReqSchedulerTask.stack_size = configMINIMAL_STACK_SIZE * 2;
  10247. 8004c42: f44f 6380 mov.w r3, #1024 @ 0x400
  10248. 8004c46: 61bb str r3, [r7, #24]
  10249. osThreadAttrMeasurmentsReqSchedulerTask.priority = (osPriority_t)osPriorityNormal;
  10250. 8004c48: 2318 movs r3, #24
  10251. 8004c4a: 61fb str r3, [r7, #28]
  10252. osThreadNew (MeasurmentsReqSchedulerTask, uartTasks, &osThreadAttrMeasurmentsReqSchedulerTask);
  10253. 8004c4c: 1d3b adds r3, r7, #4
  10254. 8004c4e: 461a mov r2, r3
  10255. 8004c50: 4904 ldr r1, [pc, #16] @ (8004c64 <MeasurmentsReqSchedulerTaskInit+0x38>)
  10256. 8004c52: 4805 ldr r0, [pc, #20] @ (8004c68 <MeasurmentsReqSchedulerTaskInit+0x3c>)
  10257. 8004c54: f00b fdf7 bl 8010846 <osThreadNew>
  10258. }
  10259. 8004c58: bf00 nop
  10260. 8004c5a: 3728 adds r7, #40 @ 0x28
  10261. 8004c5c: 46bd mov sp, r7
  10262. 8004c5e: bd80 pop {r7, pc}
  10263. 8004c60: 0802c9c8 .word 0x0802c9c8
  10264. 8004c64: 24000018 .word 0x24000018
  10265. 8004c68: 08004c6d .word 0x08004c6d
  10266. 08004c6c <MeasurmentsReqSchedulerTask>:
  10267. void MeasurmentsReqSchedulerTask (void* argument) {
  10268. 8004c6c: b580 push {r7, lr}
  10269. 8004c6e: b088 sub sp, #32
  10270. 8004c70: af00 add r7, sp, #0
  10271. 8004c72: 6078 str r0, [r7, #4]
  10272. while (pdTRUE) {
  10273. __uintptr_t* ptr = (__uintptr_t*)argument;
  10274. 8004c74: 687b ldr r3, [r7, #4]
  10275. 8004c76: 61fb str r3, [r7, #28]
  10276. while (*ptr != 0) {
  10277. 8004c78: e04a b.n 8004d10 <MeasurmentsReqSchedulerTask+0xa4>
  10278. UartTaskData* uartTask = (UartTaskData*)*ptr;
  10279. 8004c7a: 69fb ldr r3, [r7, #28]
  10280. 8004c7c: 681b ldr r3, [r3, #0]
  10281. 8004c7e: 617b str r3, [r7, #20]
  10282. if (uartTask->sendCmdToSlaveQueue != NULL) {
  10283. 8004c80: 697b ldr r3, [r7, #20]
  10284. 8004c82: 6adb ldr r3, [r3, #44] @ 0x2c
  10285. 8004c84: 2b00 cmp r3, #0
  10286. 8004c86: d040 beq.n 8004d0a <MeasurmentsReqSchedulerTask+0x9e>
  10287. InterProcessData data = { 0 };
  10288. 8004c88: f107 0308 add.w r3, r7, #8
  10289. 8004c8c: 2200 movs r2, #0
  10290. 8004c8e: 601a str r2, [r3, #0]
  10291. 8004c90: 605a str r2, [r3, #4]
  10292. 8004c92: 609a str r2, [r3, #8]
  10293. uint8_t boardNumber = 0;
  10294. 8004c94: 2300 movs r3, #0
  10295. 8004c96: 76fb strb r3, [r7, #27]
  10296. for(boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++)
  10297. 8004c98: 2300 movs r3, #0
  10298. 8004c9a: 76fb strb r3, [r7, #27]
  10299. 8004c9c: e00a b.n 8004cb4 <MeasurmentsReqSchedulerTask+0x48>
  10300. {
  10301. if(boardToUartNumberMap[boardNumber] == uartTask->uartNumber)
  10302. 8004c9e: 7efb ldrb r3, [r7, #27]
  10303. 8004ca0: 4a20 ldr r2, [pc, #128] @ (8004d24 <MeasurmentsReqSchedulerTask+0xb8>)
  10304. 8004ca2: 5cd2 ldrb r2, [r2, r3]
  10305. 8004ca4: 697b ldr r3, [r7, #20]
  10306. 8004ca6: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  10307. 8004caa: 429a cmp r2, r3
  10308. 8004cac: d006 beq.n 8004cbc <MeasurmentsReqSchedulerTask+0x50>
  10309. for(boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++)
  10310. 8004cae: 7efb ldrb r3, [r7, #27]
  10311. 8004cb0: 3301 adds r3, #1
  10312. 8004cb2: 76fb strb r3, [r7, #27]
  10313. 8004cb4: 7efb ldrb r3, [r7, #27]
  10314. 8004cb6: 2b03 cmp r3, #3
  10315. 8004cb8: d9f1 bls.n 8004c9e <MeasurmentsReqSchedulerTask+0x32>
  10316. 8004cba: e000 b.n 8004cbe <MeasurmentsReqSchedulerTask+0x52>
  10317. {
  10318. break;
  10319. 8004cbc: bf00 nop
  10320. }
  10321. }
  10322. data.spCommand = spGetElectricalMeasurments;
  10323. 8004cbe: 2300 movs r3, #0
  10324. 8004cc0: 723b strb r3, [r7, #8]
  10325. osMessageQueuePut (uartTask->sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
  10326. 8004cc2: 697b ldr r3, [r7, #20]
  10327. 8004cc4: 6ad8 ldr r0, [r3, #44] @ 0x2c
  10328. 8004cc6: f107 0108 add.w r1, r7, #8
  10329. 8004cca: 2364 movs r3, #100 @ 0x64
  10330. 8004ccc: 2200 movs r2, #0
  10331. 8004cce: f00c f939 bl 8010f44 <osMessageQueuePut>
  10332. osMutexAcquire (resMeasurementsMutex, osWaitForever);
  10333. 8004cd2: 4b15 ldr r3, [pc, #84] @ (8004d28 <MeasurmentsReqSchedulerTask+0xbc>)
  10334. 8004cd4: 681b ldr r3, [r3, #0]
  10335. 8004cd6: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  10336. 8004cda: 4618 mov r0, r3
  10337. 8004cdc: f00b fef2 bl 8010ac4 <osMutexAcquire>
  10338. if(slaveLastSeen[boardNumber] == 0)
  10339. 8004ce0: 7efb ldrb r3, [r7, #27]
  10340. 8004ce2: 4a12 ldr r2, [pc, #72] @ (8004d2c <MeasurmentsReqSchedulerTask+0xc0>)
  10341. 8004ce4: f852 3023 ldr.w r3, [r2, r3, lsl #2]
  10342. 8004ce8: 2b00 cmp r3, #0
  10343. 8004cea: d109 bne.n 8004d00 <MeasurmentsReqSchedulerTask+0x94>
  10344. {
  10345. data.spCommand = spGetSensorMeasurments;
  10346. 8004cec: 2301 movs r3, #1
  10347. 8004cee: 723b strb r3, [r7, #8]
  10348. osMessageQueuePut (uartTask->sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
  10349. 8004cf0: 697b ldr r3, [r7, #20]
  10350. 8004cf2: 6ad8 ldr r0, [r3, #44] @ 0x2c
  10351. 8004cf4: f107 0108 add.w r1, r7, #8
  10352. 8004cf8: 2364 movs r3, #100 @ 0x64
  10353. 8004cfa: 2200 movs r2, #0
  10354. 8004cfc: f00c f922 bl 8010f44 <osMessageQueuePut>
  10355. }
  10356. osMutexRelease(resMeasurementsMutex);
  10357. 8004d00: 4b09 ldr r3, [pc, #36] @ (8004d28 <MeasurmentsReqSchedulerTask+0xbc>)
  10358. 8004d02: 681b ldr r3, [r3, #0]
  10359. 8004d04: 4618 mov r0, r3
  10360. 8004d06: f00b ff28 bl 8010b5a <osMutexRelease>
  10361. }
  10362. ptr++;
  10363. 8004d0a: 69fb ldr r3, [r7, #28]
  10364. 8004d0c: 3304 adds r3, #4
  10365. 8004d0e: 61fb str r3, [r7, #28]
  10366. while (*ptr != 0) {
  10367. 8004d10: 69fb ldr r3, [r7, #28]
  10368. 8004d12: 681b ldr r3, [r3, #0]
  10369. 8004d14: 2b00 cmp r3, #0
  10370. 8004d16: d1b0 bne.n 8004c7a <MeasurmentsReqSchedulerTask+0xe>
  10371. }
  10372. osDelay (pdMS_TO_TICKS (MEASURMENTS_SCHEDULER_INTERVAL_MS));
  10373. 8004d18: f44f 707a mov.w r0, #1000 @ 0x3e8
  10374. 8004d1c: f00b fe31 bl 8010982 <osDelay>
  10375. while (pdTRUE) {
  10376. 8004d20: e7a8 b.n 8004c74 <MeasurmentsReqSchedulerTask+0x8>
  10377. 8004d22: bf00 nop
  10378. 8004d24: 24000014 .word 0x24000014
  10379. 8004d28: 24002168 .word 0x24002168
  10380. 8004d2c: 24002158 .word 0x24002158
  10381. 08004d30 <Reset_Handler>:
  10382. .section .text.Reset_Handler
  10383. .weak Reset_Handler
  10384. .type Reset_Handler, %function
  10385. Reset_Handler:
  10386. ldr sp, =_estack /* set stack pointer */
  10387. 8004d30: f8df d034 ldr.w sp, [pc, #52] @ 8004d68 <LoopFillZerobss+0xe>
  10388. /* Call the clock system initialization function.*/
  10389. bl SystemInit
  10390. 8004d34: f7fe ffaa bl 8003c8c <SystemInit>
  10391. /* Copy the data segment initializers from flash to SRAM */
  10392. ldr r0, =_sdata
  10393. 8004d38: 480c ldr r0, [pc, #48] @ (8004d6c <LoopFillZerobss+0x12>)
  10394. ldr r1, =_edata
  10395. 8004d3a: 490d ldr r1, [pc, #52] @ (8004d70 <LoopFillZerobss+0x16>)
  10396. ldr r2, =_sidata
  10397. 8004d3c: 4a0d ldr r2, [pc, #52] @ (8004d74 <LoopFillZerobss+0x1a>)
  10398. movs r3, #0
  10399. 8004d3e: 2300 movs r3, #0
  10400. b LoopCopyDataInit
  10401. 8004d40: e002 b.n 8004d48 <LoopCopyDataInit>
  10402. 08004d42 <CopyDataInit>:
  10403. CopyDataInit:
  10404. ldr r4, [r2, r3]
  10405. 8004d42: 58d4 ldr r4, [r2, r3]
  10406. str r4, [r0, r3]
  10407. 8004d44: 50c4 str r4, [r0, r3]
  10408. adds r3, r3, #4
  10409. 8004d46: 3304 adds r3, #4
  10410. 08004d48 <LoopCopyDataInit>:
  10411. LoopCopyDataInit:
  10412. adds r4, r0, r3
  10413. 8004d48: 18c4 adds r4, r0, r3
  10414. cmp r4, r1
  10415. 8004d4a: 428c cmp r4, r1
  10416. bcc CopyDataInit
  10417. 8004d4c: d3f9 bcc.n 8004d42 <CopyDataInit>
  10418. /* Zero fill the bss segment. */
  10419. ldr r2, =_sbss
  10420. 8004d4e: 4a0a ldr r2, [pc, #40] @ (8004d78 <LoopFillZerobss+0x1e>)
  10421. ldr r4, =_ebss
  10422. 8004d50: 4c0a ldr r4, [pc, #40] @ (8004d7c <LoopFillZerobss+0x22>)
  10423. movs r3, #0
  10424. 8004d52: 2300 movs r3, #0
  10425. b LoopFillZerobss
  10426. 8004d54: e001 b.n 8004d5a <LoopFillZerobss>
  10427. 08004d56 <FillZerobss>:
  10428. FillZerobss:
  10429. str r3, [r2]
  10430. 8004d56: 6013 str r3, [r2, #0]
  10431. adds r2, r2, #4
  10432. 8004d58: 3204 adds r2, #4
  10433. 08004d5a <LoopFillZerobss>:
  10434. LoopFillZerobss:
  10435. cmp r2, r4
  10436. 8004d5a: 42a2 cmp r2, r4
  10437. bcc FillZerobss
  10438. 8004d5c: d3fb bcc.n 8004d56 <FillZerobss>
  10439. /* Call static constructors */
  10440. bl __libc_init_array
  10441. 8004d5e: f025 f897 bl 8029e90 <__libc_init_array>
  10442. /* Call the application's entry point.*/
  10443. bl main
  10444. 8004d62: f7fc ffa9 bl 8001cb8 <main>
  10445. bx lr
  10446. 8004d66: 4770 bx lr
  10447. ldr sp, =_estack /* set stack pointer */
  10448. 8004d68: 24060000 .word 0x24060000
  10449. ldr r0, =_sdata
  10450. 8004d6c: 24000000 .word 0x24000000
  10451. ldr r1, =_edata
  10452. 8004d70: 24000224 .word 0x24000224
  10453. ldr r2, =_sidata
  10454. 8004d74: 080310b4 .word 0x080310b4
  10455. ldr r2, =_sbss
  10456. 8004d78: 24000224 .word 0x24000224
  10457. ldr r4, =_ebss
  10458. 8004d7c: 2402b188 .word 0x2402b188
  10459. 08004d80 <ADC3_IRQHandler>:
  10460. * @retval None
  10461. */
  10462. .section .text.Default_Handler,"ax",%progbits
  10463. Default_Handler:
  10464. Infinite_Loop:
  10465. b Infinite_Loop
  10466. 8004d80: e7fe b.n 8004d80 <ADC3_IRQHandler>
  10467. 08004d82 <DP83848_RegisterBusIO>:
  10468. * @param ioctx: holds device IO functions.
  10469. * @retval DP83848_STATUS_OK if OK
  10470. * DP83848_STATUS_ERROR if missing mandatory function
  10471. */
  10472. int32_t DP83848_RegisterBusIO(dp83848_Object_t *pObj, dp83848_IOCtx_t *ioctx)
  10473. {
  10474. 8004d82: b480 push {r7}
  10475. 8004d84: b083 sub sp, #12
  10476. 8004d86: af00 add r7, sp, #0
  10477. 8004d88: 6078 str r0, [r7, #4]
  10478. 8004d8a: 6039 str r1, [r7, #0]
  10479. if(!pObj || !ioctx->ReadReg || !ioctx->WriteReg || !ioctx->GetTick)
  10480. 8004d8c: 687b ldr r3, [r7, #4]
  10481. 8004d8e: 2b00 cmp r3, #0
  10482. 8004d90: d00b beq.n 8004daa <DP83848_RegisterBusIO+0x28>
  10483. 8004d92: 683b ldr r3, [r7, #0]
  10484. 8004d94: 68db ldr r3, [r3, #12]
  10485. 8004d96: 2b00 cmp r3, #0
  10486. 8004d98: d007 beq.n 8004daa <DP83848_RegisterBusIO+0x28>
  10487. 8004d9a: 683b ldr r3, [r7, #0]
  10488. 8004d9c: 689b ldr r3, [r3, #8]
  10489. 8004d9e: 2b00 cmp r3, #0
  10490. 8004da0: d003 beq.n 8004daa <DP83848_RegisterBusIO+0x28>
  10491. 8004da2: 683b ldr r3, [r7, #0]
  10492. 8004da4: 691b ldr r3, [r3, #16]
  10493. 8004da6: 2b00 cmp r3, #0
  10494. 8004da8: d102 bne.n 8004db0 <DP83848_RegisterBusIO+0x2e>
  10495. {
  10496. return DP83848_STATUS_ERROR;
  10497. 8004daa: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  10498. 8004dae: e014 b.n 8004dda <DP83848_RegisterBusIO+0x58>
  10499. }
  10500. pObj->IO.Init = ioctx->Init;
  10501. 8004db0: 683b ldr r3, [r7, #0]
  10502. 8004db2: 681a ldr r2, [r3, #0]
  10503. 8004db4: 687b ldr r3, [r7, #4]
  10504. 8004db6: 609a str r2, [r3, #8]
  10505. pObj->IO.DeInit = ioctx->DeInit;
  10506. 8004db8: 683b ldr r3, [r7, #0]
  10507. 8004dba: 685a ldr r2, [r3, #4]
  10508. 8004dbc: 687b ldr r3, [r7, #4]
  10509. 8004dbe: 60da str r2, [r3, #12]
  10510. pObj->IO.ReadReg = ioctx->ReadReg;
  10511. 8004dc0: 683b ldr r3, [r7, #0]
  10512. 8004dc2: 68da ldr r2, [r3, #12]
  10513. 8004dc4: 687b ldr r3, [r7, #4]
  10514. 8004dc6: 615a str r2, [r3, #20]
  10515. pObj->IO.WriteReg = ioctx->WriteReg;
  10516. 8004dc8: 683b ldr r3, [r7, #0]
  10517. 8004dca: 689a ldr r2, [r3, #8]
  10518. 8004dcc: 687b ldr r3, [r7, #4]
  10519. 8004dce: 611a str r2, [r3, #16]
  10520. pObj->IO.GetTick = ioctx->GetTick;
  10521. 8004dd0: 683b ldr r3, [r7, #0]
  10522. 8004dd2: 691a ldr r2, [r3, #16]
  10523. 8004dd4: 687b ldr r3, [r7, #4]
  10524. 8004dd6: 619a str r2, [r3, #24]
  10525. return DP83848_STATUS_OK;
  10526. 8004dd8: 2300 movs r3, #0
  10527. }
  10528. 8004dda: 4618 mov r0, r3
  10529. 8004ddc: 370c adds r7, #12
  10530. 8004dde: 46bd mov sp, r7
  10531. 8004de0: f85d 7b04 ldr.w r7, [sp], #4
  10532. 8004de4: 4770 bx lr
  10533. 08004de6 <DP83848_Init>:
  10534. * @retval DP83848_STATUS_OK if OK
  10535. * DP83848_STATUS_ADDRESS_ERROR if cannot find device address
  10536. * DP83848_STATUS_READ_ERROR if connot read register
  10537. */
  10538. int32_t DP83848_Init(dp83848_Object_t *pObj)
  10539. {
  10540. 8004de6: b580 push {r7, lr}
  10541. 8004de8: b086 sub sp, #24
  10542. 8004dea: af00 add r7, sp, #0
  10543. 8004dec: 6078 str r0, [r7, #4]
  10544. uint32_t regvalue = 0, addr = 0;
  10545. 8004dee: 2300 movs r3, #0
  10546. 8004df0: 60fb str r3, [r7, #12]
  10547. 8004df2: 2300 movs r3, #0
  10548. 8004df4: 617b str r3, [r7, #20]
  10549. int32_t status = DP83848_STATUS_OK;
  10550. 8004df6: 2300 movs r3, #0
  10551. 8004df8: 613b str r3, [r7, #16]
  10552. if(pObj->Is_Initialized == 0)
  10553. 8004dfa: 687b ldr r3, [r7, #4]
  10554. 8004dfc: 685b ldr r3, [r3, #4]
  10555. 8004dfe: 2b00 cmp r3, #0
  10556. 8004e00: d139 bne.n 8004e76 <DP83848_Init+0x90>
  10557. {
  10558. if(pObj->IO.Init != 0)
  10559. 8004e02: 687b ldr r3, [r7, #4]
  10560. 8004e04: 689b ldr r3, [r3, #8]
  10561. 8004e06: 2b00 cmp r3, #0
  10562. 8004e08: d002 beq.n 8004e10 <DP83848_Init+0x2a>
  10563. {
  10564. /* GPIO and Clocks initialization */
  10565. pObj->IO.Init();
  10566. 8004e0a: 687b ldr r3, [r7, #4]
  10567. 8004e0c: 689b ldr r3, [r3, #8]
  10568. 8004e0e: 4798 blx r3
  10569. }
  10570. /* for later check */
  10571. pObj->DevAddr = DP83848_MAX_DEV_ADDR + 1;
  10572. 8004e10: 687b ldr r3, [r7, #4]
  10573. 8004e12: 2220 movs r2, #32
  10574. 8004e14: 601a str r2, [r3, #0]
  10575. /* Get the device address from special mode register */
  10576. for(addr = 0; addr <= DP83848_MAX_DEV_ADDR; addr ++)
  10577. 8004e16: 2300 movs r3, #0
  10578. 8004e18: 617b str r3, [r7, #20]
  10579. 8004e1a: e01c b.n 8004e56 <DP83848_Init+0x70>
  10580. {
  10581. if(pObj->IO.ReadReg(addr, DP83848_SMR, &regvalue) < 0)
  10582. 8004e1c: 687b ldr r3, [r7, #4]
  10583. 8004e1e: 695b ldr r3, [r3, #20]
  10584. 8004e20: f107 020c add.w r2, r7, #12
  10585. 8004e24: 2119 movs r1, #25
  10586. 8004e26: 6978 ldr r0, [r7, #20]
  10587. 8004e28: 4798 blx r3
  10588. 8004e2a: 4603 mov r3, r0
  10589. 8004e2c: 2b00 cmp r3, #0
  10590. 8004e2e: da03 bge.n 8004e38 <DP83848_Init+0x52>
  10591. {
  10592. status = DP83848_STATUS_READ_ERROR;
  10593. 8004e30: f06f 0304 mvn.w r3, #4
  10594. 8004e34: 613b str r3, [r7, #16]
  10595. /* Can't read from this device address
  10596. continue with next address */
  10597. continue;
  10598. 8004e36: e00b b.n 8004e50 <DP83848_Init+0x6a>
  10599. }
  10600. if((regvalue & DP83848_SMR_PHY_ADDR) == addr)
  10601. 8004e38: 68fb ldr r3, [r7, #12]
  10602. 8004e3a: f003 031f and.w r3, r3, #31
  10603. 8004e3e: 697a ldr r2, [r7, #20]
  10604. 8004e40: 429a cmp r2, r3
  10605. 8004e42: d105 bne.n 8004e50 <DP83848_Init+0x6a>
  10606. {
  10607. pObj->DevAddr = addr;
  10608. 8004e44: 687b ldr r3, [r7, #4]
  10609. 8004e46: 697a ldr r2, [r7, #20]
  10610. 8004e48: 601a str r2, [r3, #0]
  10611. status = DP83848_STATUS_OK;
  10612. 8004e4a: 2300 movs r3, #0
  10613. 8004e4c: 613b str r3, [r7, #16]
  10614. break;
  10615. 8004e4e: e005 b.n 8004e5c <DP83848_Init+0x76>
  10616. for(addr = 0; addr <= DP83848_MAX_DEV_ADDR; addr ++)
  10617. 8004e50: 697b ldr r3, [r7, #20]
  10618. 8004e52: 3301 adds r3, #1
  10619. 8004e54: 617b str r3, [r7, #20]
  10620. 8004e56: 697b ldr r3, [r7, #20]
  10621. 8004e58: 2b1f cmp r3, #31
  10622. 8004e5a: d9df bls.n 8004e1c <DP83848_Init+0x36>
  10623. }
  10624. }
  10625. if(pObj->DevAddr > DP83848_MAX_DEV_ADDR)
  10626. 8004e5c: 687b ldr r3, [r7, #4]
  10627. 8004e5e: 681b ldr r3, [r3, #0]
  10628. 8004e60: 2b1f cmp r3, #31
  10629. 8004e62: d902 bls.n 8004e6a <DP83848_Init+0x84>
  10630. {
  10631. status = DP83848_STATUS_ADDRESS_ERROR;
  10632. 8004e64: f06f 0302 mvn.w r3, #2
  10633. 8004e68: 613b str r3, [r7, #16]
  10634. }
  10635. /* if device address is matched */
  10636. if(status == DP83848_STATUS_OK)
  10637. 8004e6a: 693b ldr r3, [r7, #16]
  10638. 8004e6c: 2b00 cmp r3, #0
  10639. 8004e6e: d102 bne.n 8004e76 <DP83848_Init+0x90>
  10640. {
  10641. pObj->Is_Initialized = 1;
  10642. 8004e70: 687b ldr r3, [r7, #4]
  10643. 8004e72: 2201 movs r2, #1
  10644. 8004e74: 605a str r2, [r3, #4]
  10645. }
  10646. }
  10647. return status;
  10648. 8004e76: 693b ldr r3, [r7, #16]
  10649. }
  10650. 8004e78: 4618 mov r0, r3
  10651. 8004e7a: 3718 adds r7, #24
  10652. 8004e7c: 46bd mov sp, r7
  10653. 8004e7e: bd80 pop {r7, pc}
  10654. 08004e80 <DP83848_GetLinkState>:
  10655. * DP83848_STATUS_10MBITS_HALFDUPLEX if 10Mb/s HD
  10656. * DP83848_STATUS_READ_ERROR if connot read register
  10657. * DP83848_STATUS_WRITE_ERROR if connot write to register
  10658. */
  10659. int32_t DP83848_GetLinkState(dp83848_Object_t *pObj)
  10660. {
  10661. 8004e80: b580 push {r7, lr}
  10662. 8004e82: b084 sub sp, #16
  10663. 8004e84: af00 add r7, sp, #0
  10664. 8004e86: 6078 str r0, [r7, #4]
  10665. uint32_t readval = 0;
  10666. 8004e88: 2300 movs r3, #0
  10667. 8004e8a: 60fb str r3, [r7, #12]
  10668. /* Read Status register */
  10669. if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BSR, &readval) < 0)
  10670. 8004e8c: 687b ldr r3, [r7, #4]
  10671. 8004e8e: 695b ldr r3, [r3, #20]
  10672. 8004e90: 687a ldr r2, [r7, #4]
  10673. 8004e92: 6810 ldr r0, [r2, #0]
  10674. 8004e94: f107 020c add.w r2, r7, #12
  10675. 8004e98: 2101 movs r1, #1
  10676. 8004e9a: 4798 blx r3
  10677. 8004e9c: 4603 mov r3, r0
  10678. 8004e9e: 2b00 cmp r3, #0
  10679. 8004ea0: da02 bge.n 8004ea8 <DP83848_GetLinkState+0x28>
  10680. {
  10681. return DP83848_STATUS_READ_ERROR;
  10682. 8004ea2: f06f 0304 mvn.w r3, #4
  10683. 8004ea6: e06e b.n 8004f86 <DP83848_GetLinkState+0x106>
  10684. }
  10685. /* Read Status register again */
  10686. if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BSR, &readval) < 0)
  10687. 8004ea8: 687b ldr r3, [r7, #4]
  10688. 8004eaa: 695b ldr r3, [r3, #20]
  10689. 8004eac: 687a ldr r2, [r7, #4]
  10690. 8004eae: 6810 ldr r0, [r2, #0]
  10691. 8004eb0: f107 020c add.w r2, r7, #12
  10692. 8004eb4: 2101 movs r1, #1
  10693. 8004eb6: 4798 blx r3
  10694. 8004eb8: 4603 mov r3, r0
  10695. 8004eba: 2b00 cmp r3, #0
  10696. 8004ebc: da02 bge.n 8004ec4 <DP83848_GetLinkState+0x44>
  10697. {
  10698. return DP83848_STATUS_READ_ERROR;
  10699. 8004ebe: f06f 0304 mvn.w r3, #4
  10700. 8004ec2: e060 b.n 8004f86 <DP83848_GetLinkState+0x106>
  10701. }
  10702. if((readval & DP83848_BSR_LINK_STATUS) == 0)
  10703. 8004ec4: 68fb ldr r3, [r7, #12]
  10704. 8004ec6: f003 0304 and.w r3, r3, #4
  10705. 8004eca: 2b00 cmp r3, #0
  10706. 8004ecc: d101 bne.n 8004ed2 <DP83848_GetLinkState+0x52>
  10707. {
  10708. /* Return Link Down status */
  10709. return DP83848_STATUS_LINK_DOWN;
  10710. 8004ece: 2301 movs r3, #1
  10711. 8004ed0: e059 b.n 8004f86 <DP83848_GetLinkState+0x106>
  10712. }
  10713. /* Check Auto negotiaition */
  10714. if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BCR, &readval) < 0)
  10715. 8004ed2: 687b ldr r3, [r7, #4]
  10716. 8004ed4: 695b ldr r3, [r3, #20]
  10717. 8004ed6: 687a ldr r2, [r7, #4]
  10718. 8004ed8: 6810 ldr r0, [r2, #0]
  10719. 8004eda: f107 020c add.w r2, r7, #12
  10720. 8004ede: 2100 movs r1, #0
  10721. 8004ee0: 4798 blx r3
  10722. 8004ee2: 4603 mov r3, r0
  10723. 8004ee4: 2b00 cmp r3, #0
  10724. 8004ee6: da02 bge.n 8004eee <DP83848_GetLinkState+0x6e>
  10725. {
  10726. return DP83848_STATUS_READ_ERROR;
  10727. 8004ee8: f06f 0304 mvn.w r3, #4
  10728. 8004eec: e04b b.n 8004f86 <DP83848_GetLinkState+0x106>
  10729. }
  10730. if((readval & DP83848_BCR_AUTONEGO_EN) != DP83848_BCR_AUTONEGO_EN)
  10731. 8004eee: 68fb ldr r3, [r7, #12]
  10732. 8004ef0: f403 5380 and.w r3, r3, #4096 @ 0x1000
  10733. 8004ef4: 2b00 cmp r3, #0
  10734. 8004ef6: d11b bne.n 8004f30 <DP83848_GetLinkState+0xb0>
  10735. {
  10736. if(((readval & DP83848_BCR_SPEED_SELECT) == DP83848_BCR_SPEED_SELECT) && ((readval & DP83848_BCR_DUPLEX_MODE) == DP83848_BCR_DUPLEX_MODE))
  10737. 8004ef8: 68fb ldr r3, [r7, #12]
  10738. 8004efa: f403 5300 and.w r3, r3, #8192 @ 0x2000
  10739. 8004efe: 2b00 cmp r3, #0
  10740. 8004f00: d006 beq.n 8004f10 <DP83848_GetLinkState+0x90>
  10741. 8004f02: 68fb ldr r3, [r7, #12]
  10742. 8004f04: f403 7380 and.w r3, r3, #256 @ 0x100
  10743. 8004f08: 2b00 cmp r3, #0
  10744. 8004f0a: d001 beq.n 8004f10 <DP83848_GetLinkState+0x90>
  10745. {
  10746. return DP83848_STATUS_100MBITS_FULLDUPLEX;
  10747. 8004f0c: 2302 movs r3, #2
  10748. 8004f0e: e03a b.n 8004f86 <DP83848_GetLinkState+0x106>
  10749. }
  10750. else if ((readval & DP83848_BCR_SPEED_SELECT) == DP83848_BCR_SPEED_SELECT)
  10751. 8004f10: 68fb ldr r3, [r7, #12]
  10752. 8004f12: f403 5300 and.w r3, r3, #8192 @ 0x2000
  10753. 8004f16: 2b00 cmp r3, #0
  10754. 8004f18: d001 beq.n 8004f1e <DP83848_GetLinkState+0x9e>
  10755. {
  10756. return DP83848_STATUS_100MBITS_HALFDUPLEX;
  10757. 8004f1a: 2303 movs r3, #3
  10758. 8004f1c: e033 b.n 8004f86 <DP83848_GetLinkState+0x106>
  10759. }
  10760. else if ((readval & DP83848_BCR_DUPLEX_MODE) == DP83848_BCR_DUPLEX_MODE)
  10761. 8004f1e: 68fb ldr r3, [r7, #12]
  10762. 8004f20: f403 7380 and.w r3, r3, #256 @ 0x100
  10763. 8004f24: 2b00 cmp r3, #0
  10764. 8004f26: d001 beq.n 8004f2c <DP83848_GetLinkState+0xac>
  10765. {
  10766. return DP83848_STATUS_10MBITS_FULLDUPLEX;
  10767. 8004f28: 2304 movs r3, #4
  10768. 8004f2a: e02c b.n 8004f86 <DP83848_GetLinkState+0x106>
  10769. }
  10770. else
  10771. {
  10772. return DP83848_STATUS_10MBITS_HALFDUPLEX;
  10773. 8004f2c: 2305 movs r3, #5
  10774. 8004f2e: e02a b.n 8004f86 <DP83848_GetLinkState+0x106>
  10775. }
  10776. }
  10777. else /* Auto Nego enabled */
  10778. {
  10779. if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_PHYSCSR, &readval) < 0)
  10780. 8004f30: 687b ldr r3, [r7, #4]
  10781. 8004f32: 695b ldr r3, [r3, #20]
  10782. 8004f34: 687a ldr r2, [r7, #4]
  10783. 8004f36: 6810 ldr r0, [r2, #0]
  10784. 8004f38: f107 020c add.w r2, r7, #12
  10785. 8004f3c: 2110 movs r1, #16
  10786. 8004f3e: 4798 blx r3
  10787. 8004f40: 4603 mov r3, r0
  10788. 8004f42: 2b00 cmp r3, #0
  10789. 8004f44: da02 bge.n 8004f4c <DP83848_GetLinkState+0xcc>
  10790. {
  10791. return DP83848_STATUS_READ_ERROR;
  10792. 8004f46: f06f 0304 mvn.w r3, #4
  10793. 8004f4a: e01c b.n 8004f86 <DP83848_GetLinkState+0x106>
  10794. }
  10795. /* Check if auto nego not done */
  10796. if((readval & DP83848_PHYSCSR_AUTONEGO_DONE) == 0)
  10797. 8004f4c: 68fb ldr r3, [r7, #12]
  10798. 8004f4e: f003 0310 and.w r3, r3, #16
  10799. 8004f52: 2b00 cmp r3, #0
  10800. 8004f54: d101 bne.n 8004f5a <DP83848_GetLinkState+0xda>
  10801. {
  10802. return DP83848_STATUS_AUTONEGO_NOTDONE;
  10803. 8004f56: 2306 movs r3, #6
  10804. 8004f58: e015 b.n 8004f86 <DP83848_GetLinkState+0x106>
  10805. }
  10806. if((readval & DP83848_PHYSCSR_HCDSPEEDMASK) == DP83848_PHYSCSR_100BTX_FD)
  10807. 8004f5a: 68fb ldr r3, [r7, #12]
  10808. 8004f5c: f003 0306 and.w r3, r3, #6
  10809. 8004f60: 2b04 cmp r3, #4
  10810. 8004f62: d101 bne.n 8004f68 <DP83848_GetLinkState+0xe8>
  10811. {
  10812. return DP83848_STATUS_100MBITS_FULLDUPLEX;
  10813. 8004f64: 2302 movs r3, #2
  10814. 8004f66: e00e b.n 8004f86 <DP83848_GetLinkState+0x106>
  10815. }
  10816. else if ((readval & DP83848_PHYSCSR_HCDSPEEDMASK) == DP83848_PHYSCSR_100BTX_HD)
  10817. 8004f68: 68fb ldr r3, [r7, #12]
  10818. 8004f6a: f003 0306 and.w r3, r3, #6
  10819. 8004f6e: 2b00 cmp r3, #0
  10820. 8004f70: d101 bne.n 8004f76 <DP83848_GetLinkState+0xf6>
  10821. {
  10822. return DP83848_STATUS_100MBITS_HALFDUPLEX;
  10823. 8004f72: 2303 movs r3, #3
  10824. 8004f74: e007 b.n 8004f86 <DP83848_GetLinkState+0x106>
  10825. }
  10826. else if ((readval & DP83848_PHYSCSR_HCDSPEEDMASK) == DP83848_PHYSCSR_10BT_FD)
  10827. 8004f76: 68fb ldr r3, [r7, #12]
  10828. 8004f78: f003 0306 and.w r3, r3, #6
  10829. 8004f7c: 2b06 cmp r3, #6
  10830. 8004f7e: d101 bne.n 8004f84 <DP83848_GetLinkState+0x104>
  10831. {
  10832. return DP83848_STATUS_10MBITS_FULLDUPLEX;
  10833. 8004f80: 2304 movs r3, #4
  10834. 8004f82: e000 b.n 8004f86 <DP83848_GetLinkState+0x106>
  10835. }
  10836. else
  10837. {
  10838. return DP83848_STATUS_10MBITS_HALFDUPLEX;
  10839. 8004f84: 2305 movs r3, #5
  10840. }
  10841. }
  10842. }
  10843. 8004f86: 4618 mov r0, r3
  10844. 8004f88: 3710 adds r7, #16
  10845. 8004f8a: 46bd mov sp, r7
  10846. 8004f8c: bd80 pop {r7, pc}
  10847. ...
  10848. 08004f90 <HAL_Init>:
  10849. * need to ensure that the SysTick time base is always set to 1 millisecond
  10850. * to have correct HAL operation.
  10851. * @retval HAL status
  10852. */
  10853. HAL_StatusTypeDef HAL_Init(void)
  10854. {
  10855. 8004f90: b580 push {r7, lr}
  10856. 8004f92: b082 sub sp, #8
  10857. 8004f94: af00 add r7, sp, #0
  10858. __HAL_ART_CONFIG_BASE_ADDRESS(0x08100000UL); /* Configure the Cortex-M4 ART Base address to the Flash Bank 2 : */
  10859. __HAL_ART_ENABLE(); /* Enable the Cortex-M4 ART */
  10860. #endif /* DUAL_CORE && CORE_CM4 */
  10861. /* Set Interrupt Group Priority */
  10862. HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
  10863. 8004f96: 2003 movs r0, #3
  10864. 8004f98: f000 f947 bl 800522a <HAL_NVIC_SetPriorityGrouping>
  10865. /* Update the SystemCoreClock global variable */
  10866. #if defined(RCC_D1CFGR_D1CPRE)
  10867. common_system_clock = HAL_RCC_GetSysClockFreq() >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_D1CPRE)>> RCC_D1CFGR_D1CPRE_Pos]) & 0x1FU);
  10868. 8004f9c: f005 fb8c bl 800a6b8 <HAL_RCC_GetSysClockFreq>
  10869. 8004fa0: 4602 mov r2, r0
  10870. 8004fa2: 4b15 ldr r3, [pc, #84] @ (8004ff8 <HAL_Init+0x68>)
  10871. 8004fa4: 699b ldr r3, [r3, #24]
  10872. 8004fa6: 0a1b lsrs r3, r3, #8
  10873. 8004fa8: f003 030f and.w r3, r3, #15
  10874. 8004fac: 4913 ldr r1, [pc, #76] @ (8004ffc <HAL_Init+0x6c>)
  10875. 8004fae: 5ccb ldrb r3, [r1, r3]
  10876. 8004fb0: f003 031f and.w r3, r3, #31
  10877. 8004fb4: fa22 f303 lsr.w r3, r2, r3
  10878. 8004fb8: 607b str r3, [r7, #4]
  10879. common_system_clock = HAL_RCC_GetSysClockFreq() >> ((D1CorePrescTable[(RCC->CDCFGR1 & RCC_CDCFGR1_CDCPRE)>> RCC_CDCFGR1_CDCPRE_Pos]) & 0x1FU);
  10880. #endif
  10881. /* Update the SystemD2Clock global variable */
  10882. #if defined(RCC_D1CFGR_HPRE)
  10883. SystemD2Clock = (common_system_clock >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_HPRE)>> RCC_D1CFGR_HPRE_Pos]) & 0x1FU));
  10884. 8004fba: 4b0f ldr r3, [pc, #60] @ (8004ff8 <HAL_Init+0x68>)
  10885. 8004fbc: 699b ldr r3, [r3, #24]
  10886. 8004fbe: f003 030f and.w r3, r3, #15
  10887. 8004fc2: 4a0e ldr r2, [pc, #56] @ (8004ffc <HAL_Init+0x6c>)
  10888. 8004fc4: 5cd3 ldrb r3, [r2, r3]
  10889. 8004fc6: f003 031f and.w r3, r3, #31
  10890. 8004fca: 687a ldr r2, [r7, #4]
  10891. 8004fcc: fa22 f303 lsr.w r3, r2, r3
  10892. 8004fd0: 4a0b ldr r2, [pc, #44] @ (8005000 <HAL_Init+0x70>)
  10893. 8004fd2: 6013 str r3, [r2, #0]
  10894. #endif
  10895. #if defined(DUAL_CORE) && defined(CORE_CM4)
  10896. SystemCoreClock = SystemD2Clock;
  10897. #else
  10898. SystemCoreClock = common_system_clock;
  10899. 8004fd4: 4a0b ldr r2, [pc, #44] @ (8005004 <HAL_Init+0x74>)
  10900. 8004fd6: 687b ldr r3, [r7, #4]
  10901. 8004fd8: 6013 str r3, [r2, #0]
  10902. #endif /* DUAL_CORE && CORE_CM4 */
  10903. /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  10904. if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK)
  10905. 8004fda: 200f movs r0, #15
  10906. 8004fdc: f7fe fc7c bl 80038d8 <HAL_InitTick>
  10907. 8004fe0: 4603 mov r3, r0
  10908. 8004fe2: 2b00 cmp r3, #0
  10909. 8004fe4: d001 beq.n 8004fea <HAL_Init+0x5a>
  10910. {
  10911. return HAL_ERROR;
  10912. 8004fe6: 2301 movs r3, #1
  10913. 8004fe8: e002 b.n 8004ff0 <HAL_Init+0x60>
  10914. }
  10915. /* Init the low level hardware */
  10916. HAL_MspInit();
  10917. 8004fea: f7fe f987 bl 80032fc <HAL_MspInit>
  10918. /* Return function status */
  10919. return HAL_OK;
  10920. 8004fee: 2300 movs r3, #0
  10921. }
  10922. 8004ff0: 4618 mov r0, r3
  10923. 8004ff2: 3708 adds r7, #8
  10924. 8004ff4: 46bd mov sp, r7
  10925. 8004ff6: bd80 pop {r7, pc}
  10926. 8004ff8: 58024400 .word 0x58024400
  10927. 8004ffc: 08030a24 .word 0x08030a24
  10928. 8005000: 24000010 .word 0x24000010
  10929. 8005004: 2400000c .word 0x2400000c
  10930. 08005008 <HAL_IncTick>:
  10931. * @note This function is declared as __weak to be overwritten in case of other
  10932. * implementations in user file.
  10933. * @retval None
  10934. */
  10935. __weak void HAL_IncTick(void)
  10936. {
  10937. 8005008: b480 push {r7}
  10938. 800500a: af00 add r7, sp, #0
  10939. uwTick += (uint32_t)uwTickFreq;
  10940. 800500c: 4b06 ldr r3, [pc, #24] @ (8005028 <HAL_IncTick+0x20>)
  10941. 800500e: 781b ldrb r3, [r3, #0]
  10942. 8005010: 461a mov r2, r3
  10943. 8005012: 4b06 ldr r3, [pc, #24] @ (800502c <HAL_IncTick+0x24>)
  10944. 8005014: 681b ldr r3, [r3, #0]
  10945. 8005016: 4413 add r3, r2
  10946. 8005018: 4a04 ldr r2, [pc, #16] @ (800502c <HAL_IncTick+0x24>)
  10947. 800501a: 6013 str r3, [r2, #0]
  10948. }
  10949. 800501c: bf00 nop
  10950. 800501e: 46bd mov sp, r7
  10951. 8005020: f85d 7b04 ldr.w r7, [sp], #4
  10952. 8005024: 4770 bx lr
  10953. 8005026: bf00 nop
  10954. 8005028: 24000030 .word 0x24000030
  10955. 800502c: 24002170 .word 0x24002170
  10956. 08005030 <HAL_GetTick>:
  10957. * @note This function is declared as __weak to be overwritten in case of other
  10958. * implementations in user file.
  10959. * @retval tick value
  10960. */
  10961. __weak uint32_t HAL_GetTick(void)
  10962. {
  10963. 8005030: b480 push {r7}
  10964. 8005032: af00 add r7, sp, #0
  10965. return uwTick;
  10966. 8005034: 4b03 ldr r3, [pc, #12] @ (8005044 <HAL_GetTick+0x14>)
  10967. 8005036: 681b ldr r3, [r3, #0]
  10968. }
  10969. 8005038: 4618 mov r0, r3
  10970. 800503a: 46bd mov sp, r7
  10971. 800503c: f85d 7b04 ldr.w r7, [sp], #4
  10972. 8005040: 4770 bx lr
  10973. 8005042: bf00 nop
  10974. 8005044: 24002170 .word 0x24002170
  10975. 08005048 <HAL_Delay>:
  10976. * implementations in user file.
  10977. * @param Delay specifies the delay time length, in milliseconds.
  10978. * @retval None
  10979. */
  10980. __weak void HAL_Delay(uint32_t Delay)
  10981. {
  10982. 8005048: b580 push {r7, lr}
  10983. 800504a: b084 sub sp, #16
  10984. 800504c: af00 add r7, sp, #0
  10985. 800504e: 6078 str r0, [r7, #4]
  10986. uint32_t tickstart = HAL_GetTick();
  10987. 8005050: f7ff ffee bl 8005030 <HAL_GetTick>
  10988. 8005054: 60b8 str r0, [r7, #8]
  10989. uint32_t wait = Delay;
  10990. 8005056: 687b ldr r3, [r7, #4]
  10991. 8005058: 60fb str r3, [r7, #12]
  10992. /* Add a freq to guarantee minimum wait */
  10993. if (wait < HAL_MAX_DELAY)
  10994. 800505a: 68fb ldr r3, [r7, #12]
  10995. 800505c: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  10996. 8005060: d005 beq.n 800506e <HAL_Delay+0x26>
  10997. {
  10998. wait += (uint32_t)(uwTickFreq);
  10999. 8005062: 4b0a ldr r3, [pc, #40] @ (800508c <HAL_Delay+0x44>)
  11000. 8005064: 781b ldrb r3, [r3, #0]
  11001. 8005066: 461a mov r2, r3
  11002. 8005068: 68fb ldr r3, [r7, #12]
  11003. 800506a: 4413 add r3, r2
  11004. 800506c: 60fb str r3, [r7, #12]
  11005. }
  11006. while ((HAL_GetTick() - tickstart) < wait)
  11007. 800506e: bf00 nop
  11008. 8005070: f7ff ffde bl 8005030 <HAL_GetTick>
  11009. 8005074: 4602 mov r2, r0
  11010. 8005076: 68bb ldr r3, [r7, #8]
  11011. 8005078: 1ad3 subs r3, r2, r3
  11012. 800507a: 68fa ldr r2, [r7, #12]
  11013. 800507c: 429a cmp r2, r3
  11014. 800507e: d8f7 bhi.n 8005070 <HAL_Delay+0x28>
  11015. {
  11016. }
  11017. }
  11018. 8005080: bf00 nop
  11019. 8005082: bf00 nop
  11020. 8005084: 3710 adds r7, #16
  11021. 8005086: 46bd mov sp, r7
  11022. 8005088: bd80 pop {r7, pc}
  11023. 800508a: bf00 nop
  11024. 800508c: 24000030 .word 0x24000030
  11025. 08005090 <HAL_GetREVID>:
  11026. /**
  11027. * @brief Returns the device revision identifier.
  11028. * @retval Device revision identifier
  11029. */
  11030. uint32_t HAL_GetREVID(void)
  11031. {
  11032. 8005090: b480 push {r7}
  11033. 8005092: af00 add r7, sp, #0
  11034. return((DBGMCU->IDCODE) >> 16);
  11035. 8005094: 4b03 ldr r3, [pc, #12] @ (80050a4 <HAL_GetREVID+0x14>)
  11036. 8005096: 681b ldr r3, [r3, #0]
  11037. 8005098: 0c1b lsrs r3, r3, #16
  11038. }
  11039. 800509a: 4618 mov r0, r3
  11040. 800509c: 46bd mov sp, r7
  11041. 800509e: f85d 7b04 ldr.w r7, [sp], #4
  11042. 80050a2: 4770 bx lr
  11043. 80050a4: 5c001000 .word 0x5c001000
  11044. 080050a8 <HAL_SYSCFG_ETHInterfaceSelect>:
  11045. * @arg SYSCFG_ETH_MII : Select the Media Independent Interface
  11046. * @arg SYSCFG_ETH_RMII: Select the Reduced Media Independent Interface
  11047. * @retval None
  11048. */
  11049. void HAL_SYSCFG_ETHInterfaceSelect(uint32_t SYSCFG_ETHInterface)
  11050. {
  11051. 80050a8: b480 push {r7}
  11052. 80050aa: b083 sub sp, #12
  11053. 80050ac: af00 add r7, sp, #0
  11054. 80050ae: 6078 str r0, [r7, #4]
  11055. /* Check the parameter */
  11056. assert_param(IS_SYSCFG_ETHERNET_CONFIG(SYSCFG_ETHInterface));
  11057. MODIFY_REG(SYSCFG->PMCR, SYSCFG_PMCR_EPIS_SEL, (uint32_t)(SYSCFG_ETHInterface));
  11058. 80050b0: 4b06 ldr r3, [pc, #24] @ (80050cc <HAL_SYSCFG_ETHInterfaceSelect+0x24>)
  11059. 80050b2: 685b ldr r3, [r3, #4]
  11060. 80050b4: f423 0260 bic.w r2, r3, #14680064 @ 0xe00000
  11061. 80050b8: 4904 ldr r1, [pc, #16] @ (80050cc <HAL_SYSCFG_ETHInterfaceSelect+0x24>)
  11062. 80050ba: 687b ldr r3, [r7, #4]
  11063. 80050bc: 4313 orrs r3, r2
  11064. 80050be: 604b str r3, [r1, #4]
  11065. }
  11066. 80050c0: bf00 nop
  11067. 80050c2: 370c adds r7, #12
  11068. 80050c4: 46bd mov sp, r7
  11069. 80050c6: f85d 7b04 ldr.w r7, [sp], #4
  11070. 80050ca: 4770 bx lr
  11071. 80050cc: 58000400 .word 0x58000400
  11072. 080050d0 <__NVIC_SetPriorityGrouping>:
  11073. {
  11074. 80050d0: b480 push {r7}
  11075. 80050d2: b085 sub sp, #20
  11076. 80050d4: af00 add r7, sp, #0
  11077. 80050d6: 6078 str r0, [r7, #4]
  11078. uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
  11079. 80050d8: 687b ldr r3, [r7, #4]
  11080. 80050da: f003 0307 and.w r3, r3, #7
  11081. 80050de: 60fb str r3, [r7, #12]
  11082. reg_value = SCB->AIRCR; /* read old register configuration */
  11083. 80050e0: 4b0b ldr r3, [pc, #44] @ (8005110 <__NVIC_SetPriorityGrouping+0x40>)
  11084. 80050e2: 68db ldr r3, [r3, #12]
  11085. 80050e4: 60bb str r3, [r7, #8]
  11086. reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */
  11087. 80050e6: 68ba ldr r2, [r7, #8]
  11088. 80050e8: f64f 03ff movw r3, #63743 @ 0xf8ff
  11089. 80050ec: 4013 ands r3, r2
  11090. 80050ee: 60bb str r3, [r7, #8]
  11091. (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */
  11092. 80050f0: 68fb ldr r3, [r7, #12]
  11093. 80050f2: 021a lsls r2, r3, #8
  11094. ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
  11095. 80050f4: 68bb ldr r3, [r7, #8]
  11096. 80050f6: 431a orrs r2, r3
  11097. reg_value = (reg_value |
  11098. 80050f8: 4b06 ldr r3, [pc, #24] @ (8005114 <__NVIC_SetPriorityGrouping+0x44>)
  11099. 80050fa: 4313 orrs r3, r2
  11100. 80050fc: 60bb str r3, [r7, #8]
  11101. SCB->AIRCR = reg_value;
  11102. 80050fe: 4a04 ldr r2, [pc, #16] @ (8005110 <__NVIC_SetPriorityGrouping+0x40>)
  11103. 8005100: 68bb ldr r3, [r7, #8]
  11104. 8005102: 60d3 str r3, [r2, #12]
  11105. }
  11106. 8005104: bf00 nop
  11107. 8005106: 3714 adds r7, #20
  11108. 8005108: 46bd mov sp, r7
  11109. 800510a: f85d 7b04 ldr.w r7, [sp], #4
  11110. 800510e: 4770 bx lr
  11111. 8005110: e000ed00 .word 0xe000ed00
  11112. 8005114: 05fa0000 .word 0x05fa0000
  11113. 08005118 <__NVIC_GetPriorityGrouping>:
  11114. {
  11115. 8005118: b480 push {r7}
  11116. 800511a: af00 add r7, sp, #0
  11117. return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));
  11118. 800511c: 4b04 ldr r3, [pc, #16] @ (8005130 <__NVIC_GetPriorityGrouping+0x18>)
  11119. 800511e: 68db ldr r3, [r3, #12]
  11120. 8005120: 0a1b lsrs r3, r3, #8
  11121. 8005122: f003 0307 and.w r3, r3, #7
  11122. }
  11123. 8005126: 4618 mov r0, r3
  11124. 8005128: 46bd mov sp, r7
  11125. 800512a: f85d 7b04 ldr.w r7, [sp], #4
  11126. 800512e: 4770 bx lr
  11127. 8005130: e000ed00 .word 0xe000ed00
  11128. 08005134 <__NVIC_EnableIRQ>:
  11129. {
  11130. 8005134: b480 push {r7}
  11131. 8005136: b083 sub sp, #12
  11132. 8005138: af00 add r7, sp, #0
  11133. 800513a: 4603 mov r3, r0
  11134. 800513c: 80fb strh r3, [r7, #6]
  11135. if ((int32_t)(IRQn) >= 0)
  11136. 800513e: f9b7 3006 ldrsh.w r3, [r7, #6]
  11137. 8005142: 2b00 cmp r3, #0
  11138. 8005144: db0b blt.n 800515e <__NVIC_EnableIRQ+0x2a>
  11139. NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
  11140. 8005146: 88fb ldrh r3, [r7, #6]
  11141. 8005148: f003 021f and.w r2, r3, #31
  11142. 800514c: 4907 ldr r1, [pc, #28] @ (800516c <__NVIC_EnableIRQ+0x38>)
  11143. 800514e: f9b7 3006 ldrsh.w r3, [r7, #6]
  11144. 8005152: 095b lsrs r3, r3, #5
  11145. 8005154: 2001 movs r0, #1
  11146. 8005156: fa00 f202 lsl.w r2, r0, r2
  11147. 800515a: f841 2023 str.w r2, [r1, r3, lsl #2]
  11148. }
  11149. 800515e: bf00 nop
  11150. 8005160: 370c adds r7, #12
  11151. 8005162: 46bd mov sp, r7
  11152. 8005164: f85d 7b04 ldr.w r7, [sp], #4
  11153. 8005168: 4770 bx lr
  11154. 800516a: bf00 nop
  11155. 800516c: e000e100 .word 0xe000e100
  11156. 08005170 <__NVIC_SetPriority>:
  11157. {
  11158. 8005170: b480 push {r7}
  11159. 8005172: b083 sub sp, #12
  11160. 8005174: af00 add r7, sp, #0
  11161. 8005176: 4603 mov r3, r0
  11162. 8005178: 6039 str r1, [r7, #0]
  11163. 800517a: 80fb strh r3, [r7, #6]
  11164. if ((int32_t)(IRQn) >= 0)
  11165. 800517c: f9b7 3006 ldrsh.w r3, [r7, #6]
  11166. 8005180: 2b00 cmp r3, #0
  11167. 8005182: db0a blt.n 800519a <__NVIC_SetPriority+0x2a>
  11168. NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
  11169. 8005184: 683b ldr r3, [r7, #0]
  11170. 8005186: b2da uxtb r2, r3
  11171. 8005188: 490c ldr r1, [pc, #48] @ (80051bc <__NVIC_SetPriority+0x4c>)
  11172. 800518a: f9b7 3006 ldrsh.w r3, [r7, #6]
  11173. 800518e: 0112 lsls r2, r2, #4
  11174. 8005190: b2d2 uxtb r2, r2
  11175. 8005192: 440b add r3, r1
  11176. 8005194: f883 2300 strb.w r2, [r3, #768] @ 0x300
  11177. }
  11178. 8005198: e00a b.n 80051b0 <__NVIC_SetPriority+0x40>
  11179. SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
  11180. 800519a: 683b ldr r3, [r7, #0]
  11181. 800519c: b2da uxtb r2, r3
  11182. 800519e: 4908 ldr r1, [pc, #32] @ (80051c0 <__NVIC_SetPriority+0x50>)
  11183. 80051a0: 88fb ldrh r3, [r7, #6]
  11184. 80051a2: f003 030f and.w r3, r3, #15
  11185. 80051a6: 3b04 subs r3, #4
  11186. 80051a8: 0112 lsls r2, r2, #4
  11187. 80051aa: b2d2 uxtb r2, r2
  11188. 80051ac: 440b add r3, r1
  11189. 80051ae: 761a strb r2, [r3, #24]
  11190. }
  11191. 80051b0: bf00 nop
  11192. 80051b2: 370c adds r7, #12
  11193. 80051b4: 46bd mov sp, r7
  11194. 80051b6: f85d 7b04 ldr.w r7, [sp], #4
  11195. 80051ba: 4770 bx lr
  11196. 80051bc: e000e100 .word 0xe000e100
  11197. 80051c0: e000ed00 .word 0xe000ed00
  11198. 080051c4 <NVIC_EncodePriority>:
  11199. {
  11200. 80051c4: b480 push {r7}
  11201. 80051c6: b089 sub sp, #36 @ 0x24
  11202. 80051c8: af00 add r7, sp, #0
  11203. 80051ca: 60f8 str r0, [r7, #12]
  11204. 80051cc: 60b9 str r1, [r7, #8]
  11205. 80051ce: 607a str r2, [r7, #4]
  11206. uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
  11207. 80051d0: 68fb ldr r3, [r7, #12]
  11208. 80051d2: f003 0307 and.w r3, r3, #7
  11209. 80051d6: 61fb str r3, [r7, #28]
  11210. PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
  11211. 80051d8: 69fb ldr r3, [r7, #28]
  11212. 80051da: f1c3 0307 rsb r3, r3, #7
  11213. 80051de: 2b04 cmp r3, #4
  11214. 80051e0: bf28 it cs
  11215. 80051e2: 2304 movcs r3, #4
  11216. 80051e4: 61bb str r3, [r7, #24]
  11217. SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
  11218. 80051e6: 69fb ldr r3, [r7, #28]
  11219. 80051e8: 3304 adds r3, #4
  11220. 80051ea: 2b06 cmp r3, #6
  11221. 80051ec: d902 bls.n 80051f4 <NVIC_EncodePriority+0x30>
  11222. 80051ee: 69fb ldr r3, [r7, #28]
  11223. 80051f0: 3b03 subs r3, #3
  11224. 80051f2: e000 b.n 80051f6 <NVIC_EncodePriority+0x32>
  11225. 80051f4: 2300 movs r3, #0
  11226. 80051f6: 617b str r3, [r7, #20]
  11227. ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
  11228. 80051f8: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  11229. 80051fc: 69bb ldr r3, [r7, #24]
  11230. 80051fe: fa02 f303 lsl.w r3, r2, r3
  11231. 8005202: 43da mvns r2, r3
  11232. 8005204: 68bb ldr r3, [r7, #8]
  11233. 8005206: 401a ands r2, r3
  11234. 8005208: 697b ldr r3, [r7, #20]
  11235. 800520a: 409a lsls r2, r3
  11236. ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL)))
  11237. 800520c: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  11238. 8005210: 697b ldr r3, [r7, #20]
  11239. 8005212: fa01 f303 lsl.w r3, r1, r3
  11240. 8005216: 43d9 mvns r1, r3
  11241. 8005218: 687b ldr r3, [r7, #4]
  11242. 800521a: 400b ands r3, r1
  11243. ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
  11244. 800521c: 4313 orrs r3, r2
  11245. }
  11246. 800521e: 4618 mov r0, r3
  11247. 8005220: 3724 adds r7, #36 @ 0x24
  11248. 8005222: 46bd mov sp, r7
  11249. 8005224: f85d 7b04 ldr.w r7, [sp], #4
  11250. 8005228: 4770 bx lr
  11251. 0800522a <HAL_NVIC_SetPriorityGrouping>:
  11252. * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible.
  11253. * The pending IRQ priority will be managed only by the subpriority.
  11254. * @retval None
  11255. */
  11256. void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
  11257. {
  11258. 800522a: b580 push {r7, lr}
  11259. 800522c: b082 sub sp, #8
  11260. 800522e: af00 add r7, sp, #0
  11261. 8005230: 6078 str r0, [r7, #4]
  11262. /* Check the parameters */
  11263. assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
  11264. /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */
  11265. NVIC_SetPriorityGrouping(PriorityGroup);
  11266. 8005232: 6878 ldr r0, [r7, #4]
  11267. 8005234: f7ff ff4c bl 80050d0 <__NVIC_SetPriorityGrouping>
  11268. }
  11269. 8005238: bf00 nop
  11270. 800523a: 3708 adds r7, #8
  11271. 800523c: 46bd mov sp, r7
  11272. 800523e: bd80 pop {r7, pc}
  11273. 08005240 <HAL_NVIC_SetPriority>:
  11274. * This parameter can be a value between 0 and 15
  11275. * A lower priority value indicates a higher priority.
  11276. * @retval None
  11277. */
  11278. void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
  11279. {
  11280. 8005240: b580 push {r7, lr}
  11281. 8005242: b086 sub sp, #24
  11282. 8005244: af00 add r7, sp, #0
  11283. 8005246: 4603 mov r3, r0
  11284. 8005248: 60b9 str r1, [r7, #8]
  11285. 800524a: 607a str r2, [r7, #4]
  11286. 800524c: 81fb strh r3, [r7, #14]
  11287. /* Check the parameters */
  11288. assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
  11289. assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
  11290. prioritygroup = NVIC_GetPriorityGrouping();
  11291. 800524e: f7ff ff63 bl 8005118 <__NVIC_GetPriorityGrouping>
  11292. 8005252: 6178 str r0, [r7, #20]
  11293. NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
  11294. 8005254: 687a ldr r2, [r7, #4]
  11295. 8005256: 68b9 ldr r1, [r7, #8]
  11296. 8005258: 6978 ldr r0, [r7, #20]
  11297. 800525a: f7ff ffb3 bl 80051c4 <NVIC_EncodePriority>
  11298. 800525e: 4602 mov r2, r0
  11299. 8005260: f9b7 300e ldrsh.w r3, [r7, #14]
  11300. 8005264: 4611 mov r1, r2
  11301. 8005266: 4618 mov r0, r3
  11302. 8005268: f7ff ff82 bl 8005170 <__NVIC_SetPriority>
  11303. }
  11304. 800526c: bf00 nop
  11305. 800526e: 3718 adds r7, #24
  11306. 8005270: 46bd mov sp, r7
  11307. 8005272: bd80 pop {r7, pc}
  11308. 08005274 <HAL_NVIC_EnableIRQ>:
  11309. * This parameter can be an enumerator of IRQn_Type enumeration
  11310. * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32h7xxxx.h))
  11311. * @retval None
  11312. */
  11313. void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
  11314. {
  11315. 8005274: b580 push {r7, lr}
  11316. 8005276: b082 sub sp, #8
  11317. 8005278: af00 add r7, sp, #0
  11318. 800527a: 4603 mov r3, r0
  11319. 800527c: 80fb strh r3, [r7, #6]
  11320. /* Check the parameters */
  11321. assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  11322. /* Enable interrupt */
  11323. NVIC_EnableIRQ(IRQn);
  11324. 800527e: f9b7 3006 ldrsh.w r3, [r7, #6]
  11325. 8005282: 4618 mov r0, r3
  11326. 8005284: f7ff ff56 bl 8005134 <__NVIC_EnableIRQ>
  11327. }
  11328. 8005288: bf00 nop
  11329. 800528a: 3708 adds r7, #8
  11330. 800528c: 46bd mov sp, r7
  11331. 800528e: bd80 pop {r7, pc}
  11332. 08005290 <HAL_MPU_Disable>:
  11333. /**
  11334. * @brief Disables the MPU
  11335. * @retval None
  11336. */
  11337. void HAL_MPU_Disable(void)
  11338. {
  11339. 8005290: b480 push {r7}
  11340. 8005292: af00 add r7, sp, #0
  11341. \details Ensures the apparent order of the explicit memory operations before
  11342. and after the instruction, without ensuring their completion.
  11343. */
  11344. __STATIC_FORCEINLINE void __DMB(void)
  11345. {
  11346. __ASM volatile ("dmb 0xF":::"memory");
  11347. 8005294: f3bf 8f5f dmb sy
  11348. }
  11349. 8005298: bf00 nop
  11350. /* Make sure outstanding transfers are done */
  11351. __DMB();
  11352. /* Disable fault exceptions */
  11353. SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
  11354. 800529a: 4b07 ldr r3, [pc, #28] @ (80052b8 <HAL_MPU_Disable+0x28>)
  11355. 800529c: 6a5b ldr r3, [r3, #36] @ 0x24
  11356. 800529e: 4a06 ldr r2, [pc, #24] @ (80052b8 <HAL_MPU_Disable+0x28>)
  11357. 80052a0: f423 3380 bic.w r3, r3, #65536 @ 0x10000
  11358. 80052a4: 6253 str r3, [r2, #36] @ 0x24
  11359. /* Disable the MPU and clear the control register*/
  11360. MPU->CTRL = 0;
  11361. 80052a6: 4b05 ldr r3, [pc, #20] @ (80052bc <HAL_MPU_Disable+0x2c>)
  11362. 80052a8: 2200 movs r2, #0
  11363. 80052aa: 605a str r2, [r3, #4]
  11364. }
  11365. 80052ac: bf00 nop
  11366. 80052ae: 46bd mov sp, r7
  11367. 80052b0: f85d 7b04 ldr.w r7, [sp], #4
  11368. 80052b4: 4770 bx lr
  11369. 80052b6: bf00 nop
  11370. 80052b8: e000ed00 .word 0xe000ed00
  11371. 80052bc: e000ed90 .word 0xe000ed90
  11372. 080052c0 <HAL_MPU_Enable>:
  11373. * @arg MPU_PRIVILEGED_DEFAULT
  11374. * @arg MPU_HFNMI_PRIVDEF
  11375. * @retval None
  11376. */
  11377. void HAL_MPU_Enable(uint32_t MPU_Control)
  11378. {
  11379. 80052c0: b480 push {r7}
  11380. 80052c2: b083 sub sp, #12
  11381. 80052c4: af00 add r7, sp, #0
  11382. 80052c6: 6078 str r0, [r7, #4]
  11383. /* Enable the MPU */
  11384. MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
  11385. 80052c8: 4a0b ldr r2, [pc, #44] @ (80052f8 <HAL_MPU_Enable+0x38>)
  11386. 80052ca: 687b ldr r3, [r7, #4]
  11387. 80052cc: f043 0301 orr.w r3, r3, #1
  11388. 80052d0: 6053 str r3, [r2, #4]
  11389. /* Enable fault exceptions */
  11390. SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
  11391. 80052d2: 4b0a ldr r3, [pc, #40] @ (80052fc <HAL_MPU_Enable+0x3c>)
  11392. 80052d4: 6a5b ldr r3, [r3, #36] @ 0x24
  11393. 80052d6: 4a09 ldr r2, [pc, #36] @ (80052fc <HAL_MPU_Enable+0x3c>)
  11394. 80052d8: f443 3380 orr.w r3, r3, #65536 @ 0x10000
  11395. 80052dc: 6253 str r3, [r2, #36] @ 0x24
  11396. __ASM volatile ("dsb 0xF":::"memory");
  11397. 80052de: f3bf 8f4f dsb sy
  11398. }
  11399. 80052e2: bf00 nop
  11400. __ASM volatile ("isb 0xF":::"memory");
  11401. 80052e4: f3bf 8f6f isb sy
  11402. }
  11403. 80052e8: bf00 nop
  11404. /* Ensure MPU setting take effects */
  11405. __DSB();
  11406. __ISB();
  11407. }
  11408. 80052ea: bf00 nop
  11409. 80052ec: 370c adds r7, #12
  11410. 80052ee: 46bd mov sp, r7
  11411. 80052f0: f85d 7b04 ldr.w r7, [sp], #4
  11412. 80052f4: 4770 bx lr
  11413. 80052f6: bf00 nop
  11414. 80052f8: e000ed90 .word 0xe000ed90
  11415. 80052fc: e000ed00 .word 0xe000ed00
  11416. 08005300 <HAL_MPU_ConfigRegion>:
  11417. * @param MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains
  11418. * the initialization and configuration information.
  11419. * @retval None
  11420. */
  11421. void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init)
  11422. {
  11423. 8005300: b480 push {r7}
  11424. 8005302: b083 sub sp, #12
  11425. 8005304: af00 add r7, sp, #0
  11426. 8005306: 6078 str r0, [r7, #4]
  11427. assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable));
  11428. assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable));
  11429. assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size));
  11430. /* Set the Region number */
  11431. MPU->RNR = MPU_Init->Number;
  11432. 8005308: 687b ldr r3, [r7, #4]
  11433. 800530a: 785a ldrb r2, [r3, #1]
  11434. 800530c: 4b1b ldr r3, [pc, #108] @ (800537c <HAL_MPU_ConfigRegion+0x7c>)
  11435. 800530e: 609a str r2, [r3, #8]
  11436. /* Disable the Region */
  11437. CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk);
  11438. 8005310: 4b1a ldr r3, [pc, #104] @ (800537c <HAL_MPU_ConfigRegion+0x7c>)
  11439. 8005312: 691b ldr r3, [r3, #16]
  11440. 8005314: 4a19 ldr r2, [pc, #100] @ (800537c <HAL_MPU_ConfigRegion+0x7c>)
  11441. 8005316: f023 0301 bic.w r3, r3, #1
  11442. 800531a: 6113 str r3, [r2, #16]
  11443. /* Apply configuration */
  11444. MPU->RBAR = MPU_Init->BaseAddress;
  11445. 800531c: 4a17 ldr r2, [pc, #92] @ (800537c <HAL_MPU_ConfigRegion+0x7c>)
  11446. 800531e: 687b ldr r3, [r7, #4]
  11447. 8005320: 685b ldr r3, [r3, #4]
  11448. 8005322: 60d3 str r3, [r2, #12]
  11449. MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) |
  11450. 8005324: 687b ldr r3, [r7, #4]
  11451. 8005326: 7b1b ldrb r3, [r3, #12]
  11452. 8005328: 071a lsls r2, r3, #28
  11453. ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) |
  11454. 800532a: 687b ldr r3, [r7, #4]
  11455. 800532c: 7adb ldrb r3, [r3, #11]
  11456. 800532e: 061b lsls r3, r3, #24
  11457. MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) |
  11458. 8005330: 431a orrs r2, r3
  11459. ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) |
  11460. 8005332: 687b ldr r3, [r7, #4]
  11461. 8005334: 7a9b ldrb r3, [r3, #10]
  11462. 8005336: 04db lsls r3, r3, #19
  11463. ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) |
  11464. 8005338: 431a orrs r2, r3
  11465. ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) |
  11466. 800533a: 687b ldr r3, [r7, #4]
  11467. 800533c: 7b5b ldrb r3, [r3, #13]
  11468. 800533e: 049b lsls r3, r3, #18
  11469. ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) |
  11470. 8005340: 431a orrs r2, r3
  11471. ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) |
  11472. 8005342: 687b ldr r3, [r7, #4]
  11473. 8005344: 7b9b ldrb r3, [r3, #14]
  11474. 8005346: 045b lsls r3, r3, #17
  11475. ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) |
  11476. 8005348: 431a orrs r2, r3
  11477. ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) |
  11478. 800534a: 687b ldr r3, [r7, #4]
  11479. 800534c: 7bdb ldrb r3, [r3, #15]
  11480. 800534e: 041b lsls r3, r3, #16
  11481. ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) |
  11482. 8005350: 431a orrs r2, r3
  11483. ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) |
  11484. 8005352: 687b ldr r3, [r7, #4]
  11485. 8005354: 7a5b ldrb r3, [r3, #9]
  11486. 8005356: 021b lsls r3, r3, #8
  11487. ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) |
  11488. 8005358: 431a orrs r2, r3
  11489. ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) |
  11490. 800535a: 687b ldr r3, [r7, #4]
  11491. 800535c: 7a1b ldrb r3, [r3, #8]
  11492. 800535e: 005b lsls r3, r3, #1
  11493. ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) |
  11494. 8005360: 4313 orrs r3, r2
  11495. ((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos);
  11496. 8005362: 687a ldr r2, [r7, #4]
  11497. 8005364: 7812 ldrb r2, [r2, #0]
  11498. 8005366: 4611 mov r1, r2
  11499. MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) |
  11500. 8005368: 4a04 ldr r2, [pc, #16] @ (800537c <HAL_MPU_ConfigRegion+0x7c>)
  11501. ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) |
  11502. 800536a: 430b orrs r3, r1
  11503. MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) |
  11504. 800536c: 6113 str r3, [r2, #16]
  11505. }
  11506. 800536e: bf00 nop
  11507. 8005370: 370c adds r7, #12
  11508. 8005372: 46bd mov sp, r7
  11509. 8005374: f85d 7b04 ldr.w r7, [sp], #4
  11510. 8005378: 4770 bx lr
  11511. 800537a: bf00 nop
  11512. 800537c: e000ed90 .word 0xe000ed90
  11513. 08005380 <HAL_CRC_Init>:
  11514. * parameters in the CRC_InitTypeDef and create the associated handle.
  11515. * @param hcrc CRC handle
  11516. * @retval HAL status
  11517. */
  11518. HAL_StatusTypeDef HAL_CRC_Init(CRC_HandleTypeDef *hcrc)
  11519. {
  11520. 8005380: b580 push {r7, lr}
  11521. 8005382: b082 sub sp, #8
  11522. 8005384: af00 add r7, sp, #0
  11523. 8005386: 6078 str r0, [r7, #4]
  11524. /* Check the CRC handle allocation */
  11525. if (hcrc == NULL)
  11526. 8005388: 687b ldr r3, [r7, #4]
  11527. 800538a: 2b00 cmp r3, #0
  11528. 800538c: d101 bne.n 8005392 <HAL_CRC_Init+0x12>
  11529. {
  11530. return HAL_ERROR;
  11531. 800538e: 2301 movs r3, #1
  11532. 8005390: e054 b.n 800543c <HAL_CRC_Init+0xbc>
  11533. }
  11534. /* Check the parameters */
  11535. assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance));
  11536. if (hcrc->State == HAL_CRC_STATE_RESET)
  11537. 8005392: 687b ldr r3, [r7, #4]
  11538. 8005394: 7f5b ldrb r3, [r3, #29]
  11539. 8005396: b2db uxtb r3, r3
  11540. 8005398: 2b00 cmp r3, #0
  11541. 800539a: d105 bne.n 80053a8 <HAL_CRC_Init+0x28>
  11542. {
  11543. /* Allocate lock resource and initialize it */
  11544. hcrc->Lock = HAL_UNLOCKED;
  11545. 800539c: 687b ldr r3, [r7, #4]
  11546. 800539e: 2200 movs r2, #0
  11547. 80053a0: 771a strb r2, [r3, #28]
  11548. /* Init the low level hardware */
  11549. HAL_CRC_MspInit(hcrc);
  11550. 80053a2: 6878 ldr r0, [r7, #4]
  11551. 80053a4: f7fd ffd0 bl 8003348 <HAL_CRC_MspInit>
  11552. }
  11553. hcrc->State = HAL_CRC_STATE_BUSY;
  11554. 80053a8: 687b ldr r3, [r7, #4]
  11555. 80053aa: 2202 movs r2, #2
  11556. 80053ac: 775a strb r2, [r3, #29]
  11557. /* check whether or not non-default generating polynomial has been
  11558. * picked up by user */
  11559. assert_param(IS_DEFAULT_POLYNOMIAL(hcrc->Init.DefaultPolynomialUse));
  11560. if (hcrc->Init.DefaultPolynomialUse == DEFAULT_POLYNOMIAL_ENABLE)
  11561. 80053ae: 687b ldr r3, [r7, #4]
  11562. 80053b0: 791b ldrb r3, [r3, #4]
  11563. 80053b2: 2b00 cmp r3, #0
  11564. 80053b4: d10c bne.n 80053d0 <HAL_CRC_Init+0x50>
  11565. {
  11566. /* initialize peripheral with default generating polynomial */
  11567. WRITE_REG(hcrc->Instance->POL, DEFAULT_CRC32_POLY);
  11568. 80053b6: 687b ldr r3, [r7, #4]
  11569. 80053b8: 681b ldr r3, [r3, #0]
  11570. 80053ba: 4a22 ldr r2, [pc, #136] @ (8005444 <HAL_CRC_Init+0xc4>)
  11571. 80053bc: 615a str r2, [r3, #20]
  11572. MODIFY_REG(hcrc->Instance->CR, CRC_CR_POLYSIZE, CRC_POLYLENGTH_32B);
  11573. 80053be: 687b ldr r3, [r7, #4]
  11574. 80053c0: 681b ldr r3, [r3, #0]
  11575. 80053c2: 689a ldr r2, [r3, #8]
  11576. 80053c4: 687b ldr r3, [r7, #4]
  11577. 80053c6: 681b ldr r3, [r3, #0]
  11578. 80053c8: f022 0218 bic.w r2, r2, #24
  11579. 80053cc: 609a str r2, [r3, #8]
  11580. 80053ce: e00c b.n 80053ea <HAL_CRC_Init+0x6a>
  11581. }
  11582. else
  11583. {
  11584. /* initialize CRC peripheral with generating polynomial defined by user */
  11585. if (HAL_CRCEx_Polynomial_Set(hcrc, hcrc->Init.GeneratingPolynomial, hcrc->Init.CRCLength) != HAL_OK)
  11586. 80053d0: 687b ldr r3, [r7, #4]
  11587. 80053d2: 6899 ldr r1, [r3, #8]
  11588. 80053d4: 687b ldr r3, [r7, #4]
  11589. 80053d6: 68db ldr r3, [r3, #12]
  11590. 80053d8: 461a mov r2, r3
  11591. 80053da: 6878 ldr r0, [r7, #4]
  11592. 80053dc: f000 f948 bl 8005670 <HAL_CRCEx_Polynomial_Set>
  11593. 80053e0: 4603 mov r3, r0
  11594. 80053e2: 2b00 cmp r3, #0
  11595. 80053e4: d001 beq.n 80053ea <HAL_CRC_Init+0x6a>
  11596. {
  11597. return HAL_ERROR;
  11598. 80053e6: 2301 movs r3, #1
  11599. 80053e8: e028 b.n 800543c <HAL_CRC_Init+0xbc>
  11600. }
  11601. /* check whether or not non-default CRC initial value has been
  11602. * picked up by user */
  11603. assert_param(IS_DEFAULT_INIT_VALUE(hcrc->Init.DefaultInitValueUse));
  11604. if (hcrc->Init.DefaultInitValueUse == DEFAULT_INIT_VALUE_ENABLE)
  11605. 80053ea: 687b ldr r3, [r7, #4]
  11606. 80053ec: 795b ldrb r3, [r3, #5]
  11607. 80053ee: 2b00 cmp r3, #0
  11608. 80053f0: d105 bne.n 80053fe <HAL_CRC_Init+0x7e>
  11609. {
  11610. WRITE_REG(hcrc->Instance->INIT, DEFAULT_CRC_INITVALUE);
  11611. 80053f2: 687b ldr r3, [r7, #4]
  11612. 80053f4: 681b ldr r3, [r3, #0]
  11613. 80053f6: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  11614. 80053fa: 611a str r2, [r3, #16]
  11615. 80053fc: e004 b.n 8005408 <HAL_CRC_Init+0x88>
  11616. }
  11617. else
  11618. {
  11619. WRITE_REG(hcrc->Instance->INIT, hcrc->Init.InitValue);
  11620. 80053fe: 687b ldr r3, [r7, #4]
  11621. 8005400: 681b ldr r3, [r3, #0]
  11622. 8005402: 687a ldr r2, [r7, #4]
  11623. 8005404: 6912 ldr r2, [r2, #16]
  11624. 8005406: 611a str r2, [r3, #16]
  11625. }
  11626. /* set input data inversion mode */
  11627. assert_param(IS_CRC_INPUTDATA_INVERSION_MODE(hcrc->Init.InputDataInversionMode));
  11628. MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_IN, hcrc->Init.InputDataInversionMode);
  11629. 8005408: 687b ldr r3, [r7, #4]
  11630. 800540a: 681b ldr r3, [r3, #0]
  11631. 800540c: 689b ldr r3, [r3, #8]
  11632. 800540e: f023 0160 bic.w r1, r3, #96 @ 0x60
  11633. 8005412: 687b ldr r3, [r7, #4]
  11634. 8005414: 695a ldr r2, [r3, #20]
  11635. 8005416: 687b ldr r3, [r7, #4]
  11636. 8005418: 681b ldr r3, [r3, #0]
  11637. 800541a: 430a orrs r2, r1
  11638. 800541c: 609a str r2, [r3, #8]
  11639. /* set output data inversion mode */
  11640. assert_param(IS_CRC_OUTPUTDATA_INVERSION_MODE(hcrc->Init.OutputDataInversionMode));
  11641. MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_OUT, hcrc->Init.OutputDataInversionMode);
  11642. 800541e: 687b ldr r3, [r7, #4]
  11643. 8005420: 681b ldr r3, [r3, #0]
  11644. 8005422: 689b ldr r3, [r3, #8]
  11645. 8005424: f023 0180 bic.w r1, r3, #128 @ 0x80
  11646. 8005428: 687b ldr r3, [r7, #4]
  11647. 800542a: 699a ldr r2, [r3, #24]
  11648. 800542c: 687b ldr r3, [r7, #4]
  11649. 800542e: 681b ldr r3, [r3, #0]
  11650. 8005430: 430a orrs r2, r1
  11651. 8005432: 609a str r2, [r3, #8]
  11652. /* makes sure the input data format (bytes, halfwords or words stream)
  11653. * is properly specified by user */
  11654. assert_param(IS_CRC_INPUTDATA_FORMAT(hcrc->InputDataFormat));
  11655. /* Change CRC peripheral state */
  11656. hcrc->State = HAL_CRC_STATE_READY;
  11657. 8005434: 687b ldr r3, [r7, #4]
  11658. 8005436: 2201 movs r2, #1
  11659. 8005438: 775a strb r2, [r3, #29]
  11660. /* Return function status */
  11661. return HAL_OK;
  11662. 800543a: 2300 movs r3, #0
  11663. }
  11664. 800543c: 4618 mov r0, r3
  11665. 800543e: 3708 adds r7, #8
  11666. 8005440: 46bd mov sp, r7
  11667. 8005442: bd80 pop {r7, pc}
  11668. 8005444: 04c11db7 .word 0x04c11db7
  11669. 08005448 <HAL_CRC_Calculate>:
  11670. * and the API will internally adjust its input data processing based on the
  11671. * handle field hcrc->InputDataFormat.
  11672. * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits)
  11673. */
  11674. uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)
  11675. {
  11676. 8005448: b580 push {r7, lr}
  11677. 800544a: b086 sub sp, #24
  11678. 800544c: af00 add r7, sp, #0
  11679. 800544e: 60f8 str r0, [r7, #12]
  11680. 8005450: 60b9 str r1, [r7, #8]
  11681. 8005452: 607a str r2, [r7, #4]
  11682. uint32_t index; /* CRC input data buffer index */
  11683. uint32_t temp = 0U; /* CRC output (read from hcrc->Instance->DR register) */
  11684. 8005454: 2300 movs r3, #0
  11685. 8005456: 613b str r3, [r7, #16]
  11686. /* Change CRC peripheral state */
  11687. hcrc->State = HAL_CRC_STATE_BUSY;
  11688. 8005458: 68fb ldr r3, [r7, #12]
  11689. 800545a: 2202 movs r2, #2
  11690. 800545c: 775a strb r2, [r3, #29]
  11691. /* Reset CRC Calculation Unit (hcrc->Instance->INIT is
  11692. * written in hcrc->Instance->DR) */
  11693. __HAL_CRC_DR_RESET(hcrc);
  11694. 800545e: 68fb ldr r3, [r7, #12]
  11695. 8005460: 681b ldr r3, [r3, #0]
  11696. 8005462: 689a ldr r2, [r3, #8]
  11697. 8005464: 68fb ldr r3, [r7, #12]
  11698. 8005466: 681b ldr r3, [r3, #0]
  11699. 8005468: f042 0201 orr.w r2, r2, #1
  11700. 800546c: 609a str r2, [r3, #8]
  11701. switch (hcrc->InputDataFormat)
  11702. 800546e: 68fb ldr r3, [r7, #12]
  11703. 8005470: 6a1b ldr r3, [r3, #32]
  11704. 8005472: 2b03 cmp r3, #3
  11705. 8005474: d006 beq.n 8005484 <HAL_CRC_Calculate+0x3c>
  11706. 8005476: 2b03 cmp r3, #3
  11707. 8005478: d829 bhi.n 80054ce <HAL_CRC_Calculate+0x86>
  11708. 800547a: 2b01 cmp r3, #1
  11709. 800547c: d019 beq.n 80054b2 <HAL_CRC_Calculate+0x6a>
  11710. 800547e: 2b02 cmp r3, #2
  11711. 8005480: d01e beq.n 80054c0 <HAL_CRC_Calculate+0x78>
  11712. /* Specific 16-bit input data handling */
  11713. temp = CRC_Handle_16(hcrc, (uint16_t *)(void *)pBuffer, BufferLength); /* Derogation MisraC2012 R.11.5 */
  11714. break;
  11715. default:
  11716. break;
  11717. 8005482: e024 b.n 80054ce <HAL_CRC_Calculate+0x86>
  11718. for (index = 0U; index < BufferLength; index++)
  11719. 8005484: 2300 movs r3, #0
  11720. 8005486: 617b str r3, [r7, #20]
  11721. 8005488: e00a b.n 80054a0 <HAL_CRC_Calculate+0x58>
  11722. hcrc->Instance->DR = pBuffer[index];
  11723. 800548a: 697b ldr r3, [r7, #20]
  11724. 800548c: 009b lsls r3, r3, #2
  11725. 800548e: 68ba ldr r2, [r7, #8]
  11726. 8005490: 441a add r2, r3
  11727. 8005492: 68fb ldr r3, [r7, #12]
  11728. 8005494: 681b ldr r3, [r3, #0]
  11729. 8005496: 6812 ldr r2, [r2, #0]
  11730. 8005498: 601a str r2, [r3, #0]
  11731. for (index = 0U; index < BufferLength; index++)
  11732. 800549a: 697b ldr r3, [r7, #20]
  11733. 800549c: 3301 adds r3, #1
  11734. 800549e: 617b str r3, [r7, #20]
  11735. 80054a0: 697a ldr r2, [r7, #20]
  11736. 80054a2: 687b ldr r3, [r7, #4]
  11737. 80054a4: 429a cmp r2, r3
  11738. 80054a6: d3f0 bcc.n 800548a <HAL_CRC_Calculate+0x42>
  11739. temp = hcrc->Instance->DR;
  11740. 80054a8: 68fb ldr r3, [r7, #12]
  11741. 80054aa: 681b ldr r3, [r3, #0]
  11742. 80054ac: 681b ldr r3, [r3, #0]
  11743. 80054ae: 613b str r3, [r7, #16]
  11744. break;
  11745. 80054b0: e00e b.n 80054d0 <HAL_CRC_Calculate+0x88>
  11746. temp = CRC_Handle_8(hcrc, (uint8_t *)pBuffer, BufferLength);
  11747. 80054b2: 687a ldr r2, [r7, #4]
  11748. 80054b4: 68b9 ldr r1, [r7, #8]
  11749. 80054b6: 68f8 ldr r0, [r7, #12]
  11750. 80054b8: f000 f812 bl 80054e0 <CRC_Handle_8>
  11751. 80054bc: 6138 str r0, [r7, #16]
  11752. break;
  11753. 80054be: e007 b.n 80054d0 <HAL_CRC_Calculate+0x88>
  11754. temp = CRC_Handle_16(hcrc, (uint16_t *)(void *)pBuffer, BufferLength); /* Derogation MisraC2012 R.11.5 */
  11755. 80054c0: 687a ldr r2, [r7, #4]
  11756. 80054c2: 68b9 ldr r1, [r7, #8]
  11757. 80054c4: 68f8 ldr r0, [r7, #12]
  11758. 80054c6: f000 f899 bl 80055fc <CRC_Handle_16>
  11759. 80054ca: 6138 str r0, [r7, #16]
  11760. break;
  11761. 80054cc: e000 b.n 80054d0 <HAL_CRC_Calculate+0x88>
  11762. break;
  11763. 80054ce: bf00 nop
  11764. }
  11765. /* Change CRC peripheral state */
  11766. hcrc->State = HAL_CRC_STATE_READY;
  11767. 80054d0: 68fb ldr r3, [r7, #12]
  11768. 80054d2: 2201 movs r2, #1
  11769. 80054d4: 775a strb r2, [r3, #29]
  11770. /* Return the CRC computed value */
  11771. return temp;
  11772. 80054d6: 693b ldr r3, [r7, #16]
  11773. }
  11774. 80054d8: 4618 mov r0, r3
  11775. 80054da: 3718 adds r7, #24
  11776. 80054dc: 46bd mov sp, r7
  11777. 80054de: bd80 pop {r7, pc}
  11778. 080054e0 <CRC_Handle_8>:
  11779. * @param pBuffer pointer to the input data buffer
  11780. * @param BufferLength input data buffer length
  11781. * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits)
  11782. */
  11783. static uint32_t CRC_Handle_8(CRC_HandleTypeDef *hcrc, uint8_t pBuffer[], uint32_t BufferLength)
  11784. {
  11785. 80054e0: b480 push {r7}
  11786. 80054e2: b089 sub sp, #36 @ 0x24
  11787. 80054e4: af00 add r7, sp, #0
  11788. 80054e6: 60f8 str r0, [r7, #12]
  11789. 80054e8: 60b9 str r1, [r7, #8]
  11790. 80054ea: 607a str r2, [r7, #4]
  11791. __IO uint16_t *pReg;
  11792. /* Processing time optimization: 4 bytes are entered in a row with a single word write,
  11793. * last bytes must be carefully fed to the CRC calculator to ensure a correct type
  11794. * handling by the peripheral */
  11795. for (i = 0U; i < (BufferLength / 4U); i++)
  11796. 80054ec: 2300 movs r3, #0
  11797. 80054ee: 61fb str r3, [r7, #28]
  11798. 80054f0: e023 b.n 800553a <CRC_Handle_8+0x5a>
  11799. {
  11800. hcrc->Instance->DR = ((uint32_t)pBuffer[4U * i] << 24U) | \
  11801. 80054f2: 69fb ldr r3, [r7, #28]
  11802. 80054f4: 009b lsls r3, r3, #2
  11803. 80054f6: 68ba ldr r2, [r7, #8]
  11804. 80054f8: 4413 add r3, r2
  11805. 80054fa: 781b ldrb r3, [r3, #0]
  11806. 80054fc: 061a lsls r2, r3, #24
  11807. ((uint32_t)pBuffer[(4U * i) + 1U] << 16U) | \
  11808. 80054fe: 69fb ldr r3, [r7, #28]
  11809. 8005500: 009b lsls r3, r3, #2
  11810. 8005502: 3301 adds r3, #1
  11811. 8005504: 68b9 ldr r1, [r7, #8]
  11812. 8005506: 440b add r3, r1
  11813. 8005508: 781b ldrb r3, [r3, #0]
  11814. 800550a: 041b lsls r3, r3, #16
  11815. hcrc->Instance->DR = ((uint32_t)pBuffer[4U * i] << 24U) | \
  11816. 800550c: 431a orrs r2, r3
  11817. ((uint32_t)pBuffer[(4U * i) + 2U] << 8U) | \
  11818. 800550e: 69fb ldr r3, [r7, #28]
  11819. 8005510: 009b lsls r3, r3, #2
  11820. 8005512: 3302 adds r3, #2
  11821. 8005514: 68b9 ldr r1, [r7, #8]
  11822. 8005516: 440b add r3, r1
  11823. 8005518: 781b ldrb r3, [r3, #0]
  11824. 800551a: 021b lsls r3, r3, #8
  11825. ((uint32_t)pBuffer[(4U * i) + 1U] << 16U) | \
  11826. 800551c: 431a orrs r2, r3
  11827. (uint32_t)pBuffer[(4U * i) + 3U];
  11828. 800551e: 69fb ldr r3, [r7, #28]
  11829. 8005520: 009b lsls r3, r3, #2
  11830. 8005522: 3303 adds r3, #3
  11831. 8005524: 68b9 ldr r1, [r7, #8]
  11832. 8005526: 440b add r3, r1
  11833. 8005528: 781b ldrb r3, [r3, #0]
  11834. 800552a: 4619 mov r1, r3
  11835. hcrc->Instance->DR = ((uint32_t)pBuffer[4U * i] << 24U) | \
  11836. 800552c: 68fb ldr r3, [r7, #12]
  11837. 800552e: 681b ldr r3, [r3, #0]
  11838. ((uint32_t)pBuffer[(4U * i) + 2U] << 8U) | \
  11839. 8005530: 430a orrs r2, r1
  11840. hcrc->Instance->DR = ((uint32_t)pBuffer[4U * i] << 24U) | \
  11841. 8005532: 601a str r2, [r3, #0]
  11842. for (i = 0U; i < (BufferLength / 4U); i++)
  11843. 8005534: 69fb ldr r3, [r7, #28]
  11844. 8005536: 3301 adds r3, #1
  11845. 8005538: 61fb str r3, [r7, #28]
  11846. 800553a: 687b ldr r3, [r7, #4]
  11847. 800553c: 089b lsrs r3, r3, #2
  11848. 800553e: 69fa ldr r2, [r7, #28]
  11849. 8005540: 429a cmp r2, r3
  11850. 8005542: d3d6 bcc.n 80054f2 <CRC_Handle_8+0x12>
  11851. }
  11852. /* last bytes specific handling */
  11853. if ((BufferLength % 4U) != 0U)
  11854. 8005544: 687b ldr r3, [r7, #4]
  11855. 8005546: f003 0303 and.w r3, r3, #3
  11856. 800554a: 2b00 cmp r3, #0
  11857. 800554c: d04d beq.n 80055ea <CRC_Handle_8+0x10a>
  11858. {
  11859. if ((BufferLength % 4U) == 1U)
  11860. 800554e: 687b ldr r3, [r7, #4]
  11861. 8005550: f003 0303 and.w r3, r3, #3
  11862. 8005554: 2b01 cmp r3, #1
  11863. 8005556: d107 bne.n 8005568 <CRC_Handle_8+0x88>
  11864. {
  11865. *(__IO uint8_t *)(__IO void *)(&hcrc->Instance->DR) = pBuffer[4U * i]; /* Derogation MisraC2012 R.11.5 */
  11866. 8005558: 69fb ldr r3, [r7, #28]
  11867. 800555a: 009b lsls r3, r3, #2
  11868. 800555c: 68ba ldr r2, [r7, #8]
  11869. 800555e: 4413 add r3, r2
  11870. 8005560: 68fa ldr r2, [r7, #12]
  11871. 8005562: 6812 ldr r2, [r2, #0]
  11872. 8005564: 781b ldrb r3, [r3, #0]
  11873. 8005566: 7013 strb r3, [r2, #0]
  11874. }
  11875. if ((BufferLength % 4U) == 2U)
  11876. 8005568: 687b ldr r3, [r7, #4]
  11877. 800556a: f003 0303 and.w r3, r3, #3
  11878. 800556e: 2b02 cmp r3, #2
  11879. 8005570: d116 bne.n 80055a0 <CRC_Handle_8+0xc0>
  11880. {
  11881. data = ((uint16_t)(pBuffer[4U * i]) << 8U) | (uint16_t)pBuffer[(4U * i) + 1U];
  11882. 8005572: 69fb ldr r3, [r7, #28]
  11883. 8005574: 009b lsls r3, r3, #2
  11884. 8005576: 68ba ldr r2, [r7, #8]
  11885. 8005578: 4413 add r3, r2
  11886. 800557a: 781b ldrb r3, [r3, #0]
  11887. 800557c: 021b lsls r3, r3, #8
  11888. 800557e: b21a sxth r2, r3
  11889. 8005580: 69fb ldr r3, [r7, #28]
  11890. 8005582: 009b lsls r3, r3, #2
  11891. 8005584: 3301 adds r3, #1
  11892. 8005586: 68b9 ldr r1, [r7, #8]
  11893. 8005588: 440b add r3, r1
  11894. 800558a: 781b ldrb r3, [r3, #0]
  11895. 800558c: b21b sxth r3, r3
  11896. 800558e: 4313 orrs r3, r2
  11897. 8005590: b21b sxth r3, r3
  11898. 8005592: 837b strh r3, [r7, #26]
  11899. pReg = (__IO uint16_t *)(__IO void *)(&hcrc->Instance->DR); /* Derogation MisraC2012 R.11.5 */
  11900. 8005594: 68fb ldr r3, [r7, #12]
  11901. 8005596: 681b ldr r3, [r3, #0]
  11902. 8005598: 617b str r3, [r7, #20]
  11903. *pReg = data;
  11904. 800559a: 697b ldr r3, [r7, #20]
  11905. 800559c: 8b7a ldrh r2, [r7, #26]
  11906. 800559e: 801a strh r2, [r3, #0]
  11907. }
  11908. if ((BufferLength % 4U) == 3U)
  11909. 80055a0: 687b ldr r3, [r7, #4]
  11910. 80055a2: f003 0303 and.w r3, r3, #3
  11911. 80055a6: 2b03 cmp r3, #3
  11912. 80055a8: d11f bne.n 80055ea <CRC_Handle_8+0x10a>
  11913. {
  11914. data = ((uint16_t)(pBuffer[4U * i]) << 8U) | (uint16_t)pBuffer[(4U * i) + 1U];
  11915. 80055aa: 69fb ldr r3, [r7, #28]
  11916. 80055ac: 009b lsls r3, r3, #2
  11917. 80055ae: 68ba ldr r2, [r7, #8]
  11918. 80055b0: 4413 add r3, r2
  11919. 80055b2: 781b ldrb r3, [r3, #0]
  11920. 80055b4: 021b lsls r3, r3, #8
  11921. 80055b6: b21a sxth r2, r3
  11922. 80055b8: 69fb ldr r3, [r7, #28]
  11923. 80055ba: 009b lsls r3, r3, #2
  11924. 80055bc: 3301 adds r3, #1
  11925. 80055be: 68b9 ldr r1, [r7, #8]
  11926. 80055c0: 440b add r3, r1
  11927. 80055c2: 781b ldrb r3, [r3, #0]
  11928. 80055c4: b21b sxth r3, r3
  11929. 80055c6: 4313 orrs r3, r2
  11930. 80055c8: b21b sxth r3, r3
  11931. 80055ca: 837b strh r3, [r7, #26]
  11932. pReg = (__IO uint16_t *)(__IO void *)(&hcrc->Instance->DR); /* Derogation MisraC2012 R.11.5 */
  11933. 80055cc: 68fb ldr r3, [r7, #12]
  11934. 80055ce: 681b ldr r3, [r3, #0]
  11935. 80055d0: 617b str r3, [r7, #20]
  11936. *pReg = data;
  11937. 80055d2: 697b ldr r3, [r7, #20]
  11938. 80055d4: 8b7a ldrh r2, [r7, #26]
  11939. 80055d6: 801a strh r2, [r3, #0]
  11940. *(__IO uint8_t *)(__IO void *)(&hcrc->Instance->DR) = pBuffer[(4U * i) + 2U]; /* Derogation MisraC2012 R.11.5 */
  11941. 80055d8: 69fb ldr r3, [r7, #28]
  11942. 80055da: 009b lsls r3, r3, #2
  11943. 80055dc: 3302 adds r3, #2
  11944. 80055de: 68ba ldr r2, [r7, #8]
  11945. 80055e0: 4413 add r3, r2
  11946. 80055e2: 68fa ldr r2, [r7, #12]
  11947. 80055e4: 6812 ldr r2, [r2, #0]
  11948. 80055e6: 781b ldrb r3, [r3, #0]
  11949. 80055e8: 7013 strb r3, [r2, #0]
  11950. }
  11951. }
  11952. /* Return the CRC computed value */
  11953. return hcrc->Instance->DR;
  11954. 80055ea: 68fb ldr r3, [r7, #12]
  11955. 80055ec: 681b ldr r3, [r3, #0]
  11956. 80055ee: 681b ldr r3, [r3, #0]
  11957. }
  11958. 80055f0: 4618 mov r0, r3
  11959. 80055f2: 3724 adds r7, #36 @ 0x24
  11960. 80055f4: 46bd mov sp, r7
  11961. 80055f6: f85d 7b04 ldr.w r7, [sp], #4
  11962. 80055fa: 4770 bx lr
  11963. 080055fc <CRC_Handle_16>:
  11964. * @param pBuffer pointer to the input data buffer
  11965. * @param BufferLength input data buffer length
  11966. * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits)
  11967. */
  11968. static uint32_t CRC_Handle_16(CRC_HandleTypeDef *hcrc, uint16_t pBuffer[], uint32_t BufferLength)
  11969. {
  11970. 80055fc: b480 push {r7}
  11971. 80055fe: b087 sub sp, #28
  11972. 8005600: af00 add r7, sp, #0
  11973. 8005602: 60f8 str r0, [r7, #12]
  11974. 8005604: 60b9 str r1, [r7, #8]
  11975. 8005606: 607a str r2, [r7, #4]
  11976. __IO uint16_t *pReg;
  11977. /* Processing time optimization: 2 HalfWords are entered in a row with a single word write,
  11978. * in case of odd length, last HalfWord must be carefully fed to the CRC calculator to ensure
  11979. * a correct type handling by the peripheral */
  11980. for (i = 0U; i < (BufferLength / 2U); i++)
  11981. 8005608: 2300 movs r3, #0
  11982. 800560a: 617b str r3, [r7, #20]
  11983. 800560c: e013 b.n 8005636 <CRC_Handle_16+0x3a>
  11984. {
  11985. hcrc->Instance->DR = ((uint32_t)pBuffer[2U * i] << 16U) | (uint32_t)pBuffer[(2U * i) + 1U];
  11986. 800560e: 697b ldr r3, [r7, #20]
  11987. 8005610: 009b lsls r3, r3, #2
  11988. 8005612: 68ba ldr r2, [r7, #8]
  11989. 8005614: 4413 add r3, r2
  11990. 8005616: 881b ldrh r3, [r3, #0]
  11991. 8005618: 041a lsls r2, r3, #16
  11992. 800561a: 697b ldr r3, [r7, #20]
  11993. 800561c: 009b lsls r3, r3, #2
  11994. 800561e: 3302 adds r3, #2
  11995. 8005620: 68b9 ldr r1, [r7, #8]
  11996. 8005622: 440b add r3, r1
  11997. 8005624: 881b ldrh r3, [r3, #0]
  11998. 8005626: 4619 mov r1, r3
  11999. 8005628: 68fb ldr r3, [r7, #12]
  12000. 800562a: 681b ldr r3, [r3, #0]
  12001. 800562c: 430a orrs r2, r1
  12002. 800562e: 601a str r2, [r3, #0]
  12003. for (i = 0U; i < (BufferLength / 2U); i++)
  12004. 8005630: 697b ldr r3, [r7, #20]
  12005. 8005632: 3301 adds r3, #1
  12006. 8005634: 617b str r3, [r7, #20]
  12007. 8005636: 687b ldr r3, [r7, #4]
  12008. 8005638: 085b lsrs r3, r3, #1
  12009. 800563a: 697a ldr r2, [r7, #20]
  12010. 800563c: 429a cmp r2, r3
  12011. 800563e: d3e6 bcc.n 800560e <CRC_Handle_16+0x12>
  12012. }
  12013. if ((BufferLength % 2U) != 0U)
  12014. 8005640: 687b ldr r3, [r7, #4]
  12015. 8005642: f003 0301 and.w r3, r3, #1
  12016. 8005646: 2b00 cmp r3, #0
  12017. 8005648: d009 beq.n 800565e <CRC_Handle_16+0x62>
  12018. {
  12019. pReg = (__IO uint16_t *)(__IO void *)(&hcrc->Instance->DR); /* Derogation MisraC2012 R.11.5 */
  12020. 800564a: 68fb ldr r3, [r7, #12]
  12021. 800564c: 681b ldr r3, [r3, #0]
  12022. 800564e: 613b str r3, [r7, #16]
  12023. *pReg = pBuffer[2U * i];
  12024. 8005650: 697b ldr r3, [r7, #20]
  12025. 8005652: 009b lsls r3, r3, #2
  12026. 8005654: 68ba ldr r2, [r7, #8]
  12027. 8005656: 4413 add r3, r2
  12028. 8005658: 881a ldrh r2, [r3, #0]
  12029. 800565a: 693b ldr r3, [r7, #16]
  12030. 800565c: 801a strh r2, [r3, #0]
  12031. }
  12032. /* Return the CRC computed value */
  12033. return hcrc->Instance->DR;
  12034. 800565e: 68fb ldr r3, [r7, #12]
  12035. 8005660: 681b ldr r3, [r3, #0]
  12036. 8005662: 681b ldr r3, [r3, #0]
  12037. }
  12038. 8005664: 4618 mov r0, r3
  12039. 8005666: 371c adds r7, #28
  12040. 8005668: 46bd mov sp, r7
  12041. 800566a: f85d 7b04 ldr.w r7, [sp], #4
  12042. 800566e: 4770 bx lr
  12043. 08005670 <HAL_CRCEx_Polynomial_Set>:
  12044. * @arg @ref CRC_POLYLENGTH_16B 16-bit long CRC (generating polynomial of degree 16)
  12045. * @arg @ref CRC_POLYLENGTH_32B 32-bit long CRC (generating polynomial of degree 32)
  12046. * @retval HAL status
  12047. */
  12048. HAL_StatusTypeDef HAL_CRCEx_Polynomial_Set(CRC_HandleTypeDef *hcrc, uint32_t Pol, uint32_t PolyLength)
  12049. {
  12050. 8005670: b480 push {r7}
  12051. 8005672: b087 sub sp, #28
  12052. 8005674: af00 add r7, sp, #0
  12053. 8005676: 60f8 str r0, [r7, #12]
  12054. 8005678: 60b9 str r1, [r7, #8]
  12055. 800567a: 607a str r2, [r7, #4]
  12056. HAL_StatusTypeDef status = HAL_OK;
  12057. 800567c: 2300 movs r3, #0
  12058. 800567e: 75fb strb r3, [r7, #23]
  12059. uint32_t msb = 31U; /* polynomial degree is 32 at most, so msb is initialized to max value */
  12060. 8005680: 231f movs r3, #31
  12061. 8005682: 613b str r3, [r7, #16]
  12062. /* Check the parameters */
  12063. assert_param(IS_CRC_POL_LENGTH(PolyLength));
  12064. /* Ensure that the generating polynomial is odd */
  12065. if ((Pol & (uint32_t)(0x1U)) == 0U)
  12066. 8005684: 68bb ldr r3, [r7, #8]
  12067. 8005686: f003 0301 and.w r3, r3, #1
  12068. 800568a: 2b00 cmp r3, #0
  12069. 800568c: d102 bne.n 8005694 <HAL_CRCEx_Polynomial_Set+0x24>
  12070. {
  12071. status = HAL_ERROR;
  12072. 800568e: 2301 movs r3, #1
  12073. 8005690: 75fb strb r3, [r7, #23]
  12074. 8005692: e063 b.n 800575c <HAL_CRCEx_Polynomial_Set+0xec>
  12075. * definition. HAL_ERROR is reported if Pol degree is
  12076. * larger than that indicated by PolyLength.
  12077. * Look for MSB position: msb will contain the degree of
  12078. * the second to the largest polynomial member. E.g., for
  12079. * X^7 + X^6 + X^5 + X^2 + 1, msb = 6. */
  12080. while ((msb-- > 0U) && ((Pol & ((uint32_t)(0x1U) << (msb & 0x1FU))) == 0U))
  12081. 8005694: bf00 nop
  12082. 8005696: 693b ldr r3, [r7, #16]
  12083. 8005698: 1e5a subs r2, r3, #1
  12084. 800569a: 613a str r2, [r7, #16]
  12085. 800569c: 2b00 cmp r3, #0
  12086. 800569e: d009 beq.n 80056b4 <HAL_CRCEx_Polynomial_Set+0x44>
  12087. 80056a0: 693b ldr r3, [r7, #16]
  12088. 80056a2: f003 031f and.w r3, r3, #31
  12089. 80056a6: 68ba ldr r2, [r7, #8]
  12090. 80056a8: fa22 f303 lsr.w r3, r2, r3
  12091. 80056ac: f003 0301 and.w r3, r3, #1
  12092. 80056b0: 2b00 cmp r3, #0
  12093. 80056b2: d0f0 beq.n 8005696 <HAL_CRCEx_Polynomial_Set+0x26>
  12094. {
  12095. }
  12096. switch (PolyLength)
  12097. 80056b4: 687b ldr r3, [r7, #4]
  12098. 80056b6: 2b18 cmp r3, #24
  12099. 80056b8: d846 bhi.n 8005748 <HAL_CRCEx_Polynomial_Set+0xd8>
  12100. 80056ba: a201 add r2, pc, #4 @ (adr r2, 80056c0 <HAL_CRCEx_Polynomial_Set+0x50>)
  12101. 80056bc: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  12102. 80056c0: 0800574f .word 0x0800574f
  12103. 80056c4: 08005749 .word 0x08005749
  12104. 80056c8: 08005749 .word 0x08005749
  12105. 80056cc: 08005749 .word 0x08005749
  12106. 80056d0: 08005749 .word 0x08005749
  12107. 80056d4: 08005749 .word 0x08005749
  12108. 80056d8: 08005749 .word 0x08005749
  12109. 80056dc: 08005749 .word 0x08005749
  12110. 80056e0: 0800573d .word 0x0800573d
  12111. 80056e4: 08005749 .word 0x08005749
  12112. 80056e8: 08005749 .word 0x08005749
  12113. 80056ec: 08005749 .word 0x08005749
  12114. 80056f0: 08005749 .word 0x08005749
  12115. 80056f4: 08005749 .word 0x08005749
  12116. 80056f8: 08005749 .word 0x08005749
  12117. 80056fc: 08005749 .word 0x08005749
  12118. 8005700: 08005731 .word 0x08005731
  12119. 8005704: 08005749 .word 0x08005749
  12120. 8005708: 08005749 .word 0x08005749
  12121. 800570c: 08005749 .word 0x08005749
  12122. 8005710: 08005749 .word 0x08005749
  12123. 8005714: 08005749 .word 0x08005749
  12124. 8005718: 08005749 .word 0x08005749
  12125. 800571c: 08005749 .word 0x08005749
  12126. 8005720: 08005725 .word 0x08005725
  12127. {
  12128. case CRC_POLYLENGTH_7B:
  12129. if (msb >= HAL_CRC_LENGTH_7B)
  12130. 8005724: 693b ldr r3, [r7, #16]
  12131. 8005726: 2b06 cmp r3, #6
  12132. 8005728: d913 bls.n 8005752 <HAL_CRCEx_Polynomial_Set+0xe2>
  12133. {
  12134. status = HAL_ERROR;
  12135. 800572a: 2301 movs r3, #1
  12136. 800572c: 75fb strb r3, [r7, #23]
  12137. }
  12138. break;
  12139. 800572e: e010 b.n 8005752 <HAL_CRCEx_Polynomial_Set+0xe2>
  12140. case CRC_POLYLENGTH_8B:
  12141. if (msb >= HAL_CRC_LENGTH_8B)
  12142. 8005730: 693b ldr r3, [r7, #16]
  12143. 8005732: 2b07 cmp r3, #7
  12144. 8005734: d90f bls.n 8005756 <HAL_CRCEx_Polynomial_Set+0xe6>
  12145. {
  12146. status = HAL_ERROR;
  12147. 8005736: 2301 movs r3, #1
  12148. 8005738: 75fb strb r3, [r7, #23]
  12149. }
  12150. break;
  12151. 800573a: e00c b.n 8005756 <HAL_CRCEx_Polynomial_Set+0xe6>
  12152. case CRC_POLYLENGTH_16B:
  12153. if (msb >= HAL_CRC_LENGTH_16B)
  12154. 800573c: 693b ldr r3, [r7, #16]
  12155. 800573e: 2b0f cmp r3, #15
  12156. 8005740: d90b bls.n 800575a <HAL_CRCEx_Polynomial_Set+0xea>
  12157. {
  12158. status = HAL_ERROR;
  12159. 8005742: 2301 movs r3, #1
  12160. 8005744: 75fb strb r3, [r7, #23]
  12161. }
  12162. break;
  12163. 8005746: e008 b.n 800575a <HAL_CRCEx_Polynomial_Set+0xea>
  12164. case CRC_POLYLENGTH_32B:
  12165. /* no polynomial definition vs. polynomial length issue possible */
  12166. break;
  12167. default:
  12168. status = HAL_ERROR;
  12169. 8005748: 2301 movs r3, #1
  12170. 800574a: 75fb strb r3, [r7, #23]
  12171. break;
  12172. 800574c: e006 b.n 800575c <HAL_CRCEx_Polynomial_Set+0xec>
  12173. break;
  12174. 800574e: bf00 nop
  12175. 8005750: e004 b.n 800575c <HAL_CRCEx_Polynomial_Set+0xec>
  12176. break;
  12177. 8005752: bf00 nop
  12178. 8005754: e002 b.n 800575c <HAL_CRCEx_Polynomial_Set+0xec>
  12179. break;
  12180. 8005756: bf00 nop
  12181. 8005758: e000 b.n 800575c <HAL_CRCEx_Polynomial_Set+0xec>
  12182. break;
  12183. 800575a: bf00 nop
  12184. }
  12185. }
  12186. if (status == HAL_OK)
  12187. 800575c: 7dfb ldrb r3, [r7, #23]
  12188. 800575e: 2b00 cmp r3, #0
  12189. 8005760: d10d bne.n 800577e <HAL_CRCEx_Polynomial_Set+0x10e>
  12190. {
  12191. /* set generating polynomial */
  12192. WRITE_REG(hcrc->Instance->POL, Pol);
  12193. 8005762: 68fb ldr r3, [r7, #12]
  12194. 8005764: 681b ldr r3, [r3, #0]
  12195. 8005766: 68ba ldr r2, [r7, #8]
  12196. 8005768: 615a str r2, [r3, #20]
  12197. /* set generating polynomial size */
  12198. MODIFY_REG(hcrc->Instance->CR, CRC_CR_POLYSIZE, PolyLength);
  12199. 800576a: 68fb ldr r3, [r7, #12]
  12200. 800576c: 681b ldr r3, [r3, #0]
  12201. 800576e: 689b ldr r3, [r3, #8]
  12202. 8005770: f023 0118 bic.w r1, r3, #24
  12203. 8005774: 68fb ldr r3, [r7, #12]
  12204. 8005776: 681b ldr r3, [r3, #0]
  12205. 8005778: 687a ldr r2, [r7, #4]
  12206. 800577a: 430a orrs r2, r1
  12207. 800577c: 609a str r2, [r3, #8]
  12208. }
  12209. /* Return function status */
  12210. return status;
  12211. 800577e: 7dfb ldrb r3, [r7, #23]
  12212. }
  12213. 8005780: 4618 mov r0, r3
  12214. 8005782: 371c adds r7, #28
  12215. 8005784: 46bd mov sp, r7
  12216. 8005786: f85d 7b04 ldr.w r7, [sp], #4
  12217. 800578a: 4770 bx lr
  12218. 0800578c <HAL_DMA_Init>:
  12219. * @param hdma: Pointer to a DMA_HandleTypeDef structure that contains
  12220. * the configuration information for the specified DMA Stream.
  12221. * @retval HAL status
  12222. */
  12223. HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma)
  12224. {
  12225. 800578c: b580 push {r7, lr}
  12226. 800578e: b086 sub sp, #24
  12227. 8005790: af00 add r7, sp, #0
  12228. 8005792: 6078 str r0, [r7, #4]
  12229. uint32_t registerValue;
  12230. uint32_t tickstart = HAL_GetTick();
  12231. 8005794: f7ff fc4c bl 8005030 <HAL_GetTick>
  12232. 8005798: 6138 str r0, [r7, #16]
  12233. DMA_Base_Registers *regs_dma;
  12234. BDMA_Base_Registers *regs_bdma;
  12235. /* Check the DMA peripheral handle */
  12236. if(hdma == NULL)
  12237. 800579a: 687b ldr r3, [r7, #4]
  12238. 800579c: 2b00 cmp r3, #0
  12239. 800579e: d101 bne.n 80057a4 <HAL_DMA_Init+0x18>
  12240. {
  12241. return HAL_ERROR;
  12242. 80057a0: 2301 movs r3, #1
  12243. 80057a2: e316 b.n 8005dd2 <HAL_DMA_Init+0x646>
  12244. assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment));
  12245. assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment));
  12246. assert_param(IS_DMA_MODE(hdma->Init.Mode));
  12247. assert_param(IS_DMA_PRIORITY(hdma->Init.Priority));
  12248. if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U) /* DMA1 or DMA2 instance */
  12249. 80057a4: 687b ldr r3, [r7, #4]
  12250. 80057a6: 681b ldr r3, [r3, #0]
  12251. 80057a8: 4a66 ldr r2, [pc, #408] @ (8005944 <HAL_DMA_Init+0x1b8>)
  12252. 80057aa: 4293 cmp r3, r2
  12253. 80057ac: d04a beq.n 8005844 <HAL_DMA_Init+0xb8>
  12254. 80057ae: 687b ldr r3, [r7, #4]
  12255. 80057b0: 681b ldr r3, [r3, #0]
  12256. 80057b2: 4a65 ldr r2, [pc, #404] @ (8005948 <HAL_DMA_Init+0x1bc>)
  12257. 80057b4: 4293 cmp r3, r2
  12258. 80057b6: d045 beq.n 8005844 <HAL_DMA_Init+0xb8>
  12259. 80057b8: 687b ldr r3, [r7, #4]
  12260. 80057ba: 681b ldr r3, [r3, #0]
  12261. 80057bc: 4a63 ldr r2, [pc, #396] @ (800594c <HAL_DMA_Init+0x1c0>)
  12262. 80057be: 4293 cmp r3, r2
  12263. 80057c0: d040 beq.n 8005844 <HAL_DMA_Init+0xb8>
  12264. 80057c2: 687b ldr r3, [r7, #4]
  12265. 80057c4: 681b ldr r3, [r3, #0]
  12266. 80057c6: 4a62 ldr r2, [pc, #392] @ (8005950 <HAL_DMA_Init+0x1c4>)
  12267. 80057c8: 4293 cmp r3, r2
  12268. 80057ca: d03b beq.n 8005844 <HAL_DMA_Init+0xb8>
  12269. 80057cc: 687b ldr r3, [r7, #4]
  12270. 80057ce: 681b ldr r3, [r3, #0]
  12271. 80057d0: 4a60 ldr r2, [pc, #384] @ (8005954 <HAL_DMA_Init+0x1c8>)
  12272. 80057d2: 4293 cmp r3, r2
  12273. 80057d4: d036 beq.n 8005844 <HAL_DMA_Init+0xb8>
  12274. 80057d6: 687b ldr r3, [r7, #4]
  12275. 80057d8: 681b ldr r3, [r3, #0]
  12276. 80057da: 4a5f ldr r2, [pc, #380] @ (8005958 <HAL_DMA_Init+0x1cc>)
  12277. 80057dc: 4293 cmp r3, r2
  12278. 80057de: d031 beq.n 8005844 <HAL_DMA_Init+0xb8>
  12279. 80057e0: 687b ldr r3, [r7, #4]
  12280. 80057e2: 681b ldr r3, [r3, #0]
  12281. 80057e4: 4a5d ldr r2, [pc, #372] @ (800595c <HAL_DMA_Init+0x1d0>)
  12282. 80057e6: 4293 cmp r3, r2
  12283. 80057e8: d02c beq.n 8005844 <HAL_DMA_Init+0xb8>
  12284. 80057ea: 687b ldr r3, [r7, #4]
  12285. 80057ec: 681b ldr r3, [r3, #0]
  12286. 80057ee: 4a5c ldr r2, [pc, #368] @ (8005960 <HAL_DMA_Init+0x1d4>)
  12287. 80057f0: 4293 cmp r3, r2
  12288. 80057f2: d027 beq.n 8005844 <HAL_DMA_Init+0xb8>
  12289. 80057f4: 687b ldr r3, [r7, #4]
  12290. 80057f6: 681b ldr r3, [r3, #0]
  12291. 80057f8: 4a5a ldr r2, [pc, #360] @ (8005964 <HAL_DMA_Init+0x1d8>)
  12292. 80057fa: 4293 cmp r3, r2
  12293. 80057fc: d022 beq.n 8005844 <HAL_DMA_Init+0xb8>
  12294. 80057fe: 687b ldr r3, [r7, #4]
  12295. 8005800: 681b ldr r3, [r3, #0]
  12296. 8005802: 4a59 ldr r2, [pc, #356] @ (8005968 <HAL_DMA_Init+0x1dc>)
  12297. 8005804: 4293 cmp r3, r2
  12298. 8005806: d01d beq.n 8005844 <HAL_DMA_Init+0xb8>
  12299. 8005808: 687b ldr r3, [r7, #4]
  12300. 800580a: 681b ldr r3, [r3, #0]
  12301. 800580c: 4a57 ldr r2, [pc, #348] @ (800596c <HAL_DMA_Init+0x1e0>)
  12302. 800580e: 4293 cmp r3, r2
  12303. 8005810: d018 beq.n 8005844 <HAL_DMA_Init+0xb8>
  12304. 8005812: 687b ldr r3, [r7, #4]
  12305. 8005814: 681b ldr r3, [r3, #0]
  12306. 8005816: 4a56 ldr r2, [pc, #344] @ (8005970 <HAL_DMA_Init+0x1e4>)
  12307. 8005818: 4293 cmp r3, r2
  12308. 800581a: d013 beq.n 8005844 <HAL_DMA_Init+0xb8>
  12309. 800581c: 687b ldr r3, [r7, #4]
  12310. 800581e: 681b ldr r3, [r3, #0]
  12311. 8005820: 4a54 ldr r2, [pc, #336] @ (8005974 <HAL_DMA_Init+0x1e8>)
  12312. 8005822: 4293 cmp r3, r2
  12313. 8005824: d00e beq.n 8005844 <HAL_DMA_Init+0xb8>
  12314. 8005826: 687b ldr r3, [r7, #4]
  12315. 8005828: 681b ldr r3, [r3, #0]
  12316. 800582a: 4a53 ldr r2, [pc, #332] @ (8005978 <HAL_DMA_Init+0x1ec>)
  12317. 800582c: 4293 cmp r3, r2
  12318. 800582e: d009 beq.n 8005844 <HAL_DMA_Init+0xb8>
  12319. 8005830: 687b ldr r3, [r7, #4]
  12320. 8005832: 681b ldr r3, [r3, #0]
  12321. 8005834: 4a51 ldr r2, [pc, #324] @ (800597c <HAL_DMA_Init+0x1f0>)
  12322. 8005836: 4293 cmp r3, r2
  12323. 8005838: d004 beq.n 8005844 <HAL_DMA_Init+0xb8>
  12324. 800583a: 687b ldr r3, [r7, #4]
  12325. 800583c: 681b ldr r3, [r3, #0]
  12326. 800583e: 4a50 ldr r2, [pc, #320] @ (8005980 <HAL_DMA_Init+0x1f4>)
  12327. 8005840: 4293 cmp r3, r2
  12328. 8005842: d101 bne.n 8005848 <HAL_DMA_Init+0xbc>
  12329. 8005844: 2301 movs r3, #1
  12330. 8005846: e000 b.n 800584a <HAL_DMA_Init+0xbe>
  12331. 8005848: 2300 movs r3, #0
  12332. 800584a: 2b00 cmp r3, #0
  12333. 800584c: f000 813b beq.w 8005ac6 <HAL_DMA_Init+0x33a>
  12334. assert_param(IS_DMA_MEMORY_BURST(hdma->Init.MemBurst));
  12335. assert_param(IS_DMA_PERIPHERAL_BURST(hdma->Init.PeriphBurst));
  12336. }
  12337. /* Change DMA peripheral state */
  12338. hdma->State = HAL_DMA_STATE_BUSY;
  12339. 8005850: 687b ldr r3, [r7, #4]
  12340. 8005852: 2202 movs r2, #2
  12341. 8005854: f883 2035 strb.w r2, [r3, #53] @ 0x35
  12342. /* Allocate lock resource */
  12343. __HAL_UNLOCK(hdma);
  12344. 8005858: 687b ldr r3, [r7, #4]
  12345. 800585a: 2200 movs r2, #0
  12346. 800585c: f883 2034 strb.w r2, [r3, #52] @ 0x34
  12347. /* Disable the peripheral */
  12348. __HAL_DMA_DISABLE(hdma);
  12349. 8005860: 687b ldr r3, [r7, #4]
  12350. 8005862: 681b ldr r3, [r3, #0]
  12351. 8005864: 4a37 ldr r2, [pc, #220] @ (8005944 <HAL_DMA_Init+0x1b8>)
  12352. 8005866: 4293 cmp r3, r2
  12353. 8005868: d04a beq.n 8005900 <HAL_DMA_Init+0x174>
  12354. 800586a: 687b ldr r3, [r7, #4]
  12355. 800586c: 681b ldr r3, [r3, #0]
  12356. 800586e: 4a36 ldr r2, [pc, #216] @ (8005948 <HAL_DMA_Init+0x1bc>)
  12357. 8005870: 4293 cmp r3, r2
  12358. 8005872: d045 beq.n 8005900 <HAL_DMA_Init+0x174>
  12359. 8005874: 687b ldr r3, [r7, #4]
  12360. 8005876: 681b ldr r3, [r3, #0]
  12361. 8005878: 4a34 ldr r2, [pc, #208] @ (800594c <HAL_DMA_Init+0x1c0>)
  12362. 800587a: 4293 cmp r3, r2
  12363. 800587c: d040 beq.n 8005900 <HAL_DMA_Init+0x174>
  12364. 800587e: 687b ldr r3, [r7, #4]
  12365. 8005880: 681b ldr r3, [r3, #0]
  12366. 8005882: 4a33 ldr r2, [pc, #204] @ (8005950 <HAL_DMA_Init+0x1c4>)
  12367. 8005884: 4293 cmp r3, r2
  12368. 8005886: d03b beq.n 8005900 <HAL_DMA_Init+0x174>
  12369. 8005888: 687b ldr r3, [r7, #4]
  12370. 800588a: 681b ldr r3, [r3, #0]
  12371. 800588c: 4a31 ldr r2, [pc, #196] @ (8005954 <HAL_DMA_Init+0x1c8>)
  12372. 800588e: 4293 cmp r3, r2
  12373. 8005890: d036 beq.n 8005900 <HAL_DMA_Init+0x174>
  12374. 8005892: 687b ldr r3, [r7, #4]
  12375. 8005894: 681b ldr r3, [r3, #0]
  12376. 8005896: 4a30 ldr r2, [pc, #192] @ (8005958 <HAL_DMA_Init+0x1cc>)
  12377. 8005898: 4293 cmp r3, r2
  12378. 800589a: d031 beq.n 8005900 <HAL_DMA_Init+0x174>
  12379. 800589c: 687b ldr r3, [r7, #4]
  12380. 800589e: 681b ldr r3, [r3, #0]
  12381. 80058a0: 4a2e ldr r2, [pc, #184] @ (800595c <HAL_DMA_Init+0x1d0>)
  12382. 80058a2: 4293 cmp r3, r2
  12383. 80058a4: d02c beq.n 8005900 <HAL_DMA_Init+0x174>
  12384. 80058a6: 687b ldr r3, [r7, #4]
  12385. 80058a8: 681b ldr r3, [r3, #0]
  12386. 80058aa: 4a2d ldr r2, [pc, #180] @ (8005960 <HAL_DMA_Init+0x1d4>)
  12387. 80058ac: 4293 cmp r3, r2
  12388. 80058ae: d027 beq.n 8005900 <HAL_DMA_Init+0x174>
  12389. 80058b0: 687b ldr r3, [r7, #4]
  12390. 80058b2: 681b ldr r3, [r3, #0]
  12391. 80058b4: 4a2b ldr r2, [pc, #172] @ (8005964 <HAL_DMA_Init+0x1d8>)
  12392. 80058b6: 4293 cmp r3, r2
  12393. 80058b8: d022 beq.n 8005900 <HAL_DMA_Init+0x174>
  12394. 80058ba: 687b ldr r3, [r7, #4]
  12395. 80058bc: 681b ldr r3, [r3, #0]
  12396. 80058be: 4a2a ldr r2, [pc, #168] @ (8005968 <HAL_DMA_Init+0x1dc>)
  12397. 80058c0: 4293 cmp r3, r2
  12398. 80058c2: d01d beq.n 8005900 <HAL_DMA_Init+0x174>
  12399. 80058c4: 687b ldr r3, [r7, #4]
  12400. 80058c6: 681b ldr r3, [r3, #0]
  12401. 80058c8: 4a28 ldr r2, [pc, #160] @ (800596c <HAL_DMA_Init+0x1e0>)
  12402. 80058ca: 4293 cmp r3, r2
  12403. 80058cc: d018 beq.n 8005900 <HAL_DMA_Init+0x174>
  12404. 80058ce: 687b ldr r3, [r7, #4]
  12405. 80058d0: 681b ldr r3, [r3, #0]
  12406. 80058d2: 4a27 ldr r2, [pc, #156] @ (8005970 <HAL_DMA_Init+0x1e4>)
  12407. 80058d4: 4293 cmp r3, r2
  12408. 80058d6: d013 beq.n 8005900 <HAL_DMA_Init+0x174>
  12409. 80058d8: 687b ldr r3, [r7, #4]
  12410. 80058da: 681b ldr r3, [r3, #0]
  12411. 80058dc: 4a25 ldr r2, [pc, #148] @ (8005974 <HAL_DMA_Init+0x1e8>)
  12412. 80058de: 4293 cmp r3, r2
  12413. 80058e0: d00e beq.n 8005900 <HAL_DMA_Init+0x174>
  12414. 80058e2: 687b ldr r3, [r7, #4]
  12415. 80058e4: 681b ldr r3, [r3, #0]
  12416. 80058e6: 4a24 ldr r2, [pc, #144] @ (8005978 <HAL_DMA_Init+0x1ec>)
  12417. 80058e8: 4293 cmp r3, r2
  12418. 80058ea: d009 beq.n 8005900 <HAL_DMA_Init+0x174>
  12419. 80058ec: 687b ldr r3, [r7, #4]
  12420. 80058ee: 681b ldr r3, [r3, #0]
  12421. 80058f0: 4a22 ldr r2, [pc, #136] @ (800597c <HAL_DMA_Init+0x1f0>)
  12422. 80058f2: 4293 cmp r3, r2
  12423. 80058f4: d004 beq.n 8005900 <HAL_DMA_Init+0x174>
  12424. 80058f6: 687b ldr r3, [r7, #4]
  12425. 80058f8: 681b ldr r3, [r3, #0]
  12426. 80058fa: 4a21 ldr r2, [pc, #132] @ (8005980 <HAL_DMA_Init+0x1f4>)
  12427. 80058fc: 4293 cmp r3, r2
  12428. 80058fe: d108 bne.n 8005912 <HAL_DMA_Init+0x186>
  12429. 8005900: 687b ldr r3, [r7, #4]
  12430. 8005902: 681b ldr r3, [r3, #0]
  12431. 8005904: 681a ldr r2, [r3, #0]
  12432. 8005906: 687b ldr r3, [r7, #4]
  12433. 8005908: 681b ldr r3, [r3, #0]
  12434. 800590a: f022 0201 bic.w r2, r2, #1
  12435. 800590e: 601a str r2, [r3, #0]
  12436. 8005910: e007 b.n 8005922 <HAL_DMA_Init+0x196>
  12437. 8005912: 687b ldr r3, [r7, #4]
  12438. 8005914: 681b ldr r3, [r3, #0]
  12439. 8005916: 681a ldr r2, [r3, #0]
  12440. 8005918: 687b ldr r3, [r7, #4]
  12441. 800591a: 681b ldr r3, [r3, #0]
  12442. 800591c: f022 0201 bic.w r2, r2, #1
  12443. 8005920: 601a str r2, [r3, #0]
  12444. /* Check if the DMA Stream is effectively disabled */
  12445. while((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_EN) != 0U)
  12446. 8005922: e02f b.n 8005984 <HAL_DMA_Init+0x1f8>
  12447. {
  12448. /* Check for the Timeout */
  12449. if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT)
  12450. 8005924: f7ff fb84 bl 8005030 <HAL_GetTick>
  12451. 8005928: 4602 mov r2, r0
  12452. 800592a: 693b ldr r3, [r7, #16]
  12453. 800592c: 1ad3 subs r3, r2, r3
  12454. 800592e: 2b05 cmp r3, #5
  12455. 8005930: d928 bls.n 8005984 <HAL_DMA_Init+0x1f8>
  12456. {
  12457. /* Update error code */
  12458. hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT;
  12459. 8005932: 687b ldr r3, [r7, #4]
  12460. 8005934: 2220 movs r2, #32
  12461. 8005936: 655a str r2, [r3, #84] @ 0x54
  12462. /* Change the DMA state */
  12463. hdma->State = HAL_DMA_STATE_ERROR;
  12464. 8005938: 687b ldr r3, [r7, #4]
  12465. 800593a: 2203 movs r2, #3
  12466. 800593c: f883 2035 strb.w r2, [r3, #53] @ 0x35
  12467. return HAL_ERROR;
  12468. 8005940: 2301 movs r3, #1
  12469. 8005942: e246 b.n 8005dd2 <HAL_DMA_Init+0x646>
  12470. 8005944: 40020010 .word 0x40020010
  12471. 8005948: 40020028 .word 0x40020028
  12472. 800594c: 40020040 .word 0x40020040
  12473. 8005950: 40020058 .word 0x40020058
  12474. 8005954: 40020070 .word 0x40020070
  12475. 8005958: 40020088 .word 0x40020088
  12476. 800595c: 400200a0 .word 0x400200a0
  12477. 8005960: 400200b8 .word 0x400200b8
  12478. 8005964: 40020410 .word 0x40020410
  12479. 8005968: 40020428 .word 0x40020428
  12480. 800596c: 40020440 .word 0x40020440
  12481. 8005970: 40020458 .word 0x40020458
  12482. 8005974: 40020470 .word 0x40020470
  12483. 8005978: 40020488 .word 0x40020488
  12484. 800597c: 400204a0 .word 0x400204a0
  12485. 8005980: 400204b8 .word 0x400204b8
  12486. while((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_EN) != 0U)
  12487. 8005984: 687b ldr r3, [r7, #4]
  12488. 8005986: 681b ldr r3, [r3, #0]
  12489. 8005988: 681b ldr r3, [r3, #0]
  12490. 800598a: f003 0301 and.w r3, r3, #1
  12491. 800598e: 2b00 cmp r3, #0
  12492. 8005990: d1c8 bne.n 8005924 <HAL_DMA_Init+0x198>
  12493. }
  12494. }
  12495. /* Get the CR register value */
  12496. registerValue = ((DMA_Stream_TypeDef *)hdma->Instance)->CR;
  12497. 8005992: 687b ldr r3, [r7, #4]
  12498. 8005994: 681b ldr r3, [r3, #0]
  12499. 8005996: 681b ldr r3, [r3, #0]
  12500. 8005998: 617b str r3, [r7, #20]
  12501. /* Clear CHSEL, MBURST, PBURST, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR, CT and DBM bits */
  12502. registerValue &= ((uint32_t)~(DMA_SxCR_MBURST | DMA_SxCR_PBURST | \
  12503. 800599a: 697a ldr r2, [r7, #20]
  12504. 800599c: 4b83 ldr r3, [pc, #524] @ (8005bac <HAL_DMA_Init+0x420>)
  12505. 800599e: 4013 ands r3, r2
  12506. 80059a0: 617b str r3, [r7, #20]
  12507. DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \
  12508. DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \
  12509. DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM));
  12510. /* Prepare the DMA Stream configuration */
  12511. registerValue |= hdma->Init.Direction |
  12512. 80059a2: 687b ldr r3, [r7, #4]
  12513. 80059a4: 689a ldr r2, [r3, #8]
  12514. hdma->Init.PeriphInc | hdma->Init.MemInc |
  12515. 80059a6: 687b ldr r3, [r7, #4]
  12516. 80059a8: 68db ldr r3, [r3, #12]
  12517. registerValue |= hdma->Init.Direction |
  12518. 80059aa: 431a orrs r2, r3
  12519. hdma->Init.PeriphInc | hdma->Init.MemInc |
  12520. 80059ac: 687b ldr r3, [r7, #4]
  12521. 80059ae: 691b ldr r3, [r3, #16]
  12522. 80059b0: 431a orrs r2, r3
  12523. hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment |
  12524. 80059b2: 687b ldr r3, [r7, #4]
  12525. 80059b4: 695b ldr r3, [r3, #20]
  12526. hdma->Init.PeriphInc | hdma->Init.MemInc |
  12527. 80059b6: 431a orrs r2, r3
  12528. hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment |
  12529. 80059b8: 687b ldr r3, [r7, #4]
  12530. 80059ba: 699b ldr r3, [r3, #24]
  12531. 80059bc: 431a orrs r2, r3
  12532. hdma->Init.Mode | hdma->Init.Priority;
  12533. 80059be: 687b ldr r3, [r7, #4]
  12534. 80059c0: 69db ldr r3, [r3, #28]
  12535. hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment |
  12536. 80059c2: 431a orrs r2, r3
  12537. hdma->Init.Mode | hdma->Init.Priority;
  12538. 80059c4: 687b ldr r3, [r7, #4]
  12539. 80059c6: 6a1b ldr r3, [r3, #32]
  12540. 80059c8: 4313 orrs r3, r2
  12541. registerValue |= hdma->Init.Direction |
  12542. 80059ca: 697a ldr r2, [r7, #20]
  12543. 80059cc: 4313 orrs r3, r2
  12544. 80059ce: 617b str r3, [r7, #20]
  12545. /* the Memory burst and peripheral burst are not used when the FIFO is disabled */
  12546. if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE)
  12547. 80059d0: 687b ldr r3, [r7, #4]
  12548. 80059d2: 6a5b ldr r3, [r3, #36] @ 0x24
  12549. 80059d4: 2b04 cmp r3, #4
  12550. 80059d6: d107 bne.n 80059e8 <HAL_DMA_Init+0x25c>
  12551. {
  12552. /* Get memory burst and peripheral burst */
  12553. registerValue |= hdma->Init.MemBurst | hdma->Init.PeriphBurst;
  12554. 80059d8: 687b ldr r3, [r7, #4]
  12555. 80059da: 6ada ldr r2, [r3, #44] @ 0x2c
  12556. 80059dc: 687b ldr r3, [r7, #4]
  12557. 80059de: 6b1b ldr r3, [r3, #48] @ 0x30
  12558. 80059e0: 4313 orrs r3, r2
  12559. 80059e2: 697a ldr r2, [r7, #20]
  12560. 80059e4: 4313 orrs r3, r2
  12561. 80059e6: 617b str r3, [r7, #20]
  12562. }
  12563. /* Work around for Errata 2.22: UART/USART- DMA transfer lock: DMA stream could be
  12564. lock when transferring data to/from USART/UART */
  12565. #if (STM32H7_DEV_ID == 0x450UL)
  12566. if((DBGMCU->IDCODE & 0xFFFF0000U) >= 0x20000000U)
  12567. 80059e8: 4b71 ldr r3, [pc, #452] @ (8005bb0 <HAL_DMA_Init+0x424>)
  12568. 80059ea: 681a ldr r2, [r3, #0]
  12569. 80059ec: 4b71 ldr r3, [pc, #452] @ (8005bb4 <HAL_DMA_Init+0x428>)
  12570. 80059ee: 4013 ands r3, r2
  12571. 80059f0: f1b3 5f00 cmp.w r3, #536870912 @ 0x20000000
  12572. 80059f4: d328 bcc.n 8005a48 <HAL_DMA_Init+0x2bc>
  12573. {
  12574. #endif /* STM32H7_DEV_ID == 0x450UL */
  12575. if(IS_DMA_UART_USART_REQUEST(hdma->Init.Request) != 0U)
  12576. 80059f6: 687b ldr r3, [r7, #4]
  12577. 80059f8: 685b ldr r3, [r3, #4]
  12578. 80059fa: 2b28 cmp r3, #40 @ 0x28
  12579. 80059fc: d903 bls.n 8005a06 <HAL_DMA_Init+0x27a>
  12580. 80059fe: 687b ldr r3, [r7, #4]
  12581. 8005a00: 685b ldr r3, [r3, #4]
  12582. 8005a02: 2b2e cmp r3, #46 @ 0x2e
  12583. 8005a04: d917 bls.n 8005a36 <HAL_DMA_Init+0x2aa>
  12584. 8005a06: 687b ldr r3, [r7, #4]
  12585. 8005a08: 685b ldr r3, [r3, #4]
  12586. 8005a0a: 2b3e cmp r3, #62 @ 0x3e
  12587. 8005a0c: d903 bls.n 8005a16 <HAL_DMA_Init+0x28a>
  12588. 8005a0e: 687b ldr r3, [r7, #4]
  12589. 8005a10: 685b ldr r3, [r3, #4]
  12590. 8005a12: 2b42 cmp r3, #66 @ 0x42
  12591. 8005a14: d90f bls.n 8005a36 <HAL_DMA_Init+0x2aa>
  12592. 8005a16: 687b ldr r3, [r7, #4]
  12593. 8005a18: 685b ldr r3, [r3, #4]
  12594. 8005a1a: 2b46 cmp r3, #70 @ 0x46
  12595. 8005a1c: d903 bls.n 8005a26 <HAL_DMA_Init+0x29a>
  12596. 8005a1e: 687b ldr r3, [r7, #4]
  12597. 8005a20: 685b ldr r3, [r3, #4]
  12598. 8005a22: 2b48 cmp r3, #72 @ 0x48
  12599. 8005a24: d907 bls.n 8005a36 <HAL_DMA_Init+0x2aa>
  12600. 8005a26: 687b ldr r3, [r7, #4]
  12601. 8005a28: 685b ldr r3, [r3, #4]
  12602. 8005a2a: 2b4e cmp r3, #78 @ 0x4e
  12603. 8005a2c: d905 bls.n 8005a3a <HAL_DMA_Init+0x2ae>
  12604. 8005a2e: 687b ldr r3, [r7, #4]
  12605. 8005a30: 685b ldr r3, [r3, #4]
  12606. 8005a32: 2b52 cmp r3, #82 @ 0x52
  12607. 8005a34: d801 bhi.n 8005a3a <HAL_DMA_Init+0x2ae>
  12608. 8005a36: 2301 movs r3, #1
  12609. 8005a38: e000 b.n 8005a3c <HAL_DMA_Init+0x2b0>
  12610. 8005a3a: 2300 movs r3, #0
  12611. 8005a3c: 2b00 cmp r3, #0
  12612. 8005a3e: d003 beq.n 8005a48 <HAL_DMA_Init+0x2bc>
  12613. {
  12614. registerValue |= DMA_SxCR_TRBUFF;
  12615. 8005a40: 697b ldr r3, [r7, #20]
  12616. 8005a42: f443 1380 orr.w r3, r3, #1048576 @ 0x100000
  12617. 8005a46: 617b str r3, [r7, #20]
  12618. #if (STM32H7_DEV_ID == 0x450UL)
  12619. }
  12620. #endif /* STM32H7_DEV_ID == 0x450UL */
  12621. /* Write to DMA Stream CR register */
  12622. ((DMA_Stream_TypeDef *)hdma->Instance)->CR = registerValue;
  12623. 8005a48: 687b ldr r3, [r7, #4]
  12624. 8005a4a: 681b ldr r3, [r3, #0]
  12625. 8005a4c: 697a ldr r2, [r7, #20]
  12626. 8005a4e: 601a str r2, [r3, #0]
  12627. /* Get the FCR register value */
  12628. registerValue = ((DMA_Stream_TypeDef *)hdma->Instance)->FCR;
  12629. 8005a50: 687b ldr r3, [r7, #4]
  12630. 8005a52: 681b ldr r3, [r3, #0]
  12631. 8005a54: 695b ldr r3, [r3, #20]
  12632. 8005a56: 617b str r3, [r7, #20]
  12633. /* Clear Direct mode and FIFO threshold bits */
  12634. registerValue &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH);
  12635. 8005a58: 697b ldr r3, [r7, #20]
  12636. 8005a5a: f023 0307 bic.w r3, r3, #7
  12637. 8005a5e: 617b str r3, [r7, #20]
  12638. /* Prepare the DMA Stream FIFO configuration */
  12639. registerValue |= hdma->Init.FIFOMode;
  12640. 8005a60: 687b ldr r3, [r7, #4]
  12641. 8005a62: 6a5b ldr r3, [r3, #36] @ 0x24
  12642. 8005a64: 697a ldr r2, [r7, #20]
  12643. 8005a66: 4313 orrs r3, r2
  12644. 8005a68: 617b str r3, [r7, #20]
  12645. /* the FIFO threshold is not used when the FIFO mode is disabled */
  12646. if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE)
  12647. 8005a6a: 687b ldr r3, [r7, #4]
  12648. 8005a6c: 6a5b ldr r3, [r3, #36] @ 0x24
  12649. 8005a6e: 2b04 cmp r3, #4
  12650. 8005a70: d117 bne.n 8005aa2 <HAL_DMA_Init+0x316>
  12651. {
  12652. /* Get the FIFO threshold */
  12653. registerValue |= hdma->Init.FIFOThreshold;
  12654. 8005a72: 687b ldr r3, [r7, #4]
  12655. 8005a74: 6a9b ldr r3, [r3, #40] @ 0x28
  12656. 8005a76: 697a ldr r2, [r7, #20]
  12657. 8005a78: 4313 orrs r3, r2
  12658. 8005a7a: 617b str r3, [r7, #20]
  12659. /* Check compatibility between FIFO threshold level and size of the memory burst */
  12660. /* for INCR4, INCR8, INCR16 */
  12661. if(hdma->Init.MemBurst != DMA_MBURST_SINGLE)
  12662. 8005a7c: 687b ldr r3, [r7, #4]
  12663. 8005a7e: 6adb ldr r3, [r3, #44] @ 0x2c
  12664. 8005a80: 2b00 cmp r3, #0
  12665. 8005a82: d00e beq.n 8005aa2 <HAL_DMA_Init+0x316>
  12666. {
  12667. if (DMA_CheckFifoParam(hdma) != HAL_OK)
  12668. 8005a84: 6878 ldr r0, [r7, #4]
  12669. 8005a86: f001 ff1d bl 80078c4 <DMA_CheckFifoParam>
  12670. 8005a8a: 4603 mov r3, r0
  12671. 8005a8c: 2b00 cmp r3, #0
  12672. 8005a8e: d008 beq.n 8005aa2 <HAL_DMA_Init+0x316>
  12673. {
  12674. /* Update error code */
  12675. hdma->ErrorCode = HAL_DMA_ERROR_PARAM;
  12676. 8005a90: 687b ldr r3, [r7, #4]
  12677. 8005a92: 2240 movs r2, #64 @ 0x40
  12678. 8005a94: 655a str r2, [r3, #84] @ 0x54
  12679. /* Change the DMA state */
  12680. hdma->State = HAL_DMA_STATE_READY;
  12681. 8005a96: 687b ldr r3, [r7, #4]
  12682. 8005a98: 2201 movs r2, #1
  12683. 8005a9a: f883 2035 strb.w r2, [r3, #53] @ 0x35
  12684. return HAL_ERROR;
  12685. 8005a9e: 2301 movs r3, #1
  12686. 8005aa0: e197 b.n 8005dd2 <HAL_DMA_Init+0x646>
  12687. }
  12688. }
  12689. }
  12690. /* Write to DMA Stream FCR */
  12691. ((DMA_Stream_TypeDef *)hdma->Instance)->FCR = registerValue;
  12692. 8005aa2: 687b ldr r3, [r7, #4]
  12693. 8005aa4: 681b ldr r3, [r3, #0]
  12694. 8005aa6: 697a ldr r2, [r7, #20]
  12695. 8005aa8: 615a str r2, [r3, #20]
  12696. /* Initialize StreamBaseAddress and StreamIndex parameters to be used to calculate
  12697. DMA steam Base Address needed by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */
  12698. regs_dma = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma);
  12699. 8005aaa: 6878 ldr r0, [r7, #4]
  12700. 8005aac: f001 fe58 bl 8007760 <DMA_CalcBaseAndBitshift>
  12701. 8005ab0: 4603 mov r3, r0
  12702. 8005ab2: 60bb str r3, [r7, #8]
  12703. /* Clear all interrupt flags */
  12704. regs_dma->IFCR = 0x3FUL << (hdma->StreamIndex & 0x1FU);
  12705. 8005ab4: 687b ldr r3, [r7, #4]
  12706. 8005ab6: 6ddb ldr r3, [r3, #92] @ 0x5c
  12707. 8005ab8: f003 031f and.w r3, r3, #31
  12708. 8005abc: 223f movs r2, #63 @ 0x3f
  12709. 8005abe: 409a lsls r2, r3
  12710. 8005ac0: 68bb ldr r3, [r7, #8]
  12711. 8005ac2: 609a str r2, [r3, #8]
  12712. 8005ac4: e0cd b.n 8005c62 <HAL_DMA_Init+0x4d6>
  12713. }
  12714. else if(IS_BDMA_CHANNEL_INSTANCE(hdma->Instance) != 0U) /* BDMA instance(s) */
  12715. 8005ac6: 687b ldr r3, [r7, #4]
  12716. 8005ac8: 681b ldr r3, [r3, #0]
  12717. 8005aca: 4a3b ldr r2, [pc, #236] @ (8005bb8 <HAL_DMA_Init+0x42c>)
  12718. 8005acc: 4293 cmp r3, r2
  12719. 8005ace: d022 beq.n 8005b16 <HAL_DMA_Init+0x38a>
  12720. 8005ad0: 687b ldr r3, [r7, #4]
  12721. 8005ad2: 681b ldr r3, [r3, #0]
  12722. 8005ad4: 4a39 ldr r2, [pc, #228] @ (8005bbc <HAL_DMA_Init+0x430>)
  12723. 8005ad6: 4293 cmp r3, r2
  12724. 8005ad8: d01d beq.n 8005b16 <HAL_DMA_Init+0x38a>
  12725. 8005ada: 687b ldr r3, [r7, #4]
  12726. 8005adc: 681b ldr r3, [r3, #0]
  12727. 8005ade: 4a38 ldr r2, [pc, #224] @ (8005bc0 <HAL_DMA_Init+0x434>)
  12728. 8005ae0: 4293 cmp r3, r2
  12729. 8005ae2: d018 beq.n 8005b16 <HAL_DMA_Init+0x38a>
  12730. 8005ae4: 687b ldr r3, [r7, #4]
  12731. 8005ae6: 681b ldr r3, [r3, #0]
  12732. 8005ae8: 4a36 ldr r2, [pc, #216] @ (8005bc4 <HAL_DMA_Init+0x438>)
  12733. 8005aea: 4293 cmp r3, r2
  12734. 8005aec: d013 beq.n 8005b16 <HAL_DMA_Init+0x38a>
  12735. 8005aee: 687b ldr r3, [r7, #4]
  12736. 8005af0: 681b ldr r3, [r3, #0]
  12737. 8005af2: 4a35 ldr r2, [pc, #212] @ (8005bc8 <HAL_DMA_Init+0x43c>)
  12738. 8005af4: 4293 cmp r3, r2
  12739. 8005af6: d00e beq.n 8005b16 <HAL_DMA_Init+0x38a>
  12740. 8005af8: 687b ldr r3, [r7, #4]
  12741. 8005afa: 681b ldr r3, [r3, #0]
  12742. 8005afc: 4a33 ldr r2, [pc, #204] @ (8005bcc <HAL_DMA_Init+0x440>)
  12743. 8005afe: 4293 cmp r3, r2
  12744. 8005b00: d009 beq.n 8005b16 <HAL_DMA_Init+0x38a>
  12745. 8005b02: 687b ldr r3, [r7, #4]
  12746. 8005b04: 681b ldr r3, [r3, #0]
  12747. 8005b06: 4a32 ldr r2, [pc, #200] @ (8005bd0 <HAL_DMA_Init+0x444>)
  12748. 8005b08: 4293 cmp r3, r2
  12749. 8005b0a: d004 beq.n 8005b16 <HAL_DMA_Init+0x38a>
  12750. 8005b0c: 687b ldr r3, [r7, #4]
  12751. 8005b0e: 681b ldr r3, [r3, #0]
  12752. 8005b10: 4a30 ldr r2, [pc, #192] @ (8005bd4 <HAL_DMA_Init+0x448>)
  12753. 8005b12: 4293 cmp r3, r2
  12754. 8005b14: d101 bne.n 8005b1a <HAL_DMA_Init+0x38e>
  12755. 8005b16: 2301 movs r3, #1
  12756. 8005b18: e000 b.n 8005b1c <HAL_DMA_Init+0x390>
  12757. 8005b1a: 2300 movs r3, #0
  12758. 8005b1c: 2b00 cmp r3, #0
  12759. 8005b1e: f000 8097 beq.w 8005c50 <HAL_DMA_Init+0x4c4>
  12760. {
  12761. if(IS_BDMA_CHANNEL_DMAMUX_INSTANCE(hdma->Instance) != 0U)
  12762. 8005b22: 687b ldr r3, [r7, #4]
  12763. 8005b24: 681b ldr r3, [r3, #0]
  12764. 8005b26: 4a24 ldr r2, [pc, #144] @ (8005bb8 <HAL_DMA_Init+0x42c>)
  12765. 8005b28: 4293 cmp r3, r2
  12766. 8005b2a: d021 beq.n 8005b70 <HAL_DMA_Init+0x3e4>
  12767. 8005b2c: 687b ldr r3, [r7, #4]
  12768. 8005b2e: 681b ldr r3, [r3, #0]
  12769. 8005b30: 4a22 ldr r2, [pc, #136] @ (8005bbc <HAL_DMA_Init+0x430>)
  12770. 8005b32: 4293 cmp r3, r2
  12771. 8005b34: d01c beq.n 8005b70 <HAL_DMA_Init+0x3e4>
  12772. 8005b36: 687b ldr r3, [r7, #4]
  12773. 8005b38: 681b ldr r3, [r3, #0]
  12774. 8005b3a: 4a21 ldr r2, [pc, #132] @ (8005bc0 <HAL_DMA_Init+0x434>)
  12775. 8005b3c: 4293 cmp r3, r2
  12776. 8005b3e: d017 beq.n 8005b70 <HAL_DMA_Init+0x3e4>
  12777. 8005b40: 687b ldr r3, [r7, #4]
  12778. 8005b42: 681b ldr r3, [r3, #0]
  12779. 8005b44: 4a1f ldr r2, [pc, #124] @ (8005bc4 <HAL_DMA_Init+0x438>)
  12780. 8005b46: 4293 cmp r3, r2
  12781. 8005b48: d012 beq.n 8005b70 <HAL_DMA_Init+0x3e4>
  12782. 8005b4a: 687b ldr r3, [r7, #4]
  12783. 8005b4c: 681b ldr r3, [r3, #0]
  12784. 8005b4e: 4a1e ldr r2, [pc, #120] @ (8005bc8 <HAL_DMA_Init+0x43c>)
  12785. 8005b50: 4293 cmp r3, r2
  12786. 8005b52: d00d beq.n 8005b70 <HAL_DMA_Init+0x3e4>
  12787. 8005b54: 687b ldr r3, [r7, #4]
  12788. 8005b56: 681b ldr r3, [r3, #0]
  12789. 8005b58: 4a1c ldr r2, [pc, #112] @ (8005bcc <HAL_DMA_Init+0x440>)
  12790. 8005b5a: 4293 cmp r3, r2
  12791. 8005b5c: d008 beq.n 8005b70 <HAL_DMA_Init+0x3e4>
  12792. 8005b5e: 687b ldr r3, [r7, #4]
  12793. 8005b60: 681b ldr r3, [r3, #0]
  12794. 8005b62: 4a1b ldr r2, [pc, #108] @ (8005bd0 <HAL_DMA_Init+0x444>)
  12795. 8005b64: 4293 cmp r3, r2
  12796. 8005b66: d003 beq.n 8005b70 <HAL_DMA_Init+0x3e4>
  12797. 8005b68: 687b ldr r3, [r7, #4]
  12798. 8005b6a: 681b ldr r3, [r3, #0]
  12799. 8005b6c: 4a19 ldr r2, [pc, #100] @ (8005bd4 <HAL_DMA_Init+0x448>)
  12800. 8005b6e: 4293 cmp r3, r2
  12801. /* Check the request parameter */
  12802. assert_param(IS_BDMA_REQUEST(hdma->Init.Request));
  12803. }
  12804. /* Change DMA peripheral state */
  12805. hdma->State = HAL_DMA_STATE_BUSY;
  12806. 8005b70: 687b ldr r3, [r7, #4]
  12807. 8005b72: 2202 movs r2, #2
  12808. 8005b74: f883 2035 strb.w r2, [r3, #53] @ 0x35
  12809. /* Allocate lock resource */
  12810. __HAL_UNLOCK(hdma);
  12811. 8005b78: 687b ldr r3, [r7, #4]
  12812. 8005b7a: 2200 movs r2, #0
  12813. 8005b7c: f883 2034 strb.w r2, [r3, #52] @ 0x34
  12814. /* Get the CR register value */
  12815. registerValue = ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR;
  12816. 8005b80: 687b ldr r3, [r7, #4]
  12817. 8005b82: 681b ldr r3, [r3, #0]
  12818. 8005b84: 681b ldr r3, [r3, #0]
  12819. 8005b86: 617b str r3, [r7, #20]
  12820. /* Clear PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR, MEM2MEM, DBM and CT bits */
  12821. registerValue &= ((uint32_t)~(BDMA_CCR_PL | BDMA_CCR_MSIZE | BDMA_CCR_PSIZE | \
  12822. 8005b88: 697a ldr r2, [r7, #20]
  12823. 8005b8a: 4b13 ldr r3, [pc, #76] @ (8005bd8 <HAL_DMA_Init+0x44c>)
  12824. 8005b8c: 4013 ands r3, r2
  12825. 8005b8e: 617b str r3, [r7, #20]
  12826. BDMA_CCR_MINC | BDMA_CCR_PINC | BDMA_CCR_CIRC | \
  12827. BDMA_CCR_DIR | BDMA_CCR_MEM2MEM | BDMA_CCR_DBM | \
  12828. BDMA_CCR_CT));
  12829. /* Prepare the DMA Channel configuration */
  12830. registerValue |= DMA_TO_BDMA_DIRECTION(hdma->Init.Direction) |
  12831. 8005b90: 687b ldr r3, [r7, #4]
  12832. 8005b92: 689b ldr r3, [r3, #8]
  12833. 8005b94: 2b40 cmp r3, #64 @ 0x40
  12834. 8005b96: d021 beq.n 8005bdc <HAL_DMA_Init+0x450>
  12835. 8005b98: 687b ldr r3, [r7, #4]
  12836. 8005b9a: 689b ldr r3, [r3, #8]
  12837. 8005b9c: 2b80 cmp r3, #128 @ 0x80
  12838. 8005b9e: d102 bne.n 8005ba6 <HAL_DMA_Init+0x41a>
  12839. 8005ba0: f44f 4380 mov.w r3, #16384 @ 0x4000
  12840. 8005ba4: e01b b.n 8005bde <HAL_DMA_Init+0x452>
  12841. 8005ba6: 2300 movs r3, #0
  12842. 8005ba8: e019 b.n 8005bde <HAL_DMA_Init+0x452>
  12843. 8005baa: bf00 nop
  12844. 8005bac: fe10803f .word 0xfe10803f
  12845. 8005bb0: 5c001000 .word 0x5c001000
  12846. 8005bb4: ffff0000 .word 0xffff0000
  12847. 8005bb8: 58025408 .word 0x58025408
  12848. 8005bbc: 5802541c .word 0x5802541c
  12849. 8005bc0: 58025430 .word 0x58025430
  12850. 8005bc4: 58025444 .word 0x58025444
  12851. 8005bc8: 58025458 .word 0x58025458
  12852. 8005bcc: 5802546c .word 0x5802546c
  12853. 8005bd0: 58025480 .word 0x58025480
  12854. 8005bd4: 58025494 .word 0x58025494
  12855. 8005bd8: fffe000f .word 0xfffe000f
  12856. 8005bdc: 2310 movs r3, #16
  12857. DMA_TO_BDMA_PERIPHERAL_INC(hdma->Init.PeriphInc) |
  12858. 8005bde: 687a ldr r2, [r7, #4]
  12859. 8005be0: 68d2 ldr r2, [r2, #12]
  12860. 8005be2: 08d2 lsrs r2, r2, #3
  12861. registerValue |= DMA_TO_BDMA_DIRECTION(hdma->Init.Direction) |
  12862. 8005be4: 431a orrs r2, r3
  12863. DMA_TO_BDMA_MEMORY_INC(hdma->Init.MemInc) |
  12864. 8005be6: 687b ldr r3, [r7, #4]
  12865. 8005be8: 691b ldr r3, [r3, #16]
  12866. 8005bea: 08db lsrs r3, r3, #3
  12867. DMA_TO_BDMA_PERIPHERAL_INC(hdma->Init.PeriphInc) |
  12868. 8005bec: 431a orrs r2, r3
  12869. DMA_TO_BDMA_PDATA_SIZE(hdma->Init.PeriphDataAlignment) |
  12870. 8005bee: 687b ldr r3, [r7, #4]
  12871. 8005bf0: 695b ldr r3, [r3, #20]
  12872. 8005bf2: 08db lsrs r3, r3, #3
  12873. DMA_TO_BDMA_MEMORY_INC(hdma->Init.MemInc) |
  12874. 8005bf4: 431a orrs r2, r3
  12875. DMA_TO_BDMA_MDATA_SIZE(hdma->Init.MemDataAlignment) |
  12876. 8005bf6: 687b ldr r3, [r7, #4]
  12877. 8005bf8: 699b ldr r3, [r3, #24]
  12878. 8005bfa: 08db lsrs r3, r3, #3
  12879. DMA_TO_BDMA_PDATA_SIZE(hdma->Init.PeriphDataAlignment) |
  12880. 8005bfc: 431a orrs r2, r3
  12881. DMA_TO_BDMA_MODE(hdma->Init.Mode) |
  12882. 8005bfe: 687b ldr r3, [r7, #4]
  12883. 8005c00: 69db ldr r3, [r3, #28]
  12884. 8005c02: 08db lsrs r3, r3, #3
  12885. DMA_TO_BDMA_MDATA_SIZE(hdma->Init.MemDataAlignment) |
  12886. 8005c04: 431a orrs r2, r3
  12887. DMA_TO_BDMA_PRIORITY(hdma->Init.Priority);
  12888. 8005c06: 687b ldr r3, [r7, #4]
  12889. 8005c08: 6a1b ldr r3, [r3, #32]
  12890. 8005c0a: 091b lsrs r3, r3, #4
  12891. DMA_TO_BDMA_MODE(hdma->Init.Mode) |
  12892. 8005c0c: 4313 orrs r3, r2
  12893. registerValue |= DMA_TO_BDMA_DIRECTION(hdma->Init.Direction) |
  12894. 8005c0e: 697a ldr r2, [r7, #20]
  12895. 8005c10: 4313 orrs r3, r2
  12896. 8005c12: 617b str r3, [r7, #20]
  12897. /* Write to DMA Channel CR register */
  12898. ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR = registerValue;
  12899. 8005c14: 687b ldr r3, [r7, #4]
  12900. 8005c16: 681b ldr r3, [r3, #0]
  12901. 8005c18: 697a ldr r2, [r7, #20]
  12902. 8005c1a: 601a str r2, [r3, #0]
  12903. /* calculation of the channel index */
  12904. hdma->StreamIndex = (((uint32_t)((uint32_t*)hdma->Instance) - (uint32_t)BDMA_Channel0) / ((uint32_t)BDMA_Channel1 - (uint32_t)BDMA_Channel0)) << 2U;
  12905. 8005c1c: 687b ldr r3, [r7, #4]
  12906. 8005c1e: 681b ldr r3, [r3, #0]
  12907. 8005c20: 461a mov r2, r3
  12908. 8005c22: 4b6e ldr r3, [pc, #440] @ (8005ddc <HAL_DMA_Init+0x650>)
  12909. 8005c24: 4413 add r3, r2
  12910. 8005c26: 4a6e ldr r2, [pc, #440] @ (8005de0 <HAL_DMA_Init+0x654>)
  12911. 8005c28: fba2 2303 umull r2, r3, r2, r3
  12912. 8005c2c: 091b lsrs r3, r3, #4
  12913. 8005c2e: 009a lsls r2, r3, #2
  12914. 8005c30: 687b ldr r3, [r7, #4]
  12915. 8005c32: 65da str r2, [r3, #92] @ 0x5c
  12916. /* Initialize StreamBaseAddress and StreamIndex parameters to be used to calculate
  12917. DMA steam Base Address needed by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */
  12918. regs_bdma = (BDMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma);
  12919. 8005c34: 6878 ldr r0, [r7, #4]
  12920. 8005c36: f001 fd93 bl 8007760 <DMA_CalcBaseAndBitshift>
  12921. 8005c3a: 4603 mov r3, r0
  12922. 8005c3c: 60fb str r3, [r7, #12]
  12923. /* Clear all interrupt flags */
  12924. regs_bdma->IFCR = ((BDMA_IFCR_CGIF0) << (hdma->StreamIndex & 0x1FU));
  12925. 8005c3e: 687b ldr r3, [r7, #4]
  12926. 8005c40: 6ddb ldr r3, [r3, #92] @ 0x5c
  12927. 8005c42: f003 031f and.w r3, r3, #31
  12928. 8005c46: 2201 movs r2, #1
  12929. 8005c48: 409a lsls r2, r3
  12930. 8005c4a: 68fb ldr r3, [r7, #12]
  12931. 8005c4c: 605a str r2, [r3, #4]
  12932. 8005c4e: e008 b.n 8005c62 <HAL_DMA_Init+0x4d6>
  12933. }
  12934. else
  12935. {
  12936. hdma->ErrorCode = HAL_DMA_ERROR_PARAM;
  12937. 8005c50: 687b ldr r3, [r7, #4]
  12938. 8005c52: 2240 movs r2, #64 @ 0x40
  12939. 8005c54: 655a str r2, [r3, #84] @ 0x54
  12940. hdma->State = HAL_DMA_STATE_ERROR;
  12941. 8005c56: 687b ldr r3, [r7, #4]
  12942. 8005c58: 2203 movs r2, #3
  12943. 8005c5a: f883 2035 strb.w r2, [r3, #53] @ 0x35
  12944. return HAL_ERROR;
  12945. 8005c5e: 2301 movs r3, #1
  12946. 8005c60: e0b7 b.n 8005dd2 <HAL_DMA_Init+0x646>
  12947. }
  12948. if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U) /* No DMAMUX available for BDMA1 */
  12949. 8005c62: 687b ldr r3, [r7, #4]
  12950. 8005c64: 681b ldr r3, [r3, #0]
  12951. 8005c66: 4a5f ldr r2, [pc, #380] @ (8005de4 <HAL_DMA_Init+0x658>)
  12952. 8005c68: 4293 cmp r3, r2
  12953. 8005c6a: d072 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  12954. 8005c6c: 687b ldr r3, [r7, #4]
  12955. 8005c6e: 681b ldr r3, [r3, #0]
  12956. 8005c70: 4a5d ldr r2, [pc, #372] @ (8005de8 <HAL_DMA_Init+0x65c>)
  12957. 8005c72: 4293 cmp r3, r2
  12958. 8005c74: d06d beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  12959. 8005c76: 687b ldr r3, [r7, #4]
  12960. 8005c78: 681b ldr r3, [r3, #0]
  12961. 8005c7a: 4a5c ldr r2, [pc, #368] @ (8005dec <HAL_DMA_Init+0x660>)
  12962. 8005c7c: 4293 cmp r3, r2
  12963. 8005c7e: d068 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  12964. 8005c80: 687b ldr r3, [r7, #4]
  12965. 8005c82: 681b ldr r3, [r3, #0]
  12966. 8005c84: 4a5a ldr r2, [pc, #360] @ (8005df0 <HAL_DMA_Init+0x664>)
  12967. 8005c86: 4293 cmp r3, r2
  12968. 8005c88: d063 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  12969. 8005c8a: 687b ldr r3, [r7, #4]
  12970. 8005c8c: 681b ldr r3, [r3, #0]
  12971. 8005c8e: 4a59 ldr r2, [pc, #356] @ (8005df4 <HAL_DMA_Init+0x668>)
  12972. 8005c90: 4293 cmp r3, r2
  12973. 8005c92: d05e beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  12974. 8005c94: 687b ldr r3, [r7, #4]
  12975. 8005c96: 681b ldr r3, [r3, #0]
  12976. 8005c98: 4a57 ldr r2, [pc, #348] @ (8005df8 <HAL_DMA_Init+0x66c>)
  12977. 8005c9a: 4293 cmp r3, r2
  12978. 8005c9c: d059 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  12979. 8005c9e: 687b ldr r3, [r7, #4]
  12980. 8005ca0: 681b ldr r3, [r3, #0]
  12981. 8005ca2: 4a56 ldr r2, [pc, #344] @ (8005dfc <HAL_DMA_Init+0x670>)
  12982. 8005ca4: 4293 cmp r3, r2
  12983. 8005ca6: d054 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  12984. 8005ca8: 687b ldr r3, [r7, #4]
  12985. 8005caa: 681b ldr r3, [r3, #0]
  12986. 8005cac: 4a54 ldr r2, [pc, #336] @ (8005e00 <HAL_DMA_Init+0x674>)
  12987. 8005cae: 4293 cmp r3, r2
  12988. 8005cb0: d04f beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  12989. 8005cb2: 687b ldr r3, [r7, #4]
  12990. 8005cb4: 681b ldr r3, [r3, #0]
  12991. 8005cb6: 4a53 ldr r2, [pc, #332] @ (8005e04 <HAL_DMA_Init+0x678>)
  12992. 8005cb8: 4293 cmp r3, r2
  12993. 8005cba: d04a beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  12994. 8005cbc: 687b ldr r3, [r7, #4]
  12995. 8005cbe: 681b ldr r3, [r3, #0]
  12996. 8005cc0: 4a51 ldr r2, [pc, #324] @ (8005e08 <HAL_DMA_Init+0x67c>)
  12997. 8005cc2: 4293 cmp r3, r2
  12998. 8005cc4: d045 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  12999. 8005cc6: 687b ldr r3, [r7, #4]
  13000. 8005cc8: 681b ldr r3, [r3, #0]
  13001. 8005cca: 4a50 ldr r2, [pc, #320] @ (8005e0c <HAL_DMA_Init+0x680>)
  13002. 8005ccc: 4293 cmp r3, r2
  13003. 8005cce: d040 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13004. 8005cd0: 687b ldr r3, [r7, #4]
  13005. 8005cd2: 681b ldr r3, [r3, #0]
  13006. 8005cd4: 4a4e ldr r2, [pc, #312] @ (8005e10 <HAL_DMA_Init+0x684>)
  13007. 8005cd6: 4293 cmp r3, r2
  13008. 8005cd8: d03b beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13009. 8005cda: 687b ldr r3, [r7, #4]
  13010. 8005cdc: 681b ldr r3, [r3, #0]
  13011. 8005cde: 4a4d ldr r2, [pc, #308] @ (8005e14 <HAL_DMA_Init+0x688>)
  13012. 8005ce0: 4293 cmp r3, r2
  13013. 8005ce2: d036 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13014. 8005ce4: 687b ldr r3, [r7, #4]
  13015. 8005ce6: 681b ldr r3, [r3, #0]
  13016. 8005ce8: 4a4b ldr r2, [pc, #300] @ (8005e18 <HAL_DMA_Init+0x68c>)
  13017. 8005cea: 4293 cmp r3, r2
  13018. 8005cec: d031 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13019. 8005cee: 687b ldr r3, [r7, #4]
  13020. 8005cf0: 681b ldr r3, [r3, #0]
  13021. 8005cf2: 4a4a ldr r2, [pc, #296] @ (8005e1c <HAL_DMA_Init+0x690>)
  13022. 8005cf4: 4293 cmp r3, r2
  13023. 8005cf6: d02c beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13024. 8005cf8: 687b ldr r3, [r7, #4]
  13025. 8005cfa: 681b ldr r3, [r3, #0]
  13026. 8005cfc: 4a48 ldr r2, [pc, #288] @ (8005e20 <HAL_DMA_Init+0x694>)
  13027. 8005cfe: 4293 cmp r3, r2
  13028. 8005d00: d027 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13029. 8005d02: 687b ldr r3, [r7, #4]
  13030. 8005d04: 681b ldr r3, [r3, #0]
  13031. 8005d06: 4a47 ldr r2, [pc, #284] @ (8005e24 <HAL_DMA_Init+0x698>)
  13032. 8005d08: 4293 cmp r3, r2
  13033. 8005d0a: d022 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13034. 8005d0c: 687b ldr r3, [r7, #4]
  13035. 8005d0e: 681b ldr r3, [r3, #0]
  13036. 8005d10: 4a45 ldr r2, [pc, #276] @ (8005e28 <HAL_DMA_Init+0x69c>)
  13037. 8005d12: 4293 cmp r3, r2
  13038. 8005d14: d01d beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13039. 8005d16: 687b ldr r3, [r7, #4]
  13040. 8005d18: 681b ldr r3, [r3, #0]
  13041. 8005d1a: 4a44 ldr r2, [pc, #272] @ (8005e2c <HAL_DMA_Init+0x6a0>)
  13042. 8005d1c: 4293 cmp r3, r2
  13043. 8005d1e: d018 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13044. 8005d20: 687b ldr r3, [r7, #4]
  13045. 8005d22: 681b ldr r3, [r3, #0]
  13046. 8005d24: 4a42 ldr r2, [pc, #264] @ (8005e30 <HAL_DMA_Init+0x6a4>)
  13047. 8005d26: 4293 cmp r3, r2
  13048. 8005d28: d013 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13049. 8005d2a: 687b ldr r3, [r7, #4]
  13050. 8005d2c: 681b ldr r3, [r3, #0]
  13051. 8005d2e: 4a41 ldr r2, [pc, #260] @ (8005e34 <HAL_DMA_Init+0x6a8>)
  13052. 8005d30: 4293 cmp r3, r2
  13053. 8005d32: d00e beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13054. 8005d34: 687b ldr r3, [r7, #4]
  13055. 8005d36: 681b ldr r3, [r3, #0]
  13056. 8005d38: 4a3f ldr r2, [pc, #252] @ (8005e38 <HAL_DMA_Init+0x6ac>)
  13057. 8005d3a: 4293 cmp r3, r2
  13058. 8005d3c: d009 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13059. 8005d3e: 687b ldr r3, [r7, #4]
  13060. 8005d40: 681b ldr r3, [r3, #0]
  13061. 8005d42: 4a3e ldr r2, [pc, #248] @ (8005e3c <HAL_DMA_Init+0x6b0>)
  13062. 8005d44: 4293 cmp r3, r2
  13063. 8005d46: d004 beq.n 8005d52 <HAL_DMA_Init+0x5c6>
  13064. 8005d48: 687b ldr r3, [r7, #4]
  13065. 8005d4a: 681b ldr r3, [r3, #0]
  13066. 8005d4c: 4a3c ldr r2, [pc, #240] @ (8005e40 <HAL_DMA_Init+0x6b4>)
  13067. 8005d4e: 4293 cmp r3, r2
  13068. 8005d50: d101 bne.n 8005d56 <HAL_DMA_Init+0x5ca>
  13069. 8005d52: 2301 movs r3, #1
  13070. 8005d54: e000 b.n 8005d58 <HAL_DMA_Init+0x5cc>
  13071. 8005d56: 2300 movs r3, #0
  13072. 8005d58: 2b00 cmp r3, #0
  13073. 8005d5a: d032 beq.n 8005dc2 <HAL_DMA_Init+0x636>
  13074. {
  13075. /* Initialize parameters for DMAMUX channel :
  13076. DMAmuxChannel, DMAmuxChannelStatus and DMAmuxChannelStatusMask
  13077. */
  13078. DMA_CalcDMAMUXChannelBaseAndMask(hdma);
  13079. 8005d5c: 6878 ldr r0, [r7, #4]
  13080. 8005d5e: f001 fe2d bl 80079bc <DMA_CalcDMAMUXChannelBaseAndMask>
  13081. if(hdma->Init.Direction == DMA_MEMORY_TO_MEMORY)
  13082. 8005d62: 687b ldr r3, [r7, #4]
  13083. 8005d64: 689b ldr r3, [r3, #8]
  13084. 8005d66: 2b80 cmp r3, #128 @ 0x80
  13085. 8005d68: d102 bne.n 8005d70 <HAL_DMA_Init+0x5e4>
  13086. {
  13087. /* if memory to memory force the request to 0*/
  13088. hdma->Init.Request = DMA_REQUEST_MEM2MEM;
  13089. 8005d6a: 687b ldr r3, [r7, #4]
  13090. 8005d6c: 2200 movs r2, #0
  13091. 8005d6e: 605a str r2, [r3, #4]
  13092. }
  13093. /* Set peripheral request to DMAMUX channel */
  13094. hdma->DMAmuxChannel->CCR = (hdma->Init.Request & DMAMUX_CxCR_DMAREQ_ID);
  13095. 8005d70: 687b ldr r3, [r7, #4]
  13096. 8005d72: 685a ldr r2, [r3, #4]
  13097. 8005d74: 687b ldr r3, [r7, #4]
  13098. 8005d76: 6e1b ldr r3, [r3, #96] @ 0x60
  13099. 8005d78: b2d2 uxtb r2, r2
  13100. 8005d7a: 601a str r2, [r3, #0]
  13101. /* Clear the DMAMUX synchro overrun flag */
  13102. hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;
  13103. 8005d7c: 687b ldr r3, [r7, #4]
  13104. 8005d7e: 6e5b ldr r3, [r3, #100] @ 0x64
  13105. 8005d80: 687a ldr r2, [r7, #4]
  13106. 8005d82: 6e92 ldr r2, [r2, #104] @ 0x68
  13107. 8005d84: 605a str r2, [r3, #4]
  13108. /* Initialize parameters for DMAMUX request generator :
  13109. if the DMA request is DMA_REQUEST_GENERATOR0 to DMA_REQUEST_GENERATOR7
  13110. */
  13111. if((hdma->Init.Request >= DMA_REQUEST_GENERATOR0) && (hdma->Init.Request <= DMA_REQUEST_GENERATOR7))
  13112. 8005d86: 687b ldr r3, [r7, #4]
  13113. 8005d88: 685b ldr r3, [r3, #4]
  13114. 8005d8a: 2b00 cmp r3, #0
  13115. 8005d8c: d010 beq.n 8005db0 <HAL_DMA_Init+0x624>
  13116. 8005d8e: 687b ldr r3, [r7, #4]
  13117. 8005d90: 685b ldr r3, [r3, #4]
  13118. 8005d92: 2b08 cmp r3, #8
  13119. 8005d94: d80c bhi.n 8005db0 <HAL_DMA_Init+0x624>
  13120. {
  13121. /* Initialize parameters for DMAMUX request generator :
  13122. DMAmuxRequestGen, DMAmuxRequestGenStatus and DMAmuxRequestGenStatusMask */
  13123. DMA_CalcDMAMUXRequestGenBaseAndMask(hdma);
  13124. 8005d96: 6878 ldr r0, [r7, #4]
  13125. 8005d98: f001 feaa bl 8007af0 <DMA_CalcDMAMUXRequestGenBaseAndMask>
  13126. /* Reset the DMAMUX request generator register */
  13127. hdma->DMAmuxRequestGen->RGCR = 0U;
  13128. 8005d9c: 687b ldr r3, [r7, #4]
  13129. 8005d9e: 6edb ldr r3, [r3, #108] @ 0x6c
  13130. 8005da0: 2200 movs r2, #0
  13131. 8005da2: 601a str r2, [r3, #0]
  13132. /* Clear the DMAMUX request generator overrun flag */
  13133. hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;
  13134. 8005da4: 687b ldr r3, [r7, #4]
  13135. 8005da6: 6f1b ldr r3, [r3, #112] @ 0x70
  13136. 8005da8: 687a ldr r2, [r7, #4]
  13137. 8005daa: 6f52 ldr r2, [r2, #116] @ 0x74
  13138. 8005dac: 605a str r2, [r3, #4]
  13139. 8005dae: e008 b.n 8005dc2 <HAL_DMA_Init+0x636>
  13140. }
  13141. else
  13142. {
  13143. hdma->DMAmuxRequestGen = 0U;
  13144. 8005db0: 687b ldr r3, [r7, #4]
  13145. 8005db2: 2200 movs r2, #0
  13146. 8005db4: 66da str r2, [r3, #108] @ 0x6c
  13147. hdma->DMAmuxRequestGenStatus = 0U;
  13148. 8005db6: 687b ldr r3, [r7, #4]
  13149. 8005db8: 2200 movs r2, #0
  13150. 8005dba: 671a str r2, [r3, #112] @ 0x70
  13151. hdma->DMAmuxRequestGenStatusMask = 0U;
  13152. 8005dbc: 687b ldr r3, [r7, #4]
  13153. 8005dbe: 2200 movs r2, #0
  13154. 8005dc0: 675a str r2, [r3, #116] @ 0x74
  13155. }
  13156. }
  13157. /* Initialize the error code */
  13158. hdma->ErrorCode = HAL_DMA_ERROR_NONE;
  13159. 8005dc2: 687b ldr r3, [r7, #4]
  13160. 8005dc4: 2200 movs r2, #0
  13161. 8005dc6: 655a str r2, [r3, #84] @ 0x54
  13162. /* Initialize the DMA state */
  13163. hdma->State = HAL_DMA_STATE_READY;
  13164. 8005dc8: 687b ldr r3, [r7, #4]
  13165. 8005dca: 2201 movs r2, #1
  13166. 8005dcc: f883 2035 strb.w r2, [r3, #53] @ 0x35
  13167. return HAL_OK;
  13168. 8005dd0: 2300 movs r3, #0
  13169. }
  13170. 8005dd2: 4618 mov r0, r3
  13171. 8005dd4: 3718 adds r7, #24
  13172. 8005dd6: 46bd mov sp, r7
  13173. 8005dd8: bd80 pop {r7, pc}
  13174. 8005dda: bf00 nop
  13175. 8005ddc: a7fdabf8 .word 0xa7fdabf8
  13176. 8005de0: cccccccd .word 0xcccccccd
  13177. 8005de4: 40020010 .word 0x40020010
  13178. 8005de8: 40020028 .word 0x40020028
  13179. 8005dec: 40020040 .word 0x40020040
  13180. 8005df0: 40020058 .word 0x40020058
  13181. 8005df4: 40020070 .word 0x40020070
  13182. 8005df8: 40020088 .word 0x40020088
  13183. 8005dfc: 400200a0 .word 0x400200a0
  13184. 8005e00: 400200b8 .word 0x400200b8
  13185. 8005e04: 40020410 .word 0x40020410
  13186. 8005e08: 40020428 .word 0x40020428
  13187. 8005e0c: 40020440 .word 0x40020440
  13188. 8005e10: 40020458 .word 0x40020458
  13189. 8005e14: 40020470 .word 0x40020470
  13190. 8005e18: 40020488 .word 0x40020488
  13191. 8005e1c: 400204a0 .word 0x400204a0
  13192. 8005e20: 400204b8 .word 0x400204b8
  13193. 8005e24: 58025408 .word 0x58025408
  13194. 8005e28: 5802541c .word 0x5802541c
  13195. 8005e2c: 58025430 .word 0x58025430
  13196. 8005e30: 58025444 .word 0x58025444
  13197. 8005e34: 58025458 .word 0x58025458
  13198. 8005e38: 5802546c .word 0x5802546c
  13199. 8005e3c: 58025480 .word 0x58025480
  13200. 8005e40: 58025494 .word 0x58025494
  13201. 08005e44 <HAL_DMA_Abort>:
  13202. * and the Stream will be effectively disabled only after the transfer of
  13203. * this single data is finished.
  13204. * @retval HAL status
  13205. */
  13206. HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
  13207. {
  13208. 8005e44: b580 push {r7, lr}
  13209. 8005e46: b086 sub sp, #24
  13210. 8005e48: af00 add r7, sp, #0
  13211. 8005e4a: 6078 str r0, [r7, #4]
  13212. /* calculate DMA base and stream number */
  13213. DMA_Base_Registers *regs_dma;
  13214. BDMA_Base_Registers *regs_bdma;
  13215. const __IO uint32_t *enableRegister;
  13216. uint32_t tickstart = HAL_GetTick();
  13217. 8005e4c: f7ff f8f0 bl 8005030 <HAL_GetTick>
  13218. 8005e50: 6138 str r0, [r7, #16]
  13219. /* Check the DMA peripheral handle */
  13220. if(hdma == NULL)
  13221. 8005e52: 687b ldr r3, [r7, #4]
  13222. 8005e54: 2b00 cmp r3, #0
  13223. 8005e56: d101 bne.n 8005e5c <HAL_DMA_Abort+0x18>
  13224. {
  13225. return HAL_ERROR;
  13226. 8005e58: 2301 movs r3, #1
  13227. 8005e5a: e2dc b.n 8006416 <HAL_DMA_Abort+0x5d2>
  13228. }
  13229. /* Check the DMA peripheral state */
  13230. if(hdma->State != HAL_DMA_STATE_BUSY)
  13231. 8005e5c: 687b ldr r3, [r7, #4]
  13232. 8005e5e: f893 3035 ldrb.w r3, [r3, #53] @ 0x35
  13233. 8005e62: b2db uxtb r3, r3
  13234. 8005e64: 2b02 cmp r3, #2
  13235. 8005e66: d008 beq.n 8005e7a <HAL_DMA_Abort+0x36>
  13236. {
  13237. hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER;
  13238. 8005e68: 687b ldr r3, [r7, #4]
  13239. 8005e6a: 2280 movs r2, #128 @ 0x80
  13240. 8005e6c: 655a str r2, [r3, #84] @ 0x54
  13241. /* Process Unlocked */
  13242. __HAL_UNLOCK(hdma);
  13243. 8005e6e: 687b ldr r3, [r7, #4]
  13244. 8005e70: 2200 movs r2, #0
  13245. 8005e72: f883 2034 strb.w r2, [r3, #52] @ 0x34
  13246. return HAL_ERROR;
  13247. 8005e76: 2301 movs r3, #1
  13248. 8005e78: e2cd b.n 8006416 <HAL_DMA_Abort+0x5d2>
  13249. }
  13250. else
  13251. {
  13252. /* Disable all the transfer interrupts */
  13253. if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U) /* DMA1 or DMA2 instance */
  13254. 8005e7a: 687b ldr r3, [r7, #4]
  13255. 8005e7c: 681b ldr r3, [r3, #0]
  13256. 8005e7e: 4a76 ldr r2, [pc, #472] @ (8006058 <HAL_DMA_Abort+0x214>)
  13257. 8005e80: 4293 cmp r3, r2
  13258. 8005e82: d04a beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13259. 8005e84: 687b ldr r3, [r7, #4]
  13260. 8005e86: 681b ldr r3, [r3, #0]
  13261. 8005e88: 4a74 ldr r2, [pc, #464] @ (800605c <HAL_DMA_Abort+0x218>)
  13262. 8005e8a: 4293 cmp r3, r2
  13263. 8005e8c: d045 beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13264. 8005e8e: 687b ldr r3, [r7, #4]
  13265. 8005e90: 681b ldr r3, [r3, #0]
  13266. 8005e92: 4a73 ldr r2, [pc, #460] @ (8006060 <HAL_DMA_Abort+0x21c>)
  13267. 8005e94: 4293 cmp r3, r2
  13268. 8005e96: d040 beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13269. 8005e98: 687b ldr r3, [r7, #4]
  13270. 8005e9a: 681b ldr r3, [r3, #0]
  13271. 8005e9c: 4a71 ldr r2, [pc, #452] @ (8006064 <HAL_DMA_Abort+0x220>)
  13272. 8005e9e: 4293 cmp r3, r2
  13273. 8005ea0: d03b beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13274. 8005ea2: 687b ldr r3, [r7, #4]
  13275. 8005ea4: 681b ldr r3, [r3, #0]
  13276. 8005ea6: 4a70 ldr r2, [pc, #448] @ (8006068 <HAL_DMA_Abort+0x224>)
  13277. 8005ea8: 4293 cmp r3, r2
  13278. 8005eaa: d036 beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13279. 8005eac: 687b ldr r3, [r7, #4]
  13280. 8005eae: 681b ldr r3, [r3, #0]
  13281. 8005eb0: 4a6e ldr r2, [pc, #440] @ (800606c <HAL_DMA_Abort+0x228>)
  13282. 8005eb2: 4293 cmp r3, r2
  13283. 8005eb4: d031 beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13284. 8005eb6: 687b ldr r3, [r7, #4]
  13285. 8005eb8: 681b ldr r3, [r3, #0]
  13286. 8005eba: 4a6d ldr r2, [pc, #436] @ (8006070 <HAL_DMA_Abort+0x22c>)
  13287. 8005ebc: 4293 cmp r3, r2
  13288. 8005ebe: d02c beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13289. 8005ec0: 687b ldr r3, [r7, #4]
  13290. 8005ec2: 681b ldr r3, [r3, #0]
  13291. 8005ec4: 4a6b ldr r2, [pc, #428] @ (8006074 <HAL_DMA_Abort+0x230>)
  13292. 8005ec6: 4293 cmp r3, r2
  13293. 8005ec8: d027 beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13294. 8005eca: 687b ldr r3, [r7, #4]
  13295. 8005ecc: 681b ldr r3, [r3, #0]
  13296. 8005ece: 4a6a ldr r2, [pc, #424] @ (8006078 <HAL_DMA_Abort+0x234>)
  13297. 8005ed0: 4293 cmp r3, r2
  13298. 8005ed2: d022 beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13299. 8005ed4: 687b ldr r3, [r7, #4]
  13300. 8005ed6: 681b ldr r3, [r3, #0]
  13301. 8005ed8: 4a68 ldr r2, [pc, #416] @ (800607c <HAL_DMA_Abort+0x238>)
  13302. 8005eda: 4293 cmp r3, r2
  13303. 8005edc: d01d beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13304. 8005ede: 687b ldr r3, [r7, #4]
  13305. 8005ee0: 681b ldr r3, [r3, #0]
  13306. 8005ee2: 4a67 ldr r2, [pc, #412] @ (8006080 <HAL_DMA_Abort+0x23c>)
  13307. 8005ee4: 4293 cmp r3, r2
  13308. 8005ee6: d018 beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13309. 8005ee8: 687b ldr r3, [r7, #4]
  13310. 8005eea: 681b ldr r3, [r3, #0]
  13311. 8005eec: 4a65 ldr r2, [pc, #404] @ (8006084 <HAL_DMA_Abort+0x240>)
  13312. 8005eee: 4293 cmp r3, r2
  13313. 8005ef0: d013 beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13314. 8005ef2: 687b ldr r3, [r7, #4]
  13315. 8005ef4: 681b ldr r3, [r3, #0]
  13316. 8005ef6: 4a64 ldr r2, [pc, #400] @ (8006088 <HAL_DMA_Abort+0x244>)
  13317. 8005ef8: 4293 cmp r3, r2
  13318. 8005efa: d00e beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13319. 8005efc: 687b ldr r3, [r7, #4]
  13320. 8005efe: 681b ldr r3, [r3, #0]
  13321. 8005f00: 4a62 ldr r2, [pc, #392] @ (800608c <HAL_DMA_Abort+0x248>)
  13322. 8005f02: 4293 cmp r3, r2
  13323. 8005f04: d009 beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13324. 8005f06: 687b ldr r3, [r7, #4]
  13325. 8005f08: 681b ldr r3, [r3, #0]
  13326. 8005f0a: 4a61 ldr r2, [pc, #388] @ (8006090 <HAL_DMA_Abort+0x24c>)
  13327. 8005f0c: 4293 cmp r3, r2
  13328. 8005f0e: d004 beq.n 8005f1a <HAL_DMA_Abort+0xd6>
  13329. 8005f10: 687b ldr r3, [r7, #4]
  13330. 8005f12: 681b ldr r3, [r3, #0]
  13331. 8005f14: 4a5f ldr r2, [pc, #380] @ (8006094 <HAL_DMA_Abort+0x250>)
  13332. 8005f16: 4293 cmp r3, r2
  13333. 8005f18: d101 bne.n 8005f1e <HAL_DMA_Abort+0xda>
  13334. 8005f1a: 2301 movs r3, #1
  13335. 8005f1c: e000 b.n 8005f20 <HAL_DMA_Abort+0xdc>
  13336. 8005f1e: 2300 movs r3, #0
  13337. 8005f20: 2b00 cmp r3, #0
  13338. 8005f22: d013 beq.n 8005f4c <HAL_DMA_Abort+0x108>
  13339. {
  13340. /* Disable DMA All Interrupts */
  13341. ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME | DMA_IT_HT);
  13342. 8005f24: 687b ldr r3, [r7, #4]
  13343. 8005f26: 681b ldr r3, [r3, #0]
  13344. 8005f28: 681a ldr r2, [r3, #0]
  13345. 8005f2a: 687b ldr r3, [r7, #4]
  13346. 8005f2c: 681b ldr r3, [r3, #0]
  13347. 8005f2e: f022 021e bic.w r2, r2, #30
  13348. 8005f32: 601a str r2, [r3, #0]
  13349. ((DMA_Stream_TypeDef *)hdma->Instance)->FCR &= ~(DMA_IT_FE);
  13350. 8005f34: 687b ldr r3, [r7, #4]
  13351. 8005f36: 681b ldr r3, [r3, #0]
  13352. 8005f38: 695a ldr r2, [r3, #20]
  13353. 8005f3a: 687b ldr r3, [r7, #4]
  13354. 8005f3c: 681b ldr r3, [r3, #0]
  13355. 8005f3e: f022 0280 bic.w r2, r2, #128 @ 0x80
  13356. 8005f42: 615a str r2, [r3, #20]
  13357. enableRegister = (__IO uint32_t *)(&(((DMA_Stream_TypeDef *)hdma->Instance)->CR));
  13358. 8005f44: 687b ldr r3, [r7, #4]
  13359. 8005f46: 681b ldr r3, [r3, #0]
  13360. 8005f48: 617b str r3, [r7, #20]
  13361. 8005f4a: e00a b.n 8005f62 <HAL_DMA_Abort+0x11e>
  13362. }
  13363. else /* BDMA channel */
  13364. {
  13365. /* Disable DMA All Interrupts */
  13366. ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR &= ~(BDMA_CCR_TCIE | BDMA_CCR_HTIE | BDMA_CCR_TEIE);
  13367. 8005f4c: 687b ldr r3, [r7, #4]
  13368. 8005f4e: 681b ldr r3, [r3, #0]
  13369. 8005f50: 681a ldr r2, [r3, #0]
  13370. 8005f52: 687b ldr r3, [r7, #4]
  13371. 8005f54: 681b ldr r3, [r3, #0]
  13372. 8005f56: f022 020e bic.w r2, r2, #14
  13373. 8005f5a: 601a str r2, [r3, #0]
  13374. enableRegister = (__IO uint32_t *)(&(((BDMA_Channel_TypeDef *)hdma->Instance)->CCR));
  13375. 8005f5c: 687b ldr r3, [r7, #4]
  13376. 8005f5e: 681b ldr r3, [r3, #0]
  13377. 8005f60: 617b str r3, [r7, #20]
  13378. }
  13379. if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U) /* No DMAMUX available for BDMA1 */
  13380. 8005f62: 687b ldr r3, [r7, #4]
  13381. 8005f64: 681b ldr r3, [r3, #0]
  13382. 8005f66: 4a3c ldr r2, [pc, #240] @ (8006058 <HAL_DMA_Abort+0x214>)
  13383. 8005f68: 4293 cmp r3, r2
  13384. 8005f6a: d072 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13385. 8005f6c: 687b ldr r3, [r7, #4]
  13386. 8005f6e: 681b ldr r3, [r3, #0]
  13387. 8005f70: 4a3a ldr r2, [pc, #232] @ (800605c <HAL_DMA_Abort+0x218>)
  13388. 8005f72: 4293 cmp r3, r2
  13389. 8005f74: d06d beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13390. 8005f76: 687b ldr r3, [r7, #4]
  13391. 8005f78: 681b ldr r3, [r3, #0]
  13392. 8005f7a: 4a39 ldr r2, [pc, #228] @ (8006060 <HAL_DMA_Abort+0x21c>)
  13393. 8005f7c: 4293 cmp r3, r2
  13394. 8005f7e: d068 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13395. 8005f80: 687b ldr r3, [r7, #4]
  13396. 8005f82: 681b ldr r3, [r3, #0]
  13397. 8005f84: 4a37 ldr r2, [pc, #220] @ (8006064 <HAL_DMA_Abort+0x220>)
  13398. 8005f86: 4293 cmp r3, r2
  13399. 8005f88: d063 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13400. 8005f8a: 687b ldr r3, [r7, #4]
  13401. 8005f8c: 681b ldr r3, [r3, #0]
  13402. 8005f8e: 4a36 ldr r2, [pc, #216] @ (8006068 <HAL_DMA_Abort+0x224>)
  13403. 8005f90: 4293 cmp r3, r2
  13404. 8005f92: d05e beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13405. 8005f94: 687b ldr r3, [r7, #4]
  13406. 8005f96: 681b ldr r3, [r3, #0]
  13407. 8005f98: 4a34 ldr r2, [pc, #208] @ (800606c <HAL_DMA_Abort+0x228>)
  13408. 8005f9a: 4293 cmp r3, r2
  13409. 8005f9c: d059 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13410. 8005f9e: 687b ldr r3, [r7, #4]
  13411. 8005fa0: 681b ldr r3, [r3, #0]
  13412. 8005fa2: 4a33 ldr r2, [pc, #204] @ (8006070 <HAL_DMA_Abort+0x22c>)
  13413. 8005fa4: 4293 cmp r3, r2
  13414. 8005fa6: d054 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13415. 8005fa8: 687b ldr r3, [r7, #4]
  13416. 8005faa: 681b ldr r3, [r3, #0]
  13417. 8005fac: 4a31 ldr r2, [pc, #196] @ (8006074 <HAL_DMA_Abort+0x230>)
  13418. 8005fae: 4293 cmp r3, r2
  13419. 8005fb0: d04f beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13420. 8005fb2: 687b ldr r3, [r7, #4]
  13421. 8005fb4: 681b ldr r3, [r3, #0]
  13422. 8005fb6: 4a30 ldr r2, [pc, #192] @ (8006078 <HAL_DMA_Abort+0x234>)
  13423. 8005fb8: 4293 cmp r3, r2
  13424. 8005fba: d04a beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13425. 8005fbc: 687b ldr r3, [r7, #4]
  13426. 8005fbe: 681b ldr r3, [r3, #0]
  13427. 8005fc0: 4a2e ldr r2, [pc, #184] @ (800607c <HAL_DMA_Abort+0x238>)
  13428. 8005fc2: 4293 cmp r3, r2
  13429. 8005fc4: d045 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13430. 8005fc6: 687b ldr r3, [r7, #4]
  13431. 8005fc8: 681b ldr r3, [r3, #0]
  13432. 8005fca: 4a2d ldr r2, [pc, #180] @ (8006080 <HAL_DMA_Abort+0x23c>)
  13433. 8005fcc: 4293 cmp r3, r2
  13434. 8005fce: d040 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13435. 8005fd0: 687b ldr r3, [r7, #4]
  13436. 8005fd2: 681b ldr r3, [r3, #0]
  13437. 8005fd4: 4a2b ldr r2, [pc, #172] @ (8006084 <HAL_DMA_Abort+0x240>)
  13438. 8005fd6: 4293 cmp r3, r2
  13439. 8005fd8: d03b beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13440. 8005fda: 687b ldr r3, [r7, #4]
  13441. 8005fdc: 681b ldr r3, [r3, #0]
  13442. 8005fde: 4a2a ldr r2, [pc, #168] @ (8006088 <HAL_DMA_Abort+0x244>)
  13443. 8005fe0: 4293 cmp r3, r2
  13444. 8005fe2: d036 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13445. 8005fe4: 687b ldr r3, [r7, #4]
  13446. 8005fe6: 681b ldr r3, [r3, #0]
  13447. 8005fe8: 4a28 ldr r2, [pc, #160] @ (800608c <HAL_DMA_Abort+0x248>)
  13448. 8005fea: 4293 cmp r3, r2
  13449. 8005fec: d031 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13450. 8005fee: 687b ldr r3, [r7, #4]
  13451. 8005ff0: 681b ldr r3, [r3, #0]
  13452. 8005ff2: 4a27 ldr r2, [pc, #156] @ (8006090 <HAL_DMA_Abort+0x24c>)
  13453. 8005ff4: 4293 cmp r3, r2
  13454. 8005ff6: d02c beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13455. 8005ff8: 687b ldr r3, [r7, #4]
  13456. 8005ffa: 681b ldr r3, [r3, #0]
  13457. 8005ffc: 4a25 ldr r2, [pc, #148] @ (8006094 <HAL_DMA_Abort+0x250>)
  13458. 8005ffe: 4293 cmp r3, r2
  13459. 8006000: d027 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13460. 8006002: 687b ldr r3, [r7, #4]
  13461. 8006004: 681b ldr r3, [r3, #0]
  13462. 8006006: 4a24 ldr r2, [pc, #144] @ (8006098 <HAL_DMA_Abort+0x254>)
  13463. 8006008: 4293 cmp r3, r2
  13464. 800600a: d022 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13465. 800600c: 687b ldr r3, [r7, #4]
  13466. 800600e: 681b ldr r3, [r3, #0]
  13467. 8006010: 4a22 ldr r2, [pc, #136] @ (800609c <HAL_DMA_Abort+0x258>)
  13468. 8006012: 4293 cmp r3, r2
  13469. 8006014: d01d beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13470. 8006016: 687b ldr r3, [r7, #4]
  13471. 8006018: 681b ldr r3, [r3, #0]
  13472. 800601a: 4a21 ldr r2, [pc, #132] @ (80060a0 <HAL_DMA_Abort+0x25c>)
  13473. 800601c: 4293 cmp r3, r2
  13474. 800601e: d018 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13475. 8006020: 687b ldr r3, [r7, #4]
  13476. 8006022: 681b ldr r3, [r3, #0]
  13477. 8006024: 4a1f ldr r2, [pc, #124] @ (80060a4 <HAL_DMA_Abort+0x260>)
  13478. 8006026: 4293 cmp r3, r2
  13479. 8006028: d013 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13480. 800602a: 687b ldr r3, [r7, #4]
  13481. 800602c: 681b ldr r3, [r3, #0]
  13482. 800602e: 4a1e ldr r2, [pc, #120] @ (80060a8 <HAL_DMA_Abort+0x264>)
  13483. 8006030: 4293 cmp r3, r2
  13484. 8006032: d00e beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13485. 8006034: 687b ldr r3, [r7, #4]
  13486. 8006036: 681b ldr r3, [r3, #0]
  13487. 8006038: 4a1c ldr r2, [pc, #112] @ (80060ac <HAL_DMA_Abort+0x268>)
  13488. 800603a: 4293 cmp r3, r2
  13489. 800603c: d009 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13490. 800603e: 687b ldr r3, [r7, #4]
  13491. 8006040: 681b ldr r3, [r3, #0]
  13492. 8006042: 4a1b ldr r2, [pc, #108] @ (80060b0 <HAL_DMA_Abort+0x26c>)
  13493. 8006044: 4293 cmp r3, r2
  13494. 8006046: d004 beq.n 8006052 <HAL_DMA_Abort+0x20e>
  13495. 8006048: 687b ldr r3, [r7, #4]
  13496. 800604a: 681b ldr r3, [r3, #0]
  13497. 800604c: 4a19 ldr r2, [pc, #100] @ (80060b4 <HAL_DMA_Abort+0x270>)
  13498. 800604e: 4293 cmp r3, r2
  13499. 8006050: d132 bne.n 80060b8 <HAL_DMA_Abort+0x274>
  13500. 8006052: 2301 movs r3, #1
  13501. 8006054: e031 b.n 80060ba <HAL_DMA_Abort+0x276>
  13502. 8006056: bf00 nop
  13503. 8006058: 40020010 .word 0x40020010
  13504. 800605c: 40020028 .word 0x40020028
  13505. 8006060: 40020040 .word 0x40020040
  13506. 8006064: 40020058 .word 0x40020058
  13507. 8006068: 40020070 .word 0x40020070
  13508. 800606c: 40020088 .word 0x40020088
  13509. 8006070: 400200a0 .word 0x400200a0
  13510. 8006074: 400200b8 .word 0x400200b8
  13511. 8006078: 40020410 .word 0x40020410
  13512. 800607c: 40020428 .word 0x40020428
  13513. 8006080: 40020440 .word 0x40020440
  13514. 8006084: 40020458 .word 0x40020458
  13515. 8006088: 40020470 .word 0x40020470
  13516. 800608c: 40020488 .word 0x40020488
  13517. 8006090: 400204a0 .word 0x400204a0
  13518. 8006094: 400204b8 .word 0x400204b8
  13519. 8006098: 58025408 .word 0x58025408
  13520. 800609c: 5802541c .word 0x5802541c
  13521. 80060a0: 58025430 .word 0x58025430
  13522. 80060a4: 58025444 .word 0x58025444
  13523. 80060a8: 58025458 .word 0x58025458
  13524. 80060ac: 5802546c .word 0x5802546c
  13525. 80060b0: 58025480 .word 0x58025480
  13526. 80060b4: 58025494 .word 0x58025494
  13527. 80060b8: 2300 movs r3, #0
  13528. 80060ba: 2b00 cmp r3, #0
  13529. 80060bc: d007 beq.n 80060ce <HAL_DMA_Abort+0x28a>
  13530. {
  13531. /* disable the DMAMUX sync overrun IT */
  13532. hdma->DMAmuxChannel->CCR &= ~DMAMUX_CxCR_SOIE;
  13533. 80060be: 687b ldr r3, [r7, #4]
  13534. 80060c0: 6e1b ldr r3, [r3, #96] @ 0x60
  13535. 80060c2: 681a ldr r2, [r3, #0]
  13536. 80060c4: 687b ldr r3, [r7, #4]
  13537. 80060c6: 6e1b ldr r3, [r3, #96] @ 0x60
  13538. 80060c8: f422 7280 bic.w r2, r2, #256 @ 0x100
  13539. 80060cc: 601a str r2, [r3, #0]
  13540. }
  13541. /* Disable the stream */
  13542. __HAL_DMA_DISABLE(hdma);
  13543. 80060ce: 687b ldr r3, [r7, #4]
  13544. 80060d0: 681b ldr r3, [r3, #0]
  13545. 80060d2: 4a6d ldr r2, [pc, #436] @ (8006288 <HAL_DMA_Abort+0x444>)
  13546. 80060d4: 4293 cmp r3, r2
  13547. 80060d6: d04a beq.n 800616e <HAL_DMA_Abort+0x32a>
  13548. 80060d8: 687b ldr r3, [r7, #4]
  13549. 80060da: 681b ldr r3, [r3, #0]
  13550. 80060dc: 4a6b ldr r2, [pc, #428] @ (800628c <HAL_DMA_Abort+0x448>)
  13551. 80060de: 4293 cmp r3, r2
  13552. 80060e0: d045 beq.n 800616e <HAL_DMA_Abort+0x32a>
  13553. 80060e2: 687b ldr r3, [r7, #4]
  13554. 80060e4: 681b ldr r3, [r3, #0]
  13555. 80060e6: 4a6a ldr r2, [pc, #424] @ (8006290 <HAL_DMA_Abort+0x44c>)
  13556. 80060e8: 4293 cmp r3, r2
  13557. 80060ea: d040 beq.n 800616e <HAL_DMA_Abort+0x32a>
  13558. 80060ec: 687b ldr r3, [r7, #4]
  13559. 80060ee: 681b ldr r3, [r3, #0]
  13560. 80060f0: 4a68 ldr r2, [pc, #416] @ (8006294 <HAL_DMA_Abort+0x450>)
  13561. 80060f2: 4293 cmp r3, r2
  13562. 80060f4: d03b beq.n 800616e <HAL_DMA_Abort+0x32a>
  13563. 80060f6: 687b ldr r3, [r7, #4]
  13564. 80060f8: 681b ldr r3, [r3, #0]
  13565. 80060fa: 4a67 ldr r2, [pc, #412] @ (8006298 <HAL_DMA_Abort+0x454>)
  13566. 80060fc: 4293 cmp r3, r2
  13567. 80060fe: d036 beq.n 800616e <HAL_DMA_Abort+0x32a>
  13568. 8006100: 687b ldr r3, [r7, #4]
  13569. 8006102: 681b ldr r3, [r3, #0]
  13570. 8006104: 4a65 ldr r2, [pc, #404] @ (800629c <HAL_DMA_Abort+0x458>)
  13571. 8006106: 4293 cmp r3, r2
  13572. 8006108: d031 beq.n 800616e <HAL_DMA_Abort+0x32a>
  13573. 800610a: 687b ldr r3, [r7, #4]
  13574. 800610c: 681b ldr r3, [r3, #0]
  13575. 800610e: 4a64 ldr r2, [pc, #400] @ (80062a0 <HAL_DMA_Abort+0x45c>)
  13576. 8006110: 4293 cmp r3, r2
  13577. 8006112: d02c beq.n 800616e <HAL_DMA_Abort+0x32a>
  13578. 8006114: 687b ldr r3, [r7, #4]
  13579. 8006116: 681b ldr r3, [r3, #0]
  13580. 8006118: 4a62 ldr r2, [pc, #392] @ (80062a4 <HAL_DMA_Abort+0x460>)
  13581. 800611a: 4293 cmp r3, r2
  13582. 800611c: d027 beq.n 800616e <HAL_DMA_Abort+0x32a>
  13583. 800611e: 687b ldr r3, [r7, #4]
  13584. 8006120: 681b ldr r3, [r3, #0]
  13585. 8006122: 4a61 ldr r2, [pc, #388] @ (80062a8 <HAL_DMA_Abort+0x464>)
  13586. 8006124: 4293 cmp r3, r2
  13587. 8006126: d022 beq.n 800616e <HAL_DMA_Abort+0x32a>
  13588. 8006128: 687b ldr r3, [r7, #4]
  13589. 800612a: 681b ldr r3, [r3, #0]
  13590. 800612c: 4a5f ldr r2, [pc, #380] @ (80062ac <HAL_DMA_Abort+0x468>)
  13591. 800612e: 4293 cmp r3, r2
  13592. 8006130: d01d beq.n 800616e <HAL_DMA_Abort+0x32a>
  13593. 8006132: 687b ldr r3, [r7, #4]
  13594. 8006134: 681b ldr r3, [r3, #0]
  13595. 8006136: 4a5e ldr r2, [pc, #376] @ (80062b0 <HAL_DMA_Abort+0x46c>)
  13596. 8006138: 4293 cmp r3, r2
  13597. 800613a: d018 beq.n 800616e <HAL_DMA_Abort+0x32a>
  13598. 800613c: 687b ldr r3, [r7, #4]
  13599. 800613e: 681b ldr r3, [r3, #0]
  13600. 8006140: 4a5c ldr r2, [pc, #368] @ (80062b4 <HAL_DMA_Abort+0x470>)
  13601. 8006142: 4293 cmp r3, r2
  13602. 8006144: d013 beq.n 800616e <HAL_DMA_Abort+0x32a>
  13603. 8006146: 687b ldr r3, [r7, #4]
  13604. 8006148: 681b ldr r3, [r3, #0]
  13605. 800614a: 4a5b ldr r2, [pc, #364] @ (80062b8 <HAL_DMA_Abort+0x474>)
  13606. 800614c: 4293 cmp r3, r2
  13607. 800614e: d00e beq.n 800616e <HAL_DMA_Abort+0x32a>
  13608. 8006150: 687b ldr r3, [r7, #4]
  13609. 8006152: 681b ldr r3, [r3, #0]
  13610. 8006154: 4a59 ldr r2, [pc, #356] @ (80062bc <HAL_DMA_Abort+0x478>)
  13611. 8006156: 4293 cmp r3, r2
  13612. 8006158: d009 beq.n 800616e <HAL_DMA_Abort+0x32a>
  13613. 800615a: 687b ldr r3, [r7, #4]
  13614. 800615c: 681b ldr r3, [r3, #0]
  13615. 800615e: 4a58 ldr r2, [pc, #352] @ (80062c0 <HAL_DMA_Abort+0x47c>)
  13616. 8006160: 4293 cmp r3, r2
  13617. 8006162: d004 beq.n 800616e <HAL_DMA_Abort+0x32a>
  13618. 8006164: 687b ldr r3, [r7, #4]
  13619. 8006166: 681b ldr r3, [r3, #0]
  13620. 8006168: 4a56 ldr r2, [pc, #344] @ (80062c4 <HAL_DMA_Abort+0x480>)
  13621. 800616a: 4293 cmp r3, r2
  13622. 800616c: d108 bne.n 8006180 <HAL_DMA_Abort+0x33c>
  13623. 800616e: 687b ldr r3, [r7, #4]
  13624. 8006170: 681b ldr r3, [r3, #0]
  13625. 8006172: 681a ldr r2, [r3, #0]
  13626. 8006174: 687b ldr r3, [r7, #4]
  13627. 8006176: 681b ldr r3, [r3, #0]
  13628. 8006178: f022 0201 bic.w r2, r2, #1
  13629. 800617c: 601a str r2, [r3, #0]
  13630. 800617e: e007 b.n 8006190 <HAL_DMA_Abort+0x34c>
  13631. 8006180: 687b ldr r3, [r7, #4]
  13632. 8006182: 681b ldr r3, [r3, #0]
  13633. 8006184: 681a ldr r2, [r3, #0]
  13634. 8006186: 687b ldr r3, [r7, #4]
  13635. 8006188: 681b ldr r3, [r3, #0]
  13636. 800618a: f022 0201 bic.w r2, r2, #1
  13637. 800618e: 601a str r2, [r3, #0]
  13638. /* Check if the DMA Stream is effectively disabled */
  13639. while(((*enableRegister) & DMA_SxCR_EN) != 0U)
  13640. 8006190: e013 b.n 80061ba <HAL_DMA_Abort+0x376>
  13641. {
  13642. /* Check for the Timeout */
  13643. if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT)
  13644. 8006192: f7fe ff4d bl 8005030 <HAL_GetTick>
  13645. 8006196: 4602 mov r2, r0
  13646. 8006198: 693b ldr r3, [r7, #16]
  13647. 800619a: 1ad3 subs r3, r2, r3
  13648. 800619c: 2b05 cmp r3, #5
  13649. 800619e: d90c bls.n 80061ba <HAL_DMA_Abort+0x376>
  13650. {
  13651. /* Update error code */
  13652. hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT;
  13653. 80061a0: 687b ldr r3, [r7, #4]
  13654. 80061a2: 2220 movs r2, #32
  13655. 80061a4: 655a str r2, [r3, #84] @ 0x54
  13656. /* Change the DMA state */
  13657. hdma->State = HAL_DMA_STATE_ERROR;
  13658. 80061a6: 687b ldr r3, [r7, #4]
  13659. 80061a8: 2203 movs r2, #3
  13660. 80061aa: f883 2035 strb.w r2, [r3, #53] @ 0x35
  13661. /* Process Unlocked */
  13662. __HAL_UNLOCK(hdma);
  13663. 80061ae: 687b ldr r3, [r7, #4]
  13664. 80061b0: 2200 movs r2, #0
  13665. 80061b2: f883 2034 strb.w r2, [r3, #52] @ 0x34
  13666. return HAL_ERROR;
  13667. 80061b6: 2301 movs r3, #1
  13668. 80061b8: e12d b.n 8006416 <HAL_DMA_Abort+0x5d2>
  13669. while(((*enableRegister) & DMA_SxCR_EN) != 0U)
  13670. 80061ba: 697b ldr r3, [r7, #20]
  13671. 80061bc: 681b ldr r3, [r3, #0]
  13672. 80061be: f003 0301 and.w r3, r3, #1
  13673. 80061c2: 2b00 cmp r3, #0
  13674. 80061c4: d1e5 bne.n 8006192 <HAL_DMA_Abort+0x34e>
  13675. }
  13676. }
  13677. /* Clear all interrupt flags at correct offset within the register */
  13678. if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U) /* DMA1 or DMA2 instance */
  13679. 80061c6: 687b ldr r3, [r7, #4]
  13680. 80061c8: 681b ldr r3, [r3, #0]
  13681. 80061ca: 4a2f ldr r2, [pc, #188] @ (8006288 <HAL_DMA_Abort+0x444>)
  13682. 80061cc: 4293 cmp r3, r2
  13683. 80061ce: d04a beq.n 8006266 <HAL_DMA_Abort+0x422>
  13684. 80061d0: 687b ldr r3, [r7, #4]
  13685. 80061d2: 681b ldr r3, [r3, #0]
  13686. 80061d4: 4a2d ldr r2, [pc, #180] @ (800628c <HAL_DMA_Abort+0x448>)
  13687. 80061d6: 4293 cmp r3, r2
  13688. 80061d8: d045 beq.n 8006266 <HAL_DMA_Abort+0x422>
  13689. 80061da: 687b ldr r3, [r7, #4]
  13690. 80061dc: 681b ldr r3, [r3, #0]
  13691. 80061de: 4a2c ldr r2, [pc, #176] @ (8006290 <HAL_DMA_Abort+0x44c>)
  13692. 80061e0: 4293 cmp r3, r2
  13693. 80061e2: d040 beq.n 8006266 <HAL_DMA_Abort+0x422>
  13694. 80061e4: 687b ldr r3, [r7, #4]
  13695. 80061e6: 681b ldr r3, [r3, #0]
  13696. 80061e8: 4a2a ldr r2, [pc, #168] @ (8006294 <HAL_DMA_Abort+0x450>)
  13697. 80061ea: 4293 cmp r3, r2
  13698. 80061ec: d03b beq.n 8006266 <HAL_DMA_Abort+0x422>
  13699. 80061ee: 687b ldr r3, [r7, #4]
  13700. 80061f0: 681b ldr r3, [r3, #0]
  13701. 80061f2: 4a29 ldr r2, [pc, #164] @ (8006298 <HAL_DMA_Abort+0x454>)
  13702. 80061f4: 4293 cmp r3, r2
  13703. 80061f6: d036 beq.n 8006266 <HAL_DMA_Abort+0x422>
  13704. 80061f8: 687b ldr r3, [r7, #4]
  13705. 80061fa: 681b ldr r3, [r3, #0]
  13706. 80061fc: 4a27 ldr r2, [pc, #156] @ (800629c <HAL_DMA_Abort+0x458>)
  13707. 80061fe: 4293 cmp r3, r2
  13708. 8006200: d031 beq.n 8006266 <HAL_DMA_Abort+0x422>
  13709. 8006202: 687b ldr r3, [r7, #4]
  13710. 8006204: 681b ldr r3, [r3, #0]
  13711. 8006206: 4a26 ldr r2, [pc, #152] @ (80062a0 <HAL_DMA_Abort+0x45c>)
  13712. 8006208: 4293 cmp r3, r2
  13713. 800620a: d02c beq.n 8006266 <HAL_DMA_Abort+0x422>
  13714. 800620c: 687b ldr r3, [r7, #4]
  13715. 800620e: 681b ldr r3, [r3, #0]
  13716. 8006210: 4a24 ldr r2, [pc, #144] @ (80062a4 <HAL_DMA_Abort+0x460>)
  13717. 8006212: 4293 cmp r3, r2
  13718. 8006214: d027 beq.n 8006266 <HAL_DMA_Abort+0x422>
  13719. 8006216: 687b ldr r3, [r7, #4]
  13720. 8006218: 681b ldr r3, [r3, #0]
  13721. 800621a: 4a23 ldr r2, [pc, #140] @ (80062a8 <HAL_DMA_Abort+0x464>)
  13722. 800621c: 4293 cmp r3, r2
  13723. 800621e: d022 beq.n 8006266 <HAL_DMA_Abort+0x422>
  13724. 8006220: 687b ldr r3, [r7, #4]
  13725. 8006222: 681b ldr r3, [r3, #0]
  13726. 8006224: 4a21 ldr r2, [pc, #132] @ (80062ac <HAL_DMA_Abort+0x468>)
  13727. 8006226: 4293 cmp r3, r2
  13728. 8006228: d01d beq.n 8006266 <HAL_DMA_Abort+0x422>
  13729. 800622a: 687b ldr r3, [r7, #4]
  13730. 800622c: 681b ldr r3, [r3, #0]
  13731. 800622e: 4a20 ldr r2, [pc, #128] @ (80062b0 <HAL_DMA_Abort+0x46c>)
  13732. 8006230: 4293 cmp r3, r2
  13733. 8006232: d018 beq.n 8006266 <HAL_DMA_Abort+0x422>
  13734. 8006234: 687b ldr r3, [r7, #4]
  13735. 8006236: 681b ldr r3, [r3, #0]
  13736. 8006238: 4a1e ldr r2, [pc, #120] @ (80062b4 <HAL_DMA_Abort+0x470>)
  13737. 800623a: 4293 cmp r3, r2
  13738. 800623c: d013 beq.n 8006266 <HAL_DMA_Abort+0x422>
  13739. 800623e: 687b ldr r3, [r7, #4]
  13740. 8006240: 681b ldr r3, [r3, #0]
  13741. 8006242: 4a1d ldr r2, [pc, #116] @ (80062b8 <HAL_DMA_Abort+0x474>)
  13742. 8006244: 4293 cmp r3, r2
  13743. 8006246: d00e beq.n 8006266 <HAL_DMA_Abort+0x422>
  13744. 8006248: 687b ldr r3, [r7, #4]
  13745. 800624a: 681b ldr r3, [r3, #0]
  13746. 800624c: 4a1b ldr r2, [pc, #108] @ (80062bc <HAL_DMA_Abort+0x478>)
  13747. 800624e: 4293 cmp r3, r2
  13748. 8006250: d009 beq.n 8006266 <HAL_DMA_Abort+0x422>
  13749. 8006252: 687b ldr r3, [r7, #4]
  13750. 8006254: 681b ldr r3, [r3, #0]
  13751. 8006256: 4a1a ldr r2, [pc, #104] @ (80062c0 <HAL_DMA_Abort+0x47c>)
  13752. 8006258: 4293 cmp r3, r2
  13753. 800625a: d004 beq.n 8006266 <HAL_DMA_Abort+0x422>
  13754. 800625c: 687b ldr r3, [r7, #4]
  13755. 800625e: 681b ldr r3, [r3, #0]
  13756. 8006260: 4a18 ldr r2, [pc, #96] @ (80062c4 <HAL_DMA_Abort+0x480>)
  13757. 8006262: 4293 cmp r3, r2
  13758. 8006264: d101 bne.n 800626a <HAL_DMA_Abort+0x426>
  13759. 8006266: 2301 movs r3, #1
  13760. 8006268: e000 b.n 800626c <HAL_DMA_Abort+0x428>
  13761. 800626a: 2300 movs r3, #0
  13762. 800626c: 2b00 cmp r3, #0
  13763. 800626e: d02b beq.n 80062c8 <HAL_DMA_Abort+0x484>
  13764. {
  13765. regs_dma = (DMA_Base_Registers *)hdma->StreamBaseAddress;
  13766. 8006270: 687b ldr r3, [r7, #4]
  13767. 8006272: 6d9b ldr r3, [r3, #88] @ 0x58
  13768. 8006274: 60bb str r3, [r7, #8]
  13769. regs_dma->IFCR = 0x3FUL << (hdma->StreamIndex & 0x1FU);
  13770. 8006276: 687b ldr r3, [r7, #4]
  13771. 8006278: 6ddb ldr r3, [r3, #92] @ 0x5c
  13772. 800627a: f003 031f and.w r3, r3, #31
  13773. 800627e: 223f movs r2, #63 @ 0x3f
  13774. 8006280: 409a lsls r2, r3
  13775. 8006282: 68bb ldr r3, [r7, #8]
  13776. 8006284: 609a str r2, [r3, #8]
  13777. 8006286: e02a b.n 80062de <HAL_DMA_Abort+0x49a>
  13778. 8006288: 40020010 .word 0x40020010
  13779. 800628c: 40020028 .word 0x40020028
  13780. 8006290: 40020040 .word 0x40020040
  13781. 8006294: 40020058 .word 0x40020058
  13782. 8006298: 40020070 .word 0x40020070
  13783. 800629c: 40020088 .word 0x40020088
  13784. 80062a0: 400200a0 .word 0x400200a0
  13785. 80062a4: 400200b8 .word 0x400200b8
  13786. 80062a8: 40020410 .word 0x40020410
  13787. 80062ac: 40020428 .word 0x40020428
  13788. 80062b0: 40020440 .word 0x40020440
  13789. 80062b4: 40020458 .word 0x40020458
  13790. 80062b8: 40020470 .word 0x40020470
  13791. 80062bc: 40020488 .word 0x40020488
  13792. 80062c0: 400204a0 .word 0x400204a0
  13793. 80062c4: 400204b8 .word 0x400204b8
  13794. }
  13795. else /* BDMA channel */
  13796. {
  13797. regs_bdma = (BDMA_Base_Registers *)hdma->StreamBaseAddress;
  13798. 80062c8: 687b ldr r3, [r7, #4]
  13799. 80062ca: 6d9b ldr r3, [r3, #88] @ 0x58
  13800. 80062cc: 60fb str r3, [r7, #12]
  13801. regs_bdma->IFCR = ((BDMA_IFCR_CGIF0) << (hdma->StreamIndex & 0x1FU));
  13802. 80062ce: 687b ldr r3, [r7, #4]
  13803. 80062d0: 6ddb ldr r3, [r3, #92] @ 0x5c
  13804. 80062d2: f003 031f and.w r3, r3, #31
  13805. 80062d6: 2201 movs r2, #1
  13806. 80062d8: 409a lsls r2, r3
  13807. 80062da: 68fb ldr r3, [r7, #12]
  13808. 80062dc: 605a str r2, [r3, #4]
  13809. }
  13810. if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U) /* No DMAMUX available for BDMA1 */
  13811. 80062de: 687b ldr r3, [r7, #4]
  13812. 80062e0: 681b ldr r3, [r3, #0]
  13813. 80062e2: 4a4f ldr r2, [pc, #316] @ (8006420 <HAL_DMA_Abort+0x5dc>)
  13814. 80062e4: 4293 cmp r3, r2
  13815. 80062e6: d072 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13816. 80062e8: 687b ldr r3, [r7, #4]
  13817. 80062ea: 681b ldr r3, [r3, #0]
  13818. 80062ec: 4a4d ldr r2, [pc, #308] @ (8006424 <HAL_DMA_Abort+0x5e0>)
  13819. 80062ee: 4293 cmp r3, r2
  13820. 80062f0: d06d beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13821. 80062f2: 687b ldr r3, [r7, #4]
  13822. 80062f4: 681b ldr r3, [r3, #0]
  13823. 80062f6: 4a4c ldr r2, [pc, #304] @ (8006428 <HAL_DMA_Abort+0x5e4>)
  13824. 80062f8: 4293 cmp r3, r2
  13825. 80062fa: d068 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13826. 80062fc: 687b ldr r3, [r7, #4]
  13827. 80062fe: 681b ldr r3, [r3, #0]
  13828. 8006300: 4a4a ldr r2, [pc, #296] @ (800642c <HAL_DMA_Abort+0x5e8>)
  13829. 8006302: 4293 cmp r3, r2
  13830. 8006304: d063 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13831. 8006306: 687b ldr r3, [r7, #4]
  13832. 8006308: 681b ldr r3, [r3, #0]
  13833. 800630a: 4a49 ldr r2, [pc, #292] @ (8006430 <HAL_DMA_Abort+0x5ec>)
  13834. 800630c: 4293 cmp r3, r2
  13835. 800630e: d05e beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13836. 8006310: 687b ldr r3, [r7, #4]
  13837. 8006312: 681b ldr r3, [r3, #0]
  13838. 8006314: 4a47 ldr r2, [pc, #284] @ (8006434 <HAL_DMA_Abort+0x5f0>)
  13839. 8006316: 4293 cmp r3, r2
  13840. 8006318: d059 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13841. 800631a: 687b ldr r3, [r7, #4]
  13842. 800631c: 681b ldr r3, [r3, #0]
  13843. 800631e: 4a46 ldr r2, [pc, #280] @ (8006438 <HAL_DMA_Abort+0x5f4>)
  13844. 8006320: 4293 cmp r3, r2
  13845. 8006322: d054 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13846. 8006324: 687b ldr r3, [r7, #4]
  13847. 8006326: 681b ldr r3, [r3, #0]
  13848. 8006328: 4a44 ldr r2, [pc, #272] @ (800643c <HAL_DMA_Abort+0x5f8>)
  13849. 800632a: 4293 cmp r3, r2
  13850. 800632c: d04f beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13851. 800632e: 687b ldr r3, [r7, #4]
  13852. 8006330: 681b ldr r3, [r3, #0]
  13853. 8006332: 4a43 ldr r2, [pc, #268] @ (8006440 <HAL_DMA_Abort+0x5fc>)
  13854. 8006334: 4293 cmp r3, r2
  13855. 8006336: d04a beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13856. 8006338: 687b ldr r3, [r7, #4]
  13857. 800633a: 681b ldr r3, [r3, #0]
  13858. 800633c: 4a41 ldr r2, [pc, #260] @ (8006444 <HAL_DMA_Abort+0x600>)
  13859. 800633e: 4293 cmp r3, r2
  13860. 8006340: d045 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13861. 8006342: 687b ldr r3, [r7, #4]
  13862. 8006344: 681b ldr r3, [r3, #0]
  13863. 8006346: 4a40 ldr r2, [pc, #256] @ (8006448 <HAL_DMA_Abort+0x604>)
  13864. 8006348: 4293 cmp r3, r2
  13865. 800634a: d040 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13866. 800634c: 687b ldr r3, [r7, #4]
  13867. 800634e: 681b ldr r3, [r3, #0]
  13868. 8006350: 4a3e ldr r2, [pc, #248] @ (800644c <HAL_DMA_Abort+0x608>)
  13869. 8006352: 4293 cmp r3, r2
  13870. 8006354: d03b beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13871. 8006356: 687b ldr r3, [r7, #4]
  13872. 8006358: 681b ldr r3, [r3, #0]
  13873. 800635a: 4a3d ldr r2, [pc, #244] @ (8006450 <HAL_DMA_Abort+0x60c>)
  13874. 800635c: 4293 cmp r3, r2
  13875. 800635e: d036 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13876. 8006360: 687b ldr r3, [r7, #4]
  13877. 8006362: 681b ldr r3, [r3, #0]
  13878. 8006364: 4a3b ldr r2, [pc, #236] @ (8006454 <HAL_DMA_Abort+0x610>)
  13879. 8006366: 4293 cmp r3, r2
  13880. 8006368: d031 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13881. 800636a: 687b ldr r3, [r7, #4]
  13882. 800636c: 681b ldr r3, [r3, #0]
  13883. 800636e: 4a3a ldr r2, [pc, #232] @ (8006458 <HAL_DMA_Abort+0x614>)
  13884. 8006370: 4293 cmp r3, r2
  13885. 8006372: d02c beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13886. 8006374: 687b ldr r3, [r7, #4]
  13887. 8006376: 681b ldr r3, [r3, #0]
  13888. 8006378: 4a38 ldr r2, [pc, #224] @ (800645c <HAL_DMA_Abort+0x618>)
  13889. 800637a: 4293 cmp r3, r2
  13890. 800637c: d027 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13891. 800637e: 687b ldr r3, [r7, #4]
  13892. 8006380: 681b ldr r3, [r3, #0]
  13893. 8006382: 4a37 ldr r2, [pc, #220] @ (8006460 <HAL_DMA_Abort+0x61c>)
  13894. 8006384: 4293 cmp r3, r2
  13895. 8006386: d022 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13896. 8006388: 687b ldr r3, [r7, #4]
  13897. 800638a: 681b ldr r3, [r3, #0]
  13898. 800638c: 4a35 ldr r2, [pc, #212] @ (8006464 <HAL_DMA_Abort+0x620>)
  13899. 800638e: 4293 cmp r3, r2
  13900. 8006390: d01d beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13901. 8006392: 687b ldr r3, [r7, #4]
  13902. 8006394: 681b ldr r3, [r3, #0]
  13903. 8006396: 4a34 ldr r2, [pc, #208] @ (8006468 <HAL_DMA_Abort+0x624>)
  13904. 8006398: 4293 cmp r3, r2
  13905. 800639a: d018 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13906. 800639c: 687b ldr r3, [r7, #4]
  13907. 800639e: 681b ldr r3, [r3, #0]
  13908. 80063a0: 4a32 ldr r2, [pc, #200] @ (800646c <HAL_DMA_Abort+0x628>)
  13909. 80063a2: 4293 cmp r3, r2
  13910. 80063a4: d013 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13911. 80063a6: 687b ldr r3, [r7, #4]
  13912. 80063a8: 681b ldr r3, [r3, #0]
  13913. 80063aa: 4a31 ldr r2, [pc, #196] @ (8006470 <HAL_DMA_Abort+0x62c>)
  13914. 80063ac: 4293 cmp r3, r2
  13915. 80063ae: d00e beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13916. 80063b0: 687b ldr r3, [r7, #4]
  13917. 80063b2: 681b ldr r3, [r3, #0]
  13918. 80063b4: 4a2f ldr r2, [pc, #188] @ (8006474 <HAL_DMA_Abort+0x630>)
  13919. 80063b6: 4293 cmp r3, r2
  13920. 80063b8: d009 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13921. 80063ba: 687b ldr r3, [r7, #4]
  13922. 80063bc: 681b ldr r3, [r3, #0]
  13923. 80063be: 4a2e ldr r2, [pc, #184] @ (8006478 <HAL_DMA_Abort+0x634>)
  13924. 80063c0: 4293 cmp r3, r2
  13925. 80063c2: d004 beq.n 80063ce <HAL_DMA_Abort+0x58a>
  13926. 80063c4: 687b ldr r3, [r7, #4]
  13927. 80063c6: 681b ldr r3, [r3, #0]
  13928. 80063c8: 4a2c ldr r2, [pc, #176] @ (800647c <HAL_DMA_Abort+0x638>)
  13929. 80063ca: 4293 cmp r3, r2
  13930. 80063cc: d101 bne.n 80063d2 <HAL_DMA_Abort+0x58e>
  13931. 80063ce: 2301 movs r3, #1
  13932. 80063d0: e000 b.n 80063d4 <HAL_DMA_Abort+0x590>
  13933. 80063d2: 2300 movs r3, #0
  13934. 80063d4: 2b00 cmp r3, #0
  13935. 80063d6: d015 beq.n 8006404 <HAL_DMA_Abort+0x5c0>
  13936. {
  13937. /* Clear the DMAMUX synchro overrun flag */
  13938. hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;
  13939. 80063d8: 687b ldr r3, [r7, #4]
  13940. 80063da: 6e5b ldr r3, [r3, #100] @ 0x64
  13941. 80063dc: 687a ldr r2, [r7, #4]
  13942. 80063de: 6e92 ldr r2, [r2, #104] @ 0x68
  13943. 80063e0: 605a str r2, [r3, #4]
  13944. if(hdma->DMAmuxRequestGen != 0U)
  13945. 80063e2: 687b ldr r3, [r7, #4]
  13946. 80063e4: 6edb ldr r3, [r3, #108] @ 0x6c
  13947. 80063e6: 2b00 cmp r3, #0
  13948. 80063e8: d00c beq.n 8006404 <HAL_DMA_Abort+0x5c0>
  13949. {
  13950. /* if using DMAMUX request generator, disable the DMAMUX request generator overrun IT */
  13951. /* disable the request gen overrun IT */
  13952. hdma->DMAmuxRequestGen->RGCR &= ~DMAMUX_RGxCR_OIE;
  13953. 80063ea: 687b ldr r3, [r7, #4]
  13954. 80063ec: 6edb ldr r3, [r3, #108] @ 0x6c
  13955. 80063ee: 681a ldr r2, [r3, #0]
  13956. 80063f0: 687b ldr r3, [r7, #4]
  13957. 80063f2: 6edb ldr r3, [r3, #108] @ 0x6c
  13958. 80063f4: f422 7280 bic.w r2, r2, #256 @ 0x100
  13959. 80063f8: 601a str r2, [r3, #0]
  13960. /* Clear the DMAMUX request generator overrun flag */
  13961. hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;
  13962. 80063fa: 687b ldr r3, [r7, #4]
  13963. 80063fc: 6f1b ldr r3, [r3, #112] @ 0x70
  13964. 80063fe: 687a ldr r2, [r7, #4]
  13965. 8006400: 6f52 ldr r2, [r2, #116] @ 0x74
  13966. 8006402: 605a str r2, [r3, #4]
  13967. }
  13968. }
  13969. /* Change the DMA state */
  13970. hdma->State = HAL_DMA_STATE_READY;
  13971. 8006404: 687b ldr r3, [r7, #4]
  13972. 8006406: 2201 movs r2, #1
  13973. 8006408: f883 2035 strb.w r2, [r3, #53] @ 0x35
  13974. /* Process Unlocked */
  13975. __HAL_UNLOCK(hdma);
  13976. 800640c: 687b ldr r3, [r7, #4]
  13977. 800640e: 2200 movs r2, #0
  13978. 8006410: f883 2034 strb.w r2, [r3, #52] @ 0x34
  13979. }
  13980. return HAL_OK;
  13981. 8006414: 2300 movs r3, #0
  13982. }
  13983. 8006416: 4618 mov r0, r3
  13984. 8006418: 3718 adds r7, #24
  13985. 800641a: 46bd mov sp, r7
  13986. 800641c: bd80 pop {r7, pc}
  13987. 800641e: bf00 nop
  13988. 8006420: 40020010 .word 0x40020010
  13989. 8006424: 40020028 .word 0x40020028
  13990. 8006428: 40020040 .word 0x40020040
  13991. 800642c: 40020058 .word 0x40020058
  13992. 8006430: 40020070 .word 0x40020070
  13993. 8006434: 40020088 .word 0x40020088
  13994. 8006438: 400200a0 .word 0x400200a0
  13995. 800643c: 400200b8 .word 0x400200b8
  13996. 8006440: 40020410 .word 0x40020410
  13997. 8006444: 40020428 .word 0x40020428
  13998. 8006448: 40020440 .word 0x40020440
  13999. 800644c: 40020458 .word 0x40020458
  14000. 8006450: 40020470 .word 0x40020470
  14001. 8006454: 40020488 .word 0x40020488
  14002. 8006458: 400204a0 .word 0x400204a0
  14003. 800645c: 400204b8 .word 0x400204b8
  14004. 8006460: 58025408 .word 0x58025408
  14005. 8006464: 5802541c .word 0x5802541c
  14006. 8006468: 58025430 .word 0x58025430
  14007. 800646c: 58025444 .word 0x58025444
  14008. 8006470: 58025458 .word 0x58025458
  14009. 8006474: 5802546c .word 0x5802546c
  14010. 8006478: 58025480 .word 0x58025480
  14011. 800647c: 58025494 .word 0x58025494
  14012. 08006480 <HAL_DMA_Abort_IT>:
  14013. * @param hdma : pointer to a DMA_HandleTypeDef structure that contains
  14014. * the configuration information for the specified DMA Stream.
  14015. * @retval HAL status
  14016. */
  14017. HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
  14018. {
  14019. 8006480: b580 push {r7, lr}
  14020. 8006482: b084 sub sp, #16
  14021. 8006484: af00 add r7, sp, #0
  14022. 8006486: 6078 str r0, [r7, #4]
  14023. BDMA_Base_Registers *regs_bdma;
  14024. /* Check the DMA peripheral handle */
  14025. if(hdma == NULL)
  14026. 8006488: 687b ldr r3, [r7, #4]
  14027. 800648a: 2b00 cmp r3, #0
  14028. 800648c: d101 bne.n 8006492 <HAL_DMA_Abort_IT+0x12>
  14029. {
  14030. return HAL_ERROR;
  14031. 800648e: 2301 movs r3, #1
  14032. 8006490: e237 b.n 8006902 <HAL_DMA_Abort_IT+0x482>
  14033. }
  14034. if(hdma->State != HAL_DMA_STATE_BUSY)
  14035. 8006492: 687b ldr r3, [r7, #4]
  14036. 8006494: f893 3035 ldrb.w r3, [r3, #53] @ 0x35
  14037. 8006498: b2db uxtb r3, r3
  14038. 800649a: 2b02 cmp r3, #2
  14039. 800649c: d004 beq.n 80064a8 <HAL_DMA_Abort_IT+0x28>
  14040. {
  14041. hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER;
  14042. 800649e: 687b ldr r3, [r7, #4]
  14043. 80064a0: 2280 movs r2, #128 @ 0x80
  14044. 80064a2: 655a str r2, [r3, #84] @ 0x54
  14045. return HAL_ERROR;
  14046. 80064a4: 2301 movs r3, #1
  14047. 80064a6: e22c b.n 8006902 <HAL_DMA_Abort_IT+0x482>
  14048. }
  14049. else
  14050. {
  14051. if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U) /* DMA1 or DMA2 instance */
  14052. 80064a8: 687b ldr r3, [r7, #4]
  14053. 80064aa: 681b ldr r3, [r3, #0]
  14054. 80064ac: 4a5c ldr r2, [pc, #368] @ (8006620 <HAL_DMA_Abort_IT+0x1a0>)
  14055. 80064ae: 4293 cmp r3, r2
  14056. 80064b0: d04a beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14057. 80064b2: 687b ldr r3, [r7, #4]
  14058. 80064b4: 681b ldr r3, [r3, #0]
  14059. 80064b6: 4a5b ldr r2, [pc, #364] @ (8006624 <HAL_DMA_Abort_IT+0x1a4>)
  14060. 80064b8: 4293 cmp r3, r2
  14061. 80064ba: d045 beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14062. 80064bc: 687b ldr r3, [r7, #4]
  14063. 80064be: 681b ldr r3, [r3, #0]
  14064. 80064c0: 4a59 ldr r2, [pc, #356] @ (8006628 <HAL_DMA_Abort_IT+0x1a8>)
  14065. 80064c2: 4293 cmp r3, r2
  14066. 80064c4: d040 beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14067. 80064c6: 687b ldr r3, [r7, #4]
  14068. 80064c8: 681b ldr r3, [r3, #0]
  14069. 80064ca: 4a58 ldr r2, [pc, #352] @ (800662c <HAL_DMA_Abort_IT+0x1ac>)
  14070. 80064cc: 4293 cmp r3, r2
  14071. 80064ce: d03b beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14072. 80064d0: 687b ldr r3, [r7, #4]
  14073. 80064d2: 681b ldr r3, [r3, #0]
  14074. 80064d4: 4a56 ldr r2, [pc, #344] @ (8006630 <HAL_DMA_Abort_IT+0x1b0>)
  14075. 80064d6: 4293 cmp r3, r2
  14076. 80064d8: d036 beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14077. 80064da: 687b ldr r3, [r7, #4]
  14078. 80064dc: 681b ldr r3, [r3, #0]
  14079. 80064de: 4a55 ldr r2, [pc, #340] @ (8006634 <HAL_DMA_Abort_IT+0x1b4>)
  14080. 80064e0: 4293 cmp r3, r2
  14081. 80064e2: d031 beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14082. 80064e4: 687b ldr r3, [r7, #4]
  14083. 80064e6: 681b ldr r3, [r3, #0]
  14084. 80064e8: 4a53 ldr r2, [pc, #332] @ (8006638 <HAL_DMA_Abort_IT+0x1b8>)
  14085. 80064ea: 4293 cmp r3, r2
  14086. 80064ec: d02c beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14087. 80064ee: 687b ldr r3, [r7, #4]
  14088. 80064f0: 681b ldr r3, [r3, #0]
  14089. 80064f2: 4a52 ldr r2, [pc, #328] @ (800663c <HAL_DMA_Abort_IT+0x1bc>)
  14090. 80064f4: 4293 cmp r3, r2
  14091. 80064f6: d027 beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14092. 80064f8: 687b ldr r3, [r7, #4]
  14093. 80064fa: 681b ldr r3, [r3, #0]
  14094. 80064fc: 4a50 ldr r2, [pc, #320] @ (8006640 <HAL_DMA_Abort_IT+0x1c0>)
  14095. 80064fe: 4293 cmp r3, r2
  14096. 8006500: d022 beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14097. 8006502: 687b ldr r3, [r7, #4]
  14098. 8006504: 681b ldr r3, [r3, #0]
  14099. 8006506: 4a4f ldr r2, [pc, #316] @ (8006644 <HAL_DMA_Abort_IT+0x1c4>)
  14100. 8006508: 4293 cmp r3, r2
  14101. 800650a: d01d beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14102. 800650c: 687b ldr r3, [r7, #4]
  14103. 800650e: 681b ldr r3, [r3, #0]
  14104. 8006510: 4a4d ldr r2, [pc, #308] @ (8006648 <HAL_DMA_Abort_IT+0x1c8>)
  14105. 8006512: 4293 cmp r3, r2
  14106. 8006514: d018 beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14107. 8006516: 687b ldr r3, [r7, #4]
  14108. 8006518: 681b ldr r3, [r3, #0]
  14109. 800651a: 4a4c ldr r2, [pc, #304] @ (800664c <HAL_DMA_Abort_IT+0x1cc>)
  14110. 800651c: 4293 cmp r3, r2
  14111. 800651e: d013 beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14112. 8006520: 687b ldr r3, [r7, #4]
  14113. 8006522: 681b ldr r3, [r3, #0]
  14114. 8006524: 4a4a ldr r2, [pc, #296] @ (8006650 <HAL_DMA_Abort_IT+0x1d0>)
  14115. 8006526: 4293 cmp r3, r2
  14116. 8006528: d00e beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14117. 800652a: 687b ldr r3, [r7, #4]
  14118. 800652c: 681b ldr r3, [r3, #0]
  14119. 800652e: 4a49 ldr r2, [pc, #292] @ (8006654 <HAL_DMA_Abort_IT+0x1d4>)
  14120. 8006530: 4293 cmp r3, r2
  14121. 8006532: d009 beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14122. 8006534: 687b ldr r3, [r7, #4]
  14123. 8006536: 681b ldr r3, [r3, #0]
  14124. 8006538: 4a47 ldr r2, [pc, #284] @ (8006658 <HAL_DMA_Abort_IT+0x1d8>)
  14125. 800653a: 4293 cmp r3, r2
  14126. 800653c: d004 beq.n 8006548 <HAL_DMA_Abort_IT+0xc8>
  14127. 800653e: 687b ldr r3, [r7, #4]
  14128. 8006540: 681b ldr r3, [r3, #0]
  14129. 8006542: 4a46 ldr r2, [pc, #280] @ (800665c <HAL_DMA_Abort_IT+0x1dc>)
  14130. 8006544: 4293 cmp r3, r2
  14131. 8006546: d101 bne.n 800654c <HAL_DMA_Abort_IT+0xcc>
  14132. 8006548: 2301 movs r3, #1
  14133. 800654a: e000 b.n 800654e <HAL_DMA_Abort_IT+0xce>
  14134. 800654c: 2300 movs r3, #0
  14135. 800654e: 2b00 cmp r3, #0
  14136. 8006550: f000 8086 beq.w 8006660 <HAL_DMA_Abort_IT+0x1e0>
  14137. {
  14138. /* Set Abort State */
  14139. hdma->State = HAL_DMA_STATE_ABORT;
  14140. 8006554: 687b ldr r3, [r7, #4]
  14141. 8006556: 2204 movs r2, #4
  14142. 8006558: f883 2035 strb.w r2, [r3, #53] @ 0x35
  14143. /* Disable the stream */
  14144. __HAL_DMA_DISABLE(hdma);
  14145. 800655c: 687b ldr r3, [r7, #4]
  14146. 800655e: 681b ldr r3, [r3, #0]
  14147. 8006560: 4a2f ldr r2, [pc, #188] @ (8006620 <HAL_DMA_Abort_IT+0x1a0>)
  14148. 8006562: 4293 cmp r3, r2
  14149. 8006564: d04a beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14150. 8006566: 687b ldr r3, [r7, #4]
  14151. 8006568: 681b ldr r3, [r3, #0]
  14152. 800656a: 4a2e ldr r2, [pc, #184] @ (8006624 <HAL_DMA_Abort_IT+0x1a4>)
  14153. 800656c: 4293 cmp r3, r2
  14154. 800656e: d045 beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14155. 8006570: 687b ldr r3, [r7, #4]
  14156. 8006572: 681b ldr r3, [r3, #0]
  14157. 8006574: 4a2c ldr r2, [pc, #176] @ (8006628 <HAL_DMA_Abort_IT+0x1a8>)
  14158. 8006576: 4293 cmp r3, r2
  14159. 8006578: d040 beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14160. 800657a: 687b ldr r3, [r7, #4]
  14161. 800657c: 681b ldr r3, [r3, #0]
  14162. 800657e: 4a2b ldr r2, [pc, #172] @ (800662c <HAL_DMA_Abort_IT+0x1ac>)
  14163. 8006580: 4293 cmp r3, r2
  14164. 8006582: d03b beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14165. 8006584: 687b ldr r3, [r7, #4]
  14166. 8006586: 681b ldr r3, [r3, #0]
  14167. 8006588: 4a29 ldr r2, [pc, #164] @ (8006630 <HAL_DMA_Abort_IT+0x1b0>)
  14168. 800658a: 4293 cmp r3, r2
  14169. 800658c: d036 beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14170. 800658e: 687b ldr r3, [r7, #4]
  14171. 8006590: 681b ldr r3, [r3, #0]
  14172. 8006592: 4a28 ldr r2, [pc, #160] @ (8006634 <HAL_DMA_Abort_IT+0x1b4>)
  14173. 8006594: 4293 cmp r3, r2
  14174. 8006596: d031 beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14175. 8006598: 687b ldr r3, [r7, #4]
  14176. 800659a: 681b ldr r3, [r3, #0]
  14177. 800659c: 4a26 ldr r2, [pc, #152] @ (8006638 <HAL_DMA_Abort_IT+0x1b8>)
  14178. 800659e: 4293 cmp r3, r2
  14179. 80065a0: d02c beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14180. 80065a2: 687b ldr r3, [r7, #4]
  14181. 80065a4: 681b ldr r3, [r3, #0]
  14182. 80065a6: 4a25 ldr r2, [pc, #148] @ (800663c <HAL_DMA_Abort_IT+0x1bc>)
  14183. 80065a8: 4293 cmp r3, r2
  14184. 80065aa: d027 beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14185. 80065ac: 687b ldr r3, [r7, #4]
  14186. 80065ae: 681b ldr r3, [r3, #0]
  14187. 80065b0: 4a23 ldr r2, [pc, #140] @ (8006640 <HAL_DMA_Abort_IT+0x1c0>)
  14188. 80065b2: 4293 cmp r3, r2
  14189. 80065b4: d022 beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14190. 80065b6: 687b ldr r3, [r7, #4]
  14191. 80065b8: 681b ldr r3, [r3, #0]
  14192. 80065ba: 4a22 ldr r2, [pc, #136] @ (8006644 <HAL_DMA_Abort_IT+0x1c4>)
  14193. 80065bc: 4293 cmp r3, r2
  14194. 80065be: d01d beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14195. 80065c0: 687b ldr r3, [r7, #4]
  14196. 80065c2: 681b ldr r3, [r3, #0]
  14197. 80065c4: 4a20 ldr r2, [pc, #128] @ (8006648 <HAL_DMA_Abort_IT+0x1c8>)
  14198. 80065c6: 4293 cmp r3, r2
  14199. 80065c8: d018 beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14200. 80065ca: 687b ldr r3, [r7, #4]
  14201. 80065cc: 681b ldr r3, [r3, #0]
  14202. 80065ce: 4a1f ldr r2, [pc, #124] @ (800664c <HAL_DMA_Abort_IT+0x1cc>)
  14203. 80065d0: 4293 cmp r3, r2
  14204. 80065d2: d013 beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14205. 80065d4: 687b ldr r3, [r7, #4]
  14206. 80065d6: 681b ldr r3, [r3, #0]
  14207. 80065d8: 4a1d ldr r2, [pc, #116] @ (8006650 <HAL_DMA_Abort_IT+0x1d0>)
  14208. 80065da: 4293 cmp r3, r2
  14209. 80065dc: d00e beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14210. 80065de: 687b ldr r3, [r7, #4]
  14211. 80065e0: 681b ldr r3, [r3, #0]
  14212. 80065e2: 4a1c ldr r2, [pc, #112] @ (8006654 <HAL_DMA_Abort_IT+0x1d4>)
  14213. 80065e4: 4293 cmp r3, r2
  14214. 80065e6: d009 beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14215. 80065e8: 687b ldr r3, [r7, #4]
  14216. 80065ea: 681b ldr r3, [r3, #0]
  14217. 80065ec: 4a1a ldr r2, [pc, #104] @ (8006658 <HAL_DMA_Abort_IT+0x1d8>)
  14218. 80065ee: 4293 cmp r3, r2
  14219. 80065f0: d004 beq.n 80065fc <HAL_DMA_Abort_IT+0x17c>
  14220. 80065f2: 687b ldr r3, [r7, #4]
  14221. 80065f4: 681b ldr r3, [r3, #0]
  14222. 80065f6: 4a19 ldr r2, [pc, #100] @ (800665c <HAL_DMA_Abort_IT+0x1dc>)
  14223. 80065f8: 4293 cmp r3, r2
  14224. 80065fa: d108 bne.n 800660e <HAL_DMA_Abort_IT+0x18e>
  14225. 80065fc: 687b ldr r3, [r7, #4]
  14226. 80065fe: 681b ldr r3, [r3, #0]
  14227. 8006600: 681a ldr r2, [r3, #0]
  14228. 8006602: 687b ldr r3, [r7, #4]
  14229. 8006604: 681b ldr r3, [r3, #0]
  14230. 8006606: f022 0201 bic.w r2, r2, #1
  14231. 800660a: 601a str r2, [r3, #0]
  14232. 800660c: e178 b.n 8006900 <HAL_DMA_Abort_IT+0x480>
  14233. 800660e: 687b ldr r3, [r7, #4]
  14234. 8006610: 681b ldr r3, [r3, #0]
  14235. 8006612: 681a ldr r2, [r3, #0]
  14236. 8006614: 687b ldr r3, [r7, #4]
  14237. 8006616: 681b ldr r3, [r3, #0]
  14238. 8006618: f022 0201 bic.w r2, r2, #1
  14239. 800661c: 601a str r2, [r3, #0]
  14240. 800661e: e16f b.n 8006900 <HAL_DMA_Abort_IT+0x480>
  14241. 8006620: 40020010 .word 0x40020010
  14242. 8006624: 40020028 .word 0x40020028
  14243. 8006628: 40020040 .word 0x40020040
  14244. 800662c: 40020058 .word 0x40020058
  14245. 8006630: 40020070 .word 0x40020070
  14246. 8006634: 40020088 .word 0x40020088
  14247. 8006638: 400200a0 .word 0x400200a0
  14248. 800663c: 400200b8 .word 0x400200b8
  14249. 8006640: 40020410 .word 0x40020410
  14250. 8006644: 40020428 .word 0x40020428
  14251. 8006648: 40020440 .word 0x40020440
  14252. 800664c: 40020458 .word 0x40020458
  14253. 8006650: 40020470 .word 0x40020470
  14254. 8006654: 40020488 .word 0x40020488
  14255. 8006658: 400204a0 .word 0x400204a0
  14256. 800665c: 400204b8 .word 0x400204b8
  14257. }
  14258. else /* BDMA channel */
  14259. {
  14260. /* Disable DMA All Interrupts */
  14261. ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR &= ~(BDMA_CCR_TCIE | BDMA_CCR_HTIE | BDMA_CCR_TEIE);
  14262. 8006660: 687b ldr r3, [r7, #4]
  14263. 8006662: 681b ldr r3, [r3, #0]
  14264. 8006664: 681a ldr r2, [r3, #0]
  14265. 8006666: 687b ldr r3, [r7, #4]
  14266. 8006668: 681b ldr r3, [r3, #0]
  14267. 800666a: f022 020e bic.w r2, r2, #14
  14268. 800666e: 601a str r2, [r3, #0]
  14269. /* Disable the channel */
  14270. __HAL_DMA_DISABLE(hdma);
  14271. 8006670: 687b ldr r3, [r7, #4]
  14272. 8006672: 681b ldr r3, [r3, #0]
  14273. 8006674: 4a6c ldr r2, [pc, #432] @ (8006828 <HAL_DMA_Abort_IT+0x3a8>)
  14274. 8006676: 4293 cmp r3, r2
  14275. 8006678: d04a beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14276. 800667a: 687b ldr r3, [r7, #4]
  14277. 800667c: 681b ldr r3, [r3, #0]
  14278. 800667e: 4a6b ldr r2, [pc, #428] @ (800682c <HAL_DMA_Abort_IT+0x3ac>)
  14279. 8006680: 4293 cmp r3, r2
  14280. 8006682: d045 beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14281. 8006684: 687b ldr r3, [r7, #4]
  14282. 8006686: 681b ldr r3, [r3, #0]
  14283. 8006688: 4a69 ldr r2, [pc, #420] @ (8006830 <HAL_DMA_Abort_IT+0x3b0>)
  14284. 800668a: 4293 cmp r3, r2
  14285. 800668c: d040 beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14286. 800668e: 687b ldr r3, [r7, #4]
  14287. 8006690: 681b ldr r3, [r3, #0]
  14288. 8006692: 4a68 ldr r2, [pc, #416] @ (8006834 <HAL_DMA_Abort_IT+0x3b4>)
  14289. 8006694: 4293 cmp r3, r2
  14290. 8006696: d03b beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14291. 8006698: 687b ldr r3, [r7, #4]
  14292. 800669a: 681b ldr r3, [r3, #0]
  14293. 800669c: 4a66 ldr r2, [pc, #408] @ (8006838 <HAL_DMA_Abort_IT+0x3b8>)
  14294. 800669e: 4293 cmp r3, r2
  14295. 80066a0: d036 beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14296. 80066a2: 687b ldr r3, [r7, #4]
  14297. 80066a4: 681b ldr r3, [r3, #0]
  14298. 80066a6: 4a65 ldr r2, [pc, #404] @ (800683c <HAL_DMA_Abort_IT+0x3bc>)
  14299. 80066a8: 4293 cmp r3, r2
  14300. 80066aa: d031 beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14301. 80066ac: 687b ldr r3, [r7, #4]
  14302. 80066ae: 681b ldr r3, [r3, #0]
  14303. 80066b0: 4a63 ldr r2, [pc, #396] @ (8006840 <HAL_DMA_Abort_IT+0x3c0>)
  14304. 80066b2: 4293 cmp r3, r2
  14305. 80066b4: d02c beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14306. 80066b6: 687b ldr r3, [r7, #4]
  14307. 80066b8: 681b ldr r3, [r3, #0]
  14308. 80066ba: 4a62 ldr r2, [pc, #392] @ (8006844 <HAL_DMA_Abort_IT+0x3c4>)
  14309. 80066bc: 4293 cmp r3, r2
  14310. 80066be: d027 beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14311. 80066c0: 687b ldr r3, [r7, #4]
  14312. 80066c2: 681b ldr r3, [r3, #0]
  14313. 80066c4: 4a60 ldr r2, [pc, #384] @ (8006848 <HAL_DMA_Abort_IT+0x3c8>)
  14314. 80066c6: 4293 cmp r3, r2
  14315. 80066c8: d022 beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14316. 80066ca: 687b ldr r3, [r7, #4]
  14317. 80066cc: 681b ldr r3, [r3, #0]
  14318. 80066ce: 4a5f ldr r2, [pc, #380] @ (800684c <HAL_DMA_Abort_IT+0x3cc>)
  14319. 80066d0: 4293 cmp r3, r2
  14320. 80066d2: d01d beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14321. 80066d4: 687b ldr r3, [r7, #4]
  14322. 80066d6: 681b ldr r3, [r3, #0]
  14323. 80066d8: 4a5d ldr r2, [pc, #372] @ (8006850 <HAL_DMA_Abort_IT+0x3d0>)
  14324. 80066da: 4293 cmp r3, r2
  14325. 80066dc: d018 beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14326. 80066de: 687b ldr r3, [r7, #4]
  14327. 80066e0: 681b ldr r3, [r3, #0]
  14328. 80066e2: 4a5c ldr r2, [pc, #368] @ (8006854 <HAL_DMA_Abort_IT+0x3d4>)
  14329. 80066e4: 4293 cmp r3, r2
  14330. 80066e6: d013 beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14331. 80066e8: 687b ldr r3, [r7, #4]
  14332. 80066ea: 681b ldr r3, [r3, #0]
  14333. 80066ec: 4a5a ldr r2, [pc, #360] @ (8006858 <HAL_DMA_Abort_IT+0x3d8>)
  14334. 80066ee: 4293 cmp r3, r2
  14335. 80066f0: d00e beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14336. 80066f2: 687b ldr r3, [r7, #4]
  14337. 80066f4: 681b ldr r3, [r3, #0]
  14338. 80066f6: 4a59 ldr r2, [pc, #356] @ (800685c <HAL_DMA_Abort_IT+0x3dc>)
  14339. 80066f8: 4293 cmp r3, r2
  14340. 80066fa: d009 beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14341. 80066fc: 687b ldr r3, [r7, #4]
  14342. 80066fe: 681b ldr r3, [r3, #0]
  14343. 8006700: 4a57 ldr r2, [pc, #348] @ (8006860 <HAL_DMA_Abort_IT+0x3e0>)
  14344. 8006702: 4293 cmp r3, r2
  14345. 8006704: d004 beq.n 8006710 <HAL_DMA_Abort_IT+0x290>
  14346. 8006706: 687b ldr r3, [r7, #4]
  14347. 8006708: 681b ldr r3, [r3, #0]
  14348. 800670a: 4a56 ldr r2, [pc, #344] @ (8006864 <HAL_DMA_Abort_IT+0x3e4>)
  14349. 800670c: 4293 cmp r3, r2
  14350. 800670e: d108 bne.n 8006722 <HAL_DMA_Abort_IT+0x2a2>
  14351. 8006710: 687b ldr r3, [r7, #4]
  14352. 8006712: 681b ldr r3, [r3, #0]
  14353. 8006714: 681a ldr r2, [r3, #0]
  14354. 8006716: 687b ldr r3, [r7, #4]
  14355. 8006718: 681b ldr r3, [r3, #0]
  14356. 800671a: f022 0201 bic.w r2, r2, #1
  14357. 800671e: 601a str r2, [r3, #0]
  14358. 8006720: e007 b.n 8006732 <HAL_DMA_Abort_IT+0x2b2>
  14359. 8006722: 687b ldr r3, [r7, #4]
  14360. 8006724: 681b ldr r3, [r3, #0]
  14361. 8006726: 681a ldr r2, [r3, #0]
  14362. 8006728: 687b ldr r3, [r7, #4]
  14363. 800672a: 681b ldr r3, [r3, #0]
  14364. 800672c: f022 0201 bic.w r2, r2, #1
  14365. 8006730: 601a str r2, [r3, #0]
  14366. if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U) /* No DMAMUX available for BDMA1 */
  14367. 8006732: 687b ldr r3, [r7, #4]
  14368. 8006734: 681b ldr r3, [r3, #0]
  14369. 8006736: 4a3c ldr r2, [pc, #240] @ (8006828 <HAL_DMA_Abort_IT+0x3a8>)
  14370. 8006738: 4293 cmp r3, r2
  14371. 800673a: d072 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14372. 800673c: 687b ldr r3, [r7, #4]
  14373. 800673e: 681b ldr r3, [r3, #0]
  14374. 8006740: 4a3a ldr r2, [pc, #232] @ (800682c <HAL_DMA_Abort_IT+0x3ac>)
  14375. 8006742: 4293 cmp r3, r2
  14376. 8006744: d06d beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14377. 8006746: 687b ldr r3, [r7, #4]
  14378. 8006748: 681b ldr r3, [r3, #0]
  14379. 800674a: 4a39 ldr r2, [pc, #228] @ (8006830 <HAL_DMA_Abort_IT+0x3b0>)
  14380. 800674c: 4293 cmp r3, r2
  14381. 800674e: d068 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14382. 8006750: 687b ldr r3, [r7, #4]
  14383. 8006752: 681b ldr r3, [r3, #0]
  14384. 8006754: 4a37 ldr r2, [pc, #220] @ (8006834 <HAL_DMA_Abort_IT+0x3b4>)
  14385. 8006756: 4293 cmp r3, r2
  14386. 8006758: d063 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14387. 800675a: 687b ldr r3, [r7, #4]
  14388. 800675c: 681b ldr r3, [r3, #0]
  14389. 800675e: 4a36 ldr r2, [pc, #216] @ (8006838 <HAL_DMA_Abort_IT+0x3b8>)
  14390. 8006760: 4293 cmp r3, r2
  14391. 8006762: d05e beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14392. 8006764: 687b ldr r3, [r7, #4]
  14393. 8006766: 681b ldr r3, [r3, #0]
  14394. 8006768: 4a34 ldr r2, [pc, #208] @ (800683c <HAL_DMA_Abort_IT+0x3bc>)
  14395. 800676a: 4293 cmp r3, r2
  14396. 800676c: d059 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14397. 800676e: 687b ldr r3, [r7, #4]
  14398. 8006770: 681b ldr r3, [r3, #0]
  14399. 8006772: 4a33 ldr r2, [pc, #204] @ (8006840 <HAL_DMA_Abort_IT+0x3c0>)
  14400. 8006774: 4293 cmp r3, r2
  14401. 8006776: d054 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14402. 8006778: 687b ldr r3, [r7, #4]
  14403. 800677a: 681b ldr r3, [r3, #0]
  14404. 800677c: 4a31 ldr r2, [pc, #196] @ (8006844 <HAL_DMA_Abort_IT+0x3c4>)
  14405. 800677e: 4293 cmp r3, r2
  14406. 8006780: d04f beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14407. 8006782: 687b ldr r3, [r7, #4]
  14408. 8006784: 681b ldr r3, [r3, #0]
  14409. 8006786: 4a30 ldr r2, [pc, #192] @ (8006848 <HAL_DMA_Abort_IT+0x3c8>)
  14410. 8006788: 4293 cmp r3, r2
  14411. 800678a: d04a beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14412. 800678c: 687b ldr r3, [r7, #4]
  14413. 800678e: 681b ldr r3, [r3, #0]
  14414. 8006790: 4a2e ldr r2, [pc, #184] @ (800684c <HAL_DMA_Abort_IT+0x3cc>)
  14415. 8006792: 4293 cmp r3, r2
  14416. 8006794: d045 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14417. 8006796: 687b ldr r3, [r7, #4]
  14418. 8006798: 681b ldr r3, [r3, #0]
  14419. 800679a: 4a2d ldr r2, [pc, #180] @ (8006850 <HAL_DMA_Abort_IT+0x3d0>)
  14420. 800679c: 4293 cmp r3, r2
  14421. 800679e: d040 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14422. 80067a0: 687b ldr r3, [r7, #4]
  14423. 80067a2: 681b ldr r3, [r3, #0]
  14424. 80067a4: 4a2b ldr r2, [pc, #172] @ (8006854 <HAL_DMA_Abort_IT+0x3d4>)
  14425. 80067a6: 4293 cmp r3, r2
  14426. 80067a8: d03b beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14427. 80067aa: 687b ldr r3, [r7, #4]
  14428. 80067ac: 681b ldr r3, [r3, #0]
  14429. 80067ae: 4a2a ldr r2, [pc, #168] @ (8006858 <HAL_DMA_Abort_IT+0x3d8>)
  14430. 80067b0: 4293 cmp r3, r2
  14431. 80067b2: d036 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14432. 80067b4: 687b ldr r3, [r7, #4]
  14433. 80067b6: 681b ldr r3, [r3, #0]
  14434. 80067b8: 4a28 ldr r2, [pc, #160] @ (800685c <HAL_DMA_Abort_IT+0x3dc>)
  14435. 80067ba: 4293 cmp r3, r2
  14436. 80067bc: d031 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14437. 80067be: 687b ldr r3, [r7, #4]
  14438. 80067c0: 681b ldr r3, [r3, #0]
  14439. 80067c2: 4a27 ldr r2, [pc, #156] @ (8006860 <HAL_DMA_Abort_IT+0x3e0>)
  14440. 80067c4: 4293 cmp r3, r2
  14441. 80067c6: d02c beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14442. 80067c8: 687b ldr r3, [r7, #4]
  14443. 80067ca: 681b ldr r3, [r3, #0]
  14444. 80067cc: 4a25 ldr r2, [pc, #148] @ (8006864 <HAL_DMA_Abort_IT+0x3e4>)
  14445. 80067ce: 4293 cmp r3, r2
  14446. 80067d0: d027 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14447. 80067d2: 687b ldr r3, [r7, #4]
  14448. 80067d4: 681b ldr r3, [r3, #0]
  14449. 80067d6: 4a24 ldr r2, [pc, #144] @ (8006868 <HAL_DMA_Abort_IT+0x3e8>)
  14450. 80067d8: 4293 cmp r3, r2
  14451. 80067da: d022 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14452. 80067dc: 687b ldr r3, [r7, #4]
  14453. 80067de: 681b ldr r3, [r3, #0]
  14454. 80067e0: 4a22 ldr r2, [pc, #136] @ (800686c <HAL_DMA_Abort_IT+0x3ec>)
  14455. 80067e2: 4293 cmp r3, r2
  14456. 80067e4: d01d beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14457. 80067e6: 687b ldr r3, [r7, #4]
  14458. 80067e8: 681b ldr r3, [r3, #0]
  14459. 80067ea: 4a21 ldr r2, [pc, #132] @ (8006870 <HAL_DMA_Abort_IT+0x3f0>)
  14460. 80067ec: 4293 cmp r3, r2
  14461. 80067ee: d018 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14462. 80067f0: 687b ldr r3, [r7, #4]
  14463. 80067f2: 681b ldr r3, [r3, #0]
  14464. 80067f4: 4a1f ldr r2, [pc, #124] @ (8006874 <HAL_DMA_Abort_IT+0x3f4>)
  14465. 80067f6: 4293 cmp r3, r2
  14466. 80067f8: d013 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14467. 80067fa: 687b ldr r3, [r7, #4]
  14468. 80067fc: 681b ldr r3, [r3, #0]
  14469. 80067fe: 4a1e ldr r2, [pc, #120] @ (8006878 <HAL_DMA_Abort_IT+0x3f8>)
  14470. 8006800: 4293 cmp r3, r2
  14471. 8006802: d00e beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14472. 8006804: 687b ldr r3, [r7, #4]
  14473. 8006806: 681b ldr r3, [r3, #0]
  14474. 8006808: 4a1c ldr r2, [pc, #112] @ (800687c <HAL_DMA_Abort_IT+0x3fc>)
  14475. 800680a: 4293 cmp r3, r2
  14476. 800680c: d009 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14477. 800680e: 687b ldr r3, [r7, #4]
  14478. 8006810: 681b ldr r3, [r3, #0]
  14479. 8006812: 4a1b ldr r2, [pc, #108] @ (8006880 <HAL_DMA_Abort_IT+0x400>)
  14480. 8006814: 4293 cmp r3, r2
  14481. 8006816: d004 beq.n 8006822 <HAL_DMA_Abort_IT+0x3a2>
  14482. 8006818: 687b ldr r3, [r7, #4]
  14483. 800681a: 681b ldr r3, [r3, #0]
  14484. 800681c: 4a19 ldr r2, [pc, #100] @ (8006884 <HAL_DMA_Abort_IT+0x404>)
  14485. 800681e: 4293 cmp r3, r2
  14486. 8006820: d132 bne.n 8006888 <HAL_DMA_Abort_IT+0x408>
  14487. 8006822: 2301 movs r3, #1
  14488. 8006824: e031 b.n 800688a <HAL_DMA_Abort_IT+0x40a>
  14489. 8006826: bf00 nop
  14490. 8006828: 40020010 .word 0x40020010
  14491. 800682c: 40020028 .word 0x40020028
  14492. 8006830: 40020040 .word 0x40020040
  14493. 8006834: 40020058 .word 0x40020058
  14494. 8006838: 40020070 .word 0x40020070
  14495. 800683c: 40020088 .word 0x40020088
  14496. 8006840: 400200a0 .word 0x400200a0
  14497. 8006844: 400200b8 .word 0x400200b8
  14498. 8006848: 40020410 .word 0x40020410
  14499. 800684c: 40020428 .word 0x40020428
  14500. 8006850: 40020440 .word 0x40020440
  14501. 8006854: 40020458 .word 0x40020458
  14502. 8006858: 40020470 .word 0x40020470
  14503. 800685c: 40020488 .word 0x40020488
  14504. 8006860: 400204a0 .word 0x400204a0
  14505. 8006864: 400204b8 .word 0x400204b8
  14506. 8006868: 58025408 .word 0x58025408
  14507. 800686c: 5802541c .word 0x5802541c
  14508. 8006870: 58025430 .word 0x58025430
  14509. 8006874: 58025444 .word 0x58025444
  14510. 8006878: 58025458 .word 0x58025458
  14511. 800687c: 5802546c .word 0x5802546c
  14512. 8006880: 58025480 .word 0x58025480
  14513. 8006884: 58025494 .word 0x58025494
  14514. 8006888: 2300 movs r3, #0
  14515. 800688a: 2b00 cmp r3, #0
  14516. 800688c: d028 beq.n 80068e0 <HAL_DMA_Abort_IT+0x460>
  14517. {
  14518. /* disable the DMAMUX sync overrun IT */
  14519. hdma->DMAmuxChannel->CCR &= ~DMAMUX_CxCR_SOIE;
  14520. 800688e: 687b ldr r3, [r7, #4]
  14521. 8006890: 6e1b ldr r3, [r3, #96] @ 0x60
  14522. 8006892: 681a ldr r2, [r3, #0]
  14523. 8006894: 687b ldr r3, [r7, #4]
  14524. 8006896: 6e1b ldr r3, [r3, #96] @ 0x60
  14525. 8006898: f422 7280 bic.w r2, r2, #256 @ 0x100
  14526. 800689c: 601a str r2, [r3, #0]
  14527. /* Clear all flags */
  14528. regs_bdma = (BDMA_Base_Registers *)hdma->StreamBaseAddress;
  14529. 800689e: 687b ldr r3, [r7, #4]
  14530. 80068a0: 6d9b ldr r3, [r3, #88] @ 0x58
  14531. 80068a2: 60fb str r3, [r7, #12]
  14532. regs_bdma->IFCR = ((BDMA_IFCR_CGIF0) << (hdma->StreamIndex & 0x1FU));
  14533. 80068a4: 687b ldr r3, [r7, #4]
  14534. 80068a6: 6ddb ldr r3, [r3, #92] @ 0x5c
  14535. 80068a8: f003 031f and.w r3, r3, #31
  14536. 80068ac: 2201 movs r2, #1
  14537. 80068ae: 409a lsls r2, r3
  14538. 80068b0: 68fb ldr r3, [r7, #12]
  14539. 80068b2: 605a str r2, [r3, #4]
  14540. /* Clear the DMAMUX synchro overrun flag */
  14541. hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;
  14542. 80068b4: 687b ldr r3, [r7, #4]
  14543. 80068b6: 6e5b ldr r3, [r3, #100] @ 0x64
  14544. 80068b8: 687a ldr r2, [r7, #4]
  14545. 80068ba: 6e92 ldr r2, [r2, #104] @ 0x68
  14546. 80068bc: 605a str r2, [r3, #4]
  14547. if(hdma->DMAmuxRequestGen != 0U)
  14548. 80068be: 687b ldr r3, [r7, #4]
  14549. 80068c0: 6edb ldr r3, [r3, #108] @ 0x6c
  14550. 80068c2: 2b00 cmp r3, #0
  14551. 80068c4: d00c beq.n 80068e0 <HAL_DMA_Abort_IT+0x460>
  14552. {
  14553. /* if using DMAMUX request generator, disable the DMAMUX request generator overrun IT*/
  14554. /* disable the request gen overrun IT */
  14555. hdma->DMAmuxRequestGen->RGCR &= ~DMAMUX_RGxCR_OIE;
  14556. 80068c6: 687b ldr r3, [r7, #4]
  14557. 80068c8: 6edb ldr r3, [r3, #108] @ 0x6c
  14558. 80068ca: 681a ldr r2, [r3, #0]
  14559. 80068cc: 687b ldr r3, [r7, #4]
  14560. 80068ce: 6edb ldr r3, [r3, #108] @ 0x6c
  14561. 80068d0: f422 7280 bic.w r2, r2, #256 @ 0x100
  14562. 80068d4: 601a str r2, [r3, #0]
  14563. /* Clear the DMAMUX request generator overrun flag */
  14564. hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;
  14565. 80068d6: 687b ldr r3, [r7, #4]
  14566. 80068d8: 6f1b ldr r3, [r3, #112] @ 0x70
  14567. 80068da: 687a ldr r2, [r7, #4]
  14568. 80068dc: 6f52 ldr r2, [r2, #116] @ 0x74
  14569. 80068de: 605a str r2, [r3, #4]
  14570. }
  14571. }
  14572. /* Change the DMA state */
  14573. hdma->State = HAL_DMA_STATE_READY;
  14574. 80068e0: 687b ldr r3, [r7, #4]
  14575. 80068e2: 2201 movs r2, #1
  14576. 80068e4: f883 2035 strb.w r2, [r3, #53] @ 0x35
  14577. /* Process Unlocked */
  14578. __HAL_UNLOCK(hdma);
  14579. 80068e8: 687b ldr r3, [r7, #4]
  14580. 80068ea: 2200 movs r2, #0
  14581. 80068ec: f883 2034 strb.w r2, [r3, #52] @ 0x34
  14582. /* Call User Abort callback */
  14583. if(hdma->XferAbortCallback != NULL)
  14584. 80068f0: 687b ldr r3, [r7, #4]
  14585. 80068f2: 6d1b ldr r3, [r3, #80] @ 0x50
  14586. 80068f4: 2b00 cmp r3, #0
  14587. 80068f6: d003 beq.n 8006900 <HAL_DMA_Abort_IT+0x480>
  14588. {
  14589. hdma->XferAbortCallback(hdma);
  14590. 80068f8: 687b ldr r3, [r7, #4]
  14591. 80068fa: 6d1b ldr r3, [r3, #80] @ 0x50
  14592. 80068fc: 6878 ldr r0, [r7, #4]
  14593. 80068fe: 4798 blx r3
  14594. }
  14595. }
  14596. }
  14597. return HAL_OK;
  14598. 8006900: 2300 movs r3, #0
  14599. }
  14600. 8006902: 4618 mov r0, r3
  14601. 8006904: 3710 adds r7, #16
  14602. 8006906: 46bd mov sp, r7
  14603. 8006908: bd80 pop {r7, pc}
  14604. 800690a: bf00 nop
  14605. 0800690c <HAL_DMA_IRQHandler>:
  14606. * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
  14607. * the configuration information for the specified DMA Stream.
  14608. * @retval None
  14609. */
  14610. void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)
  14611. {
  14612. 800690c: b580 push {r7, lr}
  14613. 800690e: b08a sub sp, #40 @ 0x28
  14614. 8006910: af00 add r7, sp, #0
  14615. 8006912: 6078 str r0, [r7, #4]
  14616. uint32_t tmpisr_dma, tmpisr_bdma;
  14617. uint32_t ccr_reg;
  14618. __IO uint32_t count = 0U;
  14619. 8006914: 2300 movs r3, #0
  14620. 8006916: 60fb str r3, [r7, #12]
  14621. uint32_t timeout = SystemCoreClock / 9600U;
  14622. 8006918: 4b67 ldr r3, [pc, #412] @ (8006ab8 <HAL_DMA_IRQHandler+0x1ac>)
  14623. 800691a: 681b ldr r3, [r3, #0]
  14624. 800691c: 4a67 ldr r2, [pc, #412] @ (8006abc <HAL_DMA_IRQHandler+0x1b0>)
  14625. 800691e: fba2 2303 umull r2, r3, r2, r3
  14626. 8006922: 0a9b lsrs r3, r3, #10
  14627. 8006924: 627b str r3, [r7, #36] @ 0x24
  14628. /* calculate DMA base and stream number */
  14629. DMA_Base_Registers *regs_dma = (DMA_Base_Registers *)hdma->StreamBaseAddress;
  14630. 8006926: 687b ldr r3, [r7, #4]
  14631. 8006928: 6d9b ldr r3, [r3, #88] @ 0x58
  14632. 800692a: 623b str r3, [r7, #32]
  14633. BDMA_Base_Registers *regs_bdma = (BDMA_Base_Registers *)hdma->StreamBaseAddress;
  14634. 800692c: 687b ldr r3, [r7, #4]
  14635. 800692e: 6d9b ldr r3, [r3, #88] @ 0x58
  14636. 8006930: 61fb str r3, [r7, #28]
  14637. tmpisr_dma = regs_dma->ISR;
  14638. 8006932: 6a3b ldr r3, [r7, #32]
  14639. 8006934: 681b ldr r3, [r3, #0]
  14640. 8006936: 61bb str r3, [r7, #24]
  14641. tmpisr_bdma = regs_bdma->ISR;
  14642. 8006938: 69fb ldr r3, [r7, #28]
  14643. 800693a: 681b ldr r3, [r3, #0]
  14644. 800693c: 617b str r3, [r7, #20]
  14645. if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U) /* DMA1 or DMA2 instance */
  14646. 800693e: 687b ldr r3, [r7, #4]
  14647. 8006940: 681b ldr r3, [r3, #0]
  14648. 8006942: 4a5f ldr r2, [pc, #380] @ (8006ac0 <HAL_DMA_IRQHandler+0x1b4>)
  14649. 8006944: 4293 cmp r3, r2
  14650. 8006946: d04a beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14651. 8006948: 687b ldr r3, [r7, #4]
  14652. 800694a: 681b ldr r3, [r3, #0]
  14653. 800694c: 4a5d ldr r2, [pc, #372] @ (8006ac4 <HAL_DMA_IRQHandler+0x1b8>)
  14654. 800694e: 4293 cmp r3, r2
  14655. 8006950: d045 beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14656. 8006952: 687b ldr r3, [r7, #4]
  14657. 8006954: 681b ldr r3, [r3, #0]
  14658. 8006956: 4a5c ldr r2, [pc, #368] @ (8006ac8 <HAL_DMA_IRQHandler+0x1bc>)
  14659. 8006958: 4293 cmp r3, r2
  14660. 800695a: d040 beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14661. 800695c: 687b ldr r3, [r7, #4]
  14662. 800695e: 681b ldr r3, [r3, #0]
  14663. 8006960: 4a5a ldr r2, [pc, #360] @ (8006acc <HAL_DMA_IRQHandler+0x1c0>)
  14664. 8006962: 4293 cmp r3, r2
  14665. 8006964: d03b beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14666. 8006966: 687b ldr r3, [r7, #4]
  14667. 8006968: 681b ldr r3, [r3, #0]
  14668. 800696a: 4a59 ldr r2, [pc, #356] @ (8006ad0 <HAL_DMA_IRQHandler+0x1c4>)
  14669. 800696c: 4293 cmp r3, r2
  14670. 800696e: d036 beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14671. 8006970: 687b ldr r3, [r7, #4]
  14672. 8006972: 681b ldr r3, [r3, #0]
  14673. 8006974: 4a57 ldr r2, [pc, #348] @ (8006ad4 <HAL_DMA_IRQHandler+0x1c8>)
  14674. 8006976: 4293 cmp r3, r2
  14675. 8006978: d031 beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14676. 800697a: 687b ldr r3, [r7, #4]
  14677. 800697c: 681b ldr r3, [r3, #0]
  14678. 800697e: 4a56 ldr r2, [pc, #344] @ (8006ad8 <HAL_DMA_IRQHandler+0x1cc>)
  14679. 8006980: 4293 cmp r3, r2
  14680. 8006982: d02c beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14681. 8006984: 687b ldr r3, [r7, #4]
  14682. 8006986: 681b ldr r3, [r3, #0]
  14683. 8006988: 4a54 ldr r2, [pc, #336] @ (8006adc <HAL_DMA_IRQHandler+0x1d0>)
  14684. 800698a: 4293 cmp r3, r2
  14685. 800698c: d027 beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14686. 800698e: 687b ldr r3, [r7, #4]
  14687. 8006990: 681b ldr r3, [r3, #0]
  14688. 8006992: 4a53 ldr r2, [pc, #332] @ (8006ae0 <HAL_DMA_IRQHandler+0x1d4>)
  14689. 8006994: 4293 cmp r3, r2
  14690. 8006996: d022 beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14691. 8006998: 687b ldr r3, [r7, #4]
  14692. 800699a: 681b ldr r3, [r3, #0]
  14693. 800699c: 4a51 ldr r2, [pc, #324] @ (8006ae4 <HAL_DMA_IRQHandler+0x1d8>)
  14694. 800699e: 4293 cmp r3, r2
  14695. 80069a0: d01d beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14696. 80069a2: 687b ldr r3, [r7, #4]
  14697. 80069a4: 681b ldr r3, [r3, #0]
  14698. 80069a6: 4a50 ldr r2, [pc, #320] @ (8006ae8 <HAL_DMA_IRQHandler+0x1dc>)
  14699. 80069a8: 4293 cmp r3, r2
  14700. 80069aa: d018 beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14701. 80069ac: 687b ldr r3, [r7, #4]
  14702. 80069ae: 681b ldr r3, [r3, #0]
  14703. 80069b0: 4a4e ldr r2, [pc, #312] @ (8006aec <HAL_DMA_IRQHandler+0x1e0>)
  14704. 80069b2: 4293 cmp r3, r2
  14705. 80069b4: d013 beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14706. 80069b6: 687b ldr r3, [r7, #4]
  14707. 80069b8: 681b ldr r3, [r3, #0]
  14708. 80069ba: 4a4d ldr r2, [pc, #308] @ (8006af0 <HAL_DMA_IRQHandler+0x1e4>)
  14709. 80069bc: 4293 cmp r3, r2
  14710. 80069be: d00e beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14711. 80069c0: 687b ldr r3, [r7, #4]
  14712. 80069c2: 681b ldr r3, [r3, #0]
  14713. 80069c4: 4a4b ldr r2, [pc, #300] @ (8006af4 <HAL_DMA_IRQHandler+0x1e8>)
  14714. 80069c6: 4293 cmp r3, r2
  14715. 80069c8: d009 beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14716. 80069ca: 687b ldr r3, [r7, #4]
  14717. 80069cc: 681b ldr r3, [r3, #0]
  14718. 80069ce: 4a4a ldr r2, [pc, #296] @ (8006af8 <HAL_DMA_IRQHandler+0x1ec>)
  14719. 80069d0: 4293 cmp r3, r2
  14720. 80069d2: d004 beq.n 80069de <HAL_DMA_IRQHandler+0xd2>
  14721. 80069d4: 687b ldr r3, [r7, #4]
  14722. 80069d6: 681b ldr r3, [r3, #0]
  14723. 80069d8: 4a48 ldr r2, [pc, #288] @ (8006afc <HAL_DMA_IRQHandler+0x1f0>)
  14724. 80069da: 4293 cmp r3, r2
  14725. 80069dc: d101 bne.n 80069e2 <HAL_DMA_IRQHandler+0xd6>
  14726. 80069de: 2301 movs r3, #1
  14727. 80069e0: e000 b.n 80069e4 <HAL_DMA_IRQHandler+0xd8>
  14728. 80069e2: 2300 movs r3, #0
  14729. 80069e4: 2b00 cmp r3, #0
  14730. 80069e6: f000 842b beq.w 8007240 <HAL_DMA_IRQHandler+0x934>
  14731. {
  14732. /* Transfer Error Interrupt management ***************************************/
  14733. if ((tmpisr_dma & (DMA_FLAG_TEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
  14734. 80069ea: 687b ldr r3, [r7, #4]
  14735. 80069ec: 6ddb ldr r3, [r3, #92] @ 0x5c
  14736. 80069ee: f003 031f and.w r3, r3, #31
  14737. 80069f2: 2208 movs r2, #8
  14738. 80069f4: 409a lsls r2, r3
  14739. 80069f6: 69bb ldr r3, [r7, #24]
  14740. 80069f8: 4013 ands r3, r2
  14741. 80069fa: 2b00 cmp r3, #0
  14742. 80069fc: f000 80a2 beq.w 8006b44 <HAL_DMA_IRQHandler+0x238>
  14743. {
  14744. if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != 0U)
  14745. 8006a00: 687b ldr r3, [r7, #4]
  14746. 8006a02: 681b ldr r3, [r3, #0]
  14747. 8006a04: 4a2e ldr r2, [pc, #184] @ (8006ac0 <HAL_DMA_IRQHandler+0x1b4>)
  14748. 8006a06: 4293 cmp r3, r2
  14749. 8006a08: d04a beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14750. 8006a0a: 687b ldr r3, [r7, #4]
  14751. 8006a0c: 681b ldr r3, [r3, #0]
  14752. 8006a0e: 4a2d ldr r2, [pc, #180] @ (8006ac4 <HAL_DMA_IRQHandler+0x1b8>)
  14753. 8006a10: 4293 cmp r3, r2
  14754. 8006a12: d045 beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14755. 8006a14: 687b ldr r3, [r7, #4]
  14756. 8006a16: 681b ldr r3, [r3, #0]
  14757. 8006a18: 4a2b ldr r2, [pc, #172] @ (8006ac8 <HAL_DMA_IRQHandler+0x1bc>)
  14758. 8006a1a: 4293 cmp r3, r2
  14759. 8006a1c: d040 beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14760. 8006a1e: 687b ldr r3, [r7, #4]
  14761. 8006a20: 681b ldr r3, [r3, #0]
  14762. 8006a22: 4a2a ldr r2, [pc, #168] @ (8006acc <HAL_DMA_IRQHandler+0x1c0>)
  14763. 8006a24: 4293 cmp r3, r2
  14764. 8006a26: d03b beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14765. 8006a28: 687b ldr r3, [r7, #4]
  14766. 8006a2a: 681b ldr r3, [r3, #0]
  14767. 8006a2c: 4a28 ldr r2, [pc, #160] @ (8006ad0 <HAL_DMA_IRQHandler+0x1c4>)
  14768. 8006a2e: 4293 cmp r3, r2
  14769. 8006a30: d036 beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14770. 8006a32: 687b ldr r3, [r7, #4]
  14771. 8006a34: 681b ldr r3, [r3, #0]
  14772. 8006a36: 4a27 ldr r2, [pc, #156] @ (8006ad4 <HAL_DMA_IRQHandler+0x1c8>)
  14773. 8006a38: 4293 cmp r3, r2
  14774. 8006a3a: d031 beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14775. 8006a3c: 687b ldr r3, [r7, #4]
  14776. 8006a3e: 681b ldr r3, [r3, #0]
  14777. 8006a40: 4a25 ldr r2, [pc, #148] @ (8006ad8 <HAL_DMA_IRQHandler+0x1cc>)
  14778. 8006a42: 4293 cmp r3, r2
  14779. 8006a44: d02c beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14780. 8006a46: 687b ldr r3, [r7, #4]
  14781. 8006a48: 681b ldr r3, [r3, #0]
  14782. 8006a4a: 4a24 ldr r2, [pc, #144] @ (8006adc <HAL_DMA_IRQHandler+0x1d0>)
  14783. 8006a4c: 4293 cmp r3, r2
  14784. 8006a4e: d027 beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14785. 8006a50: 687b ldr r3, [r7, #4]
  14786. 8006a52: 681b ldr r3, [r3, #0]
  14787. 8006a54: 4a22 ldr r2, [pc, #136] @ (8006ae0 <HAL_DMA_IRQHandler+0x1d4>)
  14788. 8006a56: 4293 cmp r3, r2
  14789. 8006a58: d022 beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14790. 8006a5a: 687b ldr r3, [r7, #4]
  14791. 8006a5c: 681b ldr r3, [r3, #0]
  14792. 8006a5e: 4a21 ldr r2, [pc, #132] @ (8006ae4 <HAL_DMA_IRQHandler+0x1d8>)
  14793. 8006a60: 4293 cmp r3, r2
  14794. 8006a62: d01d beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14795. 8006a64: 687b ldr r3, [r7, #4]
  14796. 8006a66: 681b ldr r3, [r3, #0]
  14797. 8006a68: 4a1f ldr r2, [pc, #124] @ (8006ae8 <HAL_DMA_IRQHandler+0x1dc>)
  14798. 8006a6a: 4293 cmp r3, r2
  14799. 8006a6c: d018 beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14800. 8006a6e: 687b ldr r3, [r7, #4]
  14801. 8006a70: 681b ldr r3, [r3, #0]
  14802. 8006a72: 4a1e ldr r2, [pc, #120] @ (8006aec <HAL_DMA_IRQHandler+0x1e0>)
  14803. 8006a74: 4293 cmp r3, r2
  14804. 8006a76: d013 beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14805. 8006a78: 687b ldr r3, [r7, #4]
  14806. 8006a7a: 681b ldr r3, [r3, #0]
  14807. 8006a7c: 4a1c ldr r2, [pc, #112] @ (8006af0 <HAL_DMA_IRQHandler+0x1e4>)
  14808. 8006a7e: 4293 cmp r3, r2
  14809. 8006a80: d00e beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14810. 8006a82: 687b ldr r3, [r7, #4]
  14811. 8006a84: 681b ldr r3, [r3, #0]
  14812. 8006a86: 4a1b ldr r2, [pc, #108] @ (8006af4 <HAL_DMA_IRQHandler+0x1e8>)
  14813. 8006a88: 4293 cmp r3, r2
  14814. 8006a8a: d009 beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14815. 8006a8c: 687b ldr r3, [r7, #4]
  14816. 8006a8e: 681b ldr r3, [r3, #0]
  14817. 8006a90: 4a19 ldr r2, [pc, #100] @ (8006af8 <HAL_DMA_IRQHandler+0x1ec>)
  14818. 8006a92: 4293 cmp r3, r2
  14819. 8006a94: d004 beq.n 8006aa0 <HAL_DMA_IRQHandler+0x194>
  14820. 8006a96: 687b ldr r3, [r7, #4]
  14821. 8006a98: 681b ldr r3, [r3, #0]
  14822. 8006a9a: 4a18 ldr r2, [pc, #96] @ (8006afc <HAL_DMA_IRQHandler+0x1f0>)
  14823. 8006a9c: 4293 cmp r3, r2
  14824. 8006a9e: d12f bne.n 8006b00 <HAL_DMA_IRQHandler+0x1f4>
  14825. 8006aa0: 687b ldr r3, [r7, #4]
  14826. 8006aa2: 681b ldr r3, [r3, #0]
  14827. 8006aa4: 681b ldr r3, [r3, #0]
  14828. 8006aa6: f003 0304 and.w r3, r3, #4
  14829. 8006aaa: 2b00 cmp r3, #0
  14830. 8006aac: bf14 ite ne
  14831. 8006aae: 2301 movne r3, #1
  14832. 8006ab0: 2300 moveq r3, #0
  14833. 8006ab2: b2db uxtb r3, r3
  14834. 8006ab4: e02e b.n 8006b14 <HAL_DMA_IRQHandler+0x208>
  14835. 8006ab6: bf00 nop
  14836. 8006ab8: 2400000c .word 0x2400000c
  14837. 8006abc: 1b4e81b5 .word 0x1b4e81b5
  14838. 8006ac0: 40020010 .word 0x40020010
  14839. 8006ac4: 40020028 .word 0x40020028
  14840. 8006ac8: 40020040 .word 0x40020040
  14841. 8006acc: 40020058 .word 0x40020058
  14842. 8006ad0: 40020070 .word 0x40020070
  14843. 8006ad4: 40020088 .word 0x40020088
  14844. 8006ad8: 400200a0 .word 0x400200a0
  14845. 8006adc: 400200b8 .word 0x400200b8
  14846. 8006ae0: 40020410 .word 0x40020410
  14847. 8006ae4: 40020428 .word 0x40020428
  14848. 8006ae8: 40020440 .word 0x40020440
  14849. 8006aec: 40020458 .word 0x40020458
  14850. 8006af0: 40020470 .word 0x40020470
  14851. 8006af4: 40020488 .word 0x40020488
  14852. 8006af8: 400204a0 .word 0x400204a0
  14853. 8006afc: 400204b8 .word 0x400204b8
  14854. 8006b00: 687b ldr r3, [r7, #4]
  14855. 8006b02: 681b ldr r3, [r3, #0]
  14856. 8006b04: 681b ldr r3, [r3, #0]
  14857. 8006b06: f003 0308 and.w r3, r3, #8
  14858. 8006b0a: 2b00 cmp r3, #0
  14859. 8006b0c: bf14 ite ne
  14860. 8006b0e: 2301 movne r3, #1
  14861. 8006b10: 2300 moveq r3, #0
  14862. 8006b12: b2db uxtb r3, r3
  14863. 8006b14: 2b00 cmp r3, #0
  14864. 8006b16: d015 beq.n 8006b44 <HAL_DMA_IRQHandler+0x238>
  14865. {
  14866. /* Disable the transfer error interrupt */
  14867. ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_TE);
  14868. 8006b18: 687b ldr r3, [r7, #4]
  14869. 8006b1a: 681b ldr r3, [r3, #0]
  14870. 8006b1c: 681a ldr r2, [r3, #0]
  14871. 8006b1e: 687b ldr r3, [r7, #4]
  14872. 8006b20: 681b ldr r3, [r3, #0]
  14873. 8006b22: f022 0204 bic.w r2, r2, #4
  14874. 8006b26: 601a str r2, [r3, #0]
  14875. /* Clear the transfer error flag */
  14876. regs_dma->IFCR = DMA_FLAG_TEIF0_4 << (hdma->StreamIndex & 0x1FU);
  14877. 8006b28: 687b ldr r3, [r7, #4]
  14878. 8006b2a: 6ddb ldr r3, [r3, #92] @ 0x5c
  14879. 8006b2c: f003 031f and.w r3, r3, #31
  14880. 8006b30: 2208 movs r2, #8
  14881. 8006b32: 409a lsls r2, r3
  14882. 8006b34: 6a3b ldr r3, [r7, #32]
  14883. 8006b36: 609a str r2, [r3, #8]
  14884. /* Update error code */
  14885. hdma->ErrorCode |= HAL_DMA_ERROR_TE;
  14886. 8006b38: 687b ldr r3, [r7, #4]
  14887. 8006b3a: 6d5b ldr r3, [r3, #84] @ 0x54
  14888. 8006b3c: f043 0201 orr.w r2, r3, #1
  14889. 8006b40: 687b ldr r3, [r7, #4]
  14890. 8006b42: 655a str r2, [r3, #84] @ 0x54
  14891. }
  14892. }
  14893. /* FIFO Error Interrupt management ******************************************/
  14894. if ((tmpisr_dma & (DMA_FLAG_FEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
  14895. 8006b44: 687b ldr r3, [r7, #4]
  14896. 8006b46: 6ddb ldr r3, [r3, #92] @ 0x5c
  14897. 8006b48: f003 031f and.w r3, r3, #31
  14898. 8006b4c: 69ba ldr r2, [r7, #24]
  14899. 8006b4e: fa22 f303 lsr.w r3, r2, r3
  14900. 8006b52: f003 0301 and.w r3, r3, #1
  14901. 8006b56: 2b00 cmp r3, #0
  14902. 8006b58: d06e beq.n 8006c38 <HAL_DMA_IRQHandler+0x32c>
  14903. {
  14904. if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != 0U)
  14905. 8006b5a: 687b ldr r3, [r7, #4]
  14906. 8006b5c: 681b ldr r3, [r3, #0]
  14907. 8006b5e: 4a69 ldr r2, [pc, #420] @ (8006d04 <HAL_DMA_IRQHandler+0x3f8>)
  14908. 8006b60: 4293 cmp r3, r2
  14909. 8006b62: d04a beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14910. 8006b64: 687b ldr r3, [r7, #4]
  14911. 8006b66: 681b ldr r3, [r3, #0]
  14912. 8006b68: 4a67 ldr r2, [pc, #412] @ (8006d08 <HAL_DMA_IRQHandler+0x3fc>)
  14913. 8006b6a: 4293 cmp r3, r2
  14914. 8006b6c: d045 beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14915. 8006b6e: 687b ldr r3, [r7, #4]
  14916. 8006b70: 681b ldr r3, [r3, #0]
  14917. 8006b72: 4a66 ldr r2, [pc, #408] @ (8006d0c <HAL_DMA_IRQHandler+0x400>)
  14918. 8006b74: 4293 cmp r3, r2
  14919. 8006b76: d040 beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14920. 8006b78: 687b ldr r3, [r7, #4]
  14921. 8006b7a: 681b ldr r3, [r3, #0]
  14922. 8006b7c: 4a64 ldr r2, [pc, #400] @ (8006d10 <HAL_DMA_IRQHandler+0x404>)
  14923. 8006b7e: 4293 cmp r3, r2
  14924. 8006b80: d03b beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14925. 8006b82: 687b ldr r3, [r7, #4]
  14926. 8006b84: 681b ldr r3, [r3, #0]
  14927. 8006b86: 4a63 ldr r2, [pc, #396] @ (8006d14 <HAL_DMA_IRQHandler+0x408>)
  14928. 8006b88: 4293 cmp r3, r2
  14929. 8006b8a: d036 beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14930. 8006b8c: 687b ldr r3, [r7, #4]
  14931. 8006b8e: 681b ldr r3, [r3, #0]
  14932. 8006b90: 4a61 ldr r2, [pc, #388] @ (8006d18 <HAL_DMA_IRQHandler+0x40c>)
  14933. 8006b92: 4293 cmp r3, r2
  14934. 8006b94: d031 beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14935. 8006b96: 687b ldr r3, [r7, #4]
  14936. 8006b98: 681b ldr r3, [r3, #0]
  14937. 8006b9a: 4a60 ldr r2, [pc, #384] @ (8006d1c <HAL_DMA_IRQHandler+0x410>)
  14938. 8006b9c: 4293 cmp r3, r2
  14939. 8006b9e: d02c beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14940. 8006ba0: 687b ldr r3, [r7, #4]
  14941. 8006ba2: 681b ldr r3, [r3, #0]
  14942. 8006ba4: 4a5e ldr r2, [pc, #376] @ (8006d20 <HAL_DMA_IRQHandler+0x414>)
  14943. 8006ba6: 4293 cmp r3, r2
  14944. 8006ba8: d027 beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14945. 8006baa: 687b ldr r3, [r7, #4]
  14946. 8006bac: 681b ldr r3, [r3, #0]
  14947. 8006bae: 4a5d ldr r2, [pc, #372] @ (8006d24 <HAL_DMA_IRQHandler+0x418>)
  14948. 8006bb0: 4293 cmp r3, r2
  14949. 8006bb2: d022 beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14950. 8006bb4: 687b ldr r3, [r7, #4]
  14951. 8006bb6: 681b ldr r3, [r3, #0]
  14952. 8006bb8: 4a5b ldr r2, [pc, #364] @ (8006d28 <HAL_DMA_IRQHandler+0x41c>)
  14953. 8006bba: 4293 cmp r3, r2
  14954. 8006bbc: d01d beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14955. 8006bbe: 687b ldr r3, [r7, #4]
  14956. 8006bc0: 681b ldr r3, [r3, #0]
  14957. 8006bc2: 4a5a ldr r2, [pc, #360] @ (8006d2c <HAL_DMA_IRQHandler+0x420>)
  14958. 8006bc4: 4293 cmp r3, r2
  14959. 8006bc6: d018 beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14960. 8006bc8: 687b ldr r3, [r7, #4]
  14961. 8006bca: 681b ldr r3, [r3, #0]
  14962. 8006bcc: 4a58 ldr r2, [pc, #352] @ (8006d30 <HAL_DMA_IRQHandler+0x424>)
  14963. 8006bce: 4293 cmp r3, r2
  14964. 8006bd0: d013 beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14965. 8006bd2: 687b ldr r3, [r7, #4]
  14966. 8006bd4: 681b ldr r3, [r3, #0]
  14967. 8006bd6: 4a57 ldr r2, [pc, #348] @ (8006d34 <HAL_DMA_IRQHandler+0x428>)
  14968. 8006bd8: 4293 cmp r3, r2
  14969. 8006bda: d00e beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14970. 8006bdc: 687b ldr r3, [r7, #4]
  14971. 8006bde: 681b ldr r3, [r3, #0]
  14972. 8006be0: 4a55 ldr r2, [pc, #340] @ (8006d38 <HAL_DMA_IRQHandler+0x42c>)
  14973. 8006be2: 4293 cmp r3, r2
  14974. 8006be4: d009 beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14975. 8006be6: 687b ldr r3, [r7, #4]
  14976. 8006be8: 681b ldr r3, [r3, #0]
  14977. 8006bea: 4a54 ldr r2, [pc, #336] @ (8006d3c <HAL_DMA_IRQHandler+0x430>)
  14978. 8006bec: 4293 cmp r3, r2
  14979. 8006bee: d004 beq.n 8006bfa <HAL_DMA_IRQHandler+0x2ee>
  14980. 8006bf0: 687b ldr r3, [r7, #4]
  14981. 8006bf2: 681b ldr r3, [r3, #0]
  14982. 8006bf4: 4a52 ldr r2, [pc, #328] @ (8006d40 <HAL_DMA_IRQHandler+0x434>)
  14983. 8006bf6: 4293 cmp r3, r2
  14984. 8006bf8: d10a bne.n 8006c10 <HAL_DMA_IRQHandler+0x304>
  14985. 8006bfa: 687b ldr r3, [r7, #4]
  14986. 8006bfc: 681b ldr r3, [r3, #0]
  14987. 8006bfe: 695b ldr r3, [r3, #20]
  14988. 8006c00: f003 0380 and.w r3, r3, #128 @ 0x80
  14989. 8006c04: 2b00 cmp r3, #0
  14990. 8006c06: bf14 ite ne
  14991. 8006c08: 2301 movne r3, #1
  14992. 8006c0a: 2300 moveq r3, #0
  14993. 8006c0c: b2db uxtb r3, r3
  14994. 8006c0e: e003 b.n 8006c18 <HAL_DMA_IRQHandler+0x30c>
  14995. 8006c10: 687b ldr r3, [r7, #4]
  14996. 8006c12: 681b ldr r3, [r3, #0]
  14997. 8006c14: 681b ldr r3, [r3, #0]
  14998. 8006c16: 2300 movs r3, #0
  14999. 8006c18: 2b00 cmp r3, #0
  15000. 8006c1a: d00d beq.n 8006c38 <HAL_DMA_IRQHandler+0x32c>
  15001. {
  15002. /* Clear the FIFO error flag */
  15003. regs_dma->IFCR = DMA_FLAG_FEIF0_4 << (hdma->StreamIndex & 0x1FU);
  15004. 8006c1c: 687b ldr r3, [r7, #4]
  15005. 8006c1e: 6ddb ldr r3, [r3, #92] @ 0x5c
  15006. 8006c20: f003 031f and.w r3, r3, #31
  15007. 8006c24: 2201 movs r2, #1
  15008. 8006c26: 409a lsls r2, r3
  15009. 8006c28: 6a3b ldr r3, [r7, #32]
  15010. 8006c2a: 609a str r2, [r3, #8]
  15011. /* Update error code */
  15012. hdma->ErrorCode |= HAL_DMA_ERROR_FE;
  15013. 8006c2c: 687b ldr r3, [r7, #4]
  15014. 8006c2e: 6d5b ldr r3, [r3, #84] @ 0x54
  15015. 8006c30: f043 0202 orr.w r2, r3, #2
  15016. 8006c34: 687b ldr r3, [r7, #4]
  15017. 8006c36: 655a str r2, [r3, #84] @ 0x54
  15018. }
  15019. }
  15020. /* Direct Mode Error Interrupt management ***********************************/
  15021. if ((tmpisr_dma & (DMA_FLAG_DMEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
  15022. 8006c38: 687b ldr r3, [r7, #4]
  15023. 8006c3a: 6ddb ldr r3, [r3, #92] @ 0x5c
  15024. 8006c3c: f003 031f and.w r3, r3, #31
  15025. 8006c40: 2204 movs r2, #4
  15026. 8006c42: 409a lsls r2, r3
  15027. 8006c44: 69bb ldr r3, [r7, #24]
  15028. 8006c46: 4013 ands r3, r2
  15029. 8006c48: 2b00 cmp r3, #0
  15030. 8006c4a: f000 808f beq.w 8006d6c <HAL_DMA_IRQHandler+0x460>
  15031. {
  15032. if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != 0U)
  15033. 8006c4e: 687b ldr r3, [r7, #4]
  15034. 8006c50: 681b ldr r3, [r3, #0]
  15035. 8006c52: 4a2c ldr r2, [pc, #176] @ (8006d04 <HAL_DMA_IRQHandler+0x3f8>)
  15036. 8006c54: 4293 cmp r3, r2
  15037. 8006c56: d04a beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15038. 8006c58: 687b ldr r3, [r7, #4]
  15039. 8006c5a: 681b ldr r3, [r3, #0]
  15040. 8006c5c: 4a2a ldr r2, [pc, #168] @ (8006d08 <HAL_DMA_IRQHandler+0x3fc>)
  15041. 8006c5e: 4293 cmp r3, r2
  15042. 8006c60: d045 beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15043. 8006c62: 687b ldr r3, [r7, #4]
  15044. 8006c64: 681b ldr r3, [r3, #0]
  15045. 8006c66: 4a29 ldr r2, [pc, #164] @ (8006d0c <HAL_DMA_IRQHandler+0x400>)
  15046. 8006c68: 4293 cmp r3, r2
  15047. 8006c6a: d040 beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15048. 8006c6c: 687b ldr r3, [r7, #4]
  15049. 8006c6e: 681b ldr r3, [r3, #0]
  15050. 8006c70: 4a27 ldr r2, [pc, #156] @ (8006d10 <HAL_DMA_IRQHandler+0x404>)
  15051. 8006c72: 4293 cmp r3, r2
  15052. 8006c74: d03b beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15053. 8006c76: 687b ldr r3, [r7, #4]
  15054. 8006c78: 681b ldr r3, [r3, #0]
  15055. 8006c7a: 4a26 ldr r2, [pc, #152] @ (8006d14 <HAL_DMA_IRQHandler+0x408>)
  15056. 8006c7c: 4293 cmp r3, r2
  15057. 8006c7e: d036 beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15058. 8006c80: 687b ldr r3, [r7, #4]
  15059. 8006c82: 681b ldr r3, [r3, #0]
  15060. 8006c84: 4a24 ldr r2, [pc, #144] @ (8006d18 <HAL_DMA_IRQHandler+0x40c>)
  15061. 8006c86: 4293 cmp r3, r2
  15062. 8006c88: d031 beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15063. 8006c8a: 687b ldr r3, [r7, #4]
  15064. 8006c8c: 681b ldr r3, [r3, #0]
  15065. 8006c8e: 4a23 ldr r2, [pc, #140] @ (8006d1c <HAL_DMA_IRQHandler+0x410>)
  15066. 8006c90: 4293 cmp r3, r2
  15067. 8006c92: d02c beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15068. 8006c94: 687b ldr r3, [r7, #4]
  15069. 8006c96: 681b ldr r3, [r3, #0]
  15070. 8006c98: 4a21 ldr r2, [pc, #132] @ (8006d20 <HAL_DMA_IRQHandler+0x414>)
  15071. 8006c9a: 4293 cmp r3, r2
  15072. 8006c9c: d027 beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15073. 8006c9e: 687b ldr r3, [r7, #4]
  15074. 8006ca0: 681b ldr r3, [r3, #0]
  15075. 8006ca2: 4a20 ldr r2, [pc, #128] @ (8006d24 <HAL_DMA_IRQHandler+0x418>)
  15076. 8006ca4: 4293 cmp r3, r2
  15077. 8006ca6: d022 beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15078. 8006ca8: 687b ldr r3, [r7, #4]
  15079. 8006caa: 681b ldr r3, [r3, #0]
  15080. 8006cac: 4a1e ldr r2, [pc, #120] @ (8006d28 <HAL_DMA_IRQHandler+0x41c>)
  15081. 8006cae: 4293 cmp r3, r2
  15082. 8006cb0: d01d beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15083. 8006cb2: 687b ldr r3, [r7, #4]
  15084. 8006cb4: 681b ldr r3, [r3, #0]
  15085. 8006cb6: 4a1d ldr r2, [pc, #116] @ (8006d2c <HAL_DMA_IRQHandler+0x420>)
  15086. 8006cb8: 4293 cmp r3, r2
  15087. 8006cba: d018 beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15088. 8006cbc: 687b ldr r3, [r7, #4]
  15089. 8006cbe: 681b ldr r3, [r3, #0]
  15090. 8006cc0: 4a1b ldr r2, [pc, #108] @ (8006d30 <HAL_DMA_IRQHandler+0x424>)
  15091. 8006cc2: 4293 cmp r3, r2
  15092. 8006cc4: d013 beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15093. 8006cc6: 687b ldr r3, [r7, #4]
  15094. 8006cc8: 681b ldr r3, [r3, #0]
  15095. 8006cca: 4a1a ldr r2, [pc, #104] @ (8006d34 <HAL_DMA_IRQHandler+0x428>)
  15096. 8006ccc: 4293 cmp r3, r2
  15097. 8006cce: d00e beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15098. 8006cd0: 687b ldr r3, [r7, #4]
  15099. 8006cd2: 681b ldr r3, [r3, #0]
  15100. 8006cd4: 4a18 ldr r2, [pc, #96] @ (8006d38 <HAL_DMA_IRQHandler+0x42c>)
  15101. 8006cd6: 4293 cmp r3, r2
  15102. 8006cd8: d009 beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15103. 8006cda: 687b ldr r3, [r7, #4]
  15104. 8006cdc: 681b ldr r3, [r3, #0]
  15105. 8006cde: 4a17 ldr r2, [pc, #92] @ (8006d3c <HAL_DMA_IRQHandler+0x430>)
  15106. 8006ce0: 4293 cmp r3, r2
  15107. 8006ce2: d004 beq.n 8006cee <HAL_DMA_IRQHandler+0x3e2>
  15108. 8006ce4: 687b ldr r3, [r7, #4]
  15109. 8006ce6: 681b ldr r3, [r3, #0]
  15110. 8006ce8: 4a15 ldr r2, [pc, #84] @ (8006d40 <HAL_DMA_IRQHandler+0x434>)
  15111. 8006cea: 4293 cmp r3, r2
  15112. 8006cec: d12a bne.n 8006d44 <HAL_DMA_IRQHandler+0x438>
  15113. 8006cee: 687b ldr r3, [r7, #4]
  15114. 8006cf0: 681b ldr r3, [r3, #0]
  15115. 8006cf2: 681b ldr r3, [r3, #0]
  15116. 8006cf4: f003 0302 and.w r3, r3, #2
  15117. 8006cf8: 2b00 cmp r3, #0
  15118. 8006cfa: bf14 ite ne
  15119. 8006cfc: 2301 movne r3, #1
  15120. 8006cfe: 2300 moveq r3, #0
  15121. 8006d00: b2db uxtb r3, r3
  15122. 8006d02: e023 b.n 8006d4c <HAL_DMA_IRQHandler+0x440>
  15123. 8006d04: 40020010 .word 0x40020010
  15124. 8006d08: 40020028 .word 0x40020028
  15125. 8006d0c: 40020040 .word 0x40020040
  15126. 8006d10: 40020058 .word 0x40020058
  15127. 8006d14: 40020070 .word 0x40020070
  15128. 8006d18: 40020088 .word 0x40020088
  15129. 8006d1c: 400200a0 .word 0x400200a0
  15130. 8006d20: 400200b8 .word 0x400200b8
  15131. 8006d24: 40020410 .word 0x40020410
  15132. 8006d28: 40020428 .word 0x40020428
  15133. 8006d2c: 40020440 .word 0x40020440
  15134. 8006d30: 40020458 .word 0x40020458
  15135. 8006d34: 40020470 .word 0x40020470
  15136. 8006d38: 40020488 .word 0x40020488
  15137. 8006d3c: 400204a0 .word 0x400204a0
  15138. 8006d40: 400204b8 .word 0x400204b8
  15139. 8006d44: 687b ldr r3, [r7, #4]
  15140. 8006d46: 681b ldr r3, [r3, #0]
  15141. 8006d48: 681b ldr r3, [r3, #0]
  15142. 8006d4a: 2300 movs r3, #0
  15143. 8006d4c: 2b00 cmp r3, #0
  15144. 8006d4e: d00d beq.n 8006d6c <HAL_DMA_IRQHandler+0x460>
  15145. {
  15146. /* Clear the direct mode error flag */
  15147. regs_dma->IFCR = DMA_FLAG_DMEIF0_4 << (hdma->StreamIndex & 0x1FU);
  15148. 8006d50: 687b ldr r3, [r7, #4]
  15149. 8006d52: 6ddb ldr r3, [r3, #92] @ 0x5c
  15150. 8006d54: f003 031f and.w r3, r3, #31
  15151. 8006d58: 2204 movs r2, #4
  15152. 8006d5a: 409a lsls r2, r3
  15153. 8006d5c: 6a3b ldr r3, [r7, #32]
  15154. 8006d5e: 609a str r2, [r3, #8]
  15155. /* Update error code */
  15156. hdma->ErrorCode |= HAL_DMA_ERROR_DME;
  15157. 8006d60: 687b ldr r3, [r7, #4]
  15158. 8006d62: 6d5b ldr r3, [r3, #84] @ 0x54
  15159. 8006d64: f043 0204 orr.w r2, r3, #4
  15160. 8006d68: 687b ldr r3, [r7, #4]
  15161. 8006d6a: 655a str r2, [r3, #84] @ 0x54
  15162. }
  15163. }
  15164. /* Half Transfer Complete Interrupt management ******************************/
  15165. if ((tmpisr_dma & (DMA_FLAG_HTIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
  15166. 8006d6c: 687b ldr r3, [r7, #4]
  15167. 8006d6e: 6ddb ldr r3, [r3, #92] @ 0x5c
  15168. 8006d70: f003 031f and.w r3, r3, #31
  15169. 8006d74: 2210 movs r2, #16
  15170. 8006d76: 409a lsls r2, r3
  15171. 8006d78: 69bb ldr r3, [r7, #24]
  15172. 8006d7a: 4013 ands r3, r2
  15173. 8006d7c: 2b00 cmp r3, #0
  15174. 8006d7e: f000 80a6 beq.w 8006ece <HAL_DMA_IRQHandler+0x5c2>
  15175. {
  15176. if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != 0U)
  15177. 8006d82: 687b ldr r3, [r7, #4]
  15178. 8006d84: 681b ldr r3, [r3, #0]
  15179. 8006d86: 4a85 ldr r2, [pc, #532] @ (8006f9c <HAL_DMA_IRQHandler+0x690>)
  15180. 8006d88: 4293 cmp r3, r2
  15181. 8006d8a: d04a beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15182. 8006d8c: 687b ldr r3, [r7, #4]
  15183. 8006d8e: 681b ldr r3, [r3, #0]
  15184. 8006d90: 4a83 ldr r2, [pc, #524] @ (8006fa0 <HAL_DMA_IRQHandler+0x694>)
  15185. 8006d92: 4293 cmp r3, r2
  15186. 8006d94: d045 beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15187. 8006d96: 687b ldr r3, [r7, #4]
  15188. 8006d98: 681b ldr r3, [r3, #0]
  15189. 8006d9a: 4a82 ldr r2, [pc, #520] @ (8006fa4 <HAL_DMA_IRQHandler+0x698>)
  15190. 8006d9c: 4293 cmp r3, r2
  15191. 8006d9e: d040 beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15192. 8006da0: 687b ldr r3, [r7, #4]
  15193. 8006da2: 681b ldr r3, [r3, #0]
  15194. 8006da4: 4a80 ldr r2, [pc, #512] @ (8006fa8 <HAL_DMA_IRQHandler+0x69c>)
  15195. 8006da6: 4293 cmp r3, r2
  15196. 8006da8: d03b beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15197. 8006daa: 687b ldr r3, [r7, #4]
  15198. 8006dac: 681b ldr r3, [r3, #0]
  15199. 8006dae: 4a7f ldr r2, [pc, #508] @ (8006fac <HAL_DMA_IRQHandler+0x6a0>)
  15200. 8006db0: 4293 cmp r3, r2
  15201. 8006db2: d036 beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15202. 8006db4: 687b ldr r3, [r7, #4]
  15203. 8006db6: 681b ldr r3, [r3, #0]
  15204. 8006db8: 4a7d ldr r2, [pc, #500] @ (8006fb0 <HAL_DMA_IRQHandler+0x6a4>)
  15205. 8006dba: 4293 cmp r3, r2
  15206. 8006dbc: d031 beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15207. 8006dbe: 687b ldr r3, [r7, #4]
  15208. 8006dc0: 681b ldr r3, [r3, #0]
  15209. 8006dc2: 4a7c ldr r2, [pc, #496] @ (8006fb4 <HAL_DMA_IRQHandler+0x6a8>)
  15210. 8006dc4: 4293 cmp r3, r2
  15211. 8006dc6: d02c beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15212. 8006dc8: 687b ldr r3, [r7, #4]
  15213. 8006dca: 681b ldr r3, [r3, #0]
  15214. 8006dcc: 4a7a ldr r2, [pc, #488] @ (8006fb8 <HAL_DMA_IRQHandler+0x6ac>)
  15215. 8006dce: 4293 cmp r3, r2
  15216. 8006dd0: d027 beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15217. 8006dd2: 687b ldr r3, [r7, #4]
  15218. 8006dd4: 681b ldr r3, [r3, #0]
  15219. 8006dd6: 4a79 ldr r2, [pc, #484] @ (8006fbc <HAL_DMA_IRQHandler+0x6b0>)
  15220. 8006dd8: 4293 cmp r3, r2
  15221. 8006dda: d022 beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15222. 8006ddc: 687b ldr r3, [r7, #4]
  15223. 8006dde: 681b ldr r3, [r3, #0]
  15224. 8006de0: 4a77 ldr r2, [pc, #476] @ (8006fc0 <HAL_DMA_IRQHandler+0x6b4>)
  15225. 8006de2: 4293 cmp r3, r2
  15226. 8006de4: d01d beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15227. 8006de6: 687b ldr r3, [r7, #4]
  15228. 8006de8: 681b ldr r3, [r3, #0]
  15229. 8006dea: 4a76 ldr r2, [pc, #472] @ (8006fc4 <HAL_DMA_IRQHandler+0x6b8>)
  15230. 8006dec: 4293 cmp r3, r2
  15231. 8006dee: d018 beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15232. 8006df0: 687b ldr r3, [r7, #4]
  15233. 8006df2: 681b ldr r3, [r3, #0]
  15234. 8006df4: 4a74 ldr r2, [pc, #464] @ (8006fc8 <HAL_DMA_IRQHandler+0x6bc>)
  15235. 8006df6: 4293 cmp r3, r2
  15236. 8006df8: d013 beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15237. 8006dfa: 687b ldr r3, [r7, #4]
  15238. 8006dfc: 681b ldr r3, [r3, #0]
  15239. 8006dfe: 4a73 ldr r2, [pc, #460] @ (8006fcc <HAL_DMA_IRQHandler+0x6c0>)
  15240. 8006e00: 4293 cmp r3, r2
  15241. 8006e02: d00e beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15242. 8006e04: 687b ldr r3, [r7, #4]
  15243. 8006e06: 681b ldr r3, [r3, #0]
  15244. 8006e08: 4a71 ldr r2, [pc, #452] @ (8006fd0 <HAL_DMA_IRQHandler+0x6c4>)
  15245. 8006e0a: 4293 cmp r3, r2
  15246. 8006e0c: d009 beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15247. 8006e0e: 687b ldr r3, [r7, #4]
  15248. 8006e10: 681b ldr r3, [r3, #0]
  15249. 8006e12: 4a70 ldr r2, [pc, #448] @ (8006fd4 <HAL_DMA_IRQHandler+0x6c8>)
  15250. 8006e14: 4293 cmp r3, r2
  15251. 8006e16: d004 beq.n 8006e22 <HAL_DMA_IRQHandler+0x516>
  15252. 8006e18: 687b ldr r3, [r7, #4]
  15253. 8006e1a: 681b ldr r3, [r3, #0]
  15254. 8006e1c: 4a6e ldr r2, [pc, #440] @ (8006fd8 <HAL_DMA_IRQHandler+0x6cc>)
  15255. 8006e1e: 4293 cmp r3, r2
  15256. 8006e20: d10a bne.n 8006e38 <HAL_DMA_IRQHandler+0x52c>
  15257. 8006e22: 687b ldr r3, [r7, #4]
  15258. 8006e24: 681b ldr r3, [r3, #0]
  15259. 8006e26: 681b ldr r3, [r3, #0]
  15260. 8006e28: f003 0308 and.w r3, r3, #8
  15261. 8006e2c: 2b00 cmp r3, #0
  15262. 8006e2e: bf14 ite ne
  15263. 8006e30: 2301 movne r3, #1
  15264. 8006e32: 2300 moveq r3, #0
  15265. 8006e34: b2db uxtb r3, r3
  15266. 8006e36: e009 b.n 8006e4c <HAL_DMA_IRQHandler+0x540>
  15267. 8006e38: 687b ldr r3, [r7, #4]
  15268. 8006e3a: 681b ldr r3, [r3, #0]
  15269. 8006e3c: 681b ldr r3, [r3, #0]
  15270. 8006e3e: f003 0304 and.w r3, r3, #4
  15271. 8006e42: 2b00 cmp r3, #0
  15272. 8006e44: bf14 ite ne
  15273. 8006e46: 2301 movne r3, #1
  15274. 8006e48: 2300 moveq r3, #0
  15275. 8006e4a: b2db uxtb r3, r3
  15276. 8006e4c: 2b00 cmp r3, #0
  15277. 8006e4e: d03e beq.n 8006ece <HAL_DMA_IRQHandler+0x5c2>
  15278. {
  15279. /* Clear the half transfer complete flag */
  15280. regs_dma->IFCR = DMA_FLAG_HTIF0_4 << (hdma->StreamIndex & 0x1FU);
  15281. 8006e50: 687b ldr r3, [r7, #4]
  15282. 8006e52: 6ddb ldr r3, [r3, #92] @ 0x5c
  15283. 8006e54: f003 031f and.w r3, r3, #31
  15284. 8006e58: 2210 movs r2, #16
  15285. 8006e5a: 409a lsls r2, r3
  15286. 8006e5c: 6a3b ldr r3, [r7, #32]
  15287. 8006e5e: 609a str r2, [r3, #8]
  15288. /* Multi_Buffering mode enabled */
  15289. if(((((DMA_Stream_TypeDef *)hdma->Instance)->CR) & (uint32_t)(DMA_SxCR_DBM)) != 0U)
  15290. 8006e60: 687b ldr r3, [r7, #4]
  15291. 8006e62: 681b ldr r3, [r3, #0]
  15292. 8006e64: 681b ldr r3, [r3, #0]
  15293. 8006e66: f403 2380 and.w r3, r3, #262144 @ 0x40000
  15294. 8006e6a: 2b00 cmp r3, #0
  15295. 8006e6c: d018 beq.n 8006ea0 <HAL_DMA_IRQHandler+0x594>
  15296. {
  15297. /* Current memory buffer used is Memory 0 */
  15298. if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CT) == 0U)
  15299. 8006e6e: 687b ldr r3, [r7, #4]
  15300. 8006e70: 681b ldr r3, [r3, #0]
  15301. 8006e72: 681b ldr r3, [r3, #0]
  15302. 8006e74: f403 2300 and.w r3, r3, #524288 @ 0x80000
  15303. 8006e78: 2b00 cmp r3, #0
  15304. 8006e7a: d108 bne.n 8006e8e <HAL_DMA_IRQHandler+0x582>
  15305. {
  15306. if(hdma->XferHalfCpltCallback != NULL)
  15307. 8006e7c: 687b ldr r3, [r7, #4]
  15308. 8006e7e: 6c1b ldr r3, [r3, #64] @ 0x40
  15309. 8006e80: 2b00 cmp r3, #0
  15310. 8006e82: d024 beq.n 8006ece <HAL_DMA_IRQHandler+0x5c2>
  15311. {
  15312. /* Half transfer callback */
  15313. hdma->XferHalfCpltCallback(hdma);
  15314. 8006e84: 687b ldr r3, [r7, #4]
  15315. 8006e86: 6c1b ldr r3, [r3, #64] @ 0x40
  15316. 8006e88: 6878 ldr r0, [r7, #4]
  15317. 8006e8a: 4798 blx r3
  15318. 8006e8c: e01f b.n 8006ece <HAL_DMA_IRQHandler+0x5c2>
  15319. }
  15320. }
  15321. /* Current memory buffer used is Memory 1 */
  15322. else
  15323. {
  15324. if(hdma->XferM1HalfCpltCallback != NULL)
  15325. 8006e8e: 687b ldr r3, [r7, #4]
  15326. 8006e90: 6c9b ldr r3, [r3, #72] @ 0x48
  15327. 8006e92: 2b00 cmp r3, #0
  15328. 8006e94: d01b beq.n 8006ece <HAL_DMA_IRQHandler+0x5c2>
  15329. {
  15330. /* Half transfer callback */
  15331. hdma->XferM1HalfCpltCallback(hdma);
  15332. 8006e96: 687b ldr r3, [r7, #4]
  15333. 8006e98: 6c9b ldr r3, [r3, #72] @ 0x48
  15334. 8006e9a: 6878 ldr r0, [r7, #4]
  15335. 8006e9c: 4798 blx r3
  15336. 8006e9e: e016 b.n 8006ece <HAL_DMA_IRQHandler+0x5c2>
  15337. }
  15338. }
  15339. else
  15340. {
  15341. /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */
  15342. if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CIRC) == 0U)
  15343. 8006ea0: 687b ldr r3, [r7, #4]
  15344. 8006ea2: 681b ldr r3, [r3, #0]
  15345. 8006ea4: 681b ldr r3, [r3, #0]
  15346. 8006ea6: f403 7380 and.w r3, r3, #256 @ 0x100
  15347. 8006eaa: 2b00 cmp r3, #0
  15348. 8006eac: d107 bne.n 8006ebe <HAL_DMA_IRQHandler+0x5b2>
  15349. {
  15350. /* Disable the half transfer interrupt */
  15351. ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_HT);
  15352. 8006eae: 687b ldr r3, [r7, #4]
  15353. 8006eb0: 681b ldr r3, [r3, #0]
  15354. 8006eb2: 681a ldr r2, [r3, #0]
  15355. 8006eb4: 687b ldr r3, [r7, #4]
  15356. 8006eb6: 681b ldr r3, [r3, #0]
  15357. 8006eb8: f022 0208 bic.w r2, r2, #8
  15358. 8006ebc: 601a str r2, [r3, #0]
  15359. }
  15360. if(hdma->XferHalfCpltCallback != NULL)
  15361. 8006ebe: 687b ldr r3, [r7, #4]
  15362. 8006ec0: 6c1b ldr r3, [r3, #64] @ 0x40
  15363. 8006ec2: 2b00 cmp r3, #0
  15364. 8006ec4: d003 beq.n 8006ece <HAL_DMA_IRQHandler+0x5c2>
  15365. {
  15366. /* Half transfer callback */
  15367. hdma->XferHalfCpltCallback(hdma);
  15368. 8006ec6: 687b ldr r3, [r7, #4]
  15369. 8006ec8: 6c1b ldr r3, [r3, #64] @ 0x40
  15370. 8006eca: 6878 ldr r0, [r7, #4]
  15371. 8006ecc: 4798 blx r3
  15372. }
  15373. }
  15374. }
  15375. }
  15376. /* Transfer Complete Interrupt management ***********************************/
  15377. if ((tmpisr_dma & (DMA_FLAG_TCIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
  15378. 8006ece: 687b ldr r3, [r7, #4]
  15379. 8006ed0: 6ddb ldr r3, [r3, #92] @ 0x5c
  15380. 8006ed2: f003 031f and.w r3, r3, #31
  15381. 8006ed6: 2220 movs r2, #32
  15382. 8006ed8: 409a lsls r2, r3
  15383. 8006eda: 69bb ldr r3, [r7, #24]
  15384. 8006edc: 4013 ands r3, r2
  15385. 8006ede: 2b00 cmp r3, #0
  15386. 8006ee0: f000 8110 beq.w 8007104 <HAL_DMA_IRQHandler+0x7f8>
  15387. {
  15388. if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != 0U)
  15389. 8006ee4: 687b ldr r3, [r7, #4]
  15390. 8006ee6: 681b ldr r3, [r3, #0]
  15391. 8006ee8: 4a2c ldr r2, [pc, #176] @ (8006f9c <HAL_DMA_IRQHandler+0x690>)
  15392. 8006eea: 4293 cmp r3, r2
  15393. 8006eec: d04a beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15394. 8006eee: 687b ldr r3, [r7, #4]
  15395. 8006ef0: 681b ldr r3, [r3, #0]
  15396. 8006ef2: 4a2b ldr r2, [pc, #172] @ (8006fa0 <HAL_DMA_IRQHandler+0x694>)
  15397. 8006ef4: 4293 cmp r3, r2
  15398. 8006ef6: d045 beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15399. 8006ef8: 687b ldr r3, [r7, #4]
  15400. 8006efa: 681b ldr r3, [r3, #0]
  15401. 8006efc: 4a29 ldr r2, [pc, #164] @ (8006fa4 <HAL_DMA_IRQHandler+0x698>)
  15402. 8006efe: 4293 cmp r3, r2
  15403. 8006f00: d040 beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15404. 8006f02: 687b ldr r3, [r7, #4]
  15405. 8006f04: 681b ldr r3, [r3, #0]
  15406. 8006f06: 4a28 ldr r2, [pc, #160] @ (8006fa8 <HAL_DMA_IRQHandler+0x69c>)
  15407. 8006f08: 4293 cmp r3, r2
  15408. 8006f0a: d03b beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15409. 8006f0c: 687b ldr r3, [r7, #4]
  15410. 8006f0e: 681b ldr r3, [r3, #0]
  15411. 8006f10: 4a26 ldr r2, [pc, #152] @ (8006fac <HAL_DMA_IRQHandler+0x6a0>)
  15412. 8006f12: 4293 cmp r3, r2
  15413. 8006f14: d036 beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15414. 8006f16: 687b ldr r3, [r7, #4]
  15415. 8006f18: 681b ldr r3, [r3, #0]
  15416. 8006f1a: 4a25 ldr r2, [pc, #148] @ (8006fb0 <HAL_DMA_IRQHandler+0x6a4>)
  15417. 8006f1c: 4293 cmp r3, r2
  15418. 8006f1e: d031 beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15419. 8006f20: 687b ldr r3, [r7, #4]
  15420. 8006f22: 681b ldr r3, [r3, #0]
  15421. 8006f24: 4a23 ldr r2, [pc, #140] @ (8006fb4 <HAL_DMA_IRQHandler+0x6a8>)
  15422. 8006f26: 4293 cmp r3, r2
  15423. 8006f28: d02c beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15424. 8006f2a: 687b ldr r3, [r7, #4]
  15425. 8006f2c: 681b ldr r3, [r3, #0]
  15426. 8006f2e: 4a22 ldr r2, [pc, #136] @ (8006fb8 <HAL_DMA_IRQHandler+0x6ac>)
  15427. 8006f30: 4293 cmp r3, r2
  15428. 8006f32: d027 beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15429. 8006f34: 687b ldr r3, [r7, #4]
  15430. 8006f36: 681b ldr r3, [r3, #0]
  15431. 8006f38: 4a20 ldr r2, [pc, #128] @ (8006fbc <HAL_DMA_IRQHandler+0x6b0>)
  15432. 8006f3a: 4293 cmp r3, r2
  15433. 8006f3c: d022 beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15434. 8006f3e: 687b ldr r3, [r7, #4]
  15435. 8006f40: 681b ldr r3, [r3, #0]
  15436. 8006f42: 4a1f ldr r2, [pc, #124] @ (8006fc0 <HAL_DMA_IRQHandler+0x6b4>)
  15437. 8006f44: 4293 cmp r3, r2
  15438. 8006f46: d01d beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15439. 8006f48: 687b ldr r3, [r7, #4]
  15440. 8006f4a: 681b ldr r3, [r3, #0]
  15441. 8006f4c: 4a1d ldr r2, [pc, #116] @ (8006fc4 <HAL_DMA_IRQHandler+0x6b8>)
  15442. 8006f4e: 4293 cmp r3, r2
  15443. 8006f50: d018 beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15444. 8006f52: 687b ldr r3, [r7, #4]
  15445. 8006f54: 681b ldr r3, [r3, #0]
  15446. 8006f56: 4a1c ldr r2, [pc, #112] @ (8006fc8 <HAL_DMA_IRQHandler+0x6bc>)
  15447. 8006f58: 4293 cmp r3, r2
  15448. 8006f5a: d013 beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15449. 8006f5c: 687b ldr r3, [r7, #4]
  15450. 8006f5e: 681b ldr r3, [r3, #0]
  15451. 8006f60: 4a1a ldr r2, [pc, #104] @ (8006fcc <HAL_DMA_IRQHandler+0x6c0>)
  15452. 8006f62: 4293 cmp r3, r2
  15453. 8006f64: d00e beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15454. 8006f66: 687b ldr r3, [r7, #4]
  15455. 8006f68: 681b ldr r3, [r3, #0]
  15456. 8006f6a: 4a19 ldr r2, [pc, #100] @ (8006fd0 <HAL_DMA_IRQHandler+0x6c4>)
  15457. 8006f6c: 4293 cmp r3, r2
  15458. 8006f6e: d009 beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15459. 8006f70: 687b ldr r3, [r7, #4]
  15460. 8006f72: 681b ldr r3, [r3, #0]
  15461. 8006f74: 4a17 ldr r2, [pc, #92] @ (8006fd4 <HAL_DMA_IRQHandler+0x6c8>)
  15462. 8006f76: 4293 cmp r3, r2
  15463. 8006f78: d004 beq.n 8006f84 <HAL_DMA_IRQHandler+0x678>
  15464. 8006f7a: 687b ldr r3, [r7, #4]
  15465. 8006f7c: 681b ldr r3, [r3, #0]
  15466. 8006f7e: 4a16 ldr r2, [pc, #88] @ (8006fd8 <HAL_DMA_IRQHandler+0x6cc>)
  15467. 8006f80: 4293 cmp r3, r2
  15468. 8006f82: d12b bne.n 8006fdc <HAL_DMA_IRQHandler+0x6d0>
  15469. 8006f84: 687b ldr r3, [r7, #4]
  15470. 8006f86: 681b ldr r3, [r3, #0]
  15471. 8006f88: 681b ldr r3, [r3, #0]
  15472. 8006f8a: f003 0310 and.w r3, r3, #16
  15473. 8006f8e: 2b00 cmp r3, #0
  15474. 8006f90: bf14 ite ne
  15475. 8006f92: 2301 movne r3, #1
  15476. 8006f94: 2300 moveq r3, #0
  15477. 8006f96: b2db uxtb r3, r3
  15478. 8006f98: e02a b.n 8006ff0 <HAL_DMA_IRQHandler+0x6e4>
  15479. 8006f9a: bf00 nop
  15480. 8006f9c: 40020010 .word 0x40020010
  15481. 8006fa0: 40020028 .word 0x40020028
  15482. 8006fa4: 40020040 .word 0x40020040
  15483. 8006fa8: 40020058 .word 0x40020058
  15484. 8006fac: 40020070 .word 0x40020070
  15485. 8006fb0: 40020088 .word 0x40020088
  15486. 8006fb4: 400200a0 .word 0x400200a0
  15487. 8006fb8: 400200b8 .word 0x400200b8
  15488. 8006fbc: 40020410 .word 0x40020410
  15489. 8006fc0: 40020428 .word 0x40020428
  15490. 8006fc4: 40020440 .word 0x40020440
  15491. 8006fc8: 40020458 .word 0x40020458
  15492. 8006fcc: 40020470 .word 0x40020470
  15493. 8006fd0: 40020488 .word 0x40020488
  15494. 8006fd4: 400204a0 .word 0x400204a0
  15495. 8006fd8: 400204b8 .word 0x400204b8
  15496. 8006fdc: 687b ldr r3, [r7, #4]
  15497. 8006fde: 681b ldr r3, [r3, #0]
  15498. 8006fe0: 681b ldr r3, [r3, #0]
  15499. 8006fe2: f003 0302 and.w r3, r3, #2
  15500. 8006fe6: 2b00 cmp r3, #0
  15501. 8006fe8: bf14 ite ne
  15502. 8006fea: 2301 movne r3, #1
  15503. 8006fec: 2300 moveq r3, #0
  15504. 8006fee: b2db uxtb r3, r3
  15505. 8006ff0: 2b00 cmp r3, #0
  15506. 8006ff2: f000 8087 beq.w 8007104 <HAL_DMA_IRQHandler+0x7f8>
  15507. {
  15508. /* Clear the transfer complete flag */
  15509. regs_dma->IFCR = DMA_FLAG_TCIF0_4 << (hdma->StreamIndex & 0x1FU);
  15510. 8006ff6: 687b ldr r3, [r7, #4]
  15511. 8006ff8: 6ddb ldr r3, [r3, #92] @ 0x5c
  15512. 8006ffa: f003 031f and.w r3, r3, #31
  15513. 8006ffe: 2220 movs r2, #32
  15514. 8007000: 409a lsls r2, r3
  15515. 8007002: 6a3b ldr r3, [r7, #32]
  15516. 8007004: 609a str r2, [r3, #8]
  15517. if(HAL_DMA_STATE_ABORT == hdma->State)
  15518. 8007006: 687b ldr r3, [r7, #4]
  15519. 8007008: f893 3035 ldrb.w r3, [r3, #53] @ 0x35
  15520. 800700c: b2db uxtb r3, r3
  15521. 800700e: 2b04 cmp r3, #4
  15522. 8007010: d139 bne.n 8007086 <HAL_DMA_IRQHandler+0x77a>
  15523. {
  15524. /* Disable all the transfer interrupts */
  15525. ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME);
  15526. 8007012: 687b ldr r3, [r7, #4]
  15527. 8007014: 681b ldr r3, [r3, #0]
  15528. 8007016: 681a ldr r2, [r3, #0]
  15529. 8007018: 687b ldr r3, [r7, #4]
  15530. 800701a: 681b ldr r3, [r3, #0]
  15531. 800701c: f022 0216 bic.w r2, r2, #22
  15532. 8007020: 601a str r2, [r3, #0]
  15533. ((DMA_Stream_TypeDef *)hdma->Instance)->FCR &= ~(DMA_IT_FE);
  15534. 8007022: 687b ldr r3, [r7, #4]
  15535. 8007024: 681b ldr r3, [r3, #0]
  15536. 8007026: 695a ldr r2, [r3, #20]
  15537. 8007028: 687b ldr r3, [r7, #4]
  15538. 800702a: 681b ldr r3, [r3, #0]
  15539. 800702c: f022 0280 bic.w r2, r2, #128 @ 0x80
  15540. 8007030: 615a str r2, [r3, #20]
  15541. if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL))
  15542. 8007032: 687b ldr r3, [r7, #4]
  15543. 8007034: 6c1b ldr r3, [r3, #64] @ 0x40
  15544. 8007036: 2b00 cmp r3, #0
  15545. 8007038: d103 bne.n 8007042 <HAL_DMA_IRQHandler+0x736>
  15546. 800703a: 687b ldr r3, [r7, #4]
  15547. 800703c: 6c9b ldr r3, [r3, #72] @ 0x48
  15548. 800703e: 2b00 cmp r3, #0
  15549. 8007040: d007 beq.n 8007052 <HAL_DMA_IRQHandler+0x746>
  15550. {
  15551. ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_HT);
  15552. 8007042: 687b ldr r3, [r7, #4]
  15553. 8007044: 681b ldr r3, [r3, #0]
  15554. 8007046: 681a ldr r2, [r3, #0]
  15555. 8007048: 687b ldr r3, [r7, #4]
  15556. 800704a: 681b ldr r3, [r3, #0]
  15557. 800704c: f022 0208 bic.w r2, r2, #8
  15558. 8007050: 601a str r2, [r3, #0]
  15559. }
  15560. /* Clear all interrupt flags at correct offset within the register */
  15561. regs_dma->IFCR = 0x3FUL << (hdma->StreamIndex & 0x1FU);
  15562. 8007052: 687b ldr r3, [r7, #4]
  15563. 8007054: 6ddb ldr r3, [r3, #92] @ 0x5c
  15564. 8007056: f003 031f and.w r3, r3, #31
  15565. 800705a: 223f movs r2, #63 @ 0x3f
  15566. 800705c: 409a lsls r2, r3
  15567. 800705e: 6a3b ldr r3, [r7, #32]
  15568. 8007060: 609a str r2, [r3, #8]
  15569. /* Change the DMA state */
  15570. hdma->State = HAL_DMA_STATE_READY;
  15571. 8007062: 687b ldr r3, [r7, #4]
  15572. 8007064: 2201 movs r2, #1
  15573. 8007066: f883 2035 strb.w r2, [r3, #53] @ 0x35
  15574. /* Process Unlocked */
  15575. __HAL_UNLOCK(hdma);
  15576. 800706a: 687b ldr r3, [r7, #4]
  15577. 800706c: 2200 movs r2, #0
  15578. 800706e: f883 2034 strb.w r2, [r3, #52] @ 0x34
  15579. if(hdma->XferAbortCallback != NULL)
  15580. 8007072: 687b ldr r3, [r7, #4]
  15581. 8007074: 6d1b ldr r3, [r3, #80] @ 0x50
  15582. 8007076: 2b00 cmp r3, #0
  15583. 8007078: f000 834a beq.w 8007710 <HAL_DMA_IRQHandler+0xe04>
  15584. {
  15585. hdma->XferAbortCallback(hdma);
  15586. 800707c: 687b ldr r3, [r7, #4]
  15587. 800707e: 6d1b ldr r3, [r3, #80] @ 0x50
  15588. 8007080: 6878 ldr r0, [r7, #4]
  15589. 8007082: 4798 blx r3
  15590. }
  15591. return;
  15592. 8007084: e344 b.n 8007710 <HAL_DMA_IRQHandler+0xe04>
  15593. }
  15594. if(((((DMA_Stream_TypeDef *)hdma->Instance)->CR) & (uint32_t)(DMA_SxCR_DBM)) != 0U)
  15595. 8007086: 687b ldr r3, [r7, #4]
  15596. 8007088: 681b ldr r3, [r3, #0]
  15597. 800708a: 681b ldr r3, [r3, #0]
  15598. 800708c: f403 2380 and.w r3, r3, #262144 @ 0x40000
  15599. 8007090: 2b00 cmp r3, #0
  15600. 8007092: d018 beq.n 80070c6 <HAL_DMA_IRQHandler+0x7ba>
  15601. {
  15602. /* Current memory buffer used is Memory 0 */
  15603. if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CT) == 0U)
  15604. 8007094: 687b ldr r3, [r7, #4]
  15605. 8007096: 681b ldr r3, [r3, #0]
  15606. 8007098: 681b ldr r3, [r3, #0]
  15607. 800709a: f403 2300 and.w r3, r3, #524288 @ 0x80000
  15608. 800709e: 2b00 cmp r3, #0
  15609. 80070a0: d108 bne.n 80070b4 <HAL_DMA_IRQHandler+0x7a8>
  15610. {
  15611. if(hdma->XferM1CpltCallback != NULL)
  15612. 80070a2: 687b ldr r3, [r7, #4]
  15613. 80070a4: 6c5b ldr r3, [r3, #68] @ 0x44
  15614. 80070a6: 2b00 cmp r3, #0
  15615. 80070a8: d02c beq.n 8007104 <HAL_DMA_IRQHandler+0x7f8>
  15616. {
  15617. /* Transfer complete Callback for memory1 */
  15618. hdma->XferM1CpltCallback(hdma);
  15619. 80070aa: 687b ldr r3, [r7, #4]
  15620. 80070ac: 6c5b ldr r3, [r3, #68] @ 0x44
  15621. 80070ae: 6878 ldr r0, [r7, #4]
  15622. 80070b0: 4798 blx r3
  15623. 80070b2: e027 b.n 8007104 <HAL_DMA_IRQHandler+0x7f8>
  15624. }
  15625. }
  15626. /* Current memory buffer used is Memory 1 */
  15627. else
  15628. {
  15629. if(hdma->XferCpltCallback != NULL)
  15630. 80070b4: 687b ldr r3, [r7, #4]
  15631. 80070b6: 6bdb ldr r3, [r3, #60] @ 0x3c
  15632. 80070b8: 2b00 cmp r3, #0
  15633. 80070ba: d023 beq.n 8007104 <HAL_DMA_IRQHandler+0x7f8>
  15634. {
  15635. /* Transfer complete Callback for memory0 */
  15636. hdma->XferCpltCallback(hdma);
  15637. 80070bc: 687b ldr r3, [r7, #4]
  15638. 80070be: 6bdb ldr r3, [r3, #60] @ 0x3c
  15639. 80070c0: 6878 ldr r0, [r7, #4]
  15640. 80070c2: 4798 blx r3
  15641. 80070c4: e01e b.n 8007104 <HAL_DMA_IRQHandler+0x7f8>
  15642. }
  15643. }
  15644. /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */
  15645. else
  15646. {
  15647. if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CIRC) == 0U)
  15648. 80070c6: 687b ldr r3, [r7, #4]
  15649. 80070c8: 681b ldr r3, [r3, #0]
  15650. 80070ca: 681b ldr r3, [r3, #0]
  15651. 80070cc: f403 7380 and.w r3, r3, #256 @ 0x100
  15652. 80070d0: 2b00 cmp r3, #0
  15653. 80070d2: d10f bne.n 80070f4 <HAL_DMA_IRQHandler+0x7e8>
  15654. {
  15655. /* Disable the transfer complete interrupt */
  15656. ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_TC);
  15657. 80070d4: 687b ldr r3, [r7, #4]
  15658. 80070d6: 681b ldr r3, [r3, #0]
  15659. 80070d8: 681a ldr r2, [r3, #0]
  15660. 80070da: 687b ldr r3, [r7, #4]
  15661. 80070dc: 681b ldr r3, [r3, #0]
  15662. 80070de: f022 0210 bic.w r2, r2, #16
  15663. 80070e2: 601a str r2, [r3, #0]
  15664. /* Change the DMA state */
  15665. hdma->State = HAL_DMA_STATE_READY;
  15666. 80070e4: 687b ldr r3, [r7, #4]
  15667. 80070e6: 2201 movs r2, #1
  15668. 80070e8: f883 2035 strb.w r2, [r3, #53] @ 0x35
  15669. /* Process Unlocked */
  15670. __HAL_UNLOCK(hdma);
  15671. 80070ec: 687b ldr r3, [r7, #4]
  15672. 80070ee: 2200 movs r2, #0
  15673. 80070f0: f883 2034 strb.w r2, [r3, #52] @ 0x34
  15674. }
  15675. if(hdma->XferCpltCallback != NULL)
  15676. 80070f4: 687b ldr r3, [r7, #4]
  15677. 80070f6: 6bdb ldr r3, [r3, #60] @ 0x3c
  15678. 80070f8: 2b00 cmp r3, #0
  15679. 80070fa: d003 beq.n 8007104 <HAL_DMA_IRQHandler+0x7f8>
  15680. {
  15681. /* Transfer complete callback */
  15682. hdma->XferCpltCallback(hdma);
  15683. 80070fc: 687b ldr r3, [r7, #4]
  15684. 80070fe: 6bdb ldr r3, [r3, #60] @ 0x3c
  15685. 8007100: 6878 ldr r0, [r7, #4]
  15686. 8007102: 4798 blx r3
  15687. }
  15688. }
  15689. }
  15690. /* manage error case */
  15691. if(hdma->ErrorCode != HAL_DMA_ERROR_NONE)
  15692. 8007104: 687b ldr r3, [r7, #4]
  15693. 8007106: 6d5b ldr r3, [r3, #84] @ 0x54
  15694. 8007108: 2b00 cmp r3, #0
  15695. 800710a: f000 8306 beq.w 800771a <HAL_DMA_IRQHandler+0xe0e>
  15696. {
  15697. if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != 0U)
  15698. 800710e: 687b ldr r3, [r7, #4]
  15699. 8007110: 6d5b ldr r3, [r3, #84] @ 0x54
  15700. 8007112: f003 0301 and.w r3, r3, #1
  15701. 8007116: 2b00 cmp r3, #0
  15702. 8007118: f000 8088 beq.w 800722c <HAL_DMA_IRQHandler+0x920>
  15703. {
  15704. hdma->State = HAL_DMA_STATE_ABORT;
  15705. 800711c: 687b ldr r3, [r7, #4]
  15706. 800711e: 2204 movs r2, #4
  15707. 8007120: f883 2035 strb.w r2, [r3, #53] @ 0x35
  15708. /* Disable the stream */
  15709. __HAL_DMA_DISABLE(hdma);
  15710. 8007124: 687b ldr r3, [r7, #4]
  15711. 8007126: 681b ldr r3, [r3, #0]
  15712. 8007128: 4a7a ldr r2, [pc, #488] @ (8007314 <HAL_DMA_IRQHandler+0xa08>)
  15713. 800712a: 4293 cmp r3, r2
  15714. 800712c: d04a beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15715. 800712e: 687b ldr r3, [r7, #4]
  15716. 8007130: 681b ldr r3, [r3, #0]
  15717. 8007132: 4a79 ldr r2, [pc, #484] @ (8007318 <HAL_DMA_IRQHandler+0xa0c>)
  15718. 8007134: 4293 cmp r3, r2
  15719. 8007136: d045 beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15720. 8007138: 687b ldr r3, [r7, #4]
  15721. 800713a: 681b ldr r3, [r3, #0]
  15722. 800713c: 4a77 ldr r2, [pc, #476] @ (800731c <HAL_DMA_IRQHandler+0xa10>)
  15723. 800713e: 4293 cmp r3, r2
  15724. 8007140: d040 beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15725. 8007142: 687b ldr r3, [r7, #4]
  15726. 8007144: 681b ldr r3, [r3, #0]
  15727. 8007146: 4a76 ldr r2, [pc, #472] @ (8007320 <HAL_DMA_IRQHandler+0xa14>)
  15728. 8007148: 4293 cmp r3, r2
  15729. 800714a: d03b beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15730. 800714c: 687b ldr r3, [r7, #4]
  15731. 800714e: 681b ldr r3, [r3, #0]
  15732. 8007150: 4a74 ldr r2, [pc, #464] @ (8007324 <HAL_DMA_IRQHandler+0xa18>)
  15733. 8007152: 4293 cmp r3, r2
  15734. 8007154: d036 beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15735. 8007156: 687b ldr r3, [r7, #4]
  15736. 8007158: 681b ldr r3, [r3, #0]
  15737. 800715a: 4a73 ldr r2, [pc, #460] @ (8007328 <HAL_DMA_IRQHandler+0xa1c>)
  15738. 800715c: 4293 cmp r3, r2
  15739. 800715e: d031 beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15740. 8007160: 687b ldr r3, [r7, #4]
  15741. 8007162: 681b ldr r3, [r3, #0]
  15742. 8007164: 4a71 ldr r2, [pc, #452] @ (800732c <HAL_DMA_IRQHandler+0xa20>)
  15743. 8007166: 4293 cmp r3, r2
  15744. 8007168: d02c beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15745. 800716a: 687b ldr r3, [r7, #4]
  15746. 800716c: 681b ldr r3, [r3, #0]
  15747. 800716e: 4a70 ldr r2, [pc, #448] @ (8007330 <HAL_DMA_IRQHandler+0xa24>)
  15748. 8007170: 4293 cmp r3, r2
  15749. 8007172: d027 beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15750. 8007174: 687b ldr r3, [r7, #4]
  15751. 8007176: 681b ldr r3, [r3, #0]
  15752. 8007178: 4a6e ldr r2, [pc, #440] @ (8007334 <HAL_DMA_IRQHandler+0xa28>)
  15753. 800717a: 4293 cmp r3, r2
  15754. 800717c: d022 beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15755. 800717e: 687b ldr r3, [r7, #4]
  15756. 8007180: 681b ldr r3, [r3, #0]
  15757. 8007182: 4a6d ldr r2, [pc, #436] @ (8007338 <HAL_DMA_IRQHandler+0xa2c>)
  15758. 8007184: 4293 cmp r3, r2
  15759. 8007186: d01d beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15760. 8007188: 687b ldr r3, [r7, #4]
  15761. 800718a: 681b ldr r3, [r3, #0]
  15762. 800718c: 4a6b ldr r2, [pc, #428] @ (800733c <HAL_DMA_IRQHandler+0xa30>)
  15763. 800718e: 4293 cmp r3, r2
  15764. 8007190: d018 beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15765. 8007192: 687b ldr r3, [r7, #4]
  15766. 8007194: 681b ldr r3, [r3, #0]
  15767. 8007196: 4a6a ldr r2, [pc, #424] @ (8007340 <HAL_DMA_IRQHandler+0xa34>)
  15768. 8007198: 4293 cmp r3, r2
  15769. 800719a: d013 beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15770. 800719c: 687b ldr r3, [r7, #4]
  15771. 800719e: 681b ldr r3, [r3, #0]
  15772. 80071a0: 4a68 ldr r2, [pc, #416] @ (8007344 <HAL_DMA_IRQHandler+0xa38>)
  15773. 80071a2: 4293 cmp r3, r2
  15774. 80071a4: d00e beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15775. 80071a6: 687b ldr r3, [r7, #4]
  15776. 80071a8: 681b ldr r3, [r3, #0]
  15777. 80071aa: 4a67 ldr r2, [pc, #412] @ (8007348 <HAL_DMA_IRQHandler+0xa3c>)
  15778. 80071ac: 4293 cmp r3, r2
  15779. 80071ae: d009 beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15780. 80071b0: 687b ldr r3, [r7, #4]
  15781. 80071b2: 681b ldr r3, [r3, #0]
  15782. 80071b4: 4a65 ldr r2, [pc, #404] @ (800734c <HAL_DMA_IRQHandler+0xa40>)
  15783. 80071b6: 4293 cmp r3, r2
  15784. 80071b8: d004 beq.n 80071c4 <HAL_DMA_IRQHandler+0x8b8>
  15785. 80071ba: 687b ldr r3, [r7, #4]
  15786. 80071bc: 681b ldr r3, [r3, #0]
  15787. 80071be: 4a64 ldr r2, [pc, #400] @ (8007350 <HAL_DMA_IRQHandler+0xa44>)
  15788. 80071c0: 4293 cmp r3, r2
  15789. 80071c2: d108 bne.n 80071d6 <HAL_DMA_IRQHandler+0x8ca>
  15790. 80071c4: 687b ldr r3, [r7, #4]
  15791. 80071c6: 681b ldr r3, [r3, #0]
  15792. 80071c8: 681a ldr r2, [r3, #0]
  15793. 80071ca: 687b ldr r3, [r7, #4]
  15794. 80071cc: 681b ldr r3, [r3, #0]
  15795. 80071ce: f022 0201 bic.w r2, r2, #1
  15796. 80071d2: 601a str r2, [r3, #0]
  15797. 80071d4: e007 b.n 80071e6 <HAL_DMA_IRQHandler+0x8da>
  15798. 80071d6: 687b ldr r3, [r7, #4]
  15799. 80071d8: 681b ldr r3, [r3, #0]
  15800. 80071da: 681a ldr r2, [r3, #0]
  15801. 80071dc: 687b ldr r3, [r7, #4]
  15802. 80071de: 681b ldr r3, [r3, #0]
  15803. 80071e0: f022 0201 bic.w r2, r2, #1
  15804. 80071e4: 601a str r2, [r3, #0]
  15805. do
  15806. {
  15807. if (++count > timeout)
  15808. 80071e6: 68fb ldr r3, [r7, #12]
  15809. 80071e8: 3301 adds r3, #1
  15810. 80071ea: 60fb str r3, [r7, #12]
  15811. 80071ec: 6a7a ldr r2, [r7, #36] @ 0x24
  15812. 80071ee: 429a cmp r2, r3
  15813. 80071f0: d307 bcc.n 8007202 <HAL_DMA_IRQHandler+0x8f6>
  15814. {
  15815. break;
  15816. }
  15817. }
  15818. while((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_EN) != 0U);
  15819. 80071f2: 687b ldr r3, [r7, #4]
  15820. 80071f4: 681b ldr r3, [r3, #0]
  15821. 80071f6: 681b ldr r3, [r3, #0]
  15822. 80071f8: f003 0301 and.w r3, r3, #1
  15823. 80071fc: 2b00 cmp r3, #0
  15824. 80071fe: d1f2 bne.n 80071e6 <HAL_DMA_IRQHandler+0x8da>
  15825. 8007200: e000 b.n 8007204 <HAL_DMA_IRQHandler+0x8f8>
  15826. break;
  15827. 8007202: bf00 nop
  15828. if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_EN) != 0U)
  15829. 8007204: 687b ldr r3, [r7, #4]
  15830. 8007206: 681b ldr r3, [r3, #0]
  15831. 8007208: 681b ldr r3, [r3, #0]
  15832. 800720a: f003 0301 and.w r3, r3, #1
  15833. 800720e: 2b00 cmp r3, #0
  15834. 8007210: d004 beq.n 800721c <HAL_DMA_IRQHandler+0x910>
  15835. {
  15836. /* Change the DMA state to error if DMA disable fails */
  15837. hdma->State = HAL_DMA_STATE_ERROR;
  15838. 8007212: 687b ldr r3, [r7, #4]
  15839. 8007214: 2203 movs r2, #3
  15840. 8007216: f883 2035 strb.w r2, [r3, #53] @ 0x35
  15841. 800721a: e003 b.n 8007224 <HAL_DMA_IRQHandler+0x918>
  15842. }
  15843. else
  15844. {
  15845. /* Change the DMA state to Ready if DMA disable success */
  15846. hdma->State = HAL_DMA_STATE_READY;
  15847. 800721c: 687b ldr r3, [r7, #4]
  15848. 800721e: 2201 movs r2, #1
  15849. 8007220: f883 2035 strb.w r2, [r3, #53] @ 0x35
  15850. }
  15851. /* Process Unlocked */
  15852. __HAL_UNLOCK(hdma);
  15853. 8007224: 687b ldr r3, [r7, #4]
  15854. 8007226: 2200 movs r2, #0
  15855. 8007228: f883 2034 strb.w r2, [r3, #52] @ 0x34
  15856. }
  15857. if(hdma->XferErrorCallback != NULL)
  15858. 800722c: 687b ldr r3, [r7, #4]
  15859. 800722e: 6cdb ldr r3, [r3, #76] @ 0x4c
  15860. 8007230: 2b00 cmp r3, #0
  15861. 8007232: f000 8272 beq.w 800771a <HAL_DMA_IRQHandler+0xe0e>
  15862. {
  15863. /* Transfer error callback */
  15864. hdma->XferErrorCallback(hdma);
  15865. 8007236: 687b ldr r3, [r7, #4]
  15866. 8007238: 6cdb ldr r3, [r3, #76] @ 0x4c
  15867. 800723a: 6878 ldr r0, [r7, #4]
  15868. 800723c: 4798 blx r3
  15869. 800723e: e26c b.n 800771a <HAL_DMA_IRQHandler+0xe0e>
  15870. }
  15871. }
  15872. }
  15873. else if(IS_BDMA_CHANNEL_INSTANCE(hdma->Instance) != 0U) /* BDMA instance(s) */
  15874. 8007240: 687b ldr r3, [r7, #4]
  15875. 8007242: 681b ldr r3, [r3, #0]
  15876. 8007244: 4a43 ldr r2, [pc, #268] @ (8007354 <HAL_DMA_IRQHandler+0xa48>)
  15877. 8007246: 4293 cmp r3, r2
  15878. 8007248: d022 beq.n 8007290 <HAL_DMA_IRQHandler+0x984>
  15879. 800724a: 687b ldr r3, [r7, #4]
  15880. 800724c: 681b ldr r3, [r3, #0]
  15881. 800724e: 4a42 ldr r2, [pc, #264] @ (8007358 <HAL_DMA_IRQHandler+0xa4c>)
  15882. 8007250: 4293 cmp r3, r2
  15883. 8007252: d01d beq.n 8007290 <HAL_DMA_IRQHandler+0x984>
  15884. 8007254: 687b ldr r3, [r7, #4]
  15885. 8007256: 681b ldr r3, [r3, #0]
  15886. 8007258: 4a40 ldr r2, [pc, #256] @ (800735c <HAL_DMA_IRQHandler+0xa50>)
  15887. 800725a: 4293 cmp r3, r2
  15888. 800725c: d018 beq.n 8007290 <HAL_DMA_IRQHandler+0x984>
  15889. 800725e: 687b ldr r3, [r7, #4]
  15890. 8007260: 681b ldr r3, [r3, #0]
  15891. 8007262: 4a3f ldr r2, [pc, #252] @ (8007360 <HAL_DMA_IRQHandler+0xa54>)
  15892. 8007264: 4293 cmp r3, r2
  15893. 8007266: d013 beq.n 8007290 <HAL_DMA_IRQHandler+0x984>
  15894. 8007268: 687b ldr r3, [r7, #4]
  15895. 800726a: 681b ldr r3, [r3, #0]
  15896. 800726c: 4a3d ldr r2, [pc, #244] @ (8007364 <HAL_DMA_IRQHandler+0xa58>)
  15897. 800726e: 4293 cmp r3, r2
  15898. 8007270: d00e beq.n 8007290 <HAL_DMA_IRQHandler+0x984>
  15899. 8007272: 687b ldr r3, [r7, #4]
  15900. 8007274: 681b ldr r3, [r3, #0]
  15901. 8007276: 4a3c ldr r2, [pc, #240] @ (8007368 <HAL_DMA_IRQHandler+0xa5c>)
  15902. 8007278: 4293 cmp r3, r2
  15903. 800727a: d009 beq.n 8007290 <HAL_DMA_IRQHandler+0x984>
  15904. 800727c: 687b ldr r3, [r7, #4]
  15905. 800727e: 681b ldr r3, [r3, #0]
  15906. 8007280: 4a3a ldr r2, [pc, #232] @ (800736c <HAL_DMA_IRQHandler+0xa60>)
  15907. 8007282: 4293 cmp r3, r2
  15908. 8007284: d004 beq.n 8007290 <HAL_DMA_IRQHandler+0x984>
  15909. 8007286: 687b ldr r3, [r7, #4]
  15910. 8007288: 681b ldr r3, [r3, #0]
  15911. 800728a: 4a39 ldr r2, [pc, #228] @ (8007370 <HAL_DMA_IRQHandler+0xa64>)
  15912. 800728c: 4293 cmp r3, r2
  15913. 800728e: d101 bne.n 8007294 <HAL_DMA_IRQHandler+0x988>
  15914. 8007290: 2301 movs r3, #1
  15915. 8007292: e000 b.n 8007296 <HAL_DMA_IRQHandler+0x98a>
  15916. 8007294: 2300 movs r3, #0
  15917. 8007296: 2b00 cmp r3, #0
  15918. 8007298: f000 823f beq.w 800771a <HAL_DMA_IRQHandler+0xe0e>
  15919. {
  15920. ccr_reg = (((BDMA_Channel_TypeDef *)hdma->Instance)->CCR);
  15921. 800729c: 687b ldr r3, [r7, #4]
  15922. 800729e: 681b ldr r3, [r3, #0]
  15923. 80072a0: 681b ldr r3, [r3, #0]
  15924. 80072a2: 613b str r3, [r7, #16]
  15925. /* Half Transfer Complete Interrupt management ******************************/
  15926. if (((tmpisr_bdma & (BDMA_FLAG_HT0 << (hdma->StreamIndex & 0x1FU))) != 0U) && ((ccr_reg & BDMA_CCR_HTIE) != 0U))
  15927. 80072a4: 687b ldr r3, [r7, #4]
  15928. 80072a6: 6ddb ldr r3, [r3, #92] @ 0x5c
  15929. 80072a8: f003 031f and.w r3, r3, #31
  15930. 80072ac: 2204 movs r2, #4
  15931. 80072ae: 409a lsls r2, r3
  15932. 80072b0: 697b ldr r3, [r7, #20]
  15933. 80072b2: 4013 ands r3, r2
  15934. 80072b4: 2b00 cmp r3, #0
  15935. 80072b6: f000 80cd beq.w 8007454 <HAL_DMA_IRQHandler+0xb48>
  15936. 80072ba: 693b ldr r3, [r7, #16]
  15937. 80072bc: f003 0304 and.w r3, r3, #4
  15938. 80072c0: 2b00 cmp r3, #0
  15939. 80072c2: f000 80c7 beq.w 8007454 <HAL_DMA_IRQHandler+0xb48>
  15940. {
  15941. /* Clear the half transfer complete flag */
  15942. regs_bdma->IFCR = (BDMA_ISR_HTIF0 << (hdma->StreamIndex & 0x1FU));
  15943. 80072c6: 687b ldr r3, [r7, #4]
  15944. 80072c8: 6ddb ldr r3, [r3, #92] @ 0x5c
  15945. 80072ca: f003 031f and.w r3, r3, #31
  15946. 80072ce: 2204 movs r2, #4
  15947. 80072d0: 409a lsls r2, r3
  15948. 80072d2: 69fb ldr r3, [r7, #28]
  15949. 80072d4: 605a str r2, [r3, #4]
  15950. /* Disable the transfer complete interrupt if the DMA mode is Double Buffering */
  15951. if((ccr_reg & BDMA_CCR_DBM) != 0U)
  15952. 80072d6: 693b ldr r3, [r7, #16]
  15953. 80072d8: f403 4300 and.w r3, r3, #32768 @ 0x8000
  15954. 80072dc: 2b00 cmp r3, #0
  15955. 80072de: d049 beq.n 8007374 <HAL_DMA_IRQHandler+0xa68>
  15956. {
  15957. /* Current memory buffer used is Memory 0 */
  15958. if((ccr_reg & BDMA_CCR_CT) == 0U)
  15959. 80072e0: 693b ldr r3, [r7, #16]
  15960. 80072e2: f403 3380 and.w r3, r3, #65536 @ 0x10000
  15961. 80072e6: 2b00 cmp r3, #0
  15962. 80072e8: d109 bne.n 80072fe <HAL_DMA_IRQHandler+0x9f2>
  15963. {
  15964. if(hdma->XferM1HalfCpltCallback != NULL)
  15965. 80072ea: 687b ldr r3, [r7, #4]
  15966. 80072ec: 6c9b ldr r3, [r3, #72] @ 0x48
  15967. 80072ee: 2b00 cmp r3, #0
  15968. 80072f0: f000 8210 beq.w 8007714 <HAL_DMA_IRQHandler+0xe08>
  15969. {
  15970. /* Half transfer Callback for Memory 1 */
  15971. hdma->XferM1HalfCpltCallback(hdma);
  15972. 80072f4: 687b ldr r3, [r7, #4]
  15973. 80072f6: 6c9b ldr r3, [r3, #72] @ 0x48
  15974. 80072f8: 6878 ldr r0, [r7, #4]
  15975. 80072fa: 4798 blx r3
  15976. if((ccr_reg & BDMA_CCR_DBM) != 0U)
  15977. 80072fc: e20a b.n 8007714 <HAL_DMA_IRQHandler+0xe08>
  15978. }
  15979. }
  15980. /* Current memory buffer used is Memory 1 */
  15981. else
  15982. {
  15983. if(hdma->XferHalfCpltCallback != NULL)
  15984. 80072fe: 687b ldr r3, [r7, #4]
  15985. 8007300: 6c1b ldr r3, [r3, #64] @ 0x40
  15986. 8007302: 2b00 cmp r3, #0
  15987. 8007304: f000 8206 beq.w 8007714 <HAL_DMA_IRQHandler+0xe08>
  15988. {
  15989. /* Half transfer Callback for Memory 0 */
  15990. hdma->XferHalfCpltCallback(hdma);
  15991. 8007308: 687b ldr r3, [r7, #4]
  15992. 800730a: 6c1b ldr r3, [r3, #64] @ 0x40
  15993. 800730c: 6878 ldr r0, [r7, #4]
  15994. 800730e: 4798 blx r3
  15995. if((ccr_reg & BDMA_CCR_DBM) != 0U)
  15996. 8007310: e200 b.n 8007714 <HAL_DMA_IRQHandler+0xe08>
  15997. 8007312: bf00 nop
  15998. 8007314: 40020010 .word 0x40020010
  15999. 8007318: 40020028 .word 0x40020028
  16000. 800731c: 40020040 .word 0x40020040
  16001. 8007320: 40020058 .word 0x40020058
  16002. 8007324: 40020070 .word 0x40020070
  16003. 8007328: 40020088 .word 0x40020088
  16004. 800732c: 400200a0 .word 0x400200a0
  16005. 8007330: 400200b8 .word 0x400200b8
  16006. 8007334: 40020410 .word 0x40020410
  16007. 8007338: 40020428 .word 0x40020428
  16008. 800733c: 40020440 .word 0x40020440
  16009. 8007340: 40020458 .word 0x40020458
  16010. 8007344: 40020470 .word 0x40020470
  16011. 8007348: 40020488 .word 0x40020488
  16012. 800734c: 400204a0 .word 0x400204a0
  16013. 8007350: 400204b8 .word 0x400204b8
  16014. 8007354: 58025408 .word 0x58025408
  16015. 8007358: 5802541c .word 0x5802541c
  16016. 800735c: 58025430 .word 0x58025430
  16017. 8007360: 58025444 .word 0x58025444
  16018. 8007364: 58025458 .word 0x58025458
  16019. 8007368: 5802546c .word 0x5802546c
  16020. 800736c: 58025480 .word 0x58025480
  16021. 8007370: 58025494 .word 0x58025494
  16022. }
  16023. }
  16024. }
  16025. else
  16026. {
  16027. if((ccr_reg & BDMA_CCR_CIRC) == 0U)
  16028. 8007374: 693b ldr r3, [r7, #16]
  16029. 8007376: f003 0320 and.w r3, r3, #32
  16030. 800737a: 2b00 cmp r3, #0
  16031. 800737c: d160 bne.n 8007440 <HAL_DMA_IRQHandler+0xb34>
  16032. {
  16033. /* Disable the half transfer interrupt */
  16034. __HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT);
  16035. 800737e: 687b ldr r3, [r7, #4]
  16036. 8007380: 681b ldr r3, [r3, #0]
  16037. 8007382: 4a7f ldr r2, [pc, #508] @ (8007580 <HAL_DMA_IRQHandler+0xc74>)
  16038. 8007384: 4293 cmp r3, r2
  16039. 8007386: d04a beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16040. 8007388: 687b ldr r3, [r7, #4]
  16041. 800738a: 681b ldr r3, [r3, #0]
  16042. 800738c: 4a7d ldr r2, [pc, #500] @ (8007584 <HAL_DMA_IRQHandler+0xc78>)
  16043. 800738e: 4293 cmp r3, r2
  16044. 8007390: d045 beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16045. 8007392: 687b ldr r3, [r7, #4]
  16046. 8007394: 681b ldr r3, [r3, #0]
  16047. 8007396: 4a7c ldr r2, [pc, #496] @ (8007588 <HAL_DMA_IRQHandler+0xc7c>)
  16048. 8007398: 4293 cmp r3, r2
  16049. 800739a: d040 beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16050. 800739c: 687b ldr r3, [r7, #4]
  16051. 800739e: 681b ldr r3, [r3, #0]
  16052. 80073a0: 4a7a ldr r2, [pc, #488] @ (800758c <HAL_DMA_IRQHandler+0xc80>)
  16053. 80073a2: 4293 cmp r3, r2
  16054. 80073a4: d03b beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16055. 80073a6: 687b ldr r3, [r7, #4]
  16056. 80073a8: 681b ldr r3, [r3, #0]
  16057. 80073aa: 4a79 ldr r2, [pc, #484] @ (8007590 <HAL_DMA_IRQHandler+0xc84>)
  16058. 80073ac: 4293 cmp r3, r2
  16059. 80073ae: d036 beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16060. 80073b0: 687b ldr r3, [r7, #4]
  16061. 80073b2: 681b ldr r3, [r3, #0]
  16062. 80073b4: 4a77 ldr r2, [pc, #476] @ (8007594 <HAL_DMA_IRQHandler+0xc88>)
  16063. 80073b6: 4293 cmp r3, r2
  16064. 80073b8: d031 beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16065. 80073ba: 687b ldr r3, [r7, #4]
  16066. 80073bc: 681b ldr r3, [r3, #0]
  16067. 80073be: 4a76 ldr r2, [pc, #472] @ (8007598 <HAL_DMA_IRQHandler+0xc8c>)
  16068. 80073c0: 4293 cmp r3, r2
  16069. 80073c2: d02c beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16070. 80073c4: 687b ldr r3, [r7, #4]
  16071. 80073c6: 681b ldr r3, [r3, #0]
  16072. 80073c8: 4a74 ldr r2, [pc, #464] @ (800759c <HAL_DMA_IRQHandler+0xc90>)
  16073. 80073ca: 4293 cmp r3, r2
  16074. 80073cc: d027 beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16075. 80073ce: 687b ldr r3, [r7, #4]
  16076. 80073d0: 681b ldr r3, [r3, #0]
  16077. 80073d2: 4a73 ldr r2, [pc, #460] @ (80075a0 <HAL_DMA_IRQHandler+0xc94>)
  16078. 80073d4: 4293 cmp r3, r2
  16079. 80073d6: d022 beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16080. 80073d8: 687b ldr r3, [r7, #4]
  16081. 80073da: 681b ldr r3, [r3, #0]
  16082. 80073dc: 4a71 ldr r2, [pc, #452] @ (80075a4 <HAL_DMA_IRQHandler+0xc98>)
  16083. 80073de: 4293 cmp r3, r2
  16084. 80073e0: d01d beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16085. 80073e2: 687b ldr r3, [r7, #4]
  16086. 80073e4: 681b ldr r3, [r3, #0]
  16087. 80073e6: 4a70 ldr r2, [pc, #448] @ (80075a8 <HAL_DMA_IRQHandler+0xc9c>)
  16088. 80073e8: 4293 cmp r3, r2
  16089. 80073ea: d018 beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16090. 80073ec: 687b ldr r3, [r7, #4]
  16091. 80073ee: 681b ldr r3, [r3, #0]
  16092. 80073f0: 4a6e ldr r2, [pc, #440] @ (80075ac <HAL_DMA_IRQHandler+0xca0>)
  16093. 80073f2: 4293 cmp r3, r2
  16094. 80073f4: d013 beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16095. 80073f6: 687b ldr r3, [r7, #4]
  16096. 80073f8: 681b ldr r3, [r3, #0]
  16097. 80073fa: 4a6d ldr r2, [pc, #436] @ (80075b0 <HAL_DMA_IRQHandler+0xca4>)
  16098. 80073fc: 4293 cmp r3, r2
  16099. 80073fe: d00e beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16100. 8007400: 687b ldr r3, [r7, #4]
  16101. 8007402: 681b ldr r3, [r3, #0]
  16102. 8007404: 4a6b ldr r2, [pc, #428] @ (80075b4 <HAL_DMA_IRQHandler+0xca8>)
  16103. 8007406: 4293 cmp r3, r2
  16104. 8007408: d009 beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16105. 800740a: 687b ldr r3, [r7, #4]
  16106. 800740c: 681b ldr r3, [r3, #0]
  16107. 800740e: 4a6a ldr r2, [pc, #424] @ (80075b8 <HAL_DMA_IRQHandler+0xcac>)
  16108. 8007410: 4293 cmp r3, r2
  16109. 8007412: d004 beq.n 800741e <HAL_DMA_IRQHandler+0xb12>
  16110. 8007414: 687b ldr r3, [r7, #4]
  16111. 8007416: 681b ldr r3, [r3, #0]
  16112. 8007418: 4a68 ldr r2, [pc, #416] @ (80075bc <HAL_DMA_IRQHandler+0xcb0>)
  16113. 800741a: 4293 cmp r3, r2
  16114. 800741c: d108 bne.n 8007430 <HAL_DMA_IRQHandler+0xb24>
  16115. 800741e: 687b ldr r3, [r7, #4]
  16116. 8007420: 681b ldr r3, [r3, #0]
  16117. 8007422: 681a ldr r2, [r3, #0]
  16118. 8007424: 687b ldr r3, [r7, #4]
  16119. 8007426: 681b ldr r3, [r3, #0]
  16120. 8007428: f022 0208 bic.w r2, r2, #8
  16121. 800742c: 601a str r2, [r3, #0]
  16122. 800742e: e007 b.n 8007440 <HAL_DMA_IRQHandler+0xb34>
  16123. 8007430: 687b ldr r3, [r7, #4]
  16124. 8007432: 681b ldr r3, [r3, #0]
  16125. 8007434: 681a ldr r2, [r3, #0]
  16126. 8007436: 687b ldr r3, [r7, #4]
  16127. 8007438: 681b ldr r3, [r3, #0]
  16128. 800743a: f022 0204 bic.w r2, r2, #4
  16129. 800743e: 601a str r2, [r3, #0]
  16130. }
  16131. /* DMA peripheral state is not updated in Half Transfer */
  16132. /* but in Transfer Complete case */
  16133. if(hdma->XferHalfCpltCallback != NULL)
  16134. 8007440: 687b ldr r3, [r7, #4]
  16135. 8007442: 6c1b ldr r3, [r3, #64] @ 0x40
  16136. 8007444: 2b00 cmp r3, #0
  16137. 8007446: f000 8165 beq.w 8007714 <HAL_DMA_IRQHandler+0xe08>
  16138. {
  16139. /* Half transfer callback */
  16140. hdma->XferHalfCpltCallback(hdma);
  16141. 800744a: 687b ldr r3, [r7, #4]
  16142. 800744c: 6c1b ldr r3, [r3, #64] @ 0x40
  16143. 800744e: 6878 ldr r0, [r7, #4]
  16144. 8007450: 4798 blx r3
  16145. if((ccr_reg & BDMA_CCR_DBM) != 0U)
  16146. 8007452: e15f b.n 8007714 <HAL_DMA_IRQHandler+0xe08>
  16147. }
  16148. }
  16149. }
  16150. /* Transfer Complete Interrupt management ***********************************/
  16151. else if (((tmpisr_bdma & (BDMA_FLAG_TC0 << (hdma->StreamIndex & 0x1FU))) != 0U) && ((ccr_reg & BDMA_CCR_TCIE) != 0U))
  16152. 8007454: 687b ldr r3, [r7, #4]
  16153. 8007456: 6ddb ldr r3, [r3, #92] @ 0x5c
  16154. 8007458: f003 031f and.w r3, r3, #31
  16155. 800745c: 2202 movs r2, #2
  16156. 800745e: 409a lsls r2, r3
  16157. 8007460: 697b ldr r3, [r7, #20]
  16158. 8007462: 4013 ands r3, r2
  16159. 8007464: 2b00 cmp r3, #0
  16160. 8007466: f000 80c5 beq.w 80075f4 <HAL_DMA_IRQHandler+0xce8>
  16161. 800746a: 693b ldr r3, [r7, #16]
  16162. 800746c: f003 0302 and.w r3, r3, #2
  16163. 8007470: 2b00 cmp r3, #0
  16164. 8007472: f000 80bf beq.w 80075f4 <HAL_DMA_IRQHandler+0xce8>
  16165. {
  16166. /* Clear the transfer complete flag */
  16167. regs_bdma->IFCR = (BDMA_ISR_TCIF0) << (hdma->StreamIndex & 0x1FU);
  16168. 8007476: 687b ldr r3, [r7, #4]
  16169. 8007478: 6ddb ldr r3, [r3, #92] @ 0x5c
  16170. 800747a: f003 031f and.w r3, r3, #31
  16171. 800747e: 2202 movs r2, #2
  16172. 8007480: 409a lsls r2, r3
  16173. 8007482: 69fb ldr r3, [r7, #28]
  16174. 8007484: 605a str r2, [r3, #4]
  16175. /* Disable the transfer complete interrupt if the DMA mode is Double Buffering */
  16176. if((ccr_reg & BDMA_CCR_DBM) != 0U)
  16177. 8007486: 693b ldr r3, [r7, #16]
  16178. 8007488: f403 4300 and.w r3, r3, #32768 @ 0x8000
  16179. 800748c: 2b00 cmp r3, #0
  16180. 800748e: d018 beq.n 80074c2 <HAL_DMA_IRQHandler+0xbb6>
  16181. {
  16182. /* Current memory buffer used is Memory 0 */
  16183. if((ccr_reg & BDMA_CCR_CT) == 0U)
  16184. 8007490: 693b ldr r3, [r7, #16]
  16185. 8007492: f403 3380 and.w r3, r3, #65536 @ 0x10000
  16186. 8007496: 2b00 cmp r3, #0
  16187. 8007498: d109 bne.n 80074ae <HAL_DMA_IRQHandler+0xba2>
  16188. {
  16189. if(hdma->XferM1CpltCallback != NULL)
  16190. 800749a: 687b ldr r3, [r7, #4]
  16191. 800749c: 6c5b ldr r3, [r3, #68] @ 0x44
  16192. 800749e: 2b00 cmp r3, #0
  16193. 80074a0: f000 813a beq.w 8007718 <HAL_DMA_IRQHandler+0xe0c>
  16194. {
  16195. /* Transfer complete Callback for Memory 1 */
  16196. hdma->XferM1CpltCallback(hdma);
  16197. 80074a4: 687b ldr r3, [r7, #4]
  16198. 80074a6: 6c5b ldr r3, [r3, #68] @ 0x44
  16199. 80074a8: 6878 ldr r0, [r7, #4]
  16200. 80074aa: 4798 blx r3
  16201. if((ccr_reg & BDMA_CCR_DBM) != 0U)
  16202. 80074ac: e134 b.n 8007718 <HAL_DMA_IRQHandler+0xe0c>
  16203. }
  16204. }
  16205. /* Current memory buffer used is Memory 1 */
  16206. else
  16207. {
  16208. if(hdma->XferCpltCallback != NULL)
  16209. 80074ae: 687b ldr r3, [r7, #4]
  16210. 80074b0: 6bdb ldr r3, [r3, #60] @ 0x3c
  16211. 80074b2: 2b00 cmp r3, #0
  16212. 80074b4: f000 8130 beq.w 8007718 <HAL_DMA_IRQHandler+0xe0c>
  16213. {
  16214. /* Transfer complete Callback for Memory 0 */
  16215. hdma->XferCpltCallback(hdma);
  16216. 80074b8: 687b ldr r3, [r7, #4]
  16217. 80074ba: 6bdb ldr r3, [r3, #60] @ 0x3c
  16218. 80074bc: 6878 ldr r0, [r7, #4]
  16219. 80074be: 4798 blx r3
  16220. if((ccr_reg & BDMA_CCR_DBM) != 0U)
  16221. 80074c0: e12a b.n 8007718 <HAL_DMA_IRQHandler+0xe0c>
  16222. }
  16223. }
  16224. }
  16225. else
  16226. {
  16227. if((ccr_reg & BDMA_CCR_CIRC) == 0U)
  16228. 80074c2: 693b ldr r3, [r7, #16]
  16229. 80074c4: f003 0320 and.w r3, r3, #32
  16230. 80074c8: 2b00 cmp r3, #0
  16231. 80074ca: f040 8089 bne.w 80075e0 <HAL_DMA_IRQHandler+0xcd4>
  16232. {
  16233. /* Disable the transfer complete and error interrupt, if the DMA mode is not CIRCULAR */
  16234. __HAL_DMA_DISABLE_IT(hdma, DMA_IT_TE | DMA_IT_TC);
  16235. 80074ce: 687b ldr r3, [r7, #4]
  16236. 80074d0: 681b ldr r3, [r3, #0]
  16237. 80074d2: 4a2b ldr r2, [pc, #172] @ (8007580 <HAL_DMA_IRQHandler+0xc74>)
  16238. 80074d4: 4293 cmp r3, r2
  16239. 80074d6: d04a beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16240. 80074d8: 687b ldr r3, [r7, #4]
  16241. 80074da: 681b ldr r3, [r3, #0]
  16242. 80074dc: 4a29 ldr r2, [pc, #164] @ (8007584 <HAL_DMA_IRQHandler+0xc78>)
  16243. 80074de: 4293 cmp r3, r2
  16244. 80074e0: d045 beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16245. 80074e2: 687b ldr r3, [r7, #4]
  16246. 80074e4: 681b ldr r3, [r3, #0]
  16247. 80074e6: 4a28 ldr r2, [pc, #160] @ (8007588 <HAL_DMA_IRQHandler+0xc7c>)
  16248. 80074e8: 4293 cmp r3, r2
  16249. 80074ea: d040 beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16250. 80074ec: 687b ldr r3, [r7, #4]
  16251. 80074ee: 681b ldr r3, [r3, #0]
  16252. 80074f0: 4a26 ldr r2, [pc, #152] @ (800758c <HAL_DMA_IRQHandler+0xc80>)
  16253. 80074f2: 4293 cmp r3, r2
  16254. 80074f4: d03b beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16255. 80074f6: 687b ldr r3, [r7, #4]
  16256. 80074f8: 681b ldr r3, [r3, #0]
  16257. 80074fa: 4a25 ldr r2, [pc, #148] @ (8007590 <HAL_DMA_IRQHandler+0xc84>)
  16258. 80074fc: 4293 cmp r3, r2
  16259. 80074fe: d036 beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16260. 8007500: 687b ldr r3, [r7, #4]
  16261. 8007502: 681b ldr r3, [r3, #0]
  16262. 8007504: 4a23 ldr r2, [pc, #140] @ (8007594 <HAL_DMA_IRQHandler+0xc88>)
  16263. 8007506: 4293 cmp r3, r2
  16264. 8007508: d031 beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16265. 800750a: 687b ldr r3, [r7, #4]
  16266. 800750c: 681b ldr r3, [r3, #0]
  16267. 800750e: 4a22 ldr r2, [pc, #136] @ (8007598 <HAL_DMA_IRQHandler+0xc8c>)
  16268. 8007510: 4293 cmp r3, r2
  16269. 8007512: d02c beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16270. 8007514: 687b ldr r3, [r7, #4]
  16271. 8007516: 681b ldr r3, [r3, #0]
  16272. 8007518: 4a20 ldr r2, [pc, #128] @ (800759c <HAL_DMA_IRQHandler+0xc90>)
  16273. 800751a: 4293 cmp r3, r2
  16274. 800751c: d027 beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16275. 800751e: 687b ldr r3, [r7, #4]
  16276. 8007520: 681b ldr r3, [r3, #0]
  16277. 8007522: 4a1f ldr r2, [pc, #124] @ (80075a0 <HAL_DMA_IRQHandler+0xc94>)
  16278. 8007524: 4293 cmp r3, r2
  16279. 8007526: d022 beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16280. 8007528: 687b ldr r3, [r7, #4]
  16281. 800752a: 681b ldr r3, [r3, #0]
  16282. 800752c: 4a1d ldr r2, [pc, #116] @ (80075a4 <HAL_DMA_IRQHandler+0xc98>)
  16283. 800752e: 4293 cmp r3, r2
  16284. 8007530: d01d beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16285. 8007532: 687b ldr r3, [r7, #4]
  16286. 8007534: 681b ldr r3, [r3, #0]
  16287. 8007536: 4a1c ldr r2, [pc, #112] @ (80075a8 <HAL_DMA_IRQHandler+0xc9c>)
  16288. 8007538: 4293 cmp r3, r2
  16289. 800753a: d018 beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16290. 800753c: 687b ldr r3, [r7, #4]
  16291. 800753e: 681b ldr r3, [r3, #0]
  16292. 8007540: 4a1a ldr r2, [pc, #104] @ (80075ac <HAL_DMA_IRQHandler+0xca0>)
  16293. 8007542: 4293 cmp r3, r2
  16294. 8007544: d013 beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16295. 8007546: 687b ldr r3, [r7, #4]
  16296. 8007548: 681b ldr r3, [r3, #0]
  16297. 800754a: 4a19 ldr r2, [pc, #100] @ (80075b0 <HAL_DMA_IRQHandler+0xca4>)
  16298. 800754c: 4293 cmp r3, r2
  16299. 800754e: d00e beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16300. 8007550: 687b ldr r3, [r7, #4]
  16301. 8007552: 681b ldr r3, [r3, #0]
  16302. 8007554: 4a17 ldr r2, [pc, #92] @ (80075b4 <HAL_DMA_IRQHandler+0xca8>)
  16303. 8007556: 4293 cmp r3, r2
  16304. 8007558: d009 beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16305. 800755a: 687b ldr r3, [r7, #4]
  16306. 800755c: 681b ldr r3, [r3, #0]
  16307. 800755e: 4a16 ldr r2, [pc, #88] @ (80075b8 <HAL_DMA_IRQHandler+0xcac>)
  16308. 8007560: 4293 cmp r3, r2
  16309. 8007562: d004 beq.n 800756e <HAL_DMA_IRQHandler+0xc62>
  16310. 8007564: 687b ldr r3, [r7, #4]
  16311. 8007566: 681b ldr r3, [r3, #0]
  16312. 8007568: 4a14 ldr r2, [pc, #80] @ (80075bc <HAL_DMA_IRQHandler+0xcb0>)
  16313. 800756a: 4293 cmp r3, r2
  16314. 800756c: d128 bne.n 80075c0 <HAL_DMA_IRQHandler+0xcb4>
  16315. 800756e: 687b ldr r3, [r7, #4]
  16316. 8007570: 681b ldr r3, [r3, #0]
  16317. 8007572: 681a ldr r2, [r3, #0]
  16318. 8007574: 687b ldr r3, [r7, #4]
  16319. 8007576: 681b ldr r3, [r3, #0]
  16320. 8007578: f022 0214 bic.w r2, r2, #20
  16321. 800757c: 601a str r2, [r3, #0]
  16322. 800757e: e027 b.n 80075d0 <HAL_DMA_IRQHandler+0xcc4>
  16323. 8007580: 40020010 .word 0x40020010
  16324. 8007584: 40020028 .word 0x40020028
  16325. 8007588: 40020040 .word 0x40020040
  16326. 800758c: 40020058 .word 0x40020058
  16327. 8007590: 40020070 .word 0x40020070
  16328. 8007594: 40020088 .word 0x40020088
  16329. 8007598: 400200a0 .word 0x400200a0
  16330. 800759c: 400200b8 .word 0x400200b8
  16331. 80075a0: 40020410 .word 0x40020410
  16332. 80075a4: 40020428 .word 0x40020428
  16333. 80075a8: 40020440 .word 0x40020440
  16334. 80075ac: 40020458 .word 0x40020458
  16335. 80075b0: 40020470 .word 0x40020470
  16336. 80075b4: 40020488 .word 0x40020488
  16337. 80075b8: 400204a0 .word 0x400204a0
  16338. 80075bc: 400204b8 .word 0x400204b8
  16339. 80075c0: 687b ldr r3, [r7, #4]
  16340. 80075c2: 681b ldr r3, [r3, #0]
  16341. 80075c4: 681a ldr r2, [r3, #0]
  16342. 80075c6: 687b ldr r3, [r7, #4]
  16343. 80075c8: 681b ldr r3, [r3, #0]
  16344. 80075ca: f022 020a bic.w r2, r2, #10
  16345. 80075ce: 601a str r2, [r3, #0]
  16346. /* Change the DMA state */
  16347. hdma->State = HAL_DMA_STATE_READY;
  16348. 80075d0: 687b ldr r3, [r7, #4]
  16349. 80075d2: 2201 movs r2, #1
  16350. 80075d4: f883 2035 strb.w r2, [r3, #53] @ 0x35
  16351. /* Process Unlocked */
  16352. __HAL_UNLOCK(hdma);
  16353. 80075d8: 687b ldr r3, [r7, #4]
  16354. 80075da: 2200 movs r2, #0
  16355. 80075dc: f883 2034 strb.w r2, [r3, #52] @ 0x34
  16356. }
  16357. if(hdma->XferCpltCallback != NULL)
  16358. 80075e0: 687b ldr r3, [r7, #4]
  16359. 80075e2: 6bdb ldr r3, [r3, #60] @ 0x3c
  16360. 80075e4: 2b00 cmp r3, #0
  16361. 80075e6: f000 8097 beq.w 8007718 <HAL_DMA_IRQHandler+0xe0c>
  16362. {
  16363. /* Transfer complete callback */
  16364. hdma->XferCpltCallback(hdma);
  16365. 80075ea: 687b ldr r3, [r7, #4]
  16366. 80075ec: 6bdb ldr r3, [r3, #60] @ 0x3c
  16367. 80075ee: 6878 ldr r0, [r7, #4]
  16368. 80075f0: 4798 blx r3
  16369. if((ccr_reg & BDMA_CCR_DBM) != 0U)
  16370. 80075f2: e091 b.n 8007718 <HAL_DMA_IRQHandler+0xe0c>
  16371. }
  16372. }
  16373. }
  16374. /* Transfer Error Interrupt management **************************************/
  16375. else if (((tmpisr_bdma & (BDMA_FLAG_TE0 << (hdma->StreamIndex & 0x1FU))) != 0U) && ((ccr_reg & BDMA_CCR_TEIE) != 0U))
  16376. 80075f4: 687b ldr r3, [r7, #4]
  16377. 80075f6: 6ddb ldr r3, [r3, #92] @ 0x5c
  16378. 80075f8: f003 031f and.w r3, r3, #31
  16379. 80075fc: 2208 movs r2, #8
  16380. 80075fe: 409a lsls r2, r3
  16381. 8007600: 697b ldr r3, [r7, #20]
  16382. 8007602: 4013 ands r3, r2
  16383. 8007604: 2b00 cmp r3, #0
  16384. 8007606: f000 8088 beq.w 800771a <HAL_DMA_IRQHandler+0xe0e>
  16385. 800760a: 693b ldr r3, [r7, #16]
  16386. 800760c: f003 0308 and.w r3, r3, #8
  16387. 8007610: 2b00 cmp r3, #0
  16388. 8007612: f000 8082 beq.w 800771a <HAL_DMA_IRQHandler+0xe0e>
  16389. {
  16390. /* When a DMA transfer error occurs */
  16391. /* A hardware clear of its EN bits is performed */
  16392. /* Disable ALL DMA IT */
  16393. __HAL_DMA_DISABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE));
  16394. 8007616: 687b ldr r3, [r7, #4]
  16395. 8007618: 681b ldr r3, [r3, #0]
  16396. 800761a: 4a41 ldr r2, [pc, #260] @ (8007720 <HAL_DMA_IRQHandler+0xe14>)
  16397. 800761c: 4293 cmp r3, r2
  16398. 800761e: d04a beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16399. 8007620: 687b ldr r3, [r7, #4]
  16400. 8007622: 681b ldr r3, [r3, #0]
  16401. 8007624: 4a3f ldr r2, [pc, #252] @ (8007724 <HAL_DMA_IRQHandler+0xe18>)
  16402. 8007626: 4293 cmp r3, r2
  16403. 8007628: d045 beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16404. 800762a: 687b ldr r3, [r7, #4]
  16405. 800762c: 681b ldr r3, [r3, #0]
  16406. 800762e: 4a3e ldr r2, [pc, #248] @ (8007728 <HAL_DMA_IRQHandler+0xe1c>)
  16407. 8007630: 4293 cmp r3, r2
  16408. 8007632: d040 beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16409. 8007634: 687b ldr r3, [r7, #4]
  16410. 8007636: 681b ldr r3, [r3, #0]
  16411. 8007638: 4a3c ldr r2, [pc, #240] @ (800772c <HAL_DMA_IRQHandler+0xe20>)
  16412. 800763a: 4293 cmp r3, r2
  16413. 800763c: d03b beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16414. 800763e: 687b ldr r3, [r7, #4]
  16415. 8007640: 681b ldr r3, [r3, #0]
  16416. 8007642: 4a3b ldr r2, [pc, #236] @ (8007730 <HAL_DMA_IRQHandler+0xe24>)
  16417. 8007644: 4293 cmp r3, r2
  16418. 8007646: d036 beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16419. 8007648: 687b ldr r3, [r7, #4]
  16420. 800764a: 681b ldr r3, [r3, #0]
  16421. 800764c: 4a39 ldr r2, [pc, #228] @ (8007734 <HAL_DMA_IRQHandler+0xe28>)
  16422. 800764e: 4293 cmp r3, r2
  16423. 8007650: d031 beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16424. 8007652: 687b ldr r3, [r7, #4]
  16425. 8007654: 681b ldr r3, [r3, #0]
  16426. 8007656: 4a38 ldr r2, [pc, #224] @ (8007738 <HAL_DMA_IRQHandler+0xe2c>)
  16427. 8007658: 4293 cmp r3, r2
  16428. 800765a: d02c beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16429. 800765c: 687b ldr r3, [r7, #4]
  16430. 800765e: 681b ldr r3, [r3, #0]
  16431. 8007660: 4a36 ldr r2, [pc, #216] @ (800773c <HAL_DMA_IRQHandler+0xe30>)
  16432. 8007662: 4293 cmp r3, r2
  16433. 8007664: d027 beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16434. 8007666: 687b ldr r3, [r7, #4]
  16435. 8007668: 681b ldr r3, [r3, #0]
  16436. 800766a: 4a35 ldr r2, [pc, #212] @ (8007740 <HAL_DMA_IRQHandler+0xe34>)
  16437. 800766c: 4293 cmp r3, r2
  16438. 800766e: d022 beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16439. 8007670: 687b ldr r3, [r7, #4]
  16440. 8007672: 681b ldr r3, [r3, #0]
  16441. 8007674: 4a33 ldr r2, [pc, #204] @ (8007744 <HAL_DMA_IRQHandler+0xe38>)
  16442. 8007676: 4293 cmp r3, r2
  16443. 8007678: d01d beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16444. 800767a: 687b ldr r3, [r7, #4]
  16445. 800767c: 681b ldr r3, [r3, #0]
  16446. 800767e: 4a32 ldr r2, [pc, #200] @ (8007748 <HAL_DMA_IRQHandler+0xe3c>)
  16447. 8007680: 4293 cmp r3, r2
  16448. 8007682: d018 beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16449. 8007684: 687b ldr r3, [r7, #4]
  16450. 8007686: 681b ldr r3, [r3, #0]
  16451. 8007688: 4a30 ldr r2, [pc, #192] @ (800774c <HAL_DMA_IRQHandler+0xe40>)
  16452. 800768a: 4293 cmp r3, r2
  16453. 800768c: d013 beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16454. 800768e: 687b ldr r3, [r7, #4]
  16455. 8007690: 681b ldr r3, [r3, #0]
  16456. 8007692: 4a2f ldr r2, [pc, #188] @ (8007750 <HAL_DMA_IRQHandler+0xe44>)
  16457. 8007694: 4293 cmp r3, r2
  16458. 8007696: d00e beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16459. 8007698: 687b ldr r3, [r7, #4]
  16460. 800769a: 681b ldr r3, [r3, #0]
  16461. 800769c: 4a2d ldr r2, [pc, #180] @ (8007754 <HAL_DMA_IRQHandler+0xe48>)
  16462. 800769e: 4293 cmp r3, r2
  16463. 80076a0: d009 beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16464. 80076a2: 687b ldr r3, [r7, #4]
  16465. 80076a4: 681b ldr r3, [r3, #0]
  16466. 80076a6: 4a2c ldr r2, [pc, #176] @ (8007758 <HAL_DMA_IRQHandler+0xe4c>)
  16467. 80076a8: 4293 cmp r3, r2
  16468. 80076aa: d004 beq.n 80076b6 <HAL_DMA_IRQHandler+0xdaa>
  16469. 80076ac: 687b ldr r3, [r7, #4]
  16470. 80076ae: 681b ldr r3, [r3, #0]
  16471. 80076b0: 4a2a ldr r2, [pc, #168] @ (800775c <HAL_DMA_IRQHandler+0xe50>)
  16472. 80076b2: 4293 cmp r3, r2
  16473. 80076b4: d108 bne.n 80076c8 <HAL_DMA_IRQHandler+0xdbc>
  16474. 80076b6: 687b ldr r3, [r7, #4]
  16475. 80076b8: 681b ldr r3, [r3, #0]
  16476. 80076ba: 681a ldr r2, [r3, #0]
  16477. 80076bc: 687b ldr r3, [r7, #4]
  16478. 80076be: 681b ldr r3, [r3, #0]
  16479. 80076c0: f022 021c bic.w r2, r2, #28
  16480. 80076c4: 601a str r2, [r3, #0]
  16481. 80076c6: e007 b.n 80076d8 <HAL_DMA_IRQHandler+0xdcc>
  16482. 80076c8: 687b ldr r3, [r7, #4]
  16483. 80076ca: 681b ldr r3, [r3, #0]
  16484. 80076cc: 681a ldr r2, [r3, #0]
  16485. 80076ce: 687b ldr r3, [r7, #4]
  16486. 80076d0: 681b ldr r3, [r3, #0]
  16487. 80076d2: f022 020e bic.w r2, r2, #14
  16488. 80076d6: 601a str r2, [r3, #0]
  16489. /* Clear all flags */
  16490. regs_bdma->IFCR = (BDMA_ISR_GIF0) << (hdma->StreamIndex & 0x1FU);
  16491. 80076d8: 687b ldr r3, [r7, #4]
  16492. 80076da: 6ddb ldr r3, [r3, #92] @ 0x5c
  16493. 80076dc: f003 031f and.w r3, r3, #31
  16494. 80076e0: 2201 movs r2, #1
  16495. 80076e2: 409a lsls r2, r3
  16496. 80076e4: 69fb ldr r3, [r7, #28]
  16497. 80076e6: 605a str r2, [r3, #4]
  16498. /* Update error code */
  16499. hdma->ErrorCode = HAL_DMA_ERROR_TE;
  16500. 80076e8: 687b ldr r3, [r7, #4]
  16501. 80076ea: 2201 movs r2, #1
  16502. 80076ec: 655a str r2, [r3, #84] @ 0x54
  16503. /* Change the DMA state */
  16504. hdma->State = HAL_DMA_STATE_READY;
  16505. 80076ee: 687b ldr r3, [r7, #4]
  16506. 80076f0: 2201 movs r2, #1
  16507. 80076f2: f883 2035 strb.w r2, [r3, #53] @ 0x35
  16508. /* Process Unlocked */
  16509. __HAL_UNLOCK(hdma);
  16510. 80076f6: 687b ldr r3, [r7, #4]
  16511. 80076f8: 2200 movs r2, #0
  16512. 80076fa: f883 2034 strb.w r2, [r3, #52] @ 0x34
  16513. if (hdma->XferErrorCallback != NULL)
  16514. 80076fe: 687b ldr r3, [r7, #4]
  16515. 8007700: 6cdb ldr r3, [r3, #76] @ 0x4c
  16516. 8007702: 2b00 cmp r3, #0
  16517. 8007704: d009 beq.n 800771a <HAL_DMA_IRQHandler+0xe0e>
  16518. {
  16519. /* Transfer error callback */
  16520. hdma->XferErrorCallback(hdma);
  16521. 8007706: 687b ldr r3, [r7, #4]
  16522. 8007708: 6cdb ldr r3, [r3, #76] @ 0x4c
  16523. 800770a: 6878 ldr r0, [r7, #4]
  16524. 800770c: 4798 blx r3
  16525. 800770e: e004 b.n 800771a <HAL_DMA_IRQHandler+0xe0e>
  16526. return;
  16527. 8007710: bf00 nop
  16528. 8007712: e002 b.n 800771a <HAL_DMA_IRQHandler+0xe0e>
  16529. if((ccr_reg & BDMA_CCR_DBM) != 0U)
  16530. 8007714: bf00 nop
  16531. 8007716: e000 b.n 800771a <HAL_DMA_IRQHandler+0xe0e>
  16532. if((ccr_reg & BDMA_CCR_DBM) != 0U)
  16533. 8007718: bf00 nop
  16534. }
  16535. else
  16536. {
  16537. /* Nothing To Do */
  16538. }
  16539. }
  16540. 800771a: 3728 adds r7, #40 @ 0x28
  16541. 800771c: 46bd mov sp, r7
  16542. 800771e: bd80 pop {r7, pc}
  16543. 8007720: 40020010 .word 0x40020010
  16544. 8007724: 40020028 .word 0x40020028
  16545. 8007728: 40020040 .word 0x40020040
  16546. 800772c: 40020058 .word 0x40020058
  16547. 8007730: 40020070 .word 0x40020070
  16548. 8007734: 40020088 .word 0x40020088
  16549. 8007738: 400200a0 .word 0x400200a0
  16550. 800773c: 400200b8 .word 0x400200b8
  16551. 8007740: 40020410 .word 0x40020410
  16552. 8007744: 40020428 .word 0x40020428
  16553. 8007748: 40020440 .word 0x40020440
  16554. 800774c: 40020458 .word 0x40020458
  16555. 8007750: 40020470 .word 0x40020470
  16556. 8007754: 40020488 .word 0x40020488
  16557. 8007758: 400204a0 .word 0x400204a0
  16558. 800775c: 400204b8 .word 0x400204b8
  16559. 08007760 <DMA_CalcBaseAndBitshift>:
  16560. * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
  16561. * the configuration information for the specified DMA Stream.
  16562. * @retval Stream base address
  16563. */
  16564. static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma)
  16565. {
  16566. 8007760: b480 push {r7}
  16567. 8007762: b085 sub sp, #20
  16568. 8007764: af00 add r7, sp, #0
  16569. 8007766: 6078 str r0, [r7, #4]
  16570. if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U) /* DMA1 or DMA2 instance */
  16571. 8007768: 687b ldr r3, [r7, #4]
  16572. 800776a: 681b ldr r3, [r3, #0]
  16573. 800776c: 4a42 ldr r2, [pc, #264] @ (8007878 <DMA_CalcBaseAndBitshift+0x118>)
  16574. 800776e: 4293 cmp r3, r2
  16575. 8007770: d04a beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16576. 8007772: 687b ldr r3, [r7, #4]
  16577. 8007774: 681b ldr r3, [r3, #0]
  16578. 8007776: 4a41 ldr r2, [pc, #260] @ (800787c <DMA_CalcBaseAndBitshift+0x11c>)
  16579. 8007778: 4293 cmp r3, r2
  16580. 800777a: d045 beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16581. 800777c: 687b ldr r3, [r7, #4]
  16582. 800777e: 681b ldr r3, [r3, #0]
  16583. 8007780: 4a3f ldr r2, [pc, #252] @ (8007880 <DMA_CalcBaseAndBitshift+0x120>)
  16584. 8007782: 4293 cmp r3, r2
  16585. 8007784: d040 beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16586. 8007786: 687b ldr r3, [r7, #4]
  16587. 8007788: 681b ldr r3, [r3, #0]
  16588. 800778a: 4a3e ldr r2, [pc, #248] @ (8007884 <DMA_CalcBaseAndBitshift+0x124>)
  16589. 800778c: 4293 cmp r3, r2
  16590. 800778e: d03b beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16591. 8007790: 687b ldr r3, [r7, #4]
  16592. 8007792: 681b ldr r3, [r3, #0]
  16593. 8007794: 4a3c ldr r2, [pc, #240] @ (8007888 <DMA_CalcBaseAndBitshift+0x128>)
  16594. 8007796: 4293 cmp r3, r2
  16595. 8007798: d036 beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16596. 800779a: 687b ldr r3, [r7, #4]
  16597. 800779c: 681b ldr r3, [r3, #0]
  16598. 800779e: 4a3b ldr r2, [pc, #236] @ (800788c <DMA_CalcBaseAndBitshift+0x12c>)
  16599. 80077a0: 4293 cmp r3, r2
  16600. 80077a2: d031 beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16601. 80077a4: 687b ldr r3, [r7, #4]
  16602. 80077a6: 681b ldr r3, [r3, #0]
  16603. 80077a8: 4a39 ldr r2, [pc, #228] @ (8007890 <DMA_CalcBaseAndBitshift+0x130>)
  16604. 80077aa: 4293 cmp r3, r2
  16605. 80077ac: d02c beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16606. 80077ae: 687b ldr r3, [r7, #4]
  16607. 80077b0: 681b ldr r3, [r3, #0]
  16608. 80077b2: 4a38 ldr r2, [pc, #224] @ (8007894 <DMA_CalcBaseAndBitshift+0x134>)
  16609. 80077b4: 4293 cmp r3, r2
  16610. 80077b6: d027 beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16611. 80077b8: 687b ldr r3, [r7, #4]
  16612. 80077ba: 681b ldr r3, [r3, #0]
  16613. 80077bc: 4a36 ldr r2, [pc, #216] @ (8007898 <DMA_CalcBaseAndBitshift+0x138>)
  16614. 80077be: 4293 cmp r3, r2
  16615. 80077c0: d022 beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16616. 80077c2: 687b ldr r3, [r7, #4]
  16617. 80077c4: 681b ldr r3, [r3, #0]
  16618. 80077c6: 4a35 ldr r2, [pc, #212] @ (800789c <DMA_CalcBaseAndBitshift+0x13c>)
  16619. 80077c8: 4293 cmp r3, r2
  16620. 80077ca: d01d beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16621. 80077cc: 687b ldr r3, [r7, #4]
  16622. 80077ce: 681b ldr r3, [r3, #0]
  16623. 80077d0: 4a33 ldr r2, [pc, #204] @ (80078a0 <DMA_CalcBaseAndBitshift+0x140>)
  16624. 80077d2: 4293 cmp r3, r2
  16625. 80077d4: d018 beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16626. 80077d6: 687b ldr r3, [r7, #4]
  16627. 80077d8: 681b ldr r3, [r3, #0]
  16628. 80077da: 4a32 ldr r2, [pc, #200] @ (80078a4 <DMA_CalcBaseAndBitshift+0x144>)
  16629. 80077dc: 4293 cmp r3, r2
  16630. 80077de: d013 beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16631. 80077e0: 687b ldr r3, [r7, #4]
  16632. 80077e2: 681b ldr r3, [r3, #0]
  16633. 80077e4: 4a30 ldr r2, [pc, #192] @ (80078a8 <DMA_CalcBaseAndBitshift+0x148>)
  16634. 80077e6: 4293 cmp r3, r2
  16635. 80077e8: d00e beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16636. 80077ea: 687b ldr r3, [r7, #4]
  16637. 80077ec: 681b ldr r3, [r3, #0]
  16638. 80077ee: 4a2f ldr r2, [pc, #188] @ (80078ac <DMA_CalcBaseAndBitshift+0x14c>)
  16639. 80077f0: 4293 cmp r3, r2
  16640. 80077f2: d009 beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16641. 80077f4: 687b ldr r3, [r7, #4]
  16642. 80077f6: 681b ldr r3, [r3, #0]
  16643. 80077f8: 4a2d ldr r2, [pc, #180] @ (80078b0 <DMA_CalcBaseAndBitshift+0x150>)
  16644. 80077fa: 4293 cmp r3, r2
  16645. 80077fc: d004 beq.n 8007808 <DMA_CalcBaseAndBitshift+0xa8>
  16646. 80077fe: 687b ldr r3, [r7, #4]
  16647. 8007800: 681b ldr r3, [r3, #0]
  16648. 8007802: 4a2c ldr r2, [pc, #176] @ (80078b4 <DMA_CalcBaseAndBitshift+0x154>)
  16649. 8007804: 4293 cmp r3, r2
  16650. 8007806: d101 bne.n 800780c <DMA_CalcBaseAndBitshift+0xac>
  16651. 8007808: 2301 movs r3, #1
  16652. 800780a: e000 b.n 800780e <DMA_CalcBaseAndBitshift+0xae>
  16653. 800780c: 2300 movs r3, #0
  16654. 800780e: 2b00 cmp r3, #0
  16655. 8007810: d024 beq.n 800785c <DMA_CalcBaseAndBitshift+0xfc>
  16656. {
  16657. uint32_t stream_number = (((uint32_t)((uint32_t*)hdma->Instance) & 0xFFU) - 16U) / 24U;
  16658. 8007812: 687b ldr r3, [r7, #4]
  16659. 8007814: 681b ldr r3, [r3, #0]
  16660. 8007816: b2db uxtb r3, r3
  16661. 8007818: 3b10 subs r3, #16
  16662. 800781a: 4a27 ldr r2, [pc, #156] @ (80078b8 <DMA_CalcBaseAndBitshift+0x158>)
  16663. 800781c: fba2 2303 umull r2, r3, r2, r3
  16664. 8007820: 091b lsrs r3, r3, #4
  16665. 8007822: 60fb str r3, [r7, #12]
  16666. /* lookup table for necessary bitshift of flags within status registers */
  16667. static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U};
  16668. hdma->StreamIndex = flagBitshiftOffset[stream_number & 0x7U];
  16669. 8007824: 68fb ldr r3, [r7, #12]
  16670. 8007826: f003 0307 and.w r3, r3, #7
  16671. 800782a: 4a24 ldr r2, [pc, #144] @ (80078bc <DMA_CalcBaseAndBitshift+0x15c>)
  16672. 800782c: 5cd3 ldrb r3, [r2, r3]
  16673. 800782e: 461a mov r2, r3
  16674. 8007830: 687b ldr r3, [r7, #4]
  16675. 8007832: 65da str r2, [r3, #92] @ 0x5c
  16676. if (stream_number > 3U)
  16677. 8007834: 68fb ldr r3, [r7, #12]
  16678. 8007836: 2b03 cmp r3, #3
  16679. 8007838: d908 bls.n 800784c <DMA_CalcBaseAndBitshift+0xec>
  16680. {
  16681. /* return pointer to HISR and HIFCR */
  16682. hdma->StreamBaseAddress = (((uint32_t)((uint32_t*)hdma->Instance) & (uint32_t)(~0x3FFU)) + 4U);
  16683. 800783a: 687b ldr r3, [r7, #4]
  16684. 800783c: 681b ldr r3, [r3, #0]
  16685. 800783e: 461a mov r2, r3
  16686. 8007840: 4b1f ldr r3, [pc, #124] @ (80078c0 <DMA_CalcBaseAndBitshift+0x160>)
  16687. 8007842: 4013 ands r3, r2
  16688. 8007844: 1d1a adds r2, r3, #4
  16689. 8007846: 687b ldr r3, [r7, #4]
  16690. 8007848: 659a str r2, [r3, #88] @ 0x58
  16691. 800784a: e00d b.n 8007868 <DMA_CalcBaseAndBitshift+0x108>
  16692. }
  16693. else
  16694. {
  16695. /* return pointer to LISR and LIFCR */
  16696. hdma->StreamBaseAddress = ((uint32_t)((uint32_t*)hdma->Instance) & (uint32_t)(~0x3FFU));
  16697. 800784c: 687b ldr r3, [r7, #4]
  16698. 800784e: 681b ldr r3, [r3, #0]
  16699. 8007850: 461a mov r2, r3
  16700. 8007852: 4b1b ldr r3, [pc, #108] @ (80078c0 <DMA_CalcBaseAndBitshift+0x160>)
  16701. 8007854: 4013 ands r3, r2
  16702. 8007856: 687a ldr r2, [r7, #4]
  16703. 8007858: 6593 str r3, [r2, #88] @ 0x58
  16704. 800785a: e005 b.n 8007868 <DMA_CalcBaseAndBitshift+0x108>
  16705. }
  16706. }
  16707. else /* BDMA instance(s) */
  16708. {
  16709. /* return pointer to ISR and IFCR */
  16710. hdma->StreamBaseAddress = ((uint32_t)((uint32_t*)hdma->Instance) & (uint32_t)(~0xFFU));
  16711. 800785c: 687b ldr r3, [r7, #4]
  16712. 800785e: 681b ldr r3, [r3, #0]
  16713. 8007860: f023 02ff bic.w r2, r3, #255 @ 0xff
  16714. 8007864: 687b ldr r3, [r7, #4]
  16715. 8007866: 659a str r2, [r3, #88] @ 0x58
  16716. }
  16717. return hdma->StreamBaseAddress;
  16718. 8007868: 687b ldr r3, [r7, #4]
  16719. 800786a: 6d9b ldr r3, [r3, #88] @ 0x58
  16720. }
  16721. 800786c: 4618 mov r0, r3
  16722. 800786e: 3714 adds r7, #20
  16723. 8007870: 46bd mov sp, r7
  16724. 8007872: f85d 7b04 ldr.w r7, [sp], #4
  16725. 8007876: 4770 bx lr
  16726. 8007878: 40020010 .word 0x40020010
  16727. 800787c: 40020028 .word 0x40020028
  16728. 8007880: 40020040 .word 0x40020040
  16729. 8007884: 40020058 .word 0x40020058
  16730. 8007888: 40020070 .word 0x40020070
  16731. 800788c: 40020088 .word 0x40020088
  16732. 8007890: 400200a0 .word 0x400200a0
  16733. 8007894: 400200b8 .word 0x400200b8
  16734. 8007898: 40020410 .word 0x40020410
  16735. 800789c: 40020428 .word 0x40020428
  16736. 80078a0: 40020440 .word 0x40020440
  16737. 80078a4: 40020458 .word 0x40020458
  16738. 80078a8: 40020470 .word 0x40020470
  16739. 80078ac: 40020488 .word 0x40020488
  16740. 80078b0: 400204a0 .word 0x400204a0
  16741. 80078b4: 400204b8 .word 0x400204b8
  16742. 80078b8: aaaaaaab .word 0xaaaaaaab
  16743. 80078bc: 08030a34 .word 0x08030a34
  16744. 80078c0: fffffc00 .word 0xfffffc00
  16745. 080078c4 <DMA_CheckFifoParam>:
  16746. * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
  16747. * the configuration information for the specified DMA Stream.
  16748. * @retval HAL status
  16749. */
  16750. static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma)
  16751. {
  16752. 80078c4: b480 push {r7}
  16753. 80078c6: b085 sub sp, #20
  16754. 80078c8: af00 add r7, sp, #0
  16755. 80078ca: 6078 str r0, [r7, #4]
  16756. HAL_StatusTypeDef status = HAL_OK;
  16757. 80078cc: 2300 movs r3, #0
  16758. 80078ce: 73fb strb r3, [r7, #15]
  16759. /* Memory Data size equal to Byte */
  16760. if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_BYTE)
  16761. 80078d0: 687b ldr r3, [r7, #4]
  16762. 80078d2: 699b ldr r3, [r3, #24]
  16763. 80078d4: 2b00 cmp r3, #0
  16764. 80078d6: d120 bne.n 800791a <DMA_CheckFifoParam+0x56>
  16765. {
  16766. switch (hdma->Init.FIFOThreshold)
  16767. 80078d8: 687b ldr r3, [r7, #4]
  16768. 80078da: 6a9b ldr r3, [r3, #40] @ 0x28
  16769. 80078dc: 2b03 cmp r3, #3
  16770. 80078de: d858 bhi.n 8007992 <DMA_CheckFifoParam+0xce>
  16771. 80078e0: a201 add r2, pc, #4 @ (adr r2, 80078e8 <DMA_CheckFifoParam+0x24>)
  16772. 80078e2: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  16773. 80078e6: bf00 nop
  16774. 80078e8: 080078f9 .word 0x080078f9
  16775. 80078ec: 0800790b .word 0x0800790b
  16776. 80078f0: 080078f9 .word 0x080078f9
  16777. 80078f4: 08007993 .word 0x08007993
  16778. {
  16779. case DMA_FIFO_THRESHOLD_1QUARTERFULL:
  16780. case DMA_FIFO_THRESHOLD_3QUARTERSFULL:
  16781. if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1)
  16782. 80078f8: 687b ldr r3, [r7, #4]
  16783. 80078fa: 6adb ldr r3, [r3, #44] @ 0x2c
  16784. 80078fc: f003 7380 and.w r3, r3, #16777216 @ 0x1000000
  16785. 8007900: 2b00 cmp r3, #0
  16786. 8007902: d048 beq.n 8007996 <DMA_CheckFifoParam+0xd2>
  16787. {
  16788. status = HAL_ERROR;
  16789. 8007904: 2301 movs r3, #1
  16790. 8007906: 73fb strb r3, [r7, #15]
  16791. }
  16792. break;
  16793. 8007908: e045 b.n 8007996 <DMA_CheckFifoParam+0xd2>
  16794. case DMA_FIFO_THRESHOLD_HALFFULL:
  16795. if (hdma->Init.MemBurst == DMA_MBURST_INC16)
  16796. 800790a: 687b ldr r3, [r7, #4]
  16797. 800790c: 6adb ldr r3, [r3, #44] @ 0x2c
  16798. 800790e: f1b3 7fc0 cmp.w r3, #25165824 @ 0x1800000
  16799. 8007912: d142 bne.n 800799a <DMA_CheckFifoParam+0xd6>
  16800. {
  16801. status = HAL_ERROR;
  16802. 8007914: 2301 movs r3, #1
  16803. 8007916: 73fb strb r3, [r7, #15]
  16804. }
  16805. break;
  16806. 8007918: e03f b.n 800799a <DMA_CheckFifoParam+0xd6>
  16807. break;
  16808. }
  16809. }
  16810. /* Memory Data size equal to Half-Word */
  16811. else if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)
  16812. 800791a: 687b ldr r3, [r7, #4]
  16813. 800791c: 699b ldr r3, [r3, #24]
  16814. 800791e: f5b3 5f00 cmp.w r3, #8192 @ 0x2000
  16815. 8007922: d123 bne.n 800796c <DMA_CheckFifoParam+0xa8>
  16816. {
  16817. switch (hdma->Init.FIFOThreshold)
  16818. 8007924: 687b ldr r3, [r7, #4]
  16819. 8007926: 6a9b ldr r3, [r3, #40] @ 0x28
  16820. 8007928: 2b03 cmp r3, #3
  16821. 800792a: d838 bhi.n 800799e <DMA_CheckFifoParam+0xda>
  16822. 800792c: a201 add r2, pc, #4 @ (adr r2, 8007934 <DMA_CheckFifoParam+0x70>)
  16823. 800792e: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  16824. 8007932: bf00 nop
  16825. 8007934: 08007945 .word 0x08007945
  16826. 8007938: 0800794b .word 0x0800794b
  16827. 800793c: 08007945 .word 0x08007945
  16828. 8007940: 0800795d .word 0x0800795d
  16829. {
  16830. case DMA_FIFO_THRESHOLD_1QUARTERFULL:
  16831. case DMA_FIFO_THRESHOLD_3QUARTERSFULL:
  16832. status = HAL_ERROR;
  16833. 8007944: 2301 movs r3, #1
  16834. 8007946: 73fb strb r3, [r7, #15]
  16835. break;
  16836. 8007948: e030 b.n 80079ac <DMA_CheckFifoParam+0xe8>
  16837. case DMA_FIFO_THRESHOLD_HALFFULL:
  16838. if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1)
  16839. 800794a: 687b ldr r3, [r7, #4]
  16840. 800794c: 6adb ldr r3, [r3, #44] @ 0x2c
  16841. 800794e: f003 7380 and.w r3, r3, #16777216 @ 0x1000000
  16842. 8007952: 2b00 cmp r3, #0
  16843. 8007954: d025 beq.n 80079a2 <DMA_CheckFifoParam+0xde>
  16844. {
  16845. status = HAL_ERROR;
  16846. 8007956: 2301 movs r3, #1
  16847. 8007958: 73fb strb r3, [r7, #15]
  16848. }
  16849. break;
  16850. 800795a: e022 b.n 80079a2 <DMA_CheckFifoParam+0xde>
  16851. case DMA_FIFO_THRESHOLD_FULL:
  16852. if (hdma->Init.MemBurst == DMA_MBURST_INC16)
  16853. 800795c: 687b ldr r3, [r7, #4]
  16854. 800795e: 6adb ldr r3, [r3, #44] @ 0x2c
  16855. 8007960: f1b3 7fc0 cmp.w r3, #25165824 @ 0x1800000
  16856. 8007964: d11f bne.n 80079a6 <DMA_CheckFifoParam+0xe2>
  16857. {
  16858. status = HAL_ERROR;
  16859. 8007966: 2301 movs r3, #1
  16860. 8007968: 73fb strb r3, [r7, #15]
  16861. }
  16862. break;
  16863. 800796a: e01c b.n 80079a6 <DMA_CheckFifoParam+0xe2>
  16864. }
  16865. /* Memory Data size equal to Word */
  16866. else
  16867. {
  16868. switch (hdma->Init.FIFOThreshold)
  16869. 800796c: 687b ldr r3, [r7, #4]
  16870. 800796e: 6a9b ldr r3, [r3, #40] @ 0x28
  16871. 8007970: 2b02 cmp r3, #2
  16872. 8007972: d902 bls.n 800797a <DMA_CheckFifoParam+0xb6>
  16873. 8007974: 2b03 cmp r3, #3
  16874. 8007976: d003 beq.n 8007980 <DMA_CheckFifoParam+0xbc>
  16875. status = HAL_ERROR;
  16876. }
  16877. break;
  16878. default:
  16879. break;
  16880. 8007978: e018 b.n 80079ac <DMA_CheckFifoParam+0xe8>
  16881. status = HAL_ERROR;
  16882. 800797a: 2301 movs r3, #1
  16883. 800797c: 73fb strb r3, [r7, #15]
  16884. break;
  16885. 800797e: e015 b.n 80079ac <DMA_CheckFifoParam+0xe8>
  16886. if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1)
  16887. 8007980: 687b ldr r3, [r7, #4]
  16888. 8007982: 6adb ldr r3, [r3, #44] @ 0x2c
  16889. 8007984: f003 7380 and.w r3, r3, #16777216 @ 0x1000000
  16890. 8007988: 2b00 cmp r3, #0
  16891. 800798a: d00e beq.n 80079aa <DMA_CheckFifoParam+0xe6>
  16892. status = HAL_ERROR;
  16893. 800798c: 2301 movs r3, #1
  16894. 800798e: 73fb strb r3, [r7, #15]
  16895. break;
  16896. 8007990: e00b b.n 80079aa <DMA_CheckFifoParam+0xe6>
  16897. break;
  16898. 8007992: bf00 nop
  16899. 8007994: e00a b.n 80079ac <DMA_CheckFifoParam+0xe8>
  16900. break;
  16901. 8007996: bf00 nop
  16902. 8007998: e008 b.n 80079ac <DMA_CheckFifoParam+0xe8>
  16903. break;
  16904. 800799a: bf00 nop
  16905. 800799c: e006 b.n 80079ac <DMA_CheckFifoParam+0xe8>
  16906. break;
  16907. 800799e: bf00 nop
  16908. 80079a0: e004 b.n 80079ac <DMA_CheckFifoParam+0xe8>
  16909. break;
  16910. 80079a2: bf00 nop
  16911. 80079a4: e002 b.n 80079ac <DMA_CheckFifoParam+0xe8>
  16912. break;
  16913. 80079a6: bf00 nop
  16914. 80079a8: e000 b.n 80079ac <DMA_CheckFifoParam+0xe8>
  16915. break;
  16916. 80079aa: bf00 nop
  16917. }
  16918. }
  16919. return status;
  16920. 80079ac: 7bfb ldrb r3, [r7, #15]
  16921. }
  16922. 80079ae: 4618 mov r0, r3
  16923. 80079b0: 3714 adds r7, #20
  16924. 80079b2: 46bd mov sp, r7
  16925. 80079b4: f85d 7b04 ldr.w r7, [sp], #4
  16926. 80079b8: 4770 bx lr
  16927. 80079ba: bf00 nop
  16928. 080079bc <DMA_CalcDMAMUXChannelBaseAndMask>:
  16929. * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
  16930. * the configuration information for the specified DMA Stream.
  16931. * @retval HAL status
  16932. */
  16933. static void DMA_CalcDMAMUXChannelBaseAndMask(DMA_HandleTypeDef *hdma)
  16934. {
  16935. 80079bc: b480 push {r7}
  16936. 80079be: b085 sub sp, #20
  16937. 80079c0: af00 add r7, sp, #0
  16938. 80079c2: 6078 str r0, [r7, #4]
  16939. uint32_t stream_number;
  16940. uint32_t stream_baseaddress = (uint32_t)((uint32_t*)hdma->Instance);
  16941. 80079c4: 687b ldr r3, [r7, #4]
  16942. 80079c6: 681b ldr r3, [r3, #0]
  16943. 80079c8: 60bb str r3, [r7, #8]
  16944. if(IS_BDMA_CHANNEL_DMAMUX_INSTANCE(hdma->Instance) != 0U)
  16945. 80079ca: 687b ldr r3, [r7, #4]
  16946. 80079cc: 681b ldr r3, [r3, #0]
  16947. 80079ce: 4a38 ldr r2, [pc, #224] @ (8007ab0 <DMA_CalcDMAMUXChannelBaseAndMask+0xf4>)
  16948. 80079d0: 4293 cmp r3, r2
  16949. 80079d2: d022 beq.n 8007a1a <DMA_CalcDMAMUXChannelBaseAndMask+0x5e>
  16950. 80079d4: 687b ldr r3, [r7, #4]
  16951. 80079d6: 681b ldr r3, [r3, #0]
  16952. 80079d8: 4a36 ldr r2, [pc, #216] @ (8007ab4 <DMA_CalcDMAMUXChannelBaseAndMask+0xf8>)
  16953. 80079da: 4293 cmp r3, r2
  16954. 80079dc: d01d beq.n 8007a1a <DMA_CalcDMAMUXChannelBaseAndMask+0x5e>
  16955. 80079de: 687b ldr r3, [r7, #4]
  16956. 80079e0: 681b ldr r3, [r3, #0]
  16957. 80079e2: 4a35 ldr r2, [pc, #212] @ (8007ab8 <DMA_CalcDMAMUXChannelBaseAndMask+0xfc>)
  16958. 80079e4: 4293 cmp r3, r2
  16959. 80079e6: d018 beq.n 8007a1a <DMA_CalcDMAMUXChannelBaseAndMask+0x5e>
  16960. 80079e8: 687b ldr r3, [r7, #4]
  16961. 80079ea: 681b ldr r3, [r3, #0]
  16962. 80079ec: 4a33 ldr r2, [pc, #204] @ (8007abc <DMA_CalcDMAMUXChannelBaseAndMask+0x100>)
  16963. 80079ee: 4293 cmp r3, r2
  16964. 80079f0: d013 beq.n 8007a1a <DMA_CalcDMAMUXChannelBaseAndMask+0x5e>
  16965. 80079f2: 687b ldr r3, [r7, #4]
  16966. 80079f4: 681b ldr r3, [r3, #0]
  16967. 80079f6: 4a32 ldr r2, [pc, #200] @ (8007ac0 <DMA_CalcDMAMUXChannelBaseAndMask+0x104>)
  16968. 80079f8: 4293 cmp r3, r2
  16969. 80079fa: d00e beq.n 8007a1a <DMA_CalcDMAMUXChannelBaseAndMask+0x5e>
  16970. 80079fc: 687b ldr r3, [r7, #4]
  16971. 80079fe: 681b ldr r3, [r3, #0]
  16972. 8007a00: 4a30 ldr r2, [pc, #192] @ (8007ac4 <DMA_CalcDMAMUXChannelBaseAndMask+0x108>)
  16973. 8007a02: 4293 cmp r3, r2
  16974. 8007a04: d009 beq.n 8007a1a <DMA_CalcDMAMUXChannelBaseAndMask+0x5e>
  16975. 8007a06: 687b ldr r3, [r7, #4]
  16976. 8007a08: 681b ldr r3, [r3, #0]
  16977. 8007a0a: 4a2f ldr r2, [pc, #188] @ (8007ac8 <DMA_CalcDMAMUXChannelBaseAndMask+0x10c>)
  16978. 8007a0c: 4293 cmp r3, r2
  16979. 8007a0e: d004 beq.n 8007a1a <DMA_CalcDMAMUXChannelBaseAndMask+0x5e>
  16980. 8007a10: 687b ldr r3, [r7, #4]
  16981. 8007a12: 681b ldr r3, [r3, #0]
  16982. 8007a14: 4a2d ldr r2, [pc, #180] @ (8007acc <DMA_CalcDMAMUXChannelBaseAndMask+0x110>)
  16983. 8007a16: 4293 cmp r3, r2
  16984. 8007a18: d101 bne.n 8007a1e <DMA_CalcDMAMUXChannelBaseAndMask+0x62>
  16985. 8007a1a: 2301 movs r3, #1
  16986. 8007a1c: e000 b.n 8007a20 <DMA_CalcDMAMUXChannelBaseAndMask+0x64>
  16987. 8007a1e: 2300 movs r3, #0
  16988. 8007a20: 2b00 cmp r3, #0
  16989. 8007a22: d01a beq.n 8007a5a <DMA_CalcDMAMUXChannelBaseAndMask+0x9e>
  16990. {
  16991. /* BDMA Channels are connected to DMAMUX2 channels */
  16992. stream_number = (((uint32_t)((uint32_t*)hdma->Instance) & 0xFFU) - 8U) / 20U;
  16993. 8007a24: 687b ldr r3, [r7, #4]
  16994. 8007a26: 681b ldr r3, [r3, #0]
  16995. 8007a28: b2db uxtb r3, r3
  16996. 8007a2a: 3b08 subs r3, #8
  16997. 8007a2c: 4a28 ldr r2, [pc, #160] @ (8007ad0 <DMA_CalcDMAMUXChannelBaseAndMask+0x114>)
  16998. 8007a2e: fba2 2303 umull r2, r3, r2, r3
  16999. 8007a32: 091b lsrs r3, r3, #4
  17000. 8007a34: 60fb str r3, [r7, #12]
  17001. hdma->DMAmuxChannel = (DMAMUX_Channel_TypeDef *)((uint32_t)(((uint32_t)DMAMUX2_Channel0) + (stream_number * 4U)));
  17002. 8007a36: 68fa ldr r2, [r7, #12]
  17003. 8007a38: 4b26 ldr r3, [pc, #152] @ (8007ad4 <DMA_CalcDMAMUXChannelBaseAndMask+0x118>)
  17004. 8007a3a: 4413 add r3, r2
  17005. 8007a3c: 009b lsls r3, r3, #2
  17006. 8007a3e: 461a mov r2, r3
  17007. 8007a40: 687b ldr r3, [r7, #4]
  17008. 8007a42: 661a str r2, [r3, #96] @ 0x60
  17009. hdma->DMAmuxChannelStatus = DMAMUX2_ChannelStatus;
  17010. 8007a44: 687b ldr r3, [r7, #4]
  17011. 8007a46: 4a24 ldr r2, [pc, #144] @ (8007ad8 <DMA_CalcDMAMUXChannelBaseAndMask+0x11c>)
  17012. 8007a48: 665a str r2, [r3, #100] @ 0x64
  17013. hdma->DMAmuxChannelStatusMask = 1UL << (stream_number & 0x1FU);
  17014. 8007a4a: 68fb ldr r3, [r7, #12]
  17015. 8007a4c: f003 031f and.w r3, r3, #31
  17016. 8007a50: 2201 movs r2, #1
  17017. 8007a52: 409a lsls r2, r3
  17018. 8007a54: 687b ldr r3, [r7, #4]
  17019. 8007a56: 669a str r2, [r3, #104] @ 0x68
  17020. }
  17021. hdma->DMAmuxChannel = (DMAMUX_Channel_TypeDef *)((uint32_t)(((uint32_t)DMAMUX1_Channel0) + (stream_number * 4U)));
  17022. hdma->DMAmuxChannelStatus = DMAMUX1_ChannelStatus;
  17023. hdma->DMAmuxChannelStatusMask = 1UL << (stream_number & 0x1FU);
  17024. }
  17025. }
  17026. 8007a58: e024 b.n 8007aa4 <DMA_CalcDMAMUXChannelBaseAndMask+0xe8>
  17027. stream_number = (((uint32_t)((uint32_t*)hdma->Instance) & 0xFFU) - 16U) / 24U;
  17028. 8007a5a: 687b ldr r3, [r7, #4]
  17029. 8007a5c: 681b ldr r3, [r3, #0]
  17030. 8007a5e: b2db uxtb r3, r3
  17031. 8007a60: 3b10 subs r3, #16
  17032. 8007a62: 4a1e ldr r2, [pc, #120] @ (8007adc <DMA_CalcDMAMUXChannelBaseAndMask+0x120>)
  17033. 8007a64: fba2 2303 umull r2, r3, r2, r3
  17034. 8007a68: 091b lsrs r3, r3, #4
  17035. 8007a6a: 60fb str r3, [r7, #12]
  17036. if((stream_baseaddress <= ((uint32_t)DMA2_Stream7) ) && \
  17037. 8007a6c: 68bb ldr r3, [r7, #8]
  17038. 8007a6e: 4a1c ldr r2, [pc, #112] @ (8007ae0 <DMA_CalcDMAMUXChannelBaseAndMask+0x124>)
  17039. 8007a70: 4293 cmp r3, r2
  17040. 8007a72: d806 bhi.n 8007a82 <DMA_CalcDMAMUXChannelBaseAndMask+0xc6>
  17041. 8007a74: 68bb ldr r3, [r7, #8]
  17042. 8007a76: 4a1b ldr r2, [pc, #108] @ (8007ae4 <DMA_CalcDMAMUXChannelBaseAndMask+0x128>)
  17043. 8007a78: 4293 cmp r3, r2
  17044. 8007a7a: d902 bls.n 8007a82 <DMA_CalcDMAMUXChannelBaseAndMask+0xc6>
  17045. stream_number += 8U;
  17046. 8007a7c: 68fb ldr r3, [r7, #12]
  17047. 8007a7e: 3308 adds r3, #8
  17048. 8007a80: 60fb str r3, [r7, #12]
  17049. hdma->DMAmuxChannel = (DMAMUX_Channel_TypeDef *)((uint32_t)(((uint32_t)DMAMUX1_Channel0) + (stream_number * 4U)));
  17050. 8007a82: 68fa ldr r2, [r7, #12]
  17051. 8007a84: 4b18 ldr r3, [pc, #96] @ (8007ae8 <DMA_CalcDMAMUXChannelBaseAndMask+0x12c>)
  17052. 8007a86: 4413 add r3, r2
  17053. 8007a88: 009b lsls r3, r3, #2
  17054. 8007a8a: 461a mov r2, r3
  17055. 8007a8c: 687b ldr r3, [r7, #4]
  17056. 8007a8e: 661a str r2, [r3, #96] @ 0x60
  17057. hdma->DMAmuxChannelStatus = DMAMUX1_ChannelStatus;
  17058. 8007a90: 687b ldr r3, [r7, #4]
  17059. 8007a92: 4a16 ldr r2, [pc, #88] @ (8007aec <DMA_CalcDMAMUXChannelBaseAndMask+0x130>)
  17060. 8007a94: 665a str r2, [r3, #100] @ 0x64
  17061. hdma->DMAmuxChannelStatusMask = 1UL << (stream_number & 0x1FU);
  17062. 8007a96: 68fb ldr r3, [r7, #12]
  17063. 8007a98: f003 031f and.w r3, r3, #31
  17064. 8007a9c: 2201 movs r2, #1
  17065. 8007a9e: 409a lsls r2, r3
  17066. 8007aa0: 687b ldr r3, [r7, #4]
  17067. 8007aa2: 669a str r2, [r3, #104] @ 0x68
  17068. }
  17069. 8007aa4: bf00 nop
  17070. 8007aa6: 3714 adds r7, #20
  17071. 8007aa8: 46bd mov sp, r7
  17072. 8007aaa: f85d 7b04 ldr.w r7, [sp], #4
  17073. 8007aae: 4770 bx lr
  17074. 8007ab0: 58025408 .word 0x58025408
  17075. 8007ab4: 5802541c .word 0x5802541c
  17076. 8007ab8: 58025430 .word 0x58025430
  17077. 8007abc: 58025444 .word 0x58025444
  17078. 8007ac0: 58025458 .word 0x58025458
  17079. 8007ac4: 5802546c .word 0x5802546c
  17080. 8007ac8: 58025480 .word 0x58025480
  17081. 8007acc: 58025494 .word 0x58025494
  17082. 8007ad0: cccccccd .word 0xcccccccd
  17083. 8007ad4: 16009600 .word 0x16009600
  17084. 8007ad8: 58025880 .word 0x58025880
  17085. 8007adc: aaaaaaab .word 0xaaaaaaab
  17086. 8007ae0: 400204b8 .word 0x400204b8
  17087. 8007ae4: 4002040f .word 0x4002040f
  17088. 8007ae8: 10008200 .word 0x10008200
  17089. 8007aec: 40020880 .word 0x40020880
  17090. 08007af0 <DMA_CalcDMAMUXRequestGenBaseAndMask>:
  17091. * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
  17092. * the configuration information for the specified DMA Stream.
  17093. * @retval HAL status
  17094. */
  17095. static void DMA_CalcDMAMUXRequestGenBaseAndMask(DMA_HandleTypeDef *hdma)
  17096. {
  17097. 8007af0: b480 push {r7}
  17098. 8007af2: b085 sub sp, #20
  17099. 8007af4: af00 add r7, sp, #0
  17100. 8007af6: 6078 str r0, [r7, #4]
  17101. uint32_t request = hdma->Init.Request & DMAMUX_CxCR_DMAREQ_ID;
  17102. 8007af8: 687b ldr r3, [r7, #4]
  17103. 8007afa: 685b ldr r3, [r3, #4]
  17104. 8007afc: b2db uxtb r3, r3
  17105. 8007afe: 60fb str r3, [r7, #12]
  17106. if((request >= DMA_REQUEST_GENERATOR0) && (request <= DMA_REQUEST_GENERATOR7))
  17107. 8007b00: 68fb ldr r3, [r7, #12]
  17108. 8007b02: 2b00 cmp r3, #0
  17109. 8007b04: d04a beq.n 8007b9c <DMA_CalcDMAMUXRequestGenBaseAndMask+0xac>
  17110. 8007b06: 68fb ldr r3, [r7, #12]
  17111. 8007b08: 2b08 cmp r3, #8
  17112. 8007b0a: d847 bhi.n 8007b9c <DMA_CalcDMAMUXRequestGenBaseAndMask+0xac>
  17113. {
  17114. if(IS_BDMA_CHANNEL_DMAMUX_INSTANCE(hdma->Instance) != 0U)
  17115. 8007b0c: 687b ldr r3, [r7, #4]
  17116. 8007b0e: 681b ldr r3, [r3, #0]
  17117. 8007b10: 4a25 ldr r2, [pc, #148] @ (8007ba8 <DMA_CalcDMAMUXRequestGenBaseAndMask+0xb8>)
  17118. 8007b12: 4293 cmp r3, r2
  17119. 8007b14: d022 beq.n 8007b5c <DMA_CalcDMAMUXRequestGenBaseAndMask+0x6c>
  17120. 8007b16: 687b ldr r3, [r7, #4]
  17121. 8007b18: 681b ldr r3, [r3, #0]
  17122. 8007b1a: 4a24 ldr r2, [pc, #144] @ (8007bac <DMA_CalcDMAMUXRequestGenBaseAndMask+0xbc>)
  17123. 8007b1c: 4293 cmp r3, r2
  17124. 8007b1e: d01d beq.n 8007b5c <DMA_CalcDMAMUXRequestGenBaseAndMask+0x6c>
  17125. 8007b20: 687b ldr r3, [r7, #4]
  17126. 8007b22: 681b ldr r3, [r3, #0]
  17127. 8007b24: 4a22 ldr r2, [pc, #136] @ (8007bb0 <DMA_CalcDMAMUXRequestGenBaseAndMask+0xc0>)
  17128. 8007b26: 4293 cmp r3, r2
  17129. 8007b28: d018 beq.n 8007b5c <DMA_CalcDMAMUXRequestGenBaseAndMask+0x6c>
  17130. 8007b2a: 687b ldr r3, [r7, #4]
  17131. 8007b2c: 681b ldr r3, [r3, #0]
  17132. 8007b2e: 4a21 ldr r2, [pc, #132] @ (8007bb4 <DMA_CalcDMAMUXRequestGenBaseAndMask+0xc4>)
  17133. 8007b30: 4293 cmp r3, r2
  17134. 8007b32: d013 beq.n 8007b5c <DMA_CalcDMAMUXRequestGenBaseAndMask+0x6c>
  17135. 8007b34: 687b ldr r3, [r7, #4]
  17136. 8007b36: 681b ldr r3, [r3, #0]
  17137. 8007b38: 4a1f ldr r2, [pc, #124] @ (8007bb8 <DMA_CalcDMAMUXRequestGenBaseAndMask+0xc8>)
  17138. 8007b3a: 4293 cmp r3, r2
  17139. 8007b3c: d00e beq.n 8007b5c <DMA_CalcDMAMUXRequestGenBaseAndMask+0x6c>
  17140. 8007b3e: 687b ldr r3, [r7, #4]
  17141. 8007b40: 681b ldr r3, [r3, #0]
  17142. 8007b42: 4a1e ldr r2, [pc, #120] @ (8007bbc <DMA_CalcDMAMUXRequestGenBaseAndMask+0xcc>)
  17143. 8007b44: 4293 cmp r3, r2
  17144. 8007b46: d009 beq.n 8007b5c <DMA_CalcDMAMUXRequestGenBaseAndMask+0x6c>
  17145. 8007b48: 687b ldr r3, [r7, #4]
  17146. 8007b4a: 681b ldr r3, [r3, #0]
  17147. 8007b4c: 4a1c ldr r2, [pc, #112] @ (8007bc0 <DMA_CalcDMAMUXRequestGenBaseAndMask+0xd0>)
  17148. 8007b4e: 4293 cmp r3, r2
  17149. 8007b50: d004 beq.n 8007b5c <DMA_CalcDMAMUXRequestGenBaseAndMask+0x6c>
  17150. 8007b52: 687b ldr r3, [r7, #4]
  17151. 8007b54: 681b ldr r3, [r3, #0]
  17152. 8007b56: 4a1b ldr r2, [pc, #108] @ (8007bc4 <DMA_CalcDMAMUXRequestGenBaseAndMask+0xd4>)
  17153. 8007b58: 4293 cmp r3, r2
  17154. 8007b5a: d101 bne.n 8007b60 <DMA_CalcDMAMUXRequestGenBaseAndMask+0x70>
  17155. 8007b5c: 2301 movs r3, #1
  17156. 8007b5e: e000 b.n 8007b62 <DMA_CalcDMAMUXRequestGenBaseAndMask+0x72>
  17157. 8007b60: 2300 movs r3, #0
  17158. 8007b62: 2b00 cmp r3, #0
  17159. 8007b64: d00a beq.n 8007b7c <DMA_CalcDMAMUXRequestGenBaseAndMask+0x8c>
  17160. {
  17161. /* BDMA Channels are connected to DMAMUX2 request generator blocks */
  17162. hdma->DMAmuxRequestGen = (DMAMUX_RequestGen_TypeDef *)((uint32_t)(((uint32_t)DMAMUX2_RequestGenerator0) + ((request - 1U) * 4U)));
  17163. 8007b66: 68fa ldr r2, [r7, #12]
  17164. 8007b68: 4b17 ldr r3, [pc, #92] @ (8007bc8 <DMA_CalcDMAMUXRequestGenBaseAndMask+0xd8>)
  17165. 8007b6a: 4413 add r3, r2
  17166. 8007b6c: 009b lsls r3, r3, #2
  17167. 8007b6e: 461a mov r2, r3
  17168. 8007b70: 687b ldr r3, [r7, #4]
  17169. 8007b72: 66da str r2, [r3, #108] @ 0x6c
  17170. hdma->DMAmuxRequestGenStatus = DMAMUX2_RequestGenStatus;
  17171. 8007b74: 687b ldr r3, [r7, #4]
  17172. 8007b76: 4a15 ldr r2, [pc, #84] @ (8007bcc <DMA_CalcDMAMUXRequestGenBaseAndMask+0xdc>)
  17173. 8007b78: 671a str r2, [r3, #112] @ 0x70
  17174. 8007b7a: e009 b.n 8007b90 <DMA_CalcDMAMUXRequestGenBaseAndMask+0xa0>
  17175. }
  17176. else
  17177. {
  17178. /* DMA1 and DMA2 Streams use DMAMUX1 request generator blocks */
  17179. hdma->DMAmuxRequestGen = (DMAMUX_RequestGen_TypeDef *)((uint32_t)(((uint32_t)DMAMUX1_RequestGenerator0) + ((request - 1U) * 4U)));
  17180. 8007b7c: 68fa ldr r2, [r7, #12]
  17181. 8007b7e: 4b14 ldr r3, [pc, #80] @ (8007bd0 <DMA_CalcDMAMUXRequestGenBaseAndMask+0xe0>)
  17182. 8007b80: 4413 add r3, r2
  17183. 8007b82: 009b lsls r3, r3, #2
  17184. 8007b84: 461a mov r2, r3
  17185. 8007b86: 687b ldr r3, [r7, #4]
  17186. 8007b88: 66da str r2, [r3, #108] @ 0x6c
  17187. hdma->DMAmuxRequestGenStatus = DMAMUX1_RequestGenStatus;
  17188. 8007b8a: 687b ldr r3, [r7, #4]
  17189. 8007b8c: 4a11 ldr r2, [pc, #68] @ (8007bd4 <DMA_CalcDMAMUXRequestGenBaseAndMask+0xe4>)
  17190. 8007b8e: 671a str r2, [r3, #112] @ 0x70
  17191. }
  17192. hdma->DMAmuxRequestGenStatusMask = 1UL << (request - 1U);
  17193. 8007b90: 68fb ldr r3, [r7, #12]
  17194. 8007b92: 3b01 subs r3, #1
  17195. 8007b94: 2201 movs r2, #1
  17196. 8007b96: 409a lsls r2, r3
  17197. 8007b98: 687b ldr r3, [r7, #4]
  17198. 8007b9a: 675a str r2, [r3, #116] @ 0x74
  17199. }
  17200. }
  17201. 8007b9c: bf00 nop
  17202. 8007b9e: 3714 adds r7, #20
  17203. 8007ba0: 46bd mov sp, r7
  17204. 8007ba2: f85d 7b04 ldr.w r7, [sp], #4
  17205. 8007ba6: 4770 bx lr
  17206. 8007ba8: 58025408 .word 0x58025408
  17207. 8007bac: 5802541c .word 0x5802541c
  17208. 8007bb0: 58025430 .word 0x58025430
  17209. 8007bb4: 58025444 .word 0x58025444
  17210. 8007bb8: 58025458 .word 0x58025458
  17211. 8007bbc: 5802546c .word 0x5802546c
  17212. 8007bc0: 58025480 .word 0x58025480
  17213. 8007bc4: 58025494 .word 0x58025494
  17214. 8007bc8: 1600963f .word 0x1600963f
  17215. 8007bcc: 58025940 .word 0x58025940
  17216. 8007bd0: 1000823f .word 0x1000823f
  17217. 8007bd4: 40020940 .word 0x40020940
  17218. 08007bd8 <HAL_ETH_Init>:
  17219. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  17220. * the configuration information for ETHERNET module
  17221. * @retval HAL status
  17222. */
  17223. HAL_StatusTypeDef HAL_ETH_Init(ETH_HandleTypeDef *heth)
  17224. {
  17225. 8007bd8: b580 push {r7, lr}
  17226. 8007bda: b084 sub sp, #16
  17227. 8007bdc: af00 add r7, sp, #0
  17228. 8007bde: 6078 str r0, [r7, #4]
  17229. uint32_t tickstart;
  17230. if (heth == NULL)
  17231. 8007be0: 687b ldr r3, [r7, #4]
  17232. 8007be2: 2b00 cmp r3, #0
  17233. 8007be4: d101 bne.n 8007bea <HAL_ETH_Init+0x12>
  17234. {
  17235. return HAL_ERROR;
  17236. 8007be6: 2301 movs r3, #1
  17237. 8007be8: e0e3 b.n 8007db2 <HAL_ETH_Init+0x1da>
  17238. }
  17239. if (heth->gState == HAL_ETH_STATE_RESET)
  17240. 8007bea: 687b ldr r3, [r7, #4]
  17241. 8007bec: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  17242. 8007bf0: 2b00 cmp r3, #0
  17243. 8007bf2: d106 bne.n 8007c02 <HAL_ETH_Init+0x2a>
  17244. {
  17245. heth->gState = HAL_ETH_STATE_BUSY;
  17246. 8007bf4: 687b ldr r3, [r7, #4]
  17247. 8007bf6: 2223 movs r2, #35 @ 0x23
  17248. 8007bf8: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  17249. /* Init the low level hardware */
  17250. heth->MspInitCallback(heth);
  17251. #else
  17252. /* Init the low level hardware : GPIO, CLOCK, NVIC. */
  17253. HAL_ETH_MspInit(heth);
  17254. 8007bfc: 6878 ldr r0, [r7, #4]
  17255. 8007bfe: f008 fa03 bl 8010008 <HAL_ETH_MspInit>
  17256. #endif /* (USE_HAL_ETH_REGISTER_CALLBACKS) */
  17257. }
  17258. __HAL_RCC_SYSCFG_CLK_ENABLE();
  17259. 8007c02: 4b6e ldr r3, [pc, #440] @ (8007dbc <HAL_ETH_Init+0x1e4>)
  17260. 8007c04: f8d3 30f4 ldr.w r3, [r3, #244] @ 0xf4
  17261. 8007c08: 4a6c ldr r2, [pc, #432] @ (8007dbc <HAL_ETH_Init+0x1e4>)
  17262. 8007c0a: f043 0302 orr.w r3, r3, #2
  17263. 8007c0e: f8c2 30f4 str.w r3, [r2, #244] @ 0xf4
  17264. 8007c12: 4b6a ldr r3, [pc, #424] @ (8007dbc <HAL_ETH_Init+0x1e4>)
  17265. 8007c14: f8d3 30f4 ldr.w r3, [r3, #244] @ 0xf4
  17266. 8007c18: f003 0302 and.w r3, r3, #2
  17267. 8007c1c: 60bb str r3, [r7, #8]
  17268. 8007c1e: 68bb ldr r3, [r7, #8]
  17269. if (heth->Init.MediaInterface == HAL_ETH_MII_MODE)
  17270. 8007c20: 687b ldr r3, [r7, #4]
  17271. 8007c22: 7a1b ldrb r3, [r3, #8]
  17272. 8007c24: 2b00 cmp r3, #0
  17273. 8007c26: d103 bne.n 8007c30 <HAL_ETH_Init+0x58>
  17274. {
  17275. HAL_SYSCFG_ETHInterfaceSelect(SYSCFG_ETH_MII);
  17276. 8007c28: 2000 movs r0, #0
  17277. 8007c2a: f7fd fa3d bl 80050a8 <HAL_SYSCFG_ETHInterfaceSelect>
  17278. 8007c2e: e003 b.n 8007c38 <HAL_ETH_Init+0x60>
  17279. }
  17280. else
  17281. {
  17282. HAL_SYSCFG_ETHInterfaceSelect(SYSCFG_ETH_RMII);
  17283. 8007c30: f44f 0000 mov.w r0, #8388608 @ 0x800000
  17284. 8007c34: f7fd fa38 bl 80050a8 <HAL_SYSCFG_ETHInterfaceSelect>
  17285. }
  17286. /* Dummy read to sync with ETH */
  17287. (void)SYSCFG->PMCR;
  17288. 8007c38: 4b61 ldr r3, [pc, #388] @ (8007dc0 <HAL_ETH_Init+0x1e8>)
  17289. 8007c3a: 685b ldr r3, [r3, #4]
  17290. /* Ethernet Software reset */
  17291. /* Set the SWR bit: resets all MAC subsystem internal registers and logic */
  17292. /* After reset all the registers holds their respective reset values */
  17293. SET_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR);
  17294. 8007c3c: 687b ldr r3, [r7, #4]
  17295. 8007c3e: 681b ldr r3, [r3, #0]
  17296. 8007c40: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17297. 8007c44: 681b ldr r3, [r3, #0]
  17298. 8007c46: 687a ldr r2, [r7, #4]
  17299. 8007c48: 6812 ldr r2, [r2, #0]
  17300. 8007c4a: f043 0301 orr.w r3, r3, #1
  17301. 8007c4e: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17302. 8007c52: 6013 str r3, [r2, #0]
  17303. /* Get tick */
  17304. tickstart = HAL_GetTick();
  17305. 8007c54: f7fd f9ec bl 8005030 <HAL_GetTick>
  17306. 8007c58: 60f8 str r0, [r7, #12]
  17307. /* Wait for software reset */
  17308. while (READ_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR) > 0U)
  17309. 8007c5a: e011 b.n 8007c80 <HAL_ETH_Init+0xa8>
  17310. {
  17311. if (((HAL_GetTick() - tickstart) > ETH_SWRESET_TIMEOUT))
  17312. 8007c5c: f7fd f9e8 bl 8005030 <HAL_GetTick>
  17313. 8007c60: 4602 mov r2, r0
  17314. 8007c62: 68fb ldr r3, [r7, #12]
  17315. 8007c64: 1ad3 subs r3, r2, r3
  17316. 8007c66: f5b3 7ffa cmp.w r3, #500 @ 0x1f4
  17317. 8007c6a: d909 bls.n 8007c80 <HAL_ETH_Init+0xa8>
  17318. {
  17319. /* Set Error Code */
  17320. heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT;
  17321. 8007c6c: 687b ldr r3, [r7, #4]
  17322. 8007c6e: 2204 movs r2, #4
  17323. 8007c70: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  17324. /* Set State as Error */
  17325. heth->gState = HAL_ETH_STATE_ERROR;
  17326. 8007c74: 687b ldr r3, [r7, #4]
  17327. 8007c76: 22e0 movs r2, #224 @ 0xe0
  17328. 8007c78: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  17329. /* Return Error */
  17330. return HAL_ERROR;
  17331. 8007c7c: 2301 movs r3, #1
  17332. 8007c7e: e098 b.n 8007db2 <HAL_ETH_Init+0x1da>
  17333. while (READ_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR) > 0U)
  17334. 8007c80: 687b ldr r3, [r7, #4]
  17335. 8007c82: 681b ldr r3, [r3, #0]
  17336. 8007c84: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17337. 8007c88: 681b ldr r3, [r3, #0]
  17338. 8007c8a: f003 0301 and.w r3, r3, #1
  17339. 8007c8e: 2b00 cmp r3, #0
  17340. 8007c90: d1e4 bne.n 8007c5c <HAL_ETH_Init+0x84>
  17341. }
  17342. }
  17343. /*------------------ MDIO CSR Clock Range Configuration --------------------*/
  17344. HAL_ETH_SetMDIOClockRange(heth);
  17345. 8007c92: 6878 ldr r0, [r7, #4]
  17346. 8007c94: f000 ff1c bl 8008ad0 <HAL_ETH_SetMDIOClockRange>
  17347. /*------------------ MAC LPI 1US Tic Counter Configuration --------------------*/
  17348. WRITE_REG(heth->Instance->MAC1USTCR, (((uint32_t)HAL_RCC_GetHCLKFreq() / ETH_MAC_US_TICK) - 1U));
  17349. 8007c98: f002 fe88 bl 800a9ac <HAL_RCC_GetHCLKFreq>
  17350. 8007c9c: 4603 mov r3, r0
  17351. 8007c9e: 4a49 ldr r2, [pc, #292] @ (8007dc4 <HAL_ETH_Init+0x1ec>)
  17352. 8007ca0: fba2 2303 umull r2, r3, r2, r3
  17353. 8007ca4: 0c9a lsrs r2, r3, #18
  17354. 8007ca6: 687b ldr r3, [r7, #4]
  17355. 8007ca8: 681b ldr r3, [r3, #0]
  17356. 8007caa: 3a01 subs r2, #1
  17357. 8007cac: f8c3 20dc str.w r2, [r3, #220] @ 0xdc
  17358. /*------------------ MAC, MTL and DMA default Configuration ----------------*/
  17359. ETH_MACDMAConfig(heth);
  17360. 8007cb0: 6878 ldr r0, [r7, #4]
  17361. 8007cb2: f001 f90d bl 8008ed0 <ETH_MACDMAConfig>
  17362. /* SET DSL to 64 bit */
  17363. MODIFY_REG(heth->Instance->DMACCR, ETH_DMACCR_DSL, ETH_DMACCR_DSL_64BIT);
  17364. 8007cb6: 687b ldr r3, [r7, #4]
  17365. 8007cb8: 681b ldr r3, [r3, #0]
  17366. 8007cba: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17367. 8007cbe: f8d3 3100 ldr.w r3, [r3, #256] @ 0x100
  17368. 8007cc2: f423 13e0 bic.w r3, r3, #1835008 @ 0x1c0000
  17369. 8007cc6: 687a ldr r2, [r7, #4]
  17370. 8007cc8: 6812 ldr r2, [r2, #0]
  17371. 8007cca: f443 2300 orr.w r3, r3, #524288 @ 0x80000
  17372. 8007cce: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17373. 8007cd2: f8c2 3100 str.w r3, [r2, #256] @ 0x100
  17374. /* Set Receive Buffers Length (must be a multiple of 4) */
  17375. if ((heth->Init.RxBuffLen % 0x4U) != 0x0U)
  17376. 8007cd6: 687b ldr r3, [r7, #4]
  17377. 8007cd8: 695b ldr r3, [r3, #20]
  17378. 8007cda: f003 0303 and.w r3, r3, #3
  17379. 8007cde: 2b00 cmp r3, #0
  17380. 8007ce0: d009 beq.n 8007cf6 <HAL_ETH_Init+0x11e>
  17381. {
  17382. /* Set Error Code */
  17383. heth->ErrorCode = HAL_ETH_ERROR_PARAM;
  17384. 8007ce2: 687b ldr r3, [r7, #4]
  17385. 8007ce4: 2201 movs r2, #1
  17386. 8007ce6: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  17387. /* Set State as Error */
  17388. heth->gState = HAL_ETH_STATE_ERROR;
  17389. 8007cea: 687b ldr r3, [r7, #4]
  17390. 8007cec: 22e0 movs r2, #224 @ 0xe0
  17391. 8007cee: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  17392. /* Return Error */
  17393. return HAL_ERROR;
  17394. 8007cf2: 2301 movs r3, #1
  17395. 8007cf4: e05d b.n 8007db2 <HAL_ETH_Init+0x1da>
  17396. }
  17397. else
  17398. {
  17399. MODIFY_REG(heth->Instance->DMACRCR, ETH_DMACRCR_RBSZ, ((heth->Init.RxBuffLen) << 1));
  17400. 8007cf6: 687b ldr r3, [r7, #4]
  17401. 8007cf8: 681b ldr r3, [r3, #0]
  17402. 8007cfa: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17403. 8007cfe: f8d3 2108 ldr.w r2, [r3, #264] @ 0x108
  17404. 8007d02: 4b31 ldr r3, [pc, #196] @ (8007dc8 <HAL_ETH_Init+0x1f0>)
  17405. 8007d04: 4013 ands r3, r2
  17406. 8007d06: 687a ldr r2, [r7, #4]
  17407. 8007d08: 6952 ldr r2, [r2, #20]
  17408. 8007d0a: 0051 lsls r1, r2, #1
  17409. 8007d0c: 687a ldr r2, [r7, #4]
  17410. 8007d0e: 6812 ldr r2, [r2, #0]
  17411. 8007d10: 430b orrs r3, r1
  17412. 8007d12: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17413. 8007d16: f8c2 3108 str.w r3, [r2, #264] @ 0x108
  17414. }
  17415. /*------------------ DMA Tx Descriptors Configuration ----------------------*/
  17416. ETH_DMATxDescListInit(heth);
  17417. 8007d1a: 6878 ldr r0, [r7, #4]
  17418. 8007d1c: f001 f975 bl 800900a <ETH_DMATxDescListInit>
  17419. /*------------------ DMA Rx Descriptors Configuration ----------------------*/
  17420. ETH_DMARxDescListInit(heth);
  17421. 8007d20: 6878 ldr r0, [r7, #4]
  17422. 8007d22: f001 f9bb bl 800909c <ETH_DMARxDescListInit>
  17423. /*--------------------- ETHERNET MAC Address Configuration ------------------*/
  17424. /* Set MAC addr bits 32 to 47 */
  17425. heth->Instance->MACA0HR = (((uint32_t)(heth->Init.MACAddr[5]) << 8) | (uint32_t)heth->Init.MACAddr[4]);
  17426. 8007d26: 687b ldr r3, [r7, #4]
  17427. 8007d28: 685b ldr r3, [r3, #4]
  17428. 8007d2a: 3305 adds r3, #5
  17429. 8007d2c: 781b ldrb r3, [r3, #0]
  17430. 8007d2e: 021a lsls r2, r3, #8
  17431. 8007d30: 687b ldr r3, [r7, #4]
  17432. 8007d32: 685b ldr r3, [r3, #4]
  17433. 8007d34: 3304 adds r3, #4
  17434. 8007d36: 781b ldrb r3, [r3, #0]
  17435. 8007d38: 4619 mov r1, r3
  17436. 8007d3a: 687b ldr r3, [r7, #4]
  17437. 8007d3c: 681b ldr r3, [r3, #0]
  17438. 8007d3e: 430a orrs r2, r1
  17439. 8007d40: f8c3 2300 str.w r2, [r3, #768] @ 0x300
  17440. /* Set MAC addr bits 0 to 31 */
  17441. heth->Instance->MACA0LR = (((uint32_t)(heth->Init.MACAddr[3]) << 24) | ((uint32_t)(heth->Init.MACAddr[2]) << 16) |
  17442. 8007d44: 687b ldr r3, [r7, #4]
  17443. 8007d46: 685b ldr r3, [r3, #4]
  17444. 8007d48: 3303 adds r3, #3
  17445. 8007d4a: 781b ldrb r3, [r3, #0]
  17446. 8007d4c: 061a lsls r2, r3, #24
  17447. 8007d4e: 687b ldr r3, [r7, #4]
  17448. 8007d50: 685b ldr r3, [r3, #4]
  17449. 8007d52: 3302 adds r3, #2
  17450. 8007d54: 781b ldrb r3, [r3, #0]
  17451. 8007d56: 041b lsls r3, r3, #16
  17452. 8007d58: 431a orrs r2, r3
  17453. ((uint32_t)(heth->Init.MACAddr[1]) << 8) | (uint32_t)heth->Init.MACAddr[0]);
  17454. 8007d5a: 687b ldr r3, [r7, #4]
  17455. 8007d5c: 685b ldr r3, [r3, #4]
  17456. 8007d5e: 3301 adds r3, #1
  17457. 8007d60: 781b ldrb r3, [r3, #0]
  17458. 8007d62: 021b lsls r3, r3, #8
  17459. heth->Instance->MACA0LR = (((uint32_t)(heth->Init.MACAddr[3]) << 24) | ((uint32_t)(heth->Init.MACAddr[2]) << 16) |
  17460. 8007d64: 431a orrs r2, r3
  17461. ((uint32_t)(heth->Init.MACAddr[1]) << 8) | (uint32_t)heth->Init.MACAddr[0]);
  17462. 8007d66: 687b ldr r3, [r7, #4]
  17463. 8007d68: 685b ldr r3, [r3, #4]
  17464. 8007d6a: 781b ldrb r3, [r3, #0]
  17465. 8007d6c: 4619 mov r1, r3
  17466. heth->Instance->MACA0LR = (((uint32_t)(heth->Init.MACAddr[3]) << 24) | ((uint32_t)(heth->Init.MACAddr[2]) << 16) |
  17467. 8007d6e: 687b ldr r3, [r7, #4]
  17468. 8007d70: 681b ldr r3, [r3, #0]
  17469. ((uint32_t)(heth->Init.MACAddr[1]) << 8) | (uint32_t)heth->Init.MACAddr[0]);
  17470. 8007d72: 430a orrs r2, r1
  17471. heth->Instance->MACA0LR = (((uint32_t)(heth->Init.MACAddr[3]) << 24) | ((uint32_t)(heth->Init.MACAddr[2]) << 16) |
  17472. 8007d74: f8c3 2304 str.w r2, [r3, #772] @ 0x304
  17473. /* Disable Rx MMC Interrupts */
  17474. SET_BIT(heth->Instance->MMCRIMR, ETH_MMCRIMR_RXLPITRCIM | ETH_MMCRIMR_RXLPIUSCIM | \
  17475. 8007d78: 687b ldr r3, [r7, #4]
  17476. 8007d7a: 681b ldr r3, [r3, #0]
  17477. 8007d7c: f8d3 170c ldr.w r1, [r3, #1804] @ 0x70c
  17478. 8007d80: 687b ldr r3, [r7, #4]
  17479. 8007d82: 681a ldr r2, [r3, #0]
  17480. 8007d84: 4b11 ldr r3, [pc, #68] @ (8007dcc <HAL_ETH_Init+0x1f4>)
  17481. 8007d86: 430b orrs r3, r1
  17482. 8007d88: f8c2 370c str.w r3, [r2, #1804] @ 0x70c
  17483. ETH_MMCRIMR_RXUCGPIM | ETH_MMCRIMR_RXALGNERPIM | ETH_MMCRIMR_RXCRCERPIM);
  17484. /* Disable Tx MMC Interrupts */
  17485. SET_BIT(heth->Instance->MMCTIMR, ETH_MMCTIMR_TXLPITRCIM | ETH_MMCTIMR_TXLPIUSCIM | \
  17486. 8007d8c: 687b ldr r3, [r7, #4]
  17487. 8007d8e: 681b ldr r3, [r3, #0]
  17488. 8007d90: f8d3 1710 ldr.w r1, [r3, #1808] @ 0x710
  17489. 8007d94: 687b ldr r3, [r7, #4]
  17490. 8007d96: 681a ldr r2, [r3, #0]
  17491. 8007d98: 4b0d ldr r3, [pc, #52] @ (8007dd0 <HAL_ETH_Init+0x1f8>)
  17492. 8007d9a: 430b orrs r3, r1
  17493. 8007d9c: f8c2 3710 str.w r3, [r2, #1808] @ 0x710
  17494. ETH_MMCTIMR_TXGPKTIM | ETH_MMCTIMR_TXMCOLGPIM | ETH_MMCTIMR_TXSCOLGPIM);
  17495. heth->ErrorCode = HAL_ETH_ERROR_NONE;
  17496. 8007da0: 687b ldr r3, [r7, #4]
  17497. 8007da2: 2200 movs r2, #0
  17498. 8007da4: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  17499. heth->gState = HAL_ETH_STATE_READY;
  17500. 8007da8: 687b ldr r3, [r7, #4]
  17501. 8007daa: 2210 movs r2, #16
  17502. 8007dac: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  17503. return HAL_OK;
  17504. 8007db0: 2300 movs r3, #0
  17505. }
  17506. 8007db2: 4618 mov r0, r3
  17507. 8007db4: 3710 adds r7, #16
  17508. 8007db6: 46bd mov sp, r7
  17509. 8007db8: bd80 pop {r7, pc}
  17510. 8007dba: bf00 nop
  17511. 8007dbc: 58024400 .word 0x58024400
  17512. 8007dc0: 58000400 .word 0x58000400
  17513. 8007dc4: 431bde83 .word 0x431bde83
  17514. 8007dc8: ffff8001 .word 0xffff8001
  17515. 8007dcc: 0c020060 .word 0x0c020060
  17516. 8007dd0: 0c20c000 .word 0x0c20c000
  17517. 08007dd4 <HAL_ETH_Start_IT>:
  17518. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  17519. * the configuration information for ETHERNET module
  17520. * @retval HAL status
  17521. */
  17522. HAL_StatusTypeDef HAL_ETH_Start_IT(ETH_HandleTypeDef *heth)
  17523. {
  17524. 8007dd4: b580 push {r7, lr}
  17525. 8007dd6: b082 sub sp, #8
  17526. 8007dd8: af00 add r7, sp, #0
  17527. 8007dda: 6078 str r0, [r7, #4]
  17528. if (heth->gState == HAL_ETH_STATE_READY)
  17529. 8007ddc: 687b ldr r3, [r7, #4]
  17530. 8007dde: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  17531. 8007de2: 2b10 cmp r3, #16
  17532. 8007de4: d165 bne.n 8007eb2 <HAL_ETH_Start_IT+0xde>
  17533. {
  17534. heth->gState = HAL_ETH_STATE_BUSY;
  17535. 8007de6: 687b ldr r3, [r7, #4]
  17536. 8007de8: 2223 movs r2, #35 @ 0x23
  17537. 8007dea: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  17538. /* save IT mode to ETH Handle */
  17539. heth->RxDescList.ItMode = 1U;
  17540. 8007dee: 687b ldr r3, [r7, #4]
  17541. 8007df0: 2201 movs r2, #1
  17542. 8007df2: 659a str r2, [r3, #88] @ 0x58
  17543. /* Set number of descriptors to build */
  17544. heth->RxDescList.RxBuildDescCnt = ETH_RX_DESC_CNT;
  17545. 8007df4: 687b ldr r3, [r7, #4]
  17546. 8007df6: 2204 movs r2, #4
  17547. 8007df8: 66da str r2, [r3, #108] @ 0x6c
  17548. /* Build all descriptors */
  17549. ETH_UpdateDescriptor(heth);
  17550. 8007dfa: 6878 ldr r0, [r7, #4]
  17551. 8007dfc: f000 f9e4 bl 80081c8 <ETH_UpdateDescriptor>
  17552. /* Enable the DMA transmission */
  17553. SET_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_ST);
  17554. 8007e00: 687b ldr r3, [r7, #4]
  17555. 8007e02: 681b ldr r3, [r3, #0]
  17556. 8007e04: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17557. 8007e08: f8d3 3104 ldr.w r3, [r3, #260] @ 0x104
  17558. 8007e0c: 687a ldr r2, [r7, #4]
  17559. 8007e0e: 6812 ldr r2, [r2, #0]
  17560. 8007e10: f043 0301 orr.w r3, r3, #1
  17561. 8007e14: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17562. 8007e18: f8c2 3104 str.w r3, [r2, #260] @ 0x104
  17563. /* Enable the DMA reception */
  17564. SET_BIT(heth->Instance->DMACRCR, ETH_DMACRCR_SR);
  17565. 8007e1c: 687b ldr r3, [r7, #4]
  17566. 8007e1e: 681b ldr r3, [r3, #0]
  17567. 8007e20: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17568. 8007e24: f8d3 3108 ldr.w r3, [r3, #264] @ 0x108
  17569. 8007e28: 687a ldr r2, [r7, #4]
  17570. 8007e2a: 6812 ldr r2, [r2, #0]
  17571. 8007e2c: f043 0301 orr.w r3, r3, #1
  17572. 8007e30: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17573. 8007e34: f8c2 3108 str.w r3, [r2, #264] @ 0x108
  17574. /* Clear Tx and Rx process stopped flags */
  17575. heth->Instance->DMACSR |= (ETH_DMACSR_TPS | ETH_DMACSR_RPS);
  17576. 8007e38: 687b ldr r3, [r7, #4]
  17577. 8007e3a: 681b ldr r3, [r3, #0]
  17578. 8007e3c: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17579. 8007e40: f8d3 3160 ldr.w r3, [r3, #352] @ 0x160
  17580. 8007e44: 687a ldr r2, [r7, #4]
  17581. 8007e46: 6812 ldr r2, [r2, #0]
  17582. 8007e48: f443 7381 orr.w r3, r3, #258 @ 0x102
  17583. 8007e4c: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17584. 8007e50: f8c2 3160 str.w r3, [r2, #352] @ 0x160
  17585. /* Set the Flush Transmit FIFO bit */
  17586. SET_BIT(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_FTQ);
  17587. 8007e54: 687b ldr r3, [r7, #4]
  17588. 8007e56: 681b ldr r3, [r3, #0]
  17589. 8007e58: f8d3 2d00 ldr.w r2, [r3, #3328] @ 0xd00
  17590. 8007e5c: 687b ldr r3, [r7, #4]
  17591. 8007e5e: 681b ldr r3, [r3, #0]
  17592. 8007e60: f042 0201 orr.w r2, r2, #1
  17593. 8007e64: f8c3 2d00 str.w r2, [r3, #3328] @ 0xd00
  17594. /* Enable the MAC transmission */
  17595. SET_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
  17596. 8007e68: 687b ldr r3, [r7, #4]
  17597. 8007e6a: 681b ldr r3, [r3, #0]
  17598. 8007e6c: 681a ldr r2, [r3, #0]
  17599. 8007e6e: 687b ldr r3, [r7, #4]
  17600. 8007e70: 681b ldr r3, [r3, #0]
  17601. 8007e72: f042 0202 orr.w r2, r2, #2
  17602. 8007e76: 601a str r2, [r3, #0]
  17603. /* Enable the MAC reception */
  17604. SET_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
  17605. 8007e78: 687b ldr r3, [r7, #4]
  17606. 8007e7a: 681b ldr r3, [r3, #0]
  17607. 8007e7c: 681a ldr r2, [r3, #0]
  17608. 8007e7e: 687b ldr r3, [r7, #4]
  17609. 8007e80: 681b ldr r3, [r3, #0]
  17610. 8007e82: f042 0201 orr.w r2, r2, #1
  17611. 8007e86: 601a str r2, [r3, #0]
  17612. /* Enable ETH DMA interrupts:
  17613. - Tx complete interrupt
  17614. - Rx complete interrupt
  17615. - Fatal bus interrupt
  17616. */
  17617. __HAL_ETH_DMA_ENABLE_IT(heth, (ETH_DMACIER_NIE | ETH_DMACIER_RIE | ETH_DMACIER_TIE |
  17618. 8007e88: 687b ldr r3, [r7, #4]
  17619. 8007e8a: 681b ldr r3, [r3, #0]
  17620. 8007e8c: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17621. 8007e90: f8d3 1134 ldr.w r1, [r3, #308] @ 0x134
  17622. 8007e94: 687b ldr r3, [r7, #4]
  17623. 8007e96: 681a ldr r2, [r3, #0]
  17624. 8007e98: f24d 03c1 movw r3, #53441 @ 0xd0c1
  17625. 8007e9c: 430b orrs r3, r1
  17626. 8007e9e: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17627. 8007ea2: f8c2 3134 str.w r3, [r2, #308] @ 0x134
  17628. ETH_DMACIER_FBEE | ETH_DMACIER_AIE | ETH_DMACIER_RBUE));
  17629. heth->gState = HAL_ETH_STATE_STARTED;
  17630. 8007ea6: 687b ldr r3, [r7, #4]
  17631. 8007ea8: 2223 movs r2, #35 @ 0x23
  17632. 8007eaa: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  17633. return HAL_OK;
  17634. 8007eae: 2300 movs r3, #0
  17635. 8007eb0: e000 b.n 8007eb4 <HAL_ETH_Start_IT+0xe0>
  17636. }
  17637. else
  17638. {
  17639. return HAL_ERROR;
  17640. 8007eb2: 2301 movs r3, #1
  17641. }
  17642. }
  17643. 8007eb4: 4618 mov r0, r3
  17644. 8007eb6: 3708 adds r7, #8
  17645. 8007eb8: 46bd mov sp, r7
  17646. 8007eba: bd80 pop {r7, pc}
  17647. 08007ebc <HAL_ETH_Stop_IT>:
  17648. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  17649. * the configuration information for ETHERNET module
  17650. * @retval HAL status
  17651. */
  17652. HAL_StatusTypeDef HAL_ETH_Stop_IT(ETH_HandleTypeDef *heth)
  17653. {
  17654. 8007ebc: b480 push {r7}
  17655. 8007ebe: b085 sub sp, #20
  17656. 8007ec0: af00 add r7, sp, #0
  17657. 8007ec2: 6078 str r0, [r7, #4]
  17658. ETH_DMADescTypeDef *dmarxdesc;
  17659. uint32_t descindex;
  17660. if (heth->gState == HAL_ETH_STATE_STARTED)
  17661. 8007ec4: 687b ldr r3, [r7, #4]
  17662. 8007ec6: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  17663. 8007eca: 2b23 cmp r3, #35 @ 0x23
  17664. 8007ecc: d165 bne.n 8007f9a <HAL_ETH_Stop_IT+0xde>
  17665. {
  17666. /* Set the ETH peripheral state to BUSY */
  17667. heth->gState = HAL_ETH_STATE_BUSY;
  17668. 8007ece: 687b ldr r3, [r7, #4]
  17669. 8007ed0: 2223 movs r2, #35 @ 0x23
  17670. 8007ed2: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  17671. /* Disable interrupts:
  17672. - Tx complete interrupt
  17673. - Rx complete interrupt
  17674. - Fatal bus interrupt
  17675. */
  17676. __HAL_ETH_DMA_DISABLE_IT(heth, (ETH_DMACIER_NIE | ETH_DMACIER_RIE | ETH_DMACIER_TIE |
  17677. 8007ed6: 687b ldr r3, [r7, #4]
  17678. 8007ed8: 681b ldr r3, [r3, #0]
  17679. 8007eda: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17680. 8007ede: f8d3 1134 ldr.w r1, [r3, #308] @ 0x134
  17681. 8007ee2: 687b ldr r3, [r7, #4]
  17682. 8007ee4: 681a ldr r2, [r3, #0]
  17683. 8007ee6: 4b30 ldr r3, [pc, #192] @ (8007fa8 <HAL_ETH_Stop_IT+0xec>)
  17684. 8007ee8: 400b ands r3, r1
  17685. 8007eea: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17686. 8007eee: f8c2 3134 str.w r3, [r2, #308] @ 0x134
  17687. ETH_DMACIER_FBEE | ETH_DMACIER_AIE | ETH_DMACIER_RBUE));
  17688. /* Disable the DMA transmission */
  17689. CLEAR_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_ST);
  17690. 8007ef2: 687b ldr r3, [r7, #4]
  17691. 8007ef4: 681b ldr r3, [r3, #0]
  17692. 8007ef6: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17693. 8007efa: f8d3 3104 ldr.w r3, [r3, #260] @ 0x104
  17694. 8007efe: 687a ldr r2, [r7, #4]
  17695. 8007f00: 6812 ldr r2, [r2, #0]
  17696. 8007f02: f023 0301 bic.w r3, r3, #1
  17697. 8007f06: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17698. 8007f0a: f8c2 3104 str.w r3, [r2, #260] @ 0x104
  17699. /* Disable the DMA reception */
  17700. CLEAR_BIT(heth->Instance->DMACRCR, ETH_DMACRCR_SR);
  17701. 8007f0e: 687b ldr r3, [r7, #4]
  17702. 8007f10: 681b ldr r3, [r3, #0]
  17703. 8007f12: f503 5380 add.w r3, r3, #4096 @ 0x1000
  17704. 8007f16: f8d3 3108 ldr.w r3, [r3, #264] @ 0x108
  17705. 8007f1a: 687a ldr r2, [r7, #4]
  17706. 8007f1c: 6812 ldr r2, [r2, #0]
  17707. 8007f1e: f023 0301 bic.w r3, r3, #1
  17708. 8007f22: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17709. 8007f26: f8c2 3108 str.w r3, [r2, #264] @ 0x108
  17710. /* Disable the MAC reception */
  17711. CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
  17712. 8007f2a: 687b ldr r3, [r7, #4]
  17713. 8007f2c: 681b ldr r3, [r3, #0]
  17714. 8007f2e: 681a ldr r2, [r3, #0]
  17715. 8007f30: 687b ldr r3, [r7, #4]
  17716. 8007f32: 681b ldr r3, [r3, #0]
  17717. 8007f34: f022 0201 bic.w r2, r2, #1
  17718. 8007f38: 601a str r2, [r3, #0]
  17719. /* Set the Flush Transmit FIFO bit */
  17720. SET_BIT(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_FTQ);
  17721. 8007f3a: 687b ldr r3, [r7, #4]
  17722. 8007f3c: 681b ldr r3, [r3, #0]
  17723. 8007f3e: f8d3 2d00 ldr.w r2, [r3, #3328] @ 0xd00
  17724. 8007f42: 687b ldr r3, [r7, #4]
  17725. 8007f44: 681b ldr r3, [r3, #0]
  17726. 8007f46: f042 0201 orr.w r2, r2, #1
  17727. 8007f4a: f8c3 2d00 str.w r2, [r3, #3328] @ 0xd00
  17728. /* Disable the MAC transmission */
  17729. CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
  17730. 8007f4e: 687b ldr r3, [r7, #4]
  17731. 8007f50: 681b ldr r3, [r3, #0]
  17732. 8007f52: 681a ldr r2, [r3, #0]
  17733. 8007f54: 687b ldr r3, [r7, #4]
  17734. 8007f56: 681b ldr r3, [r3, #0]
  17735. 8007f58: f022 0202 bic.w r2, r2, #2
  17736. 8007f5c: 601a str r2, [r3, #0]
  17737. /* Clear IOC bit to all Rx descriptors */
  17738. for (descindex = 0; descindex < (uint32_t)ETH_RX_DESC_CNT; descindex++)
  17739. 8007f5e: 2300 movs r3, #0
  17740. 8007f60: 60fb str r3, [r7, #12]
  17741. 8007f62: e00e b.n 8007f82 <HAL_ETH_Stop_IT+0xc6>
  17742. {
  17743. dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descindex];
  17744. 8007f64: 687b ldr r3, [r7, #4]
  17745. 8007f66: 68fa ldr r2, [r7, #12]
  17746. 8007f68: 3212 adds r2, #18
  17747. 8007f6a: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  17748. 8007f6e: 60bb str r3, [r7, #8]
  17749. CLEAR_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCRF_IOC);
  17750. 8007f70: 68bb ldr r3, [r7, #8]
  17751. 8007f72: 68db ldr r3, [r3, #12]
  17752. 8007f74: f023 4280 bic.w r2, r3, #1073741824 @ 0x40000000
  17753. 8007f78: 68bb ldr r3, [r7, #8]
  17754. 8007f7a: 60da str r2, [r3, #12]
  17755. for (descindex = 0; descindex < (uint32_t)ETH_RX_DESC_CNT; descindex++)
  17756. 8007f7c: 68fb ldr r3, [r7, #12]
  17757. 8007f7e: 3301 adds r3, #1
  17758. 8007f80: 60fb str r3, [r7, #12]
  17759. 8007f82: 68fb ldr r3, [r7, #12]
  17760. 8007f84: 2b03 cmp r3, #3
  17761. 8007f86: d9ed bls.n 8007f64 <HAL_ETH_Stop_IT+0xa8>
  17762. }
  17763. heth->RxDescList.ItMode = 0U;
  17764. 8007f88: 687b ldr r3, [r7, #4]
  17765. 8007f8a: 2200 movs r2, #0
  17766. 8007f8c: 659a str r2, [r3, #88] @ 0x58
  17767. heth->gState = HAL_ETH_STATE_READY;
  17768. 8007f8e: 687b ldr r3, [r7, #4]
  17769. 8007f90: 2210 movs r2, #16
  17770. 8007f92: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  17771. /* Return function status */
  17772. return HAL_OK;
  17773. 8007f96: 2300 movs r3, #0
  17774. 8007f98: e000 b.n 8007f9c <HAL_ETH_Stop_IT+0xe0>
  17775. }
  17776. else
  17777. {
  17778. return HAL_ERROR;
  17779. 8007f9a: 2301 movs r3, #1
  17780. }
  17781. }
  17782. 8007f9c: 4618 mov r0, r3
  17783. 8007f9e: 3714 adds r7, #20
  17784. 8007fa0: 46bd mov sp, r7
  17785. 8007fa2: f85d 7b04 ldr.w r7, [sp], #4
  17786. 8007fa6: 4770 bx lr
  17787. 8007fa8: ffff2f3e .word 0xffff2f3e
  17788. 08007fac <HAL_ETH_Transmit_IT>:
  17789. * the configuration information for ETHERNET module
  17790. * @param pTxConfig: Hold the configuration of packet to be transmitted
  17791. * @retval HAL status
  17792. */
  17793. HAL_StatusTypeDef HAL_ETH_Transmit_IT(ETH_HandleTypeDef *heth, ETH_TxPacketConfigTypeDef *pTxConfig)
  17794. {
  17795. 8007fac: b580 push {r7, lr}
  17796. 8007fae: b082 sub sp, #8
  17797. 8007fb0: af00 add r7, sp, #0
  17798. 8007fb2: 6078 str r0, [r7, #4]
  17799. 8007fb4: 6039 str r1, [r7, #0]
  17800. if (pTxConfig == NULL)
  17801. 8007fb6: 683b ldr r3, [r7, #0]
  17802. 8007fb8: 2b00 cmp r3, #0
  17803. 8007fba: d109 bne.n 8007fd0 <HAL_ETH_Transmit_IT+0x24>
  17804. {
  17805. heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
  17806. 8007fbc: 687b ldr r3, [r7, #4]
  17807. 8007fbe: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  17808. 8007fc2: f043 0201 orr.w r2, r3, #1
  17809. 8007fc6: 687b ldr r3, [r7, #4]
  17810. 8007fc8: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  17811. return HAL_ERROR;
  17812. 8007fcc: 2301 movs r3, #1
  17813. 8007fce: e03a b.n 8008046 <HAL_ETH_Transmit_IT+0x9a>
  17814. }
  17815. if (heth->gState == HAL_ETH_STATE_STARTED)
  17816. 8007fd0: 687b ldr r3, [r7, #4]
  17817. 8007fd2: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  17818. 8007fd6: 2b23 cmp r3, #35 @ 0x23
  17819. 8007fd8: d134 bne.n 8008044 <HAL_ETH_Transmit_IT+0x98>
  17820. {
  17821. /* Save the packet pointer to release. */
  17822. heth->TxDescList.CurrentPacketAddress = (uint32_t *)pTxConfig->pData;
  17823. 8007fda: 683b ldr r3, [r7, #0]
  17824. 8007fdc: 6b5a ldr r2, [r3, #52] @ 0x34
  17825. 8007fde: 687b ldr r3, [r7, #4]
  17826. 8007fe0: 63da str r2, [r3, #60] @ 0x3c
  17827. /* Config DMA Tx descriptor by Tx Packet info */
  17828. if (ETH_Prepare_Tx_Descriptors(heth, pTxConfig, 1) != HAL_ETH_ERROR_NONE)
  17829. 8007fe2: 2201 movs r2, #1
  17830. 8007fe4: 6839 ldr r1, [r7, #0]
  17831. 8007fe6: 6878 ldr r0, [r7, #4]
  17832. 8007fe8: f001 f8b6 bl 8009158 <ETH_Prepare_Tx_Descriptors>
  17833. 8007fec: 4603 mov r3, r0
  17834. 8007fee: 2b00 cmp r3, #0
  17835. 8007ff0: d009 beq.n 8008006 <HAL_ETH_Transmit_IT+0x5a>
  17836. {
  17837. heth->ErrorCode |= HAL_ETH_ERROR_BUSY;
  17838. 8007ff2: 687b ldr r3, [r7, #4]
  17839. 8007ff4: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  17840. 8007ff8: f043 0202 orr.w r2, r3, #2
  17841. 8007ffc: 687b ldr r3, [r7, #4]
  17842. 8007ffe: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  17843. return HAL_ERROR;
  17844. 8008002: 2301 movs r3, #1
  17845. 8008004: e01f b.n 8008046 <HAL_ETH_Transmit_IT+0x9a>
  17846. __ASM volatile ("dsb 0xF":::"memory");
  17847. 8008006: f3bf 8f4f dsb sy
  17848. }
  17849. 800800a: bf00 nop
  17850. /* Ensure completion of descriptor preparation before transmission start */
  17851. __DSB();
  17852. /* Incr current tx desc index */
  17853. INCR_TX_DESC_INDEX(heth->TxDescList.CurTxDesc, 1U);
  17854. 800800c: 687b ldr r3, [r7, #4]
  17855. 800800e: 6a9b ldr r3, [r3, #40] @ 0x28
  17856. 8008010: 1c5a adds r2, r3, #1
  17857. 8008012: 687b ldr r3, [r7, #4]
  17858. 8008014: 629a str r2, [r3, #40] @ 0x28
  17859. 8008016: 687b ldr r3, [r7, #4]
  17860. 8008018: 6a9b ldr r3, [r3, #40] @ 0x28
  17861. 800801a: 2b03 cmp r3, #3
  17862. 800801c: d904 bls.n 8008028 <HAL_ETH_Transmit_IT+0x7c>
  17863. 800801e: 687b ldr r3, [r7, #4]
  17864. 8008020: 6a9b ldr r3, [r3, #40] @ 0x28
  17865. 8008022: 1f1a subs r2, r3, #4
  17866. 8008024: 687b ldr r3, [r7, #4]
  17867. 8008026: 629a str r2, [r3, #40] @ 0x28
  17868. /* Start transmission */
  17869. /* issue a poll command to Tx DMA by writing address of next immediate free descriptor */
  17870. WRITE_REG(heth->Instance->DMACTDTPR, (uint32_t)(heth->TxDescList.TxDesc[heth->TxDescList.CurTxDesc]));
  17871. 8008028: 687b ldr r3, [r7, #4]
  17872. 800802a: 6a99 ldr r1, [r3, #40] @ 0x28
  17873. 800802c: 687b ldr r3, [r7, #4]
  17874. 800802e: 681a ldr r2, [r3, #0]
  17875. 8008030: 687b ldr r3, [r7, #4]
  17876. 8008032: 3106 adds r1, #6
  17877. 8008034: f853 3021 ldr.w r3, [r3, r1, lsl #2]
  17878. 8008038: f502 5280 add.w r2, r2, #4096 @ 0x1000
  17879. 800803c: f8c2 3120 str.w r3, [r2, #288] @ 0x120
  17880. return HAL_OK;
  17881. 8008040: 2300 movs r3, #0
  17882. 8008042: e000 b.n 8008046 <HAL_ETH_Transmit_IT+0x9a>
  17883. }
  17884. else
  17885. {
  17886. return HAL_ERROR;
  17887. 8008044: 2301 movs r3, #1
  17888. }
  17889. }
  17890. 8008046: 4618 mov r0, r3
  17891. 8008048: 3708 adds r7, #8
  17892. 800804a: 46bd mov sp, r7
  17893. 800804c: bd80 pop {r7, pc}
  17894. 0800804e <HAL_ETH_ReadData>:
  17895. * the configuration information for ETHERNET module
  17896. * @param pAppBuff: Pointer to an application buffer to receive the packet.
  17897. * @retval HAL status
  17898. */
  17899. HAL_StatusTypeDef HAL_ETH_ReadData(ETH_HandleTypeDef *heth, void **pAppBuff)
  17900. {
  17901. 800804e: b580 push {r7, lr}
  17902. 8008050: b088 sub sp, #32
  17903. 8008052: af00 add r7, sp, #0
  17904. 8008054: 6078 str r0, [r7, #4]
  17905. 8008056: 6039 str r1, [r7, #0]
  17906. uint32_t descidx;
  17907. ETH_DMADescTypeDef *dmarxdesc;
  17908. uint32_t desccnt = 0U;
  17909. 8008058: 2300 movs r3, #0
  17910. 800805a: 617b str r3, [r7, #20]
  17911. uint32_t desccntmax;
  17912. uint32_t bufflength;
  17913. uint8_t rxdataready = 0U;
  17914. 800805c: 2300 movs r3, #0
  17915. 800805e: 74fb strb r3, [r7, #19]
  17916. if (pAppBuff == NULL)
  17917. 8008060: 683b ldr r3, [r7, #0]
  17918. 8008062: 2b00 cmp r3, #0
  17919. 8008064: d109 bne.n 800807a <HAL_ETH_ReadData+0x2c>
  17920. {
  17921. heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
  17922. 8008066: 687b ldr r3, [r7, #4]
  17923. 8008068: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  17924. 800806c: f043 0201 orr.w r2, r3, #1
  17925. 8008070: 687b ldr r3, [r7, #4]
  17926. 8008072: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  17927. return HAL_ERROR;
  17928. 8008076: 2301 movs r3, #1
  17929. 8008078: e0a2 b.n 80081c0 <HAL_ETH_ReadData+0x172>
  17930. }
  17931. if (heth->gState != HAL_ETH_STATE_STARTED)
  17932. 800807a: 687b ldr r3, [r7, #4]
  17933. 800807c: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  17934. 8008080: 2b23 cmp r3, #35 @ 0x23
  17935. 8008082: d001 beq.n 8008088 <HAL_ETH_ReadData+0x3a>
  17936. {
  17937. return HAL_ERROR;
  17938. 8008084: 2301 movs r3, #1
  17939. 8008086: e09b b.n 80081c0 <HAL_ETH_ReadData+0x172>
  17940. }
  17941. descidx = heth->RxDescList.RxDescIdx;
  17942. 8008088: 687b ldr r3, [r7, #4]
  17943. 800808a: 6ddb ldr r3, [r3, #92] @ 0x5c
  17944. 800808c: 61fb str r3, [r7, #28]
  17945. dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
  17946. 800808e: 687b ldr r3, [r7, #4]
  17947. 8008090: 69fa ldr r2, [r7, #28]
  17948. 8008092: 3212 adds r2, #18
  17949. 8008094: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  17950. 8008098: 61bb str r3, [r7, #24]
  17951. desccntmax = ETH_RX_DESC_CNT - heth->RxDescList.RxBuildDescCnt;
  17952. 800809a: 687b ldr r3, [r7, #4]
  17953. 800809c: 6edb ldr r3, [r3, #108] @ 0x6c
  17954. 800809e: f1c3 0304 rsb r3, r3, #4
  17955. 80080a2: 60fb str r3, [r7, #12]
  17956. /* Check if descriptor is not owned by DMA */
  17957. while ((READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_OWN) == (uint32_t)RESET) && (desccnt < desccntmax)
  17958. 80080a4: e064 b.n 8008170 <HAL_ETH_ReadData+0x122>
  17959. && (rxdataready == 0U))
  17960. {
  17961. if (READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_CTXT) != (uint32_t)RESET)
  17962. 80080a6: 69bb ldr r3, [r7, #24]
  17963. 80080a8: 68db ldr r3, [r3, #12]
  17964. 80080aa: f003 4380 and.w r3, r3, #1073741824 @ 0x40000000
  17965. 80080ae: 2b00 cmp r3, #0
  17966. 80080b0: d007 beq.n 80080c2 <HAL_ETH_ReadData+0x74>
  17967. {
  17968. /* Get timestamp high */
  17969. heth->RxDescList.TimeStamp.TimeStampHigh = dmarxdesc->DESC1;
  17970. 80080b2: 69bb ldr r3, [r7, #24]
  17971. 80080b4: 685a ldr r2, [r3, #4]
  17972. 80080b6: 687b ldr r3, [r7, #4]
  17973. 80080b8: 679a str r2, [r3, #120] @ 0x78
  17974. /* Get timestamp low */
  17975. heth->RxDescList.TimeStamp.TimeStampLow = dmarxdesc->DESC0;
  17976. 80080ba: 69bb ldr r3, [r7, #24]
  17977. 80080bc: 681a ldr r2, [r3, #0]
  17978. 80080be: 687b ldr r3, [r7, #4]
  17979. 80080c0: 675a str r2, [r3, #116] @ 0x74
  17980. }
  17981. if ((READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_FD) != (uint32_t)RESET) || (heth->RxDescList.pRxStart != NULL))
  17982. 80080c2: 69bb ldr r3, [r7, #24]
  17983. 80080c4: 68db ldr r3, [r3, #12]
  17984. 80080c6: f003 5300 and.w r3, r3, #536870912 @ 0x20000000
  17985. 80080ca: 2b00 cmp r3, #0
  17986. 80080cc: d103 bne.n 80080d6 <HAL_ETH_ReadData+0x88>
  17987. 80080ce: 687b ldr r3, [r7, #4]
  17988. 80080d0: 6fdb ldr r3, [r3, #124] @ 0x7c
  17989. 80080d2: 2b00 cmp r3, #0
  17990. 80080d4: d03a beq.n 800814c <HAL_ETH_ReadData+0xfe>
  17991. {
  17992. /* Check if first descriptor */
  17993. if (READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_FD) != (uint32_t)RESET)
  17994. 80080d6: 69bb ldr r3, [r7, #24]
  17995. 80080d8: 68db ldr r3, [r3, #12]
  17996. 80080da: f003 5300 and.w r3, r3, #536870912 @ 0x20000000
  17997. 80080de: 2b00 cmp r3, #0
  17998. 80080e0: d005 beq.n 80080ee <HAL_ETH_ReadData+0xa0>
  17999. {
  18000. heth->RxDescList.RxDescCnt = 0;
  18001. 80080e2: 687b ldr r3, [r7, #4]
  18002. 80080e4: 2200 movs r2, #0
  18003. 80080e6: 661a str r2, [r3, #96] @ 0x60
  18004. heth->RxDescList.RxDataLength = 0;
  18005. 80080e8: 687b ldr r3, [r7, #4]
  18006. 80080ea: 2200 movs r2, #0
  18007. 80080ec: 665a str r2, [r3, #100] @ 0x64
  18008. }
  18009. /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
  18010. bufflength = READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_PL) - heth->RxDescList.RxDataLength;
  18011. 80080ee: 69bb ldr r3, [r7, #24]
  18012. 80080f0: 68db ldr r3, [r3, #12]
  18013. 80080f2: f3c3 020e ubfx r2, r3, #0, #15
  18014. 80080f6: 687b ldr r3, [r7, #4]
  18015. 80080f8: 6e5b ldr r3, [r3, #100] @ 0x64
  18016. 80080fa: 1ad3 subs r3, r2, r3
  18017. 80080fc: 60bb str r3, [r7, #8]
  18018. /* Check if last descriptor */
  18019. if (READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_LD) != (uint32_t)RESET)
  18020. 80080fe: 69bb ldr r3, [r7, #24]
  18021. 8008100: 68db ldr r3, [r3, #12]
  18022. 8008102: f003 5380 and.w r3, r3, #268435456 @ 0x10000000
  18023. 8008106: 2b00 cmp r3, #0
  18024. 8008108: d005 beq.n 8008116 <HAL_ETH_ReadData+0xc8>
  18025. {
  18026. /* Save Last descriptor index */
  18027. heth->RxDescList.pRxLastRxDesc = dmarxdesc->DESC3;
  18028. 800810a: 69bb ldr r3, [r7, #24]
  18029. 800810c: 68da ldr r2, [r3, #12]
  18030. 800810e: 687b ldr r3, [r7, #4]
  18031. 8008110: 671a str r2, [r3, #112] @ 0x70
  18032. /* Packet ready */
  18033. rxdataready = 1;
  18034. 8008112: 2301 movs r3, #1
  18035. 8008114: 74fb strb r3, [r7, #19]
  18036. /*Call registered Link callback*/
  18037. heth->rxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
  18038. (uint8_t *)dmarxdesc->BackupAddr0, bufflength);
  18039. #else
  18040. /* Link callback */
  18041. HAL_ETH_RxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
  18042. 8008116: 687b ldr r3, [r7, #4]
  18043. 8008118: f103 007c add.w r0, r3, #124 @ 0x7c
  18044. 800811c: 687b ldr r3, [r7, #4]
  18045. 800811e: f103 0180 add.w r1, r3, #128 @ 0x80
  18046. (uint8_t *)dmarxdesc->BackupAddr0, (uint16_t) bufflength);
  18047. 8008122: 69bb ldr r3, [r7, #24]
  18048. 8008124: 691b ldr r3, [r3, #16]
  18049. HAL_ETH_RxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
  18050. 8008126: 461a mov r2, r3
  18051. 8008128: 68bb ldr r3, [r7, #8]
  18052. 800812a: b29b uxth r3, r3
  18053. 800812c: f008 f96e bl 801040c <HAL_ETH_RxLinkCallback>
  18054. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18055. heth->RxDescList.RxDescCnt++;
  18056. 8008130: 687b ldr r3, [r7, #4]
  18057. 8008132: 6e1b ldr r3, [r3, #96] @ 0x60
  18058. 8008134: 1c5a adds r2, r3, #1
  18059. 8008136: 687b ldr r3, [r7, #4]
  18060. 8008138: 661a str r2, [r3, #96] @ 0x60
  18061. heth->RxDescList.RxDataLength += bufflength;
  18062. 800813a: 687b ldr r3, [r7, #4]
  18063. 800813c: 6e5a ldr r2, [r3, #100] @ 0x64
  18064. 800813e: 68bb ldr r3, [r7, #8]
  18065. 8008140: 441a add r2, r3
  18066. 8008142: 687b ldr r3, [r7, #4]
  18067. 8008144: 665a str r2, [r3, #100] @ 0x64
  18068. /* Clear buffer pointer */
  18069. dmarxdesc->BackupAddr0 = 0;
  18070. 8008146: 69bb ldr r3, [r7, #24]
  18071. 8008148: 2200 movs r2, #0
  18072. 800814a: 611a str r2, [r3, #16]
  18073. }
  18074. /* Increment current rx descriptor index */
  18075. INCR_RX_DESC_INDEX(descidx, 1U);
  18076. 800814c: 69fb ldr r3, [r7, #28]
  18077. 800814e: 3301 adds r3, #1
  18078. 8008150: 61fb str r3, [r7, #28]
  18079. 8008152: 69fb ldr r3, [r7, #28]
  18080. 8008154: 2b03 cmp r3, #3
  18081. 8008156: d902 bls.n 800815e <HAL_ETH_ReadData+0x110>
  18082. 8008158: 69fb ldr r3, [r7, #28]
  18083. 800815a: 3b04 subs r3, #4
  18084. 800815c: 61fb str r3, [r7, #28]
  18085. /* Get current descriptor address */
  18086. dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
  18087. 800815e: 687b ldr r3, [r7, #4]
  18088. 8008160: 69fa ldr r2, [r7, #28]
  18089. 8008162: 3212 adds r2, #18
  18090. 8008164: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  18091. 8008168: 61bb str r3, [r7, #24]
  18092. desccnt++;
  18093. 800816a: 697b ldr r3, [r7, #20]
  18094. 800816c: 3301 adds r3, #1
  18095. 800816e: 617b str r3, [r7, #20]
  18096. while ((READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_OWN) == (uint32_t)RESET) && (desccnt < desccntmax)
  18097. 8008170: 69bb ldr r3, [r7, #24]
  18098. 8008172: 68db ldr r3, [r3, #12]
  18099. && (rxdataready == 0U))
  18100. 8008174: 2b00 cmp r3, #0
  18101. 8008176: db06 blt.n 8008186 <HAL_ETH_ReadData+0x138>
  18102. while ((READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_OWN) == (uint32_t)RESET) && (desccnt < desccntmax)
  18103. 8008178: 697a ldr r2, [r7, #20]
  18104. 800817a: 68fb ldr r3, [r7, #12]
  18105. 800817c: 429a cmp r2, r3
  18106. 800817e: d202 bcs.n 8008186 <HAL_ETH_ReadData+0x138>
  18107. && (rxdataready == 0U))
  18108. 8008180: 7cfb ldrb r3, [r7, #19]
  18109. 8008182: 2b00 cmp r3, #0
  18110. 8008184: d08f beq.n 80080a6 <HAL_ETH_ReadData+0x58>
  18111. }
  18112. heth->RxDescList.RxBuildDescCnt += desccnt;
  18113. 8008186: 687b ldr r3, [r7, #4]
  18114. 8008188: 6eda ldr r2, [r3, #108] @ 0x6c
  18115. 800818a: 697b ldr r3, [r7, #20]
  18116. 800818c: 441a add r2, r3
  18117. 800818e: 687b ldr r3, [r7, #4]
  18118. 8008190: 66da str r2, [r3, #108] @ 0x6c
  18119. if ((heth->RxDescList.RxBuildDescCnt) != 0U)
  18120. 8008192: 687b ldr r3, [r7, #4]
  18121. 8008194: 6edb ldr r3, [r3, #108] @ 0x6c
  18122. 8008196: 2b00 cmp r3, #0
  18123. 8008198: d002 beq.n 80081a0 <HAL_ETH_ReadData+0x152>
  18124. {
  18125. /* Update Descriptors */
  18126. ETH_UpdateDescriptor(heth);
  18127. 800819a: 6878 ldr r0, [r7, #4]
  18128. 800819c: f000 f814 bl 80081c8 <ETH_UpdateDescriptor>
  18129. }
  18130. heth->RxDescList.RxDescIdx = descidx;
  18131. 80081a0: 687b ldr r3, [r7, #4]
  18132. 80081a2: 69fa ldr r2, [r7, #28]
  18133. 80081a4: 65da str r2, [r3, #92] @ 0x5c
  18134. if (rxdataready == 1U)
  18135. 80081a6: 7cfb ldrb r3, [r7, #19]
  18136. 80081a8: 2b01 cmp r3, #1
  18137. 80081aa: d108 bne.n 80081be <HAL_ETH_ReadData+0x170>
  18138. {
  18139. /* Return received packet */
  18140. *pAppBuff = heth->RxDescList.pRxStart;
  18141. 80081ac: 687b ldr r3, [r7, #4]
  18142. 80081ae: 6fda ldr r2, [r3, #124] @ 0x7c
  18143. 80081b0: 683b ldr r3, [r7, #0]
  18144. 80081b2: 601a str r2, [r3, #0]
  18145. /* Reset first element */
  18146. heth->RxDescList.pRxStart = NULL;
  18147. 80081b4: 687b ldr r3, [r7, #4]
  18148. 80081b6: 2200 movs r2, #0
  18149. 80081b8: 67da str r2, [r3, #124] @ 0x7c
  18150. return HAL_OK;
  18151. 80081ba: 2300 movs r3, #0
  18152. 80081bc: e000 b.n 80081c0 <HAL_ETH_ReadData+0x172>
  18153. }
  18154. /* Packet not ready */
  18155. return HAL_ERROR;
  18156. 80081be: 2301 movs r3, #1
  18157. }
  18158. 80081c0: 4618 mov r0, r3
  18159. 80081c2: 3720 adds r7, #32
  18160. 80081c4: 46bd mov sp, r7
  18161. 80081c6: bd80 pop {r7, pc}
  18162. 080081c8 <ETH_UpdateDescriptor>:
  18163. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  18164. * the configuration information for ETHERNET module
  18165. * @retval HAL status
  18166. */
  18167. static void ETH_UpdateDescriptor(ETH_HandleTypeDef *heth)
  18168. {
  18169. 80081c8: b580 push {r7, lr}
  18170. 80081ca: b088 sub sp, #32
  18171. 80081cc: af00 add r7, sp, #0
  18172. 80081ce: 6078 str r0, [r7, #4]
  18173. uint32_t descidx;
  18174. uint32_t tailidx;
  18175. uint32_t desccount;
  18176. ETH_DMADescTypeDef *dmarxdesc;
  18177. uint8_t *buff = NULL;
  18178. 80081d0: 2300 movs r3, #0
  18179. 80081d2: 60bb str r3, [r7, #8]
  18180. uint8_t allocStatus = 1U;
  18181. 80081d4: 2301 movs r3, #1
  18182. 80081d6: 74fb strb r3, [r7, #19]
  18183. descidx = heth->RxDescList.RxBuildDescIdx;
  18184. 80081d8: 687b ldr r3, [r7, #4]
  18185. 80081da: 6e9b ldr r3, [r3, #104] @ 0x68
  18186. 80081dc: 61fb str r3, [r7, #28]
  18187. dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
  18188. 80081de: 687b ldr r3, [r7, #4]
  18189. 80081e0: 69fa ldr r2, [r7, #28]
  18190. 80081e2: 3212 adds r2, #18
  18191. 80081e4: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  18192. 80081e8: 617b str r3, [r7, #20]
  18193. desccount = heth->RxDescList.RxBuildDescCnt;
  18194. 80081ea: 687b ldr r3, [r7, #4]
  18195. 80081ec: 6edb ldr r3, [r3, #108] @ 0x6c
  18196. 80081ee: 61bb str r3, [r7, #24]
  18197. while ((desccount > 0U) && (allocStatus != 0U))
  18198. 80081f0: e038 b.n 8008264 <ETH_UpdateDescriptor+0x9c>
  18199. {
  18200. /* Check if a buffer's attached the descriptor */
  18201. if (READ_REG(dmarxdesc->BackupAddr0) == 0U)
  18202. 80081f2: 697b ldr r3, [r7, #20]
  18203. 80081f4: 691b ldr r3, [r3, #16]
  18204. 80081f6: 2b00 cmp r3, #0
  18205. 80081f8: d112 bne.n 8008220 <ETH_UpdateDescriptor+0x58>
  18206. #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
  18207. /*Call registered Allocate callback*/
  18208. heth->rxAllocateCallback(&buff);
  18209. #else
  18210. /* Allocate callback */
  18211. HAL_ETH_RxAllocateCallback(&buff);
  18212. 80081fa: f107 0308 add.w r3, r7, #8
  18213. 80081fe: 4618 mov r0, r3
  18214. 8008200: f008 f8d4 bl 80103ac <HAL_ETH_RxAllocateCallback>
  18215. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18216. if (buff == NULL)
  18217. 8008204: 68bb ldr r3, [r7, #8]
  18218. 8008206: 2b00 cmp r3, #0
  18219. 8008208: d102 bne.n 8008210 <ETH_UpdateDescriptor+0x48>
  18220. {
  18221. allocStatus = 0U;
  18222. 800820a: 2300 movs r3, #0
  18223. 800820c: 74fb strb r3, [r7, #19]
  18224. 800820e: e007 b.n 8008220 <ETH_UpdateDescriptor+0x58>
  18225. }
  18226. else
  18227. {
  18228. WRITE_REG(dmarxdesc->BackupAddr0, (uint32_t)buff);
  18229. 8008210: 68bb ldr r3, [r7, #8]
  18230. 8008212: 461a mov r2, r3
  18231. 8008214: 697b ldr r3, [r7, #20]
  18232. 8008216: 611a str r2, [r3, #16]
  18233. WRITE_REG(dmarxdesc->DESC0, (uint32_t)buff);
  18234. 8008218: 68bb ldr r3, [r7, #8]
  18235. 800821a: 461a mov r2, r3
  18236. 800821c: 697b ldr r3, [r7, #20]
  18237. 800821e: 601a str r2, [r3, #0]
  18238. }
  18239. }
  18240. if (allocStatus != 0U)
  18241. 8008220: 7cfb ldrb r3, [r7, #19]
  18242. 8008222: 2b00 cmp r3, #0
  18243. 8008224: d01e beq.n 8008264 <ETH_UpdateDescriptor+0x9c>
  18244. {
  18245. if (heth->RxDescList.ItMode != 0U)
  18246. 8008226: 687b ldr r3, [r7, #4]
  18247. 8008228: 6d9b ldr r3, [r3, #88] @ 0x58
  18248. 800822a: 2b00 cmp r3, #0
  18249. 800822c: d004 beq.n 8008238 <ETH_UpdateDescriptor+0x70>
  18250. {
  18251. WRITE_REG(dmarxdesc->DESC3, ETH_DMARXNDESCRF_OWN | ETH_DMARXNDESCRF_BUF1V | ETH_DMARXNDESCRF_IOC);
  18252. 800822e: 697b ldr r3, [r7, #20]
  18253. 8008230: f04f 4241 mov.w r2, #3238002688 @ 0xc1000000
  18254. 8008234: 60da str r2, [r3, #12]
  18255. 8008236: e003 b.n 8008240 <ETH_UpdateDescriptor+0x78>
  18256. }
  18257. else
  18258. {
  18259. WRITE_REG(dmarxdesc->DESC3, ETH_DMARXNDESCRF_OWN | ETH_DMARXNDESCRF_BUF1V);
  18260. 8008238: 697b ldr r3, [r7, #20]
  18261. 800823a: f04f 4201 mov.w r2, #2164260864 @ 0x81000000
  18262. 800823e: 60da str r2, [r3, #12]
  18263. }
  18264. /* Increment current rx descriptor index */
  18265. INCR_RX_DESC_INDEX(descidx, 1U);
  18266. 8008240: 69fb ldr r3, [r7, #28]
  18267. 8008242: 3301 adds r3, #1
  18268. 8008244: 61fb str r3, [r7, #28]
  18269. 8008246: 69fb ldr r3, [r7, #28]
  18270. 8008248: 2b03 cmp r3, #3
  18271. 800824a: d902 bls.n 8008252 <ETH_UpdateDescriptor+0x8a>
  18272. 800824c: 69fb ldr r3, [r7, #28]
  18273. 800824e: 3b04 subs r3, #4
  18274. 8008250: 61fb str r3, [r7, #28]
  18275. /* Get current descriptor address */
  18276. dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
  18277. 8008252: 687b ldr r3, [r7, #4]
  18278. 8008254: 69fa ldr r2, [r7, #28]
  18279. 8008256: 3212 adds r2, #18
  18280. 8008258: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  18281. 800825c: 617b str r3, [r7, #20]
  18282. desccount--;
  18283. 800825e: 69bb ldr r3, [r7, #24]
  18284. 8008260: 3b01 subs r3, #1
  18285. 8008262: 61bb str r3, [r7, #24]
  18286. while ((desccount > 0U) && (allocStatus != 0U))
  18287. 8008264: 69bb ldr r3, [r7, #24]
  18288. 8008266: 2b00 cmp r3, #0
  18289. 8008268: d002 beq.n 8008270 <ETH_UpdateDescriptor+0xa8>
  18290. 800826a: 7cfb ldrb r3, [r7, #19]
  18291. 800826c: 2b00 cmp r3, #0
  18292. 800826e: d1c0 bne.n 80081f2 <ETH_UpdateDescriptor+0x2a>
  18293. }
  18294. }
  18295. if (heth->RxDescList.RxBuildDescCnt != desccount)
  18296. 8008270: 687b ldr r3, [r7, #4]
  18297. 8008272: 6edb ldr r3, [r3, #108] @ 0x6c
  18298. 8008274: 69ba ldr r2, [r7, #24]
  18299. 8008276: 429a cmp r2, r3
  18300. 8008278: d01b beq.n 80082b2 <ETH_UpdateDescriptor+0xea>
  18301. {
  18302. /* Set the tail pointer index */
  18303. tailidx = (descidx + 1U) % ETH_RX_DESC_CNT;
  18304. 800827a: 69fb ldr r3, [r7, #28]
  18305. 800827c: 3301 adds r3, #1
  18306. 800827e: f003 0303 and.w r3, r3, #3
  18307. 8008282: 60fb str r3, [r7, #12]
  18308. __ASM volatile ("dmb 0xF":::"memory");
  18309. 8008284: f3bf 8f5f dmb sy
  18310. }
  18311. 8008288: bf00 nop
  18312. /* DMB instruction to avoid race condition */
  18313. __DMB();
  18314. /* Set the Tail pointer address */
  18315. WRITE_REG(heth->Instance->DMACRDTPR, ((uint32_t)(heth->Init.RxDesc + (tailidx))));
  18316. 800828a: 687b ldr r3, [r7, #4]
  18317. 800828c: 6919 ldr r1, [r3, #16]
  18318. 800828e: 68fa ldr r2, [r7, #12]
  18319. 8008290: 4613 mov r3, r2
  18320. 8008292: 005b lsls r3, r3, #1
  18321. 8008294: 4413 add r3, r2
  18322. 8008296: 00db lsls r3, r3, #3
  18323. 8008298: 18ca adds r2, r1, r3
  18324. 800829a: 687b ldr r3, [r7, #4]
  18325. 800829c: 681b ldr r3, [r3, #0]
  18326. 800829e: f503 5380 add.w r3, r3, #4096 @ 0x1000
  18327. 80082a2: f8c3 2128 str.w r2, [r3, #296] @ 0x128
  18328. heth->RxDescList.RxBuildDescIdx = descidx;
  18329. 80082a6: 687b ldr r3, [r7, #4]
  18330. 80082a8: 69fa ldr r2, [r7, #28]
  18331. 80082aa: 669a str r2, [r3, #104] @ 0x68
  18332. heth->RxDescList.RxBuildDescCnt = desccount;
  18333. 80082ac: 687b ldr r3, [r7, #4]
  18334. 80082ae: 69ba ldr r2, [r7, #24]
  18335. 80082b0: 66da str r2, [r3, #108] @ 0x6c
  18336. }
  18337. }
  18338. 80082b2: bf00 nop
  18339. 80082b4: 3720 adds r7, #32
  18340. 80082b6: 46bd mov sp, r7
  18341. 80082b8: bd80 pop {r7, pc}
  18342. 080082ba <HAL_ETH_ReleaseTxPacket>:
  18343. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  18344. * the configuration information for ETHERNET module
  18345. * @retval HAL status
  18346. */
  18347. HAL_StatusTypeDef HAL_ETH_ReleaseTxPacket(ETH_HandleTypeDef *heth)
  18348. {
  18349. 80082ba: b580 push {r7, lr}
  18350. 80082bc: b086 sub sp, #24
  18351. 80082be: af00 add r7, sp, #0
  18352. 80082c0: 6078 str r0, [r7, #4]
  18353. ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
  18354. 80082c2: 687b ldr r3, [r7, #4]
  18355. 80082c4: 3318 adds r3, #24
  18356. 80082c6: 60bb str r3, [r7, #8]
  18357. uint32_t numOfBuf = dmatxdesclist->BuffersInUse;
  18358. 80082c8: 68bb ldr r3, [r7, #8]
  18359. 80082ca: 6a9b ldr r3, [r3, #40] @ 0x28
  18360. 80082cc: 617b str r3, [r7, #20]
  18361. uint32_t idx = dmatxdesclist->releaseIndex;
  18362. 80082ce: 68bb ldr r3, [r7, #8]
  18363. 80082d0: 6adb ldr r3, [r3, #44] @ 0x2c
  18364. 80082d2: 613b str r3, [r7, #16]
  18365. uint8_t pktTxStatus = 1U;
  18366. 80082d4: 2301 movs r3, #1
  18367. 80082d6: 73fb strb r3, [r7, #15]
  18368. #ifdef HAL_ETH_USE_PTP
  18369. ETH_TimeStampTypeDef *timestamp = &heth->TxTimestamp;
  18370. #endif /* HAL_ETH_USE_PTP */
  18371. /* Loop through buffers in use. */
  18372. while ((numOfBuf != 0U) && (pktTxStatus != 0U))
  18373. 80082d8: e047 b.n 800836a <HAL_ETH_ReleaseTxPacket+0xb0>
  18374. {
  18375. pktInUse = 1U;
  18376. 80082da: 2301 movs r3, #1
  18377. 80082dc: 73bb strb r3, [r7, #14]
  18378. numOfBuf--;
  18379. 80082de: 697b ldr r3, [r7, #20]
  18380. 80082e0: 3b01 subs r3, #1
  18381. 80082e2: 617b str r3, [r7, #20]
  18382. /* If no packet, just examine the next packet. */
  18383. if (dmatxdesclist->PacketAddress[idx] == NULL)
  18384. 80082e4: 68ba ldr r2, [r7, #8]
  18385. 80082e6: 693b ldr r3, [r7, #16]
  18386. 80082e8: 3304 adds r3, #4
  18387. 80082ea: 009b lsls r3, r3, #2
  18388. 80082ec: 4413 add r3, r2
  18389. 80082ee: 685b ldr r3, [r3, #4]
  18390. 80082f0: 2b00 cmp r3, #0
  18391. 80082f2: d10a bne.n 800830a <HAL_ETH_ReleaseTxPacket+0x50>
  18392. {
  18393. /* No packet in use, skip to next. */
  18394. INCR_TX_DESC_INDEX(idx, 1U);
  18395. 80082f4: 693b ldr r3, [r7, #16]
  18396. 80082f6: 3301 adds r3, #1
  18397. 80082f8: 613b str r3, [r7, #16]
  18398. 80082fa: 693b ldr r3, [r7, #16]
  18399. 80082fc: 2b03 cmp r3, #3
  18400. 80082fe: d902 bls.n 8008306 <HAL_ETH_ReleaseTxPacket+0x4c>
  18401. 8008300: 693b ldr r3, [r7, #16]
  18402. 8008302: 3b04 subs r3, #4
  18403. 8008304: 613b str r3, [r7, #16]
  18404. pktInUse = 0U;
  18405. 8008306: 2300 movs r3, #0
  18406. 8008308: 73bb strb r3, [r7, #14]
  18407. }
  18408. if (pktInUse != 0U)
  18409. 800830a: 7bbb ldrb r3, [r7, #14]
  18410. 800830c: 2b00 cmp r3, #0
  18411. 800830e: d02c beq.n 800836a <HAL_ETH_ReleaseTxPacket+0xb0>
  18412. {
  18413. /* Determine if the packet has been transmitted. */
  18414. if ((heth->Init.TxDesc[idx].DESC3 & ETH_DMATXNDESCRF_OWN) == 0U)
  18415. 8008310: 687b ldr r3, [r7, #4]
  18416. 8008312: 68d9 ldr r1, [r3, #12]
  18417. 8008314: 693a ldr r2, [r7, #16]
  18418. 8008316: 4613 mov r3, r2
  18419. 8008318: 005b lsls r3, r3, #1
  18420. 800831a: 4413 add r3, r2
  18421. 800831c: 00db lsls r3, r3, #3
  18422. 800831e: 440b add r3, r1
  18423. 8008320: 68db ldr r3, [r3, #12]
  18424. 8008322: 2b00 cmp r3, #0
  18425. 8008324: db1f blt.n 8008366 <HAL_ETH_ReleaseTxPacket+0xac>
  18426. {
  18427. HAL_ETH_TxPtpCallback(dmatxdesclist->PacketAddress[idx], timestamp);
  18428. }
  18429. #endif /* HAL_ETH_USE_PTP */
  18430. /* Release the packet. */
  18431. HAL_ETH_TxFreeCallback(dmatxdesclist->PacketAddress[idx]);
  18432. 8008326: 68ba ldr r2, [r7, #8]
  18433. 8008328: 693b ldr r3, [r7, #16]
  18434. 800832a: 3304 adds r3, #4
  18435. 800832c: 009b lsls r3, r3, #2
  18436. 800832e: 4413 add r3, r2
  18437. 8008330: 685b ldr r3, [r3, #4]
  18438. 8008332: 4618 mov r0, r3
  18439. 8008334: f008 f8d2 bl 80104dc <HAL_ETH_TxFreeCallback>
  18440. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18441. /* Clear the entry in the in-use array. */
  18442. dmatxdesclist->PacketAddress[idx] = NULL;
  18443. 8008338: 68ba ldr r2, [r7, #8]
  18444. 800833a: 693b ldr r3, [r7, #16]
  18445. 800833c: 3304 adds r3, #4
  18446. 800833e: 009b lsls r3, r3, #2
  18447. 8008340: 4413 add r3, r2
  18448. 8008342: 2200 movs r2, #0
  18449. 8008344: 605a str r2, [r3, #4]
  18450. /* Update the transmit relesae index and number of buffers in use. */
  18451. INCR_TX_DESC_INDEX(idx, 1U);
  18452. 8008346: 693b ldr r3, [r7, #16]
  18453. 8008348: 3301 adds r3, #1
  18454. 800834a: 613b str r3, [r7, #16]
  18455. 800834c: 693b ldr r3, [r7, #16]
  18456. 800834e: 2b03 cmp r3, #3
  18457. 8008350: d902 bls.n 8008358 <HAL_ETH_ReleaseTxPacket+0x9e>
  18458. 8008352: 693b ldr r3, [r7, #16]
  18459. 8008354: 3b04 subs r3, #4
  18460. 8008356: 613b str r3, [r7, #16]
  18461. dmatxdesclist->BuffersInUse = numOfBuf;
  18462. 8008358: 68bb ldr r3, [r7, #8]
  18463. 800835a: 697a ldr r2, [r7, #20]
  18464. 800835c: 629a str r2, [r3, #40] @ 0x28
  18465. dmatxdesclist->releaseIndex = idx;
  18466. 800835e: 68bb ldr r3, [r7, #8]
  18467. 8008360: 693a ldr r2, [r7, #16]
  18468. 8008362: 62da str r2, [r3, #44] @ 0x2c
  18469. 8008364: e001 b.n 800836a <HAL_ETH_ReleaseTxPacket+0xb0>
  18470. }
  18471. else
  18472. {
  18473. /* Get out of the loop! */
  18474. pktTxStatus = 0U;
  18475. 8008366: 2300 movs r3, #0
  18476. 8008368: 73fb strb r3, [r7, #15]
  18477. while ((numOfBuf != 0U) && (pktTxStatus != 0U))
  18478. 800836a: 697b ldr r3, [r7, #20]
  18479. 800836c: 2b00 cmp r3, #0
  18480. 800836e: d002 beq.n 8008376 <HAL_ETH_ReleaseTxPacket+0xbc>
  18481. 8008370: 7bfb ldrb r3, [r7, #15]
  18482. 8008372: 2b00 cmp r3, #0
  18483. 8008374: d1b1 bne.n 80082da <HAL_ETH_ReleaseTxPacket+0x20>
  18484. }
  18485. }
  18486. }
  18487. return HAL_OK;
  18488. 8008376: 2300 movs r3, #0
  18489. }
  18490. 8008378: 4618 mov r0, r3
  18491. 800837a: 3718 adds r7, #24
  18492. 800837c: 46bd mov sp, r7
  18493. 800837e: bd80 pop {r7, pc}
  18494. 08008380 <HAL_ETH_IRQHandler>:
  18495. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  18496. * the configuration information for ETHERNET module
  18497. * @retval HAL status
  18498. */
  18499. void HAL_ETH_IRQHandler(ETH_HandleTypeDef *heth)
  18500. {
  18501. 8008380: b580 push {r7, lr}
  18502. 8008382: b086 sub sp, #24
  18503. 8008384: af00 add r7, sp, #0
  18504. 8008386: 6078 str r0, [r7, #4]
  18505. uint32_t mac_flag = READ_REG(heth->Instance->MACISR);
  18506. 8008388: 687b ldr r3, [r7, #4]
  18507. 800838a: 681b ldr r3, [r3, #0]
  18508. 800838c: f8d3 30b0 ldr.w r3, [r3, #176] @ 0xb0
  18509. 8008390: 617b str r3, [r7, #20]
  18510. uint32_t dma_flag = READ_REG(heth->Instance->DMACSR);
  18511. 8008392: 687b ldr r3, [r7, #4]
  18512. 8008394: 681b ldr r3, [r3, #0]
  18513. 8008396: f503 5380 add.w r3, r3, #4096 @ 0x1000
  18514. 800839a: f8d3 3160 ldr.w r3, [r3, #352] @ 0x160
  18515. 800839e: 613b str r3, [r7, #16]
  18516. uint32_t dma_itsource = READ_REG(heth->Instance->DMACIER);
  18517. 80083a0: 687b ldr r3, [r7, #4]
  18518. 80083a2: 681b ldr r3, [r3, #0]
  18519. 80083a4: f503 5380 add.w r3, r3, #4096 @ 0x1000
  18520. 80083a8: f8d3 3134 ldr.w r3, [r3, #308] @ 0x134
  18521. 80083ac: 60fb str r3, [r7, #12]
  18522. uint32_t exti_d1_flag = READ_REG(EXTI_D1->PR3);
  18523. 80083ae: 4b6d ldr r3, [pc, #436] @ (8008564 <HAL_ETH_IRQHandler+0x1e4>)
  18524. 80083b0: 6a9b ldr r3, [r3, #40] @ 0x28
  18525. 80083b2: 60bb str r3, [r7, #8]
  18526. #if defined(DUAL_CORE)
  18527. uint32_t exti_d2_flag = READ_REG(EXTI_D2->PR3);
  18528. #endif /* DUAL_CORE */
  18529. /* Packet received */
  18530. if (((dma_flag & ETH_DMACSR_RI) != 0U) && ((dma_itsource & ETH_DMACIER_RIE) != 0U))
  18531. 80083b4: 693b ldr r3, [r7, #16]
  18532. 80083b6: f003 0340 and.w r3, r3, #64 @ 0x40
  18533. 80083ba: 2b00 cmp r3, #0
  18534. 80083bc: d010 beq.n 80083e0 <HAL_ETH_IRQHandler+0x60>
  18535. 80083be: 68fb ldr r3, [r7, #12]
  18536. 80083c0: f003 0340 and.w r3, r3, #64 @ 0x40
  18537. 80083c4: 2b00 cmp r3, #0
  18538. 80083c6: d00b beq.n 80083e0 <HAL_ETH_IRQHandler+0x60>
  18539. {
  18540. /* Clear the Eth DMA Rx IT pending bits */
  18541. __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMACSR_RI | ETH_DMACSR_NIS);
  18542. 80083c8: 687b ldr r3, [r7, #4]
  18543. 80083ca: 681b ldr r3, [r3, #0]
  18544. 80083cc: f503 5380 add.w r3, r3, #4096 @ 0x1000
  18545. 80083d0: 461a mov r2, r3
  18546. 80083d2: f248 0340 movw r3, #32832 @ 0x8040
  18547. 80083d6: f8c2 3160 str.w r3, [r2, #352] @ 0x160
  18548. #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
  18549. /*Call registered Receive complete callback*/
  18550. heth->RxCpltCallback(heth);
  18551. #else
  18552. /* Receive complete callback */
  18553. HAL_ETH_RxCpltCallback(heth);
  18554. 80083da: 6878 ldr r0, [r7, #4]
  18555. 80083dc: f007 fb6e bl 800fabc <HAL_ETH_RxCpltCallback>
  18556. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18557. }
  18558. /* Packet transmitted */
  18559. if (((dma_flag & ETH_DMACSR_TI) != 0U) && ((dma_itsource & ETH_DMACIER_TIE) != 0U))
  18560. 80083e0: 693b ldr r3, [r7, #16]
  18561. 80083e2: f003 0301 and.w r3, r3, #1
  18562. 80083e6: 2b00 cmp r3, #0
  18563. 80083e8: d010 beq.n 800840c <HAL_ETH_IRQHandler+0x8c>
  18564. 80083ea: 68fb ldr r3, [r7, #12]
  18565. 80083ec: f003 0301 and.w r3, r3, #1
  18566. 80083f0: 2b00 cmp r3, #0
  18567. 80083f2: d00b beq.n 800840c <HAL_ETH_IRQHandler+0x8c>
  18568. {
  18569. /* Clear the Eth DMA Tx IT pending bits */
  18570. __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMACSR_TI | ETH_DMACSR_NIS);
  18571. 80083f4: 687b ldr r3, [r7, #4]
  18572. 80083f6: 681b ldr r3, [r3, #0]
  18573. 80083f8: f503 5380 add.w r3, r3, #4096 @ 0x1000
  18574. 80083fc: 461a mov r2, r3
  18575. 80083fe: f248 0301 movw r3, #32769 @ 0x8001
  18576. 8008402: f8c2 3160 str.w r3, [r2, #352] @ 0x160
  18577. #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
  18578. /*Call registered Transmit complete callback*/
  18579. heth->TxCpltCallback(heth);
  18580. #else
  18581. /* Transfer complete callback */
  18582. HAL_ETH_TxCpltCallback(heth);
  18583. 8008406: 6878 ldr r0, [r7, #4]
  18584. 8008408: f007 fb68 bl 800fadc <HAL_ETH_TxCpltCallback>
  18585. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18586. }
  18587. /* ETH DMA Error */
  18588. if (((dma_flag & ETH_DMACSR_AIS) != 0U) && ((dma_itsource & ETH_DMACIER_AIE) != 0U))
  18589. 800840c: 693b ldr r3, [r7, #16]
  18590. 800840e: f403 4380 and.w r3, r3, #16384 @ 0x4000
  18591. 8008412: 2b00 cmp r3, #0
  18592. 8008414: d047 beq.n 80084a6 <HAL_ETH_IRQHandler+0x126>
  18593. 8008416: 68fb ldr r3, [r7, #12]
  18594. 8008418: f403 4380 and.w r3, r3, #16384 @ 0x4000
  18595. 800841c: 2b00 cmp r3, #0
  18596. 800841e: d042 beq.n 80084a6 <HAL_ETH_IRQHandler+0x126>
  18597. {
  18598. heth->ErrorCode |= HAL_ETH_ERROR_DMA;
  18599. 8008420: 687b ldr r3, [r7, #4]
  18600. 8008422: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  18601. 8008426: f043 0208 orr.w r2, r3, #8
  18602. 800842a: 687b ldr r3, [r7, #4]
  18603. 800842c: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  18604. /* if fatal bus error occurred */
  18605. if ((dma_flag & ETH_DMACSR_FBE) != 0U)
  18606. 8008430: 693b ldr r3, [r7, #16]
  18607. 8008432: f403 5380 and.w r3, r3, #4096 @ 0x1000
  18608. 8008436: 2b00 cmp r3, #0
  18609. 8008438: d01e beq.n 8008478 <HAL_ETH_IRQHandler+0xf8>
  18610. {
  18611. /* Get DMA error code */
  18612. heth->DMAErrorCode = READ_BIT(heth->Instance->DMACSR, (ETH_DMACSR_FBE | ETH_DMACSR_TPS | ETH_DMACSR_RPS));
  18613. 800843a: 687b ldr r3, [r7, #4]
  18614. 800843c: 681b ldr r3, [r3, #0]
  18615. 800843e: f503 5380 add.w r3, r3, #4096 @ 0x1000
  18616. 8008442: f8d3 2160 ldr.w r2, [r3, #352] @ 0x160
  18617. 8008446: f241 1302 movw r3, #4354 @ 0x1102
  18618. 800844a: 4013 ands r3, r2
  18619. 800844c: 687a ldr r2, [r7, #4]
  18620. 800844e: f8c2 308c str.w r3, [r2, #140] @ 0x8c
  18621. /* Disable all interrupts */
  18622. __HAL_ETH_DMA_DISABLE_IT(heth, ETH_DMACIER_NIE | ETH_DMACIER_AIE);
  18623. 8008452: 687b ldr r3, [r7, #4]
  18624. 8008454: 681b ldr r3, [r3, #0]
  18625. 8008456: f503 5380 add.w r3, r3, #4096 @ 0x1000
  18626. 800845a: f8d3 3134 ldr.w r3, [r3, #308] @ 0x134
  18627. 800845e: 687a ldr r2, [r7, #4]
  18628. 8008460: 6812 ldr r2, [r2, #0]
  18629. 8008462: f423 4340 bic.w r3, r3, #49152 @ 0xc000
  18630. 8008466: f502 5280 add.w r2, r2, #4096 @ 0x1000
  18631. 800846a: f8c2 3134 str.w r3, [r2, #308] @ 0x134
  18632. /* Set HAL state to ERROR */
  18633. heth->gState = HAL_ETH_STATE_ERROR;
  18634. 800846e: 687b ldr r3, [r7, #4]
  18635. 8008470: 22e0 movs r2, #224 @ 0xe0
  18636. 8008472: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  18637. 8008476: e013 b.n 80084a0 <HAL_ETH_IRQHandler+0x120>
  18638. }
  18639. else
  18640. {
  18641. /* Get DMA error status */
  18642. heth->DMAErrorCode = READ_BIT(heth->Instance->DMACSR, (ETH_DMACSR_CDE | ETH_DMACSR_ETI | ETH_DMACSR_RWT |
  18643. 8008478: 687b ldr r3, [r7, #4]
  18644. 800847a: 681b ldr r3, [r3, #0]
  18645. 800847c: f503 5380 add.w r3, r3, #4096 @ 0x1000
  18646. 8008480: f8d3 3160 ldr.w r3, [r3, #352] @ 0x160
  18647. 8008484: f403 42cd and.w r2, r3, #26240 @ 0x6680
  18648. 8008488: 687b ldr r3, [r7, #4]
  18649. 800848a: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  18650. ETH_DMACSR_RBU | ETH_DMACSR_AIS));
  18651. /* Clear the interrupt summary flag */
  18652. __HAL_ETH_DMA_CLEAR_IT(heth, (ETH_DMACSR_CDE | ETH_DMACSR_ETI | ETH_DMACSR_RWT |
  18653. 800848e: 687b ldr r3, [r7, #4]
  18654. 8008490: 681b ldr r3, [r3, #0]
  18655. 8008492: f503 5380 add.w r3, r3, #4096 @ 0x1000
  18656. 8008496: 461a mov r2, r3
  18657. 8008498: f44f 43cd mov.w r3, #26240 @ 0x6680
  18658. 800849c: f8c2 3160 str.w r3, [r2, #352] @ 0x160
  18659. #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
  18660. /* Call registered Error callback*/
  18661. heth->ErrorCallback(heth);
  18662. #else
  18663. /* Ethernet DMA Error callback */
  18664. HAL_ETH_ErrorCallback(heth);
  18665. 80084a0: 6878 ldr r0, [r7, #4]
  18666. 80084a2: f007 fb2b bl 800fafc <HAL_ETH_ErrorCallback>
  18667. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18668. }
  18669. /* ETH MAC Error IT */
  18670. if (((mac_flag & ETH_MACIER_RXSTSIE) == ETH_MACIER_RXSTSIE) || \
  18671. 80084a6: 697b ldr r3, [r7, #20]
  18672. 80084a8: f403 4380 and.w r3, r3, #16384 @ 0x4000
  18673. 80084ac: 2b00 cmp r3, #0
  18674. 80084ae: d104 bne.n 80084ba <HAL_ETH_IRQHandler+0x13a>
  18675. ((mac_flag & ETH_MACIER_TXSTSIE) == ETH_MACIER_TXSTSIE))
  18676. 80084b0: 697b ldr r3, [r7, #20]
  18677. 80084b2: f403 5300 and.w r3, r3, #8192 @ 0x2000
  18678. if (((mac_flag & ETH_MACIER_RXSTSIE) == ETH_MACIER_RXSTSIE) || \
  18679. 80084b6: 2b00 cmp r3, #0
  18680. 80084b8: d019 beq.n 80084ee <HAL_ETH_IRQHandler+0x16e>
  18681. {
  18682. heth->ErrorCode |= HAL_ETH_ERROR_MAC;
  18683. 80084ba: 687b ldr r3, [r7, #4]
  18684. 80084bc: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  18685. 80084c0: f043 0210 orr.w r2, r3, #16
  18686. 80084c4: 687b ldr r3, [r7, #4]
  18687. 80084c6: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  18688. /* Get MAC Rx Tx status and clear Status register pending bit */
  18689. heth->MACErrorCode = READ_REG(heth->Instance->MACRXTXSR);
  18690. 80084ca: 687b ldr r3, [r7, #4]
  18691. 80084cc: 681b ldr r3, [r3, #0]
  18692. 80084ce: f8d3 20b8 ldr.w r2, [r3, #184] @ 0xb8
  18693. 80084d2: 687b ldr r3, [r7, #4]
  18694. 80084d4: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  18695. heth->gState = HAL_ETH_STATE_ERROR;
  18696. 80084d8: 687b ldr r3, [r7, #4]
  18697. 80084da: 22e0 movs r2, #224 @ 0xe0
  18698. 80084dc: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  18699. #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
  18700. /* Call registered Error callback*/
  18701. heth->ErrorCallback(heth);
  18702. #else
  18703. /* Ethernet Error callback */
  18704. HAL_ETH_ErrorCallback(heth);
  18705. 80084e0: 6878 ldr r0, [r7, #4]
  18706. 80084e2: f007 fb0b bl 800fafc <HAL_ETH_ErrorCallback>
  18707. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18708. heth->MACErrorCode = (uint32_t)(0x0U);
  18709. 80084e6: 687b ldr r3, [r7, #4]
  18710. 80084e8: 2200 movs r2, #0
  18711. 80084ea: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  18712. }
  18713. /* ETH PMT IT */
  18714. if ((mac_flag & ETH_MAC_PMT_IT) != 0U)
  18715. 80084ee: 697b ldr r3, [r7, #20]
  18716. 80084f0: f003 0310 and.w r3, r3, #16
  18717. 80084f4: 2b00 cmp r3, #0
  18718. 80084f6: d00f beq.n 8008518 <HAL_ETH_IRQHandler+0x198>
  18719. {
  18720. /* Get MAC Wake-up source and clear the status register pending bit */
  18721. heth->MACWakeUpEvent = READ_BIT(heth->Instance->MACPCSR, (ETH_MACPCSR_RWKPRCVD | ETH_MACPCSR_MGKPRCVD));
  18722. 80084f8: 687b ldr r3, [r7, #4]
  18723. 80084fa: 681b ldr r3, [r3, #0]
  18724. 80084fc: f8d3 30c0 ldr.w r3, [r3, #192] @ 0xc0
  18725. 8008500: f003 0260 and.w r2, r3, #96 @ 0x60
  18726. 8008504: 687b ldr r3, [r7, #4]
  18727. 8008506: f8c3 2094 str.w r2, [r3, #148] @ 0x94
  18728. #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
  18729. /* Call registered PMT callback*/
  18730. heth->PMTCallback(heth);
  18731. #else
  18732. /* Ethernet PMT callback */
  18733. HAL_ETH_PMTCallback(heth);
  18734. 800850a: 6878 ldr r0, [r7, #4]
  18735. 800850c: f000 f82c bl 8008568 <HAL_ETH_PMTCallback>
  18736. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18737. heth->MACWakeUpEvent = (uint32_t)(0x0U);
  18738. 8008510: 687b ldr r3, [r7, #4]
  18739. 8008512: 2200 movs r2, #0
  18740. 8008514: f8c3 2094 str.w r2, [r3, #148] @ 0x94
  18741. }
  18742. /* ETH EEE IT */
  18743. if ((mac_flag & ETH_MAC_LPI_IT) != 0U)
  18744. 8008518: 697b ldr r3, [r7, #20]
  18745. 800851a: f003 0320 and.w r3, r3, #32
  18746. 800851e: 2b00 cmp r3, #0
  18747. 8008520: d00f beq.n 8008542 <HAL_ETH_IRQHandler+0x1c2>
  18748. {
  18749. /* Get MAC LPI interrupt source and clear the status register pending bit */
  18750. heth->MACLPIEvent = READ_BIT(heth->Instance->MACLCSR, 0x0000000FU);
  18751. 8008522: 687b ldr r3, [r7, #4]
  18752. 8008524: 681b ldr r3, [r3, #0]
  18753. 8008526: f8d3 30d0 ldr.w r3, [r3, #208] @ 0xd0
  18754. 800852a: f003 020f and.w r2, r3, #15
  18755. 800852e: 687b ldr r3, [r7, #4]
  18756. 8008530: f8c3 2098 str.w r2, [r3, #152] @ 0x98
  18757. #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
  18758. /* Call registered EEE callback*/
  18759. heth->EEECallback(heth);
  18760. #else
  18761. /* Ethernet EEE callback */
  18762. HAL_ETH_EEECallback(heth);
  18763. 8008534: 6878 ldr r0, [r7, #4]
  18764. 8008536: f000 f821 bl 800857c <HAL_ETH_EEECallback>
  18765. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18766. heth->MACLPIEvent = (uint32_t)(0x0U);
  18767. 800853a: 687b ldr r3, [r7, #4]
  18768. 800853c: 2200 movs r2, #0
  18769. 800853e: f8c3 2098 str.w r2, [r3, #152] @ 0x98
  18770. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18771. }
  18772. }
  18773. #else /* DUAL_CORE not defined */
  18774. /* check ETH WAKEUP exti flag */
  18775. if ((exti_d1_flag & ETH_WAKEUP_EXTI_LINE) != 0U)
  18776. 8008542: 68bb ldr r3, [r7, #8]
  18777. 8008544: f403 0380 and.w r3, r3, #4194304 @ 0x400000
  18778. 8008548: 2b00 cmp r3, #0
  18779. 800854a: d006 beq.n 800855a <HAL_ETH_IRQHandler+0x1da>
  18780. {
  18781. /* Clear ETH WAKEUP Exti pending bit */
  18782. __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG(ETH_WAKEUP_EXTI_LINE);
  18783. 800854c: 4b05 ldr r3, [pc, #20] @ (8008564 <HAL_ETH_IRQHandler+0x1e4>)
  18784. 800854e: f44f 0280 mov.w r2, #4194304 @ 0x400000
  18785. 8008552: 629a str r2, [r3, #40] @ 0x28
  18786. #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
  18787. /* Call registered WakeUp callback*/
  18788. heth->WakeUpCallback(heth);
  18789. #else
  18790. /* ETH WAKEUP callback */
  18791. HAL_ETH_WakeUpCallback(heth);
  18792. 8008554: 6878 ldr r0, [r7, #4]
  18793. 8008556: f000 f81b bl 8008590 <HAL_ETH_WakeUpCallback>
  18794. #endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
  18795. }
  18796. #endif /* DUAL_CORE */
  18797. }
  18798. 800855a: bf00 nop
  18799. 800855c: 3718 adds r7, #24
  18800. 800855e: 46bd mov sp, r7
  18801. 8008560: bd80 pop {r7, pc}
  18802. 8008562: bf00 nop
  18803. 8008564: 58000080 .word 0x58000080
  18804. 08008568 <HAL_ETH_PMTCallback>:
  18805. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  18806. * the configuration information for ETHERNET module
  18807. * @retval None
  18808. */
  18809. __weak void HAL_ETH_PMTCallback(ETH_HandleTypeDef *heth)
  18810. {
  18811. 8008568: b480 push {r7}
  18812. 800856a: b083 sub sp, #12
  18813. 800856c: af00 add r7, sp, #0
  18814. 800856e: 6078 str r0, [r7, #4]
  18815. /* Prevent unused argument(s) compilation warning */
  18816. UNUSED(heth);
  18817. /* NOTE : This function Should not be modified, when the callback is needed,
  18818. the HAL_ETH_PMTCallback could be implemented in the user file
  18819. */
  18820. }
  18821. 8008570: bf00 nop
  18822. 8008572: 370c adds r7, #12
  18823. 8008574: 46bd mov sp, r7
  18824. 8008576: f85d 7b04 ldr.w r7, [sp], #4
  18825. 800857a: 4770 bx lr
  18826. 0800857c <HAL_ETH_EEECallback>:
  18827. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  18828. * the configuration information for ETHERNET module
  18829. * @retval None
  18830. */
  18831. __weak void HAL_ETH_EEECallback(ETH_HandleTypeDef *heth)
  18832. {
  18833. 800857c: b480 push {r7}
  18834. 800857e: b083 sub sp, #12
  18835. 8008580: af00 add r7, sp, #0
  18836. 8008582: 6078 str r0, [r7, #4]
  18837. /* Prevent unused argument(s) compilation warning */
  18838. UNUSED(heth);
  18839. /* NOTE : This function Should not be modified, when the callback is needed,
  18840. the HAL_ETH_EEECallback could be implemented in the user file
  18841. */
  18842. }
  18843. 8008584: bf00 nop
  18844. 8008586: 370c adds r7, #12
  18845. 8008588: 46bd mov sp, r7
  18846. 800858a: f85d 7b04 ldr.w r7, [sp], #4
  18847. 800858e: 4770 bx lr
  18848. 08008590 <HAL_ETH_WakeUpCallback>:
  18849. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  18850. * the configuration information for ETHERNET module
  18851. * @retval None
  18852. */
  18853. __weak void HAL_ETH_WakeUpCallback(ETH_HandleTypeDef *heth)
  18854. {
  18855. 8008590: b480 push {r7}
  18856. 8008592: b083 sub sp, #12
  18857. 8008594: af00 add r7, sp, #0
  18858. 8008596: 6078 str r0, [r7, #4]
  18859. /* Prevent unused argument(s) compilation warning */
  18860. UNUSED(heth);
  18861. /* NOTE : This function Should not be modified, when the callback is needed,
  18862. the HAL_ETH_WakeUpCallback could be implemented in the user file
  18863. */
  18864. }
  18865. 8008598: bf00 nop
  18866. 800859a: 370c adds r7, #12
  18867. 800859c: 46bd mov sp, r7
  18868. 800859e: f85d 7b04 ldr.w r7, [sp], #4
  18869. 80085a2: 4770 bx lr
  18870. 080085a4 <HAL_ETH_ReadPHYRegister>:
  18871. * @param pRegValue: parameter to hold read value
  18872. * @retval HAL status
  18873. */
  18874. HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg,
  18875. uint32_t *pRegValue)
  18876. {
  18877. 80085a4: b580 push {r7, lr}
  18878. 80085a6: b086 sub sp, #24
  18879. 80085a8: af00 add r7, sp, #0
  18880. 80085aa: 60f8 str r0, [r7, #12]
  18881. 80085ac: 60b9 str r1, [r7, #8]
  18882. 80085ae: 607a str r2, [r7, #4]
  18883. 80085b0: 603b str r3, [r7, #0]
  18884. uint32_t tickstart;
  18885. uint32_t tmpreg;
  18886. /* Check for the Busy flag */
  18887. if (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) != (uint32_t)RESET)
  18888. 80085b2: 68fb ldr r3, [r7, #12]
  18889. 80085b4: 681b ldr r3, [r3, #0]
  18890. 80085b6: f8d3 3200 ldr.w r3, [r3, #512] @ 0x200
  18891. 80085ba: f003 0301 and.w r3, r3, #1
  18892. 80085be: 2b00 cmp r3, #0
  18893. 80085c0: d001 beq.n 80085c6 <HAL_ETH_ReadPHYRegister+0x22>
  18894. {
  18895. return HAL_ERROR;
  18896. 80085c2: 2301 movs r3, #1
  18897. 80085c4: e03e b.n 8008644 <HAL_ETH_ReadPHYRegister+0xa0>
  18898. }
  18899. /* Get the MACMDIOAR value */
  18900. WRITE_REG(tmpreg, heth->Instance->MACMDIOAR);
  18901. 80085c6: 68fb ldr r3, [r7, #12]
  18902. 80085c8: 681b ldr r3, [r3, #0]
  18903. 80085ca: f8d3 3200 ldr.w r3, [r3, #512] @ 0x200
  18904. 80085ce: 617b str r3, [r7, #20]
  18905. - Set the PHY device address
  18906. - Set the PHY register address
  18907. - Set the read mode
  18908. - Set the MII Busy bit */
  18909. MODIFY_REG(tmpreg, ETH_MACMDIOAR_PA, (PHYAddr << 21));
  18910. 80085d0: 697b ldr r3, [r7, #20]
  18911. 80085d2: f023 7278 bic.w r2, r3, #65011712 @ 0x3e00000
  18912. 80085d6: 68bb ldr r3, [r7, #8]
  18913. 80085d8: 055b lsls r3, r3, #21
  18914. 80085da: 4313 orrs r3, r2
  18915. 80085dc: 617b str r3, [r7, #20]
  18916. MODIFY_REG(tmpreg, ETH_MACMDIOAR_RDA, (PHYReg << 16));
  18917. 80085de: 697b ldr r3, [r7, #20]
  18918. 80085e0: f423 12f8 bic.w r2, r3, #2031616 @ 0x1f0000
  18919. 80085e4: 687b ldr r3, [r7, #4]
  18920. 80085e6: 041b lsls r3, r3, #16
  18921. 80085e8: 4313 orrs r3, r2
  18922. 80085ea: 617b str r3, [r7, #20]
  18923. MODIFY_REG(tmpreg, ETH_MACMDIOAR_MOC, ETH_MACMDIOAR_MOC_RD);
  18924. 80085ec: 697b ldr r3, [r7, #20]
  18925. 80085ee: f043 030c orr.w r3, r3, #12
  18926. 80085f2: 617b str r3, [r7, #20]
  18927. SET_BIT(tmpreg, ETH_MACMDIOAR_MB);
  18928. 80085f4: 697b ldr r3, [r7, #20]
  18929. 80085f6: f043 0301 orr.w r3, r3, #1
  18930. 80085fa: 617b str r3, [r7, #20]
  18931. /* Write the result value into the MDII Address register */
  18932. WRITE_REG(heth->Instance->MACMDIOAR, tmpreg);
  18933. 80085fc: 68fb ldr r3, [r7, #12]
  18934. 80085fe: 681b ldr r3, [r3, #0]
  18935. 8008600: 697a ldr r2, [r7, #20]
  18936. 8008602: f8c3 2200 str.w r2, [r3, #512] @ 0x200
  18937. tickstart = HAL_GetTick();
  18938. 8008606: f7fc fd13 bl 8005030 <HAL_GetTick>
  18939. 800860a: 6138 str r0, [r7, #16]
  18940. /* Wait for the Busy flag */
  18941. while (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) > 0U)
  18942. 800860c: e009 b.n 8008622 <HAL_ETH_ReadPHYRegister+0x7e>
  18943. {
  18944. if (((HAL_GetTick() - tickstart) > ETH_MDIO_BUS_TIMEOUT))
  18945. 800860e: f7fc fd0f bl 8005030 <HAL_GetTick>
  18946. 8008612: 4602 mov r2, r0
  18947. 8008614: 693b ldr r3, [r7, #16]
  18948. 8008616: 1ad3 subs r3, r2, r3
  18949. 8008618: f5b3 7f7a cmp.w r3, #1000 @ 0x3e8
  18950. 800861c: d901 bls.n 8008622 <HAL_ETH_ReadPHYRegister+0x7e>
  18951. {
  18952. return HAL_ERROR;
  18953. 800861e: 2301 movs r3, #1
  18954. 8008620: e010 b.n 8008644 <HAL_ETH_ReadPHYRegister+0xa0>
  18955. while (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) > 0U)
  18956. 8008622: 68fb ldr r3, [r7, #12]
  18957. 8008624: 681b ldr r3, [r3, #0]
  18958. 8008626: f8d3 3200 ldr.w r3, [r3, #512] @ 0x200
  18959. 800862a: f003 0301 and.w r3, r3, #1
  18960. 800862e: 2b00 cmp r3, #0
  18961. 8008630: d1ed bne.n 800860e <HAL_ETH_ReadPHYRegister+0x6a>
  18962. }
  18963. }
  18964. /* Get MACMIIDR value */
  18965. WRITE_REG(*pRegValue, (uint16_t)heth->Instance->MACMDIODR);
  18966. 8008632: 68fb ldr r3, [r7, #12]
  18967. 8008634: 681b ldr r3, [r3, #0]
  18968. 8008636: f8d3 3204 ldr.w r3, [r3, #516] @ 0x204
  18969. 800863a: b29b uxth r3, r3
  18970. 800863c: 461a mov r2, r3
  18971. 800863e: 683b ldr r3, [r7, #0]
  18972. 8008640: 601a str r2, [r3, #0]
  18973. return HAL_OK;
  18974. 8008642: 2300 movs r3, #0
  18975. }
  18976. 8008644: 4618 mov r0, r3
  18977. 8008646: 3718 adds r7, #24
  18978. 8008648: 46bd mov sp, r7
  18979. 800864a: bd80 pop {r7, pc}
  18980. 0800864c <HAL_ETH_WritePHYRegister>:
  18981. * @param RegValue: the value to write
  18982. * @retval HAL status
  18983. */
  18984. HAL_StatusTypeDef HAL_ETH_WritePHYRegister(const ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg,
  18985. uint32_t RegValue)
  18986. {
  18987. 800864c: b580 push {r7, lr}
  18988. 800864e: b086 sub sp, #24
  18989. 8008650: af00 add r7, sp, #0
  18990. 8008652: 60f8 str r0, [r7, #12]
  18991. 8008654: 60b9 str r1, [r7, #8]
  18992. 8008656: 607a str r2, [r7, #4]
  18993. 8008658: 603b str r3, [r7, #0]
  18994. uint32_t tickstart;
  18995. uint32_t tmpreg;
  18996. /* Check for the Busy flag */
  18997. if (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) != (uint32_t)RESET)
  18998. 800865a: 68fb ldr r3, [r7, #12]
  18999. 800865c: 681b ldr r3, [r3, #0]
  19000. 800865e: f8d3 3200 ldr.w r3, [r3, #512] @ 0x200
  19001. 8008662: f003 0301 and.w r3, r3, #1
  19002. 8008666: 2b00 cmp r3, #0
  19003. 8008668: d001 beq.n 800866e <HAL_ETH_WritePHYRegister+0x22>
  19004. {
  19005. return HAL_ERROR;
  19006. 800866a: 2301 movs r3, #1
  19007. 800866c: e03c b.n 80086e8 <HAL_ETH_WritePHYRegister+0x9c>
  19008. }
  19009. /* Get the MACMDIOAR value */
  19010. WRITE_REG(tmpreg, heth->Instance->MACMDIOAR);
  19011. 800866e: 68fb ldr r3, [r7, #12]
  19012. 8008670: 681b ldr r3, [r3, #0]
  19013. 8008672: f8d3 3200 ldr.w r3, [r3, #512] @ 0x200
  19014. 8008676: 617b str r3, [r7, #20]
  19015. - Set the PHY device address
  19016. - Set the PHY register address
  19017. - Set the write mode
  19018. - Set the MII Busy bit */
  19019. MODIFY_REG(tmpreg, ETH_MACMDIOAR_PA, (PHYAddr << 21));
  19020. 8008678: 697b ldr r3, [r7, #20]
  19021. 800867a: f023 7278 bic.w r2, r3, #65011712 @ 0x3e00000
  19022. 800867e: 68bb ldr r3, [r7, #8]
  19023. 8008680: 055b lsls r3, r3, #21
  19024. 8008682: 4313 orrs r3, r2
  19025. 8008684: 617b str r3, [r7, #20]
  19026. MODIFY_REG(tmpreg, ETH_MACMDIOAR_RDA, (PHYReg << 16));
  19027. 8008686: 697b ldr r3, [r7, #20]
  19028. 8008688: f423 12f8 bic.w r2, r3, #2031616 @ 0x1f0000
  19029. 800868c: 687b ldr r3, [r7, #4]
  19030. 800868e: 041b lsls r3, r3, #16
  19031. 8008690: 4313 orrs r3, r2
  19032. 8008692: 617b str r3, [r7, #20]
  19033. MODIFY_REG(tmpreg, ETH_MACMDIOAR_MOC, ETH_MACMDIOAR_MOC_WR);
  19034. 8008694: 697b ldr r3, [r7, #20]
  19035. 8008696: f023 030c bic.w r3, r3, #12
  19036. 800869a: f043 0304 orr.w r3, r3, #4
  19037. 800869e: 617b str r3, [r7, #20]
  19038. SET_BIT(tmpreg, ETH_MACMDIOAR_MB);
  19039. 80086a0: 697b ldr r3, [r7, #20]
  19040. 80086a2: f043 0301 orr.w r3, r3, #1
  19041. 80086a6: 617b str r3, [r7, #20]
  19042. /* Give the value to the MII data register */
  19043. WRITE_REG(ETH->MACMDIODR, (uint16_t)RegValue);
  19044. 80086a8: 683b ldr r3, [r7, #0]
  19045. 80086aa: b29a uxth r2, r3
  19046. 80086ac: 4b10 ldr r3, [pc, #64] @ (80086f0 <HAL_ETH_WritePHYRegister+0xa4>)
  19047. 80086ae: f8c3 2204 str.w r2, [r3, #516] @ 0x204
  19048. /* Write the result value into the MII Address register */
  19049. WRITE_REG(ETH->MACMDIOAR, tmpreg);
  19050. 80086b2: 4a0f ldr r2, [pc, #60] @ (80086f0 <HAL_ETH_WritePHYRegister+0xa4>)
  19051. 80086b4: 697b ldr r3, [r7, #20]
  19052. 80086b6: f8c2 3200 str.w r3, [r2, #512] @ 0x200
  19053. tickstart = HAL_GetTick();
  19054. 80086ba: f7fc fcb9 bl 8005030 <HAL_GetTick>
  19055. 80086be: 6138 str r0, [r7, #16]
  19056. /* Wait for the Busy flag */
  19057. while (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) > 0U)
  19058. 80086c0: e009 b.n 80086d6 <HAL_ETH_WritePHYRegister+0x8a>
  19059. {
  19060. if (((HAL_GetTick() - tickstart) > ETH_MDIO_BUS_TIMEOUT))
  19061. 80086c2: f7fc fcb5 bl 8005030 <HAL_GetTick>
  19062. 80086c6: 4602 mov r2, r0
  19063. 80086c8: 693b ldr r3, [r7, #16]
  19064. 80086ca: 1ad3 subs r3, r2, r3
  19065. 80086cc: f5b3 7f7a cmp.w r3, #1000 @ 0x3e8
  19066. 80086d0: d901 bls.n 80086d6 <HAL_ETH_WritePHYRegister+0x8a>
  19067. {
  19068. return HAL_ERROR;
  19069. 80086d2: 2301 movs r3, #1
  19070. 80086d4: e008 b.n 80086e8 <HAL_ETH_WritePHYRegister+0x9c>
  19071. while (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) > 0U)
  19072. 80086d6: 68fb ldr r3, [r7, #12]
  19073. 80086d8: 681b ldr r3, [r3, #0]
  19074. 80086da: f8d3 3200 ldr.w r3, [r3, #512] @ 0x200
  19075. 80086de: f003 0301 and.w r3, r3, #1
  19076. 80086e2: 2b00 cmp r3, #0
  19077. 80086e4: d1ed bne.n 80086c2 <HAL_ETH_WritePHYRegister+0x76>
  19078. }
  19079. }
  19080. return HAL_OK;
  19081. 80086e6: 2300 movs r3, #0
  19082. }
  19083. 80086e8: 4618 mov r0, r3
  19084. 80086ea: 3718 adds r7, #24
  19085. 80086ec: 46bd mov sp, r7
  19086. 80086ee: bd80 pop {r7, pc}
  19087. 80086f0: 40028000 .word 0x40028000
  19088. 080086f4 <HAL_ETH_GetMACConfig>:
  19089. * @param macconf: pointer to a ETH_MACConfigTypeDef structure that will hold
  19090. * the configuration of the MAC.
  19091. * @retval HAL Status
  19092. */
  19093. HAL_StatusTypeDef HAL_ETH_GetMACConfig(const ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
  19094. {
  19095. 80086f4: b480 push {r7}
  19096. 80086f6: b083 sub sp, #12
  19097. 80086f8: af00 add r7, sp, #0
  19098. 80086fa: 6078 str r0, [r7, #4]
  19099. 80086fc: 6039 str r1, [r7, #0]
  19100. if (macconf == NULL)
  19101. 80086fe: 683b ldr r3, [r7, #0]
  19102. 8008700: 2b00 cmp r3, #0
  19103. 8008702: d101 bne.n 8008708 <HAL_ETH_GetMACConfig+0x14>
  19104. {
  19105. return HAL_ERROR;
  19106. 8008704: 2301 movs r3, #1
  19107. 8008706: e1c3 b.n 8008a90 <HAL_ETH_GetMACConfig+0x39c>
  19108. }
  19109. /* Get MAC parameters */
  19110. macconf->PreambleLength = READ_BIT(heth->Instance->MACCR, ETH_MACCR_PRELEN);
  19111. 8008708: 687b ldr r3, [r7, #4]
  19112. 800870a: 681b ldr r3, [r3, #0]
  19113. 800870c: 681b ldr r3, [r3, #0]
  19114. 800870e: f003 020c and.w r2, r3, #12
  19115. 8008712: 683b ldr r3, [r7, #0]
  19116. 8008714: 62da str r2, [r3, #44] @ 0x2c
  19117. macconf->DeferralCheck = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DC) >> 4) > 0U) ? ENABLE : DISABLE;
  19118. 8008716: 687b ldr r3, [r7, #4]
  19119. 8008718: 681b ldr r3, [r3, #0]
  19120. 800871a: 681b ldr r3, [r3, #0]
  19121. 800871c: f003 0310 and.w r3, r3, #16
  19122. 8008720: 2b00 cmp r3, #0
  19123. 8008722: bf14 ite ne
  19124. 8008724: 2301 movne r3, #1
  19125. 8008726: 2300 moveq r3, #0
  19126. 8008728: b2db uxtb r3, r3
  19127. 800872a: 461a mov r2, r3
  19128. 800872c: 683b ldr r3, [r7, #0]
  19129. 800872e: f883 2028 strb.w r2, [r3, #40] @ 0x28
  19130. macconf->BackOffLimit = READ_BIT(heth->Instance->MACCR, ETH_MACCR_BL);
  19131. 8008732: 687b ldr r3, [r7, #4]
  19132. 8008734: 681b ldr r3, [r3, #0]
  19133. 8008736: 681b ldr r3, [r3, #0]
  19134. 8008738: f003 0260 and.w r2, r3, #96 @ 0x60
  19135. 800873c: 683b ldr r3, [r7, #0]
  19136. 800873e: 625a str r2, [r3, #36] @ 0x24
  19137. macconf->RetryTransmission = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DR) >> 8) == 0U) ? ENABLE : DISABLE;
  19138. 8008740: 687b ldr r3, [r7, #4]
  19139. 8008742: 681b ldr r3, [r3, #0]
  19140. 8008744: 681b ldr r3, [r3, #0]
  19141. 8008746: f403 7380 and.w r3, r3, #256 @ 0x100
  19142. 800874a: 2b00 cmp r3, #0
  19143. 800874c: bf0c ite eq
  19144. 800874e: 2301 moveq r3, #1
  19145. 8008750: 2300 movne r3, #0
  19146. 8008752: b2db uxtb r3, r3
  19147. 8008754: 461a mov r2, r3
  19148. 8008756: 683b ldr r3, [r7, #0]
  19149. 8008758: f883 2020 strb.w r2, [r3, #32]
  19150. macconf->CarrierSenseDuringTransmit = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DCRS) >> 9) > 0U)
  19151. 800875c: 687b ldr r3, [r7, #4]
  19152. 800875e: 681b ldr r3, [r3, #0]
  19153. 8008760: 681b ldr r3, [r3, #0]
  19154. 8008762: f403 7300 and.w r3, r3, #512 @ 0x200
  19155. ? ENABLE : DISABLE;
  19156. 8008766: 2b00 cmp r3, #0
  19157. 8008768: bf14 ite ne
  19158. 800876a: 2301 movne r3, #1
  19159. 800876c: 2300 moveq r3, #0
  19160. 800876e: b2db uxtb r3, r3
  19161. 8008770: 461a mov r2, r3
  19162. macconf->CarrierSenseDuringTransmit = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DCRS) >> 9) > 0U)
  19163. 8008772: 683b ldr r3, [r7, #0]
  19164. 8008774: 77da strb r2, [r3, #31]
  19165. macconf->ReceiveOwn = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DO) >> 10) == 0U) ? ENABLE : DISABLE;
  19166. 8008776: 687b ldr r3, [r7, #4]
  19167. 8008778: 681b ldr r3, [r3, #0]
  19168. 800877a: 681b ldr r3, [r3, #0]
  19169. 800877c: f403 6380 and.w r3, r3, #1024 @ 0x400
  19170. 8008780: 2b00 cmp r3, #0
  19171. 8008782: bf0c ite eq
  19172. 8008784: 2301 moveq r3, #1
  19173. 8008786: 2300 movne r3, #0
  19174. 8008788: b2db uxtb r3, r3
  19175. 800878a: 461a mov r2, r3
  19176. 800878c: 683b ldr r3, [r7, #0]
  19177. 800878e: 779a strb r2, [r3, #30]
  19178. macconf->CarrierSenseBeforeTransmit = ((READ_BIT(heth->Instance->MACCR,
  19179. 8008790: 687b ldr r3, [r7, #4]
  19180. 8008792: 681b ldr r3, [r3, #0]
  19181. 8008794: 681b ldr r3, [r3, #0]
  19182. ETH_MACCR_ECRSFD) >> 11) > 0U) ? ENABLE : DISABLE;
  19183. 8008796: f403 6300 and.w r3, r3, #2048 @ 0x800
  19184. 800879a: 2b00 cmp r3, #0
  19185. 800879c: bf14 ite ne
  19186. 800879e: 2301 movne r3, #1
  19187. 80087a0: 2300 moveq r3, #0
  19188. 80087a2: b2db uxtb r3, r3
  19189. 80087a4: 461a mov r2, r3
  19190. macconf->CarrierSenseBeforeTransmit = ((READ_BIT(heth->Instance->MACCR,
  19191. 80087a6: 683b ldr r3, [r7, #0]
  19192. 80087a8: 775a strb r2, [r3, #29]
  19193. macconf->LoopbackMode = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_LM) >> 12) > 0U) ? ENABLE : DISABLE;
  19194. 80087aa: 687b ldr r3, [r7, #4]
  19195. 80087ac: 681b ldr r3, [r3, #0]
  19196. 80087ae: 681b ldr r3, [r3, #0]
  19197. 80087b0: f403 5380 and.w r3, r3, #4096 @ 0x1000
  19198. 80087b4: 2b00 cmp r3, #0
  19199. 80087b6: bf14 ite ne
  19200. 80087b8: 2301 movne r3, #1
  19201. 80087ba: 2300 moveq r3, #0
  19202. 80087bc: b2db uxtb r3, r3
  19203. 80087be: 461a mov r2, r3
  19204. 80087c0: 683b ldr r3, [r7, #0]
  19205. 80087c2: 771a strb r2, [r3, #28]
  19206. macconf->DuplexMode = READ_BIT(heth->Instance->MACCR, ETH_MACCR_DM);
  19207. 80087c4: 687b ldr r3, [r7, #4]
  19208. 80087c6: 681b ldr r3, [r3, #0]
  19209. 80087c8: 681b ldr r3, [r3, #0]
  19210. 80087ca: f403 5200 and.w r2, r3, #8192 @ 0x2000
  19211. 80087ce: 683b ldr r3, [r7, #0]
  19212. 80087d0: 619a str r2, [r3, #24]
  19213. macconf->Speed = READ_BIT(heth->Instance->MACCR, ETH_MACCR_FES);
  19214. 80087d2: 687b ldr r3, [r7, #4]
  19215. 80087d4: 681b ldr r3, [r3, #0]
  19216. 80087d6: 681b ldr r3, [r3, #0]
  19217. 80087d8: f403 4280 and.w r2, r3, #16384 @ 0x4000
  19218. 80087dc: 683b ldr r3, [r7, #0]
  19219. 80087de: 615a str r2, [r3, #20]
  19220. macconf->JumboPacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_JE) >> 16) > 0U) ? ENABLE : DISABLE;
  19221. 80087e0: 687b ldr r3, [r7, #4]
  19222. 80087e2: 681b ldr r3, [r3, #0]
  19223. 80087e4: 681b ldr r3, [r3, #0]
  19224. 80087e6: f403 3380 and.w r3, r3, #65536 @ 0x10000
  19225. 80087ea: 2b00 cmp r3, #0
  19226. 80087ec: bf14 ite ne
  19227. 80087ee: 2301 movne r3, #1
  19228. 80087f0: 2300 moveq r3, #0
  19229. 80087f2: b2db uxtb r3, r3
  19230. 80087f4: 461a mov r2, r3
  19231. 80087f6: 683b ldr r3, [r7, #0]
  19232. 80087f8: 749a strb r2, [r3, #18]
  19233. macconf->Jabber = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_JD) >> 17) == 0U) ? ENABLE : DISABLE;
  19234. 80087fa: 687b ldr r3, [r7, #4]
  19235. 80087fc: 681b ldr r3, [r3, #0]
  19236. 80087fe: 681b ldr r3, [r3, #0]
  19237. 8008800: f403 3300 and.w r3, r3, #131072 @ 0x20000
  19238. 8008804: 2b00 cmp r3, #0
  19239. 8008806: bf0c ite eq
  19240. 8008808: 2301 moveq r3, #1
  19241. 800880a: 2300 movne r3, #0
  19242. 800880c: b2db uxtb r3, r3
  19243. 800880e: 461a mov r2, r3
  19244. 8008810: 683b ldr r3, [r7, #0]
  19245. 8008812: 745a strb r2, [r3, #17]
  19246. macconf->Watchdog = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_WD) >> 19) == 0U) ? ENABLE : DISABLE;
  19247. 8008814: 687b ldr r3, [r7, #4]
  19248. 8008816: 681b ldr r3, [r3, #0]
  19249. 8008818: 681b ldr r3, [r3, #0]
  19250. 800881a: f403 2300 and.w r3, r3, #524288 @ 0x80000
  19251. 800881e: 2b00 cmp r3, #0
  19252. 8008820: bf0c ite eq
  19253. 8008822: 2301 moveq r3, #1
  19254. 8008824: 2300 movne r3, #0
  19255. 8008826: b2db uxtb r3, r3
  19256. 8008828: 461a mov r2, r3
  19257. 800882a: 683b ldr r3, [r7, #0]
  19258. 800882c: 741a strb r2, [r3, #16]
  19259. macconf->AutomaticPadCRCStrip = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_ACS) >> 20) > 0U) ? ENABLE : DISABLE;
  19260. 800882e: 687b ldr r3, [r7, #4]
  19261. 8008830: 681b ldr r3, [r3, #0]
  19262. 8008832: 681b ldr r3, [r3, #0]
  19263. 8008834: f403 1380 and.w r3, r3, #1048576 @ 0x100000
  19264. 8008838: 2b00 cmp r3, #0
  19265. 800883a: bf14 ite ne
  19266. 800883c: 2301 movne r3, #1
  19267. 800883e: 2300 moveq r3, #0
  19268. 8008840: b2db uxtb r3, r3
  19269. 8008842: 461a mov r2, r3
  19270. 8008844: 683b ldr r3, [r7, #0]
  19271. 8008846: 73da strb r2, [r3, #15]
  19272. macconf->CRCStripTypePacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_CST) >> 21) > 0U) ? ENABLE : DISABLE;
  19273. 8008848: 687b ldr r3, [r7, #4]
  19274. 800884a: 681b ldr r3, [r3, #0]
  19275. 800884c: 681b ldr r3, [r3, #0]
  19276. 800884e: f403 1300 and.w r3, r3, #2097152 @ 0x200000
  19277. 8008852: 2b00 cmp r3, #0
  19278. 8008854: bf14 ite ne
  19279. 8008856: 2301 movne r3, #1
  19280. 8008858: 2300 moveq r3, #0
  19281. 800885a: b2db uxtb r3, r3
  19282. 800885c: 461a mov r2, r3
  19283. 800885e: 683b ldr r3, [r7, #0]
  19284. 8008860: 739a strb r2, [r3, #14]
  19285. macconf->Support2KPacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_S2KP) >> 22) > 0U) ? ENABLE : DISABLE;
  19286. 8008862: 687b ldr r3, [r7, #4]
  19287. 8008864: 681b ldr r3, [r3, #0]
  19288. 8008866: 681b ldr r3, [r3, #0]
  19289. 8008868: f403 0380 and.w r3, r3, #4194304 @ 0x400000
  19290. 800886c: 2b00 cmp r3, #0
  19291. 800886e: bf14 ite ne
  19292. 8008870: 2301 movne r3, #1
  19293. 8008872: 2300 moveq r3, #0
  19294. 8008874: b2db uxtb r3, r3
  19295. 8008876: 461a mov r2, r3
  19296. 8008878: 683b ldr r3, [r7, #0]
  19297. 800887a: 735a strb r2, [r3, #13]
  19298. macconf->GiantPacketSizeLimitControl = ((READ_BIT(heth->Instance->MACCR,
  19299. 800887c: 687b ldr r3, [r7, #4]
  19300. 800887e: 681b ldr r3, [r3, #0]
  19301. 8008880: 681b ldr r3, [r3, #0]
  19302. ETH_MACCR_GPSLCE) >> 23) > 0U) ? ENABLE : DISABLE;
  19303. 8008882: f403 0300 and.w r3, r3, #8388608 @ 0x800000
  19304. 8008886: 2b00 cmp r3, #0
  19305. 8008888: bf14 ite ne
  19306. 800888a: 2301 movne r3, #1
  19307. 800888c: 2300 moveq r3, #0
  19308. 800888e: b2db uxtb r3, r3
  19309. 8008890: 461a mov r2, r3
  19310. macconf->GiantPacketSizeLimitControl = ((READ_BIT(heth->Instance->MACCR,
  19311. 8008892: 683b ldr r3, [r7, #0]
  19312. 8008894: 731a strb r2, [r3, #12]
  19313. macconf->InterPacketGapVal = READ_BIT(heth->Instance->MACCR, ETH_MACCR_IPG);
  19314. 8008896: 687b ldr r3, [r7, #4]
  19315. 8008898: 681b ldr r3, [r3, #0]
  19316. 800889a: 681b ldr r3, [r3, #0]
  19317. 800889c: f003 62e0 and.w r2, r3, #117440512 @ 0x7000000
  19318. 80088a0: 683b ldr r3, [r7, #0]
  19319. 80088a2: 609a str r2, [r3, #8]
  19320. macconf->ChecksumOffload = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_IPC) >> 27) > 0U) ? ENABLE : DISABLE;
  19321. 80088a4: 687b ldr r3, [r7, #4]
  19322. 80088a6: 681b ldr r3, [r3, #0]
  19323. 80088a8: 681b ldr r3, [r3, #0]
  19324. 80088aa: f003 6300 and.w r3, r3, #134217728 @ 0x8000000
  19325. 80088ae: 2b00 cmp r3, #0
  19326. 80088b0: bf14 ite ne
  19327. 80088b2: 2301 movne r3, #1
  19328. 80088b4: 2300 moveq r3, #0
  19329. 80088b6: b2db uxtb r3, r3
  19330. 80088b8: 461a mov r2, r3
  19331. 80088ba: 683b ldr r3, [r7, #0]
  19332. 80088bc: 711a strb r2, [r3, #4]
  19333. macconf->SourceAddrControl = READ_BIT(heth->Instance->MACCR, ETH_MACCR_SARC);
  19334. 80088be: 687b ldr r3, [r7, #4]
  19335. 80088c0: 681b ldr r3, [r3, #0]
  19336. 80088c2: 681b ldr r3, [r3, #0]
  19337. 80088c4: f003 42e0 and.w r2, r3, #1879048192 @ 0x70000000
  19338. 80088c8: 683b ldr r3, [r7, #0]
  19339. 80088ca: 601a str r2, [r3, #0]
  19340. macconf->GiantPacketSizeLimit = READ_BIT(heth->Instance->MACECR, ETH_MACECR_GPSL);
  19341. 80088cc: 687b ldr r3, [r7, #4]
  19342. 80088ce: 681b ldr r3, [r3, #0]
  19343. 80088d0: 685b ldr r3, [r3, #4]
  19344. 80088d2: f3c3 020d ubfx r2, r3, #0, #14
  19345. 80088d6: 683b ldr r3, [r7, #0]
  19346. 80088d8: 635a str r2, [r3, #52] @ 0x34
  19347. macconf->CRCCheckingRxPackets = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_DCRCC) >> 16) == 0U) ? ENABLE : DISABLE;
  19348. 80088da: 687b ldr r3, [r7, #4]
  19349. 80088dc: 681b ldr r3, [r3, #0]
  19350. 80088de: 685b ldr r3, [r3, #4]
  19351. 80088e0: f403 3380 and.w r3, r3, #65536 @ 0x10000
  19352. 80088e4: 2b00 cmp r3, #0
  19353. 80088e6: bf0c ite eq
  19354. 80088e8: 2301 moveq r3, #1
  19355. 80088ea: 2300 movne r3, #0
  19356. 80088ec: b2db uxtb r3, r3
  19357. 80088ee: 461a mov r2, r3
  19358. 80088f0: 683b ldr r3, [r7, #0]
  19359. 80088f2: f883 2032 strb.w r2, [r3, #50] @ 0x32
  19360. macconf->SlowProtocolDetect = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_SPEN) >> 17) > 0U) ? ENABLE : DISABLE;
  19361. 80088f6: 687b ldr r3, [r7, #4]
  19362. 80088f8: 681b ldr r3, [r3, #0]
  19363. 80088fa: 685b ldr r3, [r3, #4]
  19364. 80088fc: f403 3300 and.w r3, r3, #131072 @ 0x20000
  19365. 8008900: 2b00 cmp r3, #0
  19366. 8008902: bf14 ite ne
  19367. 8008904: 2301 movne r3, #1
  19368. 8008906: 2300 moveq r3, #0
  19369. 8008908: b2db uxtb r3, r3
  19370. 800890a: 461a mov r2, r3
  19371. 800890c: 683b ldr r3, [r7, #0]
  19372. 800890e: f883 2031 strb.w r2, [r3, #49] @ 0x31
  19373. macconf->UnicastSlowProtocolPacketDetect = ((READ_BIT(heth->Instance->MACECR,
  19374. 8008912: 687b ldr r3, [r7, #4]
  19375. 8008914: 681b ldr r3, [r3, #0]
  19376. 8008916: 685b ldr r3, [r3, #4]
  19377. ETH_MACECR_USP) >> 18) > 0U) ? ENABLE : DISABLE;
  19378. 8008918: f403 2380 and.w r3, r3, #262144 @ 0x40000
  19379. 800891c: 2b00 cmp r3, #0
  19380. 800891e: bf14 ite ne
  19381. 8008920: 2301 movne r3, #1
  19382. 8008922: 2300 moveq r3, #0
  19383. 8008924: b2db uxtb r3, r3
  19384. 8008926: 461a mov r2, r3
  19385. macconf->UnicastSlowProtocolPacketDetect = ((READ_BIT(heth->Instance->MACECR,
  19386. 8008928: 683b ldr r3, [r7, #0]
  19387. 800892a: f883 2030 strb.w r2, [r3, #48] @ 0x30
  19388. macconf->ExtendedInterPacketGap = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_EIPGEN) >> 24) > 0U)
  19389. 800892e: 687b ldr r3, [r7, #4]
  19390. 8008930: 681b ldr r3, [r3, #0]
  19391. 8008932: 685b ldr r3, [r3, #4]
  19392. 8008934: f003 7380 and.w r3, r3, #16777216 @ 0x1000000
  19393. ? ENABLE : DISABLE;
  19394. 8008938: 2b00 cmp r3, #0
  19395. 800893a: bf14 ite ne
  19396. 800893c: 2301 movne r3, #1
  19397. 800893e: 2300 moveq r3, #0
  19398. 8008940: b2db uxtb r3, r3
  19399. 8008942: 461a mov r2, r3
  19400. macconf->ExtendedInterPacketGap = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_EIPGEN) >> 24) > 0U)
  19401. 8008944: 683b ldr r3, [r7, #0]
  19402. 8008946: f883 2038 strb.w r2, [r3, #56] @ 0x38
  19403. macconf->ExtendedInterPacketGapVal = READ_BIT(heth->Instance->MACECR, ETH_MACECR_EIPG) >> 25;
  19404. 800894a: 687b ldr r3, [r7, #4]
  19405. 800894c: 681b ldr r3, [r3, #0]
  19406. 800894e: 685b ldr r3, [r3, #4]
  19407. 8008950: 0e5b lsrs r3, r3, #25
  19408. 8008952: f003 021f and.w r2, r3, #31
  19409. 8008956: 683b ldr r3, [r7, #0]
  19410. 8008958: 63da str r2, [r3, #60] @ 0x3c
  19411. macconf->ProgrammableWatchdog = ((READ_BIT(heth->Instance->MACWTR, ETH_MACWTR_PWE) >> 8) > 0U) ? ENABLE : DISABLE;
  19412. 800895a: 687b ldr r3, [r7, #4]
  19413. 800895c: 681b ldr r3, [r3, #0]
  19414. 800895e: 68db ldr r3, [r3, #12]
  19415. 8008960: f403 7380 and.w r3, r3, #256 @ 0x100
  19416. 8008964: 2b00 cmp r3, #0
  19417. 8008966: bf14 ite ne
  19418. 8008968: 2301 movne r3, #1
  19419. 800896a: 2300 moveq r3, #0
  19420. 800896c: b2db uxtb r3, r3
  19421. 800896e: 461a mov r2, r3
  19422. 8008970: 683b ldr r3, [r7, #0]
  19423. 8008972: f883 2040 strb.w r2, [r3, #64] @ 0x40
  19424. macconf->WatchdogTimeout = READ_BIT(heth->Instance->MACWTR, ETH_MACWTR_WTO);
  19425. 8008976: 687b ldr r3, [r7, #4]
  19426. 8008978: 681b ldr r3, [r3, #0]
  19427. 800897a: 68db ldr r3, [r3, #12]
  19428. 800897c: f003 020f and.w r2, r3, #15
  19429. 8008980: 683b ldr r3, [r7, #0]
  19430. 8008982: 645a str r2, [r3, #68] @ 0x44
  19431. macconf->TransmitFlowControl = ((READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_TFE) >> 1) > 0U) ? ENABLE : DISABLE;
  19432. 8008984: 687b ldr r3, [r7, #4]
  19433. 8008986: 681b ldr r3, [r3, #0]
  19434. 8008988: 6f1b ldr r3, [r3, #112] @ 0x70
  19435. 800898a: f003 0302 and.w r3, r3, #2
  19436. 800898e: 2b00 cmp r3, #0
  19437. 8008990: bf14 ite ne
  19438. 8008992: 2301 movne r3, #1
  19439. 8008994: 2300 moveq r3, #0
  19440. 8008996: b2db uxtb r3, r3
  19441. 8008998: 461a mov r2, r3
  19442. 800899a: 683b ldr r3, [r7, #0]
  19443. 800899c: f883 2054 strb.w r2, [r3, #84] @ 0x54
  19444. macconf->ZeroQuantaPause = ((READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_DZPQ) >> 7) == 0U) ? ENABLE : DISABLE;
  19445. 80089a0: 687b ldr r3, [r7, #4]
  19446. 80089a2: 681b ldr r3, [r3, #0]
  19447. 80089a4: 6f1b ldr r3, [r3, #112] @ 0x70
  19448. 80089a6: f003 0380 and.w r3, r3, #128 @ 0x80
  19449. 80089aa: 2b00 cmp r3, #0
  19450. 80089ac: bf0c ite eq
  19451. 80089ae: 2301 moveq r3, #1
  19452. 80089b0: 2300 movne r3, #0
  19453. 80089b2: b2db uxtb r3, r3
  19454. 80089b4: 461a mov r2, r3
  19455. 80089b6: 683b ldr r3, [r7, #0]
  19456. 80089b8: f883 204c strb.w r2, [r3, #76] @ 0x4c
  19457. macconf->PauseLowThreshold = READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_PLT);
  19458. 80089bc: 687b ldr r3, [r7, #4]
  19459. 80089be: 681b ldr r3, [r3, #0]
  19460. 80089c0: 6f1b ldr r3, [r3, #112] @ 0x70
  19461. 80089c2: f003 0270 and.w r2, r3, #112 @ 0x70
  19462. 80089c6: 683b ldr r3, [r7, #0]
  19463. 80089c8: 651a str r2, [r3, #80] @ 0x50
  19464. macconf->PauseTime = (READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_PT) >> 16);
  19465. 80089ca: 687b ldr r3, [r7, #4]
  19466. 80089cc: 681b ldr r3, [r3, #0]
  19467. 80089ce: 6f1b ldr r3, [r3, #112] @ 0x70
  19468. 80089d0: 0c1b lsrs r3, r3, #16
  19469. 80089d2: b29a uxth r2, r3
  19470. 80089d4: 683b ldr r3, [r7, #0]
  19471. 80089d6: 649a str r2, [r3, #72] @ 0x48
  19472. macconf->ReceiveFlowControl = (READ_BIT(heth->Instance->MACRFCR, ETH_MACRFCR_RFE) > 0U) ? ENABLE : DISABLE;
  19473. 80089d8: 687b ldr r3, [r7, #4]
  19474. 80089da: 681b ldr r3, [r3, #0]
  19475. 80089dc: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  19476. 80089e0: f003 0301 and.w r3, r3, #1
  19477. 80089e4: 2b00 cmp r3, #0
  19478. 80089e6: bf14 ite ne
  19479. 80089e8: 2301 movne r3, #1
  19480. 80089ea: 2300 moveq r3, #0
  19481. 80089ec: b2db uxtb r3, r3
  19482. 80089ee: 461a mov r2, r3
  19483. 80089f0: 683b ldr r3, [r7, #0]
  19484. 80089f2: f883 2056 strb.w r2, [r3, #86] @ 0x56
  19485. macconf->UnicastPausePacketDetect = ((READ_BIT(heth->Instance->MACRFCR, ETH_MACRFCR_UP) >> 1) > 0U)
  19486. 80089f6: 687b ldr r3, [r7, #4]
  19487. 80089f8: 681b ldr r3, [r3, #0]
  19488. 80089fa: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  19489. 80089fe: f003 0302 and.w r3, r3, #2
  19490. ? ENABLE : DISABLE;
  19491. 8008a02: 2b00 cmp r3, #0
  19492. 8008a04: bf14 ite ne
  19493. 8008a06: 2301 movne r3, #1
  19494. 8008a08: 2300 moveq r3, #0
  19495. 8008a0a: b2db uxtb r3, r3
  19496. 8008a0c: 461a mov r2, r3
  19497. macconf->UnicastPausePacketDetect = ((READ_BIT(heth->Instance->MACRFCR, ETH_MACRFCR_UP) >> 1) > 0U)
  19498. 8008a0e: 683b ldr r3, [r7, #0]
  19499. 8008a10: f883 2055 strb.w r2, [r3, #85] @ 0x55
  19500. macconf->TransmitQueueMode = READ_BIT(heth->Instance->MTLTQOMR, (ETH_MTLTQOMR_TTC | ETH_MTLTQOMR_TSF));
  19501. 8008a14: 687b ldr r3, [r7, #4]
  19502. 8008a16: 681b ldr r3, [r3, #0]
  19503. 8008a18: f8d3 3d00 ldr.w r3, [r3, #3328] @ 0xd00
  19504. 8008a1c: f003 0272 and.w r2, r3, #114 @ 0x72
  19505. 8008a20: 683b ldr r3, [r7, #0]
  19506. 8008a22: 659a str r2, [r3, #88] @ 0x58
  19507. macconf->ReceiveQueueMode = READ_BIT(heth->Instance->MTLRQOMR, (ETH_MTLRQOMR_RTC | ETH_MTLRQOMR_RSF));
  19508. 8008a24: 687b ldr r3, [r7, #4]
  19509. 8008a26: 681b ldr r3, [r3, #0]
  19510. 8008a28: f8d3 3d30 ldr.w r3, [r3, #3376] @ 0xd30
  19511. 8008a2c: f003 0223 and.w r2, r3, #35 @ 0x23
  19512. 8008a30: 683b ldr r3, [r7, #0]
  19513. 8008a32: 65da str r2, [r3, #92] @ 0x5c
  19514. macconf->ForwardRxUndersizedGoodPacket = ((READ_BIT(heth->Instance->MTLRQOMR,
  19515. 8008a34: 687b ldr r3, [r7, #4]
  19516. 8008a36: 681b ldr r3, [r3, #0]
  19517. 8008a38: f8d3 3d30 ldr.w r3, [r3, #3376] @ 0xd30
  19518. ETH_MTLRQOMR_FUP) >> 3) > 0U) ? ENABLE : DISABLE;
  19519. 8008a3c: f003 0308 and.w r3, r3, #8
  19520. 8008a40: 2b00 cmp r3, #0
  19521. 8008a42: bf14 ite ne
  19522. 8008a44: 2301 movne r3, #1
  19523. 8008a46: 2300 moveq r3, #0
  19524. 8008a48: b2db uxtb r3, r3
  19525. 8008a4a: 461a mov r2, r3
  19526. macconf->ForwardRxUndersizedGoodPacket = ((READ_BIT(heth->Instance->MTLRQOMR,
  19527. 8008a4c: 683b ldr r3, [r7, #0]
  19528. 8008a4e: f883 2062 strb.w r2, [r3, #98] @ 0x62
  19529. macconf->ForwardRxErrorPacket = ((READ_BIT(heth->Instance->MTLRQOMR, ETH_MTLRQOMR_FEP) >> 4) > 0U) ? ENABLE : DISABLE;
  19530. 8008a52: 687b ldr r3, [r7, #4]
  19531. 8008a54: 681b ldr r3, [r3, #0]
  19532. 8008a56: f8d3 3d30 ldr.w r3, [r3, #3376] @ 0xd30
  19533. 8008a5a: f003 0310 and.w r3, r3, #16
  19534. 8008a5e: 2b00 cmp r3, #0
  19535. 8008a60: bf14 ite ne
  19536. 8008a62: 2301 movne r3, #1
  19537. 8008a64: 2300 moveq r3, #0
  19538. 8008a66: b2db uxtb r3, r3
  19539. 8008a68: 461a mov r2, r3
  19540. 8008a6a: 683b ldr r3, [r7, #0]
  19541. 8008a6c: f883 2061 strb.w r2, [r3, #97] @ 0x61
  19542. macconf->DropTCPIPChecksumErrorPacket = ((READ_BIT(heth->Instance->MTLRQOMR,
  19543. 8008a70: 687b ldr r3, [r7, #4]
  19544. 8008a72: 681b ldr r3, [r3, #0]
  19545. 8008a74: f8d3 3d30 ldr.w r3, [r3, #3376] @ 0xd30
  19546. ETH_MTLRQOMR_DISTCPEF) >> 6) == 0U) ? ENABLE : DISABLE;
  19547. 8008a78: f003 0340 and.w r3, r3, #64 @ 0x40
  19548. 8008a7c: 2b00 cmp r3, #0
  19549. 8008a7e: bf0c ite eq
  19550. 8008a80: 2301 moveq r3, #1
  19551. 8008a82: 2300 movne r3, #0
  19552. 8008a84: b2db uxtb r3, r3
  19553. 8008a86: 461a mov r2, r3
  19554. macconf->DropTCPIPChecksumErrorPacket = ((READ_BIT(heth->Instance->MTLRQOMR,
  19555. 8008a88: 683b ldr r3, [r7, #0]
  19556. 8008a8a: f883 2060 strb.w r2, [r3, #96] @ 0x60
  19557. return HAL_OK;
  19558. 8008a8e: 2300 movs r3, #0
  19559. }
  19560. 8008a90: 4618 mov r0, r3
  19561. 8008a92: 370c adds r7, #12
  19562. 8008a94: 46bd mov sp, r7
  19563. 8008a96: f85d 7b04 ldr.w r7, [sp], #4
  19564. 8008a9a: 4770 bx lr
  19565. 08008a9c <HAL_ETH_SetMACConfig>:
  19566. * @param macconf: pointer to a ETH_MACConfigTypeDef structure that contains
  19567. * the configuration of the MAC.
  19568. * @retval HAL status
  19569. */
  19570. HAL_StatusTypeDef HAL_ETH_SetMACConfig(ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
  19571. {
  19572. 8008a9c: b580 push {r7, lr}
  19573. 8008a9e: b082 sub sp, #8
  19574. 8008aa0: af00 add r7, sp, #0
  19575. 8008aa2: 6078 str r0, [r7, #4]
  19576. 8008aa4: 6039 str r1, [r7, #0]
  19577. if (macconf == NULL)
  19578. 8008aa6: 683b ldr r3, [r7, #0]
  19579. 8008aa8: 2b00 cmp r3, #0
  19580. 8008aaa: d101 bne.n 8008ab0 <HAL_ETH_SetMACConfig+0x14>
  19581. {
  19582. return HAL_ERROR;
  19583. 8008aac: 2301 movs r3, #1
  19584. 8008aae: e00b b.n 8008ac8 <HAL_ETH_SetMACConfig+0x2c>
  19585. }
  19586. if (heth->gState == HAL_ETH_STATE_READY)
  19587. 8008ab0: 687b ldr r3, [r7, #4]
  19588. 8008ab2: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  19589. 8008ab6: 2b10 cmp r3, #16
  19590. 8008ab8: d105 bne.n 8008ac6 <HAL_ETH_SetMACConfig+0x2a>
  19591. {
  19592. ETH_SetMACConfig(heth, macconf);
  19593. 8008aba: 6839 ldr r1, [r7, #0]
  19594. 8008abc: 6878 ldr r0, [r7, #4]
  19595. 8008abe: f000 f865 bl 8008b8c <ETH_SetMACConfig>
  19596. return HAL_OK;
  19597. 8008ac2: 2300 movs r3, #0
  19598. 8008ac4: e000 b.n 8008ac8 <HAL_ETH_SetMACConfig+0x2c>
  19599. }
  19600. else
  19601. {
  19602. return HAL_ERROR;
  19603. 8008ac6: 2301 movs r3, #1
  19604. }
  19605. }
  19606. 8008ac8: 4618 mov r0, r3
  19607. 8008aca: 3708 adds r7, #8
  19608. 8008acc: 46bd mov sp, r7
  19609. 8008ace: bd80 pop {r7, pc}
  19610. 08008ad0 <HAL_ETH_SetMDIOClockRange>:
  19611. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  19612. * the configuration information for ETHERNET module
  19613. * @retval None
  19614. */
  19615. void HAL_ETH_SetMDIOClockRange(ETH_HandleTypeDef *heth)
  19616. {
  19617. 8008ad0: b580 push {r7, lr}
  19618. 8008ad2: b084 sub sp, #16
  19619. 8008ad4: af00 add r7, sp, #0
  19620. 8008ad6: 6078 str r0, [r7, #4]
  19621. uint32_t hclk;
  19622. uint32_t tmpreg;
  19623. /* Get the ETHERNET MACMDIOAR value */
  19624. tmpreg = (heth->Instance)->MACMDIOAR;
  19625. 8008ad8: 687b ldr r3, [r7, #4]
  19626. 8008ada: 681b ldr r3, [r3, #0]
  19627. 8008adc: f8d3 3200 ldr.w r3, [r3, #512] @ 0x200
  19628. 8008ae0: 60fb str r3, [r7, #12]
  19629. /* Clear CSR Clock Range bits */
  19630. tmpreg &= ~ETH_MACMDIOAR_CR;
  19631. 8008ae2: 68fb ldr r3, [r7, #12]
  19632. 8008ae4: f423 6370 bic.w r3, r3, #3840 @ 0xf00
  19633. 8008ae8: 60fb str r3, [r7, #12]
  19634. /* Get hclk frequency value */
  19635. hclk = HAL_RCC_GetHCLKFreq();
  19636. 8008aea: f001 ff5f bl 800a9ac <HAL_RCC_GetHCLKFreq>
  19637. 8008aee: 60b8 str r0, [r7, #8]
  19638. /* Set CR bits depending on hclk value */
  19639. if (hclk < 35000000U)
  19640. 8008af0: 68bb ldr r3, [r7, #8]
  19641. 8008af2: 4a1a ldr r2, [pc, #104] @ (8008b5c <HAL_ETH_SetMDIOClockRange+0x8c>)
  19642. 8008af4: 4293 cmp r3, r2
  19643. 8008af6: d804 bhi.n 8008b02 <HAL_ETH_SetMDIOClockRange+0x32>
  19644. {
  19645. /* CSR Clock Range between 0-35 MHz */
  19646. tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV16;
  19647. 8008af8: 68fb ldr r3, [r7, #12]
  19648. 8008afa: f443 7300 orr.w r3, r3, #512 @ 0x200
  19649. 8008afe: 60fb str r3, [r7, #12]
  19650. 8008b00: e022 b.n 8008b48 <HAL_ETH_SetMDIOClockRange+0x78>
  19651. }
  19652. else if (hclk < 60000000U)
  19653. 8008b02: 68bb ldr r3, [r7, #8]
  19654. 8008b04: 4a16 ldr r2, [pc, #88] @ (8008b60 <HAL_ETH_SetMDIOClockRange+0x90>)
  19655. 8008b06: 4293 cmp r3, r2
  19656. 8008b08: d204 bcs.n 8008b14 <HAL_ETH_SetMDIOClockRange+0x44>
  19657. {
  19658. /* CSR Clock Range between 35-60 MHz */
  19659. tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV26;
  19660. 8008b0a: 68fb ldr r3, [r7, #12]
  19661. 8008b0c: f443 7340 orr.w r3, r3, #768 @ 0x300
  19662. 8008b10: 60fb str r3, [r7, #12]
  19663. 8008b12: e019 b.n 8008b48 <HAL_ETH_SetMDIOClockRange+0x78>
  19664. }
  19665. else if (hclk < 100000000U)
  19666. 8008b14: 68bb ldr r3, [r7, #8]
  19667. 8008b16: 4a13 ldr r2, [pc, #76] @ (8008b64 <HAL_ETH_SetMDIOClockRange+0x94>)
  19668. 8008b18: 4293 cmp r3, r2
  19669. 8008b1a: d915 bls.n 8008b48 <HAL_ETH_SetMDIOClockRange+0x78>
  19670. {
  19671. /* CSR Clock Range between 60-100 MHz */
  19672. tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV42;
  19673. }
  19674. else if (hclk < 150000000U)
  19675. 8008b1c: 68bb ldr r3, [r7, #8]
  19676. 8008b1e: 4a12 ldr r2, [pc, #72] @ (8008b68 <HAL_ETH_SetMDIOClockRange+0x98>)
  19677. 8008b20: 4293 cmp r3, r2
  19678. 8008b22: d804 bhi.n 8008b2e <HAL_ETH_SetMDIOClockRange+0x5e>
  19679. {
  19680. /* CSR Clock Range between 100-150 MHz */
  19681. tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV62;
  19682. 8008b24: 68fb ldr r3, [r7, #12]
  19683. 8008b26: f443 7380 orr.w r3, r3, #256 @ 0x100
  19684. 8008b2a: 60fb str r3, [r7, #12]
  19685. 8008b2c: e00c b.n 8008b48 <HAL_ETH_SetMDIOClockRange+0x78>
  19686. }
  19687. else if (hclk < 250000000U)
  19688. 8008b2e: 68bb ldr r3, [r7, #8]
  19689. 8008b30: 4a0e ldr r2, [pc, #56] @ (8008b6c <HAL_ETH_SetMDIOClockRange+0x9c>)
  19690. 8008b32: 4293 cmp r3, r2
  19691. 8008b34: d804 bhi.n 8008b40 <HAL_ETH_SetMDIOClockRange+0x70>
  19692. {
  19693. /* CSR Clock Range between 150-250 MHz */
  19694. tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV102;
  19695. 8008b36: 68fb ldr r3, [r7, #12]
  19696. 8008b38: f443 6380 orr.w r3, r3, #1024 @ 0x400
  19697. 8008b3c: 60fb str r3, [r7, #12]
  19698. 8008b3e: e003 b.n 8008b48 <HAL_ETH_SetMDIOClockRange+0x78>
  19699. }
  19700. else /* (hclk >= 250000000U) */
  19701. {
  19702. /* CSR Clock >= 250 MHz */
  19703. tmpreg |= (uint32_t)(ETH_MACMDIOAR_CR_DIV124);
  19704. 8008b40: 68fb ldr r3, [r7, #12]
  19705. 8008b42: f443 63a0 orr.w r3, r3, #1280 @ 0x500
  19706. 8008b46: 60fb str r3, [r7, #12]
  19707. }
  19708. /* Configure the CSR Clock Range */
  19709. (heth->Instance)->MACMDIOAR = (uint32_t)tmpreg;
  19710. 8008b48: 687b ldr r3, [r7, #4]
  19711. 8008b4a: 681b ldr r3, [r3, #0]
  19712. 8008b4c: 68fa ldr r2, [r7, #12]
  19713. 8008b4e: f8c3 2200 str.w r2, [r3, #512] @ 0x200
  19714. }
  19715. 8008b52: bf00 nop
  19716. 8008b54: 3710 adds r7, #16
  19717. 8008b56: 46bd mov sp, r7
  19718. 8008b58: bd80 pop {r7, pc}
  19719. 8008b5a: bf00 nop
  19720. 8008b5c: 02160ebf .word 0x02160ebf
  19721. 8008b60: 03938700 .word 0x03938700
  19722. 8008b64: 05f5e0ff .word 0x05f5e0ff
  19723. 8008b68: 08f0d17f .word 0x08f0d17f
  19724. 8008b6c: 0ee6b27f .word 0x0ee6b27f
  19725. 08008b70 <HAL_ETH_GetDMAError>:
  19726. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  19727. * the configuration information for ETHERNET module
  19728. * @retval ETH DMA Error Code
  19729. */
  19730. uint32_t HAL_ETH_GetDMAError(const ETH_HandleTypeDef *heth)
  19731. {
  19732. 8008b70: b480 push {r7}
  19733. 8008b72: b083 sub sp, #12
  19734. 8008b74: af00 add r7, sp, #0
  19735. 8008b76: 6078 str r0, [r7, #4]
  19736. return heth->DMAErrorCode;
  19737. 8008b78: 687b ldr r3, [r7, #4]
  19738. 8008b7a: f8d3 308c ldr.w r3, [r3, #140] @ 0x8c
  19739. }
  19740. 8008b7e: 4618 mov r0, r3
  19741. 8008b80: 370c adds r7, #12
  19742. 8008b82: 46bd mov sp, r7
  19743. 8008b84: f85d 7b04 ldr.w r7, [sp], #4
  19744. 8008b88: 4770 bx lr
  19745. ...
  19746. 08008b8c <ETH_SetMACConfig>:
  19747. /** @addtogroup ETH_Private_Functions ETH Private Functions
  19748. * @{
  19749. */
  19750. static void ETH_SetMACConfig(ETH_HandleTypeDef *heth, const ETH_MACConfigTypeDef *macconf)
  19751. {
  19752. 8008b8c: b480 push {r7}
  19753. 8008b8e: b085 sub sp, #20
  19754. 8008b90: af00 add r7, sp, #0
  19755. 8008b92: 6078 str r0, [r7, #4]
  19756. 8008b94: 6039 str r1, [r7, #0]
  19757. uint32_t macregval;
  19758. /*------------------------ MACCR Configuration --------------------*/
  19759. macregval = (macconf->InterPacketGapVal |
  19760. 8008b96: 683b ldr r3, [r7, #0]
  19761. 8008b98: 689a ldr r2, [r3, #8]
  19762. macconf->SourceAddrControl |
  19763. 8008b9a: 683b ldr r3, [r7, #0]
  19764. 8008b9c: 681b ldr r3, [r3, #0]
  19765. macregval = (macconf->InterPacketGapVal |
  19766. 8008b9e: 431a orrs r2, r3
  19767. ((uint32_t)macconf->ChecksumOffload << 27) |
  19768. 8008ba0: 683b ldr r3, [r7, #0]
  19769. 8008ba2: 791b ldrb r3, [r3, #4]
  19770. 8008ba4: 06db lsls r3, r3, #27
  19771. macconf->SourceAddrControl |
  19772. 8008ba6: 431a orrs r2, r3
  19773. ((uint32_t)macconf->GiantPacketSizeLimitControl << 23) |
  19774. 8008ba8: 683b ldr r3, [r7, #0]
  19775. 8008baa: 7b1b ldrb r3, [r3, #12]
  19776. 8008bac: 05db lsls r3, r3, #23
  19777. ((uint32_t)macconf->ChecksumOffload << 27) |
  19778. 8008bae: 431a orrs r2, r3
  19779. ((uint32_t)macconf->Support2KPacket << 22) |
  19780. 8008bb0: 683b ldr r3, [r7, #0]
  19781. 8008bb2: 7b5b ldrb r3, [r3, #13]
  19782. 8008bb4: 059b lsls r3, r3, #22
  19783. ((uint32_t)macconf->GiantPacketSizeLimitControl << 23) |
  19784. 8008bb6: 431a orrs r2, r3
  19785. ((uint32_t)macconf->CRCStripTypePacket << 21) |
  19786. 8008bb8: 683b ldr r3, [r7, #0]
  19787. 8008bba: 7b9b ldrb r3, [r3, #14]
  19788. 8008bbc: 055b lsls r3, r3, #21
  19789. ((uint32_t)macconf->Support2KPacket << 22) |
  19790. 8008bbe: 431a orrs r2, r3
  19791. ((uint32_t)macconf->AutomaticPadCRCStrip << 20) |
  19792. 8008bc0: 683b ldr r3, [r7, #0]
  19793. 8008bc2: 7bdb ldrb r3, [r3, #15]
  19794. 8008bc4: 051b lsls r3, r3, #20
  19795. ((uint32_t)macconf->CRCStripTypePacket << 21) |
  19796. 8008bc6: 4313 orrs r3, r2
  19797. ((uint32_t)((macconf->Watchdog == DISABLE) ? 1U : 0U) << 19) |
  19798. 8008bc8: 683a ldr r2, [r7, #0]
  19799. 8008bca: 7c12 ldrb r2, [r2, #16]
  19800. 8008bcc: 2a00 cmp r2, #0
  19801. 8008bce: d102 bne.n 8008bd6 <ETH_SetMACConfig+0x4a>
  19802. 8008bd0: f44f 2200 mov.w r2, #524288 @ 0x80000
  19803. 8008bd4: e000 b.n 8008bd8 <ETH_SetMACConfig+0x4c>
  19804. 8008bd6: 2200 movs r2, #0
  19805. ((uint32_t)macconf->AutomaticPadCRCStrip << 20) |
  19806. 8008bd8: 4313 orrs r3, r2
  19807. ((uint32_t)((macconf->Jabber == DISABLE) ? 1U : 0U) << 17) |
  19808. 8008bda: 683a ldr r2, [r7, #0]
  19809. 8008bdc: 7c52 ldrb r2, [r2, #17]
  19810. 8008bde: 2a00 cmp r2, #0
  19811. 8008be0: d102 bne.n 8008be8 <ETH_SetMACConfig+0x5c>
  19812. 8008be2: f44f 3200 mov.w r2, #131072 @ 0x20000
  19813. 8008be6: e000 b.n 8008bea <ETH_SetMACConfig+0x5e>
  19814. 8008be8: 2200 movs r2, #0
  19815. ((uint32_t)((macconf->Watchdog == DISABLE) ? 1U : 0U) << 19) |
  19816. 8008bea: 431a orrs r2, r3
  19817. ((uint32_t)macconf->JumboPacket << 16) |
  19818. 8008bec: 683b ldr r3, [r7, #0]
  19819. 8008bee: 7c9b ldrb r3, [r3, #18]
  19820. 8008bf0: 041b lsls r3, r3, #16
  19821. ((uint32_t)((macconf->Jabber == DISABLE) ? 1U : 0U) << 17) |
  19822. 8008bf2: 431a orrs r2, r3
  19823. macconf->Speed |
  19824. 8008bf4: 683b ldr r3, [r7, #0]
  19825. 8008bf6: 695b ldr r3, [r3, #20]
  19826. ((uint32_t)macconf->JumboPacket << 16) |
  19827. 8008bf8: 431a orrs r2, r3
  19828. macconf->DuplexMode |
  19829. 8008bfa: 683b ldr r3, [r7, #0]
  19830. 8008bfc: 699b ldr r3, [r3, #24]
  19831. macconf->Speed |
  19832. 8008bfe: 431a orrs r2, r3
  19833. ((uint32_t)macconf->LoopbackMode << 12) |
  19834. 8008c00: 683b ldr r3, [r7, #0]
  19835. 8008c02: 7f1b ldrb r3, [r3, #28]
  19836. 8008c04: 031b lsls r3, r3, #12
  19837. macconf->DuplexMode |
  19838. 8008c06: 431a orrs r2, r3
  19839. ((uint32_t)macconf->CarrierSenseBeforeTransmit << 11) |
  19840. 8008c08: 683b ldr r3, [r7, #0]
  19841. 8008c0a: 7f5b ldrb r3, [r3, #29]
  19842. 8008c0c: 02db lsls r3, r3, #11
  19843. ((uint32_t)macconf->LoopbackMode << 12) |
  19844. 8008c0e: 4313 orrs r3, r2
  19845. ((uint32_t)((macconf->ReceiveOwn == DISABLE) ? 1U : 0U) << 10) |
  19846. 8008c10: 683a ldr r2, [r7, #0]
  19847. 8008c12: 7f92 ldrb r2, [r2, #30]
  19848. 8008c14: 2a00 cmp r2, #0
  19849. 8008c16: d102 bne.n 8008c1e <ETH_SetMACConfig+0x92>
  19850. 8008c18: f44f 6280 mov.w r2, #1024 @ 0x400
  19851. 8008c1c: e000 b.n 8008c20 <ETH_SetMACConfig+0x94>
  19852. 8008c1e: 2200 movs r2, #0
  19853. ((uint32_t)macconf->CarrierSenseBeforeTransmit << 11) |
  19854. 8008c20: 431a orrs r2, r3
  19855. ((uint32_t)macconf->CarrierSenseDuringTransmit << 9) |
  19856. 8008c22: 683b ldr r3, [r7, #0]
  19857. 8008c24: 7fdb ldrb r3, [r3, #31]
  19858. 8008c26: 025b lsls r3, r3, #9
  19859. ((uint32_t)((macconf->ReceiveOwn == DISABLE) ? 1U : 0U) << 10) |
  19860. 8008c28: 4313 orrs r3, r2
  19861. ((uint32_t)((macconf->RetryTransmission == DISABLE) ? 1U : 0U) << 8) |
  19862. 8008c2a: 683a ldr r2, [r7, #0]
  19863. 8008c2c: f892 2020 ldrb.w r2, [r2, #32]
  19864. 8008c30: 2a00 cmp r2, #0
  19865. 8008c32: d102 bne.n 8008c3a <ETH_SetMACConfig+0xae>
  19866. 8008c34: f44f 7280 mov.w r2, #256 @ 0x100
  19867. 8008c38: e000 b.n 8008c3c <ETH_SetMACConfig+0xb0>
  19868. 8008c3a: 2200 movs r2, #0
  19869. ((uint32_t)macconf->CarrierSenseDuringTransmit << 9) |
  19870. 8008c3c: 431a orrs r2, r3
  19871. macconf->BackOffLimit |
  19872. 8008c3e: 683b ldr r3, [r7, #0]
  19873. 8008c40: 6a5b ldr r3, [r3, #36] @ 0x24
  19874. ((uint32_t)((macconf->RetryTransmission == DISABLE) ? 1U : 0U) << 8) |
  19875. 8008c42: 431a orrs r2, r3
  19876. ((uint32_t)macconf->DeferralCheck << 4) |
  19877. 8008c44: 683b ldr r3, [r7, #0]
  19878. 8008c46: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  19879. 8008c4a: 011b lsls r3, r3, #4
  19880. macconf->BackOffLimit |
  19881. 8008c4c: 431a orrs r2, r3
  19882. macconf->PreambleLength);
  19883. 8008c4e: 683b ldr r3, [r7, #0]
  19884. 8008c50: 6adb ldr r3, [r3, #44] @ 0x2c
  19885. macregval = (macconf->InterPacketGapVal |
  19886. 8008c52: 4313 orrs r3, r2
  19887. 8008c54: 60fb str r3, [r7, #12]
  19888. /* Write to MACCR */
  19889. MODIFY_REG(heth->Instance->MACCR, ETH_MACCR_MASK, macregval);
  19890. 8008c56: 687b ldr r3, [r7, #4]
  19891. 8008c58: 681b ldr r3, [r3, #0]
  19892. 8008c5a: 681a ldr r2, [r3, #0]
  19893. 8008c5c: 4b56 ldr r3, [pc, #344] @ (8008db8 <ETH_SetMACConfig+0x22c>)
  19894. 8008c5e: 4013 ands r3, r2
  19895. 8008c60: 687a ldr r2, [r7, #4]
  19896. 8008c62: 6812 ldr r2, [r2, #0]
  19897. 8008c64: 68f9 ldr r1, [r7, #12]
  19898. 8008c66: 430b orrs r3, r1
  19899. 8008c68: 6013 str r3, [r2, #0]
  19900. /*------------------------ MACECR Configuration --------------------*/
  19901. macregval = ((macconf->ExtendedInterPacketGapVal << 25) |
  19902. 8008c6a: 683b ldr r3, [r7, #0]
  19903. 8008c6c: 6bdb ldr r3, [r3, #60] @ 0x3c
  19904. 8008c6e: 065a lsls r2, r3, #25
  19905. ((uint32_t)macconf->ExtendedInterPacketGap << 24) |
  19906. 8008c70: 683b ldr r3, [r7, #0]
  19907. 8008c72: f893 3038 ldrb.w r3, [r3, #56] @ 0x38
  19908. 8008c76: 061b lsls r3, r3, #24
  19909. macregval = ((macconf->ExtendedInterPacketGapVal << 25) |
  19910. 8008c78: 431a orrs r2, r3
  19911. ((uint32_t)macconf->UnicastSlowProtocolPacketDetect << 18) |
  19912. 8008c7a: 683b ldr r3, [r7, #0]
  19913. 8008c7c: f893 3030 ldrb.w r3, [r3, #48] @ 0x30
  19914. 8008c80: 049b lsls r3, r3, #18
  19915. ((uint32_t)macconf->ExtendedInterPacketGap << 24) |
  19916. 8008c82: 431a orrs r2, r3
  19917. ((uint32_t)macconf->SlowProtocolDetect << 17) |
  19918. 8008c84: 683b ldr r3, [r7, #0]
  19919. 8008c86: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  19920. 8008c8a: 045b lsls r3, r3, #17
  19921. ((uint32_t)macconf->UnicastSlowProtocolPacketDetect << 18) |
  19922. 8008c8c: 4313 orrs r3, r2
  19923. ((uint32_t)((macconf->CRCCheckingRxPackets == DISABLE) ? 1U : 0U) << 16) |
  19924. 8008c8e: 683a ldr r2, [r7, #0]
  19925. 8008c90: f892 2032 ldrb.w r2, [r2, #50] @ 0x32
  19926. 8008c94: 2a00 cmp r2, #0
  19927. 8008c96: d102 bne.n 8008c9e <ETH_SetMACConfig+0x112>
  19928. 8008c98: f44f 3280 mov.w r2, #65536 @ 0x10000
  19929. 8008c9c: e000 b.n 8008ca0 <ETH_SetMACConfig+0x114>
  19930. 8008c9e: 2200 movs r2, #0
  19931. ((uint32_t)macconf->SlowProtocolDetect << 17) |
  19932. 8008ca0: 431a orrs r2, r3
  19933. macconf->GiantPacketSizeLimit);
  19934. 8008ca2: 683b ldr r3, [r7, #0]
  19935. 8008ca4: 6b5b ldr r3, [r3, #52] @ 0x34
  19936. macregval = ((macconf->ExtendedInterPacketGapVal << 25) |
  19937. 8008ca6: 4313 orrs r3, r2
  19938. 8008ca8: 60fb str r3, [r7, #12]
  19939. /* Write to MACECR */
  19940. MODIFY_REG(heth->Instance->MACECR, ETH_MACECR_MASK, macregval);
  19941. 8008caa: 687b ldr r3, [r7, #4]
  19942. 8008cac: 681b ldr r3, [r3, #0]
  19943. 8008cae: 685a ldr r2, [r3, #4]
  19944. 8008cb0: 4b42 ldr r3, [pc, #264] @ (8008dbc <ETH_SetMACConfig+0x230>)
  19945. 8008cb2: 4013 ands r3, r2
  19946. 8008cb4: 687a ldr r2, [r7, #4]
  19947. 8008cb6: 6812 ldr r2, [r2, #0]
  19948. 8008cb8: 68f9 ldr r1, [r7, #12]
  19949. 8008cba: 430b orrs r3, r1
  19950. 8008cbc: 6053 str r3, [r2, #4]
  19951. /*------------------------ MACWTR Configuration --------------------*/
  19952. macregval = (((uint32_t)macconf->ProgrammableWatchdog << 8) |
  19953. 8008cbe: 683b ldr r3, [r7, #0]
  19954. 8008cc0: f893 3040 ldrb.w r3, [r3, #64] @ 0x40
  19955. 8008cc4: 021a lsls r2, r3, #8
  19956. macconf->WatchdogTimeout);
  19957. 8008cc6: 683b ldr r3, [r7, #0]
  19958. 8008cc8: 6c5b ldr r3, [r3, #68] @ 0x44
  19959. macregval = (((uint32_t)macconf->ProgrammableWatchdog << 8) |
  19960. 8008cca: 4313 orrs r3, r2
  19961. 8008ccc: 60fb str r3, [r7, #12]
  19962. /* Write to MACWTR */
  19963. MODIFY_REG(heth->Instance->MACWTR, ETH_MACWTR_MASK, macregval);
  19964. 8008cce: 687b ldr r3, [r7, #4]
  19965. 8008cd0: 681b ldr r3, [r3, #0]
  19966. 8008cd2: 68da ldr r2, [r3, #12]
  19967. 8008cd4: 4b3a ldr r3, [pc, #232] @ (8008dc0 <ETH_SetMACConfig+0x234>)
  19968. 8008cd6: 4013 ands r3, r2
  19969. 8008cd8: 687a ldr r2, [r7, #4]
  19970. 8008cda: 6812 ldr r2, [r2, #0]
  19971. 8008cdc: 68f9 ldr r1, [r7, #12]
  19972. 8008cde: 430b orrs r3, r1
  19973. 8008ce0: 60d3 str r3, [r2, #12]
  19974. /*------------------------ MACTFCR Configuration --------------------*/
  19975. macregval = (((uint32_t)macconf->TransmitFlowControl << 1) |
  19976. 8008ce2: 683b ldr r3, [r7, #0]
  19977. 8008ce4: f893 3054 ldrb.w r3, [r3, #84] @ 0x54
  19978. 8008ce8: 005a lsls r2, r3, #1
  19979. macconf->PauseLowThreshold |
  19980. 8008cea: 683b ldr r3, [r7, #0]
  19981. 8008cec: 6d1b ldr r3, [r3, #80] @ 0x50
  19982. macregval = (((uint32_t)macconf->TransmitFlowControl << 1) |
  19983. 8008cee: 4313 orrs r3, r2
  19984. ((uint32_t)((macconf->ZeroQuantaPause == DISABLE) ? 1U : 0U) << 7) |
  19985. 8008cf0: 683a ldr r2, [r7, #0]
  19986. 8008cf2: f892 204c ldrb.w r2, [r2, #76] @ 0x4c
  19987. 8008cf6: 2a00 cmp r2, #0
  19988. 8008cf8: d101 bne.n 8008cfe <ETH_SetMACConfig+0x172>
  19989. 8008cfa: 2280 movs r2, #128 @ 0x80
  19990. 8008cfc: e000 b.n 8008d00 <ETH_SetMACConfig+0x174>
  19991. 8008cfe: 2200 movs r2, #0
  19992. macconf->PauseLowThreshold |
  19993. 8008d00: 431a orrs r2, r3
  19994. (macconf->PauseTime << 16));
  19995. 8008d02: 683b ldr r3, [r7, #0]
  19996. 8008d04: 6c9b ldr r3, [r3, #72] @ 0x48
  19997. 8008d06: 041b lsls r3, r3, #16
  19998. macregval = (((uint32_t)macconf->TransmitFlowControl << 1) |
  19999. 8008d08: 4313 orrs r3, r2
  20000. 8008d0a: 60fb str r3, [r7, #12]
  20001. /* Write to MACTFCR */
  20002. MODIFY_REG(heth->Instance->MACTFCR, ETH_MACTFCR_MASK, macregval);
  20003. 8008d0c: 687b ldr r3, [r7, #4]
  20004. 8008d0e: 681b ldr r3, [r3, #0]
  20005. 8008d10: 6f1a ldr r2, [r3, #112] @ 0x70
  20006. 8008d12: f64f 730d movw r3, #65293 @ 0xff0d
  20007. 8008d16: 4013 ands r3, r2
  20008. 8008d18: 687a ldr r2, [r7, #4]
  20009. 8008d1a: 6812 ldr r2, [r2, #0]
  20010. 8008d1c: 68f9 ldr r1, [r7, #12]
  20011. 8008d1e: 430b orrs r3, r1
  20012. 8008d20: 6713 str r3, [r2, #112] @ 0x70
  20013. /*------------------------ MACRFCR Configuration --------------------*/
  20014. macregval = ((uint32_t)macconf->ReceiveFlowControl |
  20015. 8008d22: 683b ldr r3, [r7, #0]
  20016. 8008d24: f893 3056 ldrb.w r3, [r3, #86] @ 0x56
  20017. 8008d28: 461a mov r2, r3
  20018. ((uint32_t)macconf->UnicastPausePacketDetect << 1));
  20019. 8008d2a: 683b ldr r3, [r7, #0]
  20020. 8008d2c: f893 3055 ldrb.w r3, [r3, #85] @ 0x55
  20021. 8008d30: 005b lsls r3, r3, #1
  20022. macregval = ((uint32_t)macconf->ReceiveFlowControl |
  20023. 8008d32: 4313 orrs r3, r2
  20024. 8008d34: 60fb str r3, [r7, #12]
  20025. /* Write to MACRFCR */
  20026. MODIFY_REG(heth->Instance->MACRFCR, ETH_MACRFCR_MASK, macregval);
  20027. 8008d36: 687b ldr r3, [r7, #4]
  20028. 8008d38: 681b ldr r3, [r3, #0]
  20029. 8008d3a: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  20030. 8008d3e: f023 0103 bic.w r1, r3, #3
  20031. 8008d42: 687b ldr r3, [r7, #4]
  20032. 8008d44: 681b ldr r3, [r3, #0]
  20033. 8008d46: 68fa ldr r2, [r7, #12]
  20034. 8008d48: 430a orrs r2, r1
  20035. 8008d4a: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  20036. /*------------------------ MTLTQOMR Configuration --------------------*/
  20037. /* Write to MTLTQOMR */
  20038. MODIFY_REG(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_MASK, macconf->TransmitQueueMode);
  20039. 8008d4e: 687b ldr r3, [r7, #4]
  20040. 8008d50: 681b ldr r3, [r3, #0]
  20041. 8008d52: f8d3 3d00 ldr.w r3, [r3, #3328] @ 0xd00
  20042. 8008d56: f023 0172 bic.w r1, r3, #114 @ 0x72
  20043. 8008d5a: 683b ldr r3, [r7, #0]
  20044. 8008d5c: 6d9a ldr r2, [r3, #88] @ 0x58
  20045. 8008d5e: 687b ldr r3, [r7, #4]
  20046. 8008d60: 681b ldr r3, [r3, #0]
  20047. 8008d62: 430a orrs r2, r1
  20048. 8008d64: f8c3 2d00 str.w r2, [r3, #3328] @ 0xd00
  20049. /*------------------------ MTLRQOMR Configuration --------------------*/
  20050. macregval = (macconf->ReceiveQueueMode |
  20051. 8008d68: 683b ldr r3, [r7, #0]
  20052. 8008d6a: 6ddb ldr r3, [r3, #92] @ 0x5c
  20053. ((uint32_t)((macconf->DropTCPIPChecksumErrorPacket == DISABLE) ? 1U : 0U) << 6) |
  20054. 8008d6c: 683a ldr r2, [r7, #0]
  20055. 8008d6e: f892 2060 ldrb.w r2, [r2, #96] @ 0x60
  20056. 8008d72: 2a00 cmp r2, #0
  20057. 8008d74: d101 bne.n 8008d7a <ETH_SetMACConfig+0x1ee>
  20058. 8008d76: 2240 movs r2, #64 @ 0x40
  20059. 8008d78: e000 b.n 8008d7c <ETH_SetMACConfig+0x1f0>
  20060. 8008d7a: 2200 movs r2, #0
  20061. macregval = (macconf->ReceiveQueueMode |
  20062. 8008d7c: 431a orrs r2, r3
  20063. ((uint32_t)macconf->ForwardRxErrorPacket << 4) |
  20064. 8008d7e: 683b ldr r3, [r7, #0]
  20065. 8008d80: f893 3061 ldrb.w r3, [r3, #97] @ 0x61
  20066. 8008d84: 011b lsls r3, r3, #4
  20067. ((uint32_t)((macconf->DropTCPIPChecksumErrorPacket == DISABLE) ? 1U : 0U) << 6) |
  20068. 8008d86: 431a orrs r2, r3
  20069. ((uint32_t)macconf->ForwardRxUndersizedGoodPacket << 3));
  20070. 8008d88: 683b ldr r3, [r7, #0]
  20071. 8008d8a: f893 3062 ldrb.w r3, [r3, #98] @ 0x62
  20072. 8008d8e: 00db lsls r3, r3, #3
  20073. macregval = (macconf->ReceiveQueueMode |
  20074. 8008d90: 4313 orrs r3, r2
  20075. 8008d92: 60fb str r3, [r7, #12]
  20076. /* Write to MTLRQOMR */
  20077. MODIFY_REG(heth->Instance->MTLRQOMR, ETH_MTLRQOMR_MASK, macregval);
  20078. 8008d94: 687b ldr r3, [r7, #4]
  20079. 8008d96: 681b ldr r3, [r3, #0]
  20080. 8008d98: f8d3 3d30 ldr.w r3, [r3, #3376] @ 0xd30
  20081. 8008d9c: f023 017b bic.w r1, r3, #123 @ 0x7b
  20082. 8008da0: 687b ldr r3, [r7, #4]
  20083. 8008da2: 681b ldr r3, [r3, #0]
  20084. 8008da4: 68fa ldr r2, [r7, #12]
  20085. 8008da6: 430a orrs r2, r1
  20086. 8008da8: f8c3 2d30 str.w r2, [r3, #3376] @ 0xd30
  20087. }
  20088. 8008dac: bf00 nop
  20089. 8008dae: 3714 adds r7, #20
  20090. 8008db0: 46bd mov sp, r7
  20091. 8008db2: f85d 7b04 ldr.w r7, [sp], #4
  20092. 8008db6: 4770 bx lr
  20093. 8008db8: 00048083 .word 0x00048083
  20094. 8008dbc: c0f88000 .word 0xc0f88000
  20095. 8008dc0: fffffef0 .word 0xfffffef0
  20096. 08008dc4 <ETH_SetDMAConfig>:
  20097. static void ETH_SetDMAConfig(ETH_HandleTypeDef *heth, const ETH_DMAConfigTypeDef *dmaconf)
  20098. {
  20099. 8008dc4: b480 push {r7}
  20100. 8008dc6: b085 sub sp, #20
  20101. 8008dc8: af00 add r7, sp, #0
  20102. 8008dca: 6078 str r0, [r7, #4]
  20103. 8008dcc: 6039 str r1, [r7, #0]
  20104. uint32_t dmaregval;
  20105. /*------------------------ DMAMR Configuration --------------------*/
  20106. MODIFY_REG(heth->Instance->DMAMR, ETH_DMAMR_MASK, dmaconf->DMAArbitration);
  20107. 8008dce: 687b ldr r3, [r7, #4]
  20108. 8008dd0: 681b ldr r3, [r3, #0]
  20109. 8008dd2: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20110. 8008dd6: 681a ldr r2, [r3, #0]
  20111. 8008dd8: 4b38 ldr r3, [pc, #224] @ (8008ebc <ETH_SetDMAConfig+0xf8>)
  20112. 8008dda: 4013 ands r3, r2
  20113. 8008ddc: 683a ldr r2, [r7, #0]
  20114. 8008dde: 6811 ldr r1, [r2, #0]
  20115. 8008de0: 687a ldr r2, [r7, #4]
  20116. 8008de2: 6812 ldr r2, [r2, #0]
  20117. 8008de4: 430b orrs r3, r1
  20118. 8008de6: f502 5280 add.w r2, r2, #4096 @ 0x1000
  20119. 8008dea: 6013 str r3, [r2, #0]
  20120. /*------------------------ DMASBMR Configuration --------------------*/
  20121. dmaregval = (((uint32_t)dmaconf->AddressAlignedBeats << 12) |
  20122. 8008dec: 683b ldr r3, [r7, #0]
  20123. 8008dee: 791b ldrb r3, [r3, #4]
  20124. 8008df0: 031a lsls r2, r3, #12
  20125. dmaconf->BurstMode |
  20126. 8008df2: 683b ldr r3, [r7, #0]
  20127. 8008df4: 689b ldr r3, [r3, #8]
  20128. dmaregval = (((uint32_t)dmaconf->AddressAlignedBeats << 12) |
  20129. 8008df6: 431a orrs r2, r3
  20130. ((uint32_t)dmaconf->RebuildINCRxBurst << 15));
  20131. 8008df8: 683b ldr r3, [r7, #0]
  20132. 8008dfa: 7b1b ldrb r3, [r3, #12]
  20133. 8008dfc: 03db lsls r3, r3, #15
  20134. dmaregval = (((uint32_t)dmaconf->AddressAlignedBeats << 12) |
  20135. 8008dfe: 4313 orrs r3, r2
  20136. 8008e00: 60fb str r3, [r7, #12]
  20137. MODIFY_REG(heth->Instance->DMASBMR, ETH_DMASBMR_MASK, dmaregval);
  20138. 8008e02: 687b ldr r3, [r7, #4]
  20139. 8008e04: 681b ldr r3, [r3, #0]
  20140. 8008e06: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20141. 8008e0a: 685a ldr r2, [r3, #4]
  20142. 8008e0c: 4b2c ldr r3, [pc, #176] @ (8008ec0 <ETH_SetDMAConfig+0xfc>)
  20143. 8008e0e: 4013 ands r3, r2
  20144. 8008e10: 687a ldr r2, [r7, #4]
  20145. 8008e12: 6812 ldr r2, [r2, #0]
  20146. 8008e14: 68f9 ldr r1, [r7, #12]
  20147. 8008e16: 430b orrs r3, r1
  20148. 8008e18: f502 5280 add.w r2, r2, #4096 @ 0x1000
  20149. 8008e1c: 6053 str r3, [r2, #4]
  20150. /*------------------------ DMACCR Configuration --------------------*/
  20151. dmaregval = (((uint32_t)dmaconf->PBLx8Mode << 16) |
  20152. 8008e1e: 683b ldr r3, [r7, #0]
  20153. 8008e20: 7b5b ldrb r3, [r3, #13]
  20154. 8008e22: 041a lsls r2, r3, #16
  20155. dmaconf->MaximumSegmentSize);
  20156. 8008e24: 683b ldr r3, [r7, #0]
  20157. 8008e26: 6a1b ldr r3, [r3, #32]
  20158. dmaregval = (((uint32_t)dmaconf->PBLx8Mode << 16) |
  20159. 8008e28: 4313 orrs r3, r2
  20160. 8008e2a: 60fb str r3, [r7, #12]
  20161. MODIFY_REG(heth->Instance->DMACCR, ETH_DMACCR_MASK, dmaregval);
  20162. 8008e2c: 687b ldr r3, [r7, #4]
  20163. 8008e2e: 681b ldr r3, [r3, #0]
  20164. 8008e30: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20165. 8008e34: f8d3 2100 ldr.w r2, [r3, #256] @ 0x100
  20166. 8008e38: 4b22 ldr r3, [pc, #136] @ (8008ec4 <ETH_SetDMAConfig+0x100>)
  20167. 8008e3a: 4013 ands r3, r2
  20168. 8008e3c: 687a ldr r2, [r7, #4]
  20169. 8008e3e: 6812 ldr r2, [r2, #0]
  20170. 8008e40: 68f9 ldr r1, [r7, #12]
  20171. 8008e42: 430b orrs r3, r1
  20172. 8008e44: f502 5280 add.w r2, r2, #4096 @ 0x1000
  20173. 8008e48: f8c2 3100 str.w r3, [r2, #256] @ 0x100
  20174. /*------------------------ DMACTCR Configuration --------------------*/
  20175. dmaregval = (dmaconf->TxDMABurstLength |
  20176. 8008e4c: 683b ldr r3, [r7, #0]
  20177. 8008e4e: 691a ldr r2, [r3, #16]
  20178. ((uint32_t)dmaconf->SecondPacketOperate << 4) |
  20179. 8008e50: 683b ldr r3, [r7, #0]
  20180. 8008e52: 7d1b ldrb r3, [r3, #20]
  20181. 8008e54: 011b lsls r3, r3, #4
  20182. dmaregval = (dmaconf->TxDMABurstLength |
  20183. 8008e56: 431a orrs r2, r3
  20184. ((uint32_t)dmaconf->TCPSegmentation << 12));
  20185. 8008e58: 683b ldr r3, [r7, #0]
  20186. 8008e5a: 7f5b ldrb r3, [r3, #29]
  20187. 8008e5c: 031b lsls r3, r3, #12
  20188. dmaregval = (dmaconf->TxDMABurstLength |
  20189. 8008e5e: 4313 orrs r3, r2
  20190. 8008e60: 60fb str r3, [r7, #12]
  20191. MODIFY_REG(heth->Instance->DMACTCR, ETH_DMACTCR_MASK, dmaregval);
  20192. 8008e62: 687b ldr r3, [r7, #4]
  20193. 8008e64: 681b ldr r3, [r3, #0]
  20194. 8008e66: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20195. 8008e6a: f8d3 2104 ldr.w r2, [r3, #260] @ 0x104
  20196. 8008e6e: 4b16 ldr r3, [pc, #88] @ (8008ec8 <ETH_SetDMAConfig+0x104>)
  20197. 8008e70: 4013 ands r3, r2
  20198. 8008e72: 687a ldr r2, [r7, #4]
  20199. 8008e74: 6812 ldr r2, [r2, #0]
  20200. 8008e76: 68f9 ldr r1, [r7, #12]
  20201. 8008e78: 430b orrs r3, r1
  20202. 8008e7a: f502 5280 add.w r2, r2, #4096 @ 0x1000
  20203. 8008e7e: f8c2 3104 str.w r3, [r2, #260] @ 0x104
  20204. /*------------------------ DMACRCR Configuration --------------------*/
  20205. dmaregval = (((uint32_t)dmaconf->FlushRxPacket << 31) |
  20206. 8008e82: 683b ldr r3, [r7, #0]
  20207. 8008e84: 7f1b ldrb r3, [r3, #28]
  20208. 8008e86: 07da lsls r2, r3, #31
  20209. dmaconf->RxDMABurstLength);
  20210. 8008e88: 683b ldr r3, [r7, #0]
  20211. 8008e8a: 699b ldr r3, [r3, #24]
  20212. dmaregval = (((uint32_t)dmaconf->FlushRxPacket << 31) |
  20213. 8008e8c: 4313 orrs r3, r2
  20214. 8008e8e: 60fb str r3, [r7, #12]
  20215. /* Write to DMACRCR */
  20216. MODIFY_REG(heth->Instance->DMACRCR, ETH_DMACRCR_MASK, dmaregval);
  20217. 8008e90: 687b ldr r3, [r7, #4]
  20218. 8008e92: 681b ldr r3, [r3, #0]
  20219. 8008e94: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20220. 8008e98: f8d3 2108 ldr.w r2, [r3, #264] @ 0x108
  20221. 8008e9c: 4b0b ldr r3, [pc, #44] @ (8008ecc <ETH_SetDMAConfig+0x108>)
  20222. 8008e9e: 4013 ands r3, r2
  20223. 8008ea0: 687a ldr r2, [r7, #4]
  20224. 8008ea2: 6812 ldr r2, [r2, #0]
  20225. 8008ea4: 68f9 ldr r1, [r7, #12]
  20226. 8008ea6: 430b orrs r3, r1
  20227. 8008ea8: f502 5280 add.w r2, r2, #4096 @ 0x1000
  20228. 8008eac: f8c2 3108 str.w r3, [r2, #264] @ 0x108
  20229. }
  20230. 8008eb0: bf00 nop
  20231. 8008eb2: 3714 adds r7, #20
  20232. 8008eb4: 46bd mov sp, r7
  20233. 8008eb6: f85d 7b04 ldr.w r7, [sp], #4
  20234. 8008eba: 4770 bx lr
  20235. 8008ebc: ffff87fd .word 0xffff87fd
  20236. 8008ec0: ffff2ffe .word 0xffff2ffe
  20237. 8008ec4: fffec000 .word 0xfffec000
  20238. 8008ec8: ffc0efef .word 0xffc0efef
  20239. 8008ecc: 7fc0ffff .word 0x7fc0ffff
  20240. 08008ed0 <ETH_MACDMAConfig>:
  20241. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  20242. * the configuration information for ETHERNET module
  20243. * @retval HAL status
  20244. */
  20245. static void ETH_MACDMAConfig(ETH_HandleTypeDef *heth)
  20246. {
  20247. 8008ed0: b580 push {r7, lr}
  20248. 8008ed2: b0a4 sub sp, #144 @ 0x90
  20249. 8008ed4: af00 add r7, sp, #0
  20250. 8008ed6: 6078 str r0, [r7, #4]
  20251. ETH_MACConfigTypeDef macDefaultConf;
  20252. ETH_DMAConfigTypeDef dmaDefaultConf;
  20253. /*--------------- ETHERNET MAC registers default Configuration --------------*/
  20254. macDefaultConf.AutomaticPadCRCStrip = ENABLE;
  20255. 8008ed8: 2301 movs r3, #1
  20256. 8008eda: f887 303b strb.w r3, [r7, #59] @ 0x3b
  20257. macDefaultConf.BackOffLimit = ETH_BACKOFFLIMIT_10;
  20258. 8008ede: 2300 movs r3, #0
  20259. 8008ee0: 653b str r3, [r7, #80] @ 0x50
  20260. macDefaultConf.CarrierSenseBeforeTransmit = DISABLE;
  20261. 8008ee2: 2300 movs r3, #0
  20262. 8008ee4: f887 3049 strb.w r3, [r7, #73] @ 0x49
  20263. macDefaultConf.CarrierSenseDuringTransmit = DISABLE;
  20264. 8008ee8: 2300 movs r3, #0
  20265. 8008eea: f887 304b strb.w r3, [r7, #75] @ 0x4b
  20266. macDefaultConf.ChecksumOffload = ENABLE;
  20267. 8008eee: 2301 movs r3, #1
  20268. 8008ef0: f887 3030 strb.w r3, [r7, #48] @ 0x30
  20269. macDefaultConf.CRCCheckingRxPackets = ENABLE;
  20270. 8008ef4: 2301 movs r3, #1
  20271. 8008ef6: f887 305e strb.w r3, [r7, #94] @ 0x5e
  20272. macDefaultConf.CRCStripTypePacket = ENABLE;
  20273. 8008efa: 2301 movs r3, #1
  20274. 8008efc: f887 303a strb.w r3, [r7, #58] @ 0x3a
  20275. macDefaultConf.DeferralCheck = DISABLE;
  20276. 8008f00: 2300 movs r3, #0
  20277. 8008f02: f887 3054 strb.w r3, [r7, #84] @ 0x54
  20278. macDefaultConf.DropTCPIPChecksumErrorPacket = ENABLE;
  20279. 8008f06: 2301 movs r3, #1
  20280. 8008f08: f887 308c strb.w r3, [r7, #140] @ 0x8c
  20281. macDefaultConf.DuplexMode = ETH_FULLDUPLEX_MODE;
  20282. 8008f0c: f44f 5300 mov.w r3, #8192 @ 0x2000
  20283. 8008f10: 647b str r3, [r7, #68] @ 0x44
  20284. macDefaultConf.ExtendedInterPacketGap = DISABLE;
  20285. 8008f12: 2300 movs r3, #0
  20286. 8008f14: f887 3064 strb.w r3, [r7, #100] @ 0x64
  20287. macDefaultConf.ExtendedInterPacketGapVal = 0x0U;
  20288. 8008f18: 2300 movs r3, #0
  20289. 8008f1a: 66bb str r3, [r7, #104] @ 0x68
  20290. macDefaultConf.ForwardRxErrorPacket = DISABLE;
  20291. 8008f1c: 2300 movs r3, #0
  20292. 8008f1e: f887 308d strb.w r3, [r7, #141] @ 0x8d
  20293. macDefaultConf.ForwardRxUndersizedGoodPacket = DISABLE;
  20294. 8008f22: 2300 movs r3, #0
  20295. 8008f24: f887 308e strb.w r3, [r7, #142] @ 0x8e
  20296. macDefaultConf.GiantPacketSizeLimit = 0x618U;
  20297. 8008f28: f44f 63c3 mov.w r3, #1560 @ 0x618
  20298. 8008f2c: 663b str r3, [r7, #96] @ 0x60
  20299. macDefaultConf.GiantPacketSizeLimitControl = DISABLE;
  20300. 8008f2e: 2300 movs r3, #0
  20301. 8008f30: f887 3038 strb.w r3, [r7, #56] @ 0x38
  20302. macDefaultConf.InterPacketGapVal = ETH_INTERPACKETGAP_96BIT;
  20303. 8008f34: 2300 movs r3, #0
  20304. 8008f36: 637b str r3, [r7, #52] @ 0x34
  20305. macDefaultConf.Jabber = ENABLE;
  20306. 8008f38: 2301 movs r3, #1
  20307. 8008f3a: f887 303d strb.w r3, [r7, #61] @ 0x3d
  20308. macDefaultConf.JumboPacket = DISABLE;
  20309. 8008f3e: 2300 movs r3, #0
  20310. 8008f40: f887 303e strb.w r3, [r7, #62] @ 0x3e
  20311. macDefaultConf.LoopbackMode = DISABLE;
  20312. 8008f44: 2300 movs r3, #0
  20313. 8008f46: f887 3048 strb.w r3, [r7, #72] @ 0x48
  20314. macDefaultConf.PauseLowThreshold = ETH_PAUSELOWTHRESHOLD_MINUS_4;
  20315. 8008f4a: 2300 movs r3, #0
  20316. 8008f4c: 67fb str r3, [r7, #124] @ 0x7c
  20317. macDefaultConf.PauseTime = 0x0U;
  20318. 8008f4e: 2300 movs r3, #0
  20319. 8008f50: 677b str r3, [r7, #116] @ 0x74
  20320. macDefaultConf.PreambleLength = ETH_PREAMBLELENGTH_7;
  20321. 8008f52: 2300 movs r3, #0
  20322. 8008f54: 65bb str r3, [r7, #88] @ 0x58
  20323. macDefaultConf.ProgrammableWatchdog = DISABLE;
  20324. 8008f56: 2300 movs r3, #0
  20325. 8008f58: f887 306c strb.w r3, [r7, #108] @ 0x6c
  20326. macDefaultConf.ReceiveFlowControl = DISABLE;
  20327. 8008f5c: 2300 movs r3, #0
  20328. 8008f5e: f887 3082 strb.w r3, [r7, #130] @ 0x82
  20329. macDefaultConf.ReceiveOwn = ENABLE;
  20330. 8008f62: 2301 movs r3, #1
  20331. 8008f64: f887 304a strb.w r3, [r7, #74] @ 0x4a
  20332. macDefaultConf.ReceiveQueueMode = ETH_RECEIVESTOREFORWARD;
  20333. 8008f68: 2320 movs r3, #32
  20334. 8008f6a: f8c7 3088 str.w r3, [r7, #136] @ 0x88
  20335. macDefaultConf.RetryTransmission = ENABLE;
  20336. 8008f6e: 2301 movs r3, #1
  20337. 8008f70: f887 304c strb.w r3, [r7, #76] @ 0x4c
  20338. macDefaultConf.SlowProtocolDetect = DISABLE;
  20339. 8008f74: 2300 movs r3, #0
  20340. 8008f76: f887 305d strb.w r3, [r7, #93] @ 0x5d
  20341. macDefaultConf.SourceAddrControl = ETH_SOURCEADDRESS_REPLACE_ADDR0;
  20342. 8008f7a: f04f 5340 mov.w r3, #805306368 @ 0x30000000
  20343. 8008f7e: 62fb str r3, [r7, #44] @ 0x2c
  20344. macDefaultConf.Speed = ETH_SPEED_100M;
  20345. 8008f80: f44f 4380 mov.w r3, #16384 @ 0x4000
  20346. 8008f84: 643b str r3, [r7, #64] @ 0x40
  20347. macDefaultConf.Support2KPacket = DISABLE;
  20348. 8008f86: 2300 movs r3, #0
  20349. 8008f88: f887 3039 strb.w r3, [r7, #57] @ 0x39
  20350. macDefaultConf.TransmitQueueMode = ETH_TRANSMITSTOREFORWARD;
  20351. 8008f8c: 2302 movs r3, #2
  20352. 8008f8e: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  20353. macDefaultConf.TransmitFlowControl = DISABLE;
  20354. 8008f92: 2300 movs r3, #0
  20355. 8008f94: f887 3080 strb.w r3, [r7, #128] @ 0x80
  20356. macDefaultConf.UnicastPausePacketDetect = DISABLE;
  20357. 8008f98: 2300 movs r3, #0
  20358. 8008f9a: f887 3081 strb.w r3, [r7, #129] @ 0x81
  20359. macDefaultConf.UnicastSlowProtocolPacketDetect = DISABLE;
  20360. 8008f9e: 2300 movs r3, #0
  20361. 8008fa0: f887 305c strb.w r3, [r7, #92] @ 0x5c
  20362. macDefaultConf.Watchdog = ENABLE;
  20363. 8008fa4: 2301 movs r3, #1
  20364. 8008fa6: f887 303c strb.w r3, [r7, #60] @ 0x3c
  20365. macDefaultConf.WatchdogTimeout = ETH_MACWTR_WTO_2KB;
  20366. 8008faa: 2300 movs r3, #0
  20367. 8008fac: 673b str r3, [r7, #112] @ 0x70
  20368. macDefaultConf.ZeroQuantaPause = ENABLE;
  20369. 8008fae: 2301 movs r3, #1
  20370. 8008fb0: f887 3078 strb.w r3, [r7, #120] @ 0x78
  20371. /* MAC default configuration */
  20372. ETH_SetMACConfig(heth, &macDefaultConf);
  20373. 8008fb4: f107 032c add.w r3, r7, #44 @ 0x2c
  20374. 8008fb8: 4619 mov r1, r3
  20375. 8008fba: 6878 ldr r0, [r7, #4]
  20376. 8008fbc: f7ff fde6 bl 8008b8c <ETH_SetMACConfig>
  20377. /*--------------- ETHERNET DMA registers default Configuration --------------*/
  20378. dmaDefaultConf.AddressAlignedBeats = ENABLE;
  20379. 8008fc0: 2301 movs r3, #1
  20380. 8008fc2: 733b strb r3, [r7, #12]
  20381. dmaDefaultConf.BurstMode = ETH_BURSTLENGTH_FIXED;
  20382. 8008fc4: 2301 movs r3, #1
  20383. 8008fc6: 613b str r3, [r7, #16]
  20384. dmaDefaultConf.DMAArbitration = ETH_DMAARBITRATION_RX1_TX1;
  20385. 8008fc8: 2300 movs r3, #0
  20386. 8008fca: 60bb str r3, [r7, #8]
  20387. dmaDefaultConf.FlushRxPacket = DISABLE;
  20388. 8008fcc: 2300 movs r3, #0
  20389. 8008fce: f887 3024 strb.w r3, [r7, #36] @ 0x24
  20390. dmaDefaultConf.PBLx8Mode = DISABLE;
  20391. 8008fd2: 2300 movs r3, #0
  20392. 8008fd4: 757b strb r3, [r7, #21]
  20393. dmaDefaultConf.RebuildINCRxBurst = DISABLE;
  20394. 8008fd6: 2300 movs r3, #0
  20395. 8008fd8: 753b strb r3, [r7, #20]
  20396. dmaDefaultConf.RxDMABurstLength = ETH_RXDMABURSTLENGTH_32BEAT;
  20397. 8008fda: f44f 1300 mov.w r3, #2097152 @ 0x200000
  20398. 8008fde: 623b str r3, [r7, #32]
  20399. dmaDefaultConf.SecondPacketOperate = DISABLE;
  20400. 8008fe0: 2300 movs r3, #0
  20401. 8008fe2: 773b strb r3, [r7, #28]
  20402. dmaDefaultConf.TxDMABurstLength = ETH_TXDMABURSTLENGTH_32BEAT;
  20403. 8008fe4: f44f 1300 mov.w r3, #2097152 @ 0x200000
  20404. 8008fe8: 61bb str r3, [r7, #24]
  20405. dmaDefaultConf.TCPSegmentation = DISABLE;
  20406. 8008fea: 2300 movs r3, #0
  20407. 8008fec: f887 3025 strb.w r3, [r7, #37] @ 0x25
  20408. dmaDefaultConf.MaximumSegmentSize = ETH_SEGMENT_SIZE_DEFAULT;
  20409. 8008ff0: f44f 7306 mov.w r3, #536 @ 0x218
  20410. 8008ff4: 62bb str r3, [r7, #40] @ 0x28
  20411. /* DMA default configuration */
  20412. ETH_SetDMAConfig(heth, &dmaDefaultConf);
  20413. 8008ff6: f107 0308 add.w r3, r7, #8
  20414. 8008ffa: 4619 mov r1, r3
  20415. 8008ffc: 6878 ldr r0, [r7, #4]
  20416. 8008ffe: f7ff fee1 bl 8008dc4 <ETH_SetDMAConfig>
  20417. }
  20418. 8009002: bf00 nop
  20419. 8009004: 3790 adds r7, #144 @ 0x90
  20420. 8009006: 46bd mov sp, r7
  20421. 8009008: bd80 pop {r7, pc}
  20422. 0800900a <ETH_DMATxDescListInit>:
  20423. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  20424. * the configuration information for ETHERNET module
  20425. * @retval None
  20426. */
  20427. static void ETH_DMATxDescListInit(ETH_HandleTypeDef *heth)
  20428. {
  20429. 800900a: b480 push {r7}
  20430. 800900c: b085 sub sp, #20
  20431. 800900e: af00 add r7, sp, #0
  20432. 8009010: 6078 str r0, [r7, #4]
  20433. ETH_DMADescTypeDef *dmatxdesc;
  20434. uint32_t i;
  20435. /* Fill each DMATxDesc descriptor with the right values */
  20436. for (i = 0; i < (uint32_t)ETH_TX_DESC_CNT; i++)
  20437. 8009012: 2300 movs r3, #0
  20438. 8009014: 60fb str r3, [r7, #12]
  20439. 8009016: e01d b.n 8009054 <ETH_DMATxDescListInit+0x4a>
  20440. {
  20441. dmatxdesc = heth->Init.TxDesc + i;
  20442. 8009018: 687b ldr r3, [r7, #4]
  20443. 800901a: 68d9 ldr r1, [r3, #12]
  20444. 800901c: 68fa ldr r2, [r7, #12]
  20445. 800901e: 4613 mov r3, r2
  20446. 8009020: 005b lsls r3, r3, #1
  20447. 8009022: 4413 add r3, r2
  20448. 8009024: 00db lsls r3, r3, #3
  20449. 8009026: 440b add r3, r1
  20450. 8009028: 60bb str r3, [r7, #8]
  20451. WRITE_REG(dmatxdesc->DESC0, 0x0U);
  20452. 800902a: 68bb ldr r3, [r7, #8]
  20453. 800902c: 2200 movs r2, #0
  20454. 800902e: 601a str r2, [r3, #0]
  20455. WRITE_REG(dmatxdesc->DESC1, 0x0U);
  20456. 8009030: 68bb ldr r3, [r7, #8]
  20457. 8009032: 2200 movs r2, #0
  20458. 8009034: 605a str r2, [r3, #4]
  20459. WRITE_REG(dmatxdesc->DESC2, 0x0U);
  20460. 8009036: 68bb ldr r3, [r7, #8]
  20461. 8009038: 2200 movs r2, #0
  20462. 800903a: 609a str r2, [r3, #8]
  20463. WRITE_REG(dmatxdesc->DESC3, 0x0U);
  20464. 800903c: 68bb ldr r3, [r7, #8]
  20465. 800903e: 2200 movs r2, #0
  20466. 8009040: 60da str r2, [r3, #12]
  20467. WRITE_REG(heth->TxDescList.TxDesc[i], (uint32_t)dmatxdesc);
  20468. 8009042: 68b9 ldr r1, [r7, #8]
  20469. 8009044: 687b ldr r3, [r7, #4]
  20470. 8009046: 68fa ldr r2, [r7, #12]
  20471. 8009048: 3206 adds r2, #6
  20472. 800904a: f843 1022 str.w r1, [r3, r2, lsl #2]
  20473. for (i = 0; i < (uint32_t)ETH_TX_DESC_CNT; i++)
  20474. 800904e: 68fb ldr r3, [r7, #12]
  20475. 8009050: 3301 adds r3, #1
  20476. 8009052: 60fb str r3, [r7, #12]
  20477. 8009054: 68fb ldr r3, [r7, #12]
  20478. 8009056: 2b03 cmp r3, #3
  20479. 8009058: d9de bls.n 8009018 <ETH_DMATxDescListInit+0xe>
  20480. }
  20481. heth->TxDescList.CurTxDesc = 0;
  20482. 800905a: 687b ldr r3, [r7, #4]
  20483. 800905c: 2200 movs r2, #0
  20484. 800905e: 629a str r2, [r3, #40] @ 0x28
  20485. /* Set Transmit Descriptor Ring Length */
  20486. WRITE_REG(heth->Instance->DMACTDRLR, (ETH_TX_DESC_CNT - 1U));
  20487. 8009060: 687b ldr r3, [r7, #4]
  20488. 8009062: 681b ldr r3, [r3, #0]
  20489. 8009064: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20490. 8009068: 461a mov r2, r3
  20491. 800906a: 2303 movs r3, #3
  20492. 800906c: f8c2 312c str.w r3, [r2, #300] @ 0x12c
  20493. /* Set Transmit Descriptor List Address */
  20494. WRITE_REG(heth->Instance->DMACTDLAR, (uint32_t) heth->Init.TxDesc);
  20495. 8009070: 687b ldr r3, [r7, #4]
  20496. 8009072: 68da ldr r2, [r3, #12]
  20497. 8009074: 687b ldr r3, [r7, #4]
  20498. 8009076: 681b ldr r3, [r3, #0]
  20499. 8009078: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20500. 800907c: f8c3 2114 str.w r2, [r3, #276] @ 0x114
  20501. /* Set Transmit Descriptor Tail pointer */
  20502. WRITE_REG(heth->Instance->DMACTDTPR, (uint32_t) heth->Init.TxDesc);
  20503. 8009080: 687b ldr r3, [r7, #4]
  20504. 8009082: 68da ldr r2, [r3, #12]
  20505. 8009084: 687b ldr r3, [r7, #4]
  20506. 8009086: 681b ldr r3, [r3, #0]
  20507. 8009088: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20508. 800908c: f8c3 2120 str.w r2, [r3, #288] @ 0x120
  20509. }
  20510. 8009090: bf00 nop
  20511. 8009092: 3714 adds r7, #20
  20512. 8009094: 46bd mov sp, r7
  20513. 8009096: f85d 7b04 ldr.w r7, [sp], #4
  20514. 800909a: 4770 bx lr
  20515. 0800909c <ETH_DMARxDescListInit>:
  20516. * @param heth: pointer to a ETH_HandleTypeDef structure that contains
  20517. * the configuration information for ETHERNET module
  20518. * @retval None
  20519. */
  20520. static void ETH_DMARxDescListInit(ETH_HandleTypeDef *heth)
  20521. {
  20522. 800909c: b480 push {r7}
  20523. 800909e: b085 sub sp, #20
  20524. 80090a0: af00 add r7, sp, #0
  20525. 80090a2: 6078 str r0, [r7, #4]
  20526. ETH_DMADescTypeDef *dmarxdesc;
  20527. uint32_t i;
  20528. for (i = 0; i < (uint32_t)ETH_RX_DESC_CNT; i++)
  20529. 80090a4: 2300 movs r3, #0
  20530. 80090a6: 60fb str r3, [r7, #12]
  20531. 80090a8: e023 b.n 80090f2 <ETH_DMARxDescListInit+0x56>
  20532. {
  20533. dmarxdesc = heth->Init.RxDesc + i;
  20534. 80090aa: 687b ldr r3, [r7, #4]
  20535. 80090ac: 6919 ldr r1, [r3, #16]
  20536. 80090ae: 68fa ldr r2, [r7, #12]
  20537. 80090b0: 4613 mov r3, r2
  20538. 80090b2: 005b lsls r3, r3, #1
  20539. 80090b4: 4413 add r3, r2
  20540. 80090b6: 00db lsls r3, r3, #3
  20541. 80090b8: 440b add r3, r1
  20542. 80090ba: 60bb str r3, [r7, #8]
  20543. WRITE_REG(dmarxdesc->DESC0, 0x0U);
  20544. 80090bc: 68bb ldr r3, [r7, #8]
  20545. 80090be: 2200 movs r2, #0
  20546. 80090c0: 601a str r2, [r3, #0]
  20547. WRITE_REG(dmarxdesc->DESC1, 0x0U);
  20548. 80090c2: 68bb ldr r3, [r7, #8]
  20549. 80090c4: 2200 movs r2, #0
  20550. 80090c6: 605a str r2, [r3, #4]
  20551. WRITE_REG(dmarxdesc->DESC2, 0x0U);
  20552. 80090c8: 68bb ldr r3, [r7, #8]
  20553. 80090ca: 2200 movs r2, #0
  20554. 80090cc: 609a str r2, [r3, #8]
  20555. WRITE_REG(dmarxdesc->DESC3, 0x0U);
  20556. 80090ce: 68bb ldr r3, [r7, #8]
  20557. 80090d0: 2200 movs r2, #0
  20558. 80090d2: 60da str r2, [r3, #12]
  20559. WRITE_REG(dmarxdesc->BackupAddr0, 0x0U);
  20560. 80090d4: 68bb ldr r3, [r7, #8]
  20561. 80090d6: 2200 movs r2, #0
  20562. 80090d8: 611a str r2, [r3, #16]
  20563. WRITE_REG(dmarxdesc->BackupAddr1, 0x0U);
  20564. 80090da: 68bb ldr r3, [r7, #8]
  20565. 80090dc: 2200 movs r2, #0
  20566. 80090de: 615a str r2, [r3, #20]
  20567. /* Set Rx descritors addresses */
  20568. WRITE_REG(heth->RxDescList.RxDesc[i], (uint32_t)dmarxdesc);
  20569. 80090e0: 68b9 ldr r1, [r7, #8]
  20570. 80090e2: 687b ldr r3, [r7, #4]
  20571. 80090e4: 68fa ldr r2, [r7, #12]
  20572. 80090e6: 3212 adds r2, #18
  20573. 80090e8: f843 1022 str.w r1, [r3, r2, lsl #2]
  20574. for (i = 0; i < (uint32_t)ETH_RX_DESC_CNT; i++)
  20575. 80090ec: 68fb ldr r3, [r7, #12]
  20576. 80090ee: 3301 adds r3, #1
  20577. 80090f0: 60fb str r3, [r7, #12]
  20578. 80090f2: 68fb ldr r3, [r7, #12]
  20579. 80090f4: 2b03 cmp r3, #3
  20580. 80090f6: d9d8 bls.n 80090aa <ETH_DMARxDescListInit+0xe>
  20581. }
  20582. WRITE_REG(heth->RxDescList.RxDescIdx, 0U);
  20583. 80090f8: 687b ldr r3, [r7, #4]
  20584. 80090fa: 2200 movs r2, #0
  20585. 80090fc: 65da str r2, [r3, #92] @ 0x5c
  20586. WRITE_REG(heth->RxDescList.RxDescCnt, 0U);
  20587. 80090fe: 687b ldr r3, [r7, #4]
  20588. 8009100: 2200 movs r2, #0
  20589. 8009102: 661a str r2, [r3, #96] @ 0x60
  20590. WRITE_REG(heth->RxDescList.RxBuildDescIdx, 0U);
  20591. 8009104: 687b ldr r3, [r7, #4]
  20592. 8009106: 2200 movs r2, #0
  20593. 8009108: 669a str r2, [r3, #104] @ 0x68
  20594. WRITE_REG(heth->RxDescList.RxBuildDescCnt, 0U);
  20595. 800910a: 687b ldr r3, [r7, #4]
  20596. 800910c: 2200 movs r2, #0
  20597. 800910e: 66da str r2, [r3, #108] @ 0x6c
  20598. WRITE_REG(heth->RxDescList.ItMode, 0U);
  20599. 8009110: 687b ldr r3, [r7, #4]
  20600. 8009112: 2200 movs r2, #0
  20601. 8009114: 659a str r2, [r3, #88] @ 0x58
  20602. /* Set Receive Descriptor Ring Length */
  20603. WRITE_REG(heth->Instance->DMACRDRLR, ((uint32_t)(ETH_RX_DESC_CNT - 1U)));
  20604. 8009116: 687b ldr r3, [r7, #4]
  20605. 8009118: 681b ldr r3, [r3, #0]
  20606. 800911a: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20607. 800911e: 461a mov r2, r3
  20608. 8009120: 2303 movs r3, #3
  20609. 8009122: f8c2 3130 str.w r3, [r2, #304] @ 0x130
  20610. /* Set Receive Descriptor List Address */
  20611. WRITE_REG(heth->Instance->DMACRDLAR, (uint32_t) heth->Init.RxDesc);
  20612. 8009126: 687b ldr r3, [r7, #4]
  20613. 8009128: 691a ldr r2, [r3, #16]
  20614. 800912a: 687b ldr r3, [r7, #4]
  20615. 800912c: 681b ldr r3, [r3, #0]
  20616. 800912e: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20617. 8009132: f8c3 211c str.w r2, [r3, #284] @ 0x11c
  20618. /* Set Receive Descriptor Tail pointer Address */
  20619. WRITE_REG(heth->Instance->DMACRDTPR, ((uint32_t)(heth->Init.RxDesc + (uint32_t)(ETH_RX_DESC_CNT - 1U))));
  20620. 8009136: 687b ldr r3, [r7, #4]
  20621. 8009138: 691b ldr r3, [r3, #16]
  20622. 800913a: f103 0248 add.w r2, r3, #72 @ 0x48
  20623. 800913e: 687b ldr r3, [r7, #4]
  20624. 8009140: 681b ldr r3, [r3, #0]
  20625. 8009142: f503 5380 add.w r3, r3, #4096 @ 0x1000
  20626. 8009146: f8c3 2128 str.w r2, [r3, #296] @ 0x128
  20627. }
  20628. 800914a: bf00 nop
  20629. 800914c: 3714 adds r7, #20
  20630. 800914e: 46bd mov sp, r7
  20631. 8009150: f85d 7b04 ldr.w r7, [sp], #4
  20632. 8009154: 4770 bx lr
  20633. ...
  20634. 08009158 <ETH_Prepare_Tx_Descriptors>:
  20635. * @param ItMode: Enable or disable Tx EOT interrept
  20636. * @retval Status
  20637. */
  20638. static uint32_t ETH_Prepare_Tx_Descriptors(ETH_HandleTypeDef *heth, const ETH_TxPacketConfigTypeDef *pTxConfig,
  20639. uint32_t ItMode)
  20640. {
  20641. 8009158: b480 push {r7}
  20642. 800915a: b091 sub sp, #68 @ 0x44
  20643. 800915c: af00 add r7, sp, #0
  20644. 800915e: 60f8 str r0, [r7, #12]
  20645. 8009160: 60b9 str r1, [r7, #8]
  20646. 8009162: 607a str r2, [r7, #4]
  20647. ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
  20648. 8009164: 68fb ldr r3, [r7, #12]
  20649. 8009166: 3318 adds r3, #24
  20650. 8009168: 627b str r3, [r7, #36] @ 0x24
  20651. uint32_t descidx = dmatxdesclist->CurTxDesc;
  20652. 800916a: 6a7b ldr r3, [r7, #36] @ 0x24
  20653. 800916c: 691b ldr r3, [r3, #16]
  20654. 800916e: 63fb str r3, [r7, #60] @ 0x3c
  20655. uint32_t firstdescidx = dmatxdesclist->CurTxDesc;
  20656. 8009170: 6a7b ldr r3, [r7, #36] @ 0x24
  20657. 8009172: 691b ldr r3, [r3, #16]
  20658. 8009174: 623b str r3, [r7, #32]
  20659. uint32_t idx;
  20660. uint32_t descnbr = 0;
  20661. 8009176: 2300 movs r3, #0
  20662. 8009178: 637b str r3, [r7, #52] @ 0x34
  20663. ETH_DMADescTypeDef *dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
  20664. 800917a: 6a7b ldr r3, [r7, #36] @ 0x24
  20665. 800917c: 6bfa ldr r2, [r7, #60] @ 0x3c
  20666. 800917e: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  20667. 8009182: 633b str r3, [r7, #48] @ 0x30
  20668. ETH_BufferTypeDef *txbuffer = pTxConfig->TxBuffer;
  20669. 8009184: 68bb ldr r3, [r7, #8]
  20670. 8009186: 689b ldr r3, [r3, #8]
  20671. 8009188: 62fb str r3, [r7, #44] @ 0x2c
  20672. uint32_t bd_count = 0;
  20673. 800918a: 2300 movs r3, #0
  20674. 800918c: 62bb str r3, [r7, #40] @ 0x28
  20675. uint32_t primask_bit;
  20676. /* Current Tx Descriptor Owned by DMA: cannot be used by the application */
  20677. if ((READ_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCWBF_OWN) == ETH_DMATXNDESCWBF_OWN)
  20678. 800918e: 6b3b ldr r3, [r7, #48] @ 0x30
  20679. 8009190: 68db ldr r3, [r3, #12]
  20680. 8009192: f003 4300 and.w r3, r3, #2147483648 @ 0x80000000
  20681. 8009196: f1b3 4f00 cmp.w r3, #2147483648 @ 0x80000000
  20682. 800919a: d007 beq.n 80091ac <ETH_Prepare_Tx_Descriptors+0x54>
  20683. || (dmatxdesclist->PacketAddress[descidx] != NULL))
  20684. 800919c: 6a7a ldr r2, [r7, #36] @ 0x24
  20685. 800919e: 6bfb ldr r3, [r7, #60] @ 0x3c
  20686. 80091a0: 3304 adds r3, #4
  20687. 80091a2: 009b lsls r3, r3, #2
  20688. 80091a4: 4413 add r3, r2
  20689. 80091a6: 685b ldr r3, [r3, #4]
  20690. 80091a8: 2b00 cmp r3, #0
  20691. 80091aa: d001 beq.n 80091b0 <ETH_Prepare_Tx_Descriptors+0x58>
  20692. {
  20693. return HAL_ETH_ERROR_BUSY;
  20694. 80091ac: 2302 movs r3, #2
  20695. 80091ae: e266 b.n 800967e <ETH_Prepare_Tx_Descriptors+0x526>
  20696. /***************************************************************************/
  20697. /***************** Context descriptor configuration (Optional) **********/
  20698. /***************************************************************************/
  20699. /* If VLAN tag is enabled for this packet */
  20700. if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET)
  20701. 80091b0: 68bb ldr r3, [r7, #8]
  20702. 80091b2: 681b ldr r3, [r3, #0]
  20703. 80091b4: f003 0304 and.w r3, r3, #4
  20704. 80091b8: 2b00 cmp r3, #0
  20705. 80091ba: d044 beq.n 8009246 <ETH_Prepare_Tx_Descriptors+0xee>
  20706. {
  20707. /* Set vlan tag value */
  20708. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXCDESC_VT, pTxConfig->VlanTag);
  20709. 80091bc: 6b3b ldr r3, [r7, #48] @ 0x30
  20710. 80091be: 68da ldr r2, [r3, #12]
  20711. 80091c0: 4b75 ldr r3, [pc, #468] @ (8009398 <ETH_Prepare_Tx_Descriptors+0x240>)
  20712. 80091c2: 4013 ands r3, r2
  20713. 80091c4: 68ba ldr r2, [r7, #8]
  20714. 80091c6: 6a52 ldr r2, [r2, #36] @ 0x24
  20715. 80091c8: 431a orrs r2, r3
  20716. 80091ca: 6b3b ldr r3, [r7, #48] @ 0x30
  20717. 80091cc: 60da str r2, [r3, #12]
  20718. /* Set vlan tag valid bit */
  20719. SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_VLTV);
  20720. 80091ce: 6b3b ldr r3, [r7, #48] @ 0x30
  20721. 80091d0: 68db ldr r3, [r3, #12]
  20722. 80091d2: f443 3280 orr.w r2, r3, #65536 @ 0x10000
  20723. 80091d6: 6b3b ldr r3, [r7, #48] @ 0x30
  20724. 80091d8: 60da str r2, [r3, #12]
  20725. /* Set the descriptor as the vlan input source */
  20726. SET_BIT(heth->Instance->MACVIR, ETH_MACVIR_VLTI);
  20727. 80091da: 68fb ldr r3, [r7, #12]
  20728. 80091dc: 681b ldr r3, [r3, #0]
  20729. 80091de: 6e1a ldr r2, [r3, #96] @ 0x60
  20730. 80091e0: 68fb ldr r3, [r7, #12]
  20731. 80091e2: 681b ldr r3, [r3, #0]
  20732. 80091e4: f442 1280 orr.w r2, r2, #1048576 @ 0x100000
  20733. 80091e8: 661a str r2, [r3, #96] @ 0x60
  20734. /* if inner VLAN is enabled */
  20735. if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_INNERVLANTAG) != (uint32_t)RESET)
  20736. 80091ea: 68bb ldr r3, [r7, #8]
  20737. 80091ec: 681b ldr r3, [r3, #0]
  20738. 80091ee: f003 0308 and.w r3, r3, #8
  20739. 80091f2: 2b00 cmp r3, #0
  20740. 80091f4: d027 beq.n 8009246 <ETH_Prepare_Tx_Descriptors+0xee>
  20741. {
  20742. /* Set inner vlan tag value */
  20743. MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXCDESC_IVT, (pTxConfig->InnerVlanTag << 16));
  20744. 80091f6: 6b3b ldr r3, [r7, #48] @ 0x30
  20745. 80091f8: 689b ldr r3, [r3, #8]
  20746. 80091fa: b29a uxth r2, r3
  20747. 80091fc: 68bb ldr r3, [r7, #8]
  20748. 80091fe: 6adb ldr r3, [r3, #44] @ 0x2c
  20749. 8009200: 041b lsls r3, r3, #16
  20750. 8009202: 431a orrs r2, r3
  20751. 8009204: 6b3b ldr r3, [r7, #48] @ 0x30
  20752. 8009206: 609a str r2, [r3, #8]
  20753. /* Set inner vlan tag valid bit */
  20754. SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_IVLTV);
  20755. 8009208: 6b3b ldr r3, [r7, #48] @ 0x30
  20756. 800920a: 68db ldr r3, [r3, #12]
  20757. 800920c: f443 3200 orr.w r2, r3, #131072 @ 0x20000
  20758. 8009210: 6b3b ldr r3, [r7, #48] @ 0x30
  20759. 8009212: 60da str r2, [r3, #12]
  20760. /* Set Vlan Tag control */
  20761. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXCDESC_IVTIR, pTxConfig->InnerVlanCtrl);
  20762. 8009214: 6b3b ldr r3, [r7, #48] @ 0x30
  20763. 8009216: 68db ldr r3, [r3, #12]
  20764. 8009218: f423 2240 bic.w r2, r3, #786432 @ 0xc0000
  20765. 800921c: 68bb ldr r3, [r7, #8]
  20766. 800921e: 6b1b ldr r3, [r3, #48] @ 0x30
  20767. 8009220: 431a orrs r2, r3
  20768. 8009222: 6b3b ldr r3, [r7, #48] @ 0x30
  20769. 8009224: 60da str r2, [r3, #12]
  20770. /* Set the descriptor as the inner vlan input source */
  20771. SET_BIT(heth->Instance->MACIVIR, ETH_MACIVIR_VLTI);
  20772. 8009226: 68fb ldr r3, [r7, #12]
  20773. 8009228: 681b ldr r3, [r3, #0]
  20774. 800922a: 6e5a ldr r2, [r3, #100] @ 0x64
  20775. 800922c: 68fb ldr r3, [r7, #12]
  20776. 800922e: 681b ldr r3, [r3, #0]
  20777. 8009230: f442 1280 orr.w r2, r2, #1048576 @ 0x100000
  20778. 8009234: 665a str r2, [r3, #100] @ 0x64
  20779. /* Enable double VLAN processing */
  20780. SET_BIT(heth->Instance->MACVTR, ETH_MACVTR_EDVLP);
  20781. 8009236: 68fb ldr r3, [r7, #12]
  20782. 8009238: 681b ldr r3, [r3, #0]
  20783. 800923a: 6d1a ldr r2, [r3, #80] @ 0x50
  20784. 800923c: 68fb ldr r3, [r7, #12]
  20785. 800923e: 681b ldr r3, [r3, #0]
  20786. 8009240: f042 6280 orr.w r2, r2, #67108864 @ 0x4000000
  20787. 8009244: 651a str r2, [r3, #80] @ 0x50
  20788. }
  20789. }
  20790. /* if tcp segmentation is enabled for this packet */
  20791. if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET)
  20792. 8009246: 68bb ldr r3, [r7, #8]
  20793. 8009248: 681b ldr r3, [r3, #0]
  20794. 800924a: f003 0310 and.w r3, r3, #16
  20795. 800924e: 2b00 cmp r3, #0
  20796. 8009250: d00e beq.n 8009270 <ETH_Prepare_Tx_Descriptors+0x118>
  20797. {
  20798. /* Set MSS value */
  20799. MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXCDESC_MSS, pTxConfig->MaxSegmentSize);
  20800. 8009252: 6b3b ldr r3, [r7, #48] @ 0x30
  20801. 8009254: 689a ldr r2, [r3, #8]
  20802. 8009256: 4b51 ldr r3, [pc, #324] @ (800939c <ETH_Prepare_Tx_Descriptors+0x244>)
  20803. 8009258: 4013 ands r3, r2
  20804. 800925a: 68ba ldr r2, [r7, #8]
  20805. 800925c: 6992 ldr r2, [r2, #24]
  20806. 800925e: 431a orrs r2, r3
  20807. 8009260: 6b3b ldr r3, [r7, #48] @ 0x30
  20808. 8009262: 609a str r2, [r3, #8]
  20809. /* Set MSS valid bit */
  20810. SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_TCMSSV);
  20811. 8009264: 6b3b ldr r3, [r7, #48] @ 0x30
  20812. 8009266: 68db ldr r3, [r3, #12]
  20813. 8009268: f043 6280 orr.w r2, r3, #67108864 @ 0x4000000
  20814. 800926c: 6b3b ldr r3, [r7, #48] @ 0x30
  20815. 800926e: 60da str r2, [r3, #12]
  20816. }
  20817. if ((READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET)
  20818. 8009270: 68bb ldr r3, [r7, #8]
  20819. 8009272: 681b ldr r3, [r3, #0]
  20820. 8009274: f003 0304 and.w r3, r3, #4
  20821. 8009278: 2b00 cmp r3, #0
  20822. 800927a: d105 bne.n 8009288 <ETH_Prepare_Tx_Descriptors+0x130>
  20823. || (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET))
  20824. 800927c: 68bb ldr r3, [r7, #8]
  20825. 800927e: 681b ldr r3, [r3, #0]
  20826. 8009280: f003 0310 and.w r3, r3, #16
  20827. 8009284: 2b00 cmp r3, #0
  20828. 8009286: d036 beq.n 80092f6 <ETH_Prepare_Tx_Descriptors+0x19e>
  20829. {
  20830. /* Set as context descriptor */
  20831. SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_CTXT);
  20832. 8009288: 6b3b ldr r3, [r7, #48] @ 0x30
  20833. 800928a: 68db ldr r3, [r3, #12]
  20834. 800928c: f043 4280 orr.w r2, r3, #1073741824 @ 0x40000000
  20835. 8009290: 6b3b ldr r3, [r7, #48] @ 0x30
  20836. 8009292: 60da str r2, [r3, #12]
  20837. __ASM volatile ("dmb 0xF":::"memory");
  20838. 8009294: f3bf 8f5f dmb sy
  20839. }
  20840. 8009298: bf00 nop
  20841. /* Ensure rest of descriptor is written to RAM before the OWN bit */
  20842. __DMB();
  20843. /* Set own bit */
  20844. SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_OWN);
  20845. 800929a: 6b3b ldr r3, [r7, #48] @ 0x30
  20846. 800929c: 68db ldr r3, [r3, #12]
  20847. 800929e: f043 4200 orr.w r2, r3, #2147483648 @ 0x80000000
  20848. 80092a2: 6b3b ldr r3, [r7, #48] @ 0x30
  20849. 80092a4: 60da str r2, [r3, #12]
  20850. /* Increment current tx descriptor index */
  20851. INCR_TX_DESC_INDEX(descidx, 1U);
  20852. 80092a6: 6bfb ldr r3, [r7, #60] @ 0x3c
  20853. 80092a8: 3301 adds r3, #1
  20854. 80092aa: 63fb str r3, [r7, #60] @ 0x3c
  20855. 80092ac: 6bfb ldr r3, [r7, #60] @ 0x3c
  20856. 80092ae: 2b03 cmp r3, #3
  20857. 80092b0: d902 bls.n 80092b8 <ETH_Prepare_Tx_Descriptors+0x160>
  20858. 80092b2: 6bfb ldr r3, [r7, #60] @ 0x3c
  20859. 80092b4: 3b04 subs r3, #4
  20860. 80092b6: 63fb str r3, [r7, #60] @ 0x3c
  20861. /* Get current descriptor address */
  20862. dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
  20863. 80092b8: 6a7b ldr r3, [r7, #36] @ 0x24
  20864. 80092ba: 6bfa ldr r2, [r7, #60] @ 0x3c
  20865. 80092bc: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  20866. 80092c0: 633b str r3, [r7, #48] @ 0x30
  20867. descnbr += 1U;
  20868. 80092c2: 6b7b ldr r3, [r7, #52] @ 0x34
  20869. 80092c4: 3301 adds r3, #1
  20870. 80092c6: 637b str r3, [r7, #52] @ 0x34
  20871. /* Current Tx Descriptor Owned by DMA: cannot be used by the application */
  20872. if (READ_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCWBF_OWN) == ETH_DMATXNDESCWBF_OWN)
  20873. 80092c8: 6b3b ldr r3, [r7, #48] @ 0x30
  20874. 80092ca: 68db ldr r3, [r3, #12]
  20875. 80092cc: f003 4300 and.w r3, r3, #2147483648 @ 0x80000000
  20876. 80092d0: f1b3 4f00 cmp.w r3, #2147483648 @ 0x80000000
  20877. 80092d4: d10f bne.n 80092f6 <ETH_Prepare_Tx_Descriptors+0x19e>
  20878. {
  20879. dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[firstdescidx];
  20880. 80092d6: 6a7b ldr r3, [r7, #36] @ 0x24
  20881. 80092d8: 6a3a ldr r2, [r7, #32]
  20882. 80092da: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  20883. 80092de: 633b str r3, [r7, #48] @ 0x30
  20884. __ASM volatile ("dmb 0xF":::"memory");
  20885. 80092e0: f3bf 8f5f dmb sy
  20886. }
  20887. 80092e4: bf00 nop
  20888. /* Ensure rest of descriptor is written to RAM before the OWN bit */
  20889. __DMB();
  20890. /* Clear own bit */
  20891. CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_OWN);
  20892. 80092e6: 6b3b ldr r3, [r7, #48] @ 0x30
  20893. 80092e8: 68db ldr r3, [r3, #12]
  20894. 80092ea: f023 4200 bic.w r2, r3, #2147483648 @ 0x80000000
  20895. 80092ee: 6b3b ldr r3, [r7, #48] @ 0x30
  20896. 80092f0: 60da str r2, [r3, #12]
  20897. return HAL_ETH_ERROR_BUSY;
  20898. 80092f2: 2302 movs r3, #2
  20899. 80092f4: e1c3 b.n 800967e <ETH_Prepare_Tx_Descriptors+0x526>
  20900. /***************************************************************************/
  20901. /***************** Normal descriptors configuration *****************/
  20902. /***************************************************************************/
  20903. descnbr += 1U;
  20904. 80092f6: 6b7b ldr r3, [r7, #52] @ 0x34
  20905. 80092f8: 3301 adds r3, #1
  20906. 80092fa: 637b str r3, [r7, #52] @ 0x34
  20907. /* Set header or buffer 1 address */
  20908. WRITE_REG(dmatxdesc->DESC0, (uint32_t)txbuffer->buffer);
  20909. 80092fc: 6afb ldr r3, [r7, #44] @ 0x2c
  20910. 80092fe: 681b ldr r3, [r3, #0]
  20911. 8009300: 461a mov r2, r3
  20912. 8009302: 6b3b ldr r3, [r7, #48] @ 0x30
  20913. 8009304: 601a str r2, [r3, #0]
  20914. /* Set header or buffer 1 Length */
  20915. MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B1L, txbuffer->len);
  20916. 8009306: 6b3b ldr r3, [r7, #48] @ 0x30
  20917. 8009308: 689a ldr r2, [r3, #8]
  20918. 800930a: 4b24 ldr r3, [pc, #144] @ (800939c <ETH_Prepare_Tx_Descriptors+0x244>)
  20919. 800930c: 4013 ands r3, r2
  20920. 800930e: 6afa ldr r2, [r7, #44] @ 0x2c
  20921. 8009310: 6852 ldr r2, [r2, #4]
  20922. 8009312: 431a orrs r2, r3
  20923. 8009314: 6b3b ldr r3, [r7, #48] @ 0x30
  20924. 8009316: 609a str r2, [r3, #8]
  20925. if (txbuffer->next != NULL)
  20926. 8009318: 6afb ldr r3, [r7, #44] @ 0x2c
  20927. 800931a: 689b ldr r3, [r3, #8]
  20928. 800931c: 2b00 cmp r3, #0
  20929. 800931e: d012 beq.n 8009346 <ETH_Prepare_Tx_Descriptors+0x1ee>
  20930. {
  20931. txbuffer = txbuffer->next;
  20932. 8009320: 6afb ldr r3, [r7, #44] @ 0x2c
  20933. 8009322: 689b ldr r3, [r3, #8]
  20934. 8009324: 62fb str r3, [r7, #44] @ 0x2c
  20935. /* Set buffer 2 address */
  20936. WRITE_REG(dmatxdesc->DESC1, (uint32_t)txbuffer->buffer);
  20937. 8009326: 6afb ldr r3, [r7, #44] @ 0x2c
  20938. 8009328: 681b ldr r3, [r3, #0]
  20939. 800932a: 461a mov r2, r3
  20940. 800932c: 6b3b ldr r3, [r7, #48] @ 0x30
  20941. 800932e: 605a str r2, [r3, #4]
  20942. /* Set buffer 2 Length */
  20943. MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, (txbuffer->len << 16));
  20944. 8009330: 6b3b ldr r3, [r7, #48] @ 0x30
  20945. 8009332: 689a ldr r2, [r3, #8]
  20946. 8009334: 4b1a ldr r3, [pc, #104] @ (80093a0 <ETH_Prepare_Tx_Descriptors+0x248>)
  20947. 8009336: 4013 ands r3, r2
  20948. 8009338: 6afa ldr r2, [r7, #44] @ 0x2c
  20949. 800933a: 6852 ldr r2, [r2, #4]
  20950. 800933c: 0412 lsls r2, r2, #16
  20951. 800933e: 431a orrs r2, r3
  20952. 8009340: 6b3b ldr r3, [r7, #48] @ 0x30
  20953. 8009342: 609a str r2, [r3, #8]
  20954. 8009344: e008 b.n 8009358 <ETH_Prepare_Tx_Descriptors+0x200>
  20955. }
  20956. else
  20957. {
  20958. WRITE_REG(dmatxdesc->DESC1, 0x0U);
  20959. 8009346: 6b3b ldr r3, [r7, #48] @ 0x30
  20960. 8009348: 2200 movs r2, #0
  20961. 800934a: 605a str r2, [r3, #4]
  20962. /* Set buffer 2 Length */
  20963. MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, 0x0U);
  20964. 800934c: 6b3b ldr r3, [r7, #48] @ 0x30
  20965. 800934e: 689a ldr r2, [r3, #8]
  20966. 8009350: 4b13 ldr r3, [pc, #76] @ (80093a0 <ETH_Prepare_Tx_Descriptors+0x248>)
  20967. 8009352: 4013 ands r3, r2
  20968. 8009354: 6b3a ldr r2, [r7, #48] @ 0x30
  20969. 8009356: 6093 str r3, [r2, #8]
  20970. }
  20971. if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET)
  20972. 8009358: 68bb ldr r3, [r7, #8]
  20973. 800935a: 681b ldr r3, [r3, #0]
  20974. 800935c: f003 0310 and.w r3, r3, #16
  20975. 8009360: 2b00 cmp r3, #0
  20976. 8009362: d021 beq.n 80093a8 <ETH_Prepare_Tx_Descriptors+0x250>
  20977. {
  20978. /* Set TCP Header length */
  20979. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_THL, (pTxConfig->TCPHeaderLen << 19));
  20980. 8009364: 6b3b ldr r3, [r7, #48] @ 0x30
  20981. 8009366: 68db ldr r3, [r3, #12]
  20982. 8009368: f423 02f0 bic.w r2, r3, #7864320 @ 0x780000
  20983. 800936c: 68bb ldr r3, [r7, #8]
  20984. 800936e: 6a1b ldr r3, [r3, #32]
  20985. 8009370: 04db lsls r3, r3, #19
  20986. 8009372: 431a orrs r2, r3
  20987. 8009374: 6b3b ldr r3, [r7, #48] @ 0x30
  20988. 8009376: 60da str r2, [r3, #12]
  20989. /* Set TCP payload length */
  20990. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TPL, pTxConfig->PayloadLen);
  20991. 8009378: 6b3b ldr r3, [r7, #48] @ 0x30
  20992. 800937a: 68da ldr r2, [r3, #12]
  20993. 800937c: 4b09 ldr r3, [pc, #36] @ (80093a4 <ETH_Prepare_Tx_Descriptors+0x24c>)
  20994. 800937e: 4013 ands r3, r2
  20995. 8009380: 68ba ldr r2, [r7, #8]
  20996. 8009382: 69d2 ldr r2, [r2, #28]
  20997. 8009384: 431a orrs r2, r3
  20998. 8009386: 6b3b ldr r3, [r7, #48] @ 0x30
  20999. 8009388: 60da str r2, [r3, #12]
  21000. /* Set TCP Segmentation Enabled bit */
  21001. SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TSE);
  21002. 800938a: 6b3b ldr r3, [r7, #48] @ 0x30
  21003. 800938c: 68db ldr r3, [r3, #12]
  21004. 800938e: f443 2280 orr.w r2, r3, #262144 @ 0x40000
  21005. 8009392: 6b3b ldr r3, [r7, #48] @ 0x30
  21006. 8009394: 60da str r2, [r3, #12]
  21007. 8009396: e02e b.n 80093f6 <ETH_Prepare_Tx_Descriptors+0x29e>
  21008. 8009398: ffff0000 .word 0xffff0000
  21009. 800939c: ffffc000 .word 0xffffc000
  21010. 80093a0: c000ffff .word 0xc000ffff
  21011. 80093a4: fffc0000 .word 0xfffc0000
  21012. }
  21013. else
  21014. {
  21015. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FL, pTxConfig->Length);
  21016. 80093a8: 6b3b ldr r3, [r7, #48] @ 0x30
  21017. 80093aa: 68da ldr r2, [r3, #12]
  21018. 80093ac: 4b7b ldr r3, [pc, #492] @ (800959c <ETH_Prepare_Tx_Descriptors+0x444>)
  21019. 80093ae: 4013 ands r3, r2
  21020. 80093b0: 68ba ldr r2, [r7, #8]
  21021. 80093b2: 6852 ldr r2, [r2, #4]
  21022. 80093b4: 431a orrs r2, r3
  21023. 80093b6: 6b3b ldr r3, [r7, #48] @ 0x30
  21024. 80093b8: 60da str r2, [r3, #12]
  21025. if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CSUM) != (uint32_t)RESET)
  21026. 80093ba: 68bb ldr r3, [r7, #8]
  21027. 80093bc: 681b ldr r3, [r3, #0]
  21028. 80093be: f003 0301 and.w r3, r3, #1
  21029. 80093c2: 2b00 cmp r3, #0
  21030. 80093c4: d008 beq.n 80093d8 <ETH_Prepare_Tx_Descriptors+0x280>
  21031. {
  21032. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CIC, pTxConfig->ChecksumCtrl);
  21033. 80093c6: 6b3b ldr r3, [r7, #48] @ 0x30
  21034. 80093c8: 68db ldr r3, [r3, #12]
  21035. 80093ca: f423 3240 bic.w r2, r3, #196608 @ 0x30000
  21036. 80093ce: 68bb ldr r3, [r7, #8]
  21037. 80093d0: 695b ldr r3, [r3, #20]
  21038. 80093d2: 431a orrs r2, r3
  21039. 80093d4: 6b3b ldr r3, [r7, #48] @ 0x30
  21040. 80093d6: 60da str r2, [r3, #12]
  21041. }
  21042. if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CRCPAD) != (uint32_t)RESET)
  21043. 80093d8: 68bb ldr r3, [r7, #8]
  21044. 80093da: 681b ldr r3, [r3, #0]
  21045. 80093dc: f003 0320 and.w r3, r3, #32
  21046. 80093e0: 2b00 cmp r3, #0
  21047. 80093e2: d008 beq.n 80093f6 <ETH_Prepare_Tx_Descriptors+0x29e>
  21048. {
  21049. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CPC, pTxConfig->CRCPadCtrl);
  21050. 80093e4: 6b3b ldr r3, [r7, #48] @ 0x30
  21051. 80093e6: 68db ldr r3, [r3, #12]
  21052. 80093e8: f023 6240 bic.w r2, r3, #201326592 @ 0xc000000
  21053. 80093ec: 68bb ldr r3, [r7, #8]
  21054. 80093ee: 691b ldr r3, [r3, #16]
  21055. 80093f0: 431a orrs r2, r3
  21056. 80093f2: 6b3b ldr r3, [r7, #48] @ 0x30
  21057. 80093f4: 60da str r2, [r3, #12]
  21058. }
  21059. }
  21060. if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET)
  21061. 80093f6: 68bb ldr r3, [r7, #8]
  21062. 80093f8: 681b ldr r3, [r3, #0]
  21063. 80093fa: f003 0304 and.w r3, r3, #4
  21064. 80093fe: 2b00 cmp r3, #0
  21065. 8009400: d008 beq.n 8009414 <ETH_Prepare_Tx_Descriptors+0x2bc>
  21066. {
  21067. /* Set Vlan Tag control */
  21068. MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_VTIR, pTxConfig->VlanCtrl);
  21069. 8009402: 6b3b ldr r3, [r7, #48] @ 0x30
  21070. 8009404: 689b ldr r3, [r3, #8]
  21071. 8009406: f423 4240 bic.w r2, r3, #49152 @ 0xc000
  21072. 800940a: 68bb ldr r3, [r7, #8]
  21073. 800940c: 6a9b ldr r3, [r3, #40] @ 0x28
  21074. 800940e: 431a orrs r2, r3
  21075. 8009410: 6b3b ldr r3, [r7, #48] @ 0x30
  21076. 8009412: 609a str r2, [r3, #8]
  21077. }
  21078. /* Mark it as First Descriptor */
  21079. SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FD);
  21080. 8009414: 6b3b ldr r3, [r7, #48] @ 0x30
  21081. 8009416: 68db ldr r3, [r3, #12]
  21082. 8009418: f043 5200 orr.w r2, r3, #536870912 @ 0x20000000
  21083. 800941c: 6b3b ldr r3, [r7, #48] @ 0x30
  21084. 800941e: 60da str r2, [r3, #12]
  21085. /* Mark it as NORMAL descriptor */
  21086. CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CTXT);
  21087. 8009420: 6b3b ldr r3, [r7, #48] @ 0x30
  21088. 8009422: 68db ldr r3, [r3, #12]
  21089. 8009424: f023 4280 bic.w r2, r3, #1073741824 @ 0x40000000
  21090. 8009428: 6b3b ldr r3, [r7, #48] @ 0x30
  21091. 800942a: 60da str r2, [r3, #12]
  21092. __ASM volatile ("dmb 0xF":::"memory");
  21093. 800942c: f3bf 8f5f dmb sy
  21094. }
  21095. 8009430: bf00 nop
  21096. /* Ensure rest of descriptor is written to RAM before the OWN bit */
  21097. __DMB();
  21098. /* set OWN bit of FIRST descriptor */
  21099. SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN);
  21100. 8009432: 6b3b ldr r3, [r7, #48] @ 0x30
  21101. 8009434: 68db ldr r3, [r3, #12]
  21102. 8009436: f043 4200 orr.w r2, r3, #2147483648 @ 0x80000000
  21103. 800943a: 6b3b ldr r3, [r7, #48] @ 0x30
  21104. 800943c: 60da str r2, [r3, #12]
  21105. /* If source address insertion/replacement is enabled for this packet */
  21106. if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_SAIC) != (uint32_t)RESET)
  21107. 800943e: 68bb ldr r3, [r7, #8]
  21108. 8009440: 681b ldr r3, [r3, #0]
  21109. 8009442: f003 0302 and.w r3, r3, #2
  21110. 8009446: 2b00 cmp r3, #0
  21111. 8009448: f000 80da beq.w 8009600 <ETH_Prepare_Tx_Descriptors+0x4a8>
  21112. {
  21113. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_SAIC, pTxConfig->SrcAddrCtrl);
  21114. 800944c: 6b3b ldr r3, [r7, #48] @ 0x30
  21115. 800944e: 68db ldr r3, [r3, #12]
  21116. 8009450: f023 7260 bic.w r2, r3, #58720256 @ 0x3800000
  21117. 8009454: 68bb ldr r3, [r7, #8]
  21118. 8009456: 68db ldr r3, [r3, #12]
  21119. 8009458: 431a orrs r2, r3
  21120. 800945a: 6b3b ldr r3, [r7, #48] @ 0x30
  21121. 800945c: 60da str r2, [r3, #12]
  21122. }
  21123. /* only if the packet is split into more than one descriptors > 1 */
  21124. while (txbuffer->next != NULL)
  21125. 800945e: e0cf b.n 8009600 <ETH_Prepare_Tx_Descriptors+0x4a8>
  21126. {
  21127. /* Clear the LD bit of previous descriptor */
  21128. CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_LD);
  21129. 8009460: 6b3b ldr r3, [r7, #48] @ 0x30
  21130. 8009462: 68db ldr r3, [r3, #12]
  21131. 8009464: f023 5280 bic.w r2, r3, #268435456 @ 0x10000000
  21132. 8009468: 6b3b ldr r3, [r7, #48] @ 0x30
  21133. 800946a: 60da str r2, [r3, #12]
  21134. /* Increment current tx descriptor index */
  21135. INCR_TX_DESC_INDEX(descidx, 1U);
  21136. 800946c: 6bfb ldr r3, [r7, #60] @ 0x3c
  21137. 800946e: 3301 adds r3, #1
  21138. 8009470: 63fb str r3, [r7, #60] @ 0x3c
  21139. 8009472: 6bfb ldr r3, [r7, #60] @ 0x3c
  21140. 8009474: 2b03 cmp r3, #3
  21141. 8009476: d902 bls.n 800947e <ETH_Prepare_Tx_Descriptors+0x326>
  21142. 8009478: 6bfb ldr r3, [r7, #60] @ 0x3c
  21143. 800947a: 3b04 subs r3, #4
  21144. 800947c: 63fb str r3, [r7, #60] @ 0x3c
  21145. /* Get current descriptor address */
  21146. dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
  21147. 800947e: 6a7b ldr r3, [r7, #36] @ 0x24
  21148. 8009480: 6bfa ldr r2, [r7, #60] @ 0x3c
  21149. 8009482: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  21150. 8009486: 633b str r3, [r7, #48] @ 0x30
  21151. /* Clear the FD bit of new Descriptor */
  21152. CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FD);
  21153. 8009488: 6b3b ldr r3, [r7, #48] @ 0x30
  21154. 800948a: 68db ldr r3, [r3, #12]
  21155. 800948c: f023 5200 bic.w r2, r3, #536870912 @ 0x20000000
  21156. 8009490: 6b3b ldr r3, [r7, #48] @ 0x30
  21157. 8009492: 60da str r2, [r3, #12]
  21158. /* Current Tx Descriptor Owned by DMA: cannot be used by the application */
  21159. if ((READ_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN) == ETH_DMATXNDESCRF_OWN)
  21160. 8009494: 6b3b ldr r3, [r7, #48] @ 0x30
  21161. 8009496: 68db ldr r3, [r3, #12]
  21162. 8009498: f003 4300 and.w r3, r3, #2147483648 @ 0x80000000
  21163. 800949c: f1b3 4f00 cmp.w r3, #2147483648 @ 0x80000000
  21164. 80094a0: d007 beq.n 80094b2 <ETH_Prepare_Tx_Descriptors+0x35a>
  21165. || (dmatxdesclist->PacketAddress[descidx] != NULL))
  21166. 80094a2: 6a7a ldr r2, [r7, #36] @ 0x24
  21167. 80094a4: 6bfb ldr r3, [r7, #60] @ 0x3c
  21168. 80094a6: 3304 adds r3, #4
  21169. 80094a8: 009b lsls r3, r3, #2
  21170. 80094aa: 4413 add r3, r2
  21171. 80094ac: 685b ldr r3, [r3, #4]
  21172. 80094ae: 2b00 cmp r3, #0
  21173. 80094b0: d029 beq.n 8009506 <ETH_Prepare_Tx_Descriptors+0x3ae>
  21174. {
  21175. descidx = firstdescidx;
  21176. 80094b2: 6a3b ldr r3, [r7, #32]
  21177. 80094b4: 63fb str r3, [r7, #60] @ 0x3c
  21178. dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
  21179. 80094b6: 6a7b ldr r3, [r7, #36] @ 0x24
  21180. 80094b8: 6bfa ldr r2, [r7, #60] @ 0x3c
  21181. 80094ba: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  21182. 80094be: 633b str r3, [r7, #48] @ 0x30
  21183. /* clear previous desc own bit */
  21184. for (idx = 0; idx < descnbr; idx ++)
  21185. 80094c0: 2300 movs r3, #0
  21186. 80094c2: 63bb str r3, [r7, #56] @ 0x38
  21187. 80094c4: e019 b.n 80094fa <ETH_Prepare_Tx_Descriptors+0x3a2>
  21188. __ASM volatile ("dmb 0xF":::"memory");
  21189. 80094c6: f3bf 8f5f dmb sy
  21190. }
  21191. 80094ca: bf00 nop
  21192. {
  21193. /* Ensure rest of descriptor is written to RAM before the OWN bit */
  21194. __DMB();
  21195. CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN);
  21196. 80094cc: 6b3b ldr r3, [r7, #48] @ 0x30
  21197. 80094ce: 68db ldr r3, [r3, #12]
  21198. 80094d0: f023 4200 bic.w r2, r3, #2147483648 @ 0x80000000
  21199. 80094d4: 6b3b ldr r3, [r7, #48] @ 0x30
  21200. 80094d6: 60da str r2, [r3, #12]
  21201. /* Increment current tx descriptor index */
  21202. INCR_TX_DESC_INDEX(descidx, 1U);
  21203. 80094d8: 6bfb ldr r3, [r7, #60] @ 0x3c
  21204. 80094da: 3301 adds r3, #1
  21205. 80094dc: 63fb str r3, [r7, #60] @ 0x3c
  21206. 80094de: 6bfb ldr r3, [r7, #60] @ 0x3c
  21207. 80094e0: 2b03 cmp r3, #3
  21208. 80094e2: d902 bls.n 80094ea <ETH_Prepare_Tx_Descriptors+0x392>
  21209. 80094e4: 6bfb ldr r3, [r7, #60] @ 0x3c
  21210. 80094e6: 3b04 subs r3, #4
  21211. 80094e8: 63fb str r3, [r7, #60] @ 0x3c
  21212. /* Get current descriptor address */
  21213. dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
  21214. 80094ea: 6a7b ldr r3, [r7, #36] @ 0x24
  21215. 80094ec: 6bfa ldr r2, [r7, #60] @ 0x3c
  21216. 80094ee: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  21217. 80094f2: 633b str r3, [r7, #48] @ 0x30
  21218. for (idx = 0; idx < descnbr; idx ++)
  21219. 80094f4: 6bbb ldr r3, [r7, #56] @ 0x38
  21220. 80094f6: 3301 adds r3, #1
  21221. 80094f8: 63bb str r3, [r7, #56] @ 0x38
  21222. 80094fa: 6bba ldr r2, [r7, #56] @ 0x38
  21223. 80094fc: 6b7b ldr r3, [r7, #52] @ 0x34
  21224. 80094fe: 429a cmp r2, r3
  21225. 8009500: d3e1 bcc.n 80094c6 <ETH_Prepare_Tx_Descriptors+0x36e>
  21226. }
  21227. return HAL_ETH_ERROR_BUSY;
  21228. 8009502: 2302 movs r3, #2
  21229. 8009504: e0bb b.n 800967e <ETH_Prepare_Tx_Descriptors+0x526>
  21230. }
  21231. descnbr += 1U;
  21232. 8009506: 6b7b ldr r3, [r7, #52] @ 0x34
  21233. 8009508: 3301 adds r3, #1
  21234. 800950a: 637b str r3, [r7, #52] @ 0x34
  21235. /* Get the next Tx buffer in the list */
  21236. txbuffer = txbuffer->next;
  21237. 800950c: 6afb ldr r3, [r7, #44] @ 0x2c
  21238. 800950e: 689b ldr r3, [r3, #8]
  21239. 8009510: 62fb str r3, [r7, #44] @ 0x2c
  21240. /* Set header or buffer 1 address */
  21241. WRITE_REG(dmatxdesc->DESC0, (uint32_t)txbuffer->buffer);
  21242. 8009512: 6afb ldr r3, [r7, #44] @ 0x2c
  21243. 8009514: 681b ldr r3, [r3, #0]
  21244. 8009516: 461a mov r2, r3
  21245. 8009518: 6b3b ldr r3, [r7, #48] @ 0x30
  21246. 800951a: 601a str r2, [r3, #0]
  21247. /* Set header or buffer 1 Length */
  21248. MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B1L, txbuffer->len);
  21249. 800951c: 6b3b ldr r3, [r7, #48] @ 0x30
  21250. 800951e: 689a ldr r2, [r3, #8]
  21251. 8009520: 4b1f ldr r3, [pc, #124] @ (80095a0 <ETH_Prepare_Tx_Descriptors+0x448>)
  21252. 8009522: 4013 ands r3, r2
  21253. 8009524: 6afa ldr r2, [r7, #44] @ 0x2c
  21254. 8009526: 6852 ldr r2, [r2, #4]
  21255. 8009528: 431a orrs r2, r3
  21256. 800952a: 6b3b ldr r3, [r7, #48] @ 0x30
  21257. 800952c: 609a str r2, [r3, #8]
  21258. if (txbuffer->next != NULL)
  21259. 800952e: 6afb ldr r3, [r7, #44] @ 0x2c
  21260. 8009530: 689b ldr r3, [r3, #8]
  21261. 8009532: 2b00 cmp r3, #0
  21262. 8009534: d012 beq.n 800955c <ETH_Prepare_Tx_Descriptors+0x404>
  21263. {
  21264. /* Get the next Tx buffer in the list */
  21265. txbuffer = txbuffer->next;
  21266. 8009536: 6afb ldr r3, [r7, #44] @ 0x2c
  21267. 8009538: 689b ldr r3, [r3, #8]
  21268. 800953a: 62fb str r3, [r7, #44] @ 0x2c
  21269. /* Set buffer 2 address */
  21270. WRITE_REG(dmatxdesc->DESC1, (uint32_t)txbuffer->buffer);
  21271. 800953c: 6afb ldr r3, [r7, #44] @ 0x2c
  21272. 800953e: 681b ldr r3, [r3, #0]
  21273. 8009540: 461a mov r2, r3
  21274. 8009542: 6b3b ldr r3, [r7, #48] @ 0x30
  21275. 8009544: 605a str r2, [r3, #4]
  21276. /* Set buffer 2 Length */
  21277. MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, (txbuffer->len << 16));
  21278. 8009546: 6b3b ldr r3, [r7, #48] @ 0x30
  21279. 8009548: 689a ldr r2, [r3, #8]
  21280. 800954a: 4b16 ldr r3, [pc, #88] @ (80095a4 <ETH_Prepare_Tx_Descriptors+0x44c>)
  21281. 800954c: 4013 ands r3, r2
  21282. 800954e: 6afa ldr r2, [r7, #44] @ 0x2c
  21283. 8009550: 6852 ldr r2, [r2, #4]
  21284. 8009552: 0412 lsls r2, r2, #16
  21285. 8009554: 431a orrs r2, r3
  21286. 8009556: 6b3b ldr r3, [r7, #48] @ 0x30
  21287. 8009558: 609a str r2, [r3, #8]
  21288. 800955a: e008 b.n 800956e <ETH_Prepare_Tx_Descriptors+0x416>
  21289. }
  21290. else
  21291. {
  21292. WRITE_REG(dmatxdesc->DESC1, 0x0U);
  21293. 800955c: 6b3b ldr r3, [r7, #48] @ 0x30
  21294. 800955e: 2200 movs r2, #0
  21295. 8009560: 605a str r2, [r3, #4]
  21296. /* Set buffer 2 Length */
  21297. MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, 0x0U);
  21298. 8009562: 6b3b ldr r3, [r7, #48] @ 0x30
  21299. 8009564: 689a ldr r2, [r3, #8]
  21300. 8009566: 4b0f ldr r3, [pc, #60] @ (80095a4 <ETH_Prepare_Tx_Descriptors+0x44c>)
  21301. 8009568: 4013 ands r3, r2
  21302. 800956a: 6b3a ldr r2, [r7, #48] @ 0x30
  21303. 800956c: 6093 str r3, [r2, #8]
  21304. }
  21305. if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET)
  21306. 800956e: 68bb ldr r3, [r7, #8]
  21307. 8009570: 681b ldr r3, [r3, #0]
  21308. 8009572: f003 0310 and.w r3, r3, #16
  21309. 8009576: 2b00 cmp r3, #0
  21310. 8009578: d018 beq.n 80095ac <ETH_Prepare_Tx_Descriptors+0x454>
  21311. {
  21312. /* Set TCP payload length */
  21313. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TPL, pTxConfig->PayloadLen);
  21314. 800957a: 6b3b ldr r3, [r7, #48] @ 0x30
  21315. 800957c: 68da ldr r2, [r3, #12]
  21316. 800957e: 4b0a ldr r3, [pc, #40] @ (80095a8 <ETH_Prepare_Tx_Descriptors+0x450>)
  21317. 8009580: 4013 ands r3, r2
  21318. 8009582: 68ba ldr r2, [r7, #8]
  21319. 8009584: 69d2 ldr r2, [r2, #28]
  21320. 8009586: 431a orrs r2, r3
  21321. 8009588: 6b3b ldr r3, [r7, #48] @ 0x30
  21322. 800958a: 60da str r2, [r3, #12]
  21323. /* Set TCP Segmentation Enabled bit */
  21324. SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TSE);
  21325. 800958c: 6b3b ldr r3, [r7, #48] @ 0x30
  21326. 800958e: 68db ldr r3, [r3, #12]
  21327. 8009590: f443 2280 orr.w r2, r3, #262144 @ 0x40000
  21328. 8009594: 6b3b ldr r3, [r7, #48] @ 0x30
  21329. 8009596: 60da str r2, [r3, #12]
  21330. 8009598: e020 b.n 80095dc <ETH_Prepare_Tx_Descriptors+0x484>
  21331. 800959a: bf00 nop
  21332. 800959c: ffff8000 .word 0xffff8000
  21333. 80095a0: ffffc000 .word 0xffffc000
  21334. 80095a4: c000ffff .word 0xc000ffff
  21335. 80095a8: fffc0000 .word 0xfffc0000
  21336. }
  21337. else
  21338. {
  21339. /* Set the packet length */
  21340. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FL, pTxConfig->Length);
  21341. 80095ac: 6b3b ldr r3, [r7, #48] @ 0x30
  21342. 80095ae: 68da ldr r2, [r3, #12]
  21343. 80095b0: 4b36 ldr r3, [pc, #216] @ (800968c <ETH_Prepare_Tx_Descriptors+0x534>)
  21344. 80095b2: 4013 ands r3, r2
  21345. 80095b4: 68ba ldr r2, [r7, #8]
  21346. 80095b6: 6852 ldr r2, [r2, #4]
  21347. 80095b8: 431a orrs r2, r3
  21348. 80095ba: 6b3b ldr r3, [r7, #48] @ 0x30
  21349. 80095bc: 60da str r2, [r3, #12]
  21350. if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CSUM) != (uint32_t)RESET)
  21351. 80095be: 68bb ldr r3, [r7, #8]
  21352. 80095c0: 681b ldr r3, [r3, #0]
  21353. 80095c2: f003 0301 and.w r3, r3, #1
  21354. 80095c6: 2b00 cmp r3, #0
  21355. 80095c8: d008 beq.n 80095dc <ETH_Prepare_Tx_Descriptors+0x484>
  21356. {
  21357. /* Checksum Insertion Control */
  21358. MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CIC, pTxConfig->ChecksumCtrl);
  21359. 80095ca: 6b3b ldr r3, [r7, #48] @ 0x30
  21360. 80095cc: 68db ldr r3, [r3, #12]
  21361. 80095ce: f423 3240 bic.w r2, r3, #196608 @ 0x30000
  21362. 80095d2: 68bb ldr r3, [r7, #8]
  21363. 80095d4: 695b ldr r3, [r3, #20]
  21364. 80095d6: 431a orrs r2, r3
  21365. 80095d8: 6b3b ldr r3, [r7, #48] @ 0x30
  21366. 80095da: 60da str r2, [r3, #12]
  21367. }
  21368. }
  21369. bd_count += 1U;
  21370. 80095dc: 6abb ldr r3, [r7, #40] @ 0x28
  21371. 80095de: 3301 adds r3, #1
  21372. 80095e0: 62bb str r3, [r7, #40] @ 0x28
  21373. __ASM volatile ("dmb 0xF":::"memory");
  21374. 80095e2: f3bf 8f5f dmb sy
  21375. }
  21376. 80095e6: bf00 nop
  21377. /* Ensure rest of descriptor is written to RAM before the OWN bit */
  21378. __DMB();
  21379. /* Set Own bit */
  21380. SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN);
  21381. 80095e8: 6b3b ldr r3, [r7, #48] @ 0x30
  21382. 80095ea: 68db ldr r3, [r3, #12]
  21383. 80095ec: f043 4200 orr.w r2, r3, #2147483648 @ 0x80000000
  21384. 80095f0: 6b3b ldr r3, [r7, #48] @ 0x30
  21385. 80095f2: 60da str r2, [r3, #12]
  21386. /* Mark it as NORMAL descriptor */
  21387. CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CTXT);
  21388. 80095f4: 6b3b ldr r3, [r7, #48] @ 0x30
  21389. 80095f6: 68db ldr r3, [r3, #12]
  21390. 80095f8: f023 4280 bic.w r2, r3, #1073741824 @ 0x40000000
  21391. 80095fc: 6b3b ldr r3, [r7, #48] @ 0x30
  21392. 80095fe: 60da str r2, [r3, #12]
  21393. while (txbuffer->next != NULL)
  21394. 8009600: 6afb ldr r3, [r7, #44] @ 0x2c
  21395. 8009602: 689b ldr r3, [r3, #8]
  21396. 8009604: 2b00 cmp r3, #0
  21397. 8009606: f47f af2b bne.w 8009460 <ETH_Prepare_Tx_Descriptors+0x308>
  21398. }
  21399. if (ItMode != ((uint32_t)RESET))
  21400. 800960a: 687b ldr r3, [r7, #4]
  21401. 800960c: 2b00 cmp r3, #0
  21402. 800960e: d006 beq.n 800961e <ETH_Prepare_Tx_Descriptors+0x4c6>
  21403. {
  21404. /* Set Interrupt on completion bit */
  21405. SET_BIT(dmatxdesc->DESC2, ETH_DMATXNDESCRF_IOC);
  21406. 8009610: 6b3b ldr r3, [r7, #48] @ 0x30
  21407. 8009612: 689b ldr r3, [r3, #8]
  21408. 8009614: f043 4200 orr.w r2, r3, #2147483648 @ 0x80000000
  21409. 8009618: 6b3b ldr r3, [r7, #48] @ 0x30
  21410. 800961a: 609a str r2, [r3, #8]
  21411. 800961c: e005 b.n 800962a <ETH_Prepare_Tx_Descriptors+0x4d2>
  21412. }
  21413. else
  21414. {
  21415. /* Clear Interrupt on completion bit */
  21416. CLEAR_BIT(dmatxdesc->DESC2, ETH_DMATXNDESCRF_IOC);
  21417. 800961e: 6b3b ldr r3, [r7, #48] @ 0x30
  21418. 8009620: 689b ldr r3, [r3, #8]
  21419. 8009622: f023 4200 bic.w r2, r3, #2147483648 @ 0x80000000
  21420. 8009626: 6b3b ldr r3, [r7, #48] @ 0x30
  21421. 8009628: 609a str r2, [r3, #8]
  21422. }
  21423. /* Mark it as LAST descriptor */
  21424. SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_LD);
  21425. 800962a: 6b3b ldr r3, [r7, #48] @ 0x30
  21426. 800962c: 68db ldr r3, [r3, #12]
  21427. 800962e: f043 5280 orr.w r2, r3, #268435456 @ 0x10000000
  21428. 8009632: 6b3b ldr r3, [r7, #48] @ 0x30
  21429. 8009634: 60da str r2, [r3, #12]
  21430. /* Save the current packet address to expose it to the application */
  21431. dmatxdesclist->PacketAddress[descidx] = dmatxdesclist->CurrentPacketAddress;
  21432. 8009636: 6a7b ldr r3, [r7, #36] @ 0x24
  21433. 8009638: 6a5a ldr r2, [r3, #36] @ 0x24
  21434. 800963a: 6a79 ldr r1, [r7, #36] @ 0x24
  21435. 800963c: 6bfb ldr r3, [r7, #60] @ 0x3c
  21436. 800963e: 3304 adds r3, #4
  21437. 8009640: 009b lsls r3, r3, #2
  21438. 8009642: 440b add r3, r1
  21439. 8009644: 605a str r2, [r3, #4]
  21440. dmatxdesclist->CurTxDesc = descidx;
  21441. 8009646: 6a7b ldr r3, [r7, #36] @ 0x24
  21442. 8009648: 6bfa ldr r2, [r7, #60] @ 0x3c
  21443. 800964a: 611a str r2, [r3, #16]
  21444. __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory");
  21445. 800964c: f3ef 8310 mrs r3, PRIMASK
  21446. 8009650: 613b str r3, [r7, #16]
  21447. return(result);
  21448. 8009652: 693b ldr r3, [r7, #16]
  21449. /* Enter critical section */
  21450. primask_bit = __get_PRIMASK();
  21451. 8009654: 61fb str r3, [r7, #28]
  21452. 8009656: 2301 movs r3, #1
  21453. 8009658: 617b str r3, [r7, #20]
  21454. __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
  21455. 800965a: 697b ldr r3, [r7, #20]
  21456. 800965c: f383 8810 msr PRIMASK, r3
  21457. }
  21458. 8009660: bf00 nop
  21459. __set_PRIMASK(1);
  21460. dmatxdesclist->BuffersInUse += bd_count + 1U;
  21461. 8009662: 6a7b ldr r3, [r7, #36] @ 0x24
  21462. 8009664: 6a9a ldr r2, [r3, #40] @ 0x28
  21463. 8009666: 6abb ldr r3, [r7, #40] @ 0x28
  21464. 8009668: 4413 add r3, r2
  21465. 800966a: 1c5a adds r2, r3, #1
  21466. 800966c: 6a7b ldr r3, [r7, #36] @ 0x24
  21467. 800966e: 629a str r2, [r3, #40] @ 0x28
  21468. 8009670: 69fb ldr r3, [r7, #28]
  21469. 8009672: 61bb str r3, [r7, #24]
  21470. __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
  21471. 8009674: 69bb ldr r3, [r7, #24]
  21472. 8009676: f383 8810 msr PRIMASK, r3
  21473. }
  21474. 800967a: bf00 nop
  21475. /* Exit critical section: restore previous priority mask */
  21476. __set_PRIMASK(primask_bit);
  21477. /* Return function status */
  21478. return HAL_ETH_ERROR_NONE;
  21479. 800967c: 2300 movs r3, #0
  21480. }
  21481. 800967e: 4618 mov r0, r3
  21482. 8009680: 3744 adds r7, #68 @ 0x44
  21483. 8009682: 46bd mov sp, r7
  21484. 8009684: f85d 7b04 ldr.w r7, [sp], #4
  21485. 8009688: 4770 bx lr
  21486. 800968a: bf00 nop
  21487. 800968c: ffff8000 .word 0xffff8000
  21488. 08009690 <HAL_GPIO_Init>:
  21489. * @param GPIO_Init: pointer to a GPIO_InitTypeDef structure that contains
  21490. * the configuration information for the specified GPIO peripheral.
  21491. * @retval None
  21492. */
  21493. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
  21494. {
  21495. 8009690: b480 push {r7}
  21496. 8009692: b089 sub sp, #36 @ 0x24
  21497. 8009694: af00 add r7, sp, #0
  21498. 8009696: 6078 str r0, [r7, #4]
  21499. 8009698: 6039 str r1, [r7, #0]
  21500. uint32_t position = 0x00U;
  21501. 800969a: 2300 movs r3, #0
  21502. 800969c: 61fb str r3, [r7, #28]
  21503. EXTI_Core_TypeDef *EXTI_CurrentCPU;
  21504. #if defined(DUAL_CORE) && defined(CORE_CM4)
  21505. EXTI_CurrentCPU = EXTI_D2; /* EXTI for CM4 CPU */
  21506. #else
  21507. EXTI_CurrentCPU = EXTI_D1; /* EXTI for CM7 CPU */
  21508. 800969e: 4b89 ldr r3, [pc, #548] @ (80098c4 <HAL_GPIO_Init+0x234>)
  21509. 80096a0: 617b str r3, [r7, #20]
  21510. assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
  21511. assert_param(IS_GPIO_PIN(GPIO_Init->Pin));
  21512. assert_param(IS_GPIO_MODE(GPIO_Init->Mode));
  21513. /* Configure the port pins */
  21514. while (((GPIO_Init->Pin) >> position) != 0x00U)
  21515. 80096a2: e194 b.n 80099ce <HAL_GPIO_Init+0x33e>
  21516. {
  21517. /* Get current io position */
  21518. iocurrent = (GPIO_Init->Pin) & (1UL << position);
  21519. 80096a4: 683b ldr r3, [r7, #0]
  21520. 80096a6: 681a ldr r2, [r3, #0]
  21521. 80096a8: 2101 movs r1, #1
  21522. 80096aa: 69fb ldr r3, [r7, #28]
  21523. 80096ac: fa01 f303 lsl.w r3, r1, r3
  21524. 80096b0: 4013 ands r3, r2
  21525. 80096b2: 613b str r3, [r7, #16]
  21526. if (iocurrent != 0x00U)
  21527. 80096b4: 693b ldr r3, [r7, #16]
  21528. 80096b6: 2b00 cmp r3, #0
  21529. 80096b8: f000 8186 beq.w 80099c8 <HAL_GPIO_Init+0x338>
  21530. {
  21531. /*--------------------- GPIO Mode Configuration ------------------------*/
  21532. /* In case of Output or Alternate function mode selection */
  21533. if (((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || ((GPIO_Init->Mode & GPIO_MODE) == MODE_AF))
  21534. 80096bc: 683b ldr r3, [r7, #0]
  21535. 80096be: 685b ldr r3, [r3, #4]
  21536. 80096c0: f003 0303 and.w r3, r3, #3
  21537. 80096c4: 2b01 cmp r3, #1
  21538. 80096c6: d005 beq.n 80096d4 <HAL_GPIO_Init+0x44>
  21539. 80096c8: 683b ldr r3, [r7, #0]
  21540. 80096ca: 685b ldr r3, [r3, #4]
  21541. 80096cc: f003 0303 and.w r3, r3, #3
  21542. 80096d0: 2b02 cmp r3, #2
  21543. 80096d2: d130 bne.n 8009736 <HAL_GPIO_Init+0xa6>
  21544. {
  21545. /* Check the Speed parameter */
  21546. assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
  21547. /* Configure the IO Speed */
  21548. temp = GPIOx->OSPEEDR;
  21549. 80096d4: 687b ldr r3, [r7, #4]
  21550. 80096d6: 689b ldr r3, [r3, #8]
  21551. 80096d8: 61bb str r3, [r7, #24]
  21552. temp &= ~(GPIO_OSPEEDR_OSPEED0 << (position * 2U));
  21553. 80096da: 69fb ldr r3, [r7, #28]
  21554. 80096dc: 005b lsls r3, r3, #1
  21555. 80096de: 2203 movs r2, #3
  21556. 80096e0: fa02 f303 lsl.w r3, r2, r3
  21557. 80096e4: 43db mvns r3, r3
  21558. 80096e6: 69ba ldr r2, [r7, #24]
  21559. 80096e8: 4013 ands r3, r2
  21560. 80096ea: 61bb str r3, [r7, #24]
  21561. temp |= (GPIO_Init->Speed << (position * 2U));
  21562. 80096ec: 683b ldr r3, [r7, #0]
  21563. 80096ee: 68da ldr r2, [r3, #12]
  21564. 80096f0: 69fb ldr r3, [r7, #28]
  21565. 80096f2: 005b lsls r3, r3, #1
  21566. 80096f4: fa02 f303 lsl.w r3, r2, r3
  21567. 80096f8: 69ba ldr r2, [r7, #24]
  21568. 80096fa: 4313 orrs r3, r2
  21569. 80096fc: 61bb str r3, [r7, #24]
  21570. GPIOx->OSPEEDR = temp;
  21571. 80096fe: 687b ldr r3, [r7, #4]
  21572. 8009700: 69ba ldr r2, [r7, #24]
  21573. 8009702: 609a str r2, [r3, #8]
  21574. /* Configure the IO Output Type */
  21575. temp = GPIOx->OTYPER;
  21576. 8009704: 687b ldr r3, [r7, #4]
  21577. 8009706: 685b ldr r3, [r3, #4]
  21578. 8009708: 61bb str r3, [r7, #24]
  21579. temp &= ~(GPIO_OTYPER_OT0 << position) ;
  21580. 800970a: 2201 movs r2, #1
  21581. 800970c: 69fb ldr r3, [r7, #28]
  21582. 800970e: fa02 f303 lsl.w r3, r2, r3
  21583. 8009712: 43db mvns r3, r3
  21584. 8009714: 69ba ldr r2, [r7, #24]
  21585. 8009716: 4013 ands r3, r2
  21586. 8009718: 61bb str r3, [r7, #24]
  21587. temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position);
  21588. 800971a: 683b ldr r3, [r7, #0]
  21589. 800971c: 685b ldr r3, [r3, #4]
  21590. 800971e: 091b lsrs r3, r3, #4
  21591. 8009720: f003 0201 and.w r2, r3, #1
  21592. 8009724: 69fb ldr r3, [r7, #28]
  21593. 8009726: fa02 f303 lsl.w r3, r2, r3
  21594. 800972a: 69ba ldr r2, [r7, #24]
  21595. 800972c: 4313 orrs r3, r2
  21596. 800972e: 61bb str r3, [r7, #24]
  21597. GPIOx->OTYPER = temp;
  21598. 8009730: 687b ldr r3, [r7, #4]
  21599. 8009732: 69ba ldr r2, [r7, #24]
  21600. 8009734: 605a str r2, [r3, #4]
  21601. }
  21602. if ((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG)
  21603. 8009736: 683b ldr r3, [r7, #0]
  21604. 8009738: 685b ldr r3, [r3, #4]
  21605. 800973a: f003 0303 and.w r3, r3, #3
  21606. 800973e: 2b03 cmp r3, #3
  21607. 8009740: d017 beq.n 8009772 <HAL_GPIO_Init+0xe2>
  21608. {
  21609. /* Check the Pull parameter */
  21610. assert_param(IS_GPIO_PULL(GPIO_Init->Pull));
  21611. /* Activate the Pull-up or Pull down resistor for the current IO */
  21612. temp = GPIOx->PUPDR;
  21613. 8009742: 687b ldr r3, [r7, #4]
  21614. 8009744: 68db ldr r3, [r3, #12]
  21615. 8009746: 61bb str r3, [r7, #24]
  21616. temp &= ~(GPIO_PUPDR_PUPD0 << (position * 2U));
  21617. 8009748: 69fb ldr r3, [r7, #28]
  21618. 800974a: 005b lsls r3, r3, #1
  21619. 800974c: 2203 movs r2, #3
  21620. 800974e: fa02 f303 lsl.w r3, r2, r3
  21621. 8009752: 43db mvns r3, r3
  21622. 8009754: 69ba ldr r2, [r7, #24]
  21623. 8009756: 4013 ands r3, r2
  21624. 8009758: 61bb str r3, [r7, #24]
  21625. temp |= ((GPIO_Init->Pull) << (position * 2U));
  21626. 800975a: 683b ldr r3, [r7, #0]
  21627. 800975c: 689a ldr r2, [r3, #8]
  21628. 800975e: 69fb ldr r3, [r7, #28]
  21629. 8009760: 005b lsls r3, r3, #1
  21630. 8009762: fa02 f303 lsl.w r3, r2, r3
  21631. 8009766: 69ba ldr r2, [r7, #24]
  21632. 8009768: 4313 orrs r3, r2
  21633. 800976a: 61bb str r3, [r7, #24]
  21634. GPIOx->PUPDR = temp;
  21635. 800976c: 687b ldr r3, [r7, #4]
  21636. 800976e: 69ba ldr r2, [r7, #24]
  21637. 8009770: 60da str r2, [r3, #12]
  21638. }
  21639. /* In case of Alternate function mode selection */
  21640. if ((GPIO_Init->Mode & GPIO_MODE) == MODE_AF)
  21641. 8009772: 683b ldr r3, [r7, #0]
  21642. 8009774: 685b ldr r3, [r3, #4]
  21643. 8009776: f003 0303 and.w r3, r3, #3
  21644. 800977a: 2b02 cmp r3, #2
  21645. 800977c: d123 bne.n 80097c6 <HAL_GPIO_Init+0x136>
  21646. /* Check the Alternate function parameters */
  21647. assert_param(IS_GPIO_AF_INSTANCE(GPIOx));
  21648. assert_param(IS_GPIO_AF(GPIO_Init->Alternate));
  21649. /* Configure Alternate function mapped with the current IO */
  21650. temp = GPIOx->AFR[position >> 3U];
  21651. 800977e: 69fb ldr r3, [r7, #28]
  21652. 8009780: 08da lsrs r2, r3, #3
  21653. 8009782: 687b ldr r3, [r7, #4]
  21654. 8009784: 3208 adds r2, #8
  21655. 8009786: f853 3022 ldr.w r3, [r3, r2, lsl #2]
  21656. 800978a: 61bb str r3, [r7, #24]
  21657. temp &= ~(0xFU << ((position & 0x07U) * 4U));
  21658. 800978c: 69fb ldr r3, [r7, #28]
  21659. 800978e: f003 0307 and.w r3, r3, #7
  21660. 8009792: 009b lsls r3, r3, #2
  21661. 8009794: 220f movs r2, #15
  21662. 8009796: fa02 f303 lsl.w r3, r2, r3
  21663. 800979a: 43db mvns r3, r3
  21664. 800979c: 69ba ldr r2, [r7, #24]
  21665. 800979e: 4013 ands r3, r2
  21666. 80097a0: 61bb str r3, [r7, #24]
  21667. temp |= ((GPIO_Init->Alternate) << ((position & 0x07U) * 4U));
  21668. 80097a2: 683b ldr r3, [r7, #0]
  21669. 80097a4: 691a ldr r2, [r3, #16]
  21670. 80097a6: 69fb ldr r3, [r7, #28]
  21671. 80097a8: f003 0307 and.w r3, r3, #7
  21672. 80097ac: 009b lsls r3, r3, #2
  21673. 80097ae: fa02 f303 lsl.w r3, r2, r3
  21674. 80097b2: 69ba ldr r2, [r7, #24]
  21675. 80097b4: 4313 orrs r3, r2
  21676. 80097b6: 61bb str r3, [r7, #24]
  21677. GPIOx->AFR[position >> 3U] = temp;
  21678. 80097b8: 69fb ldr r3, [r7, #28]
  21679. 80097ba: 08da lsrs r2, r3, #3
  21680. 80097bc: 687b ldr r3, [r7, #4]
  21681. 80097be: 3208 adds r2, #8
  21682. 80097c0: 69b9 ldr r1, [r7, #24]
  21683. 80097c2: f843 1022 str.w r1, [r3, r2, lsl #2]
  21684. }
  21685. /* Configure IO Direction mode (Input, Output, Alternate or Analog) */
  21686. temp = GPIOx->MODER;
  21687. 80097c6: 687b ldr r3, [r7, #4]
  21688. 80097c8: 681b ldr r3, [r3, #0]
  21689. 80097ca: 61bb str r3, [r7, #24]
  21690. temp &= ~(GPIO_MODER_MODE0 << (position * 2U));
  21691. 80097cc: 69fb ldr r3, [r7, #28]
  21692. 80097ce: 005b lsls r3, r3, #1
  21693. 80097d0: 2203 movs r2, #3
  21694. 80097d2: fa02 f303 lsl.w r3, r2, r3
  21695. 80097d6: 43db mvns r3, r3
  21696. 80097d8: 69ba ldr r2, [r7, #24]
  21697. 80097da: 4013 ands r3, r2
  21698. 80097dc: 61bb str r3, [r7, #24]
  21699. temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U));
  21700. 80097de: 683b ldr r3, [r7, #0]
  21701. 80097e0: 685b ldr r3, [r3, #4]
  21702. 80097e2: f003 0203 and.w r2, r3, #3
  21703. 80097e6: 69fb ldr r3, [r7, #28]
  21704. 80097e8: 005b lsls r3, r3, #1
  21705. 80097ea: fa02 f303 lsl.w r3, r2, r3
  21706. 80097ee: 69ba ldr r2, [r7, #24]
  21707. 80097f0: 4313 orrs r3, r2
  21708. 80097f2: 61bb str r3, [r7, #24]
  21709. GPIOx->MODER = temp;
  21710. 80097f4: 687b ldr r3, [r7, #4]
  21711. 80097f6: 69ba ldr r2, [r7, #24]
  21712. 80097f8: 601a str r2, [r3, #0]
  21713. /*--------------------- EXTI Mode Configuration ------------------------*/
  21714. /* Configure the External Interrupt or event for the current IO */
  21715. if ((GPIO_Init->Mode & EXTI_MODE) != 0x00U)
  21716. 80097fa: 683b ldr r3, [r7, #0]
  21717. 80097fc: 685b ldr r3, [r3, #4]
  21718. 80097fe: f403 3340 and.w r3, r3, #196608 @ 0x30000
  21719. 8009802: 2b00 cmp r3, #0
  21720. 8009804: f000 80e0 beq.w 80099c8 <HAL_GPIO_Init+0x338>
  21721. {
  21722. /* Enable SYSCFG Clock */
  21723. __HAL_RCC_SYSCFG_CLK_ENABLE();
  21724. 8009808: 4b2f ldr r3, [pc, #188] @ (80098c8 <HAL_GPIO_Init+0x238>)
  21725. 800980a: f8d3 30f4 ldr.w r3, [r3, #244] @ 0xf4
  21726. 800980e: 4a2e ldr r2, [pc, #184] @ (80098c8 <HAL_GPIO_Init+0x238>)
  21727. 8009810: f043 0302 orr.w r3, r3, #2
  21728. 8009814: f8c2 30f4 str.w r3, [r2, #244] @ 0xf4
  21729. 8009818: 4b2b ldr r3, [pc, #172] @ (80098c8 <HAL_GPIO_Init+0x238>)
  21730. 800981a: f8d3 30f4 ldr.w r3, [r3, #244] @ 0xf4
  21731. 800981e: f003 0302 and.w r3, r3, #2
  21732. 8009822: 60fb str r3, [r7, #12]
  21733. 8009824: 68fb ldr r3, [r7, #12]
  21734. temp = SYSCFG->EXTICR[position >> 2U];
  21735. 8009826: 4a29 ldr r2, [pc, #164] @ (80098cc <HAL_GPIO_Init+0x23c>)
  21736. 8009828: 69fb ldr r3, [r7, #28]
  21737. 800982a: 089b lsrs r3, r3, #2
  21738. 800982c: 3302 adds r3, #2
  21739. 800982e: f852 3023 ldr.w r3, [r2, r3, lsl #2]
  21740. 8009832: 61bb str r3, [r7, #24]
  21741. temp &= ~(0x0FUL << (4U * (position & 0x03U)));
  21742. 8009834: 69fb ldr r3, [r7, #28]
  21743. 8009836: f003 0303 and.w r3, r3, #3
  21744. 800983a: 009b lsls r3, r3, #2
  21745. 800983c: 220f movs r2, #15
  21746. 800983e: fa02 f303 lsl.w r3, r2, r3
  21747. 8009842: 43db mvns r3, r3
  21748. 8009844: 69ba ldr r2, [r7, #24]
  21749. 8009846: 4013 ands r3, r2
  21750. 8009848: 61bb str r3, [r7, #24]
  21751. temp |= (GPIO_GET_INDEX(GPIOx) << (4U * (position & 0x03U)));
  21752. 800984a: 687b ldr r3, [r7, #4]
  21753. 800984c: 4a20 ldr r2, [pc, #128] @ (80098d0 <HAL_GPIO_Init+0x240>)
  21754. 800984e: 4293 cmp r3, r2
  21755. 8009850: d052 beq.n 80098f8 <HAL_GPIO_Init+0x268>
  21756. 8009852: 687b ldr r3, [r7, #4]
  21757. 8009854: 4a1f ldr r2, [pc, #124] @ (80098d4 <HAL_GPIO_Init+0x244>)
  21758. 8009856: 4293 cmp r3, r2
  21759. 8009858: d031 beq.n 80098be <HAL_GPIO_Init+0x22e>
  21760. 800985a: 687b ldr r3, [r7, #4]
  21761. 800985c: 4a1e ldr r2, [pc, #120] @ (80098d8 <HAL_GPIO_Init+0x248>)
  21762. 800985e: 4293 cmp r3, r2
  21763. 8009860: d02b beq.n 80098ba <HAL_GPIO_Init+0x22a>
  21764. 8009862: 687b ldr r3, [r7, #4]
  21765. 8009864: 4a1d ldr r2, [pc, #116] @ (80098dc <HAL_GPIO_Init+0x24c>)
  21766. 8009866: 4293 cmp r3, r2
  21767. 8009868: d025 beq.n 80098b6 <HAL_GPIO_Init+0x226>
  21768. 800986a: 687b ldr r3, [r7, #4]
  21769. 800986c: 4a1c ldr r2, [pc, #112] @ (80098e0 <HAL_GPIO_Init+0x250>)
  21770. 800986e: 4293 cmp r3, r2
  21771. 8009870: d01f beq.n 80098b2 <HAL_GPIO_Init+0x222>
  21772. 8009872: 687b ldr r3, [r7, #4]
  21773. 8009874: 4a1b ldr r2, [pc, #108] @ (80098e4 <HAL_GPIO_Init+0x254>)
  21774. 8009876: 4293 cmp r3, r2
  21775. 8009878: d019 beq.n 80098ae <HAL_GPIO_Init+0x21e>
  21776. 800987a: 687b ldr r3, [r7, #4]
  21777. 800987c: 4a1a ldr r2, [pc, #104] @ (80098e8 <HAL_GPIO_Init+0x258>)
  21778. 800987e: 4293 cmp r3, r2
  21779. 8009880: d013 beq.n 80098aa <HAL_GPIO_Init+0x21a>
  21780. 8009882: 687b ldr r3, [r7, #4]
  21781. 8009884: 4a19 ldr r2, [pc, #100] @ (80098ec <HAL_GPIO_Init+0x25c>)
  21782. 8009886: 4293 cmp r3, r2
  21783. 8009888: d00d beq.n 80098a6 <HAL_GPIO_Init+0x216>
  21784. 800988a: 687b ldr r3, [r7, #4]
  21785. 800988c: 4a18 ldr r2, [pc, #96] @ (80098f0 <HAL_GPIO_Init+0x260>)
  21786. 800988e: 4293 cmp r3, r2
  21787. 8009890: d007 beq.n 80098a2 <HAL_GPIO_Init+0x212>
  21788. 8009892: 687b ldr r3, [r7, #4]
  21789. 8009894: 4a17 ldr r2, [pc, #92] @ (80098f4 <HAL_GPIO_Init+0x264>)
  21790. 8009896: 4293 cmp r3, r2
  21791. 8009898: d101 bne.n 800989e <HAL_GPIO_Init+0x20e>
  21792. 800989a: 2309 movs r3, #9
  21793. 800989c: e02d b.n 80098fa <HAL_GPIO_Init+0x26a>
  21794. 800989e: 230a movs r3, #10
  21795. 80098a0: e02b b.n 80098fa <HAL_GPIO_Init+0x26a>
  21796. 80098a2: 2308 movs r3, #8
  21797. 80098a4: e029 b.n 80098fa <HAL_GPIO_Init+0x26a>
  21798. 80098a6: 2307 movs r3, #7
  21799. 80098a8: e027 b.n 80098fa <HAL_GPIO_Init+0x26a>
  21800. 80098aa: 2306 movs r3, #6
  21801. 80098ac: e025 b.n 80098fa <HAL_GPIO_Init+0x26a>
  21802. 80098ae: 2305 movs r3, #5
  21803. 80098b0: e023 b.n 80098fa <HAL_GPIO_Init+0x26a>
  21804. 80098b2: 2304 movs r3, #4
  21805. 80098b4: e021 b.n 80098fa <HAL_GPIO_Init+0x26a>
  21806. 80098b6: 2303 movs r3, #3
  21807. 80098b8: e01f b.n 80098fa <HAL_GPIO_Init+0x26a>
  21808. 80098ba: 2302 movs r3, #2
  21809. 80098bc: e01d b.n 80098fa <HAL_GPIO_Init+0x26a>
  21810. 80098be: 2301 movs r3, #1
  21811. 80098c0: e01b b.n 80098fa <HAL_GPIO_Init+0x26a>
  21812. 80098c2: bf00 nop
  21813. 80098c4: 58000080 .word 0x58000080
  21814. 80098c8: 58024400 .word 0x58024400
  21815. 80098cc: 58000400 .word 0x58000400
  21816. 80098d0: 58020000 .word 0x58020000
  21817. 80098d4: 58020400 .word 0x58020400
  21818. 80098d8: 58020800 .word 0x58020800
  21819. 80098dc: 58020c00 .word 0x58020c00
  21820. 80098e0: 58021000 .word 0x58021000
  21821. 80098e4: 58021400 .word 0x58021400
  21822. 80098e8: 58021800 .word 0x58021800
  21823. 80098ec: 58021c00 .word 0x58021c00
  21824. 80098f0: 58022000 .word 0x58022000
  21825. 80098f4: 58022400 .word 0x58022400
  21826. 80098f8: 2300 movs r3, #0
  21827. 80098fa: 69fa ldr r2, [r7, #28]
  21828. 80098fc: f002 0203 and.w r2, r2, #3
  21829. 8009900: 0092 lsls r2, r2, #2
  21830. 8009902: 4093 lsls r3, r2
  21831. 8009904: 69ba ldr r2, [r7, #24]
  21832. 8009906: 4313 orrs r3, r2
  21833. 8009908: 61bb str r3, [r7, #24]
  21834. SYSCFG->EXTICR[position >> 2U] = temp;
  21835. 800990a: 4938 ldr r1, [pc, #224] @ (80099ec <HAL_GPIO_Init+0x35c>)
  21836. 800990c: 69fb ldr r3, [r7, #28]
  21837. 800990e: 089b lsrs r3, r3, #2
  21838. 8009910: 3302 adds r3, #2
  21839. 8009912: 69ba ldr r2, [r7, #24]
  21840. 8009914: f841 2023 str.w r2, [r1, r3, lsl #2]
  21841. /* Clear Rising Falling edge configuration */
  21842. temp = EXTI->RTSR1;
  21843. 8009918: f04f 43b0 mov.w r3, #1476395008 @ 0x58000000
  21844. 800991c: 681b ldr r3, [r3, #0]
  21845. 800991e: 61bb str r3, [r7, #24]
  21846. temp &= ~(iocurrent);
  21847. 8009920: 693b ldr r3, [r7, #16]
  21848. 8009922: 43db mvns r3, r3
  21849. 8009924: 69ba ldr r2, [r7, #24]
  21850. 8009926: 4013 ands r3, r2
  21851. 8009928: 61bb str r3, [r7, #24]
  21852. if ((GPIO_Init->Mode & TRIGGER_RISING) != 0x00U)
  21853. 800992a: 683b ldr r3, [r7, #0]
  21854. 800992c: 685b ldr r3, [r3, #4]
  21855. 800992e: f403 1380 and.w r3, r3, #1048576 @ 0x100000
  21856. 8009932: 2b00 cmp r3, #0
  21857. 8009934: d003 beq.n 800993e <HAL_GPIO_Init+0x2ae>
  21858. {
  21859. temp |= iocurrent;
  21860. 8009936: 69ba ldr r2, [r7, #24]
  21861. 8009938: 693b ldr r3, [r7, #16]
  21862. 800993a: 4313 orrs r3, r2
  21863. 800993c: 61bb str r3, [r7, #24]
  21864. }
  21865. EXTI->RTSR1 = temp;
  21866. 800993e: f04f 42b0 mov.w r2, #1476395008 @ 0x58000000
  21867. 8009942: 69bb ldr r3, [r7, #24]
  21868. 8009944: 6013 str r3, [r2, #0]
  21869. temp = EXTI->FTSR1;
  21870. 8009946: f04f 43b0 mov.w r3, #1476395008 @ 0x58000000
  21871. 800994a: 685b ldr r3, [r3, #4]
  21872. 800994c: 61bb str r3, [r7, #24]
  21873. temp &= ~(iocurrent);
  21874. 800994e: 693b ldr r3, [r7, #16]
  21875. 8009950: 43db mvns r3, r3
  21876. 8009952: 69ba ldr r2, [r7, #24]
  21877. 8009954: 4013 ands r3, r2
  21878. 8009956: 61bb str r3, [r7, #24]
  21879. if ((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00U)
  21880. 8009958: 683b ldr r3, [r7, #0]
  21881. 800995a: 685b ldr r3, [r3, #4]
  21882. 800995c: f403 1300 and.w r3, r3, #2097152 @ 0x200000
  21883. 8009960: 2b00 cmp r3, #0
  21884. 8009962: d003 beq.n 800996c <HAL_GPIO_Init+0x2dc>
  21885. {
  21886. temp |= iocurrent;
  21887. 8009964: 69ba ldr r2, [r7, #24]
  21888. 8009966: 693b ldr r3, [r7, #16]
  21889. 8009968: 4313 orrs r3, r2
  21890. 800996a: 61bb str r3, [r7, #24]
  21891. }
  21892. EXTI->FTSR1 = temp;
  21893. 800996c: f04f 42b0 mov.w r2, #1476395008 @ 0x58000000
  21894. 8009970: 69bb ldr r3, [r7, #24]
  21895. 8009972: 6053 str r3, [r2, #4]
  21896. temp = EXTI_CurrentCPU->EMR1;
  21897. 8009974: 697b ldr r3, [r7, #20]
  21898. 8009976: 685b ldr r3, [r3, #4]
  21899. 8009978: 61bb str r3, [r7, #24]
  21900. temp &= ~(iocurrent);
  21901. 800997a: 693b ldr r3, [r7, #16]
  21902. 800997c: 43db mvns r3, r3
  21903. 800997e: 69ba ldr r2, [r7, #24]
  21904. 8009980: 4013 ands r3, r2
  21905. 8009982: 61bb str r3, [r7, #24]
  21906. if ((GPIO_Init->Mode & EXTI_EVT) != 0x00U)
  21907. 8009984: 683b ldr r3, [r7, #0]
  21908. 8009986: 685b ldr r3, [r3, #4]
  21909. 8009988: f403 3300 and.w r3, r3, #131072 @ 0x20000
  21910. 800998c: 2b00 cmp r3, #0
  21911. 800998e: d003 beq.n 8009998 <HAL_GPIO_Init+0x308>
  21912. {
  21913. temp |= iocurrent;
  21914. 8009990: 69ba ldr r2, [r7, #24]
  21915. 8009992: 693b ldr r3, [r7, #16]
  21916. 8009994: 4313 orrs r3, r2
  21917. 8009996: 61bb str r3, [r7, #24]
  21918. }
  21919. EXTI_CurrentCPU->EMR1 = temp;
  21920. 8009998: 697b ldr r3, [r7, #20]
  21921. 800999a: 69ba ldr r2, [r7, #24]
  21922. 800999c: 605a str r2, [r3, #4]
  21923. /* Clear EXTI line configuration */
  21924. temp = EXTI_CurrentCPU->IMR1;
  21925. 800999e: 697b ldr r3, [r7, #20]
  21926. 80099a0: 681b ldr r3, [r3, #0]
  21927. 80099a2: 61bb str r3, [r7, #24]
  21928. temp &= ~(iocurrent);
  21929. 80099a4: 693b ldr r3, [r7, #16]
  21930. 80099a6: 43db mvns r3, r3
  21931. 80099a8: 69ba ldr r2, [r7, #24]
  21932. 80099aa: 4013 ands r3, r2
  21933. 80099ac: 61bb str r3, [r7, #24]
  21934. if ((GPIO_Init->Mode & EXTI_IT) != 0x00U)
  21935. 80099ae: 683b ldr r3, [r7, #0]
  21936. 80099b0: 685b ldr r3, [r3, #4]
  21937. 80099b2: f403 3380 and.w r3, r3, #65536 @ 0x10000
  21938. 80099b6: 2b00 cmp r3, #0
  21939. 80099b8: d003 beq.n 80099c2 <HAL_GPIO_Init+0x332>
  21940. {
  21941. temp |= iocurrent;
  21942. 80099ba: 69ba ldr r2, [r7, #24]
  21943. 80099bc: 693b ldr r3, [r7, #16]
  21944. 80099be: 4313 orrs r3, r2
  21945. 80099c0: 61bb str r3, [r7, #24]
  21946. }
  21947. EXTI_CurrentCPU->IMR1 = temp;
  21948. 80099c2: 697b ldr r3, [r7, #20]
  21949. 80099c4: 69ba ldr r2, [r7, #24]
  21950. 80099c6: 601a str r2, [r3, #0]
  21951. }
  21952. }
  21953. position++;
  21954. 80099c8: 69fb ldr r3, [r7, #28]
  21955. 80099ca: 3301 adds r3, #1
  21956. 80099cc: 61fb str r3, [r7, #28]
  21957. while (((GPIO_Init->Pin) >> position) != 0x00U)
  21958. 80099ce: 683b ldr r3, [r7, #0]
  21959. 80099d0: 681a ldr r2, [r3, #0]
  21960. 80099d2: 69fb ldr r3, [r7, #28]
  21961. 80099d4: fa22 f303 lsr.w r3, r2, r3
  21962. 80099d8: 2b00 cmp r3, #0
  21963. 80099da: f47f ae63 bne.w 80096a4 <HAL_GPIO_Init+0x14>
  21964. }
  21965. }
  21966. 80099de: bf00 nop
  21967. 80099e0: bf00 nop
  21968. 80099e2: 3724 adds r7, #36 @ 0x24
  21969. 80099e4: 46bd mov sp, r7
  21970. 80099e6: f85d 7b04 ldr.w r7, [sp], #4
  21971. 80099ea: 4770 bx lr
  21972. 80099ec: 58000400 .word 0x58000400
  21973. 080099f0 <HAL_GPIO_WritePin>:
  21974. * @arg GPIO_PIN_RESET: to clear the port pin
  21975. * @arg GPIO_PIN_SET: to set the port pin
  21976. * @retval None
  21977. */
  21978. void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
  21979. {
  21980. 80099f0: b480 push {r7}
  21981. 80099f2: b083 sub sp, #12
  21982. 80099f4: af00 add r7, sp, #0
  21983. 80099f6: 6078 str r0, [r7, #4]
  21984. 80099f8: 460b mov r3, r1
  21985. 80099fa: 807b strh r3, [r7, #2]
  21986. 80099fc: 4613 mov r3, r2
  21987. 80099fe: 707b strb r3, [r7, #1]
  21988. /* Check the parameters */
  21989. assert_param(IS_GPIO_PIN(GPIO_Pin));
  21990. assert_param(IS_GPIO_PIN_ACTION(PinState));
  21991. if (PinState != GPIO_PIN_RESET)
  21992. 8009a00: 787b ldrb r3, [r7, #1]
  21993. 8009a02: 2b00 cmp r3, #0
  21994. 8009a04: d003 beq.n 8009a0e <HAL_GPIO_WritePin+0x1e>
  21995. {
  21996. GPIOx->BSRR = GPIO_Pin;
  21997. 8009a06: 887a ldrh r2, [r7, #2]
  21998. 8009a08: 687b ldr r3, [r7, #4]
  21999. 8009a0a: 619a str r2, [r3, #24]
  22000. }
  22001. else
  22002. {
  22003. GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER;
  22004. }
  22005. }
  22006. 8009a0c: e003 b.n 8009a16 <HAL_GPIO_WritePin+0x26>
  22007. GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER;
  22008. 8009a0e: 887b ldrh r3, [r7, #2]
  22009. 8009a10: 041a lsls r2, r3, #16
  22010. 8009a12: 687b ldr r3, [r7, #4]
  22011. 8009a14: 619a str r2, [r3, #24]
  22012. }
  22013. 8009a16: bf00 nop
  22014. 8009a18: 370c adds r7, #12
  22015. 8009a1a: 46bd mov sp, r7
  22016. 8009a1c: f85d 7b04 ldr.w r7, [sp], #4
  22017. 8009a20: 4770 bx lr
  22018. ...
  22019. 08009a24 <HAL_PWREx_ConfigSupply>:
  22020. * PWR_SMPS_2V5_SUPPLIES_EXT are used only for lines that supports SMPS
  22021. * regulator.
  22022. * @retval HAL status.
  22023. */
  22024. HAL_StatusTypeDef HAL_PWREx_ConfigSupply (uint32_t SupplySource)
  22025. {
  22026. 8009a24: b580 push {r7, lr}
  22027. 8009a26: b084 sub sp, #16
  22028. 8009a28: af00 add r7, sp, #0
  22029. 8009a2a: 6078 str r0, [r7, #4]
  22030. /* Check the parameters */
  22031. assert_param (IS_PWR_SUPPLY (SupplySource));
  22032. /* Check if supply source was configured */
  22033. #if defined (PWR_FLAG_SCUEN)
  22034. if (__HAL_PWR_GET_FLAG (PWR_FLAG_SCUEN) == 0U)
  22035. 8009a2c: 4b19 ldr r3, [pc, #100] @ (8009a94 <HAL_PWREx_ConfigSupply+0x70>)
  22036. 8009a2e: 68db ldr r3, [r3, #12]
  22037. 8009a30: f003 0304 and.w r3, r3, #4
  22038. 8009a34: 2b04 cmp r3, #4
  22039. 8009a36: d00a beq.n 8009a4e <HAL_PWREx_ConfigSupply+0x2a>
  22040. #else
  22041. if ((PWR->CR3 & (PWR_CR3_SMPSEN | PWR_CR3_LDOEN | PWR_CR3_BYPASS)) != (PWR_CR3_SMPSEN | PWR_CR3_LDOEN))
  22042. #endif /* defined (PWR_FLAG_SCUEN) */
  22043. {
  22044. /* Check supply configuration */
  22045. if ((PWR->CR3 & PWR_SUPPLY_CONFIG_MASK) != SupplySource)
  22046. 8009a38: 4b16 ldr r3, [pc, #88] @ (8009a94 <HAL_PWREx_ConfigSupply+0x70>)
  22047. 8009a3a: 68db ldr r3, [r3, #12]
  22048. 8009a3c: f003 0307 and.w r3, r3, #7
  22049. 8009a40: 687a ldr r2, [r7, #4]
  22050. 8009a42: 429a cmp r2, r3
  22051. 8009a44: d001 beq.n 8009a4a <HAL_PWREx_ConfigSupply+0x26>
  22052. {
  22053. /* Supply configuration update locked, can't apply a new supply config */
  22054. return HAL_ERROR;
  22055. 8009a46: 2301 movs r3, #1
  22056. 8009a48: e01f b.n 8009a8a <HAL_PWREx_ConfigSupply+0x66>
  22057. else
  22058. {
  22059. /* Supply configuration update locked, but new supply configuration
  22060. matches with old supply configuration : nothing to do
  22061. */
  22062. return HAL_OK;
  22063. 8009a4a: 2300 movs r3, #0
  22064. 8009a4c: e01d b.n 8009a8a <HAL_PWREx_ConfigSupply+0x66>
  22065. }
  22066. }
  22067. /* Set the power supply configuration */
  22068. MODIFY_REG (PWR->CR3, PWR_SUPPLY_CONFIG_MASK, SupplySource);
  22069. 8009a4e: 4b11 ldr r3, [pc, #68] @ (8009a94 <HAL_PWREx_ConfigSupply+0x70>)
  22070. 8009a50: 68db ldr r3, [r3, #12]
  22071. 8009a52: f023 0207 bic.w r2, r3, #7
  22072. 8009a56: 490f ldr r1, [pc, #60] @ (8009a94 <HAL_PWREx_ConfigSupply+0x70>)
  22073. 8009a58: 687b ldr r3, [r7, #4]
  22074. 8009a5a: 4313 orrs r3, r2
  22075. 8009a5c: 60cb str r3, [r1, #12]
  22076. /* Get tick */
  22077. tickstart = HAL_GetTick ();
  22078. 8009a5e: f7fb fae7 bl 8005030 <HAL_GetTick>
  22079. 8009a62: 60f8 str r0, [r7, #12]
  22080. /* Wait till voltage level flag is set */
  22081. while (__HAL_PWR_GET_FLAG (PWR_FLAG_ACTVOSRDY) == 0U)
  22082. 8009a64: e009 b.n 8009a7a <HAL_PWREx_ConfigSupply+0x56>
  22083. {
  22084. if ((HAL_GetTick () - tickstart) > PWR_FLAG_SETTING_DELAY)
  22085. 8009a66: f7fb fae3 bl 8005030 <HAL_GetTick>
  22086. 8009a6a: 4602 mov r2, r0
  22087. 8009a6c: 68fb ldr r3, [r7, #12]
  22088. 8009a6e: 1ad3 subs r3, r2, r3
  22089. 8009a70: f5b3 7f7a cmp.w r3, #1000 @ 0x3e8
  22090. 8009a74: d901 bls.n 8009a7a <HAL_PWREx_ConfigSupply+0x56>
  22091. {
  22092. return HAL_ERROR;
  22093. 8009a76: 2301 movs r3, #1
  22094. 8009a78: e007 b.n 8009a8a <HAL_PWREx_ConfigSupply+0x66>
  22095. while (__HAL_PWR_GET_FLAG (PWR_FLAG_ACTVOSRDY) == 0U)
  22096. 8009a7a: 4b06 ldr r3, [pc, #24] @ (8009a94 <HAL_PWREx_ConfigSupply+0x70>)
  22097. 8009a7c: 685b ldr r3, [r3, #4]
  22098. 8009a7e: f403 5300 and.w r3, r3, #8192 @ 0x2000
  22099. 8009a82: f5b3 5f00 cmp.w r3, #8192 @ 0x2000
  22100. 8009a86: d1ee bne.n 8009a66 <HAL_PWREx_ConfigSupply+0x42>
  22101. }
  22102. }
  22103. }
  22104. #endif /* defined (SMPS) */
  22105. return HAL_OK;
  22106. 8009a88: 2300 movs r3, #0
  22107. }
  22108. 8009a8a: 4618 mov r0, r3
  22109. 8009a8c: 3710 adds r7, #16
  22110. 8009a8e: 46bd mov sp, r7
  22111. 8009a90: bd80 pop {r7, pc}
  22112. 8009a92: bf00 nop
  22113. 8009a94: 58024800 .word 0x58024800
  22114. 08009a98 <HAL_RCC_OscConfig>:
  22115. * supported by this function. User should request a transition to HSE Off
  22116. * first and then HSE On or HSE Bypass.
  22117. * @retval HAL status
  22118. */
  22119. __weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
  22120. {
  22121. 8009a98: b580 push {r7, lr}
  22122. 8009a9a: b08c sub sp, #48 @ 0x30
  22123. 8009a9c: af00 add r7, sp, #0
  22124. 8009a9e: 6078 str r0, [r7, #4]
  22125. uint32_t tickstart;
  22126. uint32_t temp1_pllckcfg, temp2_pllckcfg;
  22127. /* Check Null pointer */
  22128. if (RCC_OscInitStruct == NULL)
  22129. 8009aa0: 687b ldr r3, [r7, #4]
  22130. 8009aa2: 2b00 cmp r3, #0
  22131. 8009aa4: d102 bne.n 8009aac <HAL_RCC_OscConfig+0x14>
  22132. {
  22133. return HAL_ERROR;
  22134. 8009aa6: 2301 movs r3, #1
  22135. 8009aa8: f000 bc48 b.w 800a33c <HAL_RCC_OscConfig+0x8a4>
  22136. }
  22137. /* Check the parameters */
  22138. assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType));
  22139. /*------------------------------- HSE Configuration ------------------------*/
  22140. if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE)
  22141. 8009aac: 687b ldr r3, [r7, #4]
  22142. 8009aae: 681b ldr r3, [r3, #0]
  22143. 8009ab0: f003 0301 and.w r3, r3, #1
  22144. 8009ab4: 2b00 cmp r3, #0
  22145. 8009ab6: f000 8088 beq.w 8009bca <HAL_RCC_OscConfig+0x132>
  22146. {
  22147. /* Check the parameters */
  22148. assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState));
  22149. const uint32_t temp_sysclksrc = __HAL_RCC_GET_SYSCLK_SOURCE();
  22150. 8009aba: 4b99 ldr r3, [pc, #612] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22151. 8009abc: 691b ldr r3, [r3, #16]
  22152. 8009abe: f003 0338 and.w r3, r3, #56 @ 0x38
  22153. 8009ac2: 62fb str r3, [r7, #44] @ 0x2c
  22154. const uint32_t temp_pllckselr = RCC->PLLCKSELR;
  22155. 8009ac4: 4b96 ldr r3, [pc, #600] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22156. 8009ac6: 6a9b ldr r3, [r3, #40] @ 0x28
  22157. 8009ac8: 62bb str r3, [r7, #40] @ 0x28
  22158. /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */
  22159. if ((temp_sysclksrc == RCC_CFGR_SWS_HSE) || ((temp_sysclksrc == RCC_CFGR_SWS_PLL1) && ((temp_pllckselr & RCC_PLLCKSELR_PLLSRC) == RCC_PLLCKSELR_PLLSRC_HSE)))
  22160. 8009aca: 6afb ldr r3, [r7, #44] @ 0x2c
  22161. 8009acc: 2b10 cmp r3, #16
  22162. 8009ace: d007 beq.n 8009ae0 <HAL_RCC_OscConfig+0x48>
  22163. 8009ad0: 6afb ldr r3, [r7, #44] @ 0x2c
  22164. 8009ad2: 2b18 cmp r3, #24
  22165. 8009ad4: d111 bne.n 8009afa <HAL_RCC_OscConfig+0x62>
  22166. 8009ad6: 6abb ldr r3, [r7, #40] @ 0x28
  22167. 8009ad8: f003 0303 and.w r3, r3, #3
  22168. 8009adc: 2b02 cmp r3, #2
  22169. 8009ade: d10c bne.n 8009afa <HAL_RCC_OscConfig+0x62>
  22170. {
  22171. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0U) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))
  22172. 8009ae0: 4b8f ldr r3, [pc, #572] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22173. 8009ae2: 681b ldr r3, [r3, #0]
  22174. 8009ae4: f403 3300 and.w r3, r3, #131072 @ 0x20000
  22175. 8009ae8: 2b00 cmp r3, #0
  22176. 8009aea: d06d beq.n 8009bc8 <HAL_RCC_OscConfig+0x130>
  22177. 8009aec: 687b ldr r3, [r7, #4]
  22178. 8009aee: 685b ldr r3, [r3, #4]
  22179. 8009af0: 2b00 cmp r3, #0
  22180. 8009af2: d169 bne.n 8009bc8 <HAL_RCC_OscConfig+0x130>
  22181. {
  22182. return HAL_ERROR;
  22183. 8009af4: 2301 movs r3, #1
  22184. 8009af6: f000 bc21 b.w 800a33c <HAL_RCC_OscConfig+0x8a4>
  22185. }
  22186. }
  22187. else
  22188. {
  22189. /* Set the new HSE configuration ---------------------------------------*/
  22190. __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState);
  22191. 8009afa: 687b ldr r3, [r7, #4]
  22192. 8009afc: 685b ldr r3, [r3, #4]
  22193. 8009afe: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  22194. 8009b02: d106 bne.n 8009b12 <HAL_RCC_OscConfig+0x7a>
  22195. 8009b04: 4b86 ldr r3, [pc, #536] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22196. 8009b06: 681b ldr r3, [r3, #0]
  22197. 8009b08: 4a85 ldr r2, [pc, #532] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22198. 8009b0a: f443 3380 orr.w r3, r3, #65536 @ 0x10000
  22199. 8009b0e: 6013 str r3, [r2, #0]
  22200. 8009b10: e02e b.n 8009b70 <HAL_RCC_OscConfig+0xd8>
  22201. 8009b12: 687b ldr r3, [r7, #4]
  22202. 8009b14: 685b ldr r3, [r3, #4]
  22203. 8009b16: 2b00 cmp r3, #0
  22204. 8009b18: d10c bne.n 8009b34 <HAL_RCC_OscConfig+0x9c>
  22205. 8009b1a: 4b81 ldr r3, [pc, #516] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22206. 8009b1c: 681b ldr r3, [r3, #0]
  22207. 8009b1e: 4a80 ldr r2, [pc, #512] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22208. 8009b20: f423 3380 bic.w r3, r3, #65536 @ 0x10000
  22209. 8009b24: 6013 str r3, [r2, #0]
  22210. 8009b26: 4b7e ldr r3, [pc, #504] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22211. 8009b28: 681b ldr r3, [r3, #0]
  22212. 8009b2a: 4a7d ldr r2, [pc, #500] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22213. 8009b2c: f423 2380 bic.w r3, r3, #262144 @ 0x40000
  22214. 8009b30: 6013 str r3, [r2, #0]
  22215. 8009b32: e01d b.n 8009b70 <HAL_RCC_OscConfig+0xd8>
  22216. 8009b34: 687b ldr r3, [r7, #4]
  22217. 8009b36: 685b ldr r3, [r3, #4]
  22218. 8009b38: f5b3 2fa0 cmp.w r3, #327680 @ 0x50000
  22219. 8009b3c: d10c bne.n 8009b58 <HAL_RCC_OscConfig+0xc0>
  22220. 8009b3e: 4b78 ldr r3, [pc, #480] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22221. 8009b40: 681b ldr r3, [r3, #0]
  22222. 8009b42: 4a77 ldr r2, [pc, #476] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22223. 8009b44: f443 2380 orr.w r3, r3, #262144 @ 0x40000
  22224. 8009b48: 6013 str r3, [r2, #0]
  22225. 8009b4a: 4b75 ldr r3, [pc, #468] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22226. 8009b4c: 681b ldr r3, [r3, #0]
  22227. 8009b4e: 4a74 ldr r2, [pc, #464] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22228. 8009b50: f443 3380 orr.w r3, r3, #65536 @ 0x10000
  22229. 8009b54: 6013 str r3, [r2, #0]
  22230. 8009b56: e00b b.n 8009b70 <HAL_RCC_OscConfig+0xd8>
  22231. 8009b58: 4b71 ldr r3, [pc, #452] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22232. 8009b5a: 681b ldr r3, [r3, #0]
  22233. 8009b5c: 4a70 ldr r2, [pc, #448] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22234. 8009b5e: f423 3380 bic.w r3, r3, #65536 @ 0x10000
  22235. 8009b62: 6013 str r3, [r2, #0]
  22236. 8009b64: 4b6e ldr r3, [pc, #440] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22237. 8009b66: 681b ldr r3, [r3, #0]
  22238. 8009b68: 4a6d ldr r2, [pc, #436] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22239. 8009b6a: f423 2380 bic.w r3, r3, #262144 @ 0x40000
  22240. 8009b6e: 6013 str r3, [r2, #0]
  22241. /* Check the HSE State */
  22242. if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF)
  22243. 8009b70: 687b ldr r3, [r7, #4]
  22244. 8009b72: 685b ldr r3, [r3, #4]
  22245. 8009b74: 2b00 cmp r3, #0
  22246. 8009b76: d013 beq.n 8009ba0 <HAL_RCC_OscConfig+0x108>
  22247. {
  22248. /* Get Start Tick*/
  22249. tickstart = HAL_GetTick();
  22250. 8009b78: f7fb fa5a bl 8005030 <HAL_GetTick>
  22251. 8009b7c: 6278 str r0, [r7, #36] @ 0x24
  22252. /* Wait till HSE is ready */
  22253. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == 0U)
  22254. 8009b7e: e008 b.n 8009b92 <HAL_RCC_OscConfig+0xfa>
  22255. {
  22256. if ((uint32_t)(HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
  22257. 8009b80: f7fb fa56 bl 8005030 <HAL_GetTick>
  22258. 8009b84: 4602 mov r2, r0
  22259. 8009b86: 6a7b ldr r3, [r7, #36] @ 0x24
  22260. 8009b88: 1ad3 subs r3, r2, r3
  22261. 8009b8a: 2b64 cmp r3, #100 @ 0x64
  22262. 8009b8c: d901 bls.n 8009b92 <HAL_RCC_OscConfig+0xfa>
  22263. {
  22264. return HAL_TIMEOUT;
  22265. 8009b8e: 2303 movs r3, #3
  22266. 8009b90: e3d4 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22267. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == 0U)
  22268. 8009b92: 4b63 ldr r3, [pc, #396] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22269. 8009b94: 681b ldr r3, [r3, #0]
  22270. 8009b96: f403 3300 and.w r3, r3, #131072 @ 0x20000
  22271. 8009b9a: 2b00 cmp r3, #0
  22272. 8009b9c: d0f0 beq.n 8009b80 <HAL_RCC_OscConfig+0xe8>
  22273. 8009b9e: e014 b.n 8009bca <HAL_RCC_OscConfig+0x132>
  22274. }
  22275. }
  22276. else
  22277. {
  22278. /* Get Start Tick*/
  22279. tickstart = HAL_GetTick();
  22280. 8009ba0: f7fb fa46 bl 8005030 <HAL_GetTick>
  22281. 8009ba4: 6278 str r0, [r7, #36] @ 0x24
  22282. /* Wait till HSE is disabled */
  22283. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0U)
  22284. 8009ba6: e008 b.n 8009bba <HAL_RCC_OscConfig+0x122>
  22285. {
  22286. if ((uint32_t)(HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
  22287. 8009ba8: f7fb fa42 bl 8005030 <HAL_GetTick>
  22288. 8009bac: 4602 mov r2, r0
  22289. 8009bae: 6a7b ldr r3, [r7, #36] @ 0x24
  22290. 8009bb0: 1ad3 subs r3, r2, r3
  22291. 8009bb2: 2b64 cmp r3, #100 @ 0x64
  22292. 8009bb4: d901 bls.n 8009bba <HAL_RCC_OscConfig+0x122>
  22293. {
  22294. return HAL_TIMEOUT;
  22295. 8009bb6: 2303 movs r3, #3
  22296. 8009bb8: e3c0 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22297. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0U)
  22298. 8009bba: 4b59 ldr r3, [pc, #356] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22299. 8009bbc: 681b ldr r3, [r3, #0]
  22300. 8009bbe: f403 3300 and.w r3, r3, #131072 @ 0x20000
  22301. 8009bc2: 2b00 cmp r3, #0
  22302. 8009bc4: d1f0 bne.n 8009ba8 <HAL_RCC_OscConfig+0x110>
  22303. 8009bc6: e000 b.n 8009bca <HAL_RCC_OscConfig+0x132>
  22304. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0U) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))
  22305. 8009bc8: bf00 nop
  22306. }
  22307. }
  22308. }
  22309. }
  22310. /*----------------------------- HSI Configuration --------------------------*/
  22311. if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI)
  22312. 8009bca: 687b ldr r3, [r7, #4]
  22313. 8009bcc: 681b ldr r3, [r3, #0]
  22314. 8009bce: f003 0302 and.w r3, r3, #2
  22315. 8009bd2: 2b00 cmp r3, #0
  22316. 8009bd4: f000 80ca beq.w 8009d6c <HAL_RCC_OscConfig+0x2d4>
  22317. /* Check the parameters */
  22318. assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState));
  22319. assert_param(IS_RCC_HSICALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue));
  22320. /* When the HSI is used as system clock it will not be disabled */
  22321. const uint32_t temp_sysclksrc = __HAL_RCC_GET_SYSCLK_SOURCE();
  22322. 8009bd8: 4b51 ldr r3, [pc, #324] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22323. 8009bda: 691b ldr r3, [r3, #16]
  22324. 8009bdc: f003 0338 and.w r3, r3, #56 @ 0x38
  22325. 8009be0: 623b str r3, [r7, #32]
  22326. const uint32_t temp_pllckselr = RCC->PLLCKSELR;
  22327. 8009be2: 4b4f ldr r3, [pc, #316] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22328. 8009be4: 6a9b ldr r3, [r3, #40] @ 0x28
  22329. 8009be6: 61fb str r3, [r7, #28]
  22330. if ((temp_sysclksrc == RCC_CFGR_SWS_HSI) || ((temp_sysclksrc == RCC_CFGR_SWS_PLL1) && ((temp_pllckselr & RCC_PLLCKSELR_PLLSRC) == RCC_PLLCKSELR_PLLSRC_HSI)))
  22331. 8009be8: 6a3b ldr r3, [r7, #32]
  22332. 8009bea: 2b00 cmp r3, #0
  22333. 8009bec: d007 beq.n 8009bfe <HAL_RCC_OscConfig+0x166>
  22334. 8009bee: 6a3b ldr r3, [r7, #32]
  22335. 8009bf0: 2b18 cmp r3, #24
  22336. 8009bf2: d156 bne.n 8009ca2 <HAL_RCC_OscConfig+0x20a>
  22337. 8009bf4: 69fb ldr r3, [r7, #28]
  22338. 8009bf6: f003 0303 and.w r3, r3, #3
  22339. 8009bfa: 2b00 cmp r3, #0
  22340. 8009bfc: d151 bne.n 8009ca2 <HAL_RCC_OscConfig+0x20a>
  22341. {
  22342. /* When HSI is used as system clock it will not be disabled */
  22343. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != 0U) && (RCC_OscInitStruct->HSIState == RCC_HSI_OFF))
  22344. 8009bfe: 4b48 ldr r3, [pc, #288] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22345. 8009c00: 681b ldr r3, [r3, #0]
  22346. 8009c02: f003 0304 and.w r3, r3, #4
  22347. 8009c06: 2b00 cmp r3, #0
  22348. 8009c08: d005 beq.n 8009c16 <HAL_RCC_OscConfig+0x17e>
  22349. 8009c0a: 687b ldr r3, [r7, #4]
  22350. 8009c0c: 68db ldr r3, [r3, #12]
  22351. 8009c0e: 2b00 cmp r3, #0
  22352. 8009c10: d101 bne.n 8009c16 <HAL_RCC_OscConfig+0x17e>
  22353. {
  22354. return HAL_ERROR;
  22355. 8009c12: 2301 movs r3, #1
  22356. 8009c14: e392 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22357. }
  22358. /* Otherwise, only HSI division and calibration are allowed */
  22359. else
  22360. {
  22361. /* Enable the Internal High Speed oscillator (HSI, HSIDIV2, HSIDIV4, or HSIDIV8) */
  22362. __HAL_RCC_HSI_CONFIG(RCC_OscInitStruct->HSIState);
  22363. 8009c16: 4b42 ldr r3, [pc, #264] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22364. 8009c18: 681b ldr r3, [r3, #0]
  22365. 8009c1a: f023 0219 bic.w r2, r3, #25
  22366. 8009c1e: 687b ldr r3, [r7, #4]
  22367. 8009c20: 68db ldr r3, [r3, #12]
  22368. 8009c22: 493f ldr r1, [pc, #252] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22369. 8009c24: 4313 orrs r3, r2
  22370. 8009c26: 600b str r3, [r1, #0]
  22371. /* Get Start Tick*/
  22372. tickstart = HAL_GetTick();
  22373. 8009c28: f7fb fa02 bl 8005030 <HAL_GetTick>
  22374. 8009c2c: 6278 str r0, [r7, #36] @ 0x24
  22375. /* Wait till HSI is ready */
  22376. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == 0U)
  22377. 8009c2e: e008 b.n 8009c42 <HAL_RCC_OscConfig+0x1aa>
  22378. {
  22379. if ((uint32_t)(HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
  22380. 8009c30: f7fb f9fe bl 8005030 <HAL_GetTick>
  22381. 8009c34: 4602 mov r2, r0
  22382. 8009c36: 6a7b ldr r3, [r7, #36] @ 0x24
  22383. 8009c38: 1ad3 subs r3, r2, r3
  22384. 8009c3a: 2b02 cmp r3, #2
  22385. 8009c3c: d901 bls.n 8009c42 <HAL_RCC_OscConfig+0x1aa>
  22386. {
  22387. return HAL_TIMEOUT;
  22388. 8009c3e: 2303 movs r3, #3
  22389. 8009c40: e37c b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22390. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == 0U)
  22391. 8009c42: 4b37 ldr r3, [pc, #220] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22392. 8009c44: 681b ldr r3, [r3, #0]
  22393. 8009c46: f003 0304 and.w r3, r3, #4
  22394. 8009c4a: 2b00 cmp r3, #0
  22395. 8009c4c: d0f0 beq.n 8009c30 <HAL_RCC_OscConfig+0x198>
  22396. }
  22397. }
  22398. /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
  22399. __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);
  22400. 8009c4e: f7fb fa1f bl 8005090 <HAL_GetREVID>
  22401. 8009c52: 4603 mov r3, r0
  22402. 8009c54: f241 0203 movw r2, #4099 @ 0x1003
  22403. 8009c58: 4293 cmp r3, r2
  22404. 8009c5a: d817 bhi.n 8009c8c <HAL_RCC_OscConfig+0x1f4>
  22405. 8009c5c: 687b ldr r3, [r7, #4]
  22406. 8009c5e: 691b ldr r3, [r3, #16]
  22407. 8009c60: 2b40 cmp r3, #64 @ 0x40
  22408. 8009c62: d108 bne.n 8009c76 <HAL_RCC_OscConfig+0x1de>
  22409. 8009c64: 4b2e ldr r3, [pc, #184] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22410. 8009c66: 685b ldr r3, [r3, #4]
  22411. 8009c68: f423 337c bic.w r3, r3, #258048 @ 0x3f000
  22412. 8009c6c: 4a2c ldr r2, [pc, #176] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22413. 8009c6e: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  22414. 8009c72: 6053 str r3, [r2, #4]
  22415. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != 0U) && (RCC_OscInitStruct->HSIState == RCC_HSI_OFF))
  22416. 8009c74: e07a b.n 8009d6c <HAL_RCC_OscConfig+0x2d4>
  22417. __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);
  22418. 8009c76: 4b2a ldr r3, [pc, #168] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22419. 8009c78: 685b ldr r3, [r3, #4]
  22420. 8009c7a: f423 327c bic.w r2, r3, #258048 @ 0x3f000
  22421. 8009c7e: 687b ldr r3, [r7, #4]
  22422. 8009c80: 691b ldr r3, [r3, #16]
  22423. 8009c82: 031b lsls r3, r3, #12
  22424. 8009c84: 4926 ldr r1, [pc, #152] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22425. 8009c86: 4313 orrs r3, r2
  22426. 8009c88: 604b str r3, [r1, #4]
  22427. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != 0U) && (RCC_OscInitStruct->HSIState == RCC_HSI_OFF))
  22428. 8009c8a: e06f b.n 8009d6c <HAL_RCC_OscConfig+0x2d4>
  22429. __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);
  22430. 8009c8c: 4b24 ldr r3, [pc, #144] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22431. 8009c8e: 685b ldr r3, [r3, #4]
  22432. 8009c90: f023 42fe bic.w r2, r3, #2130706432 @ 0x7f000000
  22433. 8009c94: 687b ldr r3, [r7, #4]
  22434. 8009c96: 691b ldr r3, [r3, #16]
  22435. 8009c98: 061b lsls r3, r3, #24
  22436. 8009c9a: 4921 ldr r1, [pc, #132] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22437. 8009c9c: 4313 orrs r3, r2
  22438. 8009c9e: 604b str r3, [r1, #4]
  22439. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != 0U) && (RCC_OscInitStruct->HSIState == RCC_HSI_OFF))
  22440. 8009ca0: e064 b.n 8009d6c <HAL_RCC_OscConfig+0x2d4>
  22441. }
  22442. else
  22443. {
  22444. /* Check the HSI State */
  22445. if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF)
  22446. 8009ca2: 687b ldr r3, [r7, #4]
  22447. 8009ca4: 68db ldr r3, [r3, #12]
  22448. 8009ca6: 2b00 cmp r3, #0
  22449. 8009ca8: d047 beq.n 8009d3a <HAL_RCC_OscConfig+0x2a2>
  22450. {
  22451. /* Enable the Internal High Speed oscillator (HSI, HSIDIV2,HSIDIV4, or HSIDIV8) */
  22452. __HAL_RCC_HSI_CONFIG(RCC_OscInitStruct->HSIState);
  22453. 8009caa: 4b1d ldr r3, [pc, #116] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22454. 8009cac: 681b ldr r3, [r3, #0]
  22455. 8009cae: f023 0219 bic.w r2, r3, #25
  22456. 8009cb2: 687b ldr r3, [r7, #4]
  22457. 8009cb4: 68db ldr r3, [r3, #12]
  22458. 8009cb6: 491a ldr r1, [pc, #104] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22459. 8009cb8: 4313 orrs r3, r2
  22460. 8009cba: 600b str r3, [r1, #0]
  22461. /* Get Start Tick*/
  22462. tickstart = HAL_GetTick();
  22463. 8009cbc: f7fb f9b8 bl 8005030 <HAL_GetTick>
  22464. 8009cc0: 6278 str r0, [r7, #36] @ 0x24
  22465. /* Wait till HSI is ready */
  22466. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == 0U)
  22467. 8009cc2: e008 b.n 8009cd6 <HAL_RCC_OscConfig+0x23e>
  22468. {
  22469. if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
  22470. 8009cc4: f7fb f9b4 bl 8005030 <HAL_GetTick>
  22471. 8009cc8: 4602 mov r2, r0
  22472. 8009cca: 6a7b ldr r3, [r7, #36] @ 0x24
  22473. 8009ccc: 1ad3 subs r3, r2, r3
  22474. 8009cce: 2b02 cmp r3, #2
  22475. 8009cd0: d901 bls.n 8009cd6 <HAL_RCC_OscConfig+0x23e>
  22476. {
  22477. return HAL_TIMEOUT;
  22478. 8009cd2: 2303 movs r3, #3
  22479. 8009cd4: e332 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22480. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == 0U)
  22481. 8009cd6: 4b12 ldr r3, [pc, #72] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22482. 8009cd8: 681b ldr r3, [r3, #0]
  22483. 8009cda: f003 0304 and.w r3, r3, #4
  22484. 8009cde: 2b00 cmp r3, #0
  22485. 8009ce0: d0f0 beq.n 8009cc4 <HAL_RCC_OscConfig+0x22c>
  22486. }
  22487. }
  22488. /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
  22489. __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);
  22490. 8009ce2: f7fb f9d5 bl 8005090 <HAL_GetREVID>
  22491. 8009ce6: 4603 mov r3, r0
  22492. 8009ce8: f241 0203 movw r2, #4099 @ 0x1003
  22493. 8009cec: 4293 cmp r3, r2
  22494. 8009cee: d819 bhi.n 8009d24 <HAL_RCC_OscConfig+0x28c>
  22495. 8009cf0: 687b ldr r3, [r7, #4]
  22496. 8009cf2: 691b ldr r3, [r3, #16]
  22497. 8009cf4: 2b40 cmp r3, #64 @ 0x40
  22498. 8009cf6: d108 bne.n 8009d0a <HAL_RCC_OscConfig+0x272>
  22499. 8009cf8: 4b09 ldr r3, [pc, #36] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22500. 8009cfa: 685b ldr r3, [r3, #4]
  22501. 8009cfc: f423 337c bic.w r3, r3, #258048 @ 0x3f000
  22502. 8009d00: 4a07 ldr r2, [pc, #28] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22503. 8009d02: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  22504. 8009d06: 6053 str r3, [r2, #4]
  22505. 8009d08: e030 b.n 8009d6c <HAL_RCC_OscConfig+0x2d4>
  22506. 8009d0a: 4b05 ldr r3, [pc, #20] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22507. 8009d0c: 685b ldr r3, [r3, #4]
  22508. 8009d0e: f423 327c bic.w r2, r3, #258048 @ 0x3f000
  22509. 8009d12: 687b ldr r3, [r7, #4]
  22510. 8009d14: 691b ldr r3, [r3, #16]
  22511. 8009d16: 031b lsls r3, r3, #12
  22512. 8009d18: 4901 ldr r1, [pc, #4] @ (8009d20 <HAL_RCC_OscConfig+0x288>)
  22513. 8009d1a: 4313 orrs r3, r2
  22514. 8009d1c: 604b str r3, [r1, #4]
  22515. 8009d1e: e025 b.n 8009d6c <HAL_RCC_OscConfig+0x2d4>
  22516. 8009d20: 58024400 .word 0x58024400
  22517. 8009d24: 4b9a ldr r3, [pc, #616] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22518. 8009d26: 685b ldr r3, [r3, #4]
  22519. 8009d28: f023 42fe bic.w r2, r3, #2130706432 @ 0x7f000000
  22520. 8009d2c: 687b ldr r3, [r7, #4]
  22521. 8009d2e: 691b ldr r3, [r3, #16]
  22522. 8009d30: 061b lsls r3, r3, #24
  22523. 8009d32: 4997 ldr r1, [pc, #604] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22524. 8009d34: 4313 orrs r3, r2
  22525. 8009d36: 604b str r3, [r1, #4]
  22526. 8009d38: e018 b.n 8009d6c <HAL_RCC_OscConfig+0x2d4>
  22527. }
  22528. else
  22529. {
  22530. /* Disable the Internal High Speed oscillator (HSI). */
  22531. __HAL_RCC_HSI_DISABLE();
  22532. 8009d3a: 4b95 ldr r3, [pc, #596] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22533. 8009d3c: 681b ldr r3, [r3, #0]
  22534. 8009d3e: 4a94 ldr r2, [pc, #592] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22535. 8009d40: f023 0301 bic.w r3, r3, #1
  22536. 8009d44: 6013 str r3, [r2, #0]
  22537. /* Get Start Tick*/
  22538. tickstart = HAL_GetTick();
  22539. 8009d46: f7fb f973 bl 8005030 <HAL_GetTick>
  22540. 8009d4a: 6278 str r0, [r7, #36] @ 0x24
  22541. /* Wait till HSI is disabled */
  22542. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != 0U)
  22543. 8009d4c: e008 b.n 8009d60 <HAL_RCC_OscConfig+0x2c8>
  22544. {
  22545. if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
  22546. 8009d4e: f7fb f96f bl 8005030 <HAL_GetTick>
  22547. 8009d52: 4602 mov r2, r0
  22548. 8009d54: 6a7b ldr r3, [r7, #36] @ 0x24
  22549. 8009d56: 1ad3 subs r3, r2, r3
  22550. 8009d58: 2b02 cmp r3, #2
  22551. 8009d5a: d901 bls.n 8009d60 <HAL_RCC_OscConfig+0x2c8>
  22552. {
  22553. return HAL_TIMEOUT;
  22554. 8009d5c: 2303 movs r3, #3
  22555. 8009d5e: e2ed b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22556. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != 0U)
  22557. 8009d60: 4b8b ldr r3, [pc, #556] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22558. 8009d62: 681b ldr r3, [r3, #0]
  22559. 8009d64: f003 0304 and.w r3, r3, #4
  22560. 8009d68: 2b00 cmp r3, #0
  22561. 8009d6a: d1f0 bne.n 8009d4e <HAL_RCC_OscConfig+0x2b6>
  22562. }
  22563. }
  22564. }
  22565. }
  22566. /*----------------------------- CSI Configuration --------------------------*/
  22567. if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_CSI) == RCC_OSCILLATORTYPE_CSI)
  22568. 8009d6c: 687b ldr r3, [r7, #4]
  22569. 8009d6e: 681b ldr r3, [r3, #0]
  22570. 8009d70: f003 0310 and.w r3, r3, #16
  22571. 8009d74: 2b00 cmp r3, #0
  22572. 8009d76: f000 80a9 beq.w 8009ecc <HAL_RCC_OscConfig+0x434>
  22573. /* Check the parameters */
  22574. assert_param(IS_RCC_CSI(RCC_OscInitStruct->CSIState));
  22575. assert_param(IS_RCC_CSICALIBRATION_VALUE(RCC_OscInitStruct->CSICalibrationValue));
  22576. /* When the CSI is used as system clock it will not disabled */
  22577. const uint32_t temp_sysclksrc = __HAL_RCC_GET_SYSCLK_SOURCE();
  22578. 8009d7a: 4b85 ldr r3, [pc, #532] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22579. 8009d7c: 691b ldr r3, [r3, #16]
  22580. 8009d7e: f003 0338 and.w r3, r3, #56 @ 0x38
  22581. 8009d82: 61bb str r3, [r7, #24]
  22582. const uint32_t temp_pllckselr = RCC->PLLCKSELR;
  22583. 8009d84: 4b82 ldr r3, [pc, #520] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22584. 8009d86: 6a9b ldr r3, [r3, #40] @ 0x28
  22585. 8009d88: 617b str r3, [r7, #20]
  22586. if ((temp_sysclksrc == RCC_CFGR_SWS_CSI) || ((temp_sysclksrc == RCC_CFGR_SWS_PLL1) && ((temp_pllckselr & RCC_PLLCKSELR_PLLSRC) == RCC_PLLCKSELR_PLLSRC_CSI)))
  22587. 8009d8a: 69bb ldr r3, [r7, #24]
  22588. 8009d8c: 2b08 cmp r3, #8
  22589. 8009d8e: d007 beq.n 8009da0 <HAL_RCC_OscConfig+0x308>
  22590. 8009d90: 69bb ldr r3, [r7, #24]
  22591. 8009d92: 2b18 cmp r3, #24
  22592. 8009d94: d13a bne.n 8009e0c <HAL_RCC_OscConfig+0x374>
  22593. 8009d96: 697b ldr r3, [r7, #20]
  22594. 8009d98: f003 0303 and.w r3, r3, #3
  22595. 8009d9c: 2b01 cmp r3, #1
  22596. 8009d9e: d135 bne.n 8009e0c <HAL_RCC_OscConfig+0x374>
  22597. {
  22598. /* When CSI is used as system clock it will not disabled */
  22599. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) != 0U) && (RCC_OscInitStruct->CSIState != RCC_CSI_ON))
  22600. 8009da0: 4b7b ldr r3, [pc, #492] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22601. 8009da2: 681b ldr r3, [r3, #0]
  22602. 8009da4: f403 7380 and.w r3, r3, #256 @ 0x100
  22603. 8009da8: 2b00 cmp r3, #0
  22604. 8009daa: d005 beq.n 8009db8 <HAL_RCC_OscConfig+0x320>
  22605. 8009dac: 687b ldr r3, [r7, #4]
  22606. 8009dae: 69db ldr r3, [r3, #28]
  22607. 8009db0: 2b80 cmp r3, #128 @ 0x80
  22608. 8009db2: d001 beq.n 8009db8 <HAL_RCC_OscConfig+0x320>
  22609. {
  22610. return HAL_ERROR;
  22611. 8009db4: 2301 movs r3, #1
  22612. 8009db6: e2c1 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22613. }
  22614. /* Otherwise, just the calibration is allowed */
  22615. else
  22616. {
  22617. /* Adjusts the Internal High Speed oscillator (CSI) calibration value.*/
  22618. __HAL_RCC_CSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->CSICalibrationValue);
  22619. 8009db8: f7fb f96a bl 8005090 <HAL_GetREVID>
  22620. 8009dbc: 4603 mov r3, r0
  22621. 8009dbe: f241 0203 movw r2, #4099 @ 0x1003
  22622. 8009dc2: 4293 cmp r3, r2
  22623. 8009dc4: d817 bhi.n 8009df6 <HAL_RCC_OscConfig+0x35e>
  22624. 8009dc6: 687b ldr r3, [r7, #4]
  22625. 8009dc8: 6a1b ldr r3, [r3, #32]
  22626. 8009dca: 2b20 cmp r3, #32
  22627. 8009dcc: d108 bne.n 8009de0 <HAL_RCC_OscConfig+0x348>
  22628. 8009dce: 4b70 ldr r3, [pc, #448] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22629. 8009dd0: 685b ldr r3, [r3, #4]
  22630. 8009dd2: f023 43f8 bic.w r3, r3, #2080374784 @ 0x7c000000
  22631. 8009dd6: 4a6e ldr r2, [pc, #440] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22632. 8009dd8: f043 4380 orr.w r3, r3, #1073741824 @ 0x40000000
  22633. 8009ddc: 6053 str r3, [r2, #4]
  22634. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) != 0U) && (RCC_OscInitStruct->CSIState != RCC_CSI_ON))
  22635. 8009dde: e075 b.n 8009ecc <HAL_RCC_OscConfig+0x434>
  22636. __HAL_RCC_CSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->CSICalibrationValue);
  22637. 8009de0: 4b6b ldr r3, [pc, #428] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22638. 8009de2: 685b ldr r3, [r3, #4]
  22639. 8009de4: f023 42f8 bic.w r2, r3, #2080374784 @ 0x7c000000
  22640. 8009de8: 687b ldr r3, [r7, #4]
  22641. 8009dea: 6a1b ldr r3, [r3, #32]
  22642. 8009dec: 069b lsls r3, r3, #26
  22643. 8009dee: 4968 ldr r1, [pc, #416] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22644. 8009df0: 4313 orrs r3, r2
  22645. 8009df2: 604b str r3, [r1, #4]
  22646. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) != 0U) && (RCC_OscInitStruct->CSIState != RCC_CSI_ON))
  22647. 8009df4: e06a b.n 8009ecc <HAL_RCC_OscConfig+0x434>
  22648. __HAL_RCC_CSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->CSICalibrationValue);
  22649. 8009df6: 4b66 ldr r3, [pc, #408] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22650. 8009df8: 68db ldr r3, [r3, #12]
  22651. 8009dfa: f023 527c bic.w r2, r3, #1056964608 @ 0x3f000000
  22652. 8009dfe: 687b ldr r3, [r7, #4]
  22653. 8009e00: 6a1b ldr r3, [r3, #32]
  22654. 8009e02: 061b lsls r3, r3, #24
  22655. 8009e04: 4962 ldr r1, [pc, #392] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22656. 8009e06: 4313 orrs r3, r2
  22657. 8009e08: 60cb str r3, [r1, #12]
  22658. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) != 0U) && (RCC_OscInitStruct->CSIState != RCC_CSI_ON))
  22659. 8009e0a: e05f b.n 8009ecc <HAL_RCC_OscConfig+0x434>
  22660. }
  22661. }
  22662. else
  22663. {
  22664. /* Check the CSI State */
  22665. if ((RCC_OscInitStruct->CSIState) != RCC_CSI_OFF)
  22666. 8009e0c: 687b ldr r3, [r7, #4]
  22667. 8009e0e: 69db ldr r3, [r3, #28]
  22668. 8009e10: 2b00 cmp r3, #0
  22669. 8009e12: d042 beq.n 8009e9a <HAL_RCC_OscConfig+0x402>
  22670. {
  22671. /* Enable the Internal High Speed oscillator (CSI). */
  22672. __HAL_RCC_CSI_ENABLE();
  22673. 8009e14: 4b5e ldr r3, [pc, #376] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22674. 8009e16: 681b ldr r3, [r3, #0]
  22675. 8009e18: 4a5d ldr r2, [pc, #372] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22676. 8009e1a: f043 0380 orr.w r3, r3, #128 @ 0x80
  22677. 8009e1e: 6013 str r3, [r2, #0]
  22678. /* Get Start Tick*/
  22679. tickstart = HAL_GetTick();
  22680. 8009e20: f7fb f906 bl 8005030 <HAL_GetTick>
  22681. 8009e24: 6278 str r0, [r7, #36] @ 0x24
  22682. /* Wait till CSI is ready */
  22683. while (__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) == 0U)
  22684. 8009e26: e008 b.n 8009e3a <HAL_RCC_OscConfig+0x3a2>
  22685. {
  22686. if ((HAL_GetTick() - tickstart) > CSI_TIMEOUT_VALUE)
  22687. 8009e28: f7fb f902 bl 8005030 <HAL_GetTick>
  22688. 8009e2c: 4602 mov r2, r0
  22689. 8009e2e: 6a7b ldr r3, [r7, #36] @ 0x24
  22690. 8009e30: 1ad3 subs r3, r2, r3
  22691. 8009e32: 2b02 cmp r3, #2
  22692. 8009e34: d901 bls.n 8009e3a <HAL_RCC_OscConfig+0x3a2>
  22693. {
  22694. return HAL_TIMEOUT;
  22695. 8009e36: 2303 movs r3, #3
  22696. 8009e38: e280 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22697. while (__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) == 0U)
  22698. 8009e3a: 4b55 ldr r3, [pc, #340] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22699. 8009e3c: 681b ldr r3, [r3, #0]
  22700. 8009e3e: f403 7380 and.w r3, r3, #256 @ 0x100
  22701. 8009e42: 2b00 cmp r3, #0
  22702. 8009e44: d0f0 beq.n 8009e28 <HAL_RCC_OscConfig+0x390>
  22703. }
  22704. }
  22705. /* Adjusts the Internal High Speed oscillator (CSI) calibration value.*/
  22706. __HAL_RCC_CSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->CSICalibrationValue);
  22707. 8009e46: f7fb f923 bl 8005090 <HAL_GetREVID>
  22708. 8009e4a: 4603 mov r3, r0
  22709. 8009e4c: f241 0203 movw r2, #4099 @ 0x1003
  22710. 8009e50: 4293 cmp r3, r2
  22711. 8009e52: d817 bhi.n 8009e84 <HAL_RCC_OscConfig+0x3ec>
  22712. 8009e54: 687b ldr r3, [r7, #4]
  22713. 8009e56: 6a1b ldr r3, [r3, #32]
  22714. 8009e58: 2b20 cmp r3, #32
  22715. 8009e5a: d108 bne.n 8009e6e <HAL_RCC_OscConfig+0x3d6>
  22716. 8009e5c: 4b4c ldr r3, [pc, #304] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22717. 8009e5e: 685b ldr r3, [r3, #4]
  22718. 8009e60: f023 43f8 bic.w r3, r3, #2080374784 @ 0x7c000000
  22719. 8009e64: 4a4a ldr r2, [pc, #296] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22720. 8009e66: f043 4380 orr.w r3, r3, #1073741824 @ 0x40000000
  22721. 8009e6a: 6053 str r3, [r2, #4]
  22722. 8009e6c: e02e b.n 8009ecc <HAL_RCC_OscConfig+0x434>
  22723. 8009e6e: 4b48 ldr r3, [pc, #288] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22724. 8009e70: 685b ldr r3, [r3, #4]
  22725. 8009e72: f023 42f8 bic.w r2, r3, #2080374784 @ 0x7c000000
  22726. 8009e76: 687b ldr r3, [r7, #4]
  22727. 8009e78: 6a1b ldr r3, [r3, #32]
  22728. 8009e7a: 069b lsls r3, r3, #26
  22729. 8009e7c: 4944 ldr r1, [pc, #272] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22730. 8009e7e: 4313 orrs r3, r2
  22731. 8009e80: 604b str r3, [r1, #4]
  22732. 8009e82: e023 b.n 8009ecc <HAL_RCC_OscConfig+0x434>
  22733. 8009e84: 4b42 ldr r3, [pc, #264] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22734. 8009e86: 68db ldr r3, [r3, #12]
  22735. 8009e88: f023 527c bic.w r2, r3, #1056964608 @ 0x3f000000
  22736. 8009e8c: 687b ldr r3, [r7, #4]
  22737. 8009e8e: 6a1b ldr r3, [r3, #32]
  22738. 8009e90: 061b lsls r3, r3, #24
  22739. 8009e92: 493f ldr r1, [pc, #252] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22740. 8009e94: 4313 orrs r3, r2
  22741. 8009e96: 60cb str r3, [r1, #12]
  22742. 8009e98: e018 b.n 8009ecc <HAL_RCC_OscConfig+0x434>
  22743. }
  22744. else
  22745. {
  22746. /* Disable the Internal High Speed oscillator (CSI). */
  22747. __HAL_RCC_CSI_DISABLE();
  22748. 8009e9a: 4b3d ldr r3, [pc, #244] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22749. 8009e9c: 681b ldr r3, [r3, #0]
  22750. 8009e9e: 4a3c ldr r2, [pc, #240] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22751. 8009ea0: f023 0380 bic.w r3, r3, #128 @ 0x80
  22752. 8009ea4: 6013 str r3, [r2, #0]
  22753. /* Get Start Tick*/
  22754. tickstart = HAL_GetTick();
  22755. 8009ea6: f7fb f8c3 bl 8005030 <HAL_GetTick>
  22756. 8009eaa: 6278 str r0, [r7, #36] @ 0x24
  22757. /* Wait till CSI is disabled */
  22758. while (__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) != 0U)
  22759. 8009eac: e008 b.n 8009ec0 <HAL_RCC_OscConfig+0x428>
  22760. {
  22761. if ((HAL_GetTick() - tickstart) > CSI_TIMEOUT_VALUE)
  22762. 8009eae: f7fb f8bf bl 8005030 <HAL_GetTick>
  22763. 8009eb2: 4602 mov r2, r0
  22764. 8009eb4: 6a7b ldr r3, [r7, #36] @ 0x24
  22765. 8009eb6: 1ad3 subs r3, r2, r3
  22766. 8009eb8: 2b02 cmp r3, #2
  22767. 8009eba: d901 bls.n 8009ec0 <HAL_RCC_OscConfig+0x428>
  22768. {
  22769. return HAL_TIMEOUT;
  22770. 8009ebc: 2303 movs r3, #3
  22771. 8009ebe: e23d b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22772. while (__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) != 0U)
  22773. 8009ec0: 4b33 ldr r3, [pc, #204] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22774. 8009ec2: 681b ldr r3, [r3, #0]
  22775. 8009ec4: f403 7380 and.w r3, r3, #256 @ 0x100
  22776. 8009ec8: 2b00 cmp r3, #0
  22777. 8009eca: d1f0 bne.n 8009eae <HAL_RCC_OscConfig+0x416>
  22778. }
  22779. }
  22780. }
  22781. }
  22782. /*------------------------------ LSI Configuration -------------------------*/
  22783. if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI)
  22784. 8009ecc: 687b ldr r3, [r7, #4]
  22785. 8009ece: 681b ldr r3, [r3, #0]
  22786. 8009ed0: f003 0308 and.w r3, r3, #8
  22787. 8009ed4: 2b00 cmp r3, #0
  22788. 8009ed6: d036 beq.n 8009f46 <HAL_RCC_OscConfig+0x4ae>
  22789. {
  22790. /* Check the parameters */
  22791. assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState));
  22792. /* Check the LSI State */
  22793. if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF)
  22794. 8009ed8: 687b ldr r3, [r7, #4]
  22795. 8009eda: 695b ldr r3, [r3, #20]
  22796. 8009edc: 2b00 cmp r3, #0
  22797. 8009ede: d019 beq.n 8009f14 <HAL_RCC_OscConfig+0x47c>
  22798. {
  22799. /* Enable the Internal Low Speed oscillator (LSI). */
  22800. __HAL_RCC_LSI_ENABLE();
  22801. 8009ee0: 4b2b ldr r3, [pc, #172] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22802. 8009ee2: 6f5b ldr r3, [r3, #116] @ 0x74
  22803. 8009ee4: 4a2a ldr r2, [pc, #168] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22804. 8009ee6: f043 0301 orr.w r3, r3, #1
  22805. 8009eea: 6753 str r3, [r2, #116] @ 0x74
  22806. /* Get Start Tick*/
  22807. tickstart = HAL_GetTick();
  22808. 8009eec: f7fb f8a0 bl 8005030 <HAL_GetTick>
  22809. 8009ef0: 6278 str r0, [r7, #36] @ 0x24
  22810. /* Wait till LSI is ready */
  22811. while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == 0U)
  22812. 8009ef2: e008 b.n 8009f06 <HAL_RCC_OscConfig+0x46e>
  22813. {
  22814. if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)
  22815. 8009ef4: f7fb f89c bl 8005030 <HAL_GetTick>
  22816. 8009ef8: 4602 mov r2, r0
  22817. 8009efa: 6a7b ldr r3, [r7, #36] @ 0x24
  22818. 8009efc: 1ad3 subs r3, r2, r3
  22819. 8009efe: 2b02 cmp r3, #2
  22820. 8009f00: d901 bls.n 8009f06 <HAL_RCC_OscConfig+0x46e>
  22821. {
  22822. return HAL_TIMEOUT;
  22823. 8009f02: 2303 movs r3, #3
  22824. 8009f04: e21a b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22825. while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == 0U)
  22826. 8009f06: 4b22 ldr r3, [pc, #136] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22827. 8009f08: 6f5b ldr r3, [r3, #116] @ 0x74
  22828. 8009f0a: f003 0302 and.w r3, r3, #2
  22829. 8009f0e: 2b00 cmp r3, #0
  22830. 8009f10: d0f0 beq.n 8009ef4 <HAL_RCC_OscConfig+0x45c>
  22831. 8009f12: e018 b.n 8009f46 <HAL_RCC_OscConfig+0x4ae>
  22832. }
  22833. }
  22834. else
  22835. {
  22836. /* Disable the Internal Low Speed oscillator (LSI). */
  22837. __HAL_RCC_LSI_DISABLE();
  22838. 8009f14: 4b1e ldr r3, [pc, #120] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22839. 8009f16: 6f5b ldr r3, [r3, #116] @ 0x74
  22840. 8009f18: 4a1d ldr r2, [pc, #116] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22841. 8009f1a: f023 0301 bic.w r3, r3, #1
  22842. 8009f1e: 6753 str r3, [r2, #116] @ 0x74
  22843. /* Get Start Tick*/
  22844. tickstart = HAL_GetTick();
  22845. 8009f20: f7fb f886 bl 8005030 <HAL_GetTick>
  22846. 8009f24: 6278 str r0, [r7, #36] @ 0x24
  22847. /* Wait till LSI is ready */
  22848. while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != 0U)
  22849. 8009f26: e008 b.n 8009f3a <HAL_RCC_OscConfig+0x4a2>
  22850. {
  22851. if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)
  22852. 8009f28: f7fb f882 bl 8005030 <HAL_GetTick>
  22853. 8009f2c: 4602 mov r2, r0
  22854. 8009f2e: 6a7b ldr r3, [r7, #36] @ 0x24
  22855. 8009f30: 1ad3 subs r3, r2, r3
  22856. 8009f32: 2b02 cmp r3, #2
  22857. 8009f34: d901 bls.n 8009f3a <HAL_RCC_OscConfig+0x4a2>
  22858. {
  22859. return HAL_TIMEOUT;
  22860. 8009f36: 2303 movs r3, #3
  22861. 8009f38: e200 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22862. while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != 0U)
  22863. 8009f3a: 4b15 ldr r3, [pc, #84] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22864. 8009f3c: 6f5b ldr r3, [r3, #116] @ 0x74
  22865. 8009f3e: f003 0302 and.w r3, r3, #2
  22866. 8009f42: 2b00 cmp r3, #0
  22867. 8009f44: d1f0 bne.n 8009f28 <HAL_RCC_OscConfig+0x490>
  22868. }
  22869. }
  22870. }
  22871. /*------------------------------ HSI48 Configuration -------------------------*/
  22872. if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI48) == RCC_OSCILLATORTYPE_HSI48)
  22873. 8009f46: 687b ldr r3, [r7, #4]
  22874. 8009f48: 681b ldr r3, [r3, #0]
  22875. 8009f4a: f003 0320 and.w r3, r3, #32
  22876. 8009f4e: 2b00 cmp r3, #0
  22877. 8009f50: d039 beq.n 8009fc6 <HAL_RCC_OscConfig+0x52e>
  22878. {
  22879. /* Check the parameters */
  22880. assert_param(IS_RCC_HSI48(RCC_OscInitStruct->HSI48State));
  22881. /* Check the HSI48 State */
  22882. if ((RCC_OscInitStruct->HSI48State) != RCC_HSI48_OFF)
  22883. 8009f52: 687b ldr r3, [r7, #4]
  22884. 8009f54: 699b ldr r3, [r3, #24]
  22885. 8009f56: 2b00 cmp r3, #0
  22886. 8009f58: d01c beq.n 8009f94 <HAL_RCC_OscConfig+0x4fc>
  22887. {
  22888. /* Enable the Internal Low Speed oscillator (HSI48). */
  22889. __HAL_RCC_HSI48_ENABLE();
  22890. 8009f5a: 4b0d ldr r3, [pc, #52] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22891. 8009f5c: 681b ldr r3, [r3, #0]
  22892. 8009f5e: 4a0c ldr r2, [pc, #48] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22893. 8009f60: f443 5380 orr.w r3, r3, #4096 @ 0x1000
  22894. 8009f64: 6013 str r3, [r2, #0]
  22895. /* Get time-out */
  22896. tickstart = HAL_GetTick();
  22897. 8009f66: f7fb f863 bl 8005030 <HAL_GetTick>
  22898. 8009f6a: 6278 str r0, [r7, #36] @ 0x24
  22899. /* Wait till HSI48 is ready */
  22900. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSI48RDY) == 0U)
  22901. 8009f6c: e008 b.n 8009f80 <HAL_RCC_OscConfig+0x4e8>
  22902. {
  22903. if ((HAL_GetTick() - tickstart) > HSI48_TIMEOUT_VALUE)
  22904. 8009f6e: f7fb f85f bl 8005030 <HAL_GetTick>
  22905. 8009f72: 4602 mov r2, r0
  22906. 8009f74: 6a7b ldr r3, [r7, #36] @ 0x24
  22907. 8009f76: 1ad3 subs r3, r2, r3
  22908. 8009f78: 2b02 cmp r3, #2
  22909. 8009f7a: d901 bls.n 8009f80 <HAL_RCC_OscConfig+0x4e8>
  22910. {
  22911. return HAL_TIMEOUT;
  22912. 8009f7c: 2303 movs r3, #3
  22913. 8009f7e: e1dd b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22914. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSI48RDY) == 0U)
  22915. 8009f80: 4b03 ldr r3, [pc, #12] @ (8009f90 <HAL_RCC_OscConfig+0x4f8>)
  22916. 8009f82: 681b ldr r3, [r3, #0]
  22917. 8009f84: f403 5300 and.w r3, r3, #8192 @ 0x2000
  22918. 8009f88: 2b00 cmp r3, #0
  22919. 8009f8a: d0f0 beq.n 8009f6e <HAL_RCC_OscConfig+0x4d6>
  22920. 8009f8c: e01b b.n 8009fc6 <HAL_RCC_OscConfig+0x52e>
  22921. 8009f8e: bf00 nop
  22922. 8009f90: 58024400 .word 0x58024400
  22923. }
  22924. }
  22925. else
  22926. {
  22927. /* Disable the Internal Low Speed oscillator (HSI48). */
  22928. __HAL_RCC_HSI48_DISABLE();
  22929. 8009f94: 4b9b ldr r3, [pc, #620] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  22930. 8009f96: 681b ldr r3, [r3, #0]
  22931. 8009f98: 4a9a ldr r2, [pc, #616] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  22932. 8009f9a: f423 5380 bic.w r3, r3, #4096 @ 0x1000
  22933. 8009f9e: 6013 str r3, [r2, #0]
  22934. /* Get time-out */
  22935. tickstart = HAL_GetTick();
  22936. 8009fa0: f7fb f846 bl 8005030 <HAL_GetTick>
  22937. 8009fa4: 6278 str r0, [r7, #36] @ 0x24
  22938. /* Wait till HSI48 is ready */
  22939. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSI48RDY) != 0U)
  22940. 8009fa6: e008 b.n 8009fba <HAL_RCC_OscConfig+0x522>
  22941. {
  22942. if ((HAL_GetTick() - tickstart) > HSI48_TIMEOUT_VALUE)
  22943. 8009fa8: f7fb f842 bl 8005030 <HAL_GetTick>
  22944. 8009fac: 4602 mov r2, r0
  22945. 8009fae: 6a7b ldr r3, [r7, #36] @ 0x24
  22946. 8009fb0: 1ad3 subs r3, r2, r3
  22947. 8009fb2: 2b02 cmp r3, #2
  22948. 8009fb4: d901 bls.n 8009fba <HAL_RCC_OscConfig+0x522>
  22949. {
  22950. return HAL_TIMEOUT;
  22951. 8009fb6: 2303 movs r3, #3
  22952. 8009fb8: e1c0 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22953. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSI48RDY) != 0U)
  22954. 8009fba: 4b92 ldr r3, [pc, #584] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  22955. 8009fbc: 681b ldr r3, [r3, #0]
  22956. 8009fbe: f403 5300 and.w r3, r3, #8192 @ 0x2000
  22957. 8009fc2: 2b00 cmp r3, #0
  22958. 8009fc4: d1f0 bne.n 8009fa8 <HAL_RCC_OscConfig+0x510>
  22959. }
  22960. }
  22961. }
  22962. }
  22963. /*------------------------------ LSE Configuration -------------------------*/
  22964. if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)
  22965. 8009fc6: 687b ldr r3, [r7, #4]
  22966. 8009fc8: 681b ldr r3, [r3, #0]
  22967. 8009fca: f003 0304 and.w r3, r3, #4
  22968. 8009fce: 2b00 cmp r3, #0
  22969. 8009fd0: f000 8081 beq.w 800a0d6 <HAL_RCC_OscConfig+0x63e>
  22970. {
  22971. /* Check the parameters */
  22972. assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState));
  22973. /* Enable write access to Backup domain */
  22974. PWR->CR1 |= PWR_CR1_DBP;
  22975. 8009fd4: 4b8c ldr r3, [pc, #560] @ (800a208 <HAL_RCC_OscConfig+0x770>)
  22976. 8009fd6: 681b ldr r3, [r3, #0]
  22977. 8009fd8: 4a8b ldr r2, [pc, #556] @ (800a208 <HAL_RCC_OscConfig+0x770>)
  22978. 8009fda: f443 7380 orr.w r3, r3, #256 @ 0x100
  22979. 8009fde: 6013 str r3, [r2, #0]
  22980. /* Wait for Backup domain Write protection disable */
  22981. tickstart = HAL_GetTick();
  22982. 8009fe0: f7fb f826 bl 8005030 <HAL_GetTick>
  22983. 8009fe4: 6278 str r0, [r7, #36] @ 0x24
  22984. while ((PWR->CR1 & PWR_CR1_DBP) == 0U)
  22985. 8009fe6: e008 b.n 8009ffa <HAL_RCC_OscConfig+0x562>
  22986. {
  22987. if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)
  22988. 8009fe8: f7fb f822 bl 8005030 <HAL_GetTick>
  22989. 8009fec: 4602 mov r2, r0
  22990. 8009fee: 6a7b ldr r3, [r7, #36] @ 0x24
  22991. 8009ff0: 1ad3 subs r3, r2, r3
  22992. 8009ff2: 2b64 cmp r3, #100 @ 0x64
  22993. 8009ff4: d901 bls.n 8009ffa <HAL_RCC_OscConfig+0x562>
  22994. {
  22995. return HAL_TIMEOUT;
  22996. 8009ff6: 2303 movs r3, #3
  22997. 8009ff8: e1a0 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  22998. while ((PWR->CR1 & PWR_CR1_DBP) == 0U)
  22999. 8009ffa: 4b83 ldr r3, [pc, #524] @ (800a208 <HAL_RCC_OscConfig+0x770>)
  23000. 8009ffc: 681b ldr r3, [r3, #0]
  23001. 8009ffe: f403 7380 and.w r3, r3, #256 @ 0x100
  23002. 800a002: 2b00 cmp r3, #0
  23003. 800a004: d0f0 beq.n 8009fe8 <HAL_RCC_OscConfig+0x550>
  23004. }
  23005. }
  23006. /* Set the new LSE configuration -----------------------------------------*/
  23007. __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState);
  23008. 800a006: 687b ldr r3, [r7, #4]
  23009. 800a008: 689b ldr r3, [r3, #8]
  23010. 800a00a: 2b01 cmp r3, #1
  23011. 800a00c: d106 bne.n 800a01c <HAL_RCC_OscConfig+0x584>
  23012. 800a00e: 4b7d ldr r3, [pc, #500] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23013. 800a010: 6f1b ldr r3, [r3, #112] @ 0x70
  23014. 800a012: 4a7c ldr r2, [pc, #496] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23015. 800a014: f043 0301 orr.w r3, r3, #1
  23016. 800a018: 6713 str r3, [r2, #112] @ 0x70
  23017. 800a01a: e02d b.n 800a078 <HAL_RCC_OscConfig+0x5e0>
  23018. 800a01c: 687b ldr r3, [r7, #4]
  23019. 800a01e: 689b ldr r3, [r3, #8]
  23020. 800a020: 2b00 cmp r3, #0
  23021. 800a022: d10c bne.n 800a03e <HAL_RCC_OscConfig+0x5a6>
  23022. 800a024: 4b77 ldr r3, [pc, #476] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23023. 800a026: 6f1b ldr r3, [r3, #112] @ 0x70
  23024. 800a028: 4a76 ldr r2, [pc, #472] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23025. 800a02a: f023 0301 bic.w r3, r3, #1
  23026. 800a02e: 6713 str r3, [r2, #112] @ 0x70
  23027. 800a030: 4b74 ldr r3, [pc, #464] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23028. 800a032: 6f1b ldr r3, [r3, #112] @ 0x70
  23029. 800a034: 4a73 ldr r2, [pc, #460] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23030. 800a036: f023 0304 bic.w r3, r3, #4
  23031. 800a03a: 6713 str r3, [r2, #112] @ 0x70
  23032. 800a03c: e01c b.n 800a078 <HAL_RCC_OscConfig+0x5e0>
  23033. 800a03e: 687b ldr r3, [r7, #4]
  23034. 800a040: 689b ldr r3, [r3, #8]
  23035. 800a042: 2b05 cmp r3, #5
  23036. 800a044: d10c bne.n 800a060 <HAL_RCC_OscConfig+0x5c8>
  23037. 800a046: 4b6f ldr r3, [pc, #444] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23038. 800a048: 6f1b ldr r3, [r3, #112] @ 0x70
  23039. 800a04a: 4a6e ldr r2, [pc, #440] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23040. 800a04c: f043 0304 orr.w r3, r3, #4
  23041. 800a050: 6713 str r3, [r2, #112] @ 0x70
  23042. 800a052: 4b6c ldr r3, [pc, #432] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23043. 800a054: 6f1b ldr r3, [r3, #112] @ 0x70
  23044. 800a056: 4a6b ldr r2, [pc, #428] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23045. 800a058: f043 0301 orr.w r3, r3, #1
  23046. 800a05c: 6713 str r3, [r2, #112] @ 0x70
  23047. 800a05e: e00b b.n 800a078 <HAL_RCC_OscConfig+0x5e0>
  23048. 800a060: 4b68 ldr r3, [pc, #416] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23049. 800a062: 6f1b ldr r3, [r3, #112] @ 0x70
  23050. 800a064: 4a67 ldr r2, [pc, #412] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23051. 800a066: f023 0301 bic.w r3, r3, #1
  23052. 800a06a: 6713 str r3, [r2, #112] @ 0x70
  23053. 800a06c: 4b65 ldr r3, [pc, #404] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23054. 800a06e: 6f1b ldr r3, [r3, #112] @ 0x70
  23055. 800a070: 4a64 ldr r2, [pc, #400] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23056. 800a072: f023 0304 bic.w r3, r3, #4
  23057. 800a076: 6713 str r3, [r2, #112] @ 0x70
  23058. /* Check the LSE State */
  23059. if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF)
  23060. 800a078: 687b ldr r3, [r7, #4]
  23061. 800a07a: 689b ldr r3, [r3, #8]
  23062. 800a07c: 2b00 cmp r3, #0
  23063. 800a07e: d015 beq.n 800a0ac <HAL_RCC_OscConfig+0x614>
  23064. {
  23065. /* Get Start Tick*/
  23066. tickstart = HAL_GetTick();
  23067. 800a080: f7fa ffd6 bl 8005030 <HAL_GetTick>
  23068. 800a084: 6278 str r0, [r7, #36] @ 0x24
  23069. /* Wait till LSE is ready */
  23070. while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U)
  23071. 800a086: e00a b.n 800a09e <HAL_RCC_OscConfig+0x606>
  23072. {
  23073. if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
  23074. 800a088: f7fa ffd2 bl 8005030 <HAL_GetTick>
  23075. 800a08c: 4602 mov r2, r0
  23076. 800a08e: 6a7b ldr r3, [r7, #36] @ 0x24
  23077. 800a090: 1ad3 subs r3, r2, r3
  23078. 800a092: f241 3288 movw r2, #5000 @ 0x1388
  23079. 800a096: 4293 cmp r3, r2
  23080. 800a098: d901 bls.n 800a09e <HAL_RCC_OscConfig+0x606>
  23081. {
  23082. return HAL_TIMEOUT;
  23083. 800a09a: 2303 movs r3, #3
  23084. 800a09c: e14e b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  23085. while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U)
  23086. 800a09e: 4b59 ldr r3, [pc, #356] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23087. 800a0a0: 6f1b ldr r3, [r3, #112] @ 0x70
  23088. 800a0a2: f003 0302 and.w r3, r3, #2
  23089. 800a0a6: 2b00 cmp r3, #0
  23090. 800a0a8: d0ee beq.n 800a088 <HAL_RCC_OscConfig+0x5f0>
  23091. 800a0aa: e014 b.n 800a0d6 <HAL_RCC_OscConfig+0x63e>
  23092. }
  23093. }
  23094. else
  23095. {
  23096. /* Get Start Tick*/
  23097. tickstart = HAL_GetTick();
  23098. 800a0ac: f7fa ffc0 bl 8005030 <HAL_GetTick>
  23099. 800a0b0: 6278 str r0, [r7, #36] @ 0x24
  23100. /* Wait till LSE is disabled */
  23101. while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != 0U)
  23102. 800a0b2: e00a b.n 800a0ca <HAL_RCC_OscConfig+0x632>
  23103. {
  23104. if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
  23105. 800a0b4: f7fa ffbc bl 8005030 <HAL_GetTick>
  23106. 800a0b8: 4602 mov r2, r0
  23107. 800a0ba: 6a7b ldr r3, [r7, #36] @ 0x24
  23108. 800a0bc: 1ad3 subs r3, r2, r3
  23109. 800a0be: f241 3288 movw r2, #5000 @ 0x1388
  23110. 800a0c2: 4293 cmp r3, r2
  23111. 800a0c4: d901 bls.n 800a0ca <HAL_RCC_OscConfig+0x632>
  23112. {
  23113. return HAL_TIMEOUT;
  23114. 800a0c6: 2303 movs r3, #3
  23115. 800a0c8: e138 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  23116. while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != 0U)
  23117. 800a0ca: 4b4e ldr r3, [pc, #312] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23118. 800a0cc: 6f1b ldr r3, [r3, #112] @ 0x70
  23119. 800a0ce: f003 0302 and.w r3, r3, #2
  23120. 800a0d2: 2b00 cmp r3, #0
  23121. 800a0d4: d1ee bne.n 800a0b4 <HAL_RCC_OscConfig+0x61c>
  23122. }
  23123. }
  23124. /*-------------------------------- PLL Configuration -----------------------*/
  23125. /* Check the parameters */
  23126. assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));
  23127. if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE)
  23128. 800a0d6: 687b ldr r3, [r7, #4]
  23129. 800a0d8: 6a5b ldr r3, [r3, #36] @ 0x24
  23130. 800a0da: 2b00 cmp r3, #0
  23131. 800a0dc: f000 812d beq.w 800a33a <HAL_RCC_OscConfig+0x8a2>
  23132. {
  23133. /* Check if the PLL is used as system clock or not */
  23134. if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL1)
  23135. 800a0e0: 4b48 ldr r3, [pc, #288] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23136. 800a0e2: 691b ldr r3, [r3, #16]
  23137. 800a0e4: f003 0338 and.w r3, r3, #56 @ 0x38
  23138. 800a0e8: 2b18 cmp r3, #24
  23139. 800a0ea: f000 80bd beq.w 800a268 <HAL_RCC_OscConfig+0x7d0>
  23140. {
  23141. if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON)
  23142. 800a0ee: 687b ldr r3, [r7, #4]
  23143. 800a0f0: 6a5b ldr r3, [r3, #36] @ 0x24
  23144. 800a0f2: 2b02 cmp r3, #2
  23145. 800a0f4: f040 809e bne.w 800a234 <HAL_RCC_OscConfig+0x79c>
  23146. assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ));
  23147. assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR));
  23148. assert_param(IS_RCC_PLLFRACN_VALUE(RCC_OscInitStruct->PLL.PLLFRACN));
  23149. /* Disable the main PLL. */
  23150. __HAL_RCC_PLL_DISABLE();
  23151. 800a0f8: 4b42 ldr r3, [pc, #264] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23152. 800a0fa: 681b ldr r3, [r3, #0]
  23153. 800a0fc: 4a41 ldr r2, [pc, #260] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23154. 800a0fe: f023 7380 bic.w r3, r3, #16777216 @ 0x1000000
  23155. 800a102: 6013 str r3, [r2, #0]
  23156. /* Get Start Tick*/
  23157. tickstart = HAL_GetTick();
  23158. 800a104: f7fa ff94 bl 8005030 <HAL_GetTick>
  23159. 800a108: 6278 str r0, [r7, #36] @ 0x24
  23160. /* Wait till PLL is disabled */
  23161. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != 0U)
  23162. 800a10a: e008 b.n 800a11e <HAL_RCC_OscConfig+0x686>
  23163. {
  23164. if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
  23165. 800a10c: f7fa ff90 bl 8005030 <HAL_GetTick>
  23166. 800a110: 4602 mov r2, r0
  23167. 800a112: 6a7b ldr r3, [r7, #36] @ 0x24
  23168. 800a114: 1ad3 subs r3, r2, r3
  23169. 800a116: 2b02 cmp r3, #2
  23170. 800a118: d901 bls.n 800a11e <HAL_RCC_OscConfig+0x686>
  23171. {
  23172. return HAL_TIMEOUT;
  23173. 800a11a: 2303 movs r3, #3
  23174. 800a11c: e10e b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  23175. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != 0U)
  23176. 800a11e: 4b39 ldr r3, [pc, #228] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23177. 800a120: 681b ldr r3, [r3, #0]
  23178. 800a122: f003 7300 and.w r3, r3, #33554432 @ 0x2000000
  23179. 800a126: 2b00 cmp r3, #0
  23180. 800a128: d1f0 bne.n 800a10c <HAL_RCC_OscConfig+0x674>
  23181. }
  23182. }
  23183. /* Configure the main PLL clock source, multiplication and division factors. */
  23184. __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource,
  23185. 800a12a: 4b36 ldr r3, [pc, #216] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23186. 800a12c: 6a9a ldr r2, [r3, #40] @ 0x28
  23187. 800a12e: 4b37 ldr r3, [pc, #220] @ (800a20c <HAL_RCC_OscConfig+0x774>)
  23188. 800a130: 4013 ands r3, r2
  23189. 800a132: 687a ldr r2, [r7, #4]
  23190. 800a134: 6a91 ldr r1, [r2, #40] @ 0x28
  23191. 800a136: 687a ldr r2, [r7, #4]
  23192. 800a138: 6ad2 ldr r2, [r2, #44] @ 0x2c
  23193. 800a13a: 0112 lsls r2, r2, #4
  23194. 800a13c: 430a orrs r2, r1
  23195. 800a13e: 4931 ldr r1, [pc, #196] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23196. 800a140: 4313 orrs r3, r2
  23197. 800a142: 628b str r3, [r1, #40] @ 0x28
  23198. 800a144: 687b ldr r3, [r7, #4]
  23199. 800a146: 6b1b ldr r3, [r3, #48] @ 0x30
  23200. 800a148: 3b01 subs r3, #1
  23201. 800a14a: f3c3 0208 ubfx r2, r3, #0, #9
  23202. 800a14e: 687b ldr r3, [r7, #4]
  23203. 800a150: 6b5b ldr r3, [r3, #52] @ 0x34
  23204. 800a152: 3b01 subs r3, #1
  23205. 800a154: 025b lsls r3, r3, #9
  23206. 800a156: b29b uxth r3, r3
  23207. 800a158: 431a orrs r2, r3
  23208. 800a15a: 687b ldr r3, [r7, #4]
  23209. 800a15c: 6b9b ldr r3, [r3, #56] @ 0x38
  23210. 800a15e: 3b01 subs r3, #1
  23211. 800a160: 041b lsls r3, r3, #16
  23212. 800a162: f403 03fe and.w r3, r3, #8323072 @ 0x7f0000
  23213. 800a166: 431a orrs r2, r3
  23214. 800a168: 687b ldr r3, [r7, #4]
  23215. 800a16a: 6bdb ldr r3, [r3, #60] @ 0x3c
  23216. 800a16c: 3b01 subs r3, #1
  23217. 800a16e: 061b lsls r3, r3, #24
  23218. 800a170: f003 43fe and.w r3, r3, #2130706432 @ 0x7f000000
  23219. 800a174: 4923 ldr r1, [pc, #140] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23220. 800a176: 4313 orrs r3, r2
  23221. 800a178: 630b str r3, [r1, #48] @ 0x30
  23222. RCC_OscInitStruct->PLL.PLLP,
  23223. RCC_OscInitStruct->PLL.PLLQ,
  23224. RCC_OscInitStruct->PLL.PLLR);
  23225. /* Disable PLLFRACN . */
  23226. __HAL_RCC_PLLFRACN_DISABLE();
  23227. 800a17a: 4b22 ldr r3, [pc, #136] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23228. 800a17c: 6adb ldr r3, [r3, #44] @ 0x2c
  23229. 800a17e: 4a21 ldr r2, [pc, #132] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23230. 800a180: f023 0301 bic.w r3, r3, #1
  23231. 800a184: 62d3 str r3, [r2, #44] @ 0x2c
  23232. /* Configure PLL PLL1FRACN */
  23233. __HAL_RCC_PLLFRACN_CONFIG(RCC_OscInitStruct->PLL.PLLFRACN);
  23234. 800a186: 4b1f ldr r3, [pc, #124] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23235. 800a188: 6b5a ldr r2, [r3, #52] @ 0x34
  23236. 800a18a: 4b21 ldr r3, [pc, #132] @ (800a210 <HAL_RCC_OscConfig+0x778>)
  23237. 800a18c: 4013 ands r3, r2
  23238. 800a18e: 687a ldr r2, [r7, #4]
  23239. 800a190: 6c92 ldr r2, [r2, #72] @ 0x48
  23240. 800a192: 00d2 lsls r2, r2, #3
  23241. 800a194: 491b ldr r1, [pc, #108] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23242. 800a196: 4313 orrs r3, r2
  23243. 800a198: 634b str r3, [r1, #52] @ 0x34
  23244. /* Select PLL1 input reference frequency range: VCI */
  23245. __HAL_RCC_PLL_VCIRANGE(RCC_OscInitStruct->PLL.PLLRGE) ;
  23246. 800a19a: 4b1a ldr r3, [pc, #104] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23247. 800a19c: 6adb ldr r3, [r3, #44] @ 0x2c
  23248. 800a19e: f023 020c bic.w r2, r3, #12
  23249. 800a1a2: 687b ldr r3, [r7, #4]
  23250. 800a1a4: 6c1b ldr r3, [r3, #64] @ 0x40
  23251. 800a1a6: 4917 ldr r1, [pc, #92] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23252. 800a1a8: 4313 orrs r3, r2
  23253. 800a1aa: 62cb str r3, [r1, #44] @ 0x2c
  23254. /* Select PLL1 output frequency range : VCO */
  23255. __HAL_RCC_PLL_VCORANGE(RCC_OscInitStruct->PLL.PLLVCOSEL) ;
  23256. 800a1ac: 4b15 ldr r3, [pc, #84] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23257. 800a1ae: 6adb ldr r3, [r3, #44] @ 0x2c
  23258. 800a1b0: f023 0202 bic.w r2, r3, #2
  23259. 800a1b4: 687b ldr r3, [r7, #4]
  23260. 800a1b6: 6c5b ldr r3, [r3, #68] @ 0x44
  23261. 800a1b8: 4912 ldr r1, [pc, #72] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23262. 800a1ba: 4313 orrs r3, r2
  23263. 800a1bc: 62cb str r3, [r1, #44] @ 0x2c
  23264. /* Enable PLL System Clock output. */
  23265. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVP);
  23266. 800a1be: 4b11 ldr r3, [pc, #68] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23267. 800a1c0: 6adb ldr r3, [r3, #44] @ 0x2c
  23268. 800a1c2: 4a10 ldr r2, [pc, #64] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23269. 800a1c4: f443 3380 orr.w r3, r3, #65536 @ 0x10000
  23270. 800a1c8: 62d3 str r3, [r2, #44] @ 0x2c
  23271. /* Enable PLL1Q Clock output. */
  23272. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  23273. 800a1ca: 4b0e ldr r3, [pc, #56] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23274. 800a1cc: 6adb ldr r3, [r3, #44] @ 0x2c
  23275. 800a1ce: 4a0d ldr r2, [pc, #52] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23276. 800a1d0: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  23277. 800a1d4: 62d3 str r3, [r2, #44] @ 0x2c
  23278. /* Enable PLL1R Clock output. */
  23279. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVR);
  23280. 800a1d6: 4b0b ldr r3, [pc, #44] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23281. 800a1d8: 6adb ldr r3, [r3, #44] @ 0x2c
  23282. 800a1da: 4a0a ldr r2, [pc, #40] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23283. 800a1dc: f443 2380 orr.w r3, r3, #262144 @ 0x40000
  23284. 800a1e0: 62d3 str r3, [r2, #44] @ 0x2c
  23285. /* Enable PLL1FRACN . */
  23286. __HAL_RCC_PLLFRACN_ENABLE();
  23287. 800a1e2: 4b08 ldr r3, [pc, #32] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23288. 800a1e4: 6adb ldr r3, [r3, #44] @ 0x2c
  23289. 800a1e6: 4a07 ldr r2, [pc, #28] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23290. 800a1e8: f043 0301 orr.w r3, r3, #1
  23291. 800a1ec: 62d3 str r3, [r2, #44] @ 0x2c
  23292. /* Enable the main PLL. */
  23293. __HAL_RCC_PLL_ENABLE();
  23294. 800a1ee: 4b05 ldr r3, [pc, #20] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23295. 800a1f0: 681b ldr r3, [r3, #0]
  23296. 800a1f2: 4a04 ldr r2, [pc, #16] @ (800a204 <HAL_RCC_OscConfig+0x76c>)
  23297. 800a1f4: f043 7380 orr.w r3, r3, #16777216 @ 0x1000000
  23298. 800a1f8: 6013 str r3, [r2, #0]
  23299. /* Get Start Tick*/
  23300. tickstart = HAL_GetTick();
  23301. 800a1fa: f7fa ff19 bl 8005030 <HAL_GetTick>
  23302. 800a1fe: 6278 str r0, [r7, #36] @ 0x24
  23303. /* Wait till PLL is ready */
  23304. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == 0U)
  23305. 800a200: e011 b.n 800a226 <HAL_RCC_OscConfig+0x78e>
  23306. 800a202: bf00 nop
  23307. 800a204: 58024400 .word 0x58024400
  23308. 800a208: 58024800 .word 0x58024800
  23309. 800a20c: fffffc0c .word 0xfffffc0c
  23310. 800a210: ffff0007 .word 0xffff0007
  23311. {
  23312. if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
  23313. 800a214: f7fa ff0c bl 8005030 <HAL_GetTick>
  23314. 800a218: 4602 mov r2, r0
  23315. 800a21a: 6a7b ldr r3, [r7, #36] @ 0x24
  23316. 800a21c: 1ad3 subs r3, r2, r3
  23317. 800a21e: 2b02 cmp r3, #2
  23318. 800a220: d901 bls.n 800a226 <HAL_RCC_OscConfig+0x78e>
  23319. {
  23320. return HAL_TIMEOUT;
  23321. 800a222: 2303 movs r3, #3
  23322. 800a224: e08a b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  23323. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == 0U)
  23324. 800a226: 4b47 ldr r3, [pc, #284] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23325. 800a228: 681b ldr r3, [r3, #0]
  23326. 800a22a: f003 7300 and.w r3, r3, #33554432 @ 0x2000000
  23327. 800a22e: 2b00 cmp r3, #0
  23328. 800a230: d0f0 beq.n 800a214 <HAL_RCC_OscConfig+0x77c>
  23329. 800a232: e082 b.n 800a33a <HAL_RCC_OscConfig+0x8a2>
  23330. }
  23331. }
  23332. else
  23333. {
  23334. /* Disable the main PLL. */
  23335. __HAL_RCC_PLL_DISABLE();
  23336. 800a234: 4b43 ldr r3, [pc, #268] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23337. 800a236: 681b ldr r3, [r3, #0]
  23338. 800a238: 4a42 ldr r2, [pc, #264] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23339. 800a23a: f023 7380 bic.w r3, r3, #16777216 @ 0x1000000
  23340. 800a23e: 6013 str r3, [r2, #0]
  23341. /* Get Start Tick*/
  23342. tickstart = HAL_GetTick();
  23343. 800a240: f7fa fef6 bl 8005030 <HAL_GetTick>
  23344. 800a244: 6278 str r0, [r7, #36] @ 0x24
  23345. /* Wait till PLL is disabled */
  23346. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != 0U)
  23347. 800a246: e008 b.n 800a25a <HAL_RCC_OscConfig+0x7c2>
  23348. {
  23349. if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
  23350. 800a248: f7fa fef2 bl 8005030 <HAL_GetTick>
  23351. 800a24c: 4602 mov r2, r0
  23352. 800a24e: 6a7b ldr r3, [r7, #36] @ 0x24
  23353. 800a250: 1ad3 subs r3, r2, r3
  23354. 800a252: 2b02 cmp r3, #2
  23355. 800a254: d901 bls.n 800a25a <HAL_RCC_OscConfig+0x7c2>
  23356. {
  23357. return HAL_TIMEOUT;
  23358. 800a256: 2303 movs r3, #3
  23359. 800a258: e070 b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  23360. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != 0U)
  23361. 800a25a: 4b3a ldr r3, [pc, #232] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23362. 800a25c: 681b ldr r3, [r3, #0]
  23363. 800a25e: f003 7300 and.w r3, r3, #33554432 @ 0x2000000
  23364. 800a262: 2b00 cmp r3, #0
  23365. 800a264: d1f0 bne.n 800a248 <HAL_RCC_OscConfig+0x7b0>
  23366. 800a266: e068 b.n 800a33a <HAL_RCC_OscConfig+0x8a2>
  23367. }
  23368. }
  23369. else
  23370. {
  23371. /* Do not return HAL_ERROR if request repeats the current configuration */
  23372. temp1_pllckcfg = RCC->PLLCKSELR;
  23373. 800a268: 4b36 ldr r3, [pc, #216] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23374. 800a26a: 6a9b ldr r3, [r3, #40] @ 0x28
  23375. 800a26c: 613b str r3, [r7, #16]
  23376. temp2_pllckcfg = RCC->PLL1DIVR;
  23377. 800a26e: 4b35 ldr r3, [pc, #212] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23378. 800a270: 6b1b ldr r3, [r3, #48] @ 0x30
  23379. 800a272: 60fb str r3, [r7, #12]
  23380. if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) ||
  23381. 800a274: 687b ldr r3, [r7, #4]
  23382. 800a276: 6a5b ldr r3, [r3, #36] @ 0x24
  23383. 800a278: 2b01 cmp r3, #1
  23384. 800a27a: d031 beq.n 800a2e0 <HAL_RCC_OscConfig+0x848>
  23385. (READ_BIT(temp1_pllckcfg, RCC_PLLCKSELR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) ||
  23386. 800a27c: 693b ldr r3, [r7, #16]
  23387. 800a27e: f003 0203 and.w r2, r3, #3
  23388. 800a282: 687b ldr r3, [r7, #4]
  23389. 800a284: 6a9b ldr r3, [r3, #40] @ 0x28
  23390. if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) ||
  23391. 800a286: 429a cmp r2, r3
  23392. 800a288: d12a bne.n 800a2e0 <HAL_RCC_OscConfig+0x848>
  23393. ((READ_BIT(temp1_pllckcfg, RCC_PLLCKSELR_DIVM1) >> RCC_PLLCKSELR_DIVM1_Pos) != RCC_OscInitStruct->PLL.PLLM) ||
  23394. 800a28a: 693b ldr r3, [r7, #16]
  23395. 800a28c: 091b lsrs r3, r3, #4
  23396. 800a28e: f003 023f and.w r2, r3, #63 @ 0x3f
  23397. 800a292: 687b ldr r3, [r7, #4]
  23398. 800a294: 6adb ldr r3, [r3, #44] @ 0x2c
  23399. (READ_BIT(temp1_pllckcfg, RCC_PLLCKSELR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) ||
  23400. 800a296: 429a cmp r2, r3
  23401. 800a298: d122 bne.n 800a2e0 <HAL_RCC_OscConfig+0x848>
  23402. (READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_N1) != (RCC_OscInitStruct->PLL.PLLN - 1U)) ||
  23403. 800a29a: 68fb ldr r3, [r7, #12]
  23404. 800a29c: f3c3 0208 ubfx r2, r3, #0, #9
  23405. 800a2a0: 687b ldr r3, [r7, #4]
  23406. 800a2a2: 6b1b ldr r3, [r3, #48] @ 0x30
  23407. 800a2a4: 3b01 subs r3, #1
  23408. ((READ_BIT(temp1_pllckcfg, RCC_PLLCKSELR_DIVM1) >> RCC_PLLCKSELR_DIVM1_Pos) != RCC_OscInitStruct->PLL.PLLM) ||
  23409. 800a2a6: 429a cmp r2, r3
  23410. 800a2a8: d11a bne.n 800a2e0 <HAL_RCC_OscConfig+0x848>
  23411. ((READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_P1) >> RCC_PLL1DIVR_P1_Pos) != (RCC_OscInitStruct->PLL.PLLP - 1U)) ||
  23412. 800a2aa: 68fb ldr r3, [r7, #12]
  23413. 800a2ac: 0a5b lsrs r3, r3, #9
  23414. 800a2ae: f003 027f and.w r2, r3, #127 @ 0x7f
  23415. 800a2b2: 687b ldr r3, [r7, #4]
  23416. 800a2b4: 6b5b ldr r3, [r3, #52] @ 0x34
  23417. 800a2b6: 3b01 subs r3, #1
  23418. (READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_N1) != (RCC_OscInitStruct->PLL.PLLN - 1U)) ||
  23419. 800a2b8: 429a cmp r2, r3
  23420. 800a2ba: d111 bne.n 800a2e0 <HAL_RCC_OscConfig+0x848>
  23421. ((READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_Q1) >> RCC_PLL1DIVR_Q1_Pos) != (RCC_OscInitStruct->PLL.PLLQ - 1U)) ||
  23422. 800a2bc: 68fb ldr r3, [r7, #12]
  23423. 800a2be: 0c1b lsrs r3, r3, #16
  23424. 800a2c0: f003 027f and.w r2, r3, #127 @ 0x7f
  23425. 800a2c4: 687b ldr r3, [r7, #4]
  23426. 800a2c6: 6b9b ldr r3, [r3, #56] @ 0x38
  23427. 800a2c8: 3b01 subs r3, #1
  23428. ((READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_P1) >> RCC_PLL1DIVR_P1_Pos) != (RCC_OscInitStruct->PLL.PLLP - 1U)) ||
  23429. 800a2ca: 429a cmp r2, r3
  23430. 800a2cc: d108 bne.n 800a2e0 <HAL_RCC_OscConfig+0x848>
  23431. ((READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_R1) >> RCC_PLL1DIVR_R1_Pos) != (RCC_OscInitStruct->PLL.PLLR - 1U)))
  23432. 800a2ce: 68fb ldr r3, [r7, #12]
  23433. 800a2d0: 0e1b lsrs r3, r3, #24
  23434. 800a2d2: f003 027f and.w r2, r3, #127 @ 0x7f
  23435. 800a2d6: 687b ldr r3, [r7, #4]
  23436. 800a2d8: 6bdb ldr r3, [r3, #60] @ 0x3c
  23437. 800a2da: 3b01 subs r3, #1
  23438. ((READ_BIT(temp2_pllckcfg, RCC_PLL1DIVR_Q1) >> RCC_PLL1DIVR_Q1_Pos) != (RCC_OscInitStruct->PLL.PLLQ - 1U)) ||
  23439. 800a2dc: 429a cmp r2, r3
  23440. 800a2de: d001 beq.n 800a2e4 <HAL_RCC_OscConfig+0x84c>
  23441. {
  23442. return HAL_ERROR;
  23443. 800a2e0: 2301 movs r3, #1
  23444. 800a2e2: e02b b.n 800a33c <HAL_RCC_OscConfig+0x8a4>
  23445. }
  23446. else
  23447. {
  23448. /* Check if only fractional part needs to be updated */
  23449. temp1_pllckcfg = ((RCC->PLL1FRACR & RCC_PLL1FRACR_FRACN1) >> RCC_PLL1FRACR_FRACN1_Pos);
  23450. 800a2e4: 4b17 ldr r3, [pc, #92] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23451. 800a2e6: 6b5b ldr r3, [r3, #52] @ 0x34
  23452. 800a2e8: 08db lsrs r3, r3, #3
  23453. 800a2ea: f3c3 030c ubfx r3, r3, #0, #13
  23454. 800a2ee: 613b str r3, [r7, #16]
  23455. if (RCC_OscInitStruct->PLL.PLLFRACN != temp1_pllckcfg)
  23456. 800a2f0: 687b ldr r3, [r7, #4]
  23457. 800a2f2: 6c9b ldr r3, [r3, #72] @ 0x48
  23458. 800a2f4: 693a ldr r2, [r7, #16]
  23459. 800a2f6: 429a cmp r2, r3
  23460. 800a2f8: d01f beq.n 800a33a <HAL_RCC_OscConfig+0x8a2>
  23461. {
  23462. assert_param(IS_RCC_PLLFRACN_VALUE(RCC_OscInitStruct->PLL.PLLFRACN));
  23463. /* Disable PLL1FRACEN */
  23464. __HAL_RCC_PLLFRACN_DISABLE();
  23465. 800a2fa: 4b12 ldr r3, [pc, #72] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23466. 800a2fc: 6adb ldr r3, [r3, #44] @ 0x2c
  23467. 800a2fe: 4a11 ldr r2, [pc, #68] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23468. 800a300: f023 0301 bic.w r3, r3, #1
  23469. 800a304: 62d3 str r3, [r2, #44] @ 0x2c
  23470. /* Get Start Tick*/
  23471. tickstart = HAL_GetTick();
  23472. 800a306: f7fa fe93 bl 8005030 <HAL_GetTick>
  23473. 800a30a: 6278 str r0, [r7, #36] @ 0x24
  23474. /* Wait at least 2 CK_REF (PLL input source divided by M) period to make sure next latched value will be taken into account. */
  23475. while ((HAL_GetTick() - tickstart) < PLL_FRAC_TIMEOUT_VALUE)
  23476. 800a30c: bf00 nop
  23477. 800a30e: f7fa fe8f bl 8005030 <HAL_GetTick>
  23478. 800a312: 4602 mov r2, r0
  23479. 800a314: 6a7b ldr r3, [r7, #36] @ 0x24
  23480. 800a316: 4293 cmp r3, r2
  23481. 800a318: d0f9 beq.n 800a30e <HAL_RCC_OscConfig+0x876>
  23482. {
  23483. }
  23484. /* Configure PLL1 PLL1FRACN */
  23485. __HAL_RCC_PLLFRACN_CONFIG(RCC_OscInitStruct->PLL.PLLFRACN);
  23486. 800a31a: 4b0a ldr r3, [pc, #40] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23487. 800a31c: 6b5a ldr r2, [r3, #52] @ 0x34
  23488. 800a31e: 4b0a ldr r3, [pc, #40] @ (800a348 <HAL_RCC_OscConfig+0x8b0>)
  23489. 800a320: 4013 ands r3, r2
  23490. 800a322: 687a ldr r2, [r7, #4]
  23491. 800a324: 6c92 ldr r2, [r2, #72] @ 0x48
  23492. 800a326: 00d2 lsls r2, r2, #3
  23493. 800a328: 4906 ldr r1, [pc, #24] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23494. 800a32a: 4313 orrs r3, r2
  23495. 800a32c: 634b str r3, [r1, #52] @ 0x34
  23496. /* Enable PLL1FRACEN to latch new value. */
  23497. __HAL_RCC_PLLFRACN_ENABLE();
  23498. 800a32e: 4b05 ldr r3, [pc, #20] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23499. 800a330: 6adb ldr r3, [r3, #44] @ 0x2c
  23500. 800a332: 4a04 ldr r2, [pc, #16] @ (800a344 <HAL_RCC_OscConfig+0x8ac>)
  23501. 800a334: f043 0301 orr.w r3, r3, #1
  23502. 800a338: 62d3 str r3, [r2, #44] @ 0x2c
  23503. }
  23504. }
  23505. }
  23506. }
  23507. return HAL_OK;
  23508. 800a33a: 2300 movs r3, #0
  23509. }
  23510. 800a33c: 4618 mov r0, r3
  23511. 800a33e: 3730 adds r7, #48 @ 0x30
  23512. 800a340: 46bd mov sp, r7
  23513. 800a342: bd80 pop {r7, pc}
  23514. 800a344: 58024400 .word 0x58024400
  23515. 800a348: ffff0007 .word 0xffff0007
  23516. 0800a34c <HAL_RCC_ClockConfig>:
  23517. * D1CPRE[3:0] bits to ensure that Domain1 core clock not exceed the maximum allowed frequency
  23518. * (for more details refer to section above "Initialization/de-initialization functions")
  23519. * @retval None
  23520. */
  23521. HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
  23522. {
  23523. 800a34c: b580 push {r7, lr}
  23524. 800a34e: b086 sub sp, #24
  23525. 800a350: af00 add r7, sp, #0
  23526. 800a352: 6078 str r0, [r7, #4]
  23527. 800a354: 6039 str r1, [r7, #0]
  23528. HAL_StatusTypeDef halstatus;
  23529. uint32_t tickstart;
  23530. uint32_t common_system_clock;
  23531. /* Check Null pointer */
  23532. if (RCC_ClkInitStruct == NULL)
  23533. 800a356: 687b ldr r3, [r7, #4]
  23534. 800a358: 2b00 cmp r3, #0
  23535. 800a35a: d101 bne.n 800a360 <HAL_RCC_ClockConfig+0x14>
  23536. {
  23537. return HAL_ERROR;
  23538. 800a35c: 2301 movs r3, #1
  23539. 800a35e: e19c b.n 800a69a <HAL_RCC_ClockConfig+0x34e>
  23540. /* To correctly read data from FLASH memory, the number of wait states (LATENCY)
  23541. must be correctly programmed according to the frequency of the CPU clock
  23542. (HCLK) and the supply voltage of the device. */
  23543. /* Increasing the CPU frequency */
  23544. if (FLatency > __HAL_FLASH_GET_LATENCY())
  23545. 800a360: 4b8a ldr r3, [pc, #552] @ (800a58c <HAL_RCC_ClockConfig+0x240>)
  23546. 800a362: 681b ldr r3, [r3, #0]
  23547. 800a364: f003 030f and.w r3, r3, #15
  23548. 800a368: 683a ldr r2, [r7, #0]
  23549. 800a36a: 429a cmp r2, r3
  23550. 800a36c: d910 bls.n 800a390 <HAL_RCC_ClockConfig+0x44>
  23551. {
  23552. /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
  23553. __HAL_FLASH_SET_LATENCY(FLatency);
  23554. 800a36e: 4b87 ldr r3, [pc, #540] @ (800a58c <HAL_RCC_ClockConfig+0x240>)
  23555. 800a370: 681b ldr r3, [r3, #0]
  23556. 800a372: f023 020f bic.w r2, r3, #15
  23557. 800a376: 4985 ldr r1, [pc, #532] @ (800a58c <HAL_RCC_ClockConfig+0x240>)
  23558. 800a378: 683b ldr r3, [r7, #0]
  23559. 800a37a: 4313 orrs r3, r2
  23560. 800a37c: 600b str r3, [r1, #0]
  23561. /* Check that the new number of wait states is taken into account to access the Flash
  23562. memory by reading the FLASH_ACR register */
  23563. if (__HAL_FLASH_GET_LATENCY() != FLatency)
  23564. 800a37e: 4b83 ldr r3, [pc, #524] @ (800a58c <HAL_RCC_ClockConfig+0x240>)
  23565. 800a380: 681b ldr r3, [r3, #0]
  23566. 800a382: f003 030f and.w r3, r3, #15
  23567. 800a386: 683a ldr r2, [r7, #0]
  23568. 800a388: 429a cmp r2, r3
  23569. 800a38a: d001 beq.n 800a390 <HAL_RCC_ClockConfig+0x44>
  23570. {
  23571. return HAL_ERROR;
  23572. 800a38c: 2301 movs r3, #1
  23573. 800a38e: e184 b.n 800a69a <HAL_RCC_ClockConfig+0x34e>
  23574. }
  23575. /* Increasing the BUS frequency divider */
  23576. /*-------------------------- D1PCLK1/CDPCLK1 Configuration ---------------------------*/
  23577. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_D1PCLK1) == RCC_CLOCKTYPE_D1PCLK1)
  23578. 800a390: 687b ldr r3, [r7, #4]
  23579. 800a392: 681b ldr r3, [r3, #0]
  23580. 800a394: f003 0304 and.w r3, r3, #4
  23581. 800a398: 2b00 cmp r3, #0
  23582. 800a39a: d010 beq.n 800a3be <HAL_RCC_ClockConfig+0x72>
  23583. {
  23584. #if defined (RCC_D1CFGR_D1PPRE)
  23585. if ((RCC_ClkInitStruct->APB3CLKDivider) > (RCC->D1CFGR & RCC_D1CFGR_D1PPRE))
  23586. 800a39c: 687b ldr r3, [r7, #4]
  23587. 800a39e: 691a ldr r2, [r3, #16]
  23588. 800a3a0: 4b7b ldr r3, [pc, #492] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23589. 800a3a2: 699b ldr r3, [r3, #24]
  23590. 800a3a4: f003 0370 and.w r3, r3, #112 @ 0x70
  23591. 800a3a8: 429a cmp r2, r3
  23592. 800a3aa: d908 bls.n 800a3be <HAL_RCC_ClockConfig+0x72>
  23593. {
  23594. assert_param(IS_RCC_D1PCLK1(RCC_ClkInitStruct->APB3CLKDivider));
  23595. MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1PPRE, RCC_ClkInitStruct->APB3CLKDivider);
  23596. 800a3ac: 4b78 ldr r3, [pc, #480] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23597. 800a3ae: 699b ldr r3, [r3, #24]
  23598. 800a3b0: f023 0270 bic.w r2, r3, #112 @ 0x70
  23599. 800a3b4: 687b ldr r3, [r7, #4]
  23600. 800a3b6: 691b ldr r3, [r3, #16]
  23601. 800a3b8: 4975 ldr r1, [pc, #468] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23602. 800a3ba: 4313 orrs r3, r2
  23603. 800a3bc: 618b str r3, [r1, #24]
  23604. }
  23605. #endif
  23606. }
  23607. /*-------------------------- PCLK1 Configuration ---------------------------*/
  23608. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1)
  23609. 800a3be: 687b ldr r3, [r7, #4]
  23610. 800a3c0: 681b ldr r3, [r3, #0]
  23611. 800a3c2: f003 0308 and.w r3, r3, #8
  23612. 800a3c6: 2b00 cmp r3, #0
  23613. 800a3c8: d010 beq.n 800a3ec <HAL_RCC_ClockConfig+0xa0>
  23614. {
  23615. #if defined (RCC_D2CFGR_D2PPRE1)
  23616. if ((RCC_ClkInitStruct->APB1CLKDivider) > (RCC->D2CFGR & RCC_D2CFGR_D2PPRE1))
  23617. 800a3ca: 687b ldr r3, [r7, #4]
  23618. 800a3cc: 695a ldr r2, [r3, #20]
  23619. 800a3ce: 4b70 ldr r3, [pc, #448] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23620. 800a3d0: 69db ldr r3, [r3, #28]
  23621. 800a3d2: f003 0370 and.w r3, r3, #112 @ 0x70
  23622. 800a3d6: 429a cmp r2, r3
  23623. 800a3d8: d908 bls.n 800a3ec <HAL_RCC_ClockConfig+0xa0>
  23624. {
  23625. assert_param(IS_RCC_PCLK1(RCC_ClkInitStruct->APB1CLKDivider));
  23626. MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE1, (RCC_ClkInitStruct->APB1CLKDivider));
  23627. 800a3da: 4b6d ldr r3, [pc, #436] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23628. 800a3dc: 69db ldr r3, [r3, #28]
  23629. 800a3de: f023 0270 bic.w r2, r3, #112 @ 0x70
  23630. 800a3e2: 687b ldr r3, [r7, #4]
  23631. 800a3e4: 695b ldr r3, [r3, #20]
  23632. 800a3e6: 496a ldr r1, [pc, #424] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23633. 800a3e8: 4313 orrs r3, r2
  23634. 800a3ea: 61cb str r3, [r1, #28]
  23635. MODIFY_REG(RCC->CDCFGR2, RCC_CDCFGR2_CDPPRE1, (RCC_ClkInitStruct->APB1CLKDivider));
  23636. }
  23637. #endif
  23638. }
  23639. /*-------------------------- PCLK2 Configuration ---------------------------*/
  23640. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2)
  23641. 800a3ec: 687b ldr r3, [r7, #4]
  23642. 800a3ee: 681b ldr r3, [r3, #0]
  23643. 800a3f0: f003 0310 and.w r3, r3, #16
  23644. 800a3f4: 2b00 cmp r3, #0
  23645. 800a3f6: d010 beq.n 800a41a <HAL_RCC_ClockConfig+0xce>
  23646. {
  23647. #if defined(RCC_D2CFGR_D2PPRE2)
  23648. if ((RCC_ClkInitStruct->APB2CLKDivider) > (RCC->D2CFGR & RCC_D2CFGR_D2PPRE2))
  23649. 800a3f8: 687b ldr r3, [r7, #4]
  23650. 800a3fa: 699a ldr r2, [r3, #24]
  23651. 800a3fc: 4b64 ldr r3, [pc, #400] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23652. 800a3fe: 69db ldr r3, [r3, #28]
  23653. 800a400: f403 63e0 and.w r3, r3, #1792 @ 0x700
  23654. 800a404: 429a cmp r2, r3
  23655. 800a406: d908 bls.n 800a41a <HAL_RCC_ClockConfig+0xce>
  23656. {
  23657. assert_param(IS_RCC_PCLK2(RCC_ClkInitStruct->APB2CLKDivider));
  23658. MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE2, (RCC_ClkInitStruct->APB2CLKDivider));
  23659. 800a408: 4b61 ldr r3, [pc, #388] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23660. 800a40a: 69db ldr r3, [r3, #28]
  23661. 800a40c: f423 62e0 bic.w r2, r3, #1792 @ 0x700
  23662. 800a410: 687b ldr r3, [r7, #4]
  23663. 800a412: 699b ldr r3, [r3, #24]
  23664. 800a414: 495e ldr r1, [pc, #376] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23665. 800a416: 4313 orrs r3, r2
  23666. 800a418: 61cb str r3, [r1, #28]
  23667. }
  23668. #endif
  23669. }
  23670. /*-------------------------- D3PCLK1 Configuration ---------------------------*/
  23671. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_D3PCLK1) == RCC_CLOCKTYPE_D3PCLK1)
  23672. 800a41a: 687b ldr r3, [r7, #4]
  23673. 800a41c: 681b ldr r3, [r3, #0]
  23674. 800a41e: f003 0320 and.w r3, r3, #32
  23675. 800a422: 2b00 cmp r3, #0
  23676. 800a424: d010 beq.n 800a448 <HAL_RCC_ClockConfig+0xfc>
  23677. {
  23678. #if defined(RCC_D3CFGR_D3PPRE)
  23679. if ((RCC_ClkInitStruct->APB4CLKDivider) > (RCC->D3CFGR & RCC_D3CFGR_D3PPRE))
  23680. 800a426: 687b ldr r3, [r7, #4]
  23681. 800a428: 69da ldr r2, [r3, #28]
  23682. 800a42a: 4b59 ldr r3, [pc, #356] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23683. 800a42c: 6a1b ldr r3, [r3, #32]
  23684. 800a42e: f003 0370 and.w r3, r3, #112 @ 0x70
  23685. 800a432: 429a cmp r2, r3
  23686. 800a434: d908 bls.n 800a448 <HAL_RCC_ClockConfig+0xfc>
  23687. {
  23688. assert_param(IS_RCC_D3PCLK1(RCC_ClkInitStruct->APB4CLKDivider));
  23689. MODIFY_REG(RCC->D3CFGR, RCC_D3CFGR_D3PPRE, (RCC_ClkInitStruct->APB4CLKDivider));
  23690. 800a436: 4b56 ldr r3, [pc, #344] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23691. 800a438: 6a1b ldr r3, [r3, #32]
  23692. 800a43a: f023 0270 bic.w r2, r3, #112 @ 0x70
  23693. 800a43e: 687b ldr r3, [r7, #4]
  23694. 800a440: 69db ldr r3, [r3, #28]
  23695. 800a442: 4953 ldr r1, [pc, #332] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23696. 800a444: 4313 orrs r3, r2
  23697. 800a446: 620b str r3, [r1, #32]
  23698. }
  23699. #endif
  23700. }
  23701. /*-------------------------- HCLK Configuration --------------------------*/
  23702. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK)
  23703. 800a448: 687b ldr r3, [r7, #4]
  23704. 800a44a: 681b ldr r3, [r3, #0]
  23705. 800a44c: f003 0302 and.w r3, r3, #2
  23706. 800a450: 2b00 cmp r3, #0
  23707. 800a452: d010 beq.n 800a476 <HAL_RCC_ClockConfig+0x12a>
  23708. {
  23709. #if defined (RCC_D1CFGR_HPRE)
  23710. if ((RCC_ClkInitStruct->AHBCLKDivider) > (RCC->D1CFGR & RCC_D1CFGR_HPRE))
  23711. 800a454: 687b ldr r3, [r7, #4]
  23712. 800a456: 68da ldr r2, [r3, #12]
  23713. 800a458: 4b4d ldr r3, [pc, #308] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23714. 800a45a: 699b ldr r3, [r3, #24]
  23715. 800a45c: f003 030f and.w r3, r3, #15
  23716. 800a460: 429a cmp r2, r3
  23717. 800a462: d908 bls.n 800a476 <HAL_RCC_ClockConfig+0x12a>
  23718. {
  23719. /* Set the new HCLK clock divider */
  23720. assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider));
  23721. MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider);
  23722. 800a464: 4b4a ldr r3, [pc, #296] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23723. 800a466: 699b ldr r3, [r3, #24]
  23724. 800a468: f023 020f bic.w r2, r3, #15
  23725. 800a46c: 687b ldr r3, [r7, #4]
  23726. 800a46e: 68db ldr r3, [r3, #12]
  23727. 800a470: 4947 ldr r1, [pc, #284] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23728. 800a472: 4313 orrs r3, r2
  23729. 800a474: 618b str r3, [r1, #24]
  23730. }
  23731. #endif
  23732. }
  23733. /*------------------------- SYSCLK Configuration -------------------------*/
  23734. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK)
  23735. 800a476: 687b ldr r3, [r7, #4]
  23736. 800a478: 681b ldr r3, [r3, #0]
  23737. 800a47a: f003 0301 and.w r3, r3, #1
  23738. 800a47e: 2b00 cmp r3, #0
  23739. 800a480: d055 beq.n 800a52e <HAL_RCC_ClockConfig+0x1e2>
  23740. {
  23741. assert_param(IS_RCC_SYSCLK(RCC_ClkInitStruct->SYSCLKDivider));
  23742. assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource));
  23743. #if defined(RCC_D1CFGR_D1CPRE)
  23744. MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1CPRE, RCC_ClkInitStruct->SYSCLKDivider);
  23745. 800a482: 4b43 ldr r3, [pc, #268] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23746. 800a484: 699b ldr r3, [r3, #24]
  23747. 800a486: f423 6270 bic.w r2, r3, #3840 @ 0xf00
  23748. 800a48a: 687b ldr r3, [r7, #4]
  23749. 800a48c: 689b ldr r3, [r3, #8]
  23750. 800a48e: 4940 ldr r1, [pc, #256] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23751. 800a490: 4313 orrs r3, r2
  23752. 800a492: 618b str r3, [r1, #24]
  23753. #else
  23754. MODIFY_REG(RCC->CDCFGR1, RCC_CDCFGR1_CDCPRE, RCC_ClkInitStruct->SYSCLKDivider);
  23755. #endif
  23756. /* HSE is selected as System Clock Source */
  23757. if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE)
  23758. 800a494: 687b ldr r3, [r7, #4]
  23759. 800a496: 685b ldr r3, [r3, #4]
  23760. 800a498: 2b02 cmp r3, #2
  23761. 800a49a: d107 bne.n 800a4ac <HAL_RCC_ClockConfig+0x160>
  23762. {
  23763. /* Check the HSE ready flag */
  23764. if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == 0U)
  23765. 800a49c: 4b3c ldr r3, [pc, #240] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23766. 800a49e: 681b ldr r3, [r3, #0]
  23767. 800a4a0: f403 3300 and.w r3, r3, #131072 @ 0x20000
  23768. 800a4a4: 2b00 cmp r3, #0
  23769. 800a4a6: d121 bne.n 800a4ec <HAL_RCC_ClockConfig+0x1a0>
  23770. {
  23771. return HAL_ERROR;
  23772. 800a4a8: 2301 movs r3, #1
  23773. 800a4aa: e0f6 b.n 800a69a <HAL_RCC_ClockConfig+0x34e>
  23774. }
  23775. }
  23776. /* PLL is selected as System Clock Source */
  23777. else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK)
  23778. 800a4ac: 687b ldr r3, [r7, #4]
  23779. 800a4ae: 685b ldr r3, [r3, #4]
  23780. 800a4b0: 2b03 cmp r3, #3
  23781. 800a4b2: d107 bne.n 800a4c4 <HAL_RCC_ClockConfig+0x178>
  23782. {
  23783. /* Check the PLL ready flag */
  23784. if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == 0U)
  23785. 800a4b4: 4b36 ldr r3, [pc, #216] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23786. 800a4b6: 681b ldr r3, [r3, #0]
  23787. 800a4b8: f003 7300 and.w r3, r3, #33554432 @ 0x2000000
  23788. 800a4bc: 2b00 cmp r3, #0
  23789. 800a4be: d115 bne.n 800a4ec <HAL_RCC_ClockConfig+0x1a0>
  23790. {
  23791. return HAL_ERROR;
  23792. 800a4c0: 2301 movs r3, #1
  23793. 800a4c2: e0ea b.n 800a69a <HAL_RCC_ClockConfig+0x34e>
  23794. }
  23795. }
  23796. /* CSI is selected as System Clock Source */
  23797. else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_CSI)
  23798. 800a4c4: 687b ldr r3, [r7, #4]
  23799. 800a4c6: 685b ldr r3, [r3, #4]
  23800. 800a4c8: 2b01 cmp r3, #1
  23801. 800a4ca: d107 bne.n 800a4dc <HAL_RCC_ClockConfig+0x190>
  23802. {
  23803. /* Check the PLL ready flag */
  23804. if (__HAL_RCC_GET_FLAG(RCC_FLAG_CSIRDY) == 0U)
  23805. 800a4cc: 4b30 ldr r3, [pc, #192] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23806. 800a4ce: 681b ldr r3, [r3, #0]
  23807. 800a4d0: f403 7380 and.w r3, r3, #256 @ 0x100
  23808. 800a4d4: 2b00 cmp r3, #0
  23809. 800a4d6: d109 bne.n 800a4ec <HAL_RCC_ClockConfig+0x1a0>
  23810. {
  23811. return HAL_ERROR;
  23812. 800a4d8: 2301 movs r3, #1
  23813. 800a4da: e0de b.n 800a69a <HAL_RCC_ClockConfig+0x34e>
  23814. }
  23815. /* HSI is selected as System Clock Source */
  23816. else
  23817. {
  23818. /* Check the HSI ready flag */
  23819. if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == 0U)
  23820. 800a4dc: 4b2c ldr r3, [pc, #176] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23821. 800a4de: 681b ldr r3, [r3, #0]
  23822. 800a4e0: f003 0304 and.w r3, r3, #4
  23823. 800a4e4: 2b00 cmp r3, #0
  23824. 800a4e6: d101 bne.n 800a4ec <HAL_RCC_ClockConfig+0x1a0>
  23825. {
  23826. return HAL_ERROR;
  23827. 800a4e8: 2301 movs r3, #1
  23828. 800a4ea: e0d6 b.n 800a69a <HAL_RCC_ClockConfig+0x34e>
  23829. }
  23830. }
  23831. MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_ClkInitStruct->SYSCLKSource);
  23832. 800a4ec: 4b28 ldr r3, [pc, #160] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23833. 800a4ee: 691b ldr r3, [r3, #16]
  23834. 800a4f0: f023 0207 bic.w r2, r3, #7
  23835. 800a4f4: 687b ldr r3, [r7, #4]
  23836. 800a4f6: 685b ldr r3, [r3, #4]
  23837. 800a4f8: 4925 ldr r1, [pc, #148] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23838. 800a4fa: 4313 orrs r3, r2
  23839. 800a4fc: 610b str r3, [r1, #16]
  23840. /* Get Start Tick*/
  23841. tickstart = HAL_GetTick();
  23842. 800a4fe: f7fa fd97 bl 8005030 <HAL_GetTick>
  23843. 800a502: 6178 str r0, [r7, #20]
  23844. while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos))
  23845. 800a504: e00a b.n 800a51c <HAL_RCC_ClockConfig+0x1d0>
  23846. {
  23847. if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE)
  23848. 800a506: f7fa fd93 bl 8005030 <HAL_GetTick>
  23849. 800a50a: 4602 mov r2, r0
  23850. 800a50c: 697b ldr r3, [r7, #20]
  23851. 800a50e: 1ad3 subs r3, r2, r3
  23852. 800a510: f241 3288 movw r2, #5000 @ 0x1388
  23853. 800a514: 4293 cmp r3, r2
  23854. 800a516: d901 bls.n 800a51c <HAL_RCC_ClockConfig+0x1d0>
  23855. {
  23856. return HAL_TIMEOUT;
  23857. 800a518: 2303 movs r3, #3
  23858. 800a51a: e0be b.n 800a69a <HAL_RCC_ClockConfig+0x34e>
  23859. while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos))
  23860. 800a51c: 4b1c ldr r3, [pc, #112] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23861. 800a51e: 691b ldr r3, [r3, #16]
  23862. 800a520: f003 0238 and.w r2, r3, #56 @ 0x38
  23863. 800a524: 687b ldr r3, [r7, #4]
  23864. 800a526: 685b ldr r3, [r3, #4]
  23865. 800a528: 00db lsls r3, r3, #3
  23866. 800a52a: 429a cmp r2, r3
  23867. 800a52c: d1eb bne.n 800a506 <HAL_RCC_ClockConfig+0x1ba>
  23868. }
  23869. /* Decreasing the BUS frequency divider */
  23870. /*-------------------------- HCLK Configuration --------------------------*/
  23871. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK)
  23872. 800a52e: 687b ldr r3, [r7, #4]
  23873. 800a530: 681b ldr r3, [r3, #0]
  23874. 800a532: f003 0302 and.w r3, r3, #2
  23875. 800a536: 2b00 cmp r3, #0
  23876. 800a538: d010 beq.n 800a55c <HAL_RCC_ClockConfig+0x210>
  23877. {
  23878. #if defined(RCC_D1CFGR_HPRE)
  23879. if ((RCC_ClkInitStruct->AHBCLKDivider) < (RCC->D1CFGR & RCC_D1CFGR_HPRE))
  23880. 800a53a: 687b ldr r3, [r7, #4]
  23881. 800a53c: 68da ldr r2, [r3, #12]
  23882. 800a53e: 4b14 ldr r3, [pc, #80] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23883. 800a540: 699b ldr r3, [r3, #24]
  23884. 800a542: f003 030f and.w r3, r3, #15
  23885. 800a546: 429a cmp r2, r3
  23886. 800a548: d208 bcs.n 800a55c <HAL_RCC_ClockConfig+0x210>
  23887. {
  23888. /* Set the new HCLK clock divider */
  23889. assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider));
  23890. MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider);
  23891. 800a54a: 4b11 ldr r3, [pc, #68] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23892. 800a54c: 699b ldr r3, [r3, #24]
  23893. 800a54e: f023 020f bic.w r2, r3, #15
  23894. 800a552: 687b ldr r3, [r7, #4]
  23895. 800a554: 68db ldr r3, [r3, #12]
  23896. 800a556: 490e ldr r1, [pc, #56] @ (800a590 <HAL_RCC_ClockConfig+0x244>)
  23897. 800a558: 4313 orrs r3, r2
  23898. 800a55a: 618b str r3, [r1, #24]
  23899. }
  23900. #endif
  23901. }
  23902. /* Decreasing the number of wait states because of lower CPU frequency */
  23903. if (FLatency < __HAL_FLASH_GET_LATENCY())
  23904. 800a55c: 4b0b ldr r3, [pc, #44] @ (800a58c <HAL_RCC_ClockConfig+0x240>)
  23905. 800a55e: 681b ldr r3, [r3, #0]
  23906. 800a560: f003 030f and.w r3, r3, #15
  23907. 800a564: 683a ldr r2, [r7, #0]
  23908. 800a566: 429a cmp r2, r3
  23909. 800a568: d214 bcs.n 800a594 <HAL_RCC_ClockConfig+0x248>
  23910. {
  23911. /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
  23912. __HAL_FLASH_SET_LATENCY(FLatency);
  23913. 800a56a: 4b08 ldr r3, [pc, #32] @ (800a58c <HAL_RCC_ClockConfig+0x240>)
  23914. 800a56c: 681b ldr r3, [r3, #0]
  23915. 800a56e: f023 020f bic.w r2, r3, #15
  23916. 800a572: 4906 ldr r1, [pc, #24] @ (800a58c <HAL_RCC_ClockConfig+0x240>)
  23917. 800a574: 683b ldr r3, [r7, #0]
  23918. 800a576: 4313 orrs r3, r2
  23919. 800a578: 600b str r3, [r1, #0]
  23920. /* Check that the new number of wait states is taken into account to access the Flash
  23921. memory by reading the FLASH_ACR register */
  23922. if (__HAL_FLASH_GET_LATENCY() != FLatency)
  23923. 800a57a: 4b04 ldr r3, [pc, #16] @ (800a58c <HAL_RCC_ClockConfig+0x240>)
  23924. 800a57c: 681b ldr r3, [r3, #0]
  23925. 800a57e: f003 030f and.w r3, r3, #15
  23926. 800a582: 683a ldr r2, [r7, #0]
  23927. 800a584: 429a cmp r2, r3
  23928. 800a586: d005 beq.n 800a594 <HAL_RCC_ClockConfig+0x248>
  23929. {
  23930. return HAL_ERROR;
  23931. 800a588: 2301 movs r3, #1
  23932. 800a58a: e086 b.n 800a69a <HAL_RCC_ClockConfig+0x34e>
  23933. 800a58c: 52002000 .word 0x52002000
  23934. 800a590: 58024400 .word 0x58024400
  23935. }
  23936. }
  23937. /*-------------------------- D1PCLK1/CDPCLK Configuration ---------------------------*/
  23938. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_D1PCLK1) == RCC_CLOCKTYPE_D1PCLK1)
  23939. 800a594: 687b ldr r3, [r7, #4]
  23940. 800a596: 681b ldr r3, [r3, #0]
  23941. 800a598: f003 0304 and.w r3, r3, #4
  23942. 800a59c: 2b00 cmp r3, #0
  23943. 800a59e: d010 beq.n 800a5c2 <HAL_RCC_ClockConfig+0x276>
  23944. {
  23945. #if defined(RCC_D1CFGR_D1PPRE)
  23946. if ((RCC_ClkInitStruct->APB3CLKDivider) < (RCC->D1CFGR & RCC_D1CFGR_D1PPRE))
  23947. 800a5a0: 687b ldr r3, [r7, #4]
  23948. 800a5a2: 691a ldr r2, [r3, #16]
  23949. 800a5a4: 4b3f ldr r3, [pc, #252] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  23950. 800a5a6: 699b ldr r3, [r3, #24]
  23951. 800a5a8: f003 0370 and.w r3, r3, #112 @ 0x70
  23952. 800a5ac: 429a cmp r2, r3
  23953. 800a5ae: d208 bcs.n 800a5c2 <HAL_RCC_ClockConfig+0x276>
  23954. {
  23955. assert_param(IS_RCC_D1PCLK1(RCC_ClkInitStruct->APB3CLKDivider));
  23956. MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1PPRE, RCC_ClkInitStruct->APB3CLKDivider);
  23957. 800a5b0: 4b3c ldr r3, [pc, #240] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  23958. 800a5b2: 699b ldr r3, [r3, #24]
  23959. 800a5b4: f023 0270 bic.w r2, r3, #112 @ 0x70
  23960. 800a5b8: 687b ldr r3, [r7, #4]
  23961. 800a5ba: 691b ldr r3, [r3, #16]
  23962. 800a5bc: 4939 ldr r1, [pc, #228] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  23963. 800a5be: 4313 orrs r3, r2
  23964. 800a5c0: 618b str r3, [r1, #24]
  23965. }
  23966. #endif
  23967. }
  23968. /*-------------------------- PCLK1 Configuration ---------------------------*/
  23969. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1)
  23970. 800a5c2: 687b ldr r3, [r7, #4]
  23971. 800a5c4: 681b ldr r3, [r3, #0]
  23972. 800a5c6: f003 0308 and.w r3, r3, #8
  23973. 800a5ca: 2b00 cmp r3, #0
  23974. 800a5cc: d010 beq.n 800a5f0 <HAL_RCC_ClockConfig+0x2a4>
  23975. {
  23976. #if defined(RCC_D2CFGR_D2PPRE1)
  23977. if ((RCC_ClkInitStruct->APB1CLKDivider) < (RCC->D2CFGR & RCC_D2CFGR_D2PPRE1))
  23978. 800a5ce: 687b ldr r3, [r7, #4]
  23979. 800a5d0: 695a ldr r2, [r3, #20]
  23980. 800a5d2: 4b34 ldr r3, [pc, #208] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  23981. 800a5d4: 69db ldr r3, [r3, #28]
  23982. 800a5d6: f003 0370 and.w r3, r3, #112 @ 0x70
  23983. 800a5da: 429a cmp r2, r3
  23984. 800a5dc: d208 bcs.n 800a5f0 <HAL_RCC_ClockConfig+0x2a4>
  23985. {
  23986. assert_param(IS_RCC_PCLK1(RCC_ClkInitStruct->APB1CLKDivider));
  23987. MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE1, (RCC_ClkInitStruct->APB1CLKDivider));
  23988. 800a5de: 4b31 ldr r3, [pc, #196] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  23989. 800a5e0: 69db ldr r3, [r3, #28]
  23990. 800a5e2: f023 0270 bic.w r2, r3, #112 @ 0x70
  23991. 800a5e6: 687b ldr r3, [r7, #4]
  23992. 800a5e8: 695b ldr r3, [r3, #20]
  23993. 800a5ea: 492e ldr r1, [pc, #184] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  23994. 800a5ec: 4313 orrs r3, r2
  23995. 800a5ee: 61cb str r3, [r1, #28]
  23996. }
  23997. #endif
  23998. }
  23999. /*-------------------------- PCLK2 Configuration ---------------------------*/
  24000. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2)
  24001. 800a5f0: 687b ldr r3, [r7, #4]
  24002. 800a5f2: 681b ldr r3, [r3, #0]
  24003. 800a5f4: f003 0310 and.w r3, r3, #16
  24004. 800a5f8: 2b00 cmp r3, #0
  24005. 800a5fa: d010 beq.n 800a61e <HAL_RCC_ClockConfig+0x2d2>
  24006. {
  24007. #if defined (RCC_D2CFGR_D2PPRE2)
  24008. if ((RCC_ClkInitStruct->APB2CLKDivider) < (RCC->D2CFGR & RCC_D2CFGR_D2PPRE2))
  24009. 800a5fc: 687b ldr r3, [r7, #4]
  24010. 800a5fe: 699a ldr r2, [r3, #24]
  24011. 800a600: 4b28 ldr r3, [pc, #160] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  24012. 800a602: 69db ldr r3, [r3, #28]
  24013. 800a604: f403 63e0 and.w r3, r3, #1792 @ 0x700
  24014. 800a608: 429a cmp r2, r3
  24015. 800a60a: d208 bcs.n 800a61e <HAL_RCC_ClockConfig+0x2d2>
  24016. {
  24017. assert_param(IS_RCC_PCLK2(RCC_ClkInitStruct->APB2CLKDivider));
  24018. MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE2, (RCC_ClkInitStruct->APB2CLKDivider));
  24019. 800a60c: 4b25 ldr r3, [pc, #148] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  24020. 800a60e: 69db ldr r3, [r3, #28]
  24021. 800a610: f423 62e0 bic.w r2, r3, #1792 @ 0x700
  24022. 800a614: 687b ldr r3, [r7, #4]
  24023. 800a616: 699b ldr r3, [r3, #24]
  24024. 800a618: 4922 ldr r1, [pc, #136] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  24025. 800a61a: 4313 orrs r3, r2
  24026. 800a61c: 61cb str r3, [r1, #28]
  24027. }
  24028. #endif
  24029. }
  24030. /*-------------------------- D3PCLK1/SRDPCLK1 Configuration ---------------------------*/
  24031. if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_D3PCLK1) == RCC_CLOCKTYPE_D3PCLK1)
  24032. 800a61e: 687b ldr r3, [r7, #4]
  24033. 800a620: 681b ldr r3, [r3, #0]
  24034. 800a622: f003 0320 and.w r3, r3, #32
  24035. 800a626: 2b00 cmp r3, #0
  24036. 800a628: d010 beq.n 800a64c <HAL_RCC_ClockConfig+0x300>
  24037. {
  24038. #if defined(RCC_D3CFGR_D3PPRE)
  24039. if ((RCC_ClkInitStruct->APB4CLKDivider) < (RCC->D3CFGR & RCC_D3CFGR_D3PPRE))
  24040. 800a62a: 687b ldr r3, [r7, #4]
  24041. 800a62c: 69da ldr r2, [r3, #28]
  24042. 800a62e: 4b1d ldr r3, [pc, #116] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  24043. 800a630: 6a1b ldr r3, [r3, #32]
  24044. 800a632: f003 0370 and.w r3, r3, #112 @ 0x70
  24045. 800a636: 429a cmp r2, r3
  24046. 800a638: d208 bcs.n 800a64c <HAL_RCC_ClockConfig+0x300>
  24047. {
  24048. assert_param(IS_RCC_D3PCLK1(RCC_ClkInitStruct->APB4CLKDivider));
  24049. MODIFY_REG(RCC->D3CFGR, RCC_D3CFGR_D3PPRE, (RCC_ClkInitStruct->APB4CLKDivider));
  24050. 800a63a: 4b1a ldr r3, [pc, #104] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  24051. 800a63c: 6a1b ldr r3, [r3, #32]
  24052. 800a63e: f023 0270 bic.w r2, r3, #112 @ 0x70
  24053. 800a642: 687b ldr r3, [r7, #4]
  24054. 800a644: 69db ldr r3, [r3, #28]
  24055. 800a646: 4917 ldr r1, [pc, #92] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  24056. 800a648: 4313 orrs r3, r2
  24057. 800a64a: 620b str r3, [r1, #32]
  24058. #endif
  24059. }
  24060. /* Update the SystemCoreClock global variable */
  24061. #if defined(RCC_D1CFGR_D1CPRE)
  24062. common_system_clock = HAL_RCC_GetSysClockFreq() >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_D1CPRE) >> RCC_D1CFGR_D1CPRE_Pos]) & 0x1FU);
  24063. 800a64c: f000 f834 bl 800a6b8 <HAL_RCC_GetSysClockFreq>
  24064. 800a650: 4602 mov r2, r0
  24065. 800a652: 4b14 ldr r3, [pc, #80] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  24066. 800a654: 699b ldr r3, [r3, #24]
  24067. 800a656: 0a1b lsrs r3, r3, #8
  24068. 800a658: f003 030f and.w r3, r3, #15
  24069. 800a65c: 4912 ldr r1, [pc, #72] @ (800a6a8 <HAL_RCC_ClockConfig+0x35c>)
  24070. 800a65e: 5ccb ldrb r3, [r1, r3]
  24071. 800a660: f003 031f and.w r3, r3, #31
  24072. 800a664: fa22 f303 lsr.w r3, r2, r3
  24073. 800a668: 613b str r3, [r7, #16]
  24074. #else
  24075. common_system_clock = HAL_RCC_GetSysClockFreq() >> ((D1CorePrescTable[(RCC->CDCFGR1 & RCC_CDCFGR1_CDCPRE) >> RCC_CDCFGR1_CDCPRE_Pos]) & 0x1FU);
  24076. #endif
  24077. #if defined(RCC_D1CFGR_HPRE)
  24078. SystemD2Clock = (common_system_clock >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_HPRE) >> RCC_D1CFGR_HPRE_Pos]) & 0x1FU));
  24079. 800a66a: 4b0e ldr r3, [pc, #56] @ (800a6a4 <HAL_RCC_ClockConfig+0x358>)
  24080. 800a66c: 699b ldr r3, [r3, #24]
  24081. 800a66e: f003 030f and.w r3, r3, #15
  24082. 800a672: 4a0d ldr r2, [pc, #52] @ (800a6a8 <HAL_RCC_ClockConfig+0x35c>)
  24083. 800a674: 5cd3 ldrb r3, [r2, r3]
  24084. 800a676: f003 031f and.w r3, r3, #31
  24085. 800a67a: 693a ldr r2, [r7, #16]
  24086. 800a67c: fa22 f303 lsr.w r3, r2, r3
  24087. 800a680: 4a0a ldr r2, [pc, #40] @ (800a6ac <HAL_RCC_ClockConfig+0x360>)
  24088. 800a682: 6013 str r3, [r2, #0]
  24089. #endif
  24090. #if defined(DUAL_CORE) && defined(CORE_CM4)
  24091. SystemCoreClock = SystemD2Clock;
  24092. #else
  24093. SystemCoreClock = common_system_clock;
  24094. 800a684: 4a0a ldr r2, [pc, #40] @ (800a6b0 <HAL_RCC_ClockConfig+0x364>)
  24095. 800a686: 693b ldr r3, [r7, #16]
  24096. 800a688: 6013 str r3, [r2, #0]
  24097. #endif /* DUAL_CORE && CORE_CM4 */
  24098. /* Configure the source of time base considering new system clocks settings*/
  24099. halstatus = HAL_InitTick(uwTickPrio);
  24100. 800a68a: 4b0a ldr r3, [pc, #40] @ (800a6b4 <HAL_RCC_ClockConfig+0x368>)
  24101. 800a68c: 681b ldr r3, [r3, #0]
  24102. 800a68e: 4618 mov r0, r3
  24103. 800a690: f7f9 f922 bl 80038d8 <HAL_InitTick>
  24104. 800a694: 4603 mov r3, r0
  24105. 800a696: 73fb strb r3, [r7, #15]
  24106. return halstatus;
  24107. 800a698: 7bfb ldrb r3, [r7, #15]
  24108. }
  24109. 800a69a: 4618 mov r0, r3
  24110. 800a69c: 3718 adds r7, #24
  24111. 800a69e: 46bd mov sp, r7
  24112. 800a6a0: bd80 pop {r7, pc}
  24113. 800a6a2: bf00 nop
  24114. 800a6a4: 58024400 .word 0x58024400
  24115. 800a6a8: 08030a24 .word 0x08030a24
  24116. 800a6ac: 24000010 .word 0x24000010
  24117. 800a6b0: 2400000c .word 0x2400000c
  24118. 800a6b4: 2400002c .word 0x2400002c
  24119. 0800a6b8 <HAL_RCC_GetSysClockFreq>:
  24120. *
  24121. *
  24122. * @retval SYSCLK frequency
  24123. */
  24124. uint32_t HAL_RCC_GetSysClockFreq(void)
  24125. {
  24126. 800a6b8: b480 push {r7}
  24127. 800a6ba: b089 sub sp, #36 @ 0x24
  24128. 800a6bc: af00 add r7, sp, #0
  24129. float_t fracn1, pllvco;
  24130. uint32_t sysclockfreq;
  24131. /* Get SYSCLK source -------------------------------------------------------*/
  24132. switch (RCC->CFGR & RCC_CFGR_SWS)
  24133. 800a6be: 4bb3 ldr r3, [pc, #716] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24134. 800a6c0: 691b ldr r3, [r3, #16]
  24135. 800a6c2: f003 0338 and.w r3, r3, #56 @ 0x38
  24136. 800a6c6: 2b18 cmp r3, #24
  24137. 800a6c8: f200 8155 bhi.w 800a976 <HAL_RCC_GetSysClockFreq+0x2be>
  24138. 800a6cc: a201 add r2, pc, #4 @ (adr r2, 800a6d4 <HAL_RCC_GetSysClockFreq+0x1c>)
  24139. 800a6ce: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  24140. 800a6d2: bf00 nop
  24141. 800a6d4: 0800a739 .word 0x0800a739
  24142. 800a6d8: 0800a977 .word 0x0800a977
  24143. 800a6dc: 0800a977 .word 0x0800a977
  24144. 800a6e0: 0800a977 .word 0x0800a977
  24145. 800a6e4: 0800a977 .word 0x0800a977
  24146. 800a6e8: 0800a977 .word 0x0800a977
  24147. 800a6ec: 0800a977 .word 0x0800a977
  24148. 800a6f0: 0800a977 .word 0x0800a977
  24149. 800a6f4: 0800a75f .word 0x0800a75f
  24150. 800a6f8: 0800a977 .word 0x0800a977
  24151. 800a6fc: 0800a977 .word 0x0800a977
  24152. 800a700: 0800a977 .word 0x0800a977
  24153. 800a704: 0800a977 .word 0x0800a977
  24154. 800a708: 0800a977 .word 0x0800a977
  24155. 800a70c: 0800a977 .word 0x0800a977
  24156. 800a710: 0800a977 .word 0x0800a977
  24157. 800a714: 0800a765 .word 0x0800a765
  24158. 800a718: 0800a977 .word 0x0800a977
  24159. 800a71c: 0800a977 .word 0x0800a977
  24160. 800a720: 0800a977 .word 0x0800a977
  24161. 800a724: 0800a977 .word 0x0800a977
  24162. 800a728: 0800a977 .word 0x0800a977
  24163. 800a72c: 0800a977 .word 0x0800a977
  24164. 800a730: 0800a977 .word 0x0800a977
  24165. 800a734: 0800a76b .word 0x0800a76b
  24166. {
  24167. case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */
  24168. if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
  24169. 800a738: 4b94 ldr r3, [pc, #592] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24170. 800a73a: 681b ldr r3, [r3, #0]
  24171. 800a73c: f003 0320 and.w r3, r3, #32
  24172. 800a740: 2b00 cmp r3, #0
  24173. 800a742: d009 beq.n 800a758 <HAL_RCC_GetSysClockFreq+0xa0>
  24174. {
  24175. sysclockfreq = (uint32_t)(HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3));
  24176. 800a744: 4b91 ldr r3, [pc, #580] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24177. 800a746: 681b ldr r3, [r3, #0]
  24178. 800a748: 08db lsrs r3, r3, #3
  24179. 800a74a: f003 0303 and.w r3, r3, #3
  24180. 800a74e: 4a90 ldr r2, [pc, #576] @ (800a990 <HAL_RCC_GetSysClockFreq+0x2d8>)
  24181. 800a750: fa22 f303 lsr.w r3, r2, r3
  24182. 800a754: 61bb str r3, [r7, #24]
  24183. else
  24184. {
  24185. sysclockfreq = (uint32_t) HSI_VALUE;
  24186. }
  24187. break;
  24188. 800a756: e111 b.n 800a97c <HAL_RCC_GetSysClockFreq+0x2c4>
  24189. sysclockfreq = (uint32_t) HSI_VALUE;
  24190. 800a758: 4b8d ldr r3, [pc, #564] @ (800a990 <HAL_RCC_GetSysClockFreq+0x2d8>)
  24191. 800a75a: 61bb str r3, [r7, #24]
  24192. break;
  24193. 800a75c: e10e b.n 800a97c <HAL_RCC_GetSysClockFreq+0x2c4>
  24194. case RCC_CFGR_SWS_CSI: /* CSI used as system clock source */
  24195. sysclockfreq = CSI_VALUE;
  24196. 800a75e: 4b8d ldr r3, [pc, #564] @ (800a994 <HAL_RCC_GetSysClockFreq+0x2dc>)
  24197. 800a760: 61bb str r3, [r7, #24]
  24198. break;
  24199. 800a762: e10b b.n 800a97c <HAL_RCC_GetSysClockFreq+0x2c4>
  24200. case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */
  24201. sysclockfreq = HSE_VALUE;
  24202. 800a764: 4b8c ldr r3, [pc, #560] @ (800a998 <HAL_RCC_GetSysClockFreq+0x2e0>)
  24203. 800a766: 61bb str r3, [r7, #24]
  24204. break;
  24205. 800a768: e108 b.n 800a97c <HAL_RCC_GetSysClockFreq+0x2c4>
  24206. case RCC_CFGR_SWS_PLL1: /* PLL1 used as system clock source */
  24207. /* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLLM) * PLLN
  24208. SYSCLK = PLL_VCO / PLLR
  24209. */
  24210. pllsource = (RCC->PLLCKSELR & RCC_PLLCKSELR_PLLSRC);
  24211. 800a76a: 4b88 ldr r3, [pc, #544] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24212. 800a76c: 6a9b ldr r3, [r3, #40] @ 0x28
  24213. 800a76e: f003 0303 and.w r3, r3, #3
  24214. 800a772: 617b str r3, [r7, #20]
  24215. pllm = ((RCC->PLLCKSELR & RCC_PLLCKSELR_DIVM1) >> 4) ;
  24216. 800a774: 4b85 ldr r3, [pc, #532] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24217. 800a776: 6a9b ldr r3, [r3, #40] @ 0x28
  24218. 800a778: 091b lsrs r3, r3, #4
  24219. 800a77a: f003 033f and.w r3, r3, #63 @ 0x3f
  24220. 800a77e: 613b str r3, [r7, #16]
  24221. pllfracen = ((RCC-> PLLCFGR & RCC_PLLCFGR_PLL1FRACEN) >> RCC_PLLCFGR_PLL1FRACEN_Pos);
  24222. 800a780: 4b82 ldr r3, [pc, #520] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24223. 800a782: 6adb ldr r3, [r3, #44] @ 0x2c
  24224. 800a784: f003 0301 and.w r3, r3, #1
  24225. 800a788: 60fb str r3, [r7, #12]
  24226. fracn1 = (float_t)(uint32_t)(pllfracen * ((RCC->PLL1FRACR & RCC_PLL1FRACR_FRACN1) >> 3));
  24227. 800a78a: 4b80 ldr r3, [pc, #512] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24228. 800a78c: 6b5b ldr r3, [r3, #52] @ 0x34
  24229. 800a78e: 08db lsrs r3, r3, #3
  24230. 800a790: f3c3 030c ubfx r3, r3, #0, #13
  24231. 800a794: 68fa ldr r2, [r7, #12]
  24232. 800a796: fb02 f303 mul.w r3, r2, r3
  24233. 800a79a: ee07 3a90 vmov s15, r3
  24234. 800a79e: eef8 7a67 vcvt.f32.u32 s15, s15
  24235. 800a7a2: edc7 7a02 vstr s15, [r7, #8]
  24236. if (pllm != 0U)
  24237. 800a7a6: 693b ldr r3, [r7, #16]
  24238. 800a7a8: 2b00 cmp r3, #0
  24239. 800a7aa: f000 80e1 beq.w 800a970 <HAL_RCC_GetSysClockFreq+0x2b8>
  24240. 800a7ae: 697b ldr r3, [r7, #20]
  24241. 800a7b0: 2b02 cmp r3, #2
  24242. 800a7b2: f000 8083 beq.w 800a8bc <HAL_RCC_GetSysClockFreq+0x204>
  24243. 800a7b6: 697b ldr r3, [r7, #20]
  24244. 800a7b8: 2b02 cmp r3, #2
  24245. 800a7ba: f200 80a1 bhi.w 800a900 <HAL_RCC_GetSysClockFreq+0x248>
  24246. 800a7be: 697b ldr r3, [r7, #20]
  24247. 800a7c0: 2b00 cmp r3, #0
  24248. 800a7c2: d003 beq.n 800a7cc <HAL_RCC_GetSysClockFreq+0x114>
  24249. 800a7c4: 697b ldr r3, [r7, #20]
  24250. 800a7c6: 2b01 cmp r3, #1
  24251. 800a7c8: d056 beq.n 800a878 <HAL_RCC_GetSysClockFreq+0x1c0>
  24252. 800a7ca: e099 b.n 800a900 <HAL_RCC_GetSysClockFreq+0x248>
  24253. {
  24254. switch (pllsource)
  24255. {
  24256. case RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  24257. if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
  24258. 800a7cc: 4b6f ldr r3, [pc, #444] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24259. 800a7ce: 681b ldr r3, [r3, #0]
  24260. 800a7d0: f003 0320 and.w r3, r3, #32
  24261. 800a7d4: 2b00 cmp r3, #0
  24262. 800a7d6: d02d beq.n 800a834 <HAL_RCC_GetSysClockFreq+0x17c>
  24263. {
  24264. hsivalue = (HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3));
  24265. 800a7d8: 4b6c ldr r3, [pc, #432] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24266. 800a7da: 681b ldr r3, [r3, #0]
  24267. 800a7dc: 08db lsrs r3, r3, #3
  24268. 800a7de: f003 0303 and.w r3, r3, #3
  24269. 800a7e2: 4a6b ldr r2, [pc, #428] @ (800a990 <HAL_RCC_GetSysClockFreq+0x2d8>)
  24270. 800a7e4: fa22 f303 lsr.w r3, r2, r3
  24271. 800a7e8: 607b str r3, [r7, #4]
  24272. pllvco = ((float_t)hsivalue / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
  24273. 800a7ea: 687b ldr r3, [r7, #4]
  24274. 800a7ec: ee07 3a90 vmov s15, r3
  24275. 800a7f0: eef8 6a67 vcvt.f32.u32 s13, s15
  24276. 800a7f4: 693b ldr r3, [r7, #16]
  24277. 800a7f6: ee07 3a90 vmov s15, r3
  24278. 800a7fa: eef8 7a67 vcvt.f32.u32 s15, s15
  24279. 800a7fe: ee86 7aa7 vdiv.f32 s14, s13, s15
  24280. 800a802: 4b62 ldr r3, [pc, #392] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24281. 800a804: 6b1b ldr r3, [r3, #48] @ 0x30
  24282. 800a806: f3c3 0308 ubfx r3, r3, #0, #9
  24283. 800a80a: ee07 3a90 vmov s15, r3
  24284. 800a80e: eef8 6a67 vcvt.f32.u32 s13, s15
  24285. 800a812: ed97 6a02 vldr s12, [r7, #8]
  24286. 800a816: eddf 5a61 vldr s11, [pc, #388] @ 800a99c <HAL_RCC_GetSysClockFreq+0x2e4>
  24287. 800a81a: eec6 7a25 vdiv.f32 s15, s12, s11
  24288. 800a81e: ee76 7aa7 vadd.f32 s15, s13, s15
  24289. 800a822: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  24290. 800a826: ee77 7aa6 vadd.f32 s15, s15, s13
  24291. 800a82a: ee67 7a27 vmul.f32 s15, s14, s15
  24292. 800a82e: edc7 7a07 vstr s15, [r7, #28]
  24293. }
  24294. else
  24295. {
  24296. pllvco = ((float_t)HSI_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
  24297. }
  24298. break;
  24299. 800a832: e087 b.n 800a944 <HAL_RCC_GetSysClockFreq+0x28c>
  24300. pllvco = ((float_t)HSI_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
  24301. 800a834: 693b ldr r3, [r7, #16]
  24302. 800a836: ee07 3a90 vmov s15, r3
  24303. 800a83a: eef8 7a67 vcvt.f32.u32 s15, s15
  24304. 800a83e: eddf 6a58 vldr s13, [pc, #352] @ 800a9a0 <HAL_RCC_GetSysClockFreq+0x2e8>
  24305. 800a842: ee86 7aa7 vdiv.f32 s14, s13, s15
  24306. 800a846: 4b51 ldr r3, [pc, #324] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24307. 800a848: 6b1b ldr r3, [r3, #48] @ 0x30
  24308. 800a84a: f3c3 0308 ubfx r3, r3, #0, #9
  24309. 800a84e: ee07 3a90 vmov s15, r3
  24310. 800a852: eef8 6a67 vcvt.f32.u32 s13, s15
  24311. 800a856: ed97 6a02 vldr s12, [r7, #8]
  24312. 800a85a: eddf 5a50 vldr s11, [pc, #320] @ 800a99c <HAL_RCC_GetSysClockFreq+0x2e4>
  24313. 800a85e: eec6 7a25 vdiv.f32 s15, s12, s11
  24314. 800a862: ee76 7aa7 vadd.f32 s15, s13, s15
  24315. 800a866: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  24316. 800a86a: ee77 7aa6 vadd.f32 s15, s15, s13
  24317. 800a86e: ee67 7a27 vmul.f32 s15, s14, s15
  24318. 800a872: edc7 7a07 vstr s15, [r7, #28]
  24319. break;
  24320. 800a876: e065 b.n 800a944 <HAL_RCC_GetSysClockFreq+0x28c>
  24321. case RCC_PLLSOURCE_CSI: /* CSI used as PLL clock source */
  24322. pllvco = ((float_t)CSI_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
  24323. 800a878: 693b ldr r3, [r7, #16]
  24324. 800a87a: ee07 3a90 vmov s15, r3
  24325. 800a87e: eef8 7a67 vcvt.f32.u32 s15, s15
  24326. 800a882: eddf 6a48 vldr s13, [pc, #288] @ 800a9a4 <HAL_RCC_GetSysClockFreq+0x2ec>
  24327. 800a886: ee86 7aa7 vdiv.f32 s14, s13, s15
  24328. 800a88a: 4b40 ldr r3, [pc, #256] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24329. 800a88c: 6b1b ldr r3, [r3, #48] @ 0x30
  24330. 800a88e: f3c3 0308 ubfx r3, r3, #0, #9
  24331. 800a892: ee07 3a90 vmov s15, r3
  24332. 800a896: eef8 6a67 vcvt.f32.u32 s13, s15
  24333. 800a89a: ed97 6a02 vldr s12, [r7, #8]
  24334. 800a89e: eddf 5a3f vldr s11, [pc, #252] @ 800a99c <HAL_RCC_GetSysClockFreq+0x2e4>
  24335. 800a8a2: eec6 7a25 vdiv.f32 s15, s12, s11
  24336. 800a8a6: ee76 7aa7 vadd.f32 s15, s13, s15
  24337. 800a8aa: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  24338. 800a8ae: ee77 7aa6 vadd.f32 s15, s15, s13
  24339. 800a8b2: ee67 7a27 vmul.f32 s15, s14, s15
  24340. 800a8b6: edc7 7a07 vstr s15, [r7, #28]
  24341. break;
  24342. 800a8ba: e043 b.n 800a944 <HAL_RCC_GetSysClockFreq+0x28c>
  24343. case RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  24344. pllvco = ((float_t)HSE_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
  24345. 800a8bc: 693b ldr r3, [r7, #16]
  24346. 800a8be: ee07 3a90 vmov s15, r3
  24347. 800a8c2: eef8 7a67 vcvt.f32.u32 s15, s15
  24348. 800a8c6: eddf 6a38 vldr s13, [pc, #224] @ 800a9a8 <HAL_RCC_GetSysClockFreq+0x2f0>
  24349. 800a8ca: ee86 7aa7 vdiv.f32 s14, s13, s15
  24350. 800a8ce: 4b2f ldr r3, [pc, #188] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24351. 800a8d0: 6b1b ldr r3, [r3, #48] @ 0x30
  24352. 800a8d2: f3c3 0308 ubfx r3, r3, #0, #9
  24353. 800a8d6: ee07 3a90 vmov s15, r3
  24354. 800a8da: eef8 6a67 vcvt.f32.u32 s13, s15
  24355. 800a8de: ed97 6a02 vldr s12, [r7, #8]
  24356. 800a8e2: eddf 5a2e vldr s11, [pc, #184] @ 800a99c <HAL_RCC_GetSysClockFreq+0x2e4>
  24357. 800a8e6: eec6 7a25 vdiv.f32 s15, s12, s11
  24358. 800a8ea: ee76 7aa7 vadd.f32 s15, s13, s15
  24359. 800a8ee: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  24360. 800a8f2: ee77 7aa6 vadd.f32 s15, s15, s13
  24361. 800a8f6: ee67 7a27 vmul.f32 s15, s14, s15
  24362. 800a8fa: edc7 7a07 vstr s15, [r7, #28]
  24363. break;
  24364. 800a8fe: e021 b.n 800a944 <HAL_RCC_GetSysClockFreq+0x28c>
  24365. default:
  24366. pllvco = ((float_t)CSI_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1 / (float_t)0x2000) + (float_t)1);
  24367. 800a900: 693b ldr r3, [r7, #16]
  24368. 800a902: ee07 3a90 vmov s15, r3
  24369. 800a906: eef8 7a67 vcvt.f32.u32 s15, s15
  24370. 800a90a: eddf 6a26 vldr s13, [pc, #152] @ 800a9a4 <HAL_RCC_GetSysClockFreq+0x2ec>
  24371. 800a90e: ee86 7aa7 vdiv.f32 s14, s13, s15
  24372. 800a912: 4b1e ldr r3, [pc, #120] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24373. 800a914: 6b1b ldr r3, [r3, #48] @ 0x30
  24374. 800a916: f3c3 0308 ubfx r3, r3, #0, #9
  24375. 800a91a: ee07 3a90 vmov s15, r3
  24376. 800a91e: eef8 6a67 vcvt.f32.u32 s13, s15
  24377. 800a922: ed97 6a02 vldr s12, [r7, #8]
  24378. 800a926: eddf 5a1d vldr s11, [pc, #116] @ 800a99c <HAL_RCC_GetSysClockFreq+0x2e4>
  24379. 800a92a: eec6 7a25 vdiv.f32 s15, s12, s11
  24380. 800a92e: ee76 7aa7 vadd.f32 s15, s13, s15
  24381. 800a932: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  24382. 800a936: ee77 7aa6 vadd.f32 s15, s15, s13
  24383. 800a93a: ee67 7a27 vmul.f32 s15, s14, s15
  24384. 800a93e: edc7 7a07 vstr s15, [r7, #28]
  24385. break;
  24386. 800a942: bf00 nop
  24387. }
  24388. pllp = (((RCC->PLL1DIVR & RCC_PLL1DIVR_P1) >> 9) + 1U) ;
  24389. 800a944: 4b11 ldr r3, [pc, #68] @ (800a98c <HAL_RCC_GetSysClockFreq+0x2d4>)
  24390. 800a946: 6b1b ldr r3, [r3, #48] @ 0x30
  24391. 800a948: 0a5b lsrs r3, r3, #9
  24392. 800a94a: f003 037f and.w r3, r3, #127 @ 0x7f
  24393. 800a94e: 3301 adds r3, #1
  24394. 800a950: 603b str r3, [r7, #0]
  24395. sysclockfreq = (uint32_t)(float_t)(pllvco / (float_t)pllp);
  24396. 800a952: 683b ldr r3, [r7, #0]
  24397. 800a954: ee07 3a90 vmov s15, r3
  24398. 800a958: eeb8 7a67 vcvt.f32.u32 s14, s15
  24399. 800a95c: edd7 6a07 vldr s13, [r7, #28]
  24400. 800a960: eec6 7a87 vdiv.f32 s15, s13, s14
  24401. 800a964: eefc 7ae7 vcvt.u32.f32 s15, s15
  24402. 800a968: ee17 3a90 vmov r3, s15
  24403. 800a96c: 61bb str r3, [r7, #24]
  24404. }
  24405. else
  24406. {
  24407. sysclockfreq = 0U;
  24408. }
  24409. break;
  24410. 800a96e: e005 b.n 800a97c <HAL_RCC_GetSysClockFreq+0x2c4>
  24411. sysclockfreq = 0U;
  24412. 800a970: 2300 movs r3, #0
  24413. 800a972: 61bb str r3, [r7, #24]
  24414. break;
  24415. 800a974: e002 b.n 800a97c <HAL_RCC_GetSysClockFreq+0x2c4>
  24416. default:
  24417. sysclockfreq = CSI_VALUE;
  24418. 800a976: 4b07 ldr r3, [pc, #28] @ (800a994 <HAL_RCC_GetSysClockFreq+0x2dc>)
  24419. 800a978: 61bb str r3, [r7, #24]
  24420. break;
  24421. 800a97a: bf00 nop
  24422. }
  24423. return sysclockfreq;
  24424. 800a97c: 69bb ldr r3, [r7, #24]
  24425. }
  24426. 800a97e: 4618 mov r0, r3
  24427. 800a980: 3724 adds r7, #36 @ 0x24
  24428. 800a982: 46bd mov sp, r7
  24429. 800a984: f85d 7b04 ldr.w r7, [sp], #4
  24430. 800a988: 4770 bx lr
  24431. 800a98a: bf00 nop
  24432. 800a98c: 58024400 .word 0x58024400
  24433. 800a990: 03d09000 .word 0x03d09000
  24434. 800a994: 003d0900 .word 0x003d0900
  24435. 800a998: 017d7840 .word 0x017d7840
  24436. 800a99c: 46000000 .word 0x46000000
  24437. 800a9a0: 4c742400 .word 0x4c742400
  24438. 800a9a4: 4a742400 .word 0x4a742400
  24439. 800a9a8: 4bbebc20 .word 0x4bbebc20
  24440. 0800a9ac <HAL_RCC_GetHCLKFreq>:
  24441. * @note The SystemD2Clock CMSIS variable is used to store System domain2 Clock Frequency
  24442. * and updated within this function
  24443. * @retval HCLK frequency
  24444. */
  24445. uint32_t HAL_RCC_GetHCLKFreq(void)
  24446. {
  24447. 800a9ac: b580 push {r7, lr}
  24448. 800a9ae: b082 sub sp, #8
  24449. 800a9b0: af00 add r7, sp, #0
  24450. uint32_t common_system_clock;
  24451. #if defined(RCC_D1CFGR_D1CPRE)
  24452. common_system_clock = HAL_RCC_GetSysClockFreq() >> (D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_D1CPRE) >> RCC_D1CFGR_D1CPRE_Pos] & 0x1FU);
  24453. 800a9b2: f7ff fe81 bl 800a6b8 <HAL_RCC_GetSysClockFreq>
  24454. 800a9b6: 4602 mov r2, r0
  24455. 800a9b8: 4b10 ldr r3, [pc, #64] @ (800a9fc <HAL_RCC_GetHCLKFreq+0x50>)
  24456. 800a9ba: 699b ldr r3, [r3, #24]
  24457. 800a9bc: 0a1b lsrs r3, r3, #8
  24458. 800a9be: f003 030f and.w r3, r3, #15
  24459. 800a9c2: 490f ldr r1, [pc, #60] @ (800aa00 <HAL_RCC_GetHCLKFreq+0x54>)
  24460. 800a9c4: 5ccb ldrb r3, [r1, r3]
  24461. 800a9c6: f003 031f and.w r3, r3, #31
  24462. 800a9ca: fa22 f303 lsr.w r3, r2, r3
  24463. 800a9ce: 607b str r3, [r7, #4]
  24464. #else
  24465. common_system_clock = HAL_RCC_GetSysClockFreq() >> (D1CorePrescTable[(RCC->CDCFGR1 & RCC_CDCFGR1_CDCPRE) >> RCC_CDCFGR1_CDCPRE_Pos] & 0x1FU);
  24466. #endif
  24467. #if defined(RCC_D1CFGR_HPRE)
  24468. SystemD2Clock = (common_system_clock >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_HPRE) >> RCC_D1CFGR_HPRE_Pos]) & 0x1FU));
  24469. 800a9d0: 4b0a ldr r3, [pc, #40] @ (800a9fc <HAL_RCC_GetHCLKFreq+0x50>)
  24470. 800a9d2: 699b ldr r3, [r3, #24]
  24471. 800a9d4: f003 030f and.w r3, r3, #15
  24472. 800a9d8: 4a09 ldr r2, [pc, #36] @ (800aa00 <HAL_RCC_GetHCLKFreq+0x54>)
  24473. 800a9da: 5cd3 ldrb r3, [r2, r3]
  24474. 800a9dc: f003 031f and.w r3, r3, #31
  24475. 800a9e0: 687a ldr r2, [r7, #4]
  24476. 800a9e2: fa22 f303 lsr.w r3, r2, r3
  24477. 800a9e6: 4a07 ldr r2, [pc, #28] @ (800aa04 <HAL_RCC_GetHCLKFreq+0x58>)
  24478. 800a9e8: 6013 str r3, [r2, #0]
  24479. #endif
  24480. #if defined(DUAL_CORE) && defined(CORE_CM4)
  24481. SystemCoreClock = SystemD2Clock;
  24482. #else
  24483. SystemCoreClock = common_system_clock;
  24484. 800a9ea: 4a07 ldr r2, [pc, #28] @ (800aa08 <HAL_RCC_GetHCLKFreq+0x5c>)
  24485. 800a9ec: 687b ldr r3, [r7, #4]
  24486. 800a9ee: 6013 str r3, [r2, #0]
  24487. #endif /* DUAL_CORE && CORE_CM4 */
  24488. return SystemD2Clock;
  24489. 800a9f0: 4b04 ldr r3, [pc, #16] @ (800aa04 <HAL_RCC_GetHCLKFreq+0x58>)
  24490. 800a9f2: 681b ldr r3, [r3, #0]
  24491. }
  24492. 800a9f4: 4618 mov r0, r3
  24493. 800a9f6: 3708 adds r7, #8
  24494. 800a9f8: 46bd mov sp, r7
  24495. 800a9fa: bd80 pop {r7, pc}
  24496. 800a9fc: 58024400 .word 0x58024400
  24497. 800aa00: 08030a24 .word 0x08030a24
  24498. 800aa04: 24000010 .word 0x24000010
  24499. 800aa08: 2400000c .word 0x2400000c
  24500. 0800aa0c <HAL_RCC_GetPCLK1Freq>:
  24501. * @note Each time PCLK1 changes, this function must be called to update the
  24502. * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect.
  24503. * @retval PCLK1 frequency
  24504. */
  24505. uint32_t HAL_RCC_GetPCLK1Freq(void)
  24506. {
  24507. 800aa0c: b580 push {r7, lr}
  24508. 800aa0e: af00 add r7, sp, #0
  24509. #if defined (RCC_D2CFGR_D2PPRE1)
  24510. /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/
  24511. return (HAL_RCC_GetHCLKFreq() >> ((D1CorePrescTable[(RCC->D2CFGR & RCC_D2CFGR_D2PPRE1) >> RCC_D2CFGR_D2PPRE1_Pos]) & 0x1FU));
  24512. 800aa10: f7ff ffcc bl 800a9ac <HAL_RCC_GetHCLKFreq>
  24513. 800aa14: 4602 mov r2, r0
  24514. 800aa16: 4b06 ldr r3, [pc, #24] @ (800aa30 <HAL_RCC_GetPCLK1Freq+0x24>)
  24515. 800aa18: 69db ldr r3, [r3, #28]
  24516. 800aa1a: 091b lsrs r3, r3, #4
  24517. 800aa1c: f003 0307 and.w r3, r3, #7
  24518. 800aa20: 4904 ldr r1, [pc, #16] @ (800aa34 <HAL_RCC_GetPCLK1Freq+0x28>)
  24519. 800aa22: 5ccb ldrb r3, [r1, r3]
  24520. 800aa24: f003 031f and.w r3, r3, #31
  24521. 800aa28: fa22 f303 lsr.w r3, r2, r3
  24522. #else
  24523. /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/
  24524. return (HAL_RCC_GetHCLKFreq() >> ((D1CorePrescTable[(RCC->CDCFGR2 & RCC_CDCFGR2_CDPPRE1) >> RCC_CDCFGR2_CDPPRE1_Pos]) & 0x1FU));
  24525. #endif
  24526. }
  24527. 800aa2c: 4618 mov r0, r3
  24528. 800aa2e: bd80 pop {r7, pc}
  24529. 800aa30: 58024400 .word 0x58024400
  24530. 800aa34: 08030a24 .word 0x08030a24
  24531. 0800aa38 <HAL_RCC_GetPCLK2Freq>:
  24532. * @note Each time PCLK2 changes, this function must be called to update the
  24533. * right PCLK2 value. Otherwise, any configuration based on this function will be incorrect.
  24534. * @retval PCLK1 frequency
  24535. */
  24536. uint32_t HAL_RCC_GetPCLK2Freq(void)
  24537. {
  24538. 800aa38: b580 push {r7, lr}
  24539. 800aa3a: af00 add r7, sp, #0
  24540. /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/
  24541. #if defined(RCC_D2CFGR_D2PPRE2)
  24542. return (HAL_RCC_GetHCLKFreq() >> ((D1CorePrescTable[(RCC->D2CFGR & RCC_D2CFGR_D2PPRE2) >> RCC_D2CFGR_D2PPRE2_Pos]) & 0x1FU));
  24543. 800aa3c: f7ff ffb6 bl 800a9ac <HAL_RCC_GetHCLKFreq>
  24544. 800aa40: 4602 mov r2, r0
  24545. 800aa42: 4b06 ldr r3, [pc, #24] @ (800aa5c <HAL_RCC_GetPCLK2Freq+0x24>)
  24546. 800aa44: 69db ldr r3, [r3, #28]
  24547. 800aa46: 0a1b lsrs r3, r3, #8
  24548. 800aa48: f003 0307 and.w r3, r3, #7
  24549. 800aa4c: 4904 ldr r1, [pc, #16] @ (800aa60 <HAL_RCC_GetPCLK2Freq+0x28>)
  24550. 800aa4e: 5ccb ldrb r3, [r1, r3]
  24551. 800aa50: f003 031f and.w r3, r3, #31
  24552. 800aa54: fa22 f303 lsr.w r3, r2, r3
  24553. #else
  24554. return (HAL_RCC_GetHCLKFreq() >> ((D1CorePrescTable[(RCC->CDCFGR2 & RCC_CDCFGR2_CDPPRE2) >> RCC_CDCFGR2_CDPPRE2_Pos]) & 0x1FU));
  24555. #endif
  24556. }
  24557. 800aa58: 4618 mov r0, r3
  24558. 800aa5a: bd80 pop {r7, pc}
  24559. 800aa5c: 58024400 .word 0x58024400
  24560. 800aa60: 08030a24 .word 0x08030a24
  24561. 0800aa64 <HAL_RCC_GetClockConfig>:
  24562. * will be configured.
  24563. * @param pFLatency: Pointer on the Flash Latency.
  24564. * @retval None
  24565. */
  24566. void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency)
  24567. {
  24568. 800aa64: b480 push {r7}
  24569. 800aa66: b083 sub sp, #12
  24570. 800aa68: af00 add r7, sp, #0
  24571. 800aa6a: 6078 str r0, [r7, #4]
  24572. 800aa6c: 6039 str r1, [r7, #0]
  24573. /* Set all possible values for the Clock type parameter --------------------*/
  24574. RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 |
  24575. 800aa6e: 687b ldr r3, [r7, #4]
  24576. 800aa70: 223f movs r2, #63 @ 0x3f
  24577. 800aa72: 601a str r2, [r3, #0]
  24578. RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1 ;
  24579. /* Get the SYSCLK configuration --------------------------------------------*/
  24580. RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW);
  24581. 800aa74: 4b1a ldr r3, [pc, #104] @ (800aae0 <HAL_RCC_GetClockConfig+0x7c>)
  24582. 800aa76: 691b ldr r3, [r3, #16]
  24583. 800aa78: f003 0207 and.w r2, r3, #7
  24584. 800aa7c: 687b ldr r3, [r7, #4]
  24585. 800aa7e: 605a str r2, [r3, #4]
  24586. #if defined(RCC_D1CFGR_D1CPRE)
  24587. /* Get the SYSCLK configuration ----------------------------------------------*/
  24588. RCC_ClkInitStruct->SYSCLKDivider = (uint32_t)(RCC->D1CFGR & RCC_D1CFGR_D1CPRE);
  24589. 800aa80: 4b17 ldr r3, [pc, #92] @ (800aae0 <HAL_RCC_GetClockConfig+0x7c>)
  24590. 800aa82: 699b ldr r3, [r3, #24]
  24591. 800aa84: f403 6270 and.w r2, r3, #3840 @ 0xf00
  24592. 800aa88: 687b ldr r3, [r7, #4]
  24593. 800aa8a: 609a str r2, [r3, #8]
  24594. /* Get the D1HCLK configuration ----------------------------------------------*/
  24595. RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->D1CFGR & RCC_D1CFGR_HPRE);
  24596. 800aa8c: 4b14 ldr r3, [pc, #80] @ (800aae0 <HAL_RCC_GetClockConfig+0x7c>)
  24597. 800aa8e: 699b ldr r3, [r3, #24]
  24598. 800aa90: f003 020f and.w r2, r3, #15
  24599. 800aa94: 687b ldr r3, [r7, #4]
  24600. 800aa96: 60da str r2, [r3, #12]
  24601. /* Get the APB3 configuration ----------------------------------------------*/
  24602. RCC_ClkInitStruct->APB3CLKDivider = (uint32_t)(RCC->D1CFGR & RCC_D1CFGR_D1PPRE);
  24603. 800aa98: 4b11 ldr r3, [pc, #68] @ (800aae0 <HAL_RCC_GetClockConfig+0x7c>)
  24604. 800aa9a: 699b ldr r3, [r3, #24]
  24605. 800aa9c: f003 0270 and.w r2, r3, #112 @ 0x70
  24606. 800aaa0: 687b ldr r3, [r7, #4]
  24607. 800aaa2: 611a str r2, [r3, #16]
  24608. /* Get the APB1 configuration ----------------------------------------------*/
  24609. RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->D2CFGR & RCC_D2CFGR_D2PPRE1);
  24610. 800aaa4: 4b0e ldr r3, [pc, #56] @ (800aae0 <HAL_RCC_GetClockConfig+0x7c>)
  24611. 800aaa6: 69db ldr r3, [r3, #28]
  24612. 800aaa8: f003 0270 and.w r2, r3, #112 @ 0x70
  24613. 800aaac: 687b ldr r3, [r7, #4]
  24614. 800aaae: 615a str r2, [r3, #20]
  24615. /* Get the APB2 configuration ----------------------------------------------*/
  24616. RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)(RCC->D2CFGR & RCC_D2CFGR_D2PPRE2);
  24617. 800aab0: 4b0b ldr r3, [pc, #44] @ (800aae0 <HAL_RCC_GetClockConfig+0x7c>)
  24618. 800aab2: 69db ldr r3, [r3, #28]
  24619. 800aab4: f403 62e0 and.w r2, r3, #1792 @ 0x700
  24620. 800aab8: 687b ldr r3, [r7, #4]
  24621. 800aaba: 619a str r2, [r3, #24]
  24622. /* Get the APB4 configuration ----------------------------------------------*/
  24623. RCC_ClkInitStruct->APB4CLKDivider = (uint32_t)(RCC->D3CFGR & RCC_D3CFGR_D3PPRE);
  24624. 800aabc: 4b08 ldr r3, [pc, #32] @ (800aae0 <HAL_RCC_GetClockConfig+0x7c>)
  24625. 800aabe: 6a1b ldr r3, [r3, #32]
  24626. 800aac0: f003 0270 and.w r2, r3, #112 @ 0x70
  24627. 800aac4: 687b ldr r3, [r7, #4]
  24628. 800aac6: 61da str r2, [r3, #28]
  24629. /* Get the APB4 configuration ----------------------------------------------*/
  24630. RCC_ClkInitStruct->APB4CLKDivider = (uint32_t)(RCC->SRDCFGR & RCC_SRDCFGR_SRDPPRE);
  24631. #endif
  24632. /* Get the Flash Wait State (Latency) configuration ------------------------*/
  24633. *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY);
  24634. 800aac8: 4b06 ldr r3, [pc, #24] @ (800aae4 <HAL_RCC_GetClockConfig+0x80>)
  24635. 800aaca: 681b ldr r3, [r3, #0]
  24636. 800aacc: f003 020f and.w r2, r3, #15
  24637. 800aad0: 683b ldr r3, [r7, #0]
  24638. 800aad2: 601a str r2, [r3, #0]
  24639. }
  24640. 800aad4: bf00 nop
  24641. 800aad6: 370c adds r7, #12
  24642. 800aad8: 46bd mov sp, r7
  24643. 800aada: f85d 7b04 ldr.w r7, [sp], #4
  24644. 800aade: 4770 bx lr
  24645. 800aae0: 58024400 .word 0x58024400
  24646. 800aae4: 52002000 .word 0x52002000
  24647. 0800aae8 <HAL_RCCEx_PeriphCLKConfig>:
  24648. * (*) : Available on some STM32H7 lines only.
  24649. *
  24650. * @retval HAL status
  24651. */
  24652. HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit)
  24653. {
  24654. 800aae8: e92d 4fb0 stmdb sp!, {r4, r5, r7, r8, r9, sl, fp, lr}
  24655. 800aaec: b0c8 sub sp, #288 @ 0x120
  24656. 800aaee: af00 add r7, sp, #0
  24657. 800aaf0: f8c7 010c str.w r0, [r7, #268] @ 0x10c
  24658. uint32_t tmpreg;
  24659. uint32_t tickstart;
  24660. HAL_StatusTypeDef ret = HAL_OK; /* Intermediate status */
  24661. 800aaf4: 2300 movs r3, #0
  24662. 800aaf6: f887 311f strb.w r3, [r7, #287] @ 0x11f
  24663. HAL_StatusTypeDef status = HAL_OK; /* Final status */
  24664. 800aafa: 2300 movs r3, #0
  24665. 800aafc: f887 311e strb.w r3, [r7, #286] @ 0x11e
  24666. /*---------------------------- SPDIFRX configuration -------------------------------*/
  24667. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX)
  24668. 800ab00: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24669. 800ab04: e9d3 2300 ldrd r2, r3, [r3]
  24670. 800ab08: f002 6400 and.w r4, r2, #134217728 @ 0x8000000
  24671. 800ab0c: 2500 movs r5, #0
  24672. 800ab0e: ea54 0305 orrs.w r3, r4, r5
  24673. 800ab12: d049 beq.n 800aba8 <HAL_RCCEx_PeriphCLKConfig+0xc0>
  24674. {
  24675. switch (PeriphClkInit->SpdifrxClockSelection)
  24676. 800ab14: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24677. 800ab18: 6e9b ldr r3, [r3, #104] @ 0x68
  24678. 800ab1a: f5b3 1f40 cmp.w r3, #3145728 @ 0x300000
  24679. 800ab1e: d02f beq.n 800ab80 <HAL_RCCEx_PeriphCLKConfig+0x98>
  24680. 800ab20: f5b3 1f40 cmp.w r3, #3145728 @ 0x300000
  24681. 800ab24: d828 bhi.n 800ab78 <HAL_RCCEx_PeriphCLKConfig+0x90>
  24682. 800ab26: f5b3 1f00 cmp.w r3, #2097152 @ 0x200000
  24683. 800ab2a: d01a beq.n 800ab62 <HAL_RCCEx_PeriphCLKConfig+0x7a>
  24684. 800ab2c: f5b3 1f00 cmp.w r3, #2097152 @ 0x200000
  24685. 800ab30: d822 bhi.n 800ab78 <HAL_RCCEx_PeriphCLKConfig+0x90>
  24686. 800ab32: 2b00 cmp r3, #0
  24687. 800ab34: d003 beq.n 800ab3e <HAL_RCCEx_PeriphCLKConfig+0x56>
  24688. 800ab36: f5b3 1f80 cmp.w r3, #1048576 @ 0x100000
  24689. 800ab3a: d007 beq.n 800ab4c <HAL_RCCEx_PeriphCLKConfig+0x64>
  24690. 800ab3c: e01c b.n 800ab78 <HAL_RCCEx_PeriphCLKConfig+0x90>
  24691. {
  24692. case RCC_SPDIFRXCLKSOURCE_PLL: /* PLL is used as clock source for SPDIFRX*/
  24693. /* Enable PLL1Q Clock output generated form System PLL . */
  24694. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  24695. 800ab3e: 4bb8 ldr r3, [pc, #736] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24696. 800ab40: 6adb ldr r3, [r3, #44] @ 0x2c
  24697. 800ab42: 4ab7 ldr r2, [pc, #732] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24698. 800ab44: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  24699. 800ab48: 62d3 str r3, [r2, #44] @ 0x2c
  24700. /* SPDIFRX clock source configuration done later after clock selection check */
  24701. break;
  24702. 800ab4a: e01a b.n 800ab82 <HAL_RCCEx_PeriphCLKConfig+0x9a>
  24703. case RCC_SPDIFRXCLKSOURCE_PLL2: /* PLL2 is used as clock source for SPDIFRX*/
  24704. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_R_UPDATE);
  24705. 800ab4c: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24706. 800ab50: 3308 adds r3, #8
  24707. 800ab52: 2102 movs r1, #2
  24708. 800ab54: 4618 mov r0, r3
  24709. 800ab56: f001 fc73 bl 800c440 <RCCEx_PLL2_Config>
  24710. 800ab5a: 4603 mov r3, r0
  24711. 800ab5c: f887 311f strb.w r3, [r7, #287] @ 0x11f
  24712. /* SPDIFRX clock source configuration done later after clock selection check */
  24713. break;
  24714. 800ab60: e00f b.n 800ab82 <HAL_RCCEx_PeriphCLKConfig+0x9a>
  24715. case RCC_SPDIFRXCLKSOURCE_PLL3: /* PLL3 is used as clock source for SPDIFRX*/
  24716. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_R_UPDATE);
  24717. 800ab62: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24718. 800ab66: 3328 adds r3, #40 @ 0x28
  24719. 800ab68: 2102 movs r1, #2
  24720. 800ab6a: 4618 mov r0, r3
  24721. 800ab6c: f001 fd1a bl 800c5a4 <RCCEx_PLL3_Config>
  24722. 800ab70: 4603 mov r3, r0
  24723. 800ab72: f887 311f strb.w r3, [r7, #287] @ 0x11f
  24724. /* SPDIFRX clock source configuration done later after clock selection check */
  24725. break;
  24726. 800ab76: e004 b.n 800ab82 <HAL_RCCEx_PeriphCLKConfig+0x9a>
  24727. /* Internal OSC clock is used as source of SPDIFRX clock*/
  24728. /* SPDIFRX clock source configuration done later after clock selection check */
  24729. break;
  24730. default:
  24731. ret = HAL_ERROR;
  24732. 800ab78: 2301 movs r3, #1
  24733. 800ab7a: f887 311f strb.w r3, [r7, #287] @ 0x11f
  24734. break;
  24735. 800ab7e: e000 b.n 800ab82 <HAL_RCCEx_PeriphCLKConfig+0x9a>
  24736. break;
  24737. 800ab80: bf00 nop
  24738. }
  24739. if (ret == HAL_OK)
  24740. 800ab82: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  24741. 800ab86: 2b00 cmp r3, #0
  24742. 800ab88: d10a bne.n 800aba0 <HAL_RCCEx_PeriphCLKConfig+0xb8>
  24743. {
  24744. /* Set the source of SPDIFRX clock*/
  24745. __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifrxClockSelection);
  24746. 800ab8a: 4ba5 ldr r3, [pc, #660] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24747. 800ab8c: 6d1b ldr r3, [r3, #80] @ 0x50
  24748. 800ab8e: f423 1140 bic.w r1, r3, #3145728 @ 0x300000
  24749. 800ab92: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24750. 800ab96: 6e9b ldr r3, [r3, #104] @ 0x68
  24751. 800ab98: 4aa1 ldr r2, [pc, #644] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24752. 800ab9a: 430b orrs r3, r1
  24753. 800ab9c: 6513 str r3, [r2, #80] @ 0x50
  24754. 800ab9e: e003 b.n 800aba8 <HAL_RCCEx_PeriphCLKConfig+0xc0>
  24755. }
  24756. else
  24757. {
  24758. /* set overall return value */
  24759. status = ret;
  24760. 800aba0: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  24761. 800aba4: f887 311e strb.w r3, [r7, #286] @ 0x11e
  24762. }
  24763. }
  24764. /*---------------------------- SAI1 configuration -------------------------------*/
  24765. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1)
  24766. 800aba8: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24767. 800abac: e9d3 2300 ldrd r2, r3, [r3]
  24768. 800abb0: f402 7880 and.w r8, r2, #256 @ 0x100
  24769. 800abb4: f04f 0900 mov.w r9, #0
  24770. 800abb8: ea58 0309 orrs.w r3, r8, r9
  24771. 800abbc: d047 beq.n 800ac4e <HAL_RCCEx_PeriphCLKConfig+0x166>
  24772. {
  24773. switch (PeriphClkInit->Sai1ClockSelection)
  24774. 800abbe: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24775. 800abc2: 6d9b ldr r3, [r3, #88] @ 0x58
  24776. 800abc4: 2b04 cmp r3, #4
  24777. 800abc6: d82a bhi.n 800ac1e <HAL_RCCEx_PeriphCLKConfig+0x136>
  24778. 800abc8: a201 add r2, pc, #4 @ (adr r2, 800abd0 <HAL_RCCEx_PeriphCLKConfig+0xe8>)
  24779. 800abca: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  24780. 800abce: bf00 nop
  24781. 800abd0: 0800abe5 .word 0x0800abe5
  24782. 800abd4: 0800abf3 .word 0x0800abf3
  24783. 800abd8: 0800ac09 .word 0x0800ac09
  24784. 800abdc: 0800ac27 .word 0x0800ac27
  24785. 800abe0: 0800ac27 .word 0x0800ac27
  24786. {
  24787. case RCC_SAI1CLKSOURCE_PLL: /* PLL is used as clock source for SAI1*/
  24788. /* Enable SAI Clock output generated form System PLL . */
  24789. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  24790. 800abe4: 4b8e ldr r3, [pc, #568] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24791. 800abe6: 6adb ldr r3, [r3, #44] @ 0x2c
  24792. 800abe8: 4a8d ldr r2, [pc, #564] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24793. 800abea: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  24794. 800abee: 62d3 str r3, [r2, #44] @ 0x2c
  24795. /* SAI1 clock source configuration done later after clock selection check */
  24796. break;
  24797. 800abf0: e01a b.n 800ac28 <HAL_RCCEx_PeriphCLKConfig+0x140>
  24798. case RCC_SAI1CLKSOURCE_PLL2: /* PLL2 is used as clock source for SAI1*/
  24799. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_P_UPDATE);
  24800. 800abf2: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24801. 800abf6: 3308 adds r3, #8
  24802. 800abf8: 2100 movs r1, #0
  24803. 800abfa: 4618 mov r0, r3
  24804. 800abfc: f001 fc20 bl 800c440 <RCCEx_PLL2_Config>
  24805. 800ac00: 4603 mov r3, r0
  24806. 800ac02: f887 311f strb.w r3, [r7, #287] @ 0x11f
  24807. /* SAI1 clock source configuration done later after clock selection check */
  24808. break;
  24809. 800ac06: e00f b.n 800ac28 <HAL_RCCEx_PeriphCLKConfig+0x140>
  24810. case RCC_SAI1CLKSOURCE_PLL3: /* PLL3 is used as clock source for SAI1*/
  24811. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_P_UPDATE);
  24812. 800ac08: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24813. 800ac0c: 3328 adds r3, #40 @ 0x28
  24814. 800ac0e: 2100 movs r1, #0
  24815. 800ac10: 4618 mov r0, r3
  24816. 800ac12: f001 fcc7 bl 800c5a4 <RCCEx_PLL3_Config>
  24817. 800ac16: 4603 mov r3, r0
  24818. 800ac18: f887 311f strb.w r3, [r7, #287] @ 0x11f
  24819. /* SAI1 clock source configuration done later after clock selection check */
  24820. break;
  24821. 800ac1c: e004 b.n 800ac28 <HAL_RCCEx_PeriphCLKConfig+0x140>
  24822. /* HSI, HSE, or CSI oscillator is used as source of SAI1 clock */
  24823. /* SAI1 clock source configuration done later after clock selection check */
  24824. break;
  24825. default:
  24826. ret = HAL_ERROR;
  24827. 800ac1e: 2301 movs r3, #1
  24828. 800ac20: f887 311f strb.w r3, [r7, #287] @ 0x11f
  24829. break;
  24830. 800ac24: e000 b.n 800ac28 <HAL_RCCEx_PeriphCLKConfig+0x140>
  24831. break;
  24832. 800ac26: bf00 nop
  24833. }
  24834. if (ret == HAL_OK)
  24835. 800ac28: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  24836. 800ac2c: 2b00 cmp r3, #0
  24837. 800ac2e: d10a bne.n 800ac46 <HAL_RCCEx_PeriphCLKConfig+0x15e>
  24838. {
  24839. /* Set the source of SAI1 clock*/
  24840. __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection);
  24841. 800ac30: 4b7b ldr r3, [pc, #492] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24842. 800ac32: 6d1b ldr r3, [r3, #80] @ 0x50
  24843. 800ac34: f023 0107 bic.w r1, r3, #7
  24844. 800ac38: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24845. 800ac3c: 6d9b ldr r3, [r3, #88] @ 0x58
  24846. 800ac3e: 4a78 ldr r2, [pc, #480] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24847. 800ac40: 430b orrs r3, r1
  24848. 800ac42: 6513 str r3, [r2, #80] @ 0x50
  24849. 800ac44: e003 b.n 800ac4e <HAL_RCCEx_PeriphCLKConfig+0x166>
  24850. }
  24851. else
  24852. {
  24853. /* set overall return value */
  24854. status = ret;
  24855. 800ac46: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  24856. 800ac4a: f887 311e strb.w r3, [r7, #286] @ 0x11e
  24857. }
  24858. }
  24859. #if defined(SAI3)
  24860. /*---------------------------- SAI2/3 configuration -------------------------------*/
  24861. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI23) == RCC_PERIPHCLK_SAI23)
  24862. 800ac4e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24863. 800ac52: e9d3 2300 ldrd r2, r3, [r3]
  24864. 800ac56: f402 7a00 and.w sl, r2, #512 @ 0x200
  24865. 800ac5a: f04f 0b00 mov.w fp, #0
  24866. 800ac5e: ea5a 030b orrs.w r3, sl, fp
  24867. 800ac62: d04c beq.n 800acfe <HAL_RCCEx_PeriphCLKConfig+0x216>
  24868. {
  24869. switch (PeriphClkInit->Sai23ClockSelection)
  24870. 800ac64: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24871. 800ac68: 6ddb ldr r3, [r3, #92] @ 0x5c
  24872. 800ac6a: f5b3 7f80 cmp.w r3, #256 @ 0x100
  24873. 800ac6e: d030 beq.n 800acd2 <HAL_RCCEx_PeriphCLKConfig+0x1ea>
  24874. 800ac70: f5b3 7f80 cmp.w r3, #256 @ 0x100
  24875. 800ac74: d829 bhi.n 800acca <HAL_RCCEx_PeriphCLKConfig+0x1e2>
  24876. 800ac76: 2bc0 cmp r3, #192 @ 0xc0
  24877. 800ac78: d02d beq.n 800acd6 <HAL_RCCEx_PeriphCLKConfig+0x1ee>
  24878. 800ac7a: 2bc0 cmp r3, #192 @ 0xc0
  24879. 800ac7c: d825 bhi.n 800acca <HAL_RCCEx_PeriphCLKConfig+0x1e2>
  24880. 800ac7e: 2b80 cmp r3, #128 @ 0x80
  24881. 800ac80: d018 beq.n 800acb4 <HAL_RCCEx_PeriphCLKConfig+0x1cc>
  24882. 800ac82: 2b80 cmp r3, #128 @ 0x80
  24883. 800ac84: d821 bhi.n 800acca <HAL_RCCEx_PeriphCLKConfig+0x1e2>
  24884. 800ac86: 2b00 cmp r3, #0
  24885. 800ac88: d002 beq.n 800ac90 <HAL_RCCEx_PeriphCLKConfig+0x1a8>
  24886. 800ac8a: 2b40 cmp r3, #64 @ 0x40
  24887. 800ac8c: d007 beq.n 800ac9e <HAL_RCCEx_PeriphCLKConfig+0x1b6>
  24888. 800ac8e: e01c b.n 800acca <HAL_RCCEx_PeriphCLKConfig+0x1e2>
  24889. {
  24890. case RCC_SAI23CLKSOURCE_PLL: /* PLL is used as clock source for SAI2/3 */
  24891. /* Enable SAI Clock output generated form System PLL . */
  24892. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  24893. 800ac90: 4b63 ldr r3, [pc, #396] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24894. 800ac92: 6adb ldr r3, [r3, #44] @ 0x2c
  24895. 800ac94: 4a62 ldr r2, [pc, #392] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24896. 800ac96: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  24897. 800ac9a: 62d3 str r3, [r2, #44] @ 0x2c
  24898. /* SAI2/3 clock source configuration done later after clock selection check */
  24899. break;
  24900. 800ac9c: e01c b.n 800acd8 <HAL_RCCEx_PeriphCLKConfig+0x1f0>
  24901. case RCC_SAI23CLKSOURCE_PLL2: /* PLL2 is used as clock source for SAI2/3 */
  24902. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_P_UPDATE);
  24903. 800ac9e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24904. 800aca2: 3308 adds r3, #8
  24905. 800aca4: 2100 movs r1, #0
  24906. 800aca6: 4618 mov r0, r3
  24907. 800aca8: f001 fbca bl 800c440 <RCCEx_PLL2_Config>
  24908. 800acac: 4603 mov r3, r0
  24909. 800acae: f887 311f strb.w r3, [r7, #287] @ 0x11f
  24910. /* SAI2/3 clock source configuration done later after clock selection check */
  24911. break;
  24912. 800acb2: e011 b.n 800acd8 <HAL_RCCEx_PeriphCLKConfig+0x1f0>
  24913. case RCC_SAI23CLKSOURCE_PLL3: /* PLL3 is used as clock source for SAI2/3 */
  24914. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_P_UPDATE);
  24915. 800acb4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24916. 800acb8: 3328 adds r3, #40 @ 0x28
  24917. 800acba: 2100 movs r1, #0
  24918. 800acbc: 4618 mov r0, r3
  24919. 800acbe: f001 fc71 bl 800c5a4 <RCCEx_PLL3_Config>
  24920. 800acc2: 4603 mov r3, r0
  24921. 800acc4: f887 311f strb.w r3, [r7, #287] @ 0x11f
  24922. /* SAI2/3 clock source configuration done later after clock selection check */
  24923. break;
  24924. 800acc8: e006 b.n 800acd8 <HAL_RCCEx_PeriphCLKConfig+0x1f0>
  24925. /* HSI, HSE, or CSI oscillator is used as source of SAI2/3 clock */
  24926. /* SAI2/3 clock source configuration done later after clock selection check */
  24927. break;
  24928. default:
  24929. ret = HAL_ERROR;
  24930. 800acca: 2301 movs r3, #1
  24931. 800accc: f887 311f strb.w r3, [r7, #287] @ 0x11f
  24932. break;
  24933. 800acd0: e002 b.n 800acd8 <HAL_RCCEx_PeriphCLKConfig+0x1f0>
  24934. break;
  24935. 800acd2: bf00 nop
  24936. 800acd4: e000 b.n 800acd8 <HAL_RCCEx_PeriphCLKConfig+0x1f0>
  24937. break;
  24938. 800acd6: bf00 nop
  24939. }
  24940. if (ret == HAL_OK)
  24941. 800acd8: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  24942. 800acdc: 2b00 cmp r3, #0
  24943. 800acde: d10a bne.n 800acf6 <HAL_RCCEx_PeriphCLKConfig+0x20e>
  24944. {
  24945. /* Set the source of SAI2/3 clock*/
  24946. __HAL_RCC_SAI23_CONFIG(PeriphClkInit->Sai23ClockSelection);
  24947. 800ace0: 4b4f ldr r3, [pc, #316] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24948. 800ace2: 6d1b ldr r3, [r3, #80] @ 0x50
  24949. 800ace4: f423 71e0 bic.w r1, r3, #448 @ 0x1c0
  24950. 800ace8: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24951. 800acec: 6ddb ldr r3, [r3, #92] @ 0x5c
  24952. 800acee: 4a4c ldr r2, [pc, #304] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  24953. 800acf0: 430b orrs r3, r1
  24954. 800acf2: 6513 str r3, [r2, #80] @ 0x50
  24955. 800acf4: e003 b.n 800acfe <HAL_RCCEx_PeriphCLKConfig+0x216>
  24956. }
  24957. else
  24958. {
  24959. /* set overall return value */
  24960. status = ret;
  24961. 800acf6: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  24962. 800acfa: f887 311e strb.w r3, [r7, #286] @ 0x11e
  24963. }
  24964. #endif /*SAI2B*/
  24965. #if defined(SAI4)
  24966. /*---------------------------- SAI4A configuration -------------------------------*/
  24967. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI4A) == RCC_PERIPHCLK_SAI4A)
  24968. 800acfe: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24969. 800ad02: e9d3 2300 ldrd r2, r3, [r3]
  24970. 800ad06: f402 6380 and.w r3, r2, #1024 @ 0x400
  24971. 800ad0a: f8c7 3100 str.w r3, [r7, #256] @ 0x100
  24972. 800ad0e: 2300 movs r3, #0
  24973. 800ad10: f8c7 3104 str.w r3, [r7, #260] @ 0x104
  24974. 800ad14: e9d7 1240 ldrd r1, r2, [r7, #256] @ 0x100
  24975. 800ad18: 460b mov r3, r1
  24976. 800ad1a: 4313 orrs r3, r2
  24977. 800ad1c: d053 beq.n 800adc6 <HAL_RCCEx_PeriphCLKConfig+0x2de>
  24978. {
  24979. switch (PeriphClkInit->Sai4AClockSelection)
  24980. 800ad1e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  24981. 800ad22: f8d3 30a8 ldr.w r3, [r3, #168] @ 0xa8
  24982. 800ad26: f5b3 0f00 cmp.w r3, #8388608 @ 0x800000
  24983. 800ad2a: d035 beq.n 800ad98 <HAL_RCCEx_PeriphCLKConfig+0x2b0>
  24984. 800ad2c: f5b3 0f00 cmp.w r3, #8388608 @ 0x800000
  24985. 800ad30: d82e bhi.n 800ad90 <HAL_RCCEx_PeriphCLKConfig+0x2a8>
  24986. 800ad32: f5b3 0fc0 cmp.w r3, #6291456 @ 0x600000
  24987. 800ad36: d031 beq.n 800ad9c <HAL_RCCEx_PeriphCLKConfig+0x2b4>
  24988. 800ad38: f5b3 0fc0 cmp.w r3, #6291456 @ 0x600000
  24989. 800ad3c: d828 bhi.n 800ad90 <HAL_RCCEx_PeriphCLKConfig+0x2a8>
  24990. 800ad3e: f5b3 0f80 cmp.w r3, #4194304 @ 0x400000
  24991. 800ad42: d01a beq.n 800ad7a <HAL_RCCEx_PeriphCLKConfig+0x292>
  24992. 800ad44: f5b3 0f80 cmp.w r3, #4194304 @ 0x400000
  24993. 800ad48: d822 bhi.n 800ad90 <HAL_RCCEx_PeriphCLKConfig+0x2a8>
  24994. 800ad4a: 2b00 cmp r3, #0
  24995. 800ad4c: d003 beq.n 800ad56 <HAL_RCCEx_PeriphCLKConfig+0x26e>
  24996. 800ad4e: f5b3 1f00 cmp.w r3, #2097152 @ 0x200000
  24997. 800ad52: d007 beq.n 800ad64 <HAL_RCCEx_PeriphCLKConfig+0x27c>
  24998. 800ad54: e01c b.n 800ad90 <HAL_RCCEx_PeriphCLKConfig+0x2a8>
  24999. {
  25000. case RCC_SAI4ACLKSOURCE_PLL: /* PLL is used as clock source for SAI2*/
  25001. /* Enable SAI Clock output generated form System PLL . */
  25002. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  25003. 800ad56: 4b32 ldr r3, [pc, #200] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  25004. 800ad58: 6adb ldr r3, [r3, #44] @ 0x2c
  25005. 800ad5a: 4a31 ldr r2, [pc, #196] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  25006. 800ad5c: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  25007. 800ad60: 62d3 str r3, [r2, #44] @ 0x2c
  25008. /* SAI1 clock source configuration done later after clock selection check */
  25009. break;
  25010. 800ad62: e01c b.n 800ad9e <HAL_RCCEx_PeriphCLKConfig+0x2b6>
  25011. case RCC_SAI4ACLKSOURCE_PLL2: /* PLL2 is used as clock source for SAI2*/
  25012. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_P_UPDATE);
  25013. 800ad64: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25014. 800ad68: 3308 adds r3, #8
  25015. 800ad6a: 2100 movs r1, #0
  25016. 800ad6c: 4618 mov r0, r3
  25017. 800ad6e: f001 fb67 bl 800c440 <RCCEx_PLL2_Config>
  25018. 800ad72: 4603 mov r3, r0
  25019. 800ad74: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25020. /* SAI2 clock source configuration done later after clock selection check */
  25021. break;
  25022. 800ad78: e011 b.n 800ad9e <HAL_RCCEx_PeriphCLKConfig+0x2b6>
  25023. case RCC_SAI4ACLKSOURCE_PLL3: /* PLL3 is used as clock source for SAI2*/
  25024. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_P_UPDATE);
  25025. 800ad7a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25026. 800ad7e: 3328 adds r3, #40 @ 0x28
  25027. 800ad80: 2100 movs r1, #0
  25028. 800ad82: 4618 mov r0, r3
  25029. 800ad84: f001 fc0e bl 800c5a4 <RCCEx_PLL3_Config>
  25030. 800ad88: 4603 mov r3, r0
  25031. 800ad8a: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25032. /* SAI1 clock source configuration done later after clock selection check */
  25033. break;
  25034. 800ad8e: e006 b.n 800ad9e <HAL_RCCEx_PeriphCLKConfig+0x2b6>
  25035. /* SAI4A clock source configuration done later after clock selection check */
  25036. break;
  25037. #endif /* RCC_VER_3_0 */
  25038. default:
  25039. ret = HAL_ERROR;
  25040. 800ad90: 2301 movs r3, #1
  25041. 800ad92: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25042. break;
  25043. 800ad96: e002 b.n 800ad9e <HAL_RCCEx_PeriphCLKConfig+0x2b6>
  25044. break;
  25045. 800ad98: bf00 nop
  25046. 800ad9a: e000 b.n 800ad9e <HAL_RCCEx_PeriphCLKConfig+0x2b6>
  25047. break;
  25048. 800ad9c: bf00 nop
  25049. }
  25050. if (ret == HAL_OK)
  25051. 800ad9e: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25052. 800ada2: 2b00 cmp r3, #0
  25053. 800ada4: d10b bne.n 800adbe <HAL_RCCEx_PeriphCLKConfig+0x2d6>
  25054. {
  25055. /* Set the source of SAI4A clock*/
  25056. __HAL_RCC_SAI4A_CONFIG(PeriphClkInit->Sai4AClockSelection);
  25057. 800ada6: 4b1e ldr r3, [pc, #120] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  25058. 800ada8: 6d9b ldr r3, [r3, #88] @ 0x58
  25059. 800adaa: f423 0160 bic.w r1, r3, #14680064 @ 0xe00000
  25060. 800adae: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25061. 800adb2: f8d3 30a8 ldr.w r3, [r3, #168] @ 0xa8
  25062. 800adb6: 4a1a ldr r2, [pc, #104] @ (800ae20 <HAL_RCCEx_PeriphCLKConfig+0x338>)
  25063. 800adb8: 430b orrs r3, r1
  25064. 800adba: 6593 str r3, [r2, #88] @ 0x58
  25065. 800adbc: e003 b.n 800adc6 <HAL_RCCEx_PeriphCLKConfig+0x2de>
  25066. }
  25067. else
  25068. {
  25069. /* set overall return value */
  25070. status = ret;
  25071. 800adbe: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25072. 800adc2: f887 311e strb.w r3, [r7, #286] @ 0x11e
  25073. }
  25074. }
  25075. /*---------------------------- SAI4B configuration -------------------------------*/
  25076. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI4B) == RCC_PERIPHCLK_SAI4B)
  25077. 800adc6: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25078. 800adca: e9d3 2300 ldrd r2, r3, [r3]
  25079. 800adce: f402 6300 and.w r3, r2, #2048 @ 0x800
  25080. 800add2: f8c7 30f8 str.w r3, [r7, #248] @ 0xf8
  25081. 800add6: 2300 movs r3, #0
  25082. 800add8: f8c7 30fc str.w r3, [r7, #252] @ 0xfc
  25083. 800addc: e9d7 123e ldrd r1, r2, [r7, #248] @ 0xf8
  25084. 800ade0: 460b mov r3, r1
  25085. 800ade2: 4313 orrs r3, r2
  25086. 800ade4: d056 beq.n 800ae94 <HAL_RCCEx_PeriphCLKConfig+0x3ac>
  25087. {
  25088. switch (PeriphClkInit->Sai4BClockSelection)
  25089. 800ade6: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25090. 800adea: f8d3 30ac ldr.w r3, [r3, #172] @ 0xac
  25091. 800adee: f1b3 6f80 cmp.w r3, #67108864 @ 0x4000000
  25092. 800adf2: d038 beq.n 800ae66 <HAL_RCCEx_PeriphCLKConfig+0x37e>
  25093. 800adf4: f1b3 6f80 cmp.w r3, #67108864 @ 0x4000000
  25094. 800adf8: d831 bhi.n 800ae5e <HAL_RCCEx_PeriphCLKConfig+0x376>
  25095. 800adfa: f1b3 7f40 cmp.w r3, #50331648 @ 0x3000000
  25096. 800adfe: d034 beq.n 800ae6a <HAL_RCCEx_PeriphCLKConfig+0x382>
  25097. 800ae00: f1b3 7f40 cmp.w r3, #50331648 @ 0x3000000
  25098. 800ae04: d82b bhi.n 800ae5e <HAL_RCCEx_PeriphCLKConfig+0x376>
  25099. 800ae06: f1b3 7f00 cmp.w r3, #33554432 @ 0x2000000
  25100. 800ae0a: d01d beq.n 800ae48 <HAL_RCCEx_PeriphCLKConfig+0x360>
  25101. 800ae0c: f1b3 7f00 cmp.w r3, #33554432 @ 0x2000000
  25102. 800ae10: d825 bhi.n 800ae5e <HAL_RCCEx_PeriphCLKConfig+0x376>
  25103. 800ae12: 2b00 cmp r3, #0
  25104. 800ae14: d006 beq.n 800ae24 <HAL_RCCEx_PeriphCLKConfig+0x33c>
  25105. 800ae16: f1b3 7f80 cmp.w r3, #16777216 @ 0x1000000
  25106. 800ae1a: d00a beq.n 800ae32 <HAL_RCCEx_PeriphCLKConfig+0x34a>
  25107. 800ae1c: e01f b.n 800ae5e <HAL_RCCEx_PeriphCLKConfig+0x376>
  25108. 800ae1e: bf00 nop
  25109. 800ae20: 58024400 .word 0x58024400
  25110. {
  25111. case RCC_SAI4BCLKSOURCE_PLL: /* PLL is used as clock source for SAI2*/
  25112. /* Enable SAI Clock output generated form System PLL . */
  25113. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  25114. 800ae24: 4ba2 ldr r3, [pc, #648] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25115. 800ae26: 6adb ldr r3, [r3, #44] @ 0x2c
  25116. 800ae28: 4aa1 ldr r2, [pc, #644] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25117. 800ae2a: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  25118. 800ae2e: 62d3 str r3, [r2, #44] @ 0x2c
  25119. /* SAI1 clock source configuration done later after clock selection check */
  25120. break;
  25121. 800ae30: e01c b.n 800ae6c <HAL_RCCEx_PeriphCLKConfig+0x384>
  25122. case RCC_SAI4BCLKSOURCE_PLL2: /* PLL2 is used as clock source for SAI2*/
  25123. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_P_UPDATE);
  25124. 800ae32: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25125. 800ae36: 3308 adds r3, #8
  25126. 800ae38: 2100 movs r1, #0
  25127. 800ae3a: 4618 mov r0, r3
  25128. 800ae3c: f001 fb00 bl 800c440 <RCCEx_PLL2_Config>
  25129. 800ae40: 4603 mov r3, r0
  25130. 800ae42: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25131. /* SAI2 clock source configuration done later after clock selection check */
  25132. break;
  25133. 800ae46: e011 b.n 800ae6c <HAL_RCCEx_PeriphCLKConfig+0x384>
  25134. case RCC_SAI4BCLKSOURCE_PLL3: /* PLL3 is used as clock source for SAI2*/
  25135. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_P_UPDATE);
  25136. 800ae48: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25137. 800ae4c: 3328 adds r3, #40 @ 0x28
  25138. 800ae4e: 2100 movs r1, #0
  25139. 800ae50: 4618 mov r0, r3
  25140. 800ae52: f001 fba7 bl 800c5a4 <RCCEx_PLL3_Config>
  25141. 800ae56: 4603 mov r3, r0
  25142. 800ae58: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25143. /* SAI1 clock source configuration done later after clock selection check */
  25144. break;
  25145. 800ae5c: e006 b.n 800ae6c <HAL_RCCEx_PeriphCLKConfig+0x384>
  25146. /* SAI4B clock source configuration done later after clock selection check */
  25147. break;
  25148. #endif /* RCC_VER_3_0 */
  25149. default:
  25150. ret = HAL_ERROR;
  25151. 800ae5e: 2301 movs r3, #1
  25152. 800ae60: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25153. break;
  25154. 800ae64: e002 b.n 800ae6c <HAL_RCCEx_PeriphCLKConfig+0x384>
  25155. break;
  25156. 800ae66: bf00 nop
  25157. 800ae68: e000 b.n 800ae6c <HAL_RCCEx_PeriphCLKConfig+0x384>
  25158. break;
  25159. 800ae6a: bf00 nop
  25160. }
  25161. if (ret == HAL_OK)
  25162. 800ae6c: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25163. 800ae70: 2b00 cmp r3, #0
  25164. 800ae72: d10b bne.n 800ae8c <HAL_RCCEx_PeriphCLKConfig+0x3a4>
  25165. {
  25166. /* Set the source of SAI4B clock*/
  25167. __HAL_RCC_SAI4B_CONFIG(PeriphClkInit->Sai4BClockSelection);
  25168. 800ae74: 4b8e ldr r3, [pc, #568] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25169. 800ae76: 6d9b ldr r3, [r3, #88] @ 0x58
  25170. 800ae78: f023 61e0 bic.w r1, r3, #117440512 @ 0x7000000
  25171. 800ae7c: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25172. 800ae80: f8d3 30ac ldr.w r3, [r3, #172] @ 0xac
  25173. 800ae84: 4a8a ldr r2, [pc, #552] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25174. 800ae86: 430b orrs r3, r1
  25175. 800ae88: 6593 str r3, [r2, #88] @ 0x58
  25176. 800ae8a: e003 b.n 800ae94 <HAL_RCCEx_PeriphCLKConfig+0x3ac>
  25177. }
  25178. else
  25179. {
  25180. /* set overall return value */
  25181. status = ret;
  25182. 800ae8c: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25183. 800ae90: f887 311e strb.w r3, [r7, #286] @ 0x11e
  25184. }
  25185. #endif /*SAI4*/
  25186. #if defined(QUADSPI)
  25187. /*---------------------------- QSPI configuration -------------------------------*/
  25188. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_QSPI) == RCC_PERIPHCLK_QSPI)
  25189. 800ae94: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25190. 800ae98: e9d3 2300 ldrd r2, r3, [r3]
  25191. 800ae9c: f002 7300 and.w r3, r2, #33554432 @ 0x2000000
  25192. 800aea0: f8c7 30f0 str.w r3, [r7, #240] @ 0xf0
  25193. 800aea4: 2300 movs r3, #0
  25194. 800aea6: f8c7 30f4 str.w r3, [r7, #244] @ 0xf4
  25195. 800aeaa: e9d7 123c ldrd r1, r2, [r7, #240] @ 0xf0
  25196. 800aeae: 460b mov r3, r1
  25197. 800aeb0: 4313 orrs r3, r2
  25198. 800aeb2: d03a beq.n 800af2a <HAL_RCCEx_PeriphCLKConfig+0x442>
  25199. {
  25200. switch (PeriphClkInit->QspiClockSelection)
  25201. 800aeb4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25202. 800aeb8: 6cdb ldr r3, [r3, #76] @ 0x4c
  25203. 800aeba: 2b30 cmp r3, #48 @ 0x30
  25204. 800aebc: d01f beq.n 800aefe <HAL_RCCEx_PeriphCLKConfig+0x416>
  25205. 800aebe: 2b30 cmp r3, #48 @ 0x30
  25206. 800aec0: d819 bhi.n 800aef6 <HAL_RCCEx_PeriphCLKConfig+0x40e>
  25207. 800aec2: 2b20 cmp r3, #32
  25208. 800aec4: d00c beq.n 800aee0 <HAL_RCCEx_PeriphCLKConfig+0x3f8>
  25209. 800aec6: 2b20 cmp r3, #32
  25210. 800aec8: d815 bhi.n 800aef6 <HAL_RCCEx_PeriphCLKConfig+0x40e>
  25211. 800aeca: 2b00 cmp r3, #0
  25212. 800aecc: d019 beq.n 800af02 <HAL_RCCEx_PeriphCLKConfig+0x41a>
  25213. 800aece: 2b10 cmp r3, #16
  25214. 800aed0: d111 bne.n 800aef6 <HAL_RCCEx_PeriphCLKConfig+0x40e>
  25215. {
  25216. case RCC_QSPICLKSOURCE_PLL: /* PLL is used as clock source for QSPI*/
  25217. /* Enable QSPI Clock output generated form System PLL . */
  25218. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  25219. 800aed2: 4b77 ldr r3, [pc, #476] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25220. 800aed4: 6adb ldr r3, [r3, #44] @ 0x2c
  25221. 800aed6: 4a76 ldr r2, [pc, #472] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25222. 800aed8: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  25223. 800aedc: 62d3 str r3, [r2, #44] @ 0x2c
  25224. /* QSPI clock source configuration done later after clock selection check */
  25225. break;
  25226. 800aede: e011 b.n 800af04 <HAL_RCCEx_PeriphCLKConfig+0x41c>
  25227. case RCC_QSPICLKSOURCE_PLL2: /* PLL2 is used as clock source for QSPI*/
  25228. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_R_UPDATE);
  25229. 800aee0: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25230. 800aee4: 3308 adds r3, #8
  25231. 800aee6: 2102 movs r1, #2
  25232. 800aee8: 4618 mov r0, r3
  25233. 800aeea: f001 faa9 bl 800c440 <RCCEx_PLL2_Config>
  25234. 800aeee: 4603 mov r3, r0
  25235. 800aef0: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25236. /* QSPI clock source configuration done later after clock selection check */
  25237. break;
  25238. 800aef4: e006 b.n 800af04 <HAL_RCCEx_PeriphCLKConfig+0x41c>
  25239. case RCC_QSPICLKSOURCE_D1HCLK:
  25240. /* Domain1 HCLK clock selected as QSPI kernel peripheral clock */
  25241. break;
  25242. default:
  25243. ret = HAL_ERROR;
  25244. 800aef6: 2301 movs r3, #1
  25245. 800aef8: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25246. break;
  25247. 800aefc: e002 b.n 800af04 <HAL_RCCEx_PeriphCLKConfig+0x41c>
  25248. break;
  25249. 800aefe: bf00 nop
  25250. 800af00: e000 b.n 800af04 <HAL_RCCEx_PeriphCLKConfig+0x41c>
  25251. break;
  25252. 800af02: bf00 nop
  25253. }
  25254. if (ret == HAL_OK)
  25255. 800af04: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25256. 800af08: 2b00 cmp r3, #0
  25257. 800af0a: d10a bne.n 800af22 <HAL_RCCEx_PeriphCLKConfig+0x43a>
  25258. {
  25259. /* Set the source of QSPI clock*/
  25260. __HAL_RCC_QSPI_CONFIG(PeriphClkInit->QspiClockSelection);
  25261. 800af0c: 4b68 ldr r3, [pc, #416] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25262. 800af0e: 6cdb ldr r3, [r3, #76] @ 0x4c
  25263. 800af10: f023 0130 bic.w r1, r3, #48 @ 0x30
  25264. 800af14: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25265. 800af18: 6cdb ldr r3, [r3, #76] @ 0x4c
  25266. 800af1a: 4a65 ldr r2, [pc, #404] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25267. 800af1c: 430b orrs r3, r1
  25268. 800af1e: 64d3 str r3, [r2, #76] @ 0x4c
  25269. 800af20: e003 b.n 800af2a <HAL_RCCEx_PeriphCLKConfig+0x442>
  25270. }
  25271. else
  25272. {
  25273. /* set overall return value */
  25274. status = ret;
  25275. 800af22: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25276. 800af26: f887 311e strb.w r3, [r7, #286] @ 0x11e
  25277. }
  25278. }
  25279. #endif /*OCTOSPI*/
  25280. /*---------------------------- SPI1/2/3 configuration -------------------------------*/
  25281. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPI123) == RCC_PERIPHCLK_SPI123)
  25282. 800af2a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25283. 800af2e: e9d3 2300 ldrd r2, r3, [r3]
  25284. 800af32: f402 5380 and.w r3, r2, #4096 @ 0x1000
  25285. 800af36: f8c7 30e8 str.w r3, [r7, #232] @ 0xe8
  25286. 800af3a: 2300 movs r3, #0
  25287. 800af3c: f8c7 30ec str.w r3, [r7, #236] @ 0xec
  25288. 800af40: e9d7 123a ldrd r1, r2, [r7, #232] @ 0xe8
  25289. 800af44: 460b mov r3, r1
  25290. 800af46: 4313 orrs r3, r2
  25291. 800af48: d051 beq.n 800afee <HAL_RCCEx_PeriphCLKConfig+0x506>
  25292. {
  25293. switch (PeriphClkInit->Spi123ClockSelection)
  25294. 800af4a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25295. 800af4e: 6e1b ldr r3, [r3, #96] @ 0x60
  25296. 800af50: f5b3 4f80 cmp.w r3, #16384 @ 0x4000
  25297. 800af54: d035 beq.n 800afc2 <HAL_RCCEx_PeriphCLKConfig+0x4da>
  25298. 800af56: f5b3 4f80 cmp.w r3, #16384 @ 0x4000
  25299. 800af5a: d82e bhi.n 800afba <HAL_RCCEx_PeriphCLKConfig+0x4d2>
  25300. 800af5c: f5b3 5f40 cmp.w r3, #12288 @ 0x3000
  25301. 800af60: d031 beq.n 800afc6 <HAL_RCCEx_PeriphCLKConfig+0x4de>
  25302. 800af62: f5b3 5f40 cmp.w r3, #12288 @ 0x3000
  25303. 800af66: d828 bhi.n 800afba <HAL_RCCEx_PeriphCLKConfig+0x4d2>
  25304. 800af68: f5b3 5f00 cmp.w r3, #8192 @ 0x2000
  25305. 800af6c: d01a beq.n 800afa4 <HAL_RCCEx_PeriphCLKConfig+0x4bc>
  25306. 800af6e: f5b3 5f00 cmp.w r3, #8192 @ 0x2000
  25307. 800af72: d822 bhi.n 800afba <HAL_RCCEx_PeriphCLKConfig+0x4d2>
  25308. 800af74: 2b00 cmp r3, #0
  25309. 800af76: d003 beq.n 800af80 <HAL_RCCEx_PeriphCLKConfig+0x498>
  25310. 800af78: f5b3 5f80 cmp.w r3, #4096 @ 0x1000
  25311. 800af7c: d007 beq.n 800af8e <HAL_RCCEx_PeriphCLKConfig+0x4a6>
  25312. 800af7e: e01c b.n 800afba <HAL_RCCEx_PeriphCLKConfig+0x4d2>
  25313. {
  25314. case RCC_SPI123CLKSOURCE_PLL: /* PLL is used as clock source for SPI1/2/3 */
  25315. /* Enable SPI Clock output generated form System PLL . */
  25316. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  25317. 800af80: 4b4b ldr r3, [pc, #300] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25318. 800af82: 6adb ldr r3, [r3, #44] @ 0x2c
  25319. 800af84: 4a4a ldr r2, [pc, #296] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25320. 800af86: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  25321. 800af8a: 62d3 str r3, [r2, #44] @ 0x2c
  25322. /* SPI1/2/3 clock source configuration done later after clock selection check */
  25323. break;
  25324. 800af8c: e01c b.n 800afc8 <HAL_RCCEx_PeriphCLKConfig+0x4e0>
  25325. case RCC_SPI123CLKSOURCE_PLL2: /* PLL2 is used as clock source for SPI1/2/3 */
  25326. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_P_UPDATE);
  25327. 800af8e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25328. 800af92: 3308 adds r3, #8
  25329. 800af94: 2100 movs r1, #0
  25330. 800af96: 4618 mov r0, r3
  25331. 800af98: f001 fa52 bl 800c440 <RCCEx_PLL2_Config>
  25332. 800af9c: 4603 mov r3, r0
  25333. 800af9e: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25334. /* SPI1/2/3 clock source configuration done later after clock selection check */
  25335. break;
  25336. 800afa2: e011 b.n 800afc8 <HAL_RCCEx_PeriphCLKConfig+0x4e0>
  25337. case RCC_SPI123CLKSOURCE_PLL3: /* PLL3 is used as clock source for SPI1/2/3 */
  25338. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_P_UPDATE);
  25339. 800afa4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25340. 800afa8: 3328 adds r3, #40 @ 0x28
  25341. 800afaa: 2100 movs r1, #0
  25342. 800afac: 4618 mov r0, r3
  25343. 800afae: f001 faf9 bl 800c5a4 <RCCEx_PLL3_Config>
  25344. 800afb2: 4603 mov r3, r0
  25345. 800afb4: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25346. /* SPI1/2/3 clock source configuration done later after clock selection check */
  25347. break;
  25348. 800afb8: e006 b.n 800afc8 <HAL_RCCEx_PeriphCLKConfig+0x4e0>
  25349. /* HSI, HSE, or CSI oscillator is used as source of SPI1/2/3 clock */
  25350. /* SPI1/2/3 clock source configuration done later after clock selection check */
  25351. break;
  25352. default:
  25353. ret = HAL_ERROR;
  25354. 800afba: 2301 movs r3, #1
  25355. 800afbc: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25356. break;
  25357. 800afc0: e002 b.n 800afc8 <HAL_RCCEx_PeriphCLKConfig+0x4e0>
  25358. break;
  25359. 800afc2: bf00 nop
  25360. 800afc4: e000 b.n 800afc8 <HAL_RCCEx_PeriphCLKConfig+0x4e0>
  25361. break;
  25362. 800afc6: bf00 nop
  25363. }
  25364. if (ret == HAL_OK)
  25365. 800afc8: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25366. 800afcc: 2b00 cmp r3, #0
  25367. 800afce: d10a bne.n 800afe6 <HAL_RCCEx_PeriphCLKConfig+0x4fe>
  25368. {
  25369. /* Set the source of SPI1/2/3 clock*/
  25370. __HAL_RCC_SPI123_CONFIG(PeriphClkInit->Spi123ClockSelection);
  25371. 800afd0: 4b37 ldr r3, [pc, #220] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25372. 800afd2: 6d1b ldr r3, [r3, #80] @ 0x50
  25373. 800afd4: f423 41e0 bic.w r1, r3, #28672 @ 0x7000
  25374. 800afd8: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25375. 800afdc: 6e1b ldr r3, [r3, #96] @ 0x60
  25376. 800afde: 4a34 ldr r2, [pc, #208] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25377. 800afe0: 430b orrs r3, r1
  25378. 800afe2: 6513 str r3, [r2, #80] @ 0x50
  25379. 800afe4: e003 b.n 800afee <HAL_RCCEx_PeriphCLKConfig+0x506>
  25380. }
  25381. else
  25382. {
  25383. /* set overall return value */
  25384. status = ret;
  25385. 800afe6: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25386. 800afea: f887 311e strb.w r3, [r7, #286] @ 0x11e
  25387. }
  25388. }
  25389. /*---------------------------- SPI4/5 configuration -------------------------------*/
  25390. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPI45) == RCC_PERIPHCLK_SPI45)
  25391. 800afee: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25392. 800aff2: e9d3 2300 ldrd r2, r3, [r3]
  25393. 800aff6: f402 5300 and.w r3, r2, #8192 @ 0x2000
  25394. 800affa: f8c7 30e0 str.w r3, [r7, #224] @ 0xe0
  25395. 800affe: 2300 movs r3, #0
  25396. 800b000: f8c7 30e4 str.w r3, [r7, #228] @ 0xe4
  25397. 800b004: e9d7 1238 ldrd r1, r2, [r7, #224] @ 0xe0
  25398. 800b008: 460b mov r3, r1
  25399. 800b00a: 4313 orrs r3, r2
  25400. 800b00c: d056 beq.n 800b0bc <HAL_RCCEx_PeriphCLKConfig+0x5d4>
  25401. {
  25402. switch (PeriphClkInit->Spi45ClockSelection)
  25403. 800b00e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25404. 800b012: 6e5b ldr r3, [r3, #100] @ 0x64
  25405. 800b014: f5b3 2fa0 cmp.w r3, #327680 @ 0x50000
  25406. 800b018: d033 beq.n 800b082 <HAL_RCCEx_PeriphCLKConfig+0x59a>
  25407. 800b01a: f5b3 2fa0 cmp.w r3, #327680 @ 0x50000
  25408. 800b01e: d82c bhi.n 800b07a <HAL_RCCEx_PeriphCLKConfig+0x592>
  25409. 800b020: f5b3 2f80 cmp.w r3, #262144 @ 0x40000
  25410. 800b024: d02f beq.n 800b086 <HAL_RCCEx_PeriphCLKConfig+0x59e>
  25411. 800b026: f5b3 2f80 cmp.w r3, #262144 @ 0x40000
  25412. 800b02a: d826 bhi.n 800b07a <HAL_RCCEx_PeriphCLKConfig+0x592>
  25413. 800b02c: f5b3 3f40 cmp.w r3, #196608 @ 0x30000
  25414. 800b030: d02b beq.n 800b08a <HAL_RCCEx_PeriphCLKConfig+0x5a2>
  25415. 800b032: f5b3 3f40 cmp.w r3, #196608 @ 0x30000
  25416. 800b036: d820 bhi.n 800b07a <HAL_RCCEx_PeriphCLKConfig+0x592>
  25417. 800b038: f5b3 3f00 cmp.w r3, #131072 @ 0x20000
  25418. 800b03c: d012 beq.n 800b064 <HAL_RCCEx_PeriphCLKConfig+0x57c>
  25419. 800b03e: f5b3 3f00 cmp.w r3, #131072 @ 0x20000
  25420. 800b042: d81a bhi.n 800b07a <HAL_RCCEx_PeriphCLKConfig+0x592>
  25421. 800b044: 2b00 cmp r3, #0
  25422. 800b046: d022 beq.n 800b08e <HAL_RCCEx_PeriphCLKConfig+0x5a6>
  25423. 800b048: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  25424. 800b04c: d115 bne.n 800b07a <HAL_RCCEx_PeriphCLKConfig+0x592>
  25425. /* SPI4/5 clock source configuration done later after clock selection check */
  25426. break;
  25427. case RCC_SPI45CLKSOURCE_PLL2: /* PLL2 is used as clock source for SPI4/5 */
  25428. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_Q_UPDATE);
  25429. 800b04e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25430. 800b052: 3308 adds r3, #8
  25431. 800b054: 2101 movs r1, #1
  25432. 800b056: 4618 mov r0, r3
  25433. 800b058: f001 f9f2 bl 800c440 <RCCEx_PLL2_Config>
  25434. 800b05c: 4603 mov r3, r0
  25435. 800b05e: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25436. /* SPI4/5 clock source configuration done later after clock selection check */
  25437. break;
  25438. 800b062: e015 b.n 800b090 <HAL_RCCEx_PeriphCLKConfig+0x5a8>
  25439. case RCC_SPI45CLKSOURCE_PLL3: /* PLL3 is used as clock source for SPI4/5 */
  25440. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_Q_UPDATE);
  25441. 800b064: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25442. 800b068: 3328 adds r3, #40 @ 0x28
  25443. 800b06a: 2101 movs r1, #1
  25444. 800b06c: 4618 mov r0, r3
  25445. 800b06e: f001 fa99 bl 800c5a4 <RCCEx_PLL3_Config>
  25446. 800b072: 4603 mov r3, r0
  25447. 800b074: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25448. /* SPI4/5 clock source configuration done later after clock selection check */
  25449. break;
  25450. 800b078: e00a b.n 800b090 <HAL_RCCEx_PeriphCLKConfig+0x5a8>
  25451. /* HSE, oscillator is used as source of SPI4/5 clock */
  25452. /* SPI4/5 clock source configuration done later after clock selection check */
  25453. break;
  25454. default:
  25455. ret = HAL_ERROR;
  25456. 800b07a: 2301 movs r3, #1
  25457. 800b07c: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25458. break;
  25459. 800b080: e006 b.n 800b090 <HAL_RCCEx_PeriphCLKConfig+0x5a8>
  25460. break;
  25461. 800b082: bf00 nop
  25462. 800b084: e004 b.n 800b090 <HAL_RCCEx_PeriphCLKConfig+0x5a8>
  25463. break;
  25464. 800b086: bf00 nop
  25465. 800b088: e002 b.n 800b090 <HAL_RCCEx_PeriphCLKConfig+0x5a8>
  25466. break;
  25467. 800b08a: bf00 nop
  25468. 800b08c: e000 b.n 800b090 <HAL_RCCEx_PeriphCLKConfig+0x5a8>
  25469. break;
  25470. 800b08e: bf00 nop
  25471. }
  25472. if (ret == HAL_OK)
  25473. 800b090: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25474. 800b094: 2b00 cmp r3, #0
  25475. 800b096: d10d bne.n 800b0b4 <HAL_RCCEx_PeriphCLKConfig+0x5cc>
  25476. {
  25477. /* Set the source of SPI4/5 clock*/
  25478. __HAL_RCC_SPI45_CONFIG(PeriphClkInit->Spi45ClockSelection);
  25479. 800b098: 4b05 ldr r3, [pc, #20] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25480. 800b09a: 6d1b ldr r3, [r3, #80] @ 0x50
  25481. 800b09c: f423 21e0 bic.w r1, r3, #458752 @ 0x70000
  25482. 800b0a0: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25483. 800b0a4: 6e5b ldr r3, [r3, #100] @ 0x64
  25484. 800b0a6: 4a02 ldr r2, [pc, #8] @ (800b0b0 <HAL_RCCEx_PeriphCLKConfig+0x5c8>)
  25485. 800b0a8: 430b orrs r3, r1
  25486. 800b0aa: 6513 str r3, [r2, #80] @ 0x50
  25487. 800b0ac: e006 b.n 800b0bc <HAL_RCCEx_PeriphCLKConfig+0x5d4>
  25488. 800b0ae: bf00 nop
  25489. 800b0b0: 58024400 .word 0x58024400
  25490. }
  25491. else
  25492. {
  25493. /* set overall return value */
  25494. status = ret;
  25495. 800b0b4: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25496. 800b0b8: f887 311e strb.w r3, [r7, #286] @ 0x11e
  25497. }
  25498. }
  25499. /*---------------------------- SPI6 configuration -------------------------------*/
  25500. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPI6) == RCC_PERIPHCLK_SPI6)
  25501. 800b0bc: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25502. 800b0c0: e9d3 2300 ldrd r2, r3, [r3]
  25503. 800b0c4: f402 4380 and.w r3, r2, #16384 @ 0x4000
  25504. 800b0c8: f8c7 30d8 str.w r3, [r7, #216] @ 0xd8
  25505. 800b0cc: 2300 movs r3, #0
  25506. 800b0ce: f8c7 30dc str.w r3, [r7, #220] @ 0xdc
  25507. 800b0d2: e9d7 1236 ldrd r1, r2, [r7, #216] @ 0xd8
  25508. 800b0d6: 460b mov r3, r1
  25509. 800b0d8: 4313 orrs r3, r2
  25510. 800b0da: d055 beq.n 800b188 <HAL_RCCEx_PeriphCLKConfig+0x6a0>
  25511. {
  25512. switch (PeriphClkInit->Spi6ClockSelection)
  25513. 800b0dc: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25514. 800b0e0: f8d3 30b0 ldr.w r3, [r3, #176] @ 0xb0
  25515. 800b0e4: f1b3 4fa0 cmp.w r3, #1342177280 @ 0x50000000
  25516. 800b0e8: d033 beq.n 800b152 <HAL_RCCEx_PeriphCLKConfig+0x66a>
  25517. 800b0ea: f1b3 4fa0 cmp.w r3, #1342177280 @ 0x50000000
  25518. 800b0ee: d82c bhi.n 800b14a <HAL_RCCEx_PeriphCLKConfig+0x662>
  25519. 800b0f0: f1b3 4f80 cmp.w r3, #1073741824 @ 0x40000000
  25520. 800b0f4: d02f beq.n 800b156 <HAL_RCCEx_PeriphCLKConfig+0x66e>
  25521. 800b0f6: f1b3 4f80 cmp.w r3, #1073741824 @ 0x40000000
  25522. 800b0fa: d826 bhi.n 800b14a <HAL_RCCEx_PeriphCLKConfig+0x662>
  25523. 800b0fc: f1b3 5f40 cmp.w r3, #805306368 @ 0x30000000
  25524. 800b100: d02b beq.n 800b15a <HAL_RCCEx_PeriphCLKConfig+0x672>
  25525. 800b102: f1b3 5f40 cmp.w r3, #805306368 @ 0x30000000
  25526. 800b106: d820 bhi.n 800b14a <HAL_RCCEx_PeriphCLKConfig+0x662>
  25527. 800b108: f1b3 5f00 cmp.w r3, #536870912 @ 0x20000000
  25528. 800b10c: d012 beq.n 800b134 <HAL_RCCEx_PeriphCLKConfig+0x64c>
  25529. 800b10e: f1b3 5f00 cmp.w r3, #536870912 @ 0x20000000
  25530. 800b112: d81a bhi.n 800b14a <HAL_RCCEx_PeriphCLKConfig+0x662>
  25531. 800b114: 2b00 cmp r3, #0
  25532. 800b116: d022 beq.n 800b15e <HAL_RCCEx_PeriphCLKConfig+0x676>
  25533. 800b118: f1b3 5f80 cmp.w r3, #268435456 @ 0x10000000
  25534. 800b11c: d115 bne.n 800b14a <HAL_RCCEx_PeriphCLKConfig+0x662>
  25535. /* SPI6 clock source configuration done later after clock selection check */
  25536. break;
  25537. case RCC_SPI6CLKSOURCE_PLL2: /* PLL2 is used as clock source for SPI6*/
  25538. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_Q_UPDATE);
  25539. 800b11e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25540. 800b122: 3308 adds r3, #8
  25541. 800b124: 2101 movs r1, #1
  25542. 800b126: 4618 mov r0, r3
  25543. 800b128: f001 f98a bl 800c440 <RCCEx_PLL2_Config>
  25544. 800b12c: 4603 mov r3, r0
  25545. 800b12e: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25546. /* SPI6 clock source configuration done later after clock selection check */
  25547. break;
  25548. 800b132: e015 b.n 800b160 <HAL_RCCEx_PeriphCLKConfig+0x678>
  25549. case RCC_SPI6CLKSOURCE_PLL3: /* PLL3 is used as clock source for SPI6*/
  25550. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_Q_UPDATE);
  25551. 800b134: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25552. 800b138: 3328 adds r3, #40 @ 0x28
  25553. 800b13a: 2101 movs r1, #1
  25554. 800b13c: 4618 mov r0, r3
  25555. 800b13e: f001 fa31 bl 800c5a4 <RCCEx_PLL3_Config>
  25556. 800b142: 4603 mov r3, r0
  25557. 800b144: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25558. /* SPI6 clock source configuration done later after clock selection check */
  25559. break;
  25560. 800b148: e00a b.n 800b160 <HAL_RCCEx_PeriphCLKConfig+0x678>
  25561. /* SPI6 clock source configuration done later after clock selection check */
  25562. break;
  25563. #endif
  25564. default:
  25565. ret = HAL_ERROR;
  25566. 800b14a: 2301 movs r3, #1
  25567. 800b14c: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25568. break;
  25569. 800b150: e006 b.n 800b160 <HAL_RCCEx_PeriphCLKConfig+0x678>
  25570. break;
  25571. 800b152: bf00 nop
  25572. 800b154: e004 b.n 800b160 <HAL_RCCEx_PeriphCLKConfig+0x678>
  25573. break;
  25574. 800b156: bf00 nop
  25575. 800b158: e002 b.n 800b160 <HAL_RCCEx_PeriphCLKConfig+0x678>
  25576. break;
  25577. 800b15a: bf00 nop
  25578. 800b15c: e000 b.n 800b160 <HAL_RCCEx_PeriphCLKConfig+0x678>
  25579. break;
  25580. 800b15e: bf00 nop
  25581. }
  25582. if (ret == HAL_OK)
  25583. 800b160: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25584. 800b164: 2b00 cmp r3, #0
  25585. 800b166: d10b bne.n 800b180 <HAL_RCCEx_PeriphCLKConfig+0x698>
  25586. {
  25587. /* Set the source of SPI6 clock*/
  25588. __HAL_RCC_SPI6_CONFIG(PeriphClkInit->Spi6ClockSelection);
  25589. 800b168: 4ba3 ldr r3, [pc, #652] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25590. 800b16a: 6d9b ldr r3, [r3, #88] @ 0x58
  25591. 800b16c: f023 41e0 bic.w r1, r3, #1879048192 @ 0x70000000
  25592. 800b170: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25593. 800b174: f8d3 30b0 ldr.w r3, [r3, #176] @ 0xb0
  25594. 800b178: 4a9f ldr r2, [pc, #636] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25595. 800b17a: 430b orrs r3, r1
  25596. 800b17c: 6593 str r3, [r2, #88] @ 0x58
  25597. 800b17e: e003 b.n 800b188 <HAL_RCCEx_PeriphCLKConfig+0x6a0>
  25598. }
  25599. else
  25600. {
  25601. /* set overall return value */
  25602. status = ret;
  25603. 800b180: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25604. 800b184: f887 311e strb.w r3, [r7, #286] @ 0x11e
  25605. }
  25606. #endif /*DSI*/
  25607. #if defined(FDCAN1) || defined(FDCAN2)
  25608. /*---------------------------- FDCAN configuration -------------------------------*/
  25609. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FDCAN) == RCC_PERIPHCLK_FDCAN)
  25610. 800b188: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25611. 800b18c: e9d3 2300 ldrd r2, r3, [r3]
  25612. 800b190: f402 4300 and.w r3, r2, #32768 @ 0x8000
  25613. 800b194: f8c7 30d0 str.w r3, [r7, #208] @ 0xd0
  25614. 800b198: 2300 movs r3, #0
  25615. 800b19a: f8c7 30d4 str.w r3, [r7, #212] @ 0xd4
  25616. 800b19e: e9d7 1234 ldrd r1, r2, [r7, #208] @ 0xd0
  25617. 800b1a2: 460b mov r3, r1
  25618. 800b1a4: 4313 orrs r3, r2
  25619. 800b1a6: d037 beq.n 800b218 <HAL_RCCEx_PeriphCLKConfig+0x730>
  25620. {
  25621. switch (PeriphClkInit->FdcanClockSelection)
  25622. 800b1a8: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25623. 800b1ac: 6f1b ldr r3, [r3, #112] @ 0x70
  25624. 800b1ae: f1b3 5f00 cmp.w r3, #536870912 @ 0x20000000
  25625. 800b1b2: d00e beq.n 800b1d2 <HAL_RCCEx_PeriphCLKConfig+0x6ea>
  25626. 800b1b4: f1b3 5f00 cmp.w r3, #536870912 @ 0x20000000
  25627. 800b1b8: d816 bhi.n 800b1e8 <HAL_RCCEx_PeriphCLKConfig+0x700>
  25628. 800b1ba: 2b00 cmp r3, #0
  25629. 800b1bc: d018 beq.n 800b1f0 <HAL_RCCEx_PeriphCLKConfig+0x708>
  25630. 800b1be: f1b3 5f80 cmp.w r3, #268435456 @ 0x10000000
  25631. 800b1c2: d111 bne.n 800b1e8 <HAL_RCCEx_PeriphCLKConfig+0x700>
  25632. {
  25633. case RCC_FDCANCLKSOURCE_PLL: /* PLL is used as clock source for FDCAN*/
  25634. /* Enable FDCAN Clock output generated form System PLL . */
  25635. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  25636. 800b1c4: 4b8c ldr r3, [pc, #560] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25637. 800b1c6: 6adb ldr r3, [r3, #44] @ 0x2c
  25638. 800b1c8: 4a8b ldr r2, [pc, #556] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25639. 800b1ca: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  25640. 800b1ce: 62d3 str r3, [r2, #44] @ 0x2c
  25641. /* FDCAN clock source configuration done later after clock selection check */
  25642. break;
  25643. 800b1d0: e00f b.n 800b1f2 <HAL_RCCEx_PeriphCLKConfig+0x70a>
  25644. case RCC_FDCANCLKSOURCE_PLL2: /* PLL2 is used as clock source for FDCAN*/
  25645. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_Q_UPDATE);
  25646. 800b1d2: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25647. 800b1d6: 3308 adds r3, #8
  25648. 800b1d8: 2101 movs r1, #1
  25649. 800b1da: 4618 mov r0, r3
  25650. 800b1dc: f001 f930 bl 800c440 <RCCEx_PLL2_Config>
  25651. 800b1e0: 4603 mov r3, r0
  25652. 800b1e2: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25653. /* FDCAN clock source configuration done later after clock selection check */
  25654. break;
  25655. 800b1e6: e004 b.n 800b1f2 <HAL_RCCEx_PeriphCLKConfig+0x70a>
  25656. /* HSE is used as clock source for FDCAN*/
  25657. /* FDCAN clock source configuration done later after clock selection check */
  25658. break;
  25659. default:
  25660. ret = HAL_ERROR;
  25661. 800b1e8: 2301 movs r3, #1
  25662. 800b1ea: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25663. break;
  25664. 800b1ee: e000 b.n 800b1f2 <HAL_RCCEx_PeriphCLKConfig+0x70a>
  25665. break;
  25666. 800b1f0: bf00 nop
  25667. }
  25668. if (ret == HAL_OK)
  25669. 800b1f2: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25670. 800b1f6: 2b00 cmp r3, #0
  25671. 800b1f8: d10a bne.n 800b210 <HAL_RCCEx_PeriphCLKConfig+0x728>
  25672. {
  25673. /* Set the source of FDCAN clock*/
  25674. __HAL_RCC_FDCAN_CONFIG(PeriphClkInit->FdcanClockSelection);
  25675. 800b1fa: 4b7f ldr r3, [pc, #508] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25676. 800b1fc: 6d1b ldr r3, [r3, #80] @ 0x50
  25677. 800b1fe: f023 5140 bic.w r1, r3, #805306368 @ 0x30000000
  25678. 800b202: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25679. 800b206: 6f1b ldr r3, [r3, #112] @ 0x70
  25680. 800b208: 4a7b ldr r2, [pc, #492] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25681. 800b20a: 430b orrs r3, r1
  25682. 800b20c: 6513 str r3, [r2, #80] @ 0x50
  25683. 800b20e: e003 b.n 800b218 <HAL_RCCEx_PeriphCLKConfig+0x730>
  25684. }
  25685. else
  25686. {
  25687. /* set overall return value */
  25688. status = ret;
  25689. 800b210: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25690. 800b214: f887 311e strb.w r3, [r7, #286] @ 0x11e
  25691. }
  25692. }
  25693. #endif /*FDCAN1 || FDCAN2*/
  25694. /*---------------------------- FMC configuration -------------------------------*/
  25695. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMC) == RCC_PERIPHCLK_FMC)
  25696. 800b218: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25697. 800b21c: e9d3 2300 ldrd r2, r3, [r3]
  25698. 800b220: f002 7380 and.w r3, r2, #16777216 @ 0x1000000
  25699. 800b224: f8c7 30c8 str.w r3, [r7, #200] @ 0xc8
  25700. 800b228: 2300 movs r3, #0
  25701. 800b22a: f8c7 30cc str.w r3, [r7, #204] @ 0xcc
  25702. 800b22e: e9d7 1232 ldrd r1, r2, [r7, #200] @ 0xc8
  25703. 800b232: 460b mov r3, r1
  25704. 800b234: 4313 orrs r3, r2
  25705. 800b236: d039 beq.n 800b2ac <HAL_RCCEx_PeriphCLKConfig+0x7c4>
  25706. {
  25707. switch (PeriphClkInit->FmcClockSelection)
  25708. 800b238: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25709. 800b23c: 6c9b ldr r3, [r3, #72] @ 0x48
  25710. 800b23e: 2b03 cmp r3, #3
  25711. 800b240: d81c bhi.n 800b27c <HAL_RCCEx_PeriphCLKConfig+0x794>
  25712. 800b242: a201 add r2, pc, #4 @ (adr r2, 800b248 <HAL_RCCEx_PeriphCLKConfig+0x760>)
  25713. 800b244: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  25714. 800b248: 0800b285 .word 0x0800b285
  25715. 800b24c: 0800b259 .word 0x0800b259
  25716. 800b250: 0800b267 .word 0x0800b267
  25717. 800b254: 0800b285 .word 0x0800b285
  25718. {
  25719. case RCC_FMCCLKSOURCE_PLL: /* PLL is used as clock source for FMC*/
  25720. /* Enable FMC Clock output generated form System PLL . */
  25721. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  25722. 800b258: 4b67 ldr r3, [pc, #412] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25723. 800b25a: 6adb ldr r3, [r3, #44] @ 0x2c
  25724. 800b25c: 4a66 ldr r2, [pc, #408] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25725. 800b25e: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  25726. 800b262: 62d3 str r3, [r2, #44] @ 0x2c
  25727. /* FMC clock source configuration done later after clock selection check */
  25728. break;
  25729. 800b264: e00f b.n 800b286 <HAL_RCCEx_PeriphCLKConfig+0x79e>
  25730. case RCC_FMCCLKSOURCE_PLL2: /* PLL2 is used as clock source for FMC*/
  25731. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_R_UPDATE);
  25732. 800b266: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25733. 800b26a: 3308 adds r3, #8
  25734. 800b26c: 2102 movs r1, #2
  25735. 800b26e: 4618 mov r0, r3
  25736. 800b270: f001 f8e6 bl 800c440 <RCCEx_PLL2_Config>
  25737. 800b274: 4603 mov r3, r0
  25738. 800b276: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25739. /* FMC clock source configuration done later after clock selection check */
  25740. break;
  25741. 800b27a: e004 b.n 800b286 <HAL_RCCEx_PeriphCLKConfig+0x79e>
  25742. case RCC_FMCCLKSOURCE_HCLK:
  25743. /* D1/CD HCLK clock selected as FMC kernel peripheral clock */
  25744. break;
  25745. default:
  25746. ret = HAL_ERROR;
  25747. 800b27c: 2301 movs r3, #1
  25748. 800b27e: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25749. break;
  25750. 800b282: e000 b.n 800b286 <HAL_RCCEx_PeriphCLKConfig+0x79e>
  25751. break;
  25752. 800b284: bf00 nop
  25753. }
  25754. if (ret == HAL_OK)
  25755. 800b286: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25756. 800b28a: 2b00 cmp r3, #0
  25757. 800b28c: d10a bne.n 800b2a4 <HAL_RCCEx_PeriphCLKConfig+0x7bc>
  25758. {
  25759. /* Set the source of FMC clock*/
  25760. __HAL_RCC_FMC_CONFIG(PeriphClkInit->FmcClockSelection);
  25761. 800b28e: 4b5a ldr r3, [pc, #360] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25762. 800b290: 6cdb ldr r3, [r3, #76] @ 0x4c
  25763. 800b292: f023 0103 bic.w r1, r3, #3
  25764. 800b296: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25765. 800b29a: 6c9b ldr r3, [r3, #72] @ 0x48
  25766. 800b29c: 4a56 ldr r2, [pc, #344] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25767. 800b29e: 430b orrs r3, r1
  25768. 800b2a0: 64d3 str r3, [r2, #76] @ 0x4c
  25769. 800b2a2: e003 b.n 800b2ac <HAL_RCCEx_PeriphCLKConfig+0x7c4>
  25770. }
  25771. else
  25772. {
  25773. /* set overall return value */
  25774. status = ret;
  25775. 800b2a4: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25776. 800b2a8: f887 311e strb.w r3, [r7, #286] @ 0x11e
  25777. }
  25778. }
  25779. /*---------------------------- RTC configuration -------------------------------*/
  25780. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC)
  25781. 800b2ac: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25782. 800b2b0: e9d3 2300 ldrd r2, r3, [r3]
  25783. 800b2b4: f402 0380 and.w r3, r2, #4194304 @ 0x400000
  25784. 800b2b8: f8c7 30c0 str.w r3, [r7, #192] @ 0xc0
  25785. 800b2bc: 2300 movs r3, #0
  25786. 800b2be: f8c7 30c4 str.w r3, [r7, #196] @ 0xc4
  25787. 800b2c2: e9d7 1230 ldrd r1, r2, [r7, #192] @ 0xc0
  25788. 800b2c6: 460b mov r3, r1
  25789. 800b2c8: 4313 orrs r3, r2
  25790. 800b2ca: f000 809f beq.w 800b40c <HAL_RCCEx_PeriphCLKConfig+0x924>
  25791. {
  25792. /* check for RTC Parameters used to output RTCCLK */
  25793. assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection));
  25794. /* Enable write access to Backup domain */
  25795. SET_BIT(PWR->CR1, PWR_CR1_DBP);
  25796. 800b2ce: 4b4b ldr r3, [pc, #300] @ (800b3fc <HAL_RCCEx_PeriphCLKConfig+0x914>)
  25797. 800b2d0: 681b ldr r3, [r3, #0]
  25798. 800b2d2: 4a4a ldr r2, [pc, #296] @ (800b3fc <HAL_RCCEx_PeriphCLKConfig+0x914>)
  25799. 800b2d4: f443 7380 orr.w r3, r3, #256 @ 0x100
  25800. 800b2d8: 6013 str r3, [r2, #0]
  25801. /* Wait for Backup domain Write protection disable */
  25802. tickstart = HAL_GetTick();
  25803. 800b2da: f7f9 fea9 bl 8005030 <HAL_GetTick>
  25804. 800b2de: f8c7 0118 str.w r0, [r7, #280] @ 0x118
  25805. while ((PWR->CR1 & PWR_CR1_DBP) == 0U)
  25806. 800b2e2: e00b b.n 800b2fc <HAL_RCCEx_PeriphCLKConfig+0x814>
  25807. {
  25808. if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)
  25809. 800b2e4: f7f9 fea4 bl 8005030 <HAL_GetTick>
  25810. 800b2e8: 4602 mov r2, r0
  25811. 800b2ea: f8d7 3118 ldr.w r3, [r7, #280] @ 0x118
  25812. 800b2ee: 1ad3 subs r3, r2, r3
  25813. 800b2f0: 2b64 cmp r3, #100 @ 0x64
  25814. 800b2f2: d903 bls.n 800b2fc <HAL_RCCEx_PeriphCLKConfig+0x814>
  25815. {
  25816. ret = HAL_TIMEOUT;
  25817. 800b2f4: 2303 movs r3, #3
  25818. 800b2f6: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25819. break;
  25820. 800b2fa: e005 b.n 800b308 <HAL_RCCEx_PeriphCLKConfig+0x820>
  25821. while ((PWR->CR1 & PWR_CR1_DBP) == 0U)
  25822. 800b2fc: 4b3f ldr r3, [pc, #252] @ (800b3fc <HAL_RCCEx_PeriphCLKConfig+0x914>)
  25823. 800b2fe: 681b ldr r3, [r3, #0]
  25824. 800b300: f403 7380 and.w r3, r3, #256 @ 0x100
  25825. 800b304: 2b00 cmp r3, #0
  25826. 800b306: d0ed beq.n 800b2e4 <HAL_RCCEx_PeriphCLKConfig+0x7fc>
  25827. }
  25828. }
  25829. if (ret == HAL_OK)
  25830. 800b308: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25831. 800b30c: 2b00 cmp r3, #0
  25832. 800b30e: d179 bne.n 800b404 <HAL_RCCEx_PeriphCLKConfig+0x91c>
  25833. {
  25834. /* Reset the Backup domain only if the RTC Clock source selection is modified */
  25835. if ((RCC->BDCR & RCC_BDCR_RTCSEL) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))
  25836. 800b310: 4b39 ldr r3, [pc, #228] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25837. 800b312: 6f1a ldr r2, [r3, #112] @ 0x70
  25838. 800b314: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25839. 800b318: f8d3 30b4 ldr.w r3, [r3, #180] @ 0xb4
  25840. 800b31c: 4053 eors r3, r2
  25841. 800b31e: f403 7340 and.w r3, r3, #768 @ 0x300
  25842. 800b322: 2b00 cmp r3, #0
  25843. 800b324: d015 beq.n 800b352 <HAL_RCCEx_PeriphCLKConfig+0x86a>
  25844. {
  25845. /* Store the content of BDCR register before the reset of Backup Domain */
  25846. tmpreg = (RCC->BDCR & ~(RCC_BDCR_RTCSEL));
  25847. 800b326: 4b34 ldr r3, [pc, #208] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25848. 800b328: 6f1b ldr r3, [r3, #112] @ 0x70
  25849. 800b32a: f423 7340 bic.w r3, r3, #768 @ 0x300
  25850. 800b32e: f8c7 3114 str.w r3, [r7, #276] @ 0x114
  25851. /* RTC Clock selection can be changed only if the Backup Domain is reset */
  25852. __HAL_RCC_BACKUPRESET_FORCE();
  25853. 800b332: 4b31 ldr r3, [pc, #196] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25854. 800b334: 6f1b ldr r3, [r3, #112] @ 0x70
  25855. 800b336: 4a30 ldr r2, [pc, #192] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25856. 800b338: f443 3380 orr.w r3, r3, #65536 @ 0x10000
  25857. 800b33c: 6713 str r3, [r2, #112] @ 0x70
  25858. __HAL_RCC_BACKUPRESET_RELEASE();
  25859. 800b33e: 4b2e ldr r3, [pc, #184] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25860. 800b340: 6f1b ldr r3, [r3, #112] @ 0x70
  25861. 800b342: 4a2d ldr r2, [pc, #180] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25862. 800b344: f423 3380 bic.w r3, r3, #65536 @ 0x10000
  25863. 800b348: 6713 str r3, [r2, #112] @ 0x70
  25864. /* Restore the Content of BDCR register */
  25865. RCC->BDCR = tmpreg;
  25866. 800b34a: 4a2b ldr r2, [pc, #172] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25867. 800b34c: f8d7 3114 ldr.w r3, [r7, #276] @ 0x114
  25868. 800b350: 6713 str r3, [r2, #112] @ 0x70
  25869. }
  25870. /* If LSE is selected as RTC clock source (and enabled prior to Backup Domain reset), wait for LSE reactivation */
  25871. if (PeriphClkInit->RTCClockSelection == RCC_RTCCLKSOURCE_LSE)
  25872. 800b352: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25873. 800b356: f8d3 30b4 ldr.w r3, [r3, #180] @ 0xb4
  25874. 800b35a: f5b3 7f80 cmp.w r3, #256 @ 0x100
  25875. 800b35e: d118 bne.n 800b392 <HAL_RCCEx_PeriphCLKConfig+0x8aa>
  25876. {
  25877. /* Get Start Tick*/
  25878. tickstart = HAL_GetTick();
  25879. 800b360: f7f9 fe66 bl 8005030 <HAL_GetTick>
  25880. 800b364: f8c7 0118 str.w r0, [r7, #280] @ 0x118
  25881. /* Wait till LSE is ready */
  25882. while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U)
  25883. 800b368: e00d b.n 800b386 <HAL_RCCEx_PeriphCLKConfig+0x89e>
  25884. {
  25885. if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
  25886. 800b36a: f7f9 fe61 bl 8005030 <HAL_GetTick>
  25887. 800b36e: 4602 mov r2, r0
  25888. 800b370: f8d7 3118 ldr.w r3, [r7, #280] @ 0x118
  25889. 800b374: 1ad2 subs r2, r2, r3
  25890. 800b376: f241 3388 movw r3, #5000 @ 0x1388
  25891. 800b37a: 429a cmp r2, r3
  25892. 800b37c: d903 bls.n 800b386 <HAL_RCCEx_PeriphCLKConfig+0x89e>
  25893. {
  25894. ret = HAL_TIMEOUT;
  25895. 800b37e: 2303 movs r3, #3
  25896. 800b380: f887 311f strb.w r3, [r7, #287] @ 0x11f
  25897. break;
  25898. 800b384: e005 b.n 800b392 <HAL_RCCEx_PeriphCLKConfig+0x8aa>
  25899. while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U)
  25900. 800b386: 4b1c ldr r3, [pc, #112] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25901. 800b388: 6f1b ldr r3, [r3, #112] @ 0x70
  25902. 800b38a: f003 0302 and.w r3, r3, #2
  25903. 800b38e: 2b00 cmp r3, #0
  25904. 800b390: d0eb beq.n 800b36a <HAL_RCCEx_PeriphCLKConfig+0x882>
  25905. }
  25906. }
  25907. }
  25908. if (ret == HAL_OK)
  25909. 800b392: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25910. 800b396: 2b00 cmp r3, #0
  25911. 800b398: d129 bne.n 800b3ee <HAL_RCCEx_PeriphCLKConfig+0x906>
  25912. {
  25913. __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection);
  25914. 800b39a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25915. 800b39e: f8d3 30b4 ldr.w r3, [r3, #180] @ 0xb4
  25916. 800b3a2: f403 7340 and.w r3, r3, #768 @ 0x300
  25917. 800b3a6: f5b3 7f40 cmp.w r3, #768 @ 0x300
  25918. 800b3aa: d10e bne.n 800b3ca <HAL_RCCEx_PeriphCLKConfig+0x8e2>
  25919. 800b3ac: 4b12 ldr r3, [pc, #72] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25920. 800b3ae: 691b ldr r3, [r3, #16]
  25921. 800b3b0: f423 517c bic.w r1, r3, #16128 @ 0x3f00
  25922. 800b3b4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25923. 800b3b8: f8d3 30b4 ldr.w r3, [r3, #180] @ 0xb4
  25924. 800b3bc: 091a lsrs r2, r3, #4
  25925. 800b3be: 4b10 ldr r3, [pc, #64] @ (800b400 <HAL_RCCEx_PeriphCLKConfig+0x918>)
  25926. 800b3c0: 4013 ands r3, r2
  25927. 800b3c2: 4a0d ldr r2, [pc, #52] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25928. 800b3c4: 430b orrs r3, r1
  25929. 800b3c6: 6113 str r3, [r2, #16]
  25930. 800b3c8: e005 b.n 800b3d6 <HAL_RCCEx_PeriphCLKConfig+0x8ee>
  25931. 800b3ca: 4b0b ldr r3, [pc, #44] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25932. 800b3cc: 691b ldr r3, [r3, #16]
  25933. 800b3ce: 4a0a ldr r2, [pc, #40] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25934. 800b3d0: f423 537c bic.w r3, r3, #16128 @ 0x3f00
  25935. 800b3d4: 6113 str r3, [r2, #16]
  25936. 800b3d6: 4b08 ldr r3, [pc, #32] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25937. 800b3d8: 6f19 ldr r1, [r3, #112] @ 0x70
  25938. 800b3da: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25939. 800b3de: f8d3 30b4 ldr.w r3, [r3, #180] @ 0xb4
  25940. 800b3e2: f3c3 030b ubfx r3, r3, #0, #12
  25941. 800b3e6: 4a04 ldr r2, [pc, #16] @ (800b3f8 <HAL_RCCEx_PeriphCLKConfig+0x910>)
  25942. 800b3e8: 430b orrs r3, r1
  25943. 800b3ea: 6713 str r3, [r2, #112] @ 0x70
  25944. 800b3ec: e00e b.n 800b40c <HAL_RCCEx_PeriphCLKConfig+0x924>
  25945. }
  25946. else
  25947. {
  25948. /* set overall return value */
  25949. status = ret;
  25950. 800b3ee: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25951. 800b3f2: f887 311e strb.w r3, [r7, #286] @ 0x11e
  25952. 800b3f6: e009 b.n 800b40c <HAL_RCCEx_PeriphCLKConfig+0x924>
  25953. 800b3f8: 58024400 .word 0x58024400
  25954. 800b3fc: 58024800 .word 0x58024800
  25955. 800b400: 00ffffcf .word 0x00ffffcf
  25956. }
  25957. }
  25958. else
  25959. {
  25960. /* set overall return value */
  25961. status = ret;
  25962. 800b404: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  25963. 800b408: f887 311e strb.w r3, [r7, #286] @ 0x11e
  25964. }
  25965. }
  25966. /*-------------------------- USART1/6 configuration --------------------------*/
  25967. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART16) == RCC_PERIPHCLK_USART16)
  25968. 800b40c: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25969. 800b410: e9d3 2300 ldrd r2, r3, [r3]
  25970. 800b414: f002 0301 and.w r3, r2, #1
  25971. 800b418: f8c7 30b8 str.w r3, [r7, #184] @ 0xb8
  25972. 800b41c: 2300 movs r3, #0
  25973. 800b41e: f8c7 30bc str.w r3, [r7, #188] @ 0xbc
  25974. 800b422: e9d7 122e ldrd r1, r2, [r7, #184] @ 0xb8
  25975. 800b426: 460b mov r3, r1
  25976. 800b428: 4313 orrs r3, r2
  25977. 800b42a: f000 8089 beq.w 800b540 <HAL_RCCEx_PeriphCLKConfig+0xa58>
  25978. {
  25979. switch (PeriphClkInit->Usart16ClockSelection)
  25980. 800b42e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  25981. 800b432: 6fdb ldr r3, [r3, #124] @ 0x7c
  25982. 800b434: 2b28 cmp r3, #40 @ 0x28
  25983. 800b436: d86b bhi.n 800b510 <HAL_RCCEx_PeriphCLKConfig+0xa28>
  25984. 800b438: a201 add r2, pc, #4 @ (adr r2, 800b440 <HAL_RCCEx_PeriphCLKConfig+0x958>)
  25985. 800b43a: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  25986. 800b43e: bf00 nop
  25987. 800b440: 0800b519 .word 0x0800b519
  25988. 800b444: 0800b511 .word 0x0800b511
  25989. 800b448: 0800b511 .word 0x0800b511
  25990. 800b44c: 0800b511 .word 0x0800b511
  25991. 800b450: 0800b511 .word 0x0800b511
  25992. 800b454: 0800b511 .word 0x0800b511
  25993. 800b458: 0800b511 .word 0x0800b511
  25994. 800b45c: 0800b511 .word 0x0800b511
  25995. 800b460: 0800b4e5 .word 0x0800b4e5
  25996. 800b464: 0800b511 .word 0x0800b511
  25997. 800b468: 0800b511 .word 0x0800b511
  25998. 800b46c: 0800b511 .word 0x0800b511
  25999. 800b470: 0800b511 .word 0x0800b511
  26000. 800b474: 0800b511 .word 0x0800b511
  26001. 800b478: 0800b511 .word 0x0800b511
  26002. 800b47c: 0800b511 .word 0x0800b511
  26003. 800b480: 0800b4fb .word 0x0800b4fb
  26004. 800b484: 0800b511 .word 0x0800b511
  26005. 800b488: 0800b511 .word 0x0800b511
  26006. 800b48c: 0800b511 .word 0x0800b511
  26007. 800b490: 0800b511 .word 0x0800b511
  26008. 800b494: 0800b511 .word 0x0800b511
  26009. 800b498: 0800b511 .word 0x0800b511
  26010. 800b49c: 0800b511 .word 0x0800b511
  26011. 800b4a0: 0800b519 .word 0x0800b519
  26012. 800b4a4: 0800b511 .word 0x0800b511
  26013. 800b4a8: 0800b511 .word 0x0800b511
  26014. 800b4ac: 0800b511 .word 0x0800b511
  26015. 800b4b0: 0800b511 .word 0x0800b511
  26016. 800b4b4: 0800b511 .word 0x0800b511
  26017. 800b4b8: 0800b511 .word 0x0800b511
  26018. 800b4bc: 0800b511 .word 0x0800b511
  26019. 800b4c0: 0800b519 .word 0x0800b519
  26020. 800b4c4: 0800b511 .word 0x0800b511
  26021. 800b4c8: 0800b511 .word 0x0800b511
  26022. 800b4cc: 0800b511 .word 0x0800b511
  26023. 800b4d0: 0800b511 .word 0x0800b511
  26024. 800b4d4: 0800b511 .word 0x0800b511
  26025. 800b4d8: 0800b511 .word 0x0800b511
  26026. 800b4dc: 0800b511 .word 0x0800b511
  26027. 800b4e0: 0800b519 .word 0x0800b519
  26028. case RCC_USART16CLKSOURCE_PCLK2: /* CD/D2 PCLK2 as clock source for USART1/6 */
  26029. /* USART1/6 clock source configuration done later after clock selection check */
  26030. break;
  26031. case RCC_USART16CLKSOURCE_PLL2: /* PLL2 is used as clock source for USART1/6 */
  26032. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_Q_UPDATE);
  26033. 800b4e4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26034. 800b4e8: 3308 adds r3, #8
  26035. 800b4ea: 2101 movs r1, #1
  26036. 800b4ec: 4618 mov r0, r3
  26037. 800b4ee: f000 ffa7 bl 800c440 <RCCEx_PLL2_Config>
  26038. 800b4f2: 4603 mov r3, r0
  26039. 800b4f4: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26040. /* USART1/6 clock source configuration done later after clock selection check */
  26041. break;
  26042. 800b4f8: e00f b.n 800b51a <HAL_RCCEx_PeriphCLKConfig+0xa32>
  26043. case RCC_USART16CLKSOURCE_PLL3: /* PLL3 is used as clock source for USART1/6 */
  26044. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_Q_UPDATE);
  26045. 800b4fa: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26046. 800b4fe: 3328 adds r3, #40 @ 0x28
  26047. 800b500: 2101 movs r1, #1
  26048. 800b502: 4618 mov r0, r3
  26049. 800b504: f001 f84e bl 800c5a4 <RCCEx_PLL3_Config>
  26050. 800b508: 4603 mov r3, r0
  26051. 800b50a: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26052. /* USART1/6 clock source configuration done later after clock selection check */
  26053. break;
  26054. 800b50e: e004 b.n 800b51a <HAL_RCCEx_PeriphCLKConfig+0xa32>
  26055. /* LSE, oscillator is used as source of USART1/6 clock */
  26056. /* USART1/6 clock source configuration done later after clock selection check */
  26057. break;
  26058. default:
  26059. ret = HAL_ERROR;
  26060. 800b510: 2301 movs r3, #1
  26061. 800b512: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26062. break;
  26063. 800b516: e000 b.n 800b51a <HAL_RCCEx_PeriphCLKConfig+0xa32>
  26064. break;
  26065. 800b518: bf00 nop
  26066. }
  26067. if (ret == HAL_OK)
  26068. 800b51a: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26069. 800b51e: 2b00 cmp r3, #0
  26070. 800b520: d10a bne.n 800b538 <HAL_RCCEx_PeriphCLKConfig+0xa50>
  26071. {
  26072. /* Set the source of USART1/6 clock */
  26073. __HAL_RCC_USART16_CONFIG(PeriphClkInit->Usart16ClockSelection);
  26074. 800b522: 4bbf ldr r3, [pc, #764] @ (800b820 <HAL_RCCEx_PeriphCLKConfig+0xd38>)
  26075. 800b524: 6d5b ldr r3, [r3, #84] @ 0x54
  26076. 800b526: f023 0138 bic.w r1, r3, #56 @ 0x38
  26077. 800b52a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26078. 800b52e: 6fdb ldr r3, [r3, #124] @ 0x7c
  26079. 800b530: 4abb ldr r2, [pc, #748] @ (800b820 <HAL_RCCEx_PeriphCLKConfig+0xd38>)
  26080. 800b532: 430b orrs r3, r1
  26081. 800b534: 6553 str r3, [r2, #84] @ 0x54
  26082. 800b536: e003 b.n 800b540 <HAL_RCCEx_PeriphCLKConfig+0xa58>
  26083. }
  26084. else
  26085. {
  26086. /* set overall return value */
  26087. status = ret;
  26088. 800b538: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26089. 800b53c: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26090. }
  26091. }
  26092. /*-------------------------- USART2/3/4/5/7/8 Configuration --------------------------*/
  26093. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART234578) == RCC_PERIPHCLK_USART234578)
  26094. 800b540: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26095. 800b544: e9d3 2300 ldrd r2, r3, [r3]
  26096. 800b548: f002 0302 and.w r3, r2, #2
  26097. 800b54c: f8c7 30b0 str.w r3, [r7, #176] @ 0xb0
  26098. 800b550: 2300 movs r3, #0
  26099. 800b552: f8c7 30b4 str.w r3, [r7, #180] @ 0xb4
  26100. 800b556: e9d7 122c ldrd r1, r2, [r7, #176] @ 0xb0
  26101. 800b55a: 460b mov r3, r1
  26102. 800b55c: 4313 orrs r3, r2
  26103. 800b55e: d041 beq.n 800b5e4 <HAL_RCCEx_PeriphCLKConfig+0xafc>
  26104. {
  26105. switch (PeriphClkInit->Usart234578ClockSelection)
  26106. 800b560: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26107. 800b564: 6f9b ldr r3, [r3, #120] @ 0x78
  26108. 800b566: 2b05 cmp r3, #5
  26109. 800b568: d824 bhi.n 800b5b4 <HAL_RCCEx_PeriphCLKConfig+0xacc>
  26110. 800b56a: a201 add r2, pc, #4 @ (adr r2, 800b570 <HAL_RCCEx_PeriphCLKConfig+0xa88>)
  26111. 800b56c: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  26112. 800b570: 0800b5bd .word 0x0800b5bd
  26113. 800b574: 0800b589 .word 0x0800b589
  26114. 800b578: 0800b59f .word 0x0800b59f
  26115. 800b57c: 0800b5bd .word 0x0800b5bd
  26116. 800b580: 0800b5bd .word 0x0800b5bd
  26117. 800b584: 0800b5bd .word 0x0800b5bd
  26118. case RCC_USART234578CLKSOURCE_PCLK1: /* CD/D2 PCLK1 as clock source for USART2/3/4/5/7/8 */
  26119. /* USART2/3/4/5/7/8 clock source configuration done later after clock selection check */
  26120. break;
  26121. case RCC_USART234578CLKSOURCE_PLL2: /* PLL2 is used as clock source for USART2/3/4/5/7/8 */
  26122. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_Q_UPDATE);
  26123. 800b588: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26124. 800b58c: 3308 adds r3, #8
  26125. 800b58e: 2101 movs r1, #1
  26126. 800b590: 4618 mov r0, r3
  26127. 800b592: f000 ff55 bl 800c440 <RCCEx_PLL2_Config>
  26128. 800b596: 4603 mov r3, r0
  26129. 800b598: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26130. /* USART2/3/4/5/7/8 clock source configuration done later after clock selection check */
  26131. break;
  26132. 800b59c: e00f b.n 800b5be <HAL_RCCEx_PeriphCLKConfig+0xad6>
  26133. case RCC_USART234578CLKSOURCE_PLL3: /* PLL3 is used as clock source for USART2/3/4/5/7/8 */
  26134. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_Q_UPDATE);
  26135. 800b59e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26136. 800b5a2: 3328 adds r3, #40 @ 0x28
  26137. 800b5a4: 2101 movs r1, #1
  26138. 800b5a6: 4618 mov r0, r3
  26139. 800b5a8: f000 fffc bl 800c5a4 <RCCEx_PLL3_Config>
  26140. 800b5ac: 4603 mov r3, r0
  26141. 800b5ae: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26142. /* USART2/3/4/5/7/8 clock source configuration done later after clock selection check */
  26143. break;
  26144. 800b5b2: e004 b.n 800b5be <HAL_RCCEx_PeriphCLKConfig+0xad6>
  26145. /* LSE, oscillator is used as source of USART2/3/4/5/7/8 clock */
  26146. /* USART2/3/4/5/7/8 clock source configuration done later after clock selection check */
  26147. break;
  26148. default:
  26149. ret = HAL_ERROR;
  26150. 800b5b4: 2301 movs r3, #1
  26151. 800b5b6: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26152. break;
  26153. 800b5ba: e000 b.n 800b5be <HAL_RCCEx_PeriphCLKConfig+0xad6>
  26154. break;
  26155. 800b5bc: bf00 nop
  26156. }
  26157. if (ret == HAL_OK)
  26158. 800b5be: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26159. 800b5c2: 2b00 cmp r3, #0
  26160. 800b5c4: d10a bne.n 800b5dc <HAL_RCCEx_PeriphCLKConfig+0xaf4>
  26161. {
  26162. /* Set the source of USART2/3/4/5/7/8 clock */
  26163. __HAL_RCC_USART234578_CONFIG(PeriphClkInit->Usart234578ClockSelection);
  26164. 800b5c6: 4b96 ldr r3, [pc, #600] @ (800b820 <HAL_RCCEx_PeriphCLKConfig+0xd38>)
  26165. 800b5c8: 6d5b ldr r3, [r3, #84] @ 0x54
  26166. 800b5ca: f023 0107 bic.w r1, r3, #7
  26167. 800b5ce: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26168. 800b5d2: 6f9b ldr r3, [r3, #120] @ 0x78
  26169. 800b5d4: 4a92 ldr r2, [pc, #584] @ (800b820 <HAL_RCCEx_PeriphCLKConfig+0xd38>)
  26170. 800b5d6: 430b orrs r3, r1
  26171. 800b5d8: 6553 str r3, [r2, #84] @ 0x54
  26172. 800b5da: e003 b.n 800b5e4 <HAL_RCCEx_PeriphCLKConfig+0xafc>
  26173. }
  26174. else
  26175. {
  26176. /* set overall return value */
  26177. status = ret;
  26178. 800b5dc: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26179. 800b5e0: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26180. }
  26181. }
  26182. /*-------------------------- LPUART1 Configuration -------------------------*/
  26183. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1)
  26184. 800b5e4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26185. 800b5e8: e9d3 2300 ldrd r2, r3, [r3]
  26186. 800b5ec: f002 0304 and.w r3, r2, #4
  26187. 800b5f0: f8c7 30a8 str.w r3, [r7, #168] @ 0xa8
  26188. 800b5f4: 2300 movs r3, #0
  26189. 800b5f6: f8c7 30ac str.w r3, [r7, #172] @ 0xac
  26190. 800b5fa: e9d7 122a ldrd r1, r2, [r7, #168] @ 0xa8
  26191. 800b5fe: 460b mov r3, r1
  26192. 800b600: 4313 orrs r3, r2
  26193. 800b602: d044 beq.n 800b68e <HAL_RCCEx_PeriphCLKConfig+0xba6>
  26194. {
  26195. switch (PeriphClkInit->Lpuart1ClockSelection)
  26196. 800b604: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26197. 800b608: f8d3 3094 ldr.w r3, [r3, #148] @ 0x94
  26198. 800b60c: 2b05 cmp r3, #5
  26199. 800b60e: d825 bhi.n 800b65c <HAL_RCCEx_PeriphCLKConfig+0xb74>
  26200. 800b610: a201 add r2, pc, #4 @ (adr r2, 800b618 <HAL_RCCEx_PeriphCLKConfig+0xb30>)
  26201. 800b612: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  26202. 800b616: bf00 nop
  26203. 800b618: 0800b665 .word 0x0800b665
  26204. 800b61c: 0800b631 .word 0x0800b631
  26205. 800b620: 0800b647 .word 0x0800b647
  26206. 800b624: 0800b665 .word 0x0800b665
  26207. 800b628: 0800b665 .word 0x0800b665
  26208. 800b62c: 0800b665 .word 0x0800b665
  26209. case RCC_LPUART1CLKSOURCE_PCLK4: /* SRD/D3 PCLK1 (PCLK4) as clock source for LPUART1 */
  26210. /* LPUART1 clock source configuration done later after clock selection check */
  26211. break;
  26212. case RCC_LPUART1CLKSOURCE_PLL2: /* PLL2 is used as clock source for LPUART1 */
  26213. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_Q_UPDATE);
  26214. 800b630: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26215. 800b634: 3308 adds r3, #8
  26216. 800b636: 2101 movs r1, #1
  26217. 800b638: 4618 mov r0, r3
  26218. 800b63a: f000 ff01 bl 800c440 <RCCEx_PLL2_Config>
  26219. 800b63e: 4603 mov r3, r0
  26220. 800b640: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26221. /* LPUART1 clock source configuration done later after clock selection check */
  26222. break;
  26223. 800b644: e00f b.n 800b666 <HAL_RCCEx_PeriphCLKConfig+0xb7e>
  26224. case RCC_LPUART1CLKSOURCE_PLL3: /* PLL3 is used as clock source for LPUART1 */
  26225. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_Q_UPDATE);
  26226. 800b646: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26227. 800b64a: 3328 adds r3, #40 @ 0x28
  26228. 800b64c: 2101 movs r1, #1
  26229. 800b64e: 4618 mov r0, r3
  26230. 800b650: f000 ffa8 bl 800c5a4 <RCCEx_PLL3_Config>
  26231. 800b654: 4603 mov r3, r0
  26232. 800b656: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26233. /* LPUART1 clock source configuration done later after clock selection check */
  26234. break;
  26235. 800b65a: e004 b.n 800b666 <HAL_RCCEx_PeriphCLKConfig+0xb7e>
  26236. /* LSE, oscillator is used as source of LPUART1 clock */
  26237. /* LPUART1 clock source configuration done later after clock selection check */
  26238. break;
  26239. default:
  26240. ret = HAL_ERROR;
  26241. 800b65c: 2301 movs r3, #1
  26242. 800b65e: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26243. break;
  26244. 800b662: e000 b.n 800b666 <HAL_RCCEx_PeriphCLKConfig+0xb7e>
  26245. break;
  26246. 800b664: bf00 nop
  26247. }
  26248. if (ret == HAL_OK)
  26249. 800b666: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26250. 800b66a: 2b00 cmp r3, #0
  26251. 800b66c: d10b bne.n 800b686 <HAL_RCCEx_PeriphCLKConfig+0xb9e>
  26252. {
  26253. /* Set the source of LPUART1 clock */
  26254. __HAL_RCC_LPUART1_CONFIG(PeriphClkInit->Lpuart1ClockSelection);
  26255. 800b66e: 4b6c ldr r3, [pc, #432] @ (800b820 <HAL_RCCEx_PeriphCLKConfig+0xd38>)
  26256. 800b670: 6d9b ldr r3, [r3, #88] @ 0x58
  26257. 800b672: f023 0107 bic.w r1, r3, #7
  26258. 800b676: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26259. 800b67a: f8d3 3094 ldr.w r3, [r3, #148] @ 0x94
  26260. 800b67e: 4a68 ldr r2, [pc, #416] @ (800b820 <HAL_RCCEx_PeriphCLKConfig+0xd38>)
  26261. 800b680: 430b orrs r3, r1
  26262. 800b682: 6593 str r3, [r2, #88] @ 0x58
  26263. 800b684: e003 b.n 800b68e <HAL_RCCEx_PeriphCLKConfig+0xba6>
  26264. }
  26265. else
  26266. {
  26267. /* set overall return value */
  26268. status = ret;
  26269. 800b686: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26270. 800b68a: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26271. }
  26272. }
  26273. /*---------------------------- LPTIM1 configuration -------------------------------*/
  26274. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1)
  26275. 800b68e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26276. 800b692: e9d3 2300 ldrd r2, r3, [r3]
  26277. 800b696: f002 0320 and.w r3, r2, #32
  26278. 800b69a: f8c7 30a0 str.w r3, [r7, #160] @ 0xa0
  26279. 800b69e: 2300 movs r3, #0
  26280. 800b6a0: f8c7 30a4 str.w r3, [r7, #164] @ 0xa4
  26281. 800b6a4: e9d7 1228 ldrd r1, r2, [r7, #160] @ 0xa0
  26282. 800b6a8: 460b mov r3, r1
  26283. 800b6aa: 4313 orrs r3, r2
  26284. 800b6ac: d055 beq.n 800b75a <HAL_RCCEx_PeriphCLKConfig+0xc72>
  26285. {
  26286. switch (PeriphClkInit->Lptim1ClockSelection)
  26287. 800b6ae: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26288. 800b6b2: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  26289. 800b6b6: f1b3 4fa0 cmp.w r3, #1342177280 @ 0x50000000
  26290. 800b6ba: d033 beq.n 800b724 <HAL_RCCEx_PeriphCLKConfig+0xc3c>
  26291. 800b6bc: f1b3 4fa0 cmp.w r3, #1342177280 @ 0x50000000
  26292. 800b6c0: d82c bhi.n 800b71c <HAL_RCCEx_PeriphCLKConfig+0xc34>
  26293. 800b6c2: f1b3 4f80 cmp.w r3, #1073741824 @ 0x40000000
  26294. 800b6c6: d02f beq.n 800b728 <HAL_RCCEx_PeriphCLKConfig+0xc40>
  26295. 800b6c8: f1b3 4f80 cmp.w r3, #1073741824 @ 0x40000000
  26296. 800b6cc: d826 bhi.n 800b71c <HAL_RCCEx_PeriphCLKConfig+0xc34>
  26297. 800b6ce: f1b3 5f40 cmp.w r3, #805306368 @ 0x30000000
  26298. 800b6d2: d02b beq.n 800b72c <HAL_RCCEx_PeriphCLKConfig+0xc44>
  26299. 800b6d4: f1b3 5f40 cmp.w r3, #805306368 @ 0x30000000
  26300. 800b6d8: d820 bhi.n 800b71c <HAL_RCCEx_PeriphCLKConfig+0xc34>
  26301. 800b6da: f1b3 5f00 cmp.w r3, #536870912 @ 0x20000000
  26302. 800b6de: d012 beq.n 800b706 <HAL_RCCEx_PeriphCLKConfig+0xc1e>
  26303. 800b6e0: f1b3 5f00 cmp.w r3, #536870912 @ 0x20000000
  26304. 800b6e4: d81a bhi.n 800b71c <HAL_RCCEx_PeriphCLKConfig+0xc34>
  26305. 800b6e6: 2b00 cmp r3, #0
  26306. 800b6e8: d022 beq.n 800b730 <HAL_RCCEx_PeriphCLKConfig+0xc48>
  26307. 800b6ea: f1b3 5f80 cmp.w r3, #268435456 @ 0x10000000
  26308. 800b6ee: d115 bne.n 800b71c <HAL_RCCEx_PeriphCLKConfig+0xc34>
  26309. /* LPTIM1 clock source configuration done later after clock selection check */
  26310. break;
  26311. case RCC_LPTIM1CLKSOURCE_PLL2: /* PLL2 is used as clock source for LPTIM1*/
  26312. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_P_UPDATE);
  26313. 800b6f0: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26314. 800b6f4: 3308 adds r3, #8
  26315. 800b6f6: 2100 movs r1, #0
  26316. 800b6f8: 4618 mov r0, r3
  26317. 800b6fa: f000 fea1 bl 800c440 <RCCEx_PLL2_Config>
  26318. 800b6fe: 4603 mov r3, r0
  26319. 800b700: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26320. /* LPTIM1 clock source configuration done later after clock selection check */
  26321. break;
  26322. 800b704: e015 b.n 800b732 <HAL_RCCEx_PeriphCLKConfig+0xc4a>
  26323. case RCC_LPTIM1CLKSOURCE_PLL3: /* PLL3 is used as clock source for LPTIM1*/
  26324. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_R_UPDATE);
  26325. 800b706: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26326. 800b70a: 3328 adds r3, #40 @ 0x28
  26327. 800b70c: 2102 movs r1, #2
  26328. 800b70e: 4618 mov r0, r3
  26329. 800b710: f000 ff48 bl 800c5a4 <RCCEx_PLL3_Config>
  26330. 800b714: 4603 mov r3, r0
  26331. 800b716: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26332. /* LPTIM1 clock source configuration done later after clock selection check */
  26333. break;
  26334. 800b71a: e00a b.n 800b732 <HAL_RCCEx_PeriphCLKConfig+0xc4a>
  26335. /* HSI, HSE, or CSI oscillator is used as source of LPTIM1 clock */
  26336. /* LPTIM1 clock source configuration done later after clock selection check */
  26337. break;
  26338. default:
  26339. ret = HAL_ERROR;
  26340. 800b71c: 2301 movs r3, #1
  26341. 800b71e: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26342. break;
  26343. 800b722: e006 b.n 800b732 <HAL_RCCEx_PeriphCLKConfig+0xc4a>
  26344. break;
  26345. 800b724: bf00 nop
  26346. 800b726: e004 b.n 800b732 <HAL_RCCEx_PeriphCLKConfig+0xc4a>
  26347. break;
  26348. 800b728: bf00 nop
  26349. 800b72a: e002 b.n 800b732 <HAL_RCCEx_PeriphCLKConfig+0xc4a>
  26350. break;
  26351. 800b72c: bf00 nop
  26352. 800b72e: e000 b.n 800b732 <HAL_RCCEx_PeriphCLKConfig+0xc4a>
  26353. break;
  26354. 800b730: bf00 nop
  26355. }
  26356. if (ret == HAL_OK)
  26357. 800b732: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26358. 800b736: 2b00 cmp r3, #0
  26359. 800b738: d10b bne.n 800b752 <HAL_RCCEx_PeriphCLKConfig+0xc6a>
  26360. {
  26361. /* Set the source of LPTIM1 clock*/
  26362. __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection);
  26363. 800b73a: 4b39 ldr r3, [pc, #228] @ (800b820 <HAL_RCCEx_PeriphCLKConfig+0xd38>)
  26364. 800b73c: 6d5b ldr r3, [r3, #84] @ 0x54
  26365. 800b73e: f023 41e0 bic.w r1, r3, #1879048192 @ 0x70000000
  26366. 800b742: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26367. 800b746: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  26368. 800b74a: 4a35 ldr r2, [pc, #212] @ (800b820 <HAL_RCCEx_PeriphCLKConfig+0xd38>)
  26369. 800b74c: 430b orrs r3, r1
  26370. 800b74e: 6553 str r3, [r2, #84] @ 0x54
  26371. 800b750: e003 b.n 800b75a <HAL_RCCEx_PeriphCLKConfig+0xc72>
  26372. }
  26373. else
  26374. {
  26375. /* set overall return value */
  26376. status = ret;
  26377. 800b752: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26378. 800b756: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26379. }
  26380. }
  26381. /*---------------------------- LPTIM2 configuration -------------------------------*/
  26382. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM2) == RCC_PERIPHCLK_LPTIM2)
  26383. 800b75a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26384. 800b75e: e9d3 2300 ldrd r2, r3, [r3]
  26385. 800b762: f002 0340 and.w r3, r2, #64 @ 0x40
  26386. 800b766: f8c7 3098 str.w r3, [r7, #152] @ 0x98
  26387. 800b76a: 2300 movs r3, #0
  26388. 800b76c: f8c7 309c str.w r3, [r7, #156] @ 0x9c
  26389. 800b770: e9d7 1226 ldrd r1, r2, [r7, #152] @ 0x98
  26390. 800b774: 460b mov r3, r1
  26391. 800b776: 4313 orrs r3, r2
  26392. 800b778: d058 beq.n 800b82c <HAL_RCCEx_PeriphCLKConfig+0xd44>
  26393. {
  26394. switch (PeriphClkInit->Lptim2ClockSelection)
  26395. 800b77a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26396. 800b77e: f8d3 309c ldr.w r3, [r3, #156] @ 0x9c
  26397. 800b782: f5b3 5fa0 cmp.w r3, #5120 @ 0x1400
  26398. 800b786: d033 beq.n 800b7f0 <HAL_RCCEx_PeriphCLKConfig+0xd08>
  26399. 800b788: f5b3 5fa0 cmp.w r3, #5120 @ 0x1400
  26400. 800b78c: d82c bhi.n 800b7e8 <HAL_RCCEx_PeriphCLKConfig+0xd00>
  26401. 800b78e: f5b3 5f80 cmp.w r3, #4096 @ 0x1000
  26402. 800b792: d02f beq.n 800b7f4 <HAL_RCCEx_PeriphCLKConfig+0xd0c>
  26403. 800b794: f5b3 5f80 cmp.w r3, #4096 @ 0x1000
  26404. 800b798: d826 bhi.n 800b7e8 <HAL_RCCEx_PeriphCLKConfig+0xd00>
  26405. 800b79a: f5b3 6f40 cmp.w r3, #3072 @ 0xc00
  26406. 800b79e: d02b beq.n 800b7f8 <HAL_RCCEx_PeriphCLKConfig+0xd10>
  26407. 800b7a0: f5b3 6f40 cmp.w r3, #3072 @ 0xc00
  26408. 800b7a4: d820 bhi.n 800b7e8 <HAL_RCCEx_PeriphCLKConfig+0xd00>
  26409. 800b7a6: f5b3 6f00 cmp.w r3, #2048 @ 0x800
  26410. 800b7aa: d012 beq.n 800b7d2 <HAL_RCCEx_PeriphCLKConfig+0xcea>
  26411. 800b7ac: f5b3 6f00 cmp.w r3, #2048 @ 0x800
  26412. 800b7b0: d81a bhi.n 800b7e8 <HAL_RCCEx_PeriphCLKConfig+0xd00>
  26413. 800b7b2: 2b00 cmp r3, #0
  26414. 800b7b4: d022 beq.n 800b7fc <HAL_RCCEx_PeriphCLKConfig+0xd14>
  26415. 800b7b6: f5b3 6f80 cmp.w r3, #1024 @ 0x400
  26416. 800b7ba: d115 bne.n 800b7e8 <HAL_RCCEx_PeriphCLKConfig+0xd00>
  26417. /* LPTIM2 clock source configuration done later after clock selection check */
  26418. break;
  26419. case RCC_LPTIM2CLKSOURCE_PLL2: /* PLL2 is used as clock source for LPTIM2*/
  26420. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_P_UPDATE);
  26421. 800b7bc: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26422. 800b7c0: 3308 adds r3, #8
  26423. 800b7c2: 2100 movs r1, #0
  26424. 800b7c4: 4618 mov r0, r3
  26425. 800b7c6: f000 fe3b bl 800c440 <RCCEx_PLL2_Config>
  26426. 800b7ca: 4603 mov r3, r0
  26427. 800b7cc: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26428. /* LPTIM2 clock source configuration done later after clock selection check */
  26429. break;
  26430. 800b7d0: e015 b.n 800b7fe <HAL_RCCEx_PeriphCLKConfig+0xd16>
  26431. case RCC_LPTIM2CLKSOURCE_PLL3: /* PLL3 is used as clock source for LPTIM2*/
  26432. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_R_UPDATE);
  26433. 800b7d2: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26434. 800b7d6: 3328 adds r3, #40 @ 0x28
  26435. 800b7d8: 2102 movs r1, #2
  26436. 800b7da: 4618 mov r0, r3
  26437. 800b7dc: f000 fee2 bl 800c5a4 <RCCEx_PLL3_Config>
  26438. 800b7e0: 4603 mov r3, r0
  26439. 800b7e2: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26440. /* LPTIM2 clock source configuration done later after clock selection check */
  26441. break;
  26442. 800b7e6: e00a b.n 800b7fe <HAL_RCCEx_PeriphCLKConfig+0xd16>
  26443. /* HSI, HSE, or CSI oscillator is used as source of LPTIM2 clock */
  26444. /* LPTIM2 clock source configuration done later after clock selection check */
  26445. break;
  26446. default:
  26447. ret = HAL_ERROR;
  26448. 800b7e8: 2301 movs r3, #1
  26449. 800b7ea: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26450. break;
  26451. 800b7ee: e006 b.n 800b7fe <HAL_RCCEx_PeriphCLKConfig+0xd16>
  26452. break;
  26453. 800b7f0: bf00 nop
  26454. 800b7f2: e004 b.n 800b7fe <HAL_RCCEx_PeriphCLKConfig+0xd16>
  26455. break;
  26456. 800b7f4: bf00 nop
  26457. 800b7f6: e002 b.n 800b7fe <HAL_RCCEx_PeriphCLKConfig+0xd16>
  26458. break;
  26459. 800b7f8: bf00 nop
  26460. 800b7fa: e000 b.n 800b7fe <HAL_RCCEx_PeriphCLKConfig+0xd16>
  26461. break;
  26462. 800b7fc: bf00 nop
  26463. }
  26464. if (ret == HAL_OK)
  26465. 800b7fe: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26466. 800b802: 2b00 cmp r3, #0
  26467. 800b804: d10e bne.n 800b824 <HAL_RCCEx_PeriphCLKConfig+0xd3c>
  26468. {
  26469. /* Set the source of LPTIM2 clock*/
  26470. __HAL_RCC_LPTIM2_CONFIG(PeriphClkInit->Lptim2ClockSelection);
  26471. 800b806: 4b06 ldr r3, [pc, #24] @ (800b820 <HAL_RCCEx_PeriphCLKConfig+0xd38>)
  26472. 800b808: 6d9b ldr r3, [r3, #88] @ 0x58
  26473. 800b80a: f423 51e0 bic.w r1, r3, #7168 @ 0x1c00
  26474. 800b80e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26475. 800b812: f8d3 309c ldr.w r3, [r3, #156] @ 0x9c
  26476. 800b816: 4a02 ldr r2, [pc, #8] @ (800b820 <HAL_RCCEx_PeriphCLKConfig+0xd38>)
  26477. 800b818: 430b orrs r3, r1
  26478. 800b81a: 6593 str r3, [r2, #88] @ 0x58
  26479. 800b81c: e006 b.n 800b82c <HAL_RCCEx_PeriphCLKConfig+0xd44>
  26480. 800b81e: bf00 nop
  26481. 800b820: 58024400 .word 0x58024400
  26482. }
  26483. else
  26484. {
  26485. /* set overall return value */
  26486. status = ret;
  26487. 800b824: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26488. 800b828: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26489. }
  26490. }
  26491. /*---------------------------- LPTIM345 configuration -------------------------------*/
  26492. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM345) == RCC_PERIPHCLK_LPTIM345)
  26493. 800b82c: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26494. 800b830: e9d3 2300 ldrd r2, r3, [r3]
  26495. 800b834: f002 0380 and.w r3, r2, #128 @ 0x80
  26496. 800b838: f8c7 3090 str.w r3, [r7, #144] @ 0x90
  26497. 800b83c: 2300 movs r3, #0
  26498. 800b83e: f8c7 3094 str.w r3, [r7, #148] @ 0x94
  26499. 800b842: e9d7 1224 ldrd r1, r2, [r7, #144] @ 0x90
  26500. 800b846: 460b mov r3, r1
  26501. 800b848: 4313 orrs r3, r2
  26502. 800b84a: d055 beq.n 800b8f8 <HAL_RCCEx_PeriphCLKConfig+0xe10>
  26503. {
  26504. switch (PeriphClkInit->Lptim345ClockSelection)
  26505. 800b84c: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26506. 800b850: f8d3 30a0 ldr.w r3, [r3, #160] @ 0xa0
  26507. 800b854: f5b3 4f20 cmp.w r3, #40960 @ 0xa000
  26508. 800b858: d033 beq.n 800b8c2 <HAL_RCCEx_PeriphCLKConfig+0xdda>
  26509. 800b85a: f5b3 4f20 cmp.w r3, #40960 @ 0xa000
  26510. 800b85e: d82c bhi.n 800b8ba <HAL_RCCEx_PeriphCLKConfig+0xdd2>
  26511. 800b860: f5b3 4f00 cmp.w r3, #32768 @ 0x8000
  26512. 800b864: d02f beq.n 800b8c6 <HAL_RCCEx_PeriphCLKConfig+0xdde>
  26513. 800b866: f5b3 4f00 cmp.w r3, #32768 @ 0x8000
  26514. 800b86a: d826 bhi.n 800b8ba <HAL_RCCEx_PeriphCLKConfig+0xdd2>
  26515. 800b86c: f5b3 4fc0 cmp.w r3, #24576 @ 0x6000
  26516. 800b870: d02b beq.n 800b8ca <HAL_RCCEx_PeriphCLKConfig+0xde2>
  26517. 800b872: f5b3 4fc0 cmp.w r3, #24576 @ 0x6000
  26518. 800b876: d820 bhi.n 800b8ba <HAL_RCCEx_PeriphCLKConfig+0xdd2>
  26519. 800b878: f5b3 4f80 cmp.w r3, #16384 @ 0x4000
  26520. 800b87c: d012 beq.n 800b8a4 <HAL_RCCEx_PeriphCLKConfig+0xdbc>
  26521. 800b87e: f5b3 4f80 cmp.w r3, #16384 @ 0x4000
  26522. 800b882: d81a bhi.n 800b8ba <HAL_RCCEx_PeriphCLKConfig+0xdd2>
  26523. 800b884: 2b00 cmp r3, #0
  26524. 800b886: d022 beq.n 800b8ce <HAL_RCCEx_PeriphCLKConfig+0xde6>
  26525. 800b888: f5b3 5f00 cmp.w r3, #8192 @ 0x2000
  26526. 800b88c: d115 bne.n 800b8ba <HAL_RCCEx_PeriphCLKConfig+0xdd2>
  26527. case RCC_LPTIM345CLKSOURCE_PCLK4: /* SRD/D3 PCLK1 (PCLK4) as clock source for LPTIM3/4/5 */
  26528. /* LPTIM3/4/5 clock source configuration done later after clock selection check */
  26529. break;
  26530. case RCC_LPTIM345CLKSOURCE_PLL2: /* PLL2 is used as clock source for LPTIM3/4/5 */
  26531. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_P_UPDATE);
  26532. 800b88e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26533. 800b892: 3308 adds r3, #8
  26534. 800b894: 2100 movs r1, #0
  26535. 800b896: 4618 mov r0, r3
  26536. 800b898: f000 fdd2 bl 800c440 <RCCEx_PLL2_Config>
  26537. 800b89c: 4603 mov r3, r0
  26538. 800b89e: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26539. /* LPTIM3/4/5 clock source configuration done later after clock selection check */
  26540. break;
  26541. 800b8a2: e015 b.n 800b8d0 <HAL_RCCEx_PeriphCLKConfig+0xde8>
  26542. case RCC_LPTIM345CLKSOURCE_PLL3: /* PLL3 is used as clock source for LPTIM3/4/5 */
  26543. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_R_UPDATE);
  26544. 800b8a4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26545. 800b8a8: 3328 adds r3, #40 @ 0x28
  26546. 800b8aa: 2102 movs r1, #2
  26547. 800b8ac: 4618 mov r0, r3
  26548. 800b8ae: f000 fe79 bl 800c5a4 <RCCEx_PLL3_Config>
  26549. 800b8b2: 4603 mov r3, r0
  26550. 800b8b4: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26551. /* LPTIM3/4/5 clock source configuration done later after clock selection check */
  26552. break;
  26553. 800b8b8: e00a b.n 800b8d0 <HAL_RCCEx_PeriphCLKConfig+0xde8>
  26554. /* HSI, HSE, or CSI oscillator is used as source of LPTIM3/4/5 clock */
  26555. /* LPTIM3/4/5 clock source configuration done later after clock selection check */
  26556. break;
  26557. default:
  26558. ret = HAL_ERROR;
  26559. 800b8ba: 2301 movs r3, #1
  26560. 800b8bc: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26561. break;
  26562. 800b8c0: e006 b.n 800b8d0 <HAL_RCCEx_PeriphCLKConfig+0xde8>
  26563. break;
  26564. 800b8c2: bf00 nop
  26565. 800b8c4: e004 b.n 800b8d0 <HAL_RCCEx_PeriphCLKConfig+0xde8>
  26566. break;
  26567. 800b8c6: bf00 nop
  26568. 800b8c8: e002 b.n 800b8d0 <HAL_RCCEx_PeriphCLKConfig+0xde8>
  26569. break;
  26570. 800b8ca: bf00 nop
  26571. 800b8cc: e000 b.n 800b8d0 <HAL_RCCEx_PeriphCLKConfig+0xde8>
  26572. break;
  26573. 800b8ce: bf00 nop
  26574. }
  26575. if (ret == HAL_OK)
  26576. 800b8d0: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26577. 800b8d4: 2b00 cmp r3, #0
  26578. 800b8d6: d10b bne.n 800b8f0 <HAL_RCCEx_PeriphCLKConfig+0xe08>
  26579. {
  26580. /* Set the source of LPTIM3/4/5 clock */
  26581. __HAL_RCC_LPTIM345_CONFIG(PeriphClkInit->Lptim345ClockSelection);
  26582. 800b8d8: 4bbb ldr r3, [pc, #748] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26583. 800b8da: 6d9b ldr r3, [r3, #88] @ 0x58
  26584. 800b8dc: f423 4160 bic.w r1, r3, #57344 @ 0xe000
  26585. 800b8e0: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26586. 800b8e4: f8d3 30a0 ldr.w r3, [r3, #160] @ 0xa0
  26587. 800b8e8: 4ab7 ldr r2, [pc, #732] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26588. 800b8ea: 430b orrs r3, r1
  26589. 800b8ec: 6593 str r3, [r2, #88] @ 0x58
  26590. 800b8ee: e003 b.n 800b8f8 <HAL_RCCEx_PeriphCLKConfig+0xe10>
  26591. }
  26592. else
  26593. {
  26594. /* set overall return value */
  26595. status = ret;
  26596. 800b8f0: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26597. 800b8f4: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26598. __HAL_RCC_I2C1235_CONFIG(PeriphClkInit->I2c1235ClockSelection);
  26599. }
  26600. #else
  26601. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C123) == RCC_PERIPHCLK_I2C123)
  26602. 800b8f8: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26603. 800b8fc: e9d3 2300 ldrd r2, r3, [r3]
  26604. 800b900: f002 0308 and.w r3, r2, #8
  26605. 800b904: f8c7 3088 str.w r3, [r7, #136] @ 0x88
  26606. 800b908: 2300 movs r3, #0
  26607. 800b90a: f8c7 308c str.w r3, [r7, #140] @ 0x8c
  26608. 800b90e: e9d7 1222 ldrd r1, r2, [r7, #136] @ 0x88
  26609. 800b912: 460b mov r3, r1
  26610. 800b914: 4313 orrs r3, r2
  26611. 800b916: d01e beq.n 800b956 <HAL_RCCEx_PeriphCLKConfig+0xe6e>
  26612. {
  26613. /* Check the parameters */
  26614. assert_param(IS_RCC_I2C123CLKSOURCE(PeriphClkInit->I2c123ClockSelection));
  26615. if ((PeriphClkInit->I2c123ClockSelection) == RCC_I2C123CLKSOURCE_PLL3)
  26616. 800b918: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26617. 800b91c: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  26618. 800b920: f5b3 5f80 cmp.w r3, #4096 @ 0x1000
  26619. 800b924: d10c bne.n 800b940 <HAL_RCCEx_PeriphCLKConfig+0xe58>
  26620. {
  26621. if (RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_R_UPDATE) != HAL_OK)
  26622. 800b926: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26623. 800b92a: 3328 adds r3, #40 @ 0x28
  26624. 800b92c: 2102 movs r1, #2
  26625. 800b92e: 4618 mov r0, r3
  26626. 800b930: f000 fe38 bl 800c5a4 <RCCEx_PLL3_Config>
  26627. 800b934: 4603 mov r3, r0
  26628. 800b936: 2b00 cmp r3, #0
  26629. 800b938: d002 beq.n 800b940 <HAL_RCCEx_PeriphCLKConfig+0xe58>
  26630. {
  26631. status = HAL_ERROR;
  26632. 800b93a: 2301 movs r3, #1
  26633. 800b93c: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26634. }
  26635. }
  26636. __HAL_RCC_I2C123_CONFIG(PeriphClkInit->I2c123ClockSelection);
  26637. 800b940: 4ba1 ldr r3, [pc, #644] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26638. 800b942: 6d5b ldr r3, [r3, #84] @ 0x54
  26639. 800b944: f423 5140 bic.w r1, r3, #12288 @ 0x3000
  26640. 800b948: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26641. 800b94c: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  26642. 800b950: 4a9d ldr r2, [pc, #628] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26643. 800b952: 430b orrs r3, r1
  26644. 800b954: 6553 str r3, [r2, #84] @ 0x54
  26645. }
  26646. #endif /* I2C5 */
  26647. /*------------------------------ I2C4 Configuration ------------------------*/
  26648. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C4) == RCC_PERIPHCLK_I2C4)
  26649. 800b956: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26650. 800b95a: e9d3 2300 ldrd r2, r3, [r3]
  26651. 800b95e: f002 0310 and.w r3, r2, #16
  26652. 800b962: f8c7 3080 str.w r3, [r7, #128] @ 0x80
  26653. 800b966: 2300 movs r3, #0
  26654. 800b968: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  26655. 800b96c: e9d7 1220 ldrd r1, r2, [r7, #128] @ 0x80
  26656. 800b970: 460b mov r3, r1
  26657. 800b972: 4313 orrs r3, r2
  26658. 800b974: d01e beq.n 800b9b4 <HAL_RCCEx_PeriphCLKConfig+0xecc>
  26659. {
  26660. /* Check the parameters */
  26661. assert_param(IS_RCC_I2C4CLKSOURCE(PeriphClkInit->I2c4ClockSelection));
  26662. if ((PeriphClkInit->I2c4ClockSelection) == RCC_I2C4CLKSOURCE_PLL3)
  26663. 800b976: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26664. 800b97a: f8d3 3098 ldr.w r3, [r3, #152] @ 0x98
  26665. 800b97e: f5b3 7f80 cmp.w r3, #256 @ 0x100
  26666. 800b982: d10c bne.n 800b99e <HAL_RCCEx_PeriphCLKConfig+0xeb6>
  26667. {
  26668. if (RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_R_UPDATE) != HAL_OK)
  26669. 800b984: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26670. 800b988: 3328 adds r3, #40 @ 0x28
  26671. 800b98a: 2102 movs r1, #2
  26672. 800b98c: 4618 mov r0, r3
  26673. 800b98e: f000 fe09 bl 800c5a4 <RCCEx_PLL3_Config>
  26674. 800b992: 4603 mov r3, r0
  26675. 800b994: 2b00 cmp r3, #0
  26676. 800b996: d002 beq.n 800b99e <HAL_RCCEx_PeriphCLKConfig+0xeb6>
  26677. {
  26678. status = HAL_ERROR;
  26679. 800b998: 2301 movs r3, #1
  26680. 800b99a: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26681. }
  26682. }
  26683. __HAL_RCC_I2C4_CONFIG(PeriphClkInit->I2c4ClockSelection);
  26684. 800b99e: 4b8a ldr r3, [pc, #552] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26685. 800b9a0: 6d9b ldr r3, [r3, #88] @ 0x58
  26686. 800b9a2: f423 7140 bic.w r1, r3, #768 @ 0x300
  26687. 800b9a6: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26688. 800b9aa: f8d3 3098 ldr.w r3, [r3, #152] @ 0x98
  26689. 800b9ae: 4a86 ldr r2, [pc, #536] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26690. 800b9b0: 430b orrs r3, r1
  26691. 800b9b2: 6593 str r3, [r2, #88] @ 0x58
  26692. }
  26693. /*---------------------------- ADC configuration -------------------------------*/
  26694. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC)
  26695. 800b9b4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26696. 800b9b8: e9d3 2300 ldrd r2, r3, [r3]
  26697. 800b9bc: f402 2300 and.w r3, r2, #524288 @ 0x80000
  26698. 800b9c0: 67bb str r3, [r7, #120] @ 0x78
  26699. 800b9c2: 2300 movs r3, #0
  26700. 800b9c4: 67fb str r3, [r7, #124] @ 0x7c
  26701. 800b9c6: e9d7 121e ldrd r1, r2, [r7, #120] @ 0x78
  26702. 800b9ca: 460b mov r3, r1
  26703. 800b9cc: 4313 orrs r3, r2
  26704. 800b9ce: d03e beq.n 800ba4e <HAL_RCCEx_PeriphCLKConfig+0xf66>
  26705. {
  26706. switch (PeriphClkInit->AdcClockSelection)
  26707. 800b9d0: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26708. 800b9d4: f8d3 30a4 ldr.w r3, [r3, #164] @ 0xa4
  26709. 800b9d8: f5b3 3f00 cmp.w r3, #131072 @ 0x20000
  26710. 800b9dc: d022 beq.n 800ba24 <HAL_RCCEx_PeriphCLKConfig+0xf3c>
  26711. 800b9de: f5b3 3f00 cmp.w r3, #131072 @ 0x20000
  26712. 800b9e2: d81b bhi.n 800ba1c <HAL_RCCEx_PeriphCLKConfig+0xf34>
  26713. 800b9e4: 2b00 cmp r3, #0
  26714. 800b9e6: d003 beq.n 800b9f0 <HAL_RCCEx_PeriphCLKConfig+0xf08>
  26715. 800b9e8: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  26716. 800b9ec: d00b beq.n 800ba06 <HAL_RCCEx_PeriphCLKConfig+0xf1e>
  26717. 800b9ee: e015 b.n 800ba1c <HAL_RCCEx_PeriphCLKConfig+0xf34>
  26718. {
  26719. case RCC_ADCCLKSOURCE_PLL2: /* PLL2 is used as clock source for ADC*/
  26720. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_P_UPDATE);
  26721. 800b9f0: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26722. 800b9f4: 3308 adds r3, #8
  26723. 800b9f6: 2100 movs r1, #0
  26724. 800b9f8: 4618 mov r0, r3
  26725. 800b9fa: f000 fd21 bl 800c440 <RCCEx_PLL2_Config>
  26726. 800b9fe: 4603 mov r3, r0
  26727. 800ba00: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26728. /* ADC clock source configuration done later after clock selection check */
  26729. break;
  26730. 800ba04: e00f b.n 800ba26 <HAL_RCCEx_PeriphCLKConfig+0xf3e>
  26731. case RCC_ADCCLKSOURCE_PLL3: /* PLL3 is used as clock source for ADC*/
  26732. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_R_UPDATE);
  26733. 800ba06: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26734. 800ba0a: 3328 adds r3, #40 @ 0x28
  26735. 800ba0c: 2102 movs r1, #2
  26736. 800ba0e: 4618 mov r0, r3
  26737. 800ba10: f000 fdc8 bl 800c5a4 <RCCEx_PLL3_Config>
  26738. 800ba14: 4603 mov r3, r0
  26739. 800ba16: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26740. /* ADC clock source configuration done later after clock selection check */
  26741. break;
  26742. 800ba1a: e004 b.n 800ba26 <HAL_RCCEx_PeriphCLKConfig+0xf3e>
  26743. /* HSI, HSE, or CSI oscillator is used as source of ADC clock */
  26744. /* ADC clock source configuration done later after clock selection check */
  26745. break;
  26746. default:
  26747. ret = HAL_ERROR;
  26748. 800ba1c: 2301 movs r3, #1
  26749. 800ba1e: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26750. break;
  26751. 800ba22: e000 b.n 800ba26 <HAL_RCCEx_PeriphCLKConfig+0xf3e>
  26752. break;
  26753. 800ba24: bf00 nop
  26754. }
  26755. if (ret == HAL_OK)
  26756. 800ba26: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26757. 800ba2a: 2b00 cmp r3, #0
  26758. 800ba2c: d10b bne.n 800ba46 <HAL_RCCEx_PeriphCLKConfig+0xf5e>
  26759. {
  26760. /* Set the source of ADC clock*/
  26761. __HAL_RCC_ADC_CONFIG(PeriphClkInit->AdcClockSelection);
  26762. 800ba2e: 4b66 ldr r3, [pc, #408] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26763. 800ba30: 6d9b ldr r3, [r3, #88] @ 0x58
  26764. 800ba32: f423 3140 bic.w r1, r3, #196608 @ 0x30000
  26765. 800ba36: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26766. 800ba3a: f8d3 30a4 ldr.w r3, [r3, #164] @ 0xa4
  26767. 800ba3e: 4a62 ldr r2, [pc, #392] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26768. 800ba40: 430b orrs r3, r1
  26769. 800ba42: 6593 str r3, [r2, #88] @ 0x58
  26770. 800ba44: e003 b.n 800ba4e <HAL_RCCEx_PeriphCLKConfig+0xf66>
  26771. }
  26772. else
  26773. {
  26774. /* set overall return value */
  26775. status = ret;
  26776. 800ba46: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26777. 800ba4a: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26778. }
  26779. }
  26780. /*------------------------------ USB Configuration -------------------------*/
  26781. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USB) == RCC_PERIPHCLK_USB)
  26782. 800ba4e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26783. 800ba52: e9d3 2300 ldrd r2, r3, [r3]
  26784. 800ba56: f402 2380 and.w r3, r2, #262144 @ 0x40000
  26785. 800ba5a: 673b str r3, [r7, #112] @ 0x70
  26786. 800ba5c: 2300 movs r3, #0
  26787. 800ba5e: 677b str r3, [r7, #116] @ 0x74
  26788. 800ba60: e9d7 121c ldrd r1, r2, [r7, #112] @ 0x70
  26789. 800ba64: 460b mov r3, r1
  26790. 800ba66: 4313 orrs r3, r2
  26791. 800ba68: d03b beq.n 800bae2 <HAL_RCCEx_PeriphCLKConfig+0xffa>
  26792. {
  26793. switch (PeriphClkInit->UsbClockSelection)
  26794. 800ba6a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26795. 800ba6e: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  26796. 800ba72: f5b3 1f40 cmp.w r3, #3145728 @ 0x300000
  26797. 800ba76: d01f beq.n 800bab8 <HAL_RCCEx_PeriphCLKConfig+0xfd0>
  26798. 800ba78: f5b3 1f40 cmp.w r3, #3145728 @ 0x300000
  26799. 800ba7c: d818 bhi.n 800bab0 <HAL_RCCEx_PeriphCLKConfig+0xfc8>
  26800. 800ba7e: f5b3 1f80 cmp.w r3, #1048576 @ 0x100000
  26801. 800ba82: d003 beq.n 800ba8c <HAL_RCCEx_PeriphCLKConfig+0xfa4>
  26802. 800ba84: f5b3 1f00 cmp.w r3, #2097152 @ 0x200000
  26803. 800ba88: d007 beq.n 800ba9a <HAL_RCCEx_PeriphCLKConfig+0xfb2>
  26804. 800ba8a: e011 b.n 800bab0 <HAL_RCCEx_PeriphCLKConfig+0xfc8>
  26805. {
  26806. case RCC_USBCLKSOURCE_PLL: /* PLL is used as clock source for USB*/
  26807. /* Enable USB Clock output generated form System USB . */
  26808. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  26809. 800ba8c: 4b4e ldr r3, [pc, #312] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26810. 800ba8e: 6adb ldr r3, [r3, #44] @ 0x2c
  26811. 800ba90: 4a4d ldr r2, [pc, #308] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26812. 800ba92: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  26813. 800ba96: 62d3 str r3, [r2, #44] @ 0x2c
  26814. /* USB clock source configuration done later after clock selection check */
  26815. break;
  26816. 800ba98: e00f b.n 800baba <HAL_RCCEx_PeriphCLKConfig+0xfd2>
  26817. case RCC_USBCLKSOURCE_PLL3: /* PLL3 is used as clock source for USB*/
  26818. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_Q_UPDATE);
  26819. 800ba9a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26820. 800ba9e: 3328 adds r3, #40 @ 0x28
  26821. 800baa0: 2101 movs r1, #1
  26822. 800baa2: 4618 mov r0, r3
  26823. 800baa4: f000 fd7e bl 800c5a4 <RCCEx_PLL3_Config>
  26824. 800baa8: 4603 mov r3, r0
  26825. 800baaa: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26826. /* USB clock source configuration done later after clock selection check */
  26827. break;
  26828. 800baae: e004 b.n 800baba <HAL_RCCEx_PeriphCLKConfig+0xfd2>
  26829. /* HSI48 oscillator is used as source of USB clock */
  26830. /* USB clock source configuration done later after clock selection check */
  26831. break;
  26832. default:
  26833. ret = HAL_ERROR;
  26834. 800bab0: 2301 movs r3, #1
  26835. 800bab2: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26836. break;
  26837. 800bab6: e000 b.n 800baba <HAL_RCCEx_PeriphCLKConfig+0xfd2>
  26838. break;
  26839. 800bab8: bf00 nop
  26840. }
  26841. if (ret == HAL_OK)
  26842. 800baba: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26843. 800babe: 2b00 cmp r3, #0
  26844. 800bac0: d10b bne.n 800bada <HAL_RCCEx_PeriphCLKConfig+0xff2>
  26845. {
  26846. /* Set the source of USB clock*/
  26847. __HAL_RCC_USB_CONFIG(PeriphClkInit->UsbClockSelection);
  26848. 800bac2: 4b41 ldr r3, [pc, #260] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26849. 800bac4: 6d5b ldr r3, [r3, #84] @ 0x54
  26850. 800bac6: f423 1140 bic.w r1, r3, #3145728 @ 0x300000
  26851. 800baca: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26852. 800bace: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  26853. 800bad2: 4a3d ldr r2, [pc, #244] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26854. 800bad4: 430b orrs r3, r1
  26855. 800bad6: 6553 str r3, [r2, #84] @ 0x54
  26856. 800bad8: e003 b.n 800bae2 <HAL_RCCEx_PeriphCLKConfig+0xffa>
  26857. }
  26858. else
  26859. {
  26860. /* set overall return value */
  26861. status = ret;
  26862. 800bada: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26863. 800bade: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26864. }
  26865. }
  26866. /*------------------------------------- SDMMC Configuration ------------------------------------*/
  26867. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDMMC) == RCC_PERIPHCLK_SDMMC)
  26868. 800bae2: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26869. 800bae6: e9d3 2300 ldrd r2, r3, [r3]
  26870. 800baea: f402 3380 and.w r3, r2, #65536 @ 0x10000
  26871. 800baee: 66bb str r3, [r7, #104] @ 0x68
  26872. 800baf0: 2300 movs r3, #0
  26873. 800baf2: 66fb str r3, [r7, #108] @ 0x6c
  26874. 800baf4: e9d7 121a ldrd r1, r2, [r7, #104] @ 0x68
  26875. 800baf8: 460b mov r3, r1
  26876. 800bafa: 4313 orrs r3, r2
  26877. 800bafc: d031 beq.n 800bb62 <HAL_RCCEx_PeriphCLKConfig+0x107a>
  26878. {
  26879. /* Check the parameters */
  26880. assert_param(IS_RCC_SDMMC(PeriphClkInit->SdmmcClockSelection));
  26881. switch (PeriphClkInit->SdmmcClockSelection)
  26882. 800bafe: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26883. 800bb02: 6d1b ldr r3, [r3, #80] @ 0x50
  26884. 800bb04: 2b00 cmp r3, #0
  26885. 800bb06: d003 beq.n 800bb10 <HAL_RCCEx_PeriphCLKConfig+0x1028>
  26886. 800bb08: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  26887. 800bb0c: d007 beq.n 800bb1e <HAL_RCCEx_PeriphCLKConfig+0x1036>
  26888. 800bb0e: e011 b.n 800bb34 <HAL_RCCEx_PeriphCLKConfig+0x104c>
  26889. {
  26890. case RCC_SDMMCCLKSOURCE_PLL: /* PLL is used as clock source for SDMMC*/
  26891. /* Enable SDMMC Clock output generated form System PLL . */
  26892. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  26893. 800bb10: 4b2d ldr r3, [pc, #180] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26894. 800bb12: 6adb ldr r3, [r3, #44] @ 0x2c
  26895. 800bb14: 4a2c ldr r2, [pc, #176] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26896. 800bb16: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  26897. 800bb1a: 62d3 str r3, [r2, #44] @ 0x2c
  26898. /* SDMMC clock source configuration done later after clock selection check */
  26899. break;
  26900. 800bb1c: e00e b.n 800bb3c <HAL_RCCEx_PeriphCLKConfig+0x1054>
  26901. case RCC_SDMMCCLKSOURCE_PLL2: /* PLL2 is used as clock source for SDMMC*/
  26902. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_R_UPDATE);
  26903. 800bb1e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26904. 800bb22: 3308 adds r3, #8
  26905. 800bb24: 2102 movs r1, #2
  26906. 800bb26: 4618 mov r0, r3
  26907. 800bb28: f000 fc8a bl 800c440 <RCCEx_PLL2_Config>
  26908. 800bb2c: 4603 mov r3, r0
  26909. 800bb2e: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26910. /* SDMMC clock source configuration done later after clock selection check */
  26911. break;
  26912. 800bb32: e003 b.n 800bb3c <HAL_RCCEx_PeriphCLKConfig+0x1054>
  26913. default:
  26914. ret = HAL_ERROR;
  26915. 800bb34: 2301 movs r3, #1
  26916. 800bb36: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26917. break;
  26918. 800bb3a: bf00 nop
  26919. }
  26920. if (ret == HAL_OK)
  26921. 800bb3c: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26922. 800bb40: 2b00 cmp r3, #0
  26923. 800bb42: d10a bne.n 800bb5a <HAL_RCCEx_PeriphCLKConfig+0x1072>
  26924. {
  26925. /* Set the source of SDMMC clock*/
  26926. __HAL_RCC_SDMMC_CONFIG(PeriphClkInit->SdmmcClockSelection);
  26927. 800bb44: 4b20 ldr r3, [pc, #128] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26928. 800bb46: 6cdb ldr r3, [r3, #76] @ 0x4c
  26929. 800bb48: f423 3180 bic.w r1, r3, #65536 @ 0x10000
  26930. 800bb4c: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26931. 800bb50: 6d1b ldr r3, [r3, #80] @ 0x50
  26932. 800bb52: 4a1d ldr r2, [pc, #116] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26933. 800bb54: 430b orrs r3, r1
  26934. 800bb56: 64d3 str r3, [r2, #76] @ 0x4c
  26935. 800bb58: e003 b.n 800bb62 <HAL_RCCEx_PeriphCLKConfig+0x107a>
  26936. }
  26937. else
  26938. {
  26939. /* set overall return value */
  26940. status = ret;
  26941. 800bb5a: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  26942. 800bb5e: f887 311e strb.w r3, [r7, #286] @ 0x11e
  26943. }
  26944. }
  26945. #endif /* LTDC */
  26946. /*------------------------------ RNG Configuration -------------------------*/
  26947. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RNG) == RCC_PERIPHCLK_RNG)
  26948. 800bb62: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26949. 800bb66: e9d3 2300 ldrd r2, r3, [r3]
  26950. 800bb6a: f402 3300 and.w r3, r2, #131072 @ 0x20000
  26951. 800bb6e: 663b str r3, [r7, #96] @ 0x60
  26952. 800bb70: 2300 movs r3, #0
  26953. 800bb72: 667b str r3, [r7, #100] @ 0x64
  26954. 800bb74: e9d7 1218 ldrd r1, r2, [r7, #96] @ 0x60
  26955. 800bb78: 460b mov r3, r1
  26956. 800bb7a: 4313 orrs r3, r2
  26957. 800bb7c: d03b beq.n 800bbf6 <HAL_RCCEx_PeriphCLKConfig+0x110e>
  26958. {
  26959. switch (PeriphClkInit->RngClockSelection)
  26960. 800bb7e: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  26961. 800bb82: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  26962. 800bb86: f5b3 7f40 cmp.w r3, #768 @ 0x300
  26963. 800bb8a: d018 beq.n 800bbbe <HAL_RCCEx_PeriphCLKConfig+0x10d6>
  26964. 800bb8c: f5b3 7f40 cmp.w r3, #768 @ 0x300
  26965. 800bb90: d811 bhi.n 800bbb6 <HAL_RCCEx_PeriphCLKConfig+0x10ce>
  26966. 800bb92: f5b3 7f00 cmp.w r3, #512 @ 0x200
  26967. 800bb96: d014 beq.n 800bbc2 <HAL_RCCEx_PeriphCLKConfig+0x10da>
  26968. 800bb98: f5b3 7f00 cmp.w r3, #512 @ 0x200
  26969. 800bb9c: d80b bhi.n 800bbb6 <HAL_RCCEx_PeriphCLKConfig+0x10ce>
  26970. 800bb9e: 2b00 cmp r3, #0
  26971. 800bba0: d014 beq.n 800bbcc <HAL_RCCEx_PeriphCLKConfig+0x10e4>
  26972. 800bba2: f5b3 7f80 cmp.w r3, #256 @ 0x100
  26973. 800bba6: d106 bne.n 800bbb6 <HAL_RCCEx_PeriphCLKConfig+0x10ce>
  26974. {
  26975. case RCC_RNGCLKSOURCE_PLL: /* PLL is used as clock source for RNG*/
  26976. /* Enable RNG Clock output generated form System RNG . */
  26977. __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
  26978. 800bba8: 4b07 ldr r3, [pc, #28] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26979. 800bbaa: 6adb ldr r3, [r3, #44] @ 0x2c
  26980. 800bbac: 4a06 ldr r2, [pc, #24] @ (800bbc8 <HAL_RCCEx_PeriphCLKConfig+0x10e0>)
  26981. 800bbae: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  26982. 800bbb2: 62d3 str r3, [r2, #44] @ 0x2c
  26983. /* RNG clock source configuration done later after clock selection check */
  26984. break;
  26985. 800bbb4: e00b b.n 800bbce <HAL_RCCEx_PeriphCLKConfig+0x10e6>
  26986. /* HSI48 oscillator is used as source of RNG clock */
  26987. /* RNG clock source configuration done later after clock selection check */
  26988. break;
  26989. default:
  26990. ret = HAL_ERROR;
  26991. 800bbb6: 2301 movs r3, #1
  26992. 800bbb8: f887 311f strb.w r3, [r7, #287] @ 0x11f
  26993. break;
  26994. 800bbbc: e007 b.n 800bbce <HAL_RCCEx_PeriphCLKConfig+0x10e6>
  26995. break;
  26996. 800bbbe: bf00 nop
  26997. 800bbc0: e005 b.n 800bbce <HAL_RCCEx_PeriphCLKConfig+0x10e6>
  26998. break;
  26999. 800bbc2: bf00 nop
  27000. 800bbc4: e003 b.n 800bbce <HAL_RCCEx_PeriphCLKConfig+0x10e6>
  27001. 800bbc6: bf00 nop
  27002. 800bbc8: 58024400 .word 0x58024400
  27003. break;
  27004. 800bbcc: bf00 nop
  27005. }
  27006. if (ret == HAL_OK)
  27007. 800bbce: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27008. 800bbd2: 2b00 cmp r3, #0
  27009. 800bbd4: d10b bne.n 800bbee <HAL_RCCEx_PeriphCLKConfig+0x1106>
  27010. {
  27011. /* Set the source of RNG clock*/
  27012. __HAL_RCC_RNG_CONFIG(PeriphClkInit->RngClockSelection);
  27013. 800bbd6: 4bba ldr r3, [pc, #744] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27014. 800bbd8: 6d5b ldr r3, [r3, #84] @ 0x54
  27015. 800bbda: f423 7140 bic.w r1, r3, #768 @ 0x300
  27016. 800bbde: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27017. 800bbe2: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  27018. 800bbe6: 4ab6 ldr r2, [pc, #728] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27019. 800bbe8: 430b orrs r3, r1
  27020. 800bbea: 6553 str r3, [r2, #84] @ 0x54
  27021. 800bbec: e003 b.n 800bbf6 <HAL_RCCEx_PeriphCLKConfig+0x110e>
  27022. }
  27023. else
  27024. {
  27025. /* set overall return value */
  27026. status = ret;
  27027. 800bbee: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27028. 800bbf2: f887 311e strb.w r3, [r7, #286] @ 0x11e
  27029. }
  27030. }
  27031. /*------------------------------ SWPMI1 Configuration ------------------------*/
  27032. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SWPMI1) == RCC_PERIPHCLK_SWPMI1)
  27033. 800bbf6: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27034. 800bbfa: e9d3 2300 ldrd r2, r3, [r3]
  27035. 800bbfe: f402 1380 and.w r3, r2, #1048576 @ 0x100000
  27036. 800bc02: 65bb str r3, [r7, #88] @ 0x58
  27037. 800bc04: 2300 movs r3, #0
  27038. 800bc06: 65fb str r3, [r7, #92] @ 0x5c
  27039. 800bc08: e9d7 1216 ldrd r1, r2, [r7, #88] @ 0x58
  27040. 800bc0c: 460b mov r3, r1
  27041. 800bc0e: 4313 orrs r3, r2
  27042. 800bc10: d009 beq.n 800bc26 <HAL_RCCEx_PeriphCLKConfig+0x113e>
  27043. {
  27044. /* Check the parameters */
  27045. assert_param(IS_RCC_SWPMI1CLKSOURCE(PeriphClkInit->Swpmi1ClockSelection));
  27046. /* Configure the SWPMI1 interface clock source */
  27047. __HAL_RCC_SWPMI1_CONFIG(PeriphClkInit->Swpmi1ClockSelection);
  27048. 800bc12: 4bab ldr r3, [pc, #684] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27049. 800bc14: 6d1b ldr r3, [r3, #80] @ 0x50
  27050. 800bc16: f023 4100 bic.w r1, r3, #2147483648 @ 0x80000000
  27051. 800bc1a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27052. 800bc1e: 6f5b ldr r3, [r3, #116] @ 0x74
  27053. 800bc20: 4aa7 ldr r2, [pc, #668] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27054. 800bc22: 430b orrs r3, r1
  27055. 800bc24: 6513 str r3, [r2, #80] @ 0x50
  27056. }
  27057. #if defined(HRTIM1)
  27058. /*------------------------------ HRTIM1 clock Configuration ----------------*/
  27059. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_HRTIM1) == RCC_PERIPHCLK_HRTIM1)
  27060. 800bc26: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27061. 800bc2a: e9d3 2300 ldrd r2, r3, [r3]
  27062. 800bc2e: f002 5380 and.w r3, r2, #268435456 @ 0x10000000
  27063. 800bc32: 653b str r3, [r7, #80] @ 0x50
  27064. 800bc34: 2300 movs r3, #0
  27065. 800bc36: 657b str r3, [r7, #84] @ 0x54
  27066. 800bc38: e9d7 1214 ldrd r1, r2, [r7, #80] @ 0x50
  27067. 800bc3c: 460b mov r3, r1
  27068. 800bc3e: 4313 orrs r3, r2
  27069. 800bc40: d00a beq.n 800bc58 <HAL_RCCEx_PeriphCLKConfig+0x1170>
  27070. {
  27071. /* Check the parameters */
  27072. assert_param(IS_RCC_HRTIM1CLKSOURCE(PeriphClkInit->Hrtim1ClockSelection));
  27073. /* Configure the HRTIM1 clock source */
  27074. __HAL_RCC_HRTIM1_CONFIG(PeriphClkInit->Hrtim1ClockSelection);
  27075. 800bc42: 4b9f ldr r3, [pc, #636] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27076. 800bc44: 691b ldr r3, [r3, #16]
  27077. 800bc46: f423 4180 bic.w r1, r3, #16384 @ 0x4000
  27078. 800bc4a: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27079. 800bc4e: f8d3 30b8 ldr.w r3, [r3, #184] @ 0xb8
  27080. 800bc52: 4a9b ldr r2, [pc, #620] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27081. 800bc54: 430b orrs r3, r1
  27082. 800bc56: 6113 str r3, [r2, #16]
  27083. }
  27084. #endif /*HRTIM1*/
  27085. /*------------------------------ DFSDM1 Configuration ------------------------*/
  27086. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1)
  27087. 800bc58: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27088. 800bc5c: e9d3 2300 ldrd r2, r3, [r3]
  27089. 800bc60: f402 1300 and.w r3, r2, #2097152 @ 0x200000
  27090. 800bc64: 64bb str r3, [r7, #72] @ 0x48
  27091. 800bc66: 2300 movs r3, #0
  27092. 800bc68: 64fb str r3, [r7, #76] @ 0x4c
  27093. 800bc6a: e9d7 1212 ldrd r1, r2, [r7, #72] @ 0x48
  27094. 800bc6e: 460b mov r3, r1
  27095. 800bc70: 4313 orrs r3, r2
  27096. 800bc72: d009 beq.n 800bc88 <HAL_RCCEx_PeriphCLKConfig+0x11a0>
  27097. {
  27098. /* Check the parameters */
  27099. assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection));
  27100. /* Configure the DFSDM1 interface clock source */
  27101. __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection);
  27102. 800bc74: 4b92 ldr r3, [pc, #584] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27103. 800bc76: 6d1b ldr r3, [r3, #80] @ 0x50
  27104. 800bc78: f023 7180 bic.w r1, r3, #16777216 @ 0x1000000
  27105. 800bc7c: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27106. 800bc80: 6edb ldr r3, [r3, #108] @ 0x6c
  27107. 800bc82: 4a8f ldr r2, [pc, #572] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27108. 800bc84: 430b orrs r3, r1
  27109. 800bc86: 6513 str r3, [r2, #80] @ 0x50
  27110. __HAL_RCC_DFSDM2_CONFIG(PeriphClkInit->Dfsdm2ClockSelection);
  27111. }
  27112. #endif /* DFSDM2 */
  27113. /*------------------------------------ TIM configuration --------------------------------------*/
  27114. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == RCC_PERIPHCLK_TIM)
  27115. 800bc88: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27116. 800bc8c: e9d3 2300 ldrd r2, r3, [r3]
  27117. 800bc90: f002 4380 and.w r3, r2, #1073741824 @ 0x40000000
  27118. 800bc94: 643b str r3, [r7, #64] @ 0x40
  27119. 800bc96: 2300 movs r3, #0
  27120. 800bc98: 647b str r3, [r7, #68] @ 0x44
  27121. 800bc9a: e9d7 1210 ldrd r1, r2, [r7, #64] @ 0x40
  27122. 800bc9e: 460b mov r3, r1
  27123. 800bca0: 4313 orrs r3, r2
  27124. 800bca2: d00e beq.n 800bcc2 <HAL_RCCEx_PeriphCLKConfig+0x11da>
  27125. {
  27126. /* Check the parameters */
  27127. assert_param(IS_RCC_TIMPRES(PeriphClkInit->TIMPresSelection));
  27128. /* Configure Timer Prescaler */
  27129. __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection);
  27130. 800bca4: 4b86 ldr r3, [pc, #536] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27131. 800bca6: 691b ldr r3, [r3, #16]
  27132. 800bca8: 4a85 ldr r2, [pc, #532] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27133. 800bcaa: f423 4300 bic.w r3, r3, #32768 @ 0x8000
  27134. 800bcae: 6113 str r3, [r2, #16]
  27135. 800bcb0: 4b83 ldr r3, [pc, #524] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27136. 800bcb2: 6919 ldr r1, [r3, #16]
  27137. 800bcb4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27138. 800bcb8: f8d3 30bc ldr.w r3, [r3, #188] @ 0xbc
  27139. 800bcbc: 4a80 ldr r2, [pc, #512] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27140. 800bcbe: 430b orrs r3, r1
  27141. 800bcc0: 6113 str r3, [r2, #16]
  27142. }
  27143. /*------------------------------------ CKPER configuration --------------------------------------*/
  27144. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CKPER) == RCC_PERIPHCLK_CKPER)
  27145. 800bcc2: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27146. 800bcc6: e9d3 2300 ldrd r2, r3, [r3]
  27147. 800bcca: f002 4300 and.w r3, r2, #2147483648 @ 0x80000000
  27148. 800bcce: 63bb str r3, [r7, #56] @ 0x38
  27149. 800bcd0: 2300 movs r3, #0
  27150. 800bcd2: 63fb str r3, [r7, #60] @ 0x3c
  27151. 800bcd4: e9d7 120e ldrd r1, r2, [r7, #56] @ 0x38
  27152. 800bcd8: 460b mov r3, r1
  27153. 800bcda: 4313 orrs r3, r2
  27154. 800bcdc: d009 beq.n 800bcf2 <HAL_RCCEx_PeriphCLKConfig+0x120a>
  27155. {
  27156. /* Check the parameters */
  27157. assert_param(IS_RCC_CLKPSOURCE(PeriphClkInit->CkperClockSelection));
  27158. /* Configure the CKPER clock source */
  27159. __HAL_RCC_CLKP_CONFIG(PeriphClkInit->CkperClockSelection);
  27160. 800bcde: 4b78 ldr r3, [pc, #480] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27161. 800bce0: 6cdb ldr r3, [r3, #76] @ 0x4c
  27162. 800bce2: f023 5140 bic.w r1, r3, #805306368 @ 0x30000000
  27163. 800bce6: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27164. 800bcea: 6d5b ldr r3, [r3, #84] @ 0x54
  27165. 800bcec: 4a74 ldr r2, [pc, #464] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27166. 800bcee: 430b orrs r3, r1
  27167. 800bcf0: 64d3 str r3, [r2, #76] @ 0x4c
  27168. }
  27169. /*------------------------------ CEC Configuration ------------------------*/
  27170. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC)
  27171. 800bcf2: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27172. 800bcf6: e9d3 2300 ldrd r2, r3, [r3]
  27173. 800bcfa: f402 0300 and.w r3, r2, #8388608 @ 0x800000
  27174. 800bcfe: 633b str r3, [r7, #48] @ 0x30
  27175. 800bd00: 2300 movs r3, #0
  27176. 800bd02: 637b str r3, [r7, #52] @ 0x34
  27177. 800bd04: e9d7 120c ldrd r1, r2, [r7, #48] @ 0x30
  27178. 800bd08: 460b mov r3, r1
  27179. 800bd0a: 4313 orrs r3, r2
  27180. 800bd0c: d00a beq.n 800bd24 <HAL_RCCEx_PeriphCLKConfig+0x123c>
  27181. {
  27182. /* Check the parameters */
  27183. assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection));
  27184. /* Configure the CEC interface clock source */
  27185. __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection);
  27186. 800bd0e: 4b6c ldr r3, [pc, #432] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27187. 800bd10: 6d5b ldr r3, [r3, #84] @ 0x54
  27188. 800bd12: f423 0140 bic.w r1, r3, #12582912 @ 0xc00000
  27189. 800bd16: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27190. 800bd1a: f8d3 308c ldr.w r3, [r3, #140] @ 0x8c
  27191. 800bd1e: 4a68 ldr r2, [pc, #416] @ (800bec0 <HAL_RCCEx_PeriphCLKConfig+0x13d8>)
  27192. 800bd20: 430b orrs r3, r1
  27193. 800bd22: 6553 str r3, [r2, #84] @ 0x54
  27194. }
  27195. /*---------------------------- PLL2 configuration -------------------------------*/
  27196. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLL2_DIVP) == RCC_PERIPHCLK_PLL2_DIVP)
  27197. 800bd24: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27198. 800bd28: e9d3 2300 ldrd r2, r3, [r3]
  27199. 800bd2c: 2100 movs r1, #0
  27200. 800bd2e: 62b9 str r1, [r7, #40] @ 0x28
  27201. 800bd30: f003 0301 and.w r3, r3, #1
  27202. 800bd34: 62fb str r3, [r7, #44] @ 0x2c
  27203. 800bd36: e9d7 120a ldrd r1, r2, [r7, #40] @ 0x28
  27204. 800bd3a: 460b mov r3, r1
  27205. 800bd3c: 4313 orrs r3, r2
  27206. 800bd3e: d011 beq.n 800bd64 <HAL_RCCEx_PeriphCLKConfig+0x127c>
  27207. {
  27208. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_P_UPDATE);
  27209. 800bd40: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27210. 800bd44: 3308 adds r3, #8
  27211. 800bd46: 2100 movs r1, #0
  27212. 800bd48: 4618 mov r0, r3
  27213. 800bd4a: f000 fb79 bl 800c440 <RCCEx_PLL2_Config>
  27214. 800bd4e: 4603 mov r3, r0
  27215. 800bd50: f887 311f strb.w r3, [r7, #287] @ 0x11f
  27216. if (ret == HAL_OK)
  27217. 800bd54: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27218. 800bd58: 2b00 cmp r3, #0
  27219. 800bd5a: d003 beq.n 800bd64 <HAL_RCCEx_PeriphCLKConfig+0x127c>
  27220. /*Nothing to do*/
  27221. }
  27222. else
  27223. {
  27224. /* set overall return value */
  27225. status = ret;
  27226. 800bd5c: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27227. 800bd60: f887 311e strb.w r3, [r7, #286] @ 0x11e
  27228. }
  27229. }
  27230. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLL2_DIVQ) == RCC_PERIPHCLK_PLL2_DIVQ)
  27231. 800bd64: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27232. 800bd68: e9d3 2300 ldrd r2, r3, [r3]
  27233. 800bd6c: 2100 movs r1, #0
  27234. 800bd6e: 6239 str r1, [r7, #32]
  27235. 800bd70: f003 0302 and.w r3, r3, #2
  27236. 800bd74: 627b str r3, [r7, #36] @ 0x24
  27237. 800bd76: e9d7 1208 ldrd r1, r2, [r7, #32]
  27238. 800bd7a: 460b mov r3, r1
  27239. 800bd7c: 4313 orrs r3, r2
  27240. 800bd7e: d011 beq.n 800bda4 <HAL_RCCEx_PeriphCLKConfig+0x12bc>
  27241. {
  27242. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_Q_UPDATE);
  27243. 800bd80: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27244. 800bd84: 3308 adds r3, #8
  27245. 800bd86: 2101 movs r1, #1
  27246. 800bd88: 4618 mov r0, r3
  27247. 800bd8a: f000 fb59 bl 800c440 <RCCEx_PLL2_Config>
  27248. 800bd8e: 4603 mov r3, r0
  27249. 800bd90: f887 311f strb.w r3, [r7, #287] @ 0x11f
  27250. if (ret == HAL_OK)
  27251. 800bd94: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27252. 800bd98: 2b00 cmp r3, #0
  27253. 800bd9a: d003 beq.n 800bda4 <HAL_RCCEx_PeriphCLKConfig+0x12bc>
  27254. /*Nothing to do*/
  27255. }
  27256. else
  27257. {
  27258. /* set overall return value */
  27259. status = ret;
  27260. 800bd9c: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27261. 800bda0: f887 311e strb.w r3, [r7, #286] @ 0x11e
  27262. }
  27263. }
  27264. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLL2_DIVR) == RCC_PERIPHCLK_PLL2_DIVR)
  27265. 800bda4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27266. 800bda8: e9d3 2300 ldrd r2, r3, [r3]
  27267. 800bdac: 2100 movs r1, #0
  27268. 800bdae: 61b9 str r1, [r7, #24]
  27269. 800bdb0: f003 0304 and.w r3, r3, #4
  27270. 800bdb4: 61fb str r3, [r7, #28]
  27271. 800bdb6: e9d7 1206 ldrd r1, r2, [r7, #24]
  27272. 800bdba: 460b mov r3, r1
  27273. 800bdbc: 4313 orrs r3, r2
  27274. 800bdbe: d011 beq.n 800bde4 <HAL_RCCEx_PeriphCLKConfig+0x12fc>
  27275. {
  27276. ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2), DIVIDER_R_UPDATE);
  27277. 800bdc0: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27278. 800bdc4: 3308 adds r3, #8
  27279. 800bdc6: 2102 movs r1, #2
  27280. 800bdc8: 4618 mov r0, r3
  27281. 800bdca: f000 fb39 bl 800c440 <RCCEx_PLL2_Config>
  27282. 800bdce: 4603 mov r3, r0
  27283. 800bdd0: f887 311f strb.w r3, [r7, #287] @ 0x11f
  27284. if (ret == HAL_OK)
  27285. 800bdd4: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27286. 800bdd8: 2b00 cmp r3, #0
  27287. 800bdda: d003 beq.n 800bde4 <HAL_RCCEx_PeriphCLKConfig+0x12fc>
  27288. /*Nothing to do*/
  27289. }
  27290. else
  27291. {
  27292. /* set overall return value */
  27293. status = ret;
  27294. 800bddc: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27295. 800bde0: f887 311e strb.w r3, [r7, #286] @ 0x11e
  27296. }
  27297. }
  27298. /*---------------------------- PLL3 configuration -------------------------------*/
  27299. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLL3_DIVP) == RCC_PERIPHCLK_PLL3_DIVP)
  27300. 800bde4: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27301. 800bde8: e9d3 2300 ldrd r2, r3, [r3]
  27302. 800bdec: 2100 movs r1, #0
  27303. 800bdee: 6139 str r1, [r7, #16]
  27304. 800bdf0: f003 0308 and.w r3, r3, #8
  27305. 800bdf4: 617b str r3, [r7, #20]
  27306. 800bdf6: e9d7 1204 ldrd r1, r2, [r7, #16]
  27307. 800bdfa: 460b mov r3, r1
  27308. 800bdfc: 4313 orrs r3, r2
  27309. 800bdfe: d011 beq.n 800be24 <HAL_RCCEx_PeriphCLKConfig+0x133c>
  27310. {
  27311. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_P_UPDATE);
  27312. 800be00: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27313. 800be04: 3328 adds r3, #40 @ 0x28
  27314. 800be06: 2100 movs r1, #0
  27315. 800be08: 4618 mov r0, r3
  27316. 800be0a: f000 fbcb bl 800c5a4 <RCCEx_PLL3_Config>
  27317. 800be0e: 4603 mov r3, r0
  27318. 800be10: f887 311f strb.w r3, [r7, #287] @ 0x11f
  27319. if (ret == HAL_OK)
  27320. 800be14: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27321. 800be18: 2b00 cmp r3, #0
  27322. 800be1a: d003 beq.n 800be24 <HAL_RCCEx_PeriphCLKConfig+0x133c>
  27323. /*Nothing to do*/
  27324. }
  27325. else
  27326. {
  27327. /* set overall return value */
  27328. status = ret;
  27329. 800be1c: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27330. 800be20: f887 311e strb.w r3, [r7, #286] @ 0x11e
  27331. }
  27332. }
  27333. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLL3_DIVQ) == RCC_PERIPHCLK_PLL3_DIVQ)
  27334. 800be24: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27335. 800be28: e9d3 2300 ldrd r2, r3, [r3]
  27336. 800be2c: 2100 movs r1, #0
  27337. 800be2e: 60b9 str r1, [r7, #8]
  27338. 800be30: f003 0310 and.w r3, r3, #16
  27339. 800be34: 60fb str r3, [r7, #12]
  27340. 800be36: e9d7 1202 ldrd r1, r2, [r7, #8]
  27341. 800be3a: 460b mov r3, r1
  27342. 800be3c: 4313 orrs r3, r2
  27343. 800be3e: d011 beq.n 800be64 <HAL_RCCEx_PeriphCLKConfig+0x137c>
  27344. {
  27345. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_Q_UPDATE);
  27346. 800be40: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27347. 800be44: 3328 adds r3, #40 @ 0x28
  27348. 800be46: 2101 movs r1, #1
  27349. 800be48: 4618 mov r0, r3
  27350. 800be4a: f000 fbab bl 800c5a4 <RCCEx_PLL3_Config>
  27351. 800be4e: 4603 mov r3, r0
  27352. 800be50: f887 311f strb.w r3, [r7, #287] @ 0x11f
  27353. if (ret == HAL_OK)
  27354. 800be54: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27355. 800be58: 2b00 cmp r3, #0
  27356. 800be5a: d003 beq.n 800be64 <HAL_RCCEx_PeriphCLKConfig+0x137c>
  27357. /*Nothing to do*/
  27358. }
  27359. else
  27360. {
  27361. /* set overall return value */
  27362. status = ret;
  27363. 800be5c: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27364. 800be60: f887 311e strb.w r3, [r7, #286] @ 0x11e
  27365. }
  27366. }
  27367. if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLL3_DIVR) == RCC_PERIPHCLK_PLL3_DIVR)
  27368. 800be64: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27369. 800be68: e9d3 2300 ldrd r2, r3, [r3]
  27370. 800be6c: 2100 movs r1, #0
  27371. 800be6e: 6039 str r1, [r7, #0]
  27372. 800be70: f003 0320 and.w r3, r3, #32
  27373. 800be74: 607b str r3, [r7, #4]
  27374. 800be76: e9d7 1200 ldrd r1, r2, [r7]
  27375. 800be7a: 460b mov r3, r1
  27376. 800be7c: 4313 orrs r3, r2
  27377. 800be7e: d011 beq.n 800bea4 <HAL_RCCEx_PeriphCLKConfig+0x13bc>
  27378. {
  27379. ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3), DIVIDER_R_UPDATE);
  27380. 800be80: f8d7 310c ldr.w r3, [r7, #268] @ 0x10c
  27381. 800be84: 3328 adds r3, #40 @ 0x28
  27382. 800be86: 2102 movs r1, #2
  27383. 800be88: 4618 mov r0, r3
  27384. 800be8a: f000 fb8b bl 800c5a4 <RCCEx_PLL3_Config>
  27385. 800be8e: 4603 mov r3, r0
  27386. 800be90: f887 311f strb.w r3, [r7, #287] @ 0x11f
  27387. if (ret == HAL_OK)
  27388. 800be94: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27389. 800be98: 2b00 cmp r3, #0
  27390. 800be9a: d003 beq.n 800bea4 <HAL_RCCEx_PeriphCLKConfig+0x13bc>
  27391. /*Nothing to do*/
  27392. }
  27393. else
  27394. {
  27395. /* set overall return value */
  27396. status = ret;
  27397. 800be9c: f897 311f ldrb.w r3, [r7, #287] @ 0x11f
  27398. 800bea0: f887 311e strb.w r3, [r7, #286] @ 0x11e
  27399. }
  27400. }
  27401. if (status == HAL_OK)
  27402. 800bea4: f897 311e ldrb.w r3, [r7, #286] @ 0x11e
  27403. 800bea8: 2b00 cmp r3, #0
  27404. 800beaa: d101 bne.n 800beb0 <HAL_RCCEx_PeriphCLKConfig+0x13c8>
  27405. {
  27406. return HAL_OK;
  27407. 800beac: 2300 movs r3, #0
  27408. 800beae: e000 b.n 800beb2 <HAL_RCCEx_PeriphCLKConfig+0x13ca>
  27409. }
  27410. return HAL_ERROR;
  27411. 800beb0: 2301 movs r3, #1
  27412. }
  27413. 800beb2: 4618 mov r0, r3
  27414. 800beb4: f507 7790 add.w r7, r7, #288 @ 0x120
  27415. 800beb8: 46bd mov sp, r7
  27416. 800beba: e8bd 8fb0 ldmia.w sp!, {r4, r5, r7, r8, r9, sl, fp, pc}
  27417. 800bebe: bf00 nop
  27418. 800bec0: 58024400 .word 0x58024400
  27419. 0800bec4 <HAL_RCCEx_GetD3PCLK1Freq>:
  27420. * @note Each time D3PCLK1 changes, this function must be called to update the
  27421. * right D3PCLK1 value. Otherwise, any configuration based on this function will be incorrect.
  27422. * @retval D3PCLK1 frequency
  27423. */
  27424. uint32_t HAL_RCCEx_GetD3PCLK1Freq(void)
  27425. {
  27426. 800bec4: b580 push {r7, lr}
  27427. 800bec6: af00 add r7, sp, #0
  27428. #if defined(RCC_D3CFGR_D3PPRE)
  27429. /* Get HCLK source and Compute D3PCLK1 frequency ---------------------------*/
  27430. return (HAL_RCC_GetHCLKFreq() >> (D1CorePrescTable[(RCC->D3CFGR & RCC_D3CFGR_D3PPRE) >> RCC_D3CFGR_D3PPRE_Pos] & 0x1FU));
  27431. 800bec8: f7fe fd70 bl 800a9ac <HAL_RCC_GetHCLKFreq>
  27432. 800becc: 4602 mov r2, r0
  27433. 800bece: 4b06 ldr r3, [pc, #24] @ (800bee8 <HAL_RCCEx_GetD3PCLK1Freq+0x24>)
  27434. 800bed0: 6a1b ldr r3, [r3, #32]
  27435. 800bed2: 091b lsrs r3, r3, #4
  27436. 800bed4: f003 0307 and.w r3, r3, #7
  27437. 800bed8: 4904 ldr r1, [pc, #16] @ (800beec <HAL_RCCEx_GetD3PCLK1Freq+0x28>)
  27438. 800beda: 5ccb ldrb r3, [r1, r3]
  27439. 800bedc: f003 031f and.w r3, r3, #31
  27440. 800bee0: fa22 f303 lsr.w r3, r2, r3
  27441. #else
  27442. /* Get HCLK source and Compute D3PCLK1 frequency ---------------------------*/
  27443. return (HAL_RCC_GetHCLKFreq() >> (D1CorePrescTable[(RCC->SRDCFGR & RCC_SRDCFGR_SRDPPRE) >> RCC_SRDCFGR_SRDPPRE_Pos] & 0x1FU));
  27444. #endif
  27445. }
  27446. 800bee4: 4618 mov r0, r3
  27447. 800bee6: bd80 pop {r7, pc}
  27448. 800bee8: 58024400 .word 0x58024400
  27449. 800beec: 08030a24 .word 0x08030a24
  27450. 0800bef0 <HAL_RCCEx_GetPLL2ClockFreq>:
  27451. * right PLL2CLK value. Otherwise, any configuration based on this function will be incorrect.
  27452. * @param PLL2_Clocks structure.
  27453. * @retval None
  27454. */
  27455. void HAL_RCCEx_GetPLL2ClockFreq(PLL2_ClocksTypeDef *PLL2_Clocks)
  27456. {
  27457. 800bef0: b480 push {r7}
  27458. 800bef2: b089 sub sp, #36 @ 0x24
  27459. 800bef4: af00 add r7, sp, #0
  27460. 800bef6: 6078 str r0, [r7, #4]
  27461. float_t fracn2, pll2vco;
  27462. /* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLL2M) * PLL2N
  27463. PLL2xCLK = PLL2_VCO / PLL2x
  27464. */
  27465. pllsource = (RCC->PLLCKSELR & RCC_PLLCKSELR_PLLSRC);
  27466. 800bef8: 4ba1 ldr r3, [pc, #644] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27467. 800befa: 6a9b ldr r3, [r3, #40] @ 0x28
  27468. 800befc: f003 0303 and.w r3, r3, #3
  27469. 800bf00: 61bb str r3, [r7, #24]
  27470. pll2m = ((RCC->PLLCKSELR & RCC_PLLCKSELR_DIVM2) >> 12);
  27471. 800bf02: 4b9f ldr r3, [pc, #636] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27472. 800bf04: 6a9b ldr r3, [r3, #40] @ 0x28
  27473. 800bf06: 0b1b lsrs r3, r3, #12
  27474. 800bf08: f003 033f and.w r3, r3, #63 @ 0x3f
  27475. 800bf0c: 617b str r3, [r7, #20]
  27476. pll2fracen = (RCC->PLLCFGR & RCC_PLLCFGR_PLL2FRACEN) >> RCC_PLLCFGR_PLL2FRACEN_Pos;
  27477. 800bf0e: 4b9c ldr r3, [pc, #624] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27478. 800bf10: 6adb ldr r3, [r3, #44] @ 0x2c
  27479. 800bf12: 091b lsrs r3, r3, #4
  27480. 800bf14: f003 0301 and.w r3, r3, #1
  27481. 800bf18: 613b str r3, [r7, #16]
  27482. fracn2 = (float_t)(uint32_t)(pll2fracen * ((RCC->PLL2FRACR & RCC_PLL2FRACR_FRACN2) >> 3));
  27483. 800bf1a: 4b99 ldr r3, [pc, #612] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27484. 800bf1c: 6bdb ldr r3, [r3, #60] @ 0x3c
  27485. 800bf1e: 08db lsrs r3, r3, #3
  27486. 800bf20: f3c3 030c ubfx r3, r3, #0, #13
  27487. 800bf24: 693a ldr r2, [r7, #16]
  27488. 800bf26: fb02 f303 mul.w r3, r2, r3
  27489. 800bf2a: ee07 3a90 vmov s15, r3
  27490. 800bf2e: eef8 7a67 vcvt.f32.u32 s15, s15
  27491. 800bf32: edc7 7a03 vstr s15, [r7, #12]
  27492. if (pll2m != 0U)
  27493. 800bf36: 697b ldr r3, [r7, #20]
  27494. 800bf38: 2b00 cmp r3, #0
  27495. 800bf3a: f000 8111 beq.w 800c160 <HAL_RCCEx_GetPLL2ClockFreq+0x270>
  27496. {
  27497. switch (pllsource)
  27498. 800bf3e: 69bb ldr r3, [r7, #24]
  27499. 800bf40: 2b02 cmp r3, #2
  27500. 800bf42: f000 8083 beq.w 800c04c <HAL_RCCEx_GetPLL2ClockFreq+0x15c>
  27501. 800bf46: 69bb ldr r3, [r7, #24]
  27502. 800bf48: 2b02 cmp r3, #2
  27503. 800bf4a: f200 80a1 bhi.w 800c090 <HAL_RCCEx_GetPLL2ClockFreq+0x1a0>
  27504. 800bf4e: 69bb ldr r3, [r7, #24]
  27505. 800bf50: 2b00 cmp r3, #0
  27506. 800bf52: d003 beq.n 800bf5c <HAL_RCCEx_GetPLL2ClockFreq+0x6c>
  27507. 800bf54: 69bb ldr r3, [r7, #24]
  27508. 800bf56: 2b01 cmp r3, #1
  27509. 800bf58: d056 beq.n 800c008 <HAL_RCCEx_GetPLL2ClockFreq+0x118>
  27510. 800bf5a: e099 b.n 800c090 <HAL_RCCEx_GetPLL2ClockFreq+0x1a0>
  27511. {
  27512. case RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  27513. if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
  27514. 800bf5c: 4b88 ldr r3, [pc, #544] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27515. 800bf5e: 681b ldr r3, [r3, #0]
  27516. 800bf60: f003 0320 and.w r3, r3, #32
  27517. 800bf64: 2b00 cmp r3, #0
  27518. 800bf66: d02d beq.n 800bfc4 <HAL_RCCEx_GetPLL2ClockFreq+0xd4>
  27519. {
  27520. hsivalue = (HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3));
  27521. 800bf68: 4b85 ldr r3, [pc, #532] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27522. 800bf6a: 681b ldr r3, [r3, #0]
  27523. 800bf6c: 08db lsrs r3, r3, #3
  27524. 800bf6e: f003 0303 and.w r3, r3, #3
  27525. 800bf72: 4a84 ldr r2, [pc, #528] @ (800c184 <HAL_RCCEx_GetPLL2ClockFreq+0x294>)
  27526. 800bf74: fa22 f303 lsr.w r3, r2, r3
  27527. 800bf78: 60bb str r3, [r7, #8]
  27528. pll2vco = ((float_t)hsivalue / (float_t)pll2m) * ((float_t)(uint32_t)(RCC->PLL2DIVR & RCC_PLL2DIVR_N2) + (fracn2 / (float_t)0x2000) + (float_t)1);
  27529. 800bf7a: 68bb ldr r3, [r7, #8]
  27530. 800bf7c: ee07 3a90 vmov s15, r3
  27531. 800bf80: eef8 6a67 vcvt.f32.u32 s13, s15
  27532. 800bf84: 697b ldr r3, [r7, #20]
  27533. 800bf86: ee07 3a90 vmov s15, r3
  27534. 800bf8a: eef8 7a67 vcvt.f32.u32 s15, s15
  27535. 800bf8e: ee86 7aa7 vdiv.f32 s14, s13, s15
  27536. 800bf92: 4b7b ldr r3, [pc, #492] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27537. 800bf94: 6b9b ldr r3, [r3, #56] @ 0x38
  27538. 800bf96: f3c3 0308 ubfx r3, r3, #0, #9
  27539. 800bf9a: ee07 3a90 vmov s15, r3
  27540. 800bf9e: eef8 6a67 vcvt.f32.u32 s13, s15
  27541. 800bfa2: ed97 6a03 vldr s12, [r7, #12]
  27542. 800bfa6: eddf 5a78 vldr s11, [pc, #480] @ 800c188 <HAL_RCCEx_GetPLL2ClockFreq+0x298>
  27543. 800bfaa: eec6 7a25 vdiv.f32 s15, s12, s11
  27544. 800bfae: ee76 7aa7 vadd.f32 s15, s13, s15
  27545. 800bfb2: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  27546. 800bfb6: ee77 7aa6 vadd.f32 s15, s15, s13
  27547. 800bfba: ee67 7a27 vmul.f32 s15, s14, s15
  27548. 800bfbe: edc7 7a07 vstr s15, [r7, #28]
  27549. }
  27550. else
  27551. {
  27552. pll2vco = ((float_t)HSI_VALUE / (float_t)pll2m) * ((float_t)(uint32_t)(RCC->PLL2DIVR & RCC_PLL2DIVR_N2) + (fracn2 / (float_t)0x2000) + (float_t)1);
  27553. }
  27554. break;
  27555. 800bfc2: e087 b.n 800c0d4 <HAL_RCCEx_GetPLL2ClockFreq+0x1e4>
  27556. pll2vco = ((float_t)HSI_VALUE / (float_t)pll2m) * ((float_t)(uint32_t)(RCC->PLL2DIVR & RCC_PLL2DIVR_N2) + (fracn2 / (float_t)0x2000) + (float_t)1);
  27557. 800bfc4: 697b ldr r3, [r7, #20]
  27558. 800bfc6: ee07 3a90 vmov s15, r3
  27559. 800bfca: eef8 7a67 vcvt.f32.u32 s15, s15
  27560. 800bfce: eddf 6a6f vldr s13, [pc, #444] @ 800c18c <HAL_RCCEx_GetPLL2ClockFreq+0x29c>
  27561. 800bfd2: ee86 7aa7 vdiv.f32 s14, s13, s15
  27562. 800bfd6: 4b6a ldr r3, [pc, #424] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27563. 800bfd8: 6b9b ldr r3, [r3, #56] @ 0x38
  27564. 800bfda: f3c3 0308 ubfx r3, r3, #0, #9
  27565. 800bfde: ee07 3a90 vmov s15, r3
  27566. 800bfe2: eef8 6a67 vcvt.f32.u32 s13, s15
  27567. 800bfe6: ed97 6a03 vldr s12, [r7, #12]
  27568. 800bfea: eddf 5a67 vldr s11, [pc, #412] @ 800c188 <HAL_RCCEx_GetPLL2ClockFreq+0x298>
  27569. 800bfee: eec6 7a25 vdiv.f32 s15, s12, s11
  27570. 800bff2: ee76 7aa7 vadd.f32 s15, s13, s15
  27571. 800bff6: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  27572. 800bffa: ee77 7aa6 vadd.f32 s15, s15, s13
  27573. 800bffe: ee67 7a27 vmul.f32 s15, s14, s15
  27574. 800c002: edc7 7a07 vstr s15, [r7, #28]
  27575. break;
  27576. 800c006: e065 b.n 800c0d4 <HAL_RCCEx_GetPLL2ClockFreq+0x1e4>
  27577. case RCC_PLLSOURCE_CSI: /* CSI used as PLL clock source */
  27578. pll2vco = ((float_t)CSI_VALUE / (float_t)pll2m) * ((float_t)(uint32_t)(RCC->PLL2DIVR & RCC_PLL2DIVR_N2) + (fracn2 / (float_t)0x2000) + (float_t)1);
  27579. 800c008: 697b ldr r3, [r7, #20]
  27580. 800c00a: ee07 3a90 vmov s15, r3
  27581. 800c00e: eef8 7a67 vcvt.f32.u32 s15, s15
  27582. 800c012: eddf 6a5f vldr s13, [pc, #380] @ 800c190 <HAL_RCCEx_GetPLL2ClockFreq+0x2a0>
  27583. 800c016: ee86 7aa7 vdiv.f32 s14, s13, s15
  27584. 800c01a: 4b59 ldr r3, [pc, #356] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27585. 800c01c: 6b9b ldr r3, [r3, #56] @ 0x38
  27586. 800c01e: f3c3 0308 ubfx r3, r3, #0, #9
  27587. 800c022: ee07 3a90 vmov s15, r3
  27588. 800c026: eef8 6a67 vcvt.f32.u32 s13, s15
  27589. 800c02a: ed97 6a03 vldr s12, [r7, #12]
  27590. 800c02e: eddf 5a56 vldr s11, [pc, #344] @ 800c188 <HAL_RCCEx_GetPLL2ClockFreq+0x298>
  27591. 800c032: eec6 7a25 vdiv.f32 s15, s12, s11
  27592. 800c036: ee76 7aa7 vadd.f32 s15, s13, s15
  27593. 800c03a: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  27594. 800c03e: ee77 7aa6 vadd.f32 s15, s15, s13
  27595. 800c042: ee67 7a27 vmul.f32 s15, s14, s15
  27596. 800c046: edc7 7a07 vstr s15, [r7, #28]
  27597. break;
  27598. 800c04a: e043 b.n 800c0d4 <HAL_RCCEx_GetPLL2ClockFreq+0x1e4>
  27599. case RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  27600. pll2vco = ((float_t)HSE_VALUE / (float_t)pll2m) * ((float_t)(uint32_t)(RCC->PLL2DIVR & RCC_PLL2DIVR_N2) + (fracn2 / (float_t)0x2000) + (float_t)1);
  27601. 800c04c: 697b ldr r3, [r7, #20]
  27602. 800c04e: ee07 3a90 vmov s15, r3
  27603. 800c052: eef8 7a67 vcvt.f32.u32 s15, s15
  27604. 800c056: eddf 6a4f vldr s13, [pc, #316] @ 800c194 <HAL_RCCEx_GetPLL2ClockFreq+0x2a4>
  27605. 800c05a: ee86 7aa7 vdiv.f32 s14, s13, s15
  27606. 800c05e: 4b48 ldr r3, [pc, #288] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27607. 800c060: 6b9b ldr r3, [r3, #56] @ 0x38
  27608. 800c062: f3c3 0308 ubfx r3, r3, #0, #9
  27609. 800c066: ee07 3a90 vmov s15, r3
  27610. 800c06a: eef8 6a67 vcvt.f32.u32 s13, s15
  27611. 800c06e: ed97 6a03 vldr s12, [r7, #12]
  27612. 800c072: eddf 5a45 vldr s11, [pc, #276] @ 800c188 <HAL_RCCEx_GetPLL2ClockFreq+0x298>
  27613. 800c076: eec6 7a25 vdiv.f32 s15, s12, s11
  27614. 800c07a: ee76 7aa7 vadd.f32 s15, s13, s15
  27615. 800c07e: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  27616. 800c082: ee77 7aa6 vadd.f32 s15, s15, s13
  27617. 800c086: ee67 7a27 vmul.f32 s15, s14, s15
  27618. 800c08a: edc7 7a07 vstr s15, [r7, #28]
  27619. break;
  27620. 800c08e: e021 b.n 800c0d4 <HAL_RCCEx_GetPLL2ClockFreq+0x1e4>
  27621. default:
  27622. pll2vco = ((float_t)CSI_VALUE / (float_t)pll2m) * ((float_t)(uint32_t)(RCC->PLL2DIVR & RCC_PLL2DIVR_N2) + (fracn2 / (float_t)0x2000) + (float_t)1);
  27623. 800c090: 697b ldr r3, [r7, #20]
  27624. 800c092: ee07 3a90 vmov s15, r3
  27625. 800c096: eef8 7a67 vcvt.f32.u32 s15, s15
  27626. 800c09a: eddf 6a3d vldr s13, [pc, #244] @ 800c190 <HAL_RCCEx_GetPLL2ClockFreq+0x2a0>
  27627. 800c09e: ee86 7aa7 vdiv.f32 s14, s13, s15
  27628. 800c0a2: 4b37 ldr r3, [pc, #220] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27629. 800c0a4: 6b9b ldr r3, [r3, #56] @ 0x38
  27630. 800c0a6: f3c3 0308 ubfx r3, r3, #0, #9
  27631. 800c0aa: ee07 3a90 vmov s15, r3
  27632. 800c0ae: eef8 6a67 vcvt.f32.u32 s13, s15
  27633. 800c0b2: ed97 6a03 vldr s12, [r7, #12]
  27634. 800c0b6: eddf 5a34 vldr s11, [pc, #208] @ 800c188 <HAL_RCCEx_GetPLL2ClockFreq+0x298>
  27635. 800c0ba: eec6 7a25 vdiv.f32 s15, s12, s11
  27636. 800c0be: ee76 7aa7 vadd.f32 s15, s13, s15
  27637. 800c0c2: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  27638. 800c0c6: ee77 7aa6 vadd.f32 s15, s15, s13
  27639. 800c0ca: ee67 7a27 vmul.f32 s15, s14, s15
  27640. 800c0ce: edc7 7a07 vstr s15, [r7, #28]
  27641. break;
  27642. 800c0d2: bf00 nop
  27643. }
  27644. PLL2_Clocks->PLL2_P_Frequency = (uint32_t)(float_t)(pll2vco / ((float_t)(uint32_t)((RCC->PLL2DIVR & RCC_PLL2DIVR_P2) >> 9) + (float_t)1)) ;
  27645. 800c0d4: 4b2a ldr r3, [pc, #168] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27646. 800c0d6: 6b9b ldr r3, [r3, #56] @ 0x38
  27647. 800c0d8: 0a5b lsrs r3, r3, #9
  27648. 800c0da: f003 037f and.w r3, r3, #127 @ 0x7f
  27649. 800c0de: ee07 3a90 vmov s15, r3
  27650. 800c0e2: eef8 7a67 vcvt.f32.u32 s15, s15
  27651. 800c0e6: eeb7 7a00 vmov.f32 s14, #112 @ 0x3f800000 1.0
  27652. 800c0ea: ee37 7a87 vadd.f32 s14, s15, s14
  27653. 800c0ee: edd7 6a07 vldr s13, [r7, #28]
  27654. 800c0f2: eec6 7a87 vdiv.f32 s15, s13, s14
  27655. 800c0f6: eefc 7ae7 vcvt.u32.f32 s15, s15
  27656. 800c0fa: ee17 2a90 vmov r2, s15
  27657. 800c0fe: 687b ldr r3, [r7, #4]
  27658. 800c100: 601a str r2, [r3, #0]
  27659. PLL2_Clocks->PLL2_Q_Frequency = (uint32_t)(float_t)(pll2vco / ((float_t)(uint32_t)((RCC->PLL2DIVR & RCC_PLL2DIVR_Q2) >> 16) + (float_t)1)) ;
  27660. 800c102: 4b1f ldr r3, [pc, #124] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27661. 800c104: 6b9b ldr r3, [r3, #56] @ 0x38
  27662. 800c106: 0c1b lsrs r3, r3, #16
  27663. 800c108: f003 037f and.w r3, r3, #127 @ 0x7f
  27664. 800c10c: ee07 3a90 vmov s15, r3
  27665. 800c110: eef8 7a67 vcvt.f32.u32 s15, s15
  27666. 800c114: eeb7 7a00 vmov.f32 s14, #112 @ 0x3f800000 1.0
  27667. 800c118: ee37 7a87 vadd.f32 s14, s15, s14
  27668. 800c11c: edd7 6a07 vldr s13, [r7, #28]
  27669. 800c120: eec6 7a87 vdiv.f32 s15, s13, s14
  27670. 800c124: eefc 7ae7 vcvt.u32.f32 s15, s15
  27671. 800c128: ee17 2a90 vmov r2, s15
  27672. 800c12c: 687b ldr r3, [r7, #4]
  27673. 800c12e: 605a str r2, [r3, #4]
  27674. PLL2_Clocks->PLL2_R_Frequency = (uint32_t)(float_t)(pll2vco / ((float_t)(uint32_t)((RCC->PLL2DIVR & RCC_PLL2DIVR_R2) >> 24) + (float_t)1)) ;
  27675. 800c130: 4b13 ldr r3, [pc, #76] @ (800c180 <HAL_RCCEx_GetPLL2ClockFreq+0x290>)
  27676. 800c132: 6b9b ldr r3, [r3, #56] @ 0x38
  27677. 800c134: 0e1b lsrs r3, r3, #24
  27678. 800c136: f003 037f and.w r3, r3, #127 @ 0x7f
  27679. 800c13a: ee07 3a90 vmov s15, r3
  27680. 800c13e: eef8 7a67 vcvt.f32.u32 s15, s15
  27681. 800c142: eeb7 7a00 vmov.f32 s14, #112 @ 0x3f800000 1.0
  27682. 800c146: ee37 7a87 vadd.f32 s14, s15, s14
  27683. 800c14a: edd7 6a07 vldr s13, [r7, #28]
  27684. 800c14e: eec6 7a87 vdiv.f32 s15, s13, s14
  27685. 800c152: eefc 7ae7 vcvt.u32.f32 s15, s15
  27686. 800c156: ee17 2a90 vmov r2, s15
  27687. 800c15a: 687b ldr r3, [r7, #4]
  27688. 800c15c: 609a str r2, [r3, #8]
  27689. {
  27690. PLL2_Clocks->PLL2_P_Frequency = 0U;
  27691. PLL2_Clocks->PLL2_Q_Frequency = 0U;
  27692. PLL2_Clocks->PLL2_R_Frequency = 0U;
  27693. }
  27694. }
  27695. 800c15e: e008 b.n 800c172 <HAL_RCCEx_GetPLL2ClockFreq+0x282>
  27696. PLL2_Clocks->PLL2_P_Frequency = 0U;
  27697. 800c160: 687b ldr r3, [r7, #4]
  27698. 800c162: 2200 movs r2, #0
  27699. 800c164: 601a str r2, [r3, #0]
  27700. PLL2_Clocks->PLL2_Q_Frequency = 0U;
  27701. 800c166: 687b ldr r3, [r7, #4]
  27702. 800c168: 2200 movs r2, #0
  27703. 800c16a: 605a str r2, [r3, #4]
  27704. PLL2_Clocks->PLL2_R_Frequency = 0U;
  27705. 800c16c: 687b ldr r3, [r7, #4]
  27706. 800c16e: 2200 movs r2, #0
  27707. 800c170: 609a str r2, [r3, #8]
  27708. }
  27709. 800c172: bf00 nop
  27710. 800c174: 3724 adds r7, #36 @ 0x24
  27711. 800c176: 46bd mov sp, r7
  27712. 800c178: f85d 7b04 ldr.w r7, [sp], #4
  27713. 800c17c: 4770 bx lr
  27714. 800c17e: bf00 nop
  27715. 800c180: 58024400 .word 0x58024400
  27716. 800c184: 03d09000 .word 0x03d09000
  27717. 800c188: 46000000 .word 0x46000000
  27718. 800c18c: 4c742400 .word 0x4c742400
  27719. 800c190: 4a742400 .word 0x4a742400
  27720. 800c194: 4bbebc20 .word 0x4bbebc20
  27721. 0800c198 <HAL_RCCEx_GetPLL3ClockFreq>:
  27722. * right PLL3CLK value. Otherwise, any configuration based on this function will be incorrect.
  27723. * @param PLL3_Clocks structure.
  27724. * @retval None
  27725. */
  27726. void HAL_RCCEx_GetPLL3ClockFreq(PLL3_ClocksTypeDef *PLL3_Clocks)
  27727. {
  27728. 800c198: b480 push {r7}
  27729. 800c19a: b089 sub sp, #36 @ 0x24
  27730. 800c19c: af00 add r7, sp, #0
  27731. 800c19e: 6078 str r0, [r7, #4]
  27732. float_t fracn3, pll3vco;
  27733. /* PLL3_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLL3M) * PLL3N
  27734. PLL3xCLK = PLL3_VCO / PLLxR
  27735. */
  27736. pllsource = (RCC->PLLCKSELR & RCC_PLLCKSELR_PLLSRC);
  27737. 800c1a0: 4ba1 ldr r3, [pc, #644] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27738. 800c1a2: 6a9b ldr r3, [r3, #40] @ 0x28
  27739. 800c1a4: f003 0303 and.w r3, r3, #3
  27740. 800c1a8: 61bb str r3, [r7, #24]
  27741. pll3m = ((RCC->PLLCKSELR & RCC_PLLCKSELR_DIVM3) >> 20) ;
  27742. 800c1aa: 4b9f ldr r3, [pc, #636] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27743. 800c1ac: 6a9b ldr r3, [r3, #40] @ 0x28
  27744. 800c1ae: 0d1b lsrs r3, r3, #20
  27745. 800c1b0: f003 033f and.w r3, r3, #63 @ 0x3f
  27746. 800c1b4: 617b str r3, [r7, #20]
  27747. pll3fracen = (RCC->PLLCFGR & RCC_PLLCFGR_PLL3FRACEN) >> RCC_PLLCFGR_PLL3FRACEN_Pos;
  27748. 800c1b6: 4b9c ldr r3, [pc, #624] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27749. 800c1b8: 6adb ldr r3, [r3, #44] @ 0x2c
  27750. 800c1ba: 0a1b lsrs r3, r3, #8
  27751. 800c1bc: f003 0301 and.w r3, r3, #1
  27752. 800c1c0: 613b str r3, [r7, #16]
  27753. fracn3 = (float_t)(uint32_t)(pll3fracen * ((RCC->PLL3FRACR & RCC_PLL3FRACR_FRACN3) >> 3));
  27754. 800c1c2: 4b99 ldr r3, [pc, #612] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27755. 800c1c4: 6c5b ldr r3, [r3, #68] @ 0x44
  27756. 800c1c6: 08db lsrs r3, r3, #3
  27757. 800c1c8: f3c3 030c ubfx r3, r3, #0, #13
  27758. 800c1cc: 693a ldr r2, [r7, #16]
  27759. 800c1ce: fb02 f303 mul.w r3, r2, r3
  27760. 800c1d2: ee07 3a90 vmov s15, r3
  27761. 800c1d6: eef8 7a67 vcvt.f32.u32 s15, s15
  27762. 800c1da: edc7 7a03 vstr s15, [r7, #12]
  27763. if (pll3m != 0U)
  27764. 800c1de: 697b ldr r3, [r7, #20]
  27765. 800c1e0: 2b00 cmp r3, #0
  27766. 800c1e2: f000 8111 beq.w 800c408 <HAL_RCCEx_GetPLL3ClockFreq+0x270>
  27767. {
  27768. switch (pllsource)
  27769. 800c1e6: 69bb ldr r3, [r7, #24]
  27770. 800c1e8: 2b02 cmp r3, #2
  27771. 800c1ea: f000 8083 beq.w 800c2f4 <HAL_RCCEx_GetPLL3ClockFreq+0x15c>
  27772. 800c1ee: 69bb ldr r3, [r7, #24]
  27773. 800c1f0: 2b02 cmp r3, #2
  27774. 800c1f2: f200 80a1 bhi.w 800c338 <HAL_RCCEx_GetPLL3ClockFreq+0x1a0>
  27775. 800c1f6: 69bb ldr r3, [r7, #24]
  27776. 800c1f8: 2b00 cmp r3, #0
  27777. 800c1fa: d003 beq.n 800c204 <HAL_RCCEx_GetPLL3ClockFreq+0x6c>
  27778. 800c1fc: 69bb ldr r3, [r7, #24]
  27779. 800c1fe: 2b01 cmp r3, #1
  27780. 800c200: d056 beq.n 800c2b0 <HAL_RCCEx_GetPLL3ClockFreq+0x118>
  27781. 800c202: e099 b.n 800c338 <HAL_RCCEx_GetPLL3ClockFreq+0x1a0>
  27782. {
  27783. case RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  27784. if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
  27785. 800c204: 4b88 ldr r3, [pc, #544] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27786. 800c206: 681b ldr r3, [r3, #0]
  27787. 800c208: f003 0320 and.w r3, r3, #32
  27788. 800c20c: 2b00 cmp r3, #0
  27789. 800c20e: d02d beq.n 800c26c <HAL_RCCEx_GetPLL3ClockFreq+0xd4>
  27790. {
  27791. hsivalue = (HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3));
  27792. 800c210: 4b85 ldr r3, [pc, #532] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27793. 800c212: 681b ldr r3, [r3, #0]
  27794. 800c214: 08db lsrs r3, r3, #3
  27795. 800c216: f003 0303 and.w r3, r3, #3
  27796. 800c21a: 4a84 ldr r2, [pc, #528] @ (800c42c <HAL_RCCEx_GetPLL3ClockFreq+0x294>)
  27797. 800c21c: fa22 f303 lsr.w r3, r2, r3
  27798. 800c220: 60bb str r3, [r7, #8]
  27799. pll3vco = ((float_t)hsivalue / (float_t)pll3m) * ((float_t)(uint32_t)(RCC->PLL3DIVR & RCC_PLL3DIVR_N3) + (fracn3 / (float_t)0x2000) + (float_t)1);
  27800. 800c222: 68bb ldr r3, [r7, #8]
  27801. 800c224: ee07 3a90 vmov s15, r3
  27802. 800c228: eef8 6a67 vcvt.f32.u32 s13, s15
  27803. 800c22c: 697b ldr r3, [r7, #20]
  27804. 800c22e: ee07 3a90 vmov s15, r3
  27805. 800c232: eef8 7a67 vcvt.f32.u32 s15, s15
  27806. 800c236: ee86 7aa7 vdiv.f32 s14, s13, s15
  27807. 800c23a: 4b7b ldr r3, [pc, #492] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27808. 800c23c: 6c1b ldr r3, [r3, #64] @ 0x40
  27809. 800c23e: f3c3 0308 ubfx r3, r3, #0, #9
  27810. 800c242: ee07 3a90 vmov s15, r3
  27811. 800c246: eef8 6a67 vcvt.f32.u32 s13, s15
  27812. 800c24a: ed97 6a03 vldr s12, [r7, #12]
  27813. 800c24e: eddf 5a78 vldr s11, [pc, #480] @ 800c430 <HAL_RCCEx_GetPLL3ClockFreq+0x298>
  27814. 800c252: eec6 7a25 vdiv.f32 s15, s12, s11
  27815. 800c256: ee76 7aa7 vadd.f32 s15, s13, s15
  27816. 800c25a: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  27817. 800c25e: ee77 7aa6 vadd.f32 s15, s15, s13
  27818. 800c262: ee67 7a27 vmul.f32 s15, s14, s15
  27819. 800c266: edc7 7a07 vstr s15, [r7, #28]
  27820. }
  27821. else
  27822. {
  27823. pll3vco = ((float_t)HSI_VALUE / (float_t)pll3m) * ((float_t)(uint32_t)(RCC->PLL3DIVR & RCC_PLL3DIVR_N3) + (fracn3 / (float_t)0x2000) + (float_t)1);
  27824. }
  27825. break;
  27826. 800c26a: e087 b.n 800c37c <HAL_RCCEx_GetPLL3ClockFreq+0x1e4>
  27827. pll3vco = ((float_t)HSI_VALUE / (float_t)pll3m) * ((float_t)(uint32_t)(RCC->PLL3DIVR & RCC_PLL3DIVR_N3) + (fracn3 / (float_t)0x2000) + (float_t)1);
  27828. 800c26c: 697b ldr r3, [r7, #20]
  27829. 800c26e: ee07 3a90 vmov s15, r3
  27830. 800c272: eef8 7a67 vcvt.f32.u32 s15, s15
  27831. 800c276: eddf 6a6f vldr s13, [pc, #444] @ 800c434 <HAL_RCCEx_GetPLL3ClockFreq+0x29c>
  27832. 800c27a: ee86 7aa7 vdiv.f32 s14, s13, s15
  27833. 800c27e: 4b6a ldr r3, [pc, #424] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27834. 800c280: 6c1b ldr r3, [r3, #64] @ 0x40
  27835. 800c282: f3c3 0308 ubfx r3, r3, #0, #9
  27836. 800c286: ee07 3a90 vmov s15, r3
  27837. 800c28a: eef8 6a67 vcvt.f32.u32 s13, s15
  27838. 800c28e: ed97 6a03 vldr s12, [r7, #12]
  27839. 800c292: eddf 5a67 vldr s11, [pc, #412] @ 800c430 <HAL_RCCEx_GetPLL3ClockFreq+0x298>
  27840. 800c296: eec6 7a25 vdiv.f32 s15, s12, s11
  27841. 800c29a: ee76 7aa7 vadd.f32 s15, s13, s15
  27842. 800c29e: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  27843. 800c2a2: ee77 7aa6 vadd.f32 s15, s15, s13
  27844. 800c2a6: ee67 7a27 vmul.f32 s15, s14, s15
  27845. 800c2aa: edc7 7a07 vstr s15, [r7, #28]
  27846. break;
  27847. 800c2ae: e065 b.n 800c37c <HAL_RCCEx_GetPLL3ClockFreq+0x1e4>
  27848. case RCC_PLLSOURCE_CSI: /* CSI used as PLL clock source */
  27849. pll3vco = ((float_t)CSI_VALUE / (float_t)pll3m) * ((float_t)(uint32_t)(RCC->PLL3DIVR & RCC_PLL3DIVR_N3) + (fracn3 / (float_t)0x2000) + (float_t)1);
  27850. 800c2b0: 697b ldr r3, [r7, #20]
  27851. 800c2b2: ee07 3a90 vmov s15, r3
  27852. 800c2b6: eef8 7a67 vcvt.f32.u32 s15, s15
  27853. 800c2ba: eddf 6a5f vldr s13, [pc, #380] @ 800c438 <HAL_RCCEx_GetPLL3ClockFreq+0x2a0>
  27854. 800c2be: ee86 7aa7 vdiv.f32 s14, s13, s15
  27855. 800c2c2: 4b59 ldr r3, [pc, #356] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27856. 800c2c4: 6c1b ldr r3, [r3, #64] @ 0x40
  27857. 800c2c6: f3c3 0308 ubfx r3, r3, #0, #9
  27858. 800c2ca: ee07 3a90 vmov s15, r3
  27859. 800c2ce: eef8 6a67 vcvt.f32.u32 s13, s15
  27860. 800c2d2: ed97 6a03 vldr s12, [r7, #12]
  27861. 800c2d6: eddf 5a56 vldr s11, [pc, #344] @ 800c430 <HAL_RCCEx_GetPLL3ClockFreq+0x298>
  27862. 800c2da: eec6 7a25 vdiv.f32 s15, s12, s11
  27863. 800c2de: ee76 7aa7 vadd.f32 s15, s13, s15
  27864. 800c2e2: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  27865. 800c2e6: ee77 7aa6 vadd.f32 s15, s15, s13
  27866. 800c2ea: ee67 7a27 vmul.f32 s15, s14, s15
  27867. 800c2ee: edc7 7a07 vstr s15, [r7, #28]
  27868. break;
  27869. 800c2f2: e043 b.n 800c37c <HAL_RCCEx_GetPLL3ClockFreq+0x1e4>
  27870. case RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  27871. pll3vco = ((float_t)HSE_VALUE / (float_t)pll3m) * ((float_t)(uint32_t)(RCC->PLL3DIVR & RCC_PLL3DIVR_N3) + (fracn3 / (float_t)0x2000) + (float_t)1);
  27872. 800c2f4: 697b ldr r3, [r7, #20]
  27873. 800c2f6: ee07 3a90 vmov s15, r3
  27874. 800c2fa: eef8 7a67 vcvt.f32.u32 s15, s15
  27875. 800c2fe: eddf 6a4f vldr s13, [pc, #316] @ 800c43c <HAL_RCCEx_GetPLL3ClockFreq+0x2a4>
  27876. 800c302: ee86 7aa7 vdiv.f32 s14, s13, s15
  27877. 800c306: 4b48 ldr r3, [pc, #288] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27878. 800c308: 6c1b ldr r3, [r3, #64] @ 0x40
  27879. 800c30a: f3c3 0308 ubfx r3, r3, #0, #9
  27880. 800c30e: ee07 3a90 vmov s15, r3
  27881. 800c312: eef8 6a67 vcvt.f32.u32 s13, s15
  27882. 800c316: ed97 6a03 vldr s12, [r7, #12]
  27883. 800c31a: eddf 5a45 vldr s11, [pc, #276] @ 800c430 <HAL_RCCEx_GetPLL3ClockFreq+0x298>
  27884. 800c31e: eec6 7a25 vdiv.f32 s15, s12, s11
  27885. 800c322: ee76 7aa7 vadd.f32 s15, s13, s15
  27886. 800c326: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  27887. 800c32a: ee77 7aa6 vadd.f32 s15, s15, s13
  27888. 800c32e: ee67 7a27 vmul.f32 s15, s14, s15
  27889. 800c332: edc7 7a07 vstr s15, [r7, #28]
  27890. break;
  27891. 800c336: e021 b.n 800c37c <HAL_RCCEx_GetPLL3ClockFreq+0x1e4>
  27892. default:
  27893. pll3vco = ((float_t)CSI_VALUE / (float_t)pll3m) * ((float_t)(uint32_t)(RCC->PLL3DIVR & RCC_PLL3DIVR_N3) + (fracn3 / (float_t)0x2000) + (float_t)1);
  27894. 800c338: 697b ldr r3, [r7, #20]
  27895. 800c33a: ee07 3a90 vmov s15, r3
  27896. 800c33e: eef8 7a67 vcvt.f32.u32 s15, s15
  27897. 800c342: eddf 6a3d vldr s13, [pc, #244] @ 800c438 <HAL_RCCEx_GetPLL3ClockFreq+0x2a0>
  27898. 800c346: ee86 7aa7 vdiv.f32 s14, s13, s15
  27899. 800c34a: 4b37 ldr r3, [pc, #220] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27900. 800c34c: 6c1b ldr r3, [r3, #64] @ 0x40
  27901. 800c34e: f3c3 0308 ubfx r3, r3, #0, #9
  27902. 800c352: ee07 3a90 vmov s15, r3
  27903. 800c356: eef8 6a67 vcvt.f32.u32 s13, s15
  27904. 800c35a: ed97 6a03 vldr s12, [r7, #12]
  27905. 800c35e: eddf 5a34 vldr s11, [pc, #208] @ 800c430 <HAL_RCCEx_GetPLL3ClockFreq+0x298>
  27906. 800c362: eec6 7a25 vdiv.f32 s15, s12, s11
  27907. 800c366: ee76 7aa7 vadd.f32 s15, s13, s15
  27908. 800c36a: eef7 6a00 vmov.f32 s13, #112 @ 0x3f800000 1.0
  27909. 800c36e: ee77 7aa6 vadd.f32 s15, s15, s13
  27910. 800c372: ee67 7a27 vmul.f32 s15, s14, s15
  27911. 800c376: edc7 7a07 vstr s15, [r7, #28]
  27912. break;
  27913. 800c37a: bf00 nop
  27914. }
  27915. PLL3_Clocks->PLL3_P_Frequency = (uint32_t)(float_t)(pll3vco / ((float_t)(uint32_t)((RCC->PLL3DIVR & RCC_PLL3DIVR_P3) >> 9) + (float_t)1)) ;
  27916. 800c37c: 4b2a ldr r3, [pc, #168] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27917. 800c37e: 6c1b ldr r3, [r3, #64] @ 0x40
  27918. 800c380: 0a5b lsrs r3, r3, #9
  27919. 800c382: f003 037f and.w r3, r3, #127 @ 0x7f
  27920. 800c386: ee07 3a90 vmov s15, r3
  27921. 800c38a: eef8 7a67 vcvt.f32.u32 s15, s15
  27922. 800c38e: eeb7 7a00 vmov.f32 s14, #112 @ 0x3f800000 1.0
  27923. 800c392: ee37 7a87 vadd.f32 s14, s15, s14
  27924. 800c396: edd7 6a07 vldr s13, [r7, #28]
  27925. 800c39a: eec6 7a87 vdiv.f32 s15, s13, s14
  27926. 800c39e: eefc 7ae7 vcvt.u32.f32 s15, s15
  27927. 800c3a2: ee17 2a90 vmov r2, s15
  27928. 800c3a6: 687b ldr r3, [r7, #4]
  27929. 800c3a8: 601a str r2, [r3, #0]
  27930. PLL3_Clocks->PLL3_Q_Frequency = (uint32_t)(float_t)(pll3vco / ((float_t)(uint32_t)((RCC->PLL3DIVR & RCC_PLL3DIVR_Q3) >> 16) + (float_t)1)) ;
  27931. 800c3aa: 4b1f ldr r3, [pc, #124] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27932. 800c3ac: 6c1b ldr r3, [r3, #64] @ 0x40
  27933. 800c3ae: 0c1b lsrs r3, r3, #16
  27934. 800c3b0: f003 037f and.w r3, r3, #127 @ 0x7f
  27935. 800c3b4: ee07 3a90 vmov s15, r3
  27936. 800c3b8: eef8 7a67 vcvt.f32.u32 s15, s15
  27937. 800c3bc: eeb7 7a00 vmov.f32 s14, #112 @ 0x3f800000 1.0
  27938. 800c3c0: ee37 7a87 vadd.f32 s14, s15, s14
  27939. 800c3c4: edd7 6a07 vldr s13, [r7, #28]
  27940. 800c3c8: eec6 7a87 vdiv.f32 s15, s13, s14
  27941. 800c3cc: eefc 7ae7 vcvt.u32.f32 s15, s15
  27942. 800c3d0: ee17 2a90 vmov r2, s15
  27943. 800c3d4: 687b ldr r3, [r7, #4]
  27944. 800c3d6: 605a str r2, [r3, #4]
  27945. PLL3_Clocks->PLL3_R_Frequency = (uint32_t)(float_t)(pll3vco / ((float_t)(uint32_t)((RCC->PLL3DIVR & RCC_PLL3DIVR_R3) >> 24) + (float_t)1)) ;
  27946. 800c3d8: 4b13 ldr r3, [pc, #76] @ (800c428 <HAL_RCCEx_GetPLL3ClockFreq+0x290>)
  27947. 800c3da: 6c1b ldr r3, [r3, #64] @ 0x40
  27948. 800c3dc: 0e1b lsrs r3, r3, #24
  27949. 800c3de: f003 037f and.w r3, r3, #127 @ 0x7f
  27950. 800c3e2: ee07 3a90 vmov s15, r3
  27951. 800c3e6: eef8 7a67 vcvt.f32.u32 s15, s15
  27952. 800c3ea: eeb7 7a00 vmov.f32 s14, #112 @ 0x3f800000 1.0
  27953. 800c3ee: ee37 7a87 vadd.f32 s14, s15, s14
  27954. 800c3f2: edd7 6a07 vldr s13, [r7, #28]
  27955. 800c3f6: eec6 7a87 vdiv.f32 s15, s13, s14
  27956. 800c3fa: eefc 7ae7 vcvt.u32.f32 s15, s15
  27957. 800c3fe: ee17 2a90 vmov r2, s15
  27958. 800c402: 687b ldr r3, [r7, #4]
  27959. 800c404: 609a str r2, [r3, #8]
  27960. PLL3_Clocks->PLL3_P_Frequency = 0U;
  27961. PLL3_Clocks->PLL3_Q_Frequency = 0U;
  27962. PLL3_Clocks->PLL3_R_Frequency = 0U;
  27963. }
  27964. }
  27965. 800c406: e008 b.n 800c41a <HAL_RCCEx_GetPLL3ClockFreq+0x282>
  27966. PLL3_Clocks->PLL3_P_Frequency = 0U;
  27967. 800c408: 687b ldr r3, [r7, #4]
  27968. 800c40a: 2200 movs r2, #0
  27969. 800c40c: 601a str r2, [r3, #0]
  27970. PLL3_Clocks->PLL3_Q_Frequency = 0U;
  27971. 800c40e: 687b ldr r3, [r7, #4]
  27972. 800c410: 2200 movs r2, #0
  27973. 800c412: 605a str r2, [r3, #4]
  27974. PLL3_Clocks->PLL3_R_Frequency = 0U;
  27975. 800c414: 687b ldr r3, [r7, #4]
  27976. 800c416: 2200 movs r2, #0
  27977. 800c418: 609a str r2, [r3, #8]
  27978. }
  27979. 800c41a: bf00 nop
  27980. 800c41c: 3724 adds r7, #36 @ 0x24
  27981. 800c41e: 46bd mov sp, r7
  27982. 800c420: f85d 7b04 ldr.w r7, [sp], #4
  27983. 800c424: 4770 bx lr
  27984. 800c426: bf00 nop
  27985. 800c428: 58024400 .word 0x58024400
  27986. 800c42c: 03d09000 .word 0x03d09000
  27987. 800c430: 46000000 .word 0x46000000
  27988. 800c434: 4c742400 .word 0x4c742400
  27989. 800c438: 4a742400 .word 0x4a742400
  27990. 800c43c: 4bbebc20 .word 0x4bbebc20
  27991. 0800c440 <RCCEx_PLL2_Config>:
  27992. * @note PLL2 is temporary disabled to apply new parameters
  27993. *
  27994. * @retval HAL status
  27995. */
  27996. static HAL_StatusTypeDef RCCEx_PLL2_Config(RCC_PLL2InitTypeDef *pll2, uint32_t Divider)
  27997. {
  27998. 800c440: b580 push {r7, lr}
  27999. 800c442: b084 sub sp, #16
  28000. 800c444: af00 add r7, sp, #0
  28001. 800c446: 6078 str r0, [r7, #4]
  28002. 800c448: 6039 str r1, [r7, #0]
  28003. uint32_t tickstart;
  28004. HAL_StatusTypeDef status = HAL_OK;
  28005. 800c44a: 2300 movs r3, #0
  28006. 800c44c: 73fb strb r3, [r7, #15]
  28007. assert_param(IS_RCC_PLL2RGE_VALUE(pll2->PLL2RGE));
  28008. assert_param(IS_RCC_PLL2VCO_VALUE(pll2->PLL2VCOSEL));
  28009. assert_param(IS_RCC_PLLFRACN_VALUE(pll2->PLL2FRACN));
  28010. /* Check that PLL2 OSC clock source is already set */
  28011. if (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_NONE)
  28012. 800c44e: 4b53 ldr r3, [pc, #332] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28013. 800c450: 6a9b ldr r3, [r3, #40] @ 0x28
  28014. 800c452: f003 0303 and.w r3, r3, #3
  28015. 800c456: 2b03 cmp r3, #3
  28016. 800c458: d101 bne.n 800c45e <RCCEx_PLL2_Config+0x1e>
  28017. {
  28018. return HAL_ERROR;
  28019. 800c45a: 2301 movs r3, #1
  28020. 800c45c: e099 b.n 800c592 <RCCEx_PLL2_Config+0x152>
  28021. else
  28022. {
  28023. /* Disable PLL2. */
  28024. __HAL_RCC_PLL2_DISABLE();
  28025. 800c45e: 4b4f ldr r3, [pc, #316] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28026. 800c460: 681b ldr r3, [r3, #0]
  28027. 800c462: 4a4e ldr r2, [pc, #312] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28028. 800c464: f023 6380 bic.w r3, r3, #67108864 @ 0x4000000
  28029. 800c468: 6013 str r3, [r2, #0]
  28030. /* Get Start Tick*/
  28031. tickstart = HAL_GetTick();
  28032. 800c46a: f7f8 fde1 bl 8005030 <HAL_GetTick>
  28033. 800c46e: 60b8 str r0, [r7, #8]
  28034. /* Wait till PLL is disabled */
  28035. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) != 0U)
  28036. 800c470: e008 b.n 800c484 <RCCEx_PLL2_Config+0x44>
  28037. {
  28038. if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
  28039. 800c472: f7f8 fddd bl 8005030 <HAL_GetTick>
  28040. 800c476: 4602 mov r2, r0
  28041. 800c478: 68bb ldr r3, [r7, #8]
  28042. 800c47a: 1ad3 subs r3, r2, r3
  28043. 800c47c: 2b02 cmp r3, #2
  28044. 800c47e: d901 bls.n 800c484 <RCCEx_PLL2_Config+0x44>
  28045. {
  28046. return HAL_TIMEOUT;
  28047. 800c480: 2303 movs r3, #3
  28048. 800c482: e086 b.n 800c592 <RCCEx_PLL2_Config+0x152>
  28049. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) != 0U)
  28050. 800c484: 4b45 ldr r3, [pc, #276] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28051. 800c486: 681b ldr r3, [r3, #0]
  28052. 800c488: f003 6300 and.w r3, r3, #134217728 @ 0x8000000
  28053. 800c48c: 2b00 cmp r3, #0
  28054. 800c48e: d1f0 bne.n 800c472 <RCCEx_PLL2_Config+0x32>
  28055. }
  28056. }
  28057. /* Configure PLL2 multiplication and division factors. */
  28058. __HAL_RCC_PLL2_CONFIG(pll2->PLL2M,
  28059. 800c490: 4b42 ldr r3, [pc, #264] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28060. 800c492: 6a9b ldr r3, [r3, #40] @ 0x28
  28061. 800c494: f423 327c bic.w r2, r3, #258048 @ 0x3f000
  28062. 800c498: 687b ldr r3, [r7, #4]
  28063. 800c49a: 681b ldr r3, [r3, #0]
  28064. 800c49c: 031b lsls r3, r3, #12
  28065. 800c49e: 493f ldr r1, [pc, #252] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28066. 800c4a0: 4313 orrs r3, r2
  28067. 800c4a2: 628b str r3, [r1, #40] @ 0x28
  28068. 800c4a4: 687b ldr r3, [r7, #4]
  28069. 800c4a6: 685b ldr r3, [r3, #4]
  28070. 800c4a8: 3b01 subs r3, #1
  28071. 800c4aa: f3c3 0208 ubfx r2, r3, #0, #9
  28072. 800c4ae: 687b ldr r3, [r7, #4]
  28073. 800c4b0: 689b ldr r3, [r3, #8]
  28074. 800c4b2: 3b01 subs r3, #1
  28075. 800c4b4: 025b lsls r3, r3, #9
  28076. 800c4b6: b29b uxth r3, r3
  28077. 800c4b8: 431a orrs r2, r3
  28078. 800c4ba: 687b ldr r3, [r7, #4]
  28079. 800c4bc: 68db ldr r3, [r3, #12]
  28080. 800c4be: 3b01 subs r3, #1
  28081. 800c4c0: 041b lsls r3, r3, #16
  28082. 800c4c2: f403 03fe and.w r3, r3, #8323072 @ 0x7f0000
  28083. 800c4c6: 431a orrs r2, r3
  28084. 800c4c8: 687b ldr r3, [r7, #4]
  28085. 800c4ca: 691b ldr r3, [r3, #16]
  28086. 800c4cc: 3b01 subs r3, #1
  28087. 800c4ce: 061b lsls r3, r3, #24
  28088. 800c4d0: f003 43fe and.w r3, r3, #2130706432 @ 0x7f000000
  28089. 800c4d4: 4931 ldr r1, [pc, #196] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28090. 800c4d6: 4313 orrs r3, r2
  28091. 800c4d8: 638b str r3, [r1, #56] @ 0x38
  28092. pll2->PLL2P,
  28093. pll2->PLL2Q,
  28094. pll2->PLL2R);
  28095. /* Select PLL2 input reference frequency range: VCI */
  28096. __HAL_RCC_PLL2_VCIRANGE(pll2->PLL2RGE) ;
  28097. 800c4da: 4b30 ldr r3, [pc, #192] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28098. 800c4dc: 6adb ldr r3, [r3, #44] @ 0x2c
  28099. 800c4de: f023 02c0 bic.w r2, r3, #192 @ 0xc0
  28100. 800c4e2: 687b ldr r3, [r7, #4]
  28101. 800c4e4: 695b ldr r3, [r3, #20]
  28102. 800c4e6: 492d ldr r1, [pc, #180] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28103. 800c4e8: 4313 orrs r3, r2
  28104. 800c4ea: 62cb str r3, [r1, #44] @ 0x2c
  28105. /* Select PLL2 output frequency range : VCO */
  28106. __HAL_RCC_PLL2_VCORANGE(pll2->PLL2VCOSEL) ;
  28107. 800c4ec: 4b2b ldr r3, [pc, #172] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28108. 800c4ee: 6adb ldr r3, [r3, #44] @ 0x2c
  28109. 800c4f0: f023 0220 bic.w r2, r3, #32
  28110. 800c4f4: 687b ldr r3, [r7, #4]
  28111. 800c4f6: 699b ldr r3, [r3, #24]
  28112. 800c4f8: 4928 ldr r1, [pc, #160] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28113. 800c4fa: 4313 orrs r3, r2
  28114. 800c4fc: 62cb str r3, [r1, #44] @ 0x2c
  28115. /* Disable PLL2FRACN . */
  28116. __HAL_RCC_PLL2FRACN_DISABLE();
  28117. 800c4fe: 4b27 ldr r3, [pc, #156] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28118. 800c500: 6adb ldr r3, [r3, #44] @ 0x2c
  28119. 800c502: 4a26 ldr r2, [pc, #152] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28120. 800c504: f023 0310 bic.w r3, r3, #16
  28121. 800c508: 62d3 str r3, [r2, #44] @ 0x2c
  28122. /* Configures PLL2 clock Fractional Part Of The Multiplication Factor */
  28123. __HAL_RCC_PLL2FRACN_CONFIG(pll2->PLL2FRACN);
  28124. 800c50a: 4b24 ldr r3, [pc, #144] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28125. 800c50c: 6bda ldr r2, [r3, #60] @ 0x3c
  28126. 800c50e: 4b24 ldr r3, [pc, #144] @ (800c5a0 <RCCEx_PLL2_Config+0x160>)
  28127. 800c510: 4013 ands r3, r2
  28128. 800c512: 687a ldr r2, [r7, #4]
  28129. 800c514: 69d2 ldr r2, [r2, #28]
  28130. 800c516: 00d2 lsls r2, r2, #3
  28131. 800c518: 4920 ldr r1, [pc, #128] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28132. 800c51a: 4313 orrs r3, r2
  28133. 800c51c: 63cb str r3, [r1, #60] @ 0x3c
  28134. /* Enable PLL2FRACN . */
  28135. __HAL_RCC_PLL2FRACN_ENABLE();
  28136. 800c51e: 4b1f ldr r3, [pc, #124] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28137. 800c520: 6adb ldr r3, [r3, #44] @ 0x2c
  28138. 800c522: 4a1e ldr r2, [pc, #120] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28139. 800c524: f043 0310 orr.w r3, r3, #16
  28140. 800c528: 62d3 str r3, [r2, #44] @ 0x2c
  28141. /* Enable the PLL2 clock output */
  28142. if (Divider == DIVIDER_P_UPDATE)
  28143. 800c52a: 683b ldr r3, [r7, #0]
  28144. 800c52c: 2b00 cmp r3, #0
  28145. 800c52e: d106 bne.n 800c53e <RCCEx_PLL2_Config+0xfe>
  28146. {
  28147. __HAL_RCC_PLL2CLKOUT_ENABLE(RCC_PLL2_DIVP);
  28148. 800c530: 4b1a ldr r3, [pc, #104] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28149. 800c532: 6adb ldr r3, [r3, #44] @ 0x2c
  28150. 800c534: 4a19 ldr r2, [pc, #100] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28151. 800c536: f443 2300 orr.w r3, r3, #524288 @ 0x80000
  28152. 800c53a: 62d3 str r3, [r2, #44] @ 0x2c
  28153. 800c53c: e00f b.n 800c55e <RCCEx_PLL2_Config+0x11e>
  28154. }
  28155. else if (Divider == DIVIDER_Q_UPDATE)
  28156. 800c53e: 683b ldr r3, [r7, #0]
  28157. 800c540: 2b01 cmp r3, #1
  28158. 800c542: d106 bne.n 800c552 <RCCEx_PLL2_Config+0x112>
  28159. {
  28160. __HAL_RCC_PLL2CLKOUT_ENABLE(RCC_PLL2_DIVQ);
  28161. 800c544: 4b15 ldr r3, [pc, #84] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28162. 800c546: 6adb ldr r3, [r3, #44] @ 0x2c
  28163. 800c548: 4a14 ldr r2, [pc, #80] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28164. 800c54a: f443 1380 orr.w r3, r3, #1048576 @ 0x100000
  28165. 800c54e: 62d3 str r3, [r2, #44] @ 0x2c
  28166. 800c550: e005 b.n 800c55e <RCCEx_PLL2_Config+0x11e>
  28167. }
  28168. else
  28169. {
  28170. __HAL_RCC_PLL2CLKOUT_ENABLE(RCC_PLL2_DIVR);
  28171. 800c552: 4b12 ldr r3, [pc, #72] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28172. 800c554: 6adb ldr r3, [r3, #44] @ 0x2c
  28173. 800c556: 4a11 ldr r2, [pc, #68] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28174. 800c558: f443 1300 orr.w r3, r3, #2097152 @ 0x200000
  28175. 800c55c: 62d3 str r3, [r2, #44] @ 0x2c
  28176. }
  28177. /* Enable PLL2. */
  28178. __HAL_RCC_PLL2_ENABLE();
  28179. 800c55e: 4b0f ldr r3, [pc, #60] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28180. 800c560: 681b ldr r3, [r3, #0]
  28181. 800c562: 4a0e ldr r2, [pc, #56] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28182. 800c564: f043 6380 orr.w r3, r3, #67108864 @ 0x4000000
  28183. 800c568: 6013 str r3, [r2, #0]
  28184. /* Get Start Tick*/
  28185. tickstart = HAL_GetTick();
  28186. 800c56a: f7f8 fd61 bl 8005030 <HAL_GetTick>
  28187. 800c56e: 60b8 str r0, [r7, #8]
  28188. /* Wait till PLL2 is ready */
  28189. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) == 0U)
  28190. 800c570: e008 b.n 800c584 <RCCEx_PLL2_Config+0x144>
  28191. {
  28192. if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
  28193. 800c572: f7f8 fd5d bl 8005030 <HAL_GetTick>
  28194. 800c576: 4602 mov r2, r0
  28195. 800c578: 68bb ldr r3, [r7, #8]
  28196. 800c57a: 1ad3 subs r3, r2, r3
  28197. 800c57c: 2b02 cmp r3, #2
  28198. 800c57e: d901 bls.n 800c584 <RCCEx_PLL2_Config+0x144>
  28199. {
  28200. return HAL_TIMEOUT;
  28201. 800c580: 2303 movs r3, #3
  28202. 800c582: e006 b.n 800c592 <RCCEx_PLL2_Config+0x152>
  28203. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) == 0U)
  28204. 800c584: 4b05 ldr r3, [pc, #20] @ (800c59c <RCCEx_PLL2_Config+0x15c>)
  28205. 800c586: 681b ldr r3, [r3, #0]
  28206. 800c588: f003 6300 and.w r3, r3, #134217728 @ 0x8000000
  28207. 800c58c: 2b00 cmp r3, #0
  28208. 800c58e: d0f0 beq.n 800c572 <RCCEx_PLL2_Config+0x132>
  28209. }
  28210. }
  28211. return status;
  28212. 800c590: 7bfb ldrb r3, [r7, #15]
  28213. }
  28214. 800c592: 4618 mov r0, r3
  28215. 800c594: 3710 adds r7, #16
  28216. 800c596: 46bd mov sp, r7
  28217. 800c598: bd80 pop {r7, pc}
  28218. 800c59a: bf00 nop
  28219. 800c59c: 58024400 .word 0x58024400
  28220. 800c5a0: ffff0007 .word 0xffff0007
  28221. 0800c5a4 <RCCEx_PLL3_Config>:
  28222. * @note PLL3 is temporary disabled to apply new parameters
  28223. *
  28224. * @retval HAL status
  28225. */
  28226. static HAL_StatusTypeDef RCCEx_PLL3_Config(RCC_PLL3InitTypeDef *pll3, uint32_t Divider)
  28227. {
  28228. 800c5a4: b580 push {r7, lr}
  28229. 800c5a6: b084 sub sp, #16
  28230. 800c5a8: af00 add r7, sp, #0
  28231. 800c5aa: 6078 str r0, [r7, #4]
  28232. 800c5ac: 6039 str r1, [r7, #0]
  28233. uint32_t tickstart;
  28234. HAL_StatusTypeDef status = HAL_OK;
  28235. 800c5ae: 2300 movs r3, #0
  28236. 800c5b0: 73fb strb r3, [r7, #15]
  28237. assert_param(IS_RCC_PLL3RGE_VALUE(pll3->PLL3RGE));
  28238. assert_param(IS_RCC_PLL3VCO_VALUE(pll3->PLL3VCOSEL));
  28239. assert_param(IS_RCC_PLLFRACN_VALUE(pll3->PLL3FRACN));
  28240. /* Check that PLL3 OSC clock source is already set */
  28241. if (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_NONE)
  28242. 800c5b2: 4b53 ldr r3, [pc, #332] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28243. 800c5b4: 6a9b ldr r3, [r3, #40] @ 0x28
  28244. 800c5b6: f003 0303 and.w r3, r3, #3
  28245. 800c5ba: 2b03 cmp r3, #3
  28246. 800c5bc: d101 bne.n 800c5c2 <RCCEx_PLL3_Config+0x1e>
  28247. {
  28248. return HAL_ERROR;
  28249. 800c5be: 2301 movs r3, #1
  28250. 800c5c0: e099 b.n 800c6f6 <RCCEx_PLL3_Config+0x152>
  28251. else
  28252. {
  28253. /* Disable PLL3. */
  28254. __HAL_RCC_PLL3_DISABLE();
  28255. 800c5c2: 4b4f ldr r3, [pc, #316] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28256. 800c5c4: 681b ldr r3, [r3, #0]
  28257. 800c5c6: 4a4e ldr r2, [pc, #312] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28258. 800c5c8: f023 5380 bic.w r3, r3, #268435456 @ 0x10000000
  28259. 800c5cc: 6013 str r3, [r2, #0]
  28260. /* Get Start Tick*/
  28261. tickstart = HAL_GetTick();
  28262. 800c5ce: f7f8 fd2f bl 8005030 <HAL_GetTick>
  28263. 800c5d2: 60b8 str r0, [r7, #8]
  28264. /* Wait till PLL3 is ready */
  28265. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL3RDY) != 0U)
  28266. 800c5d4: e008 b.n 800c5e8 <RCCEx_PLL3_Config+0x44>
  28267. {
  28268. if ((HAL_GetTick() - tickstart) > PLL3_TIMEOUT_VALUE)
  28269. 800c5d6: f7f8 fd2b bl 8005030 <HAL_GetTick>
  28270. 800c5da: 4602 mov r2, r0
  28271. 800c5dc: 68bb ldr r3, [r7, #8]
  28272. 800c5de: 1ad3 subs r3, r2, r3
  28273. 800c5e0: 2b02 cmp r3, #2
  28274. 800c5e2: d901 bls.n 800c5e8 <RCCEx_PLL3_Config+0x44>
  28275. {
  28276. return HAL_TIMEOUT;
  28277. 800c5e4: 2303 movs r3, #3
  28278. 800c5e6: e086 b.n 800c6f6 <RCCEx_PLL3_Config+0x152>
  28279. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL3RDY) != 0U)
  28280. 800c5e8: 4b45 ldr r3, [pc, #276] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28281. 800c5ea: 681b ldr r3, [r3, #0]
  28282. 800c5ec: f003 5300 and.w r3, r3, #536870912 @ 0x20000000
  28283. 800c5f0: 2b00 cmp r3, #0
  28284. 800c5f2: d1f0 bne.n 800c5d6 <RCCEx_PLL3_Config+0x32>
  28285. }
  28286. }
  28287. /* Configure the PLL3 multiplication and division factors. */
  28288. __HAL_RCC_PLL3_CONFIG(pll3->PLL3M,
  28289. 800c5f4: 4b42 ldr r3, [pc, #264] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28290. 800c5f6: 6a9b ldr r3, [r3, #40] @ 0x28
  28291. 800c5f8: f023 727c bic.w r2, r3, #66060288 @ 0x3f00000
  28292. 800c5fc: 687b ldr r3, [r7, #4]
  28293. 800c5fe: 681b ldr r3, [r3, #0]
  28294. 800c600: 051b lsls r3, r3, #20
  28295. 800c602: 493f ldr r1, [pc, #252] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28296. 800c604: 4313 orrs r3, r2
  28297. 800c606: 628b str r3, [r1, #40] @ 0x28
  28298. 800c608: 687b ldr r3, [r7, #4]
  28299. 800c60a: 685b ldr r3, [r3, #4]
  28300. 800c60c: 3b01 subs r3, #1
  28301. 800c60e: f3c3 0208 ubfx r2, r3, #0, #9
  28302. 800c612: 687b ldr r3, [r7, #4]
  28303. 800c614: 689b ldr r3, [r3, #8]
  28304. 800c616: 3b01 subs r3, #1
  28305. 800c618: 025b lsls r3, r3, #9
  28306. 800c61a: b29b uxth r3, r3
  28307. 800c61c: 431a orrs r2, r3
  28308. 800c61e: 687b ldr r3, [r7, #4]
  28309. 800c620: 68db ldr r3, [r3, #12]
  28310. 800c622: 3b01 subs r3, #1
  28311. 800c624: 041b lsls r3, r3, #16
  28312. 800c626: f403 03fe and.w r3, r3, #8323072 @ 0x7f0000
  28313. 800c62a: 431a orrs r2, r3
  28314. 800c62c: 687b ldr r3, [r7, #4]
  28315. 800c62e: 691b ldr r3, [r3, #16]
  28316. 800c630: 3b01 subs r3, #1
  28317. 800c632: 061b lsls r3, r3, #24
  28318. 800c634: f003 43fe and.w r3, r3, #2130706432 @ 0x7f000000
  28319. 800c638: 4931 ldr r1, [pc, #196] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28320. 800c63a: 4313 orrs r3, r2
  28321. 800c63c: 640b str r3, [r1, #64] @ 0x40
  28322. pll3->PLL3P,
  28323. pll3->PLL3Q,
  28324. pll3->PLL3R);
  28325. /* Select PLL3 input reference frequency range: VCI */
  28326. __HAL_RCC_PLL3_VCIRANGE(pll3->PLL3RGE) ;
  28327. 800c63e: 4b30 ldr r3, [pc, #192] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28328. 800c640: 6adb ldr r3, [r3, #44] @ 0x2c
  28329. 800c642: f423 6240 bic.w r2, r3, #3072 @ 0xc00
  28330. 800c646: 687b ldr r3, [r7, #4]
  28331. 800c648: 695b ldr r3, [r3, #20]
  28332. 800c64a: 492d ldr r1, [pc, #180] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28333. 800c64c: 4313 orrs r3, r2
  28334. 800c64e: 62cb str r3, [r1, #44] @ 0x2c
  28335. /* Select PLL3 output frequency range : VCO */
  28336. __HAL_RCC_PLL3_VCORANGE(pll3->PLL3VCOSEL) ;
  28337. 800c650: 4b2b ldr r3, [pc, #172] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28338. 800c652: 6adb ldr r3, [r3, #44] @ 0x2c
  28339. 800c654: f423 7200 bic.w r2, r3, #512 @ 0x200
  28340. 800c658: 687b ldr r3, [r7, #4]
  28341. 800c65a: 699b ldr r3, [r3, #24]
  28342. 800c65c: 4928 ldr r1, [pc, #160] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28343. 800c65e: 4313 orrs r3, r2
  28344. 800c660: 62cb str r3, [r1, #44] @ 0x2c
  28345. /* Disable PLL3FRACN . */
  28346. __HAL_RCC_PLL3FRACN_DISABLE();
  28347. 800c662: 4b27 ldr r3, [pc, #156] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28348. 800c664: 6adb ldr r3, [r3, #44] @ 0x2c
  28349. 800c666: 4a26 ldr r2, [pc, #152] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28350. 800c668: f423 7380 bic.w r3, r3, #256 @ 0x100
  28351. 800c66c: 62d3 str r3, [r2, #44] @ 0x2c
  28352. /* Configures PLL3 clock Fractional Part Of The Multiplication Factor */
  28353. __HAL_RCC_PLL3FRACN_CONFIG(pll3->PLL3FRACN);
  28354. 800c66e: 4b24 ldr r3, [pc, #144] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28355. 800c670: 6c5a ldr r2, [r3, #68] @ 0x44
  28356. 800c672: 4b24 ldr r3, [pc, #144] @ (800c704 <RCCEx_PLL3_Config+0x160>)
  28357. 800c674: 4013 ands r3, r2
  28358. 800c676: 687a ldr r2, [r7, #4]
  28359. 800c678: 69d2 ldr r2, [r2, #28]
  28360. 800c67a: 00d2 lsls r2, r2, #3
  28361. 800c67c: 4920 ldr r1, [pc, #128] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28362. 800c67e: 4313 orrs r3, r2
  28363. 800c680: 644b str r3, [r1, #68] @ 0x44
  28364. /* Enable PLL3FRACN . */
  28365. __HAL_RCC_PLL3FRACN_ENABLE();
  28366. 800c682: 4b1f ldr r3, [pc, #124] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28367. 800c684: 6adb ldr r3, [r3, #44] @ 0x2c
  28368. 800c686: 4a1e ldr r2, [pc, #120] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28369. 800c688: f443 7380 orr.w r3, r3, #256 @ 0x100
  28370. 800c68c: 62d3 str r3, [r2, #44] @ 0x2c
  28371. /* Enable the PLL3 clock output */
  28372. if (Divider == DIVIDER_P_UPDATE)
  28373. 800c68e: 683b ldr r3, [r7, #0]
  28374. 800c690: 2b00 cmp r3, #0
  28375. 800c692: d106 bne.n 800c6a2 <RCCEx_PLL3_Config+0xfe>
  28376. {
  28377. __HAL_RCC_PLL3CLKOUT_ENABLE(RCC_PLL3_DIVP);
  28378. 800c694: 4b1a ldr r3, [pc, #104] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28379. 800c696: 6adb ldr r3, [r3, #44] @ 0x2c
  28380. 800c698: 4a19 ldr r2, [pc, #100] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28381. 800c69a: f443 0380 orr.w r3, r3, #4194304 @ 0x400000
  28382. 800c69e: 62d3 str r3, [r2, #44] @ 0x2c
  28383. 800c6a0: e00f b.n 800c6c2 <RCCEx_PLL3_Config+0x11e>
  28384. }
  28385. else if (Divider == DIVIDER_Q_UPDATE)
  28386. 800c6a2: 683b ldr r3, [r7, #0]
  28387. 800c6a4: 2b01 cmp r3, #1
  28388. 800c6a6: d106 bne.n 800c6b6 <RCCEx_PLL3_Config+0x112>
  28389. {
  28390. __HAL_RCC_PLL3CLKOUT_ENABLE(RCC_PLL3_DIVQ);
  28391. 800c6a8: 4b15 ldr r3, [pc, #84] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28392. 800c6aa: 6adb ldr r3, [r3, #44] @ 0x2c
  28393. 800c6ac: 4a14 ldr r2, [pc, #80] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28394. 800c6ae: f443 0300 orr.w r3, r3, #8388608 @ 0x800000
  28395. 800c6b2: 62d3 str r3, [r2, #44] @ 0x2c
  28396. 800c6b4: e005 b.n 800c6c2 <RCCEx_PLL3_Config+0x11e>
  28397. }
  28398. else
  28399. {
  28400. __HAL_RCC_PLL3CLKOUT_ENABLE(RCC_PLL3_DIVR);
  28401. 800c6b6: 4b12 ldr r3, [pc, #72] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28402. 800c6b8: 6adb ldr r3, [r3, #44] @ 0x2c
  28403. 800c6ba: 4a11 ldr r2, [pc, #68] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28404. 800c6bc: f043 7380 orr.w r3, r3, #16777216 @ 0x1000000
  28405. 800c6c0: 62d3 str r3, [r2, #44] @ 0x2c
  28406. }
  28407. /* Enable PLL3. */
  28408. __HAL_RCC_PLL3_ENABLE();
  28409. 800c6c2: 4b0f ldr r3, [pc, #60] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28410. 800c6c4: 681b ldr r3, [r3, #0]
  28411. 800c6c6: 4a0e ldr r2, [pc, #56] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28412. 800c6c8: f043 5380 orr.w r3, r3, #268435456 @ 0x10000000
  28413. 800c6cc: 6013 str r3, [r2, #0]
  28414. /* Get Start Tick*/
  28415. tickstart = HAL_GetTick();
  28416. 800c6ce: f7f8 fcaf bl 8005030 <HAL_GetTick>
  28417. 800c6d2: 60b8 str r0, [r7, #8]
  28418. /* Wait till PLL3 is ready */
  28419. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL3RDY) == 0U)
  28420. 800c6d4: e008 b.n 800c6e8 <RCCEx_PLL3_Config+0x144>
  28421. {
  28422. if ((HAL_GetTick() - tickstart) > PLL3_TIMEOUT_VALUE)
  28423. 800c6d6: f7f8 fcab bl 8005030 <HAL_GetTick>
  28424. 800c6da: 4602 mov r2, r0
  28425. 800c6dc: 68bb ldr r3, [r7, #8]
  28426. 800c6de: 1ad3 subs r3, r2, r3
  28427. 800c6e0: 2b02 cmp r3, #2
  28428. 800c6e2: d901 bls.n 800c6e8 <RCCEx_PLL3_Config+0x144>
  28429. {
  28430. return HAL_TIMEOUT;
  28431. 800c6e4: 2303 movs r3, #3
  28432. 800c6e6: e006 b.n 800c6f6 <RCCEx_PLL3_Config+0x152>
  28433. while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL3RDY) == 0U)
  28434. 800c6e8: 4b05 ldr r3, [pc, #20] @ (800c700 <RCCEx_PLL3_Config+0x15c>)
  28435. 800c6ea: 681b ldr r3, [r3, #0]
  28436. 800c6ec: f003 5300 and.w r3, r3, #536870912 @ 0x20000000
  28437. 800c6f0: 2b00 cmp r3, #0
  28438. 800c6f2: d0f0 beq.n 800c6d6 <RCCEx_PLL3_Config+0x132>
  28439. }
  28440. }
  28441. return status;
  28442. 800c6f4: 7bfb ldrb r3, [r7, #15]
  28443. }
  28444. 800c6f6: 4618 mov r0, r3
  28445. 800c6f8: 3710 adds r7, #16
  28446. 800c6fa: 46bd mov sp, r7
  28447. 800c6fc: bd80 pop {r7, pc}
  28448. 800c6fe: bf00 nop
  28449. 800c700: 58024400 .word 0x58024400
  28450. 800c704: ffff0007 .word 0xffff0007
  28451. 0800c708 <HAL_RNG_Init>:
  28452. * @param hrng pointer to a RNG_HandleTypeDef structure that contains
  28453. * the configuration information for RNG.
  28454. * @retval HAL status
  28455. */
  28456. HAL_StatusTypeDef HAL_RNG_Init(RNG_HandleTypeDef *hrng)
  28457. {
  28458. 800c708: b580 push {r7, lr}
  28459. 800c70a: b084 sub sp, #16
  28460. 800c70c: af00 add r7, sp, #0
  28461. 800c70e: 6078 str r0, [r7, #4]
  28462. uint32_t tickstart;
  28463. /* Check the RNG handle allocation */
  28464. if (hrng == NULL)
  28465. 800c710: 687b ldr r3, [r7, #4]
  28466. 800c712: 2b00 cmp r3, #0
  28467. 800c714: d101 bne.n 800c71a <HAL_RNG_Init+0x12>
  28468. {
  28469. return HAL_ERROR;
  28470. 800c716: 2301 movs r3, #1
  28471. 800c718: e054 b.n 800c7c4 <HAL_RNG_Init+0xbc>
  28472. /* Init the low level hardware */
  28473. hrng->MspInitCallback(hrng);
  28474. }
  28475. #else
  28476. if (hrng->State == HAL_RNG_STATE_RESET)
  28477. 800c71a: 687b ldr r3, [r7, #4]
  28478. 800c71c: 7a5b ldrb r3, [r3, #9]
  28479. 800c71e: b2db uxtb r3, r3
  28480. 800c720: 2b00 cmp r3, #0
  28481. 800c722: d105 bne.n 800c730 <HAL_RNG_Init+0x28>
  28482. {
  28483. /* Allocate lock resource and initialize it */
  28484. hrng->Lock = HAL_UNLOCKED;
  28485. 800c724: 687b ldr r3, [r7, #4]
  28486. 800c726: 2200 movs r2, #0
  28487. 800c728: 721a strb r2, [r3, #8]
  28488. /* Init the low level hardware */
  28489. HAL_RNG_MspInit(hrng);
  28490. 800c72a: 6878 ldr r0, [r7, #4]
  28491. 800c72c: f7f6 fe2e bl 800338c <HAL_RNG_MspInit>
  28492. }
  28493. #endif /* USE_HAL_RNG_REGISTER_CALLBACKS */
  28494. /* Change RNG peripheral state */
  28495. hrng->State = HAL_RNG_STATE_BUSY;
  28496. 800c730: 687b ldr r3, [r7, #4]
  28497. 800c732: 2202 movs r2, #2
  28498. 800c734: 725a strb r2, [r3, #9]
  28499. }
  28500. }
  28501. }
  28502. #else
  28503. /* Clock Error Detection Configuration */
  28504. MODIFY_REG(hrng->Instance->CR, RNG_CR_CED, hrng->Init.ClockErrorDetection);
  28505. 800c736: 687b ldr r3, [r7, #4]
  28506. 800c738: 681b ldr r3, [r3, #0]
  28507. 800c73a: 681b ldr r3, [r3, #0]
  28508. 800c73c: f023 0120 bic.w r1, r3, #32
  28509. 800c740: 687b ldr r3, [r7, #4]
  28510. 800c742: 685a ldr r2, [r3, #4]
  28511. 800c744: 687b ldr r3, [r7, #4]
  28512. 800c746: 681b ldr r3, [r3, #0]
  28513. 800c748: 430a orrs r2, r1
  28514. 800c74a: 601a str r2, [r3, #0]
  28515. #endif /* RNG_CR_CONDRST */
  28516. /* Enable the RNG Peripheral */
  28517. __HAL_RNG_ENABLE(hrng);
  28518. 800c74c: 687b ldr r3, [r7, #4]
  28519. 800c74e: 681b ldr r3, [r3, #0]
  28520. 800c750: 681a ldr r2, [r3, #0]
  28521. 800c752: 687b ldr r3, [r7, #4]
  28522. 800c754: 681b ldr r3, [r3, #0]
  28523. 800c756: f042 0204 orr.w r2, r2, #4
  28524. 800c75a: 601a str r2, [r3, #0]
  28525. /* verify that no seed error */
  28526. if (__HAL_RNG_GET_IT(hrng, RNG_IT_SEI) != RESET)
  28527. 800c75c: 687b ldr r3, [r7, #4]
  28528. 800c75e: 681b ldr r3, [r3, #0]
  28529. 800c760: 685b ldr r3, [r3, #4]
  28530. 800c762: f003 0340 and.w r3, r3, #64 @ 0x40
  28531. 800c766: 2b40 cmp r3, #64 @ 0x40
  28532. 800c768: d104 bne.n 800c774 <HAL_RNG_Init+0x6c>
  28533. {
  28534. hrng->State = HAL_RNG_STATE_ERROR;
  28535. 800c76a: 687b ldr r3, [r7, #4]
  28536. 800c76c: 2204 movs r2, #4
  28537. 800c76e: 725a strb r2, [r3, #9]
  28538. return HAL_ERROR;
  28539. 800c770: 2301 movs r3, #1
  28540. 800c772: e027 b.n 800c7c4 <HAL_RNG_Init+0xbc>
  28541. }
  28542. /* Get tick */
  28543. tickstart = HAL_GetTick();
  28544. 800c774: f7f8 fc5c bl 8005030 <HAL_GetTick>
  28545. 800c778: 60f8 str r0, [r7, #12]
  28546. /* Check if data register contains valid random data */
  28547. while (__HAL_RNG_GET_FLAG(hrng, RNG_FLAG_SECS) != RESET)
  28548. 800c77a: e015 b.n 800c7a8 <HAL_RNG_Init+0xa0>
  28549. {
  28550. if ((HAL_GetTick() - tickstart) > RNG_TIMEOUT_VALUE)
  28551. 800c77c: f7f8 fc58 bl 8005030 <HAL_GetTick>
  28552. 800c780: 4602 mov r2, r0
  28553. 800c782: 68fb ldr r3, [r7, #12]
  28554. 800c784: 1ad3 subs r3, r2, r3
  28555. 800c786: 2b02 cmp r3, #2
  28556. 800c788: d90e bls.n 800c7a8 <HAL_RNG_Init+0xa0>
  28557. {
  28558. /* New check to avoid false timeout detection in case of preemption */
  28559. if (__HAL_RNG_GET_FLAG(hrng, RNG_FLAG_SECS) != RESET)
  28560. 800c78a: 687b ldr r3, [r7, #4]
  28561. 800c78c: 681b ldr r3, [r3, #0]
  28562. 800c78e: 685b ldr r3, [r3, #4]
  28563. 800c790: f003 0304 and.w r3, r3, #4
  28564. 800c794: 2b04 cmp r3, #4
  28565. 800c796: d107 bne.n 800c7a8 <HAL_RNG_Init+0xa0>
  28566. {
  28567. hrng->State = HAL_RNG_STATE_ERROR;
  28568. 800c798: 687b ldr r3, [r7, #4]
  28569. 800c79a: 2204 movs r2, #4
  28570. 800c79c: 725a strb r2, [r3, #9]
  28571. hrng->ErrorCode = HAL_RNG_ERROR_TIMEOUT;
  28572. 800c79e: 687b ldr r3, [r7, #4]
  28573. 800c7a0: 2202 movs r2, #2
  28574. 800c7a2: 60da str r2, [r3, #12]
  28575. return HAL_ERROR;
  28576. 800c7a4: 2301 movs r3, #1
  28577. 800c7a6: e00d b.n 800c7c4 <HAL_RNG_Init+0xbc>
  28578. while (__HAL_RNG_GET_FLAG(hrng, RNG_FLAG_SECS) != RESET)
  28579. 800c7a8: 687b ldr r3, [r7, #4]
  28580. 800c7aa: 681b ldr r3, [r3, #0]
  28581. 800c7ac: 685b ldr r3, [r3, #4]
  28582. 800c7ae: f003 0304 and.w r3, r3, #4
  28583. 800c7b2: 2b04 cmp r3, #4
  28584. 800c7b4: d0e2 beq.n 800c77c <HAL_RNG_Init+0x74>
  28585. }
  28586. }
  28587. }
  28588. /* Initialize the RNG state */
  28589. hrng->State = HAL_RNG_STATE_READY;
  28590. 800c7b6: 687b ldr r3, [r7, #4]
  28591. 800c7b8: 2201 movs r2, #1
  28592. 800c7ba: 725a strb r2, [r3, #9]
  28593. /* Initialise the error code */
  28594. hrng->ErrorCode = HAL_RNG_ERROR_NONE;
  28595. 800c7bc: 687b ldr r3, [r7, #4]
  28596. 800c7be: 2200 movs r2, #0
  28597. 800c7c0: 60da str r2, [r3, #12]
  28598. /* Return function status */
  28599. return HAL_OK;
  28600. 800c7c2: 2300 movs r3, #0
  28601. }
  28602. 800c7c4: 4618 mov r0, r3
  28603. 800c7c6: 3710 adds r7, #16
  28604. 800c7c8: 46bd mov sp, r7
  28605. 800c7ca: bd80 pop {r7, pc}
  28606. 0800c7cc <HAL_RNG_GenerateRandomNumber>:
  28607. * @param random32bit pointer to generated random number variable if successful.
  28608. * @retval HAL status
  28609. */
  28610. HAL_StatusTypeDef HAL_RNG_GenerateRandomNumber(RNG_HandleTypeDef *hrng, uint32_t *random32bit)
  28611. {
  28612. 800c7cc: b580 push {r7, lr}
  28613. 800c7ce: b084 sub sp, #16
  28614. 800c7d0: af00 add r7, sp, #0
  28615. 800c7d2: 6078 str r0, [r7, #4]
  28616. 800c7d4: 6039 str r1, [r7, #0]
  28617. uint32_t tickstart;
  28618. HAL_StatusTypeDef status = HAL_OK;
  28619. 800c7d6: 2300 movs r3, #0
  28620. 800c7d8: 73fb strb r3, [r7, #15]
  28621. /* Process Locked */
  28622. __HAL_LOCK(hrng);
  28623. 800c7da: 687b ldr r3, [r7, #4]
  28624. 800c7dc: 7a1b ldrb r3, [r3, #8]
  28625. 800c7de: 2b01 cmp r3, #1
  28626. 800c7e0: d101 bne.n 800c7e6 <HAL_RNG_GenerateRandomNumber+0x1a>
  28627. 800c7e2: 2302 movs r3, #2
  28628. 800c7e4: e044 b.n 800c870 <HAL_RNG_GenerateRandomNumber+0xa4>
  28629. 800c7e6: 687b ldr r3, [r7, #4]
  28630. 800c7e8: 2201 movs r2, #1
  28631. 800c7ea: 721a strb r2, [r3, #8]
  28632. /* Check RNG peripheral state */
  28633. if (hrng->State == HAL_RNG_STATE_READY)
  28634. 800c7ec: 687b ldr r3, [r7, #4]
  28635. 800c7ee: 7a5b ldrb r3, [r3, #9]
  28636. 800c7f0: b2db uxtb r3, r3
  28637. 800c7f2: 2b01 cmp r3, #1
  28638. 800c7f4: d133 bne.n 800c85e <HAL_RNG_GenerateRandomNumber+0x92>
  28639. {
  28640. /* Change RNG peripheral state */
  28641. hrng->State = HAL_RNG_STATE_BUSY;
  28642. 800c7f6: 687b ldr r3, [r7, #4]
  28643. 800c7f8: 2202 movs r2, #2
  28644. 800c7fa: 725a strb r2, [r3, #9]
  28645. }
  28646. }
  28647. #endif /* RNG_CR_CONDRST */
  28648. /* Get tick */
  28649. tickstart = HAL_GetTick();
  28650. 800c7fc: f7f8 fc18 bl 8005030 <HAL_GetTick>
  28651. 800c800: 60b8 str r0, [r7, #8]
  28652. /* Check if data register contains valid random data */
  28653. while (__HAL_RNG_GET_FLAG(hrng, RNG_FLAG_DRDY) == RESET)
  28654. 800c802: e018 b.n 800c836 <HAL_RNG_GenerateRandomNumber+0x6a>
  28655. {
  28656. if ((HAL_GetTick() - tickstart) > RNG_TIMEOUT_VALUE)
  28657. 800c804: f7f8 fc14 bl 8005030 <HAL_GetTick>
  28658. 800c808: 4602 mov r2, r0
  28659. 800c80a: 68bb ldr r3, [r7, #8]
  28660. 800c80c: 1ad3 subs r3, r2, r3
  28661. 800c80e: 2b02 cmp r3, #2
  28662. 800c810: d911 bls.n 800c836 <HAL_RNG_GenerateRandomNumber+0x6a>
  28663. {
  28664. /* New check to avoid false timeout detection in case of preemption */
  28665. if (__HAL_RNG_GET_FLAG(hrng, RNG_FLAG_DRDY) == RESET)
  28666. 800c812: 687b ldr r3, [r7, #4]
  28667. 800c814: 681b ldr r3, [r3, #0]
  28668. 800c816: 685b ldr r3, [r3, #4]
  28669. 800c818: f003 0301 and.w r3, r3, #1
  28670. 800c81c: 2b01 cmp r3, #1
  28671. 800c81e: d00a beq.n 800c836 <HAL_RNG_GenerateRandomNumber+0x6a>
  28672. {
  28673. hrng->State = HAL_RNG_STATE_READY;
  28674. 800c820: 687b ldr r3, [r7, #4]
  28675. 800c822: 2201 movs r2, #1
  28676. 800c824: 725a strb r2, [r3, #9]
  28677. hrng->ErrorCode = HAL_RNG_ERROR_TIMEOUT;
  28678. 800c826: 687b ldr r3, [r7, #4]
  28679. 800c828: 2202 movs r2, #2
  28680. 800c82a: 60da str r2, [r3, #12]
  28681. /* Process Unlocked */
  28682. __HAL_UNLOCK(hrng);
  28683. 800c82c: 687b ldr r3, [r7, #4]
  28684. 800c82e: 2200 movs r2, #0
  28685. 800c830: 721a strb r2, [r3, #8]
  28686. return HAL_ERROR;
  28687. 800c832: 2301 movs r3, #1
  28688. 800c834: e01c b.n 800c870 <HAL_RNG_GenerateRandomNumber+0xa4>
  28689. while (__HAL_RNG_GET_FLAG(hrng, RNG_FLAG_DRDY) == RESET)
  28690. 800c836: 687b ldr r3, [r7, #4]
  28691. 800c838: 681b ldr r3, [r3, #0]
  28692. 800c83a: 685b ldr r3, [r3, #4]
  28693. 800c83c: f003 0301 and.w r3, r3, #1
  28694. 800c840: 2b01 cmp r3, #1
  28695. 800c842: d1df bne.n 800c804 <HAL_RNG_GenerateRandomNumber+0x38>
  28696. }
  28697. }
  28698. }
  28699. /* Get a 32bit Random number */
  28700. hrng->RandomNumber = hrng->Instance->DR;
  28701. 800c844: 687b ldr r3, [r7, #4]
  28702. 800c846: 681b ldr r3, [r3, #0]
  28703. 800c848: 689a ldr r2, [r3, #8]
  28704. 800c84a: 687b ldr r3, [r7, #4]
  28705. 800c84c: 611a str r2, [r3, #16]
  28706. else /* No seed error */
  28707. {
  28708. *random32bit = hrng->RandomNumber;
  28709. }
  28710. #else
  28711. *random32bit = hrng->RandomNumber;
  28712. 800c84e: 687b ldr r3, [r7, #4]
  28713. 800c850: 691a ldr r2, [r3, #16]
  28714. 800c852: 683b ldr r3, [r7, #0]
  28715. 800c854: 601a str r2, [r3, #0]
  28716. #endif /* RNG_CR_CONDRST */
  28717. hrng->State = HAL_RNG_STATE_READY;
  28718. 800c856: 687b ldr r3, [r7, #4]
  28719. 800c858: 2201 movs r2, #1
  28720. 800c85a: 725a strb r2, [r3, #9]
  28721. 800c85c: e004 b.n 800c868 <HAL_RNG_GenerateRandomNumber+0x9c>
  28722. }
  28723. else
  28724. {
  28725. hrng->ErrorCode = HAL_RNG_ERROR_BUSY;
  28726. 800c85e: 687b ldr r3, [r7, #4]
  28727. 800c860: 2204 movs r2, #4
  28728. 800c862: 60da str r2, [r3, #12]
  28729. status = HAL_ERROR;
  28730. 800c864: 2301 movs r3, #1
  28731. 800c866: 73fb strb r3, [r7, #15]
  28732. }
  28733. /* Process Unlocked */
  28734. __HAL_UNLOCK(hrng);
  28735. 800c868: 687b ldr r3, [r7, #4]
  28736. 800c86a: 2200 movs r2, #0
  28737. 800c86c: 721a strb r2, [r3, #8]
  28738. return status;
  28739. 800c86e: 7bfb ldrb r3, [r7, #15]
  28740. }
  28741. 800c870: 4618 mov r0, r3
  28742. 800c872: 3710 adds r7, #16
  28743. 800c874: 46bd mov sp, r7
  28744. 800c876: bd80 pop {r7, pc}
  28745. 0800c878 <HAL_TIM_Base_Init>:
  28746. * Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init()
  28747. * @param htim TIM Base handle
  28748. * @retval HAL status
  28749. */
  28750. HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim)
  28751. {
  28752. 800c878: b580 push {r7, lr}
  28753. 800c87a: b082 sub sp, #8
  28754. 800c87c: af00 add r7, sp, #0
  28755. 800c87e: 6078 str r0, [r7, #4]
  28756. /* Check the TIM handle allocation */
  28757. if (htim == NULL)
  28758. 800c880: 687b ldr r3, [r7, #4]
  28759. 800c882: 2b00 cmp r3, #0
  28760. 800c884: d101 bne.n 800c88a <HAL_TIM_Base_Init+0x12>
  28761. {
  28762. return HAL_ERROR;
  28763. 800c886: 2301 movs r3, #1
  28764. 800c888: e049 b.n 800c91e <HAL_TIM_Base_Init+0xa6>
  28765. assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
  28766. assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));
  28767. assert_param(IS_TIM_PERIOD(htim, htim->Init.Period));
  28768. assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));
  28769. if (htim->State == HAL_TIM_STATE_RESET)
  28770. 800c88a: 687b ldr r3, [r7, #4]
  28771. 800c88c: f893 303d ldrb.w r3, [r3, #61] @ 0x3d
  28772. 800c890: b2db uxtb r3, r3
  28773. 800c892: 2b00 cmp r3, #0
  28774. 800c894: d106 bne.n 800c8a4 <HAL_TIM_Base_Init+0x2c>
  28775. {
  28776. /* Allocate lock resource and initialize it */
  28777. htim->Lock = HAL_UNLOCKED;
  28778. 800c896: 687b ldr r3, [r7, #4]
  28779. 800c898: 2200 movs r2, #0
  28780. 800c89a: f883 203c strb.w r2, [r3, #60] @ 0x3c
  28781. }
  28782. /* Init the low level hardware : GPIO, CLOCK, NVIC */
  28783. htim->Base_MspInitCallback(htim);
  28784. #else
  28785. /* Init the low level hardware : GPIO, CLOCK, NVIC */
  28786. HAL_TIM_Base_MspInit(htim);
  28787. 800c89e: 6878 ldr r0, [r7, #4]
  28788. 800c8a0: f000 f841 bl 800c926 <HAL_TIM_Base_MspInit>
  28789. #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
  28790. }
  28791. /* Set the TIM state */
  28792. htim->State = HAL_TIM_STATE_BUSY;
  28793. 800c8a4: 687b ldr r3, [r7, #4]
  28794. 800c8a6: 2202 movs r2, #2
  28795. 800c8a8: f883 203d strb.w r2, [r3, #61] @ 0x3d
  28796. /* Set the Time Base configuration */
  28797. TIM_Base_SetConfig(htim->Instance, &htim->Init);
  28798. 800c8ac: 687b ldr r3, [r7, #4]
  28799. 800c8ae: 681a ldr r2, [r3, #0]
  28800. 800c8b0: 687b ldr r3, [r7, #4]
  28801. 800c8b2: 3304 adds r3, #4
  28802. 800c8b4: 4619 mov r1, r3
  28803. 800c8b6: 4610 mov r0, r2
  28804. 800c8b8: f000 f9e8 bl 800cc8c <TIM_Base_SetConfig>
  28805. /* Initialize the DMA burst operation state */
  28806. htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
  28807. 800c8bc: 687b ldr r3, [r7, #4]
  28808. 800c8be: 2201 movs r2, #1
  28809. 800c8c0: f883 2048 strb.w r2, [r3, #72] @ 0x48
  28810. /* Initialize the TIM channels state */
  28811. TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY);
  28812. 800c8c4: 687b ldr r3, [r7, #4]
  28813. 800c8c6: 2201 movs r2, #1
  28814. 800c8c8: f883 203e strb.w r2, [r3, #62] @ 0x3e
  28815. 800c8cc: 687b ldr r3, [r7, #4]
  28816. 800c8ce: 2201 movs r2, #1
  28817. 800c8d0: f883 203f strb.w r2, [r3, #63] @ 0x3f
  28818. 800c8d4: 687b ldr r3, [r7, #4]
  28819. 800c8d6: 2201 movs r2, #1
  28820. 800c8d8: f883 2040 strb.w r2, [r3, #64] @ 0x40
  28821. 800c8dc: 687b ldr r3, [r7, #4]
  28822. 800c8de: 2201 movs r2, #1
  28823. 800c8e0: f883 2041 strb.w r2, [r3, #65] @ 0x41
  28824. 800c8e4: 687b ldr r3, [r7, #4]
  28825. 800c8e6: 2201 movs r2, #1
  28826. 800c8e8: f883 2042 strb.w r2, [r3, #66] @ 0x42
  28827. 800c8ec: 687b ldr r3, [r7, #4]
  28828. 800c8ee: 2201 movs r2, #1
  28829. 800c8f0: f883 2043 strb.w r2, [r3, #67] @ 0x43
  28830. TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY);
  28831. 800c8f4: 687b ldr r3, [r7, #4]
  28832. 800c8f6: 2201 movs r2, #1
  28833. 800c8f8: f883 2044 strb.w r2, [r3, #68] @ 0x44
  28834. 800c8fc: 687b ldr r3, [r7, #4]
  28835. 800c8fe: 2201 movs r2, #1
  28836. 800c900: f883 2045 strb.w r2, [r3, #69] @ 0x45
  28837. 800c904: 687b ldr r3, [r7, #4]
  28838. 800c906: 2201 movs r2, #1
  28839. 800c908: f883 2046 strb.w r2, [r3, #70] @ 0x46
  28840. 800c90c: 687b ldr r3, [r7, #4]
  28841. 800c90e: 2201 movs r2, #1
  28842. 800c910: f883 2047 strb.w r2, [r3, #71] @ 0x47
  28843. /* Initialize the TIM state*/
  28844. htim->State = HAL_TIM_STATE_READY;
  28845. 800c914: 687b ldr r3, [r7, #4]
  28846. 800c916: 2201 movs r2, #1
  28847. 800c918: f883 203d strb.w r2, [r3, #61] @ 0x3d
  28848. return HAL_OK;
  28849. 800c91c: 2300 movs r3, #0
  28850. }
  28851. 800c91e: 4618 mov r0, r3
  28852. 800c920: 3708 adds r7, #8
  28853. 800c922: 46bd mov sp, r7
  28854. 800c924: bd80 pop {r7, pc}
  28855. 0800c926 <HAL_TIM_Base_MspInit>:
  28856. * @brief Initializes the TIM Base MSP.
  28857. * @param htim TIM Base handle
  28858. * @retval None
  28859. */
  28860. __weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
  28861. {
  28862. 800c926: b480 push {r7}
  28863. 800c928: b083 sub sp, #12
  28864. 800c92a: af00 add r7, sp, #0
  28865. 800c92c: 6078 str r0, [r7, #4]
  28866. UNUSED(htim);
  28867. /* NOTE : This function should not be modified, when the callback is needed,
  28868. the HAL_TIM_Base_MspInit could be implemented in the user file
  28869. */
  28870. }
  28871. 800c92e: bf00 nop
  28872. 800c930: 370c adds r7, #12
  28873. 800c932: 46bd mov sp, r7
  28874. 800c934: f85d 7b04 ldr.w r7, [sp], #4
  28875. 800c938: 4770 bx lr
  28876. ...
  28877. 0800c93c <HAL_TIM_Base_Start_IT>:
  28878. * @brief Starts the TIM Base generation in interrupt mode.
  28879. * @param htim TIM Base handle
  28880. * @retval HAL status
  28881. */
  28882. HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
  28883. {
  28884. 800c93c: b480 push {r7}
  28885. 800c93e: b085 sub sp, #20
  28886. 800c940: af00 add r7, sp, #0
  28887. 800c942: 6078 str r0, [r7, #4]
  28888. /* Check the parameters */
  28889. assert_param(IS_TIM_INSTANCE(htim->Instance));
  28890. /* Check the TIM state */
  28891. if (htim->State != HAL_TIM_STATE_READY)
  28892. 800c944: 687b ldr r3, [r7, #4]
  28893. 800c946: f893 303d ldrb.w r3, [r3, #61] @ 0x3d
  28894. 800c94a: b2db uxtb r3, r3
  28895. 800c94c: 2b01 cmp r3, #1
  28896. 800c94e: d001 beq.n 800c954 <HAL_TIM_Base_Start_IT+0x18>
  28897. {
  28898. return HAL_ERROR;
  28899. 800c950: 2301 movs r3, #1
  28900. 800c952: e054 b.n 800c9fe <HAL_TIM_Base_Start_IT+0xc2>
  28901. }
  28902. /* Set the TIM state */
  28903. htim->State = HAL_TIM_STATE_BUSY;
  28904. 800c954: 687b ldr r3, [r7, #4]
  28905. 800c956: 2202 movs r2, #2
  28906. 800c958: f883 203d strb.w r2, [r3, #61] @ 0x3d
  28907. /* Enable the TIM Update interrupt */
  28908. __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE);
  28909. 800c95c: 687b ldr r3, [r7, #4]
  28910. 800c95e: 681b ldr r3, [r3, #0]
  28911. 800c960: 68da ldr r2, [r3, #12]
  28912. 800c962: 687b ldr r3, [r7, #4]
  28913. 800c964: 681b ldr r3, [r3, #0]
  28914. 800c966: f042 0201 orr.w r2, r2, #1
  28915. 800c96a: 60da str r2, [r3, #12]
  28916. /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
  28917. if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
  28918. 800c96c: 687b ldr r3, [r7, #4]
  28919. 800c96e: 681b ldr r3, [r3, #0]
  28920. 800c970: 4a26 ldr r2, [pc, #152] @ (800ca0c <HAL_TIM_Base_Start_IT+0xd0>)
  28921. 800c972: 4293 cmp r3, r2
  28922. 800c974: d022 beq.n 800c9bc <HAL_TIM_Base_Start_IT+0x80>
  28923. 800c976: 687b ldr r3, [r7, #4]
  28924. 800c978: 681b ldr r3, [r3, #0]
  28925. 800c97a: f1b3 4f80 cmp.w r3, #1073741824 @ 0x40000000
  28926. 800c97e: d01d beq.n 800c9bc <HAL_TIM_Base_Start_IT+0x80>
  28927. 800c980: 687b ldr r3, [r7, #4]
  28928. 800c982: 681b ldr r3, [r3, #0]
  28929. 800c984: 4a22 ldr r2, [pc, #136] @ (800ca10 <HAL_TIM_Base_Start_IT+0xd4>)
  28930. 800c986: 4293 cmp r3, r2
  28931. 800c988: d018 beq.n 800c9bc <HAL_TIM_Base_Start_IT+0x80>
  28932. 800c98a: 687b ldr r3, [r7, #4]
  28933. 800c98c: 681b ldr r3, [r3, #0]
  28934. 800c98e: 4a21 ldr r2, [pc, #132] @ (800ca14 <HAL_TIM_Base_Start_IT+0xd8>)
  28935. 800c990: 4293 cmp r3, r2
  28936. 800c992: d013 beq.n 800c9bc <HAL_TIM_Base_Start_IT+0x80>
  28937. 800c994: 687b ldr r3, [r7, #4]
  28938. 800c996: 681b ldr r3, [r3, #0]
  28939. 800c998: 4a1f ldr r2, [pc, #124] @ (800ca18 <HAL_TIM_Base_Start_IT+0xdc>)
  28940. 800c99a: 4293 cmp r3, r2
  28941. 800c99c: d00e beq.n 800c9bc <HAL_TIM_Base_Start_IT+0x80>
  28942. 800c99e: 687b ldr r3, [r7, #4]
  28943. 800c9a0: 681b ldr r3, [r3, #0]
  28944. 800c9a2: 4a1e ldr r2, [pc, #120] @ (800ca1c <HAL_TIM_Base_Start_IT+0xe0>)
  28945. 800c9a4: 4293 cmp r3, r2
  28946. 800c9a6: d009 beq.n 800c9bc <HAL_TIM_Base_Start_IT+0x80>
  28947. 800c9a8: 687b ldr r3, [r7, #4]
  28948. 800c9aa: 681b ldr r3, [r3, #0]
  28949. 800c9ac: 4a1c ldr r2, [pc, #112] @ (800ca20 <HAL_TIM_Base_Start_IT+0xe4>)
  28950. 800c9ae: 4293 cmp r3, r2
  28951. 800c9b0: d004 beq.n 800c9bc <HAL_TIM_Base_Start_IT+0x80>
  28952. 800c9b2: 687b ldr r3, [r7, #4]
  28953. 800c9b4: 681b ldr r3, [r3, #0]
  28954. 800c9b6: 4a1b ldr r2, [pc, #108] @ (800ca24 <HAL_TIM_Base_Start_IT+0xe8>)
  28955. 800c9b8: 4293 cmp r3, r2
  28956. 800c9ba: d115 bne.n 800c9e8 <HAL_TIM_Base_Start_IT+0xac>
  28957. {
  28958. tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
  28959. 800c9bc: 687b ldr r3, [r7, #4]
  28960. 800c9be: 681b ldr r3, [r3, #0]
  28961. 800c9c0: 689a ldr r2, [r3, #8]
  28962. 800c9c2: 4b19 ldr r3, [pc, #100] @ (800ca28 <HAL_TIM_Base_Start_IT+0xec>)
  28963. 800c9c4: 4013 ands r3, r2
  28964. 800c9c6: 60fb str r3, [r7, #12]
  28965. if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
  28966. 800c9c8: 68fb ldr r3, [r7, #12]
  28967. 800c9ca: 2b06 cmp r3, #6
  28968. 800c9cc: d015 beq.n 800c9fa <HAL_TIM_Base_Start_IT+0xbe>
  28969. 800c9ce: 68fb ldr r3, [r7, #12]
  28970. 800c9d0: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  28971. 800c9d4: d011 beq.n 800c9fa <HAL_TIM_Base_Start_IT+0xbe>
  28972. {
  28973. __HAL_TIM_ENABLE(htim);
  28974. 800c9d6: 687b ldr r3, [r7, #4]
  28975. 800c9d8: 681b ldr r3, [r3, #0]
  28976. 800c9da: 681a ldr r2, [r3, #0]
  28977. 800c9dc: 687b ldr r3, [r7, #4]
  28978. 800c9de: 681b ldr r3, [r3, #0]
  28979. 800c9e0: f042 0201 orr.w r2, r2, #1
  28980. 800c9e4: 601a str r2, [r3, #0]
  28981. if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
  28982. 800c9e6: e008 b.n 800c9fa <HAL_TIM_Base_Start_IT+0xbe>
  28983. }
  28984. }
  28985. else
  28986. {
  28987. __HAL_TIM_ENABLE(htim);
  28988. 800c9e8: 687b ldr r3, [r7, #4]
  28989. 800c9ea: 681b ldr r3, [r3, #0]
  28990. 800c9ec: 681a ldr r2, [r3, #0]
  28991. 800c9ee: 687b ldr r3, [r7, #4]
  28992. 800c9f0: 681b ldr r3, [r3, #0]
  28993. 800c9f2: f042 0201 orr.w r2, r2, #1
  28994. 800c9f6: 601a str r2, [r3, #0]
  28995. 800c9f8: e000 b.n 800c9fc <HAL_TIM_Base_Start_IT+0xc0>
  28996. if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
  28997. 800c9fa: bf00 nop
  28998. }
  28999. /* Return function status */
  29000. return HAL_OK;
  29001. 800c9fc: 2300 movs r3, #0
  29002. }
  29003. 800c9fe: 4618 mov r0, r3
  29004. 800ca00: 3714 adds r7, #20
  29005. 800ca02: 46bd mov sp, r7
  29006. 800ca04: f85d 7b04 ldr.w r7, [sp], #4
  29007. 800ca08: 4770 bx lr
  29008. 800ca0a: bf00 nop
  29009. 800ca0c: 40010000 .word 0x40010000
  29010. 800ca10: 40000400 .word 0x40000400
  29011. 800ca14: 40000800 .word 0x40000800
  29012. 800ca18: 40000c00 .word 0x40000c00
  29013. 800ca1c: 40010400 .word 0x40010400
  29014. 800ca20: 40001800 .word 0x40001800
  29015. 800ca24: 40014000 .word 0x40014000
  29016. 800ca28: 00010007 .word 0x00010007
  29017. 0800ca2c <HAL_TIM_IRQHandler>:
  29018. * @brief This function handles TIM interrupts requests.
  29019. * @param htim TIM handle
  29020. * @retval None
  29021. */
  29022. void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)
  29023. {
  29024. 800ca2c: b580 push {r7, lr}
  29025. 800ca2e: b084 sub sp, #16
  29026. 800ca30: af00 add r7, sp, #0
  29027. 800ca32: 6078 str r0, [r7, #4]
  29028. uint32_t itsource = htim->Instance->DIER;
  29029. 800ca34: 687b ldr r3, [r7, #4]
  29030. 800ca36: 681b ldr r3, [r3, #0]
  29031. 800ca38: 68db ldr r3, [r3, #12]
  29032. 800ca3a: 60fb str r3, [r7, #12]
  29033. uint32_t itflag = htim->Instance->SR;
  29034. 800ca3c: 687b ldr r3, [r7, #4]
  29035. 800ca3e: 681b ldr r3, [r3, #0]
  29036. 800ca40: 691b ldr r3, [r3, #16]
  29037. 800ca42: 60bb str r3, [r7, #8]
  29038. /* Capture compare 1 event */
  29039. if ((itflag & (TIM_FLAG_CC1)) == (TIM_FLAG_CC1))
  29040. 800ca44: 68bb ldr r3, [r7, #8]
  29041. 800ca46: f003 0302 and.w r3, r3, #2
  29042. 800ca4a: 2b00 cmp r3, #0
  29043. 800ca4c: d020 beq.n 800ca90 <HAL_TIM_IRQHandler+0x64>
  29044. {
  29045. if ((itsource & (TIM_IT_CC1)) == (TIM_IT_CC1))
  29046. 800ca4e: 68fb ldr r3, [r7, #12]
  29047. 800ca50: f003 0302 and.w r3, r3, #2
  29048. 800ca54: 2b00 cmp r3, #0
  29049. 800ca56: d01b beq.n 800ca90 <HAL_TIM_IRQHandler+0x64>
  29050. {
  29051. {
  29052. __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC1);
  29053. 800ca58: 687b ldr r3, [r7, #4]
  29054. 800ca5a: 681b ldr r3, [r3, #0]
  29055. 800ca5c: f06f 0202 mvn.w r2, #2
  29056. 800ca60: 611a str r2, [r3, #16]
  29057. htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
  29058. 800ca62: 687b ldr r3, [r7, #4]
  29059. 800ca64: 2201 movs r2, #1
  29060. 800ca66: 771a strb r2, [r3, #28]
  29061. /* Input capture event */
  29062. if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U)
  29063. 800ca68: 687b ldr r3, [r7, #4]
  29064. 800ca6a: 681b ldr r3, [r3, #0]
  29065. 800ca6c: 699b ldr r3, [r3, #24]
  29066. 800ca6e: f003 0303 and.w r3, r3, #3
  29067. 800ca72: 2b00 cmp r3, #0
  29068. 800ca74: d003 beq.n 800ca7e <HAL_TIM_IRQHandler+0x52>
  29069. {
  29070. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29071. htim->IC_CaptureCallback(htim);
  29072. #else
  29073. HAL_TIM_IC_CaptureCallback(htim);
  29074. 800ca76: 6878 ldr r0, [r7, #4]
  29075. 800ca78: f000 f8e9 bl 800cc4e <HAL_TIM_IC_CaptureCallback>
  29076. 800ca7c: e005 b.n 800ca8a <HAL_TIM_IRQHandler+0x5e>
  29077. {
  29078. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29079. htim->OC_DelayElapsedCallback(htim);
  29080. htim->PWM_PulseFinishedCallback(htim);
  29081. #else
  29082. HAL_TIM_OC_DelayElapsedCallback(htim);
  29083. 800ca7e: 6878 ldr r0, [r7, #4]
  29084. 800ca80: f000 f8db bl 800cc3a <HAL_TIM_OC_DelayElapsedCallback>
  29085. HAL_TIM_PWM_PulseFinishedCallback(htim);
  29086. 800ca84: 6878 ldr r0, [r7, #4]
  29087. 800ca86: f000 f8ec bl 800cc62 <HAL_TIM_PWM_PulseFinishedCallback>
  29088. #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
  29089. }
  29090. htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
  29091. 800ca8a: 687b ldr r3, [r7, #4]
  29092. 800ca8c: 2200 movs r2, #0
  29093. 800ca8e: 771a strb r2, [r3, #28]
  29094. }
  29095. }
  29096. }
  29097. /* Capture compare 2 event */
  29098. if ((itflag & (TIM_FLAG_CC2)) == (TIM_FLAG_CC2))
  29099. 800ca90: 68bb ldr r3, [r7, #8]
  29100. 800ca92: f003 0304 and.w r3, r3, #4
  29101. 800ca96: 2b00 cmp r3, #0
  29102. 800ca98: d020 beq.n 800cadc <HAL_TIM_IRQHandler+0xb0>
  29103. {
  29104. if ((itsource & (TIM_IT_CC2)) == (TIM_IT_CC2))
  29105. 800ca9a: 68fb ldr r3, [r7, #12]
  29106. 800ca9c: f003 0304 and.w r3, r3, #4
  29107. 800caa0: 2b00 cmp r3, #0
  29108. 800caa2: d01b beq.n 800cadc <HAL_TIM_IRQHandler+0xb0>
  29109. {
  29110. __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC2);
  29111. 800caa4: 687b ldr r3, [r7, #4]
  29112. 800caa6: 681b ldr r3, [r3, #0]
  29113. 800caa8: f06f 0204 mvn.w r2, #4
  29114. 800caac: 611a str r2, [r3, #16]
  29115. htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
  29116. 800caae: 687b ldr r3, [r7, #4]
  29117. 800cab0: 2202 movs r2, #2
  29118. 800cab2: 771a strb r2, [r3, #28]
  29119. /* Input capture event */
  29120. if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U)
  29121. 800cab4: 687b ldr r3, [r7, #4]
  29122. 800cab6: 681b ldr r3, [r3, #0]
  29123. 800cab8: 699b ldr r3, [r3, #24]
  29124. 800caba: f403 7340 and.w r3, r3, #768 @ 0x300
  29125. 800cabe: 2b00 cmp r3, #0
  29126. 800cac0: d003 beq.n 800caca <HAL_TIM_IRQHandler+0x9e>
  29127. {
  29128. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29129. htim->IC_CaptureCallback(htim);
  29130. #else
  29131. HAL_TIM_IC_CaptureCallback(htim);
  29132. 800cac2: 6878 ldr r0, [r7, #4]
  29133. 800cac4: f000 f8c3 bl 800cc4e <HAL_TIM_IC_CaptureCallback>
  29134. 800cac8: e005 b.n 800cad6 <HAL_TIM_IRQHandler+0xaa>
  29135. {
  29136. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29137. htim->OC_DelayElapsedCallback(htim);
  29138. htim->PWM_PulseFinishedCallback(htim);
  29139. #else
  29140. HAL_TIM_OC_DelayElapsedCallback(htim);
  29141. 800caca: 6878 ldr r0, [r7, #4]
  29142. 800cacc: f000 f8b5 bl 800cc3a <HAL_TIM_OC_DelayElapsedCallback>
  29143. HAL_TIM_PWM_PulseFinishedCallback(htim);
  29144. 800cad0: 6878 ldr r0, [r7, #4]
  29145. 800cad2: f000 f8c6 bl 800cc62 <HAL_TIM_PWM_PulseFinishedCallback>
  29146. #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
  29147. }
  29148. htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
  29149. 800cad6: 687b ldr r3, [r7, #4]
  29150. 800cad8: 2200 movs r2, #0
  29151. 800cada: 771a strb r2, [r3, #28]
  29152. }
  29153. }
  29154. /* Capture compare 3 event */
  29155. if ((itflag & (TIM_FLAG_CC3)) == (TIM_FLAG_CC3))
  29156. 800cadc: 68bb ldr r3, [r7, #8]
  29157. 800cade: f003 0308 and.w r3, r3, #8
  29158. 800cae2: 2b00 cmp r3, #0
  29159. 800cae4: d020 beq.n 800cb28 <HAL_TIM_IRQHandler+0xfc>
  29160. {
  29161. if ((itsource & (TIM_IT_CC3)) == (TIM_IT_CC3))
  29162. 800cae6: 68fb ldr r3, [r7, #12]
  29163. 800cae8: f003 0308 and.w r3, r3, #8
  29164. 800caec: 2b00 cmp r3, #0
  29165. 800caee: d01b beq.n 800cb28 <HAL_TIM_IRQHandler+0xfc>
  29166. {
  29167. __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC3);
  29168. 800caf0: 687b ldr r3, [r7, #4]
  29169. 800caf2: 681b ldr r3, [r3, #0]
  29170. 800caf4: f06f 0208 mvn.w r2, #8
  29171. 800caf8: 611a str r2, [r3, #16]
  29172. htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
  29173. 800cafa: 687b ldr r3, [r7, #4]
  29174. 800cafc: 2204 movs r2, #4
  29175. 800cafe: 771a strb r2, [r3, #28]
  29176. /* Input capture event */
  29177. if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U)
  29178. 800cb00: 687b ldr r3, [r7, #4]
  29179. 800cb02: 681b ldr r3, [r3, #0]
  29180. 800cb04: 69db ldr r3, [r3, #28]
  29181. 800cb06: f003 0303 and.w r3, r3, #3
  29182. 800cb0a: 2b00 cmp r3, #0
  29183. 800cb0c: d003 beq.n 800cb16 <HAL_TIM_IRQHandler+0xea>
  29184. {
  29185. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29186. htim->IC_CaptureCallback(htim);
  29187. #else
  29188. HAL_TIM_IC_CaptureCallback(htim);
  29189. 800cb0e: 6878 ldr r0, [r7, #4]
  29190. 800cb10: f000 f89d bl 800cc4e <HAL_TIM_IC_CaptureCallback>
  29191. 800cb14: e005 b.n 800cb22 <HAL_TIM_IRQHandler+0xf6>
  29192. {
  29193. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29194. htim->OC_DelayElapsedCallback(htim);
  29195. htim->PWM_PulseFinishedCallback(htim);
  29196. #else
  29197. HAL_TIM_OC_DelayElapsedCallback(htim);
  29198. 800cb16: 6878 ldr r0, [r7, #4]
  29199. 800cb18: f000 f88f bl 800cc3a <HAL_TIM_OC_DelayElapsedCallback>
  29200. HAL_TIM_PWM_PulseFinishedCallback(htim);
  29201. 800cb1c: 6878 ldr r0, [r7, #4]
  29202. 800cb1e: f000 f8a0 bl 800cc62 <HAL_TIM_PWM_PulseFinishedCallback>
  29203. #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
  29204. }
  29205. htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
  29206. 800cb22: 687b ldr r3, [r7, #4]
  29207. 800cb24: 2200 movs r2, #0
  29208. 800cb26: 771a strb r2, [r3, #28]
  29209. }
  29210. }
  29211. /* Capture compare 4 event */
  29212. if ((itflag & (TIM_FLAG_CC4)) == (TIM_FLAG_CC4))
  29213. 800cb28: 68bb ldr r3, [r7, #8]
  29214. 800cb2a: f003 0310 and.w r3, r3, #16
  29215. 800cb2e: 2b00 cmp r3, #0
  29216. 800cb30: d020 beq.n 800cb74 <HAL_TIM_IRQHandler+0x148>
  29217. {
  29218. if ((itsource & (TIM_IT_CC4)) == (TIM_IT_CC4))
  29219. 800cb32: 68fb ldr r3, [r7, #12]
  29220. 800cb34: f003 0310 and.w r3, r3, #16
  29221. 800cb38: 2b00 cmp r3, #0
  29222. 800cb3a: d01b beq.n 800cb74 <HAL_TIM_IRQHandler+0x148>
  29223. {
  29224. __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC4);
  29225. 800cb3c: 687b ldr r3, [r7, #4]
  29226. 800cb3e: 681b ldr r3, [r3, #0]
  29227. 800cb40: f06f 0210 mvn.w r2, #16
  29228. 800cb44: 611a str r2, [r3, #16]
  29229. htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
  29230. 800cb46: 687b ldr r3, [r7, #4]
  29231. 800cb48: 2208 movs r2, #8
  29232. 800cb4a: 771a strb r2, [r3, #28]
  29233. /* Input capture event */
  29234. if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U)
  29235. 800cb4c: 687b ldr r3, [r7, #4]
  29236. 800cb4e: 681b ldr r3, [r3, #0]
  29237. 800cb50: 69db ldr r3, [r3, #28]
  29238. 800cb52: f403 7340 and.w r3, r3, #768 @ 0x300
  29239. 800cb56: 2b00 cmp r3, #0
  29240. 800cb58: d003 beq.n 800cb62 <HAL_TIM_IRQHandler+0x136>
  29241. {
  29242. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29243. htim->IC_CaptureCallback(htim);
  29244. #else
  29245. HAL_TIM_IC_CaptureCallback(htim);
  29246. 800cb5a: 6878 ldr r0, [r7, #4]
  29247. 800cb5c: f000 f877 bl 800cc4e <HAL_TIM_IC_CaptureCallback>
  29248. 800cb60: e005 b.n 800cb6e <HAL_TIM_IRQHandler+0x142>
  29249. {
  29250. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29251. htim->OC_DelayElapsedCallback(htim);
  29252. htim->PWM_PulseFinishedCallback(htim);
  29253. #else
  29254. HAL_TIM_OC_DelayElapsedCallback(htim);
  29255. 800cb62: 6878 ldr r0, [r7, #4]
  29256. 800cb64: f000 f869 bl 800cc3a <HAL_TIM_OC_DelayElapsedCallback>
  29257. HAL_TIM_PWM_PulseFinishedCallback(htim);
  29258. 800cb68: 6878 ldr r0, [r7, #4]
  29259. 800cb6a: f000 f87a bl 800cc62 <HAL_TIM_PWM_PulseFinishedCallback>
  29260. #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
  29261. }
  29262. htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
  29263. 800cb6e: 687b ldr r3, [r7, #4]
  29264. 800cb70: 2200 movs r2, #0
  29265. 800cb72: 771a strb r2, [r3, #28]
  29266. }
  29267. }
  29268. /* TIM Update event */
  29269. if ((itflag & (TIM_FLAG_UPDATE)) == (TIM_FLAG_UPDATE))
  29270. 800cb74: 68bb ldr r3, [r7, #8]
  29271. 800cb76: f003 0301 and.w r3, r3, #1
  29272. 800cb7a: 2b00 cmp r3, #0
  29273. 800cb7c: d00c beq.n 800cb98 <HAL_TIM_IRQHandler+0x16c>
  29274. {
  29275. if ((itsource & (TIM_IT_UPDATE)) == (TIM_IT_UPDATE))
  29276. 800cb7e: 68fb ldr r3, [r7, #12]
  29277. 800cb80: f003 0301 and.w r3, r3, #1
  29278. 800cb84: 2b00 cmp r3, #0
  29279. 800cb86: d007 beq.n 800cb98 <HAL_TIM_IRQHandler+0x16c>
  29280. {
  29281. __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_UPDATE);
  29282. 800cb88: 687b ldr r3, [r7, #4]
  29283. 800cb8a: 681b ldr r3, [r3, #0]
  29284. 800cb8c: f06f 0201 mvn.w r2, #1
  29285. 800cb90: 611a str r2, [r3, #16]
  29286. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29287. htim->PeriodElapsedCallback(htim);
  29288. #else
  29289. HAL_TIM_PeriodElapsedCallback(htim);
  29290. 800cb92: 6878 ldr r0, [r7, #4]
  29291. 800cb94: f7f5 fc9a bl 80024cc <HAL_TIM_PeriodElapsedCallback>
  29292. #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
  29293. }
  29294. }
  29295. /* TIM Break input event */
  29296. if (((itflag & (TIM_FLAG_BREAK)) == (TIM_FLAG_BREAK)) || \
  29297. 800cb98: 68bb ldr r3, [r7, #8]
  29298. 800cb9a: f003 0380 and.w r3, r3, #128 @ 0x80
  29299. 800cb9e: 2b00 cmp r3, #0
  29300. 800cba0: d104 bne.n 800cbac <HAL_TIM_IRQHandler+0x180>
  29301. ((itflag & (TIM_FLAG_SYSTEM_BREAK)) == (TIM_FLAG_SYSTEM_BREAK)))
  29302. 800cba2: 68bb ldr r3, [r7, #8]
  29303. 800cba4: f403 5300 and.w r3, r3, #8192 @ 0x2000
  29304. if (((itflag & (TIM_FLAG_BREAK)) == (TIM_FLAG_BREAK)) || \
  29305. 800cba8: 2b00 cmp r3, #0
  29306. 800cbaa: d00c beq.n 800cbc6 <HAL_TIM_IRQHandler+0x19a>
  29307. {
  29308. if ((itsource & (TIM_IT_BREAK)) == (TIM_IT_BREAK))
  29309. 800cbac: 68fb ldr r3, [r7, #12]
  29310. 800cbae: f003 0380 and.w r3, r3, #128 @ 0x80
  29311. 800cbb2: 2b00 cmp r3, #0
  29312. 800cbb4: d007 beq.n 800cbc6 <HAL_TIM_IRQHandler+0x19a>
  29313. {
  29314. __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_BREAK | TIM_FLAG_SYSTEM_BREAK);
  29315. 800cbb6: 687b ldr r3, [r7, #4]
  29316. 800cbb8: 681b ldr r3, [r3, #0]
  29317. 800cbba: f46f 5202 mvn.w r2, #8320 @ 0x2080
  29318. 800cbbe: 611a str r2, [r3, #16]
  29319. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29320. htim->BreakCallback(htim);
  29321. #else
  29322. HAL_TIMEx_BreakCallback(htim);
  29323. 800cbc0: 6878 ldr r0, [r7, #4]
  29324. 800cbc2: f000 f913 bl 800cdec <HAL_TIMEx_BreakCallback>
  29325. #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
  29326. }
  29327. }
  29328. /* TIM Break2 input event */
  29329. if ((itflag & (TIM_FLAG_BREAK2)) == (TIM_FLAG_BREAK2))
  29330. 800cbc6: 68bb ldr r3, [r7, #8]
  29331. 800cbc8: f403 7380 and.w r3, r3, #256 @ 0x100
  29332. 800cbcc: 2b00 cmp r3, #0
  29333. 800cbce: d00c beq.n 800cbea <HAL_TIM_IRQHandler+0x1be>
  29334. {
  29335. if ((itsource & (TIM_IT_BREAK)) == (TIM_IT_BREAK))
  29336. 800cbd0: 68fb ldr r3, [r7, #12]
  29337. 800cbd2: f003 0380 and.w r3, r3, #128 @ 0x80
  29338. 800cbd6: 2b00 cmp r3, #0
  29339. 800cbd8: d007 beq.n 800cbea <HAL_TIM_IRQHandler+0x1be>
  29340. {
  29341. __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_BREAK2);
  29342. 800cbda: 687b ldr r3, [r7, #4]
  29343. 800cbdc: 681b ldr r3, [r3, #0]
  29344. 800cbde: f46f 7280 mvn.w r2, #256 @ 0x100
  29345. 800cbe2: 611a str r2, [r3, #16]
  29346. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29347. htim->Break2Callback(htim);
  29348. #else
  29349. HAL_TIMEx_Break2Callback(htim);
  29350. 800cbe4: 6878 ldr r0, [r7, #4]
  29351. 800cbe6: f000 f90b bl 800ce00 <HAL_TIMEx_Break2Callback>
  29352. #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
  29353. }
  29354. }
  29355. /* TIM Trigger detection event */
  29356. if ((itflag & (TIM_FLAG_TRIGGER)) == (TIM_FLAG_TRIGGER))
  29357. 800cbea: 68bb ldr r3, [r7, #8]
  29358. 800cbec: f003 0340 and.w r3, r3, #64 @ 0x40
  29359. 800cbf0: 2b00 cmp r3, #0
  29360. 800cbf2: d00c beq.n 800cc0e <HAL_TIM_IRQHandler+0x1e2>
  29361. {
  29362. if ((itsource & (TIM_IT_TRIGGER)) == (TIM_IT_TRIGGER))
  29363. 800cbf4: 68fb ldr r3, [r7, #12]
  29364. 800cbf6: f003 0340 and.w r3, r3, #64 @ 0x40
  29365. 800cbfa: 2b00 cmp r3, #0
  29366. 800cbfc: d007 beq.n 800cc0e <HAL_TIM_IRQHandler+0x1e2>
  29367. {
  29368. __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_TRIGGER);
  29369. 800cbfe: 687b ldr r3, [r7, #4]
  29370. 800cc00: 681b ldr r3, [r3, #0]
  29371. 800cc02: f06f 0240 mvn.w r2, #64 @ 0x40
  29372. 800cc06: 611a str r2, [r3, #16]
  29373. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29374. htim->TriggerCallback(htim);
  29375. #else
  29376. HAL_TIM_TriggerCallback(htim);
  29377. 800cc08: 6878 ldr r0, [r7, #4]
  29378. 800cc0a: f000 f834 bl 800cc76 <HAL_TIM_TriggerCallback>
  29379. #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
  29380. }
  29381. }
  29382. /* TIM commutation event */
  29383. if ((itflag & (TIM_FLAG_COM)) == (TIM_FLAG_COM))
  29384. 800cc0e: 68bb ldr r3, [r7, #8]
  29385. 800cc10: f003 0320 and.w r3, r3, #32
  29386. 800cc14: 2b00 cmp r3, #0
  29387. 800cc16: d00c beq.n 800cc32 <HAL_TIM_IRQHandler+0x206>
  29388. {
  29389. if ((itsource & (TIM_IT_COM)) == (TIM_IT_COM))
  29390. 800cc18: 68fb ldr r3, [r7, #12]
  29391. 800cc1a: f003 0320 and.w r3, r3, #32
  29392. 800cc1e: 2b00 cmp r3, #0
  29393. 800cc20: d007 beq.n 800cc32 <HAL_TIM_IRQHandler+0x206>
  29394. {
  29395. __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_COM);
  29396. 800cc22: 687b ldr r3, [r7, #4]
  29397. 800cc24: 681b ldr r3, [r3, #0]
  29398. 800cc26: f06f 0220 mvn.w r2, #32
  29399. 800cc2a: 611a str r2, [r3, #16]
  29400. #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
  29401. htim->CommutationCallback(htim);
  29402. #else
  29403. HAL_TIMEx_CommutCallback(htim);
  29404. 800cc2c: 6878 ldr r0, [r7, #4]
  29405. 800cc2e: f000 f8d3 bl 800cdd8 <HAL_TIMEx_CommutCallback>
  29406. #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
  29407. }
  29408. }
  29409. }
  29410. 800cc32: bf00 nop
  29411. 800cc34: 3710 adds r7, #16
  29412. 800cc36: 46bd mov sp, r7
  29413. 800cc38: bd80 pop {r7, pc}
  29414. 0800cc3a <HAL_TIM_OC_DelayElapsedCallback>:
  29415. * @brief Output Compare callback in non-blocking mode
  29416. * @param htim TIM OC handle
  29417. * @retval None
  29418. */
  29419. __weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
  29420. {
  29421. 800cc3a: b480 push {r7}
  29422. 800cc3c: b083 sub sp, #12
  29423. 800cc3e: af00 add r7, sp, #0
  29424. 800cc40: 6078 str r0, [r7, #4]
  29425. UNUSED(htim);
  29426. /* NOTE : This function should not be modified, when the callback is needed,
  29427. the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file
  29428. */
  29429. }
  29430. 800cc42: bf00 nop
  29431. 800cc44: 370c adds r7, #12
  29432. 800cc46: 46bd mov sp, r7
  29433. 800cc48: f85d 7b04 ldr.w r7, [sp], #4
  29434. 800cc4c: 4770 bx lr
  29435. 0800cc4e <HAL_TIM_IC_CaptureCallback>:
  29436. * @brief Input Capture callback in non-blocking mode
  29437. * @param htim TIM IC handle
  29438. * @retval None
  29439. */
  29440. __weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  29441. {
  29442. 800cc4e: b480 push {r7}
  29443. 800cc50: b083 sub sp, #12
  29444. 800cc52: af00 add r7, sp, #0
  29445. 800cc54: 6078 str r0, [r7, #4]
  29446. UNUSED(htim);
  29447. /* NOTE : This function should not be modified, when the callback is needed,
  29448. the HAL_TIM_IC_CaptureCallback could be implemented in the user file
  29449. */
  29450. }
  29451. 800cc56: bf00 nop
  29452. 800cc58: 370c adds r7, #12
  29453. 800cc5a: 46bd mov sp, r7
  29454. 800cc5c: f85d 7b04 ldr.w r7, [sp], #4
  29455. 800cc60: 4770 bx lr
  29456. 0800cc62 <HAL_TIM_PWM_PulseFinishedCallback>:
  29457. * @brief PWM Pulse finished callback in non-blocking mode
  29458. * @param htim TIM handle
  29459. * @retval None
  29460. */
  29461. __weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
  29462. {
  29463. 800cc62: b480 push {r7}
  29464. 800cc64: b083 sub sp, #12
  29465. 800cc66: af00 add r7, sp, #0
  29466. 800cc68: 6078 str r0, [r7, #4]
  29467. UNUSED(htim);
  29468. /* NOTE : This function should not be modified, when the callback is needed,
  29469. the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file
  29470. */
  29471. }
  29472. 800cc6a: bf00 nop
  29473. 800cc6c: 370c adds r7, #12
  29474. 800cc6e: 46bd mov sp, r7
  29475. 800cc70: f85d 7b04 ldr.w r7, [sp], #4
  29476. 800cc74: 4770 bx lr
  29477. 0800cc76 <HAL_TIM_TriggerCallback>:
  29478. * @brief Hall Trigger detection callback in non-blocking mode
  29479. * @param htim TIM handle
  29480. * @retval None
  29481. */
  29482. __weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)
  29483. {
  29484. 800cc76: b480 push {r7}
  29485. 800cc78: b083 sub sp, #12
  29486. 800cc7a: af00 add r7, sp, #0
  29487. 800cc7c: 6078 str r0, [r7, #4]
  29488. UNUSED(htim);
  29489. /* NOTE : This function should not be modified, when the callback is needed,
  29490. the HAL_TIM_TriggerCallback could be implemented in the user file
  29491. */
  29492. }
  29493. 800cc7e: bf00 nop
  29494. 800cc80: 370c adds r7, #12
  29495. 800cc82: 46bd mov sp, r7
  29496. 800cc84: f85d 7b04 ldr.w r7, [sp], #4
  29497. 800cc88: 4770 bx lr
  29498. ...
  29499. 0800cc8c <TIM_Base_SetConfig>:
  29500. * @param TIMx TIM peripheral
  29501. * @param Structure TIM Base configuration structure
  29502. * @retval None
  29503. */
  29504. void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure)
  29505. {
  29506. 800cc8c: b480 push {r7}
  29507. 800cc8e: b085 sub sp, #20
  29508. 800cc90: af00 add r7, sp, #0
  29509. 800cc92: 6078 str r0, [r7, #4]
  29510. 800cc94: 6039 str r1, [r7, #0]
  29511. uint32_t tmpcr1;
  29512. tmpcr1 = TIMx->CR1;
  29513. 800cc96: 687b ldr r3, [r7, #4]
  29514. 800cc98: 681b ldr r3, [r3, #0]
  29515. 800cc9a: 60fb str r3, [r7, #12]
  29516. /* Set TIM Time Base Unit parameters ---------------------------------------*/
  29517. if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx))
  29518. 800cc9c: 687b ldr r3, [r7, #4]
  29519. 800cc9e: 4a46 ldr r2, [pc, #280] @ (800cdb8 <TIM_Base_SetConfig+0x12c>)
  29520. 800cca0: 4293 cmp r3, r2
  29521. 800cca2: d013 beq.n 800cccc <TIM_Base_SetConfig+0x40>
  29522. 800cca4: 687b ldr r3, [r7, #4]
  29523. 800cca6: f1b3 4f80 cmp.w r3, #1073741824 @ 0x40000000
  29524. 800ccaa: d00f beq.n 800cccc <TIM_Base_SetConfig+0x40>
  29525. 800ccac: 687b ldr r3, [r7, #4]
  29526. 800ccae: 4a43 ldr r2, [pc, #268] @ (800cdbc <TIM_Base_SetConfig+0x130>)
  29527. 800ccb0: 4293 cmp r3, r2
  29528. 800ccb2: d00b beq.n 800cccc <TIM_Base_SetConfig+0x40>
  29529. 800ccb4: 687b ldr r3, [r7, #4]
  29530. 800ccb6: 4a42 ldr r2, [pc, #264] @ (800cdc0 <TIM_Base_SetConfig+0x134>)
  29531. 800ccb8: 4293 cmp r3, r2
  29532. 800ccba: d007 beq.n 800cccc <TIM_Base_SetConfig+0x40>
  29533. 800ccbc: 687b ldr r3, [r7, #4]
  29534. 800ccbe: 4a41 ldr r2, [pc, #260] @ (800cdc4 <TIM_Base_SetConfig+0x138>)
  29535. 800ccc0: 4293 cmp r3, r2
  29536. 800ccc2: d003 beq.n 800cccc <TIM_Base_SetConfig+0x40>
  29537. 800ccc4: 687b ldr r3, [r7, #4]
  29538. 800ccc6: 4a40 ldr r2, [pc, #256] @ (800cdc8 <TIM_Base_SetConfig+0x13c>)
  29539. 800ccc8: 4293 cmp r3, r2
  29540. 800ccca: d108 bne.n 800ccde <TIM_Base_SetConfig+0x52>
  29541. {
  29542. /* Select the Counter Mode */
  29543. tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS);
  29544. 800cccc: 68fb ldr r3, [r7, #12]
  29545. 800ccce: f023 0370 bic.w r3, r3, #112 @ 0x70
  29546. 800ccd2: 60fb str r3, [r7, #12]
  29547. tmpcr1 |= Structure->CounterMode;
  29548. 800ccd4: 683b ldr r3, [r7, #0]
  29549. 800ccd6: 685b ldr r3, [r3, #4]
  29550. 800ccd8: 68fa ldr r2, [r7, #12]
  29551. 800ccda: 4313 orrs r3, r2
  29552. 800ccdc: 60fb str r3, [r7, #12]
  29553. }
  29554. if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx))
  29555. 800ccde: 687b ldr r3, [r7, #4]
  29556. 800cce0: 4a35 ldr r2, [pc, #212] @ (800cdb8 <TIM_Base_SetConfig+0x12c>)
  29557. 800cce2: 4293 cmp r3, r2
  29558. 800cce4: d01f beq.n 800cd26 <TIM_Base_SetConfig+0x9a>
  29559. 800cce6: 687b ldr r3, [r7, #4]
  29560. 800cce8: f1b3 4f80 cmp.w r3, #1073741824 @ 0x40000000
  29561. 800ccec: d01b beq.n 800cd26 <TIM_Base_SetConfig+0x9a>
  29562. 800ccee: 687b ldr r3, [r7, #4]
  29563. 800ccf0: 4a32 ldr r2, [pc, #200] @ (800cdbc <TIM_Base_SetConfig+0x130>)
  29564. 800ccf2: 4293 cmp r3, r2
  29565. 800ccf4: d017 beq.n 800cd26 <TIM_Base_SetConfig+0x9a>
  29566. 800ccf6: 687b ldr r3, [r7, #4]
  29567. 800ccf8: 4a31 ldr r2, [pc, #196] @ (800cdc0 <TIM_Base_SetConfig+0x134>)
  29568. 800ccfa: 4293 cmp r3, r2
  29569. 800ccfc: d013 beq.n 800cd26 <TIM_Base_SetConfig+0x9a>
  29570. 800ccfe: 687b ldr r3, [r7, #4]
  29571. 800cd00: 4a30 ldr r2, [pc, #192] @ (800cdc4 <TIM_Base_SetConfig+0x138>)
  29572. 800cd02: 4293 cmp r3, r2
  29573. 800cd04: d00f beq.n 800cd26 <TIM_Base_SetConfig+0x9a>
  29574. 800cd06: 687b ldr r3, [r7, #4]
  29575. 800cd08: 4a2f ldr r2, [pc, #188] @ (800cdc8 <TIM_Base_SetConfig+0x13c>)
  29576. 800cd0a: 4293 cmp r3, r2
  29577. 800cd0c: d00b beq.n 800cd26 <TIM_Base_SetConfig+0x9a>
  29578. 800cd0e: 687b ldr r3, [r7, #4]
  29579. 800cd10: 4a2e ldr r2, [pc, #184] @ (800cdcc <TIM_Base_SetConfig+0x140>)
  29580. 800cd12: 4293 cmp r3, r2
  29581. 800cd14: d007 beq.n 800cd26 <TIM_Base_SetConfig+0x9a>
  29582. 800cd16: 687b ldr r3, [r7, #4]
  29583. 800cd18: 4a2d ldr r2, [pc, #180] @ (800cdd0 <TIM_Base_SetConfig+0x144>)
  29584. 800cd1a: 4293 cmp r3, r2
  29585. 800cd1c: d003 beq.n 800cd26 <TIM_Base_SetConfig+0x9a>
  29586. 800cd1e: 687b ldr r3, [r7, #4]
  29587. 800cd20: 4a2c ldr r2, [pc, #176] @ (800cdd4 <TIM_Base_SetConfig+0x148>)
  29588. 800cd22: 4293 cmp r3, r2
  29589. 800cd24: d108 bne.n 800cd38 <TIM_Base_SetConfig+0xac>
  29590. {
  29591. /* Set the clock division */
  29592. tmpcr1 &= ~TIM_CR1_CKD;
  29593. 800cd26: 68fb ldr r3, [r7, #12]
  29594. 800cd28: f423 7340 bic.w r3, r3, #768 @ 0x300
  29595. 800cd2c: 60fb str r3, [r7, #12]
  29596. tmpcr1 |= (uint32_t)Structure->ClockDivision;
  29597. 800cd2e: 683b ldr r3, [r7, #0]
  29598. 800cd30: 68db ldr r3, [r3, #12]
  29599. 800cd32: 68fa ldr r2, [r7, #12]
  29600. 800cd34: 4313 orrs r3, r2
  29601. 800cd36: 60fb str r3, [r7, #12]
  29602. }
  29603. /* Set the auto-reload preload */
  29604. MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload);
  29605. 800cd38: 68fb ldr r3, [r7, #12]
  29606. 800cd3a: f023 0280 bic.w r2, r3, #128 @ 0x80
  29607. 800cd3e: 683b ldr r3, [r7, #0]
  29608. 800cd40: 695b ldr r3, [r3, #20]
  29609. 800cd42: 4313 orrs r3, r2
  29610. 800cd44: 60fb str r3, [r7, #12]
  29611. TIMx->CR1 = tmpcr1;
  29612. 800cd46: 687b ldr r3, [r7, #4]
  29613. 800cd48: 68fa ldr r2, [r7, #12]
  29614. 800cd4a: 601a str r2, [r3, #0]
  29615. /* Set the Autoreload value */
  29616. TIMx->ARR = (uint32_t)Structure->Period ;
  29617. 800cd4c: 683b ldr r3, [r7, #0]
  29618. 800cd4e: 689a ldr r2, [r3, #8]
  29619. 800cd50: 687b ldr r3, [r7, #4]
  29620. 800cd52: 62da str r2, [r3, #44] @ 0x2c
  29621. /* Set the Prescaler value */
  29622. TIMx->PSC = Structure->Prescaler;
  29623. 800cd54: 683b ldr r3, [r7, #0]
  29624. 800cd56: 681a ldr r2, [r3, #0]
  29625. 800cd58: 687b ldr r3, [r7, #4]
  29626. 800cd5a: 629a str r2, [r3, #40] @ 0x28
  29627. if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx))
  29628. 800cd5c: 687b ldr r3, [r7, #4]
  29629. 800cd5e: 4a16 ldr r2, [pc, #88] @ (800cdb8 <TIM_Base_SetConfig+0x12c>)
  29630. 800cd60: 4293 cmp r3, r2
  29631. 800cd62: d00f beq.n 800cd84 <TIM_Base_SetConfig+0xf8>
  29632. 800cd64: 687b ldr r3, [r7, #4]
  29633. 800cd66: 4a18 ldr r2, [pc, #96] @ (800cdc8 <TIM_Base_SetConfig+0x13c>)
  29634. 800cd68: 4293 cmp r3, r2
  29635. 800cd6a: d00b beq.n 800cd84 <TIM_Base_SetConfig+0xf8>
  29636. 800cd6c: 687b ldr r3, [r7, #4]
  29637. 800cd6e: 4a17 ldr r2, [pc, #92] @ (800cdcc <TIM_Base_SetConfig+0x140>)
  29638. 800cd70: 4293 cmp r3, r2
  29639. 800cd72: d007 beq.n 800cd84 <TIM_Base_SetConfig+0xf8>
  29640. 800cd74: 687b ldr r3, [r7, #4]
  29641. 800cd76: 4a16 ldr r2, [pc, #88] @ (800cdd0 <TIM_Base_SetConfig+0x144>)
  29642. 800cd78: 4293 cmp r3, r2
  29643. 800cd7a: d003 beq.n 800cd84 <TIM_Base_SetConfig+0xf8>
  29644. 800cd7c: 687b ldr r3, [r7, #4]
  29645. 800cd7e: 4a15 ldr r2, [pc, #84] @ (800cdd4 <TIM_Base_SetConfig+0x148>)
  29646. 800cd80: 4293 cmp r3, r2
  29647. 800cd82: d103 bne.n 800cd8c <TIM_Base_SetConfig+0x100>
  29648. {
  29649. /* Set the Repetition Counter value */
  29650. TIMx->RCR = Structure->RepetitionCounter;
  29651. 800cd84: 683b ldr r3, [r7, #0]
  29652. 800cd86: 691a ldr r2, [r3, #16]
  29653. 800cd88: 687b ldr r3, [r7, #4]
  29654. 800cd8a: 631a str r2, [r3, #48] @ 0x30
  29655. }
  29656. /* Generate an update event to reload the Prescaler
  29657. and the repetition counter (only for advanced timer) value immediately */
  29658. TIMx->EGR = TIM_EGR_UG;
  29659. 800cd8c: 687b ldr r3, [r7, #4]
  29660. 800cd8e: 2201 movs r2, #1
  29661. 800cd90: 615a str r2, [r3, #20]
  29662. /* Check if the update flag is set after the Update Generation, if so clear the UIF flag */
  29663. if (HAL_IS_BIT_SET(TIMx->SR, TIM_FLAG_UPDATE))
  29664. 800cd92: 687b ldr r3, [r7, #4]
  29665. 800cd94: 691b ldr r3, [r3, #16]
  29666. 800cd96: f003 0301 and.w r3, r3, #1
  29667. 800cd9a: 2b01 cmp r3, #1
  29668. 800cd9c: d105 bne.n 800cdaa <TIM_Base_SetConfig+0x11e>
  29669. {
  29670. /* Clear the update flag */
  29671. CLEAR_BIT(TIMx->SR, TIM_FLAG_UPDATE);
  29672. 800cd9e: 687b ldr r3, [r7, #4]
  29673. 800cda0: 691b ldr r3, [r3, #16]
  29674. 800cda2: f023 0201 bic.w r2, r3, #1
  29675. 800cda6: 687b ldr r3, [r7, #4]
  29676. 800cda8: 611a str r2, [r3, #16]
  29677. }
  29678. }
  29679. 800cdaa: bf00 nop
  29680. 800cdac: 3714 adds r7, #20
  29681. 800cdae: 46bd mov sp, r7
  29682. 800cdb0: f85d 7b04 ldr.w r7, [sp], #4
  29683. 800cdb4: 4770 bx lr
  29684. 800cdb6: bf00 nop
  29685. 800cdb8: 40010000 .word 0x40010000
  29686. 800cdbc: 40000400 .word 0x40000400
  29687. 800cdc0: 40000800 .word 0x40000800
  29688. 800cdc4: 40000c00 .word 0x40000c00
  29689. 800cdc8: 40010400 .word 0x40010400
  29690. 800cdcc: 40014000 .word 0x40014000
  29691. 800cdd0: 40014400 .word 0x40014400
  29692. 800cdd4: 40014800 .word 0x40014800
  29693. 0800cdd8 <HAL_TIMEx_CommutCallback>:
  29694. * @brief Commutation callback in non-blocking mode
  29695. * @param htim TIM handle
  29696. * @retval None
  29697. */
  29698. __weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim)
  29699. {
  29700. 800cdd8: b480 push {r7}
  29701. 800cdda: b083 sub sp, #12
  29702. 800cddc: af00 add r7, sp, #0
  29703. 800cdde: 6078 str r0, [r7, #4]
  29704. UNUSED(htim);
  29705. /* NOTE : This function should not be modified, when the callback is needed,
  29706. the HAL_TIMEx_CommutCallback could be implemented in the user file
  29707. */
  29708. }
  29709. 800cde0: bf00 nop
  29710. 800cde2: 370c adds r7, #12
  29711. 800cde4: 46bd mov sp, r7
  29712. 800cde6: f85d 7b04 ldr.w r7, [sp], #4
  29713. 800cdea: 4770 bx lr
  29714. 0800cdec <HAL_TIMEx_BreakCallback>:
  29715. * @brief Break detection callback in non-blocking mode
  29716. * @param htim TIM handle
  29717. * @retval None
  29718. */
  29719. __weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim)
  29720. {
  29721. 800cdec: b480 push {r7}
  29722. 800cdee: b083 sub sp, #12
  29723. 800cdf0: af00 add r7, sp, #0
  29724. 800cdf2: 6078 str r0, [r7, #4]
  29725. UNUSED(htim);
  29726. /* NOTE : This function should not be modified, when the callback is needed,
  29727. the HAL_TIMEx_BreakCallback could be implemented in the user file
  29728. */
  29729. }
  29730. 800cdf4: bf00 nop
  29731. 800cdf6: 370c adds r7, #12
  29732. 800cdf8: 46bd mov sp, r7
  29733. 800cdfa: f85d 7b04 ldr.w r7, [sp], #4
  29734. 800cdfe: 4770 bx lr
  29735. 0800ce00 <HAL_TIMEx_Break2Callback>:
  29736. * @brief Break2 detection callback in non blocking mode
  29737. * @param htim: TIM handle
  29738. * @retval None
  29739. */
  29740. __weak void HAL_TIMEx_Break2Callback(TIM_HandleTypeDef *htim)
  29741. {
  29742. 800ce00: b480 push {r7}
  29743. 800ce02: b083 sub sp, #12
  29744. 800ce04: af00 add r7, sp, #0
  29745. 800ce06: 6078 str r0, [r7, #4]
  29746. UNUSED(htim);
  29747. /* NOTE : This function Should not be modified, when the callback is needed,
  29748. the HAL_TIMEx_Break2Callback could be implemented in the user file
  29749. */
  29750. }
  29751. 800ce08: bf00 nop
  29752. 800ce0a: 370c adds r7, #12
  29753. 800ce0c: 46bd mov sp, r7
  29754. 800ce0e: f85d 7b04 ldr.w r7, [sp], #4
  29755. 800ce12: 4770 bx lr
  29756. 0800ce14 <HAL_UART_Init>:
  29757. * parameters in the UART_InitTypeDef and initialize the associated handle.
  29758. * @param huart UART handle.
  29759. * @retval HAL status
  29760. */
  29761. HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
  29762. {
  29763. 800ce14: b580 push {r7, lr}
  29764. 800ce16: b082 sub sp, #8
  29765. 800ce18: af00 add r7, sp, #0
  29766. 800ce1a: 6078 str r0, [r7, #4]
  29767. /* Check the UART handle allocation */
  29768. if (huart == NULL)
  29769. 800ce1c: 687b ldr r3, [r7, #4]
  29770. 800ce1e: 2b00 cmp r3, #0
  29771. 800ce20: d101 bne.n 800ce26 <HAL_UART_Init+0x12>
  29772. {
  29773. return HAL_ERROR;
  29774. 800ce22: 2301 movs r3, #1
  29775. 800ce24: e042 b.n 800ceac <HAL_UART_Init+0x98>
  29776. {
  29777. /* Check the parameters */
  29778. assert_param((IS_UART_INSTANCE(huart->Instance)) || (IS_LPUART_INSTANCE(huart->Instance)));
  29779. }
  29780. if (huart->gState == HAL_UART_STATE_RESET)
  29781. 800ce26: 687b ldr r3, [r7, #4]
  29782. 800ce28: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  29783. 800ce2c: 2b00 cmp r3, #0
  29784. 800ce2e: d106 bne.n 800ce3e <HAL_UART_Init+0x2a>
  29785. {
  29786. /* Allocate lock resource and initialize it */
  29787. huart->Lock = HAL_UNLOCKED;
  29788. 800ce30: 687b ldr r3, [r7, #4]
  29789. 800ce32: 2200 movs r2, #0
  29790. 800ce34: f883 2084 strb.w r2, [r3, #132] @ 0x84
  29791. /* Init the low level hardware */
  29792. huart->MspInitCallback(huart);
  29793. #else
  29794. /* Init the low level hardware : GPIO, CLOCK */
  29795. HAL_UART_MspInit(huart);
  29796. 800ce38: 6878 ldr r0, [r7, #4]
  29797. 800ce3a: f7f6 fae1 bl 8003400 <HAL_UART_MspInit>
  29798. #endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
  29799. }
  29800. huart->gState = HAL_UART_STATE_BUSY;
  29801. 800ce3e: 687b ldr r3, [r7, #4]
  29802. 800ce40: 2224 movs r2, #36 @ 0x24
  29803. 800ce42: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  29804. __HAL_UART_DISABLE(huart);
  29805. 800ce46: 687b ldr r3, [r7, #4]
  29806. 800ce48: 681b ldr r3, [r3, #0]
  29807. 800ce4a: 681a ldr r2, [r3, #0]
  29808. 800ce4c: 687b ldr r3, [r7, #4]
  29809. 800ce4e: 681b ldr r3, [r3, #0]
  29810. 800ce50: f022 0201 bic.w r2, r2, #1
  29811. 800ce54: 601a str r2, [r3, #0]
  29812. /* Perform advanced settings configuration */
  29813. /* For some items, configuration requires to be done prior TE and RE bits are set */
  29814. if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
  29815. 800ce56: 687b ldr r3, [r7, #4]
  29816. 800ce58: 6a9b ldr r3, [r3, #40] @ 0x28
  29817. 800ce5a: 2b00 cmp r3, #0
  29818. 800ce5c: d002 beq.n 800ce64 <HAL_UART_Init+0x50>
  29819. {
  29820. UART_AdvFeatureConfig(huart);
  29821. 800ce5e: 6878 ldr r0, [r7, #4]
  29822. 800ce60: f001 f9e8 bl 800e234 <UART_AdvFeatureConfig>
  29823. }
  29824. /* Set the UART Communication parameters */
  29825. if (UART_SetConfig(huart) == HAL_ERROR)
  29826. 800ce64: 6878 ldr r0, [r7, #4]
  29827. 800ce66: f000 fc7d bl 800d764 <UART_SetConfig>
  29828. 800ce6a: 4603 mov r3, r0
  29829. 800ce6c: 2b01 cmp r3, #1
  29830. 800ce6e: d101 bne.n 800ce74 <HAL_UART_Init+0x60>
  29831. {
  29832. return HAL_ERROR;
  29833. 800ce70: 2301 movs r3, #1
  29834. 800ce72: e01b b.n 800ceac <HAL_UART_Init+0x98>
  29835. }
  29836. /* In asynchronous mode, the following bits must be kept cleared:
  29837. - LINEN and CLKEN bits in the USART_CR2 register,
  29838. - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/
  29839. CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
  29840. 800ce74: 687b ldr r3, [r7, #4]
  29841. 800ce76: 681b ldr r3, [r3, #0]
  29842. 800ce78: 685a ldr r2, [r3, #4]
  29843. 800ce7a: 687b ldr r3, [r7, #4]
  29844. 800ce7c: 681b ldr r3, [r3, #0]
  29845. 800ce7e: f422 4290 bic.w r2, r2, #18432 @ 0x4800
  29846. 800ce82: 605a str r2, [r3, #4]
  29847. CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));
  29848. 800ce84: 687b ldr r3, [r7, #4]
  29849. 800ce86: 681b ldr r3, [r3, #0]
  29850. 800ce88: 689a ldr r2, [r3, #8]
  29851. 800ce8a: 687b ldr r3, [r7, #4]
  29852. 800ce8c: 681b ldr r3, [r3, #0]
  29853. 800ce8e: f022 022a bic.w r2, r2, #42 @ 0x2a
  29854. 800ce92: 609a str r2, [r3, #8]
  29855. __HAL_UART_ENABLE(huart);
  29856. 800ce94: 687b ldr r3, [r7, #4]
  29857. 800ce96: 681b ldr r3, [r3, #0]
  29858. 800ce98: 681a ldr r2, [r3, #0]
  29859. 800ce9a: 687b ldr r3, [r7, #4]
  29860. 800ce9c: 681b ldr r3, [r3, #0]
  29861. 800ce9e: f042 0201 orr.w r2, r2, #1
  29862. 800cea2: 601a str r2, [r3, #0]
  29863. /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */
  29864. return (UART_CheckIdleState(huart));
  29865. 800cea4: 6878 ldr r0, [r7, #4]
  29866. 800cea6: f001 fa67 bl 800e378 <UART_CheckIdleState>
  29867. 800ceaa: 4603 mov r3, r0
  29868. }
  29869. 800ceac: 4618 mov r0, r3
  29870. 800ceae: 3708 adds r7, #8
  29871. 800ceb0: 46bd mov sp, r7
  29872. 800ceb2: bd80 pop {r7, pc}
  29873. 0800ceb4 <HAL_UART_Transmit_IT>:
  29874. * @param pData Pointer to data buffer (u8 or u16 data elements).
  29875. * @param Size Amount of data elements (u8 or u16) to be sent.
  29876. * @retval HAL status
  29877. */
  29878. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
  29879. {
  29880. 800ceb4: b480 push {r7}
  29881. 800ceb6: b091 sub sp, #68 @ 0x44
  29882. 800ceb8: af00 add r7, sp, #0
  29883. 800ceba: 60f8 str r0, [r7, #12]
  29884. 800cebc: 60b9 str r1, [r7, #8]
  29885. 800cebe: 4613 mov r3, r2
  29886. 800cec0: 80fb strh r3, [r7, #6]
  29887. /* Check that a Tx process is not already ongoing */
  29888. if (huart->gState == HAL_UART_STATE_READY)
  29889. 800cec2: 68fb ldr r3, [r7, #12]
  29890. 800cec4: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  29891. 800cec8: 2b20 cmp r3, #32
  29892. 800ceca: d178 bne.n 800cfbe <HAL_UART_Transmit_IT+0x10a>
  29893. {
  29894. if ((pData == NULL) || (Size == 0U))
  29895. 800cecc: 68bb ldr r3, [r7, #8]
  29896. 800cece: 2b00 cmp r3, #0
  29897. 800ced0: d002 beq.n 800ced8 <HAL_UART_Transmit_IT+0x24>
  29898. 800ced2: 88fb ldrh r3, [r7, #6]
  29899. 800ced4: 2b00 cmp r3, #0
  29900. 800ced6: d101 bne.n 800cedc <HAL_UART_Transmit_IT+0x28>
  29901. {
  29902. return HAL_ERROR;
  29903. 800ced8: 2301 movs r3, #1
  29904. 800ceda: e071 b.n 800cfc0 <HAL_UART_Transmit_IT+0x10c>
  29905. }
  29906. huart->pTxBuffPtr = pData;
  29907. 800cedc: 68fb ldr r3, [r7, #12]
  29908. 800cede: 68ba ldr r2, [r7, #8]
  29909. 800cee0: 651a str r2, [r3, #80] @ 0x50
  29910. huart->TxXferSize = Size;
  29911. 800cee2: 68fb ldr r3, [r7, #12]
  29912. 800cee4: 88fa ldrh r2, [r7, #6]
  29913. 800cee6: f8a3 2054 strh.w r2, [r3, #84] @ 0x54
  29914. huart->TxXferCount = Size;
  29915. 800ceea: 68fb ldr r3, [r7, #12]
  29916. 800ceec: 88fa ldrh r2, [r7, #6]
  29917. 800ceee: f8a3 2056 strh.w r2, [r3, #86] @ 0x56
  29918. huart->TxISR = NULL;
  29919. 800cef2: 68fb ldr r3, [r7, #12]
  29920. 800cef4: 2200 movs r2, #0
  29921. 800cef6: 679a str r2, [r3, #120] @ 0x78
  29922. huart->ErrorCode = HAL_UART_ERROR_NONE;
  29923. 800cef8: 68fb ldr r3, [r7, #12]
  29924. 800cefa: 2200 movs r2, #0
  29925. 800cefc: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  29926. huart->gState = HAL_UART_STATE_BUSY_TX;
  29927. 800cf00: 68fb ldr r3, [r7, #12]
  29928. 800cf02: 2221 movs r2, #33 @ 0x21
  29929. 800cf04: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  29930. /* Configure Tx interrupt processing */
  29931. if (huart->FifoMode == UART_FIFOMODE_ENABLE)
  29932. 800cf08: 68fb ldr r3, [r7, #12]
  29933. 800cf0a: 6e5b ldr r3, [r3, #100] @ 0x64
  29934. 800cf0c: f1b3 5f00 cmp.w r3, #536870912 @ 0x20000000
  29935. 800cf10: d12a bne.n 800cf68 <HAL_UART_Transmit_IT+0xb4>
  29936. {
  29937. /* Set the Tx ISR function pointer according to the data word length */
  29938. if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
  29939. 800cf12: 68fb ldr r3, [r7, #12]
  29940. 800cf14: 689b ldr r3, [r3, #8]
  29941. 800cf16: f5b3 5f80 cmp.w r3, #4096 @ 0x1000
  29942. 800cf1a: d107 bne.n 800cf2c <HAL_UART_Transmit_IT+0x78>
  29943. 800cf1c: 68fb ldr r3, [r7, #12]
  29944. 800cf1e: 691b ldr r3, [r3, #16]
  29945. 800cf20: 2b00 cmp r3, #0
  29946. 800cf22: d103 bne.n 800cf2c <HAL_UART_Transmit_IT+0x78>
  29947. {
  29948. huart->TxISR = UART_TxISR_16BIT_FIFOEN;
  29949. 800cf24: 68fb ldr r3, [r7, #12]
  29950. 800cf26: 4a29 ldr r2, [pc, #164] @ (800cfcc <HAL_UART_Transmit_IT+0x118>)
  29951. 800cf28: 679a str r2, [r3, #120] @ 0x78
  29952. 800cf2a: e002 b.n 800cf32 <HAL_UART_Transmit_IT+0x7e>
  29953. }
  29954. else
  29955. {
  29956. huart->TxISR = UART_TxISR_8BIT_FIFOEN;
  29957. 800cf2c: 68fb ldr r3, [r7, #12]
  29958. 800cf2e: 4a28 ldr r2, [pc, #160] @ (800cfd0 <HAL_UART_Transmit_IT+0x11c>)
  29959. 800cf30: 679a str r2, [r3, #120] @ 0x78
  29960. }
  29961. /* Enable the TX FIFO threshold interrupt */
  29962. ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
  29963. 800cf32: 68fb ldr r3, [r7, #12]
  29964. 800cf34: 681b ldr r3, [r3, #0]
  29965. 800cf36: 3308 adds r3, #8
  29966. 800cf38: 62bb str r3, [r7, #40] @ 0x28
  29967. */
  29968. __STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr)
  29969. {
  29970. uint32_t result;
  29971. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  29972. 800cf3a: 6abb ldr r3, [r7, #40] @ 0x28
  29973. 800cf3c: e853 3f00 ldrex r3, [r3]
  29974. 800cf40: 627b str r3, [r7, #36] @ 0x24
  29975. return(result);
  29976. 800cf42: 6a7b ldr r3, [r7, #36] @ 0x24
  29977. 800cf44: f443 0300 orr.w r3, r3, #8388608 @ 0x800000
  29978. 800cf48: 63bb str r3, [r7, #56] @ 0x38
  29979. 800cf4a: 68fb ldr r3, [r7, #12]
  29980. 800cf4c: 681b ldr r3, [r3, #0]
  29981. 800cf4e: 3308 adds r3, #8
  29982. 800cf50: 6bba ldr r2, [r7, #56] @ 0x38
  29983. 800cf52: 637a str r2, [r7, #52] @ 0x34
  29984. 800cf54: 633b str r3, [r7, #48] @ 0x30
  29985. */
  29986. __STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
  29987. {
  29988. uint32_t result;
  29989. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  29990. 800cf56: 6b39 ldr r1, [r7, #48] @ 0x30
  29991. 800cf58: 6b7a ldr r2, [r7, #52] @ 0x34
  29992. 800cf5a: e841 2300 strex r3, r2, [r1]
  29993. 800cf5e: 62fb str r3, [r7, #44] @ 0x2c
  29994. return(result);
  29995. 800cf60: 6afb ldr r3, [r7, #44] @ 0x2c
  29996. 800cf62: 2b00 cmp r3, #0
  29997. 800cf64: d1e5 bne.n 800cf32 <HAL_UART_Transmit_IT+0x7e>
  29998. 800cf66: e028 b.n 800cfba <HAL_UART_Transmit_IT+0x106>
  29999. }
  30000. else
  30001. {
  30002. /* Set the Tx ISR function pointer according to the data word length */
  30003. if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
  30004. 800cf68: 68fb ldr r3, [r7, #12]
  30005. 800cf6a: 689b ldr r3, [r3, #8]
  30006. 800cf6c: f5b3 5f80 cmp.w r3, #4096 @ 0x1000
  30007. 800cf70: d107 bne.n 800cf82 <HAL_UART_Transmit_IT+0xce>
  30008. 800cf72: 68fb ldr r3, [r7, #12]
  30009. 800cf74: 691b ldr r3, [r3, #16]
  30010. 800cf76: 2b00 cmp r3, #0
  30011. 800cf78: d103 bne.n 800cf82 <HAL_UART_Transmit_IT+0xce>
  30012. {
  30013. huart->TxISR = UART_TxISR_16BIT;
  30014. 800cf7a: 68fb ldr r3, [r7, #12]
  30015. 800cf7c: 4a15 ldr r2, [pc, #84] @ (800cfd4 <HAL_UART_Transmit_IT+0x120>)
  30016. 800cf7e: 679a str r2, [r3, #120] @ 0x78
  30017. 800cf80: e002 b.n 800cf88 <HAL_UART_Transmit_IT+0xd4>
  30018. }
  30019. else
  30020. {
  30021. huart->TxISR = UART_TxISR_8BIT;
  30022. 800cf82: 68fb ldr r3, [r7, #12]
  30023. 800cf84: 4a14 ldr r2, [pc, #80] @ (800cfd8 <HAL_UART_Transmit_IT+0x124>)
  30024. 800cf86: 679a str r2, [r3, #120] @ 0x78
  30025. }
  30026. /* Enable the Transmit Data Register Empty interrupt */
  30027. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
  30028. 800cf88: 68fb ldr r3, [r7, #12]
  30029. 800cf8a: 681b ldr r3, [r3, #0]
  30030. 800cf8c: 617b str r3, [r7, #20]
  30031. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  30032. 800cf8e: 697b ldr r3, [r7, #20]
  30033. 800cf90: e853 3f00 ldrex r3, [r3]
  30034. 800cf94: 613b str r3, [r7, #16]
  30035. return(result);
  30036. 800cf96: 693b ldr r3, [r7, #16]
  30037. 800cf98: f043 0380 orr.w r3, r3, #128 @ 0x80
  30038. 800cf9c: 63fb str r3, [r7, #60] @ 0x3c
  30039. 800cf9e: 68fb ldr r3, [r7, #12]
  30040. 800cfa0: 681b ldr r3, [r3, #0]
  30041. 800cfa2: 461a mov r2, r3
  30042. 800cfa4: 6bfb ldr r3, [r7, #60] @ 0x3c
  30043. 800cfa6: 623b str r3, [r7, #32]
  30044. 800cfa8: 61fa str r2, [r7, #28]
  30045. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  30046. 800cfaa: 69f9 ldr r1, [r7, #28]
  30047. 800cfac: 6a3a ldr r2, [r7, #32]
  30048. 800cfae: e841 2300 strex r3, r2, [r1]
  30049. 800cfb2: 61bb str r3, [r7, #24]
  30050. return(result);
  30051. 800cfb4: 69bb ldr r3, [r7, #24]
  30052. 800cfb6: 2b00 cmp r3, #0
  30053. 800cfb8: d1e6 bne.n 800cf88 <HAL_UART_Transmit_IT+0xd4>
  30054. }
  30055. return HAL_OK;
  30056. 800cfba: 2300 movs r3, #0
  30057. 800cfbc: e000 b.n 800cfc0 <HAL_UART_Transmit_IT+0x10c>
  30058. }
  30059. else
  30060. {
  30061. return HAL_BUSY;
  30062. 800cfbe: 2302 movs r3, #2
  30063. }
  30064. }
  30065. 800cfc0: 4618 mov r0, r3
  30066. 800cfc2: 3744 adds r7, #68 @ 0x44
  30067. 800cfc4: 46bd mov sp, r7
  30068. 800cfc6: f85d 7b04 ldr.w r7, [sp], #4
  30069. 800cfca: 4770 bx lr
  30070. 800cfcc: 0800eb3f .word 0x0800eb3f
  30071. 800cfd0: 0800ea5f .word 0x0800ea5f
  30072. 800cfd4: 0800e99d .word 0x0800e99d
  30073. 800cfd8: 0800e8e5 .word 0x0800e8e5
  30074. 0800cfdc <HAL_UART_IRQHandler>:
  30075. * @brief Handle UART interrupt request.
  30076. * @param huart UART handle.
  30077. * @retval None
  30078. */
  30079. void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
  30080. {
  30081. 800cfdc: b580 push {r7, lr}
  30082. 800cfde: b0ba sub sp, #232 @ 0xe8
  30083. 800cfe0: af00 add r7, sp, #0
  30084. 800cfe2: 6078 str r0, [r7, #4]
  30085. uint32_t isrflags = READ_REG(huart->Instance->ISR);
  30086. 800cfe4: 687b ldr r3, [r7, #4]
  30087. 800cfe6: 681b ldr r3, [r3, #0]
  30088. 800cfe8: 69db ldr r3, [r3, #28]
  30089. 800cfea: f8c7 30e4 str.w r3, [r7, #228] @ 0xe4
  30090. uint32_t cr1its = READ_REG(huart->Instance->CR1);
  30091. 800cfee: 687b ldr r3, [r7, #4]
  30092. 800cff0: 681b ldr r3, [r3, #0]
  30093. 800cff2: 681b ldr r3, [r3, #0]
  30094. 800cff4: f8c7 30e0 str.w r3, [r7, #224] @ 0xe0
  30095. uint32_t cr3its = READ_REG(huart->Instance->CR3);
  30096. 800cff8: 687b ldr r3, [r7, #4]
  30097. 800cffa: 681b ldr r3, [r3, #0]
  30098. 800cffc: 689b ldr r3, [r3, #8]
  30099. 800cffe: f8c7 30dc str.w r3, [r7, #220] @ 0xdc
  30100. uint32_t errorflags;
  30101. uint32_t errorcode;
  30102. /* If no error occurs */
  30103. errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF));
  30104. 800d002: f8d7 20e4 ldr.w r2, [r7, #228] @ 0xe4
  30105. 800d006: f640 030f movw r3, #2063 @ 0x80f
  30106. 800d00a: 4013 ands r3, r2
  30107. 800d00c: f8c7 30d8 str.w r3, [r7, #216] @ 0xd8
  30108. if (errorflags == 0U)
  30109. 800d010: f8d7 30d8 ldr.w r3, [r7, #216] @ 0xd8
  30110. 800d014: 2b00 cmp r3, #0
  30111. 800d016: d11b bne.n 800d050 <HAL_UART_IRQHandler+0x74>
  30112. {
  30113. /* UART in mode Receiver ---------------------------------------------------*/
  30114. if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
  30115. 800d018: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  30116. 800d01c: f003 0320 and.w r3, r3, #32
  30117. 800d020: 2b00 cmp r3, #0
  30118. 800d022: d015 beq.n 800d050 <HAL_UART_IRQHandler+0x74>
  30119. && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
  30120. 800d024: f8d7 30e0 ldr.w r3, [r7, #224] @ 0xe0
  30121. 800d028: f003 0320 and.w r3, r3, #32
  30122. 800d02c: 2b00 cmp r3, #0
  30123. 800d02e: d105 bne.n 800d03c <HAL_UART_IRQHandler+0x60>
  30124. || ((cr3its & USART_CR3_RXFTIE) != 0U)))
  30125. 800d030: f8d7 30dc ldr.w r3, [r7, #220] @ 0xdc
  30126. 800d034: f003 5380 and.w r3, r3, #268435456 @ 0x10000000
  30127. 800d038: 2b00 cmp r3, #0
  30128. 800d03a: d009 beq.n 800d050 <HAL_UART_IRQHandler+0x74>
  30129. {
  30130. if (huart->RxISR != NULL)
  30131. 800d03c: 687b ldr r3, [r7, #4]
  30132. 800d03e: 6f5b ldr r3, [r3, #116] @ 0x74
  30133. 800d040: 2b00 cmp r3, #0
  30134. 800d042: f000 8377 beq.w 800d734 <HAL_UART_IRQHandler+0x758>
  30135. {
  30136. huart->RxISR(huart);
  30137. 800d046: 687b ldr r3, [r7, #4]
  30138. 800d048: 6f5b ldr r3, [r3, #116] @ 0x74
  30139. 800d04a: 6878 ldr r0, [r7, #4]
  30140. 800d04c: 4798 blx r3
  30141. }
  30142. return;
  30143. 800d04e: e371 b.n 800d734 <HAL_UART_IRQHandler+0x758>
  30144. }
  30145. }
  30146. /* If some errors occur */
  30147. if ((errorflags != 0U)
  30148. 800d050: f8d7 30d8 ldr.w r3, [r7, #216] @ 0xd8
  30149. 800d054: 2b00 cmp r3, #0
  30150. 800d056: f000 8123 beq.w 800d2a0 <HAL_UART_IRQHandler+0x2c4>
  30151. && ((((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)
  30152. 800d05a: f8d7 20dc ldr.w r2, [r7, #220] @ 0xdc
  30153. 800d05e: 4b8d ldr r3, [pc, #564] @ (800d294 <HAL_UART_IRQHandler+0x2b8>)
  30154. 800d060: 4013 ands r3, r2
  30155. 800d062: 2b00 cmp r3, #0
  30156. 800d064: d106 bne.n 800d074 <HAL_UART_IRQHandler+0x98>
  30157. || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_RTOIE)) != 0U))))
  30158. 800d066: f8d7 20e0 ldr.w r2, [r7, #224] @ 0xe0
  30159. 800d06a: 4b8b ldr r3, [pc, #556] @ (800d298 <HAL_UART_IRQHandler+0x2bc>)
  30160. 800d06c: 4013 ands r3, r2
  30161. 800d06e: 2b00 cmp r3, #0
  30162. 800d070: f000 8116 beq.w 800d2a0 <HAL_UART_IRQHandler+0x2c4>
  30163. {
  30164. /* UART parity error interrupt occurred -------------------------------------*/
  30165. if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
  30166. 800d074: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  30167. 800d078: f003 0301 and.w r3, r3, #1
  30168. 800d07c: 2b00 cmp r3, #0
  30169. 800d07e: d011 beq.n 800d0a4 <HAL_UART_IRQHandler+0xc8>
  30170. 800d080: f8d7 30e0 ldr.w r3, [r7, #224] @ 0xe0
  30171. 800d084: f403 7380 and.w r3, r3, #256 @ 0x100
  30172. 800d088: 2b00 cmp r3, #0
  30173. 800d08a: d00b beq.n 800d0a4 <HAL_UART_IRQHandler+0xc8>
  30174. {
  30175. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);
  30176. 800d08c: 687b ldr r3, [r7, #4]
  30177. 800d08e: 681b ldr r3, [r3, #0]
  30178. 800d090: 2201 movs r2, #1
  30179. 800d092: 621a str r2, [r3, #32]
  30180. huart->ErrorCode |= HAL_UART_ERROR_PE;
  30181. 800d094: 687b ldr r3, [r7, #4]
  30182. 800d096: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  30183. 800d09a: f043 0201 orr.w r2, r3, #1
  30184. 800d09e: 687b ldr r3, [r7, #4]
  30185. 800d0a0: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  30186. }
  30187. /* UART frame error interrupt occurred --------------------------------------*/
  30188. if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
  30189. 800d0a4: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  30190. 800d0a8: f003 0302 and.w r3, r3, #2
  30191. 800d0ac: 2b00 cmp r3, #0
  30192. 800d0ae: d011 beq.n 800d0d4 <HAL_UART_IRQHandler+0xf8>
  30193. 800d0b0: f8d7 30dc ldr.w r3, [r7, #220] @ 0xdc
  30194. 800d0b4: f003 0301 and.w r3, r3, #1
  30195. 800d0b8: 2b00 cmp r3, #0
  30196. 800d0ba: d00b beq.n 800d0d4 <HAL_UART_IRQHandler+0xf8>
  30197. {
  30198. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
  30199. 800d0bc: 687b ldr r3, [r7, #4]
  30200. 800d0be: 681b ldr r3, [r3, #0]
  30201. 800d0c0: 2202 movs r2, #2
  30202. 800d0c2: 621a str r2, [r3, #32]
  30203. huart->ErrorCode |= HAL_UART_ERROR_FE;
  30204. 800d0c4: 687b ldr r3, [r7, #4]
  30205. 800d0c6: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  30206. 800d0ca: f043 0204 orr.w r2, r3, #4
  30207. 800d0ce: 687b ldr r3, [r7, #4]
  30208. 800d0d0: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  30209. }
  30210. /* UART noise error interrupt occurred --------------------------------------*/
  30211. if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
  30212. 800d0d4: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  30213. 800d0d8: f003 0304 and.w r3, r3, #4
  30214. 800d0dc: 2b00 cmp r3, #0
  30215. 800d0de: d011 beq.n 800d104 <HAL_UART_IRQHandler+0x128>
  30216. 800d0e0: f8d7 30dc ldr.w r3, [r7, #220] @ 0xdc
  30217. 800d0e4: f003 0301 and.w r3, r3, #1
  30218. 800d0e8: 2b00 cmp r3, #0
  30219. 800d0ea: d00b beq.n 800d104 <HAL_UART_IRQHandler+0x128>
  30220. {
  30221. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);
  30222. 800d0ec: 687b ldr r3, [r7, #4]
  30223. 800d0ee: 681b ldr r3, [r3, #0]
  30224. 800d0f0: 2204 movs r2, #4
  30225. 800d0f2: 621a str r2, [r3, #32]
  30226. huart->ErrorCode |= HAL_UART_ERROR_NE;
  30227. 800d0f4: 687b ldr r3, [r7, #4]
  30228. 800d0f6: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  30229. 800d0fa: f043 0202 orr.w r2, r3, #2
  30230. 800d0fe: 687b ldr r3, [r7, #4]
  30231. 800d100: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  30232. }
  30233. /* UART Over-Run interrupt occurred -----------------------------------------*/
  30234. if (((isrflags & USART_ISR_ORE) != 0U)
  30235. 800d104: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  30236. 800d108: f003 0308 and.w r3, r3, #8
  30237. 800d10c: 2b00 cmp r3, #0
  30238. 800d10e: d017 beq.n 800d140 <HAL_UART_IRQHandler+0x164>
  30239. && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) ||
  30240. 800d110: f8d7 30e0 ldr.w r3, [r7, #224] @ 0xe0
  30241. 800d114: f003 0320 and.w r3, r3, #32
  30242. 800d118: 2b00 cmp r3, #0
  30243. 800d11a: d105 bne.n 800d128 <HAL_UART_IRQHandler+0x14c>
  30244. ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)))
  30245. 800d11c: f8d7 20dc ldr.w r2, [r7, #220] @ 0xdc
  30246. 800d120: 4b5c ldr r3, [pc, #368] @ (800d294 <HAL_UART_IRQHandler+0x2b8>)
  30247. 800d122: 4013 ands r3, r2
  30248. && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) ||
  30249. 800d124: 2b00 cmp r3, #0
  30250. 800d126: d00b beq.n 800d140 <HAL_UART_IRQHandler+0x164>
  30251. {
  30252. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
  30253. 800d128: 687b ldr r3, [r7, #4]
  30254. 800d12a: 681b ldr r3, [r3, #0]
  30255. 800d12c: 2208 movs r2, #8
  30256. 800d12e: 621a str r2, [r3, #32]
  30257. huart->ErrorCode |= HAL_UART_ERROR_ORE;
  30258. 800d130: 687b ldr r3, [r7, #4]
  30259. 800d132: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  30260. 800d136: f043 0208 orr.w r2, r3, #8
  30261. 800d13a: 687b ldr r3, [r7, #4]
  30262. 800d13c: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  30263. }
  30264. /* UART Receiver Timeout interrupt occurred ---------------------------------*/
  30265. if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U))
  30266. 800d140: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  30267. 800d144: f403 6300 and.w r3, r3, #2048 @ 0x800
  30268. 800d148: 2b00 cmp r3, #0
  30269. 800d14a: d012 beq.n 800d172 <HAL_UART_IRQHandler+0x196>
  30270. 800d14c: f8d7 30e0 ldr.w r3, [r7, #224] @ 0xe0
  30271. 800d150: f003 6380 and.w r3, r3, #67108864 @ 0x4000000
  30272. 800d154: 2b00 cmp r3, #0
  30273. 800d156: d00c beq.n 800d172 <HAL_UART_IRQHandler+0x196>
  30274. {
  30275. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF);
  30276. 800d158: 687b ldr r3, [r7, #4]
  30277. 800d15a: 681b ldr r3, [r3, #0]
  30278. 800d15c: f44f 6200 mov.w r2, #2048 @ 0x800
  30279. 800d160: 621a str r2, [r3, #32]
  30280. huart->ErrorCode |= HAL_UART_ERROR_RTO;
  30281. 800d162: 687b ldr r3, [r7, #4]
  30282. 800d164: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  30283. 800d168: f043 0220 orr.w r2, r3, #32
  30284. 800d16c: 687b ldr r3, [r7, #4]
  30285. 800d16e: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  30286. }
  30287. /* Call UART Error Call back function if need be ----------------------------*/
  30288. if (huart->ErrorCode != HAL_UART_ERROR_NONE)
  30289. 800d172: 687b ldr r3, [r7, #4]
  30290. 800d174: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  30291. 800d178: 2b00 cmp r3, #0
  30292. 800d17a: f000 82dd beq.w 800d738 <HAL_UART_IRQHandler+0x75c>
  30293. {
  30294. /* UART in mode Receiver --------------------------------------------------*/
  30295. if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
  30296. 800d17e: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  30297. 800d182: f003 0320 and.w r3, r3, #32
  30298. 800d186: 2b00 cmp r3, #0
  30299. 800d188: d013 beq.n 800d1b2 <HAL_UART_IRQHandler+0x1d6>
  30300. && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
  30301. 800d18a: f8d7 30e0 ldr.w r3, [r7, #224] @ 0xe0
  30302. 800d18e: f003 0320 and.w r3, r3, #32
  30303. 800d192: 2b00 cmp r3, #0
  30304. 800d194: d105 bne.n 800d1a2 <HAL_UART_IRQHandler+0x1c6>
  30305. || ((cr3its & USART_CR3_RXFTIE) != 0U)))
  30306. 800d196: f8d7 30dc ldr.w r3, [r7, #220] @ 0xdc
  30307. 800d19a: f003 5380 and.w r3, r3, #268435456 @ 0x10000000
  30308. 800d19e: 2b00 cmp r3, #0
  30309. 800d1a0: d007 beq.n 800d1b2 <HAL_UART_IRQHandler+0x1d6>
  30310. {
  30311. if (huart->RxISR != NULL)
  30312. 800d1a2: 687b ldr r3, [r7, #4]
  30313. 800d1a4: 6f5b ldr r3, [r3, #116] @ 0x74
  30314. 800d1a6: 2b00 cmp r3, #0
  30315. 800d1a8: d003 beq.n 800d1b2 <HAL_UART_IRQHandler+0x1d6>
  30316. {
  30317. huart->RxISR(huart);
  30318. 800d1aa: 687b ldr r3, [r7, #4]
  30319. 800d1ac: 6f5b ldr r3, [r3, #116] @ 0x74
  30320. 800d1ae: 6878 ldr r0, [r7, #4]
  30321. 800d1b0: 4798 blx r3
  30322. /* If Error is to be considered as blocking :
  30323. - Receiver Timeout error in Reception
  30324. - Overrun error in Reception
  30325. - any error occurs in DMA mode reception
  30326. */
  30327. errorcode = huart->ErrorCode;
  30328. 800d1b2: 687b ldr r3, [r7, #4]
  30329. 800d1b4: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  30330. 800d1b8: f8c7 30d4 str.w r3, [r7, #212] @ 0xd4
  30331. if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) ||
  30332. 800d1bc: 687b ldr r3, [r7, #4]
  30333. 800d1be: 681b ldr r3, [r3, #0]
  30334. 800d1c0: 689b ldr r3, [r3, #8]
  30335. 800d1c2: f003 0340 and.w r3, r3, #64 @ 0x40
  30336. 800d1c6: 2b40 cmp r3, #64 @ 0x40
  30337. 800d1c8: d005 beq.n 800d1d6 <HAL_UART_IRQHandler+0x1fa>
  30338. ((errorcode & (HAL_UART_ERROR_RTO | HAL_UART_ERROR_ORE)) != 0U))
  30339. 800d1ca: f8d7 30d4 ldr.w r3, [r7, #212] @ 0xd4
  30340. 800d1ce: f003 0328 and.w r3, r3, #40 @ 0x28
  30341. if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) ||
  30342. 800d1d2: 2b00 cmp r3, #0
  30343. 800d1d4: d054 beq.n 800d280 <HAL_UART_IRQHandler+0x2a4>
  30344. {
  30345. /* Blocking error : transfer is aborted
  30346. Set the UART state ready to be able to start again the process,
  30347. Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
  30348. UART_EndRxTransfer(huart);
  30349. 800d1d6: 6878 ldr r0, [r7, #4]
  30350. 800d1d8: f001 fb08 bl 800e7ec <UART_EndRxTransfer>
  30351. /* Abort the UART DMA Rx channel if enabled */
  30352. if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
  30353. 800d1dc: 687b ldr r3, [r7, #4]
  30354. 800d1de: 681b ldr r3, [r3, #0]
  30355. 800d1e0: 689b ldr r3, [r3, #8]
  30356. 800d1e2: f003 0340 and.w r3, r3, #64 @ 0x40
  30357. 800d1e6: 2b40 cmp r3, #64 @ 0x40
  30358. 800d1e8: d146 bne.n 800d278 <HAL_UART_IRQHandler+0x29c>
  30359. {
  30360. /* Disable the UART DMA Rx request if enabled */
  30361. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
  30362. 800d1ea: 687b ldr r3, [r7, #4]
  30363. 800d1ec: 681b ldr r3, [r3, #0]
  30364. 800d1ee: 3308 adds r3, #8
  30365. 800d1f0: f8c7 309c str.w r3, [r7, #156] @ 0x9c
  30366. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  30367. 800d1f4: f8d7 309c ldr.w r3, [r7, #156] @ 0x9c
  30368. 800d1f8: e853 3f00 ldrex r3, [r3]
  30369. 800d1fc: f8c7 3098 str.w r3, [r7, #152] @ 0x98
  30370. return(result);
  30371. 800d200: f8d7 3098 ldr.w r3, [r7, #152] @ 0x98
  30372. 800d204: f023 0340 bic.w r3, r3, #64 @ 0x40
  30373. 800d208: f8c7 30d0 str.w r3, [r7, #208] @ 0xd0
  30374. 800d20c: 687b ldr r3, [r7, #4]
  30375. 800d20e: 681b ldr r3, [r3, #0]
  30376. 800d210: 3308 adds r3, #8
  30377. 800d212: f8d7 20d0 ldr.w r2, [r7, #208] @ 0xd0
  30378. 800d216: f8c7 20a8 str.w r2, [r7, #168] @ 0xa8
  30379. 800d21a: f8c7 30a4 str.w r3, [r7, #164] @ 0xa4
  30380. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  30381. 800d21e: f8d7 10a4 ldr.w r1, [r7, #164] @ 0xa4
  30382. 800d222: f8d7 20a8 ldr.w r2, [r7, #168] @ 0xa8
  30383. 800d226: e841 2300 strex r3, r2, [r1]
  30384. 800d22a: f8c7 30a0 str.w r3, [r7, #160] @ 0xa0
  30385. return(result);
  30386. 800d22e: f8d7 30a0 ldr.w r3, [r7, #160] @ 0xa0
  30387. 800d232: 2b00 cmp r3, #0
  30388. 800d234: d1d9 bne.n 800d1ea <HAL_UART_IRQHandler+0x20e>
  30389. /* Abort the UART DMA Rx channel */
  30390. if (huart->hdmarx != NULL)
  30391. 800d236: 687b ldr r3, [r7, #4]
  30392. 800d238: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30393. 800d23c: 2b00 cmp r3, #0
  30394. 800d23e: d017 beq.n 800d270 <HAL_UART_IRQHandler+0x294>
  30395. {
  30396. /* Set the UART DMA Abort callback :
  30397. will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
  30398. huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError;
  30399. 800d240: 687b ldr r3, [r7, #4]
  30400. 800d242: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30401. 800d246: 4a15 ldr r2, [pc, #84] @ (800d29c <HAL_UART_IRQHandler+0x2c0>)
  30402. 800d248: 651a str r2, [r3, #80] @ 0x50
  30403. /* Abort DMA RX */
  30404. if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
  30405. 800d24a: 687b ldr r3, [r7, #4]
  30406. 800d24c: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30407. 800d250: 4618 mov r0, r3
  30408. 800d252: f7f9 f915 bl 8006480 <HAL_DMA_Abort_IT>
  30409. 800d256: 4603 mov r3, r0
  30410. 800d258: 2b00 cmp r3, #0
  30411. 800d25a: d019 beq.n 800d290 <HAL_UART_IRQHandler+0x2b4>
  30412. {
  30413. /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */
  30414. huart->hdmarx->XferAbortCallback(huart->hdmarx);
  30415. 800d25c: 687b ldr r3, [r7, #4]
  30416. 800d25e: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30417. 800d262: 6d1b ldr r3, [r3, #80] @ 0x50
  30418. 800d264: 687a ldr r2, [r7, #4]
  30419. 800d266: f8d2 2080 ldr.w r2, [r2, #128] @ 0x80
  30420. 800d26a: 4610 mov r0, r2
  30421. 800d26c: 4798 blx r3
  30422. if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
  30423. 800d26e: e00f b.n 800d290 <HAL_UART_IRQHandler+0x2b4>
  30424. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  30425. /*Call registered error callback*/
  30426. huart->ErrorCallback(huart);
  30427. #else
  30428. /*Call legacy weak error callback*/
  30429. HAL_UART_ErrorCallback(huart);
  30430. 800d270: 6878 ldr r0, [r7, #4]
  30431. 800d272: f000 fa6d bl 800d750 <HAL_UART_ErrorCallback>
  30432. if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
  30433. 800d276: e00b b.n 800d290 <HAL_UART_IRQHandler+0x2b4>
  30434. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  30435. /*Call registered error callback*/
  30436. huart->ErrorCallback(huart);
  30437. #else
  30438. /*Call legacy weak error callback*/
  30439. HAL_UART_ErrorCallback(huart);
  30440. 800d278: 6878 ldr r0, [r7, #4]
  30441. 800d27a: f000 fa69 bl 800d750 <HAL_UART_ErrorCallback>
  30442. if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
  30443. 800d27e: e007 b.n 800d290 <HAL_UART_IRQHandler+0x2b4>
  30444. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  30445. /*Call registered error callback*/
  30446. huart->ErrorCallback(huart);
  30447. #else
  30448. /*Call legacy weak error callback*/
  30449. HAL_UART_ErrorCallback(huart);
  30450. 800d280: 6878 ldr r0, [r7, #4]
  30451. 800d282: f000 fa65 bl 800d750 <HAL_UART_ErrorCallback>
  30452. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
  30453. huart->ErrorCode = HAL_UART_ERROR_NONE;
  30454. 800d286: 687b ldr r3, [r7, #4]
  30455. 800d288: 2200 movs r2, #0
  30456. 800d28a: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  30457. }
  30458. }
  30459. return;
  30460. 800d28e: e253 b.n 800d738 <HAL_UART_IRQHandler+0x75c>
  30461. if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
  30462. 800d290: bf00 nop
  30463. return;
  30464. 800d292: e251 b.n 800d738 <HAL_UART_IRQHandler+0x75c>
  30465. 800d294: 10000001 .word 0x10000001
  30466. 800d298: 04000120 .word 0x04000120
  30467. 800d29c: 0800e8b9 .word 0x0800e8b9
  30468. } /* End if some error occurs */
  30469. /* Check current reception Mode :
  30470. If Reception till IDLE event has been selected : */
  30471. if ((huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
  30472. 800d2a0: 687b ldr r3, [r7, #4]
  30473. 800d2a2: 6edb ldr r3, [r3, #108] @ 0x6c
  30474. 800d2a4: 2b01 cmp r3, #1
  30475. 800d2a6: f040 81e7 bne.w 800d678 <HAL_UART_IRQHandler+0x69c>
  30476. && ((isrflags & USART_ISR_IDLE) != 0U)
  30477. 800d2aa: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  30478. 800d2ae: f003 0310 and.w r3, r3, #16
  30479. 800d2b2: 2b00 cmp r3, #0
  30480. 800d2b4: f000 81e0 beq.w 800d678 <HAL_UART_IRQHandler+0x69c>
  30481. && ((cr1its & USART_ISR_IDLE) != 0U))
  30482. 800d2b8: f8d7 30e0 ldr.w r3, [r7, #224] @ 0xe0
  30483. 800d2bc: f003 0310 and.w r3, r3, #16
  30484. 800d2c0: 2b00 cmp r3, #0
  30485. 800d2c2: f000 81d9 beq.w 800d678 <HAL_UART_IRQHandler+0x69c>
  30486. {
  30487. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF);
  30488. 800d2c6: 687b ldr r3, [r7, #4]
  30489. 800d2c8: 681b ldr r3, [r3, #0]
  30490. 800d2ca: 2210 movs r2, #16
  30491. 800d2cc: 621a str r2, [r3, #32]
  30492. /* Check if DMA mode is enabled in UART */
  30493. if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
  30494. 800d2ce: 687b ldr r3, [r7, #4]
  30495. 800d2d0: 681b ldr r3, [r3, #0]
  30496. 800d2d2: 689b ldr r3, [r3, #8]
  30497. 800d2d4: f003 0340 and.w r3, r3, #64 @ 0x40
  30498. 800d2d8: 2b40 cmp r3, #64 @ 0x40
  30499. 800d2da: f040 8151 bne.w 800d580 <HAL_UART_IRQHandler+0x5a4>
  30500. {
  30501. /* DMA mode enabled */
  30502. /* Check received length : If all expected data are received, do nothing,
  30503. (DMA cplt callback will be called).
  30504. Otherwise, if at least one data has already been received, IDLE event is to be notified to user */
  30505. uint16_t nb_remaining_rx_data = (uint16_t) __HAL_DMA_GET_COUNTER(huart->hdmarx);
  30506. 800d2de: 687b ldr r3, [r7, #4]
  30507. 800d2e0: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30508. 800d2e4: 681b ldr r3, [r3, #0]
  30509. 800d2e6: 4a96 ldr r2, [pc, #600] @ (800d540 <HAL_UART_IRQHandler+0x564>)
  30510. 800d2e8: 4293 cmp r3, r2
  30511. 800d2ea: d068 beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30512. 800d2ec: 687b ldr r3, [r7, #4]
  30513. 800d2ee: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30514. 800d2f2: 681b ldr r3, [r3, #0]
  30515. 800d2f4: 4a93 ldr r2, [pc, #588] @ (800d544 <HAL_UART_IRQHandler+0x568>)
  30516. 800d2f6: 4293 cmp r3, r2
  30517. 800d2f8: d061 beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30518. 800d2fa: 687b ldr r3, [r7, #4]
  30519. 800d2fc: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30520. 800d300: 681b ldr r3, [r3, #0]
  30521. 800d302: 4a91 ldr r2, [pc, #580] @ (800d548 <HAL_UART_IRQHandler+0x56c>)
  30522. 800d304: 4293 cmp r3, r2
  30523. 800d306: d05a beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30524. 800d308: 687b ldr r3, [r7, #4]
  30525. 800d30a: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30526. 800d30e: 681b ldr r3, [r3, #0]
  30527. 800d310: 4a8e ldr r2, [pc, #568] @ (800d54c <HAL_UART_IRQHandler+0x570>)
  30528. 800d312: 4293 cmp r3, r2
  30529. 800d314: d053 beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30530. 800d316: 687b ldr r3, [r7, #4]
  30531. 800d318: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30532. 800d31c: 681b ldr r3, [r3, #0]
  30533. 800d31e: 4a8c ldr r2, [pc, #560] @ (800d550 <HAL_UART_IRQHandler+0x574>)
  30534. 800d320: 4293 cmp r3, r2
  30535. 800d322: d04c beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30536. 800d324: 687b ldr r3, [r7, #4]
  30537. 800d326: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30538. 800d32a: 681b ldr r3, [r3, #0]
  30539. 800d32c: 4a89 ldr r2, [pc, #548] @ (800d554 <HAL_UART_IRQHandler+0x578>)
  30540. 800d32e: 4293 cmp r3, r2
  30541. 800d330: d045 beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30542. 800d332: 687b ldr r3, [r7, #4]
  30543. 800d334: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30544. 800d338: 681b ldr r3, [r3, #0]
  30545. 800d33a: 4a87 ldr r2, [pc, #540] @ (800d558 <HAL_UART_IRQHandler+0x57c>)
  30546. 800d33c: 4293 cmp r3, r2
  30547. 800d33e: d03e beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30548. 800d340: 687b ldr r3, [r7, #4]
  30549. 800d342: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30550. 800d346: 681b ldr r3, [r3, #0]
  30551. 800d348: 4a84 ldr r2, [pc, #528] @ (800d55c <HAL_UART_IRQHandler+0x580>)
  30552. 800d34a: 4293 cmp r3, r2
  30553. 800d34c: d037 beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30554. 800d34e: 687b ldr r3, [r7, #4]
  30555. 800d350: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30556. 800d354: 681b ldr r3, [r3, #0]
  30557. 800d356: 4a82 ldr r2, [pc, #520] @ (800d560 <HAL_UART_IRQHandler+0x584>)
  30558. 800d358: 4293 cmp r3, r2
  30559. 800d35a: d030 beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30560. 800d35c: 687b ldr r3, [r7, #4]
  30561. 800d35e: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30562. 800d362: 681b ldr r3, [r3, #0]
  30563. 800d364: 4a7f ldr r2, [pc, #508] @ (800d564 <HAL_UART_IRQHandler+0x588>)
  30564. 800d366: 4293 cmp r3, r2
  30565. 800d368: d029 beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30566. 800d36a: 687b ldr r3, [r7, #4]
  30567. 800d36c: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30568. 800d370: 681b ldr r3, [r3, #0]
  30569. 800d372: 4a7d ldr r2, [pc, #500] @ (800d568 <HAL_UART_IRQHandler+0x58c>)
  30570. 800d374: 4293 cmp r3, r2
  30571. 800d376: d022 beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30572. 800d378: 687b ldr r3, [r7, #4]
  30573. 800d37a: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30574. 800d37e: 681b ldr r3, [r3, #0]
  30575. 800d380: 4a7a ldr r2, [pc, #488] @ (800d56c <HAL_UART_IRQHandler+0x590>)
  30576. 800d382: 4293 cmp r3, r2
  30577. 800d384: d01b beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30578. 800d386: 687b ldr r3, [r7, #4]
  30579. 800d388: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30580. 800d38c: 681b ldr r3, [r3, #0]
  30581. 800d38e: 4a78 ldr r2, [pc, #480] @ (800d570 <HAL_UART_IRQHandler+0x594>)
  30582. 800d390: 4293 cmp r3, r2
  30583. 800d392: d014 beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30584. 800d394: 687b ldr r3, [r7, #4]
  30585. 800d396: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30586. 800d39a: 681b ldr r3, [r3, #0]
  30587. 800d39c: 4a75 ldr r2, [pc, #468] @ (800d574 <HAL_UART_IRQHandler+0x598>)
  30588. 800d39e: 4293 cmp r3, r2
  30589. 800d3a0: d00d beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30590. 800d3a2: 687b ldr r3, [r7, #4]
  30591. 800d3a4: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30592. 800d3a8: 681b ldr r3, [r3, #0]
  30593. 800d3aa: 4a73 ldr r2, [pc, #460] @ (800d578 <HAL_UART_IRQHandler+0x59c>)
  30594. 800d3ac: 4293 cmp r3, r2
  30595. 800d3ae: d006 beq.n 800d3be <HAL_UART_IRQHandler+0x3e2>
  30596. 800d3b0: 687b ldr r3, [r7, #4]
  30597. 800d3b2: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30598. 800d3b6: 681b ldr r3, [r3, #0]
  30599. 800d3b8: 4a70 ldr r2, [pc, #448] @ (800d57c <HAL_UART_IRQHandler+0x5a0>)
  30600. 800d3ba: 4293 cmp r3, r2
  30601. 800d3bc: d106 bne.n 800d3cc <HAL_UART_IRQHandler+0x3f0>
  30602. 800d3be: 687b ldr r3, [r7, #4]
  30603. 800d3c0: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30604. 800d3c4: 681b ldr r3, [r3, #0]
  30605. 800d3c6: 685b ldr r3, [r3, #4]
  30606. 800d3c8: b29b uxth r3, r3
  30607. 800d3ca: e005 b.n 800d3d8 <HAL_UART_IRQHandler+0x3fc>
  30608. 800d3cc: 687b ldr r3, [r7, #4]
  30609. 800d3ce: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30610. 800d3d2: 681b ldr r3, [r3, #0]
  30611. 800d3d4: 685b ldr r3, [r3, #4]
  30612. 800d3d6: b29b uxth r3, r3
  30613. 800d3d8: f8a7 30be strh.w r3, [r7, #190] @ 0xbe
  30614. if ((nb_remaining_rx_data > 0U)
  30615. 800d3dc: f8b7 30be ldrh.w r3, [r7, #190] @ 0xbe
  30616. 800d3e0: 2b00 cmp r3, #0
  30617. 800d3e2: f000 81ab beq.w 800d73c <HAL_UART_IRQHandler+0x760>
  30618. && (nb_remaining_rx_data < huart->RxXferSize))
  30619. 800d3e6: 687b ldr r3, [r7, #4]
  30620. 800d3e8: f8b3 305c ldrh.w r3, [r3, #92] @ 0x5c
  30621. 800d3ec: f8b7 20be ldrh.w r2, [r7, #190] @ 0xbe
  30622. 800d3f0: 429a cmp r2, r3
  30623. 800d3f2: f080 81a3 bcs.w 800d73c <HAL_UART_IRQHandler+0x760>
  30624. {
  30625. /* Reception is not complete */
  30626. huart->RxXferCount = nb_remaining_rx_data;
  30627. 800d3f6: 687b ldr r3, [r7, #4]
  30628. 800d3f8: f8b7 20be ldrh.w r2, [r7, #190] @ 0xbe
  30629. 800d3fc: f8a3 205e strh.w r2, [r3, #94] @ 0x5e
  30630. /* In Normal mode, end DMA xfer and HAL UART Rx process*/
  30631. if (huart->hdmarx->Init.Mode != DMA_CIRCULAR)
  30632. 800d400: 687b ldr r3, [r7, #4]
  30633. 800d402: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30634. 800d406: 69db ldr r3, [r3, #28]
  30635. 800d408: f5b3 7f80 cmp.w r3, #256 @ 0x100
  30636. 800d40c: f000 8087 beq.w 800d51e <HAL_UART_IRQHandler+0x542>
  30637. {
  30638. /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
  30639. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
  30640. 800d410: 687b ldr r3, [r7, #4]
  30641. 800d412: 681b ldr r3, [r3, #0]
  30642. 800d414: f8c7 3088 str.w r3, [r7, #136] @ 0x88
  30643. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  30644. 800d418: f8d7 3088 ldr.w r3, [r7, #136] @ 0x88
  30645. 800d41c: e853 3f00 ldrex r3, [r3]
  30646. 800d420: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  30647. return(result);
  30648. 800d424: f8d7 3084 ldr.w r3, [r7, #132] @ 0x84
  30649. 800d428: f423 7380 bic.w r3, r3, #256 @ 0x100
  30650. 800d42c: f8c7 30b8 str.w r3, [r7, #184] @ 0xb8
  30651. 800d430: 687b ldr r3, [r7, #4]
  30652. 800d432: 681b ldr r3, [r3, #0]
  30653. 800d434: 461a mov r2, r3
  30654. 800d436: f8d7 30b8 ldr.w r3, [r7, #184] @ 0xb8
  30655. 800d43a: f8c7 3094 str.w r3, [r7, #148] @ 0x94
  30656. 800d43e: f8c7 2090 str.w r2, [r7, #144] @ 0x90
  30657. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  30658. 800d442: f8d7 1090 ldr.w r1, [r7, #144] @ 0x90
  30659. 800d446: f8d7 2094 ldr.w r2, [r7, #148] @ 0x94
  30660. 800d44a: e841 2300 strex r3, r2, [r1]
  30661. 800d44e: f8c7 308c str.w r3, [r7, #140] @ 0x8c
  30662. return(result);
  30663. 800d452: f8d7 308c ldr.w r3, [r7, #140] @ 0x8c
  30664. 800d456: 2b00 cmp r3, #0
  30665. 800d458: d1da bne.n 800d410 <HAL_UART_IRQHandler+0x434>
  30666. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
  30667. 800d45a: 687b ldr r3, [r7, #4]
  30668. 800d45c: 681b ldr r3, [r3, #0]
  30669. 800d45e: 3308 adds r3, #8
  30670. 800d460: 677b str r3, [r7, #116] @ 0x74
  30671. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  30672. 800d462: 6f7b ldr r3, [r7, #116] @ 0x74
  30673. 800d464: e853 3f00 ldrex r3, [r3]
  30674. 800d468: 673b str r3, [r7, #112] @ 0x70
  30675. return(result);
  30676. 800d46a: 6f3b ldr r3, [r7, #112] @ 0x70
  30677. 800d46c: f023 0301 bic.w r3, r3, #1
  30678. 800d470: f8c7 30b4 str.w r3, [r7, #180] @ 0xb4
  30679. 800d474: 687b ldr r3, [r7, #4]
  30680. 800d476: 681b ldr r3, [r3, #0]
  30681. 800d478: 3308 adds r3, #8
  30682. 800d47a: f8d7 20b4 ldr.w r2, [r7, #180] @ 0xb4
  30683. 800d47e: f8c7 2080 str.w r2, [r7, #128] @ 0x80
  30684. 800d482: 67fb str r3, [r7, #124] @ 0x7c
  30685. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  30686. 800d484: 6ff9 ldr r1, [r7, #124] @ 0x7c
  30687. 800d486: f8d7 2080 ldr.w r2, [r7, #128] @ 0x80
  30688. 800d48a: e841 2300 strex r3, r2, [r1]
  30689. 800d48e: 67bb str r3, [r7, #120] @ 0x78
  30690. return(result);
  30691. 800d490: 6fbb ldr r3, [r7, #120] @ 0x78
  30692. 800d492: 2b00 cmp r3, #0
  30693. 800d494: d1e1 bne.n 800d45a <HAL_UART_IRQHandler+0x47e>
  30694. /* Disable the DMA transfer for the receiver request by resetting the DMAR bit
  30695. in the UART CR3 register */
  30696. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
  30697. 800d496: 687b ldr r3, [r7, #4]
  30698. 800d498: 681b ldr r3, [r3, #0]
  30699. 800d49a: 3308 adds r3, #8
  30700. 800d49c: 663b str r3, [r7, #96] @ 0x60
  30701. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  30702. 800d49e: 6e3b ldr r3, [r7, #96] @ 0x60
  30703. 800d4a0: e853 3f00 ldrex r3, [r3]
  30704. 800d4a4: 65fb str r3, [r7, #92] @ 0x5c
  30705. return(result);
  30706. 800d4a6: 6dfb ldr r3, [r7, #92] @ 0x5c
  30707. 800d4a8: f023 0340 bic.w r3, r3, #64 @ 0x40
  30708. 800d4ac: f8c7 30b0 str.w r3, [r7, #176] @ 0xb0
  30709. 800d4b0: 687b ldr r3, [r7, #4]
  30710. 800d4b2: 681b ldr r3, [r3, #0]
  30711. 800d4b4: 3308 adds r3, #8
  30712. 800d4b6: f8d7 20b0 ldr.w r2, [r7, #176] @ 0xb0
  30713. 800d4ba: 66fa str r2, [r7, #108] @ 0x6c
  30714. 800d4bc: 66bb str r3, [r7, #104] @ 0x68
  30715. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  30716. 800d4be: 6eb9 ldr r1, [r7, #104] @ 0x68
  30717. 800d4c0: 6efa ldr r2, [r7, #108] @ 0x6c
  30718. 800d4c2: e841 2300 strex r3, r2, [r1]
  30719. 800d4c6: 667b str r3, [r7, #100] @ 0x64
  30720. return(result);
  30721. 800d4c8: 6e7b ldr r3, [r7, #100] @ 0x64
  30722. 800d4ca: 2b00 cmp r3, #0
  30723. 800d4cc: d1e3 bne.n 800d496 <HAL_UART_IRQHandler+0x4ba>
  30724. /* At end of Rx process, restore huart->RxState to Ready */
  30725. huart->RxState = HAL_UART_STATE_READY;
  30726. 800d4ce: 687b ldr r3, [r7, #4]
  30727. 800d4d0: 2220 movs r2, #32
  30728. 800d4d2: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  30729. huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;
  30730. 800d4d6: 687b ldr r3, [r7, #4]
  30731. 800d4d8: 2200 movs r2, #0
  30732. 800d4da: 66da str r2, [r3, #108] @ 0x6c
  30733. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
  30734. 800d4dc: 687b ldr r3, [r7, #4]
  30735. 800d4de: 681b ldr r3, [r3, #0]
  30736. 800d4e0: 64fb str r3, [r7, #76] @ 0x4c
  30737. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  30738. 800d4e2: 6cfb ldr r3, [r7, #76] @ 0x4c
  30739. 800d4e4: e853 3f00 ldrex r3, [r3]
  30740. 800d4e8: 64bb str r3, [r7, #72] @ 0x48
  30741. return(result);
  30742. 800d4ea: 6cbb ldr r3, [r7, #72] @ 0x48
  30743. 800d4ec: f023 0310 bic.w r3, r3, #16
  30744. 800d4f0: f8c7 30ac str.w r3, [r7, #172] @ 0xac
  30745. 800d4f4: 687b ldr r3, [r7, #4]
  30746. 800d4f6: 681b ldr r3, [r3, #0]
  30747. 800d4f8: 461a mov r2, r3
  30748. 800d4fa: f8d7 30ac ldr.w r3, [r7, #172] @ 0xac
  30749. 800d4fe: 65bb str r3, [r7, #88] @ 0x58
  30750. 800d500: 657a str r2, [r7, #84] @ 0x54
  30751. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  30752. 800d502: 6d79 ldr r1, [r7, #84] @ 0x54
  30753. 800d504: 6dba ldr r2, [r7, #88] @ 0x58
  30754. 800d506: e841 2300 strex r3, r2, [r1]
  30755. 800d50a: 653b str r3, [r7, #80] @ 0x50
  30756. return(result);
  30757. 800d50c: 6d3b ldr r3, [r7, #80] @ 0x50
  30758. 800d50e: 2b00 cmp r3, #0
  30759. 800d510: d1e4 bne.n 800d4dc <HAL_UART_IRQHandler+0x500>
  30760. /* Last bytes received, so no need as the abort is immediate */
  30761. (void)HAL_DMA_Abort(huart->hdmarx);
  30762. 800d512: 687b ldr r3, [r7, #4]
  30763. 800d514: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  30764. 800d518: 4618 mov r0, r3
  30765. 800d51a: f7f8 fc93 bl 8005e44 <HAL_DMA_Abort>
  30766. }
  30767. /* Initialize type of RxEvent that correspond to RxEvent callback execution;
  30768. In this case, Rx Event type is Idle Event */
  30769. huart->RxEventType = HAL_UART_RXEVENT_IDLE;
  30770. 800d51e: 687b ldr r3, [r7, #4]
  30771. 800d520: 2202 movs r2, #2
  30772. 800d522: 671a str r2, [r3, #112] @ 0x70
  30773. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  30774. /*Call registered Rx Event callback*/
  30775. huart->RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount));
  30776. #else
  30777. /*Call legacy weak Rx Event callback*/
  30778. HAL_UARTEx_RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount));
  30779. 800d524: 687b ldr r3, [r7, #4]
  30780. 800d526: f8b3 205c ldrh.w r2, [r3, #92] @ 0x5c
  30781. 800d52a: 687b ldr r3, [r7, #4]
  30782. 800d52c: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  30783. 800d530: b29b uxth r3, r3
  30784. 800d532: 1ad3 subs r3, r2, r3
  30785. 800d534: b29b uxth r3, r3
  30786. 800d536: 4619 mov r1, r3
  30787. 800d538: 6878 ldr r0, [r7, #4]
  30788. 800d53a: f7f6 fd63 bl 8004004 <HAL_UARTEx_RxEventCallback>
  30789. #endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
  30790. }
  30791. return;
  30792. 800d53e: e0fd b.n 800d73c <HAL_UART_IRQHandler+0x760>
  30793. 800d540: 40020010 .word 0x40020010
  30794. 800d544: 40020028 .word 0x40020028
  30795. 800d548: 40020040 .word 0x40020040
  30796. 800d54c: 40020058 .word 0x40020058
  30797. 800d550: 40020070 .word 0x40020070
  30798. 800d554: 40020088 .word 0x40020088
  30799. 800d558: 400200a0 .word 0x400200a0
  30800. 800d55c: 400200b8 .word 0x400200b8
  30801. 800d560: 40020410 .word 0x40020410
  30802. 800d564: 40020428 .word 0x40020428
  30803. 800d568: 40020440 .word 0x40020440
  30804. 800d56c: 40020458 .word 0x40020458
  30805. 800d570: 40020470 .word 0x40020470
  30806. 800d574: 40020488 .word 0x40020488
  30807. 800d578: 400204a0 .word 0x400204a0
  30808. 800d57c: 400204b8 .word 0x400204b8
  30809. else
  30810. {
  30811. /* DMA mode not enabled */
  30812. /* Check received length : If all expected data are received, do nothing.
  30813. Otherwise, if at least one data has already been received, IDLE event is to be notified to user */
  30814. uint16_t nb_rx_data = huart->RxXferSize - huart->RxXferCount;
  30815. 800d580: 687b ldr r3, [r7, #4]
  30816. 800d582: f8b3 205c ldrh.w r2, [r3, #92] @ 0x5c
  30817. 800d586: 687b ldr r3, [r7, #4]
  30818. 800d588: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  30819. 800d58c: b29b uxth r3, r3
  30820. 800d58e: 1ad3 subs r3, r2, r3
  30821. 800d590: f8a7 30ce strh.w r3, [r7, #206] @ 0xce
  30822. if ((huart->RxXferCount > 0U)
  30823. 800d594: 687b ldr r3, [r7, #4]
  30824. 800d596: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  30825. 800d59a: b29b uxth r3, r3
  30826. 800d59c: 2b00 cmp r3, #0
  30827. 800d59e: f000 80cf beq.w 800d740 <HAL_UART_IRQHandler+0x764>
  30828. && (nb_rx_data > 0U))
  30829. 800d5a2: f8b7 30ce ldrh.w r3, [r7, #206] @ 0xce
  30830. 800d5a6: 2b00 cmp r3, #0
  30831. 800d5a8: f000 80ca beq.w 800d740 <HAL_UART_IRQHandler+0x764>
  30832. {
  30833. /* Disable the UART Parity Error Interrupt and RXNE interrupts */
  30834. ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
  30835. 800d5ac: 687b ldr r3, [r7, #4]
  30836. 800d5ae: 681b ldr r3, [r3, #0]
  30837. 800d5b0: 63bb str r3, [r7, #56] @ 0x38
  30838. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  30839. 800d5b2: 6bbb ldr r3, [r7, #56] @ 0x38
  30840. 800d5b4: e853 3f00 ldrex r3, [r3]
  30841. 800d5b8: 637b str r3, [r7, #52] @ 0x34
  30842. return(result);
  30843. 800d5ba: 6b7b ldr r3, [r7, #52] @ 0x34
  30844. 800d5bc: f423 7390 bic.w r3, r3, #288 @ 0x120
  30845. 800d5c0: f8c7 30c8 str.w r3, [r7, #200] @ 0xc8
  30846. 800d5c4: 687b ldr r3, [r7, #4]
  30847. 800d5c6: 681b ldr r3, [r3, #0]
  30848. 800d5c8: 461a mov r2, r3
  30849. 800d5ca: f8d7 30c8 ldr.w r3, [r7, #200] @ 0xc8
  30850. 800d5ce: 647b str r3, [r7, #68] @ 0x44
  30851. 800d5d0: 643a str r2, [r7, #64] @ 0x40
  30852. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  30853. 800d5d2: 6c39 ldr r1, [r7, #64] @ 0x40
  30854. 800d5d4: 6c7a ldr r2, [r7, #68] @ 0x44
  30855. 800d5d6: e841 2300 strex r3, r2, [r1]
  30856. 800d5da: 63fb str r3, [r7, #60] @ 0x3c
  30857. return(result);
  30858. 800d5dc: 6bfb ldr r3, [r7, #60] @ 0x3c
  30859. 800d5de: 2b00 cmp r3, #0
  30860. 800d5e0: d1e4 bne.n 800d5ac <HAL_UART_IRQHandler+0x5d0>
  30861. /* Disable the UART Error Interrupt:(Frame error, noise error, overrun error) and RX FIFO Threshold interrupt */
  30862. ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
  30863. 800d5e2: 687b ldr r3, [r7, #4]
  30864. 800d5e4: 681b ldr r3, [r3, #0]
  30865. 800d5e6: 3308 adds r3, #8
  30866. 800d5e8: 627b str r3, [r7, #36] @ 0x24
  30867. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  30868. 800d5ea: 6a7b ldr r3, [r7, #36] @ 0x24
  30869. 800d5ec: e853 3f00 ldrex r3, [r3]
  30870. 800d5f0: 623b str r3, [r7, #32]
  30871. return(result);
  30872. 800d5f2: 6a3a ldr r2, [r7, #32]
  30873. 800d5f4: 4b55 ldr r3, [pc, #340] @ (800d74c <HAL_UART_IRQHandler+0x770>)
  30874. 800d5f6: 4013 ands r3, r2
  30875. 800d5f8: f8c7 30c4 str.w r3, [r7, #196] @ 0xc4
  30876. 800d5fc: 687b ldr r3, [r7, #4]
  30877. 800d5fe: 681b ldr r3, [r3, #0]
  30878. 800d600: 3308 adds r3, #8
  30879. 800d602: f8d7 20c4 ldr.w r2, [r7, #196] @ 0xc4
  30880. 800d606: 633a str r2, [r7, #48] @ 0x30
  30881. 800d608: 62fb str r3, [r7, #44] @ 0x2c
  30882. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  30883. 800d60a: 6af9 ldr r1, [r7, #44] @ 0x2c
  30884. 800d60c: 6b3a ldr r2, [r7, #48] @ 0x30
  30885. 800d60e: e841 2300 strex r3, r2, [r1]
  30886. 800d612: 62bb str r3, [r7, #40] @ 0x28
  30887. return(result);
  30888. 800d614: 6abb ldr r3, [r7, #40] @ 0x28
  30889. 800d616: 2b00 cmp r3, #0
  30890. 800d618: d1e3 bne.n 800d5e2 <HAL_UART_IRQHandler+0x606>
  30891. /* Rx process is completed, restore huart->RxState to Ready */
  30892. huart->RxState = HAL_UART_STATE_READY;
  30893. 800d61a: 687b ldr r3, [r7, #4]
  30894. 800d61c: 2220 movs r2, #32
  30895. 800d61e: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  30896. huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;
  30897. 800d622: 687b ldr r3, [r7, #4]
  30898. 800d624: 2200 movs r2, #0
  30899. 800d626: 66da str r2, [r3, #108] @ 0x6c
  30900. /* Clear RxISR function pointer */
  30901. huart->RxISR = NULL;
  30902. 800d628: 687b ldr r3, [r7, #4]
  30903. 800d62a: 2200 movs r2, #0
  30904. 800d62c: 675a str r2, [r3, #116] @ 0x74
  30905. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
  30906. 800d62e: 687b ldr r3, [r7, #4]
  30907. 800d630: 681b ldr r3, [r3, #0]
  30908. 800d632: 613b str r3, [r7, #16]
  30909. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  30910. 800d634: 693b ldr r3, [r7, #16]
  30911. 800d636: e853 3f00 ldrex r3, [r3]
  30912. 800d63a: 60fb str r3, [r7, #12]
  30913. return(result);
  30914. 800d63c: 68fb ldr r3, [r7, #12]
  30915. 800d63e: f023 0310 bic.w r3, r3, #16
  30916. 800d642: f8c7 30c0 str.w r3, [r7, #192] @ 0xc0
  30917. 800d646: 687b ldr r3, [r7, #4]
  30918. 800d648: 681b ldr r3, [r3, #0]
  30919. 800d64a: 461a mov r2, r3
  30920. 800d64c: f8d7 30c0 ldr.w r3, [r7, #192] @ 0xc0
  30921. 800d650: 61fb str r3, [r7, #28]
  30922. 800d652: 61ba str r2, [r7, #24]
  30923. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  30924. 800d654: 69b9 ldr r1, [r7, #24]
  30925. 800d656: 69fa ldr r2, [r7, #28]
  30926. 800d658: e841 2300 strex r3, r2, [r1]
  30927. 800d65c: 617b str r3, [r7, #20]
  30928. return(result);
  30929. 800d65e: 697b ldr r3, [r7, #20]
  30930. 800d660: 2b00 cmp r3, #0
  30931. 800d662: d1e4 bne.n 800d62e <HAL_UART_IRQHandler+0x652>
  30932. /* Initialize type of RxEvent that correspond to RxEvent callback execution;
  30933. In this case, Rx Event type is Idle Event */
  30934. huart->RxEventType = HAL_UART_RXEVENT_IDLE;
  30935. 800d664: 687b ldr r3, [r7, #4]
  30936. 800d666: 2202 movs r2, #2
  30937. 800d668: 671a str r2, [r3, #112] @ 0x70
  30938. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  30939. /*Call registered Rx complete callback*/
  30940. huart->RxEventCallback(huart, nb_rx_data);
  30941. #else
  30942. /*Call legacy weak Rx Event callback*/
  30943. HAL_UARTEx_RxEventCallback(huart, nb_rx_data);
  30944. 800d66a: f8b7 30ce ldrh.w r3, [r7, #206] @ 0xce
  30945. 800d66e: 4619 mov r1, r3
  30946. 800d670: 6878 ldr r0, [r7, #4]
  30947. 800d672: f7f6 fcc7 bl 8004004 <HAL_UARTEx_RxEventCallback>
  30948. #endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
  30949. }
  30950. return;
  30951. 800d676: e063 b.n 800d740 <HAL_UART_IRQHandler+0x764>
  30952. }
  30953. }
  30954. /* UART wakeup from Stop mode interrupt occurred ---------------------------*/
  30955. if (((isrflags & USART_ISR_WUF) != 0U) && ((cr3its & USART_CR3_WUFIE) != 0U))
  30956. 800d678: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  30957. 800d67c: f403 1380 and.w r3, r3, #1048576 @ 0x100000
  30958. 800d680: 2b00 cmp r3, #0
  30959. 800d682: d00e beq.n 800d6a2 <HAL_UART_IRQHandler+0x6c6>
  30960. 800d684: f8d7 30dc ldr.w r3, [r7, #220] @ 0xdc
  30961. 800d688: f403 0380 and.w r3, r3, #4194304 @ 0x400000
  30962. 800d68c: 2b00 cmp r3, #0
  30963. 800d68e: d008 beq.n 800d6a2 <HAL_UART_IRQHandler+0x6c6>
  30964. {
  30965. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_WUF);
  30966. 800d690: 687b ldr r3, [r7, #4]
  30967. 800d692: 681b ldr r3, [r3, #0]
  30968. 800d694: f44f 1280 mov.w r2, #1048576 @ 0x100000
  30969. 800d698: 621a str r2, [r3, #32]
  30970. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  30971. /* Call registered Wakeup Callback */
  30972. huart->WakeupCallback(huart);
  30973. #else
  30974. /* Call legacy weak Wakeup Callback */
  30975. HAL_UARTEx_WakeupCallback(huart);
  30976. 800d69a: 6878 ldr r0, [r7, #4]
  30977. 800d69c: f002 f80c bl 800f6b8 <HAL_UARTEx_WakeupCallback>
  30978. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
  30979. return;
  30980. 800d6a0: e051 b.n 800d746 <HAL_UART_IRQHandler+0x76a>
  30981. }
  30982. /* UART in mode Transmitter ------------------------------------------------*/
  30983. if (((isrflags & USART_ISR_TXE_TXFNF) != 0U)
  30984. 800d6a2: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  30985. 800d6a6: f003 0380 and.w r3, r3, #128 @ 0x80
  30986. 800d6aa: 2b00 cmp r3, #0
  30987. 800d6ac: d014 beq.n 800d6d8 <HAL_UART_IRQHandler+0x6fc>
  30988. && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U)
  30989. 800d6ae: f8d7 30e0 ldr.w r3, [r7, #224] @ 0xe0
  30990. 800d6b2: f003 0380 and.w r3, r3, #128 @ 0x80
  30991. 800d6b6: 2b00 cmp r3, #0
  30992. 800d6b8: d105 bne.n 800d6c6 <HAL_UART_IRQHandler+0x6ea>
  30993. || ((cr3its & USART_CR3_TXFTIE) != 0U)))
  30994. 800d6ba: f8d7 30dc ldr.w r3, [r7, #220] @ 0xdc
  30995. 800d6be: f403 0300 and.w r3, r3, #8388608 @ 0x800000
  30996. 800d6c2: 2b00 cmp r3, #0
  30997. 800d6c4: d008 beq.n 800d6d8 <HAL_UART_IRQHandler+0x6fc>
  30998. {
  30999. if (huart->TxISR != NULL)
  31000. 800d6c6: 687b ldr r3, [r7, #4]
  31001. 800d6c8: 6f9b ldr r3, [r3, #120] @ 0x78
  31002. 800d6ca: 2b00 cmp r3, #0
  31003. 800d6cc: d03a beq.n 800d744 <HAL_UART_IRQHandler+0x768>
  31004. {
  31005. huart->TxISR(huart);
  31006. 800d6ce: 687b ldr r3, [r7, #4]
  31007. 800d6d0: 6f9b ldr r3, [r3, #120] @ 0x78
  31008. 800d6d2: 6878 ldr r0, [r7, #4]
  31009. 800d6d4: 4798 blx r3
  31010. }
  31011. return;
  31012. 800d6d6: e035 b.n 800d744 <HAL_UART_IRQHandler+0x768>
  31013. }
  31014. /* UART in mode Transmitter (transmission end) -----------------------------*/
  31015. if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U))
  31016. 800d6d8: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  31017. 800d6dc: f003 0340 and.w r3, r3, #64 @ 0x40
  31018. 800d6e0: 2b00 cmp r3, #0
  31019. 800d6e2: d009 beq.n 800d6f8 <HAL_UART_IRQHandler+0x71c>
  31020. 800d6e4: f8d7 30e0 ldr.w r3, [r7, #224] @ 0xe0
  31021. 800d6e8: f003 0340 and.w r3, r3, #64 @ 0x40
  31022. 800d6ec: 2b00 cmp r3, #0
  31023. 800d6ee: d003 beq.n 800d6f8 <HAL_UART_IRQHandler+0x71c>
  31024. {
  31025. UART_EndTransmit_IT(huart);
  31026. 800d6f0: 6878 ldr r0, [r7, #4]
  31027. 800d6f2: f001 fa99 bl 800ec28 <UART_EndTransmit_IT>
  31028. return;
  31029. 800d6f6: e026 b.n 800d746 <HAL_UART_IRQHandler+0x76a>
  31030. }
  31031. /* UART TX Fifo Empty occurred ----------------------------------------------*/
  31032. if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U))
  31033. 800d6f8: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  31034. 800d6fc: f403 0300 and.w r3, r3, #8388608 @ 0x800000
  31035. 800d700: 2b00 cmp r3, #0
  31036. 800d702: d009 beq.n 800d718 <HAL_UART_IRQHandler+0x73c>
  31037. 800d704: f8d7 30e0 ldr.w r3, [r7, #224] @ 0xe0
  31038. 800d708: f003 4380 and.w r3, r3, #1073741824 @ 0x40000000
  31039. 800d70c: 2b00 cmp r3, #0
  31040. 800d70e: d003 beq.n 800d718 <HAL_UART_IRQHandler+0x73c>
  31041. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  31042. /* Call registered Tx Fifo Empty Callback */
  31043. huart->TxFifoEmptyCallback(huart);
  31044. #else
  31045. /* Call legacy weak Tx Fifo Empty Callback */
  31046. HAL_UARTEx_TxFifoEmptyCallback(huart);
  31047. 800d710: 6878 ldr r0, [r7, #4]
  31048. 800d712: f001 ffe5 bl 800f6e0 <HAL_UARTEx_TxFifoEmptyCallback>
  31049. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
  31050. return;
  31051. 800d716: e016 b.n 800d746 <HAL_UART_IRQHandler+0x76a>
  31052. }
  31053. /* UART RX Fifo Full occurred ----------------------------------------------*/
  31054. if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U))
  31055. 800d718: f8d7 30e4 ldr.w r3, [r7, #228] @ 0xe4
  31056. 800d71c: f003 7380 and.w r3, r3, #16777216 @ 0x1000000
  31057. 800d720: 2b00 cmp r3, #0
  31058. 800d722: d010 beq.n 800d746 <HAL_UART_IRQHandler+0x76a>
  31059. 800d724: f8d7 30e0 ldr.w r3, [r7, #224] @ 0xe0
  31060. 800d728: 2b00 cmp r3, #0
  31061. 800d72a: da0c bge.n 800d746 <HAL_UART_IRQHandler+0x76a>
  31062. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  31063. /* Call registered Rx Fifo Full Callback */
  31064. huart->RxFifoFullCallback(huart);
  31065. #else
  31066. /* Call legacy weak Rx Fifo Full Callback */
  31067. HAL_UARTEx_RxFifoFullCallback(huart);
  31068. 800d72c: 6878 ldr r0, [r7, #4]
  31069. 800d72e: f001 ffcd bl 800f6cc <HAL_UARTEx_RxFifoFullCallback>
  31070. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
  31071. return;
  31072. 800d732: e008 b.n 800d746 <HAL_UART_IRQHandler+0x76a>
  31073. return;
  31074. 800d734: bf00 nop
  31075. 800d736: e006 b.n 800d746 <HAL_UART_IRQHandler+0x76a>
  31076. return;
  31077. 800d738: bf00 nop
  31078. 800d73a: e004 b.n 800d746 <HAL_UART_IRQHandler+0x76a>
  31079. return;
  31080. 800d73c: bf00 nop
  31081. 800d73e: e002 b.n 800d746 <HAL_UART_IRQHandler+0x76a>
  31082. return;
  31083. 800d740: bf00 nop
  31084. 800d742: e000 b.n 800d746 <HAL_UART_IRQHandler+0x76a>
  31085. return;
  31086. 800d744: bf00 nop
  31087. }
  31088. }
  31089. 800d746: 37e8 adds r7, #232 @ 0xe8
  31090. 800d748: 46bd mov sp, r7
  31091. 800d74a: bd80 pop {r7, pc}
  31092. 800d74c: effffffe .word 0xeffffffe
  31093. 0800d750 <HAL_UART_ErrorCallback>:
  31094. * @brief UART error callback.
  31095. * @param huart UART handle.
  31096. * @retval None
  31097. */
  31098. __weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
  31099. {
  31100. 800d750: b480 push {r7}
  31101. 800d752: b083 sub sp, #12
  31102. 800d754: af00 add r7, sp, #0
  31103. 800d756: 6078 str r0, [r7, #4]
  31104. UNUSED(huart);
  31105. /* NOTE : This function should not be modified, when the callback is needed,
  31106. the HAL_UART_ErrorCallback can be implemented in the user file.
  31107. */
  31108. }
  31109. 800d758: bf00 nop
  31110. 800d75a: 370c adds r7, #12
  31111. 800d75c: 46bd mov sp, r7
  31112. 800d75e: f85d 7b04 ldr.w r7, [sp], #4
  31113. 800d762: 4770 bx lr
  31114. 0800d764 <UART_SetConfig>:
  31115. * @brief Configure the UART peripheral.
  31116. * @param huart UART handle.
  31117. * @retval HAL status
  31118. */
  31119. HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart)
  31120. {
  31121. 800d764: e92d 4fb0 stmdb sp!, {r4, r5, r7, r8, r9, sl, fp, lr}
  31122. 800d768: b092 sub sp, #72 @ 0x48
  31123. 800d76a: af00 add r7, sp, #0
  31124. 800d76c: 6178 str r0, [r7, #20]
  31125. uint32_t tmpreg;
  31126. uint16_t brrtemp;
  31127. UART_ClockSourceTypeDef clocksource;
  31128. uint32_t usartdiv;
  31129. HAL_StatusTypeDef ret = HAL_OK;
  31130. 800d76e: 2300 movs r3, #0
  31131. 800d770: f887 3042 strb.w r3, [r7, #66] @ 0x42
  31132. * the UART Word Length, Parity, Mode and oversampling:
  31133. * set the M bits according to huart->Init.WordLength value
  31134. * set PCE and PS bits according to huart->Init.Parity value
  31135. * set TE and RE bits according to huart->Init.Mode value
  31136. * set OVER8 bit according to huart->Init.OverSampling value */
  31137. tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling ;
  31138. 800d774: 697b ldr r3, [r7, #20]
  31139. 800d776: 689a ldr r2, [r3, #8]
  31140. 800d778: 697b ldr r3, [r7, #20]
  31141. 800d77a: 691b ldr r3, [r3, #16]
  31142. 800d77c: 431a orrs r2, r3
  31143. 800d77e: 697b ldr r3, [r7, #20]
  31144. 800d780: 695b ldr r3, [r3, #20]
  31145. 800d782: 431a orrs r2, r3
  31146. 800d784: 697b ldr r3, [r7, #20]
  31147. 800d786: 69db ldr r3, [r3, #28]
  31148. 800d788: 4313 orrs r3, r2
  31149. 800d78a: 647b str r3, [r7, #68] @ 0x44
  31150. MODIFY_REG(huart->Instance->CR1, USART_CR1_FIELDS, tmpreg);
  31151. 800d78c: 697b ldr r3, [r7, #20]
  31152. 800d78e: 681b ldr r3, [r3, #0]
  31153. 800d790: 681a ldr r2, [r3, #0]
  31154. 800d792: 4bbe ldr r3, [pc, #760] @ (800da8c <UART_SetConfig+0x328>)
  31155. 800d794: 4013 ands r3, r2
  31156. 800d796: 697a ldr r2, [r7, #20]
  31157. 800d798: 6812 ldr r2, [r2, #0]
  31158. 800d79a: 6c79 ldr r1, [r7, #68] @ 0x44
  31159. 800d79c: 430b orrs r3, r1
  31160. 800d79e: 6013 str r3, [r2, #0]
  31161. /*-------------------------- USART CR2 Configuration -----------------------*/
  31162. /* Configure the UART Stop Bits: Set STOP[13:12] bits according
  31163. * to huart->Init.StopBits value */
  31164. MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits);
  31165. 800d7a0: 697b ldr r3, [r7, #20]
  31166. 800d7a2: 681b ldr r3, [r3, #0]
  31167. 800d7a4: 685b ldr r3, [r3, #4]
  31168. 800d7a6: f423 5140 bic.w r1, r3, #12288 @ 0x3000
  31169. 800d7aa: 697b ldr r3, [r7, #20]
  31170. 800d7ac: 68da ldr r2, [r3, #12]
  31171. 800d7ae: 697b ldr r3, [r7, #20]
  31172. 800d7b0: 681b ldr r3, [r3, #0]
  31173. 800d7b2: 430a orrs r2, r1
  31174. 800d7b4: 605a str r2, [r3, #4]
  31175. /* Configure
  31176. * - UART HardWare Flow Control: set CTSE and RTSE bits according
  31177. * to huart->Init.HwFlowCtl value
  31178. * - one-bit sampling method versus three samples' majority rule according
  31179. * to huart->Init.OneBitSampling (not applicable to LPUART) */
  31180. tmpreg = (uint32_t)huart->Init.HwFlowCtl;
  31181. 800d7b6: 697b ldr r3, [r7, #20]
  31182. 800d7b8: 699b ldr r3, [r3, #24]
  31183. 800d7ba: 647b str r3, [r7, #68] @ 0x44
  31184. if (!(UART_INSTANCE_LOWPOWER(huart)))
  31185. 800d7bc: 697b ldr r3, [r7, #20]
  31186. 800d7be: 681b ldr r3, [r3, #0]
  31187. 800d7c0: 4ab3 ldr r2, [pc, #716] @ (800da90 <UART_SetConfig+0x32c>)
  31188. 800d7c2: 4293 cmp r3, r2
  31189. 800d7c4: d004 beq.n 800d7d0 <UART_SetConfig+0x6c>
  31190. {
  31191. tmpreg |= huart->Init.OneBitSampling;
  31192. 800d7c6: 697b ldr r3, [r7, #20]
  31193. 800d7c8: 6a1b ldr r3, [r3, #32]
  31194. 800d7ca: 6c7a ldr r2, [r7, #68] @ 0x44
  31195. 800d7cc: 4313 orrs r3, r2
  31196. 800d7ce: 647b str r3, [r7, #68] @ 0x44
  31197. }
  31198. MODIFY_REG(huart->Instance->CR3, USART_CR3_FIELDS, tmpreg);
  31199. 800d7d0: 697b ldr r3, [r7, #20]
  31200. 800d7d2: 681b ldr r3, [r3, #0]
  31201. 800d7d4: 689a ldr r2, [r3, #8]
  31202. 800d7d6: 4baf ldr r3, [pc, #700] @ (800da94 <UART_SetConfig+0x330>)
  31203. 800d7d8: 4013 ands r3, r2
  31204. 800d7da: 697a ldr r2, [r7, #20]
  31205. 800d7dc: 6812 ldr r2, [r2, #0]
  31206. 800d7de: 6c79 ldr r1, [r7, #68] @ 0x44
  31207. 800d7e0: 430b orrs r3, r1
  31208. 800d7e2: 6093 str r3, [r2, #8]
  31209. /*-------------------------- USART PRESC Configuration -----------------------*/
  31210. /* Configure
  31211. * - UART Clock Prescaler : set PRESCALER according to huart->Init.ClockPrescaler value */
  31212. MODIFY_REG(huart->Instance->PRESC, USART_PRESC_PRESCALER, huart->Init.ClockPrescaler);
  31213. 800d7e4: 697b ldr r3, [r7, #20]
  31214. 800d7e6: 681b ldr r3, [r3, #0]
  31215. 800d7e8: 6adb ldr r3, [r3, #44] @ 0x2c
  31216. 800d7ea: f023 010f bic.w r1, r3, #15
  31217. 800d7ee: 697b ldr r3, [r7, #20]
  31218. 800d7f0: 6a5a ldr r2, [r3, #36] @ 0x24
  31219. 800d7f2: 697b ldr r3, [r7, #20]
  31220. 800d7f4: 681b ldr r3, [r3, #0]
  31221. 800d7f6: 430a orrs r2, r1
  31222. 800d7f8: 62da str r2, [r3, #44] @ 0x2c
  31223. /*-------------------------- USART BRR Configuration -----------------------*/
  31224. UART_GETCLOCKSOURCE(huart, clocksource);
  31225. 800d7fa: 697b ldr r3, [r7, #20]
  31226. 800d7fc: 681b ldr r3, [r3, #0]
  31227. 800d7fe: 4aa6 ldr r2, [pc, #664] @ (800da98 <UART_SetConfig+0x334>)
  31228. 800d800: 4293 cmp r3, r2
  31229. 800d802: d177 bne.n 800d8f4 <UART_SetConfig+0x190>
  31230. 800d804: 4ba5 ldr r3, [pc, #660] @ (800da9c <UART_SetConfig+0x338>)
  31231. 800d806: 6d5b ldr r3, [r3, #84] @ 0x54
  31232. 800d808: f003 0338 and.w r3, r3, #56 @ 0x38
  31233. 800d80c: 2b28 cmp r3, #40 @ 0x28
  31234. 800d80e: d86d bhi.n 800d8ec <UART_SetConfig+0x188>
  31235. 800d810: a201 add r2, pc, #4 @ (adr r2, 800d818 <UART_SetConfig+0xb4>)
  31236. 800d812: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31237. 800d816: bf00 nop
  31238. 800d818: 0800d8bd .word 0x0800d8bd
  31239. 800d81c: 0800d8ed .word 0x0800d8ed
  31240. 800d820: 0800d8ed .word 0x0800d8ed
  31241. 800d824: 0800d8ed .word 0x0800d8ed
  31242. 800d828: 0800d8ed .word 0x0800d8ed
  31243. 800d82c: 0800d8ed .word 0x0800d8ed
  31244. 800d830: 0800d8ed .word 0x0800d8ed
  31245. 800d834: 0800d8ed .word 0x0800d8ed
  31246. 800d838: 0800d8c5 .word 0x0800d8c5
  31247. 800d83c: 0800d8ed .word 0x0800d8ed
  31248. 800d840: 0800d8ed .word 0x0800d8ed
  31249. 800d844: 0800d8ed .word 0x0800d8ed
  31250. 800d848: 0800d8ed .word 0x0800d8ed
  31251. 800d84c: 0800d8ed .word 0x0800d8ed
  31252. 800d850: 0800d8ed .word 0x0800d8ed
  31253. 800d854: 0800d8ed .word 0x0800d8ed
  31254. 800d858: 0800d8cd .word 0x0800d8cd
  31255. 800d85c: 0800d8ed .word 0x0800d8ed
  31256. 800d860: 0800d8ed .word 0x0800d8ed
  31257. 800d864: 0800d8ed .word 0x0800d8ed
  31258. 800d868: 0800d8ed .word 0x0800d8ed
  31259. 800d86c: 0800d8ed .word 0x0800d8ed
  31260. 800d870: 0800d8ed .word 0x0800d8ed
  31261. 800d874: 0800d8ed .word 0x0800d8ed
  31262. 800d878: 0800d8d5 .word 0x0800d8d5
  31263. 800d87c: 0800d8ed .word 0x0800d8ed
  31264. 800d880: 0800d8ed .word 0x0800d8ed
  31265. 800d884: 0800d8ed .word 0x0800d8ed
  31266. 800d888: 0800d8ed .word 0x0800d8ed
  31267. 800d88c: 0800d8ed .word 0x0800d8ed
  31268. 800d890: 0800d8ed .word 0x0800d8ed
  31269. 800d894: 0800d8ed .word 0x0800d8ed
  31270. 800d898: 0800d8dd .word 0x0800d8dd
  31271. 800d89c: 0800d8ed .word 0x0800d8ed
  31272. 800d8a0: 0800d8ed .word 0x0800d8ed
  31273. 800d8a4: 0800d8ed .word 0x0800d8ed
  31274. 800d8a8: 0800d8ed .word 0x0800d8ed
  31275. 800d8ac: 0800d8ed .word 0x0800d8ed
  31276. 800d8b0: 0800d8ed .word 0x0800d8ed
  31277. 800d8b4: 0800d8ed .word 0x0800d8ed
  31278. 800d8b8: 0800d8e5 .word 0x0800d8e5
  31279. 800d8bc: 2301 movs r3, #1
  31280. 800d8be: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31281. 800d8c2: e222 b.n 800dd0a <UART_SetConfig+0x5a6>
  31282. 800d8c4: 2304 movs r3, #4
  31283. 800d8c6: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31284. 800d8ca: e21e b.n 800dd0a <UART_SetConfig+0x5a6>
  31285. 800d8cc: 2308 movs r3, #8
  31286. 800d8ce: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31287. 800d8d2: e21a b.n 800dd0a <UART_SetConfig+0x5a6>
  31288. 800d8d4: 2310 movs r3, #16
  31289. 800d8d6: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31290. 800d8da: e216 b.n 800dd0a <UART_SetConfig+0x5a6>
  31291. 800d8dc: 2320 movs r3, #32
  31292. 800d8de: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31293. 800d8e2: e212 b.n 800dd0a <UART_SetConfig+0x5a6>
  31294. 800d8e4: 2340 movs r3, #64 @ 0x40
  31295. 800d8e6: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31296. 800d8ea: e20e b.n 800dd0a <UART_SetConfig+0x5a6>
  31297. 800d8ec: 2380 movs r3, #128 @ 0x80
  31298. 800d8ee: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31299. 800d8f2: e20a b.n 800dd0a <UART_SetConfig+0x5a6>
  31300. 800d8f4: 697b ldr r3, [r7, #20]
  31301. 800d8f6: 681b ldr r3, [r3, #0]
  31302. 800d8f8: 4a69 ldr r2, [pc, #420] @ (800daa0 <UART_SetConfig+0x33c>)
  31303. 800d8fa: 4293 cmp r3, r2
  31304. 800d8fc: d130 bne.n 800d960 <UART_SetConfig+0x1fc>
  31305. 800d8fe: 4b67 ldr r3, [pc, #412] @ (800da9c <UART_SetConfig+0x338>)
  31306. 800d900: 6d5b ldr r3, [r3, #84] @ 0x54
  31307. 800d902: f003 0307 and.w r3, r3, #7
  31308. 800d906: 2b05 cmp r3, #5
  31309. 800d908: d826 bhi.n 800d958 <UART_SetConfig+0x1f4>
  31310. 800d90a: a201 add r2, pc, #4 @ (adr r2, 800d910 <UART_SetConfig+0x1ac>)
  31311. 800d90c: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31312. 800d910: 0800d929 .word 0x0800d929
  31313. 800d914: 0800d931 .word 0x0800d931
  31314. 800d918: 0800d939 .word 0x0800d939
  31315. 800d91c: 0800d941 .word 0x0800d941
  31316. 800d920: 0800d949 .word 0x0800d949
  31317. 800d924: 0800d951 .word 0x0800d951
  31318. 800d928: 2300 movs r3, #0
  31319. 800d92a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31320. 800d92e: e1ec b.n 800dd0a <UART_SetConfig+0x5a6>
  31321. 800d930: 2304 movs r3, #4
  31322. 800d932: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31323. 800d936: e1e8 b.n 800dd0a <UART_SetConfig+0x5a6>
  31324. 800d938: 2308 movs r3, #8
  31325. 800d93a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31326. 800d93e: e1e4 b.n 800dd0a <UART_SetConfig+0x5a6>
  31327. 800d940: 2310 movs r3, #16
  31328. 800d942: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31329. 800d946: e1e0 b.n 800dd0a <UART_SetConfig+0x5a6>
  31330. 800d948: 2320 movs r3, #32
  31331. 800d94a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31332. 800d94e: e1dc b.n 800dd0a <UART_SetConfig+0x5a6>
  31333. 800d950: 2340 movs r3, #64 @ 0x40
  31334. 800d952: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31335. 800d956: e1d8 b.n 800dd0a <UART_SetConfig+0x5a6>
  31336. 800d958: 2380 movs r3, #128 @ 0x80
  31337. 800d95a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31338. 800d95e: e1d4 b.n 800dd0a <UART_SetConfig+0x5a6>
  31339. 800d960: 697b ldr r3, [r7, #20]
  31340. 800d962: 681b ldr r3, [r3, #0]
  31341. 800d964: 4a4f ldr r2, [pc, #316] @ (800daa4 <UART_SetConfig+0x340>)
  31342. 800d966: 4293 cmp r3, r2
  31343. 800d968: d130 bne.n 800d9cc <UART_SetConfig+0x268>
  31344. 800d96a: 4b4c ldr r3, [pc, #304] @ (800da9c <UART_SetConfig+0x338>)
  31345. 800d96c: 6d5b ldr r3, [r3, #84] @ 0x54
  31346. 800d96e: f003 0307 and.w r3, r3, #7
  31347. 800d972: 2b05 cmp r3, #5
  31348. 800d974: d826 bhi.n 800d9c4 <UART_SetConfig+0x260>
  31349. 800d976: a201 add r2, pc, #4 @ (adr r2, 800d97c <UART_SetConfig+0x218>)
  31350. 800d978: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31351. 800d97c: 0800d995 .word 0x0800d995
  31352. 800d980: 0800d99d .word 0x0800d99d
  31353. 800d984: 0800d9a5 .word 0x0800d9a5
  31354. 800d988: 0800d9ad .word 0x0800d9ad
  31355. 800d98c: 0800d9b5 .word 0x0800d9b5
  31356. 800d990: 0800d9bd .word 0x0800d9bd
  31357. 800d994: 2300 movs r3, #0
  31358. 800d996: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31359. 800d99a: e1b6 b.n 800dd0a <UART_SetConfig+0x5a6>
  31360. 800d99c: 2304 movs r3, #4
  31361. 800d99e: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31362. 800d9a2: e1b2 b.n 800dd0a <UART_SetConfig+0x5a6>
  31363. 800d9a4: 2308 movs r3, #8
  31364. 800d9a6: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31365. 800d9aa: e1ae b.n 800dd0a <UART_SetConfig+0x5a6>
  31366. 800d9ac: 2310 movs r3, #16
  31367. 800d9ae: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31368. 800d9b2: e1aa b.n 800dd0a <UART_SetConfig+0x5a6>
  31369. 800d9b4: 2320 movs r3, #32
  31370. 800d9b6: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31371. 800d9ba: e1a6 b.n 800dd0a <UART_SetConfig+0x5a6>
  31372. 800d9bc: 2340 movs r3, #64 @ 0x40
  31373. 800d9be: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31374. 800d9c2: e1a2 b.n 800dd0a <UART_SetConfig+0x5a6>
  31375. 800d9c4: 2380 movs r3, #128 @ 0x80
  31376. 800d9c6: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31377. 800d9ca: e19e b.n 800dd0a <UART_SetConfig+0x5a6>
  31378. 800d9cc: 697b ldr r3, [r7, #20]
  31379. 800d9ce: 681b ldr r3, [r3, #0]
  31380. 800d9d0: 4a35 ldr r2, [pc, #212] @ (800daa8 <UART_SetConfig+0x344>)
  31381. 800d9d2: 4293 cmp r3, r2
  31382. 800d9d4: d130 bne.n 800da38 <UART_SetConfig+0x2d4>
  31383. 800d9d6: 4b31 ldr r3, [pc, #196] @ (800da9c <UART_SetConfig+0x338>)
  31384. 800d9d8: 6d5b ldr r3, [r3, #84] @ 0x54
  31385. 800d9da: f003 0307 and.w r3, r3, #7
  31386. 800d9de: 2b05 cmp r3, #5
  31387. 800d9e0: d826 bhi.n 800da30 <UART_SetConfig+0x2cc>
  31388. 800d9e2: a201 add r2, pc, #4 @ (adr r2, 800d9e8 <UART_SetConfig+0x284>)
  31389. 800d9e4: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31390. 800d9e8: 0800da01 .word 0x0800da01
  31391. 800d9ec: 0800da09 .word 0x0800da09
  31392. 800d9f0: 0800da11 .word 0x0800da11
  31393. 800d9f4: 0800da19 .word 0x0800da19
  31394. 800d9f8: 0800da21 .word 0x0800da21
  31395. 800d9fc: 0800da29 .word 0x0800da29
  31396. 800da00: 2300 movs r3, #0
  31397. 800da02: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31398. 800da06: e180 b.n 800dd0a <UART_SetConfig+0x5a6>
  31399. 800da08: 2304 movs r3, #4
  31400. 800da0a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31401. 800da0e: e17c b.n 800dd0a <UART_SetConfig+0x5a6>
  31402. 800da10: 2308 movs r3, #8
  31403. 800da12: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31404. 800da16: e178 b.n 800dd0a <UART_SetConfig+0x5a6>
  31405. 800da18: 2310 movs r3, #16
  31406. 800da1a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31407. 800da1e: e174 b.n 800dd0a <UART_SetConfig+0x5a6>
  31408. 800da20: 2320 movs r3, #32
  31409. 800da22: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31410. 800da26: e170 b.n 800dd0a <UART_SetConfig+0x5a6>
  31411. 800da28: 2340 movs r3, #64 @ 0x40
  31412. 800da2a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31413. 800da2e: e16c b.n 800dd0a <UART_SetConfig+0x5a6>
  31414. 800da30: 2380 movs r3, #128 @ 0x80
  31415. 800da32: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31416. 800da36: e168 b.n 800dd0a <UART_SetConfig+0x5a6>
  31417. 800da38: 697b ldr r3, [r7, #20]
  31418. 800da3a: 681b ldr r3, [r3, #0]
  31419. 800da3c: 4a1b ldr r2, [pc, #108] @ (800daac <UART_SetConfig+0x348>)
  31420. 800da3e: 4293 cmp r3, r2
  31421. 800da40: d142 bne.n 800dac8 <UART_SetConfig+0x364>
  31422. 800da42: 4b16 ldr r3, [pc, #88] @ (800da9c <UART_SetConfig+0x338>)
  31423. 800da44: 6d5b ldr r3, [r3, #84] @ 0x54
  31424. 800da46: f003 0307 and.w r3, r3, #7
  31425. 800da4a: 2b05 cmp r3, #5
  31426. 800da4c: d838 bhi.n 800dac0 <UART_SetConfig+0x35c>
  31427. 800da4e: a201 add r2, pc, #4 @ (adr r2, 800da54 <UART_SetConfig+0x2f0>)
  31428. 800da50: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31429. 800da54: 0800da6d .word 0x0800da6d
  31430. 800da58: 0800da75 .word 0x0800da75
  31431. 800da5c: 0800da7d .word 0x0800da7d
  31432. 800da60: 0800da85 .word 0x0800da85
  31433. 800da64: 0800dab1 .word 0x0800dab1
  31434. 800da68: 0800dab9 .word 0x0800dab9
  31435. 800da6c: 2300 movs r3, #0
  31436. 800da6e: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31437. 800da72: e14a b.n 800dd0a <UART_SetConfig+0x5a6>
  31438. 800da74: 2304 movs r3, #4
  31439. 800da76: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31440. 800da7a: e146 b.n 800dd0a <UART_SetConfig+0x5a6>
  31441. 800da7c: 2308 movs r3, #8
  31442. 800da7e: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31443. 800da82: e142 b.n 800dd0a <UART_SetConfig+0x5a6>
  31444. 800da84: 2310 movs r3, #16
  31445. 800da86: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31446. 800da8a: e13e b.n 800dd0a <UART_SetConfig+0x5a6>
  31447. 800da8c: cfff69f3 .word 0xcfff69f3
  31448. 800da90: 58000c00 .word 0x58000c00
  31449. 800da94: 11fff4ff .word 0x11fff4ff
  31450. 800da98: 40011000 .word 0x40011000
  31451. 800da9c: 58024400 .word 0x58024400
  31452. 800daa0: 40004400 .word 0x40004400
  31453. 800daa4: 40004800 .word 0x40004800
  31454. 800daa8: 40004c00 .word 0x40004c00
  31455. 800daac: 40005000 .word 0x40005000
  31456. 800dab0: 2320 movs r3, #32
  31457. 800dab2: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31458. 800dab6: e128 b.n 800dd0a <UART_SetConfig+0x5a6>
  31459. 800dab8: 2340 movs r3, #64 @ 0x40
  31460. 800daba: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31461. 800dabe: e124 b.n 800dd0a <UART_SetConfig+0x5a6>
  31462. 800dac0: 2380 movs r3, #128 @ 0x80
  31463. 800dac2: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31464. 800dac6: e120 b.n 800dd0a <UART_SetConfig+0x5a6>
  31465. 800dac8: 697b ldr r3, [r7, #20]
  31466. 800daca: 681b ldr r3, [r3, #0]
  31467. 800dacc: 4acb ldr r2, [pc, #812] @ (800ddfc <UART_SetConfig+0x698>)
  31468. 800dace: 4293 cmp r3, r2
  31469. 800dad0: d176 bne.n 800dbc0 <UART_SetConfig+0x45c>
  31470. 800dad2: 4bcb ldr r3, [pc, #812] @ (800de00 <UART_SetConfig+0x69c>)
  31471. 800dad4: 6d5b ldr r3, [r3, #84] @ 0x54
  31472. 800dad6: f003 0338 and.w r3, r3, #56 @ 0x38
  31473. 800dada: 2b28 cmp r3, #40 @ 0x28
  31474. 800dadc: d86c bhi.n 800dbb8 <UART_SetConfig+0x454>
  31475. 800dade: a201 add r2, pc, #4 @ (adr r2, 800dae4 <UART_SetConfig+0x380>)
  31476. 800dae0: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31477. 800dae4: 0800db89 .word 0x0800db89
  31478. 800dae8: 0800dbb9 .word 0x0800dbb9
  31479. 800daec: 0800dbb9 .word 0x0800dbb9
  31480. 800daf0: 0800dbb9 .word 0x0800dbb9
  31481. 800daf4: 0800dbb9 .word 0x0800dbb9
  31482. 800daf8: 0800dbb9 .word 0x0800dbb9
  31483. 800dafc: 0800dbb9 .word 0x0800dbb9
  31484. 800db00: 0800dbb9 .word 0x0800dbb9
  31485. 800db04: 0800db91 .word 0x0800db91
  31486. 800db08: 0800dbb9 .word 0x0800dbb9
  31487. 800db0c: 0800dbb9 .word 0x0800dbb9
  31488. 800db10: 0800dbb9 .word 0x0800dbb9
  31489. 800db14: 0800dbb9 .word 0x0800dbb9
  31490. 800db18: 0800dbb9 .word 0x0800dbb9
  31491. 800db1c: 0800dbb9 .word 0x0800dbb9
  31492. 800db20: 0800dbb9 .word 0x0800dbb9
  31493. 800db24: 0800db99 .word 0x0800db99
  31494. 800db28: 0800dbb9 .word 0x0800dbb9
  31495. 800db2c: 0800dbb9 .word 0x0800dbb9
  31496. 800db30: 0800dbb9 .word 0x0800dbb9
  31497. 800db34: 0800dbb9 .word 0x0800dbb9
  31498. 800db38: 0800dbb9 .word 0x0800dbb9
  31499. 800db3c: 0800dbb9 .word 0x0800dbb9
  31500. 800db40: 0800dbb9 .word 0x0800dbb9
  31501. 800db44: 0800dba1 .word 0x0800dba1
  31502. 800db48: 0800dbb9 .word 0x0800dbb9
  31503. 800db4c: 0800dbb9 .word 0x0800dbb9
  31504. 800db50: 0800dbb9 .word 0x0800dbb9
  31505. 800db54: 0800dbb9 .word 0x0800dbb9
  31506. 800db58: 0800dbb9 .word 0x0800dbb9
  31507. 800db5c: 0800dbb9 .word 0x0800dbb9
  31508. 800db60: 0800dbb9 .word 0x0800dbb9
  31509. 800db64: 0800dba9 .word 0x0800dba9
  31510. 800db68: 0800dbb9 .word 0x0800dbb9
  31511. 800db6c: 0800dbb9 .word 0x0800dbb9
  31512. 800db70: 0800dbb9 .word 0x0800dbb9
  31513. 800db74: 0800dbb9 .word 0x0800dbb9
  31514. 800db78: 0800dbb9 .word 0x0800dbb9
  31515. 800db7c: 0800dbb9 .word 0x0800dbb9
  31516. 800db80: 0800dbb9 .word 0x0800dbb9
  31517. 800db84: 0800dbb1 .word 0x0800dbb1
  31518. 800db88: 2301 movs r3, #1
  31519. 800db8a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31520. 800db8e: e0bc b.n 800dd0a <UART_SetConfig+0x5a6>
  31521. 800db90: 2304 movs r3, #4
  31522. 800db92: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31523. 800db96: e0b8 b.n 800dd0a <UART_SetConfig+0x5a6>
  31524. 800db98: 2308 movs r3, #8
  31525. 800db9a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31526. 800db9e: e0b4 b.n 800dd0a <UART_SetConfig+0x5a6>
  31527. 800dba0: 2310 movs r3, #16
  31528. 800dba2: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31529. 800dba6: e0b0 b.n 800dd0a <UART_SetConfig+0x5a6>
  31530. 800dba8: 2320 movs r3, #32
  31531. 800dbaa: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31532. 800dbae: e0ac b.n 800dd0a <UART_SetConfig+0x5a6>
  31533. 800dbb0: 2340 movs r3, #64 @ 0x40
  31534. 800dbb2: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31535. 800dbb6: e0a8 b.n 800dd0a <UART_SetConfig+0x5a6>
  31536. 800dbb8: 2380 movs r3, #128 @ 0x80
  31537. 800dbba: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31538. 800dbbe: e0a4 b.n 800dd0a <UART_SetConfig+0x5a6>
  31539. 800dbc0: 697b ldr r3, [r7, #20]
  31540. 800dbc2: 681b ldr r3, [r3, #0]
  31541. 800dbc4: 4a8f ldr r2, [pc, #572] @ (800de04 <UART_SetConfig+0x6a0>)
  31542. 800dbc6: 4293 cmp r3, r2
  31543. 800dbc8: d130 bne.n 800dc2c <UART_SetConfig+0x4c8>
  31544. 800dbca: 4b8d ldr r3, [pc, #564] @ (800de00 <UART_SetConfig+0x69c>)
  31545. 800dbcc: 6d5b ldr r3, [r3, #84] @ 0x54
  31546. 800dbce: f003 0307 and.w r3, r3, #7
  31547. 800dbd2: 2b05 cmp r3, #5
  31548. 800dbd4: d826 bhi.n 800dc24 <UART_SetConfig+0x4c0>
  31549. 800dbd6: a201 add r2, pc, #4 @ (adr r2, 800dbdc <UART_SetConfig+0x478>)
  31550. 800dbd8: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31551. 800dbdc: 0800dbf5 .word 0x0800dbf5
  31552. 800dbe0: 0800dbfd .word 0x0800dbfd
  31553. 800dbe4: 0800dc05 .word 0x0800dc05
  31554. 800dbe8: 0800dc0d .word 0x0800dc0d
  31555. 800dbec: 0800dc15 .word 0x0800dc15
  31556. 800dbf0: 0800dc1d .word 0x0800dc1d
  31557. 800dbf4: 2300 movs r3, #0
  31558. 800dbf6: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31559. 800dbfa: e086 b.n 800dd0a <UART_SetConfig+0x5a6>
  31560. 800dbfc: 2304 movs r3, #4
  31561. 800dbfe: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31562. 800dc02: e082 b.n 800dd0a <UART_SetConfig+0x5a6>
  31563. 800dc04: 2308 movs r3, #8
  31564. 800dc06: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31565. 800dc0a: e07e b.n 800dd0a <UART_SetConfig+0x5a6>
  31566. 800dc0c: 2310 movs r3, #16
  31567. 800dc0e: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31568. 800dc12: e07a b.n 800dd0a <UART_SetConfig+0x5a6>
  31569. 800dc14: 2320 movs r3, #32
  31570. 800dc16: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31571. 800dc1a: e076 b.n 800dd0a <UART_SetConfig+0x5a6>
  31572. 800dc1c: 2340 movs r3, #64 @ 0x40
  31573. 800dc1e: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31574. 800dc22: e072 b.n 800dd0a <UART_SetConfig+0x5a6>
  31575. 800dc24: 2380 movs r3, #128 @ 0x80
  31576. 800dc26: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31577. 800dc2a: e06e b.n 800dd0a <UART_SetConfig+0x5a6>
  31578. 800dc2c: 697b ldr r3, [r7, #20]
  31579. 800dc2e: 681b ldr r3, [r3, #0]
  31580. 800dc30: 4a75 ldr r2, [pc, #468] @ (800de08 <UART_SetConfig+0x6a4>)
  31581. 800dc32: 4293 cmp r3, r2
  31582. 800dc34: d130 bne.n 800dc98 <UART_SetConfig+0x534>
  31583. 800dc36: 4b72 ldr r3, [pc, #456] @ (800de00 <UART_SetConfig+0x69c>)
  31584. 800dc38: 6d5b ldr r3, [r3, #84] @ 0x54
  31585. 800dc3a: f003 0307 and.w r3, r3, #7
  31586. 800dc3e: 2b05 cmp r3, #5
  31587. 800dc40: d826 bhi.n 800dc90 <UART_SetConfig+0x52c>
  31588. 800dc42: a201 add r2, pc, #4 @ (adr r2, 800dc48 <UART_SetConfig+0x4e4>)
  31589. 800dc44: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31590. 800dc48: 0800dc61 .word 0x0800dc61
  31591. 800dc4c: 0800dc69 .word 0x0800dc69
  31592. 800dc50: 0800dc71 .word 0x0800dc71
  31593. 800dc54: 0800dc79 .word 0x0800dc79
  31594. 800dc58: 0800dc81 .word 0x0800dc81
  31595. 800dc5c: 0800dc89 .word 0x0800dc89
  31596. 800dc60: 2300 movs r3, #0
  31597. 800dc62: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31598. 800dc66: e050 b.n 800dd0a <UART_SetConfig+0x5a6>
  31599. 800dc68: 2304 movs r3, #4
  31600. 800dc6a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31601. 800dc6e: e04c b.n 800dd0a <UART_SetConfig+0x5a6>
  31602. 800dc70: 2308 movs r3, #8
  31603. 800dc72: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31604. 800dc76: e048 b.n 800dd0a <UART_SetConfig+0x5a6>
  31605. 800dc78: 2310 movs r3, #16
  31606. 800dc7a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31607. 800dc7e: e044 b.n 800dd0a <UART_SetConfig+0x5a6>
  31608. 800dc80: 2320 movs r3, #32
  31609. 800dc82: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31610. 800dc86: e040 b.n 800dd0a <UART_SetConfig+0x5a6>
  31611. 800dc88: 2340 movs r3, #64 @ 0x40
  31612. 800dc8a: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31613. 800dc8e: e03c b.n 800dd0a <UART_SetConfig+0x5a6>
  31614. 800dc90: 2380 movs r3, #128 @ 0x80
  31615. 800dc92: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31616. 800dc96: e038 b.n 800dd0a <UART_SetConfig+0x5a6>
  31617. 800dc98: 697b ldr r3, [r7, #20]
  31618. 800dc9a: 681b ldr r3, [r3, #0]
  31619. 800dc9c: 4a5b ldr r2, [pc, #364] @ (800de0c <UART_SetConfig+0x6a8>)
  31620. 800dc9e: 4293 cmp r3, r2
  31621. 800dca0: d130 bne.n 800dd04 <UART_SetConfig+0x5a0>
  31622. 800dca2: 4b57 ldr r3, [pc, #348] @ (800de00 <UART_SetConfig+0x69c>)
  31623. 800dca4: 6d9b ldr r3, [r3, #88] @ 0x58
  31624. 800dca6: f003 0307 and.w r3, r3, #7
  31625. 800dcaa: 2b05 cmp r3, #5
  31626. 800dcac: d826 bhi.n 800dcfc <UART_SetConfig+0x598>
  31627. 800dcae: a201 add r2, pc, #4 @ (adr r2, 800dcb4 <UART_SetConfig+0x550>)
  31628. 800dcb0: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31629. 800dcb4: 0800dccd .word 0x0800dccd
  31630. 800dcb8: 0800dcd5 .word 0x0800dcd5
  31631. 800dcbc: 0800dcdd .word 0x0800dcdd
  31632. 800dcc0: 0800dce5 .word 0x0800dce5
  31633. 800dcc4: 0800dced .word 0x0800dced
  31634. 800dcc8: 0800dcf5 .word 0x0800dcf5
  31635. 800dccc: 2302 movs r3, #2
  31636. 800dcce: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31637. 800dcd2: e01a b.n 800dd0a <UART_SetConfig+0x5a6>
  31638. 800dcd4: 2304 movs r3, #4
  31639. 800dcd6: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31640. 800dcda: e016 b.n 800dd0a <UART_SetConfig+0x5a6>
  31641. 800dcdc: 2308 movs r3, #8
  31642. 800dcde: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31643. 800dce2: e012 b.n 800dd0a <UART_SetConfig+0x5a6>
  31644. 800dce4: 2310 movs r3, #16
  31645. 800dce6: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31646. 800dcea: e00e b.n 800dd0a <UART_SetConfig+0x5a6>
  31647. 800dcec: 2320 movs r3, #32
  31648. 800dcee: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31649. 800dcf2: e00a b.n 800dd0a <UART_SetConfig+0x5a6>
  31650. 800dcf4: 2340 movs r3, #64 @ 0x40
  31651. 800dcf6: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31652. 800dcfa: e006 b.n 800dd0a <UART_SetConfig+0x5a6>
  31653. 800dcfc: 2380 movs r3, #128 @ 0x80
  31654. 800dcfe: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31655. 800dd02: e002 b.n 800dd0a <UART_SetConfig+0x5a6>
  31656. 800dd04: 2380 movs r3, #128 @ 0x80
  31657. 800dd06: f887 3043 strb.w r3, [r7, #67] @ 0x43
  31658. /* Check LPUART instance */
  31659. if (UART_INSTANCE_LOWPOWER(huart))
  31660. 800dd0a: 697b ldr r3, [r7, #20]
  31661. 800dd0c: 681b ldr r3, [r3, #0]
  31662. 800dd0e: 4a3f ldr r2, [pc, #252] @ (800de0c <UART_SetConfig+0x6a8>)
  31663. 800dd10: 4293 cmp r3, r2
  31664. 800dd12: f040 80f8 bne.w 800df06 <UART_SetConfig+0x7a2>
  31665. {
  31666. /* Retrieve frequency clock */
  31667. switch (clocksource)
  31668. 800dd16: f897 3043 ldrb.w r3, [r7, #67] @ 0x43
  31669. 800dd1a: 2b20 cmp r3, #32
  31670. 800dd1c: dc46 bgt.n 800ddac <UART_SetConfig+0x648>
  31671. 800dd1e: 2b02 cmp r3, #2
  31672. 800dd20: f2c0 8082 blt.w 800de28 <UART_SetConfig+0x6c4>
  31673. 800dd24: 3b02 subs r3, #2
  31674. 800dd26: 2b1e cmp r3, #30
  31675. 800dd28: d87e bhi.n 800de28 <UART_SetConfig+0x6c4>
  31676. 800dd2a: a201 add r2, pc, #4 @ (adr r2, 800dd30 <UART_SetConfig+0x5cc>)
  31677. 800dd2c: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31678. 800dd30: 0800ddb3 .word 0x0800ddb3
  31679. 800dd34: 0800de29 .word 0x0800de29
  31680. 800dd38: 0800ddbb .word 0x0800ddbb
  31681. 800dd3c: 0800de29 .word 0x0800de29
  31682. 800dd40: 0800de29 .word 0x0800de29
  31683. 800dd44: 0800de29 .word 0x0800de29
  31684. 800dd48: 0800ddcb .word 0x0800ddcb
  31685. 800dd4c: 0800de29 .word 0x0800de29
  31686. 800dd50: 0800de29 .word 0x0800de29
  31687. 800dd54: 0800de29 .word 0x0800de29
  31688. 800dd58: 0800de29 .word 0x0800de29
  31689. 800dd5c: 0800de29 .word 0x0800de29
  31690. 800dd60: 0800de29 .word 0x0800de29
  31691. 800dd64: 0800de29 .word 0x0800de29
  31692. 800dd68: 0800dddb .word 0x0800dddb
  31693. 800dd6c: 0800de29 .word 0x0800de29
  31694. 800dd70: 0800de29 .word 0x0800de29
  31695. 800dd74: 0800de29 .word 0x0800de29
  31696. 800dd78: 0800de29 .word 0x0800de29
  31697. 800dd7c: 0800de29 .word 0x0800de29
  31698. 800dd80: 0800de29 .word 0x0800de29
  31699. 800dd84: 0800de29 .word 0x0800de29
  31700. 800dd88: 0800de29 .word 0x0800de29
  31701. 800dd8c: 0800de29 .word 0x0800de29
  31702. 800dd90: 0800de29 .word 0x0800de29
  31703. 800dd94: 0800de29 .word 0x0800de29
  31704. 800dd98: 0800de29 .word 0x0800de29
  31705. 800dd9c: 0800de29 .word 0x0800de29
  31706. 800dda0: 0800de29 .word 0x0800de29
  31707. 800dda4: 0800de29 .word 0x0800de29
  31708. 800dda8: 0800de1b .word 0x0800de1b
  31709. 800ddac: 2b40 cmp r3, #64 @ 0x40
  31710. 800ddae: d037 beq.n 800de20 <UART_SetConfig+0x6bc>
  31711. 800ddb0: e03a b.n 800de28 <UART_SetConfig+0x6c4>
  31712. {
  31713. case UART_CLOCKSOURCE_D3PCLK1:
  31714. pclk = HAL_RCCEx_GetD3PCLK1Freq();
  31715. 800ddb2: f7fe f887 bl 800bec4 <HAL_RCCEx_GetD3PCLK1Freq>
  31716. 800ddb6: 63f8 str r0, [r7, #60] @ 0x3c
  31717. break;
  31718. 800ddb8: e03c b.n 800de34 <UART_SetConfig+0x6d0>
  31719. case UART_CLOCKSOURCE_PLL2:
  31720. HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
  31721. 800ddba: f107 0324 add.w r3, r7, #36 @ 0x24
  31722. 800ddbe: 4618 mov r0, r3
  31723. 800ddc0: f7fe f896 bl 800bef0 <HAL_RCCEx_GetPLL2ClockFreq>
  31724. pclk = pll2_clocks.PLL2_Q_Frequency;
  31725. 800ddc4: 6abb ldr r3, [r7, #40] @ 0x28
  31726. 800ddc6: 63fb str r3, [r7, #60] @ 0x3c
  31727. break;
  31728. 800ddc8: e034 b.n 800de34 <UART_SetConfig+0x6d0>
  31729. case UART_CLOCKSOURCE_PLL3:
  31730. HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
  31731. 800ddca: f107 0318 add.w r3, r7, #24
  31732. 800ddce: 4618 mov r0, r3
  31733. 800ddd0: f7fe f9e2 bl 800c198 <HAL_RCCEx_GetPLL3ClockFreq>
  31734. pclk = pll3_clocks.PLL3_Q_Frequency;
  31735. 800ddd4: 69fb ldr r3, [r7, #28]
  31736. 800ddd6: 63fb str r3, [r7, #60] @ 0x3c
  31737. break;
  31738. 800ddd8: e02c b.n 800de34 <UART_SetConfig+0x6d0>
  31739. case UART_CLOCKSOURCE_HSI:
  31740. if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
  31741. 800ddda: 4b09 ldr r3, [pc, #36] @ (800de00 <UART_SetConfig+0x69c>)
  31742. 800dddc: 681b ldr r3, [r3, #0]
  31743. 800ddde: f003 0320 and.w r3, r3, #32
  31744. 800dde2: 2b00 cmp r3, #0
  31745. 800dde4: d016 beq.n 800de14 <UART_SetConfig+0x6b0>
  31746. {
  31747. pclk = (uint32_t)(HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3U));
  31748. 800dde6: 4b06 ldr r3, [pc, #24] @ (800de00 <UART_SetConfig+0x69c>)
  31749. 800dde8: 681b ldr r3, [r3, #0]
  31750. 800ddea: 08db lsrs r3, r3, #3
  31751. 800ddec: f003 0303 and.w r3, r3, #3
  31752. 800ddf0: 4a07 ldr r2, [pc, #28] @ (800de10 <UART_SetConfig+0x6ac>)
  31753. 800ddf2: fa22 f303 lsr.w r3, r2, r3
  31754. 800ddf6: 63fb str r3, [r7, #60] @ 0x3c
  31755. }
  31756. else
  31757. {
  31758. pclk = (uint32_t) HSI_VALUE;
  31759. }
  31760. break;
  31761. 800ddf8: e01c b.n 800de34 <UART_SetConfig+0x6d0>
  31762. 800ddfa: bf00 nop
  31763. 800ddfc: 40011400 .word 0x40011400
  31764. 800de00: 58024400 .word 0x58024400
  31765. 800de04: 40007800 .word 0x40007800
  31766. 800de08: 40007c00 .word 0x40007c00
  31767. 800de0c: 58000c00 .word 0x58000c00
  31768. 800de10: 03d09000 .word 0x03d09000
  31769. pclk = (uint32_t) HSI_VALUE;
  31770. 800de14: 4b9d ldr r3, [pc, #628] @ (800e08c <UART_SetConfig+0x928>)
  31771. 800de16: 63fb str r3, [r7, #60] @ 0x3c
  31772. break;
  31773. 800de18: e00c b.n 800de34 <UART_SetConfig+0x6d0>
  31774. case UART_CLOCKSOURCE_CSI:
  31775. pclk = (uint32_t) CSI_VALUE;
  31776. 800de1a: 4b9d ldr r3, [pc, #628] @ (800e090 <UART_SetConfig+0x92c>)
  31777. 800de1c: 63fb str r3, [r7, #60] @ 0x3c
  31778. break;
  31779. 800de1e: e009 b.n 800de34 <UART_SetConfig+0x6d0>
  31780. case UART_CLOCKSOURCE_LSE:
  31781. pclk = (uint32_t) LSE_VALUE;
  31782. 800de20: f44f 4300 mov.w r3, #32768 @ 0x8000
  31783. 800de24: 63fb str r3, [r7, #60] @ 0x3c
  31784. break;
  31785. 800de26: e005 b.n 800de34 <UART_SetConfig+0x6d0>
  31786. default:
  31787. pclk = 0U;
  31788. 800de28: 2300 movs r3, #0
  31789. 800de2a: 63fb str r3, [r7, #60] @ 0x3c
  31790. ret = HAL_ERROR;
  31791. 800de2c: 2301 movs r3, #1
  31792. 800de2e: f887 3042 strb.w r3, [r7, #66] @ 0x42
  31793. break;
  31794. 800de32: bf00 nop
  31795. }
  31796. /* If proper clock source reported */
  31797. if (pclk != 0U)
  31798. 800de34: 6bfb ldr r3, [r7, #60] @ 0x3c
  31799. 800de36: 2b00 cmp r3, #0
  31800. 800de38: f000 81de beq.w 800e1f8 <UART_SetConfig+0xa94>
  31801. {
  31802. /* Compute clock after Prescaler */
  31803. lpuart_ker_ck_pres = (pclk / UARTPrescTable[huart->Init.ClockPrescaler]);
  31804. 800de3c: 697b ldr r3, [r7, #20]
  31805. 800de3e: 6a5b ldr r3, [r3, #36] @ 0x24
  31806. 800de40: 4a94 ldr r2, [pc, #592] @ (800e094 <UART_SetConfig+0x930>)
  31807. 800de42: f832 3013 ldrh.w r3, [r2, r3, lsl #1]
  31808. 800de46: 461a mov r2, r3
  31809. 800de48: 6bfb ldr r3, [r7, #60] @ 0x3c
  31810. 800de4a: fbb3 f3f2 udiv r3, r3, r2
  31811. 800de4e: 633b str r3, [r7, #48] @ 0x30
  31812. /* Ensure that Frequency clock is in the range [3 * baudrate, 4096 * baudrate] */
  31813. if ((lpuart_ker_ck_pres < (3U * huart->Init.BaudRate)) ||
  31814. 800de50: 697b ldr r3, [r7, #20]
  31815. 800de52: 685a ldr r2, [r3, #4]
  31816. 800de54: 4613 mov r3, r2
  31817. 800de56: 005b lsls r3, r3, #1
  31818. 800de58: 4413 add r3, r2
  31819. 800de5a: 6b3a ldr r2, [r7, #48] @ 0x30
  31820. 800de5c: 429a cmp r2, r3
  31821. 800de5e: d305 bcc.n 800de6c <UART_SetConfig+0x708>
  31822. (lpuart_ker_ck_pres > (4096U * huart->Init.BaudRate)))
  31823. 800de60: 697b ldr r3, [r7, #20]
  31824. 800de62: 685b ldr r3, [r3, #4]
  31825. 800de64: 031b lsls r3, r3, #12
  31826. if ((lpuart_ker_ck_pres < (3U * huart->Init.BaudRate)) ||
  31827. 800de66: 6b3a ldr r2, [r7, #48] @ 0x30
  31828. 800de68: 429a cmp r2, r3
  31829. 800de6a: d903 bls.n 800de74 <UART_SetConfig+0x710>
  31830. {
  31831. ret = HAL_ERROR;
  31832. 800de6c: 2301 movs r3, #1
  31833. 800de6e: f887 3042 strb.w r3, [r7, #66] @ 0x42
  31834. 800de72: e1c1 b.n 800e1f8 <UART_SetConfig+0xa94>
  31835. }
  31836. else
  31837. {
  31838. /* Check computed UsartDiv value is in allocated range
  31839. (it is forbidden to write values lower than 0x300 in the LPUART_BRR register) */
  31840. usartdiv = (uint32_t)(UART_DIV_LPUART(pclk, huart->Init.BaudRate, huart->Init.ClockPrescaler));
  31841. 800de74: 6bfb ldr r3, [r7, #60] @ 0x3c
  31842. 800de76: 2200 movs r2, #0
  31843. 800de78: 60bb str r3, [r7, #8]
  31844. 800de7a: 60fa str r2, [r7, #12]
  31845. 800de7c: 697b ldr r3, [r7, #20]
  31846. 800de7e: 6a5b ldr r3, [r3, #36] @ 0x24
  31847. 800de80: 4a84 ldr r2, [pc, #528] @ (800e094 <UART_SetConfig+0x930>)
  31848. 800de82: f832 3013 ldrh.w r3, [r2, r3, lsl #1]
  31849. 800de86: b29b uxth r3, r3
  31850. 800de88: 2200 movs r2, #0
  31851. 800de8a: 603b str r3, [r7, #0]
  31852. 800de8c: 607a str r2, [r7, #4]
  31853. 800de8e: e9d7 2300 ldrd r2, r3, [r7]
  31854. 800de92: e9d7 0102 ldrd r0, r1, [r7, #8]
  31855. 800de96: f7f2 fc47 bl 8000728 <__aeabi_uldivmod>
  31856. 800de9a: 4602 mov r2, r0
  31857. 800de9c: 460b mov r3, r1
  31858. 800de9e: 4610 mov r0, r2
  31859. 800dea0: 4619 mov r1, r3
  31860. 800dea2: f04f 0200 mov.w r2, #0
  31861. 800dea6: f04f 0300 mov.w r3, #0
  31862. 800deaa: 020b lsls r3, r1, #8
  31863. 800deac: ea43 6310 orr.w r3, r3, r0, lsr #24
  31864. 800deb0: 0202 lsls r2, r0, #8
  31865. 800deb2: 6979 ldr r1, [r7, #20]
  31866. 800deb4: 6849 ldr r1, [r1, #4]
  31867. 800deb6: 0849 lsrs r1, r1, #1
  31868. 800deb8: 2000 movs r0, #0
  31869. 800deba: 460c mov r4, r1
  31870. 800debc: 4605 mov r5, r0
  31871. 800debe: eb12 0804 adds.w r8, r2, r4
  31872. 800dec2: eb43 0905 adc.w r9, r3, r5
  31873. 800dec6: 697b ldr r3, [r7, #20]
  31874. 800dec8: 685b ldr r3, [r3, #4]
  31875. 800deca: 2200 movs r2, #0
  31876. 800decc: 469a mov sl, r3
  31877. 800dece: 4693 mov fp, r2
  31878. 800ded0: 4652 mov r2, sl
  31879. 800ded2: 465b mov r3, fp
  31880. 800ded4: 4640 mov r0, r8
  31881. 800ded6: 4649 mov r1, r9
  31882. 800ded8: f7f2 fc26 bl 8000728 <__aeabi_uldivmod>
  31883. 800dedc: 4602 mov r2, r0
  31884. 800dede: 460b mov r3, r1
  31885. 800dee0: 4613 mov r3, r2
  31886. 800dee2: 63bb str r3, [r7, #56] @ 0x38
  31887. if ((usartdiv >= LPUART_BRR_MIN) && (usartdiv <= LPUART_BRR_MAX))
  31888. 800dee4: 6bbb ldr r3, [r7, #56] @ 0x38
  31889. 800dee6: f5b3 7f40 cmp.w r3, #768 @ 0x300
  31890. 800deea: d308 bcc.n 800defe <UART_SetConfig+0x79a>
  31891. 800deec: 6bbb ldr r3, [r7, #56] @ 0x38
  31892. 800deee: f5b3 1f80 cmp.w r3, #1048576 @ 0x100000
  31893. 800def2: d204 bcs.n 800defe <UART_SetConfig+0x79a>
  31894. {
  31895. huart->Instance->BRR = usartdiv;
  31896. 800def4: 697b ldr r3, [r7, #20]
  31897. 800def6: 681b ldr r3, [r3, #0]
  31898. 800def8: 6bba ldr r2, [r7, #56] @ 0x38
  31899. 800defa: 60da str r2, [r3, #12]
  31900. 800defc: e17c b.n 800e1f8 <UART_SetConfig+0xa94>
  31901. }
  31902. else
  31903. {
  31904. ret = HAL_ERROR;
  31905. 800defe: 2301 movs r3, #1
  31906. 800df00: f887 3042 strb.w r3, [r7, #66] @ 0x42
  31907. 800df04: e178 b.n 800e1f8 <UART_SetConfig+0xa94>
  31908. } /* if ( (lpuart_ker_ck_pres < (3 * huart->Init.BaudRate) ) ||
  31909. (lpuart_ker_ck_pres > (4096 * huart->Init.BaudRate) )) */
  31910. } /* if (pclk != 0) */
  31911. }
  31912. /* Check UART Over Sampling to set Baud Rate Register */
  31913. else if (huart->Init.OverSampling == UART_OVERSAMPLING_8)
  31914. 800df06: 697b ldr r3, [r7, #20]
  31915. 800df08: 69db ldr r3, [r3, #28]
  31916. 800df0a: f5b3 4f00 cmp.w r3, #32768 @ 0x8000
  31917. 800df0e: f040 80c5 bne.w 800e09c <UART_SetConfig+0x938>
  31918. {
  31919. switch (clocksource)
  31920. 800df12: f897 3043 ldrb.w r3, [r7, #67] @ 0x43
  31921. 800df16: 2b20 cmp r3, #32
  31922. 800df18: dc48 bgt.n 800dfac <UART_SetConfig+0x848>
  31923. 800df1a: 2b00 cmp r3, #0
  31924. 800df1c: db7b blt.n 800e016 <UART_SetConfig+0x8b2>
  31925. 800df1e: 2b20 cmp r3, #32
  31926. 800df20: d879 bhi.n 800e016 <UART_SetConfig+0x8b2>
  31927. 800df22: a201 add r2, pc, #4 @ (adr r2, 800df28 <UART_SetConfig+0x7c4>)
  31928. 800df24: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  31929. 800df28: 0800dfb3 .word 0x0800dfb3
  31930. 800df2c: 0800dfbb .word 0x0800dfbb
  31931. 800df30: 0800e017 .word 0x0800e017
  31932. 800df34: 0800e017 .word 0x0800e017
  31933. 800df38: 0800dfc3 .word 0x0800dfc3
  31934. 800df3c: 0800e017 .word 0x0800e017
  31935. 800df40: 0800e017 .word 0x0800e017
  31936. 800df44: 0800e017 .word 0x0800e017
  31937. 800df48: 0800dfd3 .word 0x0800dfd3
  31938. 800df4c: 0800e017 .word 0x0800e017
  31939. 800df50: 0800e017 .word 0x0800e017
  31940. 800df54: 0800e017 .word 0x0800e017
  31941. 800df58: 0800e017 .word 0x0800e017
  31942. 800df5c: 0800e017 .word 0x0800e017
  31943. 800df60: 0800e017 .word 0x0800e017
  31944. 800df64: 0800e017 .word 0x0800e017
  31945. 800df68: 0800dfe3 .word 0x0800dfe3
  31946. 800df6c: 0800e017 .word 0x0800e017
  31947. 800df70: 0800e017 .word 0x0800e017
  31948. 800df74: 0800e017 .word 0x0800e017
  31949. 800df78: 0800e017 .word 0x0800e017
  31950. 800df7c: 0800e017 .word 0x0800e017
  31951. 800df80: 0800e017 .word 0x0800e017
  31952. 800df84: 0800e017 .word 0x0800e017
  31953. 800df88: 0800e017 .word 0x0800e017
  31954. 800df8c: 0800e017 .word 0x0800e017
  31955. 800df90: 0800e017 .word 0x0800e017
  31956. 800df94: 0800e017 .word 0x0800e017
  31957. 800df98: 0800e017 .word 0x0800e017
  31958. 800df9c: 0800e017 .word 0x0800e017
  31959. 800dfa0: 0800e017 .word 0x0800e017
  31960. 800dfa4: 0800e017 .word 0x0800e017
  31961. 800dfa8: 0800e009 .word 0x0800e009
  31962. 800dfac: 2b40 cmp r3, #64 @ 0x40
  31963. 800dfae: d02e beq.n 800e00e <UART_SetConfig+0x8aa>
  31964. 800dfb0: e031 b.n 800e016 <UART_SetConfig+0x8b2>
  31965. {
  31966. case UART_CLOCKSOURCE_D2PCLK1:
  31967. pclk = HAL_RCC_GetPCLK1Freq();
  31968. 800dfb2: f7fc fd2b bl 800aa0c <HAL_RCC_GetPCLK1Freq>
  31969. 800dfb6: 63f8 str r0, [r7, #60] @ 0x3c
  31970. break;
  31971. 800dfb8: e033 b.n 800e022 <UART_SetConfig+0x8be>
  31972. case UART_CLOCKSOURCE_D2PCLK2:
  31973. pclk = HAL_RCC_GetPCLK2Freq();
  31974. 800dfba: f7fc fd3d bl 800aa38 <HAL_RCC_GetPCLK2Freq>
  31975. 800dfbe: 63f8 str r0, [r7, #60] @ 0x3c
  31976. break;
  31977. 800dfc0: e02f b.n 800e022 <UART_SetConfig+0x8be>
  31978. case UART_CLOCKSOURCE_PLL2:
  31979. HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
  31980. 800dfc2: f107 0324 add.w r3, r7, #36 @ 0x24
  31981. 800dfc6: 4618 mov r0, r3
  31982. 800dfc8: f7fd ff92 bl 800bef0 <HAL_RCCEx_GetPLL2ClockFreq>
  31983. pclk = pll2_clocks.PLL2_Q_Frequency;
  31984. 800dfcc: 6abb ldr r3, [r7, #40] @ 0x28
  31985. 800dfce: 63fb str r3, [r7, #60] @ 0x3c
  31986. break;
  31987. 800dfd0: e027 b.n 800e022 <UART_SetConfig+0x8be>
  31988. case UART_CLOCKSOURCE_PLL3:
  31989. HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
  31990. 800dfd2: f107 0318 add.w r3, r7, #24
  31991. 800dfd6: 4618 mov r0, r3
  31992. 800dfd8: f7fe f8de bl 800c198 <HAL_RCCEx_GetPLL3ClockFreq>
  31993. pclk = pll3_clocks.PLL3_Q_Frequency;
  31994. 800dfdc: 69fb ldr r3, [r7, #28]
  31995. 800dfde: 63fb str r3, [r7, #60] @ 0x3c
  31996. break;
  31997. 800dfe0: e01f b.n 800e022 <UART_SetConfig+0x8be>
  31998. case UART_CLOCKSOURCE_HSI:
  31999. if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
  32000. 800dfe2: 4b2d ldr r3, [pc, #180] @ (800e098 <UART_SetConfig+0x934>)
  32001. 800dfe4: 681b ldr r3, [r3, #0]
  32002. 800dfe6: f003 0320 and.w r3, r3, #32
  32003. 800dfea: 2b00 cmp r3, #0
  32004. 800dfec: d009 beq.n 800e002 <UART_SetConfig+0x89e>
  32005. {
  32006. pclk = (uint32_t)(HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3U));
  32007. 800dfee: 4b2a ldr r3, [pc, #168] @ (800e098 <UART_SetConfig+0x934>)
  32008. 800dff0: 681b ldr r3, [r3, #0]
  32009. 800dff2: 08db lsrs r3, r3, #3
  32010. 800dff4: f003 0303 and.w r3, r3, #3
  32011. 800dff8: 4a24 ldr r2, [pc, #144] @ (800e08c <UART_SetConfig+0x928>)
  32012. 800dffa: fa22 f303 lsr.w r3, r2, r3
  32013. 800dffe: 63fb str r3, [r7, #60] @ 0x3c
  32014. }
  32015. else
  32016. {
  32017. pclk = (uint32_t) HSI_VALUE;
  32018. }
  32019. break;
  32020. 800e000: e00f b.n 800e022 <UART_SetConfig+0x8be>
  32021. pclk = (uint32_t) HSI_VALUE;
  32022. 800e002: 4b22 ldr r3, [pc, #136] @ (800e08c <UART_SetConfig+0x928>)
  32023. 800e004: 63fb str r3, [r7, #60] @ 0x3c
  32024. break;
  32025. 800e006: e00c b.n 800e022 <UART_SetConfig+0x8be>
  32026. case UART_CLOCKSOURCE_CSI:
  32027. pclk = (uint32_t) CSI_VALUE;
  32028. 800e008: 4b21 ldr r3, [pc, #132] @ (800e090 <UART_SetConfig+0x92c>)
  32029. 800e00a: 63fb str r3, [r7, #60] @ 0x3c
  32030. break;
  32031. 800e00c: e009 b.n 800e022 <UART_SetConfig+0x8be>
  32032. case UART_CLOCKSOURCE_LSE:
  32033. pclk = (uint32_t) LSE_VALUE;
  32034. 800e00e: f44f 4300 mov.w r3, #32768 @ 0x8000
  32035. 800e012: 63fb str r3, [r7, #60] @ 0x3c
  32036. break;
  32037. 800e014: e005 b.n 800e022 <UART_SetConfig+0x8be>
  32038. default:
  32039. pclk = 0U;
  32040. 800e016: 2300 movs r3, #0
  32041. 800e018: 63fb str r3, [r7, #60] @ 0x3c
  32042. ret = HAL_ERROR;
  32043. 800e01a: 2301 movs r3, #1
  32044. 800e01c: f887 3042 strb.w r3, [r7, #66] @ 0x42
  32045. break;
  32046. 800e020: bf00 nop
  32047. }
  32048. /* USARTDIV must be greater than or equal to 0d16 */
  32049. if (pclk != 0U)
  32050. 800e022: 6bfb ldr r3, [r7, #60] @ 0x3c
  32051. 800e024: 2b00 cmp r3, #0
  32052. 800e026: f000 80e7 beq.w 800e1f8 <UART_SetConfig+0xa94>
  32053. {
  32054. usartdiv = (uint32_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate, huart->Init.ClockPrescaler));
  32055. 800e02a: 697b ldr r3, [r7, #20]
  32056. 800e02c: 6a5b ldr r3, [r3, #36] @ 0x24
  32057. 800e02e: 4a19 ldr r2, [pc, #100] @ (800e094 <UART_SetConfig+0x930>)
  32058. 800e030: f832 3013 ldrh.w r3, [r2, r3, lsl #1]
  32059. 800e034: 461a mov r2, r3
  32060. 800e036: 6bfb ldr r3, [r7, #60] @ 0x3c
  32061. 800e038: fbb3 f3f2 udiv r3, r3, r2
  32062. 800e03c: 005a lsls r2, r3, #1
  32063. 800e03e: 697b ldr r3, [r7, #20]
  32064. 800e040: 685b ldr r3, [r3, #4]
  32065. 800e042: 085b lsrs r3, r3, #1
  32066. 800e044: 441a add r2, r3
  32067. 800e046: 697b ldr r3, [r7, #20]
  32068. 800e048: 685b ldr r3, [r3, #4]
  32069. 800e04a: fbb2 f3f3 udiv r3, r2, r3
  32070. 800e04e: 63bb str r3, [r7, #56] @ 0x38
  32071. if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX))
  32072. 800e050: 6bbb ldr r3, [r7, #56] @ 0x38
  32073. 800e052: 2b0f cmp r3, #15
  32074. 800e054: d916 bls.n 800e084 <UART_SetConfig+0x920>
  32075. 800e056: 6bbb ldr r3, [r7, #56] @ 0x38
  32076. 800e058: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  32077. 800e05c: d212 bcs.n 800e084 <UART_SetConfig+0x920>
  32078. {
  32079. brrtemp = (uint16_t)(usartdiv & 0xFFF0U);
  32080. 800e05e: 6bbb ldr r3, [r7, #56] @ 0x38
  32081. 800e060: b29b uxth r3, r3
  32082. 800e062: f023 030f bic.w r3, r3, #15
  32083. 800e066: 86fb strh r3, [r7, #54] @ 0x36
  32084. brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U);
  32085. 800e068: 6bbb ldr r3, [r7, #56] @ 0x38
  32086. 800e06a: 085b lsrs r3, r3, #1
  32087. 800e06c: b29b uxth r3, r3
  32088. 800e06e: f003 0307 and.w r3, r3, #7
  32089. 800e072: b29a uxth r2, r3
  32090. 800e074: 8efb ldrh r3, [r7, #54] @ 0x36
  32091. 800e076: 4313 orrs r3, r2
  32092. 800e078: 86fb strh r3, [r7, #54] @ 0x36
  32093. huart->Instance->BRR = brrtemp;
  32094. 800e07a: 697b ldr r3, [r7, #20]
  32095. 800e07c: 681b ldr r3, [r3, #0]
  32096. 800e07e: 8efa ldrh r2, [r7, #54] @ 0x36
  32097. 800e080: 60da str r2, [r3, #12]
  32098. 800e082: e0b9 b.n 800e1f8 <UART_SetConfig+0xa94>
  32099. }
  32100. else
  32101. {
  32102. ret = HAL_ERROR;
  32103. 800e084: 2301 movs r3, #1
  32104. 800e086: f887 3042 strb.w r3, [r7, #66] @ 0x42
  32105. 800e08a: e0b5 b.n 800e1f8 <UART_SetConfig+0xa94>
  32106. 800e08c: 03d09000 .word 0x03d09000
  32107. 800e090: 003d0900 .word 0x003d0900
  32108. 800e094: 08030a3c .word 0x08030a3c
  32109. 800e098: 58024400 .word 0x58024400
  32110. }
  32111. }
  32112. }
  32113. else
  32114. {
  32115. switch (clocksource)
  32116. 800e09c: f897 3043 ldrb.w r3, [r7, #67] @ 0x43
  32117. 800e0a0: 2b20 cmp r3, #32
  32118. 800e0a2: dc49 bgt.n 800e138 <UART_SetConfig+0x9d4>
  32119. 800e0a4: 2b00 cmp r3, #0
  32120. 800e0a6: db7c blt.n 800e1a2 <UART_SetConfig+0xa3e>
  32121. 800e0a8: 2b20 cmp r3, #32
  32122. 800e0aa: d87a bhi.n 800e1a2 <UART_SetConfig+0xa3e>
  32123. 800e0ac: a201 add r2, pc, #4 @ (adr r2, 800e0b4 <UART_SetConfig+0x950>)
  32124. 800e0ae: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  32125. 800e0b2: bf00 nop
  32126. 800e0b4: 0800e13f .word 0x0800e13f
  32127. 800e0b8: 0800e147 .word 0x0800e147
  32128. 800e0bc: 0800e1a3 .word 0x0800e1a3
  32129. 800e0c0: 0800e1a3 .word 0x0800e1a3
  32130. 800e0c4: 0800e14f .word 0x0800e14f
  32131. 800e0c8: 0800e1a3 .word 0x0800e1a3
  32132. 800e0cc: 0800e1a3 .word 0x0800e1a3
  32133. 800e0d0: 0800e1a3 .word 0x0800e1a3
  32134. 800e0d4: 0800e15f .word 0x0800e15f
  32135. 800e0d8: 0800e1a3 .word 0x0800e1a3
  32136. 800e0dc: 0800e1a3 .word 0x0800e1a3
  32137. 800e0e0: 0800e1a3 .word 0x0800e1a3
  32138. 800e0e4: 0800e1a3 .word 0x0800e1a3
  32139. 800e0e8: 0800e1a3 .word 0x0800e1a3
  32140. 800e0ec: 0800e1a3 .word 0x0800e1a3
  32141. 800e0f0: 0800e1a3 .word 0x0800e1a3
  32142. 800e0f4: 0800e16f .word 0x0800e16f
  32143. 800e0f8: 0800e1a3 .word 0x0800e1a3
  32144. 800e0fc: 0800e1a3 .word 0x0800e1a3
  32145. 800e100: 0800e1a3 .word 0x0800e1a3
  32146. 800e104: 0800e1a3 .word 0x0800e1a3
  32147. 800e108: 0800e1a3 .word 0x0800e1a3
  32148. 800e10c: 0800e1a3 .word 0x0800e1a3
  32149. 800e110: 0800e1a3 .word 0x0800e1a3
  32150. 800e114: 0800e1a3 .word 0x0800e1a3
  32151. 800e118: 0800e1a3 .word 0x0800e1a3
  32152. 800e11c: 0800e1a3 .word 0x0800e1a3
  32153. 800e120: 0800e1a3 .word 0x0800e1a3
  32154. 800e124: 0800e1a3 .word 0x0800e1a3
  32155. 800e128: 0800e1a3 .word 0x0800e1a3
  32156. 800e12c: 0800e1a3 .word 0x0800e1a3
  32157. 800e130: 0800e1a3 .word 0x0800e1a3
  32158. 800e134: 0800e195 .word 0x0800e195
  32159. 800e138: 2b40 cmp r3, #64 @ 0x40
  32160. 800e13a: d02e beq.n 800e19a <UART_SetConfig+0xa36>
  32161. 800e13c: e031 b.n 800e1a2 <UART_SetConfig+0xa3e>
  32162. {
  32163. case UART_CLOCKSOURCE_D2PCLK1:
  32164. pclk = HAL_RCC_GetPCLK1Freq();
  32165. 800e13e: f7fc fc65 bl 800aa0c <HAL_RCC_GetPCLK1Freq>
  32166. 800e142: 63f8 str r0, [r7, #60] @ 0x3c
  32167. break;
  32168. 800e144: e033 b.n 800e1ae <UART_SetConfig+0xa4a>
  32169. case UART_CLOCKSOURCE_D2PCLK2:
  32170. pclk = HAL_RCC_GetPCLK2Freq();
  32171. 800e146: f7fc fc77 bl 800aa38 <HAL_RCC_GetPCLK2Freq>
  32172. 800e14a: 63f8 str r0, [r7, #60] @ 0x3c
  32173. break;
  32174. 800e14c: e02f b.n 800e1ae <UART_SetConfig+0xa4a>
  32175. case UART_CLOCKSOURCE_PLL2:
  32176. HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
  32177. 800e14e: f107 0324 add.w r3, r7, #36 @ 0x24
  32178. 800e152: 4618 mov r0, r3
  32179. 800e154: f7fd fecc bl 800bef0 <HAL_RCCEx_GetPLL2ClockFreq>
  32180. pclk = pll2_clocks.PLL2_Q_Frequency;
  32181. 800e158: 6abb ldr r3, [r7, #40] @ 0x28
  32182. 800e15a: 63fb str r3, [r7, #60] @ 0x3c
  32183. break;
  32184. 800e15c: e027 b.n 800e1ae <UART_SetConfig+0xa4a>
  32185. case UART_CLOCKSOURCE_PLL3:
  32186. HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
  32187. 800e15e: f107 0318 add.w r3, r7, #24
  32188. 800e162: 4618 mov r0, r3
  32189. 800e164: f7fe f818 bl 800c198 <HAL_RCCEx_GetPLL3ClockFreq>
  32190. pclk = pll3_clocks.PLL3_Q_Frequency;
  32191. 800e168: 69fb ldr r3, [r7, #28]
  32192. 800e16a: 63fb str r3, [r7, #60] @ 0x3c
  32193. break;
  32194. 800e16c: e01f b.n 800e1ae <UART_SetConfig+0xa4a>
  32195. case UART_CLOCKSOURCE_HSI:
  32196. if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
  32197. 800e16e: 4b2d ldr r3, [pc, #180] @ (800e224 <UART_SetConfig+0xac0>)
  32198. 800e170: 681b ldr r3, [r3, #0]
  32199. 800e172: f003 0320 and.w r3, r3, #32
  32200. 800e176: 2b00 cmp r3, #0
  32201. 800e178: d009 beq.n 800e18e <UART_SetConfig+0xa2a>
  32202. {
  32203. pclk = (uint32_t)(HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3U));
  32204. 800e17a: 4b2a ldr r3, [pc, #168] @ (800e224 <UART_SetConfig+0xac0>)
  32205. 800e17c: 681b ldr r3, [r3, #0]
  32206. 800e17e: 08db lsrs r3, r3, #3
  32207. 800e180: f003 0303 and.w r3, r3, #3
  32208. 800e184: 4a28 ldr r2, [pc, #160] @ (800e228 <UART_SetConfig+0xac4>)
  32209. 800e186: fa22 f303 lsr.w r3, r2, r3
  32210. 800e18a: 63fb str r3, [r7, #60] @ 0x3c
  32211. }
  32212. else
  32213. {
  32214. pclk = (uint32_t) HSI_VALUE;
  32215. }
  32216. break;
  32217. 800e18c: e00f b.n 800e1ae <UART_SetConfig+0xa4a>
  32218. pclk = (uint32_t) HSI_VALUE;
  32219. 800e18e: 4b26 ldr r3, [pc, #152] @ (800e228 <UART_SetConfig+0xac4>)
  32220. 800e190: 63fb str r3, [r7, #60] @ 0x3c
  32221. break;
  32222. 800e192: e00c b.n 800e1ae <UART_SetConfig+0xa4a>
  32223. case UART_CLOCKSOURCE_CSI:
  32224. pclk = (uint32_t) CSI_VALUE;
  32225. 800e194: 4b25 ldr r3, [pc, #148] @ (800e22c <UART_SetConfig+0xac8>)
  32226. 800e196: 63fb str r3, [r7, #60] @ 0x3c
  32227. break;
  32228. 800e198: e009 b.n 800e1ae <UART_SetConfig+0xa4a>
  32229. case UART_CLOCKSOURCE_LSE:
  32230. pclk = (uint32_t) LSE_VALUE;
  32231. 800e19a: f44f 4300 mov.w r3, #32768 @ 0x8000
  32232. 800e19e: 63fb str r3, [r7, #60] @ 0x3c
  32233. break;
  32234. 800e1a0: e005 b.n 800e1ae <UART_SetConfig+0xa4a>
  32235. default:
  32236. pclk = 0U;
  32237. 800e1a2: 2300 movs r3, #0
  32238. 800e1a4: 63fb str r3, [r7, #60] @ 0x3c
  32239. ret = HAL_ERROR;
  32240. 800e1a6: 2301 movs r3, #1
  32241. 800e1a8: f887 3042 strb.w r3, [r7, #66] @ 0x42
  32242. break;
  32243. 800e1ac: bf00 nop
  32244. }
  32245. if (pclk != 0U)
  32246. 800e1ae: 6bfb ldr r3, [r7, #60] @ 0x3c
  32247. 800e1b0: 2b00 cmp r3, #0
  32248. 800e1b2: d021 beq.n 800e1f8 <UART_SetConfig+0xa94>
  32249. {
  32250. /* USARTDIV must be greater than or equal to 0d16 */
  32251. usartdiv = (uint32_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate, huart->Init.ClockPrescaler));
  32252. 800e1b4: 697b ldr r3, [r7, #20]
  32253. 800e1b6: 6a5b ldr r3, [r3, #36] @ 0x24
  32254. 800e1b8: 4a1d ldr r2, [pc, #116] @ (800e230 <UART_SetConfig+0xacc>)
  32255. 800e1ba: f832 3013 ldrh.w r3, [r2, r3, lsl #1]
  32256. 800e1be: 461a mov r2, r3
  32257. 800e1c0: 6bfb ldr r3, [r7, #60] @ 0x3c
  32258. 800e1c2: fbb3 f2f2 udiv r2, r3, r2
  32259. 800e1c6: 697b ldr r3, [r7, #20]
  32260. 800e1c8: 685b ldr r3, [r3, #4]
  32261. 800e1ca: 085b lsrs r3, r3, #1
  32262. 800e1cc: 441a add r2, r3
  32263. 800e1ce: 697b ldr r3, [r7, #20]
  32264. 800e1d0: 685b ldr r3, [r3, #4]
  32265. 800e1d2: fbb2 f3f3 udiv r3, r2, r3
  32266. 800e1d6: 63bb str r3, [r7, #56] @ 0x38
  32267. if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX))
  32268. 800e1d8: 6bbb ldr r3, [r7, #56] @ 0x38
  32269. 800e1da: 2b0f cmp r3, #15
  32270. 800e1dc: d909 bls.n 800e1f2 <UART_SetConfig+0xa8e>
  32271. 800e1de: 6bbb ldr r3, [r7, #56] @ 0x38
  32272. 800e1e0: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  32273. 800e1e4: d205 bcs.n 800e1f2 <UART_SetConfig+0xa8e>
  32274. {
  32275. huart->Instance->BRR = (uint16_t)usartdiv;
  32276. 800e1e6: 6bbb ldr r3, [r7, #56] @ 0x38
  32277. 800e1e8: b29a uxth r2, r3
  32278. 800e1ea: 697b ldr r3, [r7, #20]
  32279. 800e1ec: 681b ldr r3, [r3, #0]
  32280. 800e1ee: 60da str r2, [r3, #12]
  32281. 800e1f0: e002 b.n 800e1f8 <UART_SetConfig+0xa94>
  32282. }
  32283. else
  32284. {
  32285. ret = HAL_ERROR;
  32286. 800e1f2: 2301 movs r3, #1
  32287. 800e1f4: f887 3042 strb.w r3, [r7, #66] @ 0x42
  32288. }
  32289. }
  32290. }
  32291. /* Initialize the number of data to process during RX/TX ISR execution */
  32292. huart->NbTxDataToProcess = 1;
  32293. 800e1f8: 697b ldr r3, [r7, #20]
  32294. 800e1fa: 2201 movs r2, #1
  32295. 800e1fc: f8a3 206a strh.w r2, [r3, #106] @ 0x6a
  32296. huart->NbRxDataToProcess = 1;
  32297. 800e200: 697b ldr r3, [r7, #20]
  32298. 800e202: 2201 movs r2, #1
  32299. 800e204: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  32300. /* Clear ISR function pointers */
  32301. huart->RxISR = NULL;
  32302. 800e208: 697b ldr r3, [r7, #20]
  32303. 800e20a: 2200 movs r2, #0
  32304. 800e20c: 675a str r2, [r3, #116] @ 0x74
  32305. huart->TxISR = NULL;
  32306. 800e20e: 697b ldr r3, [r7, #20]
  32307. 800e210: 2200 movs r2, #0
  32308. 800e212: 679a str r2, [r3, #120] @ 0x78
  32309. return ret;
  32310. 800e214: f897 3042 ldrb.w r3, [r7, #66] @ 0x42
  32311. }
  32312. 800e218: 4618 mov r0, r3
  32313. 800e21a: 3748 adds r7, #72 @ 0x48
  32314. 800e21c: 46bd mov sp, r7
  32315. 800e21e: e8bd 8fb0 ldmia.w sp!, {r4, r5, r7, r8, r9, sl, fp, pc}
  32316. 800e222: bf00 nop
  32317. 800e224: 58024400 .word 0x58024400
  32318. 800e228: 03d09000 .word 0x03d09000
  32319. 800e22c: 003d0900 .word 0x003d0900
  32320. 800e230: 08030a3c .word 0x08030a3c
  32321. 0800e234 <UART_AdvFeatureConfig>:
  32322. * @brief Configure the UART peripheral advanced features.
  32323. * @param huart UART handle.
  32324. * @retval None
  32325. */
  32326. void UART_AdvFeatureConfig(UART_HandleTypeDef *huart)
  32327. {
  32328. 800e234: b480 push {r7}
  32329. 800e236: b083 sub sp, #12
  32330. 800e238: af00 add r7, sp, #0
  32331. 800e23a: 6078 str r0, [r7, #4]
  32332. /* Check whether the set of advanced features to configure is properly set */
  32333. assert_param(IS_UART_ADVFEATURE_INIT(huart->AdvancedInit.AdvFeatureInit));
  32334. /* if required, configure RX/TX pins swap */
  32335. if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_SWAP_INIT))
  32336. 800e23c: 687b ldr r3, [r7, #4]
  32337. 800e23e: 6a9b ldr r3, [r3, #40] @ 0x28
  32338. 800e240: f003 0308 and.w r3, r3, #8
  32339. 800e244: 2b00 cmp r3, #0
  32340. 800e246: d00a beq.n 800e25e <UART_AdvFeatureConfig+0x2a>
  32341. {
  32342. assert_param(IS_UART_ADVFEATURE_SWAP(huart->AdvancedInit.Swap));
  32343. MODIFY_REG(huart->Instance->CR2, USART_CR2_SWAP, huart->AdvancedInit.Swap);
  32344. 800e248: 687b ldr r3, [r7, #4]
  32345. 800e24a: 681b ldr r3, [r3, #0]
  32346. 800e24c: 685b ldr r3, [r3, #4]
  32347. 800e24e: f423 4100 bic.w r1, r3, #32768 @ 0x8000
  32348. 800e252: 687b ldr r3, [r7, #4]
  32349. 800e254: 6b9a ldr r2, [r3, #56] @ 0x38
  32350. 800e256: 687b ldr r3, [r7, #4]
  32351. 800e258: 681b ldr r3, [r3, #0]
  32352. 800e25a: 430a orrs r2, r1
  32353. 800e25c: 605a str r2, [r3, #4]
  32354. }
  32355. /* if required, configure TX pin active level inversion */
  32356. if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_TXINVERT_INIT))
  32357. 800e25e: 687b ldr r3, [r7, #4]
  32358. 800e260: 6a9b ldr r3, [r3, #40] @ 0x28
  32359. 800e262: f003 0301 and.w r3, r3, #1
  32360. 800e266: 2b00 cmp r3, #0
  32361. 800e268: d00a beq.n 800e280 <UART_AdvFeatureConfig+0x4c>
  32362. {
  32363. assert_param(IS_UART_ADVFEATURE_TXINV(huart->AdvancedInit.TxPinLevelInvert));
  32364. MODIFY_REG(huart->Instance->CR2, USART_CR2_TXINV, huart->AdvancedInit.TxPinLevelInvert);
  32365. 800e26a: 687b ldr r3, [r7, #4]
  32366. 800e26c: 681b ldr r3, [r3, #0]
  32367. 800e26e: 685b ldr r3, [r3, #4]
  32368. 800e270: f423 3100 bic.w r1, r3, #131072 @ 0x20000
  32369. 800e274: 687b ldr r3, [r7, #4]
  32370. 800e276: 6ada ldr r2, [r3, #44] @ 0x2c
  32371. 800e278: 687b ldr r3, [r7, #4]
  32372. 800e27a: 681b ldr r3, [r3, #0]
  32373. 800e27c: 430a orrs r2, r1
  32374. 800e27e: 605a str r2, [r3, #4]
  32375. }
  32376. /* if required, configure RX pin active level inversion */
  32377. if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXINVERT_INIT))
  32378. 800e280: 687b ldr r3, [r7, #4]
  32379. 800e282: 6a9b ldr r3, [r3, #40] @ 0x28
  32380. 800e284: f003 0302 and.w r3, r3, #2
  32381. 800e288: 2b00 cmp r3, #0
  32382. 800e28a: d00a beq.n 800e2a2 <UART_AdvFeatureConfig+0x6e>
  32383. {
  32384. assert_param(IS_UART_ADVFEATURE_RXINV(huart->AdvancedInit.RxPinLevelInvert));
  32385. MODIFY_REG(huart->Instance->CR2, USART_CR2_RXINV, huart->AdvancedInit.RxPinLevelInvert);
  32386. 800e28c: 687b ldr r3, [r7, #4]
  32387. 800e28e: 681b ldr r3, [r3, #0]
  32388. 800e290: 685b ldr r3, [r3, #4]
  32389. 800e292: f423 3180 bic.w r1, r3, #65536 @ 0x10000
  32390. 800e296: 687b ldr r3, [r7, #4]
  32391. 800e298: 6b1a ldr r2, [r3, #48] @ 0x30
  32392. 800e29a: 687b ldr r3, [r7, #4]
  32393. 800e29c: 681b ldr r3, [r3, #0]
  32394. 800e29e: 430a orrs r2, r1
  32395. 800e2a0: 605a str r2, [r3, #4]
  32396. }
  32397. /* if required, configure data inversion */
  32398. if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DATAINVERT_INIT))
  32399. 800e2a2: 687b ldr r3, [r7, #4]
  32400. 800e2a4: 6a9b ldr r3, [r3, #40] @ 0x28
  32401. 800e2a6: f003 0304 and.w r3, r3, #4
  32402. 800e2aa: 2b00 cmp r3, #0
  32403. 800e2ac: d00a beq.n 800e2c4 <UART_AdvFeatureConfig+0x90>
  32404. {
  32405. assert_param(IS_UART_ADVFEATURE_DATAINV(huart->AdvancedInit.DataInvert));
  32406. MODIFY_REG(huart->Instance->CR2, USART_CR2_DATAINV, huart->AdvancedInit.DataInvert);
  32407. 800e2ae: 687b ldr r3, [r7, #4]
  32408. 800e2b0: 681b ldr r3, [r3, #0]
  32409. 800e2b2: 685b ldr r3, [r3, #4]
  32410. 800e2b4: f423 2180 bic.w r1, r3, #262144 @ 0x40000
  32411. 800e2b8: 687b ldr r3, [r7, #4]
  32412. 800e2ba: 6b5a ldr r2, [r3, #52] @ 0x34
  32413. 800e2bc: 687b ldr r3, [r7, #4]
  32414. 800e2be: 681b ldr r3, [r3, #0]
  32415. 800e2c0: 430a orrs r2, r1
  32416. 800e2c2: 605a str r2, [r3, #4]
  32417. }
  32418. /* if required, configure RX overrun detection disabling */
  32419. if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXOVERRUNDISABLE_INIT))
  32420. 800e2c4: 687b ldr r3, [r7, #4]
  32421. 800e2c6: 6a9b ldr r3, [r3, #40] @ 0x28
  32422. 800e2c8: f003 0310 and.w r3, r3, #16
  32423. 800e2cc: 2b00 cmp r3, #0
  32424. 800e2ce: d00a beq.n 800e2e6 <UART_AdvFeatureConfig+0xb2>
  32425. {
  32426. assert_param(IS_UART_OVERRUN(huart->AdvancedInit.OverrunDisable));
  32427. MODIFY_REG(huart->Instance->CR3, USART_CR3_OVRDIS, huart->AdvancedInit.OverrunDisable);
  32428. 800e2d0: 687b ldr r3, [r7, #4]
  32429. 800e2d2: 681b ldr r3, [r3, #0]
  32430. 800e2d4: 689b ldr r3, [r3, #8]
  32431. 800e2d6: f423 5180 bic.w r1, r3, #4096 @ 0x1000
  32432. 800e2da: 687b ldr r3, [r7, #4]
  32433. 800e2dc: 6bda ldr r2, [r3, #60] @ 0x3c
  32434. 800e2de: 687b ldr r3, [r7, #4]
  32435. 800e2e0: 681b ldr r3, [r3, #0]
  32436. 800e2e2: 430a orrs r2, r1
  32437. 800e2e4: 609a str r2, [r3, #8]
  32438. }
  32439. /* if required, configure DMA disabling on reception error */
  32440. if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DMADISABLEONERROR_INIT))
  32441. 800e2e6: 687b ldr r3, [r7, #4]
  32442. 800e2e8: 6a9b ldr r3, [r3, #40] @ 0x28
  32443. 800e2ea: f003 0320 and.w r3, r3, #32
  32444. 800e2ee: 2b00 cmp r3, #0
  32445. 800e2f0: d00a beq.n 800e308 <UART_AdvFeatureConfig+0xd4>
  32446. {
  32447. assert_param(IS_UART_ADVFEATURE_DMAONRXERROR(huart->AdvancedInit.DMADisableonRxError));
  32448. MODIFY_REG(huart->Instance->CR3, USART_CR3_DDRE, huart->AdvancedInit.DMADisableonRxError);
  32449. 800e2f2: 687b ldr r3, [r7, #4]
  32450. 800e2f4: 681b ldr r3, [r3, #0]
  32451. 800e2f6: 689b ldr r3, [r3, #8]
  32452. 800e2f8: f423 5100 bic.w r1, r3, #8192 @ 0x2000
  32453. 800e2fc: 687b ldr r3, [r7, #4]
  32454. 800e2fe: 6c1a ldr r2, [r3, #64] @ 0x40
  32455. 800e300: 687b ldr r3, [r7, #4]
  32456. 800e302: 681b ldr r3, [r3, #0]
  32457. 800e304: 430a orrs r2, r1
  32458. 800e306: 609a str r2, [r3, #8]
  32459. }
  32460. /* if required, configure auto Baud rate detection scheme */
  32461. if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT))
  32462. 800e308: 687b ldr r3, [r7, #4]
  32463. 800e30a: 6a9b ldr r3, [r3, #40] @ 0x28
  32464. 800e30c: f003 0340 and.w r3, r3, #64 @ 0x40
  32465. 800e310: 2b00 cmp r3, #0
  32466. 800e312: d01a beq.n 800e34a <UART_AdvFeatureConfig+0x116>
  32467. {
  32468. assert_param(IS_USART_AUTOBAUDRATE_DETECTION_INSTANCE(huart->Instance));
  32469. assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart->AdvancedInit.AutoBaudRateEnable));
  32470. MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable);
  32471. 800e314: 687b ldr r3, [r7, #4]
  32472. 800e316: 681b ldr r3, [r3, #0]
  32473. 800e318: 685b ldr r3, [r3, #4]
  32474. 800e31a: f423 1180 bic.w r1, r3, #1048576 @ 0x100000
  32475. 800e31e: 687b ldr r3, [r7, #4]
  32476. 800e320: 6c5a ldr r2, [r3, #68] @ 0x44
  32477. 800e322: 687b ldr r3, [r7, #4]
  32478. 800e324: 681b ldr r3, [r3, #0]
  32479. 800e326: 430a orrs r2, r1
  32480. 800e328: 605a str r2, [r3, #4]
  32481. /* set auto Baudrate detection parameters if detection is enabled */
  32482. if (huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE)
  32483. 800e32a: 687b ldr r3, [r7, #4]
  32484. 800e32c: 6c5b ldr r3, [r3, #68] @ 0x44
  32485. 800e32e: f5b3 1f80 cmp.w r3, #1048576 @ 0x100000
  32486. 800e332: d10a bne.n 800e34a <UART_AdvFeatureConfig+0x116>
  32487. {
  32488. assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode));
  32489. MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode);
  32490. 800e334: 687b ldr r3, [r7, #4]
  32491. 800e336: 681b ldr r3, [r3, #0]
  32492. 800e338: 685b ldr r3, [r3, #4]
  32493. 800e33a: f423 01c0 bic.w r1, r3, #6291456 @ 0x600000
  32494. 800e33e: 687b ldr r3, [r7, #4]
  32495. 800e340: 6c9a ldr r2, [r3, #72] @ 0x48
  32496. 800e342: 687b ldr r3, [r7, #4]
  32497. 800e344: 681b ldr r3, [r3, #0]
  32498. 800e346: 430a orrs r2, r1
  32499. 800e348: 605a str r2, [r3, #4]
  32500. }
  32501. }
  32502. /* if required, configure MSB first on communication line */
  32503. if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_MSBFIRST_INIT))
  32504. 800e34a: 687b ldr r3, [r7, #4]
  32505. 800e34c: 6a9b ldr r3, [r3, #40] @ 0x28
  32506. 800e34e: f003 0380 and.w r3, r3, #128 @ 0x80
  32507. 800e352: 2b00 cmp r3, #0
  32508. 800e354: d00a beq.n 800e36c <UART_AdvFeatureConfig+0x138>
  32509. {
  32510. assert_param(IS_UART_ADVFEATURE_MSBFIRST(huart->AdvancedInit.MSBFirst));
  32511. MODIFY_REG(huart->Instance->CR2, USART_CR2_MSBFIRST, huart->AdvancedInit.MSBFirst);
  32512. 800e356: 687b ldr r3, [r7, #4]
  32513. 800e358: 681b ldr r3, [r3, #0]
  32514. 800e35a: 685b ldr r3, [r3, #4]
  32515. 800e35c: f423 2100 bic.w r1, r3, #524288 @ 0x80000
  32516. 800e360: 687b ldr r3, [r7, #4]
  32517. 800e362: 6cda ldr r2, [r3, #76] @ 0x4c
  32518. 800e364: 687b ldr r3, [r7, #4]
  32519. 800e366: 681b ldr r3, [r3, #0]
  32520. 800e368: 430a orrs r2, r1
  32521. 800e36a: 605a str r2, [r3, #4]
  32522. }
  32523. }
  32524. 800e36c: bf00 nop
  32525. 800e36e: 370c adds r7, #12
  32526. 800e370: 46bd mov sp, r7
  32527. 800e372: f85d 7b04 ldr.w r7, [sp], #4
  32528. 800e376: 4770 bx lr
  32529. 0800e378 <UART_CheckIdleState>:
  32530. * @brief Check the UART Idle State.
  32531. * @param huart UART handle.
  32532. * @retval HAL status
  32533. */
  32534. HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart)
  32535. {
  32536. 800e378: b580 push {r7, lr}
  32537. 800e37a: b098 sub sp, #96 @ 0x60
  32538. 800e37c: af02 add r7, sp, #8
  32539. 800e37e: 6078 str r0, [r7, #4]
  32540. uint32_t tickstart;
  32541. /* Initialize the UART ErrorCode */
  32542. huart->ErrorCode = HAL_UART_ERROR_NONE;
  32543. 800e380: 687b ldr r3, [r7, #4]
  32544. 800e382: 2200 movs r2, #0
  32545. 800e384: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  32546. /* Init tickstart for timeout management */
  32547. tickstart = HAL_GetTick();
  32548. 800e388: f7f6 fe52 bl 8005030 <HAL_GetTick>
  32549. 800e38c: 6578 str r0, [r7, #84] @ 0x54
  32550. /* Check if the Transmitter is enabled */
  32551. if ((huart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
  32552. 800e38e: 687b ldr r3, [r7, #4]
  32553. 800e390: 681b ldr r3, [r3, #0]
  32554. 800e392: 681b ldr r3, [r3, #0]
  32555. 800e394: f003 0308 and.w r3, r3, #8
  32556. 800e398: 2b08 cmp r3, #8
  32557. 800e39a: d12f bne.n 800e3fc <UART_CheckIdleState+0x84>
  32558. {
  32559. /* Wait until TEACK flag is set */
  32560. if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_TEACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
  32561. 800e39c: f06f 437e mvn.w r3, #4261412864 @ 0xfe000000
  32562. 800e3a0: 9300 str r3, [sp, #0]
  32563. 800e3a2: 6d7b ldr r3, [r7, #84] @ 0x54
  32564. 800e3a4: 2200 movs r2, #0
  32565. 800e3a6: f44f 1100 mov.w r1, #2097152 @ 0x200000
  32566. 800e3aa: 6878 ldr r0, [r7, #4]
  32567. 800e3ac: f000 f88e bl 800e4cc <UART_WaitOnFlagUntilTimeout>
  32568. 800e3b0: 4603 mov r3, r0
  32569. 800e3b2: 2b00 cmp r3, #0
  32570. 800e3b4: d022 beq.n 800e3fc <UART_CheckIdleState+0x84>
  32571. {
  32572. /* Disable TXE interrupt for the interrupt process */
  32573. ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE));
  32574. 800e3b6: 687b ldr r3, [r7, #4]
  32575. 800e3b8: 681b ldr r3, [r3, #0]
  32576. 800e3ba: 63bb str r3, [r7, #56] @ 0x38
  32577. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  32578. 800e3bc: 6bbb ldr r3, [r7, #56] @ 0x38
  32579. 800e3be: e853 3f00 ldrex r3, [r3]
  32580. 800e3c2: 637b str r3, [r7, #52] @ 0x34
  32581. return(result);
  32582. 800e3c4: 6b7b ldr r3, [r7, #52] @ 0x34
  32583. 800e3c6: f023 0380 bic.w r3, r3, #128 @ 0x80
  32584. 800e3ca: 653b str r3, [r7, #80] @ 0x50
  32585. 800e3cc: 687b ldr r3, [r7, #4]
  32586. 800e3ce: 681b ldr r3, [r3, #0]
  32587. 800e3d0: 461a mov r2, r3
  32588. 800e3d2: 6d3b ldr r3, [r7, #80] @ 0x50
  32589. 800e3d4: 647b str r3, [r7, #68] @ 0x44
  32590. 800e3d6: 643a str r2, [r7, #64] @ 0x40
  32591. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  32592. 800e3d8: 6c39 ldr r1, [r7, #64] @ 0x40
  32593. 800e3da: 6c7a ldr r2, [r7, #68] @ 0x44
  32594. 800e3dc: e841 2300 strex r3, r2, [r1]
  32595. 800e3e0: 63fb str r3, [r7, #60] @ 0x3c
  32596. return(result);
  32597. 800e3e2: 6bfb ldr r3, [r7, #60] @ 0x3c
  32598. 800e3e4: 2b00 cmp r3, #0
  32599. 800e3e6: d1e6 bne.n 800e3b6 <UART_CheckIdleState+0x3e>
  32600. huart->gState = HAL_UART_STATE_READY;
  32601. 800e3e8: 687b ldr r3, [r7, #4]
  32602. 800e3ea: 2220 movs r2, #32
  32603. 800e3ec: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  32604. __HAL_UNLOCK(huart);
  32605. 800e3f0: 687b ldr r3, [r7, #4]
  32606. 800e3f2: 2200 movs r2, #0
  32607. 800e3f4: f883 2084 strb.w r2, [r3, #132] @ 0x84
  32608. /* Timeout occurred */
  32609. return HAL_TIMEOUT;
  32610. 800e3f8: 2303 movs r3, #3
  32611. 800e3fa: e063 b.n 800e4c4 <UART_CheckIdleState+0x14c>
  32612. }
  32613. }
  32614. /* Check if the Receiver is enabled */
  32615. if ((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
  32616. 800e3fc: 687b ldr r3, [r7, #4]
  32617. 800e3fe: 681b ldr r3, [r3, #0]
  32618. 800e400: 681b ldr r3, [r3, #0]
  32619. 800e402: f003 0304 and.w r3, r3, #4
  32620. 800e406: 2b04 cmp r3, #4
  32621. 800e408: d149 bne.n 800e49e <UART_CheckIdleState+0x126>
  32622. {
  32623. /* Wait until REACK flag is set */
  32624. if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
  32625. 800e40a: f06f 437e mvn.w r3, #4261412864 @ 0xfe000000
  32626. 800e40e: 9300 str r3, [sp, #0]
  32627. 800e410: 6d7b ldr r3, [r7, #84] @ 0x54
  32628. 800e412: 2200 movs r2, #0
  32629. 800e414: f44f 0180 mov.w r1, #4194304 @ 0x400000
  32630. 800e418: 6878 ldr r0, [r7, #4]
  32631. 800e41a: f000 f857 bl 800e4cc <UART_WaitOnFlagUntilTimeout>
  32632. 800e41e: 4603 mov r3, r0
  32633. 800e420: 2b00 cmp r3, #0
  32634. 800e422: d03c beq.n 800e49e <UART_CheckIdleState+0x126>
  32635. {
  32636. /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error)
  32637. interrupts for the interrupt process */
  32638. ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
  32639. 800e424: 687b ldr r3, [r7, #4]
  32640. 800e426: 681b ldr r3, [r3, #0]
  32641. 800e428: 627b str r3, [r7, #36] @ 0x24
  32642. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  32643. 800e42a: 6a7b ldr r3, [r7, #36] @ 0x24
  32644. 800e42c: e853 3f00 ldrex r3, [r3]
  32645. 800e430: 623b str r3, [r7, #32]
  32646. return(result);
  32647. 800e432: 6a3b ldr r3, [r7, #32]
  32648. 800e434: f423 7390 bic.w r3, r3, #288 @ 0x120
  32649. 800e438: 64fb str r3, [r7, #76] @ 0x4c
  32650. 800e43a: 687b ldr r3, [r7, #4]
  32651. 800e43c: 681b ldr r3, [r3, #0]
  32652. 800e43e: 461a mov r2, r3
  32653. 800e440: 6cfb ldr r3, [r7, #76] @ 0x4c
  32654. 800e442: 633b str r3, [r7, #48] @ 0x30
  32655. 800e444: 62fa str r2, [r7, #44] @ 0x2c
  32656. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  32657. 800e446: 6af9 ldr r1, [r7, #44] @ 0x2c
  32658. 800e448: 6b3a ldr r2, [r7, #48] @ 0x30
  32659. 800e44a: e841 2300 strex r3, r2, [r1]
  32660. 800e44e: 62bb str r3, [r7, #40] @ 0x28
  32661. return(result);
  32662. 800e450: 6abb ldr r3, [r7, #40] @ 0x28
  32663. 800e452: 2b00 cmp r3, #0
  32664. 800e454: d1e6 bne.n 800e424 <UART_CheckIdleState+0xac>
  32665. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
  32666. 800e456: 687b ldr r3, [r7, #4]
  32667. 800e458: 681b ldr r3, [r3, #0]
  32668. 800e45a: 3308 adds r3, #8
  32669. 800e45c: 613b str r3, [r7, #16]
  32670. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  32671. 800e45e: 693b ldr r3, [r7, #16]
  32672. 800e460: e853 3f00 ldrex r3, [r3]
  32673. 800e464: 60fb str r3, [r7, #12]
  32674. return(result);
  32675. 800e466: 68fb ldr r3, [r7, #12]
  32676. 800e468: f023 0301 bic.w r3, r3, #1
  32677. 800e46c: 64bb str r3, [r7, #72] @ 0x48
  32678. 800e46e: 687b ldr r3, [r7, #4]
  32679. 800e470: 681b ldr r3, [r3, #0]
  32680. 800e472: 3308 adds r3, #8
  32681. 800e474: 6cba ldr r2, [r7, #72] @ 0x48
  32682. 800e476: 61fa str r2, [r7, #28]
  32683. 800e478: 61bb str r3, [r7, #24]
  32684. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  32685. 800e47a: 69b9 ldr r1, [r7, #24]
  32686. 800e47c: 69fa ldr r2, [r7, #28]
  32687. 800e47e: e841 2300 strex r3, r2, [r1]
  32688. 800e482: 617b str r3, [r7, #20]
  32689. return(result);
  32690. 800e484: 697b ldr r3, [r7, #20]
  32691. 800e486: 2b00 cmp r3, #0
  32692. 800e488: d1e5 bne.n 800e456 <UART_CheckIdleState+0xde>
  32693. huart->RxState = HAL_UART_STATE_READY;
  32694. 800e48a: 687b ldr r3, [r7, #4]
  32695. 800e48c: 2220 movs r2, #32
  32696. 800e48e: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  32697. __HAL_UNLOCK(huart);
  32698. 800e492: 687b ldr r3, [r7, #4]
  32699. 800e494: 2200 movs r2, #0
  32700. 800e496: f883 2084 strb.w r2, [r3, #132] @ 0x84
  32701. /* Timeout occurred */
  32702. return HAL_TIMEOUT;
  32703. 800e49a: 2303 movs r3, #3
  32704. 800e49c: e012 b.n 800e4c4 <UART_CheckIdleState+0x14c>
  32705. }
  32706. }
  32707. /* Initialize the UART State */
  32708. huart->gState = HAL_UART_STATE_READY;
  32709. 800e49e: 687b ldr r3, [r7, #4]
  32710. 800e4a0: 2220 movs r2, #32
  32711. 800e4a2: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  32712. huart->RxState = HAL_UART_STATE_READY;
  32713. 800e4a6: 687b ldr r3, [r7, #4]
  32714. 800e4a8: 2220 movs r2, #32
  32715. 800e4aa: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  32716. huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;
  32717. 800e4ae: 687b ldr r3, [r7, #4]
  32718. 800e4b0: 2200 movs r2, #0
  32719. 800e4b2: 66da str r2, [r3, #108] @ 0x6c
  32720. huart->RxEventType = HAL_UART_RXEVENT_TC;
  32721. 800e4b4: 687b ldr r3, [r7, #4]
  32722. 800e4b6: 2200 movs r2, #0
  32723. 800e4b8: 671a str r2, [r3, #112] @ 0x70
  32724. __HAL_UNLOCK(huart);
  32725. 800e4ba: 687b ldr r3, [r7, #4]
  32726. 800e4bc: 2200 movs r2, #0
  32727. 800e4be: f883 2084 strb.w r2, [r3, #132] @ 0x84
  32728. return HAL_OK;
  32729. 800e4c2: 2300 movs r3, #0
  32730. }
  32731. 800e4c4: 4618 mov r0, r3
  32732. 800e4c6: 3758 adds r7, #88 @ 0x58
  32733. 800e4c8: 46bd mov sp, r7
  32734. 800e4ca: bd80 pop {r7, pc}
  32735. 0800e4cc <UART_WaitOnFlagUntilTimeout>:
  32736. * @param Timeout Timeout duration
  32737. * @retval HAL status
  32738. */
  32739. HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,
  32740. uint32_t Tickstart, uint32_t Timeout)
  32741. {
  32742. 800e4cc: b580 push {r7, lr}
  32743. 800e4ce: b084 sub sp, #16
  32744. 800e4d0: af00 add r7, sp, #0
  32745. 800e4d2: 60f8 str r0, [r7, #12]
  32746. 800e4d4: 60b9 str r1, [r7, #8]
  32747. 800e4d6: 603b str r3, [r7, #0]
  32748. 800e4d8: 4613 mov r3, r2
  32749. 800e4da: 71fb strb r3, [r7, #7]
  32750. /* Wait until flag is set */
  32751. while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
  32752. 800e4dc: e04f b.n 800e57e <UART_WaitOnFlagUntilTimeout+0xb2>
  32753. {
  32754. /* Check for the Timeout */
  32755. if (Timeout != HAL_MAX_DELAY)
  32756. 800e4de: 69bb ldr r3, [r7, #24]
  32757. 800e4e0: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  32758. 800e4e4: d04b beq.n 800e57e <UART_WaitOnFlagUntilTimeout+0xb2>
  32759. {
  32760. if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
  32761. 800e4e6: f7f6 fda3 bl 8005030 <HAL_GetTick>
  32762. 800e4ea: 4602 mov r2, r0
  32763. 800e4ec: 683b ldr r3, [r7, #0]
  32764. 800e4ee: 1ad3 subs r3, r2, r3
  32765. 800e4f0: 69ba ldr r2, [r7, #24]
  32766. 800e4f2: 429a cmp r2, r3
  32767. 800e4f4: d302 bcc.n 800e4fc <UART_WaitOnFlagUntilTimeout+0x30>
  32768. 800e4f6: 69bb ldr r3, [r7, #24]
  32769. 800e4f8: 2b00 cmp r3, #0
  32770. 800e4fa: d101 bne.n 800e500 <UART_WaitOnFlagUntilTimeout+0x34>
  32771. {
  32772. return HAL_TIMEOUT;
  32773. 800e4fc: 2303 movs r3, #3
  32774. 800e4fe: e04e b.n 800e59e <UART_WaitOnFlagUntilTimeout+0xd2>
  32775. }
  32776. if ((READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) && (Flag != UART_FLAG_TXE) && (Flag != UART_FLAG_TC))
  32777. 800e500: 68fb ldr r3, [r7, #12]
  32778. 800e502: 681b ldr r3, [r3, #0]
  32779. 800e504: 681b ldr r3, [r3, #0]
  32780. 800e506: f003 0304 and.w r3, r3, #4
  32781. 800e50a: 2b00 cmp r3, #0
  32782. 800e50c: d037 beq.n 800e57e <UART_WaitOnFlagUntilTimeout+0xb2>
  32783. 800e50e: 68bb ldr r3, [r7, #8]
  32784. 800e510: 2b80 cmp r3, #128 @ 0x80
  32785. 800e512: d034 beq.n 800e57e <UART_WaitOnFlagUntilTimeout+0xb2>
  32786. 800e514: 68bb ldr r3, [r7, #8]
  32787. 800e516: 2b40 cmp r3, #64 @ 0x40
  32788. 800e518: d031 beq.n 800e57e <UART_WaitOnFlagUntilTimeout+0xb2>
  32789. {
  32790. if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) == SET)
  32791. 800e51a: 68fb ldr r3, [r7, #12]
  32792. 800e51c: 681b ldr r3, [r3, #0]
  32793. 800e51e: 69db ldr r3, [r3, #28]
  32794. 800e520: f003 0308 and.w r3, r3, #8
  32795. 800e524: 2b08 cmp r3, #8
  32796. 800e526: d110 bne.n 800e54a <UART_WaitOnFlagUntilTimeout+0x7e>
  32797. {
  32798. /* Clear Overrun Error flag*/
  32799. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
  32800. 800e528: 68fb ldr r3, [r7, #12]
  32801. 800e52a: 681b ldr r3, [r3, #0]
  32802. 800e52c: 2208 movs r2, #8
  32803. 800e52e: 621a str r2, [r3, #32]
  32804. /* Blocking error : transfer is aborted
  32805. Set the UART state ready to be able to start again the process,
  32806. Disable Rx Interrupts if ongoing */
  32807. UART_EndRxTransfer(huart);
  32808. 800e530: 68f8 ldr r0, [r7, #12]
  32809. 800e532: f000 f95b bl 800e7ec <UART_EndRxTransfer>
  32810. huart->ErrorCode = HAL_UART_ERROR_ORE;
  32811. 800e536: 68fb ldr r3, [r7, #12]
  32812. 800e538: 2208 movs r2, #8
  32813. 800e53a: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  32814. /* Process Unlocked */
  32815. __HAL_UNLOCK(huart);
  32816. 800e53e: 68fb ldr r3, [r7, #12]
  32817. 800e540: 2200 movs r2, #0
  32818. 800e542: f883 2084 strb.w r2, [r3, #132] @ 0x84
  32819. return HAL_ERROR;
  32820. 800e546: 2301 movs r3, #1
  32821. 800e548: e029 b.n 800e59e <UART_WaitOnFlagUntilTimeout+0xd2>
  32822. }
  32823. if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF) == SET)
  32824. 800e54a: 68fb ldr r3, [r7, #12]
  32825. 800e54c: 681b ldr r3, [r3, #0]
  32826. 800e54e: 69db ldr r3, [r3, #28]
  32827. 800e550: f403 6300 and.w r3, r3, #2048 @ 0x800
  32828. 800e554: f5b3 6f00 cmp.w r3, #2048 @ 0x800
  32829. 800e558: d111 bne.n 800e57e <UART_WaitOnFlagUntilTimeout+0xb2>
  32830. {
  32831. /* Clear Receiver Timeout flag*/
  32832. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF);
  32833. 800e55a: 68fb ldr r3, [r7, #12]
  32834. 800e55c: 681b ldr r3, [r3, #0]
  32835. 800e55e: f44f 6200 mov.w r2, #2048 @ 0x800
  32836. 800e562: 621a str r2, [r3, #32]
  32837. /* Blocking error : transfer is aborted
  32838. Set the UART state ready to be able to start again the process,
  32839. Disable Rx Interrupts if ongoing */
  32840. UART_EndRxTransfer(huart);
  32841. 800e564: 68f8 ldr r0, [r7, #12]
  32842. 800e566: f000 f941 bl 800e7ec <UART_EndRxTransfer>
  32843. huart->ErrorCode = HAL_UART_ERROR_RTO;
  32844. 800e56a: 68fb ldr r3, [r7, #12]
  32845. 800e56c: 2220 movs r2, #32
  32846. 800e56e: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  32847. /* Process Unlocked */
  32848. __HAL_UNLOCK(huart);
  32849. 800e572: 68fb ldr r3, [r7, #12]
  32850. 800e574: 2200 movs r2, #0
  32851. 800e576: f883 2084 strb.w r2, [r3, #132] @ 0x84
  32852. return HAL_TIMEOUT;
  32853. 800e57a: 2303 movs r3, #3
  32854. 800e57c: e00f b.n 800e59e <UART_WaitOnFlagUntilTimeout+0xd2>
  32855. while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
  32856. 800e57e: 68fb ldr r3, [r7, #12]
  32857. 800e580: 681b ldr r3, [r3, #0]
  32858. 800e582: 69da ldr r2, [r3, #28]
  32859. 800e584: 68bb ldr r3, [r7, #8]
  32860. 800e586: 4013 ands r3, r2
  32861. 800e588: 68ba ldr r2, [r7, #8]
  32862. 800e58a: 429a cmp r2, r3
  32863. 800e58c: bf0c ite eq
  32864. 800e58e: 2301 moveq r3, #1
  32865. 800e590: 2300 movne r3, #0
  32866. 800e592: b2db uxtb r3, r3
  32867. 800e594: 461a mov r2, r3
  32868. 800e596: 79fb ldrb r3, [r7, #7]
  32869. 800e598: 429a cmp r2, r3
  32870. 800e59a: d0a0 beq.n 800e4de <UART_WaitOnFlagUntilTimeout+0x12>
  32871. }
  32872. }
  32873. }
  32874. }
  32875. return HAL_OK;
  32876. 800e59c: 2300 movs r3, #0
  32877. }
  32878. 800e59e: 4618 mov r0, r3
  32879. 800e5a0: 3710 adds r7, #16
  32880. 800e5a2: 46bd mov sp, r7
  32881. 800e5a4: bd80 pop {r7, pc}
  32882. ...
  32883. 0800e5a8 <UART_Start_Receive_IT>:
  32884. * @param pData Pointer to data buffer (u8 or u16 data elements).
  32885. * @param Size Amount of data elements (u8 or u16) to be received.
  32886. * @retval HAL status
  32887. */
  32888. HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  32889. {
  32890. 800e5a8: b480 push {r7}
  32891. 800e5aa: b0a3 sub sp, #140 @ 0x8c
  32892. 800e5ac: af00 add r7, sp, #0
  32893. 800e5ae: 60f8 str r0, [r7, #12]
  32894. 800e5b0: 60b9 str r1, [r7, #8]
  32895. 800e5b2: 4613 mov r3, r2
  32896. 800e5b4: 80fb strh r3, [r7, #6]
  32897. huart->pRxBuffPtr = pData;
  32898. 800e5b6: 68fb ldr r3, [r7, #12]
  32899. 800e5b8: 68ba ldr r2, [r7, #8]
  32900. 800e5ba: 659a str r2, [r3, #88] @ 0x58
  32901. huart->RxXferSize = Size;
  32902. 800e5bc: 68fb ldr r3, [r7, #12]
  32903. 800e5be: 88fa ldrh r2, [r7, #6]
  32904. 800e5c0: f8a3 205c strh.w r2, [r3, #92] @ 0x5c
  32905. huart->RxXferCount = Size;
  32906. 800e5c4: 68fb ldr r3, [r7, #12]
  32907. 800e5c6: 88fa ldrh r2, [r7, #6]
  32908. 800e5c8: f8a3 205e strh.w r2, [r3, #94] @ 0x5e
  32909. huart->RxISR = NULL;
  32910. 800e5cc: 68fb ldr r3, [r7, #12]
  32911. 800e5ce: 2200 movs r2, #0
  32912. 800e5d0: 675a str r2, [r3, #116] @ 0x74
  32913. /* Computation of UART mask to apply to RDR register */
  32914. UART_MASK_COMPUTATION(huart);
  32915. 800e5d2: 68fb ldr r3, [r7, #12]
  32916. 800e5d4: 689b ldr r3, [r3, #8]
  32917. 800e5d6: f5b3 5f80 cmp.w r3, #4096 @ 0x1000
  32918. 800e5da: d10e bne.n 800e5fa <UART_Start_Receive_IT+0x52>
  32919. 800e5dc: 68fb ldr r3, [r7, #12]
  32920. 800e5de: 691b ldr r3, [r3, #16]
  32921. 800e5e0: 2b00 cmp r3, #0
  32922. 800e5e2: d105 bne.n 800e5f0 <UART_Start_Receive_IT+0x48>
  32923. 800e5e4: 68fb ldr r3, [r7, #12]
  32924. 800e5e6: f240 12ff movw r2, #511 @ 0x1ff
  32925. 800e5ea: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  32926. 800e5ee: e02d b.n 800e64c <UART_Start_Receive_IT+0xa4>
  32927. 800e5f0: 68fb ldr r3, [r7, #12]
  32928. 800e5f2: 22ff movs r2, #255 @ 0xff
  32929. 800e5f4: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  32930. 800e5f8: e028 b.n 800e64c <UART_Start_Receive_IT+0xa4>
  32931. 800e5fa: 68fb ldr r3, [r7, #12]
  32932. 800e5fc: 689b ldr r3, [r3, #8]
  32933. 800e5fe: 2b00 cmp r3, #0
  32934. 800e600: d10d bne.n 800e61e <UART_Start_Receive_IT+0x76>
  32935. 800e602: 68fb ldr r3, [r7, #12]
  32936. 800e604: 691b ldr r3, [r3, #16]
  32937. 800e606: 2b00 cmp r3, #0
  32938. 800e608: d104 bne.n 800e614 <UART_Start_Receive_IT+0x6c>
  32939. 800e60a: 68fb ldr r3, [r7, #12]
  32940. 800e60c: 22ff movs r2, #255 @ 0xff
  32941. 800e60e: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  32942. 800e612: e01b b.n 800e64c <UART_Start_Receive_IT+0xa4>
  32943. 800e614: 68fb ldr r3, [r7, #12]
  32944. 800e616: 227f movs r2, #127 @ 0x7f
  32945. 800e618: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  32946. 800e61c: e016 b.n 800e64c <UART_Start_Receive_IT+0xa4>
  32947. 800e61e: 68fb ldr r3, [r7, #12]
  32948. 800e620: 689b ldr r3, [r3, #8]
  32949. 800e622: f1b3 5f80 cmp.w r3, #268435456 @ 0x10000000
  32950. 800e626: d10d bne.n 800e644 <UART_Start_Receive_IT+0x9c>
  32951. 800e628: 68fb ldr r3, [r7, #12]
  32952. 800e62a: 691b ldr r3, [r3, #16]
  32953. 800e62c: 2b00 cmp r3, #0
  32954. 800e62e: d104 bne.n 800e63a <UART_Start_Receive_IT+0x92>
  32955. 800e630: 68fb ldr r3, [r7, #12]
  32956. 800e632: 227f movs r2, #127 @ 0x7f
  32957. 800e634: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  32958. 800e638: e008 b.n 800e64c <UART_Start_Receive_IT+0xa4>
  32959. 800e63a: 68fb ldr r3, [r7, #12]
  32960. 800e63c: 223f movs r2, #63 @ 0x3f
  32961. 800e63e: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  32962. 800e642: e003 b.n 800e64c <UART_Start_Receive_IT+0xa4>
  32963. 800e644: 68fb ldr r3, [r7, #12]
  32964. 800e646: 2200 movs r2, #0
  32965. 800e648: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  32966. huart->ErrorCode = HAL_UART_ERROR_NONE;
  32967. 800e64c: 68fb ldr r3, [r7, #12]
  32968. 800e64e: 2200 movs r2, #0
  32969. 800e650: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  32970. huart->RxState = HAL_UART_STATE_BUSY_RX;
  32971. 800e654: 68fb ldr r3, [r7, #12]
  32972. 800e656: 2222 movs r2, #34 @ 0x22
  32973. 800e658: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  32974. /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
  32975. ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
  32976. 800e65c: 68fb ldr r3, [r7, #12]
  32977. 800e65e: 681b ldr r3, [r3, #0]
  32978. 800e660: 3308 adds r3, #8
  32979. 800e662: 667b str r3, [r7, #100] @ 0x64
  32980. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  32981. 800e664: 6e7b ldr r3, [r7, #100] @ 0x64
  32982. 800e666: e853 3f00 ldrex r3, [r3]
  32983. 800e66a: 663b str r3, [r7, #96] @ 0x60
  32984. return(result);
  32985. 800e66c: 6e3b ldr r3, [r7, #96] @ 0x60
  32986. 800e66e: f043 0301 orr.w r3, r3, #1
  32987. 800e672: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  32988. 800e676: 68fb ldr r3, [r7, #12]
  32989. 800e678: 681b ldr r3, [r3, #0]
  32990. 800e67a: 3308 adds r3, #8
  32991. 800e67c: f8d7 2084 ldr.w r2, [r7, #132] @ 0x84
  32992. 800e680: 673a str r2, [r7, #112] @ 0x70
  32993. 800e682: 66fb str r3, [r7, #108] @ 0x6c
  32994. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  32995. 800e684: 6ef9 ldr r1, [r7, #108] @ 0x6c
  32996. 800e686: 6f3a ldr r2, [r7, #112] @ 0x70
  32997. 800e688: e841 2300 strex r3, r2, [r1]
  32998. 800e68c: 66bb str r3, [r7, #104] @ 0x68
  32999. return(result);
  33000. 800e68e: 6ebb ldr r3, [r7, #104] @ 0x68
  33001. 800e690: 2b00 cmp r3, #0
  33002. 800e692: d1e3 bne.n 800e65c <UART_Start_Receive_IT+0xb4>
  33003. /* Configure Rx interrupt processing */
  33004. if ((huart->FifoMode == UART_FIFOMODE_ENABLE) && (Size >= huart->NbRxDataToProcess))
  33005. 800e694: 68fb ldr r3, [r7, #12]
  33006. 800e696: 6e5b ldr r3, [r3, #100] @ 0x64
  33007. 800e698: f1b3 5f00 cmp.w r3, #536870912 @ 0x20000000
  33008. 800e69c: d14f bne.n 800e73e <UART_Start_Receive_IT+0x196>
  33009. 800e69e: 68fb ldr r3, [r7, #12]
  33010. 800e6a0: f8b3 3068 ldrh.w r3, [r3, #104] @ 0x68
  33011. 800e6a4: 88fa ldrh r2, [r7, #6]
  33012. 800e6a6: 429a cmp r2, r3
  33013. 800e6a8: d349 bcc.n 800e73e <UART_Start_Receive_IT+0x196>
  33014. {
  33015. /* Set the Rx ISR function pointer according to the data word length */
  33016. if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
  33017. 800e6aa: 68fb ldr r3, [r7, #12]
  33018. 800e6ac: 689b ldr r3, [r3, #8]
  33019. 800e6ae: f5b3 5f80 cmp.w r3, #4096 @ 0x1000
  33020. 800e6b2: d107 bne.n 800e6c4 <UART_Start_Receive_IT+0x11c>
  33021. 800e6b4: 68fb ldr r3, [r7, #12]
  33022. 800e6b6: 691b ldr r3, [r3, #16]
  33023. 800e6b8: 2b00 cmp r3, #0
  33024. 800e6ba: d103 bne.n 800e6c4 <UART_Start_Receive_IT+0x11c>
  33025. {
  33026. huart->RxISR = UART_RxISR_16BIT_FIFOEN;
  33027. 800e6bc: 68fb ldr r3, [r7, #12]
  33028. 800e6be: 4a47 ldr r2, [pc, #284] @ (800e7dc <UART_Start_Receive_IT+0x234>)
  33029. 800e6c0: 675a str r2, [r3, #116] @ 0x74
  33030. 800e6c2: e002 b.n 800e6ca <UART_Start_Receive_IT+0x122>
  33031. }
  33032. else
  33033. {
  33034. huart->RxISR = UART_RxISR_8BIT_FIFOEN;
  33035. 800e6c4: 68fb ldr r3, [r7, #12]
  33036. 800e6c6: 4a46 ldr r2, [pc, #280] @ (800e7e0 <UART_Start_Receive_IT+0x238>)
  33037. 800e6c8: 675a str r2, [r3, #116] @ 0x74
  33038. }
  33039. /* Enable the UART Parity Error interrupt and RX FIFO Threshold interrupt */
  33040. if (huart->Init.Parity != UART_PARITY_NONE)
  33041. 800e6ca: 68fb ldr r3, [r7, #12]
  33042. 800e6cc: 691b ldr r3, [r3, #16]
  33043. 800e6ce: 2b00 cmp r3, #0
  33044. 800e6d0: d01a beq.n 800e708 <UART_Start_Receive_IT+0x160>
  33045. {
  33046. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
  33047. 800e6d2: 68fb ldr r3, [r7, #12]
  33048. 800e6d4: 681b ldr r3, [r3, #0]
  33049. 800e6d6: 653b str r3, [r7, #80] @ 0x50
  33050. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33051. 800e6d8: 6d3b ldr r3, [r7, #80] @ 0x50
  33052. 800e6da: e853 3f00 ldrex r3, [r3]
  33053. 800e6de: 64fb str r3, [r7, #76] @ 0x4c
  33054. return(result);
  33055. 800e6e0: 6cfb ldr r3, [r7, #76] @ 0x4c
  33056. 800e6e2: f443 7380 orr.w r3, r3, #256 @ 0x100
  33057. 800e6e6: f8c7 3080 str.w r3, [r7, #128] @ 0x80
  33058. 800e6ea: 68fb ldr r3, [r7, #12]
  33059. 800e6ec: 681b ldr r3, [r3, #0]
  33060. 800e6ee: 461a mov r2, r3
  33061. 800e6f0: f8d7 3080 ldr.w r3, [r7, #128] @ 0x80
  33062. 800e6f4: 65fb str r3, [r7, #92] @ 0x5c
  33063. 800e6f6: 65ba str r2, [r7, #88] @ 0x58
  33064. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33065. 800e6f8: 6db9 ldr r1, [r7, #88] @ 0x58
  33066. 800e6fa: 6dfa ldr r2, [r7, #92] @ 0x5c
  33067. 800e6fc: e841 2300 strex r3, r2, [r1]
  33068. 800e700: 657b str r3, [r7, #84] @ 0x54
  33069. return(result);
  33070. 800e702: 6d7b ldr r3, [r7, #84] @ 0x54
  33071. 800e704: 2b00 cmp r3, #0
  33072. 800e706: d1e4 bne.n 800e6d2 <UART_Start_Receive_IT+0x12a>
  33073. }
  33074. ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);
  33075. 800e708: 68fb ldr r3, [r7, #12]
  33076. 800e70a: 681b ldr r3, [r3, #0]
  33077. 800e70c: 3308 adds r3, #8
  33078. 800e70e: 63fb str r3, [r7, #60] @ 0x3c
  33079. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33080. 800e710: 6bfb ldr r3, [r7, #60] @ 0x3c
  33081. 800e712: e853 3f00 ldrex r3, [r3]
  33082. 800e716: 63bb str r3, [r7, #56] @ 0x38
  33083. return(result);
  33084. 800e718: 6bbb ldr r3, [r7, #56] @ 0x38
  33085. 800e71a: f043 5380 orr.w r3, r3, #268435456 @ 0x10000000
  33086. 800e71e: 67fb str r3, [r7, #124] @ 0x7c
  33087. 800e720: 68fb ldr r3, [r7, #12]
  33088. 800e722: 681b ldr r3, [r3, #0]
  33089. 800e724: 3308 adds r3, #8
  33090. 800e726: 6ffa ldr r2, [r7, #124] @ 0x7c
  33091. 800e728: 64ba str r2, [r7, #72] @ 0x48
  33092. 800e72a: 647b str r3, [r7, #68] @ 0x44
  33093. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33094. 800e72c: 6c79 ldr r1, [r7, #68] @ 0x44
  33095. 800e72e: 6cba ldr r2, [r7, #72] @ 0x48
  33096. 800e730: e841 2300 strex r3, r2, [r1]
  33097. 800e734: 643b str r3, [r7, #64] @ 0x40
  33098. return(result);
  33099. 800e736: 6c3b ldr r3, [r7, #64] @ 0x40
  33100. 800e738: 2b00 cmp r3, #0
  33101. 800e73a: d1e5 bne.n 800e708 <UART_Start_Receive_IT+0x160>
  33102. 800e73c: e046 b.n 800e7cc <UART_Start_Receive_IT+0x224>
  33103. }
  33104. else
  33105. {
  33106. /* Set the Rx ISR function pointer according to the data word length */
  33107. if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
  33108. 800e73e: 68fb ldr r3, [r7, #12]
  33109. 800e740: 689b ldr r3, [r3, #8]
  33110. 800e742: f5b3 5f80 cmp.w r3, #4096 @ 0x1000
  33111. 800e746: d107 bne.n 800e758 <UART_Start_Receive_IT+0x1b0>
  33112. 800e748: 68fb ldr r3, [r7, #12]
  33113. 800e74a: 691b ldr r3, [r3, #16]
  33114. 800e74c: 2b00 cmp r3, #0
  33115. 800e74e: d103 bne.n 800e758 <UART_Start_Receive_IT+0x1b0>
  33116. {
  33117. huart->RxISR = UART_RxISR_16BIT;
  33118. 800e750: 68fb ldr r3, [r7, #12]
  33119. 800e752: 4a24 ldr r2, [pc, #144] @ (800e7e4 <UART_Start_Receive_IT+0x23c>)
  33120. 800e754: 675a str r2, [r3, #116] @ 0x74
  33121. 800e756: e002 b.n 800e75e <UART_Start_Receive_IT+0x1b6>
  33122. }
  33123. else
  33124. {
  33125. huart->RxISR = UART_RxISR_8BIT;
  33126. 800e758: 68fb ldr r3, [r7, #12]
  33127. 800e75a: 4a23 ldr r2, [pc, #140] @ (800e7e8 <UART_Start_Receive_IT+0x240>)
  33128. 800e75c: 675a str r2, [r3, #116] @ 0x74
  33129. }
  33130. /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */
  33131. if (huart->Init.Parity != UART_PARITY_NONE)
  33132. 800e75e: 68fb ldr r3, [r7, #12]
  33133. 800e760: 691b ldr r3, [r3, #16]
  33134. 800e762: 2b00 cmp r3, #0
  33135. 800e764: d019 beq.n 800e79a <UART_Start_Receive_IT+0x1f2>
  33136. {
  33137. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
  33138. 800e766: 68fb ldr r3, [r7, #12]
  33139. 800e768: 681b ldr r3, [r3, #0]
  33140. 800e76a: 62bb str r3, [r7, #40] @ 0x28
  33141. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33142. 800e76c: 6abb ldr r3, [r7, #40] @ 0x28
  33143. 800e76e: e853 3f00 ldrex r3, [r3]
  33144. 800e772: 627b str r3, [r7, #36] @ 0x24
  33145. return(result);
  33146. 800e774: 6a7b ldr r3, [r7, #36] @ 0x24
  33147. 800e776: f443 7390 orr.w r3, r3, #288 @ 0x120
  33148. 800e77a: 677b str r3, [r7, #116] @ 0x74
  33149. 800e77c: 68fb ldr r3, [r7, #12]
  33150. 800e77e: 681b ldr r3, [r3, #0]
  33151. 800e780: 461a mov r2, r3
  33152. 800e782: 6f7b ldr r3, [r7, #116] @ 0x74
  33153. 800e784: 637b str r3, [r7, #52] @ 0x34
  33154. 800e786: 633a str r2, [r7, #48] @ 0x30
  33155. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33156. 800e788: 6b39 ldr r1, [r7, #48] @ 0x30
  33157. 800e78a: 6b7a ldr r2, [r7, #52] @ 0x34
  33158. 800e78c: e841 2300 strex r3, r2, [r1]
  33159. 800e790: 62fb str r3, [r7, #44] @ 0x2c
  33160. return(result);
  33161. 800e792: 6afb ldr r3, [r7, #44] @ 0x2c
  33162. 800e794: 2b00 cmp r3, #0
  33163. 800e796: d1e6 bne.n 800e766 <UART_Start_Receive_IT+0x1be>
  33164. 800e798: e018 b.n 800e7cc <UART_Start_Receive_IT+0x224>
  33165. }
  33166. else
  33167. {
  33168. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
  33169. 800e79a: 68fb ldr r3, [r7, #12]
  33170. 800e79c: 681b ldr r3, [r3, #0]
  33171. 800e79e: 617b str r3, [r7, #20]
  33172. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33173. 800e7a0: 697b ldr r3, [r7, #20]
  33174. 800e7a2: e853 3f00 ldrex r3, [r3]
  33175. 800e7a6: 613b str r3, [r7, #16]
  33176. return(result);
  33177. 800e7a8: 693b ldr r3, [r7, #16]
  33178. 800e7aa: f043 0320 orr.w r3, r3, #32
  33179. 800e7ae: 67bb str r3, [r7, #120] @ 0x78
  33180. 800e7b0: 68fb ldr r3, [r7, #12]
  33181. 800e7b2: 681b ldr r3, [r3, #0]
  33182. 800e7b4: 461a mov r2, r3
  33183. 800e7b6: 6fbb ldr r3, [r7, #120] @ 0x78
  33184. 800e7b8: 623b str r3, [r7, #32]
  33185. 800e7ba: 61fa str r2, [r7, #28]
  33186. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33187. 800e7bc: 69f9 ldr r1, [r7, #28]
  33188. 800e7be: 6a3a ldr r2, [r7, #32]
  33189. 800e7c0: e841 2300 strex r3, r2, [r1]
  33190. 800e7c4: 61bb str r3, [r7, #24]
  33191. return(result);
  33192. 800e7c6: 69bb ldr r3, [r7, #24]
  33193. 800e7c8: 2b00 cmp r3, #0
  33194. 800e7ca: d1e6 bne.n 800e79a <UART_Start_Receive_IT+0x1f2>
  33195. }
  33196. }
  33197. return HAL_OK;
  33198. 800e7cc: 2300 movs r3, #0
  33199. }
  33200. 800e7ce: 4618 mov r0, r3
  33201. 800e7d0: 378c adds r7, #140 @ 0x8c
  33202. 800e7d2: 46bd mov sp, r7
  33203. 800e7d4: f85d 7b04 ldr.w r7, [sp], #4
  33204. 800e7d8: 4770 bx lr
  33205. 800e7da: bf00 nop
  33206. 800e7dc: 0800f351 .word 0x0800f351
  33207. 800e7e0: 0800eff1 .word 0x0800eff1
  33208. 800e7e4: 0800ee39 .word 0x0800ee39
  33209. 800e7e8: 0800ec81 .word 0x0800ec81
  33210. 0800e7ec <UART_EndRxTransfer>:
  33211. * @brief End ongoing Rx transfer on UART peripheral (following error detection or Reception completion).
  33212. * @param huart UART handle.
  33213. * @retval None
  33214. */
  33215. static void UART_EndRxTransfer(UART_HandleTypeDef *huart)
  33216. {
  33217. 800e7ec: b480 push {r7}
  33218. 800e7ee: b095 sub sp, #84 @ 0x54
  33219. 800e7f0: af00 add r7, sp, #0
  33220. 800e7f2: 6078 str r0, [r7, #4]
  33221. /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
  33222. ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
  33223. 800e7f4: 687b ldr r3, [r7, #4]
  33224. 800e7f6: 681b ldr r3, [r3, #0]
  33225. 800e7f8: 637b str r3, [r7, #52] @ 0x34
  33226. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33227. 800e7fa: 6b7b ldr r3, [r7, #52] @ 0x34
  33228. 800e7fc: e853 3f00 ldrex r3, [r3]
  33229. 800e800: 633b str r3, [r7, #48] @ 0x30
  33230. return(result);
  33231. 800e802: 6b3b ldr r3, [r7, #48] @ 0x30
  33232. 800e804: f423 7390 bic.w r3, r3, #288 @ 0x120
  33233. 800e808: 64fb str r3, [r7, #76] @ 0x4c
  33234. 800e80a: 687b ldr r3, [r7, #4]
  33235. 800e80c: 681b ldr r3, [r3, #0]
  33236. 800e80e: 461a mov r2, r3
  33237. 800e810: 6cfb ldr r3, [r7, #76] @ 0x4c
  33238. 800e812: 643b str r3, [r7, #64] @ 0x40
  33239. 800e814: 63fa str r2, [r7, #60] @ 0x3c
  33240. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33241. 800e816: 6bf9 ldr r1, [r7, #60] @ 0x3c
  33242. 800e818: 6c3a ldr r2, [r7, #64] @ 0x40
  33243. 800e81a: e841 2300 strex r3, r2, [r1]
  33244. 800e81e: 63bb str r3, [r7, #56] @ 0x38
  33245. return(result);
  33246. 800e820: 6bbb ldr r3, [r7, #56] @ 0x38
  33247. 800e822: 2b00 cmp r3, #0
  33248. 800e824: d1e6 bne.n 800e7f4 <UART_EndRxTransfer+0x8>
  33249. ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
  33250. 800e826: 687b ldr r3, [r7, #4]
  33251. 800e828: 681b ldr r3, [r3, #0]
  33252. 800e82a: 3308 adds r3, #8
  33253. 800e82c: 623b str r3, [r7, #32]
  33254. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33255. 800e82e: 6a3b ldr r3, [r7, #32]
  33256. 800e830: e853 3f00 ldrex r3, [r3]
  33257. 800e834: 61fb str r3, [r7, #28]
  33258. return(result);
  33259. 800e836: 69fa ldr r2, [r7, #28]
  33260. 800e838: 4b1e ldr r3, [pc, #120] @ (800e8b4 <UART_EndRxTransfer+0xc8>)
  33261. 800e83a: 4013 ands r3, r2
  33262. 800e83c: 64bb str r3, [r7, #72] @ 0x48
  33263. 800e83e: 687b ldr r3, [r7, #4]
  33264. 800e840: 681b ldr r3, [r3, #0]
  33265. 800e842: 3308 adds r3, #8
  33266. 800e844: 6cba ldr r2, [r7, #72] @ 0x48
  33267. 800e846: 62fa str r2, [r7, #44] @ 0x2c
  33268. 800e848: 62bb str r3, [r7, #40] @ 0x28
  33269. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33270. 800e84a: 6ab9 ldr r1, [r7, #40] @ 0x28
  33271. 800e84c: 6afa ldr r2, [r7, #44] @ 0x2c
  33272. 800e84e: e841 2300 strex r3, r2, [r1]
  33273. 800e852: 627b str r3, [r7, #36] @ 0x24
  33274. return(result);
  33275. 800e854: 6a7b ldr r3, [r7, #36] @ 0x24
  33276. 800e856: 2b00 cmp r3, #0
  33277. 800e858: d1e5 bne.n 800e826 <UART_EndRxTransfer+0x3a>
  33278. /* In case of reception waiting for IDLE event, disable also the IDLE IE interrupt source */
  33279. if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
  33280. 800e85a: 687b ldr r3, [r7, #4]
  33281. 800e85c: 6edb ldr r3, [r3, #108] @ 0x6c
  33282. 800e85e: 2b01 cmp r3, #1
  33283. 800e860: d118 bne.n 800e894 <UART_EndRxTransfer+0xa8>
  33284. {
  33285. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
  33286. 800e862: 687b ldr r3, [r7, #4]
  33287. 800e864: 681b ldr r3, [r3, #0]
  33288. 800e866: 60fb str r3, [r7, #12]
  33289. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33290. 800e868: 68fb ldr r3, [r7, #12]
  33291. 800e86a: e853 3f00 ldrex r3, [r3]
  33292. 800e86e: 60bb str r3, [r7, #8]
  33293. return(result);
  33294. 800e870: 68bb ldr r3, [r7, #8]
  33295. 800e872: f023 0310 bic.w r3, r3, #16
  33296. 800e876: 647b str r3, [r7, #68] @ 0x44
  33297. 800e878: 687b ldr r3, [r7, #4]
  33298. 800e87a: 681b ldr r3, [r3, #0]
  33299. 800e87c: 461a mov r2, r3
  33300. 800e87e: 6c7b ldr r3, [r7, #68] @ 0x44
  33301. 800e880: 61bb str r3, [r7, #24]
  33302. 800e882: 617a str r2, [r7, #20]
  33303. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33304. 800e884: 6979 ldr r1, [r7, #20]
  33305. 800e886: 69ba ldr r2, [r7, #24]
  33306. 800e888: e841 2300 strex r3, r2, [r1]
  33307. 800e88c: 613b str r3, [r7, #16]
  33308. return(result);
  33309. 800e88e: 693b ldr r3, [r7, #16]
  33310. 800e890: 2b00 cmp r3, #0
  33311. 800e892: d1e6 bne.n 800e862 <UART_EndRxTransfer+0x76>
  33312. }
  33313. /* At end of Rx process, restore huart->RxState to Ready */
  33314. huart->RxState = HAL_UART_STATE_READY;
  33315. 800e894: 687b ldr r3, [r7, #4]
  33316. 800e896: 2220 movs r2, #32
  33317. 800e898: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  33318. huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;
  33319. 800e89c: 687b ldr r3, [r7, #4]
  33320. 800e89e: 2200 movs r2, #0
  33321. 800e8a0: 66da str r2, [r3, #108] @ 0x6c
  33322. /* Reset RxIsr function pointer */
  33323. huart->RxISR = NULL;
  33324. 800e8a2: 687b ldr r3, [r7, #4]
  33325. 800e8a4: 2200 movs r2, #0
  33326. 800e8a6: 675a str r2, [r3, #116] @ 0x74
  33327. }
  33328. 800e8a8: bf00 nop
  33329. 800e8aa: 3754 adds r7, #84 @ 0x54
  33330. 800e8ac: 46bd mov sp, r7
  33331. 800e8ae: f85d 7b04 ldr.w r7, [sp], #4
  33332. 800e8b2: 4770 bx lr
  33333. 800e8b4: effffffe .word 0xeffffffe
  33334. 0800e8b8 <UART_DMAAbortOnError>:
  33335. * (To be called at end of DMA Abort procedure following error occurrence).
  33336. * @param hdma DMA handle.
  33337. * @retval None
  33338. */
  33339. static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma)
  33340. {
  33341. 800e8b8: b580 push {r7, lr}
  33342. 800e8ba: b084 sub sp, #16
  33343. 800e8bc: af00 add r7, sp, #0
  33344. 800e8be: 6078 str r0, [r7, #4]
  33345. UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
  33346. 800e8c0: 687b ldr r3, [r7, #4]
  33347. 800e8c2: 6b9b ldr r3, [r3, #56] @ 0x38
  33348. 800e8c4: 60fb str r3, [r7, #12]
  33349. huart->RxXferCount = 0U;
  33350. 800e8c6: 68fb ldr r3, [r7, #12]
  33351. 800e8c8: 2200 movs r2, #0
  33352. 800e8ca: f8a3 205e strh.w r2, [r3, #94] @ 0x5e
  33353. huart->TxXferCount = 0U;
  33354. 800e8ce: 68fb ldr r3, [r7, #12]
  33355. 800e8d0: 2200 movs r2, #0
  33356. 800e8d2: f8a3 2056 strh.w r2, [r3, #86] @ 0x56
  33357. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  33358. /*Call registered error callback*/
  33359. huart->ErrorCallback(huart);
  33360. #else
  33361. /*Call legacy weak error callback*/
  33362. HAL_UART_ErrorCallback(huart);
  33363. 800e8d6: 68f8 ldr r0, [r7, #12]
  33364. 800e8d8: f7fe ff3a bl 800d750 <HAL_UART_ErrorCallback>
  33365. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
  33366. }
  33367. 800e8dc: bf00 nop
  33368. 800e8de: 3710 adds r7, #16
  33369. 800e8e0: 46bd mov sp, r7
  33370. 800e8e2: bd80 pop {r7, pc}
  33371. 0800e8e4 <UART_TxISR_8BIT>:
  33372. * interruptions have been enabled by HAL_UART_Transmit_IT().
  33373. * @param huart UART handle.
  33374. * @retval None
  33375. */
  33376. static void UART_TxISR_8BIT(UART_HandleTypeDef *huart)
  33377. {
  33378. 800e8e4: b480 push {r7}
  33379. 800e8e6: b08f sub sp, #60 @ 0x3c
  33380. 800e8e8: af00 add r7, sp, #0
  33381. 800e8ea: 6078 str r0, [r7, #4]
  33382. /* Check that a Tx process is ongoing */
  33383. if (huart->gState == HAL_UART_STATE_BUSY_TX)
  33384. 800e8ec: 687b ldr r3, [r7, #4]
  33385. 800e8ee: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  33386. 800e8f2: 2b21 cmp r3, #33 @ 0x21
  33387. 800e8f4: d14c bne.n 800e990 <UART_TxISR_8BIT+0xac>
  33388. {
  33389. if (huart->TxXferCount == 0U)
  33390. 800e8f6: 687b ldr r3, [r7, #4]
  33391. 800e8f8: f8b3 3056 ldrh.w r3, [r3, #86] @ 0x56
  33392. 800e8fc: b29b uxth r3, r3
  33393. 800e8fe: 2b00 cmp r3, #0
  33394. 800e900: d132 bne.n 800e968 <UART_TxISR_8BIT+0x84>
  33395. {
  33396. /* Disable the UART Transmit Data Register Empty Interrupt */
  33397. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
  33398. 800e902: 687b ldr r3, [r7, #4]
  33399. 800e904: 681b ldr r3, [r3, #0]
  33400. 800e906: 623b str r3, [r7, #32]
  33401. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33402. 800e908: 6a3b ldr r3, [r7, #32]
  33403. 800e90a: e853 3f00 ldrex r3, [r3]
  33404. 800e90e: 61fb str r3, [r7, #28]
  33405. return(result);
  33406. 800e910: 69fb ldr r3, [r7, #28]
  33407. 800e912: f023 0380 bic.w r3, r3, #128 @ 0x80
  33408. 800e916: 637b str r3, [r7, #52] @ 0x34
  33409. 800e918: 687b ldr r3, [r7, #4]
  33410. 800e91a: 681b ldr r3, [r3, #0]
  33411. 800e91c: 461a mov r2, r3
  33412. 800e91e: 6b7b ldr r3, [r7, #52] @ 0x34
  33413. 800e920: 62fb str r3, [r7, #44] @ 0x2c
  33414. 800e922: 62ba str r2, [r7, #40] @ 0x28
  33415. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33416. 800e924: 6ab9 ldr r1, [r7, #40] @ 0x28
  33417. 800e926: 6afa ldr r2, [r7, #44] @ 0x2c
  33418. 800e928: e841 2300 strex r3, r2, [r1]
  33419. 800e92c: 627b str r3, [r7, #36] @ 0x24
  33420. return(result);
  33421. 800e92e: 6a7b ldr r3, [r7, #36] @ 0x24
  33422. 800e930: 2b00 cmp r3, #0
  33423. 800e932: d1e6 bne.n 800e902 <UART_TxISR_8BIT+0x1e>
  33424. /* Enable the UART Transmit Complete Interrupt */
  33425. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
  33426. 800e934: 687b ldr r3, [r7, #4]
  33427. 800e936: 681b ldr r3, [r3, #0]
  33428. 800e938: 60fb str r3, [r7, #12]
  33429. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33430. 800e93a: 68fb ldr r3, [r7, #12]
  33431. 800e93c: e853 3f00 ldrex r3, [r3]
  33432. 800e940: 60bb str r3, [r7, #8]
  33433. return(result);
  33434. 800e942: 68bb ldr r3, [r7, #8]
  33435. 800e944: f043 0340 orr.w r3, r3, #64 @ 0x40
  33436. 800e948: 633b str r3, [r7, #48] @ 0x30
  33437. 800e94a: 687b ldr r3, [r7, #4]
  33438. 800e94c: 681b ldr r3, [r3, #0]
  33439. 800e94e: 461a mov r2, r3
  33440. 800e950: 6b3b ldr r3, [r7, #48] @ 0x30
  33441. 800e952: 61bb str r3, [r7, #24]
  33442. 800e954: 617a str r2, [r7, #20]
  33443. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33444. 800e956: 6979 ldr r1, [r7, #20]
  33445. 800e958: 69ba ldr r2, [r7, #24]
  33446. 800e95a: e841 2300 strex r3, r2, [r1]
  33447. 800e95e: 613b str r3, [r7, #16]
  33448. return(result);
  33449. 800e960: 693b ldr r3, [r7, #16]
  33450. 800e962: 2b00 cmp r3, #0
  33451. 800e964: d1e6 bne.n 800e934 <UART_TxISR_8BIT+0x50>
  33452. huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);
  33453. huart->pTxBuffPtr++;
  33454. huart->TxXferCount--;
  33455. }
  33456. }
  33457. }
  33458. 800e966: e013 b.n 800e990 <UART_TxISR_8BIT+0xac>
  33459. huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);
  33460. 800e968: 687b ldr r3, [r7, #4]
  33461. 800e96a: 6d1b ldr r3, [r3, #80] @ 0x50
  33462. 800e96c: 781a ldrb r2, [r3, #0]
  33463. 800e96e: 687b ldr r3, [r7, #4]
  33464. 800e970: 681b ldr r3, [r3, #0]
  33465. 800e972: 629a str r2, [r3, #40] @ 0x28
  33466. huart->pTxBuffPtr++;
  33467. 800e974: 687b ldr r3, [r7, #4]
  33468. 800e976: 6d1b ldr r3, [r3, #80] @ 0x50
  33469. 800e978: 1c5a adds r2, r3, #1
  33470. 800e97a: 687b ldr r3, [r7, #4]
  33471. 800e97c: 651a str r2, [r3, #80] @ 0x50
  33472. huart->TxXferCount--;
  33473. 800e97e: 687b ldr r3, [r7, #4]
  33474. 800e980: f8b3 3056 ldrh.w r3, [r3, #86] @ 0x56
  33475. 800e984: b29b uxth r3, r3
  33476. 800e986: 3b01 subs r3, #1
  33477. 800e988: b29a uxth r2, r3
  33478. 800e98a: 687b ldr r3, [r7, #4]
  33479. 800e98c: f8a3 2056 strh.w r2, [r3, #86] @ 0x56
  33480. }
  33481. 800e990: bf00 nop
  33482. 800e992: 373c adds r7, #60 @ 0x3c
  33483. 800e994: 46bd mov sp, r7
  33484. 800e996: f85d 7b04 ldr.w r7, [sp], #4
  33485. 800e99a: 4770 bx lr
  33486. 0800e99c <UART_TxISR_16BIT>:
  33487. * interruptions have been enabled by HAL_UART_Transmit_IT().
  33488. * @param huart UART handle.
  33489. * @retval None
  33490. */
  33491. static void UART_TxISR_16BIT(UART_HandleTypeDef *huart)
  33492. {
  33493. 800e99c: b480 push {r7}
  33494. 800e99e: b091 sub sp, #68 @ 0x44
  33495. 800e9a0: af00 add r7, sp, #0
  33496. 800e9a2: 6078 str r0, [r7, #4]
  33497. const uint16_t *tmp;
  33498. /* Check that a Tx process is ongoing */
  33499. if (huart->gState == HAL_UART_STATE_BUSY_TX)
  33500. 800e9a4: 687b ldr r3, [r7, #4]
  33501. 800e9a6: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  33502. 800e9aa: 2b21 cmp r3, #33 @ 0x21
  33503. 800e9ac: d151 bne.n 800ea52 <UART_TxISR_16BIT+0xb6>
  33504. {
  33505. if (huart->TxXferCount == 0U)
  33506. 800e9ae: 687b ldr r3, [r7, #4]
  33507. 800e9b0: f8b3 3056 ldrh.w r3, [r3, #86] @ 0x56
  33508. 800e9b4: b29b uxth r3, r3
  33509. 800e9b6: 2b00 cmp r3, #0
  33510. 800e9b8: d132 bne.n 800ea20 <UART_TxISR_16BIT+0x84>
  33511. {
  33512. /* Disable the UART Transmit Data Register Empty Interrupt */
  33513. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
  33514. 800e9ba: 687b ldr r3, [r7, #4]
  33515. 800e9bc: 681b ldr r3, [r3, #0]
  33516. 800e9be: 627b str r3, [r7, #36] @ 0x24
  33517. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33518. 800e9c0: 6a7b ldr r3, [r7, #36] @ 0x24
  33519. 800e9c2: e853 3f00 ldrex r3, [r3]
  33520. 800e9c6: 623b str r3, [r7, #32]
  33521. return(result);
  33522. 800e9c8: 6a3b ldr r3, [r7, #32]
  33523. 800e9ca: f023 0380 bic.w r3, r3, #128 @ 0x80
  33524. 800e9ce: 63bb str r3, [r7, #56] @ 0x38
  33525. 800e9d0: 687b ldr r3, [r7, #4]
  33526. 800e9d2: 681b ldr r3, [r3, #0]
  33527. 800e9d4: 461a mov r2, r3
  33528. 800e9d6: 6bbb ldr r3, [r7, #56] @ 0x38
  33529. 800e9d8: 633b str r3, [r7, #48] @ 0x30
  33530. 800e9da: 62fa str r2, [r7, #44] @ 0x2c
  33531. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33532. 800e9dc: 6af9 ldr r1, [r7, #44] @ 0x2c
  33533. 800e9de: 6b3a ldr r2, [r7, #48] @ 0x30
  33534. 800e9e0: e841 2300 strex r3, r2, [r1]
  33535. 800e9e4: 62bb str r3, [r7, #40] @ 0x28
  33536. return(result);
  33537. 800e9e6: 6abb ldr r3, [r7, #40] @ 0x28
  33538. 800e9e8: 2b00 cmp r3, #0
  33539. 800e9ea: d1e6 bne.n 800e9ba <UART_TxISR_16BIT+0x1e>
  33540. /* Enable the UART Transmit Complete Interrupt */
  33541. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
  33542. 800e9ec: 687b ldr r3, [r7, #4]
  33543. 800e9ee: 681b ldr r3, [r3, #0]
  33544. 800e9f0: 613b str r3, [r7, #16]
  33545. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33546. 800e9f2: 693b ldr r3, [r7, #16]
  33547. 800e9f4: e853 3f00 ldrex r3, [r3]
  33548. 800e9f8: 60fb str r3, [r7, #12]
  33549. return(result);
  33550. 800e9fa: 68fb ldr r3, [r7, #12]
  33551. 800e9fc: f043 0340 orr.w r3, r3, #64 @ 0x40
  33552. 800ea00: 637b str r3, [r7, #52] @ 0x34
  33553. 800ea02: 687b ldr r3, [r7, #4]
  33554. 800ea04: 681b ldr r3, [r3, #0]
  33555. 800ea06: 461a mov r2, r3
  33556. 800ea08: 6b7b ldr r3, [r7, #52] @ 0x34
  33557. 800ea0a: 61fb str r3, [r7, #28]
  33558. 800ea0c: 61ba str r2, [r7, #24]
  33559. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33560. 800ea0e: 69b9 ldr r1, [r7, #24]
  33561. 800ea10: 69fa ldr r2, [r7, #28]
  33562. 800ea12: e841 2300 strex r3, r2, [r1]
  33563. 800ea16: 617b str r3, [r7, #20]
  33564. return(result);
  33565. 800ea18: 697b ldr r3, [r7, #20]
  33566. 800ea1a: 2b00 cmp r3, #0
  33567. 800ea1c: d1e6 bne.n 800e9ec <UART_TxISR_16BIT+0x50>
  33568. huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL);
  33569. huart->pTxBuffPtr += 2U;
  33570. huart->TxXferCount--;
  33571. }
  33572. }
  33573. }
  33574. 800ea1e: e018 b.n 800ea52 <UART_TxISR_16BIT+0xb6>
  33575. tmp = (const uint16_t *) huart->pTxBuffPtr;
  33576. 800ea20: 687b ldr r3, [r7, #4]
  33577. 800ea22: 6d1b ldr r3, [r3, #80] @ 0x50
  33578. 800ea24: 63fb str r3, [r7, #60] @ 0x3c
  33579. huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL);
  33580. 800ea26: 6bfb ldr r3, [r7, #60] @ 0x3c
  33581. 800ea28: 881b ldrh r3, [r3, #0]
  33582. 800ea2a: 461a mov r2, r3
  33583. 800ea2c: 687b ldr r3, [r7, #4]
  33584. 800ea2e: 681b ldr r3, [r3, #0]
  33585. 800ea30: f3c2 0208 ubfx r2, r2, #0, #9
  33586. 800ea34: 629a str r2, [r3, #40] @ 0x28
  33587. huart->pTxBuffPtr += 2U;
  33588. 800ea36: 687b ldr r3, [r7, #4]
  33589. 800ea38: 6d1b ldr r3, [r3, #80] @ 0x50
  33590. 800ea3a: 1c9a adds r2, r3, #2
  33591. 800ea3c: 687b ldr r3, [r7, #4]
  33592. 800ea3e: 651a str r2, [r3, #80] @ 0x50
  33593. huart->TxXferCount--;
  33594. 800ea40: 687b ldr r3, [r7, #4]
  33595. 800ea42: f8b3 3056 ldrh.w r3, [r3, #86] @ 0x56
  33596. 800ea46: b29b uxth r3, r3
  33597. 800ea48: 3b01 subs r3, #1
  33598. 800ea4a: b29a uxth r2, r3
  33599. 800ea4c: 687b ldr r3, [r7, #4]
  33600. 800ea4e: f8a3 2056 strh.w r2, [r3, #86] @ 0x56
  33601. }
  33602. 800ea52: bf00 nop
  33603. 800ea54: 3744 adds r7, #68 @ 0x44
  33604. 800ea56: 46bd mov sp, r7
  33605. 800ea58: f85d 7b04 ldr.w r7, [sp], #4
  33606. 800ea5c: 4770 bx lr
  33607. 0800ea5e <UART_TxISR_8BIT_FIFOEN>:
  33608. * interruptions have been enabled by HAL_UART_Transmit_IT().
  33609. * @param huart UART handle.
  33610. * @retval None
  33611. */
  33612. static void UART_TxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart)
  33613. {
  33614. 800ea5e: b480 push {r7}
  33615. 800ea60: b091 sub sp, #68 @ 0x44
  33616. 800ea62: af00 add r7, sp, #0
  33617. 800ea64: 6078 str r0, [r7, #4]
  33618. uint16_t nb_tx_data;
  33619. /* Check that a Tx process is ongoing */
  33620. if (huart->gState == HAL_UART_STATE_BUSY_TX)
  33621. 800ea66: 687b ldr r3, [r7, #4]
  33622. 800ea68: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  33623. 800ea6c: 2b21 cmp r3, #33 @ 0x21
  33624. 800ea6e: d160 bne.n 800eb32 <UART_TxISR_8BIT_FIFOEN+0xd4>
  33625. {
  33626. for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
  33627. 800ea70: 687b ldr r3, [r7, #4]
  33628. 800ea72: f8b3 306a ldrh.w r3, [r3, #106] @ 0x6a
  33629. 800ea76: 87fb strh r3, [r7, #62] @ 0x3e
  33630. 800ea78: e057 b.n 800eb2a <UART_TxISR_8BIT_FIFOEN+0xcc>
  33631. {
  33632. if (huart->TxXferCount == 0U)
  33633. 800ea7a: 687b ldr r3, [r7, #4]
  33634. 800ea7c: f8b3 3056 ldrh.w r3, [r3, #86] @ 0x56
  33635. 800ea80: b29b uxth r3, r3
  33636. 800ea82: 2b00 cmp r3, #0
  33637. 800ea84: d133 bne.n 800eaee <UART_TxISR_8BIT_FIFOEN+0x90>
  33638. {
  33639. /* Disable the TX FIFO threshold interrupt */
  33640. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
  33641. 800ea86: 687b ldr r3, [r7, #4]
  33642. 800ea88: 681b ldr r3, [r3, #0]
  33643. 800ea8a: 3308 adds r3, #8
  33644. 800ea8c: 627b str r3, [r7, #36] @ 0x24
  33645. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33646. 800ea8e: 6a7b ldr r3, [r7, #36] @ 0x24
  33647. 800ea90: e853 3f00 ldrex r3, [r3]
  33648. 800ea94: 623b str r3, [r7, #32]
  33649. return(result);
  33650. 800ea96: 6a3b ldr r3, [r7, #32]
  33651. 800ea98: f423 0300 bic.w r3, r3, #8388608 @ 0x800000
  33652. 800ea9c: 63bb str r3, [r7, #56] @ 0x38
  33653. 800ea9e: 687b ldr r3, [r7, #4]
  33654. 800eaa0: 681b ldr r3, [r3, #0]
  33655. 800eaa2: 3308 adds r3, #8
  33656. 800eaa4: 6bba ldr r2, [r7, #56] @ 0x38
  33657. 800eaa6: 633a str r2, [r7, #48] @ 0x30
  33658. 800eaa8: 62fb str r3, [r7, #44] @ 0x2c
  33659. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33660. 800eaaa: 6af9 ldr r1, [r7, #44] @ 0x2c
  33661. 800eaac: 6b3a ldr r2, [r7, #48] @ 0x30
  33662. 800eaae: e841 2300 strex r3, r2, [r1]
  33663. 800eab2: 62bb str r3, [r7, #40] @ 0x28
  33664. return(result);
  33665. 800eab4: 6abb ldr r3, [r7, #40] @ 0x28
  33666. 800eab6: 2b00 cmp r3, #0
  33667. 800eab8: d1e5 bne.n 800ea86 <UART_TxISR_8BIT_FIFOEN+0x28>
  33668. /* Enable the UART Transmit Complete Interrupt */
  33669. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
  33670. 800eaba: 687b ldr r3, [r7, #4]
  33671. 800eabc: 681b ldr r3, [r3, #0]
  33672. 800eabe: 613b str r3, [r7, #16]
  33673. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33674. 800eac0: 693b ldr r3, [r7, #16]
  33675. 800eac2: e853 3f00 ldrex r3, [r3]
  33676. 800eac6: 60fb str r3, [r7, #12]
  33677. return(result);
  33678. 800eac8: 68fb ldr r3, [r7, #12]
  33679. 800eaca: f043 0340 orr.w r3, r3, #64 @ 0x40
  33680. 800eace: 637b str r3, [r7, #52] @ 0x34
  33681. 800ead0: 687b ldr r3, [r7, #4]
  33682. 800ead2: 681b ldr r3, [r3, #0]
  33683. 800ead4: 461a mov r2, r3
  33684. 800ead6: 6b7b ldr r3, [r7, #52] @ 0x34
  33685. 800ead8: 61fb str r3, [r7, #28]
  33686. 800eada: 61ba str r2, [r7, #24]
  33687. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33688. 800eadc: 69b9 ldr r1, [r7, #24]
  33689. 800eade: 69fa ldr r2, [r7, #28]
  33690. 800eae0: e841 2300 strex r3, r2, [r1]
  33691. 800eae4: 617b str r3, [r7, #20]
  33692. return(result);
  33693. 800eae6: 697b ldr r3, [r7, #20]
  33694. 800eae8: 2b00 cmp r3, #0
  33695. 800eaea: d1e6 bne.n 800eaba <UART_TxISR_8BIT_FIFOEN+0x5c>
  33696. break; /* force exit loop */
  33697. 800eaec: e021 b.n 800eb32 <UART_TxISR_8BIT_FIFOEN+0xd4>
  33698. }
  33699. else if (READ_BIT(huart->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U)
  33700. 800eaee: 687b ldr r3, [r7, #4]
  33701. 800eaf0: 681b ldr r3, [r3, #0]
  33702. 800eaf2: 69db ldr r3, [r3, #28]
  33703. 800eaf4: f003 0380 and.w r3, r3, #128 @ 0x80
  33704. 800eaf8: 2b00 cmp r3, #0
  33705. 800eafa: d013 beq.n 800eb24 <UART_TxISR_8BIT_FIFOEN+0xc6>
  33706. {
  33707. huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);
  33708. 800eafc: 687b ldr r3, [r7, #4]
  33709. 800eafe: 6d1b ldr r3, [r3, #80] @ 0x50
  33710. 800eb00: 781a ldrb r2, [r3, #0]
  33711. 800eb02: 687b ldr r3, [r7, #4]
  33712. 800eb04: 681b ldr r3, [r3, #0]
  33713. 800eb06: 629a str r2, [r3, #40] @ 0x28
  33714. huart->pTxBuffPtr++;
  33715. 800eb08: 687b ldr r3, [r7, #4]
  33716. 800eb0a: 6d1b ldr r3, [r3, #80] @ 0x50
  33717. 800eb0c: 1c5a adds r2, r3, #1
  33718. 800eb0e: 687b ldr r3, [r7, #4]
  33719. 800eb10: 651a str r2, [r3, #80] @ 0x50
  33720. huart->TxXferCount--;
  33721. 800eb12: 687b ldr r3, [r7, #4]
  33722. 800eb14: f8b3 3056 ldrh.w r3, [r3, #86] @ 0x56
  33723. 800eb18: b29b uxth r3, r3
  33724. 800eb1a: 3b01 subs r3, #1
  33725. 800eb1c: b29a uxth r2, r3
  33726. 800eb1e: 687b ldr r3, [r7, #4]
  33727. 800eb20: f8a3 2056 strh.w r2, [r3, #86] @ 0x56
  33728. for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
  33729. 800eb24: 8ffb ldrh r3, [r7, #62] @ 0x3e
  33730. 800eb26: 3b01 subs r3, #1
  33731. 800eb28: 87fb strh r3, [r7, #62] @ 0x3e
  33732. 800eb2a: 8ffb ldrh r3, [r7, #62] @ 0x3e
  33733. 800eb2c: 2b00 cmp r3, #0
  33734. 800eb2e: d1a4 bne.n 800ea7a <UART_TxISR_8BIT_FIFOEN+0x1c>
  33735. {
  33736. /* Nothing to do */
  33737. }
  33738. }
  33739. }
  33740. }
  33741. 800eb30: e7ff b.n 800eb32 <UART_TxISR_8BIT_FIFOEN+0xd4>
  33742. 800eb32: bf00 nop
  33743. 800eb34: 3744 adds r7, #68 @ 0x44
  33744. 800eb36: 46bd mov sp, r7
  33745. 800eb38: f85d 7b04 ldr.w r7, [sp], #4
  33746. 800eb3c: 4770 bx lr
  33747. 0800eb3e <UART_TxISR_16BIT_FIFOEN>:
  33748. * interruptions have been enabled by HAL_UART_Transmit_IT().
  33749. * @param huart UART handle.
  33750. * @retval None
  33751. */
  33752. static void UART_TxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart)
  33753. {
  33754. 800eb3e: b480 push {r7}
  33755. 800eb40: b091 sub sp, #68 @ 0x44
  33756. 800eb42: af00 add r7, sp, #0
  33757. 800eb44: 6078 str r0, [r7, #4]
  33758. const uint16_t *tmp;
  33759. uint16_t nb_tx_data;
  33760. /* Check that a Tx process is ongoing */
  33761. if (huart->gState == HAL_UART_STATE_BUSY_TX)
  33762. 800eb46: 687b ldr r3, [r7, #4]
  33763. 800eb48: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  33764. 800eb4c: 2b21 cmp r3, #33 @ 0x21
  33765. 800eb4e: d165 bne.n 800ec1c <UART_TxISR_16BIT_FIFOEN+0xde>
  33766. {
  33767. for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
  33768. 800eb50: 687b ldr r3, [r7, #4]
  33769. 800eb52: f8b3 306a ldrh.w r3, [r3, #106] @ 0x6a
  33770. 800eb56: 87fb strh r3, [r7, #62] @ 0x3e
  33771. 800eb58: e05c b.n 800ec14 <UART_TxISR_16BIT_FIFOEN+0xd6>
  33772. {
  33773. if (huart->TxXferCount == 0U)
  33774. 800eb5a: 687b ldr r3, [r7, #4]
  33775. 800eb5c: f8b3 3056 ldrh.w r3, [r3, #86] @ 0x56
  33776. 800eb60: b29b uxth r3, r3
  33777. 800eb62: 2b00 cmp r3, #0
  33778. 800eb64: d133 bne.n 800ebce <UART_TxISR_16BIT_FIFOEN+0x90>
  33779. {
  33780. /* Disable the TX FIFO threshold interrupt */
  33781. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
  33782. 800eb66: 687b ldr r3, [r7, #4]
  33783. 800eb68: 681b ldr r3, [r3, #0]
  33784. 800eb6a: 3308 adds r3, #8
  33785. 800eb6c: 623b str r3, [r7, #32]
  33786. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33787. 800eb6e: 6a3b ldr r3, [r7, #32]
  33788. 800eb70: e853 3f00 ldrex r3, [r3]
  33789. 800eb74: 61fb str r3, [r7, #28]
  33790. return(result);
  33791. 800eb76: 69fb ldr r3, [r7, #28]
  33792. 800eb78: f423 0300 bic.w r3, r3, #8388608 @ 0x800000
  33793. 800eb7c: 637b str r3, [r7, #52] @ 0x34
  33794. 800eb7e: 687b ldr r3, [r7, #4]
  33795. 800eb80: 681b ldr r3, [r3, #0]
  33796. 800eb82: 3308 adds r3, #8
  33797. 800eb84: 6b7a ldr r2, [r7, #52] @ 0x34
  33798. 800eb86: 62fa str r2, [r7, #44] @ 0x2c
  33799. 800eb88: 62bb str r3, [r7, #40] @ 0x28
  33800. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33801. 800eb8a: 6ab9 ldr r1, [r7, #40] @ 0x28
  33802. 800eb8c: 6afa ldr r2, [r7, #44] @ 0x2c
  33803. 800eb8e: e841 2300 strex r3, r2, [r1]
  33804. 800eb92: 627b str r3, [r7, #36] @ 0x24
  33805. return(result);
  33806. 800eb94: 6a7b ldr r3, [r7, #36] @ 0x24
  33807. 800eb96: 2b00 cmp r3, #0
  33808. 800eb98: d1e5 bne.n 800eb66 <UART_TxISR_16BIT_FIFOEN+0x28>
  33809. /* Enable the UART Transmit Complete Interrupt */
  33810. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
  33811. 800eb9a: 687b ldr r3, [r7, #4]
  33812. 800eb9c: 681b ldr r3, [r3, #0]
  33813. 800eb9e: 60fb str r3, [r7, #12]
  33814. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33815. 800eba0: 68fb ldr r3, [r7, #12]
  33816. 800eba2: e853 3f00 ldrex r3, [r3]
  33817. 800eba6: 60bb str r3, [r7, #8]
  33818. return(result);
  33819. 800eba8: 68bb ldr r3, [r7, #8]
  33820. 800ebaa: f043 0340 orr.w r3, r3, #64 @ 0x40
  33821. 800ebae: 633b str r3, [r7, #48] @ 0x30
  33822. 800ebb0: 687b ldr r3, [r7, #4]
  33823. 800ebb2: 681b ldr r3, [r3, #0]
  33824. 800ebb4: 461a mov r2, r3
  33825. 800ebb6: 6b3b ldr r3, [r7, #48] @ 0x30
  33826. 800ebb8: 61bb str r3, [r7, #24]
  33827. 800ebba: 617a str r2, [r7, #20]
  33828. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33829. 800ebbc: 6979 ldr r1, [r7, #20]
  33830. 800ebbe: 69ba ldr r2, [r7, #24]
  33831. 800ebc0: e841 2300 strex r3, r2, [r1]
  33832. 800ebc4: 613b str r3, [r7, #16]
  33833. return(result);
  33834. 800ebc6: 693b ldr r3, [r7, #16]
  33835. 800ebc8: 2b00 cmp r3, #0
  33836. 800ebca: d1e6 bne.n 800eb9a <UART_TxISR_16BIT_FIFOEN+0x5c>
  33837. break; /* force exit loop */
  33838. 800ebcc: e026 b.n 800ec1c <UART_TxISR_16BIT_FIFOEN+0xde>
  33839. }
  33840. else if (READ_BIT(huart->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U)
  33841. 800ebce: 687b ldr r3, [r7, #4]
  33842. 800ebd0: 681b ldr r3, [r3, #0]
  33843. 800ebd2: 69db ldr r3, [r3, #28]
  33844. 800ebd4: f003 0380 and.w r3, r3, #128 @ 0x80
  33845. 800ebd8: 2b00 cmp r3, #0
  33846. 800ebda: d018 beq.n 800ec0e <UART_TxISR_16BIT_FIFOEN+0xd0>
  33847. {
  33848. tmp = (const uint16_t *) huart->pTxBuffPtr;
  33849. 800ebdc: 687b ldr r3, [r7, #4]
  33850. 800ebde: 6d1b ldr r3, [r3, #80] @ 0x50
  33851. 800ebe0: 63bb str r3, [r7, #56] @ 0x38
  33852. huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL);
  33853. 800ebe2: 6bbb ldr r3, [r7, #56] @ 0x38
  33854. 800ebe4: 881b ldrh r3, [r3, #0]
  33855. 800ebe6: 461a mov r2, r3
  33856. 800ebe8: 687b ldr r3, [r7, #4]
  33857. 800ebea: 681b ldr r3, [r3, #0]
  33858. 800ebec: f3c2 0208 ubfx r2, r2, #0, #9
  33859. 800ebf0: 629a str r2, [r3, #40] @ 0x28
  33860. huart->pTxBuffPtr += 2U;
  33861. 800ebf2: 687b ldr r3, [r7, #4]
  33862. 800ebf4: 6d1b ldr r3, [r3, #80] @ 0x50
  33863. 800ebf6: 1c9a adds r2, r3, #2
  33864. 800ebf8: 687b ldr r3, [r7, #4]
  33865. 800ebfa: 651a str r2, [r3, #80] @ 0x50
  33866. huart->TxXferCount--;
  33867. 800ebfc: 687b ldr r3, [r7, #4]
  33868. 800ebfe: f8b3 3056 ldrh.w r3, [r3, #86] @ 0x56
  33869. 800ec02: b29b uxth r3, r3
  33870. 800ec04: 3b01 subs r3, #1
  33871. 800ec06: b29a uxth r2, r3
  33872. 800ec08: 687b ldr r3, [r7, #4]
  33873. 800ec0a: f8a3 2056 strh.w r2, [r3, #86] @ 0x56
  33874. for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
  33875. 800ec0e: 8ffb ldrh r3, [r7, #62] @ 0x3e
  33876. 800ec10: 3b01 subs r3, #1
  33877. 800ec12: 87fb strh r3, [r7, #62] @ 0x3e
  33878. 800ec14: 8ffb ldrh r3, [r7, #62] @ 0x3e
  33879. 800ec16: 2b00 cmp r3, #0
  33880. 800ec18: d19f bne.n 800eb5a <UART_TxISR_16BIT_FIFOEN+0x1c>
  33881. {
  33882. /* Nothing to do */
  33883. }
  33884. }
  33885. }
  33886. }
  33887. 800ec1a: e7ff b.n 800ec1c <UART_TxISR_16BIT_FIFOEN+0xde>
  33888. 800ec1c: bf00 nop
  33889. 800ec1e: 3744 adds r7, #68 @ 0x44
  33890. 800ec20: 46bd mov sp, r7
  33891. 800ec22: f85d 7b04 ldr.w r7, [sp], #4
  33892. 800ec26: 4770 bx lr
  33893. 0800ec28 <UART_EndTransmit_IT>:
  33894. * @param huart pointer to a UART_HandleTypeDef structure that contains
  33895. * the configuration information for the specified UART module.
  33896. * @retval None
  33897. */
  33898. static void UART_EndTransmit_IT(UART_HandleTypeDef *huart)
  33899. {
  33900. 800ec28: b580 push {r7, lr}
  33901. 800ec2a: b088 sub sp, #32
  33902. 800ec2c: af00 add r7, sp, #0
  33903. 800ec2e: 6078 str r0, [r7, #4]
  33904. /* Disable the UART Transmit Complete Interrupt */
  33905. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_TCIE);
  33906. 800ec30: 687b ldr r3, [r7, #4]
  33907. 800ec32: 681b ldr r3, [r3, #0]
  33908. 800ec34: 60fb str r3, [r7, #12]
  33909. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  33910. 800ec36: 68fb ldr r3, [r7, #12]
  33911. 800ec38: e853 3f00 ldrex r3, [r3]
  33912. 800ec3c: 60bb str r3, [r7, #8]
  33913. return(result);
  33914. 800ec3e: 68bb ldr r3, [r7, #8]
  33915. 800ec40: f023 0340 bic.w r3, r3, #64 @ 0x40
  33916. 800ec44: 61fb str r3, [r7, #28]
  33917. 800ec46: 687b ldr r3, [r7, #4]
  33918. 800ec48: 681b ldr r3, [r3, #0]
  33919. 800ec4a: 461a mov r2, r3
  33920. 800ec4c: 69fb ldr r3, [r7, #28]
  33921. 800ec4e: 61bb str r3, [r7, #24]
  33922. 800ec50: 617a str r2, [r7, #20]
  33923. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  33924. 800ec52: 6979 ldr r1, [r7, #20]
  33925. 800ec54: 69ba ldr r2, [r7, #24]
  33926. 800ec56: e841 2300 strex r3, r2, [r1]
  33927. 800ec5a: 613b str r3, [r7, #16]
  33928. return(result);
  33929. 800ec5c: 693b ldr r3, [r7, #16]
  33930. 800ec5e: 2b00 cmp r3, #0
  33931. 800ec60: d1e6 bne.n 800ec30 <UART_EndTransmit_IT+0x8>
  33932. /* Tx process is ended, restore huart->gState to Ready */
  33933. huart->gState = HAL_UART_STATE_READY;
  33934. 800ec62: 687b ldr r3, [r7, #4]
  33935. 800ec64: 2220 movs r2, #32
  33936. 800ec66: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  33937. /* Cleat TxISR function pointer */
  33938. huart->TxISR = NULL;
  33939. 800ec6a: 687b ldr r3, [r7, #4]
  33940. 800ec6c: 2200 movs r2, #0
  33941. 800ec6e: 679a str r2, [r3, #120] @ 0x78
  33942. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  33943. /*Call registered Tx complete callback*/
  33944. huart->TxCpltCallback(huart);
  33945. #else
  33946. /*Call legacy weak Tx complete callback*/
  33947. HAL_UART_TxCpltCallback(huart);
  33948. 800ec70: 6878 ldr r0, [r7, #4]
  33949. 800ec72: f7f5 fa21 bl 80040b8 <HAL_UART_TxCpltCallback>
  33950. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
  33951. }
  33952. 800ec76: bf00 nop
  33953. 800ec78: 3720 adds r7, #32
  33954. 800ec7a: 46bd mov sp, r7
  33955. 800ec7c: bd80 pop {r7, pc}
  33956. ...
  33957. 0800ec80 <UART_RxISR_8BIT>:
  33958. * @brief RX interrupt handler for 7 or 8 bits data word length .
  33959. * @param huart UART handle.
  33960. * @retval None
  33961. */
  33962. static void UART_RxISR_8BIT(UART_HandleTypeDef *huart)
  33963. {
  33964. 800ec80: b580 push {r7, lr}
  33965. 800ec82: b09c sub sp, #112 @ 0x70
  33966. 800ec84: af00 add r7, sp, #0
  33967. 800ec86: 6078 str r0, [r7, #4]
  33968. uint16_t uhMask = huart->Mask;
  33969. 800ec88: 687b ldr r3, [r7, #4]
  33970. 800ec8a: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  33971. 800ec8e: f8a7 306e strh.w r3, [r7, #110] @ 0x6e
  33972. uint16_t uhdata;
  33973. /* Check that a Rx process is ongoing */
  33974. if (huart->RxState == HAL_UART_STATE_BUSY_RX)
  33975. 800ec92: 687b ldr r3, [r7, #4]
  33976. 800ec94: f8d3 308c ldr.w r3, [r3, #140] @ 0x8c
  33977. 800ec98: 2b22 cmp r3, #34 @ 0x22
  33978. 800ec9a: f040 80be bne.w 800ee1a <UART_RxISR_8BIT+0x19a>
  33979. {
  33980. uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
  33981. 800ec9e: 687b ldr r3, [r7, #4]
  33982. 800eca0: 681b ldr r3, [r3, #0]
  33983. 800eca2: 6a5b ldr r3, [r3, #36] @ 0x24
  33984. 800eca4: f8a7 306c strh.w r3, [r7, #108] @ 0x6c
  33985. *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
  33986. 800eca8: f8b7 306c ldrh.w r3, [r7, #108] @ 0x6c
  33987. 800ecac: b2d9 uxtb r1, r3
  33988. 800ecae: f8b7 306e ldrh.w r3, [r7, #110] @ 0x6e
  33989. 800ecb2: b2da uxtb r2, r3
  33990. 800ecb4: 687b ldr r3, [r7, #4]
  33991. 800ecb6: 6d9b ldr r3, [r3, #88] @ 0x58
  33992. 800ecb8: 400a ands r2, r1
  33993. 800ecba: b2d2 uxtb r2, r2
  33994. 800ecbc: 701a strb r2, [r3, #0]
  33995. huart->pRxBuffPtr++;
  33996. 800ecbe: 687b ldr r3, [r7, #4]
  33997. 800ecc0: 6d9b ldr r3, [r3, #88] @ 0x58
  33998. 800ecc2: 1c5a adds r2, r3, #1
  33999. 800ecc4: 687b ldr r3, [r7, #4]
  34000. 800ecc6: 659a str r2, [r3, #88] @ 0x58
  34001. huart->RxXferCount--;
  34002. 800ecc8: 687b ldr r3, [r7, #4]
  34003. 800ecca: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  34004. 800ecce: b29b uxth r3, r3
  34005. 800ecd0: 3b01 subs r3, #1
  34006. 800ecd2: b29a uxth r2, r3
  34007. 800ecd4: 687b ldr r3, [r7, #4]
  34008. 800ecd6: f8a3 205e strh.w r2, [r3, #94] @ 0x5e
  34009. if (huart->RxXferCount == 0U)
  34010. 800ecda: 687b ldr r3, [r7, #4]
  34011. 800ecdc: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  34012. 800ece0: b29b uxth r3, r3
  34013. 800ece2: 2b00 cmp r3, #0
  34014. 800ece4: f040 80a1 bne.w 800ee2a <UART_RxISR_8BIT+0x1aa>
  34015. {
  34016. /* Disable the UART Parity Error Interrupt and RXNE interrupts */
  34017. ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
  34018. 800ece8: 687b ldr r3, [r7, #4]
  34019. 800ecea: 681b ldr r3, [r3, #0]
  34020. 800ecec: 64fb str r3, [r7, #76] @ 0x4c
  34021. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34022. 800ecee: 6cfb ldr r3, [r7, #76] @ 0x4c
  34023. 800ecf0: e853 3f00 ldrex r3, [r3]
  34024. 800ecf4: 64bb str r3, [r7, #72] @ 0x48
  34025. return(result);
  34026. 800ecf6: 6cbb ldr r3, [r7, #72] @ 0x48
  34027. 800ecf8: f423 7390 bic.w r3, r3, #288 @ 0x120
  34028. 800ecfc: 66bb str r3, [r7, #104] @ 0x68
  34029. 800ecfe: 687b ldr r3, [r7, #4]
  34030. 800ed00: 681b ldr r3, [r3, #0]
  34031. 800ed02: 461a mov r2, r3
  34032. 800ed04: 6ebb ldr r3, [r7, #104] @ 0x68
  34033. 800ed06: 65bb str r3, [r7, #88] @ 0x58
  34034. 800ed08: 657a str r2, [r7, #84] @ 0x54
  34035. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34036. 800ed0a: 6d79 ldr r1, [r7, #84] @ 0x54
  34037. 800ed0c: 6dba ldr r2, [r7, #88] @ 0x58
  34038. 800ed0e: e841 2300 strex r3, r2, [r1]
  34039. 800ed12: 653b str r3, [r7, #80] @ 0x50
  34040. return(result);
  34041. 800ed14: 6d3b ldr r3, [r7, #80] @ 0x50
  34042. 800ed16: 2b00 cmp r3, #0
  34043. 800ed18: d1e6 bne.n 800ece8 <UART_RxISR_8BIT+0x68>
  34044. /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
  34045. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
  34046. 800ed1a: 687b ldr r3, [r7, #4]
  34047. 800ed1c: 681b ldr r3, [r3, #0]
  34048. 800ed1e: 3308 adds r3, #8
  34049. 800ed20: 63bb str r3, [r7, #56] @ 0x38
  34050. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34051. 800ed22: 6bbb ldr r3, [r7, #56] @ 0x38
  34052. 800ed24: e853 3f00 ldrex r3, [r3]
  34053. 800ed28: 637b str r3, [r7, #52] @ 0x34
  34054. return(result);
  34055. 800ed2a: 6b7b ldr r3, [r7, #52] @ 0x34
  34056. 800ed2c: f023 0301 bic.w r3, r3, #1
  34057. 800ed30: 667b str r3, [r7, #100] @ 0x64
  34058. 800ed32: 687b ldr r3, [r7, #4]
  34059. 800ed34: 681b ldr r3, [r3, #0]
  34060. 800ed36: 3308 adds r3, #8
  34061. 800ed38: 6e7a ldr r2, [r7, #100] @ 0x64
  34062. 800ed3a: 647a str r2, [r7, #68] @ 0x44
  34063. 800ed3c: 643b str r3, [r7, #64] @ 0x40
  34064. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34065. 800ed3e: 6c39 ldr r1, [r7, #64] @ 0x40
  34066. 800ed40: 6c7a ldr r2, [r7, #68] @ 0x44
  34067. 800ed42: e841 2300 strex r3, r2, [r1]
  34068. 800ed46: 63fb str r3, [r7, #60] @ 0x3c
  34069. return(result);
  34070. 800ed48: 6bfb ldr r3, [r7, #60] @ 0x3c
  34071. 800ed4a: 2b00 cmp r3, #0
  34072. 800ed4c: d1e5 bne.n 800ed1a <UART_RxISR_8BIT+0x9a>
  34073. /* Rx process is completed, restore huart->RxState to Ready */
  34074. huart->RxState = HAL_UART_STATE_READY;
  34075. 800ed4e: 687b ldr r3, [r7, #4]
  34076. 800ed50: 2220 movs r2, #32
  34077. 800ed52: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  34078. /* Clear RxISR function pointer */
  34079. huart->RxISR = NULL;
  34080. 800ed56: 687b ldr r3, [r7, #4]
  34081. 800ed58: 2200 movs r2, #0
  34082. 800ed5a: 675a str r2, [r3, #116] @ 0x74
  34083. /* Initialize type of RxEvent to Transfer Complete */
  34084. huart->RxEventType = HAL_UART_RXEVENT_TC;
  34085. 800ed5c: 687b ldr r3, [r7, #4]
  34086. 800ed5e: 2200 movs r2, #0
  34087. 800ed60: 671a str r2, [r3, #112] @ 0x70
  34088. if (!(IS_LPUART_INSTANCE(huart->Instance)))
  34089. 800ed62: 687b ldr r3, [r7, #4]
  34090. 800ed64: 681b ldr r3, [r3, #0]
  34091. 800ed66: 4a33 ldr r2, [pc, #204] @ (800ee34 <UART_RxISR_8BIT+0x1b4>)
  34092. 800ed68: 4293 cmp r3, r2
  34093. 800ed6a: d01f beq.n 800edac <UART_RxISR_8BIT+0x12c>
  34094. {
  34095. /* Check that USART RTOEN bit is set */
  34096. if (READ_BIT(huart->Instance->CR2, USART_CR2_RTOEN) != 0U)
  34097. 800ed6c: 687b ldr r3, [r7, #4]
  34098. 800ed6e: 681b ldr r3, [r3, #0]
  34099. 800ed70: 685b ldr r3, [r3, #4]
  34100. 800ed72: f403 0300 and.w r3, r3, #8388608 @ 0x800000
  34101. 800ed76: 2b00 cmp r3, #0
  34102. 800ed78: d018 beq.n 800edac <UART_RxISR_8BIT+0x12c>
  34103. {
  34104. /* Enable the UART Receiver Timeout Interrupt */
  34105. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_RTOIE);
  34106. 800ed7a: 687b ldr r3, [r7, #4]
  34107. 800ed7c: 681b ldr r3, [r3, #0]
  34108. 800ed7e: 627b str r3, [r7, #36] @ 0x24
  34109. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34110. 800ed80: 6a7b ldr r3, [r7, #36] @ 0x24
  34111. 800ed82: e853 3f00 ldrex r3, [r3]
  34112. 800ed86: 623b str r3, [r7, #32]
  34113. return(result);
  34114. 800ed88: 6a3b ldr r3, [r7, #32]
  34115. 800ed8a: f023 6380 bic.w r3, r3, #67108864 @ 0x4000000
  34116. 800ed8e: 663b str r3, [r7, #96] @ 0x60
  34117. 800ed90: 687b ldr r3, [r7, #4]
  34118. 800ed92: 681b ldr r3, [r3, #0]
  34119. 800ed94: 461a mov r2, r3
  34120. 800ed96: 6e3b ldr r3, [r7, #96] @ 0x60
  34121. 800ed98: 633b str r3, [r7, #48] @ 0x30
  34122. 800ed9a: 62fa str r2, [r7, #44] @ 0x2c
  34123. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34124. 800ed9c: 6af9 ldr r1, [r7, #44] @ 0x2c
  34125. 800ed9e: 6b3a ldr r2, [r7, #48] @ 0x30
  34126. 800eda0: e841 2300 strex r3, r2, [r1]
  34127. 800eda4: 62bb str r3, [r7, #40] @ 0x28
  34128. return(result);
  34129. 800eda6: 6abb ldr r3, [r7, #40] @ 0x28
  34130. 800eda8: 2b00 cmp r3, #0
  34131. 800edaa: d1e6 bne.n 800ed7a <UART_RxISR_8BIT+0xfa>
  34132. }
  34133. }
  34134. /* Check current reception Mode :
  34135. If Reception till IDLE event has been selected : */
  34136. if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
  34137. 800edac: 687b ldr r3, [r7, #4]
  34138. 800edae: 6edb ldr r3, [r3, #108] @ 0x6c
  34139. 800edb0: 2b01 cmp r3, #1
  34140. 800edb2: d12e bne.n 800ee12 <UART_RxISR_8BIT+0x192>
  34141. {
  34142. /* Set reception type to Standard */
  34143. huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;
  34144. 800edb4: 687b ldr r3, [r7, #4]
  34145. 800edb6: 2200 movs r2, #0
  34146. 800edb8: 66da str r2, [r3, #108] @ 0x6c
  34147. /* Disable IDLE interrupt */
  34148. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
  34149. 800edba: 687b ldr r3, [r7, #4]
  34150. 800edbc: 681b ldr r3, [r3, #0]
  34151. 800edbe: 613b str r3, [r7, #16]
  34152. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34153. 800edc0: 693b ldr r3, [r7, #16]
  34154. 800edc2: e853 3f00 ldrex r3, [r3]
  34155. 800edc6: 60fb str r3, [r7, #12]
  34156. return(result);
  34157. 800edc8: 68fb ldr r3, [r7, #12]
  34158. 800edca: f023 0310 bic.w r3, r3, #16
  34159. 800edce: 65fb str r3, [r7, #92] @ 0x5c
  34160. 800edd0: 687b ldr r3, [r7, #4]
  34161. 800edd2: 681b ldr r3, [r3, #0]
  34162. 800edd4: 461a mov r2, r3
  34163. 800edd6: 6dfb ldr r3, [r7, #92] @ 0x5c
  34164. 800edd8: 61fb str r3, [r7, #28]
  34165. 800edda: 61ba str r2, [r7, #24]
  34166. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34167. 800eddc: 69b9 ldr r1, [r7, #24]
  34168. 800edde: 69fa ldr r2, [r7, #28]
  34169. 800ede0: e841 2300 strex r3, r2, [r1]
  34170. 800ede4: 617b str r3, [r7, #20]
  34171. return(result);
  34172. 800ede6: 697b ldr r3, [r7, #20]
  34173. 800ede8: 2b00 cmp r3, #0
  34174. 800edea: d1e6 bne.n 800edba <UART_RxISR_8BIT+0x13a>
  34175. if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == SET)
  34176. 800edec: 687b ldr r3, [r7, #4]
  34177. 800edee: 681b ldr r3, [r3, #0]
  34178. 800edf0: 69db ldr r3, [r3, #28]
  34179. 800edf2: f003 0310 and.w r3, r3, #16
  34180. 800edf6: 2b10 cmp r3, #16
  34181. 800edf8: d103 bne.n 800ee02 <UART_RxISR_8BIT+0x182>
  34182. {
  34183. /* Clear IDLE Flag */
  34184. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF);
  34185. 800edfa: 687b ldr r3, [r7, #4]
  34186. 800edfc: 681b ldr r3, [r3, #0]
  34187. 800edfe: 2210 movs r2, #16
  34188. 800ee00: 621a str r2, [r3, #32]
  34189. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  34190. /*Call registered Rx Event callback*/
  34191. huart->RxEventCallback(huart, huart->RxXferSize);
  34192. #else
  34193. /*Call legacy weak Rx Event callback*/
  34194. HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize);
  34195. 800ee02: 687b ldr r3, [r7, #4]
  34196. 800ee04: f8b3 305c ldrh.w r3, [r3, #92] @ 0x5c
  34197. 800ee08: 4619 mov r1, r3
  34198. 800ee0a: 6878 ldr r0, [r7, #4]
  34199. 800ee0c: f7f5 f8fa bl 8004004 <HAL_UARTEx_RxEventCallback>
  34200. else
  34201. {
  34202. /* Clear RXNE interrupt flag */
  34203. __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  34204. }
  34205. }
  34206. 800ee10: e00b b.n 800ee2a <UART_RxISR_8BIT+0x1aa>
  34207. HAL_UART_RxCpltCallback(huart);
  34208. 800ee12: 6878 ldr r0, [r7, #4]
  34209. 800ee14: f7f5 f8ec bl 8003ff0 <HAL_UART_RxCpltCallback>
  34210. }
  34211. 800ee18: e007 b.n 800ee2a <UART_RxISR_8BIT+0x1aa>
  34212. __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  34213. 800ee1a: 687b ldr r3, [r7, #4]
  34214. 800ee1c: 681b ldr r3, [r3, #0]
  34215. 800ee1e: 699a ldr r2, [r3, #24]
  34216. 800ee20: 687b ldr r3, [r7, #4]
  34217. 800ee22: 681b ldr r3, [r3, #0]
  34218. 800ee24: f042 0208 orr.w r2, r2, #8
  34219. 800ee28: 619a str r2, [r3, #24]
  34220. }
  34221. 800ee2a: bf00 nop
  34222. 800ee2c: 3770 adds r7, #112 @ 0x70
  34223. 800ee2e: 46bd mov sp, r7
  34224. 800ee30: bd80 pop {r7, pc}
  34225. 800ee32: bf00 nop
  34226. 800ee34: 58000c00 .word 0x58000c00
  34227. 0800ee38 <UART_RxISR_16BIT>:
  34228. * interruptions have been enabled by HAL_UART_Receive_IT()
  34229. * @param huart UART handle.
  34230. * @retval None
  34231. */
  34232. static void UART_RxISR_16BIT(UART_HandleTypeDef *huart)
  34233. {
  34234. 800ee38: b580 push {r7, lr}
  34235. 800ee3a: b09c sub sp, #112 @ 0x70
  34236. 800ee3c: af00 add r7, sp, #0
  34237. 800ee3e: 6078 str r0, [r7, #4]
  34238. uint16_t *tmp;
  34239. uint16_t uhMask = huart->Mask;
  34240. 800ee40: 687b ldr r3, [r7, #4]
  34241. 800ee42: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  34242. 800ee46: f8a7 306e strh.w r3, [r7, #110] @ 0x6e
  34243. uint16_t uhdata;
  34244. /* Check that a Rx process is ongoing */
  34245. if (huart->RxState == HAL_UART_STATE_BUSY_RX)
  34246. 800ee4a: 687b ldr r3, [r7, #4]
  34247. 800ee4c: f8d3 308c ldr.w r3, [r3, #140] @ 0x8c
  34248. 800ee50: 2b22 cmp r3, #34 @ 0x22
  34249. 800ee52: f040 80be bne.w 800efd2 <UART_RxISR_16BIT+0x19a>
  34250. {
  34251. uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
  34252. 800ee56: 687b ldr r3, [r7, #4]
  34253. 800ee58: 681b ldr r3, [r3, #0]
  34254. 800ee5a: 6a5b ldr r3, [r3, #36] @ 0x24
  34255. 800ee5c: f8a7 306c strh.w r3, [r7, #108] @ 0x6c
  34256. tmp = (uint16_t *) huart->pRxBuffPtr ;
  34257. 800ee60: 687b ldr r3, [r7, #4]
  34258. 800ee62: 6d9b ldr r3, [r3, #88] @ 0x58
  34259. 800ee64: 66bb str r3, [r7, #104] @ 0x68
  34260. *tmp = (uint16_t)(uhdata & uhMask);
  34261. 800ee66: f8b7 206c ldrh.w r2, [r7, #108] @ 0x6c
  34262. 800ee6a: f8b7 306e ldrh.w r3, [r7, #110] @ 0x6e
  34263. 800ee6e: 4013 ands r3, r2
  34264. 800ee70: b29a uxth r2, r3
  34265. 800ee72: 6ebb ldr r3, [r7, #104] @ 0x68
  34266. 800ee74: 801a strh r2, [r3, #0]
  34267. huart->pRxBuffPtr += 2U;
  34268. 800ee76: 687b ldr r3, [r7, #4]
  34269. 800ee78: 6d9b ldr r3, [r3, #88] @ 0x58
  34270. 800ee7a: 1c9a adds r2, r3, #2
  34271. 800ee7c: 687b ldr r3, [r7, #4]
  34272. 800ee7e: 659a str r2, [r3, #88] @ 0x58
  34273. huart->RxXferCount--;
  34274. 800ee80: 687b ldr r3, [r7, #4]
  34275. 800ee82: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  34276. 800ee86: b29b uxth r3, r3
  34277. 800ee88: 3b01 subs r3, #1
  34278. 800ee8a: b29a uxth r2, r3
  34279. 800ee8c: 687b ldr r3, [r7, #4]
  34280. 800ee8e: f8a3 205e strh.w r2, [r3, #94] @ 0x5e
  34281. if (huart->RxXferCount == 0U)
  34282. 800ee92: 687b ldr r3, [r7, #4]
  34283. 800ee94: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  34284. 800ee98: b29b uxth r3, r3
  34285. 800ee9a: 2b00 cmp r3, #0
  34286. 800ee9c: f040 80a1 bne.w 800efe2 <UART_RxISR_16BIT+0x1aa>
  34287. {
  34288. /* Disable the UART Parity Error Interrupt and RXNE interrupt*/
  34289. ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
  34290. 800eea0: 687b ldr r3, [r7, #4]
  34291. 800eea2: 681b ldr r3, [r3, #0]
  34292. 800eea4: 64bb str r3, [r7, #72] @ 0x48
  34293. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34294. 800eea6: 6cbb ldr r3, [r7, #72] @ 0x48
  34295. 800eea8: e853 3f00 ldrex r3, [r3]
  34296. 800eeac: 647b str r3, [r7, #68] @ 0x44
  34297. return(result);
  34298. 800eeae: 6c7b ldr r3, [r7, #68] @ 0x44
  34299. 800eeb0: f423 7390 bic.w r3, r3, #288 @ 0x120
  34300. 800eeb4: 667b str r3, [r7, #100] @ 0x64
  34301. 800eeb6: 687b ldr r3, [r7, #4]
  34302. 800eeb8: 681b ldr r3, [r3, #0]
  34303. 800eeba: 461a mov r2, r3
  34304. 800eebc: 6e7b ldr r3, [r7, #100] @ 0x64
  34305. 800eebe: 657b str r3, [r7, #84] @ 0x54
  34306. 800eec0: 653a str r2, [r7, #80] @ 0x50
  34307. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34308. 800eec2: 6d39 ldr r1, [r7, #80] @ 0x50
  34309. 800eec4: 6d7a ldr r2, [r7, #84] @ 0x54
  34310. 800eec6: e841 2300 strex r3, r2, [r1]
  34311. 800eeca: 64fb str r3, [r7, #76] @ 0x4c
  34312. return(result);
  34313. 800eecc: 6cfb ldr r3, [r7, #76] @ 0x4c
  34314. 800eece: 2b00 cmp r3, #0
  34315. 800eed0: d1e6 bne.n 800eea0 <UART_RxISR_16BIT+0x68>
  34316. /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
  34317. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
  34318. 800eed2: 687b ldr r3, [r7, #4]
  34319. 800eed4: 681b ldr r3, [r3, #0]
  34320. 800eed6: 3308 adds r3, #8
  34321. 800eed8: 637b str r3, [r7, #52] @ 0x34
  34322. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34323. 800eeda: 6b7b ldr r3, [r7, #52] @ 0x34
  34324. 800eedc: e853 3f00 ldrex r3, [r3]
  34325. 800eee0: 633b str r3, [r7, #48] @ 0x30
  34326. return(result);
  34327. 800eee2: 6b3b ldr r3, [r7, #48] @ 0x30
  34328. 800eee4: f023 0301 bic.w r3, r3, #1
  34329. 800eee8: 663b str r3, [r7, #96] @ 0x60
  34330. 800eeea: 687b ldr r3, [r7, #4]
  34331. 800eeec: 681b ldr r3, [r3, #0]
  34332. 800eeee: 3308 adds r3, #8
  34333. 800eef0: 6e3a ldr r2, [r7, #96] @ 0x60
  34334. 800eef2: 643a str r2, [r7, #64] @ 0x40
  34335. 800eef4: 63fb str r3, [r7, #60] @ 0x3c
  34336. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34337. 800eef6: 6bf9 ldr r1, [r7, #60] @ 0x3c
  34338. 800eef8: 6c3a ldr r2, [r7, #64] @ 0x40
  34339. 800eefa: e841 2300 strex r3, r2, [r1]
  34340. 800eefe: 63bb str r3, [r7, #56] @ 0x38
  34341. return(result);
  34342. 800ef00: 6bbb ldr r3, [r7, #56] @ 0x38
  34343. 800ef02: 2b00 cmp r3, #0
  34344. 800ef04: d1e5 bne.n 800eed2 <UART_RxISR_16BIT+0x9a>
  34345. /* Rx process is completed, restore huart->RxState to Ready */
  34346. huart->RxState = HAL_UART_STATE_READY;
  34347. 800ef06: 687b ldr r3, [r7, #4]
  34348. 800ef08: 2220 movs r2, #32
  34349. 800ef0a: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  34350. /* Clear RxISR function pointer */
  34351. huart->RxISR = NULL;
  34352. 800ef0e: 687b ldr r3, [r7, #4]
  34353. 800ef10: 2200 movs r2, #0
  34354. 800ef12: 675a str r2, [r3, #116] @ 0x74
  34355. /* Initialize type of RxEvent to Transfer Complete */
  34356. huart->RxEventType = HAL_UART_RXEVENT_TC;
  34357. 800ef14: 687b ldr r3, [r7, #4]
  34358. 800ef16: 2200 movs r2, #0
  34359. 800ef18: 671a str r2, [r3, #112] @ 0x70
  34360. if (!(IS_LPUART_INSTANCE(huart->Instance)))
  34361. 800ef1a: 687b ldr r3, [r7, #4]
  34362. 800ef1c: 681b ldr r3, [r3, #0]
  34363. 800ef1e: 4a33 ldr r2, [pc, #204] @ (800efec <UART_RxISR_16BIT+0x1b4>)
  34364. 800ef20: 4293 cmp r3, r2
  34365. 800ef22: d01f beq.n 800ef64 <UART_RxISR_16BIT+0x12c>
  34366. {
  34367. /* Check that USART RTOEN bit is set */
  34368. if (READ_BIT(huart->Instance->CR2, USART_CR2_RTOEN) != 0U)
  34369. 800ef24: 687b ldr r3, [r7, #4]
  34370. 800ef26: 681b ldr r3, [r3, #0]
  34371. 800ef28: 685b ldr r3, [r3, #4]
  34372. 800ef2a: f403 0300 and.w r3, r3, #8388608 @ 0x800000
  34373. 800ef2e: 2b00 cmp r3, #0
  34374. 800ef30: d018 beq.n 800ef64 <UART_RxISR_16BIT+0x12c>
  34375. {
  34376. /* Enable the UART Receiver Timeout Interrupt */
  34377. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_RTOIE);
  34378. 800ef32: 687b ldr r3, [r7, #4]
  34379. 800ef34: 681b ldr r3, [r3, #0]
  34380. 800ef36: 623b str r3, [r7, #32]
  34381. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34382. 800ef38: 6a3b ldr r3, [r7, #32]
  34383. 800ef3a: e853 3f00 ldrex r3, [r3]
  34384. 800ef3e: 61fb str r3, [r7, #28]
  34385. return(result);
  34386. 800ef40: 69fb ldr r3, [r7, #28]
  34387. 800ef42: f023 6380 bic.w r3, r3, #67108864 @ 0x4000000
  34388. 800ef46: 65fb str r3, [r7, #92] @ 0x5c
  34389. 800ef48: 687b ldr r3, [r7, #4]
  34390. 800ef4a: 681b ldr r3, [r3, #0]
  34391. 800ef4c: 461a mov r2, r3
  34392. 800ef4e: 6dfb ldr r3, [r7, #92] @ 0x5c
  34393. 800ef50: 62fb str r3, [r7, #44] @ 0x2c
  34394. 800ef52: 62ba str r2, [r7, #40] @ 0x28
  34395. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34396. 800ef54: 6ab9 ldr r1, [r7, #40] @ 0x28
  34397. 800ef56: 6afa ldr r2, [r7, #44] @ 0x2c
  34398. 800ef58: e841 2300 strex r3, r2, [r1]
  34399. 800ef5c: 627b str r3, [r7, #36] @ 0x24
  34400. return(result);
  34401. 800ef5e: 6a7b ldr r3, [r7, #36] @ 0x24
  34402. 800ef60: 2b00 cmp r3, #0
  34403. 800ef62: d1e6 bne.n 800ef32 <UART_RxISR_16BIT+0xfa>
  34404. }
  34405. }
  34406. /* Check current reception Mode :
  34407. If Reception till IDLE event has been selected : */
  34408. if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
  34409. 800ef64: 687b ldr r3, [r7, #4]
  34410. 800ef66: 6edb ldr r3, [r3, #108] @ 0x6c
  34411. 800ef68: 2b01 cmp r3, #1
  34412. 800ef6a: d12e bne.n 800efca <UART_RxISR_16BIT+0x192>
  34413. {
  34414. /* Set reception type to Standard */
  34415. huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;
  34416. 800ef6c: 687b ldr r3, [r7, #4]
  34417. 800ef6e: 2200 movs r2, #0
  34418. 800ef70: 66da str r2, [r3, #108] @ 0x6c
  34419. /* Disable IDLE interrupt */
  34420. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
  34421. 800ef72: 687b ldr r3, [r7, #4]
  34422. 800ef74: 681b ldr r3, [r3, #0]
  34423. 800ef76: 60fb str r3, [r7, #12]
  34424. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34425. 800ef78: 68fb ldr r3, [r7, #12]
  34426. 800ef7a: e853 3f00 ldrex r3, [r3]
  34427. 800ef7e: 60bb str r3, [r7, #8]
  34428. return(result);
  34429. 800ef80: 68bb ldr r3, [r7, #8]
  34430. 800ef82: f023 0310 bic.w r3, r3, #16
  34431. 800ef86: 65bb str r3, [r7, #88] @ 0x58
  34432. 800ef88: 687b ldr r3, [r7, #4]
  34433. 800ef8a: 681b ldr r3, [r3, #0]
  34434. 800ef8c: 461a mov r2, r3
  34435. 800ef8e: 6dbb ldr r3, [r7, #88] @ 0x58
  34436. 800ef90: 61bb str r3, [r7, #24]
  34437. 800ef92: 617a str r2, [r7, #20]
  34438. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34439. 800ef94: 6979 ldr r1, [r7, #20]
  34440. 800ef96: 69ba ldr r2, [r7, #24]
  34441. 800ef98: e841 2300 strex r3, r2, [r1]
  34442. 800ef9c: 613b str r3, [r7, #16]
  34443. return(result);
  34444. 800ef9e: 693b ldr r3, [r7, #16]
  34445. 800efa0: 2b00 cmp r3, #0
  34446. 800efa2: d1e6 bne.n 800ef72 <UART_RxISR_16BIT+0x13a>
  34447. if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == SET)
  34448. 800efa4: 687b ldr r3, [r7, #4]
  34449. 800efa6: 681b ldr r3, [r3, #0]
  34450. 800efa8: 69db ldr r3, [r3, #28]
  34451. 800efaa: f003 0310 and.w r3, r3, #16
  34452. 800efae: 2b10 cmp r3, #16
  34453. 800efb0: d103 bne.n 800efba <UART_RxISR_16BIT+0x182>
  34454. {
  34455. /* Clear IDLE Flag */
  34456. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF);
  34457. 800efb2: 687b ldr r3, [r7, #4]
  34458. 800efb4: 681b ldr r3, [r3, #0]
  34459. 800efb6: 2210 movs r2, #16
  34460. 800efb8: 621a str r2, [r3, #32]
  34461. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  34462. /*Call registered Rx Event callback*/
  34463. huart->RxEventCallback(huart, huart->RxXferSize);
  34464. #else
  34465. /*Call legacy weak Rx Event callback*/
  34466. HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize);
  34467. 800efba: 687b ldr r3, [r7, #4]
  34468. 800efbc: f8b3 305c ldrh.w r3, [r3, #92] @ 0x5c
  34469. 800efc0: 4619 mov r1, r3
  34470. 800efc2: 6878 ldr r0, [r7, #4]
  34471. 800efc4: f7f5 f81e bl 8004004 <HAL_UARTEx_RxEventCallback>
  34472. else
  34473. {
  34474. /* Clear RXNE interrupt flag */
  34475. __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  34476. }
  34477. }
  34478. 800efc8: e00b b.n 800efe2 <UART_RxISR_16BIT+0x1aa>
  34479. HAL_UART_RxCpltCallback(huart);
  34480. 800efca: 6878 ldr r0, [r7, #4]
  34481. 800efcc: f7f5 f810 bl 8003ff0 <HAL_UART_RxCpltCallback>
  34482. }
  34483. 800efd0: e007 b.n 800efe2 <UART_RxISR_16BIT+0x1aa>
  34484. __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  34485. 800efd2: 687b ldr r3, [r7, #4]
  34486. 800efd4: 681b ldr r3, [r3, #0]
  34487. 800efd6: 699a ldr r2, [r3, #24]
  34488. 800efd8: 687b ldr r3, [r7, #4]
  34489. 800efda: 681b ldr r3, [r3, #0]
  34490. 800efdc: f042 0208 orr.w r2, r2, #8
  34491. 800efe0: 619a str r2, [r3, #24]
  34492. }
  34493. 800efe2: bf00 nop
  34494. 800efe4: 3770 adds r7, #112 @ 0x70
  34495. 800efe6: 46bd mov sp, r7
  34496. 800efe8: bd80 pop {r7, pc}
  34497. 800efea: bf00 nop
  34498. 800efec: 58000c00 .word 0x58000c00
  34499. 0800eff0 <UART_RxISR_8BIT_FIFOEN>:
  34500. * interruptions have been enabled by HAL_UART_Receive_IT()
  34501. * @param huart UART handle.
  34502. * @retval None
  34503. */
  34504. static void UART_RxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart)
  34505. {
  34506. 800eff0: b580 push {r7, lr}
  34507. 800eff2: b0ac sub sp, #176 @ 0xb0
  34508. 800eff4: af00 add r7, sp, #0
  34509. 800eff6: 6078 str r0, [r7, #4]
  34510. uint16_t uhMask = huart->Mask;
  34511. 800eff8: 687b ldr r3, [r7, #4]
  34512. 800effa: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  34513. 800effe: f8a7 30aa strh.w r3, [r7, #170] @ 0xaa
  34514. uint16_t uhdata;
  34515. uint16_t nb_rx_data;
  34516. uint16_t rxdatacount;
  34517. uint32_t isrflags = READ_REG(huart->Instance->ISR);
  34518. 800f002: 687b ldr r3, [r7, #4]
  34519. 800f004: 681b ldr r3, [r3, #0]
  34520. 800f006: 69db ldr r3, [r3, #28]
  34521. 800f008: f8c7 30ac str.w r3, [r7, #172] @ 0xac
  34522. uint32_t cr1its = READ_REG(huart->Instance->CR1);
  34523. 800f00c: 687b ldr r3, [r7, #4]
  34524. 800f00e: 681b ldr r3, [r3, #0]
  34525. 800f010: 681b ldr r3, [r3, #0]
  34526. 800f012: f8c7 30a4 str.w r3, [r7, #164] @ 0xa4
  34527. uint32_t cr3its = READ_REG(huart->Instance->CR3);
  34528. 800f016: 687b ldr r3, [r7, #4]
  34529. 800f018: 681b ldr r3, [r3, #0]
  34530. 800f01a: 689b ldr r3, [r3, #8]
  34531. 800f01c: f8c7 30a0 str.w r3, [r7, #160] @ 0xa0
  34532. /* Check that a Rx process is ongoing */
  34533. if (huart->RxState == HAL_UART_STATE_BUSY_RX)
  34534. 800f020: 687b ldr r3, [r7, #4]
  34535. 800f022: f8d3 308c ldr.w r3, [r3, #140] @ 0x8c
  34536. 800f026: 2b22 cmp r3, #34 @ 0x22
  34537. 800f028: f040 8180 bne.w 800f32c <UART_RxISR_8BIT_FIFOEN+0x33c>
  34538. {
  34539. nb_rx_data = huart->NbRxDataToProcess;
  34540. 800f02c: 687b ldr r3, [r7, #4]
  34541. 800f02e: f8b3 3068 ldrh.w r3, [r3, #104] @ 0x68
  34542. 800f032: f8a7 309e strh.w r3, [r7, #158] @ 0x9e
  34543. while ((nb_rx_data > 0U) && ((isrflags & USART_ISR_RXNE_RXFNE) != 0U))
  34544. 800f036: e123 b.n 800f280 <UART_RxISR_8BIT_FIFOEN+0x290>
  34545. {
  34546. uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
  34547. 800f038: 687b ldr r3, [r7, #4]
  34548. 800f03a: 681b ldr r3, [r3, #0]
  34549. 800f03c: 6a5b ldr r3, [r3, #36] @ 0x24
  34550. 800f03e: f8a7 309c strh.w r3, [r7, #156] @ 0x9c
  34551. *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
  34552. 800f042: f8b7 309c ldrh.w r3, [r7, #156] @ 0x9c
  34553. 800f046: b2d9 uxtb r1, r3
  34554. 800f048: f8b7 30aa ldrh.w r3, [r7, #170] @ 0xaa
  34555. 800f04c: b2da uxtb r2, r3
  34556. 800f04e: 687b ldr r3, [r7, #4]
  34557. 800f050: 6d9b ldr r3, [r3, #88] @ 0x58
  34558. 800f052: 400a ands r2, r1
  34559. 800f054: b2d2 uxtb r2, r2
  34560. 800f056: 701a strb r2, [r3, #0]
  34561. huart->pRxBuffPtr++;
  34562. 800f058: 687b ldr r3, [r7, #4]
  34563. 800f05a: 6d9b ldr r3, [r3, #88] @ 0x58
  34564. 800f05c: 1c5a adds r2, r3, #1
  34565. 800f05e: 687b ldr r3, [r7, #4]
  34566. 800f060: 659a str r2, [r3, #88] @ 0x58
  34567. huart->RxXferCount--;
  34568. 800f062: 687b ldr r3, [r7, #4]
  34569. 800f064: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  34570. 800f068: b29b uxth r3, r3
  34571. 800f06a: 3b01 subs r3, #1
  34572. 800f06c: b29a uxth r2, r3
  34573. 800f06e: 687b ldr r3, [r7, #4]
  34574. 800f070: f8a3 205e strh.w r2, [r3, #94] @ 0x5e
  34575. isrflags = READ_REG(huart->Instance->ISR);
  34576. 800f074: 687b ldr r3, [r7, #4]
  34577. 800f076: 681b ldr r3, [r3, #0]
  34578. 800f078: 69db ldr r3, [r3, #28]
  34579. 800f07a: f8c7 30ac str.w r3, [r7, #172] @ 0xac
  34580. /* If some non blocking errors occurred */
  34581. if ((isrflags & (USART_ISR_PE | USART_ISR_FE | USART_ISR_NE)) != 0U)
  34582. 800f07e: f8d7 30ac ldr.w r3, [r7, #172] @ 0xac
  34583. 800f082: f003 0307 and.w r3, r3, #7
  34584. 800f086: 2b00 cmp r3, #0
  34585. 800f088: d053 beq.n 800f132 <UART_RxISR_8BIT_FIFOEN+0x142>
  34586. {
  34587. /* UART parity error interrupt occurred -------------------------------------*/
  34588. if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
  34589. 800f08a: f8d7 30ac ldr.w r3, [r7, #172] @ 0xac
  34590. 800f08e: f003 0301 and.w r3, r3, #1
  34591. 800f092: 2b00 cmp r3, #0
  34592. 800f094: d011 beq.n 800f0ba <UART_RxISR_8BIT_FIFOEN+0xca>
  34593. 800f096: f8d7 30a4 ldr.w r3, [r7, #164] @ 0xa4
  34594. 800f09a: f403 7380 and.w r3, r3, #256 @ 0x100
  34595. 800f09e: 2b00 cmp r3, #0
  34596. 800f0a0: d00b beq.n 800f0ba <UART_RxISR_8BIT_FIFOEN+0xca>
  34597. {
  34598. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);
  34599. 800f0a2: 687b ldr r3, [r7, #4]
  34600. 800f0a4: 681b ldr r3, [r3, #0]
  34601. 800f0a6: 2201 movs r2, #1
  34602. 800f0a8: 621a str r2, [r3, #32]
  34603. huart->ErrorCode |= HAL_UART_ERROR_PE;
  34604. 800f0aa: 687b ldr r3, [r7, #4]
  34605. 800f0ac: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  34606. 800f0b0: f043 0201 orr.w r2, r3, #1
  34607. 800f0b4: 687b ldr r3, [r7, #4]
  34608. 800f0b6: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  34609. }
  34610. /* UART frame error interrupt occurred --------------------------------------*/
  34611. if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
  34612. 800f0ba: f8d7 30ac ldr.w r3, [r7, #172] @ 0xac
  34613. 800f0be: f003 0302 and.w r3, r3, #2
  34614. 800f0c2: 2b00 cmp r3, #0
  34615. 800f0c4: d011 beq.n 800f0ea <UART_RxISR_8BIT_FIFOEN+0xfa>
  34616. 800f0c6: f8d7 30a0 ldr.w r3, [r7, #160] @ 0xa0
  34617. 800f0ca: f003 0301 and.w r3, r3, #1
  34618. 800f0ce: 2b00 cmp r3, #0
  34619. 800f0d0: d00b beq.n 800f0ea <UART_RxISR_8BIT_FIFOEN+0xfa>
  34620. {
  34621. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
  34622. 800f0d2: 687b ldr r3, [r7, #4]
  34623. 800f0d4: 681b ldr r3, [r3, #0]
  34624. 800f0d6: 2202 movs r2, #2
  34625. 800f0d8: 621a str r2, [r3, #32]
  34626. huart->ErrorCode |= HAL_UART_ERROR_FE;
  34627. 800f0da: 687b ldr r3, [r7, #4]
  34628. 800f0dc: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  34629. 800f0e0: f043 0204 orr.w r2, r3, #4
  34630. 800f0e4: 687b ldr r3, [r7, #4]
  34631. 800f0e6: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  34632. }
  34633. /* UART noise error interrupt occurred --------------------------------------*/
  34634. if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
  34635. 800f0ea: f8d7 30ac ldr.w r3, [r7, #172] @ 0xac
  34636. 800f0ee: f003 0304 and.w r3, r3, #4
  34637. 800f0f2: 2b00 cmp r3, #0
  34638. 800f0f4: d011 beq.n 800f11a <UART_RxISR_8BIT_FIFOEN+0x12a>
  34639. 800f0f6: f8d7 30a0 ldr.w r3, [r7, #160] @ 0xa0
  34640. 800f0fa: f003 0301 and.w r3, r3, #1
  34641. 800f0fe: 2b00 cmp r3, #0
  34642. 800f100: d00b beq.n 800f11a <UART_RxISR_8BIT_FIFOEN+0x12a>
  34643. {
  34644. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);
  34645. 800f102: 687b ldr r3, [r7, #4]
  34646. 800f104: 681b ldr r3, [r3, #0]
  34647. 800f106: 2204 movs r2, #4
  34648. 800f108: 621a str r2, [r3, #32]
  34649. huart->ErrorCode |= HAL_UART_ERROR_NE;
  34650. 800f10a: 687b ldr r3, [r7, #4]
  34651. 800f10c: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  34652. 800f110: f043 0202 orr.w r2, r3, #2
  34653. 800f114: 687b ldr r3, [r7, #4]
  34654. 800f116: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  34655. }
  34656. /* Call UART Error Call back function if need be ----------------------------*/
  34657. if (huart->ErrorCode != HAL_UART_ERROR_NONE)
  34658. 800f11a: 687b ldr r3, [r7, #4]
  34659. 800f11c: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  34660. 800f120: 2b00 cmp r3, #0
  34661. 800f122: d006 beq.n 800f132 <UART_RxISR_8BIT_FIFOEN+0x142>
  34662. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  34663. /*Call registered error callback*/
  34664. huart->ErrorCallback(huart);
  34665. #else
  34666. /*Call legacy weak error callback*/
  34667. HAL_UART_ErrorCallback(huart);
  34668. 800f124: 6878 ldr r0, [r7, #4]
  34669. 800f126: f7fe fb13 bl 800d750 <HAL_UART_ErrorCallback>
  34670. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
  34671. huart->ErrorCode = HAL_UART_ERROR_NONE;
  34672. 800f12a: 687b ldr r3, [r7, #4]
  34673. 800f12c: 2200 movs r2, #0
  34674. 800f12e: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  34675. }
  34676. }
  34677. if (huart->RxXferCount == 0U)
  34678. 800f132: 687b ldr r3, [r7, #4]
  34679. 800f134: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  34680. 800f138: b29b uxth r3, r3
  34681. 800f13a: 2b00 cmp r3, #0
  34682. 800f13c: f040 80a0 bne.w 800f280 <UART_RxISR_8BIT_FIFOEN+0x290>
  34683. {
  34684. /* Disable the UART Parity Error Interrupt and RXFT interrupt*/
  34685. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
  34686. 800f140: 687b ldr r3, [r7, #4]
  34687. 800f142: 681b ldr r3, [r3, #0]
  34688. 800f144: 673b str r3, [r7, #112] @ 0x70
  34689. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34690. 800f146: 6f3b ldr r3, [r7, #112] @ 0x70
  34691. 800f148: e853 3f00 ldrex r3, [r3]
  34692. 800f14c: 66fb str r3, [r7, #108] @ 0x6c
  34693. return(result);
  34694. 800f14e: 6efb ldr r3, [r7, #108] @ 0x6c
  34695. 800f150: f423 7380 bic.w r3, r3, #256 @ 0x100
  34696. 800f154: f8c7 3098 str.w r3, [r7, #152] @ 0x98
  34697. 800f158: 687b ldr r3, [r7, #4]
  34698. 800f15a: 681b ldr r3, [r3, #0]
  34699. 800f15c: 461a mov r2, r3
  34700. 800f15e: f8d7 3098 ldr.w r3, [r7, #152] @ 0x98
  34701. 800f162: 67fb str r3, [r7, #124] @ 0x7c
  34702. 800f164: 67ba str r2, [r7, #120] @ 0x78
  34703. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34704. 800f166: 6fb9 ldr r1, [r7, #120] @ 0x78
  34705. 800f168: 6ffa ldr r2, [r7, #124] @ 0x7c
  34706. 800f16a: e841 2300 strex r3, r2, [r1]
  34707. 800f16e: 677b str r3, [r7, #116] @ 0x74
  34708. return(result);
  34709. 800f170: 6f7b ldr r3, [r7, #116] @ 0x74
  34710. 800f172: 2b00 cmp r3, #0
  34711. 800f174: d1e4 bne.n 800f140 <UART_RxISR_8BIT_FIFOEN+0x150>
  34712. /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error)
  34713. and RX FIFO Threshold interrupt */
  34714. ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
  34715. 800f176: 687b ldr r3, [r7, #4]
  34716. 800f178: 681b ldr r3, [r3, #0]
  34717. 800f17a: 3308 adds r3, #8
  34718. 800f17c: 65fb str r3, [r7, #92] @ 0x5c
  34719. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34720. 800f17e: 6dfb ldr r3, [r7, #92] @ 0x5c
  34721. 800f180: e853 3f00 ldrex r3, [r3]
  34722. 800f184: 65bb str r3, [r7, #88] @ 0x58
  34723. return(result);
  34724. 800f186: 6dba ldr r2, [r7, #88] @ 0x58
  34725. 800f188: 4b6e ldr r3, [pc, #440] @ (800f344 <UART_RxISR_8BIT_FIFOEN+0x354>)
  34726. 800f18a: 4013 ands r3, r2
  34727. 800f18c: f8c7 3094 str.w r3, [r7, #148] @ 0x94
  34728. 800f190: 687b ldr r3, [r7, #4]
  34729. 800f192: 681b ldr r3, [r3, #0]
  34730. 800f194: 3308 adds r3, #8
  34731. 800f196: f8d7 2094 ldr.w r2, [r7, #148] @ 0x94
  34732. 800f19a: 66ba str r2, [r7, #104] @ 0x68
  34733. 800f19c: 667b str r3, [r7, #100] @ 0x64
  34734. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34735. 800f19e: 6e79 ldr r1, [r7, #100] @ 0x64
  34736. 800f1a0: 6eba ldr r2, [r7, #104] @ 0x68
  34737. 800f1a2: e841 2300 strex r3, r2, [r1]
  34738. 800f1a6: 663b str r3, [r7, #96] @ 0x60
  34739. return(result);
  34740. 800f1a8: 6e3b ldr r3, [r7, #96] @ 0x60
  34741. 800f1aa: 2b00 cmp r3, #0
  34742. 800f1ac: d1e3 bne.n 800f176 <UART_RxISR_8BIT_FIFOEN+0x186>
  34743. /* Rx process is completed, restore huart->RxState to Ready */
  34744. huart->RxState = HAL_UART_STATE_READY;
  34745. 800f1ae: 687b ldr r3, [r7, #4]
  34746. 800f1b0: 2220 movs r2, #32
  34747. 800f1b2: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  34748. /* Clear RxISR function pointer */
  34749. huart->RxISR = NULL;
  34750. 800f1b6: 687b ldr r3, [r7, #4]
  34751. 800f1b8: 2200 movs r2, #0
  34752. 800f1ba: 675a str r2, [r3, #116] @ 0x74
  34753. /* Initialize type of RxEvent to Transfer Complete */
  34754. huart->RxEventType = HAL_UART_RXEVENT_TC;
  34755. 800f1bc: 687b ldr r3, [r7, #4]
  34756. 800f1be: 2200 movs r2, #0
  34757. 800f1c0: 671a str r2, [r3, #112] @ 0x70
  34758. if (!(IS_LPUART_INSTANCE(huart->Instance)))
  34759. 800f1c2: 687b ldr r3, [r7, #4]
  34760. 800f1c4: 681b ldr r3, [r3, #0]
  34761. 800f1c6: 4a60 ldr r2, [pc, #384] @ (800f348 <UART_RxISR_8BIT_FIFOEN+0x358>)
  34762. 800f1c8: 4293 cmp r3, r2
  34763. 800f1ca: d021 beq.n 800f210 <UART_RxISR_8BIT_FIFOEN+0x220>
  34764. {
  34765. /* Check that USART RTOEN bit is set */
  34766. if (READ_BIT(huart->Instance->CR2, USART_CR2_RTOEN) != 0U)
  34767. 800f1cc: 687b ldr r3, [r7, #4]
  34768. 800f1ce: 681b ldr r3, [r3, #0]
  34769. 800f1d0: 685b ldr r3, [r3, #4]
  34770. 800f1d2: f403 0300 and.w r3, r3, #8388608 @ 0x800000
  34771. 800f1d6: 2b00 cmp r3, #0
  34772. 800f1d8: d01a beq.n 800f210 <UART_RxISR_8BIT_FIFOEN+0x220>
  34773. {
  34774. /* Enable the UART Receiver Timeout Interrupt */
  34775. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_RTOIE);
  34776. 800f1da: 687b ldr r3, [r7, #4]
  34777. 800f1dc: 681b ldr r3, [r3, #0]
  34778. 800f1de: 64bb str r3, [r7, #72] @ 0x48
  34779. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34780. 800f1e0: 6cbb ldr r3, [r7, #72] @ 0x48
  34781. 800f1e2: e853 3f00 ldrex r3, [r3]
  34782. 800f1e6: 647b str r3, [r7, #68] @ 0x44
  34783. return(result);
  34784. 800f1e8: 6c7b ldr r3, [r7, #68] @ 0x44
  34785. 800f1ea: f023 6380 bic.w r3, r3, #67108864 @ 0x4000000
  34786. 800f1ee: f8c7 3090 str.w r3, [r7, #144] @ 0x90
  34787. 800f1f2: 687b ldr r3, [r7, #4]
  34788. 800f1f4: 681b ldr r3, [r3, #0]
  34789. 800f1f6: 461a mov r2, r3
  34790. 800f1f8: f8d7 3090 ldr.w r3, [r7, #144] @ 0x90
  34791. 800f1fc: 657b str r3, [r7, #84] @ 0x54
  34792. 800f1fe: 653a str r2, [r7, #80] @ 0x50
  34793. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34794. 800f200: 6d39 ldr r1, [r7, #80] @ 0x50
  34795. 800f202: 6d7a ldr r2, [r7, #84] @ 0x54
  34796. 800f204: e841 2300 strex r3, r2, [r1]
  34797. 800f208: 64fb str r3, [r7, #76] @ 0x4c
  34798. return(result);
  34799. 800f20a: 6cfb ldr r3, [r7, #76] @ 0x4c
  34800. 800f20c: 2b00 cmp r3, #0
  34801. 800f20e: d1e4 bne.n 800f1da <UART_RxISR_8BIT_FIFOEN+0x1ea>
  34802. }
  34803. }
  34804. /* Check current reception Mode :
  34805. If Reception till IDLE event has been selected : */
  34806. if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
  34807. 800f210: 687b ldr r3, [r7, #4]
  34808. 800f212: 6edb ldr r3, [r3, #108] @ 0x6c
  34809. 800f214: 2b01 cmp r3, #1
  34810. 800f216: d130 bne.n 800f27a <UART_RxISR_8BIT_FIFOEN+0x28a>
  34811. {
  34812. /* Set reception type to Standard */
  34813. huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;
  34814. 800f218: 687b ldr r3, [r7, #4]
  34815. 800f21a: 2200 movs r2, #0
  34816. 800f21c: 66da str r2, [r3, #108] @ 0x6c
  34817. /* Disable IDLE interrupt */
  34818. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
  34819. 800f21e: 687b ldr r3, [r7, #4]
  34820. 800f220: 681b ldr r3, [r3, #0]
  34821. 800f222: 637b str r3, [r7, #52] @ 0x34
  34822. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34823. 800f224: 6b7b ldr r3, [r7, #52] @ 0x34
  34824. 800f226: e853 3f00 ldrex r3, [r3]
  34825. 800f22a: 633b str r3, [r7, #48] @ 0x30
  34826. return(result);
  34827. 800f22c: 6b3b ldr r3, [r7, #48] @ 0x30
  34828. 800f22e: f023 0310 bic.w r3, r3, #16
  34829. 800f232: f8c7 308c str.w r3, [r7, #140] @ 0x8c
  34830. 800f236: 687b ldr r3, [r7, #4]
  34831. 800f238: 681b ldr r3, [r3, #0]
  34832. 800f23a: 461a mov r2, r3
  34833. 800f23c: f8d7 308c ldr.w r3, [r7, #140] @ 0x8c
  34834. 800f240: 643b str r3, [r7, #64] @ 0x40
  34835. 800f242: 63fa str r2, [r7, #60] @ 0x3c
  34836. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34837. 800f244: 6bf9 ldr r1, [r7, #60] @ 0x3c
  34838. 800f246: 6c3a ldr r2, [r7, #64] @ 0x40
  34839. 800f248: e841 2300 strex r3, r2, [r1]
  34840. 800f24c: 63bb str r3, [r7, #56] @ 0x38
  34841. return(result);
  34842. 800f24e: 6bbb ldr r3, [r7, #56] @ 0x38
  34843. 800f250: 2b00 cmp r3, #0
  34844. 800f252: d1e4 bne.n 800f21e <UART_RxISR_8BIT_FIFOEN+0x22e>
  34845. if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == SET)
  34846. 800f254: 687b ldr r3, [r7, #4]
  34847. 800f256: 681b ldr r3, [r3, #0]
  34848. 800f258: 69db ldr r3, [r3, #28]
  34849. 800f25a: f003 0310 and.w r3, r3, #16
  34850. 800f25e: 2b10 cmp r3, #16
  34851. 800f260: d103 bne.n 800f26a <UART_RxISR_8BIT_FIFOEN+0x27a>
  34852. {
  34853. /* Clear IDLE Flag */
  34854. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF);
  34855. 800f262: 687b ldr r3, [r7, #4]
  34856. 800f264: 681b ldr r3, [r3, #0]
  34857. 800f266: 2210 movs r2, #16
  34858. 800f268: 621a str r2, [r3, #32]
  34859. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  34860. /*Call registered Rx Event callback*/
  34861. huart->RxEventCallback(huart, huart->RxXferSize);
  34862. #else
  34863. /*Call legacy weak Rx Event callback*/
  34864. HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize);
  34865. 800f26a: 687b ldr r3, [r7, #4]
  34866. 800f26c: f8b3 305c ldrh.w r3, [r3, #92] @ 0x5c
  34867. 800f270: 4619 mov r1, r3
  34868. 800f272: 6878 ldr r0, [r7, #4]
  34869. 800f274: f7f4 fec6 bl 8004004 <HAL_UARTEx_RxEventCallback>
  34870. 800f278: e002 b.n 800f280 <UART_RxISR_8BIT_FIFOEN+0x290>
  34871. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  34872. /*Call registered Rx complete callback*/
  34873. huart->RxCpltCallback(huart);
  34874. #else
  34875. /*Call legacy weak Rx complete callback*/
  34876. HAL_UART_RxCpltCallback(huart);
  34877. 800f27a: 6878 ldr r0, [r7, #4]
  34878. 800f27c: f7f4 feb8 bl 8003ff0 <HAL_UART_RxCpltCallback>
  34879. while ((nb_rx_data > 0U) && ((isrflags & USART_ISR_RXNE_RXFNE) != 0U))
  34880. 800f280: f8b7 309e ldrh.w r3, [r7, #158] @ 0x9e
  34881. 800f284: 2b00 cmp r3, #0
  34882. 800f286: d006 beq.n 800f296 <UART_RxISR_8BIT_FIFOEN+0x2a6>
  34883. 800f288: f8d7 30ac ldr.w r3, [r7, #172] @ 0xac
  34884. 800f28c: f003 0320 and.w r3, r3, #32
  34885. 800f290: 2b00 cmp r3, #0
  34886. 800f292: f47f aed1 bne.w 800f038 <UART_RxISR_8BIT_FIFOEN+0x48>
  34887. /* When remaining number of bytes to receive is less than the RX FIFO
  34888. threshold, next incoming frames are processed as if FIFO mode was
  34889. disabled (i.e. one interrupt per received frame).
  34890. */
  34891. rxdatacount = huart->RxXferCount;
  34892. 800f296: 687b ldr r3, [r7, #4]
  34893. 800f298: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  34894. 800f29c: f8a7 308a strh.w r3, [r7, #138] @ 0x8a
  34895. if ((rxdatacount != 0U) && (rxdatacount < huart->NbRxDataToProcess))
  34896. 800f2a0: f8b7 308a ldrh.w r3, [r7, #138] @ 0x8a
  34897. 800f2a4: 2b00 cmp r3, #0
  34898. 800f2a6: d049 beq.n 800f33c <UART_RxISR_8BIT_FIFOEN+0x34c>
  34899. 800f2a8: 687b ldr r3, [r7, #4]
  34900. 800f2aa: f8b3 3068 ldrh.w r3, [r3, #104] @ 0x68
  34901. 800f2ae: f8b7 208a ldrh.w r2, [r7, #138] @ 0x8a
  34902. 800f2b2: 429a cmp r2, r3
  34903. 800f2b4: d242 bcs.n 800f33c <UART_RxISR_8BIT_FIFOEN+0x34c>
  34904. {
  34905. /* Disable the UART RXFT interrupt*/
  34906. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);
  34907. 800f2b6: 687b ldr r3, [r7, #4]
  34908. 800f2b8: 681b ldr r3, [r3, #0]
  34909. 800f2ba: 3308 adds r3, #8
  34910. 800f2bc: 623b str r3, [r7, #32]
  34911. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34912. 800f2be: 6a3b ldr r3, [r7, #32]
  34913. 800f2c0: e853 3f00 ldrex r3, [r3]
  34914. 800f2c4: 61fb str r3, [r7, #28]
  34915. return(result);
  34916. 800f2c6: 69fb ldr r3, [r7, #28]
  34917. 800f2c8: f023 5380 bic.w r3, r3, #268435456 @ 0x10000000
  34918. 800f2cc: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  34919. 800f2d0: 687b ldr r3, [r7, #4]
  34920. 800f2d2: 681b ldr r3, [r3, #0]
  34921. 800f2d4: 3308 adds r3, #8
  34922. 800f2d6: f8d7 2084 ldr.w r2, [r7, #132] @ 0x84
  34923. 800f2da: 62fa str r2, [r7, #44] @ 0x2c
  34924. 800f2dc: 62bb str r3, [r7, #40] @ 0x28
  34925. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34926. 800f2de: 6ab9 ldr r1, [r7, #40] @ 0x28
  34927. 800f2e0: 6afa ldr r2, [r7, #44] @ 0x2c
  34928. 800f2e2: e841 2300 strex r3, r2, [r1]
  34929. 800f2e6: 627b str r3, [r7, #36] @ 0x24
  34930. return(result);
  34931. 800f2e8: 6a7b ldr r3, [r7, #36] @ 0x24
  34932. 800f2ea: 2b00 cmp r3, #0
  34933. 800f2ec: d1e3 bne.n 800f2b6 <UART_RxISR_8BIT_FIFOEN+0x2c6>
  34934. /* Update the RxISR function pointer */
  34935. huart->RxISR = UART_RxISR_8BIT;
  34936. 800f2ee: 687b ldr r3, [r7, #4]
  34937. 800f2f0: 4a16 ldr r2, [pc, #88] @ (800f34c <UART_RxISR_8BIT_FIFOEN+0x35c>)
  34938. 800f2f2: 675a str r2, [r3, #116] @ 0x74
  34939. /* Enable the UART Data Register Not Empty interrupt */
  34940. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
  34941. 800f2f4: 687b ldr r3, [r7, #4]
  34942. 800f2f6: 681b ldr r3, [r3, #0]
  34943. 800f2f8: 60fb str r3, [r7, #12]
  34944. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  34945. 800f2fa: 68fb ldr r3, [r7, #12]
  34946. 800f2fc: e853 3f00 ldrex r3, [r3]
  34947. 800f300: 60bb str r3, [r7, #8]
  34948. return(result);
  34949. 800f302: 68bb ldr r3, [r7, #8]
  34950. 800f304: f043 0320 orr.w r3, r3, #32
  34951. 800f308: f8c7 3080 str.w r3, [r7, #128] @ 0x80
  34952. 800f30c: 687b ldr r3, [r7, #4]
  34953. 800f30e: 681b ldr r3, [r3, #0]
  34954. 800f310: 461a mov r2, r3
  34955. 800f312: f8d7 3080 ldr.w r3, [r7, #128] @ 0x80
  34956. 800f316: 61bb str r3, [r7, #24]
  34957. 800f318: 617a str r2, [r7, #20]
  34958. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  34959. 800f31a: 6979 ldr r1, [r7, #20]
  34960. 800f31c: 69ba ldr r2, [r7, #24]
  34961. 800f31e: e841 2300 strex r3, r2, [r1]
  34962. 800f322: 613b str r3, [r7, #16]
  34963. return(result);
  34964. 800f324: 693b ldr r3, [r7, #16]
  34965. 800f326: 2b00 cmp r3, #0
  34966. 800f328: d1e4 bne.n 800f2f4 <UART_RxISR_8BIT_FIFOEN+0x304>
  34967. else
  34968. {
  34969. /* Clear RXNE interrupt flag */
  34970. __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  34971. }
  34972. }
  34973. 800f32a: e007 b.n 800f33c <UART_RxISR_8BIT_FIFOEN+0x34c>
  34974. __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  34975. 800f32c: 687b ldr r3, [r7, #4]
  34976. 800f32e: 681b ldr r3, [r3, #0]
  34977. 800f330: 699a ldr r2, [r3, #24]
  34978. 800f332: 687b ldr r3, [r7, #4]
  34979. 800f334: 681b ldr r3, [r3, #0]
  34980. 800f336: f042 0208 orr.w r2, r2, #8
  34981. 800f33a: 619a str r2, [r3, #24]
  34982. }
  34983. 800f33c: bf00 nop
  34984. 800f33e: 37b0 adds r7, #176 @ 0xb0
  34985. 800f340: 46bd mov sp, r7
  34986. 800f342: bd80 pop {r7, pc}
  34987. 800f344: effffffe .word 0xeffffffe
  34988. 800f348: 58000c00 .word 0x58000c00
  34989. 800f34c: 0800ec81 .word 0x0800ec81
  34990. 0800f350 <UART_RxISR_16BIT_FIFOEN>:
  34991. * interruptions have been enabled by HAL_UART_Receive_IT()
  34992. * @param huart UART handle.
  34993. * @retval None
  34994. */
  34995. static void UART_RxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart)
  34996. {
  34997. 800f350: b580 push {r7, lr}
  34998. 800f352: b0ae sub sp, #184 @ 0xb8
  34999. 800f354: af00 add r7, sp, #0
  35000. 800f356: 6078 str r0, [r7, #4]
  35001. uint16_t *tmp;
  35002. uint16_t uhMask = huart->Mask;
  35003. 800f358: 687b ldr r3, [r7, #4]
  35004. 800f35a: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  35005. 800f35e: f8a7 30b2 strh.w r3, [r7, #178] @ 0xb2
  35006. uint16_t uhdata;
  35007. uint16_t nb_rx_data;
  35008. uint16_t rxdatacount;
  35009. uint32_t isrflags = READ_REG(huart->Instance->ISR);
  35010. 800f362: 687b ldr r3, [r7, #4]
  35011. 800f364: 681b ldr r3, [r3, #0]
  35012. 800f366: 69db ldr r3, [r3, #28]
  35013. 800f368: f8c7 30b4 str.w r3, [r7, #180] @ 0xb4
  35014. uint32_t cr1its = READ_REG(huart->Instance->CR1);
  35015. 800f36c: 687b ldr r3, [r7, #4]
  35016. 800f36e: 681b ldr r3, [r3, #0]
  35017. 800f370: 681b ldr r3, [r3, #0]
  35018. 800f372: f8c7 30ac str.w r3, [r7, #172] @ 0xac
  35019. uint32_t cr3its = READ_REG(huart->Instance->CR3);
  35020. 800f376: 687b ldr r3, [r7, #4]
  35021. 800f378: 681b ldr r3, [r3, #0]
  35022. 800f37a: 689b ldr r3, [r3, #8]
  35023. 800f37c: f8c7 30a8 str.w r3, [r7, #168] @ 0xa8
  35024. /* Check that a Rx process is ongoing */
  35025. if (huart->RxState == HAL_UART_STATE_BUSY_RX)
  35026. 800f380: 687b ldr r3, [r7, #4]
  35027. 800f382: f8d3 308c ldr.w r3, [r3, #140] @ 0x8c
  35028. 800f386: 2b22 cmp r3, #34 @ 0x22
  35029. 800f388: f040 8184 bne.w 800f694 <UART_RxISR_16BIT_FIFOEN+0x344>
  35030. {
  35031. nb_rx_data = huart->NbRxDataToProcess;
  35032. 800f38c: 687b ldr r3, [r7, #4]
  35033. 800f38e: f8b3 3068 ldrh.w r3, [r3, #104] @ 0x68
  35034. 800f392: f8a7 30a6 strh.w r3, [r7, #166] @ 0xa6
  35035. while ((nb_rx_data > 0U) && ((isrflags & USART_ISR_RXNE_RXFNE) != 0U))
  35036. 800f396: e127 b.n 800f5e8 <UART_RxISR_16BIT_FIFOEN+0x298>
  35037. {
  35038. uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
  35039. 800f398: 687b ldr r3, [r7, #4]
  35040. 800f39a: 681b ldr r3, [r3, #0]
  35041. 800f39c: 6a5b ldr r3, [r3, #36] @ 0x24
  35042. 800f39e: f8a7 30a4 strh.w r3, [r7, #164] @ 0xa4
  35043. tmp = (uint16_t *) huart->pRxBuffPtr ;
  35044. 800f3a2: 687b ldr r3, [r7, #4]
  35045. 800f3a4: 6d9b ldr r3, [r3, #88] @ 0x58
  35046. 800f3a6: f8c7 30a0 str.w r3, [r7, #160] @ 0xa0
  35047. *tmp = (uint16_t)(uhdata & uhMask);
  35048. 800f3aa: f8b7 20a4 ldrh.w r2, [r7, #164] @ 0xa4
  35049. 800f3ae: f8b7 30b2 ldrh.w r3, [r7, #178] @ 0xb2
  35050. 800f3b2: 4013 ands r3, r2
  35051. 800f3b4: b29a uxth r2, r3
  35052. 800f3b6: f8d7 30a0 ldr.w r3, [r7, #160] @ 0xa0
  35053. 800f3ba: 801a strh r2, [r3, #0]
  35054. huart->pRxBuffPtr += 2U;
  35055. 800f3bc: 687b ldr r3, [r7, #4]
  35056. 800f3be: 6d9b ldr r3, [r3, #88] @ 0x58
  35057. 800f3c0: 1c9a adds r2, r3, #2
  35058. 800f3c2: 687b ldr r3, [r7, #4]
  35059. 800f3c4: 659a str r2, [r3, #88] @ 0x58
  35060. huart->RxXferCount--;
  35061. 800f3c6: 687b ldr r3, [r7, #4]
  35062. 800f3c8: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  35063. 800f3cc: b29b uxth r3, r3
  35064. 800f3ce: 3b01 subs r3, #1
  35065. 800f3d0: b29a uxth r2, r3
  35066. 800f3d2: 687b ldr r3, [r7, #4]
  35067. 800f3d4: f8a3 205e strh.w r2, [r3, #94] @ 0x5e
  35068. isrflags = READ_REG(huart->Instance->ISR);
  35069. 800f3d8: 687b ldr r3, [r7, #4]
  35070. 800f3da: 681b ldr r3, [r3, #0]
  35071. 800f3dc: 69db ldr r3, [r3, #28]
  35072. 800f3de: f8c7 30b4 str.w r3, [r7, #180] @ 0xb4
  35073. /* If some non blocking errors occurred */
  35074. if ((isrflags & (USART_ISR_PE | USART_ISR_FE | USART_ISR_NE)) != 0U)
  35075. 800f3e2: f8d7 30b4 ldr.w r3, [r7, #180] @ 0xb4
  35076. 800f3e6: f003 0307 and.w r3, r3, #7
  35077. 800f3ea: 2b00 cmp r3, #0
  35078. 800f3ec: d053 beq.n 800f496 <UART_RxISR_16BIT_FIFOEN+0x146>
  35079. {
  35080. /* UART parity error interrupt occurred -------------------------------------*/
  35081. if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
  35082. 800f3ee: f8d7 30b4 ldr.w r3, [r7, #180] @ 0xb4
  35083. 800f3f2: f003 0301 and.w r3, r3, #1
  35084. 800f3f6: 2b00 cmp r3, #0
  35085. 800f3f8: d011 beq.n 800f41e <UART_RxISR_16BIT_FIFOEN+0xce>
  35086. 800f3fa: f8d7 30ac ldr.w r3, [r7, #172] @ 0xac
  35087. 800f3fe: f403 7380 and.w r3, r3, #256 @ 0x100
  35088. 800f402: 2b00 cmp r3, #0
  35089. 800f404: d00b beq.n 800f41e <UART_RxISR_16BIT_FIFOEN+0xce>
  35090. {
  35091. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);
  35092. 800f406: 687b ldr r3, [r7, #4]
  35093. 800f408: 681b ldr r3, [r3, #0]
  35094. 800f40a: 2201 movs r2, #1
  35095. 800f40c: 621a str r2, [r3, #32]
  35096. huart->ErrorCode |= HAL_UART_ERROR_PE;
  35097. 800f40e: 687b ldr r3, [r7, #4]
  35098. 800f410: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  35099. 800f414: f043 0201 orr.w r2, r3, #1
  35100. 800f418: 687b ldr r3, [r7, #4]
  35101. 800f41a: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  35102. }
  35103. /* UART frame error interrupt occurred --------------------------------------*/
  35104. if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
  35105. 800f41e: f8d7 30b4 ldr.w r3, [r7, #180] @ 0xb4
  35106. 800f422: f003 0302 and.w r3, r3, #2
  35107. 800f426: 2b00 cmp r3, #0
  35108. 800f428: d011 beq.n 800f44e <UART_RxISR_16BIT_FIFOEN+0xfe>
  35109. 800f42a: f8d7 30a8 ldr.w r3, [r7, #168] @ 0xa8
  35110. 800f42e: f003 0301 and.w r3, r3, #1
  35111. 800f432: 2b00 cmp r3, #0
  35112. 800f434: d00b beq.n 800f44e <UART_RxISR_16BIT_FIFOEN+0xfe>
  35113. {
  35114. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
  35115. 800f436: 687b ldr r3, [r7, #4]
  35116. 800f438: 681b ldr r3, [r3, #0]
  35117. 800f43a: 2202 movs r2, #2
  35118. 800f43c: 621a str r2, [r3, #32]
  35119. huart->ErrorCode |= HAL_UART_ERROR_FE;
  35120. 800f43e: 687b ldr r3, [r7, #4]
  35121. 800f440: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  35122. 800f444: f043 0204 orr.w r2, r3, #4
  35123. 800f448: 687b ldr r3, [r7, #4]
  35124. 800f44a: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  35125. }
  35126. /* UART noise error interrupt occurred --------------------------------------*/
  35127. if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
  35128. 800f44e: f8d7 30b4 ldr.w r3, [r7, #180] @ 0xb4
  35129. 800f452: f003 0304 and.w r3, r3, #4
  35130. 800f456: 2b00 cmp r3, #0
  35131. 800f458: d011 beq.n 800f47e <UART_RxISR_16BIT_FIFOEN+0x12e>
  35132. 800f45a: f8d7 30a8 ldr.w r3, [r7, #168] @ 0xa8
  35133. 800f45e: f003 0301 and.w r3, r3, #1
  35134. 800f462: 2b00 cmp r3, #0
  35135. 800f464: d00b beq.n 800f47e <UART_RxISR_16BIT_FIFOEN+0x12e>
  35136. {
  35137. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);
  35138. 800f466: 687b ldr r3, [r7, #4]
  35139. 800f468: 681b ldr r3, [r3, #0]
  35140. 800f46a: 2204 movs r2, #4
  35141. 800f46c: 621a str r2, [r3, #32]
  35142. huart->ErrorCode |= HAL_UART_ERROR_NE;
  35143. 800f46e: 687b ldr r3, [r7, #4]
  35144. 800f470: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  35145. 800f474: f043 0202 orr.w r2, r3, #2
  35146. 800f478: 687b ldr r3, [r7, #4]
  35147. 800f47a: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  35148. }
  35149. /* Call UART Error Call back function if need be ----------------------------*/
  35150. if (huart->ErrorCode != HAL_UART_ERROR_NONE)
  35151. 800f47e: 687b ldr r3, [r7, #4]
  35152. 800f480: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  35153. 800f484: 2b00 cmp r3, #0
  35154. 800f486: d006 beq.n 800f496 <UART_RxISR_16BIT_FIFOEN+0x146>
  35155. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  35156. /*Call registered error callback*/
  35157. huart->ErrorCallback(huart);
  35158. #else
  35159. /*Call legacy weak error callback*/
  35160. HAL_UART_ErrorCallback(huart);
  35161. 800f488: 6878 ldr r0, [r7, #4]
  35162. 800f48a: f7fe f961 bl 800d750 <HAL_UART_ErrorCallback>
  35163. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
  35164. huart->ErrorCode = HAL_UART_ERROR_NONE;
  35165. 800f48e: 687b ldr r3, [r7, #4]
  35166. 800f490: 2200 movs r2, #0
  35167. 800f492: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  35168. }
  35169. }
  35170. if (huart->RxXferCount == 0U)
  35171. 800f496: 687b ldr r3, [r7, #4]
  35172. 800f498: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  35173. 800f49c: b29b uxth r3, r3
  35174. 800f49e: 2b00 cmp r3, #0
  35175. 800f4a0: f040 80a2 bne.w 800f5e8 <UART_RxISR_16BIT_FIFOEN+0x298>
  35176. {
  35177. /* Disable the UART Parity Error Interrupt and RXFT interrupt*/
  35178. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
  35179. 800f4a4: 687b ldr r3, [r7, #4]
  35180. 800f4a6: 681b ldr r3, [r3, #0]
  35181. 800f4a8: 677b str r3, [r7, #116] @ 0x74
  35182. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  35183. 800f4aa: 6f7b ldr r3, [r7, #116] @ 0x74
  35184. 800f4ac: e853 3f00 ldrex r3, [r3]
  35185. 800f4b0: 673b str r3, [r7, #112] @ 0x70
  35186. return(result);
  35187. 800f4b2: 6f3b ldr r3, [r7, #112] @ 0x70
  35188. 800f4b4: f423 7380 bic.w r3, r3, #256 @ 0x100
  35189. 800f4b8: f8c7 309c str.w r3, [r7, #156] @ 0x9c
  35190. 800f4bc: 687b ldr r3, [r7, #4]
  35191. 800f4be: 681b ldr r3, [r3, #0]
  35192. 800f4c0: 461a mov r2, r3
  35193. 800f4c2: f8d7 309c ldr.w r3, [r7, #156] @ 0x9c
  35194. 800f4c6: f8c7 3080 str.w r3, [r7, #128] @ 0x80
  35195. 800f4ca: 67fa str r2, [r7, #124] @ 0x7c
  35196. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  35197. 800f4cc: 6ff9 ldr r1, [r7, #124] @ 0x7c
  35198. 800f4ce: f8d7 2080 ldr.w r2, [r7, #128] @ 0x80
  35199. 800f4d2: e841 2300 strex r3, r2, [r1]
  35200. 800f4d6: 67bb str r3, [r7, #120] @ 0x78
  35201. return(result);
  35202. 800f4d8: 6fbb ldr r3, [r7, #120] @ 0x78
  35203. 800f4da: 2b00 cmp r3, #0
  35204. 800f4dc: d1e2 bne.n 800f4a4 <UART_RxISR_16BIT_FIFOEN+0x154>
  35205. /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error)
  35206. and RX FIFO Threshold interrupt */
  35207. ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
  35208. 800f4de: 687b ldr r3, [r7, #4]
  35209. 800f4e0: 681b ldr r3, [r3, #0]
  35210. 800f4e2: 3308 adds r3, #8
  35211. 800f4e4: 663b str r3, [r7, #96] @ 0x60
  35212. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  35213. 800f4e6: 6e3b ldr r3, [r7, #96] @ 0x60
  35214. 800f4e8: e853 3f00 ldrex r3, [r3]
  35215. 800f4ec: 65fb str r3, [r7, #92] @ 0x5c
  35216. return(result);
  35217. 800f4ee: 6dfa ldr r2, [r7, #92] @ 0x5c
  35218. 800f4f0: 4b6e ldr r3, [pc, #440] @ (800f6ac <UART_RxISR_16BIT_FIFOEN+0x35c>)
  35219. 800f4f2: 4013 ands r3, r2
  35220. 800f4f4: f8c7 3098 str.w r3, [r7, #152] @ 0x98
  35221. 800f4f8: 687b ldr r3, [r7, #4]
  35222. 800f4fa: 681b ldr r3, [r3, #0]
  35223. 800f4fc: 3308 adds r3, #8
  35224. 800f4fe: f8d7 2098 ldr.w r2, [r7, #152] @ 0x98
  35225. 800f502: 66fa str r2, [r7, #108] @ 0x6c
  35226. 800f504: 66bb str r3, [r7, #104] @ 0x68
  35227. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  35228. 800f506: 6eb9 ldr r1, [r7, #104] @ 0x68
  35229. 800f508: 6efa ldr r2, [r7, #108] @ 0x6c
  35230. 800f50a: e841 2300 strex r3, r2, [r1]
  35231. 800f50e: 667b str r3, [r7, #100] @ 0x64
  35232. return(result);
  35233. 800f510: 6e7b ldr r3, [r7, #100] @ 0x64
  35234. 800f512: 2b00 cmp r3, #0
  35235. 800f514: d1e3 bne.n 800f4de <UART_RxISR_16BIT_FIFOEN+0x18e>
  35236. /* Rx process is completed, restore huart->RxState to Ready */
  35237. huart->RxState = HAL_UART_STATE_READY;
  35238. 800f516: 687b ldr r3, [r7, #4]
  35239. 800f518: 2220 movs r2, #32
  35240. 800f51a: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  35241. /* Clear RxISR function pointer */
  35242. huart->RxISR = NULL;
  35243. 800f51e: 687b ldr r3, [r7, #4]
  35244. 800f520: 2200 movs r2, #0
  35245. 800f522: 675a str r2, [r3, #116] @ 0x74
  35246. /* Initialize type of RxEvent to Transfer Complete */
  35247. huart->RxEventType = HAL_UART_RXEVENT_TC;
  35248. 800f524: 687b ldr r3, [r7, #4]
  35249. 800f526: 2200 movs r2, #0
  35250. 800f528: 671a str r2, [r3, #112] @ 0x70
  35251. if (!(IS_LPUART_INSTANCE(huart->Instance)))
  35252. 800f52a: 687b ldr r3, [r7, #4]
  35253. 800f52c: 681b ldr r3, [r3, #0]
  35254. 800f52e: 4a60 ldr r2, [pc, #384] @ (800f6b0 <UART_RxISR_16BIT_FIFOEN+0x360>)
  35255. 800f530: 4293 cmp r3, r2
  35256. 800f532: d021 beq.n 800f578 <UART_RxISR_16BIT_FIFOEN+0x228>
  35257. {
  35258. /* Check that USART RTOEN bit is set */
  35259. if (READ_BIT(huart->Instance->CR2, USART_CR2_RTOEN) != 0U)
  35260. 800f534: 687b ldr r3, [r7, #4]
  35261. 800f536: 681b ldr r3, [r3, #0]
  35262. 800f538: 685b ldr r3, [r3, #4]
  35263. 800f53a: f403 0300 and.w r3, r3, #8388608 @ 0x800000
  35264. 800f53e: 2b00 cmp r3, #0
  35265. 800f540: d01a beq.n 800f578 <UART_RxISR_16BIT_FIFOEN+0x228>
  35266. {
  35267. /* Enable the UART Receiver Timeout Interrupt */
  35268. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_RTOIE);
  35269. 800f542: 687b ldr r3, [r7, #4]
  35270. 800f544: 681b ldr r3, [r3, #0]
  35271. 800f546: 64fb str r3, [r7, #76] @ 0x4c
  35272. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  35273. 800f548: 6cfb ldr r3, [r7, #76] @ 0x4c
  35274. 800f54a: e853 3f00 ldrex r3, [r3]
  35275. 800f54e: 64bb str r3, [r7, #72] @ 0x48
  35276. return(result);
  35277. 800f550: 6cbb ldr r3, [r7, #72] @ 0x48
  35278. 800f552: f023 6380 bic.w r3, r3, #67108864 @ 0x4000000
  35279. 800f556: f8c7 3094 str.w r3, [r7, #148] @ 0x94
  35280. 800f55a: 687b ldr r3, [r7, #4]
  35281. 800f55c: 681b ldr r3, [r3, #0]
  35282. 800f55e: 461a mov r2, r3
  35283. 800f560: f8d7 3094 ldr.w r3, [r7, #148] @ 0x94
  35284. 800f564: 65bb str r3, [r7, #88] @ 0x58
  35285. 800f566: 657a str r2, [r7, #84] @ 0x54
  35286. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  35287. 800f568: 6d79 ldr r1, [r7, #84] @ 0x54
  35288. 800f56a: 6dba ldr r2, [r7, #88] @ 0x58
  35289. 800f56c: e841 2300 strex r3, r2, [r1]
  35290. 800f570: 653b str r3, [r7, #80] @ 0x50
  35291. return(result);
  35292. 800f572: 6d3b ldr r3, [r7, #80] @ 0x50
  35293. 800f574: 2b00 cmp r3, #0
  35294. 800f576: d1e4 bne.n 800f542 <UART_RxISR_16BIT_FIFOEN+0x1f2>
  35295. }
  35296. }
  35297. /* Check current reception Mode :
  35298. If Reception till IDLE event has been selected : */
  35299. if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
  35300. 800f578: 687b ldr r3, [r7, #4]
  35301. 800f57a: 6edb ldr r3, [r3, #108] @ 0x6c
  35302. 800f57c: 2b01 cmp r3, #1
  35303. 800f57e: d130 bne.n 800f5e2 <UART_RxISR_16BIT_FIFOEN+0x292>
  35304. {
  35305. /* Set reception type to Standard */
  35306. huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;
  35307. 800f580: 687b ldr r3, [r7, #4]
  35308. 800f582: 2200 movs r2, #0
  35309. 800f584: 66da str r2, [r3, #108] @ 0x6c
  35310. /* Disable IDLE interrupt */
  35311. ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
  35312. 800f586: 687b ldr r3, [r7, #4]
  35313. 800f588: 681b ldr r3, [r3, #0]
  35314. 800f58a: 63bb str r3, [r7, #56] @ 0x38
  35315. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  35316. 800f58c: 6bbb ldr r3, [r7, #56] @ 0x38
  35317. 800f58e: e853 3f00 ldrex r3, [r3]
  35318. 800f592: 637b str r3, [r7, #52] @ 0x34
  35319. return(result);
  35320. 800f594: 6b7b ldr r3, [r7, #52] @ 0x34
  35321. 800f596: f023 0310 bic.w r3, r3, #16
  35322. 800f59a: f8c7 3090 str.w r3, [r7, #144] @ 0x90
  35323. 800f59e: 687b ldr r3, [r7, #4]
  35324. 800f5a0: 681b ldr r3, [r3, #0]
  35325. 800f5a2: 461a mov r2, r3
  35326. 800f5a4: f8d7 3090 ldr.w r3, [r7, #144] @ 0x90
  35327. 800f5a8: 647b str r3, [r7, #68] @ 0x44
  35328. 800f5aa: 643a str r2, [r7, #64] @ 0x40
  35329. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  35330. 800f5ac: 6c39 ldr r1, [r7, #64] @ 0x40
  35331. 800f5ae: 6c7a ldr r2, [r7, #68] @ 0x44
  35332. 800f5b0: e841 2300 strex r3, r2, [r1]
  35333. 800f5b4: 63fb str r3, [r7, #60] @ 0x3c
  35334. return(result);
  35335. 800f5b6: 6bfb ldr r3, [r7, #60] @ 0x3c
  35336. 800f5b8: 2b00 cmp r3, #0
  35337. 800f5ba: d1e4 bne.n 800f586 <UART_RxISR_16BIT_FIFOEN+0x236>
  35338. if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == SET)
  35339. 800f5bc: 687b ldr r3, [r7, #4]
  35340. 800f5be: 681b ldr r3, [r3, #0]
  35341. 800f5c0: 69db ldr r3, [r3, #28]
  35342. 800f5c2: f003 0310 and.w r3, r3, #16
  35343. 800f5c6: 2b10 cmp r3, #16
  35344. 800f5c8: d103 bne.n 800f5d2 <UART_RxISR_16BIT_FIFOEN+0x282>
  35345. {
  35346. /* Clear IDLE Flag */
  35347. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF);
  35348. 800f5ca: 687b ldr r3, [r7, #4]
  35349. 800f5cc: 681b ldr r3, [r3, #0]
  35350. 800f5ce: 2210 movs r2, #16
  35351. 800f5d0: 621a str r2, [r3, #32]
  35352. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  35353. /*Call registered Rx Event callback*/
  35354. huart->RxEventCallback(huart, huart->RxXferSize);
  35355. #else
  35356. /*Call legacy weak Rx Event callback*/
  35357. HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize);
  35358. 800f5d2: 687b ldr r3, [r7, #4]
  35359. 800f5d4: f8b3 305c ldrh.w r3, [r3, #92] @ 0x5c
  35360. 800f5d8: 4619 mov r1, r3
  35361. 800f5da: 6878 ldr r0, [r7, #4]
  35362. 800f5dc: f7f4 fd12 bl 8004004 <HAL_UARTEx_RxEventCallback>
  35363. 800f5e0: e002 b.n 800f5e8 <UART_RxISR_16BIT_FIFOEN+0x298>
  35364. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  35365. /*Call registered Rx complete callback*/
  35366. huart->RxCpltCallback(huart);
  35367. #else
  35368. /*Call legacy weak Rx complete callback*/
  35369. HAL_UART_RxCpltCallback(huart);
  35370. 800f5e2: 6878 ldr r0, [r7, #4]
  35371. 800f5e4: f7f4 fd04 bl 8003ff0 <HAL_UART_RxCpltCallback>
  35372. while ((nb_rx_data > 0U) && ((isrflags & USART_ISR_RXNE_RXFNE) != 0U))
  35373. 800f5e8: f8b7 30a6 ldrh.w r3, [r7, #166] @ 0xa6
  35374. 800f5ec: 2b00 cmp r3, #0
  35375. 800f5ee: d006 beq.n 800f5fe <UART_RxISR_16BIT_FIFOEN+0x2ae>
  35376. 800f5f0: f8d7 30b4 ldr.w r3, [r7, #180] @ 0xb4
  35377. 800f5f4: f003 0320 and.w r3, r3, #32
  35378. 800f5f8: 2b00 cmp r3, #0
  35379. 800f5fa: f47f aecd bne.w 800f398 <UART_RxISR_16BIT_FIFOEN+0x48>
  35380. /* When remaining number of bytes to receive is less than the RX FIFO
  35381. threshold, next incoming frames are processed as if FIFO mode was
  35382. disabled (i.e. one interrupt per received frame).
  35383. */
  35384. rxdatacount = huart->RxXferCount;
  35385. 800f5fe: 687b ldr r3, [r7, #4]
  35386. 800f600: f8b3 305e ldrh.w r3, [r3, #94] @ 0x5e
  35387. 800f604: f8a7 308e strh.w r3, [r7, #142] @ 0x8e
  35388. if ((rxdatacount != 0U) && (rxdatacount < huart->NbRxDataToProcess))
  35389. 800f608: f8b7 308e ldrh.w r3, [r7, #142] @ 0x8e
  35390. 800f60c: 2b00 cmp r3, #0
  35391. 800f60e: d049 beq.n 800f6a4 <UART_RxISR_16BIT_FIFOEN+0x354>
  35392. 800f610: 687b ldr r3, [r7, #4]
  35393. 800f612: f8b3 3068 ldrh.w r3, [r3, #104] @ 0x68
  35394. 800f616: f8b7 208e ldrh.w r2, [r7, #142] @ 0x8e
  35395. 800f61a: 429a cmp r2, r3
  35396. 800f61c: d242 bcs.n 800f6a4 <UART_RxISR_16BIT_FIFOEN+0x354>
  35397. {
  35398. /* Disable the UART RXFT interrupt*/
  35399. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);
  35400. 800f61e: 687b ldr r3, [r7, #4]
  35401. 800f620: 681b ldr r3, [r3, #0]
  35402. 800f622: 3308 adds r3, #8
  35403. 800f624: 627b str r3, [r7, #36] @ 0x24
  35404. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  35405. 800f626: 6a7b ldr r3, [r7, #36] @ 0x24
  35406. 800f628: e853 3f00 ldrex r3, [r3]
  35407. 800f62c: 623b str r3, [r7, #32]
  35408. return(result);
  35409. 800f62e: 6a3b ldr r3, [r7, #32]
  35410. 800f630: f023 5380 bic.w r3, r3, #268435456 @ 0x10000000
  35411. 800f634: f8c7 3088 str.w r3, [r7, #136] @ 0x88
  35412. 800f638: 687b ldr r3, [r7, #4]
  35413. 800f63a: 681b ldr r3, [r3, #0]
  35414. 800f63c: 3308 adds r3, #8
  35415. 800f63e: f8d7 2088 ldr.w r2, [r7, #136] @ 0x88
  35416. 800f642: 633a str r2, [r7, #48] @ 0x30
  35417. 800f644: 62fb str r3, [r7, #44] @ 0x2c
  35418. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  35419. 800f646: 6af9 ldr r1, [r7, #44] @ 0x2c
  35420. 800f648: 6b3a ldr r2, [r7, #48] @ 0x30
  35421. 800f64a: e841 2300 strex r3, r2, [r1]
  35422. 800f64e: 62bb str r3, [r7, #40] @ 0x28
  35423. return(result);
  35424. 800f650: 6abb ldr r3, [r7, #40] @ 0x28
  35425. 800f652: 2b00 cmp r3, #0
  35426. 800f654: d1e3 bne.n 800f61e <UART_RxISR_16BIT_FIFOEN+0x2ce>
  35427. /* Update the RxISR function pointer */
  35428. huart->RxISR = UART_RxISR_16BIT;
  35429. 800f656: 687b ldr r3, [r7, #4]
  35430. 800f658: 4a16 ldr r2, [pc, #88] @ (800f6b4 <UART_RxISR_16BIT_FIFOEN+0x364>)
  35431. 800f65a: 675a str r2, [r3, #116] @ 0x74
  35432. /* Enable the UART Data Register Not Empty interrupt */
  35433. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
  35434. 800f65c: 687b ldr r3, [r7, #4]
  35435. 800f65e: 681b ldr r3, [r3, #0]
  35436. 800f660: 613b str r3, [r7, #16]
  35437. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  35438. 800f662: 693b ldr r3, [r7, #16]
  35439. 800f664: e853 3f00 ldrex r3, [r3]
  35440. 800f668: 60fb str r3, [r7, #12]
  35441. return(result);
  35442. 800f66a: 68fb ldr r3, [r7, #12]
  35443. 800f66c: f043 0320 orr.w r3, r3, #32
  35444. 800f670: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  35445. 800f674: 687b ldr r3, [r7, #4]
  35446. 800f676: 681b ldr r3, [r3, #0]
  35447. 800f678: 461a mov r2, r3
  35448. 800f67a: f8d7 3084 ldr.w r3, [r7, #132] @ 0x84
  35449. 800f67e: 61fb str r3, [r7, #28]
  35450. 800f680: 61ba str r2, [r7, #24]
  35451. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  35452. 800f682: 69b9 ldr r1, [r7, #24]
  35453. 800f684: 69fa ldr r2, [r7, #28]
  35454. 800f686: e841 2300 strex r3, r2, [r1]
  35455. 800f68a: 617b str r3, [r7, #20]
  35456. return(result);
  35457. 800f68c: 697b ldr r3, [r7, #20]
  35458. 800f68e: 2b00 cmp r3, #0
  35459. 800f690: d1e4 bne.n 800f65c <UART_RxISR_16BIT_FIFOEN+0x30c>
  35460. else
  35461. {
  35462. /* Clear RXNE interrupt flag */
  35463. __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  35464. }
  35465. }
  35466. 800f692: e007 b.n 800f6a4 <UART_RxISR_16BIT_FIFOEN+0x354>
  35467. __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  35468. 800f694: 687b ldr r3, [r7, #4]
  35469. 800f696: 681b ldr r3, [r3, #0]
  35470. 800f698: 699a ldr r2, [r3, #24]
  35471. 800f69a: 687b ldr r3, [r7, #4]
  35472. 800f69c: 681b ldr r3, [r3, #0]
  35473. 800f69e: f042 0208 orr.w r2, r2, #8
  35474. 800f6a2: 619a str r2, [r3, #24]
  35475. }
  35476. 800f6a4: bf00 nop
  35477. 800f6a6: 37b8 adds r7, #184 @ 0xb8
  35478. 800f6a8: 46bd mov sp, r7
  35479. 800f6aa: bd80 pop {r7, pc}
  35480. 800f6ac: effffffe .word 0xeffffffe
  35481. 800f6b0: 58000c00 .word 0x58000c00
  35482. 800f6b4: 0800ee39 .word 0x0800ee39
  35483. 0800f6b8 <HAL_UARTEx_WakeupCallback>:
  35484. * @brief UART wakeup from Stop mode callback.
  35485. * @param huart UART handle.
  35486. * @retval None
  35487. */
  35488. __weak void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)
  35489. {
  35490. 800f6b8: b480 push {r7}
  35491. 800f6ba: b083 sub sp, #12
  35492. 800f6bc: af00 add r7, sp, #0
  35493. 800f6be: 6078 str r0, [r7, #4]
  35494. UNUSED(huart);
  35495. /* NOTE : This function should not be modified, when the callback is needed,
  35496. the HAL_UARTEx_WakeupCallback can be implemented in the user file.
  35497. */
  35498. }
  35499. 800f6c0: bf00 nop
  35500. 800f6c2: 370c adds r7, #12
  35501. 800f6c4: 46bd mov sp, r7
  35502. 800f6c6: f85d 7b04 ldr.w r7, [sp], #4
  35503. 800f6ca: 4770 bx lr
  35504. 0800f6cc <HAL_UARTEx_RxFifoFullCallback>:
  35505. * @brief UART RX Fifo full callback.
  35506. * @param huart UART handle.
  35507. * @retval None
  35508. */
  35509. __weak void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart)
  35510. {
  35511. 800f6cc: b480 push {r7}
  35512. 800f6ce: b083 sub sp, #12
  35513. 800f6d0: af00 add r7, sp, #0
  35514. 800f6d2: 6078 str r0, [r7, #4]
  35515. UNUSED(huart);
  35516. /* NOTE : This function should not be modified, when the callback is needed,
  35517. the HAL_UARTEx_RxFifoFullCallback can be implemented in the user file.
  35518. */
  35519. }
  35520. 800f6d4: bf00 nop
  35521. 800f6d6: 370c adds r7, #12
  35522. 800f6d8: 46bd mov sp, r7
  35523. 800f6da: f85d 7b04 ldr.w r7, [sp], #4
  35524. 800f6de: 4770 bx lr
  35525. 0800f6e0 <HAL_UARTEx_TxFifoEmptyCallback>:
  35526. * @brief UART TX Fifo empty callback.
  35527. * @param huart UART handle.
  35528. * @retval None
  35529. */
  35530. __weak void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart)
  35531. {
  35532. 800f6e0: b480 push {r7}
  35533. 800f6e2: b083 sub sp, #12
  35534. 800f6e4: af00 add r7, sp, #0
  35535. 800f6e6: 6078 str r0, [r7, #4]
  35536. UNUSED(huart);
  35537. /* NOTE : This function should not be modified, when the callback is needed,
  35538. the HAL_UARTEx_TxFifoEmptyCallback can be implemented in the user file.
  35539. */
  35540. }
  35541. 800f6e8: bf00 nop
  35542. 800f6ea: 370c adds r7, #12
  35543. 800f6ec: 46bd mov sp, r7
  35544. 800f6ee: f85d 7b04 ldr.w r7, [sp], #4
  35545. 800f6f2: 4770 bx lr
  35546. 0800f6f4 <HAL_UARTEx_DisableFifoMode>:
  35547. * @brief Disable the FIFO mode.
  35548. * @param huart UART handle.
  35549. * @retval HAL status
  35550. */
  35551. HAL_StatusTypeDef HAL_UARTEx_DisableFifoMode(UART_HandleTypeDef *huart)
  35552. {
  35553. 800f6f4: b480 push {r7}
  35554. 800f6f6: b085 sub sp, #20
  35555. 800f6f8: af00 add r7, sp, #0
  35556. 800f6fa: 6078 str r0, [r7, #4]
  35557. /* Check parameters */
  35558. assert_param(IS_UART_FIFO_INSTANCE(huart->Instance));
  35559. /* Process Locked */
  35560. __HAL_LOCK(huart);
  35561. 800f6fc: 687b ldr r3, [r7, #4]
  35562. 800f6fe: f893 3084 ldrb.w r3, [r3, #132] @ 0x84
  35563. 800f702: 2b01 cmp r3, #1
  35564. 800f704: d101 bne.n 800f70a <HAL_UARTEx_DisableFifoMode+0x16>
  35565. 800f706: 2302 movs r3, #2
  35566. 800f708: e027 b.n 800f75a <HAL_UARTEx_DisableFifoMode+0x66>
  35567. 800f70a: 687b ldr r3, [r7, #4]
  35568. 800f70c: 2201 movs r2, #1
  35569. 800f70e: f883 2084 strb.w r2, [r3, #132] @ 0x84
  35570. huart->gState = HAL_UART_STATE_BUSY;
  35571. 800f712: 687b ldr r3, [r7, #4]
  35572. 800f714: 2224 movs r2, #36 @ 0x24
  35573. 800f716: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  35574. /* Save actual UART configuration */
  35575. tmpcr1 = READ_REG(huart->Instance->CR1);
  35576. 800f71a: 687b ldr r3, [r7, #4]
  35577. 800f71c: 681b ldr r3, [r3, #0]
  35578. 800f71e: 681b ldr r3, [r3, #0]
  35579. 800f720: 60fb str r3, [r7, #12]
  35580. /* Disable UART */
  35581. __HAL_UART_DISABLE(huart);
  35582. 800f722: 687b ldr r3, [r7, #4]
  35583. 800f724: 681b ldr r3, [r3, #0]
  35584. 800f726: 681a ldr r2, [r3, #0]
  35585. 800f728: 687b ldr r3, [r7, #4]
  35586. 800f72a: 681b ldr r3, [r3, #0]
  35587. 800f72c: f022 0201 bic.w r2, r2, #1
  35588. 800f730: 601a str r2, [r3, #0]
  35589. /* Enable FIFO mode */
  35590. CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN);
  35591. 800f732: 68fb ldr r3, [r7, #12]
  35592. 800f734: f023 5300 bic.w r3, r3, #536870912 @ 0x20000000
  35593. 800f738: 60fb str r3, [r7, #12]
  35594. huart->FifoMode = UART_FIFOMODE_DISABLE;
  35595. 800f73a: 687b ldr r3, [r7, #4]
  35596. 800f73c: 2200 movs r2, #0
  35597. 800f73e: 665a str r2, [r3, #100] @ 0x64
  35598. /* Restore UART configuration */
  35599. WRITE_REG(huart->Instance->CR1, tmpcr1);
  35600. 800f740: 687b ldr r3, [r7, #4]
  35601. 800f742: 681b ldr r3, [r3, #0]
  35602. 800f744: 68fa ldr r2, [r7, #12]
  35603. 800f746: 601a str r2, [r3, #0]
  35604. huart->gState = HAL_UART_STATE_READY;
  35605. 800f748: 687b ldr r3, [r7, #4]
  35606. 800f74a: 2220 movs r2, #32
  35607. 800f74c: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  35608. /* Process Unlocked */
  35609. __HAL_UNLOCK(huart);
  35610. 800f750: 687b ldr r3, [r7, #4]
  35611. 800f752: 2200 movs r2, #0
  35612. 800f754: f883 2084 strb.w r2, [r3, #132] @ 0x84
  35613. return HAL_OK;
  35614. 800f758: 2300 movs r3, #0
  35615. }
  35616. 800f75a: 4618 mov r0, r3
  35617. 800f75c: 3714 adds r7, #20
  35618. 800f75e: 46bd mov sp, r7
  35619. 800f760: f85d 7b04 ldr.w r7, [sp], #4
  35620. 800f764: 4770 bx lr
  35621. 0800f766 <HAL_UARTEx_SetTxFifoThreshold>:
  35622. * @arg @ref UART_TXFIFO_THRESHOLD_7_8
  35623. * @arg @ref UART_TXFIFO_THRESHOLD_8_8
  35624. * @retval HAL status
  35625. */
  35626. HAL_StatusTypeDef HAL_UARTEx_SetTxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold)
  35627. {
  35628. 800f766: b580 push {r7, lr}
  35629. 800f768: b084 sub sp, #16
  35630. 800f76a: af00 add r7, sp, #0
  35631. 800f76c: 6078 str r0, [r7, #4]
  35632. 800f76e: 6039 str r1, [r7, #0]
  35633. /* Check parameters */
  35634. assert_param(IS_UART_FIFO_INSTANCE(huart->Instance));
  35635. assert_param(IS_UART_TXFIFO_THRESHOLD(Threshold));
  35636. /* Process Locked */
  35637. __HAL_LOCK(huart);
  35638. 800f770: 687b ldr r3, [r7, #4]
  35639. 800f772: f893 3084 ldrb.w r3, [r3, #132] @ 0x84
  35640. 800f776: 2b01 cmp r3, #1
  35641. 800f778: d101 bne.n 800f77e <HAL_UARTEx_SetTxFifoThreshold+0x18>
  35642. 800f77a: 2302 movs r3, #2
  35643. 800f77c: e02d b.n 800f7da <HAL_UARTEx_SetTxFifoThreshold+0x74>
  35644. 800f77e: 687b ldr r3, [r7, #4]
  35645. 800f780: 2201 movs r2, #1
  35646. 800f782: f883 2084 strb.w r2, [r3, #132] @ 0x84
  35647. huart->gState = HAL_UART_STATE_BUSY;
  35648. 800f786: 687b ldr r3, [r7, #4]
  35649. 800f788: 2224 movs r2, #36 @ 0x24
  35650. 800f78a: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  35651. /* Save actual UART configuration */
  35652. tmpcr1 = READ_REG(huart->Instance->CR1);
  35653. 800f78e: 687b ldr r3, [r7, #4]
  35654. 800f790: 681b ldr r3, [r3, #0]
  35655. 800f792: 681b ldr r3, [r3, #0]
  35656. 800f794: 60fb str r3, [r7, #12]
  35657. /* Disable UART */
  35658. __HAL_UART_DISABLE(huart);
  35659. 800f796: 687b ldr r3, [r7, #4]
  35660. 800f798: 681b ldr r3, [r3, #0]
  35661. 800f79a: 681a ldr r2, [r3, #0]
  35662. 800f79c: 687b ldr r3, [r7, #4]
  35663. 800f79e: 681b ldr r3, [r3, #0]
  35664. 800f7a0: f022 0201 bic.w r2, r2, #1
  35665. 800f7a4: 601a str r2, [r3, #0]
  35666. /* Update TX threshold configuration */
  35667. MODIFY_REG(huart->Instance->CR3, USART_CR3_TXFTCFG, Threshold);
  35668. 800f7a6: 687b ldr r3, [r7, #4]
  35669. 800f7a8: 681b ldr r3, [r3, #0]
  35670. 800f7aa: 689b ldr r3, [r3, #8]
  35671. 800f7ac: f023 4160 bic.w r1, r3, #3758096384 @ 0xe0000000
  35672. 800f7b0: 687b ldr r3, [r7, #4]
  35673. 800f7b2: 681b ldr r3, [r3, #0]
  35674. 800f7b4: 683a ldr r2, [r7, #0]
  35675. 800f7b6: 430a orrs r2, r1
  35676. 800f7b8: 609a str r2, [r3, #8]
  35677. /* Determine the number of data to process during RX/TX ISR execution */
  35678. UARTEx_SetNbDataToProcess(huart);
  35679. 800f7ba: 6878 ldr r0, [r7, #4]
  35680. 800f7bc: f000 f8a0 bl 800f900 <UARTEx_SetNbDataToProcess>
  35681. /* Restore UART configuration */
  35682. WRITE_REG(huart->Instance->CR1, tmpcr1);
  35683. 800f7c0: 687b ldr r3, [r7, #4]
  35684. 800f7c2: 681b ldr r3, [r3, #0]
  35685. 800f7c4: 68fa ldr r2, [r7, #12]
  35686. 800f7c6: 601a str r2, [r3, #0]
  35687. huart->gState = HAL_UART_STATE_READY;
  35688. 800f7c8: 687b ldr r3, [r7, #4]
  35689. 800f7ca: 2220 movs r2, #32
  35690. 800f7cc: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  35691. /* Process Unlocked */
  35692. __HAL_UNLOCK(huart);
  35693. 800f7d0: 687b ldr r3, [r7, #4]
  35694. 800f7d2: 2200 movs r2, #0
  35695. 800f7d4: f883 2084 strb.w r2, [r3, #132] @ 0x84
  35696. return HAL_OK;
  35697. 800f7d8: 2300 movs r3, #0
  35698. }
  35699. 800f7da: 4618 mov r0, r3
  35700. 800f7dc: 3710 adds r7, #16
  35701. 800f7de: 46bd mov sp, r7
  35702. 800f7e0: bd80 pop {r7, pc}
  35703. 0800f7e2 <HAL_UARTEx_SetRxFifoThreshold>:
  35704. * @arg @ref UART_RXFIFO_THRESHOLD_7_8
  35705. * @arg @ref UART_RXFIFO_THRESHOLD_8_8
  35706. * @retval HAL status
  35707. */
  35708. HAL_StatusTypeDef HAL_UARTEx_SetRxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold)
  35709. {
  35710. 800f7e2: b580 push {r7, lr}
  35711. 800f7e4: b084 sub sp, #16
  35712. 800f7e6: af00 add r7, sp, #0
  35713. 800f7e8: 6078 str r0, [r7, #4]
  35714. 800f7ea: 6039 str r1, [r7, #0]
  35715. /* Check the parameters */
  35716. assert_param(IS_UART_FIFO_INSTANCE(huart->Instance));
  35717. assert_param(IS_UART_RXFIFO_THRESHOLD(Threshold));
  35718. /* Process Locked */
  35719. __HAL_LOCK(huart);
  35720. 800f7ec: 687b ldr r3, [r7, #4]
  35721. 800f7ee: f893 3084 ldrb.w r3, [r3, #132] @ 0x84
  35722. 800f7f2: 2b01 cmp r3, #1
  35723. 800f7f4: d101 bne.n 800f7fa <HAL_UARTEx_SetRxFifoThreshold+0x18>
  35724. 800f7f6: 2302 movs r3, #2
  35725. 800f7f8: e02d b.n 800f856 <HAL_UARTEx_SetRxFifoThreshold+0x74>
  35726. 800f7fa: 687b ldr r3, [r7, #4]
  35727. 800f7fc: 2201 movs r2, #1
  35728. 800f7fe: f883 2084 strb.w r2, [r3, #132] @ 0x84
  35729. huart->gState = HAL_UART_STATE_BUSY;
  35730. 800f802: 687b ldr r3, [r7, #4]
  35731. 800f804: 2224 movs r2, #36 @ 0x24
  35732. 800f806: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  35733. /* Save actual UART configuration */
  35734. tmpcr1 = READ_REG(huart->Instance->CR1);
  35735. 800f80a: 687b ldr r3, [r7, #4]
  35736. 800f80c: 681b ldr r3, [r3, #0]
  35737. 800f80e: 681b ldr r3, [r3, #0]
  35738. 800f810: 60fb str r3, [r7, #12]
  35739. /* Disable UART */
  35740. __HAL_UART_DISABLE(huart);
  35741. 800f812: 687b ldr r3, [r7, #4]
  35742. 800f814: 681b ldr r3, [r3, #0]
  35743. 800f816: 681a ldr r2, [r3, #0]
  35744. 800f818: 687b ldr r3, [r7, #4]
  35745. 800f81a: 681b ldr r3, [r3, #0]
  35746. 800f81c: f022 0201 bic.w r2, r2, #1
  35747. 800f820: 601a str r2, [r3, #0]
  35748. /* Update RX threshold configuration */
  35749. MODIFY_REG(huart->Instance->CR3, USART_CR3_RXFTCFG, Threshold);
  35750. 800f822: 687b ldr r3, [r7, #4]
  35751. 800f824: 681b ldr r3, [r3, #0]
  35752. 800f826: 689b ldr r3, [r3, #8]
  35753. 800f828: f023 6160 bic.w r1, r3, #234881024 @ 0xe000000
  35754. 800f82c: 687b ldr r3, [r7, #4]
  35755. 800f82e: 681b ldr r3, [r3, #0]
  35756. 800f830: 683a ldr r2, [r7, #0]
  35757. 800f832: 430a orrs r2, r1
  35758. 800f834: 609a str r2, [r3, #8]
  35759. /* Determine the number of data to process during RX/TX ISR execution */
  35760. UARTEx_SetNbDataToProcess(huart);
  35761. 800f836: 6878 ldr r0, [r7, #4]
  35762. 800f838: f000 f862 bl 800f900 <UARTEx_SetNbDataToProcess>
  35763. /* Restore UART configuration */
  35764. WRITE_REG(huart->Instance->CR1, tmpcr1);
  35765. 800f83c: 687b ldr r3, [r7, #4]
  35766. 800f83e: 681b ldr r3, [r3, #0]
  35767. 800f840: 68fa ldr r2, [r7, #12]
  35768. 800f842: 601a str r2, [r3, #0]
  35769. huart->gState = HAL_UART_STATE_READY;
  35770. 800f844: 687b ldr r3, [r7, #4]
  35771. 800f846: 2220 movs r2, #32
  35772. 800f848: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  35773. /* Process Unlocked */
  35774. __HAL_UNLOCK(huart);
  35775. 800f84c: 687b ldr r3, [r7, #4]
  35776. 800f84e: 2200 movs r2, #0
  35777. 800f850: f883 2084 strb.w r2, [r3, #132] @ 0x84
  35778. return HAL_OK;
  35779. 800f854: 2300 movs r3, #0
  35780. }
  35781. 800f856: 4618 mov r0, r3
  35782. 800f858: 3710 adds r7, #16
  35783. 800f85a: 46bd mov sp, r7
  35784. 800f85c: bd80 pop {r7, pc}
  35785. 0800f85e <HAL_UARTEx_ReceiveToIdle_IT>:
  35786. * @param pData Pointer to data buffer (uint8_t or uint16_t data elements).
  35787. * @param Size Amount of data elements (uint8_t or uint16_t) to be received.
  35788. * @retval HAL status
  35789. */
  35790. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  35791. {
  35792. 800f85e: b580 push {r7, lr}
  35793. 800f860: b08c sub sp, #48 @ 0x30
  35794. 800f862: af00 add r7, sp, #0
  35795. 800f864: 60f8 str r0, [r7, #12]
  35796. 800f866: 60b9 str r1, [r7, #8]
  35797. 800f868: 4613 mov r3, r2
  35798. 800f86a: 80fb strh r3, [r7, #6]
  35799. HAL_StatusTypeDef status = HAL_OK;
  35800. 800f86c: 2300 movs r3, #0
  35801. 800f86e: f887 302f strb.w r3, [r7, #47] @ 0x2f
  35802. /* Check that a Rx process is not already ongoing */
  35803. if (huart->RxState == HAL_UART_STATE_READY)
  35804. 800f872: 68fb ldr r3, [r7, #12]
  35805. 800f874: f8d3 308c ldr.w r3, [r3, #140] @ 0x8c
  35806. 800f878: 2b20 cmp r3, #32
  35807. 800f87a: d13b bne.n 800f8f4 <HAL_UARTEx_ReceiveToIdle_IT+0x96>
  35808. {
  35809. if ((pData == NULL) || (Size == 0U))
  35810. 800f87c: 68bb ldr r3, [r7, #8]
  35811. 800f87e: 2b00 cmp r3, #0
  35812. 800f880: d002 beq.n 800f888 <HAL_UARTEx_ReceiveToIdle_IT+0x2a>
  35813. 800f882: 88fb ldrh r3, [r7, #6]
  35814. 800f884: 2b00 cmp r3, #0
  35815. 800f886: d101 bne.n 800f88c <HAL_UARTEx_ReceiveToIdle_IT+0x2e>
  35816. {
  35817. return HAL_ERROR;
  35818. 800f888: 2301 movs r3, #1
  35819. 800f88a: e034 b.n 800f8f6 <HAL_UARTEx_ReceiveToIdle_IT+0x98>
  35820. }
  35821. /* Set Reception type to reception till IDLE Event*/
  35822. huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE;
  35823. 800f88c: 68fb ldr r3, [r7, #12]
  35824. 800f88e: 2201 movs r2, #1
  35825. 800f890: 66da str r2, [r3, #108] @ 0x6c
  35826. huart->RxEventType = HAL_UART_RXEVENT_TC;
  35827. 800f892: 68fb ldr r3, [r7, #12]
  35828. 800f894: 2200 movs r2, #0
  35829. 800f896: 671a str r2, [r3, #112] @ 0x70
  35830. (void)UART_Start_Receive_IT(huart, pData, Size);
  35831. 800f898: 88fb ldrh r3, [r7, #6]
  35832. 800f89a: 461a mov r2, r3
  35833. 800f89c: 68b9 ldr r1, [r7, #8]
  35834. 800f89e: 68f8 ldr r0, [r7, #12]
  35835. 800f8a0: f7fe fe82 bl 800e5a8 <UART_Start_Receive_IT>
  35836. if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
  35837. 800f8a4: 68fb ldr r3, [r7, #12]
  35838. 800f8a6: 6edb ldr r3, [r3, #108] @ 0x6c
  35839. 800f8a8: 2b01 cmp r3, #1
  35840. 800f8aa: d11d bne.n 800f8e8 <HAL_UARTEx_ReceiveToIdle_IT+0x8a>
  35841. {
  35842. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF);
  35843. 800f8ac: 68fb ldr r3, [r7, #12]
  35844. 800f8ae: 681b ldr r3, [r3, #0]
  35845. 800f8b0: 2210 movs r2, #16
  35846. 800f8b2: 621a str r2, [r3, #32]
  35847. ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
  35848. 800f8b4: 68fb ldr r3, [r7, #12]
  35849. 800f8b6: 681b ldr r3, [r3, #0]
  35850. 800f8b8: 61bb str r3, [r7, #24]
  35851. __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
  35852. 800f8ba: 69bb ldr r3, [r7, #24]
  35853. 800f8bc: e853 3f00 ldrex r3, [r3]
  35854. 800f8c0: 617b str r3, [r7, #20]
  35855. return(result);
  35856. 800f8c2: 697b ldr r3, [r7, #20]
  35857. 800f8c4: f043 0310 orr.w r3, r3, #16
  35858. 800f8c8: 62bb str r3, [r7, #40] @ 0x28
  35859. 800f8ca: 68fb ldr r3, [r7, #12]
  35860. 800f8cc: 681b ldr r3, [r3, #0]
  35861. 800f8ce: 461a mov r2, r3
  35862. 800f8d0: 6abb ldr r3, [r7, #40] @ 0x28
  35863. 800f8d2: 627b str r3, [r7, #36] @ 0x24
  35864. 800f8d4: 623a str r2, [r7, #32]
  35865. __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
  35866. 800f8d6: 6a39 ldr r1, [r7, #32]
  35867. 800f8d8: 6a7a ldr r2, [r7, #36] @ 0x24
  35868. 800f8da: e841 2300 strex r3, r2, [r1]
  35869. 800f8de: 61fb str r3, [r7, #28]
  35870. return(result);
  35871. 800f8e0: 69fb ldr r3, [r7, #28]
  35872. 800f8e2: 2b00 cmp r3, #0
  35873. 800f8e4: d1e6 bne.n 800f8b4 <HAL_UARTEx_ReceiveToIdle_IT+0x56>
  35874. 800f8e6: e002 b.n 800f8ee <HAL_UARTEx_ReceiveToIdle_IT+0x90>
  35875. {
  35876. /* In case of errors already pending when reception is started,
  35877. Interrupts may have already been raised and lead to reception abortion.
  35878. (Overrun error for instance).
  35879. In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */
  35880. status = HAL_ERROR;
  35881. 800f8e8: 2301 movs r3, #1
  35882. 800f8ea: f887 302f strb.w r3, [r7, #47] @ 0x2f
  35883. }
  35884. return status;
  35885. 800f8ee: f897 302f ldrb.w r3, [r7, #47] @ 0x2f
  35886. 800f8f2: e000 b.n 800f8f6 <HAL_UARTEx_ReceiveToIdle_IT+0x98>
  35887. }
  35888. else
  35889. {
  35890. return HAL_BUSY;
  35891. 800f8f4: 2302 movs r3, #2
  35892. }
  35893. }
  35894. 800f8f6: 4618 mov r0, r3
  35895. 800f8f8: 3730 adds r7, #48 @ 0x30
  35896. 800f8fa: 46bd mov sp, r7
  35897. 800f8fc: bd80 pop {r7, pc}
  35898. ...
  35899. 0800f900 <UARTEx_SetNbDataToProcess>:
  35900. * the UART configuration registers.
  35901. * @param huart UART handle.
  35902. * @retval None
  35903. */
  35904. static void UARTEx_SetNbDataToProcess(UART_HandleTypeDef *huart)
  35905. {
  35906. 800f900: b480 push {r7}
  35907. 800f902: b085 sub sp, #20
  35908. 800f904: af00 add r7, sp, #0
  35909. 800f906: 6078 str r0, [r7, #4]
  35910. uint8_t rx_fifo_threshold;
  35911. uint8_t tx_fifo_threshold;
  35912. static const uint8_t numerator[] = {1U, 1U, 1U, 3U, 7U, 1U, 0U, 0U};
  35913. static const uint8_t denominator[] = {8U, 4U, 2U, 4U, 8U, 1U, 1U, 1U};
  35914. if (huart->FifoMode == UART_FIFOMODE_DISABLE)
  35915. 800f908: 687b ldr r3, [r7, #4]
  35916. 800f90a: 6e5b ldr r3, [r3, #100] @ 0x64
  35917. 800f90c: 2b00 cmp r3, #0
  35918. 800f90e: d108 bne.n 800f922 <UARTEx_SetNbDataToProcess+0x22>
  35919. {
  35920. huart->NbTxDataToProcess = 1U;
  35921. 800f910: 687b ldr r3, [r7, #4]
  35922. 800f912: 2201 movs r2, #1
  35923. 800f914: f8a3 206a strh.w r2, [r3, #106] @ 0x6a
  35924. huart->NbRxDataToProcess = 1U;
  35925. 800f918: 687b ldr r3, [r7, #4]
  35926. 800f91a: 2201 movs r2, #1
  35927. 800f91c: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  35928. huart->NbTxDataToProcess = ((uint16_t)tx_fifo_depth * numerator[tx_fifo_threshold]) /
  35929. (uint16_t)denominator[tx_fifo_threshold];
  35930. huart->NbRxDataToProcess = ((uint16_t)rx_fifo_depth * numerator[rx_fifo_threshold]) /
  35931. (uint16_t)denominator[rx_fifo_threshold];
  35932. }
  35933. }
  35934. 800f920: e031 b.n 800f986 <UARTEx_SetNbDataToProcess+0x86>
  35935. rx_fifo_depth = RX_FIFO_DEPTH;
  35936. 800f922: 2310 movs r3, #16
  35937. 800f924: 73fb strb r3, [r7, #15]
  35938. tx_fifo_depth = TX_FIFO_DEPTH;
  35939. 800f926: 2310 movs r3, #16
  35940. 800f928: 73bb strb r3, [r7, #14]
  35941. rx_fifo_threshold = (uint8_t)(READ_BIT(huart->Instance->CR3, USART_CR3_RXFTCFG) >> USART_CR3_RXFTCFG_Pos);
  35942. 800f92a: 687b ldr r3, [r7, #4]
  35943. 800f92c: 681b ldr r3, [r3, #0]
  35944. 800f92e: 689b ldr r3, [r3, #8]
  35945. 800f930: 0e5b lsrs r3, r3, #25
  35946. 800f932: b2db uxtb r3, r3
  35947. 800f934: f003 0307 and.w r3, r3, #7
  35948. 800f938: 737b strb r3, [r7, #13]
  35949. tx_fifo_threshold = (uint8_t)(READ_BIT(huart->Instance->CR3, USART_CR3_TXFTCFG) >> USART_CR3_TXFTCFG_Pos);
  35950. 800f93a: 687b ldr r3, [r7, #4]
  35951. 800f93c: 681b ldr r3, [r3, #0]
  35952. 800f93e: 689b ldr r3, [r3, #8]
  35953. 800f940: 0f5b lsrs r3, r3, #29
  35954. 800f942: b2db uxtb r3, r3
  35955. 800f944: f003 0307 and.w r3, r3, #7
  35956. 800f948: 733b strb r3, [r7, #12]
  35957. huart->NbTxDataToProcess = ((uint16_t)tx_fifo_depth * numerator[tx_fifo_threshold]) /
  35958. 800f94a: 7bbb ldrb r3, [r7, #14]
  35959. 800f94c: 7b3a ldrb r2, [r7, #12]
  35960. 800f94e: 4911 ldr r1, [pc, #68] @ (800f994 <UARTEx_SetNbDataToProcess+0x94>)
  35961. 800f950: 5c8a ldrb r2, [r1, r2]
  35962. 800f952: fb02 f303 mul.w r3, r2, r3
  35963. (uint16_t)denominator[tx_fifo_threshold];
  35964. 800f956: 7b3a ldrb r2, [r7, #12]
  35965. 800f958: 490f ldr r1, [pc, #60] @ (800f998 <UARTEx_SetNbDataToProcess+0x98>)
  35966. 800f95a: 5c8a ldrb r2, [r1, r2]
  35967. huart->NbTxDataToProcess = ((uint16_t)tx_fifo_depth * numerator[tx_fifo_threshold]) /
  35968. 800f95c: fb93 f3f2 sdiv r3, r3, r2
  35969. 800f960: b29a uxth r2, r3
  35970. 800f962: 687b ldr r3, [r7, #4]
  35971. 800f964: f8a3 206a strh.w r2, [r3, #106] @ 0x6a
  35972. huart->NbRxDataToProcess = ((uint16_t)rx_fifo_depth * numerator[rx_fifo_threshold]) /
  35973. 800f968: 7bfb ldrb r3, [r7, #15]
  35974. 800f96a: 7b7a ldrb r2, [r7, #13]
  35975. 800f96c: 4909 ldr r1, [pc, #36] @ (800f994 <UARTEx_SetNbDataToProcess+0x94>)
  35976. 800f96e: 5c8a ldrb r2, [r1, r2]
  35977. 800f970: fb02 f303 mul.w r3, r2, r3
  35978. (uint16_t)denominator[rx_fifo_threshold];
  35979. 800f974: 7b7a ldrb r2, [r7, #13]
  35980. 800f976: 4908 ldr r1, [pc, #32] @ (800f998 <UARTEx_SetNbDataToProcess+0x98>)
  35981. 800f978: 5c8a ldrb r2, [r1, r2]
  35982. huart->NbRxDataToProcess = ((uint16_t)rx_fifo_depth * numerator[rx_fifo_threshold]) /
  35983. 800f97a: fb93 f3f2 sdiv r3, r3, r2
  35984. 800f97e: b29a uxth r2, r3
  35985. 800f980: 687b ldr r3, [r7, #4]
  35986. 800f982: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  35987. }
  35988. 800f986: bf00 nop
  35989. 800f988: 3714 adds r7, #20
  35990. 800f98a: 46bd mov sp, r7
  35991. 800f98c: f85d 7b04 ldr.w r7, [sp], #4
  35992. 800f990: 4770 bx lr
  35993. 800f992: bf00 nop
  35994. 800f994: 08030a54 .word 0x08030a54
  35995. 800f998: 08030a5c .word 0x08030a5c
  35996. 0800f99c <tcpip_init_wrap>:
  35997. /* USER CODE END OS_THREAD_ATTR_CMSIS_RTOS_V2 */
  35998. /* USER CODE BEGIN 2 */
  35999. /* ETH_CODE: workaround to call LOCK_TCPIP_CORE after tcpip_init in MX_LWIP_Init
  36000. * This is to keep the code after MX code re-generation */
  36001. static inline void tcpip_init_wrap(tcpip_init_done_fn tcpip_init_done, void *arg){
  36002. 800f99c: b580 push {r7, lr}
  36003. 800f99e: b082 sub sp, #8
  36004. 800f9a0: af00 add r7, sp, #0
  36005. 800f9a2: 6078 str r0, [r7, #4]
  36006. 800f9a4: 6039 str r1, [r7, #0]
  36007. tcpip_init(tcpip_init_done, arg);
  36008. 800f9a6: 6839 ldr r1, [r7, #0]
  36009. 800f9a8: 6878 ldr r0, [r7, #4]
  36010. 800f9aa: f009 f86b bl 8018a84 <tcpip_init>
  36011. LOCK_TCPIP_CORE();
  36012. 800f9ae: f000 fda1 bl 80104f4 <sys_lock_tcpip_core>
  36013. }
  36014. 800f9b2: bf00 nop
  36015. 800f9b4: 3708 adds r7, #8
  36016. 800f9b6: 46bd mov sp, r7
  36017. 800f9b8: bd80 pop {r7, pc}
  36018. ...
  36019. 0800f9bc <is_link_up>:
  36020. #define tcpip_init tcpip_init_wrap
  36021. uint8_t is_link_up(void)
  36022. {
  36023. 800f9bc: b480 push {r7}
  36024. 800f9be: af00 add r7, sp, #0
  36025. return netif_is_up(&gnetif);
  36026. 800f9c0: 4b05 ldr r3, [pc, #20] @ (800f9d8 <is_link_up+0x1c>)
  36027. 800f9c2: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  36028. 800f9c6: f003 0301 and.w r3, r3, #1
  36029. 800f9ca: b2db uxtb r3, r3
  36030. }
  36031. 800f9cc: 4618 mov r0, r3
  36032. 800f9ce: 46bd mov sp, r7
  36033. 800f9d0: f85d 7b04 ldr.w r7, [sp], #4
  36034. 800f9d4: 4770 bx lr
  36035. 800f9d6: bf00 nop
  36036. 800f9d8: 24002174 .word 0x24002174
  36037. 0800f9dc <MX_LWIP_Init>:
  36038. /**
  36039. * LwIP initialization function
  36040. */
  36041. void MX_LWIP_Init(void)
  36042. {
  36043. 800f9dc: b580 push {r7, lr}
  36044. 800f9de: b084 sub sp, #16
  36045. 800f9e0: af04 add r7, sp, #16
  36046. /* IP addresses initialization without DHCP (IPv4) */
  36047. ipaddr_aton(STATIC_IP, &ipaddr);
  36048. ipaddr_aton(STATIC_MASK, &netmask);
  36049. ipaddr_aton(STATIC_GW, &gw);
  36050. #else
  36051. ip_addr_set_zero_ip4(&ipaddr);
  36052. 800f9e2: 4b27 ldr r3, [pc, #156] @ (800fa80 <MX_LWIP_Init+0xa4>)
  36053. 800f9e4: 2200 movs r2, #0
  36054. 800f9e6: 601a str r2, [r3, #0]
  36055. ip_addr_set_zero_ip4(&netmask);
  36056. 800f9e8: 4b26 ldr r3, [pc, #152] @ (800fa84 <MX_LWIP_Init+0xa8>)
  36057. 800f9ea: 2200 movs r2, #0
  36058. 800f9ec: 601a str r2, [r3, #0]
  36059. ip_addr_set_zero_ip4(&gw);
  36060. 800f9ee: 4b26 ldr r3, [pc, #152] @ (800fa88 <MX_LWIP_Init+0xac>)
  36061. 800f9f0: 2200 movs r2, #0
  36062. 800f9f2: 601a str r2, [r3, #0]
  36063. #endif
  36064. /* USER CODE END IP_ADDRESSES */
  36065. /* Initilialize the LwIP stack with RTOS */
  36066. tcpip_init( NULL, NULL );
  36067. 800f9f4: 2100 movs r1, #0
  36068. 800f9f6: 2000 movs r0, #0
  36069. 800f9f8: f7ff ffd0 bl 800f99c <tcpip_init_wrap>
  36070. // IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
  36071. // IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
  36072. // IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);
  36073. /* add the network interface (IPv4/IPv6) with RTOS */
  36074. netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  36075. 800f9fc: 4b23 ldr r3, [pc, #140] @ (800fa8c <MX_LWIP_Init+0xb0>)
  36076. 800f9fe: 9302 str r3, [sp, #8]
  36077. 800fa00: 4b23 ldr r3, [pc, #140] @ (800fa90 <MX_LWIP_Init+0xb4>)
  36078. 800fa02: 9301 str r3, [sp, #4]
  36079. 800fa04: 2300 movs r3, #0
  36080. 800fa06: 9300 str r3, [sp, #0]
  36081. 800fa08: 4b1f ldr r3, [pc, #124] @ (800fa88 <MX_LWIP_Init+0xac>)
  36082. 800fa0a: 4a1e ldr r2, [pc, #120] @ (800fa84 <MX_LWIP_Init+0xa8>)
  36083. 800fa0c: 491c ldr r1, [pc, #112] @ (800fa80 <MX_LWIP_Init+0xa4>)
  36084. 800fa0e: 4821 ldr r0, [pc, #132] @ (800fa94 <MX_LWIP_Init+0xb8>)
  36085. 800fa10: f009 fea8 bl 8019764 <netif_add>
  36086. /* Registers the default network interface */
  36087. netif_set_default(&gnetif);
  36088. 800fa14: 481f ldr r0, [pc, #124] @ (800fa94 <MX_LWIP_Init+0xb8>)
  36089. 800fa16: f00a f863 bl 8019ae0 <netif_set_default>
  36090. if (netif_is_link_up(&gnetif))
  36091. 800fa1a: 4b1e ldr r3, [pc, #120] @ (800fa94 <MX_LWIP_Init+0xb8>)
  36092. 800fa1c: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  36093. 800fa20: 089b lsrs r3, r3, #2
  36094. 800fa22: f003 0301 and.w r3, r3, #1
  36095. 800fa26: b2db uxtb r3, r3
  36096. 800fa28: 2b00 cmp r3, #0
  36097. 800fa2a: d003 beq.n 800fa34 <MX_LWIP_Init+0x58>
  36098. {
  36099. /* When the netif is fully configured this function must be called */
  36100. netif_set_up(&gnetif);
  36101. 800fa2c: 4819 ldr r0, [pc, #100] @ (800fa94 <MX_LWIP_Init+0xb8>)
  36102. 800fa2e: f00a f867 bl 8019b00 <netif_set_up>
  36103. 800fa32: e002 b.n 800fa3a <MX_LWIP_Init+0x5e>
  36104. }
  36105. else
  36106. {
  36107. /* When the netif link is down this function must be called */
  36108. netif_set_down(&gnetif);
  36109. 800fa34: 4817 ldr r0, [pc, #92] @ (800fa94 <MX_LWIP_Init+0xb8>)
  36110. 800fa36: f00a f8d1 bl 8019bdc <netif_set_down>
  36111. }
  36112. /* Set the link callback function, this function is called on change of link status*/
  36113. netif_set_link_callback(&gnetif, ethernet_link_status_updated);
  36114. 800fa3a: 4917 ldr r1, [pc, #92] @ (800fa98 <MX_LWIP_Init+0xbc>)
  36115. 800fa3c: 4815 ldr r0, [pc, #84] @ (800fa94 <MX_LWIP_Init+0xb8>)
  36116. 800fa3e: f00a f96d bl 8019d1c <netif_set_link_callback>
  36117. /* Create the Ethernet link handler thread */
  36118. /* USER CODE BEGIN H7_OS_THREAD_NEW_CMSIS_RTOS_V2 */
  36119. memset(&attributes, 0x0, sizeof(osThreadAttr_t));
  36120. 800fa42: 2224 movs r2, #36 @ 0x24
  36121. 800fa44: 2100 movs r1, #0
  36122. 800fa46: 4815 ldr r0, [pc, #84] @ (800fa9c <MX_LWIP_Init+0xc0>)
  36123. 800fa48: f01a f952 bl 8029cf0 <memset>
  36124. attributes.name = "EthLink";
  36125. 800fa4c: 4b13 ldr r3, [pc, #76] @ (800fa9c <MX_LWIP_Init+0xc0>)
  36126. 800fa4e: 4a14 ldr r2, [pc, #80] @ (800faa0 <MX_LWIP_Init+0xc4>)
  36127. 800fa50: 601a str r2, [r3, #0]
  36128. attributes.stack_size = INTERFACE_THREAD_STACK_SIZE * 2;
  36129. 800fa52: 4b12 ldr r3, [pc, #72] @ (800fa9c <MX_LWIP_Init+0xc0>)
  36130. 800fa54: f44f 6200 mov.w r2, #2048 @ 0x800
  36131. 800fa58: 615a str r2, [r3, #20]
  36132. attributes.priority = osPriorityBelowNormal;
  36133. 800fa5a: 4b10 ldr r3, [pc, #64] @ (800fa9c <MX_LWIP_Init+0xc0>)
  36134. 800fa5c: 2210 movs r2, #16
  36135. 800fa5e: 619a str r2, [r3, #24]
  36136. osThreadNew(ethernet_link_thread, &gnetif, &attributes);
  36137. 800fa60: 4a0e ldr r2, [pc, #56] @ (800fa9c <MX_LWIP_Init+0xc0>)
  36138. 800fa62: 490c ldr r1, [pc, #48] @ (800fa94 <MX_LWIP_Init+0xb8>)
  36139. 800fa64: 480f ldr r0, [pc, #60] @ (800faa4 <MX_LWIP_Init+0xc8>)
  36140. 800fa66: f000 feee bl 8010846 <osThreadNew>
  36141. /* USER CODE END H7_OS_THREAD_NEW_CMSIS_RTOS_V2 */
  36142. /* USER CODE BEGIN 3 */
  36143. /* Start DHCP negotiation for a network interface (IPv4) */
  36144. #if USE_DHCP
  36145. netif_set_up(&gnetif);
  36146. 800fa6a: 480a ldr r0, [pc, #40] @ (800fa94 <MX_LWIP_Init+0xb8>)
  36147. 800fa6c: f00a f848 bl 8019b00 <netif_set_up>
  36148. dhcp_start(&gnetif);
  36149. 800fa70: 4808 ldr r0, [pc, #32] @ (800fa94 <MX_LWIP_Init+0xb8>)
  36150. 800fa72: f012 fb35 bl 80220e0 <dhcp_start>
  36151. #else
  36152. netif_set_addr(&gnetif, ip_2_ip4(&ipaddr), ip_2_ip4(&netmask), ip_2_ip4(&gw));
  36153. #endif
  36154. /* ETH_CODE: call UNLOCK_TCPIP_CORE after we are done */
  36155. UNLOCK_TCPIP_CORE();
  36156. 800fa76: f000 fd4d bl 8010514 <sys_unlock_tcpip_core>
  36157. /* USER CODE END 3 */
  36158. }
  36159. 800fa7a: bf00 nop
  36160. 800fa7c: 46bd mov sp, r7
  36161. 800fa7e: bd80 pop {r7, pc}
  36162. 800fa80: 240021ac .word 0x240021ac
  36163. 800fa84: 240021b0 .word 0x240021b0
  36164. 800fa88: 240021b4 .word 0x240021b4
  36165. 800fa8c: 0801899d .word 0x0801899d
  36166. 800fa90: 0800ff5d .word 0x0800ff5d
  36167. 800fa94: 24002174 .word 0x24002174
  36168. 800fa98: 0800faa9 .word 0x0800faa9
  36169. 800fa9c: 240021b8 .word 0x240021b8
  36170. 800faa0: 0802c9d8 .word 0x0802c9d8
  36171. 800faa4: 0801022d .word 0x0801022d
  36172. 0800faa8 <ethernet_link_status_updated>:
  36173. * @brief Notify the User about the network interface config status
  36174. * @param netif: the network interface
  36175. * @retval None
  36176. */
  36177. static void ethernet_link_status_updated(struct netif *netif)
  36178. {
  36179. 800faa8: b480 push {r7}
  36180. 800faaa: b083 sub sp, #12
  36181. 800faac: af00 add r7, sp, #0
  36182. 800faae: 6078 str r0, [r7, #4]
  36183. else /* netif is down */
  36184. {
  36185. /* USER CODE BEGIN 6 */
  36186. /* USER CODE END 6 */
  36187. }
  36188. }
  36189. 800fab0: bf00 nop
  36190. 800fab2: 370c adds r7, #12
  36191. 800fab4: 46bd mov sp, r7
  36192. 800fab6: f85d 7b04 ldr.w r7, [sp], #4
  36193. 800faba: 4770 bx lr
  36194. 0800fabc <HAL_ETH_RxCpltCallback>:
  36195. * @brief Ethernet Rx Transfer completed callback
  36196. * @param handlerEth: ETH handler
  36197. * @retval None
  36198. */
  36199. void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *handlerEth)
  36200. {
  36201. 800fabc: b580 push {r7, lr}
  36202. 800fabe: b082 sub sp, #8
  36203. 800fac0: af00 add r7, sp, #0
  36204. 800fac2: 6078 str r0, [r7, #4]
  36205. osSemaphoreRelease(RxPktSemaphore);
  36206. 800fac4: 4b04 ldr r3, [pc, #16] @ (800fad8 <HAL_ETH_RxCpltCallback+0x1c>)
  36207. 800fac6: 681b ldr r3, [r3, #0]
  36208. 800fac8: 4618 mov r0, r3
  36209. 800faca: f001 f95f bl 8010d8c <osSemaphoreRelease>
  36210. }
  36211. 800face: bf00 nop
  36212. 800fad0: 3708 adds r7, #8
  36213. 800fad2: 46bd mov sp, r7
  36214. 800fad4: bd80 pop {r7, pc}
  36215. 800fad6: bf00 nop
  36216. 800fad8: 240021e4 .word 0x240021e4
  36217. 0800fadc <HAL_ETH_TxCpltCallback>:
  36218. * @brief Ethernet Tx Transfer completed callback
  36219. * @param handlerEth: ETH handler
  36220. * @retval None
  36221. */
  36222. void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *handlerEth)
  36223. {
  36224. 800fadc: b580 push {r7, lr}
  36225. 800fade: b082 sub sp, #8
  36226. 800fae0: af00 add r7, sp, #0
  36227. 800fae2: 6078 str r0, [r7, #4]
  36228. osSemaphoreRelease(TxPktSemaphore);
  36229. 800fae4: 4b04 ldr r3, [pc, #16] @ (800faf8 <HAL_ETH_TxCpltCallback+0x1c>)
  36230. 800fae6: 681b ldr r3, [r3, #0]
  36231. 800fae8: 4618 mov r0, r3
  36232. 800faea: f001 f94f bl 8010d8c <osSemaphoreRelease>
  36233. }
  36234. 800faee: bf00 nop
  36235. 800faf0: 3708 adds r7, #8
  36236. 800faf2: 46bd mov sp, r7
  36237. 800faf4: bd80 pop {r7, pc}
  36238. 800faf6: bf00 nop
  36239. 800faf8: 240021e8 .word 0x240021e8
  36240. 0800fafc <HAL_ETH_ErrorCallback>:
  36241. * @brief Ethernet DMA transfer error callback
  36242. * @param handlerEth: ETH handler
  36243. * @retval None
  36244. */
  36245. void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *handlerEth)
  36246. {
  36247. 800fafc: b580 push {r7, lr}
  36248. 800fafe: b082 sub sp, #8
  36249. 800fb00: af00 add r7, sp, #0
  36250. 800fb02: 6078 str r0, [r7, #4]
  36251. if((HAL_ETH_GetDMAError(handlerEth) & ETH_DMACSR_RBU) == ETH_DMACSR_RBU)
  36252. 800fb04: 6878 ldr r0, [r7, #4]
  36253. 800fb06: f7f9 f833 bl 8008b70 <HAL_ETH_GetDMAError>
  36254. 800fb0a: 4603 mov r3, r0
  36255. 800fb0c: f003 0380 and.w r3, r3, #128 @ 0x80
  36256. 800fb10: 2b80 cmp r3, #128 @ 0x80
  36257. 800fb12: d104 bne.n 800fb1e <HAL_ETH_ErrorCallback+0x22>
  36258. {
  36259. osSemaphoreRelease(RxPktSemaphore);
  36260. 800fb14: 4b04 ldr r3, [pc, #16] @ (800fb28 <HAL_ETH_ErrorCallback+0x2c>)
  36261. 800fb16: 681b ldr r3, [r3, #0]
  36262. 800fb18: 4618 mov r0, r3
  36263. 800fb1a: f001 f937 bl 8010d8c <osSemaphoreRelease>
  36264. }
  36265. }
  36266. 800fb1e: bf00 nop
  36267. 800fb20: 3708 adds r7, #8
  36268. 800fb22: 46bd mov sp, r7
  36269. 800fb24: bd80 pop {r7, pc}
  36270. 800fb26: bf00 nop
  36271. 800fb28: 240021e4 .word 0x240021e4
  36272. 0800fb2c <low_level_init>:
  36273. *
  36274. * @param netif the already initialized lwip network interface structure
  36275. * for this ethernetif
  36276. */
  36277. static void low_level_init(struct netif *netif)
  36278. {
  36279. 800fb2c: b580 push {r7, lr}
  36280. 800fb2e: b0aa sub sp, #168 @ 0xa8
  36281. 800fb30: af00 add r7, sp, #0
  36282. 800fb32: 6078 str r0, [r7, #4]
  36283. HAL_StatusTypeDef hal_eth_init_status = HAL_OK;
  36284. 800fb34: 2300 movs r3, #0
  36285. 800fb36: f887 309f strb.w r3, [r7, #159] @ 0x9f
  36286. /* USER CODE BEGIN OS_THREAD_ATTR_CMSIS_RTOS_V2 */
  36287. osThreadAttr_t attributes;
  36288. /* USER CODE END OS_THREAD_ATTR_CMSIS_RTOS_V2 */
  36289. uint32_t duplex, speed = 0;
  36290. 800fb3a: 2300 movs r3, #0
  36291. 800fb3c: f8c7 30a0 str.w r3, [r7, #160] @ 0xa0
  36292. int32_t PHYLinkState = 0;
  36293. 800fb40: 2300 movs r3, #0
  36294. 800fb42: f8c7 3098 str.w r3, [r7, #152] @ 0x98
  36295. ETH_MACConfigTypeDef MACConf = {0};
  36296. 800fb46: f107 0310 add.w r3, r7, #16
  36297. 800fb4a: 2264 movs r2, #100 @ 0x64
  36298. 800fb4c: 2100 movs r1, #0
  36299. 800fb4e: 4618 mov r0, r3
  36300. 800fb50: f01a f8ce bl 8029cf0 <memset>
  36301. /* Start ETH HAL Init */
  36302. uint8_t MACAddr[6] ;
  36303. heth.Instance = ETH;
  36304. 800fb54: 4b86 ldr r3, [pc, #536] @ (800fd70 <low_level_init+0x244>)
  36305. 800fb56: 4a87 ldr r2, [pc, #540] @ (800fd74 <low_level_init+0x248>)
  36306. 800fb58: 601a str r2, [r3, #0]
  36307. // MACAddr[1] = 0x80;
  36308. // MACAddr[2] = 0xE1;
  36309. // MACAddr[3] = 0x00;
  36310. // MACAddr[4] = 0x00;
  36311. // MACAddr[5] = 0x00;
  36312. MACAddr[0] = 0x7C;
  36313. 800fb5a: 237c movs r3, #124 @ 0x7c
  36314. 800fb5c: 723b strb r3, [r7, #8]
  36315. MACAddr[1] = 0xF6;
  36316. 800fb5e: 23f6 movs r3, #246 @ 0xf6
  36317. 800fb60: 727b strb r3, [r7, #9]
  36318. MACAddr[2] = 0x66;
  36319. 800fb62: 2366 movs r3, #102 @ 0x66
  36320. 800fb64: 72bb strb r3, [r7, #10]
  36321. MACAddr[3] = 0xE4;
  36322. 800fb66: 23e4 movs r3, #228 @ 0xe4
  36323. 800fb68: 72fb strb r3, [r7, #11]
  36324. MACAddr[4] = 0xB5;
  36325. 800fb6a: 23b5 movs r3, #181 @ 0xb5
  36326. 800fb6c: 733b strb r3, [r7, #12]
  36327. MACAddr[5] = 0x41;
  36328. 800fb6e: 2341 movs r3, #65 @ 0x41
  36329. 800fb70: 737b strb r3, [r7, #13]
  36330. heth.Init.MACAddr = &MACAddr[0];
  36331. 800fb72: 4a7f ldr r2, [pc, #508] @ (800fd70 <low_level_init+0x244>)
  36332. 800fb74: f107 0308 add.w r3, r7, #8
  36333. 800fb78: 6053 str r3, [r2, #4]
  36334. heth.Init.MediaInterface = HAL_ETH_MII_MODE;
  36335. 800fb7a: 4b7d ldr r3, [pc, #500] @ (800fd70 <low_level_init+0x244>)
  36336. 800fb7c: 2200 movs r2, #0
  36337. 800fb7e: 721a strb r2, [r3, #8]
  36338. heth.Init.TxDesc = DMATxDscrTab;
  36339. 800fb80: 4b7b ldr r3, [pc, #492] @ (800fd70 <low_level_init+0x244>)
  36340. 800fb82: 4a7d ldr r2, [pc, #500] @ (800fd78 <low_level_init+0x24c>)
  36341. 800fb84: 60da str r2, [r3, #12]
  36342. heth.Init.RxDesc = DMARxDscrTab;
  36343. 800fb86: 4b7a ldr r3, [pc, #488] @ (800fd70 <low_level_init+0x244>)
  36344. 800fb88: 4a7c ldr r2, [pc, #496] @ (800fd7c <low_level_init+0x250>)
  36345. 800fb8a: 611a str r2, [r3, #16]
  36346. heth.Init.RxBuffLen = 1536;
  36347. 800fb8c: 4b78 ldr r3, [pc, #480] @ (800fd70 <low_level_init+0x244>)
  36348. 800fb8e: f44f 62c0 mov.w r2, #1536 @ 0x600
  36349. 800fb92: 615a str r2, [r3, #20]
  36350. /* USER CODE BEGIN MACADDRESS */
  36351. /* USER CODE END MACADDRESS */
  36352. hal_eth_init_status = HAL_ETH_Init(&heth);
  36353. 800fb94: 4876 ldr r0, [pc, #472] @ (800fd70 <low_level_init+0x244>)
  36354. 800fb96: f7f8 f81f bl 8007bd8 <HAL_ETH_Init>
  36355. 800fb9a: 4603 mov r3, r0
  36356. 800fb9c: f887 309f strb.w r3, [r7, #159] @ 0x9f
  36357. memset(&TxConfig, 0 , sizeof(ETH_TxPacketConfig));
  36358. 800fba0: 2238 movs r2, #56 @ 0x38
  36359. 800fba2: 2100 movs r1, #0
  36360. 800fba4: 4876 ldr r0, [pc, #472] @ (800fd80 <low_level_init+0x254>)
  36361. 800fba6: f01a f8a3 bl 8029cf0 <memset>
  36362. TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
  36363. 800fbaa: 4b75 ldr r3, [pc, #468] @ (800fd80 <low_level_init+0x254>)
  36364. 800fbac: 2221 movs r2, #33 @ 0x21
  36365. 800fbae: 601a str r2, [r3, #0]
  36366. TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;
  36367. 800fbb0: 4b73 ldr r3, [pc, #460] @ (800fd80 <low_level_init+0x254>)
  36368. 800fbb2: f44f 3240 mov.w r2, #196608 @ 0x30000
  36369. 800fbb6: 615a str r2, [r3, #20]
  36370. TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;
  36371. 800fbb8: 4b71 ldr r3, [pc, #452] @ (800fd80 <low_level_init+0x254>)
  36372. 800fbba: 2200 movs r2, #0
  36373. 800fbbc: 611a str r2, [r3, #16]
  36374. /* End ETH HAL Init */
  36375. /* Initialize the RX POOL */
  36376. LWIP_MEMPOOL_INIT(RX_POOL);
  36377. 800fbbe: 4871 ldr r0, [pc, #452] @ (800fd84 <low_level_init+0x258>)
  36378. 800fbc0: f009 fc8a bl 80194d8 <memp_init_pool>
  36379. #if LWIP_ARP || LWIP_ETHERNET
  36380. /* set MAC hardware address length */
  36381. netif->hwaddr_len = ETH_HWADDR_LEN;
  36382. 800fbc4: 687b ldr r3, [r7, #4]
  36383. 800fbc6: 2206 movs r2, #6
  36384. 800fbc8: f883 2030 strb.w r2, [r3, #48] @ 0x30
  36385. /* set MAC hardware address */
  36386. netif->hwaddr[0] = heth.Init.MACAddr[0];
  36387. 800fbcc: 4b68 ldr r3, [pc, #416] @ (800fd70 <low_level_init+0x244>)
  36388. 800fbce: 685b ldr r3, [r3, #4]
  36389. 800fbd0: 781a ldrb r2, [r3, #0]
  36390. 800fbd2: 687b ldr r3, [r7, #4]
  36391. 800fbd4: f883 202a strb.w r2, [r3, #42] @ 0x2a
  36392. netif->hwaddr[1] = heth.Init.MACAddr[1];
  36393. 800fbd8: 4b65 ldr r3, [pc, #404] @ (800fd70 <low_level_init+0x244>)
  36394. 800fbda: 685b ldr r3, [r3, #4]
  36395. 800fbdc: 785a ldrb r2, [r3, #1]
  36396. 800fbde: 687b ldr r3, [r7, #4]
  36397. 800fbe0: f883 202b strb.w r2, [r3, #43] @ 0x2b
  36398. netif->hwaddr[2] = heth.Init.MACAddr[2];
  36399. 800fbe4: 4b62 ldr r3, [pc, #392] @ (800fd70 <low_level_init+0x244>)
  36400. 800fbe6: 685b ldr r3, [r3, #4]
  36401. 800fbe8: 789a ldrb r2, [r3, #2]
  36402. 800fbea: 687b ldr r3, [r7, #4]
  36403. 800fbec: f883 202c strb.w r2, [r3, #44] @ 0x2c
  36404. netif->hwaddr[3] = heth.Init.MACAddr[3];
  36405. 800fbf0: 4b5f ldr r3, [pc, #380] @ (800fd70 <low_level_init+0x244>)
  36406. 800fbf2: 685b ldr r3, [r3, #4]
  36407. 800fbf4: 78da ldrb r2, [r3, #3]
  36408. 800fbf6: 687b ldr r3, [r7, #4]
  36409. 800fbf8: f883 202d strb.w r2, [r3, #45] @ 0x2d
  36410. netif->hwaddr[4] = heth.Init.MACAddr[4];
  36411. 800fbfc: 4b5c ldr r3, [pc, #368] @ (800fd70 <low_level_init+0x244>)
  36412. 800fbfe: 685b ldr r3, [r3, #4]
  36413. 800fc00: 791a ldrb r2, [r3, #4]
  36414. 800fc02: 687b ldr r3, [r7, #4]
  36415. 800fc04: f883 202e strb.w r2, [r3, #46] @ 0x2e
  36416. netif->hwaddr[5] = heth.Init.MACAddr[5];
  36417. 800fc08: 4b59 ldr r3, [pc, #356] @ (800fd70 <low_level_init+0x244>)
  36418. 800fc0a: 685b ldr r3, [r3, #4]
  36419. 800fc0c: 795a ldrb r2, [r3, #5]
  36420. 800fc0e: 687b ldr r3, [r7, #4]
  36421. 800fc10: f883 202f strb.w r2, [r3, #47] @ 0x2f
  36422. /* maximum transfer unit */
  36423. netif->mtu = ETH_MAX_PAYLOAD;
  36424. 800fc14: 687b ldr r3, [r7, #4]
  36425. 800fc16: f240 52dc movw r2, #1500 @ 0x5dc
  36426. 800fc1a: 851a strh r2, [r3, #40] @ 0x28
  36427. /* Accept broadcast address and ARP traffic */
  36428. /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
  36429. #if LWIP_ARP
  36430. netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  36431. 800fc1c: 687b ldr r3, [r7, #4]
  36432. 800fc1e: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  36433. 800fc22: f043 030a orr.w r3, r3, #10
  36434. 800fc26: b2da uxtb r2, r3
  36435. 800fc28: 687b ldr r3, [r7, #4]
  36436. 800fc2a: f883 2031 strb.w r2, [r3, #49] @ 0x31
  36437. #else
  36438. netif->flags |= NETIF_FLAG_BROADCAST;
  36439. #endif /* LWIP_ARP */
  36440. /* create a binary semaphore used for informing ethernetif of frame reception */
  36441. RxPktSemaphore = osSemaphoreNew(1, 1, NULL);
  36442. 800fc2e: 2200 movs r2, #0
  36443. 800fc30: 2101 movs r1, #1
  36444. 800fc32: 2001 movs r0, #1
  36445. 800fc34: f000 ffce bl 8010bd4 <osSemaphoreNew>
  36446. 800fc38: 4603 mov r3, r0
  36447. 800fc3a: 4a53 ldr r2, [pc, #332] @ (800fd88 <low_level_init+0x25c>)
  36448. 800fc3c: 6013 str r3, [r2, #0]
  36449. /* create a binary semaphore used for informing ethernetif of frame transmission */
  36450. TxPktSemaphore = osSemaphoreNew(1, 1, NULL);
  36451. 800fc3e: 2200 movs r2, #0
  36452. 800fc40: 2101 movs r1, #1
  36453. 800fc42: 2001 movs r0, #1
  36454. 800fc44: f000 ffc6 bl 8010bd4 <osSemaphoreNew>
  36455. 800fc48: 4603 mov r3, r0
  36456. 800fc4a: 4a50 ldr r2, [pc, #320] @ (800fd8c <low_level_init+0x260>)
  36457. 800fc4c: 6013 str r3, [r2, #0]
  36458. /* create the task that handles the ETH_MAC */
  36459. /* USER CODE BEGIN OS_THREAD_NEW_CMSIS_RTOS_V2 */
  36460. memset(&attributes, 0x0, sizeof(osThreadAttr_t));
  36461. 800fc4e: f107 0374 add.w r3, r7, #116 @ 0x74
  36462. 800fc52: 2224 movs r2, #36 @ 0x24
  36463. 800fc54: 2100 movs r1, #0
  36464. 800fc56: 4618 mov r0, r3
  36465. 800fc58: f01a f84a bl 8029cf0 <memset>
  36466. attributes.name = "EthIf";
  36467. 800fc5c: 4b4c ldr r3, [pc, #304] @ (800fd90 <low_level_init+0x264>)
  36468. 800fc5e: 677b str r3, [r7, #116] @ 0x74
  36469. attributes.stack_size = INTERFACE_THREAD_STACK_SIZE;
  36470. 800fc60: f44f 6380 mov.w r3, #1024 @ 0x400
  36471. 800fc64: f8c7 3088 str.w r3, [r7, #136] @ 0x88
  36472. attributes.priority = osPriorityRealtime;
  36473. 800fc68: 2330 movs r3, #48 @ 0x30
  36474. 800fc6a: f8c7 308c str.w r3, [r7, #140] @ 0x8c
  36475. osThreadNew(ethernetif_input, netif, &attributes);
  36476. 800fc6e: f107 0374 add.w r3, r7, #116 @ 0x74
  36477. 800fc72: 461a mov r2, r3
  36478. 800fc74: 6879 ldr r1, [r7, #4]
  36479. 800fc76: 4847 ldr r0, [pc, #284] @ (800fd94 <low_level_init+0x268>)
  36480. 800fc78: f000 fde5 bl 8010846 <osThreadNew>
  36481. /* USER CODE BEGIN PHY_PRE_CONFIG */
  36482. /* USER CODE END PHY_PRE_CONFIG */
  36483. /* Set PHY IO functions */
  36484. DP83848_RegisterBusIO(&DP83848, &DP83848_IOCtx);
  36485. 800fc7c: 4946 ldr r1, [pc, #280] @ (800fd98 <low_level_init+0x26c>)
  36486. 800fc7e: 4847 ldr r0, [pc, #284] @ (800fd9c <low_level_init+0x270>)
  36487. 800fc80: f7f5 f87f bl 8004d82 <DP83848_RegisterBusIO>
  36488. /* Initialize the DP83848 ETH PHY */
  36489. DP83848_Init(&DP83848);
  36490. 800fc84: 4845 ldr r0, [pc, #276] @ (800fd9c <low_level_init+0x270>)
  36491. 800fc86: f7f5 f8ae bl 8004de6 <DP83848_Init>
  36492. if (hal_eth_init_status == HAL_OK)
  36493. 800fc8a: f897 309f ldrb.w r3, [r7, #159] @ 0x9f
  36494. 800fc8e: 2b00 cmp r3, #0
  36495. 800fc90: d168 bne.n 800fd64 <low_level_init+0x238>
  36496. {
  36497. PHYLinkState = DP83848_GetLinkState(&DP83848);
  36498. 800fc92: 4842 ldr r0, [pc, #264] @ (800fd9c <low_level_init+0x270>)
  36499. 800fc94: f7f5 f8f4 bl 8004e80 <DP83848_GetLinkState>
  36500. 800fc98: f8c7 0098 str.w r0, [r7, #152] @ 0x98
  36501. /* Get link state */
  36502. if(PHYLinkState <= DP83848_STATUS_LINK_DOWN)
  36503. 800fc9c: f8d7 3098 ldr.w r3, [r7, #152] @ 0x98
  36504. 800fca0: 2b01 cmp r3, #1
  36505. 800fca2: dc06 bgt.n 800fcb2 <low_level_init+0x186>
  36506. {
  36507. netif_set_link_down(netif);
  36508. 800fca4: 6878 ldr r0, [r7, #4]
  36509. 800fca6: f00a f807 bl 8019cb8 <netif_set_link_down>
  36510. netif_set_down(netif);
  36511. 800fcaa: 6878 ldr r0, [r7, #4]
  36512. 800fcac: f009 ff96 bl 8019bdc <netif_set_down>
  36513. #endif /* LWIP_ARP || LWIP_ETHERNET */
  36514. /* USER CODE BEGIN LOW_LEVEL_INIT */
  36515. /* USER CODE END LOW_LEVEL_INIT */
  36516. }
  36517. 800fcb0: e05a b.n 800fd68 <low_level_init+0x23c>
  36518. switch (PHYLinkState)
  36519. 800fcb2: f8d7 3098 ldr.w r3, [r7, #152] @ 0x98
  36520. 800fcb6: 3b02 subs r3, #2
  36521. 800fcb8: 2b03 cmp r3, #3
  36522. 800fcba: d82b bhi.n 800fd14 <low_level_init+0x1e8>
  36523. 800fcbc: a201 add r2, pc, #4 @ (adr r2, 800fcc4 <low_level_init+0x198>)
  36524. 800fcbe: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  36525. 800fcc2: bf00 nop
  36526. 800fcc4: 0800fcd5 .word 0x0800fcd5
  36527. 800fcc8: 0800fce7 .word 0x0800fce7
  36528. 800fccc: 0800fcf7 .word 0x0800fcf7
  36529. 800fcd0: 0800fd07 .word 0x0800fd07
  36530. duplex = ETH_FULLDUPLEX_MODE;
  36531. 800fcd4: f44f 5300 mov.w r3, #8192 @ 0x2000
  36532. 800fcd8: f8c7 30a4 str.w r3, [r7, #164] @ 0xa4
  36533. speed = ETH_SPEED_100M;
  36534. 800fcdc: f44f 4380 mov.w r3, #16384 @ 0x4000
  36535. 800fce0: f8c7 30a0 str.w r3, [r7, #160] @ 0xa0
  36536. break;
  36537. 800fce4: e01f b.n 800fd26 <low_level_init+0x1fa>
  36538. duplex = ETH_HALFDUPLEX_MODE;
  36539. 800fce6: 2300 movs r3, #0
  36540. 800fce8: f8c7 30a4 str.w r3, [r7, #164] @ 0xa4
  36541. speed = ETH_SPEED_100M;
  36542. 800fcec: f44f 4380 mov.w r3, #16384 @ 0x4000
  36543. 800fcf0: f8c7 30a0 str.w r3, [r7, #160] @ 0xa0
  36544. break;
  36545. 800fcf4: e017 b.n 800fd26 <low_level_init+0x1fa>
  36546. duplex = ETH_FULLDUPLEX_MODE;
  36547. 800fcf6: f44f 5300 mov.w r3, #8192 @ 0x2000
  36548. 800fcfa: f8c7 30a4 str.w r3, [r7, #164] @ 0xa4
  36549. speed = ETH_SPEED_10M;
  36550. 800fcfe: 2300 movs r3, #0
  36551. 800fd00: f8c7 30a0 str.w r3, [r7, #160] @ 0xa0
  36552. break;
  36553. 800fd04: e00f b.n 800fd26 <low_level_init+0x1fa>
  36554. duplex = ETH_HALFDUPLEX_MODE;
  36555. 800fd06: 2300 movs r3, #0
  36556. 800fd08: f8c7 30a4 str.w r3, [r7, #164] @ 0xa4
  36557. speed = ETH_SPEED_10M;
  36558. 800fd0c: 2300 movs r3, #0
  36559. 800fd0e: f8c7 30a0 str.w r3, [r7, #160] @ 0xa0
  36560. break;
  36561. 800fd12: e008 b.n 800fd26 <low_level_init+0x1fa>
  36562. duplex = ETH_FULLDUPLEX_MODE;
  36563. 800fd14: f44f 5300 mov.w r3, #8192 @ 0x2000
  36564. 800fd18: f8c7 30a4 str.w r3, [r7, #164] @ 0xa4
  36565. speed = ETH_SPEED_100M;
  36566. 800fd1c: f44f 4380 mov.w r3, #16384 @ 0x4000
  36567. 800fd20: f8c7 30a0 str.w r3, [r7, #160] @ 0xa0
  36568. break;
  36569. 800fd24: bf00 nop
  36570. HAL_ETH_GetMACConfig(&heth, &MACConf);
  36571. 800fd26: f107 0310 add.w r3, r7, #16
  36572. 800fd2a: 4619 mov r1, r3
  36573. 800fd2c: 4810 ldr r0, [pc, #64] @ (800fd70 <low_level_init+0x244>)
  36574. 800fd2e: f7f8 fce1 bl 80086f4 <HAL_ETH_GetMACConfig>
  36575. MACConf.DuplexMode = duplex;
  36576. 800fd32: f8d7 30a4 ldr.w r3, [r7, #164] @ 0xa4
  36577. 800fd36: 62bb str r3, [r7, #40] @ 0x28
  36578. MACConf.Speed = speed;
  36579. 800fd38: f8d7 30a0 ldr.w r3, [r7, #160] @ 0xa0
  36580. 800fd3c: 627b str r3, [r7, #36] @ 0x24
  36581. HAL_ETH_SetMACConfig(&heth, &MACConf);
  36582. 800fd3e: f107 0310 add.w r3, r7, #16
  36583. 800fd42: 4619 mov r1, r3
  36584. 800fd44: 480a ldr r0, [pc, #40] @ (800fd70 <low_level_init+0x244>)
  36585. 800fd46: f7f8 fea9 bl 8008a9c <HAL_ETH_SetMACConfig>
  36586. HAL_ETH_Start_IT(&heth);
  36587. 800fd4a: 4809 ldr r0, [pc, #36] @ (800fd70 <low_level_init+0x244>)
  36588. 800fd4c: f7f8 f842 bl 8007dd4 <HAL_ETH_Start_IT>
  36589. netif_set_up(netif);
  36590. 800fd50: 6878 ldr r0, [r7, #4]
  36591. 800fd52: f009 fed5 bl 8019b00 <netif_set_up>
  36592. netif_set_link_up(netif);
  36593. 800fd56: 6878 ldr r0, [r7, #4]
  36594. 800fd58: f009 ff74 bl 8019c44 <netif_set_link_up>
  36595. ethernetif_notify_conn_changed(netif);
  36596. 800fd5c: 6878 ldr r0, [r7, #4]
  36597. 800fd5e: f000 fb1b bl 8010398 <ethernetif_notify_conn_changed>
  36598. }
  36599. 800fd62: e001 b.n 800fd68 <low_level_init+0x23c>
  36600. Error_Handler();
  36601. 800fd64: f7f2 fbd0 bl 8002508 <Error_Handler>
  36602. }
  36603. 800fd68: bf00 nop
  36604. 800fd6a: 37a8 adds r7, #168 @ 0xa8
  36605. 800fd6c: 46bd mov sp, r7
  36606. 800fd6e: bd80 pop {r7, pc}
  36607. 800fd70: 240021ec .word 0x240021ec
  36608. 800fd74: 40028000 .word 0x40028000
  36609. 800fd78: 24040100 .word 0x24040100
  36610. 800fd7c: 24040000 .word 0x24040000
  36611. 800fd80: 2400229c .word 0x2400229c
  36612. 800fd84: 08030a64 .word 0x08030a64
  36613. 800fd88: 240021e4 .word 0x240021e4
  36614. 800fd8c: 240021e8 .word 0x240021e8
  36615. 800fd90: 0802c9f8 .word 0x0802c9f8
  36616. 800fd94: 0800ff09 .word 0x0800ff09
  36617. 800fd98: 24000034 .word 0x24000034
  36618. 800fd9c: 240022d4 .word 0x240022d4
  36619. 0800fda0 <low_level_output>:
  36620. * to become available since the stack doesn't retry to send a packet
  36621. * dropped because of memory failure (except for the TCP timers).
  36622. */
  36623. static err_t low_level_output(struct netif *netif, struct pbuf *p)
  36624. {
  36625. 800fda0: b580 push {r7, lr}
  36626. 800fda2: b092 sub sp, #72 @ 0x48
  36627. 800fda4: af00 add r7, sp, #0
  36628. 800fda6: 6078 str r0, [r7, #4]
  36629. 800fda8: 6039 str r1, [r7, #0]
  36630. uint32_t i = 0U;
  36631. 800fdaa: 2300 movs r3, #0
  36632. 800fdac: 647b str r3, [r7, #68] @ 0x44
  36633. struct pbuf *q = NULL;
  36634. 800fdae: 2300 movs r3, #0
  36635. 800fdb0: 643b str r3, [r7, #64] @ 0x40
  36636. err_t errval = ERR_OK;
  36637. 800fdb2: 2300 movs r3, #0
  36638. 800fdb4: f887 303f strb.w r3, [r7, #63] @ 0x3f
  36639. ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT] = {0};
  36640. 800fdb8: f107 030c add.w r3, r7, #12
  36641. 800fdbc: 2230 movs r2, #48 @ 0x30
  36642. 800fdbe: 2100 movs r1, #0
  36643. 800fdc0: 4618 mov r0, r3
  36644. 800fdc2: f019 ff95 bl 8029cf0 <memset>
  36645. memset(Txbuffer, 0 , ETH_TX_DESC_CNT*sizeof(ETH_BufferTypeDef));
  36646. 800fdc6: f107 030c add.w r3, r7, #12
  36647. 800fdca: 2230 movs r2, #48 @ 0x30
  36648. 800fdcc: 2100 movs r1, #0
  36649. 800fdce: 4618 mov r0, r3
  36650. 800fdd0: f019 ff8e bl 8029cf0 <memset>
  36651. for(q = p; q != NULL; q = q->next)
  36652. 800fdd4: 683b ldr r3, [r7, #0]
  36653. 800fdd6: 643b str r3, [r7, #64] @ 0x40
  36654. 800fdd8: e045 b.n 800fe66 <low_level_output+0xc6>
  36655. {
  36656. if(i >= ETH_TX_DESC_CNT)
  36657. 800fdda: 6c7b ldr r3, [r7, #68] @ 0x44
  36658. 800fddc: 2b03 cmp r3, #3
  36659. 800fdde: d902 bls.n 800fde6 <low_level_output+0x46>
  36660. return ERR_IF;
  36661. 800fde0: f06f 030b mvn.w r3, #11
  36662. 800fde4: e06c b.n 800fec0 <low_level_output+0x120>
  36663. Txbuffer[i].buffer = q->payload;
  36664. 800fde6: 6c3b ldr r3, [r7, #64] @ 0x40
  36665. 800fde8: 6859 ldr r1, [r3, #4]
  36666. 800fdea: 6c7a ldr r2, [r7, #68] @ 0x44
  36667. 800fdec: 4613 mov r3, r2
  36668. 800fdee: 005b lsls r3, r3, #1
  36669. 800fdf0: 4413 add r3, r2
  36670. 800fdf2: 009b lsls r3, r3, #2
  36671. 800fdf4: 3348 adds r3, #72 @ 0x48
  36672. 800fdf6: 443b add r3, r7
  36673. 800fdf8: 3b3c subs r3, #60 @ 0x3c
  36674. 800fdfa: 6019 str r1, [r3, #0]
  36675. Txbuffer[i].len = q->len;
  36676. 800fdfc: 6c3b ldr r3, [r7, #64] @ 0x40
  36677. 800fdfe: 895b ldrh r3, [r3, #10]
  36678. 800fe00: 4619 mov r1, r3
  36679. 800fe02: 6c7a ldr r2, [r7, #68] @ 0x44
  36680. 800fe04: 4613 mov r3, r2
  36681. 800fe06: 005b lsls r3, r3, #1
  36682. 800fe08: 4413 add r3, r2
  36683. 800fe0a: 009b lsls r3, r3, #2
  36684. 800fe0c: 3348 adds r3, #72 @ 0x48
  36685. 800fe0e: 443b add r3, r7
  36686. 800fe10: 3b38 subs r3, #56 @ 0x38
  36687. 800fe12: 6019 str r1, [r3, #0]
  36688. if(i>0)
  36689. 800fe14: 6c7b ldr r3, [r7, #68] @ 0x44
  36690. 800fe16: 2b00 cmp r3, #0
  36691. 800fe18: d011 beq.n 800fe3e <low_level_output+0x9e>
  36692. {
  36693. Txbuffer[i-1].next = &Txbuffer[i];
  36694. 800fe1a: 6c7b ldr r3, [r7, #68] @ 0x44
  36695. 800fe1c: 1e5a subs r2, r3, #1
  36696. 800fe1e: f107 000c add.w r0, r7, #12
  36697. 800fe22: 6c79 ldr r1, [r7, #68] @ 0x44
  36698. 800fe24: 460b mov r3, r1
  36699. 800fe26: 005b lsls r3, r3, #1
  36700. 800fe28: 440b add r3, r1
  36701. 800fe2a: 009b lsls r3, r3, #2
  36702. 800fe2c: 18c1 adds r1, r0, r3
  36703. 800fe2e: 4613 mov r3, r2
  36704. 800fe30: 005b lsls r3, r3, #1
  36705. 800fe32: 4413 add r3, r2
  36706. 800fe34: 009b lsls r3, r3, #2
  36707. 800fe36: 3348 adds r3, #72 @ 0x48
  36708. 800fe38: 443b add r3, r7
  36709. 800fe3a: 3b34 subs r3, #52 @ 0x34
  36710. 800fe3c: 6019 str r1, [r3, #0]
  36711. }
  36712. if(q->next == NULL)
  36713. 800fe3e: 6c3b ldr r3, [r7, #64] @ 0x40
  36714. 800fe40: 681b ldr r3, [r3, #0]
  36715. 800fe42: 2b00 cmp r3, #0
  36716. 800fe44: d109 bne.n 800fe5a <low_level_output+0xba>
  36717. {
  36718. Txbuffer[i].next = NULL;
  36719. 800fe46: 6c7a ldr r2, [r7, #68] @ 0x44
  36720. 800fe48: 4613 mov r3, r2
  36721. 800fe4a: 005b lsls r3, r3, #1
  36722. 800fe4c: 4413 add r3, r2
  36723. 800fe4e: 009b lsls r3, r3, #2
  36724. 800fe50: 3348 adds r3, #72 @ 0x48
  36725. 800fe52: 443b add r3, r7
  36726. 800fe54: 3b34 subs r3, #52 @ 0x34
  36727. 800fe56: 2200 movs r2, #0
  36728. 800fe58: 601a str r2, [r3, #0]
  36729. }
  36730. i++;
  36731. 800fe5a: 6c7b ldr r3, [r7, #68] @ 0x44
  36732. 800fe5c: 3301 adds r3, #1
  36733. 800fe5e: 647b str r3, [r7, #68] @ 0x44
  36734. for(q = p; q != NULL; q = q->next)
  36735. 800fe60: 6c3b ldr r3, [r7, #64] @ 0x40
  36736. 800fe62: 681b ldr r3, [r3, #0]
  36737. 800fe64: 643b str r3, [r7, #64] @ 0x40
  36738. 800fe66: 6c3b ldr r3, [r7, #64] @ 0x40
  36739. 800fe68: 2b00 cmp r3, #0
  36740. 800fe6a: d1b6 bne.n 800fdda <low_level_output+0x3a>
  36741. }
  36742. TxConfig.Length = p->tot_len;
  36743. 800fe6c: 683b ldr r3, [r7, #0]
  36744. 800fe6e: 891b ldrh r3, [r3, #8]
  36745. 800fe70: 461a mov r2, r3
  36746. 800fe72: 4b15 ldr r3, [pc, #84] @ (800fec8 <low_level_output+0x128>)
  36747. 800fe74: 605a str r2, [r3, #4]
  36748. TxConfig.TxBuffer = Txbuffer;
  36749. 800fe76: 4a14 ldr r2, [pc, #80] @ (800fec8 <low_level_output+0x128>)
  36750. 800fe78: f107 030c add.w r3, r7, #12
  36751. 800fe7c: 6093 str r3, [r2, #8]
  36752. TxConfig.pData = p;
  36753. 800fe7e: 4a12 ldr r2, [pc, #72] @ (800fec8 <low_level_output+0x128>)
  36754. 800fe80: 683b ldr r3, [r7, #0]
  36755. 800fe82: 6353 str r3, [r2, #52] @ 0x34
  36756. pbuf_ref(p);
  36757. 800fe84: 6838 ldr r0, [r7, #0]
  36758. 800fe86: f00a fbcf bl 801a628 <pbuf_ref>
  36759. #if 1
  36760. if (HAL_ETH_Transmit_IT(&heth, &TxConfig) == HAL_OK) {
  36761. 800fe8a: 490f ldr r1, [pc, #60] @ (800fec8 <low_level_output+0x128>)
  36762. 800fe8c: 480f ldr r0, [pc, #60] @ (800fecc <low_level_output+0x12c>)
  36763. 800fe8e: f7f8 f88d bl 8007fac <HAL_ETH_Transmit_IT>
  36764. 800fe92: 4603 mov r3, r0
  36765. 800fe94: 2b00 cmp r3, #0
  36766. 800fe96: d10e bne.n 800feb6 <low_level_output+0x116>
  36767. while(osSemaphoreAcquire(TxPktSemaphore, TIME_WAITING_FOR_INPUT)!=osOK)
  36768. 800fe98: bf00 nop
  36769. 800fe9a: 4b0d ldr r3, [pc, #52] @ (800fed0 <low_level_output+0x130>)
  36770. 800fe9c: 681b ldr r3, [r3, #0]
  36771. 800fe9e: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  36772. 800fea2: 4618 mov r0, r3
  36773. 800fea4: f000 ff20 bl 8010ce8 <osSemaphoreAcquire>
  36774. 800fea8: 4603 mov r3, r0
  36775. 800feaa: 2b00 cmp r3, #0
  36776. 800feac: d1f5 bne.n 800fe9a <low_level_output+0xfa>
  36777. {
  36778. }
  36779. // osSemaphoreAcquire(TxPktSemaphore, pdMS_TO_TICKS(1000));
  36780. HAL_ETH_ReleaseTxPacket(&heth);
  36781. 800feae: 4807 ldr r0, [pc, #28] @ (800fecc <low_level_output+0x12c>)
  36782. 800feb0: f7f8 fa03 bl 80082ba <HAL_ETH_ReleaseTxPacket>
  36783. 800feb4: e002 b.n 800febc <low_level_output+0x11c>
  36784. } else {
  36785. pbuf_free(p);
  36786. 800feb6: 6838 ldr r0, [r7, #0]
  36787. 800feb8: f00a fb10 bl 801a4dc <pbuf_free>
  36788. HAL_ETH_Transmit_IT(&heth, &TxConfig);
  36789. osSemaphoreAcquire(TxPktSemaphore, pdMS_TO_TICKS(100));
  36790. HAL_ETH_ReleaseTxPacket(&heth);
  36791. #endif
  36792. return errval;
  36793. 800febc: f997 303f ldrsb.w r3, [r7, #63] @ 0x3f
  36794. }
  36795. 800fec0: 4618 mov r0, r3
  36796. 800fec2: 3748 adds r7, #72 @ 0x48
  36797. 800fec4: 46bd mov sp, r7
  36798. 800fec6: bd80 pop {r7, pc}
  36799. 800fec8: 2400229c .word 0x2400229c
  36800. 800fecc: 240021ec .word 0x240021ec
  36801. 800fed0: 240021e8 .word 0x240021e8
  36802. 0800fed4 <low_level_input>:
  36803. * @param netif the lwip network interface structure for this ethernetif
  36804. * @return a pbuf filled with the received packet (including MAC header)
  36805. * NULL on memory error
  36806. */
  36807. static struct pbuf * low_level_input(struct netif *netif)
  36808. {
  36809. 800fed4: b580 push {r7, lr}
  36810. 800fed6: b084 sub sp, #16
  36811. 800fed8: af00 add r7, sp, #0
  36812. 800feda: 6078 str r0, [r7, #4]
  36813. struct pbuf *p = NULL;
  36814. 800fedc: 2300 movs r3, #0
  36815. 800fede: 60fb str r3, [r7, #12]
  36816. if(RxAllocStatus == RX_ALLOC_OK)
  36817. 800fee0: 4b07 ldr r3, [pc, #28] @ (800ff00 <low_level_input+0x2c>)
  36818. 800fee2: 781b ldrb r3, [r3, #0]
  36819. 800fee4: 2b00 cmp r3, #0
  36820. 800fee6: d105 bne.n 800fef4 <low_level_input+0x20>
  36821. {
  36822. HAL_ETH_ReadData(&heth, (void **)&p);
  36823. 800fee8: f107 030c add.w r3, r7, #12
  36824. 800feec: 4619 mov r1, r3
  36825. 800feee: 4805 ldr r0, [pc, #20] @ (800ff04 <low_level_input+0x30>)
  36826. 800fef0: f7f8 f8ad bl 800804e <HAL_ETH_ReadData>
  36827. }
  36828. return p;
  36829. 800fef4: 68fb ldr r3, [r7, #12]
  36830. }
  36831. 800fef6: 4618 mov r0, r3
  36832. 800fef8: 3710 adds r7, #16
  36833. 800fefa: 46bd mov sp, r7
  36834. 800fefc: bd80 pop {r7, pc}
  36835. 800fefe: bf00 nop
  36836. 800ff00: 240021e0 .word 0x240021e0
  36837. 800ff04: 240021ec .word 0x240021ec
  36838. 0800ff08 <ethernetif_input>:
  36839. * the appropriate input function is called.
  36840. *
  36841. * @param netif the lwip network interface structure for this ethernetif
  36842. */
  36843. void ethernetif_input(void* argument)
  36844. {
  36845. 800ff08: b580 push {r7, lr}
  36846. 800ff0a: b084 sub sp, #16
  36847. 800ff0c: af00 add r7, sp, #0
  36848. 800ff0e: 6078 str r0, [r7, #4]
  36849. struct pbuf *p = NULL;
  36850. 800ff10: 2300 movs r3, #0
  36851. 800ff12: 60fb str r3, [r7, #12]
  36852. struct netif *netif = (struct netif *) argument;
  36853. 800ff14: 687b ldr r3, [r7, #4]
  36854. 800ff16: 60bb str r3, [r7, #8]
  36855. for( ;; )
  36856. {
  36857. if (osSemaphoreAcquire(RxPktSemaphore, TIME_WAITING_FOR_INPUT) == osOK)
  36858. 800ff18: 4b0f ldr r3, [pc, #60] @ (800ff58 <ethernetif_input+0x50>)
  36859. 800ff1a: 681b ldr r3, [r3, #0]
  36860. 800ff1c: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  36861. 800ff20: 4618 mov r0, r3
  36862. 800ff22: f000 fee1 bl 8010ce8 <osSemaphoreAcquire>
  36863. 800ff26: 4603 mov r3, r0
  36864. 800ff28: 2b00 cmp r3, #0
  36865. 800ff2a: d1f5 bne.n 800ff18 <ethernetif_input+0x10>
  36866. {
  36867. do
  36868. {
  36869. p = low_level_input( netif );
  36870. 800ff2c: 68b8 ldr r0, [r7, #8]
  36871. 800ff2e: f7ff ffd1 bl 800fed4 <low_level_input>
  36872. 800ff32: 60f8 str r0, [r7, #12]
  36873. if (p != NULL)
  36874. 800ff34: 68fb ldr r3, [r7, #12]
  36875. 800ff36: 2b00 cmp r3, #0
  36876. 800ff38: d00a beq.n 800ff50 <ethernetif_input+0x48>
  36877. {
  36878. if (netif->input( p, netif) != ERR_OK )
  36879. 800ff3a: 68bb ldr r3, [r7, #8]
  36880. 800ff3c: 691b ldr r3, [r3, #16]
  36881. 800ff3e: 68b9 ldr r1, [r7, #8]
  36882. 800ff40: 68f8 ldr r0, [r7, #12]
  36883. 800ff42: 4798 blx r3
  36884. 800ff44: 4603 mov r3, r0
  36885. 800ff46: 2b00 cmp r3, #0
  36886. 800ff48: d002 beq.n 800ff50 <ethernetif_input+0x48>
  36887. {
  36888. pbuf_free(p);
  36889. 800ff4a: 68f8 ldr r0, [r7, #12]
  36890. 800ff4c: f00a fac6 bl 801a4dc <pbuf_free>
  36891. }
  36892. }
  36893. } while(p!=NULL);
  36894. 800ff50: 68fb ldr r3, [r7, #12]
  36895. 800ff52: 2b00 cmp r3, #0
  36896. 800ff54: d1ea bne.n 800ff2c <ethernetif_input+0x24>
  36897. if (osSemaphoreAcquire(RxPktSemaphore, TIME_WAITING_FOR_INPUT) == osOK)
  36898. 800ff56: e7df b.n 800ff18 <ethernetif_input+0x10>
  36899. 800ff58: 240021e4 .word 0x240021e4
  36900. 0800ff5c <ethernetif_init>:
  36901. * @return ERR_OK if the loopif is initialized
  36902. * ERR_MEM if private data couldn't be allocated
  36903. * any other err_t on error
  36904. */
  36905. err_t ethernetif_init(struct netif *netif)
  36906. {
  36907. 800ff5c: b580 push {r7, lr}
  36908. 800ff5e: b082 sub sp, #8
  36909. 800ff60: af00 add r7, sp, #0
  36910. 800ff62: 6078 str r0, [r7, #4]
  36911. LWIP_ASSERT("netif != NULL", (netif != NULL));
  36912. 800ff64: 687b ldr r3, [r7, #4]
  36913. 800ff66: 2b00 cmp r3, #0
  36914. 800ff68: d106 bne.n 800ff78 <ethernetif_init+0x1c>
  36915. 800ff6a: 4b0e ldr r3, [pc, #56] @ (800ffa4 <ethernetif_init+0x48>)
  36916. 800ff6c: f240 2235 movw r2, #565 @ 0x235
  36917. 800ff70: 490d ldr r1, [pc, #52] @ (800ffa8 <ethernetif_init+0x4c>)
  36918. 800ff72: 480e ldr r0, [pc, #56] @ (800ffac <ethernetif_init+0x50>)
  36919. 800ff74: f019 fd2a bl 80299cc <iprintf>
  36920. * The last argument should be replaced with your link speed, in units
  36921. * of bits per second.
  36922. */
  36923. // MIB2_INIT_NETIF(netif, snmp_ifType_ethernet_csmacd, LINK_SPEED_OF_YOUR_NETIF_IN_BPS);
  36924. netif->name[0] = IFNAME0;
  36925. 800ff78: 687b ldr r3, [r7, #4]
  36926. 800ff7a: 2273 movs r2, #115 @ 0x73
  36927. 800ff7c: f883 2032 strb.w r2, [r3, #50] @ 0x32
  36928. netif->name[1] = IFNAME1;
  36929. 800ff80: 687b ldr r3, [r7, #4]
  36930. 800ff82: 2274 movs r2, #116 @ 0x74
  36931. 800ff84: f883 2033 strb.w r2, [r3, #51] @ 0x33
  36932. * is available...) */
  36933. #if LWIP_IPV4
  36934. #if LWIP_ARP || LWIP_ETHERNET
  36935. #if LWIP_ARP
  36936. netif->output = etharp_output;
  36937. 800ff88: 687b ldr r3, [r7, #4]
  36938. 800ff8a: 4a09 ldr r2, [pc, #36] @ (800ffb0 <ethernetif_init+0x54>)
  36939. 800ff8c: 615a str r2, [r3, #20]
  36940. #if LWIP_IPV6
  36941. netif->output_ip6 = ethip6_output;
  36942. #endif /* LWIP_IPV6 */
  36943. netif->linkoutput = low_level_output;
  36944. 800ff8e: 687b ldr r3, [r7, #4]
  36945. 800ff90: 4a08 ldr r2, [pc, #32] @ (800ffb4 <ethernetif_init+0x58>)
  36946. 800ff92: 619a str r2, [r3, #24]
  36947. /* initialize the hardware */
  36948. low_level_init(netif);
  36949. 800ff94: 6878 ldr r0, [r7, #4]
  36950. 800ff96: f7ff fdc9 bl 800fb2c <low_level_init>
  36951. return ERR_OK;
  36952. 800ff9a: 2300 movs r3, #0
  36953. }
  36954. 800ff9c: 4618 mov r0, r3
  36955. 800ff9e: 3708 adds r7, #8
  36956. 800ffa0: 46bd mov sp, r7
  36957. 800ffa2: bd80 pop {r7, pc}
  36958. 800ffa4: 0802ca00 .word 0x0802ca00
  36959. 800ffa8: 0802ca1c .word 0x0802ca1c
  36960. 800ffac: 0802ca2c .word 0x0802ca2c
  36961. 800ffb0: 0802403d .word 0x0802403d
  36962. 800ffb4: 0800fda1 .word 0x0800fda1
  36963. 0800ffb8 <pbuf_free_custom>:
  36964. * @brief Custom Rx pbuf free callback
  36965. * @param pbuf: pbuf to be freed
  36966. * @retval None
  36967. */
  36968. void pbuf_free_custom(struct pbuf *p)
  36969. {
  36970. 800ffb8: b580 push {r7, lr}
  36971. 800ffba: b084 sub sp, #16
  36972. 800ffbc: af00 add r7, sp, #0
  36973. 800ffbe: 6078 str r0, [r7, #4]
  36974. struct pbuf_custom* custom_pbuf = (struct pbuf_custom*)p;
  36975. 800ffc0: 687b ldr r3, [r7, #4]
  36976. 800ffc2: 60fb str r3, [r7, #12]
  36977. LWIP_MEMPOOL_FREE(RX_POOL, custom_pbuf);
  36978. 800ffc4: 68f9 ldr r1, [r7, #12]
  36979. 800ffc6: 4809 ldr r0, [pc, #36] @ (800ffec <pbuf_free_custom+0x34>)
  36980. 800ffc8: f009 fb76 bl 80196b8 <memp_free_pool>
  36981. /* If the Rx Buffer Pool was exhausted, signal the ethernetif_input task to
  36982. * call HAL_ETH_GetRxDataBuffer to rebuild the Rx descriptors. */
  36983. if (RxAllocStatus == RX_ALLOC_ERROR)
  36984. 800ffcc: 4b08 ldr r3, [pc, #32] @ (800fff0 <pbuf_free_custom+0x38>)
  36985. 800ffce: 781b ldrb r3, [r3, #0]
  36986. 800ffd0: 2b01 cmp r3, #1
  36987. 800ffd2: d107 bne.n 800ffe4 <pbuf_free_custom+0x2c>
  36988. {
  36989. RxAllocStatus = RX_ALLOC_OK;
  36990. 800ffd4: 4b06 ldr r3, [pc, #24] @ (800fff0 <pbuf_free_custom+0x38>)
  36991. 800ffd6: 2200 movs r2, #0
  36992. 800ffd8: 701a strb r2, [r3, #0]
  36993. osSemaphoreRelease(RxPktSemaphore);
  36994. 800ffda: 4b06 ldr r3, [pc, #24] @ (800fff4 <pbuf_free_custom+0x3c>)
  36995. 800ffdc: 681b ldr r3, [r3, #0]
  36996. 800ffde: 4618 mov r0, r3
  36997. 800ffe0: f000 fed4 bl 8010d8c <osSemaphoreRelease>
  36998. }
  36999. }
  37000. 800ffe4: bf00 nop
  37001. 800ffe6: 3710 adds r7, #16
  37002. 800ffe8: 46bd mov sp, r7
  37003. 800ffea: bd80 pop {r7, pc}
  37004. 800ffec: 08030a64 .word 0x08030a64
  37005. 800fff0: 240021e0 .word 0x240021e0
  37006. 800fff4: 240021e4 .word 0x240021e4
  37007. 0800fff8 <sys_now>:
  37008. * when LWIP_TIMERS == 1 and NO_SYS == 1
  37009. * @param None
  37010. * @retval Current Time value
  37011. */
  37012. u32_t sys_now(void)
  37013. {
  37014. 800fff8: b580 push {r7, lr}
  37015. 800fffa: af00 add r7, sp, #0
  37016. return HAL_GetTick();
  37017. 800fffc: f7f5 f818 bl 8005030 <HAL_GetTick>
  37018. 8010000: 4603 mov r3, r0
  37019. }
  37020. 8010002: 4618 mov r0, r3
  37021. 8010004: bd80 pop {r7, pc}
  37022. ...
  37023. 08010008 <HAL_ETH_MspInit>:
  37024. * @param ethHandle: ETH handle
  37025. * @retval None
  37026. */
  37027. void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
  37028. {
  37029. 8010008: b580 push {r7, lr}
  37030. 801000a: b08e sub sp, #56 @ 0x38
  37031. 801000c: af00 add r7, sp, #0
  37032. 801000e: 6078 str r0, [r7, #4]
  37033. GPIO_InitTypeDef GPIO_InitStruct = {0};
  37034. 8010010: f107 0324 add.w r3, r7, #36 @ 0x24
  37035. 8010014: 2200 movs r2, #0
  37036. 8010016: 601a str r2, [r3, #0]
  37037. 8010018: 605a str r2, [r3, #4]
  37038. 801001a: 609a str r2, [r3, #8]
  37039. 801001c: 60da str r2, [r3, #12]
  37040. 801001e: 611a str r2, [r3, #16]
  37041. if(ethHandle->Instance==ETH)
  37042. 8010020: 687b ldr r3, [r7, #4]
  37043. 8010022: 681b ldr r3, [r3, #0]
  37044. 8010024: 4a55 ldr r2, [pc, #340] @ (801017c <HAL_ETH_MspInit+0x174>)
  37045. 8010026: 4293 cmp r3, r2
  37046. 8010028: f040 80a4 bne.w 8010174 <HAL_ETH_MspInit+0x16c>
  37047. {
  37048. /* USER CODE BEGIN ETH_MspInit 0 */
  37049. /* USER CODE END ETH_MspInit 0 */
  37050. /* Enable Peripheral clock */
  37051. __HAL_RCC_ETH1MAC_CLK_ENABLE();
  37052. 801002c: 4b54 ldr r3, [pc, #336] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37053. 801002e: f8d3 30d8 ldr.w r3, [r3, #216] @ 0xd8
  37054. 8010032: 4a53 ldr r2, [pc, #332] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37055. 8010034: f443 4300 orr.w r3, r3, #32768 @ 0x8000
  37056. 8010038: f8c2 30d8 str.w r3, [r2, #216] @ 0xd8
  37057. 801003c: 4b50 ldr r3, [pc, #320] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37058. 801003e: f8d3 30d8 ldr.w r3, [r3, #216] @ 0xd8
  37059. 8010042: f403 4300 and.w r3, r3, #32768 @ 0x8000
  37060. 8010046: 623b str r3, [r7, #32]
  37061. 8010048: 6a3b ldr r3, [r7, #32]
  37062. __HAL_RCC_ETH1TX_CLK_ENABLE();
  37063. 801004a: 4b4d ldr r3, [pc, #308] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37064. 801004c: f8d3 30d8 ldr.w r3, [r3, #216] @ 0xd8
  37065. 8010050: 4a4b ldr r2, [pc, #300] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37066. 8010052: f443 3380 orr.w r3, r3, #65536 @ 0x10000
  37067. 8010056: f8c2 30d8 str.w r3, [r2, #216] @ 0xd8
  37068. 801005a: 4b49 ldr r3, [pc, #292] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37069. 801005c: f8d3 30d8 ldr.w r3, [r3, #216] @ 0xd8
  37070. 8010060: f403 3380 and.w r3, r3, #65536 @ 0x10000
  37071. 8010064: 61fb str r3, [r7, #28]
  37072. 8010066: 69fb ldr r3, [r7, #28]
  37073. __HAL_RCC_ETH1RX_CLK_ENABLE();
  37074. 8010068: 4b45 ldr r3, [pc, #276] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37075. 801006a: f8d3 30d8 ldr.w r3, [r3, #216] @ 0xd8
  37076. 801006e: 4a44 ldr r2, [pc, #272] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37077. 8010070: f443 3300 orr.w r3, r3, #131072 @ 0x20000
  37078. 8010074: f8c2 30d8 str.w r3, [r2, #216] @ 0xd8
  37079. 8010078: 4b41 ldr r3, [pc, #260] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37080. 801007a: f8d3 30d8 ldr.w r3, [r3, #216] @ 0xd8
  37081. 801007e: f403 3300 and.w r3, r3, #131072 @ 0x20000
  37082. 8010082: 61bb str r3, [r7, #24]
  37083. 8010084: 69bb ldr r3, [r7, #24]
  37084. __HAL_RCC_GPIOC_CLK_ENABLE();
  37085. 8010086: 4b3e ldr r3, [pc, #248] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37086. 8010088: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  37087. 801008c: 4a3c ldr r2, [pc, #240] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37088. 801008e: f043 0304 orr.w r3, r3, #4
  37089. 8010092: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  37090. 8010096: 4b3a ldr r3, [pc, #232] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37091. 8010098: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  37092. 801009c: f003 0304 and.w r3, r3, #4
  37093. 80100a0: 617b str r3, [r7, #20]
  37094. 80100a2: 697b ldr r3, [r7, #20]
  37095. __HAL_RCC_GPIOA_CLK_ENABLE();
  37096. 80100a4: 4b36 ldr r3, [pc, #216] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37097. 80100a6: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  37098. 80100aa: 4a35 ldr r2, [pc, #212] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37099. 80100ac: f043 0301 orr.w r3, r3, #1
  37100. 80100b0: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  37101. 80100b4: 4b32 ldr r3, [pc, #200] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37102. 80100b6: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  37103. 80100ba: f003 0301 and.w r3, r3, #1
  37104. 80100be: 613b str r3, [r7, #16]
  37105. 80100c0: 693b ldr r3, [r7, #16]
  37106. __HAL_RCC_GPIOB_CLK_ENABLE();
  37107. 80100c2: 4b2f ldr r3, [pc, #188] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37108. 80100c4: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  37109. 80100c8: 4a2d ldr r2, [pc, #180] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37110. 80100ca: f043 0302 orr.w r3, r3, #2
  37111. 80100ce: f8c2 30e0 str.w r3, [r2, #224] @ 0xe0
  37112. 80100d2: 4b2b ldr r3, [pc, #172] @ (8010180 <HAL_ETH_MspInit+0x178>)
  37113. 80100d4: f8d3 30e0 ldr.w r3, [r3, #224] @ 0xe0
  37114. 80100d8: f003 0302 and.w r3, r3, #2
  37115. 80100dc: 60fb str r3, [r7, #12]
  37116. 80100de: 68fb ldr r3, [r7, #12]
  37117. PB11 ------> ETH_TX_EN
  37118. PB12 ------> ETH_TXD0
  37119. PB13 ------> ETH_TXD1
  37120. PB8 ------> ETH_TXD3
  37121. */
  37122. GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4
  37123. 80100e0: 233e movs r3, #62 @ 0x3e
  37124. 80100e2: 627b str r3, [r7, #36] @ 0x24
  37125. |GPIO_PIN_5;
  37126. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  37127. 80100e4: 2302 movs r3, #2
  37128. 80100e6: 62bb str r3, [r7, #40] @ 0x28
  37129. GPIO_InitStruct.Pull = GPIO_NOPULL;
  37130. 80100e8: 2300 movs r3, #0
  37131. 80100ea: 62fb str r3, [r7, #44] @ 0x2c
  37132. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  37133. 80100ec: 2303 movs r3, #3
  37134. 80100ee: 633b str r3, [r7, #48] @ 0x30
  37135. GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  37136. 80100f0: 230b movs r3, #11
  37137. 80100f2: 637b str r3, [r7, #52] @ 0x34
  37138. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  37139. 80100f4: f107 0324 add.w r3, r7, #36 @ 0x24
  37140. 80100f8: 4619 mov r1, r3
  37141. 80100fa: 4822 ldr r0, [pc, #136] @ (8010184 <HAL_ETH_MspInit+0x17c>)
  37142. 80100fc: f7f9 fac8 bl 8009690 <HAL_GPIO_Init>
  37143. GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
  37144. 8010100: 238f movs r3, #143 @ 0x8f
  37145. 8010102: 627b str r3, [r7, #36] @ 0x24
  37146. |GPIO_PIN_7;
  37147. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  37148. 8010104: 2302 movs r3, #2
  37149. 8010106: 62bb str r3, [r7, #40] @ 0x28
  37150. GPIO_InitStruct.Pull = GPIO_NOPULL;
  37151. 8010108: 2300 movs r3, #0
  37152. 801010a: 62fb str r3, [r7, #44] @ 0x2c
  37153. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  37154. 801010c: 2303 movs r3, #3
  37155. 801010e: 633b str r3, [r7, #48] @ 0x30
  37156. GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  37157. 8010110: 230b movs r3, #11
  37158. 8010112: 637b str r3, [r7, #52] @ 0x34
  37159. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  37160. 8010114: f107 0324 add.w r3, r7, #36 @ 0x24
  37161. 8010118: 4619 mov r1, r3
  37162. 801011a: 481b ldr r0, [pc, #108] @ (8010188 <HAL_ETH_MspInit+0x180>)
  37163. 801011c: f7f9 fab8 bl 8009690 <HAL_GPIO_Init>
  37164. GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_11|GPIO_PIN_12
  37165. 8010120: f643 1303 movw r3, #14595 @ 0x3903
  37166. 8010124: 627b str r3, [r7, #36] @ 0x24
  37167. |GPIO_PIN_13|GPIO_PIN_8;
  37168. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  37169. 8010126: 2302 movs r3, #2
  37170. 8010128: 62bb str r3, [r7, #40] @ 0x28
  37171. GPIO_InitStruct.Pull = GPIO_NOPULL;
  37172. 801012a: 2300 movs r3, #0
  37173. 801012c: 62fb str r3, [r7, #44] @ 0x2c
  37174. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  37175. 801012e: 2303 movs r3, #3
  37176. 8010130: 633b str r3, [r7, #48] @ 0x30
  37177. GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  37178. 8010132: 230b movs r3, #11
  37179. 8010134: 637b str r3, [r7, #52] @ 0x34
  37180. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  37181. 8010136: f107 0324 add.w r3, r7, #36 @ 0x24
  37182. 801013a: 4619 mov r1, r3
  37183. 801013c: 4813 ldr r0, [pc, #76] @ (801018c <HAL_ETH_MspInit+0x184>)
  37184. 801013e: f7f9 faa7 bl 8009690 <HAL_GPIO_Init>
  37185. GPIO_InitStruct.Pin = GPIO_PIN_10;
  37186. 8010142: f44f 6380 mov.w r3, #1024 @ 0x400
  37187. 8010146: 627b str r3, [r7, #36] @ 0x24
  37188. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  37189. 8010148: 2302 movs r3, #2
  37190. 801014a: 62bb str r3, [r7, #40] @ 0x28
  37191. GPIO_InitStruct.Pull = GPIO_NOPULL;
  37192. 801014c: 2300 movs r3, #0
  37193. 801014e: 62fb str r3, [r7, #44] @ 0x2c
  37194. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  37195. 8010150: 2303 movs r3, #3
  37196. 8010152: 633b str r3, [r7, #48] @ 0x30
  37197. GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  37198. 8010154: 230b movs r3, #11
  37199. 8010156: 637b str r3, [r7, #52] @ 0x34
  37200. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  37201. 8010158: f107 0324 add.w r3, r7, #36 @ 0x24
  37202. 801015c: 4619 mov r1, r3
  37203. 801015e: 480b ldr r0, [pc, #44] @ (801018c <HAL_ETH_MspInit+0x184>)
  37204. 8010160: f7f9 fa96 bl 8009690 <HAL_GPIO_Init>
  37205. /* Peripheral interrupt init */
  37206. HAL_NVIC_SetPriority(ETH_IRQn, 5, 0);
  37207. 8010164: 2200 movs r2, #0
  37208. 8010166: 2105 movs r1, #5
  37209. 8010168: 203d movs r0, #61 @ 0x3d
  37210. 801016a: f7f5 f869 bl 8005240 <HAL_NVIC_SetPriority>
  37211. HAL_NVIC_EnableIRQ(ETH_IRQn);
  37212. 801016e: 203d movs r0, #61 @ 0x3d
  37213. 8010170: f7f5 f880 bl 8005274 <HAL_NVIC_EnableIRQ>
  37214. /* USER CODE BEGIN ETH_MspInit 1 */
  37215. /* USER CODE END ETH_MspInit 1 */
  37216. }
  37217. }
  37218. 8010174: bf00 nop
  37219. 8010176: 3738 adds r7, #56 @ 0x38
  37220. 8010178: 46bd mov sp, r7
  37221. 801017a: bd80 pop {r7, pc}
  37222. 801017c: 40028000 .word 0x40028000
  37223. 8010180: 58024400 .word 0x58024400
  37224. 8010184: 58020800 .word 0x58020800
  37225. 8010188: 58020000 .word 0x58020000
  37226. 801018c: 58020400 .word 0x58020400
  37227. 08010190 <ETH_PHY_IO_Init>:
  37228. * @brief Initializes the MDIO interface GPIO and clocks.
  37229. * @param None
  37230. * @retval 0 if OK, -1 if ERROR
  37231. */
  37232. int32_t ETH_PHY_IO_Init(void)
  37233. {
  37234. 8010190: b580 push {r7, lr}
  37235. 8010192: af00 add r7, sp, #0
  37236. /* We assume that MDIO GPIO configuration is already done
  37237. in the ETH_MspInit() else it should be done here
  37238. */
  37239. /* Configure the MDIO Clock */
  37240. HAL_ETH_SetMDIOClockRange(&heth);
  37241. 8010194: 4802 ldr r0, [pc, #8] @ (80101a0 <ETH_PHY_IO_Init+0x10>)
  37242. 8010196: f7f8 fc9b bl 8008ad0 <HAL_ETH_SetMDIOClockRange>
  37243. return 0;
  37244. 801019a: 2300 movs r3, #0
  37245. }
  37246. 801019c: 4618 mov r0, r3
  37247. 801019e: bd80 pop {r7, pc}
  37248. 80101a0: 240021ec .word 0x240021ec
  37249. 080101a4 <ETH_PHY_IO_DeInit>:
  37250. * @brief De-Initializes the MDIO interface .
  37251. * @param None
  37252. * @retval 0 if OK, -1 if ERROR
  37253. */
  37254. int32_t ETH_PHY_IO_DeInit (void)
  37255. {
  37256. 80101a4: b480 push {r7}
  37257. 80101a6: af00 add r7, sp, #0
  37258. return 0;
  37259. 80101a8: 2300 movs r3, #0
  37260. }
  37261. 80101aa: 4618 mov r0, r3
  37262. 80101ac: 46bd mov sp, r7
  37263. 80101ae: f85d 7b04 ldr.w r7, [sp], #4
  37264. 80101b2: 4770 bx lr
  37265. 080101b4 <ETH_PHY_IO_ReadReg>:
  37266. * @param RegAddr: PHY register address
  37267. * @param pRegVal: pointer to hold the register value
  37268. * @retval 0 if OK -1 if Error
  37269. */
  37270. int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t *pRegVal)
  37271. {
  37272. 80101b4: b580 push {r7, lr}
  37273. 80101b6: b084 sub sp, #16
  37274. 80101b8: af00 add r7, sp, #0
  37275. 80101ba: 60f8 str r0, [r7, #12]
  37276. 80101bc: 60b9 str r1, [r7, #8]
  37277. 80101be: 607a str r2, [r7, #4]
  37278. if(HAL_ETH_ReadPHYRegister(&heth, DevAddr, RegAddr, pRegVal) != HAL_OK)
  37279. 80101c0: 687b ldr r3, [r7, #4]
  37280. 80101c2: 68ba ldr r2, [r7, #8]
  37281. 80101c4: 68f9 ldr r1, [r7, #12]
  37282. 80101c6: 4807 ldr r0, [pc, #28] @ (80101e4 <ETH_PHY_IO_ReadReg+0x30>)
  37283. 80101c8: f7f8 f9ec bl 80085a4 <HAL_ETH_ReadPHYRegister>
  37284. 80101cc: 4603 mov r3, r0
  37285. 80101ce: 2b00 cmp r3, #0
  37286. 80101d0: d002 beq.n 80101d8 <ETH_PHY_IO_ReadReg+0x24>
  37287. {
  37288. return -1;
  37289. 80101d2: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  37290. 80101d6: e000 b.n 80101da <ETH_PHY_IO_ReadReg+0x26>
  37291. }
  37292. return 0;
  37293. 80101d8: 2300 movs r3, #0
  37294. }
  37295. 80101da: 4618 mov r0, r3
  37296. 80101dc: 3710 adds r7, #16
  37297. 80101de: 46bd mov sp, r7
  37298. 80101e0: bd80 pop {r7, pc}
  37299. 80101e2: bf00 nop
  37300. 80101e4: 240021ec .word 0x240021ec
  37301. 080101e8 <ETH_PHY_IO_WriteReg>:
  37302. * @param RegAddr: PHY register address
  37303. * @param RegVal: Value to be written
  37304. * @retval 0 if OK -1 if Error
  37305. */
  37306. int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t RegVal)
  37307. {
  37308. 80101e8: b580 push {r7, lr}
  37309. 80101ea: b084 sub sp, #16
  37310. 80101ec: af00 add r7, sp, #0
  37311. 80101ee: 60f8 str r0, [r7, #12]
  37312. 80101f0: 60b9 str r1, [r7, #8]
  37313. 80101f2: 607a str r2, [r7, #4]
  37314. if(HAL_ETH_WritePHYRegister(&heth, DevAddr, RegAddr, RegVal) != HAL_OK)
  37315. 80101f4: 687b ldr r3, [r7, #4]
  37316. 80101f6: 68ba ldr r2, [r7, #8]
  37317. 80101f8: 68f9 ldr r1, [r7, #12]
  37318. 80101fa: 4807 ldr r0, [pc, #28] @ (8010218 <ETH_PHY_IO_WriteReg+0x30>)
  37319. 80101fc: f7f8 fa26 bl 800864c <HAL_ETH_WritePHYRegister>
  37320. 8010200: 4603 mov r3, r0
  37321. 8010202: 2b00 cmp r3, #0
  37322. 8010204: d002 beq.n 801020c <ETH_PHY_IO_WriteReg+0x24>
  37323. {
  37324. return -1;
  37325. 8010206: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  37326. 801020a: e000 b.n 801020e <ETH_PHY_IO_WriteReg+0x26>
  37327. }
  37328. return 0;
  37329. 801020c: 2300 movs r3, #0
  37330. }
  37331. 801020e: 4618 mov r0, r3
  37332. 8010210: 3710 adds r7, #16
  37333. 8010212: 46bd mov sp, r7
  37334. 8010214: bd80 pop {r7, pc}
  37335. 8010216: bf00 nop
  37336. 8010218: 240021ec .word 0x240021ec
  37337. 0801021c <ETH_PHY_IO_GetTick>:
  37338. /**
  37339. * @brief Get the time in millisecons used for internal PHY driver process.
  37340. * @retval Time value
  37341. */
  37342. int32_t ETH_PHY_IO_GetTick(void)
  37343. {
  37344. 801021c: b580 push {r7, lr}
  37345. 801021e: af00 add r7, sp, #0
  37346. return HAL_GetTick();
  37347. 8010220: f7f4 ff06 bl 8005030 <HAL_GetTick>
  37348. 8010224: 4603 mov r3, r0
  37349. }
  37350. 8010226: 4618 mov r0, r3
  37351. 8010228: bd80 pop {r7, pc}
  37352. ...
  37353. 0801022c <ethernet_link_thread>:
  37354. /**
  37355. * @brief Check the ETH link state then update ETH driver and netif link accordingly.
  37356. * @retval None
  37357. */
  37358. void ethernet_link_thread(void* argument)
  37359. {
  37360. 801022c: b580 push {r7, lr}
  37361. 801022e: b0a2 sub sp, #136 @ 0x88
  37362. 8010230: af00 add r7, sp, #0
  37363. 8010232: 6078 str r0, [r7, #4]
  37364. ETH_MACConfigTypeDef MACConf = {0};
  37365. 8010234: f107 0310 add.w r3, r7, #16
  37366. 8010238: 2264 movs r2, #100 @ 0x64
  37367. 801023a: 2100 movs r1, #0
  37368. 801023c: 4618 mov r0, r3
  37369. 801023e: f019 fd57 bl 8029cf0 <memset>
  37370. int32_t PHYLinkState = 0;
  37371. 8010242: 2300 movs r3, #0
  37372. 8010244: 67bb str r3, [r7, #120] @ 0x78
  37373. uint32_t linkchanged = 0U, speed = 0U, duplex = 0U;
  37374. 8010246: 2300 movs r3, #0
  37375. 8010248: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  37376. 801024c: 2300 movs r3, #0
  37377. 801024e: f8c7 3080 str.w r3, [r7, #128] @ 0x80
  37378. 8010252: 2300 movs r3, #0
  37379. 8010254: 67fb str r3, [r7, #124] @ 0x7c
  37380. struct netif *netif = (struct netif *) argument;
  37381. 8010256: 687b ldr r3, [r7, #4]
  37382. 8010258: 677b str r3, [r7, #116] @ 0x74
  37383. /* USER CODE BEGIN ETH link init */
  37384. #if USE_DHCP
  37385. enum dhcp_states DHCP_state = DHCP_START;
  37386. 801025a: 2301 movs r3, #1
  37387. 801025c: 73fb strb r3, [r7, #15]
  37388. // LOCK_TCPIP_CORE();
  37389. /* USER CODE END ETH link init */
  37390. for(;;)
  37391. {
  37392. PHYLinkState = DP83848_GetLinkState(&DP83848);
  37393. 801025e: 484a ldr r0, [pc, #296] @ (8010388 <ethernet_link_thread+0x15c>)
  37394. 8010260: f7f4 fe0e bl 8004e80 <DP83848_GetLinkState>
  37395. 8010264: 67b8 str r0, [r7, #120] @ 0x78
  37396. if(netif_is_link_up(netif) && (PHYLinkState <= DP83848_STATUS_LINK_DOWN))
  37397. 8010266: 6f7b ldr r3, [r7, #116] @ 0x74
  37398. 8010268: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  37399. 801026c: 089b lsrs r3, r3, #2
  37400. 801026e: f003 0301 and.w r3, r3, #1
  37401. 8010272: b2db uxtb r3, r3
  37402. 8010274: 2b00 cmp r3, #0
  37403. 8010276: d013 beq.n 80102a0 <ethernet_link_thread+0x74>
  37404. 8010278: 6fbb ldr r3, [r7, #120] @ 0x78
  37405. 801027a: 2b01 cmp r3, #1
  37406. 801027c: dc10 bgt.n 80102a0 <ethernet_link_thread+0x74>
  37407. {
  37408. HAL_ETH_Stop_IT(&heth);
  37409. 801027e: 4843 ldr r0, [pc, #268] @ (801038c <ethernet_link_thread+0x160>)
  37410. 8010280: f7f7 fe1c bl 8007ebc <HAL_ETH_Stop_IT>
  37411. LOCK_TCPIP_CORE();
  37412. 8010284: f000 f936 bl 80104f4 <sys_lock_tcpip_core>
  37413. netif_set_down(netif);
  37414. 8010288: 6f78 ldr r0, [r7, #116] @ 0x74
  37415. 801028a: f009 fca7 bl 8019bdc <netif_set_down>
  37416. netif_set_link_down(netif);
  37417. 801028e: 6f78 ldr r0, [r7, #116] @ 0x74
  37418. 8010290: f009 fd12 bl 8019cb8 <netif_set_link_down>
  37419. UNLOCK_TCPIP_CORE();
  37420. 8010294: f000 f93e bl 8010514 <sys_unlock_tcpip_core>
  37421. printf("Link down...\r\n");
  37422. 8010298: 483d ldr r0, [pc, #244] @ (8010390 <ethernet_link_thread+0x164>)
  37423. 801029a: f019 fbff bl 8029a9c <puts>
  37424. 801029e: e067 b.n 8010370 <ethernet_link_thread+0x144>
  37425. }
  37426. else if(!netif_is_link_up(netif) && (PHYLinkState > DP83848_STATUS_LINK_DOWN))
  37427. 80102a0: 6f7b ldr r3, [r7, #116] @ 0x74
  37428. 80102a2: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  37429. 80102a6: f003 0304 and.w r3, r3, #4
  37430. 80102aa: 2b00 cmp r3, #0
  37431. 80102ac: d160 bne.n 8010370 <ethernet_link_thread+0x144>
  37432. 80102ae: 6fbb ldr r3, [r7, #120] @ 0x78
  37433. 80102b0: 2b01 cmp r3, #1
  37434. 80102b2: dd5d ble.n 8010370 <ethernet_link_thread+0x144>
  37435. {
  37436. switch (PHYLinkState)
  37437. 80102b4: 6fbb ldr r3, [r7, #120] @ 0x78
  37438. 80102b6: 3b02 subs r3, #2
  37439. 80102b8: 2b03 cmp r3, #3
  37440. 80102ba: d833 bhi.n 8010324 <ethernet_link_thread+0xf8>
  37441. 80102bc: a201 add r2, pc, #4 @ (adr r2, 80102c4 <ethernet_link_thread+0x98>)
  37442. 80102be: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  37443. 80102c2: bf00 nop
  37444. 80102c4: 080102d5 .word 0x080102d5
  37445. 80102c8: 080102eb .word 0x080102eb
  37446. 80102cc: 080102ff .word 0x080102ff
  37447. 80102d0: 08010313 .word 0x08010313
  37448. {
  37449. case DP83848_STATUS_100MBITS_FULLDUPLEX:
  37450. duplex = ETH_FULLDUPLEX_MODE;
  37451. 80102d4: f44f 5300 mov.w r3, #8192 @ 0x2000
  37452. 80102d8: 67fb str r3, [r7, #124] @ 0x7c
  37453. speed = ETH_SPEED_100M;
  37454. 80102da: f44f 4380 mov.w r3, #16384 @ 0x4000
  37455. 80102de: f8c7 3080 str.w r3, [r7, #128] @ 0x80
  37456. linkchanged = 1;
  37457. 80102e2: 2301 movs r3, #1
  37458. 80102e4: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  37459. break;
  37460. 80102e8: e01d b.n 8010326 <ethernet_link_thread+0xfa>
  37461. case DP83848_STATUS_100MBITS_HALFDUPLEX:
  37462. duplex = ETH_HALFDUPLEX_MODE;
  37463. 80102ea: 2300 movs r3, #0
  37464. 80102ec: 67fb str r3, [r7, #124] @ 0x7c
  37465. speed = ETH_SPEED_100M;
  37466. 80102ee: f44f 4380 mov.w r3, #16384 @ 0x4000
  37467. 80102f2: f8c7 3080 str.w r3, [r7, #128] @ 0x80
  37468. linkchanged = 1;
  37469. 80102f6: 2301 movs r3, #1
  37470. 80102f8: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  37471. break;
  37472. 80102fc: e013 b.n 8010326 <ethernet_link_thread+0xfa>
  37473. case DP83848_STATUS_10MBITS_FULLDUPLEX:
  37474. duplex = ETH_FULLDUPLEX_MODE;
  37475. 80102fe: f44f 5300 mov.w r3, #8192 @ 0x2000
  37476. 8010302: 67fb str r3, [r7, #124] @ 0x7c
  37477. speed = ETH_SPEED_10M;
  37478. 8010304: 2300 movs r3, #0
  37479. 8010306: f8c7 3080 str.w r3, [r7, #128] @ 0x80
  37480. linkchanged = 1;
  37481. 801030a: 2301 movs r3, #1
  37482. 801030c: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  37483. break;
  37484. 8010310: e009 b.n 8010326 <ethernet_link_thread+0xfa>
  37485. case DP83848_STATUS_10MBITS_HALFDUPLEX:
  37486. duplex = ETH_HALFDUPLEX_MODE;
  37487. 8010312: 2300 movs r3, #0
  37488. 8010314: 67fb str r3, [r7, #124] @ 0x7c
  37489. speed = ETH_SPEED_10M;
  37490. 8010316: 2300 movs r3, #0
  37491. 8010318: f8c7 3080 str.w r3, [r7, #128] @ 0x80
  37492. linkchanged = 1;
  37493. 801031c: 2301 movs r3, #1
  37494. 801031e: f8c7 3084 str.w r3, [r7, #132] @ 0x84
  37495. break;
  37496. 8010322: e000 b.n 8010326 <ethernet_link_thread+0xfa>
  37497. default:
  37498. break;
  37499. 8010324: bf00 nop
  37500. }
  37501. if(linkchanged)
  37502. 8010326: f8d7 3084 ldr.w r3, [r7, #132] @ 0x84
  37503. 801032a: 2b00 cmp r3, #0
  37504. 801032c: d020 beq.n 8010370 <ethernet_link_thread+0x144>
  37505. {
  37506. /* Get MAC Config MAC */
  37507. HAL_ETH_GetMACConfig(&heth, &MACConf);
  37508. 801032e: f107 0310 add.w r3, r7, #16
  37509. 8010332: 4619 mov r1, r3
  37510. 8010334: 4815 ldr r0, [pc, #84] @ (801038c <ethernet_link_thread+0x160>)
  37511. 8010336: f7f8 f9dd bl 80086f4 <HAL_ETH_GetMACConfig>
  37512. MACConf.DuplexMode = duplex;
  37513. 801033a: 6ffb ldr r3, [r7, #124] @ 0x7c
  37514. 801033c: 62bb str r3, [r7, #40] @ 0x28
  37515. MACConf.Speed = speed;
  37516. 801033e: f8d7 3080 ldr.w r3, [r7, #128] @ 0x80
  37517. 8010342: 627b str r3, [r7, #36] @ 0x24
  37518. HAL_ETH_SetMACConfig(&heth, &MACConf);
  37519. 8010344: f107 0310 add.w r3, r7, #16
  37520. 8010348: 4619 mov r1, r3
  37521. 801034a: 4810 ldr r0, [pc, #64] @ (801038c <ethernet_link_thread+0x160>)
  37522. 801034c: f7f8 fba6 bl 8008a9c <HAL_ETH_SetMACConfig>
  37523. HAL_ETH_Start_IT(&heth);
  37524. 8010350: 480e ldr r0, [pc, #56] @ (801038c <ethernet_link_thread+0x160>)
  37525. 8010352: f7f7 fd3f bl 8007dd4 <HAL_ETH_Start_IT>
  37526. LOCK_TCPIP_CORE();
  37527. 8010356: f000 f8cd bl 80104f4 <sys_lock_tcpip_core>
  37528. netif_set_up(netif);
  37529. 801035a: 6f78 ldr r0, [r7, #116] @ 0x74
  37530. 801035c: f009 fbd0 bl 8019b00 <netif_set_up>
  37531. netif_set_link_up(netif);
  37532. 8010360: 6f78 ldr r0, [r7, #116] @ 0x74
  37533. 8010362: f009 fc6f bl 8019c44 <netif_set_link_up>
  37534. UNLOCK_TCPIP_CORE();
  37535. 8010366: f000 f8d5 bl 8010514 <sys_unlock_tcpip_core>
  37536. printf("Link up...\r\n");
  37537. 801036a: 480a ldr r0, [pc, #40] @ (8010394 <ethernet_link_thread+0x168>)
  37538. 801036c: f019 fb96 bl 8029a9c <puts>
  37539. }
  37540. }
  37541. /* USER CODE BEGIN ETH link Thread core code for User BSP */
  37542. #if USE_DHCP
  37543. dhcp_sm(netif, &DHCP_state);
  37544. 8010370: f107 030f add.w r3, r7, #15
  37545. 8010374: 4619 mov r1, r3
  37546. 8010376: 6f78 ldr r0, [r7, #116] @ 0x74
  37547. 8010378: f000 f922 bl 80105c0 <dhcp_sm>
  37548. #endif
  37549. /* ETH_CODE: workaround to call LOCK_TCPIP_CORE when accessing netif link functions*/
  37550. // UNLOCK_TCPIP_CORE();
  37551. osDelay(pdMS_TO_TICKS(500));
  37552. 801037c: f44f 70fa mov.w r0, #500 @ 0x1f4
  37553. 8010380: f000 faff bl 8010982 <osDelay>
  37554. // LOCK_TCPIP_CORE();
  37555. continue; /* skip next osDelay */
  37556. 8010384: bf00 nop
  37557. PHYLinkState = DP83848_GetLinkState(&DP83848);
  37558. 8010386: e76a b.n 801025e <ethernet_link_thread+0x32>
  37559. 8010388: 240022d4 .word 0x240022d4
  37560. 801038c: 240021ec .word 0x240021ec
  37561. 8010390: 0802ca54 .word 0x0802ca54
  37562. 8010394: 0802ca64 .word 0x0802ca64
  37563. 08010398 <ethernetif_notify_conn_changed>:
  37564. * @brief This function notify user about link status changement.
  37565. * @param netif: the network interface
  37566. * @retval None
  37567. */
  37568. __weak void ethernetif_notify_conn_changed(struct netif *netif)
  37569. {
  37570. 8010398: b480 push {r7}
  37571. 801039a: b083 sub sp, #12
  37572. 801039c: af00 add r7, sp, #0
  37573. 801039e: 6078 str r0, [r7, #4]
  37574. /* NOTE : This is function could be implemented in user file
  37575. when the callback is needed,
  37576. */
  37577. }
  37578. 80103a0: bf00 nop
  37579. 80103a2: 370c adds r7, #12
  37580. 80103a4: 46bd mov sp, r7
  37581. 80103a6: f85d 7b04 ldr.w r7, [sp], #4
  37582. 80103aa: 4770 bx lr
  37583. 080103ac <HAL_ETH_RxAllocateCallback>:
  37584. void HAL_ETH_RxAllocateCallback(uint8_t **buff)
  37585. {
  37586. 80103ac: b580 push {r7, lr}
  37587. 80103ae: b086 sub sp, #24
  37588. 80103b0: af02 add r7, sp, #8
  37589. 80103b2: 6078 str r0, [r7, #4]
  37590. /* USER CODE BEGIN HAL ETH RxAllocateCallback */
  37591. struct pbuf_custom *p = LWIP_MEMPOOL_ALLOC(RX_POOL);
  37592. 80103b4: 4812 ldr r0, [pc, #72] @ (8010400 <HAL_ETH_RxAllocateCallback+0x54>)
  37593. 80103b6: f009 f90b bl 80195d0 <memp_malloc_pool>
  37594. 80103ba: 60f8 str r0, [r7, #12]
  37595. if (p)
  37596. 80103bc: 68fb ldr r3, [r7, #12]
  37597. 80103be: 2b00 cmp r3, #0
  37598. 80103c0: d014 beq.n 80103ec <HAL_ETH_RxAllocateCallback+0x40>
  37599. {
  37600. /* Get the buff from the struct pbuf address. */
  37601. *buff = (uint8_t *)p + offsetof(RxBuff_t, buff);
  37602. 80103c2: 68fb ldr r3, [r7, #12]
  37603. 80103c4: f103 0220 add.w r2, r3, #32
  37604. 80103c8: 687b ldr r3, [r7, #4]
  37605. 80103ca: 601a str r2, [r3, #0]
  37606. p->custom_free_function = pbuf_free_custom;
  37607. 80103cc: 68fb ldr r3, [r7, #12]
  37608. 80103ce: 4a0d ldr r2, [pc, #52] @ (8010404 <HAL_ETH_RxAllocateCallback+0x58>)
  37609. 80103d0: 611a str r2, [r3, #16]
  37610. /* Initialize the struct pbuf.
  37611. * This must be performed whenever a buffer's allocated because it may be
  37612. * changed by lwIP or the app, e.g., pbuf_free decrements ref. */
  37613. pbuf_alloced_custom(PBUF_RAW, 0, PBUF_REF, p, *buff, ETH_RX_BUFFER_SIZE);
  37614. 80103d2: 687b ldr r3, [r7, #4]
  37615. 80103d4: 681b ldr r3, [r3, #0]
  37616. 80103d6: f44f 62c0 mov.w r2, #1536 @ 0x600
  37617. 80103da: 9201 str r2, [sp, #4]
  37618. 80103dc: 9300 str r3, [sp, #0]
  37619. 80103de: 68fb ldr r3, [r7, #12]
  37620. 80103e0: 2241 movs r2, #65 @ 0x41
  37621. 80103e2: 2100 movs r1, #0
  37622. 80103e4: 2000 movs r0, #0
  37623. 80103e6: f009 fe8f bl 801a108 <pbuf_alloced_custom>
  37624. {
  37625. RxAllocStatus = RX_ALLOC_ERROR;
  37626. *buff = NULL;
  37627. }
  37628. /* USER CODE END HAL ETH RxAllocateCallback */
  37629. }
  37630. 80103ea: e005 b.n 80103f8 <HAL_ETH_RxAllocateCallback+0x4c>
  37631. RxAllocStatus = RX_ALLOC_ERROR;
  37632. 80103ec: 4b06 ldr r3, [pc, #24] @ (8010408 <HAL_ETH_RxAllocateCallback+0x5c>)
  37633. 80103ee: 2201 movs r2, #1
  37634. 80103f0: 701a strb r2, [r3, #0]
  37635. *buff = NULL;
  37636. 80103f2: 687b ldr r3, [r7, #4]
  37637. 80103f4: 2200 movs r2, #0
  37638. 80103f6: 601a str r2, [r3, #0]
  37639. }
  37640. 80103f8: bf00 nop
  37641. 80103fa: 3710 adds r7, #16
  37642. 80103fc: 46bd mov sp, r7
  37643. 80103fe: bd80 pop {r7, pc}
  37644. 8010400: 08030a64 .word 0x08030a64
  37645. 8010404: 0800ffb9 .word 0x0800ffb9
  37646. 8010408: 240021e0 .word 0x240021e0
  37647. 0801040c <HAL_ETH_RxLinkCallback>:
  37648. void HAL_ETH_RxLinkCallback(void **pStart, void **pEnd, uint8_t *buff, uint16_t Length)
  37649. {
  37650. 801040c: b480 push {r7}
  37651. 801040e: b08d sub sp, #52 @ 0x34
  37652. 8010410: af00 add r7, sp, #0
  37653. 8010412: 60f8 str r0, [r7, #12]
  37654. 8010414: 60b9 str r1, [r7, #8]
  37655. 8010416: 607a str r2, [r7, #4]
  37656. 8010418: 807b strh r3, [r7, #2]
  37657. /* USER CODE BEGIN HAL ETH RxLinkCallback */
  37658. struct pbuf **ppStart = (struct pbuf **)pStart;
  37659. 801041a: 68fb ldr r3, [r7, #12]
  37660. 801041c: 62bb str r3, [r7, #40] @ 0x28
  37661. struct pbuf **ppEnd = (struct pbuf **)pEnd;
  37662. 801041e: 68bb ldr r3, [r7, #8]
  37663. 8010420: 627b str r3, [r7, #36] @ 0x24
  37664. struct pbuf *p = NULL;
  37665. 8010422: 2300 movs r3, #0
  37666. 8010424: 62fb str r3, [r7, #44] @ 0x2c
  37667. /* Get the struct pbuf from the buff address. */
  37668. p = (struct pbuf *)(buff - offsetof(RxBuff_t, buff));
  37669. 8010426: 687b ldr r3, [r7, #4]
  37670. 8010428: 3b20 subs r3, #32
  37671. 801042a: 62fb str r3, [r7, #44] @ 0x2c
  37672. p->next = NULL;
  37673. 801042c: 6afb ldr r3, [r7, #44] @ 0x2c
  37674. 801042e: 2200 movs r2, #0
  37675. 8010430: 601a str r2, [r3, #0]
  37676. p->tot_len = 0;
  37677. 8010432: 6afb ldr r3, [r7, #44] @ 0x2c
  37678. 8010434: 2200 movs r2, #0
  37679. 8010436: 811a strh r2, [r3, #8]
  37680. p->len = Length;
  37681. 8010438: 6afb ldr r3, [r7, #44] @ 0x2c
  37682. 801043a: 887a ldrh r2, [r7, #2]
  37683. 801043c: 815a strh r2, [r3, #10]
  37684. /* Chain the buffer. */
  37685. if (!*ppStart)
  37686. 801043e: 6abb ldr r3, [r7, #40] @ 0x28
  37687. 8010440: 681b ldr r3, [r3, #0]
  37688. 8010442: 2b00 cmp r3, #0
  37689. 8010444: d103 bne.n 801044e <HAL_ETH_RxLinkCallback+0x42>
  37690. {
  37691. /* The first buffer of the packet. */
  37692. *ppStart = p;
  37693. 8010446: 6abb ldr r3, [r7, #40] @ 0x28
  37694. 8010448: 6afa ldr r2, [r7, #44] @ 0x2c
  37695. 801044a: 601a str r2, [r3, #0]
  37696. 801044c: e003 b.n 8010456 <HAL_ETH_RxLinkCallback+0x4a>
  37697. }
  37698. else
  37699. {
  37700. /* Chain the buffer to the end of the packet. */
  37701. (*ppEnd)->next = p;
  37702. 801044e: 6a7b ldr r3, [r7, #36] @ 0x24
  37703. 8010450: 681b ldr r3, [r3, #0]
  37704. 8010452: 6afa ldr r2, [r7, #44] @ 0x2c
  37705. 8010454: 601a str r2, [r3, #0]
  37706. }
  37707. *ppEnd = p;
  37708. 8010456: 6a7b ldr r3, [r7, #36] @ 0x24
  37709. 8010458: 6afa ldr r2, [r7, #44] @ 0x2c
  37710. 801045a: 601a str r2, [r3, #0]
  37711. /* Update the total length of all the buffers of the chain. Each pbuf in the chain should have its tot_len
  37712. * set to its own length, plus the length of all the following pbufs in the chain. */
  37713. for (p = *ppStart; p != NULL; p = p->next)
  37714. 801045c: 6abb ldr r3, [r7, #40] @ 0x28
  37715. 801045e: 681b ldr r3, [r3, #0]
  37716. 8010460: 62fb str r3, [r7, #44] @ 0x2c
  37717. 8010462: e009 b.n 8010478 <HAL_ETH_RxLinkCallback+0x6c>
  37718. {
  37719. p->tot_len += Length;
  37720. 8010464: 6afb ldr r3, [r7, #44] @ 0x2c
  37721. 8010466: 891a ldrh r2, [r3, #8]
  37722. 8010468: 887b ldrh r3, [r7, #2]
  37723. 801046a: 4413 add r3, r2
  37724. 801046c: b29a uxth r2, r3
  37725. 801046e: 6afb ldr r3, [r7, #44] @ 0x2c
  37726. 8010470: 811a strh r2, [r3, #8]
  37727. for (p = *ppStart; p != NULL; p = p->next)
  37728. 8010472: 6afb ldr r3, [r7, #44] @ 0x2c
  37729. 8010474: 681b ldr r3, [r3, #0]
  37730. 8010476: 62fb str r3, [r7, #44] @ 0x2c
  37731. 8010478: 6afb ldr r3, [r7, #44] @ 0x2c
  37732. 801047a: 2b00 cmp r3, #0
  37733. 801047c: d1f2 bne.n 8010464 <HAL_ETH_RxLinkCallback+0x58>
  37734. }
  37735. /* Invalidate data cache because Rx DMA's writing to physical memory makes it stale. */
  37736. SCB_InvalidateDCache_by_Addr((uint32_t *)buff, Length);
  37737. 801047e: 887b ldrh r3, [r7, #2]
  37738. 8010480: 687a ldr r2, [r7, #4]
  37739. 8010482: 623a str r2, [r7, #32]
  37740. 8010484: 61fb str r3, [r7, #28]
  37741. if ( dsize > 0 ) {
  37742. 8010486: 69fb ldr r3, [r7, #28]
  37743. 8010488: 2b00 cmp r3, #0
  37744. 801048a: dd1d ble.n 80104c8 <HAL_ETH_RxLinkCallback+0xbc>
  37745. int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U));
  37746. 801048c: 6a3b ldr r3, [r7, #32]
  37747. 801048e: f003 021f and.w r2, r3, #31
  37748. 8010492: 69fb ldr r3, [r7, #28]
  37749. 8010494: 4413 add r3, r2
  37750. 8010496: 61bb str r3, [r7, #24]
  37751. uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */;
  37752. 8010498: 6a3b ldr r3, [r7, #32]
  37753. 801049a: 617b str r3, [r7, #20]
  37754. __ASM volatile ("dsb 0xF":::"memory");
  37755. 801049c: f3bf 8f4f dsb sy
  37756. }
  37757. 80104a0: bf00 nop
  37758. SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */
  37759. 80104a2: 4a0d ldr r2, [pc, #52] @ (80104d8 <HAL_ETH_RxLinkCallback+0xcc>)
  37760. 80104a4: 697b ldr r3, [r7, #20]
  37761. 80104a6: f8c2 325c str.w r3, [r2, #604] @ 0x25c
  37762. op_addr += __SCB_DCACHE_LINE_SIZE;
  37763. 80104aa: 697b ldr r3, [r7, #20]
  37764. 80104ac: 3320 adds r3, #32
  37765. 80104ae: 617b str r3, [r7, #20]
  37766. op_size -= __SCB_DCACHE_LINE_SIZE;
  37767. 80104b0: 69bb ldr r3, [r7, #24]
  37768. 80104b2: 3b20 subs r3, #32
  37769. 80104b4: 61bb str r3, [r7, #24]
  37770. } while ( op_size > 0 );
  37771. 80104b6: 69bb ldr r3, [r7, #24]
  37772. 80104b8: 2b00 cmp r3, #0
  37773. 80104ba: dcf2 bgt.n 80104a2 <HAL_ETH_RxLinkCallback+0x96>
  37774. __ASM volatile ("dsb 0xF":::"memory");
  37775. 80104bc: f3bf 8f4f dsb sy
  37776. }
  37777. 80104c0: bf00 nop
  37778. __ASM volatile ("isb 0xF":::"memory");
  37779. 80104c2: f3bf 8f6f isb sy
  37780. }
  37781. 80104c6: bf00 nop
  37782. }
  37783. 80104c8: bf00 nop
  37784. /* USER CODE END HAL ETH RxLinkCallback */
  37785. }
  37786. 80104ca: bf00 nop
  37787. 80104cc: 3734 adds r7, #52 @ 0x34
  37788. 80104ce: 46bd mov sp, r7
  37789. 80104d0: f85d 7b04 ldr.w r7, [sp], #4
  37790. 80104d4: 4770 bx lr
  37791. 80104d6: bf00 nop
  37792. 80104d8: e000ed00 .word 0xe000ed00
  37793. 080104dc <HAL_ETH_TxFreeCallback>:
  37794. void HAL_ETH_TxFreeCallback(uint32_t * buff)
  37795. {
  37796. 80104dc: b580 push {r7, lr}
  37797. 80104de: b082 sub sp, #8
  37798. 80104e0: af00 add r7, sp, #0
  37799. 80104e2: 6078 str r0, [r7, #4]
  37800. /* USER CODE BEGIN HAL ETH TxFreeCallback */
  37801. pbuf_free((struct pbuf *)buff);
  37802. 80104e4: 6878 ldr r0, [r7, #4]
  37803. 80104e6: f009 fff9 bl 801a4dc <pbuf_free>
  37804. /* USER CODE END HAL ETH TxFreeCallback */
  37805. }
  37806. 80104ea: bf00 nop
  37807. 80104ec: 3708 adds r7, #8
  37808. 80104ee: 46bd mov sp, r7
  37809. 80104f0: bd80 pop {r7, pc}
  37810. ...
  37811. 080104f4 <sys_lock_tcpip_core>:
  37812. /* ETH_CODE: add functions needed for proper multithreading support and check */
  37813. static osThreadId_t lwip_core_lock_holder_thread_id;
  37814. static osThreadId_t lwip_tcpip_thread_id;
  37815. void sys_lock_tcpip_core(void){
  37816. 80104f4: b580 push {r7, lr}
  37817. 80104f6: af00 add r7, sp, #0
  37818. sys_mutex_lock(&lock_tcpip_core);
  37819. 80104f8: 4804 ldr r0, [pc, #16] @ (801050c <sys_lock_tcpip_core+0x18>)
  37820. 80104fa: f015 ff95 bl 8026428 <sys_mutex_lock>
  37821. lwip_core_lock_holder_thread_id = osThreadGetId();
  37822. 80104fe: f000 fa35 bl 801096c <osThreadGetId>
  37823. 8010502: 4603 mov r3, r0
  37824. 8010504: 4a02 ldr r2, [pc, #8] @ (8010510 <sys_lock_tcpip_core+0x1c>)
  37825. 8010506: 6013 str r3, [r2, #0]
  37826. }
  37827. 8010508: bf00 nop
  37828. 801050a: bd80 pop {r7, pc}
  37829. 801050c: 24024334 .word 0x24024334
  37830. 8010510: 240022f4 .word 0x240022f4
  37831. 08010514 <sys_unlock_tcpip_core>:
  37832. void sys_unlock_tcpip_core(void){
  37833. 8010514: b580 push {r7, lr}
  37834. 8010516: af00 add r7, sp, #0
  37835. lwip_core_lock_holder_thread_id = 0;
  37836. 8010518: 4b03 ldr r3, [pc, #12] @ (8010528 <sys_unlock_tcpip_core+0x14>)
  37837. 801051a: 2200 movs r2, #0
  37838. 801051c: 601a str r2, [r3, #0]
  37839. sys_mutex_unlock(&lock_tcpip_core);
  37840. 801051e: 4803 ldr r0, [pc, #12] @ (801052c <sys_unlock_tcpip_core+0x18>)
  37841. 8010520: f015 ff91 bl 8026446 <sys_mutex_unlock>
  37842. }
  37843. 8010524: bf00 nop
  37844. 8010526: bd80 pop {r7, pc}
  37845. 8010528: 240022f4 .word 0x240022f4
  37846. 801052c: 24024334 .word 0x24024334
  37847. 08010530 <sys_check_core_locking>:
  37848. void sys_check_core_locking(void){
  37849. 8010530: b580 push {r7, lr}
  37850. 8010532: b082 sub sp, #8
  37851. 8010534: af00 add r7, sp, #0
  37852. /* Embedded systems should check we are NOT in an interrupt context here */
  37853. LWIP_ASSERT("Function called from interrupt context", (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) == 0);
  37854. 8010536: 4b15 ldr r3, [pc, #84] @ (801058c <sys_check_core_locking+0x5c>)
  37855. 8010538: 685b ldr r3, [r3, #4]
  37856. 801053a: f3c3 0308 ubfx r3, r3, #0, #9
  37857. 801053e: 2b00 cmp r3, #0
  37858. 8010540: d006 beq.n 8010550 <sys_check_core_locking+0x20>
  37859. 8010542: 4b13 ldr r3, [pc, #76] @ (8010590 <sys_check_core_locking+0x60>)
  37860. 8010544: f240 4216 movw r2, #1046 @ 0x416
  37861. 8010548: 4912 ldr r1, [pc, #72] @ (8010594 <sys_check_core_locking+0x64>)
  37862. 801054a: 4813 ldr r0, [pc, #76] @ (8010598 <sys_check_core_locking+0x68>)
  37863. 801054c: f019 fa3e bl 80299cc <iprintf>
  37864. if (lwip_tcpip_thread_id != 0) {
  37865. 8010550: 4b12 ldr r3, [pc, #72] @ (801059c <sys_check_core_locking+0x6c>)
  37866. 8010552: 681b ldr r3, [r3, #0]
  37867. 8010554: 2b00 cmp r3, #0
  37868. 8010556: d014 beq.n 8010582 <sys_check_core_locking+0x52>
  37869. osThreadId_t current_thread_id = osThreadGetId();
  37870. 8010558: f000 fa08 bl 801096c <osThreadGetId>
  37871. 801055c: 6078 str r0, [r7, #4]
  37872. #if LWIP_TCPIP_CORE_LOCKING
  37873. LWIP_ASSERT("Function called without core lock", current_thread_id == lwip_core_lock_holder_thread_id);
  37874. 801055e: 4b10 ldr r3, [pc, #64] @ (80105a0 <sys_check_core_locking+0x70>)
  37875. 8010560: 681b ldr r3, [r3, #0]
  37876. 8010562: 687a ldr r2, [r7, #4]
  37877. 8010564: 429a cmp r2, r3
  37878. 8010566: d006 beq.n 8010576 <sys_check_core_locking+0x46>
  37879. 8010568: 4b09 ldr r3, [pc, #36] @ (8010590 <sys_check_core_locking+0x60>)
  37880. 801056a: f240 421c movw r2, #1052 @ 0x41c
  37881. 801056e: 490d ldr r1, [pc, #52] @ (80105a4 <sys_check_core_locking+0x74>)
  37882. 8010570: 4809 ldr r0, [pc, #36] @ (8010598 <sys_check_core_locking+0x68>)
  37883. 8010572: f019 fa2b bl 80299cc <iprintf>
  37884. /* ETH_CODE: to easily check that example has correct handling of core lock
  37885. * This will trigger breakpoint (__BKPT)
  37886. */
  37887. #warning Below check should be removed in production code
  37888. if(current_thread_id != lwip_core_lock_holder_thread_id) __BKPT(0);
  37889. 8010576: 4b0a ldr r3, [pc, #40] @ (80105a0 <sys_check_core_locking+0x70>)
  37890. 8010578: 681b ldr r3, [r3, #0]
  37891. 801057a: 687a ldr r2, [r7, #4]
  37892. 801057c: 429a cmp r2, r3
  37893. 801057e: d000 beq.n 8010582 <sys_check_core_locking+0x52>
  37894. 8010580: be00 bkpt 0x0000
  37895. #else /* LWIP_TCPIP_CORE_LOCKING */
  37896. LWIP_ASSERT("Function called from wrong thread", current_thread_id == lwip_tcpip_thread_id);
  37897. #endif /* LWIP_TCPIP_CORE_LOCKING */
  37898. LWIP_UNUSED_ARG(current_thread_id); /* for LWIP_NOASSERT */
  37899. }
  37900. }
  37901. 8010582: bf00 nop
  37902. 8010584: 3708 adds r7, #8
  37903. 8010586: 46bd mov sp, r7
  37904. 8010588: bd80 pop {r7, pc}
  37905. 801058a: bf00 nop
  37906. 801058c: e000ed00 .word 0xe000ed00
  37907. 8010590: 0802ca00 .word 0x0802ca00
  37908. 8010594: 0802ca70 .word 0x0802ca70
  37909. 8010598: 0802ca2c .word 0x0802ca2c
  37910. 801059c: 240022f8 .word 0x240022f8
  37911. 80105a0: 240022f4 .word 0x240022f4
  37912. 80105a4: 0802ca98 .word 0x0802ca98
  37913. 080105a8 <sys_mark_tcpip_thread>:
  37914. void sys_mark_tcpip_thread(void){
  37915. 80105a8: b580 push {r7, lr}
  37916. 80105aa: af00 add r7, sp, #0
  37917. lwip_tcpip_thread_id = osThreadGetId();
  37918. 80105ac: f000 f9de bl 801096c <osThreadGetId>
  37919. 80105b0: 4603 mov r3, r0
  37920. 80105b2: 4a02 ldr r2, [pc, #8] @ (80105bc <sys_mark_tcpip_thread+0x14>)
  37921. 80105b4: 6013 str r3, [r2, #0]
  37922. }
  37923. 80105b6: bf00 nop
  37924. 80105b8: bd80 pop {r7, pc}
  37925. 80105ba: bf00 nop
  37926. 80105bc: 240022f8 .word 0x240022f8
  37927. 080105c0 <dhcp_sm>:
  37928. #if USE_DHCP
  37929. void dhcp_sm(struct netif *netif, enum dhcp_states *state)
  37930. {
  37931. 80105c0: b580 push {r7, lr}
  37932. 80105c2: b08c sub sp, #48 @ 0x30
  37933. 80105c4: af00 add r7, sp, #0
  37934. 80105c6: 6078 str r0, [r7, #4]
  37935. 80105c8: 6039 str r1, [r7, #0]
  37936. ip_addr_t gw;
  37937. #ifdef DHCP_USER_LOGS
  37938. uint8_t iptxt[20];
  37939. #endif
  37940. switch(*state)
  37941. 80105ca: 683b ldr r3, [r7, #0]
  37942. 80105cc: 781b ldrb r3, [r3, #0]
  37943. 80105ce: 2b03 cmp r3, #3
  37944. 80105d0: d072 beq.n 80106b8 <dhcp_sm+0xf8>
  37945. 80105d2: 2b03 cmp r3, #3
  37946. 80105d4: dc7b bgt.n 80106ce <dhcp_sm+0x10e>
  37947. 80105d6: 2b01 cmp r3, #1
  37948. 80105d8: d002 beq.n 80105e0 <dhcp_sm+0x20>
  37949. 80105da: 2b02 cmp r3, #2
  37950. 80105dc: d00a beq.n 80105f4 <dhcp_sm+0x34>
  37951. {
  37952. *state = DHCP_START;
  37953. }
  37954. break;
  37955. default:
  37956. break;
  37957. 80105de: e076 b.n 80106ce <dhcp_sm+0x10e>
  37958. *state = DHCP_WAIT_ADDRESS;
  37959. 80105e0: 683b ldr r3, [r7, #0]
  37960. 80105e2: 2202 movs r2, #2
  37961. 80105e4: 701a strb r2, [r3, #0]
  37962. dhcp = (struct dhcp *)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP);
  37963. 80105e6: 687b ldr r3, [r7, #4]
  37964. 80105e8: 6a5b ldr r3, [r3, #36] @ 0x24
  37965. 80105ea: 62fb str r3, [r7, #44] @ 0x2c
  37966. printf(" State: Looking for DHCP server ...\n");
  37967. 80105ec: 483c ldr r0, [pc, #240] @ (80106e0 <dhcp_sm+0x120>)
  37968. 80105ee: f019 fa55 bl 8029a9c <puts>
  37969. break;
  37970. 80105f2: e071 b.n 80106d8 <dhcp_sm+0x118>
  37971. if (dhcp_supplied_address(netif))
  37972. 80105f4: 6878 ldr r0, [r7, #4]
  37973. 80105f6: f013 f87b bl 80236f0 <dhcp_supplied_address>
  37974. 80105fa: 4603 mov r3, r0
  37975. 80105fc: 2b00 cmp r3, #0
  37976. 80105fe: d015 beq.n 801062c <dhcp_sm+0x6c>
  37977. *state = DHCP_ADDRESS_ASSIGNED;
  37978. 8010600: 683b ldr r3, [r7, #0]
  37979. 8010602: 2203 movs r2, #3
  37980. 8010604: 701a strb r2, [r3, #0]
  37981. sprintf((char *)iptxt, "%s", ip4addr_ntoa((const ip4_addr_t *)&netif->ip_addr));
  37982. 8010606: 687b ldr r3, [r7, #4]
  37983. 8010608: 3304 adds r3, #4
  37984. 801060a: 4618 mov r0, r3
  37985. 801060c: f014 fe08 bl 8025220 <ip4addr_ntoa>
  37986. 8010610: 4602 mov r2, r0
  37987. 8010612: f107 030c add.w r3, r7, #12
  37988. 8010616: 4933 ldr r1, [pc, #204] @ (80106e4 <dhcp_sm+0x124>)
  37989. 8010618: 4618 mov r0, r3
  37990. 801061a: f019 fa47 bl 8029aac <siprintf>
  37991. printf("IP address assigned by a DHCP server: %s\n", iptxt);
  37992. 801061e: f107 030c add.w r3, r7, #12
  37993. 8010622: 4619 mov r1, r3
  37994. 8010624: 4830 ldr r0, [pc, #192] @ (80106e8 <dhcp_sm+0x128>)
  37995. 8010626: f019 f9d1 bl 80299cc <iprintf>
  37996. break;
  37997. 801062a: e052 b.n 80106d2 <dhcp_sm+0x112>
  37998. dhcp = (struct dhcp *)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP);
  37999. 801062c: 687b ldr r3, [r7, #4]
  38000. 801062e: 6a5b ldr r3, [r3, #36] @ 0x24
  38001. 8010630: 62fb str r3, [r7, #44] @ 0x2c
  38002. if (dhcp->tries > MAX_DHCP_TRIES)
  38003. 8010632: 6afb ldr r3, [r7, #44] @ 0x2c
  38004. 8010634: 799b ldrb r3, [r3, #6]
  38005. 8010636: 2b04 cmp r3, #4
  38006. 8010638: d94b bls.n 80106d2 <dhcp_sm+0x112>
  38007. *state = DHCP_TIMEOUT;
  38008. 801063a: 683b ldr r3, [r7, #0]
  38009. 801063c: 2204 movs r2, #4
  38010. 801063e: 701a strb r2, [r3, #0]
  38011. LOCK_TCPIP_CORE();
  38012. 8010640: f7ff ff58 bl 80104f4 <sys_lock_tcpip_core>
  38013. dhcp_stop(netif);
  38014. 8010644: 6878 ldr r0, [r7, #4]
  38015. 8010646: f012 faab bl 8022ba0 <dhcp_stop>
  38016. UNLOCK_TCPIP_CORE();
  38017. 801064a: f7ff ff63 bl 8010514 <sys_unlock_tcpip_core>
  38018. ipaddr_aton(STATIC_IP, &ipaddr);
  38019. 801064e: f107 0328 add.w r3, r7, #40 @ 0x28
  38020. 8010652: 4619 mov r1, r3
  38021. 8010654: 4825 ldr r0, [pc, #148] @ (80106ec <dhcp_sm+0x12c>)
  38022. 8010656: f014 fcb9 bl 8024fcc <ip4addr_aton>
  38023. ipaddr_aton(STATIC_MASK, &netmask);
  38024. 801065a: f107 0324 add.w r3, r7, #36 @ 0x24
  38025. 801065e: 4619 mov r1, r3
  38026. 8010660: 4823 ldr r0, [pc, #140] @ (80106f0 <dhcp_sm+0x130>)
  38027. 8010662: f014 fcb3 bl 8024fcc <ip4addr_aton>
  38028. ipaddr_aton(STATIC_GW, &gw);
  38029. 8010666: f107 0320 add.w r3, r7, #32
  38030. 801066a: 4619 mov r1, r3
  38031. 801066c: 4821 ldr r0, [pc, #132] @ (80106f4 <dhcp_sm+0x134>)
  38032. 801066e: f014 fcad bl 8024fcc <ip4addr_aton>
  38033. LOCK_TCPIP_CORE();
  38034. 8010672: f7ff ff3f bl 80104f4 <sys_lock_tcpip_core>
  38035. netif_set_addr(netif, ip_2_ip4(&ipaddr), ip_2_ip4(&netmask), ip_2_ip4(&gw));
  38036. 8010676: f107 0320 add.w r3, r7, #32
  38037. 801067a: f107 0224 add.w r2, r7, #36 @ 0x24
  38038. 801067e: f107 0128 add.w r1, r7, #40 @ 0x28
  38039. 8010682: 6878 ldr r0, [r7, #4]
  38040. 8010684: f009 f9e0 bl 8019a48 <netif_set_addr>
  38041. UNLOCK_TCPIP_CORE();
  38042. 8010688: f7ff ff44 bl 8010514 <sys_unlock_tcpip_core>
  38043. sprintf((char *)iptxt, "%s", ip4addr_ntoa((const ip4_addr_t *)&netif->ip_addr));
  38044. 801068c: 687b ldr r3, [r7, #4]
  38045. 801068e: 3304 adds r3, #4
  38046. 8010690: 4618 mov r0, r3
  38047. 8010692: f014 fdc5 bl 8025220 <ip4addr_ntoa>
  38048. 8010696: 4602 mov r2, r0
  38049. 8010698: f107 030c add.w r3, r7, #12
  38050. 801069c: 4911 ldr r1, [pc, #68] @ (80106e4 <dhcp_sm+0x124>)
  38051. 801069e: 4618 mov r0, r3
  38052. 80106a0: f019 fa04 bl 8029aac <siprintf>
  38053. printf("DHCP Timeout !! \n");
  38054. 80106a4: 4814 ldr r0, [pc, #80] @ (80106f8 <dhcp_sm+0x138>)
  38055. 80106a6: f019 f9f9 bl 8029a9c <puts>
  38056. printf("Static IP address: %s\n", iptxt);
  38057. 80106aa: f107 030c add.w r3, r7, #12
  38058. 80106ae: 4619 mov r1, r3
  38059. 80106b0: 4812 ldr r0, [pc, #72] @ (80106fc <dhcp_sm+0x13c>)
  38060. 80106b2: f019 f98b bl 80299cc <iprintf>
  38061. break;
  38062. 80106b6: e00c b.n 80106d2 <dhcp_sm+0x112>
  38063. dhcp = (struct dhcp *)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP);
  38064. 80106b8: 687b ldr r3, [r7, #4]
  38065. 80106ba: 6a5b ldr r3, [r3, #36] @ 0x24
  38066. 80106bc: 62fb str r3, [r7, #44] @ 0x2c
  38067. if(dhcp->state == 3)
  38068. 80106be: 6afb ldr r3, [r7, #44] @ 0x2c
  38069. 80106c0: 795b ldrb r3, [r3, #5]
  38070. 80106c2: 2b03 cmp r3, #3
  38071. 80106c4: d107 bne.n 80106d6 <dhcp_sm+0x116>
  38072. *state = DHCP_START;
  38073. 80106c6: 683b ldr r3, [r7, #0]
  38074. 80106c8: 2201 movs r2, #1
  38075. 80106ca: 701a strb r2, [r3, #0]
  38076. break;
  38077. 80106cc: e003 b.n 80106d6 <dhcp_sm+0x116>
  38078. break;
  38079. 80106ce: bf00 nop
  38080. 80106d0: e002 b.n 80106d8 <dhcp_sm+0x118>
  38081. break;
  38082. 80106d2: bf00 nop
  38083. 80106d4: e000 b.n 80106d8 <dhcp_sm+0x118>
  38084. break;
  38085. 80106d6: bf00 nop
  38086. }
  38087. }
  38088. 80106d8: bf00 nop
  38089. 80106da: 3730 adds r7, #48 @ 0x30
  38090. 80106dc: 46bd mov sp, r7
  38091. 80106de: bd80 pop {r7, pc}
  38092. 80106e0: 0802cabc .word 0x0802cabc
  38093. 80106e4: 0802cae4 .word 0x0802cae4
  38094. 80106e8: 0802cae8 .word 0x0802cae8
  38095. 80106ec: 0802cb14 .word 0x0802cb14
  38096. 80106f0: 0802cb24 .word 0x0802cb24
  38097. 80106f4: 0802cb34 .word 0x0802cb34
  38098. 80106f8: 0802cb40 .word 0x0802cb40
  38099. 80106fc: 0802cb54 .word 0x0802cb54
  38100. 08010700 <__NVIC_SetPriority>:
  38101. {
  38102. 8010700: b480 push {r7}
  38103. 8010702: b083 sub sp, #12
  38104. 8010704: af00 add r7, sp, #0
  38105. 8010706: 4603 mov r3, r0
  38106. 8010708: 6039 str r1, [r7, #0]
  38107. 801070a: 80fb strh r3, [r7, #6]
  38108. if ((int32_t)(IRQn) >= 0)
  38109. 801070c: f9b7 3006 ldrsh.w r3, [r7, #6]
  38110. 8010710: 2b00 cmp r3, #0
  38111. 8010712: db0a blt.n 801072a <__NVIC_SetPriority+0x2a>
  38112. NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
  38113. 8010714: 683b ldr r3, [r7, #0]
  38114. 8010716: b2da uxtb r2, r3
  38115. 8010718: 490c ldr r1, [pc, #48] @ (801074c <__NVIC_SetPriority+0x4c>)
  38116. 801071a: f9b7 3006 ldrsh.w r3, [r7, #6]
  38117. 801071e: 0112 lsls r2, r2, #4
  38118. 8010720: b2d2 uxtb r2, r2
  38119. 8010722: 440b add r3, r1
  38120. 8010724: f883 2300 strb.w r2, [r3, #768] @ 0x300
  38121. }
  38122. 8010728: e00a b.n 8010740 <__NVIC_SetPriority+0x40>
  38123. SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
  38124. 801072a: 683b ldr r3, [r7, #0]
  38125. 801072c: b2da uxtb r2, r3
  38126. 801072e: 4908 ldr r1, [pc, #32] @ (8010750 <__NVIC_SetPriority+0x50>)
  38127. 8010730: 88fb ldrh r3, [r7, #6]
  38128. 8010732: f003 030f and.w r3, r3, #15
  38129. 8010736: 3b04 subs r3, #4
  38130. 8010738: 0112 lsls r2, r2, #4
  38131. 801073a: b2d2 uxtb r2, r2
  38132. 801073c: 440b add r3, r1
  38133. 801073e: 761a strb r2, [r3, #24]
  38134. }
  38135. 8010740: bf00 nop
  38136. 8010742: 370c adds r7, #12
  38137. 8010744: 46bd mov sp, r7
  38138. 8010746: f85d 7b04 ldr.w r7, [sp], #4
  38139. 801074a: 4770 bx lr
  38140. 801074c: e000e100 .word 0xe000e100
  38141. 8010750: e000ed00 .word 0xe000ed00
  38142. 08010754 <SysTick_Handler>:
  38143. /*
  38144. SysTick handler implementation that also clears overflow flag.
  38145. */
  38146. #if (USE_CUSTOM_SYSTICK_HANDLER_IMPLEMENTATION == 0)
  38147. void SysTick_Handler (void) {
  38148. 8010754: b580 push {r7, lr}
  38149. 8010756: af00 add r7, sp, #0
  38150. /* Clear overflow flag */
  38151. SysTick->CTRL;
  38152. 8010758: 4b05 ldr r3, [pc, #20] @ (8010770 <SysTick_Handler+0x1c>)
  38153. 801075a: 681b ldr r3, [r3, #0]
  38154. if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
  38155. 801075c: f003 f946 bl 80139ec <xTaskGetSchedulerState>
  38156. 8010760: 4603 mov r3, r0
  38157. 8010762: 2b01 cmp r3, #1
  38158. 8010764: d001 beq.n 801076a <SysTick_Handler+0x16>
  38159. /* Call tick handler */
  38160. xPortSysTickHandler();
  38161. 8010766: f004 fa6f bl 8014c48 <xPortSysTickHandler>
  38162. }
  38163. }
  38164. 801076a: bf00 nop
  38165. 801076c: bd80 pop {r7, pc}
  38166. 801076e: bf00 nop
  38167. 8010770: e000e010 .word 0xe000e010
  38168. 08010774 <SVC_Setup>:
  38169. #endif /* SysTick */
  38170. /*
  38171. Setup SVC to reset value.
  38172. */
  38173. __STATIC_INLINE void SVC_Setup (void) {
  38174. 8010774: b580 push {r7, lr}
  38175. 8010776: af00 add r7, sp, #0
  38176. #if (__ARM_ARCH_7A__ == 0U)
  38177. /* Service Call interrupt might be configured before kernel start */
  38178. /* and when its priority is lower or equal to BASEPRI, svc intruction */
  38179. /* causes a Hard Fault. */
  38180. NVIC_SetPriority (SVCall_IRQ_NBR, 0U);
  38181. 8010778: 2100 movs r1, #0
  38182. 801077a: f06f 0004 mvn.w r0, #4
  38183. 801077e: f7ff ffbf bl 8010700 <__NVIC_SetPriority>
  38184. #endif
  38185. }
  38186. 8010782: bf00 nop
  38187. 8010784: bd80 pop {r7, pc}
  38188. ...
  38189. 08010788 <osKernelInitialize>:
  38190. static uint32_t OS_Tick_GetOverflow (void);
  38191. /* Get OS Tick interval */
  38192. static uint32_t OS_Tick_GetInterval (void);
  38193. /*---------------------------------------------------------------------------*/
  38194. osStatus_t osKernelInitialize (void) {
  38195. 8010788: b480 push {r7}
  38196. 801078a: b083 sub sp, #12
  38197. 801078c: af00 add r7, sp, #0
  38198. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  38199. 801078e: f3ef 8305 mrs r3, IPSR
  38200. 8010792: 603b str r3, [r7, #0]
  38201. return(result);
  38202. 8010794: 683b ldr r3, [r7, #0]
  38203. osStatus_t stat;
  38204. if (IS_IRQ()) {
  38205. 8010796: 2b00 cmp r3, #0
  38206. 8010798: d003 beq.n 80107a2 <osKernelInitialize+0x1a>
  38207. stat = osErrorISR;
  38208. 801079a: f06f 0305 mvn.w r3, #5
  38209. 801079e: 607b str r3, [r7, #4]
  38210. 80107a0: e00c b.n 80107bc <osKernelInitialize+0x34>
  38211. }
  38212. else {
  38213. if (KernelState == osKernelInactive) {
  38214. 80107a2: 4b0a ldr r3, [pc, #40] @ (80107cc <osKernelInitialize+0x44>)
  38215. 80107a4: 681b ldr r3, [r3, #0]
  38216. 80107a6: 2b00 cmp r3, #0
  38217. 80107a8: d105 bne.n 80107b6 <osKernelInitialize+0x2e>
  38218. EvrFreeRTOSSetup(0U);
  38219. #endif
  38220. #if defined(USE_FreeRTOS_HEAP_5) && (HEAP_5_REGION_SETUP == 1)
  38221. vPortDefineHeapRegions (configHEAP_5_REGIONS);
  38222. #endif
  38223. KernelState = osKernelReady;
  38224. 80107aa: 4b08 ldr r3, [pc, #32] @ (80107cc <osKernelInitialize+0x44>)
  38225. 80107ac: 2201 movs r2, #1
  38226. 80107ae: 601a str r2, [r3, #0]
  38227. stat = osOK;
  38228. 80107b0: 2300 movs r3, #0
  38229. 80107b2: 607b str r3, [r7, #4]
  38230. 80107b4: e002 b.n 80107bc <osKernelInitialize+0x34>
  38231. } else {
  38232. stat = osError;
  38233. 80107b6: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  38234. 80107ba: 607b str r3, [r7, #4]
  38235. }
  38236. }
  38237. return (stat);
  38238. 80107bc: 687b ldr r3, [r7, #4]
  38239. }
  38240. 80107be: 4618 mov r0, r3
  38241. 80107c0: 370c adds r7, #12
  38242. 80107c2: 46bd mov sp, r7
  38243. 80107c4: f85d 7b04 ldr.w r7, [sp], #4
  38244. 80107c8: 4770 bx lr
  38245. 80107ca: bf00 nop
  38246. 80107cc: 240022fc .word 0x240022fc
  38247. 080107d0 <osKernelStart>:
  38248. }
  38249. return (state);
  38250. }
  38251. osStatus_t osKernelStart (void) {
  38252. 80107d0: b580 push {r7, lr}
  38253. 80107d2: b082 sub sp, #8
  38254. 80107d4: af00 add r7, sp, #0
  38255. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  38256. 80107d6: f3ef 8305 mrs r3, IPSR
  38257. 80107da: 603b str r3, [r7, #0]
  38258. return(result);
  38259. 80107dc: 683b ldr r3, [r7, #0]
  38260. osStatus_t stat;
  38261. if (IS_IRQ()) {
  38262. 80107de: 2b00 cmp r3, #0
  38263. 80107e0: d003 beq.n 80107ea <osKernelStart+0x1a>
  38264. stat = osErrorISR;
  38265. 80107e2: f06f 0305 mvn.w r3, #5
  38266. 80107e6: 607b str r3, [r7, #4]
  38267. 80107e8: e010 b.n 801080c <osKernelStart+0x3c>
  38268. }
  38269. else {
  38270. if (KernelState == osKernelReady) {
  38271. 80107ea: 4b0b ldr r3, [pc, #44] @ (8010818 <osKernelStart+0x48>)
  38272. 80107ec: 681b ldr r3, [r3, #0]
  38273. 80107ee: 2b01 cmp r3, #1
  38274. 80107f0: d109 bne.n 8010806 <osKernelStart+0x36>
  38275. /* Ensure SVC priority is at the reset value */
  38276. SVC_Setup();
  38277. 80107f2: f7ff ffbf bl 8010774 <SVC_Setup>
  38278. /* Change state to enable IRQ masking check */
  38279. KernelState = osKernelRunning;
  38280. 80107f6: 4b08 ldr r3, [pc, #32] @ (8010818 <osKernelStart+0x48>)
  38281. 80107f8: 2202 movs r2, #2
  38282. 80107fa: 601a str r2, [r3, #0]
  38283. /* Start the kernel scheduler */
  38284. vTaskStartScheduler();
  38285. 80107fc: f002 fc3a bl 8013074 <vTaskStartScheduler>
  38286. stat = osOK;
  38287. 8010800: 2300 movs r3, #0
  38288. 8010802: 607b str r3, [r7, #4]
  38289. 8010804: e002 b.n 801080c <osKernelStart+0x3c>
  38290. } else {
  38291. stat = osError;
  38292. 8010806: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  38293. 801080a: 607b str r3, [r7, #4]
  38294. }
  38295. }
  38296. return (stat);
  38297. 801080c: 687b ldr r3, [r7, #4]
  38298. }
  38299. 801080e: 4618 mov r0, r3
  38300. 8010810: 3708 adds r7, #8
  38301. 8010812: 46bd mov sp, r7
  38302. 8010814: bd80 pop {r7, pc}
  38303. 8010816: bf00 nop
  38304. 8010818: 240022fc .word 0x240022fc
  38305. 0801081c <osKernelGetTickCount>:
  38306. }
  38307. return (lock);
  38308. }
  38309. uint32_t osKernelGetTickCount (void) {
  38310. 801081c: b580 push {r7, lr}
  38311. 801081e: b082 sub sp, #8
  38312. 8010820: af00 add r7, sp, #0
  38313. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  38314. 8010822: f3ef 8305 mrs r3, IPSR
  38315. 8010826: 603b str r3, [r7, #0]
  38316. return(result);
  38317. 8010828: 683b ldr r3, [r7, #0]
  38318. TickType_t ticks;
  38319. if (IS_IRQ()) {
  38320. 801082a: 2b00 cmp r3, #0
  38321. 801082c: d003 beq.n 8010836 <osKernelGetTickCount+0x1a>
  38322. ticks = xTaskGetTickCountFromISR();
  38323. 801082e: f002 fd4d bl 80132cc <xTaskGetTickCountFromISR>
  38324. 8010832: 6078 str r0, [r7, #4]
  38325. 8010834: e002 b.n 801083c <osKernelGetTickCount+0x20>
  38326. } else {
  38327. ticks = xTaskGetTickCount();
  38328. 8010836: f002 fd39 bl 80132ac <xTaskGetTickCount>
  38329. 801083a: 6078 str r0, [r7, #4]
  38330. }
  38331. return (ticks);
  38332. 801083c: 687b ldr r3, [r7, #4]
  38333. }
  38334. 801083e: 4618 mov r0, r3
  38335. 8010840: 3708 adds r7, #8
  38336. 8010842: 46bd mov sp, r7
  38337. 8010844: bd80 pop {r7, pc}
  38338. 08010846 <osThreadNew>:
  38339. return (configCPU_CLOCK_HZ);
  38340. }
  38341. /*---------------------------------------------------------------------------*/
  38342. osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr) {
  38343. 8010846: b580 push {r7, lr}
  38344. 8010848: b08e sub sp, #56 @ 0x38
  38345. 801084a: af04 add r7, sp, #16
  38346. 801084c: 60f8 str r0, [r7, #12]
  38347. 801084e: 60b9 str r1, [r7, #8]
  38348. 8010850: 607a str r2, [r7, #4]
  38349. uint32_t stack;
  38350. TaskHandle_t hTask;
  38351. UBaseType_t prio;
  38352. int32_t mem;
  38353. hTask = NULL;
  38354. 8010852: 2300 movs r3, #0
  38355. 8010854: 613b str r3, [r7, #16]
  38356. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  38357. 8010856: f3ef 8305 mrs r3, IPSR
  38358. 801085a: 617b str r3, [r7, #20]
  38359. return(result);
  38360. 801085c: 697b ldr r3, [r7, #20]
  38361. if (!IS_IRQ() && (func != NULL)) {
  38362. 801085e: 2b00 cmp r3, #0
  38363. 8010860: d17f bne.n 8010962 <osThreadNew+0x11c>
  38364. 8010862: 68fb ldr r3, [r7, #12]
  38365. 8010864: 2b00 cmp r3, #0
  38366. 8010866: d07c beq.n 8010962 <osThreadNew+0x11c>
  38367. stack = configMINIMAL_STACK_SIZE;
  38368. 8010868: f44f 7300 mov.w r3, #512 @ 0x200
  38369. 801086c: 623b str r3, [r7, #32]
  38370. prio = (UBaseType_t)osPriorityNormal;
  38371. 801086e: 2318 movs r3, #24
  38372. 8010870: 61fb str r3, [r7, #28]
  38373. name = NULL;
  38374. 8010872: 2300 movs r3, #0
  38375. 8010874: 627b str r3, [r7, #36] @ 0x24
  38376. mem = -1;
  38377. 8010876: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  38378. 801087a: 61bb str r3, [r7, #24]
  38379. if (attr != NULL) {
  38380. 801087c: 687b ldr r3, [r7, #4]
  38381. 801087e: 2b00 cmp r3, #0
  38382. 8010880: d045 beq.n 801090e <osThreadNew+0xc8>
  38383. if (attr->name != NULL) {
  38384. 8010882: 687b ldr r3, [r7, #4]
  38385. 8010884: 681b ldr r3, [r3, #0]
  38386. 8010886: 2b00 cmp r3, #0
  38387. 8010888: d002 beq.n 8010890 <osThreadNew+0x4a>
  38388. name = attr->name;
  38389. 801088a: 687b ldr r3, [r7, #4]
  38390. 801088c: 681b ldr r3, [r3, #0]
  38391. 801088e: 627b str r3, [r7, #36] @ 0x24
  38392. }
  38393. if (attr->priority != osPriorityNone) {
  38394. 8010890: 687b ldr r3, [r7, #4]
  38395. 8010892: 699b ldr r3, [r3, #24]
  38396. 8010894: 2b00 cmp r3, #0
  38397. 8010896: d002 beq.n 801089e <osThreadNew+0x58>
  38398. prio = (UBaseType_t)attr->priority;
  38399. 8010898: 687b ldr r3, [r7, #4]
  38400. 801089a: 699b ldr r3, [r3, #24]
  38401. 801089c: 61fb str r3, [r7, #28]
  38402. }
  38403. if ((prio < osPriorityIdle) || (prio > osPriorityISR) || ((attr->attr_bits & osThreadJoinable) == osThreadJoinable)) {
  38404. 801089e: 69fb ldr r3, [r7, #28]
  38405. 80108a0: 2b00 cmp r3, #0
  38406. 80108a2: d008 beq.n 80108b6 <osThreadNew+0x70>
  38407. 80108a4: 69fb ldr r3, [r7, #28]
  38408. 80108a6: 2b38 cmp r3, #56 @ 0x38
  38409. 80108a8: d805 bhi.n 80108b6 <osThreadNew+0x70>
  38410. 80108aa: 687b ldr r3, [r7, #4]
  38411. 80108ac: 685b ldr r3, [r3, #4]
  38412. 80108ae: f003 0301 and.w r3, r3, #1
  38413. 80108b2: 2b00 cmp r3, #0
  38414. 80108b4: d001 beq.n 80108ba <osThreadNew+0x74>
  38415. return (NULL);
  38416. 80108b6: 2300 movs r3, #0
  38417. 80108b8: e054 b.n 8010964 <osThreadNew+0x11e>
  38418. }
  38419. if (attr->stack_size > 0U) {
  38420. 80108ba: 687b ldr r3, [r7, #4]
  38421. 80108bc: 695b ldr r3, [r3, #20]
  38422. 80108be: 2b00 cmp r3, #0
  38423. 80108c0: d003 beq.n 80108ca <osThreadNew+0x84>
  38424. /* In FreeRTOS stack is not in bytes, but in sizeof(StackType_t) which is 4 on ARM ports. */
  38425. /* Stack size should be therefore 4 byte aligned in order to avoid division caused side effects */
  38426. stack = attr->stack_size / sizeof(StackType_t);
  38427. 80108c2: 687b ldr r3, [r7, #4]
  38428. 80108c4: 695b ldr r3, [r3, #20]
  38429. 80108c6: 089b lsrs r3, r3, #2
  38430. 80108c8: 623b str r3, [r7, #32]
  38431. }
  38432. if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticTask_t)) &&
  38433. 80108ca: 687b ldr r3, [r7, #4]
  38434. 80108cc: 689b ldr r3, [r3, #8]
  38435. 80108ce: 2b00 cmp r3, #0
  38436. 80108d0: d00e beq.n 80108f0 <osThreadNew+0xaa>
  38437. 80108d2: 687b ldr r3, [r7, #4]
  38438. 80108d4: 68db ldr r3, [r3, #12]
  38439. 80108d6: 2ba7 cmp r3, #167 @ 0xa7
  38440. 80108d8: d90a bls.n 80108f0 <osThreadNew+0xaa>
  38441. (attr->stack_mem != NULL) && (attr->stack_size > 0U)) {
  38442. 80108da: 687b ldr r3, [r7, #4]
  38443. 80108dc: 691b ldr r3, [r3, #16]
  38444. if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticTask_t)) &&
  38445. 80108de: 2b00 cmp r3, #0
  38446. 80108e0: d006 beq.n 80108f0 <osThreadNew+0xaa>
  38447. (attr->stack_mem != NULL) && (attr->stack_size > 0U)) {
  38448. 80108e2: 687b ldr r3, [r7, #4]
  38449. 80108e4: 695b ldr r3, [r3, #20]
  38450. 80108e6: 2b00 cmp r3, #0
  38451. 80108e8: d002 beq.n 80108f0 <osThreadNew+0xaa>
  38452. mem = 1;
  38453. 80108ea: 2301 movs r3, #1
  38454. 80108ec: 61bb str r3, [r7, #24]
  38455. 80108ee: e010 b.n 8010912 <osThreadNew+0xcc>
  38456. }
  38457. else {
  38458. if ((attr->cb_mem == NULL) && (attr->cb_size == 0U) && (attr->stack_mem == NULL)) {
  38459. 80108f0: 687b ldr r3, [r7, #4]
  38460. 80108f2: 689b ldr r3, [r3, #8]
  38461. 80108f4: 2b00 cmp r3, #0
  38462. 80108f6: d10c bne.n 8010912 <osThreadNew+0xcc>
  38463. 80108f8: 687b ldr r3, [r7, #4]
  38464. 80108fa: 68db ldr r3, [r3, #12]
  38465. 80108fc: 2b00 cmp r3, #0
  38466. 80108fe: d108 bne.n 8010912 <osThreadNew+0xcc>
  38467. 8010900: 687b ldr r3, [r7, #4]
  38468. 8010902: 691b ldr r3, [r3, #16]
  38469. 8010904: 2b00 cmp r3, #0
  38470. 8010906: d104 bne.n 8010912 <osThreadNew+0xcc>
  38471. mem = 0;
  38472. 8010908: 2300 movs r3, #0
  38473. 801090a: 61bb str r3, [r7, #24]
  38474. 801090c: e001 b.n 8010912 <osThreadNew+0xcc>
  38475. }
  38476. }
  38477. }
  38478. else {
  38479. mem = 0;
  38480. 801090e: 2300 movs r3, #0
  38481. 8010910: 61bb str r3, [r7, #24]
  38482. }
  38483. if (mem == 1) {
  38484. 8010912: 69bb ldr r3, [r7, #24]
  38485. 8010914: 2b01 cmp r3, #1
  38486. 8010916: d110 bne.n 801093a <osThreadNew+0xf4>
  38487. #if (configSUPPORT_STATIC_ALLOCATION == 1)
  38488. hTask = xTaskCreateStatic ((TaskFunction_t)func, name, stack, argument, prio, (StackType_t *)attr->stack_mem,
  38489. 8010918: 687b ldr r3, [r7, #4]
  38490. 801091a: 691b ldr r3, [r3, #16]
  38491. (StaticTask_t *)attr->cb_mem);
  38492. 801091c: 687a ldr r2, [r7, #4]
  38493. 801091e: 6892 ldr r2, [r2, #8]
  38494. hTask = xTaskCreateStatic ((TaskFunction_t)func, name, stack, argument, prio, (StackType_t *)attr->stack_mem,
  38495. 8010920: 9202 str r2, [sp, #8]
  38496. 8010922: 9301 str r3, [sp, #4]
  38497. 8010924: 69fb ldr r3, [r7, #28]
  38498. 8010926: 9300 str r3, [sp, #0]
  38499. 8010928: 68bb ldr r3, [r7, #8]
  38500. 801092a: 6a3a ldr r2, [r7, #32]
  38501. 801092c: 6a79 ldr r1, [r7, #36] @ 0x24
  38502. 801092e: 68f8 ldr r0, [r7, #12]
  38503. 8010930: f002 f9ac bl 8012c8c <xTaskCreateStatic>
  38504. 8010934: 4603 mov r3, r0
  38505. 8010936: 613b str r3, [r7, #16]
  38506. 8010938: e013 b.n 8010962 <osThreadNew+0x11c>
  38507. #endif
  38508. }
  38509. else {
  38510. if (mem == 0) {
  38511. 801093a: 69bb ldr r3, [r7, #24]
  38512. 801093c: 2b00 cmp r3, #0
  38513. 801093e: d110 bne.n 8010962 <osThreadNew+0x11c>
  38514. #if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
  38515. if (xTaskCreate ((TaskFunction_t)func, name, (uint16_t)stack, argument, prio, &hTask) != pdPASS) {
  38516. 8010940: 6a3b ldr r3, [r7, #32]
  38517. 8010942: b29a uxth r2, r3
  38518. 8010944: f107 0310 add.w r3, r7, #16
  38519. 8010948: 9301 str r3, [sp, #4]
  38520. 801094a: 69fb ldr r3, [r7, #28]
  38521. 801094c: 9300 str r3, [sp, #0]
  38522. 801094e: 68bb ldr r3, [r7, #8]
  38523. 8010950: 6a79 ldr r1, [r7, #36] @ 0x24
  38524. 8010952: 68f8 ldr r0, [r7, #12]
  38525. 8010954: f002 f9fa bl 8012d4c <xTaskCreate>
  38526. 8010958: 4603 mov r3, r0
  38527. 801095a: 2b01 cmp r3, #1
  38528. 801095c: d001 beq.n 8010962 <osThreadNew+0x11c>
  38529. hTask = NULL;
  38530. 801095e: 2300 movs r3, #0
  38531. 8010960: 613b str r3, [r7, #16]
  38532. #endif
  38533. }
  38534. }
  38535. }
  38536. return ((osThreadId_t)hTask);
  38537. 8010962: 693b ldr r3, [r7, #16]
  38538. }
  38539. 8010964: 4618 mov r0, r3
  38540. 8010966: 3728 adds r7, #40 @ 0x28
  38541. 8010968: 46bd mov sp, r7
  38542. 801096a: bd80 pop {r7, pc}
  38543. 0801096c <osThreadGetId>:
  38544. }
  38545. return (name);
  38546. }
  38547. osThreadId_t osThreadGetId (void) {
  38548. 801096c: b580 push {r7, lr}
  38549. 801096e: b082 sub sp, #8
  38550. 8010970: af00 add r7, sp, #0
  38551. osThreadId_t id;
  38552. id = (osThreadId_t)xTaskGetCurrentTaskHandle();
  38553. 8010972: f003 f82b bl 80139cc <xTaskGetCurrentTaskHandle>
  38554. 8010976: 6078 str r0, [r7, #4]
  38555. return (id);
  38556. 8010978: 687b ldr r3, [r7, #4]
  38557. }
  38558. 801097a: 4618 mov r0, r3
  38559. 801097c: 3708 adds r7, #8
  38560. 801097e: 46bd mov sp, r7
  38561. 8010980: bd80 pop {r7, pc}
  38562. 08010982 <osDelay>:
  38563. /* Return flags before clearing */
  38564. return (rflags);
  38565. }
  38566. #endif /* (configUSE_OS2_THREAD_FLAGS == 1) */
  38567. osStatus_t osDelay (uint32_t ticks) {
  38568. 8010982: b580 push {r7, lr}
  38569. 8010984: b084 sub sp, #16
  38570. 8010986: af00 add r7, sp, #0
  38571. 8010988: 6078 str r0, [r7, #4]
  38572. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  38573. 801098a: f3ef 8305 mrs r3, IPSR
  38574. 801098e: 60bb str r3, [r7, #8]
  38575. return(result);
  38576. 8010990: 68bb ldr r3, [r7, #8]
  38577. osStatus_t stat;
  38578. if (IS_IRQ()) {
  38579. 8010992: 2b00 cmp r3, #0
  38580. 8010994: d003 beq.n 801099e <osDelay+0x1c>
  38581. stat = osErrorISR;
  38582. 8010996: f06f 0305 mvn.w r3, #5
  38583. 801099a: 60fb str r3, [r7, #12]
  38584. 801099c: e007 b.n 80109ae <osDelay+0x2c>
  38585. }
  38586. else {
  38587. stat = osOK;
  38588. 801099e: 2300 movs r3, #0
  38589. 80109a0: 60fb str r3, [r7, #12]
  38590. if (ticks != 0U) {
  38591. 80109a2: 687b ldr r3, [r7, #4]
  38592. 80109a4: 2b00 cmp r3, #0
  38593. 80109a6: d002 beq.n 80109ae <osDelay+0x2c>
  38594. vTaskDelay(ticks);
  38595. 80109a8: 6878 ldr r0, [r7, #4]
  38596. 80109aa: f002 fb2d bl 8013008 <vTaskDelay>
  38597. }
  38598. }
  38599. return (stat);
  38600. 80109ae: 68fb ldr r3, [r7, #12]
  38601. }
  38602. 80109b0: 4618 mov r0, r3
  38603. 80109b2: 3710 adds r7, #16
  38604. 80109b4: 46bd mov sp, r7
  38605. 80109b6: bd80 pop {r7, pc}
  38606. 080109b8 <osMutexNew>:
  38607. }
  38608. /*---------------------------------------------------------------------------*/
  38609. #if (configUSE_OS2_MUTEX == 1)
  38610. osMutexId_t osMutexNew (const osMutexAttr_t *attr) {
  38611. 80109b8: b580 push {r7, lr}
  38612. 80109ba: b088 sub sp, #32
  38613. 80109bc: af00 add r7, sp, #0
  38614. 80109be: 6078 str r0, [r7, #4]
  38615. int32_t mem;
  38616. #if (configQUEUE_REGISTRY_SIZE > 0)
  38617. const char *name;
  38618. #endif
  38619. hMutex = NULL;
  38620. 80109c0: 2300 movs r3, #0
  38621. 80109c2: 61fb str r3, [r7, #28]
  38622. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  38623. 80109c4: f3ef 8305 mrs r3, IPSR
  38624. 80109c8: 60bb str r3, [r7, #8]
  38625. return(result);
  38626. 80109ca: 68bb ldr r3, [r7, #8]
  38627. if (!IS_IRQ()) {
  38628. 80109cc: 2b00 cmp r3, #0
  38629. 80109ce: d174 bne.n 8010aba <osMutexNew+0x102>
  38630. if (attr != NULL) {
  38631. 80109d0: 687b ldr r3, [r7, #4]
  38632. 80109d2: 2b00 cmp r3, #0
  38633. 80109d4: d003 beq.n 80109de <osMutexNew+0x26>
  38634. type = attr->attr_bits;
  38635. 80109d6: 687b ldr r3, [r7, #4]
  38636. 80109d8: 685b ldr r3, [r3, #4]
  38637. 80109da: 61bb str r3, [r7, #24]
  38638. 80109dc: e001 b.n 80109e2 <osMutexNew+0x2a>
  38639. } else {
  38640. type = 0U;
  38641. 80109de: 2300 movs r3, #0
  38642. 80109e0: 61bb str r3, [r7, #24]
  38643. }
  38644. if ((type & osMutexRecursive) == osMutexRecursive) {
  38645. 80109e2: 69bb ldr r3, [r7, #24]
  38646. 80109e4: f003 0301 and.w r3, r3, #1
  38647. 80109e8: 2b00 cmp r3, #0
  38648. 80109ea: d002 beq.n 80109f2 <osMutexNew+0x3a>
  38649. rmtx = 1U;
  38650. 80109ec: 2301 movs r3, #1
  38651. 80109ee: 617b str r3, [r7, #20]
  38652. 80109f0: e001 b.n 80109f6 <osMutexNew+0x3e>
  38653. } else {
  38654. rmtx = 0U;
  38655. 80109f2: 2300 movs r3, #0
  38656. 80109f4: 617b str r3, [r7, #20]
  38657. }
  38658. if ((type & osMutexRobust) != osMutexRobust) {
  38659. 80109f6: 69bb ldr r3, [r7, #24]
  38660. 80109f8: f003 0308 and.w r3, r3, #8
  38661. 80109fc: 2b00 cmp r3, #0
  38662. 80109fe: d15c bne.n 8010aba <osMutexNew+0x102>
  38663. mem = -1;
  38664. 8010a00: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  38665. 8010a04: 613b str r3, [r7, #16]
  38666. if (attr != NULL) {
  38667. 8010a06: 687b ldr r3, [r7, #4]
  38668. 8010a08: 2b00 cmp r3, #0
  38669. 8010a0a: d015 beq.n 8010a38 <osMutexNew+0x80>
  38670. if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticSemaphore_t))) {
  38671. 8010a0c: 687b ldr r3, [r7, #4]
  38672. 8010a0e: 689b ldr r3, [r3, #8]
  38673. 8010a10: 2b00 cmp r3, #0
  38674. 8010a12: d006 beq.n 8010a22 <osMutexNew+0x6a>
  38675. 8010a14: 687b ldr r3, [r7, #4]
  38676. 8010a16: 68db ldr r3, [r3, #12]
  38677. 8010a18: 2b4f cmp r3, #79 @ 0x4f
  38678. 8010a1a: d902 bls.n 8010a22 <osMutexNew+0x6a>
  38679. mem = 1;
  38680. 8010a1c: 2301 movs r3, #1
  38681. 8010a1e: 613b str r3, [r7, #16]
  38682. 8010a20: e00c b.n 8010a3c <osMutexNew+0x84>
  38683. }
  38684. else {
  38685. if ((attr->cb_mem == NULL) && (attr->cb_size == 0U)) {
  38686. 8010a22: 687b ldr r3, [r7, #4]
  38687. 8010a24: 689b ldr r3, [r3, #8]
  38688. 8010a26: 2b00 cmp r3, #0
  38689. 8010a28: d108 bne.n 8010a3c <osMutexNew+0x84>
  38690. 8010a2a: 687b ldr r3, [r7, #4]
  38691. 8010a2c: 68db ldr r3, [r3, #12]
  38692. 8010a2e: 2b00 cmp r3, #0
  38693. 8010a30: d104 bne.n 8010a3c <osMutexNew+0x84>
  38694. mem = 0;
  38695. 8010a32: 2300 movs r3, #0
  38696. 8010a34: 613b str r3, [r7, #16]
  38697. 8010a36: e001 b.n 8010a3c <osMutexNew+0x84>
  38698. }
  38699. }
  38700. }
  38701. else {
  38702. mem = 0;
  38703. 8010a38: 2300 movs r3, #0
  38704. 8010a3a: 613b str r3, [r7, #16]
  38705. }
  38706. if (mem == 1) {
  38707. 8010a3c: 693b ldr r3, [r7, #16]
  38708. 8010a3e: 2b01 cmp r3, #1
  38709. 8010a40: d112 bne.n 8010a68 <osMutexNew+0xb0>
  38710. #if (configSUPPORT_STATIC_ALLOCATION == 1)
  38711. if (rmtx != 0U) {
  38712. 8010a42: 697b ldr r3, [r7, #20]
  38713. 8010a44: 2b00 cmp r3, #0
  38714. 8010a46: d007 beq.n 8010a58 <osMutexNew+0xa0>
  38715. #if (configUSE_RECURSIVE_MUTEXES == 1)
  38716. hMutex = xSemaphoreCreateRecursiveMutexStatic (attr->cb_mem);
  38717. 8010a48: 687b ldr r3, [r7, #4]
  38718. 8010a4a: 689b ldr r3, [r3, #8]
  38719. 8010a4c: 4619 mov r1, r3
  38720. 8010a4e: 2004 movs r0, #4
  38721. 8010a50: f000 fdd9 bl 8011606 <xQueueCreateMutexStatic>
  38722. 8010a54: 61f8 str r0, [r7, #28]
  38723. 8010a56: e016 b.n 8010a86 <osMutexNew+0xce>
  38724. #endif
  38725. }
  38726. else {
  38727. hMutex = xSemaphoreCreateMutexStatic (attr->cb_mem);
  38728. 8010a58: 687b ldr r3, [r7, #4]
  38729. 8010a5a: 689b ldr r3, [r3, #8]
  38730. 8010a5c: 4619 mov r1, r3
  38731. 8010a5e: 2001 movs r0, #1
  38732. 8010a60: f000 fdd1 bl 8011606 <xQueueCreateMutexStatic>
  38733. 8010a64: 61f8 str r0, [r7, #28]
  38734. 8010a66: e00e b.n 8010a86 <osMutexNew+0xce>
  38735. }
  38736. #endif
  38737. }
  38738. else {
  38739. if (mem == 0) {
  38740. 8010a68: 693b ldr r3, [r7, #16]
  38741. 8010a6a: 2b00 cmp r3, #0
  38742. 8010a6c: d10b bne.n 8010a86 <osMutexNew+0xce>
  38743. #if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
  38744. if (rmtx != 0U) {
  38745. 8010a6e: 697b ldr r3, [r7, #20]
  38746. 8010a70: 2b00 cmp r3, #0
  38747. 8010a72: d004 beq.n 8010a7e <osMutexNew+0xc6>
  38748. #if (configUSE_RECURSIVE_MUTEXES == 1)
  38749. hMutex = xSemaphoreCreateRecursiveMutex ();
  38750. 8010a74: 2004 movs r0, #4
  38751. 8010a76: f000 fdae bl 80115d6 <xQueueCreateMutex>
  38752. 8010a7a: 61f8 str r0, [r7, #28]
  38753. 8010a7c: e003 b.n 8010a86 <osMutexNew+0xce>
  38754. #endif
  38755. } else {
  38756. hMutex = xSemaphoreCreateMutex ();
  38757. 8010a7e: 2001 movs r0, #1
  38758. 8010a80: f000 fda9 bl 80115d6 <xQueueCreateMutex>
  38759. 8010a84: 61f8 str r0, [r7, #28]
  38760. #endif
  38761. }
  38762. }
  38763. #if (configQUEUE_REGISTRY_SIZE > 0)
  38764. if (hMutex != NULL) {
  38765. 8010a86: 69fb ldr r3, [r7, #28]
  38766. 8010a88: 2b00 cmp r3, #0
  38767. 8010a8a: d00c beq.n 8010aa6 <osMutexNew+0xee>
  38768. if (attr != NULL) {
  38769. 8010a8c: 687b ldr r3, [r7, #4]
  38770. 8010a8e: 2b00 cmp r3, #0
  38771. 8010a90: d003 beq.n 8010a9a <osMutexNew+0xe2>
  38772. name = attr->name;
  38773. 8010a92: 687b ldr r3, [r7, #4]
  38774. 8010a94: 681b ldr r3, [r3, #0]
  38775. 8010a96: 60fb str r3, [r7, #12]
  38776. 8010a98: e001 b.n 8010a9e <osMutexNew+0xe6>
  38777. } else {
  38778. name = NULL;
  38779. 8010a9a: 2300 movs r3, #0
  38780. 8010a9c: 60fb str r3, [r7, #12]
  38781. }
  38782. vQueueAddToRegistry (hMutex, name);
  38783. 8010a9e: 68f9 ldr r1, [r7, #12]
  38784. 8010aa0: 69f8 ldr r0, [r7, #28]
  38785. 8010aa2: f001 fcd3 bl 801244c <vQueueAddToRegistry>
  38786. }
  38787. #endif
  38788. if ((hMutex != NULL) && (rmtx != 0U)) {
  38789. 8010aa6: 69fb ldr r3, [r7, #28]
  38790. 8010aa8: 2b00 cmp r3, #0
  38791. 8010aaa: d006 beq.n 8010aba <osMutexNew+0x102>
  38792. 8010aac: 697b ldr r3, [r7, #20]
  38793. 8010aae: 2b00 cmp r3, #0
  38794. 8010ab0: d003 beq.n 8010aba <osMutexNew+0x102>
  38795. hMutex = (SemaphoreHandle_t)((uint32_t)hMutex | 1U);
  38796. 8010ab2: 69fb ldr r3, [r7, #28]
  38797. 8010ab4: f043 0301 orr.w r3, r3, #1
  38798. 8010ab8: 61fb str r3, [r7, #28]
  38799. }
  38800. }
  38801. }
  38802. return ((osMutexId_t)hMutex);
  38803. 8010aba: 69fb ldr r3, [r7, #28]
  38804. }
  38805. 8010abc: 4618 mov r0, r3
  38806. 8010abe: 3720 adds r7, #32
  38807. 8010ac0: 46bd mov sp, r7
  38808. 8010ac2: bd80 pop {r7, pc}
  38809. 08010ac4 <osMutexAcquire>:
  38810. osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) {
  38811. 8010ac4: b580 push {r7, lr}
  38812. 8010ac6: b086 sub sp, #24
  38813. 8010ac8: af00 add r7, sp, #0
  38814. 8010aca: 6078 str r0, [r7, #4]
  38815. 8010acc: 6039 str r1, [r7, #0]
  38816. SemaphoreHandle_t hMutex;
  38817. osStatus_t stat;
  38818. uint32_t rmtx;
  38819. hMutex = (SemaphoreHandle_t)((uint32_t)mutex_id & ~1U);
  38820. 8010ace: 687b ldr r3, [r7, #4]
  38821. 8010ad0: f023 0301 bic.w r3, r3, #1
  38822. 8010ad4: 613b str r3, [r7, #16]
  38823. rmtx = (uint32_t)mutex_id & 1U;
  38824. 8010ad6: 687b ldr r3, [r7, #4]
  38825. 8010ad8: f003 0301 and.w r3, r3, #1
  38826. 8010adc: 60fb str r3, [r7, #12]
  38827. stat = osOK;
  38828. 8010ade: 2300 movs r3, #0
  38829. 8010ae0: 617b str r3, [r7, #20]
  38830. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  38831. 8010ae2: f3ef 8305 mrs r3, IPSR
  38832. 8010ae6: 60bb str r3, [r7, #8]
  38833. return(result);
  38834. 8010ae8: 68bb ldr r3, [r7, #8]
  38835. if (IS_IRQ()) {
  38836. 8010aea: 2b00 cmp r3, #0
  38837. 8010aec: d003 beq.n 8010af6 <osMutexAcquire+0x32>
  38838. stat = osErrorISR;
  38839. 8010aee: f06f 0305 mvn.w r3, #5
  38840. 8010af2: 617b str r3, [r7, #20]
  38841. 8010af4: e02c b.n 8010b50 <osMutexAcquire+0x8c>
  38842. }
  38843. else if (hMutex == NULL) {
  38844. 8010af6: 693b ldr r3, [r7, #16]
  38845. 8010af8: 2b00 cmp r3, #0
  38846. 8010afa: d103 bne.n 8010b04 <osMutexAcquire+0x40>
  38847. stat = osErrorParameter;
  38848. 8010afc: f06f 0303 mvn.w r3, #3
  38849. 8010b00: 617b str r3, [r7, #20]
  38850. 8010b02: e025 b.n 8010b50 <osMutexAcquire+0x8c>
  38851. }
  38852. else {
  38853. if (rmtx != 0U) {
  38854. 8010b04: 68fb ldr r3, [r7, #12]
  38855. 8010b06: 2b00 cmp r3, #0
  38856. 8010b08: d011 beq.n 8010b2e <osMutexAcquire+0x6a>
  38857. #if (configUSE_RECURSIVE_MUTEXES == 1)
  38858. if (xSemaphoreTakeRecursive (hMutex, timeout) != pdPASS) {
  38859. 8010b0a: 6839 ldr r1, [r7, #0]
  38860. 8010b0c: 6938 ldr r0, [r7, #16]
  38861. 8010b0e: f000 fdca bl 80116a6 <xQueueTakeMutexRecursive>
  38862. 8010b12: 4603 mov r3, r0
  38863. 8010b14: 2b01 cmp r3, #1
  38864. 8010b16: d01b beq.n 8010b50 <osMutexAcquire+0x8c>
  38865. if (timeout != 0U) {
  38866. 8010b18: 683b ldr r3, [r7, #0]
  38867. 8010b1a: 2b00 cmp r3, #0
  38868. 8010b1c: d003 beq.n 8010b26 <osMutexAcquire+0x62>
  38869. stat = osErrorTimeout;
  38870. 8010b1e: f06f 0301 mvn.w r3, #1
  38871. 8010b22: 617b str r3, [r7, #20]
  38872. 8010b24: e014 b.n 8010b50 <osMutexAcquire+0x8c>
  38873. } else {
  38874. stat = osErrorResource;
  38875. 8010b26: f06f 0302 mvn.w r3, #2
  38876. 8010b2a: 617b str r3, [r7, #20]
  38877. 8010b2c: e010 b.n 8010b50 <osMutexAcquire+0x8c>
  38878. }
  38879. }
  38880. #endif
  38881. }
  38882. else {
  38883. if (xSemaphoreTake (hMutex, timeout) != pdPASS) {
  38884. 8010b2e: 6839 ldr r1, [r7, #0]
  38885. 8010b30: 6938 ldr r0, [r7, #16]
  38886. 8010b32: f001 f96f bl 8011e14 <xQueueSemaphoreTake>
  38887. 8010b36: 4603 mov r3, r0
  38888. 8010b38: 2b01 cmp r3, #1
  38889. 8010b3a: d009 beq.n 8010b50 <osMutexAcquire+0x8c>
  38890. if (timeout != 0U) {
  38891. 8010b3c: 683b ldr r3, [r7, #0]
  38892. 8010b3e: 2b00 cmp r3, #0
  38893. 8010b40: d003 beq.n 8010b4a <osMutexAcquire+0x86>
  38894. stat = osErrorTimeout;
  38895. 8010b42: f06f 0301 mvn.w r3, #1
  38896. 8010b46: 617b str r3, [r7, #20]
  38897. 8010b48: e002 b.n 8010b50 <osMutexAcquire+0x8c>
  38898. } else {
  38899. stat = osErrorResource;
  38900. 8010b4a: f06f 0302 mvn.w r3, #2
  38901. 8010b4e: 617b str r3, [r7, #20]
  38902. }
  38903. }
  38904. }
  38905. }
  38906. return (stat);
  38907. 8010b50: 697b ldr r3, [r7, #20]
  38908. }
  38909. 8010b52: 4618 mov r0, r3
  38910. 8010b54: 3718 adds r7, #24
  38911. 8010b56: 46bd mov sp, r7
  38912. 8010b58: bd80 pop {r7, pc}
  38913. 08010b5a <osMutexRelease>:
  38914. osStatus_t osMutexRelease (osMutexId_t mutex_id) {
  38915. 8010b5a: b580 push {r7, lr}
  38916. 8010b5c: b086 sub sp, #24
  38917. 8010b5e: af00 add r7, sp, #0
  38918. 8010b60: 6078 str r0, [r7, #4]
  38919. SemaphoreHandle_t hMutex;
  38920. osStatus_t stat;
  38921. uint32_t rmtx;
  38922. hMutex = (SemaphoreHandle_t)((uint32_t)mutex_id & ~1U);
  38923. 8010b62: 687b ldr r3, [r7, #4]
  38924. 8010b64: f023 0301 bic.w r3, r3, #1
  38925. 8010b68: 613b str r3, [r7, #16]
  38926. rmtx = (uint32_t)mutex_id & 1U;
  38927. 8010b6a: 687b ldr r3, [r7, #4]
  38928. 8010b6c: f003 0301 and.w r3, r3, #1
  38929. 8010b70: 60fb str r3, [r7, #12]
  38930. stat = osOK;
  38931. 8010b72: 2300 movs r3, #0
  38932. 8010b74: 617b str r3, [r7, #20]
  38933. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  38934. 8010b76: f3ef 8305 mrs r3, IPSR
  38935. 8010b7a: 60bb str r3, [r7, #8]
  38936. return(result);
  38937. 8010b7c: 68bb ldr r3, [r7, #8]
  38938. if (IS_IRQ()) {
  38939. 8010b7e: 2b00 cmp r3, #0
  38940. 8010b80: d003 beq.n 8010b8a <osMutexRelease+0x30>
  38941. stat = osErrorISR;
  38942. 8010b82: f06f 0305 mvn.w r3, #5
  38943. 8010b86: 617b str r3, [r7, #20]
  38944. 8010b88: e01f b.n 8010bca <osMutexRelease+0x70>
  38945. }
  38946. else if (hMutex == NULL) {
  38947. 8010b8a: 693b ldr r3, [r7, #16]
  38948. 8010b8c: 2b00 cmp r3, #0
  38949. 8010b8e: d103 bne.n 8010b98 <osMutexRelease+0x3e>
  38950. stat = osErrorParameter;
  38951. 8010b90: f06f 0303 mvn.w r3, #3
  38952. 8010b94: 617b str r3, [r7, #20]
  38953. 8010b96: e018 b.n 8010bca <osMutexRelease+0x70>
  38954. }
  38955. else {
  38956. if (rmtx != 0U) {
  38957. 8010b98: 68fb ldr r3, [r7, #12]
  38958. 8010b9a: 2b00 cmp r3, #0
  38959. 8010b9c: d009 beq.n 8010bb2 <osMutexRelease+0x58>
  38960. #if (configUSE_RECURSIVE_MUTEXES == 1)
  38961. if (xSemaphoreGiveRecursive (hMutex) != pdPASS) {
  38962. 8010b9e: 6938 ldr r0, [r7, #16]
  38963. 8010ba0: f000 fd4c bl 801163c <xQueueGiveMutexRecursive>
  38964. 8010ba4: 4603 mov r3, r0
  38965. 8010ba6: 2b01 cmp r3, #1
  38966. 8010ba8: d00f beq.n 8010bca <osMutexRelease+0x70>
  38967. stat = osErrorResource;
  38968. 8010baa: f06f 0302 mvn.w r3, #2
  38969. 8010bae: 617b str r3, [r7, #20]
  38970. 8010bb0: e00b b.n 8010bca <osMutexRelease+0x70>
  38971. }
  38972. #endif
  38973. }
  38974. else {
  38975. if (xSemaphoreGive (hMutex) != pdPASS) {
  38976. 8010bb2: 2300 movs r3, #0
  38977. 8010bb4: 2200 movs r2, #0
  38978. 8010bb6: 2100 movs r1, #0
  38979. 8010bb8: 6938 ldr r0, [r7, #16]
  38980. 8010bba: f000 fe19 bl 80117f0 <xQueueGenericSend>
  38981. 8010bbe: 4603 mov r3, r0
  38982. 8010bc0: 2b01 cmp r3, #1
  38983. 8010bc2: d002 beq.n 8010bca <osMutexRelease+0x70>
  38984. stat = osErrorResource;
  38985. 8010bc4: f06f 0302 mvn.w r3, #2
  38986. 8010bc8: 617b str r3, [r7, #20]
  38987. }
  38988. }
  38989. }
  38990. return (stat);
  38991. 8010bca: 697b ldr r3, [r7, #20]
  38992. }
  38993. 8010bcc: 4618 mov r0, r3
  38994. 8010bce: 3718 adds r7, #24
  38995. 8010bd0: 46bd mov sp, r7
  38996. 8010bd2: bd80 pop {r7, pc}
  38997. 08010bd4 <osSemaphoreNew>:
  38998. }
  38999. #endif /* (configUSE_OS2_MUTEX == 1) */
  39000. /*---------------------------------------------------------------------------*/
  39001. osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr) {
  39002. 8010bd4: b580 push {r7, lr}
  39003. 8010bd6: b08a sub sp, #40 @ 0x28
  39004. 8010bd8: af02 add r7, sp, #8
  39005. 8010bda: 60f8 str r0, [r7, #12]
  39006. 8010bdc: 60b9 str r1, [r7, #8]
  39007. 8010bde: 607a str r2, [r7, #4]
  39008. int32_t mem;
  39009. #if (configQUEUE_REGISTRY_SIZE > 0)
  39010. const char *name;
  39011. #endif
  39012. hSemaphore = NULL;
  39013. 8010be0: 2300 movs r3, #0
  39014. 8010be2: 61fb str r3, [r7, #28]
  39015. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  39016. 8010be4: f3ef 8305 mrs r3, IPSR
  39017. 8010be8: 613b str r3, [r7, #16]
  39018. return(result);
  39019. 8010bea: 693b ldr r3, [r7, #16]
  39020. if (!IS_IRQ() && (max_count > 0U) && (initial_count <= max_count)) {
  39021. 8010bec: 2b00 cmp r3, #0
  39022. 8010bee: d175 bne.n 8010cdc <osSemaphoreNew+0x108>
  39023. 8010bf0: 68fb ldr r3, [r7, #12]
  39024. 8010bf2: 2b00 cmp r3, #0
  39025. 8010bf4: d072 beq.n 8010cdc <osSemaphoreNew+0x108>
  39026. 8010bf6: 68ba ldr r2, [r7, #8]
  39027. 8010bf8: 68fb ldr r3, [r7, #12]
  39028. 8010bfa: 429a cmp r2, r3
  39029. 8010bfc: d86e bhi.n 8010cdc <osSemaphoreNew+0x108>
  39030. mem = -1;
  39031. 8010bfe: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  39032. 8010c02: 61bb str r3, [r7, #24]
  39033. if (attr != NULL) {
  39034. 8010c04: 687b ldr r3, [r7, #4]
  39035. 8010c06: 2b00 cmp r3, #0
  39036. 8010c08: d015 beq.n 8010c36 <osSemaphoreNew+0x62>
  39037. if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticSemaphore_t))) {
  39038. 8010c0a: 687b ldr r3, [r7, #4]
  39039. 8010c0c: 689b ldr r3, [r3, #8]
  39040. 8010c0e: 2b00 cmp r3, #0
  39041. 8010c10: d006 beq.n 8010c20 <osSemaphoreNew+0x4c>
  39042. 8010c12: 687b ldr r3, [r7, #4]
  39043. 8010c14: 68db ldr r3, [r3, #12]
  39044. 8010c16: 2b4f cmp r3, #79 @ 0x4f
  39045. 8010c18: d902 bls.n 8010c20 <osSemaphoreNew+0x4c>
  39046. mem = 1;
  39047. 8010c1a: 2301 movs r3, #1
  39048. 8010c1c: 61bb str r3, [r7, #24]
  39049. 8010c1e: e00c b.n 8010c3a <osSemaphoreNew+0x66>
  39050. }
  39051. else {
  39052. if ((attr->cb_mem == NULL) && (attr->cb_size == 0U)) {
  39053. 8010c20: 687b ldr r3, [r7, #4]
  39054. 8010c22: 689b ldr r3, [r3, #8]
  39055. 8010c24: 2b00 cmp r3, #0
  39056. 8010c26: d108 bne.n 8010c3a <osSemaphoreNew+0x66>
  39057. 8010c28: 687b ldr r3, [r7, #4]
  39058. 8010c2a: 68db ldr r3, [r3, #12]
  39059. 8010c2c: 2b00 cmp r3, #0
  39060. 8010c2e: d104 bne.n 8010c3a <osSemaphoreNew+0x66>
  39061. mem = 0;
  39062. 8010c30: 2300 movs r3, #0
  39063. 8010c32: 61bb str r3, [r7, #24]
  39064. 8010c34: e001 b.n 8010c3a <osSemaphoreNew+0x66>
  39065. }
  39066. }
  39067. }
  39068. else {
  39069. mem = 0;
  39070. 8010c36: 2300 movs r3, #0
  39071. 8010c38: 61bb str r3, [r7, #24]
  39072. }
  39073. if (mem != -1) {
  39074. 8010c3a: 69bb ldr r3, [r7, #24]
  39075. 8010c3c: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  39076. 8010c40: d04c beq.n 8010cdc <osSemaphoreNew+0x108>
  39077. if (max_count == 1U) {
  39078. 8010c42: 68fb ldr r3, [r7, #12]
  39079. 8010c44: 2b01 cmp r3, #1
  39080. 8010c46: d128 bne.n 8010c9a <osSemaphoreNew+0xc6>
  39081. if (mem == 1) {
  39082. 8010c48: 69bb ldr r3, [r7, #24]
  39083. 8010c4a: 2b01 cmp r3, #1
  39084. 8010c4c: d10a bne.n 8010c64 <osSemaphoreNew+0x90>
  39085. #if (configSUPPORT_STATIC_ALLOCATION == 1)
  39086. hSemaphore = xSemaphoreCreateBinaryStatic ((StaticSemaphore_t *)attr->cb_mem);
  39087. 8010c4e: 687b ldr r3, [r7, #4]
  39088. 8010c50: 689b ldr r3, [r3, #8]
  39089. 8010c52: 2203 movs r2, #3
  39090. 8010c54: 9200 str r2, [sp, #0]
  39091. 8010c56: 2200 movs r2, #0
  39092. 8010c58: 2100 movs r1, #0
  39093. 8010c5a: 2001 movs r0, #1
  39094. 8010c5c: f000 fbc6 bl 80113ec <xQueueGenericCreateStatic>
  39095. 8010c60: 61f8 str r0, [r7, #28]
  39096. 8010c62: e005 b.n 8010c70 <osSemaphoreNew+0x9c>
  39097. #endif
  39098. }
  39099. else {
  39100. #if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
  39101. hSemaphore = xSemaphoreCreateBinary();
  39102. 8010c64: 2203 movs r2, #3
  39103. 8010c66: 2100 movs r1, #0
  39104. 8010c68: 2001 movs r0, #1
  39105. 8010c6a: f000 fc3c bl 80114e6 <xQueueGenericCreate>
  39106. 8010c6e: 61f8 str r0, [r7, #28]
  39107. #endif
  39108. }
  39109. if ((hSemaphore != NULL) && (initial_count != 0U)) {
  39110. 8010c70: 69fb ldr r3, [r7, #28]
  39111. 8010c72: 2b00 cmp r3, #0
  39112. 8010c74: d022 beq.n 8010cbc <osSemaphoreNew+0xe8>
  39113. 8010c76: 68bb ldr r3, [r7, #8]
  39114. 8010c78: 2b00 cmp r3, #0
  39115. 8010c7a: d01f beq.n 8010cbc <osSemaphoreNew+0xe8>
  39116. if (xSemaphoreGive (hSemaphore) != pdPASS) {
  39117. 8010c7c: 2300 movs r3, #0
  39118. 8010c7e: 2200 movs r2, #0
  39119. 8010c80: 2100 movs r1, #0
  39120. 8010c82: 69f8 ldr r0, [r7, #28]
  39121. 8010c84: f000 fdb4 bl 80117f0 <xQueueGenericSend>
  39122. 8010c88: 4603 mov r3, r0
  39123. 8010c8a: 2b01 cmp r3, #1
  39124. 8010c8c: d016 beq.n 8010cbc <osSemaphoreNew+0xe8>
  39125. vSemaphoreDelete (hSemaphore);
  39126. 8010c8e: 69f8 ldr r0, [r7, #28]
  39127. 8010c90: f001 fa90 bl 80121b4 <vQueueDelete>
  39128. hSemaphore = NULL;
  39129. 8010c94: 2300 movs r3, #0
  39130. 8010c96: 61fb str r3, [r7, #28]
  39131. 8010c98: e010 b.n 8010cbc <osSemaphoreNew+0xe8>
  39132. }
  39133. }
  39134. }
  39135. else {
  39136. if (mem == 1) {
  39137. 8010c9a: 69bb ldr r3, [r7, #24]
  39138. 8010c9c: 2b01 cmp r3, #1
  39139. 8010c9e: d108 bne.n 8010cb2 <osSemaphoreNew+0xde>
  39140. #if (configSUPPORT_STATIC_ALLOCATION == 1)
  39141. hSemaphore = xSemaphoreCreateCountingStatic (max_count, initial_count, (StaticSemaphore_t *)attr->cb_mem);
  39142. 8010ca0: 687b ldr r3, [r7, #4]
  39143. 8010ca2: 689b ldr r3, [r3, #8]
  39144. 8010ca4: 461a mov r2, r3
  39145. 8010ca6: 68b9 ldr r1, [r7, #8]
  39146. 8010ca8: 68f8 ldr r0, [r7, #12]
  39147. 8010caa: f000 fd33 bl 8011714 <xQueueCreateCountingSemaphoreStatic>
  39148. 8010cae: 61f8 str r0, [r7, #28]
  39149. 8010cb0: e004 b.n 8010cbc <osSemaphoreNew+0xe8>
  39150. #endif
  39151. }
  39152. else {
  39153. #if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
  39154. hSemaphore = xSemaphoreCreateCounting (max_count, initial_count);
  39155. 8010cb2: 68b9 ldr r1, [r7, #8]
  39156. 8010cb4: 68f8 ldr r0, [r7, #12]
  39157. 8010cb6: f000 fd66 bl 8011786 <xQueueCreateCountingSemaphore>
  39158. 8010cba: 61f8 str r0, [r7, #28]
  39159. #endif
  39160. }
  39161. }
  39162. #if (configQUEUE_REGISTRY_SIZE > 0)
  39163. if (hSemaphore != NULL) {
  39164. 8010cbc: 69fb ldr r3, [r7, #28]
  39165. 8010cbe: 2b00 cmp r3, #0
  39166. 8010cc0: d00c beq.n 8010cdc <osSemaphoreNew+0x108>
  39167. if (attr != NULL) {
  39168. 8010cc2: 687b ldr r3, [r7, #4]
  39169. 8010cc4: 2b00 cmp r3, #0
  39170. 8010cc6: d003 beq.n 8010cd0 <osSemaphoreNew+0xfc>
  39171. name = attr->name;
  39172. 8010cc8: 687b ldr r3, [r7, #4]
  39173. 8010cca: 681b ldr r3, [r3, #0]
  39174. 8010ccc: 617b str r3, [r7, #20]
  39175. 8010cce: e001 b.n 8010cd4 <osSemaphoreNew+0x100>
  39176. } else {
  39177. name = NULL;
  39178. 8010cd0: 2300 movs r3, #0
  39179. 8010cd2: 617b str r3, [r7, #20]
  39180. }
  39181. vQueueAddToRegistry (hSemaphore, name);
  39182. 8010cd4: 6979 ldr r1, [r7, #20]
  39183. 8010cd6: 69f8 ldr r0, [r7, #28]
  39184. 8010cd8: f001 fbb8 bl 801244c <vQueueAddToRegistry>
  39185. }
  39186. #endif
  39187. }
  39188. }
  39189. return ((osSemaphoreId_t)hSemaphore);
  39190. 8010cdc: 69fb ldr r3, [r7, #28]
  39191. }
  39192. 8010cde: 4618 mov r0, r3
  39193. 8010ce0: 3720 adds r7, #32
  39194. 8010ce2: 46bd mov sp, r7
  39195. 8010ce4: bd80 pop {r7, pc}
  39196. ...
  39197. 08010ce8 <osSemaphoreAcquire>:
  39198. osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout) {
  39199. 8010ce8: b580 push {r7, lr}
  39200. 8010cea: b086 sub sp, #24
  39201. 8010cec: af00 add r7, sp, #0
  39202. 8010cee: 6078 str r0, [r7, #4]
  39203. 8010cf0: 6039 str r1, [r7, #0]
  39204. SemaphoreHandle_t hSemaphore = (SemaphoreHandle_t)semaphore_id;
  39205. 8010cf2: 687b ldr r3, [r7, #4]
  39206. 8010cf4: 613b str r3, [r7, #16]
  39207. osStatus_t stat;
  39208. BaseType_t yield;
  39209. stat = osOK;
  39210. 8010cf6: 2300 movs r3, #0
  39211. 8010cf8: 617b str r3, [r7, #20]
  39212. if (hSemaphore == NULL) {
  39213. 8010cfa: 693b ldr r3, [r7, #16]
  39214. 8010cfc: 2b00 cmp r3, #0
  39215. 8010cfe: d103 bne.n 8010d08 <osSemaphoreAcquire+0x20>
  39216. stat = osErrorParameter;
  39217. 8010d00: f06f 0303 mvn.w r3, #3
  39218. 8010d04: 617b str r3, [r7, #20]
  39219. 8010d06: e039 b.n 8010d7c <osSemaphoreAcquire+0x94>
  39220. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  39221. 8010d08: f3ef 8305 mrs r3, IPSR
  39222. 8010d0c: 60fb str r3, [r7, #12]
  39223. return(result);
  39224. 8010d0e: 68fb ldr r3, [r7, #12]
  39225. }
  39226. else if (IS_IRQ()) {
  39227. 8010d10: 2b00 cmp r3, #0
  39228. 8010d12: d022 beq.n 8010d5a <osSemaphoreAcquire+0x72>
  39229. if (timeout != 0U) {
  39230. 8010d14: 683b ldr r3, [r7, #0]
  39231. 8010d16: 2b00 cmp r3, #0
  39232. 8010d18: d003 beq.n 8010d22 <osSemaphoreAcquire+0x3a>
  39233. stat = osErrorParameter;
  39234. 8010d1a: f06f 0303 mvn.w r3, #3
  39235. 8010d1e: 617b str r3, [r7, #20]
  39236. 8010d20: e02c b.n 8010d7c <osSemaphoreAcquire+0x94>
  39237. }
  39238. else {
  39239. yield = pdFALSE;
  39240. 8010d22: 2300 movs r3, #0
  39241. 8010d24: 60bb str r3, [r7, #8]
  39242. if (xSemaphoreTakeFromISR (hSemaphore, &yield) != pdPASS) {
  39243. 8010d26: f107 0308 add.w r3, r7, #8
  39244. 8010d2a: 461a mov r2, r3
  39245. 8010d2c: 2100 movs r1, #0
  39246. 8010d2e: 6938 ldr r0, [r7, #16]
  39247. 8010d30: f001 f980 bl 8012034 <xQueueReceiveFromISR>
  39248. 8010d34: 4603 mov r3, r0
  39249. 8010d36: 2b01 cmp r3, #1
  39250. 8010d38: d003 beq.n 8010d42 <osSemaphoreAcquire+0x5a>
  39251. stat = osErrorResource;
  39252. 8010d3a: f06f 0302 mvn.w r3, #2
  39253. 8010d3e: 617b str r3, [r7, #20]
  39254. 8010d40: e01c b.n 8010d7c <osSemaphoreAcquire+0x94>
  39255. } else {
  39256. portYIELD_FROM_ISR (yield);
  39257. 8010d42: 68bb ldr r3, [r7, #8]
  39258. 8010d44: 2b00 cmp r3, #0
  39259. 8010d46: d019 beq.n 8010d7c <osSemaphoreAcquire+0x94>
  39260. 8010d48: 4b0f ldr r3, [pc, #60] @ (8010d88 <osSemaphoreAcquire+0xa0>)
  39261. 8010d4a: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  39262. 8010d4e: 601a str r2, [r3, #0]
  39263. 8010d50: f3bf 8f4f dsb sy
  39264. 8010d54: f3bf 8f6f isb sy
  39265. 8010d58: e010 b.n 8010d7c <osSemaphoreAcquire+0x94>
  39266. }
  39267. }
  39268. }
  39269. else {
  39270. if (xSemaphoreTake (hSemaphore, (TickType_t)timeout) != pdPASS) {
  39271. 8010d5a: 6839 ldr r1, [r7, #0]
  39272. 8010d5c: 6938 ldr r0, [r7, #16]
  39273. 8010d5e: f001 f859 bl 8011e14 <xQueueSemaphoreTake>
  39274. 8010d62: 4603 mov r3, r0
  39275. 8010d64: 2b01 cmp r3, #1
  39276. 8010d66: d009 beq.n 8010d7c <osSemaphoreAcquire+0x94>
  39277. if (timeout != 0U) {
  39278. 8010d68: 683b ldr r3, [r7, #0]
  39279. 8010d6a: 2b00 cmp r3, #0
  39280. 8010d6c: d003 beq.n 8010d76 <osSemaphoreAcquire+0x8e>
  39281. stat = osErrorTimeout;
  39282. 8010d6e: f06f 0301 mvn.w r3, #1
  39283. 8010d72: 617b str r3, [r7, #20]
  39284. 8010d74: e002 b.n 8010d7c <osSemaphoreAcquire+0x94>
  39285. } else {
  39286. stat = osErrorResource;
  39287. 8010d76: f06f 0302 mvn.w r3, #2
  39288. 8010d7a: 617b str r3, [r7, #20]
  39289. }
  39290. }
  39291. }
  39292. return (stat);
  39293. 8010d7c: 697b ldr r3, [r7, #20]
  39294. }
  39295. 8010d7e: 4618 mov r0, r3
  39296. 8010d80: 3718 adds r7, #24
  39297. 8010d82: 46bd mov sp, r7
  39298. 8010d84: bd80 pop {r7, pc}
  39299. 8010d86: bf00 nop
  39300. 8010d88: e000ed04 .word 0xe000ed04
  39301. 08010d8c <osSemaphoreRelease>:
  39302. osStatus_t osSemaphoreRelease (osSemaphoreId_t semaphore_id) {
  39303. 8010d8c: b580 push {r7, lr}
  39304. 8010d8e: b086 sub sp, #24
  39305. 8010d90: af00 add r7, sp, #0
  39306. 8010d92: 6078 str r0, [r7, #4]
  39307. SemaphoreHandle_t hSemaphore = (SemaphoreHandle_t)semaphore_id;
  39308. 8010d94: 687b ldr r3, [r7, #4]
  39309. 8010d96: 613b str r3, [r7, #16]
  39310. osStatus_t stat;
  39311. BaseType_t yield;
  39312. stat = osOK;
  39313. 8010d98: 2300 movs r3, #0
  39314. 8010d9a: 617b str r3, [r7, #20]
  39315. if (hSemaphore == NULL) {
  39316. 8010d9c: 693b ldr r3, [r7, #16]
  39317. 8010d9e: 2b00 cmp r3, #0
  39318. 8010da0: d103 bne.n 8010daa <osSemaphoreRelease+0x1e>
  39319. stat = osErrorParameter;
  39320. 8010da2: f06f 0303 mvn.w r3, #3
  39321. 8010da6: 617b str r3, [r7, #20]
  39322. 8010da8: e02c b.n 8010e04 <osSemaphoreRelease+0x78>
  39323. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  39324. 8010daa: f3ef 8305 mrs r3, IPSR
  39325. 8010dae: 60fb str r3, [r7, #12]
  39326. return(result);
  39327. 8010db0: 68fb ldr r3, [r7, #12]
  39328. }
  39329. else if (IS_IRQ()) {
  39330. 8010db2: 2b00 cmp r3, #0
  39331. 8010db4: d01a beq.n 8010dec <osSemaphoreRelease+0x60>
  39332. yield = pdFALSE;
  39333. 8010db6: 2300 movs r3, #0
  39334. 8010db8: 60bb str r3, [r7, #8]
  39335. if (xSemaphoreGiveFromISR (hSemaphore, &yield) != pdTRUE) {
  39336. 8010dba: f107 0308 add.w r3, r7, #8
  39337. 8010dbe: 4619 mov r1, r3
  39338. 8010dc0: 6938 ldr r0, [r7, #16]
  39339. 8010dc2: f000 feb5 bl 8011b30 <xQueueGiveFromISR>
  39340. 8010dc6: 4603 mov r3, r0
  39341. 8010dc8: 2b01 cmp r3, #1
  39342. 8010dca: d003 beq.n 8010dd4 <osSemaphoreRelease+0x48>
  39343. stat = osErrorResource;
  39344. 8010dcc: f06f 0302 mvn.w r3, #2
  39345. 8010dd0: 617b str r3, [r7, #20]
  39346. 8010dd2: e017 b.n 8010e04 <osSemaphoreRelease+0x78>
  39347. } else {
  39348. portYIELD_FROM_ISR (yield);
  39349. 8010dd4: 68bb ldr r3, [r7, #8]
  39350. 8010dd6: 2b00 cmp r3, #0
  39351. 8010dd8: d014 beq.n 8010e04 <osSemaphoreRelease+0x78>
  39352. 8010dda: 4b0d ldr r3, [pc, #52] @ (8010e10 <osSemaphoreRelease+0x84>)
  39353. 8010ddc: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  39354. 8010de0: 601a str r2, [r3, #0]
  39355. 8010de2: f3bf 8f4f dsb sy
  39356. 8010de6: f3bf 8f6f isb sy
  39357. 8010dea: e00b b.n 8010e04 <osSemaphoreRelease+0x78>
  39358. }
  39359. }
  39360. else {
  39361. if (xSemaphoreGive (hSemaphore) != pdPASS) {
  39362. 8010dec: 2300 movs r3, #0
  39363. 8010dee: 2200 movs r2, #0
  39364. 8010df0: 2100 movs r1, #0
  39365. 8010df2: 6938 ldr r0, [r7, #16]
  39366. 8010df4: f000 fcfc bl 80117f0 <xQueueGenericSend>
  39367. 8010df8: 4603 mov r3, r0
  39368. 8010dfa: 2b01 cmp r3, #1
  39369. 8010dfc: d002 beq.n 8010e04 <osSemaphoreRelease+0x78>
  39370. stat = osErrorResource;
  39371. 8010dfe: f06f 0302 mvn.w r3, #2
  39372. 8010e02: 617b str r3, [r7, #20]
  39373. }
  39374. }
  39375. return (stat);
  39376. 8010e04: 697b ldr r3, [r7, #20]
  39377. }
  39378. 8010e06: 4618 mov r0, r3
  39379. 8010e08: 3718 adds r7, #24
  39380. 8010e0a: 46bd mov sp, r7
  39381. 8010e0c: bd80 pop {r7, pc}
  39382. 8010e0e: bf00 nop
  39383. 8010e10: e000ed04 .word 0xe000ed04
  39384. 08010e14 <osSemaphoreDelete>:
  39385. }
  39386. return (count);
  39387. }
  39388. osStatus_t osSemaphoreDelete (osSemaphoreId_t semaphore_id) {
  39389. 8010e14: b580 push {r7, lr}
  39390. 8010e16: b086 sub sp, #24
  39391. 8010e18: af00 add r7, sp, #0
  39392. 8010e1a: 6078 str r0, [r7, #4]
  39393. SemaphoreHandle_t hSemaphore = (SemaphoreHandle_t)semaphore_id;
  39394. 8010e1c: 687b ldr r3, [r7, #4]
  39395. 8010e1e: 613b str r3, [r7, #16]
  39396. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  39397. 8010e20: f3ef 8305 mrs r3, IPSR
  39398. 8010e24: 60fb str r3, [r7, #12]
  39399. return(result);
  39400. 8010e26: 68fb ldr r3, [r7, #12]
  39401. osStatus_t stat;
  39402. #ifndef USE_FreeRTOS_HEAP_1
  39403. if (IS_IRQ()) {
  39404. 8010e28: 2b00 cmp r3, #0
  39405. 8010e2a: d003 beq.n 8010e34 <osSemaphoreDelete+0x20>
  39406. stat = osErrorISR;
  39407. 8010e2c: f06f 0305 mvn.w r3, #5
  39408. 8010e30: 617b str r3, [r7, #20]
  39409. 8010e32: e00e b.n 8010e52 <osSemaphoreDelete+0x3e>
  39410. }
  39411. else if (hSemaphore == NULL) {
  39412. 8010e34: 693b ldr r3, [r7, #16]
  39413. 8010e36: 2b00 cmp r3, #0
  39414. 8010e38: d103 bne.n 8010e42 <osSemaphoreDelete+0x2e>
  39415. stat = osErrorParameter;
  39416. 8010e3a: f06f 0303 mvn.w r3, #3
  39417. 8010e3e: 617b str r3, [r7, #20]
  39418. 8010e40: e007 b.n 8010e52 <osSemaphoreDelete+0x3e>
  39419. }
  39420. else {
  39421. #if (configQUEUE_REGISTRY_SIZE > 0)
  39422. vQueueUnregisterQueue (hSemaphore);
  39423. 8010e42: 6938 ldr r0, [r7, #16]
  39424. 8010e44: f001 fb2c bl 80124a0 <vQueueUnregisterQueue>
  39425. #endif
  39426. stat = osOK;
  39427. 8010e48: 2300 movs r3, #0
  39428. 8010e4a: 617b str r3, [r7, #20]
  39429. vSemaphoreDelete (hSemaphore);
  39430. 8010e4c: 6938 ldr r0, [r7, #16]
  39431. 8010e4e: f001 f9b1 bl 80121b4 <vQueueDelete>
  39432. }
  39433. #else
  39434. stat = osError;
  39435. #endif
  39436. return (stat);
  39437. 8010e52: 697b ldr r3, [r7, #20]
  39438. }
  39439. 8010e54: 4618 mov r0, r3
  39440. 8010e56: 3718 adds r7, #24
  39441. 8010e58: 46bd mov sp, r7
  39442. 8010e5a: bd80 pop {r7, pc}
  39443. 08010e5c <osMessageQueueNew>:
  39444. /*---------------------------------------------------------------------------*/
  39445. osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr) {
  39446. 8010e5c: b580 push {r7, lr}
  39447. 8010e5e: b08a sub sp, #40 @ 0x28
  39448. 8010e60: af02 add r7, sp, #8
  39449. 8010e62: 60f8 str r0, [r7, #12]
  39450. 8010e64: 60b9 str r1, [r7, #8]
  39451. 8010e66: 607a str r2, [r7, #4]
  39452. int32_t mem;
  39453. #if (configQUEUE_REGISTRY_SIZE > 0)
  39454. const char *name;
  39455. #endif
  39456. hQueue = NULL;
  39457. 8010e68: 2300 movs r3, #0
  39458. 8010e6a: 61fb str r3, [r7, #28]
  39459. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  39460. 8010e6c: f3ef 8305 mrs r3, IPSR
  39461. 8010e70: 613b str r3, [r7, #16]
  39462. return(result);
  39463. 8010e72: 693b ldr r3, [r7, #16]
  39464. if (!IS_IRQ() && (msg_count > 0U) && (msg_size > 0U)) {
  39465. 8010e74: 2b00 cmp r3, #0
  39466. 8010e76: d15f bne.n 8010f38 <osMessageQueueNew+0xdc>
  39467. 8010e78: 68fb ldr r3, [r7, #12]
  39468. 8010e7a: 2b00 cmp r3, #0
  39469. 8010e7c: d05c beq.n 8010f38 <osMessageQueueNew+0xdc>
  39470. 8010e7e: 68bb ldr r3, [r7, #8]
  39471. 8010e80: 2b00 cmp r3, #0
  39472. 8010e82: d059 beq.n 8010f38 <osMessageQueueNew+0xdc>
  39473. mem = -1;
  39474. 8010e84: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  39475. 8010e88: 61bb str r3, [r7, #24]
  39476. if (attr != NULL) {
  39477. 8010e8a: 687b ldr r3, [r7, #4]
  39478. 8010e8c: 2b00 cmp r3, #0
  39479. 8010e8e: d029 beq.n 8010ee4 <osMessageQueueNew+0x88>
  39480. if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticQueue_t)) &&
  39481. 8010e90: 687b ldr r3, [r7, #4]
  39482. 8010e92: 689b ldr r3, [r3, #8]
  39483. 8010e94: 2b00 cmp r3, #0
  39484. 8010e96: d012 beq.n 8010ebe <osMessageQueueNew+0x62>
  39485. 8010e98: 687b ldr r3, [r7, #4]
  39486. 8010e9a: 68db ldr r3, [r3, #12]
  39487. 8010e9c: 2b4f cmp r3, #79 @ 0x4f
  39488. 8010e9e: d90e bls.n 8010ebe <osMessageQueueNew+0x62>
  39489. (attr->mq_mem != NULL) && (attr->mq_size >= (msg_count * msg_size))) {
  39490. 8010ea0: 687b ldr r3, [r7, #4]
  39491. 8010ea2: 691b ldr r3, [r3, #16]
  39492. if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticQueue_t)) &&
  39493. 8010ea4: 2b00 cmp r3, #0
  39494. 8010ea6: d00a beq.n 8010ebe <osMessageQueueNew+0x62>
  39495. (attr->mq_mem != NULL) && (attr->mq_size >= (msg_count * msg_size))) {
  39496. 8010ea8: 687b ldr r3, [r7, #4]
  39497. 8010eaa: 695a ldr r2, [r3, #20]
  39498. 8010eac: 68fb ldr r3, [r7, #12]
  39499. 8010eae: 68b9 ldr r1, [r7, #8]
  39500. 8010eb0: fb01 f303 mul.w r3, r1, r3
  39501. 8010eb4: 429a cmp r2, r3
  39502. 8010eb6: d302 bcc.n 8010ebe <osMessageQueueNew+0x62>
  39503. mem = 1;
  39504. 8010eb8: 2301 movs r3, #1
  39505. 8010eba: 61bb str r3, [r7, #24]
  39506. 8010ebc: e014 b.n 8010ee8 <osMessageQueueNew+0x8c>
  39507. }
  39508. else {
  39509. if ((attr->cb_mem == NULL) && (attr->cb_size == 0U) &&
  39510. 8010ebe: 687b ldr r3, [r7, #4]
  39511. 8010ec0: 689b ldr r3, [r3, #8]
  39512. 8010ec2: 2b00 cmp r3, #0
  39513. 8010ec4: d110 bne.n 8010ee8 <osMessageQueueNew+0x8c>
  39514. 8010ec6: 687b ldr r3, [r7, #4]
  39515. 8010ec8: 68db ldr r3, [r3, #12]
  39516. 8010eca: 2b00 cmp r3, #0
  39517. 8010ecc: d10c bne.n 8010ee8 <osMessageQueueNew+0x8c>
  39518. (attr->mq_mem == NULL) && (attr->mq_size == 0U)) {
  39519. 8010ece: 687b ldr r3, [r7, #4]
  39520. 8010ed0: 691b ldr r3, [r3, #16]
  39521. if ((attr->cb_mem == NULL) && (attr->cb_size == 0U) &&
  39522. 8010ed2: 2b00 cmp r3, #0
  39523. 8010ed4: d108 bne.n 8010ee8 <osMessageQueueNew+0x8c>
  39524. (attr->mq_mem == NULL) && (attr->mq_size == 0U)) {
  39525. 8010ed6: 687b ldr r3, [r7, #4]
  39526. 8010ed8: 695b ldr r3, [r3, #20]
  39527. 8010eda: 2b00 cmp r3, #0
  39528. 8010edc: d104 bne.n 8010ee8 <osMessageQueueNew+0x8c>
  39529. mem = 0;
  39530. 8010ede: 2300 movs r3, #0
  39531. 8010ee0: 61bb str r3, [r7, #24]
  39532. 8010ee2: e001 b.n 8010ee8 <osMessageQueueNew+0x8c>
  39533. }
  39534. }
  39535. }
  39536. else {
  39537. mem = 0;
  39538. 8010ee4: 2300 movs r3, #0
  39539. 8010ee6: 61bb str r3, [r7, #24]
  39540. }
  39541. if (mem == 1) {
  39542. 8010ee8: 69bb ldr r3, [r7, #24]
  39543. 8010eea: 2b01 cmp r3, #1
  39544. 8010eec: d10b bne.n 8010f06 <osMessageQueueNew+0xaa>
  39545. #if (configSUPPORT_STATIC_ALLOCATION == 1)
  39546. hQueue = xQueueCreateStatic (msg_count, msg_size, attr->mq_mem, attr->cb_mem);
  39547. 8010eee: 687b ldr r3, [r7, #4]
  39548. 8010ef0: 691a ldr r2, [r3, #16]
  39549. 8010ef2: 687b ldr r3, [r7, #4]
  39550. 8010ef4: 689b ldr r3, [r3, #8]
  39551. 8010ef6: 2100 movs r1, #0
  39552. 8010ef8: 9100 str r1, [sp, #0]
  39553. 8010efa: 68b9 ldr r1, [r7, #8]
  39554. 8010efc: 68f8 ldr r0, [r7, #12]
  39555. 8010efe: f000 fa75 bl 80113ec <xQueueGenericCreateStatic>
  39556. 8010f02: 61f8 str r0, [r7, #28]
  39557. 8010f04: e008 b.n 8010f18 <osMessageQueueNew+0xbc>
  39558. #endif
  39559. }
  39560. else {
  39561. if (mem == 0) {
  39562. 8010f06: 69bb ldr r3, [r7, #24]
  39563. 8010f08: 2b00 cmp r3, #0
  39564. 8010f0a: d105 bne.n 8010f18 <osMessageQueueNew+0xbc>
  39565. #if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
  39566. hQueue = xQueueCreate (msg_count, msg_size);
  39567. 8010f0c: 2200 movs r2, #0
  39568. 8010f0e: 68b9 ldr r1, [r7, #8]
  39569. 8010f10: 68f8 ldr r0, [r7, #12]
  39570. 8010f12: f000 fae8 bl 80114e6 <xQueueGenericCreate>
  39571. 8010f16: 61f8 str r0, [r7, #28]
  39572. #endif
  39573. }
  39574. }
  39575. #if (configQUEUE_REGISTRY_SIZE > 0)
  39576. if (hQueue != NULL) {
  39577. 8010f18: 69fb ldr r3, [r7, #28]
  39578. 8010f1a: 2b00 cmp r3, #0
  39579. 8010f1c: d00c beq.n 8010f38 <osMessageQueueNew+0xdc>
  39580. if (attr != NULL) {
  39581. 8010f1e: 687b ldr r3, [r7, #4]
  39582. 8010f20: 2b00 cmp r3, #0
  39583. 8010f22: d003 beq.n 8010f2c <osMessageQueueNew+0xd0>
  39584. name = attr->name;
  39585. 8010f24: 687b ldr r3, [r7, #4]
  39586. 8010f26: 681b ldr r3, [r3, #0]
  39587. 8010f28: 617b str r3, [r7, #20]
  39588. 8010f2a: e001 b.n 8010f30 <osMessageQueueNew+0xd4>
  39589. } else {
  39590. name = NULL;
  39591. 8010f2c: 2300 movs r3, #0
  39592. 8010f2e: 617b str r3, [r7, #20]
  39593. }
  39594. vQueueAddToRegistry (hQueue, name);
  39595. 8010f30: 6979 ldr r1, [r7, #20]
  39596. 8010f32: 69f8 ldr r0, [r7, #28]
  39597. 8010f34: f001 fa8a bl 801244c <vQueueAddToRegistry>
  39598. }
  39599. #endif
  39600. }
  39601. return ((osMessageQueueId_t)hQueue);
  39602. 8010f38: 69fb ldr r3, [r7, #28]
  39603. }
  39604. 8010f3a: 4618 mov r0, r3
  39605. 8010f3c: 3720 adds r7, #32
  39606. 8010f3e: 46bd mov sp, r7
  39607. 8010f40: bd80 pop {r7, pc}
  39608. ...
  39609. 08010f44 <osMessageQueuePut>:
  39610. osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout) {
  39611. 8010f44: b580 push {r7, lr}
  39612. 8010f46: b088 sub sp, #32
  39613. 8010f48: af00 add r7, sp, #0
  39614. 8010f4a: 60f8 str r0, [r7, #12]
  39615. 8010f4c: 60b9 str r1, [r7, #8]
  39616. 8010f4e: 603b str r3, [r7, #0]
  39617. 8010f50: 4613 mov r3, r2
  39618. 8010f52: 71fb strb r3, [r7, #7]
  39619. QueueHandle_t hQueue = (QueueHandle_t)mq_id;
  39620. 8010f54: 68fb ldr r3, [r7, #12]
  39621. 8010f56: 61bb str r3, [r7, #24]
  39622. osStatus_t stat;
  39623. BaseType_t yield;
  39624. (void)msg_prio; /* Message priority is ignored */
  39625. stat = osOK;
  39626. 8010f58: 2300 movs r3, #0
  39627. 8010f5a: 61fb str r3, [r7, #28]
  39628. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  39629. 8010f5c: f3ef 8305 mrs r3, IPSR
  39630. 8010f60: 617b str r3, [r7, #20]
  39631. return(result);
  39632. 8010f62: 697b ldr r3, [r7, #20]
  39633. if (IS_IRQ()) {
  39634. 8010f64: 2b00 cmp r3, #0
  39635. 8010f66: d028 beq.n 8010fba <osMessageQueuePut+0x76>
  39636. if ((hQueue == NULL) || (msg_ptr == NULL) || (timeout != 0U)) {
  39637. 8010f68: 69bb ldr r3, [r7, #24]
  39638. 8010f6a: 2b00 cmp r3, #0
  39639. 8010f6c: d005 beq.n 8010f7a <osMessageQueuePut+0x36>
  39640. 8010f6e: 68bb ldr r3, [r7, #8]
  39641. 8010f70: 2b00 cmp r3, #0
  39642. 8010f72: d002 beq.n 8010f7a <osMessageQueuePut+0x36>
  39643. 8010f74: 683b ldr r3, [r7, #0]
  39644. 8010f76: 2b00 cmp r3, #0
  39645. 8010f78: d003 beq.n 8010f82 <osMessageQueuePut+0x3e>
  39646. stat = osErrorParameter;
  39647. 8010f7a: f06f 0303 mvn.w r3, #3
  39648. 8010f7e: 61fb str r3, [r7, #28]
  39649. 8010f80: e038 b.n 8010ff4 <osMessageQueuePut+0xb0>
  39650. }
  39651. else {
  39652. yield = pdFALSE;
  39653. 8010f82: 2300 movs r3, #0
  39654. 8010f84: 613b str r3, [r7, #16]
  39655. if (xQueueSendToBackFromISR (hQueue, msg_ptr, &yield) != pdTRUE) {
  39656. 8010f86: f107 0210 add.w r2, r7, #16
  39657. 8010f8a: 2300 movs r3, #0
  39658. 8010f8c: 68b9 ldr r1, [r7, #8]
  39659. 8010f8e: 69b8 ldr r0, [r7, #24]
  39660. 8010f90: f000 fd30 bl 80119f4 <xQueueGenericSendFromISR>
  39661. 8010f94: 4603 mov r3, r0
  39662. 8010f96: 2b01 cmp r3, #1
  39663. 8010f98: d003 beq.n 8010fa2 <osMessageQueuePut+0x5e>
  39664. stat = osErrorResource;
  39665. 8010f9a: f06f 0302 mvn.w r3, #2
  39666. 8010f9e: 61fb str r3, [r7, #28]
  39667. 8010fa0: e028 b.n 8010ff4 <osMessageQueuePut+0xb0>
  39668. } else {
  39669. portYIELD_FROM_ISR (yield);
  39670. 8010fa2: 693b ldr r3, [r7, #16]
  39671. 8010fa4: 2b00 cmp r3, #0
  39672. 8010fa6: d025 beq.n 8010ff4 <osMessageQueuePut+0xb0>
  39673. 8010fa8: 4b15 ldr r3, [pc, #84] @ (8011000 <osMessageQueuePut+0xbc>)
  39674. 8010faa: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  39675. 8010fae: 601a str r2, [r3, #0]
  39676. 8010fb0: f3bf 8f4f dsb sy
  39677. 8010fb4: f3bf 8f6f isb sy
  39678. 8010fb8: e01c b.n 8010ff4 <osMessageQueuePut+0xb0>
  39679. }
  39680. }
  39681. }
  39682. else {
  39683. if ((hQueue == NULL) || (msg_ptr == NULL)) {
  39684. 8010fba: 69bb ldr r3, [r7, #24]
  39685. 8010fbc: 2b00 cmp r3, #0
  39686. 8010fbe: d002 beq.n 8010fc6 <osMessageQueuePut+0x82>
  39687. 8010fc0: 68bb ldr r3, [r7, #8]
  39688. 8010fc2: 2b00 cmp r3, #0
  39689. 8010fc4: d103 bne.n 8010fce <osMessageQueuePut+0x8a>
  39690. stat = osErrorParameter;
  39691. 8010fc6: f06f 0303 mvn.w r3, #3
  39692. 8010fca: 61fb str r3, [r7, #28]
  39693. 8010fcc: e012 b.n 8010ff4 <osMessageQueuePut+0xb0>
  39694. }
  39695. else {
  39696. if (xQueueSendToBack (hQueue, msg_ptr, (TickType_t)timeout) != pdPASS) {
  39697. 8010fce: 2300 movs r3, #0
  39698. 8010fd0: 683a ldr r2, [r7, #0]
  39699. 8010fd2: 68b9 ldr r1, [r7, #8]
  39700. 8010fd4: 69b8 ldr r0, [r7, #24]
  39701. 8010fd6: f000 fc0b bl 80117f0 <xQueueGenericSend>
  39702. 8010fda: 4603 mov r3, r0
  39703. 8010fdc: 2b01 cmp r3, #1
  39704. 8010fde: d009 beq.n 8010ff4 <osMessageQueuePut+0xb0>
  39705. if (timeout != 0U) {
  39706. 8010fe0: 683b ldr r3, [r7, #0]
  39707. 8010fe2: 2b00 cmp r3, #0
  39708. 8010fe4: d003 beq.n 8010fee <osMessageQueuePut+0xaa>
  39709. stat = osErrorTimeout;
  39710. 8010fe6: f06f 0301 mvn.w r3, #1
  39711. 8010fea: 61fb str r3, [r7, #28]
  39712. 8010fec: e002 b.n 8010ff4 <osMessageQueuePut+0xb0>
  39713. } else {
  39714. stat = osErrorResource;
  39715. 8010fee: f06f 0302 mvn.w r3, #2
  39716. 8010ff2: 61fb str r3, [r7, #28]
  39717. }
  39718. }
  39719. }
  39720. }
  39721. return (stat);
  39722. 8010ff4: 69fb ldr r3, [r7, #28]
  39723. }
  39724. 8010ff6: 4618 mov r0, r3
  39725. 8010ff8: 3720 adds r7, #32
  39726. 8010ffa: 46bd mov sp, r7
  39727. 8010ffc: bd80 pop {r7, pc}
  39728. 8010ffe: bf00 nop
  39729. 8011000: e000ed04 .word 0xe000ed04
  39730. 08011004 <osMessageQueueGet>:
  39731. osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout) {
  39732. 8011004: b580 push {r7, lr}
  39733. 8011006: b088 sub sp, #32
  39734. 8011008: af00 add r7, sp, #0
  39735. 801100a: 60f8 str r0, [r7, #12]
  39736. 801100c: 60b9 str r1, [r7, #8]
  39737. 801100e: 607a str r2, [r7, #4]
  39738. 8011010: 603b str r3, [r7, #0]
  39739. QueueHandle_t hQueue = (QueueHandle_t)mq_id;
  39740. 8011012: 68fb ldr r3, [r7, #12]
  39741. 8011014: 61bb str r3, [r7, #24]
  39742. osStatus_t stat;
  39743. BaseType_t yield;
  39744. (void)msg_prio; /* Message priority is ignored */
  39745. stat = osOK;
  39746. 8011016: 2300 movs r3, #0
  39747. 8011018: 61fb str r3, [r7, #28]
  39748. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  39749. 801101a: f3ef 8305 mrs r3, IPSR
  39750. 801101e: 617b str r3, [r7, #20]
  39751. return(result);
  39752. 8011020: 697b ldr r3, [r7, #20]
  39753. if (IS_IRQ()) {
  39754. 8011022: 2b00 cmp r3, #0
  39755. 8011024: d028 beq.n 8011078 <osMessageQueueGet+0x74>
  39756. if ((hQueue == NULL) || (msg_ptr == NULL) || (timeout != 0U)) {
  39757. 8011026: 69bb ldr r3, [r7, #24]
  39758. 8011028: 2b00 cmp r3, #0
  39759. 801102a: d005 beq.n 8011038 <osMessageQueueGet+0x34>
  39760. 801102c: 68bb ldr r3, [r7, #8]
  39761. 801102e: 2b00 cmp r3, #0
  39762. 8011030: d002 beq.n 8011038 <osMessageQueueGet+0x34>
  39763. 8011032: 683b ldr r3, [r7, #0]
  39764. 8011034: 2b00 cmp r3, #0
  39765. 8011036: d003 beq.n 8011040 <osMessageQueueGet+0x3c>
  39766. stat = osErrorParameter;
  39767. 8011038: f06f 0303 mvn.w r3, #3
  39768. 801103c: 61fb str r3, [r7, #28]
  39769. 801103e: e037 b.n 80110b0 <osMessageQueueGet+0xac>
  39770. }
  39771. else {
  39772. yield = pdFALSE;
  39773. 8011040: 2300 movs r3, #0
  39774. 8011042: 613b str r3, [r7, #16]
  39775. if (xQueueReceiveFromISR (hQueue, msg_ptr, &yield) != pdPASS) {
  39776. 8011044: f107 0310 add.w r3, r7, #16
  39777. 8011048: 461a mov r2, r3
  39778. 801104a: 68b9 ldr r1, [r7, #8]
  39779. 801104c: 69b8 ldr r0, [r7, #24]
  39780. 801104e: f000 fff1 bl 8012034 <xQueueReceiveFromISR>
  39781. 8011052: 4603 mov r3, r0
  39782. 8011054: 2b01 cmp r3, #1
  39783. 8011056: d003 beq.n 8011060 <osMessageQueueGet+0x5c>
  39784. stat = osErrorResource;
  39785. 8011058: f06f 0302 mvn.w r3, #2
  39786. 801105c: 61fb str r3, [r7, #28]
  39787. 801105e: e027 b.n 80110b0 <osMessageQueueGet+0xac>
  39788. } else {
  39789. portYIELD_FROM_ISR (yield);
  39790. 8011060: 693b ldr r3, [r7, #16]
  39791. 8011062: 2b00 cmp r3, #0
  39792. 8011064: d024 beq.n 80110b0 <osMessageQueueGet+0xac>
  39793. 8011066: 4b15 ldr r3, [pc, #84] @ (80110bc <osMessageQueueGet+0xb8>)
  39794. 8011068: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  39795. 801106c: 601a str r2, [r3, #0]
  39796. 801106e: f3bf 8f4f dsb sy
  39797. 8011072: f3bf 8f6f isb sy
  39798. 8011076: e01b b.n 80110b0 <osMessageQueueGet+0xac>
  39799. }
  39800. }
  39801. }
  39802. else {
  39803. if ((hQueue == NULL) || (msg_ptr == NULL)) {
  39804. 8011078: 69bb ldr r3, [r7, #24]
  39805. 801107a: 2b00 cmp r3, #0
  39806. 801107c: d002 beq.n 8011084 <osMessageQueueGet+0x80>
  39807. 801107e: 68bb ldr r3, [r7, #8]
  39808. 8011080: 2b00 cmp r3, #0
  39809. 8011082: d103 bne.n 801108c <osMessageQueueGet+0x88>
  39810. stat = osErrorParameter;
  39811. 8011084: f06f 0303 mvn.w r3, #3
  39812. 8011088: 61fb str r3, [r7, #28]
  39813. 801108a: e011 b.n 80110b0 <osMessageQueueGet+0xac>
  39814. }
  39815. else {
  39816. if (xQueueReceive (hQueue, msg_ptr, (TickType_t)timeout) != pdPASS) {
  39817. 801108c: 683a ldr r2, [r7, #0]
  39818. 801108e: 68b9 ldr r1, [r7, #8]
  39819. 8011090: 69b8 ldr r0, [r7, #24]
  39820. 8011092: f000 fddd bl 8011c50 <xQueueReceive>
  39821. 8011096: 4603 mov r3, r0
  39822. 8011098: 2b01 cmp r3, #1
  39823. 801109a: d009 beq.n 80110b0 <osMessageQueueGet+0xac>
  39824. if (timeout != 0U) {
  39825. 801109c: 683b ldr r3, [r7, #0]
  39826. 801109e: 2b00 cmp r3, #0
  39827. 80110a0: d003 beq.n 80110aa <osMessageQueueGet+0xa6>
  39828. stat = osErrorTimeout;
  39829. 80110a2: f06f 0301 mvn.w r3, #1
  39830. 80110a6: 61fb str r3, [r7, #28]
  39831. 80110a8: e002 b.n 80110b0 <osMessageQueueGet+0xac>
  39832. } else {
  39833. stat = osErrorResource;
  39834. 80110aa: f06f 0302 mvn.w r3, #2
  39835. 80110ae: 61fb str r3, [r7, #28]
  39836. }
  39837. }
  39838. }
  39839. }
  39840. return (stat);
  39841. 80110b0: 69fb ldr r3, [r7, #28]
  39842. }
  39843. 80110b2: 4618 mov r0, r3
  39844. 80110b4: 3720 adds r7, #32
  39845. 80110b6: 46bd mov sp, r7
  39846. 80110b8: bd80 pop {r7, pc}
  39847. 80110ba: bf00 nop
  39848. 80110bc: e000ed04 .word 0xe000ed04
  39849. 080110c0 <osMessageQueueGetCount>:
  39850. }
  39851. return (size);
  39852. }
  39853. uint32_t osMessageQueueGetCount (osMessageQueueId_t mq_id) {
  39854. 80110c0: b580 push {r7, lr}
  39855. 80110c2: b086 sub sp, #24
  39856. 80110c4: af00 add r7, sp, #0
  39857. 80110c6: 6078 str r0, [r7, #4]
  39858. QueueHandle_t hQueue = (QueueHandle_t)mq_id;
  39859. 80110c8: 687b ldr r3, [r7, #4]
  39860. 80110ca: 613b str r3, [r7, #16]
  39861. UBaseType_t count;
  39862. if (hQueue == NULL) {
  39863. 80110cc: 693b ldr r3, [r7, #16]
  39864. 80110ce: 2b00 cmp r3, #0
  39865. 80110d0: d102 bne.n 80110d8 <osMessageQueueGetCount+0x18>
  39866. count = 0U;
  39867. 80110d2: 2300 movs r3, #0
  39868. 80110d4: 617b str r3, [r7, #20]
  39869. 80110d6: e00e b.n 80110f6 <osMessageQueueGetCount+0x36>
  39870. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  39871. 80110d8: f3ef 8305 mrs r3, IPSR
  39872. 80110dc: 60fb str r3, [r7, #12]
  39873. return(result);
  39874. 80110de: 68fb ldr r3, [r7, #12]
  39875. }
  39876. else if (IS_IRQ()) {
  39877. 80110e0: 2b00 cmp r3, #0
  39878. 80110e2: d004 beq.n 80110ee <osMessageQueueGetCount+0x2e>
  39879. count = uxQueueMessagesWaitingFromISR (hQueue);
  39880. 80110e4: 6938 ldr r0, [r7, #16]
  39881. 80110e6: f001 f846 bl 8012176 <uxQueueMessagesWaitingFromISR>
  39882. 80110ea: 6178 str r0, [r7, #20]
  39883. 80110ec: e003 b.n 80110f6 <osMessageQueueGetCount+0x36>
  39884. }
  39885. else {
  39886. count = uxQueueMessagesWaiting (hQueue);
  39887. 80110ee: 6938 ldr r0, [r7, #16]
  39888. 80110f0: f001 f822 bl 8012138 <uxQueueMessagesWaiting>
  39889. 80110f4: 6178 str r0, [r7, #20]
  39890. }
  39891. return ((uint32_t)count);
  39892. 80110f6: 697b ldr r3, [r7, #20]
  39893. }
  39894. 80110f8: 4618 mov r0, r3
  39895. 80110fa: 3718 adds r7, #24
  39896. 80110fc: 46bd mov sp, r7
  39897. 80110fe: bd80 pop {r7, pc}
  39898. 08011100 <osMessageQueueDelete>:
  39899. }
  39900. return (stat);
  39901. }
  39902. osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id) {
  39903. 8011100: b580 push {r7, lr}
  39904. 8011102: b086 sub sp, #24
  39905. 8011104: af00 add r7, sp, #0
  39906. 8011106: 6078 str r0, [r7, #4]
  39907. QueueHandle_t hQueue = (QueueHandle_t)mq_id;
  39908. 8011108: 687b ldr r3, [r7, #4]
  39909. 801110a: 613b str r3, [r7, #16]
  39910. __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
  39911. 801110c: f3ef 8305 mrs r3, IPSR
  39912. 8011110: 60fb str r3, [r7, #12]
  39913. return(result);
  39914. 8011112: 68fb ldr r3, [r7, #12]
  39915. osStatus_t stat;
  39916. #ifndef USE_FreeRTOS_HEAP_1
  39917. if (IS_IRQ()) {
  39918. 8011114: 2b00 cmp r3, #0
  39919. 8011116: d003 beq.n 8011120 <osMessageQueueDelete+0x20>
  39920. stat = osErrorISR;
  39921. 8011118: f06f 0305 mvn.w r3, #5
  39922. 801111c: 617b str r3, [r7, #20]
  39923. 801111e: e00e b.n 801113e <osMessageQueueDelete+0x3e>
  39924. }
  39925. else if (hQueue == NULL) {
  39926. 8011120: 693b ldr r3, [r7, #16]
  39927. 8011122: 2b00 cmp r3, #0
  39928. 8011124: d103 bne.n 801112e <osMessageQueueDelete+0x2e>
  39929. stat = osErrorParameter;
  39930. 8011126: f06f 0303 mvn.w r3, #3
  39931. 801112a: 617b str r3, [r7, #20]
  39932. 801112c: e007 b.n 801113e <osMessageQueueDelete+0x3e>
  39933. }
  39934. else {
  39935. #if (configQUEUE_REGISTRY_SIZE > 0)
  39936. vQueueUnregisterQueue (hQueue);
  39937. 801112e: 6938 ldr r0, [r7, #16]
  39938. 8011130: f001 f9b6 bl 80124a0 <vQueueUnregisterQueue>
  39939. #endif
  39940. stat = osOK;
  39941. 8011134: 2300 movs r3, #0
  39942. 8011136: 617b str r3, [r7, #20]
  39943. vQueueDelete (hQueue);
  39944. 8011138: 6938 ldr r0, [r7, #16]
  39945. 801113a: f001 f83b bl 80121b4 <vQueueDelete>
  39946. }
  39947. #else
  39948. stat = osError;
  39949. #endif
  39950. return (stat);
  39951. 801113e: 697b ldr r3, [r7, #20]
  39952. }
  39953. 8011140: 4618 mov r0, r3
  39954. 8011142: 3718 adds r7, #24
  39955. 8011144: 46bd mov sp, r7
  39956. 8011146: bd80 pop {r7, pc}
  39957. 08011148 <vApplicationGetIdleTaskMemory>:
  39958. /*
  39959. vApplicationGetIdleTaskMemory gets called when configSUPPORT_STATIC_ALLOCATION
  39960. equals to 1 and is required for static memory allocation support.
  39961. */
  39962. __WEAK void vApplicationGetIdleTaskMemory (StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) {
  39963. 8011148: b480 push {r7}
  39964. 801114a: b085 sub sp, #20
  39965. 801114c: af00 add r7, sp, #0
  39966. 801114e: 60f8 str r0, [r7, #12]
  39967. 8011150: 60b9 str r1, [r7, #8]
  39968. 8011152: 607a str r2, [r7, #4]
  39969. /* Idle task control block and stack */
  39970. static StaticTask_t Idle_TCB;
  39971. static StackType_t Idle_Stack[configMINIMAL_STACK_SIZE];
  39972. *ppxIdleTaskTCBBuffer = &Idle_TCB;
  39973. 8011154: 68fb ldr r3, [r7, #12]
  39974. 8011156: 4a07 ldr r2, [pc, #28] @ (8011174 <vApplicationGetIdleTaskMemory+0x2c>)
  39975. 8011158: 601a str r2, [r3, #0]
  39976. *ppxIdleTaskStackBuffer = &Idle_Stack[0];
  39977. 801115a: 68bb ldr r3, [r7, #8]
  39978. 801115c: 4a06 ldr r2, [pc, #24] @ (8011178 <vApplicationGetIdleTaskMemory+0x30>)
  39979. 801115e: 601a str r2, [r3, #0]
  39980. *pulIdleTaskStackSize = (uint32_t)configMINIMAL_STACK_SIZE;
  39981. 8011160: 687b ldr r3, [r7, #4]
  39982. 8011162: f44f 7200 mov.w r2, #512 @ 0x200
  39983. 8011166: 601a str r2, [r3, #0]
  39984. }
  39985. 8011168: bf00 nop
  39986. 801116a: 3714 adds r7, #20
  39987. 801116c: 46bd mov sp, r7
  39988. 801116e: f85d 7b04 ldr.w r7, [sp], #4
  39989. 8011172: 4770 bx lr
  39990. 8011174: 24002300 .word 0x24002300
  39991. 8011178: 240023a8 .word 0x240023a8
  39992. 0801117c <vApplicationGetTimerTaskMemory>:
  39993. /*
  39994. vApplicationGetTimerTaskMemory gets called when configSUPPORT_STATIC_ALLOCATION
  39995. equals to 1 and is required for static memory allocation support.
  39996. */
  39997. __WEAK void vApplicationGetTimerTaskMemory (StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize) {
  39998. 801117c: b480 push {r7}
  39999. 801117e: b085 sub sp, #20
  40000. 8011180: af00 add r7, sp, #0
  40001. 8011182: 60f8 str r0, [r7, #12]
  40002. 8011184: 60b9 str r1, [r7, #8]
  40003. 8011186: 607a str r2, [r7, #4]
  40004. /* Timer task control block and stack */
  40005. static StaticTask_t Timer_TCB;
  40006. static StackType_t Timer_Stack[configTIMER_TASK_STACK_DEPTH];
  40007. *ppxTimerTaskTCBBuffer = &Timer_TCB;
  40008. 8011188: 68fb ldr r3, [r7, #12]
  40009. 801118a: 4a07 ldr r2, [pc, #28] @ (80111a8 <vApplicationGetTimerTaskMemory+0x2c>)
  40010. 801118c: 601a str r2, [r3, #0]
  40011. *ppxTimerTaskStackBuffer = &Timer_Stack[0];
  40012. 801118e: 68bb ldr r3, [r7, #8]
  40013. 8011190: 4a06 ldr r2, [pc, #24] @ (80111ac <vApplicationGetTimerTaskMemory+0x30>)
  40014. 8011192: 601a str r2, [r3, #0]
  40015. *pulTimerTaskStackSize = (uint32_t)configTIMER_TASK_STACK_DEPTH;
  40016. 8011194: 687b ldr r3, [r7, #4]
  40017. 8011196: f44f 6280 mov.w r2, #1024 @ 0x400
  40018. 801119a: 601a str r2, [r3, #0]
  40019. }
  40020. 801119c: bf00 nop
  40021. 801119e: 3714 adds r7, #20
  40022. 80111a0: 46bd mov sp, r7
  40023. 80111a2: f85d 7b04 ldr.w r7, [sp], #4
  40024. 80111a6: 4770 bx lr
  40025. 80111a8: 24002ba8 .word 0x24002ba8
  40026. 80111ac: 24002c50 .word 0x24002c50
  40027. 080111b0 <vListInitialise>:
  40028. /*-----------------------------------------------------------
  40029. * PUBLIC LIST API documented in list.h
  40030. *----------------------------------------------------------*/
  40031. void vListInitialise( List_t * const pxList )
  40032. {
  40033. 80111b0: b480 push {r7}
  40034. 80111b2: b083 sub sp, #12
  40035. 80111b4: af00 add r7, sp, #0
  40036. 80111b6: 6078 str r0, [r7, #4]
  40037. /* The list structure contains a list item which is used to mark the
  40038. end of the list. To initialise the list the list end is inserted
  40039. as the only list entry. */
  40040. pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
  40041. 80111b8: 687b ldr r3, [r7, #4]
  40042. 80111ba: f103 0208 add.w r2, r3, #8
  40043. 80111be: 687b ldr r3, [r7, #4]
  40044. 80111c0: 605a str r2, [r3, #4]
  40045. /* The list end value is the highest possible value in the list to
  40046. ensure it remains at the end of the list. */
  40047. pxList->xListEnd.xItemValue = portMAX_DELAY;
  40048. 80111c2: 687b ldr r3, [r7, #4]
  40049. 80111c4: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  40050. 80111c8: 609a str r2, [r3, #8]
  40051. /* The list end next and previous pointers point to itself so we know
  40052. when the list is empty. */
  40053. pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
  40054. 80111ca: 687b ldr r3, [r7, #4]
  40055. 80111cc: f103 0208 add.w r2, r3, #8
  40056. 80111d0: 687b ldr r3, [r7, #4]
  40057. 80111d2: 60da str r2, [r3, #12]
  40058. pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
  40059. 80111d4: 687b ldr r3, [r7, #4]
  40060. 80111d6: f103 0208 add.w r2, r3, #8
  40061. 80111da: 687b ldr r3, [r7, #4]
  40062. 80111dc: 611a str r2, [r3, #16]
  40063. pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
  40064. 80111de: 687b ldr r3, [r7, #4]
  40065. 80111e0: 2200 movs r2, #0
  40066. 80111e2: 601a str r2, [r3, #0]
  40067. /* Write known values into the list if
  40068. configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
  40069. listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );
  40070. listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
  40071. }
  40072. 80111e4: bf00 nop
  40073. 80111e6: 370c adds r7, #12
  40074. 80111e8: 46bd mov sp, r7
  40075. 80111ea: f85d 7b04 ldr.w r7, [sp], #4
  40076. 80111ee: 4770 bx lr
  40077. 080111f0 <vListInitialiseItem>:
  40078. /*-----------------------------------------------------------*/
  40079. void vListInitialiseItem( ListItem_t * const pxItem )
  40080. {
  40081. 80111f0: b480 push {r7}
  40082. 80111f2: b083 sub sp, #12
  40083. 80111f4: af00 add r7, sp, #0
  40084. 80111f6: 6078 str r0, [r7, #4]
  40085. /* Make sure the list item is not recorded as being on a list. */
  40086. pxItem->pxContainer = NULL;
  40087. 80111f8: 687b ldr r3, [r7, #4]
  40088. 80111fa: 2200 movs r2, #0
  40089. 80111fc: 611a str r2, [r3, #16]
  40090. /* Write known values into the list item if
  40091. configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
  40092. listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
  40093. listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
  40094. }
  40095. 80111fe: bf00 nop
  40096. 8011200: 370c adds r7, #12
  40097. 8011202: 46bd mov sp, r7
  40098. 8011204: f85d 7b04 ldr.w r7, [sp], #4
  40099. 8011208: 4770 bx lr
  40100. 0801120a <vListInsertEnd>:
  40101. /*-----------------------------------------------------------*/
  40102. void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
  40103. {
  40104. 801120a: b480 push {r7}
  40105. 801120c: b085 sub sp, #20
  40106. 801120e: af00 add r7, sp, #0
  40107. 8011210: 6078 str r0, [r7, #4]
  40108. 8011212: 6039 str r1, [r7, #0]
  40109. ListItem_t * const pxIndex = pxList->pxIndex;
  40110. 8011214: 687b ldr r3, [r7, #4]
  40111. 8011216: 685b ldr r3, [r3, #4]
  40112. 8011218: 60fb str r3, [r7, #12]
  40113. listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );
  40114. /* Insert a new list item into pxList, but rather than sort the list,
  40115. makes the new list item the last item to be removed by a call to
  40116. listGET_OWNER_OF_NEXT_ENTRY(). */
  40117. pxNewListItem->pxNext = pxIndex;
  40118. 801121a: 683b ldr r3, [r7, #0]
  40119. 801121c: 68fa ldr r2, [r7, #12]
  40120. 801121e: 605a str r2, [r3, #4]
  40121. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  40122. 8011220: 68fb ldr r3, [r7, #12]
  40123. 8011222: 689a ldr r2, [r3, #8]
  40124. 8011224: 683b ldr r3, [r7, #0]
  40125. 8011226: 609a str r2, [r3, #8]
  40126. /* Only used during decision coverage testing. */
  40127. mtCOVERAGE_TEST_DELAY();
  40128. pxIndex->pxPrevious->pxNext = pxNewListItem;
  40129. 8011228: 68fb ldr r3, [r7, #12]
  40130. 801122a: 689b ldr r3, [r3, #8]
  40131. 801122c: 683a ldr r2, [r7, #0]
  40132. 801122e: 605a str r2, [r3, #4]
  40133. pxIndex->pxPrevious = pxNewListItem;
  40134. 8011230: 68fb ldr r3, [r7, #12]
  40135. 8011232: 683a ldr r2, [r7, #0]
  40136. 8011234: 609a str r2, [r3, #8]
  40137. /* Remember which list the item is in. */
  40138. pxNewListItem->pxContainer = pxList;
  40139. 8011236: 683b ldr r3, [r7, #0]
  40140. 8011238: 687a ldr r2, [r7, #4]
  40141. 801123a: 611a str r2, [r3, #16]
  40142. ( pxList->uxNumberOfItems )++;
  40143. 801123c: 687b ldr r3, [r7, #4]
  40144. 801123e: 681b ldr r3, [r3, #0]
  40145. 8011240: 1c5a adds r2, r3, #1
  40146. 8011242: 687b ldr r3, [r7, #4]
  40147. 8011244: 601a str r2, [r3, #0]
  40148. }
  40149. 8011246: bf00 nop
  40150. 8011248: 3714 adds r7, #20
  40151. 801124a: 46bd mov sp, r7
  40152. 801124c: f85d 7b04 ldr.w r7, [sp], #4
  40153. 8011250: 4770 bx lr
  40154. 08011252 <vListInsert>:
  40155. /*-----------------------------------------------------------*/
  40156. void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
  40157. {
  40158. 8011252: b480 push {r7}
  40159. 8011254: b085 sub sp, #20
  40160. 8011256: af00 add r7, sp, #0
  40161. 8011258: 6078 str r0, [r7, #4]
  40162. 801125a: 6039 str r1, [r7, #0]
  40163. ListItem_t *pxIterator;
  40164. const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
  40165. 801125c: 683b ldr r3, [r7, #0]
  40166. 801125e: 681b ldr r3, [r3, #0]
  40167. 8011260: 60bb str r3, [r7, #8]
  40168. new list item should be placed after it. This ensures that TCBs which are
  40169. stored in ready lists (all of which have the same xItemValue value) get a
  40170. share of the CPU. However, if the xItemValue is the same as the back marker
  40171. the iteration loop below will not end. Therefore the value is checked
  40172. first, and the algorithm slightly modified if necessary. */
  40173. if( xValueOfInsertion == portMAX_DELAY )
  40174. 8011262: 68bb ldr r3, [r7, #8]
  40175. 8011264: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  40176. 8011268: d103 bne.n 8011272 <vListInsert+0x20>
  40177. {
  40178. pxIterator = pxList->xListEnd.pxPrevious;
  40179. 801126a: 687b ldr r3, [r7, #4]
  40180. 801126c: 691b ldr r3, [r3, #16]
  40181. 801126e: 60fb str r3, [r7, #12]
  40182. 8011270: e00c b.n 801128c <vListInsert+0x3a>
  40183. 4) Using a queue or semaphore before it has been initialised or
  40184. before the scheduler has been started (are interrupts firing
  40185. before vTaskStartScheduler() has been called?).
  40186. **********************************************************************/
  40187. for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */
  40188. 8011272: 687b ldr r3, [r7, #4]
  40189. 8011274: 3308 adds r3, #8
  40190. 8011276: 60fb str r3, [r7, #12]
  40191. 8011278: e002 b.n 8011280 <vListInsert+0x2e>
  40192. 801127a: 68fb ldr r3, [r7, #12]
  40193. 801127c: 685b ldr r3, [r3, #4]
  40194. 801127e: 60fb str r3, [r7, #12]
  40195. 8011280: 68fb ldr r3, [r7, #12]
  40196. 8011282: 685b ldr r3, [r3, #4]
  40197. 8011284: 681b ldr r3, [r3, #0]
  40198. 8011286: 68ba ldr r2, [r7, #8]
  40199. 8011288: 429a cmp r2, r3
  40200. 801128a: d2f6 bcs.n 801127a <vListInsert+0x28>
  40201. /* There is nothing to do here, just iterating to the wanted
  40202. insertion position. */
  40203. }
  40204. }
  40205. pxNewListItem->pxNext = pxIterator->pxNext;
  40206. 801128c: 68fb ldr r3, [r7, #12]
  40207. 801128e: 685a ldr r2, [r3, #4]
  40208. 8011290: 683b ldr r3, [r7, #0]
  40209. 8011292: 605a str r2, [r3, #4]
  40210. pxNewListItem->pxNext->pxPrevious = pxNewListItem;
  40211. 8011294: 683b ldr r3, [r7, #0]
  40212. 8011296: 685b ldr r3, [r3, #4]
  40213. 8011298: 683a ldr r2, [r7, #0]
  40214. 801129a: 609a str r2, [r3, #8]
  40215. pxNewListItem->pxPrevious = pxIterator;
  40216. 801129c: 683b ldr r3, [r7, #0]
  40217. 801129e: 68fa ldr r2, [r7, #12]
  40218. 80112a0: 609a str r2, [r3, #8]
  40219. pxIterator->pxNext = pxNewListItem;
  40220. 80112a2: 68fb ldr r3, [r7, #12]
  40221. 80112a4: 683a ldr r2, [r7, #0]
  40222. 80112a6: 605a str r2, [r3, #4]
  40223. /* Remember which list the item is in. This allows fast removal of the
  40224. item later. */
  40225. pxNewListItem->pxContainer = pxList;
  40226. 80112a8: 683b ldr r3, [r7, #0]
  40227. 80112aa: 687a ldr r2, [r7, #4]
  40228. 80112ac: 611a str r2, [r3, #16]
  40229. ( pxList->uxNumberOfItems )++;
  40230. 80112ae: 687b ldr r3, [r7, #4]
  40231. 80112b0: 681b ldr r3, [r3, #0]
  40232. 80112b2: 1c5a adds r2, r3, #1
  40233. 80112b4: 687b ldr r3, [r7, #4]
  40234. 80112b6: 601a str r2, [r3, #0]
  40235. }
  40236. 80112b8: bf00 nop
  40237. 80112ba: 3714 adds r7, #20
  40238. 80112bc: 46bd mov sp, r7
  40239. 80112be: f85d 7b04 ldr.w r7, [sp], #4
  40240. 80112c2: 4770 bx lr
  40241. 080112c4 <uxListRemove>:
  40242. /*-----------------------------------------------------------*/
  40243. UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
  40244. {
  40245. 80112c4: b480 push {r7}
  40246. 80112c6: b085 sub sp, #20
  40247. 80112c8: af00 add r7, sp, #0
  40248. 80112ca: 6078 str r0, [r7, #4]
  40249. /* The list item knows which list it is in. Obtain the list from the list
  40250. item. */
  40251. List_t * const pxList = pxItemToRemove->pxContainer;
  40252. 80112cc: 687b ldr r3, [r7, #4]
  40253. 80112ce: 691b ldr r3, [r3, #16]
  40254. 80112d0: 60fb str r3, [r7, #12]
  40255. pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
  40256. 80112d2: 687b ldr r3, [r7, #4]
  40257. 80112d4: 685b ldr r3, [r3, #4]
  40258. 80112d6: 687a ldr r2, [r7, #4]
  40259. 80112d8: 6892 ldr r2, [r2, #8]
  40260. 80112da: 609a str r2, [r3, #8]
  40261. pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
  40262. 80112dc: 687b ldr r3, [r7, #4]
  40263. 80112de: 689b ldr r3, [r3, #8]
  40264. 80112e0: 687a ldr r2, [r7, #4]
  40265. 80112e2: 6852 ldr r2, [r2, #4]
  40266. 80112e4: 605a str r2, [r3, #4]
  40267. /* Only used during decision coverage testing. */
  40268. mtCOVERAGE_TEST_DELAY();
  40269. /* Make sure the index is left pointing to a valid item. */
  40270. if( pxList->pxIndex == pxItemToRemove )
  40271. 80112e6: 68fb ldr r3, [r7, #12]
  40272. 80112e8: 685b ldr r3, [r3, #4]
  40273. 80112ea: 687a ldr r2, [r7, #4]
  40274. 80112ec: 429a cmp r2, r3
  40275. 80112ee: d103 bne.n 80112f8 <uxListRemove+0x34>
  40276. {
  40277. pxList->pxIndex = pxItemToRemove->pxPrevious;
  40278. 80112f0: 687b ldr r3, [r7, #4]
  40279. 80112f2: 689a ldr r2, [r3, #8]
  40280. 80112f4: 68fb ldr r3, [r7, #12]
  40281. 80112f6: 605a str r2, [r3, #4]
  40282. else
  40283. {
  40284. mtCOVERAGE_TEST_MARKER();
  40285. }
  40286. pxItemToRemove->pxContainer = NULL;
  40287. 80112f8: 687b ldr r3, [r7, #4]
  40288. 80112fa: 2200 movs r2, #0
  40289. 80112fc: 611a str r2, [r3, #16]
  40290. ( pxList->uxNumberOfItems )--;
  40291. 80112fe: 68fb ldr r3, [r7, #12]
  40292. 8011300: 681b ldr r3, [r3, #0]
  40293. 8011302: 1e5a subs r2, r3, #1
  40294. 8011304: 68fb ldr r3, [r7, #12]
  40295. 8011306: 601a str r2, [r3, #0]
  40296. return pxList->uxNumberOfItems;
  40297. 8011308: 68fb ldr r3, [r7, #12]
  40298. 801130a: 681b ldr r3, [r3, #0]
  40299. }
  40300. 801130c: 4618 mov r0, r3
  40301. 801130e: 3714 adds r7, #20
  40302. 8011310: 46bd mov sp, r7
  40303. 8011312: f85d 7b04 ldr.w r7, [sp], #4
  40304. 8011316: 4770 bx lr
  40305. 08011318 <xQueueGenericReset>:
  40306. } \
  40307. taskEXIT_CRITICAL()
  40308. /*-----------------------------------------------------------*/
  40309. BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue )
  40310. {
  40311. 8011318: b580 push {r7, lr}
  40312. 801131a: b084 sub sp, #16
  40313. 801131c: af00 add r7, sp, #0
  40314. 801131e: 6078 str r0, [r7, #4]
  40315. 8011320: 6039 str r1, [r7, #0]
  40316. Queue_t * const pxQueue = xQueue;
  40317. 8011322: 687b ldr r3, [r7, #4]
  40318. 8011324: 60fb str r3, [r7, #12]
  40319. configASSERT( pxQueue );
  40320. 8011326: 68fb ldr r3, [r7, #12]
  40321. 8011328: 2b00 cmp r3, #0
  40322. 801132a: d10b bne.n 8011344 <xQueueGenericReset+0x2c>
  40323. portFORCE_INLINE static void vPortRaiseBASEPRI( void )
  40324. {
  40325. uint32_t ulNewBASEPRI;
  40326. __asm volatile
  40327. 801132c: f04f 0350 mov.w r3, #80 @ 0x50
  40328. 8011330: f383 8811 msr BASEPRI, r3
  40329. 8011334: f3bf 8f6f isb sy
  40330. 8011338: f3bf 8f4f dsb sy
  40331. 801133c: 60bb str r3, [r7, #8]
  40332. " msr basepri, %0 \n" \
  40333. " isb \n" \
  40334. " dsb \n" \
  40335. :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
  40336. );
  40337. }
  40338. 801133e: bf00 nop
  40339. 8011340: bf00 nop
  40340. 8011342: e7fd b.n 8011340 <xQueueGenericReset+0x28>
  40341. taskENTER_CRITICAL();
  40342. 8011344: f003 fbf0 bl 8014b28 <vPortEnterCritical>
  40343. {
  40344. pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */
  40345. 8011348: 68fb ldr r3, [r7, #12]
  40346. 801134a: 681a ldr r2, [r3, #0]
  40347. 801134c: 68fb ldr r3, [r7, #12]
  40348. 801134e: 6bdb ldr r3, [r3, #60] @ 0x3c
  40349. 8011350: 68f9 ldr r1, [r7, #12]
  40350. 8011352: 6c09 ldr r1, [r1, #64] @ 0x40
  40351. 8011354: fb01 f303 mul.w r3, r1, r3
  40352. 8011358: 441a add r2, r3
  40353. 801135a: 68fb ldr r3, [r7, #12]
  40354. 801135c: 609a str r2, [r3, #8]
  40355. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  40356. 801135e: 68fb ldr r3, [r7, #12]
  40357. 8011360: 2200 movs r2, #0
  40358. 8011362: 639a str r2, [r3, #56] @ 0x38
  40359. pxQueue->pcWriteTo = pxQueue->pcHead;
  40360. 8011364: 68fb ldr r3, [r7, #12]
  40361. 8011366: 681a ldr r2, [r3, #0]
  40362. 8011368: 68fb ldr r3, [r7, #12]
  40363. 801136a: 605a str r2, [r3, #4]
  40364. pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */
  40365. 801136c: 68fb ldr r3, [r7, #12]
  40366. 801136e: 681a ldr r2, [r3, #0]
  40367. 8011370: 68fb ldr r3, [r7, #12]
  40368. 8011372: 6bdb ldr r3, [r3, #60] @ 0x3c
  40369. 8011374: 3b01 subs r3, #1
  40370. 8011376: 68f9 ldr r1, [r7, #12]
  40371. 8011378: 6c09 ldr r1, [r1, #64] @ 0x40
  40372. 801137a: fb01 f303 mul.w r3, r1, r3
  40373. 801137e: 441a add r2, r3
  40374. 8011380: 68fb ldr r3, [r7, #12]
  40375. 8011382: 60da str r2, [r3, #12]
  40376. pxQueue->cRxLock = queueUNLOCKED;
  40377. 8011384: 68fb ldr r3, [r7, #12]
  40378. 8011386: 22ff movs r2, #255 @ 0xff
  40379. 8011388: f883 2044 strb.w r2, [r3, #68] @ 0x44
  40380. pxQueue->cTxLock = queueUNLOCKED;
  40381. 801138c: 68fb ldr r3, [r7, #12]
  40382. 801138e: 22ff movs r2, #255 @ 0xff
  40383. 8011390: f883 2045 strb.w r2, [r3, #69] @ 0x45
  40384. if( xNewQueue == pdFALSE )
  40385. 8011394: 683b ldr r3, [r7, #0]
  40386. 8011396: 2b00 cmp r3, #0
  40387. 8011398: d114 bne.n 80113c4 <xQueueGenericReset+0xac>
  40388. /* If there are tasks blocked waiting to read from the queue, then
  40389. the tasks will remain blocked as after this function exits the queue
  40390. will still be empty. If there are tasks blocked waiting to write to
  40391. the queue, then one should be unblocked as after this function exits
  40392. it will be possible to write to it. */
  40393. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  40394. 801139a: 68fb ldr r3, [r7, #12]
  40395. 801139c: 691b ldr r3, [r3, #16]
  40396. 801139e: 2b00 cmp r3, #0
  40397. 80113a0: d01a beq.n 80113d8 <xQueueGenericReset+0xc0>
  40398. {
  40399. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  40400. 80113a2: 68fb ldr r3, [r7, #12]
  40401. 80113a4: 3310 adds r3, #16
  40402. 80113a6: 4618 mov r0, r3
  40403. 80113a8: f002 f922 bl 80135f0 <xTaskRemoveFromEventList>
  40404. 80113ac: 4603 mov r3, r0
  40405. 80113ae: 2b00 cmp r3, #0
  40406. 80113b0: d012 beq.n 80113d8 <xQueueGenericReset+0xc0>
  40407. {
  40408. queueYIELD_IF_USING_PREEMPTION();
  40409. 80113b2: 4b0d ldr r3, [pc, #52] @ (80113e8 <xQueueGenericReset+0xd0>)
  40410. 80113b4: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  40411. 80113b8: 601a str r2, [r3, #0]
  40412. 80113ba: f3bf 8f4f dsb sy
  40413. 80113be: f3bf 8f6f isb sy
  40414. 80113c2: e009 b.n 80113d8 <xQueueGenericReset+0xc0>
  40415. }
  40416. }
  40417. else
  40418. {
  40419. /* Ensure the event queues start in the correct state. */
  40420. vListInitialise( &( pxQueue->xTasksWaitingToSend ) );
  40421. 80113c4: 68fb ldr r3, [r7, #12]
  40422. 80113c6: 3310 adds r3, #16
  40423. 80113c8: 4618 mov r0, r3
  40424. 80113ca: f7ff fef1 bl 80111b0 <vListInitialise>
  40425. vListInitialise( &( pxQueue->xTasksWaitingToReceive ) );
  40426. 80113ce: 68fb ldr r3, [r7, #12]
  40427. 80113d0: 3324 adds r3, #36 @ 0x24
  40428. 80113d2: 4618 mov r0, r3
  40429. 80113d4: f7ff feec bl 80111b0 <vListInitialise>
  40430. }
  40431. }
  40432. taskEXIT_CRITICAL();
  40433. 80113d8: f003 fbd8 bl 8014b8c <vPortExitCritical>
  40434. /* A value is returned for calling semantic consistency with previous
  40435. versions. */
  40436. return pdPASS;
  40437. 80113dc: 2301 movs r3, #1
  40438. }
  40439. 80113de: 4618 mov r0, r3
  40440. 80113e0: 3710 adds r7, #16
  40441. 80113e2: 46bd mov sp, r7
  40442. 80113e4: bd80 pop {r7, pc}
  40443. 80113e6: bf00 nop
  40444. 80113e8: e000ed04 .word 0xe000ed04
  40445. 080113ec <xQueueGenericCreateStatic>:
  40446. /*-----------------------------------------------------------*/
  40447. #if( configSUPPORT_STATIC_ALLOCATION == 1 )
  40448. QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType )
  40449. {
  40450. 80113ec: b580 push {r7, lr}
  40451. 80113ee: b08e sub sp, #56 @ 0x38
  40452. 80113f0: af02 add r7, sp, #8
  40453. 80113f2: 60f8 str r0, [r7, #12]
  40454. 80113f4: 60b9 str r1, [r7, #8]
  40455. 80113f6: 607a str r2, [r7, #4]
  40456. 80113f8: 603b str r3, [r7, #0]
  40457. Queue_t *pxNewQueue;
  40458. configASSERT( uxQueueLength > ( UBaseType_t ) 0 );
  40459. 80113fa: 68fb ldr r3, [r7, #12]
  40460. 80113fc: 2b00 cmp r3, #0
  40461. 80113fe: d10b bne.n 8011418 <xQueueGenericCreateStatic+0x2c>
  40462. __asm volatile
  40463. 8011400: f04f 0350 mov.w r3, #80 @ 0x50
  40464. 8011404: f383 8811 msr BASEPRI, r3
  40465. 8011408: f3bf 8f6f isb sy
  40466. 801140c: f3bf 8f4f dsb sy
  40467. 8011410: 62bb str r3, [r7, #40] @ 0x28
  40468. }
  40469. 8011412: bf00 nop
  40470. 8011414: bf00 nop
  40471. 8011416: e7fd b.n 8011414 <xQueueGenericCreateStatic+0x28>
  40472. /* The StaticQueue_t structure and the queue storage area must be
  40473. supplied. */
  40474. configASSERT( pxStaticQueue != NULL );
  40475. 8011418: 683b ldr r3, [r7, #0]
  40476. 801141a: 2b00 cmp r3, #0
  40477. 801141c: d10b bne.n 8011436 <xQueueGenericCreateStatic+0x4a>
  40478. __asm volatile
  40479. 801141e: f04f 0350 mov.w r3, #80 @ 0x50
  40480. 8011422: f383 8811 msr BASEPRI, r3
  40481. 8011426: f3bf 8f6f isb sy
  40482. 801142a: f3bf 8f4f dsb sy
  40483. 801142e: 627b str r3, [r7, #36] @ 0x24
  40484. }
  40485. 8011430: bf00 nop
  40486. 8011432: bf00 nop
  40487. 8011434: e7fd b.n 8011432 <xQueueGenericCreateStatic+0x46>
  40488. /* A queue storage area should be provided if the item size is not 0, and
  40489. should not be provided if the item size is 0. */
  40490. configASSERT( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0 ) ) );
  40491. 8011436: 687b ldr r3, [r7, #4]
  40492. 8011438: 2b00 cmp r3, #0
  40493. 801143a: d002 beq.n 8011442 <xQueueGenericCreateStatic+0x56>
  40494. 801143c: 68bb ldr r3, [r7, #8]
  40495. 801143e: 2b00 cmp r3, #0
  40496. 8011440: d001 beq.n 8011446 <xQueueGenericCreateStatic+0x5a>
  40497. 8011442: 2301 movs r3, #1
  40498. 8011444: e000 b.n 8011448 <xQueueGenericCreateStatic+0x5c>
  40499. 8011446: 2300 movs r3, #0
  40500. 8011448: 2b00 cmp r3, #0
  40501. 801144a: d10b bne.n 8011464 <xQueueGenericCreateStatic+0x78>
  40502. __asm volatile
  40503. 801144c: f04f 0350 mov.w r3, #80 @ 0x50
  40504. 8011450: f383 8811 msr BASEPRI, r3
  40505. 8011454: f3bf 8f6f isb sy
  40506. 8011458: f3bf 8f4f dsb sy
  40507. 801145c: 623b str r3, [r7, #32]
  40508. }
  40509. 801145e: bf00 nop
  40510. 8011460: bf00 nop
  40511. 8011462: e7fd b.n 8011460 <xQueueGenericCreateStatic+0x74>
  40512. configASSERT( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0 ) ) );
  40513. 8011464: 687b ldr r3, [r7, #4]
  40514. 8011466: 2b00 cmp r3, #0
  40515. 8011468: d102 bne.n 8011470 <xQueueGenericCreateStatic+0x84>
  40516. 801146a: 68bb ldr r3, [r7, #8]
  40517. 801146c: 2b00 cmp r3, #0
  40518. 801146e: d101 bne.n 8011474 <xQueueGenericCreateStatic+0x88>
  40519. 8011470: 2301 movs r3, #1
  40520. 8011472: e000 b.n 8011476 <xQueueGenericCreateStatic+0x8a>
  40521. 8011474: 2300 movs r3, #0
  40522. 8011476: 2b00 cmp r3, #0
  40523. 8011478: d10b bne.n 8011492 <xQueueGenericCreateStatic+0xa6>
  40524. __asm volatile
  40525. 801147a: f04f 0350 mov.w r3, #80 @ 0x50
  40526. 801147e: f383 8811 msr BASEPRI, r3
  40527. 8011482: f3bf 8f6f isb sy
  40528. 8011486: f3bf 8f4f dsb sy
  40529. 801148a: 61fb str r3, [r7, #28]
  40530. }
  40531. 801148c: bf00 nop
  40532. 801148e: bf00 nop
  40533. 8011490: e7fd b.n 801148e <xQueueGenericCreateStatic+0xa2>
  40534. #if( configASSERT_DEFINED == 1 )
  40535. {
  40536. /* Sanity check that the size of the structure used to declare a
  40537. variable of type StaticQueue_t or StaticSemaphore_t equals the size of
  40538. the real queue and semaphore structures. */
  40539. volatile size_t xSize = sizeof( StaticQueue_t );
  40540. 8011492: 2350 movs r3, #80 @ 0x50
  40541. 8011494: 617b str r3, [r7, #20]
  40542. configASSERT( xSize == sizeof( Queue_t ) );
  40543. 8011496: 697b ldr r3, [r7, #20]
  40544. 8011498: 2b50 cmp r3, #80 @ 0x50
  40545. 801149a: d00b beq.n 80114b4 <xQueueGenericCreateStatic+0xc8>
  40546. __asm volatile
  40547. 801149c: f04f 0350 mov.w r3, #80 @ 0x50
  40548. 80114a0: f383 8811 msr BASEPRI, r3
  40549. 80114a4: f3bf 8f6f isb sy
  40550. 80114a8: f3bf 8f4f dsb sy
  40551. 80114ac: 61bb str r3, [r7, #24]
  40552. }
  40553. 80114ae: bf00 nop
  40554. 80114b0: bf00 nop
  40555. 80114b2: e7fd b.n 80114b0 <xQueueGenericCreateStatic+0xc4>
  40556. ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */
  40557. 80114b4: 697b ldr r3, [r7, #20]
  40558. #endif /* configASSERT_DEFINED */
  40559. /* The address of a statically allocated queue was passed in, use it.
  40560. The address of a statically allocated storage area was also passed in
  40561. but is already set. */
  40562. pxNewQueue = ( Queue_t * ) pxStaticQueue; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */
  40563. 80114b6: 683b ldr r3, [r7, #0]
  40564. 80114b8: 62fb str r3, [r7, #44] @ 0x2c
  40565. if( pxNewQueue != NULL )
  40566. 80114ba: 6afb ldr r3, [r7, #44] @ 0x2c
  40567. 80114bc: 2b00 cmp r3, #0
  40568. 80114be: d00d beq.n 80114dc <xQueueGenericCreateStatic+0xf0>
  40569. #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
  40570. {
  40571. /* Queues can be allocated wither statically or dynamically, so
  40572. note this queue was allocated statically in case the queue is
  40573. later deleted. */
  40574. pxNewQueue->ucStaticallyAllocated = pdTRUE;
  40575. 80114c0: 6afb ldr r3, [r7, #44] @ 0x2c
  40576. 80114c2: 2201 movs r2, #1
  40577. 80114c4: f883 2046 strb.w r2, [r3, #70] @ 0x46
  40578. }
  40579. #endif /* configSUPPORT_DYNAMIC_ALLOCATION */
  40580. prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue );
  40581. 80114c8: f897 2038 ldrb.w r2, [r7, #56] @ 0x38
  40582. 80114cc: 6afb ldr r3, [r7, #44] @ 0x2c
  40583. 80114ce: 9300 str r3, [sp, #0]
  40584. 80114d0: 4613 mov r3, r2
  40585. 80114d2: 687a ldr r2, [r7, #4]
  40586. 80114d4: 68b9 ldr r1, [r7, #8]
  40587. 80114d6: 68f8 ldr r0, [r7, #12]
  40588. 80114d8: f000 f840 bl 801155c <prvInitialiseNewQueue>
  40589. {
  40590. traceQUEUE_CREATE_FAILED( ucQueueType );
  40591. mtCOVERAGE_TEST_MARKER();
  40592. }
  40593. return pxNewQueue;
  40594. 80114dc: 6afb ldr r3, [r7, #44] @ 0x2c
  40595. }
  40596. 80114de: 4618 mov r0, r3
  40597. 80114e0: 3730 adds r7, #48 @ 0x30
  40598. 80114e2: 46bd mov sp, r7
  40599. 80114e4: bd80 pop {r7, pc}
  40600. 080114e6 <xQueueGenericCreate>:
  40601. /*-----------------------------------------------------------*/
  40602. #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
  40603. QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType )
  40604. {
  40605. 80114e6: b580 push {r7, lr}
  40606. 80114e8: b08a sub sp, #40 @ 0x28
  40607. 80114ea: af02 add r7, sp, #8
  40608. 80114ec: 60f8 str r0, [r7, #12]
  40609. 80114ee: 60b9 str r1, [r7, #8]
  40610. 80114f0: 4613 mov r3, r2
  40611. 80114f2: 71fb strb r3, [r7, #7]
  40612. Queue_t *pxNewQueue;
  40613. size_t xQueueSizeInBytes;
  40614. uint8_t *pucQueueStorage;
  40615. configASSERT( uxQueueLength > ( UBaseType_t ) 0 );
  40616. 80114f4: 68fb ldr r3, [r7, #12]
  40617. 80114f6: 2b00 cmp r3, #0
  40618. 80114f8: d10b bne.n 8011512 <xQueueGenericCreate+0x2c>
  40619. __asm volatile
  40620. 80114fa: f04f 0350 mov.w r3, #80 @ 0x50
  40621. 80114fe: f383 8811 msr BASEPRI, r3
  40622. 8011502: f3bf 8f6f isb sy
  40623. 8011506: f3bf 8f4f dsb sy
  40624. 801150a: 613b str r3, [r7, #16]
  40625. }
  40626. 801150c: bf00 nop
  40627. 801150e: bf00 nop
  40628. 8011510: e7fd b.n 801150e <xQueueGenericCreate+0x28>
  40629. /* Allocate enough space to hold the maximum number of items that
  40630. can be in the queue at any time. It is valid for uxItemSize to be
  40631. zero in the case the queue is used as a semaphore. */
  40632. xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  40633. 8011512: 68fb ldr r3, [r7, #12]
  40634. 8011514: 68ba ldr r2, [r7, #8]
  40635. 8011516: fb02 f303 mul.w r3, r2, r3
  40636. 801151a: 61fb str r3, [r7, #28]
  40637. alignment requirements of the Queue_t structure - which in this case
  40638. is an int8_t *. Therefore, whenever the stack alignment requirements
  40639. are greater than or equal to the pointer to char requirements the cast
  40640. is safe. In other cases alignment requirements are not strict (one or
  40641. two bytes). */
  40642. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /*lint !e9087 !e9079 see comment above. */
  40643. 801151c: 69fb ldr r3, [r7, #28]
  40644. 801151e: 3350 adds r3, #80 @ 0x50
  40645. 8011520: 4618 mov r0, r3
  40646. 8011522: f003 fc23 bl 8014d6c <pvPortMalloc>
  40647. 8011526: 61b8 str r0, [r7, #24]
  40648. if( pxNewQueue != NULL )
  40649. 8011528: 69bb ldr r3, [r7, #24]
  40650. 801152a: 2b00 cmp r3, #0
  40651. 801152c: d011 beq.n 8011552 <xQueueGenericCreate+0x6c>
  40652. {
  40653. /* Jump past the queue structure to find the location of the queue
  40654. storage area. */
  40655. pucQueueStorage = ( uint8_t * ) pxNewQueue;
  40656. 801152e: 69bb ldr r3, [r7, #24]
  40657. 8011530: 617b str r3, [r7, #20]
  40658. pucQueueStorage += sizeof( Queue_t ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */
  40659. 8011532: 697b ldr r3, [r7, #20]
  40660. 8011534: 3350 adds r3, #80 @ 0x50
  40661. 8011536: 617b str r3, [r7, #20]
  40662. #if( configSUPPORT_STATIC_ALLOCATION == 1 )
  40663. {
  40664. /* Queues can be created either statically or dynamically, so
  40665. note this task was created dynamically in case it is later
  40666. deleted. */
  40667. pxNewQueue->ucStaticallyAllocated = pdFALSE;
  40668. 8011538: 69bb ldr r3, [r7, #24]
  40669. 801153a: 2200 movs r2, #0
  40670. 801153c: f883 2046 strb.w r2, [r3, #70] @ 0x46
  40671. }
  40672. #endif /* configSUPPORT_STATIC_ALLOCATION */
  40673. prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue );
  40674. 8011540: 79fa ldrb r2, [r7, #7]
  40675. 8011542: 69bb ldr r3, [r7, #24]
  40676. 8011544: 9300 str r3, [sp, #0]
  40677. 8011546: 4613 mov r3, r2
  40678. 8011548: 697a ldr r2, [r7, #20]
  40679. 801154a: 68b9 ldr r1, [r7, #8]
  40680. 801154c: 68f8 ldr r0, [r7, #12]
  40681. 801154e: f000 f805 bl 801155c <prvInitialiseNewQueue>
  40682. {
  40683. traceQUEUE_CREATE_FAILED( ucQueueType );
  40684. mtCOVERAGE_TEST_MARKER();
  40685. }
  40686. return pxNewQueue;
  40687. 8011552: 69bb ldr r3, [r7, #24]
  40688. }
  40689. 8011554: 4618 mov r0, r3
  40690. 8011556: 3720 adds r7, #32
  40691. 8011558: 46bd mov sp, r7
  40692. 801155a: bd80 pop {r7, pc}
  40693. 0801155c <prvInitialiseNewQueue>:
  40694. #endif /* configSUPPORT_STATIC_ALLOCATION */
  40695. /*-----------------------------------------------------------*/
  40696. static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue )
  40697. {
  40698. 801155c: b580 push {r7, lr}
  40699. 801155e: b084 sub sp, #16
  40700. 8011560: af00 add r7, sp, #0
  40701. 8011562: 60f8 str r0, [r7, #12]
  40702. 8011564: 60b9 str r1, [r7, #8]
  40703. 8011566: 607a str r2, [r7, #4]
  40704. 8011568: 70fb strb r3, [r7, #3]
  40705. /* Remove compiler warnings about unused parameters should
  40706. configUSE_TRACE_FACILITY not be set to 1. */
  40707. ( void ) ucQueueType;
  40708. if( uxItemSize == ( UBaseType_t ) 0 )
  40709. 801156a: 68bb ldr r3, [r7, #8]
  40710. 801156c: 2b00 cmp r3, #0
  40711. 801156e: d103 bne.n 8011578 <prvInitialiseNewQueue+0x1c>
  40712. {
  40713. /* No RAM was allocated for the queue storage area, but PC head cannot
  40714. be set to NULL because NULL is used as a key to say the queue is used as
  40715. a mutex. Therefore just set pcHead to point to the queue as a benign
  40716. value that is known to be within the memory map. */
  40717. pxNewQueue->pcHead = ( int8_t * ) pxNewQueue;
  40718. 8011570: 69bb ldr r3, [r7, #24]
  40719. 8011572: 69ba ldr r2, [r7, #24]
  40720. 8011574: 601a str r2, [r3, #0]
  40721. 8011576: e002 b.n 801157e <prvInitialiseNewQueue+0x22>
  40722. }
  40723. else
  40724. {
  40725. /* Set the head to the start of the queue storage area. */
  40726. pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage;
  40727. 8011578: 69bb ldr r3, [r7, #24]
  40728. 801157a: 687a ldr r2, [r7, #4]
  40729. 801157c: 601a str r2, [r3, #0]
  40730. }
  40731. /* Initialise the queue members as described where the queue type is
  40732. defined. */
  40733. pxNewQueue->uxLength = uxQueueLength;
  40734. 801157e: 69bb ldr r3, [r7, #24]
  40735. 8011580: 68fa ldr r2, [r7, #12]
  40736. 8011582: 63da str r2, [r3, #60] @ 0x3c
  40737. pxNewQueue->uxItemSize = uxItemSize;
  40738. 8011584: 69bb ldr r3, [r7, #24]
  40739. 8011586: 68ba ldr r2, [r7, #8]
  40740. 8011588: 641a str r2, [r3, #64] @ 0x40
  40741. ( void ) xQueueGenericReset( pxNewQueue, pdTRUE );
  40742. 801158a: 2101 movs r1, #1
  40743. 801158c: 69b8 ldr r0, [r7, #24]
  40744. 801158e: f7ff fec3 bl 8011318 <xQueueGenericReset>
  40745. #if ( configUSE_TRACE_FACILITY == 1 )
  40746. {
  40747. pxNewQueue->ucQueueType = ucQueueType;
  40748. 8011592: 69bb ldr r3, [r7, #24]
  40749. 8011594: 78fa ldrb r2, [r7, #3]
  40750. 8011596: f883 204c strb.w r2, [r3, #76] @ 0x4c
  40751. pxNewQueue->pxQueueSetContainer = NULL;
  40752. }
  40753. #endif /* configUSE_QUEUE_SETS */
  40754. traceQUEUE_CREATE( pxNewQueue );
  40755. }
  40756. 801159a: bf00 nop
  40757. 801159c: 3710 adds r7, #16
  40758. 801159e: 46bd mov sp, r7
  40759. 80115a0: bd80 pop {r7, pc}
  40760. 080115a2 <prvInitialiseMutex>:
  40761. /*-----------------------------------------------------------*/
  40762. #if( configUSE_MUTEXES == 1 )
  40763. static void prvInitialiseMutex( Queue_t *pxNewQueue )
  40764. {
  40765. 80115a2: b580 push {r7, lr}
  40766. 80115a4: b082 sub sp, #8
  40767. 80115a6: af00 add r7, sp, #0
  40768. 80115a8: 6078 str r0, [r7, #4]
  40769. if( pxNewQueue != NULL )
  40770. 80115aa: 687b ldr r3, [r7, #4]
  40771. 80115ac: 2b00 cmp r3, #0
  40772. 80115ae: d00e beq.n 80115ce <prvInitialiseMutex+0x2c>
  40773. {
  40774. /* The queue create function will set all the queue structure members
  40775. correctly for a generic queue, but this function is creating a
  40776. mutex. Overwrite those members that need to be set differently -
  40777. in particular the information required for priority inheritance. */
  40778. pxNewQueue->u.xSemaphore.xMutexHolder = NULL;
  40779. 80115b0: 687b ldr r3, [r7, #4]
  40780. 80115b2: 2200 movs r2, #0
  40781. 80115b4: 609a str r2, [r3, #8]
  40782. pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX;
  40783. 80115b6: 687b ldr r3, [r7, #4]
  40784. 80115b8: 2200 movs r2, #0
  40785. 80115ba: 601a str r2, [r3, #0]
  40786. /* In case this is a recursive mutex. */
  40787. pxNewQueue->u.xSemaphore.uxRecursiveCallCount = 0;
  40788. 80115bc: 687b ldr r3, [r7, #4]
  40789. 80115be: 2200 movs r2, #0
  40790. 80115c0: 60da str r2, [r3, #12]
  40791. traceCREATE_MUTEX( pxNewQueue );
  40792. /* Start with the semaphore in the expected state. */
  40793. ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK );
  40794. 80115c2: 2300 movs r3, #0
  40795. 80115c4: 2200 movs r2, #0
  40796. 80115c6: 2100 movs r1, #0
  40797. 80115c8: 6878 ldr r0, [r7, #4]
  40798. 80115ca: f000 f911 bl 80117f0 <xQueueGenericSend>
  40799. }
  40800. else
  40801. {
  40802. traceCREATE_MUTEX_FAILED();
  40803. }
  40804. }
  40805. 80115ce: bf00 nop
  40806. 80115d0: 3708 adds r7, #8
  40807. 80115d2: 46bd mov sp, r7
  40808. 80115d4: bd80 pop {r7, pc}
  40809. 080115d6 <xQueueCreateMutex>:
  40810. /*-----------------------------------------------------------*/
  40811. #if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
  40812. QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType )
  40813. {
  40814. 80115d6: b580 push {r7, lr}
  40815. 80115d8: b086 sub sp, #24
  40816. 80115da: af00 add r7, sp, #0
  40817. 80115dc: 4603 mov r3, r0
  40818. 80115de: 71fb strb r3, [r7, #7]
  40819. QueueHandle_t xNewQueue;
  40820. const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0;
  40821. 80115e0: 2301 movs r3, #1
  40822. 80115e2: 617b str r3, [r7, #20]
  40823. 80115e4: 2300 movs r3, #0
  40824. 80115e6: 613b str r3, [r7, #16]
  40825. xNewQueue = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType );
  40826. 80115e8: 79fb ldrb r3, [r7, #7]
  40827. 80115ea: 461a mov r2, r3
  40828. 80115ec: 6939 ldr r1, [r7, #16]
  40829. 80115ee: 6978 ldr r0, [r7, #20]
  40830. 80115f0: f7ff ff79 bl 80114e6 <xQueueGenericCreate>
  40831. 80115f4: 60f8 str r0, [r7, #12]
  40832. prvInitialiseMutex( ( Queue_t * ) xNewQueue );
  40833. 80115f6: 68f8 ldr r0, [r7, #12]
  40834. 80115f8: f7ff ffd3 bl 80115a2 <prvInitialiseMutex>
  40835. return xNewQueue;
  40836. 80115fc: 68fb ldr r3, [r7, #12]
  40837. }
  40838. 80115fe: 4618 mov r0, r3
  40839. 8011600: 3718 adds r7, #24
  40840. 8011602: 46bd mov sp, r7
  40841. 8011604: bd80 pop {r7, pc}
  40842. 08011606 <xQueueCreateMutexStatic>:
  40843. /*-----------------------------------------------------------*/
  40844. #if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
  40845. QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue )
  40846. {
  40847. 8011606: b580 push {r7, lr}
  40848. 8011608: b088 sub sp, #32
  40849. 801160a: af02 add r7, sp, #8
  40850. 801160c: 4603 mov r3, r0
  40851. 801160e: 6039 str r1, [r7, #0]
  40852. 8011610: 71fb strb r3, [r7, #7]
  40853. QueueHandle_t xNewQueue;
  40854. const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0;
  40855. 8011612: 2301 movs r3, #1
  40856. 8011614: 617b str r3, [r7, #20]
  40857. 8011616: 2300 movs r3, #0
  40858. 8011618: 613b str r3, [r7, #16]
  40859. /* Prevent compiler warnings about unused parameters if
  40860. configUSE_TRACE_FACILITY does not equal 1. */
  40861. ( void ) ucQueueType;
  40862. xNewQueue = xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType );
  40863. 801161a: 79fb ldrb r3, [r7, #7]
  40864. 801161c: 9300 str r3, [sp, #0]
  40865. 801161e: 683b ldr r3, [r7, #0]
  40866. 8011620: 2200 movs r2, #0
  40867. 8011622: 6939 ldr r1, [r7, #16]
  40868. 8011624: 6978 ldr r0, [r7, #20]
  40869. 8011626: f7ff fee1 bl 80113ec <xQueueGenericCreateStatic>
  40870. 801162a: 60f8 str r0, [r7, #12]
  40871. prvInitialiseMutex( ( Queue_t * ) xNewQueue );
  40872. 801162c: 68f8 ldr r0, [r7, #12]
  40873. 801162e: f7ff ffb8 bl 80115a2 <prvInitialiseMutex>
  40874. return xNewQueue;
  40875. 8011632: 68fb ldr r3, [r7, #12]
  40876. }
  40877. 8011634: 4618 mov r0, r3
  40878. 8011636: 3718 adds r7, #24
  40879. 8011638: 46bd mov sp, r7
  40880. 801163a: bd80 pop {r7, pc}
  40881. 0801163c <xQueueGiveMutexRecursive>:
  40882. /*-----------------------------------------------------------*/
  40883. #if ( configUSE_RECURSIVE_MUTEXES == 1 )
  40884. BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex )
  40885. {
  40886. 801163c: b590 push {r4, r7, lr}
  40887. 801163e: b087 sub sp, #28
  40888. 8011640: af00 add r7, sp, #0
  40889. 8011642: 6078 str r0, [r7, #4]
  40890. BaseType_t xReturn;
  40891. Queue_t * const pxMutex = ( Queue_t * ) xMutex;
  40892. 8011644: 687b ldr r3, [r7, #4]
  40893. 8011646: 613b str r3, [r7, #16]
  40894. configASSERT( pxMutex );
  40895. 8011648: 693b ldr r3, [r7, #16]
  40896. 801164a: 2b00 cmp r3, #0
  40897. 801164c: d10b bne.n 8011666 <xQueueGiveMutexRecursive+0x2a>
  40898. __asm volatile
  40899. 801164e: f04f 0350 mov.w r3, #80 @ 0x50
  40900. 8011652: f383 8811 msr BASEPRI, r3
  40901. 8011656: f3bf 8f6f isb sy
  40902. 801165a: f3bf 8f4f dsb sy
  40903. 801165e: 60fb str r3, [r7, #12]
  40904. }
  40905. 8011660: bf00 nop
  40906. 8011662: bf00 nop
  40907. 8011664: e7fd b.n 8011662 <xQueueGiveMutexRecursive+0x26>
  40908. change outside of this task. If this task does not hold the mutex then
  40909. pxMutexHolder can never coincidentally equal the tasks handle, and as
  40910. this is the only condition we are interested in it does not matter if
  40911. pxMutexHolder is accessed simultaneously by another task. Therefore no
  40912. mutual exclusion is required to test the pxMutexHolder variable. */
  40913. if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() )
  40914. 8011666: 693b ldr r3, [r7, #16]
  40915. 8011668: 689c ldr r4, [r3, #8]
  40916. 801166a: f002 f9af bl 80139cc <xTaskGetCurrentTaskHandle>
  40917. 801166e: 4603 mov r3, r0
  40918. 8011670: 429c cmp r4, r3
  40919. 8011672: d111 bne.n 8011698 <xQueueGiveMutexRecursive+0x5c>
  40920. /* uxRecursiveCallCount cannot be zero if xMutexHolder is equal to
  40921. the task handle, therefore no underflow check is required. Also,
  40922. uxRecursiveCallCount is only modified by the mutex holder, and as
  40923. there can only be one, no mutual exclusion is required to modify the
  40924. uxRecursiveCallCount member. */
  40925. ( pxMutex->u.xSemaphore.uxRecursiveCallCount )--;
  40926. 8011674: 693b ldr r3, [r7, #16]
  40927. 8011676: 68db ldr r3, [r3, #12]
  40928. 8011678: 1e5a subs r2, r3, #1
  40929. 801167a: 693b ldr r3, [r7, #16]
  40930. 801167c: 60da str r2, [r3, #12]
  40931. /* Has the recursive call count unwound to 0? */
  40932. if( pxMutex->u.xSemaphore.uxRecursiveCallCount == ( UBaseType_t ) 0 )
  40933. 801167e: 693b ldr r3, [r7, #16]
  40934. 8011680: 68db ldr r3, [r3, #12]
  40935. 8011682: 2b00 cmp r3, #0
  40936. 8011684: d105 bne.n 8011692 <xQueueGiveMutexRecursive+0x56>
  40937. {
  40938. /* Return the mutex. This will automatically unblock any other
  40939. task that might be waiting to access the mutex. */
  40940. ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK );
  40941. 8011686: 2300 movs r3, #0
  40942. 8011688: 2200 movs r2, #0
  40943. 801168a: 2100 movs r1, #0
  40944. 801168c: 6938 ldr r0, [r7, #16]
  40945. 801168e: f000 f8af bl 80117f0 <xQueueGenericSend>
  40946. else
  40947. {
  40948. mtCOVERAGE_TEST_MARKER();
  40949. }
  40950. xReturn = pdPASS;
  40951. 8011692: 2301 movs r3, #1
  40952. 8011694: 617b str r3, [r7, #20]
  40953. 8011696: e001 b.n 801169c <xQueueGiveMutexRecursive+0x60>
  40954. }
  40955. else
  40956. {
  40957. /* The mutex cannot be given because the calling task is not the
  40958. holder. */
  40959. xReturn = pdFAIL;
  40960. 8011698: 2300 movs r3, #0
  40961. 801169a: 617b str r3, [r7, #20]
  40962. traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex );
  40963. }
  40964. return xReturn;
  40965. 801169c: 697b ldr r3, [r7, #20]
  40966. }
  40967. 801169e: 4618 mov r0, r3
  40968. 80116a0: 371c adds r7, #28
  40969. 80116a2: 46bd mov sp, r7
  40970. 80116a4: bd90 pop {r4, r7, pc}
  40971. 080116a6 <xQueueTakeMutexRecursive>:
  40972. /*-----------------------------------------------------------*/
  40973. #if ( configUSE_RECURSIVE_MUTEXES == 1 )
  40974. BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait )
  40975. {
  40976. 80116a6: b590 push {r4, r7, lr}
  40977. 80116a8: b087 sub sp, #28
  40978. 80116aa: af00 add r7, sp, #0
  40979. 80116ac: 6078 str r0, [r7, #4]
  40980. 80116ae: 6039 str r1, [r7, #0]
  40981. BaseType_t xReturn;
  40982. Queue_t * const pxMutex = ( Queue_t * ) xMutex;
  40983. 80116b0: 687b ldr r3, [r7, #4]
  40984. 80116b2: 613b str r3, [r7, #16]
  40985. configASSERT( pxMutex );
  40986. 80116b4: 693b ldr r3, [r7, #16]
  40987. 80116b6: 2b00 cmp r3, #0
  40988. 80116b8: d10b bne.n 80116d2 <xQueueTakeMutexRecursive+0x2c>
  40989. __asm volatile
  40990. 80116ba: f04f 0350 mov.w r3, #80 @ 0x50
  40991. 80116be: f383 8811 msr BASEPRI, r3
  40992. 80116c2: f3bf 8f6f isb sy
  40993. 80116c6: f3bf 8f4f dsb sy
  40994. 80116ca: 60fb str r3, [r7, #12]
  40995. }
  40996. 80116cc: bf00 nop
  40997. 80116ce: bf00 nop
  40998. 80116d0: e7fd b.n 80116ce <xQueueTakeMutexRecursive+0x28>
  40999. /* Comments regarding mutual exclusion as per those within
  41000. xQueueGiveMutexRecursive(). */
  41001. traceTAKE_MUTEX_RECURSIVE( pxMutex );
  41002. if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() )
  41003. 80116d2: 693b ldr r3, [r7, #16]
  41004. 80116d4: 689c ldr r4, [r3, #8]
  41005. 80116d6: f002 f979 bl 80139cc <xTaskGetCurrentTaskHandle>
  41006. 80116da: 4603 mov r3, r0
  41007. 80116dc: 429c cmp r4, r3
  41008. 80116de: d107 bne.n 80116f0 <xQueueTakeMutexRecursive+0x4a>
  41009. {
  41010. ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++;
  41011. 80116e0: 693b ldr r3, [r7, #16]
  41012. 80116e2: 68db ldr r3, [r3, #12]
  41013. 80116e4: 1c5a adds r2, r3, #1
  41014. 80116e6: 693b ldr r3, [r7, #16]
  41015. 80116e8: 60da str r2, [r3, #12]
  41016. xReturn = pdPASS;
  41017. 80116ea: 2301 movs r3, #1
  41018. 80116ec: 617b str r3, [r7, #20]
  41019. 80116ee: e00c b.n 801170a <xQueueTakeMutexRecursive+0x64>
  41020. }
  41021. else
  41022. {
  41023. xReturn = xQueueSemaphoreTake( pxMutex, xTicksToWait );
  41024. 80116f0: 6839 ldr r1, [r7, #0]
  41025. 80116f2: 6938 ldr r0, [r7, #16]
  41026. 80116f4: f000 fb8e bl 8011e14 <xQueueSemaphoreTake>
  41027. 80116f8: 6178 str r0, [r7, #20]
  41028. /* pdPASS will only be returned if the mutex was successfully
  41029. obtained. The calling task may have entered the Blocked state
  41030. before reaching here. */
  41031. if( xReturn != pdFAIL )
  41032. 80116fa: 697b ldr r3, [r7, #20]
  41033. 80116fc: 2b00 cmp r3, #0
  41034. 80116fe: d004 beq.n 801170a <xQueueTakeMutexRecursive+0x64>
  41035. {
  41036. ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++;
  41037. 8011700: 693b ldr r3, [r7, #16]
  41038. 8011702: 68db ldr r3, [r3, #12]
  41039. 8011704: 1c5a adds r2, r3, #1
  41040. 8011706: 693b ldr r3, [r7, #16]
  41041. 8011708: 60da str r2, [r3, #12]
  41042. {
  41043. traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex );
  41044. }
  41045. }
  41046. return xReturn;
  41047. 801170a: 697b ldr r3, [r7, #20]
  41048. }
  41049. 801170c: 4618 mov r0, r3
  41050. 801170e: 371c adds r7, #28
  41051. 8011710: 46bd mov sp, r7
  41052. 8011712: bd90 pop {r4, r7, pc}
  41053. 08011714 <xQueueCreateCountingSemaphoreStatic>:
  41054. /*-----------------------------------------------------------*/
  41055. #if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
  41056. QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue )
  41057. {
  41058. 8011714: b580 push {r7, lr}
  41059. 8011716: b08a sub sp, #40 @ 0x28
  41060. 8011718: af02 add r7, sp, #8
  41061. 801171a: 60f8 str r0, [r7, #12]
  41062. 801171c: 60b9 str r1, [r7, #8]
  41063. 801171e: 607a str r2, [r7, #4]
  41064. QueueHandle_t xHandle;
  41065. configASSERT( uxMaxCount != 0 );
  41066. 8011720: 68fb ldr r3, [r7, #12]
  41067. 8011722: 2b00 cmp r3, #0
  41068. 8011724: d10b bne.n 801173e <xQueueCreateCountingSemaphoreStatic+0x2a>
  41069. __asm volatile
  41070. 8011726: f04f 0350 mov.w r3, #80 @ 0x50
  41071. 801172a: f383 8811 msr BASEPRI, r3
  41072. 801172e: f3bf 8f6f isb sy
  41073. 8011732: f3bf 8f4f dsb sy
  41074. 8011736: 61bb str r3, [r7, #24]
  41075. }
  41076. 8011738: bf00 nop
  41077. 801173a: bf00 nop
  41078. 801173c: e7fd b.n 801173a <xQueueCreateCountingSemaphoreStatic+0x26>
  41079. configASSERT( uxInitialCount <= uxMaxCount );
  41080. 801173e: 68ba ldr r2, [r7, #8]
  41081. 8011740: 68fb ldr r3, [r7, #12]
  41082. 8011742: 429a cmp r2, r3
  41083. 8011744: d90b bls.n 801175e <xQueueCreateCountingSemaphoreStatic+0x4a>
  41084. __asm volatile
  41085. 8011746: f04f 0350 mov.w r3, #80 @ 0x50
  41086. 801174a: f383 8811 msr BASEPRI, r3
  41087. 801174e: f3bf 8f6f isb sy
  41088. 8011752: f3bf 8f4f dsb sy
  41089. 8011756: 617b str r3, [r7, #20]
  41090. }
  41091. 8011758: bf00 nop
  41092. 801175a: bf00 nop
  41093. 801175c: e7fd b.n 801175a <xQueueCreateCountingSemaphoreStatic+0x46>
  41094. xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE );
  41095. 801175e: 2302 movs r3, #2
  41096. 8011760: 9300 str r3, [sp, #0]
  41097. 8011762: 687b ldr r3, [r7, #4]
  41098. 8011764: 2200 movs r2, #0
  41099. 8011766: 2100 movs r1, #0
  41100. 8011768: 68f8 ldr r0, [r7, #12]
  41101. 801176a: f7ff fe3f bl 80113ec <xQueueGenericCreateStatic>
  41102. 801176e: 61f8 str r0, [r7, #28]
  41103. if( xHandle != NULL )
  41104. 8011770: 69fb ldr r3, [r7, #28]
  41105. 8011772: 2b00 cmp r3, #0
  41106. 8011774: d002 beq.n 801177c <xQueueCreateCountingSemaphoreStatic+0x68>
  41107. {
  41108. ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;
  41109. 8011776: 69fb ldr r3, [r7, #28]
  41110. 8011778: 68ba ldr r2, [r7, #8]
  41111. 801177a: 639a str r2, [r3, #56] @ 0x38
  41112. else
  41113. {
  41114. traceCREATE_COUNTING_SEMAPHORE_FAILED();
  41115. }
  41116. return xHandle;
  41117. 801177c: 69fb ldr r3, [r7, #28]
  41118. }
  41119. 801177e: 4618 mov r0, r3
  41120. 8011780: 3720 adds r7, #32
  41121. 8011782: 46bd mov sp, r7
  41122. 8011784: bd80 pop {r7, pc}
  41123. 08011786 <xQueueCreateCountingSemaphore>:
  41124. /*-----------------------------------------------------------*/
  41125. #if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
  41126. QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount )
  41127. {
  41128. 8011786: b580 push {r7, lr}
  41129. 8011788: b086 sub sp, #24
  41130. 801178a: af00 add r7, sp, #0
  41131. 801178c: 6078 str r0, [r7, #4]
  41132. 801178e: 6039 str r1, [r7, #0]
  41133. QueueHandle_t xHandle;
  41134. configASSERT( uxMaxCount != 0 );
  41135. 8011790: 687b ldr r3, [r7, #4]
  41136. 8011792: 2b00 cmp r3, #0
  41137. 8011794: d10b bne.n 80117ae <xQueueCreateCountingSemaphore+0x28>
  41138. __asm volatile
  41139. 8011796: f04f 0350 mov.w r3, #80 @ 0x50
  41140. 801179a: f383 8811 msr BASEPRI, r3
  41141. 801179e: f3bf 8f6f isb sy
  41142. 80117a2: f3bf 8f4f dsb sy
  41143. 80117a6: 613b str r3, [r7, #16]
  41144. }
  41145. 80117a8: bf00 nop
  41146. 80117aa: bf00 nop
  41147. 80117ac: e7fd b.n 80117aa <xQueueCreateCountingSemaphore+0x24>
  41148. configASSERT( uxInitialCount <= uxMaxCount );
  41149. 80117ae: 683a ldr r2, [r7, #0]
  41150. 80117b0: 687b ldr r3, [r7, #4]
  41151. 80117b2: 429a cmp r2, r3
  41152. 80117b4: d90b bls.n 80117ce <xQueueCreateCountingSemaphore+0x48>
  41153. __asm volatile
  41154. 80117b6: f04f 0350 mov.w r3, #80 @ 0x50
  41155. 80117ba: f383 8811 msr BASEPRI, r3
  41156. 80117be: f3bf 8f6f isb sy
  41157. 80117c2: f3bf 8f4f dsb sy
  41158. 80117c6: 60fb str r3, [r7, #12]
  41159. }
  41160. 80117c8: bf00 nop
  41161. 80117ca: bf00 nop
  41162. 80117cc: e7fd b.n 80117ca <xQueueCreateCountingSemaphore+0x44>
  41163. xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE );
  41164. 80117ce: 2202 movs r2, #2
  41165. 80117d0: 2100 movs r1, #0
  41166. 80117d2: 6878 ldr r0, [r7, #4]
  41167. 80117d4: f7ff fe87 bl 80114e6 <xQueueGenericCreate>
  41168. 80117d8: 6178 str r0, [r7, #20]
  41169. if( xHandle != NULL )
  41170. 80117da: 697b ldr r3, [r7, #20]
  41171. 80117dc: 2b00 cmp r3, #0
  41172. 80117de: d002 beq.n 80117e6 <xQueueCreateCountingSemaphore+0x60>
  41173. {
  41174. ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;
  41175. 80117e0: 697b ldr r3, [r7, #20]
  41176. 80117e2: 683a ldr r2, [r7, #0]
  41177. 80117e4: 639a str r2, [r3, #56] @ 0x38
  41178. else
  41179. {
  41180. traceCREATE_COUNTING_SEMAPHORE_FAILED();
  41181. }
  41182. return xHandle;
  41183. 80117e6: 697b ldr r3, [r7, #20]
  41184. }
  41185. 80117e8: 4618 mov r0, r3
  41186. 80117ea: 3718 adds r7, #24
  41187. 80117ec: 46bd mov sp, r7
  41188. 80117ee: bd80 pop {r7, pc}
  41189. 080117f0 <xQueueGenericSend>:
  41190. #endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */
  41191. /*-----------------------------------------------------------*/
  41192. BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition )
  41193. {
  41194. 80117f0: b580 push {r7, lr}
  41195. 80117f2: b08e sub sp, #56 @ 0x38
  41196. 80117f4: af00 add r7, sp, #0
  41197. 80117f6: 60f8 str r0, [r7, #12]
  41198. 80117f8: 60b9 str r1, [r7, #8]
  41199. 80117fa: 607a str r2, [r7, #4]
  41200. 80117fc: 603b str r3, [r7, #0]
  41201. BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;
  41202. 80117fe: 2300 movs r3, #0
  41203. 8011800: 637b str r3, [r7, #52] @ 0x34
  41204. TimeOut_t xTimeOut;
  41205. Queue_t * const pxQueue = xQueue;
  41206. 8011802: 68fb ldr r3, [r7, #12]
  41207. 8011804: 633b str r3, [r7, #48] @ 0x30
  41208. configASSERT( pxQueue );
  41209. 8011806: 6b3b ldr r3, [r7, #48] @ 0x30
  41210. 8011808: 2b00 cmp r3, #0
  41211. 801180a: d10b bne.n 8011824 <xQueueGenericSend+0x34>
  41212. __asm volatile
  41213. 801180c: f04f 0350 mov.w r3, #80 @ 0x50
  41214. 8011810: f383 8811 msr BASEPRI, r3
  41215. 8011814: f3bf 8f6f isb sy
  41216. 8011818: f3bf 8f4f dsb sy
  41217. 801181c: 62bb str r3, [r7, #40] @ 0x28
  41218. }
  41219. 801181e: bf00 nop
  41220. 8011820: bf00 nop
  41221. 8011822: e7fd b.n 8011820 <xQueueGenericSend+0x30>
  41222. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  41223. 8011824: 68bb ldr r3, [r7, #8]
  41224. 8011826: 2b00 cmp r3, #0
  41225. 8011828: d103 bne.n 8011832 <xQueueGenericSend+0x42>
  41226. 801182a: 6b3b ldr r3, [r7, #48] @ 0x30
  41227. 801182c: 6c1b ldr r3, [r3, #64] @ 0x40
  41228. 801182e: 2b00 cmp r3, #0
  41229. 8011830: d101 bne.n 8011836 <xQueueGenericSend+0x46>
  41230. 8011832: 2301 movs r3, #1
  41231. 8011834: e000 b.n 8011838 <xQueueGenericSend+0x48>
  41232. 8011836: 2300 movs r3, #0
  41233. 8011838: 2b00 cmp r3, #0
  41234. 801183a: d10b bne.n 8011854 <xQueueGenericSend+0x64>
  41235. __asm volatile
  41236. 801183c: f04f 0350 mov.w r3, #80 @ 0x50
  41237. 8011840: f383 8811 msr BASEPRI, r3
  41238. 8011844: f3bf 8f6f isb sy
  41239. 8011848: f3bf 8f4f dsb sy
  41240. 801184c: 627b str r3, [r7, #36] @ 0x24
  41241. }
  41242. 801184e: bf00 nop
  41243. 8011850: bf00 nop
  41244. 8011852: e7fd b.n 8011850 <xQueueGenericSend+0x60>
  41245. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  41246. 8011854: 683b ldr r3, [r7, #0]
  41247. 8011856: 2b02 cmp r3, #2
  41248. 8011858: d103 bne.n 8011862 <xQueueGenericSend+0x72>
  41249. 801185a: 6b3b ldr r3, [r7, #48] @ 0x30
  41250. 801185c: 6bdb ldr r3, [r3, #60] @ 0x3c
  41251. 801185e: 2b01 cmp r3, #1
  41252. 8011860: d101 bne.n 8011866 <xQueueGenericSend+0x76>
  41253. 8011862: 2301 movs r3, #1
  41254. 8011864: e000 b.n 8011868 <xQueueGenericSend+0x78>
  41255. 8011866: 2300 movs r3, #0
  41256. 8011868: 2b00 cmp r3, #0
  41257. 801186a: d10b bne.n 8011884 <xQueueGenericSend+0x94>
  41258. __asm volatile
  41259. 801186c: f04f 0350 mov.w r3, #80 @ 0x50
  41260. 8011870: f383 8811 msr BASEPRI, r3
  41261. 8011874: f3bf 8f6f isb sy
  41262. 8011878: f3bf 8f4f dsb sy
  41263. 801187c: 623b str r3, [r7, #32]
  41264. }
  41265. 801187e: bf00 nop
  41266. 8011880: bf00 nop
  41267. 8011882: e7fd b.n 8011880 <xQueueGenericSend+0x90>
  41268. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  41269. {
  41270. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  41271. 8011884: f002 f8b2 bl 80139ec <xTaskGetSchedulerState>
  41272. 8011888: 4603 mov r3, r0
  41273. 801188a: 2b00 cmp r3, #0
  41274. 801188c: d102 bne.n 8011894 <xQueueGenericSend+0xa4>
  41275. 801188e: 687b ldr r3, [r7, #4]
  41276. 8011890: 2b00 cmp r3, #0
  41277. 8011892: d101 bne.n 8011898 <xQueueGenericSend+0xa8>
  41278. 8011894: 2301 movs r3, #1
  41279. 8011896: e000 b.n 801189a <xQueueGenericSend+0xaa>
  41280. 8011898: 2300 movs r3, #0
  41281. 801189a: 2b00 cmp r3, #0
  41282. 801189c: d10b bne.n 80118b6 <xQueueGenericSend+0xc6>
  41283. __asm volatile
  41284. 801189e: f04f 0350 mov.w r3, #80 @ 0x50
  41285. 80118a2: f383 8811 msr BASEPRI, r3
  41286. 80118a6: f3bf 8f6f isb sy
  41287. 80118aa: f3bf 8f4f dsb sy
  41288. 80118ae: 61fb str r3, [r7, #28]
  41289. }
  41290. 80118b0: bf00 nop
  41291. 80118b2: bf00 nop
  41292. 80118b4: e7fd b.n 80118b2 <xQueueGenericSend+0xc2>
  41293. /*lint -save -e904 This function relaxes the coding standard somewhat to
  41294. allow return statements within the function itself. This is done in the
  41295. interest of execution time efficiency. */
  41296. for( ;; )
  41297. {
  41298. taskENTER_CRITICAL();
  41299. 80118b6: f003 f937 bl 8014b28 <vPortEnterCritical>
  41300. {
  41301. /* Is there room on the queue now? The running task must be the
  41302. highest priority task wanting to access the queue. If the head item
  41303. in the queue is to be overwritten then it does not matter if the
  41304. queue is full. */
  41305. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  41306. 80118ba: 6b3b ldr r3, [r7, #48] @ 0x30
  41307. 80118bc: 6b9a ldr r2, [r3, #56] @ 0x38
  41308. 80118be: 6b3b ldr r3, [r7, #48] @ 0x30
  41309. 80118c0: 6bdb ldr r3, [r3, #60] @ 0x3c
  41310. 80118c2: 429a cmp r2, r3
  41311. 80118c4: d302 bcc.n 80118cc <xQueueGenericSend+0xdc>
  41312. 80118c6: 683b ldr r3, [r7, #0]
  41313. 80118c8: 2b02 cmp r3, #2
  41314. 80118ca: d129 bne.n 8011920 <xQueueGenericSend+0x130>
  41315. }
  41316. }
  41317. }
  41318. #else /* configUSE_QUEUE_SETS */
  41319. {
  41320. xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
  41321. 80118cc: 683a ldr r2, [r7, #0]
  41322. 80118ce: 68b9 ldr r1, [r7, #8]
  41323. 80118d0: 6b38 ldr r0, [r7, #48] @ 0x30
  41324. 80118d2: f000 fcab bl 801222c <prvCopyDataToQueue>
  41325. 80118d6: 62f8 str r0, [r7, #44] @ 0x2c
  41326. /* If there was a task waiting for data to arrive on the
  41327. queue then unblock it now. */
  41328. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  41329. 80118d8: 6b3b ldr r3, [r7, #48] @ 0x30
  41330. 80118da: 6a5b ldr r3, [r3, #36] @ 0x24
  41331. 80118dc: 2b00 cmp r3, #0
  41332. 80118de: d010 beq.n 8011902 <xQueueGenericSend+0x112>
  41333. {
  41334. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  41335. 80118e0: 6b3b ldr r3, [r7, #48] @ 0x30
  41336. 80118e2: 3324 adds r3, #36 @ 0x24
  41337. 80118e4: 4618 mov r0, r3
  41338. 80118e6: f001 fe83 bl 80135f0 <xTaskRemoveFromEventList>
  41339. 80118ea: 4603 mov r3, r0
  41340. 80118ec: 2b00 cmp r3, #0
  41341. 80118ee: d013 beq.n 8011918 <xQueueGenericSend+0x128>
  41342. {
  41343. /* The unblocked task has a priority higher than
  41344. our own so yield immediately. Yes it is ok to do
  41345. this from within the critical section - the kernel
  41346. takes care of that. */
  41347. queueYIELD_IF_USING_PREEMPTION();
  41348. 80118f0: 4b3f ldr r3, [pc, #252] @ (80119f0 <xQueueGenericSend+0x200>)
  41349. 80118f2: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  41350. 80118f6: 601a str r2, [r3, #0]
  41351. 80118f8: f3bf 8f4f dsb sy
  41352. 80118fc: f3bf 8f6f isb sy
  41353. 8011900: e00a b.n 8011918 <xQueueGenericSend+0x128>
  41354. else
  41355. {
  41356. mtCOVERAGE_TEST_MARKER();
  41357. }
  41358. }
  41359. else if( xYieldRequired != pdFALSE )
  41360. 8011902: 6afb ldr r3, [r7, #44] @ 0x2c
  41361. 8011904: 2b00 cmp r3, #0
  41362. 8011906: d007 beq.n 8011918 <xQueueGenericSend+0x128>
  41363. {
  41364. /* This path is a special case that will only get
  41365. executed if the task was holding multiple mutexes and
  41366. the mutexes were given back in an order that is
  41367. different to that in which they were taken. */
  41368. queueYIELD_IF_USING_PREEMPTION();
  41369. 8011908: 4b39 ldr r3, [pc, #228] @ (80119f0 <xQueueGenericSend+0x200>)
  41370. 801190a: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  41371. 801190e: 601a str r2, [r3, #0]
  41372. 8011910: f3bf 8f4f dsb sy
  41373. 8011914: f3bf 8f6f isb sy
  41374. mtCOVERAGE_TEST_MARKER();
  41375. }
  41376. }
  41377. #endif /* configUSE_QUEUE_SETS */
  41378. taskEXIT_CRITICAL();
  41379. 8011918: f003 f938 bl 8014b8c <vPortExitCritical>
  41380. return pdPASS;
  41381. 801191c: 2301 movs r3, #1
  41382. 801191e: e063 b.n 80119e8 <xQueueGenericSend+0x1f8>
  41383. }
  41384. else
  41385. {
  41386. if( xTicksToWait == ( TickType_t ) 0 )
  41387. 8011920: 687b ldr r3, [r7, #4]
  41388. 8011922: 2b00 cmp r3, #0
  41389. 8011924: d103 bne.n 801192e <xQueueGenericSend+0x13e>
  41390. {
  41391. /* The queue was full and no block time is specified (or
  41392. the block time has expired) so leave now. */
  41393. taskEXIT_CRITICAL();
  41394. 8011926: f003 f931 bl 8014b8c <vPortExitCritical>
  41395. /* Return to the original privilege level before exiting
  41396. the function. */
  41397. traceQUEUE_SEND_FAILED( pxQueue );
  41398. return errQUEUE_FULL;
  41399. 801192a: 2300 movs r3, #0
  41400. 801192c: e05c b.n 80119e8 <xQueueGenericSend+0x1f8>
  41401. }
  41402. else if( xEntryTimeSet == pdFALSE )
  41403. 801192e: 6b7b ldr r3, [r7, #52] @ 0x34
  41404. 8011930: 2b00 cmp r3, #0
  41405. 8011932: d106 bne.n 8011942 <xQueueGenericSend+0x152>
  41406. {
  41407. /* The queue was full and a block time was specified so
  41408. configure the timeout structure. */
  41409. vTaskInternalSetTimeOutState( &xTimeOut );
  41410. 8011934: f107 0314 add.w r3, r7, #20
  41411. 8011938: 4618 mov r0, r3
  41412. 801193a: f001 fee5 bl 8013708 <vTaskInternalSetTimeOutState>
  41413. xEntryTimeSet = pdTRUE;
  41414. 801193e: 2301 movs r3, #1
  41415. 8011940: 637b str r3, [r7, #52] @ 0x34
  41416. /* Entry time was already set. */
  41417. mtCOVERAGE_TEST_MARKER();
  41418. }
  41419. }
  41420. }
  41421. taskEXIT_CRITICAL();
  41422. 8011942: f003 f923 bl 8014b8c <vPortExitCritical>
  41423. /* Interrupts and other tasks can send to and receive from the queue
  41424. now the critical section has been exited. */
  41425. vTaskSuspendAll();
  41426. 8011946: f001 fc05 bl 8013154 <vTaskSuspendAll>
  41427. prvLockQueue( pxQueue );
  41428. 801194a: f003 f8ed bl 8014b28 <vPortEnterCritical>
  41429. 801194e: 6b3b ldr r3, [r7, #48] @ 0x30
  41430. 8011950: f893 3044 ldrb.w r3, [r3, #68] @ 0x44
  41431. 8011954: b25b sxtb r3, r3
  41432. 8011956: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  41433. 801195a: d103 bne.n 8011964 <xQueueGenericSend+0x174>
  41434. 801195c: 6b3b ldr r3, [r7, #48] @ 0x30
  41435. 801195e: 2200 movs r2, #0
  41436. 8011960: f883 2044 strb.w r2, [r3, #68] @ 0x44
  41437. 8011964: 6b3b ldr r3, [r7, #48] @ 0x30
  41438. 8011966: f893 3045 ldrb.w r3, [r3, #69] @ 0x45
  41439. 801196a: b25b sxtb r3, r3
  41440. 801196c: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  41441. 8011970: d103 bne.n 801197a <xQueueGenericSend+0x18a>
  41442. 8011972: 6b3b ldr r3, [r7, #48] @ 0x30
  41443. 8011974: 2200 movs r2, #0
  41444. 8011976: f883 2045 strb.w r2, [r3, #69] @ 0x45
  41445. 801197a: f003 f907 bl 8014b8c <vPortExitCritical>
  41446. /* Update the timeout state to see if it has expired yet. */
  41447. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  41448. 801197e: 1d3a adds r2, r7, #4
  41449. 8011980: f107 0314 add.w r3, r7, #20
  41450. 8011984: 4611 mov r1, r2
  41451. 8011986: 4618 mov r0, r3
  41452. 8011988: f001 fed4 bl 8013734 <xTaskCheckForTimeOut>
  41453. 801198c: 4603 mov r3, r0
  41454. 801198e: 2b00 cmp r3, #0
  41455. 8011990: d124 bne.n 80119dc <xQueueGenericSend+0x1ec>
  41456. {
  41457. if( prvIsQueueFull( pxQueue ) != pdFALSE )
  41458. 8011992: 6b38 ldr r0, [r7, #48] @ 0x30
  41459. 8011994: f000 fd42 bl 801241c <prvIsQueueFull>
  41460. 8011998: 4603 mov r3, r0
  41461. 801199a: 2b00 cmp r3, #0
  41462. 801199c: d018 beq.n 80119d0 <xQueueGenericSend+0x1e0>
  41463. {
  41464. traceBLOCKING_ON_QUEUE_SEND( pxQueue );
  41465. vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );
  41466. 801199e: 6b3b ldr r3, [r7, #48] @ 0x30
  41467. 80119a0: 3310 adds r3, #16
  41468. 80119a2: 687a ldr r2, [r7, #4]
  41469. 80119a4: 4611 mov r1, r2
  41470. 80119a6: 4618 mov r0, r3
  41471. 80119a8: f001 fdd0 bl 801354c <vTaskPlaceOnEventList>
  41472. /* Unlocking the queue means queue events can effect the
  41473. event list. It is possible that interrupts occurring now
  41474. remove this task from the event list again - but as the
  41475. scheduler is suspended the task will go onto the pending
  41476. ready last instead of the actual ready list. */
  41477. prvUnlockQueue( pxQueue );
  41478. 80119ac: 6b38 ldr r0, [r7, #48] @ 0x30
  41479. 80119ae: f000 fccd bl 801234c <prvUnlockQueue>
  41480. /* Resuming the scheduler will move tasks from the pending
  41481. ready list into the ready list - so it is feasible that this
  41482. task is already in a ready list before it yields - in which
  41483. case the yield will not cause a context switch unless there
  41484. is also a higher priority task in the pending ready list. */
  41485. if( xTaskResumeAll() == pdFALSE )
  41486. 80119b2: f001 fbdd bl 8013170 <xTaskResumeAll>
  41487. 80119b6: 4603 mov r3, r0
  41488. 80119b8: 2b00 cmp r3, #0
  41489. 80119ba: f47f af7c bne.w 80118b6 <xQueueGenericSend+0xc6>
  41490. {
  41491. portYIELD_WITHIN_API();
  41492. 80119be: 4b0c ldr r3, [pc, #48] @ (80119f0 <xQueueGenericSend+0x200>)
  41493. 80119c0: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  41494. 80119c4: 601a str r2, [r3, #0]
  41495. 80119c6: f3bf 8f4f dsb sy
  41496. 80119ca: f3bf 8f6f isb sy
  41497. 80119ce: e772 b.n 80118b6 <xQueueGenericSend+0xc6>
  41498. }
  41499. }
  41500. else
  41501. {
  41502. /* Try again. */
  41503. prvUnlockQueue( pxQueue );
  41504. 80119d0: 6b38 ldr r0, [r7, #48] @ 0x30
  41505. 80119d2: f000 fcbb bl 801234c <prvUnlockQueue>
  41506. ( void ) xTaskResumeAll();
  41507. 80119d6: f001 fbcb bl 8013170 <xTaskResumeAll>
  41508. 80119da: e76c b.n 80118b6 <xQueueGenericSend+0xc6>
  41509. }
  41510. }
  41511. else
  41512. {
  41513. /* The timeout has expired. */
  41514. prvUnlockQueue( pxQueue );
  41515. 80119dc: 6b38 ldr r0, [r7, #48] @ 0x30
  41516. 80119de: f000 fcb5 bl 801234c <prvUnlockQueue>
  41517. ( void ) xTaskResumeAll();
  41518. 80119e2: f001 fbc5 bl 8013170 <xTaskResumeAll>
  41519. traceQUEUE_SEND_FAILED( pxQueue );
  41520. return errQUEUE_FULL;
  41521. 80119e6: 2300 movs r3, #0
  41522. }
  41523. } /*lint -restore */
  41524. }
  41525. 80119e8: 4618 mov r0, r3
  41526. 80119ea: 3738 adds r7, #56 @ 0x38
  41527. 80119ec: 46bd mov sp, r7
  41528. 80119ee: bd80 pop {r7, pc}
  41529. 80119f0: e000ed04 .word 0xe000ed04
  41530. 080119f4 <xQueueGenericSendFromISR>:
  41531. /*-----------------------------------------------------------*/
  41532. BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition )
  41533. {
  41534. 80119f4: b580 push {r7, lr}
  41535. 80119f6: b090 sub sp, #64 @ 0x40
  41536. 80119f8: af00 add r7, sp, #0
  41537. 80119fa: 60f8 str r0, [r7, #12]
  41538. 80119fc: 60b9 str r1, [r7, #8]
  41539. 80119fe: 607a str r2, [r7, #4]
  41540. 8011a00: 603b str r3, [r7, #0]
  41541. BaseType_t xReturn;
  41542. UBaseType_t uxSavedInterruptStatus;
  41543. Queue_t * const pxQueue = xQueue;
  41544. 8011a02: 68fb ldr r3, [r7, #12]
  41545. 8011a04: 63bb str r3, [r7, #56] @ 0x38
  41546. configASSERT( pxQueue );
  41547. 8011a06: 6bbb ldr r3, [r7, #56] @ 0x38
  41548. 8011a08: 2b00 cmp r3, #0
  41549. 8011a0a: d10b bne.n 8011a24 <xQueueGenericSendFromISR+0x30>
  41550. __asm volatile
  41551. 8011a0c: f04f 0350 mov.w r3, #80 @ 0x50
  41552. 8011a10: f383 8811 msr BASEPRI, r3
  41553. 8011a14: f3bf 8f6f isb sy
  41554. 8011a18: f3bf 8f4f dsb sy
  41555. 8011a1c: 62bb str r3, [r7, #40] @ 0x28
  41556. }
  41557. 8011a1e: bf00 nop
  41558. 8011a20: bf00 nop
  41559. 8011a22: e7fd b.n 8011a20 <xQueueGenericSendFromISR+0x2c>
  41560. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  41561. 8011a24: 68bb ldr r3, [r7, #8]
  41562. 8011a26: 2b00 cmp r3, #0
  41563. 8011a28: d103 bne.n 8011a32 <xQueueGenericSendFromISR+0x3e>
  41564. 8011a2a: 6bbb ldr r3, [r7, #56] @ 0x38
  41565. 8011a2c: 6c1b ldr r3, [r3, #64] @ 0x40
  41566. 8011a2e: 2b00 cmp r3, #0
  41567. 8011a30: d101 bne.n 8011a36 <xQueueGenericSendFromISR+0x42>
  41568. 8011a32: 2301 movs r3, #1
  41569. 8011a34: e000 b.n 8011a38 <xQueueGenericSendFromISR+0x44>
  41570. 8011a36: 2300 movs r3, #0
  41571. 8011a38: 2b00 cmp r3, #0
  41572. 8011a3a: d10b bne.n 8011a54 <xQueueGenericSendFromISR+0x60>
  41573. __asm volatile
  41574. 8011a3c: f04f 0350 mov.w r3, #80 @ 0x50
  41575. 8011a40: f383 8811 msr BASEPRI, r3
  41576. 8011a44: f3bf 8f6f isb sy
  41577. 8011a48: f3bf 8f4f dsb sy
  41578. 8011a4c: 627b str r3, [r7, #36] @ 0x24
  41579. }
  41580. 8011a4e: bf00 nop
  41581. 8011a50: bf00 nop
  41582. 8011a52: e7fd b.n 8011a50 <xQueueGenericSendFromISR+0x5c>
  41583. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  41584. 8011a54: 683b ldr r3, [r7, #0]
  41585. 8011a56: 2b02 cmp r3, #2
  41586. 8011a58: d103 bne.n 8011a62 <xQueueGenericSendFromISR+0x6e>
  41587. 8011a5a: 6bbb ldr r3, [r7, #56] @ 0x38
  41588. 8011a5c: 6bdb ldr r3, [r3, #60] @ 0x3c
  41589. 8011a5e: 2b01 cmp r3, #1
  41590. 8011a60: d101 bne.n 8011a66 <xQueueGenericSendFromISR+0x72>
  41591. 8011a62: 2301 movs r3, #1
  41592. 8011a64: e000 b.n 8011a68 <xQueueGenericSendFromISR+0x74>
  41593. 8011a66: 2300 movs r3, #0
  41594. 8011a68: 2b00 cmp r3, #0
  41595. 8011a6a: d10b bne.n 8011a84 <xQueueGenericSendFromISR+0x90>
  41596. __asm volatile
  41597. 8011a6c: f04f 0350 mov.w r3, #80 @ 0x50
  41598. 8011a70: f383 8811 msr BASEPRI, r3
  41599. 8011a74: f3bf 8f6f isb sy
  41600. 8011a78: f3bf 8f4f dsb sy
  41601. 8011a7c: 623b str r3, [r7, #32]
  41602. }
  41603. 8011a7e: bf00 nop
  41604. 8011a80: bf00 nop
  41605. 8011a82: e7fd b.n 8011a80 <xQueueGenericSendFromISR+0x8c>
  41606. that have been assigned a priority at or (logically) below the maximum
  41607. system call interrupt priority. FreeRTOS maintains a separate interrupt
  41608. safe API to ensure interrupt entry is as fast and as simple as possible.
  41609. More information (albeit Cortex-M specific) is provided on the following
  41610. link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
  41611. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  41612. 8011a84: f003 f930 bl 8014ce8 <vPortValidateInterruptPriority>
  41613. portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void )
  41614. {
  41615. uint32_t ulOriginalBASEPRI, ulNewBASEPRI;
  41616. __asm volatile
  41617. 8011a88: f3ef 8211 mrs r2, BASEPRI
  41618. 8011a8c: f04f 0350 mov.w r3, #80 @ 0x50
  41619. 8011a90: f383 8811 msr BASEPRI, r3
  41620. 8011a94: f3bf 8f6f isb sy
  41621. 8011a98: f3bf 8f4f dsb sy
  41622. 8011a9c: 61fa str r2, [r7, #28]
  41623. 8011a9e: 61bb str r3, [r7, #24]
  41624. :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
  41625. );
  41626. /* This return will not be reached but is necessary to prevent compiler
  41627. warnings. */
  41628. return ulOriginalBASEPRI;
  41629. 8011aa0: 69fb ldr r3, [r7, #28]
  41630. /* Similar to xQueueGenericSend, except without blocking if there is no room
  41631. in the queue. Also don't directly wake a task that was blocked on a queue
  41632. read, instead return a flag to say whether a context switch is required or
  41633. not (i.e. has a task with a higher priority than us been woken by this
  41634. post). */
  41635. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  41636. 8011aa2: 637b str r3, [r7, #52] @ 0x34
  41637. {
  41638. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  41639. 8011aa4: 6bbb ldr r3, [r7, #56] @ 0x38
  41640. 8011aa6: 6b9a ldr r2, [r3, #56] @ 0x38
  41641. 8011aa8: 6bbb ldr r3, [r7, #56] @ 0x38
  41642. 8011aaa: 6bdb ldr r3, [r3, #60] @ 0x3c
  41643. 8011aac: 429a cmp r2, r3
  41644. 8011aae: d302 bcc.n 8011ab6 <xQueueGenericSendFromISR+0xc2>
  41645. 8011ab0: 683b ldr r3, [r7, #0]
  41646. 8011ab2: 2b02 cmp r3, #2
  41647. 8011ab4: d12f bne.n 8011b16 <xQueueGenericSendFromISR+0x122>
  41648. {
  41649. const int8_t cTxLock = pxQueue->cTxLock;
  41650. 8011ab6: 6bbb ldr r3, [r7, #56] @ 0x38
  41651. 8011ab8: f893 3045 ldrb.w r3, [r3, #69] @ 0x45
  41652. 8011abc: f887 3033 strb.w r3, [r7, #51] @ 0x33
  41653. const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting;
  41654. 8011ac0: 6bbb ldr r3, [r7, #56] @ 0x38
  41655. 8011ac2: 6b9b ldr r3, [r3, #56] @ 0x38
  41656. 8011ac4: 62fb str r3, [r7, #44] @ 0x2c
  41657. /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a
  41658. semaphore or mutex. That means prvCopyDataToQueue() cannot result
  41659. in a task disinheriting a priority and prvCopyDataToQueue() can be
  41660. called here even though the disinherit function does not check if
  41661. the scheduler is suspended before accessing the ready lists. */
  41662. ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
  41663. 8011ac6: 683a ldr r2, [r7, #0]
  41664. 8011ac8: 68b9 ldr r1, [r7, #8]
  41665. 8011aca: 6bb8 ldr r0, [r7, #56] @ 0x38
  41666. 8011acc: f000 fbae bl 801222c <prvCopyDataToQueue>
  41667. /* The event list is not altered if the queue is locked. This will
  41668. be done when the queue is unlocked later. */
  41669. if( cTxLock == queueUNLOCKED )
  41670. 8011ad0: f997 3033 ldrsb.w r3, [r7, #51] @ 0x33
  41671. 8011ad4: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  41672. 8011ad8: d112 bne.n 8011b00 <xQueueGenericSendFromISR+0x10c>
  41673. }
  41674. }
  41675. }
  41676. #else /* configUSE_QUEUE_SETS */
  41677. {
  41678. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  41679. 8011ada: 6bbb ldr r3, [r7, #56] @ 0x38
  41680. 8011adc: 6a5b ldr r3, [r3, #36] @ 0x24
  41681. 8011ade: 2b00 cmp r3, #0
  41682. 8011ae0: d016 beq.n 8011b10 <xQueueGenericSendFromISR+0x11c>
  41683. {
  41684. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  41685. 8011ae2: 6bbb ldr r3, [r7, #56] @ 0x38
  41686. 8011ae4: 3324 adds r3, #36 @ 0x24
  41687. 8011ae6: 4618 mov r0, r3
  41688. 8011ae8: f001 fd82 bl 80135f0 <xTaskRemoveFromEventList>
  41689. 8011aec: 4603 mov r3, r0
  41690. 8011aee: 2b00 cmp r3, #0
  41691. 8011af0: d00e beq.n 8011b10 <xQueueGenericSendFromISR+0x11c>
  41692. {
  41693. /* The task waiting has a higher priority so record that a
  41694. context switch is required. */
  41695. if( pxHigherPriorityTaskWoken != NULL )
  41696. 8011af2: 687b ldr r3, [r7, #4]
  41697. 8011af4: 2b00 cmp r3, #0
  41698. 8011af6: d00b beq.n 8011b10 <xQueueGenericSendFromISR+0x11c>
  41699. {
  41700. *pxHigherPriorityTaskWoken = pdTRUE;
  41701. 8011af8: 687b ldr r3, [r7, #4]
  41702. 8011afa: 2201 movs r2, #1
  41703. 8011afc: 601a str r2, [r3, #0]
  41704. 8011afe: e007 b.n 8011b10 <xQueueGenericSendFromISR+0x11c>
  41705. }
  41706. else
  41707. {
  41708. /* Increment the lock count so the task that unlocks the queue
  41709. knows that data was posted while it was locked. */
  41710. pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 );
  41711. 8011b00: f897 3033 ldrb.w r3, [r7, #51] @ 0x33
  41712. 8011b04: 3301 adds r3, #1
  41713. 8011b06: b2db uxtb r3, r3
  41714. 8011b08: b25a sxtb r2, r3
  41715. 8011b0a: 6bbb ldr r3, [r7, #56] @ 0x38
  41716. 8011b0c: f883 2045 strb.w r2, [r3, #69] @ 0x45
  41717. }
  41718. xReturn = pdPASS;
  41719. 8011b10: 2301 movs r3, #1
  41720. 8011b12: 63fb str r3, [r7, #60] @ 0x3c
  41721. {
  41722. 8011b14: e001 b.n 8011b1a <xQueueGenericSendFromISR+0x126>
  41723. }
  41724. else
  41725. {
  41726. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  41727. xReturn = errQUEUE_FULL;
  41728. 8011b16: 2300 movs r3, #0
  41729. 8011b18: 63fb str r3, [r7, #60] @ 0x3c
  41730. 8011b1a: 6b7b ldr r3, [r7, #52] @ 0x34
  41731. 8011b1c: 617b str r3, [r7, #20]
  41732. }
  41733. /*-----------------------------------------------------------*/
  41734. portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
  41735. {
  41736. __asm volatile
  41737. 8011b1e: 697b ldr r3, [r7, #20]
  41738. 8011b20: f383 8811 msr BASEPRI, r3
  41739. (
  41740. " msr basepri, %0 " :: "r" ( ulNewMaskValue ) : "memory"
  41741. );
  41742. }
  41743. 8011b24: bf00 nop
  41744. }
  41745. }
  41746. portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  41747. return xReturn;
  41748. 8011b26: 6bfb ldr r3, [r7, #60] @ 0x3c
  41749. }
  41750. 8011b28: 4618 mov r0, r3
  41751. 8011b2a: 3740 adds r7, #64 @ 0x40
  41752. 8011b2c: 46bd mov sp, r7
  41753. 8011b2e: bd80 pop {r7, pc}
  41754. 08011b30 <xQueueGiveFromISR>:
  41755. /*-----------------------------------------------------------*/
  41756. BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken )
  41757. {
  41758. 8011b30: b580 push {r7, lr}
  41759. 8011b32: b08e sub sp, #56 @ 0x38
  41760. 8011b34: af00 add r7, sp, #0
  41761. 8011b36: 6078 str r0, [r7, #4]
  41762. 8011b38: 6039 str r1, [r7, #0]
  41763. BaseType_t xReturn;
  41764. UBaseType_t uxSavedInterruptStatus;
  41765. Queue_t * const pxQueue = xQueue;
  41766. 8011b3a: 687b ldr r3, [r7, #4]
  41767. 8011b3c: 633b str r3, [r7, #48] @ 0x30
  41768. item size is 0. Don't directly wake a task that was blocked on a queue
  41769. read, instead return a flag to say whether a context switch is required or
  41770. not (i.e. has a task with a higher priority than us been woken by this
  41771. post). */
  41772. configASSERT( pxQueue );
  41773. 8011b3e: 6b3b ldr r3, [r7, #48] @ 0x30
  41774. 8011b40: 2b00 cmp r3, #0
  41775. 8011b42: d10b bne.n 8011b5c <xQueueGiveFromISR+0x2c>
  41776. __asm volatile
  41777. 8011b44: f04f 0350 mov.w r3, #80 @ 0x50
  41778. 8011b48: f383 8811 msr BASEPRI, r3
  41779. 8011b4c: f3bf 8f6f isb sy
  41780. 8011b50: f3bf 8f4f dsb sy
  41781. 8011b54: 623b str r3, [r7, #32]
  41782. }
  41783. 8011b56: bf00 nop
  41784. 8011b58: bf00 nop
  41785. 8011b5a: e7fd b.n 8011b58 <xQueueGiveFromISR+0x28>
  41786. /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR()
  41787. if the item size is not 0. */
  41788. configASSERT( pxQueue->uxItemSize == 0 );
  41789. 8011b5c: 6b3b ldr r3, [r7, #48] @ 0x30
  41790. 8011b5e: 6c1b ldr r3, [r3, #64] @ 0x40
  41791. 8011b60: 2b00 cmp r3, #0
  41792. 8011b62: d00b beq.n 8011b7c <xQueueGiveFromISR+0x4c>
  41793. __asm volatile
  41794. 8011b64: f04f 0350 mov.w r3, #80 @ 0x50
  41795. 8011b68: f383 8811 msr BASEPRI, r3
  41796. 8011b6c: f3bf 8f6f isb sy
  41797. 8011b70: f3bf 8f4f dsb sy
  41798. 8011b74: 61fb str r3, [r7, #28]
  41799. }
  41800. 8011b76: bf00 nop
  41801. 8011b78: bf00 nop
  41802. 8011b7a: e7fd b.n 8011b78 <xQueueGiveFromISR+0x48>
  41803. /* Normally a mutex would not be given from an interrupt, especially if
  41804. there is a mutex holder, as priority inheritance makes no sense for an
  41805. interrupts, only tasks. */
  41806. configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) );
  41807. 8011b7c: 6b3b ldr r3, [r7, #48] @ 0x30
  41808. 8011b7e: 681b ldr r3, [r3, #0]
  41809. 8011b80: 2b00 cmp r3, #0
  41810. 8011b82: d103 bne.n 8011b8c <xQueueGiveFromISR+0x5c>
  41811. 8011b84: 6b3b ldr r3, [r7, #48] @ 0x30
  41812. 8011b86: 689b ldr r3, [r3, #8]
  41813. 8011b88: 2b00 cmp r3, #0
  41814. 8011b8a: d101 bne.n 8011b90 <xQueueGiveFromISR+0x60>
  41815. 8011b8c: 2301 movs r3, #1
  41816. 8011b8e: e000 b.n 8011b92 <xQueueGiveFromISR+0x62>
  41817. 8011b90: 2300 movs r3, #0
  41818. 8011b92: 2b00 cmp r3, #0
  41819. 8011b94: d10b bne.n 8011bae <xQueueGiveFromISR+0x7e>
  41820. __asm volatile
  41821. 8011b96: f04f 0350 mov.w r3, #80 @ 0x50
  41822. 8011b9a: f383 8811 msr BASEPRI, r3
  41823. 8011b9e: f3bf 8f6f isb sy
  41824. 8011ba2: f3bf 8f4f dsb sy
  41825. 8011ba6: 61bb str r3, [r7, #24]
  41826. }
  41827. 8011ba8: bf00 nop
  41828. 8011baa: bf00 nop
  41829. 8011bac: e7fd b.n 8011baa <xQueueGiveFromISR+0x7a>
  41830. that have been assigned a priority at or (logically) below the maximum
  41831. system call interrupt priority. FreeRTOS maintains a separate interrupt
  41832. safe API to ensure interrupt entry is as fast and as simple as possible.
  41833. More information (albeit Cortex-M specific) is provided on the following
  41834. link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
  41835. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  41836. 8011bae: f003 f89b bl 8014ce8 <vPortValidateInterruptPriority>
  41837. __asm volatile
  41838. 8011bb2: f3ef 8211 mrs r2, BASEPRI
  41839. 8011bb6: f04f 0350 mov.w r3, #80 @ 0x50
  41840. 8011bba: f383 8811 msr BASEPRI, r3
  41841. 8011bbe: f3bf 8f6f isb sy
  41842. 8011bc2: f3bf 8f4f dsb sy
  41843. 8011bc6: 617a str r2, [r7, #20]
  41844. 8011bc8: 613b str r3, [r7, #16]
  41845. return ulOriginalBASEPRI;
  41846. 8011bca: 697b ldr r3, [r7, #20]
  41847. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  41848. 8011bcc: 62fb str r3, [r7, #44] @ 0x2c
  41849. {
  41850. const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting;
  41851. 8011bce: 6b3b ldr r3, [r7, #48] @ 0x30
  41852. 8011bd0: 6b9b ldr r3, [r3, #56] @ 0x38
  41853. 8011bd2: 62bb str r3, [r7, #40] @ 0x28
  41854. /* When the queue is used to implement a semaphore no data is ever
  41855. moved through the queue but it is still valid to see if the queue 'has
  41856. space'. */
  41857. if( uxMessagesWaiting < pxQueue->uxLength )
  41858. 8011bd4: 6b3b ldr r3, [r7, #48] @ 0x30
  41859. 8011bd6: 6bdb ldr r3, [r3, #60] @ 0x3c
  41860. 8011bd8: 6aba ldr r2, [r7, #40] @ 0x28
  41861. 8011bda: 429a cmp r2, r3
  41862. 8011bdc: d22b bcs.n 8011c36 <xQueueGiveFromISR+0x106>
  41863. {
  41864. const int8_t cTxLock = pxQueue->cTxLock;
  41865. 8011bde: 6b3b ldr r3, [r7, #48] @ 0x30
  41866. 8011be0: f893 3045 ldrb.w r3, [r3, #69] @ 0x45
  41867. 8011be4: f887 3027 strb.w r3, [r7, #39] @ 0x27
  41868. holder - and if there is a mutex holder then the mutex cannot be
  41869. given from an ISR. As this is the ISR version of the function it
  41870. can be assumed there is no mutex holder and no need to determine if
  41871. priority disinheritance is needed. Simply increase the count of
  41872. messages (semaphores) available. */
  41873. pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1;
  41874. 8011be8: 6abb ldr r3, [r7, #40] @ 0x28
  41875. 8011bea: 1c5a adds r2, r3, #1
  41876. 8011bec: 6b3b ldr r3, [r7, #48] @ 0x30
  41877. 8011bee: 639a str r2, [r3, #56] @ 0x38
  41878. /* The event list is not altered if the queue is locked. This will
  41879. be done when the queue is unlocked later. */
  41880. if( cTxLock == queueUNLOCKED )
  41881. 8011bf0: f997 3027 ldrsb.w r3, [r7, #39] @ 0x27
  41882. 8011bf4: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  41883. 8011bf8: d112 bne.n 8011c20 <xQueueGiveFromISR+0xf0>
  41884. }
  41885. }
  41886. }
  41887. #else /* configUSE_QUEUE_SETS */
  41888. {
  41889. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  41890. 8011bfa: 6b3b ldr r3, [r7, #48] @ 0x30
  41891. 8011bfc: 6a5b ldr r3, [r3, #36] @ 0x24
  41892. 8011bfe: 2b00 cmp r3, #0
  41893. 8011c00: d016 beq.n 8011c30 <xQueueGiveFromISR+0x100>
  41894. {
  41895. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  41896. 8011c02: 6b3b ldr r3, [r7, #48] @ 0x30
  41897. 8011c04: 3324 adds r3, #36 @ 0x24
  41898. 8011c06: 4618 mov r0, r3
  41899. 8011c08: f001 fcf2 bl 80135f0 <xTaskRemoveFromEventList>
  41900. 8011c0c: 4603 mov r3, r0
  41901. 8011c0e: 2b00 cmp r3, #0
  41902. 8011c10: d00e beq.n 8011c30 <xQueueGiveFromISR+0x100>
  41903. {
  41904. /* The task waiting has a higher priority so record that a
  41905. context switch is required. */
  41906. if( pxHigherPriorityTaskWoken != NULL )
  41907. 8011c12: 683b ldr r3, [r7, #0]
  41908. 8011c14: 2b00 cmp r3, #0
  41909. 8011c16: d00b beq.n 8011c30 <xQueueGiveFromISR+0x100>
  41910. {
  41911. *pxHigherPriorityTaskWoken = pdTRUE;
  41912. 8011c18: 683b ldr r3, [r7, #0]
  41913. 8011c1a: 2201 movs r2, #1
  41914. 8011c1c: 601a str r2, [r3, #0]
  41915. 8011c1e: e007 b.n 8011c30 <xQueueGiveFromISR+0x100>
  41916. }
  41917. else
  41918. {
  41919. /* Increment the lock count so the task that unlocks the queue
  41920. knows that data was posted while it was locked. */
  41921. pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 );
  41922. 8011c20: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  41923. 8011c24: 3301 adds r3, #1
  41924. 8011c26: b2db uxtb r3, r3
  41925. 8011c28: b25a sxtb r2, r3
  41926. 8011c2a: 6b3b ldr r3, [r7, #48] @ 0x30
  41927. 8011c2c: f883 2045 strb.w r2, [r3, #69] @ 0x45
  41928. }
  41929. xReturn = pdPASS;
  41930. 8011c30: 2301 movs r3, #1
  41931. 8011c32: 637b str r3, [r7, #52] @ 0x34
  41932. 8011c34: e001 b.n 8011c3a <xQueueGiveFromISR+0x10a>
  41933. }
  41934. else
  41935. {
  41936. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  41937. xReturn = errQUEUE_FULL;
  41938. 8011c36: 2300 movs r3, #0
  41939. 8011c38: 637b str r3, [r7, #52] @ 0x34
  41940. 8011c3a: 6afb ldr r3, [r7, #44] @ 0x2c
  41941. 8011c3c: 60fb str r3, [r7, #12]
  41942. __asm volatile
  41943. 8011c3e: 68fb ldr r3, [r7, #12]
  41944. 8011c40: f383 8811 msr BASEPRI, r3
  41945. }
  41946. 8011c44: bf00 nop
  41947. }
  41948. }
  41949. portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  41950. return xReturn;
  41951. 8011c46: 6b7b ldr r3, [r7, #52] @ 0x34
  41952. }
  41953. 8011c48: 4618 mov r0, r3
  41954. 8011c4a: 3738 adds r7, #56 @ 0x38
  41955. 8011c4c: 46bd mov sp, r7
  41956. 8011c4e: bd80 pop {r7, pc}
  41957. 08011c50 <xQueueReceive>:
  41958. /*-----------------------------------------------------------*/
  41959. BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait )
  41960. {
  41961. 8011c50: b580 push {r7, lr}
  41962. 8011c52: b08c sub sp, #48 @ 0x30
  41963. 8011c54: af00 add r7, sp, #0
  41964. 8011c56: 60f8 str r0, [r7, #12]
  41965. 8011c58: 60b9 str r1, [r7, #8]
  41966. 8011c5a: 607a str r2, [r7, #4]
  41967. BaseType_t xEntryTimeSet = pdFALSE;
  41968. 8011c5c: 2300 movs r3, #0
  41969. 8011c5e: 62fb str r3, [r7, #44] @ 0x2c
  41970. TimeOut_t xTimeOut;
  41971. Queue_t * const pxQueue = xQueue;
  41972. 8011c60: 68fb ldr r3, [r7, #12]
  41973. 8011c62: 62bb str r3, [r7, #40] @ 0x28
  41974. /* Check the pointer is not NULL. */
  41975. configASSERT( ( pxQueue ) );
  41976. 8011c64: 6abb ldr r3, [r7, #40] @ 0x28
  41977. 8011c66: 2b00 cmp r3, #0
  41978. 8011c68: d10b bne.n 8011c82 <xQueueReceive+0x32>
  41979. __asm volatile
  41980. 8011c6a: f04f 0350 mov.w r3, #80 @ 0x50
  41981. 8011c6e: f383 8811 msr BASEPRI, r3
  41982. 8011c72: f3bf 8f6f isb sy
  41983. 8011c76: f3bf 8f4f dsb sy
  41984. 8011c7a: 623b str r3, [r7, #32]
  41985. }
  41986. 8011c7c: bf00 nop
  41987. 8011c7e: bf00 nop
  41988. 8011c80: e7fd b.n 8011c7e <xQueueReceive+0x2e>
  41989. /* The buffer into which data is received can only be NULL if the data size
  41990. is zero (so no data is copied into the buffer. */
  41991. configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) );
  41992. 8011c82: 68bb ldr r3, [r7, #8]
  41993. 8011c84: 2b00 cmp r3, #0
  41994. 8011c86: d103 bne.n 8011c90 <xQueueReceive+0x40>
  41995. 8011c88: 6abb ldr r3, [r7, #40] @ 0x28
  41996. 8011c8a: 6c1b ldr r3, [r3, #64] @ 0x40
  41997. 8011c8c: 2b00 cmp r3, #0
  41998. 8011c8e: d101 bne.n 8011c94 <xQueueReceive+0x44>
  41999. 8011c90: 2301 movs r3, #1
  42000. 8011c92: e000 b.n 8011c96 <xQueueReceive+0x46>
  42001. 8011c94: 2300 movs r3, #0
  42002. 8011c96: 2b00 cmp r3, #0
  42003. 8011c98: d10b bne.n 8011cb2 <xQueueReceive+0x62>
  42004. __asm volatile
  42005. 8011c9a: f04f 0350 mov.w r3, #80 @ 0x50
  42006. 8011c9e: f383 8811 msr BASEPRI, r3
  42007. 8011ca2: f3bf 8f6f isb sy
  42008. 8011ca6: f3bf 8f4f dsb sy
  42009. 8011caa: 61fb str r3, [r7, #28]
  42010. }
  42011. 8011cac: bf00 nop
  42012. 8011cae: bf00 nop
  42013. 8011cb0: e7fd b.n 8011cae <xQueueReceive+0x5e>
  42014. /* Cannot block if the scheduler is suspended. */
  42015. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  42016. {
  42017. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  42018. 8011cb2: f001 fe9b bl 80139ec <xTaskGetSchedulerState>
  42019. 8011cb6: 4603 mov r3, r0
  42020. 8011cb8: 2b00 cmp r3, #0
  42021. 8011cba: d102 bne.n 8011cc2 <xQueueReceive+0x72>
  42022. 8011cbc: 687b ldr r3, [r7, #4]
  42023. 8011cbe: 2b00 cmp r3, #0
  42024. 8011cc0: d101 bne.n 8011cc6 <xQueueReceive+0x76>
  42025. 8011cc2: 2301 movs r3, #1
  42026. 8011cc4: e000 b.n 8011cc8 <xQueueReceive+0x78>
  42027. 8011cc6: 2300 movs r3, #0
  42028. 8011cc8: 2b00 cmp r3, #0
  42029. 8011cca: d10b bne.n 8011ce4 <xQueueReceive+0x94>
  42030. __asm volatile
  42031. 8011ccc: f04f 0350 mov.w r3, #80 @ 0x50
  42032. 8011cd0: f383 8811 msr BASEPRI, r3
  42033. 8011cd4: f3bf 8f6f isb sy
  42034. 8011cd8: f3bf 8f4f dsb sy
  42035. 8011cdc: 61bb str r3, [r7, #24]
  42036. }
  42037. 8011cde: bf00 nop
  42038. 8011ce0: bf00 nop
  42039. 8011ce2: e7fd b.n 8011ce0 <xQueueReceive+0x90>
  42040. /*lint -save -e904 This function relaxes the coding standard somewhat to
  42041. allow return statements within the function itself. This is done in the
  42042. interest of execution time efficiency. */
  42043. for( ;; )
  42044. {
  42045. taskENTER_CRITICAL();
  42046. 8011ce4: f002 ff20 bl 8014b28 <vPortEnterCritical>
  42047. {
  42048. const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting;
  42049. 8011ce8: 6abb ldr r3, [r7, #40] @ 0x28
  42050. 8011cea: 6b9b ldr r3, [r3, #56] @ 0x38
  42051. 8011cec: 627b str r3, [r7, #36] @ 0x24
  42052. /* Is there data in the queue now? To be running the calling task
  42053. must be the highest priority task wanting to access the queue. */
  42054. if( uxMessagesWaiting > ( UBaseType_t ) 0 )
  42055. 8011cee: 6a7b ldr r3, [r7, #36] @ 0x24
  42056. 8011cf0: 2b00 cmp r3, #0
  42057. 8011cf2: d01f beq.n 8011d34 <xQueueReceive+0xe4>
  42058. {
  42059. /* Data available, remove one item. */
  42060. prvCopyDataFromQueue( pxQueue, pvBuffer );
  42061. 8011cf4: 68b9 ldr r1, [r7, #8]
  42062. 8011cf6: 6ab8 ldr r0, [r7, #40] @ 0x28
  42063. 8011cf8: f000 fb02 bl 8012300 <prvCopyDataFromQueue>
  42064. traceQUEUE_RECEIVE( pxQueue );
  42065. pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1;
  42066. 8011cfc: 6a7b ldr r3, [r7, #36] @ 0x24
  42067. 8011cfe: 1e5a subs r2, r3, #1
  42068. 8011d00: 6abb ldr r3, [r7, #40] @ 0x28
  42069. 8011d02: 639a str r2, [r3, #56] @ 0x38
  42070. /* There is now space in the queue, were any tasks waiting to
  42071. post to the queue? If so, unblock the highest priority waiting
  42072. task. */
  42073. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  42074. 8011d04: 6abb ldr r3, [r7, #40] @ 0x28
  42075. 8011d06: 691b ldr r3, [r3, #16]
  42076. 8011d08: 2b00 cmp r3, #0
  42077. 8011d0a: d00f beq.n 8011d2c <xQueueReceive+0xdc>
  42078. {
  42079. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  42080. 8011d0c: 6abb ldr r3, [r7, #40] @ 0x28
  42081. 8011d0e: 3310 adds r3, #16
  42082. 8011d10: 4618 mov r0, r3
  42083. 8011d12: f001 fc6d bl 80135f0 <xTaskRemoveFromEventList>
  42084. 8011d16: 4603 mov r3, r0
  42085. 8011d18: 2b00 cmp r3, #0
  42086. 8011d1a: d007 beq.n 8011d2c <xQueueReceive+0xdc>
  42087. {
  42088. queueYIELD_IF_USING_PREEMPTION();
  42089. 8011d1c: 4b3c ldr r3, [pc, #240] @ (8011e10 <xQueueReceive+0x1c0>)
  42090. 8011d1e: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  42091. 8011d22: 601a str r2, [r3, #0]
  42092. 8011d24: f3bf 8f4f dsb sy
  42093. 8011d28: f3bf 8f6f isb sy
  42094. else
  42095. {
  42096. mtCOVERAGE_TEST_MARKER();
  42097. }
  42098. taskEXIT_CRITICAL();
  42099. 8011d2c: f002 ff2e bl 8014b8c <vPortExitCritical>
  42100. return pdPASS;
  42101. 8011d30: 2301 movs r3, #1
  42102. 8011d32: e069 b.n 8011e08 <xQueueReceive+0x1b8>
  42103. }
  42104. else
  42105. {
  42106. if( xTicksToWait == ( TickType_t ) 0 )
  42107. 8011d34: 687b ldr r3, [r7, #4]
  42108. 8011d36: 2b00 cmp r3, #0
  42109. 8011d38: d103 bne.n 8011d42 <xQueueReceive+0xf2>
  42110. {
  42111. /* The queue was empty and no block time is specified (or
  42112. the block time has expired) so leave now. */
  42113. taskEXIT_CRITICAL();
  42114. 8011d3a: f002 ff27 bl 8014b8c <vPortExitCritical>
  42115. traceQUEUE_RECEIVE_FAILED( pxQueue );
  42116. return errQUEUE_EMPTY;
  42117. 8011d3e: 2300 movs r3, #0
  42118. 8011d40: e062 b.n 8011e08 <xQueueReceive+0x1b8>
  42119. }
  42120. else if( xEntryTimeSet == pdFALSE )
  42121. 8011d42: 6afb ldr r3, [r7, #44] @ 0x2c
  42122. 8011d44: 2b00 cmp r3, #0
  42123. 8011d46: d106 bne.n 8011d56 <xQueueReceive+0x106>
  42124. {
  42125. /* The queue was empty and a block time was specified so
  42126. configure the timeout structure. */
  42127. vTaskInternalSetTimeOutState( &xTimeOut );
  42128. 8011d48: f107 0310 add.w r3, r7, #16
  42129. 8011d4c: 4618 mov r0, r3
  42130. 8011d4e: f001 fcdb bl 8013708 <vTaskInternalSetTimeOutState>
  42131. xEntryTimeSet = pdTRUE;
  42132. 8011d52: 2301 movs r3, #1
  42133. 8011d54: 62fb str r3, [r7, #44] @ 0x2c
  42134. /* Entry time was already set. */
  42135. mtCOVERAGE_TEST_MARKER();
  42136. }
  42137. }
  42138. }
  42139. taskEXIT_CRITICAL();
  42140. 8011d56: f002 ff19 bl 8014b8c <vPortExitCritical>
  42141. /* Interrupts and other tasks can send to and receive from the queue
  42142. now the critical section has been exited. */
  42143. vTaskSuspendAll();
  42144. 8011d5a: f001 f9fb bl 8013154 <vTaskSuspendAll>
  42145. prvLockQueue( pxQueue );
  42146. 8011d5e: f002 fee3 bl 8014b28 <vPortEnterCritical>
  42147. 8011d62: 6abb ldr r3, [r7, #40] @ 0x28
  42148. 8011d64: f893 3044 ldrb.w r3, [r3, #68] @ 0x44
  42149. 8011d68: b25b sxtb r3, r3
  42150. 8011d6a: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  42151. 8011d6e: d103 bne.n 8011d78 <xQueueReceive+0x128>
  42152. 8011d70: 6abb ldr r3, [r7, #40] @ 0x28
  42153. 8011d72: 2200 movs r2, #0
  42154. 8011d74: f883 2044 strb.w r2, [r3, #68] @ 0x44
  42155. 8011d78: 6abb ldr r3, [r7, #40] @ 0x28
  42156. 8011d7a: f893 3045 ldrb.w r3, [r3, #69] @ 0x45
  42157. 8011d7e: b25b sxtb r3, r3
  42158. 8011d80: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  42159. 8011d84: d103 bne.n 8011d8e <xQueueReceive+0x13e>
  42160. 8011d86: 6abb ldr r3, [r7, #40] @ 0x28
  42161. 8011d88: 2200 movs r2, #0
  42162. 8011d8a: f883 2045 strb.w r2, [r3, #69] @ 0x45
  42163. 8011d8e: f002 fefd bl 8014b8c <vPortExitCritical>
  42164. /* Update the timeout state to see if it has expired yet. */
  42165. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  42166. 8011d92: 1d3a adds r2, r7, #4
  42167. 8011d94: f107 0310 add.w r3, r7, #16
  42168. 8011d98: 4611 mov r1, r2
  42169. 8011d9a: 4618 mov r0, r3
  42170. 8011d9c: f001 fcca bl 8013734 <xTaskCheckForTimeOut>
  42171. 8011da0: 4603 mov r3, r0
  42172. 8011da2: 2b00 cmp r3, #0
  42173. 8011da4: d123 bne.n 8011dee <xQueueReceive+0x19e>
  42174. {
  42175. /* The timeout has not expired. If the queue is still empty place
  42176. the task on the list of tasks waiting to receive from the queue. */
  42177. if( prvIsQueueEmpty( pxQueue ) != pdFALSE )
  42178. 8011da6: 6ab8 ldr r0, [r7, #40] @ 0x28
  42179. 8011da8: f000 fb22 bl 80123f0 <prvIsQueueEmpty>
  42180. 8011dac: 4603 mov r3, r0
  42181. 8011dae: 2b00 cmp r3, #0
  42182. 8011db0: d017 beq.n 8011de2 <xQueueReceive+0x192>
  42183. {
  42184. traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );
  42185. vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );
  42186. 8011db2: 6abb ldr r3, [r7, #40] @ 0x28
  42187. 8011db4: 3324 adds r3, #36 @ 0x24
  42188. 8011db6: 687a ldr r2, [r7, #4]
  42189. 8011db8: 4611 mov r1, r2
  42190. 8011dba: 4618 mov r0, r3
  42191. 8011dbc: f001 fbc6 bl 801354c <vTaskPlaceOnEventList>
  42192. prvUnlockQueue( pxQueue );
  42193. 8011dc0: 6ab8 ldr r0, [r7, #40] @ 0x28
  42194. 8011dc2: f000 fac3 bl 801234c <prvUnlockQueue>
  42195. if( xTaskResumeAll() == pdFALSE )
  42196. 8011dc6: f001 f9d3 bl 8013170 <xTaskResumeAll>
  42197. 8011dca: 4603 mov r3, r0
  42198. 8011dcc: 2b00 cmp r3, #0
  42199. 8011dce: d189 bne.n 8011ce4 <xQueueReceive+0x94>
  42200. {
  42201. portYIELD_WITHIN_API();
  42202. 8011dd0: 4b0f ldr r3, [pc, #60] @ (8011e10 <xQueueReceive+0x1c0>)
  42203. 8011dd2: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  42204. 8011dd6: 601a str r2, [r3, #0]
  42205. 8011dd8: f3bf 8f4f dsb sy
  42206. 8011ddc: f3bf 8f6f isb sy
  42207. 8011de0: e780 b.n 8011ce4 <xQueueReceive+0x94>
  42208. }
  42209. else
  42210. {
  42211. /* The queue contains data again. Loop back to try and read the
  42212. data. */
  42213. prvUnlockQueue( pxQueue );
  42214. 8011de2: 6ab8 ldr r0, [r7, #40] @ 0x28
  42215. 8011de4: f000 fab2 bl 801234c <prvUnlockQueue>
  42216. ( void ) xTaskResumeAll();
  42217. 8011de8: f001 f9c2 bl 8013170 <xTaskResumeAll>
  42218. 8011dec: e77a b.n 8011ce4 <xQueueReceive+0x94>
  42219. }
  42220. else
  42221. {
  42222. /* Timed out. If there is no data in the queue exit, otherwise loop
  42223. back and attempt to read the data. */
  42224. prvUnlockQueue( pxQueue );
  42225. 8011dee: 6ab8 ldr r0, [r7, #40] @ 0x28
  42226. 8011df0: f000 faac bl 801234c <prvUnlockQueue>
  42227. ( void ) xTaskResumeAll();
  42228. 8011df4: f001 f9bc bl 8013170 <xTaskResumeAll>
  42229. if( prvIsQueueEmpty( pxQueue ) != pdFALSE )
  42230. 8011df8: 6ab8 ldr r0, [r7, #40] @ 0x28
  42231. 8011dfa: f000 faf9 bl 80123f0 <prvIsQueueEmpty>
  42232. 8011dfe: 4603 mov r3, r0
  42233. 8011e00: 2b00 cmp r3, #0
  42234. 8011e02: f43f af6f beq.w 8011ce4 <xQueueReceive+0x94>
  42235. {
  42236. traceQUEUE_RECEIVE_FAILED( pxQueue );
  42237. return errQUEUE_EMPTY;
  42238. 8011e06: 2300 movs r3, #0
  42239. {
  42240. mtCOVERAGE_TEST_MARKER();
  42241. }
  42242. }
  42243. } /*lint -restore */
  42244. }
  42245. 8011e08: 4618 mov r0, r3
  42246. 8011e0a: 3730 adds r7, #48 @ 0x30
  42247. 8011e0c: 46bd mov sp, r7
  42248. 8011e0e: bd80 pop {r7, pc}
  42249. 8011e10: e000ed04 .word 0xe000ed04
  42250. 08011e14 <xQueueSemaphoreTake>:
  42251. /*-----------------------------------------------------------*/
  42252. BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait )
  42253. {
  42254. 8011e14: b580 push {r7, lr}
  42255. 8011e16: b08e sub sp, #56 @ 0x38
  42256. 8011e18: af00 add r7, sp, #0
  42257. 8011e1a: 6078 str r0, [r7, #4]
  42258. 8011e1c: 6039 str r1, [r7, #0]
  42259. BaseType_t xEntryTimeSet = pdFALSE;
  42260. 8011e1e: 2300 movs r3, #0
  42261. 8011e20: 637b str r3, [r7, #52] @ 0x34
  42262. TimeOut_t xTimeOut;
  42263. Queue_t * const pxQueue = xQueue;
  42264. 8011e22: 687b ldr r3, [r7, #4]
  42265. 8011e24: 62fb str r3, [r7, #44] @ 0x2c
  42266. #if( configUSE_MUTEXES == 1 )
  42267. BaseType_t xInheritanceOccurred = pdFALSE;
  42268. 8011e26: 2300 movs r3, #0
  42269. 8011e28: 633b str r3, [r7, #48] @ 0x30
  42270. #endif
  42271. /* Check the queue pointer is not NULL. */
  42272. configASSERT( ( pxQueue ) );
  42273. 8011e2a: 6afb ldr r3, [r7, #44] @ 0x2c
  42274. 8011e2c: 2b00 cmp r3, #0
  42275. 8011e2e: d10b bne.n 8011e48 <xQueueSemaphoreTake+0x34>
  42276. __asm volatile
  42277. 8011e30: f04f 0350 mov.w r3, #80 @ 0x50
  42278. 8011e34: f383 8811 msr BASEPRI, r3
  42279. 8011e38: f3bf 8f6f isb sy
  42280. 8011e3c: f3bf 8f4f dsb sy
  42281. 8011e40: 623b str r3, [r7, #32]
  42282. }
  42283. 8011e42: bf00 nop
  42284. 8011e44: bf00 nop
  42285. 8011e46: e7fd b.n 8011e44 <xQueueSemaphoreTake+0x30>
  42286. /* Check this really is a semaphore, in which case the item size will be
  42287. 0. */
  42288. configASSERT( pxQueue->uxItemSize == 0 );
  42289. 8011e48: 6afb ldr r3, [r7, #44] @ 0x2c
  42290. 8011e4a: 6c1b ldr r3, [r3, #64] @ 0x40
  42291. 8011e4c: 2b00 cmp r3, #0
  42292. 8011e4e: d00b beq.n 8011e68 <xQueueSemaphoreTake+0x54>
  42293. __asm volatile
  42294. 8011e50: f04f 0350 mov.w r3, #80 @ 0x50
  42295. 8011e54: f383 8811 msr BASEPRI, r3
  42296. 8011e58: f3bf 8f6f isb sy
  42297. 8011e5c: f3bf 8f4f dsb sy
  42298. 8011e60: 61fb str r3, [r7, #28]
  42299. }
  42300. 8011e62: bf00 nop
  42301. 8011e64: bf00 nop
  42302. 8011e66: e7fd b.n 8011e64 <xQueueSemaphoreTake+0x50>
  42303. /* Cannot block if the scheduler is suspended. */
  42304. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  42305. {
  42306. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  42307. 8011e68: f001 fdc0 bl 80139ec <xTaskGetSchedulerState>
  42308. 8011e6c: 4603 mov r3, r0
  42309. 8011e6e: 2b00 cmp r3, #0
  42310. 8011e70: d102 bne.n 8011e78 <xQueueSemaphoreTake+0x64>
  42311. 8011e72: 683b ldr r3, [r7, #0]
  42312. 8011e74: 2b00 cmp r3, #0
  42313. 8011e76: d101 bne.n 8011e7c <xQueueSemaphoreTake+0x68>
  42314. 8011e78: 2301 movs r3, #1
  42315. 8011e7a: e000 b.n 8011e7e <xQueueSemaphoreTake+0x6a>
  42316. 8011e7c: 2300 movs r3, #0
  42317. 8011e7e: 2b00 cmp r3, #0
  42318. 8011e80: d10b bne.n 8011e9a <xQueueSemaphoreTake+0x86>
  42319. __asm volatile
  42320. 8011e82: f04f 0350 mov.w r3, #80 @ 0x50
  42321. 8011e86: f383 8811 msr BASEPRI, r3
  42322. 8011e8a: f3bf 8f6f isb sy
  42323. 8011e8e: f3bf 8f4f dsb sy
  42324. 8011e92: 61bb str r3, [r7, #24]
  42325. }
  42326. 8011e94: bf00 nop
  42327. 8011e96: bf00 nop
  42328. 8011e98: e7fd b.n 8011e96 <xQueueSemaphoreTake+0x82>
  42329. /*lint -save -e904 This function relaxes the coding standard somewhat to allow return
  42330. statements within the function itself. This is done in the interest
  42331. of execution time efficiency. */
  42332. for( ;; )
  42333. {
  42334. taskENTER_CRITICAL();
  42335. 8011e9a: f002 fe45 bl 8014b28 <vPortEnterCritical>
  42336. {
  42337. /* Semaphores are queues with an item size of 0, and where the
  42338. number of messages in the queue is the semaphore's count value. */
  42339. const UBaseType_t uxSemaphoreCount = pxQueue->uxMessagesWaiting;
  42340. 8011e9e: 6afb ldr r3, [r7, #44] @ 0x2c
  42341. 8011ea0: 6b9b ldr r3, [r3, #56] @ 0x38
  42342. 8011ea2: 62bb str r3, [r7, #40] @ 0x28
  42343. /* Is there data in the queue now? To be running the calling task
  42344. must be the highest priority task wanting to access the queue. */
  42345. if( uxSemaphoreCount > ( UBaseType_t ) 0 )
  42346. 8011ea4: 6abb ldr r3, [r7, #40] @ 0x28
  42347. 8011ea6: 2b00 cmp r3, #0
  42348. 8011ea8: d024 beq.n 8011ef4 <xQueueSemaphoreTake+0xe0>
  42349. {
  42350. traceQUEUE_RECEIVE( pxQueue );
  42351. /* Semaphores are queues with a data size of zero and where the
  42352. messages waiting is the semaphore's count. Reduce the count. */
  42353. pxQueue->uxMessagesWaiting = uxSemaphoreCount - ( UBaseType_t ) 1;
  42354. 8011eaa: 6abb ldr r3, [r7, #40] @ 0x28
  42355. 8011eac: 1e5a subs r2, r3, #1
  42356. 8011eae: 6afb ldr r3, [r7, #44] @ 0x2c
  42357. 8011eb0: 639a str r2, [r3, #56] @ 0x38
  42358. #if ( configUSE_MUTEXES == 1 )
  42359. {
  42360. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  42361. 8011eb2: 6afb ldr r3, [r7, #44] @ 0x2c
  42362. 8011eb4: 681b ldr r3, [r3, #0]
  42363. 8011eb6: 2b00 cmp r3, #0
  42364. 8011eb8: d104 bne.n 8011ec4 <xQueueSemaphoreTake+0xb0>
  42365. {
  42366. /* Record the information required to implement
  42367. priority inheritance should it become necessary. */
  42368. pxQueue->u.xSemaphore.xMutexHolder = pvTaskIncrementMutexHeldCount();
  42369. 8011eba: f001 ff11 bl 8013ce0 <pvTaskIncrementMutexHeldCount>
  42370. 8011ebe: 4602 mov r2, r0
  42371. 8011ec0: 6afb ldr r3, [r7, #44] @ 0x2c
  42372. 8011ec2: 609a str r2, [r3, #8]
  42373. }
  42374. #endif /* configUSE_MUTEXES */
  42375. /* Check to see if other tasks are blocked waiting to give the
  42376. semaphore, and if so, unblock the highest priority such task. */
  42377. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  42378. 8011ec4: 6afb ldr r3, [r7, #44] @ 0x2c
  42379. 8011ec6: 691b ldr r3, [r3, #16]
  42380. 8011ec8: 2b00 cmp r3, #0
  42381. 8011eca: d00f beq.n 8011eec <xQueueSemaphoreTake+0xd8>
  42382. {
  42383. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  42384. 8011ecc: 6afb ldr r3, [r7, #44] @ 0x2c
  42385. 8011ece: 3310 adds r3, #16
  42386. 8011ed0: 4618 mov r0, r3
  42387. 8011ed2: f001 fb8d bl 80135f0 <xTaskRemoveFromEventList>
  42388. 8011ed6: 4603 mov r3, r0
  42389. 8011ed8: 2b00 cmp r3, #0
  42390. 8011eda: d007 beq.n 8011eec <xQueueSemaphoreTake+0xd8>
  42391. {
  42392. queueYIELD_IF_USING_PREEMPTION();
  42393. 8011edc: 4b54 ldr r3, [pc, #336] @ (8012030 <xQueueSemaphoreTake+0x21c>)
  42394. 8011ede: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  42395. 8011ee2: 601a str r2, [r3, #0]
  42396. 8011ee4: f3bf 8f4f dsb sy
  42397. 8011ee8: f3bf 8f6f isb sy
  42398. else
  42399. {
  42400. mtCOVERAGE_TEST_MARKER();
  42401. }
  42402. taskEXIT_CRITICAL();
  42403. 8011eec: f002 fe4e bl 8014b8c <vPortExitCritical>
  42404. return pdPASS;
  42405. 8011ef0: 2301 movs r3, #1
  42406. 8011ef2: e098 b.n 8012026 <xQueueSemaphoreTake+0x212>
  42407. }
  42408. else
  42409. {
  42410. if( xTicksToWait == ( TickType_t ) 0 )
  42411. 8011ef4: 683b ldr r3, [r7, #0]
  42412. 8011ef6: 2b00 cmp r3, #0
  42413. 8011ef8: d112 bne.n 8011f20 <xQueueSemaphoreTake+0x10c>
  42414. /* For inheritance to have occurred there must have been an
  42415. initial timeout, and an adjusted timeout cannot become 0, as
  42416. if it were 0 the function would have exited. */
  42417. #if( configUSE_MUTEXES == 1 )
  42418. {
  42419. configASSERT( xInheritanceOccurred == pdFALSE );
  42420. 8011efa: 6b3b ldr r3, [r7, #48] @ 0x30
  42421. 8011efc: 2b00 cmp r3, #0
  42422. 8011efe: d00b beq.n 8011f18 <xQueueSemaphoreTake+0x104>
  42423. __asm volatile
  42424. 8011f00: f04f 0350 mov.w r3, #80 @ 0x50
  42425. 8011f04: f383 8811 msr BASEPRI, r3
  42426. 8011f08: f3bf 8f6f isb sy
  42427. 8011f0c: f3bf 8f4f dsb sy
  42428. 8011f10: 617b str r3, [r7, #20]
  42429. }
  42430. 8011f12: bf00 nop
  42431. 8011f14: bf00 nop
  42432. 8011f16: e7fd b.n 8011f14 <xQueueSemaphoreTake+0x100>
  42433. }
  42434. #endif /* configUSE_MUTEXES */
  42435. /* The semaphore count was 0 and no block time is specified
  42436. (or the block time has expired) so exit now. */
  42437. taskEXIT_CRITICAL();
  42438. 8011f18: f002 fe38 bl 8014b8c <vPortExitCritical>
  42439. traceQUEUE_RECEIVE_FAILED( pxQueue );
  42440. return errQUEUE_EMPTY;
  42441. 8011f1c: 2300 movs r3, #0
  42442. 8011f1e: e082 b.n 8012026 <xQueueSemaphoreTake+0x212>
  42443. }
  42444. else if( xEntryTimeSet == pdFALSE )
  42445. 8011f20: 6b7b ldr r3, [r7, #52] @ 0x34
  42446. 8011f22: 2b00 cmp r3, #0
  42447. 8011f24: d106 bne.n 8011f34 <xQueueSemaphoreTake+0x120>
  42448. {
  42449. /* The semaphore count was 0 and a block time was specified
  42450. so configure the timeout structure ready to block. */
  42451. vTaskInternalSetTimeOutState( &xTimeOut );
  42452. 8011f26: f107 030c add.w r3, r7, #12
  42453. 8011f2a: 4618 mov r0, r3
  42454. 8011f2c: f001 fbec bl 8013708 <vTaskInternalSetTimeOutState>
  42455. xEntryTimeSet = pdTRUE;
  42456. 8011f30: 2301 movs r3, #1
  42457. 8011f32: 637b str r3, [r7, #52] @ 0x34
  42458. /* Entry time was already set. */
  42459. mtCOVERAGE_TEST_MARKER();
  42460. }
  42461. }
  42462. }
  42463. taskEXIT_CRITICAL();
  42464. 8011f34: f002 fe2a bl 8014b8c <vPortExitCritical>
  42465. /* Interrupts and other tasks can give to and take from the semaphore
  42466. now the critical section has been exited. */
  42467. vTaskSuspendAll();
  42468. 8011f38: f001 f90c bl 8013154 <vTaskSuspendAll>
  42469. prvLockQueue( pxQueue );
  42470. 8011f3c: f002 fdf4 bl 8014b28 <vPortEnterCritical>
  42471. 8011f40: 6afb ldr r3, [r7, #44] @ 0x2c
  42472. 8011f42: f893 3044 ldrb.w r3, [r3, #68] @ 0x44
  42473. 8011f46: b25b sxtb r3, r3
  42474. 8011f48: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  42475. 8011f4c: d103 bne.n 8011f56 <xQueueSemaphoreTake+0x142>
  42476. 8011f4e: 6afb ldr r3, [r7, #44] @ 0x2c
  42477. 8011f50: 2200 movs r2, #0
  42478. 8011f52: f883 2044 strb.w r2, [r3, #68] @ 0x44
  42479. 8011f56: 6afb ldr r3, [r7, #44] @ 0x2c
  42480. 8011f58: f893 3045 ldrb.w r3, [r3, #69] @ 0x45
  42481. 8011f5c: b25b sxtb r3, r3
  42482. 8011f5e: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  42483. 8011f62: d103 bne.n 8011f6c <xQueueSemaphoreTake+0x158>
  42484. 8011f64: 6afb ldr r3, [r7, #44] @ 0x2c
  42485. 8011f66: 2200 movs r2, #0
  42486. 8011f68: f883 2045 strb.w r2, [r3, #69] @ 0x45
  42487. 8011f6c: f002 fe0e bl 8014b8c <vPortExitCritical>
  42488. /* Update the timeout state to see if it has expired yet. */
  42489. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  42490. 8011f70: 463a mov r2, r7
  42491. 8011f72: f107 030c add.w r3, r7, #12
  42492. 8011f76: 4611 mov r1, r2
  42493. 8011f78: 4618 mov r0, r3
  42494. 8011f7a: f001 fbdb bl 8013734 <xTaskCheckForTimeOut>
  42495. 8011f7e: 4603 mov r3, r0
  42496. 8011f80: 2b00 cmp r3, #0
  42497. 8011f82: d132 bne.n 8011fea <xQueueSemaphoreTake+0x1d6>
  42498. {
  42499. /* A block time is specified and not expired. If the semaphore
  42500. count is 0 then enter the Blocked state to wait for a semaphore to
  42501. become available. As semaphores are implemented with queues the
  42502. queue being empty is equivalent to the semaphore count being 0. */
  42503. if( prvIsQueueEmpty( pxQueue ) != pdFALSE )
  42504. 8011f84: 6af8 ldr r0, [r7, #44] @ 0x2c
  42505. 8011f86: f000 fa33 bl 80123f0 <prvIsQueueEmpty>
  42506. 8011f8a: 4603 mov r3, r0
  42507. 8011f8c: 2b00 cmp r3, #0
  42508. 8011f8e: d026 beq.n 8011fde <xQueueSemaphoreTake+0x1ca>
  42509. {
  42510. traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );
  42511. #if ( configUSE_MUTEXES == 1 )
  42512. {
  42513. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  42514. 8011f90: 6afb ldr r3, [r7, #44] @ 0x2c
  42515. 8011f92: 681b ldr r3, [r3, #0]
  42516. 8011f94: 2b00 cmp r3, #0
  42517. 8011f96: d109 bne.n 8011fac <xQueueSemaphoreTake+0x198>
  42518. {
  42519. taskENTER_CRITICAL();
  42520. 8011f98: f002 fdc6 bl 8014b28 <vPortEnterCritical>
  42521. {
  42522. xInheritanceOccurred = xTaskPriorityInherit( pxQueue->u.xSemaphore.xMutexHolder );
  42523. 8011f9c: 6afb ldr r3, [r7, #44] @ 0x2c
  42524. 8011f9e: 689b ldr r3, [r3, #8]
  42525. 8011fa0: 4618 mov r0, r3
  42526. 8011fa2: f001 fd41 bl 8013a28 <xTaskPriorityInherit>
  42527. 8011fa6: 6338 str r0, [r7, #48] @ 0x30
  42528. }
  42529. taskEXIT_CRITICAL();
  42530. 8011fa8: f002 fdf0 bl 8014b8c <vPortExitCritical>
  42531. mtCOVERAGE_TEST_MARKER();
  42532. }
  42533. }
  42534. #endif
  42535. vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );
  42536. 8011fac: 6afb ldr r3, [r7, #44] @ 0x2c
  42537. 8011fae: 3324 adds r3, #36 @ 0x24
  42538. 8011fb0: 683a ldr r2, [r7, #0]
  42539. 8011fb2: 4611 mov r1, r2
  42540. 8011fb4: 4618 mov r0, r3
  42541. 8011fb6: f001 fac9 bl 801354c <vTaskPlaceOnEventList>
  42542. prvUnlockQueue( pxQueue );
  42543. 8011fba: 6af8 ldr r0, [r7, #44] @ 0x2c
  42544. 8011fbc: f000 f9c6 bl 801234c <prvUnlockQueue>
  42545. if( xTaskResumeAll() == pdFALSE )
  42546. 8011fc0: f001 f8d6 bl 8013170 <xTaskResumeAll>
  42547. 8011fc4: 4603 mov r3, r0
  42548. 8011fc6: 2b00 cmp r3, #0
  42549. 8011fc8: f47f af67 bne.w 8011e9a <xQueueSemaphoreTake+0x86>
  42550. {
  42551. portYIELD_WITHIN_API();
  42552. 8011fcc: 4b18 ldr r3, [pc, #96] @ (8012030 <xQueueSemaphoreTake+0x21c>)
  42553. 8011fce: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  42554. 8011fd2: 601a str r2, [r3, #0]
  42555. 8011fd4: f3bf 8f4f dsb sy
  42556. 8011fd8: f3bf 8f6f isb sy
  42557. 8011fdc: e75d b.n 8011e9a <xQueueSemaphoreTake+0x86>
  42558. }
  42559. else
  42560. {
  42561. /* There was no timeout and the semaphore count was not 0, so
  42562. attempt to take the semaphore again. */
  42563. prvUnlockQueue( pxQueue );
  42564. 8011fde: 6af8 ldr r0, [r7, #44] @ 0x2c
  42565. 8011fe0: f000 f9b4 bl 801234c <prvUnlockQueue>
  42566. ( void ) xTaskResumeAll();
  42567. 8011fe4: f001 f8c4 bl 8013170 <xTaskResumeAll>
  42568. 8011fe8: e757 b.n 8011e9a <xQueueSemaphoreTake+0x86>
  42569. }
  42570. }
  42571. else
  42572. {
  42573. /* Timed out. */
  42574. prvUnlockQueue( pxQueue );
  42575. 8011fea: 6af8 ldr r0, [r7, #44] @ 0x2c
  42576. 8011fec: f000 f9ae bl 801234c <prvUnlockQueue>
  42577. ( void ) xTaskResumeAll();
  42578. 8011ff0: f001 f8be bl 8013170 <xTaskResumeAll>
  42579. /* If the semaphore count is 0 exit now as the timeout has
  42580. expired. Otherwise return to attempt to take the semaphore that is
  42581. known to be available. As semaphores are implemented by queues the
  42582. queue being empty is equivalent to the semaphore count being 0. */
  42583. if( prvIsQueueEmpty( pxQueue ) != pdFALSE )
  42584. 8011ff4: 6af8 ldr r0, [r7, #44] @ 0x2c
  42585. 8011ff6: f000 f9fb bl 80123f0 <prvIsQueueEmpty>
  42586. 8011ffa: 4603 mov r3, r0
  42587. 8011ffc: 2b00 cmp r3, #0
  42588. 8011ffe: f43f af4c beq.w 8011e9a <xQueueSemaphoreTake+0x86>
  42589. #if ( configUSE_MUTEXES == 1 )
  42590. {
  42591. /* xInheritanceOccurred could only have be set if
  42592. pxQueue->uxQueueType == queueQUEUE_IS_MUTEX so no need to
  42593. test the mutex type again to check it is actually a mutex. */
  42594. if( xInheritanceOccurred != pdFALSE )
  42595. 8012002: 6b3b ldr r3, [r7, #48] @ 0x30
  42596. 8012004: 2b00 cmp r3, #0
  42597. 8012006: d00d beq.n 8012024 <xQueueSemaphoreTake+0x210>
  42598. {
  42599. taskENTER_CRITICAL();
  42600. 8012008: f002 fd8e bl 8014b28 <vPortEnterCritical>
  42601. /* This task blocking on the mutex caused another
  42602. task to inherit this task's priority. Now this task
  42603. has timed out the priority should be disinherited
  42604. again, but only as low as the next highest priority
  42605. task that is waiting for the same mutex. */
  42606. uxHighestWaitingPriority = prvGetDisinheritPriorityAfterTimeout( pxQueue );
  42607. 801200c: 6af8 ldr r0, [r7, #44] @ 0x2c
  42608. 801200e: f000 f8f5 bl 80121fc <prvGetDisinheritPriorityAfterTimeout>
  42609. 8012012: 6278 str r0, [r7, #36] @ 0x24
  42610. vTaskPriorityDisinheritAfterTimeout( pxQueue->u.xSemaphore.xMutexHolder, uxHighestWaitingPriority );
  42611. 8012014: 6afb ldr r3, [r7, #44] @ 0x2c
  42612. 8012016: 689b ldr r3, [r3, #8]
  42613. 8012018: 6a79 ldr r1, [r7, #36] @ 0x24
  42614. 801201a: 4618 mov r0, r3
  42615. 801201c: f001 fddc bl 8013bd8 <vTaskPriorityDisinheritAfterTimeout>
  42616. }
  42617. taskEXIT_CRITICAL();
  42618. 8012020: f002 fdb4 bl 8014b8c <vPortExitCritical>
  42619. }
  42620. }
  42621. #endif /* configUSE_MUTEXES */
  42622. traceQUEUE_RECEIVE_FAILED( pxQueue );
  42623. return errQUEUE_EMPTY;
  42624. 8012024: 2300 movs r3, #0
  42625. {
  42626. mtCOVERAGE_TEST_MARKER();
  42627. }
  42628. }
  42629. } /*lint -restore */
  42630. }
  42631. 8012026: 4618 mov r0, r3
  42632. 8012028: 3738 adds r7, #56 @ 0x38
  42633. 801202a: 46bd mov sp, r7
  42634. 801202c: bd80 pop {r7, pc}
  42635. 801202e: bf00 nop
  42636. 8012030: e000ed04 .word 0xe000ed04
  42637. 08012034 <xQueueReceiveFromISR>:
  42638. } /*lint -restore */
  42639. }
  42640. /*-----------------------------------------------------------*/
  42641. BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken )
  42642. {
  42643. 8012034: b580 push {r7, lr}
  42644. 8012036: b08e sub sp, #56 @ 0x38
  42645. 8012038: af00 add r7, sp, #0
  42646. 801203a: 60f8 str r0, [r7, #12]
  42647. 801203c: 60b9 str r1, [r7, #8]
  42648. 801203e: 607a str r2, [r7, #4]
  42649. BaseType_t xReturn;
  42650. UBaseType_t uxSavedInterruptStatus;
  42651. Queue_t * const pxQueue = xQueue;
  42652. 8012040: 68fb ldr r3, [r7, #12]
  42653. 8012042: 633b str r3, [r7, #48] @ 0x30
  42654. configASSERT( pxQueue );
  42655. 8012044: 6b3b ldr r3, [r7, #48] @ 0x30
  42656. 8012046: 2b00 cmp r3, #0
  42657. 8012048: d10b bne.n 8012062 <xQueueReceiveFromISR+0x2e>
  42658. __asm volatile
  42659. 801204a: f04f 0350 mov.w r3, #80 @ 0x50
  42660. 801204e: f383 8811 msr BASEPRI, r3
  42661. 8012052: f3bf 8f6f isb sy
  42662. 8012056: f3bf 8f4f dsb sy
  42663. 801205a: 623b str r3, [r7, #32]
  42664. }
  42665. 801205c: bf00 nop
  42666. 801205e: bf00 nop
  42667. 8012060: e7fd b.n 801205e <xQueueReceiveFromISR+0x2a>
  42668. configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  42669. 8012062: 68bb ldr r3, [r7, #8]
  42670. 8012064: 2b00 cmp r3, #0
  42671. 8012066: d103 bne.n 8012070 <xQueueReceiveFromISR+0x3c>
  42672. 8012068: 6b3b ldr r3, [r7, #48] @ 0x30
  42673. 801206a: 6c1b ldr r3, [r3, #64] @ 0x40
  42674. 801206c: 2b00 cmp r3, #0
  42675. 801206e: d101 bne.n 8012074 <xQueueReceiveFromISR+0x40>
  42676. 8012070: 2301 movs r3, #1
  42677. 8012072: e000 b.n 8012076 <xQueueReceiveFromISR+0x42>
  42678. 8012074: 2300 movs r3, #0
  42679. 8012076: 2b00 cmp r3, #0
  42680. 8012078: d10b bne.n 8012092 <xQueueReceiveFromISR+0x5e>
  42681. __asm volatile
  42682. 801207a: f04f 0350 mov.w r3, #80 @ 0x50
  42683. 801207e: f383 8811 msr BASEPRI, r3
  42684. 8012082: f3bf 8f6f isb sy
  42685. 8012086: f3bf 8f4f dsb sy
  42686. 801208a: 61fb str r3, [r7, #28]
  42687. }
  42688. 801208c: bf00 nop
  42689. 801208e: bf00 nop
  42690. 8012090: e7fd b.n 801208e <xQueueReceiveFromISR+0x5a>
  42691. that have been assigned a priority at or (logically) below the maximum
  42692. system call interrupt priority. FreeRTOS maintains a separate interrupt
  42693. safe API to ensure interrupt entry is as fast and as simple as possible.
  42694. More information (albeit Cortex-M specific) is provided on the following
  42695. link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
  42696. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  42697. 8012092: f002 fe29 bl 8014ce8 <vPortValidateInterruptPriority>
  42698. __asm volatile
  42699. 8012096: f3ef 8211 mrs r2, BASEPRI
  42700. 801209a: f04f 0350 mov.w r3, #80 @ 0x50
  42701. 801209e: f383 8811 msr BASEPRI, r3
  42702. 80120a2: f3bf 8f6f isb sy
  42703. 80120a6: f3bf 8f4f dsb sy
  42704. 80120aa: 61ba str r2, [r7, #24]
  42705. 80120ac: 617b str r3, [r7, #20]
  42706. return ulOriginalBASEPRI;
  42707. 80120ae: 69bb ldr r3, [r7, #24]
  42708. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  42709. 80120b0: 62fb str r3, [r7, #44] @ 0x2c
  42710. {
  42711. const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting;
  42712. 80120b2: 6b3b ldr r3, [r7, #48] @ 0x30
  42713. 80120b4: 6b9b ldr r3, [r3, #56] @ 0x38
  42714. 80120b6: 62bb str r3, [r7, #40] @ 0x28
  42715. /* Cannot block in an ISR, so check there is data available. */
  42716. if( uxMessagesWaiting > ( UBaseType_t ) 0 )
  42717. 80120b8: 6abb ldr r3, [r7, #40] @ 0x28
  42718. 80120ba: 2b00 cmp r3, #0
  42719. 80120bc: d02f beq.n 801211e <xQueueReceiveFromISR+0xea>
  42720. {
  42721. const int8_t cRxLock = pxQueue->cRxLock;
  42722. 80120be: 6b3b ldr r3, [r7, #48] @ 0x30
  42723. 80120c0: f893 3044 ldrb.w r3, [r3, #68] @ 0x44
  42724. 80120c4: f887 3027 strb.w r3, [r7, #39] @ 0x27
  42725. traceQUEUE_RECEIVE_FROM_ISR( pxQueue );
  42726. prvCopyDataFromQueue( pxQueue, pvBuffer );
  42727. 80120c8: 68b9 ldr r1, [r7, #8]
  42728. 80120ca: 6b38 ldr r0, [r7, #48] @ 0x30
  42729. 80120cc: f000 f918 bl 8012300 <prvCopyDataFromQueue>
  42730. pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1;
  42731. 80120d0: 6abb ldr r3, [r7, #40] @ 0x28
  42732. 80120d2: 1e5a subs r2, r3, #1
  42733. 80120d4: 6b3b ldr r3, [r7, #48] @ 0x30
  42734. 80120d6: 639a str r2, [r3, #56] @ 0x38
  42735. /* If the queue is locked the event list will not be modified.
  42736. Instead update the lock count so the task that unlocks the queue
  42737. will know that an ISR has removed data while the queue was
  42738. locked. */
  42739. if( cRxLock == queueUNLOCKED )
  42740. 80120d8: f997 3027 ldrsb.w r3, [r7, #39] @ 0x27
  42741. 80120dc: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  42742. 80120e0: d112 bne.n 8012108 <xQueueReceiveFromISR+0xd4>
  42743. {
  42744. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  42745. 80120e2: 6b3b ldr r3, [r7, #48] @ 0x30
  42746. 80120e4: 691b ldr r3, [r3, #16]
  42747. 80120e6: 2b00 cmp r3, #0
  42748. 80120e8: d016 beq.n 8012118 <xQueueReceiveFromISR+0xe4>
  42749. {
  42750. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  42751. 80120ea: 6b3b ldr r3, [r7, #48] @ 0x30
  42752. 80120ec: 3310 adds r3, #16
  42753. 80120ee: 4618 mov r0, r3
  42754. 80120f0: f001 fa7e bl 80135f0 <xTaskRemoveFromEventList>
  42755. 80120f4: 4603 mov r3, r0
  42756. 80120f6: 2b00 cmp r3, #0
  42757. 80120f8: d00e beq.n 8012118 <xQueueReceiveFromISR+0xe4>
  42758. {
  42759. /* The task waiting has a higher priority than us so
  42760. force a context switch. */
  42761. if( pxHigherPriorityTaskWoken != NULL )
  42762. 80120fa: 687b ldr r3, [r7, #4]
  42763. 80120fc: 2b00 cmp r3, #0
  42764. 80120fe: d00b beq.n 8012118 <xQueueReceiveFromISR+0xe4>
  42765. {
  42766. *pxHigherPriorityTaskWoken = pdTRUE;
  42767. 8012100: 687b ldr r3, [r7, #4]
  42768. 8012102: 2201 movs r2, #1
  42769. 8012104: 601a str r2, [r3, #0]
  42770. 8012106: e007 b.n 8012118 <xQueueReceiveFromISR+0xe4>
  42771. }
  42772. else
  42773. {
  42774. /* Increment the lock count so the task that unlocks the queue
  42775. knows that data was removed while it was locked. */
  42776. pxQueue->cRxLock = ( int8_t ) ( cRxLock + 1 );
  42777. 8012108: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  42778. 801210c: 3301 adds r3, #1
  42779. 801210e: b2db uxtb r3, r3
  42780. 8012110: b25a sxtb r2, r3
  42781. 8012112: 6b3b ldr r3, [r7, #48] @ 0x30
  42782. 8012114: f883 2044 strb.w r2, [r3, #68] @ 0x44
  42783. }
  42784. xReturn = pdPASS;
  42785. 8012118: 2301 movs r3, #1
  42786. 801211a: 637b str r3, [r7, #52] @ 0x34
  42787. 801211c: e001 b.n 8012122 <xQueueReceiveFromISR+0xee>
  42788. }
  42789. else
  42790. {
  42791. xReturn = pdFAIL;
  42792. 801211e: 2300 movs r3, #0
  42793. 8012120: 637b str r3, [r7, #52] @ 0x34
  42794. 8012122: 6afb ldr r3, [r7, #44] @ 0x2c
  42795. 8012124: 613b str r3, [r7, #16]
  42796. __asm volatile
  42797. 8012126: 693b ldr r3, [r7, #16]
  42798. 8012128: f383 8811 msr BASEPRI, r3
  42799. }
  42800. 801212c: bf00 nop
  42801. traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue );
  42802. }
  42803. }
  42804. portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  42805. return xReturn;
  42806. 801212e: 6b7b ldr r3, [r7, #52] @ 0x34
  42807. }
  42808. 8012130: 4618 mov r0, r3
  42809. 8012132: 3738 adds r7, #56 @ 0x38
  42810. 8012134: 46bd mov sp, r7
  42811. 8012136: bd80 pop {r7, pc}
  42812. 08012138 <uxQueueMessagesWaiting>:
  42813. return xReturn;
  42814. }
  42815. /*-----------------------------------------------------------*/
  42816. UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue )
  42817. {
  42818. 8012138: b580 push {r7, lr}
  42819. 801213a: b084 sub sp, #16
  42820. 801213c: af00 add r7, sp, #0
  42821. 801213e: 6078 str r0, [r7, #4]
  42822. UBaseType_t uxReturn;
  42823. configASSERT( xQueue );
  42824. 8012140: 687b ldr r3, [r7, #4]
  42825. 8012142: 2b00 cmp r3, #0
  42826. 8012144: d10b bne.n 801215e <uxQueueMessagesWaiting+0x26>
  42827. __asm volatile
  42828. 8012146: f04f 0350 mov.w r3, #80 @ 0x50
  42829. 801214a: f383 8811 msr BASEPRI, r3
  42830. 801214e: f3bf 8f6f isb sy
  42831. 8012152: f3bf 8f4f dsb sy
  42832. 8012156: 60bb str r3, [r7, #8]
  42833. }
  42834. 8012158: bf00 nop
  42835. 801215a: bf00 nop
  42836. 801215c: e7fd b.n 801215a <uxQueueMessagesWaiting+0x22>
  42837. taskENTER_CRITICAL();
  42838. 801215e: f002 fce3 bl 8014b28 <vPortEnterCritical>
  42839. {
  42840. uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting;
  42841. 8012162: 687b ldr r3, [r7, #4]
  42842. 8012164: 6b9b ldr r3, [r3, #56] @ 0x38
  42843. 8012166: 60fb str r3, [r7, #12]
  42844. }
  42845. taskEXIT_CRITICAL();
  42846. 8012168: f002 fd10 bl 8014b8c <vPortExitCritical>
  42847. return uxReturn;
  42848. 801216c: 68fb ldr r3, [r7, #12]
  42849. } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */
  42850. 801216e: 4618 mov r0, r3
  42851. 8012170: 3710 adds r7, #16
  42852. 8012172: 46bd mov sp, r7
  42853. 8012174: bd80 pop {r7, pc}
  42854. 08012176 <uxQueueMessagesWaitingFromISR>:
  42855. return uxReturn;
  42856. } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */
  42857. /*-----------------------------------------------------------*/
  42858. UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue )
  42859. {
  42860. 8012176: b480 push {r7}
  42861. 8012178: b087 sub sp, #28
  42862. 801217a: af00 add r7, sp, #0
  42863. 801217c: 6078 str r0, [r7, #4]
  42864. UBaseType_t uxReturn;
  42865. Queue_t * const pxQueue = xQueue;
  42866. 801217e: 687b ldr r3, [r7, #4]
  42867. 8012180: 617b str r3, [r7, #20]
  42868. configASSERT( pxQueue );
  42869. 8012182: 697b ldr r3, [r7, #20]
  42870. 8012184: 2b00 cmp r3, #0
  42871. 8012186: d10b bne.n 80121a0 <uxQueueMessagesWaitingFromISR+0x2a>
  42872. __asm volatile
  42873. 8012188: f04f 0350 mov.w r3, #80 @ 0x50
  42874. 801218c: f383 8811 msr BASEPRI, r3
  42875. 8012190: f3bf 8f6f isb sy
  42876. 8012194: f3bf 8f4f dsb sy
  42877. 8012198: 60fb str r3, [r7, #12]
  42878. }
  42879. 801219a: bf00 nop
  42880. 801219c: bf00 nop
  42881. 801219e: e7fd b.n 801219c <uxQueueMessagesWaitingFromISR+0x26>
  42882. uxReturn = pxQueue->uxMessagesWaiting;
  42883. 80121a0: 697b ldr r3, [r7, #20]
  42884. 80121a2: 6b9b ldr r3, [r3, #56] @ 0x38
  42885. 80121a4: 613b str r3, [r7, #16]
  42886. return uxReturn;
  42887. 80121a6: 693b ldr r3, [r7, #16]
  42888. } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */
  42889. 80121a8: 4618 mov r0, r3
  42890. 80121aa: 371c adds r7, #28
  42891. 80121ac: 46bd mov sp, r7
  42892. 80121ae: f85d 7b04 ldr.w r7, [sp], #4
  42893. 80121b2: 4770 bx lr
  42894. 080121b4 <vQueueDelete>:
  42895. /*-----------------------------------------------------------*/
  42896. void vQueueDelete( QueueHandle_t xQueue )
  42897. {
  42898. 80121b4: b580 push {r7, lr}
  42899. 80121b6: b084 sub sp, #16
  42900. 80121b8: af00 add r7, sp, #0
  42901. 80121ba: 6078 str r0, [r7, #4]
  42902. Queue_t * const pxQueue = xQueue;
  42903. 80121bc: 687b ldr r3, [r7, #4]
  42904. 80121be: 60fb str r3, [r7, #12]
  42905. configASSERT( pxQueue );
  42906. 80121c0: 68fb ldr r3, [r7, #12]
  42907. 80121c2: 2b00 cmp r3, #0
  42908. 80121c4: d10b bne.n 80121de <vQueueDelete+0x2a>
  42909. __asm volatile
  42910. 80121c6: f04f 0350 mov.w r3, #80 @ 0x50
  42911. 80121ca: f383 8811 msr BASEPRI, r3
  42912. 80121ce: f3bf 8f6f isb sy
  42913. 80121d2: f3bf 8f4f dsb sy
  42914. 80121d6: 60bb str r3, [r7, #8]
  42915. }
  42916. 80121d8: bf00 nop
  42917. 80121da: bf00 nop
  42918. 80121dc: e7fd b.n 80121da <vQueueDelete+0x26>
  42919. traceQUEUE_DELETE( pxQueue );
  42920. #if ( configQUEUE_REGISTRY_SIZE > 0 )
  42921. {
  42922. vQueueUnregisterQueue( pxQueue );
  42923. 80121de: 68f8 ldr r0, [r7, #12]
  42924. 80121e0: f000 f95e bl 80124a0 <vQueueUnregisterQueue>
  42925. }
  42926. #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
  42927. {
  42928. /* The queue could have been allocated statically or dynamically, so
  42929. check before attempting to free the memory. */
  42930. if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE )
  42931. 80121e4: 68fb ldr r3, [r7, #12]
  42932. 80121e6: f893 3046 ldrb.w r3, [r3, #70] @ 0x46
  42933. 80121ea: 2b00 cmp r3, #0
  42934. 80121ec: d102 bne.n 80121f4 <vQueueDelete+0x40>
  42935. {
  42936. vPortFree( pxQueue );
  42937. 80121ee: 68f8 ldr r0, [r7, #12]
  42938. 80121f0: f002 fe8a bl 8014f08 <vPortFree>
  42939. /* The queue must have been statically allocated, so is not going to be
  42940. deleted. Avoid compiler warnings about the unused parameter. */
  42941. ( void ) pxQueue;
  42942. }
  42943. #endif /* configSUPPORT_DYNAMIC_ALLOCATION */
  42944. }
  42945. 80121f4: bf00 nop
  42946. 80121f6: 3710 adds r7, #16
  42947. 80121f8: 46bd mov sp, r7
  42948. 80121fa: bd80 pop {r7, pc}
  42949. 080121fc <prvGetDisinheritPriorityAfterTimeout>:
  42950. /*-----------------------------------------------------------*/
  42951. #if( configUSE_MUTEXES == 1 )
  42952. static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue )
  42953. {
  42954. 80121fc: b480 push {r7}
  42955. 80121fe: b085 sub sp, #20
  42956. 8012200: af00 add r7, sp, #0
  42957. 8012202: 6078 str r0, [r7, #4]
  42958. priority, but the waiting task times out, then the holder should
  42959. disinherit the priority - but only down to the highest priority of any
  42960. other tasks that are waiting for the same mutex. For this purpose,
  42961. return the priority of the highest priority task that is waiting for the
  42962. mutex. */
  42963. if( listCURRENT_LIST_LENGTH( &( pxQueue->xTasksWaitingToReceive ) ) > 0U )
  42964. 8012204: 687b ldr r3, [r7, #4]
  42965. 8012206: 6a5b ldr r3, [r3, #36] @ 0x24
  42966. 8012208: 2b00 cmp r3, #0
  42967. 801220a: d006 beq.n 801221a <prvGetDisinheritPriorityAfterTimeout+0x1e>
  42968. {
  42969. uxHighestPriorityOfWaitingTasks = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) listGET_ITEM_VALUE_OF_HEAD_ENTRY( &( pxQueue->xTasksWaitingToReceive ) );
  42970. 801220c: 687b ldr r3, [r7, #4]
  42971. 801220e: 6b1b ldr r3, [r3, #48] @ 0x30
  42972. 8012210: 681b ldr r3, [r3, #0]
  42973. 8012212: f1c3 0338 rsb r3, r3, #56 @ 0x38
  42974. 8012216: 60fb str r3, [r7, #12]
  42975. 8012218: e001 b.n 801221e <prvGetDisinheritPriorityAfterTimeout+0x22>
  42976. }
  42977. else
  42978. {
  42979. uxHighestPriorityOfWaitingTasks = tskIDLE_PRIORITY;
  42980. 801221a: 2300 movs r3, #0
  42981. 801221c: 60fb str r3, [r7, #12]
  42982. }
  42983. return uxHighestPriorityOfWaitingTasks;
  42984. 801221e: 68fb ldr r3, [r7, #12]
  42985. }
  42986. 8012220: 4618 mov r0, r3
  42987. 8012222: 3714 adds r7, #20
  42988. 8012224: 46bd mov sp, r7
  42989. 8012226: f85d 7b04 ldr.w r7, [sp], #4
  42990. 801222a: 4770 bx lr
  42991. 0801222c <prvCopyDataToQueue>:
  42992. #endif /* configUSE_MUTEXES */
  42993. /*-----------------------------------------------------------*/
  42994. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  42995. {
  42996. 801222c: b580 push {r7, lr}
  42997. 801222e: b086 sub sp, #24
  42998. 8012230: af00 add r7, sp, #0
  42999. 8012232: 60f8 str r0, [r7, #12]
  43000. 8012234: 60b9 str r1, [r7, #8]
  43001. 8012236: 607a str r2, [r7, #4]
  43002. BaseType_t xReturn = pdFALSE;
  43003. 8012238: 2300 movs r3, #0
  43004. 801223a: 617b str r3, [r7, #20]
  43005. UBaseType_t uxMessagesWaiting;
  43006. /* This function is called from a critical section. */
  43007. uxMessagesWaiting = pxQueue->uxMessagesWaiting;
  43008. 801223c: 68fb ldr r3, [r7, #12]
  43009. 801223e: 6b9b ldr r3, [r3, #56] @ 0x38
  43010. 8012240: 613b str r3, [r7, #16]
  43011. if( pxQueue->uxItemSize == ( UBaseType_t ) 0 )
  43012. 8012242: 68fb ldr r3, [r7, #12]
  43013. 8012244: 6c1b ldr r3, [r3, #64] @ 0x40
  43014. 8012246: 2b00 cmp r3, #0
  43015. 8012248: d10d bne.n 8012266 <prvCopyDataToQueue+0x3a>
  43016. {
  43017. #if ( configUSE_MUTEXES == 1 )
  43018. {
  43019. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  43020. 801224a: 68fb ldr r3, [r7, #12]
  43021. 801224c: 681b ldr r3, [r3, #0]
  43022. 801224e: 2b00 cmp r3, #0
  43023. 8012250: d14d bne.n 80122ee <prvCopyDataToQueue+0xc2>
  43024. {
  43025. /* The mutex is no longer being held. */
  43026. xReturn = xTaskPriorityDisinherit( pxQueue->u.xSemaphore.xMutexHolder );
  43027. 8012252: 68fb ldr r3, [r7, #12]
  43028. 8012254: 689b ldr r3, [r3, #8]
  43029. 8012256: 4618 mov r0, r3
  43030. 8012258: f001 fc4e bl 8013af8 <xTaskPriorityDisinherit>
  43031. 801225c: 6178 str r0, [r7, #20]
  43032. pxQueue->u.xSemaphore.xMutexHolder = NULL;
  43033. 801225e: 68fb ldr r3, [r7, #12]
  43034. 8012260: 2200 movs r2, #0
  43035. 8012262: 609a str r2, [r3, #8]
  43036. 8012264: e043 b.n 80122ee <prvCopyDataToQueue+0xc2>
  43037. mtCOVERAGE_TEST_MARKER();
  43038. }
  43039. }
  43040. #endif /* configUSE_MUTEXES */
  43041. }
  43042. else if( xPosition == queueSEND_TO_BACK )
  43043. 8012266: 687b ldr r3, [r7, #4]
  43044. 8012268: 2b00 cmp r3, #0
  43045. 801226a: d119 bne.n 80122a0 <prvCopyDataToQueue+0x74>
  43046. {
  43047. ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */
  43048. 801226c: 68fb ldr r3, [r7, #12]
  43049. 801226e: 6858 ldr r0, [r3, #4]
  43050. 8012270: 68fb ldr r3, [r7, #12]
  43051. 8012272: 6c1b ldr r3, [r3, #64] @ 0x40
  43052. 8012274: 461a mov r2, r3
  43053. 8012276: 68b9 ldr r1, [r7, #8]
  43054. 8012278: f017 fe31 bl 8029ede <memcpy>
  43055. pxQueue->pcWriteTo += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */
  43056. 801227c: 68fb ldr r3, [r7, #12]
  43057. 801227e: 685a ldr r2, [r3, #4]
  43058. 8012280: 68fb ldr r3, [r7, #12]
  43059. 8012282: 6c1b ldr r3, [r3, #64] @ 0x40
  43060. 8012284: 441a add r2, r3
  43061. 8012286: 68fb ldr r3, [r7, #12]
  43062. 8012288: 605a str r2, [r3, #4]
  43063. if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  43064. 801228a: 68fb ldr r3, [r7, #12]
  43065. 801228c: 685a ldr r2, [r3, #4]
  43066. 801228e: 68fb ldr r3, [r7, #12]
  43067. 8012290: 689b ldr r3, [r3, #8]
  43068. 8012292: 429a cmp r2, r3
  43069. 8012294: d32b bcc.n 80122ee <prvCopyDataToQueue+0xc2>
  43070. {
  43071. pxQueue->pcWriteTo = pxQueue->pcHead;
  43072. 8012296: 68fb ldr r3, [r7, #12]
  43073. 8012298: 681a ldr r2, [r3, #0]
  43074. 801229a: 68fb ldr r3, [r7, #12]
  43075. 801229c: 605a str r2, [r3, #4]
  43076. 801229e: e026 b.n 80122ee <prvCopyDataToQueue+0xc2>
  43077. mtCOVERAGE_TEST_MARKER();
  43078. }
  43079. }
  43080. else
  43081. {
  43082. ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e9087 !e418 MISRA exception as the casts are only redundant for some ports. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. Assert checks null pointer only used when length is 0. */
  43083. 80122a0: 68fb ldr r3, [r7, #12]
  43084. 80122a2: 68d8 ldr r0, [r3, #12]
  43085. 80122a4: 68fb ldr r3, [r7, #12]
  43086. 80122a6: 6c1b ldr r3, [r3, #64] @ 0x40
  43087. 80122a8: 461a mov r2, r3
  43088. 80122aa: 68b9 ldr r1, [r7, #8]
  43089. 80122ac: f017 fe17 bl 8029ede <memcpy>
  43090. pxQueue->u.xQueue.pcReadFrom -= pxQueue->uxItemSize;
  43091. 80122b0: 68fb ldr r3, [r7, #12]
  43092. 80122b2: 68da ldr r2, [r3, #12]
  43093. 80122b4: 68fb ldr r3, [r7, #12]
  43094. 80122b6: 6c1b ldr r3, [r3, #64] @ 0x40
  43095. 80122b8: 425b negs r3, r3
  43096. 80122ba: 441a add r2, r3
  43097. 80122bc: 68fb ldr r3, [r7, #12]
  43098. 80122be: 60da str r2, [r3, #12]
  43099. if( pxQueue->u.xQueue.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  43100. 80122c0: 68fb ldr r3, [r7, #12]
  43101. 80122c2: 68da ldr r2, [r3, #12]
  43102. 80122c4: 68fb ldr r3, [r7, #12]
  43103. 80122c6: 681b ldr r3, [r3, #0]
  43104. 80122c8: 429a cmp r2, r3
  43105. 80122ca: d207 bcs.n 80122dc <prvCopyDataToQueue+0xb0>
  43106. {
  43107. pxQueue->u.xQueue.pcReadFrom = ( pxQueue->u.xQueue.pcTail - pxQueue->uxItemSize );
  43108. 80122cc: 68fb ldr r3, [r7, #12]
  43109. 80122ce: 689a ldr r2, [r3, #8]
  43110. 80122d0: 68fb ldr r3, [r7, #12]
  43111. 80122d2: 6c1b ldr r3, [r3, #64] @ 0x40
  43112. 80122d4: 425b negs r3, r3
  43113. 80122d6: 441a add r2, r3
  43114. 80122d8: 68fb ldr r3, [r7, #12]
  43115. 80122da: 60da str r2, [r3, #12]
  43116. else
  43117. {
  43118. mtCOVERAGE_TEST_MARKER();
  43119. }
  43120. if( xPosition == queueOVERWRITE )
  43121. 80122dc: 687b ldr r3, [r7, #4]
  43122. 80122de: 2b02 cmp r3, #2
  43123. 80122e0: d105 bne.n 80122ee <prvCopyDataToQueue+0xc2>
  43124. {
  43125. if( uxMessagesWaiting > ( UBaseType_t ) 0 )
  43126. 80122e2: 693b ldr r3, [r7, #16]
  43127. 80122e4: 2b00 cmp r3, #0
  43128. 80122e6: d002 beq.n 80122ee <prvCopyDataToQueue+0xc2>
  43129. {
  43130. /* An item is not being added but overwritten, so subtract
  43131. one from the recorded number of items in the queue so when
  43132. one is added again below the number of recorded items remains
  43133. correct. */
  43134. --uxMessagesWaiting;
  43135. 80122e8: 693b ldr r3, [r7, #16]
  43136. 80122ea: 3b01 subs r3, #1
  43137. 80122ec: 613b str r3, [r7, #16]
  43138. {
  43139. mtCOVERAGE_TEST_MARKER();
  43140. }
  43141. }
  43142. pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1;
  43143. 80122ee: 693b ldr r3, [r7, #16]
  43144. 80122f0: 1c5a adds r2, r3, #1
  43145. 80122f2: 68fb ldr r3, [r7, #12]
  43146. 80122f4: 639a str r2, [r3, #56] @ 0x38
  43147. return xReturn;
  43148. 80122f6: 697b ldr r3, [r7, #20]
  43149. }
  43150. 80122f8: 4618 mov r0, r3
  43151. 80122fa: 3718 adds r7, #24
  43152. 80122fc: 46bd mov sp, r7
  43153. 80122fe: bd80 pop {r7, pc}
  43154. 08012300 <prvCopyDataFromQueue>:
  43155. /*-----------------------------------------------------------*/
  43156. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  43157. {
  43158. 8012300: b580 push {r7, lr}
  43159. 8012302: b082 sub sp, #8
  43160. 8012304: af00 add r7, sp, #0
  43161. 8012306: 6078 str r0, [r7, #4]
  43162. 8012308: 6039 str r1, [r7, #0]
  43163. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  43164. 801230a: 687b ldr r3, [r7, #4]
  43165. 801230c: 6c1b ldr r3, [r3, #64] @ 0x40
  43166. 801230e: 2b00 cmp r3, #0
  43167. 8012310: d018 beq.n 8012344 <prvCopyDataFromQueue+0x44>
  43168. {
  43169. pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */
  43170. 8012312: 687b ldr r3, [r7, #4]
  43171. 8012314: 68da ldr r2, [r3, #12]
  43172. 8012316: 687b ldr r3, [r7, #4]
  43173. 8012318: 6c1b ldr r3, [r3, #64] @ 0x40
  43174. 801231a: 441a add r2, r3
  43175. 801231c: 687b ldr r3, [r7, #4]
  43176. 801231e: 60da str r2, [r3, #12]
  43177. if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */
  43178. 8012320: 687b ldr r3, [r7, #4]
  43179. 8012322: 68da ldr r2, [r3, #12]
  43180. 8012324: 687b ldr r3, [r7, #4]
  43181. 8012326: 689b ldr r3, [r3, #8]
  43182. 8012328: 429a cmp r2, r3
  43183. 801232a: d303 bcc.n 8012334 <prvCopyDataFromQueue+0x34>
  43184. {
  43185. pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead;
  43186. 801232c: 687b ldr r3, [r7, #4]
  43187. 801232e: 681a ldr r2, [r3, #0]
  43188. 8012330: 687b ldr r3, [r7, #4]
  43189. 8012332: 60da str r2, [r3, #12]
  43190. }
  43191. else
  43192. {
  43193. mtCOVERAGE_TEST_MARKER();
  43194. }
  43195. ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */
  43196. 8012334: 687b ldr r3, [r7, #4]
  43197. 8012336: 68d9 ldr r1, [r3, #12]
  43198. 8012338: 687b ldr r3, [r7, #4]
  43199. 801233a: 6c1b ldr r3, [r3, #64] @ 0x40
  43200. 801233c: 461a mov r2, r3
  43201. 801233e: 6838 ldr r0, [r7, #0]
  43202. 8012340: f017 fdcd bl 8029ede <memcpy>
  43203. }
  43204. }
  43205. 8012344: bf00 nop
  43206. 8012346: 3708 adds r7, #8
  43207. 8012348: 46bd mov sp, r7
  43208. 801234a: bd80 pop {r7, pc}
  43209. 0801234c <prvUnlockQueue>:
  43210. /*-----------------------------------------------------------*/
  43211. static void prvUnlockQueue( Queue_t * const pxQueue )
  43212. {
  43213. 801234c: b580 push {r7, lr}
  43214. 801234e: b084 sub sp, #16
  43215. 8012350: af00 add r7, sp, #0
  43216. 8012352: 6078 str r0, [r7, #4]
  43217. /* The lock counts contains the number of extra data items placed or
  43218. removed from the queue while the queue was locked. When a queue is
  43219. locked items can be added or removed, but the event lists cannot be
  43220. updated. */
  43221. taskENTER_CRITICAL();
  43222. 8012354: f002 fbe8 bl 8014b28 <vPortEnterCritical>
  43223. {
  43224. int8_t cTxLock = pxQueue->cTxLock;
  43225. 8012358: 687b ldr r3, [r7, #4]
  43226. 801235a: f893 3045 ldrb.w r3, [r3, #69] @ 0x45
  43227. 801235e: 73fb strb r3, [r7, #15]
  43228. /* See if data was added to the queue while it was locked. */
  43229. while( cTxLock > queueLOCKED_UNMODIFIED )
  43230. 8012360: e011 b.n 8012386 <prvUnlockQueue+0x3a>
  43231. }
  43232. #else /* configUSE_QUEUE_SETS */
  43233. {
  43234. /* Tasks that are removed from the event list will get added to
  43235. the pending ready list as the scheduler is still suspended. */
  43236. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  43237. 8012362: 687b ldr r3, [r7, #4]
  43238. 8012364: 6a5b ldr r3, [r3, #36] @ 0x24
  43239. 8012366: 2b00 cmp r3, #0
  43240. 8012368: d012 beq.n 8012390 <prvUnlockQueue+0x44>
  43241. {
  43242. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  43243. 801236a: 687b ldr r3, [r7, #4]
  43244. 801236c: 3324 adds r3, #36 @ 0x24
  43245. 801236e: 4618 mov r0, r3
  43246. 8012370: f001 f93e bl 80135f0 <xTaskRemoveFromEventList>
  43247. 8012374: 4603 mov r3, r0
  43248. 8012376: 2b00 cmp r3, #0
  43249. 8012378: d001 beq.n 801237e <prvUnlockQueue+0x32>
  43250. {
  43251. /* The task waiting has a higher priority so record that
  43252. a context switch is required. */
  43253. vTaskMissedYield();
  43254. 801237a: f001 fa3f bl 80137fc <vTaskMissedYield>
  43255. break;
  43256. }
  43257. }
  43258. #endif /* configUSE_QUEUE_SETS */
  43259. --cTxLock;
  43260. 801237e: 7bfb ldrb r3, [r7, #15]
  43261. 8012380: 3b01 subs r3, #1
  43262. 8012382: b2db uxtb r3, r3
  43263. 8012384: 73fb strb r3, [r7, #15]
  43264. while( cTxLock > queueLOCKED_UNMODIFIED )
  43265. 8012386: f997 300f ldrsb.w r3, [r7, #15]
  43266. 801238a: 2b00 cmp r3, #0
  43267. 801238c: dce9 bgt.n 8012362 <prvUnlockQueue+0x16>
  43268. 801238e: e000 b.n 8012392 <prvUnlockQueue+0x46>
  43269. break;
  43270. 8012390: bf00 nop
  43271. }
  43272. pxQueue->cTxLock = queueUNLOCKED;
  43273. 8012392: 687b ldr r3, [r7, #4]
  43274. 8012394: 22ff movs r2, #255 @ 0xff
  43275. 8012396: f883 2045 strb.w r2, [r3, #69] @ 0x45
  43276. }
  43277. taskEXIT_CRITICAL();
  43278. 801239a: f002 fbf7 bl 8014b8c <vPortExitCritical>
  43279. /* Do the same for the Rx lock. */
  43280. taskENTER_CRITICAL();
  43281. 801239e: f002 fbc3 bl 8014b28 <vPortEnterCritical>
  43282. {
  43283. int8_t cRxLock = pxQueue->cRxLock;
  43284. 80123a2: 687b ldr r3, [r7, #4]
  43285. 80123a4: f893 3044 ldrb.w r3, [r3, #68] @ 0x44
  43286. 80123a8: 73bb strb r3, [r7, #14]
  43287. while( cRxLock > queueLOCKED_UNMODIFIED )
  43288. 80123aa: e011 b.n 80123d0 <prvUnlockQueue+0x84>
  43289. {
  43290. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  43291. 80123ac: 687b ldr r3, [r7, #4]
  43292. 80123ae: 691b ldr r3, [r3, #16]
  43293. 80123b0: 2b00 cmp r3, #0
  43294. 80123b2: d012 beq.n 80123da <prvUnlockQueue+0x8e>
  43295. {
  43296. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  43297. 80123b4: 687b ldr r3, [r7, #4]
  43298. 80123b6: 3310 adds r3, #16
  43299. 80123b8: 4618 mov r0, r3
  43300. 80123ba: f001 f919 bl 80135f0 <xTaskRemoveFromEventList>
  43301. 80123be: 4603 mov r3, r0
  43302. 80123c0: 2b00 cmp r3, #0
  43303. 80123c2: d001 beq.n 80123c8 <prvUnlockQueue+0x7c>
  43304. {
  43305. vTaskMissedYield();
  43306. 80123c4: f001 fa1a bl 80137fc <vTaskMissedYield>
  43307. else
  43308. {
  43309. mtCOVERAGE_TEST_MARKER();
  43310. }
  43311. --cRxLock;
  43312. 80123c8: 7bbb ldrb r3, [r7, #14]
  43313. 80123ca: 3b01 subs r3, #1
  43314. 80123cc: b2db uxtb r3, r3
  43315. 80123ce: 73bb strb r3, [r7, #14]
  43316. while( cRxLock > queueLOCKED_UNMODIFIED )
  43317. 80123d0: f997 300e ldrsb.w r3, [r7, #14]
  43318. 80123d4: 2b00 cmp r3, #0
  43319. 80123d6: dce9 bgt.n 80123ac <prvUnlockQueue+0x60>
  43320. 80123d8: e000 b.n 80123dc <prvUnlockQueue+0x90>
  43321. }
  43322. else
  43323. {
  43324. break;
  43325. 80123da: bf00 nop
  43326. }
  43327. }
  43328. pxQueue->cRxLock = queueUNLOCKED;
  43329. 80123dc: 687b ldr r3, [r7, #4]
  43330. 80123de: 22ff movs r2, #255 @ 0xff
  43331. 80123e0: f883 2044 strb.w r2, [r3, #68] @ 0x44
  43332. }
  43333. taskEXIT_CRITICAL();
  43334. 80123e4: f002 fbd2 bl 8014b8c <vPortExitCritical>
  43335. }
  43336. 80123e8: bf00 nop
  43337. 80123ea: 3710 adds r7, #16
  43338. 80123ec: 46bd mov sp, r7
  43339. 80123ee: bd80 pop {r7, pc}
  43340. 080123f0 <prvIsQueueEmpty>:
  43341. /*-----------------------------------------------------------*/
  43342. static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue )
  43343. {
  43344. 80123f0: b580 push {r7, lr}
  43345. 80123f2: b084 sub sp, #16
  43346. 80123f4: af00 add r7, sp, #0
  43347. 80123f6: 6078 str r0, [r7, #4]
  43348. BaseType_t xReturn;
  43349. taskENTER_CRITICAL();
  43350. 80123f8: f002 fb96 bl 8014b28 <vPortEnterCritical>
  43351. {
  43352. if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 )
  43353. 80123fc: 687b ldr r3, [r7, #4]
  43354. 80123fe: 6b9b ldr r3, [r3, #56] @ 0x38
  43355. 8012400: 2b00 cmp r3, #0
  43356. 8012402: d102 bne.n 801240a <prvIsQueueEmpty+0x1a>
  43357. {
  43358. xReturn = pdTRUE;
  43359. 8012404: 2301 movs r3, #1
  43360. 8012406: 60fb str r3, [r7, #12]
  43361. 8012408: e001 b.n 801240e <prvIsQueueEmpty+0x1e>
  43362. }
  43363. else
  43364. {
  43365. xReturn = pdFALSE;
  43366. 801240a: 2300 movs r3, #0
  43367. 801240c: 60fb str r3, [r7, #12]
  43368. }
  43369. }
  43370. taskEXIT_CRITICAL();
  43371. 801240e: f002 fbbd bl 8014b8c <vPortExitCritical>
  43372. return xReturn;
  43373. 8012412: 68fb ldr r3, [r7, #12]
  43374. }
  43375. 8012414: 4618 mov r0, r3
  43376. 8012416: 3710 adds r7, #16
  43377. 8012418: 46bd mov sp, r7
  43378. 801241a: bd80 pop {r7, pc}
  43379. 0801241c <prvIsQueueFull>:
  43380. return xReturn;
  43381. } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */
  43382. /*-----------------------------------------------------------*/
  43383. static BaseType_t prvIsQueueFull( const Queue_t *pxQueue )
  43384. {
  43385. 801241c: b580 push {r7, lr}
  43386. 801241e: b084 sub sp, #16
  43387. 8012420: af00 add r7, sp, #0
  43388. 8012422: 6078 str r0, [r7, #4]
  43389. BaseType_t xReturn;
  43390. taskENTER_CRITICAL();
  43391. 8012424: f002 fb80 bl 8014b28 <vPortEnterCritical>
  43392. {
  43393. if( pxQueue->uxMessagesWaiting == pxQueue->uxLength )
  43394. 8012428: 687b ldr r3, [r7, #4]
  43395. 801242a: 6b9a ldr r2, [r3, #56] @ 0x38
  43396. 801242c: 687b ldr r3, [r7, #4]
  43397. 801242e: 6bdb ldr r3, [r3, #60] @ 0x3c
  43398. 8012430: 429a cmp r2, r3
  43399. 8012432: d102 bne.n 801243a <prvIsQueueFull+0x1e>
  43400. {
  43401. xReturn = pdTRUE;
  43402. 8012434: 2301 movs r3, #1
  43403. 8012436: 60fb str r3, [r7, #12]
  43404. 8012438: e001 b.n 801243e <prvIsQueueFull+0x22>
  43405. }
  43406. else
  43407. {
  43408. xReturn = pdFALSE;
  43409. 801243a: 2300 movs r3, #0
  43410. 801243c: 60fb str r3, [r7, #12]
  43411. }
  43412. }
  43413. taskEXIT_CRITICAL();
  43414. 801243e: f002 fba5 bl 8014b8c <vPortExitCritical>
  43415. return xReturn;
  43416. 8012442: 68fb ldr r3, [r7, #12]
  43417. }
  43418. 8012444: 4618 mov r0, r3
  43419. 8012446: 3710 adds r7, #16
  43420. 8012448: 46bd mov sp, r7
  43421. 801244a: bd80 pop {r7, pc}
  43422. 0801244c <vQueueAddToRegistry>:
  43423. /*-----------------------------------------------------------*/
  43424. #if ( configQUEUE_REGISTRY_SIZE > 0 )
  43425. void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
  43426. {
  43427. 801244c: b480 push {r7}
  43428. 801244e: b085 sub sp, #20
  43429. 8012450: af00 add r7, sp, #0
  43430. 8012452: 6078 str r0, [r7, #4]
  43431. 8012454: 6039 str r1, [r7, #0]
  43432. UBaseType_t ux;
  43433. /* See if there is an empty space in the registry. A NULL name denotes
  43434. a free slot. */
  43435. for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )
  43436. 8012456: 2300 movs r3, #0
  43437. 8012458: 60fb str r3, [r7, #12]
  43438. 801245a: e014 b.n 8012486 <vQueueAddToRegistry+0x3a>
  43439. {
  43440. if( xQueueRegistry[ ux ].pcQueueName == NULL )
  43441. 801245c: 4a0f ldr r2, [pc, #60] @ (801249c <vQueueAddToRegistry+0x50>)
  43442. 801245e: 68fb ldr r3, [r7, #12]
  43443. 8012460: f852 3033 ldr.w r3, [r2, r3, lsl #3]
  43444. 8012464: 2b00 cmp r3, #0
  43445. 8012466: d10b bne.n 8012480 <vQueueAddToRegistry+0x34>
  43446. {
  43447. /* Store the information on this queue. */
  43448. xQueueRegistry[ ux ].pcQueueName = pcQueueName;
  43449. 8012468: 490c ldr r1, [pc, #48] @ (801249c <vQueueAddToRegistry+0x50>)
  43450. 801246a: 68fb ldr r3, [r7, #12]
  43451. 801246c: 683a ldr r2, [r7, #0]
  43452. 801246e: f841 2033 str.w r2, [r1, r3, lsl #3]
  43453. xQueueRegistry[ ux ].xHandle = xQueue;
  43454. 8012472: 4a0a ldr r2, [pc, #40] @ (801249c <vQueueAddToRegistry+0x50>)
  43455. 8012474: 68fb ldr r3, [r7, #12]
  43456. 8012476: 00db lsls r3, r3, #3
  43457. 8012478: 4413 add r3, r2
  43458. 801247a: 687a ldr r2, [r7, #4]
  43459. 801247c: 605a str r2, [r3, #4]
  43460. traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName );
  43461. break;
  43462. 801247e: e006 b.n 801248e <vQueueAddToRegistry+0x42>
  43463. for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )
  43464. 8012480: 68fb ldr r3, [r7, #12]
  43465. 8012482: 3301 adds r3, #1
  43466. 8012484: 60fb str r3, [r7, #12]
  43467. 8012486: 68fb ldr r3, [r7, #12]
  43468. 8012488: 2b07 cmp r3, #7
  43469. 801248a: d9e7 bls.n 801245c <vQueueAddToRegistry+0x10>
  43470. else
  43471. {
  43472. mtCOVERAGE_TEST_MARKER();
  43473. }
  43474. }
  43475. }
  43476. 801248c: bf00 nop
  43477. 801248e: bf00 nop
  43478. 8012490: 3714 adds r7, #20
  43479. 8012492: 46bd mov sp, r7
  43480. 8012494: f85d 7b04 ldr.w r7, [sp], #4
  43481. 8012498: 4770 bx lr
  43482. 801249a: bf00 nop
  43483. 801249c: 24003c50 .word 0x24003c50
  43484. 080124a0 <vQueueUnregisterQueue>:
  43485. /*-----------------------------------------------------------*/
  43486. #if ( configQUEUE_REGISTRY_SIZE > 0 )
  43487. void vQueueUnregisterQueue( QueueHandle_t xQueue )
  43488. {
  43489. 80124a0: b480 push {r7}
  43490. 80124a2: b085 sub sp, #20
  43491. 80124a4: af00 add r7, sp, #0
  43492. 80124a6: 6078 str r0, [r7, #4]
  43493. UBaseType_t ux;
  43494. /* See if the handle of the queue being unregistered in actually in the
  43495. registry. */
  43496. for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )
  43497. 80124a8: 2300 movs r3, #0
  43498. 80124aa: 60fb str r3, [r7, #12]
  43499. 80124ac: e016 b.n 80124dc <vQueueUnregisterQueue+0x3c>
  43500. {
  43501. if( xQueueRegistry[ ux ].xHandle == xQueue )
  43502. 80124ae: 4a10 ldr r2, [pc, #64] @ (80124f0 <vQueueUnregisterQueue+0x50>)
  43503. 80124b0: 68fb ldr r3, [r7, #12]
  43504. 80124b2: 00db lsls r3, r3, #3
  43505. 80124b4: 4413 add r3, r2
  43506. 80124b6: 685b ldr r3, [r3, #4]
  43507. 80124b8: 687a ldr r2, [r7, #4]
  43508. 80124ba: 429a cmp r2, r3
  43509. 80124bc: d10b bne.n 80124d6 <vQueueUnregisterQueue+0x36>
  43510. {
  43511. /* Set the name to NULL to show that this slot if free again. */
  43512. xQueueRegistry[ ux ].pcQueueName = NULL;
  43513. 80124be: 4a0c ldr r2, [pc, #48] @ (80124f0 <vQueueUnregisterQueue+0x50>)
  43514. 80124c0: 68fb ldr r3, [r7, #12]
  43515. 80124c2: 2100 movs r1, #0
  43516. 80124c4: f842 1033 str.w r1, [r2, r3, lsl #3]
  43517. /* Set the handle to NULL to ensure the same queue handle cannot
  43518. appear in the registry twice if it is added, removed, then
  43519. added again. */
  43520. xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0;
  43521. 80124c8: 4a09 ldr r2, [pc, #36] @ (80124f0 <vQueueUnregisterQueue+0x50>)
  43522. 80124ca: 68fb ldr r3, [r7, #12]
  43523. 80124cc: 00db lsls r3, r3, #3
  43524. 80124ce: 4413 add r3, r2
  43525. 80124d0: 2200 movs r2, #0
  43526. 80124d2: 605a str r2, [r3, #4]
  43527. break;
  43528. 80124d4: e006 b.n 80124e4 <vQueueUnregisterQueue+0x44>
  43529. for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )
  43530. 80124d6: 68fb ldr r3, [r7, #12]
  43531. 80124d8: 3301 adds r3, #1
  43532. 80124da: 60fb str r3, [r7, #12]
  43533. 80124dc: 68fb ldr r3, [r7, #12]
  43534. 80124de: 2b07 cmp r3, #7
  43535. 80124e0: d9e5 bls.n 80124ae <vQueueUnregisterQueue+0xe>
  43536. {
  43537. mtCOVERAGE_TEST_MARKER();
  43538. }
  43539. }
  43540. } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */
  43541. 80124e2: bf00 nop
  43542. 80124e4: bf00 nop
  43543. 80124e6: 3714 adds r7, #20
  43544. 80124e8: 46bd mov sp, r7
  43545. 80124ea: f85d 7b04 ldr.w r7, [sp], #4
  43546. 80124ee: 4770 bx lr
  43547. 80124f0: 24003c50 .word 0x24003c50
  43548. 080124f4 <vQueueWaitForMessageRestricted>:
  43549. /*-----------------------------------------------------------*/
  43550. #if ( configUSE_TIMERS == 1 )
  43551. void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely )
  43552. {
  43553. 80124f4: b580 push {r7, lr}
  43554. 80124f6: b086 sub sp, #24
  43555. 80124f8: af00 add r7, sp, #0
  43556. 80124fa: 60f8 str r0, [r7, #12]
  43557. 80124fc: 60b9 str r1, [r7, #8]
  43558. 80124fe: 607a str r2, [r7, #4]
  43559. Queue_t * const pxQueue = xQueue;
  43560. 8012500: 68fb ldr r3, [r7, #12]
  43561. 8012502: 617b str r3, [r7, #20]
  43562. will not actually cause the task to block, just place it on a blocked
  43563. list. It will not block until the scheduler is unlocked - at which
  43564. time a yield will be performed. If an item is added to the queue while
  43565. the queue is locked, and the calling task blocks on the queue, then the
  43566. calling task will be immediately unblocked when the queue is unlocked. */
  43567. prvLockQueue( pxQueue );
  43568. 8012504: f002 fb10 bl 8014b28 <vPortEnterCritical>
  43569. 8012508: 697b ldr r3, [r7, #20]
  43570. 801250a: f893 3044 ldrb.w r3, [r3, #68] @ 0x44
  43571. 801250e: b25b sxtb r3, r3
  43572. 8012510: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  43573. 8012514: d103 bne.n 801251e <vQueueWaitForMessageRestricted+0x2a>
  43574. 8012516: 697b ldr r3, [r7, #20]
  43575. 8012518: 2200 movs r2, #0
  43576. 801251a: f883 2044 strb.w r2, [r3, #68] @ 0x44
  43577. 801251e: 697b ldr r3, [r7, #20]
  43578. 8012520: f893 3045 ldrb.w r3, [r3, #69] @ 0x45
  43579. 8012524: b25b sxtb r3, r3
  43580. 8012526: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  43581. 801252a: d103 bne.n 8012534 <vQueueWaitForMessageRestricted+0x40>
  43582. 801252c: 697b ldr r3, [r7, #20]
  43583. 801252e: 2200 movs r2, #0
  43584. 8012530: f883 2045 strb.w r2, [r3, #69] @ 0x45
  43585. 8012534: f002 fb2a bl 8014b8c <vPortExitCritical>
  43586. if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U )
  43587. 8012538: 697b ldr r3, [r7, #20]
  43588. 801253a: 6b9b ldr r3, [r3, #56] @ 0x38
  43589. 801253c: 2b00 cmp r3, #0
  43590. 801253e: d106 bne.n 801254e <vQueueWaitForMessageRestricted+0x5a>
  43591. {
  43592. /* There is nothing in the queue, block for the specified period. */
  43593. vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely );
  43594. 8012540: 697b ldr r3, [r7, #20]
  43595. 8012542: 3324 adds r3, #36 @ 0x24
  43596. 8012544: 687a ldr r2, [r7, #4]
  43597. 8012546: 68b9 ldr r1, [r7, #8]
  43598. 8012548: 4618 mov r0, r3
  43599. 801254a: f001 f825 bl 8013598 <vTaskPlaceOnEventListRestricted>
  43600. }
  43601. else
  43602. {
  43603. mtCOVERAGE_TEST_MARKER();
  43604. }
  43605. prvUnlockQueue( pxQueue );
  43606. 801254e: 6978 ldr r0, [r7, #20]
  43607. 8012550: f7ff fefc bl 801234c <prvUnlockQueue>
  43608. }
  43609. 8012554: bf00 nop
  43610. 8012556: 3718 adds r7, #24
  43611. 8012558: 46bd mov sp, r7
  43612. 801255a: bd80 pop {r7, pc}
  43613. 0801255c <xStreamBufferGenericCreate>:
  43614. /*-----------------------------------------------------------*/
  43615. #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
  43616. StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer )
  43617. {
  43618. 801255c: b580 push {r7, lr}
  43619. 801255e: b08c sub sp, #48 @ 0x30
  43620. 8012560: af02 add r7, sp, #8
  43621. 8012562: 60f8 str r0, [r7, #12]
  43622. 8012564: 60b9 str r1, [r7, #8]
  43623. 8012566: 607a str r2, [r7, #4]
  43624. /* In case the stream buffer is going to be used as a message buffer
  43625. (that is, it will hold discrete messages with a little meta data that
  43626. says how big the next message is) check the buffer will be large enough
  43627. to hold at least one message. */
  43628. if( xIsMessageBuffer == pdTRUE )
  43629. 8012568: 687b ldr r3, [r7, #4]
  43630. 801256a: 2b01 cmp r3, #1
  43631. 801256c: d111 bne.n 8012592 <xStreamBufferGenericCreate+0x36>
  43632. {
  43633. /* Is a message buffer but not statically allocated. */
  43634. ucFlags = sbFLAGS_IS_MESSAGE_BUFFER;
  43635. 801256e: 2301 movs r3, #1
  43636. 8012570: f887 3027 strb.w r3, [r7, #39] @ 0x27
  43637. configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH );
  43638. 8012574: 68fb ldr r3, [r7, #12]
  43639. 8012576: 2b04 cmp r3, #4
  43640. 8012578: d81d bhi.n 80125b6 <xStreamBufferGenericCreate+0x5a>
  43641. __asm volatile
  43642. 801257a: f04f 0350 mov.w r3, #80 @ 0x50
  43643. 801257e: f383 8811 msr BASEPRI, r3
  43644. 8012582: f3bf 8f6f isb sy
  43645. 8012586: f3bf 8f4f dsb sy
  43646. 801258a: 61fb str r3, [r7, #28]
  43647. }
  43648. 801258c: bf00 nop
  43649. 801258e: bf00 nop
  43650. 8012590: e7fd b.n 801258e <xStreamBufferGenericCreate+0x32>
  43651. }
  43652. else
  43653. {
  43654. /* Not a message buffer and not statically allocated. */
  43655. ucFlags = 0;
  43656. 8012592: 2300 movs r3, #0
  43657. 8012594: f887 3027 strb.w r3, [r7, #39] @ 0x27
  43658. configASSERT( xBufferSizeBytes > 0 );
  43659. 8012598: 68fb ldr r3, [r7, #12]
  43660. 801259a: 2b00 cmp r3, #0
  43661. 801259c: d10b bne.n 80125b6 <xStreamBufferGenericCreate+0x5a>
  43662. __asm volatile
  43663. 801259e: f04f 0350 mov.w r3, #80 @ 0x50
  43664. 80125a2: f383 8811 msr BASEPRI, r3
  43665. 80125a6: f3bf 8f6f isb sy
  43666. 80125aa: f3bf 8f4f dsb sy
  43667. 80125ae: 61bb str r3, [r7, #24]
  43668. }
  43669. 80125b0: bf00 nop
  43670. 80125b2: bf00 nop
  43671. 80125b4: e7fd b.n 80125b2 <xStreamBufferGenericCreate+0x56>
  43672. }
  43673. configASSERT( xTriggerLevelBytes <= xBufferSizeBytes );
  43674. 80125b6: 68ba ldr r2, [r7, #8]
  43675. 80125b8: 68fb ldr r3, [r7, #12]
  43676. 80125ba: 429a cmp r2, r3
  43677. 80125bc: d90b bls.n 80125d6 <xStreamBufferGenericCreate+0x7a>
  43678. __asm volatile
  43679. 80125be: f04f 0350 mov.w r3, #80 @ 0x50
  43680. 80125c2: f383 8811 msr BASEPRI, r3
  43681. 80125c6: f3bf 8f6f isb sy
  43682. 80125ca: f3bf 8f4f dsb sy
  43683. 80125ce: 617b str r3, [r7, #20]
  43684. }
  43685. 80125d0: bf00 nop
  43686. 80125d2: bf00 nop
  43687. 80125d4: e7fd b.n 80125d2 <xStreamBufferGenericCreate+0x76>
  43688. /* A trigger level of 0 would cause a waiting task to unblock even when
  43689. the buffer was empty. */
  43690. if( xTriggerLevelBytes == ( size_t ) 0 )
  43691. 80125d6: 68bb ldr r3, [r7, #8]
  43692. 80125d8: 2b00 cmp r3, #0
  43693. 80125da: d101 bne.n 80125e0 <xStreamBufferGenericCreate+0x84>
  43694. {
  43695. xTriggerLevelBytes = ( size_t ) 1;
  43696. 80125dc: 2301 movs r3, #1
  43697. 80125de: 60bb str r3, [r7, #8]
  43698. and the buffer follows immediately after. The requested size is
  43699. incremented so the free space is returned as the user would expect -
  43700. this is a quirk of the implementation that means otherwise the free
  43701. space would be reported as one byte smaller than would be logically
  43702. expected. */
  43703. xBufferSizeBytes++;
  43704. 80125e0: 68fb ldr r3, [r7, #12]
  43705. 80125e2: 3301 adds r3, #1
  43706. 80125e4: 60fb str r3, [r7, #12]
  43707. pucAllocatedMemory = ( uint8_t * ) pvPortMalloc( xBufferSizeBytes + sizeof( StreamBuffer_t ) ); /*lint !e9079 malloc() only returns void*. */
  43708. 80125e6: 68fb ldr r3, [r7, #12]
  43709. 80125e8: 3324 adds r3, #36 @ 0x24
  43710. 80125ea: 4618 mov r0, r3
  43711. 80125ec: f002 fbbe bl 8014d6c <pvPortMalloc>
  43712. 80125f0: 6238 str r0, [r7, #32]
  43713. if( pucAllocatedMemory != NULL )
  43714. 80125f2: 6a3b ldr r3, [r7, #32]
  43715. 80125f4: 2b00 cmp r3, #0
  43716. 80125f6: d00a beq.n 801260e <xStreamBufferGenericCreate+0xb2>
  43717. {
  43718. prvInitialiseNewStreamBuffer( ( StreamBuffer_t * ) pucAllocatedMemory, /* Structure at the start of the allocated memory. */ /*lint !e9087 Safe cast as allocated memory is aligned. */ /*lint !e826 Area is not too small and alignment is guaranteed provided malloc() behaves as expected and returns aligned buffer. */
  43719. 80125f8: 6a3b ldr r3, [r7, #32]
  43720. 80125fa: f103 0124 add.w r1, r3, #36 @ 0x24
  43721. 80125fe: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  43722. 8012602: 9300 str r3, [sp, #0]
  43723. 8012604: 68bb ldr r3, [r7, #8]
  43724. 8012606: 68fa ldr r2, [r7, #12]
  43725. 8012608: 6a38 ldr r0, [r7, #32]
  43726. 801260a: f000 fb0b bl 8012c24 <prvInitialiseNewStreamBuffer>
  43727. else
  43728. {
  43729. traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer );
  43730. }
  43731. return ( StreamBufferHandle_t ) pucAllocatedMemory; /*lint !e9087 !e826 Safe cast as allocated memory is aligned. */
  43732. 801260e: 6a3b ldr r3, [r7, #32]
  43733. }
  43734. 8012610: 4618 mov r0, r3
  43735. 8012612: 3728 adds r7, #40 @ 0x28
  43736. 8012614: 46bd mov sp, r7
  43737. 8012616: bd80 pop {r7, pc}
  43738. 08012618 <xStreamBufferSpacesAvailable>:
  43739. return xReturn;
  43740. }
  43741. /*-----------------------------------------------------------*/
  43742. size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer )
  43743. {
  43744. 8012618: b480 push {r7}
  43745. 801261a: b087 sub sp, #28
  43746. 801261c: af00 add r7, sp, #0
  43747. 801261e: 6078 str r0, [r7, #4]
  43748. const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;
  43749. 8012620: 687b ldr r3, [r7, #4]
  43750. 8012622: 613b str r3, [r7, #16]
  43751. size_t xSpace;
  43752. configASSERT( pxStreamBuffer );
  43753. 8012624: 693b ldr r3, [r7, #16]
  43754. 8012626: 2b00 cmp r3, #0
  43755. 8012628: d10b bne.n 8012642 <xStreamBufferSpacesAvailable+0x2a>
  43756. __asm volatile
  43757. 801262a: f04f 0350 mov.w r3, #80 @ 0x50
  43758. 801262e: f383 8811 msr BASEPRI, r3
  43759. 8012632: f3bf 8f6f isb sy
  43760. 8012636: f3bf 8f4f dsb sy
  43761. 801263a: 60fb str r3, [r7, #12]
  43762. }
  43763. 801263c: bf00 nop
  43764. 801263e: bf00 nop
  43765. 8012640: e7fd b.n 801263e <xStreamBufferSpacesAvailable+0x26>
  43766. xSpace = pxStreamBuffer->xLength + pxStreamBuffer->xTail;
  43767. 8012642: 693b ldr r3, [r7, #16]
  43768. 8012644: 689a ldr r2, [r3, #8]
  43769. 8012646: 693b ldr r3, [r7, #16]
  43770. 8012648: 681b ldr r3, [r3, #0]
  43771. 801264a: 4413 add r3, r2
  43772. 801264c: 617b str r3, [r7, #20]
  43773. xSpace -= pxStreamBuffer->xHead;
  43774. 801264e: 693b ldr r3, [r7, #16]
  43775. 8012650: 685b ldr r3, [r3, #4]
  43776. 8012652: 697a ldr r2, [r7, #20]
  43777. 8012654: 1ad3 subs r3, r2, r3
  43778. 8012656: 617b str r3, [r7, #20]
  43779. xSpace -= ( size_t ) 1;
  43780. 8012658: 697b ldr r3, [r7, #20]
  43781. 801265a: 3b01 subs r3, #1
  43782. 801265c: 617b str r3, [r7, #20]
  43783. if( xSpace >= pxStreamBuffer->xLength )
  43784. 801265e: 693b ldr r3, [r7, #16]
  43785. 8012660: 689b ldr r3, [r3, #8]
  43786. 8012662: 697a ldr r2, [r7, #20]
  43787. 8012664: 429a cmp r2, r3
  43788. 8012666: d304 bcc.n 8012672 <xStreamBufferSpacesAvailable+0x5a>
  43789. {
  43790. xSpace -= pxStreamBuffer->xLength;
  43791. 8012668: 693b ldr r3, [r7, #16]
  43792. 801266a: 689b ldr r3, [r3, #8]
  43793. 801266c: 697a ldr r2, [r7, #20]
  43794. 801266e: 1ad3 subs r3, r2, r3
  43795. 8012670: 617b str r3, [r7, #20]
  43796. else
  43797. {
  43798. mtCOVERAGE_TEST_MARKER();
  43799. }
  43800. return xSpace;
  43801. 8012672: 697b ldr r3, [r7, #20]
  43802. }
  43803. 8012674: 4618 mov r0, r3
  43804. 8012676: 371c adds r7, #28
  43805. 8012678: 46bd mov sp, r7
  43806. 801267a: f85d 7b04 ldr.w r7, [sp], #4
  43807. 801267e: 4770 bx lr
  43808. 08012680 <xStreamBufferSend>:
  43809. size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
  43810. const void *pvTxData,
  43811. size_t xDataLengthBytes,
  43812. TickType_t xTicksToWait )
  43813. {
  43814. 8012680: b580 push {r7, lr}
  43815. 8012682: b090 sub sp, #64 @ 0x40
  43816. 8012684: af02 add r7, sp, #8
  43817. 8012686: 60f8 str r0, [r7, #12]
  43818. 8012688: 60b9 str r1, [r7, #8]
  43819. 801268a: 607a str r2, [r7, #4]
  43820. 801268c: 603b str r3, [r7, #0]
  43821. StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;
  43822. 801268e: 68fb ldr r3, [r7, #12]
  43823. 8012690: 62fb str r3, [r7, #44] @ 0x2c
  43824. size_t xReturn, xSpace = 0;
  43825. 8012692: 2300 movs r3, #0
  43826. 8012694: 637b str r3, [r7, #52] @ 0x34
  43827. size_t xRequiredSpace = xDataLengthBytes;
  43828. 8012696: 687b ldr r3, [r7, #4]
  43829. 8012698: 633b str r3, [r7, #48] @ 0x30
  43830. TimeOut_t xTimeOut;
  43831. configASSERT( pvTxData );
  43832. 801269a: 68bb ldr r3, [r7, #8]
  43833. 801269c: 2b00 cmp r3, #0
  43834. 801269e: d10b bne.n 80126b8 <xStreamBufferSend+0x38>
  43835. __asm volatile
  43836. 80126a0: f04f 0350 mov.w r3, #80 @ 0x50
  43837. 80126a4: f383 8811 msr BASEPRI, r3
  43838. 80126a8: f3bf 8f6f isb sy
  43839. 80126ac: f3bf 8f4f dsb sy
  43840. 80126b0: 627b str r3, [r7, #36] @ 0x24
  43841. }
  43842. 80126b2: bf00 nop
  43843. 80126b4: bf00 nop
  43844. 80126b6: e7fd b.n 80126b4 <xStreamBufferSend+0x34>
  43845. configASSERT( pxStreamBuffer );
  43846. 80126b8: 6afb ldr r3, [r7, #44] @ 0x2c
  43847. 80126ba: 2b00 cmp r3, #0
  43848. 80126bc: d10b bne.n 80126d6 <xStreamBufferSend+0x56>
  43849. __asm volatile
  43850. 80126be: f04f 0350 mov.w r3, #80 @ 0x50
  43851. 80126c2: f383 8811 msr BASEPRI, r3
  43852. 80126c6: f3bf 8f6f isb sy
  43853. 80126ca: f3bf 8f4f dsb sy
  43854. 80126ce: 623b str r3, [r7, #32]
  43855. }
  43856. 80126d0: bf00 nop
  43857. 80126d2: bf00 nop
  43858. 80126d4: e7fd b.n 80126d2 <xStreamBufferSend+0x52>
  43859. /* This send function is used to write to both message buffers and stream
  43860. buffers. If this is a message buffer then the space needed must be
  43861. increased by the amount of bytes needed to store the length of the
  43862. message. */
  43863. if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )
  43864. 80126d6: 6afb ldr r3, [r7, #44] @ 0x2c
  43865. 80126d8: 7f1b ldrb r3, [r3, #28]
  43866. 80126da: f003 0301 and.w r3, r3, #1
  43867. 80126de: 2b00 cmp r3, #0
  43868. 80126e0: d012 beq.n 8012708 <xStreamBufferSend+0x88>
  43869. {
  43870. xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH;
  43871. 80126e2: 6b3b ldr r3, [r7, #48] @ 0x30
  43872. 80126e4: 3304 adds r3, #4
  43873. 80126e6: 633b str r3, [r7, #48] @ 0x30
  43874. /* Overflow? */
  43875. configASSERT( xRequiredSpace > xDataLengthBytes );
  43876. 80126e8: 6b3a ldr r2, [r7, #48] @ 0x30
  43877. 80126ea: 687b ldr r3, [r7, #4]
  43878. 80126ec: 429a cmp r2, r3
  43879. 80126ee: d80b bhi.n 8012708 <xStreamBufferSend+0x88>
  43880. __asm volatile
  43881. 80126f0: f04f 0350 mov.w r3, #80 @ 0x50
  43882. 80126f4: f383 8811 msr BASEPRI, r3
  43883. 80126f8: f3bf 8f6f isb sy
  43884. 80126fc: f3bf 8f4f dsb sy
  43885. 8012700: 61fb str r3, [r7, #28]
  43886. }
  43887. 8012702: bf00 nop
  43888. 8012704: bf00 nop
  43889. 8012706: e7fd b.n 8012704 <xStreamBufferSend+0x84>
  43890. else
  43891. {
  43892. mtCOVERAGE_TEST_MARKER();
  43893. }
  43894. if( xTicksToWait != ( TickType_t ) 0 )
  43895. 8012708: 683b ldr r3, [r7, #0]
  43896. 801270a: 2b00 cmp r3, #0
  43897. 801270c: d03f beq.n 801278e <xStreamBufferSend+0x10e>
  43898. {
  43899. vTaskSetTimeOutState( &xTimeOut );
  43900. 801270e: f107 0310 add.w r3, r7, #16
  43901. 8012712: 4618 mov r0, r3
  43902. 8012714: f000 ffd0 bl 80136b8 <vTaskSetTimeOutState>
  43903. do
  43904. {
  43905. /* Wait until the required number of bytes are free in the message
  43906. buffer. */
  43907. taskENTER_CRITICAL();
  43908. 8012718: f002 fa06 bl 8014b28 <vPortEnterCritical>
  43909. {
  43910. xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer );
  43911. 801271c: 6af8 ldr r0, [r7, #44] @ 0x2c
  43912. 801271e: f7ff ff7b bl 8012618 <xStreamBufferSpacesAvailable>
  43913. 8012722: 6378 str r0, [r7, #52] @ 0x34
  43914. if( xSpace < xRequiredSpace )
  43915. 8012724: 6b7a ldr r2, [r7, #52] @ 0x34
  43916. 8012726: 6b3b ldr r3, [r7, #48] @ 0x30
  43917. 8012728: 429a cmp r2, r3
  43918. 801272a: d218 bcs.n 801275e <xStreamBufferSend+0xde>
  43919. {
  43920. /* Clear notification state as going to wait for space. */
  43921. ( void ) xTaskNotifyStateClear( NULL );
  43922. 801272c: 2000 movs r0, #0
  43923. 801272e: f001 fcf3 bl 8014118 <xTaskNotifyStateClear>
  43924. /* Should only be one writer. */
  43925. configASSERT( pxStreamBuffer->xTaskWaitingToSend == NULL );
  43926. 8012732: 6afb ldr r3, [r7, #44] @ 0x2c
  43927. 8012734: 695b ldr r3, [r3, #20]
  43928. 8012736: 2b00 cmp r3, #0
  43929. 8012738: d00b beq.n 8012752 <xStreamBufferSend+0xd2>
  43930. __asm volatile
  43931. 801273a: f04f 0350 mov.w r3, #80 @ 0x50
  43932. 801273e: f383 8811 msr BASEPRI, r3
  43933. 8012742: f3bf 8f6f isb sy
  43934. 8012746: f3bf 8f4f dsb sy
  43935. 801274a: 61bb str r3, [r7, #24]
  43936. }
  43937. 801274c: bf00 nop
  43938. 801274e: bf00 nop
  43939. 8012750: e7fd b.n 801274e <xStreamBufferSend+0xce>
  43940. pxStreamBuffer->xTaskWaitingToSend = xTaskGetCurrentTaskHandle();
  43941. 8012752: f001 f93b bl 80139cc <xTaskGetCurrentTaskHandle>
  43942. 8012756: 4602 mov r2, r0
  43943. 8012758: 6afb ldr r3, [r7, #44] @ 0x2c
  43944. 801275a: 615a str r2, [r3, #20]
  43945. 801275c: e002 b.n 8012764 <xStreamBufferSend+0xe4>
  43946. }
  43947. else
  43948. {
  43949. taskEXIT_CRITICAL();
  43950. 801275e: f002 fa15 bl 8014b8c <vPortExitCritical>
  43951. break;
  43952. 8012762: e014 b.n 801278e <xStreamBufferSend+0x10e>
  43953. }
  43954. }
  43955. taskEXIT_CRITICAL();
  43956. 8012764: f002 fa12 bl 8014b8c <vPortExitCritical>
  43957. traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer );
  43958. ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait );
  43959. 8012768: 683b ldr r3, [r7, #0]
  43960. 801276a: 2200 movs r2, #0
  43961. 801276c: 2100 movs r1, #0
  43962. 801276e: 2000 movs r0, #0
  43963. 8012770: f001 faca bl 8013d08 <xTaskNotifyWait>
  43964. pxStreamBuffer->xTaskWaitingToSend = NULL;
  43965. 8012774: 6afb ldr r3, [r7, #44] @ 0x2c
  43966. 8012776: 2200 movs r2, #0
  43967. 8012778: 615a str r2, [r3, #20]
  43968. } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE );
  43969. 801277a: 463a mov r2, r7
  43970. 801277c: f107 0310 add.w r3, r7, #16
  43971. 8012780: 4611 mov r1, r2
  43972. 8012782: 4618 mov r0, r3
  43973. 8012784: f000 ffd6 bl 8013734 <xTaskCheckForTimeOut>
  43974. 8012788: 4603 mov r3, r0
  43975. 801278a: 2b00 cmp r3, #0
  43976. 801278c: d0c4 beq.n 8012718 <xStreamBufferSend+0x98>
  43977. else
  43978. {
  43979. mtCOVERAGE_TEST_MARKER();
  43980. }
  43981. if( xSpace == ( size_t ) 0 )
  43982. 801278e: 6b7b ldr r3, [r7, #52] @ 0x34
  43983. 8012790: 2b00 cmp r3, #0
  43984. 8012792: d103 bne.n 801279c <xStreamBufferSend+0x11c>
  43985. {
  43986. xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer );
  43987. 8012794: 6af8 ldr r0, [r7, #44] @ 0x2c
  43988. 8012796: f7ff ff3f bl 8012618 <xStreamBufferSpacesAvailable>
  43989. 801279a: 6378 str r0, [r7, #52] @ 0x34
  43990. else
  43991. {
  43992. mtCOVERAGE_TEST_MARKER();
  43993. }
  43994. xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace );
  43995. 801279c: 6b3b ldr r3, [r7, #48] @ 0x30
  43996. 801279e: 9300 str r3, [sp, #0]
  43997. 80127a0: 6b7b ldr r3, [r7, #52] @ 0x34
  43998. 80127a2: 687a ldr r2, [r7, #4]
  43999. 80127a4: 68b9 ldr r1, [r7, #8]
  44000. 80127a6: 6af8 ldr r0, [r7, #44] @ 0x2c
  44001. 80127a8: f000 f823 bl 80127f2 <prvWriteMessageToBuffer>
  44002. 80127ac: 62b8 str r0, [r7, #40] @ 0x28
  44003. if( xReturn > ( size_t ) 0 )
  44004. 80127ae: 6abb ldr r3, [r7, #40] @ 0x28
  44005. 80127b0: 2b00 cmp r3, #0
  44006. 80127b2: d019 beq.n 80127e8 <xStreamBufferSend+0x168>
  44007. {
  44008. traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn );
  44009. /* Was a task waiting for the data? */
  44010. if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes )
  44011. 80127b4: 6af8 ldr r0, [r7, #44] @ 0x2c
  44012. 80127b6: f000 fa15 bl 8012be4 <prvBytesInBuffer>
  44013. 80127ba: 4602 mov r2, r0
  44014. 80127bc: 6afb ldr r3, [r7, #44] @ 0x2c
  44015. 80127be: 68db ldr r3, [r3, #12]
  44016. 80127c0: 429a cmp r2, r3
  44017. 80127c2: d311 bcc.n 80127e8 <xStreamBufferSend+0x168>
  44018. {
  44019. sbSEND_COMPLETED( pxStreamBuffer );
  44020. 80127c4: f000 fcc6 bl 8013154 <vTaskSuspendAll>
  44021. 80127c8: 6afb ldr r3, [r7, #44] @ 0x2c
  44022. 80127ca: 691b ldr r3, [r3, #16]
  44023. 80127cc: 2b00 cmp r3, #0
  44024. 80127ce: d009 beq.n 80127e4 <xStreamBufferSend+0x164>
  44025. 80127d0: 6afb ldr r3, [r7, #44] @ 0x2c
  44026. 80127d2: 6918 ldr r0, [r3, #16]
  44027. 80127d4: 2300 movs r3, #0
  44028. 80127d6: 2200 movs r2, #0
  44029. 80127d8: 2100 movs r1, #0
  44030. 80127da: f001 faf5 bl 8013dc8 <xTaskGenericNotify>
  44031. 80127de: 6afb ldr r3, [r7, #44] @ 0x2c
  44032. 80127e0: 2200 movs r2, #0
  44033. 80127e2: 611a str r2, [r3, #16]
  44034. 80127e4: f000 fcc4 bl 8013170 <xTaskResumeAll>
  44035. {
  44036. mtCOVERAGE_TEST_MARKER();
  44037. traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer );
  44038. }
  44039. return xReturn;
  44040. 80127e8: 6abb ldr r3, [r7, #40] @ 0x28
  44041. }
  44042. 80127ea: 4618 mov r0, r3
  44043. 80127ec: 3738 adds r7, #56 @ 0x38
  44044. 80127ee: 46bd mov sp, r7
  44045. 80127f0: bd80 pop {r7, pc}
  44046. 080127f2 <prvWriteMessageToBuffer>:
  44047. static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer,
  44048. const void * pvTxData,
  44049. size_t xDataLengthBytes,
  44050. size_t xSpace,
  44051. size_t xRequiredSpace )
  44052. {
  44053. 80127f2: b580 push {r7, lr}
  44054. 80127f4: b086 sub sp, #24
  44055. 80127f6: af00 add r7, sp, #0
  44056. 80127f8: 60f8 str r0, [r7, #12]
  44057. 80127fa: 60b9 str r1, [r7, #8]
  44058. 80127fc: 607a str r2, [r7, #4]
  44059. 80127fe: 603b str r3, [r7, #0]
  44060. BaseType_t xShouldWrite;
  44061. size_t xReturn;
  44062. if( xSpace == ( size_t ) 0 )
  44063. 8012800: 683b ldr r3, [r7, #0]
  44064. 8012802: 2b00 cmp r3, #0
  44065. 8012804: d102 bne.n 801280c <prvWriteMessageToBuffer+0x1a>
  44066. {
  44067. /* Doesn't matter if this is a stream buffer or a message buffer, there
  44068. is no space to write. */
  44069. xShouldWrite = pdFALSE;
  44070. 8012806: 2300 movs r3, #0
  44071. 8012808: 617b str r3, [r7, #20]
  44072. 801280a: e01d b.n 8012848 <prvWriteMessageToBuffer+0x56>
  44073. }
  44074. else if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) == ( uint8_t ) 0 )
  44075. 801280c: 68fb ldr r3, [r7, #12]
  44076. 801280e: 7f1b ldrb r3, [r3, #28]
  44077. 8012810: f003 0301 and.w r3, r3, #1
  44078. 8012814: 2b00 cmp r3, #0
  44079. 8012816: d108 bne.n 801282a <prvWriteMessageToBuffer+0x38>
  44080. {
  44081. /* This is a stream buffer, as opposed to a message buffer, so writing a
  44082. stream of bytes rather than discrete messages. Write as many bytes as
  44083. possible. */
  44084. xShouldWrite = pdTRUE;
  44085. 8012818: 2301 movs r3, #1
  44086. 801281a: 617b str r3, [r7, #20]
  44087. xDataLengthBytes = configMIN( xDataLengthBytes, xSpace );
  44088. 801281c: 687a ldr r2, [r7, #4]
  44089. 801281e: 683b ldr r3, [r7, #0]
  44090. 8012820: 4293 cmp r3, r2
  44091. 8012822: bf28 it cs
  44092. 8012824: 4613 movcs r3, r2
  44093. 8012826: 607b str r3, [r7, #4]
  44094. 8012828: e00e b.n 8012848 <prvWriteMessageToBuffer+0x56>
  44095. }
  44096. else if( xSpace >= xRequiredSpace )
  44097. 801282a: 683a ldr r2, [r7, #0]
  44098. 801282c: 6a3b ldr r3, [r7, #32]
  44099. 801282e: 429a cmp r2, r3
  44100. 8012830: d308 bcc.n 8012844 <prvWriteMessageToBuffer+0x52>
  44101. {
  44102. /* This is a message buffer, as opposed to a stream buffer, and there
  44103. is enough space to write both the message length and the message itself
  44104. into the buffer. Start by writing the length of the data, the data
  44105. itself will be written later in this function. */
  44106. xShouldWrite = pdTRUE;
  44107. 8012832: 2301 movs r3, #1
  44108. 8012834: 617b str r3, [r7, #20]
  44109. ( void ) prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xDataLengthBytes ), sbBYTES_TO_STORE_MESSAGE_LENGTH );
  44110. 8012836: 1d3b adds r3, r7, #4
  44111. 8012838: 2204 movs r2, #4
  44112. 801283a: 4619 mov r1, r3
  44113. 801283c: 68f8 ldr r0, [r7, #12]
  44114. 801283e: f000 f8df bl 8012a00 <prvWriteBytesToBuffer>
  44115. 8012842: e001 b.n 8012848 <prvWriteMessageToBuffer+0x56>
  44116. }
  44117. else
  44118. {
  44119. /* There is space available, but not enough space. */
  44120. xShouldWrite = pdFALSE;
  44121. 8012844: 2300 movs r3, #0
  44122. 8012846: 617b str r3, [r7, #20]
  44123. }
  44124. if( xShouldWrite != pdFALSE )
  44125. 8012848: 697b ldr r3, [r7, #20]
  44126. 801284a: 2b00 cmp r3, #0
  44127. 801284c: d007 beq.n 801285e <prvWriteMessageToBuffer+0x6c>
  44128. {
  44129. /* Writes the data itself. */
  44130. xReturn = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes ); /*lint !e9079 Storage buffer is implemented as uint8_t for ease of sizing, alighment and access. */
  44131. 801284e: 687b ldr r3, [r7, #4]
  44132. 8012850: 461a mov r2, r3
  44133. 8012852: 68b9 ldr r1, [r7, #8]
  44134. 8012854: 68f8 ldr r0, [r7, #12]
  44135. 8012856: f000 f8d3 bl 8012a00 <prvWriteBytesToBuffer>
  44136. 801285a: 6138 str r0, [r7, #16]
  44137. 801285c: e001 b.n 8012862 <prvWriteMessageToBuffer+0x70>
  44138. }
  44139. else
  44140. {
  44141. xReturn = 0;
  44142. 801285e: 2300 movs r3, #0
  44143. 8012860: 613b str r3, [r7, #16]
  44144. }
  44145. return xReturn;
  44146. 8012862: 693b ldr r3, [r7, #16]
  44147. }
  44148. 8012864: 4618 mov r0, r3
  44149. 8012866: 3718 adds r7, #24
  44150. 8012868: 46bd mov sp, r7
  44151. 801286a: bd80 pop {r7, pc}
  44152. 0801286c <xStreamBufferReceive>:
  44153. size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
  44154. void *pvRxData,
  44155. size_t xBufferLengthBytes,
  44156. TickType_t xTicksToWait )
  44157. {
  44158. 801286c: b580 push {r7, lr}
  44159. 801286e: b08e sub sp, #56 @ 0x38
  44160. 8012870: af02 add r7, sp, #8
  44161. 8012872: 60f8 str r0, [r7, #12]
  44162. 8012874: 60b9 str r1, [r7, #8]
  44163. 8012876: 607a str r2, [r7, #4]
  44164. 8012878: 603b str r3, [r7, #0]
  44165. StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;
  44166. 801287a: 68fb ldr r3, [r7, #12]
  44167. 801287c: 623b str r3, [r7, #32]
  44168. size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength;
  44169. 801287e: 2300 movs r3, #0
  44170. 8012880: 62fb str r3, [r7, #44] @ 0x2c
  44171. configASSERT( pvRxData );
  44172. 8012882: 68bb ldr r3, [r7, #8]
  44173. 8012884: 2b00 cmp r3, #0
  44174. 8012886: d10b bne.n 80128a0 <xStreamBufferReceive+0x34>
  44175. __asm volatile
  44176. 8012888: f04f 0350 mov.w r3, #80 @ 0x50
  44177. 801288c: f383 8811 msr BASEPRI, r3
  44178. 8012890: f3bf 8f6f isb sy
  44179. 8012894: f3bf 8f4f dsb sy
  44180. 8012898: 61fb str r3, [r7, #28]
  44181. }
  44182. 801289a: bf00 nop
  44183. 801289c: bf00 nop
  44184. 801289e: e7fd b.n 801289c <xStreamBufferReceive+0x30>
  44185. configASSERT( pxStreamBuffer );
  44186. 80128a0: 6a3b ldr r3, [r7, #32]
  44187. 80128a2: 2b00 cmp r3, #0
  44188. 80128a4: d10b bne.n 80128be <xStreamBufferReceive+0x52>
  44189. __asm volatile
  44190. 80128a6: f04f 0350 mov.w r3, #80 @ 0x50
  44191. 80128aa: f383 8811 msr BASEPRI, r3
  44192. 80128ae: f3bf 8f6f isb sy
  44193. 80128b2: f3bf 8f4f dsb sy
  44194. 80128b6: 61bb str r3, [r7, #24]
  44195. }
  44196. 80128b8: bf00 nop
  44197. 80128ba: bf00 nop
  44198. 80128bc: e7fd b.n 80128ba <xStreamBufferReceive+0x4e>
  44199. /* This receive function is used by both message buffers, which store
  44200. discrete messages, and stream buffers, which store a continuous stream of
  44201. bytes. Discrete messages include an additional
  44202. sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the
  44203. message. */
  44204. if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )
  44205. 80128be: 6a3b ldr r3, [r7, #32]
  44206. 80128c0: 7f1b ldrb r3, [r3, #28]
  44207. 80128c2: f003 0301 and.w r3, r3, #1
  44208. 80128c6: 2b00 cmp r3, #0
  44209. 80128c8: d002 beq.n 80128d0 <xStreamBufferReceive+0x64>
  44210. {
  44211. xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH;
  44212. 80128ca: 2304 movs r3, #4
  44213. 80128cc: 627b str r3, [r7, #36] @ 0x24
  44214. 80128ce: e001 b.n 80128d4 <xStreamBufferReceive+0x68>
  44215. }
  44216. else
  44217. {
  44218. xBytesToStoreMessageLength = 0;
  44219. 80128d0: 2300 movs r3, #0
  44220. 80128d2: 627b str r3, [r7, #36] @ 0x24
  44221. }
  44222. if( xTicksToWait != ( TickType_t ) 0 )
  44223. 80128d4: 683b ldr r3, [r7, #0]
  44224. 80128d6: 2b00 cmp r3, #0
  44225. 80128d8: d035 beq.n 8012946 <xStreamBufferReceive+0xda>
  44226. {
  44227. /* Checking if there is data and clearing the notification state must be
  44228. performed atomically. */
  44229. taskENTER_CRITICAL();
  44230. 80128da: f002 f925 bl 8014b28 <vPortEnterCritical>
  44231. {
  44232. xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );
  44233. 80128de: 6a38 ldr r0, [r7, #32]
  44234. 80128e0: f000 f980 bl 8012be4 <prvBytesInBuffer>
  44235. 80128e4: 62b8 str r0, [r7, #40] @ 0x28
  44236. /* If this function was invoked by a message buffer read then
  44237. xBytesToStoreMessageLength holds the number of bytes used to hold
  44238. the length of the next discrete message. If this function was
  44239. invoked by a stream buffer read then xBytesToStoreMessageLength will
  44240. be 0. */
  44241. if( xBytesAvailable <= xBytesToStoreMessageLength )
  44242. 80128e6: 6aba ldr r2, [r7, #40] @ 0x28
  44243. 80128e8: 6a7b ldr r3, [r7, #36] @ 0x24
  44244. 80128ea: 429a cmp r2, r3
  44245. 80128ec: d817 bhi.n 801291e <xStreamBufferReceive+0xb2>
  44246. {
  44247. /* Clear notification state as going to wait for data. */
  44248. ( void ) xTaskNotifyStateClear( NULL );
  44249. 80128ee: 2000 movs r0, #0
  44250. 80128f0: f001 fc12 bl 8014118 <xTaskNotifyStateClear>
  44251. /* Should only be one reader. */
  44252. configASSERT( pxStreamBuffer->xTaskWaitingToReceive == NULL );
  44253. 80128f4: 6a3b ldr r3, [r7, #32]
  44254. 80128f6: 691b ldr r3, [r3, #16]
  44255. 80128f8: 2b00 cmp r3, #0
  44256. 80128fa: d00b beq.n 8012914 <xStreamBufferReceive+0xa8>
  44257. __asm volatile
  44258. 80128fc: f04f 0350 mov.w r3, #80 @ 0x50
  44259. 8012900: f383 8811 msr BASEPRI, r3
  44260. 8012904: f3bf 8f6f isb sy
  44261. 8012908: f3bf 8f4f dsb sy
  44262. 801290c: 617b str r3, [r7, #20]
  44263. }
  44264. 801290e: bf00 nop
  44265. 8012910: bf00 nop
  44266. 8012912: e7fd b.n 8012910 <xStreamBufferReceive+0xa4>
  44267. pxStreamBuffer->xTaskWaitingToReceive = xTaskGetCurrentTaskHandle();
  44268. 8012914: f001 f85a bl 80139cc <xTaskGetCurrentTaskHandle>
  44269. 8012918: 4602 mov r2, r0
  44270. 801291a: 6a3b ldr r3, [r7, #32]
  44271. 801291c: 611a str r2, [r3, #16]
  44272. else
  44273. {
  44274. mtCOVERAGE_TEST_MARKER();
  44275. }
  44276. }
  44277. taskEXIT_CRITICAL();
  44278. 801291e: f002 f935 bl 8014b8c <vPortExitCritical>
  44279. if( xBytesAvailable <= xBytesToStoreMessageLength )
  44280. 8012922: 6aba ldr r2, [r7, #40] @ 0x28
  44281. 8012924: 6a7b ldr r3, [r7, #36] @ 0x24
  44282. 8012926: 429a cmp r2, r3
  44283. 8012928: d811 bhi.n 801294e <xStreamBufferReceive+0xe2>
  44284. {
  44285. /* Wait for data to be available. */
  44286. traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer );
  44287. ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait );
  44288. 801292a: 683b ldr r3, [r7, #0]
  44289. 801292c: 2200 movs r2, #0
  44290. 801292e: 2100 movs r1, #0
  44291. 8012930: 2000 movs r0, #0
  44292. 8012932: f001 f9e9 bl 8013d08 <xTaskNotifyWait>
  44293. pxStreamBuffer->xTaskWaitingToReceive = NULL;
  44294. 8012936: 6a3b ldr r3, [r7, #32]
  44295. 8012938: 2200 movs r2, #0
  44296. 801293a: 611a str r2, [r3, #16]
  44297. /* Recheck the data available after blocking. */
  44298. xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );
  44299. 801293c: 6a38 ldr r0, [r7, #32]
  44300. 801293e: f000 f951 bl 8012be4 <prvBytesInBuffer>
  44301. 8012942: 62b8 str r0, [r7, #40] @ 0x28
  44302. 8012944: e003 b.n 801294e <xStreamBufferReceive+0xe2>
  44303. mtCOVERAGE_TEST_MARKER();
  44304. }
  44305. }
  44306. else
  44307. {
  44308. xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );
  44309. 8012946: 6a38 ldr r0, [r7, #32]
  44310. 8012948: f000 f94c bl 8012be4 <prvBytesInBuffer>
  44311. 801294c: 62b8 str r0, [r7, #40] @ 0x28
  44312. /* Whether receiving a discrete message (where xBytesToStoreMessageLength
  44313. holds the number of bytes used to store the message length) or a stream of
  44314. bytes (where xBytesToStoreMessageLength is zero), the number of bytes
  44315. available must be greater than xBytesToStoreMessageLength to be able to
  44316. read bytes from the buffer. */
  44317. if( xBytesAvailable > xBytesToStoreMessageLength )
  44318. 801294e: 6aba ldr r2, [r7, #40] @ 0x28
  44319. 8012950: 6a7b ldr r3, [r7, #36] @ 0x24
  44320. 8012952: 429a cmp r2, r3
  44321. 8012954: d91d bls.n 8012992 <xStreamBufferReceive+0x126>
  44322. {
  44323. xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable, xBytesToStoreMessageLength );
  44324. 8012956: 6a7b ldr r3, [r7, #36] @ 0x24
  44325. 8012958: 9300 str r3, [sp, #0]
  44326. 801295a: 6abb ldr r3, [r7, #40] @ 0x28
  44327. 801295c: 687a ldr r2, [r7, #4]
  44328. 801295e: 68b9 ldr r1, [r7, #8]
  44329. 8012960: 6a38 ldr r0, [r7, #32]
  44330. 8012962: f000 f81b bl 801299c <prvReadMessageFromBuffer>
  44331. 8012966: 62f8 str r0, [r7, #44] @ 0x2c
  44332. /* Was a task waiting for space in the buffer? */
  44333. if( xReceivedLength != ( size_t ) 0 )
  44334. 8012968: 6afb ldr r3, [r7, #44] @ 0x2c
  44335. 801296a: 2b00 cmp r3, #0
  44336. 801296c: d011 beq.n 8012992 <xStreamBufferReceive+0x126>
  44337. {
  44338. traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength );
  44339. sbRECEIVE_COMPLETED( pxStreamBuffer );
  44340. 801296e: f000 fbf1 bl 8013154 <vTaskSuspendAll>
  44341. 8012972: 6a3b ldr r3, [r7, #32]
  44342. 8012974: 695b ldr r3, [r3, #20]
  44343. 8012976: 2b00 cmp r3, #0
  44344. 8012978: d009 beq.n 801298e <xStreamBufferReceive+0x122>
  44345. 801297a: 6a3b ldr r3, [r7, #32]
  44346. 801297c: 6958 ldr r0, [r3, #20]
  44347. 801297e: 2300 movs r3, #0
  44348. 8012980: 2200 movs r2, #0
  44349. 8012982: 2100 movs r1, #0
  44350. 8012984: f001 fa20 bl 8013dc8 <xTaskGenericNotify>
  44351. 8012988: 6a3b ldr r3, [r7, #32]
  44352. 801298a: 2200 movs r2, #0
  44353. 801298c: 615a str r2, [r3, #20]
  44354. 801298e: f000 fbef bl 8013170 <xTaskResumeAll>
  44355. {
  44356. traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer );
  44357. mtCOVERAGE_TEST_MARKER();
  44358. }
  44359. return xReceivedLength;
  44360. 8012992: 6afb ldr r3, [r7, #44] @ 0x2c
  44361. }
  44362. 8012994: 4618 mov r0, r3
  44363. 8012996: 3730 adds r7, #48 @ 0x30
  44364. 8012998: 46bd mov sp, r7
  44365. 801299a: bd80 pop {r7, pc}
  44366. 0801299c <prvReadMessageFromBuffer>:
  44367. static size_t prvReadMessageFromBuffer( StreamBuffer_t *pxStreamBuffer,
  44368. void *pvRxData,
  44369. size_t xBufferLengthBytes,
  44370. size_t xBytesAvailable,
  44371. size_t xBytesToStoreMessageLength )
  44372. {
  44373. 801299c: b580 push {r7, lr}
  44374. 801299e: b088 sub sp, #32
  44375. 80129a0: af00 add r7, sp, #0
  44376. 80129a2: 60f8 str r0, [r7, #12]
  44377. 80129a4: 60b9 str r1, [r7, #8]
  44378. 80129a6: 607a str r2, [r7, #4]
  44379. 80129a8: 603b str r3, [r7, #0]
  44380. size_t xOriginalTail, xReceivedLength, xNextMessageLength;
  44381. configMESSAGE_BUFFER_LENGTH_TYPE xTempNextMessageLength;
  44382. if( xBytesToStoreMessageLength != ( size_t ) 0 )
  44383. 80129aa: 6abb ldr r3, [r7, #40] @ 0x28
  44384. 80129ac: 2b00 cmp r3, #0
  44385. 80129ae: d019 beq.n 80129e4 <prvReadMessageFromBuffer+0x48>
  44386. {
  44387. /* A discrete message is being received. First receive the length
  44388. of the message. A copy of the tail is stored so the buffer can be
  44389. returned to its prior state if the length of the message is too
  44390. large for the provided buffer. */
  44391. xOriginalTail = pxStreamBuffer->xTail;
  44392. 80129b0: 68fb ldr r3, [r7, #12]
  44393. 80129b2: 681b ldr r3, [r3, #0]
  44394. 80129b4: 61bb str r3, [r7, #24]
  44395. ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempNextMessageLength, xBytesToStoreMessageLength, xBytesAvailable );
  44396. 80129b6: f107 0110 add.w r1, r7, #16
  44397. 80129ba: 683b ldr r3, [r7, #0]
  44398. 80129bc: 6aba ldr r2, [r7, #40] @ 0x28
  44399. 80129be: 68f8 ldr r0, [r7, #12]
  44400. 80129c0: f000 f893 bl 8012aea <prvReadBytesFromBuffer>
  44401. xNextMessageLength = ( size_t ) xTempNextMessageLength;
  44402. 80129c4: 693b ldr r3, [r7, #16]
  44403. 80129c6: 61fb str r3, [r7, #28]
  44404. /* Reduce the number of bytes available by the number of bytes just
  44405. read out. */
  44406. xBytesAvailable -= xBytesToStoreMessageLength;
  44407. 80129c8: 683a ldr r2, [r7, #0]
  44408. 80129ca: 6abb ldr r3, [r7, #40] @ 0x28
  44409. 80129cc: 1ad3 subs r3, r2, r3
  44410. 80129ce: 603b str r3, [r7, #0]
  44411. /* Check there is enough space in the buffer provided by the
  44412. user. */
  44413. if( xNextMessageLength > xBufferLengthBytes )
  44414. 80129d0: 69fa ldr r2, [r7, #28]
  44415. 80129d2: 687b ldr r3, [r7, #4]
  44416. 80129d4: 429a cmp r2, r3
  44417. 80129d6: d907 bls.n 80129e8 <prvReadMessageFromBuffer+0x4c>
  44418. {
  44419. /* The user has provided insufficient space to read the message
  44420. so return the buffer to its previous state (so the length of
  44421. the message is in the buffer again). */
  44422. pxStreamBuffer->xTail = xOriginalTail;
  44423. 80129d8: 68fb ldr r3, [r7, #12]
  44424. 80129da: 69ba ldr r2, [r7, #24]
  44425. 80129dc: 601a str r2, [r3, #0]
  44426. xNextMessageLength = 0;
  44427. 80129de: 2300 movs r3, #0
  44428. 80129e0: 61fb str r3, [r7, #28]
  44429. 80129e2: e001 b.n 80129e8 <prvReadMessageFromBuffer+0x4c>
  44430. }
  44431. else
  44432. {
  44433. /* A stream of bytes is being received (as opposed to a discrete
  44434. message), so read as many bytes as possible. */
  44435. xNextMessageLength = xBufferLengthBytes;
  44436. 80129e4: 687b ldr r3, [r7, #4]
  44437. 80129e6: 61fb str r3, [r7, #28]
  44438. }
  44439. /* Read the actual data. */
  44440. xReceivedLength = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) pvRxData, xNextMessageLength, xBytesAvailable ); /*lint !e9079 Data storage area is implemented as uint8_t array for ease of sizing, indexing and alignment. */
  44441. 80129e8: 683b ldr r3, [r7, #0]
  44442. 80129ea: 69fa ldr r2, [r7, #28]
  44443. 80129ec: 68b9 ldr r1, [r7, #8]
  44444. 80129ee: 68f8 ldr r0, [r7, #12]
  44445. 80129f0: f000 f87b bl 8012aea <prvReadBytesFromBuffer>
  44446. 80129f4: 6178 str r0, [r7, #20]
  44447. return xReceivedLength;
  44448. 80129f6: 697b ldr r3, [r7, #20]
  44449. }
  44450. 80129f8: 4618 mov r0, r3
  44451. 80129fa: 3720 adds r7, #32
  44452. 80129fc: 46bd mov sp, r7
  44453. 80129fe: bd80 pop {r7, pc}
  44454. 08012a00 <prvWriteBytesToBuffer>:
  44455. return xReturn;
  44456. }
  44457. /*-----------------------------------------------------------*/
  44458. static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, const uint8_t *pucData, size_t xCount )
  44459. {
  44460. 8012a00: b580 push {r7, lr}
  44461. 8012a02: b08a sub sp, #40 @ 0x28
  44462. 8012a04: af00 add r7, sp, #0
  44463. 8012a06: 60f8 str r0, [r7, #12]
  44464. 8012a08: 60b9 str r1, [r7, #8]
  44465. 8012a0a: 607a str r2, [r7, #4]
  44466. size_t xNextHead, xFirstLength;
  44467. configASSERT( xCount > ( size_t ) 0 );
  44468. 8012a0c: 687b ldr r3, [r7, #4]
  44469. 8012a0e: 2b00 cmp r3, #0
  44470. 8012a10: d10b bne.n 8012a2a <prvWriteBytesToBuffer+0x2a>
  44471. __asm volatile
  44472. 8012a12: f04f 0350 mov.w r3, #80 @ 0x50
  44473. 8012a16: f383 8811 msr BASEPRI, r3
  44474. 8012a1a: f3bf 8f6f isb sy
  44475. 8012a1e: f3bf 8f4f dsb sy
  44476. 8012a22: 61fb str r3, [r7, #28]
  44477. }
  44478. 8012a24: bf00 nop
  44479. 8012a26: bf00 nop
  44480. 8012a28: e7fd b.n 8012a26 <prvWriteBytesToBuffer+0x26>
  44481. xNextHead = pxStreamBuffer->xHead;
  44482. 8012a2a: 68fb ldr r3, [r7, #12]
  44483. 8012a2c: 685b ldr r3, [r3, #4]
  44484. 8012a2e: 627b str r3, [r7, #36] @ 0x24
  44485. /* Calculate the number of bytes that can be added in the first write -
  44486. which may be less than the total number of bytes that need to be added if
  44487. the buffer will wrap back to the beginning. */
  44488. xFirstLength = configMIN( pxStreamBuffer->xLength - xNextHead, xCount );
  44489. 8012a30: 68fb ldr r3, [r7, #12]
  44490. 8012a32: 689a ldr r2, [r3, #8]
  44491. 8012a34: 6a7b ldr r3, [r7, #36] @ 0x24
  44492. 8012a36: 1ad3 subs r3, r2, r3
  44493. 8012a38: 687a ldr r2, [r7, #4]
  44494. 8012a3a: 4293 cmp r3, r2
  44495. 8012a3c: bf28 it cs
  44496. 8012a3e: 4613 movcs r3, r2
  44497. 8012a40: 623b str r3, [r7, #32]
  44498. /* Write as many bytes as can be written in the first write. */
  44499. configASSERT( ( xNextHead + xFirstLength ) <= pxStreamBuffer->xLength );
  44500. 8012a42: 6a7a ldr r2, [r7, #36] @ 0x24
  44501. 8012a44: 6a3b ldr r3, [r7, #32]
  44502. 8012a46: 441a add r2, r3
  44503. 8012a48: 68fb ldr r3, [r7, #12]
  44504. 8012a4a: 689b ldr r3, [r3, #8]
  44505. 8012a4c: 429a cmp r2, r3
  44506. 8012a4e: d90b bls.n 8012a68 <prvWriteBytesToBuffer+0x68>
  44507. __asm volatile
  44508. 8012a50: f04f 0350 mov.w r3, #80 @ 0x50
  44509. 8012a54: f383 8811 msr BASEPRI, r3
  44510. 8012a58: f3bf 8f6f isb sy
  44511. 8012a5c: f3bf 8f4f dsb sy
  44512. 8012a60: 61bb str r3, [r7, #24]
  44513. }
  44514. 8012a62: bf00 nop
  44515. 8012a64: bf00 nop
  44516. 8012a66: e7fd b.n 8012a64 <prvWriteBytesToBuffer+0x64>
  44517. ( void ) memcpy( ( void* ) ( &( pxStreamBuffer->pucBuffer[ xNextHead ] ) ), ( const void * ) pucData, xFirstLength ); /*lint !e9087 memcpy() requires void *. */
  44518. 8012a68: 68fb ldr r3, [r7, #12]
  44519. 8012a6a: 699a ldr r2, [r3, #24]
  44520. 8012a6c: 6a7b ldr r3, [r7, #36] @ 0x24
  44521. 8012a6e: 4413 add r3, r2
  44522. 8012a70: 6a3a ldr r2, [r7, #32]
  44523. 8012a72: 68b9 ldr r1, [r7, #8]
  44524. 8012a74: 4618 mov r0, r3
  44525. 8012a76: f017 fa32 bl 8029ede <memcpy>
  44526. /* If the number of bytes written was less than the number that could be
  44527. written in the first write... */
  44528. if( xCount > xFirstLength )
  44529. 8012a7a: 687a ldr r2, [r7, #4]
  44530. 8012a7c: 6a3b ldr r3, [r7, #32]
  44531. 8012a7e: 429a cmp r2, r3
  44532. 8012a80: d91d bls.n 8012abe <prvWriteBytesToBuffer+0xbe>
  44533. {
  44534. /* ...then write the remaining bytes to the start of the buffer. */
  44535. configASSERT( ( xCount - xFirstLength ) <= pxStreamBuffer->xLength );
  44536. 8012a82: 687a ldr r2, [r7, #4]
  44537. 8012a84: 6a3b ldr r3, [r7, #32]
  44538. 8012a86: 1ad2 subs r2, r2, r3
  44539. 8012a88: 68fb ldr r3, [r7, #12]
  44540. 8012a8a: 689b ldr r3, [r3, #8]
  44541. 8012a8c: 429a cmp r2, r3
  44542. 8012a8e: d90b bls.n 8012aa8 <prvWriteBytesToBuffer+0xa8>
  44543. __asm volatile
  44544. 8012a90: f04f 0350 mov.w r3, #80 @ 0x50
  44545. 8012a94: f383 8811 msr BASEPRI, r3
  44546. 8012a98: f3bf 8f6f isb sy
  44547. 8012a9c: f3bf 8f4f dsb sy
  44548. 8012aa0: 617b str r3, [r7, #20]
  44549. }
  44550. 8012aa2: bf00 nop
  44551. 8012aa4: bf00 nop
  44552. 8012aa6: e7fd b.n 8012aa4 <prvWriteBytesToBuffer+0xa4>
  44553. ( void ) memcpy( ( void * ) pxStreamBuffer->pucBuffer, ( const void * ) &( pucData[ xFirstLength ] ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */
  44554. 8012aa8: 68fb ldr r3, [r7, #12]
  44555. 8012aaa: 6998 ldr r0, [r3, #24]
  44556. 8012aac: 68ba ldr r2, [r7, #8]
  44557. 8012aae: 6a3b ldr r3, [r7, #32]
  44558. 8012ab0: 18d1 adds r1, r2, r3
  44559. 8012ab2: 687a ldr r2, [r7, #4]
  44560. 8012ab4: 6a3b ldr r3, [r7, #32]
  44561. 8012ab6: 1ad3 subs r3, r2, r3
  44562. 8012ab8: 461a mov r2, r3
  44563. 8012aba: f017 fa10 bl 8029ede <memcpy>
  44564. else
  44565. {
  44566. mtCOVERAGE_TEST_MARKER();
  44567. }
  44568. xNextHead += xCount;
  44569. 8012abe: 6a7a ldr r2, [r7, #36] @ 0x24
  44570. 8012ac0: 687b ldr r3, [r7, #4]
  44571. 8012ac2: 4413 add r3, r2
  44572. 8012ac4: 627b str r3, [r7, #36] @ 0x24
  44573. if( xNextHead >= pxStreamBuffer->xLength )
  44574. 8012ac6: 68fb ldr r3, [r7, #12]
  44575. 8012ac8: 689b ldr r3, [r3, #8]
  44576. 8012aca: 6a7a ldr r2, [r7, #36] @ 0x24
  44577. 8012acc: 429a cmp r2, r3
  44578. 8012ace: d304 bcc.n 8012ada <prvWriteBytesToBuffer+0xda>
  44579. {
  44580. xNextHead -= pxStreamBuffer->xLength;
  44581. 8012ad0: 68fb ldr r3, [r7, #12]
  44582. 8012ad2: 689b ldr r3, [r3, #8]
  44583. 8012ad4: 6a7a ldr r2, [r7, #36] @ 0x24
  44584. 8012ad6: 1ad3 subs r3, r2, r3
  44585. 8012ad8: 627b str r3, [r7, #36] @ 0x24
  44586. else
  44587. {
  44588. mtCOVERAGE_TEST_MARKER();
  44589. }
  44590. pxStreamBuffer->xHead = xNextHead;
  44591. 8012ada: 68fb ldr r3, [r7, #12]
  44592. 8012adc: 6a7a ldr r2, [r7, #36] @ 0x24
  44593. 8012ade: 605a str r2, [r3, #4]
  44594. return xCount;
  44595. 8012ae0: 687b ldr r3, [r7, #4]
  44596. }
  44597. 8012ae2: 4618 mov r0, r3
  44598. 8012ae4: 3728 adds r7, #40 @ 0x28
  44599. 8012ae6: 46bd mov sp, r7
  44600. 8012ae8: bd80 pop {r7, pc}
  44601. 08012aea <prvReadBytesFromBuffer>:
  44602. /*-----------------------------------------------------------*/
  44603. static size_t prvReadBytesFromBuffer( StreamBuffer_t *pxStreamBuffer, uint8_t *pucData, size_t xMaxCount, size_t xBytesAvailable )
  44604. {
  44605. 8012aea: b580 push {r7, lr}
  44606. 8012aec: b08a sub sp, #40 @ 0x28
  44607. 8012aee: af00 add r7, sp, #0
  44608. 8012af0: 60f8 str r0, [r7, #12]
  44609. 8012af2: 60b9 str r1, [r7, #8]
  44610. 8012af4: 607a str r2, [r7, #4]
  44611. 8012af6: 603b str r3, [r7, #0]
  44612. size_t xCount, xFirstLength, xNextTail;
  44613. /* Use the minimum of the wanted bytes and the available bytes. */
  44614. xCount = configMIN( xBytesAvailable, xMaxCount );
  44615. 8012af8: 687a ldr r2, [r7, #4]
  44616. 8012afa: 683b ldr r3, [r7, #0]
  44617. 8012afc: 4293 cmp r3, r2
  44618. 8012afe: bf28 it cs
  44619. 8012b00: 4613 movcs r3, r2
  44620. 8012b02: 623b str r3, [r7, #32]
  44621. if( xCount > ( size_t ) 0 )
  44622. 8012b04: 6a3b ldr r3, [r7, #32]
  44623. 8012b06: 2b00 cmp r3, #0
  44624. 8012b08: d067 beq.n 8012bda <prvReadBytesFromBuffer+0xf0>
  44625. {
  44626. xNextTail = pxStreamBuffer->xTail;
  44627. 8012b0a: 68fb ldr r3, [r7, #12]
  44628. 8012b0c: 681b ldr r3, [r3, #0]
  44629. 8012b0e: 627b str r3, [r7, #36] @ 0x24
  44630. /* Calculate the number of bytes that can be read - which may be
  44631. less than the number wanted if the data wraps around to the start of
  44632. the buffer. */
  44633. xFirstLength = configMIN( pxStreamBuffer->xLength - xNextTail, xCount );
  44634. 8012b10: 68fb ldr r3, [r7, #12]
  44635. 8012b12: 689a ldr r2, [r3, #8]
  44636. 8012b14: 6a7b ldr r3, [r7, #36] @ 0x24
  44637. 8012b16: 1ad3 subs r3, r2, r3
  44638. 8012b18: 6a3a ldr r2, [r7, #32]
  44639. 8012b1a: 4293 cmp r3, r2
  44640. 8012b1c: bf28 it cs
  44641. 8012b1e: 4613 movcs r3, r2
  44642. 8012b20: 61fb str r3, [r7, #28]
  44643. /* Obtain the number of bytes it is possible to obtain in the first
  44644. read. Asserts check bounds of read and write. */
  44645. configASSERT( xFirstLength <= xMaxCount );
  44646. 8012b22: 69fa ldr r2, [r7, #28]
  44647. 8012b24: 687b ldr r3, [r7, #4]
  44648. 8012b26: 429a cmp r2, r3
  44649. 8012b28: d90b bls.n 8012b42 <prvReadBytesFromBuffer+0x58>
  44650. __asm volatile
  44651. 8012b2a: f04f 0350 mov.w r3, #80 @ 0x50
  44652. 8012b2e: f383 8811 msr BASEPRI, r3
  44653. 8012b32: f3bf 8f6f isb sy
  44654. 8012b36: f3bf 8f4f dsb sy
  44655. 8012b3a: 61bb str r3, [r7, #24]
  44656. }
  44657. 8012b3c: bf00 nop
  44658. 8012b3e: bf00 nop
  44659. 8012b40: e7fd b.n 8012b3e <prvReadBytesFromBuffer+0x54>
  44660. configASSERT( ( xNextTail + xFirstLength ) <= pxStreamBuffer->xLength );
  44661. 8012b42: 6a7a ldr r2, [r7, #36] @ 0x24
  44662. 8012b44: 69fb ldr r3, [r7, #28]
  44663. 8012b46: 441a add r2, r3
  44664. 8012b48: 68fb ldr r3, [r7, #12]
  44665. 8012b4a: 689b ldr r3, [r3, #8]
  44666. 8012b4c: 429a cmp r2, r3
  44667. 8012b4e: d90b bls.n 8012b68 <prvReadBytesFromBuffer+0x7e>
  44668. __asm volatile
  44669. 8012b50: f04f 0350 mov.w r3, #80 @ 0x50
  44670. 8012b54: f383 8811 msr BASEPRI, r3
  44671. 8012b58: f3bf 8f6f isb sy
  44672. 8012b5c: f3bf 8f4f dsb sy
  44673. 8012b60: 617b str r3, [r7, #20]
  44674. }
  44675. 8012b62: bf00 nop
  44676. 8012b64: bf00 nop
  44677. 8012b66: e7fd b.n 8012b64 <prvReadBytesFromBuffer+0x7a>
  44678. ( void ) memcpy( ( void * ) pucData, ( const void * ) &( pxStreamBuffer->pucBuffer[ xNextTail ] ), xFirstLength ); /*lint !e9087 memcpy() requires void *. */
  44679. 8012b68: 68fb ldr r3, [r7, #12]
  44680. 8012b6a: 699a ldr r2, [r3, #24]
  44681. 8012b6c: 6a7b ldr r3, [r7, #36] @ 0x24
  44682. 8012b6e: 4413 add r3, r2
  44683. 8012b70: 69fa ldr r2, [r7, #28]
  44684. 8012b72: 4619 mov r1, r3
  44685. 8012b74: 68b8 ldr r0, [r7, #8]
  44686. 8012b76: f017 f9b2 bl 8029ede <memcpy>
  44687. /* If the total number of wanted bytes is greater than the number
  44688. that could be read in the first read... */
  44689. if( xCount > xFirstLength )
  44690. 8012b7a: 6a3a ldr r2, [r7, #32]
  44691. 8012b7c: 69fb ldr r3, [r7, #28]
  44692. 8012b7e: 429a cmp r2, r3
  44693. 8012b80: d91a bls.n 8012bb8 <prvReadBytesFromBuffer+0xce>
  44694. {
  44695. /*...then read the remaining bytes from the start of the buffer. */
  44696. configASSERT( xCount <= xMaxCount );
  44697. 8012b82: 6a3a ldr r2, [r7, #32]
  44698. 8012b84: 687b ldr r3, [r7, #4]
  44699. 8012b86: 429a cmp r2, r3
  44700. 8012b88: d90b bls.n 8012ba2 <prvReadBytesFromBuffer+0xb8>
  44701. __asm volatile
  44702. 8012b8a: f04f 0350 mov.w r3, #80 @ 0x50
  44703. 8012b8e: f383 8811 msr BASEPRI, r3
  44704. 8012b92: f3bf 8f6f isb sy
  44705. 8012b96: f3bf 8f4f dsb sy
  44706. 8012b9a: 613b str r3, [r7, #16]
  44707. }
  44708. 8012b9c: bf00 nop
  44709. 8012b9e: bf00 nop
  44710. 8012ba0: e7fd b.n 8012b9e <prvReadBytesFromBuffer+0xb4>
  44711. ( void ) memcpy( ( void * ) &( pucData[ xFirstLength ] ), ( void * ) ( pxStreamBuffer->pucBuffer ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */
  44712. 8012ba2: 68ba ldr r2, [r7, #8]
  44713. 8012ba4: 69fb ldr r3, [r7, #28]
  44714. 8012ba6: 18d0 adds r0, r2, r3
  44715. 8012ba8: 68fb ldr r3, [r7, #12]
  44716. 8012baa: 6999 ldr r1, [r3, #24]
  44717. 8012bac: 6a3a ldr r2, [r7, #32]
  44718. 8012bae: 69fb ldr r3, [r7, #28]
  44719. 8012bb0: 1ad3 subs r3, r2, r3
  44720. 8012bb2: 461a mov r2, r3
  44721. 8012bb4: f017 f993 bl 8029ede <memcpy>
  44722. mtCOVERAGE_TEST_MARKER();
  44723. }
  44724. /* Move the tail pointer to effectively remove the data read from
  44725. the buffer. */
  44726. xNextTail += xCount;
  44727. 8012bb8: 6a7a ldr r2, [r7, #36] @ 0x24
  44728. 8012bba: 6a3b ldr r3, [r7, #32]
  44729. 8012bbc: 4413 add r3, r2
  44730. 8012bbe: 627b str r3, [r7, #36] @ 0x24
  44731. if( xNextTail >= pxStreamBuffer->xLength )
  44732. 8012bc0: 68fb ldr r3, [r7, #12]
  44733. 8012bc2: 689b ldr r3, [r3, #8]
  44734. 8012bc4: 6a7a ldr r2, [r7, #36] @ 0x24
  44735. 8012bc6: 429a cmp r2, r3
  44736. 8012bc8: d304 bcc.n 8012bd4 <prvReadBytesFromBuffer+0xea>
  44737. {
  44738. xNextTail -= pxStreamBuffer->xLength;
  44739. 8012bca: 68fb ldr r3, [r7, #12]
  44740. 8012bcc: 689b ldr r3, [r3, #8]
  44741. 8012bce: 6a7a ldr r2, [r7, #36] @ 0x24
  44742. 8012bd0: 1ad3 subs r3, r2, r3
  44743. 8012bd2: 627b str r3, [r7, #36] @ 0x24
  44744. }
  44745. pxStreamBuffer->xTail = xNextTail;
  44746. 8012bd4: 68fb ldr r3, [r7, #12]
  44747. 8012bd6: 6a7a ldr r2, [r7, #36] @ 0x24
  44748. 8012bd8: 601a str r2, [r3, #0]
  44749. else
  44750. {
  44751. mtCOVERAGE_TEST_MARKER();
  44752. }
  44753. return xCount;
  44754. 8012bda: 6a3b ldr r3, [r7, #32]
  44755. }
  44756. 8012bdc: 4618 mov r0, r3
  44757. 8012bde: 3728 adds r7, #40 @ 0x28
  44758. 8012be0: 46bd mov sp, r7
  44759. 8012be2: bd80 pop {r7, pc}
  44760. 08012be4 <prvBytesInBuffer>:
  44761. /*-----------------------------------------------------------*/
  44762. static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer )
  44763. {
  44764. 8012be4: b480 push {r7}
  44765. 8012be6: b085 sub sp, #20
  44766. 8012be8: af00 add r7, sp, #0
  44767. 8012bea: 6078 str r0, [r7, #4]
  44768. /* Returns the distance between xTail and xHead. */
  44769. size_t xCount;
  44770. xCount = pxStreamBuffer->xLength + pxStreamBuffer->xHead;
  44771. 8012bec: 687b ldr r3, [r7, #4]
  44772. 8012bee: 689a ldr r2, [r3, #8]
  44773. 8012bf0: 687b ldr r3, [r7, #4]
  44774. 8012bf2: 685b ldr r3, [r3, #4]
  44775. 8012bf4: 4413 add r3, r2
  44776. 8012bf6: 60fb str r3, [r7, #12]
  44777. xCount -= pxStreamBuffer->xTail;
  44778. 8012bf8: 687b ldr r3, [r7, #4]
  44779. 8012bfa: 681b ldr r3, [r3, #0]
  44780. 8012bfc: 68fa ldr r2, [r7, #12]
  44781. 8012bfe: 1ad3 subs r3, r2, r3
  44782. 8012c00: 60fb str r3, [r7, #12]
  44783. if ( xCount >= pxStreamBuffer->xLength )
  44784. 8012c02: 687b ldr r3, [r7, #4]
  44785. 8012c04: 689b ldr r3, [r3, #8]
  44786. 8012c06: 68fa ldr r2, [r7, #12]
  44787. 8012c08: 429a cmp r2, r3
  44788. 8012c0a: d304 bcc.n 8012c16 <prvBytesInBuffer+0x32>
  44789. {
  44790. xCount -= pxStreamBuffer->xLength;
  44791. 8012c0c: 687b ldr r3, [r7, #4]
  44792. 8012c0e: 689b ldr r3, [r3, #8]
  44793. 8012c10: 68fa ldr r2, [r7, #12]
  44794. 8012c12: 1ad3 subs r3, r2, r3
  44795. 8012c14: 60fb str r3, [r7, #12]
  44796. else
  44797. {
  44798. mtCOVERAGE_TEST_MARKER();
  44799. }
  44800. return xCount;
  44801. 8012c16: 68fb ldr r3, [r7, #12]
  44802. }
  44803. 8012c18: 4618 mov r0, r3
  44804. 8012c1a: 3714 adds r7, #20
  44805. 8012c1c: 46bd mov sp, r7
  44806. 8012c1e: f85d 7b04 ldr.w r7, [sp], #4
  44807. 8012c22: 4770 bx lr
  44808. 08012c24 <prvInitialiseNewStreamBuffer>:
  44809. static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer,
  44810. uint8_t * const pucBuffer,
  44811. size_t xBufferSizeBytes,
  44812. size_t xTriggerLevelBytes,
  44813. uint8_t ucFlags )
  44814. {
  44815. 8012c24: b580 push {r7, lr}
  44816. 8012c26: b086 sub sp, #24
  44817. 8012c28: af00 add r7, sp, #0
  44818. 8012c2a: 60f8 str r0, [r7, #12]
  44819. 8012c2c: 60b9 str r1, [r7, #8]
  44820. 8012c2e: 607a str r2, [r7, #4]
  44821. 8012c30: 603b str r3, [r7, #0]
  44822. #if( configASSERT_DEFINED == 1 )
  44823. {
  44824. /* The value written just has to be identifiable when looking at the
  44825. memory. Don't use 0xA5 as that is the stack fill value and could
  44826. result in confusion as to what is actually being observed. */
  44827. const BaseType_t xWriteValue = 0x55;
  44828. 8012c32: 2355 movs r3, #85 @ 0x55
  44829. 8012c34: 617b str r3, [r7, #20]
  44830. configASSERT( memset( pucBuffer, ( int ) xWriteValue, xBufferSizeBytes ) == pucBuffer );
  44831. 8012c36: 687a ldr r2, [r7, #4]
  44832. 8012c38: 6979 ldr r1, [r7, #20]
  44833. 8012c3a: 68b8 ldr r0, [r7, #8]
  44834. 8012c3c: f017 f858 bl 8029cf0 <memset>
  44835. 8012c40: 4602 mov r2, r0
  44836. 8012c42: 68bb ldr r3, [r7, #8]
  44837. 8012c44: 4293 cmp r3, r2
  44838. 8012c46: d00b beq.n 8012c60 <prvInitialiseNewStreamBuffer+0x3c>
  44839. __asm volatile
  44840. 8012c48: f04f 0350 mov.w r3, #80 @ 0x50
  44841. 8012c4c: f383 8811 msr BASEPRI, r3
  44842. 8012c50: f3bf 8f6f isb sy
  44843. 8012c54: f3bf 8f4f dsb sy
  44844. 8012c58: 613b str r3, [r7, #16]
  44845. }
  44846. 8012c5a: bf00 nop
  44847. 8012c5c: bf00 nop
  44848. 8012c5e: e7fd b.n 8012c5c <prvInitialiseNewStreamBuffer+0x38>
  44849. } /*lint !e529 !e438 xWriteValue is only used if configASSERT() is defined. */
  44850. #endif
  44851. ( void ) memset( ( void * ) pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); /*lint !e9087 memset() requires void *. */
  44852. 8012c60: 2224 movs r2, #36 @ 0x24
  44853. 8012c62: 2100 movs r1, #0
  44854. 8012c64: 68f8 ldr r0, [r7, #12]
  44855. 8012c66: f017 f843 bl 8029cf0 <memset>
  44856. pxStreamBuffer->pucBuffer = pucBuffer;
  44857. 8012c6a: 68fb ldr r3, [r7, #12]
  44858. 8012c6c: 68ba ldr r2, [r7, #8]
  44859. 8012c6e: 619a str r2, [r3, #24]
  44860. pxStreamBuffer->xLength = xBufferSizeBytes;
  44861. 8012c70: 68fb ldr r3, [r7, #12]
  44862. 8012c72: 687a ldr r2, [r7, #4]
  44863. 8012c74: 609a str r2, [r3, #8]
  44864. pxStreamBuffer->xTriggerLevelBytes = xTriggerLevelBytes;
  44865. 8012c76: 68fb ldr r3, [r7, #12]
  44866. 8012c78: 683a ldr r2, [r7, #0]
  44867. 8012c7a: 60da str r2, [r3, #12]
  44868. pxStreamBuffer->ucFlags = ucFlags;
  44869. 8012c7c: 68fb ldr r3, [r7, #12]
  44870. 8012c7e: f897 2020 ldrb.w r2, [r7, #32]
  44871. 8012c82: 771a strb r2, [r3, #28]
  44872. }
  44873. 8012c84: bf00 nop
  44874. 8012c86: 3718 adds r7, #24
  44875. 8012c88: 46bd mov sp, r7
  44876. 8012c8a: bd80 pop {r7, pc}
  44877. 08012c8c <xTaskCreateStatic>:
  44878. const uint32_t ulStackDepth,
  44879. void * const pvParameters,
  44880. UBaseType_t uxPriority,
  44881. StackType_t * const puxStackBuffer,
  44882. StaticTask_t * const pxTaskBuffer )
  44883. {
  44884. 8012c8c: b580 push {r7, lr}
  44885. 8012c8e: b08e sub sp, #56 @ 0x38
  44886. 8012c90: af04 add r7, sp, #16
  44887. 8012c92: 60f8 str r0, [r7, #12]
  44888. 8012c94: 60b9 str r1, [r7, #8]
  44889. 8012c96: 607a str r2, [r7, #4]
  44890. 8012c98: 603b str r3, [r7, #0]
  44891. TCB_t *pxNewTCB;
  44892. TaskHandle_t xReturn;
  44893. configASSERT( puxStackBuffer != NULL );
  44894. 8012c9a: 6b7b ldr r3, [r7, #52] @ 0x34
  44895. 8012c9c: 2b00 cmp r3, #0
  44896. 8012c9e: d10b bne.n 8012cb8 <xTaskCreateStatic+0x2c>
  44897. __asm volatile
  44898. 8012ca0: f04f 0350 mov.w r3, #80 @ 0x50
  44899. 8012ca4: f383 8811 msr BASEPRI, r3
  44900. 8012ca8: f3bf 8f6f isb sy
  44901. 8012cac: f3bf 8f4f dsb sy
  44902. 8012cb0: 623b str r3, [r7, #32]
  44903. }
  44904. 8012cb2: bf00 nop
  44905. 8012cb4: bf00 nop
  44906. 8012cb6: e7fd b.n 8012cb4 <xTaskCreateStatic+0x28>
  44907. configASSERT( pxTaskBuffer != NULL );
  44908. 8012cb8: 6bbb ldr r3, [r7, #56] @ 0x38
  44909. 8012cba: 2b00 cmp r3, #0
  44910. 8012cbc: d10b bne.n 8012cd6 <xTaskCreateStatic+0x4a>
  44911. __asm volatile
  44912. 8012cbe: f04f 0350 mov.w r3, #80 @ 0x50
  44913. 8012cc2: f383 8811 msr BASEPRI, r3
  44914. 8012cc6: f3bf 8f6f isb sy
  44915. 8012cca: f3bf 8f4f dsb sy
  44916. 8012cce: 61fb str r3, [r7, #28]
  44917. }
  44918. 8012cd0: bf00 nop
  44919. 8012cd2: bf00 nop
  44920. 8012cd4: e7fd b.n 8012cd2 <xTaskCreateStatic+0x46>
  44921. #if( configASSERT_DEFINED == 1 )
  44922. {
  44923. /* Sanity check that the size of the structure used to declare a
  44924. variable of type StaticTask_t equals the size of the real task
  44925. structure. */
  44926. volatile size_t xSize = sizeof( StaticTask_t );
  44927. 8012cd6: 23a8 movs r3, #168 @ 0xa8
  44928. 8012cd8: 613b str r3, [r7, #16]
  44929. configASSERT( xSize == sizeof( TCB_t ) );
  44930. 8012cda: 693b ldr r3, [r7, #16]
  44931. 8012cdc: 2ba8 cmp r3, #168 @ 0xa8
  44932. 8012cde: d00b beq.n 8012cf8 <xTaskCreateStatic+0x6c>
  44933. __asm volatile
  44934. 8012ce0: f04f 0350 mov.w r3, #80 @ 0x50
  44935. 8012ce4: f383 8811 msr BASEPRI, r3
  44936. 8012ce8: f3bf 8f6f isb sy
  44937. 8012cec: f3bf 8f4f dsb sy
  44938. 8012cf0: 61bb str r3, [r7, #24]
  44939. }
  44940. 8012cf2: bf00 nop
  44941. 8012cf4: bf00 nop
  44942. 8012cf6: e7fd b.n 8012cf4 <xTaskCreateStatic+0x68>
  44943. ( void ) xSize; /* Prevent lint warning when configASSERT() is not used. */
  44944. 8012cf8: 693b ldr r3, [r7, #16]
  44945. }
  44946. #endif /* configASSERT_DEFINED */
  44947. if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) )
  44948. 8012cfa: 6bbb ldr r3, [r7, #56] @ 0x38
  44949. 8012cfc: 2b00 cmp r3, #0
  44950. 8012cfe: d01e beq.n 8012d3e <xTaskCreateStatic+0xb2>
  44951. 8012d00: 6b7b ldr r3, [r7, #52] @ 0x34
  44952. 8012d02: 2b00 cmp r3, #0
  44953. 8012d04: d01b beq.n 8012d3e <xTaskCreateStatic+0xb2>
  44954. {
  44955. /* The memory used for the task's TCB and stack are passed into this
  44956. function - use them. */
  44957. pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */
  44958. 8012d06: 6bbb ldr r3, [r7, #56] @ 0x38
  44959. 8012d08: 627b str r3, [r7, #36] @ 0x24
  44960. pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer;
  44961. 8012d0a: 6a7b ldr r3, [r7, #36] @ 0x24
  44962. 8012d0c: 6b7a ldr r2, [r7, #52] @ 0x34
  44963. 8012d0e: 631a str r2, [r3, #48] @ 0x30
  44964. #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */
  44965. {
  44966. /* Tasks can be created statically or dynamically, so note this
  44967. task was created statically in case the task is later deleted. */
  44968. pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB;
  44969. 8012d10: 6a7b ldr r3, [r7, #36] @ 0x24
  44970. 8012d12: 2202 movs r2, #2
  44971. 8012d14: f883 20a5 strb.w r2, [r3, #165] @ 0xa5
  44972. }
  44973. #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */
  44974. prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL );
  44975. 8012d18: 2300 movs r3, #0
  44976. 8012d1a: 9303 str r3, [sp, #12]
  44977. 8012d1c: 6a7b ldr r3, [r7, #36] @ 0x24
  44978. 8012d1e: 9302 str r3, [sp, #8]
  44979. 8012d20: f107 0314 add.w r3, r7, #20
  44980. 8012d24: 9301 str r3, [sp, #4]
  44981. 8012d26: 6b3b ldr r3, [r7, #48] @ 0x30
  44982. 8012d28: 9300 str r3, [sp, #0]
  44983. 8012d2a: 683b ldr r3, [r7, #0]
  44984. 8012d2c: 687a ldr r2, [r7, #4]
  44985. 8012d2e: 68b9 ldr r1, [r7, #8]
  44986. 8012d30: 68f8 ldr r0, [r7, #12]
  44987. 8012d32: f000 f851 bl 8012dd8 <prvInitialiseNewTask>
  44988. prvAddNewTaskToReadyList( pxNewTCB );
  44989. 8012d36: 6a78 ldr r0, [r7, #36] @ 0x24
  44990. 8012d38: f000 f8f6 bl 8012f28 <prvAddNewTaskToReadyList>
  44991. 8012d3c: e001 b.n 8012d42 <xTaskCreateStatic+0xb6>
  44992. }
  44993. else
  44994. {
  44995. xReturn = NULL;
  44996. 8012d3e: 2300 movs r3, #0
  44997. 8012d40: 617b str r3, [r7, #20]
  44998. }
  44999. return xReturn;
  45000. 8012d42: 697b ldr r3, [r7, #20]
  45001. }
  45002. 8012d44: 4618 mov r0, r3
  45003. 8012d46: 3728 adds r7, #40 @ 0x28
  45004. 8012d48: 46bd mov sp, r7
  45005. 8012d4a: bd80 pop {r7, pc}
  45006. 08012d4c <xTaskCreate>:
  45007. const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
  45008. const configSTACK_DEPTH_TYPE usStackDepth,
  45009. void * const pvParameters,
  45010. UBaseType_t uxPriority,
  45011. TaskHandle_t * const pxCreatedTask )
  45012. {
  45013. 8012d4c: b580 push {r7, lr}
  45014. 8012d4e: b08c sub sp, #48 @ 0x30
  45015. 8012d50: af04 add r7, sp, #16
  45016. 8012d52: 60f8 str r0, [r7, #12]
  45017. 8012d54: 60b9 str r1, [r7, #8]
  45018. 8012d56: 603b str r3, [r7, #0]
  45019. 8012d58: 4613 mov r3, r2
  45020. 8012d5a: 80fb strh r3, [r7, #6]
  45021. #else /* portSTACK_GROWTH */
  45022. {
  45023. StackType_t *pxStack;
  45024. /* Allocate space for the stack used by the task being created. */
  45025. pxStack = pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */
  45026. 8012d5c: 88fb ldrh r3, [r7, #6]
  45027. 8012d5e: 009b lsls r3, r3, #2
  45028. 8012d60: 4618 mov r0, r3
  45029. 8012d62: f002 f803 bl 8014d6c <pvPortMalloc>
  45030. 8012d66: 6178 str r0, [r7, #20]
  45031. if( pxStack != NULL )
  45032. 8012d68: 697b ldr r3, [r7, #20]
  45033. 8012d6a: 2b00 cmp r3, #0
  45034. 8012d6c: d00e beq.n 8012d8c <xTaskCreate+0x40>
  45035. {
  45036. /* Allocate space for the TCB. */
  45037. pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */
  45038. 8012d6e: 20a8 movs r0, #168 @ 0xa8
  45039. 8012d70: f001 fffc bl 8014d6c <pvPortMalloc>
  45040. 8012d74: 61f8 str r0, [r7, #28]
  45041. if( pxNewTCB != NULL )
  45042. 8012d76: 69fb ldr r3, [r7, #28]
  45043. 8012d78: 2b00 cmp r3, #0
  45044. 8012d7a: d003 beq.n 8012d84 <xTaskCreate+0x38>
  45045. {
  45046. /* Store the stack location in the TCB. */
  45047. pxNewTCB->pxStack = pxStack;
  45048. 8012d7c: 69fb ldr r3, [r7, #28]
  45049. 8012d7e: 697a ldr r2, [r7, #20]
  45050. 8012d80: 631a str r2, [r3, #48] @ 0x30
  45051. 8012d82: e005 b.n 8012d90 <xTaskCreate+0x44>
  45052. }
  45053. else
  45054. {
  45055. /* The stack cannot be used as the TCB was not created. Free
  45056. it again. */
  45057. vPortFree( pxStack );
  45058. 8012d84: 6978 ldr r0, [r7, #20]
  45059. 8012d86: f002 f8bf bl 8014f08 <vPortFree>
  45060. 8012d8a: e001 b.n 8012d90 <xTaskCreate+0x44>
  45061. }
  45062. }
  45063. else
  45064. {
  45065. pxNewTCB = NULL;
  45066. 8012d8c: 2300 movs r3, #0
  45067. 8012d8e: 61fb str r3, [r7, #28]
  45068. }
  45069. }
  45070. #endif /* portSTACK_GROWTH */
  45071. if( pxNewTCB != NULL )
  45072. 8012d90: 69fb ldr r3, [r7, #28]
  45073. 8012d92: 2b00 cmp r3, #0
  45074. 8012d94: d017 beq.n 8012dc6 <xTaskCreate+0x7a>
  45075. {
  45076. #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */
  45077. {
  45078. /* Tasks can be created statically or dynamically, so note this
  45079. task was created dynamically in case it is later deleted. */
  45080. pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB;
  45081. 8012d96: 69fb ldr r3, [r7, #28]
  45082. 8012d98: 2200 movs r2, #0
  45083. 8012d9a: f883 20a5 strb.w r2, [r3, #165] @ 0xa5
  45084. }
  45085. #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */
  45086. prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL );
  45087. 8012d9e: 88fa ldrh r2, [r7, #6]
  45088. 8012da0: 2300 movs r3, #0
  45089. 8012da2: 9303 str r3, [sp, #12]
  45090. 8012da4: 69fb ldr r3, [r7, #28]
  45091. 8012da6: 9302 str r3, [sp, #8]
  45092. 8012da8: 6afb ldr r3, [r7, #44] @ 0x2c
  45093. 8012daa: 9301 str r3, [sp, #4]
  45094. 8012dac: 6abb ldr r3, [r7, #40] @ 0x28
  45095. 8012dae: 9300 str r3, [sp, #0]
  45096. 8012db0: 683b ldr r3, [r7, #0]
  45097. 8012db2: 68b9 ldr r1, [r7, #8]
  45098. 8012db4: 68f8 ldr r0, [r7, #12]
  45099. 8012db6: f000 f80f bl 8012dd8 <prvInitialiseNewTask>
  45100. prvAddNewTaskToReadyList( pxNewTCB );
  45101. 8012dba: 69f8 ldr r0, [r7, #28]
  45102. 8012dbc: f000 f8b4 bl 8012f28 <prvAddNewTaskToReadyList>
  45103. xReturn = pdPASS;
  45104. 8012dc0: 2301 movs r3, #1
  45105. 8012dc2: 61bb str r3, [r7, #24]
  45106. 8012dc4: e002 b.n 8012dcc <xTaskCreate+0x80>
  45107. }
  45108. else
  45109. {
  45110. xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
  45111. 8012dc6: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  45112. 8012dca: 61bb str r3, [r7, #24]
  45113. }
  45114. return xReturn;
  45115. 8012dcc: 69bb ldr r3, [r7, #24]
  45116. }
  45117. 8012dce: 4618 mov r0, r3
  45118. 8012dd0: 3720 adds r7, #32
  45119. 8012dd2: 46bd mov sp, r7
  45120. 8012dd4: bd80 pop {r7, pc}
  45121. ...
  45122. 08012dd8 <prvInitialiseNewTask>:
  45123. void * const pvParameters,
  45124. UBaseType_t uxPriority,
  45125. TaskHandle_t * const pxCreatedTask,
  45126. TCB_t *pxNewTCB,
  45127. const MemoryRegion_t * const xRegions )
  45128. {
  45129. 8012dd8: b580 push {r7, lr}
  45130. 8012dda: b088 sub sp, #32
  45131. 8012ddc: af00 add r7, sp, #0
  45132. 8012dde: 60f8 str r0, [r7, #12]
  45133. 8012de0: 60b9 str r1, [r7, #8]
  45134. 8012de2: 607a str r2, [r7, #4]
  45135. 8012de4: 603b str r3, [r7, #0]
  45136. /* Avoid dependency on memset() if it is not required. */
  45137. #if( tskSET_NEW_STACKS_TO_KNOWN_VALUE == 1 )
  45138. {
  45139. /* Fill the stack with a known value to assist debugging. */
  45140. ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) );
  45141. 8012de6: 6b3b ldr r3, [r7, #48] @ 0x30
  45142. 8012de8: 6b18 ldr r0, [r3, #48] @ 0x30
  45143. 8012dea: 687b ldr r3, [r7, #4]
  45144. 8012dec: 009b lsls r3, r3, #2
  45145. 8012dee: 461a mov r2, r3
  45146. 8012df0: 21a5 movs r1, #165 @ 0xa5
  45147. 8012df2: f016 ff7d bl 8029cf0 <memset>
  45148. grows from high memory to low (as per the 80x86) or vice versa.
  45149. portSTACK_GROWTH is used to make the result positive or negative as required
  45150. by the port. */
  45151. #if( portSTACK_GROWTH < 0 )
  45152. {
  45153. pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] );
  45154. 8012df6: 6b3b ldr r3, [r7, #48] @ 0x30
  45155. 8012df8: 6b1a ldr r2, [r3, #48] @ 0x30
  45156. 8012dfa: 6879 ldr r1, [r7, #4]
  45157. 8012dfc: f06f 4340 mvn.w r3, #3221225472 @ 0xc0000000
  45158. 8012e00: 440b add r3, r1
  45159. 8012e02: 009b lsls r3, r3, #2
  45160. 8012e04: 4413 add r3, r2
  45161. 8012e06: 61bb str r3, [r7, #24]
  45162. pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. Checked by assert(). */
  45163. 8012e08: 69bb ldr r3, [r7, #24]
  45164. 8012e0a: f023 0307 bic.w r3, r3, #7
  45165. 8012e0e: 61bb str r3, [r7, #24]
  45166. /* Check the alignment of the calculated top of stack is correct. */
  45167. configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );
  45168. 8012e10: 69bb ldr r3, [r7, #24]
  45169. 8012e12: f003 0307 and.w r3, r3, #7
  45170. 8012e16: 2b00 cmp r3, #0
  45171. 8012e18: d00b beq.n 8012e32 <prvInitialiseNewTask+0x5a>
  45172. __asm volatile
  45173. 8012e1a: f04f 0350 mov.w r3, #80 @ 0x50
  45174. 8012e1e: f383 8811 msr BASEPRI, r3
  45175. 8012e22: f3bf 8f6f isb sy
  45176. 8012e26: f3bf 8f4f dsb sy
  45177. 8012e2a: 617b str r3, [r7, #20]
  45178. }
  45179. 8012e2c: bf00 nop
  45180. 8012e2e: bf00 nop
  45181. 8012e30: e7fd b.n 8012e2e <prvInitialiseNewTask+0x56>
  45182. pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );
  45183. }
  45184. #endif /* portSTACK_GROWTH */
  45185. /* Store the task name in the TCB. */
  45186. if( pcName != NULL )
  45187. 8012e32: 68bb ldr r3, [r7, #8]
  45188. 8012e34: 2b00 cmp r3, #0
  45189. 8012e36: d01f beq.n 8012e78 <prvInitialiseNewTask+0xa0>
  45190. {
  45191. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  45192. 8012e38: 2300 movs r3, #0
  45193. 8012e3a: 61fb str r3, [r7, #28]
  45194. 8012e3c: e012 b.n 8012e64 <prvInitialiseNewTask+0x8c>
  45195. {
  45196. pxNewTCB->pcTaskName[ x ] = pcName[ x ];
  45197. 8012e3e: 68ba ldr r2, [r7, #8]
  45198. 8012e40: 69fb ldr r3, [r7, #28]
  45199. 8012e42: 4413 add r3, r2
  45200. 8012e44: 7819 ldrb r1, [r3, #0]
  45201. 8012e46: 6b3a ldr r2, [r7, #48] @ 0x30
  45202. 8012e48: 69fb ldr r3, [r7, #28]
  45203. 8012e4a: 4413 add r3, r2
  45204. 8012e4c: 3334 adds r3, #52 @ 0x34
  45205. 8012e4e: 460a mov r2, r1
  45206. 8012e50: 701a strb r2, [r3, #0]
  45207. /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than
  45208. configMAX_TASK_NAME_LEN characters just in case the memory after the
  45209. string is not accessible (extremely unlikely). */
  45210. if( pcName[ x ] == ( char ) 0x00 )
  45211. 8012e52: 68ba ldr r2, [r7, #8]
  45212. 8012e54: 69fb ldr r3, [r7, #28]
  45213. 8012e56: 4413 add r3, r2
  45214. 8012e58: 781b ldrb r3, [r3, #0]
  45215. 8012e5a: 2b00 cmp r3, #0
  45216. 8012e5c: d006 beq.n 8012e6c <prvInitialiseNewTask+0x94>
  45217. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  45218. 8012e5e: 69fb ldr r3, [r7, #28]
  45219. 8012e60: 3301 adds r3, #1
  45220. 8012e62: 61fb str r3, [r7, #28]
  45221. 8012e64: 69fb ldr r3, [r7, #28]
  45222. 8012e66: 2b0f cmp r3, #15
  45223. 8012e68: d9e9 bls.n 8012e3e <prvInitialiseNewTask+0x66>
  45224. 8012e6a: e000 b.n 8012e6e <prvInitialiseNewTask+0x96>
  45225. {
  45226. break;
  45227. 8012e6c: bf00 nop
  45228. }
  45229. }
  45230. /* Ensure the name string is terminated in the case that the string length
  45231. was greater or equal to configMAX_TASK_NAME_LEN. */
  45232. pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0';
  45233. 8012e6e: 6b3b ldr r3, [r7, #48] @ 0x30
  45234. 8012e70: 2200 movs r2, #0
  45235. 8012e72: f883 2043 strb.w r2, [r3, #67] @ 0x43
  45236. 8012e76: e003 b.n 8012e80 <prvInitialiseNewTask+0xa8>
  45237. }
  45238. else
  45239. {
  45240. /* The task has not been given a name, so just ensure there is a NULL
  45241. terminator when it is read out. */
  45242. pxNewTCB->pcTaskName[ 0 ] = 0x00;
  45243. 8012e78: 6b3b ldr r3, [r7, #48] @ 0x30
  45244. 8012e7a: 2200 movs r2, #0
  45245. 8012e7c: f883 2034 strb.w r2, [r3, #52] @ 0x34
  45246. }
  45247. /* This is used as an array index so must ensure it's not too large. First
  45248. remove the privilege bit if one is present. */
  45249. if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES )
  45250. 8012e80: 6abb ldr r3, [r7, #40] @ 0x28
  45251. 8012e82: 2b37 cmp r3, #55 @ 0x37
  45252. 8012e84: d901 bls.n 8012e8a <prvInitialiseNewTask+0xb2>
  45253. {
  45254. uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U;
  45255. 8012e86: 2337 movs r3, #55 @ 0x37
  45256. 8012e88: 62bb str r3, [r7, #40] @ 0x28
  45257. else
  45258. {
  45259. mtCOVERAGE_TEST_MARKER();
  45260. }
  45261. pxNewTCB->uxPriority = uxPriority;
  45262. 8012e8a: 6b3b ldr r3, [r7, #48] @ 0x30
  45263. 8012e8c: 6aba ldr r2, [r7, #40] @ 0x28
  45264. 8012e8e: 62da str r2, [r3, #44] @ 0x2c
  45265. #if ( configUSE_MUTEXES == 1 )
  45266. {
  45267. pxNewTCB->uxBasePriority = uxPriority;
  45268. 8012e90: 6b3b ldr r3, [r7, #48] @ 0x30
  45269. 8012e92: 6aba ldr r2, [r7, #40] @ 0x28
  45270. 8012e94: 64da str r2, [r3, #76] @ 0x4c
  45271. pxNewTCB->uxMutexesHeld = 0;
  45272. 8012e96: 6b3b ldr r3, [r7, #48] @ 0x30
  45273. 8012e98: 2200 movs r2, #0
  45274. 8012e9a: 651a str r2, [r3, #80] @ 0x50
  45275. }
  45276. #endif /* configUSE_MUTEXES */
  45277. vListInitialiseItem( &( pxNewTCB->xStateListItem ) );
  45278. 8012e9c: 6b3b ldr r3, [r7, #48] @ 0x30
  45279. 8012e9e: 3304 adds r3, #4
  45280. 8012ea0: 4618 mov r0, r3
  45281. 8012ea2: f7fe f9a5 bl 80111f0 <vListInitialiseItem>
  45282. vListInitialiseItem( &( pxNewTCB->xEventListItem ) );
  45283. 8012ea6: 6b3b ldr r3, [r7, #48] @ 0x30
  45284. 8012ea8: 3318 adds r3, #24
  45285. 8012eaa: 4618 mov r0, r3
  45286. 8012eac: f7fe f9a0 bl 80111f0 <vListInitialiseItem>
  45287. /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get
  45288. back to the containing TCB from a generic item in a list. */
  45289. listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB );
  45290. 8012eb0: 6b3b ldr r3, [r7, #48] @ 0x30
  45291. 8012eb2: 6b3a ldr r2, [r7, #48] @ 0x30
  45292. 8012eb4: 611a str r2, [r3, #16]
  45293. /* Event lists are always in priority order. */
  45294. listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  45295. 8012eb6: 6abb ldr r3, [r7, #40] @ 0x28
  45296. 8012eb8: f1c3 0238 rsb r2, r3, #56 @ 0x38
  45297. 8012ebc: 6b3b ldr r3, [r7, #48] @ 0x30
  45298. 8012ebe: 619a str r2, [r3, #24]
  45299. listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB );
  45300. 8012ec0: 6b3b ldr r3, [r7, #48] @ 0x30
  45301. 8012ec2: 6b3a ldr r2, [r7, #48] @ 0x30
  45302. 8012ec4: 625a str r2, [r3, #36] @ 0x24
  45303. }
  45304. #endif
  45305. #if ( configUSE_TASK_NOTIFICATIONS == 1 )
  45306. {
  45307. pxNewTCB->ulNotifiedValue = 0;
  45308. 8012ec6: 6b3b ldr r3, [r7, #48] @ 0x30
  45309. 8012ec8: 2200 movs r2, #0
  45310. 8012eca: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  45311. pxNewTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION;
  45312. 8012ece: 6b3b ldr r3, [r7, #48] @ 0x30
  45313. 8012ed0: 2200 movs r2, #0
  45314. 8012ed2: f883 20a4 strb.w r2, [r3, #164] @ 0xa4
  45315. #if ( configUSE_NEWLIB_REENTRANT == 1 )
  45316. {
  45317. /* Initialise this task's Newlib reent structure.
  45318. See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
  45319. for additional information. */
  45320. _REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) );
  45321. 8012ed6: 6b3b ldr r3, [r7, #48] @ 0x30
  45322. 8012ed8: 3354 adds r3, #84 @ 0x54
  45323. 8012eda: 224c movs r2, #76 @ 0x4c
  45324. 8012edc: 2100 movs r1, #0
  45325. 8012ede: 4618 mov r0, r3
  45326. 8012ee0: f016 ff06 bl 8029cf0 <memset>
  45327. 8012ee4: 6b3b ldr r3, [r7, #48] @ 0x30
  45328. 8012ee6: 4a0d ldr r2, [pc, #52] @ (8012f1c <prvInitialiseNewTask+0x144>)
  45329. 8012ee8: 659a str r2, [r3, #88] @ 0x58
  45330. 8012eea: 6b3b ldr r3, [r7, #48] @ 0x30
  45331. 8012eec: 4a0c ldr r2, [pc, #48] @ (8012f20 <prvInitialiseNewTask+0x148>)
  45332. 8012eee: 65da str r2, [r3, #92] @ 0x5c
  45333. 8012ef0: 6b3b ldr r3, [r7, #48] @ 0x30
  45334. 8012ef2: 4a0c ldr r2, [pc, #48] @ (8012f24 <prvInitialiseNewTask+0x14c>)
  45335. 8012ef4: 661a str r2, [r3, #96] @ 0x60
  45336. }
  45337. #endif /* portSTACK_GROWTH */
  45338. }
  45339. #else /* portHAS_STACK_OVERFLOW_CHECKING */
  45340. {
  45341. pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters );
  45342. 8012ef6: 683a ldr r2, [r7, #0]
  45343. 8012ef8: 68f9 ldr r1, [r7, #12]
  45344. 8012efa: 69b8 ldr r0, [r7, #24]
  45345. 8012efc: f001 fce0 bl 80148c0 <pxPortInitialiseStack>
  45346. 8012f00: 4602 mov r2, r0
  45347. 8012f02: 6b3b ldr r3, [r7, #48] @ 0x30
  45348. 8012f04: 601a str r2, [r3, #0]
  45349. }
  45350. #endif /* portHAS_STACK_OVERFLOW_CHECKING */
  45351. }
  45352. #endif /* portUSING_MPU_WRAPPERS */
  45353. if( pxCreatedTask != NULL )
  45354. 8012f06: 6afb ldr r3, [r7, #44] @ 0x2c
  45355. 8012f08: 2b00 cmp r3, #0
  45356. 8012f0a: d002 beq.n 8012f12 <prvInitialiseNewTask+0x13a>
  45357. {
  45358. /* Pass the handle out in an anonymous way. The handle can be used to
  45359. change the created task's priority, delete the created task, etc.*/
  45360. *pxCreatedTask = ( TaskHandle_t ) pxNewTCB;
  45361. 8012f0c: 6afb ldr r3, [r7, #44] @ 0x2c
  45362. 8012f0e: 6b3a ldr r2, [r7, #48] @ 0x30
  45363. 8012f10: 601a str r2, [r3, #0]
  45364. }
  45365. else
  45366. {
  45367. mtCOVERAGE_TEST_MARKER();
  45368. }
  45369. }
  45370. 8012f12: bf00 nop
  45371. 8012f14: 3720 adds r7, #32
  45372. 8012f16: 46bd mov sp, r7
  45373. 8012f18: bd80 pop {r7, pc}
  45374. 8012f1a: bf00 nop
  45375. 8012f1c: 2402b044 .word 0x2402b044
  45376. 8012f20: 2402b0ac .word 0x2402b0ac
  45377. 8012f24: 2402b114 .word 0x2402b114
  45378. 08012f28 <prvAddNewTaskToReadyList>:
  45379. /*-----------------------------------------------------------*/
  45380. static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
  45381. {
  45382. 8012f28: b580 push {r7, lr}
  45383. 8012f2a: b082 sub sp, #8
  45384. 8012f2c: af00 add r7, sp, #0
  45385. 8012f2e: 6078 str r0, [r7, #4]
  45386. /* Ensure interrupts don't access the task lists while the lists are being
  45387. updated. */
  45388. taskENTER_CRITICAL();
  45389. 8012f30: f001 fdfa bl 8014b28 <vPortEnterCritical>
  45390. {
  45391. uxCurrentNumberOfTasks++;
  45392. 8012f34: 4b2d ldr r3, [pc, #180] @ (8012fec <prvAddNewTaskToReadyList+0xc4>)
  45393. 8012f36: 681b ldr r3, [r3, #0]
  45394. 8012f38: 3301 adds r3, #1
  45395. 8012f3a: 4a2c ldr r2, [pc, #176] @ (8012fec <prvAddNewTaskToReadyList+0xc4>)
  45396. 8012f3c: 6013 str r3, [r2, #0]
  45397. if( pxCurrentTCB == NULL )
  45398. 8012f3e: 4b2c ldr r3, [pc, #176] @ (8012ff0 <prvAddNewTaskToReadyList+0xc8>)
  45399. 8012f40: 681b ldr r3, [r3, #0]
  45400. 8012f42: 2b00 cmp r3, #0
  45401. 8012f44: d109 bne.n 8012f5a <prvAddNewTaskToReadyList+0x32>
  45402. {
  45403. /* There are no other tasks, or all the other tasks are in
  45404. the suspended state - make this the current task. */
  45405. pxCurrentTCB = pxNewTCB;
  45406. 8012f46: 4a2a ldr r2, [pc, #168] @ (8012ff0 <prvAddNewTaskToReadyList+0xc8>)
  45407. 8012f48: 687b ldr r3, [r7, #4]
  45408. 8012f4a: 6013 str r3, [r2, #0]
  45409. if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 )
  45410. 8012f4c: 4b27 ldr r3, [pc, #156] @ (8012fec <prvAddNewTaskToReadyList+0xc4>)
  45411. 8012f4e: 681b ldr r3, [r3, #0]
  45412. 8012f50: 2b01 cmp r3, #1
  45413. 8012f52: d110 bne.n 8012f76 <prvAddNewTaskToReadyList+0x4e>
  45414. {
  45415. /* This is the first task to be created so do the preliminary
  45416. initialisation required. We will not recover if this call
  45417. fails, but we will report the failure. */
  45418. prvInitialiseTaskLists();
  45419. 8012f54: f000 fc76 bl 8013844 <prvInitialiseTaskLists>
  45420. 8012f58: e00d b.n 8012f76 <prvAddNewTaskToReadyList+0x4e>
  45421. else
  45422. {
  45423. /* If the scheduler is not already running, make this task the
  45424. current task if it is the highest priority task to be created
  45425. so far. */
  45426. if( xSchedulerRunning == pdFALSE )
  45427. 8012f5a: 4b26 ldr r3, [pc, #152] @ (8012ff4 <prvAddNewTaskToReadyList+0xcc>)
  45428. 8012f5c: 681b ldr r3, [r3, #0]
  45429. 8012f5e: 2b00 cmp r3, #0
  45430. 8012f60: d109 bne.n 8012f76 <prvAddNewTaskToReadyList+0x4e>
  45431. {
  45432. if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority )
  45433. 8012f62: 4b23 ldr r3, [pc, #140] @ (8012ff0 <prvAddNewTaskToReadyList+0xc8>)
  45434. 8012f64: 681b ldr r3, [r3, #0]
  45435. 8012f66: 6ada ldr r2, [r3, #44] @ 0x2c
  45436. 8012f68: 687b ldr r3, [r7, #4]
  45437. 8012f6a: 6adb ldr r3, [r3, #44] @ 0x2c
  45438. 8012f6c: 429a cmp r2, r3
  45439. 8012f6e: d802 bhi.n 8012f76 <prvAddNewTaskToReadyList+0x4e>
  45440. {
  45441. pxCurrentTCB = pxNewTCB;
  45442. 8012f70: 4a1f ldr r2, [pc, #124] @ (8012ff0 <prvAddNewTaskToReadyList+0xc8>)
  45443. 8012f72: 687b ldr r3, [r7, #4]
  45444. 8012f74: 6013 str r3, [r2, #0]
  45445. {
  45446. mtCOVERAGE_TEST_MARKER();
  45447. }
  45448. }
  45449. uxTaskNumber++;
  45450. 8012f76: 4b20 ldr r3, [pc, #128] @ (8012ff8 <prvAddNewTaskToReadyList+0xd0>)
  45451. 8012f78: 681b ldr r3, [r3, #0]
  45452. 8012f7a: 3301 adds r3, #1
  45453. 8012f7c: 4a1e ldr r2, [pc, #120] @ (8012ff8 <prvAddNewTaskToReadyList+0xd0>)
  45454. 8012f7e: 6013 str r3, [r2, #0]
  45455. #if ( configUSE_TRACE_FACILITY == 1 )
  45456. {
  45457. /* Add a counter into the TCB for tracing only. */
  45458. pxNewTCB->uxTCBNumber = uxTaskNumber;
  45459. 8012f80: 4b1d ldr r3, [pc, #116] @ (8012ff8 <prvAddNewTaskToReadyList+0xd0>)
  45460. 8012f82: 681a ldr r2, [r3, #0]
  45461. 8012f84: 687b ldr r3, [r7, #4]
  45462. 8012f86: 645a str r2, [r3, #68] @ 0x44
  45463. }
  45464. #endif /* configUSE_TRACE_FACILITY */
  45465. traceTASK_CREATE( pxNewTCB );
  45466. prvAddTaskToReadyList( pxNewTCB );
  45467. 8012f88: 687b ldr r3, [r7, #4]
  45468. 8012f8a: 6ada ldr r2, [r3, #44] @ 0x2c
  45469. 8012f8c: 4b1b ldr r3, [pc, #108] @ (8012ffc <prvAddNewTaskToReadyList+0xd4>)
  45470. 8012f8e: 681b ldr r3, [r3, #0]
  45471. 8012f90: 429a cmp r2, r3
  45472. 8012f92: d903 bls.n 8012f9c <prvAddNewTaskToReadyList+0x74>
  45473. 8012f94: 687b ldr r3, [r7, #4]
  45474. 8012f96: 6adb ldr r3, [r3, #44] @ 0x2c
  45475. 8012f98: 4a18 ldr r2, [pc, #96] @ (8012ffc <prvAddNewTaskToReadyList+0xd4>)
  45476. 8012f9a: 6013 str r3, [r2, #0]
  45477. 8012f9c: 687b ldr r3, [r7, #4]
  45478. 8012f9e: 6ada ldr r2, [r3, #44] @ 0x2c
  45479. 8012fa0: 4613 mov r3, r2
  45480. 8012fa2: 009b lsls r3, r3, #2
  45481. 8012fa4: 4413 add r3, r2
  45482. 8012fa6: 009b lsls r3, r3, #2
  45483. 8012fa8: 4a15 ldr r2, [pc, #84] @ (8013000 <prvAddNewTaskToReadyList+0xd8>)
  45484. 8012faa: 441a add r2, r3
  45485. 8012fac: 687b ldr r3, [r7, #4]
  45486. 8012fae: 3304 adds r3, #4
  45487. 8012fb0: 4619 mov r1, r3
  45488. 8012fb2: 4610 mov r0, r2
  45489. 8012fb4: f7fe f929 bl 801120a <vListInsertEnd>
  45490. portSETUP_TCB( pxNewTCB );
  45491. }
  45492. taskEXIT_CRITICAL();
  45493. 8012fb8: f001 fde8 bl 8014b8c <vPortExitCritical>
  45494. if( xSchedulerRunning != pdFALSE )
  45495. 8012fbc: 4b0d ldr r3, [pc, #52] @ (8012ff4 <prvAddNewTaskToReadyList+0xcc>)
  45496. 8012fbe: 681b ldr r3, [r3, #0]
  45497. 8012fc0: 2b00 cmp r3, #0
  45498. 8012fc2: d00e beq.n 8012fe2 <prvAddNewTaskToReadyList+0xba>
  45499. {
  45500. /* If the created task is of a higher priority than the current task
  45501. then it should run now. */
  45502. if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority )
  45503. 8012fc4: 4b0a ldr r3, [pc, #40] @ (8012ff0 <prvAddNewTaskToReadyList+0xc8>)
  45504. 8012fc6: 681b ldr r3, [r3, #0]
  45505. 8012fc8: 6ada ldr r2, [r3, #44] @ 0x2c
  45506. 8012fca: 687b ldr r3, [r7, #4]
  45507. 8012fcc: 6adb ldr r3, [r3, #44] @ 0x2c
  45508. 8012fce: 429a cmp r2, r3
  45509. 8012fd0: d207 bcs.n 8012fe2 <prvAddNewTaskToReadyList+0xba>
  45510. {
  45511. taskYIELD_IF_USING_PREEMPTION();
  45512. 8012fd2: 4b0c ldr r3, [pc, #48] @ (8013004 <prvAddNewTaskToReadyList+0xdc>)
  45513. 8012fd4: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  45514. 8012fd8: 601a str r2, [r3, #0]
  45515. 8012fda: f3bf 8f4f dsb sy
  45516. 8012fde: f3bf 8f6f isb sy
  45517. }
  45518. else
  45519. {
  45520. mtCOVERAGE_TEST_MARKER();
  45521. }
  45522. }
  45523. 8012fe2: bf00 nop
  45524. 8012fe4: 3708 adds r7, #8
  45525. 8012fe6: 46bd mov sp, r7
  45526. 8012fe8: bd80 pop {r7, pc}
  45527. 8012fea: bf00 nop
  45528. 8012fec: 24004164 .word 0x24004164
  45529. 8012ff0: 24003c90 .word 0x24003c90
  45530. 8012ff4: 24004170 .word 0x24004170
  45531. 8012ff8: 24004180 .word 0x24004180
  45532. 8012ffc: 2400416c .word 0x2400416c
  45533. 8013000: 24003c94 .word 0x24003c94
  45534. 8013004: e000ed04 .word 0xe000ed04
  45535. 08013008 <vTaskDelay>:
  45536. /*-----------------------------------------------------------*/
  45537. #if ( INCLUDE_vTaskDelay == 1 )
  45538. void vTaskDelay( const TickType_t xTicksToDelay )
  45539. {
  45540. 8013008: b580 push {r7, lr}
  45541. 801300a: b084 sub sp, #16
  45542. 801300c: af00 add r7, sp, #0
  45543. 801300e: 6078 str r0, [r7, #4]
  45544. BaseType_t xAlreadyYielded = pdFALSE;
  45545. 8013010: 2300 movs r3, #0
  45546. 8013012: 60fb str r3, [r7, #12]
  45547. /* A delay time of zero just forces a reschedule. */
  45548. if( xTicksToDelay > ( TickType_t ) 0U )
  45549. 8013014: 687b ldr r3, [r7, #4]
  45550. 8013016: 2b00 cmp r3, #0
  45551. 8013018: d018 beq.n 801304c <vTaskDelay+0x44>
  45552. {
  45553. configASSERT( uxSchedulerSuspended == 0 );
  45554. 801301a: 4b14 ldr r3, [pc, #80] @ (801306c <vTaskDelay+0x64>)
  45555. 801301c: 681b ldr r3, [r3, #0]
  45556. 801301e: 2b00 cmp r3, #0
  45557. 8013020: d00b beq.n 801303a <vTaskDelay+0x32>
  45558. __asm volatile
  45559. 8013022: f04f 0350 mov.w r3, #80 @ 0x50
  45560. 8013026: f383 8811 msr BASEPRI, r3
  45561. 801302a: f3bf 8f6f isb sy
  45562. 801302e: f3bf 8f4f dsb sy
  45563. 8013032: 60bb str r3, [r7, #8]
  45564. }
  45565. 8013034: bf00 nop
  45566. 8013036: bf00 nop
  45567. 8013038: e7fd b.n 8013036 <vTaskDelay+0x2e>
  45568. vTaskSuspendAll();
  45569. 801303a: f000 f88b bl 8013154 <vTaskSuspendAll>
  45570. list or removed from the blocked list until the scheduler
  45571. is resumed.
  45572. This task cannot be in an event list as it is the currently
  45573. executing task. */
  45574. prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );
  45575. 801303e: 2100 movs r1, #0
  45576. 8013040: 6878 ldr r0, [r7, #4]
  45577. 8013042: f001 f88f bl 8014164 <prvAddCurrentTaskToDelayedList>
  45578. }
  45579. xAlreadyYielded = xTaskResumeAll();
  45580. 8013046: f000 f893 bl 8013170 <xTaskResumeAll>
  45581. 801304a: 60f8 str r0, [r7, #12]
  45582. mtCOVERAGE_TEST_MARKER();
  45583. }
  45584. /* Force a reschedule if xTaskResumeAll has not already done so, we may
  45585. have put ourselves to sleep. */
  45586. if( xAlreadyYielded == pdFALSE )
  45587. 801304c: 68fb ldr r3, [r7, #12]
  45588. 801304e: 2b00 cmp r3, #0
  45589. 8013050: d107 bne.n 8013062 <vTaskDelay+0x5a>
  45590. {
  45591. portYIELD_WITHIN_API();
  45592. 8013052: 4b07 ldr r3, [pc, #28] @ (8013070 <vTaskDelay+0x68>)
  45593. 8013054: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  45594. 8013058: 601a str r2, [r3, #0]
  45595. 801305a: f3bf 8f4f dsb sy
  45596. 801305e: f3bf 8f6f isb sy
  45597. }
  45598. else
  45599. {
  45600. mtCOVERAGE_TEST_MARKER();
  45601. }
  45602. }
  45603. 8013062: bf00 nop
  45604. 8013064: 3710 adds r7, #16
  45605. 8013066: 46bd mov sp, r7
  45606. 8013068: bd80 pop {r7, pc}
  45607. 801306a: bf00 nop
  45608. 801306c: 2400418c .word 0x2400418c
  45609. 8013070: e000ed04 .word 0xe000ed04
  45610. 08013074 <vTaskStartScheduler>:
  45611. #endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */
  45612. /*-----------------------------------------------------------*/
  45613. void vTaskStartScheduler( void )
  45614. {
  45615. 8013074: b580 push {r7, lr}
  45616. 8013076: b08a sub sp, #40 @ 0x28
  45617. 8013078: af04 add r7, sp, #16
  45618. BaseType_t xReturn;
  45619. /* Add the idle task at the lowest priority. */
  45620. #if( configSUPPORT_STATIC_ALLOCATION == 1 )
  45621. {
  45622. StaticTask_t *pxIdleTaskTCBBuffer = NULL;
  45623. 801307a: 2300 movs r3, #0
  45624. 801307c: 60bb str r3, [r7, #8]
  45625. StackType_t *pxIdleTaskStackBuffer = NULL;
  45626. 801307e: 2300 movs r3, #0
  45627. 8013080: 607b str r3, [r7, #4]
  45628. uint32_t ulIdleTaskStackSize;
  45629. /* The Idle task is created using user provided RAM - obtain the
  45630. address of the RAM then create the idle task. */
  45631. vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize );
  45632. 8013082: 463a mov r2, r7
  45633. 8013084: 1d39 adds r1, r7, #4
  45634. 8013086: f107 0308 add.w r3, r7, #8
  45635. 801308a: 4618 mov r0, r3
  45636. 801308c: f7fe f85c bl 8011148 <vApplicationGetIdleTaskMemory>
  45637. xIdleTaskHandle = xTaskCreateStatic( prvIdleTask,
  45638. 8013090: 6839 ldr r1, [r7, #0]
  45639. 8013092: 687b ldr r3, [r7, #4]
  45640. 8013094: 68ba ldr r2, [r7, #8]
  45641. 8013096: 9202 str r2, [sp, #8]
  45642. 8013098: 9301 str r3, [sp, #4]
  45643. 801309a: 2300 movs r3, #0
  45644. 801309c: 9300 str r3, [sp, #0]
  45645. 801309e: 2300 movs r3, #0
  45646. 80130a0: 460a mov r2, r1
  45647. 80130a2: 4924 ldr r1, [pc, #144] @ (8013134 <vTaskStartScheduler+0xc0>)
  45648. 80130a4: 4824 ldr r0, [pc, #144] @ (8013138 <vTaskStartScheduler+0xc4>)
  45649. 80130a6: f7ff fdf1 bl 8012c8c <xTaskCreateStatic>
  45650. 80130aa: 4603 mov r3, r0
  45651. 80130ac: 4a23 ldr r2, [pc, #140] @ (801313c <vTaskStartScheduler+0xc8>)
  45652. 80130ae: 6013 str r3, [r2, #0]
  45653. ( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */
  45654. portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */
  45655. pxIdleTaskStackBuffer,
  45656. pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */
  45657. if( xIdleTaskHandle != NULL )
  45658. 80130b0: 4b22 ldr r3, [pc, #136] @ (801313c <vTaskStartScheduler+0xc8>)
  45659. 80130b2: 681b ldr r3, [r3, #0]
  45660. 80130b4: 2b00 cmp r3, #0
  45661. 80130b6: d002 beq.n 80130be <vTaskStartScheduler+0x4a>
  45662. {
  45663. xReturn = pdPASS;
  45664. 80130b8: 2301 movs r3, #1
  45665. 80130ba: 617b str r3, [r7, #20]
  45666. 80130bc: e001 b.n 80130c2 <vTaskStartScheduler+0x4e>
  45667. }
  45668. else
  45669. {
  45670. xReturn = pdFAIL;
  45671. 80130be: 2300 movs r3, #0
  45672. 80130c0: 617b str r3, [r7, #20]
  45673. }
  45674. #endif /* configSUPPORT_STATIC_ALLOCATION */
  45675. #if ( configUSE_TIMERS == 1 )
  45676. {
  45677. if( xReturn == pdPASS )
  45678. 80130c2: 697b ldr r3, [r7, #20]
  45679. 80130c4: 2b01 cmp r3, #1
  45680. 80130c6: d102 bne.n 80130ce <vTaskStartScheduler+0x5a>
  45681. {
  45682. xReturn = xTimerCreateTimerTask();
  45683. 80130c8: f001 f8a0 bl 801420c <xTimerCreateTimerTask>
  45684. 80130cc: 6178 str r0, [r7, #20]
  45685. mtCOVERAGE_TEST_MARKER();
  45686. }
  45687. }
  45688. #endif /* configUSE_TIMERS */
  45689. if( xReturn == pdPASS )
  45690. 80130ce: 697b ldr r3, [r7, #20]
  45691. 80130d0: 2b01 cmp r3, #1
  45692. 80130d2: d11b bne.n 801310c <vTaskStartScheduler+0x98>
  45693. __asm volatile
  45694. 80130d4: f04f 0350 mov.w r3, #80 @ 0x50
  45695. 80130d8: f383 8811 msr BASEPRI, r3
  45696. 80130dc: f3bf 8f6f isb sy
  45697. 80130e0: f3bf 8f4f dsb sy
  45698. 80130e4: 613b str r3, [r7, #16]
  45699. }
  45700. 80130e6: bf00 nop
  45701. {
  45702. /* Switch Newlib's _impure_ptr variable to point to the _reent
  45703. structure specific to the task that will run first.
  45704. See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
  45705. for additional information. */
  45706. _impure_ptr = &( pxCurrentTCB->xNewLib_reent );
  45707. 80130e8: 4b15 ldr r3, [pc, #84] @ (8013140 <vTaskStartScheduler+0xcc>)
  45708. 80130ea: 681b ldr r3, [r3, #0]
  45709. 80130ec: 3354 adds r3, #84 @ 0x54
  45710. 80130ee: 4a15 ldr r2, [pc, #84] @ (8013144 <vTaskStartScheduler+0xd0>)
  45711. 80130f0: 6013 str r3, [r2, #0]
  45712. }
  45713. #endif /* configUSE_NEWLIB_REENTRANT */
  45714. xNextTaskUnblockTime = portMAX_DELAY;
  45715. 80130f2: 4b15 ldr r3, [pc, #84] @ (8013148 <vTaskStartScheduler+0xd4>)
  45716. 80130f4: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  45717. 80130f8: 601a str r2, [r3, #0]
  45718. xSchedulerRunning = pdTRUE;
  45719. 80130fa: 4b14 ldr r3, [pc, #80] @ (801314c <vTaskStartScheduler+0xd8>)
  45720. 80130fc: 2201 movs r2, #1
  45721. 80130fe: 601a str r2, [r3, #0]
  45722. xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT;
  45723. 8013100: 4b13 ldr r3, [pc, #76] @ (8013150 <vTaskStartScheduler+0xdc>)
  45724. 8013102: 2200 movs r2, #0
  45725. 8013104: 601a str r2, [r3, #0]
  45726. traceTASK_SWITCHED_IN();
  45727. /* Setting up the timer tick is hardware specific and thus in the
  45728. portable interface. */
  45729. if( xPortStartScheduler() != pdFALSE )
  45730. 8013106: f001 fc6b bl 80149e0 <xPortStartScheduler>
  45731. }
  45732. /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0,
  45733. meaning xIdleTaskHandle is not used anywhere else. */
  45734. ( void ) xIdleTaskHandle;
  45735. }
  45736. 801310a: e00f b.n 801312c <vTaskStartScheduler+0xb8>
  45737. configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY );
  45738. 801310c: 697b ldr r3, [r7, #20]
  45739. 801310e: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  45740. 8013112: d10b bne.n 801312c <vTaskStartScheduler+0xb8>
  45741. __asm volatile
  45742. 8013114: f04f 0350 mov.w r3, #80 @ 0x50
  45743. 8013118: f383 8811 msr BASEPRI, r3
  45744. 801311c: f3bf 8f6f isb sy
  45745. 8013120: f3bf 8f4f dsb sy
  45746. 8013124: 60fb str r3, [r7, #12]
  45747. }
  45748. 8013126: bf00 nop
  45749. 8013128: bf00 nop
  45750. 801312a: e7fd b.n 8013128 <vTaskStartScheduler+0xb4>
  45751. }
  45752. 801312c: bf00 nop
  45753. 801312e: 3718 adds r7, #24
  45754. 8013130: 46bd mov sp, r7
  45755. 8013132: bd80 pop {r7, pc}
  45756. 8013134: 0802cb6c .word 0x0802cb6c
  45757. 8013138: 08013815 .word 0x08013815
  45758. 801313c: 24004188 .word 0x24004188
  45759. 8013140: 24003c90 .word 0x24003c90
  45760. 8013144: 240001d4 .word 0x240001d4
  45761. 8013148: 24004184 .word 0x24004184
  45762. 801314c: 24004170 .word 0x24004170
  45763. 8013150: 24004168 .word 0x24004168
  45764. 08013154 <vTaskSuspendAll>:
  45765. vPortEndScheduler();
  45766. }
  45767. /*----------------------------------------------------------*/
  45768. void vTaskSuspendAll( void )
  45769. {
  45770. 8013154: b480 push {r7}
  45771. 8013156: af00 add r7, sp, #0
  45772. do not otherwise exhibit real time behaviour. */
  45773. portSOFTWARE_BARRIER();
  45774. /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment
  45775. is used to allow calls to vTaskSuspendAll() to nest. */
  45776. ++uxSchedulerSuspended;
  45777. 8013158: 4b04 ldr r3, [pc, #16] @ (801316c <vTaskSuspendAll+0x18>)
  45778. 801315a: 681b ldr r3, [r3, #0]
  45779. 801315c: 3301 adds r3, #1
  45780. 801315e: 4a03 ldr r2, [pc, #12] @ (801316c <vTaskSuspendAll+0x18>)
  45781. 8013160: 6013 str r3, [r2, #0]
  45782. /* Enforces ordering for ports and optimised compilers that may otherwise place
  45783. the above increment elsewhere. */
  45784. portMEMORY_BARRIER();
  45785. }
  45786. 8013162: bf00 nop
  45787. 8013164: 46bd mov sp, r7
  45788. 8013166: f85d 7b04 ldr.w r7, [sp], #4
  45789. 801316a: 4770 bx lr
  45790. 801316c: 2400418c .word 0x2400418c
  45791. 08013170 <xTaskResumeAll>:
  45792. #endif /* configUSE_TICKLESS_IDLE */
  45793. /*----------------------------------------------------------*/
  45794. BaseType_t xTaskResumeAll( void )
  45795. {
  45796. 8013170: b580 push {r7, lr}
  45797. 8013172: b084 sub sp, #16
  45798. 8013174: af00 add r7, sp, #0
  45799. TCB_t *pxTCB = NULL;
  45800. 8013176: 2300 movs r3, #0
  45801. 8013178: 60fb str r3, [r7, #12]
  45802. BaseType_t xAlreadyYielded = pdFALSE;
  45803. 801317a: 2300 movs r3, #0
  45804. 801317c: 60bb str r3, [r7, #8]
  45805. /* If uxSchedulerSuspended is zero then this function does not match a
  45806. previous call to vTaskSuspendAll(). */
  45807. configASSERT( uxSchedulerSuspended );
  45808. 801317e: 4b42 ldr r3, [pc, #264] @ (8013288 <xTaskResumeAll+0x118>)
  45809. 8013180: 681b ldr r3, [r3, #0]
  45810. 8013182: 2b00 cmp r3, #0
  45811. 8013184: d10b bne.n 801319e <xTaskResumeAll+0x2e>
  45812. __asm volatile
  45813. 8013186: f04f 0350 mov.w r3, #80 @ 0x50
  45814. 801318a: f383 8811 msr BASEPRI, r3
  45815. 801318e: f3bf 8f6f isb sy
  45816. 8013192: f3bf 8f4f dsb sy
  45817. 8013196: 603b str r3, [r7, #0]
  45818. }
  45819. 8013198: bf00 nop
  45820. 801319a: bf00 nop
  45821. 801319c: e7fd b.n 801319a <xTaskResumeAll+0x2a>
  45822. /* It is possible that an ISR caused a task to be removed from an event
  45823. list while the scheduler was suspended. If this was the case then the
  45824. removed task will have been added to the xPendingReadyList. Once the
  45825. scheduler has been resumed it is safe to move all the pending ready
  45826. tasks from this list into their appropriate ready list. */
  45827. taskENTER_CRITICAL();
  45828. 801319e: f001 fcc3 bl 8014b28 <vPortEnterCritical>
  45829. {
  45830. --uxSchedulerSuspended;
  45831. 80131a2: 4b39 ldr r3, [pc, #228] @ (8013288 <xTaskResumeAll+0x118>)
  45832. 80131a4: 681b ldr r3, [r3, #0]
  45833. 80131a6: 3b01 subs r3, #1
  45834. 80131a8: 4a37 ldr r2, [pc, #220] @ (8013288 <xTaskResumeAll+0x118>)
  45835. 80131aa: 6013 str r3, [r2, #0]
  45836. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  45837. 80131ac: 4b36 ldr r3, [pc, #216] @ (8013288 <xTaskResumeAll+0x118>)
  45838. 80131ae: 681b ldr r3, [r3, #0]
  45839. 80131b0: 2b00 cmp r3, #0
  45840. 80131b2: d162 bne.n 801327a <xTaskResumeAll+0x10a>
  45841. {
  45842. if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
  45843. 80131b4: 4b35 ldr r3, [pc, #212] @ (801328c <xTaskResumeAll+0x11c>)
  45844. 80131b6: 681b ldr r3, [r3, #0]
  45845. 80131b8: 2b00 cmp r3, #0
  45846. 80131ba: d05e beq.n 801327a <xTaskResumeAll+0x10a>
  45847. {
  45848. /* Move any readied tasks from the pending list into the
  45849. appropriate ready list. */
  45850. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  45851. 80131bc: e02f b.n 801321e <xTaskResumeAll+0xae>
  45852. {
  45853. pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
  45854. 80131be: 4b34 ldr r3, [pc, #208] @ (8013290 <xTaskResumeAll+0x120>)
  45855. 80131c0: 68db ldr r3, [r3, #12]
  45856. 80131c2: 68db ldr r3, [r3, #12]
  45857. 80131c4: 60fb str r3, [r7, #12]
  45858. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  45859. 80131c6: 68fb ldr r3, [r7, #12]
  45860. 80131c8: 3318 adds r3, #24
  45861. 80131ca: 4618 mov r0, r3
  45862. 80131cc: f7fe f87a bl 80112c4 <uxListRemove>
  45863. ( void ) uxListRemove( &( pxTCB->xStateListItem ) );
  45864. 80131d0: 68fb ldr r3, [r7, #12]
  45865. 80131d2: 3304 adds r3, #4
  45866. 80131d4: 4618 mov r0, r3
  45867. 80131d6: f7fe f875 bl 80112c4 <uxListRemove>
  45868. prvAddTaskToReadyList( pxTCB );
  45869. 80131da: 68fb ldr r3, [r7, #12]
  45870. 80131dc: 6ada ldr r2, [r3, #44] @ 0x2c
  45871. 80131de: 4b2d ldr r3, [pc, #180] @ (8013294 <xTaskResumeAll+0x124>)
  45872. 80131e0: 681b ldr r3, [r3, #0]
  45873. 80131e2: 429a cmp r2, r3
  45874. 80131e4: d903 bls.n 80131ee <xTaskResumeAll+0x7e>
  45875. 80131e6: 68fb ldr r3, [r7, #12]
  45876. 80131e8: 6adb ldr r3, [r3, #44] @ 0x2c
  45877. 80131ea: 4a2a ldr r2, [pc, #168] @ (8013294 <xTaskResumeAll+0x124>)
  45878. 80131ec: 6013 str r3, [r2, #0]
  45879. 80131ee: 68fb ldr r3, [r7, #12]
  45880. 80131f0: 6ada ldr r2, [r3, #44] @ 0x2c
  45881. 80131f2: 4613 mov r3, r2
  45882. 80131f4: 009b lsls r3, r3, #2
  45883. 80131f6: 4413 add r3, r2
  45884. 80131f8: 009b lsls r3, r3, #2
  45885. 80131fa: 4a27 ldr r2, [pc, #156] @ (8013298 <xTaskResumeAll+0x128>)
  45886. 80131fc: 441a add r2, r3
  45887. 80131fe: 68fb ldr r3, [r7, #12]
  45888. 8013200: 3304 adds r3, #4
  45889. 8013202: 4619 mov r1, r3
  45890. 8013204: 4610 mov r0, r2
  45891. 8013206: f7fe f800 bl 801120a <vListInsertEnd>
  45892. /* If the moved task has a priority higher than the current
  45893. task then a yield must be performed. */
  45894. if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
  45895. 801320a: 68fb ldr r3, [r7, #12]
  45896. 801320c: 6ada ldr r2, [r3, #44] @ 0x2c
  45897. 801320e: 4b23 ldr r3, [pc, #140] @ (801329c <xTaskResumeAll+0x12c>)
  45898. 8013210: 681b ldr r3, [r3, #0]
  45899. 8013212: 6adb ldr r3, [r3, #44] @ 0x2c
  45900. 8013214: 429a cmp r2, r3
  45901. 8013216: d302 bcc.n 801321e <xTaskResumeAll+0xae>
  45902. {
  45903. xYieldPending = pdTRUE;
  45904. 8013218: 4b21 ldr r3, [pc, #132] @ (80132a0 <xTaskResumeAll+0x130>)
  45905. 801321a: 2201 movs r2, #1
  45906. 801321c: 601a str r2, [r3, #0]
  45907. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  45908. 801321e: 4b1c ldr r3, [pc, #112] @ (8013290 <xTaskResumeAll+0x120>)
  45909. 8013220: 681b ldr r3, [r3, #0]
  45910. 8013222: 2b00 cmp r3, #0
  45911. 8013224: d1cb bne.n 80131be <xTaskResumeAll+0x4e>
  45912. {
  45913. mtCOVERAGE_TEST_MARKER();
  45914. }
  45915. }
  45916. if( pxTCB != NULL )
  45917. 8013226: 68fb ldr r3, [r7, #12]
  45918. 8013228: 2b00 cmp r3, #0
  45919. 801322a: d001 beq.n 8013230 <xTaskResumeAll+0xc0>
  45920. which may have prevented the next unblock time from being
  45921. re-calculated, in which case re-calculate it now. Mainly
  45922. important for low power tickless implementations, where
  45923. this can prevent an unnecessary exit from low power
  45924. state. */
  45925. prvResetNextTaskUnblockTime();
  45926. 801322c: f000 fbae bl 801398c <prvResetNextTaskUnblockTime>
  45927. /* If any ticks occurred while the scheduler was suspended then
  45928. they should be processed now. This ensures the tick count does
  45929. not slip, and that any delayed tasks are resumed at the correct
  45930. time. */
  45931. {
  45932. TickType_t xPendedCounts = xPendedTicks; /* Non-volatile copy. */
  45933. 8013230: 4b1c ldr r3, [pc, #112] @ (80132a4 <xTaskResumeAll+0x134>)
  45934. 8013232: 681b ldr r3, [r3, #0]
  45935. 8013234: 607b str r3, [r7, #4]
  45936. if( xPendedCounts > ( TickType_t ) 0U )
  45937. 8013236: 687b ldr r3, [r7, #4]
  45938. 8013238: 2b00 cmp r3, #0
  45939. 801323a: d010 beq.n 801325e <xTaskResumeAll+0xee>
  45940. {
  45941. do
  45942. {
  45943. if( xTaskIncrementTick() != pdFALSE )
  45944. 801323c: f000 f858 bl 80132f0 <xTaskIncrementTick>
  45945. 8013240: 4603 mov r3, r0
  45946. 8013242: 2b00 cmp r3, #0
  45947. 8013244: d002 beq.n 801324c <xTaskResumeAll+0xdc>
  45948. {
  45949. xYieldPending = pdTRUE;
  45950. 8013246: 4b16 ldr r3, [pc, #88] @ (80132a0 <xTaskResumeAll+0x130>)
  45951. 8013248: 2201 movs r2, #1
  45952. 801324a: 601a str r2, [r3, #0]
  45953. }
  45954. else
  45955. {
  45956. mtCOVERAGE_TEST_MARKER();
  45957. }
  45958. --xPendedCounts;
  45959. 801324c: 687b ldr r3, [r7, #4]
  45960. 801324e: 3b01 subs r3, #1
  45961. 8013250: 607b str r3, [r7, #4]
  45962. } while( xPendedCounts > ( TickType_t ) 0U );
  45963. 8013252: 687b ldr r3, [r7, #4]
  45964. 8013254: 2b00 cmp r3, #0
  45965. 8013256: d1f1 bne.n 801323c <xTaskResumeAll+0xcc>
  45966. xPendedTicks = 0;
  45967. 8013258: 4b12 ldr r3, [pc, #72] @ (80132a4 <xTaskResumeAll+0x134>)
  45968. 801325a: 2200 movs r2, #0
  45969. 801325c: 601a str r2, [r3, #0]
  45970. {
  45971. mtCOVERAGE_TEST_MARKER();
  45972. }
  45973. }
  45974. if( xYieldPending != pdFALSE )
  45975. 801325e: 4b10 ldr r3, [pc, #64] @ (80132a0 <xTaskResumeAll+0x130>)
  45976. 8013260: 681b ldr r3, [r3, #0]
  45977. 8013262: 2b00 cmp r3, #0
  45978. 8013264: d009 beq.n 801327a <xTaskResumeAll+0x10a>
  45979. {
  45980. #if( configUSE_PREEMPTION != 0 )
  45981. {
  45982. xAlreadyYielded = pdTRUE;
  45983. 8013266: 2301 movs r3, #1
  45984. 8013268: 60bb str r3, [r7, #8]
  45985. }
  45986. #endif
  45987. taskYIELD_IF_USING_PREEMPTION();
  45988. 801326a: 4b0f ldr r3, [pc, #60] @ (80132a8 <xTaskResumeAll+0x138>)
  45989. 801326c: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  45990. 8013270: 601a str r2, [r3, #0]
  45991. 8013272: f3bf 8f4f dsb sy
  45992. 8013276: f3bf 8f6f isb sy
  45993. else
  45994. {
  45995. mtCOVERAGE_TEST_MARKER();
  45996. }
  45997. }
  45998. taskEXIT_CRITICAL();
  45999. 801327a: f001 fc87 bl 8014b8c <vPortExitCritical>
  46000. return xAlreadyYielded;
  46001. 801327e: 68bb ldr r3, [r7, #8]
  46002. }
  46003. 8013280: 4618 mov r0, r3
  46004. 8013282: 3710 adds r7, #16
  46005. 8013284: 46bd mov sp, r7
  46006. 8013286: bd80 pop {r7, pc}
  46007. 8013288: 2400418c .word 0x2400418c
  46008. 801328c: 24004164 .word 0x24004164
  46009. 8013290: 24004124 .word 0x24004124
  46010. 8013294: 2400416c .word 0x2400416c
  46011. 8013298: 24003c94 .word 0x24003c94
  46012. 801329c: 24003c90 .word 0x24003c90
  46013. 80132a0: 24004178 .word 0x24004178
  46014. 80132a4: 24004174 .word 0x24004174
  46015. 80132a8: e000ed04 .word 0xe000ed04
  46016. 080132ac <xTaskGetTickCount>:
  46017. /*-----------------------------------------------------------*/
  46018. TickType_t xTaskGetTickCount( void )
  46019. {
  46020. 80132ac: b480 push {r7}
  46021. 80132ae: b083 sub sp, #12
  46022. 80132b0: af00 add r7, sp, #0
  46023. TickType_t xTicks;
  46024. /* Critical section required if running on a 16 bit processor. */
  46025. portTICK_TYPE_ENTER_CRITICAL();
  46026. {
  46027. xTicks = xTickCount;
  46028. 80132b2: 4b05 ldr r3, [pc, #20] @ (80132c8 <xTaskGetTickCount+0x1c>)
  46029. 80132b4: 681b ldr r3, [r3, #0]
  46030. 80132b6: 607b str r3, [r7, #4]
  46031. }
  46032. portTICK_TYPE_EXIT_CRITICAL();
  46033. return xTicks;
  46034. 80132b8: 687b ldr r3, [r7, #4]
  46035. }
  46036. 80132ba: 4618 mov r0, r3
  46037. 80132bc: 370c adds r7, #12
  46038. 80132be: 46bd mov sp, r7
  46039. 80132c0: f85d 7b04 ldr.w r7, [sp], #4
  46040. 80132c4: 4770 bx lr
  46041. 80132c6: bf00 nop
  46042. 80132c8: 24004168 .word 0x24004168
  46043. 080132cc <xTaskGetTickCountFromISR>:
  46044. /*-----------------------------------------------------------*/
  46045. TickType_t xTaskGetTickCountFromISR( void )
  46046. {
  46047. 80132cc: b580 push {r7, lr}
  46048. 80132ce: b082 sub sp, #8
  46049. 80132d0: af00 add r7, sp, #0
  46050. that have been assigned a priority at or (logically) below the maximum
  46051. system call interrupt priority. FreeRTOS maintains a separate interrupt
  46052. safe API to ensure interrupt entry is as fast and as simple as possible.
  46053. More information (albeit Cortex-M specific) is provided on the following
  46054. link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */
  46055. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  46056. 80132d2: f001 fd09 bl 8014ce8 <vPortValidateInterruptPriority>
  46057. uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR();
  46058. 80132d6: 2300 movs r3, #0
  46059. 80132d8: 607b str r3, [r7, #4]
  46060. {
  46061. xReturn = xTickCount;
  46062. 80132da: 4b04 ldr r3, [pc, #16] @ (80132ec <xTaskGetTickCountFromISR+0x20>)
  46063. 80132dc: 681b ldr r3, [r3, #0]
  46064. 80132de: 603b str r3, [r7, #0]
  46065. }
  46066. portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  46067. return xReturn;
  46068. 80132e0: 683b ldr r3, [r7, #0]
  46069. }
  46070. 80132e2: 4618 mov r0, r3
  46071. 80132e4: 3708 adds r7, #8
  46072. 80132e6: 46bd mov sp, r7
  46073. 80132e8: bd80 pop {r7, pc}
  46074. 80132ea: bf00 nop
  46075. 80132ec: 24004168 .word 0x24004168
  46076. 080132f0 <xTaskIncrementTick>:
  46077. #endif /* INCLUDE_xTaskAbortDelay */
  46078. /*----------------------------------------------------------*/
  46079. BaseType_t xTaskIncrementTick( void )
  46080. {
  46081. 80132f0: b580 push {r7, lr}
  46082. 80132f2: b086 sub sp, #24
  46083. 80132f4: af00 add r7, sp, #0
  46084. TCB_t * pxTCB;
  46085. TickType_t xItemValue;
  46086. BaseType_t xSwitchRequired = pdFALSE;
  46087. 80132f6: 2300 movs r3, #0
  46088. 80132f8: 617b str r3, [r7, #20]
  46089. /* Called by the portable layer each time a tick interrupt occurs.
  46090. Increments the tick then checks to see if the new tick value will cause any
  46091. tasks to be unblocked. */
  46092. traceTASK_INCREMENT_TICK( xTickCount );
  46093. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  46094. 80132fa: 4b4f ldr r3, [pc, #316] @ (8013438 <xTaskIncrementTick+0x148>)
  46095. 80132fc: 681b ldr r3, [r3, #0]
  46096. 80132fe: 2b00 cmp r3, #0
  46097. 8013300: f040 8090 bne.w 8013424 <xTaskIncrementTick+0x134>
  46098. {
  46099. /* Minor optimisation. The tick count cannot change in this
  46100. block. */
  46101. const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
  46102. 8013304: 4b4d ldr r3, [pc, #308] @ (801343c <xTaskIncrementTick+0x14c>)
  46103. 8013306: 681b ldr r3, [r3, #0]
  46104. 8013308: 3301 adds r3, #1
  46105. 801330a: 613b str r3, [r7, #16]
  46106. /* Increment the RTOS tick, switching the delayed and overflowed
  46107. delayed lists if it wraps to 0. */
  46108. xTickCount = xConstTickCount;
  46109. 801330c: 4a4b ldr r2, [pc, #300] @ (801343c <xTaskIncrementTick+0x14c>)
  46110. 801330e: 693b ldr r3, [r7, #16]
  46111. 8013310: 6013 str r3, [r2, #0]
  46112. if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. */
  46113. 8013312: 693b ldr r3, [r7, #16]
  46114. 8013314: 2b00 cmp r3, #0
  46115. 8013316: d121 bne.n 801335c <xTaskIncrementTick+0x6c>
  46116. {
  46117. taskSWITCH_DELAYED_LISTS();
  46118. 8013318: 4b49 ldr r3, [pc, #292] @ (8013440 <xTaskIncrementTick+0x150>)
  46119. 801331a: 681b ldr r3, [r3, #0]
  46120. 801331c: 681b ldr r3, [r3, #0]
  46121. 801331e: 2b00 cmp r3, #0
  46122. 8013320: d00b beq.n 801333a <xTaskIncrementTick+0x4a>
  46123. __asm volatile
  46124. 8013322: f04f 0350 mov.w r3, #80 @ 0x50
  46125. 8013326: f383 8811 msr BASEPRI, r3
  46126. 801332a: f3bf 8f6f isb sy
  46127. 801332e: f3bf 8f4f dsb sy
  46128. 8013332: 603b str r3, [r7, #0]
  46129. }
  46130. 8013334: bf00 nop
  46131. 8013336: bf00 nop
  46132. 8013338: e7fd b.n 8013336 <xTaskIncrementTick+0x46>
  46133. 801333a: 4b41 ldr r3, [pc, #260] @ (8013440 <xTaskIncrementTick+0x150>)
  46134. 801333c: 681b ldr r3, [r3, #0]
  46135. 801333e: 60fb str r3, [r7, #12]
  46136. 8013340: 4b40 ldr r3, [pc, #256] @ (8013444 <xTaskIncrementTick+0x154>)
  46137. 8013342: 681b ldr r3, [r3, #0]
  46138. 8013344: 4a3e ldr r2, [pc, #248] @ (8013440 <xTaskIncrementTick+0x150>)
  46139. 8013346: 6013 str r3, [r2, #0]
  46140. 8013348: 4a3e ldr r2, [pc, #248] @ (8013444 <xTaskIncrementTick+0x154>)
  46141. 801334a: 68fb ldr r3, [r7, #12]
  46142. 801334c: 6013 str r3, [r2, #0]
  46143. 801334e: 4b3e ldr r3, [pc, #248] @ (8013448 <xTaskIncrementTick+0x158>)
  46144. 8013350: 681b ldr r3, [r3, #0]
  46145. 8013352: 3301 adds r3, #1
  46146. 8013354: 4a3c ldr r2, [pc, #240] @ (8013448 <xTaskIncrementTick+0x158>)
  46147. 8013356: 6013 str r3, [r2, #0]
  46148. 8013358: f000 fb18 bl 801398c <prvResetNextTaskUnblockTime>
  46149. /* See if this tick has made a timeout expire. Tasks are stored in
  46150. the queue in the order of their wake time - meaning once one task
  46151. has been found whose block time has not expired there is no need to
  46152. look any further down the list. */
  46153. if( xConstTickCount >= xNextTaskUnblockTime )
  46154. 801335c: 4b3b ldr r3, [pc, #236] @ (801344c <xTaskIncrementTick+0x15c>)
  46155. 801335e: 681b ldr r3, [r3, #0]
  46156. 8013360: 693a ldr r2, [r7, #16]
  46157. 8013362: 429a cmp r2, r3
  46158. 8013364: d349 bcc.n 80133fa <xTaskIncrementTick+0x10a>
  46159. {
  46160. for( ;; )
  46161. {
  46162. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  46163. 8013366: 4b36 ldr r3, [pc, #216] @ (8013440 <xTaskIncrementTick+0x150>)
  46164. 8013368: 681b ldr r3, [r3, #0]
  46165. 801336a: 681b ldr r3, [r3, #0]
  46166. 801336c: 2b00 cmp r3, #0
  46167. 801336e: d104 bne.n 801337a <xTaskIncrementTick+0x8a>
  46168. /* The delayed list is empty. Set xNextTaskUnblockTime
  46169. to the maximum possible value so it is extremely
  46170. unlikely that the
  46171. if( xTickCount >= xNextTaskUnblockTime ) test will pass
  46172. next time through. */
  46173. xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  46174. 8013370: 4b36 ldr r3, [pc, #216] @ (801344c <xTaskIncrementTick+0x15c>)
  46175. 8013372: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  46176. 8013376: 601a str r2, [r3, #0]
  46177. break;
  46178. 8013378: e03f b.n 80133fa <xTaskIncrementTick+0x10a>
  46179. {
  46180. /* The delayed list is not empty, get the value of the
  46181. item at the head of the delayed list. This is the time
  46182. at which the task at the head of the delayed list must
  46183. be removed from the Blocked state. */
  46184. pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
  46185. 801337a: 4b31 ldr r3, [pc, #196] @ (8013440 <xTaskIncrementTick+0x150>)
  46186. 801337c: 681b ldr r3, [r3, #0]
  46187. 801337e: 68db ldr r3, [r3, #12]
  46188. 8013380: 68db ldr r3, [r3, #12]
  46189. 8013382: 60bb str r3, [r7, #8]
  46190. xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) );
  46191. 8013384: 68bb ldr r3, [r7, #8]
  46192. 8013386: 685b ldr r3, [r3, #4]
  46193. 8013388: 607b str r3, [r7, #4]
  46194. if( xConstTickCount < xItemValue )
  46195. 801338a: 693a ldr r2, [r7, #16]
  46196. 801338c: 687b ldr r3, [r7, #4]
  46197. 801338e: 429a cmp r2, r3
  46198. 8013390: d203 bcs.n 801339a <xTaskIncrementTick+0xaa>
  46199. /* It is not time to unblock this item yet, but the
  46200. item value is the time at which the task at the head
  46201. of the blocked list must be removed from the Blocked
  46202. state - so record the item value in
  46203. xNextTaskUnblockTime. */
  46204. xNextTaskUnblockTime = xItemValue;
  46205. 8013392: 4a2e ldr r2, [pc, #184] @ (801344c <xTaskIncrementTick+0x15c>)
  46206. 8013394: 687b ldr r3, [r7, #4]
  46207. 8013396: 6013 str r3, [r2, #0]
  46208. break; /*lint !e9011 Code structure here is deedmed easier to understand with multiple breaks. */
  46209. 8013398: e02f b.n 80133fa <xTaskIncrementTick+0x10a>
  46210. {
  46211. mtCOVERAGE_TEST_MARKER();
  46212. }
  46213. /* It is time to remove the item from the Blocked state. */
  46214. ( void ) uxListRemove( &( pxTCB->xStateListItem ) );
  46215. 801339a: 68bb ldr r3, [r7, #8]
  46216. 801339c: 3304 adds r3, #4
  46217. 801339e: 4618 mov r0, r3
  46218. 80133a0: f7fd ff90 bl 80112c4 <uxListRemove>
  46219. /* Is the task waiting on an event also? If so remove
  46220. it from the event list. */
  46221. if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
  46222. 80133a4: 68bb ldr r3, [r7, #8]
  46223. 80133a6: 6a9b ldr r3, [r3, #40] @ 0x28
  46224. 80133a8: 2b00 cmp r3, #0
  46225. 80133aa: d004 beq.n 80133b6 <xTaskIncrementTick+0xc6>
  46226. {
  46227. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  46228. 80133ac: 68bb ldr r3, [r7, #8]
  46229. 80133ae: 3318 adds r3, #24
  46230. 80133b0: 4618 mov r0, r3
  46231. 80133b2: f7fd ff87 bl 80112c4 <uxListRemove>
  46232. mtCOVERAGE_TEST_MARKER();
  46233. }
  46234. /* Place the unblocked task into the appropriate ready
  46235. list. */
  46236. prvAddTaskToReadyList( pxTCB );
  46237. 80133b6: 68bb ldr r3, [r7, #8]
  46238. 80133b8: 6ada ldr r2, [r3, #44] @ 0x2c
  46239. 80133ba: 4b25 ldr r3, [pc, #148] @ (8013450 <xTaskIncrementTick+0x160>)
  46240. 80133bc: 681b ldr r3, [r3, #0]
  46241. 80133be: 429a cmp r2, r3
  46242. 80133c0: d903 bls.n 80133ca <xTaskIncrementTick+0xda>
  46243. 80133c2: 68bb ldr r3, [r7, #8]
  46244. 80133c4: 6adb ldr r3, [r3, #44] @ 0x2c
  46245. 80133c6: 4a22 ldr r2, [pc, #136] @ (8013450 <xTaskIncrementTick+0x160>)
  46246. 80133c8: 6013 str r3, [r2, #0]
  46247. 80133ca: 68bb ldr r3, [r7, #8]
  46248. 80133cc: 6ada ldr r2, [r3, #44] @ 0x2c
  46249. 80133ce: 4613 mov r3, r2
  46250. 80133d0: 009b lsls r3, r3, #2
  46251. 80133d2: 4413 add r3, r2
  46252. 80133d4: 009b lsls r3, r3, #2
  46253. 80133d6: 4a1f ldr r2, [pc, #124] @ (8013454 <xTaskIncrementTick+0x164>)
  46254. 80133d8: 441a add r2, r3
  46255. 80133da: 68bb ldr r3, [r7, #8]
  46256. 80133dc: 3304 adds r3, #4
  46257. 80133de: 4619 mov r1, r3
  46258. 80133e0: 4610 mov r0, r2
  46259. 80133e2: f7fd ff12 bl 801120a <vListInsertEnd>
  46260. {
  46261. /* Preemption is on, but a context switch should
  46262. only be performed if the unblocked task has a
  46263. priority that is equal to or higher than the
  46264. currently executing task. */
  46265. if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
  46266. 80133e6: 68bb ldr r3, [r7, #8]
  46267. 80133e8: 6ada ldr r2, [r3, #44] @ 0x2c
  46268. 80133ea: 4b1b ldr r3, [pc, #108] @ (8013458 <xTaskIncrementTick+0x168>)
  46269. 80133ec: 681b ldr r3, [r3, #0]
  46270. 80133ee: 6adb ldr r3, [r3, #44] @ 0x2c
  46271. 80133f0: 429a cmp r2, r3
  46272. 80133f2: d3b8 bcc.n 8013366 <xTaskIncrementTick+0x76>
  46273. {
  46274. xSwitchRequired = pdTRUE;
  46275. 80133f4: 2301 movs r3, #1
  46276. 80133f6: 617b str r3, [r7, #20]
  46277. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  46278. 80133f8: e7b5 b.n 8013366 <xTaskIncrementTick+0x76>
  46279. /* Tasks of equal priority to the currently running task will share
  46280. processing time (time slice) if preemption is on, and the application
  46281. writer has not explicitly turned time slicing off. */
  46282. #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) )
  46283. {
  46284. if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 )
  46285. 80133fa: 4b17 ldr r3, [pc, #92] @ (8013458 <xTaskIncrementTick+0x168>)
  46286. 80133fc: 681b ldr r3, [r3, #0]
  46287. 80133fe: 6ada ldr r2, [r3, #44] @ 0x2c
  46288. 8013400: 4914 ldr r1, [pc, #80] @ (8013454 <xTaskIncrementTick+0x164>)
  46289. 8013402: 4613 mov r3, r2
  46290. 8013404: 009b lsls r3, r3, #2
  46291. 8013406: 4413 add r3, r2
  46292. 8013408: 009b lsls r3, r3, #2
  46293. 801340a: 440b add r3, r1
  46294. 801340c: 681b ldr r3, [r3, #0]
  46295. 801340e: 2b01 cmp r3, #1
  46296. 8013410: d901 bls.n 8013416 <xTaskIncrementTick+0x126>
  46297. {
  46298. xSwitchRequired = pdTRUE;
  46299. 8013412: 2301 movs r3, #1
  46300. 8013414: 617b str r3, [r7, #20]
  46301. }
  46302. #endif /* configUSE_TICK_HOOK */
  46303. #if ( configUSE_PREEMPTION == 1 )
  46304. {
  46305. if( xYieldPending != pdFALSE )
  46306. 8013416: 4b11 ldr r3, [pc, #68] @ (801345c <xTaskIncrementTick+0x16c>)
  46307. 8013418: 681b ldr r3, [r3, #0]
  46308. 801341a: 2b00 cmp r3, #0
  46309. 801341c: d007 beq.n 801342e <xTaskIncrementTick+0x13e>
  46310. {
  46311. xSwitchRequired = pdTRUE;
  46312. 801341e: 2301 movs r3, #1
  46313. 8013420: 617b str r3, [r7, #20]
  46314. 8013422: e004 b.n 801342e <xTaskIncrementTick+0x13e>
  46315. }
  46316. #endif /* configUSE_PREEMPTION */
  46317. }
  46318. else
  46319. {
  46320. ++xPendedTicks;
  46321. 8013424: 4b0e ldr r3, [pc, #56] @ (8013460 <xTaskIncrementTick+0x170>)
  46322. 8013426: 681b ldr r3, [r3, #0]
  46323. 8013428: 3301 adds r3, #1
  46324. 801342a: 4a0d ldr r2, [pc, #52] @ (8013460 <xTaskIncrementTick+0x170>)
  46325. 801342c: 6013 str r3, [r2, #0]
  46326. vApplicationTickHook();
  46327. }
  46328. #endif
  46329. }
  46330. return xSwitchRequired;
  46331. 801342e: 697b ldr r3, [r7, #20]
  46332. }
  46333. 8013430: 4618 mov r0, r3
  46334. 8013432: 3718 adds r7, #24
  46335. 8013434: 46bd mov sp, r7
  46336. 8013436: bd80 pop {r7, pc}
  46337. 8013438: 2400418c .word 0x2400418c
  46338. 801343c: 24004168 .word 0x24004168
  46339. 8013440: 2400411c .word 0x2400411c
  46340. 8013444: 24004120 .word 0x24004120
  46341. 8013448: 2400417c .word 0x2400417c
  46342. 801344c: 24004184 .word 0x24004184
  46343. 8013450: 2400416c .word 0x2400416c
  46344. 8013454: 24003c94 .word 0x24003c94
  46345. 8013458: 24003c90 .word 0x24003c90
  46346. 801345c: 24004178 .word 0x24004178
  46347. 8013460: 24004174 .word 0x24004174
  46348. 08013464 <vTaskSwitchContext>:
  46349. #endif /* configUSE_APPLICATION_TASK_TAG */
  46350. /*-----------------------------------------------------------*/
  46351. void vTaskSwitchContext( void )
  46352. {
  46353. 8013464: b580 push {r7, lr}
  46354. 8013466: b084 sub sp, #16
  46355. 8013468: af00 add r7, sp, #0
  46356. if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE )
  46357. 801346a: 4b32 ldr r3, [pc, #200] @ (8013534 <vTaskSwitchContext+0xd0>)
  46358. 801346c: 681b ldr r3, [r3, #0]
  46359. 801346e: 2b00 cmp r3, #0
  46360. 8013470: d003 beq.n 801347a <vTaskSwitchContext+0x16>
  46361. {
  46362. /* The scheduler is currently suspended - do not allow a context
  46363. switch. */
  46364. xYieldPending = pdTRUE;
  46365. 8013472: 4b31 ldr r3, [pc, #196] @ (8013538 <vTaskSwitchContext+0xd4>)
  46366. 8013474: 2201 movs r2, #1
  46367. 8013476: 601a str r2, [r3, #0]
  46368. for additional information. */
  46369. _impure_ptr = &( pxCurrentTCB->xNewLib_reent );
  46370. }
  46371. #endif /* configUSE_NEWLIB_REENTRANT */
  46372. }
  46373. }
  46374. 8013478: e058 b.n 801352c <vTaskSwitchContext+0xc8>
  46375. xYieldPending = pdFALSE;
  46376. 801347a: 4b2f ldr r3, [pc, #188] @ (8013538 <vTaskSwitchContext+0xd4>)
  46377. 801347c: 2200 movs r2, #0
  46378. 801347e: 601a str r2, [r3, #0]
  46379. taskCHECK_FOR_STACK_OVERFLOW();
  46380. 8013480: 4b2e ldr r3, [pc, #184] @ (801353c <vTaskSwitchContext+0xd8>)
  46381. 8013482: 681b ldr r3, [r3, #0]
  46382. 8013484: 681a ldr r2, [r3, #0]
  46383. 8013486: 4b2d ldr r3, [pc, #180] @ (801353c <vTaskSwitchContext+0xd8>)
  46384. 8013488: 681b ldr r3, [r3, #0]
  46385. 801348a: 6b1b ldr r3, [r3, #48] @ 0x30
  46386. 801348c: 429a cmp r2, r3
  46387. 801348e: d808 bhi.n 80134a2 <vTaskSwitchContext+0x3e>
  46388. 8013490: 4b2a ldr r3, [pc, #168] @ (801353c <vTaskSwitchContext+0xd8>)
  46389. 8013492: 681a ldr r2, [r3, #0]
  46390. 8013494: 4b29 ldr r3, [pc, #164] @ (801353c <vTaskSwitchContext+0xd8>)
  46391. 8013496: 681b ldr r3, [r3, #0]
  46392. 8013498: 3334 adds r3, #52 @ 0x34
  46393. 801349a: 4619 mov r1, r3
  46394. 801349c: 4610 mov r0, r2
  46395. 801349e: f7ee fc00 bl 8001ca2 <vApplicationStackOverflowHook>
  46396. taskSELECT_HIGHEST_PRIORITY_TASK(); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
  46397. 80134a2: 4b27 ldr r3, [pc, #156] @ (8013540 <vTaskSwitchContext+0xdc>)
  46398. 80134a4: 681b ldr r3, [r3, #0]
  46399. 80134a6: 60fb str r3, [r7, #12]
  46400. 80134a8: e011 b.n 80134ce <vTaskSwitchContext+0x6a>
  46401. 80134aa: 68fb ldr r3, [r7, #12]
  46402. 80134ac: 2b00 cmp r3, #0
  46403. 80134ae: d10b bne.n 80134c8 <vTaskSwitchContext+0x64>
  46404. __asm volatile
  46405. 80134b0: f04f 0350 mov.w r3, #80 @ 0x50
  46406. 80134b4: f383 8811 msr BASEPRI, r3
  46407. 80134b8: f3bf 8f6f isb sy
  46408. 80134bc: f3bf 8f4f dsb sy
  46409. 80134c0: 607b str r3, [r7, #4]
  46410. }
  46411. 80134c2: bf00 nop
  46412. 80134c4: bf00 nop
  46413. 80134c6: e7fd b.n 80134c4 <vTaskSwitchContext+0x60>
  46414. 80134c8: 68fb ldr r3, [r7, #12]
  46415. 80134ca: 3b01 subs r3, #1
  46416. 80134cc: 60fb str r3, [r7, #12]
  46417. 80134ce: 491d ldr r1, [pc, #116] @ (8013544 <vTaskSwitchContext+0xe0>)
  46418. 80134d0: 68fa ldr r2, [r7, #12]
  46419. 80134d2: 4613 mov r3, r2
  46420. 80134d4: 009b lsls r3, r3, #2
  46421. 80134d6: 4413 add r3, r2
  46422. 80134d8: 009b lsls r3, r3, #2
  46423. 80134da: 440b add r3, r1
  46424. 80134dc: 681b ldr r3, [r3, #0]
  46425. 80134de: 2b00 cmp r3, #0
  46426. 80134e0: d0e3 beq.n 80134aa <vTaskSwitchContext+0x46>
  46427. 80134e2: 68fa ldr r2, [r7, #12]
  46428. 80134e4: 4613 mov r3, r2
  46429. 80134e6: 009b lsls r3, r3, #2
  46430. 80134e8: 4413 add r3, r2
  46431. 80134ea: 009b lsls r3, r3, #2
  46432. 80134ec: 4a15 ldr r2, [pc, #84] @ (8013544 <vTaskSwitchContext+0xe0>)
  46433. 80134ee: 4413 add r3, r2
  46434. 80134f0: 60bb str r3, [r7, #8]
  46435. 80134f2: 68bb ldr r3, [r7, #8]
  46436. 80134f4: 685b ldr r3, [r3, #4]
  46437. 80134f6: 685a ldr r2, [r3, #4]
  46438. 80134f8: 68bb ldr r3, [r7, #8]
  46439. 80134fa: 605a str r2, [r3, #4]
  46440. 80134fc: 68bb ldr r3, [r7, #8]
  46441. 80134fe: 685a ldr r2, [r3, #4]
  46442. 8013500: 68bb ldr r3, [r7, #8]
  46443. 8013502: 3308 adds r3, #8
  46444. 8013504: 429a cmp r2, r3
  46445. 8013506: d104 bne.n 8013512 <vTaskSwitchContext+0xae>
  46446. 8013508: 68bb ldr r3, [r7, #8]
  46447. 801350a: 685b ldr r3, [r3, #4]
  46448. 801350c: 685a ldr r2, [r3, #4]
  46449. 801350e: 68bb ldr r3, [r7, #8]
  46450. 8013510: 605a str r2, [r3, #4]
  46451. 8013512: 68bb ldr r3, [r7, #8]
  46452. 8013514: 685b ldr r3, [r3, #4]
  46453. 8013516: 68db ldr r3, [r3, #12]
  46454. 8013518: 4a08 ldr r2, [pc, #32] @ (801353c <vTaskSwitchContext+0xd8>)
  46455. 801351a: 6013 str r3, [r2, #0]
  46456. 801351c: 4a08 ldr r2, [pc, #32] @ (8013540 <vTaskSwitchContext+0xdc>)
  46457. 801351e: 68fb ldr r3, [r7, #12]
  46458. 8013520: 6013 str r3, [r2, #0]
  46459. _impure_ptr = &( pxCurrentTCB->xNewLib_reent );
  46460. 8013522: 4b06 ldr r3, [pc, #24] @ (801353c <vTaskSwitchContext+0xd8>)
  46461. 8013524: 681b ldr r3, [r3, #0]
  46462. 8013526: 3354 adds r3, #84 @ 0x54
  46463. 8013528: 4a07 ldr r2, [pc, #28] @ (8013548 <vTaskSwitchContext+0xe4>)
  46464. 801352a: 6013 str r3, [r2, #0]
  46465. }
  46466. 801352c: bf00 nop
  46467. 801352e: 3710 adds r7, #16
  46468. 8013530: 46bd mov sp, r7
  46469. 8013532: bd80 pop {r7, pc}
  46470. 8013534: 2400418c .word 0x2400418c
  46471. 8013538: 24004178 .word 0x24004178
  46472. 801353c: 24003c90 .word 0x24003c90
  46473. 8013540: 2400416c .word 0x2400416c
  46474. 8013544: 24003c94 .word 0x24003c94
  46475. 8013548: 240001d4 .word 0x240001d4
  46476. 0801354c <vTaskPlaceOnEventList>:
  46477. /*-----------------------------------------------------------*/
  46478. void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait )
  46479. {
  46480. 801354c: b580 push {r7, lr}
  46481. 801354e: b084 sub sp, #16
  46482. 8013550: af00 add r7, sp, #0
  46483. 8013552: 6078 str r0, [r7, #4]
  46484. 8013554: 6039 str r1, [r7, #0]
  46485. configASSERT( pxEventList );
  46486. 8013556: 687b ldr r3, [r7, #4]
  46487. 8013558: 2b00 cmp r3, #0
  46488. 801355a: d10b bne.n 8013574 <vTaskPlaceOnEventList+0x28>
  46489. __asm volatile
  46490. 801355c: f04f 0350 mov.w r3, #80 @ 0x50
  46491. 8013560: f383 8811 msr BASEPRI, r3
  46492. 8013564: f3bf 8f6f isb sy
  46493. 8013568: f3bf 8f4f dsb sy
  46494. 801356c: 60fb str r3, [r7, #12]
  46495. }
  46496. 801356e: bf00 nop
  46497. 8013570: bf00 nop
  46498. 8013572: e7fd b.n 8013570 <vTaskPlaceOnEventList+0x24>
  46499. /* Place the event list item of the TCB in the appropriate event list.
  46500. This is placed in the list in priority order so the highest priority task
  46501. is the first to be woken by the event. The queue that contains the event
  46502. list is locked, preventing simultaneous access from interrupts. */
  46503. vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) );
  46504. 8013574: 4b07 ldr r3, [pc, #28] @ (8013594 <vTaskPlaceOnEventList+0x48>)
  46505. 8013576: 681b ldr r3, [r3, #0]
  46506. 8013578: 3318 adds r3, #24
  46507. 801357a: 4619 mov r1, r3
  46508. 801357c: 6878 ldr r0, [r7, #4]
  46509. 801357e: f7fd fe68 bl 8011252 <vListInsert>
  46510. prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );
  46511. 8013582: 2101 movs r1, #1
  46512. 8013584: 6838 ldr r0, [r7, #0]
  46513. 8013586: f000 fded bl 8014164 <prvAddCurrentTaskToDelayedList>
  46514. }
  46515. 801358a: bf00 nop
  46516. 801358c: 3710 adds r7, #16
  46517. 801358e: 46bd mov sp, r7
  46518. 8013590: bd80 pop {r7, pc}
  46519. 8013592: bf00 nop
  46520. 8013594: 24003c90 .word 0x24003c90
  46521. 08013598 <vTaskPlaceOnEventListRestricted>:
  46522. /*-----------------------------------------------------------*/
  46523. #if( configUSE_TIMERS == 1 )
  46524. void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely )
  46525. {
  46526. 8013598: b580 push {r7, lr}
  46527. 801359a: b086 sub sp, #24
  46528. 801359c: af00 add r7, sp, #0
  46529. 801359e: 60f8 str r0, [r7, #12]
  46530. 80135a0: 60b9 str r1, [r7, #8]
  46531. 80135a2: 607a str r2, [r7, #4]
  46532. configASSERT( pxEventList );
  46533. 80135a4: 68fb ldr r3, [r7, #12]
  46534. 80135a6: 2b00 cmp r3, #0
  46535. 80135a8: d10b bne.n 80135c2 <vTaskPlaceOnEventListRestricted+0x2a>
  46536. __asm volatile
  46537. 80135aa: f04f 0350 mov.w r3, #80 @ 0x50
  46538. 80135ae: f383 8811 msr BASEPRI, r3
  46539. 80135b2: f3bf 8f6f isb sy
  46540. 80135b6: f3bf 8f4f dsb sy
  46541. 80135ba: 617b str r3, [r7, #20]
  46542. }
  46543. 80135bc: bf00 nop
  46544. 80135be: bf00 nop
  46545. 80135c0: e7fd b.n 80135be <vTaskPlaceOnEventListRestricted+0x26>
  46546. /* Place the event list item of the TCB in the appropriate event list.
  46547. In this case it is assume that this is the only task that is going to
  46548. be waiting on this event list, so the faster vListInsertEnd() function
  46549. can be used in place of vListInsert. */
  46550. vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) );
  46551. 80135c2: 4b0a ldr r3, [pc, #40] @ (80135ec <vTaskPlaceOnEventListRestricted+0x54>)
  46552. 80135c4: 681b ldr r3, [r3, #0]
  46553. 80135c6: 3318 adds r3, #24
  46554. 80135c8: 4619 mov r1, r3
  46555. 80135ca: 68f8 ldr r0, [r7, #12]
  46556. 80135cc: f7fd fe1d bl 801120a <vListInsertEnd>
  46557. /* If the task should block indefinitely then set the block time to a
  46558. value that will be recognised as an indefinite delay inside the
  46559. prvAddCurrentTaskToDelayedList() function. */
  46560. if( xWaitIndefinitely != pdFALSE )
  46561. 80135d0: 687b ldr r3, [r7, #4]
  46562. 80135d2: 2b00 cmp r3, #0
  46563. 80135d4: d002 beq.n 80135dc <vTaskPlaceOnEventListRestricted+0x44>
  46564. {
  46565. xTicksToWait = portMAX_DELAY;
  46566. 80135d6: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  46567. 80135da: 60bb str r3, [r7, #8]
  46568. }
  46569. traceTASK_DELAY_UNTIL( ( xTickCount + xTicksToWait ) );
  46570. prvAddCurrentTaskToDelayedList( xTicksToWait, xWaitIndefinitely );
  46571. 80135dc: 6879 ldr r1, [r7, #4]
  46572. 80135de: 68b8 ldr r0, [r7, #8]
  46573. 80135e0: f000 fdc0 bl 8014164 <prvAddCurrentTaskToDelayedList>
  46574. }
  46575. 80135e4: bf00 nop
  46576. 80135e6: 3718 adds r7, #24
  46577. 80135e8: 46bd mov sp, r7
  46578. 80135ea: bd80 pop {r7, pc}
  46579. 80135ec: 24003c90 .word 0x24003c90
  46580. 080135f0 <xTaskRemoveFromEventList>:
  46581. #endif /* configUSE_TIMERS */
  46582. /*-----------------------------------------------------------*/
  46583. BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList )
  46584. {
  46585. 80135f0: b580 push {r7, lr}
  46586. 80135f2: b086 sub sp, #24
  46587. 80135f4: af00 add r7, sp, #0
  46588. 80135f6: 6078 str r0, [r7, #4]
  46589. get called - the lock count on the queue will get modified instead. This
  46590. means exclusive access to the event list is guaranteed here.
  46591. This function assumes that a check has already been made to ensure that
  46592. pxEventList is not empty. */
  46593. pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
  46594. 80135f8: 687b ldr r3, [r7, #4]
  46595. 80135fa: 68db ldr r3, [r3, #12]
  46596. 80135fc: 68db ldr r3, [r3, #12]
  46597. 80135fe: 613b str r3, [r7, #16]
  46598. configASSERT( pxUnblockedTCB );
  46599. 8013600: 693b ldr r3, [r7, #16]
  46600. 8013602: 2b00 cmp r3, #0
  46601. 8013604: d10b bne.n 801361e <xTaskRemoveFromEventList+0x2e>
  46602. __asm volatile
  46603. 8013606: f04f 0350 mov.w r3, #80 @ 0x50
  46604. 801360a: f383 8811 msr BASEPRI, r3
  46605. 801360e: f3bf 8f6f isb sy
  46606. 8013612: f3bf 8f4f dsb sy
  46607. 8013616: 60fb str r3, [r7, #12]
  46608. }
  46609. 8013618: bf00 nop
  46610. 801361a: bf00 nop
  46611. 801361c: e7fd b.n 801361a <xTaskRemoveFromEventList+0x2a>
  46612. ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) );
  46613. 801361e: 693b ldr r3, [r7, #16]
  46614. 8013620: 3318 adds r3, #24
  46615. 8013622: 4618 mov r0, r3
  46616. 8013624: f7fd fe4e bl 80112c4 <uxListRemove>
  46617. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  46618. 8013628: 4b1d ldr r3, [pc, #116] @ (80136a0 <xTaskRemoveFromEventList+0xb0>)
  46619. 801362a: 681b ldr r3, [r3, #0]
  46620. 801362c: 2b00 cmp r3, #0
  46621. 801362e: d11d bne.n 801366c <xTaskRemoveFromEventList+0x7c>
  46622. {
  46623. ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) );
  46624. 8013630: 693b ldr r3, [r7, #16]
  46625. 8013632: 3304 adds r3, #4
  46626. 8013634: 4618 mov r0, r3
  46627. 8013636: f7fd fe45 bl 80112c4 <uxListRemove>
  46628. prvAddTaskToReadyList( pxUnblockedTCB );
  46629. 801363a: 693b ldr r3, [r7, #16]
  46630. 801363c: 6ada ldr r2, [r3, #44] @ 0x2c
  46631. 801363e: 4b19 ldr r3, [pc, #100] @ (80136a4 <xTaskRemoveFromEventList+0xb4>)
  46632. 8013640: 681b ldr r3, [r3, #0]
  46633. 8013642: 429a cmp r2, r3
  46634. 8013644: d903 bls.n 801364e <xTaskRemoveFromEventList+0x5e>
  46635. 8013646: 693b ldr r3, [r7, #16]
  46636. 8013648: 6adb ldr r3, [r3, #44] @ 0x2c
  46637. 801364a: 4a16 ldr r2, [pc, #88] @ (80136a4 <xTaskRemoveFromEventList+0xb4>)
  46638. 801364c: 6013 str r3, [r2, #0]
  46639. 801364e: 693b ldr r3, [r7, #16]
  46640. 8013650: 6ada ldr r2, [r3, #44] @ 0x2c
  46641. 8013652: 4613 mov r3, r2
  46642. 8013654: 009b lsls r3, r3, #2
  46643. 8013656: 4413 add r3, r2
  46644. 8013658: 009b lsls r3, r3, #2
  46645. 801365a: 4a13 ldr r2, [pc, #76] @ (80136a8 <xTaskRemoveFromEventList+0xb8>)
  46646. 801365c: 441a add r2, r3
  46647. 801365e: 693b ldr r3, [r7, #16]
  46648. 8013660: 3304 adds r3, #4
  46649. 8013662: 4619 mov r1, r3
  46650. 8013664: 4610 mov r0, r2
  46651. 8013666: f7fd fdd0 bl 801120a <vListInsertEnd>
  46652. 801366a: e005 b.n 8013678 <xTaskRemoveFromEventList+0x88>
  46653. }
  46654. else
  46655. {
  46656. /* The delayed and ready lists cannot be accessed, so hold this task
  46657. pending until the scheduler is resumed. */
  46658. vListInsertEnd( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) );
  46659. 801366c: 693b ldr r3, [r7, #16]
  46660. 801366e: 3318 adds r3, #24
  46661. 8013670: 4619 mov r1, r3
  46662. 8013672: 480e ldr r0, [pc, #56] @ (80136ac <xTaskRemoveFromEventList+0xbc>)
  46663. 8013674: f7fd fdc9 bl 801120a <vListInsertEnd>
  46664. }
  46665. if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority )
  46666. 8013678: 693b ldr r3, [r7, #16]
  46667. 801367a: 6ada ldr r2, [r3, #44] @ 0x2c
  46668. 801367c: 4b0c ldr r3, [pc, #48] @ (80136b0 <xTaskRemoveFromEventList+0xc0>)
  46669. 801367e: 681b ldr r3, [r3, #0]
  46670. 8013680: 6adb ldr r3, [r3, #44] @ 0x2c
  46671. 8013682: 429a cmp r2, r3
  46672. 8013684: d905 bls.n 8013692 <xTaskRemoveFromEventList+0xa2>
  46673. {
  46674. /* Return true if the task removed from the event list has a higher
  46675. priority than the calling task. This allows the calling task to know if
  46676. it should force a context switch now. */
  46677. xReturn = pdTRUE;
  46678. 8013686: 2301 movs r3, #1
  46679. 8013688: 617b str r3, [r7, #20]
  46680. /* Mark that a yield is pending in case the user is not using the
  46681. "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */
  46682. xYieldPending = pdTRUE;
  46683. 801368a: 4b0a ldr r3, [pc, #40] @ (80136b4 <xTaskRemoveFromEventList+0xc4>)
  46684. 801368c: 2201 movs r2, #1
  46685. 801368e: 601a str r2, [r3, #0]
  46686. 8013690: e001 b.n 8013696 <xTaskRemoveFromEventList+0xa6>
  46687. }
  46688. else
  46689. {
  46690. xReturn = pdFALSE;
  46691. 8013692: 2300 movs r3, #0
  46692. 8013694: 617b str r3, [r7, #20]
  46693. }
  46694. return xReturn;
  46695. 8013696: 697b ldr r3, [r7, #20]
  46696. }
  46697. 8013698: 4618 mov r0, r3
  46698. 801369a: 3718 adds r7, #24
  46699. 801369c: 46bd mov sp, r7
  46700. 801369e: bd80 pop {r7, pc}
  46701. 80136a0: 2400418c .word 0x2400418c
  46702. 80136a4: 2400416c .word 0x2400416c
  46703. 80136a8: 24003c94 .word 0x24003c94
  46704. 80136ac: 24004124 .word 0x24004124
  46705. 80136b0: 24003c90 .word 0x24003c90
  46706. 80136b4: 24004178 .word 0x24004178
  46707. 080136b8 <vTaskSetTimeOutState>:
  46708. }
  46709. }
  46710. /*-----------------------------------------------------------*/
  46711. void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )
  46712. {
  46713. 80136b8: b580 push {r7, lr}
  46714. 80136ba: b084 sub sp, #16
  46715. 80136bc: af00 add r7, sp, #0
  46716. 80136be: 6078 str r0, [r7, #4]
  46717. configASSERT( pxTimeOut );
  46718. 80136c0: 687b ldr r3, [r7, #4]
  46719. 80136c2: 2b00 cmp r3, #0
  46720. 80136c4: d10b bne.n 80136de <vTaskSetTimeOutState+0x26>
  46721. __asm volatile
  46722. 80136c6: f04f 0350 mov.w r3, #80 @ 0x50
  46723. 80136ca: f383 8811 msr BASEPRI, r3
  46724. 80136ce: f3bf 8f6f isb sy
  46725. 80136d2: f3bf 8f4f dsb sy
  46726. 80136d6: 60fb str r3, [r7, #12]
  46727. }
  46728. 80136d8: bf00 nop
  46729. 80136da: bf00 nop
  46730. 80136dc: e7fd b.n 80136da <vTaskSetTimeOutState+0x22>
  46731. taskENTER_CRITICAL();
  46732. 80136de: f001 fa23 bl 8014b28 <vPortEnterCritical>
  46733. {
  46734. pxTimeOut->xOverflowCount = xNumOfOverflows;
  46735. 80136e2: 4b07 ldr r3, [pc, #28] @ (8013700 <vTaskSetTimeOutState+0x48>)
  46736. 80136e4: 681a ldr r2, [r3, #0]
  46737. 80136e6: 687b ldr r3, [r7, #4]
  46738. 80136e8: 601a str r2, [r3, #0]
  46739. pxTimeOut->xTimeOnEntering = xTickCount;
  46740. 80136ea: 4b06 ldr r3, [pc, #24] @ (8013704 <vTaskSetTimeOutState+0x4c>)
  46741. 80136ec: 681a ldr r2, [r3, #0]
  46742. 80136ee: 687b ldr r3, [r7, #4]
  46743. 80136f0: 605a str r2, [r3, #4]
  46744. }
  46745. taskEXIT_CRITICAL();
  46746. 80136f2: f001 fa4b bl 8014b8c <vPortExitCritical>
  46747. }
  46748. 80136f6: bf00 nop
  46749. 80136f8: 3710 adds r7, #16
  46750. 80136fa: 46bd mov sp, r7
  46751. 80136fc: bd80 pop {r7, pc}
  46752. 80136fe: bf00 nop
  46753. 8013700: 2400417c .word 0x2400417c
  46754. 8013704: 24004168 .word 0x24004168
  46755. 08013708 <vTaskInternalSetTimeOutState>:
  46756. /*-----------------------------------------------------------*/
  46757. void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut )
  46758. {
  46759. 8013708: b480 push {r7}
  46760. 801370a: b083 sub sp, #12
  46761. 801370c: af00 add r7, sp, #0
  46762. 801370e: 6078 str r0, [r7, #4]
  46763. /* For internal use only as it does not use a critical section. */
  46764. pxTimeOut->xOverflowCount = xNumOfOverflows;
  46765. 8013710: 4b06 ldr r3, [pc, #24] @ (801372c <vTaskInternalSetTimeOutState+0x24>)
  46766. 8013712: 681a ldr r2, [r3, #0]
  46767. 8013714: 687b ldr r3, [r7, #4]
  46768. 8013716: 601a str r2, [r3, #0]
  46769. pxTimeOut->xTimeOnEntering = xTickCount;
  46770. 8013718: 4b05 ldr r3, [pc, #20] @ (8013730 <vTaskInternalSetTimeOutState+0x28>)
  46771. 801371a: 681a ldr r2, [r3, #0]
  46772. 801371c: 687b ldr r3, [r7, #4]
  46773. 801371e: 605a str r2, [r3, #4]
  46774. }
  46775. 8013720: bf00 nop
  46776. 8013722: 370c adds r7, #12
  46777. 8013724: 46bd mov sp, r7
  46778. 8013726: f85d 7b04 ldr.w r7, [sp], #4
  46779. 801372a: 4770 bx lr
  46780. 801372c: 2400417c .word 0x2400417c
  46781. 8013730: 24004168 .word 0x24004168
  46782. 08013734 <xTaskCheckForTimeOut>:
  46783. /*-----------------------------------------------------------*/
  46784. BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait )
  46785. {
  46786. 8013734: b580 push {r7, lr}
  46787. 8013736: b088 sub sp, #32
  46788. 8013738: af00 add r7, sp, #0
  46789. 801373a: 6078 str r0, [r7, #4]
  46790. 801373c: 6039 str r1, [r7, #0]
  46791. BaseType_t xReturn;
  46792. configASSERT( pxTimeOut );
  46793. 801373e: 687b ldr r3, [r7, #4]
  46794. 8013740: 2b00 cmp r3, #0
  46795. 8013742: d10b bne.n 801375c <xTaskCheckForTimeOut+0x28>
  46796. __asm volatile
  46797. 8013744: f04f 0350 mov.w r3, #80 @ 0x50
  46798. 8013748: f383 8811 msr BASEPRI, r3
  46799. 801374c: f3bf 8f6f isb sy
  46800. 8013750: f3bf 8f4f dsb sy
  46801. 8013754: 613b str r3, [r7, #16]
  46802. }
  46803. 8013756: bf00 nop
  46804. 8013758: bf00 nop
  46805. 801375a: e7fd b.n 8013758 <xTaskCheckForTimeOut+0x24>
  46806. configASSERT( pxTicksToWait );
  46807. 801375c: 683b ldr r3, [r7, #0]
  46808. 801375e: 2b00 cmp r3, #0
  46809. 8013760: d10b bne.n 801377a <xTaskCheckForTimeOut+0x46>
  46810. __asm volatile
  46811. 8013762: f04f 0350 mov.w r3, #80 @ 0x50
  46812. 8013766: f383 8811 msr BASEPRI, r3
  46813. 801376a: f3bf 8f6f isb sy
  46814. 801376e: f3bf 8f4f dsb sy
  46815. 8013772: 60fb str r3, [r7, #12]
  46816. }
  46817. 8013774: bf00 nop
  46818. 8013776: bf00 nop
  46819. 8013778: e7fd b.n 8013776 <xTaskCheckForTimeOut+0x42>
  46820. taskENTER_CRITICAL();
  46821. 801377a: f001 f9d5 bl 8014b28 <vPortEnterCritical>
  46822. {
  46823. /* Minor optimisation. The tick count cannot change in this block. */
  46824. const TickType_t xConstTickCount = xTickCount;
  46825. 801377e: 4b1d ldr r3, [pc, #116] @ (80137f4 <xTaskCheckForTimeOut+0xc0>)
  46826. 8013780: 681b ldr r3, [r3, #0]
  46827. 8013782: 61bb str r3, [r7, #24]
  46828. const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering;
  46829. 8013784: 687b ldr r3, [r7, #4]
  46830. 8013786: 685b ldr r3, [r3, #4]
  46831. 8013788: 69ba ldr r2, [r7, #24]
  46832. 801378a: 1ad3 subs r3, r2, r3
  46833. 801378c: 617b str r3, [r7, #20]
  46834. }
  46835. else
  46836. #endif
  46837. #if ( INCLUDE_vTaskSuspend == 1 )
  46838. if( *pxTicksToWait == portMAX_DELAY )
  46839. 801378e: 683b ldr r3, [r7, #0]
  46840. 8013790: 681b ldr r3, [r3, #0]
  46841. 8013792: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  46842. 8013796: d102 bne.n 801379e <xTaskCheckForTimeOut+0x6a>
  46843. {
  46844. /* If INCLUDE_vTaskSuspend is set to 1 and the block time
  46845. specified is the maximum block time then the task should block
  46846. indefinitely, and therefore never time out. */
  46847. xReturn = pdFALSE;
  46848. 8013798: 2300 movs r3, #0
  46849. 801379a: 61fb str r3, [r7, #28]
  46850. 801379c: e023 b.n 80137e6 <xTaskCheckForTimeOut+0xb2>
  46851. }
  46852. else
  46853. #endif
  46854. if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */
  46855. 801379e: 687b ldr r3, [r7, #4]
  46856. 80137a0: 681a ldr r2, [r3, #0]
  46857. 80137a2: 4b15 ldr r3, [pc, #84] @ (80137f8 <xTaskCheckForTimeOut+0xc4>)
  46858. 80137a4: 681b ldr r3, [r3, #0]
  46859. 80137a6: 429a cmp r2, r3
  46860. 80137a8: d007 beq.n 80137ba <xTaskCheckForTimeOut+0x86>
  46861. 80137aa: 687b ldr r3, [r7, #4]
  46862. 80137ac: 685b ldr r3, [r3, #4]
  46863. 80137ae: 69ba ldr r2, [r7, #24]
  46864. 80137b0: 429a cmp r2, r3
  46865. 80137b2: d302 bcc.n 80137ba <xTaskCheckForTimeOut+0x86>
  46866. /* The tick count is greater than the time at which
  46867. vTaskSetTimeout() was called, but has also overflowed since
  46868. vTaskSetTimeOut() was called. It must have wrapped all the way
  46869. around and gone past again. This passed since vTaskSetTimeout()
  46870. was called. */
  46871. xReturn = pdTRUE;
  46872. 80137b4: 2301 movs r3, #1
  46873. 80137b6: 61fb str r3, [r7, #28]
  46874. 80137b8: e015 b.n 80137e6 <xTaskCheckForTimeOut+0xb2>
  46875. }
  46876. else if( xElapsedTime < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */
  46877. 80137ba: 683b ldr r3, [r7, #0]
  46878. 80137bc: 681b ldr r3, [r3, #0]
  46879. 80137be: 697a ldr r2, [r7, #20]
  46880. 80137c0: 429a cmp r2, r3
  46881. 80137c2: d20b bcs.n 80137dc <xTaskCheckForTimeOut+0xa8>
  46882. {
  46883. /* Not a genuine timeout. Adjust parameters for time remaining. */
  46884. *pxTicksToWait -= xElapsedTime;
  46885. 80137c4: 683b ldr r3, [r7, #0]
  46886. 80137c6: 681a ldr r2, [r3, #0]
  46887. 80137c8: 697b ldr r3, [r7, #20]
  46888. 80137ca: 1ad2 subs r2, r2, r3
  46889. 80137cc: 683b ldr r3, [r7, #0]
  46890. 80137ce: 601a str r2, [r3, #0]
  46891. vTaskInternalSetTimeOutState( pxTimeOut );
  46892. 80137d0: 6878 ldr r0, [r7, #4]
  46893. 80137d2: f7ff ff99 bl 8013708 <vTaskInternalSetTimeOutState>
  46894. xReturn = pdFALSE;
  46895. 80137d6: 2300 movs r3, #0
  46896. 80137d8: 61fb str r3, [r7, #28]
  46897. 80137da: e004 b.n 80137e6 <xTaskCheckForTimeOut+0xb2>
  46898. }
  46899. else
  46900. {
  46901. *pxTicksToWait = 0;
  46902. 80137dc: 683b ldr r3, [r7, #0]
  46903. 80137de: 2200 movs r2, #0
  46904. 80137e0: 601a str r2, [r3, #0]
  46905. xReturn = pdTRUE;
  46906. 80137e2: 2301 movs r3, #1
  46907. 80137e4: 61fb str r3, [r7, #28]
  46908. }
  46909. }
  46910. taskEXIT_CRITICAL();
  46911. 80137e6: f001 f9d1 bl 8014b8c <vPortExitCritical>
  46912. return xReturn;
  46913. 80137ea: 69fb ldr r3, [r7, #28]
  46914. }
  46915. 80137ec: 4618 mov r0, r3
  46916. 80137ee: 3720 adds r7, #32
  46917. 80137f0: 46bd mov sp, r7
  46918. 80137f2: bd80 pop {r7, pc}
  46919. 80137f4: 24004168 .word 0x24004168
  46920. 80137f8: 2400417c .word 0x2400417c
  46921. 080137fc <vTaskMissedYield>:
  46922. /*-----------------------------------------------------------*/
  46923. void vTaskMissedYield( void )
  46924. {
  46925. 80137fc: b480 push {r7}
  46926. 80137fe: af00 add r7, sp, #0
  46927. xYieldPending = pdTRUE;
  46928. 8013800: 4b03 ldr r3, [pc, #12] @ (8013810 <vTaskMissedYield+0x14>)
  46929. 8013802: 2201 movs r2, #1
  46930. 8013804: 601a str r2, [r3, #0]
  46931. }
  46932. 8013806: bf00 nop
  46933. 8013808: 46bd mov sp, r7
  46934. 801380a: f85d 7b04 ldr.w r7, [sp], #4
  46935. 801380e: 4770 bx lr
  46936. 8013810: 24004178 .word 0x24004178
  46937. 08013814 <prvIdleTask>:
  46938. *
  46939. * void prvIdleTask( void *pvParameters );
  46940. *
  46941. */
  46942. static portTASK_FUNCTION( prvIdleTask, pvParameters )
  46943. {
  46944. 8013814: b580 push {r7, lr}
  46945. 8013816: b082 sub sp, #8
  46946. 8013818: af00 add r7, sp, #0
  46947. 801381a: 6078 str r0, [r7, #4]
  46948. for( ;; )
  46949. {
  46950. /* See if any tasks have deleted themselves - if so then the idle task
  46951. is responsible for freeing the deleted task's TCB and stack. */
  46952. prvCheckTasksWaitingTermination();
  46953. 801381c: f000 f852 bl 80138c4 <prvCheckTasksWaitingTermination>
  46954. A critical region is not required here as we are just reading from
  46955. the list, and an occasional incorrect value will not matter. If
  46956. the ready list at the idle priority contains more than one task
  46957. then a task other than the idle task is ready to execute. */
  46958. if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 )
  46959. 8013820: 4b06 ldr r3, [pc, #24] @ (801383c <prvIdleTask+0x28>)
  46960. 8013822: 681b ldr r3, [r3, #0]
  46961. 8013824: 2b01 cmp r3, #1
  46962. 8013826: d9f9 bls.n 801381c <prvIdleTask+0x8>
  46963. {
  46964. taskYIELD();
  46965. 8013828: 4b05 ldr r3, [pc, #20] @ (8013840 <prvIdleTask+0x2c>)
  46966. 801382a: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  46967. 801382e: 601a str r2, [r3, #0]
  46968. 8013830: f3bf 8f4f dsb sy
  46969. 8013834: f3bf 8f6f isb sy
  46970. prvCheckTasksWaitingTermination();
  46971. 8013838: e7f0 b.n 801381c <prvIdleTask+0x8>
  46972. 801383a: bf00 nop
  46973. 801383c: 24003c94 .word 0x24003c94
  46974. 8013840: e000ed04 .word 0xe000ed04
  46975. 08013844 <prvInitialiseTaskLists>:
  46976. #endif /* portUSING_MPU_WRAPPERS */
  46977. /*-----------------------------------------------------------*/
  46978. static void prvInitialiseTaskLists( void )
  46979. {
  46980. 8013844: b580 push {r7, lr}
  46981. 8013846: b082 sub sp, #8
  46982. 8013848: af00 add r7, sp, #0
  46983. UBaseType_t uxPriority;
  46984. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  46985. 801384a: 2300 movs r3, #0
  46986. 801384c: 607b str r3, [r7, #4]
  46987. 801384e: e00c b.n 801386a <prvInitialiseTaskLists+0x26>
  46988. {
  46989. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  46990. 8013850: 687a ldr r2, [r7, #4]
  46991. 8013852: 4613 mov r3, r2
  46992. 8013854: 009b lsls r3, r3, #2
  46993. 8013856: 4413 add r3, r2
  46994. 8013858: 009b lsls r3, r3, #2
  46995. 801385a: 4a12 ldr r2, [pc, #72] @ (80138a4 <prvInitialiseTaskLists+0x60>)
  46996. 801385c: 4413 add r3, r2
  46997. 801385e: 4618 mov r0, r3
  46998. 8013860: f7fd fca6 bl 80111b0 <vListInitialise>
  46999. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  47000. 8013864: 687b ldr r3, [r7, #4]
  47001. 8013866: 3301 adds r3, #1
  47002. 8013868: 607b str r3, [r7, #4]
  47003. 801386a: 687b ldr r3, [r7, #4]
  47004. 801386c: 2b37 cmp r3, #55 @ 0x37
  47005. 801386e: d9ef bls.n 8013850 <prvInitialiseTaskLists+0xc>
  47006. }
  47007. vListInitialise( &xDelayedTaskList1 );
  47008. 8013870: 480d ldr r0, [pc, #52] @ (80138a8 <prvInitialiseTaskLists+0x64>)
  47009. 8013872: f7fd fc9d bl 80111b0 <vListInitialise>
  47010. vListInitialise( &xDelayedTaskList2 );
  47011. 8013876: 480d ldr r0, [pc, #52] @ (80138ac <prvInitialiseTaskLists+0x68>)
  47012. 8013878: f7fd fc9a bl 80111b0 <vListInitialise>
  47013. vListInitialise( &xPendingReadyList );
  47014. 801387c: 480c ldr r0, [pc, #48] @ (80138b0 <prvInitialiseTaskLists+0x6c>)
  47015. 801387e: f7fd fc97 bl 80111b0 <vListInitialise>
  47016. #if ( INCLUDE_vTaskDelete == 1 )
  47017. {
  47018. vListInitialise( &xTasksWaitingTermination );
  47019. 8013882: 480c ldr r0, [pc, #48] @ (80138b4 <prvInitialiseTaskLists+0x70>)
  47020. 8013884: f7fd fc94 bl 80111b0 <vListInitialise>
  47021. }
  47022. #endif /* INCLUDE_vTaskDelete */
  47023. #if ( INCLUDE_vTaskSuspend == 1 )
  47024. {
  47025. vListInitialise( &xSuspendedTaskList );
  47026. 8013888: 480b ldr r0, [pc, #44] @ (80138b8 <prvInitialiseTaskLists+0x74>)
  47027. 801388a: f7fd fc91 bl 80111b0 <vListInitialise>
  47028. }
  47029. #endif /* INCLUDE_vTaskSuspend */
  47030. /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList
  47031. using list2. */
  47032. pxDelayedTaskList = &xDelayedTaskList1;
  47033. 801388e: 4b0b ldr r3, [pc, #44] @ (80138bc <prvInitialiseTaskLists+0x78>)
  47034. 8013890: 4a05 ldr r2, [pc, #20] @ (80138a8 <prvInitialiseTaskLists+0x64>)
  47035. 8013892: 601a str r2, [r3, #0]
  47036. pxOverflowDelayedTaskList = &xDelayedTaskList2;
  47037. 8013894: 4b0a ldr r3, [pc, #40] @ (80138c0 <prvInitialiseTaskLists+0x7c>)
  47038. 8013896: 4a05 ldr r2, [pc, #20] @ (80138ac <prvInitialiseTaskLists+0x68>)
  47039. 8013898: 601a str r2, [r3, #0]
  47040. }
  47041. 801389a: bf00 nop
  47042. 801389c: 3708 adds r7, #8
  47043. 801389e: 46bd mov sp, r7
  47044. 80138a0: bd80 pop {r7, pc}
  47045. 80138a2: bf00 nop
  47046. 80138a4: 24003c94 .word 0x24003c94
  47047. 80138a8: 240040f4 .word 0x240040f4
  47048. 80138ac: 24004108 .word 0x24004108
  47049. 80138b0: 24004124 .word 0x24004124
  47050. 80138b4: 24004138 .word 0x24004138
  47051. 80138b8: 24004150 .word 0x24004150
  47052. 80138bc: 2400411c .word 0x2400411c
  47053. 80138c0: 24004120 .word 0x24004120
  47054. 080138c4 <prvCheckTasksWaitingTermination>:
  47055. /*-----------------------------------------------------------*/
  47056. static void prvCheckTasksWaitingTermination( void )
  47057. {
  47058. 80138c4: b580 push {r7, lr}
  47059. 80138c6: b082 sub sp, #8
  47060. 80138c8: af00 add r7, sp, #0
  47061. {
  47062. TCB_t *pxTCB;
  47063. /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL()
  47064. being called too often in the idle task. */
  47065. while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U )
  47066. 80138ca: e019 b.n 8013900 <prvCheckTasksWaitingTermination+0x3c>
  47067. {
  47068. taskENTER_CRITICAL();
  47069. 80138cc: f001 f92c bl 8014b28 <vPortEnterCritical>
  47070. {
  47071. pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
  47072. 80138d0: 4b10 ldr r3, [pc, #64] @ (8013914 <prvCheckTasksWaitingTermination+0x50>)
  47073. 80138d2: 68db ldr r3, [r3, #12]
  47074. 80138d4: 68db ldr r3, [r3, #12]
  47075. 80138d6: 607b str r3, [r7, #4]
  47076. ( void ) uxListRemove( &( pxTCB->xStateListItem ) );
  47077. 80138d8: 687b ldr r3, [r7, #4]
  47078. 80138da: 3304 adds r3, #4
  47079. 80138dc: 4618 mov r0, r3
  47080. 80138de: f7fd fcf1 bl 80112c4 <uxListRemove>
  47081. --uxCurrentNumberOfTasks;
  47082. 80138e2: 4b0d ldr r3, [pc, #52] @ (8013918 <prvCheckTasksWaitingTermination+0x54>)
  47083. 80138e4: 681b ldr r3, [r3, #0]
  47084. 80138e6: 3b01 subs r3, #1
  47085. 80138e8: 4a0b ldr r2, [pc, #44] @ (8013918 <prvCheckTasksWaitingTermination+0x54>)
  47086. 80138ea: 6013 str r3, [r2, #0]
  47087. --uxDeletedTasksWaitingCleanUp;
  47088. 80138ec: 4b0b ldr r3, [pc, #44] @ (801391c <prvCheckTasksWaitingTermination+0x58>)
  47089. 80138ee: 681b ldr r3, [r3, #0]
  47090. 80138f0: 3b01 subs r3, #1
  47091. 80138f2: 4a0a ldr r2, [pc, #40] @ (801391c <prvCheckTasksWaitingTermination+0x58>)
  47092. 80138f4: 6013 str r3, [r2, #0]
  47093. }
  47094. taskEXIT_CRITICAL();
  47095. 80138f6: f001 f949 bl 8014b8c <vPortExitCritical>
  47096. prvDeleteTCB( pxTCB );
  47097. 80138fa: 6878 ldr r0, [r7, #4]
  47098. 80138fc: f000 f810 bl 8013920 <prvDeleteTCB>
  47099. while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U )
  47100. 8013900: 4b06 ldr r3, [pc, #24] @ (801391c <prvCheckTasksWaitingTermination+0x58>)
  47101. 8013902: 681b ldr r3, [r3, #0]
  47102. 8013904: 2b00 cmp r3, #0
  47103. 8013906: d1e1 bne.n 80138cc <prvCheckTasksWaitingTermination+0x8>
  47104. }
  47105. }
  47106. #endif /* INCLUDE_vTaskDelete */
  47107. }
  47108. 8013908: bf00 nop
  47109. 801390a: bf00 nop
  47110. 801390c: 3708 adds r7, #8
  47111. 801390e: 46bd mov sp, r7
  47112. 8013910: bd80 pop {r7, pc}
  47113. 8013912: bf00 nop
  47114. 8013914: 24004138 .word 0x24004138
  47115. 8013918: 24004164 .word 0x24004164
  47116. 801391c: 2400414c .word 0x2400414c
  47117. 08013920 <prvDeleteTCB>:
  47118. /*-----------------------------------------------------------*/
  47119. #if ( INCLUDE_vTaskDelete == 1 )
  47120. static void prvDeleteTCB( TCB_t *pxTCB )
  47121. {
  47122. 8013920: b580 push {r7, lr}
  47123. 8013922: b084 sub sp, #16
  47124. 8013924: af00 add r7, sp, #0
  47125. 8013926: 6078 str r0, [r7, #4]
  47126. to the task to free any memory allocated at the application level.
  47127. See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
  47128. for additional information. */
  47129. #if ( configUSE_NEWLIB_REENTRANT == 1 )
  47130. {
  47131. _reclaim_reent( &( pxTCB->xNewLib_reent ) );
  47132. 8013928: 687b ldr r3, [r7, #4]
  47133. 801392a: 3354 adds r3, #84 @ 0x54
  47134. 801392c: 4618 mov r0, r3
  47135. 801392e: f016 fa0d bl 8029d4c <_reclaim_reent>
  47136. #elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */
  47137. {
  47138. /* The task could have been allocated statically or dynamically, so
  47139. check what was statically allocated before trying to free the
  47140. memory. */
  47141. if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB )
  47142. 8013932: 687b ldr r3, [r7, #4]
  47143. 8013934: f893 30a5 ldrb.w r3, [r3, #165] @ 0xa5
  47144. 8013938: 2b00 cmp r3, #0
  47145. 801393a: d108 bne.n 801394e <prvDeleteTCB+0x2e>
  47146. {
  47147. /* Both the stack and TCB were allocated dynamically, so both
  47148. must be freed. */
  47149. vPortFree( pxTCB->pxStack );
  47150. 801393c: 687b ldr r3, [r7, #4]
  47151. 801393e: 6b1b ldr r3, [r3, #48] @ 0x30
  47152. 8013940: 4618 mov r0, r3
  47153. 8013942: f001 fae1 bl 8014f08 <vPortFree>
  47154. vPortFree( pxTCB );
  47155. 8013946: 6878 ldr r0, [r7, #4]
  47156. 8013948: f001 fade bl 8014f08 <vPortFree>
  47157. configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB );
  47158. mtCOVERAGE_TEST_MARKER();
  47159. }
  47160. }
  47161. #endif /* configSUPPORT_DYNAMIC_ALLOCATION */
  47162. }
  47163. 801394c: e019 b.n 8013982 <prvDeleteTCB+0x62>
  47164. else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY )
  47165. 801394e: 687b ldr r3, [r7, #4]
  47166. 8013950: f893 30a5 ldrb.w r3, [r3, #165] @ 0xa5
  47167. 8013954: 2b01 cmp r3, #1
  47168. 8013956: d103 bne.n 8013960 <prvDeleteTCB+0x40>
  47169. vPortFree( pxTCB );
  47170. 8013958: 6878 ldr r0, [r7, #4]
  47171. 801395a: f001 fad5 bl 8014f08 <vPortFree>
  47172. }
  47173. 801395e: e010 b.n 8013982 <prvDeleteTCB+0x62>
  47174. configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB );
  47175. 8013960: 687b ldr r3, [r7, #4]
  47176. 8013962: f893 30a5 ldrb.w r3, [r3, #165] @ 0xa5
  47177. 8013966: 2b02 cmp r3, #2
  47178. 8013968: d00b beq.n 8013982 <prvDeleteTCB+0x62>
  47179. __asm volatile
  47180. 801396a: f04f 0350 mov.w r3, #80 @ 0x50
  47181. 801396e: f383 8811 msr BASEPRI, r3
  47182. 8013972: f3bf 8f6f isb sy
  47183. 8013976: f3bf 8f4f dsb sy
  47184. 801397a: 60fb str r3, [r7, #12]
  47185. }
  47186. 801397c: bf00 nop
  47187. 801397e: bf00 nop
  47188. 8013980: e7fd b.n 801397e <prvDeleteTCB+0x5e>
  47189. }
  47190. 8013982: bf00 nop
  47191. 8013984: 3710 adds r7, #16
  47192. 8013986: 46bd mov sp, r7
  47193. 8013988: bd80 pop {r7, pc}
  47194. ...
  47195. 0801398c <prvResetNextTaskUnblockTime>:
  47196. #endif /* INCLUDE_vTaskDelete */
  47197. /*-----------------------------------------------------------*/
  47198. static void prvResetNextTaskUnblockTime( void )
  47199. {
  47200. 801398c: b480 push {r7}
  47201. 801398e: b083 sub sp, #12
  47202. 8013990: af00 add r7, sp, #0
  47203. TCB_t *pxTCB;
  47204. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  47205. 8013992: 4b0c ldr r3, [pc, #48] @ (80139c4 <prvResetNextTaskUnblockTime+0x38>)
  47206. 8013994: 681b ldr r3, [r3, #0]
  47207. 8013996: 681b ldr r3, [r3, #0]
  47208. 8013998: 2b00 cmp r3, #0
  47209. 801399a: d104 bne.n 80139a6 <prvResetNextTaskUnblockTime+0x1a>
  47210. {
  47211. /* The new current delayed list is empty. Set xNextTaskUnblockTime to
  47212. the maximum possible value so it is extremely unlikely that the
  47213. if( xTickCount >= xNextTaskUnblockTime ) test will pass until
  47214. there is an item in the delayed list. */
  47215. xNextTaskUnblockTime = portMAX_DELAY;
  47216. 801399c: 4b0a ldr r3, [pc, #40] @ (80139c8 <prvResetNextTaskUnblockTime+0x3c>)
  47217. 801399e: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  47218. 80139a2: 601a str r2, [r3, #0]
  47219. which the task at the head of the delayed list should be removed
  47220. from the Blocked state. */
  47221. ( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
  47222. xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) );
  47223. }
  47224. }
  47225. 80139a4: e008 b.n 80139b8 <prvResetNextTaskUnblockTime+0x2c>
  47226. ( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
  47227. 80139a6: 4b07 ldr r3, [pc, #28] @ (80139c4 <prvResetNextTaskUnblockTime+0x38>)
  47228. 80139a8: 681b ldr r3, [r3, #0]
  47229. 80139aa: 68db ldr r3, [r3, #12]
  47230. 80139ac: 68db ldr r3, [r3, #12]
  47231. 80139ae: 607b str r3, [r7, #4]
  47232. xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) );
  47233. 80139b0: 687b ldr r3, [r7, #4]
  47234. 80139b2: 685b ldr r3, [r3, #4]
  47235. 80139b4: 4a04 ldr r2, [pc, #16] @ (80139c8 <prvResetNextTaskUnblockTime+0x3c>)
  47236. 80139b6: 6013 str r3, [r2, #0]
  47237. }
  47238. 80139b8: bf00 nop
  47239. 80139ba: 370c adds r7, #12
  47240. 80139bc: 46bd mov sp, r7
  47241. 80139be: f85d 7b04 ldr.w r7, [sp], #4
  47242. 80139c2: 4770 bx lr
  47243. 80139c4: 2400411c .word 0x2400411c
  47244. 80139c8: 24004184 .word 0x24004184
  47245. 080139cc <xTaskGetCurrentTaskHandle>:
  47246. /*-----------------------------------------------------------*/
  47247. #if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) )
  47248. TaskHandle_t xTaskGetCurrentTaskHandle( void )
  47249. {
  47250. 80139cc: b480 push {r7}
  47251. 80139ce: b083 sub sp, #12
  47252. 80139d0: af00 add r7, sp, #0
  47253. TaskHandle_t xReturn;
  47254. /* A critical section is not required as this is not called from
  47255. an interrupt and the current TCB will always be the same for any
  47256. individual execution thread. */
  47257. xReturn = pxCurrentTCB;
  47258. 80139d2: 4b05 ldr r3, [pc, #20] @ (80139e8 <xTaskGetCurrentTaskHandle+0x1c>)
  47259. 80139d4: 681b ldr r3, [r3, #0]
  47260. 80139d6: 607b str r3, [r7, #4]
  47261. return xReturn;
  47262. 80139d8: 687b ldr r3, [r7, #4]
  47263. }
  47264. 80139da: 4618 mov r0, r3
  47265. 80139dc: 370c adds r7, #12
  47266. 80139de: 46bd mov sp, r7
  47267. 80139e0: f85d 7b04 ldr.w r7, [sp], #4
  47268. 80139e4: 4770 bx lr
  47269. 80139e6: bf00 nop
  47270. 80139e8: 24003c90 .word 0x24003c90
  47271. 080139ec <xTaskGetSchedulerState>:
  47272. /*-----------------------------------------------------------*/
  47273. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  47274. BaseType_t xTaskGetSchedulerState( void )
  47275. {
  47276. 80139ec: b480 push {r7}
  47277. 80139ee: b083 sub sp, #12
  47278. 80139f0: af00 add r7, sp, #0
  47279. BaseType_t xReturn;
  47280. if( xSchedulerRunning == pdFALSE )
  47281. 80139f2: 4b0b ldr r3, [pc, #44] @ (8013a20 <xTaskGetSchedulerState+0x34>)
  47282. 80139f4: 681b ldr r3, [r3, #0]
  47283. 80139f6: 2b00 cmp r3, #0
  47284. 80139f8: d102 bne.n 8013a00 <xTaskGetSchedulerState+0x14>
  47285. {
  47286. xReturn = taskSCHEDULER_NOT_STARTED;
  47287. 80139fa: 2301 movs r3, #1
  47288. 80139fc: 607b str r3, [r7, #4]
  47289. 80139fe: e008 b.n 8013a12 <xTaskGetSchedulerState+0x26>
  47290. }
  47291. else
  47292. {
  47293. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  47294. 8013a00: 4b08 ldr r3, [pc, #32] @ (8013a24 <xTaskGetSchedulerState+0x38>)
  47295. 8013a02: 681b ldr r3, [r3, #0]
  47296. 8013a04: 2b00 cmp r3, #0
  47297. 8013a06: d102 bne.n 8013a0e <xTaskGetSchedulerState+0x22>
  47298. {
  47299. xReturn = taskSCHEDULER_RUNNING;
  47300. 8013a08: 2302 movs r3, #2
  47301. 8013a0a: 607b str r3, [r7, #4]
  47302. 8013a0c: e001 b.n 8013a12 <xTaskGetSchedulerState+0x26>
  47303. }
  47304. else
  47305. {
  47306. xReturn = taskSCHEDULER_SUSPENDED;
  47307. 8013a0e: 2300 movs r3, #0
  47308. 8013a10: 607b str r3, [r7, #4]
  47309. }
  47310. }
  47311. return xReturn;
  47312. 8013a12: 687b ldr r3, [r7, #4]
  47313. }
  47314. 8013a14: 4618 mov r0, r3
  47315. 8013a16: 370c adds r7, #12
  47316. 8013a18: 46bd mov sp, r7
  47317. 8013a1a: f85d 7b04 ldr.w r7, [sp], #4
  47318. 8013a1e: 4770 bx lr
  47319. 8013a20: 24004170 .word 0x24004170
  47320. 8013a24: 2400418c .word 0x2400418c
  47321. 08013a28 <xTaskPriorityInherit>:
  47322. /*-----------------------------------------------------------*/
  47323. #if ( configUSE_MUTEXES == 1 )
  47324. BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder )
  47325. {
  47326. 8013a28: b580 push {r7, lr}
  47327. 8013a2a: b084 sub sp, #16
  47328. 8013a2c: af00 add r7, sp, #0
  47329. 8013a2e: 6078 str r0, [r7, #4]
  47330. TCB_t * const pxMutexHolderTCB = pxMutexHolder;
  47331. 8013a30: 687b ldr r3, [r7, #4]
  47332. 8013a32: 60bb str r3, [r7, #8]
  47333. BaseType_t xReturn = pdFALSE;
  47334. 8013a34: 2300 movs r3, #0
  47335. 8013a36: 60fb str r3, [r7, #12]
  47336. /* If the mutex was given back by an interrupt while the queue was
  47337. locked then the mutex holder might now be NULL. _RB_ Is this still
  47338. needed as interrupts can no longer use mutexes? */
  47339. if( pxMutexHolder != NULL )
  47340. 8013a38: 687b ldr r3, [r7, #4]
  47341. 8013a3a: 2b00 cmp r3, #0
  47342. 8013a3c: d051 beq.n 8013ae2 <xTaskPriorityInherit+0xba>
  47343. {
  47344. /* If the holder of the mutex has a priority below the priority of
  47345. the task attempting to obtain the mutex then it will temporarily
  47346. inherit the priority of the task attempting to obtain the mutex. */
  47347. if( pxMutexHolderTCB->uxPriority < pxCurrentTCB->uxPriority )
  47348. 8013a3e: 68bb ldr r3, [r7, #8]
  47349. 8013a40: 6ada ldr r2, [r3, #44] @ 0x2c
  47350. 8013a42: 4b2a ldr r3, [pc, #168] @ (8013aec <xTaskPriorityInherit+0xc4>)
  47351. 8013a44: 681b ldr r3, [r3, #0]
  47352. 8013a46: 6adb ldr r3, [r3, #44] @ 0x2c
  47353. 8013a48: 429a cmp r2, r3
  47354. 8013a4a: d241 bcs.n 8013ad0 <xTaskPriorityInherit+0xa8>
  47355. {
  47356. /* Adjust the mutex holder state to account for its new
  47357. priority. Only reset the event list item value if the value is
  47358. not being used for anything else. */
  47359. if( ( listGET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL )
  47360. 8013a4c: 68bb ldr r3, [r7, #8]
  47361. 8013a4e: 699b ldr r3, [r3, #24]
  47362. 8013a50: 2b00 cmp r3, #0
  47363. 8013a52: db06 blt.n 8013a62 <xTaskPriorityInherit+0x3a>
  47364. {
  47365. listSET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  47366. 8013a54: 4b25 ldr r3, [pc, #148] @ (8013aec <xTaskPriorityInherit+0xc4>)
  47367. 8013a56: 681b ldr r3, [r3, #0]
  47368. 8013a58: 6adb ldr r3, [r3, #44] @ 0x2c
  47369. 8013a5a: f1c3 0238 rsb r2, r3, #56 @ 0x38
  47370. 8013a5e: 68bb ldr r3, [r7, #8]
  47371. 8013a60: 619a str r2, [r3, #24]
  47372. mtCOVERAGE_TEST_MARKER();
  47373. }
  47374. /* If the task being modified is in the ready state it will need
  47375. to be moved into a new list. */
  47376. if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxMutexHolderTCB->uxPriority ] ), &( pxMutexHolderTCB->xStateListItem ) ) != pdFALSE )
  47377. 8013a62: 68bb ldr r3, [r7, #8]
  47378. 8013a64: 6959 ldr r1, [r3, #20]
  47379. 8013a66: 68bb ldr r3, [r7, #8]
  47380. 8013a68: 6ada ldr r2, [r3, #44] @ 0x2c
  47381. 8013a6a: 4613 mov r3, r2
  47382. 8013a6c: 009b lsls r3, r3, #2
  47383. 8013a6e: 4413 add r3, r2
  47384. 8013a70: 009b lsls r3, r3, #2
  47385. 8013a72: 4a1f ldr r2, [pc, #124] @ (8013af0 <xTaskPriorityInherit+0xc8>)
  47386. 8013a74: 4413 add r3, r2
  47387. 8013a76: 4299 cmp r1, r3
  47388. 8013a78: d122 bne.n 8013ac0 <xTaskPriorityInherit+0x98>
  47389. {
  47390. if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
  47391. 8013a7a: 68bb ldr r3, [r7, #8]
  47392. 8013a7c: 3304 adds r3, #4
  47393. 8013a7e: 4618 mov r0, r3
  47394. 8013a80: f7fd fc20 bl 80112c4 <uxListRemove>
  47395. {
  47396. mtCOVERAGE_TEST_MARKER();
  47397. }
  47398. /* Inherit the priority before being moved into the new list. */
  47399. pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority;
  47400. 8013a84: 4b19 ldr r3, [pc, #100] @ (8013aec <xTaskPriorityInherit+0xc4>)
  47401. 8013a86: 681b ldr r3, [r3, #0]
  47402. 8013a88: 6ada ldr r2, [r3, #44] @ 0x2c
  47403. 8013a8a: 68bb ldr r3, [r7, #8]
  47404. 8013a8c: 62da str r2, [r3, #44] @ 0x2c
  47405. prvAddTaskToReadyList( pxMutexHolderTCB );
  47406. 8013a8e: 68bb ldr r3, [r7, #8]
  47407. 8013a90: 6ada ldr r2, [r3, #44] @ 0x2c
  47408. 8013a92: 4b18 ldr r3, [pc, #96] @ (8013af4 <xTaskPriorityInherit+0xcc>)
  47409. 8013a94: 681b ldr r3, [r3, #0]
  47410. 8013a96: 429a cmp r2, r3
  47411. 8013a98: d903 bls.n 8013aa2 <xTaskPriorityInherit+0x7a>
  47412. 8013a9a: 68bb ldr r3, [r7, #8]
  47413. 8013a9c: 6adb ldr r3, [r3, #44] @ 0x2c
  47414. 8013a9e: 4a15 ldr r2, [pc, #84] @ (8013af4 <xTaskPriorityInherit+0xcc>)
  47415. 8013aa0: 6013 str r3, [r2, #0]
  47416. 8013aa2: 68bb ldr r3, [r7, #8]
  47417. 8013aa4: 6ada ldr r2, [r3, #44] @ 0x2c
  47418. 8013aa6: 4613 mov r3, r2
  47419. 8013aa8: 009b lsls r3, r3, #2
  47420. 8013aaa: 4413 add r3, r2
  47421. 8013aac: 009b lsls r3, r3, #2
  47422. 8013aae: 4a10 ldr r2, [pc, #64] @ (8013af0 <xTaskPriorityInherit+0xc8>)
  47423. 8013ab0: 441a add r2, r3
  47424. 8013ab2: 68bb ldr r3, [r7, #8]
  47425. 8013ab4: 3304 adds r3, #4
  47426. 8013ab6: 4619 mov r1, r3
  47427. 8013ab8: 4610 mov r0, r2
  47428. 8013aba: f7fd fba6 bl 801120a <vListInsertEnd>
  47429. 8013abe: e004 b.n 8013aca <xTaskPriorityInherit+0xa2>
  47430. }
  47431. else
  47432. {
  47433. /* Just inherit the priority. */
  47434. pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority;
  47435. 8013ac0: 4b0a ldr r3, [pc, #40] @ (8013aec <xTaskPriorityInherit+0xc4>)
  47436. 8013ac2: 681b ldr r3, [r3, #0]
  47437. 8013ac4: 6ada ldr r2, [r3, #44] @ 0x2c
  47438. 8013ac6: 68bb ldr r3, [r7, #8]
  47439. 8013ac8: 62da str r2, [r3, #44] @ 0x2c
  47440. }
  47441. traceTASK_PRIORITY_INHERIT( pxMutexHolderTCB, pxCurrentTCB->uxPriority );
  47442. /* Inheritance occurred. */
  47443. xReturn = pdTRUE;
  47444. 8013aca: 2301 movs r3, #1
  47445. 8013acc: 60fb str r3, [r7, #12]
  47446. 8013ace: e008 b.n 8013ae2 <xTaskPriorityInherit+0xba>
  47447. }
  47448. else
  47449. {
  47450. if( pxMutexHolderTCB->uxBasePriority < pxCurrentTCB->uxPriority )
  47451. 8013ad0: 68bb ldr r3, [r7, #8]
  47452. 8013ad2: 6cda ldr r2, [r3, #76] @ 0x4c
  47453. 8013ad4: 4b05 ldr r3, [pc, #20] @ (8013aec <xTaskPriorityInherit+0xc4>)
  47454. 8013ad6: 681b ldr r3, [r3, #0]
  47455. 8013ad8: 6adb ldr r3, [r3, #44] @ 0x2c
  47456. 8013ada: 429a cmp r2, r3
  47457. 8013adc: d201 bcs.n 8013ae2 <xTaskPriorityInherit+0xba>
  47458. current priority of the mutex holder is not lower than the
  47459. priority of the task attempting to take the mutex.
  47460. Therefore the mutex holder must have already inherited a
  47461. priority, but inheritance would have occurred if that had
  47462. not been the case. */
  47463. xReturn = pdTRUE;
  47464. 8013ade: 2301 movs r3, #1
  47465. 8013ae0: 60fb str r3, [r7, #12]
  47466. else
  47467. {
  47468. mtCOVERAGE_TEST_MARKER();
  47469. }
  47470. return xReturn;
  47471. 8013ae2: 68fb ldr r3, [r7, #12]
  47472. }
  47473. 8013ae4: 4618 mov r0, r3
  47474. 8013ae6: 3710 adds r7, #16
  47475. 8013ae8: 46bd mov sp, r7
  47476. 8013aea: bd80 pop {r7, pc}
  47477. 8013aec: 24003c90 .word 0x24003c90
  47478. 8013af0: 24003c94 .word 0x24003c94
  47479. 8013af4: 2400416c .word 0x2400416c
  47480. 08013af8 <xTaskPriorityDisinherit>:
  47481. /*-----------------------------------------------------------*/
  47482. #if ( configUSE_MUTEXES == 1 )
  47483. BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )
  47484. {
  47485. 8013af8: b580 push {r7, lr}
  47486. 8013afa: b086 sub sp, #24
  47487. 8013afc: af00 add r7, sp, #0
  47488. 8013afe: 6078 str r0, [r7, #4]
  47489. TCB_t * const pxTCB = pxMutexHolder;
  47490. 8013b00: 687b ldr r3, [r7, #4]
  47491. 8013b02: 613b str r3, [r7, #16]
  47492. BaseType_t xReturn = pdFALSE;
  47493. 8013b04: 2300 movs r3, #0
  47494. 8013b06: 617b str r3, [r7, #20]
  47495. if( pxMutexHolder != NULL )
  47496. 8013b08: 687b ldr r3, [r7, #4]
  47497. 8013b0a: 2b00 cmp r3, #0
  47498. 8013b0c: d058 beq.n 8013bc0 <xTaskPriorityDisinherit+0xc8>
  47499. {
  47500. /* A task can only have an inherited priority if it holds the mutex.
  47501. If the mutex is held by a task then it cannot be given from an
  47502. interrupt, and if a mutex is given by the holding task then it must
  47503. be the running state task. */
  47504. configASSERT( pxTCB == pxCurrentTCB );
  47505. 8013b0e: 4b2f ldr r3, [pc, #188] @ (8013bcc <xTaskPriorityDisinherit+0xd4>)
  47506. 8013b10: 681b ldr r3, [r3, #0]
  47507. 8013b12: 693a ldr r2, [r7, #16]
  47508. 8013b14: 429a cmp r2, r3
  47509. 8013b16: d00b beq.n 8013b30 <xTaskPriorityDisinherit+0x38>
  47510. __asm volatile
  47511. 8013b18: f04f 0350 mov.w r3, #80 @ 0x50
  47512. 8013b1c: f383 8811 msr BASEPRI, r3
  47513. 8013b20: f3bf 8f6f isb sy
  47514. 8013b24: f3bf 8f4f dsb sy
  47515. 8013b28: 60fb str r3, [r7, #12]
  47516. }
  47517. 8013b2a: bf00 nop
  47518. 8013b2c: bf00 nop
  47519. 8013b2e: e7fd b.n 8013b2c <xTaskPriorityDisinherit+0x34>
  47520. configASSERT( pxTCB->uxMutexesHeld );
  47521. 8013b30: 693b ldr r3, [r7, #16]
  47522. 8013b32: 6d1b ldr r3, [r3, #80] @ 0x50
  47523. 8013b34: 2b00 cmp r3, #0
  47524. 8013b36: d10b bne.n 8013b50 <xTaskPriorityDisinherit+0x58>
  47525. __asm volatile
  47526. 8013b38: f04f 0350 mov.w r3, #80 @ 0x50
  47527. 8013b3c: f383 8811 msr BASEPRI, r3
  47528. 8013b40: f3bf 8f6f isb sy
  47529. 8013b44: f3bf 8f4f dsb sy
  47530. 8013b48: 60bb str r3, [r7, #8]
  47531. }
  47532. 8013b4a: bf00 nop
  47533. 8013b4c: bf00 nop
  47534. 8013b4e: e7fd b.n 8013b4c <xTaskPriorityDisinherit+0x54>
  47535. ( pxTCB->uxMutexesHeld )--;
  47536. 8013b50: 693b ldr r3, [r7, #16]
  47537. 8013b52: 6d1b ldr r3, [r3, #80] @ 0x50
  47538. 8013b54: 1e5a subs r2, r3, #1
  47539. 8013b56: 693b ldr r3, [r7, #16]
  47540. 8013b58: 651a str r2, [r3, #80] @ 0x50
  47541. /* Has the holder of the mutex inherited the priority of another
  47542. task? */
  47543. if( pxTCB->uxPriority != pxTCB->uxBasePriority )
  47544. 8013b5a: 693b ldr r3, [r7, #16]
  47545. 8013b5c: 6ada ldr r2, [r3, #44] @ 0x2c
  47546. 8013b5e: 693b ldr r3, [r7, #16]
  47547. 8013b60: 6cdb ldr r3, [r3, #76] @ 0x4c
  47548. 8013b62: 429a cmp r2, r3
  47549. 8013b64: d02c beq.n 8013bc0 <xTaskPriorityDisinherit+0xc8>
  47550. {
  47551. /* Only disinherit if no other mutexes are held. */
  47552. if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 )
  47553. 8013b66: 693b ldr r3, [r7, #16]
  47554. 8013b68: 6d1b ldr r3, [r3, #80] @ 0x50
  47555. 8013b6a: 2b00 cmp r3, #0
  47556. 8013b6c: d128 bne.n 8013bc0 <xTaskPriorityDisinherit+0xc8>
  47557. /* A task can only have an inherited priority if it holds
  47558. the mutex. If the mutex is held by a task then it cannot be
  47559. given from an interrupt, and if a mutex is given by the
  47560. holding task then it must be the running state task. Remove
  47561. the holding task from the ready/delayed list. */
  47562. if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
  47563. 8013b6e: 693b ldr r3, [r7, #16]
  47564. 8013b70: 3304 adds r3, #4
  47565. 8013b72: 4618 mov r0, r3
  47566. 8013b74: f7fd fba6 bl 80112c4 <uxListRemove>
  47567. }
  47568. /* Disinherit the priority before adding the task into the
  47569. new ready list. */
  47570. traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );
  47571. pxTCB->uxPriority = pxTCB->uxBasePriority;
  47572. 8013b78: 693b ldr r3, [r7, #16]
  47573. 8013b7a: 6cda ldr r2, [r3, #76] @ 0x4c
  47574. 8013b7c: 693b ldr r3, [r7, #16]
  47575. 8013b7e: 62da str r2, [r3, #44] @ 0x2c
  47576. /* Reset the event list item value. It cannot be in use for
  47577. any other purpose if this task is running, and it must be
  47578. running to give back the mutex. */
  47579. listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  47580. 8013b80: 693b ldr r3, [r7, #16]
  47581. 8013b82: 6adb ldr r3, [r3, #44] @ 0x2c
  47582. 8013b84: f1c3 0238 rsb r2, r3, #56 @ 0x38
  47583. 8013b88: 693b ldr r3, [r7, #16]
  47584. 8013b8a: 619a str r2, [r3, #24]
  47585. prvAddTaskToReadyList( pxTCB );
  47586. 8013b8c: 693b ldr r3, [r7, #16]
  47587. 8013b8e: 6ada ldr r2, [r3, #44] @ 0x2c
  47588. 8013b90: 4b0f ldr r3, [pc, #60] @ (8013bd0 <xTaskPriorityDisinherit+0xd8>)
  47589. 8013b92: 681b ldr r3, [r3, #0]
  47590. 8013b94: 429a cmp r2, r3
  47591. 8013b96: d903 bls.n 8013ba0 <xTaskPriorityDisinherit+0xa8>
  47592. 8013b98: 693b ldr r3, [r7, #16]
  47593. 8013b9a: 6adb ldr r3, [r3, #44] @ 0x2c
  47594. 8013b9c: 4a0c ldr r2, [pc, #48] @ (8013bd0 <xTaskPriorityDisinherit+0xd8>)
  47595. 8013b9e: 6013 str r3, [r2, #0]
  47596. 8013ba0: 693b ldr r3, [r7, #16]
  47597. 8013ba2: 6ada ldr r2, [r3, #44] @ 0x2c
  47598. 8013ba4: 4613 mov r3, r2
  47599. 8013ba6: 009b lsls r3, r3, #2
  47600. 8013ba8: 4413 add r3, r2
  47601. 8013baa: 009b lsls r3, r3, #2
  47602. 8013bac: 4a09 ldr r2, [pc, #36] @ (8013bd4 <xTaskPriorityDisinherit+0xdc>)
  47603. 8013bae: 441a add r2, r3
  47604. 8013bb0: 693b ldr r3, [r7, #16]
  47605. 8013bb2: 3304 adds r3, #4
  47606. 8013bb4: 4619 mov r1, r3
  47607. 8013bb6: 4610 mov r0, r2
  47608. 8013bb8: f7fd fb27 bl 801120a <vListInsertEnd>
  47609. in an order different to that in which they were taken.
  47610. If a context switch did not occur when the first mutex was
  47611. returned, even if a task was waiting on it, then a context
  47612. switch should occur when the last mutex is returned whether
  47613. a task is waiting on it or not. */
  47614. xReturn = pdTRUE;
  47615. 8013bbc: 2301 movs r3, #1
  47616. 8013bbe: 617b str r3, [r7, #20]
  47617. else
  47618. {
  47619. mtCOVERAGE_TEST_MARKER();
  47620. }
  47621. return xReturn;
  47622. 8013bc0: 697b ldr r3, [r7, #20]
  47623. }
  47624. 8013bc2: 4618 mov r0, r3
  47625. 8013bc4: 3718 adds r7, #24
  47626. 8013bc6: 46bd mov sp, r7
  47627. 8013bc8: bd80 pop {r7, pc}
  47628. 8013bca: bf00 nop
  47629. 8013bcc: 24003c90 .word 0x24003c90
  47630. 8013bd0: 2400416c .word 0x2400416c
  47631. 8013bd4: 24003c94 .word 0x24003c94
  47632. 08013bd8 <vTaskPriorityDisinheritAfterTimeout>:
  47633. /*-----------------------------------------------------------*/
  47634. #if ( configUSE_MUTEXES == 1 )
  47635. void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask )
  47636. {
  47637. 8013bd8: b580 push {r7, lr}
  47638. 8013bda: b088 sub sp, #32
  47639. 8013bdc: af00 add r7, sp, #0
  47640. 8013bde: 6078 str r0, [r7, #4]
  47641. 8013be0: 6039 str r1, [r7, #0]
  47642. TCB_t * const pxTCB = pxMutexHolder;
  47643. 8013be2: 687b ldr r3, [r7, #4]
  47644. 8013be4: 61bb str r3, [r7, #24]
  47645. UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse;
  47646. const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1;
  47647. 8013be6: 2301 movs r3, #1
  47648. 8013be8: 617b str r3, [r7, #20]
  47649. if( pxMutexHolder != NULL )
  47650. 8013bea: 687b ldr r3, [r7, #4]
  47651. 8013bec: 2b00 cmp r3, #0
  47652. 8013bee: d06c beq.n 8013cca <vTaskPriorityDisinheritAfterTimeout+0xf2>
  47653. {
  47654. /* If pxMutexHolder is not NULL then the holder must hold at least
  47655. one mutex. */
  47656. configASSERT( pxTCB->uxMutexesHeld );
  47657. 8013bf0: 69bb ldr r3, [r7, #24]
  47658. 8013bf2: 6d1b ldr r3, [r3, #80] @ 0x50
  47659. 8013bf4: 2b00 cmp r3, #0
  47660. 8013bf6: d10b bne.n 8013c10 <vTaskPriorityDisinheritAfterTimeout+0x38>
  47661. __asm volatile
  47662. 8013bf8: f04f 0350 mov.w r3, #80 @ 0x50
  47663. 8013bfc: f383 8811 msr BASEPRI, r3
  47664. 8013c00: f3bf 8f6f isb sy
  47665. 8013c04: f3bf 8f4f dsb sy
  47666. 8013c08: 60fb str r3, [r7, #12]
  47667. }
  47668. 8013c0a: bf00 nop
  47669. 8013c0c: bf00 nop
  47670. 8013c0e: e7fd b.n 8013c0c <vTaskPriorityDisinheritAfterTimeout+0x34>
  47671. /* Determine the priority to which the priority of the task that
  47672. holds the mutex should be set. This will be the greater of the
  47673. holding task's base priority and the priority of the highest
  47674. priority task that is waiting to obtain the mutex. */
  47675. if( pxTCB->uxBasePriority < uxHighestPriorityWaitingTask )
  47676. 8013c10: 69bb ldr r3, [r7, #24]
  47677. 8013c12: 6cdb ldr r3, [r3, #76] @ 0x4c
  47678. 8013c14: 683a ldr r2, [r7, #0]
  47679. 8013c16: 429a cmp r2, r3
  47680. 8013c18: d902 bls.n 8013c20 <vTaskPriorityDisinheritAfterTimeout+0x48>
  47681. {
  47682. uxPriorityToUse = uxHighestPriorityWaitingTask;
  47683. 8013c1a: 683b ldr r3, [r7, #0]
  47684. 8013c1c: 61fb str r3, [r7, #28]
  47685. 8013c1e: e002 b.n 8013c26 <vTaskPriorityDisinheritAfterTimeout+0x4e>
  47686. }
  47687. else
  47688. {
  47689. uxPriorityToUse = pxTCB->uxBasePriority;
  47690. 8013c20: 69bb ldr r3, [r7, #24]
  47691. 8013c22: 6cdb ldr r3, [r3, #76] @ 0x4c
  47692. 8013c24: 61fb str r3, [r7, #28]
  47693. }
  47694. /* Does the priority need to change? */
  47695. if( pxTCB->uxPriority != uxPriorityToUse )
  47696. 8013c26: 69bb ldr r3, [r7, #24]
  47697. 8013c28: 6adb ldr r3, [r3, #44] @ 0x2c
  47698. 8013c2a: 69fa ldr r2, [r7, #28]
  47699. 8013c2c: 429a cmp r2, r3
  47700. 8013c2e: d04c beq.n 8013cca <vTaskPriorityDisinheritAfterTimeout+0xf2>
  47701. {
  47702. /* Only disinherit if no other mutexes are held. This is a
  47703. simplification in the priority inheritance implementation. If
  47704. the task that holds the mutex is also holding other mutexes then
  47705. the other mutexes may have caused the priority inheritance. */
  47706. if( pxTCB->uxMutexesHeld == uxOnlyOneMutexHeld )
  47707. 8013c30: 69bb ldr r3, [r7, #24]
  47708. 8013c32: 6d1b ldr r3, [r3, #80] @ 0x50
  47709. 8013c34: 697a ldr r2, [r7, #20]
  47710. 8013c36: 429a cmp r2, r3
  47711. 8013c38: d147 bne.n 8013cca <vTaskPriorityDisinheritAfterTimeout+0xf2>
  47712. {
  47713. /* If a task has timed out because it already holds the
  47714. mutex it was trying to obtain then it cannot of inherited
  47715. its own priority. */
  47716. configASSERT( pxTCB != pxCurrentTCB );
  47717. 8013c3a: 4b26 ldr r3, [pc, #152] @ (8013cd4 <vTaskPriorityDisinheritAfterTimeout+0xfc>)
  47718. 8013c3c: 681b ldr r3, [r3, #0]
  47719. 8013c3e: 69ba ldr r2, [r7, #24]
  47720. 8013c40: 429a cmp r2, r3
  47721. 8013c42: d10b bne.n 8013c5c <vTaskPriorityDisinheritAfterTimeout+0x84>
  47722. __asm volatile
  47723. 8013c44: f04f 0350 mov.w r3, #80 @ 0x50
  47724. 8013c48: f383 8811 msr BASEPRI, r3
  47725. 8013c4c: f3bf 8f6f isb sy
  47726. 8013c50: f3bf 8f4f dsb sy
  47727. 8013c54: 60bb str r3, [r7, #8]
  47728. }
  47729. 8013c56: bf00 nop
  47730. 8013c58: bf00 nop
  47731. 8013c5a: e7fd b.n 8013c58 <vTaskPriorityDisinheritAfterTimeout+0x80>
  47732. /* Disinherit the priority, remembering the previous
  47733. priority to facilitate determining the subject task's
  47734. state. */
  47735. traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );
  47736. uxPriorityUsedOnEntry = pxTCB->uxPriority;
  47737. 8013c5c: 69bb ldr r3, [r7, #24]
  47738. 8013c5e: 6adb ldr r3, [r3, #44] @ 0x2c
  47739. 8013c60: 613b str r3, [r7, #16]
  47740. pxTCB->uxPriority = uxPriorityToUse;
  47741. 8013c62: 69bb ldr r3, [r7, #24]
  47742. 8013c64: 69fa ldr r2, [r7, #28]
  47743. 8013c66: 62da str r2, [r3, #44] @ 0x2c
  47744. /* Only reset the event list item value if the value is not
  47745. being used for anything else. */
  47746. if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL )
  47747. 8013c68: 69bb ldr r3, [r7, #24]
  47748. 8013c6a: 699b ldr r3, [r3, #24]
  47749. 8013c6c: 2b00 cmp r3, #0
  47750. 8013c6e: db04 blt.n 8013c7a <vTaskPriorityDisinheritAfterTimeout+0xa2>
  47751. {
  47752. listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriorityToUse ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  47753. 8013c70: 69fb ldr r3, [r7, #28]
  47754. 8013c72: f1c3 0238 rsb r2, r3, #56 @ 0x38
  47755. 8013c76: 69bb ldr r3, [r7, #24]
  47756. 8013c78: 619a str r2, [r3, #24]
  47757. then the task that holds the mutex could be in either the
  47758. Ready, Blocked or Suspended states. Only remove the task
  47759. from its current state list if it is in the Ready state as
  47760. the task's priority is going to change and there is one
  47761. Ready list per priority. */
  47762. if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE )
  47763. 8013c7a: 69bb ldr r3, [r7, #24]
  47764. 8013c7c: 6959 ldr r1, [r3, #20]
  47765. 8013c7e: 693a ldr r2, [r7, #16]
  47766. 8013c80: 4613 mov r3, r2
  47767. 8013c82: 009b lsls r3, r3, #2
  47768. 8013c84: 4413 add r3, r2
  47769. 8013c86: 009b lsls r3, r3, #2
  47770. 8013c88: 4a13 ldr r2, [pc, #76] @ (8013cd8 <vTaskPriorityDisinheritAfterTimeout+0x100>)
  47771. 8013c8a: 4413 add r3, r2
  47772. 8013c8c: 4299 cmp r1, r3
  47773. 8013c8e: d11c bne.n 8013cca <vTaskPriorityDisinheritAfterTimeout+0xf2>
  47774. {
  47775. if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
  47776. 8013c90: 69bb ldr r3, [r7, #24]
  47777. 8013c92: 3304 adds r3, #4
  47778. 8013c94: 4618 mov r0, r3
  47779. 8013c96: f7fd fb15 bl 80112c4 <uxListRemove>
  47780. else
  47781. {
  47782. mtCOVERAGE_TEST_MARKER();
  47783. }
  47784. prvAddTaskToReadyList( pxTCB );
  47785. 8013c9a: 69bb ldr r3, [r7, #24]
  47786. 8013c9c: 6ada ldr r2, [r3, #44] @ 0x2c
  47787. 8013c9e: 4b0f ldr r3, [pc, #60] @ (8013cdc <vTaskPriorityDisinheritAfterTimeout+0x104>)
  47788. 8013ca0: 681b ldr r3, [r3, #0]
  47789. 8013ca2: 429a cmp r2, r3
  47790. 8013ca4: d903 bls.n 8013cae <vTaskPriorityDisinheritAfterTimeout+0xd6>
  47791. 8013ca6: 69bb ldr r3, [r7, #24]
  47792. 8013ca8: 6adb ldr r3, [r3, #44] @ 0x2c
  47793. 8013caa: 4a0c ldr r2, [pc, #48] @ (8013cdc <vTaskPriorityDisinheritAfterTimeout+0x104>)
  47794. 8013cac: 6013 str r3, [r2, #0]
  47795. 8013cae: 69bb ldr r3, [r7, #24]
  47796. 8013cb0: 6ada ldr r2, [r3, #44] @ 0x2c
  47797. 8013cb2: 4613 mov r3, r2
  47798. 8013cb4: 009b lsls r3, r3, #2
  47799. 8013cb6: 4413 add r3, r2
  47800. 8013cb8: 009b lsls r3, r3, #2
  47801. 8013cba: 4a07 ldr r2, [pc, #28] @ (8013cd8 <vTaskPriorityDisinheritAfterTimeout+0x100>)
  47802. 8013cbc: 441a add r2, r3
  47803. 8013cbe: 69bb ldr r3, [r7, #24]
  47804. 8013cc0: 3304 adds r3, #4
  47805. 8013cc2: 4619 mov r1, r3
  47806. 8013cc4: 4610 mov r0, r2
  47807. 8013cc6: f7fd faa0 bl 801120a <vListInsertEnd>
  47808. }
  47809. else
  47810. {
  47811. mtCOVERAGE_TEST_MARKER();
  47812. }
  47813. }
  47814. 8013cca: bf00 nop
  47815. 8013ccc: 3720 adds r7, #32
  47816. 8013cce: 46bd mov sp, r7
  47817. 8013cd0: bd80 pop {r7, pc}
  47818. 8013cd2: bf00 nop
  47819. 8013cd4: 24003c90 .word 0x24003c90
  47820. 8013cd8: 24003c94 .word 0x24003c94
  47821. 8013cdc: 2400416c .word 0x2400416c
  47822. 08013ce0 <pvTaskIncrementMutexHeldCount>:
  47823. /*-----------------------------------------------------------*/
  47824. #if ( configUSE_MUTEXES == 1 )
  47825. TaskHandle_t pvTaskIncrementMutexHeldCount( void )
  47826. {
  47827. 8013ce0: b480 push {r7}
  47828. 8013ce2: af00 add r7, sp, #0
  47829. /* If xSemaphoreCreateMutex() is called before any tasks have been created
  47830. then pxCurrentTCB will be NULL. */
  47831. if( pxCurrentTCB != NULL )
  47832. 8013ce4: 4b07 ldr r3, [pc, #28] @ (8013d04 <pvTaskIncrementMutexHeldCount+0x24>)
  47833. 8013ce6: 681b ldr r3, [r3, #0]
  47834. 8013ce8: 2b00 cmp r3, #0
  47835. 8013cea: d004 beq.n 8013cf6 <pvTaskIncrementMutexHeldCount+0x16>
  47836. {
  47837. ( pxCurrentTCB->uxMutexesHeld )++;
  47838. 8013cec: 4b05 ldr r3, [pc, #20] @ (8013d04 <pvTaskIncrementMutexHeldCount+0x24>)
  47839. 8013cee: 681b ldr r3, [r3, #0]
  47840. 8013cf0: 6d1a ldr r2, [r3, #80] @ 0x50
  47841. 8013cf2: 3201 adds r2, #1
  47842. 8013cf4: 651a str r2, [r3, #80] @ 0x50
  47843. }
  47844. return pxCurrentTCB;
  47845. 8013cf6: 4b03 ldr r3, [pc, #12] @ (8013d04 <pvTaskIncrementMutexHeldCount+0x24>)
  47846. 8013cf8: 681b ldr r3, [r3, #0]
  47847. }
  47848. 8013cfa: 4618 mov r0, r3
  47849. 8013cfc: 46bd mov sp, r7
  47850. 8013cfe: f85d 7b04 ldr.w r7, [sp], #4
  47851. 8013d02: 4770 bx lr
  47852. 8013d04: 24003c90 .word 0x24003c90
  47853. 08013d08 <xTaskNotifyWait>:
  47854. /*-----------------------------------------------------------*/
  47855. #if( configUSE_TASK_NOTIFICATIONS == 1 )
  47856. BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait )
  47857. {
  47858. 8013d08: b580 push {r7, lr}
  47859. 8013d0a: b086 sub sp, #24
  47860. 8013d0c: af00 add r7, sp, #0
  47861. 8013d0e: 60f8 str r0, [r7, #12]
  47862. 8013d10: 60b9 str r1, [r7, #8]
  47863. 8013d12: 607a str r2, [r7, #4]
  47864. 8013d14: 603b str r3, [r7, #0]
  47865. BaseType_t xReturn;
  47866. taskENTER_CRITICAL();
  47867. 8013d16: f000 ff07 bl 8014b28 <vPortEnterCritical>
  47868. {
  47869. /* Only block if a notification is not already pending. */
  47870. if( pxCurrentTCB->ucNotifyState != taskNOTIFICATION_RECEIVED )
  47871. 8013d1a: 4b29 ldr r3, [pc, #164] @ (8013dc0 <xTaskNotifyWait+0xb8>)
  47872. 8013d1c: 681b ldr r3, [r3, #0]
  47873. 8013d1e: f893 30a4 ldrb.w r3, [r3, #164] @ 0xa4
  47874. 8013d22: b2db uxtb r3, r3
  47875. 8013d24: 2b02 cmp r3, #2
  47876. 8013d26: d01c beq.n 8013d62 <xTaskNotifyWait+0x5a>
  47877. {
  47878. /* Clear bits in the task's notification value as bits may get
  47879. set by the notifying task or interrupt. This can be used to
  47880. clear the value to zero. */
  47881. pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnEntry;
  47882. 8013d28: 4b25 ldr r3, [pc, #148] @ (8013dc0 <xTaskNotifyWait+0xb8>)
  47883. 8013d2a: 681b ldr r3, [r3, #0]
  47884. 8013d2c: f8d3 10a0 ldr.w r1, [r3, #160] @ 0xa0
  47885. 8013d30: 68fa ldr r2, [r7, #12]
  47886. 8013d32: 43d2 mvns r2, r2
  47887. 8013d34: 400a ands r2, r1
  47888. 8013d36: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  47889. /* Mark this task as waiting for a notification. */
  47890. pxCurrentTCB->ucNotifyState = taskWAITING_NOTIFICATION;
  47891. 8013d3a: 4b21 ldr r3, [pc, #132] @ (8013dc0 <xTaskNotifyWait+0xb8>)
  47892. 8013d3c: 681b ldr r3, [r3, #0]
  47893. 8013d3e: 2201 movs r2, #1
  47894. 8013d40: f883 20a4 strb.w r2, [r3, #164] @ 0xa4
  47895. if( xTicksToWait > ( TickType_t ) 0 )
  47896. 8013d44: 683b ldr r3, [r7, #0]
  47897. 8013d46: 2b00 cmp r3, #0
  47898. 8013d48: d00b beq.n 8013d62 <xTaskNotifyWait+0x5a>
  47899. {
  47900. prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );
  47901. 8013d4a: 2101 movs r1, #1
  47902. 8013d4c: 6838 ldr r0, [r7, #0]
  47903. 8013d4e: f000 fa09 bl 8014164 <prvAddCurrentTaskToDelayedList>
  47904. /* All ports are written to allow a yield in a critical
  47905. section (some will yield immediately, others wait until the
  47906. critical section exits) - but it is not something that
  47907. application code should ever do. */
  47908. portYIELD_WITHIN_API();
  47909. 8013d52: 4b1c ldr r3, [pc, #112] @ (8013dc4 <xTaskNotifyWait+0xbc>)
  47910. 8013d54: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  47911. 8013d58: 601a str r2, [r3, #0]
  47912. 8013d5a: f3bf 8f4f dsb sy
  47913. 8013d5e: f3bf 8f6f isb sy
  47914. else
  47915. {
  47916. mtCOVERAGE_TEST_MARKER();
  47917. }
  47918. }
  47919. taskEXIT_CRITICAL();
  47920. 8013d62: f000 ff13 bl 8014b8c <vPortExitCritical>
  47921. taskENTER_CRITICAL();
  47922. 8013d66: f000 fedf bl 8014b28 <vPortEnterCritical>
  47923. {
  47924. traceTASK_NOTIFY_WAIT();
  47925. if( pulNotificationValue != NULL )
  47926. 8013d6a: 687b ldr r3, [r7, #4]
  47927. 8013d6c: 2b00 cmp r3, #0
  47928. 8013d6e: d005 beq.n 8013d7c <xTaskNotifyWait+0x74>
  47929. {
  47930. /* Output the current notification value, which may or may not
  47931. have changed. */
  47932. *pulNotificationValue = pxCurrentTCB->ulNotifiedValue;
  47933. 8013d70: 4b13 ldr r3, [pc, #76] @ (8013dc0 <xTaskNotifyWait+0xb8>)
  47934. 8013d72: 681b ldr r3, [r3, #0]
  47935. 8013d74: f8d3 20a0 ldr.w r2, [r3, #160] @ 0xa0
  47936. 8013d78: 687b ldr r3, [r7, #4]
  47937. 8013d7a: 601a str r2, [r3, #0]
  47938. /* If ucNotifyValue is set then either the task never entered the
  47939. blocked state (because a notification was already pending) or the
  47940. task unblocked because of a notification. Otherwise the task
  47941. unblocked because of a timeout. */
  47942. if( pxCurrentTCB->ucNotifyState != taskNOTIFICATION_RECEIVED )
  47943. 8013d7c: 4b10 ldr r3, [pc, #64] @ (8013dc0 <xTaskNotifyWait+0xb8>)
  47944. 8013d7e: 681b ldr r3, [r3, #0]
  47945. 8013d80: f893 30a4 ldrb.w r3, [r3, #164] @ 0xa4
  47946. 8013d84: b2db uxtb r3, r3
  47947. 8013d86: 2b02 cmp r3, #2
  47948. 8013d88: d002 beq.n 8013d90 <xTaskNotifyWait+0x88>
  47949. {
  47950. /* A notification was not received. */
  47951. xReturn = pdFALSE;
  47952. 8013d8a: 2300 movs r3, #0
  47953. 8013d8c: 617b str r3, [r7, #20]
  47954. 8013d8e: e00a b.n 8013da6 <xTaskNotifyWait+0x9e>
  47955. }
  47956. else
  47957. {
  47958. /* A notification was already pending or a notification was
  47959. received while the task was waiting. */
  47960. pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnExit;
  47961. 8013d90: 4b0b ldr r3, [pc, #44] @ (8013dc0 <xTaskNotifyWait+0xb8>)
  47962. 8013d92: 681b ldr r3, [r3, #0]
  47963. 8013d94: f8d3 10a0 ldr.w r1, [r3, #160] @ 0xa0
  47964. 8013d98: 68ba ldr r2, [r7, #8]
  47965. 8013d9a: 43d2 mvns r2, r2
  47966. 8013d9c: 400a ands r2, r1
  47967. 8013d9e: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  47968. xReturn = pdTRUE;
  47969. 8013da2: 2301 movs r3, #1
  47970. 8013da4: 617b str r3, [r7, #20]
  47971. }
  47972. pxCurrentTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION;
  47973. 8013da6: 4b06 ldr r3, [pc, #24] @ (8013dc0 <xTaskNotifyWait+0xb8>)
  47974. 8013da8: 681b ldr r3, [r3, #0]
  47975. 8013daa: 2200 movs r2, #0
  47976. 8013dac: f883 20a4 strb.w r2, [r3, #164] @ 0xa4
  47977. }
  47978. taskEXIT_CRITICAL();
  47979. 8013db0: f000 feec bl 8014b8c <vPortExitCritical>
  47980. return xReturn;
  47981. 8013db4: 697b ldr r3, [r7, #20]
  47982. }
  47983. 8013db6: 4618 mov r0, r3
  47984. 8013db8: 3718 adds r7, #24
  47985. 8013dba: 46bd mov sp, r7
  47986. 8013dbc: bd80 pop {r7, pc}
  47987. 8013dbe: bf00 nop
  47988. 8013dc0: 24003c90 .word 0x24003c90
  47989. 8013dc4: e000ed04 .word 0xe000ed04
  47990. 08013dc8 <xTaskGenericNotify>:
  47991. /*-----------------------------------------------------------*/
  47992. #if( configUSE_TASK_NOTIFICATIONS == 1 )
  47993. BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue )
  47994. {
  47995. 8013dc8: b580 push {r7, lr}
  47996. 8013dca: b08a sub sp, #40 @ 0x28
  47997. 8013dcc: af00 add r7, sp, #0
  47998. 8013dce: 60f8 str r0, [r7, #12]
  47999. 8013dd0: 60b9 str r1, [r7, #8]
  48000. 8013dd2: 603b str r3, [r7, #0]
  48001. 8013dd4: 4613 mov r3, r2
  48002. 8013dd6: 71fb strb r3, [r7, #7]
  48003. TCB_t * pxTCB;
  48004. BaseType_t xReturn = pdPASS;
  48005. 8013dd8: 2301 movs r3, #1
  48006. 8013dda: 627b str r3, [r7, #36] @ 0x24
  48007. uint8_t ucOriginalNotifyState;
  48008. configASSERT( xTaskToNotify );
  48009. 8013ddc: 68fb ldr r3, [r7, #12]
  48010. 8013dde: 2b00 cmp r3, #0
  48011. 8013de0: d10b bne.n 8013dfa <xTaskGenericNotify+0x32>
  48012. __asm volatile
  48013. 8013de2: f04f 0350 mov.w r3, #80 @ 0x50
  48014. 8013de6: f383 8811 msr BASEPRI, r3
  48015. 8013dea: f3bf 8f6f isb sy
  48016. 8013dee: f3bf 8f4f dsb sy
  48017. 8013df2: 61bb str r3, [r7, #24]
  48018. }
  48019. 8013df4: bf00 nop
  48020. 8013df6: bf00 nop
  48021. 8013df8: e7fd b.n 8013df6 <xTaskGenericNotify+0x2e>
  48022. pxTCB = xTaskToNotify;
  48023. 8013dfa: 68fb ldr r3, [r7, #12]
  48024. 8013dfc: 623b str r3, [r7, #32]
  48025. taskENTER_CRITICAL();
  48026. 8013dfe: f000 fe93 bl 8014b28 <vPortEnterCritical>
  48027. {
  48028. if( pulPreviousNotificationValue != NULL )
  48029. 8013e02: 683b ldr r3, [r7, #0]
  48030. 8013e04: 2b00 cmp r3, #0
  48031. 8013e06: d004 beq.n 8013e12 <xTaskGenericNotify+0x4a>
  48032. {
  48033. *pulPreviousNotificationValue = pxTCB->ulNotifiedValue;
  48034. 8013e08: 6a3b ldr r3, [r7, #32]
  48035. 8013e0a: f8d3 20a0 ldr.w r2, [r3, #160] @ 0xa0
  48036. 8013e0e: 683b ldr r3, [r7, #0]
  48037. 8013e10: 601a str r2, [r3, #0]
  48038. }
  48039. ucOriginalNotifyState = pxTCB->ucNotifyState;
  48040. 8013e12: 6a3b ldr r3, [r7, #32]
  48041. 8013e14: f893 30a4 ldrb.w r3, [r3, #164] @ 0xa4
  48042. 8013e18: 77fb strb r3, [r7, #31]
  48043. pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED;
  48044. 8013e1a: 6a3b ldr r3, [r7, #32]
  48045. 8013e1c: 2202 movs r2, #2
  48046. 8013e1e: f883 20a4 strb.w r2, [r3, #164] @ 0xa4
  48047. switch( eAction )
  48048. 8013e22: 79fb ldrb r3, [r7, #7]
  48049. 8013e24: 2b04 cmp r3, #4
  48050. 8013e26: d82e bhi.n 8013e86 <xTaskGenericNotify+0xbe>
  48051. 8013e28: a201 add r2, pc, #4 @ (adr r2, 8013e30 <xTaskGenericNotify+0x68>)
  48052. 8013e2a: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  48053. 8013e2e: bf00 nop
  48054. 8013e30: 08013eab .word 0x08013eab
  48055. 8013e34: 08013e45 .word 0x08013e45
  48056. 8013e38: 08013e57 .word 0x08013e57
  48057. 8013e3c: 08013e67 .word 0x08013e67
  48058. 8013e40: 08013e71 .word 0x08013e71
  48059. {
  48060. case eSetBits :
  48061. pxTCB->ulNotifiedValue |= ulValue;
  48062. 8013e44: 6a3b ldr r3, [r7, #32]
  48063. 8013e46: f8d3 20a0 ldr.w r2, [r3, #160] @ 0xa0
  48064. 8013e4a: 68bb ldr r3, [r7, #8]
  48065. 8013e4c: 431a orrs r2, r3
  48066. 8013e4e: 6a3b ldr r3, [r7, #32]
  48067. 8013e50: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  48068. break;
  48069. 8013e54: e02c b.n 8013eb0 <xTaskGenericNotify+0xe8>
  48070. case eIncrement :
  48071. ( pxTCB->ulNotifiedValue )++;
  48072. 8013e56: 6a3b ldr r3, [r7, #32]
  48073. 8013e58: f8d3 30a0 ldr.w r3, [r3, #160] @ 0xa0
  48074. 8013e5c: 1c5a adds r2, r3, #1
  48075. 8013e5e: 6a3b ldr r3, [r7, #32]
  48076. 8013e60: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  48077. break;
  48078. 8013e64: e024 b.n 8013eb0 <xTaskGenericNotify+0xe8>
  48079. case eSetValueWithOverwrite :
  48080. pxTCB->ulNotifiedValue = ulValue;
  48081. 8013e66: 6a3b ldr r3, [r7, #32]
  48082. 8013e68: 68ba ldr r2, [r7, #8]
  48083. 8013e6a: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  48084. break;
  48085. 8013e6e: e01f b.n 8013eb0 <xTaskGenericNotify+0xe8>
  48086. case eSetValueWithoutOverwrite :
  48087. if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED )
  48088. 8013e70: 7ffb ldrb r3, [r7, #31]
  48089. 8013e72: 2b02 cmp r3, #2
  48090. 8013e74: d004 beq.n 8013e80 <xTaskGenericNotify+0xb8>
  48091. {
  48092. pxTCB->ulNotifiedValue = ulValue;
  48093. 8013e76: 6a3b ldr r3, [r7, #32]
  48094. 8013e78: 68ba ldr r2, [r7, #8]
  48095. 8013e7a: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  48096. else
  48097. {
  48098. /* The value could not be written to the task. */
  48099. xReturn = pdFAIL;
  48100. }
  48101. break;
  48102. 8013e7e: e017 b.n 8013eb0 <xTaskGenericNotify+0xe8>
  48103. xReturn = pdFAIL;
  48104. 8013e80: 2300 movs r3, #0
  48105. 8013e82: 627b str r3, [r7, #36] @ 0x24
  48106. break;
  48107. 8013e84: e014 b.n 8013eb0 <xTaskGenericNotify+0xe8>
  48108. default:
  48109. /* Should not get here if all enums are handled.
  48110. Artificially force an assert by testing a value the
  48111. compiler can't assume is const. */
  48112. configASSERT( pxTCB->ulNotifiedValue == ~0UL );
  48113. 8013e86: 6a3b ldr r3, [r7, #32]
  48114. 8013e88: f8d3 30a0 ldr.w r3, [r3, #160] @ 0xa0
  48115. 8013e8c: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  48116. 8013e90: d00d beq.n 8013eae <xTaskGenericNotify+0xe6>
  48117. __asm volatile
  48118. 8013e92: f04f 0350 mov.w r3, #80 @ 0x50
  48119. 8013e96: f383 8811 msr BASEPRI, r3
  48120. 8013e9a: f3bf 8f6f isb sy
  48121. 8013e9e: f3bf 8f4f dsb sy
  48122. 8013ea2: 617b str r3, [r7, #20]
  48123. }
  48124. 8013ea4: bf00 nop
  48125. 8013ea6: bf00 nop
  48126. 8013ea8: e7fd b.n 8013ea6 <xTaskGenericNotify+0xde>
  48127. break;
  48128. 8013eaa: bf00 nop
  48129. 8013eac: e000 b.n 8013eb0 <xTaskGenericNotify+0xe8>
  48130. break;
  48131. 8013eae: bf00 nop
  48132. traceTASK_NOTIFY();
  48133. /* If the task is in the blocked state specifically to wait for a
  48134. notification then unblock it now. */
  48135. if( ucOriginalNotifyState == taskWAITING_NOTIFICATION )
  48136. 8013eb0: 7ffb ldrb r3, [r7, #31]
  48137. 8013eb2: 2b01 cmp r3, #1
  48138. 8013eb4: d13b bne.n 8013f2e <xTaskGenericNotify+0x166>
  48139. {
  48140. ( void ) uxListRemove( &( pxTCB->xStateListItem ) );
  48141. 8013eb6: 6a3b ldr r3, [r7, #32]
  48142. 8013eb8: 3304 adds r3, #4
  48143. 8013eba: 4618 mov r0, r3
  48144. 8013ebc: f7fd fa02 bl 80112c4 <uxListRemove>
  48145. prvAddTaskToReadyList( pxTCB );
  48146. 8013ec0: 6a3b ldr r3, [r7, #32]
  48147. 8013ec2: 6ada ldr r2, [r3, #44] @ 0x2c
  48148. 8013ec4: 4b1d ldr r3, [pc, #116] @ (8013f3c <xTaskGenericNotify+0x174>)
  48149. 8013ec6: 681b ldr r3, [r3, #0]
  48150. 8013ec8: 429a cmp r2, r3
  48151. 8013eca: d903 bls.n 8013ed4 <xTaskGenericNotify+0x10c>
  48152. 8013ecc: 6a3b ldr r3, [r7, #32]
  48153. 8013ece: 6adb ldr r3, [r3, #44] @ 0x2c
  48154. 8013ed0: 4a1a ldr r2, [pc, #104] @ (8013f3c <xTaskGenericNotify+0x174>)
  48155. 8013ed2: 6013 str r3, [r2, #0]
  48156. 8013ed4: 6a3b ldr r3, [r7, #32]
  48157. 8013ed6: 6ada ldr r2, [r3, #44] @ 0x2c
  48158. 8013ed8: 4613 mov r3, r2
  48159. 8013eda: 009b lsls r3, r3, #2
  48160. 8013edc: 4413 add r3, r2
  48161. 8013ede: 009b lsls r3, r3, #2
  48162. 8013ee0: 4a17 ldr r2, [pc, #92] @ (8013f40 <xTaskGenericNotify+0x178>)
  48163. 8013ee2: 441a add r2, r3
  48164. 8013ee4: 6a3b ldr r3, [r7, #32]
  48165. 8013ee6: 3304 adds r3, #4
  48166. 8013ee8: 4619 mov r1, r3
  48167. 8013eea: 4610 mov r0, r2
  48168. 8013eec: f7fd f98d bl 801120a <vListInsertEnd>
  48169. /* The task should not have been on an event list. */
  48170. configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL );
  48171. 8013ef0: 6a3b ldr r3, [r7, #32]
  48172. 8013ef2: 6a9b ldr r3, [r3, #40] @ 0x28
  48173. 8013ef4: 2b00 cmp r3, #0
  48174. 8013ef6: d00b beq.n 8013f10 <xTaskGenericNotify+0x148>
  48175. __asm volatile
  48176. 8013ef8: f04f 0350 mov.w r3, #80 @ 0x50
  48177. 8013efc: f383 8811 msr BASEPRI, r3
  48178. 8013f00: f3bf 8f6f isb sy
  48179. 8013f04: f3bf 8f4f dsb sy
  48180. 8013f08: 613b str r3, [r7, #16]
  48181. }
  48182. 8013f0a: bf00 nop
  48183. 8013f0c: bf00 nop
  48184. 8013f0e: e7fd b.n 8013f0c <xTaskGenericNotify+0x144>
  48185. earliest possible time. */
  48186. prvResetNextTaskUnblockTime();
  48187. }
  48188. #endif
  48189. if( pxTCB->uxPriority > pxCurrentTCB->uxPriority )
  48190. 8013f10: 6a3b ldr r3, [r7, #32]
  48191. 8013f12: 6ada ldr r2, [r3, #44] @ 0x2c
  48192. 8013f14: 4b0b ldr r3, [pc, #44] @ (8013f44 <xTaskGenericNotify+0x17c>)
  48193. 8013f16: 681b ldr r3, [r3, #0]
  48194. 8013f18: 6adb ldr r3, [r3, #44] @ 0x2c
  48195. 8013f1a: 429a cmp r2, r3
  48196. 8013f1c: d907 bls.n 8013f2e <xTaskGenericNotify+0x166>
  48197. {
  48198. /* The notified task has a priority above the currently
  48199. executing task so a yield is required. */
  48200. taskYIELD_IF_USING_PREEMPTION();
  48201. 8013f1e: 4b0a ldr r3, [pc, #40] @ (8013f48 <xTaskGenericNotify+0x180>)
  48202. 8013f20: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  48203. 8013f24: 601a str r2, [r3, #0]
  48204. 8013f26: f3bf 8f4f dsb sy
  48205. 8013f2a: f3bf 8f6f isb sy
  48206. else
  48207. {
  48208. mtCOVERAGE_TEST_MARKER();
  48209. }
  48210. }
  48211. taskEXIT_CRITICAL();
  48212. 8013f2e: f000 fe2d bl 8014b8c <vPortExitCritical>
  48213. return xReturn;
  48214. 8013f32: 6a7b ldr r3, [r7, #36] @ 0x24
  48215. }
  48216. 8013f34: 4618 mov r0, r3
  48217. 8013f36: 3728 adds r7, #40 @ 0x28
  48218. 8013f38: 46bd mov sp, r7
  48219. 8013f3a: bd80 pop {r7, pc}
  48220. 8013f3c: 2400416c .word 0x2400416c
  48221. 8013f40: 24003c94 .word 0x24003c94
  48222. 8013f44: 24003c90 .word 0x24003c90
  48223. 8013f48: e000ed04 .word 0xe000ed04
  48224. 08013f4c <xTaskGenericNotifyFromISR>:
  48225. /*-----------------------------------------------------------*/
  48226. #if( configUSE_TASK_NOTIFICATIONS == 1 )
  48227. BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken )
  48228. {
  48229. 8013f4c: b580 push {r7, lr}
  48230. 8013f4e: b08e sub sp, #56 @ 0x38
  48231. 8013f50: af00 add r7, sp, #0
  48232. 8013f52: 60f8 str r0, [r7, #12]
  48233. 8013f54: 60b9 str r1, [r7, #8]
  48234. 8013f56: 603b str r3, [r7, #0]
  48235. 8013f58: 4613 mov r3, r2
  48236. 8013f5a: 71fb strb r3, [r7, #7]
  48237. TCB_t * pxTCB;
  48238. uint8_t ucOriginalNotifyState;
  48239. BaseType_t xReturn = pdPASS;
  48240. 8013f5c: 2301 movs r3, #1
  48241. 8013f5e: 637b str r3, [r7, #52] @ 0x34
  48242. UBaseType_t uxSavedInterruptStatus;
  48243. configASSERT( xTaskToNotify );
  48244. 8013f60: 68fb ldr r3, [r7, #12]
  48245. 8013f62: 2b00 cmp r3, #0
  48246. 8013f64: d10b bne.n 8013f7e <xTaskGenericNotifyFromISR+0x32>
  48247. __asm volatile
  48248. 8013f66: f04f 0350 mov.w r3, #80 @ 0x50
  48249. 8013f6a: f383 8811 msr BASEPRI, r3
  48250. 8013f6e: f3bf 8f6f isb sy
  48251. 8013f72: f3bf 8f4f dsb sy
  48252. 8013f76: 627b str r3, [r7, #36] @ 0x24
  48253. }
  48254. 8013f78: bf00 nop
  48255. 8013f7a: bf00 nop
  48256. 8013f7c: e7fd b.n 8013f7a <xTaskGenericNotifyFromISR+0x2e>
  48257. below the maximum system call interrupt priority. FreeRTOS maintains a
  48258. separate interrupt safe API to ensure interrupt entry is as fast and as
  48259. simple as possible. More information (albeit Cortex-M specific) is
  48260. provided on the following link:
  48261. http://www.freertos.org/RTOS-Cortex-M3-M4.html */
  48262. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  48263. 8013f7e: f000 feb3 bl 8014ce8 <vPortValidateInterruptPriority>
  48264. pxTCB = xTaskToNotify;
  48265. 8013f82: 68fb ldr r3, [r7, #12]
  48266. 8013f84: 633b str r3, [r7, #48] @ 0x30
  48267. __asm volatile
  48268. 8013f86: f3ef 8211 mrs r2, BASEPRI
  48269. 8013f8a: f04f 0350 mov.w r3, #80 @ 0x50
  48270. 8013f8e: f383 8811 msr BASEPRI, r3
  48271. 8013f92: f3bf 8f6f isb sy
  48272. 8013f96: f3bf 8f4f dsb sy
  48273. 8013f9a: 623a str r2, [r7, #32]
  48274. 8013f9c: 61fb str r3, [r7, #28]
  48275. return ulOriginalBASEPRI;
  48276. 8013f9e: 6a3b ldr r3, [r7, #32]
  48277. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  48278. 8013fa0: 62fb str r3, [r7, #44] @ 0x2c
  48279. {
  48280. if( pulPreviousNotificationValue != NULL )
  48281. 8013fa2: 683b ldr r3, [r7, #0]
  48282. 8013fa4: 2b00 cmp r3, #0
  48283. 8013fa6: d004 beq.n 8013fb2 <xTaskGenericNotifyFromISR+0x66>
  48284. {
  48285. *pulPreviousNotificationValue = pxTCB->ulNotifiedValue;
  48286. 8013fa8: 6b3b ldr r3, [r7, #48] @ 0x30
  48287. 8013faa: f8d3 20a0 ldr.w r2, [r3, #160] @ 0xa0
  48288. 8013fae: 683b ldr r3, [r7, #0]
  48289. 8013fb0: 601a str r2, [r3, #0]
  48290. }
  48291. ucOriginalNotifyState = pxTCB->ucNotifyState;
  48292. 8013fb2: 6b3b ldr r3, [r7, #48] @ 0x30
  48293. 8013fb4: f893 30a4 ldrb.w r3, [r3, #164] @ 0xa4
  48294. 8013fb8: f887 302b strb.w r3, [r7, #43] @ 0x2b
  48295. pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED;
  48296. 8013fbc: 6b3b ldr r3, [r7, #48] @ 0x30
  48297. 8013fbe: 2202 movs r2, #2
  48298. 8013fc0: f883 20a4 strb.w r2, [r3, #164] @ 0xa4
  48299. switch( eAction )
  48300. 8013fc4: 79fb ldrb r3, [r7, #7]
  48301. 8013fc6: 2b04 cmp r3, #4
  48302. 8013fc8: d82e bhi.n 8014028 <xTaskGenericNotifyFromISR+0xdc>
  48303. 8013fca: a201 add r2, pc, #4 @ (adr r2, 8013fd0 <xTaskGenericNotifyFromISR+0x84>)
  48304. 8013fcc: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  48305. 8013fd0: 0801404d .word 0x0801404d
  48306. 8013fd4: 08013fe5 .word 0x08013fe5
  48307. 8013fd8: 08013ff7 .word 0x08013ff7
  48308. 8013fdc: 08014007 .word 0x08014007
  48309. 8013fe0: 08014011 .word 0x08014011
  48310. {
  48311. case eSetBits :
  48312. pxTCB->ulNotifiedValue |= ulValue;
  48313. 8013fe4: 6b3b ldr r3, [r7, #48] @ 0x30
  48314. 8013fe6: f8d3 20a0 ldr.w r2, [r3, #160] @ 0xa0
  48315. 8013fea: 68bb ldr r3, [r7, #8]
  48316. 8013fec: 431a orrs r2, r3
  48317. 8013fee: 6b3b ldr r3, [r7, #48] @ 0x30
  48318. 8013ff0: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  48319. break;
  48320. 8013ff4: e02d b.n 8014052 <xTaskGenericNotifyFromISR+0x106>
  48321. case eIncrement :
  48322. ( pxTCB->ulNotifiedValue )++;
  48323. 8013ff6: 6b3b ldr r3, [r7, #48] @ 0x30
  48324. 8013ff8: f8d3 30a0 ldr.w r3, [r3, #160] @ 0xa0
  48325. 8013ffc: 1c5a adds r2, r3, #1
  48326. 8013ffe: 6b3b ldr r3, [r7, #48] @ 0x30
  48327. 8014000: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  48328. break;
  48329. 8014004: e025 b.n 8014052 <xTaskGenericNotifyFromISR+0x106>
  48330. case eSetValueWithOverwrite :
  48331. pxTCB->ulNotifiedValue = ulValue;
  48332. 8014006: 6b3b ldr r3, [r7, #48] @ 0x30
  48333. 8014008: 68ba ldr r2, [r7, #8]
  48334. 801400a: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  48335. break;
  48336. 801400e: e020 b.n 8014052 <xTaskGenericNotifyFromISR+0x106>
  48337. case eSetValueWithoutOverwrite :
  48338. if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED )
  48339. 8014010: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  48340. 8014014: 2b02 cmp r3, #2
  48341. 8014016: d004 beq.n 8014022 <xTaskGenericNotifyFromISR+0xd6>
  48342. {
  48343. pxTCB->ulNotifiedValue = ulValue;
  48344. 8014018: 6b3b ldr r3, [r7, #48] @ 0x30
  48345. 801401a: 68ba ldr r2, [r7, #8]
  48346. 801401c: f8c3 20a0 str.w r2, [r3, #160] @ 0xa0
  48347. else
  48348. {
  48349. /* The value could not be written to the task. */
  48350. xReturn = pdFAIL;
  48351. }
  48352. break;
  48353. 8014020: e017 b.n 8014052 <xTaskGenericNotifyFromISR+0x106>
  48354. xReturn = pdFAIL;
  48355. 8014022: 2300 movs r3, #0
  48356. 8014024: 637b str r3, [r7, #52] @ 0x34
  48357. break;
  48358. 8014026: e014 b.n 8014052 <xTaskGenericNotifyFromISR+0x106>
  48359. default:
  48360. /* Should not get here if all enums are handled.
  48361. Artificially force an assert by testing a value the
  48362. compiler can't assume is const. */
  48363. configASSERT( pxTCB->ulNotifiedValue == ~0UL );
  48364. 8014028: 6b3b ldr r3, [r7, #48] @ 0x30
  48365. 801402a: f8d3 30a0 ldr.w r3, [r3, #160] @ 0xa0
  48366. 801402e: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  48367. 8014032: d00d beq.n 8014050 <xTaskGenericNotifyFromISR+0x104>
  48368. __asm volatile
  48369. 8014034: f04f 0350 mov.w r3, #80 @ 0x50
  48370. 8014038: f383 8811 msr BASEPRI, r3
  48371. 801403c: f3bf 8f6f isb sy
  48372. 8014040: f3bf 8f4f dsb sy
  48373. 8014044: 61bb str r3, [r7, #24]
  48374. }
  48375. 8014046: bf00 nop
  48376. 8014048: bf00 nop
  48377. 801404a: e7fd b.n 8014048 <xTaskGenericNotifyFromISR+0xfc>
  48378. break;
  48379. 801404c: bf00 nop
  48380. 801404e: e000 b.n 8014052 <xTaskGenericNotifyFromISR+0x106>
  48381. break;
  48382. 8014050: bf00 nop
  48383. traceTASK_NOTIFY_FROM_ISR();
  48384. /* If the task is in the blocked state specifically to wait for a
  48385. notification then unblock it now. */
  48386. if( ucOriginalNotifyState == taskWAITING_NOTIFICATION )
  48387. 8014052: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  48388. 8014056: 2b01 cmp r3, #1
  48389. 8014058: d147 bne.n 80140ea <xTaskGenericNotifyFromISR+0x19e>
  48390. {
  48391. /* The task should not have been on an event list. */
  48392. configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL );
  48393. 801405a: 6b3b ldr r3, [r7, #48] @ 0x30
  48394. 801405c: 6a9b ldr r3, [r3, #40] @ 0x28
  48395. 801405e: 2b00 cmp r3, #0
  48396. 8014060: d00b beq.n 801407a <xTaskGenericNotifyFromISR+0x12e>
  48397. __asm volatile
  48398. 8014062: f04f 0350 mov.w r3, #80 @ 0x50
  48399. 8014066: f383 8811 msr BASEPRI, r3
  48400. 801406a: f3bf 8f6f isb sy
  48401. 801406e: f3bf 8f4f dsb sy
  48402. 8014072: 617b str r3, [r7, #20]
  48403. }
  48404. 8014074: bf00 nop
  48405. 8014076: bf00 nop
  48406. 8014078: e7fd b.n 8014076 <xTaskGenericNotifyFromISR+0x12a>
  48407. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  48408. 801407a: 4b21 ldr r3, [pc, #132] @ (8014100 <xTaskGenericNotifyFromISR+0x1b4>)
  48409. 801407c: 681b ldr r3, [r3, #0]
  48410. 801407e: 2b00 cmp r3, #0
  48411. 8014080: d11d bne.n 80140be <xTaskGenericNotifyFromISR+0x172>
  48412. {
  48413. ( void ) uxListRemove( &( pxTCB->xStateListItem ) );
  48414. 8014082: 6b3b ldr r3, [r7, #48] @ 0x30
  48415. 8014084: 3304 adds r3, #4
  48416. 8014086: 4618 mov r0, r3
  48417. 8014088: f7fd f91c bl 80112c4 <uxListRemove>
  48418. prvAddTaskToReadyList( pxTCB );
  48419. 801408c: 6b3b ldr r3, [r7, #48] @ 0x30
  48420. 801408e: 6ada ldr r2, [r3, #44] @ 0x2c
  48421. 8014090: 4b1c ldr r3, [pc, #112] @ (8014104 <xTaskGenericNotifyFromISR+0x1b8>)
  48422. 8014092: 681b ldr r3, [r3, #0]
  48423. 8014094: 429a cmp r2, r3
  48424. 8014096: d903 bls.n 80140a0 <xTaskGenericNotifyFromISR+0x154>
  48425. 8014098: 6b3b ldr r3, [r7, #48] @ 0x30
  48426. 801409a: 6adb ldr r3, [r3, #44] @ 0x2c
  48427. 801409c: 4a19 ldr r2, [pc, #100] @ (8014104 <xTaskGenericNotifyFromISR+0x1b8>)
  48428. 801409e: 6013 str r3, [r2, #0]
  48429. 80140a0: 6b3b ldr r3, [r7, #48] @ 0x30
  48430. 80140a2: 6ada ldr r2, [r3, #44] @ 0x2c
  48431. 80140a4: 4613 mov r3, r2
  48432. 80140a6: 009b lsls r3, r3, #2
  48433. 80140a8: 4413 add r3, r2
  48434. 80140aa: 009b lsls r3, r3, #2
  48435. 80140ac: 4a16 ldr r2, [pc, #88] @ (8014108 <xTaskGenericNotifyFromISR+0x1bc>)
  48436. 80140ae: 441a add r2, r3
  48437. 80140b0: 6b3b ldr r3, [r7, #48] @ 0x30
  48438. 80140b2: 3304 adds r3, #4
  48439. 80140b4: 4619 mov r1, r3
  48440. 80140b6: 4610 mov r0, r2
  48441. 80140b8: f7fd f8a7 bl 801120a <vListInsertEnd>
  48442. 80140bc: e005 b.n 80140ca <xTaskGenericNotifyFromISR+0x17e>
  48443. }
  48444. else
  48445. {
  48446. /* The delayed and ready lists cannot be accessed, so hold
  48447. this task pending until the scheduler is resumed. */
  48448. vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) );
  48449. 80140be: 6b3b ldr r3, [r7, #48] @ 0x30
  48450. 80140c0: 3318 adds r3, #24
  48451. 80140c2: 4619 mov r1, r3
  48452. 80140c4: 4811 ldr r0, [pc, #68] @ (801410c <xTaskGenericNotifyFromISR+0x1c0>)
  48453. 80140c6: f7fd f8a0 bl 801120a <vListInsertEnd>
  48454. }
  48455. if( pxTCB->uxPriority > pxCurrentTCB->uxPriority )
  48456. 80140ca: 6b3b ldr r3, [r7, #48] @ 0x30
  48457. 80140cc: 6ada ldr r2, [r3, #44] @ 0x2c
  48458. 80140ce: 4b10 ldr r3, [pc, #64] @ (8014110 <xTaskGenericNotifyFromISR+0x1c4>)
  48459. 80140d0: 681b ldr r3, [r3, #0]
  48460. 80140d2: 6adb ldr r3, [r3, #44] @ 0x2c
  48461. 80140d4: 429a cmp r2, r3
  48462. 80140d6: d908 bls.n 80140ea <xTaskGenericNotifyFromISR+0x19e>
  48463. {
  48464. /* The notified task has a priority above the currently
  48465. executing task so a yield is required. */
  48466. if( pxHigherPriorityTaskWoken != NULL )
  48467. 80140d8: 6c3b ldr r3, [r7, #64] @ 0x40
  48468. 80140da: 2b00 cmp r3, #0
  48469. 80140dc: d002 beq.n 80140e4 <xTaskGenericNotifyFromISR+0x198>
  48470. {
  48471. *pxHigherPriorityTaskWoken = pdTRUE;
  48472. 80140de: 6c3b ldr r3, [r7, #64] @ 0x40
  48473. 80140e0: 2201 movs r2, #1
  48474. 80140e2: 601a str r2, [r3, #0]
  48475. }
  48476. /* Mark that a yield is pending in case the user is not
  48477. using the "xHigherPriorityTaskWoken" parameter to an ISR
  48478. safe FreeRTOS function. */
  48479. xYieldPending = pdTRUE;
  48480. 80140e4: 4b0b ldr r3, [pc, #44] @ (8014114 <xTaskGenericNotifyFromISR+0x1c8>)
  48481. 80140e6: 2201 movs r2, #1
  48482. 80140e8: 601a str r2, [r3, #0]
  48483. 80140ea: 6afb ldr r3, [r7, #44] @ 0x2c
  48484. 80140ec: 613b str r3, [r7, #16]
  48485. __asm volatile
  48486. 80140ee: 693b ldr r3, [r7, #16]
  48487. 80140f0: f383 8811 msr BASEPRI, r3
  48488. }
  48489. 80140f4: bf00 nop
  48490. }
  48491. }
  48492. }
  48493. portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  48494. return xReturn;
  48495. 80140f6: 6b7b ldr r3, [r7, #52] @ 0x34
  48496. }
  48497. 80140f8: 4618 mov r0, r3
  48498. 80140fa: 3738 adds r7, #56 @ 0x38
  48499. 80140fc: 46bd mov sp, r7
  48500. 80140fe: bd80 pop {r7, pc}
  48501. 8014100: 2400418c .word 0x2400418c
  48502. 8014104: 2400416c .word 0x2400416c
  48503. 8014108: 24003c94 .word 0x24003c94
  48504. 801410c: 24004124 .word 0x24004124
  48505. 8014110: 24003c90 .word 0x24003c90
  48506. 8014114: 24004178 .word 0x24004178
  48507. 08014118 <xTaskNotifyStateClear>:
  48508. /*-----------------------------------------------------------*/
  48509. #if( configUSE_TASK_NOTIFICATIONS == 1 )
  48510. BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask )
  48511. {
  48512. 8014118: b580 push {r7, lr}
  48513. 801411a: b084 sub sp, #16
  48514. 801411c: af00 add r7, sp, #0
  48515. 801411e: 6078 str r0, [r7, #4]
  48516. TCB_t *pxTCB;
  48517. BaseType_t xReturn;
  48518. /* If null is passed in here then it is the calling task that is having
  48519. its notification state cleared. */
  48520. pxTCB = prvGetTCBFromHandle( xTask );
  48521. 8014120: 687b ldr r3, [r7, #4]
  48522. 8014122: 2b00 cmp r3, #0
  48523. 8014124: d102 bne.n 801412c <xTaskNotifyStateClear+0x14>
  48524. 8014126: 4b0e ldr r3, [pc, #56] @ (8014160 <xTaskNotifyStateClear+0x48>)
  48525. 8014128: 681b ldr r3, [r3, #0]
  48526. 801412a: e000 b.n 801412e <xTaskNotifyStateClear+0x16>
  48527. 801412c: 687b ldr r3, [r7, #4]
  48528. 801412e: 60bb str r3, [r7, #8]
  48529. taskENTER_CRITICAL();
  48530. 8014130: f000 fcfa bl 8014b28 <vPortEnterCritical>
  48531. {
  48532. if( pxTCB->ucNotifyState == taskNOTIFICATION_RECEIVED )
  48533. 8014134: 68bb ldr r3, [r7, #8]
  48534. 8014136: f893 30a4 ldrb.w r3, [r3, #164] @ 0xa4
  48535. 801413a: b2db uxtb r3, r3
  48536. 801413c: 2b02 cmp r3, #2
  48537. 801413e: d106 bne.n 801414e <xTaskNotifyStateClear+0x36>
  48538. {
  48539. pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION;
  48540. 8014140: 68bb ldr r3, [r7, #8]
  48541. 8014142: 2200 movs r2, #0
  48542. 8014144: f883 20a4 strb.w r2, [r3, #164] @ 0xa4
  48543. xReturn = pdPASS;
  48544. 8014148: 2301 movs r3, #1
  48545. 801414a: 60fb str r3, [r7, #12]
  48546. 801414c: e001 b.n 8014152 <xTaskNotifyStateClear+0x3a>
  48547. }
  48548. else
  48549. {
  48550. xReturn = pdFAIL;
  48551. 801414e: 2300 movs r3, #0
  48552. 8014150: 60fb str r3, [r7, #12]
  48553. }
  48554. }
  48555. taskEXIT_CRITICAL();
  48556. 8014152: f000 fd1b bl 8014b8c <vPortExitCritical>
  48557. return xReturn;
  48558. 8014156: 68fb ldr r3, [r7, #12]
  48559. }
  48560. 8014158: 4618 mov r0, r3
  48561. 801415a: 3710 adds r7, #16
  48562. 801415c: 46bd mov sp, r7
  48563. 801415e: bd80 pop {r7, pc}
  48564. 8014160: 24003c90 .word 0x24003c90
  48565. 08014164 <prvAddCurrentTaskToDelayedList>:
  48566. #endif
  48567. /*-----------------------------------------------------------*/
  48568. static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely )
  48569. {
  48570. 8014164: b580 push {r7, lr}
  48571. 8014166: b084 sub sp, #16
  48572. 8014168: af00 add r7, sp, #0
  48573. 801416a: 6078 str r0, [r7, #4]
  48574. 801416c: 6039 str r1, [r7, #0]
  48575. TickType_t xTimeToWake;
  48576. const TickType_t xConstTickCount = xTickCount;
  48577. 801416e: 4b21 ldr r3, [pc, #132] @ (80141f4 <prvAddCurrentTaskToDelayedList+0x90>)
  48578. 8014170: 681b ldr r3, [r3, #0]
  48579. 8014172: 60fb str r3, [r7, #12]
  48580. }
  48581. #endif
  48582. /* Remove the task from the ready list before adding it to the blocked list
  48583. as the same list item is used for both lists. */
  48584. if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
  48585. 8014174: 4b20 ldr r3, [pc, #128] @ (80141f8 <prvAddCurrentTaskToDelayedList+0x94>)
  48586. 8014176: 681b ldr r3, [r3, #0]
  48587. 8014178: 3304 adds r3, #4
  48588. 801417a: 4618 mov r0, r3
  48589. 801417c: f7fd f8a2 bl 80112c4 <uxListRemove>
  48590. mtCOVERAGE_TEST_MARKER();
  48591. }
  48592. #if ( INCLUDE_vTaskSuspend == 1 )
  48593. {
  48594. if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) )
  48595. 8014180: 687b ldr r3, [r7, #4]
  48596. 8014182: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  48597. 8014186: d10a bne.n 801419e <prvAddCurrentTaskToDelayedList+0x3a>
  48598. 8014188: 683b ldr r3, [r7, #0]
  48599. 801418a: 2b00 cmp r3, #0
  48600. 801418c: d007 beq.n 801419e <prvAddCurrentTaskToDelayedList+0x3a>
  48601. {
  48602. /* Add the task to the suspended task list instead of a delayed task
  48603. list to ensure it is not woken by a timing event. It will block
  48604. indefinitely. */
  48605. vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) );
  48606. 801418e: 4b1a ldr r3, [pc, #104] @ (80141f8 <prvAddCurrentTaskToDelayedList+0x94>)
  48607. 8014190: 681b ldr r3, [r3, #0]
  48608. 8014192: 3304 adds r3, #4
  48609. 8014194: 4619 mov r1, r3
  48610. 8014196: 4819 ldr r0, [pc, #100] @ (80141fc <prvAddCurrentTaskToDelayedList+0x98>)
  48611. 8014198: f7fd f837 bl 801120a <vListInsertEnd>
  48612. /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */
  48613. ( void ) xCanBlockIndefinitely;
  48614. }
  48615. #endif /* INCLUDE_vTaskSuspend */
  48616. }
  48617. 801419c: e026 b.n 80141ec <prvAddCurrentTaskToDelayedList+0x88>
  48618. xTimeToWake = xConstTickCount + xTicksToWait;
  48619. 801419e: 68fa ldr r2, [r7, #12]
  48620. 80141a0: 687b ldr r3, [r7, #4]
  48621. 80141a2: 4413 add r3, r2
  48622. 80141a4: 60bb str r3, [r7, #8]
  48623. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake );
  48624. 80141a6: 4b14 ldr r3, [pc, #80] @ (80141f8 <prvAddCurrentTaskToDelayedList+0x94>)
  48625. 80141a8: 681b ldr r3, [r3, #0]
  48626. 80141aa: 68ba ldr r2, [r7, #8]
  48627. 80141ac: 605a str r2, [r3, #4]
  48628. if( xTimeToWake < xConstTickCount )
  48629. 80141ae: 68ba ldr r2, [r7, #8]
  48630. 80141b0: 68fb ldr r3, [r7, #12]
  48631. 80141b2: 429a cmp r2, r3
  48632. 80141b4: d209 bcs.n 80141ca <prvAddCurrentTaskToDelayedList+0x66>
  48633. vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
  48634. 80141b6: 4b12 ldr r3, [pc, #72] @ (8014200 <prvAddCurrentTaskToDelayedList+0x9c>)
  48635. 80141b8: 681a ldr r2, [r3, #0]
  48636. 80141ba: 4b0f ldr r3, [pc, #60] @ (80141f8 <prvAddCurrentTaskToDelayedList+0x94>)
  48637. 80141bc: 681b ldr r3, [r3, #0]
  48638. 80141be: 3304 adds r3, #4
  48639. 80141c0: 4619 mov r1, r3
  48640. 80141c2: 4610 mov r0, r2
  48641. 80141c4: f7fd f845 bl 8011252 <vListInsert>
  48642. }
  48643. 80141c8: e010 b.n 80141ec <prvAddCurrentTaskToDelayedList+0x88>
  48644. vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
  48645. 80141ca: 4b0e ldr r3, [pc, #56] @ (8014204 <prvAddCurrentTaskToDelayedList+0xa0>)
  48646. 80141cc: 681a ldr r2, [r3, #0]
  48647. 80141ce: 4b0a ldr r3, [pc, #40] @ (80141f8 <prvAddCurrentTaskToDelayedList+0x94>)
  48648. 80141d0: 681b ldr r3, [r3, #0]
  48649. 80141d2: 3304 adds r3, #4
  48650. 80141d4: 4619 mov r1, r3
  48651. 80141d6: 4610 mov r0, r2
  48652. 80141d8: f7fd f83b bl 8011252 <vListInsert>
  48653. if( xTimeToWake < xNextTaskUnblockTime )
  48654. 80141dc: 4b0a ldr r3, [pc, #40] @ (8014208 <prvAddCurrentTaskToDelayedList+0xa4>)
  48655. 80141de: 681b ldr r3, [r3, #0]
  48656. 80141e0: 68ba ldr r2, [r7, #8]
  48657. 80141e2: 429a cmp r2, r3
  48658. 80141e4: d202 bcs.n 80141ec <prvAddCurrentTaskToDelayedList+0x88>
  48659. xNextTaskUnblockTime = xTimeToWake;
  48660. 80141e6: 4a08 ldr r2, [pc, #32] @ (8014208 <prvAddCurrentTaskToDelayedList+0xa4>)
  48661. 80141e8: 68bb ldr r3, [r7, #8]
  48662. 80141ea: 6013 str r3, [r2, #0]
  48663. }
  48664. 80141ec: bf00 nop
  48665. 80141ee: 3710 adds r7, #16
  48666. 80141f0: 46bd mov sp, r7
  48667. 80141f2: bd80 pop {r7, pc}
  48668. 80141f4: 24004168 .word 0x24004168
  48669. 80141f8: 24003c90 .word 0x24003c90
  48670. 80141fc: 24004150 .word 0x24004150
  48671. 8014200: 24004120 .word 0x24004120
  48672. 8014204: 2400411c .word 0x2400411c
  48673. 8014208: 24004184 .word 0x24004184
  48674. 0801420c <xTimerCreateTimerTask>:
  48675. TimerCallbackFunction_t pxCallbackFunction,
  48676. Timer_t *pxNewTimer ) PRIVILEGED_FUNCTION;
  48677. /*-----------------------------------------------------------*/
  48678. BaseType_t xTimerCreateTimerTask( void )
  48679. {
  48680. 801420c: b580 push {r7, lr}
  48681. 801420e: b08a sub sp, #40 @ 0x28
  48682. 8014210: af04 add r7, sp, #16
  48683. BaseType_t xReturn = pdFAIL;
  48684. 8014212: 2300 movs r3, #0
  48685. 8014214: 617b str r3, [r7, #20]
  48686. /* This function is called when the scheduler is started if
  48687. configUSE_TIMERS is set to 1. Check that the infrastructure used by the
  48688. timer service task has been created/initialised. If timers have already
  48689. been created then the initialisation will already have been performed. */
  48690. prvCheckForValidListAndQueue();
  48691. 8014216: f000 fb13 bl 8014840 <prvCheckForValidListAndQueue>
  48692. if( xTimerQueue != NULL )
  48693. 801421a: 4b1d ldr r3, [pc, #116] @ (8014290 <xTimerCreateTimerTask+0x84>)
  48694. 801421c: 681b ldr r3, [r3, #0]
  48695. 801421e: 2b00 cmp r3, #0
  48696. 8014220: d021 beq.n 8014266 <xTimerCreateTimerTask+0x5a>
  48697. {
  48698. #if( configSUPPORT_STATIC_ALLOCATION == 1 )
  48699. {
  48700. StaticTask_t *pxTimerTaskTCBBuffer = NULL;
  48701. 8014222: 2300 movs r3, #0
  48702. 8014224: 60fb str r3, [r7, #12]
  48703. StackType_t *pxTimerTaskStackBuffer = NULL;
  48704. 8014226: 2300 movs r3, #0
  48705. 8014228: 60bb str r3, [r7, #8]
  48706. uint32_t ulTimerTaskStackSize;
  48707. vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize );
  48708. 801422a: 1d3a adds r2, r7, #4
  48709. 801422c: f107 0108 add.w r1, r7, #8
  48710. 8014230: f107 030c add.w r3, r7, #12
  48711. 8014234: 4618 mov r0, r3
  48712. 8014236: f7fc ffa1 bl 801117c <vApplicationGetTimerTaskMemory>
  48713. xTimerTaskHandle = xTaskCreateStatic( prvTimerTask,
  48714. 801423a: 6879 ldr r1, [r7, #4]
  48715. 801423c: 68bb ldr r3, [r7, #8]
  48716. 801423e: 68fa ldr r2, [r7, #12]
  48717. 8014240: 9202 str r2, [sp, #8]
  48718. 8014242: 9301 str r3, [sp, #4]
  48719. 8014244: 2302 movs r3, #2
  48720. 8014246: 9300 str r3, [sp, #0]
  48721. 8014248: 2300 movs r3, #0
  48722. 801424a: 460a mov r2, r1
  48723. 801424c: 4911 ldr r1, [pc, #68] @ (8014294 <xTimerCreateTimerTask+0x88>)
  48724. 801424e: 4812 ldr r0, [pc, #72] @ (8014298 <xTimerCreateTimerTask+0x8c>)
  48725. 8014250: f7fe fd1c bl 8012c8c <xTaskCreateStatic>
  48726. 8014254: 4603 mov r3, r0
  48727. 8014256: 4a11 ldr r2, [pc, #68] @ (801429c <xTimerCreateTimerTask+0x90>)
  48728. 8014258: 6013 str r3, [r2, #0]
  48729. NULL,
  48730. ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT,
  48731. pxTimerTaskStackBuffer,
  48732. pxTimerTaskTCBBuffer );
  48733. if( xTimerTaskHandle != NULL )
  48734. 801425a: 4b10 ldr r3, [pc, #64] @ (801429c <xTimerCreateTimerTask+0x90>)
  48735. 801425c: 681b ldr r3, [r3, #0]
  48736. 801425e: 2b00 cmp r3, #0
  48737. 8014260: d001 beq.n 8014266 <xTimerCreateTimerTask+0x5a>
  48738. {
  48739. xReturn = pdPASS;
  48740. 8014262: 2301 movs r3, #1
  48741. 8014264: 617b str r3, [r7, #20]
  48742. else
  48743. {
  48744. mtCOVERAGE_TEST_MARKER();
  48745. }
  48746. configASSERT( xReturn );
  48747. 8014266: 697b ldr r3, [r7, #20]
  48748. 8014268: 2b00 cmp r3, #0
  48749. 801426a: d10b bne.n 8014284 <xTimerCreateTimerTask+0x78>
  48750. __asm volatile
  48751. 801426c: f04f 0350 mov.w r3, #80 @ 0x50
  48752. 8014270: f383 8811 msr BASEPRI, r3
  48753. 8014274: f3bf 8f6f isb sy
  48754. 8014278: f3bf 8f4f dsb sy
  48755. 801427c: 613b str r3, [r7, #16]
  48756. }
  48757. 801427e: bf00 nop
  48758. 8014280: bf00 nop
  48759. 8014282: e7fd b.n 8014280 <xTimerCreateTimerTask+0x74>
  48760. return xReturn;
  48761. 8014284: 697b ldr r3, [r7, #20]
  48762. }
  48763. 8014286: 4618 mov r0, r3
  48764. 8014288: 3718 adds r7, #24
  48765. 801428a: 46bd mov sp, r7
  48766. 801428c: bd80 pop {r7, pc}
  48767. 801428e: bf00 nop
  48768. 8014290: 240041c0 .word 0x240041c0
  48769. 8014294: 0802cb74 .word 0x0802cb74
  48770. 8014298: 080143d9 .word 0x080143d9
  48771. 801429c: 240041c4 .word 0x240041c4
  48772. 080142a0 <xTimerGenericCommand>:
  48773. }
  48774. }
  48775. /*-----------------------------------------------------------*/
  48776. BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait )
  48777. {
  48778. 80142a0: b580 push {r7, lr}
  48779. 80142a2: b08a sub sp, #40 @ 0x28
  48780. 80142a4: af00 add r7, sp, #0
  48781. 80142a6: 60f8 str r0, [r7, #12]
  48782. 80142a8: 60b9 str r1, [r7, #8]
  48783. 80142aa: 607a str r2, [r7, #4]
  48784. 80142ac: 603b str r3, [r7, #0]
  48785. BaseType_t xReturn = pdFAIL;
  48786. 80142ae: 2300 movs r3, #0
  48787. 80142b0: 627b str r3, [r7, #36] @ 0x24
  48788. DaemonTaskMessage_t xMessage;
  48789. configASSERT( xTimer );
  48790. 80142b2: 68fb ldr r3, [r7, #12]
  48791. 80142b4: 2b00 cmp r3, #0
  48792. 80142b6: d10b bne.n 80142d0 <xTimerGenericCommand+0x30>
  48793. __asm volatile
  48794. 80142b8: f04f 0350 mov.w r3, #80 @ 0x50
  48795. 80142bc: f383 8811 msr BASEPRI, r3
  48796. 80142c0: f3bf 8f6f isb sy
  48797. 80142c4: f3bf 8f4f dsb sy
  48798. 80142c8: 623b str r3, [r7, #32]
  48799. }
  48800. 80142ca: bf00 nop
  48801. 80142cc: bf00 nop
  48802. 80142ce: e7fd b.n 80142cc <xTimerGenericCommand+0x2c>
  48803. /* Send a message to the timer service task to perform a particular action
  48804. on a particular timer definition. */
  48805. if( xTimerQueue != NULL )
  48806. 80142d0: 4b19 ldr r3, [pc, #100] @ (8014338 <xTimerGenericCommand+0x98>)
  48807. 80142d2: 681b ldr r3, [r3, #0]
  48808. 80142d4: 2b00 cmp r3, #0
  48809. 80142d6: d02a beq.n 801432e <xTimerGenericCommand+0x8e>
  48810. {
  48811. /* Send a command to the timer service task to start the xTimer timer. */
  48812. xMessage.xMessageID = xCommandID;
  48813. 80142d8: 68bb ldr r3, [r7, #8]
  48814. 80142da: 613b str r3, [r7, #16]
  48815. xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;
  48816. 80142dc: 687b ldr r3, [r7, #4]
  48817. 80142de: 617b str r3, [r7, #20]
  48818. xMessage.u.xTimerParameters.pxTimer = xTimer;
  48819. 80142e0: 68fb ldr r3, [r7, #12]
  48820. 80142e2: 61bb str r3, [r7, #24]
  48821. if( xCommandID < tmrFIRST_FROM_ISR_COMMAND )
  48822. 80142e4: 68bb ldr r3, [r7, #8]
  48823. 80142e6: 2b05 cmp r3, #5
  48824. 80142e8: dc18 bgt.n 801431c <xTimerGenericCommand+0x7c>
  48825. {
  48826. if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING )
  48827. 80142ea: f7ff fb7f bl 80139ec <xTaskGetSchedulerState>
  48828. 80142ee: 4603 mov r3, r0
  48829. 80142f0: 2b02 cmp r3, #2
  48830. 80142f2: d109 bne.n 8014308 <xTimerGenericCommand+0x68>
  48831. {
  48832. xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait );
  48833. 80142f4: 4b10 ldr r3, [pc, #64] @ (8014338 <xTimerGenericCommand+0x98>)
  48834. 80142f6: 6818 ldr r0, [r3, #0]
  48835. 80142f8: f107 0110 add.w r1, r7, #16
  48836. 80142fc: 2300 movs r3, #0
  48837. 80142fe: 6b3a ldr r2, [r7, #48] @ 0x30
  48838. 8014300: f7fd fa76 bl 80117f0 <xQueueGenericSend>
  48839. 8014304: 6278 str r0, [r7, #36] @ 0x24
  48840. 8014306: e012 b.n 801432e <xTimerGenericCommand+0x8e>
  48841. }
  48842. else
  48843. {
  48844. xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY );
  48845. 8014308: 4b0b ldr r3, [pc, #44] @ (8014338 <xTimerGenericCommand+0x98>)
  48846. 801430a: 6818 ldr r0, [r3, #0]
  48847. 801430c: f107 0110 add.w r1, r7, #16
  48848. 8014310: 2300 movs r3, #0
  48849. 8014312: 2200 movs r2, #0
  48850. 8014314: f7fd fa6c bl 80117f0 <xQueueGenericSend>
  48851. 8014318: 6278 str r0, [r7, #36] @ 0x24
  48852. 801431a: e008 b.n 801432e <xTimerGenericCommand+0x8e>
  48853. }
  48854. }
  48855. else
  48856. {
  48857. xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken );
  48858. 801431c: 4b06 ldr r3, [pc, #24] @ (8014338 <xTimerGenericCommand+0x98>)
  48859. 801431e: 6818 ldr r0, [r3, #0]
  48860. 8014320: f107 0110 add.w r1, r7, #16
  48861. 8014324: 2300 movs r3, #0
  48862. 8014326: 683a ldr r2, [r7, #0]
  48863. 8014328: f7fd fb64 bl 80119f4 <xQueueGenericSendFromISR>
  48864. 801432c: 6278 str r0, [r7, #36] @ 0x24
  48865. else
  48866. {
  48867. mtCOVERAGE_TEST_MARKER();
  48868. }
  48869. return xReturn;
  48870. 801432e: 6a7b ldr r3, [r7, #36] @ 0x24
  48871. }
  48872. 8014330: 4618 mov r0, r3
  48873. 8014332: 3728 adds r7, #40 @ 0x28
  48874. 8014334: 46bd mov sp, r7
  48875. 8014336: bd80 pop {r7, pc}
  48876. 8014338: 240041c0 .word 0x240041c0
  48877. 0801433c <prvProcessExpiredTimer>:
  48878. return pxTimer->pcTimerName;
  48879. }
  48880. /*-----------------------------------------------------------*/
  48881. static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow )
  48882. {
  48883. 801433c: b580 push {r7, lr}
  48884. 801433e: b088 sub sp, #32
  48885. 8014340: af02 add r7, sp, #8
  48886. 8014342: 6078 str r0, [r7, #4]
  48887. 8014344: 6039 str r1, [r7, #0]
  48888. BaseType_t xResult;
  48889. Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
  48890. 8014346: 4b23 ldr r3, [pc, #140] @ (80143d4 <prvProcessExpiredTimer+0x98>)
  48891. 8014348: 681b ldr r3, [r3, #0]
  48892. 801434a: 68db ldr r3, [r3, #12]
  48893. 801434c: 68db ldr r3, [r3, #12]
  48894. 801434e: 617b str r3, [r7, #20]
  48895. /* Remove the timer from the list of active timers. A check has already
  48896. been performed to ensure the list is not empty. */
  48897. ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
  48898. 8014350: 697b ldr r3, [r7, #20]
  48899. 8014352: 3304 adds r3, #4
  48900. 8014354: 4618 mov r0, r3
  48901. 8014356: f7fc ffb5 bl 80112c4 <uxListRemove>
  48902. traceTIMER_EXPIRED( pxTimer );
  48903. /* If the timer is an auto-reload timer then calculate the next
  48904. expiry time and re-insert the timer in the list of active timers. */
  48905. if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 )
  48906. 801435a: 697b ldr r3, [r7, #20]
  48907. 801435c: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  48908. 8014360: f003 0304 and.w r3, r3, #4
  48909. 8014364: 2b00 cmp r3, #0
  48910. 8014366: d023 beq.n 80143b0 <prvProcessExpiredTimer+0x74>
  48911. {
  48912. /* The timer is inserted into a list using a time relative to anything
  48913. other than the current time. It will therefore be inserted into the
  48914. correct list relative to the time this task thinks it is now. */
  48915. if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) != pdFALSE )
  48916. 8014368: 697b ldr r3, [r7, #20]
  48917. 801436a: 699a ldr r2, [r3, #24]
  48918. 801436c: 687b ldr r3, [r7, #4]
  48919. 801436e: 18d1 adds r1, r2, r3
  48920. 8014370: 687b ldr r3, [r7, #4]
  48921. 8014372: 683a ldr r2, [r7, #0]
  48922. 8014374: 6978 ldr r0, [r7, #20]
  48923. 8014376: f000 f8d5 bl 8014524 <prvInsertTimerInActiveList>
  48924. 801437a: 4603 mov r3, r0
  48925. 801437c: 2b00 cmp r3, #0
  48926. 801437e: d020 beq.n 80143c2 <prvProcessExpiredTimer+0x86>
  48927. {
  48928. /* The timer expired before it was added to the active timer
  48929. list. Reload it now. */
  48930. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY );
  48931. 8014380: 2300 movs r3, #0
  48932. 8014382: 9300 str r3, [sp, #0]
  48933. 8014384: 2300 movs r3, #0
  48934. 8014386: 687a ldr r2, [r7, #4]
  48935. 8014388: 2100 movs r1, #0
  48936. 801438a: 6978 ldr r0, [r7, #20]
  48937. 801438c: f7ff ff88 bl 80142a0 <xTimerGenericCommand>
  48938. 8014390: 6138 str r0, [r7, #16]
  48939. configASSERT( xResult );
  48940. 8014392: 693b ldr r3, [r7, #16]
  48941. 8014394: 2b00 cmp r3, #0
  48942. 8014396: d114 bne.n 80143c2 <prvProcessExpiredTimer+0x86>
  48943. __asm volatile
  48944. 8014398: f04f 0350 mov.w r3, #80 @ 0x50
  48945. 801439c: f383 8811 msr BASEPRI, r3
  48946. 80143a0: f3bf 8f6f isb sy
  48947. 80143a4: f3bf 8f4f dsb sy
  48948. 80143a8: 60fb str r3, [r7, #12]
  48949. }
  48950. 80143aa: bf00 nop
  48951. 80143ac: bf00 nop
  48952. 80143ae: e7fd b.n 80143ac <prvProcessExpiredTimer+0x70>
  48953. mtCOVERAGE_TEST_MARKER();
  48954. }
  48955. }
  48956. else
  48957. {
  48958. pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE;
  48959. 80143b0: 697b ldr r3, [r7, #20]
  48960. 80143b2: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  48961. 80143b6: f023 0301 bic.w r3, r3, #1
  48962. 80143ba: b2da uxtb r2, r3
  48963. 80143bc: 697b ldr r3, [r7, #20]
  48964. 80143be: f883 2028 strb.w r2, [r3, #40] @ 0x28
  48965. mtCOVERAGE_TEST_MARKER();
  48966. }
  48967. /* Call the timer callback. */
  48968. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  48969. 80143c2: 697b ldr r3, [r7, #20]
  48970. 80143c4: 6a1b ldr r3, [r3, #32]
  48971. 80143c6: 6978 ldr r0, [r7, #20]
  48972. 80143c8: 4798 blx r3
  48973. }
  48974. 80143ca: bf00 nop
  48975. 80143cc: 3718 adds r7, #24
  48976. 80143ce: 46bd mov sp, r7
  48977. 80143d0: bd80 pop {r7, pc}
  48978. 80143d2: bf00 nop
  48979. 80143d4: 240041b8 .word 0x240041b8
  48980. 080143d8 <prvTimerTask>:
  48981. /*-----------------------------------------------------------*/
  48982. static portTASK_FUNCTION( prvTimerTask, pvParameters )
  48983. {
  48984. 80143d8: b580 push {r7, lr}
  48985. 80143da: b084 sub sp, #16
  48986. 80143dc: af00 add r7, sp, #0
  48987. 80143de: 6078 str r0, [r7, #4]
  48988. for( ;; )
  48989. {
  48990. /* Query the timers list to see if it contains any timers, and if so,
  48991. obtain the time at which the next timer will expire. */
  48992. xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty );
  48993. 80143e0: f107 0308 add.w r3, r7, #8
  48994. 80143e4: 4618 mov r0, r3
  48995. 80143e6: f000 f859 bl 801449c <prvGetNextExpireTime>
  48996. 80143ea: 60f8 str r0, [r7, #12]
  48997. /* If a timer has expired, process it. Otherwise, block this task
  48998. until either a timer does expire, or a command is received. */
  48999. prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty );
  49000. 80143ec: 68bb ldr r3, [r7, #8]
  49001. 80143ee: 4619 mov r1, r3
  49002. 80143f0: 68f8 ldr r0, [r7, #12]
  49003. 80143f2: f000 f805 bl 8014400 <prvProcessTimerOrBlockTask>
  49004. /* Empty the command queue. */
  49005. prvProcessReceivedCommands();
  49006. 80143f6: f000 f8d7 bl 80145a8 <prvProcessReceivedCommands>
  49007. xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty );
  49008. 80143fa: bf00 nop
  49009. 80143fc: e7f0 b.n 80143e0 <prvTimerTask+0x8>
  49010. ...
  49011. 08014400 <prvProcessTimerOrBlockTask>:
  49012. }
  49013. }
  49014. /*-----------------------------------------------------------*/
  49015. static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty )
  49016. {
  49017. 8014400: b580 push {r7, lr}
  49018. 8014402: b084 sub sp, #16
  49019. 8014404: af00 add r7, sp, #0
  49020. 8014406: 6078 str r0, [r7, #4]
  49021. 8014408: 6039 str r1, [r7, #0]
  49022. TickType_t xTimeNow;
  49023. BaseType_t xTimerListsWereSwitched;
  49024. vTaskSuspendAll();
  49025. 801440a: f7fe fea3 bl 8013154 <vTaskSuspendAll>
  49026. /* Obtain the time now to make an assessment as to whether the timer
  49027. has expired or not. If obtaining the time causes the lists to switch
  49028. then don't process this timer as any timers that remained in the list
  49029. when the lists were switched will have been processed within the
  49030. prvSampleTimeNow() function. */
  49031. xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
  49032. 801440e: f107 0308 add.w r3, r7, #8
  49033. 8014412: 4618 mov r0, r3
  49034. 8014414: f000 f866 bl 80144e4 <prvSampleTimeNow>
  49035. 8014418: 60f8 str r0, [r7, #12]
  49036. if( xTimerListsWereSwitched == pdFALSE )
  49037. 801441a: 68bb ldr r3, [r7, #8]
  49038. 801441c: 2b00 cmp r3, #0
  49039. 801441e: d130 bne.n 8014482 <prvProcessTimerOrBlockTask+0x82>
  49040. {
  49041. /* The tick count has not overflowed, has the timer expired? */
  49042. if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) )
  49043. 8014420: 683b ldr r3, [r7, #0]
  49044. 8014422: 2b00 cmp r3, #0
  49045. 8014424: d10a bne.n 801443c <prvProcessTimerOrBlockTask+0x3c>
  49046. 8014426: 687a ldr r2, [r7, #4]
  49047. 8014428: 68fb ldr r3, [r7, #12]
  49048. 801442a: 429a cmp r2, r3
  49049. 801442c: d806 bhi.n 801443c <prvProcessTimerOrBlockTask+0x3c>
  49050. {
  49051. ( void ) xTaskResumeAll();
  49052. 801442e: f7fe fe9f bl 8013170 <xTaskResumeAll>
  49053. prvProcessExpiredTimer( xNextExpireTime, xTimeNow );
  49054. 8014432: 68f9 ldr r1, [r7, #12]
  49055. 8014434: 6878 ldr r0, [r7, #4]
  49056. 8014436: f7ff ff81 bl 801433c <prvProcessExpiredTimer>
  49057. else
  49058. {
  49059. ( void ) xTaskResumeAll();
  49060. }
  49061. }
  49062. }
  49063. 801443a: e024 b.n 8014486 <prvProcessTimerOrBlockTask+0x86>
  49064. if( xListWasEmpty != pdFALSE )
  49065. 801443c: 683b ldr r3, [r7, #0]
  49066. 801443e: 2b00 cmp r3, #0
  49067. 8014440: d008 beq.n 8014454 <prvProcessTimerOrBlockTask+0x54>
  49068. xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList );
  49069. 8014442: 4b13 ldr r3, [pc, #76] @ (8014490 <prvProcessTimerOrBlockTask+0x90>)
  49070. 8014444: 681b ldr r3, [r3, #0]
  49071. 8014446: 681b ldr r3, [r3, #0]
  49072. 8014448: 2b00 cmp r3, #0
  49073. 801444a: d101 bne.n 8014450 <prvProcessTimerOrBlockTask+0x50>
  49074. 801444c: 2301 movs r3, #1
  49075. 801444e: e000 b.n 8014452 <prvProcessTimerOrBlockTask+0x52>
  49076. 8014450: 2300 movs r3, #0
  49077. 8014452: 603b str r3, [r7, #0]
  49078. vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty );
  49079. 8014454: 4b0f ldr r3, [pc, #60] @ (8014494 <prvProcessTimerOrBlockTask+0x94>)
  49080. 8014456: 6818 ldr r0, [r3, #0]
  49081. 8014458: 687a ldr r2, [r7, #4]
  49082. 801445a: 68fb ldr r3, [r7, #12]
  49083. 801445c: 1ad3 subs r3, r2, r3
  49084. 801445e: 683a ldr r2, [r7, #0]
  49085. 8014460: 4619 mov r1, r3
  49086. 8014462: f7fe f847 bl 80124f4 <vQueueWaitForMessageRestricted>
  49087. if( xTaskResumeAll() == pdFALSE )
  49088. 8014466: f7fe fe83 bl 8013170 <xTaskResumeAll>
  49089. 801446a: 4603 mov r3, r0
  49090. 801446c: 2b00 cmp r3, #0
  49091. 801446e: d10a bne.n 8014486 <prvProcessTimerOrBlockTask+0x86>
  49092. portYIELD_WITHIN_API();
  49093. 8014470: 4b09 ldr r3, [pc, #36] @ (8014498 <prvProcessTimerOrBlockTask+0x98>)
  49094. 8014472: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  49095. 8014476: 601a str r2, [r3, #0]
  49096. 8014478: f3bf 8f4f dsb sy
  49097. 801447c: f3bf 8f6f isb sy
  49098. }
  49099. 8014480: e001 b.n 8014486 <prvProcessTimerOrBlockTask+0x86>
  49100. ( void ) xTaskResumeAll();
  49101. 8014482: f7fe fe75 bl 8013170 <xTaskResumeAll>
  49102. }
  49103. 8014486: bf00 nop
  49104. 8014488: 3710 adds r7, #16
  49105. 801448a: 46bd mov sp, r7
  49106. 801448c: bd80 pop {r7, pc}
  49107. 801448e: bf00 nop
  49108. 8014490: 240041bc .word 0x240041bc
  49109. 8014494: 240041c0 .word 0x240041c0
  49110. 8014498: e000ed04 .word 0xe000ed04
  49111. 0801449c <prvGetNextExpireTime>:
  49112. /*-----------------------------------------------------------*/
  49113. static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty )
  49114. {
  49115. 801449c: b480 push {r7}
  49116. 801449e: b085 sub sp, #20
  49117. 80144a0: af00 add r7, sp, #0
  49118. 80144a2: 6078 str r0, [r7, #4]
  49119. the timer with the nearest expiry time will expire. If there are no
  49120. active timers then just set the next expire time to 0. That will cause
  49121. this task to unblock when the tick count overflows, at which point the
  49122. timer lists will be switched and the next expiry time can be
  49123. re-assessed. */
  49124. *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList );
  49125. 80144a4: 4b0e ldr r3, [pc, #56] @ (80144e0 <prvGetNextExpireTime+0x44>)
  49126. 80144a6: 681b ldr r3, [r3, #0]
  49127. 80144a8: 681b ldr r3, [r3, #0]
  49128. 80144aa: 2b00 cmp r3, #0
  49129. 80144ac: d101 bne.n 80144b2 <prvGetNextExpireTime+0x16>
  49130. 80144ae: 2201 movs r2, #1
  49131. 80144b0: e000 b.n 80144b4 <prvGetNextExpireTime+0x18>
  49132. 80144b2: 2200 movs r2, #0
  49133. 80144b4: 687b ldr r3, [r7, #4]
  49134. 80144b6: 601a str r2, [r3, #0]
  49135. if( *pxListWasEmpty == pdFALSE )
  49136. 80144b8: 687b ldr r3, [r7, #4]
  49137. 80144ba: 681b ldr r3, [r3, #0]
  49138. 80144bc: 2b00 cmp r3, #0
  49139. 80144be: d105 bne.n 80144cc <prvGetNextExpireTime+0x30>
  49140. {
  49141. xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );
  49142. 80144c0: 4b07 ldr r3, [pc, #28] @ (80144e0 <prvGetNextExpireTime+0x44>)
  49143. 80144c2: 681b ldr r3, [r3, #0]
  49144. 80144c4: 68db ldr r3, [r3, #12]
  49145. 80144c6: 681b ldr r3, [r3, #0]
  49146. 80144c8: 60fb str r3, [r7, #12]
  49147. 80144ca: e001 b.n 80144d0 <prvGetNextExpireTime+0x34>
  49148. }
  49149. else
  49150. {
  49151. /* Ensure the task unblocks when the tick count rolls over. */
  49152. xNextExpireTime = ( TickType_t ) 0U;
  49153. 80144cc: 2300 movs r3, #0
  49154. 80144ce: 60fb str r3, [r7, #12]
  49155. }
  49156. return xNextExpireTime;
  49157. 80144d0: 68fb ldr r3, [r7, #12]
  49158. }
  49159. 80144d2: 4618 mov r0, r3
  49160. 80144d4: 3714 adds r7, #20
  49161. 80144d6: 46bd mov sp, r7
  49162. 80144d8: f85d 7b04 ldr.w r7, [sp], #4
  49163. 80144dc: 4770 bx lr
  49164. 80144de: bf00 nop
  49165. 80144e0: 240041b8 .word 0x240041b8
  49166. 080144e4 <prvSampleTimeNow>:
  49167. /*-----------------------------------------------------------*/
  49168. static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched )
  49169. {
  49170. 80144e4: b580 push {r7, lr}
  49171. 80144e6: b084 sub sp, #16
  49172. 80144e8: af00 add r7, sp, #0
  49173. 80144ea: 6078 str r0, [r7, #4]
  49174. TickType_t xTimeNow;
  49175. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  49176. xTimeNow = xTaskGetTickCount();
  49177. 80144ec: f7fe fede bl 80132ac <xTaskGetTickCount>
  49178. 80144f0: 60f8 str r0, [r7, #12]
  49179. if( xTimeNow < xLastTime )
  49180. 80144f2: 4b0b ldr r3, [pc, #44] @ (8014520 <prvSampleTimeNow+0x3c>)
  49181. 80144f4: 681b ldr r3, [r3, #0]
  49182. 80144f6: 68fa ldr r2, [r7, #12]
  49183. 80144f8: 429a cmp r2, r3
  49184. 80144fa: d205 bcs.n 8014508 <prvSampleTimeNow+0x24>
  49185. {
  49186. prvSwitchTimerLists();
  49187. 80144fc: f000 f93a bl 8014774 <prvSwitchTimerLists>
  49188. *pxTimerListsWereSwitched = pdTRUE;
  49189. 8014500: 687b ldr r3, [r7, #4]
  49190. 8014502: 2201 movs r2, #1
  49191. 8014504: 601a str r2, [r3, #0]
  49192. 8014506: e002 b.n 801450e <prvSampleTimeNow+0x2a>
  49193. }
  49194. else
  49195. {
  49196. *pxTimerListsWereSwitched = pdFALSE;
  49197. 8014508: 687b ldr r3, [r7, #4]
  49198. 801450a: 2200 movs r2, #0
  49199. 801450c: 601a str r2, [r3, #0]
  49200. }
  49201. xLastTime = xTimeNow;
  49202. 801450e: 4a04 ldr r2, [pc, #16] @ (8014520 <prvSampleTimeNow+0x3c>)
  49203. 8014510: 68fb ldr r3, [r7, #12]
  49204. 8014512: 6013 str r3, [r2, #0]
  49205. return xTimeNow;
  49206. 8014514: 68fb ldr r3, [r7, #12]
  49207. }
  49208. 8014516: 4618 mov r0, r3
  49209. 8014518: 3710 adds r7, #16
  49210. 801451a: 46bd mov sp, r7
  49211. 801451c: bd80 pop {r7, pc}
  49212. 801451e: bf00 nop
  49213. 8014520: 240041c8 .word 0x240041c8
  49214. 08014524 <prvInsertTimerInActiveList>:
  49215. /*-----------------------------------------------------------*/
  49216. static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime )
  49217. {
  49218. 8014524: b580 push {r7, lr}
  49219. 8014526: b086 sub sp, #24
  49220. 8014528: af00 add r7, sp, #0
  49221. 801452a: 60f8 str r0, [r7, #12]
  49222. 801452c: 60b9 str r1, [r7, #8]
  49223. 801452e: 607a str r2, [r7, #4]
  49224. 8014530: 603b str r3, [r7, #0]
  49225. BaseType_t xProcessTimerNow = pdFALSE;
  49226. 8014532: 2300 movs r3, #0
  49227. 8014534: 617b str r3, [r7, #20]
  49228. listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime );
  49229. 8014536: 68fb ldr r3, [r7, #12]
  49230. 8014538: 68ba ldr r2, [r7, #8]
  49231. 801453a: 605a str r2, [r3, #4]
  49232. listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );
  49233. 801453c: 68fb ldr r3, [r7, #12]
  49234. 801453e: 68fa ldr r2, [r7, #12]
  49235. 8014540: 611a str r2, [r3, #16]
  49236. if( xNextExpiryTime <= xTimeNow )
  49237. 8014542: 68ba ldr r2, [r7, #8]
  49238. 8014544: 687b ldr r3, [r7, #4]
  49239. 8014546: 429a cmp r2, r3
  49240. 8014548: d812 bhi.n 8014570 <prvInsertTimerInActiveList+0x4c>
  49241. {
  49242. /* Has the expiry time elapsed between the command to start/reset a
  49243. timer was issued, and the time the command was processed? */
  49244. if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  49245. 801454a: 687a ldr r2, [r7, #4]
  49246. 801454c: 683b ldr r3, [r7, #0]
  49247. 801454e: 1ad2 subs r2, r2, r3
  49248. 8014550: 68fb ldr r3, [r7, #12]
  49249. 8014552: 699b ldr r3, [r3, #24]
  49250. 8014554: 429a cmp r2, r3
  49251. 8014556: d302 bcc.n 801455e <prvInsertTimerInActiveList+0x3a>
  49252. {
  49253. /* The time between a command being issued and the command being
  49254. processed actually exceeds the timers period. */
  49255. xProcessTimerNow = pdTRUE;
  49256. 8014558: 2301 movs r3, #1
  49257. 801455a: 617b str r3, [r7, #20]
  49258. 801455c: e01b b.n 8014596 <prvInsertTimerInActiveList+0x72>
  49259. }
  49260. else
  49261. {
  49262. vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) );
  49263. 801455e: 4b10 ldr r3, [pc, #64] @ (80145a0 <prvInsertTimerInActiveList+0x7c>)
  49264. 8014560: 681a ldr r2, [r3, #0]
  49265. 8014562: 68fb ldr r3, [r7, #12]
  49266. 8014564: 3304 adds r3, #4
  49267. 8014566: 4619 mov r1, r3
  49268. 8014568: 4610 mov r0, r2
  49269. 801456a: f7fc fe72 bl 8011252 <vListInsert>
  49270. 801456e: e012 b.n 8014596 <prvInsertTimerInActiveList+0x72>
  49271. }
  49272. }
  49273. else
  49274. {
  49275. if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) )
  49276. 8014570: 687a ldr r2, [r7, #4]
  49277. 8014572: 683b ldr r3, [r7, #0]
  49278. 8014574: 429a cmp r2, r3
  49279. 8014576: d206 bcs.n 8014586 <prvInsertTimerInActiveList+0x62>
  49280. 8014578: 68ba ldr r2, [r7, #8]
  49281. 801457a: 683b ldr r3, [r7, #0]
  49282. 801457c: 429a cmp r2, r3
  49283. 801457e: d302 bcc.n 8014586 <prvInsertTimerInActiveList+0x62>
  49284. {
  49285. /* If, since the command was issued, the tick count has overflowed
  49286. but the expiry time has not, then the timer must have already passed
  49287. its expiry time and should be processed immediately. */
  49288. xProcessTimerNow = pdTRUE;
  49289. 8014580: 2301 movs r3, #1
  49290. 8014582: 617b str r3, [r7, #20]
  49291. 8014584: e007 b.n 8014596 <prvInsertTimerInActiveList+0x72>
  49292. }
  49293. else
  49294. {
  49295. vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
  49296. 8014586: 4b07 ldr r3, [pc, #28] @ (80145a4 <prvInsertTimerInActiveList+0x80>)
  49297. 8014588: 681a ldr r2, [r3, #0]
  49298. 801458a: 68fb ldr r3, [r7, #12]
  49299. 801458c: 3304 adds r3, #4
  49300. 801458e: 4619 mov r1, r3
  49301. 8014590: 4610 mov r0, r2
  49302. 8014592: f7fc fe5e bl 8011252 <vListInsert>
  49303. }
  49304. }
  49305. return xProcessTimerNow;
  49306. 8014596: 697b ldr r3, [r7, #20]
  49307. }
  49308. 8014598: 4618 mov r0, r3
  49309. 801459a: 3718 adds r7, #24
  49310. 801459c: 46bd mov sp, r7
  49311. 801459e: bd80 pop {r7, pc}
  49312. 80145a0: 240041bc .word 0x240041bc
  49313. 80145a4: 240041b8 .word 0x240041b8
  49314. 080145a8 <prvProcessReceivedCommands>:
  49315. /*-----------------------------------------------------------*/
  49316. static void prvProcessReceivedCommands( void )
  49317. {
  49318. 80145a8: b580 push {r7, lr}
  49319. 80145aa: b08e sub sp, #56 @ 0x38
  49320. 80145ac: af02 add r7, sp, #8
  49321. DaemonTaskMessage_t xMessage;
  49322. Timer_t *pxTimer;
  49323. BaseType_t xTimerListsWereSwitched, xResult;
  49324. TickType_t xTimeNow;
  49325. while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */
  49326. 80145ae: e0ce b.n 801474e <prvProcessReceivedCommands+0x1a6>
  49327. {
  49328. #if ( INCLUDE_xTimerPendFunctionCall == 1 )
  49329. {
  49330. /* Negative commands are pended function calls rather than timer
  49331. commands. */
  49332. if( xMessage.xMessageID < ( BaseType_t ) 0 )
  49333. 80145b0: 687b ldr r3, [r7, #4]
  49334. 80145b2: 2b00 cmp r3, #0
  49335. 80145b4: da19 bge.n 80145ea <prvProcessReceivedCommands+0x42>
  49336. {
  49337. const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters );
  49338. 80145b6: 1d3b adds r3, r7, #4
  49339. 80145b8: 3304 adds r3, #4
  49340. 80145ba: 62fb str r3, [r7, #44] @ 0x2c
  49341. /* The timer uses the xCallbackParameters member to request a
  49342. callback be executed. Check the callback is not NULL. */
  49343. configASSERT( pxCallback );
  49344. 80145bc: 6afb ldr r3, [r7, #44] @ 0x2c
  49345. 80145be: 2b00 cmp r3, #0
  49346. 80145c0: d10b bne.n 80145da <prvProcessReceivedCommands+0x32>
  49347. __asm volatile
  49348. 80145c2: f04f 0350 mov.w r3, #80 @ 0x50
  49349. 80145c6: f383 8811 msr BASEPRI, r3
  49350. 80145ca: f3bf 8f6f isb sy
  49351. 80145ce: f3bf 8f4f dsb sy
  49352. 80145d2: 61fb str r3, [r7, #28]
  49353. }
  49354. 80145d4: bf00 nop
  49355. 80145d6: bf00 nop
  49356. 80145d8: e7fd b.n 80145d6 <prvProcessReceivedCommands+0x2e>
  49357. /* Call the function. */
  49358. pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 );
  49359. 80145da: 6afb ldr r3, [r7, #44] @ 0x2c
  49360. 80145dc: 681b ldr r3, [r3, #0]
  49361. 80145de: 6afa ldr r2, [r7, #44] @ 0x2c
  49362. 80145e0: 6850 ldr r0, [r2, #4]
  49363. 80145e2: 6afa ldr r2, [r7, #44] @ 0x2c
  49364. 80145e4: 6892 ldr r2, [r2, #8]
  49365. 80145e6: 4611 mov r1, r2
  49366. 80145e8: 4798 blx r3
  49367. }
  49368. #endif /* INCLUDE_xTimerPendFunctionCall */
  49369. /* Commands that are positive are timer commands rather than pended
  49370. function calls. */
  49371. if( xMessage.xMessageID >= ( BaseType_t ) 0 )
  49372. 80145ea: 687b ldr r3, [r7, #4]
  49373. 80145ec: 2b00 cmp r3, #0
  49374. 80145ee: f2c0 80ae blt.w 801474e <prvProcessReceivedCommands+0x1a6>
  49375. {
  49376. /* The messages uses the xTimerParameters member to work on a
  49377. software timer. */
  49378. pxTimer = xMessage.u.xTimerParameters.pxTimer;
  49379. 80145f2: 68fb ldr r3, [r7, #12]
  49380. 80145f4: 62bb str r3, [r7, #40] @ 0x28
  49381. if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) /*lint !e961. The cast is only redundant when NULL is passed into the macro. */
  49382. 80145f6: 6abb ldr r3, [r7, #40] @ 0x28
  49383. 80145f8: 695b ldr r3, [r3, #20]
  49384. 80145fa: 2b00 cmp r3, #0
  49385. 80145fc: d004 beq.n 8014608 <prvProcessReceivedCommands+0x60>
  49386. {
  49387. /* The timer is in a list, remove it. */
  49388. ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
  49389. 80145fe: 6abb ldr r3, [r7, #40] @ 0x28
  49390. 8014600: 3304 adds r3, #4
  49391. 8014602: 4618 mov r0, r3
  49392. 8014604: f7fc fe5e bl 80112c4 <uxListRemove>
  49393. it must be present in the function call. prvSampleTimeNow() must be
  49394. called after the message is received from xTimerQueue so there is no
  49395. possibility of a higher priority task adding a message to the message
  49396. queue with a time that is ahead of the timer daemon task (because it
  49397. pre-empted the timer daemon task after the xTimeNow value was set). */
  49398. xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
  49399. 8014608: 463b mov r3, r7
  49400. 801460a: 4618 mov r0, r3
  49401. 801460c: f7ff ff6a bl 80144e4 <prvSampleTimeNow>
  49402. 8014610: 6278 str r0, [r7, #36] @ 0x24
  49403. switch( xMessage.xMessageID )
  49404. 8014612: 687b ldr r3, [r7, #4]
  49405. 8014614: 2b09 cmp r3, #9
  49406. 8014616: f200 8097 bhi.w 8014748 <prvProcessReceivedCommands+0x1a0>
  49407. 801461a: a201 add r2, pc, #4 @ (adr r2, 8014620 <prvProcessReceivedCommands+0x78>)
  49408. 801461c: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  49409. 8014620: 08014649 .word 0x08014649
  49410. 8014624: 08014649 .word 0x08014649
  49411. 8014628: 08014649 .word 0x08014649
  49412. 801462c: 080146bf .word 0x080146bf
  49413. 8014630: 080146d3 .word 0x080146d3
  49414. 8014634: 0801471f .word 0x0801471f
  49415. 8014638: 08014649 .word 0x08014649
  49416. 801463c: 08014649 .word 0x08014649
  49417. 8014640: 080146bf .word 0x080146bf
  49418. 8014644: 080146d3 .word 0x080146d3
  49419. case tmrCOMMAND_START_FROM_ISR :
  49420. case tmrCOMMAND_RESET :
  49421. case tmrCOMMAND_RESET_FROM_ISR :
  49422. case tmrCOMMAND_START_DONT_TRACE :
  49423. /* Start or restart a timer. */
  49424. pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE;
  49425. 8014648: 6abb ldr r3, [r7, #40] @ 0x28
  49426. 801464a: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  49427. 801464e: f043 0301 orr.w r3, r3, #1
  49428. 8014652: b2da uxtb r2, r3
  49429. 8014654: 6abb ldr r3, [r7, #40] @ 0x28
  49430. 8014656: f883 2028 strb.w r2, [r3, #40] @ 0x28
  49431. if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE )
  49432. 801465a: 68ba ldr r2, [r7, #8]
  49433. 801465c: 6abb ldr r3, [r7, #40] @ 0x28
  49434. 801465e: 699b ldr r3, [r3, #24]
  49435. 8014660: 18d1 adds r1, r2, r3
  49436. 8014662: 68bb ldr r3, [r7, #8]
  49437. 8014664: 6a7a ldr r2, [r7, #36] @ 0x24
  49438. 8014666: 6ab8 ldr r0, [r7, #40] @ 0x28
  49439. 8014668: f7ff ff5c bl 8014524 <prvInsertTimerInActiveList>
  49440. 801466c: 4603 mov r3, r0
  49441. 801466e: 2b00 cmp r3, #0
  49442. 8014670: d06c beq.n 801474c <prvProcessReceivedCommands+0x1a4>
  49443. {
  49444. /* The timer expired before it was added to the active
  49445. timer list. Process it now. */
  49446. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  49447. 8014672: 6abb ldr r3, [r7, #40] @ 0x28
  49448. 8014674: 6a1b ldr r3, [r3, #32]
  49449. 8014676: 6ab8 ldr r0, [r7, #40] @ 0x28
  49450. 8014678: 4798 blx r3
  49451. traceTIMER_EXPIRED( pxTimer );
  49452. if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 )
  49453. 801467a: 6abb ldr r3, [r7, #40] @ 0x28
  49454. 801467c: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  49455. 8014680: f003 0304 and.w r3, r3, #4
  49456. 8014684: 2b00 cmp r3, #0
  49457. 8014686: d061 beq.n 801474c <prvProcessReceivedCommands+0x1a4>
  49458. {
  49459. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY );
  49460. 8014688: 68ba ldr r2, [r7, #8]
  49461. 801468a: 6abb ldr r3, [r7, #40] @ 0x28
  49462. 801468c: 699b ldr r3, [r3, #24]
  49463. 801468e: 441a add r2, r3
  49464. 8014690: 2300 movs r3, #0
  49465. 8014692: 9300 str r3, [sp, #0]
  49466. 8014694: 2300 movs r3, #0
  49467. 8014696: 2100 movs r1, #0
  49468. 8014698: 6ab8 ldr r0, [r7, #40] @ 0x28
  49469. 801469a: f7ff fe01 bl 80142a0 <xTimerGenericCommand>
  49470. 801469e: 6238 str r0, [r7, #32]
  49471. configASSERT( xResult );
  49472. 80146a0: 6a3b ldr r3, [r7, #32]
  49473. 80146a2: 2b00 cmp r3, #0
  49474. 80146a4: d152 bne.n 801474c <prvProcessReceivedCommands+0x1a4>
  49475. __asm volatile
  49476. 80146a6: f04f 0350 mov.w r3, #80 @ 0x50
  49477. 80146aa: f383 8811 msr BASEPRI, r3
  49478. 80146ae: f3bf 8f6f isb sy
  49479. 80146b2: f3bf 8f4f dsb sy
  49480. 80146b6: 61bb str r3, [r7, #24]
  49481. }
  49482. 80146b8: bf00 nop
  49483. 80146ba: bf00 nop
  49484. 80146bc: e7fd b.n 80146ba <prvProcessReceivedCommands+0x112>
  49485. break;
  49486. case tmrCOMMAND_STOP :
  49487. case tmrCOMMAND_STOP_FROM_ISR :
  49488. /* The timer has already been removed from the active list. */
  49489. pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE;
  49490. 80146be: 6abb ldr r3, [r7, #40] @ 0x28
  49491. 80146c0: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  49492. 80146c4: f023 0301 bic.w r3, r3, #1
  49493. 80146c8: b2da uxtb r2, r3
  49494. 80146ca: 6abb ldr r3, [r7, #40] @ 0x28
  49495. 80146cc: f883 2028 strb.w r2, [r3, #40] @ 0x28
  49496. break;
  49497. 80146d0: e03d b.n 801474e <prvProcessReceivedCommands+0x1a6>
  49498. case tmrCOMMAND_CHANGE_PERIOD :
  49499. case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR :
  49500. pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE;
  49501. 80146d2: 6abb ldr r3, [r7, #40] @ 0x28
  49502. 80146d4: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  49503. 80146d8: f043 0301 orr.w r3, r3, #1
  49504. 80146dc: b2da uxtb r2, r3
  49505. 80146de: 6abb ldr r3, [r7, #40] @ 0x28
  49506. 80146e0: f883 2028 strb.w r2, [r3, #40] @ 0x28
  49507. pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue;
  49508. 80146e4: 68ba ldr r2, [r7, #8]
  49509. 80146e6: 6abb ldr r3, [r7, #40] @ 0x28
  49510. 80146e8: 619a str r2, [r3, #24]
  49511. configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) );
  49512. 80146ea: 6abb ldr r3, [r7, #40] @ 0x28
  49513. 80146ec: 699b ldr r3, [r3, #24]
  49514. 80146ee: 2b00 cmp r3, #0
  49515. 80146f0: d10b bne.n 801470a <prvProcessReceivedCommands+0x162>
  49516. __asm volatile
  49517. 80146f2: f04f 0350 mov.w r3, #80 @ 0x50
  49518. 80146f6: f383 8811 msr BASEPRI, r3
  49519. 80146fa: f3bf 8f6f isb sy
  49520. 80146fe: f3bf 8f4f dsb sy
  49521. 8014702: 617b str r3, [r7, #20]
  49522. }
  49523. 8014704: bf00 nop
  49524. 8014706: bf00 nop
  49525. 8014708: e7fd b.n 8014706 <prvProcessReceivedCommands+0x15e>
  49526. be longer or shorter than the old one. The command time is
  49527. therefore set to the current time, and as the period cannot
  49528. be zero the next expiry time can only be in the future,
  49529. meaning (unlike for the xTimerStart() case above) there is
  49530. no fail case that needs to be handled here. */
  49531. ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow );
  49532. 801470a: 6abb ldr r3, [r7, #40] @ 0x28
  49533. 801470c: 699a ldr r2, [r3, #24]
  49534. 801470e: 6a7b ldr r3, [r7, #36] @ 0x24
  49535. 8014710: 18d1 adds r1, r2, r3
  49536. 8014712: 6a7b ldr r3, [r7, #36] @ 0x24
  49537. 8014714: 6a7a ldr r2, [r7, #36] @ 0x24
  49538. 8014716: 6ab8 ldr r0, [r7, #40] @ 0x28
  49539. 8014718: f7ff ff04 bl 8014524 <prvInsertTimerInActiveList>
  49540. break;
  49541. 801471c: e017 b.n 801474e <prvProcessReceivedCommands+0x1a6>
  49542. #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
  49543. {
  49544. /* The timer has already been removed from the active list,
  49545. just free up the memory if the memory was dynamically
  49546. allocated. */
  49547. if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) 0 )
  49548. 801471e: 6abb ldr r3, [r7, #40] @ 0x28
  49549. 8014720: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  49550. 8014724: f003 0302 and.w r3, r3, #2
  49551. 8014728: 2b00 cmp r3, #0
  49552. 801472a: d103 bne.n 8014734 <prvProcessReceivedCommands+0x18c>
  49553. {
  49554. vPortFree( pxTimer );
  49555. 801472c: 6ab8 ldr r0, [r7, #40] @ 0x28
  49556. 801472e: f000 fbeb bl 8014f08 <vPortFree>
  49557. no need to free the memory - just mark the timer as
  49558. "not active". */
  49559. pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE;
  49560. }
  49561. #endif /* configSUPPORT_DYNAMIC_ALLOCATION */
  49562. break;
  49563. 8014732: e00c b.n 801474e <prvProcessReceivedCommands+0x1a6>
  49564. pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE;
  49565. 8014734: 6abb ldr r3, [r7, #40] @ 0x28
  49566. 8014736: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  49567. 801473a: f023 0301 bic.w r3, r3, #1
  49568. 801473e: b2da uxtb r2, r3
  49569. 8014740: 6abb ldr r3, [r7, #40] @ 0x28
  49570. 8014742: f883 2028 strb.w r2, [r3, #40] @ 0x28
  49571. break;
  49572. 8014746: e002 b.n 801474e <prvProcessReceivedCommands+0x1a6>
  49573. default :
  49574. /* Don't expect to get here. */
  49575. break;
  49576. 8014748: bf00 nop
  49577. 801474a: e000 b.n 801474e <prvProcessReceivedCommands+0x1a6>
  49578. break;
  49579. 801474c: bf00 nop
  49580. while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */
  49581. 801474e: 4b08 ldr r3, [pc, #32] @ (8014770 <prvProcessReceivedCommands+0x1c8>)
  49582. 8014750: 681b ldr r3, [r3, #0]
  49583. 8014752: 1d39 adds r1, r7, #4
  49584. 8014754: 2200 movs r2, #0
  49585. 8014756: 4618 mov r0, r3
  49586. 8014758: f7fd fa7a bl 8011c50 <xQueueReceive>
  49587. 801475c: 4603 mov r3, r0
  49588. 801475e: 2b00 cmp r3, #0
  49589. 8014760: f47f af26 bne.w 80145b0 <prvProcessReceivedCommands+0x8>
  49590. }
  49591. }
  49592. }
  49593. }
  49594. 8014764: bf00 nop
  49595. 8014766: bf00 nop
  49596. 8014768: 3730 adds r7, #48 @ 0x30
  49597. 801476a: 46bd mov sp, r7
  49598. 801476c: bd80 pop {r7, pc}
  49599. 801476e: bf00 nop
  49600. 8014770: 240041c0 .word 0x240041c0
  49601. 08014774 <prvSwitchTimerLists>:
  49602. /*-----------------------------------------------------------*/
  49603. static void prvSwitchTimerLists( void )
  49604. {
  49605. 8014774: b580 push {r7, lr}
  49606. 8014776: b088 sub sp, #32
  49607. 8014778: af02 add r7, sp, #8
  49608. /* The tick count has overflowed. The timer lists must be switched.
  49609. If there are any timers still referenced from the current timer list
  49610. then they must have expired and should be processed before the lists
  49611. are switched. */
  49612. while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )
  49613. 801477a: e049 b.n 8014810 <prvSwitchTimerLists+0x9c>
  49614. {
  49615. xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );
  49616. 801477c: 4b2e ldr r3, [pc, #184] @ (8014838 <prvSwitchTimerLists+0xc4>)
  49617. 801477e: 681b ldr r3, [r3, #0]
  49618. 8014780: 68db ldr r3, [r3, #12]
  49619. 8014782: 681b ldr r3, [r3, #0]
  49620. 8014784: 613b str r3, [r7, #16]
  49621. /* Remove the timer from the list. */
  49622. pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
  49623. 8014786: 4b2c ldr r3, [pc, #176] @ (8014838 <prvSwitchTimerLists+0xc4>)
  49624. 8014788: 681b ldr r3, [r3, #0]
  49625. 801478a: 68db ldr r3, [r3, #12]
  49626. 801478c: 68db ldr r3, [r3, #12]
  49627. 801478e: 60fb str r3, [r7, #12]
  49628. ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
  49629. 8014790: 68fb ldr r3, [r7, #12]
  49630. 8014792: 3304 adds r3, #4
  49631. 8014794: 4618 mov r0, r3
  49632. 8014796: f7fc fd95 bl 80112c4 <uxListRemove>
  49633. traceTIMER_EXPIRED( pxTimer );
  49634. /* Execute its callback, then send a command to restart the timer if
  49635. it is an auto-reload timer. It cannot be restarted here as the lists
  49636. have not yet been switched. */
  49637. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  49638. 801479a: 68fb ldr r3, [r7, #12]
  49639. 801479c: 6a1b ldr r3, [r3, #32]
  49640. 801479e: 68f8 ldr r0, [r7, #12]
  49641. 80147a0: 4798 blx r3
  49642. if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 )
  49643. 80147a2: 68fb ldr r3, [r7, #12]
  49644. 80147a4: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  49645. 80147a8: f003 0304 and.w r3, r3, #4
  49646. 80147ac: 2b00 cmp r3, #0
  49647. 80147ae: d02f beq.n 8014810 <prvSwitchTimerLists+0x9c>
  49648. the timer going into the same timer list then it has already expired
  49649. and the timer should be re-inserted into the current list so it is
  49650. processed again within this loop. Otherwise a command should be sent
  49651. to restart the timer to ensure it is only inserted into a list after
  49652. the lists have been swapped. */
  49653. xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks );
  49654. 80147b0: 68fb ldr r3, [r7, #12]
  49655. 80147b2: 699b ldr r3, [r3, #24]
  49656. 80147b4: 693a ldr r2, [r7, #16]
  49657. 80147b6: 4413 add r3, r2
  49658. 80147b8: 60bb str r3, [r7, #8]
  49659. if( xReloadTime > xNextExpireTime )
  49660. 80147ba: 68ba ldr r2, [r7, #8]
  49661. 80147bc: 693b ldr r3, [r7, #16]
  49662. 80147be: 429a cmp r2, r3
  49663. 80147c0: d90e bls.n 80147e0 <prvSwitchTimerLists+0x6c>
  49664. {
  49665. listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime );
  49666. 80147c2: 68fb ldr r3, [r7, #12]
  49667. 80147c4: 68ba ldr r2, [r7, #8]
  49668. 80147c6: 605a str r2, [r3, #4]
  49669. listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );
  49670. 80147c8: 68fb ldr r3, [r7, #12]
  49671. 80147ca: 68fa ldr r2, [r7, #12]
  49672. 80147cc: 611a str r2, [r3, #16]
  49673. vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
  49674. 80147ce: 4b1a ldr r3, [pc, #104] @ (8014838 <prvSwitchTimerLists+0xc4>)
  49675. 80147d0: 681a ldr r2, [r3, #0]
  49676. 80147d2: 68fb ldr r3, [r7, #12]
  49677. 80147d4: 3304 adds r3, #4
  49678. 80147d6: 4619 mov r1, r3
  49679. 80147d8: 4610 mov r0, r2
  49680. 80147da: f7fc fd3a bl 8011252 <vListInsert>
  49681. 80147de: e017 b.n 8014810 <prvSwitchTimerLists+0x9c>
  49682. }
  49683. else
  49684. {
  49685. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY );
  49686. 80147e0: 2300 movs r3, #0
  49687. 80147e2: 9300 str r3, [sp, #0]
  49688. 80147e4: 2300 movs r3, #0
  49689. 80147e6: 693a ldr r2, [r7, #16]
  49690. 80147e8: 2100 movs r1, #0
  49691. 80147ea: 68f8 ldr r0, [r7, #12]
  49692. 80147ec: f7ff fd58 bl 80142a0 <xTimerGenericCommand>
  49693. 80147f0: 6078 str r0, [r7, #4]
  49694. configASSERT( xResult );
  49695. 80147f2: 687b ldr r3, [r7, #4]
  49696. 80147f4: 2b00 cmp r3, #0
  49697. 80147f6: d10b bne.n 8014810 <prvSwitchTimerLists+0x9c>
  49698. __asm volatile
  49699. 80147f8: f04f 0350 mov.w r3, #80 @ 0x50
  49700. 80147fc: f383 8811 msr BASEPRI, r3
  49701. 8014800: f3bf 8f6f isb sy
  49702. 8014804: f3bf 8f4f dsb sy
  49703. 8014808: 603b str r3, [r7, #0]
  49704. }
  49705. 801480a: bf00 nop
  49706. 801480c: bf00 nop
  49707. 801480e: e7fd b.n 801480c <prvSwitchTimerLists+0x98>
  49708. while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )
  49709. 8014810: 4b09 ldr r3, [pc, #36] @ (8014838 <prvSwitchTimerLists+0xc4>)
  49710. 8014812: 681b ldr r3, [r3, #0]
  49711. 8014814: 681b ldr r3, [r3, #0]
  49712. 8014816: 2b00 cmp r3, #0
  49713. 8014818: d1b0 bne.n 801477c <prvSwitchTimerLists+0x8>
  49714. {
  49715. mtCOVERAGE_TEST_MARKER();
  49716. }
  49717. }
  49718. pxTemp = pxCurrentTimerList;
  49719. 801481a: 4b07 ldr r3, [pc, #28] @ (8014838 <prvSwitchTimerLists+0xc4>)
  49720. 801481c: 681b ldr r3, [r3, #0]
  49721. 801481e: 617b str r3, [r7, #20]
  49722. pxCurrentTimerList = pxOverflowTimerList;
  49723. 8014820: 4b06 ldr r3, [pc, #24] @ (801483c <prvSwitchTimerLists+0xc8>)
  49724. 8014822: 681b ldr r3, [r3, #0]
  49725. 8014824: 4a04 ldr r2, [pc, #16] @ (8014838 <prvSwitchTimerLists+0xc4>)
  49726. 8014826: 6013 str r3, [r2, #0]
  49727. pxOverflowTimerList = pxTemp;
  49728. 8014828: 4a04 ldr r2, [pc, #16] @ (801483c <prvSwitchTimerLists+0xc8>)
  49729. 801482a: 697b ldr r3, [r7, #20]
  49730. 801482c: 6013 str r3, [r2, #0]
  49731. }
  49732. 801482e: bf00 nop
  49733. 8014830: 3718 adds r7, #24
  49734. 8014832: 46bd mov sp, r7
  49735. 8014834: bd80 pop {r7, pc}
  49736. 8014836: bf00 nop
  49737. 8014838: 240041b8 .word 0x240041b8
  49738. 801483c: 240041bc .word 0x240041bc
  49739. 08014840 <prvCheckForValidListAndQueue>:
  49740. /*-----------------------------------------------------------*/
  49741. static void prvCheckForValidListAndQueue( void )
  49742. {
  49743. 8014840: b580 push {r7, lr}
  49744. 8014842: b082 sub sp, #8
  49745. 8014844: af02 add r7, sp, #8
  49746. /* Check that the list from which active timers are referenced, and the
  49747. queue used to communicate with the timer service, have been
  49748. initialised. */
  49749. taskENTER_CRITICAL();
  49750. 8014846: f000 f96f bl 8014b28 <vPortEnterCritical>
  49751. {
  49752. if( xTimerQueue == NULL )
  49753. 801484a: 4b15 ldr r3, [pc, #84] @ (80148a0 <prvCheckForValidListAndQueue+0x60>)
  49754. 801484c: 681b ldr r3, [r3, #0]
  49755. 801484e: 2b00 cmp r3, #0
  49756. 8014850: d120 bne.n 8014894 <prvCheckForValidListAndQueue+0x54>
  49757. {
  49758. vListInitialise( &xActiveTimerList1 );
  49759. 8014852: 4814 ldr r0, [pc, #80] @ (80148a4 <prvCheckForValidListAndQueue+0x64>)
  49760. 8014854: f7fc fcac bl 80111b0 <vListInitialise>
  49761. vListInitialise( &xActiveTimerList2 );
  49762. 8014858: 4813 ldr r0, [pc, #76] @ (80148a8 <prvCheckForValidListAndQueue+0x68>)
  49763. 801485a: f7fc fca9 bl 80111b0 <vListInitialise>
  49764. pxCurrentTimerList = &xActiveTimerList1;
  49765. 801485e: 4b13 ldr r3, [pc, #76] @ (80148ac <prvCheckForValidListAndQueue+0x6c>)
  49766. 8014860: 4a10 ldr r2, [pc, #64] @ (80148a4 <prvCheckForValidListAndQueue+0x64>)
  49767. 8014862: 601a str r2, [r3, #0]
  49768. pxOverflowTimerList = &xActiveTimerList2;
  49769. 8014864: 4b12 ldr r3, [pc, #72] @ (80148b0 <prvCheckForValidListAndQueue+0x70>)
  49770. 8014866: 4a10 ldr r2, [pc, #64] @ (80148a8 <prvCheckForValidListAndQueue+0x68>)
  49771. 8014868: 601a str r2, [r3, #0]
  49772. /* The timer queue is allocated statically in case
  49773. configSUPPORT_DYNAMIC_ALLOCATION is 0. */
  49774. static StaticQueue_t xStaticTimerQueue; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */
  49775. static uint8_t ucStaticTimerQueueStorage[ ( size_t ) configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ]; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */
  49776. xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue );
  49777. 801486a: 2300 movs r3, #0
  49778. 801486c: 9300 str r3, [sp, #0]
  49779. 801486e: 4b11 ldr r3, [pc, #68] @ (80148b4 <prvCheckForValidListAndQueue+0x74>)
  49780. 8014870: 4a11 ldr r2, [pc, #68] @ (80148b8 <prvCheckForValidListAndQueue+0x78>)
  49781. 8014872: 2110 movs r1, #16
  49782. 8014874: 200a movs r0, #10
  49783. 8014876: f7fc fdb9 bl 80113ec <xQueueGenericCreateStatic>
  49784. 801487a: 4603 mov r3, r0
  49785. 801487c: 4a08 ldr r2, [pc, #32] @ (80148a0 <prvCheckForValidListAndQueue+0x60>)
  49786. 801487e: 6013 str r3, [r2, #0]
  49787. }
  49788. #endif
  49789. #if ( configQUEUE_REGISTRY_SIZE > 0 )
  49790. {
  49791. if( xTimerQueue != NULL )
  49792. 8014880: 4b07 ldr r3, [pc, #28] @ (80148a0 <prvCheckForValidListAndQueue+0x60>)
  49793. 8014882: 681b ldr r3, [r3, #0]
  49794. 8014884: 2b00 cmp r3, #0
  49795. 8014886: d005 beq.n 8014894 <prvCheckForValidListAndQueue+0x54>
  49796. {
  49797. vQueueAddToRegistry( xTimerQueue, "TmrQ" );
  49798. 8014888: 4b05 ldr r3, [pc, #20] @ (80148a0 <prvCheckForValidListAndQueue+0x60>)
  49799. 801488a: 681b ldr r3, [r3, #0]
  49800. 801488c: 490b ldr r1, [pc, #44] @ (80148bc <prvCheckForValidListAndQueue+0x7c>)
  49801. 801488e: 4618 mov r0, r3
  49802. 8014890: f7fd fddc bl 801244c <vQueueAddToRegistry>
  49803. else
  49804. {
  49805. mtCOVERAGE_TEST_MARKER();
  49806. }
  49807. }
  49808. taskEXIT_CRITICAL();
  49809. 8014894: f000 f97a bl 8014b8c <vPortExitCritical>
  49810. }
  49811. 8014898: bf00 nop
  49812. 801489a: 46bd mov sp, r7
  49813. 801489c: bd80 pop {r7, pc}
  49814. 801489e: bf00 nop
  49815. 80148a0: 240041c0 .word 0x240041c0
  49816. 80148a4: 24004190 .word 0x24004190
  49817. 80148a8: 240041a4 .word 0x240041a4
  49818. 80148ac: 240041b8 .word 0x240041b8
  49819. 80148b0: 240041bc .word 0x240041bc
  49820. 80148b4: 2400426c .word 0x2400426c
  49821. 80148b8: 240041cc .word 0x240041cc
  49822. 80148bc: 0802cb7c .word 0x0802cb7c
  49823. 080148c0 <pxPortInitialiseStack>:
  49824. /*
  49825. * See header file for description.
  49826. */
  49827. StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
  49828. {
  49829. 80148c0: b480 push {r7}
  49830. 80148c2: b085 sub sp, #20
  49831. 80148c4: af00 add r7, sp, #0
  49832. 80148c6: 60f8 str r0, [r7, #12]
  49833. 80148c8: 60b9 str r1, [r7, #8]
  49834. 80148ca: 607a str r2, [r7, #4]
  49835. /* Simulate the stack frame as it would be created by a context switch
  49836. interrupt. */
  49837. /* Offset added to account for the way the MCU uses the stack on entry/exit
  49838. of interrupts, and to ensure alignment. */
  49839. pxTopOfStack--;
  49840. 80148cc: 68fb ldr r3, [r7, #12]
  49841. 80148ce: 3b04 subs r3, #4
  49842. 80148d0: 60fb str r3, [r7, #12]
  49843. *pxTopOfStack = portINITIAL_XPSR; /* xPSR */
  49844. 80148d2: 68fb ldr r3, [r7, #12]
  49845. 80148d4: f04f 7280 mov.w r2, #16777216 @ 0x1000000
  49846. 80148d8: 601a str r2, [r3, #0]
  49847. pxTopOfStack--;
  49848. 80148da: 68fb ldr r3, [r7, #12]
  49849. 80148dc: 3b04 subs r3, #4
  49850. 80148de: 60fb str r3, [r7, #12]
  49851. *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */
  49852. 80148e0: 68bb ldr r3, [r7, #8]
  49853. 80148e2: f023 0201 bic.w r2, r3, #1
  49854. 80148e6: 68fb ldr r3, [r7, #12]
  49855. 80148e8: 601a str r2, [r3, #0]
  49856. pxTopOfStack--;
  49857. 80148ea: 68fb ldr r3, [r7, #12]
  49858. 80148ec: 3b04 subs r3, #4
  49859. 80148ee: 60fb str r3, [r7, #12]
  49860. *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */
  49861. 80148f0: 4a0c ldr r2, [pc, #48] @ (8014924 <pxPortInitialiseStack+0x64>)
  49862. 80148f2: 68fb ldr r3, [r7, #12]
  49863. 80148f4: 601a str r2, [r3, #0]
  49864. /* Save code space by skipping register initialisation. */
  49865. pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
  49866. 80148f6: 68fb ldr r3, [r7, #12]
  49867. 80148f8: 3b14 subs r3, #20
  49868. 80148fa: 60fb str r3, [r7, #12]
  49869. *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
  49870. 80148fc: 687a ldr r2, [r7, #4]
  49871. 80148fe: 68fb ldr r3, [r7, #12]
  49872. 8014900: 601a str r2, [r3, #0]
  49873. /* A save method is being used that requires each task to maintain its
  49874. own exec return value. */
  49875. pxTopOfStack--;
  49876. 8014902: 68fb ldr r3, [r7, #12]
  49877. 8014904: 3b04 subs r3, #4
  49878. 8014906: 60fb str r3, [r7, #12]
  49879. *pxTopOfStack = portINITIAL_EXC_RETURN;
  49880. 8014908: 68fb ldr r3, [r7, #12]
  49881. 801490a: f06f 0202 mvn.w r2, #2
  49882. 801490e: 601a str r2, [r3, #0]
  49883. pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */
  49884. 8014910: 68fb ldr r3, [r7, #12]
  49885. 8014912: 3b20 subs r3, #32
  49886. 8014914: 60fb str r3, [r7, #12]
  49887. return pxTopOfStack;
  49888. 8014916: 68fb ldr r3, [r7, #12]
  49889. }
  49890. 8014918: 4618 mov r0, r3
  49891. 801491a: 3714 adds r7, #20
  49892. 801491c: 46bd mov sp, r7
  49893. 801491e: f85d 7b04 ldr.w r7, [sp], #4
  49894. 8014922: 4770 bx lr
  49895. 8014924: 08014929 .word 0x08014929
  49896. 08014928 <prvTaskExitError>:
  49897. /*-----------------------------------------------------------*/
  49898. static void prvTaskExitError( void )
  49899. {
  49900. 8014928: b480 push {r7}
  49901. 801492a: b085 sub sp, #20
  49902. 801492c: af00 add r7, sp, #0
  49903. volatile uint32_t ulDummy = 0;
  49904. 801492e: 2300 movs r3, #0
  49905. 8014930: 607b str r3, [r7, #4]
  49906. its caller as there is nothing to return to. If a task wants to exit it
  49907. should instead call vTaskDelete( NULL ).
  49908. Artificially force an assert() to be triggered if configASSERT() is
  49909. defined, then stop here so application writers can catch the error. */
  49910. configASSERT( uxCriticalNesting == ~0UL );
  49911. 8014932: 4b13 ldr r3, [pc, #76] @ (8014980 <prvTaskExitError+0x58>)
  49912. 8014934: 681b ldr r3, [r3, #0]
  49913. 8014936: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  49914. 801493a: d00b beq.n 8014954 <prvTaskExitError+0x2c>
  49915. __asm volatile
  49916. 801493c: f04f 0350 mov.w r3, #80 @ 0x50
  49917. 8014940: f383 8811 msr BASEPRI, r3
  49918. 8014944: f3bf 8f6f isb sy
  49919. 8014948: f3bf 8f4f dsb sy
  49920. 801494c: 60fb str r3, [r7, #12]
  49921. }
  49922. 801494e: bf00 nop
  49923. 8014950: bf00 nop
  49924. 8014952: e7fd b.n 8014950 <prvTaskExitError+0x28>
  49925. __asm volatile
  49926. 8014954: f04f 0350 mov.w r3, #80 @ 0x50
  49927. 8014958: f383 8811 msr BASEPRI, r3
  49928. 801495c: f3bf 8f6f isb sy
  49929. 8014960: f3bf 8f4f dsb sy
  49930. 8014964: 60bb str r3, [r7, #8]
  49931. }
  49932. 8014966: bf00 nop
  49933. portDISABLE_INTERRUPTS();
  49934. while( ulDummy == 0 )
  49935. 8014968: bf00 nop
  49936. 801496a: 687b ldr r3, [r7, #4]
  49937. 801496c: 2b00 cmp r3, #0
  49938. 801496e: d0fc beq.n 801496a <prvTaskExitError+0x42>
  49939. about code appearing after this function is called - making ulDummy
  49940. volatile makes the compiler think the function could return and
  49941. therefore not output an 'unreachable code' warning for code that appears
  49942. after it. */
  49943. }
  49944. }
  49945. 8014970: bf00 nop
  49946. 8014972: bf00 nop
  49947. 8014974: 3714 adds r7, #20
  49948. 8014976: 46bd mov sp, r7
  49949. 8014978: f85d 7b04 ldr.w r7, [sp], #4
  49950. 801497c: 4770 bx lr
  49951. 801497e: bf00 nop
  49952. 8014980: 24000048 .word 0x24000048
  49953. ...
  49954. 08014990 <SVC_Handler>:
  49955. /*-----------------------------------------------------------*/
  49956. void vPortSVCHandler( void )
  49957. {
  49958. __asm volatile (
  49959. 8014990: 4b07 ldr r3, [pc, #28] @ (80149b0 <pxCurrentTCBConst2>)
  49960. 8014992: 6819 ldr r1, [r3, #0]
  49961. 8014994: 6808 ldr r0, [r1, #0]
  49962. 8014996: e8b0 4ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  49963. 801499a: f380 8809 msr PSP, r0
  49964. 801499e: f3bf 8f6f isb sy
  49965. 80149a2: f04f 0000 mov.w r0, #0
  49966. 80149a6: f380 8811 msr BASEPRI, r0
  49967. 80149aa: 4770 bx lr
  49968. 80149ac: f3af 8000 nop.w
  49969. 080149b0 <pxCurrentTCBConst2>:
  49970. 80149b0: 24003c90 .word 0x24003c90
  49971. " bx r14 \n"
  49972. " \n"
  49973. " .align 4 \n"
  49974. "pxCurrentTCBConst2: .word pxCurrentTCB \n"
  49975. );
  49976. }
  49977. 80149b4: bf00 nop
  49978. 80149b6: bf00 nop
  49979. 080149b8 <prvPortStartFirstTask>:
  49980. {
  49981. /* Start the first task. This also clears the bit that indicates the FPU is
  49982. in use in case the FPU was used before the scheduler was started - which
  49983. would otherwise result in the unnecessary leaving of space in the SVC stack
  49984. for lazy saving of FPU registers. */
  49985. __asm volatile(
  49986. 80149b8: 4808 ldr r0, [pc, #32] @ (80149dc <prvPortStartFirstTask+0x24>)
  49987. 80149ba: 6800 ldr r0, [r0, #0]
  49988. 80149bc: 6800 ldr r0, [r0, #0]
  49989. 80149be: f380 8808 msr MSP, r0
  49990. 80149c2: f04f 0000 mov.w r0, #0
  49991. 80149c6: f380 8814 msr CONTROL, r0
  49992. 80149ca: b662 cpsie i
  49993. 80149cc: b661 cpsie f
  49994. 80149ce: f3bf 8f4f dsb sy
  49995. 80149d2: f3bf 8f6f isb sy
  49996. 80149d6: df00 svc 0
  49997. 80149d8: bf00 nop
  49998. " dsb \n"
  49999. " isb \n"
  50000. " svc 0 \n" /* System call to start first task. */
  50001. " nop \n"
  50002. );
  50003. }
  50004. 80149da: bf00 nop
  50005. 80149dc: e000ed08 .word 0xe000ed08
  50006. 080149e0 <xPortStartScheduler>:
  50007. /*
  50008. * See header file for description.
  50009. */
  50010. BaseType_t xPortStartScheduler( void )
  50011. {
  50012. 80149e0: b580 push {r7, lr}
  50013. 80149e2: b086 sub sp, #24
  50014. 80149e4: af00 add r7, sp, #0
  50015. configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );
  50016. /* This port can be used on all revisions of the Cortex-M7 core other than
  50017. the r0p1 parts. r0p1 parts should use the port from the
  50018. /source/portable/GCC/ARM_CM7/r0p1 directory. */
  50019. configASSERT( portCPUID != portCORTEX_M7_r0p1_ID );
  50020. 80149e6: 4b47 ldr r3, [pc, #284] @ (8014b04 <xPortStartScheduler+0x124>)
  50021. 80149e8: 681b ldr r3, [r3, #0]
  50022. 80149ea: 4a47 ldr r2, [pc, #284] @ (8014b08 <xPortStartScheduler+0x128>)
  50023. 80149ec: 4293 cmp r3, r2
  50024. 80149ee: d10b bne.n 8014a08 <xPortStartScheduler+0x28>
  50025. __asm volatile
  50026. 80149f0: f04f 0350 mov.w r3, #80 @ 0x50
  50027. 80149f4: f383 8811 msr BASEPRI, r3
  50028. 80149f8: f3bf 8f6f isb sy
  50029. 80149fc: f3bf 8f4f dsb sy
  50030. 8014a00: 613b str r3, [r7, #16]
  50031. }
  50032. 8014a02: bf00 nop
  50033. 8014a04: bf00 nop
  50034. 8014a06: e7fd b.n 8014a04 <xPortStartScheduler+0x24>
  50035. configASSERT( portCPUID != portCORTEX_M7_r0p0_ID );
  50036. 8014a08: 4b3e ldr r3, [pc, #248] @ (8014b04 <xPortStartScheduler+0x124>)
  50037. 8014a0a: 681b ldr r3, [r3, #0]
  50038. 8014a0c: 4a3f ldr r2, [pc, #252] @ (8014b0c <xPortStartScheduler+0x12c>)
  50039. 8014a0e: 4293 cmp r3, r2
  50040. 8014a10: d10b bne.n 8014a2a <xPortStartScheduler+0x4a>
  50041. __asm volatile
  50042. 8014a12: f04f 0350 mov.w r3, #80 @ 0x50
  50043. 8014a16: f383 8811 msr BASEPRI, r3
  50044. 8014a1a: f3bf 8f6f isb sy
  50045. 8014a1e: f3bf 8f4f dsb sy
  50046. 8014a22: 60fb str r3, [r7, #12]
  50047. }
  50048. 8014a24: bf00 nop
  50049. 8014a26: bf00 nop
  50050. 8014a28: e7fd b.n 8014a26 <xPortStartScheduler+0x46>
  50051. #if( configASSERT_DEFINED == 1 )
  50052. {
  50053. volatile uint32_t ulOriginalPriority;
  50054. volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );
  50055. 8014a2a: 4b39 ldr r3, [pc, #228] @ (8014b10 <xPortStartScheduler+0x130>)
  50056. 8014a2c: 617b str r3, [r7, #20]
  50057. functions can be called. ISR safe functions are those that end in
  50058. "FromISR". FreeRTOS maintains separate thread and ISR API functions to
  50059. ensure interrupt entry is as fast and simple as possible.
  50060. Save the interrupt priority value that is about to be clobbered. */
  50061. ulOriginalPriority = *pucFirstUserPriorityRegister;
  50062. 8014a2e: 697b ldr r3, [r7, #20]
  50063. 8014a30: 781b ldrb r3, [r3, #0]
  50064. 8014a32: b2db uxtb r3, r3
  50065. 8014a34: 607b str r3, [r7, #4]
  50066. /* Determine the number of priority bits available. First write to all
  50067. possible bits. */
  50068. *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
  50069. 8014a36: 697b ldr r3, [r7, #20]
  50070. 8014a38: 22ff movs r2, #255 @ 0xff
  50071. 8014a3a: 701a strb r2, [r3, #0]
  50072. /* Read the value back to see how many bits stuck. */
  50073. ucMaxPriorityValue = *pucFirstUserPriorityRegister;
  50074. 8014a3c: 697b ldr r3, [r7, #20]
  50075. 8014a3e: 781b ldrb r3, [r3, #0]
  50076. 8014a40: b2db uxtb r3, r3
  50077. 8014a42: 70fb strb r3, [r7, #3]
  50078. /* Use the same mask on the maximum system call priority. */
  50079. ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
  50080. 8014a44: 78fb ldrb r3, [r7, #3]
  50081. 8014a46: b2db uxtb r3, r3
  50082. 8014a48: f003 0350 and.w r3, r3, #80 @ 0x50
  50083. 8014a4c: b2da uxtb r2, r3
  50084. 8014a4e: 4b31 ldr r3, [pc, #196] @ (8014b14 <xPortStartScheduler+0x134>)
  50085. 8014a50: 701a strb r2, [r3, #0]
  50086. /* Calculate the maximum acceptable priority group value for the number
  50087. of bits read back. */
  50088. ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
  50089. 8014a52: 4b31 ldr r3, [pc, #196] @ (8014b18 <xPortStartScheduler+0x138>)
  50090. 8014a54: 2207 movs r2, #7
  50091. 8014a56: 601a str r2, [r3, #0]
  50092. while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
  50093. 8014a58: e009 b.n 8014a6e <xPortStartScheduler+0x8e>
  50094. {
  50095. ulMaxPRIGROUPValue--;
  50096. 8014a5a: 4b2f ldr r3, [pc, #188] @ (8014b18 <xPortStartScheduler+0x138>)
  50097. 8014a5c: 681b ldr r3, [r3, #0]
  50098. 8014a5e: 3b01 subs r3, #1
  50099. 8014a60: 4a2d ldr r2, [pc, #180] @ (8014b18 <xPortStartScheduler+0x138>)
  50100. 8014a62: 6013 str r3, [r2, #0]
  50101. ucMaxPriorityValue <<= ( uint8_t ) 0x01;
  50102. 8014a64: 78fb ldrb r3, [r7, #3]
  50103. 8014a66: b2db uxtb r3, r3
  50104. 8014a68: 005b lsls r3, r3, #1
  50105. 8014a6a: b2db uxtb r3, r3
  50106. 8014a6c: 70fb strb r3, [r7, #3]
  50107. while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
  50108. 8014a6e: 78fb ldrb r3, [r7, #3]
  50109. 8014a70: b2db uxtb r3, r3
  50110. 8014a72: f003 0380 and.w r3, r3, #128 @ 0x80
  50111. 8014a76: 2b80 cmp r3, #128 @ 0x80
  50112. 8014a78: d0ef beq.n 8014a5a <xPortStartScheduler+0x7a>
  50113. #ifdef configPRIO_BITS
  50114. {
  50115. /* Check the FreeRTOS configuration that defines the number of
  50116. priority bits matches the number of priority bits actually queried
  50117. from the hardware. */
  50118. configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
  50119. 8014a7a: 4b27 ldr r3, [pc, #156] @ (8014b18 <xPortStartScheduler+0x138>)
  50120. 8014a7c: 681b ldr r3, [r3, #0]
  50121. 8014a7e: f1c3 0307 rsb r3, r3, #7
  50122. 8014a82: 2b04 cmp r3, #4
  50123. 8014a84: d00b beq.n 8014a9e <xPortStartScheduler+0xbe>
  50124. __asm volatile
  50125. 8014a86: f04f 0350 mov.w r3, #80 @ 0x50
  50126. 8014a8a: f383 8811 msr BASEPRI, r3
  50127. 8014a8e: f3bf 8f6f isb sy
  50128. 8014a92: f3bf 8f4f dsb sy
  50129. 8014a96: 60bb str r3, [r7, #8]
  50130. }
  50131. 8014a98: bf00 nop
  50132. 8014a9a: bf00 nop
  50133. 8014a9c: e7fd b.n 8014a9a <xPortStartScheduler+0xba>
  50134. }
  50135. #endif
  50136. /* Shift the priority group value back to its position within the AIRCR
  50137. register. */
  50138. ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
  50139. 8014a9e: 4b1e ldr r3, [pc, #120] @ (8014b18 <xPortStartScheduler+0x138>)
  50140. 8014aa0: 681b ldr r3, [r3, #0]
  50141. 8014aa2: 021b lsls r3, r3, #8
  50142. 8014aa4: 4a1c ldr r2, [pc, #112] @ (8014b18 <xPortStartScheduler+0x138>)
  50143. 8014aa6: 6013 str r3, [r2, #0]
  50144. ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
  50145. 8014aa8: 4b1b ldr r3, [pc, #108] @ (8014b18 <xPortStartScheduler+0x138>)
  50146. 8014aaa: 681b ldr r3, [r3, #0]
  50147. 8014aac: f403 63e0 and.w r3, r3, #1792 @ 0x700
  50148. 8014ab0: 4a19 ldr r2, [pc, #100] @ (8014b18 <xPortStartScheduler+0x138>)
  50149. 8014ab2: 6013 str r3, [r2, #0]
  50150. /* Restore the clobbered interrupt priority register to its original
  50151. value. */
  50152. *pucFirstUserPriorityRegister = ulOriginalPriority;
  50153. 8014ab4: 687b ldr r3, [r7, #4]
  50154. 8014ab6: b2da uxtb r2, r3
  50155. 8014ab8: 697b ldr r3, [r7, #20]
  50156. 8014aba: 701a strb r2, [r3, #0]
  50157. }
  50158. #endif /* conifgASSERT_DEFINED */
  50159. /* Make PendSV and SysTick the lowest priority interrupts. */
  50160. portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
  50161. 8014abc: 4b17 ldr r3, [pc, #92] @ (8014b1c <xPortStartScheduler+0x13c>)
  50162. 8014abe: 681b ldr r3, [r3, #0]
  50163. 8014ac0: 4a16 ldr r2, [pc, #88] @ (8014b1c <xPortStartScheduler+0x13c>)
  50164. 8014ac2: f443 0370 orr.w r3, r3, #15728640 @ 0xf00000
  50165. 8014ac6: 6013 str r3, [r2, #0]
  50166. portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
  50167. 8014ac8: 4b14 ldr r3, [pc, #80] @ (8014b1c <xPortStartScheduler+0x13c>)
  50168. 8014aca: 681b ldr r3, [r3, #0]
  50169. 8014acc: 4a13 ldr r2, [pc, #76] @ (8014b1c <xPortStartScheduler+0x13c>)
  50170. 8014ace: f043 4370 orr.w r3, r3, #4026531840 @ 0xf0000000
  50171. 8014ad2: 6013 str r3, [r2, #0]
  50172. /* Start the timer that generates the tick ISR. Interrupts are disabled
  50173. here already. */
  50174. vPortSetupTimerInterrupt();
  50175. 8014ad4: f000 f8da bl 8014c8c <vPortSetupTimerInterrupt>
  50176. /* Initialise the critical nesting count ready for the first task. */
  50177. uxCriticalNesting = 0;
  50178. 8014ad8: 4b11 ldr r3, [pc, #68] @ (8014b20 <xPortStartScheduler+0x140>)
  50179. 8014ada: 2200 movs r2, #0
  50180. 8014adc: 601a str r2, [r3, #0]
  50181. /* Ensure the VFP is enabled - it should be anyway. */
  50182. vPortEnableVFP();
  50183. 8014ade: f000 f8f9 bl 8014cd4 <vPortEnableVFP>
  50184. /* Lazy save always. */
  50185. *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;
  50186. 8014ae2: 4b10 ldr r3, [pc, #64] @ (8014b24 <xPortStartScheduler+0x144>)
  50187. 8014ae4: 681b ldr r3, [r3, #0]
  50188. 8014ae6: 4a0f ldr r2, [pc, #60] @ (8014b24 <xPortStartScheduler+0x144>)
  50189. 8014ae8: f043 4340 orr.w r3, r3, #3221225472 @ 0xc0000000
  50190. 8014aec: 6013 str r3, [r2, #0]
  50191. /* Start the first task. */
  50192. prvPortStartFirstTask();
  50193. 8014aee: f7ff ff63 bl 80149b8 <prvPortStartFirstTask>
  50194. exit error function to prevent compiler warnings about a static function
  50195. not being called in the case that the application writer overrides this
  50196. functionality by defining configTASK_RETURN_ADDRESS. Call
  50197. vTaskSwitchContext() so link time optimisation does not remove the
  50198. symbol. */
  50199. vTaskSwitchContext();
  50200. 8014af2: f7fe fcb7 bl 8013464 <vTaskSwitchContext>
  50201. prvTaskExitError();
  50202. 8014af6: f7ff ff17 bl 8014928 <prvTaskExitError>
  50203. /* Should not get here! */
  50204. return 0;
  50205. 8014afa: 2300 movs r3, #0
  50206. }
  50207. 8014afc: 4618 mov r0, r3
  50208. 8014afe: 3718 adds r7, #24
  50209. 8014b00: 46bd mov sp, r7
  50210. 8014b02: bd80 pop {r7, pc}
  50211. 8014b04: e000ed00 .word 0xe000ed00
  50212. 8014b08: 410fc271 .word 0x410fc271
  50213. 8014b0c: 410fc270 .word 0x410fc270
  50214. 8014b10: e000e400 .word 0xe000e400
  50215. 8014b14: 240042bc .word 0x240042bc
  50216. 8014b18: 240042c0 .word 0x240042c0
  50217. 8014b1c: e000ed20 .word 0xe000ed20
  50218. 8014b20: 24000048 .word 0x24000048
  50219. 8014b24: e000ef34 .word 0xe000ef34
  50220. 08014b28 <vPortEnterCritical>:
  50221. configASSERT( uxCriticalNesting == 1000UL );
  50222. }
  50223. /*-----------------------------------------------------------*/
  50224. void vPortEnterCritical( void )
  50225. {
  50226. 8014b28: b480 push {r7}
  50227. 8014b2a: b083 sub sp, #12
  50228. 8014b2c: af00 add r7, sp, #0
  50229. __asm volatile
  50230. 8014b2e: f04f 0350 mov.w r3, #80 @ 0x50
  50231. 8014b32: f383 8811 msr BASEPRI, r3
  50232. 8014b36: f3bf 8f6f isb sy
  50233. 8014b3a: f3bf 8f4f dsb sy
  50234. 8014b3e: 607b str r3, [r7, #4]
  50235. }
  50236. 8014b40: bf00 nop
  50237. portDISABLE_INTERRUPTS();
  50238. uxCriticalNesting++;
  50239. 8014b42: 4b10 ldr r3, [pc, #64] @ (8014b84 <vPortEnterCritical+0x5c>)
  50240. 8014b44: 681b ldr r3, [r3, #0]
  50241. 8014b46: 3301 adds r3, #1
  50242. 8014b48: 4a0e ldr r2, [pc, #56] @ (8014b84 <vPortEnterCritical+0x5c>)
  50243. 8014b4a: 6013 str r3, [r2, #0]
  50244. /* This is not the interrupt safe version of the enter critical function so
  50245. assert() if it is being called from an interrupt context. Only API
  50246. functions that end in "FromISR" can be used in an interrupt. Only assert if
  50247. the critical nesting count is 1 to protect against recursive calls if the
  50248. assert function also uses a critical section. */
  50249. if( uxCriticalNesting == 1 )
  50250. 8014b4c: 4b0d ldr r3, [pc, #52] @ (8014b84 <vPortEnterCritical+0x5c>)
  50251. 8014b4e: 681b ldr r3, [r3, #0]
  50252. 8014b50: 2b01 cmp r3, #1
  50253. 8014b52: d110 bne.n 8014b76 <vPortEnterCritical+0x4e>
  50254. {
  50255. configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
  50256. 8014b54: 4b0c ldr r3, [pc, #48] @ (8014b88 <vPortEnterCritical+0x60>)
  50257. 8014b56: 681b ldr r3, [r3, #0]
  50258. 8014b58: b2db uxtb r3, r3
  50259. 8014b5a: 2b00 cmp r3, #0
  50260. 8014b5c: d00b beq.n 8014b76 <vPortEnterCritical+0x4e>
  50261. __asm volatile
  50262. 8014b5e: f04f 0350 mov.w r3, #80 @ 0x50
  50263. 8014b62: f383 8811 msr BASEPRI, r3
  50264. 8014b66: f3bf 8f6f isb sy
  50265. 8014b6a: f3bf 8f4f dsb sy
  50266. 8014b6e: 603b str r3, [r7, #0]
  50267. }
  50268. 8014b70: bf00 nop
  50269. 8014b72: bf00 nop
  50270. 8014b74: e7fd b.n 8014b72 <vPortEnterCritical+0x4a>
  50271. }
  50272. }
  50273. 8014b76: bf00 nop
  50274. 8014b78: 370c adds r7, #12
  50275. 8014b7a: 46bd mov sp, r7
  50276. 8014b7c: f85d 7b04 ldr.w r7, [sp], #4
  50277. 8014b80: 4770 bx lr
  50278. 8014b82: bf00 nop
  50279. 8014b84: 24000048 .word 0x24000048
  50280. 8014b88: e000ed04 .word 0xe000ed04
  50281. 08014b8c <vPortExitCritical>:
  50282. /*-----------------------------------------------------------*/
  50283. void vPortExitCritical( void )
  50284. {
  50285. 8014b8c: b480 push {r7}
  50286. 8014b8e: b083 sub sp, #12
  50287. 8014b90: af00 add r7, sp, #0
  50288. configASSERT( uxCriticalNesting );
  50289. 8014b92: 4b12 ldr r3, [pc, #72] @ (8014bdc <vPortExitCritical+0x50>)
  50290. 8014b94: 681b ldr r3, [r3, #0]
  50291. 8014b96: 2b00 cmp r3, #0
  50292. 8014b98: d10b bne.n 8014bb2 <vPortExitCritical+0x26>
  50293. __asm volatile
  50294. 8014b9a: f04f 0350 mov.w r3, #80 @ 0x50
  50295. 8014b9e: f383 8811 msr BASEPRI, r3
  50296. 8014ba2: f3bf 8f6f isb sy
  50297. 8014ba6: f3bf 8f4f dsb sy
  50298. 8014baa: 607b str r3, [r7, #4]
  50299. }
  50300. 8014bac: bf00 nop
  50301. 8014bae: bf00 nop
  50302. 8014bb0: e7fd b.n 8014bae <vPortExitCritical+0x22>
  50303. uxCriticalNesting--;
  50304. 8014bb2: 4b0a ldr r3, [pc, #40] @ (8014bdc <vPortExitCritical+0x50>)
  50305. 8014bb4: 681b ldr r3, [r3, #0]
  50306. 8014bb6: 3b01 subs r3, #1
  50307. 8014bb8: 4a08 ldr r2, [pc, #32] @ (8014bdc <vPortExitCritical+0x50>)
  50308. 8014bba: 6013 str r3, [r2, #0]
  50309. if( uxCriticalNesting == 0 )
  50310. 8014bbc: 4b07 ldr r3, [pc, #28] @ (8014bdc <vPortExitCritical+0x50>)
  50311. 8014bbe: 681b ldr r3, [r3, #0]
  50312. 8014bc0: 2b00 cmp r3, #0
  50313. 8014bc2: d105 bne.n 8014bd0 <vPortExitCritical+0x44>
  50314. 8014bc4: 2300 movs r3, #0
  50315. 8014bc6: 603b str r3, [r7, #0]
  50316. __asm volatile
  50317. 8014bc8: 683b ldr r3, [r7, #0]
  50318. 8014bca: f383 8811 msr BASEPRI, r3
  50319. }
  50320. 8014bce: bf00 nop
  50321. {
  50322. portENABLE_INTERRUPTS();
  50323. }
  50324. }
  50325. 8014bd0: bf00 nop
  50326. 8014bd2: 370c adds r7, #12
  50327. 8014bd4: 46bd mov sp, r7
  50328. 8014bd6: f85d 7b04 ldr.w r7, [sp], #4
  50329. 8014bda: 4770 bx lr
  50330. 8014bdc: 24000048 .word 0x24000048
  50331. 08014be0 <PendSV_Handler>:
  50332. void xPortPendSVHandler( void )
  50333. {
  50334. /* This is a naked function. */
  50335. __asm volatile
  50336. 8014be0: f3ef 8009 mrs r0, PSP
  50337. 8014be4: f3bf 8f6f isb sy
  50338. 8014be8: 4b15 ldr r3, [pc, #84] @ (8014c40 <pxCurrentTCBConst>)
  50339. 8014bea: 681a ldr r2, [r3, #0]
  50340. 8014bec: f01e 0f10 tst.w lr, #16
  50341. 8014bf0: bf08 it eq
  50342. 8014bf2: ed20 8a10 vstmdbeq r0!, {s16-s31}
  50343. 8014bf6: e920 4ff0 stmdb r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  50344. 8014bfa: 6010 str r0, [r2, #0]
  50345. 8014bfc: e92d 0009 stmdb sp!, {r0, r3}
  50346. 8014c00: f04f 0050 mov.w r0, #80 @ 0x50
  50347. 8014c04: f380 8811 msr BASEPRI, r0
  50348. 8014c08: f3bf 8f4f dsb sy
  50349. 8014c0c: f3bf 8f6f isb sy
  50350. 8014c10: f7fe fc28 bl 8013464 <vTaskSwitchContext>
  50351. 8014c14: f04f 0000 mov.w r0, #0
  50352. 8014c18: f380 8811 msr BASEPRI, r0
  50353. 8014c1c: bc09 pop {r0, r3}
  50354. 8014c1e: 6819 ldr r1, [r3, #0]
  50355. 8014c20: 6808 ldr r0, [r1, #0]
  50356. 8014c22: e8b0 4ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  50357. 8014c26: f01e 0f10 tst.w lr, #16
  50358. 8014c2a: bf08 it eq
  50359. 8014c2c: ecb0 8a10 vldmiaeq r0!, {s16-s31}
  50360. 8014c30: f380 8809 msr PSP, r0
  50361. 8014c34: f3bf 8f6f isb sy
  50362. 8014c38: 4770 bx lr
  50363. 8014c3a: bf00 nop
  50364. 8014c3c: f3af 8000 nop.w
  50365. 08014c40 <pxCurrentTCBConst>:
  50366. 8014c40: 24003c90 .word 0x24003c90
  50367. " \n"
  50368. " .align 4 \n"
  50369. "pxCurrentTCBConst: .word pxCurrentTCB \n"
  50370. ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY)
  50371. );
  50372. }
  50373. 8014c44: bf00 nop
  50374. 8014c46: bf00 nop
  50375. 08014c48 <xPortSysTickHandler>:
  50376. /*-----------------------------------------------------------*/
  50377. void xPortSysTickHandler( void )
  50378. {
  50379. 8014c48: b580 push {r7, lr}
  50380. 8014c4a: b082 sub sp, #8
  50381. 8014c4c: af00 add r7, sp, #0
  50382. __asm volatile
  50383. 8014c4e: f04f 0350 mov.w r3, #80 @ 0x50
  50384. 8014c52: f383 8811 msr BASEPRI, r3
  50385. 8014c56: f3bf 8f6f isb sy
  50386. 8014c5a: f3bf 8f4f dsb sy
  50387. 8014c5e: 607b str r3, [r7, #4]
  50388. }
  50389. 8014c60: bf00 nop
  50390. save and then restore the interrupt mask value as its value is already
  50391. known. */
  50392. portDISABLE_INTERRUPTS();
  50393. {
  50394. /* Increment the RTOS tick. */
  50395. if( xTaskIncrementTick() != pdFALSE )
  50396. 8014c62: f7fe fb45 bl 80132f0 <xTaskIncrementTick>
  50397. 8014c66: 4603 mov r3, r0
  50398. 8014c68: 2b00 cmp r3, #0
  50399. 8014c6a: d003 beq.n 8014c74 <xPortSysTickHandler+0x2c>
  50400. {
  50401. /* A context switch is required. Context switching is performed in
  50402. the PendSV interrupt. Pend the PendSV interrupt. */
  50403. portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
  50404. 8014c6c: 4b06 ldr r3, [pc, #24] @ (8014c88 <xPortSysTickHandler+0x40>)
  50405. 8014c6e: f04f 5280 mov.w r2, #268435456 @ 0x10000000
  50406. 8014c72: 601a str r2, [r3, #0]
  50407. 8014c74: 2300 movs r3, #0
  50408. 8014c76: 603b str r3, [r7, #0]
  50409. __asm volatile
  50410. 8014c78: 683b ldr r3, [r7, #0]
  50411. 8014c7a: f383 8811 msr BASEPRI, r3
  50412. }
  50413. 8014c7e: bf00 nop
  50414. }
  50415. }
  50416. portENABLE_INTERRUPTS();
  50417. }
  50418. 8014c80: bf00 nop
  50419. 8014c82: 3708 adds r7, #8
  50420. 8014c84: 46bd mov sp, r7
  50421. 8014c86: bd80 pop {r7, pc}
  50422. 8014c88: e000ed04 .word 0xe000ed04
  50423. 08014c8c <vPortSetupTimerInterrupt>:
  50424. /*
  50425. * Setup the systick timer to generate the tick interrupts at the required
  50426. * frequency.
  50427. */
  50428. __attribute__(( weak )) void vPortSetupTimerInterrupt( void )
  50429. {
  50430. 8014c8c: b480 push {r7}
  50431. 8014c8e: af00 add r7, sp, #0
  50432. ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
  50433. }
  50434. #endif /* configUSE_TICKLESS_IDLE */
  50435. /* Stop and clear the SysTick. */
  50436. portNVIC_SYSTICK_CTRL_REG = 0UL;
  50437. 8014c90: 4b0b ldr r3, [pc, #44] @ (8014cc0 <vPortSetupTimerInterrupt+0x34>)
  50438. 8014c92: 2200 movs r2, #0
  50439. 8014c94: 601a str r2, [r3, #0]
  50440. portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
  50441. 8014c96: 4b0b ldr r3, [pc, #44] @ (8014cc4 <vPortSetupTimerInterrupt+0x38>)
  50442. 8014c98: 2200 movs r2, #0
  50443. 8014c9a: 601a str r2, [r3, #0]
  50444. /* Configure SysTick to interrupt at the requested rate. */
  50445. portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
  50446. 8014c9c: 4b0a ldr r3, [pc, #40] @ (8014cc8 <vPortSetupTimerInterrupt+0x3c>)
  50447. 8014c9e: 681b ldr r3, [r3, #0]
  50448. 8014ca0: 4a0a ldr r2, [pc, #40] @ (8014ccc <vPortSetupTimerInterrupt+0x40>)
  50449. 8014ca2: fba2 2303 umull r2, r3, r2, r3
  50450. 8014ca6: 099b lsrs r3, r3, #6
  50451. 8014ca8: 4a09 ldr r2, [pc, #36] @ (8014cd0 <vPortSetupTimerInterrupt+0x44>)
  50452. 8014caa: 3b01 subs r3, #1
  50453. 8014cac: 6013 str r3, [r2, #0]
  50454. portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
  50455. 8014cae: 4b04 ldr r3, [pc, #16] @ (8014cc0 <vPortSetupTimerInterrupt+0x34>)
  50456. 8014cb0: 2207 movs r2, #7
  50457. 8014cb2: 601a str r2, [r3, #0]
  50458. }
  50459. 8014cb4: bf00 nop
  50460. 8014cb6: 46bd mov sp, r7
  50461. 8014cb8: f85d 7b04 ldr.w r7, [sp], #4
  50462. 8014cbc: 4770 bx lr
  50463. 8014cbe: bf00 nop
  50464. 8014cc0: e000e010 .word 0xe000e010
  50465. 8014cc4: e000e018 .word 0xe000e018
  50466. 8014cc8: 2400000c .word 0x2400000c
  50467. 8014ccc: 10624dd3 .word 0x10624dd3
  50468. 8014cd0: e000e014 .word 0xe000e014
  50469. 08014cd4 <vPortEnableVFP>:
  50470. /*-----------------------------------------------------------*/
  50471. /* This is a naked function. */
  50472. static void vPortEnableVFP( void )
  50473. {
  50474. __asm volatile
  50475. 8014cd4: f8df 000c ldr.w r0, [pc, #12] @ 8014ce4 <vPortEnableVFP+0x10>
  50476. 8014cd8: 6801 ldr r1, [r0, #0]
  50477. 8014cda: f441 0170 orr.w r1, r1, #15728640 @ 0xf00000
  50478. 8014cde: 6001 str r1, [r0, #0]
  50479. 8014ce0: 4770 bx lr
  50480. " \n"
  50481. " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */
  50482. " str r1, [r0] \n"
  50483. " bx r14 "
  50484. );
  50485. }
  50486. 8014ce2: bf00 nop
  50487. 8014ce4: e000ed88 .word 0xe000ed88
  50488. 08014ce8 <vPortValidateInterruptPriority>:
  50489. /*-----------------------------------------------------------*/
  50490. #if( configASSERT_DEFINED == 1 )
  50491. void vPortValidateInterruptPriority( void )
  50492. {
  50493. 8014ce8: b480 push {r7}
  50494. 8014cea: b085 sub sp, #20
  50495. 8014cec: af00 add r7, sp, #0
  50496. uint32_t ulCurrentInterrupt;
  50497. uint8_t ucCurrentPriority;
  50498. /* Obtain the number of the currently executing interrupt. */
  50499. __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" );
  50500. 8014cee: f3ef 8305 mrs r3, IPSR
  50501. 8014cf2: 60fb str r3, [r7, #12]
  50502. /* Is the interrupt number a user defined interrupt? */
  50503. if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
  50504. 8014cf4: 68fb ldr r3, [r7, #12]
  50505. 8014cf6: 2b0f cmp r3, #15
  50506. 8014cf8: d915 bls.n 8014d26 <vPortValidateInterruptPriority+0x3e>
  50507. {
  50508. /* Look up the interrupt's priority. */
  50509. ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
  50510. 8014cfa: 4a18 ldr r2, [pc, #96] @ (8014d5c <vPortValidateInterruptPriority+0x74>)
  50511. 8014cfc: 68fb ldr r3, [r7, #12]
  50512. 8014cfe: 4413 add r3, r2
  50513. 8014d00: 781b ldrb r3, [r3, #0]
  50514. 8014d02: 72fb strb r3, [r7, #11]
  50515. interrupt entry is as fast and simple as possible.
  50516. The following links provide detailed information:
  50517. http://www.freertos.org/RTOS-Cortex-M3-M4.html
  50518. http://www.freertos.org/FAQHelp.html */
  50519. configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
  50520. 8014d04: 4b16 ldr r3, [pc, #88] @ (8014d60 <vPortValidateInterruptPriority+0x78>)
  50521. 8014d06: 781b ldrb r3, [r3, #0]
  50522. 8014d08: 7afa ldrb r2, [r7, #11]
  50523. 8014d0a: 429a cmp r2, r3
  50524. 8014d0c: d20b bcs.n 8014d26 <vPortValidateInterruptPriority+0x3e>
  50525. __asm volatile
  50526. 8014d0e: f04f 0350 mov.w r3, #80 @ 0x50
  50527. 8014d12: f383 8811 msr BASEPRI, r3
  50528. 8014d16: f3bf 8f6f isb sy
  50529. 8014d1a: f3bf 8f4f dsb sy
  50530. 8014d1e: 607b str r3, [r7, #4]
  50531. }
  50532. 8014d20: bf00 nop
  50533. 8014d22: bf00 nop
  50534. 8014d24: e7fd b.n 8014d22 <vPortValidateInterruptPriority+0x3a>
  50535. configuration then the correct setting can be achieved on all Cortex-M
  50536. devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
  50537. scheduler. Note however that some vendor specific peripheral libraries
  50538. assume a non-zero priority group setting, in which cases using a value
  50539. of zero will result in unpredictable behaviour. */
  50540. configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
  50541. 8014d26: 4b0f ldr r3, [pc, #60] @ (8014d64 <vPortValidateInterruptPriority+0x7c>)
  50542. 8014d28: 681b ldr r3, [r3, #0]
  50543. 8014d2a: f403 62e0 and.w r2, r3, #1792 @ 0x700
  50544. 8014d2e: 4b0e ldr r3, [pc, #56] @ (8014d68 <vPortValidateInterruptPriority+0x80>)
  50545. 8014d30: 681b ldr r3, [r3, #0]
  50546. 8014d32: 429a cmp r2, r3
  50547. 8014d34: d90b bls.n 8014d4e <vPortValidateInterruptPriority+0x66>
  50548. __asm volatile
  50549. 8014d36: f04f 0350 mov.w r3, #80 @ 0x50
  50550. 8014d3a: f383 8811 msr BASEPRI, r3
  50551. 8014d3e: f3bf 8f6f isb sy
  50552. 8014d42: f3bf 8f4f dsb sy
  50553. 8014d46: 603b str r3, [r7, #0]
  50554. }
  50555. 8014d48: bf00 nop
  50556. 8014d4a: bf00 nop
  50557. 8014d4c: e7fd b.n 8014d4a <vPortValidateInterruptPriority+0x62>
  50558. }
  50559. 8014d4e: bf00 nop
  50560. 8014d50: 3714 adds r7, #20
  50561. 8014d52: 46bd mov sp, r7
  50562. 8014d54: f85d 7b04 ldr.w r7, [sp], #4
  50563. 8014d58: 4770 bx lr
  50564. 8014d5a: bf00 nop
  50565. 8014d5c: e000e3f0 .word 0xe000e3f0
  50566. 8014d60: 240042bc .word 0x240042bc
  50567. 8014d64: e000ed0c .word 0xe000ed0c
  50568. 8014d68: 240042c0 .word 0x240042c0
  50569. 08014d6c <pvPortMalloc>:
  50570. static size_t xBlockAllocatedBit = 0;
  50571. /*-----------------------------------------------------------*/
  50572. void *pvPortMalloc( size_t xWantedSize )
  50573. {
  50574. 8014d6c: b580 push {r7, lr}
  50575. 8014d6e: b08a sub sp, #40 @ 0x28
  50576. 8014d70: af00 add r7, sp, #0
  50577. 8014d72: 6078 str r0, [r7, #4]
  50578. BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
  50579. void *pvReturn = NULL;
  50580. 8014d74: 2300 movs r3, #0
  50581. 8014d76: 61fb str r3, [r7, #28]
  50582. vTaskSuspendAll();
  50583. 8014d78: f7fe f9ec bl 8013154 <vTaskSuspendAll>
  50584. {
  50585. /* If this is the first call to malloc then the heap will require
  50586. initialisation to setup the list of free blocks. */
  50587. if( pxEnd == NULL )
  50588. 8014d7c: 4b5c ldr r3, [pc, #368] @ (8014ef0 <pvPortMalloc+0x184>)
  50589. 8014d7e: 681b ldr r3, [r3, #0]
  50590. 8014d80: 2b00 cmp r3, #0
  50591. 8014d82: d101 bne.n 8014d88 <pvPortMalloc+0x1c>
  50592. {
  50593. prvHeapInit();
  50594. 8014d84: f000 f924 bl 8014fd0 <prvHeapInit>
  50595. /* Check the requested block size is not so large that the top bit is
  50596. set. The top bit of the block size member of the BlockLink_t structure
  50597. is used to determine who owns the block - the application or the
  50598. kernel, so it must be free. */
  50599. if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
  50600. 8014d88: 4b5a ldr r3, [pc, #360] @ (8014ef4 <pvPortMalloc+0x188>)
  50601. 8014d8a: 681a ldr r2, [r3, #0]
  50602. 8014d8c: 687b ldr r3, [r7, #4]
  50603. 8014d8e: 4013 ands r3, r2
  50604. 8014d90: 2b00 cmp r3, #0
  50605. 8014d92: f040 8095 bne.w 8014ec0 <pvPortMalloc+0x154>
  50606. {
  50607. /* The wanted size is increased so it can contain a BlockLink_t
  50608. structure in addition to the requested amount of bytes. */
  50609. if( xWantedSize > 0 )
  50610. 8014d96: 687b ldr r3, [r7, #4]
  50611. 8014d98: 2b00 cmp r3, #0
  50612. 8014d9a: d01e beq.n 8014dda <pvPortMalloc+0x6e>
  50613. {
  50614. xWantedSize += xHeapStructSize;
  50615. 8014d9c: 2208 movs r2, #8
  50616. 8014d9e: 687b ldr r3, [r7, #4]
  50617. 8014da0: 4413 add r3, r2
  50618. 8014da2: 607b str r3, [r7, #4]
  50619. /* Ensure that blocks are always aligned to the required number
  50620. of bytes. */
  50621. if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
  50622. 8014da4: 687b ldr r3, [r7, #4]
  50623. 8014da6: f003 0307 and.w r3, r3, #7
  50624. 8014daa: 2b00 cmp r3, #0
  50625. 8014dac: d015 beq.n 8014dda <pvPortMalloc+0x6e>
  50626. {
  50627. /* Byte alignment required. */
  50628. xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
  50629. 8014dae: 687b ldr r3, [r7, #4]
  50630. 8014db0: f023 0307 bic.w r3, r3, #7
  50631. 8014db4: 3308 adds r3, #8
  50632. 8014db6: 607b str r3, [r7, #4]
  50633. configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 );
  50634. 8014db8: 687b ldr r3, [r7, #4]
  50635. 8014dba: f003 0307 and.w r3, r3, #7
  50636. 8014dbe: 2b00 cmp r3, #0
  50637. 8014dc0: d00b beq.n 8014dda <pvPortMalloc+0x6e>
  50638. __asm volatile
  50639. 8014dc2: f04f 0350 mov.w r3, #80 @ 0x50
  50640. 8014dc6: f383 8811 msr BASEPRI, r3
  50641. 8014dca: f3bf 8f6f isb sy
  50642. 8014dce: f3bf 8f4f dsb sy
  50643. 8014dd2: 617b str r3, [r7, #20]
  50644. }
  50645. 8014dd4: bf00 nop
  50646. 8014dd6: bf00 nop
  50647. 8014dd8: e7fd b.n 8014dd6 <pvPortMalloc+0x6a>
  50648. else
  50649. {
  50650. mtCOVERAGE_TEST_MARKER();
  50651. }
  50652. if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
  50653. 8014dda: 687b ldr r3, [r7, #4]
  50654. 8014ddc: 2b00 cmp r3, #0
  50655. 8014dde: d06f beq.n 8014ec0 <pvPortMalloc+0x154>
  50656. 8014de0: 4b45 ldr r3, [pc, #276] @ (8014ef8 <pvPortMalloc+0x18c>)
  50657. 8014de2: 681b ldr r3, [r3, #0]
  50658. 8014de4: 687a ldr r2, [r7, #4]
  50659. 8014de6: 429a cmp r2, r3
  50660. 8014de8: d86a bhi.n 8014ec0 <pvPortMalloc+0x154>
  50661. {
  50662. /* Traverse the list from the start (lowest address) block until
  50663. one of adequate size is found. */
  50664. pxPreviousBlock = &xStart;
  50665. 8014dea: 4b44 ldr r3, [pc, #272] @ (8014efc <pvPortMalloc+0x190>)
  50666. 8014dec: 623b str r3, [r7, #32]
  50667. pxBlock = xStart.pxNextFreeBlock;
  50668. 8014dee: 4b43 ldr r3, [pc, #268] @ (8014efc <pvPortMalloc+0x190>)
  50669. 8014df0: 681b ldr r3, [r3, #0]
  50670. 8014df2: 627b str r3, [r7, #36] @ 0x24
  50671. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  50672. 8014df4: e004 b.n 8014e00 <pvPortMalloc+0x94>
  50673. {
  50674. pxPreviousBlock = pxBlock;
  50675. 8014df6: 6a7b ldr r3, [r7, #36] @ 0x24
  50676. 8014df8: 623b str r3, [r7, #32]
  50677. pxBlock = pxBlock->pxNextFreeBlock;
  50678. 8014dfa: 6a7b ldr r3, [r7, #36] @ 0x24
  50679. 8014dfc: 681b ldr r3, [r3, #0]
  50680. 8014dfe: 627b str r3, [r7, #36] @ 0x24
  50681. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  50682. 8014e00: 6a7b ldr r3, [r7, #36] @ 0x24
  50683. 8014e02: 685b ldr r3, [r3, #4]
  50684. 8014e04: 687a ldr r2, [r7, #4]
  50685. 8014e06: 429a cmp r2, r3
  50686. 8014e08: d903 bls.n 8014e12 <pvPortMalloc+0xa6>
  50687. 8014e0a: 6a7b ldr r3, [r7, #36] @ 0x24
  50688. 8014e0c: 681b ldr r3, [r3, #0]
  50689. 8014e0e: 2b00 cmp r3, #0
  50690. 8014e10: d1f1 bne.n 8014df6 <pvPortMalloc+0x8a>
  50691. }
  50692. /* If the end marker was reached then a block of adequate size
  50693. was not found. */
  50694. if( pxBlock != pxEnd )
  50695. 8014e12: 4b37 ldr r3, [pc, #220] @ (8014ef0 <pvPortMalloc+0x184>)
  50696. 8014e14: 681b ldr r3, [r3, #0]
  50697. 8014e16: 6a7a ldr r2, [r7, #36] @ 0x24
  50698. 8014e18: 429a cmp r2, r3
  50699. 8014e1a: d051 beq.n 8014ec0 <pvPortMalloc+0x154>
  50700. {
  50701. /* Return the memory space pointed to - jumping over the
  50702. BlockLink_t structure at its start. */
  50703. pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
  50704. 8014e1c: 6a3b ldr r3, [r7, #32]
  50705. 8014e1e: 681b ldr r3, [r3, #0]
  50706. 8014e20: 2208 movs r2, #8
  50707. 8014e22: 4413 add r3, r2
  50708. 8014e24: 61fb str r3, [r7, #28]
  50709. /* This block is being returned for use so must be taken out
  50710. of the list of free blocks. */
  50711. pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
  50712. 8014e26: 6a7b ldr r3, [r7, #36] @ 0x24
  50713. 8014e28: 681a ldr r2, [r3, #0]
  50714. 8014e2a: 6a3b ldr r3, [r7, #32]
  50715. 8014e2c: 601a str r2, [r3, #0]
  50716. /* If the block is larger than required it can be split into
  50717. two. */
  50718. if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
  50719. 8014e2e: 6a7b ldr r3, [r7, #36] @ 0x24
  50720. 8014e30: 685a ldr r2, [r3, #4]
  50721. 8014e32: 687b ldr r3, [r7, #4]
  50722. 8014e34: 1ad2 subs r2, r2, r3
  50723. 8014e36: 2308 movs r3, #8
  50724. 8014e38: 005b lsls r3, r3, #1
  50725. 8014e3a: 429a cmp r2, r3
  50726. 8014e3c: d920 bls.n 8014e80 <pvPortMalloc+0x114>
  50727. {
  50728. /* This block is to be split into two. Create a new
  50729. block following the number of bytes requested. The void
  50730. cast is used to prevent byte alignment warnings from the
  50731. compiler. */
  50732. pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
  50733. 8014e3e: 6a7a ldr r2, [r7, #36] @ 0x24
  50734. 8014e40: 687b ldr r3, [r7, #4]
  50735. 8014e42: 4413 add r3, r2
  50736. 8014e44: 61bb str r3, [r7, #24]
  50737. configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 );
  50738. 8014e46: 69bb ldr r3, [r7, #24]
  50739. 8014e48: f003 0307 and.w r3, r3, #7
  50740. 8014e4c: 2b00 cmp r3, #0
  50741. 8014e4e: d00b beq.n 8014e68 <pvPortMalloc+0xfc>
  50742. __asm volatile
  50743. 8014e50: f04f 0350 mov.w r3, #80 @ 0x50
  50744. 8014e54: f383 8811 msr BASEPRI, r3
  50745. 8014e58: f3bf 8f6f isb sy
  50746. 8014e5c: f3bf 8f4f dsb sy
  50747. 8014e60: 613b str r3, [r7, #16]
  50748. }
  50749. 8014e62: bf00 nop
  50750. 8014e64: bf00 nop
  50751. 8014e66: e7fd b.n 8014e64 <pvPortMalloc+0xf8>
  50752. /* Calculate the sizes of two blocks split from the
  50753. single block. */
  50754. pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
  50755. 8014e68: 6a7b ldr r3, [r7, #36] @ 0x24
  50756. 8014e6a: 685a ldr r2, [r3, #4]
  50757. 8014e6c: 687b ldr r3, [r7, #4]
  50758. 8014e6e: 1ad2 subs r2, r2, r3
  50759. 8014e70: 69bb ldr r3, [r7, #24]
  50760. 8014e72: 605a str r2, [r3, #4]
  50761. pxBlock->xBlockSize = xWantedSize;
  50762. 8014e74: 6a7b ldr r3, [r7, #36] @ 0x24
  50763. 8014e76: 687a ldr r2, [r7, #4]
  50764. 8014e78: 605a str r2, [r3, #4]
  50765. /* Insert the new block into the list of free blocks. */
  50766. prvInsertBlockIntoFreeList( pxNewBlockLink );
  50767. 8014e7a: 69b8 ldr r0, [r7, #24]
  50768. 8014e7c: f000 f90a bl 8015094 <prvInsertBlockIntoFreeList>
  50769. else
  50770. {
  50771. mtCOVERAGE_TEST_MARKER();
  50772. }
  50773. xFreeBytesRemaining -= pxBlock->xBlockSize;
  50774. 8014e80: 4b1d ldr r3, [pc, #116] @ (8014ef8 <pvPortMalloc+0x18c>)
  50775. 8014e82: 681a ldr r2, [r3, #0]
  50776. 8014e84: 6a7b ldr r3, [r7, #36] @ 0x24
  50777. 8014e86: 685b ldr r3, [r3, #4]
  50778. 8014e88: 1ad3 subs r3, r2, r3
  50779. 8014e8a: 4a1b ldr r2, [pc, #108] @ (8014ef8 <pvPortMalloc+0x18c>)
  50780. 8014e8c: 6013 str r3, [r2, #0]
  50781. if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
  50782. 8014e8e: 4b1a ldr r3, [pc, #104] @ (8014ef8 <pvPortMalloc+0x18c>)
  50783. 8014e90: 681a ldr r2, [r3, #0]
  50784. 8014e92: 4b1b ldr r3, [pc, #108] @ (8014f00 <pvPortMalloc+0x194>)
  50785. 8014e94: 681b ldr r3, [r3, #0]
  50786. 8014e96: 429a cmp r2, r3
  50787. 8014e98: d203 bcs.n 8014ea2 <pvPortMalloc+0x136>
  50788. {
  50789. xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
  50790. 8014e9a: 4b17 ldr r3, [pc, #92] @ (8014ef8 <pvPortMalloc+0x18c>)
  50791. 8014e9c: 681b ldr r3, [r3, #0]
  50792. 8014e9e: 4a18 ldr r2, [pc, #96] @ (8014f00 <pvPortMalloc+0x194>)
  50793. 8014ea0: 6013 str r3, [r2, #0]
  50794. mtCOVERAGE_TEST_MARKER();
  50795. }
  50796. /* The block is being returned - it is allocated and owned
  50797. by the application and has no "next" block. */
  50798. pxBlock->xBlockSize |= xBlockAllocatedBit;
  50799. 8014ea2: 6a7b ldr r3, [r7, #36] @ 0x24
  50800. 8014ea4: 685a ldr r2, [r3, #4]
  50801. 8014ea6: 4b13 ldr r3, [pc, #76] @ (8014ef4 <pvPortMalloc+0x188>)
  50802. 8014ea8: 681b ldr r3, [r3, #0]
  50803. 8014eaa: 431a orrs r2, r3
  50804. 8014eac: 6a7b ldr r3, [r7, #36] @ 0x24
  50805. 8014eae: 605a str r2, [r3, #4]
  50806. pxBlock->pxNextFreeBlock = NULL;
  50807. 8014eb0: 6a7b ldr r3, [r7, #36] @ 0x24
  50808. 8014eb2: 2200 movs r2, #0
  50809. 8014eb4: 601a str r2, [r3, #0]
  50810. xNumberOfSuccessfulAllocations++;
  50811. 8014eb6: 4b13 ldr r3, [pc, #76] @ (8014f04 <pvPortMalloc+0x198>)
  50812. 8014eb8: 681b ldr r3, [r3, #0]
  50813. 8014eba: 3301 adds r3, #1
  50814. 8014ebc: 4a11 ldr r2, [pc, #68] @ (8014f04 <pvPortMalloc+0x198>)
  50815. 8014ebe: 6013 str r3, [r2, #0]
  50816. mtCOVERAGE_TEST_MARKER();
  50817. }
  50818. traceMALLOC( pvReturn, xWantedSize );
  50819. }
  50820. ( void ) xTaskResumeAll();
  50821. 8014ec0: f7fe f956 bl 8013170 <xTaskResumeAll>
  50822. mtCOVERAGE_TEST_MARKER();
  50823. }
  50824. }
  50825. #endif
  50826. configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 );
  50827. 8014ec4: 69fb ldr r3, [r7, #28]
  50828. 8014ec6: f003 0307 and.w r3, r3, #7
  50829. 8014eca: 2b00 cmp r3, #0
  50830. 8014ecc: d00b beq.n 8014ee6 <pvPortMalloc+0x17a>
  50831. __asm volatile
  50832. 8014ece: f04f 0350 mov.w r3, #80 @ 0x50
  50833. 8014ed2: f383 8811 msr BASEPRI, r3
  50834. 8014ed6: f3bf 8f6f isb sy
  50835. 8014eda: f3bf 8f4f dsb sy
  50836. 8014ede: 60fb str r3, [r7, #12]
  50837. }
  50838. 8014ee0: bf00 nop
  50839. 8014ee2: bf00 nop
  50840. 8014ee4: e7fd b.n 8014ee2 <pvPortMalloc+0x176>
  50841. return pvReturn;
  50842. 8014ee6: 69fb ldr r3, [r7, #28]
  50843. }
  50844. 8014ee8: 4618 mov r0, r3
  50845. 8014eea: 3728 adds r7, #40 @ 0x28
  50846. 8014eec: 46bd mov sp, r7
  50847. 8014eee: bd80 pop {r7, pc}
  50848. 8014ef0: 240242cc .word 0x240242cc
  50849. 8014ef4: 240242e0 .word 0x240242e0
  50850. 8014ef8: 240242d0 .word 0x240242d0
  50851. 8014efc: 240242c4 .word 0x240242c4
  50852. 8014f00: 240242d4 .word 0x240242d4
  50853. 8014f04: 240242d8 .word 0x240242d8
  50854. 08014f08 <vPortFree>:
  50855. /*-----------------------------------------------------------*/
  50856. void vPortFree( void *pv )
  50857. {
  50858. 8014f08: b580 push {r7, lr}
  50859. 8014f0a: b086 sub sp, #24
  50860. 8014f0c: af00 add r7, sp, #0
  50861. 8014f0e: 6078 str r0, [r7, #4]
  50862. uint8_t *puc = ( uint8_t * ) pv;
  50863. 8014f10: 687b ldr r3, [r7, #4]
  50864. 8014f12: 617b str r3, [r7, #20]
  50865. BlockLink_t *pxLink;
  50866. if( pv != NULL )
  50867. 8014f14: 687b ldr r3, [r7, #4]
  50868. 8014f16: 2b00 cmp r3, #0
  50869. 8014f18: d04f beq.n 8014fba <vPortFree+0xb2>
  50870. {
  50871. /* The memory being freed will have an BlockLink_t structure immediately
  50872. before it. */
  50873. puc -= xHeapStructSize;
  50874. 8014f1a: 2308 movs r3, #8
  50875. 8014f1c: 425b negs r3, r3
  50876. 8014f1e: 697a ldr r2, [r7, #20]
  50877. 8014f20: 4413 add r3, r2
  50878. 8014f22: 617b str r3, [r7, #20]
  50879. /* This casting is to keep the compiler from issuing warnings. */
  50880. pxLink = ( void * ) puc;
  50881. 8014f24: 697b ldr r3, [r7, #20]
  50882. 8014f26: 613b str r3, [r7, #16]
  50883. /* Check the block is actually allocated. */
  50884. configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
  50885. 8014f28: 693b ldr r3, [r7, #16]
  50886. 8014f2a: 685a ldr r2, [r3, #4]
  50887. 8014f2c: 4b25 ldr r3, [pc, #148] @ (8014fc4 <vPortFree+0xbc>)
  50888. 8014f2e: 681b ldr r3, [r3, #0]
  50889. 8014f30: 4013 ands r3, r2
  50890. 8014f32: 2b00 cmp r3, #0
  50891. 8014f34: d10b bne.n 8014f4e <vPortFree+0x46>
  50892. __asm volatile
  50893. 8014f36: f04f 0350 mov.w r3, #80 @ 0x50
  50894. 8014f3a: f383 8811 msr BASEPRI, r3
  50895. 8014f3e: f3bf 8f6f isb sy
  50896. 8014f42: f3bf 8f4f dsb sy
  50897. 8014f46: 60fb str r3, [r7, #12]
  50898. }
  50899. 8014f48: bf00 nop
  50900. 8014f4a: bf00 nop
  50901. 8014f4c: e7fd b.n 8014f4a <vPortFree+0x42>
  50902. configASSERT( pxLink->pxNextFreeBlock == NULL );
  50903. 8014f4e: 693b ldr r3, [r7, #16]
  50904. 8014f50: 681b ldr r3, [r3, #0]
  50905. 8014f52: 2b00 cmp r3, #0
  50906. 8014f54: d00b beq.n 8014f6e <vPortFree+0x66>
  50907. __asm volatile
  50908. 8014f56: f04f 0350 mov.w r3, #80 @ 0x50
  50909. 8014f5a: f383 8811 msr BASEPRI, r3
  50910. 8014f5e: f3bf 8f6f isb sy
  50911. 8014f62: f3bf 8f4f dsb sy
  50912. 8014f66: 60bb str r3, [r7, #8]
  50913. }
  50914. 8014f68: bf00 nop
  50915. 8014f6a: bf00 nop
  50916. 8014f6c: e7fd b.n 8014f6a <vPortFree+0x62>
  50917. if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )
  50918. 8014f6e: 693b ldr r3, [r7, #16]
  50919. 8014f70: 685a ldr r2, [r3, #4]
  50920. 8014f72: 4b14 ldr r3, [pc, #80] @ (8014fc4 <vPortFree+0xbc>)
  50921. 8014f74: 681b ldr r3, [r3, #0]
  50922. 8014f76: 4013 ands r3, r2
  50923. 8014f78: 2b00 cmp r3, #0
  50924. 8014f7a: d01e beq.n 8014fba <vPortFree+0xb2>
  50925. {
  50926. if( pxLink->pxNextFreeBlock == NULL )
  50927. 8014f7c: 693b ldr r3, [r7, #16]
  50928. 8014f7e: 681b ldr r3, [r3, #0]
  50929. 8014f80: 2b00 cmp r3, #0
  50930. 8014f82: d11a bne.n 8014fba <vPortFree+0xb2>
  50931. {
  50932. /* The block is being returned to the heap - it is no longer
  50933. allocated. */
  50934. pxLink->xBlockSize &= ~xBlockAllocatedBit;
  50935. 8014f84: 693b ldr r3, [r7, #16]
  50936. 8014f86: 685a ldr r2, [r3, #4]
  50937. 8014f88: 4b0e ldr r3, [pc, #56] @ (8014fc4 <vPortFree+0xbc>)
  50938. 8014f8a: 681b ldr r3, [r3, #0]
  50939. 8014f8c: 43db mvns r3, r3
  50940. 8014f8e: 401a ands r2, r3
  50941. 8014f90: 693b ldr r3, [r7, #16]
  50942. 8014f92: 605a str r2, [r3, #4]
  50943. vTaskSuspendAll();
  50944. 8014f94: f7fe f8de bl 8013154 <vTaskSuspendAll>
  50945. {
  50946. /* Add this block to the list of free blocks. */
  50947. xFreeBytesRemaining += pxLink->xBlockSize;
  50948. 8014f98: 693b ldr r3, [r7, #16]
  50949. 8014f9a: 685a ldr r2, [r3, #4]
  50950. 8014f9c: 4b0a ldr r3, [pc, #40] @ (8014fc8 <vPortFree+0xc0>)
  50951. 8014f9e: 681b ldr r3, [r3, #0]
  50952. 8014fa0: 4413 add r3, r2
  50953. 8014fa2: 4a09 ldr r2, [pc, #36] @ (8014fc8 <vPortFree+0xc0>)
  50954. 8014fa4: 6013 str r3, [r2, #0]
  50955. traceFREE( pv, pxLink->xBlockSize );
  50956. prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
  50957. 8014fa6: 6938 ldr r0, [r7, #16]
  50958. 8014fa8: f000 f874 bl 8015094 <prvInsertBlockIntoFreeList>
  50959. xNumberOfSuccessfulFrees++;
  50960. 8014fac: 4b07 ldr r3, [pc, #28] @ (8014fcc <vPortFree+0xc4>)
  50961. 8014fae: 681b ldr r3, [r3, #0]
  50962. 8014fb0: 3301 adds r3, #1
  50963. 8014fb2: 4a06 ldr r2, [pc, #24] @ (8014fcc <vPortFree+0xc4>)
  50964. 8014fb4: 6013 str r3, [r2, #0]
  50965. }
  50966. ( void ) xTaskResumeAll();
  50967. 8014fb6: f7fe f8db bl 8013170 <xTaskResumeAll>
  50968. else
  50969. {
  50970. mtCOVERAGE_TEST_MARKER();
  50971. }
  50972. }
  50973. }
  50974. 8014fba: bf00 nop
  50975. 8014fbc: 3718 adds r7, #24
  50976. 8014fbe: 46bd mov sp, r7
  50977. 8014fc0: bd80 pop {r7, pc}
  50978. 8014fc2: bf00 nop
  50979. 8014fc4: 240242e0 .word 0x240242e0
  50980. 8014fc8: 240242d0 .word 0x240242d0
  50981. 8014fcc: 240242dc .word 0x240242dc
  50982. 08014fd0 <prvHeapInit>:
  50983. /* This just exists to keep the linker quiet. */
  50984. }
  50985. /*-----------------------------------------------------------*/
  50986. static void prvHeapInit( void )
  50987. {
  50988. 8014fd0: b480 push {r7}
  50989. 8014fd2: b085 sub sp, #20
  50990. 8014fd4: af00 add r7, sp, #0
  50991. BlockLink_t *pxFirstFreeBlock;
  50992. uint8_t *pucAlignedHeap;
  50993. size_t uxAddress;
  50994. size_t xTotalHeapSize = configTOTAL_HEAP_SIZE;
  50995. 8014fd6: f44f 3300 mov.w r3, #131072 @ 0x20000
  50996. 8014fda: 60bb str r3, [r7, #8]
  50997. /* Ensure the heap starts on a correctly aligned boundary. */
  50998. uxAddress = ( size_t ) ucHeap;
  50999. 8014fdc: 4b27 ldr r3, [pc, #156] @ (801507c <prvHeapInit+0xac>)
  51000. 8014fde: 60fb str r3, [r7, #12]
  51001. if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
  51002. 8014fe0: 68fb ldr r3, [r7, #12]
  51003. 8014fe2: f003 0307 and.w r3, r3, #7
  51004. 8014fe6: 2b00 cmp r3, #0
  51005. 8014fe8: d00c beq.n 8015004 <prvHeapInit+0x34>
  51006. {
  51007. uxAddress += ( portBYTE_ALIGNMENT - 1 );
  51008. 8014fea: 68fb ldr r3, [r7, #12]
  51009. 8014fec: 3307 adds r3, #7
  51010. 8014fee: 60fb str r3, [r7, #12]
  51011. uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK );
  51012. 8014ff0: 68fb ldr r3, [r7, #12]
  51013. 8014ff2: f023 0307 bic.w r3, r3, #7
  51014. 8014ff6: 60fb str r3, [r7, #12]
  51015. xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;
  51016. 8014ff8: 68ba ldr r2, [r7, #8]
  51017. 8014ffa: 68fb ldr r3, [r7, #12]
  51018. 8014ffc: 1ad3 subs r3, r2, r3
  51019. 8014ffe: 4a1f ldr r2, [pc, #124] @ (801507c <prvHeapInit+0xac>)
  51020. 8015000: 4413 add r3, r2
  51021. 8015002: 60bb str r3, [r7, #8]
  51022. }
  51023. pucAlignedHeap = ( uint8_t * ) uxAddress;
  51024. 8015004: 68fb ldr r3, [r7, #12]
  51025. 8015006: 607b str r3, [r7, #4]
  51026. /* xStart is used to hold a pointer to the first item in the list of free
  51027. blocks. The void cast is used to prevent compiler warnings. */
  51028. xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
  51029. 8015008: 4a1d ldr r2, [pc, #116] @ (8015080 <prvHeapInit+0xb0>)
  51030. 801500a: 687b ldr r3, [r7, #4]
  51031. 801500c: 6013 str r3, [r2, #0]
  51032. xStart.xBlockSize = ( size_t ) 0;
  51033. 801500e: 4b1c ldr r3, [pc, #112] @ (8015080 <prvHeapInit+0xb0>)
  51034. 8015010: 2200 movs r2, #0
  51035. 8015012: 605a str r2, [r3, #4]
  51036. /* pxEnd is used to mark the end of the list of free blocks and is inserted
  51037. at the end of the heap space. */
  51038. uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;
  51039. 8015014: 687b ldr r3, [r7, #4]
  51040. 8015016: 68ba ldr r2, [r7, #8]
  51041. 8015018: 4413 add r3, r2
  51042. 801501a: 60fb str r3, [r7, #12]
  51043. uxAddress -= xHeapStructSize;
  51044. 801501c: 2208 movs r2, #8
  51045. 801501e: 68fb ldr r3, [r7, #12]
  51046. 8015020: 1a9b subs r3, r3, r2
  51047. 8015022: 60fb str r3, [r7, #12]
  51048. uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK );
  51049. 8015024: 68fb ldr r3, [r7, #12]
  51050. 8015026: f023 0307 bic.w r3, r3, #7
  51051. 801502a: 60fb str r3, [r7, #12]
  51052. pxEnd = ( void * ) uxAddress;
  51053. 801502c: 68fb ldr r3, [r7, #12]
  51054. 801502e: 4a15 ldr r2, [pc, #84] @ (8015084 <prvHeapInit+0xb4>)
  51055. 8015030: 6013 str r3, [r2, #0]
  51056. pxEnd->xBlockSize = 0;
  51057. 8015032: 4b14 ldr r3, [pc, #80] @ (8015084 <prvHeapInit+0xb4>)
  51058. 8015034: 681b ldr r3, [r3, #0]
  51059. 8015036: 2200 movs r2, #0
  51060. 8015038: 605a str r2, [r3, #4]
  51061. pxEnd->pxNextFreeBlock = NULL;
  51062. 801503a: 4b12 ldr r3, [pc, #72] @ (8015084 <prvHeapInit+0xb4>)
  51063. 801503c: 681b ldr r3, [r3, #0]
  51064. 801503e: 2200 movs r2, #0
  51065. 8015040: 601a str r2, [r3, #0]
  51066. /* To start with there is a single free block that is sized to take up the
  51067. entire heap space, minus the space taken by pxEnd. */
  51068. pxFirstFreeBlock = ( void * ) pucAlignedHeap;
  51069. 8015042: 687b ldr r3, [r7, #4]
  51070. 8015044: 603b str r3, [r7, #0]
  51071. pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;
  51072. 8015046: 683b ldr r3, [r7, #0]
  51073. 8015048: 68fa ldr r2, [r7, #12]
  51074. 801504a: 1ad2 subs r2, r2, r3
  51075. 801504c: 683b ldr r3, [r7, #0]
  51076. 801504e: 605a str r2, [r3, #4]
  51077. pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
  51078. 8015050: 4b0c ldr r3, [pc, #48] @ (8015084 <prvHeapInit+0xb4>)
  51079. 8015052: 681a ldr r2, [r3, #0]
  51080. 8015054: 683b ldr r3, [r7, #0]
  51081. 8015056: 601a str r2, [r3, #0]
  51082. /* Only one block exists - and it covers the entire usable heap space. */
  51083. xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  51084. 8015058: 683b ldr r3, [r7, #0]
  51085. 801505a: 685b ldr r3, [r3, #4]
  51086. 801505c: 4a0a ldr r2, [pc, #40] @ (8015088 <prvHeapInit+0xb8>)
  51087. 801505e: 6013 str r3, [r2, #0]
  51088. xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  51089. 8015060: 683b ldr r3, [r7, #0]
  51090. 8015062: 685b ldr r3, [r3, #4]
  51091. 8015064: 4a09 ldr r2, [pc, #36] @ (801508c <prvHeapInit+0xbc>)
  51092. 8015066: 6013 str r3, [r2, #0]
  51093. /* Work out the position of the top bit in a size_t variable. */
  51094. xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 );
  51095. 8015068: 4b09 ldr r3, [pc, #36] @ (8015090 <prvHeapInit+0xc0>)
  51096. 801506a: f04f 4200 mov.w r2, #2147483648 @ 0x80000000
  51097. 801506e: 601a str r2, [r3, #0]
  51098. }
  51099. 8015070: bf00 nop
  51100. 8015072: 3714 adds r7, #20
  51101. 8015074: 46bd mov sp, r7
  51102. 8015076: f85d 7b04 ldr.w r7, [sp], #4
  51103. 801507a: 4770 bx lr
  51104. 801507c: 240042c4 .word 0x240042c4
  51105. 8015080: 240242c4 .word 0x240242c4
  51106. 8015084: 240242cc .word 0x240242cc
  51107. 8015088: 240242d4 .word 0x240242d4
  51108. 801508c: 240242d0 .word 0x240242d0
  51109. 8015090: 240242e0 .word 0x240242e0
  51110. 08015094 <prvInsertBlockIntoFreeList>:
  51111. /*-----------------------------------------------------------*/
  51112. static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert )
  51113. {
  51114. 8015094: b480 push {r7}
  51115. 8015096: b085 sub sp, #20
  51116. 8015098: af00 add r7, sp, #0
  51117. 801509a: 6078 str r0, [r7, #4]
  51118. BlockLink_t *pxIterator;
  51119. uint8_t *puc;
  51120. /* Iterate through the list until a block is found that has a higher address
  51121. than the block being inserted. */
  51122. for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
  51123. 801509c: 4b28 ldr r3, [pc, #160] @ (8015140 <prvInsertBlockIntoFreeList+0xac>)
  51124. 801509e: 60fb str r3, [r7, #12]
  51125. 80150a0: e002 b.n 80150a8 <prvInsertBlockIntoFreeList+0x14>
  51126. 80150a2: 68fb ldr r3, [r7, #12]
  51127. 80150a4: 681b ldr r3, [r3, #0]
  51128. 80150a6: 60fb str r3, [r7, #12]
  51129. 80150a8: 68fb ldr r3, [r7, #12]
  51130. 80150aa: 681b ldr r3, [r3, #0]
  51131. 80150ac: 687a ldr r2, [r7, #4]
  51132. 80150ae: 429a cmp r2, r3
  51133. 80150b0: d8f7 bhi.n 80150a2 <prvInsertBlockIntoFreeList+0xe>
  51134. /* Nothing to do here, just iterate to the right position. */
  51135. }
  51136. /* Do the block being inserted, and the block it is being inserted after
  51137. make a contiguous block of memory? */
  51138. puc = ( uint8_t * ) pxIterator;
  51139. 80150b2: 68fb ldr r3, [r7, #12]
  51140. 80150b4: 60bb str r3, [r7, #8]
  51141. if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
  51142. 80150b6: 68fb ldr r3, [r7, #12]
  51143. 80150b8: 685b ldr r3, [r3, #4]
  51144. 80150ba: 68ba ldr r2, [r7, #8]
  51145. 80150bc: 4413 add r3, r2
  51146. 80150be: 687a ldr r2, [r7, #4]
  51147. 80150c0: 429a cmp r2, r3
  51148. 80150c2: d108 bne.n 80150d6 <prvInsertBlockIntoFreeList+0x42>
  51149. {
  51150. pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
  51151. 80150c4: 68fb ldr r3, [r7, #12]
  51152. 80150c6: 685a ldr r2, [r3, #4]
  51153. 80150c8: 687b ldr r3, [r7, #4]
  51154. 80150ca: 685b ldr r3, [r3, #4]
  51155. 80150cc: 441a add r2, r3
  51156. 80150ce: 68fb ldr r3, [r7, #12]
  51157. 80150d0: 605a str r2, [r3, #4]
  51158. pxBlockToInsert = pxIterator;
  51159. 80150d2: 68fb ldr r3, [r7, #12]
  51160. 80150d4: 607b str r3, [r7, #4]
  51161. mtCOVERAGE_TEST_MARKER();
  51162. }
  51163. /* Do the block being inserted, and the block it is being inserted before
  51164. make a contiguous block of memory? */
  51165. puc = ( uint8_t * ) pxBlockToInsert;
  51166. 80150d6: 687b ldr r3, [r7, #4]
  51167. 80150d8: 60bb str r3, [r7, #8]
  51168. if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
  51169. 80150da: 687b ldr r3, [r7, #4]
  51170. 80150dc: 685b ldr r3, [r3, #4]
  51171. 80150de: 68ba ldr r2, [r7, #8]
  51172. 80150e0: 441a add r2, r3
  51173. 80150e2: 68fb ldr r3, [r7, #12]
  51174. 80150e4: 681b ldr r3, [r3, #0]
  51175. 80150e6: 429a cmp r2, r3
  51176. 80150e8: d118 bne.n 801511c <prvInsertBlockIntoFreeList+0x88>
  51177. {
  51178. if( pxIterator->pxNextFreeBlock != pxEnd )
  51179. 80150ea: 68fb ldr r3, [r7, #12]
  51180. 80150ec: 681a ldr r2, [r3, #0]
  51181. 80150ee: 4b15 ldr r3, [pc, #84] @ (8015144 <prvInsertBlockIntoFreeList+0xb0>)
  51182. 80150f0: 681b ldr r3, [r3, #0]
  51183. 80150f2: 429a cmp r2, r3
  51184. 80150f4: d00d beq.n 8015112 <prvInsertBlockIntoFreeList+0x7e>
  51185. {
  51186. /* Form one big block from the two blocks. */
  51187. pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
  51188. 80150f6: 687b ldr r3, [r7, #4]
  51189. 80150f8: 685a ldr r2, [r3, #4]
  51190. 80150fa: 68fb ldr r3, [r7, #12]
  51191. 80150fc: 681b ldr r3, [r3, #0]
  51192. 80150fe: 685b ldr r3, [r3, #4]
  51193. 8015100: 441a add r2, r3
  51194. 8015102: 687b ldr r3, [r7, #4]
  51195. 8015104: 605a str r2, [r3, #4]
  51196. pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
  51197. 8015106: 68fb ldr r3, [r7, #12]
  51198. 8015108: 681b ldr r3, [r3, #0]
  51199. 801510a: 681a ldr r2, [r3, #0]
  51200. 801510c: 687b ldr r3, [r7, #4]
  51201. 801510e: 601a str r2, [r3, #0]
  51202. 8015110: e008 b.n 8015124 <prvInsertBlockIntoFreeList+0x90>
  51203. }
  51204. else
  51205. {
  51206. pxBlockToInsert->pxNextFreeBlock = pxEnd;
  51207. 8015112: 4b0c ldr r3, [pc, #48] @ (8015144 <prvInsertBlockIntoFreeList+0xb0>)
  51208. 8015114: 681a ldr r2, [r3, #0]
  51209. 8015116: 687b ldr r3, [r7, #4]
  51210. 8015118: 601a str r2, [r3, #0]
  51211. 801511a: e003 b.n 8015124 <prvInsertBlockIntoFreeList+0x90>
  51212. }
  51213. }
  51214. else
  51215. {
  51216. pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
  51217. 801511c: 68fb ldr r3, [r7, #12]
  51218. 801511e: 681a ldr r2, [r3, #0]
  51219. 8015120: 687b ldr r3, [r7, #4]
  51220. 8015122: 601a str r2, [r3, #0]
  51221. /* If the block being inserted plugged a gab, so was merged with the block
  51222. before and the block after, then it's pxNextFreeBlock pointer will have
  51223. already been set, and should not be set here as that would make it point
  51224. to itself. */
  51225. if( pxIterator != pxBlockToInsert )
  51226. 8015124: 68fa ldr r2, [r7, #12]
  51227. 8015126: 687b ldr r3, [r7, #4]
  51228. 8015128: 429a cmp r2, r3
  51229. 801512a: d002 beq.n 8015132 <prvInsertBlockIntoFreeList+0x9e>
  51230. {
  51231. pxIterator->pxNextFreeBlock = pxBlockToInsert;
  51232. 801512c: 68fb ldr r3, [r7, #12]
  51233. 801512e: 687a ldr r2, [r7, #4]
  51234. 8015130: 601a str r2, [r3, #0]
  51235. }
  51236. else
  51237. {
  51238. mtCOVERAGE_TEST_MARKER();
  51239. }
  51240. }
  51241. 8015132: bf00 nop
  51242. 8015134: 3714 adds r7, #20
  51243. 8015136: 46bd mov sp, r7
  51244. 8015138: f85d 7b04 ldr.w r7, [sp], #4
  51245. 801513c: 4770 bx lr
  51246. 801513e: bf00 nop
  51247. 8015140: 240242c4 .word 0x240242c4
  51248. 8015144: 240242cc .word 0x240242cc
  51249. 08015148 <netconn_apimsg>:
  51250. * @param apimsg a struct containing the function to call and its parameters
  51251. * @return ERR_OK if the function was called, another err_t if not
  51252. */
  51253. static err_t
  51254. netconn_apimsg(tcpip_callback_fn fn, struct api_msg *apimsg)
  51255. {
  51256. 8015148: b580 push {r7, lr}
  51257. 801514a: b084 sub sp, #16
  51258. 801514c: af00 add r7, sp, #0
  51259. 801514e: 6078 str r0, [r7, #4]
  51260. 8015150: 6039 str r1, [r7, #0]
  51261. err_t err;
  51262. #ifdef LWIP_DEBUG
  51263. /* catch functions that don't set err */
  51264. apimsg->err = ERR_VAL;
  51265. 8015152: 683b ldr r3, [r7, #0]
  51266. 8015154: 22fa movs r2, #250 @ 0xfa
  51267. 8015156: 711a strb r2, [r3, #4]
  51268. #if LWIP_NETCONN_SEM_PER_THREAD
  51269. apimsg->op_completed_sem = LWIP_NETCONN_THREAD_SEM_GET();
  51270. #endif /* LWIP_NETCONN_SEM_PER_THREAD */
  51271. err = tcpip_send_msg_wait_sem(fn, apimsg, LWIP_API_MSG_SEM(apimsg));
  51272. 8015158: 683b ldr r3, [r7, #0]
  51273. 801515a: 681b ldr r3, [r3, #0]
  51274. 801515c: 330c adds r3, #12
  51275. 801515e: 461a mov r2, r3
  51276. 8015160: 6839 ldr r1, [r7, #0]
  51277. 8015162: 6878 ldr r0, [r7, #4]
  51278. 8015164: f003 fc7c bl 8018a60 <tcpip_send_msg_wait_sem>
  51279. 8015168: 4603 mov r3, r0
  51280. 801516a: 73fb strb r3, [r7, #15]
  51281. if (err == ERR_OK) {
  51282. 801516c: f997 300f ldrsb.w r3, [r7, #15]
  51283. 8015170: 2b00 cmp r3, #0
  51284. 8015172: d103 bne.n 801517c <netconn_apimsg+0x34>
  51285. return apimsg->err;
  51286. 8015174: 683b ldr r3, [r7, #0]
  51287. 8015176: f993 3004 ldrsb.w r3, [r3, #4]
  51288. 801517a: e001 b.n 8015180 <netconn_apimsg+0x38>
  51289. }
  51290. return err;
  51291. 801517c: f997 300f ldrsb.w r3, [r7, #15]
  51292. }
  51293. 8015180: 4618 mov r0, r3
  51294. 8015182: 3710 adds r7, #16
  51295. 8015184: 46bd mov sp, r7
  51296. 8015186: bd80 pop {r7, pc}
  51297. 08015188 <netconn_new_with_proto_and_callback>:
  51298. * @return a newly allocated struct netconn or
  51299. * NULL on memory error
  51300. */
  51301. struct netconn *
  51302. netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback)
  51303. {
  51304. 8015188: b580 push {r7, lr}
  51305. 801518a: b08c sub sp, #48 @ 0x30
  51306. 801518c: af00 add r7, sp, #0
  51307. 801518e: 4603 mov r3, r0
  51308. 8015190: 603a str r2, [r7, #0]
  51309. 8015192: 71fb strb r3, [r7, #7]
  51310. 8015194: 460b mov r3, r1
  51311. 8015196: 71bb strb r3, [r7, #6]
  51312. struct netconn *conn;
  51313. API_MSG_VAR_DECLARE(msg);
  51314. API_MSG_VAR_ALLOC_RETURN_NULL(msg);
  51315. conn = netconn_alloc(t, callback);
  51316. 8015198: 79fb ldrb r3, [r7, #7]
  51317. 801519a: 6839 ldr r1, [r7, #0]
  51318. 801519c: 4618 mov r0, r3
  51319. 801519e: f001 f8ad bl 80162fc <netconn_alloc>
  51320. 80151a2: 62f8 str r0, [r7, #44] @ 0x2c
  51321. if (conn != NULL) {
  51322. 80151a4: 6afb ldr r3, [r7, #44] @ 0x2c
  51323. 80151a6: 2b00 cmp r3, #0
  51324. 80151a8: d054 beq.n 8015254 <netconn_new_with_proto_and_callback+0xcc>
  51325. err_t err;
  51326. API_MSG_VAR_REF(msg).msg.n.proto = proto;
  51327. 80151aa: 79bb ldrb r3, [r7, #6]
  51328. 80151ac: 743b strb r3, [r7, #16]
  51329. API_MSG_VAR_REF(msg).conn = conn;
  51330. 80151ae: 6afb ldr r3, [r7, #44] @ 0x2c
  51331. 80151b0: 60bb str r3, [r7, #8]
  51332. err = netconn_apimsg(lwip_netconn_do_newconn, &API_MSG_VAR_REF(msg));
  51333. 80151b2: f107 0308 add.w r3, r7, #8
  51334. 80151b6: 4619 mov r1, r3
  51335. 80151b8: 4829 ldr r0, [pc, #164] @ (8015260 <netconn_new_with_proto_and_callback+0xd8>)
  51336. 80151ba: f7ff ffc5 bl 8015148 <netconn_apimsg>
  51337. 80151be: 4603 mov r3, r0
  51338. 80151c0: f887 302b strb.w r3, [r7, #43] @ 0x2b
  51339. if (err != ERR_OK) {
  51340. 80151c4: f997 302b ldrsb.w r3, [r7, #43] @ 0x2b
  51341. 80151c8: 2b00 cmp r3, #0
  51342. 80151ca: d043 beq.n 8015254 <netconn_new_with_proto_and_callback+0xcc>
  51343. LWIP_ASSERT("freeing conn without freeing pcb", conn->pcb.tcp == NULL);
  51344. 80151cc: 6afb ldr r3, [r7, #44] @ 0x2c
  51345. 80151ce: 685b ldr r3, [r3, #4]
  51346. 80151d0: 2b00 cmp r3, #0
  51347. 80151d2: d005 beq.n 80151e0 <netconn_new_with_proto_and_callback+0x58>
  51348. 80151d4: 4b23 ldr r3, [pc, #140] @ (8015264 <netconn_new_with_proto_and_callback+0xdc>)
  51349. 80151d6: 22a3 movs r2, #163 @ 0xa3
  51350. 80151d8: 4923 ldr r1, [pc, #140] @ (8015268 <netconn_new_with_proto_and_callback+0xe0>)
  51351. 80151da: 4824 ldr r0, [pc, #144] @ (801526c <netconn_new_with_proto_and_callback+0xe4>)
  51352. 80151dc: f014 fbf6 bl 80299cc <iprintf>
  51353. LWIP_ASSERT("conn has no recvmbox", sys_mbox_valid(&conn->recvmbox));
  51354. 80151e0: 6afb ldr r3, [r7, #44] @ 0x2c
  51355. 80151e2: 3310 adds r3, #16
  51356. 80151e4: 4618 mov r0, r3
  51357. 80151e6: f011 f851 bl 802628c <sys_mbox_valid>
  51358. 80151ea: 4603 mov r3, r0
  51359. 80151ec: 2b00 cmp r3, #0
  51360. 80151ee: d105 bne.n 80151fc <netconn_new_with_proto_and_callback+0x74>
  51361. 80151f0: 4b1c ldr r3, [pc, #112] @ (8015264 <netconn_new_with_proto_and_callback+0xdc>)
  51362. 80151f2: 22a4 movs r2, #164 @ 0xa4
  51363. 80151f4: 491e ldr r1, [pc, #120] @ (8015270 <netconn_new_with_proto_and_callback+0xe8>)
  51364. 80151f6: 481d ldr r0, [pc, #116] @ (801526c <netconn_new_with_proto_and_callback+0xe4>)
  51365. 80151f8: f014 fbe8 bl 80299cc <iprintf>
  51366. #if LWIP_TCP
  51367. LWIP_ASSERT("conn->acceptmbox shouldn't exist", !sys_mbox_valid(&conn->acceptmbox));
  51368. 80151fc: 6afb ldr r3, [r7, #44] @ 0x2c
  51369. 80151fe: 3314 adds r3, #20
  51370. 8015200: 4618 mov r0, r3
  51371. 8015202: f011 f843 bl 802628c <sys_mbox_valid>
  51372. 8015206: 4603 mov r3, r0
  51373. 8015208: 2b00 cmp r3, #0
  51374. 801520a: d005 beq.n 8015218 <netconn_new_with_proto_and_callback+0x90>
  51375. 801520c: 4b15 ldr r3, [pc, #84] @ (8015264 <netconn_new_with_proto_and_callback+0xdc>)
  51376. 801520e: 22a6 movs r2, #166 @ 0xa6
  51377. 8015210: 4918 ldr r1, [pc, #96] @ (8015274 <netconn_new_with_proto_and_callback+0xec>)
  51378. 8015212: 4816 ldr r0, [pc, #88] @ (801526c <netconn_new_with_proto_and_callback+0xe4>)
  51379. 8015214: f014 fbda bl 80299cc <iprintf>
  51380. #endif /* LWIP_TCP */
  51381. #if !LWIP_NETCONN_SEM_PER_THREAD
  51382. LWIP_ASSERT("conn has no op_completed", sys_sem_valid(&conn->op_completed));
  51383. 8015218: 6afb ldr r3, [r7, #44] @ 0x2c
  51384. 801521a: 330c adds r3, #12
  51385. 801521c: 4618 mov r0, r3
  51386. 801521e: f011 f8c3 bl 80263a8 <sys_sem_valid>
  51387. 8015222: 4603 mov r3, r0
  51388. 8015224: 2b00 cmp r3, #0
  51389. 8015226: d105 bne.n 8015234 <netconn_new_with_proto_and_callback+0xac>
  51390. 8015228: 4b0e ldr r3, [pc, #56] @ (8015264 <netconn_new_with_proto_and_callback+0xdc>)
  51391. 801522a: 22a9 movs r2, #169 @ 0xa9
  51392. 801522c: 4912 ldr r1, [pc, #72] @ (8015278 <netconn_new_with_proto_and_callback+0xf0>)
  51393. 801522e: 480f ldr r0, [pc, #60] @ (801526c <netconn_new_with_proto_and_callback+0xe4>)
  51394. 8015230: f014 fbcc bl 80299cc <iprintf>
  51395. sys_sem_free(&conn->op_completed);
  51396. 8015234: 6afb ldr r3, [r7, #44] @ 0x2c
  51397. 8015236: 330c adds r3, #12
  51398. 8015238: 4618 mov r0, r3
  51399. 801523a: f011 f8a8 bl 802638e <sys_sem_free>
  51400. #endif /* !LWIP_NETCONN_SEM_PER_THREAD */
  51401. sys_mbox_free(&conn->recvmbox);
  51402. 801523e: 6afb ldr r3, [r7, #44] @ 0x2c
  51403. 8015240: 3310 adds r3, #16
  51404. 8015242: 4618 mov r0, r3
  51405. 8015244: f010 ffae bl 80261a4 <sys_mbox_free>
  51406. memp_free(MEMP_NETCONN, conn);
  51407. 8015248: 6af9 ldr r1, [r7, #44] @ 0x2c
  51408. 801524a: 2007 movs r0, #7
  51409. 801524c: f004 fa58 bl 8019700 <memp_free>
  51410. API_MSG_VAR_FREE(msg);
  51411. return NULL;
  51412. 8015250: 2300 movs r3, #0
  51413. 8015252: e000 b.n 8015256 <netconn_new_with_proto_and_callback+0xce>
  51414. }
  51415. }
  51416. API_MSG_VAR_FREE(msg);
  51417. return conn;
  51418. 8015254: 6afb ldr r3, [r7, #44] @ 0x2c
  51419. }
  51420. 8015256: 4618 mov r0, r3
  51421. 8015258: 3730 adds r7, #48 @ 0x30
  51422. 801525a: 46bd mov sp, r7
  51423. 801525c: bd80 pop {r7, pc}
  51424. 801525e: bf00 nop
  51425. 8015260: 080162d1 .word 0x080162d1
  51426. 8015264: 0802cb84 .word 0x0802cb84
  51427. 8015268: 0802cbb8 .word 0x0802cbb8
  51428. 801526c: 0802cbdc .word 0x0802cbdc
  51429. 8015270: 0802cc04 .word 0x0802cc04
  51430. 8015274: 0802cc1c .word 0x0802cc1c
  51431. 8015278: 0802cc40 .word 0x0802cc40
  51432. 0801527c <netconn_prepare_delete>:
  51433. * @param conn the netconn to delete
  51434. * @return ERR_OK if the connection was deleted
  51435. */
  51436. err_t
  51437. netconn_prepare_delete(struct netconn *conn)
  51438. {
  51439. 801527c: b580 push {r7, lr}
  51440. 801527e: b08c sub sp, #48 @ 0x30
  51441. 8015280: af00 add r7, sp, #0
  51442. 8015282: 6078 str r0, [r7, #4]
  51443. err_t err;
  51444. API_MSG_VAR_DECLARE(msg);
  51445. /* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */
  51446. if (conn == NULL) {
  51447. 8015284: 687b ldr r3, [r7, #4]
  51448. 8015286: 2b00 cmp r3, #0
  51449. 8015288: d101 bne.n 801528e <netconn_prepare_delete+0x12>
  51450. return ERR_OK;
  51451. 801528a: 2300 movs r3, #0
  51452. 801528c: e014 b.n 80152b8 <netconn_prepare_delete+0x3c>
  51453. }
  51454. API_MSG_VAR_ALLOC(msg);
  51455. API_MSG_VAR_REF(msg).conn = conn;
  51456. 801528e: 687b ldr r3, [r7, #4]
  51457. 8015290: 60fb str r3, [r7, #12]
  51458. /* get the time we started, which is later compared to
  51459. sys_now() + conn->send_timeout */
  51460. API_MSG_VAR_REF(msg).msg.sd.time_started = sys_now();
  51461. #else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
  51462. #if LWIP_TCP
  51463. API_MSG_VAR_REF(msg).msg.sd.polls_left =
  51464. 8015292: 2329 movs r3, #41 @ 0x29
  51465. 8015294: 757b strb r3, [r7, #21]
  51466. ((LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT + TCP_SLOW_INTERVAL - 1) / TCP_SLOW_INTERVAL) + 1;
  51467. #endif /* LWIP_TCP */
  51468. #endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
  51469. err = netconn_apimsg(lwip_netconn_do_delconn, &API_MSG_VAR_REF(msg));
  51470. 8015296: f107 030c add.w r3, r7, #12
  51471. 801529a: 4619 mov r1, r3
  51472. 801529c: 4808 ldr r0, [pc, #32] @ (80152c0 <netconn_prepare_delete+0x44>)
  51473. 801529e: f7ff ff53 bl 8015148 <netconn_apimsg>
  51474. 80152a2: 4603 mov r3, r0
  51475. 80152a4: f887 302f strb.w r3, [r7, #47] @ 0x2f
  51476. API_MSG_VAR_FREE(msg);
  51477. if (err != ERR_OK) {
  51478. 80152a8: f997 302f ldrsb.w r3, [r7, #47] @ 0x2f
  51479. 80152ac: 2b00 cmp r3, #0
  51480. 80152ae: d002 beq.n 80152b6 <netconn_prepare_delete+0x3a>
  51481. return err;
  51482. 80152b0: f997 302f ldrsb.w r3, [r7, #47] @ 0x2f
  51483. 80152b4: e000 b.n 80152b8 <netconn_prepare_delete+0x3c>
  51484. }
  51485. return ERR_OK;
  51486. 80152b6: 2300 movs r3, #0
  51487. }
  51488. 80152b8: 4618 mov r0, r3
  51489. 80152ba: 3730 adds r7, #48 @ 0x30
  51490. 80152bc: 46bd mov sp, r7
  51491. 80152be: bd80 pop {r7, pc}
  51492. 80152c0: 08016855 .word 0x08016855
  51493. 080152c4 <netconn_delete>:
  51494. * @param conn the netconn to delete
  51495. * @return ERR_OK if the connection was deleted
  51496. */
  51497. err_t
  51498. netconn_delete(struct netconn *conn)
  51499. {
  51500. 80152c4: b580 push {r7, lr}
  51501. 80152c6: b084 sub sp, #16
  51502. 80152c8: af00 add r7, sp, #0
  51503. 80152ca: 6078 str r0, [r7, #4]
  51504. err_t err;
  51505. /* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */
  51506. if (conn == NULL) {
  51507. 80152cc: 687b ldr r3, [r7, #4]
  51508. 80152ce: 2b00 cmp r3, #0
  51509. 80152d0: d101 bne.n 80152d6 <netconn_delete+0x12>
  51510. return ERR_OK;
  51511. 80152d2: 2300 movs r3, #0
  51512. 80152d4: e00d b.n 80152f2 <netconn_delete+0x2e>
  51513. /* Already called netconn_prepare_delete() before */
  51514. err = ERR_OK;
  51515. } else
  51516. #endif /* LWIP_NETCONN_FULLDUPLEX */
  51517. {
  51518. err = netconn_prepare_delete(conn);
  51519. 80152d6: 6878 ldr r0, [r7, #4]
  51520. 80152d8: f7ff ffd0 bl 801527c <netconn_prepare_delete>
  51521. 80152dc: 4603 mov r3, r0
  51522. 80152de: 73fb strb r3, [r7, #15]
  51523. }
  51524. if (err == ERR_OK) {
  51525. 80152e0: f997 300f ldrsb.w r3, [r7, #15]
  51526. 80152e4: 2b00 cmp r3, #0
  51527. 80152e6: d102 bne.n 80152ee <netconn_delete+0x2a>
  51528. netconn_free(conn);
  51529. 80152e8: 6878 ldr r0, [r7, #4]
  51530. 80152ea: f001 f881 bl 80163f0 <netconn_free>
  51531. }
  51532. return err;
  51533. 80152ee: f997 300f ldrsb.w r3, [r7, #15]
  51534. }
  51535. 80152f2: 4618 mov r0, r3
  51536. 80152f4: 3710 adds r7, #16
  51537. 80152f6: 46bd mov sp, r7
  51538. 80152f8: bd80 pop {r7, pc}
  51539. ...
  51540. 080152fc <netconn_getaddr>:
  51541. * @return ERR_CONN for invalid connections
  51542. * ERR_OK if the information was retrieved
  51543. */
  51544. err_t
  51545. netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local)
  51546. {
  51547. 80152fc: b580 push {r7, lr}
  51548. 80152fe: b08e sub sp, #56 @ 0x38
  51549. 8015300: af00 add r7, sp, #0
  51550. 8015302: 60f8 str r0, [r7, #12]
  51551. 8015304: 60b9 str r1, [r7, #8]
  51552. 8015306: 607a str r2, [r7, #4]
  51553. 8015308: 70fb strb r3, [r7, #3]
  51554. API_MSG_VAR_DECLARE(msg);
  51555. err_t err;
  51556. LWIP_ERROR("netconn_getaddr: invalid conn", (conn != NULL), return ERR_ARG;);
  51557. 801530a: 68fb ldr r3, [r7, #12]
  51558. 801530c: 2b00 cmp r3, #0
  51559. 801530e: d109 bne.n 8015324 <netconn_getaddr+0x28>
  51560. 8015310: 4b1d ldr r3, [pc, #116] @ (8015388 <netconn_getaddr+0x8c>)
  51561. 8015312: f44f 7289 mov.w r2, #274 @ 0x112
  51562. 8015316: 491d ldr r1, [pc, #116] @ (801538c <netconn_getaddr+0x90>)
  51563. 8015318: 481d ldr r0, [pc, #116] @ (8015390 <netconn_getaddr+0x94>)
  51564. 801531a: f014 fb57 bl 80299cc <iprintf>
  51565. 801531e: f06f 030f mvn.w r3, #15
  51566. 8015322: e02d b.n 8015380 <netconn_getaddr+0x84>
  51567. LWIP_ERROR("netconn_getaddr: invalid addr", (addr != NULL), return ERR_ARG;);
  51568. 8015324: 68bb ldr r3, [r7, #8]
  51569. 8015326: 2b00 cmp r3, #0
  51570. 8015328: d109 bne.n 801533e <netconn_getaddr+0x42>
  51571. 801532a: 4b17 ldr r3, [pc, #92] @ (8015388 <netconn_getaddr+0x8c>)
  51572. 801532c: f240 1213 movw r2, #275 @ 0x113
  51573. 8015330: 4918 ldr r1, [pc, #96] @ (8015394 <netconn_getaddr+0x98>)
  51574. 8015332: 4817 ldr r0, [pc, #92] @ (8015390 <netconn_getaddr+0x94>)
  51575. 8015334: f014 fb4a bl 80299cc <iprintf>
  51576. 8015338: f06f 030f mvn.w r3, #15
  51577. 801533c: e020 b.n 8015380 <netconn_getaddr+0x84>
  51578. LWIP_ERROR("netconn_getaddr: invalid port", (port != NULL), return ERR_ARG;);
  51579. 801533e: 687b ldr r3, [r7, #4]
  51580. 8015340: 2b00 cmp r3, #0
  51581. 8015342: d109 bne.n 8015358 <netconn_getaddr+0x5c>
  51582. 8015344: 4b10 ldr r3, [pc, #64] @ (8015388 <netconn_getaddr+0x8c>)
  51583. 8015346: f44f 728a mov.w r2, #276 @ 0x114
  51584. 801534a: 4913 ldr r1, [pc, #76] @ (8015398 <netconn_getaddr+0x9c>)
  51585. 801534c: 4810 ldr r0, [pc, #64] @ (8015390 <netconn_getaddr+0x94>)
  51586. 801534e: f014 fb3d bl 80299cc <iprintf>
  51587. 8015352: f06f 030f mvn.w r3, #15
  51588. 8015356: e013 b.n 8015380 <netconn_getaddr+0x84>
  51589. API_MSG_VAR_ALLOC(msg);
  51590. API_MSG_VAR_REF(msg).conn = conn;
  51591. 8015358: 68fb ldr r3, [r7, #12]
  51592. 801535a: 617b str r3, [r7, #20]
  51593. API_MSG_VAR_REF(msg).msg.ad.local = local;
  51594. 801535c: 78fb ldrb r3, [r7, #3]
  51595. 801535e: f887 3024 strb.w r3, [r7, #36] @ 0x24
  51596. #if LWIP_MPU_COMPATIBLE
  51597. err = netconn_apimsg(lwip_netconn_do_getaddr, &API_MSG_VAR_REF(msg));
  51598. *addr = msg->msg.ad.ipaddr;
  51599. *port = msg->msg.ad.port;
  51600. #else /* LWIP_MPU_COMPATIBLE */
  51601. msg.msg.ad.ipaddr = addr;
  51602. 8015362: 68bb ldr r3, [r7, #8]
  51603. 8015364: 61fb str r3, [r7, #28]
  51604. msg.msg.ad.port = port;
  51605. 8015366: 687b ldr r3, [r7, #4]
  51606. 8015368: 623b str r3, [r7, #32]
  51607. err = netconn_apimsg(lwip_netconn_do_getaddr, &msg);
  51608. 801536a: f107 0314 add.w r3, r7, #20
  51609. 801536e: 4619 mov r1, r3
  51610. 8015370: 480a ldr r0, [pc, #40] @ (801539c <netconn_getaddr+0xa0>)
  51611. 8015372: f7ff fee9 bl 8015148 <netconn_apimsg>
  51612. 8015376: 4603 mov r3, r0
  51613. 8015378: f887 3037 strb.w r3, [r7, #55] @ 0x37
  51614. #endif /* LWIP_MPU_COMPATIBLE */
  51615. API_MSG_VAR_FREE(msg);
  51616. return err;
  51617. 801537c: f997 3037 ldrsb.w r3, [r7, #55] @ 0x37
  51618. }
  51619. 8015380: 4618 mov r0, r3
  51620. 8015382: 3738 adds r7, #56 @ 0x38
  51621. 8015384: 46bd mov sp, r7
  51622. 8015386: bd80 pop {r7, pc}
  51623. 8015388: 0802cb84 .word 0x0802cb84
  51624. 801538c: 0802cc5c .word 0x0802cc5c
  51625. 8015390: 0802cbdc .word 0x0802cbdc
  51626. 8015394: 0802cc7c .word 0x0802cc7c
  51627. 8015398: 0802cc9c .word 0x0802cc9c
  51628. 801539c: 080172b1 .word 0x080172b1
  51629. 080153a0 <netconn_connect>:
  51630. * @param port the remote port to connect to (no used for RAW)
  51631. * @return ERR_OK if connected, return value of tcp_/udp_/raw_connect otherwise
  51632. */
  51633. err_t
  51634. netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port)
  51635. {
  51636. 80153a0: b580 push {r7, lr}
  51637. 80153a2: b08e sub sp, #56 @ 0x38
  51638. 80153a4: af00 add r7, sp, #0
  51639. 80153a6: 60f8 str r0, [r7, #12]
  51640. 80153a8: 60b9 str r1, [r7, #8]
  51641. 80153aa: 4613 mov r3, r2
  51642. 80153ac: 80fb strh r3, [r7, #6]
  51643. API_MSG_VAR_DECLARE(msg);
  51644. err_t err;
  51645. LWIP_ERROR("netconn_connect: invalid conn", (conn != NULL), return ERR_ARG;);
  51646. 80153ae: 68fb ldr r3, [r7, #12]
  51647. 80153b0: 2b00 cmp r3, #0
  51648. 80153b2: d109 bne.n 80153c8 <netconn_connect+0x28>
  51649. 80153b4: 4b11 ldr r3, [pc, #68] @ (80153fc <netconn_connect+0x5c>)
  51650. 80153b6: f44f 72bf mov.w r2, #382 @ 0x17e
  51651. 80153ba: 4911 ldr r1, [pc, #68] @ (8015400 <netconn_connect+0x60>)
  51652. 80153bc: 4811 ldr r0, [pc, #68] @ (8015404 <netconn_connect+0x64>)
  51653. 80153be: f014 fb05 bl 80299cc <iprintf>
  51654. 80153c2: f06f 030f mvn.w r3, #15
  51655. 80153c6: e015 b.n 80153f4 <netconn_connect+0x54>
  51656. #if LWIP_IPV4
  51657. /* Don't propagate NULL pointer (IP_ADDR_ANY alias) to subsequent functions */
  51658. if (addr == NULL) {
  51659. 80153c8: 68bb ldr r3, [r7, #8]
  51660. 80153ca: 2b00 cmp r3, #0
  51661. 80153cc: d101 bne.n 80153d2 <netconn_connect+0x32>
  51662. addr = IP4_ADDR_ANY;
  51663. 80153ce: 4b0e ldr r3, [pc, #56] @ (8015408 <netconn_connect+0x68>)
  51664. 80153d0: 60bb str r3, [r7, #8]
  51665. }
  51666. #endif /* LWIP_IPV4 */
  51667. API_MSG_VAR_ALLOC(msg);
  51668. API_MSG_VAR_REF(msg).conn = conn;
  51669. 80153d2: 68fb ldr r3, [r7, #12]
  51670. 80153d4: 617b str r3, [r7, #20]
  51671. API_MSG_VAR_REF(msg).msg.bc.ipaddr = API_MSG_VAR_REF(addr);
  51672. 80153d6: 68bb ldr r3, [r7, #8]
  51673. 80153d8: 61fb str r3, [r7, #28]
  51674. API_MSG_VAR_REF(msg).msg.bc.port = port;
  51675. 80153da: 88fb ldrh r3, [r7, #6]
  51676. 80153dc: 843b strh r3, [r7, #32]
  51677. err = netconn_apimsg(lwip_netconn_do_connect, &API_MSG_VAR_REF(msg));
  51678. 80153de: f107 0314 add.w r3, r7, #20
  51679. 80153e2: 4619 mov r1, r3
  51680. 80153e4: 4809 ldr r0, [pc, #36] @ (801540c <netconn_connect+0x6c>)
  51681. 80153e6: f7ff feaf bl 8015148 <netconn_apimsg>
  51682. 80153ea: 4603 mov r3, r0
  51683. 80153ec: f887 3037 strb.w r3, [r7, #55] @ 0x37
  51684. API_MSG_VAR_FREE(msg);
  51685. return err;
  51686. 80153f0: f997 3037 ldrsb.w r3, [r7, #55] @ 0x37
  51687. }
  51688. 80153f4: 4618 mov r0, r3
  51689. 80153f6: 3738 adds r7, #56 @ 0x38
  51690. 80153f8: 46bd mov sp, r7
  51691. 80153fa: bd80 pop {r7, pc}
  51692. 80153fc: 0802cb84 .word 0x0802cb84
  51693. 8015400: 0802ccf8 .word 0x0802ccf8
  51694. 8015404: 0802cbdc .word 0x0802cbdc
  51695. 8015408: 08030c10 .word 0x08030c10
  51696. 801540c: 08016b41 .word 0x08016b41
  51697. 08015410 <netconn_disconnect>:
  51698. * @param conn the netconn to disconnect
  51699. * @return See @ref err_t
  51700. */
  51701. err_t
  51702. netconn_disconnect(struct netconn *conn)
  51703. {
  51704. 8015410: b580 push {r7, lr}
  51705. 8015412: b08c sub sp, #48 @ 0x30
  51706. 8015414: af00 add r7, sp, #0
  51707. 8015416: 6078 str r0, [r7, #4]
  51708. API_MSG_VAR_DECLARE(msg);
  51709. err_t err;
  51710. LWIP_ERROR("netconn_disconnect: invalid conn", (conn != NULL), return ERR_ARG;);
  51711. 8015418: 687b ldr r3, [r7, #4]
  51712. 801541a: 2b00 cmp r3, #0
  51713. 801541c: d109 bne.n 8015432 <netconn_disconnect+0x22>
  51714. 801541e: 4b0d ldr r3, [pc, #52] @ (8015454 <netconn_disconnect+0x44>)
  51715. 8015420: f44f 72cf mov.w r2, #414 @ 0x19e
  51716. 8015424: 490c ldr r1, [pc, #48] @ (8015458 <netconn_disconnect+0x48>)
  51717. 8015426: 480d ldr r0, [pc, #52] @ (801545c <netconn_disconnect+0x4c>)
  51718. 8015428: f014 fad0 bl 80299cc <iprintf>
  51719. 801542c: f06f 030f mvn.w r3, #15
  51720. 8015430: e00c b.n 801544c <netconn_disconnect+0x3c>
  51721. API_MSG_VAR_ALLOC(msg);
  51722. API_MSG_VAR_REF(msg).conn = conn;
  51723. 8015432: 687b ldr r3, [r7, #4]
  51724. 8015434: 60fb str r3, [r7, #12]
  51725. err = netconn_apimsg(lwip_netconn_do_disconnect, &API_MSG_VAR_REF(msg));
  51726. 8015436: f107 030c add.w r3, r7, #12
  51727. 801543a: 4619 mov r1, r3
  51728. 801543c: 4808 ldr r0, [pc, #32] @ (8015460 <netconn_disconnect+0x50>)
  51729. 801543e: f7ff fe83 bl 8015148 <netconn_apimsg>
  51730. 8015442: 4603 mov r3, r0
  51731. 8015444: f887 302f strb.w r3, [r7, #47] @ 0x2f
  51732. API_MSG_VAR_FREE(msg);
  51733. return err;
  51734. 8015448: f997 302f ldrsb.w r3, [r7, #47] @ 0x2f
  51735. }
  51736. 801544c: 4618 mov r0, r3
  51737. 801544e: 3730 adds r7, #48 @ 0x30
  51738. 8015450: 46bd mov sp, r7
  51739. 8015452: bd80 pop {r7, pc}
  51740. 8015454: 0802cb84 .word 0x0802cb84
  51741. 8015458: 0802cd18 .word 0x0802cd18
  51742. 801545c: 0802cbdc .word 0x0802cbdc
  51743. 8015460: 08016cc1 .word 0x08016cc1
  51744. 08015464 <netconn_recv_data>:
  51745. * ERR_WOULDBLOCK if the netconn is nonblocking but would block to wait for data
  51746. * ERR_TIMEOUT if the netconn has a receive timeout and no data was received
  51747. */
  51748. static err_t
  51749. netconn_recv_data(struct netconn *conn, void **new_buf, u8_t apiflags)
  51750. {
  51751. 8015464: b580 push {r7, lr}
  51752. 8015466: b08a sub sp, #40 @ 0x28
  51753. 8015468: af00 add r7, sp, #0
  51754. 801546a: 60f8 str r0, [r7, #12]
  51755. 801546c: 60b9 str r1, [r7, #8]
  51756. 801546e: 4613 mov r3, r2
  51757. 8015470: 71fb strb r3, [r7, #7]
  51758. void *buf = NULL;
  51759. 8015472: 2300 movs r3, #0
  51760. 8015474: 61bb str r3, [r7, #24]
  51761. u16_t len;
  51762. LWIP_ERROR("netconn_recv: invalid pointer", (new_buf != NULL), return ERR_ARG;);
  51763. 8015476: 68bb ldr r3, [r7, #8]
  51764. 8015478: 2b00 cmp r3, #0
  51765. 801547a: d109 bne.n 8015490 <netconn_recv_data+0x2c>
  51766. 801547c: 4b64 ldr r3, [pc, #400] @ (8015610 <netconn_recv_data+0x1ac>)
  51767. 801547e: f44f 7212 mov.w r2, #584 @ 0x248
  51768. 8015482: 4964 ldr r1, [pc, #400] @ (8015614 <netconn_recv_data+0x1b0>)
  51769. 8015484: 4864 ldr r0, [pc, #400] @ (8015618 <netconn_recv_data+0x1b4>)
  51770. 8015486: f014 faa1 bl 80299cc <iprintf>
  51771. 801548a: f06f 030f mvn.w r3, #15
  51772. 801548e: e0bb b.n 8015608 <netconn_recv_data+0x1a4>
  51773. *new_buf = NULL;
  51774. 8015490: 68bb ldr r3, [r7, #8]
  51775. 8015492: 2200 movs r2, #0
  51776. 8015494: 601a str r2, [r3, #0]
  51777. LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL), return ERR_ARG;);
  51778. 8015496: 68fb ldr r3, [r7, #12]
  51779. 8015498: 2b00 cmp r3, #0
  51780. 801549a: d109 bne.n 80154b0 <netconn_recv_data+0x4c>
  51781. 801549c: 4b5c ldr r3, [pc, #368] @ (8015610 <netconn_recv_data+0x1ac>)
  51782. 801549e: f240 224a movw r2, #586 @ 0x24a
  51783. 80154a2: 495e ldr r1, [pc, #376] @ (801561c <netconn_recv_data+0x1b8>)
  51784. 80154a4: 485c ldr r0, [pc, #368] @ (8015618 <netconn_recv_data+0x1b4>)
  51785. 80154a6: f014 fa91 bl 80299cc <iprintf>
  51786. 80154aa: f06f 030f mvn.w r3, #15
  51787. 80154ae: e0ab b.n 8015608 <netconn_recv_data+0x1a4>
  51788. if (!NETCONN_RECVMBOX_WAITABLE(conn)) {
  51789. 80154b0: 68fb ldr r3, [r7, #12]
  51790. 80154b2: 3310 adds r3, #16
  51791. 80154b4: 4618 mov r0, r3
  51792. 80154b6: f010 fee9 bl 802628c <sys_mbox_valid>
  51793. 80154ba: 4603 mov r3, r0
  51794. 80154bc: 2b00 cmp r3, #0
  51795. 80154be: d10e bne.n 80154de <netconn_recv_data+0x7a>
  51796. err_t err = netconn_err(conn);
  51797. 80154c0: 68f8 ldr r0, [r7, #12]
  51798. 80154c2: f000 fb1f bl 8015b04 <netconn_err>
  51799. 80154c6: 4603 mov r3, r0
  51800. 80154c8: 77fb strb r3, [r7, #31]
  51801. if (err != ERR_OK) {
  51802. 80154ca: f997 301f ldrsb.w r3, [r7, #31]
  51803. 80154ce: 2b00 cmp r3, #0
  51804. 80154d0: d002 beq.n 80154d8 <netconn_recv_data+0x74>
  51805. /* return pending error */
  51806. return err;
  51807. 80154d2: f997 301f ldrsb.w r3, [r7, #31]
  51808. 80154d6: e097 b.n 8015608 <netconn_recv_data+0x1a4>
  51809. }
  51810. return ERR_CONN;
  51811. 80154d8: f06f 030a mvn.w r3, #10
  51812. 80154dc: e094 b.n 8015608 <netconn_recv_data+0x1a4>
  51813. }
  51814. NETCONN_MBOX_WAITING_INC(conn);
  51815. if (netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK) ||
  51816. 80154de: 68fb ldr r3, [r7, #12]
  51817. 80154e0: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  51818. 80154e4: f003 0302 and.w r3, r3, #2
  51819. 80154e8: 2b00 cmp r3, #0
  51820. 80154ea: d110 bne.n 801550e <netconn_recv_data+0xaa>
  51821. 80154ec: 79fb ldrb r3, [r7, #7]
  51822. 80154ee: f003 0304 and.w r3, r3, #4
  51823. 80154f2: 2b00 cmp r3, #0
  51824. 80154f4: d10b bne.n 801550e <netconn_recv_data+0xaa>
  51825. (conn->flags & NETCONN_FLAG_MBOXCLOSED) || (conn->pending_err != ERR_OK)) {
  51826. 80154f6: 68fb ldr r3, [r7, #12]
  51827. 80154f8: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  51828. 80154fc: f003 0301 and.w r3, r3, #1
  51829. if (netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK) ||
  51830. 8015500: 2b00 cmp r3, #0
  51831. 8015502: d104 bne.n 801550e <netconn_recv_data+0xaa>
  51832. (conn->flags & NETCONN_FLAG_MBOXCLOSED) || (conn->pending_err != ERR_OK)) {
  51833. 8015504: 68fb ldr r3, [r7, #12]
  51834. 8015506: f993 3008 ldrsb.w r3, [r3, #8]
  51835. 801550a: 2b00 cmp r3, #0
  51836. 801550c: d025 beq.n 801555a <netconn_recv_data+0xf6>
  51837. if (sys_arch_mbox_tryfetch(&conn->recvmbox, &buf) == SYS_ARCH_TIMEOUT) {
  51838. 801550e: 68fb ldr r3, [r7, #12]
  51839. 8015510: 3310 adds r3, #16
  51840. 8015512: f107 0218 add.w r2, r7, #24
  51841. 8015516: 4611 mov r1, r2
  51842. 8015518: 4618 mov r0, r3
  51843. 801551a: f010 fea0 bl 802625e <sys_arch_mbox_tryfetch>
  51844. 801551e: 4603 mov r3, r0
  51845. 8015520: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  51846. 8015524: d12a bne.n 801557c <netconn_recv_data+0x118>
  51847. err_t err;
  51848. NETCONN_MBOX_WAITING_DEC(conn);
  51849. err = netconn_err(conn);
  51850. 8015526: 68f8 ldr r0, [r7, #12]
  51851. 8015528: f000 faec bl 8015b04 <netconn_err>
  51852. 801552c: 4603 mov r3, r0
  51853. 801552e: f887 3025 strb.w r3, [r7, #37] @ 0x25
  51854. if (err != ERR_OK) {
  51855. 8015532: f997 3025 ldrsb.w r3, [r7, #37] @ 0x25
  51856. 8015536: 2b00 cmp r3, #0
  51857. 8015538: d002 beq.n 8015540 <netconn_recv_data+0xdc>
  51858. /* return pending error */
  51859. return err;
  51860. 801553a: f997 3025 ldrsb.w r3, [r7, #37] @ 0x25
  51861. 801553e: e063 b.n 8015608 <netconn_recv_data+0x1a4>
  51862. }
  51863. if (conn->flags & NETCONN_FLAG_MBOXCLOSED) {
  51864. 8015540: 68fb ldr r3, [r7, #12]
  51865. 8015542: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  51866. 8015546: f003 0301 and.w r3, r3, #1
  51867. 801554a: 2b00 cmp r3, #0
  51868. 801554c: d002 beq.n 8015554 <netconn_recv_data+0xf0>
  51869. return ERR_CONN;
  51870. 801554e: f06f 030a mvn.w r3, #10
  51871. 8015552: e059 b.n 8015608 <netconn_recv_data+0x1a4>
  51872. }
  51873. return ERR_WOULDBLOCK;
  51874. 8015554: f06f 0306 mvn.w r3, #6
  51875. 8015558: e056 b.n 8015608 <netconn_recv_data+0x1a4>
  51876. }
  51877. } else {
  51878. #if LWIP_SO_RCVTIMEO
  51879. if (sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
  51880. 801555a: 68fb ldr r3, [r7, #12]
  51881. 801555c: f103 0010 add.w r0, r3, #16
  51882. 8015560: 68fb ldr r3, [r7, #12]
  51883. 8015562: 69da ldr r2, [r3, #28]
  51884. 8015564: f107 0318 add.w r3, r7, #24
  51885. 8015568: 4619 mov r1, r3
  51886. 801556a: f010 fe47 bl 80261fc <sys_arch_mbox_fetch>
  51887. 801556e: 4603 mov r3, r0
  51888. 8015570: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  51889. 8015574: d102 bne.n 801557c <netconn_recv_data+0x118>
  51890. NETCONN_MBOX_WAITING_DEC(conn);
  51891. return ERR_TIMEOUT;
  51892. 8015576: f06f 0302 mvn.w r3, #2
  51893. 801557a: e045 b.n 8015608 <netconn_recv_data+0x1a4>
  51894. }
  51895. #endif
  51896. #if LWIP_TCP
  51897. #if (LWIP_UDP || LWIP_RAW)
  51898. if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
  51899. 801557c: 68fb ldr r3, [r7, #12]
  51900. 801557e: 781b ldrb r3, [r3, #0]
  51901. 8015580: f003 03f0 and.w r3, r3, #240 @ 0xf0
  51902. 8015584: 2b10 cmp r3, #16
  51903. 8015586: d117 bne.n 80155b8 <netconn_recv_data+0x154>
  51904. #endif /* (LWIP_UDP || LWIP_RAW) */
  51905. {
  51906. err_t err;
  51907. /* Check if this is an error message or a pbuf */
  51908. if (lwip_netconn_is_err_msg(buf, &err)) {
  51909. 8015588: 69bb ldr r3, [r7, #24]
  51910. 801558a: f107 0217 add.w r2, r7, #23
  51911. 801558e: 4611 mov r1, r2
  51912. 8015590: 4618 mov r0, r3
  51913. 8015592: f000 fb09 bl 8015ba8 <lwip_netconn_is_err_msg>
  51914. 8015596: 4603 mov r3, r0
  51915. 8015598: 2b00 cmp r3, #0
  51916. 801559a: d009 beq.n 80155b0 <netconn_recv_data+0x14c>
  51917. /* new_buf has been zeroed above already */
  51918. if (err == ERR_CLSD) {
  51919. 801559c: f997 3017 ldrsb.w r3, [r7, #23]
  51920. 80155a0: f113 0f0f cmn.w r3, #15
  51921. 80155a4: d101 bne.n 80155aa <netconn_recv_data+0x146>
  51922. /* connection closed translates to ERR_OK with *new_buf == NULL */
  51923. return ERR_OK;
  51924. 80155a6: 2300 movs r3, #0
  51925. 80155a8: e02e b.n 8015608 <netconn_recv_data+0x1a4>
  51926. }
  51927. return err;
  51928. 80155aa: f997 3017 ldrsb.w r3, [r7, #23]
  51929. 80155ae: e02b b.n 8015608 <netconn_recv_data+0x1a4>
  51930. }
  51931. len = ((struct pbuf *)buf)->tot_len;
  51932. 80155b0: 69bb ldr r3, [r7, #24]
  51933. 80155b2: 891b ldrh r3, [r3, #8]
  51934. 80155b4: 84fb strh r3, [r7, #38] @ 0x26
  51935. 80155b6: e00d b.n 80155d4 <netconn_recv_data+0x170>
  51936. #if LWIP_TCP && (LWIP_UDP || LWIP_RAW)
  51937. else
  51938. #endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */
  51939. #if (LWIP_UDP || LWIP_RAW)
  51940. {
  51941. LWIP_ASSERT("buf != NULL", buf != NULL);
  51942. 80155b8: 69bb ldr r3, [r7, #24]
  51943. 80155ba: 2b00 cmp r3, #0
  51944. 80155bc: d106 bne.n 80155cc <netconn_recv_data+0x168>
  51945. 80155be: 4b14 ldr r3, [pc, #80] @ (8015610 <netconn_recv_data+0x1ac>)
  51946. 80155c0: f240 2291 movw r2, #657 @ 0x291
  51947. 80155c4: 4916 ldr r1, [pc, #88] @ (8015620 <netconn_recv_data+0x1bc>)
  51948. 80155c6: 4814 ldr r0, [pc, #80] @ (8015618 <netconn_recv_data+0x1b4>)
  51949. 80155c8: f014 fa00 bl 80299cc <iprintf>
  51950. len = netbuf_len((struct netbuf *)buf);
  51951. 80155cc: 69bb ldr r3, [r7, #24]
  51952. 80155ce: 681b ldr r3, [r3, #0]
  51953. 80155d0: 891b ldrh r3, [r3, #8]
  51954. 80155d2: 84fb strh r3, [r7, #38] @ 0x26
  51955. }
  51956. #endif /* (LWIP_UDP || LWIP_RAW) */
  51957. #if LWIP_SO_RCVBUF
  51958. SYS_ARCH_DEC(conn->recv_avail, len);
  51959. 80155d4: f010 ff64 bl 80264a0 <sys_arch_protect>
  51960. 80155d8: 6238 str r0, [r7, #32]
  51961. 80155da: 68fb ldr r3, [r7, #12]
  51962. 80155dc: 6a5a ldr r2, [r3, #36] @ 0x24
  51963. 80155de: 8cfb ldrh r3, [r7, #38] @ 0x26
  51964. 80155e0: 1ad2 subs r2, r2, r3
  51965. 80155e2: 68fb ldr r3, [r7, #12]
  51966. 80155e4: 625a str r2, [r3, #36] @ 0x24
  51967. 80155e6: 6a38 ldr r0, [r7, #32]
  51968. 80155e8: f010 ff68 bl 80264bc <sys_arch_unprotect>
  51969. #endif /* LWIP_SO_RCVBUF */
  51970. /* Register event with callback */
  51971. API_EVENT(conn, NETCONN_EVT_RCVMINUS, len);
  51972. 80155ec: 68fb ldr r3, [r7, #12]
  51973. 80155ee: 6b1b ldr r3, [r3, #48] @ 0x30
  51974. 80155f0: 2b00 cmp r3, #0
  51975. 80155f2: d005 beq.n 8015600 <netconn_recv_data+0x19c>
  51976. 80155f4: 68fb ldr r3, [r7, #12]
  51977. 80155f6: 6b1b ldr r3, [r3, #48] @ 0x30
  51978. 80155f8: 8cfa ldrh r2, [r7, #38] @ 0x26
  51979. 80155fa: 2101 movs r1, #1
  51980. 80155fc: 68f8 ldr r0, [r7, #12]
  51981. 80155fe: 4798 blx r3
  51982. LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_recv_data: received %p, len=%"U16_F"\n", buf, len));
  51983. *new_buf = buf;
  51984. 8015600: 69ba ldr r2, [r7, #24]
  51985. 8015602: 68bb ldr r3, [r7, #8]
  51986. 8015604: 601a str r2, [r3, #0]
  51987. /* don't set conn->last_err: it's only ERR_OK, anyway */
  51988. return ERR_OK;
  51989. 8015606: 2300 movs r3, #0
  51990. }
  51991. 8015608: 4618 mov r0, r3
  51992. 801560a: 3728 adds r7, #40 @ 0x28
  51993. 801560c: 46bd mov sp, r7
  51994. 801560e: bd80 pop {r7, pc}
  51995. 8015610: 0802cb84 .word 0x0802cb84
  51996. 8015614: 0802cd9c .word 0x0802cd9c
  51997. 8015618: 0802cbdc .word 0x0802cbdc
  51998. 801561c: 0802cdbc .word 0x0802cdbc
  51999. 8015620: 0802cdd8 .word 0x0802cdd8
  52000. 08015624 <netconn_tcp_recvd_msg>:
  52001. #if LWIP_TCP
  52002. static err_t
  52003. netconn_tcp_recvd_msg(struct netconn *conn, size_t len, struct api_msg *msg)
  52004. {
  52005. 8015624: b580 push {r7, lr}
  52006. 8015626: b084 sub sp, #16
  52007. 8015628: af00 add r7, sp, #0
  52008. 801562a: 60f8 str r0, [r7, #12]
  52009. 801562c: 60b9 str r1, [r7, #8]
  52010. 801562e: 607a str r2, [r7, #4]
  52011. LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
  52012. 8015630: 68fb ldr r3, [r7, #12]
  52013. 8015632: 2b00 cmp r3, #0
  52014. 8015634: d005 beq.n 8015642 <netconn_tcp_recvd_msg+0x1e>
  52015. 8015636: 68fb ldr r3, [r7, #12]
  52016. 8015638: 781b ldrb r3, [r3, #0]
  52017. 801563a: f003 03f0 and.w r3, r3, #240 @ 0xf0
  52018. 801563e: 2b10 cmp r3, #16
  52019. 8015640: d009 beq.n 8015656 <netconn_tcp_recvd_msg+0x32>
  52020. 8015642: 4b0c ldr r3, [pc, #48] @ (8015674 <netconn_tcp_recvd_msg+0x50>)
  52021. 8015644: f240 22a7 movw r2, #679 @ 0x2a7
  52022. 8015648: 490b ldr r1, [pc, #44] @ (8015678 <netconn_tcp_recvd_msg+0x54>)
  52023. 801564a: 480c ldr r0, [pc, #48] @ (801567c <netconn_tcp_recvd_msg+0x58>)
  52024. 801564c: f014 f9be bl 80299cc <iprintf>
  52025. 8015650: f06f 030f mvn.w r3, #15
  52026. 8015654: e00a b.n 801566c <netconn_tcp_recvd_msg+0x48>
  52027. NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;);
  52028. msg->conn = conn;
  52029. 8015656: 687b ldr r3, [r7, #4]
  52030. 8015658: 68fa ldr r2, [r7, #12]
  52031. 801565a: 601a str r2, [r3, #0]
  52032. msg->msg.r.len = len;
  52033. 801565c: 687b ldr r3, [r7, #4]
  52034. 801565e: 68ba ldr r2, [r7, #8]
  52035. 8015660: 609a str r2, [r3, #8]
  52036. return netconn_apimsg(lwip_netconn_do_recv, msg);
  52037. 8015662: 6879 ldr r1, [r7, #4]
  52038. 8015664: 4806 ldr r0, [pc, #24] @ (8015680 <netconn_tcp_recvd_msg+0x5c>)
  52039. 8015666: f7ff fd6f bl 8015148 <netconn_apimsg>
  52040. 801566a: 4603 mov r3, r0
  52041. }
  52042. 801566c: 4618 mov r0, r3
  52043. 801566e: 3710 adds r7, #16
  52044. 8015670: 46bd mov sp, r7
  52045. 8015672: bd80 pop {r7, pc}
  52046. 8015674: 0802cb84 .word 0x0802cb84
  52047. 8015678: 0802cde4 .word 0x0802cde4
  52048. 801567c: 0802cbdc .word 0x0802cbdc
  52049. 8015680: 08016d97 .word 0x08016d97
  52050. 08015684 <netconn_tcp_recvd>:
  52051. err_t
  52052. netconn_tcp_recvd(struct netconn *conn, size_t len)
  52053. {
  52054. 8015684: b580 push {r7, lr}
  52055. 8015686: b08c sub sp, #48 @ 0x30
  52056. 8015688: af00 add r7, sp, #0
  52057. 801568a: 6078 str r0, [r7, #4]
  52058. 801568c: 6039 str r1, [r7, #0]
  52059. err_t err;
  52060. API_MSG_VAR_DECLARE(msg);
  52061. LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
  52062. 801568e: 687b ldr r3, [r7, #4]
  52063. 8015690: 2b00 cmp r3, #0
  52064. 8015692: d005 beq.n 80156a0 <netconn_tcp_recvd+0x1c>
  52065. 8015694: 687b ldr r3, [r7, #4]
  52066. 8015696: 781b ldrb r3, [r3, #0]
  52067. 8015698: f003 03f0 and.w r3, r3, #240 @ 0xf0
  52068. 801569c: 2b10 cmp r3, #16
  52069. 801569e: d009 beq.n 80156b4 <netconn_tcp_recvd+0x30>
  52070. 80156a0: 4b0c ldr r3, [pc, #48] @ (80156d4 <netconn_tcp_recvd+0x50>)
  52071. 80156a2: f240 22b5 movw r2, #693 @ 0x2b5
  52072. 80156a6: 490c ldr r1, [pc, #48] @ (80156d8 <netconn_tcp_recvd+0x54>)
  52073. 80156a8: 480c ldr r0, [pc, #48] @ (80156dc <netconn_tcp_recvd+0x58>)
  52074. 80156aa: f014 f98f bl 80299cc <iprintf>
  52075. 80156ae: f06f 030f mvn.w r3, #15
  52076. 80156b2: e00b b.n 80156cc <netconn_tcp_recvd+0x48>
  52077. NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;);
  52078. API_MSG_VAR_ALLOC(msg);
  52079. err = netconn_tcp_recvd_msg(conn, len, &API_VAR_REF(msg));
  52080. 80156b4: f107 030c add.w r3, r7, #12
  52081. 80156b8: 461a mov r2, r3
  52082. 80156ba: 6839 ldr r1, [r7, #0]
  52083. 80156bc: 6878 ldr r0, [r7, #4]
  52084. 80156be: f7ff ffb1 bl 8015624 <netconn_tcp_recvd_msg>
  52085. 80156c2: 4603 mov r3, r0
  52086. 80156c4: f887 302f strb.w r3, [r7, #47] @ 0x2f
  52087. API_MSG_VAR_FREE(msg);
  52088. return err;
  52089. 80156c8: f997 302f ldrsb.w r3, [r7, #47] @ 0x2f
  52090. }
  52091. 80156cc: 4618 mov r0, r3
  52092. 80156ce: 3730 adds r7, #48 @ 0x30
  52093. 80156d0: 46bd mov sp, r7
  52094. 80156d2: bd80 pop {r7, pc}
  52095. 80156d4: 0802cb84 .word 0x0802cb84
  52096. 80156d8: 0802cde4 .word 0x0802cde4
  52097. 80156dc: 0802cbdc .word 0x0802cbdc
  52098. 080156e0 <netconn_recv_data_tcp>:
  52099. static err_t
  52100. netconn_recv_data_tcp(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags)
  52101. {
  52102. 80156e0: b580 push {r7, lr}
  52103. 80156e2: b090 sub sp, #64 @ 0x40
  52104. 80156e4: af00 add r7, sp, #0
  52105. 80156e6: 60f8 str r0, [r7, #12]
  52106. 80156e8: 60b9 str r1, [r7, #8]
  52107. 80156ea: 4613 mov r3, r2
  52108. 80156ec: 71fb strb r3, [r7, #7]
  52109. API_MSG_VAR_DECLARE(msg);
  52110. #if LWIP_MPU_COMPATIBLE
  52111. msg = NULL;
  52112. #endif
  52113. if (!NETCONN_RECVMBOX_WAITABLE(conn)) {
  52114. 80156ee: 68fb ldr r3, [r7, #12]
  52115. 80156f0: 3310 adds r3, #16
  52116. 80156f2: 4618 mov r0, r3
  52117. 80156f4: f010 fdca bl 802628c <sys_mbox_valid>
  52118. 80156f8: 4603 mov r3, r0
  52119. 80156fa: 2b00 cmp r3, #0
  52120. 80156fc: d102 bne.n 8015704 <netconn_recv_data_tcp+0x24>
  52121. /* This only happens when calling this function more than once *after* receiving FIN */
  52122. return ERR_CONN;
  52123. 80156fe: f06f 030a mvn.w r3, #10
  52124. 8015702: e072 b.n 80157ea <netconn_recv_data_tcp+0x10a>
  52125. }
  52126. if (netconn_is_flag_set(conn, NETCONN_FIN_RX_PENDING)) {
  52127. 8015704: 68fb ldr r3, [r7, #12]
  52128. 8015706: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  52129. 801570a: b25b sxtb r3, r3
  52130. 801570c: 2b00 cmp r3, #0
  52131. 801570e: da09 bge.n 8015724 <netconn_recv_data_tcp+0x44>
  52132. netconn_clear_flags(conn, NETCONN_FIN_RX_PENDING);
  52133. 8015710: 68fb ldr r3, [r7, #12]
  52134. 8015712: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  52135. 8015716: f003 037f and.w r3, r3, #127 @ 0x7f
  52136. 801571a: b2da uxtb r2, r3
  52137. 801571c: 68fb ldr r3, [r7, #12]
  52138. 801571e: f883 2028 strb.w r2, [r3, #40] @ 0x28
  52139. goto handle_fin;
  52140. 8015722: e03b b.n 801579c <netconn_recv_data_tcp+0xbc>
  52141. /* need to allocate API message here so empty message pool does not result in event loss
  52142. * see bug #47512: MPU_COMPATIBLE may fail on empty pool */
  52143. API_MSG_VAR_ALLOC(msg);
  52144. }
  52145. err = netconn_recv_data(conn, (void **)new_buf, apiflags);
  52146. 8015724: 79fb ldrb r3, [r7, #7]
  52147. 8015726: 461a mov r2, r3
  52148. 8015728: 68b9 ldr r1, [r7, #8]
  52149. 801572a: 68f8 ldr r0, [r7, #12]
  52150. 801572c: f7ff fe9a bl 8015464 <netconn_recv_data>
  52151. 8015730: 4603 mov r3, r0
  52152. 8015732: f887 303f strb.w r3, [r7, #63] @ 0x3f
  52153. if (err != ERR_OK) {
  52154. 8015736: f997 303f ldrsb.w r3, [r7, #63] @ 0x3f
  52155. 801573a: 2b00 cmp r3, #0
  52156. 801573c: d002 beq.n 8015744 <netconn_recv_data_tcp+0x64>
  52157. if (!(apiflags & NETCONN_NOAUTORCVD)) {
  52158. API_MSG_VAR_FREE(msg);
  52159. }
  52160. return err;
  52161. 801573e: f997 303f ldrsb.w r3, [r7, #63] @ 0x3f
  52162. 8015742: e052 b.n 80157ea <netconn_recv_data_tcp+0x10a>
  52163. }
  52164. buf = *new_buf;
  52165. 8015744: 68bb ldr r3, [r7, #8]
  52166. 8015746: 681b ldr r3, [r3, #0]
  52167. 8015748: 63bb str r3, [r7, #56] @ 0x38
  52168. if (!(apiflags & NETCONN_NOAUTORCVD)) {
  52169. 801574a: 79fb ldrb r3, [r7, #7]
  52170. 801574c: f003 0308 and.w r3, r3, #8
  52171. 8015750: 2b00 cmp r3, #0
  52172. 8015752: d10e bne.n 8015772 <netconn_recv_data_tcp+0x92>
  52173. /* Let the stack know that we have taken the data. */
  52174. u16_t len = buf ? buf->tot_len : 1;
  52175. 8015754: 6bbb ldr r3, [r7, #56] @ 0x38
  52176. 8015756: 2b00 cmp r3, #0
  52177. 8015758: d002 beq.n 8015760 <netconn_recv_data_tcp+0x80>
  52178. 801575a: 6bbb ldr r3, [r7, #56] @ 0x38
  52179. 801575c: 891b ldrh r3, [r3, #8]
  52180. 801575e: e000 b.n 8015762 <netconn_recv_data_tcp+0x82>
  52181. 8015760: 2301 movs r3, #1
  52182. 8015762: 86fb strh r3, [r7, #54] @ 0x36
  52183. /* don't care for the return value of lwip_netconn_do_recv */
  52184. /* @todo: this should really be fixed, e.g. by retrying in poll on error */
  52185. netconn_tcp_recvd_msg(conn, len, &API_VAR_REF(msg));
  52186. 8015764: 8efb ldrh r3, [r7, #54] @ 0x36
  52187. 8015766: f107 0214 add.w r2, r7, #20
  52188. 801576a: 4619 mov r1, r3
  52189. 801576c: 68f8 ldr r0, [r7, #12]
  52190. 801576e: f7ff ff59 bl 8015624 <netconn_tcp_recvd_msg>
  52191. API_MSG_VAR_FREE(msg);
  52192. }
  52193. /* If we are closed, we indicate that we no longer wish to use the socket */
  52194. if (buf == NULL) {
  52195. 8015772: 6bbb ldr r3, [r7, #56] @ 0x38
  52196. 8015774: 2b00 cmp r3, #0
  52197. 8015776: d136 bne.n 80157e6 <netconn_recv_data_tcp+0x106>
  52198. if (apiflags & NETCONN_NOFIN) {
  52199. 8015778: 79fb ldrb r3, [r7, #7]
  52200. 801577a: f003 0310 and.w r3, r3, #16
  52201. 801577e: 2b00 cmp r3, #0
  52202. 8015780: d00b beq.n 801579a <netconn_recv_data_tcp+0xba>
  52203. /* received a FIN but the caller cannot handle it right now:
  52204. re-enqueue it and return "no data" */
  52205. netconn_set_flags(conn, NETCONN_FIN_RX_PENDING);
  52206. 8015782: 68fb ldr r3, [r7, #12]
  52207. 8015784: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  52208. 8015788: f063 037f orn r3, r3, #127 @ 0x7f
  52209. 801578c: b2da uxtb r2, r3
  52210. 801578e: 68fb ldr r3, [r7, #12]
  52211. 8015790: f883 2028 strb.w r2, [r3, #40] @ 0x28
  52212. return ERR_WOULDBLOCK;
  52213. 8015794: f06f 0306 mvn.w r3, #6
  52214. 8015798: e027 b.n 80157ea <netconn_recv_data_tcp+0x10a>
  52215. } else {
  52216. handle_fin:
  52217. 801579a: bf00 nop
  52218. API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
  52219. 801579c: 68fb ldr r3, [r7, #12]
  52220. 801579e: 6b1b ldr r3, [r3, #48] @ 0x30
  52221. 80157a0: 2b00 cmp r3, #0
  52222. 80157a2: d005 beq.n 80157b0 <netconn_recv_data_tcp+0xd0>
  52223. 80157a4: 68fb ldr r3, [r7, #12]
  52224. 80157a6: 6b1b ldr r3, [r3, #48] @ 0x30
  52225. 80157a8: 2200 movs r2, #0
  52226. 80157aa: 2101 movs r1, #1
  52227. 80157ac: 68f8 ldr r0, [r7, #12]
  52228. 80157ae: 4798 blx r3
  52229. if (conn->pcb.ip == NULL) {
  52230. 80157b0: 68fb ldr r3, [r7, #12]
  52231. 80157b2: 685b ldr r3, [r3, #4]
  52232. 80157b4: 2b00 cmp r3, #0
  52233. 80157b6: d10f bne.n 80157d8 <netconn_recv_data_tcp+0xf8>
  52234. /* race condition: RST during recv */
  52235. err = netconn_err(conn);
  52236. 80157b8: 68f8 ldr r0, [r7, #12]
  52237. 80157ba: f000 f9a3 bl 8015b04 <netconn_err>
  52238. 80157be: 4603 mov r3, r0
  52239. 80157c0: f887 303f strb.w r3, [r7, #63] @ 0x3f
  52240. if (err != ERR_OK) {
  52241. 80157c4: f997 303f ldrsb.w r3, [r7, #63] @ 0x3f
  52242. 80157c8: 2b00 cmp r3, #0
  52243. 80157ca: d002 beq.n 80157d2 <netconn_recv_data_tcp+0xf2>
  52244. return err;
  52245. 80157cc: f997 303f ldrsb.w r3, [r7, #63] @ 0x3f
  52246. 80157d0: e00b b.n 80157ea <netconn_recv_data_tcp+0x10a>
  52247. }
  52248. return ERR_RST;
  52249. 80157d2: f06f 030d mvn.w r3, #13
  52250. 80157d6: e008 b.n 80157ea <netconn_recv_data_tcp+0x10a>
  52251. }
  52252. /* RX side is closed, so deallocate the recvmbox */
  52253. netconn_close_shutdown(conn, NETCONN_SHUT_RD);
  52254. 80157d8: 2101 movs r1, #1
  52255. 80157da: 68f8 ldr r0, [r7, #12]
  52256. 80157dc: f000 f962 bl 8015aa4 <netconn_close_shutdown>
  52257. /* Don' store ERR_CLSD as conn->err since we are only half-closed */
  52258. return ERR_CLSD;
  52259. 80157e0: f06f 030e mvn.w r3, #14
  52260. 80157e4: e001 b.n 80157ea <netconn_recv_data_tcp+0x10a>
  52261. }
  52262. }
  52263. return err;
  52264. 80157e6: f997 303f ldrsb.w r3, [r7, #63] @ 0x3f
  52265. }
  52266. 80157ea: 4618 mov r0, r3
  52267. 80157ec: 3740 adds r7, #64 @ 0x40
  52268. 80157ee: 46bd mov sp, r7
  52269. 80157f0: bd80 pop {r7, pc}
  52270. ...
  52271. 080157f4 <netconn_recv_tcp_pbuf_flags>:
  52272. * memory error or another error, @see netconn_recv_data)
  52273. * ERR_ARG if conn is not a TCP netconn
  52274. */
  52275. err_t
  52276. netconn_recv_tcp_pbuf_flags(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags)
  52277. {
  52278. 80157f4: b580 push {r7, lr}
  52279. 80157f6: b084 sub sp, #16
  52280. 80157f8: af00 add r7, sp, #0
  52281. 80157fa: 60f8 str r0, [r7, #12]
  52282. 80157fc: 60b9 str r1, [r7, #8]
  52283. 80157fe: 4613 mov r3, r2
  52284. 8015800: 71fb strb r3, [r7, #7]
  52285. LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
  52286. 8015802: 68fb ldr r3, [r7, #12]
  52287. 8015804: 2b00 cmp r3, #0
  52288. 8015806: d005 beq.n 8015814 <netconn_recv_tcp_pbuf_flags+0x20>
  52289. 8015808: 68fb ldr r3, [r7, #12]
  52290. 801580a: 781b ldrb r3, [r3, #0]
  52291. 801580c: f003 03f0 and.w r3, r3, #240 @ 0xf0
  52292. 8015810: 2b10 cmp r3, #16
  52293. 8015812: d009 beq.n 8015828 <netconn_recv_tcp_pbuf_flags+0x34>
  52294. 8015814: 4b0a ldr r3, [pc, #40] @ (8015840 <netconn_recv_tcp_pbuf_flags+0x4c>)
  52295. 8015816: f240 3225 movw r2, #805 @ 0x325
  52296. 801581a: 490a ldr r1, [pc, #40] @ (8015844 <netconn_recv_tcp_pbuf_flags+0x50>)
  52297. 801581c: 480a ldr r0, [pc, #40] @ (8015848 <netconn_recv_tcp_pbuf_flags+0x54>)
  52298. 801581e: f014 f8d5 bl 80299cc <iprintf>
  52299. 8015822: f06f 030f mvn.w r3, #15
  52300. 8015826: e006 b.n 8015836 <netconn_recv_tcp_pbuf_flags+0x42>
  52301. NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;);
  52302. return netconn_recv_data_tcp(conn, new_buf, apiflags);
  52303. 8015828: 79fb ldrb r3, [r7, #7]
  52304. 801582a: 461a mov r2, r3
  52305. 801582c: 68b9 ldr r1, [r7, #8]
  52306. 801582e: 68f8 ldr r0, [r7, #12]
  52307. 8015830: f7ff ff56 bl 80156e0 <netconn_recv_data_tcp>
  52308. 8015834: 4603 mov r3, r0
  52309. }
  52310. 8015836: 4618 mov r0, r3
  52311. 8015838: 3710 adds r7, #16
  52312. 801583a: 46bd mov sp, r7
  52313. 801583c: bd80 pop {r7, pc}
  52314. 801583e: bf00 nop
  52315. 8015840: 0802cb84 .word 0x0802cb84
  52316. 8015844: 0802cde4 .word 0x0802cde4
  52317. 8015848: 0802cbdc .word 0x0802cbdc
  52318. 0801584c <netconn_recv_udp_raw_netbuf_flags>:
  52319. * memory error or another error)
  52320. * ERR_ARG if conn is not a UDP/RAW netconn
  52321. */
  52322. err_t
  52323. netconn_recv_udp_raw_netbuf_flags(struct netconn *conn, struct netbuf **new_buf, u8_t apiflags)
  52324. {
  52325. 801584c: b580 push {r7, lr}
  52326. 801584e: b084 sub sp, #16
  52327. 8015850: af00 add r7, sp, #0
  52328. 8015852: 60f8 str r0, [r7, #12]
  52329. 8015854: 60b9 str r1, [r7, #8]
  52330. 8015856: 4613 mov r3, r2
  52331. 8015858: 71fb strb r3, [r7, #7]
  52332. LWIP_ERROR("netconn_recv_udp_raw_netbuf: invalid conn", (conn != NULL) &&
  52333. 801585a: 68fb ldr r3, [r7, #12]
  52334. 801585c: 2b00 cmp r3, #0
  52335. 801585e: d005 beq.n 801586c <netconn_recv_udp_raw_netbuf_flags+0x20>
  52336. 8015860: 68fb ldr r3, [r7, #12]
  52337. 8015862: 781b ldrb r3, [r3, #0]
  52338. 8015864: f003 03f0 and.w r3, r3, #240 @ 0xf0
  52339. 8015868: 2b10 cmp r3, #16
  52340. 801586a: d109 bne.n 8015880 <netconn_recv_udp_raw_netbuf_flags+0x34>
  52341. 801586c: 4b0a ldr r3, [pc, #40] @ (8015898 <netconn_recv_udp_raw_netbuf_flags+0x4c>)
  52342. 801586e: f44f 7253 mov.w r2, #844 @ 0x34c
  52343. 8015872: 490a ldr r1, [pc, #40] @ (801589c <netconn_recv_udp_raw_netbuf_flags+0x50>)
  52344. 8015874: 480a ldr r0, [pc, #40] @ (80158a0 <netconn_recv_udp_raw_netbuf_flags+0x54>)
  52345. 8015876: f014 f8a9 bl 80299cc <iprintf>
  52346. 801587a: f06f 030f mvn.w r3, #15
  52347. 801587e: e006 b.n 801588e <netconn_recv_udp_raw_netbuf_flags+0x42>
  52348. NETCONNTYPE_GROUP(netconn_type(conn)) != NETCONN_TCP, return ERR_ARG;);
  52349. return netconn_recv_data(conn, (void **)new_buf, apiflags);
  52350. 8015880: 79fb ldrb r3, [r7, #7]
  52351. 8015882: 461a mov r2, r3
  52352. 8015884: 68b9 ldr r1, [r7, #8]
  52353. 8015886: 68f8 ldr r0, [r7, #12]
  52354. 8015888: f7ff fdec bl 8015464 <netconn_recv_data>
  52355. 801588c: 4603 mov r3, r0
  52356. }
  52357. 801588e: 4618 mov r0, r3
  52358. 8015890: 3710 adds r7, #16
  52359. 8015892: 46bd mov sp, r7
  52360. 8015894: bd80 pop {r7, pc}
  52361. 8015896: bf00 nop
  52362. 8015898: 0802cb84 .word 0x0802cb84
  52363. 801589c: 0802ce08 .word 0x0802ce08
  52364. 80158a0: 0802cbdc .word 0x0802cbdc
  52365. 080158a4 <netconn_send>:
  52366. * @param buf a netbuf containing the data to send
  52367. * @return ERR_OK if data was sent, any other err_t on error
  52368. */
  52369. err_t
  52370. netconn_send(struct netconn *conn, struct netbuf *buf)
  52371. {
  52372. 80158a4: b580 push {r7, lr}
  52373. 80158a6: b08c sub sp, #48 @ 0x30
  52374. 80158a8: af00 add r7, sp, #0
  52375. 80158aa: 6078 str r0, [r7, #4]
  52376. 80158ac: 6039 str r1, [r7, #0]
  52377. API_MSG_VAR_DECLARE(msg);
  52378. err_t err;
  52379. LWIP_ERROR("netconn_send: invalid conn", (conn != NULL), return ERR_ARG;);
  52380. 80158ae: 687b ldr r3, [r7, #4]
  52381. 80158b0: 2b00 cmp r3, #0
  52382. 80158b2: d109 bne.n 80158c8 <netconn_send+0x24>
  52383. 80158b4: 4b0e ldr r3, [pc, #56] @ (80158f0 <netconn_send+0x4c>)
  52384. 80158b6: f240 32b2 movw r2, #946 @ 0x3b2
  52385. 80158ba: 490e ldr r1, [pc, #56] @ (80158f4 <netconn_send+0x50>)
  52386. 80158bc: 480e ldr r0, [pc, #56] @ (80158f8 <netconn_send+0x54>)
  52387. 80158be: f014 f885 bl 80299cc <iprintf>
  52388. 80158c2: f06f 030f mvn.w r3, #15
  52389. 80158c6: e00e b.n 80158e6 <netconn_send+0x42>
  52390. LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_send: sending %"U16_F" bytes\n", buf->p->tot_len));
  52391. API_MSG_VAR_ALLOC(msg);
  52392. API_MSG_VAR_REF(msg).conn = conn;
  52393. 80158c8: 687b ldr r3, [r7, #4]
  52394. 80158ca: 60fb str r3, [r7, #12]
  52395. API_MSG_VAR_REF(msg).msg.b = buf;
  52396. 80158cc: 683b ldr r3, [r7, #0]
  52397. 80158ce: 617b str r3, [r7, #20]
  52398. err = netconn_apimsg(lwip_netconn_do_send, &API_MSG_VAR_REF(msg));
  52399. 80158d0: f107 030c add.w r3, r7, #12
  52400. 80158d4: 4619 mov r1, r3
  52401. 80158d6: 4809 ldr r0, [pc, #36] @ (80158fc <netconn_send+0x58>)
  52402. 80158d8: f7ff fc36 bl 8015148 <netconn_apimsg>
  52403. 80158dc: 4603 mov r3, r0
  52404. 80158de: f887 302f strb.w r3, [r7, #47] @ 0x2f
  52405. API_MSG_VAR_FREE(msg);
  52406. return err;
  52407. 80158e2: f997 302f ldrsb.w r3, [r7, #47] @ 0x2f
  52408. }
  52409. 80158e6: 4618 mov r0, r3
  52410. 80158e8: 3730 adds r7, #48 @ 0x30
  52411. 80158ea: 46bd mov sp, r7
  52412. 80158ec: bd80 pop {r7, pc}
  52413. 80158ee: bf00 nop
  52414. 80158f0: 0802cb84 .word 0x0802cb84
  52415. 80158f4: 0802ce40 .word 0x0802ce40
  52416. 80158f8: 0802cbdc .word 0x0802cbdc
  52417. 80158fc: 08016cfd .word 0x08016cfd
  52418. 08015900 <netconn_write_partly>:
  52419. * @return ERR_OK if data was sent, any other err_t on error
  52420. */
  52421. err_t
  52422. netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size,
  52423. u8_t apiflags, size_t *bytes_written)
  52424. {
  52425. 8015900: b580 push {r7, lr}
  52426. 8015902: b088 sub sp, #32
  52427. 8015904: af02 add r7, sp, #8
  52428. 8015906: 60f8 str r0, [r7, #12]
  52429. 8015908: 60b9 str r1, [r7, #8]
  52430. 801590a: 607a str r2, [r7, #4]
  52431. 801590c: 70fb strb r3, [r7, #3]
  52432. struct netvector vector;
  52433. vector.ptr = dataptr;
  52434. 801590e: 68bb ldr r3, [r7, #8]
  52435. 8015910: 613b str r3, [r7, #16]
  52436. vector.len = size;
  52437. 8015912: 687b ldr r3, [r7, #4]
  52438. 8015914: 617b str r3, [r7, #20]
  52439. return netconn_write_vectors_partly(conn, &vector, 1, apiflags, bytes_written);
  52440. 8015916: 78fa ldrb r2, [r7, #3]
  52441. 8015918: f107 0110 add.w r1, r7, #16
  52442. 801591c: 6a3b ldr r3, [r7, #32]
  52443. 801591e: 9300 str r3, [sp, #0]
  52444. 8015920: 4613 mov r3, r2
  52445. 8015922: 2201 movs r2, #1
  52446. 8015924: 68f8 ldr r0, [r7, #12]
  52447. 8015926: f000 f805 bl 8015934 <netconn_write_vectors_partly>
  52448. 801592a: 4603 mov r3, r0
  52449. }
  52450. 801592c: 4618 mov r0, r3
  52451. 801592e: 3718 adds r7, #24
  52452. 8015930: 46bd mov sp, r7
  52453. 8015932: bd80 pop {r7, pc}
  52454. 08015934 <netconn_write_vectors_partly>:
  52455. * @return ERR_OK if data was sent, any other err_t on error
  52456. */
  52457. err_t
  52458. netconn_write_vectors_partly(struct netconn *conn, struct netvector *vectors, u16_t vectorcnt,
  52459. u8_t apiflags, size_t *bytes_written)
  52460. {
  52461. 8015934: b580 push {r7, lr}
  52462. 8015936: b092 sub sp, #72 @ 0x48
  52463. 8015938: af00 add r7, sp, #0
  52464. 801593a: 60f8 str r0, [r7, #12]
  52465. 801593c: 60b9 str r1, [r7, #8]
  52466. 801593e: 4611 mov r1, r2
  52467. 8015940: 461a mov r2, r3
  52468. 8015942: 460b mov r3, r1
  52469. 8015944: 80fb strh r3, [r7, #6]
  52470. 8015946: 4613 mov r3, r2
  52471. 8015948: 717b strb r3, [r7, #5]
  52472. err_t err;
  52473. u8_t dontblock;
  52474. size_t size;
  52475. int i;
  52476. LWIP_ERROR("netconn_write: invalid conn", (conn != NULL), return ERR_ARG;);
  52477. 801594a: 68fb ldr r3, [r7, #12]
  52478. 801594c: 2b00 cmp r3, #0
  52479. 801594e: d109 bne.n 8015964 <netconn_write_vectors_partly+0x30>
  52480. 8015950: 4b4e ldr r3, [pc, #312] @ (8015a8c <netconn_write_vectors_partly+0x158>)
  52481. 8015952: f240 32ee movw r2, #1006 @ 0x3ee
  52482. 8015956: 494e ldr r1, [pc, #312] @ (8015a90 <netconn_write_vectors_partly+0x15c>)
  52483. 8015958: 484e ldr r0, [pc, #312] @ (8015a94 <netconn_write_vectors_partly+0x160>)
  52484. 801595a: f014 f837 bl 80299cc <iprintf>
  52485. 801595e: f06f 030f mvn.w r3, #15
  52486. 8015962: e08f b.n 8015a84 <netconn_write_vectors_partly+0x150>
  52487. LWIP_ERROR("netconn_write: invalid conn->type", (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP), return ERR_VAL;);
  52488. 8015964: 68fb ldr r3, [r7, #12]
  52489. 8015966: 781b ldrb r3, [r3, #0]
  52490. 8015968: f003 03f0 and.w r3, r3, #240 @ 0xf0
  52491. 801596c: 2b10 cmp r3, #16
  52492. 801596e: d009 beq.n 8015984 <netconn_write_vectors_partly+0x50>
  52493. 8015970: 4b46 ldr r3, [pc, #280] @ (8015a8c <netconn_write_vectors_partly+0x158>)
  52494. 8015972: f240 32ef movw r2, #1007 @ 0x3ef
  52495. 8015976: 4948 ldr r1, [pc, #288] @ (8015a98 <netconn_write_vectors_partly+0x164>)
  52496. 8015978: 4846 ldr r0, [pc, #280] @ (8015a94 <netconn_write_vectors_partly+0x160>)
  52497. 801597a: f014 f827 bl 80299cc <iprintf>
  52498. 801597e: f06f 0305 mvn.w r3, #5
  52499. 8015982: e07f b.n 8015a84 <netconn_write_vectors_partly+0x150>
  52500. dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);
  52501. 8015984: 68fb ldr r3, [r7, #12]
  52502. 8015986: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  52503. 801598a: f003 0302 and.w r3, r3, #2
  52504. 801598e: 2b00 cmp r3, #0
  52505. 8015990: d104 bne.n 801599c <netconn_write_vectors_partly+0x68>
  52506. 8015992: 797b ldrb r3, [r7, #5]
  52507. 8015994: f003 0304 and.w r3, r3, #4
  52508. 8015998: 2b00 cmp r3, #0
  52509. 801599a: d001 beq.n 80159a0 <netconn_write_vectors_partly+0x6c>
  52510. 801599c: 2301 movs r3, #1
  52511. 801599e: e000 b.n 80159a2 <netconn_write_vectors_partly+0x6e>
  52512. 80159a0: 2300 movs r3, #0
  52513. 80159a2: f887 303f strb.w r3, [r7, #63] @ 0x3f
  52514. #if LWIP_SO_SNDTIMEO
  52515. if (conn->send_timeout != 0) {
  52516. dontblock = 1;
  52517. }
  52518. #endif /* LWIP_SO_SNDTIMEO */
  52519. if (dontblock && !bytes_written) {
  52520. 80159a6: f897 303f ldrb.w r3, [r7, #63] @ 0x3f
  52521. 80159aa: 2b00 cmp r3, #0
  52522. 80159ac: d005 beq.n 80159ba <netconn_write_vectors_partly+0x86>
  52523. 80159ae: 6d3b ldr r3, [r7, #80] @ 0x50
  52524. 80159b0: 2b00 cmp r3, #0
  52525. 80159b2: d102 bne.n 80159ba <netconn_write_vectors_partly+0x86>
  52526. /* This implies netconn_write() cannot be used for non-blocking send, since
  52527. it has no way to return the number of bytes written. */
  52528. return ERR_VAL;
  52529. 80159b4: f06f 0305 mvn.w r3, #5
  52530. 80159b8: e064 b.n 8015a84 <netconn_write_vectors_partly+0x150>
  52531. }
  52532. /* sum up the total size */
  52533. size = 0;
  52534. 80159ba: 2300 movs r3, #0
  52535. 80159bc: 647b str r3, [r7, #68] @ 0x44
  52536. for (i = 0; i < vectorcnt; i++) {
  52537. 80159be: 2300 movs r3, #0
  52538. 80159c0: 643b str r3, [r7, #64] @ 0x40
  52539. 80159c2: e015 b.n 80159f0 <netconn_write_vectors_partly+0xbc>
  52540. size += vectors[i].len;
  52541. 80159c4: 6c3b ldr r3, [r7, #64] @ 0x40
  52542. 80159c6: 00db lsls r3, r3, #3
  52543. 80159c8: 68ba ldr r2, [r7, #8]
  52544. 80159ca: 4413 add r3, r2
  52545. 80159cc: 685b ldr r3, [r3, #4]
  52546. 80159ce: 6c7a ldr r2, [r7, #68] @ 0x44
  52547. 80159d0: 4413 add r3, r2
  52548. 80159d2: 647b str r3, [r7, #68] @ 0x44
  52549. if (size < vectors[i].len) {
  52550. 80159d4: 6c3b ldr r3, [r7, #64] @ 0x40
  52551. 80159d6: 00db lsls r3, r3, #3
  52552. 80159d8: 68ba ldr r2, [r7, #8]
  52553. 80159da: 4413 add r3, r2
  52554. 80159dc: 685b ldr r3, [r3, #4]
  52555. 80159de: 6c7a ldr r2, [r7, #68] @ 0x44
  52556. 80159e0: 429a cmp r2, r3
  52557. 80159e2: d202 bcs.n 80159ea <netconn_write_vectors_partly+0xb6>
  52558. /* overflow */
  52559. return ERR_VAL;
  52560. 80159e4: f06f 0305 mvn.w r3, #5
  52561. 80159e8: e04c b.n 8015a84 <netconn_write_vectors_partly+0x150>
  52562. for (i = 0; i < vectorcnt; i++) {
  52563. 80159ea: 6c3b ldr r3, [r7, #64] @ 0x40
  52564. 80159ec: 3301 adds r3, #1
  52565. 80159ee: 643b str r3, [r7, #64] @ 0x40
  52566. 80159f0: 88fb ldrh r3, [r7, #6]
  52567. 80159f2: 6c3a ldr r2, [r7, #64] @ 0x40
  52568. 80159f4: 429a cmp r2, r3
  52569. 80159f6: dbe5 blt.n 80159c4 <netconn_write_vectors_partly+0x90>
  52570. }
  52571. }
  52572. if (size == 0) {
  52573. 80159f8: 6c7b ldr r3, [r7, #68] @ 0x44
  52574. 80159fa: 2b00 cmp r3, #0
  52575. 80159fc: d101 bne.n 8015a02 <netconn_write_vectors_partly+0xce>
  52576. return ERR_OK;
  52577. 80159fe: 2300 movs r3, #0
  52578. 8015a00: e040 b.n 8015a84 <netconn_write_vectors_partly+0x150>
  52579. } else if (size > SSIZE_MAX) {
  52580. 8015a02: 6c7b ldr r3, [r7, #68] @ 0x44
  52581. 8015a04: 2b00 cmp r3, #0
  52582. 8015a06: da0a bge.n 8015a1e <netconn_write_vectors_partly+0xea>
  52583. ssize_t limited;
  52584. /* this is required by the socket layer (cannot send full size_t range) */
  52585. if (!bytes_written) {
  52586. 8015a08: 6d3b ldr r3, [r7, #80] @ 0x50
  52587. 8015a0a: 2b00 cmp r3, #0
  52588. 8015a0c: d102 bne.n 8015a14 <netconn_write_vectors_partly+0xe0>
  52589. return ERR_VAL;
  52590. 8015a0e: f06f 0305 mvn.w r3, #5
  52591. 8015a12: e037 b.n 8015a84 <netconn_write_vectors_partly+0x150>
  52592. }
  52593. /* limit the amount of data to send */
  52594. limited = SSIZE_MAX;
  52595. 8015a14: f06f 4300 mvn.w r3, #2147483648 @ 0x80000000
  52596. 8015a18: 63bb str r3, [r7, #56] @ 0x38
  52597. size = (size_t)limited;
  52598. 8015a1a: 6bbb ldr r3, [r7, #56] @ 0x38
  52599. 8015a1c: 647b str r3, [r7, #68] @ 0x44
  52600. }
  52601. API_MSG_VAR_ALLOC(msg);
  52602. /* non-blocking write sends as much */
  52603. API_MSG_VAR_REF(msg).conn = conn;
  52604. 8015a1e: 68fb ldr r3, [r7, #12]
  52605. 8015a20: 617b str r3, [r7, #20]
  52606. API_MSG_VAR_REF(msg).msg.w.vector = vectors;
  52607. 8015a22: 68bb ldr r3, [r7, #8]
  52608. 8015a24: 61fb str r3, [r7, #28]
  52609. API_MSG_VAR_REF(msg).msg.w.vector_cnt = vectorcnt;
  52610. 8015a26: 88fb ldrh r3, [r7, #6]
  52611. 8015a28: 843b strh r3, [r7, #32]
  52612. API_MSG_VAR_REF(msg).msg.w.vector_off = 0;
  52613. 8015a2a: 2300 movs r3, #0
  52614. 8015a2c: 627b str r3, [r7, #36] @ 0x24
  52615. API_MSG_VAR_REF(msg).msg.w.apiflags = apiflags;
  52616. 8015a2e: 797b ldrb r3, [r7, #5]
  52617. 8015a30: f887 3030 strb.w r3, [r7, #48] @ 0x30
  52618. API_MSG_VAR_REF(msg).msg.w.len = size;
  52619. 8015a34: 6c7b ldr r3, [r7, #68] @ 0x44
  52620. 8015a36: 62bb str r3, [r7, #40] @ 0x28
  52621. API_MSG_VAR_REF(msg).msg.w.offset = 0;
  52622. 8015a38: 2300 movs r3, #0
  52623. 8015a3a: 62fb str r3, [r7, #44] @ 0x2c
  52624. #endif /* LWIP_SO_SNDTIMEO */
  52625. /* For locking the core: this _can_ be delayed on low memory/low send buffer,
  52626. but if it is, this is done inside api_msg.c:do_write(), so we can use the
  52627. non-blocking version here. */
  52628. err = netconn_apimsg(lwip_netconn_do_write, &API_MSG_VAR_REF(msg));
  52629. 8015a3c: f107 0314 add.w r3, r7, #20
  52630. 8015a40: 4619 mov r1, r3
  52631. 8015a42: 4816 ldr r0, [pc, #88] @ (8015a9c <netconn_write_vectors_partly+0x168>)
  52632. 8015a44: f7ff fb80 bl 8015148 <netconn_apimsg>
  52633. 8015a48: 4603 mov r3, r0
  52634. 8015a4a: f887 3037 strb.w r3, [r7, #55] @ 0x37
  52635. if (err == ERR_OK) {
  52636. 8015a4e: f997 3037 ldrsb.w r3, [r7, #55] @ 0x37
  52637. 8015a52: 2b00 cmp r3, #0
  52638. 8015a54: d114 bne.n 8015a80 <netconn_write_vectors_partly+0x14c>
  52639. if (bytes_written != NULL) {
  52640. 8015a56: 6d3b ldr r3, [r7, #80] @ 0x50
  52641. 8015a58: 2b00 cmp r3, #0
  52642. 8015a5a: d002 beq.n 8015a62 <netconn_write_vectors_partly+0x12e>
  52643. *bytes_written = API_MSG_VAR_REF(msg).msg.w.offset;
  52644. 8015a5c: 6afa ldr r2, [r7, #44] @ 0x2c
  52645. 8015a5e: 6d3b ldr r3, [r7, #80] @ 0x50
  52646. 8015a60: 601a str r2, [r3, #0]
  52647. }
  52648. /* for blocking, check all requested bytes were written, NOTE: send_timeout is
  52649. treated as dontblock (see dontblock assignment above) */
  52650. if (!dontblock) {
  52651. 8015a62: f897 303f ldrb.w r3, [r7, #63] @ 0x3f
  52652. 8015a66: 2b00 cmp r3, #0
  52653. 8015a68: d10a bne.n 8015a80 <netconn_write_vectors_partly+0x14c>
  52654. LWIP_ASSERT("do_write failed to write all bytes", API_MSG_VAR_REF(msg).msg.w.offset == size);
  52655. 8015a6a: 6afb ldr r3, [r7, #44] @ 0x2c
  52656. 8015a6c: 6c7a ldr r2, [r7, #68] @ 0x44
  52657. 8015a6e: 429a cmp r2, r3
  52658. 8015a70: d006 beq.n 8015a80 <netconn_write_vectors_partly+0x14c>
  52659. 8015a72: 4b06 ldr r3, [pc, #24] @ (8015a8c <netconn_write_vectors_partly+0x158>)
  52660. 8015a74: f44f 6286 mov.w r2, #1072 @ 0x430
  52661. 8015a78: 4909 ldr r1, [pc, #36] @ (8015aa0 <netconn_write_vectors_partly+0x16c>)
  52662. 8015a7a: 4806 ldr r0, [pc, #24] @ (8015a94 <netconn_write_vectors_partly+0x160>)
  52663. 8015a7c: f013 ffa6 bl 80299cc <iprintf>
  52664. }
  52665. }
  52666. API_MSG_VAR_FREE(msg);
  52667. return err;
  52668. 8015a80: f997 3037 ldrsb.w r3, [r7, #55] @ 0x37
  52669. }
  52670. 8015a84: 4618 mov r0, r3
  52671. 8015a86: 3748 adds r7, #72 @ 0x48
  52672. 8015a88: 46bd mov sp, r7
  52673. 8015a8a: bd80 pop {r7, pc}
  52674. 8015a8c: 0802cb84 .word 0x0802cb84
  52675. 8015a90: 0802ce5c .word 0x0802ce5c
  52676. 8015a94: 0802cbdc .word 0x0802cbdc
  52677. 8015a98: 0802ce78 .word 0x0802ce78
  52678. 8015a9c: 080171a1 .word 0x080171a1
  52679. 8015aa0: 0802ce9c .word 0x0802ce9c
  52680. 08015aa4 <netconn_close_shutdown>:
  52681. * @param how fully close or only shutdown one side?
  52682. * @return ERR_OK if the netconn was closed, any other err_t on error
  52683. */
  52684. static err_t
  52685. netconn_close_shutdown(struct netconn *conn, u8_t how)
  52686. {
  52687. 8015aa4: b580 push {r7, lr}
  52688. 8015aa6: b08c sub sp, #48 @ 0x30
  52689. 8015aa8: af00 add r7, sp, #0
  52690. 8015aaa: 6078 str r0, [r7, #4]
  52691. 8015aac: 460b mov r3, r1
  52692. 8015aae: 70fb strb r3, [r7, #3]
  52693. API_MSG_VAR_DECLARE(msg);
  52694. err_t err;
  52695. LWIP_UNUSED_ARG(how);
  52696. LWIP_ERROR("netconn_close: invalid conn", (conn != NULL), return ERR_ARG;);
  52697. 8015ab0: 687b ldr r3, [r7, #4]
  52698. 8015ab2: 2b00 cmp r3, #0
  52699. 8015ab4: d109 bne.n 8015aca <netconn_close_shutdown+0x26>
  52700. 8015ab6: 4b0f ldr r3, [pc, #60] @ (8015af4 <netconn_close_shutdown+0x50>)
  52701. 8015ab8: f240 4247 movw r2, #1095 @ 0x447
  52702. 8015abc: 490e ldr r1, [pc, #56] @ (8015af8 <netconn_close_shutdown+0x54>)
  52703. 8015abe: 480f ldr r0, [pc, #60] @ (8015afc <netconn_close_shutdown+0x58>)
  52704. 8015ac0: f013 ff84 bl 80299cc <iprintf>
  52705. 8015ac4: f06f 030f mvn.w r3, #15
  52706. 8015ac8: e010 b.n 8015aec <netconn_close_shutdown+0x48>
  52707. API_MSG_VAR_ALLOC(msg);
  52708. API_MSG_VAR_REF(msg).conn = conn;
  52709. 8015aca: 687b ldr r3, [r7, #4]
  52710. 8015acc: 60fb str r3, [r7, #12]
  52711. #if LWIP_TCP
  52712. /* shutting down both ends is the same as closing */
  52713. API_MSG_VAR_REF(msg).msg.sd.shut = how;
  52714. 8015ace: 78fb ldrb r3, [r7, #3]
  52715. 8015ad0: 753b strb r3, [r7, #20]
  52716. #if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
  52717. /* get the time we started, which is later compared to
  52718. sys_now() + conn->send_timeout */
  52719. API_MSG_VAR_REF(msg).msg.sd.time_started = sys_now();
  52720. #else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
  52721. API_MSG_VAR_REF(msg).msg.sd.polls_left =
  52722. 8015ad2: 2329 movs r3, #41 @ 0x29
  52723. 8015ad4: 757b strb r3, [r7, #21]
  52724. ((LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT + TCP_SLOW_INTERVAL - 1) / TCP_SLOW_INTERVAL) + 1;
  52725. #endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
  52726. #endif /* LWIP_TCP */
  52727. err = netconn_apimsg(lwip_netconn_do_close, &API_MSG_VAR_REF(msg));
  52728. 8015ad6: f107 030c add.w r3, r7, #12
  52729. 8015ada: 4619 mov r1, r3
  52730. 8015adc: 4808 ldr r0, [pc, #32] @ (8015b00 <netconn_close_shutdown+0x5c>)
  52731. 8015ade: f7ff fb33 bl 8015148 <netconn_apimsg>
  52732. 8015ae2: 4603 mov r3, r0
  52733. 8015ae4: f887 302f strb.w r3, [r7, #47] @ 0x2f
  52734. API_MSG_VAR_FREE(msg);
  52735. return err;
  52736. 8015ae8: f997 302f ldrsb.w r3, [r7, #47] @ 0x2f
  52737. }
  52738. 8015aec: 4618 mov r0, r3
  52739. 8015aee: 3730 adds r7, #48 @ 0x30
  52740. 8015af0: 46bd mov sp, r7
  52741. 8015af2: bd80 pop {r7, pc}
  52742. 8015af4: 0802cb84 .word 0x0802cb84
  52743. 8015af8: 0802cec0 .word 0x0802cec0
  52744. 8015afc: 0802cbdc .word 0x0802cbdc
  52745. 8015b00: 080173bd .word 0x080173bd
  52746. 08015b04 <netconn_err>:
  52747. * @param conn the netconn to get the error from
  52748. * @return and pending error or ERR_OK if no error was pending
  52749. */
  52750. err_t
  52751. netconn_err(struct netconn *conn)
  52752. {
  52753. 8015b04: b580 push {r7, lr}
  52754. 8015b06: b084 sub sp, #16
  52755. 8015b08: af00 add r7, sp, #0
  52756. 8015b0a: 6078 str r0, [r7, #4]
  52757. err_t err;
  52758. SYS_ARCH_DECL_PROTECT(lev);
  52759. if (conn == NULL) {
  52760. 8015b0c: 687b ldr r3, [r7, #4]
  52761. 8015b0e: 2b00 cmp r3, #0
  52762. 8015b10: d101 bne.n 8015b16 <netconn_err+0x12>
  52763. return ERR_OK;
  52764. 8015b12: 2300 movs r3, #0
  52765. 8015b14: e00d b.n 8015b32 <netconn_err+0x2e>
  52766. }
  52767. SYS_ARCH_PROTECT(lev);
  52768. 8015b16: f010 fcc3 bl 80264a0 <sys_arch_protect>
  52769. 8015b1a: 60f8 str r0, [r7, #12]
  52770. err = conn->pending_err;
  52771. 8015b1c: 687b ldr r3, [r7, #4]
  52772. 8015b1e: 7a1b ldrb r3, [r3, #8]
  52773. 8015b20: 72fb strb r3, [r7, #11]
  52774. conn->pending_err = ERR_OK;
  52775. 8015b22: 687b ldr r3, [r7, #4]
  52776. 8015b24: 2200 movs r2, #0
  52777. 8015b26: 721a strb r2, [r3, #8]
  52778. SYS_ARCH_UNPROTECT(lev);
  52779. 8015b28: 68f8 ldr r0, [r7, #12]
  52780. 8015b2a: f010 fcc7 bl 80264bc <sys_arch_unprotect>
  52781. return err;
  52782. 8015b2e: f997 300b ldrsb.w r3, [r7, #11]
  52783. }
  52784. 8015b32: 4618 mov r0, r3
  52785. 8015b34: 3710 adds r7, #16
  52786. 8015b36: 46bd mov sp, r7
  52787. 8015b38: bd80 pop {r7, pc}
  52788. ...
  52789. 08015b3c <lwip_netconn_err_to_msg>:
  52790. const u8_t netconn_closed = 0;
  52791. /** Translate an error to a unique void* passed via an mbox */
  52792. static void *
  52793. lwip_netconn_err_to_msg(err_t err)
  52794. {
  52795. 8015b3c: b580 push {r7, lr}
  52796. 8015b3e: b082 sub sp, #8
  52797. 8015b40: af00 add r7, sp, #0
  52798. 8015b42: 4603 mov r3, r0
  52799. 8015b44: 71fb strb r3, [r7, #7]
  52800. switch (err) {
  52801. 8015b46: f997 3007 ldrsb.w r3, [r7, #7]
  52802. 8015b4a: f113 0f0d cmn.w r3, #13
  52803. 8015b4e: d009 beq.n 8015b64 <lwip_netconn_err_to_msg+0x28>
  52804. 8015b50: f113 0f0d cmn.w r3, #13
  52805. 8015b54: dc0c bgt.n 8015b70 <lwip_netconn_err_to_msg+0x34>
  52806. 8015b56: f113 0f0f cmn.w r3, #15
  52807. 8015b5a: d007 beq.n 8015b6c <lwip_netconn_err_to_msg+0x30>
  52808. 8015b5c: f113 0f0e cmn.w r3, #14
  52809. 8015b60: d002 beq.n 8015b68 <lwip_netconn_err_to_msg+0x2c>
  52810. 8015b62: e005 b.n 8015b70 <lwip_netconn_err_to_msg+0x34>
  52811. case ERR_ABRT:
  52812. return LWIP_CONST_CAST(void *, &netconn_aborted);
  52813. 8015b64: 4b0a ldr r3, [pc, #40] @ (8015b90 <lwip_netconn_err_to_msg+0x54>)
  52814. 8015b66: e00e b.n 8015b86 <lwip_netconn_err_to_msg+0x4a>
  52815. case ERR_RST:
  52816. return LWIP_CONST_CAST(void *, &netconn_reset);
  52817. 8015b68: 4b0a ldr r3, [pc, #40] @ (8015b94 <lwip_netconn_err_to_msg+0x58>)
  52818. 8015b6a: e00c b.n 8015b86 <lwip_netconn_err_to_msg+0x4a>
  52819. case ERR_CLSD:
  52820. return LWIP_CONST_CAST(void *, &netconn_closed);
  52821. 8015b6c: 4b0a ldr r3, [pc, #40] @ (8015b98 <lwip_netconn_err_to_msg+0x5c>)
  52822. 8015b6e: e00a b.n 8015b86 <lwip_netconn_err_to_msg+0x4a>
  52823. default:
  52824. LWIP_ASSERT("unhandled error", err == ERR_OK);
  52825. 8015b70: f997 3007 ldrsb.w r3, [r7, #7]
  52826. 8015b74: 2b00 cmp r3, #0
  52827. 8015b76: d005 beq.n 8015b84 <lwip_netconn_err_to_msg+0x48>
  52828. 8015b78: 4b08 ldr r3, [pc, #32] @ (8015b9c <lwip_netconn_err_to_msg+0x60>)
  52829. 8015b7a: 227d movs r2, #125 @ 0x7d
  52830. 8015b7c: 4908 ldr r1, [pc, #32] @ (8015ba0 <lwip_netconn_err_to_msg+0x64>)
  52831. 8015b7e: 4809 ldr r0, [pc, #36] @ (8015ba4 <lwip_netconn_err_to_msg+0x68>)
  52832. 8015b80: f013 ff24 bl 80299cc <iprintf>
  52833. return NULL;
  52834. 8015b84: 2300 movs r3, #0
  52835. }
  52836. }
  52837. 8015b86: 4618 mov r0, r3
  52838. 8015b88: 3708 adds r7, #8
  52839. 8015b8a: 46bd mov sp, r7
  52840. 8015b8c: bd80 pop {r7, pc}
  52841. 8015b8e: bf00 nop
  52842. 8015b90: 08030a74 .word 0x08030a74
  52843. 8015b94: 08030a75 .word 0x08030a75
  52844. 8015b98: 08030a76 .word 0x08030a76
  52845. 8015b9c: 0802cedc .word 0x0802cedc
  52846. 8015ba0: 0802cf10 .word 0x0802cf10
  52847. 8015ba4: 0802cf20 .word 0x0802cf20
  52848. 08015ba8 <lwip_netconn_is_err_msg>:
  52849. int
  52850. lwip_netconn_is_err_msg(void *msg, err_t *err)
  52851. {
  52852. 8015ba8: b580 push {r7, lr}
  52853. 8015baa: b082 sub sp, #8
  52854. 8015bac: af00 add r7, sp, #0
  52855. 8015bae: 6078 str r0, [r7, #4]
  52856. 8015bb0: 6039 str r1, [r7, #0]
  52857. LWIP_ASSERT("err != NULL", err != NULL);
  52858. 8015bb2: 683b ldr r3, [r7, #0]
  52859. 8015bb4: 2b00 cmp r3, #0
  52860. 8015bb6: d105 bne.n 8015bc4 <lwip_netconn_is_err_msg+0x1c>
  52861. 8015bb8: 4b12 ldr r3, [pc, #72] @ (8015c04 <lwip_netconn_is_err_msg+0x5c>)
  52862. 8015bba: 2285 movs r2, #133 @ 0x85
  52863. 8015bbc: 4912 ldr r1, [pc, #72] @ (8015c08 <lwip_netconn_is_err_msg+0x60>)
  52864. 8015bbe: 4813 ldr r0, [pc, #76] @ (8015c0c <lwip_netconn_is_err_msg+0x64>)
  52865. 8015bc0: f013 ff04 bl 80299cc <iprintf>
  52866. if (msg == &netconn_aborted) {
  52867. 8015bc4: 687b ldr r3, [r7, #4]
  52868. 8015bc6: 4a12 ldr r2, [pc, #72] @ (8015c10 <lwip_netconn_is_err_msg+0x68>)
  52869. 8015bc8: 4293 cmp r3, r2
  52870. 8015bca: d104 bne.n 8015bd6 <lwip_netconn_is_err_msg+0x2e>
  52871. *err = ERR_ABRT;
  52872. 8015bcc: 683b ldr r3, [r7, #0]
  52873. 8015bce: 22f3 movs r2, #243 @ 0xf3
  52874. 8015bd0: 701a strb r2, [r3, #0]
  52875. return 1;
  52876. 8015bd2: 2301 movs r3, #1
  52877. 8015bd4: e012 b.n 8015bfc <lwip_netconn_is_err_msg+0x54>
  52878. } else if (msg == &netconn_reset) {
  52879. 8015bd6: 687b ldr r3, [r7, #4]
  52880. 8015bd8: 4a0e ldr r2, [pc, #56] @ (8015c14 <lwip_netconn_is_err_msg+0x6c>)
  52881. 8015bda: 4293 cmp r3, r2
  52882. 8015bdc: d104 bne.n 8015be8 <lwip_netconn_is_err_msg+0x40>
  52883. *err = ERR_RST;
  52884. 8015bde: 683b ldr r3, [r7, #0]
  52885. 8015be0: 22f2 movs r2, #242 @ 0xf2
  52886. 8015be2: 701a strb r2, [r3, #0]
  52887. return 1;
  52888. 8015be4: 2301 movs r3, #1
  52889. 8015be6: e009 b.n 8015bfc <lwip_netconn_is_err_msg+0x54>
  52890. } else if (msg == &netconn_closed) {
  52891. 8015be8: 687b ldr r3, [r7, #4]
  52892. 8015bea: 4a0b ldr r2, [pc, #44] @ (8015c18 <lwip_netconn_is_err_msg+0x70>)
  52893. 8015bec: 4293 cmp r3, r2
  52894. 8015bee: d104 bne.n 8015bfa <lwip_netconn_is_err_msg+0x52>
  52895. *err = ERR_CLSD;
  52896. 8015bf0: 683b ldr r3, [r7, #0]
  52897. 8015bf2: 22f1 movs r2, #241 @ 0xf1
  52898. 8015bf4: 701a strb r2, [r3, #0]
  52899. return 1;
  52900. 8015bf6: 2301 movs r3, #1
  52901. 8015bf8: e000 b.n 8015bfc <lwip_netconn_is_err_msg+0x54>
  52902. }
  52903. return 0;
  52904. 8015bfa: 2300 movs r3, #0
  52905. }
  52906. 8015bfc: 4618 mov r0, r3
  52907. 8015bfe: 3708 adds r7, #8
  52908. 8015c00: 46bd mov sp, r7
  52909. 8015c02: bd80 pop {r7, pc}
  52910. 8015c04: 0802cedc .word 0x0802cedc
  52911. 8015c08: 0802cf48 .word 0x0802cf48
  52912. 8015c0c: 0802cf20 .word 0x0802cf20
  52913. 8015c10: 08030a74 .word 0x08030a74
  52914. 8015c14: 08030a75 .word 0x08030a75
  52915. 8015c18: 08030a76 .word 0x08030a76
  52916. 08015c1c <recv_udp>:
  52917. * @see udp.h (struct udp_pcb.recv) for parameters
  52918. */
  52919. static void
  52920. recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p,
  52921. const ip_addr_t *addr, u16_t port)
  52922. {
  52923. 8015c1c: b580 push {r7, lr}
  52924. 8015c1e: b08a sub sp, #40 @ 0x28
  52925. 8015c20: af00 add r7, sp, #0
  52926. 8015c22: 60f8 str r0, [r7, #12]
  52927. 8015c24: 60b9 str r1, [r7, #8]
  52928. 8015c26: 607a str r2, [r7, #4]
  52929. 8015c28: 603b str r3, [r7, #0]
  52930. #if LWIP_SO_RCVBUF
  52931. int recv_avail;
  52932. #endif /* LWIP_SO_RCVBUF */
  52933. LWIP_UNUSED_ARG(pcb); /* only used for asserts... */
  52934. LWIP_ASSERT("recv_udp must have a pcb argument", pcb != NULL);
  52935. 8015c2a: 68bb ldr r3, [r7, #8]
  52936. 8015c2c: 2b00 cmp r3, #0
  52937. 8015c2e: d105 bne.n 8015c3c <recv_udp+0x20>
  52938. 8015c30: 4b43 ldr r3, [pc, #268] @ (8015d40 <recv_udp+0x124>)
  52939. 8015c32: 22e5 movs r2, #229 @ 0xe5
  52940. 8015c34: 4943 ldr r1, [pc, #268] @ (8015d44 <recv_udp+0x128>)
  52941. 8015c36: 4844 ldr r0, [pc, #272] @ (8015d48 <recv_udp+0x12c>)
  52942. 8015c38: f013 fec8 bl 80299cc <iprintf>
  52943. LWIP_ASSERT("recv_udp must have an argument", arg != NULL);
  52944. 8015c3c: 68fb ldr r3, [r7, #12]
  52945. 8015c3e: 2b00 cmp r3, #0
  52946. 8015c40: d105 bne.n 8015c4e <recv_udp+0x32>
  52947. 8015c42: 4b3f ldr r3, [pc, #252] @ (8015d40 <recv_udp+0x124>)
  52948. 8015c44: 22e6 movs r2, #230 @ 0xe6
  52949. 8015c46: 4941 ldr r1, [pc, #260] @ (8015d4c <recv_udp+0x130>)
  52950. 8015c48: 483f ldr r0, [pc, #252] @ (8015d48 <recv_udp+0x12c>)
  52951. 8015c4a: f013 febf bl 80299cc <iprintf>
  52952. conn = (struct netconn *)arg;
  52953. 8015c4e: 68fb ldr r3, [r7, #12]
  52954. 8015c50: 627b str r3, [r7, #36] @ 0x24
  52955. if (conn == NULL) {
  52956. 8015c52: 6a7b ldr r3, [r7, #36] @ 0x24
  52957. 8015c54: 2b00 cmp r3, #0
  52958. 8015c56: d103 bne.n 8015c60 <recv_udp+0x44>
  52959. pbuf_free(p);
  52960. 8015c58: 6878 ldr r0, [r7, #4]
  52961. 8015c5a: f004 fc3f bl 801a4dc <pbuf_free>
  52962. return;
  52963. 8015c5e: e06b b.n 8015d38 <recv_udp+0x11c>
  52964. }
  52965. LWIP_ASSERT("recv_udp: recv for wrong pcb!", conn->pcb.udp == pcb);
  52966. 8015c60: 6a7b ldr r3, [r7, #36] @ 0x24
  52967. 8015c62: 685b ldr r3, [r3, #4]
  52968. 8015c64: 68ba ldr r2, [r7, #8]
  52969. 8015c66: 429a cmp r2, r3
  52970. 8015c68: d005 beq.n 8015c76 <recv_udp+0x5a>
  52971. 8015c6a: 4b35 ldr r3, [pc, #212] @ (8015d40 <recv_udp+0x124>)
  52972. 8015c6c: 22ee movs r2, #238 @ 0xee
  52973. 8015c6e: 4938 ldr r1, [pc, #224] @ (8015d50 <recv_udp+0x134>)
  52974. 8015c70: 4835 ldr r0, [pc, #212] @ (8015d48 <recv_udp+0x12c>)
  52975. 8015c72: f013 feab bl 80299cc <iprintf>
  52976. #if LWIP_SO_RCVBUF
  52977. SYS_ARCH_GET(conn->recv_avail, recv_avail);
  52978. 8015c76: f010 fc13 bl 80264a0 <sys_arch_protect>
  52979. 8015c7a: 6238 str r0, [r7, #32]
  52980. 8015c7c: 6a7b ldr r3, [r7, #36] @ 0x24
  52981. 8015c7e: 6a5b ldr r3, [r3, #36] @ 0x24
  52982. 8015c80: 61fb str r3, [r7, #28]
  52983. 8015c82: 6a38 ldr r0, [r7, #32]
  52984. 8015c84: f010 fc1a bl 80264bc <sys_arch_unprotect>
  52985. if (!NETCONN_MBOX_VALID(conn, &conn->recvmbox) ||
  52986. 8015c88: 6a7b ldr r3, [r7, #36] @ 0x24
  52987. 8015c8a: 3310 adds r3, #16
  52988. 8015c8c: 4618 mov r0, r3
  52989. 8015c8e: f010 fafd bl 802628c <sys_mbox_valid>
  52990. 8015c92: 4603 mov r3, r0
  52991. 8015c94: 2b00 cmp r3, #0
  52992. 8015c96: d008 beq.n 8015caa <recv_udp+0x8e>
  52993. ((recv_avail + (int)(p->tot_len)) > conn->recv_bufsize)) {
  52994. 8015c98: 687b ldr r3, [r7, #4]
  52995. 8015c9a: 891b ldrh r3, [r3, #8]
  52996. 8015c9c: 461a mov r2, r3
  52997. 8015c9e: 69fb ldr r3, [r7, #28]
  52998. 8015ca0: 441a add r2, r3
  52999. 8015ca2: 6a7b ldr r3, [r7, #36] @ 0x24
  53000. 8015ca4: 6a1b ldr r3, [r3, #32]
  53001. if (!NETCONN_MBOX_VALID(conn, &conn->recvmbox) ||
  53002. 8015ca6: 429a cmp r2, r3
  53003. 8015ca8: dd03 ble.n 8015cb2 <recv_udp+0x96>
  53004. #else /* LWIP_SO_RCVBUF */
  53005. if (!NETCONN_MBOX_VALID(conn, &conn->recvmbox)) {
  53006. #endif /* LWIP_SO_RCVBUF */
  53007. pbuf_free(p);
  53008. 8015caa: 6878 ldr r0, [r7, #4]
  53009. 8015cac: f004 fc16 bl 801a4dc <pbuf_free>
  53010. return;
  53011. 8015cb0: e042 b.n 8015d38 <recv_udp+0x11c>
  53012. }
  53013. buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);
  53014. 8015cb2: 2006 movs r0, #6
  53015. 8015cb4: f003 fcae bl 8019614 <memp_malloc>
  53016. 8015cb8: 61b8 str r0, [r7, #24]
  53017. if (buf == NULL) {
  53018. 8015cba: 69bb ldr r3, [r7, #24]
  53019. 8015cbc: 2b00 cmp r3, #0
  53020. 8015cbe: d103 bne.n 8015cc8 <recv_udp+0xac>
  53021. pbuf_free(p);
  53022. 8015cc0: 6878 ldr r0, [r7, #4]
  53023. 8015cc2: f004 fc0b bl 801a4dc <pbuf_free>
  53024. return;
  53025. 8015cc6: e037 b.n 8015d38 <recv_udp+0x11c>
  53026. } else {
  53027. buf->p = p;
  53028. 8015cc8: 69bb ldr r3, [r7, #24]
  53029. 8015cca: 687a ldr r2, [r7, #4]
  53030. 8015ccc: 601a str r2, [r3, #0]
  53031. buf->ptr = p;
  53032. 8015cce: 69bb ldr r3, [r7, #24]
  53033. 8015cd0: 687a ldr r2, [r7, #4]
  53034. 8015cd2: 605a str r2, [r3, #4]
  53035. ip_addr_set(&buf->addr, addr);
  53036. 8015cd4: 683b ldr r3, [r7, #0]
  53037. 8015cd6: 2b00 cmp r3, #0
  53038. 8015cd8: d002 beq.n 8015ce0 <recv_udp+0xc4>
  53039. 8015cda: 683b ldr r3, [r7, #0]
  53040. 8015cdc: 681b ldr r3, [r3, #0]
  53041. 8015cde: e000 b.n 8015ce2 <recv_udp+0xc6>
  53042. 8015ce0: 2300 movs r3, #0
  53043. 8015ce2: 69ba ldr r2, [r7, #24]
  53044. 8015ce4: 6093 str r3, [r2, #8]
  53045. buf->port = port;
  53046. 8015ce6: 69bb ldr r3, [r7, #24]
  53047. 8015ce8: 8e3a ldrh r2, [r7, #48] @ 0x30
  53048. 8015cea: 819a strh r2, [r3, #12]
  53049. buf->toport_chksum = udphdr->dest;
  53050. }
  53051. #endif /* LWIP_NETBUF_RECVINFO */
  53052. }
  53053. len = p->tot_len;
  53054. 8015cec: 687b ldr r3, [r7, #4]
  53055. 8015cee: 891b ldrh r3, [r3, #8]
  53056. 8015cf0: 82fb strh r3, [r7, #22]
  53057. if (sys_mbox_trypost(&conn->recvmbox, buf) != ERR_OK) {
  53058. 8015cf2: 6a7b ldr r3, [r7, #36] @ 0x24
  53059. 8015cf4: 3310 adds r3, #16
  53060. 8015cf6: 69b9 ldr r1, [r7, #24]
  53061. 8015cf8: 4618 mov r0, r3
  53062. 8015cfa: f010 fa65 bl 80261c8 <sys_mbox_trypost>
  53063. 8015cfe: 4603 mov r3, r0
  53064. 8015d00: 2b00 cmp r3, #0
  53065. 8015d02: d003 beq.n 8015d0c <recv_udp+0xf0>
  53066. netbuf_delete(buf);
  53067. 8015d04: 69b8 ldr r0, [r7, #24]
  53068. 8015d06: f001 fbff bl 8017508 <netbuf_delete>
  53069. return;
  53070. 8015d0a: e015 b.n 8015d38 <recv_udp+0x11c>
  53071. } else {
  53072. #if LWIP_SO_RCVBUF
  53073. SYS_ARCH_INC(conn->recv_avail, len);
  53074. 8015d0c: f010 fbc8 bl 80264a0 <sys_arch_protect>
  53075. 8015d10: 6138 str r0, [r7, #16]
  53076. 8015d12: 6a7b ldr r3, [r7, #36] @ 0x24
  53077. 8015d14: 6a5a ldr r2, [r3, #36] @ 0x24
  53078. 8015d16: 8afb ldrh r3, [r7, #22]
  53079. 8015d18: 441a add r2, r3
  53080. 8015d1a: 6a7b ldr r3, [r7, #36] @ 0x24
  53081. 8015d1c: 625a str r2, [r3, #36] @ 0x24
  53082. 8015d1e: 6938 ldr r0, [r7, #16]
  53083. 8015d20: f010 fbcc bl 80264bc <sys_arch_unprotect>
  53084. #endif /* LWIP_SO_RCVBUF */
  53085. /* Register event with callback */
  53086. API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);
  53087. 8015d24: 6a7b ldr r3, [r7, #36] @ 0x24
  53088. 8015d26: 6b1b ldr r3, [r3, #48] @ 0x30
  53089. 8015d28: 2b00 cmp r3, #0
  53090. 8015d2a: d005 beq.n 8015d38 <recv_udp+0x11c>
  53091. 8015d2c: 6a7b ldr r3, [r7, #36] @ 0x24
  53092. 8015d2e: 6b1b ldr r3, [r3, #48] @ 0x30
  53093. 8015d30: 8afa ldrh r2, [r7, #22]
  53094. 8015d32: 2100 movs r1, #0
  53095. 8015d34: 6a78 ldr r0, [r7, #36] @ 0x24
  53096. 8015d36: 4798 blx r3
  53097. }
  53098. }
  53099. 8015d38: 3728 adds r7, #40 @ 0x28
  53100. 8015d3a: 46bd mov sp, r7
  53101. 8015d3c: bd80 pop {r7, pc}
  53102. 8015d3e: bf00 nop
  53103. 8015d40: 0802cedc .word 0x0802cedc
  53104. 8015d44: 0802cf54 .word 0x0802cf54
  53105. 8015d48: 0802cf20 .word 0x0802cf20
  53106. 8015d4c: 0802cf78 .word 0x0802cf78
  53107. 8015d50: 0802cf98 .word 0x0802cf98
  53108. 08015d54 <recv_tcp>:
  53109. *
  53110. * @see tcp.h (struct tcp_pcb.recv) for parameters and return value
  53111. */
  53112. static err_t
  53113. recv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  53114. {
  53115. 8015d54: b580 push {r7, lr}
  53116. 8015d56: b088 sub sp, #32
  53117. 8015d58: af00 add r7, sp, #0
  53118. 8015d5a: 60f8 str r0, [r7, #12]
  53119. 8015d5c: 60b9 str r1, [r7, #8]
  53120. 8015d5e: 607a str r2, [r7, #4]
  53121. 8015d60: 70fb strb r3, [r7, #3]
  53122. struct netconn *conn;
  53123. u16_t len;
  53124. void *msg;
  53125. LWIP_UNUSED_ARG(pcb);
  53126. LWIP_ASSERT("recv_tcp must have a pcb argument", pcb != NULL);
  53127. 8015d62: 68bb ldr r3, [r7, #8]
  53128. 8015d64: 2b00 cmp r3, #0
  53129. 8015d66: d106 bne.n 8015d76 <recv_tcp+0x22>
  53130. 8015d68: 4b3c ldr r3, [pc, #240] @ (8015e5c <recv_tcp+0x108>)
  53131. 8015d6a: f44f 7296 mov.w r2, #300 @ 0x12c
  53132. 8015d6e: 493c ldr r1, [pc, #240] @ (8015e60 <recv_tcp+0x10c>)
  53133. 8015d70: 483c ldr r0, [pc, #240] @ (8015e64 <recv_tcp+0x110>)
  53134. 8015d72: f013 fe2b bl 80299cc <iprintf>
  53135. LWIP_ASSERT("recv_tcp must have an argument", arg != NULL);
  53136. 8015d76: 68fb ldr r3, [r7, #12]
  53137. 8015d78: 2b00 cmp r3, #0
  53138. 8015d7a: d106 bne.n 8015d8a <recv_tcp+0x36>
  53139. 8015d7c: 4b37 ldr r3, [pc, #220] @ (8015e5c <recv_tcp+0x108>)
  53140. 8015d7e: f240 122d movw r2, #301 @ 0x12d
  53141. 8015d82: 4939 ldr r1, [pc, #228] @ (8015e68 <recv_tcp+0x114>)
  53142. 8015d84: 4837 ldr r0, [pc, #220] @ (8015e64 <recv_tcp+0x110>)
  53143. 8015d86: f013 fe21 bl 80299cc <iprintf>
  53144. LWIP_ASSERT("err != ERR_OK unhandled", err == ERR_OK);
  53145. 8015d8a: f997 3003 ldrsb.w r3, [r7, #3]
  53146. 8015d8e: 2b00 cmp r3, #0
  53147. 8015d90: d006 beq.n 8015da0 <recv_tcp+0x4c>
  53148. 8015d92: 4b32 ldr r3, [pc, #200] @ (8015e5c <recv_tcp+0x108>)
  53149. 8015d94: f44f 7297 mov.w r2, #302 @ 0x12e
  53150. 8015d98: 4934 ldr r1, [pc, #208] @ (8015e6c <recv_tcp+0x118>)
  53151. 8015d9a: 4832 ldr r0, [pc, #200] @ (8015e64 <recv_tcp+0x110>)
  53152. 8015d9c: f013 fe16 bl 80299cc <iprintf>
  53153. LWIP_UNUSED_ARG(err); /* for LWIP_NOASSERT */
  53154. conn = (struct netconn *)arg;
  53155. 8015da0: 68fb ldr r3, [r7, #12]
  53156. 8015da2: 617b str r3, [r7, #20]
  53157. if (conn == NULL) {
  53158. 8015da4: 697b ldr r3, [r7, #20]
  53159. 8015da6: 2b00 cmp r3, #0
  53160. 8015da8: d102 bne.n 8015db0 <recv_tcp+0x5c>
  53161. return ERR_VAL;
  53162. 8015daa: f06f 0305 mvn.w r3, #5
  53163. 8015dae: e051 b.n 8015e54 <recv_tcp+0x100>
  53164. }
  53165. LWIP_ASSERT("recv_tcp: recv for wrong pcb!", conn->pcb.tcp == pcb);
  53166. 8015db0: 697b ldr r3, [r7, #20]
  53167. 8015db2: 685b ldr r3, [r3, #4]
  53168. 8015db4: 68ba ldr r2, [r7, #8]
  53169. 8015db6: 429a cmp r2, r3
  53170. 8015db8: d006 beq.n 8015dc8 <recv_tcp+0x74>
  53171. 8015dba: 4b28 ldr r3, [pc, #160] @ (8015e5c <recv_tcp+0x108>)
  53172. 8015dbc: f240 1235 movw r2, #309 @ 0x135
  53173. 8015dc0: 492b ldr r1, [pc, #172] @ (8015e70 <recv_tcp+0x11c>)
  53174. 8015dc2: 4828 ldr r0, [pc, #160] @ (8015e64 <recv_tcp+0x110>)
  53175. 8015dc4: f013 fe02 bl 80299cc <iprintf>
  53176. if (!NETCONN_MBOX_VALID(conn, &conn->recvmbox)) {
  53177. 8015dc8: 697b ldr r3, [r7, #20]
  53178. 8015dca: 3310 adds r3, #16
  53179. 8015dcc: 4618 mov r0, r3
  53180. 8015dce: f010 fa5d bl 802628c <sys_mbox_valid>
  53181. 8015dd2: 4603 mov r3, r0
  53182. 8015dd4: 2b00 cmp r3, #0
  53183. 8015dd6: d10d bne.n 8015df4 <recv_tcp+0xa0>
  53184. /* recvmbox already deleted */
  53185. if (p != NULL) {
  53186. 8015dd8: 687b ldr r3, [r7, #4]
  53187. 8015dda: 2b00 cmp r3, #0
  53188. 8015ddc: d008 beq.n 8015df0 <recv_tcp+0x9c>
  53189. tcp_recved(pcb, p->tot_len);
  53190. 8015dde: 687b ldr r3, [r7, #4]
  53191. 8015de0: 891b ldrh r3, [r3, #8]
  53192. 8015de2: 4619 mov r1, r3
  53193. 8015de4: 68b8 ldr r0, [r7, #8]
  53194. 8015de6: f005 f9e5 bl 801b1b4 <tcp_recved>
  53195. pbuf_free(p);
  53196. 8015dea: 6878 ldr r0, [r7, #4]
  53197. 8015dec: f004 fb76 bl 801a4dc <pbuf_free>
  53198. }
  53199. return ERR_OK;
  53200. 8015df0: 2300 movs r3, #0
  53201. 8015df2: e02f b.n 8015e54 <recv_tcp+0x100>
  53202. }
  53203. /* Unlike for UDP or RAW pcbs, don't check for available space
  53204. using recv_avail since that could break the connection
  53205. (data is already ACKed) */
  53206. if (p != NULL) {
  53207. 8015df4: 687b ldr r3, [r7, #4]
  53208. 8015df6: 2b00 cmp r3, #0
  53209. 8015df8: d005 beq.n 8015e06 <recv_tcp+0xb2>
  53210. msg = p;
  53211. 8015dfa: 687b ldr r3, [r7, #4]
  53212. 8015dfc: 61bb str r3, [r7, #24]
  53213. len = p->tot_len;
  53214. 8015dfe: 687b ldr r3, [r7, #4]
  53215. 8015e00: 891b ldrh r3, [r3, #8]
  53216. 8015e02: 83fb strh r3, [r7, #30]
  53217. 8015e04: e003 b.n 8015e0e <recv_tcp+0xba>
  53218. } else {
  53219. msg = LWIP_CONST_CAST(void *, &netconn_closed);
  53220. 8015e06: 4b1b ldr r3, [pc, #108] @ (8015e74 <recv_tcp+0x120>)
  53221. 8015e08: 61bb str r3, [r7, #24]
  53222. len = 0;
  53223. 8015e0a: 2300 movs r3, #0
  53224. 8015e0c: 83fb strh r3, [r7, #30]
  53225. }
  53226. if (sys_mbox_trypost(&conn->recvmbox, msg) != ERR_OK) {
  53227. 8015e0e: 697b ldr r3, [r7, #20]
  53228. 8015e10: 3310 adds r3, #16
  53229. 8015e12: 69b9 ldr r1, [r7, #24]
  53230. 8015e14: 4618 mov r0, r3
  53231. 8015e16: f010 f9d7 bl 80261c8 <sys_mbox_trypost>
  53232. 8015e1a: 4603 mov r3, r0
  53233. 8015e1c: 2b00 cmp r3, #0
  53234. 8015e1e: d002 beq.n 8015e26 <recv_tcp+0xd2>
  53235. /* don't deallocate p: it is presented to us later again from tcp_fasttmr! */
  53236. return ERR_MEM;
  53237. 8015e20: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  53238. 8015e24: e016 b.n 8015e54 <recv_tcp+0x100>
  53239. } else {
  53240. #if LWIP_SO_RCVBUF
  53241. SYS_ARCH_INC(conn->recv_avail, len);
  53242. 8015e26: f010 fb3b bl 80264a0 <sys_arch_protect>
  53243. 8015e2a: 6138 str r0, [r7, #16]
  53244. 8015e2c: 697b ldr r3, [r7, #20]
  53245. 8015e2e: 6a5a ldr r2, [r3, #36] @ 0x24
  53246. 8015e30: 8bfb ldrh r3, [r7, #30]
  53247. 8015e32: 441a add r2, r3
  53248. 8015e34: 697b ldr r3, [r7, #20]
  53249. 8015e36: 625a str r2, [r3, #36] @ 0x24
  53250. 8015e38: 6938 ldr r0, [r7, #16]
  53251. 8015e3a: f010 fb3f bl 80264bc <sys_arch_unprotect>
  53252. #endif /* LWIP_SO_RCVBUF */
  53253. /* Register event with callback */
  53254. API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);
  53255. 8015e3e: 697b ldr r3, [r7, #20]
  53256. 8015e40: 6b1b ldr r3, [r3, #48] @ 0x30
  53257. 8015e42: 2b00 cmp r3, #0
  53258. 8015e44: d005 beq.n 8015e52 <recv_tcp+0xfe>
  53259. 8015e46: 697b ldr r3, [r7, #20]
  53260. 8015e48: 6b1b ldr r3, [r3, #48] @ 0x30
  53261. 8015e4a: 8bfa ldrh r2, [r7, #30]
  53262. 8015e4c: 2100 movs r1, #0
  53263. 8015e4e: 6978 ldr r0, [r7, #20]
  53264. 8015e50: 4798 blx r3
  53265. }
  53266. return ERR_OK;
  53267. 8015e52: 2300 movs r3, #0
  53268. }
  53269. 8015e54: 4618 mov r0, r3
  53270. 8015e56: 3720 adds r7, #32
  53271. 8015e58: 46bd mov sp, r7
  53272. 8015e5a: bd80 pop {r7, pc}
  53273. 8015e5c: 0802cedc .word 0x0802cedc
  53274. 8015e60: 0802cfb8 .word 0x0802cfb8
  53275. 8015e64: 0802cf20 .word 0x0802cf20
  53276. 8015e68: 0802cfdc .word 0x0802cfdc
  53277. 8015e6c: 0802cffc .word 0x0802cffc
  53278. 8015e70: 0802d014 .word 0x0802d014
  53279. 8015e74: 08030a76 .word 0x08030a76
  53280. 08015e78 <poll_tcp>:
  53281. *
  53282. * @see tcp.h (struct tcp_pcb.poll) for parameters and return value
  53283. */
  53284. static err_t
  53285. poll_tcp(void *arg, struct tcp_pcb *pcb)
  53286. {
  53287. 8015e78: b580 push {r7, lr}
  53288. 8015e7a: b084 sub sp, #16
  53289. 8015e7c: af00 add r7, sp, #0
  53290. 8015e7e: 6078 str r0, [r7, #4]
  53291. 8015e80: 6039 str r1, [r7, #0]
  53292. struct netconn *conn = (struct netconn *)arg;
  53293. 8015e82: 687b ldr r3, [r7, #4]
  53294. 8015e84: 60fb str r3, [r7, #12]
  53295. LWIP_UNUSED_ARG(pcb);
  53296. LWIP_ASSERT("conn != NULL", (conn != NULL));
  53297. 8015e86: 68fb ldr r3, [r7, #12]
  53298. 8015e88: 2b00 cmp r3, #0
  53299. 8015e8a: d106 bne.n 8015e9a <poll_tcp+0x22>
  53300. 8015e8c: 4b2b ldr r3, [pc, #172] @ (8015f3c <poll_tcp+0xc4>)
  53301. 8015e8e: f44f 72b5 mov.w r2, #362 @ 0x16a
  53302. 8015e92: 492b ldr r1, [pc, #172] @ (8015f40 <poll_tcp+0xc8>)
  53303. 8015e94: 482b ldr r0, [pc, #172] @ (8015f44 <poll_tcp+0xcc>)
  53304. 8015e96: f013 fd99 bl 80299cc <iprintf>
  53305. if (conn->state == NETCONN_WRITE) {
  53306. 8015e9a: 68fb ldr r3, [r7, #12]
  53307. 8015e9c: 785b ldrb r3, [r3, #1]
  53308. 8015e9e: 2b01 cmp r3, #1
  53309. 8015ea0: d104 bne.n 8015eac <poll_tcp+0x34>
  53310. lwip_netconn_do_writemore(conn WRITE_DELAYED);
  53311. 8015ea2: 2101 movs r1, #1
  53312. 8015ea4: 68f8 ldr r0, [r7, #12]
  53313. 8015ea6: f000 ffab bl 8016e00 <lwip_netconn_do_writemore>
  53314. 8015eaa: e016 b.n 8015eda <poll_tcp+0x62>
  53315. } else if (conn->state == NETCONN_CLOSE) {
  53316. 8015eac: 68fb ldr r3, [r7, #12]
  53317. 8015eae: 785b ldrb r3, [r3, #1]
  53318. 8015eb0: 2b04 cmp r3, #4
  53319. 8015eb2: d112 bne.n 8015eda <poll_tcp+0x62>
  53320. #if !LWIP_SO_SNDTIMEO && !LWIP_SO_LINGER
  53321. if (conn->current_msg && conn->current_msg->msg.sd.polls_left) {
  53322. 8015eb4: 68fb ldr r3, [r7, #12]
  53323. 8015eb6: 6adb ldr r3, [r3, #44] @ 0x2c
  53324. 8015eb8: 2b00 cmp r3, #0
  53325. 8015eba: d00a beq.n 8015ed2 <poll_tcp+0x5a>
  53326. 8015ebc: 68fb ldr r3, [r7, #12]
  53327. 8015ebe: 6adb ldr r3, [r3, #44] @ 0x2c
  53328. 8015ec0: 7a5b ldrb r3, [r3, #9]
  53329. 8015ec2: 2b00 cmp r3, #0
  53330. 8015ec4: d005 beq.n 8015ed2 <poll_tcp+0x5a>
  53331. conn->current_msg->msg.sd.polls_left--;
  53332. 8015ec6: 68fb ldr r3, [r7, #12]
  53333. 8015ec8: 6adb ldr r3, [r3, #44] @ 0x2c
  53334. 8015eca: 7a5a ldrb r2, [r3, #9]
  53335. 8015ecc: 3a01 subs r2, #1
  53336. 8015ece: b2d2 uxtb r2, r2
  53337. 8015ed0: 725a strb r2, [r3, #9]
  53338. }
  53339. #endif /* !LWIP_SO_SNDTIMEO && !LWIP_SO_LINGER */
  53340. lwip_netconn_do_close_internal(conn WRITE_DELAYED);
  53341. 8015ed2: 2101 movs r1, #1
  53342. 8015ed4: 68f8 ldr r0, [r7, #12]
  53343. 8015ed6: f000 fb53 bl 8016580 <lwip_netconn_do_close_internal>
  53344. }
  53345. /* @todo: implement connect timeout here? */
  53346. /* Did a nonblocking write fail before? Then check available write-space. */
  53347. if (conn->flags & NETCONN_FLAG_CHECK_WRITESPACE) {
  53348. 8015eda: 68fb ldr r3, [r7, #12]
  53349. 8015edc: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  53350. 8015ee0: f003 0310 and.w r3, r3, #16
  53351. 8015ee4: 2b00 cmp r3, #0
  53352. 8015ee6: d024 beq.n 8015f32 <poll_tcp+0xba>
  53353. /* If the queued byte- or pbuf-count drops below the configured low-water limit,
  53354. let select mark this pcb as writable again. */
  53355. if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) &&
  53356. 8015ee8: 68fb ldr r3, [r7, #12]
  53357. 8015eea: 685b ldr r3, [r3, #4]
  53358. 8015eec: 2b00 cmp r3, #0
  53359. 8015eee: d020 beq.n 8015f32 <poll_tcp+0xba>
  53360. 8015ef0: 68fb ldr r3, [r7, #12]
  53361. 8015ef2: 685b ldr r3, [r3, #4]
  53362. 8015ef4: f8b3 3064 ldrh.w r3, [r3, #100] @ 0x64
  53363. 8015ef8: f640 3269 movw r2, #2921 @ 0xb69
  53364. 8015efc: 4293 cmp r3, r2
  53365. 8015efe: d918 bls.n 8015f32 <poll_tcp+0xba>
  53366. (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) {
  53367. 8015f00: 68fb ldr r3, [r7, #12]
  53368. 8015f02: 685b ldr r3, [r3, #4]
  53369. 8015f04: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  53370. if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) &&
  53371. 8015f08: 2b07 cmp r3, #7
  53372. 8015f0a: d812 bhi.n 8015f32 <poll_tcp+0xba>
  53373. netconn_clear_flags(conn, NETCONN_FLAG_CHECK_WRITESPACE);
  53374. 8015f0c: 68fb ldr r3, [r7, #12]
  53375. 8015f0e: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  53376. 8015f12: f023 0310 bic.w r3, r3, #16
  53377. 8015f16: b2da uxtb r2, r3
  53378. 8015f18: 68fb ldr r3, [r7, #12]
  53379. 8015f1a: f883 2028 strb.w r2, [r3, #40] @ 0x28
  53380. API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
  53381. 8015f1e: 68fb ldr r3, [r7, #12]
  53382. 8015f20: 6b1b ldr r3, [r3, #48] @ 0x30
  53383. 8015f22: 2b00 cmp r3, #0
  53384. 8015f24: d005 beq.n 8015f32 <poll_tcp+0xba>
  53385. 8015f26: 68fb ldr r3, [r7, #12]
  53386. 8015f28: 6b1b ldr r3, [r3, #48] @ 0x30
  53387. 8015f2a: 2200 movs r2, #0
  53388. 8015f2c: 2102 movs r1, #2
  53389. 8015f2e: 68f8 ldr r0, [r7, #12]
  53390. 8015f30: 4798 blx r3
  53391. }
  53392. }
  53393. return ERR_OK;
  53394. 8015f32: 2300 movs r3, #0
  53395. }
  53396. 8015f34: 4618 mov r0, r3
  53397. 8015f36: 3710 adds r7, #16
  53398. 8015f38: 46bd mov sp, r7
  53399. 8015f3a: bd80 pop {r7, pc}
  53400. 8015f3c: 0802cedc .word 0x0802cedc
  53401. 8015f40: 0802d034 .word 0x0802d034
  53402. 8015f44: 0802cf20 .word 0x0802cf20
  53403. 08015f48 <sent_tcp>:
  53404. *
  53405. * @see tcp.h (struct tcp_pcb.sent) for parameters and return value
  53406. */
  53407. static err_t
  53408. sent_tcp(void *arg, struct tcp_pcb *pcb, u16_t len)
  53409. {
  53410. 8015f48: b580 push {r7, lr}
  53411. 8015f4a: b086 sub sp, #24
  53412. 8015f4c: af00 add r7, sp, #0
  53413. 8015f4e: 60f8 str r0, [r7, #12]
  53414. 8015f50: 60b9 str r1, [r7, #8]
  53415. 8015f52: 4613 mov r3, r2
  53416. 8015f54: 80fb strh r3, [r7, #6]
  53417. struct netconn *conn = (struct netconn *)arg;
  53418. 8015f56: 68fb ldr r3, [r7, #12]
  53419. 8015f58: 617b str r3, [r7, #20]
  53420. LWIP_UNUSED_ARG(pcb);
  53421. LWIP_ASSERT("conn != NULL", (conn != NULL));
  53422. 8015f5a: 697b ldr r3, [r7, #20]
  53423. 8015f5c: 2b00 cmp r3, #0
  53424. 8015f5e: d106 bne.n 8015f6e <sent_tcp+0x26>
  53425. 8015f60: 4b22 ldr r3, [pc, #136] @ (8015fec <sent_tcp+0xa4>)
  53426. 8015f62: f240 1293 movw r2, #403 @ 0x193
  53427. 8015f66: 4922 ldr r1, [pc, #136] @ (8015ff0 <sent_tcp+0xa8>)
  53428. 8015f68: 4822 ldr r0, [pc, #136] @ (8015ff4 <sent_tcp+0xac>)
  53429. 8015f6a: f013 fd2f bl 80299cc <iprintf>
  53430. if (conn) {
  53431. 8015f6e: 697b ldr r3, [r7, #20]
  53432. 8015f70: 2b00 cmp r3, #0
  53433. 8015f72: d035 beq.n 8015fe0 <sent_tcp+0x98>
  53434. if (conn->state == NETCONN_WRITE) {
  53435. 8015f74: 697b ldr r3, [r7, #20]
  53436. 8015f76: 785b ldrb r3, [r3, #1]
  53437. 8015f78: 2b01 cmp r3, #1
  53438. 8015f7a: d104 bne.n 8015f86 <sent_tcp+0x3e>
  53439. lwip_netconn_do_writemore(conn WRITE_DELAYED);
  53440. 8015f7c: 2101 movs r1, #1
  53441. 8015f7e: 6978 ldr r0, [r7, #20]
  53442. 8015f80: f000 ff3e bl 8016e00 <lwip_netconn_do_writemore>
  53443. 8015f84: e007 b.n 8015f96 <sent_tcp+0x4e>
  53444. } else if (conn->state == NETCONN_CLOSE) {
  53445. 8015f86: 697b ldr r3, [r7, #20]
  53446. 8015f88: 785b ldrb r3, [r3, #1]
  53447. 8015f8a: 2b04 cmp r3, #4
  53448. 8015f8c: d103 bne.n 8015f96 <sent_tcp+0x4e>
  53449. lwip_netconn_do_close_internal(conn WRITE_DELAYED);
  53450. 8015f8e: 2101 movs r1, #1
  53451. 8015f90: 6978 ldr r0, [r7, #20]
  53452. 8015f92: f000 faf5 bl 8016580 <lwip_netconn_do_close_internal>
  53453. }
  53454. /* If the queued byte- or pbuf-count drops below the configured low-water limit,
  53455. let select mark this pcb as writable again. */
  53456. if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) &&
  53457. 8015f96: 697b ldr r3, [r7, #20]
  53458. 8015f98: 685b ldr r3, [r3, #4]
  53459. 8015f9a: 2b00 cmp r3, #0
  53460. 8015f9c: d020 beq.n 8015fe0 <sent_tcp+0x98>
  53461. 8015f9e: 697b ldr r3, [r7, #20]
  53462. 8015fa0: 685b ldr r3, [r3, #4]
  53463. 8015fa2: f8b3 3064 ldrh.w r3, [r3, #100] @ 0x64
  53464. 8015fa6: f640 3269 movw r2, #2921 @ 0xb69
  53465. 8015faa: 4293 cmp r3, r2
  53466. 8015fac: d918 bls.n 8015fe0 <sent_tcp+0x98>
  53467. (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) {
  53468. 8015fae: 697b ldr r3, [r7, #20]
  53469. 8015fb0: 685b ldr r3, [r3, #4]
  53470. 8015fb2: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  53471. if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) &&
  53472. 8015fb6: 2b07 cmp r3, #7
  53473. 8015fb8: d812 bhi.n 8015fe0 <sent_tcp+0x98>
  53474. netconn_clear_flags(conn, NETCONN_FLAG_CHECK_WRITESPACE);
  53475. 8015fba: 697b ldr r3, [r7, #20]
  53476. 8015fbc: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  53477. 8015fc0: f023 0310 bic.w r3, r3, #16
  53478. 8015fc4: b2da uxtb r2, r3
  53479. 8015fc6: 697b ldr r3, [r7, #20]
  53480. 8015fc8: f883 2028 strb.w r2, [r3, #40] @ 0x28
  53481. API_EVENT(conn, NETCONN_EVT_SENDPLUS, len);
  53482. 8015fcc: 697b ldr r3, [r7, #20]
  53483. 8015fce: 6b1b ldr r3, [r3, #48] @ 0x30
  53484. 8015fd0: 2b00 cmp r3, #0
  53485. 8015fd2: d005 beq.n 8015fe0 <sent_tcp+0x98>
  53486. 8015fd4: 697b ldr r3, [r7, #20]
  53487. 8015fd6: 6b1b ldr r3, [r3, #48] @ 0x30
  53488. 8015fd8: 88fa ldrh r2, [r7, #6]
  53489. 8015fda: 2102 movs r1, #2
  53490. 8015fdc: 6978 ldr r0, [r7, #20]
  53491. 8015fde: 4798 blx r3
  53492. }
  53493. }
  53494. return ERR_OK;
  53495. 8015fe0: 2300 movs r3, #0
  53496. }
  53497. 8015fe2: 4618 mov r0, r3
  53498. 8015fe4: 3718 adds r7, #24
  53499. 8015fe6: 46bd mov sp, r7
  53500. 8015fe8: bd80 pop {r7, pc}
  53501. 8015fea: bf00 nop
  53502. 8015fec: 0802cedc .word 0x0802cedc
  53503. 8015ff0: 0802d034 .word 0x0802d034
  53504. 8015ff4: 0802cf20 .word 0x0802cf20
  53505. 08015ff8 <err_tcp>:
  53506. *
  53507. * @see tcp.h (struct tcp_pcb.err) for parameters
  53508. */
  53509. static void
  53510. err_tcp(void *arg, err_t err)
  53511. {
  53512. 8015ff8: b580 push {r7, lr}
  53513. 8015ffa: b088 sub sp, #32
  53514. 8015ffc: af00 add r7, sp, #0
  53515. 8015ffe: 6078 str r0, [r7, #4]
  53516. 8016000: 460b mov r3, r1
  53517. 8016002: 70fb strb r3, [r7, #3]
  53518. struct netconn *conn;
  53519. enum netconn_state old_state;
  53520. void *mbox_msg;
  53521. SYS_ARCH_DECL_PROTECT(lev);
  53522. conn = (struct netconn *)arg;
  53523. 8016004: 687b ldr r3, [r7, #4]
  53524. 8016006: 61fb str r3, [r7, #28]
  53525. LWIP_ASSERT("conn != NULL", (conn != NULL));
  53526. 8016008: 69fb ldr r3, [r7, #28]
  53527. 801600a: 2b00 cmp r3, #0
  53528. 801600c: d106 bne.n 801601c <err_tcp+0x24>
  53529. 801600e: 4b61 ldr r3, [pc, #388] @ (8016194 <err_tcp+0x19c>)
  53530. 8016010: f44f 72dc mov.w r2, #440 @ 0x1b8
  53531. 8016014: 4960 ldr r1, [pc, #384] @ (8016198 <err_tcp+0x1a0>)
  53532. 8016016: 4861 ldr r0, [pc, #388] @ (801619c <err_tcp+0x1a4>)
  53533. 8016018: f013 fcd8 bl 80299cc <iprintf>
  53534. SYS_ARCH_PROTECT(lev);
  53535. 801601c: f010 fa40 bl 80264a0 <sys_arch_protect>
  53536. 8016020: 61b8 str r0, [r7, #24]
  53537. /* when err is called, the pcb is deallocated, so delete the reference */
  53538. conn->pcb.tcp = NULL;
  53539. 8016022: 69fb ldr r3, [r7, #28]
  53540. 8016024: 2200 movs r2, #0
  53541. 8016026: 605a str r2, [r3, #4]
  53542. /* store pending error */
  53543. conn->pending_err = err;
  53544. 8016028: 69fb ldr r3, [r7, #28]
  53545. 801602a: 78fa ldrb r2, [r7, #3]
  53546. 801602c: 721a strb r2, [r3, #8]
  53547. /* prevent application threads from blocking on 'recvmbox'/'acceptmbox' */
  53548. conn->flags |= NETCONN_FLAG_MBOXCLOSED;
  53549. 801602e: 69fb ldr r3, [r7, #28]
  53550. 8016030: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  53551. 8016034: f043 0301 orr.w r3, r3, #1
  53552. 8016038: b2da uxtb r2, r3
  53553. 801603a: 69fb ldr r3, [r7, #28]
  53554. 801603c: f883 2028 strb.w r2, [r3, #40] @ 0x28
  53555. /* reset conn->state now before waking up other threads */
  53556. old_state = conn->state;
  53557. 8016040: 69fb ldr r3, [r7, #28]
  53558. 8016042: 785b ldrb r3, [r3, #1]
  53559. 8016044: 75fb strb r3, [r7, #23]
  53560. conn->state = NETCONN_NONE;
  53561. 8016046: 69fb ldr r3, [r7, #28]
  53562. 8016048: 2200 movs r2, #0
  53563. 801604a: 705a strb r2, [r3, #1]
  53564. SYS_ARCH_UNPROTECT(lev);
  53565. 801604c: 69b8 ldr r0, [r7, #24]
  53566. 801604e: f010 fa35 bl 80264bc <sys_arch_unprotect>
  53567. /* Notify the user layer about a connection error. Used to signal select. */
  53568. API_EVENT(conn, NETCONN_EVT_ERROR, 0);
  53569. 8016052: 69fb ldr r3, [r7, #28]
  53570. 8016054: 6b1b ldr r3, [r3, #48] @ 0x30
  53571. 8016056: 2b00 cmp r3, #0
  53572. 8016058: d005 beq.n 8016066 <err_tcp+0x6e>
  53573. 801605a: 69fb ldr r3, [r7, #28]
  53574. 801605c: 6b1b ldr r3, [r3, #48] @ 0x30
  53575. 801605e: 2200 movs r2, #0
  53576. 8016060: 2104 movs r1, #4
  53577. 8016062: 69f8 ldr r0, [r7, #28]
  53578. 8016064: 4798 blx r3
  53579. /* Try to release selects pending on 'read' or 'write', too.
  53580. They will get an error if they actually try to read or write. */
  53581. API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);
  53582. 8016066: 69fb ldr r3, [r7, #28]
  53583. 8016068: 6b1b ldr r3, [r3, #48] @ 0x30
  53584. 801606a: 2b00 cmp r3, #0
  53585. 801606c: d005 beq.n 801607a <err_tcp+0x82>
  53586. 801606e: 69fb ldr r3, [r7, #28]
  53587. 8016070: 6b1b ldr r3, [r3, #48] @ 0x30
  53588. 8016072: 2200 movs r2, #0
  53589. 8016074: 2100 movs r1, #0
  53590. 8016076: 69f8 ldr r0, [r7, #28]
  53591. 8016078: 4798 blx r3
  53592. API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
  53593. 801607a: 69fb ldr r3, [r7, #28]
  53594. 801607c: 6b1b ldr r3, [r3, #48] @ 0x30
  53595. 801607e: 2b00 cmp r3, #0
  53596. 8016080: d005 beq.n 801608e <err_tcp+0x96>
  53597. 8016082: 69fb ldr r3, [r7, #28]
  53598. 8016084: 6b1b ldr r3, [r3, #48] @ 0x30
  53599. 8016086: 2200 movs r2, #0
  53600. 8016088: 2102 movs r1, #2
  53601. 801608a: 69f8 ldr r0, [r7, #28]
  53602. 801608c: 4798 blx r3
  53603. mbox_msg = lwip_netconn_err_to_msg(err);
  53604. 801608e: f997 3003 ldrsb.w r3, [r7, #3]
  53605. 8016092: 4618 mov r0, r3
  53606. 8016094: f7ff fd52 bl 8015b3c <lwip_netconn_err_to_msg>
  53607. 8016098: 6138 str r0, [r7, #16]
  53608. /* pass error message to recvmbox to wake up pending recv */
  53609. if (NETCONN_MBOX_VALID(conn, &conn->recvmbox)) {
  53610. 801609a: 69fb ldr r3, [r7, #28]
  53611. 801609c: 3310 adds r3, #16
  53612. 801609e: 4618 mov r0, r3
  53613. 80160a0: f010 f8f4 bl 802628c <sys_mbox_valid>
  53614. 80160a4: 4603 mov r3, r0
  53615. 80160a6: 2b00 cmp r3, #0
  53616. 80160a8: d005 beq.n 80160b6 <err_tcp+0xbe>
  53617. /* use trypost to prevent deadlock */
  53618. sys_mbox_trypost(&conn->recvmbox, mbox_msg);
  53619. 80160aa: 69fb ldr r3, [r7, #28]
  53620. 80160ac: 3310 adds r3, #16
  53621. 80160ae: 6939 ldr r1, [r7, #16]
  53622. 80160b0: 4618 mov r0, r3
  53623. 80160b2: f010 f889 bl 80261c8 <sys_mbox_trypost>
  53624. }
  53625. /* pass error message to acceptmbox to wake up pending accept */
  53626. if (NETCONN_MBOX_VALID(conn, &conn->acceptmbox)) {
  53627. 80160b6: 69fb ldr r3, [r7, #28]
  53628. 80160b8: 3314 adds r3, #20
  53629. 80160ba: 4618 mov r0, r3
  53630. 80160bc: f010 f8e6 bl 802628c <sys_mbox_valid>
  53631. 80160c0: 4603 mov r3, r0
  53632. 80160c2: 2b00 cmp r3, #0
  53633. 80160c4: d005 beq.n 80160d2 <err_tcp+0xda>
  53634. /* use trypost to preven deadlock */
  53635. sys_mbox_trypost(&conn->acceptmbox, mbox_msg);
  53636. 80160c6: 69fb ldr r3, [r7, #28]
  53637. 80160c8: 3314 adds r3, #20
  53638. 80160ca: 6939 ldr r1, [r7, #16]
  53639. 80160cc: 4618 mov r0, r3
  53640. 80160ce: f010 f87b bl 80261c8 <sys_mbox_trypost>
  53641. }
  53642. if ((old_state == NETCONN_WRITE) || (old_state == NETCONN_CLOSE) ||
  53643. 80160d2: 7dfb ldrb r3, [r7, #23]
  53644. 80160d4: 2b01 cmp r3, #1
  53645. 80160d6: d005 beq.n 80160e4 <err_tcp+0xec>
  53646. 80160d8: 7dfb ldrb r3, [r7, #23]
  53647. 80160da: 2b04 cmp r3, #4
  53648. 80160dc: d002 beq.n 80160e4 <err_tcp+0xec>
  53649. 80160de: 7dfb ldrb r3, [r7, #23]
  53650. 80160e0: 2b03 cmp r3, #3
  53651. 80160e2: d146 bne.n 8016172 <err_tcp+0x17a>
  53652. (old_state == NETCONN_CONNECT)) {
  53653. /* calling lwip_netconn_do_writemore/lwip_netconn_do_close_internal is not necessary
  53654. since the pcb has already been deleted! */
  53655. int was_nonblocking_connect = IN_NONBLOCKING_CONNECT(conn);
  53656. 80160e4: 69fb ldr r3, [r7, #28]
  53657. 80160e6: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  53658. 80160ea: f003 0304 and.w r3, r3, #4
  53659. 80160ee: 2b00 cmp r3, #0
  53660. 80160f0: bf14 ite ne
  53661. 80160f2: 2301 movne r3, #1
  53662. 80160f4: 2300 moveq r3, #0
  53663. 80160f6: b2db uxtb r3, r3
  53664. 80160f8: 60fb str r3, [r7, #12]
  53665. SET_NONBLOCKING_CONNECT(conn, 0);
  53666. 80160fa: 69fb ldr r3, [r7, #28]
  53667. 80160fc: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  53668. 8016100: f023 0304 bic.w r3, r3, #4
  53669. 8016104: b2da uxtb r2, r3
  53670. 8016106: 69fb ldr r3, [r7, #28]
  53671. 8016108: f883 2028 strb.w r2, [r3, #40] @ 0x28
  53672. if (!was_nonblocking_connect) {
  53673. 801610c: 68fb ldr r3, [r7, #12]
  53674. 801610e: 2b00 cmp r3, #0
  53675. 8016110: d13b bne.n 801618a <err_tcp+0x192>
  53676. sys_sem_t *op_completed_sem;
  53677. /* set error return code */
  53678. LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL);
  53679. 8016112: 69fb ldr r3, [r7, #28]
  53680. 8016114: 6adb ldr r3, [r3, #44] @ 0x2c
  53681. 8016116: 2b00 cmp r3, #0
  53682. 8016118: d106 bne.n 8016128 <err_tcp+0x130>
  53683. 801611a: 4b1e ldr r3, [pc, #120] @ (8016194 <err_tcp+0x19c>)
  53684. 801611c: f44f 72f3 mov.w r2, #486 @ 0x1e6
  53685. 8016120: 491f ldr r1, [pc, #124] @ (80161a0 <err_tcp+0x1a8>)
  53686. 8016122: 481e ldr r0, [pc, #120] @ (801619c <err_tcp+0x1a4>)
  53687. 8016124: f013 fc52 bl 80299cc <iprintf>
  53688. if (old_state == NETCONN_CLOSE) {
  53689. 8016128: 7dfb ldrb r3, [r7, #23]
  53690. 801612a: 2b04 cmp r3, #4
  53691. 801612c: d104 bne.n 8016138 <err_tcp+0x140>
  53692. /* let close succeed: the connection is closed after all... */
  53693. conn->current_msg->err = ERR_OK;
  53694. 801612e: 69fb ldr r3, [r7, #28]
  53695. 8016130: 6adb ldr r3, [r3, #44] @ 0x2c
  53696. 8016132: 2200 movs r2, #0
  53697. 8016134: 711a strb r2, [r3, #4]
  53698. 8016136: e003 b.n 8016140 <err_tcp+0x148>
  53699. } else {
  53700. /* Write and connect fail */
  53701. conn->current_msg->err = err;
  53702. 8016138: 69fb ldr r3, [r7, #28]
  53703. 801613a: 6adb ldr r3, [r3, #44] @ 0x2c
  53704. 801613c: 78fa ldrb r2, [r7, #3]
  53705. 801613e: 711a strb r2, [r3, #4]
  53706. }
  53707. op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
  53708. 8016140: 69fb ldr r3, [r7, #28]
  53709. 8016142: 6adb ldr r3, [r3, #44] @ 0x2c
  53710. 8016144: 681b ldr r3, [r3, #0]
  53711. 8016146: 330c adds r3, #12
  53712. 8016148: 60bb str r3, [r7, #8]
  53713. LWIP_ASSERT("inavlid op_completed_sem", sys_sem_valid(op_completed_sem));
  53714. 801614a: 68b8 ldr r0, [r7, #8]
  53715. 801614c: f010 f92c bl 80263a8 <sys_sem_valid>
  53716. 8016150: 4603 mov r3, r0
  53717. 8016152: 2b00 cmp r3, #0
  53718. 8016154: d106 bne.n 8016164 <err_tcp+0x16c>
  53719. 8016156: 4b0f ldr r3, [pc, #60] @ (8016194 <err_tcp+0x19c>)
  53720. 8016158: f240 12ef movw r2, #495 @ 0x1ef
  53721. 801615c: 4911 ldr r1, [pc, #68] @ (80161a4 <err_tcp+0x1ac>)
  53722. 801615e: 480f ldr r0, [pc, #60] @ (801619c <err_tcp+0x1a4>)
  53723. 8016160: f013 fc34 bl 80299cc <iprintf>
  53724. conn->current_msg = NULL;
  53725. 8016164: 69fb ldr r3, [r7, #28]
  53726. 8016166: 2200 movs r2, #0
  53727. 8016168: 62da str r2, [r3, #44] @ 0x2c
  53728. /* wake up the waiting task */
  53729. sys_sem_signal(op_completed_sem);
  53730. 801616a: 68b8 ldr r0, [r7, #8]
  53731. 801616c: f010 f902 bl 8026374 <sys_sem_signal>
  53732. (old_state == NETCONN_CONNECT)) {
  53733. 8016170: e00b b.n 801618a <err_tcp+0x192>
  53734. } else {
  53735. /* @todo: test what happens for error on nonblocking connect */
  53736. }
  53737. } else {
  53738. LWIP_ASSERT("conn->current_msg == NULL", conn->current_msg == NULL);
  53739. 8016172: 69fb ldr r3, [r7, #28]
  53740. 8016174: 6adb ldr r3, [r3, #44] @ 0x2c
  53741. 8016176: 2b00 cmp r3, #0
  53742. 8016178: d008 beq.n 801618c <err_tcp+0x194>
  53743. 801617a: 4b06 ldr r3, [pc, #24] @ (8016194 <err_tcp+0x19c>)
  53744. 801617c: f240 12f7 movw r2, #503 @ 0x1f7
  53745. 8016180: 4909 ldr r1, [pc, #36] @ (80161a8 <err_tcp+0x1b0>)
  53746. 8016182: 4806 ldr r0, [pc, #24] @ (801619c <err_tcp+0x1a4>)
  53747. 8016184: f013 fc22 bl 80299cc <iprintf>
  53748. }
  53749. }
  53750. 8016188: e000 b.n 801618c <err_tcp+0x194>
  53751. (old_state == NETCONN_CONNECT)) {
  53752. 801618a: bf00 nop
  53753. }
  53754. 801618c: bf00 nop
  53755. 801618e: 3720 adds r7, #32
  53756. 8016190: 46bd mov sp, r7
  53757. 8016192: bd80 pop {r7, pc}
  53758. 8016194: 0802cedc .word 0x0802cedc
  53759. 8016198: 0802d034 .word 0x0802d034
  53760. 801619c: 0802cf20 .word 0x0802cf20
  53761. 80161a0: 0802d044 .word 0x0802d044
  53762. 80161a4: 0802d060 .word 0x0802d060
  53763. 80161a8: 0802d07c .word 0x0802d07c
  53764. 080161ac <setup_tcp>:
  53765. *
  53766. * @param conn the TCP netconn to setup
  53767. */
  53768. static void
  53769. setup_tcp(struct netconn *conn)
  53770. {
  53771. 80161ac: b580 push {r7, lr}
  53772. 80161ae: b084 sub sp, #16
  53773. 80161b0: af00 add r7, sp, #0
  53774. 80161b2: 6078 str r0, [r7, #4]
  53775. struct tcp_pcb *pcb;
  53776. pcb = conn->pcb.tcp;
  53777. 80161b4: 687b ldr r3, [r7, #4]
  53778. 80161b6: 685b ldr r3, [r3, #4]
  53779. 80161b8: 60fb str r3, [r7, #12]
  53780. tcp_arg(pcb, conn);
  53781. 80161ba: 6879 ldr r1, [r7, #4]
  53782. 80161bc: 68f8 ldr r0, [r7, #12]
  53783. 80161be: f005 ffe3 bl 801c188 <tcp_arg>
  53784. tcp_recv(pcb, recv_tcp);
  53785. 80161c2: 490a ldr r1, [pc, #40] @ (80161ec <setup_tcp+0x40>)
  53786. 80161c4: 68f8 ldr r0, [r7, #12]
  53787. 80161c6: f005 fff1 bl 801c1ac <tcp_recv>
  53788. tcp_sent(pcb, sent_tcp);
  53789. 80161ca: 4909 ldr r1, [pc, #36] @ (80161f0 <setup_tcp+0x44>)
  53790. 80161cc: 68f8 ldr r0, [r7, #12]
  53791. 80161ce: f006 f811 bl 801c1f4 <tcp_sent>
  53792. tcp_poll(pcb, poll_tcp, NETCONN_TCP_POLL_INTERVAL);
  53793. 80161d2: 2202 movs r2, #2
  53794. 80161d4: 4907 ldr r1, [pc, #28] @ (80161f4 <setup_tcp+0x48>)
  53795. 80161d6: 68f8 ldr r0, [r7, #12]
  53796. 80161d8: f006 f86c bl 801c2b4 <tcp_poll>
  53797. tcp_err(pcb, err_tcp);
  53798. 80161dc: 4906 ldr r1, [pc, #24] @ (80161f8 <setup_tcp+0x4c>)
  53799. 80161de: 68f8 ldr r0, [r7, #12]
  53800. 80161e0: f006 f82c bl 801c23c <tcp_err>
  53801. }
  53802. 80161e4: bf00 nop
  53803. 80161e6: 3710 adds r7, #16
  53804. 80161e8: 46bd mov sp, r7
  53805. 80161ea: bd80 pop {r7, pc}
  53806. 80161ec: 08015d55 .word 0x08015d55
  53807. 80161f0: 08015f49 .word 0x08015f49
  53808. 80161f4: 08015e79 .word 0x08015e79
  53809. 80161f8: 08015ff9 .word 0x08015ff9
  53810. 080161fc <pcb_new>:
  53811. *
  53812. * @param msg the api_msg describing the connection type
  53813. */
  53814. static void
  53815. pcb_new(struct api_msg *msg)
  53816. {
  53817. 80161fc: b590 push {r4, r7, lr}
  53818. 80161fe: b085 sub sp, #20
  53819. 8016200: af00 add r7, sp, #0
  53820. 8016202: 6078 str r0, [r7, #4]
  53821. enum lwip_ip_addr_type iptype = IPADDR_TYPE_V4;
  53822. 8016204: 2300 movs r3, #0
  53823. 8016206: 73fb strb r3, [r7, #15]
  53824. LWIP_ASSERT("pcb_new: pcb already allocated", msg->conn->pcb.tcp == NULL);
  53825. 8016208: 687b ldr r3, [r7, #4]
  53826. 801620a: 681b ldr r3, [r3, #0]
  53827. 801620c: 685b ldr r3, [r3, #4]
  53828. 801620e: 2b00 cmp r3, #0
  53829. 8016210: d006 beq.n 8016220 <pcb_new+0x24>
  53830. 8016212: 4b2b ldr r3, [pc, #172] @ (80162c0 <pcb_new+0xc4>)
  53831. 8016214: f240 2265 movw r2, #613 @ 0x265
  53832. 8016218: 492a ldr r1, [pc, #168] @ (80162c4 <pcb_new+0xc8>)
  53833. 801621a: 482b ldr r0, [pc, #172] @ (80162c8 <pcb_new+0xcc>)
  53834. 801621c: f013 fbd6 bl 80299cc <iprintf>
  53835. iptype = IPADDR_TYPE_ANY;
  53836. }
  53837. #endif
  53838. /* Allocate a PCB for this connection */
  53839. switch (NETCONNTYPE_GROUP(msg->conn->type)) {
  53840. 8016220: 687b ldr r3, [r7, #4]
  53841. 8016222: 681b ldr r3, [r3, #0]
  53842. 8016224: 781b ldrb r3, [r3, #0]
  53843. 8016226: f003 03f0 and.w r3, r3, #240 @ 0xf0
  53844. 801622a: 2b10 cmp r3, #16
  53845. 801622c: d022 beq.n 8016274 <pcb_new+0x78>
  53846. 801622e: 2b20 cmp r3, #32
  53847. 8016230: d133 bne.n 801629a <pcb_new+0x9e>
  53848. }
  53849. break;
  53850. #endif /* LWIP_RAW */
  53851. #if LWIP_UDP
  53852. case NETCONN_UDP:
  53853. msg->conn->pcb.udp = udp_new_ip_type(iptype);
  53854. 8016232: 687b ldr r3, [r7, #4]
  53855. 8016234: 681c ldr r4, [r3, #0]
  53856. 8016236: 7bfb ldrb r3, [r7, #15]
  53857. 8016238: 4618 mov r0, r3
  53858. 801623a: f00b fb94 bl 8021966 <udp_new_ip_type>
  53859. 801623e: 4603 mov r3, r0
  53860. 8016240: 6063 str r3, [r4, #4]
  53861. if (msg->conn->pcb.udp != NULL) {
  53862. 8016242: 687b ldr r3, [r7, #4]
  53863. 8016244: 681b ldr r3, [r3, #0]
  53864. 8016246: 685b ldr r3, [r3, #4]
  53865. 8016248: 2b00 cmp r3, #0
  53866. 801624a: d02a beq.n 80162a2 <pcb_new+0xa6>
  53867. #if LWIP_UDPLITE
  53868. if (NETCONNTYPE_ISUDPLITE(msg->conn->type)) {
  53869. udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE);
  53870. }
  53871. #endif /* LWIP_UDPLITE */
  53872. if (NETCONNTYPE_ISUDPNOCHKSUM(msg->conn->type)) {
  53873. 801624c: 687b ldr r3, [r7, #4]
  53874. 801624e: 681b ldr r3, [r3, #0]
  53875. 8016250: 781b ldrb r3, [r3, #0]
  53876. 8016252: 2b22 cmp r3, #34 @ 0x22
  53877. 8016254: d104 bne.n 8016260 <pcb_new+0x64>
  53878. udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
  53879. 8016256: 687b ldr r3, [r7, #4]
  53880. 8016258: 681b ldr r3, [r3, #0]
  53881. 801625a: 685b ldr r3, [r3, #4]
  53882. 801625c: 2201 movs r2, #1
  53883. 801625e: 741a strb r2, [r3, #16]
  53884. }
  53885. udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
  53886. 8016260: 687b ldr r3, [r7, #4]
  53887. 8016262: 681b ldr r3, [r3, #0]
  53888. 8016264: 6858 ldr r0, [r3, #4]
  53889. 8016266: 687b ldr r3, [r7, #4]
  53890. 8016268: 681b ldr r3, [r3, #0]
  53891. 801626a: 461a mov r2, r3
  53892. 801626c: 4917 ldr r1, [pc, #92] @ (80162cc <pcb_new+0xd0>)
  53893. 801626e: f00b fafb bl 8021868 <udp_recv>
  53894. }
  53895. break;
  53896. 8016272: e016 b.n 80162a2 <pcb_new+0xa6>
  53897. #endif /* LWIP_UDP */
  53898. #if LWIP_TCP
  53899. case NETCONN_TCP:
  53900. msg->conn->pcb.tcp = tcp_new_ip_type(iptype);
  53901. 8016274: 687b ldr r3, [r7, #4]
  53902. 8016276: 681c ldr r4, [r3, #0]
  53903. 8016278: 7bfb ldrb r3, [r7, #15]
  53904. 801627a: 4618 mov r0, r3
  53905. 801627c: f005 ff76 bl 801c16c <tcp_new_ip_type>
  53906. 8016280: 4603 mov r3, r0
  53907. 8016282: 6063 str r3, [r4, #4]
  53908. if (msg->conn->pcb.tcp != NULL) {
  53909. 8016284: 687b ldr r3, [r7, #4]
  53910. 8016286: 681b ldr r3, [r3, #0]
  53911. 8016288: 685b ldr r3, [r3, #4]
  53912. 801628a: 2b00 cmp r3, #0
  53913. 801628c: d00b beq.n 80162a6 <pcb_new+0xaa>
  53914. setup_tcp(msg->conn);
  53915. 801628e: 687b ldr r3, [r7, #4]
  53916. 8016290: 681b ldr r3, [r3, #0]
  53917. 8016292: 4618 mov r0, r3
  53918. 8016294: f7ff ff8a bl 80161ac <setup_tcp>
  53919. }
  53920. break;
  53921. 8016298: e005 b.n 80162a6 <pcb_new+0xaa>
  53922. #endif /* LWIP_TCP */
  53923. default:
  53924. /* Unsupported netconn type, e.g. protocol disabled */
  53925. msg->err = ERR_VAL;
  53926. 801629a: 687b ldr r3, [r7, #4]
  53927. 801629c: 22fa movs r2, #250 @ 0xfa
  53928. 801629e: 711a strb r2, [r3, #4]
  53929. return;
  53930. 80162a0: e00a b.n 80162b8 <pcb_new+0xbc>
  53931. break;
  53932. 80162a2: bf00 nop
  53933. 80162a4: e000 b.n 80162a8 <pcb_new+0xac>
  53934. break;
  53935. 80162a6: bf00 nop
  53936. }
  53937. if (msg->conn->pcb.ip == NULL) {
  53938. 80162a8: 687b ldr r3, [r7, #4]
  53939. 80162aa: 681b ldr r3, [r3, #0]
  53940. 80162ac: 685b ldr r3, [r3, #4]
  53941. 80162ae: 2b00 cmp r3, #0
  53942. 80162b0: d102 bne.n 80162b8 <pcb_new+0xbc>
  53943. msg->err = ERR_MEM;
  53944. 80162b2: 687b ldr r3, [r7, #4]
  53945. 80162b4: 22ff movs r2, #255 @ 0xff
  53946. 80162b6: 711a strb r2, [r3, #4]
  53947. }
  53948. }
  53949. 80162b8: 3714 adds r7, #20
  53950. 80162ba: 46bd mov sp, r7
  53951. 80162bc: bd90 pop {r4, r7, pc}
  53952. 80162be: bf00 nop
  53953. 80162c0: 0802cedc .word 0x0802cedc
  53954. 80162c4: 0802d0c0 .word 0x0802d0c0
  53955. 80162c8: 0802cf20 .word 0x0802cf20
  53956. 80162cc: 08015c1d .word 0x08015c1d
  53957. 080162d0 <lwip_netconn_do_newconn>:
  53958. *
  53959. * @param m the api_msg describing the connection type
  53960. */
  53961. void
  53962. lwip_netconn_do_newconn(void *m)
  53963. {
  53964. 80162d0: b580 push {r7, lr}
  53965. 80162d2: b084 sub sp, #16
  53966. 80162d4: af00 add r7, sp, #0
  53967. 80162d6: 6078 str r0, [r7, #4]
  53968. struct api_msg *msg = (struct api_msg *)m;
  53969. 80162d8: 687b ldr r3, [r7, #4]
  53970. 80162da: 60fb str r3, [r7, #12]
  53971. msg->err = ERR_OK;
  53972. 80162dc: 68fb ldr r3, [r7, #12]
  53973. 80162de: 2200 movs r2, #0
  53974. 80162e0: 711a strb r2, [r3, #4]
  53975. if (msg->conn->pcb.tcp == NULL) {
  53976. 80162e2: 68fb ldr r3, [r7, #12]
  53977. 80162e4: 681b ldr r3, [r3, #0]
  53978. 80162e6: 685b ldr r3, [r3, #4]
  53979. 80162e8: 2b00 cmp r3, #0
  53980. 80162ea: d102 bne.n 80162f2 <lwip_netconn_do_newconn+0x22>
  53981. pcb_new(msg);
  53982. 80162ec: 68f8 ldr r0, [r7, #12]
  53983. 80162ee: f7ff ff85 bl 80161fc <pcb_new>
  53984. /* Else? This "new" connection already has a PCB allocated. */
  53985. /* Is this an error condition? Should it be deleted? */
  53986. /* We currently just are happy and return. */
  53987. TCPIP_APIMSG_ACK(msg);
  53988. }
  53989. 80162f2: bf00 nop
  53990. 80162f4: 3710 adds r7, #16
  53991. 80162f6: 46bd mov sp, r7
  53992. 80162f8: bd80 pop {r7, pc}
  53993. ...
  53994. 080162fc <netconn_alloc>:
  53995. * @return a newly allocated struct netconn or
  53996. * NULL on memory error
  53997. */
  53998. struct netconn *
  53999. netconn_alloc(enum netconn_type t, netconn_callback callback)
  54000. {
  54001. 80162fc: b580 push {r7, lr}
  54002. 80162fe: b086 sub sp, #24
  54003. 8016300: af00 add r7, sp, #0
  54004. 8016302: 4603 mov r3, r0
  54005. 8016304: 6039 str r1, [r7, #0]
  54006. 8016306: 71fb strb r3, [r7, #7]
  54007. struct netconn *conn;
  54008. int size;
  54009. u8_t init_flags = 0;
  54010. 8016308: 2300 movs r3, #0
  54011. 801630a: 74fb strb r3, [r7, #19]
  54012. conn = (struct netconn *)memp_malloc(MEMP_NETCONN);
  54013. 801630c: 2007 movs r0, #7
  54014. 801630e: f003 f981 bl 8019614 <memp_malloc>
  54015. 8016312: 60f8 str r0, [r7, #12]
  54016. if (conn == NULL) {
  54017. 8016314: 68fb ldr r3, [r7, #12]
  54018. 8016316: 2b00 cmp r3, #0
  54019. 8016318: d101 bne.n 801631e <netconn_alloc+0x22>
  54020. return NULL;
  54021. 801631a: 2300 movs r3, #0
  54022. 801631c: e05c b.n 80163d8 <netconn_alloc+0xdc>
  54023. }
  54024. conn->pending_err = ERR_OK;
  54025. 801631e: 68fb ldr r3, [r7, #12]
  54026. 8016320: 2200 movs r2, #0
  54027. 8016322: 721a strb r2, [r3, #8]
  54028. conn->type = t;
  54029. 8016324: 68fb ldr r3, [r7, #12]
  54030. 8016326: 79fa ldrb r2, [r7, #7]
  54031. 8016328: 701a strb r2, [r3, #0]
  54032. conn->pcb.tcp = NULL;
  54033. 801632a: 68fb ldr r3, [r7, #12]
  54034. 801632c: 2200 movs r2, #0
  54035. 801632e: 605a str r2, [r3, #4]
  54036. /* If all sizes are the same, every compiler should optimize this switch to nothing */
  54037. switch (NETCONNTYPE_GROUP(t)) {
  54038. 8016330: 79fb ldrb r3, [r7, #7]
  54039. 8016332: f003 03f0 and.w r3, r3, #240 @ 0xf0
  54040. 8016336: 2b10 cmp r3, #16
  54041. 8016338: d004 beq.n 8016344 <netconn_alloc+0x48>
  54042. 801633a: 2b20 cmp r3, #32
  54043. 801633c: d105 bne.n 801634a <netconn_alloc+0x4e>
  54044. size = DEFAULT_RAW_RECVMBOX_SIZE;
  54045. break;
  54046. #endif /* LWIP_RAW */
  54047. #if LWIP_UDP
  54048. case NETCONN_UDP:
  54049. size = DEFAULT_UDP_RECVMBOX_SIZE;
  54050. 801633e: 2306 movs r3, #6
  54051. 8016340: 617b str r3, [r7, #20]
  54052. #if LWIP_NETBUF_RECVINFO
  54053. init_flags |= NETCONN_FLAG_PKTINFO;
  54054. #endif /* LWIP_NETBUF_RECVINFO */
  54055. break;
  54056. 8016342: e00a b.n 801635a <netconn_alloc+0x5e>
  54057. #endif /* LWIP_UDP */
  54058. #if LWIP_TCP
  54059. case NETCONN_TCP:
  54060. size = DEFAULT_TCP_RECVMBOX_SIZE;
  54061. 8016344: 2306 movs r3, #6
  54062. 8016346: 617b str r3, [r7, #20]
  54063. break;
  54064. 8016348: e007 b.n 801635a <netconn_alloc+0x5e>
  54065. #endif /* LWIP_TCP */
  54066. default:
  54067. LWIP_ASSERT("netconn_alloc: undefined netconn_type", 0);
  54068. 801634a: 4b25 ldr r3, [pc, #148] @ (80163e0 <netconn_alloc+0xe4>)
  54069. 801634c: f240 22e5 movw r2, #741 @ 0x2e5
  54070. 8016350: 4924 ldr r1, [pc, #144] @ (80163e4 <netconn_alloc+0xe8>)
  54071. 8016352: 4825 ldr r0, [pc, #148] @ (80163e8 <netconn_alloc+0xec>)
  54072. 8016354: f013 fb3a bl 80299cc <iprintf>
  54073. goto free_and_return;
  54074. 8016358: e039 b.n 80163ce <netconn_alloc+0xd2>
  54075. }
  54076. if (sys_mbox_new(&conn->recvmbox, size) != ERR_OK) {
  54077. 801635a: 68fb ldr r3, [r7, #12]
  54078. 801635c: 3310 adds r3, #16
  54079. 801635e: 6979 ldr r1, [r7, #20]
  54080. 8016360: 4618 mov r0, r3
  54081. 8016362: f00f ff05 bl 8026170 <sys_mbox_new>
  54082. 8016366: 4603 mov r3, r0
  54083. 8016368: 2b00 cmp r3, #0
  54084. 801636a: d12f bne.n 80163cc <netconn_alloc+0xd0>
  54085. goto free_and_return;
  54086. }
  54087. #if !LWIP_NETCONN_SEM_PER_THREAD
  54088. if (sys_sem_new(&conn->op_completed, 0) != ERR_OK) {
  54089. 801636c: 68fb ldr r3, [r7, #12]
  54090. 801636e: 330c adds r3, #12
  54091. 8016370: 2100 movs r1, #0
  54092. 8016372: 4618 mov r0, r3
  54093. 8016374: f00f ffa8 bl 80262c8 <sys_sem_new>
  54094. 8016378: 4603 mov r3, r0
  54095. 801637a: 2b00 cmp r3, #0
  54096. 801637c: d005 beq.n 801638a <netconn_alloc+0x8e>
  54097. sys_mbox_free(&conn->recvmbox);
  54098. 801637e: 68fb ldr r3, [r7, #12]
  54099. 8016380: 3310 adds r3, #16
  54100. 8016382: 4618 mov r0, r3
  54101. 8016384: f00f ff0e bl 80261a4 <sys_mbox_free>
  54102. goto free_and_return;
  54103. 8016388: e021 b.n 80163ce <netconn_alloc+0xd2>
  54104. }
  54105. #endif
  54106. #if LWIP_TCP
  54107. sys_mbox_set_invalid(&conn->acceptmbox);
  54108. 801638a: 68fb ldr r3, [r7, #12]
  54109. 801638c: 3314 adds r3, #20
  54110. 801638e: 4618 mov r0, r3
  54111. 8016390: f00f ff8d bl 80262ae <sys_mbox_set_invalid>
  54112. #endif
  54113. conn->state = NETCONN_NONE;
  54114. 8016394: 68fb ldr r3, [r7, #12]
  54115. 8016396: 2200 movs r2, #0
  54116. 8016398: 705a strb r2, [r3, #1]
  54117. #if LWIP_SOCKET
  54118. /* initialize socket to -1 since 0 is a valid socket */
  54119. conn->socket = -1;
  54120. 801639a: 68fb ldr r3, [r7, #12]
  54121. 801639c: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  54122. 80163a0: 619a str r2, [r3, #24]
  54123. #endif /* LWIP_SOCKET */
  54124. conn->callback = callback;
  54125. 80163a2: 68fb ldr r3, [r7, #12]
  54126. 80163a4: 683a ldr r2, [r7, #0]
  54127. 80163a6: 631a str r2, [r3, #48] @ 0x30
  54128. #if LWIP_TCP
  54129. conn->current_msg = NULL;
  54130. 80163a8: 68fb ldr r3, [r7, #12]
  54131. 80163aa: 2200 movs r2, #0
  54132. 80163ac: 62da str r2, [r3, #44] @ 0x2c
  54133. #endif /* LWIP_TCP */
  54134. #if LWIP_SO_SNDTIMEO
  54135. conn->send_timeout = 0;
  54136. #endif /* LWIP_SO_SNDTIMEO */
  54137. #if LWIP_SO_RCVTIMEO
  54138. conn->recv_timeout = 0;
  54139. 80163ae: 68fb ldr r3, [r7, #12]
  54140. 80163b0: 2200 movs r2, #0
  54141. 80163b2: 61da str r2, [r3, #28]
  54142. #endif /* LWIP_SO_RCVTIMEO */
  54143. #if LWIP_SO_RCVBUF
  54144. conn->recv_bufsize = RECV_BUFSIZE_DEFAULT;
  54145. 80163b4: 68fb ldr r3, [r7, #12]
  54146. 80163b6: 4a0d ldr r2, [pc, #52] @ (80163ec <netconn_alloc+0xf0>)
  54147. 80163b8: 621a str r2, [r3, #32]
  54148. conn->recv_avail = 0;
  54149. 80163ba: 68fb ldr r3, [r7, #12]
  54150. 80163bc: 2200 movs r2, #0
  54151. 80163be: 625a str r2, [r3, #36] @ 0x24
  54152. #endif /* LWIP_SO_RCVBUF */
  54153. #if LWIP_SO_LINGER
  54154. conn->linger = -1;
  54155. #endif /* LWIP_SO_LINGER */
  54156. conn->flags = init_flags;
  54157. 80163c0: 68fb ldr r3, [r7, #12]
  54158. 80163c2: 7cfa ldrb r2, [r7, #19]
  54159. 80163c4: f883 2028 strb.w r2, [r3, #40] @ 0x28
  54160. return conn;
  54161. 80163c8: 68fb ldr r3, [r7, #12]
  54162. 80163ca: e005 b.n 80163d8 <netconn_alloc+0xdc>
  54163. goto free_and_return;
  54164. 80163cc: bf00 nop
  54165. free_and_return:
  54166. memp_free(MEMP_NETCONN, conn);
  54167. 80163ce: 68f9 ldr r1, [r7, #12]
  54168. 80163d0: 2007 movs r0, #7
  54169. 80163d2: f003 f995 bl 8019700 <memp_free>
  54170. return NULL;
  54171. 80163d6: 2300 movs r3, #0
  54172. }
  54173. 80163d8: 4618 mov r0, r3
  54174. 80163da: 3718 adds r7, #24
  54175. 80163dc: 46bd mov sp, r7
  54176. 80163de: bd80 pop {r7, pc}
  54177. 80163e0: 0802cedc .word 0x0802cedc
  54178. 80163e4: 0802d0e0 .word 0x0802d0e0
  54179. 80163e8: 0802cf20 .word 0x0802cf20
  54180. 80163ec: 77359400 .word 0x77359400
  54181. 080163f0 <netconn_free>:
  54182. *
  54183. * @param conn the netconn to free
  54184. */
  54185. void
  54186. netconn_free(struct netconn *conn)
  54187. {
  54188. 80163f0: b580 push {r7, lr}
  54189. 80163f2: b082 sub sp, #8
  54190. 80163f4: af00 add r7, sp, #0
  54191. 80163f6: 6078 str r0, [r7, #4]
  54192. LWIP_ASSERT("PCB must be deallocated outside this function", conn->pcb.tcp == NULL);
  54193. 80163f8: 687b ldr r3, [r7, #4]
  54194. 80163fa: 685b ldr r3, [r3, #4]
  54195. 80163fc: 2b00 cmp r3, #0
  54196. 80163fe: d006 beq.n 801640e <netconn_free+0x1e>
  54197. 8016400: 4b1b ldr r3, [pc, #108] @ (8016470 <netconn_free+0x80>)
  54198. 8016402: f44f 7247 mov.w r2, #796 @ 0x31c
  54199. 8016406: 491b ldr r1, [pc, #108] @ (8016474 <netconn_free+0x84>)
  54200. 8016408: 481b ldr r0, [pc, #108] @ (8016478 <netconn_free+0x88>)
  54201. 801640a: f013 fadf bl 80299cc <iprintf>
  54202. #if LWIP_NETCONN_FULLDUPLEX
  54203. /* in fullduplex, netconn is drained here */
  54204. netconn_drain(conn);
  54205. #endif /* LWIP_NETCONN_FULLDUPLEX */
  54206. LWIP_ASSERT("recvmbox must be deallocated before calling this function",
  54207. 801640e: 687b ldr r3, [r7, #4]
  54208. 8016410: 3310 adds r3, #16
  54209. 8016412: 4618 mov r0, r3
  54210. 8016414: f00f ff3a bl 802628c <sys_mbox_valid>
  54211. 8016418: 4603 mov r3, r0
  54212. 801641a: 2b00 cmp r3, #0
  54213. 801641c: d006 beq.n 801642c <netconn_free+0x3c>
  54214. 801641e: 4b14 ldr r3, [pc, #80] @ (8016470 <netconn_free+0x80>)
  54215. 8016420: f240 3223 movw r2, #803 @ 0x323
  54216. 8016424: 4915 ldr r1, [pc, #84] @ (801647c <netconn_free+0x8c>)
  54217. 8016426: 4814 ldr r0, [pc, #80] @ (8016478 <netconn_free+0x88>)
  54218. 8016428: f013 fad0 bl 80299cc <iprintf>
  54219. !sys_mbox_valid(&conn->recvmbox));
  54220. #if LWIP_TCP
  54221. LWIP_ASSERT("acceptmbox must be deallocated before calling this function",
  54222. 801642c: 687b ldr r3, [r7, #4]
  54223. 801642e: 3314 adds r3, #20
  54224. 8016430: 4618 mov r0, r3
  54225. 8016432: f00f ff2b bl 802628c <sys_mbox_valid>
  54226. 8016436: 4603 mov r3, r0
  54227. 8016438: 2b00 cmp r3, #0
  54228. 801643a: d006 beq.n 801644a <netconn_free+0x5a>
  54229. 801643c: 4b0c ldr r3, [pc, #48] @ (8016470 <netconn_free+0x80>)
  54230. 801643e: f240 3226 movw r2, #806 @ 0x326
  54231. 8016442: 490f ldr r1, [pc, #60] @ (8016480 <netconn_free+0x90>)
  54232. 8016444: 480c ldr r0, [pc, #48] @ (8016478 <netconn_free+0x88>)
  54233. 8016446: f013 fac1 bl 80299cc <iprintf>
  54234. !sys_mbox_valid(&conn->acceptmbox));
  54235. #endif /* LWIP_TCP */
  54236. #if !LWIP_NETCONN_SEM_PER_THREAD
  54237. sys_sem_free(&conn->op_completed);
  54238. 801644a: 687b ldr r3, [r7, #4]
  54239. 801644c: 330c adds r3, #12
  54240. 801644e: 4618 mov r0, r3
  54241. 8016450: f00f ff9d bl 802638e <sys_sem_free>
  54242. sys_sem_set_invalid(&conn->op_completed);
  54243. 8016454: 687b ldr r3, [r7, #4]
  54244. 8016456: 330c adds r3, #12
  54245. 8016458: 4618 mov r0, r3
  54246. 801645a: f00f ffb6 bl 80263ca <sys_sem_set_invalid>
  54247. #endif
  54248. memp_free(MEMP_NETCONN, conn);
  54249. 801645e: 6879 ldr r1, [r7, #4]
  54250. 8016460: 2007 movs r0, #7
  54251. 8016462: f003 f94d bl 8019700 <memp_free>
  54252. }
  54253. 8016466: bf00 nop
  54254. 8016468: 3708 adds r7, #8
  54255. 801646a: 46bd mov sp, r7
  54256. 801646c: bd80 pop {r7, pc}
  54257. 801646e: bf00 nop
  54258. 8016470: 0802cedc .word 0x0802cedc
  54259. 8016474: 0802d108 .word 0x0802d108
  54260. 8016478: 0802cf20 .word 0x0802cf20
  54261. 801647c: 0802d138 .word 0x0802d138
  54262. 8016480: 0802d174 .word 0x0802d174
  54263. 08016484 <netconn_drain>:
  54264. * @bytes_drained bytes drained from recvmbox
  54265. * @accepts_drained pending connections drained from acceptmbox
  54266. */
  54267. static void
  54268. netconn_drain(struct netconn *conn)
  54269. {
  54270. 8016484: b580 push {r7, lr}
  54271. 8016486: b086 sub sp, #24
  54272. 8016488: af00 add r7, sp, #0
  54273. 801648a: 6078 str r0, [r7, #4]
  54274. #if LWIP_NETCONN_FULLDUPLEX
  54275. LWIP_ASSERT("netconn marked closed", conn->flags & NETCONN_FLAG_MBOXINVALID);
  54276. #endif /* LWIP_NETCONN_FULLDUPLEX */
  54277. /* Delete and drain the recvmbox. */
  54278. if (sys_mbox_valid(&conn->recvmbox)) {
  54279. 801648c: 687b ldr r3, [r7, #4]
  54280. 801648e: 3310 adds r3, #16
  54281. 8016490: 4618 mov r0, r3
  54282. 8016492: f00f fefb bl 802628c <sys_mbox_valid>
  54283. 8016496: 4603 mov r3, r0
  54284. 8016498: 2b00 cmp r3, #0
  54285. 801649a: d02f beq.n 80164fc <netconn_drain+0x78>
  54286. while (sys_mbox_tryfetch(&conn->recvmbox, &mem) != SYS_MBOX_EMPTY) {
  54287. 801649c: e018 b.n 80164d0 <netconn_drain+0x4c>
  54288. #if LWIP_NETCONN_FULLDUPLEX
  54289. if (!lwip_netconn_is_deallocated_msg(mem))
  54290. #endif /* LWIP_NETCONN_FULLDUPLEX */
  54291. {
  54292. #if LWIP_TCP
  54293. if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) {
  54294. 801649e: 687b ldr r3, [r7, #4]
  54295. 80164a0: 781b ldrb r3, [r3, #0]
  54296. 80164a2: f003 03f0 and.w r3, r3, #240 @ 0xf0
  54297. 80164a6: 2b10 cmp r3, #16
  54298. 80164a8: d10e bne.n 80164c8 <netconn_drain+0x44>
  54299. err_t err;
  54300. if (!lwip_netconn_is_err_msg(mem, &err)) {
  54301. 80164aa: 693b ldr r3, [r7, #16]
  54302. 80164ac: f107 020f add.w r2, r7, #15
  54303. 80164b0: 4611 mov r1, r2
  54304. 80164b2: 4618 mov r0, r3
  54305. 80164b4: f7ff fb78 bl 8015ba8 <lwip_netconn_is_err_msg>
  54306. 80164b8: 4603 mov r3, r0
  54307. 80164ba: 2b00 cmp r3, #0
  54308. 80164bc: d108 bne.n 80164d0 <netconn_drain+0x4c>
  54309. pbuf_free((struct pbuf *)mem);
  54310. 80164be: 693b ldr r3, [r7, #16]
  54311. 80164c0: 4618 mov r0, r3
  54312. 80164c2: f004 f80b bl 801a4dc <pbuf_free>
  54313. 80164c6: e003 b.n 80164d0 <netconn_drain+0x4c>
  54314. }
  54315. } else
  54316. #endif /* LWIP_TCP */
  54317. {
  54318. netbuf_delete((struct netbuf *)mem);
  54319. 80164c8: 693b ldr r3, [r7, #16]
  54320. 80164ca: 4618 mov r0, r3
  54321. 80164cc: f001 f81c bl 8017508 <netbuf_delete>
  54322. while (sys_mbox_tryfetch(&conn->recvmbox, &mem) != SYS_MBOX_EMPTY) {
  54323. 80164d0: 687b ldr r3, [r7, #4]
  54324. 80164d2: 3310 adds r3, #16
  54325. 80164d4: f107 0210 add.w r2, r7, #16
  54326. 80164d8: 4611 mov r1, r2
  54327. 80164da: 4618 mov r0, r3
  54328. 80164dc: f00f febf bl 802625e <sys_arch_mbox_tryfetch>
  54329. 80164e0: 4603 mov r3, r0
  54330. 80164e2: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  54331. 80164e6: d1da bne.n 801649e <netconn_drain+0x1a>
  54332. }
  54333. }
  54334. }
  54335. sys_mbox_free(&conn->recvmbox);
  54336. 80164e8: 687b ldr r3, [r7, #4]
  54337. 80164ea: 3310 adds r3, #16
  54338. 80164ec: 4618 mov r0, r3
  54339. 80164ee: f00f fe59 bl 80261a4 <sys_mbox_free>
  54340. sys_mbox_set_invalid(&conn->recvmbox);
  54341. 80164f2: 687b ldr r3, [r7, #4]
  54342. 80164f4: 3310 adds r3, #16
  54343. 80164f6: 4618 mov r0, r3
  54344. 80164f8: f00f fed9 bl 80262ae <sys_mbox_set_invalid>
  54345. }
  54346. /* Delete and drain the acceptmbox. */
  54347. #if LWIP_TCP
  54348. if (sys_mbox_valid(&conn->acceptmbox)) {
  54349. 80164fc: 687b ldr r3, [r7, #4]
  54350. 80164fe: 3314 adds r3, #20
  54351. 8016500: 4618 mov r0, r3
  54352. 8016502: f00f fec3 bl 802628c <sys_mbox_valid>
  54353. 8016506: 4603 mov r3, r0
  54354. 8016508: 2b00 cmp r3, #0
  54355. 801650a: d034 beq.n 8016576 <netconn_drain+0xf2>
  54356. while (sys_mbox_tryfetch(&conn->acceptmbox, &mem) != SYS_MBOX_EMPTY) {
  54357. 801650c: e01d b.n 801654a <netconn_drain+0xc6>
  54358. #if LWIP_NETCONN_FULLDUPLEX
  54359. if (!lwip_netconn_is_deallocated_msg(mem))
  54360. #endif /* LWIP_NETCONN_FULLDUPLEX */
  54361. {
  54362. err_t err;
  54363. if (!lwip_netconn_is_err_msg(mem, &err)) {
  54364. 801650e: 693b ldr r3, [r7, #16]
  54365. 8016510: f107 020e add.w r2, r7, #14
  54366. 8016514: 4611 mov r1, r2
  54367. 8016516: 4618 mov r0, r3
  54368. 8016518: f7ff fb46 bl 8015ba8 <lwip_netconn_is_err_msg>
  54369. 801651c: 4603 mov r3, r0
  54370. 801651e: 2b00 cmp r3, #0
  54371. 8016520: d113 bne.n 801654a <netconn_drain+0xc6>
  54372. struct netconn *newconn = (struct netconn *)mem;
  54373. 8016522: 693b ldr r3, [r7, #16]
  54374. 8016524: 617b str r3, [r7, #20]
  54375. /* Only tcp pcbs have an acceptmbox, so no need to check conn->type */
  54376. /* pcb might be set to NULL already by err_tcp() */
  54377. /* drain recvmbox */
  54378. netconn_drain(newconn);
  54379. 8016526: 6978 ldr r0, [r7, #20]
  54380. 8016528: f7ff ffac bl 8016484 <netconn_drain>
  54381. if (newconn->pcb.tcp != NULL) {
  54382. 801652c: 697b ldr r3, [r7, #20]
  54383. 801652e: 685b ldr r3, [r3, #4]
  54384. 8016530: 2b00 cmp r3, #0
  54385. 8016532: d007 beq.n 8016544 <netconn_drain+0xc0>
  54386. tcp_abort(newconn->pcb.tcp);
  54387. 8016534: 697b ldr r3, [r7, #20]
  54388. 8016536: 685b ldr r3, [r3, #4]
  54389. 8016538: 4618 mov r0, r3
  54390. 801653a: f004 fdd5 bl 801b0e8 <tcp_abort>
  54391. newconn->pcb.tcp = NULL;
  54392. 801653e: 697b ldr r3, [r7, #20]
  54393. 8016540: 2200 movs r2, #0
  54394. 8016542: 605a str r2, [r3, #4]
  54395. }
  54396. netconn_free(newconn);
  54397. 8016544: 6978 ldr r0, [r7, #20]
  54398. 8016546: f7ff ff53 bl 80163f0 <netconn_free>
  54399. while (sys_mbox_tryfetch(&conn->acceptmbox, &mem) != SYS_MBOX_EMPTY) {
  54400. 801654a: 687b ldr r3, [r7, #4]
  54401. 801654c: 3314 adds r3, #20
  54402. 801654e: f107 0210 add.w r2, r7, #16
  54403. 8016552: 4611 mov r1, r2
  54404. 8016554: 4618 mov r0, r3
  54405. 8016556: f00f fe82 bl 802625e <sys_arch_mbox_tryfetch>
  54406. 801655a: 4603 mov r3, r0
  54407. 801655c: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  54408. 8016560: d1d5 bne.n 801650e <netconn_drain+0x8a>
  54409. }
  54410. }
  54411. }
  54412. sys_mbox_free(&conn->acceptmbox);
  54413. 8016562: 687b ldr r3, [r7, #4]
  54414. 8016564: 3314 adds r3, #20
  54415. 8016566: 4618 mov r0, r3
  54416. 8016568: f00f fe1c bl 80261a4 <sys_mbox_free>
  54417. sys_mbox_set_invalid(&conn->acceptmbox);
  54418. 801656c: 687b ldr r3, [r7, #4]
  54419. 801656e: 3314 adds r3, #20
  54420. 8016570: 4618 mov r0, r3
  54421. 8016572: f00f fe9c bl 80262ae <sys_mbox_set_invalid>
  54422. }
  54423. #endif /* LWIP_TCP */
  54424. }
  54425. 8016576: bf00 nop
  54426. 8016578: 3718 adds r7, #24
  54427. 801657a: 46bd mov sp, r7
  54428. 801657c: bd80 pop {r7, pc}
  54429. ...
  54430. 08016580 <lwip_netconn_do_close_internal>:
  54431. *
  54432. * @param conn the TCP netconn to close
  54433. */
  54434. static err_t
  54435. lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM)
  54436. {
  54437. 8016580: b580 push {r7, lr}
  54438. 8016582: b086 sub sp, #24
  54439. 8016584: af00 add r7, sp, #0
  54440. 8016586: 6078 str r0, [r7, #4]
  54441. 8016588: 460b mov r3, r1
  54442. 801658a: 70fb strb r3, [r7, #3]
  54443. err_t err;
  54444. u8_t shut, shut_rx, shut_tx, shut_close;
  54445. u8_t close_finished = 0;
  54446. 801658c: 2300 movs r3, #0
  54447. 801658e: 757b strb r3, [r7, #21]
  54448. struct tcp_pcb *tpcb;
  54449. #if LWIP_SO_LINGER
  54450. u8_t linger_wait_required = 0;
  54451. #endif /* LWIP_SO_LINGER */
  54452. LWIP_ASSERT("invalid conn", (conn != NULL));
  54453. 8016590: 687b ldr r3, [r7, #4]
  54454. 8016592: 2b00 cmp r3, #0
  54455. 8016594: d106 bne.n 80165a4 <lwip_netconn_do_close_internal+0x24>
  54456. 8016596: 4b87 ldr r3, [pc, #540] @ (80167b4 <lwip_netconn_do_close_internal+0x234>)
  54457. 8016598: f240 32a2 movw r2, #930 @ 0x3a2
  54458. 801659c: 4986 ldr r1, [pc, #536] @ (80167b8 <lwip_netconn_do_close_internal+0x238>)
  54459. 801659e: 4887 ldr r0, [pc, #540] @ (80167bc <lwip_netconn_do_close_internal+0x23c>)
  54460. 80165a0: f013 fa14 bl 80299cc <iprintf>
  54461. LWIP_ASSERT("this is for tcp netconns only", (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP));
  54462. 80165a4: 687b ldr r3, [r7, #4]
  54463. 80165a6: 781b ldrb r3, [r3, #0]
  54464. 80165a8: f003 03f0 and.w r3, r3, #240 @ 0xf0
  54465. 80165ac: 2b10 cmp r3, #16
  54466. 80165ae: d006 beq.n 80165be <lwip_netconn_do_close_internal+0x3e>
  54467. 80165b0: 4b80 ldr r3, [pc, #512] @ (80167b4 <lwip_netconn_do_close_internal+0x234>)
  54468. 80165b2: f240 32a3 movw r2, #931 @ 0x3a3
  54469. 80165b6: 4982 ldr r1, [pc, #520] @ (80167c0 <lwip_netconn_do_close_internal+0x240>)
  54470. 80165b8: 4880 ldr r0, [pc, #512] @ (80167bc <lwip_netconn_do_close_internal+0x23c>)
  54471. 80165ba: f013 fa07 bl 80299cc <iprintf>
  54472. LWIP_ASSERT("conn must be in state NETCONN_CLOSE", (conn->state == NETCONN_CLOSE));
  54473. 80165be: 687b ldr r3, [r7, #4]
  54474. 80165c0: 785b ldrb r3, [r3, #1]
  54475. 80165c2: 2b04 cmp r3, #4
  54476. 80165c4: d006 beq.n 80165d4 <lwip_netconn_do_close_internal+0x54>
  54477. 80165c6: 4b7b ldr r3, [pc, #492] @ (80167b4 <lwip_netconn_do_close_internal+0x234>)
  54478. 80165c8: f44f 7269 mov.w r2, #932 @ 0x3a4
  54479. 80165cc: 497d ldr r1, [pc, #500] @ (80167c4 <lwip_netconn_do_close_internal+0x244>)
  54480. 80165ce: 487b ldr r0, [pc, #492] @ (80167bc <lwip_netconn_do_close_internal+0x23c>)
  54481. 80165d0: f013 f9fc bl 80299cc <iprintf>
  54482. LWIP_ASSERT("pcb already closed", (conn->pcb.tcp != NULL));
  54483. 80165d4: 687b ldr r3, [r7, #4]
  54484. 80165d6: 685b ldr r3, [r3, #4]
  54485. 80165d8: 2b00 cmp r3, #0
  54486. 80165da: d106 bne.n 80165ea <lwip_netconn_do_close_internal+0x6a>
  54487. 80165dc: 4b75 ldr r3, [pc, #468] @ (80167b4 <lwip_netconn_do_close_internal+0x234>)
  54488. 80165de: f240 32a5 movw r2, #933 @ 0x3a5
  54489. 80165e2: 4979 ldr r1, [pc, #484] @ (80167c8 <lwip_netconn_do_close_internal+0x248>)
  54490. 80165e4: 4875 ldr r0, [pc, #468] @ (80167bc <lwip_netconn_do_close_internal+0x23c>)
  54491. 80165e6: f013 f9f1 bl 80299cc <iprintf>
  54492. LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL);
  54493. 80165ea: 687b ldr r3, [r7, #4]
  54494. 80165ec: 6adb ldr r3, [r3, #44] @ 0x2c
  54495. 80165ee: 2b00 cmp r3, #0
  54496. 80165f0: d106 bne.n 8016600 <lwip_netconn_do_close_internal+0x80>
  54497. 80165f2: 4b70 ldr r3, [pc, #448] @ (80167b4 <lwip_netconn_do_close_internal+0x234>)
  54498. 80165f4: f240 32a6 movw r2, #934 @ 0x3a6
  54499. 80165f8: 4974 ldr r1, [pc, #464] @ (80167cc <lwip_netconn_do_close_internal+0x24c>)
  54500. 80165fa: 4870 ldr r0, [pc, #448] @ (80167bc <lwip_netconn_do_close_internal+0x23c>)
  54501. 80165fc: f013 f9e6 bl 80299cc <iprintf>
  54502. tpcb = conn->pcb.tcp;
  54503. 8016600: 687b ldr r3, [r7, #4]
  54504. 8016602: 685b ldr r3, [r3, #4]
  54505. 8016604: 613b str r3, [r7, #16]
  54506. shut = conn->current_msg->msg.sd.shut;
  54507. 8016606: 687b ldr r3, [r7, #4]
  54508. 8016608: 6adb ldr r3, [r3, #44] @ 0x2c
  54509. 801660a: 7a1b ldrb r3, [r3, #8]
  54510. 801660c: 73fb strb r3, [r7, #15]
  54511. shut_rx = shut & NETCONN_SHUT_RD;
  54512. 801660e: 7bfb ldrb r3, [r7, #15]
  54513. 8016610: f003 0301 and.w r3, r3, #1
  54514. 8016614: 73bb strb r3, [r7, #14]
  54515. shut_tx = shut & NETCONN_SHUT_WR;
  54516. 8016616: 7bfb ldrb r3, [r7, #15]
  54517. 8016618: f003 0302 and.w r3, r3, #2
  54518. 801661c: 737b strb r3, [r7, #13]
  54519. /* shutting down both ends is the same as closing
  54520. (also if RD or WR side was shut down before already) */
  54521. if (shut == NETCONN_SHUT_RDWR) {
  54522. 801661e: 7bfb ldrb r3, [r7, #15]
  54523. 8016620: 2b03 cmp r3, #3
  54524. 8016622: d102 bne.n 801662a <lwip_netconn_do_close_internal+0xaa>
  54525. shut_close = 1;
  54526. 8016624: 2301 movs r3, #1
  54527. 8016626: 75bb strb r3, [r7, #22]
  54528. 8016628: e01f b.n 801666a <lwip_netconn_do_close_internal+0xea>
  54529. } else if (shut_rx &&
  54530. 801662a: 7bbb ldrb r3, [r7, #14]
  54531. 801662c: 2b00 cmp r3, #0
  54532. 801662e: d00e beq.n 801664e <lwip_netconn_do_close_internal+0xce>
  54533. ((tpcb->state == FIN_WAIT_1) ||
  54534. 8016630: 693b ldr r3, [r7, #16]
  54535. 8016632: 7d1b ldrb r3, [r3, #20]
  54536. } else if (shut_rx &&
  54537. 8016634: 2b05 cmp r3, #5
  54538. 8016636: d007 beq.n 8016648 <lwip_netconn_do_close_internal+0xc8>
  54539. (tpcb->state == FIN_WAIT_2) ||
  54540. 8016638: 693b ldr r3, [r7, #16]
  54541. 801663a: 7d1b ldrb r3, [r3, #20]
  54542. ((tpcb->state == FIN_WAIT_1) ||
  54543. 801663c: 2b06 cmp r3, #6
  54544. 801663e: d003 beq.n 8016648 <lwip_netconn_do_close_internal+0xc8>
  54545. (tpcb->state == CLOSING))) {
  54546. 8016640: 693b ldr r3, [r7, #16]
  54547. 8016642: 7d1b ldrb r3, [r3, #20]
  54548. (tpcb->state == FIN_WAIT_2) ||
  54549. 8016644: 2b08 cmp r3, #8
  54550. 8016646: d102 bne.n 801664e <lwip_netconn_do_close_internal+0xce>
  54551. shut_close = 1;
  54552. 8016648: 2301 movs r3, #1
  54553. 801664a: 75bb strb r3, [r7, #22]
  54554. 801664c: e00d b.n 801666a <lwip_netconn_do_close_internal+0xea>
  54555. } else if (shut_tx && ((tpcb->flags & TF_RXCLOSED) != 0)) {
  54556. 801664e: 7b7b ldrb r3, [r7, #13]
  54557. 8016650: 2b00 cmp r3, #0
  54558. 8016652: d008 beq.n 8016666 <lwip_netconn_do_close_internal+0xe6>
  54559. 8016654: 693b ldr r3, [r7, #16]
  54560. 8016656: 8b5b ldrh r3, [r3, #26]
  54561. 8016658: f003 0310 and.w r3, r3, #16
  54562. 801665c: 2b00 cmp r3, #0
  54563. 801665e: d002 beq.n 8016666 <lwip_netconn_do_close_internal+0xe6>
  54564. shut_close = 1;
  54565. 8016660: 2301 movs r3, #1
  54566. 8016662: 75bb strb r3, [r7, #22]
  54567. 8016664: e001 b.n 801666a <lwip_netconn_do_close_internal+0xea>
  54568. } else {
  54569. shut_close = 0;
  54570. 8016666: 2300 movs r3, #0
  54571. 8016668: 75bb strb r3, [r7, #22]
  54572. }
  54573. /* Set back some callback pointers */
  54574. if (shut_close) {
  54575. 801666a: 7dbb ldrb r3, [r7, #22]
  54576. 801666c: 2b00 cmp r3, #0
  54577. 801666e: d003 beq.n 8016678 <lwip_netconn_do_close_internal+0xf8>
  54578. tcp_arg(tpcb, NULL);
  54579. 8016670: 2100 movs r1, #0
  54580. 8016672: 6938 ldr r0, [r7, #16]
  54581. 8016674: f005 fd88 bl 801c188 <tcp_arg>
  54582. }
  54583. if (tpcb->state == LISTEN) {
  54584. 8016678: 693b ldr r3, [r7, #16]
  54585. 801667a: 7d1b ldrb r3, [r3, #20]
  54586. 801667c: 2b01 cmp r3, #1
  54587. 801667e: d104 bne.n 801668a <lwip_netconn_do_close_internal+0x10a>
  54588. tcp_accept(tpcb, NULL);
  54589. 8016680: 2100 movs r1, #0
  54590. 8016682: 6938 ldr r0, [r7, #16]
  54591. 8016684: f005 fdfe bl 801c284 <tcp_accept>
  54592. 8016688: e01d b.n 80166c6 <lwip_netconn_do_close_internal+0x146>
  54593. } else {
  54594. /* some callbacks have to be reset if tcp_close is not successful */
  54595. if (shut_rx) {
  54596. 801668a: 7bbb ldrb r3, [r7, #14]
  54597. 801668c: 2b00 cmp r3, #0
  54598. 801668e: d007 beq.n 80166a0 <lwip_netconn_do_close_internal+0x120>
  54599. tcp_recv(tpcb, NULL);
  54600. 8016690: 2100 movs r1, #0
  54601. 8016692: 6938 ldr r0, [r7, #16]
  54602. 8016694: f005 fd8a bl 801c1ac <tcp_recv>
  54603. tcp_accept(tpcb, NULL);
  54604. 8016698: 2100 movs r1, #0
  54605. 801669a: 6938 ldr r0, [r7, #16]
  54606. 801669c: f005 fdf2 bl 801c284 <tcp_accept>
  54607. }
  54608. if (shut_tx) {
  54609. 80166a0: 7b7b ldrb r3, [r7, #13]
  54610. 80166a2: 2b00 cmp r3, #0
  54611. 80166a4: d003 beq.n 80166ae <lwip_netconn_do_close_internal+0x12e>
  54612. tcp_sent(tpcb, NULL);
  54613. 80166a6: 2100 movs r1, #0
  54614. 80166a8: 6938 ldr r0, [r7, #16]
  54615. 80166aa: f005 fda3 bl 801c1f4 <tcp_sent>
  54616. }
  54617. if (shut_close) {
  54618. 80166ae: 7dbb ldrb r3, [r7, #22]
  54619. 80166b0: 2b00 cmp r3, #0
  54620. 80166b2: d008 beq.n 80166c6 <lwip_netconn_do_close_internal+0x146>
  54621. tcp_poll(tpcb, NULL, 0);
  54622. 80166b4: 2200 movs r2, #0
  54623. 80166b6: 2100 movs r1, #0
  54624. 80166b8: 6938 ldr r0, [r7, #16]
  54625. 80166ba: f005 fdfb bl 801c2b4 <tcp_poll>
  54626. tcp_err(tpcb, NULL);
  54627. 80166be: 2100 movs r1, #0
  54628. 80166c0: 6938 ldr r0, [r7, #16]
  54629. 80166c2: f005 fdbb bl 801c23c <tcp_err>
  54630. }
  54631. }
  54632. /* Try to close the connection */
  54633. if (shut_close) {
  54634. 80166c6: 7dbb ldrb r3, [r7, #22]
  54635. 80166c8: 2b00 cmp r3, #0
  54636. 80166ca: d005 beq.n 80166d8 <lwip_netconn_do_close_internal+0x158>
  54637. }
  54638. }
  54639. if ((err == ERR_OK) && (tpcb != NULL))
  54640. #endif /* LWIP_SO_LINGER */
  54641. {
  54642. err = tcp_close(tpcb);
  54643. 80166cc: 6938 ldr r0, [r7, #16]
  54644. 80166ce: f004 fbbf bl 801ae50 <tcp_close>
  54645. 80166d2: 4603 mov r3, r0
  54646. 80166d4: 75fb strb r3, [r7, #23]
  54647. 80166d6: e007 b.n 80166e8 <lwip_netconn_do_close_internal+0x168>
  54648. }
  54649. } else {
  54650. err = tcp_shutdown(tpcb, shut_rx, shut_tx);
  54651. 80166d8: 7bbb ldrb r3, [r7, #14]
  54652. 80166da: 7b7a ldrb r2, [r7, #13]
  54653. 80166dc: 4619 mov r1, r3
  54654. 80166de: 6938 ldr r0, [r7, #16]
  54655. 80166e0: f004 fbe4 bl 801aeac <tcp_shutdown>
  54656. 80166e4: 4603 mov r3, r0
  54657. 80166e6: 75fb strb r3, [r7, #23]
  54658. }
  54659. if (err == ERR_OK) {
  54660. 80166e8: f997 3017 ldrsb.w r3, [r7, #23]
  54661. 80166ec: 2b00 cmp r3, #0
  54662. 80166ee: d102 bne.n 80166f6 <lwip_netconn_do_close_internal+0x176>
  54663. close_finished = 1;
  54664. 80166f0: 2301 movs r3, #1
  54665. 80166f2: 757b strb r3, [r7, #21]
  54666. 80166f4: e016 b.n 8016724 <lwip_netconn_do_close_internal+0x1a4>
  54667. close_finished = 0;
  54668. err = ERR_INPROGRESS;
  54669. }
  54670. #endif /* LWIP_SO_LINGER */
  54671. } else {
  54672. if (err == ERR_MEM) {
  54673. 80166f6: f997 3017 ldrsb.w r3, [r7, #23]
  54674. 80166fa: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  54675. 80166fe: d10f bne.n 8016720 <lwip_netconn_do_close_internal+0x1a0>
  54676. close_timeout = conn->linger * 1000U;
  54677. }
  54678. #endif
  54679. if ((s32_t)(sys_now() - conn->current_msg->msg.sd.time_started) >= close_timeout) {
  54680. #else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
  54681. if (conn->current_msg->msg.sd.polls_left == 0) {
  54682. 8016700: 687b ldr r3, [r7, #4]
  54683. 8016702: 6adb ldr r3, [r3, #44] @ 0x2c
  54684. 8016704: 7a5b ldrb r3, [r3, #9]
  54685. 8016706: 2b00 cmp r3, #0
  54686. 8016708: d10c bne.n 8016724 <lwip_netconn_do_close_internal+0x1a4>
  54687. #endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
  54688. close_finished = 1;
  54689. 801670a: 2301 movs r3, #1
  54690. 801670c: 757b strb r3, [r7, #21]
  54691. if (shut_close) {
  54692. 801670e: 7dbb ldrb r3, [r7, #22]
  54693. 8016710: 2b00 cmp r3, #0
  54694. 8016712: d007 beq.n 8016724 <lwip_netconn_do_close_internal+0x1a4>
  54695. /* in this case, we want to RST the connection */
  54696. tcp_abort(tpcb);
  54697. 8016714: 6938 ldr r0, [r7, #16]
  54698. 8016716: f004 fce7 bl 801b0e8 <tcp_abort>
  54699. err = ERR_OK;
  54700. 801671a: 2300 movs r3, #0
  54701. 801671c: 75fb strb r3, [r7, #23]
  54702. 801671e: e001 b.n 8016724 <lwip_netconn_do_close_internal+0x1a4>
  54703. }
  54704. }
  54705. } else {
  54706. /* Closing failed for a non-memory error: give up */
  54707. close_finished = 1;
  54708. 8016720: 2301 movs r3, #1
  54709. 8016722: 757b strb r3, [r7, #21]
  54710. }
  54711. }
  54712. if (close_finished) {
  54713. 8016724: 7d7b ldrb r3, [r7, #21]
  54714. 8016726: 2b00 cmp r3, #0
  54715. 8016728: d052 beq.n 80167d0 <lwip_netconn_do_close_internal+0x250>
  54716. /* Closing done (succeeded, non-memory error, nonblocking error or timeout) */
  54717. sys_sem_t *op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
  54718. 801672a: 687b ldr r3, [r7, #4]
  54719. 801672c: 6adb ldr r3, [r3, #44] @ 0x2c
  54720. 801672e: 681b ldr r3, [r3, #0]
  54721. 8016730: 330c adds r3, #12
  54722. 8016732: 60bb str r3, [r7, #8]
  54723. conn->current_msg->err = err;
  54724. 8016734: 687b ldr r3, [r7, #4]
  54725. 8016736: 6adb ldr r3, [r3, #44] @ 0x2c
  54726. 8016738: 7dfa ldrb r2, [r7, #23]
  54727. 801673a: 711a strb r2, [r3, #4]
  54728. conn->current_msg = NULL;
  54729. 801673c: 687b ldr r3, [r7, #4]
  54730. 801673e: 2200 movs r2, #0
  54731. 8016740: 62da str r2, [r3, #44] @ 0x2c
  54732. conn->state = NETCONN_NONE;
  54733. 8016742: 687b ldr r3, [r7, #4]
  54734. 8016744: 2200 movs r2, #0
  54735. 8016746: 705a strb r2, [r3, #1]
  54736. if (err == ERR_OK) {
  54737. 8016748: f997 3017 ldrsb.w r3, [r7, #23]
  54738. 801674c: 2b00 cmp r3, #0
  54739. 801674e: d129 bne.n 80167a4 <lwip_netconn_do_close_internal+0x224>
  54740. if (shut_close) {
  54741. 8016750: 7dbb ldrb r3, [r7, #22]
  54742. 8016752: 2b00 cmp r3, #0
  54743. 8016754: d00c beq.n 8016770 <lwip_netconn_do_close_internal+0x1f0>
  54744. /* Set back some callback pointers as conn is going away */
  54745. conn->pcb.tcp = NULL;
  54746. 8016756: 687b ldr r3, [r7, #4]
  54747. 8016758: 2200 movs r2, #0
  54748. 801675a: 605a str r2, [r3, #4]
  54749. /* Trigger select() in socket layer. Make sure everybody notices activity
  54750. on the connection, error first! */
  54751. API_EVENT(conn, NETCONN_EVT_ERROR, 0);
  54752. 801675c: 687b ldr r3, [r7, #4]
  54753. 801675e: 6b1b ldr r3, [r3, #48] @ 0x30
  54754. 8016760: 2b00 cmp r3, #0
  54755. 8016762: d005 beq.n 8016770 <lwip_netconn_do_close_internal+0x1f0>
  54756. 8016764: 687b ldr r3, [r7, #4]
  54757. 8016766: 6b1b ldr r3, [r3, #48] @ 0x30
  54758. 8016768: 2200 movs r2, #0
  54759. 801676a: 2104 movs r1, #4
  54760. 801676c: 6878 ldr r0, [r7, #4]
  54761. 801676e: 4798 blx r3
  54762. }
  54763. if (shut_rx) {
  54764. 8016770: 7bbb ldrb r3, [r7, #14]
  54765. 8016772: 2b00 cmp r3, #0
  54766. 8016774: d009 beq.n 801678a <lwip_netconn_do_close_internal+0x20a>
  54767. API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);
  54768. 8016776: 687b ldr r3, [r7, #4]
  54769. 8016778: 6b1b ldr r3, [r3, #48] @ 0x30
  54770. 801677a: 2b00 cmp r3, #0
  54771. 801677c: d005 beq.n 801678a <lwip_netconn_do_close_internal+0x20a>
  54772. 801677e: 687b ldr r3, [r7, #4]
  54773. 8016780: 6b1b ldr r3, [r3, #48] @ 0x30
  54774. 8016782: 2200 movs r2, #0
  54775. 8016784: 2100 movs r1, #0
  54776. 8016786: 6878 ldr r0, [r7, #4]
  54777. 8016788: 4798 blx r3
  54778. }
  54779. if (shut_tx) {
  54780. 801678a: 7b7b ldrb r3, [r7, #13]
  54781. 801678c: 2b00 cmp r3, #0
  54782. 801678e: d009 beq.n 80167a4 <lwip_netconn_do_close_internal+0x224>
  54783. API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
  54784. 8016790: 687b ldr r3, [r7, #4]
  54785. 8016792: 6b1b ldr r3, [r3, #48] @ 0x30
  54786. 8016794: 2b00 cmp r3, #0
  54787. 8016796: d005 beq.n 80167a4 <lwip_netconn_do_close_internal+0x224>
  54788. 8016798: 687b ldr r3, [r7, #4]
  54789. 801679a: 6b1b ldr r3, [r3, #48] @ 0x30
  54790. 801679c: 2200 movs r2, #0
  54791. 801679e: 2102 movs r1, #2
  54792. 80167a0: 6878 ldr r0, [r7, #4]
  54793. 80167a2: 4798 blx r3
  54794. }
  54795. }
  54796. #if LWIP_TCPIP_CORE_LOCKING
  54797. if (delayed)
  54798. 80167a4: 78fb ldrb r3, [r7, #3]
  54799. 80167a6: 2b00 cmp r3, #0
  54800. 80167a8: d002 beq.n 80167b0 <lwip_netconn_do_close_internal+0x230>
  54801. #endif
  54802. {
  54803. /* wake up the application task */
  54804. sys_sem_signal(op_completed_sem);
  54805. 80167aa: 68b8 ldr r0, [r7, #8]
  54806. 80167ac: f00f fde2 bl 8026374 <sys_sem_signal>
  54807. }
  54808. return ERR_OK;
  54809. 80167b0: 2300 movs r3, #0
  54810. 80167b2: e03c b.n 801682e <lwip_netconn_do_close_internal+0x2ae>
  54811. 80167b4: 0802cedc .word 0x0802cedc
  54812. 80167b8: 0802d1b0 .word 0x0802d1b0
  54813. 80167bc: 0802cf20 .word 0x0802cf20
  54814. 80167c0: 0802d1c0 .word 0x0802d1c0
  54815. 80167c4: 0802d1e0 .word 0x0802d1e0
  54816. 80167c8: 0802d204 .word 0x0802d204
  54817. 80167cc: 0802d044 .word 0x0802d044
  54818. }
  54819. if (!close_finished) {
  54820. 80167d0: 7d7b ldrb r3, [r7, #21]
  54821. 80167d2: 2b00 cmp r3, #0
  54822. 80167d4: d11e bne.n 8016814 <lwip_netconn_do_close_internal+0x294>
  54823. /* Closing failed and we want to wait: restore some of the callbacks */
  54824. /* Closing of listen pcb will never fail! */
  54825. LWIP_ASSERT("Closing a listen pcb may not fail!", (tpcb->state != LISTEN));
  54826. 80167d6: 693b ldr r3, [r7, #16]
  54827. 80167d8: 7d1b ldrb r3, [r3, #20]
  54828. 80167da: 2b01 cmp r3, #1
  54829. 80167dc: d106 bne.n 80167ec <lwip_netconn_do_close_internal+0x26c>
  54830. 80167de: 4b16 ldr r3, [pc, #88] @ (8016838 <lwip_netconn_do_close_internal+0x2b8>)
  54831. 80167e0: f240 4241 movw r2, #1089 @ 0x441
  54832. 80167e4: 4915 ldr r1, [pc, #84] @ (801683c <lwip_netconn_do_close_internal+0x2bc>)
  54833. 80167e6: 4816 ldr r0, [pc, #88] @ (8016840 <lwip_netconn_do_close_internal+0x2c0>)
  54834. 80167e8: f013 f8f0 bl 80299cc <iprintf>
  54835. if (shut_tx) {
  54836. 80167ec: 7b7b ldrb r3, [r7, #13]
  54837. 80167ee: 2b00 cmp r3, #0
  54838. 80167f0: d003 beq.n 80167fa <lwip_netconn_do_close_internal+0x27a>
  54839. tcp_sent(tpcb, sent_tcp);
  54840. 80167f2: 4914 ldr r1, [pc, #80] @ (8016844 <lwip_netconn_do_close_internal+0x2c4>)
  54841. 80167f4: 6938 ldr r0, [r7, #16]
  54842. 80167f6: f005 fcfd bl 801c1f4 <tcp_sent>
  54843. }
  54844. /* when waiting for close, set up poll interval to 500ms */
  54845. tcp_poll(tpcb, poll_tcp, 1);
  54846. 80167fa: 2201 movs r2, #1
  54847. 80167fc: 4912 ldr r1, [pc, #72] @ (8016848 <lwip_netconn_do_close_internal+0x2c8>)
  54848. 80167fe: 6938 ldr r0, [r7, #16]
  54849. 8016800: f005 fd58 bl 801c2b4 <tcp_poll>
  54850. tcp_err(tpcb, err_tcp);
  54851. 8016804: 4911 ldr r1, [pc, #68] @ (801684c <lwip_netconn_do_close_internal+0x2cc>)
  54852. 8016806: 6938 ldr r0, [r7, #16]
  54853. 8016808: f005 fd18 bl 801c23c <tcp_err>
  54854. tcp_arg(tpcb, conn);
  54855. 801680c: 6879 ldr r1, [r7, #4]
  54856. 801680e: 6938 ldr r0, [r7, #16]
  54857. 8016810: f005 fcba bl 801c188 <tcp_arg>
  54858. /* don't restore recv callback: we don't want to receive any more data */
  54859. }
  54860. /* If closing didn't succeed, we get called again either
  54861. from poll_tcp or from sent_tcp */
  54862. LWIP_ASSERT("err != ERR_OK", err != ERR_OK);
  54863. 8016814: f997 3017 ldrsb.w r3, [r7, #23]
  54864. 8016818: 2b00 cmp r3, #0
  54865. 801681a: d106 bne.n 801682a <lwip_netconn_do_close_internal+0x2aa>
  54866. 801681c: 4b06 ldr r3, [pc, #24] @ (8016838 <lwip_netconn_do_close_internal+0x2b8>)
  54867. 801681e: f240 424d movw r2, #1101 @ 0x44d
  54868. 8016822: 490b ldr r1, [pc, #44] @ (8016850 <lwip_netconn_do_close_internal+0x2d0>)
  54869. 8016824: 4806 ldr r0, [pc, #24] @ (8016840 <lwip_netconn_do_close_internal+0x2c0>)
  54870. 8016826: f013 f8d1 bl 80299cc <iprintf>
  54871. return err;
  54872. 801682a: f997 3017 ldrsb.w r3, [r7, #23]
  54873. }
  54874. 801682e: 4618 mov r0, r3
  54875. 8016830: 3718 adds r7, #24
  54876. 8016832: 46bd mov sp, r7
  54877. 8016834: bd80 pop {r7, pc}
  54878. 8016836: bf00 nop
  54879. 8016838: 0802cedc .word 0x0802cedc
  54880. 801683c: 0802d218 .word 0x0802d218
  54881. 8016840: 0802cf20 .word 0x0802cf20
  54882. 8016844: 08015f49 .word 0x08015f49
  54883. 8016848: 08015e79 .word 0x08015e79
  54884. 801684c: 08015ff9 .word 0x08015ff9
  54885. 8016850: 0802d23c .word 0x0802d23c
  54886. 08016854 <lwip_netconn_do_delconn>:
  54887. *
  54888. * @param m the api_msg pointing to the connection
  54889. */
  54890. void
  54891. lwip_netconn_do_delconn(void *m)
  54892. {
  54893. 8016854: b580 push {r7, lr}
  54894. 8016856: b084 sub sp, #16
  54895. 8016858: af00 add r7, sp, #0
  54896. 801685a: 6078 str r0, [r7, #4]
  54897. struct api_msg *msg = (struct api_msg *)m;
  54898. 801685c: 687b ldr r3, [r7, #4]
  54899. 801685e: 60fb str r3, [r7, #12]
  54900. enum netconn_state state = msg->conn->state;
  54901. 8016860: 68fb ldr r3, [r7, #12]
  54902. 8016862: 681b ldr r3, [r3, #0]
  54903. 8016864: 785b ldrb r3, [r3, #1]
  54904. 8016866: 72fb strb r3, [r7, #11]
  54905. LWIP_ASSERT("netconn state error", /* this only happens for TCP netconns */
  54906. 8016868: 7afb ldrb r3, [r7, #11]
  54907. 801686a: 2b00 cmp r3, #0
  54908. 801686c: d00d beq.n 801688a <lwip_netconn_do_delconn+0x36>
  54909. 801686e: 68fb ldr r3, [r7, #12]
  54910. 8016870: 681b ldr r3, [r3, #0]
  54911. 8016872: 781b ldrb r3, [r3, #0]
  54912. 8016874: f003 03f0 and.w r3, r3, #240 @ 0xf0
  54913. 8016878: 2b10 cmp r3, #16
  54914. 801687a: d006 beq.n 801688a <lwip_netconn_do_delconn+0x36>
  54915. 801687c: 4b60 ldr r3, [pc, #384] @ (8016a00 <lwip_netconn_do_delconn+0x1ac>)
  54916. 801687e: f240 425e movw r2, #1118 @ 0x45e
  54917. 8016882: 4960 ldr r1, [pc, #384] @ (8016a04 <lwip_netconn_do_delconn+0x1b0>)
  54918. 8016884: 4860 ldr r0, [pc, #384] @ (8016a08 <lwip_netconn_do_delconn+0x1b4>)
  54919. 8016886: f013 f8a1 bl 80299cc <iprintf>
  54920. msg->conn->state = NETCONN_NONE;
  54921. sys_sem_signal(op_completed_sem);
  54922. }
  54923. }
  54924. #else /* LWIP_NETCONN_FULLDUPLEX */
  54925. if (((state != NETCONN_NONE) &&
  54926. 801688a: 7afb ldrb r3, [r7, #11]
  54927. 801688c: 2b00 cmp r3, #0
  54928. 801688e: d005 beq.n 801689c <lwip_netconn_do_delconn+0x48>
  54929. 8016890: 7afb ldrb r3, [r7, #11]
  54930. 8016892: 2b02 cmp r3, #2
  54931. 8016894: d002 beq.n 801689c <lwip_netconn_do_delconn+0x48>
  54932. (state != NETCONN_LISTEN) &&
  54933. 8016896: 7afb ldrb r3, [r7, #11]
  54934. 8016898: 2b03 cmp r3, #3
  54935. 801689a: d10a bne.n 80168b2 <lwip_netconn_do_delconn+0x5e>
  54936. (state != NETCONN_CONNECT)) ||
  54937. 801689c: 7afb ldrb r3, [r7, #11]
  54938. 801689e: 2b03 cmp r3, #3
  54939. 80168a0: d10b bne.n 80168ba <lwip_netconn_do_delconn+0x66>
  54940. ((state == NETCONN_CONNECT) && !IN_NONBLOCKING_CONNECT(msg->conn))) {
  54941. 80168a2: 68fb ldr r3, [r7, #12]
  54942. 80168a4: 681b ldr r3, [r3, #0]
  54943. 80168a6: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  54944. 80168aa: f003 0304 and.w r3, r3, #4
  54945. 80168ae: 2b00 cmp r3, #0
  54946. 80168b0: d103 bne.n 80168ba <lwip_netconn_do_delconn+0x66>
  54947. /* This means either a blocking write or blocking connect is running
  54948. (nonblocking write returns and sets state to NONE) */
  54949. msg->err = ERR_INPROGRESS;
  54950. 80168b2: 68fb ldr r3, [r7, #12]
  54951. 80168b4: 22fb movs r2, #251 @ 0xfb
  54952. 80168b6: 711a strb r2, [r3, #4]
  54953. 80168b8: e096 b.n 80169e8 <lwip_netconn_do_delconn+0x194>
  54954. } else
  54955. #endif /* LWIP_NETCONN_FULLDUPLEX */
  54956. {
  54957. LWIP_ASSERT("blocking connect in progress",
  54958. 80168ba: 7afb ldrb r3, [r7, #11]
  54959. 80168bc: 2b03 cmp r3, #3
  54960. 80168be: d10e bne.n 80168de <lwip_netconn_do_delconn+0x8a>
  54961. 80168c0: 68fb ldr r3, [r7, #12]
  54962. 80168c2: 681b ldr r3, [r3, #0]
  54963. 80168c4: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  54964. 80168c8: f003 0304 and.w r3, r3, #4
  54965. 80168cc: 2b00 cmp r3, #0
  54966. 80168ce: d106 bne.n 80168de <lwip_netconn_do_delconn+0x8a>
  54967. 80168d0: 4b4b ldr r3, [pc, #300] @ (8016a00 <lwip_netconn_do_delconn+0x1ac>)
  54968. 80168d2: f240 427a movw r2, #1146 @ 0x47a
  54969. 80168d6: 494d ldr r1, [pc, #308] @ (8016a0c <lwip_netconn_do_delconn+0x1b8>)
  54970. 80168d8: 484b ldr r0, [pc, #300] @ (8016a08 <lwip_netconn_do_delconn+0x1b4>)
  54971. 80168da: f013 f877 bl 80299cc <iprintf>
  54972. (state != NETCONN_CONNECT) || IN_NONBLOCKING_CONNECT(msg->conn));
  54973. msg->err = ERR_OK;
  54974. 80168de: 68fb ldr r3, [r7, #12]
  54975. 80168e0: 2200 movs r2, #0
  54976. 80168e2: 711a strb r2, [r3, #4]
  54977. #if LWIP_NETCONN_FULLDUPLEX
  54978. /* Mark mboxes invalid */
  54979. netconn_mark_mbox_invalid(msg->conn);
  54980. #else /* LWIP_NETCONN_FULLDUPLEX */
  54981. netconn_drain(msg->conn);
  54982. 80168e4: 68fb ldr r3, [r7, #12]
  54983. 80168e6: 681b ldr r3, [r3, #0]
  54984. 80168e8: 4618 mov r0, r3
  54985. 80168ea: f7ff fdcb bl 8016484 <netconn_drain>
  54986. #endif /* LWIP_NETCONN_FULLDUPLEX */
  54987. if (msg->conn->pcb.tcp != NULL) {
  54988. 80168ee: 68fb ldr r3, [r7, #12]
  54989. 80168f0: 681b ldr r3, [r3, #0]
  54990. 80168f2: 685b ldr r3, [r3, #4]
  54991. 80168f4: 2b00 cmp r3, #0
  54992. 80168f6: d05d beq.n 80169b4 <lwip_netconn_do_delconn+0x160>
  54993. switch (NETCONNTYPE_GROUP(msg->conn->type)) {
  54994. 80168f8: 68fb ldr r3, [r7, #12]
  54995. 80168fa: 681b ldr r3, [r3, #0]
  54996. 80168fc: 781b ldrb r3, [r3, #0]
  54997. 80168fe: f003 03f0 and.w r3, r3, #240 @ 0xf0
  54998. 8016902: 2b10 cmp r3, #16
  54999. 8016904: d00d beq.n 8016922 <lwip_netconn_do_delconn+0xce>
  55000. 8016906: 2b20 cmp r3, #32
  55001. 8016908: d14f bne.n 80169aa <lwip_netconn_do_delconn+0x156>
  55002. raw_remove(msg->conn->pcb.raw);
  55003. break;
  55004. #endif /* LWIP_RAW */
  55005. #if LWIP_UDP
  55006. case NETCONN_UDP:
  55007. msg->conn->pcb.udp->recv_arg = NULL;
  55008. 801690a: 68fb ldr r3, [r7, #12]
  55009. 801690c: 681b ldr r3, [r3, #0]
  55010. 801690e: 685b ldr r3, [r3, #4]
  55011. 8016910: 2200 movs r2, #0
  55012. 8016912: 61da str r2, [r3, #28]
  55013. udp_remove(msg->conn->pcb.udp);
  55014. 8016914: 68fb ldr r3, [r7, #12]
  55015. 8016916: 681b ldr r3, [r3, #0]
  55016. 8016918: 685b ldr r3, [r3, #4]
  55017. 801691a: 4618 mov r0, r3
  55018. 801691c: f00a ffc6 bl 80218ac <udp_remove>
  55019. break;
  55020. 8016920: e044 b.n 80169ac <lwip_netconn_do_delconn+0x158>
  55021. #endif /* LWIP_UDP */
  55022. #if LWIP_TCP
  55023. case NETCONN_TCP:
  55024. LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL);
  55025. 8016922: 68fb ldr r3, [r7, #12]
  55026. 8016924: 681b ldr r3, [r3, #0]
  55027. 8016926: 6adb ldr r3, [r3, #44] @ 0x2c
  55028. 8016928: 2b00 cmp r3, #0
  55029. 801692a: d006 beq.n 801693a <lwip_netconn_do_delconn+0xe6>
  55030. 801692c: 4b34 ldr r3, [pc, #208] @ (8016a00 <lwip_netconn_do_delconn+0x1ac>)
  55031. 801692e: f240 4294 movw r2, #1172 @ 0x494
  55032. 8016932: 4937 ldr r1, [pc, #220] @ (8016a10 <lwip_netconn_do_delconn+0x1bc>)
  55033. 8016934: 4834 ldr r0, [pc, #208] @ (8016a08 <lwip_netconn_do_delconn+0x1b4>)
  55034. 8016936: f013 f849 bl 80299cc <iprintf>
  55035. msg->conn->state = NETCONN_CLOSE;
  55036. 801693a: 68fb ldr r3, [r7, #12]
  55037. 801693c: 681b ldr r3, [r3, #0]
  55038. 801693e: 2204 movs r2, #4
  55039. 8016940: 705a strb r2, [r3, #1]
  55040. msg->msg.sd.shut = NETCONN_SHUT_RDWR;
  55041. 8016942: 68fb ldr r3, [r7, #12]
  55042. 8016944: 2203 movs r2, #3
  55043. 8016946: 721a strb r2, [r3, #8]
  55044. msg->conn->current_msg = msg;
  55045. 8016948: 68fb ldr r3, [r7, #12]
  55046. 801694a: 681b ldr r3, [r3, #0]
  55047. 801694c: 68fa ldr r2, [r7, #12]
  55048. 801694e: 62da str r2, [r3, #44] @ 0x2c
  55049. #if LWIP_TCPIP_CORE_LOCKING
  55050. if (lwip_netconn_do_close_internal(msg->conn, 0) != ERR_OK) {
  55051. 8016950: 68fb ldr r3, [r7, #12]
  55052. 8016952: 681b ldr r3, [r3, #0]
  55053. 8016954: 2100 movs r1, #0
  55054. 8016956: 4618 mov r0, r3
  55055. 8016958: f7ff fe12 bl 8016580 <lwip_netconn_do_close_internal>
  55056. 801695c: 4603 mov r3, r0
  55057. 801695e: 2b00 cmp r3, #0
  55058. 8016960: d049 beq.n 80169f6 <lwip_netconn_do_delconn+0x1a2>
  55059. LWIP_ASSERT("state!", msg->conn->state == NETCONN_CLOSE);
  55060. 8016962: 68fb ldr r3, [r7, #12]
  55061. 8016964: 681b ldr r3, [r3, #0]
  55062. 8016966: 785b ldrb r3, [r3, #1]
  55063. 8016968: 2b04 cmp r3, #4
  55064. 801696a: d006 beq.n 801697a <lwip_netconn_do_delconn+0x126>
  55065. 801696c: 4b24 ldr r3, [pc, #144] @ (8016a00 <lwip_netconn_do_delconn+0x1ac>)
  55066. 801696e: f240 429a movw r2, #1178 @ 0x49a
  55067. 8016972: 4928 ldr r1, [pc, #160] @ (8016a14 <lwip_netconn_do_delconn+0x1c0>)
  55068. 8016974: 4824 ldr r0, [pc, #144] @ (8016a08 <lwip_netconn_do_delconn+0x1b4>)
  55069. 8016976: f013 f829 bl 80299cc <iprintf>
  55070. UNLOCK_TCPIP_CORE();
  55071. 801697a: f7f9 fdcb bl 8010514 <sys_unlock_tcpip_core>
  55072. sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);
  55073. 801697e: 68fb ldr r3, [r7, #12]
  55074. 8016980: 681b ldr r3, [r3, #0]
  55075. 8016982: 330c adds r3, #12
  55076. 8016984: 2100 movs r1, #0
  55077. 8016986: 4618 mov r0, r3
  55078. 8016988: f00f fcc3 bl 8026312 <sys_arch_sem_wait>
  55079. LOCK_TCPIP_CORE();
  55080. 801698c: f7f9 fdb2 bl 80104f4 <sys_lock_tcpip_core>
  55081. LWIP_ASSERT("state!", msg->conn->state == NETCONN_NONE);
  55082. 8016990: 68fb ldr r3, [r7, #12]
  55083. 8016992: 681b ldr r3, [r3, #0]
  55084. 8016994: 785b ldrb r3, [r3, #1]
  55085. 8016996: 2b00 cmp r3, #0
  55086. 8016998: d02d beq.n 80169f6 <lwip_netconn_do_delconn+0x1a2>
  55087. 801699a: 4b19 ldr r3, [pc, #100] @ (8016a00 <lwip_netconn_do_delconn+0x1ac>)
  55088. 801699c: f240 429e movw r2, #1182 @ 0x49e
  55089. 80169a0: 491c ldr r1, [pc, #112] @ (8016a14 <lwip_netconn_do_delconn+0x1c0>)
  55090. 80169a2: 4819 ldr r0, [pc, #100] @ (8016a08 <lwip_netconn_do_delconn+0x1b4>)
  55091. 80169a4: f013 f812 bl 80299cc <iprintf>
  55092. #else /* LWIP_TCPIP_CORE_LOCKING */
  55093. lwip_netconn_do_close_internal(msg->conn);
  55094. #endif /* LWIP_TCPIP_CORE_LOCKING */
  55095. /* API_EVENT is called inside lwip_netconn_do_close_internal, before releasing
  55096. the application thread, so we can return at this point! */
  55097. return;
  55098. 80169a8: e025 b.n 80169f6 <lwip_netconn_do_delconn+0x1a2>
  55099. #endif /* LWIP_TCP */
  55100. default:
  55101. break;
  55102. 80169aa: bf00 nop
  55103. }
  55104. msg->conn->pcb.tcp = NULL;
  55105. 80169ac: 68fb ldr r3, [r7, #12]
  55106. 80169ae: 681b ldr r3, [r3, #0]
  55107. 80169b0: 2200 movs r2, #0
  55108. 80169b2: 605a str r2, [r3, #4]
  55109. }
  55110. /* tcp netconns don't come here! */
  55111. /* @todo: this lets select make the socket readable and writable,
  55112. which is wrong! errfd instead? */
  55113. API_EVENT(msg->conn, NETCONN_EVT_RCVPLUS, 0);
  55114. 80169b4: 68fb ldr r3, [r7, #12]
  55115. 80169b6: 681b ldr r3, [r3, #0]
  55116. 80169b8: 6b1b ldr r3, [r3, #48] @ 0x30
  55117. 80169ba: 2b00 cmp r3, #0
  55118. 80169bc: d007 beq.n 80169ce <lwip_netconn_do_delconn+0x17a>
  55119. 80169be: 68fb ldr r3, [r7, #12]
  55120. 80169c0: 681b ldr r3, [r3, #0]
  55121. 80169c2: 6b1b ldr r3, [r3, #48] @ 0x30
  55122. 80169c4: 68fa ldr r2, [r7, #12]
  55123. 80169c6: 6810 ldr r0, [r2, #0]
  55124. 80169c8: 2200 movs r2, #0
  55125. 80169ca: 2100 movs r1, #0
  55126. 80169cc: 4798 blx r3
  55127. API_EVENT(msg->conn, NETCONN_EVT_SENDPLUS, 0);
  55128. 80169ce: 68fb ldr r3, [r7, #12]
  55129. 80169d0: 681b ldr r3, [r3, #0]
  55130. 80169d2: 6b1b ldr r3, [r3, #48] @ 0x30
  55131. 80169d4: 2b00 cmp r3, #0
  55132. 80169d6: d007 beq.n 80169e8 <lwip_netconn_do_delconn+0x194>
  55133. 80169d8: 68fb ldr r3, [r7, #12]
  55134. 80169da: 681b ldr r3, [r3, #0]
  55135. 80169dc: 6b1b ldr r3, [r3, #48] @ 0x30
  55136. 80169de: 68fa ldr r2, [r7, #12]
  55137. 80169e0: 6810 ldr r0, [r2, #0]
  55138. 80169e2: 2200 movs r2, #0
  55139. 80169e4: 2102 movs r1, #2
  55140. 80169e6: 4798 blx r3
  55141. }
  55142. if (sys_sem_valid(LWIP_API_MSG_SEM(msg))) {
  55143. 80169e8: 68fb ldr r3, [r7, #12]
  55144. 80169ea: 681b ldr r3, [r3, #0]
  55145. 80169ec: 330c adds r3, #12
  55146. 80169ee: 4618 mov r0, r3
  55147. 80169f0: f00f fcda bl 80263a8 <sys_sem_valid>
  55148. 80169f4: e000 b.n 80169f8 <lwip_netconn_do_delconn+0x1a4>
  55149. return;
  55150. 80169f6: bf00 nop
  55151. TCPIP_APIMSG_ACK(msg);
  55152. }
  55153. }
  55154. 80169f8: 3710 adds r7, #16
  55155. 80169fa: 46bd mov sp, r7
  55156. 80169fc: bd80 pop {r7, pc}
  55157. 80169fe: bf00 nop
  55158. 8016a00: 0802cedc .word 0x0802cedc
  55159. 8016a04: 0802d24c .word 0x0802d24c
  55160. 8016a08: 0802cf20 .word 0x0802cf20
  55161. 8016a0c: 0802d260 .word 0x0802d260
  55162. 8016a10: 0802d280 .word 0x0802d280
  55163. 8016a14: 0802d29c .word 0x0802d29c
  55164. 08016a18 <lwip_netconn_do_connected>:
  55165. *
  55166. * @see tcp.h (struct tcp_pcb.connected) for parameters and return values
  55167. */
  55168. static err_t
  55169. lwip_netconn_do_connected(void *arg, struct tcp_pcb *pcb, err_t err)
  55170. {
  55171. 8016a18: b580 push {r7, lr}
  55172. 8016a1a: b088 sub sp, #32
  55173. 8016a1c: af00 add r7, sp, #0
  55174. 8016a1e: 60f8 str r0, [r7, #12]
  55175. 8016a20: 60b9 str r1, [r7, #8]
  55176. 8016a22: 4613 mov r3, r2
  55177. 8016a24: 71fb strb r3, [r7, #7]
  55178. struct netconn *conn;
  55179. int was_blocking;
  55180. sys_sem_t *op_completed_sem = NULL;
  55181. 8016a26: 2300 movs r3, #0
  55182. 8016a28: 61fb str r3, [r7, #28]
  55183. LWIP_UNUSED_ARG(pcb);
  55184. conn = (struct netconn *)arg;
  55185. 8016a2a: 68fb ldr r3, [r7, #12]
  55186. 8016a2c: 61bb str r3, [r7, #24]
  55187. if (conn == NULL) {
  55188. 8016a2e: 69bb ldr r3, [r7, #24]
  55189. 8016a30: 2b00 cmp r3, #0
  55190. 8016a32: d102 bne.n 8016a3a <lwip_netconn_do_connected+0x22>
  55191. return ERR_VAL;
  55192. 8016a34: f06f 0305 mvn.w r3, #5
  55193. 8016a38: e074 b.n 8016b24 <lwip_netconn_do_connected+0x10c>
  55194. }
  55195. LWIP_ASSERT("conn->state == NETCONN_CONNECT", conn->state == NETCONN_CONNECT);
  55196. 8016a3a: 69bb ldr r3, [r7, #24]
  55197. 8016a3c: 785b ldrb r3, [r3, #1]
  55198. 8016a3e: 2b03 cmp r3, #3
  55199. 8016a40: d006 beq.n 8016a50 <lwip_netconn_do_connected+0x38>
  55200. 8016a42: 4b3a ldr r3, [pc, #232] @ (8016b2c <lwip_netconn_do_connected+0x114>)
  55201. 8016a44: f240 5223 movw r2, #1315 @ 0x523
  55202. 8016a48: 4939 ldr r1, [pc, #228] @ (8016b30 <lwip_netconn_do_connected+0x118>)
  55203. 8016a4a: 483a ldr r0, [pc, #232] @ (8016b34 <lwip_netconn_do_connected+0x11c>)
  55204. 8016a4c: f012 ffbe bl 80299cc <iprintf>
  55205. LWIP_ASSERT("(conn->current_msg != NULL) || conn->in_non_blocking_connect",
  55206. 8016a50: 69bb ldr r3, [r7, #24]
  55207. 8016a52: 6adb ldr r3, [r3, #44] @ 0x2c
  55208. 8016a54: 2b00 cmp r3, #0
  55209. 8016a56: d10d bne.n 8016a74 <lwip_netconn_do_connected+0x5c>
  55210. 8016a58: 69bb ldr r3, [r7, #24]
  55211. 8016a5a: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  55212. 8016a5e: f003 0304 and.w r3, r3, #4
  55213. 8016a62: 2b00 cmp r3, #0
  55214. 8016a64: d106 bne.n 8016a74 <lwip_netconn_do_connected+0x5c>
  55215. 8016a66: 4b31 ldr r3, [pc, #196] @ (8016b2c <lwip_netconn_do_connected+0x114>)
  55216. 8016a68: f240 5224 movw r2, #1316 @ 0x524
  55217. 8016a6c: 4932 ldr r1, [pc, #200] @ (8016b38 <lwip_netconn_do_connected+0x120>)
  55218. 8016a6e: 4831 ldr r0, [pc, #196] @ (8016b34 <lwip_netconn_do_connected+0x11c>)
  55219. 8016a70: f012 ffac bl 80299cc <iprintf>
  55220. (conn->current_msg != NULL) || IN_NONBLOCKING_CONNECT(conn));
  55221. if (conn->current_msg != NULL) {
  55222. 8016a74: 69bb ldr r3, [r7, #24]
  55223. 8016a76: 6adb ldr r3, [r3, #44] @ 0x2c
  55224. 8016a78: 2b00 cmp r3, #0
  55225. 8016a7a: d008 beq.n 8016a8e <lwip_netconn_do_connected+0x76>
  55226. conn->current_msg->err = err;
  55227. 8016a7c: 69bb ldr r3, [r7, #24]
  55228. 8016a7e: 6adb ldr r3, [r3, #44] @ 0x2c
  55229. 8016a80: 79fa ldrb r2, [r7, #7]
  55230. 8016a82: 711a strb r2, [r3, #4]
  55231. op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
  55232. 8016a84: 69bb ldr r3, [r7, #24]
  55233. 8016a86: 6adb ldr r3, [r3, #44] @ 0x2c
  55234. 8016a88: 681b ldr r3, [r3, #0]
  55235. 8016a8a: 330c adds r3, #12
  55236. 8016a8c: 61fb str r3, [r7, #28]
  55237. }
  55238. if ((NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) && (err == ERR_OK)) {
  55239. 8016a8e: 69bb ldr r3, [r7, #24]
  55240. 8016a90: 781b ldrb r3, [r3, #0]
  55241. 8016a92: f003 03f0 and.w r3, r3, #240 @ 0xf0
  55242. 8016a96: 2b10 cmp r3, #16
  55243. 8016a98: d106 bne.n 8016aa8 <lwip_netconn_do_connected+0x90>
  55244. 8016a9a: f997 3007 ldrsb.w r3, [r7, #7]
  55245. 8016a9e: 2b00 cmp r3, #0
  55246. 8016aa0: d102 bne.n 8016aa8 <lwip_netconn_do_connected+0x90>
  55247. setup_tcp(conn);
  55248. 8016aa2: 69b8 ldr r0, [r7, #24]
  55249. 8016aa4: f7ff fb82 bl 80161ac <setup_tcp>
  55250. }
  55251. was_blocking = !IN_NONBLOCKING_CONNECT(conn);
  55252. 8016aa8: 69bb ldr r3, [r7, #24]
  55253. 8016aaa: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  55254. 8016aae: f003 0304 and.w r3, r3, #4
  55255. 8016ab2: 2b00 cmp r3, #0
  55256. 8016ab4: bf0c ite eq
  55257. 8016ab6: 2301 moveq r3, #1
  55258. 8016ab8: 2300 movne r3, #0
  55259. 8016aba: b2db uxtb r3, r3
  55260. 8016abc: 617b str r3, [r7, #20]
  55261. SET_NONBLOCKING_CONNECT(conn, 0);
  55262. 8016abe: 69bb ldr r3, [r7, #24]
  55263. 8016ac0: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  55264. 8016ac4: f023 0304 bic.w r3, r3, #4
  55265. 8016ac8: b2da uxtb r2, r3
  55266. 8016aca: 69bb ldr r3, [r7, #24]
  55267. 8016acc: f883 2028 strb.w r2, [r3, #40] @ 0x28
  55268. LWIP_ASSERT("blocking connect state error",
  55269. 8016ad0: 697b ldr r3, [r7, #20]
  55270. 8016ad2: 2b00 cmp r3, #0
  55271. 8016ad4: d002 beq.n 8016adc <lwip_netconn_do_connected+0xc4>
  55272. 8016ad6: 69fb ldr r3, [r7, #28]
  55273. 8016ad8: 2b00 cmp r3, #0
  55274. 8016ada: d10c bne.n 8016af6 <lwip_netconn_do_connected+0xde>
  55275. 8016adc: 697b ldr r3, [r7, #20]
  55276. 8016ade: 2b00 cmp r3, #0
  55277. 8016ae0: d102 bne.n 8016ae8 <lwip_netconn_do_connected+0xd0>
  55278. 8016ae2: 69fb ldr r3, [r7, #28]
  55279. 8016ae4: 2b00 cmp r3, #0
  55280. 8016ae6: d006 beq.n 8016af6 <lwip_netconn_do_connected+0xde>
  55281. 8016ae8: 4b10 ldr r3, [pc, #64] @ (8016b2c <lwip_netconn_do_connected+0x114>)
  55282. 8016aea: f44f 62a6 mov.w r2, #1328 @ 0x530
  55283. 8016aee: 4913 ldr r1, [pc, #76] @ (8016b3c <lwip_netconn_do_connected+0x124>)
  55284. 8016af0: 4810 ldr r0, [pc, #64] @ (8016b34 <lwip_netconn_do_connected+0x11c>)
  55285. 8016af2: f012 ff6b bl 80299cc <iprintf>
  55286. (was_blocking && op_completed_sem != NULL) ||
  55287. (!was_blocking && op_completed_sem == NULL));
  55288. conn->current_msg = NULL;
  55289. 8016af6: 69bb ldr r3, [r7, #24]
  55290. 8016af8: 2200 movs r2, #0
  55291. 8016afa: 62da str r2, [r3, #44] @ 0x2c
  55292. conn->state = NETCONN_NONE;
  55293. 8016afc: 69bb ldr r3, [r7, #24]
  55294. 8016afe: 2200 movs r2, #0
  55295. 8016b00: 705a strb r2, [r3, #1]
  55296. API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
  55297. 8016b02: 69bb ldr r3, [r7, #24]
  55298. 8016b04: 6b1b ldr r3, [r3, #48] @ 0x30
  55299. 8016b06: 2b00 cmp r3, #0
  55300. 8016b08: d005 beq.n 8016b16 <lwip_netconn_do_connected+0xfe>
  55301. 8016b0a: 69bb ldr r3, [r7, #24]
  55302. 8016b0c: 6b1b ldr r3, [r3, #48] @ 0x30
  55303. 8016b0e: 2200 movs r2, #0
  55304. 8016b10: 2102 movs r1, #2
  55305. 8016b12: 69b8 ldr r0, [r7, #24]
  55306. 8016b14: 4798 blx r3
  55307. if (was_blocking) {
  55308. 8016b16: 697b ldr r3, [r7, #20]
  55309. 8016b18: 2b00 cmp r3, #0
  55310. 8016b1a: d002 beq.n 8016b22 <lwip_netconn_do_connected+0x10a>
  55311. sys_sem_signal(op_completed_sem);
  55312. 8016b1c: 69f8 ldr r0, [r7, #28]
  55313. 8016b1e: f00f fc29 bl 8026374 <sys_sem_signal>
  55314. }
  55315. return ERR_OK;
  55316. 8016b22: 2300 movs r3, #0
  55317. }
  55318. 8016b24: 4618 mov r0, r3
  55319. 8016b26: 3720 adds r7, #32
  55320. 8016b28: 46bd mov sp, r7
  55321. 8016b2a: bd80 pop {r7, pc}
  55322. 8016b2c: 0802cedc .word 0x0802cedc
  55323. 8016b30: 0802d2a4 .word 0x0802d2a4
  55324. 8016b34: 0802cf20 .word 0x0802cf20
  55325. 8016b38: 0802d2c4 .word 0x0802d2c4
  55326. 8016b3c: 0802d304 .word 0x0802d304
  55327. 08016b40 <lwip_netconn_do_connect>:
  55328. * @param m the api_msg pointing to the connection and containing
  55329. * the IP address and port to connect to
  55330. */
  55331. void
  55332. lwip_netconn_do_connect(void *m)
  55333. {
  55334. 8016b40: b580 push {r7, lr}
  55335. 8016b42: b086 sub sp, #24
  55336. 8016b44: af00 add r7, sp, #0
  55337. 8016b46: 6078 str r0, [r7, #4]
  55338. struct api_msg *msg = (struct api_msg *)m;
  55339. 8016b48: 687b ldr r3, [r7, #4]
  55340. 8016b4a: 613b str r3, [r7, #16]
  55341. err_t err;
  55342. if (msg->conn->pcb.tcp == NULL) {
  55343. 8016b4c: 693b ldr r3, [r7, #16]
  55344. 8016b4e: 681b ldr r3, [r3, #0]
  55345. 8016b50: 685b ldr r3, [r3, #4]
  55346. 8016b52: 2b00 cmp r3, #0
  55347. 8016b54: d102 bne.n 8016b5c <lwip_netconn_do_connect+0x1c>
  55348. /* This may happen when calling netconn_connect() a second time */
  55349. err = ERR_CLSD;
  55350. 8016b56: 23f1 movs r3, #241 @ 0xf1
  55351. 8016b58: 75fb strb r3, [r7, #23]
  55352. 8016b5a: e09e b.n 8016c9a <lwip_netconn_do_connect+0x15a>
  55353. } else {
  55354. switch (NETCONNTYPE_GROUP(msg->conn->type)) {
  55355. 8016b5c: 693b ldr r3, [r7, #16]
  55356. 8016b5e: 681b ldr r3, [r3, #0]
  55357. 8016b60: 781b ldrb r3, [r3, #0]
  55358. 8016b62: f003 03f0 and.w r3, r3, #240 @ 0xf0
  55359. 8016b66: 2b10 cmp r3, #16
  55360. 8016b68: d00f beq.n 8016b8a <lwip_netconn_do_connect+0x4a>
  55361. 8016b6a: 2b20 cmp r3, #32
  55362. 8016b6c: f040 808a bne.w 8016c84 <lwip_netconn_do_connect+0x144>
  55363. err = raw_connect(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr));
  55364. break;
  55365. #endif /* LWIP_RAW */
  55366. #if LWIP_UDP
  55367. case NETCONN_UDP:
  55368. err = udp_connect(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port);
  55369. 8016b70: 693b ldr r3, [r7, #16]
  55370. 8016b72: 681b ldr r3, [r3, #0]
  55371. 8016b74: 6858 ldr r0, [r3, #4]
  55372. 8016b76: 693b ldr r3, [r7, #16]
  55373. 8016b78: 6899 ldr r1, [r3, #8]
  55374. 8016b7a: 693b ldr r3, [r7, #16]
  55375. 8016b7c: 899b ldrh r3, [r3, #12]
  55376. 8016b7e: 461a mov r2, r3
  55377. 8016b80: f00a fdd8 bl 8021734 <udp_connect>
  55378. 8016b84: 4603 mov r3, r0
  55379. 8016b86: 75fb strb r3, [r7, #23]
  55380. break;
  55381. 8016b88: e087 b.n 8016c9a <lwip_netconn_do_connect+0x15a>
  55382. #endif /* LWIP_UDP */
  55383. #if LWIP_TCP
  55384. case NETCONN_TCP:
  55385. /* Prevent connect while doing any other action. */
  55386. if (msg->conn->state == NETCONN_CONNECT) {
  55387. 8016b8a: 693b ldr r3, [r7, #16]
  55388. 8016b8c: 681b ldr r3, [r3, #0]
  55389. 8016b8e: 785b ldrb r3, [r3, #1]
  55390. 8016b90: 2b03 cmp r3, #3
  55391. 8016b92: d102 bne.n 8016b9a <lwip_netconn_do_connect+0x5a>
  55392. err = ERR_ALREADY;
  55393. 8016b94: 23f7 movs r3, #247 @ 0xf7
  55394. 8016b96: 75fb strb r3, [r7, #23]
  55395. #endif /* LWIP_TCPIP_CORE_LOCKING */
  55396. return;
  55397. }
  55398. }
  55399. }
  55400. break;
  55401. 8016b98: e07e b.n 8016c98 <lwip_netconn_do_connect+0x158>
  55402. } else if (msg->conn->state != NETCONN_NONE) {
  55403. 8016b9a: 693b ldr r3, [r7, #16]
  55404. 8016b9c: 681b ldr r3, [r3, #0]
  55405. 8016b9e: 785b ldrb r3, [r3, #1]
  55406. 8016ba0: 2b00 cmp r3, #0
  55407. 8016ba2: d002 beq.n 8016baa <lwip_netconn_do_connect+0x6a>
  55408. err = ERR_ISCONN;
  55409. 8016ba4: 23f6 movs r3, #246 @ 0xf6
  55410. 8016ba6: 75fb strb r3, [r7, #23]
  55411. break;
  55412. 8016ba8: e076 b.n 8016c98 <lwip_netconn_do_connect+0x158>
  55413. setup_tcp(msg->conn);
  55414. 8016baa: 693b ldr r3, [r7, #16]
  55415. 8016bac: 681b ldr r3, [r3, #0]
  55416. 8016bae: 4618 mov r0, r3
  55417. 8016bb0: f7ff fafc bl 80161ac <setup_tcp>
  55418. err = tcp_connect(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr),
  55419. 8016bb4: 693b ldr r3, [r7, #16]
  55420. 8016bb6: 681b ldr r3, [r3, #0]
  55421. 8016bb8: 6858 ldr r0, [r3, #4]
  55422. 8016bba: 693b ldr r3, [r7, #16]
  55423. 8016bbc: 6899 ldr r1, [r3, #8]
  55424. 8016bbe: 693b ldr r3, [r7, #16]
  55425. 8016bc0: 899a ldrh r2, [r3, #12]
  55426. 8016bc2: 4b3a ldr r3, [pc, #232] @ (8016cac <lwip_netconn_do_connect+0x16c>)
  55427. 8016bc4: f004 fb90 bl 801b2e8 <tcp_connect>
  55428. 8016bc8: 4603 mov r3, r0
  55429. 8016bca: 75fb strb r3, [r7, #23]
  55430. if (err == ERR_OK) {
  55431. 8016bcc: f997 3017 ldrsb.w r3, [r7, #23]
  55432. 8016bd0: 2b00 cmp r3, #0
  55433. 8016bd2: d161 bne.n 8016c98 <lwip_netconn_do_connect+0x158>
  55434. u8_t non_blocking = netconn_is_nonblocking(msg->conn);
  55435. 8016bd4: 693b ldr r3, [r7, #16]
  55436. 8016bd6: 681b ldr r3, [r3, #0]
  55437. 8016bd8: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  55438. 8016bdc: f003 0302 and.w r3, r3, #2
  55439. 8016be0: 2b00 cmp r3, #0
  55440. 8016be2: bf14 ite ne
  55441. 8016be4: 2301 movne r3, #1
  55442. 8016be6: 2300 moveq r3, #0
  55443. 8016be8: b2db uxtb r3, r3
  55444. 8016bea: 73fb strb r3, [r7, #15]
  55445. msg->conn->state = NETCONN_CONNECT;
  55446. 8016bec: 693b ldr r3, [r7, #16]
  55447. 8016bee: 681b ldr r3, [r3, #0]
  55448. 8016bf0: 2203 movs r2, #3
  55449. 8016bf2: 705a strb r2, [r3, #1]
  55450. SET_NONBLOCKING_CONNECT(msg->conn, non_blocking);
  55451. 8016bf4: 7bfb ldrb r3, [r7, #15]
  55452. 8016bf6: 2b00 cmp r3, #0
  55453. 8016bf8: d00b beq.n 8016c12 <lwip_netconn_do_connect+0xd2>
  55454. 8016bfa: 693b ldr r3, [r7, #16]
  55455. 8016bfc: 681b ldr r3, [r3, #0]
  55456. 8016bfe: f893 2028 ldrb.w r2, [r3, #40] @ 0x28
  55457. 8016c02: 693b ldr r3, [r7, #16]
  55458. 8016c04: 681b ldr r3, [r3, #0]
  55459. 8016c06: f042 0204 orr.w r2, r2, #4
  55460. 8016c0a: b2d2 uxtb r2, r2
  55461. 8016c0c: f883 2028 strb.w r2, [r3, #40] @ 0x28
  55462. 8016c10: e00a b.n 8016c28 <lwip_netconn_do_connect+0xe8>
  55463. 8016c12: 693b ldr r3, [r7, #16]
  55464. 8016c14: 681b ldr r3, [r3, #0]
  55465. 8016c16: f893 2028 ldrb.w r2, [r3, #40] @ 0x28
  55466. 8016c1a: 693b ldr r3, [r7, #16]
  55467. 8016c1c: 681b ldr r3, [r3, #0]
  55468. 8016c1e: f022 0204 bic.w r2, r2, #4
  55469. 8016c22: b2d2 uxtb r2, r2
  55470. 8016c24: f883 2028 strb.w r2, [r3, #40] @ 0x28
  55471. if (non_blocking) {
  55472. 8016c28: 7bfb ldrb r3, [r7, #15]
  55473. 8016c2a: 2b00 cmp r3, #0
  55474. 8016c2c: d002 beq.n 8016c34 <lwip_netconn_do_connect+0xf4>
  55475. err = ERR_INPROGRESS;
  55476. 8016c2e: 23fb movs r3, #251 @ 0xfb
  55477. 8016c30: 75fb strb r3, [r7, #23]
  55478. break;
  55479. 8016c32: e031 b.n 8016c98 <lwip_netconn_do_connect+0x158>
  55480. msg->conn->current_msg = msg;
  55481. 8016c34: 693b ldr r3, [r7, #16]
  55482. 8016c36: 681b ldr r3, [r3, #0]
  55483. 8016c38: 693a ldr r2, [r7, #16]
  55484. 8016c3a: 62da str r2, [r3, #44] @ 0x2c
  55485. LWIP_ASSERT("state!", msg->conn->state == NETCONN_CONNECT);
  55486. 8016c3c: 693b ldr r3, [r7, #16]
  55487. 8016c3e: 681b ldr r3, [r3, #0]
  55488. 8016c40: 785b ldrb r3, [r3, #1]
  55489. 8016c42: 2b03 cmp r3, #3
  55490. 8016c44: d006 beq.n 8016c54 <lwip_netconn_do_connect+0x114>
  55491. 8016c46: 4b1a ldr r3, [pc, #104] @ (8016cb0 <lwip_netconn_do_connect+0x170>)
  55492. 8016c48: f44f 62ae mov.w r2, #1392 @ 0x570
  55493. 8016c4c: 4919 ldr r1, [pc, #100] @ (8016cb4 <lwip_netconn_do_connect+0x174>)
  55494. 8016c4e: 481a ldr r0, [pc, #104] @ (8016cb8 <lwip_netconn_do_connect+0x178>)
  55495. 8016c50: f012 febc bl 80299cc <iprintf>
  55496. UNLOCK_TCPIP_CORE();
  55497. 8016c54: f7f9 fc5e bl 8010514 <sys_unlock_tcpip_core>
  55498. sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);
  55499. 8016c58: 693b ldr r3, [r7, #16]
  55500. 8016c5a: 681b ldr r3, [r3, #0]
  55501. 8016c5c: 330c adds r3, #12
  55502. 8016c5e: 2100 movs r1, #0
  55503. 8016c60: 4618 mov r0, r3
  55504. 8016c62: f00f fb56 bl 8026312 <sys_arch_sem_wait>
  55505. LOCK_TCPIP_CORE();
  55506. 8016c66: f7f9 fc45 bl 80104f4 <sys_lock_tcpip_core>
  55507. LWIP_ASSERT("state!", msg->conn->state != NETCONN_CONNECT);
  55508. 8016c6a: 693b ldr r3, [r7, #16]
  55509. 8016c6c: 681b ldr r3, [r3, #0]
  55510. 8016c6e: 785b ldrb r3, [r3, #1]
  55511. 8016c70: 2b03 cmp r3, #3
  55512. 8016c72: d116 bne.n 8016ca2 <lwip_netconn_do_connect+0x162>
  55513. 8016c74: 4b0e ldr r3, [pc, #56] @ (8016cb0 <lwip_netconn_do_connect+0x170>)
  55514. 8016c76: f240 5274 movw r2, #1396 @ 0x574
  55515. 8016c7a: 490e ldr r1, [pc, #56] @ (8016cb4 <lwip_netconn_do_connect+0x174>)
  55516. 8016c7c: 480e ldr r0, [pc, #56] @ (8016cb8 <lwip_netconn_do_connect+0x178>)
  55517. 8016c7e: f012 fea5 bl 80299cc <iprintf>
  55518. return;
  55519. 8016c82: e00e b.n 8016ca2 <lwip_netconn_do_connect+0x162>
  55520. #endif /* LWIP_TCP */
  55521. default:
  55522. LWIP_ERROR("Invalid netconn type", 0, do {
  55523. 8016c84: 4b0a ldr r3, [pc, #40] @ (8016cb0 <lwip_netconn_do_connect+0x170>)
  55524. 8016c86: f240 527d movw r2, #1405 @ 0x57d
  55525. 8016c8a: 490c ldr r1, [pc, #48] @ (8016cbc <lwip_netconn_do_connect+0x17c>)
  55526. 8016c8c: 480a ldr r0, [pc, #40] @ (8016cb8 <lwip_netconn_do_connect+0x178>)
  55527. 8016c8e: f012 fe9d bl 80299cc <iprintf>
  55528. 8016c92: 23fa movs r3, #250 @ 0xfa
  55529. 8016c94: 75fb strb r3, [r7, #23]
  55530. err = ERR_VAL;
  55531. } while (0));
  55532. break;
  55533. 8016c96: e000 b.n 8016c9a <lwip_netconn_do_connect+0x15a>
  55534. break;
  55535. 8016c98: bf00 nop
  55536. }
  55537. }
  55538. msg->err = err;
  55539. 8016c9a: 693b ldr r3, [r7, #16]
  55540. 8016c9c: 7dfa ldrb r2, [r7, #23]
  55541. 8016c9e: 711a strb r2, [r3, #4]
  55542. 8016ca0: e000 b.n 8016ca4 <lwip_netconn_do_connect+0x164>
  55543. return;
  55544. 8016ca2: bf00 nop
  55545. /* For all other protocols, netconn_connect() calls netconn_apimsg(),
  55546. so use TCPIP_APIMSG_ACK() here. */
  55547. TCPIP_APIMSG_ACK(msg);
  55548. }
  55549. 8016ca4: 3718 adds r7, #24
  55550. 8016ca6: 46bd mov sp, r7
  55551. 8016ca8: bd80 pop {r7, pc}
  55552. 8016caa: bf00 nop
  55553. 8016cac: 08016a19 .word 0x08016a19
  55554. 8016cb0: 0802cedc .word 0x0802cedc
  55555. 8016cb4: 0802d29c .word 0x0802d29c
  55556. 8016cb8: 0802cf20 .word 0x0802cf20
  55557. 8016cbc: 0802d324 .word 0x0802d324
  55558. 08016cc0 <lwip_netconn_do_disconnect>:
  55559. *
  55560. * @param m the api_msg pointing to the connection to disconnect
  55561. */
  55562. void
  55563. lwip_netconn_do_disconnect(void *m)
  55564. {
  55565. 8016cc0: b580 push {r7, lr}
  55566. 8016cc2: b084 sub sp, #16
  55567. 8016cc4: af00 add r7, sp, #0
  55568. 8016cc6: 6078 str r0, [r7, #4]
  55569. struct api_msg *msg = (struct api_msg *)m;
  55570. 8016cc8: 687b ldr r3, [r7, #4]
  55571. 8016cca: 60fb str r3, [r7, #12]
  55572. #if LWIP_UDP
  55573. if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) {
  55574. 8016ccc: 68fb ldr r3, [r7, #12]
  55575. 8016cce: 681b ldr r3, [r3, #0]
  55576. 8016cd0: 781b ldrb r3, [r3, #0]
  55577. 8016cd2: f003 03f0 and.w r3, r3, #240 @ 0xf0
  55578. 8016cd6: 2b20 cmp r3, #32
  55579. 8016cd8: d109 bne.n 8016cee <lwip_netconn_do_disconnect+0x2e>
  55580. udp_disconnect(msg->conn->pcb.udp);
  55581. 8016cda: 68fb ldr r3, [r7, #12]
  55582. 8016cdc: 681b ldr r3, [r3, #0]
  55583. 8016cde: 685b ldr r3, [r3, #4]
  55584. 8016ce0: 4618 mov r0, r3
  55585. 8016ce2: f00a fd97 bl 8021814 <udp_disconnect>
  55586. msg->err = ERR_OK;
  55587. 8016ce6: 68fb ldr r3, [r7, #12]
  55588. 8016ce8: 2200 movs r2, #0
  55589. 8016cea: 711a strb r2, [r3, #4]
  55590. #endif /* LWIP_UDP */
  55591. {
  55592. msg->err = ERR_VAL;
  55593. }
  55594. TCPIP_APIMSG_ACK(msg);
  55595. }
  55596. 8016cec: e002 b.n 8016cf4 <lwip_netconn_do_disconnect+0x34>
  55597. msg->err = ERR_VAL;
  55598. 8016cee: 68fb ldr r3, [r7, #12]
  55599. 8016cf0: 22fa movs r2, #250 @ 0xfa
  55600. 8016cf2: 711a strb r2, [r3, #4]
  55601. }
  55602. 8016cf4: bf00 nop
  55603. 8016cf6: 3710 adds r7, #16
  55604. 8016cf8: 46bd mov sp, r7
  55605. 8016cfa: bd80 pop {r7, pc}
  55606. 08016cfc <lwip_netconn_do_send>:
  55607. *
  55608. * @param m the api_msg pointing to the connection
  55609. */
  55610. void
  55611. lwip_netconn_do_send(void *m)
  55612. {
  55613. 8016cfc: b580 push {r7, lr}
  55614. 8016cfe: b084 sub sp, #16
  55615. 8016d00: af00 add r7, sp, #0
  55616. 8016d02: 6078 str r0, [r7, #4]
  55617. struct api_msg *msg = (struct api_msg *)m;
  55618. 8016d04: 687b ldr r3, [r7, #4]
  55619. 8016d06: 60bb str r3, [r7, #8]
  55620. err_t err = netconn_err(msg->conn);
  55621. 8016d08: 68bb ldr r3, [r7, #8]
  55622. 8016d0a: 681b ldr r3, [r3, #0]
  55623. 8016d0c: 4618 mov r0, r3
  55624. 8016d0e: f7fe fef9 bl 8015b04 <netconn_err>
  55625. 8016d12: 4603 mov r3, r0
  55626. 8016d14: 73fb strb r3, [r7, #15]
  55627. if (err == ERR_OK) {
  55628. 8016d16: f997 300f ldrsb.w r3, [r7, #15]
  55629. 8016d1a: 2b00 cmp r3, #0
  55630. 8016d1c: d134 bne.n 8016d88 <lwip_netconn_do_send+0x8c>
  55631. if (msg->conn->pcb.tcp != NULL) {
  55632. 8016d1e: 68bb ldr r3, [r7, #8]
  55633. 8016d20: 681b ldr r3, [r3, #0]
  55634. 8016d22: 685b ldr r3, [r3, #4]
  55635. 8016d24: 2b00 cmp r3, #0
  55636. 8016d26: d02d beq.n 8016d84 <lwip_netconn_do_send+0x88>
  55637. switch (NETCONNTYPE_GROUP(msg->conn->type)) {
  55638. 8016d28: 68bb ldr r3, [r7, #8]
  55639. 8016d2a: 681b ldr r3, [r3, #0]
  55640. 8016d2c: 781b ldrb r3, [r3, #0]
  55641. 8016d2e: f003 03f0 and.w r3, r3, #240 @ 0xf0
  55642. 8016d32: 2b20 cmp r3, #32
  55643. 8016d34: d123 bne.n 8016d7e <lwip_netconn_do_send+0x82>
  55644. err = udp_sendto_chksum(msg->conn->pcb.udp, msg->msg.b->p,
  55645. &msg->msg.b->addr, msg->msg.b->port,
  55646. msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum);
  55647. }
  55648. #else /* LWIP_CHECKSUM_ON_COPY */
  55649. if (ip_addr_isany_val(msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {
  55650. 8016d36: 68bb ldr r3, [r7, #8]
  55651. 8016d38: 689b ldr r3, [r3, #8]
  55652. 8016d3a: 689b ldr r3, [r3, #8]
  55653. 8016d3c: 2b00 cmp r3, #0
  55654. 8016d3e: d10c bne.n 8016d5a <lwip_netconn_do_send+0x5e>
  55655. err = udp_send(msg->conn->pcb.udp, msg->msg.b->p);
  55656. 8016d40: 68bb ldr r3, [r7, #8]
  55657. 8016d42: 681b ldr r3, [r3, #0]
  55658. 8016d44: 685a ldr r2, [r3, #4]
  55659. 8016d46: 68bb ldr r3, [r7, #8]
  55660. 8016d48: 689b ldr r3, [r3, #8]
  55661. 8016d4a: 681b ldr r3, [r3, #0]
  55662. 8016d4c: 4619 mov r1, r3
  55663. 8016d4e: 4610 mov r0, r2
  55664. 8016d50: f00a fa7a bl 8021248 <udp_send>
  55665. 8016d54: 4603 mov r3, r0
  55666. 8016d56: 73fb strb r3, [r7, #15]
  55667. } else {
  55668. err = udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, &msg->msg.b->addr, msg->msg.b->port);
  55669. }
  55670. #endif /* LWIP_CHECKSUM_ON_COPY */
  55671. break;
  55672. 8016d58: e016 b.n 8016d88 <lwip_netconn_do_send+0x8c>
  55673. err = udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, &msg->msg.b->addr, msg->msg.b->port);
  55674. 8016d5a: 68bb ldr r3, [r7, #8]
  55675. 8016d5c: 681b ldr r3, [r3, #0]
  55676. 8016d5e: 6858 ldr r0, [r3, #4]
  55677. 8016d60: 68bb ldr r3, [r7, #8]
  55678. 8016d62: 689b ldr r3, [r3, #8]
  55679. 8016d64: 6819 ldr r1, [r3, #0]
  55680. 8016d66: 68bb ldr r3, [r7, #8]
  55681. 8016d68: 689b ldr r3, [r3, #8]
  55682. 8016d6a: f103 0208 add.w r2, r3, #8
  55683. 8016d6e: 68bb ldr r3, [r7, #8]
  55684. 8016d70: 689b ldr r3, [r3, #8]
  55685. 8016d72: 899b ldrh r3, [r3, #12]
  55686. 8016d74: f00a fa9c bl 80212b0 <udp_sendto>
  55687. 8016d78: 4603 mov r3, r0
  55688. 8016d7a: 73fb strb r3, [r7, #15]
  55689. break;
  55690. 8016d7c: e004 b.n 8016d88 <lwip_netconn_do_send+0x8c>
  55691. #endif /* LWIP_UDP */
  55692. default:
  55693. err = ERR_CONN;
  55694. 8016d7e: 23f5 movs r3, #245 @ 0xf5
  55695. 8016d80: 73fb strb r3, [r7, #15]
  55696. break;
  55697. 8016d82: e001 b.n 8016d88 <lwip_netconn_do_send+0x8c>
  55698. }
  55699. } else {
  55700. err = ERR_CONN;
  55701. 8016d84: 23f5 movs r3, #245 @ 0xf5
  55702. 8016d86: 73fb strb r3, [r7, #15]
  55703. }
  55704. }
  55705. msg->err = err;
  55706. 8016d88: 68bb ldr r3, [r7, #8]
  55707. 8016d8a: 7bfa ldrb r2, [r7, #15]
  55708. 8016d8c: 711a strb r2, [r3, #4]
  55709. TCPIP_APIMSG_ACK(msg);
  55710. }
  55711. 8016d8e: bf00 nop
  55712. 8016d90: 3710 adds r7, #16
  55713. 8016d92: 46bd mov sp, r7
  55714. 8016d94: bd80 pop {r7, pc}
  55715. 08016d96 <lwip_netconn_do_recv>:
  55716. *
  55717. * @param m the api_msg pointing to the connection
  55718. */
  55719. void
  55720. lwip_netconn_do_recv(void *m)
  55721. {
  55722. 8016d96: b580 push {r7, lr}
  55723. 8016d98: b086 sub sp, #24
  55724. 8016d9a: af00 add r7, sp, #0
  55725. 8016d9c: 6078 str r0, [r7, #4]
  55726. struct api_msg *msg = (struct api_msg *)m;
  55727. 8016d9e: 687b ldr r3, [r7, #4]
  55728. 8016da0: 613b str r3, [r7, #16]
  55729. msg->err = ERR_OK;
  55730. 8016da2: 693b ldr r3, [r7, #16]
  55731. 8016da4: 2200 movs r2, #0
  55732. 8016da6: 711a strb r2, [r3, #4]
  55733. if (msg->conn->pcb.tcp != NULL) {
  55734. 8016da8: 693b ldr r3, [r7, #16]
  55735. 8016daa: 681b ldr r3, [r3, #0]
  55736. 8016dac: 685b ldr r3, [r3, #4]
  55737. 8016dae: 2b00 cmp r3, #0
  55738. 8016db0: d022 beq.n 8016df8 <lwip_netconn_do_recv+0x62>
  55739. if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {
  55740. 8016db2: 693b ldr r3, [r7, #16]
  55741. 8016db4: 681b ldr r3, [r3, #0]
  55742. 8016db6: 781b ldrb r3, [r3, #0]
  55743. 8016db8: f003 03f0 and.w r3, r3, #240 @ 0xf0
  55744. 8016dbc: 2b10 cmp r3, #16
  55745. 8016dbe: d11b bne.n 8016df8 <lwip_netconn_do_recv+0x62>
  55746. size_t remaining = msg->msg.r.len;
  55747. 8016dc0: 693b ldr r3, [r7, #16]
  55748. 8016dc2: 689b ldr r3, [r3, #8]
  55749. 8016dc4: 617b str r3, [r7, #20]
  55750. do {
  55751. u16_t recved = (u16_t)((remaining > 0xffff) ? 0xffff : remaining);
  55752. 8016dc6: 697b ldr r3, [r7, #20]
  55753. 8016dc8: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  55754. 8016dcc: d202 bcs.n 8016dd4 <lwip_netconn_do_recv+0x3e>
  55755. 8016dce: 697b ldr r3, [r7, #20]
  55756. 8016dd0: b29b uxth r3, r3
  55757. 8016dd2: e001 b.n 8016dd8 <lwip_netconn_do_recv+0x42>
  55758. 8016dd4: f64f 73ff movw r3, #65535 @ 0xffff
  55759. 8016dd8: 81fb strh r3, [r7, #14]
  55760. tcp_recved(msg->conn->pcb.tcp, recved);
  55761. 8016dda: 693b ldr r3, [r7, #16]
  55762. 8016ddc: 681b ldr r3, [r3, #0]
  55763. 8016dde: 685b ldr r3, [r3, #4]
  55764. 8016de0: 89fa ldrh r2, [r7, #14]
  55765. 8016de2: 4611 mov r1, r2
  55766. 8016de4: 4618 mov r0, r3
  55767. 8016de6: f004 f9e5 bl 801b1b4 <tcp_recved>
  55768. remaining -= recved;
  55769. 8016dea: 89fb ldrh r3, [r7, #14]
  55770. 8016dec: 697a ldr r2, [r7, #20]
  55771. 8016dee: 1ad3 subs r3, r2, r3
  55772. 8016df0: 617b str r3, [r7, #20]
  55773. } while (remaining != 0);
  55774. 8016df2: 697b ldr r3, [r7, #20]
  55775. 8016df4: 2b00 cmp r3, #0
  55776. 8016df6: d1e6 bne.n 8016dc6 <lwip_netconn_do_recv+0x30>
  55777. }
  55778. }
  55779. TCPIP_APIMSG_ACK(msg);
  55780. }
  55781. 8016df8: bf00 nop
  55782. 8016dfa: 3718 adds r7, #24
  55783. 8016dfc: 46bd mov sp, r7
  55784. 8016dfe: bd80 pop {r7, pc}
  55785. 08016e00 <lwip_netconn_do_writemore>:
  55786. * @return ERR_OK
  55787. * ERR_MEM if LWIP_TCPIP_CORE_LOCKING=1 and sending hasn't yet finished
  55788. */
  55789. static err_t
  55790. lwip_netconn_do_writemore(struct netconn *conn WRITE_DELAYED_PARAM)
  55791. {
  55792. 8016e00: b580 push {r7, lr}
  55793. 8016e02: b088 sub sp, #32
  55794. 8016e04: af00 add r7, sp, #0
  55795. 8016e06: 6078 str r0, [r7, #4]
  55796. 8016e08: 460b mov r3, r1
  55797. 8016e0a: 70fb strb r3, [r7, #3]
  55798. err_t err;
  55799. const void *dataptr;
  55800. u16_t len, available;
  55801. u8_t write_finished = 0;
  55802. 8016e0c: 2300 movs r3, #0
  55803. 8016e0e: 76fb strb r3, [r7, #27]
  55804. size_t diff;
  55805. u8_t dontblock;
  55806. u8_t apiflags;
  55807. u8_t write_more;
  55808. LWIP_ASSERT("conn != NULL", conn != NULL);
  55809. 8016e10: 687b ldr r3, [r7, #4]
  55810. 8016e12: 2b00 cmp r3, #0
  55811. 8016e14: d106 bne.n 8016e24 <lwip_netconn_do_writemore+0x24>
  55812. 8016e16: 4b61 ldr r3, [pc, #388] @ (8016f9c <lwip_netconn_do_writemore+0x19c>)
  55813. 8016e18: f240 6273 movw r2, #1651 @ 0x673
  55814. 8016e1c: 4960 ldr r1, [pc, #384] @ (8016fa0 <lwip_netconn_do_writemore+0x1a0>)
  55815. 8016e1e: 4861 ldr r0, [pc, #388] @ (8016fa4 <lwip_netconn_do_writemore+0x1a4>)
  55816. 8016e20: f012 fdd4 bl 80299cc <iprintf>
  55817. LWIP_ASSERT("conn->state == NETCONN_WRITE", (conn->state == NETCONN_WRITE));
  55818. 8016e24: 687b ldr r3, [r7, #4]
  55819. 8016e26: 785b ldrb r3, [r3, #1]
  55820. 8016e28: 2b01 cmp r3, #1
  55821. 8016e2a: d006 beq.n 8016e3a <lwip_netconn_do_writemore+0x3a>
  55822. 8016e2c: 4b5b ldr r3, [pc, #364] @ (8016f9c <lwip_netconn_do_writemore+0x19c>)
  55823. 8016e2e: f240 6274 movw r2, #1652 @ 0x674
  55824. 8016e32: 495d ldr r1, [pc, #372] @ (8016fa8 <lwip_netconn_do_writemore+0x1a8>)
  55825. 8016e34: 485b ldr r0, [pc, #364] @ (8016fa4 <lwip_netconn_do_writemore+0x1a4>)
  55826. 8016e36: f012 fdc9 bl 80299cc <iprintf>
  55827. LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL);
  55828. 8016e3a: 687b ldr r3, [r7, #4]
  55829. 8016e3c: 6adb ldr r3, [r3, #44] @ 0x2c
  55830. 8016e3e: 2b00 cmp r3, #0
  55831. 8016e40: d106 bne.n 8016e50 <lwip_netconn_do_writemore+0x50>
  55832. 8016e42: 4b56 ldr r3, [pc, #344] @ (8016f9c <lwip_netconn_do_writemore+0x19c>)
  55833. 8016e44: f240 6275 movw r2, #1653 @ 0x675
  55834. 8016e48: 4958 ldr r1, [pc, #352] @ (8016fac <lwip_netconn_do_writemore+0x1ac>)
  55835. 8016e4a: 4856 ldr r0, [pc, #344] @ (8016fa4 <lwip_netconn_do_writemore+0x1a4>)
  55836. 8016e4c: f012 fdbe bl 80299cc <iprintf>
  55837. LWIP_ASSERT("conn->pcb.tcp != NULL", conn->pcb.tcp != NULL);
  55838. 8016e50: 687b ldr r3, [r7, #4]
  55839. 8016e52: 685b ldr r3, [r3, #4]
  55840. 8016e54: 2b00 cmp r3, #0
  55841. 8016e56: d106 bne.n 8016e66 <lwip_netconn_do_writemore+0x66>
  55842. 8016e58: 4b50 ldr r3, [pc, #320] @ (8016f9c <lwip_netconn_do_writemore+0x19c>)
  55843. 8016e5a: f240 6276 movw r2, #1654 @ 0x676
  55844. 8016e5e: 4954 ldr r1, [pc, #336] @ (8016fb0 <lwip_netconn_do_writemore+0x1b0>)
  55845. 8016e60: 4850 ldr r0, [pc, #320] @ (8016fa4 <lwip_netconn_do_writemore+0x1a4>)
  55846. 8016e62: f012 fdb3 bl 80299cc <iprintf>
  55847. LWIP_ASSERT("conn->current_msg->msg.w.offset < conn->current_msg->msg.w.len",
  55848. 8016e66: 687b ldr r3, [r7, #4]
  55849. 8016e68: 6adb ldr r3, [r3, #44] @ 0x2c
  55850. 8016e6a: 699a ldr r2, [r3, #24]
  55851. 8016e6c: 687b ldr r3, [r7, #4]
  55852. 8016e6e: 6adb ldr r3, [r3, #44] @ 0x2c
  55853. 8016e70: 695b ldr r3, [r3, #20]
  55854. 8016e72: 429a cmp r2, r3
  55855. 8016e74: d306 bcc.n 8016e84 <lwip_netconn_do_writemore+0x84>
  55856. 8016e76: 4b49 ldr r3, [pc, #292] @ (8016f9c <lwip_netconn_do_writemore+0x19c>)
  55857. 8016e78: f240 6277 movw r2, #1655 @ 0x677
  55858. 8016e7c: 494d ldr r1, [pc, #308] @ (8016fb4 <lwip_netconn_do_writemore+0x1b4>)
  55859. 8016e7e: 4849 ldr r0, [pc, #292] @ (8016fa4 <lwip_netconn_do_writemore+0x1a4>)
  55860. 8016e80: f012 fda4 bl 80299cc <iprintf>
  55861. conn->current_msg->msg.w.offset < conn->current_msg->msg.w.len);
  55862. LWIP_ASSERT("conn->current_msg->msg.w.vector_cnt > 0", conn->current_msg->msg.w.vector_cnt > 0);
  55863. 8016e84: 687b ldr r3, [r7, #4]
  55864. 8016e86: 6adb ldr r3, [r3, #44] @ 0x2c
  55865. 8016e88: 899b ldrh r3, [r3, #12]
  55866. 8016e8a: 2b00 cmp r3, #0
  55867. 8016e8c: d106 bne.n 8016e9c <lwip_netconn_do_writemore+0x9c>
  55868. 8016e8e: 4b43 ldr r3, [pc, #268] @ (8016f9c <lwip_netconn_do_writemore+0x19c>)
  55869. 8016e90: f240 6279 movw r2, #1657 @ 0x679
  55870. 8016e94: 4948 ldr r1, [pc, #288] @ (8016fb8 <lwip_netconn_do_writemore+0x1b8>)
  55871. 8016e96: 4843 ldr r0, [pc, #268] @ (8016fa4 <lwip_netconn_do_writemore+0x1a4>)
  55872. 8016e98: f012 fd98 bl 80299cc <iprintf>
  55873. apiflags = conn->current_msg->msg.w.apiflags;
  55874. 8016e9c: 687b ldr r3, [r7, #4]
  55875. 8016e9e: 6adb ldr r3, [r3, #44] @ 0x2c
  55876. 8016ea0: 7f1b ldrb r3, [r3, #28]
  55877. 8016ea2: 76bb strb r3, [r7, #26]
  55878. dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);
  55879. 8016ea4: 687b ldr r3, [r7, #4]
  55880. 8016ea6: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  55881. 8016eaa: f003 0302 and.w r3, r3, #2
  55882. 8016eae: 2b00 cmp r3, #0
  55883. 8016eb0: d104 bne.n 8016ebc <lwip_netconn_do_writemore+0xbc>
  55884. 8016eb2: 7ebb ldrb r3, [r7, #26]
  55885. 8016eb4: f003 0304 and.w r3, r3, #4
  55886. 8016eb8: 2b00 cmp r3, #0
  55887. 8016eba: d001 beq.n 8016ec0 <lwip_netconn_do_writemore+0xc0>
  55888. 8016ebc: 2301 movs r3, #1
  55889. 8016ebe: e000 b.n 8016ec2 <lwip_netconn_do_writemore+0xc2>
  55890. 8016ec0: 2300 movs r3, #0
  55891. 8016ec2: 763b strb r3, [r7, #24]
  55892. }
  55893. } else
  55894. #endif /* LWIP_SO_SNDTIMEO */
  55895. {
  55896. do {
  55897. dataptr = (const u8_t *)conn->current_msg->msg.w.vector->ptr + conn->current_msg->msg.w.vector_off;
  55898. 8016ec4: 687b ldr r3, [r7, #4]
  55899. 8016ec6: 6adb ldr r3, [r3, #44] @ 0x2c
  55900. 8016ec8: 689b ldr r3, [r3, #8]
  55901. 8016eca: 681a ldr r2, [r3, #0]
  55902. 8016ecc: 687b ldr r3, [r7, #4]
  55903. 8016ece: 6adb ldr r3, [r3, #44] @ 0x2c
  55904. 8016ed0: 691b ldr r3, [r3, #16]
  55905. 8016ed2: 4413 add r3, r2
  55906. 8016ed4: 617b str r3, [r7, #20]
  55907. diff = conn->current_msg->msg.w.vector->len - conn->current_msg->msg.w.vector_off;
  55908. 8016ed6: 687b ldr r3, [r7, #4]
  55909. 8016ed8: 6adb ldr r3, [r3, #44] @ 0x2c
  55910. 8016eda: 689b ldr r3, [r3, #8]
  55911. 8016edc: 685a ldr r2, [r3, #4]
  55912. 8016ede: 687b ldr r3, [r7, #4]
  55913. 8016ee0: 6adb ldr r3, [r3, #44] @ 0x2c
  55914. 8016ee2: 691b ldr r3, [r3, #16]
  55915. 8016ee4: 1ad3 subs r3, r2, r3
  55916. 8016ee6: 613b str r3, [r7, #16]
  55917. if (diff > 0xffffUL) { /* max_u16_t */
  55918. 8016ee8: 693b ldr r3, [r7, #16]
  55919. 8016eea: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  55920. 8016eee: d307 bcc.n 8016f00 <lwip_netconn_do_writemore+0x100>
  55921. len = 0xffff;
  55922. 8016ef0: f64f 73ff movw r3, #65535 @ 0xffff
  55923. 8016ef4: 83bb strh r3, [r7, #28]
  55924. apiflags |= TCP_WRITE_FLAG_MORE;
  55925. 8016ef6: 7ebb ldrb r3, [r7, #26]
  55926. 8016ef8: f043 0302 orr.w r3, r3, #2
  55927. 8016efc: 76bb strb r3, [r7, #26]
  55928. 8016efe: e001 b.n 8016f04 <lwip_netconn_do_writemore+0x104>
  55929. } else {
  55930. len = (u16_t)diff;
  55931. 8016f00: 693b ldr r3, [r7, #16]
  55932. 8016f02: 83bb strh r3, [r7, #28]
  55933. }
  55934. available = tcp_sndbuf(conn->pcb.tcp);
  55935. 8016f04: 687b ldr r3, [r7, #4]
  55936. 8016f06: 685b ldr r3, [r3, #4]
  55937. 8016f08: f8b3 3064 ldrh.w r3, [r3, #100] @ 0x64
  55938. 8016f0c: 81fb strh r3, [r7, #14]
  55939. if (available < len) {
  55940. 8016f0e: 89fa ldrh r2, [r7, #14]
  55941. 8016f10: 8bbb ldrh r3, [r7, #28]
  55942. 8016f12: 429a cmp r2, r3
  55943. 8016f14: d216 bcs.n 8016f44 <lwip_netconn_do_writemore+0x144>
  55944. /* don't try to write more than sendbuf */
  55945. len = available;
  55946. 8016f16: 89fb ldrh r3, [r7, #14]
  55947. 8016f18: 83bb strh r3, [r7, #28]
  55948. if (dontblock) {
  55949. 8016f1a: 7e3b ldrb r3, [r7, #24]
  55950. 8016f1c: 2b00 cmp r3, #0
  55951. 8016f1e: d00d beq.n 8016f3c <lwip_netconn_do_writemore+0x13c>
  55952. if (!len) {
  55953. 8016f20: 8bbb ldrh r3, [r7, #28]
  55954. 8016f22: 2b00 cmp r3, #0
  55955. 8016f24: d10e bne.n 8016f44 <lwip_netconn_do_writemore+0x144>
  55956. /* set error according to partial write or not */
  55957. err = (conn->current_msg->msg.w.offset == 0) ? ERR_WOULDBLOCK : ERR_OK;
  55958. 8016f26: 687b ldr r3, [r7, #4]
  55959. 8016f28: 6adb ldr r3, [r3, #44] @ 0x2c
  55960. 8016f2a: 699b ldr r3, [r3, #24]
  55961. 8016f2c: 2b00 cmp r3, #0
  55962. 8016f2e: d102 bne.n 8016f36 <lwip_netconn_do_writemore+0x136>
  55963. 8016f30: f06f 0306 mvn.w r3, #6
  55964. 8016f34: e000 b.n 8016f38 <lwip_netconn_do_writemore+0x138>
  55965. 8016f36: 2300 movs r3, #0
  55966. 8016f38: 77fb strb r3, [r7, #31]
  55967. goto err_mem;
  55968. 8016f3a: e08f b.n 801705c <lwip_netconn_do_writemore+0x25c>
  55969. }
  55970. } else {
  55971. apiflags |= TCP_WRITE_FLAG_MORE;
  55972. 8016f3c: 7ebb ldrb r3, [r7, #26]
  55973. 8016f3e: f043 0302 orr.w r3, r3, #2
  55974. 8016f42: 76bb strb r3, [r7, #26]
  55975. }
  55976. }
  55977. LWIP_ASSERT("lwip_netconn_do_writemore: invalid length!",
  55978. 8016f44: 687b ldr r3, [r7, #4]
  55979. 8016f46: 6adb ldr r3, [r3, #44] @ 0x2c
  55980. 8016f48: 691a ldr r2, [r3, #16]
  55981. 8016f4a: 8bbb ldrh r3, [r7, #28]
  55982. 8016f4c: 441a add r2, r3
  55983. 8016f4e: 687b ldr r3, [r7, #4]
  55984. 8016f50: 6adb ldr r3, [r3, #44] @ 0x2c
  55985. 8016f52: 689b ldr r3, [r3, #8]
  55986. 8016f54: 685b ldr r3, [r3, #4]
  55987. 8016f56: 429a cmp r2, r3
  55988. 8016f58: d906 bls.n 8016f68 <lwip_netconn_do_writemore+0x168>
  55989. 8016f5a: 4b10 ldr r3, [pc, #64] @ (8016f9c <lwip_netconn_do_writemore+0x19c>)
  55990. 8016f5c: f240 62a3 movw r2, #1699 @ 0x6a3
  55991. 8016f60: 4916 ldr r1, [pc, #88] @ (8016fbc <lwip_netconn_do_writemore+0x1bc>)
  55992. 8016f62: 4810 ldr r0, [pc, #64] @ (8016fa4 <lwip_netconn_do_writemore+0x1a4>)
  55993. 8016f64: f012 fd32 bl 80299cc <iprintf>
  55994. ((conn->current_msg->msg.w.vector_off + len) <= conn->current_msg->msg.w.vector->len));
  55995. /* we should loop around for more sending in the following cases:
  55996. 1) We couldn't finish the current vector because of 16-bit size limitations.
  55997. tcp_write() and tcp_sndbuf() both are limited to 16-bit sizes
  55998. 2) We are sending the remainder of the current vector and have more */
  55999. if ((len == 0xffff && diff > 0xffffUL) ||
  56000. 8016f68: 8bbb ldrh r3, [r7, #28]
  56001. 8016f6a: f64f 72ff movw r2, #65535 @ 0xffff
  56002. 8016f6e: 4293 cmp r3, r2
  56003. 8016f70: d103 bne.n 8016f7a <lwip_netconn_do_writemore+0x17a>
  56004. 8016f72: 693b ldr r3, [r7, #16]
  56005. 8016f74: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  56006. 8016f78: d209 bcs.n 8016f8e <lwip_netconn_do_writemore+0x18e>
  56007. (len == (u16_t)diff && conn->current_msg->msg.w.vector_cnt > 1)) {
  56008. 8016f7a: 693b ldr r3, [r7, #16]
  56009. 8016f7c: b29b uxth r3, r3
  56010. if ((len == 0xffff && diff > 0xffffUL) ||
  56011. 8016f7e: 8bba ldrh r2, [r7, #28]
  56012. 8016f80: 429a cmp r2, r3
  56013. 8016f82: d11d bne.n 8016fc0 <lwip_netconn_do_writemore+0x1c0>
  56014. (len == (u16_t)diff && conn->current_msg->msg.w.vector_cnt > 1)) {
  56015. 8016f84: 687b ldr r3, [r7, #4]
  56016. 8016f86: 6adb ldr r3, [r3, #44] @ 0x2c
  56017. 8016f88: 899b ldrh r3, [r3, #12]
  56018. 8016f8a: 2b01 cmp r3, #1
  56019. 8016f8c: d918 bls.n 8016fc0 <lwip_netconn_do_writemore+0x1c0>
  56020. write_more = 1;
  56021. 8016f8e: 2301 movs r3, #1
  56022. 8016f90: 767b strb r3, [r7, #25]
  56023. apiflags |= TCP_WRITE_FLAG_MORE;
  56024. 8016f92: 7ebb ldrb r3, [r7, #26]
  56025. 8016f94: f043 0302 orr.w r3, r3, #2
  56026. 8016f98: 76bb strb r3, [r7, #26]
  56027. 8016f9a: e013 b.n 8016fc4 <lwip_netconn_do_writemore+0x1c4>
  56028. 8016f9c: 0802cedc .word 0x0802cedc
  56029. 8016fa0: 0802d034 .word 0x0802d034
  56030. 8016fa4: 0802cf20 .word 0x0802cf20
  56031. 8016fa8: 0802d33c .word 0x0802d33c
  56032. 8016fac: 0802d044 .word 0x0802d044
  56033. 8016fb0: 0802d35c .word 0x0802d35c
  56034. 8016fb4: 0802d374 .word 0x0802d374
  56035. 8016fb8: 0802d3b4 .word 0x0802d3b4
  56036. 8016fbc: 0802d3dc .word 0x0802d3dc
  56037. } else {
  56038. write_more = 0;
  56039. 8016fc0: 2300 movs r3, #0
  56040. 8016fc2: 767b strb r3, [r7, #25]
  56041. }
  56042. err = tcp_write(conn->pcb.tcp, dataptr, len, apiflags);
  56043. 8016fc4: 687b ldr r3, [r7, #4]
  56044. 8016fc6: 6858 ldr r0, [r3, #4]
  56045. 8016fc8: 7ebb ldrb r3, [r7, #26]
  56046. 8016fca: 8bba ldrh r2, [r7, #28]
  56047. 8016fcc: 6979 ldr r1, [r7, #20]
  56048. 8016fce: f008 f827 bl 801f020 <tcp_write>
  56049. 8016fd2: 4603 mov r3, r0
  56050. 8016fd4: 77fb strb r3, [r7, #31]
  56051. if (err == ERR_OK) {
  56052. 8016fd6: f997 301f ldrsb.w r3, [r7, #31]
  56053. 8016fda: 2b00 cmp r3, #0
  56054. 8016fdc: d12c bne.n 8017038 <lwip_netconn_do_writemore+0x238>
  56055. conn->current_msg->msg.w.offset += len;
  56056. 8016fde: 687b ldr r3, [r7, #4]
  56057. 8016fe0: 6adb ldr r3, [r3, #44] @ 0x2c
  56058. 8016fe2: 6999 ldr r1, [r3, #24]
  56059. 8016fe4: 8bba ldrh r2, [r7, #28]
  56060. 8016fe6: 687b ldr r3, [r7, #4]
  56061. 8016fe8: 6adb ldr r3, [r3, #44] @ 0x2c
  56062. 8016fea: 440a add r2, r1
  56063. 8016fec: 619a str r2, [r3, #24]
  56064. conn->current_msg->msg.w.vector_off += len;
  56065. 8016fee: 687b ldr r3, [r7, #4]
  56066. 8016ff0: 6adb ldr r3, [r3, #44] @ 0x2c
  56067. 8016ff2: 6919 ldr r1, [r3, #16]
  56068. 8016ff4: 8bba ldrh r2, [r7, #28]
  56069. 8016ff6: 687b ldr r3, [r7, #4]
  56070. 8016ff8: 6adb ldr r3, [r3, #44] @ 0x2c
  56071. 8016ffa: 440a add r2, r1
  56072. 8016ffc: 611a str r2, [r3, #16]
  56073. /* check if current vector is finished */
  56074. if (conn->current_msg->msg.w.vector_off == conn->current_msg->msg.w.vector->len) {
  56075. 8016ffe: 687b ldr r3, [r7, #4]
  56076. 8017000: 6adb ldr r3, [r3, #44] @ 0x2c
  56077. 8017002: 691a ldr r2, [r3, #16]
  56078. 8017004: 687b ldr r3, [r7, #4]
  56079. 8017006: 6adb ldr r3, [r3, #44] @ 0x2c
  56080. 8017008: 689b ldr r3, [r3, #8]
  56081. 801700a: 685b ldr r3, [r3, #4]
  56082. 801700c: 429a cmp r2, r3
  56083. 801700e: d113 bne.n 8017038 <lwip_netconn_do_writemore+0x238>
  56084. conn->current_msg->msg.w.vector_cnt--;
  56085. 8017010: 687b ldr r3, [r7, #4]
  56086. 8017012: 6adb ldr r3, [r3, #44] @ 0x2c
  56087. 8017014: 899a ldrh r2, [r3, #12]
  56088. 8017016: 3a01 subs r2, #1
  56089. 8017018: b292 uxth r2, r2
  56090. 801701a: 819a strh r2, [r3, #12]
  56091. /* if we have additional vectors, move on to them */
  56092. if (conn->current_msg->msg.w.vector_cnt > 0) {
  56093. 801701c: 687b ldr r3, [r7, #4]
  56094. 801701e: 6adb ldr r3, [r3, #44] @ 0x2c
  56095. 8017020: 899b ldrh r3, [r3, #12]
  56096. 8017022: 2b00 cmp r3, #0
  56097. 8017024: d008 beq.n 8017038 <lwip_netconn_do_writemore+0x238>
  56098. conn->current_msg->msg.w.vector++;
  56099. 8017026: 687b ldr r3, [r7, #4]
  56100. 8017028: 6adb ldr r3, [r3, #44] @ 0x2c
  56101. 801702a: 689a ldr r2, [r3, #8]
  56102. 801702c: 3208 adds r2, #8
  56103. 801702e: 609a str r2, [r3, #8]
  56104. conn->current_msg->msg.w.vector_off = 0;
  56105. 8017030: 687b ldr r3, [r7, #4]
  56106. 8017032: 6adb ldr r3, [r3, #44] @ 0x2c
  56107. 8017034: 2200 movs r2, #0
  56108. 8017036: 611a str r2, [r3, #16]
  56109. }
  56110. }
  56111. }
  56112. } while (write_more && err == ERR_OK);
  56113. 8017038: 7e7b ldrb r3, [r7, #25]
  56114. 801703a: 2b00 cmp r3, #0
  56115. 801703c: d004 beq.n 8017048 <lwip_netconn_do_writemore+0x248>
  56116. 801703e: f997 301f ldrsb.w r3, [r7, #31]
  56117. 8017042: 2b00 cmp r3, #0
  56118. 8017044: f43f af3e beq.w 8016ec4 <lwip_netconn_do_writemore+0xc4>
  56119. /* if OK or memory error, check available space */
  56120. if ((err == ERR_OK) || (err == ERR_MEM)) {
  56121. 8017048: f997 301f ldrsb.w r3, [r7, #31]
  56122. 801704c: 2b00 cmp r3, #0
  56123. 801704e: d004 beq.n 801705a <lwip_netconn_do_writemore+0x25a>
  56124. 8017050: f997 301f ldrsb.w r3, [r7, #31]
  56125. 8017054: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  56126. 8017058: d137 bne.n 80170ca <lwip_netconn_do_writemore+0x2ca>
  56127. err_mem:
  56128. 801705a: bf00 nop
  56129. if (dontblock && (conn->current_msg->msg.w.offset < conn->current_msg->msg.w.len)) {
  56130. 801705c: 7e3b ldrb r3, [r7, #24]
  56131. 801705e: 2b00 cmp r3, #0
  56132. 8017060: d01b beq.n 801709a <lwip_netconn_do_writemore+0x29a>
  56133. 8017062: 687b ldr r3, [r7, #4]
  56134. 8017064: 6adb ldr r3, [r3, #44] @ 0x2c
  56135. 8017066: 699a ldr r2, [r3, #24]
  56136. 8017068: 687b ldr r3, [r7, #4]
  56137. 801706a: 6adb ldr r3, [r3, #44] @ 0x2c
  56138. 801706c: 695b ldr r3, [r3, #20]
  56139. 801706e: 429a cmp r2, r3
  56140. 8017070: d213 bcs.n 801709a <lwip_netconn_do_writemore+0x29a>
  56141. /* non-blocking write did not write everything: mark the pcb non-writable
  56142. and let poll_tcp check writable space to mark the pcb writable again */
  56143. API_EVENT(conn, NETCONN_EVT_SENDMINUS, 0);
  56144. 8017072: 687b ldr r3, [r7, #4]
  56145. 8017074: 6b1b ldr r3, [r3, #48] @ 0x30
  56146. 8017076: 2b00 cmp r3, #0
  56147. 8017078: d005 beq.n 8017086 <lwip_netconn_do_writemore+0x286>
  56148. 801707a: 687b ldr r3, [r7, #4]
  56149. 801707c: 6b1b ldr r3, [r3, #48] @ 0x30
  56150. 801707e: 2200 movs r2, #0
  56151. 8017080: 2103 movs r1, #3
  56152. 8017082: 6878 ldr r0, [r7, #4]
  56153. 8017084: 4798 blx r3
  56154. conn->flags |= NETCONN_FLAG_CHECK_WRITESPACE;
  56155. 8017086: 687b ldr r3, [r7, #4]
  56156. 8017088: f893 3028 ldrb.w r3, [r3, #40] @ 0x28
  56157. 801708c: f043 0310 orr.w r3, r3, #16
  56158. 8017090: b2da uxtb r2, r3
  56159. 8017092: 687b ldr r3, [r7, #4]
  56160. 8017094: f883 2028 strb.w r2, [r3, #40] @ 0x28
  56161. 8017098: e017 b.n 80170ca <lwip_netconn_do_writemore+0x2ca>
  56162. } else if ((tcp_sndbuf(conn->pcb.tcp) <= TCP_SNDLOWAT) ||
  56163. 801709a: 687b ldr r3, [r7, #4]
  56164. 801709c: 685b ldr r3, [r3, #4]
  56165. 801709e: f8b3 3064 ldrh.w r3, [r3, #100] @ 0x64
  56166. 80170a2: f640 3269 movw r2, #2921 @ 0xb69
  56167. 80170a6: 4293 cmp r3, r2
  56168. 80170a8: d905 bls.n 80170b6 <lwip_netconn_do_writemore+0x2b6>
  56169. (tcp_sndqueuelen(conn->pcb.tcp) >= TCP_SNDQUEUELOWAT)) {
  56170. 80170aa: 687b ldr r3, [r7, #4]
  56171. 80170ac: 685b ldr r3, [r3, #4]
  56172. 80170ae: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  56173. } else if ((tcp_sndbuf(conn->pcb.tcp) <= TCP_SNDLOWAT) ||
  56174. 80170b2: 2b07 cmp r3, #7
  56175. 80170b4: d909 bls.n 80170ca <lwip_netconn_do_writemore+0x2ca>
  56176. /* The queued byte- or pbuf-count exceeds the configured low-water limit,
  56177. let select mark this pcb as non-writable. */
  56178. API_EVENT(conn, NETCONN_EVT_SENDMINUS, 0);
  56179. 80170b6: 687b ldr r3, [r7, #4]
  56180. 80170b8: 6b1b ldr r3, [r3, #48] @ 0x30
  56181. 80170ba: 2b00 cmp r3, #0
  56182. 80170bc: d005 beq.n 80170ca <lwip_netconn_do_writemore+0x2ca>
  56183. 80170be: 687b ldr r3, [r7, #4]
  56184. 80170c0: 6b1b ldr r3, [r3, #48] @ 0x30
  56185. 80170c2: 2200 movs r2, #0
  56186. 80170c4: 2103 movs r1, #3
  56187. 80170c6: 6878 ldr r0, [r7, #4]
  56188. 80170c8: 4798 blx r3
  56189. }
  56190. }
  56191. if (err == ERR_OK) {
  56192. 80170ca: f997 301f ldrsb.w r3, [r7, #31]
  56193. 80170ce: 2b00 cmp r3, #0
  56194. 80170d0: d11d bne.n 801710e <lwip_netconn_do_writemore+0x30e>
  56195. err_t out_err;
  56196. if ((conn->current_msg->msg.w.offset == conn->current_msg->msg.w.len) || dontblock) {
  56197. 80170d2: 687b ldr r3, [r7, #4]
  56198. 80170d4: 6adb ldr r3, [r3, #44] @ 0x2c
  56199. 80170d6: 699a ldr r2, [r3, #24]
  56200. 80170d8: 687b ldr r3, [r7, #4]
  56201. 80170da: 6adb ldr r3, [r3, #44] @ 0x2c
  56202. 80170dc: 695b ldr r3, [r3, #20]
  56203. 80170de: 429a cmp r2, r3
  56204. 80170e0: d002 beq.n 80170e8 <lwip_netconn_do_writemore+0x2e8>
  56205. 80170e2: 7e3b ldrb r3, [r7, #24]
  56206. 80170e4: 2b00 cmp r3, #0
  56207. 80170e6: d001 beq.n 80170ec <lwip_netconn_do_writemore+0x2ec>
  56208. /* return sent length (caller reads length from msg.w.offset) */
  56209. write_finished = 1;
  56210. 80170e8: 2301 movs r3, #1
  56211. 80170ea: 76fb strb r3, [r7, #27]
  56212. }
  56213. out_err = tcp_output(conn->pcb.tcp);
  56214. 80170ec: 687b ldr r3, [r7, #4]
  56215. 80170ee: 685b ldr r3, [r3, #4]
  56216. 80170f0: 4618 mov r0, r3
  56217. 80170f2: f008 fddf bl 801fcb4 <tcp_output>
  56218. 80170f6: 4603 mov r3, r0
  56219. 80170f8: 733b strb r3, [r7, #12]
  56220. if (out_err == ERR_RTE) {
  56221. 80170fa: f997 300c ldrsb.w r3, [r7, #12]
  56222. 80170fe: f113 0f04 cmn.w r3, #4
  56223. 8017102: d12c bne.n 801715e <lwip_netconn_do_writemore+0x35e>
  56224. /* If tcp_output fails because no route is found,
  56225. don't try writing any more but return the error
  56226. to the application thread. */
  56227. err = out_err;
  56228. 8017104: 7b3b ldrb r3, [r7, #12]
  56229. 8017106: 77fb strb r3, [r7, #31]
  56230. write_finished = 1;
  56231. 8017108: 2301 movs r3, #1
  56232. 801710a: 76fb strb r3, [r7, #27]
  56233. 801710c: e027 b.n 801715e <lwip_netconn_do_writemore+0x35e>
  56234. }
  56235. } else if (err == ERR_MEM) {
  56236. 801710e: f997 301f ldrsb.w r3, [r7, #31]
  56237. 8017112: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  56238. 8017116: d120 bne.n 801715a <lwip_netconn_do_writemore+0x35a>
  56239. For blocking sockets, we do NOT return to the application
  56240. thread, since ERR_MEM is only a temporary error! Non-blocking
  56241. will remain non-writable until sent_tcp/poll_tcp is called */
  56242. /* tcp_write returned ERR_MEM, try tcp_output anyway */
  56243. err_t out_err = tcp_output(conn->pcb.tcp);
  56244. 8017118: 687b ldr r3, [r7, #4]
  56245. 801711a: 685b ldr r3, [r3, #4]
  56246. 801711c: 4618 mov r0, r3
  56247. 801711e: f008 fdc9 bl 801fcb4 <tcp_output>
  56248. 8017122: 4603 mov r3, r0
  56249. 8017124: 737b strb r3, [r7, #13]
  56250. if (out_err == ERR_RTE) {
  56251. 8017126: f997 300d ldrsb.w r3, [r7, #13]
  56252. 801712a: f113 0f04 cmn.w r3, #4
  56253. 801712e: d104 bne.n 801713a <lwip_netconn_do_writemore+0x33a>
  56254. /* If tcp_output fails because no route is found,
  56255. don't try writing any more but return the error
  56256. to the application thread. */
  56257. err = out_err;
  56258. 8017130: 7b7b ldrb r3, [r7, #13]
  56259. 8017132: 77fb strb r3, [r7, #31]
  56260. write_finished = 1;
  56261. 8017134: 2301 movs r3, #1
  56262. 8017136: 76fb strb r3, [r7, #27]
  56263. 8017138: e011 b.n 801715e <lwip_netconn_do_writemore+0x35e>
  56264. } else if (dontblock) {
  56265. 801713a: 7e3b ldrb r3, [r7, #24]
  56266. 801713c: 2b00 cmp r3, #0
  56267. 801713e: d00e beq.n 801715e <lwip_netconn_do_writemore+0x35e>
  56268. /* non-blocking write is done on ERR_MEM, set error according
  56269. to partial write or not */
  56270. err = (conn->current_msg->msg.w.offset == 0) ? ERR_WOULDBLOCK : ERR_OK;
  56271. 8017140: 687b ldr r3, [r7, #4]
  56272. 8017142: 6adb ldr r3, [r3, #44] @ 0x2c
  56273. 8017144: 699b ldr r3, [r3, #24]
  56274. 8017146: 2b00 cmp r3, #0
  56275. 8017148: d102 bne.n 8017150 <lwip_netconn_do_writemore+0x350>
  56276. 801714a: f06f 0306 mvn.w r3, #6
  56277. 801714e: e000 b.n 8017152 <lwip_netconn_do_writemore+0x352>
  56278. 8017150: 2300 movs r3, #0
  56279. 8017152: 77fb strb r3, [r7, #31]
  56280. write_finished = 1;
  56281. 8017154: 2301 movs r3, #1
  56282. 8017156: 76fb strb r3, [r7, #27]
  56283. 8017158: e001 b.n 801715e <lwip_netconn_do_writemore+0x35e>
  56284. }
  56285. } else {
  56286. /* On errors != ERR_MEM, we don't try writing any more but return
  56287. the error to the application thread. */
  56288. write_finished = 1;
  56289. 801715a: 2301 movs r3, #1
  56290. 801715c: 76fb strb r3, [r7, #27]
  56291. }
  56292. }
  56293. if (write_finished) {
  56294. 801715e: 7efb ldrb r3, [r7, #27]
  56295. 8017160: 2b00 cmp r3, #0
  56296. 8017162: d015 beq.n 8017190 <lwip_netconn_do_writemore+0x390>
  56297. /* everything was written: set back connection state
  56298. and back to application task */
  56299. sys_sem_t *op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
  56300. 8017164: 687b ldr r3, [r7, #4]
  56301. 8017166: 6adb ldr r3, [r3, #44] @ 0x2c
  56302. 8017168: 681b ldr r3, [r3, #0]
  56303. 801716a: 330c adds r3, #12
  56304. 801716c: 60bb str r3, [r7, #8]
  56305. conn->current_msg->err = err;
  56306. 801716e: 687b ldr r3, [r7, #4]
  56307. 8017170: 6adb ldr r3, [r3, #44] @ 0x2c
  56308. 8017172: 7ffa ldrb r2, [r7, #31]
  56309. 8017174: 711a strb r2, [r3, #4]
  56310. conn->current_msg = NULL;
  56311. 8017176: 687b ldr r3, [r7, #4]
  56312. 8017178: 2200 movs r2, #0
  56313. 801717a: 62da str r2, [r3, #44] @ 0x2c
  56314. conn->state = NETCONN_NONE;
  56315. 801717c: 687b ldr r3, [r7, #4]
  56316. 801717e: 2200 movs r2, #0
  56317. 8017180: 705a strb r2, [r3, #1]
  56318. #if LWIP_TCPIP_CORE_LOCKING
  56319. if (delayed)
  56320. 8017182: 78fb ldrb r3, [r7, #3]
  56321. 8017184: 2b00 cmp r3, #0
  56322. 8017186: d006 beq.n 8017196 <lwip_netconn_do_writemore+0x396>
  56323. #endif
  56324. {
  56325. sys_sem_signal(op_completed_sem);
  56326. 8017188: 68b8 ldr r0, [r7, #8]
  56327. 801718a: f00f f8f3 bl 8026374 <sys_sem_signal>
  56328. 801718e: e002 b.n 8017196 <lwip_netconn_do_writemore+0x396>
  56329. }
  56330. }
  56331. #if LWIP_TCPIP_CORE_LOCKING
  56332. else {
  56333. return ERR_MEM;
  56334. 8017190: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  56335. 8017194: e000 b.n 8017198 <lwip_netconn_do_writemore+0x398>
  56336. }
  56337. #endif
  56338. return ERR_OK;
  56339. 8017196: 2300 movs r3, #0
  56340. }
  56341. 8017198: 4618 mov r0, r3
  56342. 801719a: 3720 adds r7, #32
  56343. 801719c: 46bd mov sp, r7
  56344. 801719e: bd80 pop {r7, pc}
  56345. 080171a0 <lwip_netconn_do_write>:
  56346. *
  56347. * @param m the api_msg pointing to the connection
  56348. */
  56349. void
  56350. lwip_netconn_do_write(void *m)
  56351. {
  56352. 80171a0: b580 push {r7, lr}
  56353. 80171a2: b084 sub sp, #16
  56354. 80171a4: af00 add r7, sp, #0
  56355. 80171a6: 6078 str r0, [r7, #4]
  56356. struct api_msg *msg = (struct api_msg *)m;
  56357. 80171a8: 687b ldr r3, [r7, #4]
  56358. 80171aa: 60bb str r3, [r7, #8]
  56359. err_t err = netconn_err(msg->conn);
  56360. 80171ac: 68bb ldr r3, [r7, #8]
  56361. 80171ae: 681b ldr r3, [r3, #0]
  56362. 80171b0: 4618 mov r0, r3
  56363. 80171b2: f7fe fca7 bl 8015b04 <netconn_err>
  56364. 80171b6: 4603 mov r3, r0
  56365. 80171b8: 73fb strb r3, [r7, #15]
  56366. if (err == ERR_OK) {
  56367. 80171ba: f997 300f ldrsb.w r3, [r7, #15]
  56368. 80171be: 2b00 cmp r3, #0
  56369. 80171c0: d164 bne.n 801728c <lwip_netconn_do_write+0xec>
  56370. if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {
  56371. 80171c2: 68bb ldr r3, [r7, #8]
  56372. 80171c4: 681b ldr r3, [r3, #0]
  56373. 80171c6: 781b ldrb r3, [r3, #0]
  56374. 80171c8: f003 03f0 and.w r3, r3, #240 @ 0xf0
  56375. 80171cc: 2b10 cmp r3, #16
  56376. 80171ce: d15b bne.n 8017288 <lwip_netconn_do_write+0xe8>
  56377. #if LWIP_TCP
  56378. if (msg->conn->state != NETCONN_NONE) {
  56379. 80171d0: 68bb ldr r3, [r7, #8]
  56380. 80171d2: 681b ldr r3, [r3, #0]
  56381. 80171d4: 785b ldrb r3, [r3, #1]
  56382. 80171d6: 2b00 cmp r3, #0
  56383. 80171d8: d002 beq.n 80171e0 <lwip_netconn_do_write+0x40>
  56384. /* netconn is connecting, closing or in blocking write */
  56385. err = ERR_INPROGRESS;
  56386. 80171da: 23fb movs r3, #251 @ 0xfb
  56387. 80171dc: 73fb strb r3, [r7, #15]
  56388. 80171de: e055 b.n 801728c <lwip_netconn_do_write+0xec>
  56389. } else if (msg->conn->pcb.tcp != NULL) {
  56390. 80171e0: 68bb ldr r3, [r7, #8]
  56391. 80171e2: 681b ldr r3, [r3, #0]
  56392. 80171e4: 685b ldr r3, [r3, #4]
  56393. 80171e6: 2b00 cmp r3, #0
  56394. 80171e8: d04b beq.n 8017282 <lwip_netconn_do_write+0xe2>
  56395. msg->conn->state = NETCONN_WRITE;
  56396. 80171ea: 68bb ldr r3, [r7, #8]
  56397. 80171ec: 681b ldr r3, [r3, #0]
  56398. 80171ee: 2201 movs r2, #1
  56399. 80171f0: 705a strb r2, [r3, #1]
  56400. /* set all the variables used by lwip_netconn_do_writemore */
  56401. LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL);
  56402. 80171f2: 68bb ldr r3, [r7, #8]
  56403. 80171f4: 681b ldr r3, [r3, #0]
  56404. 80171f6: 6adb ldr r3, [r3, #44] @ 0x2c
  56405. 80171f8: 2b00 cmp r3, #0
  56406. 80171fa: d006 beq.n 801720a <lwip_netconn_do_write+0x6a>
  56407. 80171fc: 4b27 ldr r3, [pc, #156] @ (801729c <lwip_netconn_do_write+0xfc>)
  56408. 80171fe: f240 7223 movw r2, #1827 @ 0x723
  56409. 8017202: 4927 ldr r1, [pc, #156] @ (80172a0 <lwip_netconn_do_write+0x100>)
  56410. 8017204: 4827 ldr r0, [pc, #156] @ (80172a4 <lwip_netconn_do_write+0x104>)
  56411. 8017206: f012 fbe1 bl 80299cc <iprintf>
  56412. LWIP_ASSERT("msg->msg.w.len != 0", msg->msg.w.len != 0);
  56413. 801720a: 68bb ldr r3, [r7, #8]
  56414. 801720c: 695b ldr r3, [r3, #20]
  56415. 801720e: 2b00 cmp r3, #0
  56416. 8017210: d106 bne.n 8017220 <lwip_netconn_do_write+0x80>
  56417. 8017212: 4b22 ldr r3, [pc, #136] @ (801729c <lwip_netconn_do_write+0xfc>)
  56418. 8017214: f240 7224 movw r2, #1828 @ 0x724
  56419. 8017218: 4923 ldr r1, [pc, #140] @ (80172a8 <lwip_netconn_do_write+0x108>)
  56420. 801721a: 4822 ldr r0, [pc, #136] @ (80172a4 <lwip_netconn_do_write+0x104>)
  56421. 801721c: f012 fbd6 bl 80299cc <iprintf>
  56422. msg->conn->current_msg = msg;
  56423. 8017220: 68bb ldr r3, [r7, #8]
  56424. 8017222: 681b ldr r3, [r3, #0]
  56425. 8017224: 68ba ldr r2, [r7, #8]
  56426. 8017226: 62da str r2, [r3, #44] @ 0x2c
  56427. #if LWIP_TCPIP_CORE_LOCKING
  56428. if (lwip_netconn_do_writemore(msg->conn, 0) != ERR_OK) {
  56429. 8017228: 68bb ldr r3, [r7, #8]
  56430. 801722a: 681b ldr r3, [r3, #0]
  56431. 801722c: 2100 movs r1, #0
  56432. 801722e: 4618 mov r0, r3
  56433. 8017230: f7ff fde6 bl 8016e00 <lwip_netconn_do_writemore>
  56434. 8017234: 4603 mov r3, r0
  56435. 8017236: 2b00 cmp r3, #0
  56436. 8017238: d02c beq.n 8017294 <lwip_netconn_do_write+0xf4>
  56437. LWIP_ASSERT("state!", msg->conn->state == NETCONN_WRITE);
  56438. 801723a: 68bb ldr r3, [r7, #8]
  56439. 801723c: 681b ldr r3, [r3, #0]
  56440. 801723e: 785b ldrb r3, [r3, #1]
  56441. 8017240: 2b01 cmp r3, #1
  56442. 8017242: d006 beq.n 8017252 <lwip_netconn_do_write+0xb2>
  56443. 8017244: 4b15 ldr r3, [pc, #84] @ (801729c <lwip_netconn_do_write+0xfc>)
  56444. 8017246: f44f 62e5 mov.w r2, #1832 @ 0x728
  56445. 801724a: 4918 ldr r1, [pc, #96] @ (80172ac <lwip_netconn_do_write+0x10c>)
  56446. 801724c: 4815 ldr r0, [pc, #84] @ (80172a4 <lwip_netconn_do_write+0x104>)
  56447. 801724e: f012 fbbd bl 80299cc <iprintf>
  56448. UNLOCK_TCPIP_CORE();
  56449. 8017252: f7f9 f95f bl 8010514 <sys_unlock_tcpip_core>
  56450. sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);
  56451. 8017256: 68bb ldr r3, [r7, #8]
  56452. 8017258: 681b ldr r3, [r3, #0]
  56453. 801725a: 330c adds r3, #12
  56454. 801725c: 2100 movs r1, #0
  56455. 801725e: 4618 mov r0, r3
  56456. 8017260: f00f f857 bl 8026312 <sys_arch_sem_wait>
  56457. LOCK_TCPIP_CORE();
  56458. 8017264: f7f9 f946 bl 80104f4 <sys_lock_tcpip_core>
  56459. LWIP_ASSERT("state!", msg->conn->state != NETCONN_WRITE);
  56460. 8017268: 68bb ldr r3, [r7, #8]
  56461. 801726a: 681b ldr r3, [r3, #0]
  56462. 801726c: 785b ldrb r3, [r3, #1]
  56463. 801726e: 2b01 cmp r3, #1
  56464. 8017270: d110 bne.n 8017294 <lwip_netconn_do_write+0xf4>
  56465. 8017272: 4b0a ldr r3, [pc, #40] @ (801729c <lwip_netconn_do_write+0xfc>)
  56466. 8017274: f240 722c movw r2, #1836 @ 0x72c
  56467. 8017278: 490c ldr r1, [pc, #48] @ (80172ac <lwip_netconn_do_write+0x10c>)
  56468. 801727a: 480a ldr r0, [pc, #40] @ (80172a4 <lwip_netconn_do_write+0x104>)
  56469. 801727c: f012 fba6 bl 80299cc <iprintf>
  56470. #else /* LWIP_TCPIP_CORE_LOCKING */
  56471. lwip_netconn_do_writemore(msg->conn);
  56472. #endif /* LWIP_TCPIP_CORE_LOCKING */
  56473. /* for both cases: if lwip_netconn_do_writemore was called, don't ACK the APIMSG
  56474. since lwip_netconn_do_writemore ACKs it! */
  56475. return;
  56476. 8017280: e008 b.n 8017294 <lwip_netconn_do_write+0xf4>
  56477. } else {
  56478. err = ERR_CONN;
  56479. 8017282: 23f5 movs r3, #245 @ 0xf5
  56480. 8017284: 73fb strb r3, [r7, #15]
  56481. 8017286: e001 b.n 801728c <lwip_netconn_do_write+0xec>
  56482. #else /* LWIP_TCP */
  56483. err = ERR_VAL;
  56484. #endif /* LWIP_TCP */
  56485. #if (LWIP_UDP || LWIP_RAW)
  56486. } else {
  56487. err = ERR_VAL;
  56488. 8017288: 23fa movs r3, #250 @ 0xfa
  56489. 801728a: 73fb strb r3, [r7, #15]
  56490. #endif /* (LWIP_UDP || LWIP_RAW) */
  56491. }
  56492. }
  56493. msg->err = err;
  56494. 801728c: 68bb ldr r3, [r7, #8]
  56495. 801728e: 7bfa ldrb r2, [r7, #15]
  56496. 8017290: 711a strb r2, [r3, #4]
  56497. 8017292: e000 b.n 8017296 <lwip_netconn_do_write+0xf6>
  56498. return;
  56499. 8017294: bf00 nop
  56500. TCPIP_APIMSG_ACK(msg);
  56501. }
  56502. 8017296: 3710 adds r7, #16
  56503. 8017298: 46bd mov sp, r7
  56504. 801729a: bd80 pop {r7, pc}
  56505. 801729c: 0802cedc .word 0x0802cedc
  56506. 80172a0: 0802d280 .word 0x0802d280
  56507. 80172a4: 0802cf20 .word 0x0802cf20
  56508. 80172a8: 0802d408 .word 0x0802d408
  56509. 80172ac: 0802d29c .word 0x0802d29c
  56510. 080172b0 <lwip_netconn_do_getaddr>:
  56511. *
  56512. * @param m the api_msg pointing to the connection
  56513. */
  56514. void
  56515. lwip_netconn_do_getaddr(void *m)
  56516. {
  56517. 80172b0: b580 push {r7, lr}
  56518. 80172b2: b084 sub sp, #16
  56519. 80172b4: af00 add r7, sp, #0
  56520. 80172b6: 6078 str r0, [r7, #4]
  56521. struct api_msg *msg = (struct api_msg *)m;
  56522. 80172b8: 687b ldr r3, [r7, #4]
  56523. 80172ba: 60fb str r3, [r7, #12]
  56524. if (msg->conn->pcb.ip != NULL) {
  56525. 80172bc: 68fb ldr r3, [r7, #12]
  56526. 80172be: 681b ldr r3, [r3, #0]
  56527. 80172c0: 685b ldr r3, [r3, #4]
  56528. 80172c2: 2b00 cmp r3, #0
  56529. 80172c4: d06b beq.n 801739e <lwip_netconn_do_getaddr+0xee>
  56530. if (msg->msg.ad.local) {
  56531. 80172c6: 68fb ldr r3, [r7, #12]
  56532. 80172c8: 7c1b ldrb r3, [r3, #16]
  56533. 80172ca: 2b00 cmp r3, #0
  56534. 80172cc: d007 beq.n 80172de <lwip_netconn_do_getaddr+0x2e>
  56535. ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr),
  56536. 80172ce: 68fb ldr r3, [r7, #12]
  56537. 80172d0: 681b ldr r3, [r3, #0]
  56538. 80172d2: 685a ldr r2, [r3, #4]
  56539. 80172d4: 68fb ldr r3, [r7, #12]
  56540. 80172d6: 689b ldr r3, [r3, #8]
  56541. 80172d8: 6812 ldr r2, [r2, #0]
  56542. 80172da: 601a str r2, [r3, #0]
  56543. 80172dc: e006 b.n 80172ec <lwip_netconn_do_getaddr+0x3c>
  56544. msg->conn->pcb.ip->local_ip);
  56545. } else {
  56546. ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr),
  56547. 80172de: 68fb ldr r3, [r7, #12]
  56548. 80172e0: 681b ldr r3, [r3, #0]
  56549. 80172e2: 685a ldr r2, [r3, #4]
  56550. 80172e4: 68fb ldr r3, [r7, #12]
  56551. 80172e6: 689b ldr r3, [r3, #8]
  56552. 80172e8: 6852 ldr r2, [r2, #4]
  56553. 80172ea: 601a str r2, [r3, #0]
  56554. msg->conn->pcb.ip->remote_ip);
  56555. }
  56556. msg->err = ERR_OK;
  56557. 80172ec: 68fb ldr r3, [r7, #12]
  56558. 80172ee: 2200 movs r2, #0
  56559. 80172f0: 711a strb r2, [r3, #4]
  56560. switch (NETCONNTYPE_GROUP(msg->conn->type)) {
  56561. 80172f2: 68fb ldr r3, [r7, #12]
  56562. 80172f4: 681b ldr r3, [r3, #0]
  56563. 80172f6: 781b ldrb r3, [r3, #0]
  56564. 80172f8: f003 03f0 and.w r3, r3, #240 @ 0xf0
  56565. 80172fc: 2b10 cmp r3, #16
  56566. 80172fe: d021 beq.n 8017344 <lwip_netconn_do_getaddr+0x94>
  56567. 8017300: 2b20 cmp r3, #32
  56568. 8017302: d144 bne.n 801738e <lwip_netconn_do_getaddr+0xde>
  56569. }
  56570. break;
  56571. #endif /* LWIP_RAW */
  56572. #if LWIP_UDP
  56573. case NETCONN_UDP:
  56574. if (msg->msg.ad.local) {
  56575. 8017304: 68fb ldr r3, [r7, #12]
  56576. 8017306: 7c1b ldrb r3, [r3, #16]
  56577. 8017308: 2b00 cmp r3, #0
  56578. 801730a: d007 beq.n 801731c <lwip_netconn_do_getaddr+0x6c>
  56579. API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->local_port;
  56580. 801730c: 68fb ldr r3, [r7, #12]
  56581. 801730e: 681b ldr r3, [r3, #0]
  56582. 8017310: 685a ldr r2, [r3, #4]
  56583. 8017312: 68fb ldr r3, [r7, #12]
  56584. 8017314: 68db ldr r3, [r3, #12]
  56585. 8017316: 8a52 ldrh r2, [r2, #18]
  56586. 8017318: 801a strh r2, [r3, #0]
  56587. msg->err = ERR_CONN;
  56588. } else {
  56589. API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->remote_port;
  56590. }
  56591. }
  56592. break;
  56593. 801731a: e044 b.n 80173a6 <lwip_netconn_do_getaddr+0xf6>
  56594. if ((msg->conn->pcb.udp->flags & UDP_FLAGS_CONNECTED) == 0) {
  56595. 801731c: 68fb ldr r3, [r7, #12]
  56596. 801731e: 681b ldr r3, [r3, #0]
  56597. 8017320: 685b ldr r3, [r3, #4]
  56598. 8017322: 7c1b ldrb r3, [r3, #16]
  56599. 8017324: f003 0304 and.w r3, r3, #4
  56600. 8017328: 2b00 cmp r3, #0
  56601. 801732a: d103 bne.n 8017334 <lwip_netconn_do_getaddr+0x84>
  56602. msg->err = ERR_CONN;
  56603. 801732c: 68fb ldr r3, [r7, #12]
  56604. 801732e: 22f5 movs r2, #245 @ 0xf5
  56605. 8017330: 711a strb r2, [r3, #4]
  56606. break;
  56607. 8017332: e038 b.n 80173a6 <lwip_netconn_do_getaddr+0xf6>
  56608. API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->remote_port;
  56609. 8017334: 68fb ldr r3, [r7, #12]
  56610. 8017336: 681b ldr r3, [r3, #0]
  56611. 8017338: 685a ldr r2, [r3, #4]
  56612. 801733a: 68fb ldr r3, [r7, #12]
  56613. 801733c: 68db ldr r3, [r3, #12]
  56614. 801733e: 8a92 ldrh r2, [r2, #20]
  56615. 8017340: 801a strh r2, [r3, #0]
  56616. break;
  56617. 8017342: e030 b.n 80173a6 <lwip_netconn_do_getaddr+0xf6>
  56618. #endif /* LWIP_UDP */
  56619. #if LWIP_TCP
  56620. case NETCONN_TCP:
  56621. if ((msg->msg.ad.local == 0) &&
  56622. 8017344: 68fb ldr r3, [r7, #12]
  56623. 8017346: 7c1b ldrb r3, [r3, #16]
  56624. 8017348: 2b00 cmp r3, #0
  56625. 801734a: d10f bne.n 801736c <lwip_netconn_do_getaddr+0xbc>
  56626. ((msg->conn->pcb.tcp->state == CLOSED) || (msg->conn->pcb.tcp->state == LISTEN))) {
  56627. 801734c: 68fb ldr r3, [r7, #12]
  56628. 801734e: 681b ldr r3, [r3, #0]
  56629. 8017350: 685b ldr r3, [r3, #4]
  56630. 8017352: 7d1b ldrb r3, [r3, #20]
  56631. if ((msg->msg.ad.local == 0) &&
  56632. 8017354: 2b00 cmp r3, #0
  56633. 8017356: d005 beq.n 8017364 <lwip_netconn_do_getaddr+0xb4>
  56634. ((msg->conn->pcb.tcp->state == CLOSED) || (msg->conn->pcb.tcp->state == LISTEN))) {
  56635. 8017358: 68fb ldr r3, [r7, #12]
  56636. 801735a: 681b ldr r3, [r3, #0]
  56637. 801735c: 685b ldr r3, [r3, #4]
  56638. 801735e: 7d1b ldrb r3, [r3, #20]
  56639. 8017360: 2b01 cmp r3, #1
  56640. 8017362: d103 bne.n 801736c <lwip_netconn_do_getaddr+0xbc>
  56641. /* pcb is not connected and remote name is requested */
  56642. msg->err = ERR_CONN;
  56643. 8017364: 68fb ldr r3, [r7, #12]
  56644. 8017366: 22f5 movs r2, #245 @ 0xf5
  56645. 8017368: 711a strb r2, [r3, #4]
  56646. } else {
  56647. API_EXPR_DEREF(msg->msg.ad.port) = (msg->msg.ad.local ? msg->conn->pcb.tcp->local_port : msg->conn->pcb.tcp->remote_port);
  56648. }
  56649. break;
  56650. 801736a: e01c b.n 80173a6 <lwip_netconn_do_getaddr+0xf6>
  56651. API_EXPR_DEREF(msg->msg.ad.port) = (msg->msg.ad.local ? msg->conn->pcb.tcp->local_port : msg->conn->pcb.tcp->remote_port);
  56652. 801736c: 68fb ldr r3, [r7, #12]
  56653. 801736e: 7c1b ldrb r3, [r3, #16]
  56654. 8017370: 2b00 cmp r3, #0
  56655. 8017372: d004 beq.n 801737e <lwip_netconn_do_getaddr+0xce>
  56656. 8017374: 68fb ldr r3, [r7, #12]
  56657. 8017376: 681b ldr r3, [r3, #0]
  56658. 8017378: 685b ldr r3, [r3, #4]
  56659. 801737a: 8adb ldrh r3, [r3, #22]
  56660. 801737c: e003 b.n 8017386 <lwip_netconn_do_getaddr+0xd6>
  56661. 801737e: 68fb ldr r3, [r7, #12]
  56662. 8017380: 681b ldr r3, [r3, #0]
  56663. 8017382: 685b ldr r3, [r3, #4]
  56664. 8017384: 8b1b ldrh r3, [r3, #24]
  56665. 8017386: 68fa ldr r2, [r7, #12]
  56666. 8017388: 68d2 ldr r2, [r2, #12]
  56667. 801738a: 8013 strh r3, [r2, #0]
  56668. break;
  56669. 801738c: e00b b.n 80173a6 <lwip_netconn_do_getaddr+0xf6>
  56670. #endif /* LWIP_TCP */
  56671. default:
  56672. LWIP_ASSERT("invalid netconn_type", 0);
  56673. 801738e: 4b08 ldr r3, [pc, #32] @ (80173b0 <lwip_netconn_do_getaddr+0x100>)
  56674. 8017390: f240 727d movw r2, #1917 @ 0x77d
  56675. 8017394: 4907 ldr r1, [pc, #28] @ (80173b4 <lwip_netconn_do_getaddr+0x104>)
  56676. 8017396: 4808 ldr r0, [pc, #32] @ (80173b8 <lwip_netconn_do_getaddr+0x108>)
  56677. 8017398: f012 fb18 bl 80299cc <iprintf>
  56678. break;
  56679. 801739c: e003 b.n 80173a6 <lwip_netconn_do_getaddr+0xf6>
  56680. }
  56681. } else {
  56682. msg->err = ERR_CONN;
  56683. 801739e: 68fb ldr r3, [r7, #12]
  56684. 80173a0: 22f5 movs r2, #245 @ 0xf5
  56685. 80173a2: 711a strb r2, [r3, #4]
  56686. }
  56687. TCPIP_APIMSG_ACK(msg);
  56688. }
  56689. 80173a4: bf00 nop
  56690. 80173a6: bf00 nop
  56691. 80173a8: 3710 adds r7, #16
  56692. 80173aa: 46bd mov sp, r7
  56693. 80173ac: bd80 pop {r7, pc}
  56694. 80173ae: bf00 nop
  56695. 80173b0: 0802cedc .word 0x0802cedc
  56696. 80173b4: 0802d41c .word 0x0802d41c
  56697. 80173b8: 0802cf20 .word 0x0802cf20
  56698. 080173bc <lwip_netconn_do_close>:
  56699. *
  56700. * @param m the api_msg pointing to the connection
  56701. */
  56702. void
  56703. lwip_netconn_do_close(void *m)
  56704. {
  56705. 80173bc: b580 push {r7, lr}
  56706. 80173be: b084 sub sp, #16
  56707. 80173c0: af00 add r7, sp, #0
  56708. 80173c2: 6078 str r0, [r7, #4]
  56709. struct api_msg *msg = (struct api_msg *)m;
  56710. 80173c4: 687b ldr r3, [r7, #4]
  56711. 80173c6: 60fb str r3, [r7, #12]
  56712. #if LWIP_TCP
  56713. enum netconn_state state = msg->conn->state;
  56714. 80173c8: 68fb ldr r3, [r7, #12]
  56715. 80173ca: 681b ldr r3, [r3, #0]
  56716. 80173cc: 785b ldrb r3, [r3, #1]
  56717. 80173ce: 72fb strb r3, [r7, #11]
  56718. /* First check if this is a TCP netconn and if it is in a correct state
  56719. (LISTEN doesn't support half shutdown) */
  56720. if ((msg->conn->pcb.tcp != NULL) &&
  56721. 80173d0: 68fb ldr r3, [r7, #12]
  56722. 80173d2: 681b ldr r3, [r3, #0]
  56723. 80173d4: 685b ldr r3, [r3, #4]
  56724. 80173d6: 2b00 cmp r3, #0
  56725. 80173d8: d067 beq.n 80174aa <lwip_netconn_do_close+0xee>
  56726. (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) &&
  56727. 80173da: 68fb ldr r3, [r7, #12]
  56728. 80173dc: 681b ldr r3, [r3, #0]
  56729. 80173de: 781b ldrb r3, [r3, #0]
  56730. 80173e0: f003 03f0 and.w r3, r3, #240 @ 0xf0
  56731. if ((msg->conn->pcb.tcp != NULL) &&
  56732. 80173e4: 2b10 cmp r3, #16
  56733. 80173e6: d160 bne.n 80174aa <lwip_netconn_do_close+0xee>
  56734. ((msg->msg.sd.shut == NETCONN_SHUT_RDWR) || (state != NETCONN_LISTEN))) {
  56735. 80173e8: 68fb ldr r3, [r7, #12]
  56736. 80173ea: 7a1b ldrb r3, [r3, #8]
  56737. (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) &&
  56738. 80173ec: 2b03 cmp r3, #3
  56739. 80173ee: d002 beq.n 80173f6 <lwip_netconn_do_close+0x3a>
  56740. ((msg->msg.sd.shut == NETCONN_SHUT_RDWR) || (state != NETCONN_LISTEN))) {
  56741. 80173f0: 7afb ldrb r3, [r7, #11]
  56742. 80173f2: 2b02 cmp r3, #2
  56743. 80173f4: d059 beq.n 80174aa <lwip_netconn_do_close+0xee>
  56744. /* Check if we are in a connected state */
  56745. if (state == NETCONN_CONNECT) {
  56746. 80173f6: 7afb ldrb r3, [r7, #11]
  56747. 80173f8: 2b03 cmp r3, #3
  56748. 80173fa: d103 bne.n 8017404 <lwip_netconn_do_close+0x48>
  56749. /* TCP connect in progress: cannot shutdown */
  56750. msg->err = ERR_CONN;
  56751. 80173fc: 68fb ldr r3, [r7, #12]
  56752. 80173fe: 22f5 movs r2, #245 @ 0xf5
  56753. 8017400: 711a strb r2, [r3, #4]
  56754. if (state == NETCONN_CONNECT) {
  56755. 8017402: e057 b.n 80174b4 <lwip_netconn_do_close+0xf8>
  56756. } else if (state == NETCONN_WRITE) {
  56757. 8017404: 7afb ldrb r3, [r7, #11]
  56758. 8017406: 2b01 cmp r3, #1
  56759. 8017408: d103 bne.n 8017412 <lwip_netconn_do_close+0x56>
  56760. msg->err = tcp_shutdown(msg->conn->pcb.tcp, 1, 0);
  56761. }
  56762. }
  56763. if (state == NETCONN_NONE) {
  56764. #else /* LWIP_NETCONN_FULLDUPLEX */
  56765. msg->err = ERR_INPROGRESS;
  56766. 801740a: 68fb ldr r3, [r7, #12]
  56767. 801740c: 22fb movs r2, #251 @ 0xfb
  56768. 801740e: 711a strb r2, [r3, #4]
  56769. if (state == NETCONN_CONNECT) {
  56770. 8017410: e050 b.n 80174b4 <lwip_netconn_do_close+0xf8>
  56771. } else {
  56772. #endif /* LWIP_NETCONN_FULLDUPLEX */
  56773. if (msg->msg.sd.shut & NETCONN_SHUT_RD) {
  56774. 8017412: 68fb ldr r3, [r7, #12]
  56775. 8017414: 7a1b ldrb r3, [r3, #8]
  56776. 8017416: f003 0301 and.w r3, r3, #1
  56777. 801741a: 2b00 cmp r3, #0
  56778. 801741c: d004 beq.n 8017428 <lwip_netconn_do_close+0x6c>
  56779. #if LWIP_NETCONN_FULLDUPLEX
  56780. /* Mark mboxes invalid */
  56781. netconn_mark_mbox_invalid(msg->conn);
  56782. #else /* LWIP_NETCONN_FULLDUPLEX */
  56783. netconn_drain(msg->conn);
  56784. 801741e: 68fb ldr r3, [r7, #12]
  56785. 8017420: 681b ldr r3, [r3, #0]
  56786. 8017422: 4618 mov r0, r3
  56787. 8017424: f7ff f82e bl 8016484 <netconn_drain>
  56788. #endif /* LWIP_NETCONN_FULLDUPLEX */
  56789. }
  56790. LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL);
  56791. 8017428: 68fb ldr r3, [r7, #12]
  56792. 801742a: 681b ldr r3, [r3, #0]
  56793. 801742c: 6adb ldr r3, [r3, #44] @ 0x2c
  56794. 801742e: 2b00 cmp r3, #0
  56795. 8017430: d006 beq.n 8017440 <lwip_netconn_do_close+0x84>
  56796. 8017432: 4b22 ldr r3, [pc, #136] @ (80174bc <lwip_netconn_do_close+0x100>)
  56797. 8017434: f240 72bd movw r2, #1981 @ 0x7bd
  56798. 8017438: 4921 ldr r1, [pc, #132] @ (80174c0 <lwip_netconn_do_close+0x104>)
  56799. 801743a: 4822 ldr r0, [pc, #136] @ (80174c4 <lwip_netconn_do_close+0x108>)
  56800. 801743c: f012 fac6 bl 80299cc <iprintf>
  56801. msg->conn->state = NETCONN_CLOSE;
  56802. 8017440: 68fb ldr r3, [r7, #12]
  56803. 8017442: 681b ldr r3, [r3, #0]
  56804. 8017444: 2204 movs r2, #4
  56805. 8017446: 705a strb r2, [r3, #1]
  56806. msg->conn->current_msg = msg;
  56807. 8017448: 68fb ldr r3, [r7, #12]
  56808. 801744a: 681b ldr r3, [r3, #0]
  56809. 801744c: 68fa ldr r2, [r7, #12]
  56810. 801744e: 62da str r2, [r3, #44] @ 0x2c
  56811. #if LWIP_TCPIP_CORE_LOCKING
  56812. if (lwip_netconn_do_close_internal(msg->conn, 0) != ERR_OK) {
  56813. 8017450: 68fb ldr r3, [r7, #12]
  56814. 8017452: 681b ldr r3, [r3, #0]
  56815. 8017454: 2100 movs r1, #0
  56816. 8017456: 4618 mov r0, r3
  56817. 8017458: f7ff f892 bl 8016580 <lwip_netconn_do_close_internal>
  56818. 801745c: 4603 mov r3, r0
  56819. 801745e: 2b00 cmp r3, #0
  56820. 8017460: d027 beq.n 80174b2 <lwip_netconn_do_close+0xf6>
  56821. LWIP_ASSERT("state!", msg->conn->state == NETCONN_CLOSE);
  56822. 8017462: 68fb ldr r3, [r7, #12]
  56823. 8017464: 681b ldr r3, [r3, #0]
  56824. 8017466: 785b ldrb r3, [r3, #1]
  56825. 8017468: 2b04 cmp r3, #4
  56826. 801746a: d006 beq.n 801747a <lwip_netconn_do_close+0xbe>
  56827. 801746c: 4b13 ldr r3, [pc, #76] @ (80174bc <lwip_netconn_do_close+0x100>)
  56828. 801746e: f240 72c2 movw r2, #1986 @ 0x7c2
  56829. 8017472: 4915 ldr r1, [pc, #84] @ (80174c8 <lwip_netconn_do_close+0x10c>)
  56830. 8017474: 4813 ldr r0, [pc, #76] @ (80174c4 <lwip_netconn_do_close+0x108>)
  56831. 8017476: f012 faa9 bl 80299cc <iprintf>
  56832. UNLOCK_TCPIP_CORE();
  56833. 801747a: f7f9 f84b bl 8010514 <sys_unlock_tcpip_core>
  56834. sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);
  56835. 801747e: 68fb ldr r3, [r7, #12]
  56836. 8017480: 681b ldr r3, [r3, #0]
  56837. 8017482: 330c adds r3, #12
  56838. 8017484: 2100 movs r1, #0
  56839. 8017486: 4618 mov r0, r3
  56840. 8017488: f00e ff43 bl 8026312 <sys_arch_sem_wait>
  56841. LOCK_TCPIP_CORE();
  56842. 801748c: f7f9 f832 bl 80104f4 <sys_lock_tcpip_core>
  56843. LWIP_ASSERT("state!", msg->conn->state == NETCONN_NONE);
  56844. 8017490: 68fb ldr r3, [r7, #12]
  56845. 8017492: 681b ldr r3, [r3, #0]
  56846. 8017494: 785b ldrb r3, [r3, #1]
  56847. 8017496: 2b00 cmp r3, #0
  56848. 8017498: d00b beq.n 80174b2 <lwip_netconn_do_close+0xf6>
  56849. 801749a: 4b08 ldr r3, [pc, #32] @ (80174bc <lwip_netconn_do_close+0x100>)
  56850. 801749c: f240 72c6 movw r2, #1990 @ 0x7c6
  56851. 80174a0: 4909 ldr r1, [pc, #36] @ (80174c8 <lwip_netconn_do_close+0x10c>)
  56852. 80174a2: 4808 ldr r0, [pc, #32] @ (80174c4 <lwip_netconn_do_close+0x108>)
  56853. 80174a4: f012 fa92 bl 80299cc <iprintf>
  56854. }
  56855. #else /* LWIP_TCPIP_CORE_LOCKING */
  56856. lwip_netconn_do_close_internal(msg->conn);
  56857. #endif /* LWIP_TCPIP_CORE_LOCKING */
  56858. /* for tcp netconns, lwip_netconn_do_close_internal ACKs the message */
  56859. return;
  56860. 80174a8: e003 b.n 80174b2 <lwip_netconn_do_close+0xf6>
  56861. }
  56862. } else
  56863. #endif /* LWIP_TCP */
  56864. {
  56865. msg->err = ERR_CONN;
  56866. 80174aa: 68fb ldr r3, [r7, #12]
  56867. 80174ac: 22f5 movs r2, #245 @ 0xf5
  56868. 80174ae: 711a strb r2, [r3, #4]
  56869. 80174b0: e000 b.n 80174b4 <lwip_netconn_do_close+0xf8>
  56870. return;
  56871. 80174b2: bf00 nop
  56872. }
  56873. TCPIP_APIMSG_ACK(msg);
  56874. }
  56875. 80174b4: 3710 adds r7, #16
  56876. 80174b6: 46bd mov sp, r7
  56877. 80174b8: bd80 pop {r7, pc}
  56878. 80174ba: bf00 nop
  56879. 80174bc: 0802cedc .word 0x0802cedc
  56880. 80174c0: 0802d280 .word 0x0802d280
  56881. 80174c4: 0802cf20 .word 0x0802cf20
  56882. 80174c8: 0802d29c .word 0x0802d29c
  56883. 080174cc <err_to_errno>:
  56884. EIO /* ERR_ARG -16 Illegal argument. */
  56885. };
  56886. int
  56887. err_to_errno(err_t err)
  56888. {
  56889. 80174cc: b480 push {r7}
  56890. 80174ce: b083 sub sp, #12
  56891. 80174d0: af00 add r7, sp, #0
  56892. 80174d2: 4603 mov r3, r0
  56893. 80174d4: 71fb strb r3, [r7, #7]
  56894. if ((err > 0) || (-err >= (err_t)LWIP_ARRAYSIZE(err_to_errno_table))) {
  56895. 80174d6: f997 3007 ldrsb.w r3, [r7, #7]
  56896. 80174da: 2b00 cmp r3, #0
  56897. 80174dc: dc04 bgt.n 80174e8 <err_to_errno+0x1c>
  56898. 80174de: f997 3007 ldrsb.w r3, [r7, #7]
  56899. 80174e2: f113 0f10 cmn.w r3, #16
  56900. 80174e6: da01 bge.n 80174ec <err_to_errno+0x20>
  56901. return EIO;
  56902. 80174e8: 2305 movs r3, #5
  56903. 80174ea: e005 b.n 80174f8 <err_to_errno+0x2c>
  56904. }
  56905. return err_to_errno_table[-err];
  56906. 80174ec: f997 3007 ldrsb.w r3, [r7, #7]
  56907. 80174f0: 425b negs r3, r3
  56908. 80174f2: 4a04 ldr r2, [pc, #16] @ (8017504 <err_to_errno+0x38>)
  56909. 80174f4: f852 3023 ldr.w r3, [r2, r3, lsl #2]
  56910. }
  56911. 80174f8: 4618 mov r0, r3
  56912. 80174fa: 370c adds r7, #12
  56913. 80174fc: 46bd mov sp, r7
  56914. 80174fe: f85d 7b04 ldr.w r7, [sp], #4
  56915. 8017502: 4770 bx lr
  56916. 8017504: 08030a78 .word 0x08030a78
  56917. 08017508 <netbuf_delete>:
  56918. *
  56919. * @param buf pointer to a netbuf allocated by netbuf_new()
  56920. */
  56921. void
  56922. netbuf_delete(struct netbuf *buf)
  56923. {
  56924. 8017508: b580 push {r7, lr}
  56925. 801750a: b082 sub sp, #8
  56926. 801750c: af00 add r7, sp, #0
  56927. 801750e: 6078 str r0, [r7, #4]
  56928. if (buf != NULL) {
  56929. 8017510: 687b ldr r3, [r7, #4]
  56930. 8017512: 2b00 cmp r3, #0
  56931. 8017514: d013 beq.n 801753e <netbuf_delete+0x36>
  56932. if (buf->p != NULL) {
  56933. 8017516: 687b ldr r3, [r7, #4]
  56934. 8017518: 681b ldr r3, [r3, #0]
  56935. 801751a: 2b00 cmp r3, #0
  56936. 801751c: d00b beq.n 8017536 <netbuf_delete+0x2e>
  56937. pbuf_free(buf->p);
  56938. 801751e: 687b ldr r3, [r7, #4]
  56939. 8017520: 681b ldr r3, [r3, #0]
  56940. 8017522: 4618 mov r0, r3
  56941. 8017524: f002 ffda bl 801a4dc <pbuf_free>
  56942. buf->p = buf->ptr = NULL;
  56943. 8017528: 687b ldr r3, [r7, #4]
  56944. 801752a: 2200 movs r2, #0
  56945. 801752c: 605a str r2, [r3, #4]
  56946. 801752e: 687b ldr r3, [r7, #4]
  56947. 8017530: 685a ldr r2, [r3, #4]
  56948. 8017532: 687b ldr r3, [r7, #4]
  56949. 8017534: 601a str r2, [r3, #0]
  56950. }
  56951. memp_free(MEMP_NETBUF, buf);
  56952. 8017536: 6879 ldr r1, [r7, #4]
  56953. 8017538: 2006 movs r0, #6
  56954. 801753a: f002 f8e1 bl 8019700 <memp_free>
  56955. }
  56956. }
  56957. 801753e: bf00 nop
  56958. 8017540: 3708 adds r7, #8
  56959. 8017542: 46bd mov sp, r7
  56960. 8017544: bd80 pop {r7, pc}
  56961. ...
  56962. 08017548 <netbuf_free>:
  56963. *
  56964. * @param buf pointer to the netbuf which contains the packet buffer to free
  56965. */
  56966. void
  56967. netbuf_free(struct netbuf *buf)
  56968. {
  56969. 8017548: b580 push {r7, lr}
  56970. 801754a: b082 sub sp, #8
  56971. 801754c: af00 add r7, sp, #0
  56972. 801754e: 6078 str r0, [r7, #4]
  56973. LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;);
  56974. 8017550: 687b ldr r3, [r7, #4]
  56975. 8017552: 2b00 cmp r3, #0
  56976. 8017554: d106 bne.n 8017564 <netbuf_free+0x1c>
  56977. 8017556: 4b0d ldr r3, [pc, #52] @ (801758c <netbuf_free+0x44>)
  56978. 8017558: 2281 movs r2, #129 @ 0x81
  56979. 801755a: 490d ldr r1, [pc, #52] @ (8017590 <netbuf_free+0x48>)
  56980. 801755c: 480d ldr r0, [pc, #52] @ (8017594 <netbuf_free+0x4c>)
  56981. 801755e: f012 fa35 bl 80299cc <iprintf>
  56982. 8017562: e00f b.n 8017584 <netbuf_free+0x3c>
  56983. if (buf->p != NULL) {
  56984. 8017564: 687b ldr r3, [r7, #4]
  56985. 8017566: 681b ldr r3, [r3, #0]
  56986. 8017568: 2b00 cmp r3, #0
  56987. 801756a: d004 beq.n 8017576 <netbuf_free+0x2e>
  56988. pbuf_free(buf->p);
  56989. 801756c: 687b ldr r3, [r7, #4]
  56990. 801756e: 681b ldr r3, [r3, #0]
  56991. 8017570: 4618 mov r0, r3
  56992. 8017572: f002 ffb3 bl 801a4dc <pbuf_free>
  56993. }
  56994. buf->p = buf->ptr = NULL;
  56995. 8017576: 687b ldr r3, [r7, #4]
  56996. 8017578: 2200 movs r2, #0
  56997. 801757a: 605a str r2, [r3, #4]
  56998. 801757c: 687b ldr r3, [r7, #4]
  56999. 801757e: 685a ldr r2, [r3, #4]
  57000. 8017580: 687b ldr r3, [r7, #4]
  57001. 8017582: 601a str r2, [r3, #0]
  57002. #if LWIP_CHECKSUM_ON_COPY
  57003. buf->flags = 0;
  57004. buf->toport_chksum = 0;
  57005. #endif /* LWIP_CHECKSUM_ON_COPY */
  57006. }
  57007. 8017584: 3708 adds r7, #8
  57008. 8017586: 46bd mov sp, r7
  57009. 8017588: bd80 pop {r7, pc}
  57010. 801758a: bf00 nop
  57011. 801758c: 0802d434 .word 0x0802d434
  57012. 8017590: 0802d4d0 .word 0x0802d4d0
  57013. 8017594: 0802d484 .word 0x0802d484
  57014. 08017598 <netbuf_ref>:
  57015. * @return ERR_OK if data is referenced
  57016. * ERR_MEM if data couldn't be referenced due to lack of memory
  57017. */
  57018. err_t
  57019. netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size)
  57020. {
  57021. 8017598: b580 push {r7, lr}
  57022. 801759a: b084 sub sp, #16
  57023. 801759c: af00 add r7, sp, #0
  57024. 801759e: 60f8 str r0, [r7, #12]
  57025. 80175a0: 60b9 str r1, [r7, #8]
  57026. 80175a2: 4613 mov r3, r2
  57027. 80175a4: 80fb strh r3, [r7, #6]
  57028. LWIP_ERROR("netbuf_ref: invalid buf", (buf != NULL), return ERR_ARG;);
  57029. 80175a6: 68fb ldr r3, [r7, #12]
  57030. 80175a8: 2b00 cmp r3, #0
  57031. 80175aa: d108 bne.n 80175be <netbuf_ref+0x26>
  57032. 80175ac: 4b1c ldr r3, [pc, #112] @ (8017620 <netbuf_ref+0x88>)
  57033. 80175ae: 2299 movs r2, #153 @ 0x99
  57034. 80175b0: 491c ldr r1, [pc, #112] @ (8017624 <netbuf_ref+0x8c>)
  57035. 80175b2: 481d ldr r0, [pc, #116] @ (8017628 <netbuf_ref+0x90>)
  57036. 80175b4: f012 fa0a bl 80299cc <iprintf>
  57037. 80175b8: f06f 030f mvn.w r3, #15
  57038. 80175bc: e02b b.n 8017616 <netbuf_ref+0x7e>
  57039. if (buf->p != NULL) {
  57040. 80175be: 68fb ldr r3, [r7, #12]
  57041. 80175c0: 681b ldr r3, [r3, #0]
  57042. 80175c2: 2b00 cmp r3, #0
  57043. 80175c4: d004 beq.n 80175d0 <netbuf_ref+0x38>
  57044. pbuf_free(buf->p);
  57045. 80175c6: 68fb ldr r3, [r7, #12]
  57046. 80175c8: 681b ldr r3, [r3, #0]
  57047. 80175ca: 4618 mov r0, r3
  57048. 80175cc: f002 ff86 bl 801a4dc <pbuf_free>
  57049. }
  57050. buf->p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);
  57051. 80175d0: 2241 movs r2, #65 @ 0x41
  57052. 80175d2: 2100 movs r1, #0
  57053. 80175d4: 2036 movs r0, #54 @ 0x36
  57054. 80175d6: f002 fc6b bl 8019eb0 <pbuf_alloc>
  57055. 80175da: 4602 mov r2, r0
  57056. 80175dc: 68fb ldr r3, [r7, #12]
  57057. 80175de: 601a str r2, [r3, #0]
  57058. if (buf->p == NULL) {
  57059. 80175e0: 68fb ldr r3, [r7, #12]
  57060. 80175e2: 681b ldr r3, [r3, #0]
  57061. 80175e4: 2b00 cmp r3, #0
  57062. 80175e6: d105 bne.n 80175f4 <netbuf_ref+0x5c>
  57063. buf->ptr = NULL;
  57064. 80175e8: 68fb ldr r3, [r7, #12]
  57065. 80175ea: 2200 movs r2, #0
  57066. 80175ec: 605a str r2, [r3, #4]
  57067. return ERR_MEM;
  57068. 80175ee: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  57069. 80175f2: e010 b.n 8017616 <netbuf_ref+0x7e>
  57070. }
  57071. ((struct pbuf_rom *)buf->p)->payload = dataptr;
  57072. 80175f4: 68fb ldr r3, [r7, #12]
  57073. 80175f6: 681b ldr r3, [r3, #0]
  57074. 80175f8: 68ba ldr r2, [r7, #8]
  57075. 80175fa: 605a str r2, [r3, #4]
  57076. buf->p->len = buf->p->tot_len = size;
  57077. 80175fc: 68fb ldr r3, [r7, #12]
  57078. 80175fe: 681b ldr r3, [r3, #0]
  57079. 8017600: 88fa ldrh r2, [r7, #6]
  57080. 8017602: 811a strh r2, [r3, #8]
  57081. 8017604: 68fa ldr r2, [r7, #12]
  57082. 8017606: 6812 ldr r2, [r2, #0]
  57083. 8017608: 891b ldrh r3, [r3, #8]
  57084. 801760a: 8153 strh r3, [r2, #10]
  57085. buf->ptr = buf->p;
  57086. 801760c: 68fb ldr r3, [r7, #12]
  57087. 801760e: 681a ldr r2, [r3, #0]
  57088. 8017610: 68fb ldr r3, [r7, #12]
  57089. 8017612: 605a str r2, [r3, #4]
  57090. return ERR_OK;
  57091. 8017614: 2300 movs r3, #0
  57092. }
  57093. 8017616: 4618 mov r0, r3
  57094. 8017618: 3710 adds r7, #16
  57095. 801761a: 46bd mov sp, r7
  57096. 801761c: bd80 pop {r7, pc}
  57097. 801761e: bf00 nop
  57098. 8017620: 0802d434 .word 0x0802d434
  57099. 8017624: 0802d4ec .word 0x0802d4ec
  57100. 8017628: 0802d484 .word 0x0802d484
  57101. 0801762c <tryget_socket_unconn_nouse>:
  57102. #endif /* LWIP_NETCONN_FULLDUPLEX */
  57103. /* Translate a socket 'int' into a pointer (only fails if the index is invalid) */
  57104. static struct lwip_sock *
  57105. tryget_socket_unconn_nouse(int fd)
  57106. {
  57107. 801762c: b480 push {r7}
  57108. 801762e: b085 sub sp, #20
  57109. 8017630: af00 add r7, sp, #0
  57110. 8017632: 6078 str r0, [r7, #4]
  57111. int s = fd - LWIP_SOCKET_OFFSET;
  57112. 8017634: 687b ldr r3, [r7, #4]
  57113. 8017636: 60fb str r3, [r7, #12]
  57114. if ((s < 0) || (s >= NUM_SOCKETS)) {
  57115. 8017638: 68fb ldr r3, [r7, #12]
  57116. 801763a: 2b00 cmp r3, #0
  57117. 801763c: db02 blt.n 8017644 <tryget_socket_unconn_nouse+0x18>
  57118. 801763e: 68fb ldr r3, [r7, #12]
  57119. 8017640: 2b03 cmp r3, #3
  57120. 8017642: dd01 ble.n 8017648 <tryget_socket_unconn_nouse+0x1c>
  57121. LWIP_DEBUGF(SOCKETS_DEBUG, ("tryget_socket_unconn(%d): invalid\n", fd));
  57122. return NULL;
  57123. 8017644: 2300 movs r3, #0
  57124. 8017646: e003 b.n 8017650 <tryget_socket_unconn_nouse+0x24>
  57125. }
  57126. return &sockets[s];
  57127. 8017648: 68fb ldr r3, [r7, #12]
  57128. 801764a: 011b lsls r3, r3, #4
  57129. 801764c: 4a03 ldr r2, [pc, #12] @ (801765c <tryget_socket_unconn_nouse+0x30>)
  57130. 801764e: 4413 add r3, r2
  57131. }
  57132. 8017650: 4618 mov r0, r3
  57133. 8017652: 3714 adds r7, #20
  57134. 8017654: 46bd mov sp, r7
  57135. 8017656: f85d 7b04 ldr.w r7, [sp], #4
  57136. 801765a: 4770 bx lr
  57137. 801765c: 240242e4 .word 0x240242e4
  57138. 08017660 <tryget_socket_unconn>:
  57139. }
  57140. /* Translate a socket 'int' into a pointer (only fails if the index is invalid) */
  57141. static struct lwip_sock *
  57142. tryget_socket_unconn(int fd)
  57143. {
  57144. 8017660: b580 push {r7, lr}
  57145. 8017662: b084 sub sp, #16
  57146. 8017664: af00 add r7, sp, #0
  57147. 8017666: 6078 str r0, [r7, #4]
  57148. struct lwip_sock *ret = tryget_socket_unconn_nouse(fd);
  57149. 8017668: 6878 ldr r0, [r7, #4]
  57150. 801766a: f7ff ffdf bl 801762c <tryget_socket_unconn_nouse>
  57151. 801766e: 60f8 str r0, [r7, #12]
  57152. if (ret != NULL) {
  57153. if (!sock_inc_used(ret)) {
  57154. return NULL;
  57155. }
  57156. }
  57157. return ret;
  57158. 8017670: 68fb ldr r3, [r7, #12]
  57159. }
  57160. 8017672: 4618 mov r0, r3
  57161. 8017674: 3710 adds r7, #16
  57162. 8017676: 46bd mov sp, r7
  57163. 8017678: bd80 pop {r7, pc}
  57164. 0801767a <tryget_socket>:
  57165. * @param fd externally used socket index
  57166. * @return struct lwip_sock for the socket or NULL if not found
  57167. */
  57168. static struct lwip_sock *
  57169. tryget_socket(int fd)
  57170. {
  57171. 801767a: b580 push {r7, lr}
  57172. 801767c: b084 sub sp, #16
  57173. 801767e: af00 add r7, sp, #0
  57174. 8017680: 6078 str r0, [r7, #4]
  57175. struct lwip_sock *sock = tryget_socket_unconn(fd);
  57176. 8017682: 6878 ldr r0, [r7, #4]
  57177. 8017684: f7ff ffec bl 8017660 <tryget_socket_unconn>
  57178. 8017688: 60f8 str r0, [r7, #12]
  57179. if (sock != NULL) {
  57180. 801768a: 68fb ldr r3, [r7, #12]
  57181. 801768c: 2b00 cmp r3, #0
  57182. 801768e: d005 beq.n 801769c <tryget_socket+0x22>
  57183. if (sock->conn) {
  57184. 8017690: 68fb ldr r3, [r7, #12]
  57185. 8017692: 681b ldr r3, [r3, #0]
  57186. 8017694: 2b00 cmp r3, #0
  57187. 8017696: d001 beq.n 801769c <tryget_socket+0x22>
  57188. return sock;
  57189. 8017698: 68fb ldr r3, [r7, #12]
  57190. 801769a: e000 b.n 801769e <tryget_socket+0x24>
  57191. }
  57192. done_socket(sock);
  57193. }
  57194. return NULL;
  57195. 801769c: 2300 movs r3, #0
  57196. }
  57197. 801769e: 4618 mov r0, r3
  57198. 80176a0: 3710 adds r7, #16
  57199. 80176a2: 46bd mov sp, r7
  57200. 80176a4: bd80 pop {r7, pc}
  57201. ...
  57202. 080176a8 <get_socket>:
  57203. * @param fd externally used socket index
  57204. * @return struct lwip_sock for the socket or NULL if not found
  57205. */
  57206. static struct lwip_sock *
  57207. get_socket(int fd)
  57208. {
  57209. 80176a8: b580 push {r7, lr}
  57210. 80176aa: b084 sub sp, #16
  57211. 80176ac: af00 add r7, sp, #0
  57212. 80176ae: 6078 str r0, [r7, #4]
  57213. struct lwip_sock *sock = tryget_socket(fd);
  57214. 80176b0: 6878 ldr r0, [r7, #4]
  57215. 80176b2: f7ff ffe2 bl 801767a <tryget_socket>
  57216. 80176b6: 60f8 str r0, [r7, #12]
  57217. if (!sock) {
  57218. 80176b8: 68fb ldr r3, [r7, #12]
  57219. 80176ba: 2b00 cmp r3, #0
  57220. 80176bc: d104 bne.n 80176c8 <get_socket+0x20>
  57221. if ((fd < LWIP_SOCKET_OFFSET) || (fd >= (LWIP_SOCKET_OFFSET + NUM_SOCKETS))) {
  57222. LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): invalid\n", fd));
  57223. }
  57224. set_errno(EBADF);
  57225. 80176be: 4b05 ldr r3, [pc, #20] @ (80176d4 <get_socket+0x2c>)
  57226. 80176c0: 2209 movs r2, #9
  57227. 80176c2: 601a str r2, [r3, #0]
  57228. return NULL;
  57229. 80176c4: 2300 movs r3, #0
  57230. 80176c6: e000 b.n 80176ca <get_socket+0x22>
  57231. }
  57232. return sock;
  57233. 80176c8: 68fb ldr r3, [r7, #12]
  57234. }
  57235. 80176ca: 4618 mov r0, r3
  57236. 80176cc: 3710 adds r7, #16
  57237. 80176ce: 46bd mov sp, r7
  57238. 80176d0: bd80 pop {r7, pc}
  57239. 80176d2: bf00 nop
  57240. 80176d4: 2402b180 .word 0x2402b180
  57241. 080176d8 <alloc_socket>:
  57242. * 0 if socket has been created by socket()
  57243. * @return the index of the new socket; -1 on error
  57244. */
  57245. static int
  57246. alloc_socket(struct netconn *newconn, int accepted)
  57247. {
  57248. 80176d8: b580 push {r7, lr}
  57249. 80176da: b084 sub sp, #16
  57250. 80176dc: af00 add r7, sp, #0
  57251. 80176de: 6078 str r0, [r7, #4]
  57252. 80176e0: 6039 str r1, [r7, #0]
  57253. int i;
  57254. SYS_ARCH_DECL_PROTECT(lev);
  57255. LWIP_UNUSED_ARG(accepted);
  57256. /* allocate a new socket identifier */
  57257. for (i = 0; i < NUM_SOCKETS; ++i) {
  57258. 80176e2: 2300 movs r3, #0
  57259. 80176e4: 60fb str r3, [r7, #12]
  57260. 80176e6: e052 b.n 801778e <alloc_socket+0xb6>
  57261. /* Protect socket array */
  57262. SYS_ARCH_PROTECT(lev);
  57263. 80176e8: f00e feda bl 80264a0 <sys_arch_protect>
  57264. 80176ec: 60b8 str r0, [r7, #8]
  57265. if (!sockets[i].conn) {
  57266. 80176ee: 4a2c ldr r2, [pc, #176] @ (80177a0 <alloc_socket+0xc8>)
  57267. 80176f0: 68fb ldr r3, [r7, #12]
  57268. 80176f2: 011b lsls r3, r3, #4
  57269. 80176f4: 4413 add r3, r2
  57270. 80176f6: 681b ldr r3, [r3, #0]
  57271. 80176f8: 2b00 cmp r3, #0
  57272. 80176fa: d142 bne.n 8017782 <alloc_socket+0xaa>
  57273. continue;
  57274. }
  57275. sockets[i].fd_used = 1;
  57276. sockets[i].fd_free_pending = 0;
  57277. #endif
  57278. sockets[i].conn = newconn;
  57279. 80176fc: 4a28 ldr r2, [pc, #160] @ (80177a0 <alloc_socket+0xc8>)
  57280. 80176fe: 68fb ldr r3, [r7, #12]
  57281. 8017700: 011b lsls r3, r3, #4
  57282. 8017702: 4413 add r3, r2
  57283. 8017704: 687a ldr r2, [r7, #4]
  57284. 8017706: 601a str r2, [r3, #0]
  57285. /* The socket is not yet known to anyone, so no need to protect
  57286. after having marked it as used. */
  57287. SYS_ARCH_UNPROTECT(lev);
  57288. 8017708: 68b8 ldr r0, [r7, #8]
  57289. 801770a: f00e fed7 bl 80264bc <sys_arch_unprotect>
  57290. sockets[i].lastdata.pbuf = NULL;
  57291. 801770e: 4a24 ldr r2, [pc, #144] @ (80177a0 <alloc_socket+0xc8>)
  57292. 8017710: 68fb ldr r3, [r7, #12]
  57293. 8017712: 011b lsls r3, r3, #4
  57294. 8017714: 4413 add r3, r2
  57295. 8017716: 3304 adds r3, #4
  57296. 8017718: 2200 movs r2, #0
  57297. 801771a: 601a str r2, [r3, #0]
  57298. #if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
  57299. LWIP_ASSERT("sockets[i].select_waiting == 0", sockets[i].select_waiting == 0);
  57300. 801771c: 4a20 ldr r2, [pc, #128] @ (80177a0 <alloc_socket+0xc8>)
  57301. 801771e: 68fb ldr r3, [r7, #12]
  57302. 8017720: 011b lsls r3, r3, #4
  57303. 8017722: 4413 add r3, r2
  57304. 8017724: 330e adds r3, #14
  57305. 8017726: 781b ldrb r3, [r3, #0]
  57306. 8017728: 2b00 cmp r3, #0
  57307. 801772a: d006 beq.n 801773a <alloc_socket+0x62>
  57308. 801772c: 4b1d ldr r3, [pc, #116] @ (80177a4 <alloc_socket+0xcc>)
  57309. 801772e: f240 220e movw r2, #526 @ 0x20e
  57310. 8017732: 491d ldr r1, [pc, #116] @ (80177a8 <alloc_socket+0xd0>)
  57311. 8017734: 481d ldr r0, [pc, #116] @ (80177ac <alloc_socket+0xd4>)
  57312. 8017736: f012 f949 bl 80299cc <iprintf>
  57313. sockets[i].rcvevent = 0;
  57314. 801773a: 4a19 ldr r2, [pc, #100] @ (80177a0 <alloc_socket+0xc8>)
  57315. 801773c: 68fb ldr r3, [r7, #12]
  57316. 801773e: 011b lsls r3, r3, #4
  57317. 8017740: 4413 add r3, r2
  57318. 8017742: 3308 adds r3, #8
  57319. 8017744: 2200 movs r2, #0
  57320. 8017746: 801a strh r2, [r3, #0]
  57321. /* TCP sendbuf is empty, but the socket is not yet writable until connected
  57322. * (unless it has been created by accept()). */
  57323. sockets[i].sendevent = (NETCONNTYPE_GROUP(newconn->type) == NETCONN_TCP ? (accepted != 0) : 1);
  57324. 8017748: 687b ldr r3, [r7, #4]
  57325. 801774a: 781b ldrb r3, [r3, #0]
  57326. 801774c: f003 03f0 and.w r3, r3, #240 @ 0xf0
  57327. 8017750: 2b10 cmp r3, #16
  57328. 8017752: d102 bne.n 801775a <alloc_socket+0x82>
  57329. 8017754: 683b ldr r3, [r7, #0]
  57330. 8017756: 2b00 cmp r3, #0
  57331. 8017758: d001 beq.n 801775e <alloc_socket+0x86>
  57332. 801775a: 2301 movs r3, #1
  57333. 801775c: e000 b.n 8017760 <alloc_socket+0x88>
  57334. 801775e: 2300 movs r3, #0
  57335. 8017760: b299 uxth r1, r3
  57336. 8017762: 4a0f ldr r2, [pc, #60] @ (80177a0 <alloc_socket+0xc8>)
  57337. 8017764: 68fb ldr r3, [r7, #12]
  57338. 8017766: 011b lsls r3, r3, #4
  57339. 8017768: 4413 add r3, r2
  57340. 801776a: 330a adds r3, #10
  57341. 801776c: 460a mov r2, r1
  57342. 801776e: 801a strh r2, [r3, #0]
  57343. sockets[i].errevent = 0;
  57344. 8017770: 4a0b ldr r2, [pc, #44] @ (80177a0 <alloc_socket+0xc8>)
  57345. 8017772: 68fb ldr r3, [r7, #12]
  57346. 8017774: 011b lsls r3, r3, #4
  57347. 8017776: 4413 add r3, r2
  57348. 8017778: 330c adds r3, #12
  57349. 801777a: 2200 movs r2, #0
  57350. 801777c: 801a strh r2, [r3, #0]
  57351. #endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
  57352. return i + LWIP_SOCKET_OFFSET;
  57353. 801777e: 68fb ldr r3, [r7, #12]
  57354. 8017780: e00a b.n 8017798 <alloc_socket+0xc0>
  57355. }
  57356. SYS_ARCH_UNPROTECT(lev);
  57357. 8017782: 68b8 ldr r0, [r7, #8]
  57358. 8017784: f00e fe9a bl 80264bc <sys_arch_unprotect>
  57359. for (i = 0; i < NUM_SOCKETS; ++i) {
  57360. 8017788: 68fb ldr r3, [r7, #12]
  57361. 801778a: 3301 adds r3, #1
  57362. 801778c: 60fb str r3, [r7, #12]
  57363. 801778e: 68fb ldr r3, [r7, #12]
  57364. 8017790: 2b03 cmp r3, #3
  57365. 8017792: dda9 ble.n 80176e8 <alloc_socket+0x10>
  57366. }
  57367. return -1;
  57368. 8017794: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  57369. }
  57370. 8017798: 4618 mov r0, r3
  57371. 801779a: 3710 adds r7, #16
  57372. 801779c: 46bd mov sp, r7
  57373. 801779e: bd80 pop {r7, pc}
  57374. 80177a0: 240242e4 .word 0x240242e4
  57375. 80177a4: 0802d5cc .word 0x0802d5cc
  57376. 80177a8: 0802d600 .word 0x0802d600
  57377. 80177ac: 0802d620 .word 0x0802d620
  57378. 080177b0 <free_socket_locked>:
  57379. * @param lastdata lastdata is stored here, must be freed externally
  57380. */
  57381. static int
  57382. free_socket_locked(struct lwip_sock *sock, int is_tcp, struct netconn **conn,
  57383. union lwip_sock_lastdata *lastdata)
  57384. {
  57385. 80177b0: b480 push {r7}
  57386. 80177b2: b085 sub sp, #20
  57387. 80177b4: af00 add r7, sp, #0
  57388. 80177b6: 60f8 str r0, [r7, #12]
  57389. 80177b8: 60b9 str r1, [r7, #8]
  57390. 80177ba: 607a str r2, [r7, #4]
  57391. 80177bc: 603b str r3, [r7, #0]
  57392. }
  57393. #else /* LWIP_NETCONN_FULLDUPLEX */
  57394. LWIP_UNUSED_ARG(is_tcp);
  57395. #endif /* LWIP_NETCONN_FULLDUPLEX */
  57396. *lastdata = sock->lastdata;
  57397. 80177be: 683b ldr r3, [r7, #0]
  57398. 80177c0: 68fa ldr r2, [r7, #12]
  57399. 80177c2: 6852 ldr r2, [r2, #4]
  57400. 80177c4: 601a str r2, [r3, #0]
  57401. sock->lastdata.pbuf = NULL;
  57402. 80177c6: 68fb ldr r3, [r7, #12]
  57403. 80177c8: 2200 movs r2, #0
  57404. 80177ca: 605a str r2, [r3, #4]
  57405. *conn = sock->conn;
  57406. 80177cc: 68fb ldr r3, [r7, #12]
  57407. 80177ce: 681a ldr r2, [r3, #0]
  57408. 80177d0: 687b ldr r3, [r7, #4]
  57409. 80177d2: 601a str r2, [r3, #0]
  57410. sock->conn = NULL;
  57411. 80177d4: 68fb ldr r3, [r7, #12]
  57412. 80177d6: 2200 movs r2, #0
  57413. 80177d8: 601a str r2, [r3, #0]
  57414. return 1;
  57415. 80177da: 2301 movs r3, #1
  57416. }
  57417. 80177dc: 4618 mov r0, r3
  57418. 80177de: 3714 adds r7, #20
  57419. 80177e0: 46bd mov sp, r7
  57420. 80177e2: f85d 7b04 ldr.w r7, [sp], #4
  57421. 80177e6: 4770 bx lr
  57422. 080177e8 <free_socket_free_elements>:
  57423. /** Free a socket's leftover members.
  57424. */
  57425. static void
  57426. free_socket_free_elements(int is_tcp, struct netconn *conn, union lwip_sock_lastdata *lastdata)
  57427. {
  57428. 80177e8: b580 push {r7, lr}
  57429. 80177ea: b084 sub sp, #16
  57430. 80177ec: af00 add r7, sp, #0
  57431. 80177ee: 60f8 str r0, [r7, #12]
  57432. 80177f0: 60b9 str r1, [r7, #8]
  57433. 80177f2: 607a str r2, [r7, #4]
  57434. if (lastdata->pbuf != NULL) {
  57435. 80177f4: 687b ldr r3, [r7, #4]
  57436. 80177f6: 681b ldr r3, [r3, #0]
  57437. 80177f8: 2b00 cmp r3, #0
  57438. 80177fa: d00d beq.n 8017818 <free_socket_free_elements+0x30>
  57439. if (is_tcp) {
  57440. 80177fc: 68fb ldr r3, [r7, #12]
  57441. 80177fe: 2b00 cmp r3, #0
  57442. 8017800: d005 beq.n 801780e <free_socket_free_elements+0x26>
  57443. pbuf_free(lastdata->pbuf);
  57444. 8017802: 687b ldr r3, [r7, #4]
  57445. 8017804: 681b ldr r3, [r3, #0]
  57446. 8017806: 4618 mov r0, r3
  57447. 8017808: f002 fe68 bl 801a4dc <pbuf_free>
  57448. 801780c: e004 b.n 8017818 <free_socket_free_elements+0x30>
  57449. } else {
  57450. netbuf_delete(lastdata->netbuf);
  57451. 801780e: 687b ldr r3, [r7, #4]
  57452. 8017810: 681b ldr r3, [r3, #0]
  57453. 8017812: 4618 mov r0, r3
  57454. 8017814: f7ff fe78 bl 8017508 <netbuf_delete>
  57455. }
  57456. }
  57457. if (conn != NULL) {
  57458. 8017818: 68bb ldr r3, [r7, #8]
  57459. 801781a: 2b00 cmp r3, #0
  57460. 801781c: d002 beq.n 8017824 <free_socket_free_elements+0x3c>
  57461. /* netconn_prepare_delete() has already been called, here we only free the conn */
  57462. netconn_delete(conn);
  57463. 801781e: 68b8 ldr r0, [r7, #8]
  57464. 8017820: f7fd fd50 bl 80152c4 <netconn_delete>
  57465. }
  57466. }
  57467. 8017824: bf00 nop
  57468. 8017826: 3710 adds r7, #16
  57469. 8017828: 46bd mov sp, r7
  57470. 801782a: bd80 pop {r7, pc}
  57471. 0801782c <free_socket>:
  57472. * @param sock the socket to free
  57473. * @param is_tcp != 0 for TCP sockets, used to free lastdata
  57474. */
  57475. static void
  57476. free_socket(struct lwip_sock *sock, int is_tcp)
  57477. {
  57478. 801782c: b580 push {r7, lr}
  57479. 801782e: b086 sub sp, #24
  57480. 8017830: af00 add r7, sp, #0
  57481. 8017832: 6078 str r0, [r7, #4]
  57482. 8017834: 6039 str r1, [r7, #0]
  57483. struct netconn *conn;
  57484. union lwip_sock_lastdata lastdata;
  57485. SYS_ARCH_DECL_PROTECT(lev);
  57486. /* Protect socket array */
  57487. SYS_ARCH_PROTECT(lev);
  57488. 8017836: f00e fe33 bl 80264a0 <sys_arch_protect>
  57489. 801783a: 6178 str r0, [r7, #20]
  57490. freed = free_socket_locked(sock, is_tcp, &conn, &lastdata);
  57491. 801783c: f107 0308 add.w r3, r7, #8
  57492. 8017840: f107 020c add.w r2, r7, #12
  57493. 8017844: 6839 ldr r1, [r7, #0]
  57494. 8017846: 6878 ldr r0, [r7, #4]
  57495. 8017848: f7ff ffb2 bl 80177b0 <free_socket_locked>
  57496. 801784c: 6138 str r0, [r7, #16]
  57497. SYS_ARCH_UNPROTECT(lev);
  57498. 801784e: 6978 ldr r0, [r7, #20]
  57499. 8017850: f00e fe34 bl 80264bc <sys_arch_unprotect>
  57500. /* don't use 'sock' after this line, as another task might have allocated it */
  57501. if (freed) {
  57502. 8017854: 693b ldr r3, [r7, #16]
  57503. 8017856: 2b00 cmp r3, #0
  57504. 8017858: d006 beq.n 8017868 <free_socket+0x3c>
  57505. free_socket_free_elements(is_tcp, conn, &lastdata);
  57506. 801785a: 68fb ldr r3, [r7, #12]
  57507. 801785c: f107 0208 add.w r2, r7, #8
  57508. 8017860: 4619 mov r1, r3
  57509. 8017862: 6838 ldr r0, [r7, #0]
  57510. 8017864: f7ff ffc0 bl 80177e8 <free_socket_free_elements>
  57511. }
  57512. }
  57513. 8017868: bf00 nop
  57514. 801786a: 3718 adds r7, #24
  57515. 801786c: 46bd mov sp, r7
  57516. 801786e: bd80 pop {r7, pc}
  57517. 08017870 <lwip_close>:
  57518. return 0;
  57519. }
  57520. int
  57521. lwip_close(int s)
  57522. {
  57523. 8017870: b580 push {r7, lr}
  57524. 8017872: b086 sub sp, #24
  57525. 8017874: af00 add r7, sp, #0
  57526. 8017876: 6078 str r0, [r7, #4]
  57527. struct lwip_sock *sock;
  57528. int is_tcp = 0;
  57529. 8017878: 2300 movs r3, #0
  57530. 801787a: 617b str r3, [r7, #20]
  57531. err_t err;
  57532. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_close(%d)\n", s));
  57533. sock = get_socket(s);
  57534. 801787c: 6878 ldr r0, [r7, #4]
  57535. 801787e: f7ff ff13 bl 80176a8 <get_socket>
  57536. 8017882: 6138 str r0, [r7, #16]
  57537. if (!sock) {
  57538. 8017884: 693b ldr r3, [r7, #16]
  57539. 8017886: 2b00 cmp r3, #0
  57540. 8017888: d102 bne.n 8017890 <lwip_close+0x20>
  57541. return -1;
  57542. 801788a: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  57543. 801788e: e039 b.n 8017904 <lwip_close+0x94>
  57544. }
  57545. if (sock->conn != NULL) {
  57546. 8017890: 693b ldr r3, [r7, #16]
  57547. 8017892: 681b ldr r3, [r3, #0]
  57548. 8017894: 2b00 cmp r3, #0
  57549. 8017896: d00b beq.n 80178b0 <lwip_close+0x40>
  57550. is_tcp = NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP;
  57551. 8017898: 693b ldr r3, [r7, #16]
  57552. 801789a: 681b ldr r3, [r3, #0]
  57553. 801789c: 781b ldrb r3, [r3, #0]
  57554. 801789e: f003 03f0 and.w r3, r3, #240 @ 0xf0
  57555. 80178a2: 2b10 cmp r3, #16
  57556. 80178a4: bf0c ite eq
  57557. 80178a6: 2301 moveq r3, #1
  57558. 80178a8: 2300 movne r3, #0
  57559. 80178aa: b2db uxtb r3, r3
  57560. 80178ac: 617b str r3, [r7, #20]
  57561. 80178ae: e00a b.n 80178c6 <lwip_close+0x56>
  57562. } else {
  57563. LWIP_ASSERT("sock->lastdata == NULL", sock->lastdata.pbuf == NULL);
  57564. 80178b0: 693b ldr r3, [r7, #16]
  57565. 80178b2: 685b ldr r3, [r3, #4]
  57566. 80178b4: 2b00 cmp r3, #0
  57567. 80178b6: d006 beq.n 80178c6 <lwip_close+0x56>
  57568. 80178b8: 4b14 ldr r3, [pc, #80] @ (801790c <lwip_close+0x9c>)
  57569. 80178ba: f44f 7245 mov.w r2, #788 @ 0x314
  57570. 80178be: 4914 ldr r1, [pc, #80] @ (8017910 <lwip_close+0xa0>)
  57571. 80178c0: 4814 ldr r0, [pc, #80] @ (8017914 <lwip_close+0xa4>)
  57572. 80178c2: f012 f883 bl 80299cc <iprintf>
  57573. #if LWIP_IPV6_MLD
  57574. /* drop all possibly joined MLD6 memberships */
  57575. lwip_socket_drop_registered_mld6_memberships(s);
  57576. #endif /* LWIP_IPV6_MLD */
  57577. err = netconn_prepare_delete(sock->conn);
  57578. 80178c6: 693b ldr r3, [r7, #16]
  57579. 80178c8: 681b ldr r3, [r3, #0]
  57580. 80178ca: 4618 mov r0, r3
  57581. 80178cc: f7fd fcd6 bl 801527c <netconn_prepare_delete>
  57582. 80178d0: 4603 mov r3, r0
  57583. 80178d2: 73fb strb r3, [r7, #15]
  57584. if (err != ERR_OK) {
  57585. 80178d4: f997 300f ldrsb.w r3, [r7, #15]
  57586. 80178d8: 2b00 cmp r3, #0
  57587. 80178da: d00e beq.n 80178fa <lwip_close+0x8a>
  57588. sock_set_errno(sock, err_to_errno(err));
  57589. 80178dc: f997 300f ldrsb.w r3, [r7, #15]
  57590. 80178e0: 4618 mov r0, r3
  57591. 80178e2: f7ff fdf3 bl 80174cc <err_to_errno>
  57592. 80178e6: 60b8 str r0, [r7, #8]
  57593. 80178e8: 68bb ldr r3, [r7, #8]
  57594. 80178ea: 2b00 cmp r3, #0
  57595. 80178ec: d002 beq.n 80178f4 <lwip_close+0x84>
  57596. 80178ee: 4a0a ldr r2, [pc, #40] @ (8017918 <lwip_close+0xa8>)
  57597. 80178f0: 68bb ldr r3, [r7, #8]
  57598. 80178f2: 6013 str r3, [r2, #0]
  57599. done_socket(sock);
  57600. return -1;
  57601. 80178f4: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  57602. 80178f8: e004 b.n 8017904 <lwip_close+0x94>
  57603. }
  57604. free_socket(sock, is_tcp);
  57605. 80178fa: 6979 ldr r1, [r7, #20]
  57606. 80178fc: 6938 ldr r0, [r7, #16]
  57607. 80178fe: f7ff ff95 bl 801782c <free_socket>
  57608. set_errno(0);
  57609. return 0;
  57610. 8017902: 2300 movs r3, #0
  57611. }
  57612. 8017904: 4618 mov r0, r3
  57613. 8017906: 3718 adds r7, #24
  57614. 8017908: 46bd mov sp, r7
  57615. 801790a: bd80 pop {r7, pc}
  57616. 801790c: 0802d5cc .word 0x0802d5cc
  57617. 8017910: 0802d68c .word 0x0802d68c
  57618. 8017914: 0802d620 .word 0x0802d620
  57619. 8017918: 2402b180 .word 0x2402b180
  57620. 0801791c <lwip_connect>:
  57621. int
  57622. lwip_connect(int s, const struct sockaddr *name, socklen_t namelen)
  57623. {
  57624. 801791c: b580 push {r7, lr}
  57625. 801791e: b08a sub sp, #40 @ 0x28
  57626. 8017920: af00 add r7, sp, #0
  57627. 8017922: 60f8 str r0, [r7, #12]
  57628. 8017924: 60b9 str r1, [r7, #8]
  57629. 8017926: 607a str r2, [r7, #4]
  57630. struct lwip_sock *sock;
  57631. err_t err;
  57632. sock = get_socket(s);
  57633. 8017928: 68f8 ldr r0, [r7, #12]
  57634. 801792a: f7ff febd bl 80176a8 <get_socket>
  57635. 801792e: 6278 str r0, [r7, #36] @ 0x24
  57636. if (!sock) {
  57637. 8017930: 6a7b ldr r3, [r7, #36] @ 0x24
  57638. 8017932: 2b00 cmp r3, #0
  57639. 8017934: d102 bne.n 801793c <lwip_connect+0x20>
  57640. return -1;
  57641. 8017936: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  57642. 801793a: e062 b.n 8017a02 <lwip_connect+0xe6>
  57643. done_socket(sock);
  57644. return -1;
  57645. }
  57646. LWIP_UNUSED_ARG(namelen);
  57647. if (name->sa_family == AF_UNSPEC) {
  57648. 801793c: 68bb ldr r3, [r7, #8]
  57649. 801793e: 785b ldrb r3, [r3, #1]
  57650. 8017940: 2b00 cmp r3, #0
  57651. 8017942: d108 bne.n 8017956 <lwip_connect+0x3a>
  57652. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, AF_UNSPEC)\n", s));
  57653. err = netconn_disconnect(sock->conn);
  57654. 8017944: 6a7b ldr r3, [r7, #36] @ 0x24
  57655. 8017946: 681b ldr r3, [r3, #0]
  57656. 8017948: 4618 mov r0, r3
  57657. 801794a: f7fd fd61 bl 8015410 <netconn_disconnect>
  57658. 801794e: 4603 mov r3, r0
  57659. 8017950: f887 3021 strb.w r3, [r7, #33] @ 0x21
  57660. 8017954: e039 b.n 80179ca <lwip_connect+0xae>
  57661. } else {
  57662. ip_addr_t remote_addr;
  57663. u16_t remote_port;
  57664. /* check size, family and alignment of 'name' */
  57665. LWIP_ERROR("lwip_connect: invalid address", IS_SOCK_ADDR_LEN_VALID(namelen) &&
  57666. 8017956: 687b ldr r3, [r7, #4]
  57667. 8017958: 2b10 cmp r3, #16
  57668. 801795a: d10c bne.n 8017976 <lwip_connect+0x5a>
  57669. 801795c: 68bb ldr r3, [r7, #8]
  57670. 801795e: 785b ldrb r3, [r3, #1]
  57671. 8017960: 2b00 cmp r3, #0
  57672. 8017962: d003 beq.n 801796c <lwip_connect+0x50>
  57673. 8017964: 68bb ldr r3, [r7, #8]
  57674. 8017966: 785b ldrb r3, [r3, #1]
  57675. 8017968: 2b02 cmp r3, #2
  57676. 801796a: d104 bne.n 8017976 <lwip_connect+0x5a>
  57677. 801796c: 68bb ldr r3, [r7, #8]
  57678. 801796e: f003 0303 and.w r3, r3, #3
  57679. 8017972: 2b00 cmp r3, #0
  57680. 8017974: d014 beq.n 80179a0 <lwip_connect+0x84>
  57681. 8017976: 4b25 ldr r3, [pc, #148] @ (8017a0c <lwip_connect+0xf0>)
  57682. 8017978: f240 3247 movw r2, #839 @ 0x347
  57683. 801797c: 4924 ldr r1, [pc, #144] @ (8017a10 <lwip_connect+0xf4>)
  57684. 801797e: 4825 ldr r0, [pc, #148] @ (8017a14 <lwip_connect+0xf8>)
  57685. 8017980: f012 f824 bl 80299cc <iprintf>
  57686. 8017984: f06f 000f mvn.w r0, #15
  57687. 8017988: f7ff fda0 bl 80174cc <err_to_errno>
  57688. 801798c: 61f8 str r0, [r7, #28]
  57689. 801798e: 69fb ldr r3, [r7, #28]
  57690. 8017990: 2b00 cmp r3, #0
  57691. 8017992: d002 beq.n 801799a <lwip_connect+0x7e>
  57692. 8017994: 4a20 ldr r2, [pc, #128] @ (8017a18 <lwip_connect+0xfc>)
  57693. 8017996: 69fb ldr r3, [r7, #28]
  57694. 8017998: 6013 str r3, [r2, #0]
  57695. 801799a: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  57696. 801799e: e030 b.n 8017a02 <lwip_connect+0xe6>
  57697. IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name) && IS_SOCK_ADDR_ALIGNED(name),
  57698. sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
  57699. SOCKADDR_TO_IPADDR_PORT(name, &remote_addr, remote_port);
  57700. 80179a0: 68bb ldr r3, [r7, #8]
  57701. 80179a2: 685b ldr r3, [r3, #4]
  57702. 80179a4: 613b str r3, [r7, #16]
  57703. 80179a6: 68bb ldr r3, [r7, #8]
  57704. 80179a8: 885b ldrh r3, [r3, #2]
  57705. 80179aa: 4618 mov r0, r3
  57706. 80179ac: f001 f8b4 bl 8018b18 <lwip_htons>
  57707. 80179b0: 4603 mov r3, r0
  57708. 80179b2: 847b strh r3, [r7, #34] @ 0x22
  57709. unmap_ipv4_mapped_ipv6(ip_2_ip4(&remote_addr), ip_2_ip6(&remote_addr));
  57710. IP_SET_TYPE_VAL(remote_addr, IPADDR_TYPE_V4);
  57711. }
  57712. #endif /* LWIP_IPV4 && LWIP_IPV6 */
  57713. err = netconn_connect(sock->conn, &remote_addr, remote_port);
  57714. 80179b4: 6a7b ldr r3, [r7, #36] @ 0x24
  57715. 80179b6: 681b ldr r3, [r3, #0]
  57716. 80179b8: 8c7a ldrh r2, [r7, #34] @ 0x22
  57717. 80179ba: f107 0110 add.w r1, r7, #16
  57718. 80179be: 4618 mov r0, r3
  57719. 80179c0: f7fd fcee bl 80153a0 <netconn_connect>
  57720. 80179c4: 4603 mov r3, r0
  57721. 80179c6: f887 3021 strb.w r3, [r7, #33] @ 0x21
  57722. }
  57723. if (err != ERR_OK) {
  57724. 80179ca: f997 3021 ldrsb.w r3, [r7, #33] @ 0x21
  57725. 80179ce: 2b00 cmp r3, #0
  57726. 80179d0: d00e beq.n 80179f0 <lwip_connect+0xd4>
  57727. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) failed, err=%d\n", s, err));
  57728. sock_set_errno(sock, err_to_errno(err));
  57729. 80179d2: f997 3021 ldrsb.w r3, [r7, #33] @ 0x21
  57730. 80179d6: 4618 mov r0, r3
  57731. 80179d8: f7ff fd78 bl 80174cc <err_to_errno>
  57732. 80179dc: 6178 str r0, [r7, #20]
  57733. 80179de: 697b ldr r3, [r7, #20]
  57734. 80179e0: 2b00 cmp r3, #0
  57735. 80179e2: d002 beq.n 80179ea <lwip_connect+0xce>
  57736. 80179e4: 4a0c ldr r2, [pc, #48] @ (8017a18 <lwip_connect+0xfc>)
  57737. 80179e6: 697b ldr r3, [r7, #20]
  57738. 80179e8: 6013 str r3, [r2, #0]
  57739. done_socket(sock);
  57740. return -1;
  57741. 80179ea: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  57742. 80179ee: e008 b.n 8017a02 <lwip_connect+0xe6>
  57743. }
  57744. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) succeeded\n", s));
  57745. sock_set_errno(sock, 0);
  57746. 80179f0: 2300 movs r3, #0
  57747. 80179f2: 61bb str r3, [r7, #24]
  57748. 80179f4: 69bb ldr r3, [r7, #24]
  57749. 80179f6: 2b00 cmp r3, #0
  57750. 80179f8: d002 beq.n 8017a00 <lwip_connect+0xe4>
  57751. 80179fa: 4a07 ldr r2, [pc, #28] @ (8017a18 <lwip_connect+0xfc>)
  57752. 80179fc: 69bb ldr r3, [r7, #24]
  57753. 80179fe: 6013 str r3, [r2, #0]
  57754. done_socket(sock);
  57755. return 0;
  57756. 8017a00: 2300 movs r3, #0
  57757. }
  57758. 8017a02: 4618 mov r0, r3
  57759. 8017a04: 3728 adds r7, #40 @ 0x28
  57760. 8017a06: 46bd mov sp, r7
  57761. 8017a08: bd80 pop {r7, pc}
  57762. 8017a0a: bf00 nop
  57763. 8017a0c: 0802d5cc .word 0x0802d5cc
  57764. 8017a10: 0802d6a4 .word 0x0802d6a4
  57765. 8017a14: 0802d620 .word 0x0802d620
  57766. 8017a18: 2402b180 .word 0x2402b180
  57767. 08017a1c <lwip_recv_tcp>:
  57768. * until "len" bytes are received or we're otherwise done.
  57769. * Keeps sock->lastdata for peeking or partly copying.
  57770. */
  57771. static ssize_t
  57772. lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags)
  57773. {
  57774. 8017a1c: b580 push {r7, lr}
  57775. 8017a1e: b08c sub sp, #48 @ 0x30
  57776. 8017a20: af00 add r7, sp, #0
  57777. 8017a22: 60f8 str r0, [r7, #12]
  57778. 8017a24: 60b9 str r1, [r7, #8]
  57779. 8017a26: 607a str r2, [r7, #4]
  57780. 8017a28: 603b str r3, [r7, #0]
  57781. u8_t apiflags = NETCONN_NOAUTORCVD;
  57782. 8017a2a: 2308 movs r3, #8
  57783. 8017a2c: f887 3023 strb.w r3, [r7, #35] @ 0x23
  57784. ssize_t recvd = 0;
  57785. 8017a30: 2300 movs r3, #0
  57786. 8017a32: 62bb str r3, [r7, #40] @ 0x28
  57787. ssize_t recv_left = (len <= SSIZE_MAX) ? (ssize_t)len : SSIZE_MAX;
  57788. 8017a34: 687b ldr r3, [r7, #4]
  57789. 8017a36: 2b00 cmp r3, #0
  57790. 8017a38: db01 blt.n 8017a3e <lwip_recv_tcp+0x22>
  57791. 8017a3a: 687b ldr r3, [r7, #4]
  57792. 8017a3c: e001 b.n 8017a42 <lwip_recv_tcp+0x26>
  57793. 8017a3e: f06f 4300 mvn.w r3, #2147483648 @ 0x80000000
  57794. 8017a42: 627b str r3, [r7, #36] @ 0x24
  57795. LWIP_ASSERT("no socket given", sock != NULL);
  57796. 8017a44: 68fb ldr r3, [r7, #12]
  57797. 8017a46: 2b00 cmp r3, #0
  57798. 8017a48: d106 bne.n 8017a58 <lwip_recv_tcp+0x3c>
  57799. 8017a4a: 4b74 ldr r3, [pc, #464] @ (8017c1c <lwip_recv_tcp+0x200>)
  57800. 8017a4c: f240 329e movw r2, #926 @ 0x39e
  57801. 8017a50: 4973 ldr r1, [pc, #460] @ (8017c20 <lwip_recv_tcp+0x204>)
  57802. 8017a52: 4874 ldr r0, [pc, #464] @ (8017c24 <lwip_recv_tcp+0x208>)
  57803. 8017a54: f011 ffba bl 80299cc <iprintf>
  57804. LWIP_ASSERT("this should be checked internally", NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP);
  57805. 8017a58: 68fb ldr r3, [r7, #12]
  57806. 8017a5a: 681b ldr r3, [r3, #0]
  57807. 8017a5c: 781b ldrb r3, [r3, #0]
  57808. 8017a5e: f003 03f0 and.w r3, r3, #240 @ 0xf0
  57809. 8017a62: 2b10 cmp r3, #16
  57810. 8017a64: d006 beq.n 8017a74 <lwip_recv_tcp+0x58>
  57811. 8017a66: 4b6d ldr r3, [pc, #436] @ (8017c1c <lwip_recv_tcp+0x200>)
  57812. 8017a68: f240 329f movw r2, #927 @ 0x39f
  57813. 8017a6c: 496e ldr r1, [pc, #440] @ (8017c28 <lwip_recv_tcp+0x20c>)
  57814. 8017a6e: 486d ldr r0, [pc, #436] @ (8017c24 <lwip_recv_tcp+0x208>)
  57815. 8017a70: f011 ffac bl 80299cc <iprintf>
  57816. if (flags & MSG_DONTWAIT) {
  57817. 8017a74: 683b ldr r3, [r7, #0]
  57818. 8017a76: f003 0308 and.w r3, r3, #8
  57819. 8017a7a: 2b00 cmp r3, #0
  57820. 8017a7c: d005 beq.n 8017a8a <lwip_recv_tcp+0x6e>
  57821. apiflags |= NETCONN_DONTBLOCK;
  57822. 8017a7e: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  57823. 8017a82: f043 0304 orr.w r3, r3, #4
  57824. 8017a86: f887 3023 strb.w r3, [r7, #35] @ 0x23
  57825. err_t err;
  57826. u16_t copylen;
  57827. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: top while sock->lastdata=%p\n", (void *)sock->lastdata.pbuf));
  57828. /* Check if there is data left from the last recv operation. */
  57829. if (sock->lastdata.pbuf) {
  57830. 8017a8a: 68fb ldr r3, [r7, #12]
  57831. 8017a8c: 685b ldr r3, [r3, #4]
  57832. 8017a8e: 2b00 cmp r3, #0
  57833. 8017a90: d003 beq.n 8017a9a <lwip_recv_tcp+0x7e>
  57834. p = sock->lastdata.pbuf;
  57835. 8017a92: 68fb ldr r3, [r7, #12]
  57836. 8017a94: 685b ldr r3, [r3, #4]
  57837. 8017a96: 617b str r3, [r7, #20]
  57838. 8017a98: e036 b.n 8017b08 <lwip_recv_tcp+0xec>
  57839. } else {
  57840. /* No data was left from the previous operation, so we try to get
  57841. some from the network. */
  57842. err = netconn_recv_tcp_pbuf_flags(sock->conn, &p, apiflags);
  57843. 8017a9a: 68fb ldr r3, [r7, #12]
  57844. 8017a9c: 681b ldr r3, [r3, #0]
  57845. 8017a9e: f897 2023 ldrb.w r2, [r7, #35] @ 0x23
  57846. 8017aa2: f107 0114 add.w r1, r7, #20
  57847. 8017aa6: 4618 mov r0, r3
  57848. 8017aa8: f7fd fea4 bl 80157f4 <netconn_recv_tcp_pbuf_flags>
  57849. 8017aac: 4603 mov r3, r0
  57850. 8017aae: f887 3022 strb.w r3, [r7, #34] @ 0x22
  57851. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: netconn_recv err=%d, pbuf=%p\n",
  57852. err, (void *)p));
  57853. if (err != ERR_OK) {
  57854. 8017ab2: f997 3022 ldrsb.w r3, [r7, #34] @ 0x22
  57855. 8017ab6: 2b00 cmp r3, #0
  57856. 8017ab8: d019 beq.n 8017aee <lwip_recv_tcp+0xd2>
  57857. if (recvd > 0) {
  57858. 8017aba: 6abb ldr r3, [r7, #40] @ 0x28
  57859. 8017abc: 2b00 cmp r3, #0
  57860. 8017abe: f300 808d bgt.w 8017bdc <lwip_recv_tcp+0x1c0>
  57861. goto lwip_recv_tcp_done;
  57862. }
  57863. /* We should really do some error checking here. */
  57864. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: p == NULL, error is \"%s\"!\n",
  57865. lwip_strerr(err)));
  57866. sock_set_errno(sock, err_to_errno(err));
  57867. 8017ac2: f997 3022 ldrsb.w r3, [r7, #34] @ 0x22
  57868. 8017ac6: 4618 mov r0, r3
  57869. 8017ac8: f7ff fd00 bl 80174cc <err_to_errno>
  57870. 8017acc: 61f8 str r0, [r7, #28]
  57871. 8017ace: 69fb ldr r3, [r7, #28]
  57872. 8017ad0: 2b00 cmp r3, #0
  57873. 8017ad2: d002 beq.n 8017ada <lwip_recv_tcp+0xbe>
  57874. 8017ad4: 4a55 ldr r2, [pc, #340] @ (8017c2c <lwip_recv_tcp+0x210>)
  57875. 8017ad6: 69fb ldr r3, [r7, #28]
  57876. 8017ad8: 6013 str r3, [r2, #0]
  57877. if (err == ERR_CLSD) {
  57878. 8017ada: f997 3022 ldrsb.w r3, [r7, #34] @ 0x22
  57879. 8017ade: f113 0f0f cmn.w r3, #15
  57880. 8017ae2: d101 bne.n 8017ae8 <lwip_recv_tcp+0xcc>
  57881. return 0;
  57882. 8017ae4: 2300 movs r3, #0
  57883. 8017ae6: e094 b.n 8017c12 <lwip_recv_tcp+0x1f6>
  57884. } else {
  57885. return -1;
  57886. 8017ae8: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  57887. 8017aec: e091 b.n 8017c12 <lwip_recv_tcp+0x1f6>
  57888. }
  57889. }
  57890. LWIP_ASSERT("p != NULL", p != NULL);
  57891. 8017aee: 697b ldr r3, [r7, #20]
  57892. 8017af0: 2b00 cmp r3, #0
  57893. 8017af2: d106 bne.n 8017b02 <lwip_recv_tcp+0xe6>
  57894. 8017af4: 4b49 ldr r3, [pc, #292] @ (8017c1c <lwip_recv_tcp+0x200>)
  57895. 8017af6: f240 32c5 movw r2, #965 @ 0x3c5
  57896. 8017afa: 494d ldr r1, [pc, #308] @ (8017c30 <lwip_recv_tcp+0x214>)
  57897. 8017afc: 4849 ldr r0, [pc, #292] @ (8017c24 <lwip_recv_tcp+0x208>)
  57898. 8017afe: f011 ff65 bl 80299cc <iprintf>
  57899. sock->lastdata.pbuf = p;
  57900. 8017b02: 697a ldr r2, [r7, #20]
  57901. 8017b04: 68fb ldr r3, [r7, #12]
  57902. 8017b06: 605a str r2, [r3, #4]
  57903. }
  57904. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: buflen=%"U16_F" recv_left=%d off=%d\n",
  57905. p->tot_len, (int)recv_left, (int)recvd));
  57906. if (recv_left > p->tot_len) {
  57907. 8017b08: 697b ldr r3, [r7, #20]
  57908. 8017b0a: 891b ldrh r3, [r3, #8]
  57909. 8017b0c: 461a mov r2, r3
  57910. 8017b0e: 6a7b ldr r3, [r7, #36] @ 0x24
  57911. 8017b10: 4293 cmp r3, r2
  57912. 8017b12: dd03 ble.n 8017b1c <lwip_recv_tcp+0x100>
  57913. copylen = p->tot_len;
  57914. 8017b14: 697b ldr r3, [r7, #20]
  57915. 8017b16: 891b ldrh r3, [r3, #8]
  57916. 8017b18: 85fb strh r3, [r7, #46] @ 0x2e
  57917. 8017b1a: e001 b.n 8017b20 <lwip_recv_tcp+0x104>
  57918. } else {
  57919. copylen = (u16_t)recv_left;
  57920. 8017b1c: 6a7b ldr r3, [r7, #36] @ 0x24
  57921. 8017b1e: 85fb strh r3, [r7, #46] @ 0x2e
  57922. }
  57923. if (recvd + copylen < recvd) {
  57924. 8017b20: 8dfa ldrh r2, [r7, #46] @ 0x2e
  57925. 8017b22: 6abb ldr r3, [r7, #40] @ 0x28
  57926. 8017b24: 4413 add r3, r2
  57927. 8017b26: 6aba ldr r2, [r7, #40] @ 0x28
  57928. 8017b28: 429a cmp r2, r3
  57929. 8017b2a: dd03 ble.n 8017b34 <lwip_recv_tcp+0x118>
  57930. /* overflow */
  57931. copylen = (u16_t)(SSIZE_MAX - recvd);
  57932. 8017b2c: 6abb ldr r3, [r7, #40] @ 0x28
  57933. 8017b2e: b29b uxth r3, r3
  57934. 8017b30: 43db mvns r3, r3
  57935. 8017b32: 85fb strh r3, [r7, #46] @ 0x2e
  57936. }
  57937. /* copy the contents of the received buffer into
  57938. the supplied memory pointer mem */
  57939. pbuf_copy_partial(p, (u8_t *)mem + recvd, copylen, 0);
  57940. 8017b34: 6978 ldr r0, [r7, #20]
  57941. 8017b36: 6abb ldr r3, [r7, #40] @ 0x28
  57942. 8017b38: 68ba ldr r2, [r7, #8]
  57943. 8017b3a: 18d1 adds r1, r2, r3
  57944. 8017b3c: 8dfa ldrh r2, [r7, #46] @ 0x2e
  57945. 8017b3e: 2300 movs r3, #0
  57946. 8017b40: f002 fed2 bl 801a8e8 <pbuf_copy_partial>
  57947. recvd += copylen;
  57948. 8017b44: 8dfb ldrh r3, [r7, #46] @ 0x2e
  57949. 8017b46: 6aba ldr r2, [r7, #40] @ 0x28
  57950. 8017b48: 4413 add r3, r2
  57951. 8017b4a: 62bb str r3, [r7, #40] @ 0x28
  57952. /* TCP combines multiple pbufs for one recv */
  57953. LWIP_ASSERT("invalid copylen, len would underflow", recv_left >= copylen);
  57954. 8017b4c: 8dfb ldrh r3, [r7, #46] @ 0x2e
  57955. 8017b4e: 6a7a ldr r2, [r7, #36] @ 0x24
  57956. 8017b50: 429a cmp r2, r3
  57957. 8017b52: da06 bge.n 8017b62 <lwip_recv_tcp+0x146>
  57958. 8017b54: 4b31 ldr r3, [pc, #196] @ (8017c1c <lwip_recv_tcp+0x200>)
  57959. 8017b56: f240 32dd movw r2, #989 @ 0x3dd
  57960. 8017b5a: 4936 ldr r1, [pc, #216] @ (8017c34 <lwip_recv_tcp+0x218>)
  57961. 8017b5c: 4831 ldr r0, [pc, #196] @ (8017c24 <lwip_recv_tcp+0x208>)
  57962. 8017b5e: f011 ff35 bl 80299cc <iprintf>
  57963. recv_left -= copylen;
  57964. 8017b62: 8dfb ldrh r3, [r7, #46] @ 0x2e
  57965. 8017b64: 6a7a ldr r2, [r7, #36] @ 0x24
  57966. 8017b66: 1ad3 subs r3, r2, r3
  57967. 8017b68: 627b str r3, [r7, #36] @ 0x24
  57968. /* Unless we peek the incoming message... */
  57969. if ((flags & MSG_PEEK) == 0) {
  57970. 8017b6a: 683b ldr r3, [r7, #0]
  57971. 8017b6c: f003 0301 and.w r3, r3, #1
  57972. 8017b70: 2b00 cmp r3, #0
  57973. 8017b72: d123 bne.n 8017bbc <lwip_recv_tcp+0x1a0>
  57974. /* ... check if there is data left in the pbuf */
  57975. LWIP_ASSERT("invalid copylen", p->tot_len >= copylen);
  57976. 8017b74: 697b ldr r3, [r7, #20]
  57977. 8017b76: 891b ldrh r3, [r3, #8]
  57978. 8017b78: 8dfa ldrh r2, [r7, #46] @ 0x2e
  57979. 8017b7a: 429a cmp r2, r3
  57980. 8017b7c: d906 bls.n 8017b8c <lwip_recv_tcp+0x170>
  57981. 8017b7e: 4b27 ldr r3, [pc, #156] @ (8017c1c <lwip_recv_tcp+0x200>)
  57982. 8017b80: f240 32e3 movw r2, #995 @ 0x3e3
  57983. 8017b84: 492c ldr r1, [pc, #176] @ (8017c38 <lwip_recv_tcp+0x21c>)
  57984. 8017b86: 4827 ldr r0, [pc, #156] @ (8017c24 <lwip_recv_tcp+0x208>)
  57985. 8017b88: f011 ff20 bl 80299cc <iprintf>
  57986. if (p->tot_len - copylen > 0) {
  57987. 8017b8c: 697b ldr r3, [r7, #20]
  57988. 8017b8e: 891b ldrh r3, [r3, #8]
  57989. 8017b90: 461a mov r2, r3
  57990. 8017b92: 8dfb ldrh r3, [r7, #46] @ 0x2e
  57991. 8017b94: 1ad3 subs r3, r2, r3
  57992. 8017b96: 2b00 cmp r3, #0
  57993. 8017b98: dd09 ble.n 8017bae <lwip_recv_tcp+0x192>
  57994. /* If so, it should be saved in the sock structure for the next recv call.
  57995. We store the pbuf but hide/free the consumed data: */
  57996. sock->lastdata.pbuf = pbuf_free_header(p, copylen);
  57997. 8017b9a: 697b ldr r3, [r7, #20]
  57998. 8017b9c: 8dfa ldrh r2, [r7, #46] @ 0x2e
  57999. 8017b9e: 4611 mov r1, r2
  58000. 8017ba0: 4618 mov r0, r3
  58001. 8017ba2: f002 fc68 bl 801a476 <pbuf_free_header>
  58002. 8017ba6: 4602 mov r2, r0
  58003. 8017ba8: 68fb ldr r3, [r7, #12]
  58004. 8017baa: 605a str r2, [r3, #4]
  58005. 8017bac: e006 b.n 8017bbc <lwip_recv_tcp+0x1a0>
  58006. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: lastdata now pbuf=%p\n", (void *)sock->lastdata.pbuf));
  58007. } else {
  58008. sock->lastdata.pbuf = NULL;
  58009. 8017bae: 68fb ldr r3, [r7, #12]
  58010. 8017bb0: 2200 movs r2, #0
  58011. 8017bb2: 605a str r2, [r3, #4]
  58012. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: deleting pbuf=%p\n", (void *)p));
  58013. pbuf_free(p);
  58014. 8017bb4: 697b ldr r3, [r7, #20]
  58015. 8017bb6: 4618 mov r0, r3
  58016. 8017bb8: f002 fc90 bl 801a4dc <pbuf_free>
  58017. }
  58018. }
  58019. /* once we have some data to return, only add more if we don't need to wait */
  58020. apiflags |= NETCONN_DONTBLOCK | NETCONN_NOFIN;
  58021. 8017bbc: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  58022. 8017bc0: f043 0314 orr.w r3, r3, #20
  58023. 8017bc4: f887 3023 strb.w r3, [r7, #35] @ 0x23
  58024. /* @todo: do we need to support peeking more than one pbuf? */
  58025. } while ((recv_left > 0) && !(flags & MSG_PEEK));
  58026. 8017bc8: 6a7b ldr r3, [r7, #36] @ 0x24
  58027. 8017bca: 2b00 cmp r3, #0
  58028. 8017bcc: dd08 ble.n 8017be0 <lwip_recv_tcp+0x1c4>
  58029. 8017bce: 683b ldr r3, [r7, #0]
  58030. 8017bd0: f003 0301 and.w r3, r3, #1
  58031. 8017bd4: 2b00 cmp r3, #0
  58032. 8017bd6: f43f af58 beq.w 8017a8a <lwip_recv_tcp+0x6e>
  58033. lwip_recv_tcp_done:
  58034. 8017bda: e001 b.n 8017be0 <lwip_recv_tcp+0x1c4>
  58035. goto lwip_recv_tcp_done;
  58036. 8017bdc: bf00 nop
  58037. 8017bde: e000 b.n 8017be2 <lwip_recv_tcp+0x1c6>
  58038. lwip_recv_tcp_done:
  58039. 8017be0: bf00 nop
  58040. if ((recvd > 0) && !(flags & MSG_PEEK)) {
  58041. 8017be2: 6abb ldr r3, [r7, #40] @ 0x28
  58042. 8017be4: 2b00 cmp r3, #0
  58043. 8017be6: dd0b ble.n 8017c00 <lwip_recv_tcp+0x1e4>
  58044. 8017be8: 683b ldr r3, [r7, #0]
  58045. 8017bea: f003 0301 and.w r3, r3, #1
  58046. 8017bee: 2b00 cmp r3, #0
  58047. 8017bf0: d106 bne.n 8017c00 <lwip_recv_tcp+0x1e4>
  58048. /* ensure window update after copying all data */
  58049. netconn_tcp_recvd(sock->conn, (size_t)recvd);
  58050. 8017bf2: 68fb ldr r3, [r7, #12]
  58051. 8017bf4: 681b ldr r3, [r3, #0]
  58052. 8017bf6: 6aba ldr r2, [r7, #40] @ 0x28
  58053. 8017bf8: 4611 mov r1, r2
  58054. 8017bfa: 4618 mov r0, r3
  58055. 8017bfc: f7fd fd42 bl 8015684 <netconn_tcp_recvd>
  58056. }
  58057. sock_set_errno(sock, 0);
  58058. 8017c00: 2300 movs r3, #0
  58059. 8017c02: 61bb str r3, [r7, #24]
  58060. 8017c04: 69bb ldr r3, [r7, #24]
  58061. 8017c06: 2b00 cmp r3, #0
  58062. 8017c08: d002 beq.n 8017c10 <lwip_recv_tcp+0x1f4>
  58063. 8017c0a: 4a08 ldr r2, [pc, #32] @ (8017c2c <lwip_recv_tcp+0x210>)
  58064. 8017c0c: 69bb ldr r3, [r7, #24]
  58065. 8017c0e: 6013 str r3, [r2, #0]
  58066. return recvd;
  58067. 8017c10: 6abb ldr r3, [r7, #40] @ 0x28
  58068. }
  58069. 8017c12: 4618 mov r0, r3
  58070. 8017c14: 3730 adds r7, #48 @ 0x30
  58071. 8017c16: 46bd mov sp, r7
  58072. 8017c18: bd80 pop {r7, pc}
  58073. 8017c1a: bf00 nop
  58074. 8017c1c: 0802d5cc .word 0x0802d5cc
  58075. 8017c20: 0802d6c4 .word 0x0802d6c4
  58076. 8017c24: 0802d620 .word 0x0802d620
  58077. 8017c28: 0802d6d4 .word 0x0802d6d4
  58078. 8017c2c: 2402b180 .word 0x2402b180
  58079. 8017c30: 0802d6f8 .word 0x0802d6f8
  58080. 8017c34: 0802d704 .word 0x0802d704
  58081. 8017c38: 0802d72c .word 0x0802d72c
  58082. 08017c3c <lwip_sock_make_addr>:
  58083. /* Convert a netbuf's address data to struct sockaddr */
  58084. static int
  58085. lwip_sock_make_addr(struct netconn *conn, ip_addr_t *fromaddr, u16_t port,
  58086. struct sockaddr *from, socklen_t *fromlen)
  58087. {
  58088. 8017c3c: b590 push {r4, r7, lr}
  58089. 8017c3e: b08b sub sp, #44 @ 0x2c
  58090. 8017c40: af00 add r7, sp, #0
  58091. 8017c42: 60f8 str r0, [r7, #12]
  58092. 8017c44: 60b9 str r1, [r7, #8]
  58093. 8017c46: 603b str r3, [r7, #0]
  58094. 8017c48: 4613 mov r3, r2
  58095. 8017c4a: 80fb strh r3, [r7, #6]
  58096. int truncated = 0;
  58097. 8017c4c: 2300 movs r3, #0
  58098. 8017c4e: 627b str r3, [r7, #36] @ 0x24
  58099. union sockaddr_aligned saddr;
  58100. LWIP_UNUSED_ARG(conn);
  58101. LWIP_ASSERT("fromaddr != NULL", fromaddr != NULL);
  58102. 8017c50: 68bb ldr r3, [r7, #8]
  58103. 8017c52: 2b00 cmp r3, #0
  58104. 8017c54: d106 bne.n 8017c64 <lwip_sock_make_addr+0x28>
  58105. 8017c56: 4b2b ldr r3, [pc, #172] @ (8017d04 <lwip_sock_make_addr+0xc8>)
  58106. 8017c58: f240 4207 movw r2, #1031 @ 0x407
  58107. 8017c5c: 492a ldr r1, [pc, #168] @ (8017d08 <lwip_sock_make_addr+0xcc>)
  58108. 8017c5e: 482b ldr r0, [pc, #172] @ (8017d0c <lwip_sock_make_addr+0xd0>)
  58109. 8017c60: f011 feb4 bl 80299cc <iprintf>
  58110. LWIP_ASSERT("from != NULL", from != NULL);
  58111. 8017c64: 683b ldr r3, [r7, #0]
  58112. 8017c66: 2b00 cmp r3, #0
  58113. 8017c68: d106 bne.n 8017c78 <lwip_sock_make_addr+0x3c>
  58114. 8017c6a: 4b26 ldr r3, [pc, #152] @ (8017d04 <lwip_sock_make_addr+0xc8>)
  58115. 8017c6c: f44f 6281 mov.w r2, #1032 @ 0x408
  58116. 8017c70: 4927 ldr r1, [pc, #156] @ (8017d10 <lwip_sock_make_addr+0xd4>)
  58117. 8017c72: 4826 ldr r0, [pc, #152] @ (8017d0c <lwip_sock_make_addr+0xd0>)
  58118. 8017c74: f011 feaa bl 80299cc <iprintf>
  58119. LWIP_ASSERT("fromlen != NULL", fromlen != NULL);
  58120. 8017c78: 6bbb ldr r3, [r7, #56] @ 0x38
  58121. 8017c7a: 2b00 cmp r3, #0
  58122. 8017c7c: d106 bne.n 8017c8c <lwip_sock_make_addr+0x50>
  58123. 8017c7e: 4b21 ldr r3, [pc, #132] @ (8017d04 <lwip_sock_make_addr+0xc8>)
  58124. 8017c80: f240 4209 movw r2, #1033 @ 0x409
  58125. 8017c84: 4923 ldr r1, [pc, #140] @ (8017d14 <lwip_sock_make_addr+0xd8>)
  58126. 8017c86: 4821 ldr r0, [pc, #132] @ (8017d0c <lwip_sock_make_addr+0xd0>)
  58127. 8017c88: f011 fea0 bl 80299cc <iprintf>
  58128. ip4_2_ipv4_mapped_ipv6(ip_2_ip6(fromaddr), ip_2_ip4(fromaddr));
  58129. IP_SET_TYPE(fromaddr, IPADDR_TYPE_V6);
  58130. }
  58131. #endif /* LWIP_IPV4 && LWIP_IPV6 */
  58132. IPADDR_PORT_TO_SOCKADDR(&saddr, fromaddr, port);
  58133. 8017c8c: f107 0314 add.w r3, r7, #20
  58134. 8017c90: 2210 movs r2, #16
  58135. 8017c92: 701a strb r2, [r3, #0]
  58136. 8017c94: f107 0314 add.w r3, r7, #20
  58137. 8017c98: 2202 movs r2, #2
  58138. 8017c9a: 705a strb r2, [r3, #1]
  58139. 8017c9c: f107 0414 add.w r4, r7, #20
  58140. 8017ca0: 88fb ldrh r3, [r7, #6]
  58141. 8017ca2: 4618 mov r0, r3
  58142. 8017ca4: f000 ff38 bl 8018b18 <lwip_htons>
  58143. 8017ca8: 4603 mov r3, r0
  58144. 8017caa: 8063 strh r3, [r4, #2]
  58145. 8017cac: f107 0314 add.w r3, r7, #20
  58146. 8017cb0: 68ba ldr r2, [r7, #8]
  58147. 8017cb2: 6812 ldr r2, [r2, #0]
  58148. 8017cb4: 605a str r2, [r3, #4]
  58149. 8017cb6: f107 0314 add.w r3, r7, #20
  58150. 8017cba: 3308 adds r3, #8
  58151. 8017cbc: 2208 movs r2, #8
  58152. 8017cbe: 2100 movs r1, #0
  58153. 8017cc0: 4618 mov r0, r3
  58154. 8017cc2: f012 f815 bl 8029cf0 <memset>
  58155. if (*fromlen < saddr.sa.sa_len) {
  58156. 8017cc6: 6bbb ldr r3, [r7, #56] @ 0x38
  58157. 8017cc8: 681b ldr r3, [r3, #0]
  58158. 8017cca: 7d3a ldrb r2, [r7, #20]
  58159. 8017ccc: 4293 cmp r3, r2
  58160. 8017cce: d202 bcs.n 8017cd6 <lwip_sock_make_addr+0x9a>
  58161. truncated = 1;
  58162. 8017cd0: 2301 movs r3, #1
  58163. 8017cd2: 627b str r3, [r7, #36] @ 0x24
  58164. 8017cd4: e008 b.n 8017ce8 <lwip_sock_make_addr+0xac>
  58165. } else if (*fromlen > saddr.sa.sa_len) {
  58166. 8017cd6: 6bbb ldr r3, [r7, #56] @ 0x38
  58167. 8017cd8: 681b ldr r3, [r3, #0]
  58168. 8017cda: 7d3a ldrb r2, [r7, #20]
  58169. 8017cdc: 4293 cmp r3, r2
  58170. 8017cde: d903 bls.n 8017ce8 <lwip_sock_make_addr+0xac>
  58171. *fromlen = saddr.sa.sa_len;
  58172. 8017ce0: 7d3b ldrb r3, [r7, #20]
  58173. 8017ce2: 461a mov r2, r3
  58174. 8017ce4: 6bbb ldr r3, [r7, #56] @ 0x38
  58175. 8017ce6: 601a str r2, [r3, #0]
  58176. }
  58177. MEMCPY(from, &saddr, *fromlen);
  58178. 8017ce8: 6bbb ldr r3, [r7, #56] @ 0x38
  58179. 8017cea: 681a ldr r2, [r3, #0]
  58180. 8017cec: f107 0314 add.w r3, r7, #20
  58181. 8017cf0: 4619 mov r1, r3
  58182. 8017cf2: 6838 ldr r0, [r7, #0]
  58183. 8017cf4: f012 f8f3 bl 8029ede <memcpy>
  58184. return truncated;
  58185. 8017cf8: 6a7b ldr r3, [r7, #36] @ 0x24
  58186. }
  58187. 8017cfa: 4618 mov r0, r3
  58188. 8017cfc: 372c adds r7, #44 @ 0x2c
  58189. 8017cfe: 46bd mov sp, r7
  58190. 8017d00: bd90 pop {r4, r7, pc}
  58191. 8017d02: bf00 nop
  58192. 8017d04: 0802d5cc .word 0x0802d5cc
  58193. 8017d08: 0802d73c .word 0x0802d73c
  58194. 8017d0c: 0802d620 .word 0x0802d620
  58195. 8017d10: 0802d750 .word 0x0802d750
  58196. 8017d14: 0802d760 .word 0x0802d760
  58197. 08017d18 <lwip_recv_tcp_from>:
  58198. #if LWIP_TCP
  58199. /* Helper function to get a tcp socket's remote address info */
  58200. static int
  58201. lwip_recv_tcp_from(struct lwip_sock *sock, struct sockaddr *from, socklen_t *fromlen, const char *dbg_fn, int dbg_s, ssize_t dbg_ret)
  58202. {
  58203. 8017d18: b580 push {r7, lr}
  58204. 8017d1a: b088 sub sp, #32
  58205. 8017d1c: af02 add r7, sp, #8
  58206. 8017d1e: 60f8 str r0, [r7, #12]
  58207. 8017d20: 60b9 str r1, [r7, #8]
  58208. 8017d22: 607a str r2, [r7, #4]
  58209. 8017d24: 603b str r3, [r7, #0]
  58210. if (sock == NULL) {
  58211. 8017d26: 68fb ldr r3, [r7, #12]
  58212. 8017d28: 2b00 cmp r3, #0
  58213. 8017d2a: d101 bne.n 8017d30 <lwip_recv_tcp_from+0x18>
  58214. return 0;
  58215. 8017d2c: 2300 movs r3, #0
  58216. 8017d2e: e021 b.n 8017d74 <lwip_recv_tcp_from+0x5c>
  58217. LWIP_UNUSED_ARG(dbg_fn);
  58218. LWIP_UNUSED_ARG(dbg_s);
  58219. LWIP_UNUSED_ARG(dbg_ret);
  58220. #if !SOCKETS_DEBUG
  58221. if (from && fromlen)
  58222. 8017d30: 68bb ldr r3, [r7, #8]
  58223. 8017d32: 2b00 cmp r3, #0
  58224. 8017d34: d01d beq.n 8017d72 <lwip_recv_tcp_from+0x5a>
  58225. 8017d36: 687b ldr r3, [r7, #4]
  58226. 8017d38: 2b00 cmp r3, #0
  58227. 8017d3a: d01a beq.n 8017d72 <lwip_recv_tcp_from+0x5a>
  58228. #endif /* !SOCKETS_DEBUG */
  58229. {
  58230. /* get remote addr/port from tcp_pcb */
  58231. u16_t port;
  58232. ip_addr_t tmpaddr;
  58233. netconn_getaddr(sock->conn, &tmpaddr, &port, 0);
  58234. 8017d3c: 68fb ldr r3, [r7, #12]
  58235. 8017d3e: 6818 ldr r0, [r3, #0]
  58236. 8017d40: f107 0216 add.w r2, r7, #22
  58237. 8017d44: f107 0110 add.w r1, r7, #16
  58238. 8017d48: 2300 movs r3, #0
  58239. 8017d4a: f7fd fad7 bl 80152fc <netconn_getaddr>
  58240. LWIP_DEBUGF(SOCKETS_DEBUG, ("%s(%d): addr=", dbg_fn, dbg_s));
  58241. ip_addr_debug_print_val(SOCKETS_DEBUG, tmpaddr);
  58242. LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", port, (int)dbg_ret));
  58243. if (from && fromlen) {
  58244. 8017d4e: 68bb ldr r3, [r7, #8]
  58245. 8017d50: 2b00 cmp r3, #0
  58246. 8017d52: d00e beq.n 8017d72 <lwip_recv_tcp_from+0x5a>
  58247. 8017d54: 687b ldr r3, [r7, #4]
  58248. 8017d56: 2b00 cmp r3, #0
  58249. 8017d58: d00b beq.n 8017d72 <lwip_recv_tcp_from+0x5a>
  58250. return lwip_sock_make_addr(sock->conn, &tmpaddr, port, from, fromlen);
  58251. 8017d5a: 68fb ldr r3, [r7, #12]
  58252. 8017d5c: 6818 ldr r0, [r3, #0]
  58253. 8017d5e: 8afa ldrh r2, [r7, #22]
  58254. 8017d60: f107 0110 add.w r1, r7, #16
  58255. 8017d64: 687b ldr r3, [r7, #4]
  58256. 8017d66: 9300 str r3, [sp, #0]
  58257. 8017d68: 68bb ldr r3, [r7, #8]
  58258. 8017d6a: f7ff ff67 bl 8017c3c <lwip_sock_make_addr>
  58259. 8017d6e: 4603 mov r3, r0
  58260. 8017d70: e000 b.n 8017d74 <lwip_recv_tcp_from+0x5c>
  58261. }
  58262. }
  58263. return 0;
  58264. 8017d72: 2300 movs r3, #0
  58265. }
  58266. 8017d74: 4618 mov r0, r3
  58267. 8017d76: 3718 adds r7, #24
  58268. 8017d78: 46bd mov sp, r7
  58269. 8017d7a: bd80 pop {r7, pc}
  58270. 08017d7c <lwip_recvfrom_udp_raw>:
  58271. /* Helper function to receive a netbuf from a udp or raw netconn.
  58272. * Keeps sock->lastdata for peeking.
  58273. */
  58274. static err_t
  58275. lwip_recvfrom_udp_raw(struct lwip_sock *sock, int flags, struct msghdr *msg, u16_t *datagram_len, int dbg_s)
  58276. {
  58277. 8017d7c: b590 push {r4, r7, lr}
  58278. 8017d7e: b08d sub sp, #52 @ 0x34
  58279. 8017d80: af02 add r7, sp, #8
  58280. 8017d82: 60f8 str r0, [r7, #12]
  58281. 8017d84: 60b9 str r1, [r7, #8]
  58282. 8017d86: 607a str r2, [r7, #4]
  58283. 8017d88: 603b str r3, [r7, #0]
  58284. err_t err;
  58285. u16_t buflen, copylen, copied;
  58286. int i;
  58287. LWIP_UNUSED_ARG(dbg_s);
  58288. LWIP_ERROR("lwip_recvfrom_udp_raw: invalid arguments", (msg->msg_iov != NULL) || (msg->msg_iovlen <= 0), return ERR_ARG;);
  58289. 8017d8a: 687b ldr r3, [r7, #4]
  58290. 8017d8c: 689b ldr r3, [r3, #8]
  58291. 8017d8e: 2b00 cmp r3, #0
  58292. 8017d90: d10d bne.n 8017dae <lwip_recvfrom_udp_raw+0x32>
  58293. 8017d92: 687b ldr r3, [r7, #4]
  58294. 8017d94: 68db ldr r3, [r3, #12]
  58295. 8017d96: 2b00 cmp r3, #0
  58296. 8017d98: dd09 ble.n 8017dae <lwip_recvfrom_udp_raw+0x32>
  58297. 8017d9a: 4b5e ldr r3, [pc, #376] @ (8017f14 <lwip_recvfrom_udp_raw+0x198>)
  58298. 8017d9c: f240 4249 movw r2, #1097 @ 0x449
  58299. 8017da0: 495d ldr r1, [pc, #372] @ (8017f18 <lwip_recvfrom_udp_raw+0x19c>)
  58300. 8017da2: 485e ldr r0, [pc, #376] @ (8017f1c <lwip_recvfrom_udp_raw+0x1a0>)
  58301. 8017da4: f011 fe12 bl 80299cc <iprintf>
  58302. 8017da8: f06f 030f mvn.w r3, #15
  58303. 8017dac: e0ae b.n 8017f0c <lwip_recvfrom_udp_raw+0x190>
  58304. if (flags & MSG_DONTWAIT) {
  58305. 8017dae: 68bb ldr r3, [r7, #8]
  58306. 8017db0: f003 0308 and.w r3, r3, #8
  58307. 8017db4: 2b00 cmp r3, #0
  58308. 8017db6: d003 beq.n 8017dc0 <lwip_recvfrom_udp_raw+0x44>
  58309. apiflags = NETCONN_DONTBLOCK;
  58310. 8017db8: 2304 movs r3, #4
  58311. 8017dba: f887 3026 strb.w r3, [r7, #38] @ 0x26
  58312. 8017dbe: e002 b.n 8017dc6 <lwip_recvfrom_udp_raw+0x4a>
  58313. } else {
  58314. apiflags = 0;
  58315. 8017dc0: 2300 movs r3, #0
  58316. 8017dc2: f887 3026 strb.w r3, [r7, #38] @ 0x26
  58317. }
  58318. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw[UDP/RAW]: top sock->lastdata=%p\n", (void *)sock->lastdata.netbuf));
  58319. /* Check if there is data left from the last recv operation. */
  58320. buf = sock->lastdata.netbuf;
  58321. 8017dc6: 68fb ldr r3, [r7, #12]
  58322. 8017dc8: 685b ldr r3, [r3, #4]
  58323. 8017dca: 613b str r3, [r7, #16]
  58324. if (buf == NULL) {
  58325. 8017dcc: 693b ldr r3, [r7, #16]
  58326. 8017dce: 2b00 cmp r3, #0
  58327. 8017dd0: d11f bne.n 8017e12 <lwip_recvfrom_udp_raw+0x96>
  58328. /* No data was left from the previous operation, so we try to get
  58329. some from the network. */
  58330. err = netconn_recv_udp_raw_netbuf_flags(sock->conn, &buf, apiflags);
  58331. 8017dd2: 68fb ldr r3, [r7, #12]
  58332. 8017dd4: 681b ldr r3, [r3, #0]
  58333. 8017dd6: f897 2026 ldrb.w r2, [r7, #38] @ 0x26
  58334. 8017dda: f107 0110 add.w r1, r7, #16
  58335. 8017dde: 4618 mov r0, r3
  58336. 8017de0: f7fd fd34 bl 801584c <netconn_recv_udp_raw_netbuf_flags>
  58337. 8017de4: 4603 mov r3, r0
  58338. 8017de6: f887 3027 strb.w r3, [r7, #39] @ 0x27
  58339. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw[UDP/RAW]: netconn_recv err=%d, netbuf=%p\n",
  58340. err, (void *)buf));
  58341. if (err != ERR_OK) {
  58342. 8017dea: f997 3027 ldrsb.w r3, [r7, #39] @ 0x27
  58343. 8017dee: 2b00 cmp r3, #0
  58344. 8017df0: d002 beq.n 8017df8 <lwip_recvfrom_udp_raw+0x7c>
  58345. return err;
  58346. 8017df2: f997 3027 ldrsb.w r3, [r7, #39] @ 0x27
  58347. 8017df6: e089 b.n 8017f0c <lwip_recvfrom_udp_raw+0x190>
  58348. }
  58349. LWIP_ASSERT("buf != NULL", buf != NULL);
  58350. 8017df8: 693b ldr r3, [r7, #16]
  58351. 8017dfa: 2b00 cmp r3, #0
  58352. 8017dfc: d106 bne.n 8017e0c <lwip_recvfrom_udp_raw+0x90>
  58353. 8017dfe: 4b45 ldr r3, [pc, #276] @ (8017f14 <lwip_recvfrom_udp_raw+0x198>)
  58354. 8017e00: f240 425e movw r2, #1118 @ 0x45e
  58355. 8017e04: 4946 ldr r1, [pc, #280] @ (8017f20 <lwip_recvfrom_udp_raw+0x1a4>)
  58356. 8017e06: 4845 ldr r0, [pc, #276] @ (8017f1c <lwip_recvfrom_udp_raw+0x1a0>)
  58357. 8017e08: f011 fde0 bl 80299cc <iprintf>
  58358. sock->lastdata.netbuf = buf;
  58359. 8017e0c: 693a ldr r2, [r7, #16]
  58360. 8017e0e: 68fb ldr r3, [r7, #12]
  58361. 8017e10: 605a str r2, [r3, #4]
  58362. }
  58363. buflen = buf->p->tot_len;
  58364. 8017e12: 693b ldr r3, [r7, #16]
  58365. 8017e14: 681b ldr r3, [r3, #0]
  58366. 8017e16: 891b ldrh r3, [r3, #8]
  58367. 8017e18: 837b strh r3, [r7, #26]
  58368. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw: buflen=%"U16_F"\n", buflen));
  58369. copied = 0;
  58370. 8017e1a: 2300 movs r3, #0
  58371. 8017e1c: 847b strh r3, [r7, #34] @ 0x22
  58372. /* copy the pbuf payload into the iovs */
  58373. for (i = 0; (i < msg->msg_iovlen) && (copied < buflen); i++) {
  58374. 8017e1e: 2300 movs r3, #0
  58375. 8017e20: 61fb str r3, [r7, #28]
  58376. 8017e22: e029 b.n 8017e78 <lwip_recvfrom_udp_raw+0xfc>
  58377. u16_t len_left = (u16_t)(buflen - copied);
  58378. 8017e24: 8b7a ldrh r2, [r7, #26]
  58379. 8017e26: 8c7b ldrh r3, [r7, #34] @ 0x22
  58380. 8017e28: 1ad3 subs r3, r2, r3
  58381. 8017e2a: 833b strh r3, [r7, #24]
  58382. if (msg->msg_iov[i].iov_len > len_left) {
  58383. 8017e2c: 687b ldr r3, [r7, #4]
  58384. 8017e2e: 689a ldr r2, [r3, #8]
  58385. 8017e30: 69fb ldr r3, [r7, #28]
  58386. 8017e32: 00db lsls r3, r3, #3
  58387. 8017e34: 4413 add r3, r2
  58388. 8017e36: 685a ldr r2, [r3, #4]
  58389. 8017e38: 8b3b ldrh r3, [r7, #24]
  58390. 8017e3a: 429a cmp r2, r3
  58391. 8017e3c: d902 bls.n 8017e44 <lwip_recvfrom_udp_raw+0xc8>
  58392. copylen = len_left;
  58393. 8017e3e: 8b3b ldrh r3, [r7, #24]
  58394. 8017e40: 84bb strh r3, [r7, #36] @ 0x24
  58395. 8017e42: e006 b.n 8017e52 <lwip_recvfrom_udp_raw+0xd6>
  58396. } else {
  58397. copylen = (u16_t)msg->msg_iov[i].iov_len;
  58398. 8017e44: 687b ldr r3, [r7, #4]
  58399. 8017e46: 689a ldr r2, [r3, #8]
  58400. 8017e48: 69fb ldr r3, [r7, #28]
  58401. 8017e4a: 00db lsls r3, r3, #3
  58402. 8017e4c: 4413 add r3, r2
  58403. 8017e4e: 685b ldr r3, [r3, #4]
  58404. 8017e50: 84bb strh r3, [r7, #36] @ 0x24
  58405. }
  58406. /* copy the contents of the received buffer into
  58407. the supplied memory buffer */
  58408. pbuf_copy_partial(buf->p, (u8_t *)msg->msg_iov[i].iov_base, copylen, copied);
  58409. 8017e52: 693b ldr r3, [r7, #16]
  58410. 8017e54: 6818 ldr r0, [r3, #0]
  58411. 8017e56: 687b ldr r3, [r7, #4]
  58412. 8017e58: 689a ldr r2, [r3, #8]
  58413. 8017e5a: 69fb ldr r3, [r7, #28]
  58414. 8017e5c: 00db lsls r3, r3, #3
  58415. 8017e5e: 4413 add r3, r2
  58416. 8017e60: 6819 ldr r1, [r3, #0]
  58417. 8017e62: 8c7b ldrh r3, [r7, #34] @ 0x22
  58418. 8017e64: 8cba ldrh r2, [r7, #36] @ 0x24
  58419. 8017e66: f002 fd3f bl 801a8e8 <pbuf_copy_partial>
  58420. copied = (u16_t)(copied + copylen);
  58421. 8017e6a: 8c7a ldrh r2, [r7, #34] @ 0x22
  58422. 8017e6c: 8cbb ldrh r3, [r7, #36] @ 0x24
  58423. 8017e6e: 4413 add r3, r2
  58424. 8017e70: 847b strh r3, [r7, #34] @ 0x22
  58425. for (i = 0; (i < msg->msg_iovlen) && (copied < buflen); i++) {
  58426. 8017e72: 69fb ldr r3, [r7, #28]
  58427. 8017e74: 3301 adds r3, #1
  58428. 8017e76: 61fb str r3, [r7, #28]
  58429. 8017e78: 687b ldr r3, [r7, #4]
  58430. 8017e7a: 68db ldr r3, [r3, #12]
  58431. 8017e7c: 69fa ldr r2, [r7, #28]
  58432. 8017e7e: 429a cmp r2, r3
  58433. 8017e80: da03 bge.n 8017e8a <lwip_recvfrom_udp_raw+0x10e>
  58434. 8017e82: 8c7a ldrh r2, [r7, #34] @ 0x22
  58435. 8017e84: 8b7b ldrh r3, [r7, #26]
  58436. 8017e86: 429a cmp r2, r3
  58437. 8017e88: d3cc bcc.n 8017e24 <lwip_recvfrom_udp_raw+0xa8>
  58438. }
  58439. /* Check to see from where the data was.*/
  58440. #if !SOCKETS_DEBUG
  58441. if (msg->msg_name && msg->msg_namelen)
  58442. 8017e8a: 687b ldr r3, [r7, #4]
  58443. 8017e8c: 681b ldr r3, [r3, #0]
  58444. 8017e8e: 2b00 cmp r3, #0
  58445. 8017e90: d01a beq.n 8017ec8 <lwip_recvfrom_udp_raw+0x14c>
  58446. 8017e92: 687b ldr r3, [r7, #4]
  58447. 8017e94: 685b ldr r3, [r3, #4]
  58448. 8017e96: 2b00 cmp r3, #0
  58449. 8017e98: d016 beq.n 8017ec8 <lwip_recvfrom_udp_raw+0x14c>
  58450. #endif /* !SOCKETS_DEBUG */
  58451. {
  58452. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw(%d): addr=", dbg_s));
  58453. ip_addr_debug_print_val(SOCKETS_DEBUG, *netbuf_fromaddr(buf));
  58454. LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", netbuf_fromport(buf), copied));
  58455. if (msg->msg_name && msg->msg_namelen) {
  58456. 8017e9a: 687b ldr r3, [r7, #4]
  58457. 8017e9c: 681b ldr r3, [r3, #0]
  58458. 8017e9e: 2b00 cmp r3, #0
  58459. 8017ea0: d012 beq.n 8017ec8 <lwip_recvfrom_udp_raw+0x14c>
  58460. 8017ea2: 687b ldr r3, [r7, #4]
  58461. 8017ea4: 685b ldr r3, [r3, #4]
  58462. 8017ea6: 2b00 cmp r3, #0
  58463. 8017ea8: d00e beq.n 8017ec8 <lwip_recvfrom_udp_raw+0x14c>
  58464. lwip_sock_make_addr(sock->conn, netbuf_fromaddr(buf), netbuf_fromport(buf),
  58465. 8017eaa: 68fb ldr r3, [r7, #12]
  58466. 8017eac: 6818 ldr r0, [r3, #0]
  58467. 8017eae: 693b ldr r3, [r7, #16]
  58468. 8017eb0: f103 0108 add.w r1, r3, #8
  58469. 8017eb4: 693b ldr r3, [r7, #16]
  58470. 8017eb6: 899a ldrh r2, [r3, #12]
  58471. (struct sockaddr *)msg->msg_name, &msg->msg_namelen);
  58472. 8017eb8: 687b ldr r3, [r7, #4]
  58473. 8017eba: 681c ldr r4, [r3, #0]
  58474. lwip_sock_make_addr(sock->conn, netbuf_fromaddr(buf), netbuf_fromport(buf),
  58475. 8017ebc: 687b ldr r3, [r7, #4]
  58476. 8017ebe: 3304 adds r3, #4
  58477. 8017ec0: 9300 str r3, [sp, #0]
  58478. 8017ec2: 4623 mov r3, r4
  58479. 8017ec4: f7ff feba bl 8017c3c <lwip_sock_make_addr>
  58480. }
  58481. }
  58482. /* Initialize flag output */
  58483. msg->msg_flags = 0;
  58484. 8017ec8: 687b ldr r3, [r7, #4]
  58485. 8017eca: 2200 movs r2, #0
  58486. 8017ecc: 619a str r2, [r3, #24]
  58487. if (msg->msg_control) {
  58488. 8017ece: 687b ldr r3, [r7, #4]
  58489. 8017ed0: 691b ldr r3, [r3, #16]
  58490. 8017ed2: 2b00 cmp r3, #0
  58491. 8017ed4: d007 beq.n 8017ee6 <lwip_recvfrom_udp_raw+0x16a>
  58492. u8_t wrote_msg = 0;
  58493. 8017ed6: 2300 movs r3, #0
  58494. 8017ed8: 75fb strb r3, [r7, #23]
  58495. #endif /* LWIP_IPV4 */
  58496. }
  58497. }
  58498. #endif /* LWIP_NETBUF_RECVINFO */
  58499. if (!wrote_msg) {
  58500. 8017eda: 7dfb ldrb r3, [r7, #23]
  58501. 8017edc: 2b00 cmp r3, #0
  58502. 8017ede: d102 bne.n 8017ee6 <lwip_recvfrom_udp_raw+0x16a>
  58503. msg->msg_controllen = 0;
  58504. 8017ee0: 687b ldr r3, [r7, #4]
  58505. 8017ee2: 2200 movs r2, #0
  58506. 8017ee4: 615a str r2, [r3, #20]
  58507. }
  58508. }
  58509. /* If we don't peek the incoming message: zero lastdata pointer and free the netbuf */
  58510. if ((flags & MSG_PEEK) == 0) {
  58511. 8017ee6: 68bb ldr r3, [r7, #8]
  58512. 8017ee8: f003 0301 and.w r3, r3, #1
  58513. 8017eec: 2b00 cmp r3, #0
  58514. 8017eee: d106 bne.n 8017efe <lwip_recvfrom_udp_raw+0x182>
  58515. sock->lastdata.netbuf = NULL;
  58516. 8017ef0: 68fb ldr r3, [r7, #12]
  58517. 8017ef2: 2200 movs r2, #0
  58518. 8017ef4: 605a str r2, [r3, #4]
  58519. netbuf_delete(buf);
  58520. 8017ef6: 693b ldr r3, [r7, #16]
  58521. 8017ef8: 4618 mov r0, r3
  58522. 8017efa: f7ff fb05 bl 8017508 <netbuf_delete>
  58523. }
  58524. if (datagram_len) {
  58525. 8017efe: 683b ldr r3, [r7, #0]
  58526. 8017f00: 2b00 cmp r3, #0
  58527. 8017f02: d002 beq.n 8017f0a <lwip_recvfrom_udp_raw+0x18e>
  58528. *datagram_len = buflen;
  58529. 8017f04: 683b ldr r3, [r7, #0]
  58530. 8017f06: 8b7a ldrh r2, [r7, #26]
  58531. 8017f08: 801a strh r2, [r3, #0]
  58532. }
  58533. return ERR_OK;
  58534. 8017f0a: 2300 movs r3, #0
  58535. }
  58536. 8017f0c: 4618 mov r0, r3
  58537. 8017f0e: 372c adds r7, #44 @ 0x2c
  58538. 8017f10: 46bd mov sp, r7
  58539. 8017f12: bd90 pop {r4, r7, pc}
  58540. 8017f14: 0802d5cc .word 0x0802d5cc
  58541. 8017f18: 0802d770 .word 0x0802d770
  58542. 8017f1c: 0802d620 .word 0x0802d620
  58543. 8017f20: 0802d79c .word 0x0802d79c
  58544. 08017f24 <lwip_recvfrom>:
  58545. ssize_t
  58546. lwip_recvfrom(int s, void *mem, size_t len, int flags,
  58547. struct sockaddr *from, socklen_t *fromlen)
  58548. {
  58549. 8017f24: b580 push {r7, lr}
  58550. 8017f26: b096 sub sp, #88 @ 0x58
  58551. 8017f28: af02 add r7, sp, #8
  58552. 8017f2a: 60f8 str r0, [r7, #12]
  58553. 8017f2c: 60b9 str r1, [r7, #8]
  58554. 8017f2e: 607a str r2, [r7, #4]
  58555. 8017f30: 603b str r3, [r7, #0]
  58556. struct lwip_sock *sock;
  58557. ssize_t ret;
  58558. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %"SZT_F", 0x%x, ..)\n", s, mem, len, flags));
  58559. sock = get_socket(s);
  58560. 8017f32: 68f8 ldr r0, [r7, #12]
  58561. 8017f34: f7ff fbb8 bl 80176a8 <get_socket>
  58562. 8017f38: 64f8 str r0, [r7, #76] @ 0x4c
  58563. if (!sock) {
  58564. 8017f3a: 6cfb ldr r3, [r7, #76] @ 0x4c
  58565. 8017f3c: 2b00 cmp r3, #0
  58566. 8017f3e: d102 bne.n 8017f46 <lwip_recvfrom+0x22>
  58567. return -1;
  58568. 8017f40: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  58569. 8017f44: e078 b.n 8018038 <lwip_recvfrom+0x114>
  58570. }
  58571. #if LWIP_TCP
  58572. if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
  58573. 8017f46: 6cfb ldr r3, [r7, #76] @ 0x4c
  58574. 8017f48: 681b ldr r3, [r3, #0]
  58575. 8017f4a: 781b ldrb r3, [r3, #0]
  58576. 8017f4c: f003 03f0 and.w r3, r3, #240 @ 0xf0
  58577. 8017f50: 2b10 cmp r3, #16
  58578. 8017f52: d112 bne.n 8017f7a <lwip_recvfrom+0x56>
  58579. ret = lwip_recv_tcp(sock, mem, len, flags);
  58580. 8017f54: 683b ldr r3, [r7, #0]
  58581. 8017f56: 687a ldr r2, [r7, #4]
  58582. 8017f58: 68b9 ldr r1, [r7, #8]
  58583. 8017f5a: 6cf8 ldr r0, [r7, #76] @ 0x4c
  58584. 8017f5c: f7ff fd5e bl 8017a1c <lwip_recv_tcp>
  58585. 8017f60: 6478 str r0, [r7, #68] @ 0x44
  58586. lwip_recv_tcp_from(sock, from, fromlen, "lwip_recvfrom", s, ret);
  58587. 8017f62: 6c7b ldr r3, [r7, #68] @ 0x44
  58588. 8017f64: 9301 str r3, [sp, #4]
  58589. 8017f66: 68fb ldr r3, [r7, #12]
  58590. 8017f68: 9300 str r3, [sp, #0]
  58591. 8017f6a: 4b35 ldr r3, [pc, #212] @ (8018040 <lwip_recvfrom+0x11c>)
  58592. 8017f6c: 6dfa ldr r2, [r7, #92] @ 0x5c
  58593. 8017f6e: 6db9 ldr r1, [r7, #88] @ 0x58
  58594. 8017f70: 6cf8 ldr r0, [r7, #76] @ 0x4c
  58595. 8017f72: f7ff fed1 bl 8017d18 <lwip_recv_tcp_from>
  58596. done_socket(sock);
  58597. return ret;
  58598. 8017f76: 6c7b ldr r3, [r7, #68] @ 0x44
  58599. 8017f78: e05e b.n 8018038 <lwip_recvfrom+0x114>
  58600. } else
  58601. #endif
  58602. {
  58603. u16_t datagram_len = 0;
  58604. 8017f7a: 2300 movs r3, #0
  58605. 8017f7c: 877b strh r3, [r7, #58] @ 0x3a
  58606. struct iovec vec;
  58607. struct msghdr msg;
  58608. err_t err;
  58609. vec.iov_base = mem;
  58610. 8017f7e: 68bb ldr r3, [r7, #8]
  58611. 8017f80: 633b str r3, [r7, #48] @ 0x30
  58612. vec.iov_len = len;
  58613. 8017f82: 687b ldr r3, [r7, #4]
  58614. 8017f84: 637b str r3, [r7, #52] @ 0x34
  58615. msg.msg_control = NULL;
  58616. 8017f86: 2300 movs r3, #0
  58617. 8017f88: 627b str r3, [r7, #36] @ 0x24
  58618. msg.msg_controllen = 0;
  58619. 8017f8a: 2300 movs r3, #0
  58620. 8017f8c: 62bb str r3, [r7, #40] @ 0x28
  58621. msg.msg_flags = 0;
  58622. 8017f8e: 2300 movs r3, #0
  58623. 8017f90: 62fb str r3, [r7, #44] @ 0x2c
  58624. msg.msg_iov = &vec;
  58625. 8017f92: f107 0330 add.w r3, r7, #48 @ 0x30
  58626. 8017f96: 61fb str r3, [r7, #28]
  58627. msg.msg_iovlen = 1;
  58628. 8017f98: 2301 movs r3, #1
  58629. 8017f9a: 623b str r3, [r7, #32]
  58630. msg.msg_name = from;
  58631. 8017f9c: 6dbb ldr r3, [r7, #88] @ 0x58
  58632. 8017f9e: 617b str r3, [r7, #20]
  58633. msg.msg_namelen = (fromlen ? *fromlen : 0);
  58634. 8017fa0: 6dfb ldr r3, [r7, #92] @ 0x5c
  58635. 8017fa2: 2b00 cmp r3, #0
  58636. 8017fa4: d002 beq.n 8017fac <lwip_recvfrom+0x88>
  58637. 8017fa6: 6dfb ldr r3, [r7, #92] @ 0x5c
  58638. 8017fa8: 681b ldr r3, [r3, #0]
  58639. 8017faa: e000 b.n 8017fae <lwip_recvfrom+0x8a>
  58640. 8017fac: 2300 movs r3, #0
  58641. 8017fae: 61bb str r3, [r7, #24]
  58642. err = lwip_recvfrom_udp_raw(sock, flags, &msg, &datagram_len, s);
  58643. 8017fb0: f107 013a add.w r1, r7, #58 @ 0x3a
  58644. 8017fb4: f107 0214 add.w r2, r7, #20
  58645. 8017fb8: 68fb ldr r3, [r7, #12]
  58646. 8017fba: 9300 str r3, [sp, #0]
  58647. 8017fbc: 460b mov r3, r1
  58648. 8017fbe: 6839 ldr r1, [r7, #0]
  58649. 8017fc0: 6cf8 ldr r0, [r7, #76] @ 0x4c
  58650. 8017fc2: f7ff fedb bl 8017d7c <lwip_recvfrom_udp_raw>
  58651. 8017fc6: 4603 mov r3, r0
  58652. 8017fc8: f887 304b strb.w r3, [r7, #75] @ 0x4b
  58653. if (err != ERR_OK) {
  58654. 8017fcc: f997 304b ldrsb.w r3, [r7, #75] @ 0x4b
  58655. 8017fd0: 2b00 cmp r3, #0
  58656. 8017fd2: d00e beq.n 8017ff2 <lwip_recvfrom+0xce>
  58657. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom[UDP/RAW](%d): buf == NULL, error is \"%s\"!\n",
  58658. s, lwip_strerr(err)));
  58659. sock_set_errno(sock, err_to_errno(err));
  58660. 8017fd4: f997 304b ldrsb.w r3, [r7, #75] @ 0x4b
  58661. 8017fd8: 4618 mov r0, r3
  58662. 8017fda: f7ff fa77 bl 80174cc <err_to_errno>
  58663. 8017fde: 63f8 str r0, [r7, #60] @ 0x3c
  58664. 8017fe0: 6bfb ldr r3, [r7, #60] @ 0x3c
  58665. 8017fe2: 2b00 cmp r3, #0
  58666. 8017fe4: d002 beq.n 8017fec <lwip_recvfrom+0xc8>
  58667. 8017fe6: 4a17 ldr r2, [pc, #92] @ (8018044 <lwip_recvfrom+0x120>)
  58668. 8017fe8: 6bfb ldr r3, [r7, #60] @ 0x3c
  58669. 8017fea: 6013 str r3, [r2, #0]
  58670. done_socket(sock);
  58671. return -1;
  58672. 8017fec: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  58673. 8017ff0: e022 b.n 8018038 <lwip_recvfrom+0x114>
  58674. }
  58675. ret = (ssize_t)LWIP_MIN(LWIP_MIN(len, datagram_len), SSIZE_MAX);
  58676. 8017ff2: 8f7b ldrh r3, [r7, #58] @ 0x3a
  58677. 8017ff4: 461a mov r2, r3
  58678. 8017ff6: 687b ldr r3, [r7, #4]
  58679. 8017ff8: 4293 cmp r3, r2
  58680. 8017ffa: bf28 it cs
  58681. 8017ffc: 4613 movcs r3, r2
  58682. 8017ffe: f06f 4200 mvn.w r2, #2147483648 @ 0x80000000
  58683. 8018002: 4293 cmp r3, r2
  58684. 8018004: d206 bcs.n 8018014 <lwip_recvfrom+0xf0>
  58685. 8018006: 8f7b ldrh r3, [r7, #58] @ 0x3a
  58686. 8018008: 461a mov r2, r3
  58687. 801800a: 687b ldr r3, [r7, #4]
  58688. 801800c: 4293 cmp r3, r2
  58689. 801800e: bf28 it cs
  58690. 8018010: 4613 movcs r3, r2
  58691. 8018012: e001 b.n 8018018 <lwip_recvfrom+0xf4>
  58692. 8018014: f06f 4300 mvn.w r3, #2147483648 @ 0x80000000
  58693. 8018018: 647b str r3, [r7, #68] @ 0x44
  58694. if (fromlen) {
  58695. 801801a: 6dfb ldr r3, [r7, #92] @ 0x5c
  58696. 801801c: 2b00 cmp r3, #0
  58697. 801801e: d002 beq.n 8018026 <lwip_recvfrom+0x102>
  58698. *fromlen = msg.msg_namelen;
  58699. 8018020: 69ba ldr r2, [r7, #24]
  58700. 8018022: 6dfb ldr r3, [r7, #92] @ 0x5c
  58701. 8018024: 601a str r2, [r3, #0]
  58702. }
  58703. }
  58704. sock_set_errno(sock, 0);
  58705. 8018026: 2300 movs r3, #0
  58706. 8018028: 643b str r3, [r7, #64] @ 0x40
  58707. 801802a: 6c3b ldr r3, [r7, #64] @ 0x40
  58708. 801802c: 2b00 cmp r3, #0
  58709. 801802e: d002 beq.n 8018036 <lwip_recvfrom+0x112>
  58710. 8018030: 4a04 ldr r2, [pc, #16] @ (8018044 <lwip_recvfrom+0x120>)
  58711. 8018032: 6c3b ldr r3, [r7, #64] @ 0x40
  58712. 8018034: 6013 str r3, [r2, #0]
  58713. done_socket(sock);
  58714. return ret;
  58715. 8018036: 6c7b ldr r3, [r7, #68] @ 0x44
  58716. }
  58717. 8018038: 4618 mov r0, r3
  58718. 801803a: 3750 adds r7, #80 @ 0x50
  58719. 801803c: 46bd mov sp, r7
  58720. 801803e: bd80 pop {r7, pc}
  58721. 8018040: 0802d7a8 .word 0x0802d7a8
  58722. 8018044: 2402b180 .word 0x2402b180
  58723. 08018048 <lwip_recv>:
  58724. return lwip_recvmsg(s, &msg, 0);
  58725. }
  58726. ssize_t
  58727. lwip_recv(int s, void *mem, size_t len, int flags)
  58728. {
  58729. 8018048: b580 push {r7, lr}
  58730. 801804a: b086 sub sp, #24
  58731. 801804c: af02 add r7, sp, #8
  58732. 801804e: 60f8 str r0, [r7, #12]
  58733. 8018050: 60b9 str r1, [r7, #8]
  58734. 8018052: 607a str r2, [r7, #4]
  58735. 8018054: 603b str r3, [r7, #0]
  58736. return lwip_recvfrom(s, mem, len, flags, NULL, NULL);
  58737. 8018056: 2300 movs r3, #0
  58738. 8018058: 9301 str r3, [sp, #4]
  58739. 801805a: 2300 movs r3, #0
  58740. 801805c: 9300 str r3, [sp, #0]
  58741. 801805e: 683b ldr r3, [r7, #0]
  58742. 8018060: 687a ldr r2, [r7, #4]
  58743. 8018062: 68b9 ldr r1, [r7, #8]
  58744. 8018064: 68f8 ldr r0, [r7, #12]
  58745. 8018066: f7ff ff5d bl 8017f24 <lwip_recvfrom>
  58746. 801806a: 4603 mov r3, r0
  58747. }
  58748. 801806c: 4618 mov r0, r3
  58749. 801806e: 3710 adds r7, #16
  58750. 8018070: 46bd mov sp, r7
  58751. 8018072: bd80 pop {r7, pc}
  58752. 08018074 <lwip_send>:
  58753. #endif /* LWIP_UDP || LWIP_RAW */
  58754. }
  58755. ssize_t
  58756. lwip_send(int s, const void *data, size_t size, int flags)
  58757. {
  58758. 8018074: b580 push {r7, lr}
  58759. 8018076: b08a sub sp, #40 @ 0x28
  58760. 8018078: af02 add r7, sp, #8
  58761. 801807a: 60f8 str r0, [r7, #12]
  58762. 801807c: 60b9 str r1, [r7, #8]
  58763. 801807e: 607a str r2, [r7, #4]
  58764. 8018080: 603b str r3, [r7, #0]
  58765. size_t written;
  58766. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d, data=%p, size=%"SZT_F", flags=0x%x)\n",
  58767. s, data, size, flags));
  58768. sock = get_socket(s);
  58769. 8018082: 68f8 ldr r0, [r7, #12]
  58770. 8018084: f7ff fb10 bl 80176a8 <get_socket>
  58771. 8018088: 61f8 str r0, [r7, #28]
  58772. if (!sock) {
  58773. 801808a: 69fb ldr r3, [r7, #28]
  58774. 801808c: 2b00 cmp r3, #0
  58775. 801808e: d102 bne.n 8018096 <lwip_send+0x22>
  58776. return -1;
  58777. 8018090: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  58778. 8018094: e046 b.n 8018124 <lwip_send+0xb0>
  58779. }
  58780. if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
  58781. 8018096: 69fb ldr r3, [r7, #28]
  58782. 8018098: 681b ldr r3, [r3, #0]
  58783. 801809a: 781b ldrb r3, [r3, #0]
  58784. 801809c: f003 03f0 and.w r3, r3, #240 @ 0xf0
  58785. 80180a0: 2b10 cmp r3, #16
  58786. 80180a2: d00b beq.n 80180bc <lwip_send+0x48>
  58787. #if (LWIP_UDP || LWIP_RAW)
  58788. done_socket(sock);
  58789. return lwip_sendto(s, data, size, flags, NULL, 0);
  58790. 80180a4: 2300 movs r3, #0
  58791. 80180a6: 9301 str r3, [sp, #4]
  58792. 80180a8: 2300 movs r3, #0
  58793. 80180aa: 9300 str r3, [sp, #0]
  58794. 80180ac: 683b ldr r3, [r7, #0]
  58795. 80180ae: 687a ldr r2, [r7, #4]
  58796. 80180b0: 68b9 ldr r1, [r7, #8]
  58797. 80180b2: 68f8 ldr r0, [r7, #12]
  58798. 80180b4: f000 f83c bl 8018130 <lwip_sendto>
  58799. 80180b8: 4603 mov r3, r0
  58800. 80180ba: e033 b.n 8018124 <lwip_send+0xb0>
  58801. return -1;
  58802. #endif /* (LWIP_UDP || LWIP_RAW) */
  58803. }
  58804. write_flags = (u8_t)(NETCONN_COPY |
  58805. ((flags & MSG_MORE) ? NETCONN_MORE : 0) |
  58806. 80180bc: 683b ldr r3, [r7, #0]
  58807. 80180be: f003 0310 and.w r3, r3, #16
  58808. write_flags = (u8_t)(NETCONN_COPY |
  58809. 80180c2: 2b00 cmp r3, #0
  58810. 80180c4: d001 beq.n 80180ca <lwip_send+0x56>
  58811. 80180c6: 2203 movs r2, #3
  58812. 80180c8: e000 b.n 80180cc <lwip_send+0x58>
  58813. 80180ca: 2201 movs r2, #1
  58814. ((flags & MSG_MORE) ? NETCONN_MORE : 0) |
  58815. 80180cc: 683b ldr r3, [r7, #0]
  58816. 80180ce: 105b asrs r3, r3, #1
  58817. 80180d0: b25b sxtb r3, r3
  58818. 80180d2: f003 0304 and.w r3, r3, #4
  58819. 80180d6: b25b sxtb r3, r3
  58820. 80180d8: 4313 orrs r3, r2
  58821. 80180da: b25b sxtb r3, r3
  58822. write_flags = (u8_t)(NETCONN_COPY |
  58823. 80180dc: 76fb strb r3, [r7, #27]
  58824. ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0));
  58825. written = 0;
  58826. 80180de: 2300 movs r3, #0
  58827. 80180e0: 613b str r3, [r7, #16]
  58828. err = netconn_write_partly(sock->conn, data, size, write_flags, &written);
  58829. 80180e2: 69fb ldr r3, [r7, #28]
  58830. 80180e4: 6818 ldr r0, [r3, #0]
  58831. 80180e6: 7efa ldrb r2, [r7, #27]
  58832. 80180e8: f107 0310 add.w r3, r7, #16
  58833. 80180ec: 9300 str r3, [sp, #0]
  58834. 80180ee: 4613 mov r3, r2
  58835. 80180f0: 687a ldr r2, [r7, #4]
  58836. 80180f2: 68b9 ldr r1, [r7, #8]
  58837. 80180f4: f7fd fc04 bl 8015900 <netconn_write_partly>
  58838. 80180f8: 4603 mov r3, r0
  58839. 80180fa: 76bb strb r3, [r7, #26]
  58840. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) err=%d written=%"SZT_F"\n", s, err, written));
  58841. sock_set_errno(sock, err_to_errno(err));
  58842. 80180fc: f997 301a ldrsb.w r3, [r7, #26]
  58843. 8018100: 4618 mov r0, r3
  58844. 8018102: f7ff f9e3 bl 80174cc <err_to_errno>
  58845. 8018106: 6178 str r0, [r7, #20]
  58846. 8018108: 697b ldr r3, [r7, #20]
  58847. 801810a: 2b00 cmp r3, #0
  58848. 801810c: d002 beq.n 8018114 <lwip_send+0xa0>
  58849. 801810e: 4a07 ldr r2, [pc, #28] @ (801812c <lwip_send+0xb8>)
  58850. 8018110: 697b ldr r3, [r7, #20]
  58851. 8018112: 6013 str r3, [r2, #0]
  58852. done_socket(sock);
  58853. /* casting 'written' to ssize_t is OK here since the netconn API limits it to SSIZE_MAX */
  58854. return (err == ERR_OK ? (ssize_t)written : -1);
  58855. 8018114: f997 301a ldrsb.w r3, [r7, #26]
  58856. 8018118: 2b00 cmp r3, #0
  58857. 801811a: d101 bne.n 8018120 <lwip_send+0xac>
  58858. 801811c: 693b ldr r3, [r7, #16]
  58859. 801811e: e001 b.n 8018124 <lwip_send+0xb0>
  58860. 8018120: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  58861. }
  58862. 8018124: 4618 mov r0, r3
  58863. 8018126: 3720 adds r7, #32
  58864. 8018128: 46bd mov sp, r7
  58865. 801812a: bd80 pop {r7, pc}
  58866. 801812c: 2402b180 .word 0x2402b180
  58867. 08018130 <lwip_sendto>:
  58868. }
  58869. ssize_t
  58870. lwip_sendto(int s, const void *data, size_t size, int flags,
  58871. const struct sockaddr *to, socklen_t tolen)
  58872. {
  58873. 8018130: b580 push {r7, lr}
  58874. 8018132: b08e sub sp, #56 @ 0x38
  58875. 8018134: af00 add r7, sp, #0
  58876. 8018136: 60f8 str r0, [r7, #12]
  58877. 8018138: 60b9 str r1, [r7, #8]
  58878. 801813a: 607a str r2, [r7, #4]
  58879. 801813c: 603b str r3, [r7, #0]
  58880. err_t err;
  58881. u16_t short_size;
  58882. u16_t remote_port;
  58883. struct netbuf buf;
  58884. sock = get_socket(s);
  58885. 801813e: 68f8 ldr r0, [r7, #12]
  58886. 8018140: f7ff fab2 bl 80176a8 <get_socket>
  58887. 8018144: 6338 str r0, [r7, #48] @ 0x30
  58888. if (!sock) {
  58889. 8018146: 6b3b ldr r3, [r7, #48] @ 0x30
  58890. 8018148: 2b00 cmp r3, #0
  58891. 801814a: d102 bne.n 8018152 <lwip_sendto+0x22>
  58892. return -1;
  58893. 801814c: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  58894. 8018150: e093 b.n 801827a <lwip_sendto+0x14a>
  58895. }
  58896. if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
  58897. 8018152: 6b3b ldr r3, [r7, #48] @ 0x30
  58898. 8018154: 681b ldr r3, [r3, #0]
  58899. 8018156: 781b ldrb r3, [r3, #0]
  58900. 8018158: f003 03f0 and.w r3, r3, #240 @ 0xf0
  58901. 801815c: 2b10 cmp r3, #16
  58902. 801815e: d107 bne.n 8018170 <lwip_sendto+0x40>
  58903. #if LWIP_TCP
  58904. done_socket(sock);
  58905. return lwip_send(s, data, size, flags);
  58906. 8018160: 683b ldr r3, [r7, #0]
  58907. 8018162: 687a ldr r2, [r7, #4]
  58908. 8018164: 68b9 ldr r1, [r7, #8]
  58909. 8018166: 68f8 ldr r0, [r7, #12]
  58910. 8018168: f7ff ff84 bl 8018074 <lwip_send>
  58911. 801816c: 4603 mov r3, r0
  58912. 801816e: e084 b.n 801827a <lwip_sendto+0x14a>
  58913. done_socket(sock);
  58914. return -1;
  58915. #endif /* LWIP_TCP */
  58916. }
  58917. if (size > LWIP_MIN(0xFFFF, SSIZE_MAX)) {
  58918. 8018170: 687b ldr r3, [r7, #4]
  58919. 8018172: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  58920. 8018176: d30a bcc.n 801818e <lwip_sendto+0x5e>
  58921. /* cannot fit into one datagram (at least for us) */
  58922. sock_set_errno(sock, EMSGSIZE);
  58923. 8018178: 235a movs r3, #90 @ 0x5a
  58924. 801817a: 623b str r3, [r7, #32]
  58925. 801817c: 6a3b ldr r3, [r7, #32]
  58926. 801817e: 2b00 cmp r3, #0
  58927. 8018180: d002 beq.n 8018188 <lwip_sendto+0x58>
  58928. 8018182: 4a40 ldr r2, [pc, #256] @ (8018284 <lwip_sendto+0x154>)
  58929. 8018184: 6a3b ldr r3, [r7, #32]
  58930. 8018186: 6013 str r3, [r2, #0]
  58931. done_socket(sock);
  58932. return -1;
  58933. 8018188: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  58934. 801818c: e075 b.n 801827a <lwip_sendto+0x14a>
  58935. }
  58936. short_size = (u16_t)size;
  58937. 801818e: 687b ldr r3, [r7, #4]
  58938. 8018190: 85fb strh r3, [r7, #46] @ 0x2e
  58939. LWIP_ERROR("lwip_sendto: invalid address", (((to == NULL) && (tolen == 0)) ||
  58940. 8018192: 6c3b ldr r3, [r7, #64] @ 0x40
  58941. 8018194: 2b00 cmp r3, #0
  58942. 8018196: d102 bne.n 801819e <lwip_sendto+0x6e>
  58943. 8018198: 6c7b ldr r3, [r7, #68] @ 0x44
  58944. 801819a: 2b00 cmp r3, #0
  58945. 801819c: d023 beq.n 80181e6 <lwip_sendto+0xb6>
  58946. 801819e: 6c7b ldr r3, [r7, #68] @ 0x44
  58947. 80181a0: 2b10 cmp r3, #16
  58948. 80181a2: d10b bne.n 80181bc <lwip_sendto+0x8c>
  58949. 80181a4: 6c3b ldr r3, [r7, #64] @ 0x40
  58950. 80181a6: 2b00 cmp r3, #0
  58951. 80181a8: d008 beq.n 80181bc <lwip_sendto+0x8c>
  58952. 80181aa: 6c3b ldr r3, [r7, #64] @ 0x40
  58953. 80181ac: 785b ldrb r3, [r3, #1]
  58954. 80181ae: 2b02 cmp r3, #2
  58955. 80181b0: d104 bne.n 80181bc <lwip_sendto+0x8c>
  58956. 80181b2: 6c3b ldr r3, [r7, #64] @ 0x40
  58957. 80181b4: f003 0303 and.w r3, r3, #3
  58958. 80181b8: 2b00 cmp r3, #0
  58959. 80181ba: d014 beq.n 80181e6 <lwip_sendto+0xb6>
  58960. 80181bc: 4b32 ldr r3, [pc, #200] @ (8018288 <lwip_sendto+0x158>)
  58961. 80181be: f240 6252 movw r2, #1618 @ 0x652
  58962. 80181c2: 4932 ldr r1, [pc, #200] @ (801828c <lwip_sendto+0x15c>)
  58963. 80181c4: 4832 ldr r0, [pc, #200] @ (8018290 <lwip_sendto+0x160>)
  58964. 80181c6: f011 fc01 bl 80299cc <iprintf>
  58965. 80181ca: f06f 000f mvn.w r0, #15
  58966. 80181ce: f7ff f97d bl 80174cc <err_to_errno>
  58967. 80181d2: 62b8 str r0, [r7, #40] @ 0x28
  58968. 80181d4: 6abb ldr r3, [r7, #40] @ 0x28
  58969. 80181d6: 2b00 cmp r3, #0
  58970. 80181d8: d002 beq.n 80181e0 <lwip_sendto+0xb0>
  58971. 80181da: 4a2a ldr r2, [pc, #168] @ (8018284 <lwip_sendto+0x154>)
  58972. 80181dc: 6abb ldr r3, [r7, #40] @ 0x28
  58973. 80181de: 6013 str r3, [r2, #0]
  58974. 80181e0: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  58975. 80181e4: e049 b.n 801827a <lwip_sendto+0x14a>
  58976. ((to != NULL) && (IS_SOCK_ADDR_TYPE_VALID(to) && IS_SOCK_ADDR_ALIGNED(to))))),
  58977. sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
  58978. LWIP_UNUSED_ARG(tolen);
  58979. /* initialize a buffer */
  58980. buf.p = buf.ptr = NULL;
  58981. 80181e6: 2300 movs r3, #0
  58982. 80181e8: 617b str r3, [r7, #20]
  58983. 80181ea: 697b ldr r3, [r7, #20]
  58984. 80181ec: 613b str r3, [r7, #16]
  58985. #if LWIP_CHECKSUM_ON_COPY
  58986. buf.flags = 0;
  58987. #endif /* LWIP_CHECKSUM_ON_COPY */
  58988. if (to) {
  58989. 80181ee: 6c3b ldr r3, [r7, #64] @ 0x40
  58990. 80181f0: 2b00 cmp r3, #0
  58991. 80181f2: d00a beq.n 801820a <lwip_sendto+0xda>
  58992. SOCKADDR_TO_IPADDR_PORT(to, &buf.addr, remote_port);
  58993. 80181f4: 6c3b ldr r3, [r7, #64] @ 0x40
  58994. 80181f6: 685b ldr r3, [r3, #4]
  58995. 80181f8: 61bb str r3, [r7, #24]
  58996. 80181fa: 6c3b ldr r3, [r7, #64] @ 0x40
  58997. 80181fc: 885b ldrh r3, [r3, #2]
  58998. 80181fe: 4618 mov r0, r3
  58999. 8018200: f000 fc8a bl 8018b18 <lwip_htons>
  59000. 8018204: 4603 mov r3, r0
  59001. 8018206: 86fb strh r3, [r7, #54] @ 0x36
  59002. 8018208: e003 b.n 8018212 <lwip_sendto+0xe2>
  59003. } else {
  59004. remote_port = 0;
  59005. 801820a: 2300 movs r3, #0
  59006. 801820c: 86fb strh r3, [r7, #54] @ 0x36
  59007. ip_addr_set_any(NETCONNTYPE_ISIPV6(netconn_type(sock->conn)), &buf.addr);
  59008. 801820e: 2300 movs r3, #0
  59009. 8018210: 61bb str r3, [r7, #24]
  59010. }
  59011. netbuf_fromport(&buf) = remote_port;
  59012. 8018212: 8efb ldrh r3, [r7, #54] @ 0x36
  59013. 8018214: 83bb strh r3, [r7, #28]
  59014. MEMCPY(buf.p->payload, data, short_size);
  59015. }
  59016. err = ERR_OK;
  59017. }
  59018. #else /* LWIP_NETIF_TX_SINGLE_PBUF */
  59019. err = netbuf_ref(&buf, data, short_size);
  59020. 8018216: 8dfa ldrh r2, [r7, #46] @ 0x2e
  59021. 8018218: f107 0310 add.w r3, r7, #16
  59022. 801821c: 68b9 ldr r1, [r7, #8]
  59023. 801821e: 4618 mov r0, r3
  59024. 8018220: f7ff f9ba bl 8017598 <netbuf_ref>
  59025. 8018224: 4603 mov r3, r0
  59026. 8018226: f887 302d strb.w r3, [r7, #45] @ 0x2d
  59027. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  59028. if (err == ERR_OK) {
  59029. 801822a: f997 302d ldrsb.w r3, [r7, #45] @ 0x2d
  59030. 801822e: 2b00 cmp r3, #0
  59031. 8018230: d10a bne.n 8018248 <lwip_sendto+0x118>
  59032. IP_SET_TYPE_VAL(buf.addr, IPADDR_TYPE_V4);
  59033. }
  59034. #endif /* LWIP_IPV4 && LWIP_IPV6 */
  59035. /* send the data */
  59036. err = netconn_send(sock->conn, &buf);
  59037. 8018232: 6b3b ldr r3, [r7, #48] @ 0x30
  59038. 8018234: 681b ldr r3, [r3, #0]
  59039. 8018236: f107 0210 add.w r2, r7, #16
  59040. 801823a: 4611 mov r1, r2
  59041. 801823c: 4618 mov r0, r3
  59042. 801823e: f7fd fb31 bl 80158a4 <netconn_send>
  59043. 8018242: 4603 mov r3, r0
  59044. 8018244: f887 302d strb.w r3, [r7, #45] @ 0x2d
  59045. }
  59046. /* deallocated the buffer */
  59047. netbuf_free(&buf);
  59048. 8018248: f107 0310 add.w r3, r7, #16
  59049. 801824c: 4618 mov r0, r3
  59050. 801824e: f7ff f97b bl 8017548 <netbuf_free>
  59051. sock_set_errno(sock, err_to_errno(err));
  59052. 8018252: f997 302d ldrsb.w r3, [r7, #45] @ 0x2d
  59053. 8018256: 4618 mov r0, r3
  59054. 8018258: f7ff f938 bl 80174cc <err_to_errno>
  59055. 801825c: 6278 str r0, [r7, #36] @ 0x24
  59056. 801825e: 6a7b ldr r3, [r7, #36] @ 0x24
  59057. 8018260: 2b00 cmp r3, #0
  59058. 8018262: d002 beq.n 801826a <lwip_sendto+0x13a>
  59059. 8018264: 4a07 ldr r2, [pc, #28] @ (8018284 <lwip_sendto+0x154>)
  59060. 8018266: 6a7b ldr r3, [r7, #36] @ 0x24
  59061. 8018268: 6013 str r3, [r2, #0]
  59062. done_socket(sock);
  59063. return (err == ERR_OK ? short_size : -1);
  59064. 801826a: f997 302d ldrsb.w r3, [r7, #45] @ 0x2d
  59065. 801826e: 2b00 cmp r3, #0
  59066. 8018270: d101 bne.n 8018276 <lwip_sendto+0x146>
  59067. 8018272: 8dfb ldrh r3, [r7, #46] @ 0x2e
  59068. 8018274: e001 b.n 801827a <lwip_sendto+0x14a>
  59069. 8018276: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  59070. }
  59071. 801827a: 4618 mov r0, r3
  59072. 801827c: 3738 adds r7, #56 @ 0x38
  59073. 801827e: 46bd mov sp, r7
  59074. 8018280: bd80 pop {r7, pc}
  59075. 8018282: bf00 nop
  59076. 8018284: 2402b180 .word 0x2402b180
  59077. 8018288: 0802d5cc .word 0x0802d5cc
  59078. 801828c: 0802d8ac .word 0x0802d8ac
  59079. 8018290: 0802d620 .word 0x0802d620
  59080. 08018294 <lwip_socket>:
  59081. int
  59082. lwip_socket(int domain, int type, int protocol)
  59083. {
  59084. 8018294: b580 push {r7, lr}
  59085. 8018296: b086 sub sp, #24
  59086. 8018298: af00 add r7, sp, #0
  59087. 801829a: 60f8 str r0, [r7, #12]
  59088. 801829c: 60b9 str r1, [r7, #8]
  59089. 801829e: 607a str r2, [r7, #4]
  59090. int i;
  59091. LWIP_UNUSED_ARG(domain); /* @todo: check this */
  59092. /* create a netconn */
  59093. switch (type) {
  59094. 80182a0: 68bb ldr r3, [r7, #8]
  59095. 80182a2: 2b03 cmp r3, #3
  59096. 80182a4: d009 beq.n 80182ba <lwip_socket+0x26>
  59097. 80182a6: 68bb ldr r3, [r7, #8]
  59098. 80182a8: 2b03 cmp r3, #3
  59099. 80182aa: dc23 bgt.n 80182f4 <lwip_socket+0x60>
  59100. 80182ac: 68bb ldr r3, [r7, #8]
  59101. 80182ae: 2b01 cmp r3, #1
  59102. 80182b0: d019 beq.n 80182e6 <lwip_socket+0x52>
  59103. 80182b2: 68bb ldr r3, [r7, #8]
  59104. 80182b4: 2b02 cmp r3, #2
  59105. 80182b6: d009 beq.n 80182cc <lwip_socket+0x38>
  59106. 80182b8: e01c b.n 80182f4 <lwip_socket+0x60>
  59107. case SOCK_RAW:
  59108. conn = netconn_new_with_proto_and_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_RAW),
  59109. 80182ba: 687b ldr r3, [r7, #4]
  59110. 80182bc: b2db uxtb r3, r3
  59111. 80182be: 4a22 ldr r2, [pc, #136] @ (8018348 <lwip_socket+0xb4>)
  59112. 80182c0: 4619 mov r1, r3
  59113. 80182c2: 2040 movs r0, #64 @ 0x40
  59114. 80182c4: f7fc ff60 bl 8015188 <netconn_new_with_proto_and_callback>
  59115. 80182c8: 6178 str r0, [r7, #20]
  59116. (u8_t)protocol, DEFAULT_SOCKET_EVENTCB);
  59117. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_RAW, %d) = ",
  59118. domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
  59119. break;
  59120. 80182ca: e019 b.n 8018300 <lwip_socket+0x6c>
  59121. case SOCK_DGRAM:
  59122. conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain,
  59123. 80182cc: 687b ldr r3, [r7, #4]
  59124. 80182ce: 2b88 cmp r3, #136 @ 0x88
  59125. 80182d0: d101 bne.n 80182d6 <lwip_socket+0x42>
  59126. 80182d2: 2321 movs r3, #33 @ 0x21
  59127. 80182d4: e000 b.n 80182d8 <lwip_socket+0x44>
  59128. 80182d6: 2320 movs r3, #32
  59129. 80182d8: 4a1b ldr r2, [pc, #108] @ (8018348 <lwip_socket+0xb4>)
  59130. 80182da: 2100 movs r1, #0
  59131. 80182dc: 4618 mov r0, r3
  59132. 80182de: f7fc ff53 bl 8015188 <netconn_new_with_proto_and_callback>
  59133. 80182e2: 6178 str r0, [r7, #20]
  59134. if (conn) {
  59135. /* netconn layer enables pktinfo by default, sockets default to off */
  59136. conn->flags &= ~NETCONN_FLAG_PKTINFO;
  59137. }
  59138. #endif /* LWIP_NETBUF_RECVINFO */
  59139. break;
  59140. 80182e4: e00c b.n 8018300 <lwip_socket+0x6c>
  59141. case SOCK_STREAM:
  59142. conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_TCP), DEFAULT_SOCKET_EVENTCB);
  59143. 80182e6: 4a18 ldr r2, [pc, #96] @ (8018348 <lwip_socket+0xb4>)
  59144. 80182e8: 2100 movs r1, #0
  59145. 80182ea: 2010 movs r0, #16
  59146. 80182ec: f7fc ff4c bl 8015188 <netconn_new_with_proto_and_callback>
  59147. 80182f0: 6178 str r0, [r7, #20]
  59148. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ",
  59149. domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
  59150. break;
  59151. 80182f2: e005 b.n 8018300 <lwip_socket+0x6c>
  59152. default:
  59153. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n",
  59154. domain, type, protocol));
  59155. set_errno(EINVAL);
  59156. 80182f4: 4b15 ldr r3, [pc, #84] @ (801834c <lwip_socket+0xb8>)
  59157. 80182f6: 2216 movs r2, #22
  59158. 80182f8: 601a str r2, [r3, #0]
  59159. return -1;
  59160. 80182fa: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  59161. 80182fe: e01e b.n 801833e <lwip_socket+0xaa>
  59162. }
  59163. if (!conn) {
  59164. 8018300: 697b ldr r3, [r7, #20]
  59165. 8018302: 2b00 cmp r3, #0
  59166. 8018304: d105 bne.n 8018312 <lwip_socket+0x7e>
  59167. LWIP_DEBUGF(SOCKETS_DEBUG, ("-1 / ENOBUFS (could not create netconn)\n"));
  59168. set_errno(ENOBUFS);
  59169. 8018306: 4b11 ldr r3, [pc, #68] @ (801834c <lwip_socket+0xb8>)
  59170. 8018308: 2269 movs r2, #105 @ 0x69
  59171. 801830a: 601a str r2, [r3, #0]
  59172. return -1;
  59173. 801830c: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  59174. 8018310: e015 b.n 801833e <lwip_socket+0xaa>
  59175. }
  59176. i = alloc_socket(conn, 0);
  59177. 8018312: 2100 movs r1, #0
  59178. 8018314: 6978 ldr r0, [r7, #20]
  59179. 8018316: f7ff f9df bl 80176d8 <alloc_socket>
  59180. 801831a: 6138 str r0, [r7, #16]
  59181. if (i == -1) {
  59182. 801831c: 693b ldr r3, [r7, #16]
  59183. 801831e: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  59184. 8018322: d108 bne.n 8018336 <lwip_socket+0xa2>
  59185. netconn_delete(conn);
  59186. 8018324: 6978 ldr r0, [r7, #20]
  59187. 8018326: f7fc ffcd bl 80152c4 <netconn_delete>
  59188. set_errno(ENFILE);
  59189. 801832a: 4b08 ldr r3, [pc, #32] @ (801834c <lwip_socket+0xb8>)
  59190. 801832c: 2217 movs r2, #23
  59191. 801832e: 601a str r2, [r3, #0]
  59192. return -1;
  59193. 8018330: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  59194. 8018334: e003 b.n 801833e <lwip_socket+0xaa>
  59195. }
  59196. conn->socket = i;
  59197. 8018336: 697b ldr r3, [r7, #20]
  59198. 8018338: 693a ldr r2, [r7, #16]
  59199. 801833a: 619a str r2, [r3, #24]
  59200. done_socket(&sockets[i - LWIP_SOCKET_OFFSET]);
  59201. LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i));
  59202. set_errno(0);
  59203. return i;
  59204. 801833c: 693b ldr r3, [r7, #16]
  59205. }
  59206. 801833e: 4618 mov r0, r3
  59207. 8018340: 3718 adds r7, #24
  59208. 8018342: 46bd mov sp, r7
  59209. 8018344: bd80 pop {r7, pc}
  59210. 8018346: bf00 nop
  59211. 8018348: 080183d9 .word 0x080183d9
  59212. 801834c: 2402b180 .word 0x2402b180
  59213. 08018350 <lwip_poll_should_wake>:
  59214. * Check whether event_callback should wake up a thread waiting in
  59215. * lwip_poll.
  59216. */
  59217. static int
  59218. lwip_poll_should_wake(const struct lwip_select_cb *scb, int fd, int has_recvevent, int has_sendevent, int has_errevent)
  59219. {
  59220. 8018350: b480 push {r7}
  59221. 8018352: b087 sub sp, #28
  59222. 8018354: af00 add r7, sp, #0
  59223. 8018356: 60f8 str r0, [r7, #12]
  59224. 8018358: 60b9 str r1, [r7, #8]
  59225. 801835a: 607a str r2, [r7, #4]
  59226. 801835c: 603b str r3, [r7, #0]
  59227. nfds_t fdi;
  59228. for (fdi = 0; fdi < scb->poll_nfds; fdi++) {
  59229. 801835e: 2300 movs r3, #0
  59230. 8018360: 617b str r3, [r7, #20]
  59231. 8018362: e02c b.n 80183be <lwip_poll_should_wake+0x6e>
  59232. const struct pollfd *pollfd = &scb->poll_fds[fdi];
  59233. 8018364: 68fb ldr r3, [r7, #12]
  59234. 8018366: 695a ldr r2, [r3, #20]
  59235. 8018368: 697b ldr r3, [r7, #20]
  59236. 801836a: 00db lsls r3, r3, #3
  59237. 801836c: 4413 add r3, r2
  59238. 801836e: 613b str r3, [r7, #16]
  59239. if (pollfd->fd == fd) {
  59240. 8018370: 693b ldr r3, [r7, #16]
  59241. 8018372: 681b ldr r3, [r3, #0]
  59242. 8018374: 68ba ldr r2, [r7, #8]
  59243. 8018376: 429a cmp r2, r3
  59244. 8018378: d11e bne.n 80183b8 <lwip_poll_should_wake+0x68>
  59245. /* Do not update pollfd->revents right here;
  59246. that would be a data race because lwip_pollscan
  59247. accesses revents without protecting. */
  59248. if (has_recvevent && (pollfd->events & POLLIN) != 0) {
  59249. 801837a: 687b ldr r3, [r7, #4]
  59250. 801837c: 2b00 cmp r3, #0
  59251. 801837e: d009 beq.n 8018394 <lwip_poll_should_wake+0x44>
  59252. 8018380: 693b ldr r3, [r7, #16]
  59253. 8018382: f9b3 3004 ldrsh.w r3, [r3, #4]
  59254. 8018386: b29b uxth r3, r3
  59255. 8018388: f003 0301 and.w r3, r3, #1
  59256. 801838c: 2b00 cmp r3, #0
  59257. 801838e: d001 beq.n 8018394 <lwip_poll_should_wake+0x44>
  59258. return 1;
  59259. 8018390: 2301 movs r3, #1
  59260. 8018392: e01a b.n 80183ca <lwip_poll_should_wake+0x7a>
  59261. }
  59262. if (has_sendevent && (pollfd->events & POLLOUT) != 0) {
  59263. 8018394: 683b ldr r3, [r7, #0]
  59264. 8018396: 2b00 cmp r3, #0
  59265. 8018398: d009 beq.n 80183ae <lwip_poll_should_wake+0x5e>
  59266. 801839a: 693b ldr r3, [r7, #16]
  59267. 801839c: f9b3 3004 ldrsh.w r3, [r3, #4]
  59268. 80183a0: b29b uxth r3, r3
  59269. 80183a2: f003 0302 and.w r3, r3, #2
  59270. 80183a6: 2b00 cmp r3, #0
  59271. 80183a8: d001 beq.n 80183ae <lwip_poll_should_wake+0x5e>
  59272. return 1;
  59273. 80183aa: 2301 movs r3, #1
  59274. 80183ac: e00d b.n 80183ca <lwip_poll_should_wake+0x7a>
  59275. }
  59276. if (has_errevent) {
  59277. 80183ae: 6a3b ldr r3, [r7, #32]
  59278. 80183b0: 2b00 cmp r3, #0
  59279. 80183b2: d001 beq.n 80183b8 <lwip_poll_should_wake+0x68>
  59280. /* POLLERR is output only. */
  59281. return 1;
  59282. 80183b4: 2301 movs r3, #1
  59283. 80183b6: e008 b.n 80183ca <lwip_poll_should_wake+0x7a>
  59284. for (fdi = 0; fdi < scb->poll_nfds; fdi++) {
  59285. 80183b8: 697b ldr r3, [r7, #20]
  59286. 80183ba: 3301 adds r3, #1
  59287. 80183bc: 617b str r3, [r7, #20]
  59288. 80183be: 68fb ldr r3, [r7, #12]
  59289. 80183c0: 699b ldr r3, [r3, #24]
  59290. 80183c2: 697a ldr r2, [r7, #20]
  59291. 80183c4: 429a cmp r2, r3
  59292. 80183c6: d3cd bcc.n 8018364 <lwip_poll_should_wake+0x14>
  59293. }
  59294. }
  59295. }
  59296. return 0;
  59297. 80183c8: 2300 movs r3, #0
  59298. }
  59299. 80183ca: 4618 mov r0, r3
  59300. 80183cc: 371c adds r7, #28
  59301. 80183ce: 46bd mov sp, r7
  59302. 80183d0: f85d 7b04 ldr.w r7, [sp], #4
  59303. 80183d4: 4770 bx lr
  59304. ...
  59305. 080183d8 <event_callback>:
  59306. * NETCONN_EVT_ERROR
  59307. * This requirement will be asserted in select_check_waiters()
  59308. */
  59309. static void
  59310. event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len)
  59311. {
  59312. 80183d8: b580 push {r7, lr}
  59313. 80183da: b08a sub sp, #40 @ 0x28
  59314. 80183dc: af00 add r7, sp, #0
  59315. 80183de: 6078 str r0, [r7, #4]
  59316. 80183e0: 460b mov r3, r1
  59317. 80183e2: 70fb strb r3, [r7, #3]
  59318. 80183e4: 4613 mov r3, r2
  59319. 80183e6: 803b strh r3, [r7, #0]
  59320. SYS_ARCH_DECL_PROTECT(lev);
  59321. LWIP_UNUSED_ARG(len);
  59322. /* Get socket */
  59323. if (conn) {
  59324. 80183e8: 687b ldr r3, [r7, #4]
  59325. 80183ea: 2b00 cmp r3, #0
  59326. 80183ec: f000 80a4 beq.w 8018538 <event_callback+0x160>
  59327. s = conn->socket;
  59328. 80183f0: 687b ldr r3, [r7, #4]
  59329. 80183f2: 699b ldr r3, [r3, #24]
  59330. 80183f4: 627b str r3, [r7, #36] @ 0x24
  59331. if (s < 0) {
  59332. 80183f6: 6a7b ldr r3, [r7, #36] @ 0x24
  59333. 80183f8: 2b00 cmp r3, #0
  59334. 80183fa: da18 bge.n 801842e <event_callback+0x56>
  59335. /* Data comes in right away after an accept, even though
  59336. * the server task might not have created a new socket yet.
  59337. * Just count down (or up) if that's the case and we
  59338. * will use the data later. Note that only receive events
  59339. * can happen before the new socket is set up. */
  59340. SYS_ARCH_PROTECT(lev);
  59341. 80183fc: f00e f850 bl 80264a0 <sys_arch_protect>
  59342. 8018400: 61f8 str r0, [r7, #28]
  59343. if (conn->socket < 0) {
  59344. 8018402: 687b ldr r3, [r7, #4]
  59345. 8018404: 699b ldr r3, [r3, #24]
  59346. 8018406: 2b00 cmp r3, #0
  59347. 8018408: da0b bge.n 8018422 <event_callback+0x4a>
  59348. if (evt == NETCONN_EVT_RCVPLUS) {
  59349. 801840a: 78fb ldrb r3, [r7, #3]
  59350. 801840c: 2b00 cmp r3, #0
  59351. 801840e: d104 bne.n 801841a <event_callback+0x42>
  59352. /* conn->socket is -1 on initialization
  59353. lwip_accept adjusts sock->recvevent if conn->socket < -1 */
  59354. conn->socket--;
  59355. 8018410: 687b ldr r3, [r7, #4]
  59356. 8018412: 699b ldr r3, [r3, #24]
  59357. 8018414: 1e5a subs r2, r3, #1
  59358. 8018416: 687b ldr r3, [r7, #4]
  59359. 8018418: 619a str r2, [r3, #24]
  59360. }
  59361. SYS_ARCH_UNPROTECT(lev);
  59362. 801841a: 69f8 ldr r0, [r7, #28]
  59363. 801841c: f00e f84e bl 80264bc <sys_arch_unprotect>
  59364. return;
  59365. 8018420: e08d b.n 801853e <event_callback+0x166>
  59366. }
  59367. s = conn->socket;
  59368. 8018422: 687b ldr r3, [r7, #4]
  59369. 8018424: 699b ldr r3, [r3, #24]
  59370. 8018426: 627b str r3, [r7, #36] @ 0x24
  59371. SYS_ARCH_UNPROTECT(lev);
  59372. 8018428: 69f8 ldr r0, [r7, #28]
  59373. 801842a: f00e f847 bl 80264bc <sys_arch_unprotect>
  59374. }
  59375. sock = get_socket(s);
  59376. 801842e: 6a78 ldr r0, [r7, #36] @ 0x24
  59377. 8018430: f7ff f93a bl 80176a8 <get_socket>
  59378. 8018434: 61b8 str r0, [r7, #24]
  59379. if (!sock) {
  59380. 8018436: 69bb ldr r3, [r7, #24]
  59381. 8018438: 2b00 cmp r3, #0
  59382. 801843a: d07f beq.n 801853c <event_callback+0x164>
  59383. }
  59384. } else {
  59385. return;
  59386. }
  59387. check_waiters = 1;
  59388. 801843c: 2301 movs r3, #1
  59389. 801843e: 623b str r3, [r7, #32]
  59390. SYS_ARCH_PROTECT(lev);
  59391. 8018440: f00e f82e bl 80264a0 <sys_arch_protect>
  59392. 8018444: 61f8 str r0, [r7, #28]
  59393. /* Set event as required */
  59394. switch (evt) {
  59395. 8018446: 78fb ldrb r3, [r7, #3]
  59396. 8018448: 2b04 cmp r3, #4
  59397. 801844a: d83e bhi.n 80184ca <event_callback+0xf2>
  59398. 801844c: a201 add r2, pc, #4 @ (adr r2, 8018454 <event_callback+0x7c>)
  59399. 801844e: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  59400. 8018452: bf00 nop
  59401. 8018454: 08018469 .word 0x08018469
  59402. 8018458: 0801848b .word 0x0801848b
  59403. 801845c: 080184a3 .word 0x080184a3
  59404. 8018460: 080184b7 .word 0x080184b7
  59405. 8018464: 080184c3 .word 0x080184c3
  59406. case NETCONN_EVT_RCVPLUS:
  59407. sock->rcvevent++;
  59408. 8018468: 69bb ldr r3, [r7, #24]
  59409. 801846a: f9b3 3008 ldrsh.w r3, [r3, #8]
  59410. 801846e: b29b uxth r3, r3
  59411. 8018470: 3301 adds r3, #1
  59412. 8018472: b29b uxth r3, r3
  59413. 8018474: b21a sxth r2, r3
  59414. 8018476: 69bb ldr r3, [r7, #24]
  59415. 8018478: 811a strh r2, [r3, #8]
  59416. if (sock->rcvevent > 1) {
  59417. 801847a: 69bb ldr r3, [r7, #24]
  59418. 801847c: f9b3 3008 ldrsh.w r3, [r3, #8]
  59419. 8018480: 2b01 cmp r3, #1
  59420. 8018482: dd2a ble.n 80184da <event_callback+0x102>
  59421. check_waiters = 0;
  59422. 8018484: 2300 movs r3, #0
  59423. 8018486: 623b str r3, [r7, #32]
  59424. }
  59425. break;
  59426. 8018488: e027 b.n 80184da <event_callback+0x102>
  59427. case NETCONN_EVT_RCVMINUS:
  59428. sock->rcvevent--;
  59429. 801848a: 69bb ldr r3, [r7, #24]
  59430. 801848c: f9b3 3008 ldrsh.w r3, [r3, #8]
  59431. 8018490: b29b uxth r3, r3
  59432. 8018492: 3b01 subs r3, #1
  59433. 8018494: b29b uxth r3, r3
  59434. 8018496: b21a sxth r2, r3
  59435. 8018498: 69bb ldr r3, [r7, #24]
  59436. 801849a: 811a strh r2, [r3, #8]
  59437. check_waiters = 0;
  59438. 801849c: 2300 movs r3, #0
  59439. 801849e: 623b str r3, [r7, #32]
  59440. break;
  59441. 80184a0: e01c b.n 80184dc <event_callback+0x104>
  59442. case NETCONN_EVT_SENDPLUS:
  59443. if (sock->sendevent) {
  59444. 80184a2: 69bb ldr r3, [r7, #24]
  59445. 80184a4: 895b ldrh r3, [r3, #10]
  59446. 80184a6: 2b00 cmp r3, #0
  59447. 80184a8: d001 beq.n 80184ae <event_callback+0xd6>
  59448. check_waiters = 0;
  59449. 80184aa: 2300 movs r3, #0
  59450. 80184ac: 623b str r3, [r7, #32]
  59451. }
  59452. sock->sendevent = 1;
  59453. 80184ae: 69bb ldr r3, [r7, #24]
  59454. 80184b0: 2201 movs r2, #1
  59455. 80184b2: 815a strh r2, [r3, #10]
  59456. break;
  59457. 80184b4: e012 b.n 80184dc <event_callback+0x104>
  59458. case NETCONN_EVT_SENDMINUS:
  59459. sock->sendevent = 0;
  59460. 80184b6: 69bb ldr r3, [r7, #24]
  59461. 80184b8: 2200 movs r2, #0
  59462. 80184ba: 815a strh r2, [r3, #10]
  59463. check_waiters = 0;
  59464. 80184bc: 2300 movs r3, #0
  59465. 80184be: 623b str r3, [r7, #32]
  59466. break;
  59467. 80184c0: e00c b.n 80184dc <event_callback+0x104>
  59468. case NETCONN_EVT_ERROR:
  59469. sock->errevent = 1;
  59470. 80184c2: 69bb ldr r3, [r7, #24]
  59471. 80184c4: 2201 movs r2, #1
  59472. 80184c6: 819a strh r2, [r3, #12]
  59473. break;
  59474. 80184c8: e008 b.n 80184dc <event_callback+0x104>
  59475. default:
  59476. LWIP_ASSERT("unknown event", 0);
  59477. 80184ca: 4b1e ldr r3, [pc, #120] @ (8018544 <event_callback+0x16c>)
  59478. 80184cc: f44f 621f mov.w r2, #2544 @ 0x9f0
  59479. 80184d0: 491d ldr r1, [pc, #116] @ (8018548 <event_callback+0x170>)
  59480. 80184d2: 481e ldr r0, [pc, #120] @ (801854c <event_callback+0x174>)
  59481. 80184d4: f011 fa7a bl 80299cc <iprintf>
  59482. break;
  59483. 80184d8: e000 b.n 80184dc <event_callback+0x104>
  59484. break;
  59485. 80184da: bf00 nop
  59486. }
  59487. if (sock->select_waiting && check_waiters) {
  59488. 80184dc: 69bb ldr r3, [r7, #24]
  59489. 80184de: 7b9b ldrb r3, [r3, #14]
  59490. 80184e0: 2b00 cmp r3, #0
  59491. 80184e2: d025 beq.n 8018530 <event_callback+0x158>
  59492. 80184e4: 6a3b ldr r3, [r7, #32]
  59493. 80184e6: 2b00 cmp r3, #0
  59494. 80184e8: d022 beq.n 8018530 <event_callback+0x158>
  59495. /* Save which events are active */
  59496. int has_recvevent, has_sendevent, has_errevent;
  59497. has_recvevent = sock->rcvevent > 0;
  59498. 80184ea: 69bb ldr r3, [r7, #24]
  59499. 80184ec: f9b3 3008 ldrsh.w r3, [r3, #8]
  59500. 80184f0: 2b00 cmp r3, #0
  59501. 80184f2: bfcc ite gt
  59502. 80184f4: 2301 movgt r3, #1
  59503. 80184f6: 2300 movle r3, #0
  59504. 80184f8: b2db uxtb r3, r3
  59505. 80184fa: 617b str r3, [r7, #20]
  59506. has_sendevent = sock->sendevent != 0;
  59507. 80184fc: 69bb ldr r3, [r7, #24]
  59508. 80184fe: 895b ldrh r3, [r3, #10]
  59509. 8018500: 2b00 cmp r3, #0
  59510. 8018502: bf14 ite ne
  59511. 8018504: 2301 movne r3, #1
  59512. 8018506: 2300 moveq r3, #0
  59513. 8018508: b2db uxtb r3, r3
  59514. 801850a: 613b str r3, [r7, #16]
  59515. has_errevent = sock->errevent != 0;
  59516. 801850c: 69bb ldr r3, [r7, #24]
  59517. 801850e: 899b ldrh r3, [r3, #12]
  59518. 8018510: 2b00 cmp r3, #0
  59519. 8018512: bf14 ite ne
  59520. 8018514: 2301 movne r3, #1
  59521. 8018516: 2300 moveq r3, #0
  59522. 8018518: b2db uxtb r3, r3
  59523. 801851a: 60fb str r3, [r7, #12]
  59524. SYS_ARCH_UNPROTECT(lev);
  59525. 801851c: 69f8 ldr r0, [r7, #28]
  59526. 801851e: f00d ffcd bl 80264bc <sys_arch_unprotect>
  59527. /* Check any select calls waiting on this socket */
  59528. select_check_waiters(s, has_recvevent, has_sendevent, has_errevent);
  59529. 8018522: 68fb ldr r3, [r7, #12]
  59530. 8018524: 693a ldr r2, [r7, #16]
  59531. 8018526: 6979 ldr r1, [r7, #20]
  59532. 8018528: 6a78 ldr r0, [r7, #36] @ 0x24
  59533. 801852a: f000 f811 bl 8018550 <select_check_waiters>
  59534. if (sock->select_waiting && check_waiters) {
  59535. 801852e: e006 b.n 801853e <event_callback+0x166>
  59536. } else {
  59537. SYS_ARCH_UNPROTECT(lev);
  59538. 8018530: 69f8 ldr r0, [r7, #28]
  59539. 8018532: f00d ffc3 bl 80264bc <sys_arch_unprotect>
  59540. 8018536: e002 b.n 801853e <event_callback+0x166>
  59541. return;
  59542. 8018538: bf00 nop
  59543. 801853a: e000 b.n 801853e <event_callback+0x166>
  59544. return;
  59545. 801853c: bf00 nop
  59546. }
  59547. done_socket(sock);
  59548. }
  59549. 801853e: 3728 adds r7, #40 @ 0x28
  59550. 8018540: 46bd mov sp, r7
  59551. 8018542: bd80 pop {r7, pc}
  59552. 8018544: 0802d5cc .word 0x0802d5cc
  59553. 8018548: 0802d948 .word 0x0802d948
  59554. 801854c: 0802d620 .word 0x0802d620
  59555. 08018550 <select_check_waiters>:
  59556. * of the loop, thus creating a possibility where a thread could modify the
  59557. * select_cb_list during our UNPROTECT/PROTECT. We use a generational counter to
  59558. * detect this change and restart the list walk. The list is expected to be small
  59559. */
  59560. static void select_check_waiters(int s, int has_recvevent, int has_sendevent, int has_errevent)
  59561. {
  59562. 8018550: b580 push {r7, lr}
  59563. 8018552: b088 sub sp, #32
  59564. 8018554: af02 add r7, sp, #8
  59565. 8018556: 60f8 str r0, [r7, #12]
  59566. 8018558: 60b9 str r1, [r7, #8]
  59567. 801855a: 607a str r2, [r7, #4]
  59568. 801855c: 603b str r3, [r7, #0]
  59569. #if !LWIP_TCPIP_CORE_LOCKING
  59570. int last_select_cb_ctr;
  59571. SYS_ARCH_DECL_PROTECT(lev);
  59572. #endif /* !LWIP_TCPIP_CORE_LOCKING */
  59573. LWIP_ASSERT_CORE_LOCKED();
  59574. 801855e: f7f7 ffe7 bl 8010530 <sys_check_core_locking>
  59575. SYS_ARCH_PROTECT(lev);
  59576. again:
  59577. /* remember the state of select_cb_list to detect changes */
  59578. last_select_cb_ctr = select_cb_ctr;
  59579. #endif /* !LWIP_TCPIP_CORE_LOCKING */
  59580. for (scb = select_cb_list; scb != NULL; scb = scb->next) {
  59581. 8018562: 4b42 ldr r3, [pc, #264] @ (801866c <select_check_waiters+0x11c>)
  59582. 8018564: 681b ldr r3, [r3, #0]
  59583. 8018566: 617b str r3, [r7, #20]
  59584. 8018568: e078 b.n 801865c <select_check_waiters+0x10c>
  59585. if (scb->sem_signalled == 0) {
  59586. 801856a: 697b ldr r3, [r7, #20]
  59587. 801856c: 69db ldr r3, [r3, #28]
  59588. 801856e: 2b00 cmp r3, #0
  59589. 8018570: d171 bne.n 8018656 <select_check_waiters+0x106>
  59590. /* semaphore not signalled yet */
  59591. int do_signal = 0;
  59592. 8018572: 2300 movs r3, #0
  59593. 8018574: 613b str r3, [r7, #16]
  59594. #if LWIP_SOCKET_POLL
  59595. if (scb->poll_fds != NULL) {
  59596. 8018576: 697b ldr r3, [r7, #20]
  59597. 8018578: 695b ldr r3, [r3, #20]
  59598. 801857a: 2b00 cmp r3, #0
  59599. 801857c: d009 beq.n 8018592 <select_check_waiters+0x42>
  59600. do_signal = lwip_poll_should_wake(scb, s, has_recvevent, has_sendevent, has_errevent);
  59601. 801857e: 683b ldr r3, [r7, #0]
  59602. 8018580: 9300 str r3, [sp, #0]
  59603. 8018582: 687b ldr r3, [r7, #4]
  59604. 8018584: 68ba ldr r2, [r7, #8]
  59605. 8018586: 68f9 ldr r1, [r7, #12]
  59606. 8018588: 6978 ldr r0, [r7, #20]
  59607. 801858a: f7ff fee1 bl 8018350 <lwip_poll_should_wake>
  59608. 801858e: 6138 str r0, [r7, #16]
  59609. 8018590: e056 b.n 8018640 <select_check_waiters+0xf0>
  59610. else
  59611. #endif /* LWIP_SOCKET_SELECT && LWIP_SOCKET_POLL */
  59612. #if LWIP_SOCKET_SELECT
  59613. {
  59614. /* Test this select call for our socket */
  59615. if (has_recvevent) {
  59616. 8018592: 68bb ldr r3, [r7, #8]
  59617. 8018594: 2b00 cmp r3, #0
  59618. 8018596: d017 beq.n 80185c8 <select_check_waiters+0x78>
  59619. if (scb->readset && FD_ISSET(s, scb->readset)) {
  59620. 8018598: 697b ldr r3, [r7, #20]
  59621. 801859a: 689b ldr r3, [r3, #8]
  59622. 801859c: 2b00 cmp r3, #0
  59623. 801859e: d013 beq.n 80185c8 <select_check_waiters+0x78>
  59624. 80185a0: 697b ldr r3, [r7, #20]
  59625. 80185a2: 689a ldr r2, [r3, #8]
  59626. 80185a4: 68fb ldr r3, [r7, #12]
  59627. 80185a6: 2b00 cmp r3, #0
  59628. 80185a8: da00 bge.n 80185ac <select_check_waiters+0x5c>
  59629. 80185aa: 331f adds r3, #31
  59630. 80185ac: 115b asrs r3, r3, #5
  59631. 80185ae: f852 2023 ldr.w r2, [r2, r3, lsl #2]
  59632. 80185b2: 68fb ldr r3, [r7, #12]
  59633. 80185b4: f003 031f and.w r3, r3, #31
  59634. 80185b8: fa22 f303 lsr.w r3, r2, r3
  59635. 80185bc: f003 0301 and.w r3, r3, #1
  59636. 80185c0: 2b00 cmp r3, #0
  59637. 80185c2: d001 beq.n 80185c8 <select_check_waiters+0x78>
  59638. do_signal = 1;
  59639. 80185c4: 2301 movs r3, #1
  59640. 80185c6: 613b str r3, [r7, #16]
  59641. }
  59642. }
  59643. if (has_sendevent) {
  59644. 80185c8: 687b ldr r3, [r7, #4]
  59645. 80185ca: 2b00 cmp r3, #0
  59646. 80185cc: d01a beq.n 8018604 <select_check_waiters+0xb4>
  59647. if (!do_signal && scb->writeset && FD_ISSET(s, scb->writeset)) {
  59648. 80185ce: 693b ldr r3, [r7, #16]
  59649. 80185d0: 2b00 cmp r3, #0
  59650. 80185d2: d117 bne.n 8018604 <select_check_waiters+0xb4>
  59651. 80185d4: 697b ldr r3, [r7, #20]
  59652. 80185d6: 68db ldr r3, [r3, #12]
  59653. 80185d8: 2b00 cmp r3, #0
  59654. 80185da: d013 beq.n 8018604 <select_check_waiters+0xb4>
  59655. 80185dc: 697b ldr r3, [r7, #20]
  59656. 80185de: 68da ldr r2, [r3, #12]
  59657. 80185e0: 68fb ldr r3, [r7, #12]
  59658. 80185e2: 2b00 cmp r3, #0
  59659. 80185e4: da00 bge.n 80185e8 <select_check_waiters+0x98>
  59660. 80185e6: 331f adds r3, #31
  59661. 80185e8: 115b asrs r3, r3, #5
  59662. 80185ea: f852 2023 ldr.w r2, [r2, r3, lsl #2]
  59663. 80185ee: 68fb ldr r3, [r7, #12]
  59664. 80185f0: f003 031f and.w r3, r3, #31
  59665. 80185f4: fa22 f303 lsr.w r3, r2, r3
  59666. 80185f8: f003 0301 and.w r3, r3, #1
  59667. 80185fc: 2b00 cmp r3, #0
  59668. 80185fe: d001 beq.n 8018604 <select_check_waiters+0xb4>
  59669. do_signal = 1;
  59670. 8018600: 2301 movs r3, #1
  59671. 8018602: 613b str r3, [r7, #16]
  59672. }
  59673. }
  59674. if (has_errevent) {
  59675. 8018604: 683b ldr r3, [r7, #0]
  59676. 8018606: 2b00 cmp r3, #0
  59677. 8018608: d01a beq.n 8018640 <select_check_waiters+0xf0>
  59678. if (!do_signal && scb->exceptset && FD_ISSET(s, scb->exceptset)) {
  59679. 801860a: 693b ldr r3, [r7, #16]
  59680. 801860c: 2b00 cmp r3, #0
  59681. 801860e: d117 bne.n 8018640 <select_check_waiters+0xf0>
  59682. 8018610: 697b ldr r3, [r7, #20]
  59683. 8018612: 691b ldr r3, [r3, #16]
  59684. 8018614: 2b00 cmp r3, #0
  59685. 8018616: d013 beq.n 8018640 <select_check_waiters+0xf0>
  59686. 8018618: 697b ldr r3, [r7, #20]
  59687. 801861a: 691a ldr r2, [r3, #16]
  59688. 801861c: 68fb ldr r3, [r7, #12]
  59689. 801861e: 2b00 cmp r3, #0
  59690. 8018620: da00 bge.n 8018624 <select_check_waiters+0xd4>
  59691. 8018622: 331f adds r3, #31
  59692. 8018624: 115b asrs r3, r3, #5
  59693. 8018626: f852 2023 ldr.w r2, [r2, r3, lsl #2]
  59694. 801862a: 68fb ldr r3, [r7, #12]
  59695. 801862c: f003 031f and.w r3, r3, #31
  59696. 8018630: fa22 f303 lsr.w r3, r2, r3
  59697. 8018634: f003 0301 and.w r3, r3, #1
  59698. 8018638: 2b00 cmp r3, #0
  59699. 801863a: d001 beq.n 8018640 <select_check_waiters+0xf0>
  59700. do_signal = 1;
  59701. 801863c: 2301 movs r3, #1
  59702. 801863e: 613b str r3, [r7, #16]
  59703. }
  59704. }
  59705. }
  59706. #endif /* LWIP_SOCKET_SELECT */
  59707. if (do_signal) {
  59708. 8018640: 693b ldr r3, [r7, #16]
  59709. 8018642: 2b00 cmp r3, #0
  59710. 8018644: d007 beq.n 8018656 <select_check_waiters+0x106>
  59711. scb->sem_signalled = 1;
  59712. 8018646: 697b ldr r3, [r7, #20]
  59713. 8018648: 2201 movs r2, #1
  59714. 801864a: 61da str r2, [r3, #28]
  59715. /* For !LWIP_TCPIP_CORE_LOCKING, we don't call SYS_ARCH_UNPROTECT() before signaling
  59716. the semaphore, as this might lead to the select thread taking itself off the list,
  59717. invalidating the semaphore. */
  59718. sys_sem_signal(SELECT_SEM_PTR(scb->sem));
  59719. 801864c: 697b ldr r3, [r7, #20]
  59720. 801864e: 3320 adds r3, #32
  59721. 8018650: 4618 mov r0, r3
  59722. 8018652: f00d fe8f bl 8026374 <sys_sem_signal>
  59723. for (scb = select_cb_list; scb != NULL; scb = scb->next) {
  59724. 8018656: 697b ldr r3, [r7, #20]
  59725. 8018658: 681b ldr r3, [r3, #0]
  59726. 801865a: 617b str r3, [r7, #20]
  59727. 801865c: 697b ldr r3, [r7, #20]
  59728. 801865e: 2b00 cmp r3, #0
  59729. 8018660: d183 bne.n 801856a <select_check_waiters+0x1a>
  59730. /* remember the state of select_cb_list to detect changes */
  59731. last_select_cb_ctr = select_cb_ctr;
  59732. }
  59733. SYS_ARCH_UNPROTECT(lev);
  59734. #endif
  59735. }
  59736. 8018662: bf00 nop
  59737. 8018664: bf00 nop
  59738. 8018666: 3718 adds r7, #24
  59739. 8018668: 46bd mov sp, r7
  59740. 801866a: bd80 pop {r7, pc}
  59741. 801866c: 24024324 .word 0x24024324
  59742. 08018670 <lwip_ioctl>:
  59743. return err;
  59744. }
  59745. int
  59746. lwip_ioctl(int s, long cmd, void *argp)
  59747. {
  59748. 8018670: b580 push {r7, lr}
  59749. 8018672: b08c sub sp, #48 @ 0x30
  59750. 8018674: af00 add r7, sp, #0
  59751. 8018676: 60f8 str r0, [r7, #12]
  59752. 8018678: 60b9 str r1, [r7, #8]
  59753. 801867a: 607a str r2, [r7, #4]
  59754. struct lwip_sock *sock = get_socket(s);
  59755. 801867c: 68f8 ldr r0, [r7, #12]
  59756. 801867e: f7ff f813 bl 80176a8 <get_socket>
  59757. 8018682: 6278 str r0, [r7, #36] @ 0x24
  59758. u8_t val;
  59759. #if LWIP_SO_RCVBUF
  59760. int recv_avail;
  59761. #endif /* LWIP_SO_RCVBUF */
  59762. if (!sock) {
  59763. 8018684: 6a7b ldr r3, [r7, #36] @ 0x24
  59764. 8018686: 2b00 cmp r3, #0
  59765. 8018688: d102 bne.n 8018690 <lwip_ioctl+0x20>
  59766. return -1;
  59767. 801868a: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  59768. 801868e: e089 b.n 80187a4 <lwip_ioctl+0x134>
  59769. }
  59770. switch (cmd) {
  59771. 8018690: 68bb ldr r3, [r7, #8]
  59772. 8018692: 4a46 ldr r2, [pc, #280] @ (80187ac <lwip_ioctl+0x13c>)
  59773. 8018694: 4293 cmp r3, r2
  59774. 8018696: d048 beq.n 801872a <lwip_ioctl+0xba>
  59775. 8018698: 68bb ldr r3, [r7, #8]
  59776. 801869a: 4a45 ldr r2, [pc, #276] @ (80187b0 <lwip_ioctl+0x140>)
  59777. 801869c: 4293 cmp r3, r2
  59778. 801869e: d176 bne.n 801878e <lwip_ioctl+0x11e>
  59779. #if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE
  59780. case FIONREAD:
  59781. if (!argp) {
  59782. 80186a0: 687b ldr r3, [r7, #4]
  59783. 80186a2: 2b00 cmp r3, #0
  59784. 80186a4: d10a bne.n 80186bc <lwip_ioctl+0x4c>
  59785. sock_set_errno(sock, EINVAL);
  59786. 80186a6: 2316 movs r3, #22
  59787. 80186a8: 61bb str r3, [r7, #24]
  59788. 80186aa: 69bb ldr r3, [r7, #24]
  59789. 80186ac: 2b00 cmp r3, #0
  59790. 80186ae: d002 beq.n 80186b6 <lwip_ioctl+0x46>
  59791. 80186b0: 4a40 ldr r2, [pc, #256] @ (80187b4 <lwip_ioctl+0x144>)
  59792. 80186b2: 69bb ldr r3, [r7, #24]
  59793. 80186b4: 6013 str r3, [r2, #0]
  59794. done_socket(sock);
  59795. return -1;
  59796. 80186b6: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  59797. 80186ba: e073 b.n 80187a4 <lwip_ioctl+0x134>
  59798. }
  59799. #endif /* LWIP_FIONREAD_LINUXMODE */
  59800. #if LWIP_SO_RCVBUF
  59801. /* we come here if either LWIP_FIONREAD_LINUXMODE==0 or this is a TCP socket */
  59802. SYS_ARCH_GET(sock->conn->recv_avail, recv_avail);
  59803. 80186bc: f00d fef0 bl 80264a0 <sys_arch_protect>
  59804. 80186c0: 6238 str r0, [r7, #32]
  59805. 80186c2: 6a7b ldr r3, [r7, #36] @ 0x24
  59806. 80186c4: 681b ldr r3, [r3, #0]
  59807. 80186c6: 6a5b ldr r3, [r3, #36] @ 0x24
  59808. 80186c8: 62fb str r3, [r7, #44] @ 0x2c
  59809. 80186ca: 6a38 ldr r0, [r7, #32]
  59810. 80186cc: f00d fef6 bl 80264bc <sys_arch_unprotect>
  59811. if (recv_avail < 0) {
  59812. 80186d0: 6afb ldr r3, [r7, #44] @ 0x2c
  59813. 80186d2: 2b00 cmp r3, #0
  59814. 80186d4: da01 bge.n 80186da <lwip_ioctl+0x6a>
  59815. recv_avail = 0;
  59816. 80186d6: 2300 movs r3, #0
  59817. 80186d8: 62fb str r3, [r7, #44] @ 0x2c
  59818. }
  59819. /* Check if there is data left from the last recv operation. /maq 041215 */
  59820. if (sock->lastdata.netbuf) {
  59821. 80186da: 6a7b ldr r3, [r7, #36] @ 0x24
  59822. 80186dc: 685b ldr r3, [r3, #4]
  59823. 80186de: 2b00 cmp r3, #0
  59824. 80186e0: d016 beq.n 8018710 <lwip_ioctl+0xa0>
  59825. if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
  59826. 80186e2: 6a7b ldr r3, [r7, #36] @ 0x24
  59827. 80186e4: 681b ldr r3, [r3, #0]
  59828. 80186e6: 781b ldrb r3, [r3, #0]
  59829. 80186e8: f003 03f0 and.w r3, r3, #240 @ 0xf0
  59830. 80186ec: 2b10 cmp r3, #16
  59831. 80186ee: d107 bne.n 8018700 <lwip_ioctl+0x90>
  59832. recv_avail += sock->lastdata.pbuf->tot_len;
  59833. 80186f0: 6a7b ldr r3, [r7, #36] @ 0x24
  59834. 80186f2: 685b ldr r3, [r3, #4]
  59835. 80186f4: 891b ldrh r3, [r3, #8]
  59836. 80186f6: 461a mov r2, r3
  59837. 80186f8: 6afb ldr r3, [r7, #44] @ 0x2c
  59838. 80186fa: 4413 add r3, r2
  59839. 80186fc: 62fb str r3, [r7, #44] @ 0x2c
  59840. 80186fe: e007 b.n 8018710 <lwip_ioctl+0xa0>
  59841. } else {
  59842. recv_avail += sock->lastdata.netbuf->p->tot_len;
  59843. 8018700: 6a7b ldr r3, [r7, #36] @ 0x24
  59844. 8018702: 685b ldr r3, [r3, #4]
  59845. 8018704: 681b ldr r3, [r3, #0]
  59846. 8018706: 891b ldrh r3, [r3, #8]
  59847. 8018708: 461a mov r2, r3
  59848. 801870a: 6afb ldr r3, [r7, #44] @ 0x2c
  59849. 801870c: 4413 add r3, r2
  59850. 801870e: 62fb str r3, [r7, #44] @ 0x2c
  59851. }
  59852. }
  59853. *((int *)argp) = recv_avail;
  59854. 8018710: 687b ldr r3, [r7, #4]
  59855. 8018712: 6afa ldr r2, [r7, #44] @ 0x2c
  59856. 8018714: 601a str r2, [r3, #0]
  59857. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %"U16_F"\n", s, argp, *((u16_t *)argp)));
  59858. sock_set_errno(sock, 0);
  59859. 8018716: 2300 movs r3, #0
  59860. 8018718: 61fb str r3, [r7, #28]
  59861. 801871a: 69fb ldr r3, [r7, #28]
  59862. 801871c: 2b00 cmp r3, #0
  59863. 801871e: d002 beq.n 8018726 <lwip_ioctl+0xb6>
  59864. 8018720: 4a24 ldr r2, [pc, #144] @ (80187b4 <lwip_ioctl+0x144>)
  59865. 8018722: 69fb ldr r3, [r7, #28]
  59866. 8018724: 6013 str r3, [r2, #0]
  59867. done_socket(sock);
  59868. return 0;
  59869. 8018726: 2300 movs r3, #0
  59870. 8018728: e03c b.n 80187a4 <lwip_ioctl+0x134>
  59871. break;
  59872. #endif /* LWIP_SO_RCVBUF */
  59873. #endif /* LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE */
  59874. case (long)FIONBIO:
  59875. val = 0;
  59876. 801872a: 2300 movs r3, #0
  59877. 801872c: f887 302b strb.w r3, [r7, #43] @ 0x2b
  59878. if (argp && *(int *)argp) {
  59879. 8018730: 687b ldr r3, [r7, #4]
  59880. 8018732: 2b00 cmp r3, #0
  59881. 8018734: d006 beq.n 8018744 <lwip_ioctl+0xd4>
  59882. 8018736: 687b ldr r3, [r7, #4]
  59883. 8018738: 681b ldr r3, [r3, #0]
  59884. 801873a: 2b00 cmp r3, #0
  59885. 801873c: d002 beq.n 8018744 <lwip_ioctl+0xd4>
  59886. val = 1;
  59887. 801873e: 2301 movs r3, #1
  59888. 8018740: f887 302b strb.w r3, [r7, #43] @ 0x2b
  59889. }
  59890. netconn_set_nonblocking(sock->conn, val);
  59891. 8018744: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  59892. 8018748: 2b00 cmp r3, #0
  59893. 801874a: d00b beq.n 8018764 <lwip_ioctl+0xf4>
  59894. 801874c: 6a7b ldr r3, [r7, #36] @ 0x24
  59895. 801874e: 681b ldr r3, [r3, #0]
  59896. 8018750: f893 2028 ldrb.w r2, [r3, #40] @ 0x28
  59897. 8018754: 6a7b ldr r3, [r7, #36] @ 0x24
  59898. 8018756: 681b ldr r3, [r3, #0]
  59899. 8018758: f042 0202 orr.w r2, r2, #2
  59900. 801875c: b2d2 uxtb r2, r2
  59901. 801875e: f883 2028 strb.w r2, [r3, #40] @ 0x28
  59902. 8018762: e00a b.n 801877a <lwip_ioctl+0x10a>
  59903. 8018764: 6a7b ldr r3, [r7, #36] @ 0x24
  59904. 8018766: 681b ldr r3, [r3, #0]
  59905. 8018768: f893 2028 ldrb.w r2, [r3, #40] @ 0x28
  59906. 801876c: 6a7b ldr r3, [r7, #36] @ 0x24
  59907. 801876e: 681b ldr r3, [r3, #0]
  59908. 8018770: f022 0202 bic.w r2, r2, #2
  59909. 8018774: b2d2 uxtb r2, r2
  59910. 8018776: f883 2028 strb.w r2, [r3, #40] @ 0x28
  59911. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, val));
  59912. sock_set_errno(sock, 0);
  59913. 801877a: 2300 movs r3, #0
  59914. 801877c: 617b str r3, [r7, #20]
  59915. 801877e: 697b ldr r3, [r7, #20]
  59916. 8018780: 2b00 cmp r3, #0
  59917. 8018782: d002 beq.n 801878a <lwip_ioctl+0x11a>
  59918. 8018784: 4a0b ldr r2, [pc, #44] @ (80187b4 <lwip_ioctl+0x144>)
  59919. 8018786: 697b ldr r3, [r7, #20]
  59920. 8018788: 6013 str r3, [r2, #0]
  59921. done_socket(sock);
  59922. return 0;
  59923. 801878a: 2300 movs r3, #0
  59924. 801878c: e00a b.n 80187a4 <lwip_ioctl+0x134>
  59925. default:
  59926. break;
  59927. 801878e: bf00 nop
  59928. } /* switch (cmd) */
  59929. LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, UNIMPL: 0x%lx, %p)\n", s, cmd, argp));
  59930. sock_set_errno(sock, ENOSYS); /* not yet implemented */
  59931. 8018790: 2326 movs r3, #38 @ 0x26
  59932. 8018792: 613b str r3, [r7, #16]
  59933. 8018794: 693b ldr r3, [r7, #16]
  59934. 8018796: 2b00 cmp r3, #0
  59935. 8018798: d002 beq.n 80187a0 <lwip_ioctl+0x130>
  59936. 801879a: 4a06 ldr r2, [pc, #24] @ (80187b4 <lwip_ioctl+0x144>)
  59937. 801879c: 693b ldr r3, [r7, #16]
  59938. 801879e: 6013 str r3, [r2, #0]
  59939. done_socket(sock);
  59940. return -1;
  59941. 80187a0: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  59942. }
  59943. 80187a4: 4618 mov r0, r3
  59944. 80187a6: 3730 adds r7, #48 @ 0x30
  59945. 80187a8: 46bd mov sp, r7
  59946. 80187aa: bd80 pop {r7, pc}
  59947. 80187ac: 8004667e .word 0x8004667e
  59948. 80187b0: 4004667f .word 0x4004667f
  59949. 80187b4: 2402b180 .word 0x2402b180
  59950. 080187b8 <tcpip_timeouts_mbox_fetch>:
  59951. * @param mbox the mbox to fetch the message from
  59952. * @param msg the place to store the message
  59953. */
  59954. static void
  59955. tcpip_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)
  59956. {
  59957. 80187b8: b580 push {r7, lr}
  59958. 80187ba: b084 sub sp, #16
  59959. 80187bc: af00 add r7, sp, #0
  59960. 80187be: 6078 str r0, [r7, #4]
  59961. 80187c0: 6039 str r1, [r7, #0]
  59962. u32_t sleeptime, res;
  59963. again:
  59964. LWIP_ASSERT_CORE_LOCKED();
  59965. 80187c2: f7f7 feb5 bl 8010530 <sys_check_core_locking>
  59966. sleeptime = sys_timeouts_sleeptime();
  59967. 80187c6: f008 fb41 bl 8020e4c <sys_timeouts_sleeptime>
  59968. 80187ca: 60f8 str r0, [r7, #12]
  59969. if (sleeptime == SYS_TIMEOUTS_SLEEPTIME_INFINITE) {
  59970. 80187cc: 68fb ldr r3, [r7, #12]
  59971. 80187ce: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  59972. 80187d2: d109 bne.n 80187e8 <tcpip_timeouts_mbox_fetch+0x30>
  59973. UNLOCK_TCPIP_CORE();
  59974. 80187d4: f7f7 fe9e bl 8010514 <sys_unlock_tcpip_core>
  59975. sys_arch_mbox_fetch(mbox, msg, 0);
  59976. 80187d8: 2200 movs r2, #0
  59977. 80187da: 6839 ldr r1, [r7, #0]
  59978. 80187dc: 6878 ldr r0, [r7, #4]
  59979. 80187de: f00d fd0d bl 80261fc <sys_arch_mbox_fetch>
  59980. LOCK_TCPIP_CORE();
  59981. 80187e2: f7f7 fe87 bl 80104f4 <sys_lock_tcpip_core>
  59982. return;
  59983. 80187e6: e016 b.n 8018816 <tcpip_timeouts_mbox_fetch+0x5e>
  59984. } else if (sleeptime == 0) {
  59985. 80187e8: 68fb ldr r3, [r7, #12]
  59986. 80187ea: 2b00 cmp r3, #0
  59987. 80187ec: d102 bne.n 80187f4 <tcpip_timeouts_mbox_fetch+0x3c>
  59988. sys_check_timeouts();
  59989. 80187ee: f008 faf1 bl 8020dd4 <sys_check_timeouts>
  59990. /* We try again to fetch a message from the mbox. */
  59991. goto again;
  59992. 80187f2: e7e6 b.n 80187c2 <tcpip_timeouts_mbox_fetch+0xa>
  59993. }
  59994. UNLOCK_TCPIP_CORE();
  59995. 80187f4: f7f7 fe8e bl 8010514 <sys_unlock_tcpip_core>
  59996. res = sys_arch_mbox_fetch(mbox, msg, sleeptime);
  59997. 80187f8: 68fa ldr r2, [r7, #12]
  59998. 80187fa: 6839 ldr r1, [r7, #0]
  59999. 80187fc: 6878 ldr r0, [r7, #4]
  60000. 80187fe: f00d fcfd bl 80261fc <sys_arch_mbox_fetch>
  60001. 8018802: 60b8 str r0, [r7, #8]
  60002. LOCK_TCPIP_CORE();
  60003. 8018804: f7f7 fe76 bl 80104f4 <sys_lock_tcpip_core>
  60004. if (res == SYS_ARCH_TIMEOUT) {
  60005. 8018808: 68bb ldr r3, [r7, #8]
  60006. 801880a: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  60007. 801880e: d102 bne.n 8018816 <tcpip_timeouts_mbox_fetch+0x5e>
  60008. /* If a SYS_ARCH_TIMEOUT value is returned, a timeout occurred
  60009. before a message could be fetched. */
  60010. sys_check_timeouts();
  60011. 8018810: f008 fae0 bl 8020dd4 <sys_check_timeouts>
  60012. /* We try again to fetch a message from the mbox. */
  60013. goto again;
  60014. 8018814: e7d5 b.n 80187c2 <tcpip_timeouts_mbox_fetch+0xa>
  60015. }
  60016. }
  60017. 8018816: 3710 adds r7, #16
  60018. 8018818: 46bd mov sp, r7
  60019. 801881a: bd80 pop {r7, pc}
  60020. 0801881c <tcpip_thread>:
  60021. *
  60022. * @param arg unused argument
  60023. */
  60024. static void
  60025. tcpip_thread(void *arg)
  60026. {
  60027. 801881c: b580 push {r7, lr}
  60028. 801881e: b084 sub sp, #16
  60029. 8018820: af00 add r7, sp, #0
  60030. 8018822: 6078 str r0, [r7, #4]
  60031. struct tcpip_msg *msg;
  60032. LWIP_UNUSED_ARG(arg);
  60033. LWIP_MARK_TCPIP_THREAD();
  60034. 8018824: f7f7 fec0 bl 80105a8 <sys_mark_tcpip_thread>
  60035. LOCK_TCPIP_CORE();
  60036. 8018828: f7f7 fe64 bl 80104f4 <sys_lock_tcpip_core>
  60037. if (tcpip_init_done != NULL) {
  60038. 801882c: 4b0f ldr r3, [pc, #60] @ (801886c <tcpip_thread+0x50>)
  60039. 801882e: 681b ldr r3, [r3, #0]
  60040. 8018830: 2b00 cmp r3, #0
  60041. 8018832: d005 beq.n 8018840 <tcpip_thread+0x24>
  60042. tcpip_init_done(tcpip_init_done_arg);
  60043. 8018834: 4b0d ldr r3, [pc, #52] @ (801886c <tcpip_thread+0x50>)
  60044. 8018836: 681b ldr r3, [r3, #0]
  60045. 8018838: 4a0d ldr r2, [pc, #52] @ (8018870 <tcpip_thread+0x54>)
  60046. 801883a: 6812 ldr r2, [r2, #0]
  60047. 801883c: 4610 mov r0, r2
  60048. 801883e: 4798 blx r3
  60049. }
  60050. while (1) { /* MAIN Loop */
  60051. LWIP_TCPIP_THREAD_ALIVE();
  60052. /* wait for a message, timeouts are processed while waiting */
  60053. TCPIP_MBOX_FETCH(&tcpip_mbox, (void **)&msg);
  60054. 8018840: f107 030c add.w r3, r7, #12
  60055. 8018844: 4619 mov r1, r3
  60056. 8018846: 480b ldr r0, [pc, #44] @ (8018874 <tcpip_thread+0x58>)
  60057. 8018848: f7ff ffb6 bl 80187b8 <tcpip_timeouts_mbox_fetch>
  60058. if (msg == NULL) {
  60059. 801884c: 68fb ldr r3, [r7, #12]
  60060. 801884e: 2b00 cmp r3, #0
  60061. 8018850: d106 bne.n 8018860 <tcpip_thread+0x44>
  60062. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n"));
  60063. LWIP_ASSERT("tcpip_thread: invalid message", 0);
  60064. 8018852: 4b09 ldr r3, [pc, #36] @ (8018878 <tcpip_thread+0x5c>)
  60065. 8018854: 2291 movs r2, #145 @ 0x91
  60066. 8018856: 4909 ldr r1, [pc, #36] @ (801887c <tcpip_thread+0x60>)
  60067. 8018858: 4809 ldr r0, [pc, #36] @ (8018880 <tcpip_thread+0x64>)
  60068. 801885a: f011 f8b7 bl 80299cc <iprintf>
  60069. continue;
  60070. 801885e: e003 b.n 8018868 <tcpip_thread+0x4c>
  60071. }
  60072. tcpip_thread_handle_msg(msg);
  60073. 8018860: 68fb ldr r3, [r7, #12]
  60074. 8018862: 4618 mov r0, r3
  60075. 8018864: f000 f80e bl 8018884 <tcpip_thread_handle_msg>
  60076. TCPIP_MBOX_FETCH(&tcpip_mbox, (void **)&msg);
  60077. 8018868: e7ea b.n 8018840 <tcpip_thread+0x24>
  60078. 801886a: bf00 nop
  60079. 801886c: 24024328 .word 0x24024328
  60080. 8018870: 2402432c .word 0x2402432c
  60081. 8018874: 24024330 .word 0x24024330
  60082. 8018878: 0802d99c .word 0x0802d99c
  60083. 801887c: 0802d9cc .word 0x0802d9cc
  60084. 8018880: 0802d9ec .word 0x0802d9ec
  60085. 08018884 <tcpip_thread_handle_msg>:
  60086. /* Handle a single tcpip_msg
  60087. * This is in its own function for access by tests only.
  60088. */
  60089. static void
  60090. tcpip_thread_handle_msg(struct tcpip_msg *msg)
  60091. {
  60092. 8018884: b580 push {r7, lr}
  60093. 8018886: b082 sub sp, #8
  60094. 8018888: af00 add r7, sp, #0
  60095. 801888a: 6078 str r0, [r7, #4]
  60096. switch (msg->type) {
  60097. 801888c: 687b ldr r3, [r7, #4]
  60098. 801888e: 781b ldrb r3, [r3, #0]
  60099. 8018890: 2b02 cmp r3, #2
  60100. 8018892: d026 beq.n 80188e2 <tcpip_thread_handle_msg+0x5e>
  60101. 8018894: 2b02 cmp r3, #2
  60102. 8018896: dc2b bgt.n 80188f0 <tcpip_thread_handle_msg+0x6c>
  60103. 8018898: 2b00 cmp r3, #0
  60104. 801889a: d002 beq.n 80188a2 <tcpip_thread_handle_msg+0x1e>
  60105. 801889c: 2b01 cmp r3, #1
  60106. 801889e: d015 beq.n 80188cc <tcpip_thread_handle_msg+0x48>
  60107. 80188a0: e026 b.n 80188f0 <tcpip_thread_handle_msg+0x6c>
  60108. #endif /* !LWIP_TCPIP_CORE_LOCKING */
  60109. #if !LWIP_TCPIP_CORE_LOCKING_INPUT
  60110. case TCPIP_MSG_INPKT:
  60111. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
  60112. if (msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif) != ERR_OK) {
  60113. 80188a2: 687b ldr r3, [r7, #4]
  60114. 80188a4: 68db ldr r3, [r3, #12]
  60115. 80188a6: 687a ldr r2, [r7, #4]
  60116. 80188a8: 6850 ldr r0, [r2, #4]
  60117. 80188aa: 687a ldr r2, [r7, #4]
  60118. 80188ac: 6892 ldr r2, [r2, #8]
  60119. 80188ae: 4611 mov r1, r2
  60120. 80188b0: 4798 blx r3
  60121. 80188b2: 4603 mov r3, r0
  60122. 80188b4: 2b00 cmp r3, #0
  60123. 80188b6: d004 beq.n 80188c2 <tcpip_thread_handle_msg+0x3e>
  60124. pbuf_free(msg->msg.inp.p);
  60125. 80188b8: 687b ldr r3, [r7, #4]
  60126. 80188ba: 685b ldr r3, [r3, #4]
  60127. 80188bc: 4618 mov r0, r3
  60128. 80188be: f001 fe0d bl 801a4dc <pbuf_free>
  60129. }
  60130. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  60131. 80188c2: 6879 ldr r1, [r7, #4]
  60132. 80188c4: 2009 movs r0, #9
  60133. 80188c6: f000 ff1b bl 8019700 <memp_free>
  60134. break;
  60135. 80188ca: e018 b.n 80188fe <tcpip_thread_handle_msg+0x7a>
  60136. break;
  60137. #endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */
  60138. case TCPIP_MSG_CALLBACK:
  60139. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
  60140. msg->msg.cb.function(msg->msg.cb.ctx);
  60141. 80188cc: 687b ldr r3, [r7, #4]
  60142. 80188ce: 685b ldr r3, [r3, #4]
  60143. 80188d0: 687a ldr r2, [r7, #4]
  60144. 80188d2: 6892 ldr r2, [r2, #8]
  60145. 80188d4: 4610 mov r0, r2
  60146. 80188d6: 4798 blx r3
  60147. memp_free(MEMP_TCPIP_MSG_API, msg);
  60148. 80188d8: 6879 ldr r1, [r7, #4]
  60149. 80188da: 2008 movs r0, #8
  60150. 80188dc: f000 ff10 bl 8019700 <memp_free>
  60151. break;
  60152. 80188e0: e00d b.n 80188fe <tcpip_thread_handle_msg+0x7a>
  60153. case TCPIP_MSG_CALLBACK_STATIC:
  60154. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK_STATIC %p\n", (void *)msg));
  60155. msg->msg.cb.function(msg->msg.cb.ctx);
  60156. 80188e2: 687b ldr r3, [r7, #4]
  60157. 80188e4: 685b ldr r3, [r3, #4]
  60158. 80188e6: 687a ldr r2, [r7, #4]
  60159. 80188e8: 6892 ldr r2, [r2, #8]
  60160. 80188ea: 4610 mov r0, r2
  60161. 80188ec: 4798 blx r3
  60162. break;
  60163. 80188ee: e006 b.n 80188fe <tcpip_thread_handle_msg+0x7a>
  60164. default:
  60165. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: %d\n", msg->type));
  60166. LWIP_ASSERT("tcpip_thread: invalid message", 0);
  60167. 80188f0: 4b05 ldr r3, [pc, #20] @ (8018908 <tcpip_thread_handle_msg+0x84>)
  60168. 80188f2: 22cf movs r2, #207 @ 0xcf
  60169. 80188f4: 4905 ldr r1, [pc, #20] @ (801890c <tcpip_thread_handle_msg+0x88>)
  60170. 80188f6: 4806 ldr r0, [pc, #24] @ (8018910 <tcpip_thread_handle_msg+0x8c>)
  60171. 80188f8: f011 f868 bl 80299cc <iprintf>
  60172. break;
  60173. 80188fc: bf00 nop
  60174. }
  60175. }
  60176. 80188fe: bf00 nop
  60177. 8018900: 3708 adds r7, #8
  60178. 8018902: 46bd mov sp, r7
  60179. 8018904: bd80 pop {r7, pc}
  60180. 8018906: bf00 nop
  60181. 8018908: 0802d99c .word 0x0802d99c
  60182. 801890c: 0802d9cc .word 0x0802d9cc
  60183. 8018910: 0802d9ec .word 0x0802d9ec
  60184. 08018914 <tcpip_inpkt>:
  60185. * @param inp the network interface on which the packet was received
  60186. * @param input_fn input function to call
  60187. */
  60188. err_t
  60189. tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn)
  60190. {
  60191. 8018914: b580 push {r7, lr}
  60192. 8018916: b086 sub sp, #24
  60193. 8018918: af00 add r7, sp, #0
  60194. 801891a: 60f8 str r0, [r7, #12]
  60195. 801891c: 60b9 str r1, [r7, #8]
  60196. 801891e: 607a str r2, [r7, #4]
  60197. UNLOCK_TCPIP_CORE();
  60198. return ret;
  60199. #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  60200. struct tcpip_msg *msg;
  60201. LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
  60202. 8018920: 481a ldr r0, [pc, #104] @ (801898c <tcpip_inpkt+0x78>)
  60203. 8018922: f00d fcb3 bl 802628c <sys_mbox_valid>
  60204. 8018926: 4603 mov r3, r0
  60205. 8018928: 2b00 cmp r3, #0
  60206. 801892a: d105 bne.n 8018938 <tcpip_inpkt+0x24>
  60207. 801892c: 4b18 ldr r3, [pc, #96] @ (8018990 <tcpip_inpkt+0x7c>)
  60208. 801892e: 22fc movs r2, #252 @ 0xfc
  60209. 8018930: 4918 ldr r1, [pc, #96] @ (8018994 <tcpip_inpkt+0x80>)
  60210. 8018932: 4819 ldr r0, [pc, #100] @ (8018998 <tcpip_inpkt+0x84>)
  60211. 8018934: f011 f84a bl 80299cc <iprintf>
  60212. msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
  60213. 8018938: 2009 movs r0, #9
  60214. 801893a: f000 fe6b bl 8019614 <memp_malloc>
  60215. 801893e: 6178 str r0, [r7, #20]
  60216. if (msg == NULL) {
  60217. 8018940: 697b ldr r3, [r7, #20]
  60218. 8018942: 2b00 cmp r3, #0
  60219. 8018944: d102 bne.n 801894c <tcpip_inpkt+0x38>
  60220. return ERR_MEM;
  60221. 8018946: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  60222. 801894a: e01a b.n 8018982 <tcpip_inpkt+0x6e>
  60223. }
  60224. msg->type = TCPIP_MSG_INPKT;
  60225. 801894c: 697b ldr r3, [r7, #20]
  60226. 801894e: 2200 movs r2, #0
  60227. 8018950: 701a strb r2, [r3, #0]
  60228. msg->msg.inp.p = p;
  60229. 8018952: 697b ldr r3, [r7, #20]
  60230. 8018954: 68fa ldr r2, [r7, #12]
  60231. 8018956: 605a str r2, [r3, #4]
  60232. msg->msg.inp.netif = inp;
  60233. 8018958: 697b ldr r3, [r7, #20]
  60234. 801895a: 68ba ldr r2, [r7, #8]
  60235. 801895c: 609a str r2, [r3, #8]
  60236. msg->msg.inp.input_fn = input_fn;
  60237. 801895e: 697b ldr r3, [r7, #20]
  60238. 8018960: 687a ldr r2, [r7, #4]
  60239. 8018962: 60da str r2, [r3, #12]
  60240. if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) {
  60241. 8018964: 6979 ldr r1, [r7, #20]
  60242. 8018966: 4809 ldr r0, [pc, #36] @ (801898c <tcpip_inpkt+0x78>)
  60243. 8018968: f00d fc2e bl 80261c8 <sys_mbox_trypost>
  60244. 801896c: 4603 mov r3, r0
  60245. 801896e: 2b00 cmp r3, #0
  60246. 8018970: d006 beq.n 8018980 <tcpip_inpkt+0x6c>
  60247. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  60248. 8018972: 6979 ldr r1, [r7, #20]
  60249. 8018974: 2009 movs r0, #9
  60250. 8018976: f000 fec3 bl 8019700 <memp_free>
  60251. return ERR_MEM;
  60252. 801897a: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  60253. 801897e: e000 b.n 8018982 <tcpip_inpkt+0x6e>
  60254. }
  60255. return ERR_OK;
  60256. 8018980: 2300 movs r3, #0
  60257. #endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  60258. }
  60259. 8018982: 4618 mov r0, r3
  60260. 8018984: 3718 adds r7, #24
  60261. 8018986: 46bd mov sp, r7
  60262. 8018988: bd80 pop {r7, pc}
  60263. 801898a: bf00 nop
  60264. 801898c: 24024330 .word 0x24024330
  60265. 8018990: 0802d99c .word 0x0802d99c
  60266. 8018994: 0802da14 .word 0x0802da14
  60267. 8018998: 0802d9ec .word 0x0802d9ec
  60268. 0801899c <tcpip_input>:
  60269. * NETIF_FLAG_ETHERNET flags)
  60270. * @param inp the network interface on which the packet was received
  60271. */
  60272. err_t
  60273. tcpip_input(struct pbuf *p, struct netif *inp)
  60274. {
  60275. 801899c: b580 push {r7, lr}
  60276. 801899e: b082 sub sp, #8
  60277. 80189a0: af00 add r7, sp, #0
  60278. 80189a2: 6078 str r0, [r7, #4]
  60279. 80189a4: 6039 str r1, [r7, #0]
  60280. #if LWIP_ETHERNET
  60281. if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
  60282. 80189a6: 683b ldr r3, [r7, #0]
  60283. 80189a8: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  60284. 80189ac: f003 0318 and.w r3, r3, #24
  60285. 80189b0: 2b00 cmp r3, #0
  60286. 80189b2: d006 beq.n 80189c2 <tcpip_input+0x26>
  60287. return tcpip_inpkt(p, inp, ethernet_input);
  60288. 80189b4: 4a08 ldr r2, [pc, #32] @ (80189d8 <tcpip_input+0x3c>)
  60289. 80189b6: 6839 ldr r1, [r7, #0]
  60290. 80189b8: 6878 ldr r0, [r7, #4]
  60291. 80189ba: f7ff ffab bl 8018914 <tcpip_inpkt>
  60292. 80189be: 4603 mov r3, r0
  60293. 80189c0: e005 b.n 80189ce <tcpip_input+0x32>
  60294. } else
  60295. #endif /* LWIP_ETHERNET */
  60296. return tcpip_inpkt(p, inp, ip_input);
  60297. 80189c2: 4a06 ldr r2, [pc, #24] @ (80189dc <tcpip_input+0x40>)
  60298. 80189c4: 6839 ldr r1, [r7, #0]
  60299. 80189c6: 6878 ldr r0, [r7, #4]
  60300. 80189c8: f7ff ffa4 bl 8018914 <tcpip_inpkt>
  60301. 80189cc: 4603 mov r3, r0
  60302. }
  60303. 80189ce: 4618 mov r0, r3
  60304. 80189d0: 3708 adds r7, #8
  60305. 80189d2: 46bd mov sp, r7
  60306. 80189d4: bd80 pop {r7, pc}
  60307. 80189d6: bf00 nop
  60308. 80189d8: 08025fbd .word 0x08025fbd
  60309. 80189dc: 08024ae5 .word 0x08024ae5
  60310. 080189e0 <tcpip_try_callback>:
  60311. *
  60312. * @see tcpip_callback
  60313. */
  60314. err_t
  60315. tcpip_try_callback(tcpip_callback_fn function, void *ctx)
  60316. {
  60317. 80189e0: b580 push {r7, lr}
  60318. 80189e2: b084 sub sp, #16
  60319. 80189e4: af00 add r7, sp, #0
  60320. 80189e6: 6078 str r0, [r7, #4]
  60321. 80189e8: 6039 str r1, [r7, #0]
  60322. struct tcpip_msg *msg;
  60323. LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
  60324. 80189ea: 4819 ldr r0, [pc, #100] @ (8018a50 <tcpip_try_callback+0x70>)
  60325. 80189ec: f00d fc4e bl 802628c <sys_mbox_valid>
  60326. 80189f0: 4603 mov r3, r0
  60327. 80189f2: 2b00 cmp r3, #0
  60328. 80189f4: d106 bne.n 8018a04 <tcpip_try_callback+0x24>
  60329. 80189f6: 4b17 ldr r3, [pc, #92] @ (8018a54 <tcpip_try_callback+0x74>)
  60330. 80189f8: f240 125d movw r2, #349 @ 0x15d
  60331. 80189fc: 4916 ldr r1, [pc, #88] @ (8018a58 <tcpip_try_callback+0x78>)
  60332. 80189fe: 4817 ldr r0, [pc, #92] @ (8018a5c <tcpip_try_callback+0x7c>)
  60333. 8018a00: f010 ffe4 bl 80299cc <iprintf>
  60334. msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
  60335. 8018a04: 2008 movs r0, #8
  60336. 8018a06: f000 fe05 bl 8019614 <memp_malloc>
  60337. 8018a0a: 60f8 str r0, [r7, #12]
  60338. if (msg == NULL) {
  60339. 8018a0c: 68fb ldr r3, [r7, #12]
  60340. 8018a0e: 2b00 cmp r3, #0
  60341. 8018a10: d102 bne.n 8018a18 <tcpip_try_callback+0x38>
  60342. return ERR_MEM;
  60343. 8018a12: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  60344. 8018a16: e017 b.n 8018a48 <tcpip_try_callback+0x68>
  60345. }
  60346. msg->type = TCPIP_MSG_CALLBACK;
  60347. 8018a18: 68fb ldr r3, [r7, #12]
  60348. 8018a1a: 2201 movs r2, #1
  60349. 8018a1c: 701a strb r2, [r3, #0]
  60350. msg->msg.cb.function = function;
  60351. 8018a1e: 68fb ldr r3, [r7, #12]
  60352. 8018a20: 687a ldr r2, [r7, #4]
  60353. 8018a22: 605a str r2, [r3, #4]
  60354. msg->msg.cb.ctx = ctx;
  60355. 8018a24: 68fb ldr r3, [r7, #12]
  60356. 8018a26: 683a ldr r2, [r7, #0]
  60357. 8018a28: 609a str r2, [r3, #8]
  60358. if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) {
  60359. 8018a2a: 68f9 ldr r1, [r7, #12]
  60360. 8018a2c: 4808 ldr r0, [pc, #32] @ (8018a50 <tcpip_try_callback+0x70>)
  60361. 8018a2e: f00d fbcb bl 80261c8 <sys_mbox_trypost>
  60362. 8018a32: 4603 mov r3, r0
  60363. 8018a34: 2b00 cmp r3, #0
  60364. 8018a36: d006 beq.n 8018a46 <tcpip_try_callback+0x66>
  60365. memp_free(MEMP_TCPIP_MSG_API, msg);
  60366. 8018a38: 68f9 ldr r1, [r7, #12]
  60367. 8018a3a: 2008 movs r0, #8
  60368. 8018a3c: f000 fe60 bl 8019700 <memp_free>
  60369. return ERR_MEM;
  60370. 8018a40: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  60371. 8018a44: e000 b.n 8018a48 <tcpip_try_callback+0x68>
  60372. }
  60373. return ERR_OK;
  60374. 8018a46: 2300 movs r3, #0
  60375. }
  60376. 8018a48: 4618 mov r0, r3
  60377. 8018a4a: 3710 adds r7, #16
  60378. 8018a4c: 46bd mov sp, r7
  60379. 8018a4e: bd80 pop {r7, pc}
  60380. 8018a50: 24024330 .word 0x24024330
  60381. 8018a54: 0802d99c .word 0x0802d99c
  60382. 8018a58: 0802da14 .word 0x0802da14
  60383. 8018a5c: 0802d9ec .word 0x0802d9ec
  60384. 08018a60 <tcpip_send_msg_wait_sem>:
  60385. * @param sem semaphore to wait on
  60386. * @return ERR_OK if the function was called, another err_t if not
  60387. */
  60388. err_t
  60389. tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem)
  60390. {
  60391. 8018a60: b580 push {r7, lr}
  60392. 8018a62: b084 sub sp, #16
  60393. 8018a64: af00 add r7, sp, #0
  60394. 8018a66: 60f8 str r0, [r7, #12]
  60395. 8018a68: 60b9 str r1, [r7, #8]
  60396. 8018a6a: 607a str r2, [r7, #4]
  60397. #if LWIP_TCPIP_CORE_LOCKING
  60398. LWIP_UNUSED_ARG(sem);
  60399. LOCK_TCPIP_CORE();
  60400. 8018a6c: f7f7 fd42 bl 80104f4 <sys_lock_tcpip_core>
  60401. fn(apimsg);
  60402. 8018a70: 68fb ldr r3, [r7, #12]
  60403. 8018a72: 68b8 ldr r0, [r7, #8]
  60404. 8018a74: 4798 blx r3
  60405. UNLOCK_TCPIP_CORE();
  60406. 8018a76: f7f7 fd4d bl 8010514 <sys_unlock_tcpip_core>
  60407. return ERR_OK;
  60408. 8018a7a: 2300 movs r3, #0
  60409. sys_mbox_post(&tcpip_mbox, &TCPIP_MSG_VAR_REF(msg));
  60410. sys_arch_sem_wait(sem, 0);
  60411. TCPIP_MSG_VAR_FREE(msg);
  60412. return ERR_OK;
  60413. #endif /* LWIP_TCPIP_CORE_LOCKING */
  60414. }
  60415. 8018a7c: 4618 mov r0, r3
  60416. 8018a7e: 3710 adds r7, #16
  60417. 8018a80: 46bd mov sp, r7
  60418. 8018a82: bd80 pop {r7, pc}
  60419. 08018a84 <tcpip_init>:
  60420. * @param initfunc a function to call when tcpip_thread is running and finished initializing
  60421. * @param arg argument to pass to initfunc
  60422. */
  60423. void
  60424. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  60425. {
  60426. 8018a84: b580 push {r7, lr}
  60427. 8018a86: b084 sub sp, #16
  60428. 8018a88: af02 add r7, sp, #8
  60429. 8018a8a: 6078 str r0, [r7, #4]
  60430. 8018a8c: 6039 str r1, [r7, #0]
  60431. lwip_init();
  60432. 8018a8e: f000 f92d bl 8018cec <lwip_init>
  60433. tcpip_init_done = initfunc;
  60434. 8018a92: 4a17 ldr r2, [pc, #92] @ (8018af0 <tcpip_init+0x6c>)
  60435. 8018a94: 687b ldr r3, [r7, #4]
  60436. 8018a96: 6013 str r3, [r2, #0]
  60437. tcpip_init_done_arg = arg;
  60438. 8018a98: 4a16 ldr r2, [pc, #88] @ (8018af4 <tcpip_init+0x70>)
  60439. 8018a9a: 683b ldr r3, [r7, #0]
  60440. 8018a9c: 6013 str r3, [r2, #0]
  60441. if (sys_mbox_new(&tcpip_mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  60442. 8018a9e: 2106 movs r1, #6
  60443. 8018aa0: 4815 ldr r0, [pc, #84] @ (8018af8 <tcpip_init+0x74>)
  60444. 8018aa2: f00d fb65 bl 8026170 <sys_mbox_new>
  60445. 8018aa6: 4603 mov r3, r0
  60446. 8018aa8: 2b00 cmp r3, #0
  60447. 8018aaa: d006 beq.n 8018aba <tcpip_init+0x36>
  60448. LWIP_ASSERT("failed to create tcpip_thread mbox", 0);
  60449. 8018aac: 4b13 ldr r3, [pc, #76] @ (8018afc <tcpip_init+0x78>)
  60450. 8018aae: f240 2261 movw r2, #609 @ 0x261
  60451. 8018ab2: 4913 ldr r1, [pc, #76] @ (8018b00 <tcpip_init+0x7c>)
  60452. 8018ab4: 4813 ldr r0, [pc, #76] @ (8018b04 <tcpip_init+0x80>)
  60453. 8018ab6: f010 ff89 bl 80299cc <iprintf>
  60454. }
  60455. #if LWIP_TCPIP_CORE_LOCKING
  60456. if (sys_mutex_new(&lock_tcpip_core) != ERR_OK) {
  60457. 8018aba: 4813 ldr r0, [pc, #76] @ (8018b08 <tcpip_init+0x84>)
  60458. 8018abc: f00d fc9e bl 80263fc <sys_mutex_new>
  60459. 8018ac0: 4603 mov r3, r0
  60460. 8018ac2: 2b00 cmp r3, #0
  60461. 8018ac4: d006 beq.n 8018ad4 <tcpip_init+0x50>
  60462. LWIP_ASSERT("failed to create lock_tcpip_core", 0);
  60463. 8018ac6: 4b0d ldr r3, [pc, #52] @ (8018afc <tcpip_init+0x78>)
  60464. 8018ac8: f240 2265 movw r2, #613 @ 0x265
  60465. 8018acc: 490f ldr r1, [pc, #60] @ (8018b0c <tcpip_init+0x88>)
  60466. 8018ace: 480d ldr r0, [pc, #52] @ (8018b04 <tcpip_init+0x80>)
  60467. 8018ad0: f010 ff7c bl 80299cc <iprintf>
  60468. }
  60469. #endif /* LWIP_TCPIP_CORE_LOCKING */
  60470. sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);
  60471. 8018ad4: 2330 movs r3, #48 @ 0x30
  60472. 8018ad6: 9300 str r3, [sp, #0]
  60473. 8018ad8: f44f 5380 mov.w r3, #4096 @ 0x1000
  60474. 8018adc: 2200 movs r2, #0
  60475. 8018ade: 490c ldr r1, [pc, #48] @ (8018b10 <tcpip_init+0x8c>)
  60476. 8018ae0: 480c ldr r0, [pc, #48] @ (8018b14 <tcpip_init+0x90>)
  60477. 8018ae2: f00d fcbd bl 8026460 <sys_thread_new>
  60478. }
  60479. 8018ae6: bf00 nop
  60480. 8018ae8: 3708 adds r7, #8
  60481. 8018aea: 46bd mov sp, r7
  60482. 8018aec: bd80 pop {r7, pc}
  60483. 8018aee: bf00 nop
  60484. 8018af0: 24024328 .word 0x24024328
  60485. 8018af4: 2402432c .word 0x2402432c
  60486. 8018af8: 24024330 .word 0x24024330
  60487. 8018afc: 0802d99c .word 0x0802d99c
  60488. 8018b00: 0802da24 .word 0x0802da24
  60489. 8018b04: 0802d9ec .word 0x0802d9ec
  60490. 8018b08: 24024334 .word 0x24024334
  60491. 8018b0c: 0802da48 .word 0x0802da48
  60492. 8018b10: 0801881d .word 0x0801881d
  60493. 8018b14: 0802da6c .word 0x0802da6c
  60494. 08018b18 <lwip_htons>:
  60495. * @param n u16_t in host byte order
  60496. * @return n in network byte order
  60497. */
  60498. u16_t
  60499. lwip_htons(u16_t n)
  60500. {
  60501. 8018b18: b480 push {r7}
  60502. 8018b1a: b083 sub sp, #12
  60503. 8018b1c: af00 add r7, sp, #0
  60504. 8018b1e: 4603 mov r3, r0
  60505. 8018b20: 80fb strh r3, [r7, #6]
  60506. return PP_HTONS(n);
  60507. 8018b22: 88fb ldrh r3, [r7, #6]
  60508. 8018b24: 021b lsls r3, r3, #8
  60509. 8018b26: b21a sxth r2, r3
  60510. 8018b28: 88fb ldrh r3, [r7, #6]
  60511. 8018b2a: 0a1b lsrs r3, r3, #8
  60512. 8018b2c: b29b uxth r3, r3
  60513. 8018b2e: b21b sxth r3, r3
  60514. 8018b30: 4313 orrs r3, r2
  60515. 8018b32: b21b sxth r3, r3
  60516. 8018b34: b29b uxth r3, r3
  60517. }
  60518. 8018b36: 4618 mov r0, r3
  60519. 8018b38: 370c adds r7, #12
  60520. 8018b3a: 46bd mov sp, r7
  60521. 8018b3c: f85d 7b04 ldr.w r7, [sp], #4
  60522. 8018b40: 4770 bx lr
  60523. 08018b42 <lwip_htonl>:
  60524. * @param n u32_t in host byte order
  60525. * @return n in network byte order
  60526. */
  60527. u32_t
  60528. lwip_htonl(u32_t n)
  60529. {
  60530. 8018b42: b480 push {r7}
  60531. 8018b44: b083 sub sp, #12
  60532. 8018b46: af00 add r7, sp, #0
  60533. 8018b48: 6078 str r0, [r7, #4]
  60534. return PP_HTONL(n);
  60535. 8018b4a: 687b ldr r3, [r7, #4]
  60536. 8018b4c: 061a lsls r2, r3, #24
  60537. 8018b4e: 687b ldr r3, [r7, #4]
  60538. 8018b50: 021b lsls r3, r3, #8
  60539. 8018b52: f403 037f and.w r3, r3, #16711680 @ 0xff0000
  60540. 8018b56: 431a orrs r2, r3
  60541. 8018b58: 687b ldr r3, [r7, #4]
  60542. 8018b5a: 0a1b lsrs r3, r3, #8
  60543. 8018b5c: f403 437f and.w r3, r3, #65280 @ 0xff00
  60544. 8018b60: 431a orrs r2, r3
  60545. 8018b62: 687b ldr r3, [r7, #4]
  60546. 8018b64: 0e1b lsrs r3, r3, #24
  60547. 8018b66: 4313 orrs r3, r2
  60548. }
  60549. 8018b68: 4618 mov r0, r3
  60550. 8018b6a: 370c adds r7, #12
  60551. 8018b6c: 46bd mov sp, r7
  60552. 8018b6e: f85d 7b04 ldr.w r7, [sp], #4
  60553. 8018b72: 4770 bx lr
  60554. 08018b74 <lwip_standard_chksum>:
  60555. * @param len length of data to be summed
  60556. * @return host order (!) lwip checksum (non-inverted Internet sum)
  60557. */
  60558. u16_t
  60559. lwip_standard_chksum(const void *dataptr, int len)
  60560. {
  60561. 8018b74: b480 push {r7}
  60562. 8018b76: b089 sub sp, #36 @ 0x24
  60563. 8018b78: af00 add r7, sp, #0
  60564. 8018b7a: 6078 str r0, [r7, #4]
  60565. 8018b7c: 6039 str r1, [r7, #0]
  60566. const u8_t *pb = (const u8_t *)dataptr;
  60567. 8018b7e: 687b ldr r3, [r7, #4]
  60568. 8018b80: 61fb str r3, [r7, #28]
  60569. const u16_t *ps;
  60570. u16_t t = 0;
  60571. 8018b82: 2300 movs r3, #0
  60572. 8018b84: 81fb strh r3, [r7, #14]
  60573. u32_t sum = 0;
  60574. 8018b86: 2300 movs r3, #0
  60575. 8018b88: 617b str r3, [r7, #20]
  60576. int odd = ((mem_ptr_t)pb & 1);
  60577. 8018b8a: 69fb ldr r3, [r7, #28]
  60578. 8018b8c: f003 0301 and.w r3, r3, #1
  60579. 8018b90: 613b str r3, [r7, #16]
  60580. /* Get aligned to u16_t */
  60581. if (odd && len > 0) {
  60582. 8018b92: 693b ldr r3, [r7, #16]
  60583. 8018b94: 2b00 cmp r3, #0
  60584. 8018b96: d00d beq.n 8018bb4 <lwip_standard_chksum+0x40>
  60585. 8018b98: 683b ldr r3, [r7, #0]
  60586. 8018b9a: 2b00 cmp r3, #0
  60587. 8018b9c: dd0a ble.n 8018bb4 <lwip_standard_chksum+0x40>
  60588. ((u8_t *)&t)[1] = *pb++;
  60589. 8018b9e: 69fa ldr r2, [r7, #28]
  60590. 8018ba0: 1c53 adds r3, r2, #1
  60591. 8018ba2: 61fb str r3, [r7, #28]
  60592. 8018ba4: f107 030e add.w r3, r7, #14
  60593. 8018ba8: 3301 adds r3, #1
  60594. 8018baa: 7812 ldrb r2, [r2, #0]
  60595. 8018bac: 701a strb r2, [r3, #0]
  60596. len--;
  60597. 8018bae: 683b ldr r3, [r7, #0]
  60598. 8018bb0: 3b01 subs r3, #1
  60599. 8018bb2: 603b str r3, [r7, #0]
  60600. }
  60601. /* Add the bulk of the data */
  60602. ps = (const u16_t *)(const void *)pb;
  60603. 8018bb4: 69fb ldr r3, [r7, #28]
  60604. 8018bb6: 61bb str r3, [r7, #24]
  60605. while (len > 1) {
  60606. 8018bb8: e00a b.n 8018bd0 <lwip_standard_chksum+0x5c>
  60607. sum += *ps++;
  60608. 8018bba: 69bb ldr r3, [r7, #24]
  60609. 8018bbc: 1c9a adds r2, r3, #2
  60610. 8018bbe: 61ba str r2, [r7, #24]
  60611. 8018bc0: 881b ldrh r3, [r3, #0]
  60612. 8018bc2: 461a mov r2, r3
  60613. 8018bc4: 697b ldr r3, [r7, #20]
  60614. 8018bc6: 4413 add r3, r2
  60615. 8018bc8: 617b str r3, [r7, #20]
  60616. len -= 2;
  60617. 8018bca: 683b ldr r3, [r7, #0]
  60618. 8018bcc: 3b02 subs r3, #2
  60619. 8018bce: 603b str r3, [r7, #0]
  60620. while (len > 1) {
  60621. 8018bd0: 683b ldr r3, [r7, #0]
  60622. 8018bd2: 2b01 cmp r3, #1
  60623. 8018bd4: dcf1 bgt.n 8018bba <lwip_standard_chksum+0x46>
  60624. }
  60625. /* Consume left-over byte, if any */
  60626. if (len > 0) {
  60627. 8018bd6: 683b ldr r3, [r7, #0]
  60628. 8018bd8: 2b00 cmp r3, #0
  60629. 8018bda: dd04 ble.n 8018be6 <lwip_standard_chksum+0x72>
  60630. ((u8_t *)&t)[0] = *(const u8_t *)ps;
  60631. 8018bdc: f107 030e add.w r3, r7, #14
  60632. 8018be0: 69ba ldr r2, [r7, #24]
  60633. 8018be2: 7812 ldrb r2, [r2, #0]
  60634. 8018be4: 701a strb r2, [r3, #0]
  60635. }
  60636. /* Add end bytes */
  60637. sum += t;
  60638. 8018be6: 89fb ldrh r3, [r7, #14]
  60639. 8018be8: 461a mov r2, r3
  60640. 8018bea: 697b ldr r3, [r7, #20]
  60641. 8018bec: 4413 add r3, r2
  60642. 8018bee: 617b str r3, [r7, #20]
  60643. /* Fold 32-bit sum to 16 bits
  60644. calling this twice is probably faster than if statements... */
  60645. sum = FOLD_U32T(sum);
  60646. 8018bf0: 697b ldr r3, [r7, #20]
  60647. 8018bf2: 0c1a lsrs r2, r3, #16
  60648. 8018bf4: 697b ldr r3, [r7, #20]
  60649. 8018bf6: b29b uxth r3, r3
  60650. 8018bf8: 4413 add r3, r2
  60651. 8018bfa: 617b str r3, [r7, #20]
  60652. sum = FOLD_U32T(sum);
  60653. 8018bfc: 697b ldr r3, [r7, #20]
  60654. 8018bfe: 0c1a lsrs r2, r3, #16
  60655. 8018c00: 697b ldr r3, [r7, #20]
  60656. 8018c02: b29b uxth r3, r3
  60657. 8018c04: 4413 add r3, r2
  60658. 8018c06: 617b str r3, [r7, #20]
  60659. /* Swap if alignment was odd */
  60660. if (odd) {
  60661. 8018c08: 693b ldr r3, [r7, #16]
  60662. 8018c0a: 2b00 cmp r3, #0
  60663. 8018c0c: d007 beq.n 8018c1e <lwip_standard_chksum+0xaa>
  60664. sum = SWAP_BYTES_IN_WORD(sum);
  60665. 8018c0e: 697b ldr r3, [r7, #20]
  60666. 8018c10: 021b lsls r3, r3, #8
  60667. 8018c12: b29a uxth r2, r3
  60668. 8018c14: 697b ldr r3, [r7, #20]
  60669. 8018c16: 0a1b lsrs r3, r3, #8
  60670. 8018c18: b2db uxtb r3, r3
  60671. 8018c1a: 4313 orrs r3, r2
  60672. 8018c1c: 617b str r3, [r7, #20]
  60673. }
  60674. return (u16_t)sum;
  60675. 8018c1e: 697b ldr r3, [r7, #20]
  60676. 8018c20: b29b uxth r3, r3
  60677. }
  60678. 8018c22: 4618 mov r0, r3
  60679. 8018c24: 3724 adds r7, #36 @ 0x24
  60680. 8018c26: 46bd mov sp, r7
  60681. 8018c28: f85d 7b04 ldr.w r7, [sp], #4
  60682. 8018c2c: 4770 bx lr
  60683. 08018c2e <inet_chksum>:
  60684. * @return checksum (as u16_t) to be saved directly in the protocol header
  60685. */
  60686. u16_t
  60687. inet_chksum(const void *dataptr, u16_t len)
  60688. {
  60689. 8018c2e: b580 push {r7, lr}
  60690. 8018c30: b082 sub sp, #8
  60691. 8018c32: af00 add r7, sp, #0
  60692. 8018c34: 6078 str r0, [r7, #4]
  60693. 8018c36: 460b mov r3, r1
  60694. 8018c38: 807b strh r3, [r7, #2]
  60695. return (u16_t)~(unsigned int)LWIP_CHKSUM(dataptr, len);
  60696. 8018c3a: 887b ldrh r3, [r7, #2]
  60697. 8018c3c: 4619 mov r1, r3
  60698. 8018c3e: 6878 ldr r0, [r7, #4]
  60699. 8018c40: f7ff ff98 bl 8018b74 <lwip_standard_chksum>
  60700. 8018c44: 4603 mov r3, r0
  60701. 8018c46: 43db mvns r3, r3
  60702. 8018c48: b29b uxth r3, r3
  60703. }
  60704. 8018c4a: 4618 mov r0, r3
  60705. 8018c4c: 3708 adds r7, #8
  60706. 8018c4e: 46bd mov sp, r7
  60707. 8018c50: bd80 pop {r7, pc}
  60708. 08018c52 <inet_chksum_pbuf>:
  60709. * @param p pbuf chain over that the checksum should be calculated
  60710. * @return checksum (as u16_t) to be saved directly in the protocol header
  60711. */
  60712. u16_t
  60713. inet_chksum_pbuf(struct pbuf *p)
  60714. {
  60715. 8018c52: b580 push {r7, lr}
  60716. 8018c54: b086 sub sp, #24
  60717. 8018c56: af00 add r7, sp, #0
  60718. 8018c58: 6078 str r0, [r7, #4]
  60719. u32_t acc;
  60720. struct pbuf *q;
  60721. int swapped = 0;
  60722. 8018c5a: 2300 movs r3, #0
  60723. 8018c5c: 60fb str r3, [r7, #12]
  60724. acc = 0;
  60725. 8018c5e: 2300 movs r3, #0
  60726. 8018c60: 617b str r3, [r7, #20]
  60727. for (q = p; q != NULL; q = q->next) {
  60728. 8018c62: 687b ldr r3, [r7, #4]
  60729. 8018c64: 613b str r3, [r7, #16]
  60730. 8018c66: e02b b.n 8018cc0 <inet_chksum_pbuf+0x6e>
  60731. acc += LWIP_CHKSUM(q->payload, q->len);
  60732. 8018c68: 693b ldr r3, [r7, #16]
  60733. 8018c6a: 685a ldr r2, [r3, #4]
  60734. 8018c6c: 693b ldr r3, [r7, #16]
  60735. 8018c6e: 895b ldrh r3, [r3, #10]
  60736. 8018c70: 4619 mov r1, r3
  60737. 8018c72: 4610 mov r0, r2
  60738. 8018c74: f7ff ff7e bl 8018b74 <lwip_standard_chksum>
  60739. 8018c78: 4603 mov r3, r0
  60740. 8018c7a: 461a mov r2, r3
  60741. 8018c7c: 697b ldr r3, [r7, #20]
  60742. 8018c7e: 4413 add r3, r2
  60743. 8018c80: 617b str r3, [r7, #20]
  60744. acc = FOLD_U32T(acc);
  60745. 8018c82: 697b ldr r3, [r7, #20]
  60746. 8018c84: 0c1a lsrs r2, r3, #16
  60747. 8018c86: 697b ldr r3, [r7, #20]
  60748. 8018c88: b29b uxth r3, r3
  60749. 8018c8a: 4413 add r3, r2
  60750. 8018c8c: 617b str r3, [r7, #20]
  60751. if (q->len % 2 != 0) {
  60752. 8018c8e: 693b ldr r3, [r7, #16]
  60753. 8018c90: 895b ldrh r3, [r3, #10]
  60754. 8018c92: f003 0301 and.w r3, r3, #1
  60755. 8018c96: b29b uxth r3, r3
  60756. 8018c98: 2b00 cmp r3, #0
  60757. 8018c9a: d00e beq.n 8018cba <inet_chksum_pbuf+0x68>
  60758. swapped = !swapped;
  60759. 8018c9c: 68fb ldr r3, [r7, #12]
  60760. 8018c9e: 2b00 cmp r3, #0
  60761. 8018ca0: bf0c ite eq
  60762. 8018ca2: 2301 moveq r3, #1
  60763. 8018ca4: 2300 movne r3, #0
  60764. 8018ca6: b2db uxtb r3, r3
  60765. 8018ca8: 60fb str r3, [r7, #12]
  60766. acc = SWAP_BYTES_IN_WORD(acc);
  60767. 8018caa: 697b ldr r3, [r7, #20]
  60768. 8018cac: 021b lsls r3, r3, #8
  60769. 8018cae: b29a uxth r2, r3
  60770. 8018cb0: 697b ldr r3, [r7, #20]
  60771. 8018cb2: 0a1b lsrs r3, r3, #8
  60772. 8018cb4: b2db uxtb r3, r3
  60773. 8018cb6: 4313 orrs r3, r2
  60774. 8018cb8: 617b str r3, [r7, #20]
  60775. for (q = p; q != NULL; q = q->next) {
  60776. 8018cba: 693b ldr r3, [r7, #16]
  60777. 8018cbc: 681b ldr r3, [r3, #0]
  60778. 8018cbe: 613b str r3, [r7, #16]
  60779. 8018cc0: 693b ldr r3, [r7, #16]
  60780. 8018cc2: 2b00 cmp r3, #0
  60781. 8018cc4: d1d0 bne.n 8018c68 <inet_chksum_pbuf+0x16>
  60782. }
  60783. }
  60784. if (swapped) {
  60785. 8018cc6: 68fb ldr r3, [r7, #12]
  60786. 8018cc8: 2b00 cmp r3, #0
  60787. 8018cca: d007 beq.n 8018cdc <inet_chksum_pbuf+0x8a>
  60788. acc = SWAP_BYTES_IN_WORD(acc);
  60789. 8018ccc: 697b ldr r3, [r7, #20]
  60790. 8018cce: 021b lsls r3, r3, #8
  60791. 8018cd0: b29a uxth r2, r3
  60792. 8018cd2: 697b ldr r3, [r7, #20]
  60793. 8018cd4: 0a1b lsrs r3, r3, #8
  60794. 8018cd6: b2db uxtb r3, r3
  60795. 8018cd8: 4313 orrs r3, r2
  60796. 8018cda: 617b str r3, [r7, #20]
  60797. }
  60798. return (u16_t)~(acc & 0xffffUL);
  60799. 8018cdc: 697b ldr r3, [r7, #20]
  60800. 8018cde: b29b uxth r3, r3
  60801. 8018ce0: 43db mvns r3, r3
  60802. 8018ce2: b29b uxth r3, r3
  60803. }
  60804. 8018ce4: 4618 mov r0, r3
  60805. 8018ce6: 3718 adds r7, #24
  60806. 8018ce8: 46bd mov sp, r7
  60807. 8018cea: bd80 pop {r7, pc}
  60808. 08018cec <lwip_init>:
  60809. * Initialize all modules.
  60810. * Use this in NO_SYS mode. Use tcpip_init() otherwise.
  60811. */
  60812. void
  60813. lwip_init(void)
  60814. {
  60815. 8018cec: b580 push {r7, lr}
  60816. 8018cee: b082 sub sp, #8
  60817. 8018cf0: af00 add r7, sp, #0
  60818. #ifndef LWIP_SKIP_CONST_CHECK
  60819. int a = 0;
  60820. 8018cf2: 2300 movs r3, #0
  60821. 8018cf4: 607b str r3, [r7, #4]
  60822. #endif
  60823. /* Modules initialization */
  60824. stats_init();
  60825. #if !NO_SYS
  60826. sys_init();
  60827. 8018cf6: f00d fb75 bl 80263e4 <sys_init>
  60828. #endif /* !NO_SYS */
  60829. mem_init();
  60830. 8018cfa: f000 f8d3 bl 8018ea4 <mem_init>
  60831. memp_init();
  60832. 8018cfe: f000 fc1b bl 8019538 <memp_init>
  60833. pbuf_init();
  60834. netif_init();
  60835. 8018d02: f000 fd27 bl 8019754 <netif_init>
  60836. #endif /* LWIP_IPV4 */
  60837. #if LWIP_RAW
  60838. raw_init();
  60839. #endif /* LWIP_RAW */
  60840. #if LWIP_UDP
  60841. udp_init();
  60842. 8018d06: f008 f8db bl 8020ec0 <udp_init>
  60843. #endif /* LWIP_UDP */
  60844. #if LWIP_TCP
  60845. tcp_init();
  60846. 8018d0a: f001 fe91 bl 801aa30 <tcp_init>
  60847. #if PPP_SUPPORT
  60848. ppp_init();
  60849. #endif
  60850. #if LWIP_TIMERS
  60851. sys_timeouts_init();
  60852. 8018d0e: f008 f817 bl 8020d40 <sys_timeouts_init>
  60853. #endif /* LWIP_TIMERS */
  60854. }
  60855. 8018d12: bf00 nop
  60856. 8018d14: 3708 adds r7, #8
  60857. 8018d16: 46bd mov sp, r7
  60858. 8018d18: bd80 pop {r7, pc}
  60859. ...
  60860. 08018d1c <ptr_to_mem>:
  60861. #define mem_overflow_check_element(mem)
  60862. #endif /* MEM_OVERFLOW_CHECK */
  60863. static struct mem *
  60864. ptr_to_mem(mem_size_t ptr)
  60865. {
  60866. 8018d1c: b480 push {r7}
  60867. 8018d1e: b083 sub sp, #12
  60868. 8018d20: af00 add r7, sp, #0
  60869. 8018d22: 6078 str r0, [r7, #4]
  60870. return (struct mem *)(void *)&ram[ptr];
  60871. 8018d24: 4b04 ldr r3, [pc, #16] @ (8018d38 <ptr_to_mem+0x1c>)
  60872. 8018d26: 681a ldr r2, [r3, #0]
  60873. 8018d28: 687b ldr r3, [r7, #4]
  60874. 8018d2a: 4413 add r3, r2
  60875. }
  60876. 8018d2c: 4618 mov r0, r3
  60877. 8018d2e: 370c adds r7, #12
  60878. 8018d30: 46bd mov sp, r7
  60879. 8018d32: f85d 7b04 ldr.w r7, [sp], #4
  60880. 8018d36: 4770 bx lr
  60881. 8018d38: 24024350 .word 0x24024350
  60882. 08018d3c <mem_to_ptr>:
  60883. static mem_size_t
  60884. mem_to_ptr(void *mem)
  60885. {
  60886. 8018d3c: b480 push {r7}
  60887. 8018d3e: b083 sub sp, #12
  60888. 8018d40: af00 add r7, sp, #0
  60889. 8018d42: 6078 str r0, [r7, #4]
  60890. return (mem_size_t)((u8_t *)mem - ram);
  60891. 8018d44: 4b04 ldr r3, [pc, #16] @ (8018d58 <mem_to_ptr+0x1c>)
  60892. 8018d46: 681b ldr r3, [r3, #0]
  60893. 8018d48: 687a ldr r2, [r7, #4]
  60894. 8018d4a: 1ad3 subs r3, r2, r3
  60895. }
  60896. 8018d4c: 4618 mov r0, r3
  60897. 8018d4e: 370c adds r7, #12
  60898. 8018d50: 46bd mov sp, r7
  60899. 8018d52: f85d 7b04 ldr.w r7, [sp], #4
  60900. 8018d56: 4770 bx lr
  60901. 8018d58: 24024350 .word 0x24024350
  60902. 08018d5c <plug_holes>:
  60903. * This assumes access to the heap is protected by the calling function
  60904. * already.
  60905. */
  60906. static void
  60907. plug_holes(struct mem *mem)
  60908. {
  60909. 8018d5c: b590 push {r4, r7, lr}
  60910. 8018d5e: b085 sub sp, #20
  60911. 8018d60: af00 add r7, sp, #0
  60912. 8018d62: 6078 str r0, [r7, #4]
  60913. struct mem *nmem;
  60914. struct mem *pmem;
  60915. LWIP_ASSERT("plug_holes: mem >= ram", (u8_t *)mem >= ram);
  60916. 8018d64: 4b45 ldr r3, [pc, #276] @ (8018e7c <plug_holes+0x120>)
  60917. 8018d66: 681b ldr r3, [r3, #0]
  60918. 8018d68: 687a ldr r2, [r7, #4]
  60919. 8018d6a: 429a cmp r2, r3
  60920. 8018d6c: d206 bcs.n 8018d7c <plug_holes+0x20>
  60921. 8018d6e: 4b44 ldr r3, [pc, #272] @ (8018e80 <plug_holes+0x124>)
  60922. 8018d70: f240 12df movw r2, #479 @ 0x1df
  60923. 8018d74: 4943 ldr r1, [pc, #268] @ (8018e84 <plug_holes+0x128>)
  60924. 8018d76: 4844 ldr r0, [pc, #272] @ (8018e88 <plug_holes+0x12c>)
  60925. 8018d78: f010 fe28 bl 80299cc <iprintf>
  60926. LWIP_ASSERT("plug_holes: mem < ram_end", (u8_t *)mem < (u8_t *)ram_end);
  60927. 8018d7c: 4b43 ldr r3, [pc, #268] @ (8018e8c <plug_holes+0x130>)
  60928. 8018d7e: 681b ldr r3, [r3, #0]
  60929. 8018d80: 687a ldr r2, [r7, #4]
  60930. 8018d82: 429a cmp r2, r3
  60931. 8018d84: d306 bcc.n 8018d94 <plug_holes+0x38>
  60932. 8018d86: 4b3e ldr r3, [pc, #248] @ (8018e80 <plug_holes+0x124>)
  60933. 8018d88: f44f 72f0 mov.w r2, #480 @ 0x1e0
  60934. 8018d8c: 4940 ldr r1, [pc, #256] @ (8018e90 <plug_holes+0x134>)
  60935. 8018d8e: 483e ldr r0, [pc, #248] @ (8018e88 <plug_holes+0x12c>)
  60936. 8018d90: f010 fe1c bl 80299cc <iprintf>
  60937. LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0);
  60938. 8018d94: 687b ldr r3, [r7, #4]
  60939. 8018d96: 7a1b ldrb r3, [r3, #8]
  60940. 8018d98: 2b00 cmp r3, #0
  60941. 8018d9a: d006 beq.n 8018daa <plug_holes+0x4e>
  60942. 8018d9c: 4b38 ldr r3, [pc, #224] @ (8018e80 <plug_holes+0x124>)
  60943. 8018d9e: f240 12e1 movw r2, #481 @ 0x1e1
  60944. 8018da2: 493c ldr r1, [pc, #240] @ (8018e94 <plug_holes+0x138>)
  60945. 8018da4: 4838 ldr r0, [pc, #224] @ (8018e88 <plug_holes+0x12c>)
  60946. 8018da6: f010 fe11 bl 80299cc <iprintf>
  60947. /* plug hole forward */
  60948. LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED);
  60949. 8018daa: 687b ldr r3, [r7, #4]
  60950. 8018dac: 681b ldr r3, [r3, #0]
  60951. 8018dae: 4a3a ldr r2, [pc, #232] @ (8018e98 <plug_holes+0x13c>)
  60952. 8018db0: 4293 cmp r3, r2
  60953. 8018db2: d906 bls.n 8018dc2 <plug_holes+0x66>
  60954. 8018db4: 4b32 ldr r3, [pc, #200] @ (8018e80 <plug_holes+0x124>)
  60955. 8018db6: f44f 72f2 mov.w r2, #484 @ 0x1e4
  60956. 8018dba: 4938 ldr r1, [pc, #224] @ (8018e9c <plug_holes+0x140>)
  60957. 8018dbc: 4832 ldr r0, [pc, #200] @ (8018e88 <plug_holes+0x12c>)
  60958. 8018dbe: f010 fe05 bl 80299cc <iprintf>
  60959. nmem = ptr_to_mem(mem->next);
  60960. 8018dc2: 687b ldr r3, [r7, #4]
  60961. 8018dc4: 681b ldr r3, [r3, #0]
  60962. 8018dc6: 4618 mov r0, r3
  60963. 8018dc8: f7ff ffa8 bl 8018d1c <ptr_to_mem>
  60964. 8018dcc: 60f8 str r0, [r7, #12]
  60965. if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {
  60966. 8018dce: 687a ldr r2, [r7, #4]
  60967. 8018dd0: 68fb ldr r3, [r7, #12]
  60968. 8018dd2: 429a cmp r2, r3
  60969. 8018dd4: d024 beq.n 8018e20 <plug_holes+0xc4>
  60970. 8018dd6: 68fb ldr r3, [r7, #12]
  60971. 8018dd8: 7a1b ldrb r3, [r3, #8]
  60972. 8018dda: 2b00 cmp r3, #0
  60973. 8018ddc: d120 bne.n 8018e20 <plug_holes+0xc4>
  60974. 8018dde: 4b2b ldr r3, [pc, #172] @ (8018e8c <plug_holes+0x130>)
  60975. 8018de0: 681b ldr r3, [r3, #0]
  60976. 8018de2: 68fa ldr r2, [r7, #12]
  60977. 8018de4: 429a cmp r2, r3
  60978. 8018de6: d01b beq.n 8018e20 <plug_holes+0xc4>
  60979. /* if mem->next is unused and not end of ram, combine mem and mem->next */
  60980. if (lfree == nmem) {
  60981. 8018de8: 4b2d ldr r3, [pc, #180] @ (8018ea0 <plug_holes+0x144>)
  60982. 8018dea: 681b ldr r3, [r3, #0]
  60983. 8018dec: 68fa ldr r2, [r7, #12]
  60984. 8018dee: 429a cmp r2, r3
  60985. 8018df0: d102 bne.n 8018df8 <plug_holes+0x9c>
  60986. lfree = mem;
  60987. 8018df2: 4a2b ldr r2, [pc, #172] @ (8018ea0 <plug_holes+0x144>)
  60988. 8018df4: 687b ldr r3, [r7, #4]
  60989. 8018df6: 6013 str r3, [r2, #0]
  60990. }
  60991. mem->next = nmem->next;
  60992. 8018df8: 68fb ldr r3, [r7, #12]
  60993. 8018dfa: 681a ldr r2, [r3, #0]
  60994. 8018dfc: 687b ldr r3, [r7, #4]
  60995. 8018dfe: 601a str r2, [r3, #0]
  60996. if (nmem->next != MEM_SIZE_ALIGNED) {
  60997. 8018e00: 68fb ldr r3, [r7, #12]
  60998. 8018e02: 681b ldr r3, [r3, #0]
  60999. 8018e04: 4a24 ldr r2, [pc, #144] @ (8018e98 <plug_holes+0x13c>)
  61000. 8018e06: 4293 cmp r3, r2
  61001. 8018e08: d00a beq.n 8018e20 <plug_holes+0xc4>
  61002. ptr_to_mem(nmem->next)->prev = mem_to_ptr(mem);
  61003. 8018e0a: 68fb ldr r3, [r7, #12]
  61004. 8018e0c: 681b ldr r3, [r3, #0]
  61005. 8018e0e: 4618 mov r0, r3
  61006. 8018e10: f7ff ff84 bl 8018d1c <ptr_to_mem>
  61007. 8018e14: 4604 mov r4, r0
  61008. 8018e16: 6878 ldr r0, [r7, #4]
  61009. 8018e18: f7ff ff90 bl 8018d3c <mem_to_ptr>
  61010. 8018e1c: 4603 mov r3, r0
  61011. 8018e1e: 6063 str r3, [r4, #4]
  61012. }
  61013. }
  61014. /* plug hole backward */
  61015. pmem = ptr_to_mem(mem->prev);
  61016. 8018e20: 687b ldr r3, [r7, #4]
  61017. 8018e22: 685b ldr r3, [r3, #4]
  61018. 8018e24: 4618 mov r0, r3
  61019. 8018e26: f7ff ff79 bl 8018d1c <ptr_to_mem>
  61020. 8018e2a: 60b8 str r0, [r7, #8]
  61021. if (pmem != mem && pmem->used == 0) {
  61022. 8018e2c: 68ba ldr r2, [r7, #8]
  61023. 8018e2e: 687b ldr r3, [r7, #4]
  61024. 8018e30: 429a cmp r2, r3
  61025. 8018e32: d01f beq.n 8018e74 <plug_holes+0x118>
  61026. 8018e34: 68bb ldr r3, [r7, #8]
  61027. 8018e36: 7a1b ldrb r3, [r3, #8]
  61028. 8018e38: 2b00 cmp r3, #0
  61029. 8018e3a: d11b bne.n 8018e74 <plug_holes+0x118>
  61030. /* if mem->prev is unused, combine mem and mem->prev */
  61031. if (lfree == mem) {
  61032. 8018e3c: 4b18 ldr r3, [pc, #96] @ (8018ea0 <plug_holes+0x144>)
  61033. 8018e3e: 681b ldr r3, [r3, #0]
  61034. 8018e40: 687a ldr r2, [r7, #4]
  61035. 8018e42: 429a cmp r2, r3
  61036. 8018e44: d102 bne.n 8018e4c <plug_holes+0xf0>
  61037. lfree = pmem;
  61038. 8018e46: 4a16 ldr r2, [pc, #88] @ (8018ea0 <plug_holes+0x144>)
  61039. 8018e48: 68bb ldr r3, [r7, #8]
  61040. 8018e4a: 6013 str r3, [r2, #0]
  61041. }
  61042. pmem->next = mem->next;
  61043. 8018e4c: 687b ldr r3, [r7, #4]
  61044. 8018e4e: 681a ldr r2, [r3, #0]
  61045. 8018e50: 68bb ldr r3, [r7, #8]
  61046. 8018e52: 601a str r2, [r3, #0]
  61047. if (mem->next != MEM_SIZE_ALIGNED) {
  61048. 8018e54: 687b ldr r3, [r7, #4]
  61049. 8018e56: 681b ldr r3, [r3, #0]
  61050. 8018e58: 4a0f ldr r2, [pc, #60] @ (8018e98 <plug_holes+0x13c>)
  61051. 8018e5a: 4293 cmp r3, r2
  61052. 8018e5c: d00a beq.n 8018e74 <plug_holes+0x118>
  61053. ptr_to_mem(mem->next)->prev = mem_to_ptr(pmem);
  61054. 8018e5e: 687b ldr r3, [r7, #4]
  61055. 8018e60: 681b ldr r3, [r3, #0]
  61056. 8018e62: 4618 mov r0, r3
  61057. 8018e64: f7ff ff5a bl 8018d1c <ptr_to_mem>
  61058. 8018e68: 4604 mov r4, r0
  61059. 8018e6a: 68b8 ldr r0, [r7, #8]
  61060. 8018e6c: f7ff ff66 bl 8018d3c <mem_to_ptr>
  61061. 8018e70: 4603 mov r3, r0
  61062. 8018e72: 6063 str r3, [r4, #4]
  61063. }
  61064. }
  61065. }
  61066. 8018e74: bf00 nop
  61067. 8018e76: 3714 adds r7, #20
  61068. 8018e78: 46bd mov sp, r7
  61069. 8018e7a: bd90 pop {r4, r7, pc}
  61070. 8018e7c: 24024350 .word 0x24024350
  61071. 8018e80: 0802da7c .word 0x0802da7c
  61072. 8018e84: 0802daac .word 0x0802daac
  61073. 8018e88: 0802dac4 .word 0x0802dac4
  61074. 8018e8c: 24024354 .word 0x24024354
  61075. 8018e90: 0802daec .word 0x0802daec
  61076. 8018e94: 0802db08 .word 0x0802db08
  61077. 8018e98: 0001ffe8 .word 0x0001ffe8
  61078. 8018e9c: 0802db24 .word 0x0802db24
  61079. 8018ea0: 2402435c .word 0x2402435c
  61080. 08018ea4 <mem_init>:
  61081. /**
  61082. * Zero the heap and initialize start, end and lowest-free
  61083. */
  61084. void
  61085. mem_init(void)
  61086. {
  61087. 8018ea4: b580 push {r7, lr}
  61088. 8018ea6: b082 sub sp, #8
  61089. 8018ea8: af00 add r7, sp, #0
  61090. LWIP_ASSERT("Sanity check alignment",
  61091. (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT - 1)) == 0);
  61092. /* align the heap */
  61093. ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
  61094. 8018eaa: 4b1b ldr r3, [pc, #108] @ (8018f18 <mem_init+0x74>)
  61095. 8018eac: 4a1b ldr r2, [pc, #108] @ (8018f1c <mem_init+0x78>)
  61096. 8018eae: 601a str r2, [r3, #0]
  61097. /* initialize the start of the heap */
  61098. mem = (struct mem *)(void *)ram;
  61099. 8018eb0: 4b19 ldr r3, [pc, #100] @ (8018f18 <mem_init+0x74>)
  61100. 8018eb2: 681b ldr r3, [r3, #0]
  61101. 8018eb4: 607b str r3, [r7, #4]
  61102. mem->next = MEM_SIZE_ALIGNED;
  61103. 8018eb6: 687b ldr r3, [r7, #4]
  61104. 8018eb8: 4a19 ldr r2, [pc, #100] @ (8018f20 <mem_init+0x7c>)
  61105. 8018eba: 601a str r2, [r3, #0]
  61106. mem->prev = 0;
  61107. 8018ebc: 687b ldr r3, [r7, #4]
  61108. 8018ebe: 2200 movs r2, #0
  61109. 8018ec0: 605a str r2, [r3, #4]
  61110. mem->used = 0;
  61111. 8018ec2: 687b ldr r3, [r7, #4]
  61112. 8018ec4: 2200 movs r2, #0
  61113. 8018ec6: 721a strb r2, [r3, #8]
  61114. /* initialize the end of the heap */
  61115. ram_end = ptr_to_mem(MEM_SIZE_ALIGNED);
  61116. 8018ec8: 4815 ldr r0, [pc, #84] @ (8018f20 <mem_init+0x7c>)
  61117. 8018eca: f7ff ff27 bl 8018d1c <ptr_to_mem>
  61118. 8018ece: 4603 mov r3, r0
  61119. 8018ed0: 4a14 ldr r2, [pc, #80] @ (8018f24 <mem_init+0x80>)
  61120. 8018ed2: 6013 str r3, [r2, #0]
  61121. ram_end->used = 1;
  61122. 8018ed4: 4b13 ldr r3, [pc, #76] @ (8018f24 <mem_init+0x80>)
  61123. 8018ed6: 681b ldr r3, [r3, #0]
  61124. 8018ed8: 2201 movs r2, #1
  61125. 8018eda: 721a strb r2, [r3, #8]
  61126. ram_end->next = MEM_SIZE_ALIGNED;
  61127. 8018edc: 4b11 ldr r3, [pc, #68] @ (8018f24 <mem_init+0x80>)
  61128. 8018ede: 681b ldr r3, [r3, #0]
  61129. 8018ee0: 4a0f ldr r2, [pc, #60] @ (8018f20 <mem_init+0x7c>)
  61130. 8018ee2: 601a str r2, [r3, #0]
  61131. ram_end->prev = MEM_SIZE_ALIGNED;
  61132. 8018ee4: 4b0f ldr r3, [pc, #60] @ (8018f24 <mem_init+0x80>)
  61133. 8018ee6: 681b ldr r3, [r3, #0]
  61134. 8018ee8: 4a0d ldr r2, [pc, #52] @ (8018f20 <mem_init+0x7c>)
  61135. 8018eea: 605a str r2, [r3, #4]
  61136. MEM_SANITY();
  61137. /* initialize the lowest-free pointer to the start of the heap */
  61138. lfree = (struct mem *)(void *)ram;
  61139. 8018eec: 4b0a ldr r3, [pc, #40] @ (8018f18 <mem_init+0x74>)
  61140. 8018eee: 681b ldr r3, [r3, #0]
  61141. 8018ef0: 4a0d ldr r2, [pc, #52] @ (8018f28 <mem_init+0x84>)
  61142. 8018ef2: 6013 str r3, [r2, #0]
  61143. MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
  61144. if (sys_mutex_new(&mem_mutex) != ERR_OK) {
  61145. 8018ef4: 480d ldr r0, [pc, #52] @ (8018f2c <mem_init+0x88>)
  61146. 8018ef6: f00d fa81 bl 80263fc <sys_mutex_new>
  61147. 8018efa: 4603 mov r3, r0
  61148. 8018efc: 2b00 cmp r3, #0
  61149. 8018efe: d006 beq.n 8018f0e <mem_init+0x6a>
  61150. LWIP_ASSERT("failed to create mem_mutex", 0);
  61151. 8018f00: 4b0b ldr r3, [pc, #44] @ (8018f30 <mem_init+0x8c>)
  61152. 8018f02: f240 221f movw r2, #543 @ 0x21f
  61153. 8018f06: 490b ldr r1, [pc, #44] @ (8018f34 <mem_init+0x90>)
  61154. 8018f08: 480b ldr r0, [pc, #44] @ (8018f38 <mem_init+0x94>)
  61155. 8018f0a: f010 fd5f bl 80299cc <iprintf>
  61156. }
  61157. }
  61158. 8018f0e: bf00 nop
  61159. 8018f10: 3708 adds r7, #8
  61160. 8018f12: 46bd mov sp, r7
  61161. 8018f14: bd80 pop {r7, pc}
  61162. 8018f16: bf00 nop
  61163. 8018f18: 24024350 .word 0x24024350
  61164. 8018f1c: 24020000 .word 0x24020000
  61165. 8018f20: 0001ffe8 .word 0x0001ffe8
  61166. 8018f24: 24024354 .word 0x24024354
  61167. 8018f28: 2402435c .word 0x2402435c
  61168. 8018f2c: 24024358 .word 0x24024358
  61169. 8018f30: 0802da7c .word 0x0802da7c
  61170. 8018f34: 0802db50 .word 0x0802db50
  61171. 8018f38: 0802dac4 .word 0x0802dac4
  61172. 08018f3c <mem_link_valid>:
  61173. /* Check if a struct mem is correctly linked.
  61174. * If not, double-free is a possible reason.
  61175. */
  61176. static int
  61177. mem_link_valid(struct mem *mem)
  61178. {
  61179. 8018f3c: b580 push {r7, lr}
  61180. 8018f3e: b086 sub sp, #24
  61181. 8018f40: af00 add r7, sp, #0
  61182. 8018f42: 6078 str r0, [r7, #4]
  61183. struct mem *nmem, *pmem;
  61184. mem_size_t rmem_idx;
  61185. rmem_idx = mem_to_ptr(mem);
  61186. 8018f44: 6878 ldr r0, [r7, #4]
  61187. 8018f46: f7ff fef9 bl 8018d3c <mem_to_ptr>
  61188. 8018f4a: 6178 str r0, [r7, #20]
  61189. nmem = ptr_to_mem(mem->next);
  61190. 8018f4c: 687b ldr r3, [r7, #4]
  61191. 8018f4e: 681b ldr r3, [r3, #0]
  61192. 8018f50: 4618 mov r0, r3
  61193. 8018f52: f7ff fee3 bl 8018d1c <ptr_to_mem>
  61194. 8018f56: 6138 str r0, [r7, #16]
  61195. pmem = ptr_to_mem(mem->prev);
  61196. 8018f58: 687b ldr r3, [r7, #4]
  61197. 8018f5a: 685b ldr r3, [r3, #4]
  61198. 8018f5c: 4618 mov r0, r3
  61199. 8018f5e: f7ff fedd bl 8018d1c <ptr_to_mem>
  61200. 8018f62: 60f8 str r0, [r7, #12]
  61201. if ((mem->next > MEM_SIZE_ALIGNED) || (mem->prev > MEM_SIZE_ALIGNED) ||
  61202. 8018f64: 687b ldr r3, [r7, #4]
  61203. 8018f66: 681b ldr r3, [r3, #0]
  61204. 8018f68: 4a11 ldr r2, [pc, #68] @ (8018fb0 <mem_link_valid+0x74>)
  61205. 8018f6a: 4293 cmp r3, r2
  61206. 8018f6c: d818 bhi.n 8018fa0 <mem_link_valid+0x64>
  61207. 8018f6e: 687b ldr r3, [r7, #4]
  61208. 8018f70: 685b ldr r3, [r3, #4]
  61209. 8018f72: 4a0f ldr r2, [pc, #60] @ (8018fb0 <mem_link_valid+0x74>)
  61210. 8018f74: 4293 cmp r3, r2
  61211. 8018f76: d813 bhi.n 8018fa0 <mem_link_valid+0x64>
  61212. ((mem->prev != rmem_idx) && (pmem->next != rmem_idx)) ||
  61213. 8018f78: 687b ldr r3, [r7, #4]
  61214. 8018f7a: 685b ldr r3, [r3, #4]
  61215. if ((mem->next > MEM_SIZE_ALIGNED) || (mem->prev > MEM_SIZE_ALIGNED) ||
  61216. 8018f7c: 697a ldr r2, [r7, #20]
  61217. 8018f7e: 429a cmp r2, r3
  61218. 8018f80: d004 beq.n 8018f8c <mem_link_valid+0x50>
  61219. ((mem->prev != rmem_idx) && (pmem->next != rmem_idx)) ||
  61220. 8018f82: 68fb ldr r3, [r7, #12]
  61221. 8018f84: 681b ldr r3, [r3, #0]
  61222. 8018f86: 697a ldr r2, [r7, #20]
  61223. 8018f88: 429a cmp r2, r3
  61224. 8018f8a: d109 bne.n 8018fa0 <mem_link_valid+0x64>
  61225. ((nmem != ram_end) && (nmem->prev != rmem_idx))) {
  61226. 8018f8c: 4b09 ldr r3, [pc, #36] @ (8018fb4 <mem_link_valid+0x78>)
  61227. 8018f8e: 681b ldr r3, [r3, #0]
  61228. ((mem->prev != rmem_idx) && (pmem->next != rmem_idx)) ||
  61229. 8018f90: 693a ldr r2, [r7, #16]
  61230. 8018f92: 429a cmp r2, r3
  61231. 8018f94: d006 beq.n 8018fa4 <mem_link_valid+0x68>
  61232. ((nmem != ram_end) && (nmem->prev != rmem_idx))) {
  61233. 8018f96: 693b ldr r3, [r7, #16]
  61234. 8018f98: 685b ldr r3, [r3, #4]
  61235. 8018f9a: 697a ldr r2, [r7, #20]
  61236. 8018f9c: 429a cmp r2, r3
  61237. 8018f9e: d001 beq.n 8018fa4 <mem_link_valid+0x68>
  61238. return 0;
  61239. 8018fa0: 2300 movs r3, #0
  61240. 8018fa2: e000 b.n 8018fa6 <mem_link_valid+0x6a>
  61241. }
  61242. return 1;
  61243. 8018fa4: 2301 movs r3, #1
  61244. }
  61245. 8018fa6: 4618 mov r0, r3
  61246. 8018fa8: 3718 adds r7, #24
  61247. 8018faa: 46bd mov sp, r7
  61248. 8018fac: bd80 pop {r7, pc}
  61249. 8018fae: bf00 nop
  61250. 8018fb0: 0001ffe8 .word 0x0001ffe8
  61251. 8018fb4: 24024354 .word 0x24024354
  61252. 08018fb8 <mem_free>:
  61253. * @param rmem is the data portion of a struct mem as returned by a previous
  61254. * call to mem_malloc()
  61255. */
  61256. void
  61257. mem_free(void *rmem)
  61258. {
  61259. 8018fb8: b580 push {r7, lr}
  61260. 8018fba: b088 sub sp, #32
  61261. 8018fbc: af00 add r7, sp, #0
  61262. 8018fbe: 6078 str r0, [r7, #4]
  61263. struct mem *mem;
  61264. LWIP_MEM_FREE_DECL_PROTECT();
  61265. if (rmem == NULL) {
  61266. 8018fc0: 687b ldr r3, [r7, #4]
  61267. 8018fc2: 2b00 cmp r3, #0
  61268. 8018fc4: d070 beq.n 80190a8 <mem_free+0xf0>
  61269. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("mem_free(p == NULL) was called.\n"));
  61270. return;
  61271. }
  61272. if ((((mem_ptr_t)rmem) & (MEM_ALIGNMENT - 1)) != 0) {
  61273. 8018fc6: 687b ldr r3, [r7, #4]
  61274. 8018fc8: f003 0303 and.w r3, r3, #3
  61275. 8018fcc: 2b00 cmp r3, #0
  61276. 8018fce: d00d beq.n 8018fec <mem_free+0x34>
  61277. LWIP_MEM_ILLEGAL_FREE("mem_free: sanity check alignment");
  61278. 8018fd0: 4b37 ldr r3, [pc, #220] @ (80190b0 <mem_free+0xf8>)
  61279. 8018fd2: f240 2273 movw r2, #627 @ 0x273
  61280. 8018fd6: 4937 ldr r1, [pc, #220] @ (80190b4 <mem_free+0xfc>)
  61281. 8018fd8: 4837 ldr r0, [pc, #220] @ (80190b8 <mem_free+0x100>)
  61282. 8018fda: f010 fcf7 bl 80299cc <iprintf>
  61283. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: sanity check alignment\n"));
  61284. /* protect mem stats from concurrent access */
  61285. MEM_STATS_INC_LOCKED(illegal);
  61286. 8018fde: f00d fa5f bl 80264a0 <sys_arch_protect>
  61287. 8018fe2: 60f8 str r0, [r7, #12]
  61288. 8018fe4: 68f8 ldr r0, [r7, #12]
  61289. 8018fe6: f00d fa69 bl 80264bc <sys_arch_unprotect>
  61290. return;
  61291. 8018fea: e05e b.n 80190aa <mem_free+0xf2>
  61292. }
  61293. /* Get the corresponding struct mem: */
  61294. /* cast through void* to get rid of alignment warnings */
  61295. mem = (struct mem *)(void *)((u8_t *)rmem - (SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET));
  61296. 8018fec: 687b ldr r3, [r7, #4]
  61297. 8018fee: 3b0c subs r3, #12
  61298. 8018ff0: 61fb str r3, [r7, #28]
  61299. if ((u8_t *)mem < ram || (u8_t *)rmem + MIN_SIZE_ALIGNED > (u8_t *)ram_end) {
  61300. 8018ff2: 4b32 ldr r3, [pc, #200] @ (80190bc <mem_free+0x104>)
  61301. 8018ff4: 681b ldr r3, [r3, #0]
  61302. 8018ff6: 69fa ldr r2, [r7, #28]
  61303. 8018ff8: 429a cmp r2, r3
  61304. 8018ffa: d306 bcc.n 801900a <mem_free+0x52>
  61305. 8018ffc: 687b ldr r3, [r7, #4]
  61306. 8018ffe: f103 020c add.w r2, r3, #12
  61307. 8019002: 4b2f ldr r3, [pc, #188] @ (80190c0 <mem_free+0x108>)
  61308. 8019004: 681b ldr r3, [r3, #0]
  61309. 8019006: 429a cmp r2, r3
  61310. 8019008: d90d bls.n 8019026 <mem_free+0x6e>
  61311. LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory");
  61312. 801900a: 4b29 ldr r3, [pc, #164] @ (80190b0 <mem_free+0xf8>)
  61313. 801900c: f240 227f movw r2, #639 @ 0x27f
  61314. 8019010: 492c ldr r1, [pc, #176] @ (80190c4 <mem_free+0x10c>)
  61315. 8019012: 4829 ldr r0, [pc, #164] @ (80190b8 <mem_free+0x100>)
  61316. 8019014: f010 fcda bl 80299cc <iprintf>
  61317. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n"));
  61318. /* protect mem stats from concurrent access */
  61319. MEM_STATS_INC_LOCKED(illegal);
  61320. 8019018: f00d fa42 bl 80264a0 <sys_arch_protect>
  61321. 801901c: 6138 str r0, [r7, #16]
  61322. 801901e: 6938 ldr r0, [r7, #16]
  61323. 8019020: f00d fa4c bl 80264bc <sys_arch_unprotect>
  61324. return;
  61325. 8019024: e041 b.n 80190aa <mem_free+0xf2>
  61326. }
  61327. #if MEM_OVERFLOW_CHECK
  61328. mem_overflow_check_element(mem);
  61329. #endif
  61330. /* protect the heap from concurrent access */
  61331. LWIP_MEM_FREE_PROTECT();
  61332. 8019026: 4828 ldr r0, [pc, #160] @ (80190c8 <mem_free+0x110>)
  61333. 8019028: f00d f9fe bl 8026428 <sys_mutex_lock>
  61334. /* mem has to be in a used state */
  61335. if (!mem->used) {
  61336. 801902c: 69fb ldr r3, [r7, #28]
  61337. 801902e: 7a1b ldrb r3, [r3, #8]
  61338. 8019030: 2b00 cmp r3, #0
  61339. 8019032: d110 bne.n 8019056 <mem_free+0x9e>
  61340. LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory: double free");
  61341. 8019034: 4b1e ldr r3, [pc, #120] @ (80190b0 <mem_free+0xf8>)
  61342. 8019036: f44f 7223 mov.w r2, #652 @ 0x28c
  61343. 801903a: 4924 ldr r1, [pc, #144] @ (80190cc <mem_free+0x114>)
  61344. 801903c: 481e ldr r0, [pc, #120] @ (80190b8 <mem_free+0x100>)
  61345. 801903e: f010 fcc5 bl 80299cc <iprintf>
  61346. LWIP_MEM_FREE_UNPROTECT();
  61347. 8019042: 4821 ldr r0, [pc, #132] @ (80190c8 <mem_free+0x110>)
  61348. 8019044: f00d f9ff bl 8026446 <sys_mutex_unlock>
  61349. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory: double free?\n"));
  61350. /* protect mem stats from concurrent access */
  61351. MEM_STATS_INC_LOCKED(illegal);
  61352. 8019048: f00d fa2a bl 80264a0 <sys_arch_protect>
  61353. 801904c: 6178 str r0, [r7, #20]
  61354. 801904e: 6978 ldr r0, [r7, #20]
  61355. 8019050: f00d fa34 bl 80264bc <sys_arch_unprotect>
  61356. return;
  61357. 8019054: e029 b.n 80190aa <mem_free+0xf2>
  61358. }
  61359. if (!mem_link_valid(mem)) {
  61360. 8019056: 69f8 ldr r0, [r7, #28]
  61361. 8019058: f7ff ff70 bl 8018f3c <mem_link_valid>
  61362. 801905c: 4603 mov r3, r0
  61363. 801905e: 2b00 cmp r3, #0
  61364. 8019060: d110 bne.n 8019084 <mem_free+0xcc>
  61365. LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory: non-linked: double free");
  61366. 8019062: 4b13 ldr r3, [pc, #76] @ (80190b0 <mem_free+0xf8>)
  61367. 8019064: f240 2295 movw r2, #661 @ 0x295
  61368. 8019068: 4919 ldr r1, [pc, #100] @ (80190d0 <mem_free+0x118>)
  61369. 801906a: 4813 ldr r0, [pc, #76] @ (80190b8 <mem_free+0x100>)
  61370. 801906c: f010 fcae bl 80299cc <iprintf>
  61371. LWIP_MEM_FREE_UNPROTECT();
  61372. 8019070: 4815 ldr r0, [pc, #84] @ (80190c8 <mem_free+0x110>)
  61373. 8019072: f00d f9e8 bl 8026446 <sys_mutex_unlock>
  61374. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory: non-linked: double free?\n"));
  61375. /* protect mem stats from concurrent access */
  61376. MEM_STATS_INC_LOCKED(illegal);
  61377. 8019076: f00d fa13 bl 80264a0 <sys_arch_protect>
  61378. 801907a: 61b8 str r0, [r7, #24]
  61379. 801907c: 69b8 ldr r0, [r7, #24]
  61380. 801907e: f00d fa1d bl 80264bc <sys_arch_unprotect>
  61381. return;
  61382. 8019082: e012 b.n 80190aa <mem_free+0xf2>
  61383. }
  61384. /* mem is now unused. */
  61385. mem->used = 0;
  61386. 8019084: 69fb ldr r3, [r7, #28]
  61387. 8019086: 2200 movs r2, #0
  61388. 8019088: 721a strb r2, [r3, #8]
  61389. if (mem < lfree) {
  61390. 801908a: 4b12 ldr r3, [pc, #72] @ (80190d4 <mem_free+0x11c>)
  61391. 801908c: 681b ldr r3, [r3, #0]
  61392. 801908e: 69fa ldr r2, [r7, #28]
  61393. 8019090: 429a cmp r2, r3
  61394. 8019092: d202 bcs.n 801909a <mem_free+0xe2>
  61395. /* the newly freed struct is now the lowest */
  61396. lfree = mem;
  61397. 8019094: 4a0f ldr r2, [pc, #60] @ (80190d4 <mem_free+0x11c>)
  61398. 8019096: 69fb ldr r3, [r7, #28]
  61399. 8019098: 6013 str r3, [r2, #0]
  61400. }
  61401. MEM_STATS_DEC_USED(used, mem->next - (mem_size_t)(((u8_t *)mem - ram)));
  61402. /* finally, see if prev or next are free also */
  61403. plug_holes(mem);
  61404. 801909a: 69f8 ldr r0, [r7, #28]
  61405. 801909c: f7ff fe5e bl 8018d5c <plug_holes>
  61406. MEM_SANITY();
  61407. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  61408. mem_free_count = 1;
  61409. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  61410. LWIP_MEM_FREE_UNPROTECT();
  61411. 80190a0: 4809 ldr r0, [pc, #36] @ (80190c8 <mem_free+0x110>)
  61412. 80190a2: f00d f9d0 bl 8026446 <sys_mutex_unlock>
  61413. 80190a6: e000 b.n 80190aa <mem_free+0xf2>
  61414. return;
  61415. 80190a8: bf00 nop
  61416. }
  61417. 80190aa: 3720 adds r7, #32
  61418. 80190ac: 46bd mov sp, r7
  61419. 80190ae: bd80 pop {r7, pc}
  61420. 80190b0: 0802da7c .word 0x0802da7c
  61421. 80190b4: 0802db6c .word 0x0802db6c
  61422. 80190b8: 0802dac4 .word 0x0802dac4
  61423. 80190bc: 24024350 .word 0x24024350
  61424. 80190c0: 24024354 .word 0x24024354
  61425. 80190c4: 0802db90 .word 0x0802db90
  61426. 80190c8: 24024358 .word 0x24024358
  61427. 80190cc: 0802dbac .word 0x0802dbac
  61428. 80190d0: 0802dbd4 .word 0x0802dbd4
  61429. 80190d4: 2402435c .word 0x2402435c
  61430. 080190d8 <mem_trim>:
  61431. * or NULL if newsize is > old size, in which case rmem is NOT touched
  61432. * or freed!
  61433. */
  61434. void *
  61435. mem_trim(void *rmem, mem_size_t new_size)
  61436. {
  61437. 80190d8: b580 push {r7, lr}
  61438. 80190da: b08a sub sp, #40 @ 0x28
  61439. 80190dc: af00 add r7, sp, #0
  61440. 80190de: 6078 str r0, [r7, #4]
  61441. 80190e0: 6039 str r1, [r7, #0]
  61442. /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */
  61443. LWIP_MEM_FREE_DECL_PROTECT();
  61444. /* Expand the size of the allocated memory region so that we can
  61445. adjust for alignment. */
  61446. newsize = (mem_size_t)LWIP_MEM_ALIGN_SIZE(new_size);
  61447. 80190e2: 683b ldr r3, [r7, #0]
  61448. 80190e4: 3303 adds r3, #3
  61449. 80190e6: f023 0303 bic.w r3, r3, #3
  61450. 80190ea: 627b str r3, [r7, #36] @ 0x24
  61451. if (newsize < MIN_SIZE_ALIGNED) {
  61452. 80190ec: 6a7b ldr r3, [r7, #36] @ 0x24
  61453. 80190ee: 2b0b cmp r3, #11
  61454. 80190f0: d801 bhi.n 80190f6 <mem_trim+0x1e>
  61455. /* every data block must be at least MIN_SIZE_ALIGNED long */
  61456. newsize = MIN_SIZE_ALIGNED;
  61457. 80190f2: 230c movs r3, #12
  61458. 80190f4: 627b str r3, [r7, #36] @ 0x24
  61459. }
  61460. #if MEM_OVERFLOW_CHECK
  61461. newsize += MEM_SANITY_REGION_BEFORE_ALIGNED + MEM_SANITY_REGION_AFTER_ALIGNED;
  61462. #endif
  61463. if ((newsize > MEM_SIZE_ALIGNED) || (newsize < new_size)) {
  61464. 80190f6: 6a7b ldr r3, [r7, #36] @ 0x24
  61465. 80190f8: 4a6e ldr r2, [pc, #440] @ (80192b4 <mem_trim+0x1dc>)
  61466. 80190fa: 4293 cmp r3, r2
  61467. 80190fc: d803 bhi.n 8019106 <mem_trim+0x2e>
  61468. 80190fe: 6a7a ldr r2, [r7, #36] @ 0x24
  61469. 8019100: 683b ldr r3, [r7, #0]
  61470. 8019102: 429a cmp r2, r3
  61471. 8019104: d201 bcs.n 801910a <mem_trim+0x32>
  61472. return NULL;
  61473. 8019106: 2300 movs r3, #0
  61474. 8019108: e0d0 b.n 80192ac <mem_trim+0x1d4>
  61475. }
  61476. LWIP_ASSERT("mem_trim: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
  61477. 801910a: 4b6b ldr r3, [pc, #428] @ (80192b8 <mem_trim+0x1e0>)
  61478. 801910c: 681b ldr r3, [r3, #0]
  61479. 801910e: 687a ldr r2, [r7, #4]
  61480. 8019110: 429a cmp r2, r3
  61481. 8019112: d304 bcc.n 801911e <mem_trim+0x46>
  61482. 8019114: 4b69 ldr r3, [pc, #420] @ (80192bc <mem_trim+0x1e4>)
  61483. 8019116: 681b ldr r3, [r3, #0]
  61484. 8019118: 687a ldr r2, [r7, #4]
  61485. 801911a: 429a cmp r2, r3
  61486. 801911c: d306 bcc.n 801912c <mem_trim+0x54>
  61487. 801911e: 4b68 ldr r3, [pc, #416] @ (80192c0 <mem_trim+0x1e8>)
  61488. 8019120: f240 22d1 movw r2, #721 @ 0x2d1
  61489. 8019124: 4967 ldr r1, [pc, #412] @ (80192c4 <mem_trim+0x1ec>)
  61490. 8019126: 4868 ldr r0, [pc, #416] @ (80192c8 <mem_trim+0x1f0>)
  61491. 8019128: f010 fc50 bl 80299cc <iprintf>
  61492. (u8_t *)rmem < (u8_t *)ram_end);
  61493. if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
  61494. 801912c: 4b62 ldr r3, [pc, #392] @ (80192b8 <mem_trim+0x1e0>)
  61495. 801912e: 681b ldr r3, [r3, #0]
  61496. 8019130: 687a ldr r2, [r7, #4]
  61497. 8019132: 429a cmp r2, r3
  61498. 8019134: d304 bcc.n 8019140 <mem_trim+0x68>
  61499. 8019136: 4b61 ldr r3, [pc, #388] @ (80192bc <mem_trim+0x1e4>)
  61500. 8019138: 681b ldr r3, [r3, #0]
  61501. 801913a: 687a ldr r2, [r7, #4]
  61502. 801913c: 429a cmp r2, r3
  61503. 801913e: d307 bcc.n 8019150 <mem_trim+0x78>
  61504. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_trim: illegal memory\n"));
  61505. /* protect mem stats from concurrent access */
  61506. MEM_STATS_INC_LOCKED(illegal);
  61507. 8019140: f00d f9ae bl 80264a0 <sys_arch_protect>
  61508. 8019144: 60b8 str r0, [r7, #8]
  61509. 8019146: 68b8 ldr r0, [r7, #8]
  61510. 8019148: f00d f9b8 bl 80264bc <sys_arch_unprotect>
  61511. return rmem;
  61512. 801914c: 687b ldr r3, [r7, #4]
  61513. 801914e: e0ad b.n 80192ac <mem_trim+0x1d4>
  61514. }
  61515. /* Get the corresponding struct mem ... */
  61516. /* cast through void* to get rid of alignment warnings */
  61517. mem = (struct mem *)(void *)((u8_t *)rmem - (SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET));
  61518. 8019150: 687b ldr r3, [r7, #4]
  61519. 8019152: 3b0c subs r3, #12
  61520. 8019154: 623b str r3, [r7, #32]
  61521. #if MEM_OVERFLOW_CHECK
  61522. mem_overflow_check_element(mem);
  61523. #endif
  61524. /* ... and its offset pointer */
  61525. ptr = mem_to_ptr(mem);
  61526. 8019156: 6a38 ldr r0, [r7, #32]
  61527. 8019158: f7ff fdf0 bl 8018d3c <mem_to_ptr>
  61528. 801915c: 61f8 str r0, [r7, #28]
  61529. size = (mem_size_t)((mem_size_t)(mem->next - ptr) - (SIZEOF_STRUCT_MEM + MEM_SANITY_OVERHEAD));
  61530. 801915e: 6a3b ldr r3, [r7, #32]
  61531. 8019160: 681a ldr r2, [r3, #0]
  61532. 8019162: 69fb ldr r3, [r7, #28]
  61533. 8019164: 1ad3 subs r3, r2, r3
  61534. 8019166: 3b0c subs r3, #12
  61535. 8019168: 61bb str r3, [r7, #24]
  61536. LWIP_ASSERT("mem_trim can only shrink memory", newsize <= size);
  61537. 801916a: 6a7a ldr r2, [r7, #36] @ 0x24
  61538. 801916c: 69bb ldr r3, [r7, #24]
  61539. 801916e: 429a cmp r2, r3
  61540. 8019170: d906 bls.n 8019180 <mem_trim+0xa8>
  61541. 8019172: 4b53 ldr r3, [pc, #332] @ (80192c0 <mem_trim+0x1e8>)
  61542. 8019174: f44f 7239 mov.w r2, #740 @ 0x2e4
  61543. 8019178: 4954 ldr r1, [pc, #336] @ (80192cc <mem_trim+0x1f4>)
  61544. 801917a: 4853 ldr r0, [pc, #332] @ (80192c8 <mem_trim+0x1f0>)
  61545. 801917c: f010 fc26 bl 80299cc <iprintf>
  61546. if (newsize > size) {
  61547. 8019180: 6a7a ldr r2, [r7, #36] @ 0x24
  61548. 8019182: 69bb ldr r3, [r7, #24]
  61549. 8019184: 429a cmp r2, r3
  61550. 8019186: d901 bls.n 801918c <mem_trim+0xb4>
  61551. /* not supported */
  61552. return NULL;
  61553. 8019188: 2300 movs r3, #0
  61554. 801918a: e08f b.n 80192ac <mem_trim+0x1d4>
  61555. }
  61556. if (newsize == size) {
  61557. 801918c: 6a7a ldr r2, [r7, #36] @ 0x24
  61558. 801918e: 69bb ldr r3, [r7, #24]
  61559. 8019190: 429a cmp r2, r3
  61560. 8019192: d101 bne.n 8019198 <mem_trim+0xc0>
  61561. /* No change in size, simply return */
  61562. return rmem;
  61563. 8019194: 687b ldr r3, [r7, #4]
  61564. 8019196: e089 b.n 80192ac <mem_trim+0x1d4>
  61565. }
  61566. /* protect the heap from concurrent access */
  61567. LWIP_MEM_FREE_PROTECT();
  61568. 8019198: 484d ldr r0, [pc, #308] @ (80192d0 <mem_trim+0x1f8>)
  61569. 801919a: f00d f945 bl 8026428 <sys_mutex_lock>
  61570. mem2 = ptr_to_mem(mem->next);
  61571. 801919e: 6a3b ldr r3, [r7, #32]
  61572. 80191a0: 681b ldr r3, [r3, #0]
  61573. 80191a2: 4618 mov r0, r3
  61574. 80191a4: f7ff fdba bl 8018d1c <ptr_to_mem>
  61575. 80191a8: 6178 str r0, [r7, #20]
  61576. if (mem2->used == 0) {
  61577. 80191aa: 697b ldr r3, [r7, #20]
  61578. 80191ac: 7a1b ldrb r3, [r3, #8]
  61579. 80191ae: 2b00 cmp r3, #0
  61580. 80191b0: d13c bne.n 801922c <mem_trim+0x154>
  61581. /* The next struct is unused, we can simply move it at little */
  61582. mem_size_t next;
  61583. LWIP_ASSERT("invalid next ptr", mem->next != MEM_SIZE_ALIGNED);
  61584. 80191b2: 6a3b ldr r3, [r7, #32]
  61585. 80191b4: 681b ldr r3, [r3, #0]
  61586. 80191b6: 4a3f ldr r2, [pc, #252] @ (80192b4 <mem_trim+0x1dc>)
  61587. 80191b8: 4293 cmp r3, r2
  61588. 80191ba: d106 bne.n 80191ca <mem_trim+0xf2>
  61589. 80191bc: 4b40 ldr r3, [pc, #256] @ (80192c0 <mem_trim+0x1e8>)
  61590. 80191be: f240 22f5 movw r2, #757 @ 0x2f5
  61591. 80191c2: 4944 ldr r1, [pc, #272] @ (80192d4 <mem_trim+0x1fc>)
  61592. 80191c4: 4840 ldr r0, [pc, #256] @ (80192c8 <mem_trim+0x1f0>)
  61593. 80191c6: f010 fc01 bl 80299cc <iprintf>
  61594. /* remember the old next pointer */
  61595. next = mem2->next;
  61596. 80191ca: 697b ldr r3, [r7, #20]
  61597. 80191cc: 681b ldr r3, [r3, #0]
  61598. 80191ce: 60fb str r3, [r7, #12]
  61599. /* create new struct mem which is moved directly after the shrinked mem */
  61600. ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + newsize);
  61601. 80191d0: 69fa ldr r2, [r7, #28]
  61602. 80191d2: 6a7b ldr r3, [r7, #36] @ 0x24
  61603. 80191d4: 4413 add r3, r2
  61604. 80191d6: 330c adds r3, #12
  61605. 80191d8: 613b str r3, [r7, #16]
  61606. if (lfree == mem2) {
  61607. 80191da: 4b3f ldr r3, [pc, #252] @ (80192d8 <mem_trim+0x200>)
  61608. 80191dc: 681b ldr r3, [r3, #0]
  61609. 80191de: 697a ldr r2, [r7, #20]
  61610. 80191e0: 429a cmp r2, r3
  61611. 80191e2: d105 bne.n 80191f0 <mem_trim+0x118>
  61612. lfree = ptr_to_mem(ptr2);
  61613. 80191e4: 6938 ldr r0, [r7, #16]
  61614. 80191e6: f7ff fd99 bl 8018d1c <ptr_to_mem>
  61615. 80191ea: 4603 mov r3, r0
  61616. 80191ec: 4a3a ldr r2, [pc, #232] @ (80192d8 <mem_trim+0x200>)
  61617. 80191ee: 6013 str r3, [r2, #0]
  61618. }
  61619. mem2 = ptr_to_mem(ptr2);
  61620. 80191f0: 6938 ldr r0, [r7, #16]
  61621. 80191f2: f7ff fd93 bl 8018d1c <ptr_to_mem>
  61622. 80191f6: 6178 str r0, [r7, #20]
  61623. mem2->used = 0;
  61624. 80191f8: 697b ldr r3, [r7, #20]
  61625. 80191fa: 2200 movs r2, #0
  61626. 80191fc: 721a strb r2, [r3, #8]
  61627. /* restore the next pointer */
  61628. mem2->next = next;
  61629. 80191fe: 697b ldr r3, [r7, #20]
  61630. 8019200: 68fa ldr r2, [r7, #12]
  61631. 8019202: 601a str r2, [r3, #0]
  61632. /* link it back to mem */
  61633. mem2->prev = ptr;
  61634. 8019204: 697b ldr r3, [r7, #20]
  61635. 8019206: 69fa ldr r2, [r7, #28]
  61636. 8019208: 605a str r2, [r3, #4]
  61637. /* link mem to it */
  61638. mem->next = ptr2;
  61639. 801920a: 6a3b ldr r3, [r7, #32]
  61640. 801920c: 693a ldr r2, [r7, #16]
  61641. 801920e: 601a str r2, [r3, #0]
  61642. /* last thing to restore linked list: as we have moved mem2,
  61643. * let 'mem2->next->prev' point to mem2 again. but only if mem2->next is not
  61644. * the end of the heap */
  61645. if (mem2->next != MEM_SIZE_ALIGNED) {
  61646. 8019210: 697b ldr r3, [r7, #20]
  61647. 8019212: 681b ldr r3, [r3, #0]
  61648. 8019214: 4a27 ldr r2, [pc, #156] @ (80192b4 <mem_trim+0x1dc>)
  61649. 8019216: 4293 cmp r3, r2
  61650. 8019218: d044 beq.n 80192a4 <mem_trim+0x1cc>
  61651. ptr_to_mem(mem2->next)->prev = ptr2;
  61652. 801921a: 697b ldr r3, [r7, #20]
  61653. 801921c: 681b ldr r3, [r3, #0]
  61654. 801921e: 4618 mov r0, r3
  61655. 8019220: f7ff fd7c bl 8018d1c <ptr_to_mem>
  61656. 8019224: 4602 mov r2, r0
  61657. 8019226: 693b ldr r3, [r7, #16]
  61658. 8019228: 6053 str r3, [r2, #4]
  61659. 801922a: e03b b.n 80192a4 <mem_trim+0x1cc>
  61660. }
  61661. MEM_STATS_DEC_USED(used, (size - newsize));
  61662. /* no need to plug holes, we've already done that */
  61663. } else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) {
  61664. 801922c: 6a7b ldr r3, [r7, #36] @ 0x24
  61665. 801922e: 3318 adds r3, #24
  61666. 8019230: 69ba ldr r2, [r7, #24]
  61667. 8019232: 429a cmp r2, r3
  61668. 8019234: d336 bcc.n 80192a4 <mem_trim+0x1cc>
  61669. * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem
  61670. * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED').
  61671. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  61672. * region that couldn't hold data, but when mem->next gets freed,
  61673. * the 2 regions would be combined, resulting in more free memory */
  61674. ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + newsize);
  61675. 8019236: 69fa ldr r2, [r7, #28]
  61676. 8019238: 6a7b ldr r3, [r7, #36] @ 0x24
  61677. 801923a: 4413 add r3, r2
  61678. 801923c: 330c adds r3, #12
  61679. 801923e: 613b str r3, [r7, #16]
  61680. LWIP_ASSERT("invalid next ptr", mem->next != MEM_SIZE_ALIGNED);
  61681. 8019240: 6a3b ldr r3, [r7, #32]
  61682. 8019242: 681b ldr r3, [r3, #0]
  61683. 8019244: 4a1b ldr r2, [pc, #108] @ (80192b4 <mem_trim+0x1dc>)
  61684. 8019246: 4293 cmp r3, r2
  61685. 8019248: d106 bne.n 8019258 <mem_trim+0x180>
  61686. 801924a: 4b1d ldr r3, [pc, #116] @ (80192c0 <mem_trim+0x1e8>)
  61687. 801924c: f240 3216 movw r2, #790 @ 0x316
  61688. 8019250: 4920 ldr r1, [pc, #128] @ (80192d4 <mem_trim+0x1fc>)
  61689. 8019252: 481d ldr r0, [pc, #116] @ (80192c8 <mem_trim+0x1f0>)
  61690. 8019254: f010 fbba bl 80299cc <iprintf>
  61691. mem2 = ptr_to_mem(ptr2);
  61692. 8019258: 6938 ldr r0, [r7, #16]
  61693. 801925a: f7ff fd5f bl 8018d1c <ptr_to_mem>
  61694. 801925e: 6178 str r0, [r7, #20]
  61695. if (mem2 < lfree) {
  61696. 8019260: 4b1d ldr r3, [pc, #116] @ (80192d8 <mem_trim+0x200>)
  61697. 8019262: 681b ldr r3, [r3, #0]
  61698. 8019264: 697a ldr r2, [r7, #20]
  61699. 8019266: 429a cmp r2, r3
  61700. 8019268: d202 bcs.n 8019270 <mem_trim+0x198>
  61701. lfree = mem2;
  61702. 801926a: 4a1b ldr r2, [pc, #108] @ (80192d8 <mem_trim+0x200>)
  61703. 801926c: 697b ldr r3, [r7, #20]
  61704. 801926e: 6013 str r3, [r2, #0]
  61705. }
  61706. mem2->used = 0;
  61707. 8019270: 697b ldr r3, [r7, #20]
  61708. 8019272: 2200 movs r2, #0
  61709. 8019274: 721a strb r2, [r3, #8]
  61710. mem2->next = mem->next;
  61711. 8019276: 6a3b ldr r3, [r7, #32]
  61712. 8019278: 681a ldr r2, [r3, #0]
  61713. 801927a: 697b ldr r3, [r7, #20]
  61714. 801927c: 601a str r2, [r3, #0]
  61715. mem2->prev = ptr;
  61716. 801927e: 697b ldr r3, [r7, #20]
  61717. 8019280: 69fa ldr r2, [r7, #28]
  61718. 8019282: 605a str r2, [r3, #4]
  61719. mem->next = ptr2;
  61720. 8019284: 6a3b ldr r3, [r7, #32]
  61721. 8019286: 693a ldr r2, [r7, #16]
  61722. 8019288: 601a str r2, [r3, #0]
  61723. if (mem2->next != MEM_SIZE_ALIGNED) {
  61724. 801928a: 697b ldr r3, [r7, #20]
  61725. 801928c: 681b ldr r3, [r3, #0]
  61726. 801928e: 4a09 ldr r2, [pc, #36] @ (80192b4 <mem_trim+0x1dc>)
  61727. 8019290: 4293 cmp r3, r2
  61728. 8019292: d007 beq.n 80192a4 <mem_trim+0x1cc>
  61729. ptr_to_mem(mem2->next)->prev = ptr2;
  61730. 8019294: 697b ldr r3, [r7, #20]
  61731. 8019296: 681b ldr r3, [r3, #0]
  61732. 8019298: 4618 mov r0, r3
  61733. 801929a: f7ff fd3f bl 8018d1c <ptr_to_mem>
  61734. 801929e: 4602 mov r2, r0
  61735. 80192a0: 693b ldr r3, [r7, #16]
  61736. 80192a2: 6053 str r3, [r2, #4]
  61737. #endif
  61738. MEM_SANITY();
  61739. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  61740. mem_free_count = 1;
  61741. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  61742. LWIP_MEM_FREE_UNPROTECT();
  61743. 80192a4: 480a ldr r0, [pc, #40] @ (80192d0 <mem_trim+0x1f8>)
  61744. 80192a6: f00d f8ce bl 8026446 <sys_mutex_unlock>
  61745. return rmem;
  61746. 80192aa: 687b ldr r3, [r7, #4]
  61747. }
  61748. 80192ac: 4618 mov r0, r3
  61749. 80192ae: 3728 adds r7, #40 @ 0x28
  61750. 80192b0: 46bd mov sp, r7
  61751. 80192b2: bd80 pop {r7, pc}
  61752. 80192b4: 0001ffe8 .word 0x0001ffe8
  61753. 80192b8: 24024350 .word 0x24024350
  61754. 80192bc: 24024354 .word 0x24024354
  61755. 80192c0: 0802da7c .word 0x0802da7c
  61756. 80192c4: 0802dc08 .word 0x0802dc08
  61757. 80192c8: 0802dac4 .word 0x0802dac4
  61758. 80192cc: 0802dc20 .word 0x0802dc20
  61759. 80192d0: 24024358 .word 0x24024358
  61760. 80192d4: 0802dc40 .word 0x0802dc40
  61761. 80192d8: 2402435c .word 0x2402435c
  61762. 080192dc <mem_malloc>:
  61763. *
  61764. * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT).
  61765. */
  61766. void *
  61767. mem_malloc(mem_size_t size_in)
  61768. {
  61769. 80192dc: b580 push {r7, lr}
  61770. 80192de: b088 sub sp, #32
  61771. 80192e0: af00 add r7, sp, #0
  61772. 80192e2: 6078 str r0, [r7, #4]
  61773. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  61774. u8_t local_mem_free_count = 0;
  61775. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  61776. LWIP_MEM_ALLOC_DECL_PROTECT();
  61777. if (size_in == 0) {
  61778. 80192e4: 687b ldr r3, [r7, #4]
  61779. 80192e6: 2b00 cmp r3, #0
  61780. 80192e8: d101 bne.n 80192ee <mem_malloc+0x12>
  61781. return NULL;
  61782. 80192ea: 2300 movs r3, #0
  61783. 80192ec: e0d9 b.n 80194a2 <mem_malloc+0x1c6>
  61784. }
  61785. /* Expand the size of the allocated memory region so that we can
  61786. adjust for alignment. */
  61787. size = (mem_size_t)LWIP_MEM_ALIGN_SIZE(size_in);
  61788. 80192ee: 687b ldr r3, [r7, #4]
  61789. 80192f0: 3303 adds r3, #3
  61790. 80192f2: f023 0303 bic.w r3, r3, #3
  61791. 80192f6: 61bb str r3, [r7, #24]
  61792. if (size < MIN_SIZE_ALIGNED) {
  61793. 80192f8: 69bb ldr r3, [r7, #24]
  61794. 80192fa: 2b0b cmp r3, #11
  61795. 80192fc: d801 bhi.n 8019302 <mem_malloc+0x26>
  61796. /* every data block must be at least MIN_SIZE_ALIGNED long */
  61797. size = MIN_SIZE_ALIGNED;
  61798. 80192fe: 230c movs r3, #12
  61799. 8019300: 61bb str r3, [r7, #24]
  61800. }
  61801. #if MEM_OVERFLOW_CHECK
  61802. size += MEM_SANITY_REGION_BEFORE_ALIGNED + MEM_SANITY_REGION_AFTER_ALIGNED;
  61803. #endif
  61804. if ((size > MEM_SIZE_ALIGNED) || (size < size_in)) {
  61805. 8019302: 69bb ldr r3, [r7, #24]
  61806. 8019304: 4a69 ldr r2, [pc, #420] @ (80194ac <mem_malloc+0x1d0>)
  61807. 8019306: 4293 cmp r3, r2
  61808. 8019308: d803 bhi.n 8019312 <mem_malloc+0x36>
  61809. 801930a: 69ba ldr r2, [r7, #24]
  61810. 801930c: 687b ldr r3, [r7, #4]
  61811. 801930e: 429a cmp r2, r3
  61812. 8019310: d201 bcs.n 8019316 <mem_malloc+0x3a>
  61813. return NULL;
  61814. 8019312: 2300 movs r3, #0
  61815. 8019314: e0c5 b.n 80194a2 <mem_malloc+0x1c6>
  61816. }
  61817. /* protect the heap from concurrent access */
  61818. sys_mutex_lock(&mem_mutex);
  61819. 8019316: 4866 ldr r0, [pc, #408] @ (80194b0 <mem_malloc+0x1d4>)
  61820. 8019318: f00d f886 bl 8026428 <sys_mutex_lock>
  61821. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  61822. /* Scan through the heap searching for a free block that is big enough,
  61823. * beginning with the lowest free block.
  61824. */
  61825. for (ptr = mem_to_ptr(lfree); ptr < MEM_SIZE_ALIGNED - size;
  61826. 801931c: 4b65 ldr r3, [pc, #404] @ (80194b4 <mem_malloc+0x1d8>)
  61827. 801931e: 681b ldr r3, [r3, #0]
  61828. 8019320: 4618 mov r0, r3
  61829. 8019322: f7ff fd0b bl 8018d3c <mem_to_ptr>
  61830. 8019326: 61f8 str r0, [r7, #28]
  61831. 8019328: e0b0 b.n 801948c <mem_malloc+0x1b0>
  61832. ptr = ptr_to_mem(ptr)->next) {
  61833. mem = ptr_to_mem(ptr);
  61834. 801932a: 69f8 ldr r0, [r7, #28]
  61835. 801932c: f7ff fcf6 bl 8018d1c <ptr_to_mem>
  61836. 8019330: 6138 str r0, [r7, #16]
  61837. local_mem_free_count = 1;
  61838. break;
  61839. }
  61840. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  61841. if ((!mem->used) &&
  61842. 8019332: 693b ldr r3, [r7, #16]
  61843. 8019334: 7a1b ldrb r3, [r3, #8]
  61844. 8019336: 2b00 cmp r3, #0
  61845. 8019338: f040 80a2 bne.w 8019480 <mem_malloc+0x1a4>
  61846. (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
  61847. 801933c: 693b ldr r3, [r7, #16]
  61848. 801933e: 681a ldr r2, [r3, #0]
  61849. 8019340: 69fb ldr r3, [r7, #28]
  61850. 8019342: 1ad3 subs r3, r2, r3
  61851. 8019344: 3b0c subs r3, #12
  61852. if ((!mem->used) &&
  61853. 8019346: 69ba ldr r2, [r7, #24]
  61854. 8019348: 429a cmp r2, r3
  61855. 801934a: f200 8099 bhi.w 8019480 <mem_malloc+0x1a4>
  61856. /* mem is not used and at least perfect fit is possible:
  61857. * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */
  61858. if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) {
  61859. 801934e: 693b ldr r3, [r7, #16]
  61860. 8019350: 681a ldr r2, [r3, #0]
  61861. 8019352: 69fb ldr r3, [r7, #28]
  61862. 8019354: 1ad3 subs r3, r2, r3
  61863. 8019356: f1a3 020c sub.w r2, r3, #12
  61864. 801935a: 69bb ldr r3, [r7, #24]
  61865. 801935c: 3318 adds r3, #24
  61866. 801935e: 429a cmp r2, r3
  61867. 8019360: d331 bcc.n 80193c6 <mem_malloc+0xea>
  61868. * struct mem would fit in but no data between mem2 and mem2->next
  61869. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  61870. * region that couldn't hold data, but when mem->next gets freed,
  61871. * the 2 regions would be combined, resulting in more free memory
  61872. */
  61873. ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + size);
  61874. 8019362: 69fa ldr r2, [r7, #28]
  61875. 8019364: 69bb ldr r3, [r7, #24]
  61876. 8019366: 4413 add r3, r2
  61877. 8019368: 330c adds r3, #12
  61878. 801936a: 60fb str r3, [r7, #12]
  61879. LWIP_ASSERT("invalid next ptr",ptr2 != MEM_SIZE_ALIGNED);
  61880. 801936c: 68fb ldr r3, [r7, #12]
  61881. 801936e: 4a4f ldr r2, [pc, #316] @ (80194ac <mem_malloc+0x1d0>)
  61882. 8019370: 4293 cmp r3, r2
  61883. 8019372: d106 bne.n 8019382 <mem_malloc+0xa6>
  61884. 8019374: 4b50 ldr r3, [pc, #320] @ (80194b8 <mem_malloc+0x1dc>)
  61885. 8019376: f240 3287 movw r2, #903 @ 0x387
  61886. 801937a: 4950 ldr r1, [pc, #320] @ (80194bc <mem_malloc+0x1e0>)
  61887. 801937c: 4850 ldr r0, [pc, #320] @ (80194c0 <mem_malloc+0x1e4>)
  61888. 801937e: f010 fb25 bl 80299cc <iprintf>
  61889. /* create mem2 struct */
  61890. mem2 = ptr_to_mem(ptr2);
  61891. 8019382: 68f8 ldr r0, [r7, #12]
  61892. 8019384: f7ff fcca bl 8018d1c <ptr_to_mem>
  61893. 8019388: 60b8 str r0, [r7, #8]
  61894. mem2->used = 0;
  61895. 801938a: 68bb ldr r3, [r7, #8]
  61896. 801938c: 2200 movs r2, #0
  61897. 801938e: 721a strb r2, [r3, #8]
  61898. mem2->next = mem->next;
  61899. 8019390: 693b ldr r3, [r7, #16]
  61900. 8019392: 681a ldr r2, [r3, #0]
  61901. 8019394: 68bb ldr r3, [r7, #8]
  61902. 8019396: 601a str r2, [r3, #0]
  61903. mem2->prev = ptr;
  61904. 8019398: 68bb ldr r3, [r7, #8]
  61905. 801939a: 69fa ldr r2, [r7, #28]
  61906. 801939c: 605a str r2, [r3, #4]
  61907. /* and insert it between mem and mem->next */
  61908. mem->next = ptr2;
  61909. 801939e: 693b ldr r3, [r7, #16]
  61910. 80193a0: 68fa ldr r2, [r7, #12]
  61911. 80193a2: 601a str r2, [r3, #0]
  61912. mem->used = 1;
  61913. 80193a4: 693b ldr r3, [r7, #16]
  61914. 80193a6: 2201 movs r2, #1
  61915. 80193a8: 721a strb r2, [r3, #8]
  61916. if (mem2->next != MEM_SIZE_ALIGNED) {
  61917. 80193aa: 68bb ldr r3, [r7, #8]
  61918. 80193ac: 681b ldr r3, [r3, #0]
  61919. 80193ae: 4a3f ldr r2, [pc, #252] @ (80194ac <mem_malloc+0x1d0>)
  61920. 80193b0: 4293 cmp r3, r2
  61921. 80193b2: d00b beq.n 80193cc <mem_malloc+0xf0>
  61922. ptr_to_mem(mem2->next)->prev = ptr2;
  61923. 80193b4: 68bb ldr r3, [r7, #8]
  61924. 80193b6: 681b ldr r3, [r3, #0]
  61925. 80193b8: 4618 mov r0, r3
  61926. 80193ba: f7ff fcaf bl 8018d1c <ptr_to_mem>
  61927. 80193be: 4602 mov r2, r0
  61928. 80193c0: 68fb ldr r3, [r7, #12]
  61929. 80193c2: 6053 str r3, [r2, #4]
  61930. 80193c4: e002 b.n 80193cc <mem_malloc+0xf0>
  61931. * take care of this).
  61932. * -> near fit or exact fit: do not split, no mem2 creation
  61933. * also can't move mem->next directly behind mem, since mem->next
  61934. * will always be used at this point!
  61935. */
  61936. mem->used = 1;
  61937. 80193c6: 693b ldr r3, [r7, #16]
  61938. 80193c8: 2201 movs r2, #1
  61939. 80193ca: 721a strb r2, [r3, #8]
  61940. MEM_STATS_INC_USED(used, mem->next - mem_to_ptr(mem));
  61941. }
  61942. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  61943. mem_malloc_adjust_lfree:
  61944. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  61945. if (mem == lfree) {
  61946. 80193cc: 4b39 ldr r3, [pc, #228] @ (80194b4 <mem_malloc+0x1d8>)
  61947. 80193ce: 681b ldr r3, [r3, #0]
  61948. 80193d0: 693a ldr r2, [r7, #16]
  61949. 80193d2: 429a cmp r2, r3
  61950. 80193d4: d127 bne.n 8019426 <mem_malloc+0x14a>
  61951. struct mem *cur = lfree;
  61952. 80193d6: 4b37 ldr r3, [pc, #220] @ (80194b4 <mem_malloc+0x1d8>)
  61953. 80193d8: 681b ldr r3, [r3, #0]
  61954. 80193da: 617b str r3, [r7, #20]
  61955. /* Find next free block after mem and update lowest free pointer */
  61956. while (cur->used && cur != ram_end) {
  61957. 80193dc: e005 b.n 80193ea <mem_malloc+0x10e>
  61958. /* If mem_free or mem_trim have run, we have to restart since they
  61959. could have altered our current struct mem or lfree. */
  61960. goto mem_malloc_adjust_lfree;
  61961. }
  61962. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  61963. cur = ptr_to_mem(cur->next);
  61964. 80193de: 697b ldr r3, [r7, #20]
  61965. 80193e0: 681b ldr r3, [r3, #0]
  61966. 80193e2: 4618 mov r0, r3
  61967. 80193e4: f7ff fc9a bl 8018d1c <ptr_to_mem>
  61968. 80193e8: 6178 str r0, [r7, #20]
  61969. while (cur->used && cur != ram_end) {
  61970. 80193ea: 697b ldr r3, [r7, #20]
  61971. 80193ec: 7a1b ldrb r3, [r3, #8]
  61972. 80193ee: 2b00 cmp r3, #0
  61973. 80193f0: d004 beq.n 80193fc <mem_malloc+0x120>
  61974. 80193f2: 4b34 ldr r3, [pc, #208] @ (80194c4 <mem_malloc+0x1e8>)
  61975. 80193f4: 681b ldr r3, [r3, #0]
  61976. 80193f6: 697a ldr r2, [r7, #20]
  61977. 80193f8: 429a cmp r2, r3
  61978. 80193fa: d1f0 bne.n 80193de <mem_malloc+0x102>
  61979. }
  61980. lfree = cur;
  61981. 80193fc: 4a2d ldr r2, [pc, #180] @ (80194b4 <mem_malloc+0x1d8>)
  61982. 80193fe: 697b ldr r3, [r7, #20]
  61983. 8019400: 6013 str r3, [r2, #0]
  61984. LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used)));
  61985. 8019402: 4b2c ldr r3, [pc, #176] @ (80194b4 <mem_malloc+0x1d8>)
  61986. 8019404: 681a ldr r2, [r3, #0]
  61987. 8019406: 4b2f ldr r3, [pc, #188] @ (80194c4 <mem_malloc+0x1e8>)
  61988. 8019408: 681b ldr r3, [r3, #0]
  61989. 801940a: 429a cmp r2, r3
  61990. 801940c: d00b beq.n 8019426 <mem_malloc+0x14a>
  61991. 801940e: 4b29 ldr r3, [pc, #164] @ (80194b4 <mem_malloc+0x1d8>)
  61992. 8019410: 681b ldr r3, [r3, #0]
  61993. 8019412: 7a1b ldrb r3, [r3, #8]
  61994. 8019414: 2b00 cmp r3, #0
  61995. 8019416: d006 beq.n 8019426 <mem_malloc+0x14a>
  61996. 8019418: 4b27 ldr r3, [pc, #156] @ (80194b8 <mem_malloc+0x1dc>)
  61997. 801941a: f240 32b5 movw r2, #949 @ 0x3b5
  61998. 801941e: 492a ldr r1, [pc, #168] @ (80194c8 <mem_malloc+0x1ec>)
  61999. 8019420: 4827 ldr r0, [pc, #156] @ (80194c0 <mem_malloc+0x1e4>)
  62000. 8019422: f010 fad3 bl 80299cc <iprintf>
  62001. }
  62002. LWIP_MEM_ALLOC_UNPROTECT();
  62003. sys_mutex_unlock(&mem_mutex);
  62004. 8019426: 4822 ldr r0, [pc, #136] @ (80194b0 <mem_malloc+0x1d4>)
  62005. 8019428: f00d f80d bl 8026446 <sys_mutex_unlock>
  62006. LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.",
  62007. 801942c: 693a ldr r2, [r7, #16]
  62008. 801942e: 69bb ldr r3, [r7, #24]
  62009. 8019430: 4413 add r3, r2
  62010. 8019432: 330c adds r3, #12
  62011. 8019434: 4a23 ldr r2, [pc, #140] @ (80194c4 <mem_malloc+0x1e8>)
  62012. 8019436: 6812 ldr r2, [r2, #0]
  62013. 8019438: 4293 cmp r3, r2
  62014. 801943a: d906 bls.n 801944a <mem_malloc+0x16e>
  62015. 801943c: 4b1e ldr r3, [pc, #120] @ (80194b8 <mem_malloc+0x1dc>)
  62016. 801943e: f240 32b9 movw r2, #953 @ 0x3b9
  62017. 8019442: 4922 ldr r1, [pc, #136] @ (80194cc <mem_malloc+0x1f0>)
  62018. 8019444: 481e ldr r0, [pc, #120] @ (80194c0 <mem_malloc+0x1e4>)
  62019. 8019446: f010 fac1 bl 80299cc <iprintf>
  62020. (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end);
  62021. LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
  62022. 801944a: 693b ldr r3, [r7, #16]
  62023. 801944c: f003 0303 and.w r3, r3, #3
  62024. 8019450: 2b00 cmp r3, #0
  62025. 8019452: d006 beq.n 8019462 <mem_malloc+0x186>
  62026. 8019454: 4b18 ldr r3, [pc, #96] @ (80194b8 <mem_malloc+0x1dc>)
  62027. 8019456: f240 32bb movw r2, #955 @ 0x3bb
  62028. 801945a: 491d ldr r1, [pc, #116] @ (80194d0 <mem_malloc+0x1f4>)
  62029. 801945c: 4818 ldr r0, [pc, #96] @ (80194c0 <mem_malloc+0x1e4>)
  62030. 801945e: f010 fab5 bl 80299cc <iprintf>
  62031. ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
  62032. LWIP_ASSERT("mem_malloc: sanity check alignment",
  62033. 8019462: 693b ldr r3, [r7, #16]
  62034. 8019464: f003 0303 and.w r3, r3, #3
  62035. 8019468: 2b00 cmp r3, #0
  62036. 801946a: d006 beq.n 801947a <mem_malloc+0x19e>
  62037. 801946c: 4b12 ldr r3, [pc, #72] @ (80194b8 <mem_malloc+0x1dc>)
  62038. 801946e: f240 32bd movw r2, #957 @ 0x3bd
  62039. 8019472: 4918 ldr r1, [pc, #96] @ (80194d4 <mem_malloc+0x1f8>)
  62040. 8019474: 4812 ldr r0, [pc, #72] @ (80194c0 <mem_malloc+0x1e4>)
  62041. 8019476: f010 faa9 bl 80299cc <iprintf>
  62042. #if MEM_OVERFLOW_CHECK
  62043. mem_overflow_init_element(mem, size_in);
  62044. #endif
  62045. MEM_SANITY();
  62046. return (u8_t *)mem + SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET;
  62047. 801947a: 693b ldr r3, [r7, #16]
  62048. 801947c: 330c adds r3, #12
  62049. 801947e: e010 b.n 80194a2 <mem_malloc+0x1c6>
  62050. ptr = ptr_to_mem(ptr)->next) {
  62051. 8019480: 69f8 ldr r0, [r7, #28]
  62052. 8019482: f7ff fc4b bl 8018d1c <ptr_to_mem>
  62053. 8019486: 4603 mov r3, r0
  62054. 8019488: 681b ldr r3, [r3, #0]
  62055. 801948a: 61fb str r3, [r7, #28]
  62056. for (ptr = mem_to_ptr(lfree); ptr < MEM_SIZE_ALIGNED - size;
  62057. 801948c: 69ba ldr r2, [r7, #24]
  62058. 801948e: 4b07 ldr r3, [pc, #28] @ (80194ac <mem_malloc+0x1d0>)
  62059. 8019490: 1a9b subs r3, r3, r2
  62060. 8019492: 69fa ldr r2, [r7, #28]
  62061. 8019494: 429a cmp r2, r3
  62062. 8019496: f4ff af48 bcc.w 801932a <mem_malloc+0x4e>
  62063. /* if we got interrupted by a mem_free, try again */
  62064. } while (local_mem_free_count != 0);
  62065. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  62066. MEM_STATS_INC(err);
  62067. LWIP_MEM_ALLOC_UNPROTECT();
  62068. sys_mutex_unlock(&mem_mutex);
  62069. 801949a: 4805 ldr r0, [pc, #20] @ (80194b0 <mem_malloc+0x1d4>)
  62070. 801949c: f00c ffd3 bl 8026446 <sys_mutex_unlock>
  62071. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
  62072. return NULL;
  62073. 80194a0: 2300 movs r3, #0
  62074. }
  62075. 80194a2: 4618 mov r0, r3
  62076. 80194a4: 3720 adds r7, #32
  62077. 80194a6: 46bd mov sp, r7
  62078. 80194a8: bd80 pop {r7, pc}
  62079. 80194aa: bf00 nop
  62080. 80194ac: 0001ffe8 .word 0x0001ffe8
  62081. 80194b0: 24024358 .word 0x24024358
  62082. 80194b4: 2402435c .word 0x2402435c
  62083. 80194b8: 0802da7c .word 0x0802da7c
  62084. 80194bc: 0802dc40 .word 0x0802dc40
  62085. 80194c0: 0802dac4 .word 0x0802dac4
  62086. 80194c4: 24024354 .word 0x24024354
  62087. 80194c8: 0802dc54 .word 0x0802dc54
  62088. 80194cc: 0802dc70 .word 0x0802dc70
  62089. 80194d0: 0802dca0 .word 0x0802dca0
  62090. 80194d4: 0802dcd0 .word 0x0802dcd0
  62091. 080194d8 <memp_init_pool>:
  62092. *
  62093. * @param desc pool to initialize
  62094. */
  62095. void
  62096. memp_init_pool(const struct memp_desc *desc)
  62097. {
  62098. 80194d8: b480 push {r7}
  62099. 80194da: b085 sub sp, #20
  62100. 80194dc: af00 add r7, sp, #0
  62101. 80194de: 6078 str r0, [r7, #4]
  62102. LWIP_UNUSED_ARG(desc);
  62103. #else
  62104. int i;
  62105. struct memp *memp;
  62106. *desc->tab = NULL;
  62107. 80194e0: 687b ldr r3, [r7, #4]
  62108. 80194e2: 68db ldr r3, [r3, #12]
  62109. 80194e4: 2200 movs r2, #0
  62110. 80194e6: 601a str r2, [r3, #0]
  62111. memp = (struct memp *)LWIP_MEM_ALIGN(desc->base);
  62112. 80194e8: 687b ldr r3, [r7, #4]
  62113. 80194ea: 689b ldr r3, [r3, #8]
  62114. 80194ec: 3303 adds r3, #3
  62115. 80194ee: f023 0303 bic.w r3, r3, #3
  62116. 80194f2: 60bb str r3, [r7, #8]
  62117. + MEM_SANITY_REGION_AFTER_ALIGNED
  62118. #endif
  62119. ));
  62120. #endif
  62121. /* create a linked list of memp elements */
  62122. for (i = 0; i < desc->num; ++i) {
  62123. 80194f4: 2300 movs r3, #0
  62124. 80194f6: 60fb str r3, [r7, #12]
  62125. 80194f8: e011 b.n 801951e <memp_init_pool+0x46>
  62126. memp->next = *desc->tab;
  62127. 80194fa: 687b ldr r3, [r7, #4]
  62128. 80194fc: 68db ldr r3, [r3, #12]
  62129. 80194fe: 681a ldr r2, [r3, #0]
  62130. 8019500: 68bb ldr r3, [r7, #8]
  62131. 8019502: 601a str r2, [r3, #0]
  62132. *desc->tab = memp;
  62133. 8019504: 687b ldr r3, [r7, #4]
  62134. 8019506: 68db ldr r3, [r3, #12]
  62135. 8019508: 68ba ldr r2, [r7, #8]
  62136. 801950a: 601a str r2, [r3, #0]
  62137. #if MEMP_OVERFLOW_CHECK
  62138. memp_overflow_init_element(memp, desc);
  62139. #endif /* MEMP_OVERFLOW_CHECK */
  62140. /* cast through void* to get rid of alignment warnings */
  62141. memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size
  62142. 801950c: 687b ldr r3, [r7, #4]
  62143. 801950e: 889b ldrh r3, [r3, #4]
  62144. 8019510: 461a mov r2, r3
  62145. 8019512: 68bb ldr r3, [r7, #8]
  62146. 8019514: 4413 add r3, r2
  62147. 8019516: 60bb str r3, [r7, #8]
  62148. for (i = 0; i < desc->num; ++i) {
  62149. 8019518: 68fb ldr r3, [r7, #12]
  62150. 801951a: 3301 adds r3, #1
  62151. 801951c: 60fb str r3, [r7, #12]
  62152. 801951e: 687b ldr r3, [r7, #4]
  62153. 8019520: 88db ldrh r3, [r3, #6]
  62154. 8019522: 461a mov r2, r3
  62155. 8019524: 68fb ldr r3, [r7, #12]
  62156. 8019526: 4293 cmp r3, r2
  62157. 8019528: dbe7 blt.n 80194fa <memp_init_pool+0x22>
  62158. #endif /* !MEMP_MEM_MALLOC */
  62159. #if MEMP_STATS && (defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY)
  62160. desc->stats->name = desc->desc;
  62161. #endif /* MEMP_STATS && (defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY) */
  62162. }
  62163. 801952a: bf00 nop
  62164. 801952c: bf00 nop
  62165. 801952e: 3714 adds r7, #20
  62166. 8019530: 46bd mov sp, r7
  62167. 8019532: f85d 7b04 ldr.w r7, [sp], #4
  62168. 8019536: 4770 bx lr
  62169. 08019538 <memp_init>:
  62170. *
  62171. * Carves out memp_memory into linked lists for each pool-type.
  62172. */
  62173. void
  62174. memp_init(void)
  62175. {
  62176. 8019538: b580 push {r7, lr}
  62177. 801953a: b082 sub sp, #8
  62178. 801953c: af00 add r7, sp, #0
  62179. u16_t i;
  62180. /* for every pool: */
  62181. for (i = 0; i < LWIP_ARRAYSIZE(memp_pools); i++) {
  62182. 801953e: 2300 movs r3, #0
  62183. 8019540: 80fb strh r3, [r7, #6]
  62184. 8019542: e009 b.n 8019558 <memp_init+0x20>
  62185. memp_init_pool(memp_pools[i]);
  62186. 8019544: 88fb ldrh r3, [r7, #6]
  62187. 8019546: 4a08 ldr r2, [pc, #32] @ (8019568 <memp_init+0x30>)
  62188. 8019548: f852 3023 ldr.w r3, [r2, r3, lsl #2]
  62189. 801954c: 4618 mov r0, r3
  62190. 801954e: f7ff ffc3 bl 80194d8 <memp_init_pool>
  62191. for (i = 0; i < LWIP_ARRAYSIZE(memp_pools); i++) {
  62192. 8019552: 88fb ldrh r3, [r7, #6]
  62193. 8019554: 3301 adds r3, #1
  62194. 8019556: 80fb strh r3, [r7, #6]
  62195. 8019558: 88fb ldrh r3, [r7, #6]
  62196. 801955a: 2b0c cmp r3, #12
  62197. 801955c: d9f2 bls.n 8019544 <memp_init+0xc>
  62198. #if MEMP_OVERFLOW_CHECK >= 2
  62199. /* check everything a first time to see if it worked */
  62200. memp_overflow_check_all();
  62201. #endif /* MEMP_OVERFLOW_CHECK >= 2 */
  62202. }
  62203. 801955e: bf00 nop
  62204. 8019560: bf00 nop
  62205. 8019562: 3708 adds r7, #8
  62206. 8019564: 46bd mov sp, r7
  62207. 8019566: bd80 pop {r7, pc}
  62208. 8019568: 08030b8c .word 0x08030b8c
  62209. 0801956c <do_memp_malloc_pool>:
  62210. #if !MEMP_OVERFLOW_CHECK
  62211. do_memp_malloc_pool(const struct memp_desc *desc)
  62212. #else
  62213. do_memp_malloc_pool_fn(const struct memp_desc *desc, const char *file, const int line)
  62214. #endif
  62215. {
  62216. 801956c: b580 push {r7, lr}
  62217. 801956e: b084 sub sp, #16
  62218. 8019570: af00 add r7, sp, #0
  62219. 8019572: 6078 str r0, [r7, #4]
  62220. #if MEMP_MEM_MALLOC
  62221. memp = (struct memp *)mem_malloc(MEMP_SIZE + MEMP_ALIGN_SIZE(desc->size));
  62222. SYS_ARCH_PROTECT(old_level);
  62223. #else /* MEMP_MEM_MALLOC */
  62224. SYS_ARCH_PROTECT(old_level);
  62225. 8019574: f00c ff94 bl 80264a0 <sys_arch_protect>
  62226. 8019578: 60f8 str r0, [r7, #12]
  62227. memp = *desc->tab;
  62228. 801957a: 687b ldr r3, [r7, #4]
  62229. 801957c: 68db ldr r3, [r3, #12]
  62230. 801957e: 681b ldr r3, [r3, #0]
  62231. 8019580: 60bb str r3, [r7, #8]
  62232. #endif /* MEMP_MEM_MALLOC */
  62233. if (memp != NULL) {
  62234. 8019582: 68bb ldr r3, [r7, #8]
  62235. 8019584: 2b00 cmp r3, #0
  62236. 8019586: d015 beq.n 80195b4 <do_memp_malloc_pool+0x48>
  62237. #if !MEMP_MEM_MALLOC
  62238. #if MEMP_OVERFLOW_CHECK == 1
  62239. memp_overflow_check_element(memp, desc);
  62240. #endif /* MEMP_OVERFLOW_CHECK */
  62241. *desc->tab = memp->next;
  62242. 8019588: 687b ldr r3, [r7, #4]
  62243. 801958a: 68db ldr r3, [r3, #12]
  62244. 801958c: 68ba ldr r2, [r7, #8]
  62245. 801958e: 6812 ldr r2, [r2, #0]
  62246. 8019590: 601a str r2, [r3, #0]
  62247. memp->line = line;
  62248. #if MEMP_MEM_MALLOC
  62249. memp_overflow_init_element(memp, desc);
  62250. #endif /* MEMP_MEM_MALLOC */
  62251. #endif /* MEMP_OVERFLOW_CHECK */
  62252. LWIP_ASSERT("memp_malloc: memp properly aligned",
  62253. 8019592: 68bb ldr r3, [r7, #8]
  62254. 8019594: f003 0303 and.w r3, r3, #3
  62255. 8019598: 2b00 cmp r3, #0
  62256. 801959a: d006 beq.n 80195aa <do_memp_malloc_pool+0x3e>
  62257. 801959c: 4b09 ldr r3, [pc, #36] @ (80195c4 <do_memp_malloc_pool+0x58>)
  62258. 801959e: f44f 728c mov.w r2, #280 @ 0x118
  62259. 80195a2: 4909 ldr r1, [pc, #36] @ (80195c8 <do_memp_malloc_pool+0x5c>)
  62260. 80195a4: 4809 ldr r0, [pc, #36] @ (80195cc <do_memp_malloc_pool+0x60>)
  62261. 80195a6: f010 fa11 bl 80299cc <iprintf>
  62262. desc->stats->used++;
  62263. if (desc->stats->used > desc->stats->max) {
  62264. desc->stats->max = desc->stats->used;
  62265. }
  62266. #endif
  62267. SYS_ARCH_UNPROTECT(old_level);
  62268. 80195aa: 68f8 ldr r0, [r7, #12]
  62269. 80195ac: f00c ff86 bl 80264bc <sys_arch_unprotect>
  62270. /* cast through u8_t* to get rid of alignment warnings */
  62271. return ((u8_t *)memp + MEMP_SIZE);
  62272. 80195b0: 68bb ldr r3, [r7, #8]
  62273. 80195b2: e003 b.n 80195bc <do_memp_malloc_pool+0x50>
  62274. } else {
  62275. #if MEMP_STATS
  62276. desc->stats->err++;
  62277. #endif
  62278. SYS_ARCH_UNPROTECT(old_level);
  62279. 80195b4: 68f8 ldr r0, [r7, #12]
  62280. 80195b6: f00c ff81 bl 80264bc <sys_arch_unprotect>
  62281. LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", desc->desc));
  62282. }
  62283. return NULL;
  62284. 80195ba: 2300 movs r3, #0
  62285. }
  62286. 80195bc: 4618 mov r0, r3
  62287. 80195be: 3710 adds r7, #16
  62288. 80195c0: 46bd mov sp, r7
  62289. 80195c2: bd80 pop {r7, pc}
  62290. 80195c4: 0802dd8c .word 0x0802dd8c
  62291. 80195c8: 0802ddbc .word 0x0802ddbc
  62292. 80195cc: 0802dde0 .word 0x0802dde0
  62293. 080195d0 <memp_malloc_pool>:
  62294. #if !MEMP_OVERFLOW_CHECK
  62295. memp_malloc_pool(const struct memp_desc *desc)
  62296. #else
  62297. memp_malloc_pool_fn(const struct memp_desc *desc, const char *file, const int line)
  62298. #endif
  62299. {
  62300. 80195d0: b580 push {r7, lr}
  62301. 80195d2: b082 sub sp, #8
  62302. 80195d4: af00 add r7, sp, #0
  62303. 80195d6: 6078 str r0, [r7, #4]
  62304. LWIP_ASSERT("invalid pool desc", desc != NULL);
  62305. 80195d8: 687b ldr r3, [r7, #4]
  62306. 80195da: 2b00 cmp r3, #0
  62307. 80195dc: d106 bne.n 80195ec <memp_malloc_pool+0x1c>
  62308. 80195de: 4b0a ldr r3, [pc, #40] @ (8019608 <memp_malloc_pool+0x38>)
  62309. 80195e0: f44f 729e mov.w r2, #316 @ 0x13c
  62310. 80195e4: 4909 ldr r1, [pc, #36] @ (801960c <memp_malloc_pool+0x3c>)
  62311. 80195e6: 480a ldr r0, [pc, #40] @ (8019610 <memp_malloc_pool+0x40>)
  62312. 80195e8: f010 f9f0 bl 80299cc <iprintf>
  62313. if (desc == NULL) {
  62314. 80195ec: 687b ldr r3, [r7, #4]
  62315. 80195ee: 2b00 cmp r3, #0
  62316. 80195f0: d101 bne.n 80195f6 <memp_malloc_pool+0x26>
  62317. return NULL;
  62318. 80195f2: 2300 movs r3, #0
  62319. 80195f4: e003 b.n 80195fe <memp_malloc_pool+0x2e>
  62320. }
  62321. #if !MEMP_OVERFLOW_CHECK
  62322. return do_memp_malloc_pool(desc);
  62323. 80195f6: 6878 ldr r0, [r7, #4]
  62324. 80195f8: f7ff ffb8 bl 801956c <do_memp_malloc_pool>
  62325. 80195fc: 4603 mov r3, r0
  62326. #else
  62327. return do_memp_malloc_pool_fn(desc, file, line);
  62328. #endif
  62329. }
  62330. 80195fe: 4618 mov r0, r3
  62331. 8019600: 3708 adds r7, #8
  62332. 8019602: 46bd mov sp, r7
  62333. 8019604: bd80 pop {r7, pc}
  62334. 8019606: bf00 nop
  62335. 8019608: 0802dd8c .word 0x0802dd8c
  62336. 801960c: 0802de08 .word 0x0802de08
  62337. 8019610: 0802dde0 .word 0x0802dde0
  62338. 08019614 <memp_malloc>:
  62339. #if !MEMP_OVERFLOW_CHECK
  62340. memp_malloc(memp_t type)
  62341. #else
  62342. memp_malloc_fn(memp_t type, const char *file, const int line)
  62343. #endif
  62344. {
  62345. 8019614: b580 push {r7, lr}
  62346. 8019616: b084 sub sp, #16
  62347. 8019618: af00 add r7, sp, #0
  62348. 801961a: 4603 mov r3, r0
  62349. 801961c: 71fb strb r3, [r7, #7]
  62350. void *memp;
  62351. LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
  62352. 801961e: 79fb ldrb r3, [r7, #7]
  62353. 8019620: 2b0c cmp r3, #12
  62354. 8019622: d908 bls.n 8019636 <memp_malloc+0x22>
  62355. 8019624: 4b0a ldr r3, [pc, #40] @ (8019650 <memp_malloc+0x3c>)
  62356. 8019626: f240 1257 movw r2, #343 @ 0x157
  62357. 801962a: 490a ldr r1, [pc, #40] @ (8019654 <memp_malloc+0x40>)
  62358. 801962c: 480a ldr r0, [pc, #40] @ (8019658 <memp_malloc+0x44>)
  62359. 801962e: f010 f9cd bl 80299cc <iprintf>
  62360. 8019632: 2300 movs r3, #0
  62361. 8019634: e008 b.n 8019648 <memp_malloc+0x34>
  62362. #if MEMP_OVERFLOW_CHECK >= 2
  62363. memp_overflow_check_all();
  62364. #endif /* MEMP_OVERFLOW_CHECK >= 2 */
  62365. #if !MEMP_OVERFLOW_CHECK
  62366. memp = do_memp_malloc_pool(memp_pools[type]);
  62367. 8019636: 79fb ldrb r3, [r7, #7]
  62368. 8019638: 4a08 ldr r2, [pc, #32] @ (801965c <memp_malloc+0x48>)
  62369. 801963a: f852 3023 ldr.w r3, [r2, r3, lsl #2]
  62370. 801963e: 4618 mov r0, r3
  62371. 8019640: f7ff ff94 bl 801956c <do_memp_malloc_pool>
  62372. 8019644: 60f8 str r0, [r7, #12]
  62373. #else
  62374. memp = do_memp_malloc_pool_fn(memp_pools[type], file, line);
  62375. #endif
  62376. return memp;
  62377. 8019646: 68fb ldr r3, [r7, #12]
  62378. }
  62379. 8019648: 4618 mov r0, r3
  62380. 801964a: 3710 adds r7, #16
  62381. 801964c: 46bd mov sp, r7
  62382. 801964e: bd80 pop {r7, pc}
  62383. 8019650: 0802dd8c .word 0x0802dd8c
  62384. 8019654: 0802de1c .word 0x0802de1c
  62385. 8019658: 0802dde0 .word 0x0802dde0
  62386. 801965c: 08030b8c .word 0x08030b8c
  62387. 08019660 <do_memp_free_pool>:
  62388. static void
  62389. do_memp_free_pool(const struct memp_desc *desc, void *mem)
  62390. {
  62391. 8019660: b580 push {r7, lr}
  62392. 8019662: b084 sub sp, #16
  62393. 8019664: af00 add r7, sp, #0
  62394. 8019666: 6078 str r0, [r7, #4]
  62395. 8019668: 6039 str r1, [r7, #0]
  62396. struct memp *memp;
  62397. SYS_ARCH_DECL_PROTECT(old_level);
  62398. LWIP_ASSERT("memp_free: mem properly aligned",
  62399. 801966a: 683b ldr r3, [r7, #0]
  62400. 801966c: f003 0303 and.w r3, r3, #3
  62401. 8019670: 2b00 cmp r3, #0
  62402. 8019672: d006 beq.n 8019682 <do_memp_free_pool+0x22>
  62403. 8019674: 4b0d ldr r3, [pc, #52] @ (80196ac <do_memp_free_pool+0x4c>)
  62404. 8019676: f44f 72b6 mov.w r2, #364 @ 0x16c
  62405. 801967a: 490d ldr r1, [pc, #52] @ (80196b0 <do_memp_free_pool+0x50>)
  62406. 801967c: 480d ldr r0, [pc, #52] @ (80196b4 <do_memp_free_pool+0x54>)
  62407. 801967e: f010 f9a5 bl 80299cc <iprintf>
  62408. ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);
  62409. /* cast through void* to get rid of alignment warnings */
  62410. memp = (struct memp *)(void *)((u8_t *)mem - MEMP_SIZE);
  62411. 8019682: 683b ldr r3, [r7, #0]
  62412. 8019684: 60fb str r3, [r7, #12]
  62413. SYS_ARCH_PROTECT(old_level);
  62414. 8019686: f00c ff0b bl 80264a0 <sys_arch_protect>
  62415. 801968a: 60b8 str r0, [r7, #8]
  62416. #if MEMP_MEM_MALLOC
  62417. LWIP_UNUSED_ARG(desc);
  62418. SYS_ARCH_UNPROTECT(old_level);
  62419. mem_free(memp);
  62420. #else /* MEMP_MEM_MALLOC */
  62421. memp->next = *desc->tab;
  62422. 801968c: 687b ldr r3, [r7, #4]
  62423. 801968e: 68db ldr r3, [r3, #12]
  62424. 8019690: 681a ldr r2, [r3, #0]
  62425. 8019692: 68fb ldr r3, [r7, #12]
  62426. 8019694: 601a str r2, [r3, #0]
  62427. *desc->tab = memp;
  62428. 8019696: 687b ldr r3, [r7, #4]
  62429. 8019698: 68db ldr r3, [r3, #12]
  62430. 801969a: 68fa ldr r2, [r7, #12]
  62431. 801969c: 601a str r2, [r3, #0]
  62432. #if MEMP_SANITY_CHECK
  62433. LWIP_ASSERT("memp sanity", memp_sanity(desc));
  62434. #endif /* MEMP_SANITY_CHECK */
  62435. SYS_ARCH_UNPROTECT(old_level);
  62436. 801969e: 68b8 ldr r0, [r7, #8]
  62437. 80196a0: f00c ff0c bl 80264bc <sys_arch_unprotect>
  62438. #endif /* !MEMP_MEM_MALLOC */
  62439. }
  62440. 80196a4: bf00 nop
  62441. 80196a6: 3710 adds r7, #16
  62442. 80196a8: 46bd mov sp, r7
  62443. 80196aa: bd80 pop {r7, pc}
  62444. 80196ac: 0802dd8c .word 0x0802dd8c
  62445. 80196b0: 0802de3c .word 0x0802de3c
  62446. 80196b4: 0802dde0 .word 0x0802dde0
  62447. 080196b8 <memp_free_pool>:
  62448. * @param desc the pool where to put mem
  62449. * @param mem the memp element to free
  62450. */
  62451. void
  62452. memp_free_pool(const struct memp_desc *desc, void *mem)
  62453. {
  62454. 80196b8: b580 push {r7, lr}
  62455. 80196ba: b082 sub sp, #8
  62456. 80196bc: af00 add r7, sp, #0
  62457. 80196be: 6078 str r0, [r7, #4]
  62458. 80196c0: 6039 str r1, [r7, #0]
  62459. LWIP_ASSERT("invalid pool desc", desc != NULL);
  62460. 80196c2: 687b ldr r3, [r7, #4]
  62461. 80196c4: 2b00 cmp r3, #0
  62462. 80196c6: d106 bne.n 80196d6 <memp_free_pool+0x1e>
  62463. 80196c8: 4b0a ldr r3, [pc, #40] @ (80196f4 <memp_free_pool+0x3c>)
  62464. 80196ca: f240 1295 movw r2, #405 @ 0x195
  62465. 80196ce: 490a ldr r1, [pc, #40] @ (80196f8 <memp_free_pool+0x40>)
  62466. 80196d0: 480a ldr r0, [pc, #40] @ (80196fc <memp_free_pool+0x44>)
  62467. 80196d2: f010 f97b bl 80299cc <iprintf>
  62468. if ((desc == NULL) || (mem == NULL)) {
  62469. 80196d6: 687b ldr r3, [r7, #4]
  62470. 80196d8: 2b00 cmp r3, #0
  62471. 80196da: d007 beq.n 80196ec <memp_free_pool+0x34>
  62472. 80196dc: 683b ldr r3, [r7, #0]
  62473. 80196de: 2b00 cmp r3, #0
  62474. 80196e0: d004 beq.n 80196ec <memp_free_pool+0x34>
  62475. return;
  62476. }
  62477. do_memp_free_pool(desc, mem);
  62478. 80196e2: 6839 ldr r1, [r7, #0]
  62479. 80196e4: 6878 ldr r0, [r7, #4]
  62480. 80196e6: f7ff ffbb bl 8019660 <do_memp_free_pool>
  62481. 80196ea: e000 b.n 80196ee <memp_free_pool+0x36>
  62482. return;
  62483. 80196ec: bf00 nop
  62484. }
  62485. 80196ee: 3708 adds r7, #8
  62486. 80196f0: 46bd mov sp, r7
  62487. 80196f2: bd80 pop {r7, pc}
  62488. 80196f4: 0802dd8c .word 0x0802dd8c
  62489. 80196f8: 0802de08 .word 0x0802de08
  62490. 80196fc: 0802dde0 .word 0x0802dde0
  62491. 08019700 <memp_free>:
  62492. * @param type the pool where to put mem
  62493. * @param mem the memp element to free
  62494. */
  62495. void
  62496. memp_free(memp_t type, void *mem)
  62497. {
  62498. 8019700: b580 push {r7, lr}
  62499. 8019702: b082 sub sp, #8
  62500. 8019704: af00 add r7, sp, #0
  62501. 8019706: 4603 mov r3, r0
  62502. 8019708: 6039 str r1, [r7, #0]
  62503. 801970a: 71fb strb r3, [r7, #7]
  62504. #ifdef LWIP_HOOK_MEMP_AVAILABLE
  62505. struct memp *old_first;
  62506. #endif
  62507. LWIP_ERROR("memp_free: type < MEMP_MAX", (type < MEMP_MAX), return;);
  62508. 801970c: 79fb ldrb r3, [r7, #7]
  62509. 801970e: 2b0c cmp r3, #12
  62510. 8019710: d907 bls.n 8019722 <memp_free+0x22>
  62511. 8019712: 4b0c ldr r3, [pc, #48] @ (8019744 <memp_free+0x44>)
  62512. 8019714: f44f 72d5 mov.w r2, #426 @ 0x1aa
  62513. 8019718: 490b ldr r1, [pc, #44] @ (8019748 <memp_free+0x48>)
  62514. 801971a: 480c ldr r0, [pc, #48] @ (801974c <memp_free+0x4c>)
  62515. 801971c: f010 f956 bl 80299cc <iprintf>
  62516. 8019720: e00c b.n 801973c <memp_free+0x3c>
  62517. if (mem == NULL) {
  62518. 8019722: 683b ldr r3, [r7, #0]
  62519. 8019724: 2b00 cmp r3, #0
  62520. 8019726: d008 beq.n 801973a <memp_free+0x3a>
  62521. #ifdef LWIP_HOOK_MEMP_AVAILABLE
  62522. old_first = *memp_pools[type]->tab;
  62523. #endif
  62524. do_memp_free_pool(memp_pools[type], mem);
  62525. 8019728: 79fb ldrb r3, [r7, #7]
  62526. 801972a: 4a09 ldr r2, [pc, #36] @ (8019750 <memp_free+0x50>)
  62527. 801972c: f852 3023 ldr.w r3, [r2, r3, lsl #2]
  62528. 8019730: 6839 ldr r1, [r7, #0]
  62529. 8019732: 4618 mov r0, r3
  62530. 8019734: f7ff ff94 bl 8019660 <do_memp_free_pool>
  62531. 8019738: e000 b.n 801973c <memp_free+0x3c>
  62532. return;
  62533. 801973a: bf00 nop
  62534. #ifdef LWIP_HOOK_MEMP_AVAILABLE
  62535. if (old_first == NULL) {
  62536. LWIP_HOOK_MEMP_AVAILABLE(type);
  62537. }
  62538. #endif
  62539. }
  62540. 801973c: 3708 adds r7, #8
  62541. 801973e: 46bd mov sp, r7
  62542. 8019740: bd80 pop {r7, pc}
  62543. 8019742: bf00 nop
  62544. 8019744: 0802dd8c .word 0x0802dd8c
  62545. 8019748: 0802de5c .word 0x0802de5c
  62546. 801974c: 0802dde0 .word 0x0802dde0
  62547. 8019750: 08030b8c .word 0x08030b8c
  62548. 08019754 <netif_init>:
  62549. }
  62550. #endif /* LWIP_HAVE_LOOPIF */
  62551. void
  62552. netif_init(void)
  62553. {
  62554. 8019754: b480 push {r7}
  62555. 8019756: af00 add r7, sp, #0
  62556. netif_set_link_up(&loop_netif);
  62557. netif_set_up(&loop_netif);
  62558. #endif /* LWIP_HAVE_LOOPIF */
  62559. }
  62560. 8019758: bf00 nop
  62561. 801975a: 46bd mov sp, r7
  62562. 801975c: f85d 7b04 ldr.w r7, [sp], #4
  62563. 8019760: 4770 bx lr
  62564. ...
  62565. 08019764 <netif_add>:
  62566. netif_add(struct netif *netif,
  62567. #if LWIP_IPV4
  62568. const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,
  62569. #endif /* LWIP_IPV4 */
  62570. void *state, netif_init_fn init, netif_input_fn input)
  62571. {
  62572. 8019764: b580 push {r7, lr}
  62573. 8019766: b086 sub sp, #24
  62574. 8019768: af00 add r7, sp, #0
  62575. 801976a: 60f8 str r0, [r7, #12]
  62576. 801976c: 60b9 str r1, [r7, #8]
  62577. 801976e: 607a str r2, [r7, #4]
  62578. 8019770: 603b str r3, [r7, #0]
  62579. #if LWIP_IPV6
  62580. s8_t i;
  62581. #endif
  62582. LWIP_ASSERT_CORE_LOCKED();
  62583. 8019772: f7f6 fedd bl 8010530 <sys_check_core_locking>
  62584. LWIP_ASSERT("single netif already set", 0);
  62585. return NULL;
  62586. }
  62587. #endif
  62588. LWIP_ERROR("netif_add: invalid netif", netif != NULL, return NULL);
  62589. 8019776: 68fb ldr r3, [r7, #12]
  62590. 8019778: 2b00 cmp r3, #0
  62591. 801977a: d108 bne.n 801978e <netif_add+0x2a>
  62592. 801977c: 4b5b ldr r3, [pc, #364] @ (80198ec <netif_add+0x188>)
  62593. 801977e: f240 1227 movw r2, #295 @ 0x127
  62594. 8019782: 495b ldr r1, [pc, #364] @ (80198f0 <netif_add+0x18c>)
  62595. 8019784: 485b ldr r0, [pc, #364] @ (80198f4 <netif_add+0x190>)
  62596. 8019786: f010 f921 bl 80299cc <iprintf>
  62597. 801978a: 2300 movs r3, #0
  62598. 801978c: e0a9 b.n 80198e2 <netif_add+0x17e>
  62599. LWIP_ERROR("netif_add: No init function given", init != NULL, return NULL);
  62600. 801978e: 6a7b ldr r3, [r7, #36] @ 0x24
  62601. 8019790: 2b00 cmp r3, #0
  62602. 8019792: d108 bne.n 80197a6 <netif_add+0x42>
  62603. 8019794: 4b55 ldr r3, [pc, #340] @ (80198ec <netif_add+0x188>)
  62604. 8019796: f44f 7294 mov.w r2, #296 @ 0x128
  62605. 801979a: 4957 ldr r1, [pc, #348] @ (80198f8 <netif_add+0x194>)
  62606. 801979c: 4855 ldr r0, [pc, #340] @ (80198f4 <netif_add+0x190>)
  62607. 801979e: f010 f915 bl 80299cc <iprintf>
  62608. 80197a2: 2300 movs r3, #0
  62609. 80197a4: e09d b.n 80198e2 <netif_add+0x17e>
  62610. #if LWIP_IPV4
  62611. if (ipaddr == NULL) {
  62612. 80197a6: 68bb ldr r3, [r7, #8]
  62613. 80197a8: 2b00 cmp r3, #0
  62614. 80197aa: d101 bne.n 80197b0 <netif_add+0x4c>
  62615. ipaddr = ip_2_ip4(IP4_ADDR_ANY);
  62616. 80197ac: 4b53 ldr r3, [pc, #332] @ (80198fc <netif_add+0x198>)
  62617. 80197ae: 60bb str r3, [r7, #8]
  62618. }
  62619. if (netmask == NULL) {
  62620. 80197b0: 687b ldr r3, [r7, #4]
  62621. 80197b2: 2b00 cmp r3, #0
  62622. 80197b4: d101 bne.n 80197ba <netif_add+0x56>
  62623. netmask = ip_2_ip4(IP4_ADDR_ANY);
  62624. 80197b6: 4b51 ldr r3, [pc, #324] @ (80198fc <netif_add+0x198>)
  62625. 80197b8: 607b str r3, [r7, #4]
  62626. }
  62627. if (gw == NULL) {
  62628. 80197ba: 683b ldr r3, [r7, #0]
  62629. 80197bc: 2b00 cmp r3, #0
  62630. 80197be: d101 bne.n 80197c4 <netif_add+0x60>
  62631. gw = ip_2_ip4(IP4_ADDR_ANY);
  62632. 80197c0: 4b4e ldr r3, [pc, #312] @ (80198fc <netif_add+0x198>)
  62633. 80197c2: 603b str r3, [r7, #0]
  62634. }
  62635. /* reset new interface configuration state */
  62636. ip_addr_set_zero_ip4(&netif->ip_addr);
  62637. 80197c4: 68fb ldr r3, [r7, #12]
  62638. 80197c6: 2200 movs r2, #0
  62639. 80197c8: 605a str r2, [r3, #4]
  62640. ip_addr_set_zero_ip4(&netif->netmask);
  62641. 80197ca: 68fb ldr r3, [r7, #12]
  62642. 80197cc: 2200 movs r2, #0
  62643. 80197ce: 609a str r2, [r3, #8]
  62644. ip_addr_set_zero_ip4(&netif->gw);
  62645. 80197d0: 68fb ldr r3, [r7, #12]
  62646. 80197d2: 2200 movs r2, #0
  62647. 80197d4: 60da str r2, [r3, #12]
  62648. netif->output = netif_null_output_ip4;
  62649. 80197d6: 68fb ldr r3, [r7, #12]
  62650. 80197d8: 4a49 ldr r2, [pc, #292] @ (8019900 <netif_add+0x19c>)
  62651. 80197da: 615a str r2, [r3, #20]
  62652. #endif /* LWIP_IPV6_ADDRESS_LIFETIMES */
  62653. }
  62654. netif->output_ip6 = netif_null_output_ip6;
  62655. #endif /* LWIP_IPV6 */
  62656. NETIF_SET_CHECKSUM_CTRL(netif, NETIF_CHECKSUM_ENABLE_ALL);
  62657. netif->mtu = 0;
  62658. 80197dc: 68fb ldr r3, [r7, #12]
  62659. 80197de: 2200 movs r2, #0
  62660. 80197e0: 851a strh r2, [r3, #40] @ 0x28
  62661. netif->flags = 0;
  62662. 80197e2: 68fb ldr r3, [r7, #12]
  62663. 80197e4: 2200 movs r2, #0
  62664. 80197e6: f883 2031 strb.w r2, [r3, #49] @ 0x31
  62665. #ifdef netif_get_client_data
  62666. memset(netif->client_data, 0, sizeof(netif->client_data));
  62667. 80197ea: 68fb ldr r3, [r7, #12]
  62668. 80197ec: 3324 adds r3, #36 @ 0x24
  62669. 80197ee: 2204 movs r2, #4
  62670. 80197f0: 2100 movs r1, #0
  62671. 80197f2: 4618 mov r0, r3
  62672. 80197f4: f010 fa7c bl 8029cf0 <memset>
  62673. #endif /* LWIP_IPV6 */
  62674. #if LWIP_NETIF_STATUS_CALLBACK
  62675. netif->status_callback = NULL;
  62676. #endif /* LWIP_NETIF_STATUS_CALLBACK */
  62677. #if LWIP_NETIF_LINK_CALLBACK
  62678. netif->link_callback = NULL;
  62679. 80197f8: 68fb ldr r3, [r7, #12]
  62680. 80197fa: 2200 movs r2, #0
  62681. 80197fc: 61da str r2, [r3, #28]
  62682. netif->loop_first = NULL;
  62683. netif->loop_last = NULL;
  62684. #endif /* ENABLE_LOOPBACK */
  62685. /* remember netif specific state information data */
  62686. netif->state = state;
  62687. 80197fe: 68fb ldr r3, [r7, #12]
  62688. 8019800: 6a3a ldr r2, [r7, #32]
  62689. 8019802: 621a str r2, [r3, #32]
  62690. netif->num = netif_num;
  62691. 8019804: 4b3f ldr r3, [pc, #252] @ (8019904 <netif_add+0x1a0>)
  62692. 8019806: 781a ldrb r2, [r3, #0]
  62693. 8019808: 68fb ldr r3, [r7, #12]
  62694. 801980a: f883 2034 strb.w r2, [r3, #52] @ 0x34
  62695. netif->input = input;
  62696. 801980e: 68fb ldr r3, [r7, #12]
  62697. 8019810: 6aba ldr r2, [r7, #40] @ 0x28
  62698. 8019812: 611a str r2, [r3, #16]
  62699. #if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS
  62700. netif->loop_cnt_current = 0;
  62701. #endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */
  62702. #if LWIP_IPV4
  62703. netif_set_addr(netif, ipaddr, netmask, gw);
  62704. 8019814: 683b ldr r3, [r7, #0]
  62705. 8019816: 687a ldr r2, [r7, #4]
  62706. 8019818: 68b9 ldr r1, [r7, #8]
  62707. 801981a: 68f8 ldr r0, [r7, #12]
  62708. 801981c: f000 f914 bl 8019a48 <netif_set_addr>
  62709. #endif /* LWIP_IPV4 */
  62710. /* call user specified initialization function for netif */
  62711. if (init(netif) != ERR_OK) {
  62712. 8019820: 6a7b ldr r3, [r7, #36] @ 0x24
  62713. 8019822: 68f8 ldr r0, [r7, #12]
  62714. 8019824: 4798 blx r3
  62715. 8019826: 4603 mov r3, r0
  62716. 8019828: 2b00 cmp r3, #0
  62717. 801982a: d001 beq.n 8019830 <netif_add+0xcc>
  62718. return NULL;
  62719. 801982c: 2300 movs r3, #0
  62720. 801982e: e058 b.n 80198e2 <netif_add+0x17e>
  62721. */
  62722. {
  62723. struct netif *netif2;
  62724. int num_netifs;
  62725. do {
  62726. if (netif->num == 255) {
  62727. 8019830: 68fb ldr r3, [r7, #12]
  62728. 8019832: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  62729. 8019836: 2bff cmp r3, #255 @ 0xff
  62730. 8019838: d103 bne.n 8019842 <netif_add+0xde>
  62731. netif->num = 0;
  62732. 801983a: 68fb ldr r3, [r7, #12]
  62733. 801983c: 2200 movs r2, #0
  62734. 801983e: f883 2034 strb.w r2, [r3, #52] @ 0x34
  62735. }
  62736. num_netifs = 0;
  62737. 8019842: 2300 movs r3, #0
  62738. 8019844: 613b str r3, [r7, #16]
  62739. for (netif2 = netif_list; netif2 != NULL; netif2 = netif2->next) {
  62740. 8019846: 4b30 ldr r3, [pc, #192] @ (8019908 <netif_add+0x1a4>)
  62741. 8019848: 681b ldr r3, [r3, #0]
  62742. 801984a: 617b str r3, [r7, #20]
  62743. 801984c: e02b b.n 80198a6 <netif_add+0x142>
  62744. LWIP_ASSERT("netif already added", netif2 != netif);
  62745. 801984e: 697a ldr r2, [r7, #20]
  62746. 8019850: 68fb ldr r3, [r7, #12]
  62747. 8019852: 429a cmp r2, r3
  62748. 8019854: d106 bne.n 8019864 <netif_add+0x100>
  62749. 8019856: 4b25 ldr r3, [pc, #148] @ (80198ec <netif_add+0x188>)
  62750. 8019858: f240 128b movw r2, #395 @ 0x18b
  62751. 801985c: 492b ldr r1, [pc, #172] @ (801990c <netif_add+0x1a8>)
  62752. 801985e: 4825 ldr r0, [pc, #148] @ (80198f4 <netif_add+0x190>)
  62753. 8019860: f010 f8b4 bl 80299cc <iprintf>
  62754. num_netifs++;
  62755. 8019864: 693b ldr r3, [r7, #16]
  62756. 8019866: 3301 adds r3, #1
  62757. 8019868: 613b str r3, [r7, #16]
  62758. LWIP_ASSERT("too many netifs, max. supported number is 255", num_netifs <= 255);
  62759. 801986a: 693b ldr r3, [r7, #16]
  62760. 801986c: 2bff cmp r3, #255 @ 0xff
  62761. 801986e: dd06 ble.n 801987e <netif_add+0x11a>
  62762. 8019870: 4b1e ldr r3, [pc, #120] @ (80198ec <netif_add+0x188>)
  62763. 8019872: f240 128d movw r2, #397 @ 0x18d
  62764. 8019876: 4926 ldr r1, [pc, #152] @ (8019910 <netif_add+0x1ac>)
  62765. 8019878: 481e ldr r0, [pc, #120] @ (80198f4 <netif_add+0x190>)
  62766. 801987a: f010 f8a7 bl 80299cc <iprintf>
  62767. if (netif2->num == netif->num) {
  62768. 801987e: 697b ldr r3, [r7, #20]
  62769. 8019880: f893 2034 ldrb.w r2, [r3, #52] @ 0x34
  62770. 8019884: 68fb ldr r3, [r7, #12]
  62771. 8019886: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  62772. 801988a: 429a cmp r2, r3
  62773. 801988c: d108 bne.n 80198a0 <netif_add+0x13c>
  62774. netif->num++;
  62775. 801988e: 68fb ldr r3, [r7, #12]
  62776. 8019890: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  62777. 8019894: 3301 adds r3, #1
  62778. 8019896: b2da uxtb r2, r3
  62779. 8019898: 68fb ldr r3, [r7, #12]
  62780. 801989a: f883 2034 strb.w r2, [r3, #52] @ 0x34
  62781. break;
  62782. 801989e: e005 b.n 80198ac <netif_add+0x148>
  62783. for (netif2 = netif_list; netif2 != NULL; netif2 = netif2->next) {
  62784. 80198a0: 697b ldr r3, [r7, #20]
  62785. 80198a2: 681b ldr r3, [r3, #0]
  62786. 80198a4: 617b str r3, [r7, #20]
  62787. 80198a6: 697b ldr r3, [r7, #20]
  62788. 80198a8: 2b00 cmp r3, #0
  62789. 80198aa: d1d0 bne.n 801984e <netif_add+0xea>
  62790. }
  62791. }
  62792. } while (netif2 != NULL);
  62793. 80198ac: 697b ldr r3, [r7, #20]
  62794. 80198ae: 2b00 cmp r3, #0
  62795. 80198b0: d1be bne.n 8019830 <netif_add+0xcc>
  62796. }
  62797. if (netif->num == 254) {
  62798. 80198b2: 68fb ldr r3, [r7, #12]
  62799. 80198b4: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  62800. 80198b8: 2bfe cmp r3, #254 @ 0xfe
  62801. 80198ba: d103 bne.n 80198c4 <netif_add+0x160>
  62802. netif_num = 0;
  62803. 80198bc: 4b11 ldr r3, [pc, #68] @ (8019904 <netif_add+0x1a0>)
  62804. 80198be: 2200 movs r2, #0
  62805. 80198c0: 701a strb r2, [r3, #0]
  62806. 80198c2: e006 b.n 80198d2 <netif_add+0x16e>
  62807. } else {
  62808. netif_num = (u8_t)(netif->num + 1);
  62809. 80198c4: 68fb ldr r3, [r7, #12]
  62810. 80198c6: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  62811. 80198ca: 3301 adds r3, #1
  62812. 80198cc: b2da uxtb r2, r3
  62813. 80198ce: 4b0d ldr r3, [pc, #52] @ (8019904 <netif_add+0x1a0>)
  62814. 80198d0: 701a strb r2, [r3, #0]
  62815. }
  62816. /* add this netif to the list */
  62817. netif->next = netif_list;
  62818. 80198d2: 4b0d ldr r3, [pc, #52] @ (8019908 <netif_add+0x1a4>)
  62819. 80198d4: 681a ldr r2, [r3, #0]
  62820. 80198d6: 68fb ldr r3, [r7, #12]
  62821. 80198d8: 601a str r2, [r3, #0]
  62822. netif_list = netif;
  62823. 80198da: 4a0b ldr r2, [pc, #44] @ (8019908 <netif_add+0x1a4>)
  62824. 80198dc: 68fb ldr r3, [r7, #12]
  62825. 80198de: 6013 str r3, [r2, #0]
  62826. #endif /* LWIP_IPV4 */
  62827. LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
  62828. netif_invoke_ext_callback(netif, LWIP_NSC_NETIF_ADDED, NULL);
  62829. return netif;
  62830. 80198e0: 68fb ldr r3, [r7, #12]
  62831. }
  62832. 80198e2: 4618 mov r0, r3
  62833. 80198e4: 3718 adds r7, #24
  62834. 80198e6: 46bd mov sp, r7
  62835. 80198e8: bd80 pop {r7, pc}
  62836. 80198ea: bf00 nop
  62837. 80198ec: 0802de78 .word 0x0802de78
  62838. 80198f0: 0802df0c .word 0x0802df0c
  62839. 80198f4: 0802dec8 .word 0x0802dec8
  62840. 80198f8: 0802df28 .word 0x0802df28
  62841. 80198fc: 08030c10 .word 0x08030c10
  62842. 8019900: 08019d3f .word 0x08019d3f
  62843. 8019904: 2402ae84 .word 0x2402ae84
  62844. 8019908: 2402ae7c .word 0x2402ae7c
  62845. 801990c: 0802df4c .word 0x0802df4c
  62846. 8019910: 0802df60 .word 0x0802df60
  62847. 08019914 <netif_do_ip_addr_changed>:
  62848. static void
  62849. netif_do_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr)
  62850. {
  62851. 8019914: b580 push {r7, lr}
  62852. 8019916: b082 sub sp, #8
  62853. 8019918: af00 add r7, sp, #0
  62854. 801991a: 6078 str r0, [r7, #4]
  62855. 801991c: 6039 str r1, [r7, #0]
  62856. #if LWIP_TCP
  62857. tcp_netif_ip_addr_changed(old_addr, new_addr);
  62858. 801991e: 6839 ldr r1, [r7, #0]
  62859. 8019920: 6878 ldr r0, [r7, #4]
  62860. 8019922: f002 fe6f bl 801c604 <tcp_netif_ip_addr_changed>
  62861. #endif /* LWIP_TCP */
  62862. #if LWIP_UDP
  62863. udp_netif_ip_addr_changed(old_addr, new_addr);
  62864. 8019926: 6839 ldr r1, [r7, #0]
  62865. 8019928: 6878 ldr r0, [r7, #4]
  62866. 801992a: f008 f82b bl 8021984 <udp_netif_ip_addr_changed>
  62867. #endif /* LWIP_UDP */
  62868. #if LWIP_RAW
  62869. raw_netif_ip_addr_changed(old_addr, new_addr);
  62870. #endif /* LWIP_RAW */
  62871. }
  62872. 801992e: bf00 nop
  62873. 8019930: 3708 adds r7, #8
  62874. 8019932: 46bd mov sp, r7
  62875. 8019934: bd80 pop {r7, pc}
  62876. ...
  62877. 08019938 <netif_do_set_ipaddr>:
  62878. #if LWIP_IPV4
  62879. static int
  62880. netif_do_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr, ip_addr_t *old_addr)
  62881. {
  62882. 8019938: b580 push {r7, lr}
  62883. 801993a: b086 sub sp, #24
  62884. 801993c: af00 add r7, sp, #0
  62885. 801993e: 60f8 str r0, [r7, #12]
  62886. 8019940: 60b9 str r1, [r7, #8]
  62887. 8019942: 607a str r2, [r7, #4]
  62888. LWIP_ASSERT("invalid pointer", ipaddr != NULL);
  62889. 8019944: 68bb ldr r3, [r7, #8]
  62890. 8019946: 2b00 cmp r3, #0
  62891. 8019948: d106 bne.n 8019958 <netif_do_set_ipaddr+0x20>
  62892. 801994a: 4b1d ldr r3, [pc, #116] @ (80199c0 <netif_do_set_ipaddr+0x88>)
  62893. 801994c: f240 12cb movw r2, #459 @ 0x1cb
  62894. 8019950: 491c ldr r1, [pc, #112] @ (80199c4 <netif_do_set_ipaddr+0x8c>)
  62895. 8019952: 481d ldr r0, [pc, #116] @ (80199c8 <netif_do_set_ipaddr+0x90>)
  62896. 8019954: f010 f83a bl 80299cc <iprintf>
  62897. LWIP_ASSERT("invalid pointer", old_addr != NULL);
  62898. 8019958: 687b ldr r3, [r7, #4]
  62899. 801995a: 2b00 cmp r3, #0
  62900. 801995c: d106 bne.n 801996c <netif_do_set_ipaddr+0x34>
  62901. 801995e: 4b18 ldr r3, [pc, #96] @ (80199c0 <netif_do_set_ipaddr+0x88>)
  62902. 8019960: f44f 72e6 mov.w r2, #460 @ 0x1cc
  62903. 8019964: 4917 ldr r1, [pc, #92] @ (80199c4 <netif_do_set_ipaddr+0x8c>)
  62904. 8019966: 4818 ldr r0, [pc, #96] @ (80199c8 <netif_do_set_ipaddr+0x90>)
  62905. 8019968: f010 f830 bl 80299cc <iprintf>
  62906. /* address is actually being changed? */
  62907. if (ip4_addr_cmp(ipaddr, netif_ip4_addr(netif)) == 0) {
  62908. 801996c: 68bb ldr r3, [r7, #8]
  62909. 801996e: 681a ldr r2, [r3, #0]
  62910. 8019970: 68fb ldr r3, [r7, #12]
  62911. 8019972: 3304 adds r3, #4
  62912. 8019974: 681b ldr r3, [r3, #0]
  62913. 8019976: 429a cmp r2, r3
  62914. 8019978: d01c beq.n 80199b4 <netif_do_set_ipaddr+0x7c>
  62915. ip_addr_t new_addr;
  62916. *ip_2_ip4(&new_addr) = *ipaddr;
  62917. 801997a: 68bb ldr r3, [r7, #8]
  62918. 801997c: 681b ldr r3, [r3, #0]
  62919. 801997e: 617b str r3, [r7, #20]
  62920. IP_SET_TYPE_VAL(new_addr, IPADDR_TYPE_V4);
  62921. ip_addr_copy(*old_addr, *netif_ip_addr4(netif));
  62922. 8019980: 68fb ldr r3, [r7, #12]
  62923. 8019982: 3304 adds r3, #4
  62924. 8019984: 681a ldr r2, [r3, #0]
  62925. 8019986: 687b ldr r3, [r7, #4]
  62926. 8019988: 601a str r2, [r3, #0]
  62927. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
  62928. netif_do_ip_addr_changed(old_addr, &new_addr);
  62929. 801998a: f107 0314 add.w r3, r7, #20
  62930. 801998e: 4619 mov r1, r3
  62931. 8019990: 6878 ldr r0, [r7, #4]
  62932. 8019992: f7ff ffbf bl 8019914 <netif_do_ip_addr_changed>
  62933. mib2_remove_ip4(netif);
  62934. mib2_remove_route_ip4(0, netif);
  62935. /* set new IP address to netif */
  62936. ip4_addr_set(ip_2_ip4(&netif->ip_addr), ipaddr);
  62937. 8019996: 68bb ldr r3, [r7, #8]
  62938. 8019998: 2b00 cmp r3, #0
  62939. 801999a: d002 beq.n 80199a2 <netif_do_set_ipaddr+0x6a>
  62940. 801999c: 68bb ldr r3, [r7, #8]
  62941. 801999e: 681b ldr r3, [r3, #0]
  62942. 80199a0: e000 b.n 80199a4 <netif_do_set_ipaddr+0x6c>
  62943. 80199a2: 2300 movs r3, #0
  62944. 80199a4: 68fa ldr r2, [r7, #12]
  62945. 80199a6: 6053 str r3, [r2, #4]
  62946. IP_SET_TYPE_VAL(netif->ip_addr, IPADDR_TYPE_V4);
  62947. mib2_add_ip4(netif);
  62948. mib2_add_route_ip4(0, netif);
  62949. netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4);
  62950. 80199a8: 2101 movs r1, #1
  62951. 80199aa: 68f8 ldr r0, [r7, #12]
  62952. 80199ac: f000 f8d6 bl 8019b5c <netif_issue_reports>
  62953. NETIF_STATUS_CALLBACK(netif);
  62954. return 1; /* address changed */
  62955. 80199b0: 2301 movs r3, #1
  62956. 80199b2: e000 b.n 80199b6 <netif_do_set_ipaddr+0x7e>
  62957. }
  62958. return 0; /* address unchanged */
  62959. 80199b4: 2300 movs r3, #0
  62960. }
  62961. 80199b6: 4618 mov r0, r3
  62962. 80199b8: 3718 adds r7, #24
  62963. 80199ba: 46bd mov sp, r7
  62964. 80199bc: bd80 pop {r7, pc}
  62965. 80199be: bf00 nop
  62966. 80199c0: 0802de78 .word 0x0802de78
  62967. 80199c4: 0802df90 .word 0x0802df90
  62968. 80199c8: 0802dec8 .word 0x0802dec8
  62969. 080199cc <netif_do_set_netmask>:
  62970. }
  62971. }
  62972. static int
  62973. netif_do_set_netmask(struct netif *netif, const ip4_addr_t *netmask, ip_addr_t *old_nm)
  62974. {
  62975. 80199cc: b480 push {r7}
  62976. 80199ce: b085 sub sp, #20
  62977. 80199d0: af00 add r7, sp, #0
  62978. 80199d2: 60f8 str r0, [r7, #12]
  62979. 80199d4: 60b9 str r1, [r7, #8]
  62980. 80199d6: 607a str r2, [r7, #4]
  62981. /* address is actually being changed? */
  62982. if (ip4_addr_cmp(netmask, netif_ip4_netmask(netif)) == 0) {
  62983. 80199d8: 68bb ldr r3, [r7, #8]
  62984. 80199da: 681a ldr r2, [r3, #0]
  62985. 80199dc: 68fb ldr r3, [r7, #12]
  62986. 80199de: 3308 adds r3, #8
  62987. 80199e0: 681b ldr r3, [r3, #0]
  62988. 80199e2: 429a cmp r2, r3
  62989. 80199e4: d00a beq.n 80199fc <netif_do_set_netmask+0x30>
  62990. #else
  62991. LWIP_UNUSED_ARG(old_nm);
  62992. #endif
  62993. mib2_remove_route_ip4(0, netif);
  62994. /* set new netmask to netif */
  62995. ip4_addr_set(ip_2_ip4(&netif->netmask), netmask);
  62996. 80199e6: 68bb ldr r3, [r7, #8]
  62997. 80199e8: 2b00 cmp r3, #0
  62998. 80199ea: d002 beq.n 80199f2 <netif_do_set_netmask+0x26>
  62999. 80199ec: 68bb ldr r3, [r7, #8]
  63000. 80199ee: 681b ldr r3, [r3, #0]
  63001. 80199f0: e000 b.n 80199f4 <netif_do_set_netmask+0x28>
  63002. 80199f2: 2300 movs r3, #0
  63003. 80199f4: 68fa ldr r2, [r7, #12]
  63004. 80199f6: 6093 str r3, [r2, #8]
  63005. netif->name[0], netif->name[1],
  63006. ip4_addr1_16(netif_ip4_netmask(netif)),
  63007. ip4_addr2_16(netif_ip4_netmask(netif)),
  63008. ip4_addr3_16(netif_ip4_netmask(netif)),
  63009. ip4_addr4_16(netif_ip4_netmask(netif))));
  63010. return 1; /* netmask changed */
  63011. 80199f8: 2301 movs r3, #1
  63012. 80199fa: e000 b.n 80199fe <netif_do_set_netmask+0x32>
  63013. }
  63014. return 0; /* netmask unchanged */
  63015. 80199fc: 2300 movs r3, #0
  63016. }
  63017. 80199fe: 4618 mov r0, r3
  63018. 8019a00: 3714 adds r7, #20
  63019. 8019a02: 46bd mov sp, r7
  63020. 8019a04: f85d 7b04 ldr.w r7, [sp], #4
  63021. 8019a08: 4770 bx lr
  63022. 08019a0a <netif_do_set_gw>:
  63023. }
  63024. }
  63025. static int
  63026. netif_do_set_gw(struct netif *netif, const ip4_addr_t *gw, ip_addr_t *old_gw)
  63027. {
  63028. 8019a0a: b480 push {r7}
  63029. 8019a0c: b085 sub sp, #20
  63030. 8019a0e: af00 add r7, sp, #0
  63031. 8019a10: 60f8 str r0, [r7, #12]
  63032. 8019a12: 60b9 str r1, [r7, #8]
  63033. 8019a14: 607a str r2, [r7, #4]
  63034. /* address is actually being changed? */
  63035. if (ip4_addr_cmp(gw, netif_ip4_gw(netif)) == 0) {
  63036. 8019a16: 68bb ldr r3, [r7, #8]
  63037. 8019a18: 681a ldr r2, [r3, #0]
  63038. 8019a1a: 68fb ldr r3, [r7, #12]
  63039. 8019a1c: 330c adds r3, #12
  63040. 8019a1e: 681b ldr r3, [r3, #0]
  63041. 8019a20: 429a cmp r2, r3
  63042. 8019a22: d00a beq.n 8019a3a <netif_do_set_gw+0x30>
  63043. ip_addr_copy(*old_gw, *netif_ip_gw4(netif));
  63044. #else
  63045. LWIP_UNUSED_ARG(old_gw);
  63046. #endif
  63047. ip4_addr_set(ip_2_ip4(&netif->gw), gw);
  63048. 8019a24: 68bb ldr r3, [r7, #8]
  63049. 8019a26: 2b00 cmp r3, #0
  63050. 8019a28: d002 beq.n 8019a30 <netif_do_set_gw+0x26>
  63051. 8019a2a: 68bb ldr r3, [r7, #8]
  63052. 8019a2c: 681b ldr r3, [r3, #0]
  63053. 8019a2e: e000 b.n 8019a32 <netif_do_set_gw+0x28>
  63054. 8019a30: 2300 movs r3, #0
  63055. 8019a32: 68fa ldr r2, [r7, #12]
  63056. 8019a34: 60d3 str r3, [r2, #12]
  63057. netif->name[0], netif->name[1],
  63058. ip4_addr1_16(netif_ip4_gw(netif)),
  63059. ip4_addr2_16(netif_ip4_gw(netif)),
  63060. ip4_addr3_16(netif_ip4_gw(netif)),
  63061. ip4_addr4_16(netif_ip4_gw(netif))));
  63062. return 1; /* gateway changed */
  63063. 8019a36: 2301 movs r3, #1
  63064. 8019a38: e000 b.n 8019a3c <netif_do_set_gw+0x32>
  63065. }
  63066. return 0; /* gateway unchanged */
  63067. 8019a3a: 2300 movs r3, #0
  63068. }
  63069. 8019a3c: 4618 mov r0, r3
  63070. 8019a3e: 3714 adds r7, #20
  63071. 8019a40: 46bd mov sp, r7
  63072. 8019a42: f85d 7b04 ldr.w r7, [sp], #4
  63073. 8019a46: 4770 bx lr
  63074. 08019a48 <netif_set_addr>:
  63075. * @param gw the new default gateway
  63076. */
  63077. void
  63078. netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask,
  63079. const ip4_addr_t *gw)
  63080. {
  63081. 8019a48: b580 push {r7, lr}
  63082. 8019a4a: b088 sub sp, #32
  63083. 8019a4c: af00 add r7, sp, #0
  63084. 8019a4e: 60f8 str r0, [r7, #12]
  63085. 8019a50: 60b9 str r1, [r7, #8]
  63086. 8019a52: 607a str r2, [r7, #4]
  63087. 8019a54: 603b str r3, [r7, #0]
  63088. ip_addr_t old_nm_val;
  63089. ip_addr_t old_gw_val;
  63090. ip_addr_t *old_nm = &old_nm_val;
  63091. ip_addr_t *old_gw = &old_gw_val;
  63092. #else
  63093. ip_addr_t *old_nm = NULL;
  63094. 8019a56: 2300 movs r3, #0
  63095. 8019a58: 61fb str r3, [r7, #28]
  63096. ip_addr_t *old_gw = NULL;
  63097. 8019a5a: 2300 movs r3, #0
  63098. 8019a5c: 61bb str r3, [r7, #24]
  63099. #endif
  63100. ip_addr_t old_addr;
  63101. int remove;
  63102. LWIP_ASSERT_CORE_LOCKED();
  63103. 8019a5e: f7f6 fd67 bl 8010530 <sys_check_core_locking>
  63104. /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
  63105. if (ipaddr == NULL) {
  63106. 8019a62: 68bb ldr r3, [r7, #8]
  63107. 8019a64: 2b00 cmp r3, #0
  63108. 8019a66: d101 bne.n 8019a6c <netif_set_addr+0x24>
  63109. ipaddr = IP4_ADDR_ANY4;
  63110. 8019a68: 4b1c ldr r3, [pc, #112] @ (8019adc <netif_set_addr+0x94>)
  63111. 8019a6a: 60bb str r3, [r7, #8]
  63112. }
  63113. if (netmask == NULL) {
  63114. 8019a6c: 687b ldr r3, [r7, #4]
  63115. 8019a6e: 2b00 cmp r3, #0
  63116. 8019a70: d101 bne.n 8019a76 <netif_set_addr+0x2e>
  63117. netmask = IP4_ADDR_ANY4;
  63118. 8019a72: 4b1a ldr r3, [pc, #104] @ (8019adc <netif_set_addr+0x94>)
  63119. 8019a74: 607b str r3, [r7, #4]
  63120. }
  63121. if (gw == NULL) {
  63122. 8019a76: 683b ldr r3, [r7, #0]
  63123. 8019a78: 2b00 cmp r3, #0
  63124. 8019a7a: d101 bne.n 8019a80 <netif_set_addr+0x38>
  63125. gw = IP4_ADDR_ANY4;
  63126. 8019a7c: 4b17 ldr r3, [pc, #92] @ (8019adc <netif_set_addr+0x94>)
  63127. 8019a7e: 603b str r3, [r7, #0]
  63128. }
  63129. remove = ip4_addr_isany(ipaddr);
  63130. 8019a80: 68bb ldr r3, [r7, #8]
  63131. 8019a82: 2b00 cmp r3, #0
  63132. 8019a84: d003 beq.n 8019a8e <netif_set_addr+0x46>
  63133. 8019a86: 68bb ldr r3, [r7, #8]
  63134. 8019a88: 681b ldr r3, [r3, #0]
  63135. 8019a8a: 2b00 cmp r3, #0
  63136. 8019a8c: d101 bne.n 8019a92 <netif_set_addr+0x4a>
  63137. 8019a8e: 2301 movs r3, #1
  63138. 8019a90: e000 b.n 8019a94 <netif_set_addr+0x4c>
  63139. 8019a92: 2300 movs r3, #0
  63140. 8019a94: 617b str r3, [r7, #20]
  63141. if (remove) {
  63142. 8019a96: 697b ldr r3, [r7, #20]
  63143. 8019a98: 2b00 cmp r3, #0
  63144. 8019a9a: d006 beq.n 8019aaa <netif_set_addr+0x62>
  63145. /* when removing an address, we have to remove it *before* changing netmask/gw
  63146. to ensure that tcp RST segment can be sent correctly */
  63147. if (netif_do_set_ipaddr(netif, ipaddr, &old_addr)) {
  63148. 8019a9c: f107 0310 add.w r3, r7, #16
  63149. 8019aa0: 461a mov r2, r3
  63150. 8019aa2: 68b9 ldr r1, [r7, #8]
  63151. 8019aa4: 68f8 ldr r0, [r7, #12]
  63152. 8019aa6: f7ff ff47 bl 8019938 <netif_do_set_ipaddr>
  63153. change_reason |= LWIP_NSC_IPV4_ADDRESS_CHANGED;
  63154. cb_args.ipv4_changed.old_address = &old_addr;
  63155. #endif
  63156. }
  63157. }
  63158. if (netif_do_set_netmask(netif, netmask, old_nm)) {
  63159. 8019aaa: 69fa ldr r2, [r7, #28]
  63160. 8019aac: 6879 ldr r1, [r7, #4]
  63161. 8019aae: 68f8 ldr r0, [r7, #12]
  63162. 8019ab0: f7ff ff8c bl 80199cc <netif_do_set_netmask>
  63163. #if LWIP_NETIF_EXT_STATUS_CALLBACK
  63164. change_reason |= LWIP_NSC_IPV4_NETMASK_CHANGED;
  63165. cb_args.ipv4_changed.old_netmask = old_nm;
  63166. #endif
  63167. }
  63168. if (netif_do_set_gw(netif, gw, old_gw)) {
  63169. 8019ab4: 69ba ldr r2, [r7, #24]
  63170. 8019ab6: 6839 ldr r1, [r7, #0]
  63171. 8019ab8: 68f8 ldr r0, [r7, #12]
  63172. 8019aba: f7ff ffa6 bl 8019a0a <netif_do_set_gw>
  63173. #if LWIP_NETIF_EXT_STATUS_CALLBACK
  63174. change_reason |= LWIP_NSC_IPV4_GATEWAY_CHANGED;
  63175. cb_args.ipv4_changed.old_gw = old_gw;
  63176. #endif
  63177. }
  63178. if (!remove) {
  63179. 8019abe: 697b ldr r3, [r7, #20]
  63180. 8019ac0: 2b00 cmp r3, #0
  63181. 8019ac2: d106 bne.n 8019ad2 <netif_set_addr+0x8a>
  63182. /* set ipaddr last to ensure netmask/gw have been set when status callback is called */
  63183. if (netif_do_set_ipaddr(netif, ipaddr, &old_addr)) {
  63184. 8019ac4: f107 0310 add.w r3, r7, #16
  63185. 8019ac8: 461a mov r2, r3
  63186. 8019aca: 68b9 ldr r1, [r7, #8]
  63187. 8019acc: 68f8 ldr r0, [r7, #12]
  63188. 8019ace: f7ff ff33 bl 8019938 <netif_do_set_ipaddr>
  63189. if (change_reason != LWIP_NSC_NONE) {
  63190. change_reason |= LWIP_NSC_IPV4_SETTINGS_CHANGED;
  63191. netif_invoke_ext_callback(netif, change_reason, &cb_args);
  63192. }
  63193. #endif
  63194. }
  63195. 8019ad2: bf00 nop
  63196. 8019ad4: 3720 adds r7, #32
  63197. 8019ad6: 46bd mov sp, r7
  63198. 8019ad8: bd80 pop {r7, pc}
  63199. 8019ada: bf00 nop
  63200. 8019adc: 08030c10 .word 0x08030c10
  63201. 08019ae0 <netif_set_default>:
  63202. *
  63203. * @param netif the default network interface
  63204. */
  63205. void
  63206. netif_set_default(struct netif *netif)
  63207. {
  63208. 8019ae0: b580 push {r7, lr}
  63209. 8019ae2: b082 sub sp, #8
  63210. 8019ae4: af00 add r7, sp, #0
  63211. 8019ae6: 6078 str r0, [r7, #4]
  63212. LWIP_ASSERT_CORE_LOCKED();
  63213. 8019ae8: f7f6 fd22 bl 8010530 <sys_check_core_locking>
  63214. mib2_remove_route_ip4(1, netif);
  63215. } else {
  63216. /* install default route */
  63217. mib2_add_route_ip4(1, netif);
  63218. }
  63219. netif_default = netif;
  63220. 8019aec: 4a03 ldr r2, [pc, #12] @ (8019afc <netif_set_default+0x1c>)
  63221. 8019aee: 687b ldr r3, [r7, #4]
  63222. 8019af0: 6013 str r3, [r2, #0]
  63223. LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n",
  63224. netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\''));
  63225. }
  63226. 8019af2: bf00 nop
  63227. 8019af4: 3708 adds r7, #8
  63228. 8019af6: 46bd mov sp, r7
  63229. 8019af8: bd80 pop {r7, pc}
  63230. 8019afa: bf00 nop
  63231. 8019afc: 2402ae80 .word 0x2402ae80
  63232. 08019b00 <netif_set_up>:
  63233. * Bring an interface up, available for processing
  63234. * traffic.
  63235. */
  63236. void
  63237. netif_set_up(struct netif *netif)
  63238. {
  63239. 8019b00: b580 push {r7, lr}
  63240. 8019b02: b082 sub sp, #8
  63241. 8019b04: af00 add r7, sp, #0
  63242. 8019b06: 6078 str r0, [r7, #4]
  63243. LWIP_ASSERT_CORE_LOCKED();
  63244. 8019b08: f7f6 fd12 bl 8010530 <sys_check_core_locking>
  63245. LWIP_ERROR("netif_set_up: invalid netif", netif != NULL, return);
  63246. 8019b0c: 687b ldr r3, [r7, #4]
  63247. 8019b0e: 2b00 cmp r3, #0
  63248. 8019b10: d107 bne.n 8019b22 <netif_set_up+0x22>
  63249. 8019b12: 4b0f ldr r3, [pc, #60] @ (8019b50 <netif_set_up+0x50>)
  63250. 8019b14: f44f 7254 mov.w r2, #848 @ 0x350
  63251. 8019b18: 490e ldr r1, [pc, #56] @ (8019b54 <netif_set_up+0x54>)
  63252. 8019b1a: 480f ldr r0, [pc, #60] @ (8019b58 <netif_set_up+0x58>)
  63253. 8019b1c: f00f ff56 bl 80299cc <iprintf>
  63254. 8019b20: e013 b.n 8019b4a <netif_set_up+0x4a>
  63255. if (!(netif->flags & NETIF_FLAG_UP)) {
  63256. 8019b22: 687b ldr r3, [r7, #4]
  63257. 8019b24: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63258. 8019b28: f003 0301 and.w r3, r3, #1
  63259. 8019b2c: 2b00 cmp r3, #0
  63260. 8019b2e: d10c bne.n 8019b4a <netif_set_up+0x4a>
  63261. netif_set_flags(netif, NETIF_FLAG_UP);
  63262. 8019b30: 687b ldr r3, [r7, #4]
  63263. 8019b32: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63264. 8019b36: f043 0301 orr.w r3, r3, #1
  63265. 8019b3a: b2da uxtb r2, r3
  63266. 8019b3c: 687b ldr r3, [r7, #4]
  63267. 8019b3e: f883 2031 strb.w r2, [r3, #49] @ 0x31
  63268. args.status_changed.state = 1;
  63269. netif_invoke_ext_callback(netif, LWIP_NSC_STATUS_CHANGED, &args);
  63270. }
  63271. #endif
  63272. netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
  63273. 8019b42: 2103 movs r1, #3
  63274. 8019b44: 6878 ldr r0, [r7, #4]
  63275. 8019b46: f000 f809 bl 8019b5c <netif_issue_reports>
  63276. #if LWIP_IPV6
  63277. nd6_restart_netif(netif);
  63278. #endif /* LWIP_IPV6 */
  63279. }
  63280. }
  63281. 8019b4a: 3708 adds r7, #8
  63282. 8019b4c: 46bd mov sp, r7
  63283. 8019b4e: bd80 pop {r7, pc}
  63284. 8019b50: 0802de78 .word 0x0802de78
  63285. 8019b54: 0802e000 .word 0x0802e000
  63286. 8019b58: 0802dec8 .word 0x0802dec8
  63287. 08019b5c <netif_issue_reports>:
  63288. /** Send ARP/IGMP/MLD/RS events, e.g. on link-up/netif-up or addr-change
  63289. */
  63290. static void
  63291. netif_issue_reports(struct netif *netif, u8_t report_type)
  63292. {
  63293. 8019b5c: b580 push {r7, lr}
  63294. 8019b5e: b082 sub sp, #8
  63295. 8019b60: af00 add r7, sp, #0
  63296. 8019b62: 6078 str r0, [r7, #4]
  63297. 8019b64: 460b mov r3, r1
  63298. 8019b66: 70fb strb r3, [r7, #3]
  63299. LWIP_ASSERT("netif_issue_reports: invalid netif", netif != NULL);
  63300. 8019b68: 687b ldr r3, [r7, #4]
  63301. 8019b6a: 2b00 cmp r3, #0
  63302. 8019b6c: d106 bne.n 8019b7c <netif_issue_reports+0x20>
  63303. 8019b6e: 4b18 ldr r3, [pc, #96] @ (8019bd0 <netif_issue_reports+0x74>)
  63304. 8019b70: f240 326d movw r2, #877 @ 0x36d
  63305. 8019b74: 4917 ldr r1, [pc, #92] @ (8019bd4 <netif_issue_reports+0x78>)
  63306. 8019b76: 4818 ldr r0, [pc, #96] @ (8019bd8 <netif_issue_reports+0x7c>)
  63307. 8019b78: f00f ff28 bl 80299cc <iprintf>
  63308. /* Only send reports when both link and admin states are up */
  63309. if (!(netif->flags & NETIF_FLAG_LINK_UP) ||
  63310. 8019b7c: 687b ldr r3, [r7, #4]
  63311. 8019b7e: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63312. 8019b82: f003 0304 and.w r3, r3, #4
  63313. 8019b86: 2b00 cmp r3, #0
  63314. 8019b88: d01e beq.n 8019bc8 <netif_issue_reports+0x6c>
  63315. !(netif->flags & NETIF_FLAG_UP)) {
  63316. 8019b8a: 687b ldr r3, [r7, #4]
  63317. 8019b8c: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63318. 8019b90: f003 0301 and.w r3, r3, #1
  63319. if (!(netif->flags & NETIF_FLAG_LINK_UP) ||
  63320. 8019b94: 2b00 cmp r3, #0
  63321. 8019b96: d017 beq.n 8019bc8 <netif_issue_reports+0x6c>
  63322. return;
  63323. }
  63324. #if LWIP_IPV4
  63325. if ((report_type & NETIF_REPORT_TYPE_IPV4) &&
  63326. 8019b98: 78fb ldrb r3, [r7, #3]
  63327. 8019b9a: f003 0301 and.w r3, r3, #1
  63328. 8019b9e: 2b00 cmp r3, #0
  63329. 8019ba0: d013 beq.n 8019bca <netif_issue_reports+0x6e>
  63330. !ip4_addr_isany_val(*netif_ip4_addr(netif))) {
  63331. 8019ba2: 687b ldr r3, [r7, #4]
  63332. 8019ba4: 3304 adds r3, #4
  63333. 8019ba6: 681b ldr r3, [r3, #0]
  63334. if ((report_type & NETIF_REPORT_TYPE_IPV4) &&
  63335. 8019ba8: 2b00 cmp r3, #0
  63336. 8019baa: d00e beq.n 8019bca <netif_issue_reports+0x6e>
  63337. #if LWIP_ARP
  63338. /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
  63339. if (netif->flags & (NETIF_FLAG_ETHARP)) {
  63340. 8019bac: 687b ldr r3, [r7, #4]
  63341. 8019bae: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63342. 8019bb2: f003 0308 and.w r3, r3, #8
  63343. 8019bb6: 2b00 cmp r3, #0
  63344. 8019bb8: d007 beq.n 8019bca <netif_issue_reports+0x6e>
  63345. etharp_gratuitous(netif);
  63346. 8019bba: 687b ldr r3, [r7, #4]
  63347. 8019bbc: 3304 adds r3, #4
  63348. 8019bbe: 4619 mov r1, r3
  63349. 8019bc0: 6878 ldr r0, [r7, #4]
  63350. 8019bc2: f00a fd2b bl 802461c <etharp_request>
  63351. 8019bc6: e000 b.n 8019bca <netif_issue_reports+0x6e>
  63352. return;
  63353. 8019bc8: bf00 nop
  63354. /* send mld memberships */
  63355. mld6_report_groups(netif);
  63356. #endif /* LWIP_IPV6_MLD */
  63357. }
  63358. #endif /* LWIP_IPV6 */
  63359. }
  63360. 8019bca: 3708 adds r7, #8
  63361. 8019bcc: 46bd mov sp, r7
  63362. 8019bce: bd80 pop {r7, pc}
  63363. 8019bd0: 0802de78 .word 0x0802de78
  63364. 8019bd4: 0802e01c .word 0x0802e01c
  63365. 8019bd8: 0802dec8 .word 0x0802dec8
  63366. 08019bdc <netif_set_down>:
  63367. * @ingroup netif
  63368. * Bring an interface down, disabling any traffic processing.
  63369. */
  63370. void
  63371. netif_set_down(struct netif *netif)
  63372. {
  63373. 8019bdc: b580 push {r7, lr}
  63374. 8019bde: b082 sub sp, #8
  63375. 8019be0: af00 add r7, sp, #0
  63376. 8019be2: 6078 str r0, [r7, #4]
  63377. LWIP_ASSERT_CORE_LOCKED();
  63378. 8019be4: f7f6 fca4 bl 8010530 <sys_check_core_locking>
  63379. LWIP_ERROR("netif_set_down: invalid netif", netif != NULL, return);
  63380. 8019be8: 687b ldr r3, [r7, #4]
  63381. 8019bea: 2b00 cmp r3, #0
  63382. 8019bec: d107 bne.n 8019bfe <netif_set_down+0x22>
  63383. 8019bee: 4b12 ldr r3, [pc, #72] @ (8019c38 <netif_set_down+0x5c>)
  63384. 8019bf0: f240 329b movw r2, #923 @ 0x39b
  63385. 8019bf4: 4911 ldr r1, [pc, #68] @ (8019c3c <netif_set_down+0x60>)
  63386. 8019bf6: 4812 ldr r0, [pc, #72] @ (8019c40 <netif_set_down+0x64>)
  63387. 8019bf8: f00f fee8 bl 80299cc <iprintf>
  63388. 8019bfc: e019 b.n 8019c32 <netif_set_down+0x56>
  63389. if (netif->flags & NETIF_FLAG_UP) {
  63390. 8019bfe: 687b ldr r3, [r7, #4]
  63391. 8019c00: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63392. 8019c04: f003 0301 and.w r3, r3, #1
  63393. 8019c08: 2b00 cmp r3, #0
  63394. 8019c0a: d012 beq.n 8019c32 <netif_set_down+0x56>
  63395. args.status_changed.state = 0;
  63396. netif_invoke_ext_callback(netif, LWIP_NSC_STATUS_CHANGED, &args);
  63397. }
  63398. #endif
  63399. netif_clear_flags(netif, NETIF_FLAG_UP);
  63400. 8019c0c: 687b ldr r3, [r7, #4]
  63401. 8019c0e: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63402. 8019c12: f023 0301 bic.w r3, r3, #1
  63403. 8019c16: b2da uxtb r2, r3
  63404. 8019c18: 687b ldr r3, [r7, #4]
  63405. 8019c1a: f883 2031 strb.w r2, [r3, #49] @ 0x31
  63406. MIB2_COPY_SYSUPTIME_TO(&netif->ts);
  63407. #if LWIP_IPV4 && LWIP_ARP
  63408. if (netif->flags & NETIF_FLAG_ETHARP) {
  63409. 8019c1e: 687b ldr r3, [r7, #4]
  63410. 8019c20: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63411. 8019c24: f003 0308 and.w r3, r3, #8
  63412. 8019c28: 2b00 cmp r3, #0
  63413. 8019c2a: d002 beq.n 8019c32 <netif_set_down+0x56>
  63414. etharp_cleanup_netif(netif);
  63415. 8019c2c: 6878 ldr r0, [r7, #4]
  63416. 8019c2e: f00a f8ab bl 8023d88 <etharp_cleanup_netif>
  63417. nd6_cleanup_netif(netif);
  63418. #endif /* LWIP_IPV6 */
  63419. NETIF_STATUS_CALLBACK(netif);
  63420. }
  63421. }
  63422. 8019c32: 3708 adds r7, #8
  63423. 8019c34: 46bd mov sp, r7
  63424. 8019c36: bd80 pop {r7, pc}
  63425. 8019c38: 0802de78 .word 0x0802de78
  63426. 8019c3c: 0802e040 .word 0x0802e040
  63427. 8019c40: 0802dec8 .word 0x0802dec8
  63428. 08019c44 <netif_set_link_up>:
  63429. * @ingroup netif
  63430. * Called by a driver when its link goes up
  63431. */
  63432. void
  63433. netif_set_link_up(struct netif *netif)
  63434. {
  63435. 8019c44: b580 push {r7, lr}
  63436. 8019c46: b082 sub sp, #8
  63437. 8019c48: af00 add r7, sp, #0
  63438. 8019c4a: 6078 str r0, [r7, #4]
  63439. LWIP_ASSERT_CORE_LOCKED();
  63440. 8019c4c: f7f6 fc70 bl 8010530 <sys_check_core_locking>
  63441. LWIP_ERROR("netif_set_link_up: invalid netif", netif != NULL, return);
  63442. 8019c50: 687b ldr r3, [r7, #4]
  63443. 8019c52: 2b00 cmp r3, #0
  63444. 8019c54: d107 bne.n 8019c66 <netif_set_link_up+0x22>
  63445. 8019c56: 4b15 ldr r3, [pc, #84] @ (8019cac <netif_set_link_up+0x68>)
  63446. 8019c58: f44f 7278 mov.w r2, #992 @ 0x3e0
  63447. 8019c5c: 4914 ldr r1, [pc, #80] @ (8019cb0 <netif_set_link_up+0x6c>)
  63448. 8019c5e: 4815 ldr r0, [pc, #84] @ (8019cb4 <netif_set_link_up+0x70>)
  63449. 8019c60: f00f feb4 bl 80299cc <iprintf>
  63450. 8019c64: e01e b.n 8019ca4 <netif_set_link_up+0x60>
  63451. if (!(netif->flags & NETIF_FLAG_LINK_UP)) {
  63452. 8019c66: 687b ldr r3, [r7, #4]
  63453. 8019c68: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63454. 8019c6c: f003 0304 and.w r3, r3, #4
  63455. 8019c70: 2b00 cmp r3, #0
  63456. 8019c72: d117 bne.n 8019ca4 <netif_set_link_up+0x60>
  63457. netif_set_flags(netif, NETIF_FLAG_LINK_UP);
  63458. 8019c74: 687b ldr r3, [r7, #4]
  63459. 8019c76: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63460. 8019c7a: f043 0304 orr.w r3, r3, #4
  63461. 8019c7e: b2da uxtb r2, r3
  63462. 8019c80: 687b ldr r3, [r7, #4]
  63463. 8019c82: f883 2031 strb.w r2, [r3, #49] @ 0x31
  63464. #if LWIP_DHCP
  63465. dhcp_network_changed(netif);
  63466. 8019c86: 6878 ldr r0, [r7, #4]
  63467. 8019c88: f008 faaa bl 80221e0 <dhcp_network_changed>
  63468. #if LWIP_AUTOIP
  63469. autoip_network_changed(netif);
  63470. #endif /* LWIP_AUTOIP */
  63471. netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
  63472. 8019c8c: 2103 movs r1, #3
  63473. 8019c8e: 6878 ldr r0, [r7, #4]
  63474. 8019c90: f7ff ff64 bl 8019b5c <netif_issue_reports>
  63475. #if LWIP_IPV6
  63476. nd6_restart_netif(netif);
  63477. #endif /* LWIP_IPV6 */
  63478. NETIF_LINK_CALLBACK(netif);
  63479. 8019c94: 687b ldr r3, [r7, #4]
  63480. 8019c96: 69db ldr r3, [r3, #28]
  63481. 8019c98: 2b00 cmp r3, #0
  63482. 8019c9a: d003 beq.n 8019ca4 <netif_set_link_up+0x60>
  63483. 8019c9c: 687b ldr r3, [r7, #4]
  63484. 8019c9e: 69db ldr r3, [r3, #28]
  63485. 8019ca0: 6878 ldr r0, [r7, #4]
  63486. 8019ca2: 4798 blx r3
  63487. args.link_changed.state = 1;
  63488. netif_invoke_ext_callback(netif, LWIP_NSC_LINK_CHANGED, &args);
  63489. }
  63490. #endif
  63491. }
  63492. }
  63493. 8019ca4: 3708 adds r7, #8
  63494. 8019ca6: 46bd mov sp, r7
  63495. 8019ca8: bd80 pop {r7, pc}
  63496. 8019caa: bf00 nop
  63497. 8019cac: 0802de78 .word 0x0802de78
  63498. 8019cb0: 0802e060 .word 0x0802e060
  63499. 8019cb4: 0802dec8 .word 0x0802dec8
  63500. 08019cb8 <netif_set_link_down>:
  63501. * @ingroup netif
  63502. * Called by a driver when its link goes down
  63503. */
  63504. void
  63505. netif_set_link_down(struct netif *netif)
  63506. {
  63507. 8019cb8: b580 push {r7, lr}
  63508. 8019cba: b082 sub sp, #8
  63509. 8019cbc: af00 add r7, sp, #0
  63510. 8019cbe: 6078 str r0, [r7, #4]
  63511. LWIP_ASSERT_CORE_LOCKED();
  63512. 8019cc0: f7f6 fc36 bl 8010530 <sys_check_core_locking>
  63513. LWIP_ERROR("netif_set_link_down: invalid netif", netif != NULL, return);
  63514. 8019cc4: 687b ldr r3, [r7, #4]
  63515. 8019cc6: 2b00 cmp r3, #0
  63516. 8019cc8: d107 bne.n 8019cda <netif_set_link_down+0x22>
  63517. 8019cca: 4b11 ldr r3, [pc, #68] @ (8019d10 <netif_set_link_down+0x58>)
  63518. 8019ccc: f240 4206 movw r2, #1030 @ 0x406
  63519. 8019cd0: 4910 ldr r1, [pc, #64] @ (8019d14 <netif_set_link_down+0x5c>)
  63520. 8019cd2: 4811 ldr r0, [pc, #68] @ (8019d18 <netif_set_link_down+0x60>)
  63521. 8019cd4: f00f fe7a bl 80299cc <iprintf>
  63522. 8019cd8: e017 b.n 8019d0a <netif_set_link_down+0x52>
  63523. if (netif->flags & NETIF_FLAG_LINK_UP) {
  63524. 8019cda: 687b ldr r3, [r7, #4]
  63525. 8019cdc: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63526. 8019ce0: f003 0304 and.w r3, r3, #4
  63527. 8019ce4: 2b00 cmp r3, #0
  63528. 8019ce6: d010 beq.n 8019d0a <netif_set_link_down+0x52>
  63529. netif_clear_flags(netif, NETIF_FLAG_LINK_UP);
  63530. 8019ce8: 687b ldr r3, [r7, #4]
  63531. 8019cea: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  63532. 8019cee: f023 0304 bic.w r3, r3, #4
  63533. 8019cf2: b2da uxtb r2, r3
  63534. 8019cf4: 687b ldr r3, [r7, #4]
  63535. 8019cf6: f883 2031 strb.w r2, [r3, #49] @ 0x31
  63536. NETIF_LINK_CALLBACK(netif);
  63537. 8019cfa: 687b ldr r3, [r7, #4]
  63538. 8019cfc: 69db ldr r3, [r3, #28]
  63539. 8019cfe: 2b00 cmp r3, #0
  63540. 8019d00: d003 beq.n 8019d0a <netif_set_link_down+0x52>
  63541. 8019d02: 687b ldr r3, [r7, #4]
  63542. 8019d04: 69db ldr r3, [r3, #28]
  63543. 8019d06: 6878 ldr r0, [r7, #4]
  63544. 8019d08: 4798 blx r3
  63545. args.link_changed.state = 0;
  63546. netif_invoke_ext_callback(netif, LWIP_NSC_LINK_CHANGED, &args);
  63547. }
  63548. #endif
  63549. }
  63550. }
  63551. 8019d0a: 3708 adds r7, #8
  63552. 8019d0c: 46bd mov sp, r7
  63553. 8019d0e: bd80 pop {r7, pc}
  63554. 8019d10: 0802de78 .word 0x0802de78
  63555. 8019d14: 0802e084 .word 0x0802e084
  63556. 8019d18: 0802dec8 .word 0x0802dec8
  63557. 08019d1c <netif_set_link_callback>:
  63558. * @ingroup netif
  63559. * Set callback to be called when link is brought up/down
  63560. */
  63561. void
  63562. netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback)
  63563. {
  63564. 8019d1c: b580 push {r7, lr}
  63565. 8019d1e: b082 sub sp, #8
  63566. 8019d20: af00 add r7, sp, #0
  63567. 8019d22: 6078 str r0, [r7, #4]
  63568. 8019d24: 6039 str r1, [r7, #0]
  63569. LWIP_ASSERT_CORE_LOCKED();
  63570. 8019d26: f7f6 fc03 bl 8010530 <sys_check_core_locking>
  63571. if (netif) {
  63572. 8019d2a: 687b ldr r3, [r7, #4]
  63573. 8019d2c: 2b00 cmp r3, #0
  63574. 8019d2e: d002 beq.n 8019d36 <netif_set_link_callback+0x1a>
  63575. netif->link_callback = link_callback;
  63576. 8019d30: 687b ldr r3, [r7, #4]
  63577. 8019d32: 683a ldr r2, [r7, #0]
  63578. 8019d34: 61da str r2, [r3, #28]
  63579. }
  63580. }
  63581. 8019d36: bf00 nop
  63582. 8019d38: 3708 adds r7, #8
  63583. 8019d3a: 46bd mov sp, r7
  63584. 8019d3c: bd80 pop {r7, pc}
  63585. 08019d3e <netif_null_output_ip4>:
  63586. #if LWIP_IPV4
  63587. /** Dummy IPv4 output function for netifs not supporting IPv4
  63588. */
  63589. static err_t
  63590. netif_null_output_ip4(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr)
  63591. {
  63592. 8019d3e: b480 push {r7}
  63593. 8019d40: b085 sub sp, #20
  63594. 8019d42: af00 add r7, sp, #0
  63595. 8019d44: 60f8 str r0, [r7, #12]
  63596. 8019d46: 60b9 str r1, [r7, #8]
  63597. 8019d48: 607a str r2, [r7, #4]
  63598. LWIP_UNUSED_ARG(netif);
  63599. LWIP_UNUSED_ARG(p);
  63600. LWIP_UNUSED_ARG(ipaddr);
  63601. return ERR_IF;
  63602. 8019d4a: f06f 030b mvn.w r3, #11
  63603. }
  63604. 8019d4e: 4618 mov r0, r3
  63605. 8019d50: 3714 adds r7, #20
  63606. 8019d52: 46bd mov sp, r7
  63607. 8019d54: f85d 7b04 ldr.w r7, [sp], #4
  63608. 8019d58: 4770 bx lr
  63609. ...
  63610. 08019d5c <netif_get_by_index>:
  63611. *
  63612. * @param idx index of netif to find
  63613. */
  63614. struct netif *
  63615. netif_get_by_index(u8_t idx)
  63616. {
  63617. 8019d5c: b580 push {r7, lr}
  63618. 8019d5e: b084 sub sp, #16
  63619. 8019d60: af00 add r7, sp, #0
  63620. 8019d62: 4603 mov r3, r0
  63621. 8019d64: 71fb strb r3, [r7, #7]
  63622. struct netif *netif;
  63623. LWIP_ASSERT_CORE_LOCKED();
  63624. 8019d66: f7f6 fbe3 bl 8010530 <sys_check_core_locking>
  63625. if (idx != NETIF_NO_INDEX) {
  63626. 8019d6a: 79fb ldrb r3, [r7, #7]
  63627. 8019d6c: 2b00 cmp r3, #0
  63628. 8019d6e: d013 beq.n 8019d98 <netif_get_by_index+0x3c>
  63629. NETIF_FOREACH(netif) {
  63630. 8019d70: 4b0c ldr r3, [pc, #48] @ (8019da4 <netif_get_by_index+0x48>)
  63631. 8019d72: 681b ldr r3, [r3, #0]
  63632. 8019d74: 60fb str r3, [r7, #12]
  63633. 8019d76: e00c b.n 8019d92 <netif_get_by_index+0x36>
  63634. if (idx == netif_get_index(netif)) {
  63635. 8019d78: 68fb ldr r3, [r7, #12]
  63636. 8019d7a: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  63637. 8019d7e: 3301 adds r3, #1
  63638. 8019d80: b2db uxtb r3, r3
  63639. 8019d82: 79fa ldrb r2, [r7, #7]
  63640. 8019d84: 429a cmp r2, r3
  63641. 8019d86: d101 bne.n 8019d8c <netif_get_by_index+0x30>
  63642. return netif; /* found! */
  63643. 8019d88: 68fb ldr r3, [r7, #12]
  63644. 8019d8a: e006 b.n 8019d9a <netif_get_by_index+0x3e>
  63645. NETIF_FOREACH(netif) {
  63646. 8019d8c: 68fb ldr r3, [r7, #12]
  63647. 8019d8e: 681b ldr r3, [r3, #0]
  63648. 8019d90: 60fb str r3, [r7, #12]
  63649. 8019d92: 68fb ldr r3, [r7, #12]
  63650. 8019d94: 2b00 cmp r3, #0
  63651. 8019d96: d1ef bne.n 8019d78 <netif_get_by_index+0x1c>
  63652. }
  63653. }
  63654. }
  63655. return NULL;
  63656. 8019d98: 2300 movs r3, #0
  63657. }
  63658. 8019d9a: 4618 mov r0, r3
  63659. 8019d9c: 3710 adds r7, #16
  63660. 8019d9e: 46bd mov sp, r7
  63661. 8019da0: bd80 pop {r7, pc}
  63662. 8019da2: bf00 nop
  63663. 8019da4: 2402ae7c .word 0x2402ae7c
  63664. 08019da8 <pbuf_free_ooseq>:
  63665. #if !NO_SYS
  63666. static
  63667. #endif /* !NO_SYS */
  63668. void
  63669. pbuf_free_ooseq(void)
  63670. {
  63671. 8019da8: b580 push {r7, lr}
  63672. 8019daa: b082 sub sp, #8
  63673. 8019dac: af00 add r7, sp, #0
  63674. struct tcp_pcb *pcb;
  63675. SYS_ARCH_SET(pbuf_free_ooseq_pending, 0);
  63676. 8019dae: f00c fb77 bl 80264a0 <sys_arch_protect>
  63677. 8019db2: 6038 str r0, [r7, #0]
  63678. 8019db4: 4b0d ldr r3, [pc, #52] @ (8019dec <pbuf_free_ooseq+0x44>)
  63679. 8019db6: 2200 movs r2, #0
  63680. 8019db8: 701a strb r2, [r3, #0]
  63681. 8019dba: 6838 ldr r0, [r7, #0]
  63682. 8019dbc: f00c fb7e bl 80264bc <sys_arch_unprotect>
  63683. for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) {
  63684. 8019dc0: 4b0b ldr r3, [pc, #44] @ (8019df0 <pbuf_free_ooseq+0x48>)
  63685. 8019dc2: 681b ldr r3, [r3, #0]
  63686. 8019dc4: 607b str r3, [r7, #4]
  63687. 8019dc6: e00a b.n 8019dde <pbuf_free_ooseq+0x36>
  63688. if (pcb->ooseq != NULL) {
  63689. 8019dc8: 687b ldr r3, [r7, #4]
  63690. 8019dca: 6f5b ldr r3, [r3, #116] @ 0x74
  63691. 8019dcc: 2b00 cmp r3, #0
  63692. 8019dce: d003 beq.n 8019dd8 <pbuf_free_ooseq+0x30>
  63693. /** Free the ooseq pbufs of one PCB only */
  63694. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free_ooseq: freeing out-of-sequence pbufs\n"));
  63695. tcp_free_ooseq(pcb);
  63696. 8019dd0: 6878 ldr r0, [r7, #4]
  63697. 8019dd2: f002 fc55 bl 801c680 <tcp_free_ooseq>
  63698. return;
  63699. 8019dd6: e005 b.n 8019de4 <pbuf_free_ooseq+0x3c>
  63700. for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) {
  63701. 8019dd8: 687b ldr r3, [r7, #4]
  63702. 8019dda: 68db ldr r3, [r3, #12]
  63703. 8019ddc: 607b str r3, [r7, #4]
  63704. 8019dde: 687b ldr r3, [r7, #4]
  63705. 8019de0: 2b00 cmp r3, #0
  63706. 8019de2: d1f1 bne.n 8019dc8 <pbuf_free_ooseq+0x20>
  63707. }
  63708. }
  63709. }
  63710. 8019de4: 3708 adds r7, #8
  63711. 8019de6: 46bd mov sp, r7
  63712. 8019de8: bd80 pop {r7, pc}
  63713. 8019dea: bf00 nop
  63714. 8019dec: 2402ae85 .word 0x2402ae85
  63715. 8019df0: 2402ae94 .word 0x2402ae94
  63716. 08019df4 <pbuf_free_ooseq_callback>:
  63717. /**
  63718. * Just a callback function for tcpip_callback() that calls pbuf_free_ooseq().
  63719. */
  63720. static void
  63721. pbuf_free_ooseq_callback(void *arg)
  63722. {
  63723. 8019df4: b580 push {r7, lr}
  63724. 8019df6: b082 sub sp, #8
  63725. 8019df8: af00 add r7, sp, #0
  63726. 8019dfa: 6078 str r0, [r7, #4]
  63727. LWIP_UNUSED_ARG(arg);
  63728. pbuf_free_ooseq();
  63729. 8019dfc: f7ff ffd4 bl 8019da8 <pbuf_free_ooseq>
  63730. }
  63731. 8019e00: bf00 nop
  63732. 8019e02: 3708 adds r7, #8
  63733. 8019e04: 46bd mov sp, r7
  63734. 8019e06: bd80 pop {r7, pc}
  63735. 08019e08 <pbuf_pool_is_empty>:
  63736. #endif /* !NO_SYS */
  63737. /** Queue a call to pbuf_free_ooseq if not already queued. */
  63738. static void
  63739. pbuf_pool_is_empty(void)
  63740. {
  63741. 8019e08: b580 push {r7, lr}
  63742. 8019e0a: b082 sub sp, #8
  63743. 8019e0c: af00 add r7, sp, #0
  63744. #ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL
  63745. SYS_ARCH_SET(pbuf_free_ooseq_pending, 1);
  63746. #else /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */
  63747. u8_t queued;
  63748. SYS_ARCH_DECL_PROTECT(old_level);
  63749. SYS_ARCH_PROTECT(old_level);
  63750. 8019e0e: f00c fb47 bl 80264a0 <sys_arch_protect>
  63751. 8019e12: 6078 str r0, [r7, #4]
  63752. queued = pbuf_free_ooseq_pending;
  63753. 8019e14: 4b0f ldr r3, [pc, #60] @ (8019e54 <pbuf_pool_is_empty+0x4c>)
  63754. 8019e16: 781b ldrb r3, [r3, #0]
  63755. 8019e18: 70fb strb r3, [r7, #3]
  63756. pbuf_free_ooseq_pending = 1;
  63757. 8019e1a: 4b0e ldr r3, [pc, #56] @ (8019e54 <pbuf_pool_is_empty+0x4c>)
  63758. 8019e1c: 2201 movs r2, #1
  63759. 8019e1e: 701a strb r2, [r3, #0]
  63760. SYS_ARCH_UNPROTECT(old_level);
  63761. 8019e20: 6878 ldr r0, [r7, #4]
  63762. 8019e22: f00c fb4b bl 80264bc <sys_arch_unprotect>
  63763. if (!queued) {
  63764. 8019e26: 78fb ldrb r3, [r7, #3]
  63765. 8019e28: 2b00 cmp r3, #0
  63766. 8019e2a: d10f bne.n 8019e4c <pbuf_pool_is_empty+0x44>
  63767. /* queue a call to pbuf_free_ooseq if not already queued */
  63768. PBUF_POOL_FREE_OOSEQ_QUEUE_CALL();
  63769. 8019e2c: 2100 movs r1, #0
  63770. 8019e2e: 480a ldr r0, [pc, #40] @ (8019e58 <pbuf_pool_is_empty+0x50>)
  63771. 8019e30: f7fe fdd6 bl 80189e0 <tcpip_try_callback>
  63772. 8019e34: 4603 mov r3, r0
  63773. 8019e36: 2b00 cmp r3, #0
  63774. 8019e38: d008 beq.n 8019e4c <pbuf_pool_is_empty+0x44>
  63775. 8019e3a: f00c fb31 bl 80264a0 <sys_arch_protect>
  63776. 8019e3e: 6078 str r0, [r7, #4]
  63777. 8019e40: 4b04 ldr r3, [pc, #16] @ (8019e54 <pbuf_pool_is_empty+0x4c>)
  63778. 8019e42: 2200 movs r2, #0
  63779. 8019e44: 701a strb r2, [r3, #0]
  63780. 8019e46: 6878 ldr r0, [r7, #4]
  63781. 8019e48: f00c fb38 bl 80264bc <sys_arch_unprotect>
  63782. }
  63783. #endif /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */
  63784. }
  63785. 8019e4c: bf00 nop
  63786. 8019e4e: 3708 adds r7, #8
  63787. 8019e50: 46bd mov sp, r7
  63788. 8019e52: bd80 pop {r7, pc}
  63789. 8019e54: 2402ae85 .word 0x2402ae85
  63790. 8019e58: 08019df5 .word 0x08019df5
  63791. 08019e5c <pbuf_init_alloced_pbuf>:
  63792. #endif /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */
  63793. /* Initialize members of struct pbuf after allocation */
  63794. static void
  63795. pbuf_init_alloced_pbuf(struct pbuf *p, void *payload, u16_t tot_len, u16_t len, pbuf_type type, u8_t flags)
  63796. {
  63797. 8019e5c: b480 push {r7}
  63798. 8019e5e: b085 sub sp, #20
  63799. 8019e60: af00 add r7, sp, #0
  63800. 8019e62: 60f8 str r0, [r7, #12]
  63801. 8019e64: 60b9 str r1, [r7, #8]
  63802. 8019e66: 4611 mov r1, r2
  63803. 8019e68: 461a mov r2, r3
  63804. 8019e6a: 460b mov r3, r1
  63805. 8019e6c: 80fb strh r3, [r7, #6]
  63806. 8019e6e: 4613 mov r3, r2
  63807. 8019e70: 80bb strh r3, [r7, #4]
  63808. p->next = NULL;
  63809. 8019e72: 68fb ldr r3, [r7, #12]
  63810. 8019e74: 2200 movs r2, #0
  63811. 8019e76: 601a str r2, [r3, #0]
  63812. p->payload = payload;
  63813. 8019e78: 68fb ldr r3, [r7, #12]
  63814. 8019e7a: 68ba ldr r2, [r7, #8]
  63815. 8019e7c: 605a str r2, [r3, #4]
  63816. p->tot_len = tot_len;
  63817. 8019e7e: 68fb ldr r3, [r7, #12]
  63818. 8019e80: 88fa ldrh r2, [r7, #6]
  63819. 8019e82: 811a strh r2, [r3, #8]
  63820. p->len = len;
  63821. 8019e84: 68fb ldr r3, [r7, #12]
  63822. 8019e86: 88ba ldrh r2, [r7, #4]
  63823. 8019e88: 815a strh r2, [r3, #10]
  63824. p->type_internal = (u8_t)type;
  63825. 8019e8a: 8b3b ldrh r3, [r7, #24]
  63826. 8019e8c: b2da uxtb r2, r3
  63827. 8019e8e: 68fb ldr r3, [r7, #12]
  63828. 8019e90: 731a strb r2, [r3, #12]
  63829. p->flags = flags;
  63830. 8019e92: 68fb ldr r3, [r7, #12]
  63831. 8019e94: 7f3a ldrb r2, [r7, #28]
  63832. 8019e96: 735a strb r2, [r3, #13]
  63833. p->ref = 1;
  63834. 8019e98: 68fb ldr r3, [r7, #12]
  63835. 8019e9a: 2201 movs r2, #1
  63836. 8019e9c: 739a strb r2, [r3, #14]
  63837. p->if_idx = NETIF_NO_INDEX;
  63838. 8019e9e: 68fb ldr r3, [r7, #12]
  63839. 8019ea0: 2200 movs r2, #0
  63840. 8019ea2: 73da strb r2, [r3, #15]
  63841. }
  63842. 8019ea4: bf00 nop
  63843. 8019ea6: 3714 adds r7, #20
  63844. 8019ea8: 46bd mov sp, r7
  63845. 8019eaa: f85d 7b04 ldr.w r7, [sp], #4
  63846. 8019eae: 4770 bx lr
  63847. 08019eb0 <pbuf_alloc>:
  63848. * @return the allocated pbuf. If multiple pbufs where allocated, this
  63849. * is the first pbuf of a pbuf chain.
  63850. */
  63851. struct pbuf *
  63852. pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
  63853. {
  63854. 8019eb0: b580 push {r7, lr}
  63855. 8019eb2: b08c sub sp, #48 @ 0x30
  63856. 8019eb4: af02 add r7, sp, #8
  63857. 8019eb6: 4603 mov r3, r0
  63858. 8019eb8: 71fb strb r3, [r7, #7]
  63859. 8019eba: 460b mov r3, r1
  63860. 8019ebc: 80bb strh r3, [r7, #4]
  63861. 8019ebe: 4613 mov r3, r2
  63862. 8019ec0: 807b strh r3, [r7, #2]
  63863. struct pbuf *p;
  63864. u16_t offset = (u16_t)layer;
  63865. 8019ec2: 79fb ldrb r3, [r7, #7]
  63866. 8019ec4: 847b strh r3, [r7, #34] @ 0x22
  63867. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length));
  63868. switch (type) {
  63869. 8019ec6: 887b ldrh r3, [r7, #2]
  63870. 8019ec8: f5b3 7f20 cmp.w r3, #640 @ 0x280
  63871. 8019ecc: f000 8082 beq.w 8019fd4 <pbuf_alloc+0x124>
  63872. 8019ed0: f5b3 7f20 cmp.w r3, #640 @ 0x280
  63873. 8019ed4: f300 80c9 bgt.w 801a06a <pbuf_alloc+0x1ba>
  63874. 8019ed8: f5b3 7fc1 cmp.w r3, #386 @ 0x182
  63875. 8019edc: d010 beq.n 8019f00 <pbuf_alloc+0x50>
  63876. 8019ede: f5b3 7fc1 cmp.w r3, #386 @ 0x182
  63877. 8019ee2: f300 80c2 bgt.w 801a06a <pbuf_alloc+0x1ba>
  63878. 8019ee6: 2b01 cmp r3, #1
  63879. 8019ee8: d002 beq.n 8019ef0 <pbuf_alloc+0x40>
  63880. 8019eea: 2b41 cmp r3, #65 @ 0x41
  63881. 8019eec: f040 80bd bne.w 801a06a <pbuf_alloc+0x1ba>
  63882. case PBUF_REF: /* fall through */
  63883. case PBUF_ROM:
  63884. p = pbuf_alloc_reference(NULL, length, type);
  63885. 8019ef0: 887a ldrh r2, [r7, #2]
  63886. 8019ef2: 88bb ldrh r3, [r7, #4]
  63887. 8019ef4: 4619 mov r1, r3
  63888. 8019ef6: 2000 movs r0, #0
  63889. 8019ef8: f000 f8d2 bl 801a0a0 <pbuf_alloc_reference>
  63890. 8019efc: 6278 str r0, [r7, #36] @ 0x24
  63891. break;
  63892. 8019efe: e0be b.n 801a07e <pbuf_alloc+0x1ce>
  63893. case PBUF_POOL: {
  63894. struct pbuf *q, *last;
  63895. u16_t rem_len; /* remaining length */
  63896. p = NULL;
  63897. 8019f00: 2300 movs r3, #0
  63898. 8019f02: 627b str r3, [r7, #36] @ 0x24
  63899. last = NULL;
  63900. 8019f04: 2300 movs r3, #0
  63901. 8019f06: 61fb str r3, [r7, #28]
  63902. rem_len = length;
  63903. 8019f08: 88bb ldrh r3, [r7, #4]
  63904. 8019f0a: 837b strh r3, [r7, #26]
  63905. do {
  63906. u16_t qlen;
  63907. q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
  63908. 8019f0c: 200c movs r0, #12
  63909. 8019f0e: f7ff fb81 bl 8019614 <memp_malloc>
  63910. 8019f12: 6138 str r0, [r7, #16]
  63911. if (q == NULL) {
  63912. 8019f14: 693b ldr r3, [r7, #16]
  63913. 8019f16: 2b00 cmp r3, #0
  63914. 8019f18: d109 bne.n 8019f2e <pbuf_alloc+0x7e>
  63915. PBUF_POOL_IS_EMPTY();
  63916. 8019f1a: f7ff ff75 bl 8019e08 <pbuf_pool_is_empty>
  63917. /* free chain so far allocated */
  63918. if (p) {
  63919. 8019f1e: 6a7b ldr r3, [r7, #36] @ 0x24
  63920. 8019f20: 2b00 cmp r3, #0
  63921. 8019f22: d002 beq.n 8019f2a <pbuf_alloc+0x7a>
  63922. pbuf_free(p);
  63923. 8019f24: 6a78 ldr r0, [r7, #36] @ 0x24
  63924. 8019f26: f000 fad9 bl 801a4dc <pbuf_free>
  63925. }
  63926. /* bail out unsuccessfully */
  63927. return NULL;
  63928. 8019f2a: 2300 movs r3, #0
  63929. 8019f2c: e0a8 b.n 801a080 <pbuf_alloc+0x1d0>
  63930. }
  63931. qlen = LWIP_MIN(rem_len, (u16_t)(PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)));
  63932. 8019f2e: 8c7b ldrh r3, [r7, #34] @ 0x22
  63933. 8019f30: 3303 adds r3, #3
  63934. 8019f32: b29b uxth r3, r3
  63935. 8019f34: f023 0303 bic.w r3, r3, #3
  63936. 8019f38: b29a uxth r2, r3
  63937. 8019f3a: f240 53ec movw r3, #1516 @ 0x5ec
  63938. 8019f3e: 1a9b subs r3, r3, r2
  63939. 8019f40: b29b uxth r3, r3
  63940. 8019f42: 8b7a ldrh r2, [r7, #26]
  63941. 8019f44: 4293 cmp r3, r2
  63942. 8019f46: bf28 it cs
  63943. 8019f48: 4613 movcs r3, r2
  63944. 8019f4a: 81fb strh r3, [r7, #14]
  63945. pbuf_init_alloced_pbuf(q, LWIP_MEM_ALIGN((void *)((u8_t *)q + SIZEOF_STRUCT_PBUF + offset)),
  63946. 8019f4c: 8c7b ldrh r3, [r7, #34] @ 0x22
  63947. 8019f4e: 3310 adds r3, #16
  63948. 8019f50: 693a ldr r2, [r7, #16]
  63949. 8019f52: 4413 add r3, r2
  63950. 8019f54: 3303 adds r3, #3
  63951. 8019f56: f023 0303 bic.w r3, r3, #3
  63952. 8019f5a: 4618 mov r0, r3
  63953. 8019f5c: 89f9 ldrh r1, [r7, #14]
  63954. 8019f5e: 8b7a ldrh r2, [r7, #26]
  63955. 8019f60: 2300 movs r3, #0
  63956. 8019f62: 9301 str r3, [sp, #4]
  63957. 8019f64: 887b ldrh r3, [r7, #2]
  63958. 8019f66: 9300 str r3, [sp, #0]
  63959. 8019f68: 460b mov r3, r1
  63960. 8019f6a: 4601 mov r1, r0
  63961. 8019f6c: 6938 ldr r0, [r7, #16]
  63962. 8019f6e: f7ff ff75 bl 8019e5c <pbuf_init_alloced_pbuf>
  63963. rem_len, qlen, type, 0);
  63964. LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
  63965. 8019f72: 693b ldr r3, [r7, #16]
  63966. 8019f74: 685b ldr r3, [r3, #4]
  63967. 8019f76: f003 0303 and.w r3, r3, #3
  63968. 8019f7a: 2b00 cmp r3, #0
  63969. 8019f7c: d006 beq.n 8019f8c <pbuf_alloc+0xdc>
  63970. 8019f7e: 4b42 ldr r3, [pc, #264] @ (801a088 <pbuf_alloc+0x1d8>)
  63971. 8019f80: f44f 7280 mov.w r2, #256 @ 0x100
  63972. 8019f84: 4941 ldr r1, [pc, #260] @ (801a08c <pbuf_alloc+0x1dc>)
  63973. 8019f86: 4842 ldr r0, [pc, #264] @ (801a090 <pbuf_alloc+0x1e0>)
  63974. 8019f88: f00f fd20 bl 80299cc <iprintf>
  63975. ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
  63976. LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
  63977. 8019f8c: 8c7b ldrh r3, [r7, #34] @ 0x22
  63978. 8019f8e: 3303 adds r3, #3
  63979. 8019f90: f023 0303 bic.w r3, r3, #3
  63980. 8019f94: f240 52ec movw r2, #1516 @ 0x5ec
  63981. 8019f98: 4293 cmp r3, r2
  63982. 8019f9a: d106 bne.n 8019faa <pbuf_alloc+0xfa>
  63983. 8019f9c: 4b3a ldr r3, [pc, #232] @ (801a088 <pbuf_alloc+0x1d8>)
  63984. 8019f9e: f44f 7281 mov.w r2, #258 @ 0x102
  63985. 8019fa2: 493c ldr r1, [pc, #240] @ (801a094 <pbuf_alloc+0x1e4>)
  63986. 8019fa4: 483a ldr r0, [pc, #232] @ (801a090 <pbuf_alloc+0x1e0>)
  63987. 8019fa6: f00f fd11 bl 80299cc <iprintf>
  63988. (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );
  63989. if (p == NULL) {
  63990. 8019faa: 6a7b ldr r3, [r7, #36] @ 0x24
  63991. 8019fac: 2b00 cmp r3, #0
  63992. 8019fae: d102 bne.n 8019fb6 <pbuf_alloc+0x106>
  63993. /* allocated head of pbuf chain (into p) */
  63994. p = q;
  63995. 8019fb0: 693b ldr r3, [r7, #16]
  63996. 8019fb2: 627b str r3, [r7, #36] @ 0x24
  63997. 8019fb4: e002 b.n 8019fbc <pbuf_alloc+0x10c>
  63998. } else {
  63999. /* make previous pbuf point to this pbuf */
  64000. last->next = q;
  64001. 8019fb6: 69fb ldr r3, [r7, #28]
  64002. 8019fb8: 693a ldr r2, [r7, #16]
  64003. 8019fba: 601a str r2, [r3, #0]
  64004. }
  64005. last = q;
  64006. 8019fbc: 693b ldr r3, [r7, #16]
  64007. 8019fbe: 61fb str r3, [r7, #28]
  64008. rem_len = (u16_t)(rem_len - qlen);
  64009. 8019fc0: 8b7a ldrh r2, [r7, #26]
  64010. 8019fc2: 89fb ldrh r3, [r7, #14]
  64011. 8019fc4: 1ad3 subs r3, r2, r3
  64012. 8019fc6: 837b strh r3, [r7, #26]
  64013. offset = 0;
  64014. 8019fc8: 2300 movs r3, #0
  64015. 8019fca: 847b strh r3, [r7, #34] @ 0x22
  64016. } while (rem_len > 0);
  64017. 8019fcc: 8b7b ldrh r3, [r7, #26]
  64018. 8019fce: 2b00 cmp r3, #0
  64019. 8019fd0: d19c bne.n 8019f0c <pbuf_alloc+0x5c>
  64020. break;
  64021. 8019fd2: e054 b.n 801a07e <pbuf_alloc+0x1ce>
  64022. }
  64023. case PBUF_RAM: {
  64024. u16_t payload_len = (u16_t)(LWIP_MEM_ALIGN_SIZE(offset) + LWIP_MEM_ALIGN_SIZE(length));
  64025. 8019fd4: 8c7b ldrh r3, [r7, #34] @ 0x22
  64026. 8019fd6: 3303 adds r3, #3
  64027. 8019fd8: b29b uxth r3, r3
  64028. 8019fda: f023 0303 bic.w r3, r3, #3
  64029. 8019fde: b29a uxth r2, r3
  64030. 8019fe0: 88bb ldrh r3, [r7, #4]
  64031. 8019fe2: 3303 adds r3, #3
  64032. 8019fe4: b29b uxth r3, r3
  64033. 8019fe6: f023 0303 bic.w r3, r3, #3
  64034. 8019fea: b29b uxth r3, r3
  64035. 8019fec: 4413 add r3, r2
  64036. 8019fee: 833b strh r3, [r7, #24]
  64037. mem_size_t alloc_len = (mem_size_t)(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF) + payload_len);
  64038. 8019ff0: 8b3b ldrh r3, [r7, #24]
  64039. 8019ff2: 3310 adds r3, #16
  64040. 8019ff4: 617b str r3, [r7, #20]
  64041. /* bug #50040: Check for integer overflow when calculating alloc_len */
  64042. if ((payload_len < LWIP_MEM_ALIGN_SIZE(length)) ||
  64043. 8019ff6: 8b3a ldrh r2, [r7, #24]
  64044. 8019ff8: 88bb ldrh r3, [r7, #4]
  64045. 8019ffa: 3303 adds r3, #3
  64046. 8019ffc: f023 0303 bic.w r3, r3, #3
  64047. 801a000: 429a cmp r2, r3
  64048. 801a002: d306 bcc.n 801a012 <pbuf_alloc+0x162>
  64049. (alloc_len < LWIP_MEM_ALIGN_SIZE(length))) {
  64050. 801a004: 88bb ldrh r3, [r7, #4]
  64051. 801a006: 3303 adds r3, #3
  64052. 801a008: f023 0303 bic.w r3, r3, #3
  64053. if ((payload_len < LWIP_MEM_ALIGN_SIZE(length)) ||
  64054. 801a00c: 697a ldr r2, [r7, #20]
  64055. 801a00e: 429a cmp r2, r3
  64056. 801a010: d201 bcs.n 801a016 <pbuf_alloc+0x166>
  64057. return NULL;
  64058. 801a012: 2300 movs r3, #0
  64059. 801a014: e034 b.n 801a080 <pbuf_alloc+0x1d0>
  64060. }
  64061. /* If pbuf is to be allocated in RAM, allocate memory for it. */
  64062. p = (struct pbuf *)mem_malloc(alloc_len);
  64063. 801a016: 6978 ldr r0, [r7, #20]
  64064. 801a018: f7ff f960 bl 80192dc <mem_malloc>
  64065. 801a01c: 6278 str r0, [r7, #36] @ 0x24
  64066. if (p == NULL) {
  64067. 801a01e: 6a7b ldr r3, [r7, #36] @ 0x24
  64068. 801a020: 2b00 cmp r3, #0
  64069. 801a022: d101 bne.n 801a028 <pbuf_alloc+0x178>
  64070. return NULL;
  64071. 801a024: 2300 movs r3, #0
  64072. 801a026: e02b b.n 801a080 <pbuf_alloc+0x1d0>
  64073. }
  64074. pbuf_init_alloced_pbuf(p, LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)),
  64075. 801a028: 8c7b ldrh r3, [r7, #34] @ 0x22
  64076. 801a02a: 3310 adds r3, #16
  64077. 801a02c: 6a7a ldr r2, [r7, #36] @ 0x24
  64078. 801a02e: 4413 add r3, r2
  64079. 801a030: 3303 adds r3, #3
  64080. 801a032: f023 0303 bic.w r3, r3, #3
  64081. 801a036: 4618 mov r0, r3
  64082. 801a038: 88b9 ldrh r1, [r7, #4]
  64083. 801a03a: 88ba ldrh r2, [r7, #4]
  64084. 801a03c: 2300 movs r3, #0
  64085. 801a03e: 9301 str r3, [sp, #4]
  64086. 801a040: 887b ldrh r3, [r7, #2]
  64087. 801a042: 9300 str r3, [sp, #0]
  64088. 801a044: 460b mov r3, r1
  64089. 801a046: 4601 mov r1, r0
  64090. 801a048: 6a78 ldr r0, [r7, #36] @ 0x24
  64091. 801a04a: f7ff ff07 bl 8019e5c <pbuf_init_alloced_pbuf>
  64092. length, length, type, 0);
  64093. LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned",
  64094. 801a04e: 6a7b ldr r3, [r7, #36] @ 0x24
  64095. 801a050: 685b ldr r3, [r3, #4]
  64096. 801a052: f003 0303 and.w r3, r3, #3
  64097. 801a056: 2b00 cmp r3, #0
  64098. 801a058: d010 beq.n 801a07c <pbuf_alloc+0x1cc>
  64099. 801a05a: 4b0b ldr r3, [pc, #44] @ (801a088 <pbuf_alloc+0x1d8>)
  64100. 801a05c: f44f 7291 mov.w r2, #290 @ 0x122
  64101. 801a060: 490d ldr r1, [pc, #52] @ (801a098 <pbuf_alloc+0x1e8>)
  64102. 801a062: 480b ldr r0, [pc, #44] @ (801a090 <pbuf_alloc+0x1e0>)
  64103. 801a064: f00f fcb2 bl 80299cc <iprintf>
  64104. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  64105. break;
  64106. 801a068: e008 b.n 801a07c <pbuf_alloc+0x1cc>
  64107. }
  64108. default:
  64109. LWIP_ASSERT("pbuf_alloc: erroneous type", 0);
  64110. 801a06a: 4b07 ldr r3, [pc, #28] @ (801a088 <pbuf_alloc+0x1d8>)
  64111. 801a06c: f240 1227 movw r2, #295 @ 0x127
  64112. 801a070: 490a ldr r1, [pc, #40] @ (801a09c <pbuf_alloc+0x1ec>)
  64113. 801a072: 4807 ldr r0, [pc, #28] @ (801a090 <pbuf_alloc+0x1e0>)
  64114. 801a074: f00f fcaa bl 80299cc <iprintf>
  64115. return NULL;
  64116. 801a078: 2300 movs r3, #0
  64117. 801a07a: e001 b.n 801a080 <pbuf_alloc+0x1d0>
  64118. break;
  64119. 801a07c: bf00 nop
  64120. }
  64121. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
  64122. return p;
  64123. 801a07e: 6a7b ldr r3, [r7, #36] @ 0x24
  64124. }
  64125. 801a080: 4618 mov r0, r3
  64126. 801a082: 3728 adds r7, #40 @ 0x28
  64127. 801a084: 46bd mov sp, r7
  64128. 801a086: bd80 pop {r7, pc}
  64129. 801a088: 0802e0a8 .word 0x0802e0a8
  64130. 801a08c: 0802e0d8 .word 0x0802e0d8
  64131. 801a090: 0802e108 .word 0x0802e108
  64132. 801a094: 0802e130 .word 0x0802e130
  64133. 801a098: 0802e164 .word 0x0802e164
  64134. 801a09c: 0802e190 .word 0x0802e190
  64135. 0801a0a0 <pbuf_alloc_reference>:
  64136. *
  64137. * @return the allocated pbuf.
  64138. */
  64139. struct pbuf *
  64140. pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type)
  64141. {
  64142. 801a0a0: b580 push {r7, lr}
  64143. 801a0a2: b086 sub sp, #24
  64144. 801a0a4: af02 add r7, sp, #8
  64145. 801a0a6: 6078 str r0, [r7, #4]
  64146. 801a0a8: 460b mov r3, r1
  64147. 801a0aa: 807b strh r3, [r7, #2]
  64148. 801a0ac: 4613 mov r3, r2
  64149. 801a0ae: 803b strh r3, [r7, #0]
  64150. struct pbuf *p;
  64151. LWIP_ASSERT("invalid pbuf_type", (type == PBUF_REF) || (type == PBUF_ROM));
  64152. 801a0b0: 883b ldrh r3, [r7, #0]
  64153. 801a0b2: 2b41 cmp r3, #65 @ 0x41
  64154. 801a0b4: d009 beq.n 801a0ca <pbuf_alloc_reference+0x2a>
  64155. 801a0b6: 883b ldrh r3, [r7, #0]
  64156. 801a0b8: 2b01 cmp r3, #1
  64157. 801a0ba: d006 beq.n 801a0ca <pbuf_alloc_reference+0x2a>
  64158. 801a0bc: 4b0f ldr r3, [pc, #60] @ (801a0fc <pbuf_alloc_reference+0x5c>)
  64159. 801a0be: f44f 72a5 mov.w r2, #330 @ 0x14a
  64160. 801a0c2: 490f ldr r1, [pc, #60] @ (801a100 <pbuf_alloc_reference+0x60>)
  64161. 801a0c4: 480f ldr r0, [pc, #60] @ (801a104 <pbuf_alloc_reference+0x64>)
  64162. 801a0c6: f00f fc81 bl 80299cc <iprintf>
  64163. /* only allocate memory for the pbuf structure */
  64164. p = (struct pbuf *)memp_malloc(MEMP_PBUF);
  64165. 801a0ca: 200b movs r0, #11
  64166. 801a0cc: f7ff faa2 bl 8019614 <memp_malloc>
  64167. 801a0d0: 60f8 str r0, [r7, #12]
  64168. if (p == NULL) {
  64169. 801a0d2: 68fb ldr r3, [r7, #12]
  64170. 801a0d4: 2b00 cmp r3, #0
  64171. 801a0d6: d101 bne.n 801a0dc <pbuf_alloc_reference+0x3c>
  64172. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  64173. ("pbuf_alloc_reference: Could not allocate MEMP_PBUF for PBUF_%s.\n",
  64174. (type == PBUF_ROM) ? "ROM" : "REF"));
  64175. return NULL;
  64176. 801a0d8: 2300 movs r3, #0
  64177. 801a0da: e00b b.n 801a0f4 <pbuf_alloc_reference+0x54>
  64178. }
  64179. pbuf_init_alloced_pbuf(p, payload, length, length, type, 0);
  64180. 801a0dc: 8879 ldrh r1, [r7, #2]
  64181. 801a0de: 887a ldrh r2, [r7, #2]
  64182. 801a0e0: 2300 movs r3, #0
  64183. 801a0e2: 9301 str r3, [sp, #4]
  64184. 801a0e4: 883b ldrh r3, [r7, #0]
  64185. 801a0e6: 9300 str r3, [sp, #0]
  64186. 801a0e8: 460b mov r3, r1
  64187. 801a0ea: 6879 ldr r1, [r7, #4]
  64188. 801a0ec: 68f8 ldr r0, [r7, #12]
  64189. 801a0ee: f7ff feb5 bl 8019e5c <pbuf_init_alloced_pbuf>
  64190. return p;
  64191. 801a0f2: 68fb ldr r3, [r7, #12]
  64192. }
  64193. 801a0f4: 4618 mov r0, r3
  64194. 801a0f6: 3710 adds r7, #16
  64195. 801a0f8: 46bd mov sp, r7
  64196. 801a0fa: bd80 pop {r7, pc}
  64197. 801a0fc: 0802e0a8 .word 0x0802e0a8
  64198. 801a100: 0802e1ac .word 0x0802e1ac
  64199. 801a104: 0802e108 .word 0x0802e108
  64200. 0801a108 <pbuf_alloced_custom>:
  64201. * big enough to hold 'length' plus the header size
  64202. */
  64203. struct pbuf *
  64204. pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p,
  64205. void *payload_mem, u16_t payload_mem_len)
  64206. {
  64207. 801a108: b580 push {r7, lr}
  64208. 801a10a: b088 sub sp, #32
  64209. 801a10c: af02 add r7, sp, #8
  64210. 801a10e: 607b str r3, [r7, #4]
  64211. 801a110: 4603 mov r3, r0
  64212. 801a112: 73fb strb r3, [r7, #15]
  64213. 801a114: 460b mov r3, r1
  64214. 801a116: 81bb strh r3, [r7, #12]
  64215. 801a118: 4613 mov r3, r2
  64216. 801a11a: 817b strh r3, [r7, #10]
  64217. u16_t offset = (u16_t)l;
  64218. 801a11c: 7bfb ldrb r3, [r7, #15]
  64219. 801a11e: 827b strh r3, [r7, #18]
  64220. void *payload;
  64221. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloced_custom(length=%"U16_F")\n", length));
  64222. if (LWIP_MEM_ALIGN_SIZE(offset) + length > payload_mem_len) {
  64223. 801a120: 8a7b ldrh r3, [r7, #18]
  64224. 801a122: 3303 adds r3, #3
  64225. 801a124: f023 0203 bic.w r2, r3, #3
  64226. 801a128: 89bb ldrh r3, [r7, #12]
  64227. 801a12a: 441a add r2, r3
  64228. 801a12c: 8cbb ldrh r3, [r7, #36] @ 0x24
  64229. 801a12e: 429a cmp r2, r3
  64230. 801a130: d901 bls.n 801a136 <pbuf_alloced_custom+0x2e>
  64231. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_WARNING, ("pbuf_alloced_custom(length=%"U16_F") buffer too short\n", length));
  64232. return NULL;
  64233. 801a132: 2300 movs r3, #0
  64234. 801a134: e018 b.n 801a168 <pbuf_alloced_custom+0x60>
  64235. }
  64236. if (payload_mem != NULL) {
  64237. 801a136: 6a3b ldr r3, [r7, #32]
  64238. 801a138: 2b00 cmp r3, #0
  64239. 801a13a: d007 beq.n 801a14c <pbuf_alloced_custom+0x44>
  64240. payload = (u8_t *)payload_mem + LWIP_MEM_ALIGN_SIZE(offset);
  64241. 801a13c: 8a7b ldrh r3, [r7, #18]
  64242. 801a13e: 3303 adds r3, #3
  64243. 801a140: f023 0303 bic.w r3, r3, #3
  64244. 801a144: 6a3a ldr r2, [r7, #32]
  64245. 801a146: 4413 add r3, r2
  64246. 801a148: 617b str r3, [r7, #20]
  64247. 801a14a: e001 b.n 801a150 <pbuf_alloced_custom+0x48>
  64248. } else {
  64249. payload = NULL;
  64250. 801a14c: 2300 movs r3, #0
  64251. 801a14e: 617b str r3, [r7, #20]
  64252. }
  64253. pbuf_init_alloced_pbuf(&p->pbuf, payload, length, length, type, PBUF_FLAG_IS_CUSTOM);
  64254. 801a150: 6878 ldr r0, [r7, #4]
  64255. 801a152: 89b9 ldrh r1, [r7, #12]
  64256. 801a154: 89ba ldrh r2, [r7, #12]
  64257. 801a156: 2302 movs r3, #2
  64258. 801a158: 9301 str r3, [sp, #4]
  64259. 801a15a: 897b ldrh r3, [r7, #10]
  64260. 801a15c: 9300 str r3, [sp, #0]
  64261. 801a15e: 460b mov r3, r1
  64262. 801a160: 6979 ldr r1, [r7, #20]
  64263. 801a162: f7ff fe7b bl 8019e5c <pbuf_init_alloced_pbuf>
  64264. return &p->pbuf;
  64265. 801a166: 687b ldr r3, [r7, #4]
  64266. }
  64267. 801a168: 4618 mov r0, r3
  64268. 801a16a: 3718 adds r7, #24
  64269. 801a16c: 46bd mov sp, r7
  64270. 801a16e: bd80 pop {r7, pc}
  64271. 0801a170 <pbuf_realloc>:
  64272. *
  64273. * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain).
  64274. */
  64275. void
  64276. pbuf_realloc(struct pbuf *p, u16_t new_len)
  64277. {
  64278. 801a170: b580 push {r7, lr}
  64279. 801a172: b084 sub sp, #16
  64280. 801a174: af00 add r7, sp, #0
  64281. 801a176: 6078 str r0, [r7, #4]
  64282. 801a178: 460b mov r3, r1
  64283. 801a17a: 807b strh r3, [r7, #2]
  64284. struct pbuf *q;
  64285. u16_t rem_len; /* remaining length */
  64286. u16_t shrink;
  64287. LWIP_ASSERT("pbuf_realloc: p != NULL", p != NULL);
  64288. 801a17c: 687b ldr r3, [r7, #4]
  64289. 801a17e: 2b00 cmp r3, #0
  64290. 801a180: d106 bne.n 801a190 <pbuf_realloc+0x20>
  64291. 801a182: 4b39 ldr r3, [pc, #228] @ (801a268 <pbuf_realloc+0xf8>)
  64292. 801a184: f44f 72cc mov.w r2, #408 @ 0x198
  64293. 801a188: 4938 ldr r1, [pc, #224] @ (801a26c <pbuf_realloc+0xfc>)
  64294. 801a18a: 4839 ldr r0, [pc, #228] @ (801a270 <pbuf_realloc+0x100>)
  64295. 801a18c: f00f fc1e bl 80299cc <iprintf>
  64296. /* desired length larger than current length? */
  64297. if (new_len >= p->tot_len) {
  64298. 801a190: 687b ldr r3, [r7, #4]
  64299. 801a192: 891b ldrh r3, [r3, #8]
  64300. 801a194: 887a ldrh r2, [r7, #2]
  64301. 801a196: 429a cmp r2, r3
  64302. 801a198: d261 bcs.n 801a25e <pbuf_realloc+0xee>
  64303. return;
  64304. }
  64305. /* the pbuf chain grows by (new_len - p->tot_len) bytes
  64306. * (which may be negative in case of shrinking) */
  64307. shrink = (u16_t)(p->tot_len - new_len);
  64308. 801a19a: 687b ldr r3, [r7, #4]
  64309. 801a19c: 891a ldrh r2, [r3, #8]
  64310. 801a19e: 887b ldrh r3, [r7, #2]
  64311. 801a1a0: 1ad3 subs r3, r2, r3
  64312. 801a1a2: 813b strh r3, [r7, #8]
  64313. /* first, step over any pbufs that should remain in the chain */
  64314. rem_len = new_len;
  64315. 801a1a4: 887b ldrh r3, [r7, #2]
  64316. 801a1a6: 817b strh r3, [r7, #10]
  64317. q = p;
  64318. 801a1a8: 687b ldr r3, [r7, #4]
  64319. 801a1aa: 60fb str r3, [r7, #12]
  64320. /* should this pbuf be kept? */
  64321. while (rem_len > q->len) {
  64322. 801a1ac: e018 b.n 801a1e0 <pbuf_realloc+0x70>
  64323. /* decrease remaining length by pbuf length */
  64324. rem_len = (u16_t)(rem_len - q->len);
  64325. 801a1ae: 68fb ldr r3, [r7, #12]
  64326. 801a1b0: 895b ldrh r3, [r3, #10]
  64327. 801a1b2: 897a ldrh r2, [r7, #10]
  64328. 801a1b4: 1ad3 subs r3, r2, r3
  64329. 801a1b6: 817b strh r3, [r7, #10]
  64330. /* decrease total length indicator */
  64331. q->tot_len = (u16_t)(q->tot_len - shrink);
  64332. 801a1b8: 68fb ldr r3, [r7, #12]
  64333. 801a1ba: 891a ldrh r2, [r3, #8]
  64334. 801a1bc: 893b ldrh r3, [r7, #8]
  64335. 801a1be: 1ad3 subs r3, r2, r3
  64336. 801a1c0: b29a uxth r2, r3
  64337. 801a1c2: 68fb ldr r3, [r7, #12]
  64338. 801a1c4: 811a strh r2, [r3, #8]
  64339. /* proceed to next pbuf in chain */
  64340. q = q->next;
  64341. 801a1c6: 68fb ldr r3, [r7, #12]
  64342. 801a1c8: 681b ldr r3, [r3, #0]
  64343. 801a1ca: 60fb str r3, [r7, #12]
  64344. LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL);
  64345. 801a1cc: 68fb ldr r3, [r7, #12]
  64346. 801a1ce: 2b00 cmp r3, #0
  64347. 801a1d0: d106 bne.n 801a1e0 <pbuf_realloc+0x70>
  64348. 801a1d2: 4b25 ldr r3, [pc, #148] @ (801a268 <pbuf_realloc+0xf8>)
  64349. 801a1d4: f240 12af movw r2, #431 @ 0x1af
  64350. 801a1d8: 4926 ldr r1, [pc, #152] @ (801a274 <pbuf_realloc+0x104>)
  64351. 801a1da: 4825 ldr r0, [pc, #148] @ (801a270 <pbuf_realloc+0x100>)
  64352. 801a1dc: f00f fbf6 bl 80299cc <iprintf>
  64353. while (rem_len > q->len) {
  64354. 801a1e0: 68fb ldr r3, [r7, #12]
  64355. 801a1e2: 895b ldrh r3, [r3, #10]
  64356. 801a1e4: 897a ldrh r2, [r7, #10]
  64357. 801a1e6: 429a cmp r2, r3
  64358. 801a1e8: d8e1 bhi.n 801a1ae <pbuf_realloc+0x3e>
  64359. /* we have now reached the new last pbuf (in q) */
  64360. /* rem_len == desired length for pbuf q */
  64361. /* shrink allocated memory for PBUF_RAM */
  64362. /* (other types merely adjust their length fields */
  64363. if (pbuf_match_allocsrc(q, PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP) && (rem_len != q->len)
  64364. 801a1ea: 68fb ldr r3, [r7, #12]
  64365. 801a1ec: 7b1b ldrb r3, [r3, #12]
  64366. 801a1ee: f003 030f and.w r3, r3, #15
  64367. 801a1f2: 2b00 cmp r3, #0
  64368. 801a1f4: d11f bne.n 801a236 <pbuf_realloc+0xc6>
  64369. 801a1f6: 68fb ldr r3, [r7, #12]
  64370. 801a1f8: 895b ldrh r3, [r3, #10]
  64371. 801a1fa: 897a ldrh r2, [r7, #10]
  64372. 801a1fc: 429a cmp r2, r3
  64373. 801a1fe: d01a beq.n 801a236 <pbuf_realloc+0xc6>
  64374. #if LWIP_SUPPORT_CUSTOM_PBUF
  64375. && ((q->flags & PBUF_FLAG_IS_CUSTOM) == 0)
  64376. 801a200: 68fb ldr r3, [r7, #12]
  64377. 801a202: 7b5b ldrb r3, [r3, #13]
  64378. 801a204: f003 0302 and.w r3, r3, #2
  64379. 801a208: 2b00 cmp r3, #0
  64380. 801a20a: d114 bne.n 801a236 <pbuf_realloc+0xc6>
  64381. #endif /* LWIP_SUPPORT_CUSTOM_PBUF */
  64382. ) {
  64383. /* reallocate and adjust the length of the pbuf that will be split */
  64384. q = (struct pbuf *)mem_trim(q, (mem_size_t)(((u8_t *)q->payload - (u8_t *)q) + rem_len));
  64385. 801a20c: 68fb ldr r3, [r7, #12]
  64386. 801a20e: 685a ldr r2, [r3, #4]
  64387. 801a210: 68fb ldr r3, [r7, #12]
  64388. 801a212: 1ad2 subs r2, r2, r3
  64389. 801a214: 897b ldrh r3, [r7, #10]
  64390. 801a216: 4413 add r3, r2
  64391. 801a218: 4619 mov r1, r3
  64392. 801a21a: 68f8 ldr r0, [r7, #12]
  64393. 801a21c: f7fe ff5c bl 80190d8 <mem_trim>
  64394. 801a220: 60f8 str r0, [r7, #12]
  64395. LWIP_ASSERT("mem_trim returned q == NULL", q != NULL);
  64396. 801a222: 68fb ldr r3, [r7, #12]
  64397. 801a224: 2b00 cmp r3, #0
  64398. 801a226: d106 bne.n 801a236 <pbuf_realloc+0xc6>
  64399. 801a228: 4b0f ldr r3, [pc, #60] @ (801a268 <pbuf_realloc+0xf8>)
  64400. 801a22a: f240 12bd movw r2, #445 @ 0x1bd
  64401. 801a22e: 4912 ldr r1, [pc, #72] @ (801a278 <pbuf_realloc+0x108>)
  64402. 801a230: 480f ldr r0, [pc, #60] @ (801a270 <pbuf_realloc+0x100>)
  64403. 801a232: f00f fbcb bl 80299cc <iprintf>
  64404. }
  64405. /* adjust length fields for new last pbuf */
  64406. q->len = rem_len;
  64407. 801a236: 68fb ldr r3, [r7, #12]
  64408. 801a238: 897a ldrh r2, [r7, #10]
  64409. 801a23a: 815a strh r2, [r3, #10]
  64410. q->tot_len = q->len;
  64411. 801a23c: 68fb ldr r3, [r7, #12]
  64412. 801a23e: 895a ldrh r2, [r3, #10]
  64413. 801a240: 68fb ldr r3, [r7, #12]
  64414. 801a242: 811a strh r2, [r3, #8]
  64415. /* any remaining pbufs in chain? */
  64416. if (q->next != NULL) {
  64417. 801a244: 68fb ldr r3, [r7, #12]
  64418. 801a246: 681b ldr r3, [r3, #0]
  64419. 801a248: 2b00 cmp r3, #0
  64420. 801a24a: d004 beq.n 801a256 <pbuf_realloc+0xe6>
  64421. /* free remaining pbufs in chain */
  64422. pbuf_free(q->next);
  64423. 801a24c: 68fb ldr r3, [r7, #12]
  64424. 801a24e: 681b ldr r3, [r3, #0]
  64425. 801a250: 4618 mov r0, r3
  64426. 801a252: f000 f943 bl 801a4dc <pbuf_free>
  64427. }
  64428. /* q is last packet in chain */
  64429. q->next = NULL;
  64430. 801a256: 68fb ldr r3, [r7, #12]
  64431. 801a258: 2200 movs r2, #0
  64432. 801a25a: 601a str r2, [r3, #0]
  64433. 801a25c: e000 b.n 801a260 <pbuf_realloc+0xf0>
  64434. return;
  64435. 801a25e: bf00 nop
  64436. }
  64437. 801a260: 3710 adds r7, #16
  64438. 801a262: 46bd mov sp, r7
  64439. 801a264: bd80 pop {r7, pc}
  64440. 801a266: bf00 nop
  64441. 801a268: 0802e0a8 .word 0x0802e0a8
  64442. 801a26c: 0802e1c0 .word 0x0802e1c0
  64443. 801a270: 0802e108 .word 0x0802e108
  64444. 801a274: 0802e1d8 .word 0x0802e1d8
  64445. 801a278: 0802e1f0 .word 0x0802e1f0
  64446. 0801a27c <pbuf_add_header_impl>:
  64447. * @return non-zero on failure, zero on success.
  64448. *
  64449. */
  64450. static u8_t
  64451. pbuf_add_header_impl(struct pbuf *p, size_t header_size_increment, u8_t force)
  64452. {
  64453. 801a27c: b580 push {r7, lr}
  64454. 801a27e: b086 sub sp, #24
  64455. 801a280: af00 add r7, sp, #0
  64456. 801a282: 60f8 str r0, [r7, #12]
  64457. 801a284: 60b9 str r1, [r7, #8]
  64458. 801a286: 4613 mov r3, r2
  64459. 801a288: 71fb strb r3, [r7, #7]
  64460. u16_t type_internal;
  64461. void *payload;
  64462. u16_t increment_magnitude;
  64463. LWIP_ASSERT("p != NULL", p != NULL);
  64464. 801a28a: 68fb ldr r3, [r7, #12]
  64465. 801a28c: 2b00 cmp r3, #0
  64466. 801a28e: d106 bne.n 801a29e <pbuf_add_header_impl+0x22>
  64467. 801a290: 4b2b ldr r3, [pc, #172] @ (801a340 <pbuf_add_header_impl+0xc4>)
  64468. 801a292: f240 12df movw r2, #479 @ 0x1df
  64469. 801a296: 492b ldr r1, [pc, #172] @ (801a344 <pbuf_add_header_impl+0xc8>)
  64470. 801a298: 482b ldr r0, [pc, #172] @ (801a348 <pbuf_add_header_impl+0xcc>)
  64471. 801a29a: f00f fb97 bl 80299cc <iprintf>
  64472. if ((p == NULL) || (header_size_increment > 0xFFFF)) {
  64473. 801a29e: 68fb ldr r3, [r7, #12]
  64474. 801a2a0: 2b00 cmp r3, #0
  64475. 801a2a2: d003 beq.n 801a2ac <pbuf_add_header_impl+0x30>
  64476. 801a2a4: 68bb ldr r3, [r7, #8]
  64477. 801a2a6: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  64478. 801a2aa: d301 bcc.n 801a2b0 <pbuf_add_header_impl+0x34>
  64479. return 1;
  64480. 801a2ac: 2301 movs r3, #1
  64481. 801a2ae: e043 b.n 801a338 <pbuf_add_header_impl+0xbc>
  64482. }
  64483. if (header_size_increment == 0) {
  64484. 801a2b0: 68bb ldr r3, [r7, #8]
  64485. 801a2b2: 2b00 cmp r3, #0
  64486. 801a2b4: d101 bne.n 801a2ba <pbuf_add_header_impl+0x3e>
  64487. return 0;
  64488. 801a2b6: 2300 movs r3, #0
  64489. 801a2b8: e03e b.n 801a338 <pbuf_add_header_impl+0xbc>
  64490. }
  64491. increment_magnitude = (u16_t)header_size_increment;
  64492. 801a2ba: 68bb ldr r3, [r7, #8]
  64493. 801a2bc: 827b strh r3, [r7, #18]
  64494. /* Do not allow tot_len to wrap as a result. */
  64495. if ((u16_t)(increment_magnitude + p->tot_len) < increment_magnitude) {
  64496. 801a2be: 68fb ldr r3, [r7, #12]
  64497. 801a2c0: 891a ldrh r2, [r3, #8]
  64498. 801a2c2: 8a7b ldrh r3, [r7, #18]
  64499. 801a2c4: 4413 add r3, r2
  64500. 801a2c6: b29b uxth r3, r3
  64501. 801a2c8: 8a7a ldrh r2, [r7, #18]
  64502. 801a2ca: 429a cmp r2, r3
  64503. 801a2cc: d901 bls.n 801a2d2 <pbuf_add_header_impl+0x56>
  64504. return 1;
  64505. 801a2ce: 2301 movs r3, #1
  64506. 801a2d0: e032 b.n 801a338 <pbuf_add_header_impl+0xbc>
  64507. }
  64508. type_internal = p->type_internal;
  64509. 801a2d2: 68fb ldr r3, [r7, #12]
  64510. 801a2d4: 7b1b ldrb r3, [r3, #12]
  64511. 801a2d6: 823b strh r3, [r7, #16]
  64512. /* pbuf types containing payloads? */
  64513. if (type_internal & PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS) {
  64514. 801a2d8: 8a3b ldrh r3, [r7, #16]
  64515. 801a2da: f003 0380 and.w r3, r3, #128 @ 0x80
  64516. 801a2de: 2b00 cmp r3, #0
  64517. 801a2e0: d00c beq.n 801a2fc <pbuf_add_header_impl+0x80>
  64518. /* set new payload pointer */
  64519. payload = (u8_t *)p->payload - header_size_increment;
  64520. 801a2e2: 68fb ldr r3, [r7, #12]
  64521. 801a2e4: 685a ldr r2, [r3, #4]
  64522. 801a2e6: 68bb ldr r3, [r7, #8]
  64523. 801a2e8: 425b negs r3, r3
  64524. 801a2ea: 4413 add r3, r2
  64525. 801a2ec: 617b str r3, [r7, #20]
  64526. /* boundary check fails? */
  64527. if ((u8_t *)payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) {
  64528. 801a2ee: 68fb ldr r3, [r7, #12]
  64529. 801a2f0: 3310 adds r3, #16
  64530. 801a2f2: 697a ldr r2, [r7, #20]
  64531. 801a2f4: 429a cmp r2, r3
  64532. 801a2f6: d20d bcs.n 801a314 <pbuf_add_header_impl+0x98>
  64533. LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE,
  64534. ("pbuf_add_header: failed as %p < %p (not enough space for new header size)\n",
  64535. (void *)payload, (void *)((u8_t *)p + SIZEOF_STRUCT_PBUF)));
  64536. /* bail out unsuccessfully */
  64537. return 1;
  64538. 801a2f8: 2301 movs r3, #1
  64539. 801a2fa: e01d b.n 801a338 <pbuf_add_header_impl+0xbc>
  64540. }
  64541. /* pbuf types referring to external payloads? */
  64542. } else {
  64543. /* hide a header in the payload? */
  64544. if (force) {
  64545. 801a2fc: 79fb ldrb r3, [r7, #7]
  64546. 801a2fe: 2b00 cmp r3, #0
  64547. 801a300: d006 beq.n 801a310 <pbuf_add_header_impl+0x94>
  64548. payload = (u8_t *)p->payload - header_size_increment;
  64549. 801a302: 68fb ldr r3, [r7, #12]
  64550. 801a304: 685a ldr r2, [r3, #4]
  64551. 801a306: 68bb ldr r3, [r7, #8]
  64552. 801a308: 425b negs r3, r3
  64553. 801a30a: 4413 add r3, r2
  64554. 801a30c: 617b str r3, [r7, #20]
  64555. 801a30e: e001 b.n 801a314 <pbuf_add_header_impl+0x98>
  64556. } else {
  64557. /* cannot expand payload to front (yet!)
  64558. * bail out unsuccessfully */
  64559. return 1;
  64560. 801a310: 2301 movs r3, #1
  64561. 801a312: e011 b.n 801a338 <pbuf_add_header_impl+0xbc>
  64562. }
  64563. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_add_header: old %p new %p (%"U16_F")\n",
  64564. (void *)p->payload, (void *)payload, increment_magnitude));
  64565. /* modify pbuf fields */
  64566. p->payload = payload;
  64567. 801a314: 68fb ldr r3, [r7, #12]
  64568. 801a316: 697a ldr r2, [r7, #20]
  64569. 801a318: 605a str r2, [r3, #4]
  64570. p->len = (u16_t)(p->len + increment_magnitude);
  64571. 801a31a: 68fb ldr r3, [r7, #12]
  64572. 801a31c: 895a ldrh r2, [r3, #10]
  64573. 801a31e: 8a7b ldrh r3, [r7, #18]
  64574. 801a320: 4413 add r3, r2
  64575. 801a322: b29a uxth r2, r3
  64576. 801a324: 68fb ldr r3, [r7, #12]
  64577. 801a326: 815a strh r2, [r3, #10]
  64578. p->tot_len = (u16_t)(p->tot_len + increment_magnitude);
  64579. 801a328: 68fb ldr r3, [r7, #12]
  64580. 801a32a: 891a ldrh r2, [r3, #8]
  64581. 801a32c: 8a7b ldrh r3, [r7, #18]
  64582. 801a32e: 4413 add r3, r2
  64583. 801a330: b29a uxth r2, r3
  64584. 801a332: 68fb ldr r3, [r7, #12]
  64585. 801a334: 811a strh r2, [r3, #8]
  64586. return 0;
  64587. 801a336: 2300 movs r3, #0
  64588. }
  64589. 801a338: 4618 mov r0, r3
  64590. 801a33a: 3718 adds r7, #24
  64591. 801a33c: 46bd mov sp, r7
  64592. 801a33e: bd80 pop {r7, pc}
  64593. 801a340: 0802e0a8 .word 0x0802e0a8
  64594. 801a344: 0802e20c .word 0x0802e20c
  64595. 801a348: 0802e108 .word 0x0802e108
  64596. 0801a34c <pbuf_add_header>:
  64597. * @return non-zero on failure, zero on success.
  64598. *
  64599. */
  64600. u8_t
  64601. pbuf_add_header(struct pbuf *p, size_t header_size_increment)
  64602. {
  64603. 801a34c: b580 push {r7, lr}
  64604. 801a34e: b082 sub sp, #8
  64605. 801a350: af00 add r7, sp, #0
  64606. 801a352: 6078 str r0, [r7, #4]
  64607. 801a354: 6039 str r1, [r7, #0]
  64608. return pbuf_add_header_impl(p, header_size_increment, 0);
  64609. 801a356: 2200 movs r2, #0
  64610. 801a358: 6839 ldr r1, [r7, #0]
  64611. 801a35a: 6878 ldr r0, [r7, #4]
  64612. 801a35c: f7ff ff8e bl 801a27c <pbuf_add_header_impl>
  64613. 801a360: 4603 mov r3, r0
  64614. }
  64615. 801a362: 4618 mov r0, r3
  64616. 801a364: 3708 adds r7, #8
  64617. 801a366: 46bd mov sp, r7
  64618. 801a368: bd80 pop {r7, pc}
  64619. ...
  64620. 0801a36c <pbuf_remove_header>:
  64621. * @return non-zero on failure, zero on success.
  64622. *
  64623. */
  64624. u8_t
  64625. pbuf_remove_header(struct pbuf *p, size_t header_size_decrement)
  64626. {
  64627. 801a36c: b580 push {r7, lr}
  64628. 801a36e: b084 sub sp, #16
  64629. 801a370: af00 add r7, sp, #0
  64630. 801a372: 6078 str r0, [r7, #4]
  64631. 801a374: 6039 str r1, [r7, #0]
  64632. void *payload;
  64633. u16_t increment_magnitude;
  64634. LWIP_ASSERT("p != NULL", p != NULL);
  64635. 801a376: 687b ldr r3, [r7, #4]
  64636. 801a378: 2b00 cmp r3, #0
  64637. 801a37a: d106 bne.n 801a38a <pbuf_remove_header+0x1e>
  64638. 801a37c: 4b20 ldr r3, [pc, #128] @ (801a400 <pbuf_remove_header+0x94>)
  64639. 801a37e: f240 224b movw r2, #587 @ 0x24b
  64640. 801a382: 4920 ldr r1, [pc, #128] @ (801a404 <pbuf_remove_header+0x98>)
  64641. 801a384: 4820 ldr r0, [pc, #128] @ (801a408 <pbuf_remove_header+0x9c>)
  64642. 801a386: f00f fb21 bl 80299cc <iprintf>
  64643. if ((p == NULL) || (header_size_decrement > 0xFFFF)) {
  64644. 801a38a: 687b ldr r3, [r7, #4]
  64645. 801a38c: 2b00 cmp r3, #0
  64646. 801a38e: d003 beq.n 801a398 <pbuf_remove_header+0x2c>
  64647. 801a390: 683b ldr r3, [r7, #0]
  64648. 801a392: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  64649. 801a396: d301 bcc.n 801a39c <pbuf_remove_header+0x30>
  64650. return 1;
  64651. 801a398: 2301 movs r3, #1
  64652. 801a39a: e02c b.n 801a3f6 <pbuf_remove_header+0x8a>
  64653. }
  64654. if (header_size_decrement == 0) {
  64655. 801a39c: 683b ldr r3, [r7, #0]
  64656. 801a39e: 2b00 cmp r3, #0
  64657. 801a3a0: d101 bne.n 801a3a6 <pbuf_remove_header+0x3a>
  64658. return 0;
  64659. 801a3a2: 2300 movs r3, #0
  64660. 801a3a4: e027 b.n 801a3f6 <pbuf_remove_header+0x8a>
  64661. }
  64662. increment_magnitude = (u16_t)header_size_decrement;
  64663. 801a3a6: 683b ldr r3, [r7, #0]
  64664. 801a3a8: 81fb strh r3, [r7, #14]
  64665. /* Check that we aren't going to move off the end of the pbuf */
  64666. LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
  64667. 801a3aa: 687b ldr r3, [r7, #4]
  64668. 801a3ac: 895b ldrh r3, [r3, #10]
  64669. 801a3ae: 89fa ldrh r2, [r7, #14]
  64670. 801a3b0: 429a cmp r2, r3
  64671. 801a3b2: d908 bls.n 801a3c6 <pbuf_remove_header+0x5a>
  64672. 801a3b4: 4b12 ldr r3, [pc, #72] @ (801a400 <pbuf_remove_header+0x94>)
  64673. 801a3b6: f240 2255 movw r2, #597 @ 0x255
  64674. 801a3ba: 4914 ldr r1, [pc, #80] @ (801a40c <pbuf_remove_header+0xa0>)
  64675. 801a3bc: 4812 ldr r0, [pc, #72] @ (801a408 <pbuf_remove_header+0x9c>)
  64676. 801a3be: f00f fb05 bl 80299cc <iprintf>
  64677. 801a3c2: 2301 movs r3, #1
  64678. 801a3c4: e017 b.n 801a3f6 <pbuf_remove_header+0x8a>
  64679. /* remember current payload pointer */
  64680. payload = p->payload;
  64681. 801a3c6: 687b ldr r3, [r7, #4]
  64682. 801a3c8: 685b ldr r3, [r3, #4]
  64683. 801a3ca: 60bb str r3, [r7, #8]
  64684. LWIP_UNUSED_ARG(payload); /* only used in LWIP_DEBUGF below */
  64685. /* increase payload pointer (guarded by length check above) */
  64686. p->payload = (u8_t *)p->payload + header_size_decrement;
  64687. 801a3cc: 687b ldr r3, [r7, #4]
  64688. 801a3ce: 685a ldr r2, [r3, #4]
  64689. 801a3d0: 683b ldr r3, [r7, #0]
  64690. 801a3d2: 441a add r2, r3
  64691. 801a3d4: 687b ldr r3, [r7, #4]
  64692. 801a3d6: 605a str r2, [r3, #4]
  64693. /* modify pbuf length fields */
  64694. p->len = (u16_t)(p->len - increment_magnitude);
  64695. 801a3d8: 687b ldr r3, [r7, #4]
  64696. 801a3da: 895a ldrh r2, [r3, #10]
  64697. 801a3dc: 89fb ldrh r3, [r7, #14]
  64698. 801a3de: 1ad3 subs r3, r2, r3
  64699. 801a3e0: b29a uxth r2, r3
  64700. 801a3e2: 687b ldr r3, [r7, #4]
  64701. 801a3e4: 815a strh r2, [r3, #10]
  64702. p->tot_len = (u16_t)(p->tot_len - increment_magnitude);
  64703. 801a3e6: 687b ldr r3, [r7, #4]
  64704. 801a3e8: 891a ldrh r2, [r3, #8]
  64705. 801a3ea: 89fb ldrh r3, [r7, #14]
  64706. 801a3ec: 1ad3 subs r3, r2, r3
  64707. 801a3ee: b29a uxth r2, r3
  64708. 801a3f0: 687b ldr r3, [r7, #4]
  64709. 801a3f2: 811a strh r2, [r3, #8]
  64710. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_remove_header: old %p new %p (%"U16_F")\n",
  64711. (void *)payload, (void *)p->payload, increment_magnitude));
  64712. return 0;
  64713. 801a3f4: 2300 movs r3, #0
  64714. }
  64715. 801a3f6: 4618 mov r0, r3
  64716. 801a3f8: 3710 adds r7, #16
  64717. 801a3fa: 46bd mov sp, r7
  64718. 801a3fc: bd80 pop {r7, pc}
  64719. 801a3fe: bf00 nop
  64720. 801a400: 0802e0a8 .word 0x0802e0a8
  64721. 801a404: 0802e20c .word 0x0802e20c
  64722. 801a408: 0802e108 .word 0x0802e108
  64723. 801a40c: 0802e218 .word 0x0802e218
  64724. 0801a410 <pbuf_header_impl>:
  64725. static u8_t
  64726. pbuf_header_impl(struct pbuf *p, s16_t header_size_increment, u8_t force)
  64727. {
  64728. 801a410: b580 push {r7, lr}
  64729. 801a412: b082 sub sp, #8
  64730. 801a414: af00 add r7, sp, #0
  64731. 801a416: 6078 str r0, [r7, #4]
  64732. 801a418: 460b mov r3, r1
  64733. 801a41a: 807b strh r3, [r7, #2]
  64734. 801a41c: 4613 mov r3, r2
  64735. 801a41e: 707b strb r3, [r7, #1]
  64736. if (header_size_increment < 0) {
  64737. 801a420: f9b7 3002 ldrsh.w r3, [r7, #2]
  64738. 801a424: 2b00 cmp r3, #0
  64739. 801a426: da08 bge.n 801a43a <pbuf_header_impl+0x2a>
  64740. return pbuf_remove_header(p, (size_t) - header_size_increment);
  64741. 801a428: f9b7 3002 ldrsh.w r3, [r7, #2]
  64742. 801a42c: 425b negs r3, r3
  64743. 801a42e: 4619 mov r1, r3
  64744. 801a430: 6878 ldr r0, [r7, #4]
  64745. 801a432: f7ff ff9b bl 801a36c <pbuf_remove_header>
  64746. 801a436: 4603 mov r3, r0
  64747. 801a438: e007 b.n 801a44a <pbuf_header_impl+0x3a>
  64748. } else {
  64749. return pbuf_add_header_impl(p, (size_t)header_size_increment, force);
  64750. 801a43a: f9b7 3002 ldrsh.w r3, [r7, #2]
  64751. 801a43e: 787a ldrb r2, [r7, #1]
  64752. 801a440: 4619 mov r1, r3
  64753. 801a442: 6878 ldr r0, [r7, #4]
  64754. 801a444: f7ff ff1a bl 801a27c <pbuf_add_header_impl>
  64755. 801a448: 4603 mov r3, r0
  64756. }
  64757. }
  64758. 801a44a: 4618 mov r0, r3
  64759. 801a44c: 3708 adds r7, #8
  64760. 801a44e: 46bd mov sp, r7
  64761. 801a450: bd80 pop {r7, pc}
  64762. 0801a452 <pbuf_header_force>:
  64763. * Same as pbuf_header but does not check if 'header_size > 0' is allowed.
  64764. * This is used internally only, to allow PBUF_REF for RX.
  64765. */
  64766. u8_t
  64767. pbuf_header_force(struct pbuf *p, s16_t header_size_increment)
  64768. {
  64769. 801a452: b580 push {r7, lr}
  64770. 801a454: b082 sub sp, #8
  64771. 801a456: af00 add r7, sp, #0
  64772. 801a458: 6078 str r0, [r7, #4]
  64773. 801a45a: 460b mov r3, r1
  64774. 801a45c: 807b strh r3, [r7, #2]
  64775. return pbuf_header_impl(p, header_size_increment, 1);
  64776. 801a45e: f9b7 3002 ldrsh.w r3, [r7, #2]
  64777. 801a462: 2201 movs r2, #1
  64778. 801a464: 4619 mov r1, r3
  64779. 801a466: 6878 ldr r0, [r7, #4]
  64780. 801a468: f7ff ffd2 bl 801a410 <pbuf_header_impl>
  64781. 801a46c: 4603 mov r3, r0
  64782. }
  64783. 801a46e: 4618 mov r0, r3
  64784. 801a470: 3708 adds r7, #8
  64785. 801a472: 46bd mov sp, r7
  64786. 801a474: bd80 pop {r7, pc}
  64787. 0801a476 <pbuf_free_header>:
  64788. * takes an u16_t not s16_t!
  64789. * @return the new head pbuf
  64790. */
  64791. struct pbuf *
  64792. pbuf_free_header(struct pbuf *q, u16_t size)
  64793. {
  64794. 801a476: b580 push {r7, lr}
  64795. 801a478: b086 sub sp, #24
  64796. 801a47a: af00 add r7, sp, #0
  64797. 801a47c: 6078 str r0, [r7, #4]
  64798. 801a47e: 460b mov r3, r1
  64799. 801a480: 807b strh r3, [r7, #2]
  64800. struct pbuf *p = q;
  64801. 801a482: 687b ldr r3, [r7, #4]
  64802. 801a484: 617b str r3, [r7, #20]
  64803. u16_t free_left = size;
  64804. 801a486: 887b ldrh r3, [r7, #2]
  64805. 801a488: 827b strh r3, [r7, #18]
  64806. while (free_left && p) {
  64807. 801a48a: e01c b.n 801a4c6 <pbuf_free_header+0x50>
  64808. if (free_left >= p->len) {
  64809. 801a48c: 697b ldr r3, [r7, #20]
  64810. 801a48e: 895b ldrh r3, [r3, #10]
  64811. 801a490: 8a7a ldrh r2, [r7, #18]
  64812. 801a492: 429a cmp r2, r3
  64813. 801a494: d310 bcc.n 801a4b8 <pbuf_free_header+0x42>
  64814. struct pbuf *f = p;
  64815. 801a496: 697b ldr r3, [r7, #20]
  64816. 801a498: 60fb str r3, [r7, #12]
  64817. free_left = (u16_t)(free_left - p->len);
  64818. 801a49a: 697b ldr r3, [r7, #20]
  64819. 801a49c: 895b ldrh r3, [r3, #10]
  64820. 801a49e: 8a7a ldrh r2, [r7, #18]
  64821. 801a4a0: 1ad3 subs r3, r2, r3
  64822. 801a4a2: 827b strh r3, [r7, #18]
  64823. p = p->next;
  64824. 801a4a4: 697b ldr r3, [r7, #20]
  64825. 801a4a6: 681b ldr r3, [r3, #0]
  64826. 801a4a8: 617b str r3, [r7, #20]
  64827. f->next = 0;
  64828. 801a4aa: 68fb ldr r3, [r7, #12]
  64829. 801a4ac: 2200 movs r2, #0
  64830. 801a4ae: 601a str r2, [r3, #0]
  64831. pbuf_free(f);
  64832. 801a4b0: 68f8 ldr r0, [r7, #12]
  64833. 801a4b2: f000 f813 bl 801a4dc <pbuf_free>
  64834. 801a4b6: e006 b.n 801a4c6 <pbuf_free_header+0x50>
  64835. } else {
  64836. pbuf_remove_header(p, free_left);
  64837. 801a4b8: 8a7b ldrh r3, [r7, #18]
  64838. 801a4ba: 4619 mov r1, r3
  64839. 801a4bc: 6978 ldr r0, [r7, #20]
  64840. 801a4be: f7ff ff55 bl 801a36c <pbuf_remove_header>
  64841. free_left = 0;
  64842. 801a4c2: 2300 movs r3, #0
  64843. 801a4c4: 827b strh r3, [r7, #18]
  64844. while (free_left && p) {
  64845. 801a4c6: 8a7b ldrh r3, [r7, #18]
  64846. 801a4c8: 2b00 cmp r3, #0
  64847. 801a4ca: d002 beq.n 801a4d2 <pbuf_free_header+0x5c>
  64848. 801a4cc: 697b ldr r3, [r7, #20]
  64849. 801a4ce: 2b00 cmp r3, #0
  64850. 801a4d0: d1dc bne.n 801a48c <pbuf_free_header+0x16>
  64851. }
  64852. }
  64853. return p;
  64854. 801a4d2: 697b ldr r3, [r7, #20]
  64855. }
  64856. 801a4d4: 4618 mov r0, r3
  64857. 801a4d6: 3718 adds r7, #24
  64858. 801a4d8: 46bd mov sp, r7
  64859. 801a4da: bd80 pop {r7, pc}
  64860. 0801a4dc <pbuf_free>:
  64861. * 1->1->1 becomes .......
  64862. *
  64863. */
  64864. u8_t
  64865. pbuf_free(struct pbuf *p)
  64866. {
  64867. 801a4dc: b580 push {r7, lr}
  64868. 801a4de: b088 sub sp, #32
  64869. 801a4e0: af00 add r7, sp, #0
  64870. 801a4e2: 6078 str r0, [r7, #4]
  64871. u8_t alloc_src;
  64872. struct pbuf *q;
  64873. u8_t count;
  64874. if (p == NULL) {
  64875. 801a4e4: 687b ldr r3, [r7, #4]
  64876. 801a4e6: 2b00 cmp r3, #0
  64877. 801a4e8: d10b bne.n 801a502 <pbuf_free+0x26>
  64878. LWIP_ASSERT("p != NULL", p != NULL);
  64879. 801a4ea: 687b ldr r3, [r7, #4]
  64880. 801a4ec: 2b00 cmp r3, #0
  64881. 801a4ee: d106 bne.n 801a4fe <pbuf_free+0x22>
  64882. 801a4f0: 4b3b ldr r3, [pc, #236] @ (801a5e0 <pbuf_free+0x104>)
  64883. 801a4f2: f44f 7237 mov.w r2, #732 @ 0x2dc
  64884. 801a4f6: 493b ldr r1, [pc, #236] @ (801a5e4 <pbuf_free+0x108>)
  64885. 801a4f8: 483b ldr r0, [pc, #236] @ (801a5e8 <pbuf_free+0x10c>)
  64886. 801a4fa: f00f fa67 bl 80299cc <iprintf>
  64887. /* if assertions are disabled, proceed with debug output */
  64888. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  64889. ("pbuf_free(p == NULL) was called.\n"));
  64890. return 0;
  64891. 801a4fe: 2300 movs r3, #0
  64892. 801a500: e069 b.n 801a5d6 <pbuf_free+0xfa>
  64893. }
  64894. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free(%p)\n", (void *)p));
  64895. PERF_START;
  64896. count = 0;
  64897. 801a502: 2300 movs r3, #0
  64898. 801a504: 77fb strb r3, [r7, #31]
  64899. /* de-allocate all consecutive pbufs from the head of the chain that
  64900. * obtain a zero reference count after decrementing*/
  64901. while (p != NULL) {
  64902. 801a506: e062 b.n 801a5ce <pbuf_free+0xf2>
  64903. LWIP_PBUF_REF_T ref;
  64904. SYS_ARCH_DECL_PROTECT(old_level);
  64905. /* Since decrementing ref cannot be guaranteed to be a single machine operation
  64906. * we must protect it. We put the new ref into a local variable to prevent
  64907. * further protection. */
  64908. SYS_ARCH_PROTECT(old_level);
  64909. 801a508: f00b ffca bl 80264a0 <sys_arch_protect>
  64910. 801a50c: 61b8 str r0, [r7, #24]
  64911. /* all pbufs in a chain are referenced at least once */
  64912. LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
  64913. 801a50e: 687b ldr r3, [r7, #4]
  64914. 801a510: 7b9b ldrb r3, [r3, #14]
  64915. 801a512: 2b00 cmp r3, #0
  64916. 801a514: d106 bne.n 801a524 <pbuf_free+0x48>
  64917. 801a516: 4b32 ldr r3, [pc, #200] @ (801a5e0 <pbuf_free+0x104>)
  64918. 801a518: f240 22f1 movw r2, #753 @ 0x2f1
  64919. 801a51c: 4933 ldr r1, [pc, #204] @ (801a5ec <pbuf_free+0x110>)
  64920. 801a51e: 4832 ldr r0, [pc, #200] @ (801a5e8 <pbuf_free+0x10c>)
  64921. 801a520: f00f fa54 bl 80299cc <iprintf>
  64922. /* decrease reference count (number of pointers to pbuf) */
  64923. ref = --(p->ref);
  64924. 801a524: 687b ldr r3, [r7, #4]
  64925. 801a526: 7b9b ldrb r3, [r3, #14]
  64926. 801a528: 3b01 subs r3, #1
  64927. 801a52a: b2da uxtb r2, r3
  64928. 801a52c: 687b ldr r3, [r7, #4]
  64929. 801a52e: 739a strb r2, [r3, #14]
  64930. 801a530: 687b ldr r3, [r7, #4]
  64931. 801a532: 7b9b ldrb r3, [r3, #14]
  64932. 801a534: 75fb strb r3, [r7, #23]
  64933. SYS_ARCH_UNPROTECT(old_level);
  64934. 801a536: 69b8 ldr r0, [r7, #24]
  64935. 801a538: f00b ffc0 bl 80264bc <sys_arch_unprotect>
  64936. /* this pbuf is no longer referenced to? */
  64937. if (ref == 0) {
  64938. 801a53c: 7dfb ldrb r3, [r7, #23]
  64939. 801a53e: 2b00 cmp r3, #0
  64940. 801a540: d143 bne.n 801a5ca <pbuf_free+0xee>
  64941. /* remember next pbuf in chain for next iteration */
  64942. q = p->next;
  64943. 801a542: 687b ldr r3, [r7, #4]
  64944. 801a544: 681b ldr r3, [r3, #0]
  64945. 801a546: 613b str r3, [r7, #16]
  64946. LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p));
  64947. alloc_src = pbuf_get_allocsrc(p);
  64948. 801a548: 687b ldr r3, [r7, #4]
  64949. 801a54a: 7b1b ldrb r3, [r3, #12]
  64950. 801a54c: f003 030f and.w r3, r3, #15
  64951. 801a550: 73fb strb r3, [r7, #15]
  64952. #if LWIP_SUPPORT_CUSTOM_PBUF
  64953. /* is this a custom pbuf? */
  64954. if ((p->flags & PBUF_FLAG_IS_CUSTOM) != 0) {
  64955. 801a552: 687b ldr r3, [r7, #4]
  64956. 801a554: 7b5b ldrb r3, [r3, #13]
  64957. 801a556: f003 0302 and.w r3, r3, #2
  64958. 801a55a: 2b00 cmp r3, #0
  64959. 801a55c: d011 beq.n 801a582 <pbuf_free+0xa6>
  64960. struct pbuf_custom *pc = (struct pbuf_custom *)p;
  64961. 801a55e: 687b ldr r3, [r7, #4]
  64962. 801a560: 60bb str r3, [r7, #8]
  64963. LWIP_ASSERT("pc->custom_free_function != NULL", pc->custom_free_function != NULL);
  64964. 801a562: 68bb ldr r3, [r7, #8]
  64965. 801a564: 691b ldr r3, [r3, #16]
  64966. 801a566: 2b00 cmp r3, #0
  64967. 801a568: d106 bne.n 801a578 <pbuf_free+0x9c>
  64968. 801a56a: 4b1d ldr r3, [pc, #116] @ (801a5e0 <pbuf_free+0x104>)
  64969. 801a56c: f240 22ff movw r2, #767 @ 0x2ff
  64970. 801a570: 491f ldr r1, [pc, #124] @ (801a5f0 <pbuf_free+0x114>)
  64971. 801a572: 481d ldr r0, [pc, #116] @ (801a5e8 <pbuf_free+0x10c>)
  64972. 801a574: f00f fa2a bl 80299cc <iprintf>
  64973. pc->custom_free_function(p);
  64974. 801a578: 68bb ldr r3, [r7, #8]
  64975. 801a57a: 691b ldr r3, [r3, #16]
  64976. 801a57c: 6878 ldr r0, [r7, #4]
  64977. 801a57e: 4798 blx r3
  64978. 801a580: e01d b.n 801a5be <pbuf_free+0xe2>
  64979. } else
  64980. #endif /* LWIP_SUPPORT_CUSTOM_PBUF */
  64981. {
  64982. /* is this a pbuf from the pool? */
  64983. if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL) {
  64984. 801a582: 7bfb ldrb r3, [r7, #15]
  64985. 801a584: 2b02 cmp r3, #2
  64986. 801a586: d104 bne.n 801a592 <pbuf_free+0xb6>
  64987. memp_free(MEMP_PBUF_POOL, p);
  64988. 801a588: 6879 ldr r1, [r7, #4]
  64989. 801a58a: 200c movs r0, #12
  64990. 801a58c: f7ff f8b8 bl 8019700 <memp_free>
  64991. 801a590: e015 b.n 801a5be <pbuf_free+0xe2>
  64992. /* is this a ROM or RAM referencing pbuf? */
  64993. } else if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF) {
  64994. 801a592: 7bfb ldrb r3, [r7, #15]
  64995. 801a594: 2b01 cmp r3, #1
  64996. 801a596: d104 bne.n 801a5a2 <pbuf_free+0xc6>
  64997. memp_free(MEMP_PBUF, p);
  64998. 801a598: 6879 ldr r1, [r7, #4]
  64999. 801a59a: 200b movs r0, #11
  65000. 801a59c: f7ff f8b0 bl 8019700 <memp_free>
  65001. 801a5a0: e00d b.n 801a5be <pbuf_free+0xe2>
  65002. /* type == PBUF_RAM */
  65003. } else if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP) {
  65004. 801a5a2: 7bfb ldrb r3, [r7, #15]
  65005. 801a5a4: 2b00 cmp r3, #0
  65006. 801a5a6: d103 bne.n 801a5b0 <pbuf_free+0xd4>
  65007. mem_free(p);
  65008. 801a5a8: 6878 ldr r0, [r7, #4]
  65009. 801a5aa: f7fe fd05 bl 8018fb8 <mem_free>
  65010. 801a5ae: e006 b.n 801a5be <pbuf_free+0xe2>
  65011. } else {
  65012. /* @todo: support freeing other types */
  65013. LWIP_ASSERT("invalid pbuf type", 0);
  65014. 801a5b0: 4b0b ldr r3, [pc, #44] @ (801a5e0 <pbuf_free+0x104>)
  65015. 801a5b2: f240 320f movw r2, #783 @ 0x30f
  65016. 801a5b6: 490f ldr r1, [pc, #60] @ (801a5f4 <pbuf_free+0x118>)
  65017. 801a5b8: 480b ldr r0, [pc, #44] @ (801a5e8 <pbuf_free+0x10c>)
  65018. 801a5ba: f00f fa07 bl 80299cc <iprintf>
  65019. }
  65020. }
  65021. count++;
  65022. 801a5be: 7ffb ldrb r3, [r7, #31]
  65023. 801a5c0: 3301 adds r3, #1
  65024. 801a5c2: 77fb strb r3, [r7, #31]
  65025. /* proceed to next pbuf */
  65026. p = q;
  65027. 801a5c4: 693b ldr r3, [r7, #16]
  65028. 801a5c6: 607b str r3, [r7, #4]
  65029. 801a5c8: e001 b.n 801a5ce <pbuf_free+0xf2>
  65030. /* p->ref > 0, this pbuf is still referenced to */
  65031. /* (and so the remaining pbufs in chain as well) */
  65032. } else {
  65033. LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, (u16_t)ref));
  65034. /* stop walking through the chain */
  65035. p = NULL;
  65036. 801a5ca: 2300 movs r3, #0
  65037. 801a5cc: 607b str r3, [r7, #4]
  65038. while (p != NULL) {
  65039. 801a5ce: 687b ldr r3, [r7, #4]
  65040. 801a5d0: 2b00 cmp r3, #0
  65041. 801a5d2: d199 bne.n 801a508 <pbuf_free+0x2c>
  65042. }
  65043. }
  65044. PERF_STOP("pbuf_free");
  65045. /* return number of de-allocated pbufs */
  65046. return count;
  65047. 801a5d4: 7ffb ldrb r3, [r7, #31]
  65048. }
  65049. 801a5d6: 4618 mov r0, r3
  65050. 801a5d8: 3720 adds r7, #32
  65051. 801a5da: 46bd mov sp, r7
  65052. 801a5dc: bd80 pop {r7, pc}
  65053. 801a5de: bf00 nop
  65054. 801a5e0: 0802e0a8 .word 0x0802e0a8
  65055. 801a5e4: 0802e20c .word 0x0802e20c
  65056. 801a5e8: 0802e108 .word 0x0802e108
  65057. 801a5ec: 0802e238 .word 0x0802e238
  65058. 801a5f0: 0802e250 .word 0x0802e250
  65059. 801a5f4: 0802e274 .word 0x0802e274
  65060. 0801a5f8 <pbuf_clen>:
  65061. * @param p first pbuf of chain
  65062. * @return the number of pbufs in a chain
  65063. */
  65064. u16_t
  65065. pbuf_clen(const struct pbuf *p)
  65066. {
  65067. 801a5f8: b480 push {r7}
  65068. 801a5fa: b085 sub sp, #20
  65069. 801a5fc: af00 add r7, sp, #0
  65070. 801a5fe: 6078 str r0, [r7, #4]
  65071. u16_t len;
  65072. len = 0;
  65073. 801a600: 2300 movs r3, #0
  65074. 801a602: 81fb strh r3, [r7, #14]
  65075. while (p != NULL) {
  65076. 801a604: e005 b.n 801a612 <pbuf_clen+0x1a>
  65077. ++len;
  65078. 801a606: 89fb ldrh r3, [r7, #14]
  65079. 801a608: 3301 adds r3, #1
  65080. 801a60a: 81fb strh r3, [r7, #14]
  65081. p = p->next;
  65082. 801a60c: 687b ldr r3, [r7, #4]
  65083. 801a60e: 681b ldr r3, [r3, #0]
  65084. 801a610: 607b str r3, [r7, #4]
  65085. while (p != NULL) {
  65086. 801a612: 687b ldr r3, [r7, #4]
  65087. 801a614: 2b00 cmp r3, #0
  65088. 801a616: d1f6 bne.n 801a606 <pbuf_clen+0xe>
  65089. }
  65090. return len;
  65091. 801a618: 89fb ldrh r3, [r7, #14]
  65092. }
  65093. 801a61a: 4618 mov r0, r3
  65094. 801a61c: 3714 adds r7, #20
  65095. 801a61e: 46bd mov sp, r7
  65096. 801a620: f85d 7b04 ldr.w r7, [sp], #4
  65097. 801a624: 4770 bx lr
  65098. ...
  65099. 0801a628 <pbuf_ref>:
  65100. * @param p pbuf to increase reference counter of
  65101. *
  65102. */
  65103. void
  65104. pbuf_ref(struct pbuf *p)
  65105. {
  65106. 801a628: b580 push {r7, lr}
  65107. 801a62a: b084 sub sp, #16
  65108. 801a62c: af00 add r7, sp, #0
  65109. 801a62e: 6078 str r0, [r7, #4]
  65110. /* pbuf given? */
  65111. if (p != NULL) {
  65112. 801a630: 687b ldr r3, [r7, #4]
  65113. 801a632: 2b00 cmp r3, #0
  65114. 801a634: d016 beq.n 801a664 <pbuf_ref+0x3c>
  65115. SYS_ARCH_SET(p->ref, (LWIP_PBUF_REF_T)(p->ref + 1));
  65116. 801a636: f00b ff33 bl 80264a0 <sys_arch_protect>
  65117. 801a63a: 60f8 str r0, [r7, #12]
  65118. 801a63c: 687b ldr r3, [r7, #4]
  65119. 801a63e: 7b9b ldrb r3, [r3, #14]
  65120. 801a640: 3301 adds r3, #1
  65121. 801a642: b2da uxtb r2, r3
  65122. 801a644: 687b ldr r3, [r7, #4]
  65123. 801a646: 739a strb r2, [r3, #14]
  65124. 801a648: 68f8 ldr r0, [r7, #12]
  65125. 801a64a: f00b ff37 bl 80264bc <sys_arch_unprotect>
  65126. LWIP_ASSERT("pbuf ref overflow", p->ref > 0);
  65127. 801a64e: 687b ldr r3, [r7, #4]
  65128. 801a650: 7b9b ldrb r3, [r3, #14]
  65129. 801a652: 2b00 cmp r3, #0
  65130. 801a654: d106 bne.n 801a664 <pbuf_ref+0x3c>
  65131. 801a656: 4b05 ldr r3, [pc, #20] @ (801a66c <pbuf_ref+0x44>)
  65132. 801a658: f240 3242 movw r2, #834 @ 0x342
  65133. 801a65c: 4904 ldr r1, [pc, #16] @ (801a670 <pbuf_ref+0x48>)
  65134. 801a65e: 4805 ldr r0, [pc, #20] @ (801a674 <pbuf_ref+0x4c>)
  65135. 801a660: f00f f9b4 bl 80299cc <iprintf>
  65136. }
  65137. }
  65138. 801a664: bf00 nop
  65139. 801a666: 3710 adds r7, #16
  65140. 801a668: 46bd mov sp, r7
  65141. 801a66a: bd80 pop {r7, pc}
  65142. 801a66c: 0802e0a8 .word 0x0802e0a8
  65143. 801a670: 0802e288 .word 0x0802e288
  65144. 801a674: 0802e108 .word 0x0802e108
  65145. 0801a678 <pbuf_cat>:
  65146. *
  65147. * @see pbuf_chain()
  65148. */
  65149. void
  65150. pbuf_cat(struct pbuf *h, struct pbuf *t)
  65151. {
  65152. 801a678: b580 push {r7, lr}
  65153. 801a67a: b084 sub sp, #16
  65154. 801a67c: af00 add r7, sp, #0
  65155. 801a67e: 6078 str r0, [r7, #4]
  65156. 801a680: 6039 str r1, [r7, #0]
  65157. struct pbuf *p;
  65158. LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)",
  65159. 801a682: 687b ldr r3, [r7, #4]
  65160. 801a684: 2b00 cmp r3, #0
  65161. 801a686: d002 beq.n 801a68e <pbuf_cat+0x16>
  65162. 801a688: 683b ldr r3, [r7, #0]
  65163. 801a68a: 2b00 cmp r3, #0
  65164. 801a68c: d107 bne.n 801a69e <pbuf_cat+0x26>
  65165. 801a68e: 4b20 ldr r3, [pc, #128] @ (801a710 <pbuf_cat+0x98>)
  65166. 801a690: f240 3259 movw r2, #857 @ 0x359
  65167. 801a694: 491f ldr r1, [pc, #124] @ (801a714 <pbuf_cat+0x9c>)
  65168. 801a696: 4820 ldr r0, [pc, #128] @ (801a718 <pbuf_cat+0xa0>)
  65169. 801a698: f00f f998 bl 80299cc <iprintf>
  65170. 801a69c: e034 b.n 801a708 <pbuf_cat+0x90>
  65171. ((h != NULL) && (t != NULL)), return;);
  65172. /* proceed to last pbuf of chain */
  65173. for (p = h; p->next != NULL; p = p->next) {
  65174. 801a69e: 687b ldr r3, [r7, #4]
  65175. 801a6a0: 60fb str r3, [r7, #12]
  65176. 801a6a2: e00a b.n 801a6ba <pbuf_cat+0x42>
  65177. /* add total length of second chain to all totals of first chain */
  65178. p->tot_len = (u16_t)(p->tot_len + t->tot_len);
  65179. 801a6a4: 68fb ldr r3, [r7, #12]
  65180. 801a6a6: 891a ldrh r2, [r3, #8]
  65181. 801a6a8: 683b ldr r3, [r7, #0]
  65182. 801a6aa: 891b ldrh r3, [r3, #8]
  65183. 801a6ac: 4413 add r3, r2
  65184. 801a6ae: b29a uxth r2, r3
  65185. 801a6b0: 68fb ldr r3, [r7, #12]
  65186. 801a6b2: 811a strh r2, [r3, #8]
  65187. for (p = h; p->next != NULL; p = p->next) {
  65188. 801a6b4: 68fb ldr r3, [r7, #12]
  65189. 801a6b6: 681b ldr r3, [r3, #0]
  65190. 801a6b8: 60fb str r3, [r7, #12]
  65191. 801a6ba: 68fb ldr r3, [r7, #12]
  65192. 801a6bc: 681b ldr r3, [r3, #0]
  65193. 801a6be: 2b00 cmp r3, #0
  65194. 801a6c0: d1f0 bne.n 801a6a4 <pbuf_cat+0x2c>
  65195. }
  65196. /* { p is last pbuf of first h chain, p->next == NULL } */
  65197. LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len);
  65198. 801a6c2: 68fb ldr r3, [r7, #12]
  65199. 801a6c4: 891a ldrh r2, [r3, #8]
  65200. 801a6c6: 68fb ldr r3, [r7, #12]
  65201. 801a6c8: 895b ldrh r3, [r3, #10]
  65202. 801a6ca: 429a cmp r2, r3
  65203. 801a6cc: d006 beq.n 801a6dc <pbuf_cat+0x64>
  65204. 801a6ce: 4b10 ldr r3, [pc, #64] @ (801a710 <pbuf_cat+0x98>)
  65205. 801a6d0: f240 3262 movw r2, #866 @ 0x362
  65206. 801a6d4: 4911 ldr r1, [pc, #68] @ (801a71c <pbuf_cat+0xa4>)
  65207. 801a6d6: 4810 ldr r0, [pc, #64] @ (801a718 <pbuf_cat+0xa0>)
  65208. 801a6d8: f00f f978 bl 80299cc <iprintf>
  65209. LWIP_ASSERT("p->next == NULL", p->next == NULL);
  65210. 801a6dc: 68fb ldr r3, [r7, #12]
  65211. 801a6de: 681b ldr r3, [r3, #0]
  65212. 801a6e0: 2b00 cmp r3, #0
  65213. 801a6e2: d006 beq.n 801a6f2 <pbuf_cat+0x7a>
  65214. 801a6e4: 4b0a ldr r3, [pc, #40] @ (801a710 <pbuf_cat+0x98>)
  65215. 801a6e6: f240 3263 movw r2, #867 @ 0x363
  65216. 801a6ea: 490d ldr r1, [pc, #52] @ (801a720 <pbuf_cat+0xa8>)
  65217. 801a6ec: 480a ldr r0, [pc, #40] @ (801a718 <pbuf_cat+0xa0>)
  65218. 801a6ee: f00f f96d bl 80299cc <iprintf>
  65219. /* add total length of second chain to last pbuf total of first chain */
  65220. p->tot_len = (u16_t)(p->tot_len + t->tot_len);
  65221. 801a6f2: 68fb ldr r3, [r7, #12]
  65222. 801a6f4: 891a ldrh r2, [r3, #8]
  65223. 801a6f6: 683b ldr r3, [r7, #0]
  65224. 801a6f8: 891b ldrh r3, [r3, #8]
  65225. 801a6fa: 4413 add r3, r2
  65226. 801a6fc: b29a uxth r2, r3
  65227. 801a6fe: 68fb ldr r3, [r7, #12]
  65228. 801a700: 811a strh r2, [r3, #8]
  65229. /* chain last pbuf of head (p) with first of tail (t) */
  65230. p->next = t;
  65231. 801a702: 68fb ldr r3, [r7, #12]
  65232. 801a704: 683a ldr r2, [r7, #0]
  65233. 801a706: 601a str r2, [r3, #0]
  65234. /* p->next now references t, but the caller will drop its reference to t,
  65235. * so netto there is no change to the reference count of t.
  65236. */
  65237. }
  65238. 801a708: 3710 adds r7, #16
  65239. 801a70a: 46bd mov sp, r7
  65240. 801a70c: bd80 pop {r7, pc}
  65241. 801a70e: bf00 nop
  65242. 801a710: 0802e0a8 .word 0x0802e0a8
  65243. 801a714: 0802e29c .word 0x0802e29c
  65244. 801a718: 0802e108 .word 0x0802e108
  65245. 801a71c: 0802e2d4 .word 0x0802e2d4
  65246. 801a720: 0802e304 .word 0x0802e304
  65247. 0801a724 <pbuf_chain>:
  65248. * The ->ref field of the first pbuf of the tail chain is adjusted.
  65249. *
  65250. */
  65251. void
  65252. pbuf_chain(struct pbuf *h, struct pbuf *t)
  65253. {
  65254. 801a724: b580 push {r7, lr}
  65255. 801a726: b082 sub sp, #8
  65256. 801a728: af00 add r7, sp, #0
  65257. 801a72a: 6078 str r0, [r7, #4]
  65258. 801a72c: 6039 str r1, [r7, #0]
  65259. pbuf_cat(h, t);
  65260. 801a72e: 6839 ldr r1, [r7, #0]
  65261. 801a730: 6878 ldr r0, [r7, #4]
  65262. 801a732: f7ff ffa1 bl 801a678 <pbuf_cat>
  65263. /* t is now referenced by h */
  65264. pbuf_ref(t);
  65265. 801a736: 6838 ldr r0, [r7, #0]
  65266. 801a738: f7ff ff76 bl 801a628 <pbuf_ref>
  65267. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_chain: %p references %p\n", (void *)h, (void *)t));
  65268. }
  65269. 801a73c: bf00 nop
  65270. 801a73e: 3708 adds r7, #8
  65271. 801a740: 46bd mov sp, r7
  65272. 801a742: bd80 pop {r7, pc}
  65273. 0801a744 <pbuf_copy>:
  65274. * ERR_ARG if one of the pbufs is NULL or p_to is not big
  65275. * enough to hold p_from
  65276. */
  65277. err_t
  65278. pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from)
  65279. {
  65280. 801a744: b580 push {r7, lr}
  65281. 801a746: b086 sub sp, #24
  65282. 801a748: af00 add r7, sp, #0
  65283. 801a74a: 6078 str r0, [r7, #4]
  65284. 801a74c: 6039 str r1, [r7, #0]
  65285. size_t offset_to = 0, offset_from = 0, len;
  65286. 801a74e: 2300 movs r3, #0
  65287. 801a750: 617b str r3, [r7, #20]
  65288. 801a752: 2300 movs r3, #0
  65289. 801a754: 613b str r3, [r7, #16]
  65290. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n",
  65291. (const void *)p_to, (const void *)p_from));
  65292. /* is the target big enough to hold the source? */
  65293. LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) &&
  65294. 801a756: 687b ldr r3, [r7, #4]
  65295. 801a758: 2b00 cmp r3, #0
  65296. 801a75a: d008 beq.n 801a76e <pbuf_copy+0x2a>
  65297. 801a75c: 683b ldr r3, [r7, #0]
  65298. 801a75e: 2b00 cmp r3, #0
  65299. 801a760: d005 beq.n 801a76e <pbuf_copy+0x2a>
  65300. 801a762: 687b ldr r3, [r7, #4]
  65301. 801a764: 891a ldrh r2, [r3, #8]
  65302. 801a766: 683b ldr r3, [r7, #0]
  65303. 801a768: 891b ldrh r3, [r3, #8]
  65304. 801a76a: 429a cmp r2, r3
  65305. 801a76c: d209 bcs.n 801a782 <pbuf_copy+0x3e>
  65306. 801a76e: 4b57 ldr r3, [pc, #348] @ (801a8cc <pbuf_copy+0x188>)
  65307. 801a770: f240 32c9 movw r2, #969 @ 0x3c9
  65308. 801a774: 4956 ldr r1, [pc, #344] @ (801a8d0 <pbuf_copy+0x18c>)
  65309. 801a776: 4857 ldr r0, [pc, #348] @ (801a8d4 <pbuf_copy+0x190>)
  65310. 801a778: f00f f928 bl 80299cc <iprintf>
  65311. 801a77c: f06f 030f mvn.w r3, #15
  65312. 801a780: e09f b.n 801a8c2 <pbuf_copy+0x17e>
  65313. (p_from != NULL) && (p_to->tot_len >= p_from->tot_len)), return ERR_ARG;);
  65314. /* iterate through pbuf chain */
  65315. do {
  65316. /* copy one part of the original chain */
  65317. if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
  65318. 801a782: 687b ldr r3, [r7, #4]
  65319. 801a784: 895b ldrh r3, [r3, #10]
  65320. 801a786: 461a mov r2, r3
  65321. 801a788: 697b ldr r3, [r7, #20]
  65322. 801a78a: 1ad2 subs r2, r2, r3
  65323. 801a78c: 683b ldr r3, [r7, #0]
  65324. 801a78e: 895b ldrh r3, [r3, #10]
  65325. 801a790: 4619 mov r1, r3
  65326. 801a792: 693b ldr r3, [r7, #16]
  65327. 801a794: 1acb subs r3, r1, r3
  65328. 801a796: 429a cmp r2, r3
  65329. 801a798: d306 bcc.n 801a7a8 <pbuf_copy+0x64>
  65330. /* complete current p_from fits into current p_to */
  65331. len = p_from->len - offset_from;
  65332. 801a79a: 683b ldr r3, [r7, #0]
  65333. 801a79c: 895b ldrh r3, [r3, #10]
  65334. 801a79e: 461a mov r2, r3
  65335. 801a7a0: 693b ldr r3, [r7, #16]
  65336. 801a7a2: 1ad3 subs r3, r2, r3
  65337. 801a7a4: 60fb str r3, [r7, #12]
  65338. 801a7a6: e005 b.n 801a7b4 <pbuf_copy+0x70>
  65339. } else {
  65340. /* current p_from does not fit into current p_to */
  65341. len = p_to->len - offset_to;
  65342. 801a7a8: 687b ldr r3, [r7, #4]
  65343. 801a7aa: 895b ldrh r3, [r3, #10]
  65344. 801a7ac: 461a mov r2, r3
  65345. 801a7ae: 697b ldr r3, [r7, #20]
  65346. 801a7b0: 1ad3 subs r3, r2, r3
  65347. 801a7b2: 60fb str r3, [r7, #12]
  65348. }
  65349. MEMCPY((u8_t *)p_to->payload + offset_to, (u8_t *)p_from->payload + offset_from, len);
  65350. 801a7b4: 687b ldr r3, [r7, #4]
  65351. 801a7b6: 685a ldr r2, [r3, #4]
  65352. 801a7b8: 697b ldr r3, [r7, #20]
  65353. 801a7ba: 18d0 adds r0, r2, r3
  65354. 801a7bc: 683b ldr r3, [r7, #0]
  65355. 801a7be: 685a ldr r2, [r3, #4]
  65356. 801a7c0: 693b ldr r3, [r7, #16]
  65357. 801a7c2: 4413 add r3, r2
  65358. 801a7c4: 68fa ldr r2, [r7, #12]
  65359. 801a7c6: 4619 mov r1, r3
  65360. 801a7c8: f00f fb89 bl 8029ede <memcpy>
  65361. offset_to += len;
  65362. 801a7cc: 697a ldr r2, [r7, #20]
  65363. 801a7ce: 68fb ldr r3, [r7, #12]
  65364. 801a7d0: 4413 add r3, r2
  65365. 801a7d2: 617b str r3, [r7, #20]
  65366. offset_from += len;
  65367. 801a7d4: 693a ldr r2, [r7, #16]
  65368. 801a7d6: 68fb ldr r3, [r7, #12]
  65369. 801a7d8: 4413 add r3, r2
  65370. 801a7da: 613b str r3, [r7, #16]
  65371. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  65372. 801a7dc: 687b ldr r3, [r7, #4]
  65373. 801a7de: 895b ldrh r3, [r3, #10]
  65374. 801a7e0: 461a mov r2, r3
  65375. 801a7e2: 697b ldr r3, [r7, #20]
  65376. 801a7e4: 4293 cmp r3, r2
  65377. 801a7e6: d906 bls.n 801a7f6 <pbuf_copy+0xb2>
  65378. 801a7e8: 4b38 ldr r3, [pc, #224] @ (801a8cc <pbuf_copy+0x188>)
  65379. 801a7ea: f240 32d9 movw r2, #985 @ 0x3d9
  65380. 801a7ee: 493a ldr r1, [pc, #232] @ (801a8d8 <pbuf_copy+0x194>)
  65381. 801a7f0: 4838 ldr r0, [pc, #224] @ (801a8d4 <pbuf_copy+0x190>)
  65382. 801a7f2: f00f f8eb bl 80299cc <iprintf>
  65383. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  65384. 801a7f6: 683b ldr r3, [r7, #0]
  65385. 801a7f8: 895b ldrh r3, [r3, #10]
  65386. 801a7fa: 461a mov r2, r3
  65387. 801a7fc: 693b ldr r3, [r7, #16]
  65388. 801a7fe: 4293 cmp r3, r2
  65389. 801a800: d906 bls.n 801a810 <pbuf_copy+0xcc>
  65390. 801a802: 4b32 ldr r3, [pc, #200] @ (801a8cc <pbuf_copy+0x188>)
  65391. 801a804: f240 32da movw r2, #986 @ 0x3da
  65392. 801a808: 4934 ldr r1, [pc, #208] @ (801a8dc <pbuf_copy+0x198>)
  65393. 801a80a: 4832 ldr r0, [pc, #200] @ (801a8d4 <pbuf_copy+0x190>)
  65394. 801a80c: f00f f8de bl 80299cc <iprintf>
  65395. if (offset_from >= p_from->len) {
  65396. 801a810: 683b ldr r3, [r7, #0]
  65397. 801a812: 895b ldrh r3, [r3, #10]
  65398. 801a814: 461a mov r2, r3
  65399. 801a816: 693b ldr r3, [r7, #16]
  65400. 801a818: 4293 cmp r3, r2
  65401. 801a81a: d304 bcc.n 801a826 <pbuf_copy+0xe2>
  65402. /* on to next p_from (if any) */
  65403. offset_from = 0;
  65404. 801a81c: 2300 movs r3, #0
  65405. 801a81e: 613b str r3, [r7, #16]
  65406. p_from = p_from->next;
  65407. 801a820: 683b ldr r3, [r7, #0]
  65408. 801a822: 681b ldr r3, [r3, #0]
  65409. 801a824: 603b str r3, [r7, #0]
  65410. }
  65411. if (offset_to == p_to->len) {
  65412. 801a826: 687b ldr r3, [r7, #4]
  65413. 801a828: 895b ldrh r3, [r3, #10]
  65414. 801a82a: 461a mov r2, r3
  65415. 801a82c: 697b ldr r3, [r7, #20]
  65416. 801a82e: 4293 cmp r3, r2
  65417. 801a830: d114 bne.n 801a85c <pbuf_copy+0x118>
  65418. /* on to next p_to (if any) */
  65419. offset_to = 0;
  65420. 801a832: 2300 movs r3, #0
  65421. 801a834: 617b str r3, [r7, #20]
  65422. p_to = p_to->next;
  65423. 801a836: 687b ldr r3, [r7, #4]
  65424. 801a838: 681b ldr r3, [r3, #0]
  65425. 801a83a: 607b str r3, [r7, #4]
  65426. LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL), return ERR_ARG;);
  65427. 801a83c: 687b ldr r3, [r7, #4]
  65428. 801a83e: 2b00 cmp r3, #0
  65429. 801a840: d10c bne.n 801a85c <pbuf_copy+0x118>
  65430. 801a842: 683b ldr r3, [r7, #0]
  65431. 801a844: 2b00 cmp r3, #0
  65432. 801a846: d009 beq.n 801a85c <pbuf_copy+0x118>
  65433. 801a848: 4b20 ldr r3, [pc, #128] @ (801a8cc <pbuf_copy+0x188>)
  65434. 801a84a: f44f 7279 mov.w r2, #996 @ 0x3e4
  65435. 801a84e: 4924 ldr r1, [pc, #144] @ (801a8e0 <pbuf_copy+0x19c>)
  65436. 801a850: 4820 ldr r0, [pc, #128] @ (801a8d4 <pbuf_copy+0x190>)
  65437. 801a852: f00f f8bb bl 80299cc <iprintf>
  65438. 801a856: f06f 030f mvn.w r3, #15
  65439. 801a85a: e032 b.n 801a8c2 <pbuf_copy+0x17e>
  65440. }
  65441. if ((p_from != NULL) && (p_from->len == p_from->tot_len)) {
  65442. 801a85c: 683b ldr r3, [r7, #0]
  65443. 801a85e: 2b00 cmp r3, #0
  65444. 801a860: d013 beq.n 801a88a <pbuf_copy+0x146>
  65445. 801a862: 683b ldr r3, [r7, #0]
  65446. 801a864: 895a ldrh r2, [r3, #10]
  65447. 801a866: 683b ldr r3, [r7, #0]
  65448. 801a868: 891b ldrh r3, [r3, #8]
  65449. 801a86a: 429a cmp r2, r3
  65450. 801a86c: d10d bne.n 801a88a <pbuf_copy+0x146>
  65451. /* don't copy more than one packet! */
  65452. LWIP_ERROR("pbuf_copy() does not allow packet queues!",
  65453. 801a86e: 683b ldr r3, [r7, #0]
  65454. 801a870: 681b ldr r3, [r3, #0]
  65455. 801a872: 2b00 cmp r3, #0
  65456. 801a874: d009 beq.n 801a88a <pbuf_copy+0x146>
  65457. 801a876: 4b15 ldr r3, [pc, #84] @ (801a8cc <pbuf_copy+0x188>)
  65458. 801a878: f240 32e9 movw r2, #1001 @ 0x3e9
  65459. 801a87c: 4919 ldr r1, [pc, #100] @ (801a8e4 <pbuf_copy+0x1a0>)
  65460. 801a87e: 4815 ldr r0, [pc, #84] @ (801a8d4 <pbuf_copy+0x190>)
  65461. 801a880: f00f f8a4 bl 80299cc <iprintf>
  65462. 801a884: f06f 0305 mvn.w r3, #5
  65463. 801a888: e01b b.n 801a8c2 <pbuf_copy+0x17e>
  65464. (p_from->next == NULL), return ERR_VAL;);
  65465. }
  65466. if ((p_to != NULL) && (p_to->len == p_to->tot_len)) {
  65467. 801a88a: 687b ldr r3, [r7, #4]
  65468. 801a88c: 2b00 cmp r3, #0
  65469. 801a88e: d013 beq.n 801a8b8 <pbuf_copy+0x174>
  65470. 801a890: 687b ldr r3, [r7, #4]
  65471. 801a892: 895a ldrh r2, [r3, #10]
  65472. 801a894: 687b ldr r3, [r7, #4]
  65473. 801a896: 891b ldrh r3, [r3, #8]
  65474. 801a898: 429a cmp r2, r3
  65475. 801a89a: d10d bne.n 801a8b8 <pbuf_copy+0x174>
  65476. /* don't copy more than one packet! */
  65477. LWIP_ERROR("pbuf_copy() does not allow packet queues!",
  65478. 801a89c: 687b ldr r3, [r7, #4]
  65479. 801a89e: 681b ldr r3, [r3, #0]
  65480. 801a8a0: 2b00 cmp r3, #0
  65481. 801a8a2: d009 beq.n 801a8b8 <pbuf_copy+0x174>
  65482. 801a8a4: 4b09 ldr r3, [pc, #36] @ (801a8cc <pbuf_copy+0x188>)
  65483. 801a8a6: f240 32ee movw r2, #1006 @ 0x3ee
  65484. 801a8aa: 490e ldr r1, [pc, #56] @ (801a8e4 <pbuf_copy+0x1a0>)
  65485. 801a8ac: 4809 ldr r0, [pc, #36] @ (801a8d4 <pbuf_copy+0x190>)
  65486. 801a8ae: f00f f88d bl 80299cc <iprintf>
  65487. 801a8b2: f06f 0305 mvn.w r3, #5
  65488. 801a8b6: e004 b.n 801a8c2 <pbuf_copy+0x17e>
  65489. (p_to->next == NULL), return ERR_VAL;);
  65490. }
  65491. } while (p_from);
  65492. 801a8b8: 683b ldr r3, [r7, #0]
  65493. 801a8ba: 2b00 cmp r3, #0
  65494. 801a8bc: f47f af61 bne.w 801a782 <pbuf_copy+0x3e>
  65495. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n"));
  65496. return ERR_OK;
  65497. 801a8c0: 2300 movs r3, #0
  65498. }
  65499. 801a8c2: 4618 mov r0, r3
  65500. 801a8c4: 3718 adds r7, #24
  65501. 801a8c6: 46bd mov sp, r7
  65502. 801a8c8: bd80 pop {r7, pc}
  65503. 801a8ca: bf00 nop
  65504. 801a8cc: 0802e0a8 .word 0x0802e0a8
  65505. 801a8d0: 0802e350 .word 0x0802e350
  65506. 801a8d4: 0802e108 .word 0x0802e108
  65507. 801a8d8: 0802e380 .word 0x0802e380
  65508. 801a8dc: 0802e398 .word 0x0802e398
  65509. 801a8e0: 0802e3b4 .word 0x0802e3b4
  65510. 801a8e4: 0802e3c4 .word 0x0802e3c4
  65511. 0801a8e8 <pbuf_copy_partial>:
  65512. * @param offset offset into the packet buffer from where to begin copying len bytes
  65513. * @return the number of bytes copied, or 0 on failure
  65514. */
  65515. u16_t
  65516. pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
  65517. {
  65518. 801a8e8: b580 push {r7, lr}
  65519. 801a8ea: b088 sub sp, #32
  65520. 801a8ec: af00 add r7, sp, #0
  65521. 801a8ee: 60f8 str r0, [r7, #12]
  65522. 801a8f0: 60b9 str r1, [r7, #8]
  65523. 801a8f2: 4611 mov r1, r2
  65524. 801a8f4: 461a mov r2, r3
  65525. 801a8f6: 460b mov r3, r1
  65526. 801a8f8: 80fb strh r3, [r7, #6]
  65527. 801a8fa: 4613 mov r3, r2
  65528. 801a8fc: 80bb strh r3, [r7, #4]
  65529. const struct pbuf *p;
  65530. u16_t left = 0;
  65531. 801a8fe: 2300 movs r3, #0
  65532. 801a900: 837b strh r3, [r7, #26]
  65533. u16_t buf_copy_len;
  65534. u16_t copied_total = 0;
  65535. 801a902: 2300 movs r3, #0
  65536. 801a904: 82fb strh r3, [r7, #22]
  65537. LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;);
  65538. 801a906: 68fb ldr r3, [r7, #12]
  65539. 801a908: 2b00 cmp r3, #0
  65540. 801a90a: d108 bne.n 801a91e <pbuf_copy_partial+0x36>
  65541. 801a90c: 4b2b ldr r3, [pc, #172] @ (801a9bc <pbuf_copy_partial+0xd4>)
  65542. 801a90e: f240 420a movw r2, #1034 @ 0x40a
  65543. 801a912: 492b ldr r1, [pc, #172] @ (801a9c0 <pbuf_copy_partial+0xd8>)
  65544. 801a914: 482b ldr r0, [pc, #172] @ (801a9c4 <pbuf_copy_partial+0xdc>)
  65545. 801a916: f00f f859 bl 80299cc <iprintf>
  65546. 801a91a: 2300 movs r3, #0
  65547. 801a91c: e04a b.n 801a9b4 <pbuf_copy_partial+0xcc>
  65548. LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;);
  65549. 801a91e: 68bb ldr r3, [r7, #8]
  65550. 801a920: 2b00 cmp r3, #0
  65551. 801a922: d108 bne.n 801a936 <pbuf_copy_partial+0x4e>
  65552. 801a924: 4b25 ldr r3, [pc, #148] @ (801a9bc <pbuf_copy_partial+0xd4>)
  65553. 801a926: f240 420b movw r2, #1035 @ 0x40b
  65554. 801a92a: 4927 ldr r1, [pc, #156] @ (801a9c8 <pbuf_copy_partial+0xe0>)
  65555. 801a92c: 4825 ldr r0, [pc, #148] @ (801a9c4 <pbuf_copy_partial+0xdc>)
  65556. 801a92e: f00f f84d bl 80299cc <iprintf>
  65557. 801a932: 2300 movs r3, #0
  65558. 801a934: e03e b.n 801a9b4 <pbuf_copy_partial+0xcc>
  65559. /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */
  65560. for (p = buf; len != 0 && p != NULL; p = p->next) {
  65561. 801a936: 68fb ldr r3, [r7, #12]
  65562. 801a938: 61fb str r3, [r7, #28]
  65563. 801a93a: e034 b.n 801a9a6 <pbuf_copy_partial+0xbe>
  65564. if ((offset != 0) && (offset >= p->len)) {
  65565. 801a93c: 88bb ldrh r3, [r7, #4]
  65566. 801a93e: 2b00 cmp r3, #0
  65567. 801a940: d00a beq.n 801a958 <pbuf_copy_partial+0x70>
  65568. 801a942: 69fb ldr r3, [r7, #28]
  65569. 801a944: 895b ldrh r3, [r3, #10]
  65570. 801a946: 88ba ldrh r2, [r7, #4]
  65571. 801a948: 429a cmp r2, r3
  65572. 801a94a: d305 bcc.n 801a958 <pbuf_copy_partial+0x70>
  65573. /* don't copy from this buffer -> on to the next */
  65574. offset = (u16_t)(offset - p->len);
  65575. 801a94c: 69fb ldr r3, [r7, #28]
  65576. 801a94e: 895b ldrh r3, [r3, #10]
  65577. 801a950: 88ba ldrh r2, [r7, #4]
  65578. 801a952: 1ad3 subs r3, r2, r3
  65579. 801a954: 80bb strh r3, [r7, #4]
  65580. 801a956: e023 b.n 801a9a0 <pbuf_copy_partial+0xb8>
  65581. } else {
  65582. /* copy from this buffer. maybe only partially. */
  65583. buf_copy_len = (u16_t)(p->len - offset);
  65584. 801a958: 69fb ldr r3, [r7, #28]
  65585. 801a95a: 895a ldrh r2, [r3, #10]
  65586. 801a95c: 88bb ldrh r3, [r7, #4]
  65587. 801a95e: 1ad3 subs r3, r2, r3
  65588. 801a960: 833b strh r3, [r7, #24]
  65589. if (buf_copy_len > len) {
  65590. 801a962: 8b3a ldrh r2, [r7, #24]
  65591. 801a964: 88fb ldrh r3, [r7, #6]
  65592. 801a966: 429a cmp r2, r3
  65593. 801a968: d901 bls.n 801a96e <pbuf_copy_partial+0x86>
  65594. buf_copy_len = len;
  65595. 801a96a: 88fb ldrh r3, [r7, #6]
  65596. 801a96c: 833b strh r3, [r7, #24]
  65597. }
  65598. /* copy the necessary parts of the buffer */
  65599. MEMCPY(&((char *)dataptr)[left], &((char *)p->payload)[offset], buf_copy_len);
  65600. 801a96e: 8b7b ldrh r3, [r7, #26]
  65601. 801a970: 68ba ldr r2, [r7, #8]
  65602. 801a972: 18d0 adds r0, r2, r3
  65603. 801a974: 69fb ldr r3, [r7, #28]
  65604. 801a976: 685a ldr r2, [r3, #4]
  65605. 801a978: 88bb ldrh r3, [r7, #4]
  65606. 801a97a: 4413 add r3, r2
  65607. 801a97c: 8b3a ldrh r2, [r7, #24]
  65608. 801a97e: 4619 mov r1, r3
  65609. 801a980: f00f faad bl 8029ede <memcpy>
  65610. copied_total = (u16_t)(copied_total + buf_copy_len);
  65611. 801a984: 8afa ldrh r2, [r7, #22]
  65612. 801a986: 8b3b ldrh r3, [r7, #24]
  65613. 801a988: 4413 add r3, r2
  65614. 801a98a: 82fb strh r3, [r7, #22]
  65615. left = (u16_t)(left + buf_copy_len);
  65616. 801a98c: 8b7a ldrh r2, [r7, #26]
  65617. 801a98e: 8b3b ldrh r3, [r7, #24]
  65618. 801a990: 4413 add r3, r2
  65619. 801a992: 837b strh r3, [r7, #26]
  65620. len = (u16_t)(len - buf_copy_len);
  65621. 801a994: 88fa ldrh r2, [r7, #6]
  65622. 801a996: 8b3b ldrh r3, [r7, #24]
  65623. 801a998: 1ad3 subs r3, r2, r3
  65624. 801a99a: 80fb strh r3, [r7, #6]
  65625. offset = 0;
  65626. 801a99c: 2300 movs r3, #0
  65627. 801a99e: 80bb strh r3, [r7, #4]
  65628. for (p = buf; len != 0 && p != NULL; p = p->next) {
  65629. 801a9a0: 69fb ldr r3, [r7, #28]
  65630. 801a9a2: 681b ldr r3, [r3, #0]
  65631. 801a9a4: 61fb str r3, [r7, #28]
  65632. 801a9a6: 88fb ldrh r3, [r7, #6]
  65633. 801a9a8: 2b00 cmp r3, #0
  65634. 801a9aa: d002 beq.n 801a9b2 <pbuf_copy_partial+0xca>
  65635. 801a9ac: 69fb ldr r3, [r7, #28]
  65636. 801a9ae: 2b00 cmp r3, #0
  65637. 801a9b0: d1c4 bne.n 801a93c <pbuf_copy_partial+0x54>
  65638. }
  65639. }
  65640. return copied_total;
  65641. 801a9b2: 8afb ldrh r3, [r7, #22]
  65642. }
  65643. 801a9b4: 4618 mov r0, r3
  65644. 801a9b6: 3720 adds r7, #32
  65645. 801a9b8: 46bd mov sp, r7
  65646. 801a9ba: bd80 pop {r7, pc}
  65647. 801a9bc: 0802e0a8 .word 0x0802e0a8
  65648. 801a9c0: 0802e3f0 .word 0x0802e3f0
  65649. 801a9c4: 0802e108 .word 0x0802e108
  65650. 801a9c8: 0802e410 .word 0x0802e410
  65651. 0801a9cc <pbuf_clone>:
  65652. *
  65653. * @return a new pbuf or NULL if allocation fails
  65654. */
  65655. struct pbuf *
  65656. pbuf_clone(pbuf_layer layer, pbuf_type type, struct pbuf *p)
  65657. {
  65658. 801a9cc: b580 push {r7, lr}
  65659. 801a9ce: b084 sub sp, #16
  65660. 801a9d0: af00 add r7, sp, #0
  65661. 801a9d2: 4603 mov r3, r0
  65662. 801a9d4: 603a str r2, [r7, #0]
  65663. 801a9d6: 71fb strb r3, [r7, #7]
  65664. 801a9d8: 460b mov r3, r1
  65665. 801a9da: 80bb strh r3, [r7, #4]
  65666. struct pbuf *q;
  65667. err_t err;
  65668. q = pbuf_alloc(layer, p->tot_len, type);
  65669. 801a9dc: 683b ldr r3, [r7, #0]
  65670. 801a9de: 8919 ldrh r1, [r3, #8]
  65671. 801a9e0: 88ba ldrh r2, [r7, #4]
  65672. 801a9e2: 79fb ldrb r3, [r7, #7]
  65673. 801a9e4: 4618 mov r0, r3
  65674. 801a9e6: f7ff fa63 bl 8019eb0 <pbuf_alloc>
  65675. 801a9ea: 60f8 str r0, [r7, #12]
  65676. if (q == NULL) {
  65677. 801a9ec: 68fb ldr r3, [r7, #12]
  65678. 801a9ee: 2b00 cmp r3, #0
  65679. 801a9f0: d101 bne.n 801a9f6 <pbuf_clone+0x2a>
  65680. return NULL;
  65681. 801a9f2: 2300 movs r3, #0
  65682. 801a9f4: e011 b.n 801aa1a <pbuf_clone+0x4e>
  65683. }
  65684. err = pbuf_copy(q, p);
  65685. 801a9f6: 6839 ldr r1, [r7, #0]
  65686. 801a9f8: 68f8 ldr r0, [r7, #12]
  65687. 801a9fa: f7ff fea3 bl 801a744 <pbuf_copy>
  65688. 801a9fe: 4603 mov r3, r0
  65689. 801aa00: 72fb strb r3, [r7, #11]
  65690. LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */
  65691. LWIP_ASSERT("pbuf_copy failed", err == ERR_OK);
  65692. 801aa02: f997 300b ldrsb.w r3, [r7, #11]
  65693. 801aa06: 2b00 cmp r3, #0
  65694. 801aa08: d006 beq.n 801aa18 <pbuf_clone+0x4c>
  65695. 801aa0a: 4b06 ldr r3, [pc, #24] @ (801aa24 <pbuf_clone+0x58>)
  65696. 801aa0c: f240 5224 movw r2, #1316 @ 0x524
  65697. 801aa10: 4905 ldr r1, [pc, #20] @ (801aa28 <pbuf_clone+0x5c>)
  65698. 801aa12: 4806 ldr r0, [pc, #24] @ (801aa2c <pbuf_clone+0x60>)
  65699. 801aa14: f00e ffda bl 80299cc <iprintf>
  65700. return q;
  65701. 801aa18: 68fb ldr r3, [r7, #12]
  65702. }
  65703. 801aa1a: 4618 mov r0, r3
  65704. 801aa1c: 3710 adds r7, #16
  65705. 801aa1e: 46bd mov sp, r7
  65706. 801aa20: bd80 pop {r7, pc}
  65707. 801aa22: bf00 nop
  65708. 801aa24: 0802e0a8 .word 0x0802e0a8
  65709. 801aa28: 0802e51c .word 0x0802e51c
  65710. 801aa2c: 0802e108 .word 0x0802e108
  65711. 0801aa30 <tcp_init>:
  65712. /**
  65713. * Initialize this module.
  65714. */
  65715. void
  65716. tcp_init(void)
  65717. {
  65718. 801aa30: b580 push {r7, lr}
  65719. 801aa32: af00 add r7, sp, #0
  65720. #ifdef LWIP_RAND
  65721. tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
  65722. 801aa34: f00d fca0 bl 8028378 <rand>
  65723. 801aa38: 4603 mov r3, r0
  65724. 801aa3a: b29b uxth r3, r3
  65725. 801aa3c: f3c3 030d ubfx r3, r3, #0, #14
  65726. 801aa40: b29b uxth r3, r3
  65727. 801aa42: f5a3 4380 sub.w r3, r3, #16384 @ 0x4000
  65728. 801aa46: b29a uxth r2, r3
  65729. 801aa48: 4b01 ldr r3, [pc, #4] @ (801aa50 <tcp_init+0x20>)
  65730. 801aa4a: 801a strh r2, [r3, #0]
  65731. #endif /* LWIP_RAND */
  65732. }
  65733. 801aa4c: bf00 nop
  65734. 801aa4e: bd80 pop {r7, pc}
  65735. 801aa50: 2400004c .word 0x2400004c
  65736. 0801aa54 <tcp_free>:
  65737. /** Free a tcp pcb */
  65738. void
  65739. tcp_free(struct tcp_pcb *pcb)
  65740. {
  65741. 801aa54: b580 push {r7, lr}
  65742. 801aa56: b082 sub sp, #8
  65743. 801aa58: af00 add r7, sp, #0
  65744. 801aa5a: 6078 str r0, [r7, #4]
  65745. LWIP_ASSERT("tcp_free: LISTEN", pcb->state != LISTEN);
  65746. 801aa5c: 687b ldr r3, [r7, #4]
  65747. 801aa5e: 7d1b ldrb r3, [r3, #20]
  65748. 801aa60: 2b01 cmp r3, #1
  65749. 801aa62: d105 bne.n 801aa70 <tcp_free+0x1c>
  65750. 801aa64: 4b06 ldr r3, [pc, #24] @ (801aa80 <tcp_free+0x2c>)
  65751. 801aa66: 22d4 movs r2, #212 @ 0xd4
  65752. 801aa68: 4906 ldr r1, [pc, #24] @ (801aa84 <tcp_free+0x30>)
  65753. 801aa6a: 4807 ldr r0, [pc, #28] @ (801aa88 <tcp_free+0x34>)
  65754. 801aa6c: f00e ffae bl 80299cc <iprintf>
  65755. #if LWIP_TCP_PCB_NUM_EXT_ARGS
  65756. tcp_ext_arg_invoke_callbacks_destroyed(pcb->ext_args);
  65757. #endif
  65758. memp_free(MEMP_TCP_PCB, pcb);
  65759. 801aa70: 6879 ldr r1, [r7, #4]
  65760. 801aa72: 2001 movs r0, #1
  65761. 801aa74: f7fe fe44 bl 8019700 <memp_free>
  65762. }
  65763. 801aa78: bf00 nop
  65764. 801aa7a: 3708 adds r7, #8
  65765. 801aa7c: 46bd mov sp, r7
  65766. 801aa7e: bd80 pop {r7, pc}
  65767. 801aa80: 0802e5a8 .word 0x0802e5a8
  65768. 801aa84: 0802e5d8 .word 0x0802e5d8
  65769. 801aa88: 0802e5ec .word 0x0802e5ec
  65770. 0801aa8c <tcp_free_listen>:
  65771. /** Free a tcp listen pcb */
  65772. static void
  65773. tcp_free_listen(struct tcp_pcb *pcb)
  65774. {
  65775. 801aa8c: b580 push {r7, lr}
  65776. 801aa8e: b082 sub sp, #8
  65777. 801aa90: af00 add r7, sp, #0
  65778. 801aa92: 6078 str r0, [r7, #4]
  65779. LWIP_ASSERT("tcp_free_listen: !LISTEN", pcb->state != LISTEN);
  65780. 801aa94: 687b ldr r3, [r7, #4]
  65781. 801aa96: 7d1b ldrb r3, [r3, #20]
  65782. 801aa98: 2b01 cmp r3, #1
  65783. 801aa9a: d105 bne.n 801aaa8 <tcp_free_listen+0x1c>
  65784. 801aa9c: 4b06 ldr r3, [pc, #24] @ (801aab8 <tcp_free_listen+0x2c>)
  65785. 801aa9e: 22df movs r2, #223 @ 0xdf
  65786. 801aaa0: 4906 ldr r1, [pc, #24] @ (801aabc <tcp_free_listen+0x30>)
  65787. 801aaa2: 4807 ldr r0, [pc, #28] @ (801aac0 <tcp_free_listen+0x34>)
  65788. 801aaa4: f00e ff92 bl 80299cc <iprintf>
  65789. #if LWIP_TCP_PCB_NUM_EXT_ARGS
  65790. tcp_ext_arg_invoke_callbacks_destroyed(pcb->ext_args);
  65791. #endif
  65792. memp_free(MEMP_TCP_PCB_LISTEN, pcb);
  65793. 801aaa8: 6879 ldr r1, [r7, #4]
  65794. 801aaaa: 2002 movs r0, #2
  65795. 801aaac: f7fe fe28 bl 8019700 <memp_free>
  65796. }
  65797. 801aab0: bf00 nop
  65798. 801aab2: 3708 adds r7, #8
  65799. 801aab4: 46bd mov sp, r7
  65800. 801aab6: bd80 pop {r7, pc}
  65801. 801aab8: 0802e5a8 .word 0x0802e5a8
  65802. 801aabc: 0802e614 .word 0x0802e614
  65803. 801aac0: 0802e5ec .word 0x0802e5ec
  65804. 0801aac4 <tcp_tmr>:
  65805. /**
  65806. * Called periodically to dispatch TCP timers.
  65807. */
  65808. void
  65809. tcp_tmr(void)
  65810. {
  65811. 801aac4: b580 push {r7, lr}
  65812. 801aac6: af00 add r7, sp, #0
  65813. /* Call tcp_fasttmr() every 250 ms */
  65814. tcp_fasttmr();
  65815. 801aac8: f001 f86a bl 801bba0 <tcp_fasttmr>
  65816. if (++tcp_timer & 1) {
  65817. 801aacc: 4b07 ldr r3, [pc, #28] @ (801aaec <tcp_tmr+0x28>)
  65818. 801aace: 781b ldrb r3, [r3, #0]
  65819. 801aad0: 3301 adds r3, #1
  65820. 801aad2: b2da uxtb r2, r3
  65821. 801aad4: 4b05 ldr r3, [pc, #20] @ (801aaec <tcp_tmr+0x28>)
  65822. 801aad6: 701a strb r2, [r3, #0]
  65823. 801aad8: 4b04 ldr r3, [pc, #16] @ (801aaec <tcp_tmr+0x28>)
  65824. 801aada: 781b ldrb r3, [r3, #0]
  65825. 801aadc: f003 0301 and.w r3, r3, #1
  65826. 801aae0: 2b00 cmp r3, #0
  65827. 801aae2: d001 beq.n 801aae8 <tcp_tmr+0x24>
  65828. /* Call tcp_slowtmr() every 500 ms, i.e., every other timer
  65829. tcp_tmr() is called. */
  65830. tcp_slowtmr();
  65831. 801aae4: f000 fd1a bl 801b51c <tcp_slowtmr>
  65832. }
  65833. }
  65834. 801aae8: bf00 nop
  65835. 801aaea: bd80 pop {r7, pc}
  65836. 801aaec: 2402ae9d .word 0x2402ae9d
  65837. 0801aaf0 <tcp_remove_listener>:
  65838. /** Called when a listen pcb is closed. Iterates one pcb list and removes the
  65839. * closed listener pcb from pcb->listener if matching.
  65840. */
  65841. static void
  65842. tcp_remove_listener(struct tcp_pcb *list, struct tcp_pcb_listen *lpcb)
  65843. {
  65844. 801aaf0: b580 push {r7, lr}
  65845. 801aaf2: b084 sub sp, #16
  65846. 801aaf4: af00 add r7, sp, #0
  65847. 801aaf6: 6078 str r0, [r7, #4]
  65848. 801aaf8: 6039 str r1, [r7, #0]
  65849. struct tcp_pcb *pcb;
  65850. LWIP_ASSERT("tcp_remove_listener: invalid listener", lpcb != NULL);
  65851. 801aafa: 683b ldr r3, [r7, #0]
  65852. 801aafc: 2b00 cmp r3, #0
  65853. 801aafe: d105 bne.n 801ab0c <tcp_remove_listener+0x1c>
  65854. 801ab00: 4b0d ldr r3, [pc, #52] @ (801ab38 <tcp_remove_listener+0x48>)
  65855. 801ab02: 22ff movs r2, #255 @ 0xff
  65856. 801ab04: 490d ldr r1, [pc, #52] @ (801ab3c <tcp_remove_listener+0x4c>)
  65857. 801ab06: 480e ldr r0, [pc, #56] @ (801ab40 <tcp_remove_listener+0x50>)
  65858. 801ab08: f00e ff60 bl 80299cc <iprintf>
  65859. for (pcb = list; pcb != NULL; pcb = pcb->next) {
  65860. 801ab0c: 687b ldr r3, [r7, #4]
  65861. 801ab0e: 60fb str r3, [r7, #12]
  65862. 801ab10: e00a b.n 801ab28 <tcp_remove_listener+0x38>
  65863. if (pcb->listener == lpcb) {
  65864. 801ab12: 68fb ldr r3, [r7, #12]
  65865. 801ab14: 6fdb ldr r3, [r3, #124] @ 0x7c
  65866. 801ab16: 683a ldr r2, [r7, #0]
  65867. 801ab18: 429a cmp r2, r3
  65868. 801ab1a: d102 bne.n 801ab22 <tcp_remove_listener+0x32>
  65869. pcb->listener = NULL;
  65870. 801ab1c: 68fb ldr r3, [r7, #12]
  65871. 801ab1e: 2200 movs r2, #0
  65872. 801ab20: 67da str r2, [r3, #124] @ 0x7c
  65873. for (pcb = list; pcb != NULL; pcb = pcb->next) {
  65874. 801ab22: 68fb ldr r3, [r7, #12]
  65875. 801ab24: 68db ldr r3, [r3, #12]
  65876. 801ab26: 60fb str r3, [r7, #12]
  65877. 801ab28: 68fb ldr r3, [r7, #12]
  65878. 801ab2a: 2b00 cmp r3, #0
  65879. 801ab2c: d1f1 bne.n 801ab12 <tcp_remove_listener+0x22>
  65880. }
  65881. }
  65882. }
  65883. 801ab2e: bf00 nop
  65884. 801ab30: bf00 nop
  65885. 801ab32: 3710 adds r7, #16
  65886. 801ab34: 46bd mov sp, r7
  65887. 801ab36: bd80 pop {r7, pc}
  65888. 801ab38: 0802e5a8 .word 0x0802e5a8
  65889. 801ab3c: 0802e630 .word 0x0802e630
  65890. 801ab40: 0802e5ec .word 0x0802e5ec
  65891. 0801ab44 <tcp_listen_closed>:
  65892. /** Called when a listen pcb is closed. Iterates all pcb lists and removes the
  65893. * closed listener pcb from pcb->listener if matching.
  65894. */
  65895. static void
  65896. tcp_listen_closed(struct tcp_pcb *pcb)
  65897. {
  65898. 801ab44: b580 push {r7, lr}
  65899. 801ab46: b084 sub sp, #16
  65900. 801ab48: af00 add r7, sp, #0
  65901. 801ab4a: 6078 str r0, [r7, #4]
  65902. #if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
  65903. size_t i;
  65904. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  65905. 801ab4c: 687b ldr r3, [r7, #4]
  65906. 801ab4e: 2b00 cmp r3, #0
  65907. 801ab50: d106 bne.n 801ab60 <tcp_listen_closed+0x1c>
  65908. 801ab52: 4b14 ldr r3, [pc, #80] @ (801aba4 <tcp_listen_closed+0x60>)
  65909. 801ab54: f240 1211 movw r2, #273 @ 0x111
  65910. 801ab58: 4913 ldr r1, [pc, #76] @ (801aba8 <tcp_listen_closed+0x64>)
  65911. 801ab5a: 4814 ldr r0, [pc, #80] @ (801abac <tcp_listen_closed+0x68>)
  65912. 801ab5c: f00e ff36 bl 80299cc <iprintf>
  65913. LWIP_ASSERT("pcb->state == LISTEN", pcb->state == LISTEN);
  65914. 801ab60: 687b ldr r3, [r7, #4]
  65915. 801ab62: 7d1b ldrb r3, [r3, #20]
  65916. 801ab64: 2b01 cmp r3, #1
  65917. 801ab66: d006 beq.n 801ab76 <tcp_listen_closed+0x32>
  65918. 801ab68: 4b0e ldr r3, [pc, #56] @ (801aba4 <tcp_listen_closed+0x60>)
  65919. 801ab6a: f44f 7289 mov.w r2, #274 @ 0x112
  65920. 801ab6e: 4910 ldr r1, [pc, #64] @ (801abb0 <tcp_listen_closed+0x6c>)
  65921. 801ab70: 480e ldr r0, [pc, #56] @ (801abac <tcp_listen_closed+0x68>)
  65922. 801ab72: f00e ff2b bl 80299cc <iprintf>
  65923. for (i = 1; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) {
  65924. 801ab76: 2301 movs r3, #1
  65925. 801ab78: 60fb str r3, [r7, #12]
  65926. 801ab7a: e00b b.n 801ab94 <tcp_listen_closed+0x50>
  65927. tcp_remove_listener(*tcp_pcb_lists[i], (struct tcp_pcb_listen *)pcb);
  65928. 801ab7c: 4a0d ldr r2, [pc, #52] @ (801abb4 <tcp_listen_closed+0x70>)
  65929. 801ab7e: 68fb ldr r3, [r7, #12]
  65930. 801ab80: f852 3023 ldr.w r3, [r2, r3, lsl #2]
  65931. 801ab84: 681b ldr r3, [r3, #0]
  65932. 801ab86: 6879 ldr r1, [r7, #4]
  65933. 801ab88: 4618 mov r0, r3
  65934. 801ab8a: f7ff ffb1 bl 801aaf0 <tcp_remove_listener>
  65935. for (i = 1; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) {
  65936. 801ab8e: 68fb ldr r3, [r7, #12]
  65937. 801ab90: 3301 adds r3, #1
  65938. 801ab92: 60fb str r3, [r7, #12]
  65939. 801ab94: 68fb ldr r3, [r7, #12]
  65940. 801ab96: 2b03 cmp r3, #3
  65941. 801ab98: d9f0 bls.n 801ab7c <tcp_listen_closed+0x38>
  65942. }
  65943. #endif
  65944. LWIP_UNUSED_ARG(pcb);
  65945. }
  65946. 801ab9a: bf00 nop
  65947. 801ab9c: bf00 nop
  65948. 801ab9e: 3710 adds r7, #16
  65949. 801aba0: 46bd mov sp, r7
  65950. 801aba2: bd80 pop {r7, pc}
  65951. 801aba4: 0802e5a8 .word 0x0802e5a8
  65952. 801aba8: 0802e658 .word 0x0802e658
  65953. 801abac: 0802e5ec .word 0x0802e5ec
  65954. 801abb0: 0802e664 .word 0x0802e664
  65955. 801abb4: 08030bd8 .word 0x08030bd8
  65956. 0801abb8 <tcp_close_shutdown>:
  65957. * @return ERR_OK if connection has been closed
  65958. * another err_t if closing failed and pcb is not freed
  65959. */
  65960. static err_t
  65961. tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data)
  65962. {
  65963. 801abb8: b5b0 push {r4, r5, r7, lr}
  65964. 801abba: b088 sub sp, #32
  65965. 801abbc: af04 add r7, sp, #16
  65966. 801abbe: 6078 str r0, [r7, #4]
  65967. 801abc0: 460b mov r3, r1
  65968. 801abc2: 70fb strb r3, [r7, #3]
  65969. LWIP_ASSERT("tcp_close_shutdown: invalid pcb", pcb != NULL);
  65970. 801abc4: 687b ldr r3, [r7, #4]
  65971. 801abc6: 2b00 cmp r3, #0
  65972. 801abc8: d106 bne.n 801abd8 <tcp_close_shutdown+0x20>
  65973. 801abca: 4b63 ldr r3, [pc, #396] @ (801ad58 <tcp_close_shutdown+0x1a0>)
  65974. 801abcc: f44f 72af mov.w r2, #350 @ 0x15e
  65975. 801abd0: 4962 ldr r1, [pc, #392] @ (801ad5c <tcp_close_shutdown+0x1a4>)
  65976. 801abd2: 4863 ldr r0, [pc, #396] @ (801ad60 <tcp_close_shutdown+0x1a8>)
  65977. 801abd4: f00e fefa bl 80299cc <iprintf>
  65978. if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
  65979. 801abd8: 78fb ldrb r3, [r7, #3]
  65980. 801abda: 2b00 cmp r3, #0
  65981. 801abdc: d067 beq.n 801acae <tcp_close_shutdown+0xf6>
  65982. 801abde: 687b ldr r3, [r7, #4]
  65983. 801abe0: 7d1b ldrb r3, [r3, #20]
  65984. 801abe2: 2b04 cmp r3, #4
  65985. 801abe4: d003 beq.n 801abee <tcp_close_shutdown+0x36>
  65986. 801abe6: 687b ldr r3, [r7, #4]
  65987. 801abe8: 7d1b ldrb r3, [r3, #20]
  65988. 801abea: 2b07 cmp r3, #7
  65989. 801abec: d15f bne.n 801acae <tcp_close_shutdown+0xf6>
  65990. if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND_MAX(pcb))) {
  65991. 801abee: 687b ldr r3, [r7, #4]
  65992. 801abf0: 6f9b ldr r3, [r3, #120] @ 0x78
  65993. 801abf2: 2b00 cmp r3, #0
  65994. 801abf4: d105 bne.n 801ac02 <tcp_close_shutdown+0x4a>
  65995. 801abf6: 687b ldr r3, [r7, #4]
  65996. 801abf8: 8d1b ldrh r3, [r3, #40] @ 0x28
  65997. 801abfa: f241 62d0 movw r2, #5840 @ 0x16d0
  65998. 801abfe: 4293 cmp r3, r2
  65999. 801ac00: d055 beq.n 801acae <tcp_close_shutdown+0xf6>
  66000. /* Not all data received by application, send RST to tell the remote
  66001. side about this. */
  66002. LWIP_ASSERT("pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED);
  66003. 801ac02: 687b ldr r3, [r7, #4]
  66004. 801ac04: 8b5b ldrh r3, [r3, #26]
  66005. 801ac06: f003 0310 and.w r3, r3, #16
  66006. 801ac0a: 2b00 cmp r3, #0
  66007. 801ac0c: d106 bne.n 801ac1c <tcp_close_shutdown+0x64>
  66008. 801ac0e: 4b52 ldr r3, [pc, #328] @ (801ad58 <tcp_close_shutdown+0x1a0>)
  66009. 801ac10: f44f 72b2 mov.w r2, #356 @ 0x164
  66010. 801ac14: 4953 ldr r1, [pc, #332] @ (801ad64 <tcp_close_shutdown+0x1ac>)
  66011. 801ac16: 4852 ldr r0, [pc, #328] @ (801ad60 <tcp_close_shutdown+0x1a8>)
  66012. 801ac18: f00e fed8 bl 80299cc <iprintf>
  66013. /* don't call tcp_abort here: we must not deallocate the pcb since
  66014. that might not be expected when calling tcp_close */
  66015. tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  66016. 801ac1c: 687b ldr r3, [r7, #4]
  66017. 801ac1e: 6d18 ldr r0, [r3, #80] @ 0x50
  66018. 801ac20: 687b ldr r3, [r7, #4]
  66019. 801ac22: 6a5c ldr r4, [r3, #36] @ 0x24
  66020. 801ac24: 687d ldr r5, [r7, #4]
  66021. 801ac26: 687b ldr r3, [r7, #4]
  66022. 801ac28: 3304 adds r3, #4
  66023. 801ac2a: 687a ldr r2, [r7, #4]
  66024. 801ac2c: 8ad2 ldrh r2, [r2, #22]
  66025. 801ac2e: 6879 ldr r1, [r7, #4]
  66026. 801ac30: 8b09 ldrh r1, [r1, #24]
  66027. 801ac32: 9102 str r1, [sp, #8]
  66028. 801ac34: 9201 str r2, [sp, #4]
  66029. 801ac36: 9300 str r3, [sp, #0]
  66030. 801ac38: 462b mov r3, r5
  66031. 801ac3a: 4622 mov r2, r4
  66032. 801ac3c: 4601 mov r1, r0
  66033. 801ac3e: 6878 ldr r0, [r7, #4]
  66034. 801ac40: f005 fdfa bl 8020838 <tcp_rst>
  66035. pcb->local_port, pcb->remote_port);
  66036. tcp_pcb_purge(pcb);
  66037. 801ac44: 6878 ldr r0, [r7, #4]
  66038. 801ac46: f001 fb67 bl 801c318 <tcp_pcb_purge>
  66039. TCP_RMV_ACTIVE(pcb);
  66040. 801ac4a: 4b47 ldr r3, [pc, #284] @ (801ad68 <tcp_close_shutdown+0x1b0>)
  66041. 801ac4c: 681b ldr r3, [r3, #0]
  66042. 801ac4e: 687a ldr r2, [r7, #4]
  66043. 801ac50: 429a cmp r2, r3
  66044. 801ac52: d105 bne.n 801ac60 <tcp_close_shutdown+0xa8>
  66045. 801ac54: 4b44 ldr r3, [pc, #272] @ (801ad68 <tcp_close_shutdown+0x1b0>)
  66046. 801ac56: 681b ldr r3, [r3, #0]
  66047. 801ac58: 68db ldr r3, [r3, #12]
  66048. 801ac5a: 4a43 ldr r2, [pc, #268] @ (801ad68 <tcp_close_shutdown+0x1b0>)
  66049. 801ac5c: 6013 str r3, [r2, #0]
  66050. 801ac5e: e013 b.n 801ac88 <tcp_close_shutdown+0xd0>
  66051. 801ac60: 4b41 ldr r3, [pc, #260] @ (801ad68 <tcp_close_shutdown+0x1b0>)
  66052. 801ac62: 681b ldr r3, [r3, #0]
  66053. 801ac64: 60fb str r3, [r7, #12]
  66054. 801ac66: e00c b.n 801ac82 <tcp_close_shutdown+0xca>
  66055. 801ac68: 68fb ldr r3, [r7, #12]
  66056. 801ac6a: 68db ldr r3, [r3, #12]
  66057. 801ac6c: 687a ldr r2, [r7, #4]
  66058. 801ac6e: 429a cmp r2, r3
  66059. 801ac70: d104 bne.n 801ac7c <tcp_close_shutdown+0xc4>
  66060. 801ac72: 687b ldr r3, [r7, #4]
  66061. 801ac74: 68da ldr r2, [r3, #12]
  66062. 801ac76: 68fb ldr r3, [r7, #12]
  66063. 801ac78: 60da str r2, [r3, #12]
  66064. 801ac7a: e005 b.n 801ac88 <tcp_close_shutdown+0xd0>
  66065. 801ac7c: 68fb ldr r3, [r7, #12]
  66066. 801ac7e: 68db ldr r3, [r3, #12]
  66067. 801ac80: 60fb str r3, [r7, #12]
  66068. 801ac82: 68fb ldr r3, [r7, #12]
  66069. 801ac84: 2b00 cmp r3, #0
  66070. 801ac86: d1ef bne.n 801ac68 <tcp_close_shutdown+0xb0>
  66071. 801ac88: 687b ldr r3, [r7, #4]
  66072. 801ac8a: 2200 movs r2, #0
  66073. 801ac8c: 60da str r2, [r3, #12]
  66074. 801ac8e: 4b37 ldr r3, [pc, #220] @ (801ad6c <tcp_close_shutdown+0x1b4>)
  66075. 801ac90: 2201 movs r2, #1
  66076. 801ac92: 701a strb r2, [r3, #0]
  66077. /* Deallocate the pcb since we already sent a RST for it */
  66078. if (tcp_input_pcb == pcb) {
  66079. 801ac94: 4b36 ldr r3, [pc, #216] @ (801ad70 <tcp_close_shutdown+0x1b8>)
  66080. 801ac96: 681b ldr r3, [r3, #0]
  66081. 801ac98: 687a ldr r2, [r7, #4]
  66082. 801ac9a: 429a cmp r2, r3
  66083. 801ac9c: d102 bne.n 801aca4 <tcp_close_shutdown+0xec>
  66084. /* prevent using a deallocated pcb: free it from tcp_input later */
  66085. tcp_trigger_input_pcb_close();
  66086. 801ac9e: f003 ffff bl 801eca0 <tcp_trigger_input_pcb_close>
  66087. 801aca2: e002 b.n 801acaa <tcp_close_shutdown+0xf2>
  66088. } else {
  66089. tcp_free(pcb);
  66090. 801aca4: 6878 ldr r0, [r7, #4]
  66091. 801aca6: f7ff fed5 bl 801aa54 <tcp_free>
  66092. }
  66093. return ERR_OK;
  66094. 801acaa: 2300 movs r3, #0
  66095. 801acac: e050 b.n 801ad50 <tcp_close_shutdown+0x198>
  66096. }
  66097. }
  66098. /* - states which free the pcb are handled here,
  66099. - states which send FIN and change state are handled in tcp_close_shutdown_fin() */
  66100. switch (pcb->state) {
  66101. 801acae: 687b ldr r3, [r7, #4]
  66102. 801acb0: 7d1b ldrb r3, [r3, #20]
  66103. 801acb2: 2b02 cmp r3, #2
  66104. 801acb4: d03b beq.n 801ad2e <tcp_close_shutdown+0x176>
  66105. 801acb6: 2b02 cmp r3, #2
  66106. 801acb8: dc44 bgt.n 801ad44 <tcp_close_shutdown+0x18c>
  66107. 801acba: 2b00 cmp r3, #0
  66108. 801acbc: d002 beq.n 801acc4 <tcp_close_shutdown+0x10c>
  66109. 801acbe: 2b01 cmp r3, #1
  66110. 801acc0: d02a beq.n 801ad18 <tcp_close_shutdown+0x160>
  66111. 801acc2: e03f b.n 801ad44 <tcp_close_shutdown+0x18c>
  66112. * and the user needs some way to free it should the need arise.
  66113. * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
  66114. * or for a pcb that has been used and then entered the CLOSED state
  66115. * is erroneous, but this should never happen as the pcb has in those cases
  66116. * been freed, and so any remaining handles are bogus. */
  66117. if (pcb->local_port != 0) {
  66118. 801acc4: 687b ldr r3, [r7, #4]
  66119. 801acc6: 8adb ldrh r3, [r3, #22]
  66120. 801acc8: 2b00 cmp r3, #0
  66121. 801acca: d021 beq.n 801ad10 <tcp_close_shutdown+0x158>
  66122. TCP_RMV(&tcp_bound_pcbs, pcb);
  66123. 801accc: 4b29 ldr r3, [pc, #164] @ (801ad74 <tcp_close_shutdown+0x1bc>)
  66124. 801acce: 681b ldr r3, [r3, #0]
  66125. 801acd0: 687a ldr r2, [r7, #4]
  66126. 801acd2: 429a cmp r2, r3
  66127. 801acd4: d105 bne.n 801ace2 <tcp_close_shutdown+0x12a>
  66128. 801acd6: 4b27 ldr r3, [pc, #156] @ (801ad74 <tcp_close_shutdown+0x1bc>)
  66129. 801acd8: 681b ldr r3, [r3, #0]
  66130. 801acda: 68db ldr r3, [r3, #12]
  66131. 801acdc: 4a25 ldr r2, [pc, #148] @ (801ad74 <tcp_close_shutdown+0x1bc>)
  66132. 801acde: 6013 str r3, [r2, #0]
  66133. 801ace0: e013 b.n 801ad0a <tcp_close_shutdown+0x152>
  66134. 801ace2: 4b24 ldr r3, [pc, #144] @ (801ad74 <tcp_close_shutdown+0x1bc>)
  66135. 801ace4: 681b ldr r3, [r3, #0]
  66136. 801ace6: 60bb str r3, [r7, #8]
  66137. 801ace8: e00c b.n 801ad04 <tcp_close_shutdown+0x14c>
  66138. 801acea: 68bb ldr r3, [r7, #8]
  66139. 801acec: 68db ldr r3, [r3, #12]
  66140. 801acee: 687a ldr r2, [r7, #4]
  66141. 801acf0: 429a cmp r2, r3
  66142. 801acf2: d104 bne.n 801acfe <tcp_close_shutdown+0x146>
  66143. 801acf4: 687b ldr r3, [r7, #4]
  66144. 801acf6: 68da ldr r2, [r3, #12]
  66145. 801acf8: 68bb ldr r3, [r7, #8]
  66146. 801acfa: 60da str r2, [r3, #12]
  66147. 801acfc: e005 b.n 801ad0a <tcp_close_shutdown+0x152>
  66148. 801acfe: 68bb ldr r3, [r7, #8]
  66149. 801ad00: 68db ldr r3, [r3, #12]
  66150. 801ad02: 60bb str r3, [r7, #8]
  66151. 801ad04: 68bb ldr r3, [r7, #8]
  66152. 801ad06: 2b00 cmp r3, #0
  66153. 801ad08: d1ef bne.n 801acea <tcp_close_shutdown+0x132>
  66154. 801ad0a: 687b ldr r3, [r7, #4]
  66155. 801ad0c: 2200 movs r2, #0
  66156. 801ad0e: 60da str r2, [r3, #12]
  66157. }
  66158. tcp_free(pcb);
  66159. 801ad10: 6878 ldr r0, [r7, #4]
  66160. 801ad12: f7ff fe9f bl 801aa54 <tcp_free>
  66161. break;
  66162. 801ad16: e01a b.n 801ad4e <tcp_close_shutdown+0x196>
  66163. case LISTEN:
  66164. tcp_listen_closed(pcb);
  66165. 801ad18: 6878 ldr r0, [r7, #4]
  66166. 801ad1a: f7ff ff13 bl 801ab44 <tcp_listen_closed>
  66167. tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
  66168. 801ad1e: 6879 ldr r1, [r7, #4]
  66169. 801ad20: 4815 ldr r0, [pc, #84] @ (801ad78 <tcp_close_shutdown+0x1c0>)
  66170. 801ad22: f001 fb49 bl 801c3b8 <tcp_pcb_remove>
  66171. tcp_free_listen(pcb);
  66172. 801ad26: 6878 ldr r0, [r7, #4]
  66173. 801ad28: f7ff feb0 bl 801aa8c <tcp_free_listen>
  66174. break;
  66175. 801ad2c: e00f b.n 801ad4e <tcp_close_shutdown+0x196>
  66176. case SYN_SENT:
  66177. TCP_PCB_REMOVE_ACTIVE(pcb);
  66178. 801ad2e: 6879 ldr r1, [r7, #4]
  66179. 801ad30: 480d ldr r0, [pc, #52] @ (801ad68 <tcp_close_shutdown+0x1b0>)
  66180. 801ad32: f001 fb41 bl 801c3b8 <tcp_pcb_remove>
  66181. 801ad36: 4b0d ldr r3, [pc, #52] @ (801ad6c <tcp_close_shutdown+0x1b4>)
  66182. 801ad38: 2201 movs r2, #1
  66183. 801ad3a: 701a strb r2, [r3, #0]
  66184. tcp_free(pcb);
  66185. 801ad3c: 6878 ldr r0, [r7, #4]
  66186. 801ad3e: f7ff fe89 bl 801aa54 <tcp_free>
  66187. MIB2_STATS_INC(mib2.tcpattemptfails);
  66188. break;
  66189. 801ad42: e004 b.n 801ad4e <tcp_close_shutdown+0x196>
  66190. default:
  66191. return tcp_close_shutdown_fin(pcb);
  66192. 801ad44: 6878 ldr r0, [r7, #4]
  66193. 801ad46: f000 f819 bl 801ad7c <tcp_close_shutdown_fin>
  66194. 801ad4a: 4603 mov r3, r0
  66195. 801ad4c: e000 b.n 801ad50 <tcp_close_shutdown+0x198>
  66196. }
  66197. return ERR_OK;
  66198. 801ad4e: 2300 movs r3, #0
  66199. }
  66200. 801ad50: 4618 mov r0, r3
  66201. 801ad52: 3710 adds r7, #16
  66202. 801ad54: 46bd mov sp, r7
  66203. 801ad56: bdb0 pop {r4, r5, r7, pc}
  66204. 801ad58: 0802e5a8 .word 0x0802e5a8
  66205. 801ad5c: 0802e67c .word 0x0802e67c
  66206. 801ad60: 0802e5ec .word 0x0802e5ec
  66207. 801ad64: 0802e69c .word 0x0802e69c
  66208. 801ad68: 2402ae94 .word 0x2402ae94
  66209. 801ad6c: 2402ae9c .word 0x2402ae9c
  66210. 801ad70: 2402aed8 .word 0x2402aed8
  66211. 801ad74: 2402ae8c .word 0x2402ae8c
  66212. 801ad78: 2402ae90 .word 0x2402ae90
  66213. 0801ad7c <tcp_close_shutdown_fin>:
  66214. static err_t
  66215. tcp_close_shutdown_fin(struct tcp_pcb *pcb)
  66216. {
  66217. 801ad7c: b580 push {r7, lr}
  66218. 801ad7e: b084 sub sp, #16
  66219. 801ad80: af00 add r7, sp, #0
  66220. 801ad82: 6078 str r0, [r7, #4]
  66221. err_t err;
  66222. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  66223. 801ad84: 687b ldr r3, [r7, #4]
  66224. 801ad86: 2b00 cmp r3, #0
  66225. 801ad88: d106 bne.n 801ad98 <tcp_close_shutdown_fin+0x1c>
  66226. 801ad8a: 4b2e ldr r3, [pc, #184] @ (801ae44 <tcp_close_shutdown_fin+0xc8>)
  66227. 801ad8c: f44f 72ce mov.w r2, #412 @ 0x19c
  66228. 801ad90: 492d ldr r1, [pc, #180] @ (801ae48 <tcp_close_shutdown_fin+0xcc>)
  66229. 801ad92: 482e ldr r0, [pc, #184] @ (801ae4c <tcp_close_shutdown_fin+0xd0>)
  66230. 801ad94: f00e fe1a bl 80299cc <iprintf>
  66231. switch (pcb->state) {
  66232. 801ad98: 687b ldr r3, [r7, #4]
  66233. 801ad9a: 7d1b ldrb r3, [r3, #20]
  66234. 801ad9c: 2b07 cmp r3, #7
  66235. 801ad9e: d020 beq.n 801ade2 <tcp_close_shutdown_fin+0x66>
  66236. 801ada0: 2b07 cmp r3, #7
  66237. 801ada2: dc2b bgt.n 801adfc <tcp_close_shutdown_fin+0x80>
  66238. 801ada4: 2b03 cmp r3, #3
  66239. 801ada6: d002 beq.n 801adae <tcp_close_shutdown_fin+0x32>
  66240. 801ada8: 2b04 cmp r3, #4
  66241. 801adaa: d00d beq.n 801adc8 <tcp_close_shutdown_fin+0x4c>
  66242. 801adac: e026 b.n 801adfc <tcp_close_shutdown_fin+0x80>
  66243. case SYN_RCVD:
  66244. err = tcp_send_fin(pcb);
  66245. 801adae: 6878 ldr r0, [r7, #4]
  66246. 801adb0: f004 fe42 bl 801fa38 <tcp_send_fin>
  66247. 801adb4: 4603 mov r3, r0
  66248. 801adb6: 73fb strb r3, [r7, #15]
  66249. if (err == ERR_OK) {
  66250. 801adb8: f997 300f ldrsb.w r3, [r7, #15]
  66251. 801adbc: 2b00 cmp r3, #0
  66252. 801adbe: d11f bne.n 801ae00 <tcp_close_shutdown_fin+0x84>
  66253. tcp_backlog_accepted(pcb);
  66254. MIB2_STATS_INC(mib2.tcpattemptfails);
  66255. pcb->state = FIN_WAIT_1;
  66256. 801adc0: 687b ldr r3, [r7, #4]
  66257. 801adc2: 2205 movs r2, #5
  66258. 801adc4: 751a strb r2, [r3, #20]
  66259. }
  66260. break;
  66261. 801adc6: e01b b.n 801ae00 <tcp_close_shutdown_fin+0x84>
  66262. case ESTABLISHED:
  66263. err = tcp_send_fin(pcb);
  66264. 801adc8: 6878 ldr r0, [r7, #4]
  66265. 801adca: f004 fe35 bl 801fa38 <tcp_send_fin>
  66266. 801adce: 4603 mov r3, r0
  66267. 801add0: 73fb strb r3, [r7, #15]
  66268. if (err == ERR_OK) {
  66269. 801add2: f997 300f ldrsb.w r3, [r7, #15]
  66270. 801add6: 2b00 cmp r3, #0
  66271. 801add8: d114 bne.n 801ae04 <tcp_close_shutdown_fin+0x88>
  66272. MIB2_STATS_INC(mib2.tcpestabresets);
  66273. pcb->state = FIN_WAIT_1;
  66274. 801adda: 687b ldr r3, [r7, #4]
  66275. 801addc: 2205 movs r2, #5
  66276. 801adde: 751a strb r2, [r3, #20]
  66277. }
  66278. break;
  66279. 801ade0: e010 b.n 801ae04 <tcp_close_shutdown_fin+0x88>
  66280. case CLOSE_WAIT:
  66281. err = tcp_send_fin(pcb);
  66282. 801ade2: 6878 ldr r0, [r7, #4]
  66283. 801ade4: f004 fe28 bl 801fa38 <tcp_send_fin>
  66284. 801ade8: 4603 mov r3, r0
  66285. 801adea: 73fb strb r3, [r7, #15]
  66286. if (err == ERR_OK) {
  66287. 801adec: f997 300f ldrsb.w r3, [r7, #15]
  66288. 801adf0: 2b00 cmp r3, #0
  66289. 801adf2: d109 bne.n 801ae08 <tcp_close_shutdown_fin+0x8c>
  66290. MIB2_STATS_INC(mib2.tcpestabresets);
  66291. pcb->state = LAST_ACK;
  66292. 801adf4: 687b ldr r3, [r7, #4]
  66293. 801adf6: 2209 movs r2, #9
  66294. 801adf8: 751a strb r2, [r3, #20]
  66295. }
  66296. break;
  66297. 801adfa: e005 b.n 801ae08 <tcp_close_shutdown_fin+0x8c>
  66298. default:
  66299. /* Has already been closed, do nothing. */
  66300. return ERR_OK;
  66301. 801adfc: 2300 movs r3, #0
  66302. 801adfe: e01c b.n 801ae3a <tcp_close_shutdown_fin+0xbe>
  66303. break;
  66304. 801ae00: bf00 nop
  66305. 801ae02: e002 b.n 801ae0a <tcp_close_shutdown_fin+0x8e>
  66306. break;
  66307. 801ae04: bf00 nop
  66308. 801ae06: e000 b.n 801ae0a <tcp_close_shutdown_fin+0x8e>
  66309. break;
  66310. 801ae08: bf00 nop
  66311. }
  66312. if (err == ERR_OK) {
  66313. 801ae0a: f997 300f ldrsb.w r3, [r7, #15]
  66314. 801ae0e: 2b00 cmp r3, #0
  66315. 801ae10: d103 bne.n 801ae1a <tcp_close_shutdown_fin+0x9e>
  66316. /* To ensure all data has been sent when tcp_close returns, we have
  66317. to make sure tcp_output doesn't fail.
  66318. Since we don't really have to ensure all data has been sent when tcp_close
  66319. returns (unsent data is sent from tcp timer functions, also), we don't care
  66320. for the return value of tcp_output for now. */
  66321. tcp_output(pcb);
  66322. 801ae12: 6878 ldr r0, [r7, #4]
  66323. 801ae14: f004 ff4e bl 801fcb4 <tcp_output>
  66324. 801ae18: e00d b.n 801ae36 <tcp_close_shutdown_fin+0xba>
  66325. } else if (err == ERR_MEM) {
  66326. 801ae1a: f997 300f ldrsb.w r3, [r7, #15]
  66327. 801ae1e: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  66328. 801ae22: d108 bne.n 801ae36 <tcp_close_shutdown_fin+0xba>
  66329. /* Mark this pcb for closing. Closing is retried from tcp_tmr. */
  66330. tcp_set_flags(pcb, TF_CLOSEPEND);
  66331. 801ae24: 687b ldr r3, [r7, #4]
  66332. 801ae26: 8b5b ldrh r3, [r3, #26]
  66333. 801ae28: f043 0308 orr.w r3, r3, #8
  66334. 801ae2c: b29a uxth r2, r3
  66335. 801ae2e: 687b ldr r3, [r7, #4]
  66336. 801ae30: 835a strh r2, [r3, #26]
  66337. /* We have to return ERR_OK from here to indicate to the callers that this
  66338. pcb should not be used any more as it will be freed soon via tcp_tmr.
  66339. This is OK here since sending FIN does not guarantee a time frime for
  66340. actually freeing the pcb, either (it is left in closure states for
  66341. remote ACK or timeout) */
  66342. return ERR_OK;
  66343. 801ae32: 2300 movs r3, #0
  66344. 801ae34: e001 b.n 801ae3a <tcp_close_shutdown_fin+0xbe>
  66345. }
  66346. return err;
  66347. 801ae36: f997 300f ldrsb.w r3, [r7, #15]
  66348. }
  66349. 801ae3a: 4618 mov r0, r3
  66350. 801ae3c: 3710 adds r7, #16
  66351. 801ae3e: 46bd mov sp, r7
  66352. 801ae40: bd80 pop {r7, pc}
  66353. 801ae42: bf00 nop
  66354. 801ae44: 0802e5a8 .word 0x0802e5a8
  66355. 801ae48: 0802e658 .word 0x0802e658
  66356. 801ae4c: 0802e5ec .word 0x0802e5ec
  66357. 0801ae50 <tcp_close>:
  66358. * @return ERR_OK if connection has been closed
  66359. * another err_t if closing failed and pcb is not freed
  66360. */
  66361. err_t
  66362. tcp_close(struct tcp_pcb *pcb)
  66363. {
  66364. 801ae50: b580 push {r7, lr}
  66365. 801ae52: b082 sub sp, #8
  66366. 801ae54: af00 add r7, sp, #0
  66367. 801ae56: 6078 str r0, [r7, #4]
  66368. LWIP_ASSERT_CORE_LOCKED();
  66369. 801ae58: f7f5 fb6a bl 8010530 <sys_check_core_locking>
  66370. LWIP_ERROR("tcp_close: invalid pcb", pcb != NULL, return ERR_ARG);
  66371. 801ae5c: 687b ldr r3, [r7, #4]
  66372. 801ae5e: 2b00 cmp r3, #0
  66373. 801ae60: d109 bne.n 801ae76 <tcp_close+0x26>
  66374. 801ae62: 4b0f ldr r3, [pc, #60] @ (801aea0 <tcp_close+0x50>)
  66375. 801ae64: f44f 72f4 mov.w r2, #488 @ 0x1e8
  66376. 801ae68: 490e ldr r1, [pc, #56] @ (801aea4 <tcp_close+0x54>)
  66377. 801ae6a: 480f ldr r0, [pc, #60] @ (801aea8 <tcp_close+0x58>)
  66378. 801ae6c: f00e fdae bl 80299cc <iprintf>
  66379. 801ae70: f06f 030f mvn.w r3, #15
  66380. 801ae74: e00f b.n 801ae96 <tcp_close+0x46>
  66381. LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in "));
  66382. tcp_debug_print_state(pcb->state);
  66383. if (pcb->state != LISTEN) {
  66384. 801ae76: 687b ldr r3, [r7, #4]
  66385. 801ae78: 7d1b ldrb r3, [r3, #20]
  66386. 801ae7a: 2b01 cmp r3, #1
  66387. 801ae7c: d006 beq.n 801ae8c <tcp_close+0x3c>
  66388. /* Set a flag not to receive any more data... */
  66389. tcp_set_flags(pcb, TF_RXCLOSED);
  66390. 801ae7e: 687b ldr r3, [r7, #4]
  66391. 801ae80: 8b5b ldrh r3, [r3, #26]
  66392. 801ae82: f043 0310 orr.w r3, r3, #16
  66393. 801ae86: b29a uxth r2, r3
  66394. 801ae88: 687b ldr r3, [r7, #4]
  66395. 801ae8a: 835a strh r2, [r3, #26]
  66396. }
  66397. /* ... and close */
  66398. return tcp_close_shutdown(pcb, 1);
  66399. 801ae8c: 2101 movs r1, #1
  66400. 801ae8e: 6878 ldr r0, [r7, #4]
  66401. 801ae90: f7ff fe92 bl 801abb8 <tcp_close_shutdown>
  66402. 801ae94: 4603 mov r3, r0
  66403. }
  66404. 801ae96: 4618 mov r0, r3
  66405. 801ae98: 3708 adds r7, #8
  66406. 801ae9a: 46bd mov sp, r7
  66407. 801ae9c: bd80 pop {r7, pc}
  66408. 801ae9e: bf00 nop
  66409. 801aea0: 0802e5a8 .word 0x0802e5a8
  66410. 801aea4: 0802e6b8 .word 0x0802e6b8
  66411. 801aea8: 0802e5ec .word 0x0802e5ec
  66412. 0801aeac <tcp_shutdown>:
  66413. * @return ERR_OK if shutdown succeeded (or the PCB has already been shut down)
  66414. * another err_t on error.
  66415. */
  66416. err_t
  66417. tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx)
  66418. {
  66419. 801aeac: b580 push {r7, lr}
  66420. 801aeae: b084 sub sp, #16
  66421. 801aeb0: af00 add r7, sp, #0
  66422. 801aeb2: 60f8 str r0, [r7, #12]
  66423. 801aeb4: 60b9 str r1, [r7, #8]
  66424. 801aeb6: 607a str r2, [r7, #4]
  66425. LWIP_ASSERT_CORE_LOCKED();
  66426. 801aeb8: f7f5 fb3a bl 8010530 <sys_check_core_locking>
  66427. LWIP_ERROR("tcp_shutdown: invalid pcb", pcb != NULL, return ERR_ARG);
  66428. 801aebc: 68fb ldr r3, [r7, #12]
  66429. 801aebe: 2b00 cmp r3, #0
  66430. 801aec0: d109 bne.n 801aed6 <tcp_shutdown+0x2a>
  66431. 801aec2: 4b26 ldr r3, [pc, #152] @ (801af5c <tcp_shutdown+0xb0>)
  66432. 801aec4: f240 2207 movw r2, #519 @ 0x207
  66433. 801aec8: 4925 ldr r1, [pc, #148] @ (801af60 <tcp_shutdown+0xb4>)
  66434. 801aeca: 4826 ldr r0, [pc, #152] @ (801af64 <tcp_shutdown+0xb8>)
  66435. 801aecc: f00e fd7e bl 80299cc <iprintf>
  66436. 801aed0: f06f 030f mvn.w r3, #15
  66437. 801aed4: e03d b.n 801af52 <tcp_shutdown+0xa6>
  66438. if (pcb->state == LISTEN) {
  66439. 801aed6: 68fb ldr r3, [r7, #12]
  66440. 801aed8: 7d1b ldrb r3, [r3, #20]
  66441. 801aeda: 2b01 cmp r3, #1
  66442. 801aedc: d102 bne.n 801aee4 <tcp_shutdown+0x38>
  66443. return ERR_CONN;
  66444. 801aede: f06f 030a mvn.w r3, #10
  66445. 801aee2: e036 b.n 801af52 <tcp_shutdown+0xa6>
  66446. }
  66447. if (shut_rx) {
  66448. 801aee4: 68bb ldr r3, [r7, #8]
  66449. 801aee6: 2b00 cmp r3, #0
  66450. 801aee8: d01b beq.n 801af22 <tcp_shutdown+0x76>
  66451. /* shut down the receive side: set a flag not to receive any more data... */
  66452. tcp_set_flags(pcb, TF_RXCLOSED);
  66453. 801aeea: 68fb ldr r3, [r7, #12]
  66454. 801aeec: 8b5b ldrh r3, [r3, #26]
  66455. 801aeee: f043 0310 orr.w r3, r3, #16
  66456. 801aef2: b29a uxth r2, r3
  66457. 801aef4: 68fb ldr r3, [r7, #12]
  66458. 801aef6: 835a strh r2, [r3, #26]
  66459. if (shut_tx) {
  66460. 801aef8: 687b ldr r3, [r7, #4]
  66461. 801aefa: 2b00 cmp r3, #0
  66462. 801aefc: d005 beq.n 801af0a <tcp_shutdown+0x5e>
  66463. /* shutting down the tx AND rx side is the same as closing for the raw API */
  66464. return tcp_close_shutdown(pcb, 1);
  66465. 801aefe: 2101 movs r1, #1
  66466. 801af00: 68f8 ldr r0, [r7, #12]
  66467. 801af02: f7ff fe59 bl 801abb8 <tcp_close_shutdown>
  66468. 801af06: 4603 mov r3, r0
  66469. 801af08: e023 b.n 801af52 <tcp_shutdown+0xa6>
  66470. }
  66471. /* ... and free buffered data */
  66472. if (pcb->refused_data != NULL) {
  66473. 801af0a: 68fb ldr r3, [r7, #12]
  66474. 801af0c: 6f9b ldr r3, [r3, #120] @ 0x78
  66475. 801af0e: 2b00 cmp r3, #0
  66476. 801af10: d007 beq.n 801af22 <tcp_shutdown+0x76>
  66477. pbuf_free(pcb->refused_data);
  66478. 801af12: 68fb ldr r3, [r7, #12]
  66479. 801af14: 6f9b ldr r3, [r3, #120] @ 0x78
  66480. 801af16: 4618 mov r0, r3
  66481. 801af18: f7ff fae0 bl 801a4dc <pbuf_free>
  66482. pcb->refused_data = NULL;
  66483. 801af1c: 68fb ldr r3, [r7, #12]
  66484. 801af1e: 2200 movs r2, #0
  66485. 801af20: 679a str r2, [r3, #120] @ 0x78
  66486. }
  66487. }
  66488. if (shut_tx) {
  66489. 801af22: 687b ldr r3, [r7, #4]
  66490. 801af24: 2b00 cmp r3, #0
  66491. 801af26: d013 beq.n 801af50 <tcp_shutdown+0xa4>
  66492. /* This can't happen twice since if it succeeds, the pcb's state is changed.
  66493. Only close in these states as the others directly deallocate the PCB */
  66494. switch (pcb->state) {
  66495. 801af28: 68fb ldr r3, [r7, #12]
  66496. 801af2a: 7d1b ldrb r3, [r3, #20]
  66497. 801af2c: 2b04 cmp r3, #4
  66498. 801af2e: dc02 bgt.n 801af36 <tcp_shutdown+0x8a>
  66499. 801af30: 2b03 cmp r3, #3
  66500. 801af32: da02 bge.n 801af3a <tcp_shutdown+0x8e>
  66501. 801af34: e009 b.n 801af4a <tcp_shutdown+0x9e>
  66502. 801af36: 2b07 cmp r3, #7
  66503. 801af38: d107 bne.n 801af4a <tcp_shutdown+0x9e>
  66504. case SYN_RCVD:
  66505. case ESTABLISHED:
  66506. case CLOSE_WAIT:
  66507. return tcp_close_shutdown(pcb, (u8_t)shut_rx);
  66508. 801af3a: 68bb ldr r3, [r7, #8]
  66509. 801af3c: b2db uxtb r3, r3
  66510. 801af3e: 4619 mov r1, r3
  66511. 801af40: 68f8 ldr r0, [r7, #12]
  66512. 801af42: f7ff fe39 bl 801abb8 <tcp_close_shutdown>
  66513. 801af46: 4603 mov r3, r0
  66514. 801af48: e003 b.n 801af52 <tcp_shutdown+0xa6>
  66515. default:
  66516. /* Not (yet?) connected, cannot shutdown the TX side as that would bring us
  66517. into CLOSED state, where the PCB is deallocated. */
  66518. return ERR_CONN;
  66519. 801af4a: f06f 030a mvn.w r3, #10
  66520. 801af4e: e000 b.n 801af52 <tcp_shutdown+0xa6>
  66521. }
  66522. }
  66523. return ERR_OK;
  66524. 801af50: 2300 movs r3, #0
  66525. }
  66526. 801af52: 4618 mov r0, r3
  66527. 801af54: 3710 adds r7, #16
  66528. 801af56: 46bd mov sp, r7
  66529. 801af58: bd80 pop {r7, pc}
  66530. 801af5a: bf00 nop
  66531. 801af5c: 0802e5a8 .word 0x0802e5a8
  66532. 801af60: 0802e6d0 .word 0x0802e6d0
  66533. 801af64: 0802e5ec .word 0x0802e5ec
  66534. 0801af68 <tcp_abandon>:
  66535. * @param pcb the tcp_pcb to abort
  66536. * @param reset boolean to indicate whether a reset should be sent
  66537. */
  66538. void
  66539. tcp_abandon(struct tcp_pcb *pcb, int reset)
  66540. {
  66541. 801af68: b580 push {r7, lr}
  66542. 801af6a: b08e sub sp, #56 @ 0x38
  66543. 801af6c: af04 add r7, sp, #16
  66544. 801af6e: 6078 str r0, [r7, #4]
  66545. 801af70: 6039 str r1, [r7, #0]
  66546. #if LWIP_CALLBACK_API
  66547. tcp_err_fn errf;
  66548. #endif /* LWIP_CALLBACK_API */
  66549. void *errf_arg;
  66550. LWIP_ASSERT_CORE_LOCKED();
  66551. 801af72: f7f5 fadd bl 8010530 <sys_check_core_locking>
  66552. LWIP_ERROR("tcp_abandon: invalid pcb", pcb != NULL, return);
  66553. 801af76: 687b ldr r3, [r7, #4]
  66554. 801af78: 2b00 cmp r3, #0
  66555. 801af7a: d107 bne.n 801af8c <tcp_abandon+0x24>
  66556. 801af7c: 4b52 ldr r3, [pc, #328] @ (801b0c8 <tcp_abandon+0x160>)
  66557. 801af7e: f240 223d movw r2, #573 @ 0x23d
  66558. 801af82: 4952 ldr r1, [pc, #328] @ (801b0cc <tcp_abandon+0x164>)
  66559. 801af84: 4852 ldr r0, [pc, #328] @ (801b0d0 <tcp_abandon+0x168>)
  66560. 801af86: f00e fd21 bl 80299cc <iprintf>
  66561. 801af8a: e099 b.n 801b0c0 <tcp_abandon+0x158>
  66562. /* pcb->state LISTEN not allowed here */
  66563. LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
  66564. 801af8c: 687b ldr r3, [r7, #4]
  66565. 801af8e: 7d1b ldrb r3, [r3, #20]
  66566. 801af90: 2b01 cmp r3, #1
  66567. 801af92: d106 bne.n 801afa2 <tcp_abandon+0x3a>
  66568. 801af94: 4b4c ldr r3, [pc, #304] @ (801b0c8 <tcp_abandon+0x160>)
  66569. 801af96: f44f 7210 mov.w r2, #576 @ 0x240
  66570. 801af9a: 494e ldr r1, [pc, #312] @ (801b0d4 <tcp_abandon+0x16c>)
  66571. 801af9c: 484c ldr r0, [pc, #304] @ (801b0d0 <tcp_abandon+0x168>)
  66572. 801af9e: f00e fd15 bl 80299cc <iprintf>
  66573. pcb->state != LISTEN);
  66574. /* Figure out on which TCP PCB list we are, and remove us. If we
  66575. are in an active state, call the receive function associated with
  66576. the PCB with a NULL argument, and send an RST to the remote end. */
  66577. if (pcb->state == TIME_WAIT) {
  66578. 801afa2: 687b ldr r3, [r7, #4]
  66579. 801afa4: 7d1b ldrb r3, [r3, #20]
  66580. 801afa6: 2b0a cmp r3, #10
  66581. 801afa8: d107 bne.n 801afba <tcp_abandon+0x52>
  66582. tcp_pcb_remove(&tcp_tw_pcbs, pcb);
  66583. 801afaa: 6879 ldr r1, [r7, #4]
  66584. 801afac: 484a ldr r0, [pc, #296] @ (801b0d8 <tcp_abandon+0x170>)
  66585. 801afae: f001 fa03 bl 801c3b8 <tcp_pcb_remove>
  66586. tcp_free(pcb);
  66587. 801afb2: 6878 ldr r0, [r7, #4]
  66588. 801afb4: f7ff fd4e bl 801aa54 <tcp_free>
  66589. 801afb8: e082 b.n 801b0c0 <tcp_abandon+0x158>
  66590. } else {
  66591. int send_rst = 0;
  66592. 801afba: 2300 movs r3, #0
  66593. 801afbc: 627b str r3, [r7, #36] @ 0x24
  66594. u16_t local_port = 0;
  66595. 801afbe: 2300 movs r3, #0
  66596. 801afc0: 847b strh r3, [r7, #34] @ 0x22
  66597. enum tcp_state last_state;
  66598. seqno = pcb->snd_nxt;
  66599. 801afc2: 687b ldr r3, [r7, #4]
  66600. 801afc4: 6d1b ldr r3, [r3, #80] @ 0x50
  66601. 801afc6: 61bb str r3, [r7, #24]
  66602. ackno = pcb->rcv_nxt;
  66603. 801afc8: 687b ldr r3, [r7, #4]
  66604. 801afca: 6a5b ldr r3, [r3, #36] @ 0x24
  66605. 801afcc: 617b str r3, [r7, #20]
  66606. #if LWIP_CALLBACK_API
  66607. errf = pcb->errf;
  66608. 801afce: 687b ldr r3, [r7, #4]
  66609. 801afd0: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  66610. 801afd4: 613b str r3, [r7, #16]
  66611. #endif /* LWIP_CALLBACK_API */
  66612. errf_arg = pcb->callback_arg;
  66613. 801afd6: 687b ldr r3, [r7, #4]
  66614. 801afd8: 691b ldr r3, [r3, #16]
  66615. 801afda: 60fb str r3, [r7, #12]
  66616. if (pcb->state == CLOSED) {
  66617. 801afdc: 687b ldr r3, [r7, #4]
  66618. 801afde: 7d1b ldrb r3, [r3, #20]
  66619. 801afe0: 2b00 cmp r3, #0
  66620. 801afe2: d126 bne.n 801b032 <tcp_abandon+0xca>
  66621. if (pcb->local_port != 0) {
  66622. 801afe4: 687b ldr r3, [r7, #4]
  66623. 801afe6: 8adb ldrh r3, [r3, #22]
  66624. 801afe8: 2b00 cmp r3, #0
  66625. 801afea: d02e beq.n 801b04a <tcp_abandon+0xe2>
  66626. /* bound, not yet opened */
  66627. TCP_RMV(&tcp_bound_pcbs, pcb);
  66628. 801afec: 4b3b ldr r3, [pc, #236] @ (801b0dc <tcp_abandon+0x174>)
  66629. 801afee: 681b ldr r3, [r3, #0]
  66630. 801aff0: 687a ldr r2, [r7, #4]
  66631. 801aff2: 429a cmp r2, r3
  66632. 801aff4: d105 bne.n 801b002 <tcp_abandon+0x9a>
  66633. 801aff6: 4b39 ldr r3, [pc, #228] @ (801b0dc <tcp_abandon+0x174>)
  66634. 801aff8: 681b ldr r3, [r3, #0]
  66635. 801affa: 68db ldr r3, [r3, #12]
  66636. 801affc: 4a37 ldr r2, [pc, #220] @ (801b0dc <tcp_abandon+0x174>)
  66637. 801affe: 6013 str r3, [r2, #0]
  66638. 801b000: e013 b.n 801b02a <tcp_abandon+0xc2>
  66639. 801b002: 4b36 ldr r3, [pc, #216] @ (801b0dc <tcp_abandon+0x174>)
  66640. 801b004: 681b ldr r3, [r3, #0]
  66641. 801b006: 61fb str r3, [r7, #28]
  66642. 801b008: e00c b.n 801b024 <tcp_abandon+0xbc>
  66643. 801b00a: 69fb ldr r3, [r7, #28]
  66644. 801b00c: 68db ldr r3, [r3, #12]
  66645. 801b00e: 687a ldr r2, [r7, #4]
  66646. 801b010: 429a cmp r2, r3
  66647. 801b012: d104 bne.n 801b01e <tcp_abandon+0xb6>
  66648. 801b014: 687b ldr r3, [r7, #4]
  66649. 801b016: 68da ldr r2, [r3, #12]
  66650. 801b018: 69fb ldr r3, [r7, #28]
  66651. 801b01a: 60da str r2, [r3, #12]
  66652. 801b01c: e005 b.n 801b02a <tcp_abandon+0xc2>
  66653. 801b01e: 69fb ldr r3, [r7, #28]
  66654. 801b020: 68db ldr r3, [r3, #12]
  66655. 801b022: 61fb str r3, [r7, #28]
  66656. 801b024: 69fb ldr r3, [r7, #28]
  66657. 801b026: 2b00 cmp r3, #0
  66658. 801b028: d1ef bne.n 801b00a <tcp_abandon+0xa2>
  66659. 801b02a: 687b ldr r3, [r7, #4]
  66660. 801b02c: 2200 movs r2, #0
  66661. 801b02e: 60da str r2, [r3, #12]
  66662. 801b030: e00b b.n 801b04a <tcp_abandon+0xe2>
  66663. }
  66664. } else {
  66665. send_rst = reset;
  66666. 801b032: 683b ldr r3, [r7, #0]
  66667. 801b034: 627b str r3, [r7, #36] @ 0x24
  66668. local_port = pcb->local_port;
  66669. 801b036: 687b ldr r3, [r7, #4]
  66670. 801b038: 8adb ldrh r3, [r3, #22]
  66671. 801b03a: 847b strh r3, [r7, #34] @ 0x22
  66672. TCP_PCB_REMOVE_ACTIVE(pcb);
  66673. 801b03c: 6879 ldr r1, [r7, #4]
  66674. 801b03e: 4828 ldr r0, [pc, #160] @ (801b0e0 <tcp_abandon+0x178>)
  66675. 801b040: f001 f9ba bl 801c3b8 <tcp_pcb_remove>
  66676. 801b044: 4b27 ldr r3, [pc, #156] @ (801b0e4 <tcp_abandon+0x17c>)
  66677. 801b046: 2201 movs r2, #1
  66678. 801b048: 701a strb r2, [r3, #0]
  66679. }
  66680. if (pcb->unacked != NULL) {
  66681. 801b04a: 687b ldr r3, [r7, #4]
  66682. 801b04c: 6f1b ldr r3, [r3, #112] @ 0x70
  66683. 801b04e: 2b00 cmp r3, #0
  66684. 801b050: d004 beq.n 801b05c <tcp_abandon+0xf4>
  66685. tcp_segs_free(pcb->unacked);
  66686. 801b052: 687b ldr r3, [r7, #4]
  66687. 801b054: 6f1b ldr r3, [r3, #112] @ 0x70
  66688. 801b056: 4618 mov r0, r3
  66689. 801b058: f000 fe84 bl 801bd64 <tcp_segs_free>
  66690. }
  66691. if (pcb->unsent != NULL) {
  66692. 801b05c: 687b ldr r3, [r7, #4]
  66693. 801b05e: 6edb ldr r3, [r3, #108] @ 0x6c
  66694. 801b060: 2b00 cmp r3, #0
  66695. 801b062: d004 beq.n 801b06e <tcp_abandon+0x106>
  66696. tcp_segs_free(pcb->unsent);
  66697. 801b064: 687b ldr r3, [r7, #4]
  66698. 801b066: 6edb ldr r3, [r3, #108] @ 0x6c
  66699. 801b068: 4618 mov r0, r3
  66700. 801b06a: f000 fe7b bl 801bd64 <tcp_segs_free>
  66701. }
  66702. #if TCP_QUEUE_OOSEQ
  66703. if (pcb->ooseq != NULL) {
  66704. 801b06e: 687b ldr r3, [r7, #4]
  66705. 801b070: 6f5b ldr r3, [r3, #116] @ 0x74
  66706. 801b072: 2b00 cmp r3, #0
  66707. 801b074: d004 beq.n 801b080 <tcp_abandon+0x118>
  66708. tcp_segs_free(pcb->ooseq);
  66709. 801b076: 687b ldr r3, [r7, #4]
  66710. 801b078: 6f5b ldr r3, [r3, #116] @ 0x74
  66711. 801b07a: 4618 mov r0, r3
  66712. 801b07c: f000 fe72 bl 801bd64 <tcp_segs_free>
  66713. }
  66714. #endif /* TCP_QUEUE_OOSEQ */
  66715. tcp_backlog_accepted(pcb);
  66716. if (send_rst) {
  66717. 801b080: 6a7b ldr r3, [r7, #36] @ 0x24
  66718. 801b082: 2b00 cmp r3, #0
  66719. 801b084: d00e beq.n 801b0a4 <tcp_abandon+0x13c>
  66720. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n"));
  66721. tcp_rst(pcb, seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port);
  66722. 801b086: 6879 ldr r1, [r7, #4]
  66723. 801b088: 687b ldr r3, [r7, #4]
  66724. 801b08a: 3304 adds r3, #4
  66725. 801b08c: 687a ldr r2, [r7, #4]
  66726. 801b08e: 8b12 ldrh r2, [r2, #24]
  66727. 801b090: 9202 str r2, [sp, #8]
  66728. 801b092: 8c7a ldrh r2, [r7, #34] @ 0x22
  66729. 801b094: 9201 str r2, [sp, #4]
  66730. 801b096: 9300 str r3, [sp, #0]
  66731. 801b098: 460b mov r3, r1
  66732. 801b09a: 697a ldr r2, [r7, #20]
  66733. 801b09c: 69b9 ldr r1, [r7, #24]
  66734. 801b09e: 6878 ldr r0, [r7, #4]
  66735. 801b0a0: f005 fbca bl 8020838 <tcp_rst>
  66736. }
  66737. last_state = pcb->state;
  66738. 801b0a4: 687b ldr r3, [r7, #4]
  66739. 801b0a6: 7d1b ldrb r3, [r3, #20]
  66740. 801b0a8: 72fb strb r3, [r7, #11]
  66741. tcp_free(pcb);
  66742. 801b0aa: 6878 ldr r0, [r7, #4]
  66743. 801b0ac: f7ff fcd2 bl 801aa54 <tcp_free>
  66744. TCP_EVENT_ERR(last_state, errf, errf_arg, ERR_ABRT);
  66745. 801b0b0: 693b ldr r3, [r7, #16]
  66746. 801b0b2: 2b00 cmp r3, #0
  66747. 801b0b4: d004 beq.n 801b0c0 <tcp_abandon+0x158>
  66748. 801b0b6: 693b ldr r3, [r7, #16]
  66749. 801b0b8: f06f 010c mvn.w r1, #12
  66750. 801b0bc: 68f8 ldr r0, [r7, #12]
  66751. 801b0be: 4798 blx r3
  66752. }
  66753. }
  66754. 801b0c0: 3728 adds r7, #40 @ 0x28
  66755. 801b0c2: 46bd mov sp, r7
  66756. 801b0c4: bd80 pop {r7, pc}
  66757. 801b0c6: bf00 nop
  66758. 801b0c8: 0802e5a8 .word 0x0802e5a8
  66759. 801b0cc: 0802e6ec .word 0x0802e6ec
  66760. 801b0d0: 0802e5ec .word 0x0802e5ec
  66761. 801b0d4: 0802e708 .word 0x0802e708
  66762. 801b0d8: 2402ae98 .word 0x2402ae98
  66763. 801b0dc: 2402ae8c .word 0x2402ae8c
  66764. 801b0e0: 2402ae94 .word 0x2402ae94
  66765. 801b0e4: 2402ae9c .word 0x2402ae9c
  66766. 0801b0e8 <tcp_abort>:
  66767. *
  66768. * @param pcb the tcp pcb to abort
  66769. */
  66770. void
  66771. tcp_abort(struct tcp_pcb *pcb)
  66772. {
  66773. 801b0e8: b580 push {r7, lr}
  66774. 801b0ea: b082 sub sp, #8
  66775. 801b0ec: af00 add r7, sp, #0
  66776. 801b0ee: 6078 str r0, [r7, #4]
  66777. tcp_abandon(pcb, 1);
  66778. 801b0f0: 2101 movs r1, #1
  66779. 801b0f2: 6878 ldr r0, [r7, #4]
  66780. 801b0f4: f7ff ff38 bl 801af68 <tcp_abandon>
  66781. }
  66782. 801b0f8: bf00 nop
  66783. 801b0fa: 3708 adds r7, #8
  66784. 801b0fc: 46bd mov sp, r7
  66785. 801b0fe: bd80 pop {r7, pc}
  66786. 0801b100 <tcp_update_rcv_ann_wnd>:
  66787. * Returns how much extra window would be advertised if we sent an
  66788. * update now.
  66789. */
  66790. u32_t
  66791. tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  66792. {
  66793. 801b100: b580 push {r7, lr}
  66794. 801b102: b084 sub sp, #16
  66795. 801b104: af00 add r7, sp, #0
  66796. 801b106: 6078 str r0, [r7, #4]
  66797. u32_t new_right_edge;
  66798. LWIP_ASSERT("tcp_update_rcv_ann_wnd: invalid pcb", pcb != NULL);
  66799. 801b108: 687b ldr r3, [r7, #4]
  66800. 801b10a: 2b00 cmp r3, #0
  66801. 801b10c: d106 bne.n 801b11c <tcp_update_rcv_ann_wnd+0x1c>
  66802. 801b10e: 4b25 ldr r3, [pc, #148] @ (801b1a4 <tcp_update_rcv_ann_wnd+0xa4>)
  66803. 801b110: f240 32a6 movw r2, #934 @ 0x3a6
  66804. 801b114: 4924 ldr r1, [pc, #144] @ (801b1a8 <tcp_update_rcv_ann_wnd+0xa8>)
  66805. 801b116: 4825 ldr r0, [pc, #148] @ (801b1ac <tcp_update_rcv_ann_wnd+0xac>)
  66806. 801b118: f00e fc58 bl 80299cc <iprintf>
  66807. new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  66808. 801b11c: 687b ldr r3, [r7, #4]
  66809. 801b11e: 6a5b ldr r3, [r3, #36] @ 0x24
  66810. 801b120: 687a ldr r2, [r7, #4]
  66811. 801b122: 8d12 ldrh r2, [r2, #40] @ 0x28
  66812. 801b124: 4413 add r3, r2
  66813. 801b126: 60fb str r3, [r7, #12]
  66814. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  66815. 801b128: 687b ldr r3, [r7, #4]
  66816. 801b12a: 6adb ldr r3, [r3, #44] @ 0x2c
  66817. 801b12c: 687a ldr r2, [r7, #4]
  66818. 801b12e: 8e52 ldrh r2, [r2, #50] @ 0x32
  66819. 801b130: f640 3168 movw r1, #2920 @ 0xb68
  66820. 801b134: 428a cmp r2, r1
  66821. 801b136: bf28 it cs
  66822. 801b138: 460a movcs r2, r1
  66823. 801b13a: b292 uxth r2, r2
  66824. 801b13c: 4413 add r3, r2
  66825. 801b13e: 68fa ldr r2, [r7, #12]
  66826. 801b140: 1ad3 subs r3, r2, r3
  66827. 801b142: 2b00 cmp r3, #0
  66828. 801b144: db08 blt.n 801b158 <tcp_update_rcv_ann_wnd+0x58>
  66829. /* we can advertise more window */
  66830. pcb->rcv_ann_wnd = pcb->rcv_wnd;
  66831. 801b146: 687b ldr r3, [r7, #4]
  66832. 801b148: 8d1a ldrh r2, [r3, #40] @ 0x28
  66833. 801b14a: 687b ldr r3, [r7, #4]
  66834. 801b14c: 855a strh r2, [r3, #42] @ 0x2a
  66835. return new_right_edge - pcb->rcv_ann_right_edge;
  66836. 801b14e: 687b ldr r3, [r7, #4]
  66837. 801b150: 6adb ldr r3, [r3, #44] @ 0x2c
  66838. 801b152: 68fa ldr r2, [r7, #12]
  66839. 801b154: 1ad3 subs r3, r2, r3
  66840. 801b156: e020 b.n 801b19a <tcp_update_rcv_ann_wnd+0x9a>
  66841. } else {
  66842. if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
  66843. 801b158: 687b ldr r3, [r7, #4]
  66844. 801b15a: 6a5a ldr r2, [r3, #36] @ 0x24
  66845. 801b15c: 687b ldr r3, [r7, #4]
  66846. 801b15e: 6adb ldr r3, [r3, #44] @ 0x2c
  66847. 801b160: 1ad3 subs r3, r2, r3
  66848. 801b162: 2b00 cmp r3, #0
  66849. 801b164: dd03 ble.n 801b16e <tcp_update_rcv_ann_wnd+0x6e>
  66850. /* Can happen due to other end sending out of advertised window,
  66851. * but within actual available (but not yet advertised) window */
  66852. pcb->rcv_ann_wnd = 0;
  66853. 801b166: 687b ldr r3, [r7, #4]
  66854. 801b168: 2200 movs r2, #0
  66855. 801b16a: 855a strh r2, [r3, #42] @ 0x2a
  66856. 801b16c: e014 b.n 801b198 <tcp_update_rcv_ann_wnd+0x98>
  66857. } else {
  66858. /* keep the right edge of window constant */
  66859. u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
  66860. 801b16e: 687b ldr r3, [r7, #4]
  66861. 801b170: 6ada ldr r2, [r3, #44] @ 0x2c
  66862. 801b172: 687b ldr r3, [r7, #4]
  66863. 801b174: 6a5b ldr r3, [r3, #36] @ 0x24
  66864. 801b176: 1ad3 subs r3, r2, r3
  66865. 801b178: 60bb str r3, [r7, #8]
  66866. #if !LWIP_WND_SCALE
  66867. LWIP_ASSERT("new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff);
  66868. 801b17a: 68bb ldr r3, [r7, #8]
  66869. 801b17c: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  66870. 801b180: d306 bcc.n 801b190 <tcp_update_rcv_ann_wnd+0x90>
  66871. 801b182: 4b08 ldr r3, [pc, #32] @ (801b1a4 <tcp_update_rcv_ann_wnd+0xa4>)
  66872. 801b184: f240 32b6 movw r2, #950 @ 0x3b6
  66873. 801b188: 4909 ldr r1, [pc, #36] @ (801b1b0 <tcp_update_rcv_ann_wnd+0xb0>)
  66874. 801b18a: 4808 ldr r0, [pc, #32] @ (801b1ac <tcp_update_rcv_ann_wnd+0xac>)
  66875. 801b18c: f00e fc1e bl 80299cc <iprintf>
  66876. #endif
  66877. pcb->rcv_ann_wnd = (tcpwnd_size_t)new_rcv_ann_wnd;
  66878. 801b190: 68bb ldr r3, [r7, #8]
  66879. 801b192: b29a uxth r2, r3
  66880. 801b194: 687b ldr r3, [r7, #4]
  66881. 801b196: 855a strh r2, [r3, #42] @ 0x2a
  66882. }
  66883. return 0;
  66884. 801b198: 2300 movs r3, #0
  66885. }
  66886. }
  66887. 801b19a: 4618 mov r0, r3
  66888. 801b19c: 3710 adds r7, #16
  66889. 801b19e: 46bd mov sp, r7
  66890. 801b1a0: bd80 pop {r7, pc}
  66891. 801b1a2: bf00 nop
  66892. 801b1a4: 0802e5a8 .word 0x0802e5a8
  66893. 801b1a8: 0802e804 .word 0x0802e804
  66894. 801b1ac: 0802e5ec .word 0x0802e5ec
  66895. 801b1b0: 0802e828 .word 0x0802e828
  66896. 0801b1b4 <tcp_recved>:
  66897. * @param pcb the tcp_pcb for which data is read
  66898. * @param len the amount of bytes that have been read by the application
  66899. */
  66900. void
  66901. tcp_recved(struct tcp_pcb *pcb, u16_t len)
  66902. {
  66903. 801b1b4: b580 push {r7, lr}
  66904. 801b1b6: b084 sub sp, #16
  66905. 801b1b8: af00 add r7, sp, #0
  66906. 801b1ba: 6078 str r0, [r7, #4]
  66907. 801b1bc: 460b mov r3, r1
  66908. 801b1be: 807b strh r3, [r7, #2]
  66909. u32_t wnd_inflation;
  66910. tcpwnd_size_t rcv_wnd;
  66911. LWIP_ASSERT_CORE_LOCKED();
  66912. 801b1c0: f7f5 f9b6 bl 8010530 <sys_check_core_locking>
  66913. LWIP_ERROR("tcp_recved: invalid pcb", pcb != NULL, return);
  66914. 801b1c4: 687b ldr r3, [r7, #4]
  66915. 801b1c6: 2b00 cmp r3, #0
  66916. 801b1c8: d107 bne.n 801b1da <tcp_recved+0x26>
  66917. 801b1ca: 4b20 ldr r3, [pc, #128] @ (801b24c <tcp_recved+0x98>)
  66918. 801b1cc: f240 32cf movw r2, #975 @ 0x3cf
  66919. 801b1d0: 491f ldr r1, [pc, #124] @ (801b250 <tcp_recved+0x9c>)
  66920. 801b1d2: 4820 ldr r0, [pc, #128] @ (801b254 <tcp_recved+0xa0>)
  66921. 801b1d4: f00e fbfa bl 80299cc <iprintf>
  66922. 801b1d8: e034 b.n 801b244 <tcp_recved+0x90>
  66923. /* pcb->state LISTEN not allowed here */
  66924. LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
  66925. 801b1da: 687b ldr r3, [r7, #4]
  66926. 801b1dc: 7d1b ldrb r3, [r3, #20]
  66927. 801b1de: 2b01 cmp r3, #1
  66928. 801b1e0: d106 bne.n 801b1f0 <tcp_recved+0x3c>
  66929. 801b1e2: 4b1a ldr r3, [pc, #104] @ (801b24c <tcp_recved+0x98>)
  66930. 801b1e4: f240 32d2 movw r2, #978 @ 0x3d2
  66931. 801b1e8: 491b ldr r1, [pc, #108] @ (801b258 <tcp_recved+0xa4>)
  66932. 801b1ea: 481a ldr r0, [pc, #104] @ (801b254 <tcp_recved+0xa0>)
  66933. 801b1ec: f00e fbee bl 80299cc <iprintf>
  66934. pcb->state != LISTEN);
  66935. rcv_wnd = (tcpwnd_size_t)(pcb->rcv_wnd + len);
  66936. 801b1f0: 687b ldr r3, [r7, #4]
  66937. 801b1f2: 8d1a ldrh r2, [r3, #40] @ 0x28
  66938. 801b1f4: 887b ldrh r3, [r7, #2]
  66939. 801b1f6: 4413 add r3, r2
  66940. 801b1f8: 81fb strh r3, [r7, #14]
  66941. if ((rcv_wnd > TCP_WND_MAX(pcb)) || (rcv_wnd < pcb->rcv_wnd)) {
  66942. 801b1fa: 89fb ldrh r3, [r7, #14]
  66943. 801b1fc: f241 62d0 movw r2, #5840 @ 0x16d0
  66944. 801b200: 4293 cmp r3, r2
  66945. 801b202: d804 bhi.n 801b20e <tcp_recved+0x5a>
  66946. 801b204: 687b ldr r3, [r7, #4]
  66947. 801b206: 8d1b ldrh r3, [r3, #40] @ 0x28
  66948. 801b208: 89fa ldrh r2, [r7, #14]
  66949. 801b20a: 429a cmp r2, r3
  66950. 801b20c: d204 bcs.n 801b218 <tcp_recved+0x64>
  66951. /* window got too big or tcpwnd_size_t overflow */
  66952. LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: window got too big or tcpwnd_size_t overflow\n"));
  66953. pcb->rcv_wnd = TCP_WND_MAX(pcb);
  66954. 801b20e: 687b ldr r3, [r7, #4]
  66955. 801b210: f241 62d0 movw r2, #5840 @ 0x16d0
  66956. 801b214: 851a strh r2, [r3, #40] @ 0x28
  66957. 801b216: e002 b.n 801b21e <tcp_recved+0x6a>
  66958. } else {
  66959. pcb->rcv_wnd = rcv_wnd;
  66960. 801b218: 687b ldr r3, [r7, #4]
  66961. 801b21a: 89fa ldrh r2, [r7, #14]
  66962. 801b21c: 851a strh r2, [r3, #40] @ 0x28
  66963. }
  66964. wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
  66965. 801b21e: 6878 ldr r0, [r7, #4]
  66966. 801b220: f7ff ff6e bl 801b100 <tcp_update_rcv_ann_wnd>
  66967. 801b224: 60b8 str r0, [r7, #8]
  66968. /* If the change in the right edge of window is significant (default
  66969. * watermark is TCP_WND/4), then send an explicit update now.
  66970. * Otherwise wait for a packet to be sent in the normal course of
  66971. * events (or more window to be available later) */
  66972. if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
  66973. 801b226: 68bb ldr r3, [r7, #8]
  66974. 801b228: f240 52b3 movw r2, #1459 @ 0x5b3
  66975. 801b22c: 4293 cmp r3, r2
  66976. 801b22e: d909 bls.n 801b244 <tcp_recved+0x90>
  66977. tcp_ack_now(pcb);
  66978. 801b230: 687b ldr r3, [r7, #4]
  66979. 801b232: 8b5b ldrh r3, [r3, #26]
  66980. 801b234: f043 0302 orr.w r3, r3, #2
  66981. 801b238: b29a uxth r2, r3
  66982. 801b23a: 687b ldr r3, [r7, #4]
  66983. 801b23c: 835a strh r2, [r3, #26]
  66984. tcp_output(pcb);
  66985. 801b23e: 6878 ldr r0, [r7, #4]
  66986. 801b240: f004 fd38 bl 801fcb4 <tcp_output>
  66987. }
  66988. LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: received %"U16_F" bytes, wnd %"TCPWNDSIZE_F" (%"TCPWNDSIZE_F").\n",
  66989. len, pcb->rcv_wnd, (u16_t)(TCP_WND_MAX(pcb) - pcb->rcv_wnd)));
  66990. }
  66991. 801b244: 3710 adds r7, #16
  66992. 801b246: 46bd mov sp, r7
  66993. 801b248: bd80 pop {r7, pc}
  66994. 801b24a: bf00 nop
  66995. 801b24c: 0802e5a8 .word 0x0802e5a8
  66996. 801b250: 0802e844 .word 0x0802e844
  66997. 801b254: 0802e5ec .word 0x0802e5ec
  66998. 801b258: 0802e85c .word 0x0802e85c
  66999. 0801b25c <tcp_new_port>:
  67000. *
  67001. * @return a new (free) local TCP port number
  67002. */
  67003. static u16_t
  67004. tcp_new_port(void)
  67005. {
  67006. 801b25c: b480 push {r7}
  67007. 801b25e: b083 sub sp, #12
  67008. 801b260: af00 add r7, sp, #0
  67009. u8_t i;
  67010. u16_t n = 0;
  67011. 801b262: 2300 movs r3, #0
  67012. 801b264: 80bb strh r3, [r7, #4]
  67013. struct tcp_pcb *pcb;
  67014. again:
  67015. tcp_port++;
  67016. 801b266: 4b1e ldr r3, [pc, #120] @ (801b2e0 <tcp_new_port+0x84>)
  67017. 801b268: 881b ldrh r3, [r3, #0]
  67018. 801b26a: 3301 adds r3, #1
  67019. 801b26c: b29a uxth r2, r3
  67020. 801b26e: 4b1c ldr r3, [pc, #112] @ (801b2e0 <tcp_new_port+0x84>)
  67021. 801b270: 801a strh r2, [r3, #0]
  67022. if (tcp_port == TCP_LOCAL_PORT_RANGE_END) {
  67023. 801b272: 4b1b ldr r3, [pc, #108] @ (801b2e0 <tcp_new_port+0x84>)
  67024. 801b274: 881b ldrh r3, [r3, #0]
  67025. 801b276: f64f 72ff movw r2, #65535 @ 0xffff
  67026. 801b27a: 4293 cmp r3, r2
  67027. 801b27c: d103 bne.n 801b286 <tcp_new_port+0x2a>
  67028. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  67029. 801b27e: 4b18 ldr r3, [pc, #96] @ (801b2e0 <tcp_new_port+0x84>)
  67030. 801b280: f44f 4240 mov.w r2, #49152 @ 0xc000
  67031. 801b284: 801a strh r2, [r3, #0]
  67032. }
  67033. /* Check all PCB lists. */
  67034. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  67035. 801b286: 2300 movs r3, #0
  67036. 801b288: 71fb strb r3, [r7, #7]
  67037. 801b28a: e01e b.n 801b2ca <tcp_new_port+0x6e>
  67038. for (pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  67039. 801b28c: 79fb ldrb r3, [r7, #7]
  67040. 801b28e: 4a15 ldr r2, [pc, #84] @ (801b2e4 <tcp_new_port+0x88>)
  67041. 801b290: f852 3023 ldr.w r3, [r2, r3, lsl #2]
  67042. 801b294: 681b ldr r3, [r3, #0]
  67043. 801b296: 603b str r3, [r7, #0]
  67044. 801b298: e011 b.n 801b2be <tcp_new_port+0x62>
  67045. if (pcb->local_port == tcp_port) {
  67046. 801b29a: 683b ldr r3, [r7, #0]
  67047. 801b29c: 8ada ldrh r2, [r3, #22]
  67048. 801b29e: 4b10 ldr r3, [pc, #64] @ (801b2e0 <tcp_new_port+0x84>)
  67049. 801b2a0: 881b ldrh r3, [r3, #0]
  67050. 801b2a2: 429a cmp r2, r3
  67051. 801b2a4: d108 bne.n 801b2b8 <tcp_new_port+0x5c>
  67052. n++;
  67053. 801b2a6: 88bb ldrh r3, [r7, #4]
  67054. 801b2a8: 3301 adds r3, #1
  67055. 801b2aa: 80bb strh r3, [r7, #4]
  67056. if (n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {
  67057. 801b2ac: 88bb ldrh r3, [r7, #4]
  67058. 801b2ae: f5b3 4f80 cmp.w r3, #16384 @ 0x4000
  67059. 801b2b2: d3d8 bcc.n 801b266 <tcp_new_port+0xa>
  67060. return 0;
  67061. 801b2b4: 2300 movs r3, #0
  67062. 801b2b6: e00d b.n 801b2d4 <tcp_new_port+0x78>
  67063. for (pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  67064. 801b2b8: 683b ldr r3, [r7, #0]
  67065. 801b2ba: 68db ldr r3, [r3, #12]
  67066. 801b2bc: 603b str r3, [r7, #0]
  67067. 801b2be: 683b ldr r3, [r7, #0]
  67068. 801b2c0: 2b00 cmp r3, #0
  67069. 801b2c2: d1ea bne.n 801b29a <tcp_new_port+0x3e>
  67070. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  67071. 801b2c4: 79fb ldrb r3, [r7, #7]
  67072. 801b2c6: 3301 adds r3, #1
  67073. 801b2c8: 71fb strb r3, [r7, #7]
  67074. 801b2ca: 79fb ldrb r3, [r7, #7]
  67075. 801b2cc: 2b03 cmp r3, #3
  67076. 801b2ce: d9dd bls.n 801b28c <tcp_new_port+0x30>
  67077. }
  67078. goto again;
  67079. }
  67080. }
  67081. }
  67082. return tcp_port;
  67083. 801b2d0: 4b03 ldr r3, [pc, #12] @ (801b2e0 <tcp_new_port+0x84>)
  67084. 801b2d2: 881b ldrh r3, [r3, #0]
  67085. }
  67086. 801b2d4: 4618 mov r0, r3
  67087. 801b2d6: 370c adds r7, #12
  67088. 801b2d8: 46bd mov sp, r7
  67089. 801b2da: f85d 7b04 ldr.w r7, [sp], #4
  67090. 801b2de: 4770 bx lr
  67091. 801b2e0: 2400004c .word 0x2400004c
  67092. 801b2e4: 08030bd8 .word 0x08030bd8
  67093. 0801b2e8 <tcp_connect>:
  67094. * other err_t values if connect request couldn't be sent
  67095. */
  67096. err_t
  67097. tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port,
  67098. tcp_connected_fn connected)
  67099. {
  67100. 801b2e8: b580 push {r7, lr}
  67101. 801b2ea: b08a sub sp, #40 @ 0x28
  67102. 801b2ec: af00 add r7, sp, #0
  67103. 801b2ee: 60f8 str r0, [r7, #12]
  67104. 801b2f0: 60b9 str r1, [r7, #8]
  67105. 801b2f2: 603b str r3, [r7, #0]
  67106. 801b2f4: 4613 mov r3, r2
  67107. 801b2f6: 80fb strh r3, [r7, #6]
  67108. struct netif *netif = NULL;
  67109. 801b2f8: 2300 movs r3, #0
  67110. 801b2fa: 627b str r3, [r7, #36] @ 0x24
  67111. err_t ret;
  67112. u32_t iss;
  67113. u16_t old_local_port;
  67114. LWIP_ASSERT_CORE_LOCKED();
  67115. 801b2fc: f7f5 f918 bl 8010530 <sys_check_core_locking>
  67116. LWIP_ERROR("tcp_connect: invalid pcb", pcb != NULL, return ERR_ARG);
  67117. 801b300: 68fb ldr r3, [r7, #12]
  67118. 801b302: 2b00 cmp r3, #0
  67119. 801b304: d109 bne.n 801b31a <tcp_connect+0x32>
  67120. 801b306: 4b7d ldr r3, [pc, #500] @ (801b4fc <tcp_connect+0x214>)
  67121. 801b308: f240 4235 movw r2, #1077 @ 0x435
  67122. 801b30c: 497c ldr r1, [pc, #496] @ (801b500 <tcp_connect+0x218>)
  67123. 801b30e: 487d ldr r0, [pc, #500] @ (801b504 <tcp_connect+0x21c>)
  67124. 801b310: f00e fb5c bl 80299cc <iprintf>
  67125. 801b314: f06f 030f mvn.w r3, #15
  67126. 801b318: e0ec b.n 801b4f4 <tcp_connect+0x20c>
  67127. LWIP_ERROR("tcp_connect: invalid ipaddr", ipaddr != NULL, return ERR_ARG);
  67128. 801b31a: 68bb ldr r3, [r7, #8]
  67129. 801b31c: 2b00 cmp r3, #0
  67130. 801b31e: d109 bne.n 801b334 <tcp_connect+0x4c>
  67131. 801b320: 4b76 ldr r3, [pc, #472] @ (801b4fc <tcp_connect+0x214>)
  67132. 801b322: f240 4236 movw r2, #1078 @ 0x436
  67133. 801b326: 4978 ldr r1, [pc, #480] @ (801b508 <tcp_connect+0x220>)
  67134. 801b328: 4876 ldr r0, [pc, #472] @ (801b504 <tcp_connect+0x21c>)
  67135. 801b32a: f00e fb4f bl 80299cc <iprintf>
  67136. 801b32e: f06f 030f mvn.w r3, #15
  67137. 801b332: e0df b.n 801b4f4 <tcp_connect+0x20c>
  67138. LWIP_ERROR("tcp_connect: can only connect from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN);
  67139. 801b334: 68fb ldr r3, [r7, #12]
  67140. 801b336: 7d1b ldrb r3, [r3, #20]
  67141. 801b338: 2b00 cmp r3, #0
  67142. 801b33a: d009 beq.n 801b350 <tcp_connect+0x68>
  67143. 801b33c: 4b6f ldr r3, [pc, #444] @ (801b4fc <tcp_connect+0x214>)
  67144. 801b33e: f44f 6287 mov.w r2, #1080 @ 0x438
  67145. 801b342: 4972 ldr r1, [pc, #456] @ (801b50c <tcp_connect+0x224>)
  67146. 801b344: 486f ldr r0, [pc, #444] @ (801b504 <tcp_connect+0x21c>)
  67147. 801b346: f00e fb41 bl 80299cc <iprintf>
  67148. 801b34a: f06f 0309 mvn.w r3, #9
  67149. 801b34e: e0d1 b.n 801b4f4 <tcp_connect+0x20c>
  67150. LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %"U16_F"\n", port));
  67151. ip_addr_set(&pcb->remote_ip, ipaddr);
  67152. 801b350: 68bb ldr r3, [r7, #8]
  67153. 801b352: 2b00 cmp r3, #0
  67154. 801b354: d002 beq.n 801b35c <tcp_connect+0x74>
  67155. 801b356: 68bb ldr r3, [r7, #8]
  67156. 801b358: 681b ldr r3, [r3, #0]
  67157. 801b35a: e000 b.n 801b35e <tcp_connect+0x76>
  67158. 801b35c: 2300 movs r3, #0
  67159. 801b35e: 68fa ldr r2, [r7, #12]
  67160. 801b360: 6053 str r3, [r2, #4]
  67161. pcb->remote_port = port;
  67162. 801b362: 68fb ldr r3, [r7, #12]
  67163. 801b364: 88fa ldrh r2, [r7, #6]
  67164. 801b366: 831a strh r2, [r3, #24]
  67165. if (pcb->netif_idx != NETIF_NO_INDEX) {
  67166. 801b368: 68fb ldr r3, [r7, #12]
  67167. 801b36a: 7a1b ldrb r3, [r3, #8]
  67168. 801b36c: 2b00 cmp r3, #0
  67169. 801b36e: d006 beq.n 801b37e <tcp_connect+0x96>
  67170. netif = netif_get_by_index(pcb->netif_idx);
  67171. 801b370: 68fb ldr r3, [r7, #12]
  67172. 801b372: 7a1b ldrb r3, [r3, #8]
  67173. 801b374: 4618 mov r0, r3
  67174. 801b376: f7fe fcf1 bl 8019d5c <netif_get_by_index>
  67175. 801b37a: 6278 str r0, [r7, #36] @ 0x24
  67176. 801b37c: e005 b.n 801b38a <tcp_connect+0xa2>
  67177. } else {
  67178. /* check if we have a route to the remote host */
  67179. netif = ip_route(&pcb->local_ip, &pcb->remote_ip);
  67180. 801b37e: 68fb ldr r3, [r7, #12]
  67181. 801b380: 3304 adds r3, #4
  67182. 801b382: 4618 mov r0, r3
  67183. 801b384: f009 fb14 bl 80249b0 <ip4_route>
  67184. 801b388: 6278 str r0, [r7, #36] @ 0x24
  67185. }
  67186. if (netif == NULL) {
  67187. 801b38a: 6a7b ldr r3, [r7, #36] @ 0x24
  67188. 801b38c: 2b00 cmp r3, #0
  67189. 801b38e: d102 bne.n 801b396 <tcp_connect+0xae>
  67190. /* Don't even try to send a SYN packet if we have no route since that will fail. */
  67191. return ERR_RTE;
  67192. 801b390: f06f 0303 mvn.w r3, #3
  67193. 801b394: e0ae b.n 801b4f4 <tcp_connect+0x20c>
  67194. }
  67195. /* check if local IP has been assigned to pcb, if not, get one */
  67196. if (ip_addr_isany(&pcb->local_ip)) {
  67197. 801b396: 68fb ldr r3, [r7, #12]
  67198. 801b398: 2b00 cmp r3, #0
  67199. 801b39a: d003 beq.n 801b3a4 <tcp_connect+0xbc>
  67200. 801b39c: 68fb ldr r3, [r7, #12]
  67201. 801b39e: 681b ldr r3, [r3, #0]
  67202. 801b3a0: 2b00 cmp r3, #0
  67203. 801b3a2: d111 bne.n 801b3c8 <tcp_connect+0xe0>
  67204. const ip_addr_t *local_ip = ip_netif_get_local_ip(netif, ipaddr);
  67205. 801b3a4: 6a7b ldr r3, [r7, #36] @ 0x24
  67206. 801b3a6: 2b00 cmp r3, #0
  67207. 801b3a8: d002 beq.n 801b3b0 <tcp_connect+0xc8>
  67208. 801b3aa: 6a7b ldr r3, [r7, #36] @ 0x24
  67209. 801b3ac: 3304 adds r3, #4
  67210. 801b3ae: e000 b.n 801b3b2 <tcp_connect+0xca>
  67211. 801b3b0: 2300 movs r3, #0
  67212. 801b3b2: 61fb str r3, [r7, #28]
  67213. if (local_ip == NULL) {
  67214. 801b3b4: 69fb ldr r3, [r7, #28]
  67215. 801b3b6: 2b00 cmp r3, #0
  67216. 801b3b8: d102 bne.n 801b3c0 <tcp_connect+0xd8>
  67217. return ERR_RTE;
  67218. 801b3ba: f06f 0303 mvn.w r3, #3
  67219. 801b3be: e099 b.n 801b4f4 <tcp_connect+0x20c>
  67220. }
  67221. ip_addr_copy(pcb->local_ip, *local_ip);
  67222. 801b3c0: 69fb ldr r3, [r7, #28]
  67223. 801b3c2: 681a ldr r2, [r3, #0]
  67224. 801b3c4: 68fb ldr r3, [r7, #12]
  67225. 801b3c6: 601a str r2, [r3, #0]
  67226. ip6_addr_lacks_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNICAST)) {
  67227. ip6_addr_assign_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNICAST, netif);
  67228. }
  67229. #endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
  67230. old_local_port = pcb->local_port;
  67231. 801b3c8: 68fb ldr r3, [r7, #12]
  67232. 801b3ca: 8adb ldrh r3, [r3, #22]
  67233. 801b3cc: 837b strh r3, [r7, #26]
  67234. if (pcb->local_port == 0) {
  67235. 801b3ce: 68fb ldr r3, [r7, #12]
  67236. 801b3d0: 8adb ldrh r3, [r3, #22]
  67237. 801b3d2: 2b00 cmp r3, #0
  67238. 801b3d4: d10c bne.n 801b3f0 <tcp_connect+0x108>
  67239. pcb->local_port = tcp_new_port();
  67240. 801b3d6: f7ff ff41 bl 801b25c <tcp_new_port>
  67241. 801b3da: 4603 mov r3, r0
  67242. 801b3dc: 461a mov r2, r3
  67243. 801b3de: 68fb ldr r3, [r7, #12]
  67244. 801b3e0: 82da strh r2, [r3, #22]
  67245. if (pcb->local_port == 0) {
  67246. 801b3e2: 68fb ldr r3, [r7, #12]
  67247. 801b3e4: 8adb ldrh r3, [r3, #22]
  67248. 801b3e6: 2b00 cmp r3, #0
  67249. 801b3e8: d102 bne.n 801b3f0 <tcp_connect+0x108>
  67250. return ERR_BUF;
  67251. 801b3ea: f06f 0301 mvn.w r3, #1
  67252. 801b3ee: e081 b.n 801b4f4 <tcp_connect+0x20c>
  67253. }
  67254. }
  67255. #endif /* SO_REUSE */
  67256. }
  67257. iss = tcp_next_iss(pcb);
  67258. 801b3f0: 68f8 ldr r0, [r7, #12]
  67259. 801b3f2: f001 f875 bl 801c4e0 <tcp_next_iss>
  67260. 801b3f6: 6178 str r0, [r7, #20]
  67261. pcb->rcv_nxt = 0;
  67262. 801b3f8: 68fb ldr r3, [r7, #12]
  67263. 801b3fa: 2200 movs r2, #0
  67264. 801b3fc: 625a str r2, [r3, #36] @ 0x24
  67265. pcb->snd_nxt = iss;
  67266. 801b3fe: 68fb ldr r3, [r7, #12]
  67267. 801b400: 697a ldr r2, [r7, #20]
  67268. 801b402: 651a str r2, [r3, #80] @ 0x50
  67269. pcb->lastack = iss - 1;
  67270. 801b404: 697b ldr r3, [r7, #20]
  67271. 801b406: 1e5a subs r2, r3, #1
  67272. 801b408: 68fb ldr r3, [r7, #12]
  67273. 801b40a: 645a str r2, [r3, #68] @ 0x44
  67274. pcb->snd_wl2 = iss - 1;
  67275. 801b40c: 697b ldr r3, [r7, #20]
  67276. 801b40e: 1e5a subs r2, r3, #1
  67277. 801b410: 68fb ldr r3, [r7, #12]
  67278. 801b412: 659a str r2, [r3, #88] @ 0x58
  67279. pcb->snd_lbb = iss - 1;
  67280. 801b414: 697b ldr r3, [r7, #20]
  67281. 801b416: 1e5a subs r2, r3, #1
  67282. 801b418: 68fb ldr r3, [r7, #12]
  67283. 801b41a: 65da str r2, [r3, #92] @ 0x5c
  67284. /* Start with a window that does not need scaling. When window scaling is
  67285. enabled and used, the window is enlarged when both sides agree on scaling. */
  67286. pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND);
  67287. 801b41c: 68fb ldr r3, [r7, #12]
  67288. 801b41e: f241 62d0 movw r2, #5840 @ 0x16d0
  67289. 801b422: 855a strh r2, [r3, #42] @ 0x2a
  67290. 801b424: 68fb ldr r3, [r7, #12]
  67291. 801b426: 8d5a ldrh r2, [r3, #42] @ 0x2a
  67292. 801b428: 68fb ldr r3, [r7, #12]
  67293. 801b42a: 851a strh r2, [r3, #40] @ 0x28
  67294. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  67295. 801b42c: 68fb ldr r3, [r7, #12]
  67296. 801b42e: 6a5a ldr r2, [r3, #36] @ 0x24
  67297. 801b430: 68fb ldr r3, [r7, #12]
  67298. 801b432: 62da str r2, [r3, #44] @ 0x2c
  67299. pcb->snd_wnd = TCP_WND;
  67300. 801b434: 68fb ldr r3, [r7, #12]
  67301. 801b436: f241 62d0 movw r2, #5840 @ 0x16d0
  67302. 801b43a: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  67303. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  67304. The send MSS is updated when an MSS option is received. */
  67305. pcb->mss = INITIAL_MSS;
  67306. 801b43e: 68fb ldr r3, [r7, #12]
  67307. 801b440: f44f 7206 mov.w r2, #536 @ 0x218
  67308. 801b444: 865a strh r2, [r3, #50] @ 0x32
  67309. #if TCP_CALCULATE_EFF_SEND_MSS
  67310. pcb->mss = tcp_eff_send_mss_netif(pcb->mss, netif, &pcb->remote_ip);
  67311. 801b446: 68fb ldr r3, [r7, #12]
  67312. 801b448: 8e58 ldrh r0, [r3, #50] @ 0x32
  67313. 801b44a: 68fb ldr r3, [r7, #12]
  67314. 801b44c: 3304 adds r3, #4
  67315. 801b44e: 461a mov r2, r3
  67316. 801b450: 6a79 ldr r1, [r7, #36] @ 0x24
  67317. 801b452: f001 f86b bl 801c52c <tcp_eff_send_mss_netif>
  67318. 801b456: 4603 mov r3, r0
  67319. 801b458: 461a mov r2, r3
  67320. 801b45a: 68fb ldr r3, [r7, #12]
  67321. 801b45c: 865a strh r2, [r3, #50] @ 0x32
  67322. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  67323. pcb->cwnd = 1;
  67324. 801b45e: 68fb ldr r3, [r7, #12]
  67325. 801b460: 2201 movs r2, #1
  67326. 801b462: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  67327. #if LWIP_CALLBACK_API
  67328. pcb->connected = connected;
  67329. 801b466: 68fb ldr r3, [r7, #12]
  67330. 801b468: 683a ldr r2, [r7, #0]
  67331. 801b46a: f8c3 2088 str.w r2, [r3, #136] @ 0x88
  67332. #else /* LWIP_CALLBACK_API */
  67333. LWIP_UNUSED_ARG(connected);
  67334. #endif /* LWIP_CALLBACK_API */
  67335. /* Send a SYN together with the MSS option. */
  67336. ret = tcp_enqueue_flags(pcb, TCP_SYN);
  67337. 801b46e: 2102 movs r1, #2
  67338. 801b470: 68f8 ldr r0, [r7, #12]
  67339. 801b472: f004 fb31 bl 801fad8 <tcp_enqueue_flags>
  67340. 801b476: 4603 mov r3, r0
  67341. 801b478: 74fb strb r3, [r7, #19]
  67342. if (ret == ERR_OK) {
  67343. 801b47a: f997 3013 ldrsb.w r3, [r7, #19]
  67344. 801b47e: 2b00 cmp r3, #0
  67345. 801b480: d136 bne.n 801b4f0 <tcp_connect+0x208>
  67346. /* SYN segment was enqueued, changed the pcbs state now */
  67347. pcb->state = SYN_SENT;
  67348. 801b482: 68fb ldr r3, [r7, #12]
  67349. 801b484: 2202 movs r2, #2
  67350. 801b486: 751a strb r2, [r3, #20]
  67351. if (old_local_port != 0) {
  67352. 801b488: 8b7b ldrh r3, [r7, #26]
  67353. 801b48a: 2b00 cmp r3, #0
  67354. 801b48c: d021 beq.n 801b4d2 <tcp_connect+0x1ea>
  67355. TCP_RMV(&tcp_bound_pcbs, pcb);
  67356. 801b48e: 4b20 ldr r3, [pc, #128] @ (801b510 <tcp_connect+0x228>)
  67357. 801b490: 681b ldr r3, [r3, #0]
  67358. 801b492: 68fa ldr r2, [r7, #12]
  67359. 801b494: 429a cmp r2, r3
  67360. 801b496: d105 bne.n 801b4a4 <tcp_connect+0x1bc>
  67361. 801b498: 4b1d ldr r3, [pc, #116] @ (801b510 <tcp_connect+0x228>)
  67362. 801b49a: 681b ldr r3, [r3, #0]
  67363. 801b49c: 68db ldr r3, [r3, #12]
  67364. 801b49e: 4a1c ldr r2, [pc, #112] @ (801b510 <tcp_connect+0x228>)
  67365. 801b4a0: 6013 str r3, [r2, #0]
  67366. 801b4a2: e013 b.n 801b4cc <tcp_connect+0x1e4>
  67367. 801b4a4: 4b1a ldr r3, [pc, #104] @ (801b510 <tcp_connect+0x228>)
  67368. 801b4a6: 681b ldr r3, [r3, #0]
  67369. 801b4a8: 623b str r3, [r7, #32]
  67370. 801b4aa: e00c b.n 801b4c6 <tcp_connect+0x1de>
  67371. 801b4ac: 6a3b ldr r3, [r7, #32]
  67372. 801b4ae: 68db ldr r3, [r3, #12]
  67373. 801b4b0: 68fa ldr r2, [r7, #12]
  67374. 801b4b2: 429a cmp r2, r3
  67375. 801b4b4: d104 bne.n 801b4c0 <tcp_connect+0x1d8>
  67376. 801b4b6: 68fb ldr r3, [r7, #12]
  67377. 801b4b8: 68da ldr r2, [r3, #12]
  67378. 801b4ba: 6a3b ldr r3, [r7, #32]
  67379. 801b4bc: 60da str r2, [r3, #12]
  67380. 801b4be: e005 b.n 801b4cc <tcp_connect+0x1e4>
  67381. 801b4c0: 6a3b ldr r3, [r7, #32]
  67382. 801b4c2: 68db ldr r3, [r3, #12]
  67383. 801b4c4: 623b str r3, [r7, #32]
  67384. 801b4c6: 6a3b ldr r3, [r7, #32]
  67385. 801b4c8: 2b00 cmp r3, #0
  67386. 801b4ca: d1ef bne.n 801b4ac <tcp_connect+0x1c4>
  67387. 801b4cc: 68fb ldr r3, [r7, #12]
  67388. 801b4ce: 2200 movs r2, #0
  67389. 801b4d0: 60da str r2, [r3, #12]
  67390. }
  67391. TCP_REG_ACTIVE(pcb);
  67392. 801b4d2: 4b10 ldr r3, [pc, #64] @ (801b514 <tcp_connect+0x22c>)
  67393. 801b4d4: 681a ldr r2, [r3, #0]
  67394. 801b4d6: 68fb ldr r3, [r7, #12]
  67395. 801b4d8: 60da str r2, [r3, #12]
  67396. 801b4da: 4a0e ldr r2, [pc, #56] @ (801b514 <tcp_connect+0x22c>)
  67397. 801b4dc: 68fb ldr r3, [r7, #12]
  67398. 801b4de: 6013 str r3, [r2, #0]
  67399. 801b4e0: f005 fb6c bl 8020bbc <tcp_timer_needed>
  67400. 801b4e4: 4b0c ldr r3, [pc, #48] @ (801b518 <tcp_connect+0x230>)
  67401. 801b4e6: 2201 movs r2, #1
  67402. 801b4e8: 701a strb r2, [r3, #0]
  67403. MIB2_STATS_INC(mib2.tcpactiveopens);
  67404. tcp_output(pcb);
  67405. 801b4ea: 68f8 ldr r0, [r7, #12]
  67406. 801b4ec: f004 fbe2 bl 801fcb4 <tcp_output>
  67407. }
  67408. return ret;
  67409. 801b4f0: f997 3013 ldrsb.w r3, [r7, #19]
  67410. }
  67411. 801b4f4: 4618 mov r0, r3
  67412. 801b4f6: 3728 adds r7, #40 @ 0x28
  67413. 801b4f8: 46bd mov sp, r7
  67414. 801b4fa: bd80 pop {r7, pc}
  67415. 801b4fc: 0802e5a8 .word 0x0802e5a8
  67416. 801b500: 0802e884 .word 0x0802e884
  67417. 801b504: 0802e5ec .word 0x0802e5ec
  67418. 801b508: 0802e8a0 .word 0x0802e8a0
  67419. 801b50c: 0802e8bc .word 0x0802e8bc
  67420. 801b510: 2402ae8c .word 0x2402ae8c
  67421. 801b514: 2402ae94 .word 0x2402ae94
  67422. 801b518: 2402ae9c .word 0x2402ae9c
  67423. 0801b51c <tcp_slowtmr>:
  67424. *
  67425. * Automatically called from tcp_tmr().
  67426. */
  67427. void
  67428. tcp_slowtmr(void)
  67429. {
  67430. 801b51c: b5b0 push {r4, r5, r7, lr}
  67431. 801b51e: b090 sub sp, #64 @ 0x40
  67432. 801b520: af04 add r7, sp, #16
  67433. tcpwnd_size_t eff_wnd;
  67434. u8_t pcb_remove; /* flag if a PCB should be removed */
  67435. u8_t pcb_reset; /* flag if a RST should be sent when removing */
  67436. err_t err;
  67437. err = ERR_OK;
  67438. 801b522: 2300 movs r3, #0
  67439. 801b524: f887 3025 strb.w r3, [r7, #37] @ 0x25
  67440. ++tcp_ticks;
  67441. 801b528: 4b95 ldr r3, [pc, #596] @ (801b780 <tcp_slowtmr+0x264>)
  67442. 801b52a: 681b ldr r3, [r3, #0]
  67443. 801b52c: 3301 adds r3, #1
  67444. 801b52e: 4a94 ldr r2, [pc, #592] @ (801b780 <tcp_slowtmr+0x264>)
  67445. 801b530: 6013 str r3, [r2, #0]
  67446. ++tcp_timer_ctr;
  67447. 801b532: 4b94 ldr r3, [pc, #592] @ (801b784 <tcp_slowtmr+0x268>)
  67448. 801b534: 781b ldrb r3, [r3, #0]
  67449. 801b536: 3301 adds r3, #1
  67450. 801b538: b2da uxtb r2, r3
  67451. 801b53a: 4b92 ldr r3, [pc, #584] @ (801b784 <tcp_slowtmr+0x268>)
  67452. 801b53c: 701a strb r2, [r3, #0]
  67453. 801b53e: e000 b.n 801b542 <tcp_slowtmr+0x26>
  67454. prev->polltmr = 0;
  67455. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
  67456. tcp_active_pcbs_changed = 0;
  67457. TCP_EVENT_POLL(prev, err);
  67458. if (tcp_active_pcbs_changed) {
  67459. goto tcp_slowtmr_start;
  67460. 801b540: bf00 nop
  67461. prev = NULL;
  67462. 801b542: 2300 movs r3, #0
  67463. 801b544: 62bb str r3, [r7, #40] @ 0x28
  67464. pcb = tcp_active_pcbs;
  67465. 801b546: 4b90 ldr r3, [pc, #576] @ (801b788 <tcp_slowtmr+0x26c>)
  67466. 801b548: 681b ldr r3, [r3, #0]
  67467. 801b54a: 62fb str r3, [r7, #44] @ 0x2c
  67468. while (pcb != NULL) {
  67469. 801b54c: e29d b.n 801ba8a <tcp_slowtmr+0x56e>
  67470. LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
  67471. 801b54e: 6afb ldr r3, [r7, #44] @ 0x2c
  67472. 801b550: 7d1b ldrb r3, [r3, #20]
  67473. 801b552: 2b00 cmp r3, #0
  67474. 801b554: d106 bne.n 801b564 <tcp_slowtmr+0x48>
  67475. 801b556: 4b8d ldr r3, [pc, #564] @ (801b78c <tcp_slowtmr+0x270>)
  67476. 801b558: f240 42be movw r2, #1214 @ 0x4be
  67477. 801b55c: 498c ldr r1, [pc, #560] @ (801b790 <tcp_slowtmr+0x274>)
  67478. 801b55e: 488d ldr r0, [pc, #564] @ (801b794 <tcp_slowtmr+0x278>)
  67479. 801b560: f00e fa34 bl 80299cc <iprintf>
  67480. LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
  67481. 801b564: 6afb ldr r3, [r7, #44] @ 0x2c
  67482. 801b566: 7d1b ldrb r3, [r3, #20]
  67483. 801b568: 2b01 cmp r3, #1
  67484. 801b56a: d106 bne.n 801b57a <tcp_slowtmr+0x5e>
  67485. 801b56c: 4b87 ldr r3, [pc, #540] @ (801b78c <tcp_slowtmr+0x270>)
  67486. 801b56e: f240 42bf movw r2, #1215 @ 0x4bf
  67487. 801b572: 4989 ldr r1, [pc, #548] @ (801b798 <tcp_slowtmr+0x27c>)
  67488. 801b574: 4887 ldr r0, [pc, #540] @ (801b794 <tcp_slowtmr+0x278>)
  67489. 801b576: f00e fa29 bl 80299cc <iprintf>
  67490. LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
  67491. 801b57a: 6afb ldr r3, [r7, #44] @ 0x2c
  67492. 801b57c: 7d1b ldrb r3, [r3, #20]
  67493. 801b57e: 2b0a cmp r3, #10
  67494. 801b580: d106 bne.n 801b590 <tcp_slowtmr+0x74>
  67495. 801b582: 4b82 ldr r3, [pc, #520] @ (801b78c <tcp_slowtmr+0x270>)
  67496. 801b584: f44f 6298 mov.w r2, #1216 @ 0x4c0
  67497. 801b588: 4984 ldr r1, [pc, #528] @ (801b79c <tcp_slowtmr+0x280>)
  67498. 801b58a: 4882 ldr r0, [pc, #520] @ (801b794 <tcp_slowtmr+0x278>)
  67499. 801b58c: f00e fa1e bl 80299cc <iprintf>
  67500. if (pcb->last_timer == tcp_timer_ctr) {
  67501. 801b590: 6afb ldr r3, [r7, #44] @ 0x2c
  67502. 801b592: 7f9a ldrb r2, [r3, #30]
  67503. 801b594: 4b7b ldr r3, [pc, #492] @ (801b784 <tcp_slowtmr+0x268>)
  67504. 801b596: 781b ldrb r3, [r3, #0]
  67505. 801b598: 429a cmp r2, r3
  67506. 801b59a: d105 bne.n 801b5a8 <tcp_slowtmr+0x8c>
  67507. prev = pcb;
  67508. 801b59c: 6afb ldr r3, [r7, #44] @ 0x2c
  67509. 801b59e: 62bb str r3, [r7, #40] @ 0x28
  67510. pcb = pcb->next;
  67511. 801b5a0: 6afb ldr r3, [r7, #44] @ 0x2c
  67512. 801b5a2: 68db ldr r3, [r3, #12]
  67513. 801b5a4: 62fb str r3, [r7, #44] @ 0x2c
  67514. continue;
  67515. 801b5a6: e270 b.n 801ba8a <tcp_slowtmr+0x56e>
  67516. pcb->last_timer = tcp_timer_ctr;
  67517. 801b5a8: 4b76 ldr r3, [pc, #472] @ (801b784 <tcp_slowtmr+0x268>)
  67518. 801b5aa: 781a ldrb r2, [r3, #0]
  67519. 801b5ac: 6afb ldr r3, [r7, #44] @ 0x2c
  67520. 801b5ae: 779a strb r2, [r3, #30]
  67521. pcb_remove = 0;
  67522. 801b5b0: 2300 movs r3, #0
  67523. 801b5b2: f887 3027 strb.w r3, [r7, #39] @ 0x27
  67524. pcb_reset = 0;
  67525. 801b5b6: 2300 movs r3, #0
  67526. 801b5b8: f887 3026 strb.w r3, [r7, #38] @ 0x26
  67527. if (pcb->state == SYN_SENT && pcb->nrtx >= TCP_SYNMAXRTX) {
  67528. 801b5bc: 6afb ldr r3, [r7, #44] @ 0x2c
  67529. 801b5be: 7d1b ldrb r3, [r3, #20]
  67530. 801b5c0: 2b02 cmp r3, #2
  67531. 801b5c2: d10a bne.n 801b5da <tcp_slowtmr+0xbe>
  67532. 801b5c4: 6afb ldr r3, [r7, #44] @ 0x2c
  67533. 801b5c6: f893 3042 ldrb.w r3, [r3, #66] @ 0x42
  67534. 801b5ca: 2b05 cmp r3, #5
  67535. 801b5cc: d905 bls.n 801b5da <tcp_slowtmr+0xbe>
  67536. ++pcb_remove;
  67537. 801b5ce: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  67538. 801b5d2: 3301 adds r3, #1
  67539. 801b5d4: f887 3027 strb.w r3, [r7, #39] @ 0x27
  67540. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n"));
  67541. 801b5d8: e11e b.n 801b818 <tcp_slowtmr+0x2fc>
  67542. } else if (pcb->nrtx >= TCP_MAXRTX) {
  67543. 801b5da: 6afb ldr r3, [r7, #44] @ 0x2c
  67544. 801b5dc: f893 3042 ldrb.w r3, [r3, #66] @ 0x42
  67545. 801b5e0: 2b0b cmp r3, #11
  67546. 801b5e2: d905 bls.n 801b5f0 <tcp_slowtmr+0xd4>
  67547. ++pcb_remove;
  67548. 801b5e4: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  67549. 801b5e8: 3301 adds r3, #1
  67550. 801b5ea: f887 3027 strb.w r3, [r7, #39] @ 0x27
  67551. 801b5ee: e113 b.n 801b818 <tcp_slowtmr+0x2fc>
  67552. if (pcb->persist_backoff > 0) {
  67553. 801b5f0: 6afb ldr r3, [r7, #44] @ 0x2c
  67554. 801b5f2: f893 3099 ldrb.w r3, [r3, #153] @ 0x99
  67555. 801b5f6: 2b00 cmp r3, #0
  67556. 801b5f8: d075 beq.n 801b6e6 <tcp_slowtmr+0x1ca>
  67557. LWIP_ASSERT("tcp_slowtimr: persist ticking with in-flight data", pcb->unacked == NULL);
  67558. 801b5fa: 6afb ldr r3, [r7, #44] @ 0x2c
  67559. 801b5fc: 6f1b ldr r3, [r3, #112] @ 0x70
  67560. 801b5fe: 2b00 cmp r3, #0
  67561. 801b600: d006 beq.n 801b610 <tcp_slowtmr+0xf4>
  67562. 801b602: 4b62 ldr r3, [pc, #392] @ (801b78c <tcp_slowtmr+0x270>)
  67563. 801b604: f240 42d4 movw r2, #1236 @ 0x4d4
  67564. 801b608: 4965 ldr r1, [pc, #404] @ (801b7a0 <tcp_slowtmr+0x284>)
  67565. 801b60a: 4862 ldr r0, [pc, #392] @ (801b794 <tcp_slowtmr+0x278>)
  67566. 801b60c: f00e f9de bl 80299cc <iprintf>
  67567. LWIP_ASSERT("tcp_slowtimr: persist ticking with empty send buffer", pcb->unsent != NULL);
  67568. 801b610: 6afb ldr r3, [r7, #44] @ 0x2c
  67569. 801b612: 6edb ldr r3, [r3, #108] @ 0x6c
  67570. 801b614: 2b00 cmp r3, #0
  67571. 801b616: d106 bne.n 801b626 <tcp_slowtmr+0x10a>
  67572. 801b618: 4b5c ldr r3, [pc, #368] @ (801b78c <tcp_slowtmr+0x270>)
  67573. 801b61a: f240 42d5 movw r2, #1237 @ 0x4d5
  67574. 801b61e: 4961 ldr r1, [pc, #388] @ (801b7a4 <tcp_slowtmr+0x288>)
  67575. 801b620: 485c ldr r0, [pc, #368] @ (801b794 <tcp_slowtmr+0x278>)
  67576. 801b622: f00e f9d3 bl 80299cc <iprintf>
  67577. if (pcb->persist_probe >= TCP_MAXRTX) {
  67578. 801b626: 6afb ldr r3, [r7, #44] @ 0x2c
  67579. 801b628: f893 309a ldrb.w r3, [r3, #154] @ 0x9a
  67580. 801b62c: 2b0b cmp r3, #11
  67581. 801b62e: d905 bls.n 801b63c <tcp_slowtmr+0x120>
  67582. ++pcb_remove; /* max probes reached */
  67583. 801b630: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  67584. 801b634: 3301 adds r3, #1
  67585. 801b636: f887 3027 strb.w r3, [r7, #39] @ 0x27
  67586. 801b63a: e0ed b.n 801b818 <tcp_slowtmr+0x2fc>
  67587. u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff - 1];
  67588. 801b63c: 6afb ldr r3, [r7, #44] @ 0x2c
  67589. 801b63e: f893 3099 ldrb.w r3, [r3, #153] @ 0x99
  67590. 801b642: 3b01 subs r3, #1
  67591. 801b644: 4a58 ldr r2, [pc, #352] @ (801b7a8 <tcp_slowtmr+0x28c>)
  67592. 801b646: 5cd3 ldrb r3, [r2, r3]
  67593. 801b648: 747b strb r3, [r7, #17]
  67594. if (pcb->persist_cnt < backoff_cnt) {
  67595. 801b64a: 6afb ldr r3, [r7, #44] @ 0x2c
  67596. 801b64c: f893 3098 ldrb.w r3, [r3, #152] @ 0x98
  67597. 801b650: 7c7a ldrb r2, [r7, #17]
  67598. 801b652: 429a cmp r2, r3
  67599. 801b654: d907 bls.n 801b666 <tcp_slowtmr+0x14a>
  67600. pcb->persist_cnt++;
  67601. 801b656: 6afb ldr r3, [r7, #44] @ 0x2c
  67602. 801b658: f893 3098 ldrb.w r3, [r3, #152] @ 0x98
  67603. 801b65c: 3301 adds r3, #1
  67604. 801b65e: b2da uxtb r2, r3
  67605. 801b660: 6afb ldr r3, [r7, #44] @ 0x2c
  67606. 801b662: f883 2098 strb.w r2, [r3, #152] @ 0x98
  67607. if (pcb->persist_cnt >= backoff_cnt) {
  67608. 801b666: 6afb ldr r3, [r7, #44] @ 0x2c
  67609. 801b668: f893 3098 ldrb.w r3, [r3, #152] @ 0x98
  67610. 801b66c: 7c7a ldrb r2, [r7, #17]
  67611. 801b66e: 429a cmp r2, r3
  67612. 801b670: f200 80d2 bhi.w 801b818 <tcp_slowtmr+0x2fc>
  67613. int next_slot = 1; /* increment timer to next slot */
  67614. 801b674: 2301 movs r3, #1
  67615. 801b676: 623b str r3, [r7, #32]
  67616. if (pcb->snd_wnd == 0) {
  67617. 801b678: 6afb ldr r3, [r7, #44] @ 0x2c
  67618. 801b67a: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  67619. 801b67e: 2b00 cmp r3, #0
  67620. 801b680: d108 bne.n 801b694 <tcp_slowtmr+0x178>
  67621. if (tcp_zero_window_probe(pcb) != ERR_OK) {
  67622. 801b682: 6af8 ldr r0, [r7, #44] @ 0x2c
  67623. 801b684: f005 f9cc bl 8020a20 <tcp_zero_window_probe>
  67624. 801b688: 4603 mov r3, r0
  67625. 801b68a: 2b00 cmp r3, #0
  67626. 801b68c: d014 beq.n 801b6b8 <tcp_slowtmr+0x19c>
  67627. next_slot = 0; /* try probe again with current slot */
  67628. 801b68e: 2300 movs r3, #0
  67629. 801b690: 623b str r3, [r7, #32]
  67630. 801b692: e011 b.n 801b6b8 <tcp_slowtmr+0x19c>
  67631. if (tcp_split_unsent_seg(pcb, (u16_t)pcb->snd_wnd) == ERR_OK) {
  67632. 801b694: 6afb ldr r3, [r7, #44] @ 0x2c
  67633. 801b696: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  67634. 801b69a: 4619 mov r1, r3
  67635. 801b69c: 6af8 ldr r0, [r7, #44] @ 0x2c
  67636. 801b69e: f004 f87f bl 801f7a0 <tcp_split_unsent_seg>
  67637. 801b6a2: 4603 mov r3, r0
  67638. 801b6a4: 2b00 cmp r3, #0
  67639. 801b6a6: d107 bne.n 801b6b8 <tcp_slowtmr+0x19c>
  67640. if (tcp_output(pcb) == ERR_OK) {
  67641. 801b6a8: 6af8 ldr r0, [r7, #44] @ 0x2c
  67642. 801b6aa: f004 fb03 bl 801fcb4 <tcp_output>
  67643. 801b6ae: 4603 mov r3, r0
  67644. 801b6b0: 2b00 cmp r3, #0
  67645. 801b6b2: d101 bne.n 801b6b8 <tcp_slowtmr+0x19c>
  67646. next_slot = 0;
  67647. 801b6b4: 2300 movs r3, #0
  67648. 801b6b6: 623b str r3, [r7, #32]
  67649. if (next_slot) {
  67650. 801b6b8: 6a3b ldr r3, [r7, #32]
  67651. 801b6ba: 2b00 cmp r3, #0
  67652. 801b6bc: f000 80ac beq.w 801b818 <tcp_slowtmr+0x2fc>
  67653. pcb->persist_cnt = 0;
  67654. 801b6c0: 6afb ldr r3, [r7, #44] @ 0x2c
  67655. 801b6c2: 2200 movs r2, #0
  67656. 801b6c4: f883 2098 strb.w r2, [r3, #152] @ 0x98
  67657. if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
  67658. 801b6c8: 6afb ldr r3, [r7, #44] @ 0x2c
  67659. 801b6ca: f893 3099 ldrb.w r3, [r3, #153] @ 0x99
  67660. 801b6ce: 2b06 cmp r3, #6
  67661. 801b6d0: f200 80a2 bhi.w 801b818 <tcp_slowtmr+0x2fc>
  67662. pcb->persist_backoff++;
  67663. 801b6d4: 6afb ldr r3, [r7, #44] @ 0x2c
  67664. 801b6d6: f893 3099 ldrb.w r3, [r3, #153] @ 0x99
  67665. 801b6da: 3301 adds r3, #1
  67666. 801b6dc: b2da uxtb r2, r3
  67667. 801b6de: 6afb ldr r3, [r7, #44] @ 0x2c
  67668. 801b6e0: f883 2099 strb.w r2, [r3, #153] @ 0x99
  67669. 801b6e4: e098 b.n 801b818 <tcp_slowtmr+0x2fc>
  67670. if ((pcb->rtime >= 0) && (pcb->rtime < 0x7FFF)) {
  67671. 801b6e6: 6afb ldr r3, [r7, #44] @ 0x2c
  67672. 801b6e8: f9b3 3030 ldrsh.w r3, [r3, #48] @ 0x30
  67673. 801b6ec: 2b00 cmp r3, #0
  67674. 801b6ee: db0f blt.n 801b710 <tcp_slowtmr+0x1f4>
  67675. 801b6f0: 6afb ldr r3, [r7, #44] @ 0x2c
  67676. 801b6f2: f9b3 3030 ldrsh.w r3, [r3, #48] @ 0x30
  67677. 801b6f6: f647 72ff movw r2, #32767 @ 0x7fff
  67678. 801b6fa: 4293 cmp r3, r2
  67679. 801b6fc: d008 beq.n 801b710 <tcp_slowtmr+0x1f4>
  67680. ++pcb->rtime;
  67681. 801b6fe: 6afb ldr r3, [r7, #44] @ 0x2c
  67682. 801b700: f9b3 3030 ldrsh.w r3, [r3, #48] @ 0x30
  67683. 801b704: b29b uxth r3, r3
  67684. 801b706: 3301 adds r3, #1
  67685. 801b708: b29b uxth r3, r3
  67686. 801b70a: b21a sxth r2, r3
  67687. 801b70c: 6afb ldr r3, [r7, #44] @ 0x2c
  67688. 801b70e: 861a strh r2, [r3, #48] @ 0x30
  67689. if (pcb->rtime >= pcb->rto) {
  67690. 801b710: 6afb ldr r3, [r7, #44] @ 0x2c
  67691. 801b712: f9b3 2030 ldrsh.w r2, [r3, #48] @ 0x30
  67692. 801b716: 6afb ldr r3, [r7, #44] @ 0x2c
  67693. 801b718: f9b3 3040 ldrsh.w r3, [r3, #64] @ 0x40
  67694. 801b71c: 429a cmp r2, r3
  67695. 801b71e: db7b blt.n 801b818 <tcp_slowtmr+0x2fc>
  67696. if ((tcp_rexmit_rto_prepare(pcb) == ERR_OK) || ((pcb->unacked == NULL) && (pcb->unsent != NULL))) {
  67697. 801b720: 6af8 ldr r0, [r7, #44] @ 0x2c
  67698. 801b722: f004 fdbf bl 80202a4 <tcp_rexmit_rto_prepare>
  67699. 801b726: 4603 mov r3, r0
  67700. 801b728: 2b00 cmp r3, #0
  67701. 801b72a: d007 beq.n 801b73c <tcp_slowtmr+0x220>
  67702. 801b72c: 6afb ldr r3, [r7, #44] @ 0x2c
  67703. 801b72e: 6f1b ldr r3, [r3, #112] @ 0x70
  67704. 801b730: 2b00 cmp r3, #0
  67705. 801b732: d171 bne.n 801b818 <tcp_slowtmr+0x2fc>
  67706. 801b734: 6afb ldr r3, [r7, #44] @ 0x2c
  67707. 801b736: 6edb ldr r3, [r3, #108] @ 0x6c
  67708. 801b738: 2b00 cmp r3, #0
  67709. 801b73a: d06d beq.n 801b818 <tcp_slowtmr+0x2fc>
  67710. if (pcb->state != SYN_SENT) {
  67711. 801b73c: 6afb ldr r3, [r7, #44] @ 0x2c
  67712. 801b73e: 7d1b ldrb r3, [r3, #20]
  67713. 801b740: 2b02 cmp r3, #2
  67714. 801b742: d03a beq.n 801b7ba <tcp_slowtmr+0x29e>
  67715. u8_t backoff_idx = LWIP_MIN(pcb->nrtx, sizeof(tcp_backoff) - 1);
  67716. 801b744: 6afb ldr r3, [r7, #44] @ 0x2c
  67717. 801b746: f893 3042 ldrb.w r3, [r3, #66] @ 0x42
  67718. 801b74a: 2b0c cmp r3, #12
  67719. 801b74c: bf28 it cs
  67720. 801b74e: 230c movcs r3, #12
  67721. 801b750: 76fb strb r3, [r7, #27]
  67722. int calc_rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx];
  67723. 801b752: 6afb ldr r3, [r7, #44] @ 0x2c
  67724. 801b754: f9b3 303c ldrsh.w r3, [r3, #60] @ 0x3c
  67725. 801b758: 10db asrs r3, r3, #3
  67726. 801b75a: b21b sxth r3, r3
  67727. 801b75c: 461a mov r2, r3
  67728. 801b75e: 6afb ldr r3, [r7, #44] @ 0x2c
  67729. 801b760: f9b3 303e ldrsh.w r3, [r3, #62] @ 0x3e
  67730. 801b764: 4413 add r3, r2
  67731. 801b766: 7efa ldrb r2, [r7, #27]
  67732. 801b768: 4910 ldr r1, [pc, #64] @ (801b7ac <tcp_slowtmr+0x290>)
  67733. 801b76a: 5c8a ldrb r2, [r1, r2]
  67734. 801b76c: 4093 lsls r3, r2
  67735. 801b76e: 617b str r3, [r7, #20]
  67736. pcb->rto = (s16_t)LWIP_MIN(calc_rto, 0x7FFF);
  67737. 801b770: 697b ldr r3, [r7, #20]
  67738. 801b772: f647 72fe movw r2, #32766 @ 0x7ffe
  67739. 801b776: 4293 cmp r3, r2
  67740. 801b778: dc1a bgt.n 801b7b0 <tcp_slowtmr+0x294>
  67741. 801b77a: 697b ldr r3, [r7, #20]
  67742. 801b77c: b21a sxth r2, r3
  67743. 801b77e: e019 b.n 801b7b4 <tcp_slowtmr+0x298>
  67744. 801b780: 2402ae88 .word 0x2402ae88
  67745. 801b784: 2402ae9e .word 0x2402ae9e
  67746. 801b788: 2402ae94 .word 0x2402ae94
  67747. 801b78c: 0802e5a8 .word 0x0802e5a8
  67748. 801b790: 0802e8ec .word 0x0802e8ec
  67749. 801b794: 0802e5ec .word 0x0802e5ec
  67750. 801b798: 0802e918 .word 0x0802e918
  67751. 801b79c: 0802e944 .word 0x0802e944
  67752. 801b7a0: 0802e974 .word 0x0802e974
  67753. 801b7a4: 0802e9a8 .word 0x0802e9a8
  67754. 801b7a8: 08030bd0 .word 0x08030bd0
  67755. 801b7ac: 08030bc0 .word 0x08030bc0
  67756. 801b7b0: f647 72ff movw r2, #32767 @ 0x7fff
  67757. 801b7b4: 6afb ldr r3, [r7, #44] @ 0x2c
  67758. 801b7b6: f8a3 2040 strh.w r2, [r3, #64] @ 0x40
  67759. pcb->rtime = 0;
  67760. 801b7ba: 6afb ldr r3, [r7, #44] @ 0x2c
  67761. 801b7bc: 2200 movs r2, #0
  67762. 801b7be: 861a strh r2, [r3, #48] @ 0x30
  67763. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  67764. 801b7c0: 6afb ldr r3, [r7, #44] @ 0x2c
  67765. 801b7c2: f8b3 2060 ldrh.w r2, [r3, #96] @ 0x60
  67766. 801b7c6: 6afb ldr r3, [r7, #44] @ 0x2c
  67767. 801b7c8: f8b3 3048 ldrh.w r3, [r3, #72] @ 0x48
  67768. 801b7cc: 4293 cmp r3, r2
  67769. 801b7ce: bf28 it cs
  67770. 801b7d0: 4613 movcs r3, r2
  67771. 801b7d2: 827b strh r3, [r7, #18]
  67772. pcb->ssthresh = eff_wnd >> 1;
  67773. 801b7d4: 8a7b ldrh r3, [r7, #18]
  67774. 801b7d6: 085b lsrs r3, r3, #1
  67775. 801b7d8: b29a uxth r2, r3
  67776. 801b7da: 6afb ldr r3, [r7, #44] @ 0x2c
  67777. 801b7dc: f8a3 204a strh.w r2, [r3, #74] @ 0x4a
  67778. if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) {
  67779. 801b7e0: 6afb ldr r3, [r7, #44] @ 0x2c
  67780. 801b7e2: f8b3 204a ldrh.w r2, [r3, #74] @ 0x4a
  67781. 801b7e6: 6afb ldr r3, [r7, #44] @ 0x2c
  67782. 801b7e8: 8e5b ldrh r3, [r3, #50] @ 0x32
  67783. 801b7ea: 005b lsls r3, r3, #1
  67784. 801b7ec: b29b uxth r3, r3
  67785. 801b7ee: 429a cmp r2, r3
  67786. 801b7f0: d206 bcs.n 801b800 <tcp_slowtmr+0x2e4>
  67787. pcb->ssthresh = (tcpwnd_size_t)(pcb->mss << 1);
  67788. 801b7f2: 6afb ldr r3, [r7, #44] @ 0x2c
  67789. 801b7f4: 8e5b ldrh r3, [r3, #50] @ 0x32
  67790. 801b7f6: 005b lsls r3, r3, #1
  67791. 801b7f8: b29a uxth r2, r3
  67792. 801b7fa: 6afb ldr r3, [r7, #44] @ 0x2c
  67793. 801b7fc: f8a3 204a strh.w r2, [r3, #74] @ 0x4a
  67794. pcb->cwnd = pcb->mss;
  67795. 801b800: 6afb ldr r3, [r7, #44] @ 0x2c
  67796. 801b802: 8e5a ldrh r2, [r3, #50] @ 0x32
  67797. 801b804: 6afb ldr r3, [r7, #44] @ 0x2c
  67798. 801b806: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  67799. pcb->bytes_acked = 0;
  67800. 801b80a: 6afb ldr r3, [r7, #44] @ 0x2c
  67801. 801b80c: 2200 movs r2, #0
  67802. 801b80e: f8a3 206a strh.w r2, [r3, #106] @ 0x6a
  67803. tcp_rexmit_rto_commit(pcb);
  67804. 801b812: 6af8 ldr r0, [r7, #44] @ 0x2c
  67805. 801b814: f004 fdc0 bl 8020398 <tcp_rexmit_rto_commit>
  67806. if (pcb->state == FIN_WAIT_2) {
  67807. 801b818: 6afb ldr r3, [r7, #44] @ 0x2c
  67808. 801b81a: 7d1b ldrb r3, [r3, #20]
  67809. 801b81c: 2b06 cmp r3, #6
  67810. 801b81e: d111 bne.n 801b844 <tcp_slowtmr+0x328>
  67811. if (pcb->flags & TF_RXCLOSED) {
  67812. 801b820: 6afb ldr r3, [r7, #44] @ 0x2c
  67813. 801b822: 8b5b ldrh r3, [r3, #26]
  67814. 801b824: f003 0310 and.w r3, r3, #16
  67815. 801b828: 2b00 cmp r3, #0
  67816. 801b82a: d00b beq.n 801b844 <tcp_slowtmr+0x328>
  67817. if ((u32_t)(tcp_ticks - pcb->tmr) >
  67818. 801b82c: 4b9c ldr r3, [pc, #624] @ (801baa0 <tcp_slowtmr+0x584>)
  67819. 801b82e: 681a ldr r2, [r3, #0]
  67820. 801b830: 6afb ldr r3, [r7, #44] @ 0x2c
  67821. 801b832: 6a1b ldr r3, [r3, #32]
  67822. 801b834: 1ad3 subs r3, r2, r3
  67823. 801b836: 2b28 cmp r3, #40 @ 0x28
  67824. 801b838: d904 bls.n 801b844 <tcp_slowtmr+0x328>
  67825. ++pcb_remove;
  67826. 801b83a: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  67827. 801b83e: 3301 adds r3, #1
  67828. 801b840: f887 3027 strb.w r3, [r7, #39] @ 0x27
  67829. if (ip_get_option(pcb, SOF_KEEPALIVE) &&
  67830. 801b844: 6afb ldr r3, [r7, #44] @ 0x2c
  67831. 801b846: 7a5b ldrb r3, [r3, #9]
  67832. 801b848: f003 0308 and.w r3, r3, #8
  67833. 801b84c: 2b00 cmp r3, #0
  67834. 801b84e: d04a beq.n 801b8e6 <tcp_slowtmr+0x3ca>
  67835. ((pcb->state == ESTABLISHED) ||
  67836. 801b850: 6afb ldr r3, [r7, #44] @ 0x2c
  67837. 801b852: 7d1b ldrb r3, [r3, #20]
  67838. if (ip_get_option(pcb, SOF_KEEPALIVE) &&
  67839. 801b854: 2b04 cmp r3, #4
  67840. 801b856: d003 beq.n 801b860 <tcp_slowtmr+0x344>
  67841. (pcb->state == CLOSE_WAIT))) {
  67842. 801b858: 6afb ldr r3, [r7, #44] @ 0x2c
  67843. 801b85a: 7d1b ldrb r3, [r3, #20]
  67844. ((pcb->state == ESTABLISHED) ||
  67845. 801b85c: 2b07 cmp r3, #7
  67846. 801b85e: d142 bne.n 801b8e6 <tcp_slowtmr+0x3ca>
  67847. if ((u32_t)(tcp_ticks - pcb->tmr) >
  67848. 801b860: 4b8f ldr r3, [pc, #572] @ (801baa0 <tcp_slowtmr+0x584>)
  67849. 801b862: 681a ldr r2, [r3, #0]
  67850. 801b864: 6afb ldr r3, [r7, #44] @ 0x2c
  67851. 801b866: 6a1b ldr r3, [r3, #32]
  67852. 801b868: 1ad2 subs r2, r2, r3
  67853. (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL) {
  67854. 801b86a: 6afb ldr r3, [r7, #44] @ 0x2c
  67855. 801b86c: f8d3 1094 ldr.w r1, [r3, #148] @ 0x94
  67856. 801b870: 4b8c ldr r3, [pc, #560] @ (801baa4 <tcp_slowtmr+0x588>)
  67857. 801b872: 440b add r3, r1
  67858. 801b874: 498c ldr r1, [pc, #560] @ (801baa8 <tcp_slowtmr+0x58c>)
  67859. 801b876: fba1 1303 umull r1, r3, r1, r3
  67860. 801b87a: 095b lsrs r3, r3, #5
  67861. if ((u32_t)(tcp_ticks - pcb->tmr) >
  67862. 801b87c: 429a cmp r2, r3
  67863. 801b87e: d90a bls.n 801b896 <tcp_slowtmr+0x37a>
  67864. ++pcb_remove;
  67865. 801b880: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  67866. 801b884: 3301 adds r3, #1
  67867. 801b886: f887 3027 strb.w r3, [r7, #39] @ 0x27
  67868. ++pcb_reset;
  67869. 801b88a: f897 3026 ldrb.w r3, [r7, #38] @ 0x26
  67870. 801b88e: 3301 adds r3, #1
  67871. 801b890: f887 3026 strb.w r3, [r7, #38] @ 0x26
  67872. 801b894: e027 b.n 801b8e6 <tcp_slowtmr+0x3ca>
  67873. } else if ((u32_t)(tcp_ticks - pcb->tmr) >
  67874. 801b896: 4b82 ldr r3, [pc, #520] @ (801baa0 <tcp_slowtmr+0x584>)
  67875. 801b898: 681a ldr r2, [r3, #0]
  67876. 801b89a: 6afb ldr r3, [r7, #44] @ 0x2c
  67877. 801b89c: 6a1b ldr r3, [r3, #32]
  67878. 801b89e: 1ad2 subs r2, r2, r3
  67879. (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
  67880. 801b8a0: 6afb ldr r3, [r7, #44] @ 0x2c
  67881. 801b8a2: f8d3 1094 ldr.w r1, [r3, #148] @ 0x94
  67882. 801b8a6: 6afb ldr r3, [r7, #44] @ 0x2c
  67883. 801b8a8: f893 309b ldrb.w r3, [r3, #155] @ 0x9b
  67884. 801b8ac: 4618 mov r0, r3
  67885. 801b8ae: 4b7f ldr r3, [pc, #508] @ (801baac <tcp_slowtmr+0x590>)
  67886. 801b8b0: fb00 f303 mul.w r3, r0, r3
  67887. 801b8b4: 440b add r3, r1
  67888. / TCP_SLOW_INTERVAL) {
  67889. 801b8b6: 497c ldr r1, [pc, #496] @ (801baa8 <tcp_slowtmr+0x58c>)
  67890. 801b8b8: fba1 1303 umull r1, r3, r1, r3
  67891. 801b8bc: 095b lsrs r3, r3, #5
  67892. } else if ((u32_t)(tcp_ticks - pcb->tmr) >
  67893. 801b8be: 429a cmp r2, r3
  67894. 801b8c0: d911 bls.n 801b8e6 <tcp_slowtmr+0x3ca>
  67895. err = tcp_keepalive(pcb);
  67896. 801b8c2: 6af8 ldr r0, [r7, #44] @ 0x2c
  67897. 801b8c4: f005 f86c bl 80209a0 <tcp_keepalive>
  67898. 801b8c8: 4603 mov r3, r0
  67899. 801b8ca: f887 3025 strb.w r3, [r7, #37] @ 0x25
  67900. if (err == ERR_OK) {
  67901. 801b8ce: f997 3025 ldrsb.w r3, [r7, #37] @ 0x25
  67902. 801b8d2: 2b00 cmp r3, #0
  67903. 801b8d4: d107 bne.n 801b8e6 <tcp_slowtmr+0x3ca>
  67904. pcb->keep_cnt_sent++;
  67905. 801b8d6: 6afb ldr r3, [r7, #44] @ 0x2c
  67906. 801b8d8: f893 309b ldrb.w r3, [r3, #155] @ 0x9b
  67907. 801b8dc: 3301 adds r3, #1
  67908. 801b8de: b2da uxtb r2, r3
  67909. 801b8e0: 6afb ldr r3, [r7, #44] @ 0x2c
  67910. 801b8e2: f883 209b strb.w r2, [r3, #155] @ 0x9b
  67911. if (pcb->ooseq != NULL &&
  67912. 801b8e6: 6afb ldr r3, [r7, #44] @ 0x2c
  67913. 801b8e8: 6f5b ldr r3, [r3, #116] @ 0x74
  67914. 801b8ea: 2b00 cmp r3, #0
  67915. 801b8ec: d011 beq.n 801b912 <tcp_slowtmr+0x3f6>
  67916. (tcp_ticks - pcb->tmr >= (u32_t)pcb->rto * TCP_OOSEQ_TIMEOUT)) {
  67917. 801b8ee: 4b6c ldr r3, [pc, #432] @ (801baa0 <tcp_slowtmr+0x584>)
  67918. 801b8f0: 681a ldr r2, [r3, #0]
  67919. 801b8f2: 6afb ldr r3, [r7, #44] @ 0x2c
  67920. 801b8f4: 6a1b ldr r3, [r3, #32]
  67921. 801b8f6: 1ad2 subs r2, r2, r3
  67922. 801b8f8: 6afb ldr r3, [r7, #44] @ 0x2c
  67923. 801b8fa: f9b3 3040 ldrsh.w r3, [r3, #64] @ 0x40
  67924. 801b8fe: 4619 mov r1, r3
  67925. 801b900: 460b mov r3, r1
  67926. 801b902: 005b lsls r3, r3, #1
  67927. 801b904: 440b add r3, r1
  67928. 801b906: 005b lsls r3, r3, #1
  67929. if (pcb->ooseq != NULL &&
  67930. 801b908: 429a cmp r2, r3
  67931. 801b90a: d302 bcc.n 801b912 <tcp_slowtmr+0x3f6>
  67932. tcp_free_ooseq(pcb);
  67933. 801b90c: 6af8 ldr r0, [r7, #44] @ 0x2c
  67934. 801b90e: f000 feb7 bl 801c680 <tcp_free_ooseq>
  67935. if (pcb->state == SYN_RCVD) {
  67936. 801b912: 6afb ldr r3, [r7, #44] @ 0x2c
  67937. 801b914: 7d1b ldrb r3, [r3, #20]
  67938. 801b916: 2b03 cmp r3, #3
  67939. 801b918: d10b bne.n 801b932 <tcp_slowtmr+0x416>
  67940. if ((u32_t)(tcp_ticks - pcb->tmr) >
  67941. 801b91a: 4b61 ldr r3, [pc, #388] @ (801baa0 <tcp_slowtmr+0x584>)
  67942. 801b91c: 681a ldr r2, [r3, #0]
  67943. 801b91e: 6afb ldr r3, [r7, #44] @ 0x2c
  67944. 801b920: 6a1b ldr r3, [r3, #32]
  67945. 801b922: 1ad3 subs r3, r2, r3
  67946. 801b924: 2b28 cmp r3, #40 @ 0x28
  67947. 801b926: d904 bls.n 801b932 <tcp_slowtmr+0x416>
  67948. ++pcb_remove;
  67949. 801b928: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  67950. 801b92c: 3301 adds r3, #1
  67951. 801b92e: f887 3027 strb.w r3, [r7, #39] @ 0x27
  67952. if (pcb->state == LAST_ACK) {
  67953. 801b932: 6afb ldr r3, [r7, #44] @ 0x2c
  67954. 801b934: 7d1b ldrb r3, [r3, #20]
  67955. 801b936: 2b09 cmp r3, #9
  67956. 801b938: d10b bne.n 801b952 <tcp_slowtmr+0x436>
  67957. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  67958. 801b93a: 4b59 ldr r3, [pc, #356] @ (801baa0 <tcp_slowtmr+0x584>)
  67959. 801b93c: 681a ldr r2, [r3, #0]
  67960. 801b93e: 6afb ldr r3, [r7, #44] @ 0x2c
  67961. 801b940: 6a1b ldr r3, [r3, #32]
  67962. 801b942: 1ad3 subs r3, r2, r3
  67963. 801b944: 2bf0 cmp r3, #240 @ 0xf0
  67964. 801b946: d904 bls.n 801b952 <tcp_slowtmr+0x436>
  67965. ++pcb_remove;
  67966. 801b948: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  67967. 801b94c: 3301 adds r3, #1
  67968. 801b94e: f887 3027 strb.w r3, [r7, #39] @ 0x27
  67969. if (pcb_remove) {
  67970. 801b952: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  67971. 801b956: 2b00 cmp r3, #0
  67972. 801b958: d060 beq.n 801ba1c <tcp_slowtmr+0x500>
  67973. tcp_err_fn err_fn = pcb->errf;
  67974. 801b95a: 6afb ldr r3, [r7, #44] @ 0x2c
  67975. 801b95c: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  67976. 801b960: 60fb str r3, [r7, #12]
  67977. tcp_pcb_purge(pcb);
  67978. 801b962: 6af8 ldr r0, [r7, #44] @ 0x2c
  67979. 801b964: f000 fcd8 bl 801c318 <tcp_pcb_purge>
  67980. if (prev != NULL) {
  67981. 801b968: 6abb ldr r3, [r7, #40] @ 0x28
  67982. 801b96a: 2b00 cmp r3, #0
  67983. 801b96c: d010 beq.n 801b990 <tcp_slowtmr+0x474>
  67984. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
  67985. 801b96e: 4b50 ldr r3, [pc, #320] @ (801bab0 <tcp_slowtmr+0x594>)
  67986. 801b970: 681b ldr r3, [r3, #0]
  67987. 801b972: 6afa ldr r2, [r7, #44] @ 0x2c
  67988. 801b974: 429a cmp r2, r3
  67989. 801b976: d106 bne.n 801b986 <tcp_slowtmr+0x46a>
  67990. 801b978: 4b4e ldr r3, [pc, #312] @ (801bab4 <tcp_slowtmr+0x598>)
  67991. 801b97a: f240 526d movw r2, #1389 @ 0x56d
  67992. 801b97e: 494e ldr r1, [pc, #312] @ (801bab8 <tcp_slowtmr+0x59c>)
  67993. 801b980: 484e ldr r0, [pc, #312] @ (801babc <tcp_slowtmr+0x5a0>)
  67994. 801b982: f00e f823 bl 80299cc <iprintf>
  67995. prev->next = pcb->next;
  67996. 801b986: 6afb ldr r3, [r7, #44] @ 0x2c
  67997. 801b988: 68da ldr r2, [r3, #12]
  67998. 801b98a: 6abb ldr r3, [r7, #40] @ 0x28
  67999. 801b98c: 60da str r2, [r3, #12]
  68000. 801b98e: e00f b.n 801b9b0 <tcp_slowtmr+0x494>
  68001. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
  68002. 801b990: 4b47 ldr r3, [pc, #284] @ (801bab0 <tcp_slowtmr+0x594>)
  68003. 801b992: 681b ldr r3, [r3, #0]
  68004. 801b994: 6afa ldr r2, [r7, #44] @ 0x2c
  68005. 801b996: 429a cmp r2, r3
  68006. 801b998: d006 beq.n 801b9a8 <tcp_slowtmr+0x48c>
  68007. 801b99a: 4b46 ldr r3, [pc, #280] @ (801bab4 <tcp_slowtmr+0x598>)
  68008. 801b99c: f240 5271 movw r2, #1393 @ 0x571
  68009. 801b9a0: 4947 ldr r1, [pc, #284] @ (801bac0 <tcp_slowtmr+0x5a4>)
  68010. 801b9a2: 4846 ldr r0, [pc, #280] @ (801babc <tcp_slowtmr+0x5a0>)
  68011. 801b9a4: f00e f812 bl 80299cc <iprintf>
  68012. tcp_active_pcbs = pcb->next;
  68013. 801b9a8: 6afb ldr r3, [r7, #44] @ 0x2c
  68014. 801b9aa: 68db ldr r3, [r3, #12]
  68015. 801b9ac: 4a40 ldr r2, [pc, #256] @ (801bab0 <tcp_slowtmr+0x594>)
  68016. 801b9ae: 6013 str r3, [r2, #0]
  68017. if (pcb_reset) {
  68018. 801b9b0: f897 3026 ldrb.w r3, [r7, #38] @ 0x26
  68019. 801b9b4: 2b00 cmp r3, #0
  68020. 801b9b6: d013 beq.n 801b9e0 <tcp_slowtmr+0x4c4>
  68021. tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  68022. 801b9b8: 6afb ldr r3, [r7, #44] @ 0x2c
  68023. 801b9ba: 6d18 ldr r0, [r3, #80] @ 0x50
  68024. 801b9bc: 6afb ldr r3, [r7, #44] @ 0x2c
  68025. 801b9be: 6a5c ldr r4, [r3, #36] @ 0x24
  68026. 801b9c0: 6afd ldr r5, [r7, #44] @ 0x2c
  68027. 801b9c2: 6afb ldr r3, [r7, #44] @ 0x2c
  68028. 801b9c4: 3304 adds r3, #4
  68029. 801b9c6: 6afa ldr r2, [r7, #44] @ 0x2c
  68030. 801b9c8: 8ad2 ldrh r2, [r2, #22]
  68031. 801b9ca: 6af9 ldr r1, [r7, #44] @ 0x2c
  68032. 801b9cc: 8b09 ldrh r1, [r1, #24]
  68033. 801b9ce: 9102 str r1, [sp, #8]
  68034. 801b9d0: 9201 str r2, [sp, #4]
  68035. 801b9d2: 9300 str r3, [sp, #0]
  68036. 801b9d4: 462b mov r3, r5
  68037. 801b9d6: 4622 mov r2, r4
  68038. 801b9d8: 4601 mov r1, r0
  68039. 801b9da: 6af8 ldr r0, [r7, #44] @ 0x2c
  68040. 801b9dc: f004 ff2c bl 8020838 <tcp_rst>
  68041. err_arg = pcb->callback_arg;
  68042. 801b9e0: 6afb ldr r3, [r7, #44] @ 0x2c
  68043. 801b9e2: 691b ldr r3, [r3, #16]
  68044. 801b9e4: 60bb str r3, [r7, #8]
  68045. last_state = pcb->state;
  68046. 801b9e6: 6afb ldr r3, [r7, #44] @ 0x2c
  68047. 801b9e8: 7d1b ldrb r3, [r3, #20]
  68048. 801b9ea: 71fb strb r3, [r7, #7]
  68049. pcb2 = pcb;
  68050. 801b9ec: 6afb ldr r3, [r7, #44] @ 0x2c
  68051. 801b9ee: 603b str r3, [r7, #0]
  68052. pcb = pcb->next;
  68053. 801b9f0: 6afb ldr r3, [r7, #44] @ 0x2c
  68054. 801b9f2: 68db ldr r3, [r3, #12]
  68055. 801b9f4: 62fb str r3, [r7, #44] @ 0x2c
  68056. tcp_free(pcb2);
  68057. 801b9f6: 6838 ldr r0, [r7, #0]
  68058. 801b9f8: f7ff f82c bl 801aa54 <tcp_free>
  68059. tcp_active_pcbs_changed = 0;
  68060. 801b9fc: 4b31 ldr r3, [pc, #196] @ (801bac4 <tcp_slowtmr+0x5a8>)
  68061. 801b9fe: 2200 movs r2, #0
  68062. 801ba00: 701a strb r2, [r3, #0]
  68063. TCP_EVENT_ERR(last_state, err_fn, err_arg, ERR_ABRT);
  68064. 801ba02: 68fb ldr r3, [r7, #12]
  68065. 801ba04: 2b00 cmp r3, #0
  68066. 801ba06: d004 beq.n 801ba12 <tcp_slowtmr+0x4f6>
  68067. 801ba08: 68fb ldr r3, [r7, #12]
  68068. 801ba0a: f06f 010c mvn.w r1, #12
  68069. 801ba0e: 68b8 ldr r0, [r7, #8]
  68070. 801ba10: 4798 blx r3
  68071. if (tcp_active_pcbs_changed) {
  68072. 801ba12: 4b2c ldr r3, [pc, #176] @ (801bac4 <tcp_slowtmr+0x5a8>)
  68073. 801ba14: 781b ldrb r3, [r3, #0]
  68074. 801ba16: 2b00 cmp r3, #0
  68075. 801ba18: d037 beq.n 801ba8a <tcp_slowtmr+0x56e>
  68076. goto tcp_slowtmr_start;
  68077. 801ba1a: e592 b.n 801b542 <tcp_slowtmr+0x26>
  68078. prev = pcb;
  68079. 801ba1c: 6afb ldr r3, [r7, #44] @ 0x2c
  68080. 801ba1e: 62bb str r3, [r7, #40] @ 0x28
  68081. pcb = pcb->next;
  68082. 801ba20: 6afb ldr r3, [r7, #44] @ 0x2c
  68083. 801ba22: 68db ldr r3, [r3, #12]
  68084. 801ba24: 62fb str r3, [r7, #44] @ 0x2c
  68085. ++prev->polltmr;
  68086. 801ba26: 6abb ldr r3, [r7, #40] @ 0x28
  68087. 801ba28: 7f1b ldrb r3, [r3, #28]
  68088. 801ba2a: 3301 adds r3, #1
  68089. 801ba2c: b2da uxtb r2, r3
  68090. 801ba2e: 6abb ldr r3, [r7, #40] @ 0x28
  68091. 801ba30: 771a strb r2, [r3, #28]
  68092. if (prev->polltmr >= prev->pollinterval) {
  68093. 801ba32: 6abb ldr r3, [r7, #40] @ 0x28
  68094. 801ba34: 7f1a ldrb r2, [r3, #28]
  68095. 801ba36: 6abb ldr r3, [r7, #40] @ 0x28
  68096. 801ba38: 7f5b ldrb r3, [r3, #29]
  68097. 801ba3a: 429a cmp r2, r3
  68098. 801ba3c: d325 bcc.n 801ba8a <tcp_slowtmr+0x56e>
  68099. prev->polltmr = 0;
  68100. 801ba3e: 6abb ldr r3, [r7, #40] @ 0x28
  68101. 801ba40: 2200 movs r2, #0
  68102. 801ba42: 771a strb r2, [r3, #28]
  68103. tcp_active_pcbs_changed = 0;
  68104. 801ba44: 4b1f ldr r3, [pc, #124] @ (801bac4 <tcp_slowtmr+0x5a8>)
  68105. 801ba46: 2200 movs r2, #0
  68106. 801ba48: 701a strb r2, [r3, #0]
  68107. TCP_EVENT_POLL(prev, err);
  68108. 801ba4a: 6abb ldr r3, [r7, #40] @ 0x28
  68109. 801ba4c: f8d3 308c ldr.w r3, [r3, #140] @ 0x8c
  68110. 801ba50: 2b00 cmp r3, #0
  68111. 801ba52: d00b beq.n 801ba6c <tcp_slowtmr+0x550>
  68112. 801ba54: 6abb ldr r3, [r7, #40] @ 0x28
  68113. 801ba56: f8d3 308c ldr.w r3, [r3, #140] @ 0x8c
  68114. 801ba5a: 6aba ldr r2, [r7, #40] @ 0x28
  68115. 801ba5c: 6912 ldr r2, [r2, #16]
  68116. 801ba5e: 6ab9 ldr r1, [r7, #40] @ 0x28
  68117. 801ba60: 4610 mov r0, r2
  68118. 801ba62: 4798 blx r3
  68119. 801ba64: 4603 mov r3, r0
  68120. 801ba66: f887 3025 strb.w r3, [r7, #37] @ 0x25
  68121. 801ba6a: e002 b.n 801ba72 <tcp_slowtmr+0x556>
  68122. 801ba6c: 2300 movs r3, #0
  68123. 801ba6e: f887 3025 strb.w r3, [r7, #37] @ 0x25
  68124. if (tcp_active_pcbs_changed) {
  68125. 801ba72: 4b14 ldr r3, [pc, #80] @ (801bac4 <tcp_slowtmr+0x5a8>)
  68126. 801ba74: 781b ldrb r3, [r3, #0]
  68127. 801ba76: 2b00 cmp r3, #0
  68128. 801ba78: f47f ad62 bne.w 801b540 <tcp_slowtmr+0x24>
  68129. }
  68130. /* if err == ERR_ABRT, 'prev' is already deallocated */
  68131. if (err == ERR_OK) {
  68132. 801ba7c: f997 3025 ldrsb.w r3, [r7, #37] @ 0x25
  68133. 801ba80: 2b00 cmp r3, #0
  68134. 801ba82: d102 bne.n 801ba8a <tcp_slowtmr+0x56e>
  68135. tcp_output(prev);
  68136. 801ba84: 6ab8 ldr r0, [r7, #40] @ 0x28
  68137. 801ba86: f004 f915 bl 801fcb4 <tcp_output>
  68138. while (pcb != NULL) {
  68139. 801ba8a: 6afb ldr r3, [r7, #44] @ 0x2c
  68140. 801ba8c: 2b00 cmp r3, #0
  68141. 801ba8e: f47f ad5e bne.w 801b54e <tcp_slowtmr+0x32>
  68142. }
  68143. }
  68144. /* Steps through all of the TIME-WAIT PCBs. */
  68145. prev = NULL;
  68146. 801ba92: 2300 movs r3, #0
  68147. 801ba94: 62bb str r3, [r7, #40] @ 0x28
  68148. pcb = tcp_tw_pcbs;
  68149. 801ba96: 4b0c ldr r3, [pc, #48] @ (801bac8 <tcp_slowtmr+0x5ac>)
  68150. 801ba98: 681b ldr r3, [r3, #0]
  68151. 801ba9a: 62fb str r3, [r7, #44] @ 0x2c
  68152. while (pcb != NULL) {
  68153. 801ba9c: e069 b.n 801bb72 <tcp_slowtmr+0x656>
  68154. 801ba9e: bf00 nop
  68155. 801baa0: 2402ae88 .word 0x2402ae88
  68156. 801baa4: 000a4cb8 .word 0x000a4cb8
  68157. 801baa8: 10624dd3 .word 0x10624dd3
  68158. 801baac: 000124f8 .word 0x000124f8
  68159. 801bab0: 2402ae94 .word 0x2402ae94
  68160. 801bab4: 0802e5a8 .word 0x0802e5a8
  68161. 801bab8: 0802e9e0 .word 0x0802e9e0
  68162. 801babc: 0802e5ec .word 0x0802e5ec
  68163. 801bac0: 0802ea0c .word 0x0802ea0c
  68164. 801bac4: 2402ae9c .word 0x2402ae9c
  68165. 801bac8: 2402ae98 .word 0x2402ae98
  68166. LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  68167. 801bacc: 6afb ldr r3, [r7, #44] @ 0x2c
  68168. 801bace: 7d1b ldrb r3, [r3, #20]
  68169. 801bad0: 2b0a cmp r3, #10
  68170. 801bad2: d006 beq.n 801bae2 <tcp_slowtmr+0x5c6>
  68171. 801bad4: 4b2b ldr r3, [pc, #172] @ (801bb84 <tcp_slowtmr+0x668>)
  68172. 801bad6: f240 52a1 movw r2, #1441 @ 0x5a1
  68173. 801bada: 492b ldr r1, [pc, #172] @ (801bb88 <tcp_slowtmr+0x66c>)
  68174. 801badc: 482b ldr r0, [pc, #172] @ (801bb8c <tcp_slowtmr+0x670>)
  68175. 801bade: f00d ff75 bl 80299cc <iprintf>
  68176. pcb_remove = 0;
  68177. 801bae2: 2300 movs r3, #0
  68178. 801bae4: f887 3027 strb.w r3, [r7, #39] @ 0x27
  68179. /* Check if this PCB has stayed long enough in TIME-WAIT */
  68180. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  68181. 801bae8: 4b29 ldr r3, [pc, #164] @ (801bb90 <tcp_slowtmr+0x674>)
  68182. 801baea: 681a ldr r2, [r3, #0]
  68183. 801baec: 6afb ldr r3, [r7, #44] @ 0x2c
  68184. 801baee: 6a1b ldr r3, [r3, #32]
  68185. 801baf0: 1ad3 subs r3, r2, r3
  68186. 801baf2: 2bf0 cmp r3, #240 @ 0xf0
  68187. 801baf4: d904 bls.n 801bb00 <tcp_slowtmr+0x5e4>
  68188. ++pcb_remove;
  68189. 801baf6: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  68190. 801bafa: 3301 adds r3, #1
  68191. 801bafc: f887 3027 strb.w r3, [r7, #39] @ 0x27
  68192. }
  68193. /* If the PCB should be removed, do it. */
  68194. if (pcb_remove) {
  68195. 801bb00: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  68196. 801bb04: 2b00 cmp r3, #0
  68197. 801bb06: d02f beq.n 801bb68 <tcp_slowtmr+0x64c>
  68198. struct tcp_pcb *pcb2;
  68199. tcp_pcb_purge(pcb);
  68200. 801bb08: 6af8 ldr r0, [r7, #44] @ 0x2c
  68201. 801bb0a: f000 fc05 bl 801c318 <tcp_pcb_purge>
  68202. /* Remove PCB from tcp_tw_pcbs list. */
  68203. if (prev != NULL) {
  68204. 801bb0e: 6abb ldr r3, [r7, #40] @ 0x28
  68205. 801bb10: 2b00 cmp r3, #0
  68206. 801bb12: d010 beq.n 801bb36 <tcp_slowtmr+0x61a>
  68207. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
  68208. 801bb14: 4b1f ldr r3, [pc, #124] @ (801bb94 <tcp_slowtmr+0x678>)
  68209. 801bb16: 681b ldr r3, [r3, #0]
  68210. 801bb18: 6afa ldr r2, [r7, #44] @ 0x2c
  68211. 801bb1a: 429a cmp r2, r3
  68212. 801bb1c: d106 bne.n 801bb2c <tcp_slowtmr+0x610>
  68213. 801bb1e: 4b19 ldr r3, [pc, #100] @ (801bb84 <tcp_slowtmr+0x668>)
  68214. 801bb20: f240 52af movw r2, #1455 @ 0x5af
  68215. 801bb24: 491c ldr r1, [pc, #112] @ (801bb98 <tcp_slowtmr+0x67c>)
  68216. 801bb26: 4819 ldr r0, [pc, #100] @ (801bb8c <tcp_slowtmr+0x670>)
  68217. 801bb28: f00d ff50 bl 80299cc <iprintf>
  68218. prev->next = pcb->next;
  68219. 801bb2c: 6afb ldr r3, [r7, #44] @ 0x2c
  68220. 801bb2e: 68da ldr r2, [r3, #12]
  68221. 801bb30: 6abb ldr r3, [r7, #40] @ 0x28
  68222. 801bb32: 60da str r2, [r3, #12]
  68223. 801bb34: e00f b.n 801bb56 <tcp_slowtmr+0x63a>
  68224. } else {
  68225. /* This PCB was the first. */
  68226. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  68227. 801bb36: 4b17 ldr r3, [pc, #92] @ (801bb94 <tcp_slowtmr+0x678>)
  68228. 801bb38: 681b ldr r3, [r3, #0]
  68229. 801bb3a: 6afa ldr r2, [r7, #44] @ 0x2c
  68230. 801bb3c: 429a cmp r2, r3
  68231. 801bb3e: d006 beq.n 801bb4e <tcp_slowtmr+0x632>
  68232. 801bb40: 4b10 ldr r3, [pc, #64] @ (801bb84 <tcp_slowtmr+0x668>)
  68233. 801bb42: f240 52b3 movw r2, #1459 @ 0x5b3
  68234. 801bb46: 4915 ldr r1, [pc, #84] @ (801bb9c <tcp_slowtmr+0x680>)
  68235. 801bb48: 4810 ldr r0, [pc, #64] @ (801bb8c <tcp_slowtmr+0x670>)
  68236. 801bb4a: f00d ff3f bl 80299cc <iprintf>
  68237. tcp_tw_pcbs = pcb->next;
  68238. 801bb4e: 6afb ldr r3, [r7, #44] @ 0x2c
  68239. 801bb50: 68db ldr r3, [r3, #12]
  68240. 801bb52: 4a10 ldr r2, [pc, #64] @ (801bb94 <tcp_slowtmr+0x678>)
  68241. 801bb54: 6013 str r3, [r2, #0]
  68242. }
  68243. pcb2 = pcb;
  68244. 801bb56: 6afb ldr r3, [r7, #44] @ 0x2c
  68245. 801bb58: 61fb str r3, [r7, #28]
  68246. pcb = pcb->next;
  68247. 801bb5a: 6afb ldr r3, [r7, #44] @ 0x2c
  68248. 801bb5c: 68db ldr r3, [r3, #12]
  68249. 801bb5e: 62fb str r3, [r7, #44] @ 0x2c
  68250. tcp_free(pcb2);
  68251. 801bb60: 69f8 ldr r0, [r7, #28]
  68252. 801bb62: f7fe ff77 bl 801aa54 <tcp_free>
  68253. 801bb66: e004 b.n 801bb72 <tcp_slowtmr+0x656>
  68254. } else {
  68255. prev = pcb;
  68256. 801bb68: 6afb ldr r3, [r7, #44] @ 0x2c
  68257. 801bb6a: 62bb str r3, [r7, #40] @ 0x28
  68258. pcb = pcb->next;
  68259. 801bb6c: 6afb ldr r3, [r7, #44] @ 0x2c
  68260. 801bb6e: 68db ldr r3, [r3, #12]
  68261. 801bb70: 62fb str r3, [r7, #44] @ 0x2c
  68262. while (pcb != NULL) {
  68263. 801bb72: 6afb ldr r3, [r7, #44] @ 0x2c
  68264. 801bb74: 2b00 cmp r3, #0
  68265. 801bb76: d1a9 bne.n 801bacc <tcp_slowtmr+0x5b0>
  68266. }
  68267. }
  68268. }
  68269. 801bb78: bf00 nop
  68270. 801bb7a: bf00 nop
  68271. 801bb7c: 3730 adds r7, #48 @ 0x30
  68272. 801bb7e: 46bd mov sp, r7
  68273. 801bb80: bdb0 pop {r4, r5, r7, pc}
  68274. 801bb82: bf00 nop
  68275. 801bb84: 0802e5a8 .word 0x0802e5a8
  68276. 801bb88: 0802ea38 .word 0x0802ea38
  68277. 801bb8c: 0802e5ec .word 0x0802e5ec
  68278. 801bb90: 2402ae88 .word 0x2402ae88
  68279. 801bb94: 2402ae98 .word 0x2402ae98
  68280. 801bb98: 0802ea68 .word 0x0802ea68
  68281. 801bb9c: 0802ea90 .word 0x0802ea90
  68282. 0801bba0 <tcp_fasttmr>:
  68283. *
  68284. * Automatically called from tcp_tmr().
  68285. */
  68286. void
  68287. tcp_fasttmr(void)
  68288. {
  68289. 801bba0: b580 push {r7, lr}
  68290. 801bba2: b082 sub sp, #8
  68291. 801bba4: af00 add r7, sp, #0
  68292. struct tcp_pcb *pcb;
  68293. ++tcp_timer_ctr;
  68294. 801bba6: 4b2d ldr r3, [pc, #180] @ (801bc5c <tcp_fasttmr+0xbc>)
  68295. 801bba8: 781b ldrb r3, [r3, #0]
  68296. 801bbaa: 3301 adds r3, #1
  68297. 801bbac: b2da uxtb r2, r3
  68298. 801bbae: 4b2b ldr r3, [pc, #172] @ (801bc5c <tcp_fasttmr+0xbc>)
  68299. 801bbb0: 701a strb r2, [r3, #0]
  68300. tcp_fasttmr_start:
  68301. pcb = tcp_active_pcbs;
  68302. 801bbb2: 4b2b ldr r3, [pc, #172] @ (801bc60 <tcp_fasttmr+0xc0>)
  68303. 801bbb4: 681b ldr r3, [r3, #0]
  68304. 801bbb6: 607b str r3, [r7, #4]
  68305. while (pcb != NULL) {
  68306. 801bbb8: e048 b.n 801bc4c <tcp_fasttmr+0xac>
  68307. if (pcb->last_timer != tcp_timer_ctr) {
  68308. 801bbba: 687b ldr r3, [r7, #4]
  68309. 801bbbc: 7f9a ldrb r2, [r3, #30]
  68310. 801bbbe: 4b27 ldr r3, [pc, #156] @ (801bc5c <tcp_fasttmr+0xbc>)
  68311. 801bbc0: 781b ldrb r3, [r3, #0]
  68312. 801bbc2: 429a cmp r2, r3
  68313. 801bbc4: d03f beq.n 801bc46 <tcp_fasttmr+0xa6>
  68314. struct tcp_pcb *next;
  68315. pcb->last_timer = tcp_timer_ctr;
  68316. 801bbc6: 4b25 ldr r3, [pc, #148] @ (801bc5c <tcp_fasttmr+0xbc>)
  68317. 801bbc8: 781a ldrb r2, [r3, #0]
  68318. 801bbca: 687b ldr r3, [r7, #4]
  68319. 801bbcc: 779a strb r2, [r3, #30]
  68320. /* send delayed ACKs */
  68321. if (pcb->flags & TF_ACK_DELAY) {
  68322. 801bbce: 687b ldr r3, [r7, #4]
  68323. 801bbd0: 8b5b ldrh r3, [r3, #26]
  68324. 801bbd2: f003 0301 and.w r3, r3, #1
  68325. 801bbd6: 2b00 cmp r3, #0
  68326. 801bbd8: d010 beq.n 801bbfc <tcp_fasttmr+0x5c>
  68327. LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
  68328. tcp_ack_now(pcb);
  68329. 801bbda: 687b ldr r3, [r7, #4]
  68330. 801bbdc: 8b5b ldrh r3, [r3, #26]
  68331. 801bbde: f043 0302 orr.w r3, r3, #2
  68332. 801bbe2: b29a uxth r2, r3
  68333. 801bbe4: 687b ldr r3, [r7, #4]
  68334. 801bbe6: 835a strh r2, [r3, #26]
  68335. tcp_output(pcb);
  68336. 801bbe8: 6878 ldr r0, [r7, #4]
  68337. 801bbea: f004 f863 bl 801fcb4 <tcp_output>
  68338. tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
  68339. 801bbee: 687b ldr r3, [r7, #4]
  68340. 801bbf0: 8b5b ldrh r3, [r3, #26]
  68341. 801bbf2: f023 0303 bic.w r3, r3, #3
  68342. 801bbf6: b29a uxth r2, r3
  68343. 801bbf8: 687b ldr r3, [r7, #4]
  68344. 801bbfa: 835a strh r2, [r3, #26]
  68345. }
  68346. /* send pending FIN */
  68347. if (pcb->flags & TF_CLOSEPEND) {
  68348. 801bbfc: 687b ldr r3, [r7, #4]
  68349. 801bbfe: 8b5b ldrh r3, [r3, #26]
  68350. 801bc00: f003 0308 and.w r3, r3, #8
  68351. 801bc04: 2b00 cmp r3, #0
  68352. 801bc06: d009 beq.n 801bc1c <tcp_fasttmr+0x7c>
  68353. LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: pending FIN\n"));
  68354. tcp_clear_flags(pcb, TF_CLOSEPEND);
  68355. 801bc08: 687b ldr r3, [r7, #4]
  68356. 801bc0a: 8b5b ldrh r3, [r3, #26]
  68357. 801bc0c: f023 0308 bic.w r3, r3, #8
  68358. 801bc10: b29a uxth r2, r3
  68359. 801bc12: 687b ldr r3, [r7, #4]
  68360. 801bc14: 835a strh r2, [r3, #26]
  68361. tcp_close_shutdown_fin(pcb);
  68362. 801bc16: 6878 ldr r0, [r7, #4]
  68363. 801bc18: f7ff f8b0 bl 801ad7c <tcp_close_shutdown_fin>
  68364. }
  68365. next = pcb->next;
  68366. 801bc1c: 687b ldr r3, [r7, #4]
  68367. 801bc1e: 68db ldr r3, [r3, #12]
  68368. 801bc20: 603b str r3, [r7, #0]
  68369. /* If there is data which was previously "refused" by upper layer */
  68370. if (pcb->refused_data != NULL) {
  68371. 801bc22: 687b ldr r3, [r7, #4]
  68372. 801bc24: 6f9b ldr r3, [r3, #120] @ 0x78
  68373. 801bc26: 2b00 cmp r3, #0
  68374. 801bc28: d00a beq.n 801bc40 <tcp_fasttmr+0xa0>
  68375. tcp_active_pcbs_changed = 0;
  68376. 801bc2a: 4b0e ldr r3, [pc, #56] @ (801bc64 <tcp_fasttmr+0xc4>)
  68377. 801bc2c: 2200 movs r2, #0
  68378. 801bc2e: 701a strb r2, [r3, #0]
  68379. tcp_process_refused_data(pcb);
  68380. 801bc30: 6878 ldr r0, [r7, #4]
  68381. 801bc32: f000 f819 bl 801bc68 <tcp_process_refused_data>
  68382. if (tcp_active_pcbs_changed) {
  68383. 801bc36: 4b0b ldr r3, [pc, #44] @ (801bc64 <tcp_fasttmr+0xc4>)
  68384. 801bc38: 781b ldrb r3, [r3, #0]
  68385. 801bc3a: 2b00 cmp r3, #0
  68386. 801bc3c: d000 beq.n 801bc40 <tcp_fasttmr+0xa0>
  68387. /* application callback has changed the pcb list: restart the loop */
  68388. goto tcp_fasttmr_start;
  68389. 801bc3e: e7b8 b.n 801bbb2 <tcp_fasttmr+0x12>
  68390. }
  68391. }
  68392. pcb = next;
  68393. 801bc40: 683b ldr r3, [r7, #0]
  68394. 801bc42: 607b str r3, [r7, #4]
  68395. 801bc44: e002 b.n 801bc4c <tcp_fasttmr+0xac>
  68396. } else {
  68397. pcb = pcb->next;
  68398. 801bc46: 687b ldr r3, [r7, #4]
  68399. 801bc48: 68db ldr r3, [r3, #12]
  68400. 801bc4a: 607b str r3, [r7, #4]
  68401. while (pcb != NULL) {
  68402. 801bc4c: 687b ldr r3, [r7, #4]
  68403. 801bc4e: 2b00 cmp r3, #0
  68404. 801bc50: d1b3 bne.n 801bbba <tcp_fasttmr+0x1a>
  68405. }
  68406. }
  68407. }
  68408. 801bc52: bf00 nop
  68409. 801bc54: bf00 nop
  68410. 801bc56: 3708 adds r7, #8
  68411. 801bc58: 46bd mov sp, r7
  68412. 801bc5a: bd80 pop {r7, pc}
  68413. 801bc5c: 2402ae9e .word 0x2402ae9e
  68414. 801bc60: 2402ae94 .word 0x2402ae94
  68415. 801bc64: 2402ae9c .word 0x2402ae9c
  68416. 0801bc68 <tcp_process_refused_data>:
  68417. }
  68418. /** Pass pcb->refused_data to the recv callback */
  68419. err_t
  68420. tcp_process_refused_data(struct tcp_pcb *pcb)
  68421. {
  68422. 801bc68: b590 push {r4, r7, lr}
  68423. 801bc6a: b085 sub sp, #20
  68424. 801bc6c: af00 add r7, sp, #0
  68425. 801bc6e: 6078 str r0, [r7, #4]
  68426. #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
  68427. struct pbuf *rest;
  68428. #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  68429. LWIP_ERROR("tcp_process_refused_data: invalid pcb", pcb != NULL, return ERR_ARG);
  68430. 801bc70: 687b ldr r3, [r7, #4]
  68431. 801bc72: 2b00 cmp r3, #0
  68432. 801bc74: d109 bne.n 801bc8a <tcp_process_refused_data+0x22>
  68433. 801bc76: 4b38 ldr r3, [pc, #224] @ (801bd58 <tcp_process_refused_data+0xf0>)
  68434. 801bc78: f240 6209 movw r2, #1545 @ 0x609
  68435. 801bc7c: 4937 ldr r1, [pc, #220] @ (801bd5c <tcp_process_refused_data+0xf4>)
  68436. 801bc7e: 4838 ldr r0, [pc, #224] @ (801bd60 <tcp_process_refused_data+0xf8>)
  68437. 801bc80: f00d fea4 bl 80299cc <iprintf>
  68438. 801bc84: f06f 030f mvn.w r3, #15
  68439. 801bc88: e061 b.n 801bd4e <tcp_process_refused_data+0xe6>
  68440. #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
  68441. while (pcb->refused_data != NULL)
  68442. #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  68443. {
  68444. err_t err;
  68445. u8_t refused_flags = pcb->refused_data->flags;
  68446. 801bc8a: 687b ldr r3, [r7, #4]
  68447. 801bc8c: 6f9b ldr r3, [r3, #120] @ 0x78
  68448. 801bc8e: 7b5b ldrb r3, [r3, #13]
  68449. 801bc90: 73bb strb r3, [r7, #14]
  68450. /* set pcb->refused_data to NULL in case the callback frees it and then
  68451. closes the pcb */
  68452. struct pbuf *refused_data = pcb->refused_data;
  68453. 801bc92: 687b ldr r3, [r7, #4]
  68454. 801bc94: 6f9b ldr r3, [r3, #120] @ 0x78
  68455. 801bc96: 60bb str r3, [r7, #8]
  68456. #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
  68457. pbuf_split_64k(refused_data, &rest);
  68458. pcb->refused_data = rest;
  68459. #else /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  68460. pcb->refused_data = NULL;
  68461. 801bc98: 687b ldr r3, [r7, #4]
  68462. 801bc9a: 2200 movs r2, #0
  68463. 801bc9c: 679a str r2, [r3, #120] @ 0x78
  68464. #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  68465. /* Notify again application with data previously received. */
  68466. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n"));
  68467. TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);
  68468. 801bc9e: 687b ldr r3, [r7, #4]
  68469. 801bca0: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  68470. 801bca4: 2b00 cmp r3, #0
  68471. 801bca6: d00b beq.n 801bcc0 <tcp_process_refused_data+0x58>
  68472. 801bca8: 687b ldr r3, [r7, #4]
  68473. 801bcaa: f8d3 4084 ldr.w r4, [r3, #132] @ 0x84
  68474. 801bcae: 687b ldr r3, [r7, #4]
  68475. 801bcb0: 6918 ldr r0, [r3, #16]
  68476. 801bcb2: 2300 movs r3, #0
  68477. 801bcb4: 68ba ldr r2, [r7, #8]
  68478. 801bcb6: 6879 ldr r1, [r7, #4]
  68479. 801bcb8: 47a0 blx r4
  68480. 801bcba: 4603 mov r3, r0
  68481. 801bcbc: 73fb strb r3, [r7, #15]
  68482. 801bcbe: e007 b.n 801bcd0 <tcp_process_refused_data+0x68>
  68483. 801bcc0: 2300 movs r3, #0
  68484. 801bcc2: 68ba ldr r2, [r7, #8]
  68485. 801bcc4: 6879 ldr r1, [r7, #4]
  68486. 801bcc6: 2000 movs r0, #0
  68487. 801bcc8: f000 f8a6 bl 801be18 <tcp_recv_null>
  68488. 801bccc: 4603 mov r3, r0
  68489. 801bcce: 73fb strb r3, [r7, #15]
  68490. if (err == ERR_OK) {
  68491. 801bcd0: f997 300f ldrsb.w r3, [r7, #15]
  68492. 801bcd4: 2b00 cmp r3, #0
  68493. 801bcd6: d12b bne.n 801bd30 <tcp_process_refused_data+0xc8>
  68494. /* did refused_data include a FIN? */
  68495. if ((refused_flags & PBUF_FLAG_TCP_FIN)
  68496. 801bcd8: 7bbb ldrb r3, [r7, #14]
  68497. 801bcda: f003 0320 and.w r3, r3, #32
  68498. 801bcde: 2b00 cmp r3, #0
  68499. 801bce0: d034 beq.n 801bd4c <tcp_process_refused_data+0xe4>
  68500. && (rest == NULL)
  68501. #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  68502. ) {
  68503. /* correct rcv_wnd as the application won't call tcp_recved()
  68504. for the FIN's seqno */
  68505. if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {
  68506. 801bce2: 687b ldr r3, [r7, #4]
  68507. 801bce4: 8d1b ldrh r3, [r3, #40] @ 0x28
  68508. 801bce6: f241 62d0 movw r2, #5840 @ 0x16d0
  68509. 801bcea: 4293 cmp r3, r2
  68510. 801bcec: d005 beq.n 801bcfa <tcp_process_refused_data+0x92>
  68511. pcb->rcv_wnd++;
  68512. 801bcee: 687b ldr r3, [r7, #4]
  68513. 801bcf0: 8d1b ldrh r3, [r3, #40] @ 0x28
  68514. 801bcf2: 3301 adds r3, #1
  68515. 801bcf4: b29a uxth r2, r3
  68516. 801bcf6: 687b ldr r3, [r7, #4]
  68517. 801bcf8: 851a strh r2, [r3, #40] @ 0x28
  68518. }
  68519. TCP_EVENT_CLOSED(pcb, err);
  68520. 801bcfa: 687b ldr r3, [r7, #4]
  68521. 801bcfc: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  68522. 801bd00: 2b00 cmp r3, #0
  68523. 801bd02: d00b beq.n 801bd1c <tcp_process_refused_data+0xb4>
  68524. 801bd04: 687b ldr r3, [r7, #4]
  68525. 801bd06: f8d3 4084 ldr.w r4, [r3, #132] @ 0x84
  68526. 801bd0a: 687b ldr r3, [r7, #4]
  68527. 801bd0c: 6918 ldr r0, [r3, #16]
  68528. 801bd0e: 2300 movs r3, #0
  68529. 801bd10: 2200 movs r2, #0
  68530. 801bd12: 6879 ldr r1, [r7, #4]
  68531. 801bd14: 47a0 blx r4
  68532. 801bd16: 4603 mov r3, r0
  68533. 801bd18: 73fb strb r3, [r7, #15]
  68534. 801bd1a: e001 b.n 801bd20 <tcp_process_refused_data+0xb8>
  68535. 801bd1c: 2300 movs r3, #0
  68536. 801bd1e: 73fb strb r3, [r7, #15]
  68537. if (err == ERR_ABRT) {
  68538. 801bd20: f997 300f ldrsb.w r3, [r7, #15]
  68539. 801bd24: f113 0f0d cmn.w r3, #13
  68540. 801bd28: d110 bne.n 801bd4c <tcp_process_refused_data+0xe4>
  68541. return ERR_ABRT;
  68542. 801bd2a: f06f 030c mvn.w r3, #12
  68543. 801bd2e: e00e b.n 801bd4e <tcp_process_refused_data+0xe6>
  68544. }
  68545. }
  68546. } else if (err == ERR_ABRT) {
  68547. 801bd30: f997 300f ldrsb.w r3, [r7, #15]
  68548. 801bd34: f113 0f0d cmn.w r3, #13
  68549. 801bd38: d102 bne.n 801bd40 <tcp_process_refused_data+0xd8>
  68550. /* if err == ERR_ABRT, 'pcb' is already deallocated */
  68551. /* Drop incoming packets because pcb is "full" (only if the incoming
  68552. segment contains data). */
  68553. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n"));
  68554. return ERR_ABRT;
  68555. 801bd3a: f06f 030c mvn.w r3, #12
  68556. 801bd3e: e006 b.n 801bd4e <tcp_process_refused_data+0xe6>
  68557. #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
  68558. if (rest != NULL) {
  68559. pbuf_cat(refused_data, rest);
  68560. }
  68561. #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  68562. pcb->refused_data = refused_data;
  68563. 801bd40: 687b ldr r3, [r7, #4]
  68564. 801bd42: 68ba ldr r2, [r7, #8]
  68565. 801bd44: 679a str r2, [r3, #120] @ 0x78
  68566. return ERR_INPROGRESS;
  68567. 801bd46: f06f 0304 mvn.w r3, #4
  68568. 801bd4a: e000 b.n 801bd4e <tcp_process_refused_data+0xe6>
  68569. }
  68570. }
  68571. return ERR_OK;
  68572. 801bd4c: 2300 movs r3, #0
  68573. }
  68574. 801bd4e: 4618 mov r0, r3
  68575. 801bd50: 3714 adds r7, #20
  68576. 801bd52: 46bd mov sp, r7
  68577. 801bd54: bd90 pop {r4, r7, pc}
  68578. 801bd56: bf00 nop
  68579. 801bd58: 0802e5a8 .word 0x0802e5a8
  68580. 801bd5c: 0802eab8 .word 0x0802eab8
  68581. 801bd60: 0802e5ec .word 0x0802e5ec
  68582. 0801bd64 <tcp_segs_free>:
  68583. *
  68584. * @param seg tcp_seg list of TCP segments to free
  68585. */
  68586. void
  68587. tcp_segs_free(struct tcp_seg *seg)
  68588. {
  68589. 801bd64: b580 push {r7, lr}
  68590. 801bd66: b084 sub sp, #16
  68591. 801bd68: af00 add r7, sp, #0
  68592. 801bd6a: 6078 str r0, [r7, #4]
  68593. while (seg != NULL) {
  68594. 801bd6c: e007 b.n 801bd7e <tcp_segs_free+0x1a>
  68595. struct tcp_seg *next = seg->next;
  68596. 801bd6e: 687b ldr r3, [r7, #4]
  68597. 801bd70: 681b ldr r3, [r3, #0]
  68598. 801bd72: 60fb str r3, [r7, #12]
  68599. tcp_seg_free(seg);
  68600. 801bd74: 6878 ldr r0, [r7, #4]
  68601. 801bd76: f000 f80a bl 801bd8e <tcp_seg_free>
  68602. seg = next;
  68603. 801bd7a: 68fb ldr r3, [r7, #12]
  68604. 801bd7c: 607b str r3, [r7, #4]
  68605. while (seg != NULL) {
  68606. 801bd7e: 687b ldr r3, [r7, #4]
  68607. 801bd80: 2b00 cmp r3, #0
  68608. 801bd82: d1f4 bne.n 801bd6e <tcp_segs_free+0xa>
  68609. }
  68610. }
  68611. 801bd84: bf00 nop
  68612. 801bd86: bf00 nop
  68613. 801bd88: 3710 adds r7, #16
  68614. 801bd8a: 46bd mov sp, r7
  68615. 801bd8c: bd80 pop {r7, pc}
  68616. 0801bd8e <tcp_seg_free>:
  68617. *
  68618. * @param seg single tcp_seg to free
  68619. */
  68620. void
  68621. tcp_seg_free(struct tcp_seg *seg)
  68622. {
  68623. 801bd8e: b580 push {r7, lr}
  68624. 801bd90: b082 sub sp, #8
  68625. 801bd92: af00 add r7, sp, #0
  68626. 801bd94: 6078 str r0, [r7, #4]
  68627. if (seg != NULL) {
  68628. 801bd96: 687b ldr r3, [r7, #4]
  68629. 801bd98: 2b00 cmp r3, #0
  68630. 801bd9a: d00c beq.n 801bdb6 <tcp_seg_free+0x28>
  68631. if (seg->p != NULL) {
  68632. 801bd9c: 687b ldr r3, [r7, #4]
  68633. 801bd9e: 685b ldr r3, [r3, #4]
  68634. 801bda0: 2b00 cmp r3, #0
  68635. 801bda2: d004 beq.n 801bdae <tcp_seg_free+0x20>
  68636. pbuf_free(seg->p);
  68637. 801bda4: 687b ldr r3, [r7, #4]
  68638. 801bda6: 685b ldr r3, [r3, #4]
  68639. 801bda8: 4618 mov r0, r3
  68640. 801bdaa: f7fe fb97 bl 801a4dc <pbuf_free>
  68641. #if TCP_DEBUG
  68642. seg->p = NULL;
  68643. #endif /* TCP_DEBUG */
  68644. }
  68645. memp_free(MEMP_TCP_SEG, seg);
  68646. 801bdae: 6879 ldr r1, [r7, #4]
  68647. 801bdb0: 2003 movs r0, #3
  68648. 801bdb2: f7fd fca5 bl 8019700 <memp_free>
  68649. }
  68650. }
  68651. 801bdb6: bf00 nop
  68652. 801bdb8: 3708 adds r7, #8
  68653. 801bdba: 46bd mov sp, r7
  68654. 801bdbc: bd80 pop {r7, pc}
  68655. ...
  68656. 0801bdc0 <tcp_seg_copy>:
  68657. * @param seg the old tcp_seg
  68658. * @return a copy of seg
  68659. */
  68660. struct tcp_seg *
  68661. tcp_seg_copy(struct tcp_seg *seg)
  68662. {
  68663. 801bdc0: b580 push {r7, lr}
  68664. 801bdc2: b084 sub sp, #16
  68665. 801bdc4: af00 add r7, sp, #0
  68666. 801bdc6: 6078 str r0, [r7, #4]
  68667. struct tcp_seg *cseg;
  68668. LWIP_ASSERT("tcp_seg_copy: invalid seg", seg != NULL);
  68669. 801bdc8: 687b ldr r3, [r7, #4]
  68670. 801bdca: 2b00 cmp r3, #0
  68671. 801bdcc: d106 bne.n 801bddc <tcp_seg_copy+0x1c>
  68672. 801bdce: 4b0f ldr r3, [pc, #60] @ (801be0c <tcp_seg_copy+0x4c>)
  68673. 801bdd0: f240 6282 movw r2, #1666 @ 0x682
  68674. 801bdd4: 490e ldr r1, [pc, #56] @ (801be10 <tcp_seg_copy+0x50>)
  68675. 801bdd6: 480f ldr r0, [pc, #60] @ (801be14 <tcp_seg_copy+0x54>)
  68676. 801bdd8: f00d fdf8 bl 80299cc <iprintf>
  68677. cseg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG);
  68678. 801bddc: 2003 movs r0, #3
  68679. 801bdde: f7fd fc19 bl 8019614 <memp_malloc>
  68680. 801bde2: 60f8 str r0, [r7, #12]
  68681. if (cseg == NULL) {
  68682. 801bde4: 68fb ldr r3, [r7, #12]
  68683. 801bde6: 2b00 cmp r3, #0
  68684. 801bde8: d101 bne.n 801bdee <tcp_seg_copy+0x2e>
  68685. return NULL;
  68686. 801bdea: 2300 movs r3, #0
  68687. 801bdec: e00a b.n 801be04 <tcp_seg_copy+0x44>
  68688. }
  68689. SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg));
  68690. 801bdee: 2214 movs r2, #20
  68691. 801bdf0: 6879 ldr r1, [r7, #4]
  68692. 801bdf2: 68f8 ldr r0, [r7, #12]
  68693. 801bdf4: f00e f873 bl 8029ede <memcpy>
  68694. pbuf_ref(cseg->p);
  68695. 801bdf8: 68fb ldr r3, [r7, #12]
  68696. 801bdfa: 685b ldr r3, [r3, #4]
  68697. 801bdfc: 4618 mov r0, r3
  68698. 801bdfe: f7fe fc13 bl 801a628 <pbuf_ref>
  68699. return cseg;
  68700. 801be02: 68fb ldr r3, [r7, #12]
  68701. }
  68702. 801be04: 4618 mov r0, r3
  68703. 801be06: 3710 adds r7, #16
  68704. 801be08: 46bd mov sp, r7
  68705. 801be0a: bd80 pop {r7, pc}
  68706. 801be0c: 0802e5a8 .word 0x0802e5a8
  68707. 801be10: 0802eafc .word 0x0802eafc
  68708. 801be14: 0802e5ec .word 0x0802e5ec
  68709. 0801be18 <tcp_recv_null>:
  68710. * Default receive callback that is called if the user didn't register
  68711. * a recv callback for the pcb.
  68712. */
  68713. err_t
  68714. tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  68715. {
  68716. 801be18: b580 push {r7, lr}
  68717. 801be1a: b084 sub sp, #16
  68718. 801be1c: af00 add r7, sp, #0
  68719. 801be1e: 60f8 str r0, [r7, #12]
  68720. 801be20: 60b9 str r1, [r7, #8]
  68721. 801be22: 607a str r2, [r7, #4]
  68722. 801be24: 70fb strb r3, [r7, #3]
  68723. LWIP_UNUSED_ARG(arg);
  68724. LWIP_ERROR("tcp_recv_null: invalid pcb", pcb != NULL, return ERR_ARG);
  68725. 801be26: 68bb ldr r3, [r7, #8]
  68726. 801be28: 2b00 cmp r3, #0
  68727. 801be2a: d109 bne.n 801be40 <tcp_recv_null+0x28>
  68728. 801be2c: 4b12 ldr r3, [pc, #72] @ (801be78 <tcp_recv_null+0x60>)
  68729. 801be2e: f44f 62d3 mov.w r2, #1688 @ 0x698
  68730. 801be32: 4912 ldr r1, [pc, #72] @ (801be7c <tcp_recv_null+0x64>)
  68731. 801be34: 4812 ldr r0, [pc, #72] @ (801be80 <tcp_recv_null+0x68>)
  68732. 801be36: f00d fdc9 bl 80299cc <iprintf>
  68733. 801be3a: f06f 030f mvn.w r3, #15
  68734. 801be3e: e016 b.n 801be6e <tcp_recv_null+0x56>
  68735. if (p != NULL) {
  68736. 801be40: 687b ldr r3, [r7, #4]
  68737. 801be42: 2b00 cmp r3, #0
  68738. 801be44: d009 beq.n 801be5a <tcp_recv_null+0x42>
  68739. tcp_recved(pcb, p->tot_len);
  68740. 801be46: 687b ldr r3, [r7, #4]
  68741. 801be48: 891b ldrh r3, [r3, #8]
  68742. 801be4a: 4619 mov r1, r3
  68743. 801be4c: 68b8 ldr r0, [r7, #8]
  68744. 801be4e: f7ff f9b1 bl 801b1b4 <tcp_recved>
  68745. pbuf_free(p);
  68746. 801be52: 6878 ldr r0, [r7, #4]
  68747. 801be54: f7fe fb42 bl 801a4dc <pbuf_free>
  68748. 801be58: e008 b.n 801be6c <tcp_recv_null+0x54>
  68749. } else if (err == ERR_OK) {
  68750. 801be5a: f997 3003 ldrsb.w r3, [r7, #3]
  68751. 801be5e: 2b00 cmp r3, #0
  68752. 801be60: d104 bne.n 801be6c <tcp_recv_null+0x54>
  68753. return tcp_close(pcb);
  68754. 801be62: 68b8 ldr r0, [r7, #8]
  68755. 801be64: f7fe fff4 bl 801ae50 <tcp_close>
  68756. 801be68: 4603 mov r3, r0
  68757. 801be6a: e000 b.n 801be6e <tcp_recv_null+0x56>
  68758. }
  68759. return ERR_OK;
  68760. 801be6c: 2300 movs r3, #0
  68761. }
  68762. 801be6e: 4618 mov r0, r3
  68763. 801be70: 3710 adds r7, #16
  68764. 801be72: 46bd mov sp, r7
  68765. 801be74: bd80 pop {r7, pc}
  68766. 801be76: bf00 nop
  68767. 801be78: 0802e5a8 .word 0x0802e5a8
  68768. 801be7c: 0802eb18 .word 0x0802eb18
  68769. 801be80: 0802e5ec .word 0x0802e5ec
  68770. 0801be84 <tcp_kill_prio>:
  68771. *
  68772. * @param prio minimum priority
  68773. */
  68774. static void
  68775. tcp_kill_prio(u8_t prio)
  68776. {
  68777. 801be84: b580 push {r7, lr}
  68778. 801be86: b086 sub sp, #24
  68779. 801be88: af00 add r7, sp, #0
  68780. 801be8a: 4603 mov r3, r0
  68781. 801be8c: 71fb strb r3, [r7, #7]
  68782. struct tcp_pcb *pcb, *inactive;
  68783. u32_t inactivity;
  68784. u8_t mprio;
  68785. mprio = LWIP_MIN(TCP_PRIO_MAX, prio);
  68786. 801be8e: f997 3007 ldrsb.w r3, [r7, #7]
  68787. 801be92: 2b00 cmp r3, #0
  68788. 801be94: db01 blt.n 801be9a <tcp_kill_prio+0x16>
  68789. 801be96: 79fb ldrb r3, [r7, #7]
  68790. 801be98: e000 b.n 801be9c <tcp_kill_prio+0x18>
  68791. 801be9a: 237f movs r3, #127 @ 0x7f
  68792. 801be9c: 72fb strb r3, [r7, #11]
  68793. /* We want to kill connections with a lower prio, so bail out if
  68794. * supplied prio is 0 - there can never be a lower prio
  68795. */
  68796. if (mprio == 0) {
  68797. 801be9e: 7afb ldrb r3, [r7, #11]
  68798. 801bea0: 2b00 cmp r3, #0
  68799. 801bea2: d034 beq.n 801bf0e <tcp_kill_prio+0x8a>
  68800. /* We only want kill connections with a lower prio, so decrement prio by one
  68801. * and start searching for oldest connection with same or lower priority than mprio.
  68802. * We want to find the connections with the lowest possible prio, and among
  68803. * these the one with the longest inactivity time.
  68804. */
  68805. mprio--;
  68806. 801bea4: 7afb ldrb r3, [r7, #11]
  68807. 801bea6: 3b01 subs r3, #1
  68808. 801bea8: 72fb strb r3, [r7, #11]
  68809. inactivity = 0;
  68810. 801beaa: 2300 movs r3, #0
  68811. 801beac: 60fb str r3, [r7, #12]
  68812. inactive = NULL;
  68813. 801beae: 2300 movs r3, #0
  68814. 801beb0: 613b str r3, [r7, #16]
  68815. for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  68816. 801beb2: 4b19 ldr r3, [pc, #100] @ (801bf18 <tcp_kill_prio+0x94>)
  68817. 801beb4: 681b ldr r3, [r3, #0]
  68818. 801beb6: 617b str r3, [r7, #20]
  68819. 801beb8: e01f b.n 801befa <tcp_kill_prio+0x76>
  68820. /* lower prio is always a kill candidate */
  68821. if ((pcb->prio < mprio) ||
  68822. 801beba: 697b ldr r3, [r7, #20]
  68823. 801bebc: 7d5b ldrb r3, [r3, #21]
  68824. 801bebe: 7afa ldrb r2, [r7, #11]
  68825. 801bec0: 429a cmp r2, r3
  68826. 801bec2: d80c bhi.n 801bede <tcp_kill_prio+0x5a>
  68827. /* longer inactivity is also a kill candidate */
  68828. ((pcb->prio == mprio) && ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity))) {
  68829. 801bec4: 697b ldr r3, [r7, #20]
  68830. 801bec6: 7d5b ldrb r3, [r3, #21]
  68831. if ((pcb->prio < mprio) ||
  68832. 801bec8: 7afa ldrb r2, [r7, #11]
  68833. 801beca: 429a cmp r2, r3
  68834. 801becc: d112 bne.n 801bef4 <tcp_kill_prio+0x70>
  68835. ((pcb->prio == mprio) && ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity))) {
  68836. 801bece: 4b13 ldr r3, [pc, #76] @ (801bf1c <tcp_kill_prio+0x98>)
  68837. 801bed0: 681a ldr r2, [r3, #0]
  68838. 801bed2: 697b ldr r3, [r7, #20]
  68839. 801bed4: 6a1b ldr r3, [r3, #32]
  68840. 801bed6: 1ad3 subs r3, r2, r3
  68841. 801bed8: 68fa ldr r2, [r7, #12]
  68842. 801beda: 429a cmp r2, r3
  68843. 801bedc: d80a bhi.n 801bef4 <tcp_kill_prio+0x70>
  68844. inactivity = tcp_ticks - pcb->tmr;
  68845. 801bede: 4b0f ldr r3, [pc, #60] @ (801bf1c <tcp_kill_prio+0x98>)
  68846. 801bee0: 681a ldr r2, [r3, #0]
  68847. 801bee2: 697b ldr r3, [r7, #20]
  68848. 801bee4: 6a1b ldr r3, [r3, #32]
  68849. 801bee6: 1ad3 subs r3, r2, r3
  68850. 801bee8: 60fb str r3, [r7, #12]
  68851. inactive = pcb;
  68852. 801beea: 697b ldr r3, [r7, #20]
  68853. 801beec: 613b str r3, [r7, #16]
  68854. mprio = pcb->prio;
  68855. 801beee: 697b ldr r3, [r7, #20]
  68856. 801bef0: 7d5b ldrb r3, [r3, #21]
  68857. 801bef2: 72fb strb r3, [r7, #11]
  68858. for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  68859. 801bef4: 697b ldr r3, [r7, #20]
  68860. 801bef6: 68db ldr r3, [r3, #12]
  68861. 801bef8: 617b str r3, [r7, #20]
  68862. 801befa: 697b ldr r3, [r7, #20]
  68863. 801befc: 2b00 cmp r3, #0
  68864. 801befe: d1dc bne.n 801beba <tcp_kill_prio+0x36>
  68865. }
  68866. }
  68867. if (inactive != NULL) {
  68868. 801bf00: 693b ldr r3, [r7, #16]
  68869. 801bf02: 2b00 cmp r3, #0
  68870. 801bf04: d004 beq.n 801bf10 <tcp_kill_prio+0x8c>
  68871. LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n",
  68872. (void *)inactive, inactivity));
  68873. tcp_abort(inactive);
  68874. 801bf06: 6938 ldr r0, [r7, #16]
  68875. 801bf08: f7ff f8ee bl 801b0e8 <tcp_abort>
  68876. 801bf0c: e000 b.n 801bf10 <tcp_kill_prio+0x8c>
  68877. return;
  68878. 801bf0e: bf00 nop
  68879. }
  68880. }
  68881. 801bf10: 3718 adds r7, #24
  68882. 801bf12: 46bd mov sp, r7
  68883. 801bf14: bd80 pop {r7, pc}
  68884. 801bf16: bf00 nop
  68885. 801bf18: 2402ae94 .word 0x2402ae94
  68886. 801bf1c: 2402ae88 .word 0x2402ae88
  68887. 0801bf20 <tcp_kill_state>:
  68888. * Kills the oldest connection that is in specific state.
  68889. * Called from tcp_alloc() for LAST_ACK and CLOSING if no more connections are available.
  68890. */
  68891. static void
  68892. tcp_kill_state(enum tcp_state state)
  68893. {
  68894. 801bf20: b580 push {r7, lr}
  68895. 801bf22: b086 sub sp, #24
  68896. 801bf24: af00 add r7, sp, #0
  68897. 801bf26: 4603 mov r3, r0
  68898. 801bf28: 71fb strb r3, [r7, #7]
  68899. struct tcp_pcb *pcb, *inactive;
  68900. u32_t inactivity;
  68901. LWIP_ASSERT("invalid state", (state == CLOSING) || (state == LAST_ACK));
  68902. 801bf2a: 79fb ldrb r3, [r7, #7]
  68903. 801bf2c: 2b08 cmp r3, #8
  68904. 801bf2e: d009 beq.n 801bf44 <tcp_kill_state+0x24>
  68905. 801bf30: 79fb ldrb r3, [r7, #7]
  68906. 801bf32: 2b09 cmp r3, #9
  68907. 801bf34: d006 beq.n 801bf44 <tcp_kill_state+0x24>
  68908. 801bf36: 4b1a ldr r3, [pc, #104] @ (801bfa0 <tcp_kill_state+0x80>)
  68909. 801bf38: f240 62dd movw r2, #1757 @ 0x6dd
  68910. 801bf3c: 4919 ldr r1, [pc, #100] @ (801bfa4 <tcp_kill_state+0x84>)
  68911. 801bf3e: 481a ldr r0, [pc, #104] @ (801bfa8 <tcp_kill_state+0x88>)
  68912. 801bf40: f00d fd44 bl 80299cc <iprintf>
  68913. inactivity = 0;
  68914. 801bf44: 2300 movs r3, #0
  68915. 801bf46: 60fb str r3, [r7, #12]
  68916. inactive = NULL;
  68917. 801bf48: 2300 movs r3, #0
  68918. 801bf4a: 613b str r3, [r7, #16]
  68919. /* Go through the list of active pcbs and get the oldest pcb that is in state
  68920. CLOSING/LAST_ACK. */
  68921. for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  68922. 801bf4c: 4b17 ldr r3, [pc, #92] @ (801bfac <tcp_kill_state+0x8c>)
  68923. 801bf4e: 681b ldr r3, [r3, #0]
  68924. 801bf50: 617b str r3, [r7, #20]
  68925. 801bf52: e017 b.n 801bf84 <tcp_kill_state+0x64>
  68926. if (pcb->state == state) {
  68927. 801bf54: 697b ldr r3, [r7, #20]
  68928. 801bf56: 7d1b ldrb r3, [r3, #20]
  68929. 801bf58: 79fa ldrb r2, [r7, #7]
  68930. 801bf5a: 429a cmp r2, r3
  68931. 801bf5c: d10f bne.n 801bf7e <tcp_kill_state+0x5e>
  68932. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  68933. 801bf5e: 4b14 ldr r3, [pc, #80] @ (801bfb0 <tcp_kill_state+0x90>)
  68934. 801bf60: 681a ldr r2, [r3, #0]
  68935. 801bf62: 697b ldr r3, [r7, #20]
  68936. 801bf64: 6a1b ldr r3, [r3, #32]
  68937. 801bf66: 1ad3 subs r3, r2, r3
  68938. 801bf68: 68fa ldr r2, [r7, #12]
  68939. 801bf6a: 429a cmp r2, r3
  68940. 801bf6c: d807 bhi.n 801bf7e <tcp_kill_state+0x5e>
  68941. inactivity = tcp_ticks - pcb->tmr;
  68942. 801bf6e: 4b10 ldr r3, [pc, #64] @ (801bfb0 <tcp_kill_state+0x90>)
  68943. 801bf70: 681a ldr r2, [r3, #0]
  68944. 801bf72: 697b ldr r3, [r7, #20]
  68945. 801bf74: 6a1b ldr r3, [r3, #32]
  68946. 801bf76: 1ad3 subs r3, r2, r3
  68947. 801bf78: 60fb str r3, [r7, #12]
  68948. inactive = pcb;
  68949. 801bf7a: 697b ldr r3, [r7, #20]
  68950. 801bf7c: 613b str r3, [r7, #16]
  68951. for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  68952. 801bf7e: 697b ldr r3, [r7, #20]
  68953. 801bf80: 68db ldr r3, [r3, #12]
  68954. 801bf82: 617b str r3, [r7, #20]
  68955. 801bf84: 697b ldr r3, [r7, #20]
  68956. 801bf86: 2b00 cmp r3, #0
  68957. 801bf88: d1e4 bne.n 801bf54 <tcp_kill_state+0x34>
  68958. }
  68959. }
  68960. }
  68961. if (inactive != NULL) {
  68962. 801bf8a: 693b ldr r3, [r7, #16]
  68963. 801bf8c: 2b00 cmp r3, #0
  68964. 801bf8e: d003 beq.n 801bf98 <tcp_kill_state+0x78>
  68965. LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_closing: killing oldest %s PCB %p (%"S32_F")\n",
  68966. tcp_state_str[state], (void *)inactive, inactivity));
  68967. /* Don't send a RST, since no data is lost. */
  68968. tcp_abandon(inactive, 0);
  68969. 801bf90: 2100 movs r1, #0
  68970. 801bf92: 6938 ldr r0, [r7, #16]
  68971. 801bf94: f7fe ffe8 bl 801af68 <tcp_abandon>
  68972. }
  68973. }
  68974. 801bf98: bf00 nop
  68975. 801bf9a: 3718 adds r7, #24
  68976. 801bf9c: 46bd mov sp, r7
  68977. 801bf9e: bd80 pop {r7, pc}
  68978. 801bfa0: 0802e5a8 .word 0x0802e5a8
  68979. 801bfa4: 0802eb34 .word 0x0802eb34
  68980. 801bfa8: 0802e5ec .word 0x0802e5ec
  68981. 801bfac: 2402ae94 .word 0x2402ae94
  68982. 801bfb0: 2402ae88 .word 0x2402ae88
  68983. 0801bfb4 <tcp_kill_timewait>:
  68984. * Kills the oldest connection that is in TIME_WAIT state.
  68985. * Called from tcp_alloc() if no more connections are available.
  68986. */
  68987. static void
  68988. tcp_kill_timewait(void)
  68989. {
  68990. 801bfb4: b580 push {r7, lr}
  68991. 801bfb6: b084 sub sp, #16
  68992. 801bfb8: af00 add r7, sp, #0
  68993. struct tcp_pcb *pcb, *inactive;
  68994. u32_t inactivity;
  68995. inactivity = 0;
  68996. 801bfba: 2300 movs r3, #0
  68997. 801bfbc: 607b str r3, [r7, #4]
  68998. inactive = NULL;
  68999. 801bfbe: 2300 movs r3, #0
  69000. 801bfc0: 60bb str r3, [r7, #8]
  69001. /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
  69002. for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  69003. 801bfc2: 4b12 ldr r3, [pc, #72] @ (801c00c <tcp_kill_timewait+0x58>)
  69004. 801bfc4: 681b ldr r3, [r3, #0]
  69005. 801bfc6: 60fb str r3, [r7, #12]
  69006. 801bfc8: e012 b.n 801bff0 <tcp_kill_timewait+0x3c>
  69007. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  69008. 801bfca: 4b11 ldr r3, [pc, #68] @ (801c010 <tcp_kill_timewait+0x5c>)
  69009. 801bfcc: 681a ldr r2, [r3, #0]
  69010. 801bfce: 68fb ldr r3, [r7, #12]
  69011. 801bfd0: 6a1b ldr r3, [r3, #32]
  69012. 801bfd2: 1ad3 subs r3, r2, r3
  69013. 801bfd4: 687a ldr r2, [r7, #4]
  69014. 801bfd6: 429a cmp r2, r3
  69015. 801bfd8: d807 bhi.n 801bfea <tcp_kill_timewait+0x36>
  69016. inactivity = tcp_ticks - pcb->tmr;
  69017. 801bfda: 4b0d ldr r3, [pc, #52] @ (801c010 <tcp_kill_timewait+0x5c>)
  69018. 801bfdc: 681a ldr r2, [r3, #0]
  69019. 801bfde: 68fb ldr r3, [r7, #12]
  69020. 801bfe0: 6a1b ldr r3, [r3, #32]
  69021. 801bfe2: 1ad3 subs r3, r2, r3
  69022. 801bfe4: 607b str r3, [r7, #4]
  69023. inactive = pcb;
  69024. 801bfe6: 68fb ldr r3, [r7, #12]
  69025. 801bfe8: 60bb str r3, [r7, #8]
  69026. for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  69027. 801bfea: 68fb ldr r3, [r7, #12]
  69028. 801bfec: 68db ldr r3, [r3, #12]
  69029. 801bfee: 60fb str r3, [r7, #12]
  69030. 801bff0: 68fb ldr r3, [r7, #12]
  69031. 801bff2: 2b00 cmp r3, #0
  69032. 801bff4: d1e9 bne.n 801bfca <tcp_kill_timewait+0x16>
  69033. }
  69034. }
  69035. if (inactive != NULL) {
  69036. 801bff6: 68bb ldr r3, [r7, #8]
  69037. 801bff8: 2b00 cmp r3, #0
  69038. 801bffa: d002 beq.n 801c002 <tcp_kill_timewait+0x4e>
  69039. LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n",
  69040. (void *)inactive, inactivity));
  69041. tcp_abort(inactive);
  69042. 801bffc: 68b8 ldr r0, [r7, #8]
  69043. 801bffe: f7ff f873 bl 801b0e8 <tcp_abort>
  69044. }
  69045. }
  69046. 801c002: bf00 nop
  69047. 801c004: 3710 adds r7, #16
  69048. 801c006: 46bd mov sp, r7
  69049. 801c008: bd80 pop {r7, pc}
  69050. 801c00a: bf00 nop
  69051. 801c00c: 2402ae98 .word 0x2402ae98
  69052. 801c010: 2402ae88 .word 0x2402ae88
  69053. 0801c014 <tcp_handle_closepend>:
  69054. * now send the FIN (which failed before), the pcb might be in a state that is
  69055. * OK for us to now free it.
  69056. */
  69057. static void
  69058. tcp_handle_closepend(void)
  69059. {
  69060. 801c014: b580 push {r7, lr}
  69061. 801c016: b082 sub sp, #8
  69062. 801c018: af00 add r7, sp, #0
  69063. struct tcp_pcb *pcb = tcp_active_pcbs;
  69064. 801c01a: 4b10 ldr r3, [pc, #64] @ (801c05c <tcp_handle_closepend+0x48>)
  69065. 801c01c: 681b ldr r3, [r3, #0]
  69066. 801c01e: 607b str r3, [r7, #4]
  69067. while (pcb != NULL) {
  69068. 801c020: e014 b.n 801c04c <tcp_handle_closepend+0x38>
  69069. struct tcp_pcb *next = pcb->next;
  69070. 801c022: 687b ldr r3, [r7, #4]
  69071. 801c024: 68db ldr r3, [r3, #12]
  69072. 801c026: 603b str r3, [r7, #0]
  69073. /* send pending FIN */
  69074. if (pcb->flags & TF_CLOSEPEND) {
  69075. 801c028: 687b ldr r3, [r7, #4]
  69076. 801c02a: 8b5b ldrh r3, [r3, #26]
  69077. 801c02c: f003 0308 and.w r3, r3, #8
  69078. 801c030: 2b00 cmp r3, #0
  69079. 801c032: d009 beq.n 801c048 <tcp_handle_closepend+0x34>
  69080. LWIP_DEBUGF(TCP_DEBUG, ("tcp_handle_closepend: pending FIN\n"));
  69081. tcp_clear_flags(pcb, TF_CLOSEPEND);
  69082. 801c034: 687b ldr r3, [r7, #4]
  69083. 801c036: 8b5b ldrh r3, [r3, #26]
  69084. 801c038: f023 0308 bic.w r3, r3, #8
  69085. 801c03c: b29a uxth r2, r3
  69086. 801c03e: 687b ldr r3, [r7, #4]
  69087. 801c040: 835a strh r2, [r3, #26]
  69088. tcp_close_shutdown_fin(pcb);
  69089. 801c042: 6878 ldr r0, [r7, #4]
  69090. 801c044: f7fe fe9a bl 801ad7c <tcp_close_shutdown_fin>
  69091. }
  69092. pcb = next;
  69093. 801c048: 683b ldr r3, [r7, #0]
  69094. 801c04a: 607b str r3, [r7, #4]
  69095. while (pcb != NULL) {
  69096. 801c04c: 687b ldr r3, [r7, #4]
  69097. 801c04e: 2b00 cmp r3, #0
  69098. 801c050: d1e7 bne.n 801c022 <tcp_handle_closepend+0xe>
  69099. }
  69100. }
  69101. 801c052: bf00 nop
  69102. 801c054: bf00 nop
  69103. 801c056: 3708 adds r7, #8
  69104. 801c058: 46bd mov sp, r7
  69105. 801c05a: bd80 pop {r7, pc}
  69106. 801c05c: 2402ae94 .word 0x2402ae94
  69107. 0801c060 <tcp_alloc>:
  69108. * @param prio priority for the new pcb
  69109. * @return a new tcp_pcb that initially is in state CLOSED
  69110. */
  69111. struct tcp_pcb *
  69112. tcp_alloc(u8_t prio)
  69113. {
  69114. 801c060: b580 push {r7, lr}
  69115. 801c062: b084 sub sp, #16
  69116. 801c064: af00 add r7, sp, #0
  69117. 801c066: 4603 mov r3, r0
  69118. 801c068: 71fb strb r3, [r7, #7]
  69119. struct tcp_pcb *pcb;
  69120. LWIP_ASSERT_CORE_LOCKED();
  69121. 801c06a: f7f4 fa61 bl 8010530 <sys_check_core_locking>
  69122. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  69123. 801c06e: 2001 movs r0, #1
  69124. 801c070: f7fd fad0 bl 8019614 <memp_malloc>
  69125. 801c074: 60f8 str r0, [r7, #12]
  69126. if (pcb == NULL) {
  69127. 801c076: 68fb ldr r3, [r7, #12]
  69128. 801c078: 2b00 cmp r3, #0
  69129. 801c07a: d126 bne.n 801c0ca <tcp_alloc+0x6a>
  69130. /* Try to send FIN for all pcbs stuck in TF_CLOSEPEND first */
  69131. tcp_handle_closepend();
  69132. 801c07c: f7ff ffca bl 801c014 <tcp_handle_closepend>
  69133. /* Try killing oldest connection in TIME-WAIT. */
  69134. LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
  69135. tcp_kill_timewait();
  69136. 801c080: f7ff ff98 bl 801bfb4 <tcp_kill_timewait>
  69137. /* Try to allocate a tcp_pcb again. */
  69138. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  69139. 801c084: 2001 movs r0, #1
  69140. 801c086: f7fd fac5 bl 8019614 <memp_malloc>
  69141. 801c08a: 60f8 str r0, [r7, #12]
  69142. if (pcb == NULL) {
  69143. 801c08c: 68fb ldr r3, [r7, #12]
  69144. 801c08e: 2b00 cmp r3, #0
  69145. 801c090: d11b bne.n 801c0ca <tcp_alloc+0x6a>
  69146. /* Try killing oldest connection in LAST-ACK (these wouldn't go to TIME-WAIT). */
  69147. LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest LAST-ACK connection\n"));
  69148. tcp_kill_state(LAST_ACK);
  69149. 801c092: 2009 movs r0, #9
  69150. 801c094: f7ff ff44 bl 801bf20 <tcp_kill_state>
  69151. /* Try to allocate a tcp_pcb again. */
  69152. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  69153. 801c098: 2001 movs r0, #1
  69154. 801c09a: f7fd fabb bl 8019614 <memp_malloc>
  69155. 801c09e: 60f8 str r0, [r7, #12]
  69156. if (pcb == NULL) {
  69157. 801c0a0: 68fb ldr r3, [r7, #12]
  69158. 801c0a2: 2b00 cmp r3, #0
  69159. 801c0a4: d111 bne.n 801c0ca <tcp_alloc+0x6a>
  69160. /* Try killing oldest connection in CLOSING. */
  69161. LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest CLOSING connection\n"));
  69162. tcp_kill_state(CLOSING);
  69163. 801c0a6: 2008 movs r0, #8
  69164. 801c0a8: f7ff ff3a bl 801bf20 <tcp_kill_state>
  69165. /* Try to allocate a tcp_pcb again. */
  69166. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  69167. 801c0ac: 2001 movs r0, #1
  69168. 801c0ae: f7fd fab1 bl 8019614 <memp_malloc>
  69169. 801c0b2: 60f8 str r0, [r7, #12]
  69170. if (pcb == NULL) {
  69171. 801c0b4: 68fb ldr r3, [r7, #12]
  69172. 801c0b6: 2b00 cmp r3, #0
  69173. 801c0b8: d107 bne.n 801c0ca <tcp_alloc+0x6a>
  69174. /* Try killing oldest active connection with lower priority than the new one. */
  69175. LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing oldest connection with prio lower than %d\n", prio));
  69176. tcp_kill_prio(prio);
  69177. 801c0ba: 79fb ldrb r3, [r7, #7]
  69178. 801c0bc: 4618 mov r0, r3
  69179. 801c0be: f7ff fee1 bl 801be84 <tcp_kill_prio>
  69180. /* Try to allocate a tcp_pcb again. */
  69181. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  69182. 801c0c2: 2001 movs r0, #1
  69183. 801c0c4: f7fd faa6 bl 8019614 <memp_malloc>
  69184. 801c0c8: 60f8 str r0, [r7, #12]
  69185. if (pcb != NULL) {
  69186. /* adjust err stats: memp_malloc failed above */
  69187. MEMP_STATS_DEC(err, MEMP_TCP_PCB);
  69188. }
  69189. }
  69190. if (pcb != NULL) {
  69191. 801c0ca: 68fb ldr r3, [r7, #12]
  69192. 801c0cc: 2b00 cmp r3, #0
  69193. 801c0ce: d03f beq.n 801c150 <tcp_alloc+0xf0>
  69194. /* zero out the whole pcb, so there is no need to initialize members to zero */
  69195. memset(pcb, 0, sizeof(struct tcp_pcb));
  69196. 801c0d0: 229c movs r2, #156 @ 0x9c
  69197. 801c0d2: 2100 movs r1, #0
  69198. 801c0d4: 68f8 ldr r0, [r7, #12]
  69199. 801c0d6: f00d fe0b bl 8029cf0 <memset>
  69200. pcb->prio = prio;
  69201. 801c0da: 68fb ldr r3, [r7, #12]
  69202. 801c0dc: 79fa ldrb r2, [r7, #7]
  69203. 801c0de: 755a strb r2, [r3, #21]
  69204. pcb->snd_buf = TCP_SND_BUF;
  69205. 801c0e0: 68fb ldr r3, [r7, #12]
  69206. 801c0e2: f241 62d0 movw r2, #5840 @ 0x16d0
  69207. 801c0e6: f8a3 2064 strh.w r2, [r3, #100] @ 0x64
  69208. /* Start with a window that does not need scaling. When window scaling is
  69209. enabled and used, the window is enlarged when both sides agree on scaling. */
  69210. pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND);
  69211. 801c0ea: 68fb ldr r3, [r7, #12]
  69212. 801c0ec: f241 62d0 movw r2, #5840 @ 0x16d0
  69213. 801c0f0: 855a strh r2, [r3, #42] @ 0x2a
  69214. 801c0f2: 68fb ldr r3, [r7, #12]
  69215. 801c0f4: 8d5a ldrh r2, [r3, #42] @ 0x2a
  69216. 801c0f6: 68fb ldr r3, [r7, #12]
  69217. 801c0f8: 851a strh r2, [r3, #40] @ 0x28
  69218. pcb->ttl = TCP_TTL;
  69219. 801c0fa: 68fb ldr r3, [r7, #12]
  69220. 801c0fc: 22ff movs r2, #255 @ 0xff
  69221. 801c0fe: 72da strb r2, [r3, #11]
  69222. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  69223. The send MSS is updated when an MSS option is received. */
  69224. pcb->mss = INITIAL_MSS;
  69225. 801c100: 68fb ldr r3, [r7, #12]
  69226. 801c102: f44f 7206 mov.w r2, #536 @ 0x218
  69227. 801c106: 865a strh r2, [r3, #50] @ 0x32
  69228. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  69229. 801c108: 68fb ldr r3, [r7, #12]
  69230. 801c10a: 2206 movs r2, #6
  69231. 801c10c: f8a3 2040 strh.w r2, [r3, #64] @ 0x40
  69232. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  69233. 801c110: 68fb ldr r3, [r7, #12]
  69234. 801c112: 2206 movs r2, #6
  69235. 801c114: 87da strh r2, [r3, #62] @ 0x3e
  69236. pcb->rtime = -1;
  69237. 801c116: 68fb ldr r3, [r7, #12]
  69238. 801c118: f64f 72ff movw r2, #65535 @ 0xffff
  69239. 801c11c: 861a strh r2, [r3, #48] @ 0x30
  69240. pcb->cwnd = 1;
  69241. 801c11e: 68fb ldr r3, [r7, #12]
  69242. 801c120: 2201 movs r2, #1
  69243. 801c122: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  69244. pcb->tmr = tcp_ticks;
  69245. 801c126: 4b0d ldr r3, [pc, #52] @ (801c15c <tcp_alloc+0xfc>)
  69246. 801c128: 681a ldr r2, [r3, #0]
  69247. 801c12a: 68fb ldr r3, [r7, #12]
  69248. 801c12c: 621a str r2, [r3, #32]
  69249. pcb->last_timer = tcp_timer_ctr;
  69250. 801c12e: 4b0c ldr r3, [pc, #48] @ (801c160 <tcp_alloc+0x100>)
  69251. 801c130: 781a ldrb r2, [r3, #0]
  69252. 801c132: 68fb ldr r3, [r7, #12]
  69253. 801c134: 779a strb r2, [r3, #30]
  69254. of using the largest advertised receive window. We've seen complications with
  69255. receiving TCPs that use window scaling and/or window auto-tuning where the
  69256. initial advertised window is very small and then grows rapidly once the
  69257. connection is established. To avoid these complications, we set ssthresh to the
  69258. largest effective cwnd (amount of in-flight data) that the sender can have. */
  69259. pcb->ssthresh = TCP_SND_BUF;
  69260. 801c136: 68fb ldr r3, [r7, #12]
  69261. 801c138: f241 62d0 movw r2, #5840 @ 0x16d0
  69262. 801c13c: f8a3 204a strh.w r2, [r3, #74] @ 0x4a
  69263. #if LWIP_CALLBACK_API
  69264. pcb->recv = tcp_recv_null;
  69265. 801c140: 68fb ldr r3, [r7, #12]
  69266. 801c142: 4a08 ldr r2, [pc, #32] @ (801c164 <tcp_alloc+0x104>)
  69267. 801c144: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  69268. #endif /* LWIP_CALLBACK_API */
  69269. /* Init KEEPALIVE timer */
  69270. pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
  69271. 801c148: 68fb ldr r3, [r7, #12]
  69272. 801c14a: 4a07 ldr r2, [pc, #28] @ (801c168 <tcp_alloc+0x108>)
  69273. 801c14c: f8c3 2094 str.w r2, [r3, #148] @ 0x94
  69274. #if LWIP_TCP_KEEPALIVE
  69275. pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
  69276. pcb->keep_cnt = TCP_KEEPCNT_DEFAULT;
  69277. #endif /* LWIP_TCP_KEEPALIVE */
  69278. }
  69279. return pcb;
  69280. 801c150: 68fb ldr r3, [r7, #12]
  69281. }
  69282. 801c152: 4618 mov r0, r3
  69283. 801c154: 3710 adds r7, #16
  69284. 801c156: 46bd mov sp, r7
  69285. 801c158: bd80 pop {r7, pc}
  69286. 801c15a: bf00 nop
  69287. 801c15c: 2402ae88 .word 0x2402ae88
  69288. 801c160: 2402ae9e .word 0x2402ae9e
  69289. 801c164: 0801be19 .word 0x0801be19
  69290. 801c168: 006ddd00 .word 0x006ddd00
  69291. 0801c16c <tcp_new_ip_type>:
  69292. * supply @ref IPADDR_TYPE_ANY as argument and bind to @ref IP_ANY_TYPE.
  69293. * @return a new tcp_pcb that initially is in state CLOSED
  69294. */
  69295. struct tcp_pcb *
  69296. tcp_new_ip_type(u8_t type)
  69297. {
  69298. 801c16c: b580 push {r7, lr}
  69299. 801c16e: b084 sub sp, #16
  69300. 801c170: af00 add r7, sp, #0
  69301. 801c172: 4603 mov r3, r0
  69302. 801c174: 71fb strb r3, [r7, #7]
  69303. struct tcp_pcb *pcb;
  69304. pcb = tcp_alloc(TCP_PRIO_NORMAL);
  69305. 801c176: 2040 movs r0, #64 @ 0x40
  69306. 801c178: f7ff ff72 bl 801c060 <tcp_alloc>
  69307. 801c17c: 60f8 str r0, [r7, #12]
  69308. IP_SET_TYPE_VAL(pcb->remote_ip, type);
  69309. }
  69310. #else
  69311. LWIP_UNUSED_ARG(type);
  69312. #endif /* LWIP_IPV4 && LWIP_IPV6 */
  69313. return pcb;
  69314. 801c17e: 68fb ldr r3, [r7, #12]
  69315. }
  69316. 801c180: 4618 mov r0, r3
  69317. 801c182: 3710 adds r7, #16
  69318. 801c184: 46bd mov sp, r7
  69319. 801c186: bd80 pop {r7, pc}
  69320. 0801c188 <tcp_arg>:
  69321. * @param pcb tcp_pcb to set the callback argument
  69322. * @param arg void pointer argument to pass to callback functions
  69323. */
  69324. void
  69325. tcp_arg(struct tcp_pcb *pcb, void *arg)
  69326. {
  69327. 801c188: b580 push {r7, lr}
  69328. 801c18a: b082 sub sp, #8
  69329. 801c18c: af00 add r7, sp, #0
  69330. 801c18e: 6078 str r0, [r7, #4]
  69331. 801c190: 6039 str r1, [r7, #0]
  69332. LWIP_ASSERT_CORE_LOCKED();
  69333. 801c192: f7f4 f9cd bl 8010530 <sys_check_core_locking>
  69334. /* This function is allowed to be called for both listen pcbs and
  69335. connection pcbs. */
  69336. if (pcb != NULL) {
  69337. 801c196: 687b ldr r3, [r7, #4]
  69338. 801c198: 2b00 cmp r3, #0
  69339. 801c19a: d002 beq.n 801c1a2 <tcp_arg+0x1a>
  69340. pcb->callback_arg = arg;
  69341. 801c19c: 687b ldr r3, [r7, #4]
  69342. 801c19e: 683a ldr r2, [r7, #0]
  69343. 801c1a0: 611a str r2, [r3, #16]
  69344. }
  69345. }
  69346. 801c1a2: bf00 nop
  69347. 801c1a4: 3708 adds r7, #8
  69348. 801c1a6: 46bd mov sp, r7
  69349. 801c1a8: bd80 pop {r7, pc}
  69350. ...
  69351. 0801c1ac <tcp_recv>:
  69352. * @param pcb tcp_pcb to set the recv callback
  69353. * @param recv callback function to call for this pcb when data is received
  69354. */
  69355. void
  69356. tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv)
  69357. {
  69358. 801c1ac: b580 push {r7, lr}
  69359. 801c1ae: b082 sub sp, #8
  69360. 801c1b0: af00 add r7, sp, #0
  69361. 801c1b2: 6078 str r0, [r7, #4]
  69362. 801c1b4: 6039 str r1, [r7, #0]
  69363. LWIP_ASSERT_CORE_LOCKED();
  69364. 801c1b6: f7f4 f9bb bl 8010530 <sys_check_core_locking>
  69365. if (pcb != NULL) {
  69366. 801c1ba: 687b ldr r3, [r7, #4]
  69367. 801c1bc: 2b00 cmp r3, #0
  69368. 801c1be: d00e beq.n 801c1de <tcp_recv+0x32>
  69369. LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN);
  69370. 801c1c0: 687b ldr r3, [r7, #4]
  69371. 801c1c2: 7d1b ldrb r3, [r3, #20]
  69372. 801c1c4: 2b01 cmp r3, #1
  69373. 801c1c6: d106 bne.n 801c1d6 <tcp_recv+0x2a>
  69374. 801c1c8: 4b07 ldr r3, [pc, #28] @ (801c1e8 <tcp_recv+0x3c>)
  69375. 801c1ca: f240 72df movw r2, #2015 @ 0x7df
  69376. 801c1ce: 4907 ldr r1, [pc, #28] @ (801c1ec <tcp_recv+0x40>)
  69377. 801c1d0: 4807 ldr r0, [pc, #28] @ (801c1f0 <tcp_recv+0x44>)
  69378. 801c1d2: f00d fbfb bl 80299cc <iprintf>
  69379. pcb->recv = recv;
  69380. 801c1d6: 687b ldr r3, [r7, #4]
  69381. 801c1d8: 683a ldr r2, [r7, #0]
  69382. 801c1da: f8c3 2084 str.w r2, [r3, #132] @ 0x84
  69383. }
  69384. }
  69385. 801c1de: bf00 nop
  69386. 801c1e0: 3708 adds r7, #8
  69387. 801c1e2: 46bd mov sp, r7
  69388. 801c1e4: bd80 pop {r7, pc}
  69389. 801c1e6: bf00 nop
  69390. 801c1e8: 0802e5a8 .word 0x0802e5a8
  69391. 801c1ec: 0802eb44 .word 0x0802eb44
  69392. 801c1f0: 0802e5ec .word 0x0802e5ec
  69393. 0801c1f4 <tcp_sent>:
  69394. * @param pcb tcp_pcb to set the sent callback
  69395. * @param sent callback function to call for this pcb when data is successfully sent
  69396. */
  69397. void
  69398. tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent)
  69399. {
  69400. 801c1f4: b580 push {r7, lr}
  69401. 801c1f6: b082 sub sp, #8
  69402. 801c1f8: af00 add r7, sp, #0
  69403. 801c1fa: 6078 str r0, [r7, #4]
  69404. 801c1fc: 6039 str r1, [r7, #0]
  69405. LWIP_ASSERT_CORE_LOCKED();
  69406. 801c1fe: f7f4 f997 bl 8010530 <sys_check_core_locking>
  69407. if (pcb != NULL) {
  69408. 801c202: 687b ldr r3, [r7, #4]
  69409. 801c204: 2b00 cmp r3, #0
  69410. 801c206: d00e beq.n 801c226 <tcp_sent+0x32>
  69411. LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN);
  69412. 801c208: 687b ldr r3, [r7, #4]
  69413. 801c20a: 7d1b ldrb r3, [r3, #20]
  69414. 801c20c: 2b01 cmp r3, #1
  69415. 801c20e: d106 bne.n 801c21e <tcp_sent+0x2a>
  69416. 801c210: 4b07 ldr r3, [pc, #28] @ (801c230 <tcp_sent+0x3c>)
  69417. 801c212: f240 72f3 movw r2, #2035 @ 0x7f3
  69418. 801c216: 4907 ldr r1, [pc, #28] @ (801c234 <tcp_sent+0x40>)
  69419. 801c218: 4807 ldr r0, [pc, #28] @ (801c238 <tcp_sent+0x44>)
  69420. 801c21a: f00d fbd7 bl 80299cc <iprintf>
  69421. pcb->sent = sent;
  69422. 801c21e: 687b ldr r3, [r7, #4]
  69423. 801c220: 683a ldr r2, [r7, #0]
  69424. 801c222: f8c3 2080 str.w r2, [r3, #128] @ 0x80
  69425. }
  69426. }
  69427. 801c226: bf00 nop
  69428. 801c228: 3708 adds r7, #8
  69429. 801c22a: 46bd mov sp, r7
  69430. 801c22c: bd80 pop {r7, pc}
  69431. 801c22e: bf00 nop
  69432. 801c230: 0802e5a8 .word 0x0802e5a8
  69433. 801c234: 0802eb6c .word 0x0802eb6c
  69434. 801c238: 0802e5ec .word 0x0802e5ec
  69435. 0801c23c <tcp_err>:
  69436. * @param err callback function to call for this pcb when a fatal error
  69437. * has occurred on the connection
  69438. */
  69439. void
  69440. tcp_err(struct tcp_pcb *pcb, tcp_err_fn err)
  69441. {
  69442. 801c23c: b580 push {r7, lr}
  69443. 801c23e: b082 sub sp, #8
  69444. 801c240: af00 add r7, sp, #0
  69445. 801c242: 6078 str r0, [r7, #4]
  69446. 801c244: 6039 str r1, [r7, #0]
  69447. LWIP_ASSERT_CORE_LOCKED();
  69448. 801c246: f7f4 f973 bl 8010530 <sys_check_core_locking>
  69449. if (pcb != NULL) {
  69450. 801c24a: 687b ldr r3, [r7, #4]
  69451. 801c24c: 2b00 cmp r3, #0
  69452. 801c24e: d00e beq.n 801c26e <tcp_err+0x32>
  69453. LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN);
  69454. 801c250: 687b ldr r3, [r7, #4]
  69455. 801c252: 7d1b ldrb r3, [r3, #20]
  69456. 801c254: 2b01 cmp r3, #1
  69457. 801c256: d106 bne.n 801c266 <tcp_err+0x2a>
  69458. 801c258: 4b07 ldr r3, [pc, #28] @ (801c278 <tcp_err+0x3c>)
  69459. 801c25a: f640 020d movw r2, #2061 @ 0x80d
  69460. 801c25e: 4907 ldr r1, [pc, #28] @ (801c27c <tcp_err+0x40>)
  69461. 801c260: 4807 ldr r0, [pc, #28] @ (801c280 <tcp_err+0x44>)
  69462. 801c262: f00d fbb3 bl 80299cc <iprintf>
  69463. pcb->errf = err;
  69464. 801c266: 687b ldr r3, [r7, #4]
  69465. 801c268: 683a ldr r2, [r7, #0]
  69466. 801c26a: f8c3 2090 str.w r2, [r3, #144] @ 0x90
  69467. }
  69468. }
  69469. 801c26e: bf00 nop
  69470. 801c270: 3708 adds r7, #8
  69471. 801c272: 46bd mov sp, r7
  69472. 801c274: bd80 pop {r7, pc}
  69473. 801c276: bf00 nop
  69474. 801c278: 0802e5a8 .word 0x0802e5a8
  69475. 801c27c: 0802eb94 .word 0x0802eb94
  69476. 801c280: 0802e5ec .word 0x0802e5ec
  69477. 0801c284 <tcp_accept>:
  69478. * @param accept callback function to call for this pcb when LISTENing
  69479. * connection has been connected to another host
  69480. */
  69481. void
  69482. tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept)
  69483. {
  69484. 801c284: b580 push {r7, lr}
  69485. 801c286: b084 sub sp, #16
  69486. 801c288: af00 add r7, sp, #0
  69487. 801c28a: 6078 str r0, [r7, #4]
  69488. 801c28c: 6039 str r1, [r7, #0]
  69489. LWIP_ASSERT_CORE_LOCKED();
  69490. 801c28e: f7f4 f94f bl 8010530 <sys_check_core_locking>
  69491. if ((pcb != NULL) && (pcb->state == LISTEN)) {
  69492. 801c292: 687b ldr r3, [r7, #4]
  69493. 801c294: 2b00 cmp r3, #0
  69494. 801c296: d008 beq.n 801c2aa <tcp_accept+0x26>
  69495. 801c298: 687b ldr r3, [r7, #4]
  69496. 801c29a: 7d1b ldrb r3, [r3, #20]
  69497. 801c29c: 2b01 cmp r3, #1
  69498. 801c29e: d104 bne.n 801c2aa <tcp_accept+0x26>
  69499. struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen *)pcb;
  69500. 801c2a0: 687b ldr r3, [r7, #4]
  69501. 801c2a2: 60fb str r3, [r7, #12]
  69502. lpcb->accept = accept;
  69503. 801c2a4: 68fb ldr r3, [r7, #12]
  69504. 801c2a6: 683a ldr r2, [r7, #0]
  69505. 801c2a8: 619a str r2, [r3, #24]
  69506. }
  69507. }
  69508. 801c2aa: bf00 nop
  69509. 801c2ac: 3710 adds r7, #16
  69510. 801c2ae: 46bd mov sp, r7
  69511. 801c2b0: bd80 pop {r7, pc}
  69512. ...
  69513. 0801c2b4 <tcp_poll>:
  69514. * the application may use the polling functionality to call tcp_write()
  69515. * again when the connection has been idle for a while.
  69516. */
  69517. void
  69518. tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval)
  69519. {
  69520. 801c2b4: b580 push {r7, lr}
  69521. 801c2b6: b084 sub sp, #16
  69522. 801c2b8: af00 add r7, sp, #0
  69523. 801c2ba: 60f8 str r0, [r7, #12]
  69524. 801c2bc: 60b9 str r1, [r7, #8]
  69525. 801c2be: 4613 mov r3, r2
  69526. 801c2c0: 71fb strb r3, [r7, #7]
  69527. LWIP_ASSERT_CORE_LOCKED();
  69528. 801c2c2: f7f4 f935 bl 8010530 <sys_check_core_locking>
  69529. LWIP_ERROR("tcp_poll: invalid pcb", pcb != NULL, return);
  69530. 801c2c6: 68fb ldr r3, [r7, #12]
  69531. 801c2c8: 2b00 cmp r3, #0
  69532. 801c2ca: d107 bne.n 801c2dc <tcp_poll+0x28>
  69533. 801c2cc: 4b0e ldr r3, [pc, #56] @ (801c308 <tcp_poll+0x54>)
  69534. 801c2ce: f640 023d movw r2, #2109 @ 0x83d
  69535. 801c2d2: 490e ldr r1, [pc, #56] @ (801c30c <tcp_poll+0x58>)
  69536. 801c2d4: 480e ldr r0, [pc, #56] @ (801c310 <tcp_poll+0x5c>)
  69537. 801c2d6: f00d fb79 bl 80299cc <iprintf>
  69538. 801c2da: e011 b.n 801c300 <tcp_poll+0x4c>
  69539. LWIP_ASSERT("invalid socket state for poll", pcb->state != LISTEN);
  69540. 801c2dc: 68fb ldr r3, [r7, #12]
  69541. 801c2de: 7d1b ldrb r3, [r3, #20]
  69542. 801c2e0: 2b01 cmp r3, #1
  69543. 801c2e2: d106 bne.n 801c2f2 <tcp_poll+0x3e>
  69544. 801c2e4: 4b08 ldr r3, [pc, #32] @ (801c308 <tcp_poll+0x54>)
  69545. 801c2e6: f640 023e movw r2, #2110 @ 0x83e
  69546. 801c2ea: 490a ldr r1, [pc, #40] @ (801c314 <tcp_poll+0x60>)
  69547. 801c2ec: 4808 ldr r0, [pc, #32] @ (801c310 <tcp_poll+0x5c>)
  69548. 801c2ee: f00d fb6d bl 80299cc <iprintf>
  69549. #if LWIP_CALLBACK_API
  69550. pcb->poll = poll;
  69551. 801c2f2: 68fb ldr r3, [r7, #12]
  69552. 801c2f4: 68ba ldr r2, [r7, #8]
  69553. 801c2f6: f8c3 208c str.w r2, [r3, #140] @ 0x8c
  69554. #else /* LWIP_CALLBACK_API */
  69555. LWIP_UNUSED_ARG(poll);
  69556. #endif /* LWIP_CALLBACK_API */
  69557. pcb->pollinterval = interval;
  69558. 801c2fa: 68fb ldr r3, [r7, #12]
  69559. 801c2fc: 79fa ldrb r2, [r7, #7]
  69560. 801c2fe: 775a strb r2, [r3, #29]
  69561. }
  69562. 801c300: 3710 adds r7, #16
  69563. 801c302: 46bd mov sp, r7
  69564. 801c304: bd80 pop {r7, pc}
  69565. 801c306: bf00 nop
  69566. 801c308: 0802e5a8 .word 0x0802e5a8
  69567. 801c30c: 0802ebbc .word 0x0802ebbc
  69568. 801c310: 0802e5ec .word 0x0802e5ec
  69569. 801c314: 0802ebd4 .word 0x0802ebd4
  69570. 0801c318 <tcp_pcb_purge>:
  69571. *
  69572. * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
  69573. */
  69574. void
  69575. tcp_pcb_purge(struct tcp_pcb *pcb)
  69576. {
  69577. 801c318: b580 push {r7, lr}
  69578. 801c31a: b082 sub sp, #8
  69579. 801c31c: af00 add r7, sp, #0
  69580. 801c31e: 6078 str r0, [r7, #4]
  69581. LWIP_ERROR("tcp_pcb_purge: invalid pcb", pcb != NULL, return);
  69582. 801c320: 687b ldr r3, [r7, #4]
  69583. 801c322: 2b00 cmp r3, #0
  69584. 801c324: d107 bne.n 801c336 <tcp_pcb_purge+0x1e>
  69585. 801c326: 4b21 ldr r3, [pc, #132] @ (801c3ac <tcp_pcb_purge+0x94>)
  69586. 801c328: f640 0251 movw r2, #2129 @ 0x851
  69587. 801c32c: 4920 ldr r1, [pc, #128] @ (801c3b0 <tcp_pcb_purge+0x98>)
  69588. 801c32e: 4821 ldr r0, [pc, #132] @ (801c3b4 <tcp_pcb_purge+0x9c>)
  69589. 801c330: f00d fb4c bl 80299cc <iprintf>
  69590. 801c334: e037 b.n 801c3a6 <tcp_pcb_purge+0x8e>
  69591. if (pcb->state != CLOSED &&
  69592. 801c336: 687b ldr r3, [r7, #4]
  69593. 801c338: 7d1b ldrb r3, [r3, #20]
  69594. 801c33a: 2b00 cmp r3, #0
  69595. 801c33c: d033 beq.n 801c3a6 <tcp_pcb_purge+0x8e>
  69596. pcb->state != TIME_WAIT &&
  69597. 801c33e: 687b ldr r3, [r7, #4]
  69598. 801c340: 7d1b ldrb r3, [r3, #20]
  69599. if (pcb->state != CLOSED &&
  69600. 801c342: 2b0a cmp r3, #10
  69601. 801c344: d02f beq.n 801c3a6 <tcp_pcb_purge+0x8e>
  69602. pcb->state != LISTEN) {
  69603. 801c346: 687b ldr r3, [r7, #4]
  69604. 801c348: 7d1b ldrb r3, [r3, #20]
  69605. pcb->state != TIME_WAIT &&
  69606. 801c34a: 2b01 cmp r3, #1
  69607. 801c34c: d02b beq.n 801c3a6 <tcp_pcb_purge+0x8e>
  69608. LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n"));
  69609. tcp_backlog_accepted(pcb);
  69610. if (pcb->refused_data != NULL) {
  69611. 801c34e: 687b ldr r3, [r7, #4]
  69612. 801c350: 6f9b ldr r3, [r3, #120] @ 0x78
  69613. 801c352: 2b00 cmp r3, #0
  69614. 801c354: d007 beq.n 801c366 <tcp_pcb_purge+0x4e>
  69615. LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n"));
  69616. pbuf_free(pcb->refused_data);
  69617. 801c356: 687b ldr r3, [r7, #4]
  69618. 801c358: 6f9b ldr r3, [r3, #120] @ 0x78
  69619. 801c35a: 4618 mov r0, r3
  69620. 801c35c: f7fe f8be bl 801a4dc <pbuf_free>
  69621. pcb->refused_data = NULL;
  69622. 801c360: 687b ldr r3, [r7, #4]
  69623. 801c362: 2200 movs r2, #0
  69624. 801c364: 679a str r2, [r3, #120] @ 0x78
  69625. }
  69626. if (pcb->unacked != NULL) {
  69627. LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unacked\n"));
  69628. }
  69629. #if TCP_QUEUE_OOSEQ
  69630. if (pcb->ooseq != NULL) {
  69631. 801c366: 687b ldr r3, [r7, #4]
  69632. 801c368: 6f5b ldr r3, [r3, #116] @ 0x74
  69633. 801c36a: 2b00 cmp r3, #0
  69634. 801c36c: d002 beq.n 801c374 <tcp_pcb_purge+0x5c>
  69635. LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n"));
  69636. tcp_free_ooseq(pcb);
  69637. 801c36e: 6878 ldr r0, [r7, #4]
  69638. 801c370: f000 f986 bl 801c680 <tcp_free_ooseq>
  69639. }
  69640. #endif /* TCP_QUEUE_OOSEQ */
  69641. /* Stop the retransmission timer as it will expect data on unacked
  69642. queue if it fires */
  69643. pcb->rtime = -1;
  69644. 801c374: 687b ldr r3, [r7, #4]
  69645. 801c376: f64f 72ff movw r2, #65535 @ 0xffff
  69646. 801c37a: 861a strh r2, [r3, #48] @ 0x30
  69647. tcp_segs_free(pcb->unsent);
  69648. 801c37c: 687b ldr r3, [r7, #4]
  69649. 801c37e: 6edb ldr r3, [r3, #108] @ 0x6c
  69650. 801c380: 4618 mov r0, r3
  69651. 801c382: f7ff fcef bl 801bd64 <tcp_segs_free>
  69652. tcp_segs_free(pcb->unacked);
  69653. 801c386: 687b ldr r3, [r7, #4]
  69654. 801c388: 6f1b ldr r3, [r3, #112] @ 0x70
  69655. 801c38a: 4618 mov r0, r3
  69656. 801c38c: f7ff fcea bl 801bd64 <tcp_segs_free>
  69657. pcb->unacked = pcb->unsent = NULL;
  69658. 801c390: 687b ldr r3, [r7, #4]
  69659. 801c392: 2200 movs r2, #0
  69660. 801c394: 66da str r2, [r3, #108] @ 0x6c
  69661. 801c396: 687b ldr r3, [r7, #4]
  69662. 801c398: 6eda ldr r2, [r3, #108] @ 0x6c
  69663. 801c39a: 687b ldr r3, [r7, #4]
  69664. 801c39c: 671a str r2, [r3, #112] @ 0x70
  69665. #if TCP_OVERSIZE
  69666. pcb->unsent_oversize = 0;
  69667. 801c39e: 687b ldr r3, [r7, #4]
  69668. 801c3a0: 2200 movs r2, #0
  69669. 801c3a2: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  69670. #endif /* TCP_OVERSIZE */
  69671. }
  69672. }
  69673. 801c3a6: 3708 adds r7, #8
  69674. 801c3a8: 46bd mov sp, r7
  69675. 801c3aa: bd80 pop {r7, pc}
  69676. 801c3ac: 0802e5a8 .word 0x0802e5a8
  69677. 801c3b0: 0802ebf4 .word 0x0802ebf4
  69678. 801c3b4: 0802e5ec .word 0x0802e5ec
  69679. 0801c3b8 <tcp_pcb_remove>:
  69680. * @param pcblist PCB list to purge.
  69681. * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
  69682. */
  69683. void
  69684. tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
  69685. {
  69686. 801c3b8: b580 push {r7, lr}
  69687. 801c3ba: b084 sub sp, #16
  69688. 801c3bc: af00 add r7, sp, #0
  69689. 801c3be: 6078 str r0, [r7, #4]
  69690. 801c3c0: 6039 str r1, [r7, #0]
  69691. LWIP_ASSERT("tcp_pcb_remove: invalid pcb", pcb != NULL);
  69692. 801c3c2: 683b ldr r3, [r7, #0]
  69693. 801c3c4: 2b00 cmp r3, #0
  69694. 801c3c6: d106 bne.n 801c3d6 <tcp_pcb_remove+0x1e>
  69695. 801c3c8: 4b3e ldr r3, [pc, #248] @ (801c4c4 <tcp_pcb_remove+0x10c>)
  69696. 801c3ca: f640 0283 movw r2, #2179 @ 0x883
  69697. 801c3ce: 493e ldr r1, [pc, #248] @ (801c4c8 <tcp_pcb_remove+0x110>)
  69698. 801c3d0: 483e ldr r0, [pc, #248] @ (801c4cc <tcp_pcb_remove+0x114>)
  69699. 801c3d2: f00d fafb bl 80299cc <iprintf>
  69700. LWIP_ASSERT("tcp_pcb_remove: invalid pcblist", pcblist != NULL);
  69701. 801c3d6: 687b ldr r3, [r7, #4]
  69702. 801c3d8: 2b00 cmp r3, #0
  69703. 801c3da: d106 bne.n 801c3ea <tcp_pcb_remove+0x32>
  69704. 801c3dc: 4b39 ldr r3, [pc, #228] @ (801c4c4 <tcp_pcb_remove+0x10c>)
  69705. 801c3de: f640 0284 movw r2, #2180 @ 0x884
  69706. 801c3e2: 493b ldr r1, [pc, #236] @ (801c4d0 <tcp_pcb_remove+0x118>)
  69707. 801c3e4: 4839 ldr r0, [pc, #228] @ (801c4cc <tcp_pcb_remove+0x114>)
  69708. 801c3e6: f00d faf1 bl 80299cc <iprintf>
  69709. TCP_RMV(pcblist, pcb);
  69710. 801c3ea: 687b ldr r3, [r7, #4]
  69711. 801c3ec: 681b ldr r3, [r3, #0]
  69712. 801c3ee: 683a ldr r2, [r7, #0]
  69713. 801c3f0: 429a cmp r2, r3
  69714. 801c3f2: d105 bne.n 801c400 <tcp_pcb_remove+0x48>
  69715. 801c3f4: 687b ldr r3, [r7, #4]
  69716. 801c3f6: 681b ldr r3, [r3, #0]
  69717. 801c3f8: 68da ldr r2, [r3, #12]
  69718. 801c3fa: 687b ldr r3, [r7, #4]
  69719. 801c3fc: 601a str r2, [r3, #0]
  69720. 801c3fe: e013 b.n 801c428 <tcp_pcb_remove+0x70>
  69721. 801c400: 687b ldr r3, [r7, #4]
  69722. 801c402: 681b ldr r3, [r3, #0]
  69723. 801c404: 60fb str r3, [r7, #12]
  69724. 801c406: e00c b.n 801c422 <tcp_pcb_remove+0x6a>
  69725. 801c408: 68fb ldr r3, [r7, #12]
  69726. 801c40a: 68db ldr r3, [r3, #12]
  69727. 801c40c: 683a ldr r2, [r7, #0]
  69728. 801c40e: 429a cmp r2, r3
  69729. 801c410: d104 bne.n 801c41c <tcp_pcb_remove+0x64>
  69730. 801c412: 683b ldr r3, [r7, #0]
  69731. 801c414: 68da ldr r2, [r3, #12]
  69732. 801c416: 68fb ldr r3, [r7, #12]
  69733. 801c418: 60da str r2, [r3, #12]
  69734. 801c41a: e005 b.n 801c428 <tcp_pcb_remove+0x70>
  69735. 801c41c: 68fb ldr r3, [r7, #12]
  69736. 801c41e: 68db ldr r3, [r3, #12]
  69737. 801c420: 60fb str r3, [r7, #12]
  69738. 801c422: 68fb ldr r3, [r7, #12]
  69739. 801c424: 2b00 cmp r3, #0
  69740. 801c426: d1ef bne.n 801c408 <tcp_pcb_remove+0x50>
  69741. 801c428: 683b ldr r3, [r7, #0]
  69742. 801c42a: 2200 movs r2, #0
  69743. 801c42c: 60da str r2, [r3, #12]
  69744. tcp_pcb_purge(pcb);
  69745. 801c42e: 6838 ldr r0, [r7, #0]
  69746. 801c430: f7ff ff72 bl 801c318 <tcp_pcb_purge>
  69747. /* if there is an outstanding delayed ACKs, send it */
  69748. if ((pcb->state != TIME_WAIT) &&
  69749. 801c434: 683b ldr r3, [r7, #0]
  69750. 801c436: 7d1b ldrb r3, [r3, #20]
  69751. 801c438: 2b0a cmp r3, #10
  69752. 801c43a: d013 beq.n 801c464 <tcp_pcb_remove+0xac>
  69753. (pcb->state != LISTEN) &&
  69754. 801c43c: 683b ldr r3, [r7, #0]
  69755. 801c43e: 7d1b ldrb r3, [r3, #20]
  69756. if ((pcb->state != TIME_WAIT) &&
  69757. 801c440: 2b01 cmp r3, #1
  69758. 801c442: d00f beq.n 801c464 <tcp_pcb_remove+0xac>
  69759. (pcb->flags & TF_ACK_DELAY)) {
  69760. 801c444: 683b ldr r3, [r7, #0]
  69761. 801c446: 8b5b ldrh r3, [r3, #26]
  69762. 801c448: f003 0301 and.w r3, r3, #1
  69763. (pcb->state != LISTEN) &&
  69764. 801c44c: 2b00 cmp r3, #0
  69765. 801c44e: d009 beq.n 801c464 <tcp_pcb_remove+0xac>
  69766. tcp_ack_now(pcb);
  69767. 801c450: 683b ldr r3, [r7, #0]
  69768. 801c452: 8b5b ldrh r3, [r3, #26]
  69769. 801c454: f043 0302 orr.w r3, r3, #2
  69770. 801c458: b29a uxth r2, r3
  69771. 801c45a: 683b ldr r3, [r7, #0]
  69772. 801c45c: 835a strh r2, [r3, #26]
  69773. tcp_output(pcb);
  69774. 801c45e: 6838 ldr r0, [r7, #0]
  69775. 801c460: f003 fc28 bl 801fcb4 <tcp_output>
  69776. }
  69777. if (pcb->state != LISTEN) {
  69778. 801c464: 683b ldr r3, [r7, #0]
  69779. 801c466: 7d1b ldrb r3, [r3, #20]
  69780. 801c468: 2b01 cmp r3, #1
  69781. 801c46a: d020 beq.n 801c4ae <tcp_pcb_remove+0xf6>
  69782. LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL);
  69783. 801c46c: 683b ldr r3, [r7, #0]
  69784. 801c46e: 6edb ldr r3, [r3, #108] @ 0x6c
  69785. 801c470: 2b00 cmp r3, #0
  69786. 801c472: d006 beq.n 801c482 <tcp_pcb_remove+0xca>
  69787. 801c474: 4b13 ldr r3, [pc, #76] @ (801c4c4 <tcp_pcb_remove+0x10c>)
  69788. 801c476: f640 0293 movw r2, #2195 @ 0x893
  69789. 801c47a: 4916 ldr r1, [pc, #88] @ (801c4d4 <tcp_pcb_remove+0x11c>)
  69790. 801c47c: 4813 ldr r0, [pc, #76] @ (801c4cc <tcp_pcb_remove+0x114>)
  69791. 801c47e: f00d faa5 bl 80299cc <iprintf>
  69792. LWIP_ASSERT("unacked segments leaking", pcb->unacked == NULL);
  69793. 801c482: 683b ldr r3, [r7, #0]
  69794. 801c484: 6f1b ldr r3, [r3, #112] @ 0x70
  69795. 801c486: 2b00 cmp r3, #0
  69796. 801c488: d006 beq.n 801c498 <tcp_pcb_remove+0xe0>
  69797. 801c48a: 4b0e ldr r3, [pc, #56] @ (801c4c4 <tcp_pcb_remove+0x10c>)
  69798. 801c48c: f640 0294 movw r2, #2196 @ 0x894
  69799. 801c490: 4911 ldr r1, [pc, #68] @ (801c4d8 <tcp_pcb_remove+0x120>)
  69800. 801c492: 480e ldr r0, [pc, #56] @ (801c4cc <tcp_pcb_remove+0x114>)
  69801. 801c494: f00d fa9a bl 80299cc <iprintf>
  69802. #if TCP_QUEUE_OOSEQ
  69803. LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL);
  69804. 801c498: 683b ldr r3, [r7, #0]
  69805. 801c49a: 6f5b ldr r3, [r3, #116] @ 0x74
  69806. 801c49c: 2b00 cmp r3, #0
  69807. 801c49e: d006 beq.n 801c4ae <tcp_pcb_remove+0xf6>
  69808. 801c4a0: 4b08 ldr r3, [pc, #32] @ (801c4c4 <tcp_pcb_remove+0x10c>)
  69809. 801c4a2: f640 0296 movw r2, #2198 @ 0x896
  69810. 801c4a6: 490d ldr r1, [pc, #52] @ (801c4dc <tcp_pcb_remove+0x124>)
  69811. 801c4a8: 4808 ldr r0, [pc, #32] @ (801c4cc <tcp_pcb_remove+0x114>)
  69812. 801c4aa: f00d fa8f bl 80299cc <iprintf>
  69813. #endif /* TCP_QUEUE_OOSEQ */
  69814. }
  69815. pcb->state = CLOSED;
  69816. 801c4ae: 683b ldr r3, [r7, #0]
  69817. 801c4b0: 2200 movs r2, #0
  69818. 801c4b2: 751a strb r2, [r3, #20]
  69819. /* reset the local port to prevent the pcb from being 'bound' */
  69820. pcb->local_port = 0;
  69821. 801c4b4: 683b ldr r3, [r7, #0]
  69822. 801c4b6: 2200 movs r2, #0
  69823. 801c4b8: 82da strh r2, [r3, #22]
  69824. LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
  69825. }
  69826. 801c4ba: bf00 nop
  69827. 801c4bc: 3710 adds r7, #16
  69828. 801c4be: 46bd mov sp, r7
  69829. 801c4c0: bd80 pop {r7, pc}
  69830. 801c4c2: bf00 nop
  69831. 801c4c4: 0802e5a8 .word 0x0802e5a8
  69832. 801c4c8: 0802ec10 .word 0x0802ec10
  69833. 801c4cc: 0802e5ec .word 0x0802e5ec
  69834. 801c4d0: 0802ec2c .word 0x0802ec2c
  69835. 801c4d4: 0802ec4c .word 0x0802ec4c
  69836. 801c4d8: 0802ec64 .word 0x0802ec64
  69837. 801c4dc: 0802ec80 .word 0x0802ec80
  69838. 0801c4e0 <tcp_next_iss>:
  69839. *
  69840. * @return u32_t pseudo random sequence number
  69841. */
  69842. u32_t
  69843. tcp_next_iss(struct tcp_pcb *pcb)
  69844. {
  69845. 801c4e0: b580 push {r7, lr}
  69846. 801c4e2: b082 sub sp, #8
  69847. 801c4e4: af00 add r7, sp, #0
  69848. 801c4e6: 6078 str r0, [r7, #4]
  69849. LWIP_ASSERT("tcp_next_iss: invalid pcb", pcb != NULL);
  69850. return LWIP_HOOK_TCP_ISN(&pcb->local_ip, pcb->local_port, &pcb->remote_ip, pcb->remote_port);
  69851. #else /* LWIP_HOOK_TCP_ISN */
  69852. static u32_t iss = 6510;
  69853. LWIP_ASSERT("tcp_next_iss: invalid pcb", pcb != NULL);
  69854. 801c4e8: 687b ldr r3, [r7, #4]
  69855. 801c4ea: 2b00 cmp r3, #0
  69856. 801c4ec: d106 bne.n 801c4fc <tcp_next_iss+0x1c>
  69857. 801c4ee: 4b0a ldr r3, [pc, #40] @ (801c518 <tcp_next_iss+0x38>)
  69858. 801c4f0: f640 02af movw r2, #2223 @ 0x8af
  69859. 801c4f4: 4909 ldr r1, [pc, #36] @ (801c51c <tcp_next_iss+0x3c>)
  69860. 801c4f6: 480a ldr r0, [pc, #40] @ (801c520 <tcp_next_iss+0x40>)
  69861. 801c4f8: f00d fa68 bl 80299cc <iprintf>
  69862. LWIP_UNUSED_ARG(pcb);
  69863. iss += tcp_ticks; /* XXX */
  69864. 801c4fc: 4b09 ldr r3, [pc, #36] @ (801c524 <tcp_next_iss+0x44>)
  69865. 801c4fe: 681a ldr r2, [r3, #0]
  69866. 801c500: 4b09 ldr r3, [pc, #36] @ (801c528 <tcp_next_iss+0x48>)
  69867. 801c502: 681b ldr r3, [r3, #0]
  69868. 801c504: 4413 add r3, r2
  69869. 801c506: 4a07 ldr r2, [pc, #28] @ (801c524 <tcp_next_iss+0x44>)
  69870. 801c508: 6013 str r3, [r2, #0]
  69871. return iss;
  69872. 801c50a: 4b06 ldr r3, [pc, #24] @ (801c524 <tcp_next_iss+0x44>)
  69873. 801c50c: 681b ldr r3, [r3, #0]
  69874. #endif /* LWIP_HOOK_TCP_ISN */
  69875. }
  69876. 801c50e: 4618 mov r0, r3
  69877. 801c510: 3708 adds r7, #8
  69878. 801c512: 46bd mov sp, r7
  69879. 801c514: bd80 pop {r7, pc}
  69880. 801c516: bf00 nop
  69881. 801c518: 0802e5a8 .word 0x0802e5a8
  69882. 801c51c: 0802ec98 .word 0x0802ec98
  69883. 801c520: 0802e5ec .word 0x0802e5ec
  69884. 801c524: 24000050 .word 0x24000050
  69885. 801c528: 2402ae88 .word 0x2402ae88
  69886. 0801c52c <tcp_eff_send_mss_netif>:
  69887. * by calculating the minimum of TCP_MSS and the mtu (if set) of the target
  69888. * netif (if not NULL).
  69889. */
  69890. u16_t
  69891. tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif, const ip_addr_t *dest)
  69892. {
  69893. 801c52c: b580 push {r7, lr}
  69894. 801c52e: b086 sub sp, #24
  69895. 801c530: af00 add r7, sp, #0
  69896. 801c532: 4603 mov r3, r0
  69897. 801c534: 60b9 str r1, [r7, #8]
  69898. 801c536: 607a str r2, [r7, #4]
  69899. 801c538: 81fb strh r3, [r7, #14]
  69900. u16_t mss_s;
  69901. u16_t mtu;
  69902. LWIP_UNUSED_ARG(dest); /* in case IPv6 is disabled */
  69903. LWIP_ASSERT("tcp_eff_send_mss_netif: invalid dst_ip", dest != NULL);
  69904. 801c53a: 687b ldr r3, [r7, #4]
  69905. 801c53c: 2b00 cmp r3, #0
  69906. 801c53e: d106 bne.n 801c54e <tcp_eff_send_mss_netif+0x22>
  69907. 801c540: 4b14 ldr r3, [pc, #80] @ (801c594 <tcp_eff_send_mss_netif+0x68>)
  69908. 801c542: f640 02c5 movw r2, #2245 @ 0x8c5
  69909. 801c546: 4914 ldr r1, [pc, #80] @ (801c598 <tcp_eff_send_mss_netif+0x6c>)
  69910. 801c548: 4814 ldr r0, [pc, #80] @ (801c59c <tcp_eff_send_mss_netif+0x70>)
  69911. 801c54a: f00d fa3f bl 80299cc <iprintf>
  69912. else
  69913. #endif /* LWIP_IPV4 */
  69914. #endif /* LWIP_IPV6 */
  69915. #if LWIP_IPV4
  69916. {
  69917. if (outif == NULL) {
  69918. 801c54e: 68bb ldr r3, [r7, #8]
  69919. 801c550: 2b00 cmp r3, #0
  69920. 801c552: d101 bne.n 801c558 <tcp_eff_send_mss_netif+0x2c>
  69921. return sendmss;
  69922. 801c554: 89fb ldrh r3, [r7, #14]
  69923. 801c556: e019 b.n 801c58c <tcp_eff_send_mss_netif+0x60>
  69924. }
  69925. mtu = outif->mtu;
  69926. 801c558: 68bb ldr r3, [r7, #8]
  69927. 801c55a: 8d1b ldrh r3, [r3, #40] @ 0x28
  69928. 801c55c: 82fb strh r3, [r7, #22]
  69929. }
  69930. #endif /* LWIP_IPV4 */
  69931. if (mtu != 0) {
  69932. 801c55e: 8afb ldrh r3, [r7, #22]
  69933. 801c560: 2b00 cmp r3, #0
  69934. 801c562: d012 beq.n 801c58a <tcp_eff_send_mss_netif+0x5e>
  69935. else
  69936. #endif /* LWIP_IPV4 */
  69937. #endif /* LWIP_IPV6 */
  69938. #if LWIP_IPV4
  69939. {
  69940. offset = IP_HLEN + TCP_HLEN;
  69941. 801c564: 2328 movs r3, #40 @ 0x28
  69942. 801c566: 82bb strh r3, [r7, #20]
  69943. }
  69944. #endif /* LWIP_IPV4 */
  69945. mss_s = (mtu > offset) ? (u16_t)(mtu - offset) : 0;
  69946. 801c568: 8afa ldrh r2, [r7, #22]
  69947. 801c56a: 8abb ldrh r3, [r7, #20]
  69948. 801c56c: 429a cmp r2, r3
  69949. 801c56e: d904 bls.n 801c57a <tcp_eff_send_mss_netif+0x4e>
  69950. 801c570: 8afa ldrh r2, [r7, #22]
  69951. 801c572: 8abb ldrh r3, [r7, #20]
  69952. 801c574: 1ad3 subs r3, r2, r3
  69953. 801c576: b29b uxth r3, r3
  69954. 801c578: e000 b.n 801c57c <tcp_eff_send_mss_netif+0x50>
  69955. 801c57a: 2300 movs r3, #0
  69956. 801c57c: 827b strh r3, [r7, #18]
  69957. /* RFC 1122, chap 4.2.2.6:
  69958. * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize
  69959. * We correct for TCP options in tcp_write(), and don't support IP options.
  69960. */
  69961. sendmss = LWIP_MIN(sendmss, mss_s);
  69962. 801c57e: 8a7a ldrh r2, [r7, #18]
  69963. 801c580: 89fb ldrh r3, [r7, #14]
  69964. 801c582: 4293 cmp r3, r2
  69965. 801c584: bf28 it cs
  69966. 801c586: 4613 movcs r3, r2
  69967. 801c588: 81fb strh r3, [r7, #14]
  69968. }
  69969. return sendmss;
  69970. 801c58a: 89fb ldrh r3, [r7, #14]
  69971. }
  69972. 801c58c: 4618 mov r0, r3
  69973. 801c58e: 3718 adds r7, #24
  69974. 801c590: 46bd mov sp, r7
  69975. 801c592: bd80 pop {r7, pc}
  69976. 801c594: 0802e5a8 .word 0x0802e5a8
  69977. 801c598: 0802ecb4 .word 0x0802ecb4
  69978. 801c59c: 0802e5ec .word 0x0802e5ec
  69979. 0801c5a0 <tcp_netif_ip_addr_changed_pcblist>:
  69980. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  69981. /** Helper function for tcp_netif_ip_addr_changed() that iterates a pcb list */
  69982. static void
  69983. tcp_netif_ip_addr_changed_pcblist(const ip_addr_t *old_addr, struct tcp_pcb *pcb_list)
  69984. {
  69985. 801c5a0: b580 push {r7, lr}
  69986. 801c5a2: b084 sub sp, #16
  69987. 801c5a4: af00 add r7, sp, #0
  69988. 801c5a6: 6078 str r0, [r7, #4]
  69989. 801c5a8: 6039 str r1, [r7, #0]
  69990. struct tcp_pcb *pcb;
  69991. pcb = pcb_list;
  69992. 801c5aa: 683b ldr r3, [r7, #0]
  69993. 801c5ac: 60fb str r3, [r7, #12]
  69994. LWIP_ASSERT("tcp_netif_ip_addr_changed_pcblist: invalid old_addr", old_addr != NULL);
  69995. 801c5ae: 687b ldr r3, [r7, #4]
  69996. 801c5b0: 2b00 cmp r3, #0
  69997. 801c5b2: d119 bne.n 801c5e8 <tcp_netif_ip_addr_changed_pcblist+0x48>
  69998. 801c5b4: 4b10 ldr r3, [pc, #64] @ (801c5f8 <tcp_netif_ip_addr_changed_pcblist+0x58>)
  69999. 801c5b6: f44f 6210 mov.w r2, #2304 @ 0x900
  70000. 801c5ba: 4910 ldr r1, [pc, #64] @ (801c5fc <tcp_netif_ip_addr_changed_pcblist+0x5c>)
  70001. 801c5bc: 4810 ldr r0, [pc, #64] @ (801c600 <tcp_netif_ip_addr_changed_pcblist+0x60>)
  70002. 801c5be: f00d fa05 bl 80299cc <iprintf>
  70003. while (pcb != NULL) {
  70004. 801c5c2: e011 b.n 801c5e8 <tcp_netif_ip_addr_changed_pcblist+0x48>
  70005. /* PCB bound to current local interface address? */
  70006. if (ip_addr_cmp(&pcb->local_ip, old_addr)
  70007. 801c5c4: 68fb ldr r3, [r7, #12]
  70008. 801c5c6: 681a ldr r2, [r3, #0]
  70009. 801c5c8: 687b ldr r3, [r7, #4]
  70010. 801c5ca: 681b ldr r3, [r3, #0]
  70011. 801c5cc: 429a cmp r2, r3
  70012. 801c5ce: d108 bne.n 801c5e2 <tcp_netif_ip_addr_changed_pcblist+0x42>
  70013. /* connections to link-local addresses must persist (RFC3927 ch. 1.9) */
  70014. && (!IP_IS_V4_VAL(pcb->local_ip) || !ip4_addr_islinklocal(ip_2_ip4(&pcb->local_ip)))
  70015. #endif /* LWIP_AUTOIP */
  70016. ) {
  70017. /* this connection must be aborted */
  70018. struct tcp_pcb *next = pcb->next;
  70019. 801c5d0: 68fb ldr r3, [r7, #12]
  70020. 801c5d2: 68db ldr r3, [r3, #12]
  70021. 801c5d4: 60bb str r3, [r7, #8]
  70022. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb));
  70023. tcp_abort(pcb);
  70024. 801c5d6: 68f8 ldr r0, [r7, #12]
  70025. 801c5d8: f7fe fd86 bl 801b0e8 <tcp_abort>
  70026. pcb = next;
  70027. 801c5dc: 68bb ldr r3, [r7, #8]
  70028. 801c5de: 60fb str r3, [r7, #12]
  70029. 801c5e0: e002 b.n 801c5e8 <tcp_netif_ip_addr_changed_pcblist+0x48>
  70030. } else {
  70031. pcb = pcb->next;
  70032. 801c5e2: 68fb ldr r3, [r7, #12]
  70033. 801c5e4: 68db ldr r3, [r3, #12]
  70034. 801c5e6: 60fb str r3, [r7, #12]
  70035. while (pcb != NULL) {
  70036. 801c5e8: 68fb ldr r3, [r7, #12]
  70037. 801c5ea: 2b00 cmp r3, #0
  70038. 801c5ec: d1ea bne.n 801c5c4 <tcp_netif_ip_addr_changed_pcblist+0x24>
  70039. }
  70040. }
  70041. }
  70042. 801c5ee: bf00 nop
  70043. 801c5f0: bf00 nop
  70044. 801c5f2: 3710 adds r7, #16
  70045. 801c5f4: 46bd mov sp, r7
  70046. 801c5f6: bd80 pop {r7, pc}
  70047. 801c5f8: 0802e5a8 .word 0x0802e5a8
  70048. 801c5fc: 0802ecdc .word 0x0802ecdc
  70049. 801c600: 0802e5ec .word 0x0802e5ec
  70050. 0801c604 <tcp_netif_ip_addr_changed>:
  70051. * @param old_addr IP address of the netif before change
  70052. * @param new_addr IP address of the netif after change or NULL if netif has been removed
  70053. */
  70054. void
  70055. tcp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr)
  70056. {
  70057. 801c604: b580 push {r7, lr}
  70058. 801c606: b084 sub sp, #16
  70059. 801c608: af00 add r7, sp, #0
  70060. 801c60a: 6078 str r0, [r7, #4]
  70061. 801c60c: 6039 str r1, [r7, #0]
  70062. struct tcp_pcb_listen *lpcb;
  70063. if (!ip_addr_isany(old_addr)) {
  70064. 801c60e: 687b ldr r3, [r7, #4]
  70065. 801c610: 2b00 cmp r3, #0
  70066. 801c612: d02a beq.n 801c66a <tcp_netif_ip_addr_changed+0x66>
  70067. 801c614: 687b ldr r3, [r7, #4]
  70068. 801c616: 681b ldr r3, [r3, #0]
  70069. 801c618: 2b00 cmp r3, #0
  70070. 801c61a: d026 beq.n 801c66a <tcp_netif_ip_addr_changed+0x66>
  70071. tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_active_pcbs);
  70072. 801c61c: 4b15 ldr r3, [pc, #84] @ (801c674 <tcp_netif_ip_addr_changed+0x70>)
  70073. 801c61e: 681b ldr r3, [r3, #0]
  70074. 801c620: 4619 mov r1, r3
  70075. 801c622: 6878 ldr r0, [r7, #4]
  70076. 801c624: f7ff ffbc bl 801c5a0 <tcp_netif_ip_addr_changed_pcblist>
  70077. tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_bound_pcbs);
  70078. 801c628: 4b13 ldr r3, [pc, #76] @ (801c678 <tcp_netif_ip_addr_changed+0x74>)
  70079. 801c62a: 681b ldr r3, [r3, #0]
  70080. 801c62c: 4619 mov r1, r3
  70081. 801c62e: 6878 ldr r0, [r7, #4]
  70082. 801c630: f7ff ffb6 bl 801c5a0 <tcp_netif_ip_addr_changed_pcblist>
  70083. if (!ip_addr_isany(new_addr)) {
  70084. 801c634: 683b ldr r3, [r7, #0]
  70085. 801c636: 2b00 cmp r3, #0
  70086. 801c638: d017 beq.n 801c66a <tcp_netif_ip_addr_changed+0x66>
  70087. 801c63a: 683b ldr r3, [r7, #0]
  70088. 801c63c: 681b ldr r3, [r3, #0]
  70089. 801c63e: 2b00 cmp r3, #0
  70090. 801c640: d013 beq.n 801c66a <tcp_netif_ip_addr_changed+0x66>
  70091. /* PCB bound to current local interface address? */
  70092. for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  70093. 801c642: 4b0e ldr r3, [pc, #56] @ (801c67c <tcp_netif_ip_addr_changed+0x78>)
  70094. 801c644: 681b ldr r3, [r3, #0]
  70095. 801c646: 60fb str r3, [r7, #12]
  70096. 801c648: e00c b.n 801c664 <tcp_netif_ip_addr_changed+0x60>
  70097. /* PCB bound to current local interface address? */
  70098. if (ip_addr_cmp(&lpcb->local_ip, old_addr)) {
  70099. 801c64a: 68fb ldr r3, [r7, #12]
  70100. 801c64c: 681a ldr r2, [r3, #0]
  70101. 801c64e: 687b ldr r3, [r7, #4]
  70102. 801c650: 681b ldr r3, [r3, #0]
  70103. 801c652: 429a cmp r2, r3
  70104. 801c654: d103 bne.n 801c65e <tcp_netif_ip_addr_changed+0x5a>
  70105. /* The PCB is listening to the old ipaddr and
  70106. * is set to listen to the new one instead */
  70107. ip_addr_copy(lpcb->local_ip, *new_addr);
  70108. 801c656: 683b ldr r3, [r7, #0]
  70109. 801c658: 681a ldr r2, [r3, #0]
  70110. 801c65a: 68fb ldr r3, [r7, #12]
  70111. 801c65c: 601a str r2, [r3, #0]
  70112. for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  70113. 801c65e: 68fb ldr r3, [r7, #12]
  70114. 801c660: 68db ldr r3, [r3, #12]
  70115. 801c662: 60fb str r3, [r7, #12]
  70116. 801c664: 68fb ldr r3, [r7, #12]
  70117. 801c666: 2b00 cmp r3, #0
  70118. 801c668: d1ef bne.n 801c64a <tcp_netif_ip_addr_changed+0x46>
  70119. }
  70120. }
  70121. }
  70122. }
  70123. }
  70124. 801c66a: bf00 nop
  70125. 801c66c: 3710 adds r7, #16
  70126. 801c66e: 46bd mov sp, r7
  70127. 801c670: bd80 pop {r7, pc}
  70128. 801c672: bf00 nop
  70129. 801c674: 2402ae94 .word 0x2402ae94
  70130. 801c678: 2402ae8c .word 0x2402ae8c
  70131. 801c67c: 2402ae90 .word 0x2402ae90
  70132. 0801c680 <tcp_free_ooseq>:
  70133. #if TCP_QUEUE_OOSEQ
  70134. /* Free all ooseq pbufs (and possibly reset SACK state) */
  70135. void
  70136. tcp_free_ooseq(struct tcp_pcb *pcb)
  70137. {
  70138. 801c680: b580 push {r7, lr}
  70139. 801c682: b082 sub sp, #8
  70140. 801c684: af00 add r7, sp, #0
  70141. 801c686: 6078 str r0, [r7, #4]
  70142. if (pcb->ooseq) {
  70143. 801c688: 687b ldr r3, [r7, #4]
  70144. 801c68a: 6f5b ldr r3, [r3, #116] @ 0x74
  70145. 801c68c: 2b00 cmp r3, #0
  70146. 801c68e: d007 beq.n 801c6a0 <tcp_free_ooseq+0x20>
  70147. tcp_segs_free(pcb->ooseq);
  70148. 801c690: 687b ldr r3, [r7, #4]
  70149. 801c692: 6f5b ldr r3, [r3, #116] @ 0x74
  70150. 801c694: 4618 mov r0, r3
  70151. 801c696: f7ff fb65 bl 801bd64 <tcp_segs_free>
  70152. pcb->ooseq = NULL;
  70153. 801c69a: 687b ldr r3, [r7, #4]
  70154. 801c69c: 2200 movs r2, #0
  70155. 801c69e: 675a str r2, [r3, #116] @ 0x74
  70156. #if LWIP_TCP_SACK_OUT
  70157. memset(pcb->rcv_sacks, 0, sizeof(pcb->rcv_sacks));
  70158. #endif /* LWIP_TCP_SACK_OUT */
  70159. }
  70160. }
  70161. 801c6a0: bf00 nop
  70162. 801c6a2: 3708 adds r7, #8
  70163. 801c6a4: 46bd mov sp, r7
  70164. 801c6a6: bd80 pop {r7, pc}
  70165. 0801c6a8 <tcp_input>:
  70166. * @param p received TCP segment to process (p->payload pointing to the TCP header)
  70167. * @param inp network interface on which this segment was received
  70168. */
  70169. void
  70170. tcp_input(struct pbuf *p, struct netif *inp)
  70171. {
  70172. 801c6a8: b590 push {r4, r7, lr}
  70173. 801c6aa: b08d sub sp, #52 @ 0x34
  70174. 801c6ac: af04 add r7, sp, #16
  70175. 801c6ae: 6078 str r0, [r7, #4]
  70176. 801c6b0: 6039 str r1, [r7, #0]
  70177. #endif /* SO_REUSE */
  70178. u8_t hdrlen_bytes;
  70179. err_t err;
  70180. LWIP_UNUSED_ARG(inp);
  70181. LWIP_ASSERT_CORE_LOCKED();
  70182. 801c6b2: f7f3 ff3d bl 8010530 <sys_check_core_locking>
  70183. LWIP_ASSERT("tcp_input: invalid pbuf", p != NULL);
  70184. 801c6b6: 687b ldr r3, [r7, #4]
  70185. 801c6b8: 2b00 cmp r3, #0
  70186. 801c6ba: d105 bne.n 801c6c8 <tcp_input+0x20>
  70187. 801c6bc: 4b9b ldr r3, [pc, #620] @ (801c92c <tcp_input+0x284>)
  70188. 801c6be: 2283 movs r2, #131 @ 0x83
  70189. 801c6c0: 499b ldr r1, [pc, #620] @ (801c930 <tcp_input+0x288>)
  70190. 801c6c2: 489c ldr r0, [pc, #624] @ (801c934 <tcp_input+0x28c>)
  70191. 801c6c4: f00d f982 bl 80299cc <iprintf>
  70192. PERF_START;
  70193. TCP_STATS_INC(tcp.recv);
  70194. MIB2_STATS_INC(mib2.tcpinsegs);
  70195. tcphdr = (struct tcp_hdr *)p->payload;
  70196. 801c6c8: 687b ldr r3, [r7, #4]
  70197. 801c6ca: 685b ldr r3, [r3, #4]
  70198. 801c6cc: 4a9a ldr r2, [pc, #616] @ (801c938 <tcp_input+0x290>)
  70199. 801c6ce: 6013 str r3, [r2, #0]
  70200. #if TCP_INPUT_DEBUG
  70201. tcp_debug_print(tcphdr);
  70202. #endif
  70203. /* Check that TCP header fits in payload */
  70204. if (p->len < TCP_HLEN) {
  70205. 801c6d0: 687b ldr r3, [r7, #4]
  70206. 801c6d2: 895b ldrh r3, [r3, #10]
  70207. 801c6d4: 2b13 cmp r3, #19
  70208. 801c6d6: f240 83d1 bls.w 801ce7c <tcp_input+0x7d4>
  70209. TCP_STATS_INC(tcp.lenerr);
  70210. goto dropped;
  70211. }
  70212. /* Don't even process incoming broadcasts/multicasts. */
  70213. if (ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()) ||
  70214. 801c6da: 4b98 ldr r3, [pc, #608] @ (801c93c <tcp_input+0x294>)
  70215. 801c6dc: 695b ldr r3, [r3, #20]
  70216. 801c6de: 4a97 ldr r2, [pc, #604] @ (801c93c <tcp_input+0x294>)
  70217. 801c6e0: 6812 ldr r2, [r2, #0]
  70218. 801c6e2: 4611 mov r1, r2
  70219. 801c6e4: 4618 mov r0, r3
  70220. 801c6e6: f008 fc1b bl 8024f20 <ip4_addr_isbroadcast_u32>
  70221. 801c6ea: 4603 mov r3, r0
  70222. 801c6ec: 2b00 cmp r3, #0
  70223. 801c6ee: f040 83c7 bne.w 801ce80 <tcp_input+0x7d8>
  70224. ip_addr_ismulticast(ip_current_dest_addr())) {
  70225. 801c6f2: 4b92 ldr r3, [pc, #584] @ (801c93c <tcp_input+0x294>)
  70226. 801c6f4: 695b ldr r3, [r3, #20]
  70227. 801c6f6: f003 03f0 and.w r3, r3, #240 @ 0xf0
  70228. if (ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()) ||
  70229. 801c6fa: 2be0 cmp r3, #224 @ 0xe0
  70230. 801c6fc: f000 83c0 beq.w 801ce80 <tcp_input+0x7d8>
  70231. }
  70232. }
  70233. #endif /* CHECKSUM_CHECK_TCP */
  70234. /* sanity-check header length */
  70235. hdrlen_bytes = TCPH_HDRLEN_BYTES(tcphdr);
  70236. 801c700: 4b8d ldr r3, [pc, #564] @ (801c938 <tcp_input+0x290>)
  70237. 801c702: 681b ldr r3, [r3, #0]
  70238. 801c704: 899b ldrh r3, [r3, #12]
  70239. 801c706: b29b uxth r3, r3
  70240. 801c708: 4618 mov r0, r3
  70241. 801c70a: f7fc fa05 bl 8018b18 <lwip_htons>
  70242. 801c70e: 4603 mov r3, r0
  70243. 801c710: 0b1b lsrs r3, r3, #12
  70244. 801c712: b29b uxth r3, r3
  70245. 801c714: b2db uxtb r3, r3
  70246. 801c716: 009b lsls r3, r3, #2
  70247. 801c718: 74bb strb r3, [r7, #18]
  70248. if ((hdrlen_bytes < TCP_HLEN) || (hdrlen_bytes > p->tot_len)) {
  70249. 801c71a: 7cbb ldrb r3, [r7, #18]
  70250. 801c71c: 2b13 cmp r3, #19
  70251. 801c71e: f240 83b1 bls.w 801ce84 <tcp_input+0x7dc>
  70252. 801c722: 7cbb ldrb r3, [r7, #18]
  70253. 801c724: b29a uxth r2, r3
  70254. 801c726: 687b ldr r3, [r7, #4]
  70255. 801c728: 891b ldrh r3, [r3, #8]
  70256. 801c72a: 429a cmp r2, r3
  70257. 801c72c: f200 83aa bhi.w 801ce84 <tcp_input+0x7dc>
  70258. goto dropped;
  70259. }
  70260. /* Move the payload pointer in the pbuf so that it points to the
  70261. TCP data instead of the TCP header. */
  70262. tcphdr_optlen = (u16_t)(hdrlen_bytes - TCP_HLEN);
  70263. 801c730: 7cbb ldrb r3, [r7, #18]
  70264. 801c732: b29b uxth r3, r3
  70265. 801c734: 3b14 subs r3, #20
  70266. 801c736: b29a uxth r2, r3
  70267. 801c738: 4b81 ldr r3, [pc, #516] @ (801c940 <tcp_input+0x298>)
  70268. 801c73a: 801a strh r2, [r3, #0]
  70269. tcphdr_opt2 = NULL;
  70270. 801c73c: 4b81 ldr r3, [pc, #516] @ (801c944 <tcp_input+0x29c>)
  70271. 801c73e: 2200 movs r2, #0
  70272. 801c740: 601a str r2, [r3, #0]
  70273. if (p->len >= hdrlen_bytes) {
  70274. 801c742: 687b ldr r3, [r7, #4]
  70275. 801c744: 895a ldrh r2, [r3, #10]
  70276. 801c746: 7cbb ldrb r3, [r7, #18]
  70277. 801c748: b29b uxth r3, r3
  70278. 801c74a: 429a cmp r2, r3
  70279. 801c74c: d309 bcc.n 801c762 <tcp_input+0xba>
  70280. /* all options are in the first pbuf */
  70281. tcphdr_opt1len = tcphdr_optlen;
  70282. 801c74e: 4b7c ldr r3, [pc, #496] @ (801c940 <tcp_input+0x298>)
  70283. 801c750: 881a ldrh r2, [r3, #0]
  70284. 801c752: 4b7d ldr r3, [pc, #500] @ (801c948 <tcp_input+0x2a0>)
  70285. 801c754: 801a strh r2, [r3, #0]
  70286. pbuf_remove_header(p, hdrlen_bytes); /* cannot fail */
  70287. 801c756: 7cbb ldrb r3, [r7, #18]
  70288. 801c758: 4619 mov r1, r3
  70289. 801c75a: 6878 ldr r0, [r7, #4]
  70290. 801c75c: f7fd fe06 bl 801a36c <pbuf_remove_header>
  70291. 801c760: e04e b.n 801c800 <tcp_input+0x158>
  70292. } else {
  70293. u16_t opt2len;
  70294. /* TCP header fits into first pbuf, options don't - data is in the next pbuf */
  70295. /* there must be a next pbuf, due to hdrlen_bytes sanity check above */
  70296. LWIP_ASSERT("p->next != NULL", p->next != NULL);
  70297. 801c762: 687b ldr r3, [r7, #4]
  70298. 801c764: 681b ldr r3, [r3, #0]
  70299. 801c766: 2b00 cmp r3, #0
  70300. 801c768: d105 bne.n 801c776 <tcp_input+0xce>
  70301. 801c76a: 4b70 ldr r3, [pc, #448] @ (801c92c <tcp_input+0x284>)
  70302. 801c76c: 22c2 movs r2, #194 @ 0xc2
  70303. 801c76e: 4977 ldr r1, [pc, #476] @ (801c94c <tcp_input+0x2a4>)
  70304. 801c770: 4870 ldr r0, [pc, #448] @ (801c934 <tcp_input+0x28c>)
  70305. 801c772: f00d f92b bl 80299cc <iprintf>
  70306. /* advance over the TCP header (cannot fail) */
  70307. pbuf_remove_header(p, TCP_HLEN);
  70308. 801c776: 2114 movs r1, #20
  70309. 801c778: 6878 ldr r0, [r7, #4]
  70310. 801c77a: f7fd fdf7 bl 801a36c <pbuf_remove_header>
  70311. /* determine how long the first and second parts of the options are */
  70312. tcphdr_opt1len = p->len;
  70313. 801c77e: 687b ldr r3, [r7, #4]
  70314. 801c780: 895a ldrh r2, [r3, #10]
  70315. 801c782: 4b71 ldr r3, [pc, #452] @ (801c948 <tcp_input+0x2a0>)
  70316. 801c784: 801a strh r2, [r3, #0]
  70317. opt2len = (u16_t)(tcphdr_optlen - tcphdr_opt1len);
  70318. 801c786: 4b6e ldr r3, [pc, #440] @ (801c940 <tcp_input+0x298>)
  70319. 801c788: 881a ldrh r2, [r3, #0]
  70320. 801c78a: 4b6f ldr r3, [pc, #444] @ (801c948 <tcp_input+0x2a0>)
  70321. 801c78c: 881b ldrh r3, [r3, #0]
  70322. 801c78e: 1ad3 subs r3, r2, r3
  70323. 801c790: 823b strh r3, [r7, #16]
  70324. /* options continue in the next pbuf: set p to zero length and hide the
  70325. options in the next pbuf (adjusting p->tot_len) */
  70326. pbuf_remove_header(p, tcphdr_opt1len);
  70327. 801c792: 4b6d ldr r3, [pc, #436] @ (801c948 <tcp_input+0x2a0>)
  70328. 801c794: 881b ldrh r3, [r3, #0]
  70329. 801c796: 4619 mov r1, r3
  70330. 801c798: 6878 ldr r0, [r7, #4]
  70331. 801c79a: f7fd fde7 bl 801a36c <pbuf_remove_header>
  70332. /* check that the options fit in the second pbuf */
  70333. if (opt2len > p->next->len) {
  70334. 801c79e: 687b ldr r3, [r7, #4]
  70335. 801c7a0: 681b ldr r3, [r3, #0]
  70336. 801c7a2: 895b ldrh r3, [r3, #10]
  70337. 801c7a4: 8a3a ldrh r2, [r7, #16]
  70338. 801c7a6: 429a cmp r2, r3
  70339. 801c7a8: f200 836e bhi.w 801ce88 <tcp_input+0x7e0>
  70340. TCP_STATS_INC(tcp.lenerr);
  70341. goto dropped;
  70342. }
  70343. /* remember the pointer to the second part of the options */
  70344. tcphdr_opt2 = (u8_t *)p->next->payload;
  70345. 801c7ac: 687b ldr r3, [r7, #4]
  70346. 801c7ae: 681b ldr r3, [r3, #0]
  70347. 801c7b0: 685b ldr r3, [r3, #4]
  70348. 801c7b2: 4a64 ldr r2, [pc, #400] @ (801c944 <tcp_input+0x29c>)
  70349. 801c7b4: 6013 str r3, [r2, #0]
  70350. /* advance p->next to point after the options, and manually
  70351. adjust p->tot_len to keep it consistent with the changed p->next */
  70352. pbuf_remove_header(p->next, opt2len);
  70353. 801c7b6: 687b ldr r3, [r7, #4]
  70354. 801c7b8: 681b ldr r3, [r3, #0]
  70355. 801c7ba: 8a3a ldrh r2, [r7, #16]
  70356. 801c7bc: 4611 mov r1, r2
  70357. 801c7be: 4618 mov r0, r3
  70358. 801c7c0: f7fd fdd4 bl 801a36c <pbuf_remove_header>
  70359. p->tot_len = (u16_t)(p->tot_len - opt2len);
  70360. 801c7c4: 687b ldr r3, [r7, #4]
  70361. 801c7c6: 891a ldrh r2, [r3, #8]
  70362. 801c7c8: 8a3b ldrh r3, [r7, #16]
  70363. 801c7ca: 1ad3 subs r3, r2, r3
  70364. 801c7cc: b29a uxth r2, r3
  70365. 801c7ce: 687b ldr r3, [r7, #4]
  70366. 801c7d0: 811a strh r2, [r3, #8]
  70367. LWIP_ASSERT("p->len == 0", p->len == 0);
  70368. 801c7d2: 687b ldr r3, [r7, #4]
  70369. 801c7d4: 895b ldrh r3, [r3, #10]
  70370. 801c7d6: 2b00 cmp r3, #0
  70371. 801c7d8: d005 beq.n 801c7e6 <tcp_input+0x13e>
  70372. 801c7da: 4b54 ldr r3, [pc, #336] @ (801c92c <tcp_input+0x284>)
  70373. 801c7dc: 22df movs r2, #223 @ 0xdf
  70374. 801c7de: 495c ldr r1, [pc, #368] @ (801c950 <tcp_input+0x2a8>)
  70375. 801c7e0: 4854 ldr r0, [pc, #336] @ (801c934 <tcp_input+0x28c>)
  70376. 801c7e2: f00d f8f3 bl 80299cc <iprintf>
  70377. LWIP_ASSERT("p->tot_len == p->next->tot_len", p->tot_len == p->next->tot_len);
  70378. 801c7e6: 687b ldr r3, [r7, #4]
  70379. 801c7e8: 891a ldrh r2, [r3, #8]
  70380. 801c7ea: 687b ldr r3, [r7, #4]
  70381. 801c7ec: 681b ldr r3, [r3, #0]
  70382. 801c7ee: 891b ldrh r3, [r3, #8]
  70383. 801c7f0: 429a cmp r2, r3
  70384. 801c7f2: d005 beq.n 801c800 <tcp_input+0x158>
  70385. 801c7f4: 4b4d ldr r3, [pc, #308] @ (801c92c <tcp_input+0x284>)
  70386. 801c7f6: 22e0 movs r2, #224 @ 0xe0
  70387. 801c7f8: 4956 ldr r1, [pc, #344] @ (801c954 <tcp_input+0x2ac>)
  70388. 801c7fa: 484e ldr r0, [pc, #312] @ (801c934 <tcp_input+0x28c>)
  70389. 801c7fc: f00d f8e6 bl 80299cc <iprintf>
  70390. }
  70391. /* Convert fields in TCP header to host byte order. */
  70392. tcphdr->src = lwip_ntohs(tcphdr->src);
  70393. 801c800: 4b4d ldr r3, [pc, #308] @ (801c938 <tcp_input+0x290>)
  70394. 801c802: 681b ldr r3, [r3, #0]
  70395. 801c804: 881b ldrh r3, [r3, #0]
  70396. 801c806: b29b uxth r3, r3
  70397. 801c808: 4a4b ldr r2, [pc, #300] @ (801c938 <tcp_input+0x290>)
  70398. 801c80a: 6814 ldr r4, [r2, #0]
  70399. 801c80c: 4618 mov r0, r3
  70400. 801c80e: f7fc f983 bl 8018b18 <lwip_htons>
  70401. 801c812: 4603 mov r3, r0
  70402. 801c814: 8023 strh r3, [r4, #0]
  70403. tcphdr->dest = lwip_ntohs(tcphdr->dest);
  70404. 801c816: 4b48 ldr r3, [pc, #288] @ (801c938 <tcp_input+0x290>)
  70405. 801c818: 681b ldr r3, [r3, #0]
  70406. 801c81a: 885b ldrh r3, [r3, #2]
  70407. 801c81c: b29b uxth r3, r3
  70408. 801c81e: 4a46 ldr r2, [pc, #280] @ (801c938 <tcp_input+0x290>)
  70409. 801c820: 6814 ldr r4, [r2, #0]
  70410. 801c822: 4618 mov r0, r3
  70411. 801c824: f7fc f978 bl 8018b18 <lwip_htons>
  70412. 801c828: 4603 mov r3, r0
  70413. 801c82a: 8063 strh r3, [r4, #2]
  70414. seqno = tcphdr->seqno = lwip_ntohl(tcphdr->seqno);
  70415. 801c82c: 4b42 ldr r3, [pc, #264] @ (801c938 <tcp_input+0x290>)
  70416. 801c82e: 681b ldr r3, [r3, #0]
  70417. 801c830: 685b ldr r3, [r3, #4]
  70418. 801c832: 4a41 ldr r2, [pc, #260] @ (801c938 <tcp_input+0x290>)
  70419. 801c834: 6814 ldr r4, [r2, #0]
  70420. 801c836: 4618 mov r0, r3
  70421. 801c838: f7fc f983 bl 8018b42 <lwip_htonl>
  70422. 801c83c: 4603 mov r3, r0
  70423. 801c83e: 6063 str r3, [r4, #4]
  70424. 801c840: 6863 ldr r3, [r4, #4]
  70425. 801c842: 4a45 ldr r2, [pc, #276] @ (801c958 <tcp_input+0x2b0>)
  70426. 801c844: 6013 str r3, [r2, #0]
  70427. ackno = tcphdr->ackno = lwip_ntohl(tcphdr->ackno);
  70428. 801c846: 4b3c ldr r3, [pc, #240] @ (801c938 <tcp_input+0x290>)
  70429. 801c848: 681b ldr r3, [r3, #0]
  70430. 801c84a: 689b ldr r3, [r3, #8]
  70431. 801c84c: 4a3a ldr r2, [pc, #232] @ (801c938 <tcp_input+0x290>)
  70432. 801c84e: 6814 ldr r4, [r2, #0]
  70433. 801c850: 4618 mov r0, r3
  70434. 801c852: f7fc f976 bl 8018b42 <lwip_htonl>
  70435. 801c856: 4603 mov r3, r0
  70436. 801c858: 60a3 str r3, [r4, #8]
  70437. 801c85a: 68a3 ldr r3, [r4, #8]
  70438. 801c85c: 4a3f ldr r2, [pc, #252] @ (801c95c <tcp_input+0x2b4>)
  70439. 801c85e: 6013 str r3, [r2, #0]
  70440. tcphdr->wnd = lwip_ntohs(tcphdr->wnd);
  70441. 801c860: 4b35 ldr r3, [pc, #212] @ (801c938 <tcp_input+0x290>)
  70442. 801c862: 681b ldr r3, [r3, #0]
  70443. 801c864: 89db ldrh r3, [r3, #14]
  70444. 801c866: b29b uxth r3, r3
  70445. 801c868: 4a33 ldr r2, [pc, #204] @ (801c938 <tcp_input+0x290>)
  70446. 801c86a: 6814 ldr r4, [r2, #0]
  70447. 801c86c: 4618 mov r0, r3
  70448. 801c86e: f7fc f953 bl 8018b18 <lwip_htons>
  70449. 801c872: 4603 mov r3, r0
  70450. 801c874: 81e3 strh r3, [r4, #14]
  70451. flags = TCPH_FLAGS(tcphdr);
  70452. 801c876: 4b30 ldr r3, [pc, #192] @ (801c938 <tcp_input+0x290>)
  70453. 801c878: 681b ldr r3, [r3, #0]
  70454. 801c87a: 899b ldrh r3, [r3, #12]
  70455. 801c87c: b29b uxth r3, r3
  70456. 801c87e: 4618 mov r0, r3
  70457. 801c880: f7fc f94a bl 8018b18 <lwip_htons>
  70458. 801c884: 4603 mov r3, r0
  70459. 801c886: b2db uxtb r3, r3
  70460. 801c888: f003 033f and.w r3, r3, #63 @ 0x3f
  70461. 801c88c: b2da uxtb r2, r3
  70462. 801c88e: 4b34 ldr r3, [pc, #208] @ (801c960 <tcp_input+0x2b8>)
  70463. 801c890: 701a strb r2, [r3, #0]
  70464. tcplen = p->tot_len;
  70465. 801c892: 687b ldr r3, [r7, #4]
  70466. 801c894: 891a ldrh r2, [r3, #8]
  70467. 801c896: 4b33 ldr r3, [pc, #204] @ (801c964 <tcp_input+0x2bc>)
  70468. 801c898: 801a strh r2, [r3, #0]
  70469. if (flags & (TCP_FIN | TCP_SYN)) {
  70470. 801c89a: 4b31 ldr r3, [pc, #196] @ (801c960 <tcp_input+0x2b8>)
  70471. 801c89c: 781b ldrb r3, [r3, #0]
  70472. 801c89e: f003 0303 and.w r3, r3, #3
  70473. 801c8a2: 2b00 cmp r3, #0
  70474. 801c8a4: d00c beq.n 801c8c0 <tcp_input+0x218>
  70475. tcplen++;
  70476. 801c8a6: 4b2f ldr r3, [pc, #188] @ (801c964 <tcp_input+0x2bc>)
  70477. 801c8a8: 881b ldrh r3, [r3, #0]
  70478. 801c8aa: 3301 adds r3, #1
  70479. 801c8ac: b29a uxth r2, r3
  70480. 801c8ae: 4b2d ldr r3, [pc, #180] @ (801c964 <tcp_input+0x2bc>)
  70481. 801c8b0: 801a strh r2, [r3, #0]
  70482. if (tcplen < p->tot_len) {
  70483. 801c8b2: 687b ldr r3, [r7, #4]
  70484. 801c8b4: 891a ldrh r2, [r3, #8]
  70485. 801c8b6: 4b2b ldr r3, [pc, #172] @ (801c964 <tcp_input+0x2bc>)
  70486. 801c8b8: 881b ldrh r3, [r3, #0]
  70487. 801c8ba: 429a cmp r2, r3
  70488. 801c8bc: f200 82e6 bhi.w 801ce8c <tcp_input+0x7e4>
  70489. }
  70490. }
  70491. /* Demultiplex an incoming segment. First, we check if it is destined
  70492. for an active connection. */
  70493. prev = NULL;
  70494. 801c8c0: 2300 movs r3, #0
  70495. 801c8c2: 61fb str r3, [r7, #28]
  70496. for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  70497. 801c8c4: 4b28 ldr r3, [pc, #160] @ (801c968 <tcp_input+0x2c0>)
  70498. 801c8c6: 681b ldr r3, [r3, #0]
  70499. 801c8c8: 61bb str r3, [r7, #24]
  70500. 801c8ca: e09d b.n 801ca08 <tcp_input+0x360>
  70501. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  70502. 801c8cc: 69bb ldr r3, [r7, #24]
  70503. 801c8ce: 7d1b ldrb r3, [r3, #20]
  70504. 801c8d0: 2b00 cmp r3, #0
  70505. 801c8d2: d105 bne.n 801c8e0 <tcp_input+0x238>
  70506. 801c8d4: 4b15 ldr r3, [pc, #84] @ (801c92c <tcp_input+0x284>)
  70507. 801c8d6: 22fb movs r2, #251 @ 0xfb
  70508. 801c8d8: 4924 ldr r1, [pc, #144] @ (801c96c <tcp_input+0x2c4>)
  70509. 801c8da: 4816 ldr r0, [pc, #88] @ (801c934 <tcp_input+0x28c>)
  70510. 801c8dc: f00d f876 bl 80299cc <iprintf>
  70511. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  70512. 801c8e0: 69bb ldr r3, [r7, #24]
  70513. 801c8e2: 7d1b ldrb r3, [r3, #20]
  70514. 801c8e4: 2b0a cmp r3, #10
  70515. 801c8e6: d105 bne.n 801c8f4 <tcp_input+0x24c>
  70516. 801c8e8: 4b10 ldr r3, [pc, #64] @ (801c92c <tcp_input+0x284>)
  70517. 801c8ea: 22fc movs r2, #252 @ 0xfc
  70518. 801c8ec: 4920 ldr r1, [pc, #128] @ (801c970 <tcp_input+0x2c8>)
  70519. 801c8ee: 4811 ldr r0, [pc, #68] @ (801c934 <tcp_input+0x28c>)
  70520. 801c8f0: f00d f86c bl 80299cc <iprintf>
  70521. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  70522. 801c8f4: 69bb ldr r3, [r7, #24]
  70523. 801c8f6: 7d1b ldrb r3, [r3, #20]
  70524. 801c8f8: 2b01 cmp r3, #1
  70525. 801c8fa: d105 bne.n 801c908 <tcp_input+0x260>
  70526. 801c8fc: 4b0b ldr r3, [pc, #44] @ (801c92c <tcp_input+0x284>)
  70527. 801c8fe: 22fd movs r2, #253 @ 0xfd
  70528. 801c900: 491c ldr r1, [pc, #112] @ (801c974 <tcp_input+0x2cc>)
  70529. 801c902: 480c ldr r0, [pc, #48] @ (801c934 <tcp_input+0x28c>)
  70530. 801c904: f00d f862 bl 80299cc <iprintf>
  70531. /* check if PCB is bound to specific netif */
  70532. if ((pcb->netif_idx != NETIF_NO_INDEX) &&
  70533. 801c908: 69bb ldr r3, [r7, #24]
  70534. 801c90a: 7a1b ldrb r3, [r3, #8]
  70535. 801c90c: 2b00 cmp r3, #0
  70536. 801c90e: d033 beq.n 801c978 <tcp_input+0x2d0>
  70537. (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
  70538. 801c910: 69bb ldr r3, [r7, #24]
  70539. 801c912: 7a1a ldrb r2, [r3, #8]
  70540. 801c914: 4b09 ldr r3, [pc, #36] @ (801c93c <tcp_input+0x294>)
  70541. 801c916: 685b ldr r3, [r3, #4]
  70542. 801c918: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  70543. 801c91c: 3301 adds r3, #1
  70544. 801c91e: b2db uxtb r3, r3
  70545. if ((pcb->netif_idx != NETIF_NO_INDEX) &&
  70546. 801c920: 429a cmp r2, r3
  70547. 801c922: d029 beq.n 801c978 <tcp_input+0x2d0>
  70548. prev = pcb;
  70549. 801c924: 69bb ldr r3, [r7, #24]
  70550. 801c926: 61fb str r3, [r7, #28]
  70551. continue;
  70552. 801c928: e06b b.n 801ca02 <tcp_input+0x35a>
  70553. 801c92a: bf00 nop
  70554. 801c92c: 0802ed10 .word 0x0802ed10
  70555. 801c930: 0802ed44 .word 0x0802ed44
  70556. 801c934: 0802ed5c .word 0x0802ed5c
  70557. 801c938: 2402aeb4 .word 0x2402aeb4
  70558. 801c93c: 24024338 .word 0x24024338
  70559. 801c940: 2402aeb8 .word 0x2402aeb8
  70560. 801c944: 2402aebc .word 0x2402aebc
  70561. 801c948: 2402aeba .word 0x2402aeba
  70562. 801c94c: 0802ed84 .word 0x0802ed84
  70563. 801c950: 0802ed94 .word 0x0802ed94
  70564. 801c954: 0802eda0 .word 0x0802eda0
  70565. 801c958: 2402aec4 .word 0x2402aec4
  70566. 801c95c: 2402aec8 .word 0x2402aec8
  70567. 801c960: 2402aed0 .word 0x2402aed0
  70568. 801c964: 2402aece .word 0x2402aece
  70569. 801c968: 2402ae94 .word 0x2402ae94
  70570. 801c96c: 0802edc0 .word 0x0802edc0
  70571. 801c970: 0802ede8 .word 0x0802ede8
  70572. 801c974: 0802ee14 .word 0x0802ee14
  70573. }
  70574. if (pcb->remote_port == tcphdr->src &&
  70575. 801c978: 69bb ldr r3, [r7, #24]
  70576. 801c97a: 8b1a ldrh r2, [r3, #24]
  70577. 801c97c: 4b72 ldr r3, [pc, #456] @ (801cb48 <tcp_input+0x4a0>)
  70578. 801c97e: 681b ldr r3, [r3, #0]
  70579. 801c980: 881b ldrh r3, [r3, #0]
  70580. 801c982: b29b uxth r3, r3
  70581. 801c984: 429a cmp r2, r3
  70582. 801c986: d13a bne.n 801c9fe <tcp_input+0x356>
  70583. pcb->local_port == tcphdr->dest &&
  70584. 801c988: 69bb ldr r3, [r7, #24]
  70585. 801c98a: 8ada ldrh r2, [r3, #22]
  70586. 801c98c: 4b6e ldr r3, [pc, #440] @ (801cb48 <tcp_input+0x4a0>)
  70587. 801c98e: 681b ldr r3, [r3, #0]
  70588. 801c990: 885b ldrh r3, [r3, #2]
  70589. 801c992: b29b uxth r3, r3
  70590. if (pcb->remote_port == tcphdr->src &&
  70591. 801c994: 429a cmp r2, r3
  70592. 801c996: d132 bne.n 801c9fe <tcp_input+0x356>
  70593. ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
  70594. 801c998: 69bb ldr r3, [r7, #24]
  70595. 801c99a: 685a ldr r2, [r3, #4]
  70596. 801c99c: 4b6b ldr r3, [pc, #428] @ (801cb4c <tcp_input+0x4a4>)
  70597. 801c99e: 691b ldr r3, [r3, #16]
  70598. pcb->local_port == tcphdr->dest &&
  70599. 801c9a0: 429a cmp r2, r3
  70600. 801c9a2: d12c bne.n 801c9fe <tcp_input+0x356>
  70601. ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
  70602. 801c9a4: 69bb ldr r3, [r7, #24]
  70603. 801c9a6: 681a ldr r2, [r3, #0]
  70604. 801c9a8: 4b68 ldr r3, [pc, #416] @ (801cb4c <tcp_input+0x4a4>)
  70605. 801c9aa: 695b ldr r3, [r3, #20]
  70606. ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
  70607. 801c9ac: 429a cmp r2, r3
  70608. 801c9ae: d126 bne.n 801c9fe <tcp_input+0x356>
  70609. /* Move this PCB to the front of the list so that subsequent
  70610. lookups will be faster (we exploit locality in TCP segment
  70611. arrivals). */
  70612. LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
  70613. 801c9b0: 69bb ldr r3, [r7, #24]
  70614. 801c9b2: 68db ldr r3, [r3, #12]
  70615. 801c9b4: 69ba ldr r2, [r7, #24]
  70616. 801c9b6: 429a cmp r2, r3
  70617. 801c9b8: d106 bne.n 801c9c8 <tcp_input+0x320>
  70618. 801c9ba: 4b65 ldr r3, [pc, #404] @ (801cb50 <tcp_input+0x4a8>)
  70619. 801c9bc: f240 120d movw r2, #269 @ 0x10d
  70620. 801c9c0: 4964 ldr r1, [pc, #400] @ (801cb54 <tcp_input+0x4ac>)
  70621. 801c9c2: 4865 ldr r0, [pc, #404] @ (801cb58 <tcp_input+0x4b0>)
  70622. 801c9c4: f00d f802 bl 80299cc <iprintf>
  70623. if (prev != NULL) {
  70624. 801c9c8: 69fb ldr r3, [r7, #28]
  70625. 801c9ca: 2b00 cmp r3, #0
  70626. 801c9cc: d00a beq.n 801c9e4 <tcp_input+0x33c>
  70627. prev->next = pcb->next;
  70628. 801c9ce: 69bb ldr r3, [r7, #24]
  70629. 801c9d0: 68da ldr r2, [r3, #12]
  70630. 801c9d2: 69fb ldr r3, [r7, #28]
  70631. 801c9d4: 60da str r2, [r3, #12]
  70632. pcb->next = tcp_active_pcbs;
  70633. 801c9d6: 4b61 ldr r3, [pc, #388] @ (801cb5c <tcp_input+0x4b4>)
  70634. 801c9d8: 681a ldr r2, [r3, #0]
  70635. 801c9da: 69bb ldr r3, [r7, #24]
  70636. 801c9dc: 60da str r2, [r3, #12]
  70637. tcp_active_pcbs = pcb;
  70638. 801c9de: 4a5f ldr r2, [pc, #380] @ (801cb5c <tcp_input+0x4b4>)
  70639. 801c9e0: 69bb ldr r3, [r7, #24]
  70640. 801c9e2: 6013 str r3, [r2, #0]
  70641. } else {
  70642. TCP_STATS_INC(tcp.cachehit);
  70643. }
  70644. LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb);
  70645. 801c9e4: 69bb ldr r3, [r7, #24]
  70646. 801c9e6: 68db ldr r3, [r3, #12]
  70647. 801c9e8: 69ba ldr r2, [r7, #24]
  70648. 801c9ea: 429a cmp r2, r3
  70649. 801c9ec: d111 bne.n 801ca12 <tcp_input+0x36a>
  70650. 801c9ee: 4b58 ldr r3, [pc, #352] @ (801cb50 <tcp_input+0x4a8>)
  70651. 801c9f0: f240 1215 movw r2, #277 @ 0x115
  70652. 801c9f4: 495a ldr r1, [pc, #360] @ (801cb60 <tcp_input+0x4b8>)
  70653. 801c9f6: 4858 ldr r0, [pc, #352] @ (801cb58 <tcp_input+0x4b0>)
  70654. 801c9f8: f00c ffe8 bl 80299cc <iprintf>
  70655. break;
  70656. 801c9fc: e009 b.n 801ca12 <tcp_input+0x36a>
  70657. }
  70658. prev = pcb;
  70659. 801c9fe: 69bb ldr r3, [r7, #24]
  70660. 801ca00: 61fb str r3, [r7, #28]
  70661. for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  70662. 801ca02: 69bb ldr r3, [r7, #24]
  70663. 801ca04: 68db ldr r3, [r3, #12]
  70664. 801ca06: 61bb str r3, [r7, #24]
  70665. 801ca08: 69bb ldr r3, [r7, #24]
  70666. 801ca0a: 2b00 cmp r3, #0
  70667. 801ca0c: f47f af5e bne.w 801c8cc <tcp_input+0x224>
  70668. 801ca10: e000 b.n 801ca14 <tcp_input+0x36c>
  70669. break;
  70670. 801ca12: bf00 nop
  70671. }
  70672. if (pcb == NULL) {
  70673. 801ca14: 69bb ldr r3, [r7, #24]
  70674. 801ca16: 2b00 cmp r3, #0
  70675. 801ca18: f040 80aa bne.w 801cb70 <tcp_input+0x4c8>
  70676. /* If it did not go to an active connection, we check the connections
  70677. in the TIME-WAIT state. */
  70678. for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  70679. 801ca1c: 4b51 ldr r3, [pc, #324] @ (801cb64 <tcp_input+0x4bc>)
  70680. 801ca1e: 681b ldr r3, [r3, #0]
  70681. 801ca20: 61bb str r3, [r7, #24]
  70682. 801ca22: e03f b.n 801caa4 <tcp_input+0x3fc>
  70683. LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  70684. 801ca24: 69bb ldr r3, [r7, #24]
  70685. 801ca26: 7d1b ldrb r3, [r3, #20]
  70686. 801ca28: 2b0a cmp r3, #10
  70687. 801ca2a: d006 beq.n 801ca3a <tcp_input+0x392>
  70688. 801ca2c: 4b48 ldr r3, [pc, #288] @ (801cb50 <tcp_input+0x4a8>)
  70689. 801ca2e: f240 121f movw r2, #287 @ 0x11f
  70690. 801ca32: 494d ldr r1, [pc, #308] @ (801cb68 <tcp_input+0x4c0>)
  70691. 801ca34: 4848 ldr r0, [pc, #288] @ (801cb58 <tcp_input+0x4b0>)
  70692. 801ca36: f00c ffc9 bl 80299cc <iprintf>
  70693. /* check if PCB is bound to specific netif */
  70694. if ((pcb->netif_idx != NETIF_NO_INDEX) &&
  70695. 801ca3a: 69bb ldr r3, [r7, #24]
  70696. 801ca3c: 7a1b ldrb r3, [r3, #8]
  70697. 801ca3e: 2b00 cmp r3, #0
  70698. 801ca40: d009 beq.n 801ca56 <tcp_input+0x3ae>
  70699. (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
  70700. 801ca42: 69bb ldr r3, [r7, #24]
  70701. 801ca44: 7a1a ldrb r2, [r3, #8]
  70702. 801ca46: 4b41 ldr r3, [pc, #260] @ (801cb4c <tcp_input+0x4a4>)
  70703. 801ca48: 685b ldr r3, [r3, #4]
  70704. 801ca4a: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  70705. 801ca4e: 3301 adds r3, #1
  70706. 801ca50: b2db uxtb r3, r3
  70707. if ((pcb->netif_idx != NETIF_NO_INDEX) &&
  70708. 801ca52: 429a cmp r2, r3
  70709. 801ca54: d122 bne.n 801ca9c <tcp_input+0x3f4>
  70710. continue;
  70711. }
  70712. if (pcb->remote_port == tcphdr->src &&
  70713. 801ca56: 69bb ldr r3, [r7, #24]
  70714. 801ca58: 8b1a ldrh r2, [r3, #24]
  70715. 801ca5a: 4b3b ldr r3, [pc, #236] @ (801cb48 <tcp_input+0x4a0>)
  70716. 801ca5c: 681b ldr r3, [r3, #0]
  70717. 801ca5e: 881b ldrh r3, [r3, #0]
  70718. 801ca60: b29b uxth r3, r3
  70719. 801ca62: 429a cmp r2, r3
  70720. 801ca64: d11b bne.n 801ca9e <tcp_input+0x3f6>
  70721. pcb->local_port == tcphdr->dest &&
  70722. 801ca66: 69bb ldr r3, [r7, #24]
  70723. 801ca68: 8ada ldrh r2, [r3, #22]
  70724. 801ca6a: 4b37 ldr r3, [pc, #220] @ (801cb48 <tcp_input+0x4a0>)
  70725. 801ca6c: 681b ldr r3, [r3, #0]
  70726. 801ca6e: 885b ldrh r3, [r3, #2]
  70727. 801ca70: b29b uxth r3, r3
  70728. if (pcb->remote_port == tcphdr->src &&
  70729. 801ca72: 429a cmp r2, r3
  70730. 801ca74: d113 bne.n 801ca9e <tcp_input+0x3f6>
  70731. ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
  70732. 801ca76: 69bb ldr r3, [r7, #24]
  70733. 801ca78: 685a ldr r2, [r3, #4]
  70734. 801ca7a: 4b34 ldr r3, [pc, #208] @ (801cb4c <tcp_input+0x4a4>)
  70735. 801ca7c: 691b ldr r3, [r3, #16]
  70736. pcb->local_port == tcphdr->dest &&
  70737. 801ca7e: 429a cmp r2, r3
  70738. 801ca80: d10d bne.n 801ca9e <tcp_input+0x3f6>
  70739. ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
  70740. 801ca82: 69bb ldr r3, [r7, #24]
  70741. 801ca84: 681a ldr r2, [r3, #0]
  70742. 801ca86: 4b31 ldr r3, [pc, #196] @ (801cb4c <tcp_input+0x4a4>)
  70743. 801ca88: 695b ldr r3, [r3, #20]
  70744. ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
  70745. 801ca8a: 429a cmp r2, r3
  70746. 801ca8c: d107 bne.n 801ca9e <tcp_input+0x3f6>
  70747. #ifdef LWIP_HOOK_TCP_INPACKET_PCB
  70748. if (LWIP_HOOK_TCP_INPACKET_PCB(pcb, tcphdr, tcphdr_optlen, tcphdr_opt1len,
  70749. tcphdr_opt2, p) == ERR_OK)
  70750. #endif
  70751. {
  70752. tcp_timewait_input(pcb);
  70753. 801ca8e: 69b8 ldr r0, [r7, #24]
  70754. 801ca90: f000 fb56 bl 801d140 <tcp_timewait_input>
  70755. }
  70756. pbuf_free(p);
  70757. 801ca94: 6878 ldr r0, [r7, #4]
  70758. 801ca96: f7fd fd21 bl 801a4dc <pbuf_free>
  70759. return;
  70760. 801ca9a: e1fd b.n 801ce98 <tcp_input+0x7f0>
  70761. continue;
  70762. 801ca9c: bf00 nop
  70763. for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  70764. 801ca9e: 69bb ldr r3, [r7, #24]
  70765. 801caa0: 68db ldr r3, [r3, #12]
  70766. 801caa2: 61bb str r3, [r7, #24]
  70767. 801caa4: 69bb ldr r3, [r7, #24]
  70768. 801caa6: 2b00 cmp r3, #0
  70769. 801caa8: d1bc bne.n 801ca24 <tcp_input+0x37c>
  70770. }
  70771. }
  70772. /* Finally, if we still did not get a match, we check all PCBs that
  70773. are LISTENing for incoming connections. */
  70774. prev = NULL;
  70775. 801caaa: 2300 movs r3, #0
  70776. 801caac: 61fb str r3, [r7, #28]
  70777. for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  70778. 801caae: 4b2f ldr r3, [pc, #188] @ (801cb6c <tcp_input+0x4c4>)
  70779. 801cab0: 681b ldr r3, [r3, #0]
  70780. 801cab2: 617b str r3, [r7, #20]
  70781. 801cab4: e02a b.n 801cb0c <tcp_input+0x464>
  70782. /* check if PCB is bound to specific netif */
  70783. if ((lpcb->netif_idx != NETIF_NO_INDEX) &&
  70784. 801cab6: 697b ldr r3, [r7, #20]
  70785. 801cab8: 7a1b ldrb r3, [r3, #8]
  70786. 801caba: 2b00 cmp r3, #0
  70787. 801cabc: d00c beq.n 801cad8 <tcp_input+0x430>
  70788. (lpcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
  70789. 801cabe: 697b ldr r3, [r7, #20]
  70790. 801cac0: 7a1a ldrb r2, [r3, #8]
  70791. 801cac2: 4b22 ldr r3, [pc, #136] @ (801cb4c <tcp_input+0x4a4>)
  70792. 801cac4: 685b ldr r3, [r3, #4]
  70793. 801cac6: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  70794. 801caca: 3301 adds r3, #1
  70795. 801cacc: b2db uxtb r3, r3
  70796. if ((lpcb->netif_idx != NETIF_NO_INDEX) &&
  70797. 801cace: 429a cmp r2, r3
  70798. 801cad0: d002 beq.n 801cad8 <tcp_input+0x430>
  70799. prev = (struct tcp_pcb *)lpcb;
  70800. 801cad2: 697b ldr r3, [r7, #20]
  70801. 801cad4: 61fb str r3, [r7, #28]
  70802. continue;
  70803. 801cad6: e016 b.n 801cb06 <tcp_input+0x45e>
  70804. }
  70805. if (lpcb->local_port == tcphdr->dest) {
  70806. 801cad8: 697b ldr r3, [r7, #20]
  70807. 801cada: 8ada ldrh r2, [r3, #22]
  70808. 801cadc: 4b1a ldr r3, [pc, #104] @ (801cb48 <tcp_input+0x4a0>)
  70809. 801cade: 681b ldr r3, [r3, #0]
  70810. 801cae0: 885b ldrh r3, [r3, #2]
  70811. 801cae2: b29b uxth r3, r3
  70812. 801cae4: 429a cmp r2, r3
  70813. 801cae6: d10c bne.n 801cb02 <tcp_input+0x45a>
  70814. lpcb_prev = prev;
  70815. #else /* SO_REUSE */
  70816. break;
  70817. #endif /* SO_REUSE */
  70818. } else if (IP_ADDR_PCB_VERSION_MATCH_EXACT(lpcb, ip_current_dest_addr())) {
  70819. if (ip_addr_cmp(&lpcb->local_ip, ip_current_dest_addr())) {
  70820. 801cae8: 697b ldr r3, [r7, #20]
  70821. 801caea: 681a ldr r2, [r3, #0]
  70822. 801caec: 4b17 ldr r3, [pc, #92] @ (801cb4c <tcp_input+0x4a4>)
  70823. 801caee: 695b ldr r3, [r3, #20]
  70824. 801caf0: 429a cmp r2, r3
  70825. 801caf2: d00f beq.n 801cb14 <tcp_input+0x46c>
  70826. /* found an exact match */
  70827. break;
  70828. } else if (ip_addr_isany(&lpcb->local_ip)) {
  70829. 801caf4: 697b ldr r3, [r7, #20]
  70830. 801caf6: 2b00 cmp r3, #0
  70831. 801caf8: d00d beq.n 801cb16 <tcp_input+0x46e>
  70832. 801cafa: 697b ldr r3, [r7, #20]
  70833. 801cafc: 681b ldr r3, [r3, #0]
  70834. 801cafe: 2b00 cmp r3, #0
  70835. 801cb00: d009 beq.n 801cb16 <tcp_input+0x46e>
  70836. break;
  70837. #endif /* SO_REUSE */
  70838. }
  70839. }
  70840. }
  70841. prev = (struct tcp_pcb *)lpcb;
  70842. 801cb02: 697b ldr r3, [r7, #20]
  70843. 801cb04: 61fb str r3, [r7, #28]
  70844. for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  70845. 801cb06: 697b ldr r3, [r7, #20]
  70846. 801cb08: 68db ldr r3, [r3, #12]
  70847. 801cb0a: 617b str r3, [r7, #20]
  70848. 801cb0c: 697b ldr r3, [r7, #20]
  70849. 801cb0e: 2b00 cmp r3, #0
  70850. 801cb10: d1d1 bne.n 801cab6 <tcp_input+0x40e>
  70851. 801cb12: e000 b.n 801cb16 <tcp_input+0x46e>
  70852. break;
  70853. 801cb14: bf00 nop
  70854. /* only pass to ANY if no specific local IP has been found */
  70855. lpcb = lpcb_any;
  70856. prev = lpcb_prev;
  70857. }
  70858. #endif /* SO_REUSE */
  70859. if (lpcb != NULL) {
  70860. 801cb16: 697b ldr r3, [r7, #20]
  70861. 801cb18: 2b00 cmp r3, #0
  70862. 801cb1a: d029 beq.n 801cb70 <tcp_input+0x4c8>
  70863. /* Move this PCB to the front of the list so that subsequent
  70864. lookups will be faster (we exploit locality in TCP segment
  70865. arrivals). */
  70866. if (prev != NULL) {
  70867. 801cb1c: 69fb ldr r3, [r7, #28]
  70868. 801cb1e: 2b00 cmp r3, #0
  70869. 801cb20: d00a beq.n 801cb38 <tcp_input+0x490>
  70870. ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
  70871. 801cb22: 697b ldr r3, [r7, #20]
  70872. 801cb24: 68da ldr r2, [r3, #12]
  70873. 801cb26: 69fb ldr r3, [r7, #28]
  70874. 801cb28: 60da str r2, [r3, #12]
  70875. /* our successor is the remainder of the listening list */
  70876. lpcb->next = tcp_listen_pcbs.listen_pcbs;
  70877. 801cb2a: 4b10 ldr r3, [pc, #64] @ (801cb6c <tcp_input+0x4c4>)
  70878. 801cb2c: 681a ldr r2, [r3, #0]
  70879. 801cb2e: 697b ldr r3, [r7, #20]
  70880. 801cb30: 60da str r2, [r3, #12]
  70881. /* put this listening pcb at the head of the listening list */
  70882. tcp_listen_pcbs.listen_pcbs = lpcb;
  70883. 801cb32: 4a0e ldr r2, [pc, #56] @ (801cb6c <tcp_input+0x4c4>)
  70884. 801cb34: 697b ldr r3, [r7, #20]
  70885. 801cb36: 6013 str r3, [r2, #0]
  70886. #ifdef LWIP_HOOK_TCP_INPACKET_PCB
  70887. if (LWIP_HOOK_TCP_INPACKET_PCB((struct tcp_pcb *)lpcb, tcphdr, tcphdr_optlen,
  70888. tcphdr_opt1len, tcphdr_opt2, p) == ERR_OK)
  70889. #endif
  70890. {
  70891. tcp_listen_input(lpcb);
  70892. 801cb38: 6978 ldr r0, [r7, #20]
  70893. 801cb3a: f000 fa03 bl 801cf44 <tcp_listen_input>
  70894. }
  70895. pbuf_free(p);
  70896. 801cb3e: 6878 ldr r0, [r7, #4]
  70897. 801cb40: f7fd fccc bl 801a4dc <pbuf_free>
  70898. return;
  70899. 801cb44: e1a8 b.n 801ce98 <tcp_input+0x7f0>
  70900. 801cb46: bf00 nop
  70901. 801cb48: 2402aeb4 .word 0x2402aeb4
  70902. 801cb4c: 24024338 .word 0x24024338
  70903. 801cb50: 0802ed10 .word 0x0802ed10
  70904. 801cb54: 0802ee3c .word 0x0802ee3c
  70905. 801cb58: 0802ed5c .word 0x0802ed5c
  70906. 801cb5c: 2402ae94 .word 0x2402ae94
  70907. 801cb60: 0802ee68 .word 0x0802ee68
  70908. 801cb64: 2402ae98 .word 0x2402ae98
  70909. 801cb68: 0802ee94 .word 0x0802ee94
  70910. 801cb6c: 2402ae90 .word 0x2402ae90
  70911. tcphdr_opt1len, tcphdr_opt2, p) != ERR_OK) {
  70912. pbuf_free(p);
  70913. return;
  70914. }
  70915. #endif
  70916. if (pcb != NULL) {
  70917. 801cb70: 69bb ldr r3, [r7, #24]
  70918. 801cb72: 2b00 cmp r3, #0
  70919. 801cb74: f000 8158 beq.w 801ce28 <tcp_input+0x780>
  70920. #if TCP_INPUT_DEBUG
  70921. tcp_debug_print_state(pcb->state);
  70922. #endif /* TCP_INPUT_DEBUG */
  70923. /* Set up a tcp_seg structure. */
  70924. inseg.next = NULL;
  70925. 801cb78: 4b95 ldr r3, [pc, #596] @ (801cdd0 <tcp_input+0x728>)
  70926. 801cb7a: 2200 movs r2, #0
  70927. 801cb7c: 601a str r2, [r3, #0]
  70928. inseg.len = p->tot_len;
  70929. 801cb7e: 687b ldr r3, [r7, #4]
  70930. 801cb80: 891a ldrh r2, [r3, #8]
  70931. 801cb82: 4b93 ldr r3, [pc, #588] @ (801cdd0 <tcp_input+0x728>)
  70932. 801cb84: 811a strh r2, [r3, #8]
  70933. inseg.p = p;
  70934. 801cb86: 4a92 ldr r2, [pc, #584] @ (801cdd0 <tcp_input+0x728>)
  70935. 801cb88: 687b ldr r3, [r7, #4]
  70936. 801cb8a: 6053 str r3, [r2, #4]
  70937. inseg.tcphdr = tcphdr;
  70938. 801cb8c: 4b91 ldr r3, [pc, #580] @ (801cdd4 <tcp_input+0x72c>)
  70939. 801cb8e: 681b ldr r3, [r3, #0]
  70940. 801cb90: 4a8f ldr r2, [pc, #572] @ (801cdd0 <tcp_input+0x728>)
  70941. 801cb92: 6113 str r3, [r2, #16]
  70942. recv_data = NULL;
  70943. 801cb94: 4b90 ldr r3, [pc, #576] @ (801cdd8 <tcp_input+0x730>)
  70944. 801cb96: 2200 movs r2, #0
  70945. 801cb98: 601a str r2, [r3, #0]
  70946. recv_flags = 0;
  70947. 801cb9a: 4b90 ldr r3, [pc, #576] @ (801cddc <tcp_input+0x734>)
  70948. 801cb9c: 2200 movs r2, #0
  70949. 801cb9e: 701a strb r2, [r3, #0]
  70950. recv_acked = 0;
  70951. 801cba0: 4b8f ldr r3, [pc, #572] @ (801cde0 <tcp_input+0x738>)
  70952. 801cba2: 2200 movs r2, #0
  70953. 801cba4: 801a strh r2, [r3, #0]
  70954. if (flags & TCP_PSH) {
  70955. 801cba6: 4b8f ldr r3, [pc, #572] @ (801cde4 <tcp_input+0x73c>)
  70956. 801cba8: 781b ldrb r3, [r3, #0]
  70957. 801cbaa: f003 0308 and.w r3, r3, #8
  70958. 801cbae: 2b00 cmp r3, #0
  70959. 801cbb0: d006 beq.n 801cbc0 <tcp_input+0x518>
  70960. p->flags |= PBUF_FLAG_PUSH;
  70961. 801cbb2: 687b ldr r3, [r7, #4]
  70962. 801cbb4: 7b5b ldrb r3, [r3, #13]
  70963. 801cbb6: f043 0301 orr.w r3, r3, #1
  70964. 801cbba: b2da uxtb r2, r3
  70965. 801cbbc: 687b ldr r3, [r7, #4]
  70966. 801cbbe: 735a strb r2, [r3, #13]
  70967. }
  70968. /* If there is data which was previously "refused" by upper layer */
  70969. if (pcb->refused_data != NULL) {
  70970. 801cbc0: 69bb ldr r3, [r7, #24]
  70971. 801cbc2: 6f9b ldr r3, [r3, #120] @ 0x78
  70972. 801cbc4: 2b00 cmp r3, #0
  70973. 801cbc6: d017 beq.n 801cbf8 <tcp_input+0x550>
  70974. if ((tcp_process_refused_data(pcb) == ERR_ABRT) ||
  70975. 801cbc8: 69b8 ldr r0, [r7, #24]
  70976. 801cbca: f7ff f84d bl 801bc68 <tcp_process_refused_data>
  70977. 801cbce: 4603 mov r3, r0
  70978. 801cbd0: f113 0f0d cmn.w r3, #13
  70979. 801cbd4: d007 beq.n 801cbe6 <tcp_input+0x53e>
  70980. ((pcb->refused_data != NULL) && (tcplen > 0))) {
  70981. 801cbd6: 69bb ldr r3, [r7, #24]
  70982. 801cbd8: 6f9b ldr r3, [r3, #120] @ 0x78
  70983. if ((tcp_process_refused_data(pcb) == ERR_ABRT) ||
  70984. 801cbda: 2b00 cmp r3, #0
  70985. 801cbdc: d00c beq.n 801cbf8 <tcp_input+0x550>
  70986. ((pcb->refused_data != NULL) && (tcplen > 0))) {
  70987. 801cbde: 4b82 ldr r3, [pc, #520] @ (801cde8 <tcp_input+0x740>)
  70988. 801cbe0: 881b ldrh r3, [r3, #0]
  70989. 801cbe2: 2b00 cmp r3, #0
  70990. 801cbe4: d008 beq.n 801cbf8 <tcp_input+0x550>
  70991. /* pcb has been aborted or refused data is still refused and the new
  70992. segment contains data */
  70993. if (pcb->rcv_ann_wnd == 0) {
  70994. 801cbe6: 69bb ldr r3, [r7, #24]
  70995. 801cbe8: 8d5b ldrh r3, [r3, #42] @ 0x2a
  70996. 801cbea: 2b00 cmp r3, #0
  70997. 801cbec: f040 80e4 bne.w 801cdb8 <tcp_input+0x710>
  70998. /* this is a zero-window probe, we respond to it with current RCV.NXT
  70999. and drop the data segment */
  71000. tcp_send_empty_ack(pcb);
  71001. 801cbf0: 69b8 ldr r0, [r7, #24]
  71002. 801cbf2: f003 fe73 bl 80208dc <tcp_send_empty_ack>
  71003. }
  71004. TCP_STATS_INC(tcp.drop);
  71005. MIB2_STATS_INC(mib2.tcpinerrs);
  71006. goto aborted;
  71007. 801cbf6: e0df b.n 801cdb8 <tcp_input+0x710>
  71008. }
  71009. }
  71010. tcp_input_pcb = pcb;
  71011. 801cbf8: 4a7c ldr r2, [pc, #496] @ (801cdec <tcp_input+0x744>)
  71012. 801cbfa: 69bb ldr r3, [r7, #24]
  71013. 801cbfc: 6013 str r3, [r2, #0]
  71014. err = tcp_process(pcb);
  71015. 801cbfe: 69b8 ldr r0, [r7, #24]
  71016. 801cc00: f000 fb18 bl 801d234 <tcp_process>
  71017. 801cc04: 4603 mov r3, r0
  71018. 801cc06: 74fb strb r3, [r7, #19]
  71019. /* A return value of ERR_ABRT means that tcp_abort() was called
  71020. and that the pcb has been freed. If so, we don't do anything. */
  71021. if (err != ERR_ABRT) {
  71022. 801cc08: f997 3013 ldrsb.w r3, [r7, #19]
  71023. 801cc0c: f113 0f0d cmn.w r3, #13
  71024. 801cc10: f000 80d4 beq.w 801cdbc <tcp_input+0x714>
  71025. if (recv_flags & TF_RESET) {
  71026. 801cc14: 4b71 ldr r3, [pc, #452] @ (801cddc <tcp_input+0x734>)
  71027. 801cc16: 781b ldrb r3, [r3, #0]
  71028. 801cc18: f003 0308 and.w r3, r3, #8
  71029. 801cc1c: 2b00 cmp r3, #0
  71030. 801cc1e: d015 beq.n 801cc4c <tcp_input+0x5a4>
  71031. /* TF_RESET means that the connection was reset by the other
  71032. end. We then call the error callback to inform the
  71033. application that the connection is dead before we
  71034. deallocate the PCB. */
  71035. TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_RST);
  71036. 801cc20: 69bb ldr r3, [r7, #24]
  71037. 801cc22: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  71038. 801cc26: 2b00 cmp r3, #0
  71039. 801cc28: d008 beq.n 801cc3c <tcp_input+0x594>
  71040. 801cc2a: 69bb ldr r3, [r7, #24]
  71041. 801cc2c: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  71042. 801cc30: 69ba ldr r2, [r7, #24]
  71043. 801cc32: 6912 ldr r2, [r2, #16]
  71044. 801cc34: f06f 010d mvn.w r1, #13
  71045. 801cc38: 4610 mov r0, r2
  71046. 801cc3a: 4798 blx r3
  71047. tcp_pcb_remove(&tcp_active_pcbs, pcb);
  71048. 801cc3c: 69b9 ldr r1, [r7, #24]
  71049. 801cc3e: 486c ldr r0, [pc, #432] @ (801cdf0 <tcp_input+0x748>)
  71050. 801cc40: f7ff fbba bl 801c3b8 <tcp_pcb_remove>
  71051. tcp_free(pcb);
  71052. 801cc44: 69b8 ldr r0, [r7, #24]
  71053. 801cc46: f7fd ff05 bl 801aa54 <tcp_free>
  71054. 801cc4a: e0da b.n 801ce02 <tcp_input+0x75a>
  71055. } else {
  71056. err = ERR_OK;
  71057. 801cc4c: 2300 movs r3, #0
  71058. 801cc4e: 74fb strb r3, [r7, #19]
  71059. /* If the application has registered a "sent" function to be
  71060. called when new send buffer space is available, we call it
  71061. now. */
  71062. if (recv_acked > 0) {
  71063. 801cc50: 4b63 ldr r3, [pc, #396] @ (801cde0 <tcp_input+0x738>)
  71064. 801cc52: 881b ldrh r3, [r3, #0]
  71065. 801cc54: 2b00 cmp r3, #0
  71066. 801cc56: d01d beq.n 801cc94 <tcp_input+0x5ec>
  71067. while (acked > 0) {
  71068. acked16 = (u16_t)LWIP_MIN(acked, 0xffffu);
  71069. acked -= acked16;
  71070. #else
  71071. {
  71072. acked16 = recv_acked;
  71073. 801cc58: 4b61 ldr r3, [pc, #388] @ (801cde0 <tcp_input+0x738>)
  71074. 801cc5a: 881b ldrh r3, [r3, #0]
  71075. 801cc5c: 81fb strh r3, [r7, #14]
  71076. #endif
  71077. TCP_EVENT_SENT(pcb, (u16_t)acked16, err);
  71078. 801cc5e: 69bb ldr r3, [r7, #24]
  71079. 801cc60: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  71080. 801cc64: 2b00 cmp r3, #0
  71081. 801cc66: d00a beq.n 801cc7e <tcp_input+0x5d6>
  71082. 801cc68: 69bb ldr r3, [r7, #24]
  71083. 801cc6a: f8d3 3080 ldr.w r3, [r3, #128] @ 0x80
  71084. 801cc6e: 69ba ldr r2, [r7, #24]
  71085. 801cc70: 6910 ldr r0, [r2, #16]
  71086. 801cc72: 89fa ldrh r2, [r7, #14]
  71087. 801cc74: 69b9 ldr r1, [r7, #24]
  71088. 801cc76: 4798 blx r3
  71089. 801cc78: 4603 mov r3, r0
  71090. 801cc7a: 74fb strb r3, [r7, #19]
  71091. 801cc7c: e001 b.n 801cc82 <tcp_input+0x5da>
  71092. 801cc7e: 2300 movs r3, #0
  71093. 801cc80: 74fb strb r3, [r7, #19]
  71094. if (err == ERR_ABRT) {
  71095. 801cc82: f997 3013 ldrsb.w r3, [r7, #19]
  71096. 801cc86: f113 0f0d cmn.w r3, #13
  71097. 801cc8a: f000 8099 beq.w 801cdc0 <tcp_input+0x718>
  71098. goto aborted;
  71099. }
  71100. }
  71101. recv_acked = 0;
  71102. 801cc8e: 4b54 ldr r3, [pc, #336] @ (801cde0 <tcp_input+0x738>)
  71103. 801cc90: 2200 movs r2, #0
  71104. 801cc92: 801a strh r2, [r3, #0]
  71105. }
  71106. if (tcp_input_delayed_close(pcb)) {
  71107. 801cc94: 69b8 ldr r0, [r7, #24]
  71108. 801cc96: f000 f915 bl 801cec4 <tcp_input_delayed_close>
  71109. 801cc9a: 4603 mov r3, r0
  71110. 801cc9c: 2b00 cmp r3, #0
  71111. 801cc9e: f040 8091 bne.w 801cdc4 <tcp_input+0x71c>
  71112. #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
  71113. while (recv_data != NULL) {
  71114. struct pbuf *rest = NULL;
  71115. pbuf_split_64k(recv_data, &rest);
  71116. #else /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  71117. if (recv_data != NULL) {
  71118. 801cca2: 4b4d ldr r3, [pc, #308] @ (801cdd8 <tcp_input+0x730>)
  71119. 801cca4: 681b ldr r3, [r3, #0]
  71120. 801cca6: 2b00 cmp r3, #0
  71121. 801cca8: d041 beq.n 801cd2e <tcp_input+0x686>
  71122. #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  71123. LWIP_ASSERT("pcb->refused_data == NULL", pcb->refused_data == NULL);
  71124. 801ccaa: 69bb ldr r3, [r7, #24]
  71125. 801ccac: 6f9b ldr r3, [r3, #120] @ 0x78
  71126. 801ccae: 2b00 cmp r3, #0
  71127. 801ccb0: d006 beq.n 801ccc0 <tcp_input+0x618>
  71128. 801ccb2: 4b50 ldr r3, [pc, #320] @ (801cdf4 <tcp_input+0x74c>)
  71129. 801ccb4: f44f 72f3 mov.w r2, #486 @ 0x1e6
  71130. 801ccb8: 494f ldr r1, [pc, #316] @ (801cdf8 <tcp_input+0x750>)
  71131. 801ccba: 4850 ldr r0, [pc, #320] @ (801cdfc <tcp_input+0x754>)
  71132. 801ccbc: f00c fe86 bl 80299cc <iprintf>
  71133. if (pcb->flags & TF_RXCLOSED) {
  71134. 801ccc0: 69bb ldr r3, [r7, #24]
  71135. 801ccc2: 8b5b ldrh r3, [r3, #26]
  71136. 801ccc4: f003 0310 and.w r3, r3, #16
  71137. 801ccc8: 2b00 cmp r3, #0
  71138. 801ccca: d008 beq.n 801ccde <tcp_input+0x636>
  71139. /* received data although already closed -> abort (send RST) to
  71140. notify the remote host that not all data has been processed */
  71141. pbuf_free(recv_data);
  71142. 801cccc: 4b42 ldr r3, [pc, #264] @ (801cdd8 <tcp_input+0x730>)
  71143. 801ccce: 681b ldr r3, [r3, #0]
  71144. 801ccd0: 4618 mov r0, r3
  71145. 801ccd2: f7fd fc03 bl 801a4dc <pbuf_free>
  71146. #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
  71147. if (rest != NULL) {
  71148. pbuf_free(rest);
  71149. }
  71150. #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  71151. tcp_abort(pcb);
  71152. 801ccd6: 69b8 ldr r0, [r7, #24]
  71153. 801ccd8: f7fe fa06 bl 801b0e8 <tcp_abort>
  71154. goto aborted;
  71155. 801ccdc: e091 b.n 801ce02 <tcp_input+0x75a>
  71156. }
  71157. /* Notify application that data has been received. */
  71158. TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);
  71159. 801ccde: 69bb ldr r3, [r7, #24]
  71160. 801cce0: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  71161. 801cce4: 2b00 cmp r3, #0
  71162. 801cce6: d00c beq.n 801cd02 <tcp_input+0x65a>
  71163. 801cce8: 69bb ldr r3, [r7, #24]
  71164. 801ccea: f8d3 4084 ldr.w r4, [r3, #132] @ 0x84
  71165. 801ccee: 69bb ldr r3, [r7, #24]
  71166. 801ccf0: 6918 ldr r0, [r3, #16]
  71167. 801ccf2: 4b39 ldr r3, [pc, #228] @ (801cdd8 <tcp_input+0x730>)
  71168. 801ccf4: 681a ldr r2, [r3, #0]
  71169. 801ccf6: 2300 movs r3, #0
  71170. 801ccf8: 69b9 ldr r1, [r7, #24]
  71171. 801ccfa: 47a0 blx r4
  71172. 801ccfc: 4603 mov r3, r0
  71173. 801ccfe: 74fb strb r3, [r7, #19]
  71174. 801cd00: e008 b.n 801cd14 <tcp_input+0x66c>
  71175. 801cd02: 4b35 ldr r3, [pc, #212] @ (801cdd8 <tcp_input+0x730>)
  71176. 801cd04: 681a ldr r2, [r3, #0]
  71177. 801cd06: 2300 movs r3, #0
  71178. 801cd08: 69b9 ldr r1, [r7, #24]
  71179. 801cd0a: 2000 movs r0, #0
  71180. 801cd0c: f7ff f884 bl 801be18 <tcp_recv_null>
  71181. 801cd10: 4603 mov r3, r0
  71182. 801cd12: 74fb strb r3, [r7, #19]
  71183. if (err == ERR_ABRT) {
  71184. 801cd14: f997 3013 ldrsb.w r3, [r7, #19]
  71185. 801cd18: f113 0f0d cmn.w r3, #13
  71186. 801cd1c: d054 beq.n 801cdc8 <tcp_input+0x720>
  71187. #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  71188. goto aborted;
  71189. }
  71190. /* If the upper layer can't receive this data, store it */
  71191. if (err != ERR_OK) {
  71192. 801cd1e: f997 3013 ldrsb.w r3, [r7, #19]
  71193. 801cd22: 2b00 cmp r3, #0
  71194. 801cd24: d003 beq.n 801cd2e <tcp_input+0x686>
  71195. #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
  71196. if (rest != NULL) {
  71197. pbuf_cat(recv_data, rest);
  71198. }
  71199. #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
  71200. pcb->refused_data = recv_data;
  71201. 801cd26: 4b2c ldr r3, [pc, #176] @ (801cdd8 <tcp_input+0x730>)
  71202. 801cd28: 681a ldr r2, [r3, #0]
  71203. 801cd2a: 69bb ldr r3, [r7, #24]
  71204. 801cd2c: 679a str r2, [r3, #120] @ 0x78
  71205. }
  71206. }
  71207. /* If a FIN segment was received, we call the callback
  71208. function with a NULL buffer to indicate EOF. */
  71209. if (recv_flags & TF_GOT_FIN) {
  71210. 801cd2e: 4b2b ldr r3, [pc, #172] @ (801cddc <tcp_input+0x734>)
  71211. 801cd30: 781b ldrb r3, [r3, #0]
  71212. 801cd32: f003 0320 and.w r3, r3, #32
  71213. 801cd36: 2b00 cmp r3, #0
  71214. 801cd38: d031 beq.n 801cd9e <tcp_input+0x6f6>
  71215. if (pcb->refused_data != NULL) {
  71216. 801cd3a: 69bb ldr r3, [r7, #24]
  71217. 801cd3c: 6f9b ldr r3, [r3, #120] @ 0x78
  71218. 801cd3e: 2b00 cmp r3, #0
  71219. 801cd40: d009 beq.n 801cd56 <tcp_input+0x6ae>
  71220. /* Delay this if we have refused data. */
  71221. pcb->refused_data->flags |= PBUF_FLAG_TCP_FIN;
  71222. 801cd42: 69bb ldr r3, [r7, #24]
  71223. 801cd44: 6f9b ldr r3, [r3, #120] @ 0x78
  71224. 801cd46: 7b5a ldrb r2, [r3, #13]
  71225. 801cd48: 69bb ldr r3, [r7, #24]
  71226. 801cd4a: 6f9b ldr r3, [r3, #120] @ 0x78
  71227. 801cd4c: f042 0220 orr.w r2, r2, #32
  71228. 801cd50: b2d2 uxtb r2, r2
  71229. 801cd52: 735a strb r2, [r3, #13]
  71230. 801cd54: e023 b.n 801cd9e <tcp_input+0x6f6>
  71231. } else {
  71232. /* correct rcv_wnd as the application won't call tcp_recved()
  71233. for the FIN's seqno */
  71234. if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {
  71235. 801cd56: 69bb ldr r3, [r7, #24]
  71236. 801cd58: 8d1b ldrh r3, [r3, #40] @ 0x28
  71237. 801cd5a: f241 62d0 movw r2, #5840 @ 0x16d0
  71238. 801cd5e: 4293 cmp r3, r2
  71239. 801cd60: d005 beq.n 801cd6e <tcp_input+0x6c6>
  71240. pcb->rcv_wnd++;
  71241. 801cd62: 69bb ldr r3, [r7, #24]
  71242. 801cd64: 8d1b ldrh r3, [r3, #40] @ 0x28
  71243. 801cd66: 3301 adds r3, #1
  71244. 801cd68: b29a uxth r2, r3
  71245. 801cd6a: 69bb ldr r3, [r7, #24]
  71246. 801cd6c: 851a strh r2, [r3, #40] @ 0x28
  71247. }
  71248. TCP_EVENT_CLOSED(pcb, err);
  71249. 801cd6e: 69bb ldr r3, [r7, #24]
  71250. 801cd70: f8d3 3084 ldr.w r3, [r3, #132] @ 0x84
  71251. 801cd74: 2b00 cmp r3, #0
  71252. 801cd76: d00b beq.n 801cd90 <tcp_input+0x6e8>
  71253. 801cd78: 69bb ldr r3, [r7, #24]
  71254. 801cd7a: f8d3 4084 ldr.w r4, [r3, #132] @ 0x84
  71255. 801cd7e: 69bb ldr r3, [r7, #24]
  71256. 801cd80: 6918 ldr r0, [r3, #16]
  71257. 801cd82: 2300 movs r3, #0
  71258. 801cd84: 2200 movs r2, #0
  71259. 801cd86: 69b9 ldr r1, [r7, #24]
  71260. 801cd88: 47a0 blx r4
  71261. 801cd8a: 4603 mov r3, r0
  71262. 801cd8c: 74fb strb r3, [r7, #19]
  71263. 801cd8e: e001 b.n 801cd94 <tcp_input+0x6ec>
  71264. 801cd90: 2300 movs r3, #0
  71265. 801cd92: 74fb strb r3, [r7, #19]
  71266. if (err == ERR_ABRT) {
  71267. 801cd94: f997 3013 ldrsb.w r3, [r7, #19]
  71268. 801cd98: f113 0f0d cmn.w r3, #13
  71269. 801cd9c: d016 beq.n 801cdcc <tcp_input+0x724>
  71270. goto aborted;
  71271. }
  71272. }
  71273. }
  71274. tcp_input_pcb = NULL;
  71275. 801cd9e: 4b13 ldr r3, [pc, #76] @ (801cdec <tcp_input+0x744>)
  71276. 801cda0: 2200 movs r2, #0
  71277. 801cda2: 601a str r2, [r3, #0]
  71278. if (tcp_input_delayed_close(pcb)) {
  71279. 801cda4: 69b8 ldr r0, [r7, #24]
  71280. 801cda6: f000 f88d bl 801cec4 <tcp_input_delayed_close>
  71281. 801cdaa: 4603 mov r3, r0
  71282. 801cdac: 2b00 cmp r3, #0
  71283. 801cdae: d127 bne.n 801ce00 <tcp_input+0x758>
  71284. goto aborted;
  71285. }
  71286. /* Try to send something out. */
  71287. tcp_output(pcb);
  71288. 801cdb0: 69b8 ldr r0, [r7, #24]
  71289. 801cdb2: f002 ff7f bl 801fcb4 <tcp_output>
  71290. 801cdb6: e024 b.n 801ce02 <tcp_input+0x75a>
  71291. goto aborted;
  71292. 801cdb8: bf00 nop
  71293. 801cdba: e022 b.n 801ce02 <tcp_input+0x75a>
  71294. #endif /* TCP_INPUT_DEBUG */
  71295. }
  71296. }
  71297. /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
  71298. Below this line, 'pcb' may not be dereferenced! */
  71299. aborted:
  71300. 801cdbc: bf00 nop
  71301. 801cdbe: e020 b.n 801ce02 <tcp_input+0x75a>
  71302. goto aborted;
  71303. 801cdc0: bf00 nop
  71304. 801cdc2: e01e b.n 801ce02 <tcp_input+0x75a>
  71305. goto aborted;
  71306. 801cdc4: bf00 nop
  71307. 801cdc6: e01c b.n 801ce02 <tcp_input+0x75a>
  71308. goto aborted;
  71309. 801cdc8: bf00 nop
  71310. 801cdca: e01a b.n 801ce02 <tcp_input+0x75a>
  71311. goto aborted;
  71312. 801cdcc: bf00 nop
  71313. 801cdce: e018 b.n 801ce02 <tcp_input+0x75a>
  71314. 801cdd0: 2402aea0 .word 0x2402aea0
  71315. 801cdd4: 2402aeb4 .word 0x2402aeb4
  71316. 801cdd8: 2402aed4 .word 0x2402aed4
  71317. 801cddc: 2402aed1 .word 0x2402aed1
  71318. 801cde0: 2402aecc .word 0x2402aecc
  71319. 801cde4: 2402aed0 .word 0x2402aed0
  71320. 801cde8: 2402aece .word 0x2402aece
  71321. 801cdec: 2402aed8 .word 0x2402aed8
  71322. 801cdf0: 2402ae94 .word 0x2402ae94
  71323. 801cdf4: 0802ed10 .word 0x0802ed10
  71324. 801cdf8: 0802eec4 .word 0x0802eec4
  71325. 801cdfc: 0802ed5c .word 0x0802ed5c
  71326. goto aborted;
  71327. 801ce00: bf00 nop
  71328. tcp_input_pcb = NULL;
  71329. 801ce02: 4b27 ldr r3, [pc, #156] @ (801cea0 <tcp_input+0x7f8>)
  71330. 801ce04: 2200 movs r2, #0
  71331. 801ce06: 601a str r2, [r3, #0]
  71332. recv_data = NULL;
  71333. 801ce08: 4b26 ldr r3, [pc, #152] @ (801cea4 <tcp_input+0x7fc>)
  71334. 801ce0a: 2200 movs r2, #0
  71335. 801ce0c: 601a str r2, [r3, #0]
  71336. /* give up our reference to inseg.p */
  71337. if (inseg.p != NULL) {
  71338. 801ce0e: 4b26 ldr r3, [pc, #152] @ (801cea8 <tcp_input+0x800>)
  71339. 801ce10: 685b ldr r3, [r3, #4]
  71340. 801ce12: 2b00 cmp r3, #0
  71341. 801ce14: d03f beq.n 801ce96 <tcp_input+0x7ee>
  71342. pbuf_free(inseg.p);
  71343. 801ce16: 4b24 ldr r3, [pc, #144] @ (801cea8 <tcp_input+0x800>)
  71344. 801ce18: 685b ldr r3, [r3, #4]
  71345. 801ce1a: 4618 mov r0, r3
  71346. 801ce1c: f7fd fb5e bl 801a4dc <pbuf_free>
  71347. inseg.p = NULL;
  71348. 801ce20: 4b21 ldr r3, [pc, #132] @ (801cea8 <tcp_input+0x800>)
  71349. 801ce22: 2200 movs r2, #0
  71350. 801ce24: 605a str r2, [r3, #4]
  71351. pbuf_free(p);
  71352. }
  71353. LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
  71354. PERF_STOP("tcp_input");
  71355. return;
  71356. 801ce26: e036 b.n 801ce96 <tcp_input+0x7ee>
  71357. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  71358. 801ce28: 4b20 ldr r3, [pc, #128] @ (801ceac <tcp_input+0x804>)
  71359. 801ce2a: 681b ldr r3, [r3, #0]
  71360. 801ce2c: 899b ldrh r3, [r3, #12]
  71361. 801ce2e: b29b uxth r3, r3
  71362. 801ce30: 4618 mov r0, r3
  71363. 801ce32: f7fb fe71 bl 8018b18 <lwip_htons>
  71364. 801ce36: 4603 mov r3, r0
  71365. 801ce38: b2db uxtb r3, r3
  71366. 801ce3a: f003 0304 and.w r3, r3, #4
  71367. 801ce3e: 2b00 cmp r3, #0
  71368. 801ce40: d118 bne.n 801ce74 <tcp_input+0x7cc>
  71369. tcp_rst(NULL, ackno, seqno + tcplen, ip_current_dest_addr(),
  71370. 801ce42: 4b1b ldr r3, [pc, #108] @ (801ceb0 <tcp_input+0x808>)
  71371. 801ce44: 6819 ldr r1, [r3, #0]
  71372. 801ce46: 4b1b ldr r3, [pc, #108] @ (801ceb4 <tcp_input+0x80c>)
  71373. 801ce48: 881b ldrh r3, [r3, #0]
  71374. 801ce4a: 461a mov r2, r3
  71375. 801ce4c: 4b1a ldr r3, [pc, #104] @ (801ceb8 <tcp_input+0x810>)
  71376. 801ce4e: 681b ldr r3, [r3, #0]
  71377. 801ce50: 18d0 adds r0, r2, r3
  71378. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  71379. 801ce52: 4b16 ldr r3, [pc, #88] @ (801ceac <tcp_input+0x804>)
  71380. 801ce54: 681b ldr r3, [r3, #0]
  71381. tcp_rst(NULL, ackno, seqno + tcplen, ip_current_dest_addr(),
  71382. 801ce56: 885b ldrh r3, [r3, #2]
  71383. 801ce58: b29b uxth r3, r3
  71384. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  71385. 801ce5a: 4a14 ldr r2, [pc, #80] @ (801ceac <tcp_input+0x804>)
  71386. 801ce5c: 6812 ldr r2, [r2, #0]
  71387. tcp_rst(NULL, ackno, seqno + tcplen, ip_current_dest_addr(),
  71388. 801ce5e: 8812 ldrh r2, [r2, #0]
  71389. 801ce60: b292 uxth r2, r2
  71390. 801ce62: 9202 str r2, [sp, #8]
  71391. 801ce64: 9301 str r3, [sp, #4]
  71392. 801ce66: 4b15 ldr r3, [pc, #84] @ (801cebc <tcp_input+0x814>)
  71393. 801ce68: 9300 str r3, [sp, #0]
  71394. 801ce6a: 4b15 ldr r3, [pc, #84] @ (801cec0 <tcp_input+0x818>)
  71395. 801ce6c: 4602 mov r2, r0
  71396. 801ce6e: 2000 movs r0, #0
  71397. 801ce70: f003 fce2 bl 8020838 <tcp_rst>
  71398. pbuf_free(p);
  71399. 801ce74: 6878 ldr r0, [r7, #4]
  71400. 801ce76: f7fd fb31 bl 801a4dc <pbuf_free>
  71401. return;
  71402. 801ce7a: e00c b.n 801ce96 <tcp_input+0x7ee>
  71403. goto dropped;
  71404. 801ce7c: bf00 nop
  71405. 801ce7e: e006 b.n 801ce8e <tcp_input+0x7e6>
  71406. goto dropped;
  71407. 801ce80: bf00 nop
  71408. 801ce82: e004 b.n 801ce8e <tcp_input+0x7e6>
  71409. goto dropped;
  71410. 801ce84: bf00 nop
  71411. 801ce86: e002 b.n 801ce8e <tcp_input+0x7e6>
  71412. goto dropped;
  71413. 801ce88: bf00 nop
  71414. 801ce8a: e000 b.n 801ce8e <tcp_input+0x7e6>
  71415. goto dropped;
  71416. 801ce8c: bf00 nop
  71417. dropped:
  71418. TCP_STATS_INC(tcp.drop);
  71419. MIB2_STATS_INC(mib2.tcpinerrs);
  71420. pbuf_free(p);
  71421. 801ce8e: 6878 ldr r0, [r7, #4]
  71422. 801ce90: f7fd fb24 bl 801a4dc <pbuf_free>
  71423. 801ce94: e000 b.n 801ce98 <tcp_input+0x7f0>
  71424. return;
  71425. 801ce96: bf00 nop
  71426. }
  71427. 801ce98: 3724 adds r7, #36 @ 0x24
  71428. 801ce9a: 46bd mov sp, r7
  71429. 801ce9c: bd90 pop {r4, r7, pc}
  71430. 801ce9e: bf00 nop
  71431. 801cea0: 2402aed8 .word 0x2402aed8
  71432. 801cea4: 2402aed4 .word 0x2402aed4
  71433. 801cea8: 2402aea0 .word 0x2402aea0
  71434. 801ceac: 2402aeb4 .word 0x2402aeb4
  71435. 801ceb0: 2402aec8 .word 0x2402aec8
  71436. 801ceb4: 2402aece .word 0x2402aece
  71437. 801ceb8: 2402aec4 .word 0x2402aec4
  71438. 801cebc: 24024348 .word 0x24024348
  71439. 801cec0: 2402434c .word 0x2402434c
  71440. 0801cec4 <tcp_input_delayed_close>:
  71441. * any more.
  71442. * @returns 1 if the pcb has been closed and deallocated, 0 otherwise
  71443. */
  71444. static int
  71445. tcp_input_delayed_close(struct tcp_pcb *pcb)
  71446. {
  71447. 801cec4: b580 push {r7, lr}
  71448. 801cec6: b082 sub sp, #8
  71449. 801cec8: af00 add r7, sp, #0
  71450. 801ceca: 6078 str r0, [r7, #4]
  71451. LWIP_ASSERT("tcp_input_delayed_close: invalid pcb", pcb != NULL);
  71452. 801cecc: 687b ldr r3, [r7, #4]
  71453. 801cece: 2b00 cmp r3, #0
  71454. 801ced0: d106 bne.n 801cee0 <tcp_input_delayed_close+0x1c>
  71455. 801ced2: 4b17 ldr r3, [pc, #92] @ (801cf30 <tcp_input_delayed_close+0x6c>)
  71456. 801ced4: f240 225a movw r2, #602 @ 0x25a
  71457. 801ced8: 4916 ldr r1, [pc, #88] @ (801cf34 <tcp_input_delayed_close+0x70>)
  71458. 801ceda: 4817 ldr r0, [pc, #92] @ (801cf38 <tcp_input_delayed_close+0x74>)
  71459. 801cedc: f00c fd76 bl 80299cc <iprintf>
  71460. if (recv_flags & TF_CLOSED) {
  71461. 801cee0: 4b16 ldr r3, [pc, #88] @ (801cf3c <tcp_input_delayed_close+0x78>)
  71462. 801cee2: 781b ldrb r3, [r3, #0]
  71463. 801cee4: f003 0310 and.w r3, r3, #16
  71464. 801cee8: 2b00 cmp r3, #0
  71465. 801ceea: d01c beq.n 801cf26 <tcp_input_delayed_close+0x62>
  71466. /* The connection has been closed and we will deallocate the
  71467. PCB. */
  71468. if (!(pcb->flags & TF_RXCLOSED)) {
  71469. 801ceec: 687b ldr r3, [r7, #4]
  71470. 801ceee: 8b5b ldrh r3, [r3, #26]
  71471. 801cef0: f003 0310 and.w r3, r3, #16
  71472. 801cef4: 2b00 cmp r3, #0
  71473. 801cef6: d10d bne.n 801cf14 <tcp_input_delayed_close+0x50>
  71474. /* Connection closed although the application has only shut down the
  71475. tx side: call the PCB's err callback and indicate the closure to
  71476. ensure the application doesn't continue using the PCB. */
  71477. TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_CLSD);
  71478. 801cef8: 687b ldr r3, [r7, #4]
  71479. 801cefa: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  71480. 801cefe: 2b00 cmp r3, #0
  71481. 801cf00: d008 beq.n 801cf14 <tcp_input_delayed_close+0x50>
  71482. 801cf02: 687b ldr r3, [r7, #4]
  71483. 801cf04: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90
  71484. 801cf08: 687a ldr r2, [r7, #4]
  71485. 801cf0a: 6912 ldr r2, [r2, #16]
  71486. 801cf0c: f06f 010e mvn.w r1, #14
  71487. 801cf10: 4610 mov r0, r2
  71488. 801cf12: 4798 blx r3
  71489. }
  71490. tcp_pcb_remove(&tcp_active_pcbs, pcb);
  71491. 801cf14: 6879 ldr r1, [r7, #4]
  71492. 801cf16: 480a ldr r0, [pc, #40] @ (801cf40 <tcp_input_delayed_close+0x7c>)
  71493. 801cf18: f7ff fa4e bl 801c3b8 <tcp_pcb_remove>
  71494. tcp_free(pcb);
  71495. 801cf1c: 6878 ldr r0, [r7, #4]
  71496. 801cf1e: f7fd fd99 bl 801aa54 <tcp_free>
  71497. return 1;
  71498. 801cf22: 2301 movs r3, #1
  71499. 801cf24: e000 b.n 801cf28 <tcp_input_delayed_close+0x64>
  71500. }
  71501. return 0;
  71502. 801cf26: 2300 movs r3, #0
  71503. }
  71504. 801cf28: 4618 mov r0, r3
  71505. 801cf2a: 3708 adds r7, #8
  71506. 801cf2c: 46bd mov sp, r7
  71507. 801cf2e: bd80 pop {r7, pc}
  71508. 801cf30: 0802ed10 .word 0x0802ed10
  71509. 801cf34: 0802eee0 .word 0x0802eee0
  71510. 801cf38: 0802ed5c .word 0x0802ed5c
  71511. 801cf3c: 2402aed1 .word 0x2402aed1
  71512. 801cf40: 2402ae94 .word 0x2402ae94
  71513. 0801cf44 <tcp_listen_input>:
  71514. * @note the segment which arrived is saved in global variables, therefore only the pcb
  71515. * involved is passed as a parameter to this function
  71516. */
  71517. static void
  71518. tcp_listen_input(struct tcp_pcb_listen *pcb)
  71519. {
  71520. 801cf44: b590 push {r4, r7, lr}
  71521. 801cf46: b08b sub sp, #44 @ 0x2c
  71522. 801cf48: af04 add r7, sp, #16
  71523. 801cf4a: 6078 str r0, [r7, #4]
  71524. struct tcp_pcb *npcb;
  71525. u32_t iss;
  71526. err_t rc;
  71527. if (flags & TCP_RST) {
  71528. 801cf4c: 4b6f ldr r3, [pc, #444] @ (801d10c <tcp_listen_input+0x1c8>)
  71529. 801cf4e: 781b ldrb r3, [r3, #0]
  71530. 801cf50: f003 0304 and.w r3, r3, #4
  71531. 801cf54: 2b00 cmp r3, #0
  71532. 801cf56: f040 80d2 bne.w 801d0fe <tcp_listen_input+0x1ba>
  71533. /* An incoming RST should be ignored. Return. */
  71534. return;
  71535. }
  71536. LWIP_ASSERT("tcp_listen_input: invalid pcb", pcb != NULL);
  71537. 801cf5a: 687b ldr r3, [r7, #4]
  71538. 801cf5c: 2b00 cmp r3, #0
  71539. 801cf5e: d106 bne.n 801cf6e <tcp_listen_input+0x2a>
  71540. 801cf60: 4b6b ldr r3, [pc, #428] @ (801d110 <tcp_listen_input+0x1cc>)
  71541. 801cf62: f240 2281 movw r2, #641 @ 0x281
  71542. 801cf66: 496b ldr r1, [pc, #428] @ (801d114 <tcp_listen_input+0x1d0>)
  71543. 801cf68: 486b ldr r0, [pc, #428] @ (801d118 <tcp_listen_input+0x1d4>)
  71544. 801cf6a: f00c fd2f bl 80299cc <iprintf>
  71545. /* In the LISTEN state, we check for incoming SYN segments,
  71546. creates a new PCB, and responds with a SYN|ACK. */
  71547. if (flags & TCP_ACK) {
  71548. 801cf6e: 4b67 ldr r3, [pc, #412] @ (801d10c <tcp_listen_input+0x1c8>)
  71549. 801cf70: 781b ldrb r3, [r3, #0]
  71550. 801cf72: f003 0310 and.w r3, r3, #16
  71551. 801cf76: 2b00 cmp r3, #0
  71552. 801cf78: d019 beq.n 801cfae <tcp_listen_input+0x6a>
  71553. /* For incoming segments with the ACK flag set, respond with a
  71554. RST. */
  71555. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n"));
  71556. tcp_rst((const struct tcp_pcb *)pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  71557. 801cf7a: 4b68 ldr r3, [pc, #416] @ (801d11c <tcp_listen_input+0x1d8>)
  71558. 801cf7c: 6819 ldr r1, [r3, #0]
  71559. 801cf7e: 4b68 ldr r3, [pc, #416] @ (801d120 <tcp_listen_input+0x1dc>)
  71560. 801cf80: 881b ldrh r3, [r3, #0]
  71561. 801cf82: 461a mov r2, r3
  71562. 801cf84: 4b67 ldr r3, [pc, #412] @ (801d124 <tcp_listen_input+0x1e0>)
  71563. 801cf86: 681b ldr r3, [r3, #0]
  71564. 801cf88: 18d0 adds r0, r2, r3
  71565. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  71566. 801cf8a: 4b67 ldr r3, [pc, #412] @ (801d128 <tcp_listen_input+0x1e4>)
  71567. 801cf8c: 681b ldr r3, [r3, #0]
  71568. tcp_rst((const struct tcp_pcb *)pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  71569. 801cf8e: 885b ldrh r3, [r3, #2]
  71570. 801cf90: b29b uxth r3, r3
  71571. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  71572. 801cf92: 4a65 ldr r2, [pc, #404] @ (801d128 <tcp_listen_input+0x1e4>)
  71573. 801cf94: 6812 ldr r2, [r2, #0]
  71574. tcp_rst((const struct tcp_pcb *)pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  71575. 801cf96: 8812 ldrh r2, [r2, #0]
  71576. 801cf98: b292 uxth r2, r2
  71577. 801cf9a: 9202 str r2, [sp, #8]
  71578. 801cf9c: 9301 str r3, [sp, #4]
  71579. 801cf9e: 4b63 ldr r3, [pc, #396] @ (801d12c <tcp_listen_input+0x1e8>)
  71580. 801cfa0: 9300 str r3, [sp, #0]
  71581. 801cfa2: 4b63 ldr r3, [pc, #396] @ (801d130 <tcp_listen_input+0x1ec>)
  71582. 801cfa4: 4602 mov r2, r0
  71583. 801cfa6: 6878 ldr r0, [r7, #4]
  71584. 801cfa8: f003 fc46 bl 8020838 <tcp_rst>
  71585. tcp_abandon(npcb, 0);
  71586. return;
  71587. }
  71588. tcp_output(npcb);
  71589. }
  71590. return;
  71591. 801cfac: e0a9 b.n 801d102 <tcp_listen_input+0x1be>
  71592. } else if (flags & TCP_SYN) {
  71593. 801cfae: 4b57 ldr r3, [pc, #348] @ (801d10c <tcp_listen_input+0x1c8>)
  71594. 801cfb0: 781b ldrb r3, [r3, #0]
  71595. 801cfb2: f003 0302 and.w r3, r3, #2
  71596. 801cfb6: 2b00 cmp r3, #0
  71597. 801cfb8: f000 80a3 beq.w 801d102 <tcp_listen_input+0x1be>
  71598. npcb = tcp_alloc(pcb->prio);
  71599. 801cfbc: 687b ldr r3, [r7, #4]
  71600. 801cfbe: 7d5b ldrb r3, [r3, #21]
  71601. 801cfc0: 4618 mov r0, r3
  71602. 801cfc2: f7ff f84d bl 801c060 <tcp_alloc>
  71603. 801cfc6: 6178 str r0, [r7, #20]
  71604. if (npcb == NULL) {
  71605. 801cfc8: 697b ldr r3, [r7, #20]
  71606. 801cfca: 2b00 cmp r3, #0
  71607. 801cfcc: d111 bne.n 801cff2 <tcp_listen_input+0xae>
  71608. TCP_EVENT_ACCEPT(pcb, NULL, pcb->callback_arg, ERR_MEM, err);
  71609. 801cfce: 687b ldr r3, [r7, #4]
  71610. 801cfd0: 699b ldr r3, [r3, #24]
  71611. 801cfd2: 2b00 cmp r3, #0
  71612. 801cfd4: d00a beq.n 801cfec <tcp_listen_input+0xa8>
  71613. 801cfd6: 687b ldr r3, [r7, #4]
  71614. 801cfd8: 699b ldr r3, [r3, #24]
  71615. 801cfda: 687a ldr r2, [r7, #4]
  71616. 801cfdc: 6910 ldr r0, [r2, #16]
  71617. 801cfde: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  71618. 801cfe2: 2100 movs r1, #0
  71619. 801cfe4: 4798 blx r3
  71620. 801cfe6: 4603 mov r3, r0
  71621. 801cfe8: 73bb strb r3, [r7, #14]
  71622. return;
  71623. 801cfea: e08b b.n 801d104 <tcp_listen_input+0x1c0>
  71624. TCP_EVENT_ACCEPT(pcb, NULL, pcb->callback_arg, ERR_MEM, err);
  71625. 801cfec: 23f0 movs r3, #240 @ 0xf0
  71626. 801cfee: 73bb strb r3, [r7, #14]
  71627. return;
  71628. 801cff0: e088 b.n 801d104 <tcp_listen_input+0x1c0>
  71629. ip_addr_copy(npcb->local_ip, *ip_current_dest_addr());
  71630. 801cff2: 4b50 ldr r3, [pc, #320] @ (801d134 <tcp_listen_input+0x1f0>)
  71631. 801cff4: 695a ldr r2, [r3, #20]
  71632. 801cff6: 697b ldr r3, [r7, #20]
  71633. 801cff8: 601a str r2, [r3, #0]
  71634. ip_addr_copy(npcb->remote_ip, *ip_current_src_addr());
  71635. 801cffa: 4b4e ldr r3, [pc, #312] @ (801d134 <tcp_listen_input+0x1f0>)
  71636. 801cffc: 691a ldr r2, [r3, #16]
  71637. 801cffe: 697b ldr r3, [r7, #20]
  71638. 801d000: 605a str r2, [r3, #4]
  71639. npcb->local_port = pcb->local_port;
  71640. 801d002: 687b ldr r3, [r7, #4]
  71641. 801d004: 8ada ldrh r2, [r3, #22]
  71642. 801d006: 697b ldr r3, [r7, #20]
  71643. 801d008: 82da strh r2, [r3, #22]
  71644. npcb->remote_port = tcphdr->src;
  71645. 801d00a: 4b47 ldr r3, [pc, #284] @ (801d128 <tcp_listen_input+0x1e4>)
  71646. 801d00c: 681b ldr r3, [r3, #0]
  71647. 801d00e: 881b ldrh r3, [r3, #0]
  71648. 801d010: b29a uxth r2, r3
  71649. 801d012: 697b ldr r3, [r7, #20]
  71650. 801d014: 831a strh r2, [r3, #24]
  71651. npcb->state = SYN_RCVD;
  71652. 801d016: 697b ldr r3, [r7, #20]
  71653. 801d018: 2203 movs r2, #3
  71654. 801d01a: 751a strb r2, [r3, #20]
  71655. npcb->rcv_nxt = seqno + 1;
  71656. 801d01c: 4b41 ldr r3, [pc, #260] @ (801d124 <tcp_listen_input+0x1e0>)
  71657. 801d01e: 681b ldr r3, [r3, #0]
  71658. 801d020: 1c5a adds r2, r3, #1
  71659. 801d022: 697b ldr r3, [r7, #20]
  71660. 801d024: 625a str r2, [r3, #36] @ 0x24
  71661. npcb->rcv_ann_right_edge = npcb->rcv_nxt;
  71662. 801d026: 697b ldr r3, [r7, #20]
  71663. 801d028: 6a5a ldr r2, [r3, #36] @ 0x24
  71664. 801d02a: 697b ldr r3, [r7, #20]
  71665. 801d02c: 62da str r2, [r3, #44] @ 0x2c
  71666. iss = tcp_next_iss(npcb);
  71667. 801d02e: 6978 ldr r0, [r7, #20]
  71668. 801d030: f7ff fa56 bl 801c4e0 <tcp_next_iss>
  71669. 801d034: 6138 str r0, [r7, #16]
  71670. npcb->snd_wl2 = iss;
  71671. 801d036: 697b ldr r3, [r7, #20]
  71672. 801d038: 693a ldr r2, [r7, #16]
  71673. 801d03a: 659a str r2, [r3, #88] @ 0x58
  71674. npcb->snd_nxt = iss;
  71675. 801d03c: 697b ldr r3, [r7, #20]
  71676. 801d03e: 693a ldr r2, [r7, #16]
  71677. 801d040: 651a str r2, [r3, #80] @ 0x50
  71678. npcb->lastack = iss;
  71679. 801d042: 697b ldr r3, [r7, #20]
  71680. 801d044: 693a ldr r2, [r7, #16]
  71681. 801d046: 645a str r2, [r3, #68] @ 0x44
  71682. npcb->snd_lbb = iss;
  71683. 801d048: 697b ldr r3, [r7, #20]
  71684. 801d04a: 693a ldr r2, [r7, #16]
  71685. 801d04c: 65da str r2, [r3, #92] @ 0x5c
  71686. npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */
  71687. 801d04e: 4b35 ldr r3, [pc, #212] @ (801d124 <tcp_listen_input+0x1e0>)
  71688. 801d050: 681b ldr r3, [r3, #0]
  71689. 801d052: 1e5a subs r2, r3, #1
  71690. 801d054: 697b ldr r3, [r7, #20]
  71691. 801d056: 655a str r2, [r3, #84] @ 0x54
  71692. npcb->callback_arg = pcb->callback_arg;
  71693. 801d058: 687b ldr r3, [r7, #4]
  71694. 801d05a: 691a ldr r2, [r3, #16]
  71695. 801d05c: 697b ldr r3, [r7, #20]
  71696. 801d05e: 611a str r2, [r3, #16]
  71697. npcb->listener = pcb;
  71698. 801d060: 697b ldr r3, [r7, #20]
  71699. 801d062: 687a ldr r2, [r7, #4]
  71700. 801d064: 67da str r2, [r3, #124] @ 0x7c
  71701. npcb->so_options = pcb->so_options & SOF_INHERITED;
  71702. 801d066: 687b ldr r3, [r7, #4]
  71703. 801d068: 7a5b ldrb r3, [r3, #9]
  71704. 801d06a: f003 030c and.w r3, r3, #12
  71705. 801d06e: b2da uxtb r2, r3
  71706. 801d070: 697b ldr r3, [r7, #20]
  71707. 801d072: 725a strb r2, [r3, #9]
  71708. npcb->netif_idx = pcb->netif_idx;
  71709. 801d074: 687b ldr r3, [r7, #4]
  71710. 801d076: 7a1a ldrb r2, [r3, #8]
  71711. 801d078: 697b ldr r3, [r7, #20]
  71712. 801d07a: 721a strb r2, [r3, #8]
  71713. TCP_REG_ACTIVE(npcb);
  71714. 801d07c: 4b2e ldr r3, [pc, #184] @ (801d138 <tcp_listen_input+0x1f4>)
  71715. 801d07e: 681a ldr r2, [r3, #0]
  71716. 801d080: 697b ldr r3, [r7, #20]
  71717. 801d082: 60da str r2, [r3, #12]
  71718. 801d084: 4a2c ldr r2, [pc, #176] @ (801d138 <tcp_listen_input+0x1f4>)
  71719. 801d086: 697b ldr r3, [r7, #20]
  71720. 801d088: 6013 str r3, [r2, #0]
  71721. 801d08a: f003 fd97 bl 8020bbc <tcp_timer_needed>
  71722. 801d08e: 4b2b ldr r3, [pc, #172] @ (801d13c <tcp_listen_input+0x1f8>)
  71723. 801d090: 2201 movs r2, #1
  71724. 801d092: 701a strb r2, [r3, #0]
  71725. tcp_parseopt(npcb);
  71726. 801d094: 6978 ldr r0, [r7, #20]
  71727. 801d096: f001 fd8b bl 801ebb0 <tcp_parseopt>
  71728. npcb->snd_wnd = tcphdr->wnd;
  71729. 801d09a: 4b23 ldr r3, [pc, #140] @ (801d128 <tcp_listen_input+0x1e4>)
  71730. 801d09c: 681b ldr r3, [r3, #0]
  71731. 801d09e: 89db ldrh r3, [r3, #14]
  71732. 801d0a0: b29a uxth r2, r3
  71733. 801d0a2: 697b ldr r3, [r7, #20]
  71734. 801d0a4: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  71735. npcb->snd_wnd_max = npcb->snd_wnd;
  71736. 801d0a8: 697b ldr r3, [r7, #20]
  71737. 801d0aa: f8b3 2060 ldrh.w r2, [r3, #96] @ 0x60
  71738. 801d0ae: 697b ldr r3, [r7, #20]
  71739. 801d0b0: f8a3 2062 strh.w r2, [r3, #98] @ 0x62
  71740. npcb->mss = tcp_eff_send_mss(npcb->mss, &npcb->local_ip, &npcb->remote_ip);
  71741. 801d0b4: 697b ldr r3, [r7, #20]
  71742. 801d0b6: 8e5c ldrh r4, [r3, #50] @ 0x32
  71743. 801d0b8: 697b ldr r3, [r7, #20]
  71744. 801d0ba: 3304 adds r3, #4
  71745. 801d0bc: 4618 mov r0, r3
  71746. 801d0be: f007 fc77 bl 80249b0 <ip4_route>
  71747. 801d0c2: 4601 mov r1, r0
  71748. 801d0c4: 697b ldr r3, [r7, #20]
  71749. 801d0c6: 3304 adds r3, #4
  71750. 801d0c8: 461a mov r2, r3
  71751. 801d0ca: 4620 mov r0, r4
  71752. 801d0cc: f7ff fa2e bl 801c52c <tcp_eff_send_mss_netif>
  71753. 801d0d0: 4603 mov r3, r0
  71754. 801d0d2: 461a mov r2, r3
  71755. 801d0d4: 697b ldr r3, [r7, #20]
  71756. 801d0d6: 865a strh r2, [r3, #50] @ 0x32
  71757. rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK);
  71758. 801d0d8: 2112 movs r1, #18
  71759. 801d0da: 6978 ldr r0, [r7, #20]
  71760. 801d0dc: f002 fcfc bl 801fad8 <tcp_enqueue_flags>
  71761. 801d0e0: 4603 mov r3, r0
  71762. 801d0e2: 73fb strb r3, [r7, #15]
  71763. if (rc != ERR_OK) {
  71764. 801d0e4: f997 300f ldrsb.w r3, [r7, #15]
  71765. 801d0e8: 2b00 cmp r3, #0
  71766. 801d0ea: d004 beq.n 801d0f6 <tcp_listen_input+0x1b2>
  71767. tcp_abandon(npcb, 0);
  71768. 801d0ec: 2100 movs r1, #0
  71769. 801d0ee: 6978 ldr r0, [r7, #20]
  71770. 801d0f0: f7fd ff3a bl 801af68 <tcp_abandon>
  71771. return;
  71772. 801d0f4: e006 b.n 801d104 <tcp_listen_input+0x1c0>
  71773. tcp_output(npcb);
  71774. 801d0f6: 6978 ldr r0, [r7, #20]
  71775. 801d0f8: f002 fddc bl 801fcb4 <tcp_output>
  71776. return;
  71777. 801d0fc: e001 b.n 801d102 <tcp_listen_input+0x1be>
  71778. return;
  71779. 801d0fe: bf00 nop
  71780. 801d100: e000 b.n 801d104 <tcp_listen_input+0x1c0>
  71781. return;
  71782. 801d102: bf00 nop
  71783. }
  71784. 801d104: 371c adds r7, #28
  71785. 801d106: 46bd mov sp, r7
  71786. 801d108: bd90 pop {r4, r7, pc}
  71787. 801d10a: bf00 nop
  71788. 801d10c: 2402aed0 .word 0x2402aed0
  71789. 801d110: 0802ed10 .word 0x0802ed10
  71790. 801d114: 0802ef08 .word 0x0802ef08
  71791. 801d118: 0802ed5c .word 0x0802ed5c
  71792. 801d11c: 2402aec8 .word 0x2402aec8
  71793. 801d120: 2402aece .word 0x2402aece
  71794. 801d124: 2402aec4 .word 0x2402aec4
  71795. 801d128: 2402aeb4 .word 0x2402aeb4
  71796. 801d12c: 24024348 .word 0x24024348
  71797. 801d130: 2402434c .word 0x2402434c
  71798. 801d134: 24024338 .word 0x24024338
  71799. 801d138: 2402ae94 .word 0x2402ae94
  71800. 801d13c: 2402ae9c .word 0x2402ae9c
  71801. 0801d140 <tcp_timewait_input>:
  71802. * @note the segment which arrived is saved in global variables, therefore only the pcb
  71803. * involved is passed as a parameter to this function
  71804. */
  71805. static void
  71806. tcp_timewait_input(struct tcp_pcb *pcb)
  71807. {
  71808. 801d140: b580 push {r7, lr}
  71809. 801d142: b086 sub sp, #24
  71810. 801d144: af04 add r7, sp, #16
  71811. 801d146: 6078 str r0, [r7, #4]
  71812. /* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */
  71813. /* RFC 793 3.9 Event Processing - Segment Arrives:
  71814. * - first check sequence number - we skip that one in TIME_WAIT (always
  71815. * acceptable since we only send ACKs)
  71816. * - second check the RST bit (... return) */
  71817. if (flags & TCP_RST) {
  71818. 801d148: 4b2f ldr r3, [pc, #188] @ (801d208 <tcp_timewait_input+0xc8>)
  71819. 801d14a: 781b ldrb r3, [r3, #0]
  71820. 801d14c: f003 0304 and.w r3, r3, #4
  71821. 801d150: 2b00 cmp r3, #0
  71822. 801d152: d153 bne.n 801d1fc <tcp_timewait_input+0xbc>
  71823. return;
  71824. }
  71825. LWIP_ASSERT("tcp_timewait_input: invalid pcb", pcb != NULL);
  71826. 801d154: 687b ldr r3, [r7, #4]
  71827. 801d156: 2b00 cmp r3, #0
  71828. 801d158: d106 bne.n 801d168 <tcp_timewait_input+0x28>
  71829. 801d15a: 4b2c ldr r3, [pc, #176] @ (801d20c <tcp_timewait_input+0xcc>)
  71830. 801d15c: f240 22ee movw r2, #750 @ 0x2ee
  71831. 801d160: 492b ldr r1, [pc, #172] @ (801d210 <tcp_timewait_input+0xd0>)
  71832. 801d162: 482c ldr r0, [pc, #176] @ (801d214 <tcp_timewait_input+0xd4>)
  71833. 801d164: f00c fc32 bl 80299cc <iprintf>
  71834. /* - fourth, check the SYN bit, */
  71835. if (flags & TCP_SYN) {
  71836. 801d168: 4b27 ldr r3, [pc, #156] @ (801d208 <tcp_timewait_input+0xc8>)
  71837. 801d16a: 781b ldrb r3, [r3, #0]
  71838. 801d16c: f003 0302 and.w r3, r3, #2
  71839. 801d170: 2b00 cmp r3, #0
  71840. 801d172: d02a beq.n 801d1ca <tcp_timewait_input+0x8a>
  71841. /* If an incoming segment is not acceptable, an acknowledgment
  71842. should be sent in reply */
  71843. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd)) {
  71844. 801d174: 4b28 ldr r3, [pc, #160] @ (801d218 <tcp_timewait_input+0xd8>)
  71845. 801d176: 681a ldr r2, [r3, #0]
  71846. 801d178: 687b ldr r3, [r7, #4]
  71847. 801d17a: 6a5b ldr r3, [r3, #36] @ 0x24
  71848. 801d17c: 1ad3 subs r3, r2, r3
  71849. 801d17e: 2b00 cmp r3, #0
  71850. 801d180: db2d blt.n 801d1de <tcp_timewait_input+0x9e>
  71851. 801d182: 4b25 ldr r3, [pc, #148] @ (801d218 <tcp_timewait_input+0xd8>)
  71852. 801d184: 681a ldr r2, [r3, #0]
  71853. 801d186: 687b ldr r3, [r7, #4]
  71854. 801d188: 6a5b ldr r3, [r3, #36] @ 0x24
  71855. 801d18a: 6879 ldr r1, [r7, #4]
  71856. 801d18c: 8d09 ldrh r1, [r1, #40] @ 0x28
  71857. 801d18e: 440b add r3, r1
  71858. 801d190: 1ad3 subs r3, r2, r3
  71859. 801d192: 2b00 cmp r3, #0
  71860. 801d194: dc23 bgt.n 801d1de <tcp_timewait_input+0x9e>
  71861. /* If the SYN is in the window it is an error, send a reset */
  71862. tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  71863. 801d196: 4b21 ldr r3, [pc, #132] @ (801d21c <tcp_timewait_input+0xdc>)
  71864. 801d198: 6819 ldr r1, [r3, #0]
  71865. 801d19a: 4b21 ldr r3, [pc, #132] @ (801d220 <tcp_timewait_input+0xe0>)
  71866. 801d19c: 881b ldrh r3, [r3, #0]
  71867. 801d19e: 461a mov r2, r3
  71868. 801d1a0: 4b1d ldr r3, [pc, #116] @ (801d218 <tcp_timewait_input+0xd8>)
  71869. 801d1a2: 681b ldr r3, [r3, #0]
  71870. 801d1a4: 18d0 adds r0, r2, r3
  71871. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  71872. 801d1a6: 4b1f ldr r3, [pc, #124] @ (801d224 <tcp_timewait_input+0xe4>)
  71873. 801d1a8: 681b ldr r3, [r3, #0]
  71874. tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  71875. 801d1aa: 885b ldrh r3, [r3, #2]
  71876. 801d1ac: b29b uxth r3, r3
  71877. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  71878. 801d1ae: 4a1d ldr r2, [pc, #116] @ (801d224 <tcp_timewait_input+0xe4>)
  71879. 801d1b0: 6812 ldr r2, [r2, #0]
  71880. tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  71881. 801d1b2: 8812 ldrh r2, [r2, #0]
  71882. 801d1b4: b292 uxth r2, r2
  71883. 801d1b6: 9202 str r2, [sp, #8]
  71884. 801d1b8: 9301 str r3, [sp, #4]
  71885. 801d1ba: 4b1b ldr r3, [pc, #108] @ (801d228 <tcp_timewait_input+0xe8>)
  71886. 801d1bc: 9300 str r3, [sp, #0]
  71887. 801d1be: 4b1b ldr r3, [pc, #108] @ (801d22c <tcp_timewait_input+0xec>)
  71888. 801d1c0: 4602 mov r2, r0
  71889. 801d1c2: 6878 ldr r0, [r7, #4]
  71890. 801d1c4: f003 fb38 bl 8020838 <tcp_rst>
  71891. return;
  71892. 801d1c8: e01b b.n 801d202 <tcp_timewait_input+0xc2>
  71893. }
  71894. } else if (flags & TCP_FIN) {
  71895. 801d1ca: 4b0f ldr r3, [pc, #60] @ (801d208 <tcp_timewait_input+0xc8>)
  71896. 801d1cc: 781b ldrb r3, [r3, #0]
  71897. 801d1ce: f003 0301 and.w r3, r3, #1
  71898. 801d1d2: 2b00 cmp r3, #0
  71899. 801d1d4: d003 beq.n 801d1de <tcp_timewait_input+0x9e>
  71900. /* - eighth, check the FIN bit: Remain in the TIME-WAIT state.
  71901. Restart the 2 MSL time-wait timeout.*/
  71902. pcb->tmr = tcp_ticks;
  71903. 801d1d6: 4b16 ldr r3, [pc, #88] @ (801d230 <tcp_timewait_input+0xf0>)
  71904. 801d1d8: 681a ldr r2, [r3, #0]
  71905. 801d1da: 687b ldr r3, [r7, #4]
  71906. 801d1dc: 621a str r2, [r3, #32]
  71907. }
  71908. if ((tcplen > 0)) {
  71909. 801d1de: 4b10 ldr r3, [pc, #64] @ (801d220 <tcp_timewait_input+0xe0>)
  71910. 801d1e0: 881b ldrh r3, [r3, #0]
  71911. 801d1e2: 2b00 cmp r3, #0
  71912. 801d1e4: d00c beq.n 801d200 <tcp_timewait_input+0xc0>
  71913. /* Acknowledge data, FIN or out-of-window SYN */
  71914. tcp_ack_now(pcb);
  71915. 801d1e6: 687b ldr r3, [r7, #4]
  71916. 801d1e8: 8b5b ldrh r3, [r3, #26]
  71917. 801d1ea: f043 0302 orr.w r3, r3, #2
  71918. 801d1ee: b29a uxth r2, r3
  71919. 801d1f0: 687b ldr r3, [r7, #4]
  71920. 801d1f2: 835a strh r2, [r3, #26]
  71921. tcp_output(pcb);
  71922. 801d1f4: 6878 ldr r0, [r7, #4]
  71923. 801d1f6: f002 fd5d bl 801fcb4 <tcp_output>
  71924. }
  71925. return;
  71926. 801d1fa: e001 b.n 801d200 <tcp_timewait_input+0xc0>
  71927. return;
  71928. 801d1fc: bf00 nop
  71929. 801d1fe: e000 b.n 801d202 <tcp_timewait_input+0xc2>
  71930. return;
  71931. 801d200: bf00 nop
  71932. }
  71933. 801d202: 3708 adds r7, #8
  71934. 801d204: 46bd mov sp, r7
  71935. 801d206: bd80 pop {r7, pc}
  71936. 801d208: 2402aed0 .word 0x2402aed0
  71937. 801d20c: 0802ed10 .word 0x0802ed10
  71938. 801d210: 0802ef28 .word 0x0802ef28
  71939. 801d214: 0802ed5c .word 0x0802ed5c
  71940. 801d218: 2402aec4 .word 0x2402aec4
  71941. 801d21c: 2402aec8 .word 0x2402aec8
  71942. 801d220: 2402aece .word 0x2402aece
  71943. 801d224: 2402aeb4 .word 0x2402aeb4
  71944. 801d228: 24024348 .word 0x24024348
  71945. 801d22c: 2402434c .word 0x2402434c
  71946. 801d230: 2402ae88 .word 0x2402ae88
  71947. 0801d234 <tcp_process>:
  71948. * @note the segment which arrived is saved in global variables, therefore only the pcb
  71949. * involved is passed as a parameter to this function
  71950. */
  71951. static err_t
  71952. tcp_process(struct tcp_pcb *pcb)
  71953. {
  71954. 801d234: b590 push {r4, r7, lr}
  71955. 801d236: b08d sub sp, #52 @ 0x34
  71956. 801d238: af04 add r7, sp, #16
  71957. 801d23a: 6078 str r0, [r7, #4]
  71958. struct tcp_seg *rseg;
  71959. u8_t acceptable = 0;
  71960. 801d23c: 2300 movs r3, #0
  71961. 801d23e: 77fb strb r3, [r7, #31]
  71962. err_t err;
  71963. err = ERR_OK;
  71964. 801d240: 2300 movs r3, #0
  71965. 801d242: 77bb strb r3, [r7, #30]
  71966. LWIP_ASSERT("tcp_process: invalid pcb", pcb != NULL);
  71967. 801d244: 687b ldr r3, [r7, #4]
  71968. 801d246: 2b00 cmp r3, #0
  71969. 801d248: d106 bne.n 801d258 <tcp_process+0x24>
  71970. 801d24a: 4b9d ldr r3, [pc, #628] @ (801d4c0 <tcp_process+0x28c>)
  71971. 801d24c: f44f 7247 mov.w r2, #796 @ 0x31c
  71972. 801d250: 499c ldr r1, [pc, #624] @ (801d4c4 <tcp_process+0x290>)
  71973. 801d252: 489d ldr r0, [pc, #628] @ (801d4c8 <tcp_process+0x294>)
  71974. 801d254: f00c fbba bl 80299cc <iprintf>
  71975. /* Process incoming RST segments. */
  71976. if (flags & TCP_RST) {
  71977. 801d258: 4b9c ldr r3, [pc, #624] @ (801d4cc <tcp_process+0x298>)
  71978. 801d25a: 781b ldrb r3, [r3, #0]
  71979. 801d25c: f003 0304 and.w r3, r3, #4
  71980. 801d260: 2b00 cmp r3, #0
  71981. 801d262: d04e beq.n 801d302 <tcp_process+0xce>
  71982. /* First, determine if the reset is acceptable. */
  71983. if (pcb->state == SYN_SENT) {
  71984. 801d264: 687b ldr r3, [r7, #4]
  71985. 801d266: 7d1b ldrb r3, [r3, #20]
  71986. 801d268: 2b02 cmp r3, #2
  71987. 801d26a: d108 bne.n 801d27e <tcp_process+0x4a>
  71988. /* "In the SYN-SENT state (a RST received in response to an initial SYN),
  71989. the RST is acceptable if the ACK field acknowledges the SYN." */
  71990. if (ackno == pcb->snd_nxt) {
  71991. 801d26c: 687b ldr r3, [r7, #4]
  71992. 801d26e: 6d1a ldr r2, [r3, #80] @ 0x50
  71993. 801d270: 4b97 ldr r3, [pc, #604] @ (801d4d0 <tcp_process+0x29c>)
  71994. 801d272: 681b ldr r3, [r3, #0]
  71995. 801d274: 429a cmp r2, r3
  71996. 801d276: d123 bne.n 801d2c0 <tcp_process+0x8c>
  71997. acceptable = 1;
  71998. 801d278: 2301 movs r3, #1
  71999. 801d27a: 77fb strb r3, [r7, #31]
  72000. 801d27c: e020 b.n 801d2c0 <tcp_process+0x8c>
  72001. }
  72002. } else {
  72003. /* "In all states except SYN-SENT, all reset (RST) segments are validated
  72004. by checking their SEQ-fields." */
  72005. if (seqno == pcb->rcv_nxt) {
  72006. 801d27e: 687b ldr r3, [r7, #4]
  72007. 801d280: 6a5a ldr r2, [r3, #36] @ 0x24
  72008. 801d282: 4b94 ldr r3, [pc, #592] @ (801d4d4 <tcp_process+0x2a0>)
  72009. 801d284: 681b ldr r3, [r3, #0]
  72010. 801d286: 429a cmp r2, r3
  72011. 801d288: d102 bne.n 801d290 <tcp_process+0x5c>
  72012. acceptable = 1;
  72013. 801d28a: 2301 movs r3, #1
  72014. 801d28c: 77fb strb r3, [r7, #31]
  72015. 801d28e: e017 b.n 801d2c0 <tcp_process+0x8c>
  72016. } else if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
  72017. 801d290: 4b90 ldr r3, [pc, #576] @ (801d4d4 <tcp_process+0x2a0>)
  72018. 801d292: 681a ldr r2, [r3, #0]
  72019. 801d294: 687b ldr r3, [r7, #4]
  72020. 801d296: 6a5b ldr r3, [r3, #36] @ 0x24
  72021. 801d298: 1ad3 subs r3, r2, r3
  72022. 801d29a: 2b00 cmp r3, #0
  72023. 801d29c: db10 blt.n 801d2c0 <tcp_process+0x8c>
  72024. 801d29e: 4b8d ldr r3, [pc, #564] @ (801d4d4 <tcp_process+0x2a0>)
  72025. 801d2a0: 681a ldr r2, [r3, #0]
  72026. 801d2a2: 687b ldr r3, [r7, #4]
  72027. 801d2a4: 6a5b ldr r3, [r3, #36] @ 0x24
  72028. 801d2a6: 6879 ldr r1, [r7, #4]
  72029. 801d2a8: 8d09 ldrh r1, [r1, #40] @ 0x28
  72030. 801d2aa: 440b add r3, r1
  72031. 801d2ac: 1ad3 subs r3, r2, r3
  72032. 801d2ae: 2b00 cmp r3, #0
  72033. 801d2b0: dc06 bgt.n 801d2c0 <tcp_process+0x8c>
  72034. pcb->rcv_nxt + pcb->rcv_wnd)) {
  72035. /* If the sequence number is inside the window, we send a challenge ACK
  72036. and wait for a re-send with matching sequence number.
  72037. This follows RFC 5961 section 3.2 and addresses CVE-2004-0230
  72038. (RST spoofing attack), which is present in RFC 793 RST handling. */
  72039. tcp_ack_now(pcb);
  72040. 801d2b2: 687b ldr r3, [r7, #4]
  72041. 801d2b4: 8b5b ldrh r3, [r3, #26]
  72042. 801d2b6: f043 0302 orr.w r3, r3, #2
  72043. 801d2ba: b29a uxth r2, r3
  72044. 801d2bc: 687b ldr r3, [r7, #4]
  72045. 801d2be: 835a strh r2, [r3, #26]
  72046. }
  72047. }
  72048. if (acceptable) {
  72049. 801d2c0: 7ffb ldrb r3, [r7, #31]
  72050. 801d2c2: 2b00 cmp r3, #0
  72051. 801d2c4: d01b beq.n 801d2fe <tcp_process+0xca>
  72052. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n"));
  72053. LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED);
  72054. 801d2c6: 687b ldr r3, [r7, #4]
  72055. 801d2c8: 7d1b ldrb r3, [r3, #20]
  72056. 801d2ca: 2b00 cmp r3, #0
  72057. 801d2cc: d106 bne.n 801d2dc <tcp_process+0xa8>
  72058. 801d2ce: 4b7c ldr r3, [pc, #496] @ (801d4c0 <tcp_process+0x28c>)
  72059. 801d2d0: f44f 724e mov.w r2, #824 @ 0x338
  72060. 801d2d4: 4980 ldr r1, [pc, #512] @ (801d4d8 <tcp_process+0x2a4>)
  72061. 801d2d6: 487c ldr r0, [pc, #496] @ (801d4c8 <tcp_process+0x294>)
  72062. 801d2d8: f00c fb78 bl 80299cc <iprintf>
  72063. recv_flags |= TF_RESET;
  72064. 801d2dc: 4b7f ldr r3, [pc, #508] @ (801d4dc <tcp_process+0x2a8>)
  72065. 801d2de: 781b ldrb r3, [r3, #0]
  72066. 801d2e0: f043 0308 orr.w r3, r3, #8
  72067. 801d2e4: b2da uxtb r2, r3
  72068. 801d2e6: 4b7d ldr r3, [pc, #500] @ (801d4dc <tcp_process+0x2a8>)
  72069. 801d2e8: 701a strb r2, [r3, #0]
  72070. tcp_clear_flags(pcb, TF_ACK_DELAY);
  72071. 801d2ea: 687b ldr r3, [r7, #4]
  72072. 801d2ec: 8b5b ldrh r3, [r3, #26]
  72073. 801d2ee: f023 0301 bic.w r3, r3, #1
  72074. 801d2f2: b29a uxth r2, r3
  72075. 801d2f4: 687b ldr r3, [r7, #4]
  72076. 801d2f6: 835a strh r2, [r3, #26]
  72077. return ERR_RST;
  72078. 801d2f8: f06f 030d mvn.w r3, #13
  72079. 801d2fc: e37a b.n 801d9f4 <tcp_process+0x7c0>
  72080. } else {
  72081. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n",
  72082. seqno, pcb->rcv_nxt));
  72083. LWIP_DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n",
  72084. seqno, pcb->rcv_nxt));
  72085. return ERR_OK;
  72086. 801d2fe: 2300 movs r3, #0
  72087. 801d300: e378 b.n 801d9f4 <tcp_process+0x7c0>
  72088. }
  72089. }
  72090. if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) {
  72091. 801d302: 4b72 ldr r3, [pc, #456] @ (801d4cc <tcp_process+0x298>)
  72092. 801d304: 781b ldrb r3, [r3, #0]
  72093. 801d306: f003 0302 and.w r3, r3, #2
  72094. 801d30a: 2b00 cmp r3, #0
  72095. 801d30c: d010 beq.n 801d330 <tcp_process+0xfc>
  72096. 801d30e: 687b ldr r3, [r7, #4]
  72097. 801d310: 7d1b ldrb r3, [r3, #20]
  72098. 801d312: 2b02 cmp r3, #2
  72099. 801d314: d00c beq.n 801d330 <tcp_process+0xfc>
  72100. 801d316: 687b ldr r3, [r7, #4]
  72101. 801d318: 7d1b ldrb r3, [r3, #20]
  72102. 801d31a: 2b03 cmp r3, #3
  72103. 801d31c: d008 beq.n 801d330 <tcp_process+0xfc>
  72104. /* Cope with new connection attempt after remote end crashed */
  72105. tcp_ack_now(pcb);
  72106. 801d31e: 687b ldr r3, [r7, #4]
  72107. 801d320: 8b5b ldrh r3, [r3, #26]
  72108. 801d322: f043 0302 orr.w r3, r3, #2
  72109. 801d326: b29a uxth r2, r3
  72110. 801d328: 687b ldr r3, [r7, #4]
  72111. 801d32a: 835a strh r2, [r3, #26]
  72112. return ERR_OK;
  72113. 801d32c: 2300 movs r3, #0
  72114. 801d32e: e361 b.n 801d9f4 <tcp_process+0x7c0>
  72115. }
  72116. if ((pcb->flags & TF_RXCLOSED) == 0) {
  72117. 801d330: 687b ldr r3, [r7, #4]
  72118. 801d332: 8b5b ldrh r3, [r3, #26]
  72119. 801d334: f003 0310 and.w r3, r3, #16
  72120. 801d338: 2b00 cmp r3, #0
  72121. 801d33a: d103 bne.n 801d344 <tcp_process+0x110>
  72122. /* Update the PCB (in)activity timer unless rx is closed (see tcp_shutdown) */
  72123. pcb->tmr = tcp_ticks;
  72124. 801d33c: 4b68 ldr r3, [pc, #416] @ (801d4e0 <tcp_process+0x2ac>)
  72125. 801d33e: 681a ldr r2, [r3, #0]
  72126. 801d340: 687b ldr r3, [r7, #4]
  72127. 801d342: 621a str r2, [r3, #32]
  72128. }
  72129. pcb->keep_cnt_sent = 0;
  72130. 801d344: 687b ldr r3, [r7, #4]
  72131. 801d346: 2200 movs r2, #0
  72132. 801d348: f883 209b strb.w r2, [r3, #155] @ 0x9b
  72133. pcb->persist_probe = 0;
  72134. 801d34c: 687b ldr r3, [r7, #4]
  72135. 801d34e: 2200 movs r2, #0
  72136. 801d350: f883 209a strb.w r2, [r3, #154] @ 0x9a
  72137. tcp_parseopt(pcb);
  72138. 801d354: 6878 ldr r0, [r7, #4]
  72139. 801d356: f001 fc2b bl 801ebb0 <tcp_parseopt>
  72140. /* Do different things depending on the TCP state. */
  72141. switch (pcb->state) {
  72142. 801d35a: 687b ldr r3, [r7, #4]
  72143. 801d35c: 7d1b ldrb r3, [r3, #20]
  72144. 801d35e: 3b02 subs r3, #2
  72145. 801d360: 2b07 cmp r3, #7
  72146. 801d362: f200 8337 bhi.w 801d9d4 <tcp_process+0x7a0>
  72147. 801d366: a201 add r2, pc, #4 @ (adr r2, 801d36c <tcp_process+0x138>)
  72148. 801d368: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  72149. 801d36c: 0801d38d .word 0x0801d38d
  72150. 801d370: 0801d5bd .word 0x0801d5bd
  72151. 801d374: 0801d735 .word 0x0801d735
  72152. 801d378: 0801d75f .word 0x0801d75f
  72153. 801d37c: 0801d883 .word 0x0801d883
  72154. 801d380: 0801d735 .word 0x0801d735
  72155. 801d384: 0801d90f .word 0x0801d90f
  72156. 801d388: 0801d99f .word 0x0801d99f
  72157. case SYN_SENT:
  72158. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
  72159. pcb->snd_nxt, lwip_ntohl(pcb->unacked->tcphdr->seqno)));
  72160. /* received SYN ACK with expected sequence number? */
  72161. if ((flags & TCP_ACK) && (flags & TCP_SYN)
  72162. 801d38c: 4b4f ldr r3, [pc, #316] @ (801d4cc <tcp_process+0x298>)
  72163. 801d38e: 781b ldrb r3, [r3, #0]
  72164. 801d390: f003 0310 and.w r3, r3, #16
  72165. 801d394: 2b00 cmp r3, #0
  72166. 801d396: f000 80e4 beq.w 801d562 <tcp_process+0x32e>
  72167. 801d39a: 4b4c ldr r3, [pc, #304] @ (801d4cc <tcp_process+0x298>)
  72168. 801d39c: 781b ldrb r3, [r3, #0]
  72169. 801d39e: f003 0302 and.w r3, r3, #2
  72170. 801d3a2: 2b00 cmp r3, #0
  72171. 801d3a4: f000 80dd beq.w 801d562 <tcp_process+0x32e>
  72172. && (ackno == pcb->lastack + 1)) {
  72173. 801d3a8: 687b ldr r3, [r7, #4]
  72174. 801d3aa: 6c5b ldr r3, [r3, #68] @ 0x44
  72175. 801d3ac: 1c5a adds r2, r3, #1
  72176. 801d3ae: 4b48 ldr r3, [pc, #288] @ (801d4d0 <tcp_process+0x29c>)
  72177. 801d3b0: 681b ldr r3, [r3, #0]
  72178. 801d3b2: 429a cmp r2, r3
  72179. 801d3b4: f040 80d5 bne.w 801d562 <tcp_process+0x32e>
  72180. pcb->rcv_nxt = seqno + 1;
  72181. 801d3b8: 4b46 ldr r3, [pc, #280] @ (801d4d4 <tcp_process+0x2a0>)
  72182. 801d3ba: 681b ldr r3, [r3, #0]
  72183. 801d3bc: 1c5a adds r2, r3, #1
  72184. 801d3be: 687b ldr r3, [r7, #4]
  72185. 801d3c0: 625a str r2, [r3, #36] @ 0x24
  72186. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  72187. 801d3c2: 687b ldr r3, [r7, #4]
  72188. 801d3c4: 6a5a ldr r2, [r3, #36] @ 0x24
  72189. 801d3c6: 687b ldr r3, [r7, #4]
  72190. 801d3c8: 62da str r2, [r3, #44] @ 0x2c
  72191. pcb->lastack = ackno;
  72192. 801d3ca: 4b41 ldr r3, [pc, #260] @ (801d4d0 <tcp_process+0x29c>)
  72193. 801d3cc: 681a ldr r2, [r3, #0]
  72194. 801d3ce: 687b ldr r3, [r7, #4]
  72195. 801d3d0: 645a str r2, [r3, #68] @ 0x44
  72196. pcb->snd_wnd = tcphdr->wnd;
  72197. 801d3d2: 4b44 ldr r3, [pc, #272] @ (801d4e4 <tcp_process+0x2b0>)
  72198. 801d3d4: 681b ldr r3, [r3, #0]
  72199. 801d3d6: 89db ldrh r3, [r3, #14]
  72200. 801d3d8: b29a uxth r2, r3
  72201. 801d3da: 687b ldr r3, [r7, #4]
  72202. 801d3dc: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  72203. pcb->snd_wnd_max = pcb->snd_wnd;
  72204. 801d3e0: 687b ldr r3, [r7, #4]
  72205. 801d3e2: f8b3 2060 ldrh.w r2, [r3, #96] @ 0x60
  72206. 801d3e6: 687b ldr r3, [r7, #4]
  72207. 801d3e8: f8a3 2062 strh.w r2, [r3, #98] @ 0x62
  72208. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  72209. 801d3ec: 4b39 ldr r3, [pc, #228] @ (801d4d4 <tcp_process+0x2a0>)
  72210. 801d3ee: 681b ldr r3, [r3, #0]
  72211. 801d3f0: 1e5a subs r2, r3, #1
  72212. 801d3f2: 687b ldr r3, [r7, #4]
  72213. 801d3f4: 655a str r2, [r3, #84] @ 0x54
  72214. pcb->state = ESTABLISHED;
  72215. 801d3f6: 687b ldr r3, [r7, #4]
  72216. 801d3f8: 2204 movs r2, #4
  72217. 801d3fa: 751a strb r2, [r3, #20]
  72218. #if TCP_CALCULATE_EFF_SEND_MSS
  72219. pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip);
  72220. 801d3fc: 687b ldr r3, [r7, #4]
  72221. 801d3fe: 8e5c ldrh r4, [r3, #50] @ 0x32
  72222. 801d400: 687b ldr r3, [r7, #4]
  72223. 801d402: 3304 adds r3, #4
  72224. 801d404: 4618 mov r0, r3
  72225. 801d406: f007 fad3 bl 80249b0 <ip4_route>
  72226. 801d40a: 4601 mov r1, r0
  72227. 801d40c: 687b ldr r3, [r7, #4]
  72228. 801d40e: 3304 adds r3, #4
  72229. 801d410: 461a mov r2, r3
  72230. 801d412: 4620 mov r0, r4
  72231. 801d414: f7ff f88a bl 801c52c <tcp_eff_send_mss_netif>
  72232. 801d418: 4603 mov r3, r0
  72233. 801d41a: 461a mov r2, r3
  72234. 801d41c: 687b ldr r3, [r7, #4]
  72235. 801d41e: 865a strh r2, [r3, #50] @ 0x32
  72236. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  72237. pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);
  72238. 801d420: 687b ldr r3, [r7, #4]
  72239. 801d422: 8e5b ldrh r3, [r3, #50] @ 0x32
  72240. 801d424: 009a lsls r2, r3, #2
  72241. 801d426: 687b ldr r3, [r7, #4]
  72242. 801d428: 8e5b ldrh r3, [r3, #50] @ 0x32
  72243. 801d42a: 005b lsls r3, r3, #1
  72244. 801d42c: f241 111c movw r1, #4380 @ 0x111c
  72245. 801d430: 428b cmp r3, r1
  72246. 801d432: bf38 it cc
  72247. 801d434: 460b movcc r3, r1
  72248. 801d436: 429a cmp r2, r3
  72249. 801d438: d204 bcs.n 801d444 <tcp_process+0x210>
  72250. 801d43a: 687b ldr r3, [r7, #4]
  72251. 801d43c: 8e5b ldrh r3, [r3, #50] @ 0x32
  72252. 801d43e: 009b lsls r3, r3, #2
  72253. 801d440: b29b uxth r3, r3
  72254. 801d442: e00d b.n 801d460 <tcp_process+0x22c>
  72255. 801d444: 687b ldr r3, [r7, #4]
  72256. 801d446: 8e5b ldrh r3, [r3, #50] @ 0x32
  72257. 801d448: 005b lsls r3, r3, #1
  72258. 801d44a: f241 121c movw r2, #4380 @ 0x111c
  72259. 801d44e: 4293 cmp r3, r2
  72260. 801d450: d904 bls.n 801d45c <tcp_process+0x228>
  72261. 801d452: 687b ldr r3, [r7, #4]
  72262. 801d454: 8e5b ldrh r3, [r3, #50] @ 0x32
  72263. 801d456: 005b lsls r3, r3, #1
  72264. 801d458: b29b uxth r3, r3
  72265. 801d45a: e001 b.n 801d460 <tcp_process+0x22c>
  72266. 801d45c: f241 131c movw r3, #4380 @ 0x111c
  72267. 801d460: 687a ldr r2, [r7, #4]
  72268. 801d462: f8a2 3048 strh.w r3, [r2, #72] @ 0x48
  72269. LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SENT): cwnd %"TCPWNDSIZE_F
  72270. " ssthresh %"TCPWNDSIZE_F"\n",
  72271. pcb->cwnd, pcb->ssthresh));
  72272. LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
  72273. 801d466: 687b ldr r3, [r7, #4]
  72274. 801d468: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  72275. 801d46c: 2b00 cmp r3, #0
  72276. 801d46e: d106 bne.n 801d47e <tcp_process+0x24a>
  72277. 801d470: 4b13 ldr r3, [pc, #76] @ (801d4c0 <tcp_process+0x28c>)
  72278. 801d472: f44f 725b mov.w r2, #876 @ 0x36c
  72279. 801d476: 491c ldr r1, [pc, #112] @ (801d4e8 <tcp_process+0x2b4>)
  72280. 801d478: 4813 ldr r0, [pc, #76] @ (801d4c8 <tcp_process+0x294>)
  72281. 801d47a: f00c faa7 bl 80299cc <iprintf>
  72282. --pcb->snd_queuelen;
  72283. 801d47e: 687b ldr r3, [r7, #4]
  72284. 801d480: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  72285. 801d484: 3b01 subs r3, #1
  72286. 801d486: b29a uxth r2, r3
  72287. 801d488: 687b ldr r3, [r7, #4]
  72288. 801d48a: f8a3 2066 strh.w r2, [r3, #102] @ 0x66
  72289. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"TCPWNDSIZE_F"\n", (tcpwnd_size_t)pcb->snd_queuelen));
  72290. rseg = pcb->unacked;
  72291. 801d48e: 687b ldr r3, [r7, #4]
  72292. 801d490: 6f1b ldr r3, [r3, #112] @ 0x70
  72293. 801d492: 617b str r3, [r7, #20]
  72294. if (rseg == NULL) {
  72295. 801d494: 697b ldr r3, [r7, #20]
  72296. 801d496: 2b00 cmp r3, #0
  72297. 801d498: d12a bne.n 801d4f0 <tcp_process+0x2bc>
  72298. /* might happen if tcp_output fails in tcp_rexmit_rto()
  72299. in which case the segment is on the unsent list */
  72300. rseg = pcb->unsent;
  72301. 801d49a: 687b ldr r3, [r7, #4]
  72302. 801d49c: 6edb ldr r3, [r3, #108] @ 0x6c
  72303. 801d49e: 617b str r3, [r7, #20]
  72304. LWIP_ASSERT("no segment to free", rseg != NULL);
  72305. 801d4a0: 697b ldr r3, [r7, #20]
  72306. 801d4a2: 2b00 cmp r3, #0
  72307. 801d4a4: d106 bne.n 801d4b4 <tcp_process+0x280>
  72308. 801d4a6: 4b06 ldr r3, [pc, #24] @ (801d4c0 <tcp_process+0x28c>)
  72309. 801d4a8: f44f 725d mov.w r2, #884 @ 0x374
  72310. 801d4ac: 490f ldr r1, [pc, #60] @ (801d4ec <tcp_process+0x2b8>)
  72311. 801d4ae: 4806 ldr r0, [pc, #24] @ (801d4c8 <tcp_process+0x294>)
  72312. 801d4b0: f00c fa8c bl 80299cc <iprintf>
  72313. pcb->unsent = rseg->next;
  72314. 801d4b4: 697b ldr r3, [r7, #20]
  72315. 801d4b6: 681a ldr r2, [r3, #0]
  72316. 801d4b8: 687b ldr r3, [r7, #4]
  72317. 801d4ba: 66da str r2, [r3, #108] @ 0x6c
  72318. 801d4bc: e01c b.n 801d4f8 <tcp_process+0x2c4>
  72319. 801d4be: bf00 nop
  72320. 801d4c0: 0802ed10 .word 0x0802ed10
  72321. 801d4c4: 0802ef48 .word 0x0802ef48
  72322. 801d4c8: 0802ed5c .word 0x0802ed5c
  72323. 801d4cc: 2402aed0 .word 0x2402aed0
  72324. 801d4d0: 2402aec8 .word 0x2402aec8
  72325. 801d4d4: 2402aec4 .word 0x2402aec4
  72326. 801d4d8: 0802ef64 .word 0x0802ef64
  72327. 801d4dc: 2402aed1 .word 0x2402aed1
  72328. 801d4e0: 2402ae88 .word 0x2402ae88
  72329. 801d4e4: 2402aeb4 .word 0x2402aeb4
  72330. 801d4e8: 0802ef84 .word 0x0802ef84
  72331. 801d4ec: 0802ef9c .word 0x0802ef9c
  72332. } else {
  72333. pcb->unacked = rseg->next;
  72334. 801d4f0: 697b ldr r3, [r7, #20]
  72335. 801d4f2: 681a ldr r2, [r3, #0]
  72336. 801d4f4: 687b ldr r3, [r7, #4]
  72337. 801d4f6: 671a str r2, [r3, #112] @ 0x70
  72338. }
  72339. tcp_seg_free(rseg);
  72340. 801d4f8: 6978 ldr r0, [r7, #20]
  72341. 801d4fa: f7fe fc48 bl 801bd8e <tcp_seg_free>
  72342. /* If there's nothing left to acknowledge, stop the retransmit
  72343. timer, otherwise reset it to start again */
  72344. if (pcb->unacked == NULL) {
  72345. 801d4fe: 687b ldr r3, [r7, #4]
  72346. 801d500: 6f1b ldr r3, [r3, #112] @ 0x70
  72347. 801d502: 2b00 cmp r3, #0
  72348. 801d504: d104 bne.n 801d510 <tcp_process+0x2dc>
  72349. pcb->rtime = -1;
  72350. 801d506: 687b ldr r3, [r7, #4]
  72351. 801d508: f64f 72ff movw r2, #65535 @ 0xffff
  72352. 801d50c: 861a strh r2, [r3, #48] @ 0x30
  72353. 801d50e: e006 b.n 801d51e <tcp_process+0x2ea>
  72354. } else {
  72355. pcb->rtime = 0;
  72356. 801d510: 687b ldr r3, [r7, #4]
  72357. 801d512: 2200 movs r2, #0
  72358. 801d514: 861a strh r2, [r3, #48] @ 0x30
  72359. pcb->nrtx = 0;
  72360. 801d516: 687b ldr r3, [r7, #4]
  72361. 801d518: 2200 movs r2, #0
  72362. 801d51a: f883 2042 strb.w r2, [r3, #66] @ 0x42
  72363. }
  72364. /* Call the user specified function to call when successfully
  72365. * connected. */
  72366. TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
  72367. 801d51e: 687b ldr r3, [r7, #4]
  72368. 801d520: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  72369. 801d524: 2b00 cmp r3, #0
  72370. 801d526: d00a beq.n 801d53e <tcp_process+0x30a>
  72371. 801d528: 687b ldr r3, [r7, #4]
  72372. 801d52a: f8d3 3088 ldr.w r3, [r3, #136] @ 0x88
  72373. 801d52e: 687a ldr r2, [r7, #4]
  72374. 801d530: 6910 ldr r0, [r2, #16]
  72375. 801d532: 2200 movs r2, #0
  72376. 801d534: 6879 ldr r1, [r7, #4]
  72377. 801d536: 4798 blx r3
  72378. 801d538: 4603 mov r3, r0
  72379. 801d53a: 77bb strb r3, [r7, #30]
  72380. 801d53c: e001 b.n 801d542 <tcp_process+0x30e>
  72381. 801d53e: 2300 movs r3, #0
  72382. 801d540: 77bb strb r3, [r7, #30]
  72383. if (err == ERR_ABRT) {
  72384. 801d542: f997 301e ldrsb.w r3, [r7, #30]
  72385. 801d546: f113 0f0d cmn.w r3, #13
  72386. 801d54a: d102 bne.n 801d552 <tcp_process+0x31e>
  72387. return ERR_ABRT;
  72388. 801d54c: f06f 030c mvn.w r3, #12
  72389. 801d550: e250 b.n 801d9f4 <tcp_process+0x7c0>
  72390. }
  72391. tcp_ack_now(pcb);
  72392. 801d552: 687b ldr r3, [r7, #4]
  72393. 801d554: 8b5b ldrh r3, [r3, #26]
  72394. 801d556: f043 0302 orr.w r3, r3, #2
  72395. 801d55a: b29a uxth r2, r3
  72396. 801d55c: 687b ldr r3, [r7, #4]
  72397. 801d55e: 835a strh r2, [r3, #26]
  72398. if (pcb->nrtx < TCP_SYNMAXRTX) {
  72399. pcb->rtime = 0;
  72400. tcp_rexmit_rto(pcb);
  72401. }
  72402. }
  72403. break;
  72404. 801d560: e23a b.n 801d9d8 <tcp_process+0x7a4>
  72405. else if (flags & TCP_ACK) {
  72406. 801d562: 4b98 ldr r3, [pc, #608] @ (801d7c4 <tcp_process+0x590>)
  72407. 801d564: 781b ldrb r3, [r3, #0]
  72408. 801d566: f003 0310 and.w r3, r3, #16
  72409. 801d56a: 2b00 cmp r3, #0
  72410. 801d56c: f000 8234 beq.w 801d9d8 <tcp_process+0x7a4>
  72411. tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  72412. 801d570: 4b95 ldr r3, [pc, #596] @ (801d7c8 <tcp_process+0x594>)
  72413. 801d572: 6819 ldr r1, [r3, #0]
  72414. 801d574: 4b95 ldr r3, [pc, #596] @ (801d7cc <tcp_process+0x598>)
  72415. 801d576: 881b ldrh r3, [r3, #0]
  72416. 801d578: 461a mov r2, r3
  72417. 801d57a: 4b95 ldr r3, [pc, #596] @ (801d7d0 <tcp_process+0x59c>)
  72418. 801d57c: 681b ldr r3, [r3, #0]
  72419. 801d57e: 18d0 adds r0, r2, r3
  72420. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  72421. 801d580: 4b94 ldr r3, [pc, #592] @ (801d7d4 <tcp_process+0x5a0>)
  72422. 801d582: 681b ldr r3, [r3, #0]
  72423. tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  72424. 801d584: 885b ldrh r3, [r3, #2]
  72425. 801d586: b29b uxth r3, r3
  72426. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  72427. 801d588: 4a92 ldr r2, [pc, #584] @ (801d7d4 <tcp_process+0x5a0>)
  72428. 801d58a: 6812 ldr r2, [r2, #0]
  72429. tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  72430. 801d58c: 8812 ldrh r2, [r2, #0]
  72431. 801d58e: b292 uxth r2, r2
  72432. 801d590: 9202 str r2, [sp, #8]
  72433. 801d592: 9301 str r3, [sp, #4]
  72434. 801d594: 4b90 ldr r3, [pc, #576] @ (801d7d8 <tcp_process+0x5a4>)
  72435. 801d596: 9300 str r3, [sp, #0]
  72436. 801d598: 4b90 ldr r3, [pc, #576] @ (801d7dc <tcp_process+0x5a8>)
  72437. 801d59a: 4602 mov r2, r0
  72438. 801d59c: 6878 ldr r0, [r7, #4]
  72439. 801d59e: f003 f94b bl 8020838 <tcp_rst>
  72440. if (pcb->nrtx < TCP_SYNMAXRTX) {
  72441. 801d5a2: 687b ldr r3, [r7, #4]
  72442. 801d5a4: f893 3042 ldrb.w r3, [r3, #66] @ 0x42
  72443. 801d5a8: 2b05 cmp r3, #5
  72444. 801d5aa: f200 8215 bhi.w 801d9d8 <tcp_process+0x7a4>
  72445. pcb->rtime = 0;
  72446. 801d5ae: 687b ldr r3, [r7, #4]
  72447. 801d5b0: 2200 movs r2, #0
  72448. 801d5b2: 861a strh r2, [r3, #48] @ 0x30
  72449. tcp_rexmit_rto(pcb);
  72450. 801d5b4: 6878 ldr r0, [r7, #4]
  72451. 801d5b6: f002 ff17 bl 80203e8 <tcp_rexmit_rto>
  72452. break;
  72453. 801d5ba: e20d b.n 801d9d8 <tcp_process+0x7a4>
  72454. case SYN_RCVD:
  72455. if (flags & TCP_ACK) {
  72456. 801d5bc: 4b81 ldr r3, [pc, #516] @ (801d7c4 <tcp_process+0x590>)
  72457. 801d5be: 781b ldrb r3, [r3, #0]
  72458. 801d5c0: f003 0310 and.w r3, r3, #16
  72459. 801d5c4: 2b00 cmp r3, #0
  72460. 801d5c6: f000 80a1 beq.w 801d70c <tcp_process+0x4d8>
  72461. /* expected ACK number? */
  72462. if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
  72463. 801d5ca: 4b7f ldr r3, [pc, #508] @ (801d7c8 <tcp_process+0x594>)
  72464. 801d5cc: 681a ldr r2, [r3, #0]
  72465. 801d5ce: 687b ldr r3, [r7, #4]
  72466. 801d5d0: 6c5b ldr r3, [r3, #68] @ 0x44
  72467. 801d5d2: 1ad3 subs r3, r2, r3
  72468. 801d5d4: 3b01 subs r3, #1
  72469. 801d5d6: 2b00 cmp r3, #0
  72470. 801d5d8: db7e blt.n 801d6d8 <tcp_process+0x4a4>
  72471. 801d5da: 4b7b ldr r3, [pc, #492] @ (801d7c8 <tcp_process+0x594>)
  72472. 801d5dc: 681a ldr r2, [r3, #0]
  72473. 801d5de: 687b ldr r3, [r7, #4]
  72474. 801d5e0: 6d1b ldr r3, [r3, #80] @ 0x50
  72475. 801d5e2: 1ad3 subs r3, r2, r3
  72476. 801d5e4: 2b00 cmp r3, #0
  72477. 801d5e6: dc77 bgt.n 801d6d8 <tcp_process+0x4a4>
  72478. pcb->state = ESTABLISHED;
  72479. 801d5e8: 687b ldr r3, [r7, #4]
  72480. 801d5ea: 2204 movs r2, #4
  72481. 801d5ec: 751a strb r2, [r3, #20]
  72482. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  72483. #if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
  72484. if (pcb->listener == NULL) {
  72485. 801d5ee: 687b ldr r3, [r7, #4]
  72486. 801d5f0: 6fdb ldr r3, [r3, #124] @ 0x7c
  72487. 801d5f2: 2b00 cmp r3, #0
  72488. 801d5f4: d102 bne.n 801d5fc <tcp_process+0x3c8>
  72489. /* listen pcb might be closed by now */
  72490. err = ERR_VAL;
  72491. 801d5f6: 23fa movs r3, #250 @ 0xfa
  72492. 801d5f8: 77bb strb r3, [r7, #30]
  72493. 801d5fa: e01d b.n 801d638 <tcp_process+0x404>
  72494. } else
  72495. #endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */
  72496. {
  72497. #if LWIP_CALLBACK_API
  72498. LWIP_ASSERT("pcb->listener->accept != NULL", pcb->listener->accept != NULL);
  72499. 801d5fc: 687b ldr r3, [r7, #4]
  72500. 801d5fe: 6fdb ldr r3, [r3, #124] @ 0x7c
  72501. 801d600: 699b ldr r3, [r3, #24]
  72502. 801d602: 2b00 cmp r3, #0
  72503. 801d604: d106 bne.n 801d614 <tcp_process+0x3e0>
  72504. 801d606: 4b76 ldr r3, [pc, #472] @ (801d7e0 <tcp_process+0x5ac>)
  72505. 801d608: f44f 726a mov.w r2, #936 @ 0x3a8
  72506. 801d60c: 4975 ldr r1, [pc, #468] @ (801d7e4 <tcp_process+0x5b0>)
  72507. 801d60e: 4876 ldr r0, [pc, #472] @ (801d7e8 <tcp_process+0x5b4>)
  72508. 801d610: f00c f9dc bl 80299cc <iprintf>
  72509. #endif
  72510. tcp_backlog_accepted(pcb);
  72511. /* Call the accept function. */
  72512. TCP_EVENT_ACCEPT(pcb->listener, pcb, pcb->callback_arg, ERR_OK, err);
  72513. 801d614: 687b ldr r3, [r7, #4]
  72514. 801d616: 6fdb ldr r3, [r3, #124] @ 0x7c
  72515. 801d618: 699b ldr r3, [r3, #24]
  72516. 801d61a: 2b00 cmp r3, #0
  72517. 801d61c: d00a beq.n 801d634 <tcp_process+0x400>
  72518. 801d61e: 687b ldr r3, [r7, #4]
  72519. 801d620: 6fdb ldr r3, [r3, #124] @ 0x7c
  72520. 801d622: 699b ldr r3, [r3, #24]
  72521. 801d624: 687a ldr r2, [r7, #4]
  72522. 801d626: 6910 ldr r0, [r2, #16]
  72523. 801d628: 2200 movs r2, #0
  72524. 801d62a: 6879 ldr r1, [r7, #4]
  72525. 801d62c: 4798 blx r3
  72526. 801d62e: 4603 mov r3, r0
  72527. 801d630: 77bb strb r3, [r7, #30]
  72528. 801d632: e001 b.n 801d638 <tcp_process+0x404>
  72529. 801d634: 23f0 movs r3, #240 @ 0xf0
  72530. 801d636: 77bb strb r3, [r7, #30]
  72531. }
  72532. if (err != ERR_OK) {
  72533. 801d638: f997 301e ldrsb.w r3, [r7, #30]
  72534. 801d63c: 2b00 cmp r3, #0
  72535. 801d63e: d00a beq.n 801d656 <tcp_process+0x422>
  72536. /* If the accept function returns with an error, we abort
  72537. * the connection. */
  72538. /* Already aborted? */
  72539. if (err != ERR_ABRT) {
  72540. 801d640: f997 301e ldrsb.w r3, [r7, #30]
  72541. 801d644: f113 0f0d cmn.w r3, #13
  72542. 801d648: d002 beq.n 801d650 <tcp_process+0x41c>
  72543. tcp_abort(pcb);
  72544. 801d64a: 6878 ldr r0, [r7, #4]
  72545. 801d64c: f7fd fd4c bl 801b0e8 <tcp_abort>
  72546. }
  72547. return ERR_ABRT;
  72548. 801d650: f06f 030c mvn.w r3, #12
  72549. 801d654: e1ce b.n 801d9f4 <tcp_process+0x7c0>
  72550. }
  72551. /* If there was any data contained within this ACK,
  72552. * we'd better pass it on to the application as well. */
  72553. tcp_receive(pcb);
  72554. 801d656: 6878 ldr r0, [r7, #4]
  72555. 801d658: f000 fae0 bl 801dc1c <tcp_receive>
  72556. /* Prevent ACK for SYN to generate a sent event */
  72557. if (recv_acked != 0) {
  72558. 801d65c: 4b63 ldr r3, [pc, #396] @ (801d7ec <tcp_process+0x5b8>)
  72559. 801d65e: 881b ldrh r3, [r3, #0]
  72560. 801d660: 2b00 cmp r3, #0
  72561. 801d662: d005 beq.n 801d670 <tcp_process+0x43c>
  72562. recv_acked--;
  72563. 801d664: 4b61 ldr r3, [pc, #388] @ (801d7ec <tcp_process+0x5b8>)
  72564. 801d666: 881b ldrh r3, [r3, #0]
  72565. 801d668: 3b01 subs r3, #1
  72566. 801d66a: b29a uxth r2, r3
  72567. 801d66c: 4b5f ldr r3, [pc, #380] @ (801d7ec <tcp_process+0x5b8>)
  72568. 801d66e: 801a strh r2, [r3, #0]
  72569. }
  72570. pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);
  72571. 801d670: 687b ldr r3, [r7, #4]
  72572. 801d672: 8e5b ldrh r3, [r3, #50] @ 0x32
  72573. 801d674: 009a lsls r2, r3, #2
  72574. 801d676: 687b ldr r3, [r7, #4]
  72575. 801d678: 8e5b ldrh r3, [r3, #50] @ 0x32
  72576. 801d67a: 005b lsls r3, r3, #1
  72577. 801d67c: f241 111c movw r1, #4380 @ 0x111c
  72578. 801d680: 428b cmp r3, r1
  72579. 801d682: bf38 it cc
  72580. 801d684: 460b movcc r3, r1
  72581. 801d686: 429a cmp r2, r3
  72582. 801d688: d204 bcs.n 801d694 <tcp_process+0x460>
  72583. 801d68a: 687b ldr r3, [r7, #4]
  72584. 801d68c: 8e5b ldrh r3, [r3, #50] @ 0x32
  72585. 801d68e: 009b lsls r3, r3, #2
  72586. 801d690: b29b uxth r3, r3
  72587. 801d692: e00d b.n 801d6b0 <tcp_process+0x47c>
  72588. 801d694: 687b ldr r3, [r7, #4]
  72589. 801d696: 8e5b ldrh r3, [r3, #50] @ 0x32
  72590. 801d698: 005b lsls r3, r3, #1
  72591. 801d69a: f241 121c movw r2, #4380 @ 0x111c
  72592. 801d69e: 4293 cmp r3, r2
  72593. 801d6a0: d904 bls.n 801d6ac <tcp_process+0x478>
  72594. 801d6a2: 687b ldr r3, [r7, #4]
  72595. 801d6a4: 8e5b ldrh r3, [r3, #50] @ 0x32
  72596. 801d6a6: 005b lsls r3, r3, #1
  72597. 801d6a8: b29b uxth r3, r3
  72598. 801d6aa: e001 b.n 801d6b0 <tcp_process+0x47c>
  72599. 801d6ac: f241 131c movw r3, #4380 @ 0x111c
  72600. 801d6b0: 687a ldr r2, [r7, #4]
  72601. 801d6b2: f8a2 3048 strh.w r3, [r2, #72] @ 0x48
  72602. LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SYN_RCVD): cwnd %"TCPWNDSIZE_F
  72603. " ssthresh %"TCPWNDSIZE_F"\n",
  72604. pcb->cwnd, pcb->ssthresh));
  72605. if (recv_flags & TF_GOT_FIN) {
  72606. 801d6b6: 4b4e ldr r3, [pc, #312] @ (801d7f0 <tcp_process+0x5bc>)
  72607. 801d6b8: 781b ldrb r3, [r3, #0]
  72608. 801d6ba: f003 0320 and.w r3, r3, #32
  72609. 801d6be: 2b00 cmp r3, #0
  72610. 801d6c0: d037 beq.n 801d732 <tcp_process+0x4fe>
  72611. tcp_ack_now(pcb);
  72612. 801d6c2: 687b ldr r3, [r7, #4]
  72613. 801d6c4: 8b5b ldrh r3, [r3, #26]
  72614. 801d6c6: f043 0302 orr.w r3, r3, #2
  72615. 801d6ca: b29a uxth r2, r3
  72616. 801d6cc: 687b ldr r3, [r7, #4]
  72617. 801d6ce: 835a strh r2, [r3, #26]
  72618. pcb->state = CLOSE_WAIT;
  72619. 801d6d0: 687b ldr r3, [r7, #4]
  72620. 801d6d2: 2207 movs r2, #7
  72621. 801d6d4: 751a strb r2, [r3, #20]
  72622. if (recv_flags & TF_GOT_FIN) {
  72623. 801d6d6: e02c b.n 801d732 <tcp_process+0x4fe>
  72624. }
  72625. } else {
  72626. /* incorrect ACK number, send RST */
  72627. tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  72628. 801d6d8: 4b3b ldr r3, [pc, #236] @ (801d7c8 <tcp_process+0x594>)
  72629. 801d6da: 6819 ldr r1, [r3, #0]
  72630. 801d6dc: 4b3b ldr r3, [pc, #236] @ (801d7cc <tcp_process+0x598>)
  72631. 801d6de: 881b ldrh r3, [r3, #0]
  72632. 801d6e0: 461a mov r2, r3
  72633. 801d6e2: 4b3b ldr r3, [pc, #236] @ (801d7d0 <tcp_process+0x59c>)
  72634. 801d6e4: 681b ldr r3, [r3, #0]
  72635. 801d6e6: 18d0 adds r0, r2, r3
  72636. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  72637. 801d6e8: 4b3a ldr r3, [pc, #232] @ (801d7d4 <tcp_process+0x5a0>)
  72638. 801d6ea: 681b ldr r3, [r3, #0]
  72639. tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  72640. 801d6ec: 885b ldrh r3, [r3, #2]
  72641. 801d6ee: b29b uxth r3, r3
  72642. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  72643. 801d6f0: 4a38 ldr r2, [pc, #224] @ (801d7d4 <tcp_process+0x5a0>)
  72644. 801d6f2: 6812 ldr r2, [r2, #0]
  72645. tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
  72646. 801d6f4: 8812 ldrh r2, [r2, #0]
  72647. 801d6f6: b292 uxth r2, r2
  72648. 801d6f8: 9202 str r2, [sp, #8]
  72649. 801d6fa: 9301 str r3, [sp, #4]
  72650. 801d6fc: 4b36 ldr r3, [pc, #216] @ (801d7d8 <tcp_process+0x5a4>)
  72651. 801d6fe: 9300 str r3, [sp, #0]
  72652. 801d700: 4b36 ldr r3, [pc, #216] @ (801d7dc <tcp_process+0x5a8>)
  72653. 801d702: 4602 mov r2, r0
  72654. 801d704: 6878 ldr r0, [r7, #4]
  72655. 801d706: f003 f897 bl 8020838 <tcp_rst>
  72656. }
  72657. } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) {
  72658. /* Looks like another copy of the SYN - retransmit our SYN-ACK */
  72659. tcp_rexmit(pcb);
  72660. }
  72661. break;
  72662. 801d70a: e167 b.n 801d9dc <tcp_process+0x7a8>
  72663. } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) {
  72664. 801d70c: 4b2d ldr r3, [pc, #180] @ (801d7c4 <tcp_process+0x590>)
  72665. 801d70e: 781b ldrb r3, [r3, #0]
  72666. 801d710: f003 0302 and.w r3, r3, #2
  72667. 801d714: 2b00 cmp r3, #0
  72668. 801d716: f000 8161 beq.w 801d9dc <tcp_process+0x7a8>
  72669. 801d71a: 687b ldr r3, [r7, #4]
  72670. 801d71c: 6a5b ldr r3, [r3, #36] @ 0x24
  72671. 801d71e: 1e5a subs r2, r3, #1
  72672. 801d720: 4b2b ldr r3, [pc, #172] @ (801d7d0 <tcp_process+0x59c>)
  72673. 801d722: 681b ldr r3, [r3, #0]
  72674. 801d724: 429a cmp r2, r3
  72675. 801d726: f040 8159 bne.w 801d9dc <tcp_process+0x7a8>
  72676. tcp_rexmit(pcb);
  72677. 801d72a: 6878 ldr r0, [r7, #4]
  72678. 801d72c: f002 fe7e bl 802042c <tcp_rexmit>
  72679. break;
  72680. 801d730: e154 b.n 801d9dc <tcp_process+0x7a8>
  72681. 801d732: e153 b.n 801d9dc <tcp_process+0x7a8>
  72682. case CLOSE_WAIT:
  72683. /* FALLTHROUGH */
  72684. case ESTABLISHED:
  72685. tcp_receive(pcb);
  72686. 801d734: 6878 ldr r0, [r7, #4]
  72687. 801d736: f000 fa71 bl 801dc1c <tcp_receive>
  72688. if (recv_flags & TF_GOT_FIN) { /* passive close */
  72689. 801d73a: 4b2d ldr r3, [pc, #180] @ (801d7f0 <tcp_process+0x5bc>)
  72690. 801d73c: 781b ldrb r3, [r3, #0]
  72691. 801d73e: f003 0320 and.w r3, r3, #32
  72692. 801d742: 2b00 cmp r3, #0
  72693. 801d744: f000 814c beq.w 801d9e0 <tcp_process+0x7ac>
  72694. tcp_ack_now(pcb);
  72695. 801d748: 687b ldr r3, [r7, #4]
  72696. 801d74a: 8b5b ldrh r3, [r3, #26]
  72697. 801d74c: f043 0302 orr.w r3, r3, #2
  72698. 801d750: b29a uxth r2, r3
  72699. 801d752: 687b ldr r3, [r7, #4]
  72700. 801d754: 835a strh r2, [r3, #26]
  72701. pcb->state = CLOSE_WAIT;
  72702. 801d756: 687b ldr r3, [r7, #4]
  72703. 801d758: 2207 movs r2, #7
  72704. 801d75a: 751a strb r2, [r3, #20]
  72705. }
  72706. break;
  72707. 801d75c: e140 b.n 801d9e0 <tcp_process+0x7ac>
  72708. case FIN_WAIT_1:
  72709. tcp_receive(pcb);
  72710. 801d75e: 6878 ldr r0, [r7, #4]
  72711. 801d760: f000 fa5c bl 801dc1c <tcp_receive>
  72712. if (recv_flags & TF_GOT_FIN) {
  72713. 801d764: 4b22 ldr r3, [pc, #136] @ (801d7f0 <tcp_process+0x5bc>)
  72714. 801d766: 781b ldrb r3, [r3, #0]
  72715. 801d768: f003 0320 and.w r3, r3, #32
  72716. 801d76c: 2b00 cmp r3, #0
  72717. 801d76e: d071 beq.n 801d854 <tcp_process+0x620>
  72718. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
  72719. 801d770: 4b14 ldr r3, [pc, #80] @ (801d7c4 <tcp_process+0x590>)
  72720. 801d772: 781b ldrb r3, [r3, #0]
  72721. 801d774: f003 0310 and.w r3, r3, #16
  72722. 801d778: 2b00 cmp r3, #0
  72723. 801d77a: d060 beq.n 801d83e <tcp_process+0x60a>
  72724. 801d77c: 687b ldr r3, [r7, #4]
  72725. 801d77e: 6d1a ldr r2, [r3, #80] @ 0x50
  72726. 801d780: 4b11 ldr r3, [pc, #68] @ (801d7c8 <tcp_process+0x594>)
  72727. 801d782: 681b ldr r3, [r3, #0]
  72728. 801d784: 429a cmp r2, r3
  72729. 801d786: d15a bne.n 801d83e <tcp_process+0x60a>
  72730. pcb->unsent == NULL) {
  72731. 801d788: 687b ldr r3, [r7, #4]
  72732. 801d78a: 6edb ldr r3, [r3, #108] @ 0x6c
  72733. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
  72734. 801d78c: 2b00 cmp r3, #0
  72735. 801d78e: d156 bne.n 801d83e <tcp_process+0x60a>
  72736. LWIP_DEBUGF(TCP_DEBUG,
  72737. ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  72738. tcp_ack_now(pcb);
  72739. 801d790: 687b ldr r3, [r7, #4]
  72740. 801d792: 8b5b ldrh r3, [r3, #26]
  72741. 801d794: f043 0302 orr.w r3, r3, #2
  72742. 801d798: b29a uxth r2, r3
  72743. 801d79a: 687b ldr r3, [r7, #4]
  72744. 801d79c: 835a strh r2, [r3, #26]
  72745. tcp_pcb_purge(pcb);
  72746. 801d79e: 6878 ldr r0, [r7, #4]
  72747. 801d7a0: f7fe fdba bl 801c318 <tcp_pcb_purge>
  72748. TCP_RMV_ACTIVE(pcb);
  72749. 801d7a4: 4b13 ldr r3, [pc, #76] @ (801d7f4 <tcp_process+0x5c0>)
  72750. 801d7a6: 681b ldr r3, [r3, #0]
  72751. 801d7a8: 687a ldr r2, [r7, #4]
  72752. 801d7aa: 429a cmp r2, r3
  72753. 801d7ac: d105 bne.n 801d7ba <tcp_process+0x586>
  72754. 801d7ae: 4b11 ldr r3, [pc, #68] @ (801d7f4 <tcp_process+0x5c0>)
  72755. 801d7b0: 681b ldr r3, [r3, #0]
  72756. 801d7b2: 68db ldr r3, [r3, #12]
  72757. 801d7b4: 4a0f ldr r2, [pc, #60] @ (801d7f4 <tcp_process+0x5c0>)
  72758. 801d7b6: 6013 str r3, [r2, #0]
  72759. 801d7b8: e02e b.n 801d818 <tcp_process+0x5e4>
  72760. 801d7ba: 4b0e ldr r3, [pc, #56] @ (801d7f4 <tcp_process+0x5c0>)
  72761. 801d7bc: 681b ldr r3, [r3, #0]
  72762. 801d7be: 613b str r3, [r7, #16]
  72763. 801d7c0: e027 b.n 801d812 <tcp_process+0x5de>
  72764. 801d7c2: bf00 nop
  72765. 801d7c4: 2402aed0 .word 0x2402aed0
  72766. 801d7c8: 2402aec8 .word 0x2402aec8
  72767. 801d7cc: 2402aece .word 0x2402aece
  72768. 801d7d0: 2402aec4 .word 0x2402aec4
  72769. 801d7d4: 2402aeb4 .word 0x2402aeb4
  72770. 801d7d8: 24024348 .word 0x24024348
  72771. 801d7dc: 2402434c .word 0x2402434c
  72772. 801d7e0: 0802ed10 .word 0x0802ed10
  72773. 801d7e4: 0802efb0 .word 0x0802efb0
  72774. 801d7e8: 0802ed5c .word 0x0802ed5c
  72775. 801d7ec: 2402aecc .word 0x2402aecc
  72776. 801d7f0: 2402aed1 .word 0x2402aed1
  72777. 801d7f4: 2402ae94 .word 0x2402ae94
  72778. 801d7f8: 693b ldr r3, [r7, #16]
  72779. 801d7fa: 68db ldr r3, [r3, #12]
  72780. 801d7fc: 687a ldr r2, [r7, #4]
  72781. 801d7fe: 429a cmp r2, r3
  72782. 801d800: d104 bne.n 801d80c <tcp_process+0x5d8>
  72783. 801d802: 687b ldr r3, [r7, #4]
  72784. 801d804: 68da ldr r2, [r3, #12]
  72785. 801d806: 693b ldr r3, [r7, #16]
  72786. 801d808: 60da str r2, [r3, #12]
  72787. 801d80a: e005 b.n 801d818 <tcp_process+0x5e4>
  72788. 801d80c: 693b ldr r3, [r7, #16]
  72789. 801d80e: 68db ldr r3, [r3, #12]
  72790. 801d810: 613b str r3, [r7, #16]
  72791. 801d812: 693b ldr r3, [r7, #16]
  72792. 801d814: 2b00 cmp r3, #0
  72793. 801d816: d1ef bne.n 801d7f8 <tcp_process+0x5c4>
  72794. 801d818: 687b ldr r3, [r7, #4]
  72795. 801d81a: 2200 movs r2, #0
  72796. 801d81c: 60da str r2, [r3, #12]
  72797. 801d81e: 4b77 ldr r3, [pc, #476] @ (801d9fc <tcp_process+0x7c8>)
  72798. 801d820: 2201 movs r2, #1
  72799. 801d822: 701a strb r2, [r3, #0]
  72800. pcb->state = TIME_WAIT;
  72801. 801d824: 687b ldr r3, [r7, #4]
  72802. 801d826: 220a movs r2, #10
  72803. 801d828: 751a strb r2, [r3, #20]
  72804. TCP_REG(&tcp_tw_pcbs, pcb);
  72805. 801d82a: 4b75 ldr r3, [pc, #468] @ (801da00 <tcp_process+0x7cc>)
  72806. 801d82c: 681a ldr r2, [r3, #0]
  72807. 801d82e: 687b ldr r3, [r7, #4]
  72808. 801d830: 60da str r2, [r3, #12]
  72809. 801d832: 4a73 ldr r2, [pc, #460] @ (801da00 <tcp_process+0x7cc>)
  72810. 801d834: 687b ldr r3, [r7, #4]
  72811. 801d836: 6013 str r3, [r2, #0]
  72812. 801d838: f003 f9c0 bl 8020bbc <tcp_timer_needed>
  72813. }
  72814. } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
  72815. pcb->unsent == NULL) {
  72816. pcb->state = FIN_WAIT_2;
  72817. }
  72818. break;
  72819. 801d83c: e0d2 b.n 801d9e4 <tcp_process+0x7b0>
  72820. tcp_ack_now(pcb);
  72821. 801d83e: 687b ldr r3, [r7, #4]
  72822. 801d840: 8b5b ldrh r3, [r3, #26]
  72823. 801d842: f043 0302 orr.w r3, r3, #2
  72824. 801d846: b29a uxth r2, r3
  72825. 801d848: 687b ldr r3, [r7, #4]
  72826. 801d84a: 835a strh r2, [r3, #26]
  72827. pcb->state = CLOSING;
  72828. 801d84c: 687b ldr r3, [r7, #4]
  72829. 801d84e: 2208 movs r2, #8
  72830. 801d850: 751a strb r2, [r3, #20]
  72831. break;
  72832. 801d852: e0c7 b.n 801d9e4 <tcp_process+0x7b0>
  72833. } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
  72834. 801d854: 4b6b ldr r3, [pc, #428] @ (801da04 <tcp_process+0x7d0>)
  72835. 801d856: 781b ldrb r3, [r3, #0]
  72836. 801d858: f003 0310 and.w r3, r3, #16
  72837. 801d85c: 2b00 cmp r3, #0
  72838. 801d85e: f000 80c1 beq.w 801d9e4 <tcp_process+0x7b0>
  72839. 801d862: 687b ldr r3, [r7, #4]
  72840. 801d864: 6d1a ldr r2, [r3, #80] @ 0x50
  72841. 801d866: 4b68 ldr r3, [pc, #416] @ (801da08 <tcp_process+0x7d4>)
  72842. 801d868: 681b ldr r3, [r3, #0]
  72843. 801d86a: 429a cmp r2, r3
  72844. 801d86c: f040 80ba bne.w 801d9e4 <tcp_process+0x7b0>
  72845. pcb->unsent == NULL) {
  72846. 801d870: 687b ldr r3, [r7, #4]
  72847. 801d872: 6edb ldr r3, [r3, #108] @ 0x6c
  72848. } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
  72849. 801d874: 2b00 cmp r3, #0
  72850. 801d876: f040 80b5 bne.w 801d9e4 <tcp_process+0x7b0>
  72851. pcb->state = FIN_WAIT_2;
  72852. 801d87a: 687b ldr r3, [r7, #4]
  72853. 801d87c: 2206 movs r2, #6
  72854. 801d87e: 751a strb r2, [r3, #20]
  72855. break;
  72856. 801d880: e0b0 b.n 801d9e4 <tcp_process+0x7b0>
  72857. case FIN_WAIT_2:
  72858. tcp_receive(pcb);
  72859. 801d882: 6878 ldr r0, [r7, #4]
  72860. 801d884: f000 f9ca bl 801dc1c <tcp_receive>
  72861. if (recv_flags & TF_GOT_FIN) {
  72862. 801d888: 4b60 ldr r3, [pc, #384] @ (801da0c <tcp_process+0x7d8>)
  72863. 801d88a: 781b ldrb r3, [r3, #0]
  72864. 801d88c: f003 0320 and.w r3, r3, #32
  72865. 801d890: 2b00 cmp r3, #0
  72866. 801d892: f000 80a9 beq.w 801d9e8 <tcp_process+0x7b4>
  72867. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  72868. tcp_ack_now(pcb);
  72869. 801d896: 687b ldr r3, [r7, #4]
  72870. 801d898: 8b5b ldrh r3, [r3, #26]
  72871. 801d89a: f043 0302 orr.w r3, r3, #2
  72872. 801d89e: b29a uxth r2, r3
  72873. 801d8a0: 687b ldr r3, [r7, #4]
  72874. 801d8a2: 835a strh r2, [r3, #26]
  72875. tcp_pcb_purge(pcb);
  72876. 801d8a4: 6878 ldr r0, [r7, #4]
  72877. 801d8a6: f7fe fd37 bl 801c318 <tcp_pcb_purge>
  72878. TCP_RMV_ACTIVE(pcb);
  72879. 801d8aa: 4b59 ldr r3, [pc, #356] @ (801da10 <tcp_process+0x7dc>)
  72880. 801d8ac: 681b ldr r3, [r3, #0]
  72881. 801d8ae: 687a ldr r2, [r7, #4]
  72882. 801d8b0: 429a cmp r2, r3
  72883. 801d8b2: d105 bne.n 801d8c0 <tcp_process+0x68c>
  72884. 801d8b4: 4b56 ldr r3, [pc, #344] @ (801da10 <tcp_process+0x7dc>)
  72885. 801d8b6: 681b ldr r3, [r3, #0]
  72886. 801d8b8: 68db ldr r3, [r3, #12]
  72887. 801d8ba: 4a55 ldr r2, [pc, #340] @ (801da10 <tcp_process+0x7dc>)
  72888. 801d8bc: 6013 str r3, [r2, #0]
  72889. 801d8be: e013 b.n 801d8e8 <tcp_process+0x6b4>
  72890. 801d8c0: 4b53 ldr r3, [pc, #332] @ (801da10 <tcp_process+0x7dc>)
  72891. 801d8c2: 681b ldr r3, [r3, #0]
  72892. 801d8c4: 60fb str r3, [r7, #12]
  72893. 801d8c6: e00c b.n 801d8e2 <tcp_process+0x6ae>
  72894. 801d8c8: 68fb ldr r3, [r7, #12]
  72895. 801d8ca: 68db ldr r3, [r3, #12]
  72896. 801d8cc: 687a ldr r2, [r7, #4]
  72897. 801d8ce: 429a cmp r2, r3
  72898. 801d8d0: d104 bne.n 801d8dc <tcp_process+0x6a8>
  72899. 801d8d2: 687b ldr r3, [r7, #4]
  72900. 801d8d4: 68da ldr r2, [r3, #12]
  72901. 801d8d6: 68fb ldr r3, [r7, #12]
  72902. 801d8d8: 60da str r2, [r3, #12]
  72903. 801d8da: e005 b.n 801d8e8 <tcp_process+0x6b4>
  72904. 801d8dc: 68fb ldr r3, [r7, #12]
  72905. 801d8de: 68db ldr r3, [r3, #12]
  72906. 801d8e0: 60fb str r3, [r7, #12]
  72907. 801d8e2: 68fb ldr r3, [r7, #12]
  72908. 801d8e4: 2b00 cmp r3, #0
  72909. 801d8e6: d1ef bne.n 801d8c8 <tcp_process+0x694>
  72910. 801d8e8: 687b ldr r3, [r7, #4]
  72911. 801d8ea: 2200 movs r2, #0
  72912. 801d8ec: 60da str r2, [r3, #12]
  72913. 801d8ee: 4b43 ldr r3, [pc, #268] @ (801d9fc <tcp_process+0x7c8>)
  72914. 801d8f0: 2201 movs r2, #1
  72915. 801d8f2: 701a strb r2, [r3, #0]
  72916. pcb->state = TIME_WAIT;
  72917. 801d8f4: 687b ldr r3, [r7, #4]
  72918. 801d8f6: 220a movs r2, #10
  72919. 801d8f8: 751a strb r2, [r3, #20]
  72920. TCP_REG(&tcp_tw_pcbs, pcb);
  72921. 801d8fa: 4b41 ldr r3, [pc, #260] @ (801da00 <tcp_process+0x7cc>)
  72922. 801d8fc: 681a ldr r2, [r3, #0]
  72923. 801d8fe: 687b ldr r3, [r7, #4]
  72924. 801d900: 60da str r2, [r3, #12]
  72925. 801d902: 4a3f ldr r2, [pc, #252] @ (801da00 <tcp_process+0x7cc>)
  72926. 801d904: 687b ldr r3, [r7, #4]
  72927. 801d906: 6013 str r3, [r2, #0]
  72928. 801d908: f003 f958 bl 8020bbc <tcp_timer_needed>
  72929. }
  72930. break;
  72931. 801d90c: e06c b.n 801d9e8 <tcp_process+0x7b4>
  72932. case CLOSING:
  72933. tcp_receive(pcb);
  72934. 801d90e: 6878 ldr r0, [r7, #4]
  72935. 801d910: f000 f984 bl 801dc1c <tcp_receive>
  72936. if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) {
  72937. 801d914: 4b3b ldr r3, [pc, #236] @ (801da04 <tcp_process+0x7d0>)
  72938. 801d916: 781b ldrb r3, [r3, #0]
  72939. 801d918: f003 0310 and.w r3, r3, #16
  72940. 801d91c: 2b00 cmp r3, #0
  72941. 801d91e: d065 beq.n 801d9ec <tcp_process+0x7b8>
  72942. 801d920: 687b ldr r3, [r7, #4]
  72943. 801d922: 6d1a ldr r2, [r3, #80] @ 0x50
  72944. 801d924: 4b38 ldr r3, [pc, #224] @ (801da08 <tcp_process+0x7d4>)
  72945. 801d926: 681b ldr r3, [r3, #0]
  72946. 801d928: 429a cmp r2, r3
  72947. 801d92a: d15f bne.n 801d9ec <tcp_process+0x7b8>
  72948. 801d92c: 687b ldr r3, [r7, #4]
  72949. 801d92e: 6edb ldr r3, [r3, #108] @ 0x6c
  72950. 801d930: 2b00 cmp r3, #0
  72951. 801d932: d15b bne.n 801d9ec <tcp_process+0x7b8>
  72952. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  72953. tcp_pcb_purge(pcb);
  72954. 801d934: 6878 ldr r0, [r7, #4]
  72955. 801d936: f7fe fcef bl 801c318 <tcp_pcb_purge>
  72956. TCP_RMV_ACTIVE(pcb);
  72957. 801d93a: 4b35 ldr r3, [pc, #212] @ (801da10 <tcp_process+0x7dc>)
  72958. 801d93c: 681b ldr r3, [r3, #0]
  72959. 801d93e: 687a ldr r2, [r7, #4]
  72960. 801d940: 429a cmp r2, r3
  72961. 801d942: d105 bne.n 801d950 <tcp_process+0x71c>
  72962. 801d944: 4b32 ldr r3, [pc, #200] @ (801da10 <tcp_process+0x7dc>)
  72963. 801d946: 681b ldr r3, [r3, #0]
  72964. 801d948: 68db ldr r3, [r3, #12]
  72965. 801d94a: 4a31 ldr r2, [pc, #196] @ (801da10 <tcp_process+0x7dc>)
  72966. 801d94c: 6013 str r3, [r2, #0]
  72967. 801d94e: e013 b.n 801d978 <tcp_process+0x744>
  72968. 801d950: 4b2f ldr r3, [pc, #188] @ (801da10 <tcp_process+0x7dc>)
  72969. 801d952: 681b ldr r3, [r3, #0]
  72970. 801d954: 61bb str r3, [r7, #24]
  72971. 801d956: e00c b.n 801d972 <tcp_process+0x73e>
  72972. 801d958: 69bb ldr r3, [r7, #24]
  72973. 801d95a: 68db ldr r3, [r3, #12]
  72974. 801d95c: 687a ldr r2, [r7, #4]
  72975. 801d95e: 429a cmp r2, r3
  72976. 801d960: d104 bne.n 801d96c <tcp_process+0x738>
  72977. 801d962: 687b ldr r3, [r7, #4]
  72978. 801d964: 68da ldr r2, [r3, #12]
  72979. 801d966: 69bb ldr r3, [r7, #24]
  72980. 801d968: 60da str r2, [r3, #12]
  72981. 801d96a: e005 b.n 801d978 <tcp_process+0x744>
  72982. 801d96c: 69bb ldr r3, [r7, #24]
  72983. 801d96e: 68db ldr r3, [r3, #12]
  72984. 801d970: 61bb str r3, [r7, #24]
  72985. 801d972: 69bb ldr r3, [r7, #24]
  72986. 801d974: 2b00 cmp r3, #0
  72987. 801d976: d1ef bne.n 801d958 <tcp_process+0x724>
  72988. 801d978: 687b ldr r3, [r7, #4]
  72989. 801d97a: 2200 movs r2, #0
  72990. 801d97c: 60da str r2, [r3, #12]
  72991. 801d97e: 4b1f ldr r3, [pc, #124] @ (801d9fc <tcp_process+0x7c8>)
  72992. 801d980: 2201 movs r2, #1
  72993. 801d982: 701a strb r2, [r3, #0]
  72994. pcb->state = TIME_WAIT;
  72995. 801d984: 687b ldr r3, [r7, #4]
  72996. 801d986: 220a movs r2, #10
  72997. 801d988: 751a strb r2, [r3, #20]
  72998. TCP_REG(&tcp_tw_pcbs, pcb);
  72999. 801d98a: 4b1d ldr r3, [pc, #116] @ (801da00 <tcp_process+0x7cc>)
  73000. 801d98c: 681a ldr r2, [r3, #0]
  73001. 801d98e: 687b ldr r3, [r7, #4]
  73002. 801d990: 60da str r2, [r3, #12]
  73003. 801d992: 4a1b ldr r2, [pc, #108] @ (801da00 <tcp_process+0x7cc>)
  73004. 801d994: 687b ldr r3, [r7, #4]
  73005. 801d996: 6013 str r3, [r2, #0]
  73006. 801d998: f003 f910 bl 8020bbc <tcp_timer_needed>
  73007. }
  73008. break;
  73009. 801d99c: e026 b.n 801d9ec <tcp_process+0x7b8>
  73010. case LAST_ACK:
  73011. tcp_receive(pcb);
  73012. 801d99e: 6878 ldr r0, [r7, #4]
  73013. 801d9a0: f000 f93c bl 801dc1c <tcp_receive>
  73014. if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) {
  73015. 801d9a4: 4b17 ldr r3, [pc, #92] @ (801da04 <tcp_process+0x7d0>)
  73016. 801d9a6: 781b ldrb r3, [r3, #0]
  73017. 801d9a8: f003 0310 and.w r3, r3, #16
  73018. 801d9ac: 2b00 cmp r3, #0
  73019. 801d9ae: d01f beq.n 801d9f0 <tcp_process+0x7bc>
  73020. 801d9b0: 687b ldr r3, [r7, #4]
  73021. 801d9b2: 6d1a ldr r2, [r3, #80] @ 0x50
  73022. 801d9b4: 4b14 ldr r3, [pc, #80] @ (801da08 <tcp_process+0x7d4>)
  73023. 801d9b6: 681b ldr r3, [r3, #0]
  73024. 801d9b8: 429a cmp r2, r3
  73025. 801d9ba: d119 bne.n 801d9f0 <tcp_process+0x7bc>
  73026. 801d9bc: 687b ldr r3, [r7, #4]
  73027. 801d9be: 6edb ldr r3, [r3, #108] @ 0x6c
  73028. 801d9c0: 2b00 cmp r3, #0
  73029. 801d9c2: d115 bne.n 801d9f0 <tcp_process+0x7bc>
  73030. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  73031. /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */
  73032. recv_flags |= TF_CLOSED;
  73033. 801d9c4: 4b11 ldr r3, [pc, #68] @ (801da0c <tcp_process+0x7d8>)
  73034. 801d9c6: 781b ldrb r3, [r3, #0]
  73035. 801d9c8: f043 0310 orr.w r3, r3, #16
  73036. 801d9cc: b2da uxtb r2, r3
  73037. 801d9ce: 4b0f ldr r3, [pc, #60] @ (801da0c <tcp_process+0x7d8>)
  73038. 801d9d0: 701a strb r2, [r3, #0]
  73039. }
  73040. break;
  73041. 801d9d2: e00d b.n 801d9f0 <tcp_process+0x7bc>
  73042. default:
  73043. break;
  73044. 801d9d4: bf00 nop
  73045. 801d9d6: e00c b.n 801d9f2 <tcp_process+0x7be>
  73046. break;
  73047. 801d9d8: bf00 nop
  73048. 801d9da: e00a b.n 801d9f2 <tcp_process+0x7be>
  73049. break;
  73050. 801d9dc: bf00 nop
  73051. 801d9de: e008 b.n 801d9f2 <tcp_process+0x7be>
  73052. break;
  73053. 801d9e0: bf00 nop
  73054. 801d9e2: e006 b.n 801d9f2 <tcp_process+0x7be>
  73055. break;
  73056. 801d9e4: bf00 nop
  73057. 801d9e6: e004 b.n 801d9f2 <tcp_process+0x7be>
  73058. break;
  73059. 801d9e8: bf00 nop
  73060. 801d9ea: e002 b.n 801d9f2 <tcp_process+0x7be>
  73061. break;
  73062. 801d9ec: bf00 nop
  73063. 801d9ee: e000 b.n 801d9f2 <tcp_process+0x7be>
  73064. break;
  73065. 801d9f0: bf00 nop
  73066. }
  73067. return ERR_OK;
  73068. 801d9f2: 2300 movs r3, #0
  73069. }
  73070. 801d9f4: 4618 mov r0, r3
  73071. 801d9f6: 3724 adds r7, #36 @ 0x24
  73072. 801d9f8: 46bd mov sp, r7
  73073. 801d9fa: bd90 pop {r4, r7, pc}
  73074. 801d9fc: 2402ae9c .word 0x2402ae9c
  73075. 801da00: 2402ae98 .word 0x2402ae98
  73076. 801da04: 2402aed0 .word 0x2402aed0
  73077. 801da08: 2402aec8 .word 0x2402aec8
  73078. 801da0c: 2402aed1 .word 0x2402aed1
  73079. 801da10: 2402ae94 .word 0x2402ae94
  73080. 0801da14 <tcp_oos_insert_segment>:
  73081. *
  73082. * Called from tcp_receive()
  73083. */
  73084. static void
  73085. tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next)
  73086. {
  73087. 801da14: b590 push {r4, r7, lr}
  73088. 801da16: b085 sub sp, #20
  73089. 801da18: af00 add r7, sp, #0
  73090. 801da1a: 6078 str r0, [r7, #4]
  73091. 801da1c: 6039 str r1, [r7, #0]
  73092. struct tcp_seg *old_seg;
  73093. LWIP_ASSERT("tcp_oos_insert_segment: invalid cseg", cseg != NULL);
  73094. 801da1e: 687b ldr r3, [r7, #4]
  73095. 801da20: 2b00 cmp r3, #0
  73096. 801da22: d106 bne.n 801da32 <tcp_oos_insert_segment+0x1e>
  73097. 801da24: 4b3b ldr r3, [pc, #236] @ (801db14 <tcp_oos_insert_segment+0x100>)
  73098. 801da26: f240 421f movw r2, #1055 @ 0x41f
  73099. 801da2a: 493b ldr r1, [pc, #236] @ (801db18 <tcp_oos_insert_segment+0x104>)
  73100. 801da2c: 483b ldr r0, [pc, #236] @ (801db1c <tcp_oos_insert_segment+0x108>)
  73101. 801da2e: f00b ffcd bl 80299cc <iprintf>
  73102. if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {
  73103. 801da32: 687b ldr r3, [r7, #4]
  73104. 801da34: 691b ldr r3, [r3, #16]
  73105. 801da36: 899b ldrh r3, [r3, #12]
  73106. 801da38: b29b uxth r3, r3
  73107. 801da3a: 4618 mov r0, r3
  73108. 801da3c: f7fb f86c bl 8018b18 <lwip_htons>
  73109. 801da40: 4603 mov r3, r0
  73110. 801da42: b2db uxtb r3, r3
  73111. 801da44: f003 0301 and.w r3, r3, #1
  73112. 801da48: 2b00 cmp r3, #0
  73113. 801da4a: d028 beq.n 801da9e <tcp_oos_insert_segment+0x8a>
  73114. /* received segment overlaps all following segments */
  73115. tcp_segs_free(next);
  73116. 801da4c: 6838 ldr r0, [r7, #0]
  73117. 801da4e: f7fe f989 bl 801bd64 <tcp_segs_free>
  73118. next = NULL;
  73119. 801da52: 2300 movs r3, #0
  73120. 801da54: 603b str r3, [r7, #0]
  73121. 801da56: e056 b.n 801db06 <tcp_oos_insert_segment+0xf2>
  73122. oos queue may have segments with FIN flag */
  73123. while (next &&
  73124. TCP_SEQ_GEQ((seqno + cseg->len),
  73125. (next->tcphdr->seqno + next->len))) {
  73126. /* cseg with FIN already processed */
  73127. if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) {
  73128. 801da58: 683b ldr r3, [r7, #0]
  73129. 801da5a: 691b ldr r3, [r3, #16]
  73130. 801da5c: 899b ldrh r3, [r3, #12]
  73131. 801da5e: b29b uxth r3, r3
  73132. 801da60: 4618 mov r0, r3
  73133. 801da62: f7fb f859 bl 8018b18 <lwip_htons>
  73134. 801da66: 4603 mov r3, r0
  73135. 801da68: b2db uxtb r3, r3
  73136. 801da6a: f003 0301 and.w r3, r3, #1
  73137. 801da6e: 2b00 cmp r3, #0
  73138. 801da70: d00d beq.n 801da8e <tcp_oos_insert_segment+0x7a>
  73139. TCPH_SET_FLAG(cseg->tcphdr, TCP_FIN);
  73140. 801da72: 687b ldr r3, [r7, #4]
  73141. 801da74: 691b ldr r3, [r3, #16]
  73142. 801da76: 899b ldrh r3, [r3, #12]
  73143. 801da78: b29c uxth r4, r3
  73144. 801da7a: 2001 movs r0, #1
  73145. 801da7c: f7fb f84c bl 8018b18 <lwip_htons>
  73146. 801da80: 4603 mov r3, r0
  73147. 801da82: 461a mov r2, r3
  73148. 801da84: 687b ldr r3, [r7, #4]
  73149. 801da86: 691b ldr r3, [r3, #16]
  73150. 801da88: 4322 orrs r2, r4
  73151. 801da8a: b292 uxth r2, r2
  73152. 801da8c: 819a strh r2, [r3, #12]
  73153. }
  73154. old_seg = next;
  73155. 801da8e: 683b ldr r3, [r7, #0]
  73156. 801da90: 60fb str r3, [r7, #12]
  73157. next = next->next;
  73158. 801da92: 683b ldr r3, [r7, #0]
  73159. 801da94: 681b ldr r3, [r3, #0]
  73160. 801da96: 603b str r3, [r7, #0]
  73161. tcp_seg_free(old_seg);
  73162. 801da98: 68f8 ldr r0, [r7, #12]
  73163. 801da9a: f7fe f978 bl 801bd8e <tcp_seg_free>
  73164. while (next &&
  73165. 801da9e: 683b ldr r3, [r7, #0]
  73166. 801daa0: 2b00 cmp r3, #0
  73167. 801daa2: d00e beq.n 801dac2 <tcp_oos_insert_segment+0xae>
  73168. TCP_SEQ_GEQ((seqno + cseg->len),
  73169. 801daa4: 687b ldr r3, [r7, #4]
  73170. 801daa6: 891b ldrh r3, [r3, #8]
  73171. 801daa8: 461a mov r2, r3
  73172. 801daaa: 4b1d ldr r3, [pc, #116] @ (801db20 <tcp_oos_insert_segment+0x10c>)
  73173. 801daac: 681b ldr r3, [r3, #0]
  73174. 801daae: 441a add r2, r3
  73175. 801dab0: 683b ldr r3, [r7, #0]
  73176. 801dab2: 691b ldr r3, [r3, #16]
  73177. 801dab4: 685b ldr r3, [r3, #4]
  73178. 801dab6: 6839 ldr r1, [r7, #0]
  73179. 801dab8: 8909 ldrh r1, [r1, #8]
  73180. 801daba: 440b add r3, r1
  73181. 801dabc: 1ad3 subs r3, r2, r3
  73182. while (next &&
  73183. 801dabe: 2b00 cmp r3, #0
  73184. 801dac0: daca bge.n 801da58 <tcp_oos_insert_segment+0x44>
  73185. }
  73186. if (next &&
  73187. 801dac2: 683b ldr r3, [r7, #0]
  73188. 801dac4: 2b00 cmp r3, #0
  73189. 801dac6: d01e beq.n 801db06 <tcp_oos_insert_segment+0xf2>
  73190. TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) {
  73191. 801dac8: 687b ldr r3, [r7, #4]
  73192. 801daca: 891b ldrh r3, [r3, #8]
  73193. 801dacc: 461a mov r2, r3
  73194. 801dace: 4b14 ldr r3, [pc, #80] @ (801db20 <tcp_oos_insert_segment+0x10c>)
  73195. 801dad0: 681b ldr r3, [r3, #0]
  73196. 801dad2: 441a add r2, r3
  73197. 801dad4: 683b ldr r3, [r7, #0]
  73198. 801dad6: 691b ldr r3, [r3, #16]
  73199. 801dad8: 685b ldr r3, [r3, #4]
  73200. 801dada: 1ad3 subs r3, r2, r3
  73201. if (next &&
  73202. 801dadc: 2b00 cmp r3, #0
  73203. 801dade: dd12 ble.n 801db06 <tcp_oos_insert_segment+0xf2>
  73204. /* We need to trim the incoming segment. */
  73205. cseg->len = (u16_t)(next->tcphdr->seqno - seqno);
  73206. 801dae0: 683b ldr r3, [r7, #0]
  73207. 801dae2: 691b ldr r3, [r3, #16]
  73208. 801dae4: 685b ldr r3, [r3, #4]
  73209. 801dae6: b29a uxth r2, r3
  73210. 801dae8: 4b0d ldr r3, [pc, #52] @ (801db20 <tcp_oos_insert_segment+0x10c>)
  73211. 801daea: 681b ldr r3, [r3, #0]
  73212. 801daec: b29b uxth r3, r3
  73213. 801daee: 1ad3 subs r3, r2, r3
  73214. 801daf0: b29a uxth r2, r3
  73215. 801daf2: 687b ldr r3, [r7, #4]
  73216. 801daf4: 811a strh r2, [r3, #8]
  73217. pbuf_realloc(cseg->p, cseg->len);
  73218. 801daf6: 687b ldr r3, [r7, #4]
  73219. 801daf8: 685a ldr r2, [r3, #4]
  73220. 801dafa: 687b ldr r3, [r7, #4]
  73221. 801dafc: 891b ldrh r3, [r3, #8]
  73222. 801dafe: 4619 mov r1, r3
  73223. 801db00: 4610 mov r0, r2
  73224. 801db02: f7fc fb35 bl 801a170 <pbuf_realloc>
  73225. }
  73226. }
  73227. cseg->next = next;
  73228. 801db06: 687b ldr r3, [r7, #4]
  73229. 801db08: 683a ldr r2, [r7, #0]
  73230. 801db0a: 601a str r2, [r3, #0]
  73231. }
  73232. 801db0c: bf00 nop
  73233. 801db0e: 3714 adds r7, #20
  73234. 801db10: 46bd mov sp, r7
  73235. 801db12: bd90 pop {r4, r7, pc}
  73236. 801db14: 0802ed10 .word 0x0802ed10
  73237. 801db18: 0802efd0 .word 0x0802efd0
  73238. 801db1c: 0802ed5c .word 0x0802ed5c
  73239. 801db20: 2402aec4 .word 0x2402aec4
  73240. 0801db24 <tcp_free_acked_segments>:
  73241. /** Remove segments from a list if the incoming ACK acknowledges them */
  73242. static struct tcp_seg *
  73243. tcp_free_acked_segments(struct tcp_pcb *pcb, struct tcp_seg *seg_list, const char *dbg_list_name,
  73244. struct tcp_seg *dbg_other_seg_list)
  73245. {
  73246. 801db24: b5b0 push {r4, r5, r7, lr}
  73247. 801db26: b086 sub sp, #24
  73248. 801db28: af00 add r7, sp, #0
  73249. 801db2a: 60f8 str r0, [r7, #12]
  73250. 801db2c: 60b9 str r1, [r7, #8]
  73251. 801db2e: 607a str r2, [r7, #4]
  73252. 801db30: 603b str r3, [r7, #0]
  73253. u16_t clen;
  73254. LWIP_UNUSED_ARG(dbg_list_name);
  73255. LWIP_UNUSED_ARG(dbg_other_seg_list);
  73256. while (seg_list != NULL &&
  73257. 801db32: e03e b.n 801dbb2 <tcp_free_acked_segments+0x8e>
  73258. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->%s\n",
  73259. lwip_ntohl(seg_list->tcphdr->seqno),
  73260. lwip_ntohl(seg_list->tcphdr->seqno) + TCP_TCPLEN(seg_list),
  73261. dbg_list_name));
  73262. next = seg_list;
  73263. 801db34: 68bb ldr r3, [r7, #8]
  73264. 801db36: 617b str r3, [r7, #20]
  73265. seg_list = seg_list->next;
  73266. 801db38: 68bb ldr r3, [r7, #8]
  73267. 801db3a: 681b ldr r3, [r3, #0]
  73268. 801db3c: 60bb str r3, [r7, #8]
  73269. clen = pbuf_clen(next->p);
  73270. 801db3e: 697b ldr r3, [r7, #20]
  73271. 801db40: 685b ldr r3, [r3, #4]
  73272. 801db42: 4618 mov r0, r3
  73273. 801db44: f7fc fd58 bl 801a5f8 <pbuf_clen>
  73274. 801db48: 4603 mov r3, r0
  73275. 801db4a: 827b strh r3, [r7, #18]
  73276. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"TCPWNDSIZE_F" ... ",
  73277. (tcpwnd_size_t)pcb->snd_queuelen));
  73278. LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= clen));
  73279. 801db4c: 68fb ldr r3, [r7, #12]
  73280. 801db4e: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  73281. 801db52: 8a7a ldrh r2, [r7, #18]
  73282. 801db54: 429a cmp r2, r3
  73283. 801db56: d906 bls.n 801db66 <tcp_free_acked_segments+0x42>
  73284. 801db58: 4b2a ldr r3, [pc, #168] @ (801dc04 <tcp_free_acked_segments+0xe0>)
  73285. 801db5a: f240 4257 movw r2, #1111 @ 0x457
  73286. 801db5e: 492a ldr r1, [pc, #168] @ (801dc08 <tcp_free_acked_segments+0xe4>)
  73287. 801db60: 482a ldr r0, [pc, #168] @ (801dc0c <tcp_free_acked_segments+0xe8>)
  73288. 801db62: f00b ff33 bl 80299cc <iprintf>
  73289. pcb->snd_queuelen = (u16_t)(pcb->snd_queuelen - clen);
  73290. 801db66: 68fb ldr r3, [r7, #12]
  73291. 801db68: f8b3 2066 ldrh.w r2, [r3, #102] @ 0x66
  73292. 801db6c: 8a7b ldrh r3, [r7, #18]
  73293. 801db6e: 1ad3 subs r3, r2, r3
  73294. 801db70: b29a uxth r2, r3
  73295. 801db72: 68fb ldr r3, [r7, #12]
  73296. 801db74: f8a3 2066 strh.w r2, [r3, #102] @ 0x66
  73297. recv_acked = (tcpwnd_size_t)(recv_acked + next->len);
  73298. 801db78: 697b ldr r3, [r7, #20]
  73299. 801db7a: 891a ldrh r2, [r3, #8]
  73300. 801db7c: 4b24 ldr r3, [pc, #144] @ (801dc10 <tcp_free_acked_segments+0xec>)
  73301. 801db7e: 881b ldrh r3, [r3, #0]
  73302. 801db80: 4413 add r3, r2
  73303. 801db82: b29a uxth r2, r3
  73304. 801db84: 4b22 ldr r3, [pc, #136] @ (801dc10 <tcp_free_acked_segments+0xec>)
  73305. 801db86: 801a strh r2, [r3, #0]
  73306. tcp_seg_free(next);
  73307. 801db88: 6978 ldr r0, [r7, #20]
  73308. 801db8a: f7fe f900 bl 801bd8e <tcp_seg_free>
  73309. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"TCPWNDSIZE_F" (after freeing %s)\n",
  73310. (tcpwnd_size_t)pcb->snd_queuelen,
  73311. dbg_list_name));
  73312. if (pcb->snd_queuelen != 0) {
  73313. 801db8e: 68fb ldr r3, [r7, #12]
  73314. 801db90: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  73315. 801db94: 2b00 cmp r3, #0
  73316. 801db96: d00c beq.n 801dbb2 <tcp_free_acked_segments+0x8e>
  73317. LWIP_ASSERT("tcp_receive: valid queue length",
  73318. 801db98: 68bb ldr r3, [r7, #8]
  73319. 801db9a: 2b00 cmp r3, #0
  73320. 801db9c: d109 bne.n 801dbb2 <tcp_free_acked_segments+0x8e>
  73321. 801db9e: 683b ldr r3, [r7, #0]
  73322. 801dba0: 2b00 cmp r3, #0
  73323. 801dba2: d106 bne.n 801dbb2 <tcp_free_acked_segments+0x8e>
  73324. 801dba4: 4b17 ldr r3, [pc, #92] @ (801dc04 <tcp_free_acked_segments+0xe0>)
  73325. 801dba6: f240 4261 movw r2, #1121 @ 0x461
  73326. 801dbaa: 491a ldr r1, [pc, #104] @ (801dc14 <tcp_free_acked_segments+0xf0>)
  73327. 801dbac: 4817 ldr r0, [pc, #92] @ (801dc0c <tcp_free_acked_segments+0xe8>)
  73328. 801dbae: f00b ff0d bl 80299cc <iprintf>
  73329. while (seg_list != NULL &&
  73330. 801dbb2: 68bb ldr r3, [r7, #8]
  73331. 801dbb4: 2b00 cmp r3, #0
  73332. 801dbb6: d020 beq.n 801dbfa <tcp_free_acked_segments+0xd6>
  73333. TCP_SEQ_LEQ(lwip_ntohl(seg_list->tcphdr->seqno) +
  73334. 801dbb8: 68bb ldr r3, [r7, #8]
  73335. 801dbba: 691b ldr r3, [r3, #16]
  73336. 801dbbc: 685b ldr r3, [r3, #4]
  73337. 801dbbe: 4618 mov r0, r3
  73338. 801dbc0: f7fa ffbf bl 8018b42 <lwip_htonl>
  73339. 801dbc4: 4604 mov r4, r0
  73340. 801dbc6: 68bb ldr r3, [r7, #8]
  73341. 801dbc8: 891b ldrh r3, [r3, #8]
  73342. 801dbca: 461d mov r5, r3
  73343. 801dbcc: 68bb ldr r3, [r7, #8]
  73344. 801dbce: 691b ldr r3, [r3, #16]
  73345. 801dbd0: 899b ldrh r3, [r3, #12]
  73346. 801dbd2: b29b uxth r3, r3
  73347. 801dbd4: 4618 mov r0, r3
  73348. 801dbd6: f7fa ff9f bl 8018b18 <lwip_htons>
  73349. 801dbda: 4603 mov r3, r0
  73350. 801dbdc: b2db uxtb r3, r3
  73351. 801dbde: f003 0303 and.w r3, r3, #3
  73352. 801dbe2: 2b00 cmp r3, #0
  73353. 801dbe4: d001 beq.n 801dbea <tcp_free_acked_segments+0xc6>
  73354. 801dbe6: 2301 movs r3, #1
  73355. 801dbe8: e000 b.n 801dbec <tcp_free_acked_segments+0xc8>
  73356. 801dbea: 2300 movs r3, #0
  73357. 801dbec: 442b add r3, r5
  73358. 801dbee: 18e2 adds r2, r4, r3
  73359. 801dbf0: 4b09 ldr r3, [pc, #36] @ (801dc18 <tcp_free_acked_segments+0xf4>)
  73360. 801dbf2: 681b ldr r3, [r3, #0]
  73361. 801dbf4: 1ad3 subs r3, r2, r3
  73362. while (seg_list != NULL &&
  73363. 801dbf6: 2b00 cmp r3, #0
  73364. 801dbf8: dd9c ble.n 801db34 <tcp_free_acked_segments+0x10>
  73365. seg_list != NULL || dbg_other_seg_list != NULL);
  73366. }
  73367. }
  73368. return seg_list;
  73369. 801dbfa: 68bb ldr r3, [r7, #8]
  73370. }
  73371. 801dbfc: 4618 mov r0, r3
  73372. 801dbfe: 3718 adds r7, #24
  73373. 801dc00: 46bd mov sp, r7
  73374. 801dc02: bdb0 pop {r4, r5, r7, pc}
  73375. 801dc04: 0802ed10 .word 0x0802ed10
  73376. 801dc08: 0802eff8 .word 0x0802eff8
  73377. 801dc0c: 0802ed5c .word 0x0802ed5c
  73378. 801dc10: 2402aecc .word 0x2402aecc
  73379. 801dc14: 0802f020 .word 0x0802f020
  73380. 801dc18: 2402aec8 .word 0x2402aec8
  73381. 0801dc1c <tcp_receive>:
  73382. *
  73383. * Called from tcp_process().
  73384. */
  73385. static void
  73386. tcp_receive(struct tcp_pcb *pcb)
  73387. {
  73388. 801dc1c: b5b0 push {r4, r5, r7, lr}
  73389. 801dc1e: b094 sub sp, #80 @ 0x50
  73390. 801dc20: af00 add r7, sp, #0
  73391. 801dc22: 6078 str r0, [r7, #4]
  73392. s16_t m;
  73393. u32_t right_wnd_edge;
  73394. int found_dupack = 0;
  73395. 801dc24: 2300 movs r3, #0
  73396. 801dc26: 64bb str r3, [r7, #72] @ 0x48
  73397. LWIP_ASSERT("tcp_receive: invalid pcb", pcb != NULL);
  73398. 801dc28: 687b ldr r3, [r7, #4]
  73399. 801dc2a: 2b00 cmp r3, #0
  73400. 801dc2c: d106 bne.n 801dc3c <tcp_receive+0x20>
  73401. 801dc2e: 4b91 ldr r3, [pc, #580] @ (801de74 <tcp_receive+0x258>)
  73402. 801dc30: f240 427b movw r2, #1147 @ 0x47b
  73403. 801dc34: 4990 ldr r1, [pc, #576] @ (801de78 <tcp_receive+0x25c>)
  73404. 801dc36: 4891 ldr r0, [pc, #580] @ (801de7c <tcp_receive+0x260>)
  73405. 801dc38: f00b fec8 bl 80299cc <iprintf>
  73406. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  73407. 801dc3c: 687b ldr r3, [r7, #4]
  73408. 801dc3e: 7d1b ldrb r3, [r3, #20]
  73409. 801dc40: 2b03 cmp r3, #3
  73410. 801dc42: d806 bhi.n 801dc52 <tcp_receive+0x36>
  73411. 801dc44: 4b8b ldr r3, [pc, #556] @ (801de74 <tcp_receive+0x258>)
  73412. 801dc46: f240 427c movw r2, #1148 @ 0x47c
  73413. 801dc4a: 498d ldr r1, [pc, #564] @ (801de80 <tcp_receive+0x264>)
  73414. 801dc4c: 488b ldr r0, [pc, #556] @ (801de7c <tcp_receive+0x260>)
  73415. 801dc4e: f00b febd bl 80299cc <iprintf>
  73416. if (flags & TCP_ACK) {
  73417. 801dc52: 4b8c ldr r3, [pc, #560] @ (801de84 <tcp_receive+0x268>)
  73418. 801dc54: 781b ldrb r3, [r3, #0]
  73419. 801dc56: f003 0310 and.w r3, r3, #16
  73420. 801dc5a: 2b00 cmp r3, #0
  73421. 801dc5c: f000 8264 beq.w 801e128 <tcp_receive+0x50c>
  73422. right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
  73423. 801dc60: 687b ldr r3, [r7, #4]
  73424. 801dc62: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  73425. 801dc66: 461a mov r2, r3
  73426. 801dc68: 687b ldr r3, [r7, #4]
  73427. 801dc6a: 6d9b ldr r3, [r3, #88] @ 0x58
  73428. 801dc6c: 4413 add r3, r2
  73429. 801dc6e: 633b str r3, [r7, #48] @ 0x30
  73430. /* Update window. */
  73431. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  73432. 801dc70: 687b ldr r3, [r7, #4]
  73433. 801dc72: 6d5a ldr r2, [r3, #84] @ 0x54
  73434. 801dc74: 4b84 ldr r3, [pc, #528] @ (801de88 <tcp_receive+0x26c>)
  73435. 801dc76: 681b ldr r3, [r3, #0]
  73436. 801dc78: 1ad3 subs r3, r2, r3
  73437. 801dc7a: 2b00 cmp r3, #0
  73438. 801dc7c: db1b blt.n 801dcb6 <tcp_receive+0x9a>
  73439. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  73440. 801dc7e: 687b ldr r3, [r7, #4]
  73441. 801dc80: 6d5a ldr r2, [r3, #84] @ 0x54
  73442. 801dc82: 4b81 ldr r3, [pc, #516] @ (801de88 <tcp_receive+0x26c>)
  73443. 801dc84: 681b ldr r3, [r3, #0]
  73444. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  73445. 801dc86: 429a cmp r2, r3
  73446. 801dc88: d106 bne.n 801dc98 <tcp_receive+0x7c>
  73447. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  73448. 801dc8a: 687b ldr r3, [r7, #4]
  73449. 801dc8c: 6d9a ldr r2, [r3, #88] @ 0x58
  73450. 801dc8e: 4b7f ldr r3, [pc, #508] @ (801de8c <tcp_receive+0x270>)
  73451. 801dc90: 681b ldr r3, [r3, #0]
  73452. 801dc92: 1ad3 subs r3, r2, r3
  73453. 801dc94: 2b00 cmp r3, #0
  73454. 801dc96: db0e blt.n 801dcb6 <tcp_receive+0x9a>
  73455. (pcb->snd_wl2 == ackno && (u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) {
  73456. 801dc98: 687b ldr r3, [r7, #4]
  73457. 801dc9a: 6d9a ldr r2, [r3, #88] @ 0x58
  73458. 801dc9c: 4b7b ldr r3, [pc, #492] @ (801de8c <tcp_receive+0x270>)
  73459. 801dc9e: 681b ldr r3, [r3, #0]
  73460. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  73461. 801dca0: 429a cmp r2, r3
  73462. 801dca2: d125 bne.n 801dcf0 <tcp_receive+0xd4>
  73463. (pcb->snd_wl2 == ackno && (u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) {
  73464. 801dca4: 4b7a ldr r3, [pc, #488] @ (801de90 <tcp_receive+0x274>)
  73465. 801dca6: 681b ldr r3, [r3, #0]
  73466. 801dca8: 89db ldrh r3, [r3, #14]
  73467. 801dcaa: b29a uxth r2, r3
  73468. 801dcac: 687b ldr r3, [r7, #4]
  73469. 801dcae: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  73470. 801dcb2: 429a cmp r2, r3
  73471. 801dcb4: d91c bls.n 801dcf0 <tcp_receive+0xd4>
  73472. pcb->snd_wnd = SND_WND_SCALE(pcb, tcphdr->wnd);
  73473. 801dcb6: 4b76 ldr r3, [pc, #472] @ (801de90 <tcp_receive+0x274>)
  73474. 801dcb8: 681b ldr r3, [r3, #0]
  73475. 801dcba: 89db ldrh r3, [r3, #14]
  73476. 801dcbc: b29a uxth r2, r3
  73477. 801dcbe: 687b ldr r3, [r7, #4]
  73478. 801dcc0: f8a3 2060 strh.w r2, [r3, #96] @ 0x60
  73479. /* keep track of the biggest window announced by the remote host to calculate
  73480. the maximum segment size */
  73481. if (pcb->snd_wnd_max < pcb->snd_wnd) {
  73482. 801dcc4: 687b ldr r3, [r7, #4]
  73483. 801dcc6: f8b3 2062 ldrh.w r2, [r3, #98] @ 0x62
  73484. 801dcca: 687b ldr r3, [r7, #4]
  73485. 801dccc: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  73486. 801dcd0: 429a cmp r2, r3
  73487. 801dcd2: d205 bcs.n 801dce0 <tcp_receive+0xc4>
  73488. pcb->snd_wnd_max = pcb->snd_wnd;
  73489. 801dcd4: 687b ldr r3, [r7, #4]
  73490. 801dcd6: f8b3 2060 ldrh.w r2, [r3, #96] @ 0x60
  73491. 801dcda: 687b ldr r3, [r7, #4]
  73492. 801dcdc: f8a3 2062 strh.w r2, [r3, #98] @ 0x62
  73493. }
  73494. pcb->snd_wl1 = seqno;
  73495. 801dce0: 4b69 ldr r3, [pc, #420] @ (801de88 <tcp_receive+0x26c>)
  73496. 801dce2: 681a ldr r2, [r3, #0]
  73497. 801dce4: 687b ldr r3, [r7, #4]
  73498. 801dce6: 655a str r2, [r3, #84] @ 0x54
  73499. pcb->snd_wl2 = ackno;
  73500. 801dce8: 4b68 ldr r3, [pc, #416] @ (801de8c <tcp_receive+0x270>)
  73501. 801dcea: 681a ldr r2, [r3, #0]
  73502. 801dcec: 687b ldr r3, [r7, #4]
  73503. 801dcee: 659a str r2, [r3, #88] @ 0x58
  73504. * If it only passes 1, should reset dupack counter
  73505. *
  73506. */
  73507. /* Clause 1 */
  73508. if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {
  73509. 801dcf0: 4b66 ldr r3, [pc, #408] @ (801de8c <tcp_receive+0x270>)
  73510. 801dcf2: 681a ldr r2, [r3, #0]
  73511. 801dcf4: 687b ldr r3, [r7, #4]
  73512. 801dcf6: 6c5b ldr r3, [r3, #68] @ 0x44
  73513. 801dcf8: 1ad3 subs r3, r2, r3
  73514. 801dcfa: 2b00 cmp r3, #0
  73515. 801dcfc: dc58 bgt.n 801ddb0 <tcp_receive+0x194>
  73516. /* Clause 2 */
  73517. if (tcplen == 0) {
  73518. 801dcfe: 4b65 ldr r3, [pc, #404] @ (801de94 <tcp_receive+0x278>)
  73519. 801dd00: 881b ldrh r3, [r3, #0]
  73520. 801dd02: 2b00 cmp r3, #0
  73521. 801dd04: d14b bne.n 801dd9e <tcp_receive+0x182>
  73522. /* Clause 3 */
  73523. if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge) {
  73524. 801dd06: 687b ldr r3, [r7, #4]
  73525. 801dd08: 6d9b ldr r3, [r3, #88] @ 0x58
  73526. 801dd0a: 687a ldr r2, [r7, #4]
  73527. 801dd0c: f8b2 2060 ldrh.w r2, [r2, #96] @ 0x60
  73528. 801dd10: 4413 add r3, r2
  73529. 801dd12: 6b3a ldr r2, [r7, #48] @ 0x30
  73530. 801dd14: 429a cmp r2, r3
  73531. 801dd16: d142 bne.n 801dd9e <tcp_receive+0x182>
  73532. /* Clause 4 */
  73533. if (pcb->rtime >= 0) {
  73534. 801dd18: 687b ldr r3, [r7, #4]
  73535. 801dd1a: f9b3 3030 ldrsh.w r3, [r3, #48] @ 0x30
  73536. 801dd1e: 2b00 cmp r3, #0
  73537. 801dd20: db3d blt.n 801dd9e <tcp_receive+0x182>
  73538. /* Clause 5 */
  73539. if (pcb->lastack == ackno) {
  73540. 801dd22: 687b ldr r3, [r7, #4]
  73541. 801dd24: 6c5a ldr r2, [r3, #68] @ 0x44
  73542. 801dd26: 4b59 ldr r3, [pc, #356] @ (801de8c <tcp_receive+0x270>)
  73543. 801dd28: 681b ldr r3, [r3, #0]
  73544. 801dd2a: 429a cmp r2, r3
  73545. 801dd2c: d137 bne.n 801dd9e <tcp_receive+0x182>
  73546. found_dupack = 1;
  73547. 801dd2e: 2301 movs r3, #1
  73548. 801dd30: 64bb str r3, [r7, #72] @ 0x48
  73549. if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) {
  73550. 801dd32: 687b ldr r3, [r7, #4]
  73551. 801dd34: f893 3043 ldrb.w r3, [r3, #67] @ 0x43
  73552. 801dd38: 2bff cmp r3, #255 @ 0xff
  73553. 801dd3a: d007 beq.n 801dd4c <tcp_receive+0x130>
  73554. ++pcb->dupacks;
  73555. 801dd3c: 687b ldr r3, [r7, #4]
  73556. 801dd3e: f893 3043 ldrb.w r3, [r3, #67] @ 0x43
  73557. 801dd42: 3301 adds r3, #1
  73558. 801dd44: b2da uxtb r2, r3
  73559. 801dd46: 687b ldr r3, [r7, #4]
  73560. 801dd48: f883 2043 strb.w r2, [r3, #67] @ 0x43
  73561. }
  73562. if (pcb->dupacks > 3) {
  73563. 801dd4c: 687b ldr r3, [r7, #4]
  73564. 801dd4e: f893 3043 ldrb.w r3, [r3, #67] @ 0x43
  73565. 801dd52: 2b03 cmp r3, #3
  73566. 801dd54: d91b bls.n 801dd8e <tcp_receive+0x172>
  73567. /* Inflate the congestion window */
  73568. TCP_WND_INC(pcb->cwnd, pcb->mss);
  73569. 801dd56: 687b ldr r3, [r7, #4]
  73570. 801dd58: f8b3 2048 ldrh.w r2, [r3, #72] @ 0x48
  73571. 801dd5c: 687b ldr r3, [r7, #4]
  73572. 801dd5e: 8e5b ldrh r3, [r3, #50] @ 0x32
  73573. 801dd60: 4413 add r3, r2
  73574. 801dd62: b29a uxth r2, r3
  73575. 801dd64: 687b ldr r3, [r7, #4]
  73576. 801dd66: f8b3 3048 ldrh.w r3, [r3, #72] @ 0x48
  73577. 801dd6a: 429a cmp r2, r3
  73578. 801dd6c: d30a bcc.n 801dd84 <tcp_receive+0x168>
  73579. 801dd6e: 687b ldr r3, [r7, #4]
  73580. 801dd70: f8b3 2048 ldrh.w r2, [r3, #72] @ 0x48
  73581. 801dd74: 687b ldr r3, [r7, #4]
  73582. 801dd76: 8e5b ldrh r3, [r3, #50] @ 0x32
  73583. 801dd78: 4413 add r3, r2
  73584. 801dd7a: b29a uxth r2, r3
  73585. 801dd7c: 687b ldr r3, [r7, #4]
  73586. 801dd7e: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  73587. 801dd82: e004 b.n 801dd8e <tcp_receive+0x172>
  73588. 801dd84: 687b ldr r3, [r7, #4]
  73589. 801dd86: f64f 72ff movw r2, #65535 @ 0xffff
  73590. 801dd8a: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  73591. }
  73592. if (pcb->dupacks >= 3) {
  73593. 801dd8e: 687b ldr r3, [r7, #4]
  73594. 801dd90: f893 3043 ldrb.w r3, [r3, #67] @ 0x43
  73595. 801dd94: 2b02 cmp r3, #2
  73596. 801dd96: d902 bls.n 801dd9e <tcp_receive+0x182>
  73597. /* Do fast retransmit (checked via TF_INFR, not via dupacks count) */
  73598. tcp_rexmit_fast(pcb);
  73599. 801dd98: 6878 ldr r0, [r7, #4]
  73600. 801dd9a: f002 fbb3 bl 8020504 <tcp_rexmit_fast>
  73601. }
  73602. }
  73603. }
  73604. /* If Clause (1) or more is true, but not a duplicate ack, reset
  73605. * count of consecutive duplicate acks */
  73606. if (!found_dupack) {
  73607. 801dd9e: 6cbb ldr r3, [r7, #72] @ 0x48
  73608. 801dda0: 2b00 cmp r3, #0
  73609. 801dda2: f040 8161 bne.w 801e068 <tcp_receive+0x44c>
  73610. pcb->dupacks = 0;
  73611. 801dda6: 687b ldr r3, [r7, #4]
  73612. 801dda8: 2200 movs r2, #0
  73613. 801ddaa: f883 2043 strb.w r2, [r3, #67] @ 0x43
  73614. 801ddae: e15b b.n 801e068 <tcp_receive+0x44c>
  73615. }
  73616. } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
  73617. 801ddb0: 4b36 ldr r3, [pc, #216] @ (801de8c <tcp_receive+0x270>)
  73618. 801ddb2: 681a ldr r2, [r3, #0]
  73619. 801ddb4: 687b ldr r3, [r7, #4]
  73620. 801ddb6: 6c5b ldr r3, [r3, #68] @ 0x44
  73621. 801ddb8: 1ad3 subs r3, r2, r3
  73622. 801ddba: 3b01 subs r3, #1
  73623. 801ddbc: 2b00 cmp r3, #0
  73624. 801ddbe: f2c0 814e blt.w 801e05e <tcp_receive+0x442>
  73625. 801ddc2: 4b32 ldr r3, [pc, #200] @ (801de8c <tcp_receive+0x270>)
  73626. 801ddc4: 681a ldr r2, [r3, #0]
  73627. 801ddc6: 687b ldr r3, [r7, #4]
  73628. 801ddc8: 6d1b ldr r3, [r3, #80] @ 0x50
  73629. 801ddca: 1ad3 subs r3, r2, r3
  73630. 801ddcc: 2b00 cmp r3, #0
  73631. 801ddce: f300 8146 bgt.w 801e05e <tcp_receive+0x442>
  73632. tcpwnd_size_t acked;
  73633. /* Reset the "IN Fast Retransmit" flag, since we are no longer
  73634. in fast retransmit. Also reset the congestion window to the
  73635. slow start threshold. */
  73636. if (pcb->flags & TF_INFR) {
  73637. 801ddd2: 687b ldr r3, [r7, #4]
  73638. 801ddd4: 8b5b ldrh r3, [r3, #26]
  73639. 801ddd6: f003 0304 and.w r3, r3, #4
  73640. 801ddda: 2b00 cmp r3, #0
  73641. 801dddc: d010 beq.n 801de00 <tcp_receive+0x1e4>
  73642. tcp_clear_flags(pcb, TF_INFR);
  73643. 801ddde: 687b ldr r3, [r7, #4]
  73644. 801dde0: 8b5b ldrh r3, [r3, #26]
  73645. 801dde2: f023 0304 bic.w r3, r3, #4
  73646. 801dde6: b29a uxth r2, r3
  73647. 801dde8: 687b ldr r3, [r7, #4]
  73648. 801ddea: 835a strh r2, [r3, #26]
  73649. pcb->cwnd = pcb->ssthresh;
  73650. 801ddec: 687b ldr r3, [r7, #4]
  73651. 801ddee: f8b3 204a ldrh.w r2, [r3, #74] @ 0x4a
  73652. 801ddf2: 687b ldr r3, [r7, #4]
  73653. 801ddf4: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  73654. pcb->bytes_acked = 0;
  73655. 801ddf8: 687b ldr r3, [r7, #4]
  73656. 801ddfa: 2200 movs r2, #0
  73657. 801ddfc: f8a3 206a strh.w r2, [r3, #106] @ 0x6a
  73658. }
  73659. /* Reset the number of retransmissions. */
  73660. pcb->nrtx = 0;
  73661. 801de00: 687b ldr r3, [r7, #4]
  73662. 801de02: 2200 movs r2, #0
  73663. 801de04: f883 2042 strb.w r2, [r3, #66] @ 0x42
  73664. /* Reset the retransmission time-out. */
  73665. pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv);
  73666. 801de08: 687b ldr r3, [r7, #4]
  73667. 801de0a: f9b3 303c ldrsh.w r3, [r3, #60] @ 0x3c
  73668. 801de0e: 10db asrs r3, r3, #3
  73669. 801de10: b21b sxth r3, r3
  73670. 801de12: b29a uxth r2, r3
  73671. 801de14: 687b ldr r3, [r7, #4]
  73672. 801de16: f9b3 303e ldrsh.w r3, [r3, #62] @ 0x3e
  73673. 801de1a: b29b uxth r3, r3
  73674. 801de1c: 4413 add r3, r2
  73675. 801de1e: b29b uxth r3, r3
  73676. 801de20: b21a sxth r2, r3
  73677. 801de22: 687b ldr r3, [r7, #4]
  73678. 801de24: f8a3 2040 strh.w r2, [r3, #64] @ 0x40
  73679. /* Record how much data this ACK acks */
  73680. acked = (tcpwnd_size_t)(ackno - pcb->lastack);
  73681. 801de28: 4b18 ldr r3, [pc, #96] @ (801de8c <tcp_receive+0x270>)
  73682. 801de2a: 681b ldr r3, [r3, #0]
  73683. 801de2c: b29a uxth r2, r3
  73684. 801de2e: 687b ldr r3, [r7, #4]
  73685. 801de30: 6c5b ldr r3, [r3, #68] @ 0x44
  73686. 801de32: b29b uxth r3, r3
  73687. 801de34: 1ad3 subs r3, r2, r3
  73688. 801de36: 85fb strh r3, [r7, #46] @ 0x2e
  73689. /* Reset the fast retransmit variables. */
  73690. pcb->dupacks = 0;
  73691. 801de38: 687b ldr r3, [r7, #4]
  73692. 801de3a: 2200 movs r2, #0
  73693. 801de3c: f883 2043 strb.w r2, [r3, #67] @ 0x43
  73694. pcb->lastack = ackno;
  73695. 801de40: 4b12 ldr r3, [pc, #72] @ (801de8c <tcp_receive+0x270>)
  73696. 801de42: 681a ldr r2, [r3, #0]
  73697. 801de44: 687b ldr r3, [r7, #4]
  73698. 801de46: 645a str r2, [r3, #68] @ 0x44
  73699. /* Update the congestion control variables (cwnd and
  73700. ssthresh). */
  73701. if (pcb->state >= ESTABLISHED) {
  73702. 801de48: 687b ldr r3, [r7, #4]
  73703. 801de4a: 7d1b ldrb r3, [r3, #20]
  73704. 801de4c: 2b03 cmp r3, #3
  73705. 801de4e: f240 8097 bls.w 801df80 <tcp_receive+0x364>
  73706. if (pcb->cwnd < pcb->ssthresh) {
  73707. 801de52: 687b ldr r3, [r7, #4]
  73708. 801de54: f8b3 2048 ldrh.w r2, [r3, #72] @ 0x48
  73709. 801de58: 687b ldr r3, [r7, #4]
  73710. 801de5a: f8b3 304a ldrh.w r3, [r3, #74] @ 0x4a
  73711. 801de5e: 429a cmp r2, r3
  73712. 801de60: d245 bcs.n 801deee <tcp_receive+0x2d2>
  73713. tcpwnd_size_t increase;
  73714. /* limit to 1 SMSS segment during period following RTO */
  73715. u8_t num_seg = (pcb->flags & TF_RTO) ? 1 : 2;
  73716. 801de62: 687b ldr r3, [r7, #4]
  73717. 801de64: 8b5b ldrh r3, [r3, #26]
  73718. 801de66: f403 6300 and.w r3, r3, #2048 @ 0x800
  73719. 801de6a: 2b00 cmp r3, #0
  73720. 801de6c: d014 beq.n 801de98 <tcp_receive+0x27c>
  73721. 801de6e: 2301 movs r3, #1
  73722. 801de70: e013 b.n 801de9a <tcp_receive+0x27e>
  73723. 801de72: bf00 nop
  73724. 801de74: 0802ed10 .word 0x0802ed10
  73725. 801de78: 0802f040 .word 0x0802f040
  73726. 801de7c: 0802ed5c .word 0x0802ed5c
  73727. 801de80: 0802f05c .word 0x0802f05c
  73728. 801de84: 2402aed0 .word 0x2402aed0
  73729. 801de88: 2402aec4 .word 0x2402aec4
  73730. 801de8c: 2402aec8 .word 0x2402aec8
  73731. 801de90: 2402aeb4 .word 0x2402aeb4
  73732. 801de94: 2402aece .word 0x2402aece
  73733. 801de98: 2302 movs r3, #2
  73734. 801de9a: f887 302d strb.w r3, [r7, #45] @ 0x2d
  73735. /* RFC 3465, section 2.2 Slow Start */
  73736. increase = LWIP_MIN(acked, (tcpwnd_size_t)(num_seg * pcb->mss));
  73737. 801de9e: f897 302d ldrb.w r3, [r7, #45] @ 0x2d
  73738. 801dea2: b29a uxth r2, r3
  73739. 801dea4: 687b ldr r3, [r7, #4]
  73740. 801dea6: 8e5b ldrh r3, [r3, #50] @ 0x32
  73741. 801dea8: fb12 f303 smulbb r3, r2, r3
  73742. 801deac: b29b uxth r3, r3
  73743. 801deae: 8dfa ldrh r2, [r7, #46] @ 0x2e
  73744. 801deb0: 4293 cmp r3, r2
  73745. 801deb2: bf28 it cs
  73746. 801deb4: 4613 movcs r3, r2
  73747. 801deb6: 857b strh r3, [r7, #42] @ 0x2a
  73748. TCP_WND_INC(pcb->cwnd, increase);
  73749. 801deb8: 687b ldr r3, [r7, #4]
  73750. 801deba: f8b3 2048 ldrh.w r2, [r3, #72] @ 0x48
  73751. 801debe: 8d7b ldrh r3, [r7, #42] @ 0x2a
  73752. 801dec0: 4413 add r3, r2
  73753. 801dec2: b29a uxth r2, r3
  73754. 801dec4: 687b ldr r3, [r7, #4]
  73755. 801dec6: f8b3 3048 ldrh.w r3, [r3, #72] @ 0x48
  73756. 801deca: 429a cmp r2, r3
  73757. 801decc: d309 bcc.n 801dee2 <tcp_receive+0x2c6>
  73758. 801dece: 687b ldr r3, [r7, #4]
  73759. 801ded0: f8b3 2048 ldrh.w r2, [r3, #72] @ 0x48
  73760. 801ded4: 8d7b ldrh r3, [r7, #42] @ 0x2a
  73761. 801ded6: 4413 add r3, r2
  73762. 801ded8: b29a uxth r2, r3
  73763. 801deda: 687b ldr r3, [r7, #4]
  73764. 801dedc: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  73765. 801dee0: e04e b.n 801df80 <tcp_receive+0x364>
  73766. 801dee2: 687b ldr r3, [r7, #4]
  73767. 801dee4: f64f 72ff movw r2, #65535 @ 0xffff
  73768. 801dee8: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  73769. 801deec: e048 b.n 801df80 <tcp_receive+0x364>
  73770. LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"TCPWNDSIZE_F"\n", pcb->cwnd));
  73771. } else {
  73772. /* RFC 3465, section 2.1 Congestion Avoidance */
  73773. TCP_WND_INC(pcb->bytes_acked, acked);
  73774. 801deee: 687b ldr r3, [r7, #4]
  73775. 801def0: f8b3 206a ldrh.w r2, [r3, #106] @ 0x6a
  73776. 801def4: 8dfb ldrh r3, [r7, #46] @ 0x2e
  73777. 801def6: 4413 add r3, r2
  73778. 801def8: b29a uxth r2, r3
  73779. 801defa: 687b ldr r3, [r7, #4]
  73780. 801defc: f8b3 306a ldrh.w r3, [r3, #106] @ 0x6a
  73781. 801df00: 429a cmp r2, r3
  73782. 801df02: d309 bcc.n 801df18 <tcp_receive+0x2fc>
  73783. 801df04: 687b ldr r3, [r7, #4]
  73784. 801df06: f8b3 206a ldrh.w r2, [r3, #106] @ 0x6a
  73785. 801df0a: 8dfb ldrh r3, [r7, #46] @ 0x2e
  73786. 801df0c: 4413 add r3, r2
  73787. 801df0e: b29a uxth r2, r3
  73788. 801df10: 687b ldr r3, [r7, #4]
  73789. 801df12: f8a3 206a strh.w r2, [r3, #106] @ 0x6a
  73790. 801df16: e004 b.n 801df22 <tcp_receive+0x306>
  73791. 801df18: 687b ldr r3, [r7, #4]
  73792. 801df1a: f64f 72ff movw r2, #65535 @ 0xffff
  73793. 801df1e: f8a3 206a strh.w r2, [r3, #106] @ 0x6a
  73794. if (pcb->bytes_acked >= pcb->cwnd) {
  73795. 801df22: 687b ldr r3, [r7, #4]
  73796. 801df24: f8b3 206a ldrh.w r2, [r3, #106] @ 0x6a
  73797. 801df28: 687b ldr r3, [r7, #4]
  73798. 801df2a: f8b3 3048 ldrh.w r3, [r3, #72] @ 0x48
  73799. 801df2e: 429a cmp r2, r3
  73800. 801df30: d326 bcc.n 801df80 <tcp_receive+0x364>
  73801. pcb->bytes_acked = (tcpwnd_size_t)(pcb->bytes_acked - pcb->cwnd);
  73802. 801df32: 687b ldr r3, [r7, #4]
  73803. 801df34: f8b3 206a ldrh.w r2, [r3, #106] @ 0x6a
  73804. 801df38: 687b ldr r3, [r7, #4]
  73805. 801df3a: f8b3 3048 ldrh.w r3, [r3, #72] @ 0x48
  73806. 801df3e: 1ad3 subs r3, r2, r3
  73807. 801df40: b29a uxth r2, r3
  73808. 801df42: 687b ldr r3, [r7, #4]
  73809. 801df44: f8a3 206a strh.w r2, [r3, #106] @ 0x6a
  73810. TCP_WND_INC(pcb->cwnd, pcb->mss);
  73811. 801df48: 687b ldr r3, [r7, #4]
  73812. 801df4a: f8b3 2048 ldrh.w r2, [r3, #72] @ 0x48
  73813. 801df4e: 687b ldr r3, [r7, #4]
  73814. 801df50: 8e5b ldrh r3, [r3, #50] @ 0x32
  73815. 801df52: 4413 add r3, r2
  73816. 801df54: b29a uxth r2, r3
  73817. 801df56: 687b ldr r3, [r7, #4]
  73818. 801df58: f8b3 3048 ldrh.w r3, [r3, #72] @ 0x48
  73819. 801df5c: 429a cmp r2, r3
  73820. 801df5e: d30a bcc.n 801df76 <tcp_receive+0x35a>
  73821. 801df60: 687b ldr r3, [r7, #4]
  73822. 801df62: f8b3 2048 ldrh.w r2, [r3, #72] @ 0x48
  73823. 801df66: 687b ldr r3, [r7, #4]
  73824. 801df68: 8e5b ldrh r3, [r3, #50] @ 0x32
  73825. 801df6a: 4413 add r3, r2
  73826. 801df6c: b29a uxth r2, r3
  73827. 801df6e: 687b ldr r3, [r7, #4]
  73828. 801df70: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  73829. 801df74: e004 b.n 801df80 <tcp_receive+0x364>
  73830. 801df76: 687b ldr r3, [r7, #4]
  73831. 801df78: f64f 72ff movw r2, #65535 @ 0xffff
  73832. 801df7c: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  73833. pcb->unacked != NULL ?
  73834. lwip_ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked) : 0));
  73835. /* Remove segment from the unacknowledged list if the incoming
  73836. ACK acknowledges them. */
  73837. pcb->unacked = tcp_free_acked_segments(pcb, pcb->unacked, "unacked", pcb->unsent);
  73838. 801df80: 687b ldr r3, [r7, #4]
  73839. 801df82: 6f19 ldr r1, [r3, #112] @ 0x70
  73840. 801df84: 687b ldr r3, [r7, #4]
  73841. 801df86: 6edb ldr r3, [r3, #108] @ 0x6c
  73842. 801df88: 4a98 ldr r2, [pc, #608] @ (801e1ec <tcp_receive+0x5d0>)
  73843. 801df8a: 6878 ldr r0, [r7, #4]
  73844. 801df8c: f7ff fdca bl 801db24 <tcp_free_acked_segments>
  73845. 801df90: 4602 mov r2, r0
  73846. 801df92: 687b ldr r3, [r7, #4]
  73847. 801df94: 671a str r2, [r3, #112] @ 0x70
  73848. on the list are acknowledged by the ACK. This may seem
  73849. strange since an "unsent" segment shouldn't be acked. The
  73850. rationale is that lwIP puts all outstanding segments on the
  73851. ->unsent list after a retransmission, so these segments may
  73852. in fact have been sent once. */
  73853. pcb->unsent = tcp_free_acked_segments(pcb, pcb->unsent, "unsent", pcb->unacked);
  73854. 801df96: 687b ldr r3, [r7, #4]
  73855. 801df98: 6ed9 ldr r1, [r3, #108] @ 0x6c
  73856. 801df9a: 687b ldr r3, [r7, #4]
  73857. 801df9c: 6f1b ldr r3, [r3, #112] @ 0x70
  73858. 801df9e: 4a94 ldr r2, [pc, #592] @ (801e1f0 <tcp_receive+0x5d4>)
  73859. 801dfa0: 6878 ldr r0, [r7, #4]
  73860. 801dfa2: f7ff fdbf bl 801db24 <tcp_free_acked_segments>
  73861. 801dfa6: 4602 mov r2, r0
  73862. 801dfa8: 687b ldr r3, [r7, #4]
  73863. 801dfaa: 66da str r2, [r3, #108] @ 0x6c
  73864. /* If there's nothing left to acknowledge, stop the retransmit
  73865. timer, otherwise reset it to start again */
  73866. if (pcb->unacked == NULL) {
  73867. 801dfac: 687b ldr r3, [r7, #4]
  73868. 801dfae: 6f1b ldr r3, [r3, #112] @ 0x70
  73869. 801dfb0: 2b00 cmp r3, #0
  73870. 801dfb2: d104 bne.n 801dfbe <tcp_receive+0x3a2>
  73871. pcb->rtime = -1;
  73872. 801dfb4: 687b ldr r3, [r7, #4]
  73873. 801dfb6: f64f 72ff movw r2, #65535 @ 0xffff
  73874. 801dfba: 861a strh r2, [r3, #48] @ 0x30
  73875. 801dfbc: e002 b.n 801dfc4 <tcp_receive+0x3a8>
  73876. } else {
  73877. pcb->rtime = 0;
  73878. 801dfbe: 687b ldr r3, [r7, #4]
  73879. 801dfc0: 2200 movs r2, #0
  73880. 801dfc2: 861a strh r2, [r3, #48] @ 0x30
  73881. }
  73882. pcb->polltmr = 0;
  73883. 801dfc4: 687b ldr r3, [r7, #4]
  73884. 801dfc6: 2200 movs r2, #0
  73885. 801dfc8: 771a strb r2, [r3, #28]
  73886. #if TCP_OVERSIZE
  73887. if (pcb->unsent == NULL) {
  73888. 801dfca: 687b ldr r3, [r7, #4]
  73889. 801dfcc: 6edb ldr r3, [r3, #108] @ 0x6c
  73890. 801dfce: 2b00 cmp r3, #0
  73891. 801dfd0: d103 bne.n 801dfda <tcp_receive+0x3be>
  73892. pcb->unsent_oversize = 0;
  73893. 801dfd2: 687b ldr r3, [r7, #4]
  73894. 801dfd4: 2200 movs r2, #0
  73895. 801dfd6: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  73896. /* Inform neighbor reachability of forward progress. */
  73897. nd6_reachability_hint(ip6_current_src_addr());
  73898. }
  73899. #endif /* LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS*/
  73900. pcb->snd_buf = (tcpwnd_size_t)(pcb->snd_buf + recv_acked);
  73901. 801dfda: 687b ldr r3, [r7, #4]
  73902. 801dfdc: f8b3 2064 ldrh.w r2, [r3, #100] @ 0x64
  73903. 801dfe0: 4b84 ldr r3, [pc, #528] @ (801e1f4 <tcp_receive+0x5d8>)
  73904. 801dfe2: 881b ldrh r3, [r3, #0]
  73905. 801dfe4: 4413 add r3, r2
  73906. 801dfe6: b29a uxth r2, r3
  73907. 801dfe8: 687b ldr r3, [r7, #4]
  73908. 801dfea: f8a3 2064 strh.w r2, [r3, #100] @ 0x64
  73909. /* check if this ACK ends our retransmission of in-flight data */
  73910. if (pcb->flags & TF_RTO) {
  73911. 801dfee: 687b ldr r3, [r7, #4]
  73912. 801dff0: 8b5b ldrh r3, [r3, #26]
  73913. 801dff2: f403 6300 and.w r3, r3, #2048 @ 0x800
  73914. 801dff6: 2b00 cmp r3, #0
  73915. 801dff8: d035 beq.n 801e066 <tcp_receive+0x44a>
  73916. /* RTO is done if
  73917. 1) both queues are empty or
  73918. 2) unacked is empty and unsent head contains data not part of RTO or
  73919. 3) unacked head contains data not part of RTO */
  73920. if (pcb->unacked == NULL) {
  73921. 801dffa: 687b ldr r3, [r7, #4]
  73922. 801dffc: 6f1b ldr r3, [r3, #112] @ 0x70
  73923. 801dffe: 2b00 cmp r3, #0
  73924. 801e000: d118 bne.n 801e034 <tcp_receive+0x418>
  73925. if ((pcb->unsent == NULL) ||
  73926. 801e002: 687b ldr r3, [r7, #4]
  73927. 801e004: 6edb ldr r3, [r3, #108] @ 0x6c
  73928. 801e006: 2b00 cmp r3, #0
  73929. 801e008: d00c beq.n 801e024 <tcp_receive+0x408>
  73930. (TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unsent->tcphdr->seqno)))) {
  73931. 801e00a: 687b ldr r3, [r7, #4]
  73932. 801e00c: 6cdc ldr r4, [r3, #76] @ 0x4c
  73933. 801e00e: 687b ldr r3, [r7, #4]
  73934. 801e010: 6edb ldr r3, [r3, #108] @ 0x6c
  73935. 801e012: 691b ldr r3, [r3, #16]
  73936. 801e014: 685b ldr r3, [r3, #4]
  73937. 801e016: 4618 mov r0, r3
  73938. 801e018: f7fa fd93 bl 8018b42 <lwip_htonl>
  73939. 801e01c: 4603 mov r3, r0
  73940. 801e01e: 1ae3 subs r3, r4, r3
  73941. if ((pcb->unsent == NULL) ||
  73942. 801e020: 2b00 cmp r3, #0
  73943. 801e022: dc20 bgt.n 801e066 <tcp_receive+0x44a>
  73944. tcp_clear_flags(pcb, TF_RTO);
  73945. 801e024: 687b ldr r3, [r7, #4]
  73946. 801e026: 8b5b ldrh r3, [r3, #26]
  73947. 801e028: f423 6300 bic.w r3, r3, #2048 @ 0x800
  73948. 801e02c: b29a uxth r2, r3
  73949. 801e02e: 687b ldr r3, [r7, #4]
  73950. 801e030: 835a strh r2, [r3, #26]
  73951. } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
  73952. 801e032: e018 b.n 801e066 <tcp_receive+0x44a>
  73953. }
  73954. } else if (TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unacked->tcphdr->seqno))) {
  73955. 801e034: 687b ldr r3, [r7, #4]
  73956. 801e036: 6cdc ldr r4, [r3, #76] @ 0x4c
  73957. 801e038: 687b ldr r3, [r7, #4]
  73958. 801e03a: 6f1b ldr r3, [r3, #112] @ 0x70
  73959. 801e03c: 691b ldr r3, [r3, #16]
  73960. 801e03e: 685b ldr r3, [r3, #4]
  73961. 801e040: 4618 mov r0, r3
  73962. 801e042: f7fa fd7e bl 8018b42 <lwip_htonl>
  73963. 801e046: 4603 mov r3, r0
  73964. 801e048: 1ae3 subs r3, r4, r3
  73965. 801e04a: 2b00 cmp r3, #0
  73966. 801e04c: dc0b bgt.n 801e066 <tcp_receive+0x44a>
  73967. tcp_clear_flags(pcb, TF_RTO);
  73968. 801e04e: 687b ldr r3, [r7, #4]
  73969. 801e050: 8b5b ldrh r3, [r3, #26]
  73970. 801e052: f423 6300 bic.w r3, r3, #2048 @ 0x800
  73971. 801e056: b29a uxth r2, r3
  73972. 801e058: 687b ldr r3, [r7, #4]
  73973. 801e05a: 835a strh r2, [r3, #26]
  73974. } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
  73975. 801e05c: e003 b.n 801e066 <tcp_receive+0x44a>
  73976. }
  73977. }
  73978. /* End of ACK for new data processing. */
  73979. } else {
  73980. /* Out of sequence ACK, didn't really ack anything */
  73981. tcp_send_empty_ack(pcb);
  73982. 801e05e: 6878 ldr r0, [r7, #4]
  73983. 801e060: f002 fc3c bl 80208dc <tcp_send_empty_ack>
  73984. 801e064: e000 b.n 801e068 <tcp_receive+0x44c>
  73985. } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
  73986. 801e066: bf00 nop
  73987. pcb->rttest, pcb->rtseq, ackno));
  73988. /* RTT estimation calculations. This is done by checking if the
  73989. incoming segment acknowledges the segment we use to take a
  73990. round-trip time measurement. */
  73991. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  73992. 801e068: 687b ldr r3, [r7, #4]
  73993. 801e06a: 6b5b ldr r3, [r3, #52] @ 0x34
  73994. 801e06c: 2b00 cmp r3, #0
  73995. 801e06e: d05b beq.n 801e128 <tcp_receive+0x50c>
  73996. 801e070: 687b ldr r3, [r7, #4]
  73997. 801e072: 6b9a ldr r2, [r3, #56] @ 0x38
  73998. 801e074: 4b60 ldr r3, [pc, #384] @ (801e1f8 <tcp_receive+0x5dc>)
  73999. 801e076: 681b ldr r3, [r3, #0]
  74000. 801e078: 1ad3 subs r3, r2, r3
  74001. 801e07a: 2b00 cmp r3, #0
  74002. 801e07c: da54 bge.n 801e128 <tcp_receive+0x50c>
  74003. /* diff between this shouldn't exceed 32K since this are tcp timer ticks
  74004. and a round-trip shouldn't be that long... */
  74005. m = (s16_t)(tcp_ticks - pcb->rttest);
  74006. 801e07e: 4b5f ldr r3, [pc, #380] @ (801e1fc <tcp_receive+0x5e0>)
  74007. 801e080: 681b ldr r3, [r3, #0]
  74008. 801e082: b29a uxth r2, r3
  74009. 801e084: 687b ldr r3, [r7, #4]
  74010. 801e086: 6b5b ldr r3, [r3, #52] @ 0x34
  74011. 801e088: b29b uxth r3, r3
  74012. 801e08a: 1ad3 subs r3, r2, r3
  74013. 801e08c: b29b uxth r3, r3
  74014. 801e08e: f8a7 304e strh.w r3, [r7, #78] @ 0x4e
  74015. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  74016. m, (u16_t)(m * TCP_SLOW_INTERVAL)));
  74017. /* This is taken directly from VJs original code in his paper */
  74018. m = (s16_t)(m - (pcb->sa >> 3));
  74019. 801e092: f8b7 204e ldrh.w r2, [r7, #78] @ 0x4e
  74020. 801e096: 687b ldr r3, [r7, #4]
  74021. 801e098: f9b3 303c ldrsh.w r3, [r3, #60] @ 0x3c
  74022. 801e09c: 10db asrs r3, r3, #3
  74023. 801e09e: b21b sxth r3, r3
  74024. 801e0a0: b29b uxth r3, r3
  74025. 801e0a2: 1ad3 subs r3, r2, r3
  74026. 801e0a4: b29b uxth r3, r3
  74027. 801e0a6: f8a7 304e strh.w r3, [r7, #78] @ 0x4e
  74028. pcb->sa = (s16_t)(pcb->sa + m);
  74029. 801e0aa: 687b ldr r3, [r7, #4]
  74030. 801e0ac: f9b3 303c ldrsh.w r3, [r3, #60] @ 0x3c
  74031. 801e0b0: b29a uxth r2, r3
  74032. 801e0b2: f8b7 304e ldrh.w r3, [r7, #78] @ 0x4e
  74033. 801e0b6: 4413 add r3, r2
  74034. 801e0b8: b29b uxth r3, r3
  74035. 801e0ba: b21a sxth r2, r3
  74036. 801e0bc: 687b ldr r3, [r7, #4]
  74037. 801e0be: 879a strh r2, [r3, #60] @ 0x3c
  74038. if (m < 0) {
  74039. 801e0c0: f9b7 304e ldrsh.w r3, [r7, #78] @ 0x4e
  74040. 801e0c4: 2b00 cmp r3, #0
  74041. 801e0c6: da05 bge.n 801e0d4 <tcp_receive+0x4b8>
  74042. m = (s16_t) - m;
  74043. 801e0c8: f8b7 304e ldrh.w r3, [r7, #78] @ 0x4e
  74044. 801e0cc: 425b negs r3, r3
  74045. 801e0ce: b29b uxth r3, r3
  74046. 801e0d0: f8a7 304e strh.w r3, [r7, #78] @ 0x4e
  74047. }
  74048. m = (s16_t)(m - (pcb->sv >> 2));
  74049. 801e0d4: f8b7 204e ldrh.w r2, [r7, #78] @ 0x4e
  74050. 801e0d8: 687b ldr r3, [r7, #4]
  74051. 801e0da: f9b3 303e ldrsh.w r3, [r3, #62] @ 0x3e
  74052. 801e0de: 109b asrs r3, r3, #2
  74053. 801e0e0: b21b sxth r3, r3
  74054. 801e0e2: b29b uxth r3, r3
  74055. 801e0e4: 1ad3 subs r3, r2, r3
  74056. 801e0e6: b29b uxth r3, r3
  74057. 801e0e8: f8a7 304e strh.w r3, [r7, #78] @ 0x4e
  74058. pcb->sv = (s16_t)(pcb->sv + m);
  74059. 801e0ec: 687b ldr r3, [r7, #4]
  74060. 801e0ee: f9b3 303e ldrsh.w r3, [r3, #62] @ 0x3e
  74061. 801e0f2: b29a uxth r2, r3
  74062. 801e0f4: f8b7 304e ldrh.w r3, [r7, #78] @ 0x4e
  74063. 801e0f8: 4413 add r3, r2
  74064. 801e0fa: b29b uxth r3, r3
  74065. 801e0fc: b21a sxth r2, r3
  74066. 801e0fe: 687b ldr r3, [r7, #4]
  74067. 801e100: 87da strh r2, [r3, #62] @ 0x3e
  74068. pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv);
  74069. 801e102: 687b ldr r3, [r7, #4]
  74070. 801e104: f9b3 303c ldrsh.w r3, [r3, #60] @ 0x3c
  74071. 801e108: 10db asrs r3, r3, #3
  74072. 801e10a: b21b sxth r3, r3
  74073. 801e10c: b29a uxth r2, r3
  74074. 801e10e: 687b ldr r3, [r7, #4]
  74075. 801e110: f9b3 303e ldrsh.w r3, [r3, #62] @ 0x3e
  74076. 801e114: b29b uxth r3, r3
  74077. 801e116: 4413 add r3, r2
  74078. 801e118: b29b uxth r3, r3
  74079. 801e11a: b21a sxth r2, r3
  74080. 801e11c: 687b ldr r3, [r7, #4]
  74081. 801e11e: f8a3 2040 strh.w r2, [r3, #64] @ 0x40
  74082. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n",
  74083. pcb->rto, (u16_t)(pcb->rto * TCP_SLOW_INTERVAL)));
  74084. pcb->rttest = 0;
  74085. 801e122: 687b ldr r3, [r7, #4]
  74086. 801e124: 2200 movs r2, #0
  74087. 801e126: 635a str r2, [r3, #52] @ 0x34
  74088. /* If the incoming segment contains data, we must process it
  74089. further unless the pcb already received a FIN.
  74090. (RFC 793, chapter 3.9, "SEGMENT ARRIVES" in states CLOSE-WAIT, CLOSING,
  74091. LAST-ACK and TIME-WAIT: "Ignore the segment text.") */
  74092. if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) {
  74093. 801e128: 4b35 ldr r3, [pc, #212] @ (801e200 <tcp_receive+0x5e4>)
  74094. 801e12a: 881b ldrh r3, [r3, #0]
  74095. 801e12c: 2b00 cmp r3, #0
  74096. 801e12e: f000 84df beq.w 801eaf0 <tcp_receive+0xed4>
  74097. 801e132: 687b ldr r3, [r7, #4]
  74098. 801e134: 7d1b ldrb r3, [r3, #20]
  74099. 801e136: 2b06 cmp r3, #6
  74100. 801e138: f200 84da bhi.w 801eaf0 <tcp_receive+0xed4>
  74101. this if the sequence number of the incoming segment is less
  74102. than rcv_nxt, and the sequence number plus the length of the
  74103. segment is larger than rcv_nxt. */
  74104. /* if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) {
  74105. if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/
  74106. if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)) {
  74107. 801e13c: 687b ldr r3, [r7, #4]
  74108. 801e13e: 6a5a ldr r2, [r3, #36] @ 0x24
  74109. 801e140: 4b30 ldr r3, [pc, #192] @ (801e204 <tcp_receive+0x5e8>)
  74110. 801e142: 681b ldr r3, [r3, #0]
  74111. 801e144: 1ad3 subs r3, r2, r3
  74112. 801e146: 3b01 subs r3, #1
  74113. 801e148: 2b00 cmp r3, #0
  74114. 801e14a: f2c0 808f blt.w 801e26c <tcp_receive+0x650>
  74115. 801e14e: 687b ldr r3, [r7, #4]
  74116. 801e150: 6a5a ldr r2, [r3, #36] @ 0x24
  74117. 801e152: 4b2b ldr r3, [pc, #172] @ (801e200 <tcp_receive+0x5e4>)
  74118. 801e154: 881b ldrh r3, [r3, #0]
  74119. 801e156: 4619 mov r1, r3
  74120. 801e158: 4b2a ldr r3, [pc, #168] @ (801e204 <tcp_receive+0x5e8>)
  74121. 801e15a: 681b ldr r3, [r3, #0]
  74122. 801e15c: 440b add r3, r1
  74123. 801e15e: 1ad3 subs r3, r2, r3
  74124. 801e160: 3301 adds r3, #1
  74125. 801e162: 2b00 cmp r3, #0
  74126. 801e164: f300 8082 bgt.w 801e26c <tcp_receive+0x650>
  74127. After we are done with adjusting the pbuf pointers we must
  74128. adjust the ->data pointer in the seg and the segment
  74129. length.*/
  74130. struct pbuf *p = inseg.p;
  74131. 801e168: 4b27 ldr r3, [pc, #156] @ (801e208 <tcp_receive+0x5ec>)
  74132. 801e16a: 685b ldr r3, [r3, #4]
  74133. 801e16c: 647b str r3, [r7, #68] @ 0x44
  74134. u32_t off32 = pcb->rcv_nxt - seqno;
  74135. 801e16e: 687b ldr r3, [r7, #4]
  74136. 801e170: 6a5a ldr r2, [r3, #36] @ 0x24
  74137. 801e172: 4b24 ldr r3, [pc, #144] @ (801e204 <tcp_receive+0x5e8>)
  74138. 801e174: 681b ldr r3, [r3, #0]
  74139. 801e176: 1ad3 subs r3, r2, r3
  74140. 801e178: 627b str r3, [r7, #36] @ 0x24
  74141. u16_t new_tot_len, off;
  74142. LWIP_ASSERT("inseg.p != NULL", inseg.p);
  74143. 801e17a: 4b23 ldr r3, [pc, #140] @ (801e208 <tcp_receive+0x5ec>)
  74144. 801e17c: 685b ldr r3, [r3, #4]
  74145. 801e17e: 2b00 cmp r3, #0
  74146. 801e180: d106 bne.n 801e190 <tcp_receive+0x574>
  74147. 801e182: 4b22 ldr r3, [pc, #136] @ (801e20c <tcp_receive+0x5f0>)
  74148. 801e184: f240 5294 movw r2, #1428 @ 0x594
  74149. 801e188: 4921 ldr r1, [pc, #132] @ (801e210 <tcp_receive+0x5f4>)
  74150. 801e18a: 4822 ldr r0, [pc, #136] @ (801e214 <tcp_receive+0x5f8>)
  74151. 801e18c: f00b fc1e bl 80299cc <iprintf>
  74152. LWIP_ASSERT("insane offset!", (off32 < 0xffff));
  74153. 801e190: 6a7b ldr r3, [r7, #36] @ 0x24
  74154. 801e192: f64f 72fe movw r2, #65534 @ 0xfffe
  74155. 801e196: 4293 cmp r3, r2
  74156. 801e198: d906 bls.n 801e1a8 <tcp_receive+0x58c>
  74157. 801e19a: 4b1c ldr r3, [pc, #112] @ (801e20c <tcp_receive+0x5f0>)
  74158. 801e19c: f240 5295 movw r2, #1429 @ 0x595
  74159. 801e1a0: 491d ldr r1, [pc, #116] @ (801e218 <tcp_receive+0x5fc>)
  74160. 801e1a2: 481c ldr r0, [pc, #112] @ (801e214 <tcp_receive+0x5f8>)
  74161. 801e1a4: f00b fc12 bl 80299cc <iprintf>
  74162. off = (u16_t)off32;
  74163. 801e1a8: 6a7b ldr r3, [r7, #36] @ 0x24
  74164. 801e1aa: f8a7 3042 strh.w r3, [r7, #66] @ 0x42
  74165. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  74166. 801e1ae: 4b16 ldr r3, [pc, #88] @ (801e208 <tcp_receive+0x5ec>)
  74167. 801e1b0: 685b ldr r3, [r3, #4]
  74168. 801e1b2: 891b ldrh r3, [r3, #8]
  74169. 801e1b4: f8b7 2042 ldrh.w r2, [r7, #66] @ 0x42
  74170. 801e1b8: 429a cmp r2, r3
  74171. 801e1ba: d906 bls.n 801e1ca <tcp_receive+0x5ae>
  74172. 801e1bc: 4b13 ldr r3, [pc, #76] @ (801e20c <tcp_receive+0x5f0>)
  74173. 801e1be: f240 5297 movw r2, #1431 @ 0x597
  74174. 801e1c2: 4916 ldr r1, [pc, #88] @ (801e21c <tcp_receive+0x600>)
  74175. 801e1c4: 4813 ldr r0, [pc, #76] @ (801e214 <tcp_receive+0x5f8>)
  74176. 801e1c6: f00b fc01 bl 80299cc <iprintf>
  74177. inseg.len -= off;
  74178. 801e1ca: 4b0f ldr r3, [pc, #60] @ (801e208 <tcp_receive+0x5ec>)
  74179. 801e1cc: 891a ldrh r2, [r3, #8]
  74180. 801e1ce: f8b7 3042 ldrh.w r3, [r7, #66] @ 0x42
  74181. 801e1d2: 1ad3 subs r3, r2, r3
  74182. 801e1d4: b29a uxth r2, r3
  74183. 801e1d6: 4b0c ldr r3, [pc, #48] @ (801e208 <tcp_receive+0x5ec>)
  74184. 801e1d8: 811a strh r2, [r3, #8]
  74185. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  74186. 801e1da: 4b0b ldr r3, [pc, #44] @ (801e208 <tcp_receive+0x5ec>)
  74187. 801e1dc: 685b ldr r3, [r3, #4]
  74188. 801e1de: 891a ldrh r2, [r3, #8]
  74189. 801e1e0: f8b7 3042 ldrh.w r3, [r7, #66] @ 0x42
  74190. 801e1e4: 1ad3 subs r3, r2, r3
  74191. 801e1e6: 847b strh r3, [r7, #34] @ 0x22
  74192. while (p->len < off) {
  74193. 801e1e8: e02a b.n 801e240 <tcp_receive+0x624>
  74194. 801e1ea: bf00 nop
  74195. 801e1ec: 0802f078 .word 0x0802f078
  74196. 801e1f0: 0802f080 .word 0x0802f080
  74197. 801e1f4: 2402aecc .word 0x2402aecc
  74198. 801e1f8: 2402aec8 .word 0x2402aec8
  74199. 801e1fc: 2402ae88 .word 0x2402ae88
  74200. 801e200: 2402aece .word 0x2402aece
  74201. 801e204: 2402aec4 .word 0x2402aec4
  74202. 801e208: 2402aea0 .word 0x2402aea0
  74203. 801e20c: 0802ed10 .word 0x0802ed10
  74204. 801e210: 0802f088 .word 0x0802f088
  74205. 801e214: 0802ed5c .word 0x0802ed5c
  74206. 801e218: 0802f098 .word 0x0802f098
  74207. 801e21c: 0802f0a8 .word 0x0802f0a8
  74208. off -= p->len;
  74209. 801e220: 6c7b ldr r3, [r7, #68] @ 0x44
  74210. 801e222: 895b ldrh r3, [r3, #10]
  74211. 801e224: f8b7 2042 ldrh.w r2, [r7, #66] @ 0x42
  74212. 801e228: 1ad3 subs r3, r2, r3
  74213. 801e22a: f8a7 3042 strh.w r3, [r7, #66] @ 0x42
  74214. /* all pbufs up to and including this one have len==0, so tot_len is equal */
  74215. p->tot_len = new_tot_len;
  74216. 801e22e: 6c7b ldr r3, [r7, #68] @ 0x44
  74217. 801e230: 8c7a ldrh r2, [r7, #34] @ 0x22
  74218. 801e232: 811a strh r2, [r3, #8]
  74219. p->len = 0;
  74220. 801e234: 6c7b ldr r3, [r7, #68] @ 0x44
  74221. 801e236: 2200 movs r2, #0
  74222. 801e238: 815a strh r2, [r3, #10]
  74223. p = p->next;
  74224. 801e23a: 6c7b ldr r3, [r7, #68] @ 0x44
  74225. 801e23c: 681b ldr r3, [r3, #0]
  74226. 801e23e: 647b str r3, [r7, #68] @ 0x44
  74227. while (p->len < off) {
  74228. 801e240: 6c7b ldr r3, [r7, #68] @ 0x44
  74229. 801e242: 895b ldrh r3, [r3, #10]
  74230. 801e244: f8b7 2042 ldrh.w r2, [r7, #66] @ 0x42
  74231. 801e248: 429a cmp r2, r3
  74232. 801e24a: d8e9 bhi.n 801e220 <tcp_receive+0x604>
  74233. }
  74234. /* cannot fail... */
  74235. pbuf_remove_header(p, off);
  74236. 801e24c: f8b7 3042 ldrh.w r3, [r7, #66] @ 0x42
  74237. 801e250: 4619 mov r1, r3
  74238. 801e252: 6c78 ldr r0, [r7, #68] @ 0x44
  74239. 801e254: f7fc f88a bl 801a36c <pbuf_remove_header>
  74240. inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;
  74241. 801e258: 687b ldr r3, [r7, #4]
  74242. 801e25a: 6a5b ldr r3, [r3, #36] @ 0x24
  74243. 801e25c: 4a90 ldr r2, [pc, #576] @ (801e4a0 <tcp_receive+0x884>)
  74244. 801e25e: 6013 str r3, [r2, #0]
  74245. 801e260: 4b90 ldr r3, [pc, #576] @ (801e4a4 <tcp_receive+0x888>)
  74246. 801e262: 691b ldr r3, [r3, #16]
  74247. 801e264: 4a8e ldr r2, [pc, #568] @ (801e4a0 <tcp_receive+0x884>)
  74248. 801e266: 6812 ldr r2, [r2, #0]
  74249. 801e268: 605a str r2, [r3, #4]
  74250. if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)) {
  74251. 801e26a: e00d b.n 801e288 <tcp_receive+0x66c>
  74252. } else {
  74253. if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) {
  74254. 801e26c: 4b8c ldr r3, [pc, #560] @ (801e4a0 <tcp_receive+0x884>)
  74255. 801e26e: 681a ldr r2, [r3, #0]
  74256. 801e270: 687b ldr r3, [r7, #4]
  74257. 801e272: 6a5b ldr r3, [r3, #36] @ 0x24
  74258. 801e274: 1ad3 subs r3, r2, r3
  74259. 801e276: 2b00 cmp r3, #0
  74260. 801e278: da06 bge.n 801e288 <tcp_receive+0x66c>
  74261. /* the whole segment is < rcv_nxt */
  74262. /* must be a duplicate of a packet that has already been correctly handled */
  74263. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno));
  74264. tcp_ack_now(pcb);
  74265. 801e27a: 687b ldr r3, [r7, #4]
  74266. 801e27c: 8b5b ldrh r3, [r3, #26]
  74267. 801e27e: f043 0302 orr.w r3, r3, #2
  74268. 801e282: b29a uxth r2, r3
  74269. 801e284: 687b ldr r3, [r7, #4]
  74270. 801e286: 835a strh r2, [r3, #26]
  74271. }
  74272. /* The sequence number must be within the window (above rcv_nxt
  74273. and below rcv_nxt + rcv_wnd) in order to be further
  74274. processed. */
  74275. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
  74276. 801e288: 4b85 ldr r3, [pc, #532] @ (801e4a0 <tcp_receive+0x884>)
  74277. 801e28a: 681a ldr r2, [r3, #0]
  74278. 801e28c: 687b ldr r3, [r7, #4]
  74279. 801e28e: 6a5b ldr r3, [r3, #36] @ 0x24
  74280. 801e290: 1ad3 subs r3, r2, r3
  74281. 801e292: 2b00 cmp r3, #0
  74282. 801e294: f2c0 8427 blt.w 801eae6 <tcp_receive+0xeca>
  74283. 801e298: 4b81 ldr r3, [pc, #516] @ (801e4a0 <tcp_receive+0x884>)
  74284. 801e29a: 681a ldr r2, [r3, #0]
  74285. 801e29c: 687b ldr r3, [r7, #4]
  74286. 801e29e: 6a5b ldr r3, [r3, #36] @ 0x24
  74287. 801e2a0: 6879 ldr r1, [r7, #4]
  74288. 801e2a2: 8d09 ldrh r1, [r1, #40] @ 0x28
  74289. 801e2a4: 440b add r3, r1
  74290. 801e2a6: 1ad3 subs r3, r2, r3
  74291. 801e2a8: 3301 adds r3, #1
  74292. 801e2aa: 2b00 cmp r3, #0
  74293. 801e2ac: f300 841b bgt.w 801eae6 <tcp_receive+0xeca>
  74294. pcb->rcv_nxt + pcb->rcv_wnd - 1)) {
  74295. if (pcb->rcv_nxt == seqno) {
  74296. 801e2b0: 687b ldr r3, [r7, #4]
  74297. 801e2b2: 6a5a ldr r2, [r3, #36] @ 0x24
  74298. 801e2b4: 4b7a ldr r3, [pc, #488] @ (801e4a0 <tcp_receive+0x884>)
  74299. 801e2b6: 681b ldr r3, [r3, #0]
  74300. 801e2b8: 429a cmp r2, r3
  74301. 801e2ba: f040 8298 bne.w 801e7ee <tcp_receive+0xbd2>
  74302. /* The incoming segment is the next in sequence. We check if
  74303. we have to trim the end of the segment and update rcv_nxt
  74304. and pass the data to the application. */
  74305. tcplen = TCP_TCPLEN(&inseg);
  74306. 801e2be: 4b79 ldr r3, [pc, #484] @ (801e4a4 <tcp_receive+0x888>)
  74307. 801e2c0: 891c ldrh r4, [r3, #8]
  74308. 801e2c2: 4b78 ldr r3, [pc, #480] @ (801e4a4 <tcp_receive+0x888>)
  74309. 801e2c4: 691b ldr r3, [r3, #16]
  74310. 801e2c6: 899b ldrh r3, [r3, #12]
  74311. 801e2c8: b29b uxth r3, r3
  74312. 801e2ca: 4618 mov r0, r3
  74313. 801e2cc: f7fa fc24 bl 8018b18 <lwip_htons>
  74314. 801e2d0: 4603 mov r3, r0
  74315. 801e2d2: b2db uxtb r3, r3
  74316. 801e2d4: f003 0303 and.w r3, r3, #3
  74317. 801e2d8: 2b00 cmp r3, #0
  74318. 801e2da: d001 beq.n 801e2e0 <tcp_receive+0x6c4>
  74319. 801e2dc: 2301 movs r3, #1
  74320. 801e2de: e000 b.n 801e2e2 <tcp_receive+0x6c6>
  74321. 801e2e0: 2300 movs r3, #0
  74322. 801e2e2: 4423 add r3, r4
  74323. 801e2e4: b29a uxth r2, r3
  74324. 801e2e6: 4b70 ldr r3, [pc, #448] @ (801e4a8 <tcp_receive+0x88c>)
  74325. 801e2e8: 801a strh r2, [r3, #0]
  74326. if (tcplen > pcb->rcv_wnd) {
  74327. 801e2ea: 687b ldr r3, [r7, #4]
  74328. 801e2ec: 8d1a ldrh r2, [r3, #40] @ 0x28
  74329. 801e2ee: 4b6e ldr r3, [pc, #440] @ (801e4a8 <tcp_receive+0x88c>)
  74330. 801e2f0: 881b ldrh r3, [r3, #0]
  74331. 801e2f2: 429a cmp r2, r3
  74332. 801e2f4: d274 bcs.n 801e3e0 <tcp_receive+0x7c4>
  74333. LWIP_DEBUGF(TCP_INPUT_DEBUG,
  74334. ("tcp_receive: other end overran receive window"
  74335. "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n",
  74336. seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
  74337. if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
  74338. 801e2f6: 4b6b ldr r3, [pc, #428] @ (801e4a4 <tcp_receive+0x888>)
  74339. 801e2f8: 691b ldr r3, [r3, #16]
  74340. 801e2fa: 899b ldrh r3, [r3, #12]
  74341. 801e2fc: b29b uxth r3, r3
  74342. 801e2fe: 4618 mov r0, r3
  74343. 801e300: f7fa fc0a bl 8018b18 <lwip_htons>
  74344. 801e304: 4603 mov r3, r0
  74345. 801e306: b2db uxtb r3, r3
  74346. 801e308: f003 0301 and.w r3, r3, #1
  74347. 801e30c: 2b00 cmp r3, #0
  74348. 801e30e: d01e beq.n 801e34e <tcp_receive+0x732>
  74349. /* Must remove the FIN from the header as we're trimming
  74350. * that byte of sequence-space from the packet */
  74351. TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) & ~(unsigned int)TCP_FIN);
  74352. 801e310: 4b64 ldr r3, [pc, #400] @ (801e4a4 <tcp_receive+0x888>)
  74353. 801e312: 691b ldr r3, [r3, #16]
  74354. 801e314: 899b ldrh r3, [r3, #12]
  74355. 801e316: b29b uxth r3, r3
  74356. 801e318: b21b sxth r3, r3
  74357. 801e31a: f423 537c bic.w r3, r3, #16128 @ 0x3f00
  74358. 801e31e: b21c sxth r4, r3
  74359. 801e320: 4b60 ldr r3, [pc, #384] @ (801e4a4 <tcp_receive+0x888>)
  74360. 801e322: 691b ldr r3, [r3, #16]
  74361. 801e324: 899b ldrh r3, [r3, #12]
  74362. 801e326: b29b uxth r3, r3
  74363. 801e328: 4618 mov r0, r3
  74364. 801e32a: f7fa fbf5 bl 8018b18 <lwip_htons>
  74365. 801e32e: 4603 mov r3, r0
  74366. 801e330: b2db uxtb r3, r3
  74367. 801e332: f003 033e and.w r3, r3, #62 @ 0x3e
  74368. 801e336: b29b uxth r3, r3
  74369. 801e338: 4618 mov r0, r3
  74370. 801e33a: f7fa fbed bl 8018b18 <lwip_htons>
  74371. 801e33e: 4603 mov r3, r0
  74372. 801e340: b21b sxth r3, r3
  74373. 801e342: 4323 orrs r3, r4
  74374. 801e344: b21a sxth r2, r3
  74375. 801e346: 4b57 ldr r3, [pc, #348] @ (801e4a4 <tcp_receive+0x888>)
  74376. 801e348: 691b ldr r3, [r3, #16]
  74377. 801e34a: b292 uxth r2, r2
  74378. 801e34c: 819a strh r2, [r3, #12]
  74379. }
  74380. /* Adjust length of segment to fit in the window. */
  74381. TCPWND_CHECK16(pcb->rcv_wnd);
  74382. inseg.len = (u16_t)pcb->rcv_wnd;
  74383. 801e34e: 687b ldr r3, [r7, #4]
  74384. 801e350: 8d1a ldrh r2, [r3, #40] @ 0x28
  74385. 801e352: 4b54 ldr r3, [pc, #336] @ (801e4a4 <tcp_receive+0x888>)
  74386. 801e354: 811a strh r2, [r3, #8]
  74387. if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
  74388. 801e356: 4b53 ldr r3, [pc, #332] @ (801e4a4 <tcp_receive+0x888>)
  74389. 801e358: 691b ldr r3, [r3, #16]
  74390. 801e35a: 899b ldrh r3, [r3, #12]
  74391. 801e35c: b29b uxth r3, r3
  74392. 801e35e: 4618 mov r0, r3
  74393. 801e360: f7fa fbda bl 8018b18 <lwip_htons>
  74394. 801e364: 4603 mov r3, r0
  74395. 801e366: b2db uxtb r3, r3
  74396. 801e368: f003 0302 and.w r3, r3, #2
  74397. 801e36c: 2b00 cmp r3, #0
  74398. 801e36e: d005 beq.n 801e37c <tcp_receive+0x760>
  74399. inseg.len -= 1;
  74400. 801e370: 4b4c ldr r3, [pc, #304] @ (801e4a4 <tcp_receive+0x888>)
  74401. 801e372: 891b ldrh r3, [r3, #8]
  74402. 801e374: 3b01 subs r3, #1
  74403. 801e376: b29a uxth r2, r3
  74404. 801e378: 4b4a ldr r3, [pc, #296] @ (801e4a4 <tcp_receive+0x888>)
  74405. 801e37a: 811a strh r2, [r3, #8]
  74406. }
  74407. pbuf_realloc(inseg.p, inseg.len);
  74408. 801e37c: 4b49 ldr r3, [pc, #292] @ (801e4a4 <tcp_receive+0x888>)
  74409. 801e37e: 685b ldr r3, [r3, #4]
  74410. 801e380: 4a48 ldr r2, [pc, #288] @ (801e4a4 <tcp_receive+0x888>)
  74411. 801e382: 8912 ldrh r2, [r2, #8]
  74412. 801e384: 4611 mov r1, r2
  74413. 801e386: 4618 mov r0, r3
  74414. 801e388: f7fb fef2 bl 801a170 <pbuf_realloc>
  74415. tcplen = TCP_TCPLEN(&inseg);
  74416. 801e38c: 4b45 ldr r3, [pc, #276] @ (801e4a4 <tcp_receive+0x888>)
  74417. 801e38e: 891c ldrh r4, [r3, #8]
  74418. 801e390: 4b44 ldr r3, [pc, #272] @ (801e4a4 <tcp_receive+0x888>)
  74419. 801e392: 691b ldr r3, [r3, #16]
  74420. 801e394: 899b ldrh r3, [r3, #12]
  74421. 801e396: b29b uxth r3, r3
  74422. 801e398: 4618 mov r0, r3
  74423. 801e39a: f7fa fbbd bl 8018b18 <lwip_htons>
  74424. 801e39e: 4603 mov r3, r0
  74425. 801e3a0: b2db uxtb r3, r3
  74426. 801e3a2: f003 0303 and.w r3, r3, #3
  74427. 801e3a6: 2b00 cmp r3, #0
  74428. 801e3a8: d001 beq.n 801e3ae <tcp_receive+0x792>
  74429. 801e3aa: 2301 movs r3, #1
  74430. 801e3ac: e000 b.n 801e3b0 <tcp_receive+0x794>
  74431. 801e3ae: 2300 movs r3, #0
  74432. 801e3b0: 4423 add r3, r4
  74433. 801e3b2: b29a uxth r2, r3
  74434. 801e3b4: 4b3c ldr r3, [pc, #240] @ (801e4a8 <tcp_receive+0x88c>)
  74435. 801e3b6: 801a strh r2, [r3, #0]
  74436. LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n",
  74437. 801e3b8: 4b3b ldr r3, [pc, #236] @ (801e4a8 <tcp_receive+0x88c>)
  74438. 801e3ba: 881b ldrh r3, [r3, #0]
  74439. 801e3bc: 461a mov r2, r3
  74440. 801e3be: 4b38 ldr r3, [pc, #224] @ (801e4a0 <tcp_receive+0x884>)
  74441. 801e3c0: 681b ldr r3, [r3, #0]
  74442. 801e3c2: 441a add r2, r3
  74443. 801e3c4: 687b ldr r3, [r7, #4]
  74444. 801e3c6: 6a5b ldr r3, [r3, #36] @ 0x24
  74445. 801e3c8: 6879 ldr r1, [r7, #4]
  74446. 801e3ca: 8d09 ldrh r1, [r1, #40] @ 0x28
  74447. 801e3cc: 440b add r3, r1
  74448. 801e3ce: 429a cmp r2, r3
  74449. 801e3d0: d006 beq.n 801e3e0 <tcp_receive+0x7c4>
  74450. 801e3d2: 4b36 ldr r3, [pc, #216] @ (801e4ac <tcp_receive+0x890>)
  74451. 801e3d4: f240 52cb movw r2, #1483 @ 0x5cb
  74452. 801e3d8: 4935 ldr r1, [pc, #212] @ (801e4b0 <tcp_receive+0x894>)
  74453. 801e3da: 4836 ldr r0, [pc, #216] @ (801e4b4 <tcp_receive+0x898>)
  74454. 801e3dc: f00b faf6 bl 80299cc <iprintf>
  74455. }
  74456. #if TCP_QUEUE_OOSEQ
  74457. /* Received in-sequence data, adjust ooseq data if:
  74458. - FIN has been received or
  74459. - inseq overlaps with ooseq */
  74460. if (pcb->ooseq != NULL) {
  74461. 801e3e0: 687b ldr r3, [r7, #4]
  74462. 801e3e2: 6f5b ldr r3, [r3, #116] @ 0x74
  74463. 801e3e4: 2b00 cmp r3, #0
  74464. 801e3e6: f000 80e6 beq.w 801e5b6 <tcp_receive+0x99a>
  74465. if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
  74466. 801e3ea: 4b2e ldr r3, [pc, #184] @ (801e4a4 <tcp_receive+0x888>)
  74467. 801e3ec: 691b ldr r3, [r3, #16]
  74468. 801e3ee: 899b ldrh r3, [r3, #12]
  74469. 801e3f0: b29b uxth r3, r3
  74470. 801e3f2: 4618 mov r0, r3
  74471. 801e3f4: f7fa fb90 bl 8018b18 <lwip_htons>
  74472. 801e3f8: 4603 mov r3, r0
  74473. 801e3fa: b2db uxtb r3, r3
  74474. 801e3fc: f003 0301 and.w r3, r3, #1
  74475. 801e400: 2b00 cmp r3, #0
  74476. 801e402: d010 beq.n 801e426 <tcp_receive+0x80a>
  74477. LWIP_DEBUGF(TCP_INPUT_DEBUG,
  74478. ("tcp_receive: received in-order FIN, binning ooseq queue\n"));
  74479. /* Received in-order FIN means anything that was received
  74480. * out of order must now have been received in-order, so
  74481. * bin the ooseq queue */
  74482. while (pcb->ooseq != NULL) {
  74483. 801e404: e00a b.n 801e41c <tcp_receive+0x800>
  74484. struct tcp_seg *old_ooseq = pcb->ooseq;
  74485. 801e406: 687b ldr r3, [r7, #4]
  74486. 801e408: 6f5b ldr r3, [r3, #116] @ 0x74
  74487. 801e40a: 60fb str r3, [r7, #12]
  74488. pcb->ooseq = pcb->ooseq->next;
  74489. 801e40c: 687b ldr r3, [r7, #4]
  74490. 801e40e: 6f5b ldr r3, [r3, #116] @ 0x74
  74491. 801e410: 681a ldr r2, [r3, #0]
  74492. 801e412: 687b ldr r3, [r7, #4]
  74493. 801e414: 675a str r2, [r3, #116] @ 0x74
  74494. tcp_seg_free(old_ooseq);
  74495. 801e416: 68f8 ldr r0, [r7, #12]
  74496. 801e418: f7fd fcb9 bl 801bd8e <tcp_seg_free>
  74497. while (pcb->ooseq != NULL) {
  74498. 801e41c: 687b ldr r3, [r7, #4]
  74499. 801e41e: 6f5b ldr r3, [r3, #116] @ 0x74
  74500. 801e420: 2b00 cmp r3, #0
  74501. 801e422: d1f0 bne.n 801e406 <tcp_receive+0x7ea>
  74502. 801e424: e0c7 b.n 801e5b6 <tcp_receive+0x99a>
  74503. }
  74504. } else {
  74505. struct tcp_seg *next = pcb->ooseq;
  74506. 801e426: 687b ldr r3, [r7, #4]
  74507. 801e428: 6f5b ldr r3, [r3, #116] @ 0x74
  74508. 801e42a: 63fb str r3, [r7, #60] @ 0x3c
  74509. /* Remove all segments on ooseq that are covered by inseg already.
  74510. * FIN is copied from ooseq to inseg if present. */
  74511. while (next &&
  74512. 801e42c: e051 b.n 801e4d2 <tcp_receive+0x8b6>
  74513. TCP_SEQ_GEQ(seqno + tcplen,
  74514. next->tcphdr->seqno + next->len)) {
  74515. struct tcp_seg *tmp;
  74516. /* inseg cannot have FIN here (already processed above) */
  74517. if ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0 &&
  74518. 801e42e: 6bfb ldr r3, [r7, #60] @ 0x3c
  74519. 801e430: 691b ldr r3, [r3, #16]
  74520. 801e432: 899b ldrh r3, [r3, #12]
  74521. 801e434: b29b uxth r3, r3
  74522. 801e436: 4618 mov r0, r3
  74523. 801e438: f7fa fb6e bl 8018b18 <lwip_htons>
  74524. 801e43c: 4603 mov r3, r0
  74525. 801e43e: b2db uxtb r3, r3
  74526. 801e440: f003 0301 and.w r3, r3, #1
  74527. 801e444: 2b00 cmp r3, #0
  74528. 801e446: d03c beq.n 801e4c2 <tcp_receive+0x8a6>
  74529. (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) {
  74530. 801e448: 4b16 ldr r3, [pc, #88] @ (801e4a4 <tcp_receive+0x888>)
  74531. 801e44a: 691b ldr r3, [r3, #16]
  74532. 801e44c: 899b ldrh r3, [r3, #12]
  74533. 801e44e: b29b uxth r3, r3
  74534. 801e450: 4618 mov r0, r3
  74535. 801e452: f7fa fb61 bl 8018b18 <lwip_htons>
  74536. 801e456: 4603 mov r3, r0
  74537. 801e458: b2db uxtb r3, r3
  74538. 801e45a: f003 0302 and.w r3, r3, #2
  74539. if ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0 &&
  74540. 801e45e: 2b00 cmp r3, #0
  74541. 801e460: d12f bne.n 801e4c2 <tcp_receive+0x8a6>
  74542. TCPH_SET_FLAG(inseg.tcphdr, TCP_FIN);
  74543. 801e462: 4b10 ldr r3, [pc, #64] @ (801e4a4 <tcp_receive+0x888>)
  74544. 801e464: 691b ldr r3, [r3, #16]
  74545. 801e466: 899b ldrh r3, [r3, #12]
  74546. 801e468: b29c uxth r4, r3
  74547. 801e46a: 2001 movs r0, #1
  74548. 801e46c: f7fa fb54 bl 8018b18 <lwip_htons>
  74549. 801e470: 4603 mov r3, r0
  74550. 801e472: 461a mov r2, r3
  74551. 801e474: 4b0b ldr r3, [pc, #44] @ (801e4a4 <tcp_receive+0x888>)
  74552. 801e476: 691b ldr r3, [r3, #16]
  74553. 801e478: 4322 orrs r2, r4
  74554. 801e47a: b292 uxth r2, r2
  74555. 801e47c: 819a strh r2, [r3, #12]
  74556. tcplen = TCP_TCPLEN(&inseg);
  74557. 801e47e: 4b09 ldr r3, [pc, #36] @ (801e4a4 <tcp_receive+0x888>)
  74558. 801e480: 891c ldrh r4, [r3, #8]
  74559. 801e482: 4b08 ldr r3, [pc, #32] @ (801e4a4 <tcp_receive+0x888>)
  74560. 801e484: 691b ldr r3, [r3, #16]
  74561. 801e486: 899b ldrh r3, [r3, #12]
  74562. 801e488: b29b uxth r3, r3
  74563. 801e48a: 4618 mov r0, r3
  74564. 801e48c: f7fa fb44 bl 8018b18 <lwip_htons>
  74565. 801e490: 4603 mov r3, r0
  74566. 801e492: b2db uxtb r3, r3
  74567. 801e494: f003 0303 and.w r3, r3, #3
  74568. 801e498: 2b00 cmp r3, #0
  74569. 801e49a: d00d beq.n 801e4b8 <tcp_receive+0x89c>
  74570. 801e49c: 2301 movs r3, #1
  74571. 801e49e: e00c b.n 801e4ba <tcp_receive+0x89e>
  74572. 801e4a0: 2402aec4 .word 0x2402aec4
  74573. 801e4a4: 2402aea0 .word 0x2402aea0
  74574. 801e4a8: 2402aece .word 0x2402aece
  74575. 801e4ac: 0802ed10 .word 0x0802ed10
  74576. 801e4b0: 0802f0b8 .word 0x0802f0b8
  74577. 801e4b4: 0802ed5c .word 0x0802ed5c
  74578. 801e4b8: 2300 movs r3, #0
  74579. 801e4ba: 4423 add r3, r4
  74580. 801e4bc: b29a uxth r2, r3
  74581. 801e4be: 4b98 ldr r3, [pc, #608] @ (801e720 <tcp_receive+0xb04>)
  74582. 801e4c0: 801a strh r2, [r3, #0]
  74583. }
  74584. tmp = next;
  74585. 801e4c2: 6bfb ldr r3, [r7, #60] @ 0x3c
  74586. 801e4c4: 613b str r3, [r7, #16]
  74587. next = next->next;
  74588. 801e4c6: 6bfb ldr r3, [r7, #60] @ 0x3c
  74589. 801e4c8: 681b ldr r3, [r3, #0]
  74590. 801e4ca: 63fb str r3, [r7, #60] @ 0x3c
  74591. tcp_seg_free(tmp);
  74592. 801e4cc: 6938 ldr r0, [r7, #16]
  74593. 801e4ce: f7fd fc5e bl 801bd8e <tcp_seg_free>
  74594. while (next &&
  74595. 801e4d2: 6bfb ldr r3, [r7, #60] @ 0x3c
  74596. 801e4d4: 2b00 cmp r3, #0
  74597. 801e4d6: d00e beq.n 801e4f6 <tcp_receive+0x8da>
  74598. TCP_SEQ_GEQ(seqno + tcplen,
  74599. 801e4d8: 4b91 ldr r3, [pc, #580] @ (801e720 <tcp_receive+0xb04>)
  74600. 801e4da: 881b ldrh r3, [r3, #0]
  74601. 801e4dc: 461a mov r2, r3
  74602. 801e4de: 4b91 ldr r3, [pc, #580] @ (801e724 <tcp_receive+0xb08>)
  74603. 801e4e0: 681b ldr r3, [r3, #0]
  74604. 801e4e2: 441a add r2, r3
  74605. 801e4e4: 6bfb ldr r3, [r7, #60] @ 0x3c
  74606. 801e4e6: 691b ldr r3, [r3, #16]
  74607. 801e4e8: 685b ldr r3, [r3, #4]
  74608. 801e4ea: 6bf9 ldr r1, [r7, #60] @ 0x3c
  74609. 801e4ec: 8909 ldrh r1, [r1, #8]
  74610. 801e4ee: 440b add r3, r1
  74611. 801e4f0: 1ad3 subs r3, r2, r3
  74612. while (next &&
  74613. 801e4f2: 2b00 cmp r3, #0
  74614. 801e4f4: da9b bge.n 801e42e <tcp_receive+0x812>
  74615. }
  74616. /* Now trim right side of inseg if it overlaps with the first
  74617. * segment on ooseq */
  74618. if (next &&
  74619. 801e4f6: 6bfb ldr r3, [r7, #60] @ 0x3c
  74620. 801e4f8: 2b00 cmp r3, #0
  74621. 801e4fa: d059 beq.n 801e5b0 <tcp_receive+0x994>
  74622. TCP_SEQ_GT(seqno + tcplen,
  74623. 801e4fc: 4b88 ldr r3, [pc, #544] @ (801e720 <tcp_receive+0xb04>)
  74624. 801e4fe: 881b ldrh r3, [r3, #0]
  74625. 801e500: 461a mov r2, r3
  74626. 801e502: 4b88 ldr r3, [pc, #544] @ (801e724 <tcp_receive+0xb08>)
  74627. 801e504: 681b ldr r3, [r3, #0]
  74628. 801e506: 441a add r2, r3
  74629. 801e508: 6bfb ldr r3, [r7, #60] @ 0x3c
  74630. 801e50a: 691b ldr r3, [r3, #16]
  74631. 801e50c: 685b ldr r3, [r3, #4]
  74632. 801e50e: 1ad3 subs r3, r2, r3
  74633. if (next &&
  74634. 801e510: 2b00 cmp r3, #0
  74635. 801e512: dd4d ble.n 801e5b0 <tcp_receive+0x994>
  74636. next->tcphdr->seqno)) {
  74637. /* inseg cannot have FIN here (already processed above) */
  74638. inseg.len = (u16_t)(next->tcphdr->seqno - seqno);
  74639. 801e514: 6bfb ldr r3, [r7, #60] @ 0x3c
  74640. 801e516: 691b ldr r3, [r3, #16]
  74641. 801e518: 685b ldr r3, [r3, #4]
  74642. 801e51a: b29a uxth r2, r3
  74643. 801e51c: 4b81 ldr r3, [pc, #516] @ (801e724 <tcp_receive+0xb08>)
  74644. 801e51e: 681b ldr r3, [r3, #0]
  74645. 801e520: b29b uxth r3, r3
  74646. 801e522: 1ad3 subs r3, r2, r3
  74647. 801e524: b29a uxth r2, r3
  74648. 801e526: 4b80 ldr r3, [pc, #512] @ (801e728 <tcp_receive+0xb0c>)
  74649. 801e528: 811a strh r2, [r3, #8]
  74650. if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
  74651. 801e52a: 4b7f ldr r3, [pc, #508] @ (801e728 <tcp_receive+0xb0c>)
  74652. 801e52c: 691b ldr r3, [r3, #16]
  74653. 801e52e: 899b ldrh r3, [r3, #12]
  74654. 801e530: b29b uxth r3, r3
  74655. 801e532: 4618 mov r0, r3
  74656. 801e534: f7fa faf0 bl 8018b18 <lwip_htons>
  74657. 801e538: 4603 mov r3, r0
  74658. 801e53a: b2db uxtb r3, r3
  74659. 801e53c: f003 0302 and.w r3, r3, #2
  74660. 801e540: 2b00 cmp r3, #0
  74661. 801e542: d005 beq.n 801e550 <tcp_receive+0x934>
  74662. inseg.len -= 1;
  74663. 801e544: 4b78 ldr r3, [pc, #480] @ (801e728 <tcp_receive+0xb0c>)
  74664. 801e546: 891b ldrh r3, [r3, #8]
  74665. 801e548: 3b01 subs r3, #1
  74666. 801e54a: b29a uxth r2, r3
  74667. 801e54c: 4b76 ldr r3, [pc, #472] @ (801e728 <tcp_receive+0xb0c>)
  74668. 801e54e: 811a strh r2, [r3, #8]
  74669. }
  74670. pbuf_realloc(inseg.p, inseg.len);
  74671. 801e550: 4b75 ldr r3, [pc, #468] @ (801e728 <tcp_receive+0xb0c>)
  74672. 801e552: 685b ldr r3, [r3, #4]
  74673. 801e554: 4a74 ldr r2, [pc, #464] @ (801e728 <tcp_receive+0xb0c>)
  74674. 801e556: 8912 ldrh r2, [r2, #8]
  74675. 801e558: 4611 mov r1, r2
  74676. 801e55a: 4618 mov r0, r3
  74677. 801e55c: f7fb fe08 bl 801a170 <pbuf_realloc>
  74678. tcplen = TCP_TCPLEN(&inseg);
  74679. 801e560: 4b71 ldr r3, [pc, #452] @ (801e728 <tcp_receive+0xb0c>)
  74680. 801e562: 891c ldrh r4, [r3, #8]
  74681. 801e564: 4b70 ldr r3, [pc, #448] @ (801e728 <tcp_receive+0xb0c>)
  74682. 801e566: 691b ldr r3, [r3, #16]
  74683. 801e568: 899b ldrh r3, [r3, #12]
  74684. 801e56a: b29b uxth r3, r3
  74685. 801e56c: 4618 mov r0, r3
  74686. 801e56e: f7fa fad3 bl 8018b18 <lwip_htons>
  74687. 801e572: 4603 mov r3, r0
  74688. 801e574: b2db uxtb r3, r3
  74689. 801e576: f003 0303 and.w r3, r3, #3
  74690. 801e57a: 2b00 cmp r3, #0
  74691. 801e57c: d001 beq.n 801e582 <tcp_receive+0x966>
  74692. 801e57e: 2301 movs r3, #1
  74693. 801e580: e000 b.n 801e584 <tcp_receive+0x968>
  74694. 801e582: 2300 movs r3, #0
  74695. 801e584: 4423 add r3, r4
  74696. 801e586: b29a uxth r2, r3
  74697. 801e588: 4b65 ldr r3, [pc, #404] @ (801e720 <tcp_receive+0xb04>)
  74698. 801e58a: 801a strh r2, [r3, #0]
  74699. LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue\n",
  74700. 801e58c: 4b64 ldr r3, [pc, #400] @ (801e720 <tcp_receive+0xb04>)
  74701. 801e58e: 881b ldrh r3, [r3, #0]
  74702. 801e590: 461a mov r2, r3
  74703. 801e592: 4b64 ldr r3, [pc, #400] @ (801e724 <tcp_receive+0xb08>)
  74704. 801e594: 681b ldr r3, [r3, #0]
  74705. 801e596: 441a add r2, r3
  74706. 801e598: 6bfb ldr r3, [r7, #60] @ 0x3c
  74707. 801e59a: 691b ldr r3, [r3, #16]
  74708. 801e59c: 685b ldr r3, [r3, #4]
  74709. 801e59e: 429a cmp r2, r3
  74710. 801e5a0: d006 beq.n 801e5b0 <tcp_receive+0x994>
  74711. 801e5a2: 4b62 ldr r3, [pc, #392] @ (801e72c <tcp_receive+0xb10>)
  74712. 801e5a4: f240 52fc movw r2, #1532 @ 0x5fc
  74713. 801e5a8: 4961 ldr r1, [pc, #388] @ (801e730 <tcp_receive+0xb14>)
  74714. 801e5aa: 4862 ldr r0, [pc, #392] @ (801e734 <tcp_receive+0xb18>)
  74715. 801e5ac: f00b fa0e bl 80299cc <iprintf>
  74716. (seqno + tcplen) == next->tcphdr->seqno);
  74717. }
  74718. pcb->ooseq = next;
  74719. 801e5b0: 687b ldr r3, [r7, #4]
  74720. 801e5b2: 6bfa ldr r2, [r7, #60] @ 0x3c
  74721. 801e5b4: 675a str r2, [r3, #116] @ 0x74
  74722. }
  74723. }
  74724. #endif /* TCP_QUEUE_OOSEQ */
  74725. pcb->rcv_nxt = seqno + tcplen;
  74726. 801e5b6: 4b5a ldr r3, [pc, #360] @ (801e720 <tcp_receive+0xb04>)
  74727. 801e5b8: 881b ldrh r3, [r3, #0]
  74728. 801e5ba: 461a mov r2, r3
  74729. 801e5bc: 4b59 ldr r3, [pc, #356] @ (801e724 <tcp_receive+0xb08>)
  74730. 801e5be: 681b ldr r3, [r3, #0]
  74731. 801e5c0: 441a add r2, r3
  74732. 801e5c2: 687b ldr r3, [r7, #4]
  74733. 801e5c4: 625a str r2, [r3, #36] @ 0x24
  74734. /* Update the receiver's (our) window. */
  74735. LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen);
  74736. 801e5c6: 687b ldr r3, [r7, #4]
  74737. 801e5c8: 8d1a ldrh r2, [r3, #40] @ 0x28
  74738. 801e5ca: 4b55 ldr r3, [pc, #340] @ (801e720 <tcp_receive+0xb04>)
  74739. 801e5cc: 881b ldrh r3, [r3, #0]
  74740. 801e5ce: 429a cmp r2, r3
  74741. 801e5d0: d206 bcs.n 801e5e0 <tcp_receive+0x9c4>
  74742. 801e5d2: 4b56 ldr r3, [pc, #344] @ (801e72c <tcp_receive+0xb10>)
  74743. 801e5d4: f240 6207 movw r2, #1543 @ 0x607
  74744. 801e5d8: 4957 ldr r1, [pc, #348] @ (801e738 <tcp_receive+0xb1c>)
  74745. 801e5da: 4856 ldr r0, [pc, #344] @ (801e734 <tcp_receive+0xb18>)
  74746. 801e5dc: f00b f9f6 bl 80299cc <iprintf>
  74747. pcb->rcv_wnd -= tcplen;
  74748. 801e5e0: 687b ldr r3, [r7, #4]
  74749. 801e5e2: 8d1a ldrh r2, [r3, #40] @ 0x28
  74750. 801e5e4: 4b4e ldr r3, [pc, #312] @ (801e720 <tcp_receive+0xb04>)
  74751. 801e5e6: 881b ldrh r3, [r3, #0]
  74752. 801e5e8: 1ad3 subs r3, r2, r3
  74753. 801e5ea: b29a uxth r2, r3
  74754. 801e5ec: 687b ldr r3, [r7, #4]
  74755. 801e5ee: 851a strh r2, [r3, #40] @ 0x28
  74756. tcp_update_rcv_ann_wnd(pcb);
  74757. 801e5f0: 6878 ldr r0, [r7, #4]
  74758. 801e5f2: f7fc fd85 bl 801b100 <tcp_update_rcv_ann_wnd>
  74759. chains its data on this pbuf as well.
  74760. If the segment was a FIN, we set the TF_GOT_FIN flag that will
  74761. be used to indicate to the application that the remote side has
  74762. closed its end of the connection. */
  74763. if (inseg.p->tot_len > 0) {
  74764. 801e5f6: 4b4c ldr r3, [pc, #304] @ (801e728 <tcp_receive+0xb0c>)
  74765. 801e5f8: 685b ldr r3, [r3, #4]
  74766. 801e5fa: 891b ldrh r3, [r3, #8]
  74767. 801e5fc: 2b00 cmp r3, #0
  74768. 801e5fe: d006 beq.n 801e60e <tcp_receive+0x9f2>
  74769. recv_data = inseg.p;
  74770. 801e600: 4b49 ldr r3, [pc, #292] @ (801e728 <tcp_receive+0xb0c>)
  74771. 801e602: 685b ldr r3, [r3, #4]
  74772. 801e604: 4a4d ldr r2, [pc, #308] @ (801e73c <tcp_receive+0xb20>)
  74773. 801e606: 6013 str r3, [r2, #0]
  74774. /* Since this pbuf now is the responsibility of the
  74775. application, we delete our reference to it so that we won't
  74776. (mistakingly) deallocate it. */
  74777. inseg.p = NULL;
  74778. 801e608: 4b47 ldr r3, [pc, #284] @ (801e728 <tcp_receive+0xb0c>)
  74779. 801e60a: 2200 movs r2, #0
  74780. 801e60c: 605a str r2, [r3, #4]
  74781. }
  74782. if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
  74783. 801e60e: 4b46 ldr r3, [pc, #280] @ (801e728 <tcp_receive+0xb0c>)
  74784. 801e610: 691b ldr r3, [r3, #16]
  74785. 801e612: 899b ldrh r3, [r3, #12]
  74786. 801e614: b29b uxth r3, r3
  74787. 801e616: 4618 mov r0, r3
  74788. 801e618: f7fa fa7e bl 8018b18 <lwip_htons>
  74789. 801e61c: 4603 mov r3, r0
  74790. 801e61e: b2db uxtb r3, r3
  74791. 801e620: f003 0301 and.w r3, r3, #1
  74792. 801e624: 2b00 cmp r3, #0
  74793. 801e626: f000 80b8 beq.w 801e79a <tcp_receive+0xb7e>
  74794. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n"));
  74795. recv_flags |= TF_GOT_FIN;
  74796. 801e62a: 4b45 ldr r3, [pc, #276] @ (801e740 <tcp_receive+0xb24>)
  74797. 801e62c: 781b ldrb r3, [r3, #0]
  74798. 801e62e: f043 0320 orr.w r3, r3, #32
  74799. 801e632: b2da uxtb r2, r3
  74800. 801e634: 4b42 ldr r3, [pc, #264] @ (801e740 <tcp_receive+0xb24>)
  74801. 801e636: 701a strb r2, [r3, #0]
  74802. }
  74803. #if TCP_QUEUE_OOSEQ
  74804. /* We now check if we have segments on the ->ooseq queue that
  74805. are now in sequence. */
  74806. while (pcb->ooseq != NULL &&
  74807. 801e638: e0af b.n 801e79a <tcp_receive+0xb7e>
  74808. pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) {
  74809. struct tcp_seg *cseg = pcb->ooseq;
  74810. 801e63a: 687b ldr r3, [r7, #4]
  74811. 801e63c: 6f5b ldr r3, [r3, #116] @ 0x74
  74812. 801e63e: 60bb str r3, [r7, #8]
  74813. seqno = pcb->ooseq->tcphdr->seqno;
  74814. 801e640: 687b ldr r3, [r7, #4]
  74815. 801e642: 6f5b ldr r3, [r3, #116] @ 0x74
  74816. 801e644: 691b ldr r3, [r3, #16]
  74817. 801e646: 685b ldr r3, [r3, #4]
  74818. 801e648: 4a36 ldr r2, [pc, #216] @ (801e724 <tcp_receive+0xb08>)
  74819. 801e64a: 6013 str r3, [r2, #0]
  74820. pcb->rcv_nxt += TCP_TCPLEN(cseg);
  74821. 801e64c: 68bb ldr r3, [r7, #8]
  74822. 801e64e: 891b ldrh r3, [r3, #8]
  74823. 801e650: 461c mov r4, r3
  74824. 801e652: 68bb ldr r3, [r7, #8]
  74825. 801e654: 691b ldr r3, [r3, #16]
  74826. 801e656: 899b ldrh r3, [r3, #12]
  74827. 801e658: b29b uxth r3, r3
  74828. 801e65a: 4618 mov r0, r3
  74829. 801e65c: f7fa fa5c bl 8018b18 <lwip_htons>
  74830. 801e660: 4603 mov r3, r0
  74831. 801e662: b2db uxtb r3, r3
  74832. 801e664: f003 0303 and.w r3, r3, #3
  74833. 801e668: 2b00 cmp r3, #0
  74834. 801e66a: d001 beq.n 801e670 <tcp_receive+0xa54>
  74835. 801e66c: 2301 movs r3, #1
  74836. 801e66e: e000 b.n 801e672 <tcp_receive+0xa56>
  74837. 801e670: 2300 movs r3, #0
  74838. 801e672: 191a adds r2, r3, r4
  74839. 801e674: 687b ldr r3, [r7, #4]
  74840. 801e676: 6a5b ldr r3, [r3, #36] @ 0x24
  74841. 801e678: 441a add r2, r3
  74842. 801e67a: 687b ldr r3, [r7, #4]
  74843. 801e67c: 625a str r2, [r3, #36] @ 0x24
  74844. LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd\n",
  74845. 801e67e: 687b ldr r3, [r7, #4]
  74846. 801e680: 8d1b ldrh r3, [r3, #40] @ 0x28
  74847. 801e682: 461c mov r4, r3
  74848. 801e684: 68bb ldr r3, [r7, #8]
  74849. 801e686: 891b ldrh r3, [r3, #8]
  74850. 801e688: 461d mov r5, r3
  74851. 801e68a: 68bb ldr r3, [r7, #8]
  74852. 801e68c: 691b ldr r3, [r3, #16]
  74853. 801e68e: 899b ldrh r3, [r3, #12]
  74854. 801e690: b29b uxth r3, r3
  74855. 801e692: 4618 mov r0, r3
  74856. 801e694: f7fa fa40 bl 8018b18 <lwip_htons>
  74857. 801e698: 4603 mov r3, r0
  74858. 801e69a: b2db uxtb r3, r3
  74859. 801e69c: f003 0303 and.w r3, r3, #3
  74860. 801e6a0: 2b00 cmp r3, #0
  74861. 801e6a2: d001 beq.n 801e6a8 <tcp_receive+0xa8c>
  74862. 801e6a4: 2301 movs r3, #1
  74863. 801e6a6: e000 b.n 801e6aa <tcp_receive+0xa8e>
  74864. 801e6a8: 2300 movs r3, #0
  74865. 801e6aa: 442b add r3, r5
  74866. 801e6ac: 429c cmp r4, r3
  74867. 801e6ae: d206 bcs.n 801e6be <tcp_receive+0xaa2>
  74868. 801e6b0: 4b1e ldr r3, [pc, #120] @ (801e72c <tcp_receive+0xb10>)
  74869. 801e6b2: f240 622b movw r2, #1579 @ 0x62b
  74870. 801e6b6: 4923 ldr r1, [pc, #140] @ (801e744 <tcp_receive+0xb28>)
  74871. 801e6b8: 481e ldr r0, [pc, #120] @ (801e734 <tcp_receive+0xb18>)
  74872. 801e6ba: f00b f987 bl 80299cc <iprintf>
  74873. pcb->rcv_wnd >= TCP_TCPLEN(cseg));
  74874. pcb->rcv_wnd -= TCP_TCPLEN(cseg);
  74875. 801e6be: 68bb ldr r3, [r7, #8]
  74876. 801e6c0: 891b ldrh r3, [r3, #8]
  74877. 801e6c2: 461c mov r4, r3
  74878. 801e6c4: 68bb ldr r3, [r7, #8]
  74879. 801e6c6: 691b ldr r3, [r3, #16]
  74880. 801e6c8: 899b ldrh r3, [r3, #12]
  74881. 801e6ca: b29b uxth r3, r3
  74882. 801e6cc: 4618 mov r0, r3
  74883. 801e6ce: f7fa fa23 bl 8018b18 <lwip_htons>
  74884. 801e6d2: 4603 mov r3, r0
  74885. 801e6d4: b2db uxtb r3, r3
  74886. 801e6d6: f003 0303 and.w r3, r3, #3
  74887. 801e6da: 2b00 cmp r3, #0
  74888. 801e6dc: d001 beq.n 801e6e2 <tcp_receive+0xac6>
  74889. 801e6de: 2301 movs r3, #1
  74890. 801e6e0: e000 b.n 801e6e4 <tcp_receive+0xac8>
  74891. 801e6e2: 2300 movs r3, #0
  74892. 801e6e4: 1919 adds r1, r3, r4
  74893. 801e6e6: 687b ldr r3, [r7, #4]
  74894. 801e6e8: 8d1a ldrh r2, [r3, #40] @ 0x28
  74895. 801e6ea: b28b uxth r3, r1
  74896. 801e6ec: 1ad3 subs r3, r2, r3
  74897. 801e6ee: b29a uxth r2, r3
  74898. 801e6f0: 687b ldr r3, [r7, #4]
  74899. 801e6f2: 851a strh r2, [r3, #40] @ 0x28
  74900. tcp_update_rcv_ann_wnd(pcb);
  74901. 801e6f4: 6878 ldr r0, [r7, #4]
  74902. 801e6f6: f7fc fd03 bl 801b100 <tcp_update_rcv_ann_wnd>
  74903. if (cseg->p->tot_len > 0) {
  74904. 801e6fa: 68bb ldr r3, [r7, #8]
  74905. 801e6fc: 685b ldr r3, [r3, #4]
  74906. 801e6fe: 891b ldrh r3, [r3, #8]
  74907. 801e700: 2b00 cmp r3, #0
  74908. 801e702: d028 beq.n 801e756 <tcp_receive+0xb3a>
  74909. /* Chain this pbuf onto the pbuf that we will pass to
  74910. the application. */
  74911. /* With window scaling, this can overflow recv_data->tot_len, but
  74912. that's not a problem since we explicitly fix that before passing
  74913. recv_data to the application. */
  74914. if (recv_data) {
  74915. 801e704: 4b0d ldr r3, [pc, #52] @ (801e73c <tcp_receive+0xb20>)
  74916. 801e706: 681b ldr r3, [r3, #0]
  74917. 801e708: 2b00 cmp r3, #0
  74918. 801e70a: d01d beq.n 801e748 <tcp_receive+0xb2c>
  74919. pbuf_cat(recv_data, cseg->p);
  74920. 801e70c: 4b0b ldr r3, [pc, #44] @ (801e73c <tcp_receive+0xb20>)
  74921. 801e70e: 681a ldr r2, [r3, #0]
  74922. 801e710: 68bb ldr r3, [r7, #8]
  74923. 801e712: 685b ldr r3, [r3, #4]
  74924. 801e714: 4619 mov r1, r3
  74925. 801e716: 4610 mov r0, r2
  74926. 801e718: f7fb ffae bl 801a678 <pbuf_cat>
  74927. 801e71c: e018 b.n 801e750 <tcp_receive+0xb34>
  74928. 801e71e: bf00 nop
  74929. 801e720: 2402aece .word 0x2402aece
  74930. 801e724: 2402aec4 .word 0x2402aec4
  74931. 801e728: 2402aea0 .word 0x2402aea0
  74932. 801e72c: 0802ed10 .word 0x0802ed10
  74933. 801e730: 0802f0f0 .word 0x0802f0f0
  74934. 801e734: 0802ed5c .word 0x0802ed5c
  74935. 801e738: 0802f12c .word 0x0802f12c
  74936. 801e73c: 2402aed4 .word 0x2402aed4
  74937. 801e740: 2402aed1 .word 0x2402aed1
  74938. 801e744: 0802f14c .word 0x0802f14c
  74939. } else {
  74940. recv_data = cseg->p;
  74941. 801e748: 68bb ldr r3, [r7, #8]
  74942. 801e74a: 685b ldr r3, [r3, #4]
  74943. 801e74c: 4a70 ldr r2, [pc, #448] @ (801e910 <tcp_receive+0xcf4>)
  74944. 801e74e: 6013 str r3, [r2, #0]
  74945. }
  74946. cseg->p = NULL;
  74947. 801e750: 68bb ldr r3, [r7, #8]
  74948. 801e752: 2200 movs r2, #0
  74949. 801e754: 605a str r2, [r3, #4]
  74950. }
  74951. if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {
  74952. 801e756: 68bb ldr r3, [r7, #8]
  74953. 801e758: 691b ldr r3, [r3, #16]
  74954. 801e75a: 899b ldrh r3, [r3, #12]
  74955. 801e75c: b29b uxth r3, r3
  74956. 801e75e: 4618 mov r0, r3
  74957. 801e760: f7fa f9da bl 8018b18 <lwip_htons>
  74958. 801e764: 4603 mov r3, r0
  74959. 801e766: b2db uxtb r3, r3
  74960. 801e768: f003 0301 and.w r3, r3, #1
  74961. 801e76c: 2b00 cmp r3, #0
  74962. 801e76e: d00d beq.n 801e78c <tcp_receive+0xb70>
  74963. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: dequeued FIN.\n"));
  74964. recv_flags |= TF_GOT_FIN;
  74965. 801e770: 4b68 ldr r3, [pc, #416] @ (801e914 <tcp_receive+0xcf8>)
  74966. 801e772: 781b ldrb r3, [r3, #0]
  74967. 801e774: f043 0320 orr.w r3, r3, #32
  74968. 801e778: b2da uxtb r2, r3
  74969. 801e77a: 4b66 ldr r3, [pc, #408] @ (801e914 <tcp_receive+0xcf8>)
  74970. 801e77c: 701a strb r2, [r3, #0]
  74971. if (pcb->state == ESTABLISHED) { /* force passive close or we can move to active close */
  74972. 801e77e: 687b ldr r3, [r7, #4]
  74973. 801e780: 7d1b ldrb r3, [r3, #20]
  74974. 801e782: 2b04 cmp r3, #4
  74975. 801e784: d102 bne.n 801e78c <tcp_receive+0xb70>
  74976. pcb->state = CLOSE_WAIT;
  74977. 801e786: 687b ldr r3, [r7, #4]
  74978. 801e788: 2207 movs r2, #7
  74979. 801e78a: 751a strb r2, [r3, #20]
  74980. }
  74981. }
  74982. pcb->ooseq = cseg->next;
  74983. 801e78c: 68bb ldr r3, [r7, #8]
  74984. 801e78e: 681a ldr r2, [r3, #0]
  74985. 801e790: 687b ldr r3, [r7, #4]
  74986. 801e792: 675a str r2, [r3, #116] @ 0x74
  74987. tcp_seg_free(cseg);
  74988. 801e794: 68b8 ldr r0, [r7, #8]
  74989. 801e796: f7fd fafa bl 801bd8e <tcp_seg_free>
  74990. while (pcb->ooseq != NULL &&
  74991. 801e79a: 687b ldr r3, [r7, #4]
  74992. 801e79c: 6f5b ldr r3, [r3, #116] @ 0x74
  74993. 801e79e: 2b00 cmp r3, #0
  74994. 801e7a0: d008 beq.n 801e7b4 <tcp_receive+0xb98>
  74995. pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) {
  74996. 801e7a2: 687b ldr r3, [r7, #4]
  74997. 801e7a4: 6f5b ldr r3, [r3, #116] @ 0x74
  74998. 801e7a6: 691b ldr r3, [r3, #16]
  74999. 801e7a8: 685a ldr r2, [r3, #4]
  75000. 801e7aa: 687b ldr r3, [r7, #4]
  75001. 801e7ac: 6a5b ldr r3, [r3, #36] @ 0x24
  75002. while (pcb->ooseq != NULL &&
  75003. 801e7ae: 429a cmp r2, r3
  75004. 801e7b0: f43f af43 beq.w 801e63a <tcp_receive+0xa1e>
  75005. #endif /* LWIP_TCP_SACK_OUT */
  75006. #endif /* TCP_QUEUE_OOSEQ */
  75007. /* Acknowledge the segment(s). */
  75008. tcp_ack(pcb);
  75009. 801e7b4: 687b ldr r3, [r7, #4]
  75010. 801e7b6: 8b5b ldrh r3, [r3, #26]
  75011. 801e7b8: f003 0301 and.w r3, r3, #1
  75012. 801e7bc: 2b00 cmp r3, #0
  75013. 801e7be: d00e beq.n 801e7de <tcp_receive+0xbc2>
  75014. 801e7c0: 687b ldr r3, [r7, #4]
  75015. 801e7c2: 8b5b ldrh r3, [r3, #26]
  75016. 801e7c4: f023 0301 bic.w r3, r3, #1
  75017. 801e7c8: b29a uxth r2, r3
  75018. 801e7ca: 687b ldr r3, [r7, #4]
  75019. 801e7cc: 835a strh r2, [r3, #26]
  75020. 801e7ce: 687b ldr r3, [r7, #4]
  75021. 801e7d0: 8b5b ldrh r3, [r3, #26]
  75022. 801e7d2: f043 0302 orr.w r3, r3, #2
  75023. 801e7d6: b29a uxth r2, r3
  75024. 801e7d8: 687b ldr r3, [r7, #4]
  75025. 801e7da: 835a strh r2, [r3, #26]
  75026. if (pcb->rcv_nxt == seqno) {
  75027. 801e7dc: e187 b.n 801eaee <tcp_receive+0xed2>
  75028. tcp_ack(pcb);
  75029. 801e7de: 687b ldr r3, [r7, #4]
  75030. 801e7e0: 8b5b ldrh r3, [r3, #26]
  75031. 801e7e2: f043 0301 orr.w r3, r3, #1
  75032. 801e7e6: b29a uxth r2, r3
  75033. 801e7e8: 687b ldr r3, [r7, #4]
  75034. 801e7ea: 835a strh r2, [r3, #26]
  75035. if (pcb->rcv_nxt == seqno) {
  75036. 801e7ec: e17f b.n 801eaee <tcp_receive+0xed2>
  75037. } else {
  75038. /* We get here if the incoming segment is out-of-sequence. */
  75039. #if TCP_QUEUE_OOSEQ
  75040. /* We queue the segment on the ->ooseq queue. */
  75041. if (pcb->ooseq == NULL) {
  75042. 801e7ee: 687b ldr r3, [r7, #4]
  75043. 801e7f0: 6f5b ldr r3, [r3, #116] @ 0x74
  75044. 801e7f2: 2b00 cmp r3, #0
  75045. 801e7f4: d106 bne.n 801e804 <tcp_receive+0xbe8>
  75046. pcb->ooseq = tcp_seg_copy(&inseg);
  75047. 801e7f6: 4848 ldr r0, [pc, #288] @ (801e918 <tcp_receive+0xcfc>)
  75048. 801e7f8: f7fd fae2 bl 801bdc0 <tcp_seg_copy>
  75049. 801e7fc: 4602 mov r2, r0
  75050. 801e7fe: 687b ldr r3, [r7, #4]
  75051. 801e800: 675a str r2, [r3, #116] @ 0x74
  75052. 801e802: e16c b.n 801eade <tcp_receive+0xec2>
  75053. #if LWIP_TCP_SACK_OUT
  75054. /* This is the left edge of the lowest possible SACK range.
  75055. It may start before the newly received segment (possibly adjusted below). */
  75056. u32_t sackbeg = TCP_SEQ_LT(seqno, pcb->ooseq->tcphdr->seqno) ? seqno : pcb->ooseq->tcphdr->seqno;
  75057. #endif /* LWIP_TCP_SACK_OUT */
  75058. struct tcp_seg *next, *prev = NULL;
  75059. 801e804: 2300 movs r3, #0
  75060. 801e806: 637b str r3, [r7, #52] @ 0x34
  75061. for (next = pcb->ooseq; next != NULL; next = next->next) {
  75062. 801e808: 687b ldr r3, [r7, #4]
  75063. 801e80a: 6f5b ldr r3, [r3, #116] @ 0x74
  75064. 801e80c: 63bb str r3, [r7, #56] @ 0x38
  75065. 801e80e: e156 b.n 801eabe <tcp_receive+0xea2>
  75066. if (seqno == next->tcphdr->seqno) {
  75067. 801e810: 6bbb ldr r3, [r7, #56] @ 0x38
  75068. 801e812: 691b ldr r3, [r3, #16]
  75069. 801e814: 685a ldr r2, [r3, #4]
  75070. 801e816: 4b41 ldr r3, [pc, #260] @ (801e91c <tcp_receive+0xd00>)
  75071. 801e818: 681b ldr r3, [r3, #0]
  75072. 801e81a: 429a cmp r2, r3
  75073. 801e81c: d11d bne.n 801e85a <tcp_receive+0xc3e>
  75074. /* The sequence number of the incoming segment is the
  75075. same as the sequence number of the segment on
  75076. ->ooseq. We check the lengths to see which one to
  75077. discard. */
  75078. if (inseg.len > next->len) {
  75079. 801e81e: 4b3e ldr r3, [pc, #248] @ (801e918 <tcp_receive+0xcfc>)
  75080. 801e820: 891a ldrh r2, [r3, #8]
  75081. 801e822: 6bbb ldr r3, [r7, #56] @ 0x38
  75082. 801e824: 891b ldrh r3, [r3, #8]
  75083. 801e826: 429a cmp r2, r3
  75084. 801e828: f240 814e bls.w 801eac8 <tcp_receive+0xeac>
  75085. /* The incoming segment is larger than the old
  75086. segment. We replace some segments with the new
  75087. one. */
  75088. struct tcp_seg *cseg = tcp_seg_copy(&inseg);
  75089. 801e82c: 483a ldr r0, [pc, #232] @ (801e918 <tcp_receive+0xcfc>)
  75090. 801e82e: f7fd fac7 bl 801bdc0 <tcp_seg_copy>
  75091. 801e832: 6178 str r0, [r7, #20]
  75092. if (cseg != NULL) {
  75093. 801e834: 697b ldr r3, [r7, #20]
  75094. 801e836: 2b00 cmp r3, #0
  75095. 801e838: f000 8148 beq.w 801eacc <tcp_receive+0xeb0>
  75096. if (prev != NULL) {
  75097. 801e83c: 6b7b ldr r3, [r7, #52] @ 0x34
  75098. 801e83e: 2b00 cmp r3, #0
  75099. 801e840: d003 beq.n 801e84a <tcp_receive+0xc2e>
  75100. prev->next = cseg;
  75101. 801e842: 6b7b ldr r3, [r7, #52] @ 0x34
  75102. 801e844: 697a ldr r2, [r7, #20]
  75103. 801e846: 601a str r2, [r3, #0]
  75104. 801e848: e002 b.n 801e850 <tcp_receive+0xc34>
  75105. } else {
  75106. pcb->ooseq = cseg;
  75107. 801e84a: 687b ldr r3, [r7, #4]
  75108. 801e84c: 697a ldr r2, [r7, #20]
  75109. 801e84e: 675a str r2, [r3, #116] @ 0x74
  75110. }
  75111. tcp_oos_insert_segment(cseg, next);
  75112. 801e850: 6bb9 ldr r1, [r7, #56] @ 0x38
  75113. 801e852: 6978 ldr r0, [r7, #20]
  75114. 801e854: f7ff f8de bl 801da14 <tcp_oos_insert_segment>
  75115. }
  75116. break;
  75117. 801e858: e138 b.n 801eacc <tcp_receive+0xeb0>
  75118. segment was smaller than the old one; in either
  75119. case, we ditch the incoming segment. */
  75120. break;
  75121. }
  75122. } else {
  75123. if (prev == NULL) {
  75124. 801e85a: 6b7b ldr r3, [r7, #52] @ 0x34
  75125. 801e85c: 2b00 cmp r3, #0
  75126. 801e85e: d117 bne.n 801e890 <tcp_receive+0xc74>
  75127. if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {
  75128. 801e860: 4b2e ldr r3, [pc, #184] @ (801e91c <tcp_receive+0xd00>)
  75129. 801e862: 681a ldr r2, [r3, #0]
  75130. 801e864: 6bbb ldr r3, [r7, #56] @ 0x38
  75131. 801e866: 691b ldr r3, [r3, #16]
  75132. 801e868: 685b ldr r3, [r3, #4]
  75133. 801e86a: 1ad3 subs r3, r2, r3
  75134. 801e86c: 2b00 cmp r3, #0
  75135. 801e86e: da57 bge.n 801e920 <tcp_receive+0xd04>
  75136. /* The sequence number of the incoming segment is lower
  75137. than the sequence number of the first segment on the
  75138. queue. We put the incoming segment first on the
  75139. queue. */
  75140. struct tcp_seg *cseg = tcp_seg_copy(&inseg);
  75141. 801e870: 4829 ldr r0, [pc, #164] @ (801e918 <tcp_receive+0xcfc>)
  75142. 801e872: f7fd faa5 bl 801bdc0 <tcp_seg_copy>
  75143. 801e876: 61b8 str r0, [r7, #24]
  75144. if (cseg != NULL) {
  75145. 801e878: 69bb ldr r3, [r7, #24]
  75146. 801e87a: 2b00 cmp r3, #0
  75147. 801e87c: f000 8128 beq.w 801ead0 <tcp_receive+0xeb4>
  75148. pcb->ooseq = cseg;
  75149. 801e880: 687b ldr r3, [r7, #4]
  75150. 801e882: 69ba ldr r2, [r7, #24]
  75151. 801e884: 675a str r2, [r3, #116] @ 0x74
  75152. tcp_oos_insert_segment(cseg, next);
  75153. 801e886: 6bb9 ldr r1, [r7, #56] @ 0x38
  75154. 801e888: 69b8 ldr r0, [r7, #24]
  75155. 801e88a: f7ff f8c3 bl 801da14 <tcp_oos_insert_segment>
  75156. }
  75157. break;
  75158. 801e88e: e11f b.n 801ead0 <tcp_receive+0xeb4>
  75159. }
  75160. } else {
  75161. /*if (TCP_SEQ_LT(prev->tcphdr->seqno, seqno) &&
  75162. TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {*/
  75163. if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno + 1, next->tcphdr->seqno - 1)) {
  75164. 801e890: 4b22 ldr r3, [pc, #136] @ (801e91c <tcp_receive+0xd00>)
  75165. 801e892: 681a ldr r2, [r3, #0]
  75166. 801e894: 6b7b ldr r3, [r7, #52] @ 0x34
  75167. 801e896: 691b ldr r3, [r3, #16]
  75168. 801e898: 685b ldr r3, [r3, #4]
  75169. 801e89a: 1ad3 subs r3, r2, r3
  75170. 801e89c: 3b01 subs r3, #1
  75171. 801e89e: 2b00 cmp r3, #0
  75172. 801e8a0: db3e blt.n 801e920 <tcp_receive+0xd04>
  75173. 801e8a2: 4b1e ldr r3, [pc, #120] @ (801e91c <tcp_receive+0xd00>)
  75174. 801e8a4: 681a ldr r2, [r3, #0]
  75175. 801e8a6: 6bbb ldr r3, [r7, #56] @ 0x38
  75176. 801e8a8: 691b ldr r3, [r3, #16]
  75177. 801e8aa: 685b ldr r3, [r3, #4]
  75178. 801e8ac: 1ad3 subs r3, r2, r3
  75179. 801e8ae: 3301 adds r3, #1
  75180. 801e8b0: 2b00 cmp r3, #0
  75181. 801e8b2: dc35 bgt.n 801e920 <tcp_receive+0xd04>
  75182. /* The sequence number of the incoming segment is in
  75183. between the sequence numbers of the previous and
  75184. the next segment on ->ooseq. We trim trim the previous
  75185. segment, delete next segments that included in received segment
  75186. and trim received, if needed. */
  75187. struct tcp_seg *cseg = tcp_seg_copy(&inseg);
  75188. 801e8b4: 4818 ldr r0, [pc, #96] @ (801e918 <tcp_receive+0xcfc>)
  75189. 801e8b6: f7fd fa83 bl 801bdc0 <tcp_seg_copy>
  75190. 801e8ba: 61f8 str r0, [r7, #28]
  75191. if (cseg != NULL) {
  75192. 801e8bc: 69fb ldr r3, [r7, #28]
  75193. 801e8be: 2b00 cmp r3, #0
  75194. 801e8c0: f000 8108 beq.w 801ead4 <tcp_receive+0xeb8>
  75195. if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) {
  75196. 801e8c4: 6b7b ldr r3, [r7, #52] @ 0x34
  75197. 801e8c6: 691b ldr r3, [r3, #16]
  75198. 801e8c8: 685b ldr r3, [r3, #4]
  75199. 801e8ca: 6b7a ldr r2, [r7, #52] @ 0x34
  75200. 801e8cc: 8912 ldrh r2, [r2, #8]
  75201. 801e8ce: 441a add r2, r3
  75202. 801e8d0: 4b12 ldr r3, [pc, #72] @ (801e91c <tcp_receive+0xd00>)
  75203. 801e8d2: 681b ldr r3, [r3, #0]
  75204. 801e8d4: 1ad3 subs r3, r2, r3
  75205. 801e8d6: 2b00 cmp r3, #0
  75206. 801e8d8: dd12 ble.n 801e900 <tcp_receive+0xce4>
  75207. /* We need to trim the prev segment. */
  75208. prev->len = (u16_t)(seqno - prev->tcphdr->seqno);
  75209. 801e8da: 4b10 ldr r3, [pc, #64] @ (801e91c <tcp_receive+0xd00>)
  75210. 801e8dc: 681b ldr r3, [r3, #0]
  75211. 801e8de: b29a uxth r2, r3
  75212. 801e8e0: 6b7b ldr r3, [r7, #52] @ 0x34
  75213. 801e8e2: 691b ldr r3, [r3, #16]
  75214. 801e8e4: 685b ldr r3, [r3, #4]
  75215. 801e8e6: b29b uxth r3, r3
  75216. 801e8e8: 1ad3 subs r3, r2, r3
  75217. 801e8ea: b29a uxth r2, r3
  75218. 801e8ec: 6b7b ldr r3, [r7, #52] @ 0x34
  75219. 801e8ee: 811a strh r2, [r3, #8]
  75220. pbuf_realloc(prev->p, prev->len);
  75221. 801e8f0: 6b7b ldr r3, [r7, #52] @ 0x34
  75222. 801e8f2: 685a ldr r2, [r3, #4]
  75223. 801e8f4: 6b7b ldr r3, [r7, #52] @ 0x34
  75224. 801e8f6: 891b ldrh r3, [r3, #8]
  75225. 801e8f8: 4619 mov r1, r3
  75226. 801e8fa: 4610 mov r0, r2
  75227. 801e8fc: f7fb fc38 bl 801a170 <pbuf_realloc>
  75228. }
  75229. prev->next = cseg;
  75230. 801e900: 6b7b ldr r3, [r7, #52] @ 0x34
  75231. 801e902: 69fa ldr r2, [r7, #28]
  75232. 801e904: 601a str r2, [r3, #0]
  75233. tcp_oos_insert_segment(cseg, next);
  75234. 801e906: 6bb9 ldr r1, [r7, #56] @ 0x38
  75235. 801e908: 69f8 ldr r0, [r7, #28]
  75236. 801e90a: f7ff f883 bl 801da14 <tcp_oos_insert_segment>
  75237. }
  75238. break;
  75239. 801e90e: e0e1 b.n 801ead4 <tcp_receive+0xeb8>
  75240. 801e910: 2402aed4 .word 0x2402aed4
  75241. 801e914: 2402aed1 .word 0x2402aed1
  75242. 801e918: 2402aea0 .word 0x2402aea0
  75243. 801e91c: 2402aec4 .word 0x2402aec4
  75244. #endif /* LWIP_TCP_SACK_OUT */
  75245. /* We don't use 'prev' below, so let's set it to current 'next'.
  75246. This way even if we break the loop below, 'prev' will be pointing
  75247. at the segment right in front of the newly added one. */
  75248. prev = next;
  75249. 801e920: 6bbb ldr r3, [r7, #56] @ 0x38
  75250. 801e922: 637b str r3, [r7, #52] @ 0x34
  75251. /* If the "next" segment is the last segment on the
  75252. ooseq queue, we add the incoming segment to the end
  75253. of the list. */
  75254. if (next->next == NULL &&
  75255. 801e924: 6bbb ldr r3, [r7, #56] @ 0x38
  75256. 801e926: 681b ldr r3, [r3, #0]
  75257. 801e928: 2b00 cmp r3, #0
  75258. 801e92a: f040 80c5 bne.w 801eab8 <tcp_receive+0xe9c>
  75259. TCP_SEQ_GT(seqno, next->tcphdr->seqno)) {
  75260. 801e92e: 4b7f ldr r3, [pc, #508] @ (801eb2c <tcp_receive+0xf10>)
  75261. 801e930: 681a ldr r2, [r3, #0]
  75262. 801e932: 6bbb ldr r3, [r7, #56] @ 0x38
  75263. 801e934: 691b ldr r3, [r3, #16]
  75264. 801e936: 685b ldr r3, [r3, #4]
  75265. 801e938: 1ad3 subs r3, r2, r3
  75266. if (next->next == NULL &&
  75267. 801e93a: 2b00 cmp r3, #0
  75268. 801e93c: f340 80bc ble.w 801eab8 <tcp_receive+0xe9c>
  75269. if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) {
  75270. 801e940: 6bbb ldr r3, [r7, #56] @ 0x38
  75271. 801e942: 691b ldr r3, [r3, #16]
  75272. 801e944: 899b ldrh r3, [r3, #12]
  75273. 801e946: b29b uxth r3, r3
  75274. 801e948: 4618 mov r0, r3
  75275. 801e94a: f7fa f8e5 bl 8018b18 <lwip_htons>
  75276. 801e94e: 4603 mov r3, r0
  75277. 801e950: b2db uxtb r3, r3
  75278. 801e952: f003 0301 and.w r3, r3, #1
  75279. 801e956: 2b00 cmp r3, #0
  75280. 801e958: f040 80be bne.w 801ead8 <tcp_receive+0xebc>
  75281. /* segment "next" already contains all data */
  75282. break;
  75283. }
  75284. next->next = tcp_seg_copy(&inseg);
  75285. 801e95c: 4874 ldr r0, [pc, #464] @ (801eb30 <tcp_receive+0xf14>)
  75286. 801e95e: f7fd fa2f bl 801bdc0 <tcp_seg_copy>
  75287. 801e962: 4602 mov r2, r0
  75288. 801e964: 6bbb ldr r3, [r7, #56] @ 0x38
  75289. 801e966: 601a str r2, [r3, #0]
  75290. if (next->next != NULL) {
  75291. 801e968: 6bbb ldr r3, [r7, #56] @ 0x38
  75292. 801e96a: 681b ldr r3, [r3, #0]
  75293. 801e96c: 2b00 cmp r3, #0
  75294. 801e96e: f000 80b5 beq.w 801eadc <tcp_receive+0xec0>
  75295. if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) {
  75296. 801e972: 6bbb ldr r3, [r7, #56] @ 0x38
  75297. 801e974: 691b ldr r3, [r3, #16]
  75298. 801e976: 685b ldr r3, [r3, #4]
  75299. 801e978: 6bba ldr r2, [r7, #56] @ 0x38
  75300. 801e97a: 8912 ldrh r2, [r2, #8]
  75301. 801e97c: 441a add r2, r3
  75302. 801e97e: 4b6b ldr r3, [pc, #428] @ (801eb2c <tcp_receive+0xf10>)
  75303. 801e980: 681b ldr r3, [r3, #0]
  75304. 801e982: 1ad3 subs r3, r2, r3
  75305. 801e984: 2b00 cmp r3, #0
  75306. 801e986: dd12 ble.n 801e9ae <tcp_receive+0xd92>
  75307. /* We need to trim the last segment. */
  75308. next->len = (u16_t)(seqno - next->tcphdr->seqno);
  75309. 801e988: 4b68 ldr r3, [pc, #416] @ (801eb2c <tcp_receive+0xf10>)
  75310. 801e98a: 681b ldr r3, [r3, #0]
  75311. 801e98c: b29a uxth r2, r3
  75312. 801e98e: 6bbb ldr r3, [r7, #56] @ 0x38
  75313. 801e990: 691b ldr r3, [r3, #16]
  75314. 801e992: 685b ldr r3, [r3, #4]
  75315. 801e994: b29b uxth r3, r3
  75316. 801e996: 1ad3 subs r3, r2, r3
  75317. 801e998: b29a uxth r2, r3
  75318. 801e99a: 6bbb ldr r3, [r7, #56] @ 0x38
  75319. 801e99c: 811a strh r2, [r3, #8]
  75320. pbuf_realloc(next->p, next->len);
  75321. 801e99e: 6bbb ldr r3, [r7, #56] @ 0x38
  75322. 801e9a0: 685a ldr r2, [r3, #4]
  75323. 801e9a2: 6bbb ldr r3, [r7, #56] @ 0x38
  75324. 801e9a4: 891b ldrh r3, [r3, #8]
  75325. 801e9a6: 4619 mov r1, r3
  75326. 801e9a8: 4610 mov r0, r2
  75327. 801e9aa: f7fb fbe1 bl 801a170 <pbuf_realloc>
  75328. }
  75329. /* check if the remote side overruns our receive window */
  75330. if (TCP_SEQ_GT((u32_t)tcplen + seqno, pcb->rcv_nxt + (u32_t)pcb->rcv_wnd)) {
  75331. 801e9ae: 4b61 ldr r3, [pc, #388] @ (801eb34 <tcp_receive+0xf18>)
  75332. 801e9b0: 881b ldrh r3, [r3, #0]
  75333. 801e9b2: 461a mov r2, r3
  75334. 801e9b4: 4b5d ldr r3, [pc, #372] @ (801eb2c <tcp_receive+0xf10>)
  75335. 801e9b6: 681b ldr r3, [r3, #0]
  75336. 801e9b8: 441a add r2, r3
  75337. 801e9ba: 687b ldr r3, [r7, #4]
  75338. 801e9bc: 6a5b ldr r3, [r3, #36] @ 0x24
  75339. 801e9be: 6879 ldr r1, [r7, #4]
  75340. 801e9c0: 8d09 ldrh r1, [r1, #40] @ 0x28
  75341. 801e9c2: 440b add r3, r1
  75342. 801e9c4: 1ad3 subs r3, r2, r3
  75343. 801e9c6: 2b00 cmp r3, #0
  75344. 801e9c8: f340 8088 ble.w 801eadc <tcp_receive+0xec0>
  75345. LWIP_DEBUGF(TCP_INPUT_DEBUG,
  75346. ("tcp_receive: other end overran receive window"
  75347. "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n",
  75348. seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
  75349. if (TCPH_FLAGS(next->next->tcphdr) & TCP_FIN) {
  75350. 801e9cc: 6bbb ldr r3, [r7, #56] @ 0x38
  75351. 801e9ce: 681b ldr r3, [r3, #0]
  75352. 801e9d0: 691b ldr r3, [r3, #16]
  75353. 801e9d2: 899b ldrh r3, [r3, #12]
  75354. 801e9d4: b29b uxth r3, r3
  75355. 801e9d6: 4618 mov r0, r3
  75356. 801e9d8: f7fa f89e bl 8018b18 <lwip_htons>
  75357. 801e9dc: 4603 mov r3, r0
  75358. 801e9de: b2db uxtb r3, r3
  75359. 801e9e0: f003 0301 and.w r3, r3, #1
  75360. 801e9e4: 2b00 cmp r3, #0
  75361. 801e9e6: d021 beq.n 801ea2c <tcp_receive+0xe10>
  75362. /* Must remove the FIN from the header as we're trimming
  75363. * that byte of sequence-space from the packet */
  75364. TCPH_FLAGS_SET(next->next->tcphdr, TCPH_FLAGS(next->next->tcphdr) & ~TCP_FIN);
  75365. 801e9e8: 6bbb ldr r3, [r7, #56] @ 0x38
  75366. 801e9ea: 681b ldr r3, [r3, #0]
  75367. 801e9ec: 691b ldr r3, [r3, #16]
  75368. 801e9ee: 899b ldrh r3, [r3, #12]
  75369. 801e9f0: b29b uxth r3, r3
  75370. 801e9f2: b21b sxth r3, r3
  75371. 801e9f4: f423 537c bic.w r3, r3, #16128 @ 0x3f00
  75372. 801e9f8: b21c sxth r4, r3
  75373. 801e9fa: 6bbb ldr r3, [r7, #56] @ 0x38
  75374. 801e9fc: 681b ldr r3, [r3, #0]
  75375. 801e9fe: 691b ldr r3, [r3, #16]
  75376. 801ea00: 899b ldrh r3, [r3, #12]
  75377. 801ea02: b29b uxth r3, r3
  75378. 801ea04: 4618 mov r0, r3
  75379. 801ea06: f7fa f887 bl 8018b18 <lwip_htons>
  75380. 801ea0a: 4603 mov r3, r0
  75381. 801ea0c: b2db uxtb r3, r3
  75382. 801ea0e: f003 033e and.w r3, r3, #62 @ 0x3e
  75383. 801ea12: b29b uxth r3, r3
  75384. 801ea14: 4618 mov r0, r3
  75385. 801ea16: f7fa f87f bl 8018b18 <lwip_htons>
  75386. 801ea1a: 4603 mov r3, r0
  75387. 801ea1c: b21b sxth r3, r3
  75388. 801ea1e: 4323 orrs r3, r4
  75389. 801ea20: b21a sxth r2, r3
  75390. 801ea22: 6bbb ldr r3, [r7, #56] @ 0x38
  75391. 801ea24: 681b ldr r3, [r3, #0]
  75392. 801ea26: 691b ldr r3, [r3, #16]
  75393. 801ea28: b292 uxth r2, r2
  75394. 801ea2a: 819a strh r2, [r3, #12]
  75395. }
  75396. /* Adjust length of segment to fit in the window. */
  75397. next->next->len = (u16_t)(pcb->rcv_nxt + pcb->rcv_wnd - seqno);
  75398. 801ea2c: 687b ldr r3, [r7, #4]
  75399. 801ea2e: 6a5b ldr r3, [r3, #36] @ 0x24
  75400. 801ea30: b29a uxth r2, r3
  75401. 801ea32: 687b ldr r3, [r7, #4]
  75402. 801ea34: 8d1b ldrh r3, [r3, #40] @ 0x28
  75403. 801ea36: 4413 add r3, r2
  75404. 801ea38: b299 uxth r1, r3
  75405. 801ea3a: 4b3c ldr r3, [pc, #240] @ (801eb2c <tcp_receive+0xf10>)
  75406. 801ea3c: 681b ldr r3, [r3, #0]
  75407. 801ea3e: b29a uxth r2, r3
  75408. 801ea40: 6bbb ldr r3, [r7, #56] @ 0x38
  75409. 801ea42: 681b ldr r3, [r3, #0]
  75410. 801ea44: 1a8a subs r2, r1, r2
  75411. 801ea46: b292 uxth r2, r2
  75412. 801ea48: 811a strh r2, [r3, #8]
  75413. pbuf_realloc(next->next->p, next->next->len);
  75414. 801ea4a: 6bbb ldr r3, [r7, #56] @ 0x38
  75415. 801ea4c: 681b ldr r3, [r3, #0]
  75416. 801ea4e: 685a ldr r2, [r3, #4]
  75417. 801ea50: 6bbb ldr r3, [r7, #56] @ 0x38
  75418. 801ea52: 681b ldr r3, [r3, #0]
  75419. 801ea54: 891b ldrh r3, [r3, #8]
  75420. 801ea56: 4619 mov r1, r3
  75421. 801ea58: 4610 mov r0, r2
  75422. 801ea5a: f7fb fb89 bl 801a170 <pbuf_realloc>
  75423. tcplen = TCP_TCPLEN(next->next);
  75424. 801ea5e: 6bbb ldr r3, [r7, #56] @ 0x38
  75425. 801ea60: 681b ldr r3, [r3, #0]
  75426. 801ea62: 891c ldrh r4, [r3, #8]
  75427. 801ea64: 6bbb ldr r3, [r7, #56] @ 0x38
  75428. 801ea66: 681b ldr r3, [r3, #0]
  75429. 801ea68: 691b ldr r3, [r3, #16]
  75430. 801ea6a: 899b ldrh r3, [r3, #12]
  75431. 801ea6c: b29b uxth r3, r3
  75432. 801ea6e: 4618 mov r0, r3
  75433. 801ea70: f7fa f852 bl 8018b18 <lwip_htons>
  75434. 801ea74: 4603 mov r3, r0
  75435. 801ea76: b2db uxtb r3, r3
  75436. 801ea78: f003 0303 and.w r3, r3, #3
  75437. 801ea7c: 2b00 cmp r3, #0
  75438. 801ea7e: d001 beq.n 801ea84 <tcp_receive+0xe68>
  75439. 801ea80: 2301 movs r3, #1
  75440. 801ea82: e000 b.n 801ea86 <tcp_receive+0xe6a>
  75441. 801ea84: 2300 movs r3, #0
  75442. 801ea86: 4423 add r3, r4
  75443. 801ea88: b29a uxth r2, r3
  75444. 801ea8a: 4b2a ldr r3, [pc, #168] @ (801eb34 <tcp_receive+0xf18>)
  75445. 801ea8c: 801a strh r2, [r3, #0]
  75446. LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n",
  75447. 801ea8e: 4b29 ldr r3, [pc, #164] @ (801eb34 <tcp_receive+0xf18>)
  75448. 801ea90: 881b ldrh r3, [r3, #0]
  75449. 801ea92: 461a mov r2, r3
  75450. 801ea94: 4b25 ldr r3, [pc, #148] @ (801eb2c <tcp_receive+0xf10>)
  75451. 801ea96: 681b ldr r3, [r3, #0]
  75452. 801ea98: 441a add r2, r3
  75453. 801ea9a: 687b ldr r3, [r7, #4]
  75454. 801ea9c: 6a5b ldr r3, [r3, #36] @ 0x24
  75455. 801ea9e: 6879 ldr r1, [r7, #4]
  75456. 801eaa0: 8d09 ldrh r1, [r1, #40] @ 0x28
  75457. 801eaa2: 440b add r3, r1
  75458. 801eaa4: 429a cmp r2, r3
  75459. 801eaa6: d019 beq.n 801eadc <tcp_receive+0xec0>
  75460. 801eaa8: 4b23 ldr r3, [pc, #140] @ (801eb38 <tcp_receive+0xf1c>)
  75461. 801eaaa: f44f 62df mov.w r2, #1784 @ 0x6f8
  75462. 801eaae: 4923 ldr r1, [pc, #140] @ (801eb3c <tcp_receive+0xf20>)
  75463. 801eab0: 4823 ldr r0, [pc, #140] @ (801eb40 <tcp_receive+0xf24>)
  75464. 801eab2: f00a ff8b bl 80299cc <iprintf>
  75465. (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd));
  75466. }
  75467. }
  75468. break;
  75469. 801eab6: e011 b.n 801eadc <tcp_receive+0xec0>
  75470. for (next = pcb->ooseq; next != NULL; next = next->next) {
  75471. 801eab8: 6bbb ldr r3, [r7, #56] @ 0x38
  75472. 801eaba: 681b ldr r3, [r3, #0]
  75473. 801eabc: 63bb str r3, [r7, #56] @ 0x38
  75474. 801eabe: 6bbb ldr r3, [r7, #56] @ 0x38
  75475. 801eac0: 2b00 cmp r3, #0
  75476. 801eac2: f47f aea5 bne.w 801e810 <tcp_receive+0xbf4>
  75477. 801eac6: e00a b.n 801eade <tcp_receive+0xec2>
  75478. break;
  75479. 801eac8: bf00 nop
  75480. 801eaca: e008 b.n 801eade <tcp_receive+0xec2>
  75481. break;
  75482. 801eacc: bf00 nop
  75483. 801eace: e006 b.n 801eade <tcp_receive+0xec2>
  75484. break;
  75485. 801ead0: bf00 nop
  75486. 801ead2: e004 b.n 801eade <tcp_receive+0xec2>
  75487. break;
  75488. 801ead4: bf00 nop
  75489. 801ead6: e002 b.n 801eade <tcp_receive+0xec2>
  75490. break;
  75491. 801ead8: bf00 nop
  75492. 801eada: e000 b.n 801eade <tcp_receive+0xec2>
  75493. break;
  75494. 801eadc: bf00 nop
  75495. #endif /* TCP_OOSEQ_BYTES_LIMIT || TCP_OOSEQ_PBUFS_LIMIT */
  75496. #endif /* TCP_QUEUE_OOSEQ */
  75497. /* We send the ACK packet after we've (potentially) dealt with SACKs,
  75498. so they can be included in the acknowledgment. */
  75499. tcp_send_empty_ack(pcb);
  75500. 801eade: 6878 ldr r0, [r7, #4]
  75501. 801eae0: f001 fefc bl 80208dc <tcp_send_empty_ack>
  75502. if (pcb->rcv_nxt == seqno) {
  75503. 801eae4: e003 b.n 801eaee <tcp_receive+0xed2>
  75504. }
  75505. } else {
  75506. /* The incoming segment is not within the window. */
  75507. tcp_send_empty_ack(pcb);
  75508. 801eae6: 6878 ldr r0, [r7, #4]
  75509. 801eae8: f001 fef8 bl 80208dc <tcp_send_empty_ack>
  75510. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
  75511. 801eaec: e01a b.n 801eb24 <tcp_receive+0xf08>
  75512. 801eaee: e019 b.n 801eb24 <tcp_receive+0xf08>
  75513. }
  75514. } else {
  75515. /* Segments with length 0 is taken care of here. Segments that
  75516. fall out of the window are ACKed. */
  75517. if (!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd - 1)) {
  75518. 801eaf0: 4b0e ldr r3, [pc, #56] @ (801eb2c <tcp_receive+0xf10>)
  75519. 801eaf2: 681a ldr r2, [r3, #0]
  75520. 801eaf4: 687b ldr r3, [r7, #4]
  75521. 801eaf6: 6a5b ldr r3, [r3, #36] @ 0x24
  75522. 801eaf8: 1ad3 subs r3, r2, r3
  75523. 801eafa: 2b00 cmp r3, #0
  75524. 801eafc: db0a blt.n 801eb14 <tcp_receive+0xef8>
  75525. 801eafe: 4b0b ldr r3, [pc, #44] @ (801eb2c <tcp_receive+0xf10>)
  75526. 801eb00: 681a ldr r2, [r3, #0]
  75527. 801eb02: 687b ldr r3, [r7, #4]
  75528. 801eb04: 6a5b ldr r3, [r3, #36] @ 0x24
  75529. 801eb06: 6879 ldr r1, [r7, #4]
  75530. 801eb08: 8d09 ldrh r1, [r1, #40] @ 0x28
  75531. 801eb0a: 440b add r3, r1
  75532. 801eb0c: 1ad3 subs r3, r2, r3
  75533. 801eb0e: 3301 adds r3, #1
  75534. 801eb10: 2b00 cmp r3, #0
  75535. 801eb12: dd07 ble.n 801eb24 <tcp_receive+0xf08>
  75536. tcp_ack_now(pcb);
  75537. 801eb14: 687b ldr r3, [r7, #4]
  75538. 801eb16: 8b5b ldrh r3, [r3, #26]
  75539. 801eb18: f043 0302 orr.w r3, r3, #2
  75540. 801eb1c: b29a uxth r2, r3
  75541. 801eb1e: 687b ldr r3, [r7, #4]
  75542. 801eb20: 835a strh r2, [r3, #26]
  75543. }
  75544. }
  75545. }
  75546. 801eb22: e7ff b.n 801eb24 <tcp_receive+0xf08>
  75547. 801eb24: bf00 nop
  75548. 801eb26: 3750 adds r7, #80 @ 0x50
  75549. 801eb28: 46bd mov sp, r7
  75550. 801eb2a: bdb0 pop {r4, r5, r7, pc}
  75551. 801eb2c: 2402aec4 .word 0x2402aec4
  75552. 801eb30: 2402aea0 .word 0x2402aea0
  75553. 801eb34: 2402aece .word 0x2402aece
  75554. 801eb38: 0802ed10 .word 0x0802ed10
  75555. 801eb3c: 0802f0b8 .word 0x0802f0b8
  75556. 801eb40: 0802ed5c .word 0x0802ed5c
  75557. 0801eb44 <tcp_get_next_optbyte>:
  75558. static u8_t
  75559. tcp_get_next_optbyte(void)
  75560. {
  75561. 801eb44: b480 push {r7}
  75562. 801eb46: b083 sub sp, #12
  75563. 801eb48: af00 add r7, sp, #0
  75564. u16_t optidx = tcp_optidx++;
  75565. 801eb4a: 4b15 ldr r3, [pc, #84] @ (801eba0 <tcp_get_next_optbyte+0x5c>)
  75566. 801eb4c: 881b ldrh r3, [r3, #0]
  75567. 801eb4e: 1c5a adds r2, r3, #1
  75568. 801eb50: b291 uxth r1, r2
  75569. 801eb52: 4a13 ldr r2, [pc, #76] @ (801eba0 <tcp_get_next_optbyte+0x5c>)
  75570. 801eb54: 8011 strh r1, [r2, #0]
  75571. 801eb56: 80fb strh r3, [r7, #6]
  75572. if ((tcphdr_opt2 == NULL) || (optidx < tcphdr_opt1len)) {
  75573. 801eb58: 4b12 ldr r3, [pc, #72] @ (801eba4 <tcp_get_next_optbyte+0x60>)
  75574. 801eb5a: 681b ldr r3, [r3, #0]
  75575. 801eb5c: 2b00 cmp r3, #0
  75576. 801eb5e: d004 beq.n 801eb6a <tcp_get_next_optbyte+0x26>
  75577. 801eb60: 4b11 ldr r3, [pc, #68] @ (801eba8 <tcp_get_next_optbyte+0x64>)
  75578. 801eb62: 881b ldrh r3, [r3, #0]
  75579. 801eb64: 88fa ldrh r2, [r7, #6]
  75580. 801eb66: 429a cmp r2, r3
  75581. 801eb68: d208 bcs.n 801eb7c <tcp_get_next_optbyte+0x38>
  75582. u8_t *opts = (u8_t *)tcphdr + TCP_HLEN;
  75583. 801eb6a: 4b10 ldr r3, [pc, #64] @ (801ebac <tcp_get_next_optbyte+0x68>)
  75584. 801eb6c: 681b ldr r3, [r3, #0]
  75585. 801eb6e: 3314 adds r3, #20
  75586. 801eb70: 603b str r3, [r7, #0]
  75587. return opts[optidx];
  75588. 801eb72: 88fb ldrh r3, [r7, #6]
  75589. 801eb74: 683a ldr r2, [r7, #0]
  75590. 801eb76: 4413 add r3, r2
  75591. 801eb78: 781b ldrb r3, [r3, #0]
  75592. 801eb7a: e00b b.n 801eb94 <tcp_get_next_optbyte+0x50>
  75593. } else {
  75594. u8_t idx = (u8_t)(optidx - tcphdr_opt1len);
  75595. 801eb7c: 88fb ldrh r3, [r7, #6]
  75596. 801eb7e: b2da uxtb r2, r3
  75597. 801eb80: 4b09 ldr r3, [pc, #36] @ (801eba8 <tcp_get_next_optbyte+0x64>)
  75598. 801eb82: 881b ldrh r3, [r3, #0]
  75599. 801eb84: b2db uxtb r3, r3
  75600. 801eb86: 1ad3 subs r3, r2, r3
  75601. 801eb88: 717b strb r3, [r7, #5]
  75602. return tcphdr_opt2[idx];
  75603. 801eb8a: 4b06 ldr r3, [pc, #24] @ (801eba4 <tcp_get_next_optbyte+0x60>)
  75604. 801eb8c: 681a ldr r2, [r3, #0]
  75605. 801eb8e: 797b ldrb r3, [r7, #5]
  75606. 801eb90: 4413 add r3, r2
  75607. 801eb92: 781b ldrb r3, [r3, #0]
  75608. }
  75609. }
  75610. 801eb94: 4618 mov r0, r3
  75611. 801eb96: 370c adds r7, #12
  75612. 801eb98: 46bd mov sp, r7
  75613. 801eb9a: f85d 7b04 ldr.w r7, [sp], #4
  75614. 801eb9e: 4770 bx lr
  75615. 801eba0: 2402aec0 .word 0x2402aec0
  75616. 801eba4: 2402aebc .word 0x2402aebc
  75617. 801eba8: 2402aeba .word 0x2402aeba
  75618. 801ebac: 2402aeb4 .word 0x2402aeb4
  75619. 0801ebb0 <tcp_parseopt>:
  75620. *
  75621. * @param pcb the tcp_pcb for which a segment arrived
  75622. */
  75623. static void
  75624. tcp_parseopt(struct tcp_pcb *pcb)
  75625. {
  75626. 801ebb0: b580 push {r7, lr}
  75627. 801ebb2: b084 sub sp, #16
  75628. 801ebb4: af00 add r7, sp, #0
  75629. 801ebb6: 6078 str r0, [r7, #4]
  75630. u16_t mss;
  75631. #if LWIP_TCP_TIMESTAMPS
  75632. u32_t tsval;
  75633. #endif
  75634. LWIP_ASSERT("tcp_parseopt: invalid pcb", pcb != NULL);
  75635. 801ebb8: 687b ldr r3, [r7, #4]
  75636. 801ebba: 2b00 cmp r3, #0
  75637. 801ebbc: d106 bne.n 801ebcc <tcp_parseopt+0x1c>
  75638. 801ebbe: 4b33 ldr r3, [pc, #204] @ (801ec8c <tcp_parseopt+0xdc>)
  75639. 801ebc0: f240 727d movw r2, #1917 @ 0x77d
  75640. 801ebc4: 4932 ldr r1, [pc, #200] @ (801ec90 <tcp_parseopt+0xe0>)
  75641. 801ebc6: 4833 ldr r0, [pc, #204] @ (801ec94 <tcp_parseopt+0xe4>)
  75642. 801ebc8: f00a ff00 bl 80299cc <iprintf>
  75643. /* Parse the TCP MSS option, if present. */
  75644. if (tcphdr_optlen != 0) {
  75645. 801ebcc: 4b32 ldr r3, [pc, #200] @ (801ec98 <tcp_parseopt+0xe8>)
  75646. 801ebce: 881b ldrh r3, [r3, #0]
  75647. 801ebd0: 2b00 cmp r3, #0
  75648. 801ebd2: d057 beq.n 801ec84 <tcp_parseopt+0xd4>
  75649. for (tcp_optidx = 0; tcp_optidx < tcphdr_optlen; ) {
  75650. 801ebd4: 4b31 ldr r3, [pc, #196] @ (801ec9c <tcp_parseopt+0xec>)
  75651. 801ebd6: 2200 movs r2, #0
  75652. 801ebd8: 801a strh r2, [r3, #0]
  75653. 801ebda: e047 b.n 801ec6c <tcp_parseopt+0xbc>
  75654. u8_t opt = tcp_get_next_optbyte();
  75655. 801ebdc: f7ff ffb2 bl 801eb44 <tcp_get_next_optbyte>
  75656. 801ebe0: 4603 mov r3, r0
  75657. 801ebe2: 73fb strb r3, [r7, #15]
  75658. switch (opt) {
  75659. 801ebe4: 7bfb ldrb r3, [r7, #15]
  75660. 801ebe6: 2b02 cmp r3, #2
  75661. 801ebe8: d006 beq.n 801ebf8 <tcp_parseopt+0x48>
  75662. 801ebea: 2b02 cmp r3, #2
  75663. 801ebec: dc2b bgt.n 801ec46 <tcp_parseopt+0x96>
  75664. 801ebee: 2b00 cmp r3, #0
  75665. 801ebf0: d043 beq.n 801ec7a <tcp_parseopt+0xca>
  75666. 801ebf2: 2b01 cmp r3, #1
  75667. 801ebf4: d039 beq.n 801ec6a <tcp_parseopt+0xba>
  75668. 801ebf6: e026 b.n 801ec46 <tcp_parseopt+0x96>
  75669. /* NOP option. */
  75670. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n"));
  75671. break;
  75672. case LWIP_TCP_OPT_MSS:
  75673. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n"));
  75674. if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_MSS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_MSS) > tcphdr_optlen) {
  75675. 801ebf8: f7ff ffa4 bl 801eb44 <tcp_get_next_optbyte>
  75676. 801ebfc: 4603 mov r3, r0
  75677. 801ebfe: 2b04 cmp r3, #4
  75678. 801ec00: d13d bne.n 801ec7e <tcp_parseopt+0xce>
  75679. 801ec02: 4b26 ldr r3, [pc, #152] @ (801ec9c <tcp_parseopt+0xec>)
  75680. 801ec04: 881b ldrh r3, [r3, #0]
  75681. 801ec06: 3301 adds r3, #1
  75682. 801ec08: 4a23 ldr r2, [pc, #140] @ (801ec98 <tcp_parseopt+0xe8>)
  75683. 801ec0a: 8812 ldrh r2, [r2, #0]
  75684. 801ec0c: 4293 cmp r3, r2
  75685. 801ec0e: da36 bge.n 801ec7e <tcp_parseopt+0xce>
  75686. /* Bad length */
  75687. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
  75688. return;
  75689. }
  75690. /* An MSS option with the right option length. */
  75691. mss = (u16_t)(tcp_get_next_optbyte() << 8);
  75692. 801ec10: f7ff ff98 bl 801eb44 <tcp_get_next_optbyte>
  75693. 801ec14: 4603 mov r3, r0
  75694. 801ec16: 021b lsls r3, r3, #8
  75695. 801ec18: 81bb strh r3, [r7, #12]
  75696. mss |= tcp_get_next_optbyte();
  75697. 801ec1a: f7ff ff93 bl 801eb44 <tcp_get_next_optbyte>
  75698. 801ec1e: 4603 mov r3, r0
  75699. 801ec20: 461a mov r2, r3
  75700. 801ec22: 89bb ldrh r3, [r7, #12]
  75701. 801ec24: 4313 orrs r3, r2
  75702. 801ec26: 81bb strh r3, [r7, #12]
  75703. /* Limit the mss to the configured TCP_MSS and prevent division by zero */
  75704. pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
  75705. 801ec28: 89bb ldrh r3, [r7, #12]
  75706. 801ec2a: f240 52b4 movw r2, #1460 @ 0x5b4
  75707. 801ec2e: 4293 cmp r3, r2
  75708. 801ec30: d804 bhi.n 801ec3c <tcp_parseopt+0x8c>
  75709. 801ec32: 89bb ldrh r3, [r7, #12]
  75710. 801ec34: 2b00 cmp r3, #0
  75711. 801ec36: d001 beq.n 801ec3c <tcp_parseopt+0x8c>
  75712. 801ec38: 89ba ldrh r2, [r7, #12]
  75713. 801ec3a: e001 b.n 801ec40 <tcp_parseopt+0x90>
  75714. 801ec3c: f240 52b4 movw r2, #1460 @ 0x5b4
  75715. 801ec40: 687b ldr r3, [r7, #4]
  75716. 801ec42: 865a strh r2, [r3, #50] @ 0x32
  75717. break;
  75718. 801ec44: e012 b.n 801ec6c <tcp_parseopt+0xbc>
  75719. }
  75720. break;
  75721. #endif /* LWIP_TCP_SACK_OUT */
  75722. default:
  75723. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n"));
  75724. data = tcp_get_next_optbyte();
  75725. 801ec46: f7ff ff7d bl 801eb44 <tcp_get_next_optbyte>
  75726. 801ec4a: 4603 mov r3, r0
  75727. 801ec4c: 72fb strb r3, [r7, #11]
  75728. if (data < 2) {
  75729. 801ec4e: 7afb ldrb r3, [r7, #11]
  75730. 801ec50: 2b01 cmp r3, #1
  75731. 801ec52: d916 bls.n 801ec82 <tcp_parseopt+0xd2>
  75732. and we don't process them further. */
  75733. return;
  75734. }
  75735. /* All other options have a length field, so that we easily
  75736. can skip past them. */
  75737. tcp_optidx += data - 2;
  75738. 801ec54: 7afb ldrb r3, [r7, #11]
  75739. 801ec56: b29a uxth r2, r3
  75740. 801ec58: 4b10 ldr r3, [pc, #64] @ (801ec9c <tcp_parseopt+0xec>)
  75741. 801ec5a: 881b ldrh r3, [r3, #0]
  75742. 801ec5c: 4413 add r3, r2
  75743. 801ec5e: b29b uxth r3, r3
  75744. 801ec60: 3b02 subs r3, #2
  75745. 801ec62: b29a uxth r2, r3
  75746. 801ec64: 4b0d ldr r3, [pc, #52] @ (801ec9c <tcp_parseopt+0xec>)
  75747. 801ec66: 801a strh r2, [r3, #0]
  75748. 801ec68: e000 b.n 801ec6c <tcp_parseopt+0xbc>
  75749. break;
  75750. 801ec6a: bf00 nop
  75751. for (tcp_optidx = 0; tcp_optidx < tcphdr_optlen; ) {
  75752. 801ec6c: 4b0b ldr r3, [pc, #44] @ (801ec9c <tcp_parseopt+0xec>)
  75753. 801ec6e: 881a ldrh r2, [r3, #0]
  75754. 801ec70: 4b09 ldr r3, [pc, #36] @ (801ec98 <tcp_parseopt+0xe8>)
  75755. 801ec72: 881b ldrh r3, [r3, #0]
  75756. 801ec74: 429a cmp r2, r3
  75757. 801ec76: d3b1 bcc.n 801ebdc <tcp_parseopt+0x2c>
  75758. 801ec78: e004 b.n 801ec84 <tcp_parseopt+0xd4>
  75759. return;
  75760. 801ec7a: bf00 nop
  75761. 801ec7c: e002 b.n 801ec84 <tcp_parseopt+0xd4>
  75762. return;
  75763. 801ec7e: bf00 nop
  75764. 801ec80: e000 b.n 801ec84 <tcp_parseopt+0xd4>
  75765. return;
  75766. 801ec82: bf00 nop
  75767. }
  75768. }
  75769. }
  75770. }
  75771. 801ec84: 3710 adds r7, #16
  75772. 801ec86: 46bd mov sp, r7
  75773. 801ec88: bd80 pop {r7, pc}
  75774. 801ec8a: bf00 nop
  75775. 801ec8c: 0802ed10 .word 0x0802ed10
  75776. 801ec90: 0802f174 .word 0x0802f174
  75777. 801ec94: 0802ed5c .word 0x0802ed5c
  75778. 801ec98: 2402aeb8 .word 0x2402aeb8
  75779. 801ec9c: 2402aec0 .word 0x2402aec0
  75780. 0801eca0 <tcp_trigger_input_pcb_close>:
  75781. void
  75782. tcp_trigger_input_pcb_close(void)
  75783. {
  75784. 801eca0: b480 push {r7}
  75785. 801eca2: af00 add r7, sp, #0
  75786. recv_flags |= TF_CLOSED;
  75787. 801eca4: 4b05 ldr r3, [pc, #20] @ (801ecbc <tcp_trigger_input_pcb_close+0x1c>)
  75788. 801eca6: 781b ldrb r3, [r3, #0]
  75789. 801eca8: f043 0310 orr.w r3, r3, #16
  75790. 801ecac: b2da uxtb r2, r3
  75791. 801ecae: 4b03 ldr r3, [pc, #12] @ (801ecbc <tcp_trigger_input_pcb_close+0x1c>)
  75792. 801ecb0: 701a strb r2, [r3, #0]
  75793. }
  75794. 801ecb2: bf00 nop
  75795. 801ecb4: 46bd mov sp, r7
  75796. 801ecb6: f85d 7b04 ldr.w r7, [sp], #4
  75797. 801ecba: 4770 bx lr
  75798. 801ecbc: 2402aed1 .word 0x2402aed1
  75799. 0801ecc0 <tcp_route>:
  75800. static err_t tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif);
  75801. /* tcp_route: common code that returns a fixed bound netif or calls ip_route */
  75802. static struct netif *
  75803. tcp_route(const struct tcp_pcb *pcb, const ip_addr_t *src, const ip_addr_t *dst)
  75804. {
  75805. 801ecc0: b580 push {r7, lr}
  75806. 801ecc2: b084 sub sp, #16
  75807. 801ecc4: af00 add r7, sp, #0
  75808. 801ecc6: 60f8 str r0, [r7, #12]
  75809. 801ecc8: 60b9 str r1, [r7, #8]
  75810. 801ecca: 607a str r2, [r7, #4]
  75811. LWIP_UNUSED_ARG(src); /* in case IPv4-only and source-based routing is disabled */
  75812. if ((pcb != NULL) && (pcb->netif_idx != NETIF_NO_INDEX)) {
  75813. 801eccc: 68fb ldr r3, [r7, #12]
  75814. 801ecce: 2b00 cmp r3, #0
  75815. 801ecd0: d00a beq.n 801ece8 <tcp_route+0x28>
  75816. 801ecd2: 68fb ldr r3, [r7, #12]
  75817. 801ecd4: 7a1b ldrb r3, [r3, #8]
  75818. 801ecd6: 2b00 cmp r3, #0
  75819. 801ecd8: d006 beq.n 801ece8 <tcp_route+0x28>
  75820. return netif_get_by_index(pcb->netif_idx);
  75821. 801ecda: 68fb ldr r3, [r7, #12]
  75822. 801ecdc: 7a1b ldrb r3, [r3, #8]
  75823. 801ecde: 4618 mov r0, r3
  75824. 801ece0: f7fb f83c bl 8019d5c <netif_get_by_index>
  75825. 801ece4: 4603 mov r3, r0
  75826. 801ece6: e003 b.n 801ecf0 <tcp_route+0x30>
  75827. } else {
  75828. return ip_route(src, dst);
  75829. 801ece8: 6878 ldr r0, [r7, #4]
  75830. 801ecea: f005 fe61 bl 80249b0 <ip4_route>
  75831. 801ecee: 4603 mov r3, r0
  75832. }
  75833. }
  75834. 801ecf0: 4618 mov r0, r3
  75835. 801ecf2: 3710 adds r7, #16
  75836. 801ecf4: 46bd mov sp, r7
  75837. 801ecf6: bd80 pop {r7, pc}
  75838. 0801ecf8 <tcp_create_segment>:
  75839. * The TCP header is filled in except ackno and wnd.
  75840. * p is freed on failure.
  75841. */
  75842. static struct tcp_seg *
  75843. tcp_create_segment(const struct tcp_pcb *pcb, struct pbuf *p, u8_t hdrflags, u32_t seqno, u8_t optflags)
  75844. {
  75845. 801ecf8: b590 push {r4, r7, lr}
  75846. 801ecfa: b087 sub sp, #28
  75847. 801ecfc: af00 add r7, sp, #0
  75848. 801ecfe: 60f8 str r0, [r7, #12]
  75849. 801ed00: 60b9 str r1, [r7, #8]
  75850. 801ed02: 603b str r3, [r7, #0]
  75851. 801ed04: 4613 mov r3, r2
  75852. 801ed06: 71fb strb r3, [r7, #7]
  75853. struct tcp_seg *seg;
  75854. u8_t optlen;
  75855. LWIP_ASSERT("tcp_create_segment: invalid pcb", pcb != NULL);
  75856. 801ed08: 68fb ldr r3, [r7, #12]
  75857. 801ed0a: 2b00 cmp r3, #0
  75858. 801ed0c: d105 bne.n 801ed1a <tcp_create_segment+0x22>
  75859. 801ed0e: 4b45 ldr r3, [pc, #276] @ (801ee24 <tcp_create_segment+0x12c>)
  75860. 801ed10: 22a3 movs r2, #163 @ 0xa3
  75861. 801ed12: 4945 ldr r1, [pc, #276] @ (801ee28 <tcp_create_segment+0x130>)
  75862. 801ed14: 4845 ldr r0, [pc, #276] @ (801ee2c <tcp_create_segment+0x134>)
  75863. 801ed16: f00a fe59 bl 80299cc <iprintf>
  75864. LWIP_ASSERT("tcp_create_segment: invalid pbuf", p != NULL);
  75865. 801ed1a: 68bb ldr r3, [r7, #8]
  75866. 801ed1c: 2b00 cmp r3, #0
  75867. 801ed1e: d105 bne.n 801ed2c <tcp_create_segment+0x34>
  75868. 801ed20: 4b40 ldr r3, [pc, #256] @ (801ee24 <tcp_create_segment+0x12c>)
  75869. 801ed22: 22a4 movs r2, #164 @ 0xa4
  75870. 801ed24: 4942 ldr r1, [pc, #264] @ (801ee30 <tcp_create_segment+0x138>)
  75871. 801ed26: 4841 ldr r0, [pc, #260] @ (801ee2c <tcp_create_segment+0x134>)
  75872. 801ed28: f00a fe50 bl 80299cc <iprintf>
  75873. optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb);
  75874. 801ed2c: f897 3028 ldrb.w r3, [r7, #40] @ 0x28
  75875. 801ed30: 009b lsls r3, r3, #2
  75876. 801ed32: b2db uxtb r3, r3
  75877. 801ed34: f003 0304 and.w r3, r3, #4
  75878. 801ed38: 75fb strb r3, [r7, #23]
  75879. if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) {
  75880. 801ed3a: 2003 movs r0, #3
  75881. 801ed3c: f7fa fc6a bl 8019614 <memp_malloc>
  75882. 801ed40: 6138 str r0, [r7, #16]
  75883. 801ed42: 693b ldr r3, [r7, #16]
  75884. 801ed44: 2b00 cmp r3, #0
  75885. 801ed46: d104 bne.n 801ed52 <tcp_create_segment+0x5a>
  75886. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_create_segment: no memory.\n"));
  75887. pbuf_free(p);
  75888. 801ed48: 68b8 ldr r0, [r7, #8]
  75889. 801ed4a: f7fb fbc7 bl 801a4dc <pbuf_free>
  75890. return NULL;
  75891. 801ed4e: 2300 movs r3, #0
  75892. 801ed50: e063 b.n 801ee1a <tcp_create_segment+0x122>
  75893. }
  75894. seg->flags = optflags;
  75895. 801ed52: 693b ldr r3, [r7, #16]
  75896. 801ed54: f897 2028 ldrb.w r2, [r7, #40] @ 0x28
  75897. 801ed58: 731a strb r2, [r3, #12]
  75898. seg->next = NULL;
  75899. 801ed5a: 693b ldr r3, [r7, #16]
  75900. 801ed5c: 2200 movs r2, #0
  75901. 801ed5e: 601a str r2, [r3, #0]
  75902. seg->p = p;
  75903. 801ed60: 693b ldr r3, [r7, #16]
  75904. 801ed62: 68ba ldr r2, [r7, #8]
  75905. 801ed64: 605a str r2, [r3, #4]
  75906. LWIP_ASSERT("p->tot_len >= optlen", p->tot_len >= optlen);
  75907. 801ed66: 68bb ldr r3, [r7, #8]
  75908. 801ed68: 891a ldrh r2, [r3, #8]
  75909. 801ed6a: 7dfb ldrb r3, [r7, #23]
  75910. 801ed6c: b29b uxth r3, r3
  75911. 801ed6e: 429a cmp r2, r3
  75912. 801ed70: d205 bcs.n 801ed7e <tcp_create_segment+0x86>
  75913. 801ed72: 4b2c ldr r3, [pc, #176] @ (801ee24 <tcp_create_segment+0x12c>)
  75914. 801ed74: 22b0 movs r2, #176 @ 0xb0
  75915. 801ed76: 492f ldr r1, [pc, #188] @ (801ee34 <tcp_create_segment+0x13c>)
  75916. 801ed78: 482c ldr r0, [pc, #176] @ (801ee2c <tcp_create_segment+0x134>)
  75917. 801ed7a: f00a fe27 bl 80299cc <iprintf>
  75918. seg->len = p->tot_len - optlen;
  75919. 801ed7e: 68bb ldr r3, [r7, #8]
  75920. 801ed80: 891a ldrh r2, [r3, #8]
  75921. 801ed82: 7dfb ldrb r3, [r7, #23]
  75922. 801ed84: b29b uxth r3, r3
  75923. 801ed86: 1ad3 subs r3, r2, r3
  75924. 801ed88: b29a uxth r2, r3
  75925. 801ed8a: 693b ldr r3, [r7, #16]
  75926. 801ed8c: 811a strh r2, [r3, #8]
  75927. #if TCP_OVERSIZE_DBGCHECK
  75928. seg->oversize_left = 0;
  75929. 801ed8e: 693b ldr r3, [r7, #16]
  75930. 801ed90: 2200 movs r2, #0
  75931. 801ed92: 815a strh r2, [r3, #10]
  75932. LWIP_ASSERT("invalid optflags passed: TF_SEG_DATA_CHECKSUMMED",
  75933. (optflags & TF_SEG_DATA_CHECKSUMMED) == 0);
  75934. #endif /* TCP_CHECKSUM_ON_COPY */
  75935. /* build TCP header */
  75936. if (pbuf_add_header(p, TCP_HLEN)) {
  75937. 801ed94: 2114 movs r1, #20
  75938. 801ed96: 68b8 ldr r0, [r7, #8]
  75939. 801ed98: f7fb fad8 bl 801a34c <pbuf_add_header>
  75940. 801ed9c: 4603 mov r3, r0
  75941. 801ed9e: 2b00 cmp r3, #0
  75942. 801eda0: d004 beq.n 801edac <tcp_create_segment+0xb4>
  75943. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_create_segment: no room for TCP header in pbuf.\n"));
  75944. TCP_STATS_INC(tcp.err);
  75945. tcp_seg_free(seg);
  75946. 801eda2: 6938 ldr r0, [r7, #16]
  75947. 801eda4: f7fc fff3 bl 801bd8e <tcp_seg_free>
  75948. return NULL;
  75949. 801eda8: 2300 movs r3, #0
  75950. 801edaa: e036 b.n 801ee1a <tcp_create_segment+0x122>
  75951. }
  75952. seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
  75953. 801edac: 693b ldr r3, [r7, #16]
  75954. 801edae: 685b ldr r3, [r3, #4]
  75955. 801edb0: 685a ldr r2, [r3, #4]
  75956. 801edb2: 693b ldr r3, [r7, #16]
  75957. 801edb4: 611a str r2, [r3, #16]
  75958. seg->tcphdr->src = lwip_htons(pcb->local_port);
  75959. 801edb6: 68fb ldr r3, [r7, #12]
  75960. 801edb8: 8ada ldrh r2, [r3, #22]
  75961. 801edba: 693b ldr r3, [r7, #16]
  75962. 801edbc: 691c ldr r4, [r3, #16]
  75963. 801edbe: 4610 mov r0, r2
  75964. 801edc0: f7f9 feaa bl 8018b18 <lwip_htons>
  75965. 801edc4: 4603 mov r3, r0
  75966. 801edc6: 8023 strh r3, [r4, #0]
  75967. seg->tcphdr->dest = lwip_htons(pcb->remote_port);
  75968. 801edc8: 68fb ldr r3, [r7, #12]
  75969. 801edca: 8b1a ldrh r2, [r3, #24]
  75970. 801edcc: 693b ldr r3, [r7, #16]
  75971. 801edce: 691c ldr r4, [r3, #16]
  75972. 801edd0: 4610 mov r0, r2
  75973. 801edd2: f7f9 fea1 bl 8018b18 <lwip_htons>
  75974. 801edd6: 4603 mov r3, r0
  75975. 801edd8: 8063 strh r3, [r4, #2]
  75976. seg->tcphdr->seqno = lwip_htonl(seqno);
  75977. 801edda: 693b ldr r3, [r7, #16]
  75978. 801eddc: 691c ldr r4, [r3, #16]
  75979. 801edde: 6838 ldr r0, [r7, #0]
  75980. 801ede0: f7f9 feaf bl 8018b42 <lwip_htonl>
  75981. 801ede4: 4603 mov r3, r0
  75982. 801ede6: 6063 str r3, [r4, #4]
  75983. /* ackno is set in tcp_output */
  75984. TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), hdrflags);
  75985. 801ede8: 7dfb ldrb r3, [r7, #23]
  75986. 801edea: 089b lsrs r3, r3, #2
  75987. 801edec: b2db uxtb r3, r3
  75988. 801edee: 3305 adds r3, #5
  75989. 801edf0: b29b uxth r3, r3
  75990. 801edf2: 031b lsls r3, r3, #12
  75991. 801edf4: b29a uxth r2, r3
  75992. 801edf6: 79fb ldrb r3, [r7, #7]
  75993. 801edf8: b29b uxth r3, r3
  75994. 801edfa: 4313 orrs r3, r2
  75995. 801edfc: b29a uxth r2, r3
  75996. 801edfe: 693b ldr r3, [r7, #16]
  75997. 801ee00: 691c ldr r4, [r3, #16]
  75998. 801ee02: 4610 mov r0, r2
  75999. 801ee04: f7f9 fe88 bl 8018b18 <lwip_htons>
  76000. 801ee08: 4603 mov r3, r0
  76001. 801ee0a: 81a3 strh r3, [r4, #12]
  76002. /* wnd and chksum are set in tcp_output */
  76003. seg->tcphdr->urgp = 0;
  76004. 801ee0c: 693b ldr r3, [r7, #16]
  76005. 801ee0e: 691b ldr r3, [r3, #16]
  76006. 801ee10: 2200 movs r2, #0
  76007. 801ee12: 749a strb r2, [r3, #18]
  76008. 801ee14: 2200 movs r2, #0
  76009. 801ee16: 74da strb r2, [r3, #19]
  76010. return seg;
  76011. 801ee18: 693b ldr r3, [r7, #16]
  76012. }
  76013. 801ee1a: 4618 mov r0, r3
  76014. 801ee1c: 371c adds r7, #28
  76015. 801ee1e: 46bd mov sp, r7
  76016. 801ee20: bd90 pop {r4, r7, pc}
  76017. 801ee22: bf00 nop
  76018. 801ee24: 0802f190 .word 0x0802f190
  76019. 801ee28: 0802f1c4 .word 0x0802f1c4
  76020. 801ee2c: 0802f1e4 .word 0x0802f1e4
  76021. 801ee30: 0802f20c .word 0x0802f20c
  76022. 801ee34: 0802f230 .word 0x0802f230
  76023. 0801ee38 <tcp_pbuf_prealloc>:
  76024. #if TCP_OVERSIZE
  76025. static struct pbuf *
  76026. tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,
  76027. u16_t *oversize, const struct tcp_pcb *pcb, u8_t apiflags,
  76028. u8_t first_seg)
  76029. {
  76030. 801ee38: b580 push {r7, lr}
  76031. 801ee3a: b086 sub sp, #24
  76032. 801ee3c: af00 add r7, sp, #0
  76033. 801ee3e: 607b str r3, [r7, #4]
  76034. 801ee40: 4603 mov r3, r0
  76035. 801ee42: 73fb strb r3, [r7, #15]
  76036. 801ee44: 460b mov r3, r1
  76037. 801ee46: 81bb strh r3, [r7, #12]
  76038. 801ee48: 4613 mov r3, r2
  76039. 801ee4a: 817b strh r3, [r7, #10]
  76040. struct pbuf *p;
  76041. u16_t alloc = length;
  76042. 801ee4c: 89bb ldrh r3, [r7, #12]
  76043. 801ee4e: 82fb strh r3, [r7, #22]
  76044. LWIP_ASSERT("tcp_pbuf_prealloc: invalid oversize", oversize != NULL);
  76045. 801ee50: 687b ldr r3, [r7, #4]
  76046. 801ee52: 2b00 cmp r3, #0
  76047. 801ee54: d105 bne.n 801ee62 <tcp_pbuf_prealloc+0x2a>
  76048. 801ee56: 4b30 ldr r3, [pc, #192] @ (801ef18 <tcp_pbuf_prealloc+0xe0>)
  76049. 801ee58: 22e8 movs r2, #232 @ 0xe8
  76050. 801ee5a: 4930 ldr r1, [pc, #192] @ (801ef1c <tcp_pbuf_prealloc+0xe4>)
  76051. 801ee5c: 4830 ldr r0, [pc, #192] @ (801ef20 <tcp_pbuf_prealloc+0xe8>)
  76052. 801ee5e: f00a fdb5 bl 80299cc <iprintf>
  76053. LWIP_ASSERT("tcp_pbuf_prealloc: invalid pcb", pcb != NULL);
  76054. 801ee62: 6a3b ldr r3, [r7, #32]
  76055. 801ee64: 2b00 cmp r3, #0
  76056. 801ee66: d105 bne.n 801ee74 <tcp_pbuf_prealloc+0x3c>
  76057. 801ee68: 4b2b ldr r3, [pc, #172] @ (801ef18 <tcp_pbuf_prealloc+0xe0>)
  76058. 801ee6a: 22e9 movs r2, #233 @ 0xe9
  76059. 801ee6c: 492d ldr r1, [pc, #180] @ (801ef24 <tcp_pbuf_prealloc+0xec>)
  76060. 801ee6e: 482c ldr r0, [pc, #176] @ (801ef20 <tcp_pbuf_prealloc+0xe8>)
  76061. 801ee70: f00a fdac bl 80299cc <iprintf>
  76062. LWIP_UNUSED_ARG(pcb);
  76063. LWIP_UNUSED_ARG(apiflags);
  76064. LWIP_UNUSED_ARG(first_seg);
  76065. alloc = max_length;
  76066. #else /* LWIP_NETIF_TX_SINGLE_PBUF */
  76067. if (length < max_length) {
  76068. 801ee74: 89ba ldrh r2, [r7, #12]
  76069. 801ee76: 897b ldrh r3, [r7, #10]
  76070. 801ee78: 429a cmp r2, r3
  76071. 801ee7a: d221 bcs.n 801eec0 <tcp_pbuf_prealloc+0x88>
  76072. *
  76073. * Did the user set TCP_WRITE_FLAG_MORE?
  76074. *
  76075. * Will the Nagle algorithm defer transmission of this segment?
  76076. */
  76077. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  76078. 801ee7c: f897 3024 ldrb.w r3, [r7, #36] @ 0x24
  76079. 801ee80: f003 0302 and.w r3, r3, #2
  76080. 801ee84: 2b00 cmp r3, #0
  76081. 801ee86: d111 bne.n 801eeac <tcp_pbuf_prealloc+0x74>
  76082. (!(pcb->flags & TF_NODELAY) &&
  76083. 801ee88: 6a3b ldr r3, [r7, #32]
  76084. 801ee8a: 8b5b ldrh r3, [r3, #26]
  76085. 801ee8c: f003 0340 and.w r3, r3, #64 @ 0x40
  76086. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  76087. 801ee90: 2b00 cmp r3, #0
  76088. 801ee92: d115 bne.n 801eec0 <tcp_pbuf_prealloc+0x88>
  76089. (!(pcb->flags & TF_NODELAY) &&
  76090. 801ee94: f897 3028 ldrb.w r3, [r7, #40] @ 0x28
  76091. 801ee98: 2b00 cmp r3, #0
  76092. 801ee9a: d007 beq.n 801eeac <tcp_pbuf_prealloc+0x74>
  76093. (!first_seg ||
  76094. pcb->unsent != NULL ||
  76095. 801ee9c: 6a3b ldr r3, [r7, #32]
  76096. 801ee9e: 6edb ldr r3, [r3, #108] @ 0x6c
  76097. (!first_seg ||
  76098. 801eea0: 2b00 cmp r3, #0
  76099. 801eea2: d103 bne.n 801eeac <tcp_pbuf_prealloc+0x74>
  76100. pcb->unacked != NULL))) {
  76101. 801eea4: 6a3b ldr r3, [r7, #32]
  76102. 801eea6: 6f1b ldr r3, [r3, #112] @ 0x70
  76103. pcb->unsent != NULL ||
  76104. 801eea8: 2b00 cmp r3, #0
  76105. 801eeaa: d009 beq.n 801eec0 <tcp_pbuf_prealloc+0x88>
  76106. alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(TCP_OVERSIZE_CALC_LENGTH(length)));
  76107. 801eeac: 89bb ldrh r3, [r7, #12]
  76108. 801eeae: f203 53b7 addw r3, r3, #1463 @ 0x5b7
  76109. 801eeb2: f023 0203 bic.w r2, r3, #3
  76110. 801eeb6: 897b ldrh r3, [r7, #10]
  76111. 801eeb8: 4293 cmp r3, r2
  76112. 801eeba: bf28 it cs
  76113. 801eebc: 4613 movcs r3, r2
  76114. 801eebe: 82fb strh r3, [r7, #22]
  76115. }
  76116. }
  76117. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  76118. p = pbuf_alloc(layer, alloc, PBUF_RAM);
  76119. 801eec0: 8af9 ldrh r1, [r7, #22]
  76120. 801eec2: 7bfb ldrb r3, [r7, #15]
  76121. 801eec4: f44f 7220 mov.w r2, #640 @ 0x280
  76122. 801eec8: 4618 mov r0, r3
  76123. 801eeca: f7fa fff1 bl 8019eb0 <pbuf_alloc>
  76124. 801eece: 6138 str r0, [r7, #16]
  76125. if (p == NULL) {
  76126. 801eed0: 693b ldr r3, [r7, #16]
  76127. 801eed2: 2b00 cmp r3, #0
  76128. 801eed4: d101 bne.n 801eeda <tcp_pbuf_prealloc+0xa2>
  76129. return NULL;
  76130. 801eed6: 2300 movs r3, #0
  76131. 801eed8: e019 b.n 801ef0e <tcp_pbuf_prealloc+0xd6>
  76132. }
  76133. LWIP_ASSERT("need unchained pbuf", p->next == NULL);
  76134. 801eeda: 693b ldr r3, [r7, #16]
  76135. 801eedc: 681b ldr r3, [r3, #0]
  76136. 801eede: 2b00 cmp r3, #0
  76137. 801eee0: d006 beq.n 801eef0 <tcp_pbuf_prealloc+0xb8>
  76138. 801eee2: 4b0d ldr r3, [pc, #52] @ (801ef18 <tcp_pbuf_prealloc+0xe0>)
  76139. 801eee4: f240 120b movw r2, #267 @ 0x10b
  76140. 801eee8: 490f ldr r1, [pc, #60] @ (801ef28 <tcp_pbuf_prealloc+0xf0>)
  76141. 801eeea: 480d ldr r0, [pc, #52] @ (801ef20 <tcp_pbuf_prealloc+0xe8>)
  76142. 801eeec: f00a fd6e bl 80299cc <iprintf>
  76143. *oversize = p->len - length;
  76144. 801eef0: 693b ldr r3, [r7, #16]
  76145. 801eef2: 895a ldrh r2, [r3, #10]
  76146. 801eef4: 89bb ldrh r3, [r7, #12]
  76147. 801eef6: 1ad3 subs r3, r2, r3
  76148. 801eef8: b29a uxth r2, r3
  76149. 801eefa: 687b ldr r3, [r7, #4]
  76150. 801eefc: 801a strh r2, [r3, #0]
  76151. /* trim p->len to the currently used size */
  76152. p->len = p->tot_len = length;
  76153. 801eefe: 693b ldr r3, [r7, #16]
  76154. 801ef00: 89ba ldrh r2, [r7, #12]
  76155. 801ef02: 811a strh r2, [r3, #8]
  76156. 801ef04: 693b ldr r3, [r7, #16]
  76157. 801ef06: 891a ldrh r2, [r3, #8]
  76158. 801ef08: 693b ldr r3, [r7, #16]
  76159. 801ef0a: 815a strh r2, [r3, #10]
  76160. return p;
  76161. 801ef0c: 693b ldr r3, [r7, #16]
  76162. }
  76163. 801ef0e: 4618 mov r0, r3
  76164. 801ef10: 3718 adds r7, #24
  76165. 801ef12: 46bd mov sp, r7
  76166. 801ef14: bd80 pop {r7, pc}
  76167. 801ef16: bf00 nop
  76168. 801ef18: 0802f190 .word 0x0802f190
  76169. 801ef1c: 0802f248 .word 0x0802f248
  76170. 801ef20: 0802f1e4 .word 0x0802f1e4
  76171. 801ef24: 0802f26c .word 0x0802f26c
  76172. 801ef28: 0802f28c .word 0x0802f28c
  76173. 0801ef2c <tcp_write_checks>:
  76174. * @param len length of data to send (checked agains snd_buf)
  76175. * @return ERR_OK if tcp_write is allowed to proceed, another err_t otherwise
  76176. */
  76177. static err_t
  76178. tcp_write_checks(struct tcp_pcb *pcb, u16_t len)
  76179. {
  76180. 801ef2c: b580 push {r7, lr}
  76181. 801ef2e: b082 sub sp, #8
  76182. 801ef30: af00 add r7, sp, #0
  76183. 801ef32: 6078 str r0, [r7, #4]
  76184. 801ef34: 460b mov r3, r1
  76185. 801ef36: 807b strh r3, [r7, #2]
  76186. LWIP_ASSERT("tcp_write_checks: invalid pcb", pcb != NULL);
  76187. 801ef38: 687b ldr r3, [r7, #4]
  76188. 801ef3a: 2b00 cmp r3, #0
  76189. 801ef3c: d106 bne.n 801ef4c <tcp_write_checks+0x20>
  76190. 801ef3e: 4b33 ldr r3, [pc, #204] @ (801f00c <tcp_write_checks+0xe0>)
  76191. 801ef40: f240 1233 movw r2, #307 @ 0x133
  76192. 801ef44: 4932 ldr r1, [pc, #200] @ (801f010 <tcp_write_checks+0xe4>)
  76193. 801ef46: 4833 ldr r0, [pc, #204] @ (801f014 <tcp_write_checks+0xe8>)
  76194. 801ef48: f00a fd40 bl 80299cc <iprintf>
  76195. /* connection is in invalid state for data transmission? */
  76196. if ((pcb->state != ESTABLISHED) &&
  76197. 801ef4c: 687b ldr r3, [r7, #4]
  76198. 801ef4e: 7d1b ldrb r3, [r3, #20]
  76199. 801ef50: 2b04 cmp r3, #4
  76200. 801ef52: d00e beq.n 801ef72 <tcp_write_checks+0x46>
  76201. (pcb->state != CLOSE_WAIT) &&
  76202. 801ef54: 687b ldr r3, [r7, #4]
  76203. 801ef56: 7d1b ldrb r3, [r3, #20]
  76204. if ((pcb->state != ESTABLISHED) &&
  76205. 801ef58: 2b07 cmp r3, #7
  76206. 801ef5a: d00a beq.n 801ef72 <tcp_write_checks+0x46>
  76207. (pcb->state != SYN_SENT) &&
  76208. 801ef5c: 687b ldr r3, [r7, #4]
  76209. 801ef5e: 7d1b ldrb r3, [r3, #20]
  76210. (pcb->state != CLOSE_WAIT) &&
  76211. 801ef60: 2b02 cmp r3, #2
  76212. 801ef62: d006 beq.n 801ef72 <tcp_write_checks+0x46>
  76213. (pcb->state != SYN_RCVD)) {
  76214. 801ef64: 687b ldr r3, [r7, #4]
  76215. 801ef66: 7d1b ldrb r3, [r3, #20]
  76216. (pcb->state != SYN_SENT) &&
  76217. 801ef68: 2b03 cmp r3, #3
  76218. 801ef6a: d002 beq.n 801ef72 <tcp_write_checks+0x46>
  76219. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n"));
  76220. return ERR_CONN;
  76221. 801ef6c: f06f 030a mvn.w r3, #10
  76222. 801ef70: e048 b.n 801f004 <tcp_write_checks+0xd8>
  76223. } else if (len == 0) {
  76224. 801ef72: 887b ldrh r3, [r7, #2]
  76225. 801ef74: 2b00 cmp r3, #0
  76226. 801ef76: d101 bne.n 801ef7c <tcp_write_checks+0x50>
  76227. return ERR_OK;
  76228. 801ef78: 2300 movs r3, #0
  76229. 801ef7a: e043 b.n 801f004 <tcp_write_checks+0xd8>
  76230. }
  76231. /* fail on too much data */
  76232. if (len > pcb->snd_buf) {
  76233. 801ef7c: 687b ldr r3, [r7, #4]
  76234. 801ef7e: f8b3 3064 ldrh.w r3, [r3, #100] @ 0x64
  76235. 801ef82: 887a ldrh r2, [r7, #2]
  76236. 801ef84: 429a cmp r2, r3
  76237. 801ef86: d909 bls.n 801ef9c <tcp_write_checks+0x70>
  76238. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too much data (len=%"U16_F" > snd_buf=%"TCPWNDSIZE_F")\n",
  76239. len, pcb->snd_buf));
  76240. tcp_set_flags(pcb, TF_NAGLEMEMERR);
  76241. 801ef88: 687b ldr r3, [r7, #4]
  76242. 801ef8a: 8b5b ldrh r3, [r3, #26]
  76243. 801ef8c: f043 0380 orr.w r3, r3, #128 @ 0x80
  76244. 801ef90: b29a uxth r2, r3
  76245. 801ef92: 687b ldr r3, [r7, #4]
  76246. 801ef94: 835a strh r2, [r3, #26]
  76247. return ERR_MEM;
  76248. 801ef96: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  76249. 801ef9a: e033 b.n 801f004 <tcp_write_checks+0xd8>
  76250. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: queuelen: %"TCPWNDSIZE_F"\n", (tcpwnd_size_t)pcb->snd_queuelen));
  76251. /* If total number of pbufs on the unsent/unacked queues exceeds the
  76252. * configured maximum, return an error */
  76253. /* check for configured max queuelen and possible overflow */
  76254. if (pcb->snd_queuelen >= LWIP_MIN(TCP_SND_QUEUELEN, (TCP_SNDQUEUELEN_OVERFLOW + 1))) {
  76255. 801ef9c: 687b ldr r3, [r7, #4]
  76256. 801ef9e: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  76257. 801efa2: 2b0f cmp r3, #15
  76258. 801efa4: d909 bls.n 801efba <tcp_write_checks+0x8e>
  76259. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too long queue %"U16_F" (max %"U16_F")\n",
  76260. pcb->snd_queuelen, (u16_t)TCP_SND_QUEUELEN));
  76261. TCP_STATS_INC(tcp.memerr);
  76262. tcp_set_flags(pcb, TF_NAGLEMEMERR);
  76263. 801efa6: 687b ldr r3, [r7, #4]
  76264. 801efa8: 8b5b ldrh r3, [r3, #26]
  76265. 801efaa: f043 0380 orr.w r3, r3, #128 @ 0x80
  76266. 801efae: b29a uxth r2, r3
  76267. 801efb0: 687b ldr r3, [r7, #4]
  76268. 801efb2: 835a strh r2, [r3, #26]
  76269. return ERR_MEM;
  76270. 801efb4: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  76271. 801efb8: e024 b.n 801f004 <tcp_write_checks+0xd8>
  76272. }
  76273. if (pcb->snd_queuelen != 0) {
  76274. 801efba: 687b ldr r3, [r7, #4]
  76275. 801efbc: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  76276. 801efc0: 2b00 cmp r3, #0
  76277. 801efc2: d00f beq.n 801efe4 <tcp_write_checks+0xb8>
  76278. LWIP_ASSERT("tcp_write: pbufs on queue => at least one queue non-empty",
  76279. 801efc4: 687b ldr r3, [r7, #4]
  76280. 801efc6: 6f1b ldr r3, [r3, #112] @ 0x70
  76281. 801efc8: 2b00 cmp r3, #0
  76282. 801efca: d11a bne.n 801f002 <tcp_write_checks+0xd6>
  76283. 801efcc: 687b ldr r3, [r7, #4]
  76284. 801efce: 6edb ldr r3, [r3, #108] @ 0x6c
  76285. 801efd0: 2b00 cmp r3, #0
  76286. 801efd2: d116 bne.n 801f002 <tcp_write_checks+0xd6>
  76287. 801efd4: 4b0d ldr r3, [pc, #52] @ (801f00c <tcp_write_checks+0xe0>)
  76288. 801efd6: f240 1255 movw r2, #341 @ 0x155
  76289. 801efda: 490f ldr r1, [pc, #60] @ (801f018 <tcp_write_checks+0xec>)
  76290. 801efdc: 480d ldr r0, [pc, #52] @ (801f014 <tcp_write_checks+0xe8>)
  76291. 801efde: f00a fcf5 bl 80299cc <iprintf>
  76292. 801efe2: e00e b.n 801f002 <tcp_write_checks+0xd6>
  76293. pcb->unacked != NULL || pcb->unsent != NULL);
  76294. } else {
  76295. LWIP_ASSERT("tcp_write: no pbufs on queue => both queues empty",
  76296. 801efe4: 687b ldr r3, [r7, #4]
  76297. 801efe6: 6f1b ldr r3, [r3, #112] @ 0x70
  76298. 801efe8: 2b00 cmp r3, #0
  76299. 801efea: d103 bne.n 801eff4 <tcp_write_checks+0xc8>
  76300. 801efec: 687b ldr r3, [r7, #4]
  76301. 801efee: 6edb ldr r3, [r3, #108] @ 0x6c
  76302. 801eff0: 2b00 cmp r3, #0
  76303. 801eff2: d006 beq.n 801f002 <tcp_write_checks+0xd6>
  76304. 801eff4: 4b05 ldr r3, [pc, #20] @ (801f00c <tcp_write_checks+0xe0>)
  76305. 801eff6: f44f 72ac mov.w r2, #344 @ 0x158
  76306. 801effa: 4908 ldr r1, [pc, #32] @ (801f01c <tcp_write_checks+0xf0>)
  76307. 801effc: 4805 ldr r0, [pc, #20] @ (801f014 <tcp_write_checks+0xe8>)
  76308. 801effe: f00a fce5 bl 80299cc <iprintf>
  76309. pcb->unacked == NULL && pcb->unsent == NULL);
  76310. }
  76311. return ERR_OK;
  76312. 801f002: 2300 movs r3, #0
  76313. }
  76314. 801f004: 4618 mov r0, r3
  76315. 801f006: 3708 adds r7, #8
  76316. 801f008: 46bd mov sp, r7
  76317. 801f00a: bd80 pop {r7, pc}
  76318. 801f00c: 0802f190 .word 0x0802f190
  76319. 801f010: 0802f2a0 .word 0x0802f2a0
  76320. 801f014: 0802f1e4 .word 0x0802f1e4
  76321. 801f018: 0802f2c0 .word 0x0802f2c0
  76322. 801f01c: 0802f2fc .word 0x0802f2fc
  76323. 0801f020 <tcp_write>:
  76324. * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will not be set on last segment sent,
  76325. * @return ERR_OK if enqueued, another err_t on error
  76326. */
  76327. err_t
  76328. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  76329. {
  76330. 801f020: b590 push {r4, r7, lr}
  76331. 801f022: b09d sub sp, #116 @ 0x74
  76332. 801f024: af04 add r7, sp, #16
  76333. 801f026: 60f8 str r0, [r7, #12]
  76334. 801f028: 60b9 str r1, [r7, #8]
  76335. 801f02a: 4611 mov r1, r2
  76336. 801f02c: 461a mov r2, r3
  76337. 801f02e: 460b mov r3, r1
  76338. 801f030: 80fb strh r3, [r7, #6]
  76339. 801f032: 4613 mov r3, r2
  76340. 801f034: 717b strb r3, [r7, #5]
  76341. struct pbuf *concat_p = NULL;
  76342. 801f036: 2300 movs r3, #0
  76343. 801f038: 63fb str r3, [r7, #60] @ 0x3c
  76344. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  76345. 801f03a: 2300 movs r3, #0
  76346. 801f03c: 643b str r3, [r7, #64] @ 0x40
  76347. 801f03e: 2300 movs r3, #0
  76348. 801f040: 657b str r3, [r7, #84] @ 0x54
  76349. 801f042: 2300 movs r3, #0
  76350. 801f044: 653b str r3, [r7, #80] @ 0x50
  76351. 801f046: 2300 movs r3, #0
  76352. 801f048: 64fb str r3, [r7, #76] @ 0x4c
  76353. u16_t pos = 0; /* position in 'arg' data */
  76354. 801f04a: 2300 movs r3, #0
  76355. 801f04c: f8a7 304a strh.w r3, [r7, #74] @ 0x4a
  76356. u16_t queuelen;
  76357. u8_t optlen;
  76358. u8_t optflags = 0;
  76359. 801f050: 2300 movs r3, #0
  76360. 801f052: f887 302b strb.w r3, [r7, #43] @ 0x2b
  76361. #if TCP_OVERSIZE
  76362. u16_t oversize = 0;
  76363. 801f056: 2300 movs r3, #0
  76364. 801f058: 82fb strh r3, [r7, #22]
  76365. u16_t oversize_used = 0;
  76366. 801f05a: 2300 movs r3, #0
  76367. 801f05c: f8a7 3046 strh.w r3, [r7, #70] @ 0x46
  76368. #if TCP_OVERSIZE_DBGCHECK
  76369. u16_t oversize_add = 0;
  76370. 801f060: 2300 movs r3, #0
  76371. 801f062: f8a7 305a strh.w r3, [r7, #90] @ 0x5a
  76372. #endif /* TCP_OVERSIZE_DBGCHECK*/
  76373. #endif /* TCP_OVERSIZE */
  76374. u16_t extendlen = 0;
  76375. 801f066: 2300 movs r3, #0
  76376. 801f068: f8a7 305e strh.w r3, [r7, #94] @ 0x5e
  76377. u16_t concat_chksummed = 0;
  76378. #endif /* TCP_CHECKSUM_ON_COPY */
  76379. err_t err;
  76380. u16_t mss_local;
  76381. LWIP_ERROR("tcp_write: invalid pcb", pcb != NULL, return ERR_ARG);
  76382. 801f06c: 68fb ldr r3, [r7, #12]
  76383. 801f06e: 2b00 cmp r3, #0
  76384. 801f070: d109 bne.n 801f086 <tcp_write+0x66>
  76385. 801f072: 4b9d ldr r3, [pc, #628] @ (801f2e8 <tcp_write+0x2c8>)
  76386. 801f074: f44f 72cf mov.w r2, #414 @ 0x19e
  76387. 801f078: 499c ldr r1, [pc, #624] @ (801f2ec <tcp_write+0x2cc>)
  76388. 801f07a: 489d ldr r0, [pc, #628] @ (801f2f0 <tcp_write+0x2d0>)
  76389. 801f07c: f00a fca6 bl 80299cc <iprintf>
  76390. 801f080: f06f 030f mvn.w r3, #15
  76391. 801f084: e37b b.n 801f77e <tcp_write+0x75e>
  76392. /* don't allocate segments bigger than half the maximum window we ever received */
  76393. mss_local = LWIP_MIN(pcb->mss, TCPWND_MIN16(pcb->snd_wnd_max / 2));
  76394. 801f086: 68fb ldr r3, [r7, #12]
  76395. 801f088: f8b3 3062 ldrh.w r3, [r3, #98] @ 0x62
  76396. 801f08c: 085b lsrs r3, r3, #1
  76397. 801f08e: b29a uxth r2, r3
  76398. 801f090: 68fb ldr r3, [r7, #12]
  76399. 801f092: 8e5b ldrh r3, [r3, #50] @ 0x32
  76400. 801f094: 4293 cmp r3, r2
  76401. 801f096: bf28 it cs
  76402. 801f098: 4613 movcs r3, r2
  76403. 801f09a: 853b strh r3, [r7, #40] @ 0x28
  76404. mss_local = mss_local ? mss_local : pcb->mss;
  76405. 801f09c: 8d3b ldrh r3, [r7, #40] @ 0x28
  76406. 801f09e: 2b00 cmp r3, #0
  76407. 801f0a0: d102 bne.n 801f0a8 <tcp_write+0x88>
  76408. 801f0a2: 68fb ldr r3, [r7, #12]
  76409. 801f0a4: 8e5b ldrh r3, [r3, #50] @ 0x32
  76410. 801f0a6: e000 b.n 801f0aa <tcp_write+0x8a>
  76411. 801f0a8: 8d3b ldrh r3, [r7, #40] @ 0x28
  76412. 801f0aa: 853b strh r3, [r7, #40] @ 0x28
  76413. LWIP_ASSERT_CORE_LOCKED();
  76414. 801f0ac: f7f1 fa40 bl 8010530 <sys_check_core_locking>
  76415. apiflags |= TCP_WRITE_FLAG_COPY;
  76416. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  76417. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n",
  76418. (void *)pcb, arg, len, (u16_t)apiflags));
  76419. LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)",
  76420. 801f0b0: 68bb ldr r3, [r7, #8]
  76421. 801f0b2: 2b00 cmp r3, #0
  76422. 801f0b4: d109 bne.n 801f0ca <tcp_write+0xaa>
  76423. 801f0b6: 4b8c ldr r3, [pc, #560] @ (801f2e8 <tcp_write+0x2c8>)
  76424. 801f0b8: f240 12ad movw r2, #429 @ 0x1ad
  76425. 801f0bc: 498d ldr r1, [pc, #564] @ (801f2f4 <tcp_write+0x2d4>)
  76426. 801f0be: 488c ldr r0, [pc, #560] @ (801f2f0 <tcp_write+0x2d0>)
  76427. 801f0c0: f00a fc84 bl 80299cc <iprintf>
  76428. 801f0c4: f06f 030f mvn.w r3, #15
  76429. 801f0c8: e359 b.n 801f77e <tcp_write+0x75e>
  76430. arg != NULL, return ERR_ARG;);
  76431. err = tcp_write_checks(pcb, len);
  76432. 801f0ca: 88fb ldrh r3, [r7, #6]
  76433. 801f0cc: 4619 mov r1, r3
  76434. 801f0ce: 68f8 ldr r0, [r7, #12]
  76435. 801f0d0: f7ff ff2c bl 801ef2c <tcp_write_checks>
  76436. 801f0d4: 4603 mov r3, r0
  76437. 801f0d6: f887 3027 strb.w r3, [r7, #39] @ 0x27
  76438. if (err != ERR_OK) {
  76439. 801f0da: f997 3027 ldrsb.w r3, [r7, #39] @ 0x27
  76440. 801f0de: 2b00 cmp r3, #0
  76441. 801f0e0: d002 beq.n 801f0e8 <tcp_write+0xc8>
  76442. return err;
  76443. 801f0e2: f997 3027 ldrsb.w r3, [r7, #39] @ 0x27
  76444. 801f0e6: e34a b.n 801f77e <tcp_write+0x75e>
  76445. }
  76446. queuelen = pcb->snd_queuelen;
  76447. 801f0e8: 68fb ldr r3, [r7, #12]
  76448. 801f0ea: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  76449. 801f0ee: f8a7 3048 strh.w r3, [r7, #72] @ 0x48
  76450. /* ensure that segments can hold at least one data byte... */
  76451. mss_local = LWIP_MAX(mss_local, LWIP_TCP_OPT_LEN_TS + 1);
  76452. } else
  76453. #endif /* LWIP_TCP_TIMESTAMPS */
  76454. {
  76455. optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
  76456. 801f0f2: 2300 movs r3, #0
  76457. 801f0f4: f887 3026 strb.w r3, [r7, #38] @ 0x26
  76458. *
  76459. * pos records progress as data is segmented.
  76460. */
  76461. /* Find the tail of the unsent queue. */
  76462. if (pcb->unsent != NULL) {
  76463. 801f0f8: 68fb ldr r3, [r7, #12]
  76464. 801f0fa: 6edb ldr r3, [r3, #108] @ 0x6c
  76465. 801f0fc: 2b00 cmp r3, #0
  76466. 801f0fe: f000 8127 beq.w 801f350 <tcp_write+0x330>
  76467. u16_t space;
  76468. u16_t unsent_optlen;
  76469. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  76470. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  76471. 801f102: 68fb ldr r3, [r7, #12]
  76472. 801f104: 6edb ldr r3, [r3, #108] @ 0x6c
  76473. 801f106: 643b str r3, [r7, #64] @ 0x40
  76474. 801f108: e002 b.n 801f110 <tcp_write+0xf0>
  76475. last_unsent = last_unsent->next);
  76476. 801f10a: 6c3b ldr r3, [r7, #64] @ 0x40
  76477. 801f10c: 681b ldr r3, [r3, #0]
  76478. 801f10e: 643b str r3, [r7, #64] @ 0x40
  76479. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  76480. 801f110: 6c3b ldr r3, [r7, #64] @ 0x40
  76481. 801f112: 681b ldr r3, [r3, #0]
  76482. 801f114: 2b00 cmp r3, #0
  76483. 801f116: d1f8 bne.n 801f10a <tcp_write+0xea>
  76484. /* Usable space at the end of the last unsent segment */
  76485. unsent_optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(last_unsent->flags, pcb);
  76486. 801f118: 6c3b ldr r3, [r7, #64] @ 0x40
  76487. 801f11a: 7b1b ldrb r3, [r3, #12]
  76488. 801f11c: 009b lsls r3, r3, #2
  76489. 801f11e: b29b uxth r3, r3
  76490. 801f120: f003 0304 and.w r3, r3, #4
  76491. 801f124: 84bb strh r3, [r7, #36] @ 0x24
  76492. LWIP_ASSERT("mss_local is too small", mss_local >= last_unsent->len + unsent_optlen);
  76493. 801f126: 8d3a ldrh r2, [r7, #40] @ 0x28
  76494. 801f128: 6c3b ldr r3, [r7, #64] @ 0x40
  76495. 801f12a: 891b ldrh r3, [r3, #8]
  76496. 801f12c: 4619 mov r1, r3
  76497. 801f12e: 8cbb ldrh r3, [r7, #36] @ 0x24
  76498. 801f130: 440b add r3, r1
  76499. 801f132: 429a cmp r2, r3
  76500. 801f134: da06 bge.n 801f144 <tcp_write+0x124>
  76501. 801f136: 4b6c ldr r3, [pc, #432] @ (801f2e8 <tcp_write+0x2c8>)
  76502. 801f138: f44f 72f3 mov.w r2, #486 @ 0x1e6
  76503. 801f13c: 496e ldr r1, [pc, #440] @ (801f2f8 <tcp_write+0x2d8>)
  76504. 801f13e: 486c ldr r0, [pc, #432] @ (801f2f0 <tcp_write+0x2d0>)
  76505. 801f140: f00a fc44 bl 80299cc <iprintf>
  76506. space = mss_local - (last_unsent->len + unsent_optlen);
  76507. 801f144: 6c3b ldr r3, [r7, #64] @ 0x40
  76508. 801f146: 891a ldrh r2, [r3, #8]
  76509. 801f148: 8cbb ldrh r3, [r7, #36] @ 0x24
  76510. 801f14a: 4413 add r3, r2
  76511. 801f14c: b29b uxth r3, r3
  76512. 801f14e: 8d3a ldrh r2, [r7, #40] @ 0x28
  76513. 801f150: 1ad3 subs r3, r2, r3
  76514. 801f152: f8a7 305c strh.w r3, [r7, #92] @ 0x5c
  76515. * function.
  76516. */
  76517. #if TCP_OVERSIZE
  76518. #if TCP_OVERSIZE_DBGCHECK
  76519. /* check that pcb->unsent_oversize matches last_unsent->oversize_left */
  76520. LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
  76521. 801f156: 68fb ldr r3, [r7, #12]
  76522. 801f158: f8b3 2068 ldrh.w r2, [r3, #104] @ 0x68
  76523. 801f15c: 6c3b ldr r3, [r7, #64] @ 0x40
  76524. 801f15e: 895b ldrh r3, [r3, #10]
  76525. 801f160: 429a cmp r2, r3
  76526. 801f162: d006 beq.n 801f172 <tcp_write+0x152>
  76527. 801f164: 4b60 ldr r3, [pc, #384] @ (801f2e8 <tcp_write+0x2c8>)
  76528. 801f166: f240 12f3 movw r2, #499 @ 0x1f3
  76529. 801f16a: 4964 ldr r1, [pc, #400] @ (801f2fc <tcp_write+0x2dc>)
  76530. 801f16c: 4860 ldr r0, [pc, #384] @ (801f2f0 <tcp_write+0x2d0>)
  76531. 801f16e: f00a fc2d bl 80299cc <iprintf>
  76532. pcb->unsent_oversize == last_unsent->oversize_left);
  76533. #endif /* TCP_OVERSIZE_DBGCHECK */
  76534. oversize = pcb->unsent_oversize;
  76535. 801f172: 68fb ldr r3, [r7, #12]
  76536. 801f174: f8b3 3068 ldrh.w r3, [r3, #104] @ 0x68
  76537. 801f178: 82fb strh r3, [r7, #22]
  76538. if (oversize > 0) {
  76539. 801f17a: 8afb ldrh r3, [r7, #22]
  76540. 801f17c: 2b00 cmp r3, #0
  76541. 801f17e: d02e beq.n 801f1de <tcp_write+0x1be>
  76542. LWIP_ASSERT("inconsistent oversize vs. space", oversize <= space);
  76543. 801f180: 8afb ldrh r3, [r7, #22]
  76544. 801f182: f8b7 205c ldrh.w r2, [r7, #92] @ 0x5c
  76545. 801f186: 429a cmp r2, r3
  76546. 801f188: d206 bcs.n 801f198 <tcp_write+0x178>
  76547. 801f18a: 4b57 ldr r3, [pc, #348] @ (801f2e8 <tcp_write+0x2c8>)
  76548. 801f18c: f44f 72fc mov.w r2, #504 @ 0x1f8
  76549. 801f190: 495b ldr r1, [pc, #364] @ (801f300 <tcp_write+0x2e0>)
  76550. 801f192: 4857 ldr r0, [pc, #348] @ (801f2f0 <tcp_write+0x2d0>)
  76551. 801f194: f00a fc1a bl 80299cc <iprintf>
  76552. seg = last_unsent;
  76553. 801f198: 6c3b ldr r3, [r7, #64] @ 0x40
  76554. 801f19a: 657b str r3, [r7, #84] @ 0x54
  76555. oversize_used = LWIP_MIN(space, LWIP_MIN(oversize, len));
  76556. 801f19c: 8afb ldrh r3, [r7, #22]
  76557. 801f19e: 88fa ldrh r2, [r7, #6]
  76558. 801f1a0: 4293 cmp r3, r2
  76559. 801f1a2: bf28 it cs
  76560. 801f1a4: 4613 movcs r3, r2
  76561. 801f1a6: b29b uxth r3, r3
  76562. 801f1a8: f8b7 205c ldrh.w r2, [r7, #92] @ 0x5c
  76563. 801f1ac: 4293 cmp r3, r2
  76564. 801f1ae: bf28 it cs
  76565. 801f1b0: 4613 movcs r3, r2
  76566. 801f1b2: f8a7 3046 strh.w r3, [r7, #70] @ 0x46
  76567. pos += oversize_used;
  76568. 801f1b6: f8b7 204a ldrh.w r2, [r7, #74] @ 0x4a
  76569. 801f1ba: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  76570. 801f1be: 4413 add r3, r2
  76571. 801f1c0: f8a7 304a strh.w r3, [r7, #74] @ 0x4a
  76572. oversize -= oversize_used;
  76573. 801f1c4: 8afa ldrh r2, [r7, #22]
  76574. 801f1c6: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  76575. 801f1ca: 1ad3 subs r3, r2, r3
  76576. 801f1cc: b29b uxth r3, r3
  76577. 801f1ce: 82fb strh r3, [r7, #22]
  76578. space -= oversize_used;
  76579. 801f1d0: f8b7 205c ldrh.w r2, [r7, #92] @ 0x5c
  76580. 801f1d4: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  76581. 801f1d8: 1ad3 subs r3, r2, r3
  76582. 801f1da: f8a7 305c strh.w r3, [r7, #92] @ 0x5c
  76583. }
  76584. /* now we are either finished or oversize is zero */
  76585. LWIP_ASSERT("inconsistent oversize vs. len", (oversize == 0) || (pos == len));
  76586. 801f1de: 8afb ldrh r3, [r7, #22]
  76587. 801f1e0: 2b00 cmp r3, #0
  76588. 801f1e2: d00b beq.n 801f1fc <tcp_write+0x1dc>
  76589. 801f1e4: f8b7 204a ldrh.w r2, [r7, #74] @ 0x4a
  76590. 801f1e8: 88fb ldrh r3, [r7, #6]
  76591. 801f1ea: 429a cmp r2, r3
  76592. 801f1ec: d006 beq.n 801f1fc <tcp_write+0x1dc>
  76593. 801f1ee: 4b3e ldr r3, [pc, #248] @ (801f2e8 <tcp_write+0x2c8>)
  76594. 801f1f0: f44f 7200 mov.w r2, #512 @ 0x200
  76595. 801f1f4: 4943 ldr r1, [pc, #268] @ (801f304 <tcp_write+0x2e4>)
  76596. 801f1f6: 483e ldr r0, [pc, #248] @ (801f2f0 <tcp_write+0x2d0>)
  76597. 801f1f8: f00a fbe8 bl 80299cc <iprintf>
  76598. *
  76599. * This phase is skipped for LWIP_NETIF_TX_SINGLE_PBUF as we could only execute
  76600. * it after rexmit puts a segment from unacked to unsent and at this point,
  76601. * oversize info is lost.
  76602. */
  76603. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  76604. 801f1fc: f8b7 204a ldrh.w r2, [r7, #74] @ 0x4a
  76605. 801f200: 88fb ldrh r3, [r7, #6]
  76606. 801f202: 429a cmp r2, r3
  76607. 801f204: f080 8172 bcs.w 801f4ec <tcp_write+0x4cc>
  76608. 801f208: f8b7 305c ldrh.w r3, [r7, #92] @ 0x5c
  76609. 801f20c: 2b00 cmp r3, #0
  76610. 801f20e: f000 816d beq.w 801f4ec <tcp_write+0x4cc>
  76611. 801f212: 6c3b ldr r3, [r7, #64] @ 0x40
  76612. 801f214: 891b ldrh r3, [r3, #8]
  76613. 801f216: 2b00 cmp r3, #0
  76614. 801f218: f000 8168 beq.w 801f4ec <tcp_write+0x4cc>
  76615. u16_t seglen = LWIP_MIN(space, len - pos);
  76616. 801f21c: 88fa ldrh r2, [r7, #6]
  76617. 801f21e: f8b7 304a ldrh.w r3, [r7, #74] @ 0x4a
  76618. 801f222: 1ad2 subs r2, r2, r3
  76619. 801f224: f8b7 305c ldrh.w r3, [r7, #92] @ 0x5c
  76620. 801f228: 4293 cmp r3, r2
  76621. 801f22a: bfa8 it ge
  76622. 801f22c: 4613 movge r3, r2
  76623. 801f22e: 847b strh r3, [r7, #34] @ 0x22
  76624. seg = last_unsent;
  76625. 801f230: 6c3b ldr r3, [r7, #64] @ 0x40
  76626. 801f232: 657b str r3, [r7, #84] @ 0x54
  76627. /* Create a pbuf with a copy or reference to seglen bytes. We
  76628. * can use PBUF_RAW here since the data appears in the middle of
  76629. * a segment. A header will never be prepended. */
  76630. if (apiflags & TCP_WRITE_FLAG_COPY) {
  76631. 801f234: 797b ldrb r3, [r7, #5]
  76632. 801f236: f003 0301 and.w r3, r3, #1
  76633. 801f23a: 2b00 cmp r3, #0
  76634. 801f23c: d02b beq.n 801f296 <tcp_write+0x276>
  76635. /* Data is copied */
  76636. if ((concat_p = tcp_pbuf_prealloc(PBUF_RAW, seglen, space, &oversize, pcb, apiflags, 1)) == NULL) {
  76637. 801f23e: f107 0016 add.w r0, r7, #22
  76638. 801f242: f8b7 205c ldrh.w r2, [r7, #92] @ 0x5c
  76639. 801f246: 8c79 ldrh r1, [r7, #34] @ 0x22
  76640. 801f248: 2301 movs r3, #1
  76641. 801f24a: 9302 str r3, [sp, #8]
  76642. 801f24c: 797b ldrb r3, [r7, #5]
  76643. 801f24e: 9301 str r3, [sp, #4]
  76644. 801f250: 68fb ldr r3, [r7, #12]
  76645. 801f252: 9300 str r3, [sp, #0]
  76646. 801f254: 4603 mov r3, r0
  76647. 801f256: 2000 movs r0, #0
  76648. 801f258: f7ff fdee bl 801ee38 <tcp_pbuf_prealloc>
  76649. 801f25c: 63f8 str r0, [r7, #60] @ 0x3c
  76650. 801f25e: 6bfb ldr r3, [r7, #60] @ 0x3c
  76651. 801f260: 2b00 cmp r3, #0
  76652. 801f262: f000 825a beq.w 801f71a <tcp_write+0x6fa>
  76653. ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n",
  76654. seglen));
  76655. goto memerr;
  76656. }
  76657. #if TCP_OVERSIZE_DBGCHECK
  76658. oversize_add = oversize;
  76659. 801f266: 8afb ldrh r3, [r7, #22]
  76660. 801f268: f8a7 305a strh.w r3, [r7, #90] @ 0x5a
  76661. #endif /* TCP_OVERSIZE_DBGCHECK */
  76662. TCP_DATA_COPY2(concat_p->payload, (const u8_t *)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped);
  76663. 801f26c: 6bfb ldr r3, [r7, #60] @ 0x3c
  76664. 801f26e: 6858 ldr r0, [r3, #4]
  76665. 801f270: f8b7 304a ldrh.w r3, [r7, #74] @ 0x4a
  76666. 801f274: 68ba ldr r2, [r7, #8]
  76667. 801f276: 4413 add r3, r2
  76668. 801f278: 8c7a ldrh r2, [r7, #34] @ 0x22
  76669. 801f27a: 4619 mov r1, r3
  76670. 801f27c: f00a fe2f bl 8029ede <memcpy>
  76671. #if TCP_CHECKSUM_ON_COPY
  76672. concat_chksummed += seglen;
  76673. #endif /* TCP_CHECKSUM_ON_COPY */
  76674. queuelen += pbuf_clen(concat_p);
  76675. 801f280: 6bf8 ldr r0, [r7, #60] @ 0x3c
  76676. 801f282: f7fb f9b9 bl 801a5f8 <pbuf_clen>
  76677. 801f286: 4603 mov r3, r0
  76678. 801f288: 461a mov r2, r3
  76679. 801f28a: f8b7 3048 ldrh.w r3, [r7, #72] @ 0x48
  76680. 801f28e: 4413 add r3, r2
  76681. 801f290: f8a7 3048 strh.w r3, [r7, #72] @ 0x48
  76682. 801f294: e055 b.n 801f342 <tcp_write+0x322>
  76683. } else {
  76684. /* Data is not copied */
  76685. /* If the last unsent pbuf is of type PBUF_ROM, try to extend it. */
  76686. struct pbuf *p;
  76687. for (p = last_unsent->p; p->next != NULL; p = p->next);
  76688. 801f296: 6c3b ldr r3, [r7, #64] @ 0x40
  76689. 801f298: 685b ldr r3, [r3, #4]
  76690. 801f29a: 63bb str r3, [r7, #56] @ 0x38
  76691. 801f29c: e002 b.n 801f2a4 <tcp_write+0x284>
  76692. 801f29e: 6bbb ldr r3, [r7, #56] @ 0x38
  76693. 801f2a0: 681b ldr r3, [r3, #0]
  76694. 801f2a2: 63bb str r3, [r7, #56] @ 0x38
  76695. 801f2a4: 6bbb ldr r3, [r7, #56] @ 0x38
  76696. 801f2a6: 681b ldr r3, [r3, #0]
  76697. 801f2a8: 2b00 cmp r3, #0
  76698. 801f2aa: d1f8 bne.n 801f29e <tcp_write+0x27e>
  76699. if (((p->type_internal & (PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_FLAG_DATA_VOLATILE)) == 0) &&
  76700. 801f2ac: 6bbb ldr r3, [r7, #56] @ 0x38
  76701. 801f2ae: 7b1b ldrb r3, [r3, #12]
  76702. 801f2b0: f003 03c0 and.w r3, r3, #192 @ 0xc0
  76703. 801f2b4: 2b00 cmp r3, #0
  76704. 801f2b6: d129 bne.n 801f30c <tcp_write+0x2ec>
  76705. (const u8_t *)p->payload + p->len == (const u8_t *)arg) {
  76706. 801f2b8: 6bbb ldr r3, [r7, #56] @ 0x38
  76707. 801f2ba: 685b ldr r3, [r3, #4]
  76708. 801f2bc: 6bba ldr r2, [r7, #56] @ 0x38
  76709. 801f2be: 8952 ldrh r2, [r2, #10]
  76710. 801f2c0: 4413 add r3, r2
  76711. if (((p->type_internal & (PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_FLAG_DATA_VOLATILE)) == 0) &&
  76712. 801f2c2: 68ba ldr r2, [r7, #8]
  76713. 801f2c4: 429a cmp r2, r3
  76714. 801f2c6: d121 bne.n 801f30c <tcp_write+0x2ec>
  76715. LWIP_ASSERT("tcp_write: ROM pbufs cannot be oversized", pos == 0);
  76716. 801f2c8: f8b7 304a ldrh.w r3, [r7, #74] @ 0x4a
  76717. 801f2cc: 2b00 cmp r3, #0
  76718. 801f2ce: d006 beq.n 801f2de <tcp_write+0x2be>
  76719. 801f2d0: 4b05 ldr r3, [pc, #20] @ (801f2e8 <tcp_write+0x2c8>)
  76720. 801f2d2: f240 2231 movw r2, #561 @ 0x231
  76721. 801f2d6: 490c ldr r1, [pc, #48] @ (801f308 <tcp_write+0x2e8>)
  76722. 801f2d8: 4805 ldr r0, [pc, #20] @ (801f2f0 <tcp_write+0x2d0>)
  76723. 801f2da: f00a fb77 bl 80299cc <iprintf>
  76724. extendlen = seglen;
  76725. 801f2de: 8c7b ldrh r3, [r7, #34] @ 0x22
  76726. 801f2e0: f8a7 305e strh.w r3, [r7, #94] @ 0x5e
  76727. 801f2e4: e02d b.n 801f342 <tcp_write+0x322>
  76728. 801f2e6: bf00 nop
  76729. 801f2e8: 0802f190 .word 0x0802f190
  76730. 801f2ec: 0802f330 .word 0x0802f330
  76731. 801f2f0: 0802f1e4 .word 0x0802f1e4
  76732. 801f2f4: 0802f348 .word 0x0802f348
  76733. 801f2f8: 0802f37c .word 0x0802f37c
  76734. 801f2fc: 0802f394 .word 0x0802f394
  76735. 801f300: 0802f3c4 .word 0x0802f3c4
  76736. 801f304: 0802f3e4 .word 0x0802f3e4
  76737. 801f308: 0802f404 .word 0x0802f404
  76738. } else {
  76739. if ((concat_p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) {
  76740. 801f30c: 8c7b ldrh r3, [r7, #34] @ 0x22
  76741. 801f30e: 2201 movs r2, #1
  76742. 801f310: 4619 mov r1, r3
  76743. 801f312: 2000 movs r0, #0
  76744. 801f314: f7fa fdcc bl 8019eb0 <pbuf_alloc>
  76745. 801f318: 63f8 str r0, [r7, #60] @ 0x3c
  76746. 801f31a: 6bfb ldr r3, [r7, #60] @ 0x3c
  76747. 801f31c: 2b00 cmp r3, #0
  76748. 801f31e: f000 81fe beq.w 801f71e <tcp_write+0x6fe>
  76749. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  76750. ("tcp_write: could not allocate memory for zero-copy pbuf\n"));
  76751. goto memerr;
  76752. }
  76753. /* reference the non-volatile payload data */
  76754. ((struct pbuf_rom *)concat_p)->payload = (const u8_t *)arg + pos;
  76755. 801f322: f8b7 304a ldrh.w r3, [r7, #74] @ 0x4a
  76756. 801f326: 68ba ldr r2, [r7, #8]
  76757. 801f328: 441a add r2, r3
  76758. 801f32a: 6bfb ldr r3, [r7, #60] @ 0x3c
  76759. 801f32c: 605a str r2, [r3, #4]
  76760. queuelen += pbuf_clen(concat_p);
  76761. 801f32e: 6bf8 ldr r0, [r7, #60] @ 0x3c
  76762. 801f330: f7fb f962 bl 801a5f8 <pbuf_clen>
  76763. 801f334: 4603 mov r3, r0
  76764. 801f336: 461a mov r2, r3
  76765. 801f338: f8b7 3048 ldrh.w r3, [r7, #72] @ 0x48
  76766. 801f33c: 4413 add r3, r2
  76767. 801f33e: f8a7 3048 strh.w r3, [r7, #72] @ 0x48
  76768. &concat_chksum, &concat_chksum_swapped);
  76769. concat_chksummed += seglen;
  76770. #endif /* TCP_CHECKSUM_ON_COPY */
  76771. }
  76772. pos += seglen;
  76773. 801f342: f8b7 204a ldrh.w r2, [r7, #74] @ 0x4a
  76774. 801f346: 8c7b ldrh r3, [r7, #34] @ 0x22
  76775. 801f348: 4413 add r3, r2
  76776. 801f34a: f8a7 304a strh.w r3, [r7, #74] @ 0x4a
  76777. 801f34e: e0cd b.n 801f4ec <tcp_write+0x4cc>
  76778. }
  76779. #endif /* !LWIP_NETIF_TX_SINGLE_PBUF */
  76780. } else {
  76781. #if TCP_OVERSIZE
  76782. LWIP_ASSERT("unsent_oversize mismatch (pcb->unsent is NULL)",
  76783. 801f350: 68fb ldr r3, [r7, #12]
  76784. 801f352: f8b3 3068 ldrh.w r3, [r3, #104] @ 0x68
  76785. 801f356: 2b00 cmp r3, #0
  76786. 801f358: f000 80c8 beq.w 801f4ec <tcp_write+0x4cc>
  76787. 801f35c: 4b72 ldr r3, [pc, #456] @ (801f528 <tcp_write+0x508>)
  76788. 801f35e: f240 224a movw r2, #586 @ 0x24a
  76789. 801f362: 4972 ldr r1, [pc, #456] @ (801f52c <tcp_write+0x50c>)
  76790. 801f364: 4872 ldr r0, [pc, #456] @ (801f530 <tcp_write+0x510>)
  76791. 801f366: f00a fb31 bl 80299cc <iprintf>
  76792. * Phase 3: Create new segments.
  76793. *
  76794. * The new segments are chained together in the local 'queue'
  76795. * variable, ready to be appended to pcb->unsent.
  76796. */
  76797. while (pos < len) {
  76798. 801f36a: e0bf b.n 801f4ec <tcp_write+0x4cc>
  76799. struct pbuf *p;
  76800. u16_t left = len - pos;
  76801. 801f36c: 88fa ldrh r2, [r7, #6]
  76802. 801f36e: f8b7 304a ldrh.w r3, [r7, #74] @ 0x4a
  76803. 801f372: 1ad3 subs r3, r2, r3
  76804. 801f374: 843b strh r3, [r7, #32]
  76805. u16_t max_len = mss_local - optlen;
  76806. 801f376: f897 3026 ldrb.w r3, [r7, #38] @ 0x26
  76807. 801f37a: b29b uxth r3, r3
  76808. 801f37c: 8d3a ldrh r2, [r7, #40] @ 0x28
  76809. 801f37e: 1ad3 subs r3, r2, r3
  76810. 801f380: 83fb strh r3, [r7, #30]
  76811. u16_t seglen = LWIP_MIN(left, max_len);
  76812. 801f382: 8bfa ldrh r2, [r7, #30]
  76813. 801f384: 8c3b ldrh r3, [r7, #32]
  76814. 801f386: 4293 cmp r3, r2
  76815. 801f388: bf28 it cs
  76816. 801f38a: 4613 movcs r3, r2
  76817. 801f38c: 83bb strh r3, [r7, #28]
  76818. #if TCP_CHECKSUM_ON_COPY
  76819. u16_t chksum = 0;
  76820. u8_t chksum_swapped = 0;
  76821. #endif /* TCP_CHECKSUM_ON_COPY */
  76822. if (apiflags & TCP_WRITE_FLAG_COPY) {
  76823. 801f38e: 797b ldrb r3, [r7, #5]
  76824. 801f390: f003 0301 and.w r3, r3, #1
  76825. 801f394: 2b00 cmp r3, #0
  76826. 801f396: d036 beq.n 801f406 <tcp_write+0x3e6>
  76827. /* If copy is set, memory should be allocated and data copied
  76828. * into pbuf */
  76829. if ((p = tcp_pbuf_prealloc(PBUF_TRANSPORT, seglen + optlen, mss_local, &oversize, pcb, apiflags, queue == NULL)) == NULL) {
  76830. 801f398: f897 3026 ldrb.w r3, [r7, #38] @ 0x26
  76831. 801f39c: b29a uxth r2, r3
  76832. 801f39e: 8bbb ldrh r3, [r7, #28]
  76833. 801f3a0: 4413 add r3, r2
  76834. 801f3a2: b299 uxth r1, r3
  76835. 801f3a4: 6cfb ldr r3, [r7, #76] @ 0x4c
  76836. 801f3a6: 2b00 cmp r3, #0
  76837. 801f3a8: bf0c ite eq
  76838. 801f3aa: 2301 moveq r3, #1
  76839. 801f3ac: 2300 movne r3, #0
  76840. 801f3ae: b2db uxtb r3, r3
  76841. 801f3b0: f107 0016 add.w r0, r7, #22
  76842. 801f3b4: 8d3a ldrh r2, [r7, #40] @ 0x28
  76843. 801f3b6: 9302 str r3, [sp, #8]
  76844. 801f3b8: 797b ldrb r3, [r7, #5]
  76845. 801f3ba: 9301 str r3, [sp, #4]
  76846. 801f3bc: 68fb ldr r3, [r7, #12]
  76847. 801f3be: 9300 str r3, [sp, #0]
  76848. 801f3c0: 4603 mov r3, r0
  76849. 801f3c2: 2036 movs r0, #54 @ 0x36
  76850. 801f3c4: f7ff fd38 bl 801ee38 <tcp_pbuf_prealloc>
  76851. 801f3c8: 6378 str r0, [r7, #52] @ 0x34
  76852. 801f3ca: 6b7b ldr r3, [r7, #52] @ 0x34
  76853. 801f3cc: 2b00 cmp r3, #0
  76854. 801f3ce: f000 81a8 beq.w 801f722 <tcp_write+0x702>
  76855. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", seglen));
  76856. goto memerr;
  76857. }
  76858. LWIP_ASSERT("tcp_write: check that first pbuf can hold the complete seglen",
  76859. 801f3d2: 6b7b ldr r3, [r7, #52] @ 0x34
  76860. 801f3d4: 895b ldrh r3, [r3, #10]
  76861. 801f3d6: 8bba ldrh r2, [r7, #28]
  76862. 801f3d8: 429a cmp r2, r3
  76863. 801f3da: d906 bls.n 801f3ea <tcp_write+0x3ca>
  76864. 801f3dc: 4b52 ldr r3, [pc, #328] @ (801f528 <tcp_write+0x508>)
  76865. 801f3de: f240 2266 movw r2, #614 @ 0x266
  76866. 801f3e2: 4954 ldr r1, [pc, #336] @ (801f534 <tcp_write+0x514>)
  76867. 801f3e4: 4852 ldr r0, [pc, #328] @ (801f530 <tcp_write+0x510>)
  76868. 801f3e6: f00a faf1 bl 80299cc <iprintf>
  76869. (p->len >= seglen));
  76870. TCP_DATA_COPY2((char *)p->payload + optlen, (const u8_t *)arg + pos, seglen, &chksum, &chksum_swapped);
  76871. 801f3ea: 6b7b ldr r3, [r7, #52] @ 0x34
  76872. 801f3ec: 685a ldr r2, [r3, #4]
  76873. 801f3ee: f897 3026 ldrb.w r3, [r7, #38] @ 0x26
  76874. 801f3f2: 18d0 adds r0, r2, r3
  76875. 801f3f4: f8b7 304a ldrh.w r3, [r7, #74] @ 0x4a
  76876. 801f3f8: 68ba ldr r2, [r7, #8]
  76877. 801f3fa: 4413 add r3, r2
  76878. 801f3fc: 8bba ldrh r2, [r7, #28]
  76879. 801f3fe: 4619 mov r1, r3
  76880. 801f400: f00a fd6d bl 8029ede <memcpy>
  76881. 801f404: e02f b.n 801f466 <tcp_write+0x446>
  76882. * sent out on the link (as it has to be ACKed by the remote
  76883. * party) we can safely use PBUF_ROM instead of PBUF_REF here.
  76884. */
  76885. struct pbuf *p2;
  76886. #if TCP_OVERSIZE
  76887. LWIP_ASSERT("oversize == 0", oversize == 0);
  76888. 801f406: 8afb ldrh r3, [r7, #22]
  76889. 801f408: 2b00 cmp r3, #0
  76890. 801f40a: d006 beq.n 801f41a <tcp_write+0x3fa>
  76891. 801f40c: 4b46 ldr r3, [pc, #280] @ (801f528 <tcp_write+0x508>)
  76892. 801f40e: f240 2271 movw r2, #625 @ 0x271
  76893. 801f412: 4949 ldr r1, [pc, #292] @ (801f538 <tcp_write+0x518>)
  76894. 801f414: 4846 ldr r0, [pc, #280] @ (801f530 <tcp_write+0x510>)
  76895. 801f416: f00a fad9 bl 80299cc <iprintf>
  76896. #endif /* TCP_OVERSIZE */
  76897. if ((p2 = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_ROM)) == NULL) {
  76898. 801f41a: 8bbb ldrh r3, [r7, #28]
  76899. 801f41c: 2201 movs r2, #1
  76900. 801f41e: 4619 mov r1, r3
  76901. 801f420: 2036 movs r0, #54 @ 0x36
  76902. 801f422: f7fa fd45 bl 8019eb0 <pbuf_alloc>
  76903. 801f426: 61b8 str r0, [r7, #24]
  76904. 801f428: 69bb ldr r3, [r7, #24]
  76905. 801f42a: 2b00 cmp r3, #0
  76906. 801f42c: f000 817b beq.w 801f726 <tcp_write+0x706>
  76907. chksum_swapped = 1;
  76908. chksum = SWAP_BYTES_IN_WORD(chksum);
  76909. }
  76910. #endif /* TCP_CHECKSUM_ON_COPY */
  76911. /* reference the non-volatile payload data */
  76912. ((struct pbuf_rom *)p2)->payload = (const u8_t *)arg + pos;
  76913. 801f430: f8b7 304a ldrh.w r3, [r7, #74] @ 0x4a
  76914. 801f434: 68ba ldr r2, [r7, #8]
  76915. 801f436: 441a add r2, r3
  76916. 801f438: 69bb ldr r3, [r7, #24]
  76917. 801f43a: 605a str r2, [r3, #4]
  76918. /* Second, allocate a pbuf for the headers. */
  76919. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  76920. 801f43c: f897 3026 ldrb.w r3, [r7, #38] @ 0x26
  76921. 801f440: b29b uxth r3, r3
  76922. 801f442: f44f 7220 mov.w r2, #640 @ 0x280
  76923. 801f446: 4619 mov r1, r3
  76924. 801f448: 2036 movs r0, #54 @ 0x36
  76925. 801f44a: f7fa fd31 bl 8019eb0 <pbuf_alloc>
  76926. 801f44e: 6378 str r0, [r7, #52] @ 0x34
  76927. 801f450: 6b7b ldr r3, [r7, #52] @ 0x34
  76928. 801f452: 2b00 cmp r3, #0
  76929. 801f454: d103 bne.n 801f45e <tcp_write+0x43e>
  76930. /* If allocation fails, we have to deallocate the data pbuf as
  76931. * well. */
  76932. pbuf_free(p2);
  76933. 801f456: 69b8 ldr r0, [r7, #24]
  76934. 801f458: f7fb f840 bl 801a4dc <pbuf_free>
  76935. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write: could not allocate memory for header pbuf\n"));
  76936. goto memerr;
  76937. 801f45c: e166 b.n 801f72c <tcp_write+0x70c>
  76938. }
  76939. /* Concatenate the headers and data pbufs together. */
  76940. pbuf_cat(p/*header*/, p2/*data*/);
  76941. 801f45e: 69b9 ldr r1, [r7, #24]
  76942. 801f460: 6b78 ldr r0, [r7, #52] @ 0x34
  76943. 801f462: f7fb f909 bl 801a678 <pbuf_cat>
  76944. }
  76945. queuelen += pbuf_clen(p);
  76946. 801f466: 6b78 ldr r0, [r7, #52] @ 0x34
  76947. 801f468: f7fb f8c6 bl 801a5f8 <pbuf_clen>
  76948. 801f46c: 4603 mov r3, r0
  76949. 801f46e: 461a mov r2, r3
  76950. 801f470: f8b7 3048 ldrh.w r3, [r7, #72] @ 0x48
  76951. 801f474: 4413 add r3, r2
  76952. 801f476: f8a7 3048 strh.w r3, [r7, #72] @ 0x48
  76953. /* Now that there are more segments queued, we check again if the
  76954. * length of the queue exceeds the configured maximum or
  76955. * overflows. */
  76956. if (queuelen > LWIP_MIN(TCP_SND_QUEUELEN, TCP_SNDQUEUELEN_OVERFLOW)) {
  76957. 801f47a: f8b7 3048 ldrh.w r3, [r7, #72] @ 0x48
  76958. 801f47e: 2b10 cmp r3, #16
  76959. 801f480: d903 bls.n 801f48a <tcp_write+0x46a>
  76960. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write: queue too long %"U16_F" (%d)\n",
  76961. queuelen, (int)TCP_SND_QUEUELEN));
  76962. pbuf_free(p);
  76963. 801f482: 6b78 ldr r0, [r7, #52] @ 0x34
  76964. 801f484: f7fb f82a bl 801a4dc <pbuf_free>
  76965. goto memerr;
  76966. 801f488: e150 b.n 801f72c <tcp_write+0x70c>
  76967. }
  76968. if ((seg = tcp_create_segment(pcb, p, 0, pcb->snd_lbb + pos, optflags)) == NULL) {
  76969. 801f48a: 68fb ldr r3, [r7, #12]
  76970. 801f48c: 6dda ldr r2, [r3, #92] @ 0x5c
  76971. 801f48e: f8b7 304a ldrh.w r3, [r7, #74] @ 0x4a
  76972. 801f492: 441a add r2, r3
  76973. 801f494: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  76974. 801f498: 9300 str r3, [sp, #0]
  76975. 801f49a: 4613 mov r3, r2
  76976. 801f49c: 2200 movs r2, #0
  76977. 801f49e: 6b79 ldr r1, [r7, #52] @ 0x34
  76978. 801f4a0: 68f8 ldr r0, [r7, #12]
  76979. 801f4a2: f7ff fc29 bl 801ecf8 <tcp_create_segment>
  76980. 801f4a6: 6578 str r0, [r7, #84] @ 0x54
  76981. 801f4a8: 6d7b ldr r3, [r7, #84] @ 0x54
  76982. 801f4aa: 2b00 cmp r3, #0
  76983. 801f4ac: f000 813d beq.w 801f72a <tcp_write+0x70a>
  76984. goto memerr;
  76985. }
  76986. #if TCP_OVERSIZE_DBGCHECK
  76987. seg->oversize_left = oversize;
  76988. 801f4b0: 8afa ldrh r2, [r7, #22]
  76989. 801f4b2: 6d7b ldr r3, [r7, #84] @ 0x54
  76990. 801f4b4: 815a strh r2, [r3, #10]
  76991. seg->chksum_swapped = chksum_swapped;
  76992. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  76993. #endif /* TCP_CHECKSUM_ON_COPY */
  76994. /* first segment of to-be-queued data? */
  76995. if (queue == NULL) {
  76996. 801f4b6: 6cfb ldr r3, [r7, #76] @ 0x4c
  76997. 801f4b8: 2b00 cmp r3, #0
  76998. 801f4ba: d102 bne.n 801f4c2 <tcp_write+0x4a2>
  76999. queue = seg;
  77000. 801f4bc: 6d7b ldr r3, [r7, #84] @ 0x54
  77001. 801f4be: 64fb str r3, [r7, #76] @ 0x4c
  77002. 801f4c0: e00c b.n 801f4dc <tcp_write+0x4bc>
  77003. } else {
  77004. /* Attach the segment to the end of the queued segments */
  77005. LWIP_ASSERT("prev_seg != NULL", prev_seg != NULL);
  77006. 801f4c2: 6d3b ldr r3, [r7, #80] @ 0x50
  77007. 801f4c4: 2b00 cmp r3, #0
  77008. 801f4c6: d106 bne.n 801f4d6 <tcp_write+0x4b6>
  77009. 801f4c8: 4b17 ldr r3, [pc, #92] @ (801f528 <tcp_write+0x508>)
  77010. 801f4ca: f240 22ab movw r2, #683 @ 0x2ab
  77011. 801f4ce: 491b ldr r1, [pc, #108] @ (801f53c <tcp_write+0x51c>)
  77012. 801f4d0: 4817 ldr r0, [pc, #92] @ (801f530 <tcp_write+0x510>)
  77013. 801f4d2: f00a fa7b bl 80299cc <iprintf>
  77014. prev_seg->next = seg;
  77015. 801f4d6: 6d3b ldr r3, [r7, #80] @ 0x50
  77016. 801f4d8: 6d7a ldr r2, [r7, #84] @ 0x54
  77017. 801f4da: 601a str r2, [r3, #0]
  77018. }
  77019. /* remember last segment of to-be-queued data for next iteration */
  77020. prev_seg = seg;
  77021. 801f4dc: 6d7b ldr r3, [r7, #84] @ 0x54
  77022. 801f4de: 653b str r3, [r7, #80] @ 0x50
  77023. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_write: queueing %"U32_F":%"U32_F"\n",
  77024. lwip_ntohl(seg->tcphdr->seqno),
  77025. lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg)));
  77026. pos += seglen;
  77027. 801f4e0: f8b7 204a ldrh.w r2, [r7, #74] @ 0x4a
  77028. 801f4e4: 8bbb ldrh r3, [r7, #28]
  77029. 801f4e6: 4413 add r3, r2
  77030. 801f4e8: f8a7 304a strh.w r3, [r7, #74] @ 0x4a
  77031. while (pos < len) {
  77032. 801f4ec: f8b7 204a ldrh.w r2, [r7, #74] @ 0x4a
  77033. 801f4f0: 88fb ldrh r3, [r7, #6]
  77034. 801f4f2: 429a cmp r2, r3
  77035. 801f4f4: f4ff af3a bcc.w 801f36c <tcp_write+0x34c>
  77036. /*
  77037. * All three segmentation phases were successful. We can commit the
  77038. * transaction.
  77039. */
  77040. #if TCP_OVERSIZE_DBGCHECK
  77041. if ((last_unsent != NULL) && (oversize_add != 0)) {
  77042. 801f4f8: 6c3b ldr r3, [r7, #64] @ 0x40
  77043. 801f4fa: 2b00 cmp r3, #0
  77044. 801f4fc: d00b beq.n 801f516 <tcp_write+0x4f6>
  77045. 801f4fe: f8b7 305a ldrh.w r3, [r7, #90] @ 0x5a
  77046. 801f502: 2b00 cmp r3, #0
  77047. 801f504: d007 beq.n 801f516 <tcp_write+0x4f6>
  77048. last_unsent->oversize_left += oversize_add;
  77049. 801f506: 6c3b ldr r3, [r7, #64] @ 0x40
  77050. 801f508: 895a ldrh r2, [r3, #10]
  77051. 801f50a: f8b7 305a ldrh.w r3, [r7, #90] @ 0x5a
  77052. 801f50e: 4413 add r3, r2
  77053. 801f510: b29a uxth r2, r3
  77054. 801f512: 6c3b ldr r3, [r7, #64] @ 0x40
  77055. 801f514: 815a strh r2, [r3, #10]
  77056. /*
  77057. * Phase 1: If data has been added to the preallocated tail of
  77058. * last_unsent, we update the length fields of the pbuf chain.
  77059. */
  77060. #if TCP_OVERSIZE
  77061. if (oversize_used > 0) {
  77062. 801f516: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  77063. 801f51a: 2b00 cmp r3, #0
  77064. 801f51c: d052 beq.n 801f5c4 <tcp_write+0x5a4>
  77065. struct pbuf *p;
  77066. /* Bump tot_len of whole chain, len of tail */
  77067. for (p = last_unsent->p; p; p = p->next) {
  77068. 801f51e: 6c3b ldr r3, [r7, #64] @ 0x40
  77069. 801f520: 685b ldr r3, [r3, #4]
  77070. 801f522: 633b str r3, [r7, #48] @ 0x30
  77071. 801f524: e02e b.n 801f584 <tcp_write+0x564>
  77072. 801f526: bf00 nop
  77073. 801f528: 0802f190 .word 0x0802f190
  77074. 801f52c: 0802f430 .word 0x0802f430
  77075. 801f530: 0802f1e4 .word 0x0802f1e4
  77076. 801f534: 0802f460 .word 0x0802f460
  77077. 801f538: 0802f4a0 .word 0x0802f4a0
  77078. 801f53c: 0802f4b0 .word 0x0802f4b0
  77079. p->tot_len += oversize_used;
  77080. 801f540: 6b3b ldr r3, [r7, #48] @ 0x30
  77081. 801f542: 891a ldrh r2, [r3, #8]
  77082. 801f544: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  77083. 801f548: 4413 add r3, r2
  77084. 801f54a: b29a uxth r2, r3
  77085. 801f54c: 6b3b ldr r3, [r7, #48] @ 0x30
  77086. 801f54e: 811a strh r2, [r3, #8]
  77087. if (p->next == NULL) {
  77088. 801f550: 6b3b ldr r3, [r7, #48] @ 0x30
  77089. 801f552: 681b ldr r3, [r3, #0]
  77090. 801f554: 2b00 cmp r3, #0
  77091. 801f556: d112 bne.n 801f57e <tcp_write+0x55e>
  77092. TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent);
  77093. 801f558: 6b3b ldr r3, [r7, #48] @ 0x30
  77094. 801f55a: 685b ldr r3, [r3, #4]
  77095. 801f55c: 6b3a ldr r2, [r7, #48] @ 0x30
  77096. 801f55e: 8952 ldrh r2, [r2, #10]
  77097. 801f560: 4413 add r3, r2
  77098. 801f562: f8b7 2046 ldrh.w r2, [r7, #70] @ 0x46
  77099. 801f566: 68b9 ldr r1, [r7, #8]
  77100. 801f568: 4618 mov r0, r3
  77101. 801f56a: f00a fcb8 bl 8029ede <memcpy>
  77102. p->len += oversize_used;
  77103. 801f56e: 6b3b ldr r3, [r7, #48] @ 0x30
  77104. 801f570: 895a ldrh r2, [r3, #10]
  77105. 801f572: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  77106. 801f576: 4413 add r3, r2
  77107. 801f578: b29a uxth r2, r3
  77108. 801f57a: 6b3b ldr r3, [r7, #48] @ 0x30
  77109. 801f57c: 815a strh r2, [r3, #10]
  77110. for (p = last_unsent->p; p; p = p->next) {
  77111. 801f57e: 6b3b ldr r3, [r7, #48] @ 0x30
  77112. 801f580: 681b ldr r3, [r3, #0]
  77113. 801f582: 633b str r3, [r7, #48] @ 0x30
  77114. 801f584: 6b3b ldr r3, [r7, #48] @ 0x30
  77115. 801f586: 2b00 cmp r3, #0
  77116. 801f588: d1da bne.n 801f540 <tcp_write+0x520>
  77117. }
  77118. }
  77119. last_unsent->len += oversize_used;
  77120. 801f58a: 6c3b ldr r3, [r7, #64] @ 0x40
  77121. 801f58c: 891a ldrh r2, [r3, #8]
  77122. 801f58e: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  77123. 801f592: 4413 add r3, r2
  77124. 801f594: b29a uxth r2, r3
  77125. 801f596: 6c3b ldr r3, [r7, #64] @ 0x40
  77126. 801f598: 811a strh r2, [r3, #8]
  77127. #if TCP_OVERSIZE_DBGCHECK
  77128. LWIP_ASSERT("last_unsent->oversize_left >= oversize_used",
  77129. 801f59a: 6c3b ldr r3, [r7, #64] @ 0x40
  77130. 801f59c: 895b ldrh r3, [r3, #10]
  77131. 801f59e: f8b7 2046 ldrh.w r2, [r7, #70] @ 0x46
  77132. 801f5a2: 429a cmp r2, r3
  77133. 801f5a4: d906 bls.n 801f5b4 <tcp_write+0x594>
  77134. 801f5a6: 4b78 ldr r3, [pc, #480] @ (801f788 <tcp_write+0x768>)
  77135. 801f5a8: f240 22d3 movw r2, #723 @ 0x2d3
  77136. 801f5ac: 4977 ldr r1, [pc, #476] @ (801f78c <tcp_write+0x76c>)
  77137. 801f5ae: 4878 ldr r0, [pc, #480] @ (801f790 <tcp_write+0x770>)
  77138. 801f5b0: f00a fa0c bl 80299cc <iprintf>
  77139. last_unsent->oversize_left >= oversize_used);
  77140. last_unsent->oversize_left -= oversize_used;
  77141. 801f5b4: 6c3b ldr r3, [r7, #64] @ 0x40
  77142. 801f5b6: 895a ldrh r2, [r3, #10]
  77143. 801f5b8: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  77144. 801f5bc: 1ad3 subs r3, r2, r3
  77145. 801f5be: b29a uxth r2, r3
  77146. 801f5c0: 6c3b ldr r3, [r7, #64] @ 0x40
  77147. 801f5c2: 815a strh r2, [r3, #10]
  77148. #endif /* TCP_OVERSIZE_DBGCHECK */
  77149. }
  77150. pcb->unsent_oversize = oversize;
  77151. 801f5c4: 8afa ldrh r2, [r7, #22]
  77152. 801f5c6: 68fb ldr r3, [r7, #12]
  77153. 801f5c8: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  77154. /*
  77155. * Phase 2: concat_p can be concatenated onto last_unsent->p, unless we
  77156. * determined that the last ROM pbuf can be extended to include the new data.
  77157. */
  77158. if (concat_p != NULL) {
  77159. 801f5cc: 6bfb ldr r3, [r7, #60] @ 0x3c
  77160. 801f5ce: 2b00 cmp r3, #0
  77161. 801f5d0: d018 beq.n 801f604 <tcp_write+0x5e4>
  77162. LWIP_ASSERT("tcp_write: cannot concatenate when pcb->unsent is empty",
  77163. 801f5d2: 6c3b ldr r3, [r7, #64] @ 0x40
  77164. 801f5d4: 2b00 cmp r3, #0
  77165. 801f5d6: d106 bne.n 801f5e6 <tcp_write+0x5c6>
  77166. 801f5d8: 4b6b ldr r3, [pc, #428] @ (801f788 <tcp_write+0x768>)
  77167. 801f5da: f44f 7238 mov.w r2, #736 @ 0x2e0
  77168. 801f5de: 496d ldr r1, [pc, #436] @ (801f794 <tcp_write+0x774>)
  77169. 801f5e0: 486b ldr r0, [pc, #428] @ (801f790 <tcp_write+0x770>)
  77170. 801f5e2: f00a f9f3 bl 80299cc <iprintf>
  77171. (last_unsent != NULL));
  77172. pbuf_cat(last_unsent->p, concat_p);
  77173. 801f5e6: 6c3b ldr r3, [r7, #64] @ 0x40
  77174. 801f5e8: 685b ldr r3, [r3, #4]
  77175. 801f5ea: 6bf9 ldr r1, [r7, #60] @ 0x3c
  77176. 801f5ec: 4618 mov r0, r3
  77177. 801f5ee: f7fb f843 bl 801a678 <pbuf_cat>
  77178. last_unsent->len += concat_p->tot_len;
  77179. 801f5f2: 6c3b ldr r3, [r7, #64] @ 0x40
  77180. 801f5f4: 891a ldrh r2, [r3, #8]
  77181. 801f5f6: 6bfb ldr r3, [r7, #60] @ 0x3c
  77182. 801f5f8: 891b ldrh r3, [r3, #8]
  77183. 801f5fa: 4413 add r3, r2
  77184. 801f5fc: b29a uxth r2, r3
  77185. 801f5fe: 6c3b ldr r3, [r7, #64] @ 0x40
  77186. 801f600: 811a strh r2, [r3, #8]
  77187. 801f602: e03c b.n 801f67e <tcp_write+0x65e>
  77188. } else if (extendlen > 0) {
  77189. 801f604: f8b7 305e ldrh.w r3, [r7, #94] @ 0x5e
  77190. 801f608: 2b00 cmp r3, #0
  77191. 801f60a: d038 beq.n 801f67e <tcp_write+0x65e>
  77192. struct pbuf *p;
  77193. LWIP_ASSERT("tcp_write: extension of reference requires reference",
  77194. 801f60c: 6c3b ldr r3, [r7, #64] @ 0x40
  77195. 801f60e: 2b00 cmp r3, #0
  77196. 801f610: d003 beq.n 801f61a <tcp_write+0x5fa>
  77197. 801f612: 6c3b ldr r3, [r7, #64] @ 0x40
  77198. 801f614: 685b ldr r3, [r3, #4]
  77199. 801f616: 2b00 cmp r3, #0
  77200. 801f618: d106 bne.n 801f628 <tcp_write+0x608>
  77201. 801f61a: 4b5b ldr r3, [pc, #364] @ (801f788 <tcp_write+0x768>)
  77202. 801f61c: f240 22e6 movw r2, #742 @ 0x2e6
  77203. 801f620: 495d ldr r1, [pc, #372] @ (801f798 <tcp_write+0x778>)
  77204. 801f622: 485b ldr r0, [pc, #364] @ (801f790 <tcp_write+0x770>)
  77205. 801f624: f00a f9d2 bl 80299cc <iprintf>
  77206. last_unsent != NULL && last_unsent->p != NULL);
  77207. for (p = last_unsent->p; p->next != NULL; p = p->next) {
  77208. 801f628: 6c3b ldr r3, [r7, #64] @ 0x40
  77209. 801f62a: 685b ldr r3, [r3, #4]
  77210. 801f62c: 62fb str r3, [r7, #44] @ 0x2c
  77211. 801f62e: e00a b.n 801f646 <tcp_write+0x626>
  77212. p->tot_len += extendlen;
  77213. 801f630: 6afb ldr r3, [r7, #44] @ 0x2c
  77214. 801f632: 891a ldrh r2, [r3, #8]
  77215. 801f634: f8b7 305e ldrh.w r3, [r7, #94] @ 0x5e
  77216. 801f638: 4413 add r3, r2
  77217. 801f63a: b29a uxth r2, r3
  77218. 801f63c: 6afb ldr r3, [r7, #44] @ 0x2c
  77219. 801f63e: 811a strh r2, [r3, #8]
  77220. for (p = last_unsent->p; p->next != NULL; p = p->next) {
  77221. 801f640: 6afb ldr r3, [r7, #44] @ 0x2c
  77222. 801f642: 681b ldr r3, [r3, #0]
  77223. 801f644: 62fb str r3, [r7, #44] @ 0x2c
  77224. 801f646: 6afb ldr r3, [r7, #44] @ 0x2c
  77225. 801f648: 681b ldr r3, [r3, #0]
  77226. 801f64a: 2b00 cmp r3, #0
  77227. 801f64c: d1f0 bne.n 801f630 <tcp_write+0x610>
  77228. }
  77229. p->tot_len += extendlen;
  77230. 801f64e: 6afb ldr r3, [r7, #44] @ 0x2c
  77231. 801f650: 891a ldrh r2, [r3, #8]
  77232. 801f652: f8b7 305e ldrh.w r3, [r7, #94] @ 0x5e
  77233. 801f656: 4413 add r3, r2
  77234. 801f658: b29a uxth r2, r3
  77235. 801f65a: 6afb ldr r3, [r7, #44] @ 0x2c
  77236. 801f65c: 811a strh r2, [r3, #8]
  77237. p->len += extendlen;
  77238. 801f65e: 6afb ldr r3, [r7, #44] @ 0x2c
  77239. 801f660: 895a ldrh r2, [r3, #10]
  77240. 801f662: f8b7 305e ldrh.w r3, [r7, #94] @ 0x5e
  77241. 801f666: 4413 add r3, r2
  77242. 801f668: b29a uxth r2, r3
  77243. 801f66a: 6afb ldr r3, [r7, #44] @ 0x2c
  77244. 801f66c: 815a strh r2, [r3, #10]
  77245. last_unsent->len += extendlen;
  77246. 801f66e: 6c3b ldr r3, [r7, #64] @ 0x40
  77247. 801f670: 891a ldrh r2, [r3, #8]
  77248. 801f672: f8b7 305e ldrh.w r3, [r7, #94] @ 0x5e
  77249. 801f676: 4413 add r3, r2
  77250. 801f678: b29a uxth r2, r3
  77251. 801f67a: 6c3b ldr r3, [r7, #64] @ 0x40
  77252. 801f67c: 811a strh r2, [r3, #8]
  77253. /*
  77254. * Phase 3: Append queue to pcb->unsent. Queue may be NULL, but that
  77255. * is harmless
  77256. */
  77257. if (last_unsent == NULL) {
  77258. 801f67e: 6c3b ldr r3, [r7, #64] @ 0x40
  77259. 801f680: 2b00 cmp r3, #0
  77260. 801f682: d103 bne.n 801f68c <tcp_write+0x66c>
  77261. pcb->unsent = queue;
  77262. 801f684: 68fb ldr r3, [r7, #12]
  77263. 801f686: 6cfa ldr r2, [r7, #76] @ 0x4c
  77264. 801f688: 66da str r2, [r3, #108] @ 0x6c
  77265. 801f68a: e002 b.n 801f692 <tcp_write+0x672>
  77266. } else {
  77267. last_unsent->next = queue;
  77268. 801f68c: 6c3b ldr r3, [r7, #64] @ 0x40
  77269. 801f68e: 6cfa ldr r2, [r7, #76] @ 0x4c
  77270. 801f690: 601a str r2, [r3, #0]
  77271. }
  77272. /*
  77273. * Finally update the pcb state.
  77274. */
  77275. pcb->snd_lbb += len;
  77276. 801f692: 68fb ldr r3, [r7, #12]
  77277. 801f694: 6dda ldr r2, [r3, #92] @ 0x5c
  77278. 801f696: 88fb ldrh r3, [r7, #6]
  77279. 801f698: 441a add r2, r3
  77280. 801f69a: 68fb ldr r3, [r7, #12]
  77281. 801f69c: 65da str r2, [r3, #92] @ 0x5c
  77282. pcb->snd_buf -= len;
  77283. 801f69e: 68fb ldr r3, [r7, #12]
  77284. 801f6a0: f8b3 2064 ldrh.w r2, [r3, #100] @ 0x64
  77285. 801f6a4: 88fb ldrh r3, [r7, #6]
  77286. 801f6a6: 1ad3 subs r3, r2, r3
  77287. 801f6a8: b29a uxth r2, r3
  77288. 801f6aa: 68fb ldr r3, [r7, #12]
  77289. 801f6ac: f8a3 2064 strh.w r2, [r3, #100] @ 0x64
  77290. pcb->snd_queuelen = queuelen;
  77291. 801f6b0: 68fb ldr r3, [r7, #12]
  77292. 801f6b2: f8b7 2048 ldrh.w r2, [r7, #72] @ 0x48
  77293. 801f6b6: f8a3 2066 strh.w r2, [r3, #102] @ 0x66
  77294. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: %"S16_F" (after enqueued)\n",
  77295. pcb->snd_queuelen));
  77296. if (pcb->snd_queuelen != 0) {
  77297. 801f6ba: 68fb ldr r3, [r7, #12]
  77298. 801f6bc: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  77299. 801f6c0: 2b00 cmp r3, #0
  77300. 801f6c2: d00e beq.n 801f6e2 <tcp_write+0x6c2>
  77301. LWIP_ASSERT("tcp_write: valid queue length",
  77302. 801f6c4: 68fb ldr r3, [r7, #12]
  77303. 801f6c6: 6f1b ldr r3, [r3, #112] @ 0x70
  77304. 801f6c8: 2b00 cmp r3, #0
  77305. 801f6ca: d10a bne.n 801f6e2 <tcp_write+0x6c2>
  77306. 801f6cc: 68fb ldr r3, [r7, #12]
  77307. 801f6ce: 6edb ldr r3, [r3, #108] @ 0x6c
  77308. 801f6d0: 2b00 cmp r3, #0
  77309. 801f6d2: d106 bne.n 801f6e2 <tcp_write+0x6c2>
  77310. 801f6d4: 4b2c ldr r3, [pc, #176] @ (801f788 <tcp_write+0x768>)
  77311. 801f6d6: f240 3212 movw r2, #786 @ 0x312
  77312. 801f6da: 4930 ldr r1, [pc, #192] @ (801f79c <tcp_write+0x77c>)
  77313. 801f6dc: 482c ldr r0, [pc, #176] @ (801f790 <tcp_write+0x770>)
  77314. 801f6de: f00a f975 bl 80299cc <iprintf>
  77315. pcb->unacked != NULL || pcb->unsent != NULL);
  77316. }
  77317. /* Set the PSH flag in the last segment that we enqueued. */
  77318. if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE) == 0)) {
  77319. 801f6e2: 6d7b ldr r3, [r7, #84] @ 0x54
  77320. 801f6e4: 2b00 cmp r3, #0
  77321. 801f6e6: d016 beq.n 801f716 <tcp_write+0x6f6>
  77322. 801f6e8: 6d7b ldr r3, [r7, #84] @ 0x54
  77323. 801f6ea: 691b ldr r3, [r3, #16]
  77324. 801f6ec: 2b00 cmp r3, #0
  77325. 801f6ee: d012 beq.n 801f716 <tcp_write+0x6f6>
  77326. 801f6f0: 797b ldrb r3, [r7, #5]
  77327. 801f6f2: f003 0302 and.w r3, r3, #2
  77328. 801f6f6: 2b00 cmp r3, #0
  77329. 801f6f8: d10d bne.n 801f716 <tcp_write+0x6f6>
  77330. TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
  77331. 801f6fa: 6d7b ldr r3, [r7, #84] @ 0x54
  77332. 801f6fc: 691b ldr r3, [r3, #16]
  77333. 801f6fe: 899b ldrh r3, [r3, #12]
  77334. 801f700: b29c uxth r4, r3
  77335. 801f702: 2008 movs r0, #8
  77336. 801f704: f7f9 fa08 bl 8018b18 <lwip_htons>
  77337. 801f708: 4603 mov r3, r0
  77338. 801f70a: 461a mov r2, r3
  77339. 801f70c: 6d7b ldr r3, [r7, #84] @ 0x54
  77340. 801f70e: 691b ldr r3, [r3, #16]
  77341. 801f710: 4322 orrs r2, r4
  77342. 801f712: b292 uxth r2, r2
  77343. 801f714: 819a strh r2, [r3, #12]
  77344. }
  77345. return ERR_OK;
  77346. 801f716: 2300 movs r3, #0
  77347. 801f718: e031 b.n 801f77e <tcp_write+0x75e>
  77348. goto memerr;
  77349. 801f71a: bf00 nop
  77350. 801f71c: e006 b.n 801f72c <tcp_write+0x70c>
  77351. goto memerr;
  77352. 801f71e: bf00 nop
  77353. 801f720: e004 b.n 801f72c <tcp_write+0x70c>
  77354. goto memerr;
  77355. 801f722: bf00 nop
  77356. 801f724: e002 b.n 801f72c <tcp_write+0x70c>
  77357. goto memerr;
  77358. 801f726: bf00 nop
  77359. 801f728: e000 b.n 801f72c <tcp_write+0x70c>
  77360. goto memerr;
  77361. 801f72a: bf00 nop
  77362. memerr:
  77363. tcp_set_flags(pcb, TF_NAGLEMEMERR);
  77364. 801f72c: 68fb ldr r3, [r7, #12]
  77365. 801f72e: 8b5b ldrh r3, [r3, #26]
  77366. 801f730: f043 0380 orr.w r3, r3, #128 @ 0x80
  77367. 801f734: b29a uxth r2, r3
  77368. 801f736: 68fb ldr r3, [r7, #12]
  77369. 801f738: 835a strh r2, [r3, #26]
  77370. TCP_STATS_INC(tcp.memerr);
  77371. if (concat_p != NULL) {
  77372. 801f73a: 6bfb ldr r3, [r7, #60] @ 0x3c
  77373. 801f73c: 2b00 cmp r3, #0
  77374. 801f73e: d002 beq.n 801f746 <tcp_write+0x726>
  77375. pbuf_free(concat_p);
  77376. 801f740: 6bf8 ldr r0, [r7, #60] @ 0x3c
  77377. 801f742: f7fa fecb bl 801a4dc <pbuf_free>
  77378. }
  77379. if (queue != NULL) {
  77380. 801f746: 6cfb ldr r3, [r7, #76] @ 0x4c
  77381. 801f748: 2b00 cmp r3, #0
  77382. 801f74a: d002 beq.n 801f752 <tcp_write+0x732>
  77383. tcp_segs_free(queue);
  77384. 801f74c: 6cf8 ldr r0, [r7, #76] @ 0x4c
  77385. 801f74e: f7fc fb09 bl 801bd64 <tcp_segs_free>
  77386. }
  77387. if (pcb->snd_queuelen != 0) {
  77388. 801f752: 68fb ldr r3, [r7, #12]
  77389. 801f754: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  77390. 801f758: 2b00 cmp r3, #0
  77391. 801f75a: d00e beq.n 801f77a <tcp_write+0x75a>
  77392. LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != NULL ||
  77393. 801f75c: 68fb ldr r3, [r7, #12]
  77394. 801f75e: 6f1b ldr r3, [r3, #112] @ 0x70
  77395. 801f760: 2b00 cmp r3, #0
  77396. 801f762: d10a bne.n 801f77a <tcp_write+0x75a>
  77397. 801f764: 68fb ldr r3, [r7, #12]
  77398. 801f766: 6edb ldr r3, [r3, #108] @ 0x6c
  77399. 801f768: 2b00 cmp r3, #0
  77400. 801f76a: d106 bne.n 801f77a <tcp_write+0x75a>
  77401. 801f76c: 4b06 ldr r3, [pc, #24] @ (801f788 <tcp_write+0x768>)
  77402. 801f76e: f240 3227 movw r2, #807 @ 0x327
  77403. 801f772: 490a ldr r1, [pc, #40] @ (801f79c <tcp_write+0x77c>)
  77404. 801f774: 4806 ldr r0, [pc, #24] @ (801f790 <tcp_write+0x770>)
  77405. 801f776: f00a f929 bl 80299cc <iprintf>
  77406. pcb->unsent != NULL);
  77407. }
  77408. LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_write: %"S16_F" (with mem err)\n", pcb->snd_queuelen));
  77409. return ERR_MEM;
  77410. 801f77a: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  77411. }
  77412. 801f77e: 4618 mov r0, r3
  77413. 801f780: 3764 adds r7, #100 @ 0x64
  77414. 801f782: 46bd mov sp, r7
  77415. 801f784: bd90 pop {r4, r7, pc}
  77416. 801f786: bf00 nop
  77417. 801f788: 0802f190 .word 0x0802f190
  77418. 801f78c: 0802f4c4 .word 0x0802f4c4
  77419. 801f790: 0802f1e4 .word 0x0802f1e4
  77420. 801f794: 0802f4f0 .word 0x0802f4f0
  77421. 801f798: 0802f528 .word 0x0802f528
  77422. 801f79c: 0802f560 .word 0x0802f560
  77423. 0801f7a0 <tcp_split_unsent_seg>:
  77424. * @param pcb the tcp_pcb for which to split the unsent head
  77425. * @param split the amount of payload to remain in the head
  77426. */
  77427. err_t
  77428. tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split)
  77429. {
  77430. 801f7a0: b590 push {r4, r7, lr}
  77431. 801f7a2: b08b sub sp, #44 @ 0x2c
  77432. 801f7a4: af02 add r7, sp, #8
  77433. 801f7a6: 6078 str r0, [r7, #4]
  77434. 801f7a8: 460b mov r3, r1
  77435. 801f7aa: 807b strh r3, [r7, #2]
  77436. struct tcp_seg *seg = NULL, *useg = NULL;
  77437. 801f7ac: 2300 movs r3, #0
  77438. 801f7ae: 61bb str r3, [r7, #24]
  77439. 801f7b0: 2300 movs r3, #0
  77440. 801f7b2: 617b str r3, [r7, #20]
  77441. struct pbuf *p = NULL;
  77442. 801f7b4: 2300 movs r3, #0
  77443. 801f7b6: 613b str r3, [r7, #16]
  77444. u16_t chksum = 0;
  77445. u8_t chksum_swapped = 0;
  77446. struct pbuf *q;
  77447. #endif /* TCP_CHECKSUM_ON_COPY */
  77448. LWIP_ASSERT("tcp_split_unsent_seg: invalid pcb", pcb != NULL);
  77449. 801f7b8: 687b ldr r3, [r7, #4]
  77450. 801f7ba: 2b00 cmp r3, #0
  77451. 801f7bc: d106 bne.n 801f7cc <tcp_split_unsent_seg+0x2c>
  77452. 801f7be: 4b97 ldr r3, [pc, #604] @ (801fa1c <tcp_split_unsent_seg+0x27c>)
  77453. 801f7c0: f240 324b movw r2, #843 @ 0x34b
  77454. 801f7c4: 4996 ldr r1, [pc, #600] @ (801fa20 <tcp_split_unsent_seg+0x280>)
  77455. 801f7c6: 4897 ldr r0, [pc, #604] @ (801fa24 <tcp_split_unsent_seg+0x284>)
  77456. 801f7c8: f00a f900 bl 80299cc <iprintf>
  77457. useg = pcb->unsent;
  77458. 801f7cc: 687b ldr r3, [r7, #4]
  77459. 801f7ce: 6edb ldr r3, [r3, #108] @ 0x6c
  77460. 801f7d0: 617b str r3, [r7, #20]
  77461. if (useg == NULL) {
  77462. 801f7d2: 697b ldr r3, [r7, #20]
  77463. 801f7d4: 2b00 cmp r3, #0
  77464. 801f7d6: d102 bne.n 801f7de <tcp_split_unsent_seg+0x3e>
  77465. return ERR_MEM;
  77466. 801f7d8: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  77467. 801f7dc: e119 b.n 801fa12 <tcp_split_unsent_seg+0x272>
  77468. }
  77469. if (split == 0) {
  77470. 801f7de: 887b ldrh r3, [r7, #2]
  77471. 801f7e0: 2b00 cmp r3, #0
  77472. 801f7e2: d109 bne.n 801f7f8 <tcp_split_unsent_seg+0x58>
  77473. LWIP_ASSERT("Can't split segment into length 0", 0);
  77474. 801f7e4: 4b8d ldr r3, [pc, #564] @ (801fa1c <tcp_split_unsent_seg+0x27c>)
  77475. 801f7e6: f240 3253 movw r2, #851 @ 0x353
  77476. 801f7ea: 498f ldr r1, [pc, #572] @ (801fa28 <tcp_split_unsent_seg+0x288>)
  77477. 801f7ec: 488d ldr r0, [pc, #564] @ (801fa24 <tcp_split_unsent_seg+0x284>)
  77478. 801f7ee: f00a f8ed bl 80299cc <iprintf>
  77479. return ERR_VAL;
  77480. 801f7f2: f06f 0305 mvn.w r3, #5
  77481. 801f7f6: e10c b.n 801fa12 <tcp_split_unsent_seg+0x272>
  77482. }
  77483. if (useg->len <= split) {
  77484. 801f7f8: 697b ldr r3, [r7, #20]
  77485. 801f7fa: 891b ldrh r3, [r3, #8]
  77486. 801f7fc: 887a ldrh r2, [r7, #2]
  77487. 801f7fe: 429a cmp r2, r3
  77488. 801f800: d301 bcc.n 801f806 <tcp_split_unsent_seg+0x66>
  77489. return ERR_OK;
  77490. 801f802: 2300 movs r3, #0
  77491. 801f804: e105 b.n 801fa12 <tcp_split_unsent_seg+0x272>
  77492. }
  77493. LWIP_ASSERT("split <= mss", split <= pcb->mss);
  77494. 801f806: 687b ldr r3, [r7, #4]
  77495. 801f808: 8e5b ldrh r3, [r3, #50] @ 0x32
  77496. 801f80a: 887a ldrh r2, [r7, #2]
  77497. 801f80c: 429a cmp r2, r3
  77498. 801f80e: d906 bls.n 801f81e <tcp_split_unsent_seg+0x7e>
  77499. 801f810: 4b82 ldr r3, [pc, #520] @ (801fa1c <tcp_split_unsent_seg+0x27c>)
  77500. 801f812: f240 325b movw r2, #859 @ 0x35b
  77501. 801f816: 4985 ldr r1, [pc, #532] @ (801fa2c <tcp_split_unsent_seg+0x28c>)
  77502. 801f818: 4882 ldr r0, [pc, #520] @ (801fa24 <tcp_split_unsent_seg+0x284>)
  77503. 801f81a: f00a f8d7 bl 80299cc <iprintf>
  77504. LWIP_ASSERT("useg->len > 0", useg->len > 0);
  77505. 801f81e: 697b ldr r3, [r7, #20]
  77506. 801f820: 891b ldrh r3, [r3, #8]
  77507. 801f822: 2b00 cmp r3, #0
  77508. 801f824: d106 bne.n 801f834 <tcp_split_unsent_seg+0x94>
  77509. 801f826: 4b7d ldr r3, [pc, #500] @ (801fa1c <tcp_split_unsent_seg+0x27c>)
  77510. 801f828: f44f 7257 mov.w r2, #860 @ 0x35c
  77511. 801f82c: 4980 ldr r1, [pc, #512] @ (801fa30 <tcp_split_unsent_seg+0x290>)
  77512. 801f82e: 487d ldr r0, [pc, #500] @ (801fa24 <tcp_split_unsent_seg+0x284>)
  77513. 801f830: f00a f8cc bl 80299cc <iprintf>
  77514. * to split this packet so we may actually exceed the max value by
  77515. * one!
  77516. */
  77517. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: split_unsent_seg: %u\n", (unsigned int)pcb->snd_queuelen));
  77518. optflags = useg->flags;
  77519. 801f834: 697b ldr r3, [r7, #20]
  77520. 801f836: 7b1b ldrb r3, [r3, #12]
  77521. 801f838: 73fb strb r3, [r7, #15]
  77522. #if TCP_CHECKSUM_ON_COPY
  77523. /* Remove since checksum is not stored until after tcp_create_segment() */
  77524. optflags &= ~TF_SEG_DATA_CHECKSUMMED;
  77525. #endif /* TCP_CHECKSUM_ON_COPY */
  77526. optlen = LWIP_TCP_OPT_LENGTH(optflags);
  77527. 801f83a: 7bfb ldrb r3, [r7, #15]
  77528. 801f83c: 009b lsls r3, r3, #2
  77529. 801f83e: b2db uxtb r3, r3
  77530. 801f840: f003 0304 and.w r3, r3, #4
  77531. 801f844: 73bb strb r3, [r7, #14]
  77532. remainder = useg->len - split;
  77533. 801f846: 697b ldr r3, [r7, #20]
  77534. 801f848: 891a ldrh r2, [r3, #8]
  77535. 801f84a: 887b ldrh r3, [r7, #2]
  77536. 801f84c: 1ad3 subs r3, r2, r3
  77537. 801f84e: 81bb strh r3, [r7, #12]
  77538. /* Create new pbuf for the remainder of the split */
  77539. p = pbuf_alloc(PBUF_TRANSPORT, remainder + optlen, PBUF_RAM);
  77540. 801f850: 7bbb ldrb r3, [r7, #14]
  77541. 801f852: b29a uxth r2, r3
  77542. 801f854: 89bb ldrh r3, [r7, #12]
  77543. 801f856: 4413 add r3, r2
  77544. 801f858: b29b uxth r3, r3
  77545. 801f85a: f44f 7220 mov.w r2, #640 @ 0x280
  77546. 801f85e: 4619 mov r1, r3
  77547. 801f860: 2036 movs r0, #54 @ 0x36
  77548. 801f862: f7fa fb25 bl 8019eb0 <pbuf_alloc>
  77549. 801f866: 6138 str r0, [r7, #16]
  77550. if (p == NULL) {
  77551. 801f868: 693b ldr r3, [r7, #16]
  77552. 801f86a: 2b00 cmp r3, #0
  77553. 801f86c: f000 80ba beq.w 801f9e4 <tcp_split_unsent_seg+0x244>
  77554. ("tcp_split_unsent_seg: could not allocate memory for pbuf remainder %u\n", remainder));
  77555. goto memerr;
  77556. }
  77557. /* Offset into the original pbuf is past TCP/IP headers, options, and split amount */
  77558. offset = useg->p->tot_len - useg->len + split;
  77559. 801f870: 697b ldr r3, [r7, #20]
  77560. 801f872: 685b ldr r3, [r3, #4]
  77561. 801f874: 891a ldrh r2, [r3, #8]
  77562. 801f876: 697b ldr r3, [r7, #20]
  77563. 801f878: 891b ldrh r3, [r3, #8]
  77564. 801f87a: 1ad3 subs r3, r2, r3
  77565. 801f87c: b29a uxth r2, r3
  77566. 801f87e: 887b ldrh r3, [r7, #2]
  77567. 801f880: 4413 add r3, r2
  77568. 801f882: 817b strh r3, [r7, #10]
  77569. /* Copy remainder into new pbuf, headers and options will not be filled out */
  77570. if (pbuf_copy_partial(useg->p, (u8_t *)p->payload + optlen, remainder, offset ) != remainder) {
  77571. 801f884: 697b ldr r3, [r7, #20]
  77572. 801f886: 6858 ldr r0, [r3, #4]
  77573. 801f888: 693b ldr r3, [r7, #16]
  77574. 801f88a: 685a ldr r2, [r3, #4]
  77575. 801f88c: 7bbb ldrb r3, [r7, #14]
  77576. 801f88e: 18d1 adds r1, r2, r3
  77577. 801f890: 897b ldrh r3, [r7, #10]
  77578. 801f892: 89ba ldrh r2, [r7, #12]
  77579. 801f894: f7fb f828 bl 801a8e8 <pbuf_copy_partial>
  77580. 801f898: 4603 mov r3, r0
  77581. 801f89a: 461a mov r2, r3
  77582. 801f89c: 89bb ldrh r3, [r7, #12]
  77583. 801f89e: 4293 cmp r3, r2
  77584. 801f8a0: f040 80a2 bne.w 801f9e8 <tcp_split_unsent_seg+0x248>
  77585. #endif /* TCP_CHECKSUM_ON_COPY */
  77586. /* Options are created when calling tcp_output() */
  77587. /* Migrate flags from original segment */
  77588. split_flags = TCPH_FLAGS(useg->tcphdr);
  77589. 801f8a4: 697b ldr r3, [r7, #20]
  77590. 801f8a6: 691b ldr r3, [r3, #16]
  77591. 801f8a8: 899b ldrh r3, [r3, #12]
  77592. 801f8aa: b29b uxth r3, r3
  77593. 801f8ac: 4618 mov r0, r3
  77594. 801f8ae: f7f9 f933 bl 8018b18 <lwip_htons>
  77595. 801f8b2: 4603 mov r3, r0
  77596. 801f8b4: b2db uxtb r3, r3
  77597. 801f8b6: f003 033f and.w r3, r3, #63 @ 0x3f
  77598. 801f8ba: 77fb strb r3, [r7, #31]
  77599. remainder_flags = 0; /* ACK added in tcp_output() */
  77600. 801f8bc: 2300 movs r3, #0
  77601. 801f8be: 77bb strb r3, [r7, #30]
  77602. if (split_flags & TCP_PSH) {
  77603. 801f8c0: 7ffb ldrb r3, [r7, #31]
  77604. 801f8c2: f003 0308 and.w r3, r3, #8
  77605. 801f8c6: 2b00 cmp r3, #0
  77606. 801f8c8: d007 beq.n 801f8da <tcp_split_unsent_seg+0x13a>
  77607. split_flags &= ~TCP_PSH;
  77608. 801f8ca: 7ffb ldrb r3, [r7, #31]
  77609. 801f8cc: f023 0308 bic.w r3, r3, #8
  77610. 801f8d0: 77fb strb r3, [r7, #31]
  77611. remainder_flags |= TCP_PSH;
  77612. 801f8d2: 7fbb ldrb r3, [r7, #30]
  77613. 801f8d4: f043 0308 orr.w r3, r3, #8
  77614. 801f8d8: 77bb strb r3, [r7, #30]
  77615. }
  77616. if (split_flags & TCP_FIN) {
  77617. 801f8da: 7ffb ldrb r3, [r7, #31]
  77618. 801f8dc: f003 0301 and.w r3, r3, #1
  77619. 801f8e0: 2b00 cmp r3, #0
  77620. 801f8e2: d007 beq.n 801f8f4 <tcp_split_unsent_seg+0x154>
  77621. split_flags &= ~TCP_FIN;
  77622. 801f8e4: 7ffb ldrb r3, [r7, #31]
  77623. 801f8e6: f023 0301 bic.w r3, r3, #1
  77624. 801f8ea: 77fb strb r3, [r7, #31]
  77625. remainder_flags |= TCP_FIN;
  77626. 801f8ec: 7fbb ldrb r3, [r7, #30]
  77627. 801f8ee: f043 0301 orr.w r3, r3, #1
  77628. 801f8f2: 77bb strb r3, [r7, #30]
  77629. }
  77630. /* SYN should be left on split, RST should not be present with data */
  77631. seg = tcp_create_segment(pcb, p, remainder_flags, lwip_ntohl(useg->tcphdr->seqno) + split, optflags);
  77632. 801f8f4: 697b ldr r3, [r7, #20]
  77633. 801f8f6: 691b ldr r3, [r3, #16]
  77634. 801f8f8: 685b ldr r3, [r3, #4]
  77635. 801f8fa: 4618 mov r0, r3
  77636. 801f8fc: f7f9 f921 bl 8018b42 <lwip_htonl>
  77637. 801f900: 4602 mov r2, r0
  77638. 801f902: 887b ldrh r3, [r7, #2]
  77639. 801f904: 18d1 adds r1, r2, r3
  77640. 801f906: 7fba ldrb r2, [r7, #30]
  77641. 801f908: 7bfb ldrb r3, [r7, #15]
  77642. 801f90a: 9300 str r3, [sp, #0]
  77643. 801f90c: 460b mov r3, r1
  77644. 801f90e: 6939 ldr r1, [r7, #16]
  77645. 801f910: 6878 ldr r0, [r7, #4]
  77646. 801f912: f7ff f9f1 bl 801ecf8 <tcp_create_segment>
  77647. 801f916: 61b8 str r0, [r7, #24]
  77648. if (seg == NULL) {
  77649. 801f918: 69bb ldr r3, [r7, #24]
  77650. 801f91a: 2b00 cmp r3, #0
  77651. 801f91c: d066 beq.n 801f9ec <tcp_split_unsent_seg+0x24c>
  77652. seg->chksum_swapped = chksum_swapped;
  77653. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  77654. #endif /* TCP_CHECKSUM_ON_COPY */
  77655. /* Remove this segment from the queue since trimming it may free pbufs */
  77656. pcb->snd_queuelen -= pbuf_clen(useg->p);
  77657. 801f91e: 697b ldr r3, [r7, #20]
  77658. 801f920: 685b ldr r3, [r3, #4]
  77659. 801f922: 4618 mov r0, r3
  77660. 801f924: f7fa fe68 bl 801a5f8 <pbuf_clen>
  77661. 801f928: 4603 mov r3, r0
  77662. 801f92a: 461a mov r2, r3
  77663. 801f92c: 687b ldr r3, [r7, #4]
  77664. 801f92e: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  77665. 801f932: 1a9b subs r3, r3, r2
  77666. 801f934: b29a uxth r2, r3
  77667. 801f936: 687b ldr r3, [r7, #4]
  77668. 801f938: f8a3 2066 strh.w r2, [r3, #102] @ 0x66
  77669. /* Trim the original pbuf into our split size. At this point our remainder segment must be setup
  77670. successfully because we are modifying the original segment */
  77671. pbuf_realloc(useg->p, useg->p->tot_len - remainder);
  77672. 801f93c: 697b ldr r3, [r7, #20]
  77673. 801f93e: 6858 ldr r0, [r3, #4]
  77674. 801f940: 697b ldr r3, [r7, #20]
  77675. 801f942: 685b ldr r3, [r3, #4]
  77676. 801f944: 891a ldrh r2, [r3, #8]
  77677. 801f946: 89bb ldrh r3, [r7, #12]
  77678. 801f948: 1ad3 subs r3, r2, r3
  77679. 801f94a: b29b uxth r3, r3
  77680. 801f94c: 4619 mov r1, r3
  77681. 801f94e: f7fa fc0f bl 801a170 <pbuf_realloc>
  77682. useg->len -= remainder;
  77683. 801f952: 697b ldr r3, [r7, #20]
  77684. 801f954: 891a ldrh r2, [r3, #8]
  77685. 801f956: 89bb ldrh r3, [r7, #12]
  77686. 801f958: 1ad3 subs r3, r2, r3
  77687. 801f95a: b29a uxth r2, r3
  77688. 801f95c: 697b ldr r3, [r7, #20]
  77689. 801f95e: 811a strh r2, [r3, #8]
  77690. TCPH_SET_FLAG(useg->tcphdr, split_flags);
  77691. 801f960: 697b ldr r3, [r7, #20]
  77692. 801f962: 691b ldr r3, [r3, #16]
  77693. 801f964: 899b ldrh r3, [r3, #12]
  77694. 801f966: b29c uxth r4, r3
  77695. 801f968: 7ffb ldrb r3, [r7, #31]
  77696. 801f96a: b29b uxth r3, r3
  77697. 801f96c: 4618 mov r0, r3
  77698. 801f96e: f7f9 f8d3 bl 8018b18 <lwip_htons>
  77699. 801f972: 4603 mov r3, r0
  77700. 801f974: 461a mov r2, r3
  77701. 801f976: 697b ldr r3, [r7, #20]
  77702. 801f978: 691b ldr r3, [r3, #16]
  77703. 801f97a: 4322 orrs r2, r4
  77704. 801f97c: b292 uxth r2, r2
  77705. 801f97e: 819a strh r2, [r3, #12]
  77706. #if TCP_OVERSIZE_DBGCHECK
  77707. /* By trimming, realloc may have actually shrunk the pbuf, so clear oversize_left */
  77708. useg->oversize_left = 0;
  77709. 801f980: 697b ldr r3, [r7, #20]
  77710. 801f982: 2200 movs r2, #0
  77711. 801f984: 815a strh r2, [r3, #10]
  77712. #endif /* TCP_OVERSIZE_DBGCHECK */
  77713. /* Add back to the queue with new trimmed pbuf */
  77714. pcb->snd_queuelen += pbuf_clen(useg->p);
  77715. 801f986: 697b ldr r3, [r7, #20]
  77716. 801f988: 685b ldr r3, [r3, #4]
  77717. 801f98a: 4618 mov r0, r3
  77718. 801f98c: f7fa fe34 bl 801a5f8 <pbuf_clen>
  77719. 801f990: 4603 mov r3, r0
  77720. 801f992: 461a mov r2, r3
  77721. 801f994: 687b ldr r3, [r7, #4]
  77722. 801f996: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  77723. 801f99a: 4413 add r3, r2
  77724. 801f99c: b29a uxth r2, r3
  77725. 801f99e: 687b ldr r3, [r7, #4]
  77726. 801f9a0: f8a3 2066 strh.w r2, [r3, #102] @ 0x66
  77727. #endif /* TCP_CHECKSUM_ON_COPY */
  77728. /* Update number of segments on the queues. Note that length now may
  77729. * exceed TCP_SND_QUEUELEN! We don't have to touch pcb->snd_buf
  77730. * because the total amount of data is constant when packet is split */
  77731. pcb->snd_queuelen += pbuf_clen(seg->p);
  77732. 801f9a4: 69bb ldr r3, [r7, #24]
  77733. 801f9a6: 685b ldr r3, [r3, #4]
  77734. 801f9a8: 4618 mov r0, r3
  77735. 801f9aa: f7fa fe25 bl 801a5f8 <pbuf_clen>
  77736. 801f9ae: 4603 mov r3, r0
  77737. 801f9b0: 461a mov r2, r3
  77738. 801f9b2: 687b ldr r3, [r7, #4]
  77739. 801f9b4: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  77740. 801f9b8: 4413 add r3, r2
  77741. 801f9ba: b29a uxth r2, r3
  77742. 801f9bc: 687b ldr r3, [r7, #4]
  77743. 801f9be: f8a3 2066 strh.w r2, [r3, #102] @ 0x66
  77744. /* Finally insert remainder into queue after split (which stays head) */
  77745. seg->next = useg->next;
  77746. 801f9c2: 697b ldr r3, [r7, #20]
  77747. 801f9c4: 681a ldr r2, [r3, #0]
  77748. 801f9c6: 69bb ldr r3, [r7, #24]
  77749. 801f9c8: 601a str r2, [r3, #0]
  77750. useg->next = seg;
  77751. 801f9ca: 697b ldr r3, [r7, #20]
  77752. 801f9cc: 69ba ldr r2, [r7, #24]
  77753. 801f9ce: 601a str r2, [r3, #0]
  77754. #if TCP_OVERSIZE
  77755. /* If remainder is last segment on the unsent, ensure we clear the oversize amount
  77756. * because the remainder is always sized to the exact remaining amount */
  77757. if (seg->next == NULL) {
  77758. 801f9d0: 69bb ldr r3, [r7, #24]
  77759. 801f9d2: 681b ldr r3, [r3, #0]
  77760. 801f9d4: 2b00 cmp r3, #0
  77761. 801f9d6: d103 bne.n 801f9e0 <tcp_split_unsent_seg+0x240>
  77762. pcb->unsent_oversize = 0;
  77763. 801f9d8: 687b ldr r3, [r7, #4]
  77764. 801f9da: 2200 movs r2, #0
  77765. 801f9dc: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  77766. }
  77767. #endif /* TCP_OVERSIZE */
  77768. return ERR_OK;
  77769. 801f9e0: 2300 movs r3, #0
  77770. 801f9e2: e016 b.n 801fa12 <tcp_split_unsent_seg+0x272>
  77771. goto memerr;
  77772. 801f9e4: bf00 nop
  77773. 801f9e6: e002 b.n 801f9ee <tcp_split_unsent_seg+0x24e>
  77774. goto memerr;
  77775. 801f9e8: bf00 nop
  77776. 801f9ea: e000 b.n 801f9ee <tcp_split_unsent_seg+0x24e>
  77777. goto memerr;
  77778. 801f9ec: bf00 nop
  77779. memerr:
  77780. TCP_STATS_INC(tcp.memerr);
  77781. LWIP_ASSERT("seg == NULL", seg == NULL);
  77782. 801f9ee: 69bb ldr r3, [r7, #24]
  77783. 801f9f0: 2b00 cmp r3, #0
  77784. 801f9f2: d006 beq.n 801fa02 <tcp_split_unsent_seg+0x262>
  77785. 801f9f4: 4b09 ldr r3, [pc, #36] @ (801fa1c <tcp_split_unsent_seg+0x27c>)
  77786. 801f9f6: f44f 7276 mov.w r2, #984 @ 0x3d8
  77787. 801f9fa: 490e ldr r1, [pc, #56] @ (801fa34 <tcp_split_unsent_seg+0x294>)
  77788. 801f9fc: 4809 ldr r0, [pc, #36] @ (801fa24 <tcp_split_unsent_seg+0x284>)
  77789. 801f9fe: f009 ffe5 bl 80299cc <iprintf>
  77790. if (p != NULL) {
  77791. 801fa02: 693b ldr r3, [r7, #16]
  77792. 801fa04: 2b00 cmp r3, #0
  77793. 801fa06: d002 beq.n 801fa0e <tcp_split_unsent_seg+0x26e>
  77794. pbuf_free(p);
  77795. 801fa08: 6938 ldr r0, [r7, #16]
  77796. 801fa0a: f7fa fd67 bl 801a4dc <pbuf_free>
  77797. }
  77798. return ERR_MEM;
  77799. 801fa0e: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  77800. }
  77801. 801fa12: 4618 mov r0, r3
  77802. 801fa14: 3724 adds r7, #36 @ 0x24
  77803. 801fa16: 46bd mov sp, r7
  77804. 801fa18: bd90 pop {r4, r7, pc}
  77805. 801fa1a: bf00 nop
  77806. 801fa1c: 0802f190 .word 0x0802f190
  77807. 801fa20: 0802f580 .word 0x0802f580
  77808. 801fa24: 0802f1e4 .word 0x0802f1e4
  77809. 801fa28: 0802f5a4 .word 0x0802f5a4
  77810. 801fa2c: 0802f5c8 .word 0x0802f5c8
  77811. 801fa30: 0802f5d8 .word 0x0802f5d8
  77812. 801fa34: 0802f5e8 .word 0x0802f5e8
  77813. 0801fa38 <tcp_send_fin>:
  77814. * @param pcb the tcp_pcb over which to send a segment
  77815. * @return ERR_OK if sent, another err_t otherwise
  77816. */
  77817. err_t
  77818. tcp_send_fin(struct tcp_pcb *pcb)
  77819. {
  77820. 801fa38: b590 push {r4, r7, lr}
  77821. 801fa3a: b085 sub sp, #20
  77822. 801fa3c: af00 add r7, sp, #0
  77823. 801fa3e: 6078 str r0, [r7, #4]
  77824. LWIP_ASSERT("tcp_send_fin: invalid pcb", pcb != NULL);
  77825. 801fa40: 687b ldr r3, [r7, #4]
  77826. 801fa42: 2b00 cmp r3, #0
  77827. 801fa44: d106 bne.n 801fa54 <tcp_send_fin+0x1c>
  77828. 801fa46: 4b21 ldr r3, [pc, #132] @ (801facc <tcp_send_fin+0x94>)
  77829. 801fa48: f240 32eb movw r2, #1003 @ 0x3eb
  77830. 801fa4c: 4920 ldr r1, [pc, #128] @ (801fad0 <tcp_send_fin+0x98>)
  77831. 801fa4e: 4821 ldr r0, [pc, #132] @ (801fad4 <tcp_send_fin+0x9c>)
  77832. 801fa50: f009 ffbc bl 80299cc <iprintf>
  77833. /* first, try to add the fin to the last unsent segment */
  77834. if (pcb->unsent != NULL) {
  77835. 801fa54: 687b ldr r3, [r7, #4]
  77836. 801fa56: 6edb ldr r3, [r3, #108] @ 0x6c
  77837. 801fa58: 2b00 cmp r3, #0
  77838. 801fa5a: d02e beq.n 801faba <tcp_send_fin+0x82>
  77839. struct tcp_seg *last_unsent;
  77840. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  77841. 801fa5c: 687b ldr r3, [r7, #4]
  77842. 801fa5e: 6edb ldr r3, [r3, #108] @ 0x6c
  77843. 801fa60: 60fb str r3, [r7, #12]
  77844. 801fa62: e002 b.n 801fa6a <tcp_send_fin+0x32>
  77845. last_unsent = last_unsent->next);
  77846. 801fa64: 68fb ldr r3, [r7, #12]
  77847. 801fa66: 681b ldr r3, [r3, #0]
  77848. 801fa68: 60fb str r3, [r7, #12]
  77849. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  77850. 801fa6a: 68fb ldr r3, [r7, #12]
  77851. 801fa6c: 681b ldr r3, [r3, #0]
  77852. 801fa6e: 2b00 cmp r3, #0
  77853. 801fa70: d1f8 bne.n 801fa64 <tcp_send_fin+0x2c>
  77854. if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {
  77855. 801fa72: 68fb ldr r3, [r7, #12]
  77856. 801fa74: 691b ldr r3, [r3, #16]
  77857. 801fa76: 899b ldrh r3, [r3, #12]
  77858. 801fa78: b29b uxth r3, r3
  77859. 801fa7a: 4618 mov r0, r3
  77860. 801fa7c: f7f9 f84c bl 8018b18 <lwip_htons>
  77861. 801fa80: 4603 mov r3, r0
  77862. 801fa82: b2db uxtb r3, r3
  77863. 801fa84: f003 0307 and.w r3, r3, #7
  77864. 801fa88: 2b00 cmp r3, #0
  77865. 801fa8a: d116 bne.n 801faba <tcp_send_fin+0x82>
  77866. /* no SYN/FIN/RST flag in the header, we can add the FIN flag */
  77867. TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN);
  77868. 801fa8c: 68fb ldr r3, [r7, #12]
  77869. 801fa8e: 691b ldr r3, [r3, #16]
  77870. 801fa90: 899b ldrh r3, [r3, #12]
  77871. 801fa92: b29c uxth r4, r3
  77872. 801fa94: 2001 movs r0, #1
  77873. 801fa96: f7f9 f83f bl 8018b18 <lwip_htons>
  77874. 801fa9a: 4603 mov r3, r0
  77875. 801fa9c: 461a mov r2, r3
  77876. 801fa9e: 68fb ldr r3, [r7, #12]
  77877. 801faa0: 691b ldr r3, [r3, #16]
  77878. 801faa2: 4322 orrs r2, r4
  77879. 801faa4: b292 uxth r2, r2
  77880. 801faa6: 819a strh r2, [r3, #12]
  77881. tcp_set_flags(pcb, TF_FIN);
  77882. 801faa8: 687b ldr r3, [r7, #4]
  77883. 801faaa: 8b5b ldrh r3, [r3, #26]
  77884. 801faac: f043 0320 orr.w r3, r3, #32
  77885. 801fab0: b29a uxth r2, r3
  77886. 801fab2: 687b ldr r3, [r7, #4]
  77887. 801fab4: 835a strh r2, [r3, #26]
  77888. return ERR_OK;
  77889. 801fab6: 2300 movs r3, #0
  77890. 801fab8: e004 b.n 801fac4 <tcp_send_fin+0x8c>
  77891. }
  77892. }
  77893. /* no data, no length, flags, copy=1, no optdata */
  77894. return tcp_enqueue_flags(pcb, TCP_FIN);
  77895. 801faba: 2101 movs r1, #1
  77896. 801fabc: 6878 ldr r0, [r7, #4]
  77897. 801fabe: f000 f80b bl 801fad8 <tcp_enqueue_flags>
  77898. 801fac2: 4603 mov r3, r0
  77899. }
  77900. 801fac4: 4618 mov r0, r3
  77901. 801fac6: 3714 adds r7, #20
  77902. 801fac8: 46bd mov sp, r7
  77903. 801faca: bd90 pop {r4, r7, pc}
  77904. 801facc: 0802f190 .word 0x0802f190
  77905. 801fad0: 0802f5f4 .word 0x0802f5f4
  77906. 801fad4: 0802f1e4 .word 0x0802f1e4
  77907. 0801fad8 <tcp_enqueue_flags>:
  77908. * @param pcb Protocol control block for the TCP connection.
  77909. * @param flags TCP header flags to set in the outgoing segment.
  77910. */
  77911. err_t
  77912. tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)
  77913. {
  77914. 801fad8: b580 push {r7, lr}
  77915. 801fada: b088 sub sp, #32
  77916. 801fadc: af02 add r7, sp, #8
  77917. 801fade: 6078 str r0, [r7, #4]
  77918. 801fae0: 460b mov r3, r1
  77919. 801fae2: 70fb strb r3, [r7, #3]
  77920. struct pbuf *p;
  77921. struct tcp_seg *seg;
  77922. u8_t optflags = 0;
  77923. 801fae4: 2300 movs r3, #0
  77924. 801fae6: 75fb strb r3, [r7, #23]
  77925. u8_t optlen = 0;
  77926. 801fae8: 2300 movs r3, #0
  77927. 801faea: 75bb strb r3, [r7, #22]
  77928. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen));
  77929. LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)",
  77930. 801faec: 78fb ldrb r3, [r7, #3]
  77931. 801faee: f003 0303 and.w r3, r3, #3
  77932. 801faf2: 2b00 cmp r3, #0
  77933. 801faf4: d106 bne.n 801fb04 <tcp_enqueue_flags+0x2c>
  77934. 801faf6: 4b67 ldr r3, [pc, #412] @ (801fc94 <tcp_enqueue_flags+0x1bc>)
  77935. 801faf8: f240 4211 movw r2, #1041 @ 0x411
  77936. 801fafc: 4966 ldr r1, [pc, #408] @ (801fc98 <tcp_enqueue_flags+0x1c0>)
  77937. 801fafe: 4867 ldr r0, [pc, #412] @ (801fc9c <tcp_enqueue_flags+0x1c4>)
  77938. 801fb00: f009 ff64 bl 80299cc <iprintf>
  77939. (flags & (TCP_SYN | TCP_FIN)) != 0);
  77940. LWIP_ASSERT("tcp_enqueue_flags: invalid pcb", pcb != NULL);
  77941. 801fb04: 687b ldr r3, [r7, #4]
  77942. 801fb06: 2b00 cmp r3, #0
  77943. 801fb08: d106 bne.n 801fb18 <tcp_enqueue_flags+0x40>
  77944. 801fb0a: 4b62 ldr r3, [pc, #392] @ (801fc94 <tcp_enqueue_flags+0x1bc>)
  77945. 801fb0c: f240 4213 movw r2, #1043 @ 0x413
  77946. 801fb10: 4963 ldr r1, [pc, #396] @ (801fca0 <tcp_enqueue_flags+0x1c8>)
  77947. 801fb12: 4862 ldr r0, [pc, #392] @ (801fc9c <tcp_enqueue_flags+0x1c4>)
  77948. 801fb14: f009 ff5a bl 80299cc <iprintf>
  77949. /* No need to check pcb->snd_queuelen if only SYN or FIN are allowed! */
  77950. /* Get options for this segment. This is a special case since this is the
  77951. only place where a SYN can be sent. */
  77952. if (flags & TCP_SYN) {
  77953. 801fb18: 78fb ldrb r3, [r7, #3]
  77954. 801fb1a: f003 0302 and.w r3, r3, #2
  77955. 801fb1e: 2b00 cmp r3, #0
  77956. 801fb20: d001 beq.n 801fb26 <tcp_enqueue_flags+0x4e>
  77957. optflags = TF_SEG_OPTS_MSS;
  77958. 801fb22: 2301 movs r3, #1
  77959. 801fb24: 75fb strb r3, [r7, #23]
  77960. /* Make sure the timestamp option is only included in data segments if we
  77961. agreed about it with the remote host (and in active open SYN segments). */
  77962. optflags |= TF_SEG_OPTS_TS;
  77963. }
  77964. #endif /* LWIP_TCP_TIMESTAMPS */
  77965. optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb);
  77966. 801fb26: 7dfb ldrb r3, [r7, #23]
  77967. 801fb28: 009b lsls r3, r3, #2
  77968. 801fb2a: b2db uxtb r3, r3
  77969. 801fb2c: f003 0304 and.w r3, r3, #4
  77970. 801fb30: 75bb strb r3, [r7, #22]
  77971. /* Allocate pbuf with room for TCP header + options */
  77972. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  77973. 801fb32: 7dbb ldrb r3, [r7, #22]
  77974. 801fb34: b29b uxth r3, r3
  77975. 801fb36: f44f 7220 mov.w r2, #640 @ 0x280
  77976. 801fb3a: 4619 mov r1, r3
  77977. 801fb3c: 2036 movs r0, #54 @ 0x36
  77978. 801fb3e: f7fa f9b7 bl 8019eb0 <pbuf_alloc>
  77979. 801fb42: 60f8 str r0, [r7, #12]
  77980. 801fb44: 68fb ldr r3, [r7, #12]
  77981. 801fb46: 2b00 cmp r3, #0
  77982. 801fb48: d109 bne.n 801fb5e <tcp_enqueue_flags+0x86>
  77983. tcp_set_flags(pcb, TF_NAGLEMEMERR);
  77984. 801fb4a: 687b ldr r3, [r7, #4]
  77985. 801fb4c: 8b5b ldrh r3, [r3, #26]
  77986. 801fb4e: f043 0380 orr.w r3, r3, #128 @ 0x80
  77987. 801fb52: b29a uxth r2, r3
  77988. 801fb54: 687b ldr r3, [r7, #4]
  77989. 801fb56: 835a strh r2, [r3, #26]
  77990. TCP_STATS_INC(tcp.memerr);
  77991. return ERR_MEM;
  77992. 801fb58: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  77993. 801fb5c: e095 b.n 801fc8a <tcp_enqueue_flags+0x1b2>
  77994. }
  77995. LWIP_ASSERT("tcp_enqueue_flags: check that first pbuf can hold optlen",
  77996. 801fb5e: 68fb ldr r3, [r7, #12]
  77997. 801fb60: 895a ldrh r2, [r3, #10]
  77998. 801fb62: 7dbb ldrb r3, [r7, #22]
  77999. 801fb64: b29b uxth r3, r3
  78000. 801fb66: 429a cmp r2, r3
  78001. 801fb68: d206 bcs.n 801fb78 <tcp_enqueue_flags+0xa0>
  78002. 801fb6a: 4b4a ldr r3, [pc, #296] @ (801fc94 <tcp_enqueue_flags+0x1bc>)
  78003. 801fb6c: f240 4239 movw r2, #1081 @ 0x439
  78004. 801fb70: 494c ldr r1, [pc, #304] @ (801fca4 <tcp_enqueue_flags+0x1cc>)
  78005. 801fb72: 484a ldr r0, [pc, #296] @ (801fc9c <tcp_enqueue_flags+0x1c4>)
  78006. 801fb74: f009 ff2a bl 80299cc <iprintf>
  78007. (p->len >= optlen));
  78008. /* Allocate memory for tcp_seg, and fill in fields. */
  78009. if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) {
  78010. 801fb78: 687b ldr r3, [r7, #4]
  78011. 801fb7a: 6dd9 ldr r1, [r3, #92] @ 0x5c
  78012. 801fb7c: 78fa ldrb r2, [r7, #3]
  78013. 801fb7e: 7dfb ldrb r3, [r7, #23]
  78014. 801fb80: 9300 str r3, [sp, #0]
  78015. 801fb82: 460b mov r3, r1
  78016. 801fb84: 68f9 ldr r1, [r7, #12]
  78017. 801fb86: 6878 ldr r0, [r7, #4]
  78018. 801fb88: f7ff f8b6 bl 801ecf8 <tcp_create_segment>
  78019. 801fb8c: 60b8 str r0, [r7, #8]
  78020. 801fb8e: 68bb ldr r3, [r7, #8]
  78021. 801fb90: 2b00 cmp r3, #0
  78022. 801fb92: d109 bne.n 801fba8 <tcp_enqueue_flags+0xd0>
  78023. tcp_set_flags(pcb, TF_NAGLEMEMERR);
  78024. 801fb94: 687b ldr r3, [r7, #4]
  78025. 801fb96: 8b5b ldrh r3, [r3, #26]
  78026. 801fb98: f043 0380 orr.w r3, r3, #128 @ 0x80
  78027. 801fb9c: b29a uxth r2, r3
  78028. 801fb9e: 687b ldr r3, [r7, #4]
  78029. 801fba0: 835a strh r2, [r3, #26]
  78030. TCP_STATS_INC(tcp.memerr);
  78031. return ERR_MEM;
  78032. 801fba2: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  78033. 801fba6: e070 b.n 801fc8a <tcp_enqueue_flags+0x1b2>
  78034. }
  78035. LWIP_ASSERT("seg->tcphdr not aligned", ((mem_ptr_t)seg->tcphdr % LWIP_MIN(MEM_ALIGNMENT, 4)) == 0);
  78036. 801fba8: 68bb ldr r3, [r7, #8]
  78037. 801fbaa: 691b ldr r3, [r3, #16]
  78038. 801fbac: f003 0303 and.w r3, r3, #3
  78039. 801fbb0: 2b00 cmp r3, #0
  78040. 801fbb2: d006 beq.n 801fbc2 <tcp_enqueue_flags+0xea>
  78041. 801fbb4: 4b37 ldr r3, [pc, #220] @ (801fc94 <tcp_enqueue_flags+0x1bc>)
  78042. 801fbb6: f240 4242 movw r2, #1090 @ 0x442
  78043. 801fbba: 493b ldr r1, [pc, #236] @ (801fca8 <tcp_enqueue_flags+0x1d0>)
  78044. 801fbbc: 4837 ldr r0, [pc, #220] @ (801fc9c <tcp_enqueue_flags+0x1c4>)
  78045. 801fbbe: f009 ff05 bl 80299cc <iprintf>
  78046. LWIP_ASSERT("tcp_enqueue_flags: invalid segment length", seg->len == 0);
  78047. 801fbc2: 68bb ldr r3, [r7, #8]
  78048. 801fbc4: 891b ldrh r3, [r3, #8]
  78049. 801fbc6: 2b00 cmp r3, #0
  78050. 801fbc8: d006 beq.n 801fbd8 <tcp_enqueue_flags+0x100>
  78051. 801fbca: 4b32 ldr r3, [pc, #200] @ (801fc94 <tcp_enqueue_flags+0x1bc>)
  78052. 801fbcc: f240 4243 movw r2, #1091 @ 0x443
  78053. 801fbd0: 4936 ldr r1, [pc, #216] @ (801fcac <tcp_enqueue_flags+0x1d4>)
  78054. 801fbd2: 4832 ldr r0, [pc, #200] @ (801fc9c <tcp_enqueue_flags+0x1c4>)
  78055. 801fbd4: f009 fefa bl 80299cc <iprintf>
  78056. lwip_ntohl(seg->tcphdr->seqno),
  78057. lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg),
  78058. (u16_t)flags));
  78059. /* Now append seg to pcb->unsent queue */
  78060. if (pcb->unsent == NULL) {
  78061. 801fbd8: 687b ldr r3, [r7, #4]
  78062. 801fbda: 6edb ldr r3, [r3, #108] @ 0x6c
  78063. 801fbdc: 2b00 cmp r3, #0
  78064. 801fbde: d103 bne.n 801fbe8 <tcp_enqueue_flags+0x110>
  78065. pcb->unsent = seg;
  78066. 801fbe0: 687b ldr r3, [r7, #4]
  78067. 801fbe2: 68ba ldr r2, [r7, #8]
  78068. 801fbe4: 66da str r2, [r3, #108] @ 0x6c
  78069. 801fbe6: e00d b.n 801fc04 <tcp_enqueue_flags+0x12c>
  78070. } else {
  78071. struct tcp_seg *useg;
  78072. for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);
  78073. 801fbe8: 687b ldr r3, [r7, #4]
  78074. 801fbea: 6edb ldr r3, [r3, #108] @ 0x6c
  78075. 801fbec: 613b str r3, [r7, #16]
  78076. 801fbee: e002 b.n 801fbf6 <tcp_enqueue_flags+0x11e>
  78077. 801fbf0: 693b ldr r3, [r7, #16]
  78078. 801fbf2: 681b ldr r3, [r3, #0]
  78079. 801fbf4: 613b str r3, [r7, #16]
  78080. 801fbf6: 693b ldr r3, [r7, #16]
  78081. 801fbf8: 681b ldr r3, [r3, #0]
  78082. 801fbfa: 2b00 cmp r3, #0
  78083. 801fbfc: d1f8 bne.n 801fbf0 <tcp_enqueue_flags+0x118>
  78084. useg->next = seg;
  78085. 801fbfe: 693b ldr r3, [r7, #16]
  78086. 801fc00: 68ba ldr r2, [r7, #8]
  78087. 801fc02: 601a str r2, [r3, #0]
  78088. }
  78089. #if TCP_OVERSIZE
  78090. /* The new unsent tail has no space */
  78091. pcb->unsent_oversize = 0;
  78092. 801fc04: 687b ldr r3, [r7, #4]
  78093. 801fc06: 2200 movs r2, #0
  78094. 801fc08: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  78095. #endif /* TCP_OVERSIZE */
  78096. /* SYN and FIN bump the sequence number */
  78097. if ((flags & TCP_SYN) || (flags & TCP_FIN)) {
  78098. 801fc0c: 78fb ldrb r3, [r7, #3]
  78099. 801fc0e: f003 0302 and.w r3, r3, #2
  78100. 801fc12: 2b00 cmp r3, #0
  78101. 801fc14: d104 bne.n 801fc20 <tcp_enqueue_flags+0x148>
  78102. 801fc16: 78fb ldrb r3, [r7, #3]
  78103. 801fc18: f003 0301 and.w r3, r3, #1
  78104. 801fc1c: 2b00 cmp r3, #0
  78105. 801fc1e: d004 beq.n 801fc2a <tcp_enqueue_flags+0x152>
  78106. pcb->snd_lbb++;
  78107. 801fc20: 687b ldr r3, [r7, #4]
  78108. 801fc22: 6ddb ldr r3, [r3, #92] @ 0x5c
  78109. 801fc24: 1c5a adds r2, r3, #1
  78110. 801fc26: 687b ldr r3, [r7, #4]
  78111. 801fc28: 65da str r2, [r3, #92] @ 0x5c
  78112. /* optlen does not influence snd_buf */
  78113. }
  78114. if (flags & TCP_FIN) {
  78115. 801fc2a: 78fb ldrb r3, [r7, #3]
  78116. 801fc2c: f003 0301 and.w r3, r3, #1
  78117. 801fc30: 2b00 cmp r3, #0
  78118. 801fc32: d006 beq.n 801fc42 <tcp_enqueue_flags+0x16a>
  78119. tcp_set_flags(pcb, TF_FIN);
  78120. 801fc34: 687b ldr r3, [r7, #4]
  78121. 801fc36: 8b5b ldrh r3, [r3, #26]
  78122. 801fc38: f043 0320 orr.w r3, r3, #32
  78123. 801fc3c: b29a uxth r2, r3
  78124. 801fc3e: 687b ldr r3, [r7, #4]
  78125. 801fc40: 835a strh r2, [r3, #26]
  78126. }
  78127. /* update number of segments on the queues */
  78128. pcb->snd_queuelen += pbuf_clen(seg->p);
  78129. 801fc42: 68bb ldr r3, [r7, #8]
  78130. 801fc44: 685b ldr r3, [r3, #4]
  78131. 801fc46: 4618 mov r0, r3
  78132. 801fc48: f7fa fcd6 bl 801a5f8 <pbuf_clen>
  78133. 801fc4c: 4603 mov r3, r0
  78134. 801fc4e: 461a mov r2, r3
  78135. 801fc50: 687b ldr r3, [r7, #4]
  78136. 801fc52: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  78137. 801fc56: 4413 add r3, r2
  78138. 801fc58: b29a uxth r2, r3
  78139. 801fc5a: 687b ldr r3, [r7, #4]
  78140. 801fc5c: f8a3 2066 strh.w r2, [r3, #102] @ 0x66
  78141. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: %"S16_F" (after enqueued)\n", pcb->snd_queuelen));
  78142. if (pcb->snd_queuelen != 0) {
  78143. 801fc60: 687b ldr r3, [r7, #4]
  78144. 801fc62: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  78145. 801fc66: 2b00 cmp r3, #0
  78146. 801fc68: d00e beq.n 801fc88 <tcp_enqueue_flags+0x1b0>
  78147. LWIP_ASSERT("tcp_enqueue_flags: invalid queue length",
  78148. 801fc6a: 687b ldr r3, [r7, #4]
  78149. 801fc6c: 6f1b ldr r3, [r3, #112] @ 0x70
  78150. 801fc6e: 2b00 cmp r3, #0
  78151. 801fc70: d10a bne.n 801fc88 <tcp_enqueue_flags+0x1b0>
  78152. 801fc72: 687b ldr r3, [r7, #4]
  78153. 801fc74: 6edb ldr r3, [r3, #108] @ 0x6c
  78154. 801fc76: 2b00 cmp r3, #0
  78155. 801fc78: d106 bne.n 801fc88 <tcp_enqueue_flags+0x1b0>
  78156. 801fc7a: 4b06 ldr r3, [pc, #24] @ (801fc94 <tcp_enqueue_flags+0x1bc>)
  78157. 801fc7c: f240 4265 movw r2, #1125 @ 0x465
  78158. 801fc80: 490b ldr r1, [pc, #44] @ (801fcb0 <tcp_enqueue_flags+0x1d8>)
  78159. 801fc82: 4806 ldr r0, [pc, #24] @ (801fc9c <tcp_enqueue_flags+0x1c4>)
  78160. 801fc84: f009 fea2 bl 80299cc <iprintf>
  78161. pcb->unacked != NULL || pcb->unsent != NULL);
  78162. }
  78163. return ERR_OK;
  78164. 801fc88: 2300 movs r3, #0
  78165. }
  78166. 801fc8a: 4618 mov r0, r3
  78167. 801fc8c: 3718 adds r7, #24
  78168. 801fc8e: 46bd mov sp, r7
  78169. 801fc90: bd80 pop {r7, pc}
  78170. 801fc92: bf00 nop
  78171. 801fc94: 0802f190 .word 0x0802f190
  78172. 801fc98: 0802f610 .word 0x0802f610
  78173. 801fc9c: 0802f1e4 .word 0x0802f1e4
  78174. 801fca0: 0802f668 .word 0x0802f668
  78175. 801fca4: 0802f688 .word 0x0802f688
  78176. 801fca8: 0802f6c4 .word 0x0802f6c4
  78177. 801fcac: 0802f6dc .word 0x0802f6dc
  78178. 801fcb0: 0802f708 .word 0x0802f708
  78179. 0801fcb4 <tcp_output>:
  78180. * @return ERR_OK if data has been sent or nothing to send
  78181. * another err_t on error
  78182. */
  78183. err_t
  78184. tcp_output(struct tcp_pcb *pcb)
  78185. {
  78186. 801fcb4: b5b0 push {r4, r5, r7, lr}
  78187. 801fcb6: b08a sub sp, #40 @ 0x28
  78188. 801fcb8: af00 add r7, sp, #0
  78189. 801fcba: 6078 str r0, [r7, #4]
  78190. struct netif *netif;
  78191. #if TCP_CWND_DEBUG
  78192. s16_t i = 0;
  78193. #endif /* TCP_CWND_DEBUG */
  78194. LWIP_ASSERT_CORE_LOCKED();
  78195. 801fcbc: f7f0 fc38 bl 8010530 <sys_check_core_locking>
  78196. LWIP_ASSERT("tcp_output: invalid pcb", pcb != NULL);
  78197. 801fcc0: 687b ldr r3, [r7, #4]
  78198. 801fcc2: 2b00 cmp r3, #0
  78199. 801fcc4: d106 bne.n 801fcd4 <tcp_output+0x20>
  78200. 801fcc6: 4b8a ldr r3, [pc, #552] @ (801fef0 <tcp_output+0x23c>)
  78201. 801fcc8: f240 42e1 movw r2, #1249 @ 0x4e1
  78202. 801fccc: 4989 ldr r1, [pc, #548] @ (801fef4 <tcp_output+0x240>)
  78203. 801fcce: 488a ldr r0, [pc, #552] @ (801fef8 <tcp_output+0x244>)
  78204. 801fcd0: f009 fe7c bl 80299cc <iprintf>
  78205. /* pcb->state LISTEN not allowed here */
  78206. LWIP_ASSERT("don't call tcp_output for listen-pcbs",
  78207. 801fcd4: 687b ldr r3, [r7, #4]
  78208. 801fcd6: 7d1b ldrb r3, [r3, #20]
  78209. 801fcd8: 2b01 cmp r3, #1
  78210. 801fcda: d106 bne.n 801fcea <tcp_output+0x36>
  78211. 801fcdc: 4b84 ldr r3, [pc, #528] @ (801fef0 <tcp_output+0x23c>)
  78212. 801fcde: f240 42e3 movw r2, #1251 @ 0x4e3
  78213. 801fce2: 4986 ldr r1, [pc, #536] @ (801fefc <tcp_output+0x248>)
  78214. 801fce4: 4884 ldr r0, [pc, #528] @ (801fef8 <tcp_output+0x244>)
  78215. 801fce6: f009 fe71 bl 80299cc <iprintf>
  78216. /* First, check if we are invoked by the TCP input processing
  78217. code. If so, we do not output anything. Instead, we rely on the
  78218. input processing code to call us when input processing is done
  78219. with. */
  78220. if (tcp_input_pcb == pcb) {
  78221. 801fcea: 4b85 ldr r3, [pc, #532] @ (801ff00 <tcp_output+0x24c>)
  78222. 801fcec: 681b ldr r3, [r3, #0]
  78223. 801fcee: 687a ldr r2, [r7, #4]
  78224. 801fcf0: 429a cmp r2, r3
  78225. 801fcf2: d101 bne.n 801fcf8 <tcp_output+0x44>
  78226. return ERR_OK;
  78227. 801fcf4: 2300 movs r3, #0
  78228. 801fcf6: e1d1 b.n 802009c <tcp_output+0x3e8>
  78229. }
  78230. wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);
  78231. 801fcf8: 687b ldr r3, [r7, #4]
  78232. 801fcfa: f8b3 2048 ldrh.w r2, [r3, #72] @ 0x48
  78233. 801fcfe: 687b ldr r3, [r7, #4]
  78234. 801fd00: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  78235. 801fd04: 4293 cmp r3, r2
  78236. 801fd06: bf28 it cs
  78237. 801fd08: 4613 movcs r3, r2
  78238. 801fd0a: b29b uxth r3, r3
  78239. 801fd0c: 61bb str r3, [r7, #24]
  78240. seg = pcb->unsent;
  78241. 801fd0e: 687b ldr r3, [r7, #4]
  78242. 801fd10: 6edb ldr r3, [r3, #108] @ 0x6c
  78243. 801fd12: 627b str r3, [r7, #36] @ 0x24
  78244. if (seg == NULL) {
  78245. 801fd14: 6a7b ldr r3, [r7, #36] @ 0x24
  78246. 801fd16: 2b00 cmp r3, #0
  78247. 801fd18: d10b bne.n 801fd32 <tcp_output+0x7e>
  78248. ", seg == NULL, ack %"U32_F"\n",
  78249. pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack));
  78250. /* If the TF_ACK_NOW flag is set and the ->unsent queue is empty, construct
  78251. * an empty ACK segment and send it. */
  78252. if (pcb->flags & TF_ACK_NOW) {
  78253. 801fd1a: 687b ldr r3, [r7, #4]
  78254. 801fd1c: 8b5b ldrh r3, [r3, #26]
  78255. 801fd1e: f003 0302 and.w r3, r3, #2
  78256. 801fd22: 2b00 cmp r3, #0
  78257. 801fd24: f000 81ad beq.w 8020082 <tcp_output+0x3ce>
  78258. return tcp_send_empty_ack(pcb);
  78259. 801fd28: 6878 ldr r0, [r7, #4]
  78260. 801fd2a: f000 fdd7 bl 80208dc <tcp_send_empty_ack>
  78261. 801fd2e: 4603 mov r3, r0
  78262. 801fd30: e1b4 b.n 802009c <tcp_output+0x3e8>
  78263. pcb->snd_wnd, pcb->cwnd, wnd,
  78264. lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
  78265. lwip_ntohl(seg->tcphdr->seqno), pcb->lastack));
  78266. }
  78267. netif = tcp_route(pcb, &pcb->local_ip, &pcb->remote_ip);
  78268. 801fd32: 6879 ldr r1, [r7, #4]
  78269. 801fd34: 687b ldr r3, [r7, #4]
  78270. 801fd36: 3304 adds r3, #4
  78271. 801fd38: 461a mov r2, r3
  78272. 801fd3a: 6878 ldr r0, [r7, #4]
  78273. 801fd3c: f7fe ffc0 bl 801ecc0 <tcp_route>
  78274. 801fd40: 6178 str r0, [r7, #20]
  78275. if (netif == NULL) {
  78276. 801fd42: 697b ldr r3, [r7, #20]
  78277. 801fd44: 2b00 cmp r3, #0
  78278. 801fd46: d102 bne.n 801fd4e <tcp_output+0x9a>
  78279. return ERR_RTE;
  78280. 801fd48: f06f 0303 mvn.w r3, #3
  78281. 801fd4c: e1a6 b.n 802009c <tcp_output+0x3e8>
  78282. }
  78283. /* If we don't have a local IP address, we get one from netif */
  78284. if (ip_addr_isany(&pcb->local_ip)) {
  78285. 801fd4e: 687b ldr r3, [r7, #4]
  78286. 801fd50: 2b00 cmp r3, #0
  78287. 801fd52: d003 beq.n 801fd5c <tcp_output+0xa8>
  78288. 801fd54: 687b ldr r3, [r7, #4]
  78289. 801fd56: 681b ldr r3, [r3, #0]
  78290. 801fd58: 2b00 cmp r3, #0
  78291. 801fd5a: d111 bne.n 801fd80 <tcp_output+0xcc>
  78292. const ip_addr_t *local_ip = ip_netif_get_local_ip(netif, &pcb->remote_ip);
  78293. 801fd5c: 697b ldr r3, [r7, #20]
  78294. 801fd5e: 2b00 cmp r3, #0
  78295. 801fd60: d002 beq.n 801fd68 <tcp_output+0xb4>
  78296. 801fd62: 697b ldr r3, [r7, #20]
  78297. 801fd64: 3304 adds r3, #4
  78298. 801fd66: e000 b.n 801fd6a <tcp_output+0xb6>
  78299. 801fd68: 2300 movs r3, #0
  78300. 801fd6a: 613b str r3, [r7, #16]
  78301. if (local_ip == NULL) {
  78302. 801fd6c: 693b ldr r3, [r7, #16]
  78303. 801fd6e: 2b00 cmp r3, #0
  78304. 801fd70: d102 bne.n 801fd78 <tcp_output+0xc4>
  78305. return ERR_RTE;
  78306. 801fd72: f06f 0303 mvn.w r3, #3
  78307. 801fd76: e191 b.n 802009c <tcp_output+0x3e8>
  78308. }
  78309. ip_addr_copy(pcb->local_ip, *local_ip);
  78310. 801fd78: 693b ldr r3, [r7, #16]
  78311. 801fd7a: 681a ldr r2, [r3, #0]
  78312. 801fd7c: 687b ldr r3, [r7, #4]
  78313. 801fd7e: 601a str r2, [r3, #0]
  78314. }
  78315. /* Handle the current segment not fitting within the window */
  78316. if (lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd) {
  78317. 801fd80: 6a7b ldr r3, [r7, #36] @ 0x24
  78318. 801fd82: 691b ldr r3, [r3, #16]
  78319. 801fd84: 685b ldr r3, [r3, #4]
  78320. 801fd86: 4618 mov r0, r3
  78321. 801fd88: f7f8 fedb bl 8018b42 <lwip_htonl>
  78322. 801fd8c: 4602 mov r2, r0
  78323. 801fd8e: 687b ldr r3, [r7, #4]
  78324. 801fd90: 6c5b ldr r3, [r3, #68] @ 0x44
  78325. 801fd92: 1ad3 subs r3, r2, r3
  78326. 801fd94: 6a7a ldr r2, [r7, #36] @ 0x24
  78327. 801fd96: 8912 ldrh r2, [r2, #8]
  78328. 801fd98: 4413 add r3, r2
  78329. 801fd9a: 69ba ldr r2, [r7, #24]
  78330. 801fd9c: 429a cmp r2, r3
  78331. 801fd9e: d227 bcs.n 801fdf0 <tcp_output+0x13c>
  78332. * within the remaining (could be 0) send window and RTO timer is not running (we
  78333. * have no in-flight data). If window is still too small after persist timer fires,
  78334. * then we split the segment. We don't consider the congestion window since a cwnd
  78335. * smaller than 1 SMSS implies in-flight data
  78336. */
  78337. if (wnd == pcb->snd_wnd && pcb->unacked == NULL && pcb->persist_backoff == 0) {
  78338. 801fda0: 687b ldr r3, [r7, #4]
  78339. 801fda2: f8b3 3060 ldrh.w r3, [r3, #96] @ 0x60
  78340. 801fda6: 461a mov r2, r3
  78341. 801fda8: 69bb ldr r3, [r7, #24]
  78342. 801fdaa: 4293 cmp r3, r2
  78343. 801fdac: d114 bne.n 801fdd8 <tcp_output+0x124>
  78344. 801fdae: 687b ldr r3, [r7, #4]
  78345. 801fdb0: 6f1b ldr r3, [r3, #112] @ 0x70
  78346. 801fdb2: 2b00 cmp r3, #0
  78347. 801fdb4: d110 bne.n 801fdd8 <tcp_output+0x124>
  78348. 801fdb6: 687b ldr r3, [r7, #4]
  78349. 801fdb8: f893 3099 ldrb.w r3, [r3, #153] @ 0x99
  78350. 801fdbc: 2b00 cmp r3, #0
  78351. 801fdbe: d10b bne.n 801fdd8 <tcp_output+0x124>
  78352. pcb->persist_cnt = 0;
  78353. 801fdc0: 687b ldr r3, [r7, #4]
  78354. 801fdc2: 2200 movs r2, #0
  78355. 801fdc4: f883 2098 strb.w r2, [r3, #152] @ 0x98
  78356. pcb->persist_backoff = 1;
  78357. 801fdc8: 687b ldr r3, [r7, #4]
  78358. 801fdca: 2201 movs r2, #1
  78359. 801fdcc: f883 2099 strb.w r2, [r3, #153] @ 0x99
  78360. pcb->persist_probe = 0;
  78361. 801fdd0: 687b ldr r3, [r7, #4]
  78362. 801fdd2: 2200 movs r2, #0
  78363. 801fdd4: f883 209a strb.w r2, [r3, #154] @ 0x9a
  78364. }
  78365. /* We need an ACK, but can't send data now, so send an empty ACK */
  78366. if (pcb->flags & TF_ACK_NOW) {
  78367. 801fdd8: 687b ldr r3, [r7, #4]
  78368. 801fdda: 8b5b ldrh r3, [r3, #26]
  78369. 801fddc: f003 0302 and.w r3, r3, #2
  78370. 801fde0: 2b00 cmp r3, #0
  78371. 801fde2: f000 8150 beq.w 8020086 <tcp_output+0x3d2>
  78372. return tcp_send_empty_ack(pcb);
  78373. 801fde6: 6878 ldr r0, [r7, #4]
  78374. 801fde8: f000 fd78 bl 80208dc <tcp_send_empty_ack>
  78375. 801fdec: 4603 mov r3, r0
  78376. 801fdee: e155 b.n 802009c <tcp_output+0x3e8>
  78377. }
  78378. goto output_done;
  78379. }
  78380. /* Stop persist timer, above conditions are not active */
  78381. pcb->persist_backoff = 0;
  78382. 801fdf0: 687b ldr r3, [r7, #4]
  78383. 801fdf2: 2200 movs r2, #0
  78384. 801fdf4: f883 2099 strb.w r2, [r3, #153] @ 0x99
  78385. /* useg should point to last segment on unacked queue */
  78386. useg = pcb->unacked;
  78387. 801fdf8: 687b ldr r3, [r7, #4]
  78388. 801fdfa: 6f1b ldr r3, [r3, #112] @ 0x70
  78389. 801fdfc: 623b str r3, [r7, #32]
  78390. if (useg != NULL) {
  78391. 801fdfe: 6a3b ldr r3, [r7, #32]
  78392. 801fe00: 2b00 cmp r3, #0
  78393. 801fe02: f000 811f beq.w 8020044 <tcp_output+0x390>
  78394. for (; useg->next != NULL; useg = useg->next);
  78395. 801fe06: e002 b.n 801fe0e <tcp_output+0x15a>
  78396. 801fe08: 6a3b ldr r3, [r7, #32]
  78397. 801fe0a: 681b ldr r3, [r3, #0]
  78398. 801fe0c: 623b str r3, [r7, #32]
  78399. 801fe0e: 6a3b ldr r3, [r7, #32]
  78400. 801fe10: 681b ldr r3, [r3, #0]
  78401. 801fe12: 2b00 cmp r3, #0
  78402. 801fe14: d1f8 bne.n 801fe08 <tcp_output+0x154>
  78403. }
  78404. /* data available and window allows it to be sent? */
  78405. while (seg != NULL &&
  78406. 801fe16: e115 b.n 8020044 <tcp_output+0x390>
  78407. lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
  78408. LWIP_ASSERT("RST not expected here!",
  78409. 801fe18: 6a7b ldr r3, [r7, #36] @ 0x24
  78410. 801fe1a: 691b ldr r3, [r3, #16]
  78411. 801fe1c: 899b ldrh r3, [r3, #12]
  78412. 801fe1e: b29b uxth r3, r3
  78413. 801fe20: 4618 mov r0, r3
  78414. 801fe22: f7f8 fe79 bl 8018b18 <lwip_htons>
  78415. 801fe26: 4603 mov r3, r0
  78416. 801fe28: b2db uxtb r3, r3
  78417. 801fe2a: f003 0304 and.w r3, r3, #4
  78418. 801fe2e: 2b00 cmp r3, #0
  78419. 801fe30: d006 beq.n 801fe40 <tcp_output+0x18c>
  78420. 801fe32: 4b2f ldr r3, [pc, #188] @ (801fef0 <tcp_output+0x23c>)
  78421. 801fe34: f240 5236 movw r2, #1334 @ 0x536
  78422. 801fe38: 4932 ldr r1, [pc, #200] @ (801ff04 <tcp_output+0x250>)
  78423. 801fe3a: 482f ldr r0, [pc, #188] @ (801fef8 <tcp_output+0x244>)
  78424. 801fe3c: f009 fdc6 bl 80299cc <iprintf>
  78425. * - if tcp_write had a memory error before (prevent delayed ACK timeout) or
  78426. * - if FIN was already enqueued for this PCB (SYN is always alone in a segment -
  78427. * either seg->next != NULL or pcb->unacked == NULL;
  78428. * RST is no sent using tcp_write/tcp_output.
  78429. */
  78430. if ((tcp_do_output_nagle(pcb) == 0) &&
  78431. 801fe40: 687b ldr r3, [r7, #4]
  78432. 801fe42: 6f1b ldr r3, [r3, #112] @ 0x70
  78433. 801fe44: 2b00 cmp r3, #0
  78434. 801fe46: d01f beq.n 801fe88 <tcp_output+0x1d4>
  78435. 801fe48: 687b ldr r3, [r7, #4]
  78436. 801fe4a: 8b5b ldrh r3, [r3, #26]
  78437. 801fe4c: f003 0344 and.w r3, r3, #68 @ 0x44
  78438. 801fe50: 2b00 cmp r3, #0
  78439. 801fe52: d119 bne.n 801fe88 <tcp_output+0x1d4>
  78440. 801fe54: 687b ldr r3, [r7, #4]
  78441. 801fe56: 6edb ldr r3, [r3, #108] @ 0x6c
  78442. 801fe58: 2b00 cmp r3, #0
  78443. 801fe5a: d00b beq.n 801fe74 <tcp_output+0x1c0>
  78444. 801fe5c: 687b ldr r3, [r7, #4]
  78445. 801fe5e: 6edb ldr r3, [r3, #108] @ 0x6c
  78446. 801fe60: 681b ldr r3, [r3, #0]
  78447. 801fe62: 2b00 cmp r3, #0
  78448. 801fe64: d110 bne.n 801fe88 <tcp_output+0x1d4>
  78449. 801fe66: 687b ldr r3, [r7, #4]
  78450. 801fe68: 6edb ldr r3, [r3, #108] @ 0x6c
  78451. 801fe6a: 891a ldrh r2, [r3, #8]
  78452. 801fe6c: 687b ldr r3, [r7, #4]
  78453. 801fe6e: 8e5b ldrh r3, [r3, #50] @ 0x32
  78454. 801fe70: 429a cmp r2, r3
  78455. 801fe72: d209 bcs.n 801fe88 <tcp_output+0x1d4>
  78456. 801fe74: 687b ldr r3, [r7, #4]
  78457. 801fe76: f8b3 3064 ldrh.w r3, [r3, #100] @ 0x64
  78458. 801fe7a: 2b00 cmp r3, #0
  78459. 801fe7c: d004 beq.n 801fe88 <tcp_output+0x1d4>
  78460. 801fe7e: 687b ldr r3, [r7, #4]
  78461. 801fe80: f8b3 3066 ldrh.w r3, [r3, #102] @ 0x66
  78462. 801fe84: 2b0f cmp r3, #15
  78463. 801fe86: d901 bls.n 801fe8c <tcp_output+0x1d8>
  78464. 801fe88: 2301 movs r3, #1
  78465. 801fe8a: e000 b.n 801fe8e <tcp_output+0x1da>
  78466. 801fe8c: 2300 movs r3, #0
  78467. 801fe8e: 2b00 cmp r3, #0
  78468. 801fe90: d106 bne.n 801fea0 <tcp_output+0x1ec>
  78469. ((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)) {
  78470. 801fe92: 687b ldr r3, [r7, #4]
  78471. 801fe94: 8b5b ldrh r3, [r3, #26]
  78472. 801fe96: f003 03a0 and.w r3, r3, #160 @ 0xa0
  78473. if ((tcp_do_output_nagle(pcb) == 0) &&
  78474. 801fe9a: 2b00 cmp r3, #0
  78475. 801fe9c: f000 80e7 beq.w 802006e <tcp_output+0x3ba>
  78476. pcb->lastack,
  78477. lwip_ntohl(seg->tcphdr->seqno), pcb->lastack, i));
  78478. ++i;
  78479. #endif /* TCP_CWND_DEBUG */
  78480. if (pcb->state != SYN_SENT) {
  78481. 801fea0: 687b ldr r3, [r7, #4]
  78482. 801fea2: 7d1b ldrb r3, [r3, #20]
  78483. 801fea4: 2b02 cmp r3, #2
  78484. 801fea6: d00d beq.n 801fec4 <tcp_output+0x210>
  78485. TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
  78486. 801fea8: 6a7b ldr r3, [r7, #36] @ 0x24
  78487. 801feaa: 691b ldr r3, [r3, #16]
  78488. 801feac: 899b ldrh r3, [r3, #12]
  78489. 801feae: b29c uxth r4, r3
  78490. 801feb0: 2010 movs r0, #16
  78491. 801feb2: f7f8 fe31 bl 8018b18 <lwip_htons>
  78492. 801feb6: 4603 mov r3, r0
  78493. 801feb8: 461a mov r2, r3
  78494. 801feba: 6a7b ldr r3, [r7, #36] @ 0x24
  78495. 801febc: 691b ldr r3, [r3, #16]
  78496. 801febe: 4322 orrs r2, r4
  78497. 801fec0: b292 uxth r2, r2
  78498. 801fec2: 819a strh r2, [r3, #12]
  78499. }
  78500. err = tcp_output_segment(seg, pcb, netif);
  78501. 801fec4: 697a ldr r2, [r7, #20]
  78502. 801fec6: 6879 ldr r1, [r7, #4]
  78503. 801fec8: 6a78 ldr r0, [r7, #36] @ 0x24
  78504. 801feca: f000 f90b bl 80200e4 <tcp_output_segment>
  78505. 801fece: 4603 mov r3, r0
  78506. 801fed0: 73fb strb r3, [r7, #15]
  78507. if (err != ERR_OK) {
  78508. 801fed2: f997 300f ldrsb.w r3, [r7, #15]
  78509. 801fed6: 2b00 cmp r3, #0
  78510. 801fed8: d016 beq.n 801ff08 <tcp_output+0x254>
  78511. /* segment could not be sent, for whatever reason */
  78512. tcp_set_flags(pcb, TF_NAGLEMEMERR);
  78513. 801feda: 687b ldr r3, [r7, #4]
  78514. 801fedc: 8b5b ldrh r3, [r3, #26]
  78515. 801fede: f043 0380 orr.w r3, r3, #128 @ 0x80
  78516. 801fee2: b29a uxth r2, r3
  78517. 801fee4: 687b ldr r3, [r7, #4]
  78518. 801fee6: 835a strh r2, [r3, #26]
  78519. return err;
  78520. 801fee8: f997 300f ldrsb.w r3, [r7, #15]
  78521. 801feec: e0d6 b.n 802009c <tcp_output+0x3e8>
  78522. 801feee: bf00 nop
  78523. 801fef0: 0802f190 .word 0x0802f190
  78524. 801fef4: 0802f730 .word 0x0802f730
  78525. 801fef8: 0802f1e4 .word 0x0802f1e4
  78526. 801fefc: 0802f748 .word 0x0802f748
  78527. 801ff00: 2402aed8 .word 0x2402aed8
  78528. 801ff04: 0802f770 .word 0x0802f770
  78529. }
  78530. #if TCP_OVERSIZE_DBGCHECK
  78531. seg->oversize_left = 0;
  78532. 801ff08: 6a7b ldr r3, [r7, #36] @ 0x24
  78533. 801ff0a: 2200 movs r2, #0
  78534. 801ff0c: 815a strh r2, [r3, #10]
  78535. #endif /* TCP_OVERSIZE_DBGCHECK */
  78536. pcb->unsent = seg->next;
  78537. 801ff0e: 6a7b ldr r3, [r7, #36] @ 0x24
  78538. 801ff10: 681a ldr r2, [r3, #0]
  78539. 801ff12: 687b ldr r3, [r7, #4]
  78540. 801ff14: 66da str r2, [r3, #108] @ 0x6c
  78541. if (pcb->state != SYN_SENT) {
  78542. 801ff16: 687b ldr r3, [r7, #4]
  78543. 801ff18: 7d1b ldrb r3, [r3, #20]
  78544. 801ff1a: 2b02 cmp r3, #2
  78545. 801ff1c: d006 beq.n 801ff2c <tcp_output+0x278>
  78546. tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
  78547. 801ff1e: 687b ldr r3, [r7, #4]
  78548. 801ff20: 8b5b ldrh r3, [r3, #26]
  78549. 801ff22: f023 0303 bic.w r3, r3, #3
  78550. 801ff26: b29a uxth r2, r3
  78551. 801ff28: 687b ldr r3, [r7, #4]
  78552. 801ff2a: 835a strh r2, [r3, #26]
  78553. }
  78554. snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
  78555. 801ff2c: 6a7b ldr r3, [r7, #36] @ 0x24
  78556. 801ff2e: 691b ldr r3, [r3, #16]
  78557. 801ff30: 685b ldr r3, [r3, #4]
  78558. 801ff32: 4618 mov r0, r3
  78559. 801ff34: f7f8 fe05 bl 8018b42 <lwip_htonl>
  78560. 801ff38: 4604 mov r4, r0
  78561. 801ff3a: 6a7b ldr r3, [r7, #36] @ 0x24
  78562. 801ff3c: 891b ldrh r3, [r3, #8]
  78563. 801ff3e: 461d mov r5, r3
  78564. 801ff40: 6a7b ldr r3, [r7, #36] @ 0x24
  78565. 801ff42: 691b ldr r3, [r3, #16]
  78566. 801ff44: 899b ldrh r3, [r3, #12]
  78567. 801ff46: b29b uxth r3, r3
  78568. 801ff48: 4618 mov r0, r3
  78569. 801ff4a: f7f8 fde5 bl 8018b18 <lwip_htons>
  78570. 801ff4e: 4603 mov r3, r0
  78571. 801ff50: b2db uxtb r3, r3
  78572. 801ff52: f003 0303 and.w r3, r3, #3
  78573. 801ff56: 2b00 cmp r3, #0
  78574. 801ff58: d001 beq.n 801ff5e <tcp_output+0x2aa>
  78575. 801ff5a: 2301 movs r3, #1
  78576. 801ff5c: e000 b.n 801ff60 <tcp_output+0x2ac>
  78577. 801ff5e: 2300 movs r3, #0
  78578. 801ff60: 442b add r3, r5
  78579. 801ff62: 4423 add r3, r4
  78580. 801ff64: 60bb str r3, [r7, #8]
  78581. if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
  78582. 801ff66: 687b ldr r3, [r7, #4]
  78583. 801ff68: 6d1a ldr r2, [r3, #80] @ 0x50
  78584. 801ff6a: 68bb ldr r3, [r7, #8]
  78585. 801ff6c: 1ad3 subs r3, r2, r3
  78586. 801ff6e: 2b00 cmp r3, #0
  78587. 801ff70: da02 bge.n 801ff78 <tcp_output+0x2c4>
  78588. pcb->snd_nxt = snd_nxt;
  78589. 801ff72: 687b ldr r3, [r7, #4]
  78590. 801ff74: 68ba ldr r2, [r7, #8]
  78591. 801ff76: 651a str r2, [r3, #80] @ 0x50
  78592. }
  78593. /* put segment on unacknowledged list if length > 0 */
  78594. if (TCP_TCPLEN(seg) > 0) {
  78595. 801ff78: 6a7b ldr r3, [r7, #36] @ 0x24
  78596. 801ff7a: 891b ldrh r3, [r3, #8]
  78597. 801ff7c: 461c mov r4, r3
  78598. 801ff7e: 6a7b ldr r3, [r7, #36] @ 0x24
  78599. 801ff80: 691b ldr r3, [r3, #16]
  78600. 801ff82: 899b ldrh r3, [r3, #12]
  78601. 801ff84: b29b uxth r3, r3
  78602. 801ff86: 4618 mov r0, r3
  78603. 801ff88: f7f8 fdc6 bl 8018b18 <lwip_htons>
  78604. 801ff8c: 4603 mov r3, r0
  78605. 801ff8e: b2db uxtb r3, r3
  78606. 801ff90: f003 0303 and.w r3, r3, #3
  78607. 801ff94: 2b00 cmp r3, #0
  78608. 801ff96: d001 beq.n 801ff9c <tcp_output+0x2e8>
  78609. 801ff98: 2301 movs r3, #1
  78610. 801ff9a: e000 b.n 801ff9e <tcp_output+0x2ea>
  78611. 801ff9c: 2300 movs r3, #0
  78612. 801ff9e: 4423 add r3, r4
  78613. 801ffa0: 2b00 cmp r3, #0
  78614. 801ffa2: d049 beq.n 8020038 <tcp_output+0x384>
  78615. seg->next = NULL;
  78616. 801ffa4: 6a7b ldr r3, [r7, #36] @ 0x24
  78617. 801ffa6: 2200 movs r2, #0
  78618. 801ffa8: 601a str r2, [r3, #0]
  78619. /* unacked list is empty? */
  78620. if (pcb->unacked == NULL) {
  78621. 801ffaa: 687b ldr r3, [r7, #4]
  78622. 801ffac: 6f1b ldr r3, [r3, #112] @ 0x70
  78623. 801ffae: 2b00 cmp r3, #0
  78624. 801ffb0: d105 bne.n 801ffbe <tcp_output+0x30a>
  78625. pcb->unacked = seg;
  78626. 801ffb2: 687b ldr r3, [r7, #4]
  78627. 801ffb4: 6a7a ldr r2, [r7, #36] @ 0x24
  78628. 801ffb6: 671a str r2, [r3, #112] @ 0x70
  78629. useg = seg;
  78630. 801ffb8: 6a7b ldr r3, [r7, #36] @ 0x24
  78631. 801ffba: 623b str r3, [r7, #32]
  78632. 801ffbc: e03f b.n 802003e <tcp_output+0x38a>
  78633. /* unacked list is not empty? */
  78634. } else {
  78635. /* In the case of fast retransmit, the packet should not go to the tail
  78636. * of the unacked queue, but rather somewhere before it. We need to check for
  78637. * this case. -STJ Jul 27, 2004 */
  78638. if (TCP_SEQ_LT(lwip_ntohl(seg->tcphdr->seqno), lwip_ntohl(useg->tcphdr->seqno))) {
  78639. 801ffbe: 6a7b ldr r3, [r7, #36] @ 0x24
  78640. 801ffc0: 691b ldr r3, [r3, #16]
  78641. 801ffc2: 685b ldr r3, [r3, #4]
  78642. 801ffc4: 4618 mov r0, r3
  78643. 801ffc6: f7f8 fdbc bl 8018b42 <lwip_htonl>
  78644. 801ffca: 4604 mov r4, r0
  78645. 801ffcc: 6a3b ldr r3, [r7, #32]
  78646. 801ffce: 691b ldr r3, [r3, #16]
  78647. 801ffd0: 685b ldr r3, [r3, #4]
  78648. 801ffd2: 4618 mov r0, r3
  78649. 801ffd4: f7f8 fdb5 bl 8018b42 <lwip_htonl>
  78650. 801ffd8: 4603 mov r3, r0
  78651. 801ffda: 1ae3 subs r3, r4, r3
  78652. 801ffdc: 2b00 cmp r3, #0
  78653. 801ffde: da24 bge.n 802002a <tcp_output+0x376>
  78654. /* add segment to before tail of unacked list, keeping the list sorted */
  78655. struct tcp_seg **cur_seg = &(pcb->unacked);
  78656. 801ffe0: 687b ldr r3, [r7, #4]
  78657. 801ffe2: 3370 adds r3, #112 @ 0x70
  78658. 801ffe4: 61fb str r3, [r7, #28]
  78659. while (*cur_seg &&
  78660. 801ffe6: e002 b.n 801ffee <tcp_output+0x33a>
  78661. TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
  78662. cur_seg = &((*cur_seg)->next );
  78663. 801ffe8: 69fb ldr r3, [r7, #28]
  78664. 801ffea: 681b ldr r3, [r3, #0]
  78665. 801ffec: 61fb str r3, [r7, #28]
  78666. while (*cur_seg &&
  78667. 801ffee: 69fb ldr r3, [r7, #28]
  78668. 801fff0: 681b ldr r3, [r3, #0]
  78669. 801fff2: 2b00 cmp r3, #0
  78670. 801fff4: d011 beq.n 802001a <tcp_output+0x366>
  78671. TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
  78672. 801fff6: 69fb ldr r3, [r7, #28]
  78673. 801fff8: 681b ldr r3, [r3, #0]
  78674. 801fffa: 691b ldr r3, [r3, #16]
  78675. 801fffc: 685b ldr r3, [r3, #4]
  78676. 801fffe: 4618 mov r0, r3
  78677. 8020000: f7f8 fd9f bl 8018b42 <lwip_htonl>
  78678. 8020004: 4604 mov r4, r0
  78679. 8020006: 6a7b ldr r3, [r7, #36] @ 0x24
  78680. 8020008: 691b ldr r3, [r3, #16]
  78681. 802000a: 685b ldr r3, [r3, #4]
  78682. 802000c: 4618 mov r0, r3
  78683. 802000e: f7f8 fd98 bl 8018b42 <lwip_htonl>
  78684. 8020012: 4603 mov r3, r0
  78685. 8020014: 1ae3 subs r3, r4, r3
  78686. while (*cur_seg &&
  78687. 8020016: 2b00 cmp r3, #0
  78688. 8020018: dbe6 blt.n 801ffe8 <tcp_output+0x334>
  78689. }
  78690. seg->next = (*cur_seg);
  78691. 802001a: 69fb ldr r3, [r7, #28]
  78692. 802001c: 681a ldr r2, [r3, #0]
  78693. 802001e: 6a7b ldr r3, [r7, #36] @ 0x24
  78694. 8020020: 601a str r2, [r3, #0]
  78695. (*cur_seg) = seg;
  78696. 8020022: 69fb ldr r3, [r7, #28]
  78697. 8020024: 6a7a ldr r2, [r7, #36] @ 0x24
  78698. 8020026: 601a str r2, [r3, #0]
  78699. 8020028: e009 b.n 802003e <tcp_output+0x38a>
  78700. } else {
  78701. /* add segment to tail of unacked list */
  78702. useg->next = seg;
  78703. 802002a: 6a3b ldr r3, [r7, #32]
  78704. 802002c: 6a7a ldr r2, [r7, #36] @ 0x24
  78705. 802002e: 601a str r2, [r3, #0]
  78706. useg = useg->next;
  78707. 8020030: 6a3b ldr r3, [r7, #32]
  78708. 8020032: 681b ldr r3, [r3, #0]
  78709. 8020034: 623b str r3, [r7, #32]
  78710. 8020036: e002 b.n 802003e <tcp_output+0x38a>
  78711. }
  78712. }
  78713. /* do not queue empty segments on the unacked list */
  78714. } else {
  78715. tcp_seg_free(seg);
  78716. 8020038: 6a78 ldr r0, [r7, #36] @ 0x24
  78717. 802003a: f7fb fea8 bl 801bd8e <tcp_seg_free>
  78718. }
  78719. seg = pcb->unsent;
  78720. 802003e: 687b ldr r3, [r7, #4]
  78721. 8020040: 6edb ldr r3, [r3, #108] @ 0x6c
  78722. 8020042: 627b str r3, [r7, #36] @ 0x24
  78723. while (seg != NULL &&
  78724. 8020044: 6a7b ldr r3, [r7, #36] @ 0x24
  78725. 8020046: 2b00 cmp r3, #0
  78726. 8020048: d012 beq.n 8020070 <tcp_output+0x3bc>
  78727. lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
  78728. 802004a: 6a7b ldr r3, [r7, #36] @ 0x24
  78729. 802004c: 691b ldr r3, [r3, #16]
  78730. 802004e: 685b ldr r3, [r3, #4]
  78731. 8020050: 4618 mov r0, r3
  78732. 8020052: f7f8 fd76 bl 8018b42 <lwip_htonl>
  78733. 8020056: 4602 mov r2, r0
  78734. 8020058: 687b ldr r3, [r7, #4]
  78735. 802005a: 6c5b ldr r3, [r3, #68] @ 0x44
  78736. 802005c: 1ad3 subs r3, r2, r3
  78737. 802005e: 6a7a ldr r2, [r7, #36] @ 0x24
  78738. 8020060: 8912 ldrh r2, [r2, #8]
  78739. 8020062: 4413 add r3, r2
  78740. while (seg != NULL &&
  78741. 8020064: 69ba ldr r2, [r7, #24]
  78742. 8020066: 429a cmp r2, r3
  78743. 8020068: f4bf aed6 bcs.w 801fe18 <tcp_output+0x164>
  78744. 802006c: e000 b.n 8020070 <tcp_output+0x3bc>
  78745. break;
  78746. 802006e: bf00 nop
  78747. }
  78748. #if TCP_OVERSIZE
  78749. if (pcb->unsent == NULL) {
  78750. 8020070: 687b ldr r3, [r7, #4]
  78751. 8020072: 6edb ldr r3, [r3, #108] @ 0x6c
  78752. 8020074: 2b00 cmp r3, #0
  78753. 8020076: d108 bne.n 802008a <tcp_output+0x3d6>
  78754. /* last unsent has been removed, reset unsent_oversize */
  78755. pcb->unsent_oversize = 0;
  78756. 8020078: 687b ldr r3, [r7, #4]
  78757. 802007a: 2200 movs r2, #0
  78758. 802007c: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  78759. 8020080: e004 b.n 802008c <tcp_output+0x3d8>
  78760. goto output_done;
  78761. 8020082: bf00 nop
  78762. 8020084: e002 b.n 802008c <tcp_output+0x3d8>
  78763. goto output_done;
  78764. 8020086: bf00 nop
  78765. 8020088: e000 b.n 802008c <tcp_output+0x3d8>
  78766. }
  78767. #endif /* TCP_OVERSIZE */
  78768. output_done:
  78769. 802008a: bf00 nop
  78770. tcp_clear_flags(pcb, TF_NAGLEMEMERR);
  78771. 802008c: 687b ldr r3, [r7, #4]
  78772. 802008e: 8b5b ldrh r3, [r3, #26]
  78773. 8020090: f023 0380 bic.w r3, r3, #128 @ 0x80
  78774. 8020094: b29a uxth r2, r3
  78775. 8020096: 687b ldr r3, [r7, #4]
  78776. 8020098: 835a strh r2, [r3, #26]
  78777. return ERR_OK;
  78778. 802009a: 2300 movs r3, #0
  78779. }
  78780. 802009c: 4618 mov r0, r3
  78781. 802009e: 3728 adds r7, #40 @ 0x28
  78782. 80200a0: 46bd mov sp, r7
  78783. 80200a2: bdb0 pop {r4, r5, r7, pc}
  78784. 080200a4 <tcp_output_segment_busy>:
  78785. * @arg seg the tcp segment to check
  78786. * @return 1 if ref != 1, 0 if ref == 1
  78787. */
  78788. static int
  78789. tcp_output_segment_busy(const struct tcp_seg *seg)
  78790. {
  78791. 80200a4: b580 push {r7, lr}
  78792. 80200a6: b082 sub sp, #8
  78793. 80200a8: af00 add r7, sp, #0
  78794. 80200aa: 6078 str r0, [r7, #4]
  78795. LWIP_ASSERT("tcp_output_segment_busy: invalid seg", seg != NULL);
  78796. 80200ac: 687b ldr r3, [r7, #4]
  78797. 80200ae: 2b00 cmp r3, #0
  78798. 80200b0: d106 bne.n 80200c0 <tcp_output_segment_busy+0x1c>
  78799. 80200b2: 4b09 ldr r3, [pc, #36] @ (80200d8 <tcp_output_segment_busy+0x34>)
  78800. 80200b4: f240 529a movw r2, #1434 @ 0x59a
  78801. 80200b8: 4908 ldr r1, [pc, #32] @ (80200dc <tcp_output_segment_busy+0x38>)
  78802. 80200ba: 4809 ldr r0, [pc, #36] @ (80200e0 <tcp_output_segment_busy+0x3c>)
  78803. 80200bc: f009 fc86 bl 80299cc <iprintf>
  78804. /* We only need to check the first pbuf here:
  78805. If a pbuf is queued for transmission, a driver calls pbuf_ref(),
  78806. which only changes the ref count of the first pbuf */
  78807. if (seg->p->ref != 1) {
  78808. 80200c0: 687b ldr r3, [r7, #4]
  78809. 80200c2: 685b ldr r3, [r3, #4]
  78810. 80200c4: 7b9b ldrb r3, [r3, #14]
  78811. 80200c6: 2b01 cmp r3, #1
  78812. 80200c8: d001 beq.n 80200ce <tcp_output_segment_busy+0x2a>
  78813. /* other reference found */
  78814. return 1;
  78815. 80200ca: 2301 movs r3, #1
  78816. 80200cc: e000 b.n 80200d0 <tcp_output_segment_busy+0x2c>
  78817. }
  78818. /* no other references found */
  78819. return 0;
  78820. 80200ce: 2300 movs r3, #0
  78821. }
  78822. 80200d0: 4618 mov r0, r3
  78823. 80200d2: 3708 adds r7, #8
  78824. 80200d4: 46bd mov sp, r7
  78825. 80200d6: bd80 pop {r7, pc}
  78826. 80200d8: 0802f190 .word 0x0802f190
  78827. 80200dc: 0802f788 .word 0x0802f788
  78828. 80200e0: 0802f1e4 .word 0x0802f1e4
  78829. 080200e4 <tcp_output_segment>:
  78830. * @param pcb the tcp_pcb for the TCP connection used to send the segment
  78831. * @param netif the netif used to send the segment
  78832. */
  78833. static err_t
  78834. tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif)
  78835. {
  78836. 80200e4: b5b0 push {r4, r5, r7, lr}
  78837. 80200e6: b08c sub sp, #48 @ 0x30
  78838. 80200e8: af04 add r7, sp, #16
  78839. 80200ea: 60f8 str r0, [r7, #12]
  78840. 80200ec: 60b9 str r1, [r7, #8]
  78841. 80200ee: 607a str r2, [r7, #4]
  78842. u32_t *opts;
  78843. #if TCP_CHECKSUM_ON_COPY
  78844. int seg_chksum_was_swapped = 0;
  78845. #endif
  78846. LWIP_ASSERT("tcp_output_segment: invalid seg", seg != NULL);
  78847. 80200f0: 68fb ldr r3, [r7, #12]
  78848. 80200f2: 2b00 cmp r3, #0
  78849. 80200f4: d106 bne.n 8020104 <tcp_output_segment+0x20>
  78850. 80200f6: 4b64 ldr r3, [pc, #400] @ (8020288 <tcp_output_segment+0x1a4>)
  78851. 80200f8: f44f 62b7 mov.w r2, #1464 @ 0x5b8
  78852. 80200fc: 4963 ldr r1, [pc, #396] @ (802028c <tcp_output_segment+0x1a8>)
  78853. 80200fe: 4864 ldr r0, [pc, #400] @ (8020290 <tcp_output_segment+0x1ac>)
  78854. 8020100: f009 fc64 bl 80299cc <iprintf>
  78855. LWIP_ASSERT("tcp_output_segment: invalid pcb", pcb != NULL);
  78856. 8020104: 68bb ldr r3, [r7, #8]
  78857. 8020106: 2b00 cmp r3, #0
  78858. 8020108: d106 bne.n 8020118 <tcp_output_segment+0x34>
  78859. 802010a: 4b5f ldr r3, [pc, #380] @ (8020288 <tcp_output_segment+0x1a4>)
  78860. 802010c: f240 52b9 movw r2, #1465 @ 0x5b9
  78861. 8020110: 4960 ldr r1, [pc, #384] @ (8020294 <tcp_output_segment+0x1b0>)
  78862. 8020112: 485f ldr r0, [pc, #380] @ (8020290 <tcp_output_segment+0x1ac>)
  78863. 8020114: f009 fc5a bl 80299cc <iprintf>
  78864. LWIP_ASSERT("tcp_output_segment: invalid netif", netif != NULL);
  78865. 8020118: 687b ldr r3, [r7, #4]
  78866. 802011a: 2b00 cmp r3, #0
  78867. 802011c: d106 bne.n 802012c <tcp_output_segment+0x48>
  78868. 802011e: 4b5a ldr r3, [pc, #360] @ (8020288 <tcp_output_segment+0x1a4>)
  78869. 8020120: f240 52ba movw r2, #1466 @ 0x5ba
  78870. 8020124: 495c ldr r1, [pc, #368] @ (8020298 <tcp_output_segment+0x1b4>)
  78871. 8020126: 485a ldr r0, [pc, #360] @ (8020290 <tcp_output_segment+0x1ac>)
  78872. 8020128: f009 fc50 bl 80299cc <iprintf>
  78873. if (tcp_output_segment_busy(seg)) {
  78874. 802012c: 68f8 ldr r0, [r7, #12]
  78875. 802012e: f7ff ffb9 bl 80200a4 <tcp_output_segment_busy>
  78876. 8020132: 4603 mov r3, r0
  78877. 8020134: 2b00 cmp r3, #0
  78878. 8020136: d001 beq.n 802013c <tcp_output_segment+0x58>
  78879. /* This should not happen: rexmit functions should have checked this.
  78880. However, since this function modifies p->len, we must not continue in this case. */
  78881. LWIP_DEBUGF(TCP_RTO_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_output_segment: segment busy\n"));
  78882. return ERR_OK;
  78883. 8020138: 2300 movs r3, #0
  78884. 802013a: e0a1 b.n 8020280 <tcp_output_segment+0x19c>
  78885. }
  78886. /* The TCP header has already been constructed, but the ackno and
  78887. wnd fields remain. */
  78888. seg->tcphdr->ackno = lwip_htonl(pcb->rcv_nxt);
  78889. 802013c: 68bb ldr r3, [r7, #8]
  78890. 802013e: 6a5a ldr r2, [r3, #36] @ 0x24
  78891. 8020140: 68fb ldr r3, [r7, #12]
  78892. 8020142: 691c ldr r4, [r3, #16]
  78893. 8020144: 4610 mov r0, r2
  78894. 8020146: f7f8 fcfc bl 8018b42 <lwip_htonl>
  78895. 802014a: 4603 mov r3, r0
  78896. 802014c: 60a3 str r3, [r4, #8]
  78897. the window scale option) is never scaled. */
  78898. seg->tcphdr->wnd = lwip_htons(TCPWND_MIN16(pcb->rcv_ann_wnd));
  78899. } else
  78900. #endif /* LWIP_WND_SCALE */
  78901. {
  78902. seg->tcphdr->wnd = lwip_htons(TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd)));
  78903. 802014e: 68bb ldr r3, [r7, #8]
  78904. 8020150: 8d5a ldrh r2, [r3, #42] @ 0x2a
  78905. 8020152: 68fb ldr r3, [r7, #12]
  78906. 8020154: 691c ldr r4, [r3, #16]
  78907. 8020156: 4610 mov r0, r2
  78908. 8020158: f7f8 fcde bl 8018b18 <lwip_htons>
  78909. 802015c: 4603 mov r3, r0
  78910. 802015e: 81e3 strh r3, [r4, #14]
  78911. }
  78912. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  78913. 8020160: 68bb ldr r3, [r7, #8]
  78914. 8020162: 6a5b ldr r3, [r3, #36] @ 0x24
  78915. 8020164: 68ba ldr r2, [r7, #8]
  78916. 8020166: 8d52 ldrh r2, [r2, #42] @ 0x2a
  78917. 8020168: 441a add r2, r3
  78918. 802016a: 68bb ldr r3, [r7, #8]
  78919. 802016c: 62da str r2, [r3, #44] @ 0x2c
  78920. /* Add any requested options. NB MSS option is only set on SYN
  78921. packets, so ignore it here */
  78922. /* cast through void* to get rid of alignment warnings */
  78923. opts = (u32_t *)(void *)(seg->tcphdr + 1);
  78924. 802016e: 68fb ldr r3, [r7, #12]
  78925. 8020170: 691b ldr r3, [r3, #16]
  78926. 8020172: 3314 adds r3, #20
  78927. 8020174: 61fb str r3, [r7, #28]
  78928. if (seg->flags & TF_SEG_OPTS_MSS) {
  78929. 8020176: 68fb ldr r3, [r7, #12]
  78930. 8020178: 7b1b ldrb r3, [r3, #12]
  78931. 802017a: f003 0301 and.w r3, r3, #1
  78932. 802017e: 2b00 cmp r3, #0
  78933. 8020180: d015 beq.n 80201ae <tcp_output_segment+0xca>
  78934. u16_t mss;
  78935. #if TCP_CALCULATE_EFF_SEND_MSS
  78936. mss = tcp_eff_send_mss_netif(TCP_MSS, netif, &pcb->remote_ip);
  78937. 8020182: 68bb ldr r3, [r7, #8]
  78938. 8020184: 3304 adds r3, #4
  78939. 8020186: 461a mov r2, r3
  78940. 8020188: 6879 ldr r1, [r7, #4]
  78941. 802018a: f240 50b4 movw r0, #1460 @ 0x5b4
  78942. 802018e: f7fc f9cd bl 801c52c <tcp_eff_send_mss_netif>
  78943. 8020192: 4603 mov r3, r0
  78944. 8020194: 837b strh r3, [r7, #26]
  78945. #else /* TCP_CALCULATE_EFF_SEND_MSS */
  78946. mss = TCP_MSS;
  78947. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  78948. *opts = TCP_BUILD_MSS_OPTION(mss);
  78949. 8020196: 8b7b ldrh r3, [r7, #26]
  78950. 8020198: f043 7301 orr.w r3, r3, #33816576 @ 0x2040000
  78951. 802019c: 4618 mov r0, r3
  78952. 802019e: f7f8 fcd0 bl 8018b42 <lwip_htonl>
  78953. 80201a2: 4602 mov r2, r0
  78954. 80201a4: 69fb ldr r3, [r7, #28]
  78955. 80201a6: 601a str r2, [r3, #0]
  78956. opts += 1;
  78957. 80201a8: 69fb ldr r3, [r7, #28]
  78958. 80201aa: 3304 adds r3, #4
  78959. 80201ac: 61fb str r3, [r7, #28]
  78960. }
  78961. #endif
  78962. /* Set retransmission timer running if it is not currently enabled
  78963. This must be set before checking the route. */
  78964. if (pcb->rtime < 0) {
  78965. 80201ae: 68bb ldr r3, [r7, #8]
  78966. 80201b0: f9b3 3030 ldrsh.w r3, [r3, #48] @ 0x30
  78967. 80201b4: 2b00 cmp r3, #0
  78968. 80201b6: da02 bge.n 80201be <tcp_output_segment+0xda>
  78969. pcb->rtime = 0;
  78970. 80201b8: 68bb ldr r3, [r7, #8]
  78971. 80201ba: 2200 movs r2, #0
  78972. 80201bc: 861a strh r2, [r3, #48] @ 0x30
  78973. }
  78974. if (pcb->rttest == 0) {
  78975. 80201be: 68bb ldr r3, [r7, #8]
  78976. 80201c0: 6b5b ldr r3, [r3, #52] @ 0x34
  78977. 80201c2: 2b00 cmp r3, #0
  78978. 80201c4: d10c bne.n 80201e0 <tcp_output_segment+0xfc>
  78979. pcb->rttest = tcp_ticks;
  78980. 80201c6: 4b35 ldr r3, [pc, #212] @ (802029c <tcp_output_segment+0x1b8>)
  78981. 80201c8: 681a ldr r2, [r3, #0]
  78982. 80201ca: 68bb ldr r3, [r7, #8]
  78983. 80201cc: 635a str r2, [r3, #52] @ 0x34
  78984. pcb->rtseq = lwip_ntohl(seg->tcphdr->seqno);
  78985. 80201ce: 68fb ldr r3, [r7, #12]
  78986. 80201d0: 691b ldr r3, [r3, #16]
  78987. 80201d2: 685b ldr r3, [r3, #4]
  78988. 80201d4: 4618 mov r0, r3
  78989. 80201d6: f7f8 fcb4 bl 8018b42 <lwip_htonl>
  78990. 80201da: 4602 mov r2, r0
  78991. 80201dc: 68bb ldr r3, [r7, #8]
  78992. 80201de: 639a str r2, [r3, #56] @ 0x38
  78993. }
  78994. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n",
  78995. lwip_htonl(seg->tcphdr->seqno), lwip_htonl(seg->tcphdr->seqno) +
  78996. seg->len));
  78997. len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
  78998. 80201e0: 68fb ldr r3, [r7, #12]
  78999. 80201e2: 691a ldr r2, [r3, #16]
  79000. 80201e4: 68fb ldr r3, [r7, #12]
  79001. 80201e6: 685b ldr r3, [r3, #4]
  79002. 80201e8: 685b ldr r3, [r3, #4]
  79003. 80201ea: 1ad3 subs r3, r2, r3
  79004. 80201ec: 833b strh r3, [r7, #24]
  79005. if (len == 0) {
  79006. /** Exclude retransmitted segments from this count. */
  79007. MIB2_STATS_INC(mib2.tcpoutsegs);
  79008. }
  79009. seg->p->len -= len;
  79010. 80201ee: 68fb ldr r3, [r7, #12]
  79011. 80201f0: 685b ldr r3, [r3, #4]
  79012. 80201f2: 8959 ldrh r1, [r3, #10]
  79013. 80201f4: 68fb ldr r3, [r7, #12]
  79014. 80201f6: 685b ldr r3, [r3, #4]
  79015. 80201f8: 8b3a ldrh r2, [r7, #24]
  79016. 80201fa: 1a8a subs r2, r1, r2
  79017. 80201fc: b292 uxth r2, r2
  79018. 80201fe: 815a strh r2, [r3, #10]
  79019. seg->p->tot_len -= len;
  79020. 8020200: 68fb ldr r3, [r7, #12]
  79021. 8020202: 685b ldr r3, [r3, #4]
  79022. 8020204: 8919 ldrh r1, [r3, #8]
  79023. 8020206: 68fb ldr r3, [r7, #12]
  79024. 8020208: 685b ldr r3, [r3, #4]
  79025. 802020a: 8b3a ldrh r2, [r7, #24]
  79026. 802020c: 1a8a subs r2, r1, r2
  79027. 802020e: b292 uxth r2, r2
  79028. 8020210: 811a strh r2, [r3, #8]
  79029. seg->p->payload = seg->tcphdr;
  79030. 8020212: 68fb ldr r3, [r7, #12]
  79031. 8020214: 685b ldr r3, [r3, #4]
  79032. 8020216: 68fa ldr r2, [r7, #12]
  79033. 8020218: 6912 ldr r2, [r2, #16]
  79034. 802021a: 605a str r2, [r3, #4]
  79035. seg->tcphdr->chksum = 0;
  79036. 802021c: 68fb ldr r3, [r7, #12]
  79037. 802021e: 691b ldr r3, [r3, #16]
  79038. 8020220: 2200 movs r2, #0
  79039. 8020222: 741a strb r2, [r3, #16]
  79040. 8020224: 2200 movs r2, #0
  79041. 8020226: 745a strb r2, [r3, #17]
  79042. #ifdef LWIP_HOOK_TCP_OUT_ADD_TCPOPTS
  79043. opts = LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(seg->p, seg->tcphdr, pcb, opts);
  79044. #endif
  79045. LWIP_ASSERT("options not filled", (u8_t *)opts == ((u8_t *)(seg->tcphdr + 1)) + LWIP_TCP_OPT_LENGTH_SEGMENT(seg->flags, pcb));
  79046. 8020228: 68fb ldr r3, [r7, #12]
  79047. 802022a: 691a ldr r2, [r3, #16]
  79048. 802022c: 68fb ldr r3, [r7, #12]
  79049. 802022e: 7b1b ldrb r3, [r3, #12]
  79050. 8020230: f003 0301 and.w r3, r3, #1
  79051. 8020234: 2b00 cmp r3, #0
  79052. 8020236: d001 beq.n 802023c <tcp_output_segment+0x158>
  79053. 8020238: 2318 movs r3, #24
  79054. 802023a: e000 b.n 802023e <tcp_output_segment+0x15a>
  79055. 802023c: 2314 movs r3, #20
  79056. 802023e: 4413 add r3, r2
  79057. 8020240: 69fa ldr r2, [r7, #28]
  79058. 8020242: 429a cmp r2, r3
  79059. 8020244: d006 beq.n 8020254 <tcp_output_segment+0x170>
  79060. 8020246: 4b10 ldr r3, [pc, #64] @ (8020288 <tcp_output_segment+0x1a4>)
  79061. 8020248: f240 621c movw r2, #1564 @ 0x61c
  79062. 802024c: 4914 ldr r1, [pc, #80] @ (80202a0 <tcp_output_segment+0x1bc>)
  79063. 802024e: 4810 ldr r0, [pc, #64] @ (8020290 <tcp_output_segment+0x1ac>)
  79064. 8020250: f009 fbbc bl 80299cc <iprintf>
  79065. }
  79066. #endif /* CHECKSUM_GEN_TCP */
  79067. TCP_STATS_INC(tcp.xmit);
  79068. NETIF_SET_HINTS(netif, &(pcb->netif_hints));
  79069. err = ip_output_if(seg->p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl,
  79070. 8020254: 68fb ldr r3, [r7, #12]
  79071. 8020256: 6858 ldr r0, [r3, #4]
  79072. 8020258: 68b9 ldr r1, [r7, #8]
  79073. 802025a: 68bb ldr r3, [r7, #8]
  79074. 802025c: 1d1c adds r4, r3, #4
  79075. 802025e: 68bb ldr r3, [r7, #8]
  79076. 8020260: 7add ldrb r5, [r3, #11]
  79077. 8020262: 68bb ldr r3, [r7, #8]
  79078. 8020264: 7a9b ldrb r3, [r3, #10]
  79079. 8020266: 687a ldr r2, [r7, #4]
  79080. 8020268: 9202 str r2, [sp, #8]
  79081. 802026a: 2206 movs r2, #6
  79082. 802026c: 9201 str r2, [sp, #4]
  79083. 802026e: 9300 str r3, [sp, #0]
  79084. 8020270: 462b mov r3, r5
  79085. 8020272: 4622 mov r2, r4
  79086. 8020274: f004 fd7a bl 8024d6c <ip4_output_if>
  79087. 8020278: 4603 mov r3, r0
  79088. 802027a: 75fb strb r3, [r7, #23]
  79089. seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum);
  79090. seg->chksum_swapped = 1;
  79091. }
  79092. #endif
  79093. return err;
  79094. 802027c: f997 3017 ldrsb.w r3, [r7, #23]
  79095. }
  79096. 8020280: 4618 mov r0, r3
  79097. 8020282: 3720 adds r7, #32
  79098. 8020284: 46bd mov sp, r7
  79099. 8020286: bdb0 pop {r4, r5, r7, pc}
  79100. 8020288: 0802f190 .word 0x0802f190
  79101. 802028c: 0802f7b0 .word 0x0802f7b0
  79102. 8020290: 0802f1e4 .word 0x0802f1e4
  79103. 8020294: 0802f7d0 .word 0x0802f7d0
  79104. 8020298: 0802f7f0 .word 0x0802f7f0
  79105. 802029c: 2402ae88 .word 0x2402ae88
  79106. 80202a0: 0802f814 .word 0x0802f814
  79107. 080202a4 <tcp_rexmit_rto_prepare>:
  79108. *
  79109. * @param pcb the tcp_pcb for which to re-enqueue all unacked segments
  79110. */
  79111. err_t
  79112. tcp_rexmit_rto_prepare(struct tcp_pcb *pcb)
  79113. {
  79114. 80202a4: b5b0 push {r4, r5, r7, lr}
  79115. 80202a6: b084 sub sp, #16
  79116. 80202a8: af00 add r7, sp, #0
  79117. 80202aa: 6078 str r0, [r7, #4]
  79118. struct tcp_seg *seg;
  79119. LWIP_ASSERT("tcp_rexmit_rto_prepare: invalid pcb", pcb != NULL);
  79120. 80202ac: 687b ldr r3, [r7, #4]
  79121. 80202ae: 2b00 cmp r3, #0
  79122. 80202b0: d106 bne.n 80202c0 <tcp_rexmit_rto_prepare+0x1c>
  79123. 80202b2: 4b36 ldr r3, [pc, #216] @ (802038c <tcp_rexmit_rto_prepare+0xe8>)
  79124. 80202b4: f240 6263 movw r2, #1635 @ 0x663
  79125. 80202b8: 4935 ldr r1, [pc, #212] @ (8020390 <tcp_rexmit_rto_prepare+0xec>)
  79126. 80202ba: 4836 ldr r0, [pc, #216] @ (8020394 <tcp_rexmit_rto_prepare+0xf0>)
  79127. 80202bc: f009 fb86 bl 80299cc <iprintf>
  79128. if (pcb->unacked == NULL) {
  79129. 80202c0: 687b ldr r3, [r7, #4]
  79130. 80202c2: 6f1b ldr r3, [r3, #112] @ 0x70
  79131. 80202c4: 2b00 cmp r3, #0
  79132. 80202c6: d102 bne.n 80202ce <tcp_rexmit_rto_prepare+0x2a>
  79133. return ERR_VAL;
  79134. 80202c8: f06f 0305 mvn.w r3, #5
  79135. 80202cc: e059 b.n 8020382 <tcp_rexmit_rto_prepare+0xde>
  79136. /* Move all unacked segments to the head of the unsent queue.
  79137. However, give up if any of the unsent pbufs are still referenced by the
  79138. netif driver due to deferred transmission. No point loading the link further
  79139. if it is struggling to flush its buffered writes. */
  79140. for (seg = pcb->unacked; seg->next != NULL; seg = seg->next) {
  79141. 80202ce: 687b ldr r3, [r7, #4]
  79142. 80202d0: 6f1b ldr r3, [r3, #112] @ 0x70
  79143. 80202d2: 60fb str r3, [r7, #12]
  79144. 80202d4: e00b b.n 80202ee <tcp_rexmit_rto_prepare+0x4a>
  79145. if (tcp_output_segment_busy(seg)) {
  79146. 80202d6: 68f8 ldr r0, [r7, #12]
  79147. 80202d8: f7ff fee4 bl 80200a4 <tcp_output_segment_busy>
  79148. 80202dc: 4603 mov r3, r0
  79149. 80202de: 2b00 cmp r3, #0
  79150. 80202e0: d002 beq.n 80202e8 <tcp_rexmit_rto_prepare+0x44>
  79151. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit_rto: segment busy\n"));
  79152. return ERR_VAL;
  79153. 80202e2: f06f 0305 mvn.w r3, #5
  79154. 80202e6: e04c b.n 8020382 <tcp_rexmit_rto_prepare+0xde>
  79155. for (seg = pcb->unacked; seg->next != NULL; seg = seg->next) {
  79156. 80202e8: 68fb ldr r3, [r7, #12]
  79157. 80202ea: 681b ldr r3, [r3, #0]
  79158. 80202ec: 60fb str r3, [r7, #12]
  79159. 80202ee: 68fb ldr r3, [r7, #12]
  79160. 80202f0: 681b ldr r3, [r3, #0]
  79161. 80202f2: 2b00 cmp r3, #0
  79162. 80202f4: d1ef bne.n 80202d6 <tcp_rexmit_rto_prepare+0x32>
  79163. }
  79164. }
  79165. if (tcp_output_segment_busy(seg)) {
  79166. 80202f6: 68f8 ldr r0, [r7, #12]
  79167. 80202f8: f7ff fed4 bl 80200a4 <tcp_output_segment_busy>
  79168. 80202fc: 4603 mov r3, r0
  79169. 80202fe: 2b00 cmp r3, #0
  79170. 8020300: d002 beq.n 8020308 <tcp_rexmit_rto_prepare+0x64>
  79171. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit_rto: segment busy\n"));
  79172. return ERR_VAL;
  79173. 8020302: f06f 0305 mvn.w r3, #5
  79174. 8020306: e03c b.n 8020382 <tcp_rexmit_rto_prepare+0xde>
  79175. }
  79176. /* concatenate unsent queue after unacked queue */
  79177. seg->next = pcb->unsent;
  79178. 8020308: 687b ldr r3, [r7, #4]
  79179. 802030a: 6eda ldr r2, [r3, #108] @ 0x6c
  79180. 802030c: 68fb ldr r3, [r7, #12]
  79181. 802030e: 601a str r2, [r3, #0]
  79182. #if TCP_OVERSIZE_DBGCHECK
  79183. /* if last unsent changed, we need to update unsent_oversize */
  79184. if (pcb->unsent == NULL) {
  79185. 8020310: 687b ldr r3, [r7, #4]
  79186. 8020312: 6edb ldr r3, [r3, #108] @ 0x6c
  79187. 8020314: 2b00 cmp r3, #0
  79188. 8020316: d104 bne.n 8020322 <tcp_rexmit_rto_prepare+0x7e>
  79189. pcb->unsent_oversize = seg->oversize_left;
  79190. 8020318: 68fb ldr r3, [r7, #12]
  79191. 802031a: 895a ldrh r2, [r3, #10]
  79192. 802031c: 687b ldr r3, [r7, #4]
  79193. 802031e: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  79194. }
  79195. #endif /* TCP_OVERSIZE_DBGCHECK */
  79196. /* unsent queue is the concatenated queue (of unacked, unsent) */
  79197. pcb->unsent = pcb->unacked;
  79198. 8020322: 687b ldr r3, [r7, #4]
  79199. 8020324: 6f1a ldr r2, [r3, #112] @ 0x70
  79200. 8020326: 687b ldr r3, [r7, #4]
  79201. 8020328: 66da str r2, [r3, #108] @ 0x6c
  79202. /* unacked queue is now empty */
  79203. pcb->unacked = NULL;
  79204. 802032a: 687b ldr r3, [r7, #4]
  79205. 802032c: 2200 movs r2, #0
  79206. 802032e: 671a str r2, [r3, #112] @ 0x70
  79207. /* Mark RTO in-progress */
  79208. tcp_set_flags(pcb, TF_RTO);
  79209. 8020330: 687b ldr r3, [r7, #4]
  79210. 8020332: 8b5b ldrh r3, [r3, #26]
  79211. 8020334: f443 6300 orr.w r3, r3, #2048 @ 0x800
  79212. 8020338: b29a uxth r2, r3
  79213. 802033a: 687b ldr r3, [r7, #4]
  79214. 802033c: 835a strh r2, [r3, #26]
  79215. /* Record the next byte following retransmit */
  79216. pcb->rto_end = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
  79217. 802033e: 68fb ldr r3, [r7, #12]
  79218. 8020340: 691b ldr r3, [r3, #16]
  79219. 8020342: 685b ldr r3, [r3, #4]
  79220. 8020344: 4618 mov r0, r3
  79221. 8020346: f7f8 fbfc bl 8018b42 <lwip_htonl>
  79222. 802034a: 4604 mov r4, r0
  79223. 802034c: 68fb ldr r3, [r7, #12]
  79224. 802034e: 891b ldrh r3, [r3, #8]
  79225. 8020350: 461d mov r5, r3
  79226. 8020352: 68fb ldr r3, [r7, #12]
  79227. 8020354: 691b ldr r3, [r3, #16]
  79228. 8020356: 899b ldrh r3, [r3, #12]
  79229. 8020358: b29b uxth r3, r3
  79230. 802035a: 4618 mov r0, r3
  79231. 802035c: f7f8 fbdc bl 8018b18 <lwip_htons>
  79232. 8020360: 4603 mov r3, r0
  79233. 8020362: b2db uxtb r3, r3
  79234. 8020364: f003 0303 and.w r3, r3, #3
  79235. 8020368: 2b00 cmp r3, #0
  79236. 802036a: d001 beq.n 8020370 <tcp_rexmit_rto_prepare+0xcc>
  79237. 802036c: 2301 movs r3, #1
  79238. 802036e: e000 b.n 8020372 <tcp_rexmit_rto_prepare+0xce>
  79239. 8020370: 2300 movs r3, #0
  79240. 8020372: 442b add r3, r5
  79241. 8020374: 18e2 adds r2, r4, r3
  79242. 8020376: 687b ldr r3, [r7, #4]
  79243. 8020378: 64da str r2, [r3, #76] @ 0x4c
  79244. /* Don't take any RTT measurements after retransmitting. */
  79245. pcb->rttest = 0;
  79246. 802037a: 687b ldr r3, [r7, #4]
  79247. 802037c: 2200 movs r2, #0
  79248. 802037e: 635a str r2, [r3, #52] @ 0x34
  79249. return ERR_OK;
  79250. 8020380: 2300 movs r3, #0
  79251. }
  79252. 8020382: 4618 mov r0, r3
  79253. 8020384: 3710 adds r7, #16
  79254. 8020386: 46bd mov sp, r7
  79255. 8020388: bdb0 pop {r4, r5, r7, pc}
  79256. 802038a: bf00 nop
  79257. 802038c: 0802f190 .word 0x0802f190
  79258. 8020390: 0802f828 .word 0x0802f828
  79259. 8020394: 0802f1e4 .word 0x0802f1e4
  79260. 08020398 <tcp_rexmit_rto_commit>:
  79261. *
  79262. * @param pcb the tcp_pcb for which to re-enqueue all unacked segments
  79263. */
  79264. void
  79265. tcp_rexmit_rto_commit(struct tcp_pcb *pcb)
  79266. {
  79267. 8020398: b580 push {r7, lr}
  79268. 802039a: b082 sub sp, #8
  79269. 802039c: af00 add r7, sp, #0
  79270. 802039e: 6078 str r0, [r7, #4]
  79271. LWIP_ASSERT("tcp_rexmit_rto_commit: invalid pcb", pcb != NULL);
  79272. 80203a0: 687b ldr r3, [r7, #4]
  79273. 80203a2: 2b00 cmp r3, #0
  79274. 80203a4: d106 bne.n 80203b4 <tcp_rexmit_rto_commit+0x1c>
  79275. 80203a6: 4b0d ldr r3, [pc, #52] @ (80203dc <tcp_rexmit_rto_commit+0x44>)
  79276. 80203a8: f44f 62d3 mov.w r2, #1688 @ 0x698
  79277. 80203ac: 490c ldr r1, [pc, #48] @ (80203e0 <tcp_rexmit_rto_commit+0x48>)
  79278. 80203ae: 480d ldr r0, [pc, #52] @ (80203e4 <tcp_rexmit_rto_commit+0x4c>)
  79279. 80203b0: f009 fb0c bl 80299cc <iprintf>
  79280. /* increment number of retransmissions */
  79281. if (pcb->nrtx < 0xFF) {
  79282. 80203b4: 687b ldr r3, [r7, #4]
  79283. 80203b6: f893 3042 ldrb.w r3, [r3, #66] @ 0x42
  79284. 80203ba: 2bff cmp r3, #255 @ 0xff
  79285. 80203bc: d007 beq.n 80203ce <tcp_rexmit_rto_commit+0x36>
  79286. ++pcb->nrtx;
  79287. 80203be: 687b ldr r3, [r7, #4]
  79288. 80203c0: f893 3042 ldrb.w r3, [r3, #66] @ 0x42
  79289. 80203c4: 3301 adds r3, #1
  79290. 80203c6: b2da uxtb r2, r3
  79291. 80203c8: 687b ldr r3, [r7, #4]
  79292. 80203ca: f883 2042 strb.w r2, [r3, #66] @ 0x42
  79293. }
  79294. /* Do the actual retransmission */
  79295. tcp_output(pcb);
  79296. 80203ce: 6878 ldr r0, [r7, #4]
  79297. 80203d0: f7ff fc70 bl 801fcb4 <tcp_output>
  79298. }
  79299. 80203d4: bf00 nop
  79300. 80203d6: 3708 adds r7, #8
  79301. 80203d8: 46bd mov sp, r7
  79302. 80203da: bd80 pop {r7, pc}
  79303. 80203dc: 0802f190 .word 0x0802f190
  79304. 80203e0: 0802f84c .word 0x0802f84c
  79305. 80203e4: 0802f1e4 .word 0x0802f1e4
  79306. 080203e8 <tcp_rexmit_rto>:
  79307. *
  79308. * @param pcb the tcp_pcb for which to re-enqueue all unacked segments
  79309. */
  79310. void
  79311. tcp_rexmit_rto(struct tcp_pcb *pcb)
  79312. {
  79313. 80203e8: b580 push {r7, lr}
  79314. 80203ea: b082 sub sp, #8
  79315. 80203ec: af00 add r7, sp, #0
  79316. 80203ee: 6078 str r0, [r7, #4]
  79317. LWIP_ASSERT("tcp_rexmit_rto: invalid pcb", pcb != NULL);
  79318. 80203f0: 687b ldr r3, [r7, #4]
  79319. 80203f2: 2b00 cmp r3, #0
  79320. 80203f4: d106 bne.n 8020404 <tcp_rexmit_rto+0x1c>
  79321. 80203f6: 4b0a ldr r3, [pc, #40] @ (8020420 <tcp_rexmit_rto+0x38>)
  79322. 80203f8: f240 62ad movw r2, #1709 @ 0x6ad
  79323. 80203fc: 4909 ldr r1, [pc, #36] @ (8020424 <tcp_rexmit_rto+0x3c>)
  79324. 80203fe: 480a ldr r0, [pc, #40] @ (8020428 <tcp_rexmit_rto+0x40>)
  79325. 8020400: f009 fae4 bl 80299cc <iprintf>
  79326. if (tcp_rexmit_rto_prepare(pcb) == ERR_OK) {
  79327. 8020404: 6878 ldr r0, [r7, #4]
  79328. 8020406: f7ff ff4d bl 80202a4 <tcp_rexmit_rto_prepare>
  79329. 802040a: 4603 mov r3, r0
  79330. 802040c: 2b00 cmp r3, #0
  79331. 802040e: d102 bne.n 8020416 <tcp_rexmit_rto+0x2e>
  79332. tcp_rexmit_rto_commit(pcb);
  79333. 8020410: 6878 ldr r0, [r7, #4]
  79334. 8020412: f7ff ffc1 bl 8020398 <tcp_rexmit_rto_commit>
  79335. }
  79336. }
  79337. 8020416: bf00 nop
  79338. 8020418: 3708 adds r7, #8
  79339. 802041a: 46bd mov sp, r7
  79340. 802041c: bd80 pop {r7, pc}
  79341. 802041e: bf00 nop
  79342. 8020420: 0802f190 .word 0x0802f190
  79343. 8020424: 0802f870 .word 0x0802f870
  79344. 8020428: 0802f1e4 .word 0x0802f1e4
  79345. 0802042c <tcp_rexmit>:
  79346. *
  79347. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  79348. */
  79349. err_t
  79350. tcp_rexmit(struct tcp_pcb *pcb)
  79351. {
  79352. 802042c: b590 push {r4, r7, lr}
  79353. 802042e: b085 sub sp, #20
  79354. 8020430: af00 add r7, sp, #0
  79355. 8020432: 6078 str r0, [r7, #4]
  79356. struct tcp_seg *seg;
  79357. struct tcp_seg **cur_seg;
  79358. LWIP_ASSERT("tcp_rexmit: invalid pcb", pcb != NULL);
  79359. 8020434: 687b ldr r3, [r7, #4]
  79360. 8020436: 2b00 cmp r3, #0
  79361. 8020438: d106 bne.n 8020448 <tcp_rexmit+0x1c>
  79362. 802043a: 4b2f ldr r3, [pc, #188] @ (80204f8 <tcp_rexmit+0xcc>)
  79363. 802043c: f240 62c1 movw r2, #1729 @ 0x6c1
  79364. 8020440: 492e ldr r1, [pc, #184] @ (80204fc <tcp_rexmit+0xd0>)
  79365. 8020442: 482f ldr r0, [pc, #188] @ (8020500 <tcp_rexmit+0xd4>)
  79366. 8020444: f009 fac2 bl 80299cc <iprintf>
  79367. if (pcb->unacked == NULL) {
  79368. 8020448: 687b ldr r3, [r7, #4]
  79369. 802044a: 6f1b ldr r3, [r3, #112] @ 0x70
  79370. 802044c: 2b00 cmp r3, #0
  79371. 802044e: d102 bne.n 8020456 <tcp_rexmit+0x2a>
  79372. return ERR_VAL;
  79373. 8020450: f06f 0305 mvn.w r3, #5
  79374. 8020454: e04c b.n 80204f0 <tcp_rexmit+0xc4>
  79375. }
  79376. seg = pcb->unacked;
  79377. 8020456: 687b ldr r3, [r7, #4]
  79378. 8020458: 6f1b ldr r3, [r3, #112] @ 0x70
  79379. 802045a: 60bb str r3, [r7, #8]
  79380. /* Give up if the segment is still referenced by the netif driver
  79381. due to deferred transmission. */
  79382. if (tcp_output_segment_busy(seg)) {
  79383. 802045c: 68b8 ldr r0, [r7, #8]
  79384. 802045e: f7ff fe21 bl 80200a4 <tcp_output_segment_busy>
  79385. 8020462: 4603 mov r3, r0
  79386. 8020464: 2b00 cmp r3, #0
  79387. 8020466: d002 beq.n 802046e <tcp_rexmit+0x42>
  79388. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit busy\n"));
  79389. return ERR_VAL;
  79390. 8020468: f06f 0305 mvn.w r3, #5
  79391. 802046c: e040 b.n 80204f0 <tcp_rexmit+0xc4>
  79392. }
  79393. /* Move the first unacked segment to the unsent queue */
  79394. /* Keep the unsent queue sorted. */
  79395. pcb->unacked = seg->next;
  79396. 802046e: 68bb ldr r3, [r7, #8]
  79397. 8020470: 681a ldr r2, [r3, #0]
  79398. 8020472: 687b ldr r3, [r7, #4]
  79399. 8020474: 671a str r2, [r3, #112] @ 0x70
  79400. cur_seg = &(pcb->unsent);
  79401. 8020476: 687b ldr r3, [r7, #4]
  79402. 8020478: 336c adds r3, #108 @ 0x6c
  79403. 802047a: 60fb str r3, [r7, #12]
  79404. while (*cur_seg &&
  79405. 802047c: e002 b.n 8020484 <tcp_rexmit+0x58>
  79406. TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
  79407. cur_seg = &((*cur_seg)->next );
  79408. 802047e: 68fb ldr r3, [r7, #12]
  79409. 8020480: 681b ldr r3, [r3, #0]
  79410. 8020482: 60fb str r3, [r7, #12]
  79411. while (*cur_seg &&
  79412. 8020484: 68fb ldr r3, [r7, #12]
  79413. 8020486: 681b ldr r3, [r3, #0]
  79414. 8020488: 2b00 cmp r3, #0
  79415. 802048a: d011 beq.n 80204b0 <tcp_rexmit+0x84>
  79416. TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
  79417. 802048c: 68fb ldr r3, [r7, #12]
  79418. 802048e: 681b ldr r3, [r3, #0]
  79419. 8020490: 691b ldr r3, [r3, #16]
  79420. 8020492: 685b ldr r3, [r3, #4]
  79421. 8020494: 4618 mov r0, r3
  79422. 8020496: f7f8 fb54 bl 8018b42 <lwip_htonl>
  79423. 802049a: 4604 mov r4, r0
  79424. 802049c: 68bb ldr r3, [r7, #8]
  79425. 802049e: 691b ldr r3, [r3, #16]
  79426. 80204a0: 685b ldr r3, [r3, #4]
  79427. 80204a2: 4618 mov r0, r3
  79428. 80204a4: f7f8 fb4d bl 8018b42 <lwip_htonl>
  79429. 80204a8: 4603 mov r3, r0
  79430. 80204aa: 1ae3 subs r3, r4, r3
  79431. while (*cur_seg &&
  79432. 80204ac: 2b00 cmp r3, #0
  79433. 80204ae: dbe6 blt.n 802047e <tcp_rexmit+0x52>
  79434. }
  79435. seg->next = *cur_seg;
  79436. 80204b0: 68fb ldr r3, [r7, #12]
  79437. 80204b2: 681a ldr r2, [r3, #0]
  79438. 80204b4: 68bb ldr r3, [r7, #8]
  79439. 80204b6: 601a str r2, [r3, #0]
  79440. *cur_seg = seg;
  79441. 80204b8: 68fb ldr r3, [r7, #12]
  79442. 80204ba: 68ba ldr r2, [r7, #8]
  79443. 80204bc: 601a str r2, [r3, #0]
  79444. #if TCP_OVERSIZE
  79445. if (seg->next == NULL) {
  79446. 80204be: 68bb ldr r3, [r7, #8]
  79447. 80204c0: 681b ldr r3, [r3, #0]
  79448. 80204c2: 2b00 cmp r3, #0
  79449. 80204c4: d103 bne.n 80204ce <tcp_rexmit+0xa2>
  79450. /* the retransmitted segment is last in unsent, so reset unsent_oversize */
  79451. pcb->unsent_oversize = 0;
  79452. 80204c6: 687b ldr r3, [r7, #4]
  79453. 80204c8: 2200 movs r2, #0
  79454. 80204ca: f8a3 2068 strh.w r2, [r3, #104] @ 0x68
  79455. }
  79456. #endif /* TCP_OVERSIZE */
  79457. if (pcb->nrtx < 0xFF) {
  79458. 80204ce: 687b ldr r3, [r7, #4]
  79459. 80204d0: f893 3042 ldrb.w r3, [r3, #66] @ 0x42
  79460. 80204d4: 2bff cmp r3, #255 @ 0xff
  79461. 80204d6: d007 beq.n 80204e8 <tcp_rexmit+0xbc>
  79462. ++pcb->nrtx;
  79463. 80204d8: 687b ldr r3, [r7, #4]
  79464. 80204da: f893 3042 ldrb.w r3, [r3, #66] @ 0x42
  79465. 80204de: 3301 adds r3, #1
  79466. 80204e0: b2da uxtb r2, r3
  79467. 80204e2: 687b ldr r3, [r7, #4]
  79468. 80204e4: f883 2042 strb.w r2, [r3, #66] @ 0x42
  79469. }
  79470. /* Don't take any rtt measurements after retransmitting. */
  79471. pcb->rttest = 0;
  79472. 80204e8: 687b ldr r3, [r7, #4]
  79473. 80204ea: 2200 movs r2, #0
  79474. 80204ec: 635a str r2, [r3, #52] @ 0x34
  79475. /* Do the actual retransmission. */
  79476. MIB2_STATS_INC(mib2.tcpretranssegs);
  79477. /* No need to call tcp_output: we are always called from tcp_input()
  79478. and thus tcp_output directly returns. */
  79479. return ERR_OK;
  79480. 80204ee: 2300 movs r3, #0
  79481. }
  79482. 80204f0: 4618 mov r0, r3
  79483. 80204f2: 3714 adds r7, #20
  79484. 80204f4: 46bd mov sp, r7
  79485. 80204f6: bd90 pop {r4, r7, pc}
  79486. 80204f8: 0802f190 .word 0x0802f190
  79487. 80204fc: 0802f88c .word 0x0802f88c
  79488. 8020500: 0802f1e4 .word 0x0802f1e4
  79489. 08020504 <tcp_rexmit_fast>:
  79490. *
  79491. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  79492. */
  79493. void
  79494. tcp_rexmit_fast(struct tcp_pcb *pcb)
  79495. {
  79496. 8020504: b580 push {r7, lr}
  79497. 8020506: b082 sub sp, #8
  79498. 8020508: af00 add r7, sp, #0
  79499. 802050a: 6078 str r0, [r7, #4]
  79500. LWIP_ASSERT("tcp_rexmit_fast: invalid pcb", pcb != NULL);
  79501. 802050c: 687b ldr r3, [r7, #4]
  79502. 802050e: 2b00 cmp r3, #0
  79503. 8020510: d106 bne.n 8020520 <tcp_rexmit_fast+0x1c>
  79504. 8020512: 4b2a ldr r3, [pc, #168] @ (80205bc <tcp_rexmit_fast+0xb8>)
  79505. 8020514: f240 62f9 movw r2, #1785 @ 0x6f9
  79506. 8020518: 4929 ldr r1, [pc, #164] @ (80205c0 <tcp_rexmit_fast+0xbc>)
  79507. 802051a: 482a ldr r0, [pc, #168] @ (80205c4 <tcp_rexmit_fast+0xc0>)
  79508. 802051c: f009 fa56 bl 80299cc <iprintf>
  79509. if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {
  79510. 8020520: 687b ldr r3, [r7, #4]
  79511. 8020522: 6f1b ldr r3, [r3, #112] @ 0x70
  79512. 8020524: 2b00 cmp r3, #0
  79513. 8020526: d045 beq.n 80205b4 <tcp_rexmit_fast+0xb0>
  79514. 8020528: 687b ldr r3, [r7, #4]
  79515. 802052a: 8b5b ldrh r3, [r3, #26]
  79516. 802052c: f003 0304 and.w r3, r3, #4
  79517. 8020530: 2b00 cmp r3, #0
  79518. 8020532: d13f bne.n 80205b4 <tcp_rexmit_fast+0xb0>
  79519. LWIP_DEBUGF(TCP_FR_DEBUG,
  79520. ("tcp_receive: dupacks %"U16_F" (%"U32_F
  79521. "), fast retransmit %"U32_F"\n",
  79522. (u16_t)pcb->dupacks, pcb->lastack,
  79523. lwip_ntohl(pcb->unacked->tcphdr->seqno)));
  79524. if (tcp_rexmit(pcb) == ERR_OK) {
  79525. 8020534: 6878 ldr r0, [r7, #4]
  79526. 8020536: f7ff ff79 bl 802042c <tcp_rexmit>
  79527. 802053a: 4603 mov r3, r0
  79528. 802053c: 2b00 cmp r3, #0
  79529. 802053e: d139 bne.n 80205b4 <tcp_rexmit_fast+0xb0>
  79530. /* Set ssthresh to half of the minimum of the current
  79531. * cwnd and the advertised window */
  79532. pcb->ssthresh = LWIP_MIN(pcb->cwnd, pcb->snd_wnd) / 2;
  79533. 8020540: 687b ldr r3, [r7, #4]
  79534. 8020542: f8b3 2060 ldrh.w r2, [r3, #96] @ 0x60
  79535. 8020546: 687b ldr r3, [r7, #4]
  79536. 8020548: f8b3 3048 ldrh.w r3, [r3, #72] @ 0x48
  79537. 802054c: 4293 cmp r3, r2
  79538. 802054e: bf28 it cs
  79539. 8020550: 4613 movcs r3, r2
  79540. 8020552: b29b uxth r3, r3
  79541. 8020554: 2b00 cmp r3, #0
  79542. 8020556: da00 bge.n 802055a <tcp_rexmit_fast+0x56>
  79543. 8020558: 3301 adds r3, #1
  79544. 802055a: 105b asrs r3, r3, #1
  79545. 802055c: b29a uxth r2, r3
  79546. 802055e: 687b ldr r3, [r7, #4]
  79547. 8020560: f8a3 204a strh.w r2, [r3, #74] @ 0x4a
  79548. /* The minimum value for ssthresh should be 2 MSS */
  79549. if (pcb->ssthresh < (2U * pcb->mss)) {
  79550. 8020564: 687b ldr r3, [r7, #4]
  79551. 8020566: f8b3 304a ldrh.w r3, [r3, #74] @ 0x4a
  79552. 802056a: 461a mov r2, r3
  79553. 802056c: 687b ldr r3, [r7, #4]
  79554. 802056e: 8e5b ldrh r3, [r3, #50] @ 0x32
  79555. 8020570: 005b lsls r3, r3, #1
  79556. 8020572: 429a cmp r2, r3
  79557. 8020574: d206 bcs.n 8020584 <tcp_rexmit_fast+0x80>
  79558. LWIP_DEBUGF(TCP_FR_DEBUG,
  79559. ("tcp_receive: The minimum value for ssthresh %"TCPWNDSIZE_F
  79560. " should be min 2 mss %"U16_F"...\n",
  79561. pcb->ssthresh, (u16_t)(2 * pcb->mss)));
  79562. pcb->ssthresh = 2 * pcb->mss;
  79563. 8020576: 687b ldr r3, [r7, #4]
  79564. 8020578: 8e5b ldrh r3, [r3, #50] @ 0x32
  79565. 802057a: 005b lsls r3, r3, #1
  79566. 802057c: b29a uxth r2, r3
  79567. 802057e: 687b ldr r3, [r7, #4]
  79568. 8020580: f8a3 204a strh.w r2, [r3, #74] @ 0x4a
  79569. }
  79570. pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
  79571. 8020584: 687b ldr r3, [r7, #4]
  79572. 8020586: f8b3 204a ldrh.w r2, [r3, #74] @ 0x4a
  79573. 802058a: 687b ldr r3, [r7, #4]
  79574. 802058c: 8e5b ldrh r3, [r3, #50] @ 0x32
  79575. 802058e: 4619 mov r1, r3
  79576. 8020590: 0049 lsls r1, r1, #1
  79577. 8020592: 440b add r3, r1
  79578. 8020594: b29b uxth r3, r3
  79579. 8020596: 4413 add r3, r2
  79580. 8020598: b29a uxth r2, r3
  79581. 802059a: 687b ldr r3, [r7, #4]
  79582. 802059c: f8a3 2048 strh.w r2, [r3, #72] @ 0x48
  79583. tcp_set_flags(pcb, TF_INFR);
  79584. 80205a0: 687b ldr r3, [r7, #4]
  79585. 80205a2: 8b5b ldrh r3, [r3, #26]
  79586. 80205a4: f043 0304 orr.w r3, r3, #4
  79587. 80205a8: b29a uxth r2, r3
  79588. 80205aa: 687b ldr r3, [r7, #4]
  79589. 80205ac: 835a strh r2, [r3, #26]
  79590. /* Reset the retransmission timer to prevent immediate rto retransmissions */
  79591. pcb->rtime = 0;
  79592. 80205ae: 687b ldr r3, [r7, #4]
  79593. 80205b0: 2200 movs r2, #0
  79594. 80205b2: 861a strh r2, [r3, #48] @ 0x30
  79595. }
  79596. }
  79597. }
  79598. 80205b4: bf00 nop
  79599. 80205b6: 3708 adds r7, #8
  79600. 80205b8: 46bd mov sp, r7
  79601. 80205ba: bd80 pop {r7, pc}
  79602. 80205bc: 0802f190 .word 0x0802f190
  79603. 80205c0: 0802f8a4 .word 0x0802f8a4
  79604. 80205c4: 0802f1e4 .word 0x0802f1e4
  79605. 080205c8 <tcp_output_alloc_header_common>:
  79606. static struct pbuf *
  79607. tcp_output_alloc_header_common(u32_t ackno, u16_t optlen, u16_t datalen,
  79608. u32_t seqno_be /* already in network byte order */,
  79609. u16_t src_port, u16_t dst_port, u8_t flags, u16_t wnd)
  79610. {
  79611. 80205c8: b580 push {r7, lr}
  79612. 80205ca: b086 sub sp, #24
  79613. 80205cc: af00 add r7, sp, #0
  79614. 80205ce: 60f8 str r0, [r7, #12]
  79615. 80205d0: 607b str r3, [r7, #4]
  79616. 80205d2: 460b mov r3, r1
  79617. 80205d4: 817b strh r3, [r7, #10]
  79618. 80205d6: 4613 mov r3, r2
  79619. 80205d8: 813b strh r3, [r7, #8]
  79620. struct tcp_hdr *tcphdr;
  79621. struct pbuf *p;
  79622. p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
  79623. 80205da: 897a ldrh r2, [r7, #10]
  79624. 80205dc: 893b ldrh r3, [r7, #8]
  79625. 80205de: 4413 add r3, r2
  79626. 80205e0: b29b uxth r3, r3
  79627. 80205e2: 3314 adds r3, #20
  79628. 80205e4: b29b uxth r3, r3
  79629. 80205e6: f44f 7220 mov.w r2, #640 @ 0x280
  79630. 80205ea: 4619 mov r1, r3
  79631. 80205ec: 2022 movs r0, #34 @ 0x22
  79632. 80205ee: f7f9 fc5f bl 8019eb0 <pbuf_alloc>
  79633. 80205f2: 6178 str r0, [r7, #20]
  79634. if (p != NULL) {
  79635. 80205f4: 697b ldr r3, [r7, #20]
  79636. 80205f6: 2b00 cmp r3, #0
  79637. 80205f8: d04d beq.n 8020696 <tcp_output_alloc_header_common+0xce>
  79638. LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
  79639. 80205fa: 897b ldrh r3, [r7, #10]
  79640. 80205fc: 3313 adds r3, #19
  79641. 80205fe: 697a ldr r2, [r7, #20]
  79642. 8020600: 8952 ldrh r2, [r2, #10]
  79643. 8020602: 4293 cmp r3, r2
  79644. 8020604: db06 blt.n 8020614 <tcp_output_alloc_header_common+0x4c>
  79645. 8020606: 4b26 ldr r3, [pc, #152] @ (80206a0 <tcp_output_alloc_header_common+0xd8>)
  79646. 8020608: f240 7223 movw r2, #1827 @ 0x723
  79647. 802060c: 4925 ldr r1, [pc, #148] @ (80206a4 <tcp_output_alloc_header_common+0xdc>)
  79648. 802060e: 4826 ldr r0, [pc, #152] @ (80206a8 <tcp_output_alloc_header_common+0xe0>)
  79649. 8020610: f009 f9dc bl 80299cc <iprintf>
  79650. (p->len >= TCP_HLEN + optlen));
  79651. tcphdr = (struct tcp_hdr *)p->payload;
  79652. 8020614: 697b ldr r3, [r7, #20]
  79653. 8020616: 685b ldr r3, [r3, #4]
  79654. 8020618: 613b str r3, [r7, #16]
  79655. tcphdr->src = lwip_htons(src_port);
  79656. 802061a: 8c3b ldrh r3, [r7, #32]
  79657. 802061c: 4618 mov r0, r3
  79658. 802061e: f7f8 fa7b bl 8018b18 <lwip_htons>
  79659. 8020622: 4603 mov r3, r0
  79660. 8020624: 461a mov r2, r3
  79661. 8020626: 693b ldr r3, [r7, #16]
  79662. 8020628: 801a strh r2, [r3, #0]
  79663. tcphdr->dest = lwip_htons(dst_port);
  79664. 802062a: 8cbb ldrh r3, [r7, #36] @ 0x24
  79665. 802062c: 4618 mov r0, r3
  79666. 802062e: f7f8 fa73 bl 8018b18 <lwip_htons>
  79667. 8020632: 4603 mov r3, r0
  79668. 8020634: 461a mov r2, r3
  79669. 8020636: 693b ldr r3, [r7, #16]
  79670. 8020638: 805a strh r2, [r3, #2]
  79671. tcphdr->seqno = seqno_be;
  79672. 802063a: 693b ldr r3, [r7, #16]
  79673. 802063c: 687a ldr r2, [r7, #4]
  79674. 802063e: 605a str r2, [r3, #4]
  79675. tcphdr->ackno = lwip_htonl(ackno);
  79676. 8020640: 68f8 ldr r0, [r7, #12]
  79677. 8020642: f7f8 fa7e bl 8018b42 <lwip_htonl>
  79678. 8020646: 4602 mov r2, r0
  79679. 8020648: 693b ldr r3, [r7, #16]
  79680. 802064a: 609a str r2, [r3, #8]
  79681. TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), flags);
  79682. 802064c: 897b ldrh r3, [r7, #10]
  79683. 802064e: 089b lsrs r3, r3, #2
  79684. 8020650: b29b uxth r3, r3
  79685. 8020652: 3305 adds r3, #5
  79686. 8020654: b29b uxth r3, r3
  79687. 8020656: 031b lsls r3, r3, #12
  79688. 8020658: b29a uxth r2, r3
  79689. 802065a: f897 3028 ldrb.w r3, [r7, #40] @ 0x28
  79690. 802065e: b29b uxth r3, r3
  79691. 8020660: 4313 orrs r3, r2
  79692. 8020662: b29b uxth r3, r3
  79693. 8020664: 4618 mov r0, r3
  79694. 8020666: f7f8 fa57 bl 8018b18 <lwip_htons>
  79695. 802066a: 4603 mov r3, r0
  79696. 802066c: 461a mov r2, r3
  79697. 802066e: 693b ldr r3, [r7, #16]
  79698. 8020670: 819a strh r2, [r3, #12]
  79699. tcphdr->wnd = lwip_htons(wnd);
  79700. 8020672: 8dbb ldrh r3, [r7, #44] @ 0x2c
  79701. 8020674: 4618 mov r0, r3
  79702. 8020676: f7f8 fa4f bl 8018b18 <lwip_htons>
  79703. 802067a: 4603 mov r3, r0
  79704. 802067c: 461a mov r2, r3
  79705. 802067e: 693b ldr r3, [r7, #16]
  79706. 8020680: 81da strh r2, [r3, #14]
  79707. tcphdr->chksum = 0;
  79708. 8020682: 693b ldr r3, [r7, #16]
  79709. 8020684: 2200 movs r2, #0
  79710. 8020686: 741a strb r2, [r3, #16]
  79711. 8020688: 2200 movs r2, #0
  79712. 802068a: 745a strb r2, [r3, #17]
  79713. tcphdr->urgp = 0;
  79714. 802068c: 693b ldr r3, [r7, #16]
  79715. 802068e: 2200 movs r2, #0
  79716. 8020690: 749a strb r2, [r3, #18]
  79717. 8020692: 2200 movs r2, #0
  79718. 8020694: 74da strb r2, [r3, #19]
  79719. }
  79720. return p;
  79721. 8020696: 697b ldr r3, [r7, #20]
  79722. }
  79723. 8020698: 4618 mov r0, r3
  79724. 802069a: 3718 adds r7, #24
  79725. 802069c: 46bd mov sp, r7
  79726. 802069e: bd80 pop {r7, pc}
  79727. 80206a0: 0802f190 .word 0x0802f190
  79728. 80206a4: 0802f8c4 .word 0x0802f8c4
  79729. 80206a8: 0802f1e4 .word 0x0802f1e4
  79730. 080206ac <tcp_output_alloc_header>:
  79731. * @return pbuf with p->payload being the tcp_hdr
  79732. */
  79733. static struct pbuf *
  79734. tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
  79735. u32_t seqno_be /* already in network byte order */)
  79736. {
  79737. 80206ac: b5b0 push {r4, r5, r7, lr}
  79738. 80206ae: b08a sub sp, #40 @ 0x28
  79739. 80206b0: af04 add r7, sp, #16
  79740. 80206b2: 60f8 str r0, [r7, #12]
  79741. 80206b4: 607b str r3, [r7, #4]
  79742. 80206b6: 460b mov r3, r1
  79743. 80206b8: 817b strh r3, [r7, #10]
  79744. 80206ba: 4613 mov r3, r2
  79745. 80206bc: 813b strh r3, [r7, #8]
  79746. struct pbuf *p;
  79747. LWIP_ASSERT("tcp_output_alloc_header: invalid pcb", pcb != NULL);
  79748. 80206be: 68fb ldr r3, [r7, #12]
  79749. 80206c0: 2b00 cmp r3, #0
  79750. 80206c2: d106 bne.n 80206d2 <tcp_output_alloc_header+0x26>
  79751. 80206c4: 4b15 ldr r3, [pc, #84] @ (802071c <tcp_output_alloc_header+0x70>)
  79752. 80206c6: f240 7242 movw r2, #1858 @ 0x742
  79753. 80206ca: 4915 ldr r1, [pc, #84] @ (8020720 <tcp_output_alloc_header+0x74>)
  79754. 80206cc: 4815 ldr r0, [pc, #84] @ (8020724 <tcp_output_alloc_header+0x78>)
  79755. 80206ce: f009 f97d bl 80299cc <iprintf>
  79756. p = tcp_output_alloc_header_common(pcb->rcv_nxt, optlen, datalen,
  79757. 80206d2: 68fb ldr r3, [r7, #12]
  79758. 80206d4: 6a58 ldr r0, [r3, #36] @ 0x24
  79759. 80206d6: 68fb ldr r3, [r7, #12]
  79760. 80206d8: 8adb ldrh r3, [r3, #22]
  79761. 80206da: 68fa ldr r2, [r7, #12]
  79762. 80206dc: 8b12 ldrh r2, [r2, #24]
  79763. 80206de: 68f9 ldr r1, [r7, #12]
  79764. 80206e0: 8d49 ldrh r1, [r1, #42] @ 0x2a
  79765. 80206e2: 893d ldrh r5, [r7, #8]
  79766. 80206e4: 897c ldrh r4, [r7, #10]
  79767. 80206e6: 9103 str r1, [sp, #12]
  79768. 80206e8: 2110 movs r1, #16
  79769. 80206ea: 9102 str r1, [sp, #8]
  79770. 80206ec: 9201 str r2, [sp, #4]
  79771. 80206ee: 9300 str r3, [sp, #0]
  79772. 80206f0: 687b ldr r3, [r7, #4]
  79773. 80206f2: 462a mov r2, r5
  79774. 80206f4: 4621 mov r1, r4
  79775. 80206f6: f7ff ff67 bl 80205c8 <tcp_output_alloc_header_common>
  79776. 80206fa: 6178 str r0, [r7, #20]
  79777. seqno_be, pcb->local_port, pcb->remote_port, TCP_ACK,
  79778. TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd)));
  79779. if (p != NULL) {
  79780. 80206fc: 697b ldr r3, [r7, #20]
  79781. 80206fe: 2b00 cmp r3, #0
  79782. 8020700: d006 beq.n 8020710 <tcp_output_alloc_header+0x64>
  79783. /* If we're sending a packet, update the announced right window edge */
  79784. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  79785. 8020702: 68fb ldr r3, [r7, #12]
  79786. 8020704: 6a5b ldr r3, [r3, #36] @ 0x24
  79787. 8020706: 68fa ldr r2, [r7, #12]
  79788. 8020708: 8d52 ldrh r2, [r2, #42] @ 0x2a
  79789. 802070a: 441a add r2, r3
  79790. 802070c: 68fb ldr r3, [r7, #12]
  79791. 802070e: 62da str r2, [r3, #44] @ 0x2c
  79792. }
  79793. return p;
  79794. 8020710: 697b ldr r3, [r7, #20]
  79795. }
  79796. 8020712: 4618 mov r0, r3
  79797. 8020714: 3718 adds r7, #24
  79798. 8020716: 46bd mov sp, r7
  79799. 8020718: bdb0 pop {r4, r5, r7, pc}
  79800. 802071a: bf00 nop
  79801. 802071c: 0802f190 .word 0x0802f190
  79802. 8020720: 0802f8f4 .word 0x0802f8f4
  79803. 8020724: 0802f1e4 .word 0x0802f1e4
  79804. 08020728 <tcp_output_fill_options>:
  79805. /* Fill in options for control segments */
  79806. static void
  79807. tcp_output_fill_options(const struct tcp_pcb *pcb, struct pbuf *p, u8_t optflags, u8_t num_sacks)
  79808. {
  79809. 8020728: b580 push {r7, lr}
  79810. 802072a: b088 sub sp, #32
  79811. 802072c: af00 add r7, sp, #0
  79812. 802072e: 60f8 str r0, [r7, #12]
  79813. 8020730: 60b9 str r1, [r7, #8]
  79814. 8020732: 4611 mov r1, r2
  79815. 8020734: 461a mov r2, r3
  79816. 8020736: 460b mov r3, r1
  79817. 8020738: 71fb strb r3, [r7, #7]
  79818. 802073a: 4613 mov r3, r2
  79819. 802073c: 71bb strb r3, [r7, #6]
  79820. struct tcp_hdr *tcphdr;
  79821. u32_t *opts;
  79822. u16_t sacks_len = 0;
  79823. 802073e: 2300 movs r3, #0
  79824. 8020740: 83fb strh r3, [r7, #30]
  79825. LWIP_ASSERT("tcp_output_fill_options: invalid pbuf", p != NULL);
  79826. 8020742: 68bb ldr r3, [r7, #8]
  79827. 8020744: 2b00 cmp r3, #0
  79828. 8020746: d106 bne.n 8020756 <tcp_output_fill_options+0x2e>
  79829. 8020748: 4b12 ldr r3, [pc, #72] @ (8020794 <tcp_output_fill_options+0x6c>)
  79830. 802074a: f240 7256 movw r2, #1878 @ 0x756
  79831. 802074e: 4912 ldr r1, [pc, #72] @ (8020798 <tcp_output_fill_options+0x70>)
  79832. 8020750: 4812 ldr r0, [pc, #72] @ (802079c <tcp_output_fill_options+0x74>)
  79833. 8020752: f009 f93b bl 80299cc <iprintf>
  79834. tcphdr = (struct tcp_hdr *)p->payload;
  79835. 8020756: 68bb ldr r3, [r7, #8]
  79836. 8020758: 685b ldr r3, [r3, #4]
  79837. 802075a: 61bb str r3, [r7, #24]
  79838. opts = (u32_t *)(void *)(tcphdr + 1);
  79839. 802075c: 69bb ldr r3, [r7, #24]
  79840. 802075e: 3314 adds r3, #20
  79841. 8020760: 617b str r3, [r7, #20]
  79842. opts = LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(p, tcphdr, pcb, opts);
  79843. #endif
  79844. LWIP_UNUSED_ARG(pcb);
  79845. LWIP_UNUSED_ARG(sacks_len);
  79846. LWIP_ASSERT("options not filled", (u8_t *)opts == ((u8_t *)(tcphdr + 1)) + sacks_len * 4 + LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb));
  79847. 8020762: 8bfb ldrh r3, [r7, #30]
  79848. 8020764: 009b lsls r3, r3, #2
  79849. 8020766: 461a mov r2, r3
  79850. 8020768: 79fb ldrb r3, [r7, #7]
  79851. 802076a: 009b lsls r3, r3, #2
  79852. 802076c: f003 0304 and.w r3, r3, #4
  79853. 8020770: 4413 add r3, r2
  79854. 8020772: 3314 adds r3, #20
  79855. 8020774: 69ba ldr r2, [r7, #24]
  79856. 8020776: 4413 add r3, r2
  79857. 8020778: 697a ldr r2, [r7, #20]
  79858. 802077a: 429a cmp r2, r3
  79859. 802077c: d006 beq.n 802078c <tcp_output_fill_options+0x64>
  79860. 802077e: 4b05 ldr r3, [pc, #20] @ (8020794 <tcp_output_fill_options+0x6c>)
  79861. 8020780: f240 7275 movw r2, #1909 @ 0x775
  79862. 8020784: 4906 ldr r1, [pc, #24] @ (80207a0 <tcp_output_fill_options+0x78>)
  79863. 8020786: 4805 ldr r0, [pc, #20] @ (802079c <tcp_output_fill_options+0x74>)
  79864. 8020788: f009 f920 bl 80299cc <iprintf>
  79865. LWIP_UNUSED_ARG(optflags); /* for LWIP_NOASSERT */
  79866. LWIP_UNUSED_ARG(opts); /* for LWIP_NOASSERT */
  79867. }
  79868. 802078c: bf00 nop
  79869. 802078e: 3720 adds r7, #32
  79870. 8020790: 46bd mov sp, r7
  79871. 8020792: bd80 pop {r7, pc}
  79872. 8020794: 0802f190 .word 0x0802f190
  79873. 8020798: 0802f91c .word 0x0802f91c
  79874. 802079c: 0802f1e4 .word 0x0802f1e4
  79875. 80207a0: 0802f814 .word 0x0802f814
  79876. 080207a4 <tcp_output_control_segment>:
  79877. * header checksum and calling ip_output_if while handling netif hints and stats.
  79878. */
  79879. static err_t
  79880. tcp_output_control_segment(const struct tcp_pcb *pcb, struct pbuf *p,
  79881. const ip_addr_t *src, const ip_addr_t *dst)
  79882. {
  79883. 80207a4: b580 push {r7, lr}
  79884. 80207a6: b08a sub sp, #40 @ 0x28
  79885. 80207a8: af04 add r7, sp, #16
  79886. 80207aa: 60f8 str r0, [r7, #12]
  79887. 80207ac: 60b9 str r1, [r7, #8]
  79888. 80207ae: 607a str r2, [r7, #4]
  79889. 80207b0: 603b str r3, [r7, #0]
  79890. err_t err;
  79891. struct netif *netif;
  79892. LWIP_ASSERT("tcp_output_control_segment: invalid pbuf", p != NULL);
  79893. 80207b2: 68bb ldr r3, [r7, #8]
  79894. 80207b4: 2b00 cmp r3, #0
  79895. 80207b6: d106 bne.n 80207c6 <tcp_output_control_segment+0x22>
  79896. 80207b8: 4b1c ldr r3, [pc, #112] @ (802082c <tcp_output_control_segment+0x88>)
  79897. 80207ba: f240 7287 movw r2, #1927 @ 0x787
  79898. 80207be: 491c ldr r1, [pc, #112] @ (8020830 <tcp_output_control_segment+0x8c>)
  79899. 80207c0: 481c ldr r0, [pc, #112] @ (8020834 <tcp_output_control_segment+0x90>)
  79900. 80207c2: f009 f903 bl 80299cc <iprintf>
  79901. netif = tcp_route(pcb, src, dst);
  79902. 80207c6: 683a ldr r2, [r7, #0]
  79903. 80207c8: 6879 ldr r1, [r7, #4]
  79904. 80207ca: 68f8 ldr r0, [r7, #12]
  79905. 80207cc: f7fe fa78 bl 801ecc0 <tcp_route>
  79906. 80207d0: 6138 str r0, [r7, #16]
  79907. if (netif == NULL) {
  79908. 80207d2: 693b ldr r3, [r7, #16]
  79909. 80207d4: 2b00 cmp r3, #0
  79910. 80207d6: d102 bne.n 80207de <tcp_output_control_segment+0x3a>
  79911. err = ERR_RTE;
  79912. 80207d8: 23fc movs r3, #252 @ 0xfc
  79913. 80207da: 75fb strb r3, [r7, #23]
  79914. 80207dc: e01c b.n 8020818 <tcp_output_control_segment+0x74>
  79915. struct tcp_hdr *tcphdr = (struct tcp_hdr *)p->payload;
  79916. tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,
  79917. src, dst);
  79918. }
  79919. #endif
  79920. if (pcb != NULL) {
  79921. 80207de: 68fb ldr r3, [r7, #12]
  79922. 80207e0: 2b00 cmp r3, #0
  79923. 80207e2: d006 beq.n 80207f2 <tcp_output_control_segment+0x4e>
  79924. NETIF_SET_HINTS(netif, LWIP_CONST_CAST(struct netif_hint*, &(pcb->netif_hints)));
  79925. ttl = pcb->ttl;
  79926. 80207e4: 68fb ldr r3, [r7, #12]
  79927. 80207e6: 7adb ldrb r3, [r3, #11]
  79928. 80207e8: 75bb strb r3, [r7, #22]
  79929. tos = pcb->tos;
  79930. 80207ea: 68fb ldr r3, [r7, #12]
  79931. 80207ec: 7a9b ldrb r3, [r3, #10]
  79932. 80207ee: 757b strb r3, [r7, #21]
  79933. 80207f0: e003 b.n 80207fa <tcp_output_control_segment+0x56>
  79934. } else {
  79935. /* Send output with hardcoded TTL/HL since we have no access to the pcb */
  79936. ttl = TCP_TTL;
  79937. 80207f2: 23ff movs r3, #255 @ 0xff
  79938. 80207f4: 75bb strb r3, [r7, #22]
  79939. tos = 0;
  79940. 80207f6: 2300 movs r3, #0
  79941. 80207f8: 757b strb r3, [r7, #21]
  79942. }
  79943. TCP_STATS_INC(tcp.xmit);
  79944. err = ip_output_if(p, src, dst, ttl, tos, IP_PROTO_TCP, netif);
  79945. 80207fa: 7dba ldrb r2, [r7, #22]
  79946. 80207fc: 693b ldr r3, [r7, #16]
  79947. 80207fe: 9302 str r3, [sp, #8]
  79948. 8020800: 2306 movs r3, #6
  79949. 8020802: 9301 str r3, [sp, #4]
  79950. 8020804: 7d7b ldrb r3, [r7, #21]
  79951. 8020806: 9300 str r3, [sp, #0]
  79952. 8020808: 4613 mov r3, r2
  79953. 802080a: 683a ldr r2, [r7, #0]
  79954. 802080c: 6879 ldr r1, [r7, #4]
  79955. 802080e: 68b8 ldr r0, [r7, #8]
  79956. 8020810: f004 faac bl 8024d6c <ip4_output_if>
  79957. 8020814: 4603 mov r3, r0
  79958. 8020816: 75fb strb r3, [r7, #23]
  79959. NETIF_RESET_HINTS(netif);
  79960. }
  79961. pbuf_free(p);
  79962. 8020818: 68b8 ldr r0, [r7, #8]
  79963. 802081a: f7f9 fe5f bl 801a4dc <pbuf_free>
  79964. return err;
  79965. 802081e: f997 3017 ldrsb.w r3, [r7, #23]
  79966. }
  79967. 8020822: 4618 mov r0, r3
  79968. 8020824: 3718 adds r7, #24
  79969. 8020826: 46bd mov sp, r7
  79970. 8020828: bd80 pop {r7, pc}
  79971. 802082a: bf00 nop
  79972. 802082c: 0802f190 .word 0x0802f190
  79973. 8020830: 0802f944 .word 0x0802f944
  79974. 8020834: 0802f1e4 .word 0x0802f1e4
  79975. 08020838 <tcp_rst>:
  79976. */
  79977. void
  79978. tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno,
  79979. const ip_addr_t *local_ip, const ip_addr_t *remote_ip,
  79980. u16_t local_port, u16_t remote_port)
  79981. {
  79982. 8020838: b590 push {r4, r7, lr}
  79983. 802083a: b08b sub sp, #44 @ 0x2c
  79984. 802083c: af04 add r7, sp, #16
  79985. 802083e: 60f8 str r0, [r7, #12]
  79986. 8020840: 60b9 str r1, [r7, #8]
  79987. 8020842: 607a str r2, [r7, #4]
  79988. 8020844: 603b str r3, [r7, #0]
  79989. struct pbuf *p;
  79990. u16_t wnd;
  79991. u8_t optlen;
  79992. LWIP_ASSERT("tcp_rst: invalid local_ip", local_ip != NULL);
  79993. 8020846: 683b ldr r3, [r7, #0]
  79994. 8020848: 2b00 cmp r3, #0
  79995. 802084a: d106 bne.n 802085a <tcp_rst+0x22>
  79996. 802084c: 4b1f ldr r3, [pc, #124] @ (80208cc <tcp_rst+0x94>)
  79997. 802084e: f240 72c4 movw r2, #1988 @ 0x7c4
  79998. 8020852: 491f ldr r1, [pc, #124] @ (80208d0 <tcp_rst+0x98>)
  79999. 8020854: 481f ldr r0, [pc, #124] @ (80208d4 <tcp_rst+0x9c>)
  80000. 8020856: f009 f8b9 bl 80299cc <iprintf>
  80001. LWIP_ASSERT("tcp_rst: invalid remote_ip", remote_ip != NULL);
  80002. 802085a: 6abb ldr r3, [r7, #40] @ 0x28
  80003. 802085c: 2b00 cmp r3, #0
  80004. 802085e: d106 bne.n 802086e <tcp_rst+0x36>
  80005. 8020860: 4b1a ldr r3, [pc, #104] @ (80208cc <tcp_rst+0x94>)
  80006. 8020862: f240 72c5 movw r2, #1989 @ 0x7c5
  80007. 8020866: 491c ldr r1, [pc, #112] @ (80208d8 <tcp_rst+0xa0>)
  80008. 8020868: 481a ldr r0, [pc, #104] @ (80208d4 <tcp_rst+0x9c>)
  80009. 802086a: f009 f8af bl 80299cc <iprintf>
  80010. optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
  80011. 802086e: 2300 movs r3, #0
  80012. 8020870: 75fb strb r3, [r7, #23]
  80013. #if LWIP_WND_SCALE
  80014. wnd = PP_HTONS(((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF));
  80015. #else
  80016. wnd = PP_HTONS(TCP_WND);
  80017. 8020872: f24d 0316 movw r3, #53270 @ 0xd016
  80018. 8020876: 82bb strh r3, [r7, #20]
  80019. #endif
  80020. p = tcp_output_alloc_header_common(ackno, optlen, 0, lwip_htonl(seqno), local_port,
  80021. 8020878: 7dfb ldrb r3, [r7, #23]
  80022. 802087a: b29c uxth r4, r3
  80023. 802087c: 68b8 ldr r0, [r7, #8]
  80024. 802087e: f7f8 f960 bl 8018b42 <lwip_htonl>
  80025. 8020882: 4602 mov r2, r0
  80026. 8020884: 8abb ldrh r3, [r7, #20]
  80027. 8020886: 9303 str r3, [sp, #12]
  80028. 8020888: 2314 movs r3, #20
  80029. 802088a: 9302 str r3, [sp, #8]
  80030. 802088c: 8e3b ldrh r3, [r7, #48] @ 0x30
  80031. 802088e: 9301 str r3, [sp, #4]
  80032. 8020890: 8dbb ldrh r3, [r7, #44] @ 0x2c
  80033. 8020892: 9300 str r3, [sp, #0]
  80034. 8020894: 4613 mov r3, r2
  80035. 8020896: 2200 movs r2, #0
  80036. 8020898: 4621 mov r1, r4
  80037. 802089a: 6878 ldr r0, [r7, #4]
  80038. 802089c: f7ff fe94 bl 80205c8 <tcp_output_alloc_header_common>
  80039. 80208a0: 6138 str r0, [r7, #16]
  80040. remote_port, TCP_RST | TCP_ACK, wnd);
  80041. if (p == NULL) {
  80042. 80208a2: 693b ldr r3, [r7, #16]
  80043. 80208a4: 2b00 cmp r3, #0
  80044. 80208a6: d00c beq.n 80208c2 <tcp_rst+0x8a>
  80045. LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n"));
  80046. return;
  80047. }
  80048. tcp_output_fill_options(pcb, p, 0, optlen);
  80049. 80208a8: 7dfb ldrb r3, [r7, #23]
  80050. 80208aa: 2200 movs r2, #0
  80051. 80208ac: 6939 ldr r1, [r7, #16]
  80052. 80208ae: 68f8 ldr r0, [r7, #12]
  80053. 80208b0: f7ff ff3a bl 8020728 <tcp_output_fill_options>
  80054. MIB2_STATS_INC(mib2.tcpoutrsts);
  80055. tcp_output_control_segment(pcb, p, local_ip, remote_ip);
  80056. 80208b4: 6abb ldr r3, [r7, #40] @ 0x28
  80057. 80208b6: 683a ldr r2, [r7, #0]
  80058. 80208b8: 6939 ldr r1, [r7, #16]
  80059. 80208ba: 68f8 ldr r0, [r7, #12]
  80060. 80208bc: f7ff ff72 bl 80207a4 <tcp_output_control_segment>
  80061. 80208c0: e000 b.n 80208c4 <tcp_rst+0x8c>
  80062. return;
  80063. 80208c2: bf00 nop
  80064. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
  80065. }
  80066. 80208c4: 371c adds r7, #28
  80067. 80208c6: 46bd mov sp, r7
  80068. 80208c8: bd90 pop {r4, r7, pc}
  80069. 80208ca: bf00 nop
  80070. 80208cc: 0802f190 .word 0x0802f190
  80071. 80208d0: 0802f970 .word 0x0802f970
  80072. 80208d4: 0802f1e4 .word 0x0802f1e4
  80073. 80208d8: 0802f98c .word 0x0802f98c
  80074. 080208dc <tcp_send_empty_ack>:
  80075. *
  80076. * @param pcb Protocol control block for the TCP connection to send the ACK
  80077. */
  80078. err_t
  80079. tcp_send_empty_ack(struct tcp_pcb *pcb)
  80080. {
  80081. 80208dc: b590 push {r4, r7, lr}
  80082. 80208de: b087 sub sp, #28
  80083. 80208e0: af00 add r7, sp, #0
  80084. 80208e2: 6078 str r0, [r7, #4]
  80085. err_t err;
  80086. struct pbuf *p;
  80087. u8_t optlen, optflags = 0;
  80088. 80208e4: 2300 movs r3, #0
  80089. 80208e6: 75fb strb r3, [r7, #23]
  80090. u8_t num_sacks = 0;
  80091. 80208e8: 2300 movs r3, #0
  80092. 80208ea: 75bb strb r3, [r7, #22]
  80093. LWIP_ASSERT("tcp_send_empty_ack: invalid pcb", pcb != NULL);
  80094. 80208ec: 687b ldr r3, [r7, #4]
  80095. 80208ee: 2b00 cmp r3, #0
  80096. 80208f0: d106 bne.n 8020900 <tcp_send_empty_ack+0x24>
  80097. 80208f2: 4b28 ldr r3, [pc, #160] @ (8020994 <tcp_send_empty_ack+0xb8>)
  80098. 80208f4: f240 72ea movw r2, #2026 @ 0x7ea
  80099. 80208f8: 4927 ldr r1, [pc, #156] @ (8020998 <tcp_send_empty_ack+0xbc>)
  80100. 80208fa: 4828 ldr r0, [pc, #160] @ (802099c <tcp_send_empty_ack+0xc0>)
  80101. 80208fc: f009 f866 bl 80299cc <iprintf>
  80102. #if LWIP_TCP_TIMESTAMPS
  80103. if (pcb->flags & TF_TIMESTAMP) {
  80104. optflags = TF_SEG_OPTS_TS;
  80105. }
  80106. #endif
  80107. optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb);
  80108. 8020900: 7dfb ldrb r3, [r7, #23]
  80109. 8020902: 009b lsls r3, r3, #2
  80110. 8020904: b2db uxtb r3, r3
  80111. 8020906: f003 0304 and.w r3, r3, #4
  80112. 802090a: 757b strb r3, [r7, #21]
  80113. if ((num_sacks = tcp_get_num_sacks(pcb, optlen)) > 0) {
  80114. optlen += 4 + num_sacks * 8; /* 4 bytes for header (including 2*NOP), plus 8B for each SACK */
  80115. }
  80116. #endif
  80117. p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt));
  80118. 802090c: 7d7b ldrb r3, [r7, #21]
  80119. 802090e: b29c uxth r4, r3
  80120. 8020910: 687b ldr r3, [r7, #4]
  80121. 8020912: 6d1b ldr r3, [r3, #80] @ 0x50
  80122. 8020914: 4618 mov r0, r3
  80123. 8020916: f7f8 f914 bl 8018b42 <lwip_htonl>
  80124. 802091a: 4603 mov r3, r0
  80125. 802091c: 2200 movs r2, #0
  80126. 802091e: 4621 mov r1, r4
  80127. 8020920: 6878 ldr r0, [r7, #4]
  80128. 8020922: f7ff fec3 bl 80206ac <tcp_output_alloc_header>
  80129. 8020926: 6138 str r0, [r7, #16]
  80130. if (p == NULL) {
  80131. 8020928: 693b ldr r3, [r7, #16]
  80132. 802092a: 2b00 cmp r3, #0
  80133. 802092c: d109 bne.n 8020942 <tcp_send_empty_ack+0x66>
  80134. /* let tcp_fasttmr retry sending this ACK */
  80135. tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
  80136. 802092e: 687b ldr r3, [r7, #4]
  80137. 8020930: 8b5b ldrh r3, [r3, #26]
  80138. 8020932: f043 0303 orr.w r3, r3, #3
  80139. 8020936: b29a uxth r2, r3
  80140. 8020938: 687b ldr r3, [r7, #4]
  80141. 802093a: 835a strh r2, [r3, #26]
  80142. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n"));
  80143. return ERR_BUF;
  80144. 802093c: f06f 0301 mvn.w r3, #1
  80145. 8020940: e023 b.n 802098a <tcp_send_empty_ack+0xae>
  80146. }
  80147. tcp_output_fill_options(pcb, p, optflags, num_sacks);
  80148. 8020942: 7dbb ldrb r3, [r7, #22]
  80149. 8020944: 7dfa ldrb r2, [r7, #23]
  80150. 8020946: 6939 ldr r1, [r7, #16]
  80151. 8020948: 6878 ldr r0, [r7, #4]
  80152. 802094a: f7ff feed bl 8020728 <tcp_output_fill_options>
  80153. pcb->ts_lastacksent = pcb->rcv_nxt;
  80154. #endif
  80155. LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
  80156. ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
  80157. err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip);
  80158. 802094e: 687a ldr r2, [r7, #4]
  80159. 8020950: 687b ldr r3, [r7, #4]
  80160. 8020952: 3304 adds r3, #4
  80161. 8020954: 6939 ldr r1, [r7, #16]
  80162. 8020956: 6878 ldr r0, [r7, #4]
  80163. 8020958: f7ff ff24 bl 80207a4 <tcp_output_control_segment>
  80164. 802095c: 4603 mov r3, r0
  80165. 802095e: 73fb strb r3, [r7, #15]
  80166. if (err != ERR_OK) {
  80167. 8020960: f997 300f ldrsb.w r3, [r7, #15]
  80168. 8020964: 2b00 cmp r3, #0
  80169. 8020966: d007 beq.n 8020978 <tcp_send_empty_ack+0x9c>
  80170. /* let tcp_fasttmr retry sending this ACK */
  80171. tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
  80172. 8020968: 687b ldr r3, [r7, #4]
  80173. 802096a: 8b5b ldrh r3, [r3, #26]
  80174. 802096c: f043 0303 orr.w r3, r3, #3
  80175. 8020970: b29a uxth r2, r3
  80176. 8020972: 687b ldr r3, [r7, #4]
  80177. 8020974: 835a strh r2, [r3, #26]
  80178. 8020976: e006 b.n 8020986 <tcp_send_empty_ack+0xaa>
  80179. } else {
  80180. /* remove ACK flags from the PCB, as we sent an empty ACK now */
  80181. tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
  80182. 8020978: 687b ldr r3, [r7, #4]
  80183. 802097a: 8b5b ldrh r3, [r3, #26]
  80184. 802097c: f023 0303 bic.w r3, r3, #3
  80185. 8020980: b29a uxth r2, r3
  80186. 8020982: 687b ldr r3, [r7, #4]
  80187. 8020984: 835a strh r2, [r3, #26]
  80188. }
  80189. return err;
  80190. 8020986: f997 300f ldrsb.w r3, [r7, #15]
  80191. }
  80192. 802098a: 4618 mov r0, r3
  80193. 802098c: 371c adds r7, #28
  80194. 802098e: 46bd mov sp, r7
  80195. 8020990: bd90 pop {r4, r7, pc}
  80196. 8020992: bf00 nop
  80197. 8020994: 0802f190 .word 0x0802f190
  80198. 8020998: 0802f9a8 .word 0x0802f9a8
  80199. 802099c: 0802f1e4 .word 0x0802f1e4
  80200. 080209a0 <tcp_keepalive>:
  80201. *
  80202. * @param pcb the tcp_pcb for which to send a keepalive packet
  80203. */
  80204. err_t
  80205. tcp_keepalive(struct tcp_pcb *pcb)
  80206. {
  80207. 80209a0: b590 push {r4, r7, lr}
  80208. 80209a2: b085 sub sp, #20
  80209. 80209a4: af00 add r7, sp, #0
  80210. 80209a6: 6078 str r0, [r7, #4]
  80211. err_t err;
  80212. struct pbuf *p;
  80213. u8_t optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
  80214. 80209a8: 2300 movs r3, #0
  80215. 80209aa: 72bb strb r3, [r7, #10]
  80216. LWIP_ASSERT("tcp_keepalive: invalid pcb", pcb != NULL);
  80217. 80209ac: 687b ldr r3, [r7, #4]
  80218. 80209ae: 2b00 cmp r3, #0
  80219. 80209b0: d106 bne.n 80209c0 <tcp_keepalive+0x20>
  80220. 80209b2: 4b18 ldr r3, [pc, #96] @ (8020a14 <tcp_keepalive+0x74>)
  80221. 80209b4: f640 0224 movw r2, #2084 @ 0x824
  80222. 80209b8: 4917 ldr r1, [pc, #92] @ (8020a18 <tcp_keepalive+0x78>)
  80223. 80209ba: 4818 ldr r0, [pc, #96] @ (8020a1c <tcp_keepalive+0x7c>)
  80224. 80209bc: f009 f806 bl 80299cc <iprintf>
  80225. LWIP_DEBUGF(TCP_DEBUG, ("\n"));
  80226. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  80227. tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent));
  80228. p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt - 1));
  80229. 80209c0: 7abb ldrb r3, [r7, #10]
  80230. 80209c2: b29c uxth r4, r3
  80231. 80209c4: 687b ldr r3, [r7, #4]
  80232. 80209c6: 6d1b ldr r3, [r3, #80] @ 0x50
  80233. 80209c8: 3b01 subs r3, #1
  80234. 80209ca: 4618 mov r0, r3
  80235. 80209cc: f7f8 f8b9 bl 8018b42 <lwip_htonl>
  80236. 80209d0: 4603 mov r3, r0
  80237. 80209d2: 2200 movs r2, #0
  80238. 80209d4: 4621 mov r1, r4
  80239. 80209d6: 6878 ldr r0, [r7, #4]
  80240. 80209d8: f7ff fe68 bl 80206ac <tcp_output_alloc_header>
  80241. 80209dc: 60f8 str r0, [r7, #12]
  80242. if (p == NULL) {
  80243. 80209de: 68fb ldr r3, [r7, #12]
  80244. 80209e0: 2b00 cmp r3, #0
  80245. 80209e2: d102 bne.n 80209ea <tcp_keepalive+0x4a>
  80246. LWIP_DEBUGF(TCP_DEBUG,
  80247. ("tcp_keepalive: could not allocate memory for pbuf\n"));
  80248. return ERR_MEM;
  80249. 80209e4: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  80250. 80209e8: e010 b.n 8020a0c <tcp_keepalive+0x6c>
  80251. }
  80252. tcp_output_fill_options(pcb, p, 0, optlen);
  80253. 80209ea: 7abb ldrb r3, [r7, #10]
  80254. 80209ec: 2200 movs r2, #0
  80255. 80209ee: 68f9 ldr r1, [r7, #12]
  80256. 80209f0: 6878 ldr r0, [r7, #4]
  80257. 80209f2: f7ff fe99 bl 8020728 <tcp_output_fill_options>
  80258. err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip);
  80259. 80209f6: 687a ldr r2, [r7, #4]
  80260. 80209f8: 687b ldr r3, [r7, #4]
  80261. 80209fa: 3304 adds r3, #4
  80262. 80209fc: 68f9 ldr r1, [r7, #12]
  80263. 80209fe: 6878 ldr r0, [r7, #4]
  80264. 8020a00: f7ff fed0 bl 80207a4 <tcp_output_control_segment>
  80265. 8020a04: 4603 mov r3, r0
  80266. 8020a06: 72fb strb r3, [r7, #11]
  80267. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F" err %d.\n",
  80268. pcb->snd_nxt - 1, pcb->rcv_nxt, (int)err));
  80269. return err;
  80270. 8020a08: f997 300b ldrsb.w r3, [r7, #11]
  80271. }
  80272. 8020a0c: 4618 mov r0, r3
  80273. 8020a0e: 3714 adds r7, #20
  80274. 8020a10: 46bd mov sp, r7
  80275. 8020a12: bd90 pop {r4, r7, pc}
  80276. 8020a14: 0802f190 .word 0x0802f190
  80277. 8020a18: 0802f9c8 .word 0x0802f9c8
  80278. 8020a1c: 0802f1e4 .word 0x0802f1e4
  80279. 08020a20 <tcp_zero_window_probe>:
  80280. *
  80281. * @param pcb the tcp_pcb for which to send a zero-window probe packet
  80282. */
  80283. err_t
  80284. tcp_zero_window_probe(struct tcp_pcb *pcb)
  80285. {
  80286. 8020a20: b590 push {r4, r7, lr}
  80287. 8020a22: b08b sub sp, #44 @ 0x2c
  80288. 8020a24: af00 add r7, sp, #0
  80289. 8020a26: 6078 str r0, [r7, #4]
  80290. struct tcp_hdr *tcphdr;
  80291. struct tcp_seg *seg;
  80292. u16_t len;
  80293. u8_t is_fin;
  80294. u32_t snd_nxt;
  80295. u8_t optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
  80296. 8020a28: 2300 movs r3, #0
  80297. 8020a2a: 74fb strb r3, [r7, #19]
  80298. LWIP_ASSERT("tcp_zero_window_probe: invalid pcb", pcb != NULL);
  80299. 8020a2c: 687b ldr r3, [r7, #4]
  80300. 8020a2e: 2b00 cmp r3, #0
  80301. 8020a30: d106 bne.n 8020a40 <tcp_zero_window_probe+0x20>
  80302. 8020a32: 4b4d ldr r3, [pc, #308] @ (8020b68 <tcp_zero_window_probe+0x148>)
  80303. 8020a34: f640 024f movw r2, #2127 @ 0x84f
  80304. 8020a38: 494c ldr r1, [pc, #304] @ (8020b6c <tcp_zero_window_probe+0x14c>)
  80305. 8020a3a: 484d ldr r0, [pc, #308] @ (8020b70 <tcp_zero_window_probe+0x150>)
  80306. 8020a3c: f008 ffc6 bl 80299cc <iprintf>
  80307. ("tcp_zero_window_probe: tcp_ticks %"U32_F
  80308. " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  80309. tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent));
  80310. /* Only consider unsent, persist timer should be off when there is data in-flight */
  80311. seg = pcb->unsent;
  80312. 8020a40: 687b ldr r3, [r7, #4]
  80313. 8020a42: 6edb ldr r3, [r3, #108] @ 0x6c
  80314. 8020a44: 627b str r3, [r7, #36] @ 0x24
  80315. if (seg == NULL) {
  80316. 8020a46: 6a7b ldr r3, [r7, #36] @ 0x24
  80317. 8020a48: 2b00 cmp r3, #0
  80318. 8020a4a: d101 bne.n 8020a50 <tcp_zero_window_probe+0x30>
  80319. /* Not expected, persist timer should be off when the send buffer is empty */
  80320. return ERR_OK;
  80321. 8020a4c: 2300 movs r3, #0
  80322. 8020a4e: e087 b.n 8020b60 <tcp_zero_window_probe+0x140>
  80323. /* increment probe count. NOTE: we record probe even if it fails
  80324. to actually transmit due to an error. This ensures memory exhaustion/
  80325. routing problem doesn't leave a zero-window pcb as an indefinite zombie.
  80326. RTO mechanism has similar behavior, see pcb->nrtx */
  80327. if (pcb->persist_probe < 0xFF) {
  80328. 8020a50: 687b ldr r3, [r7, #4]
  80329. 8020a52: f893 309a ldrb.w r3, [r3, #154] @ 0x9a
  80330. 8020a56: 2bff cmp r3, #255 @ 0xff
  80331. 8020a58: d007 beq.n 8020a6a <tcp_zero_window_probe+0x4a>
  80332. ++pcb->persist_probe;
  80333. 8020a5a: 687b ldr r3, [r7, #4]
  80334. 8020a5c: f893 309a ldrb.w r3, [r3, #154] @ 0x9a
  80335. 8020a60: 3301 adds r3, #1
  80336. 8020a62: b2da uxtb r2, r3
  80337. 8020a64: 687b ldr r3, [r7, #4]
  80338. 8020a66: f883 209a strb.w r2, [r3, #154] @ 0x9a
  80339. }
  80340. is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0);
  80341. 8020a6a: 6a7b ldr r3, [r7, #36] @ 0x24
  80342. 8020a6c: 691b ldr r3, [r3, #16]
  80343. 8020a6e: 899b ldrh r3, [r3, #12]
  80344. 8020a70: b29b uxth r3, r3
  80345. 8020a72: 4618 mov r0, r3
  80346. 8020a74: f7f8 f850 bl 8018b18 <lwip_htons>
  80347. 8020a78: 4603 mov r3, r0
  80348. 8020a7a: b2db uxtb r3, r3
  80349. 8020a7c: f003 0301 and.w r3, r3, #1
  80350. 8020a80: 2b00 cmp r3, #0
  80351. 8020a82: d005 beq.n 8020a90 <tcp_zero_window_probe+0x70>
  80352. 8020a84: 6a7b ldr r3, [r7, #36] @ 0x24
  80353. 8020a86: 891b ldrh r3, [r3, #8]
  80354. 8020a88: 2b00 cmp r3, #0
  80355. 8020a8a: d101 bne.n 8020a90 <tcp_zero_window_probe+0x70>
  80356. 8020a8c: 2301 movs r3, #1
  80357. 8020a8e: e000 b.n 8020a92 <tcp_zero_window_probe+0x72>
  80358. 8020a90: 2300 movs r3, #0
  80359. 8020a92: f887 3023 strb.w r3, [r7, #35] @ 0x23
  80360. /* we want to send one seqno: either FIN or data (no options) */
  80361. len = is_fin ? 0 : 1;
  80362. 8020a96: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  80363. 8020a9a: 2b00 cmp r3, #0
  80364. 8020a9c: bf0c ite eq
  80365. 8020a9e: 2301 moveq r3, #1
  80366. 8020aa0: 2300 movne r3, #0
  80367. 8020aa2: b2db uxtb r3, r3
  80368. 8020aa4: 843b strh r3, [r7, #32]
  80369. p = tcp_output_alloc_header(pcb, optlen, len, seg->tcphdr->seqno);
  80370. 8020aa6: 7cfb ldrb r3, [r7, #19]
  80371. 8020aa8: b299 uxth r1, r3
  80372. 8020aaa: 6a7b ldr r3, [r7, #36] @ 0x24
  80373. 8020aac: 691b ldr r3, [r3, #16]
  80374. 8020aae: 685b ldr r3, [r3, #4]
  80375. 8020ab0: 8c3a ldrh r2, [r7, #32]
  80376. 8020ab2: 6878 ldr r0, [r7, #4]
  80377. 8020ab4: f7ff fdfa bl 80206ac <tcp_output_alloc_header>
  80378. 8020ab8: 61f8 str r0, [r7, #28]
  80379. if (p == NULL) {
  80380. 8020aba: 69fb ldr r3, [r7, #28]
  80381. 8020abc: 2b00 cmp r3, #0
  80382. 8020abe: d102 bne.n 8020ac6 <tcp_zero_window_probe+0xa6>
  80383. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n"));
  80384. return ERR_MEM;
  80385. 8020ac0: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  80386. 8020ac4: e04c b.n 8020b60 <tcp_zero_window_probe+0x140>
  80387. }
  80388. tcphdr = (struct tcp_hdr *)p->payload;
  80389. 8020ac6: 69fb ldr r3, [r7, #28]
  80390. 8020ac8: 685b ldr r3, [r3, #4]
  80391. 8020aca: 61bb str r3, [r7, #24]
  80392. if (is_fin) {
  80393. 8020acc: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  80394. 8020ad0: 2b00 cmp r3, #0
  80395. 8020ad2: d011 beq.n 8020af8 <tcp_zero_window_probe+0xd8>
  80396. /* FIN segment, no data */
  80397. TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN);
  80398. 8020ad4: 69bb ldr r3, [r7, #24]
  80399. 8020ad6: 899b ldrh r3, [r3, #12]
  80400. 8020ad8: b29b uxth r3, r3
  80401. 8020ada: b21b sxth r3, r3
  80402. 8020adc: f423 537c bic.w r3, r3, #16128 @ 0x3f00
  80403. 8020ae0: b21c sxth r4, r3
  80404. 8020ae2: 2011 movs r0, #17
  80405. 8020ae4: f7f8 f818 bl 8018b18 <lwip_htons>
  80406. 8020ae8: 4603 mov r3, r0
  80407. 8020aea: b21b sxth r3, r3
  80408. 8020aec: 4323 orrs r3, r4
  80409. 8020aee: b21b sxth r3, r3
  80410. 8020af0: b29a uxth r2, r3
  80411. 8020af2: 69bb ldr r3, [r7, #24]
  80412. 8020af4: 819a strh r2, [r3, #12]
  80413. 8020af6: e010 b.n 8020b1a <tcp_zero_window_probe+0xfa>
  80414. } else {
  80415. /* Data segment, copy in one byte from the head of the unacked queue */
  80416. char *d = ((char *)p->payload + TCP_HLEN);
  80417. 8020af8: 69fb ldr r3, [r7, #28]
  80418. 8020afa: 685b ldr r3, [r3, #4]
  80419. 8020afc: 3314 adds r3, #20
  80420. 8020afe: 617b str r3, [r7, #20]
  80421. /* Depending on whether the segment has already been sent (unacked) or not
  80422. (unsent), seg->p->payload points to the IP header or TCP header.
  80423. Ensure we copy the first TCP data byte: */
  80424. pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len);
  80425. 8020b00: 6a7b ldr r3, [r7, #36] @ 0x24
  80426. 8020b02: 6858 ldr r0, [r3, #4]
  80427. 8020b04: 6a7b ldr r3, [r7, #36] @ 0x24
  80428. 8020b06: 685b ldr r3, [r3, #4]
  80429. 8020b08: 891a ldrh r2, [r3, #8]
  80430. 8020b0a: 6a7b ldr r3, [r7, #36] @ 0x24
  80431. 8020b0c: 891b ldrh r3, [r3, #8]
  80432. 8020b0e: 1ad3 subs r3, r2, r3
  80433. 8020b10: b29b uxth r3, r3
  80434. 8020b12: 2201 movs r2, #1
  80435. 8020b14: 6979 ldr r1, [r7, #20]
  80436. 8020b16: f7f9 fee7 bl 801a8e8 <pbuf_copy_partial>
  80437. }
  80438. /* The byte may be acknowledged without the window being opened. */
  80439. snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + 1;
  80440. 8020b1a: 6a7b ldr r3, [r7, #36] @ 0x24
  80441. 8020b1c: 691b ldr r3, [r3, #16]
  80442. 8020b1e: 685b ldr r3, [r3, #4]
  80443. 8020b20: 4618 mov r0, r3
  80444. 8020b22: f7f8 f80e bl 8018b42 <lwip_htonl>
  80445. 8020b26: 4603 mov r3, r0
  80446. 8020b28: 3301 adds r3, #1
  80447. 8020b2a: 60fb str r3, [r7, #12]
  80448. if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
  80449. 8020b2c: 687b ldr r3, [r7, #4]
  80450. 8020b2e: 6d1a ldr r2, [r3, #80] @ 0x50
  80451. 8020b30: 68fb ldr r3, [r7, #12]
  80452. 8020b32: 1ad3 subs r3, r2, r3
  80453. 8020b34: 2b00 cmp r3, #0
  80454. 8020b36: da02 bge.n 8020b3e <tcp_zero_window_probe+0x11e>
  80455. pcb->snd_nxt = snd_nxt;
  80456. 8020b38: 687b ldr r3, [r7, #4]
  80457. 8020b3a: 68fa ldr r2, [r7, #12]
  80458. 8020b3c: 651a str r2, [r3, #80] @ 0x50
  80459. }
  80460. tcp_output_fill_options(pcb, p, 0, optlen);
  80461. 8020b3e: 7cfb ldrb r3, [r7, #19]
  80462. 8020b40: 2200 movs r2, #0
  80463. 8020b42: 69f9 ldr r1, [r7, #28]
  80464. 8020b44: 6878 ldr r0, [r7, #4]
  80465. 8020b46: f7ff fdef bl 8020728 <tcp_output_fill_options>
  80466. err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip);
  80467. 8020b4a: 687a ldr r2, [r7, #4]
  80468. 8020b4c: 687b ldr r3, [r7, #4]
  80469. 8020b4e: 3304 adds r3, #4
  80470. 8020b50: 69f9 ldr r1, [r7, #28]
  80471. 8020b52: 6878 ldr r0, [r7, #4]
  80472. 8020b54: f7ff fe26 bl 80207a4 <tcp_output_control_segment>
  80473. 8020b58: 4603 mov r3, r0
  80474. 8020b5a: 72fb strb r3, [r7, #11]
  80475. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F
  80476. " ackno %"U32_F" err %d.\n",
  80477. pcb->snd_nxt - 1, pcb->rcv_nxt, (int)err));
  80478. return err;
  80479. 8020b5c: f997 300b ldrsb.w r3, [r7, #11]
  80480. }
  80481. 8020b60: 4618 mov r0, r3
  80482. 8020b62: 372c adds r7, #44 @ 0x2c
  80483. 8020b64: 46bd mov sp, r7
  80484. 8020b66: bd90 pop {r4, r7, pc}
  80485. 8020b68: 0802f190 .word 0x0802f190
  80486. 8020b6c: 0802f9e4 .word 0x0802f9e4
  80487. 8020b70: 0802f1e4 .word 0x0802f1e4
  80488. 08020b74 <tcpip_tcp_timer>:
  80489. *
  80490. * @param arg unused argument
  80491. */
  80492. static void
  80493. tcpip_tcp_timer(void *arg)
  80494. {
  80495. 8020b74: b580 push {r7, lr}
  80496. 8020b76: b082 sub sp, #8
  80497. 8020b78: af00 add r7, sp, #0
  80498. 8020b7a: 6078 str r0, [r7, #4]
  80499. LWIP_UNUSED_ARG(arg);
  80500. /* call TCP timer handler */
  80501. tcp_tmr();
  80502. 8020b7c: f7f9 ffa2 bl 801aac4 <tcp_tmr>
  80503. /* timer still needed? */
  80504. if (tcp_active_pcbs || tcp_tw_pcbs) {
  80505. 8020b80: 4b0a ldr r3, [pc, #40] @ (8020bac <tcpip_tcp_timer+0x38>)
  80506. 8020b82: 681b ldr r3, [r3, #0]
  80507. 8020b84: 2b00 cmp r3, #0
  80508. 8020b86: d103 bne.n 8020b90 <tcpip_tcp_timer+0x1c>
  80509. 8020b88: 4b09 ldr r3, [pc, #36] @ (8020bb0 <tcpip_tcp_timer+0x3c>)
  80510. 8020b8a: 681b ldr r3, [r3, #0]
  80511. 8020b8c: 2b00 cmp r3, #0
  80512. 8020b8e: d005 beq.n 8020b9c <tcpip_tcp_timer+0x28>
  80513. /* restart timer */
  80514. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  80515. 8020b90: 2200 movs r2, #0
  80516. 8020b92: 4908 ldr r1, [pc, #32] @ (8020bb4 <tcpip_tcp_timer+0x40>)
  80517. 8020b94: 20fa movs r0, #250 @ 0xfa
  80518. 8020b96: f000 f8f5 bl 8020d84 <sys_timeout>
  80519. 8020b9a: e003 b.n 8020ba4 <tcpip_tcp_timer+0x30>
  80520. } else {
  80521. /* disable timer */
  80522. tcpip_tcp_timer_active = 0;
  80523. 8020b9c: 4b06 ldr r3, [pc, #24] @ (8020bb8 <tcpip_tcp_timer+0x44>)
  80524. 8020b9e: 2200 movs r2, #0
  80525. 8020ba0: 601a str r2, [r3, #0]
  80526. }
  80527. }
  80528. 8020ba2: bf00 nop
  80529. 8020ba4: bf00 nop
  80530. 8020ba6: 3708 adds r7, #8
  80531. 8020ba8: 46bd mov sp, r7
  80532. 8020baa: bd80 pop {r7, pc}
  80533. 8020bac: 2402ae94 .word 0x2402ae94
  80534. 8020bb0: 2402ae98 .word 0x2402ae98
  80535. 8020bb4: 08020b75 .word 0x08020b75
  80536. 8020bb8: 2402aee4 .word 0x2402aee4
  80537. 08020bbc <tcp_timer_needed>:
  80538. * the reason is to have the TCP timer only running when
  80539. * there are active (or time-wait) PCBs.
  80540. */
  80541. void
  80542. tcp_timer_needed(void)
  80543. {
  80544. 8020bbc: b580 push {r7, lr}
  80545. 8020bbe: af00 add r7, sp, #0
  80546. LWIP_ASSERT_CORE_LOCKED();
  80547. 8020bc0: f7ef fcb6 bl 8010530 <sys_check_core_locking>
  80548. /* timer is off but needed again? */
  80549. if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
  80550. 8020bc4: 4b0a ldr r3, [pc, #40] @ (8020bf0 <tcp_timer_needed+0x34>)
  80551. 8020bc6: 681b ldr r3, [r3, #0]
  80552. 8020bc8: 2b00 cmp r3, #0
  80553. 8020bca: d10f bne.n 8020bec <tcp_timer_needed+0x30>
  80554. 8020bcc: 4b09 ldr r3, [pc, #36] @ (8020bf4 <tcp_timer_needed+0x38>)
  80555. 8020bce: 681b ldr r3, [r3, #0]
  80556. 8020bd0: 2b00 cmp r3, #0
  80557. 8020bd2: d103 bne.n 8020bdc <tcp_timer_needed+0x20>
  80558. 8020bd4: 4b08 ldr r3, [pc, #32] @ (8020bf8 <tcp_timer_needed+0x3c>)
  80559. 8020bd6: 681b ldr r3, [r3, #0]
  80560. 8020bd8: 2b00 cmp r3, #0
  80561. 8020bda: d007 beq.n 8020bec <tcp_timer_needed+0x30>
  80562. /* enable and start timer */
  80563. tcpip_tcp_timer_active = 1;
  80564. 8020bdc: 4b04 ldr r3, [pc, #16] @ (8020bf0 <tcp_timer_needed+0x34>)
  80565. 8020bde: 2201 movs r2, #1
  80566. 8020be0: 601a str r2, [r3, #0]
  80567. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  80568. 8020be2: 2200 movs r2, #0
  80569. 8020be4: 4905 ldr r1, [pc, #20] @ (8020bfc <tcp_timer_needed+0x40>)
  80570. 8020be6: 20fa movs r0, #250 @ 0xfa
  80571. 8020be8: f000 f8cc bl 8020d84 <sys_timeout>
  80572. }
  80573. }
  80574. 8020bec: bf00 nop
  80575. 8020bee: bd80 pop {r7, pc}
  80576. 8020bf0: 2402aee4 .word 0x2402aee4
  80577. 8020bf4: 2402ae94 .word 0x2402ae94
  80578. 8020bf8: 2402ae98 .word 0x2402ae98
  80579. 8020bfc: 08020b75 .word 0x08020b75
  80580. 08020c00 <sys_timeout_abs>:
  80581. #if LWIP_DEBUG_TIMERNAMES
  80582. sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg, const char *handler_name)
  80583. #else /* LWIP_DEBUG_TIMERNAMES */
  80584. sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg)
  80585. #endif
  80586. {
  80587. 8020c00: b580 push {r7, lr}
  80588. 8020c02: b086 sub sp, #24
  80589. 8020c04: af00 add r7, sp, #0
  80590. 8020c06: 60f8 str r0, [r7, #12]
  80591. 8020c08: 60b9 str r1, [r7, #8]
  80592. 8020c0a: 607a str r2, [r7, #4]
  80593. struct sys_timeo *timeout, *t;
  80594. timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
  80595. 8020c0c: 200a movs r0, #10
  80596. 8020c0e: f7f8 fd01 bl 8019614 <memp_malloc>
  80597. 8020c12: 6138 str r0, [r7, #16]
  80598. if (timeout == NULL) {
  80599. 8020c14: 693b ldr r3, [r7, #16]
  80600. 8020c16: 2b00 cmp r3, #0
  80601. 8020c18: d109 bne.n 8020c2e <sys_timeout_abs+0x2e>
  80602. LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL);
  80603. 8020c1a: 693b ldr r3, [r7, #16]
  80604. 8020c1c: 2b00 cmp r3, #0
  80605. 8020c1e: d151 bne.n 8020cc4 <sys_timeout_abs+0xc4>
  80606. 8020c20: 4b2a ldr r3, [pc, #168] @ (8020ccc <sys_timeout_abs+0xcc>)
  80607. 8020c22: 22be movs r2, #190 @ 0xbe
  80608. 8020c24: 492a ldr r1, [pc, #168] @ (8020cd0 <sys_timeout_abs+0xd0>)
  80609. 8020c26: 482b ldr r0, [pc, #172] @ (8020cd4 <sys_timeout_abs+0xd4>)
  80610. 8020c28: f008 fed0 bl 80299cc <iprintf>
  80611. return;
  80612. 8020c2c: e04a b.n 8020cc4 <sys_timeout_abs+0xc4>
  80613. }
  80614. timeout->next = NULL;
  80615. 8020c2e: 693b ldr r3, [r7, #16]
  80616. 8020c30: 2200 movs r2, #0
  80617. 8020c32: 601a str r2, [r3, #0]
  80618. timeout->h = handler;
  80619. 8020c34: 693b ldr r3, [r7, #16]
  80620. 8020c36: 68ba ldr r2, [r7, #8]
  80621. 8020c38: 609a str r2, [r3, #8]
  80622. timeout->arg = arg;
  80623. 8020c3a: 693b ldr r3, [r7, #16]
  80624. 8020c3c: 687a ldr r2, [r7, #4]
  80625. 8020c3e: 60da str r2, [r3, #12]
  80626. timeout->time = abs_time;
  80627. 8020c40: 693b ldr r3, [r7, #16]
  80628. 8020c42: 68fa ldr r2, [r7, #12]
  80629. 8020c44: 605a str r2, [r3, #4]
  80630. timeout->handler_name = handler_name;
  80631. LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p abs_time=%"U32_F" handler=%s arg=%p\n",
  80632. (void *)timeout, abs_time, handler_name, (void *)arg));
  80633. #endif /* LWIP_DEBUG_TIMERNAMES */
  80634. if (next_timeout == NULL) {
  80635. 8020c46: 4b24 ldr r3, [pc, #144] @ (8020cd8 <sys_timeout_abs+0xd8>)
  80636. 8020c48: 681b ldr r3, [r3, #0]
  80637. 8020c4a: 2b00 cmp r3, #0
  80638. 8020c4c: d103 bne.n 8020c56 <sys_timeout_abs+0x56>
  80639. next_timeout = timeout;
  80640. 8020c4e: 4a22 ldr r2, [pc, #136] @ (8020cd8 <sys_timeout_abs+0xd8>)
  80641. 8020c50: 693b ldr r3, [r7, #16]
  80642. 8020c52: 6013 str r3, [r2, #0]
  80643. return;
  80644. 8020c54: e037 b.n 8020cc6 <sys_timeout_abs+0xc6>
  80645. }
  80646. if (TIME_LESS_THAN(timeout->time, next_timeout->time)) {
  80647. 8020c56: 693b ldr r3, [r7, #16]
  80648. 8020c58: 685a ldr r2, [r3, #4]
  80649. 8020c5a: 4b1f ldr r3, [pc, #124] @ (8020cd8 <sys_timeout_abs+0xd8>)
  80650. 8020c5c: 681b ldr r3, [r3, #0]
  80651. 8020c5e: 685b ldr r3, [r3, #4]
  80652. 8020c60: 1ad3 subs r3, r2, r3
  80653. 8020c62: 0fdb lsrs r3, r3, #31
  80654. 8020c64: f003 0301 and.w r3, r3, #1
  80655. 8020c68: b2db uxtb r3, r3
  80656. 8020c6a: 2b00 cmp r3, #0
  80657. 8020c6c: d007 beq.n 8020c7e <sys_timeout_abs+0x7e>
  80658. timeout->next = next_timeout;
  80659. 8020c6e: 4b1a ldr r3, [pc, #104] @ (8020cd8 <sys_timeout_abs+0xd8>)
  80660. 8020c70: 681a ldr r2, [r3, #0]
  80661. 8020c72: 693b ldr r3, [r7, #16]
  80662. 8020c74: 601a str r2, [r3, #0]
  80663. next_timeout = timeout;
  80664. 8020c76: 4a18 ldr r2, [pc, #96] @ (8020cd8 <sys_timeout_abs+0xd8>)
  80665. 8020c78: 693b ldr r3, [r7, #16]
  80666. 8020c7a: 6013 str r3, [r2, #0]
  80667. 8020c7c: e023 b.n 8020cc6 <sys_timeout_abs+0xc6>
  80668. } else {
  80669. for (t = next_timeout; t != NULL; t = t->next) {
  80670. 8020c7e: 4b16 ldr r3, [pc, #88] @ (8020cd8 <sys_timeout_abs+0xd8>)
  80671. 8020c80: 681b ldr r3, [r3, #0]
  80672. 8020c82: 617b str r3, [r7, #20]
  80673. 8020c84: e01a b.n 8020cbc <sys_timeout_abs+0xbc>
  80674. if ((t->next == NULL) || TIME_LESS_THAN(timeout->time, t->next->time)) {
  80675. 8020c86: 697b ldr r3, [r7, #20]
  80676. 8020c88: 681b ldr r3, [r3, #0]
  80677. 8020c8a: 2b00 cmp r3, #0
  80678. 8020c8c: d00b beq.n 8020ca6 <sys_timeout_abs+0xa6>
  80679. 8020c8e: 693b ldr r3, [r7, #16]
  80680. 8020c90: 685a ldr r2, [r3, #4]
  80681. 8020c92: 697b ldr r3, [r7, #20]
  80682. 8020c94: 681b ldr r3, [r3, #0]
  80683. 8020c96: 685b ldr r3, [r3, #4]
  80684. 8020c98: 1ad3 subs r3, r2, r3
  80685. 8020c9a: 0fdb lsrs r3, r3, #31
  80686. 8020c9c: f003 0301 and.w r3, r3, #1
  80687. 8020ca0: b2db uxtb r3, r3
  80688. 8020ca2: 2b00 cmp r3, #0
  80689. 8020ca4: d007 beq.n 8020cb6 <sys_timeout_abs+0xb6>
  80690. timeout->next = t->next;
  80691. 8020ca6: 697b ldr r3, [r7, #20]
  80692. 8020ca8: 681a ldr r2, [r3, #0]
  80693. 8020caa: 693b ldr r3, [r7, #16]
  80694. 8020cac: 601a str r2, [r3, #0]
  80695. t->next = timeout;
  80696. 8020cae: 697b ldr r3, [r7, #20]
  80697. 8020cb0: 693a ldr r2, [r7, #16]
  80698. 8020cb2: 601a str r2, [r3, #0]
  80699. break;
  80700. 8020cb4: e007 b.n 8020cc6 <sys_timeout_abs+0xc6>
  80701. for (t = next_timeout; t != NULL; t = t->next) {
  80702. 8020cb6: 697b ldr r3, [r7, #20]
  80703. 8020cb8: 681b ldr r3, [r3, #0]
  80704. 8020cba: 617b str r3, [r7, #20]
  80705. 8020cbc: 697b ldr r3, [r7, #20]
  80706. 8020cbe: 2b00 cmp r3, #0
  80707. 8020cc0: d1e1 bne.n 8020c86 <sys_timeout_abs+0x86>
  80708. 8020cc2: e000 b.n 8020cc6 <sys_timeout_abs+0xc6>
  80709. return;
  80710. 8020cc4: bf00 nop
  80711. }
  80712. }
  80713. }
  80714. }
  80715. 8020cc6: 3718 adds r7, #24
  80716. 8020cc8: 46bd mov sp, r7
  80717. 8020cca: bd80 pop {r7, pc}
  80718. 8020ccc: 0802fa08 .word 0x0802fa08
  80719. 8020cd0: 0802fa3c .word 0x0802fa3c
  80720. 8020cd4: 0802fa7c .word 0x0802fa7c
  80721. 8020cd8: 2402aedc .word 0x2402aedc
  80722. 08020cdc <lwip_cyclic_timer>:
  80723. #if !LWIP_TESTMODE
  80724. static
  80725. #endif
  80726. void
  80727. lwip_cyclic_timer(void *arg)
  80728. {
  80729. 8020cdc: b580 push {r7, lr}
  80730. 8020cde: b086 sub sp, #24
  80731. 8020ce0: af00 add r7, sp, #0
  80732. 8020ce2: 6078 str r0, [r7, #4]
  80733. u32_t now;
  80734. u32_t next_timeout_time;
  80735. const struct lwip_cyclic_timer *cyclic = (const struct lwip_cyclic_timer *)arg;
  80736. 8020ce4: 687b ldr r3, [r7, #4]
  80737. 8020ce6: 617b str r3, [r7, #20]
  80738. #if LWIP_DEBUG_TIMERNAMES
  80739. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: %s()\n", cyclic->handler_name));
  80740. #endif
  80741. cyclic->handler();
  80742. 8020ce8: 697b ldr r3, [r7, #20]
  80743. 8020cea: 685b ldr r3, [r3, #4]
  80744. 8020cec: 4798 blx r3
  80745. now = sys_now();
  80746. 8020cee: f7ef f983 bl 800fff8 <sys_now>
  80747. 8020cf2: 6138 str r0, [r7, #16]
  80748. next_timeout_time = (u32_t)(current_timeout_due_time + cyclic->interval_ms); /* overflow handled by TIME_LESS_THAN macro */
  80749. 8020cf4: 697b ldr r3, [r7, #20]
  80750. 8020cf6: 681a ldr r2, [r3, #0]
  80751. 8020cf8: 4b0f ldr r3, [pc, #60] @ (8020d38 <lwip_cyclic_timer+0x5c>)
  80752. 8020cfa: 681b ldr r3, [r3, #0]
  80753. 8020cfc: 4413 add r3, r2
  80754. 8020cfe: 60fb str r3, [r7, #12]
  80755. if (TIME_LESS_THAN(next_timeout_time, now)) {
  80756. 8020d00: 68fa ldr r2, [r7, #12]
  80757. 8020d02: 693b ldr r3, [r7, #16]
  80758. 8020d04: 1ad3 subs r3, r2, r3
  80759. 8020d06: 0fdb lsrs r3, r3, #31
  80760. 8020d08: f003 0301 and.w r3, r3, #1
  80761. 8020d0c: b2db uxtb r3, r3
  80762. 8020d0e: 2b00 cmp r3, #0
  80763. 8020d10: d009 beq.n 8020d26 <lwip_cyclic_timer+0x4a>
  80764. /* timer would immediately expire again -> "overload" -> restart without any correction */
  80765. #if LWIP_DEBUG_TIMERNAMES
  80766. sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg, cyclic->handler_name);
  80767. #else
  80768. sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg);
  80769. 8020d12: 697b ldr r3, [r7, #20]
  80770. 8020d14: 681a ldr r2, [r3, #0]
  80771. 8020d16: 693b ldr r3, [r7, #16]
  80772. 8020d18: 4413 add r3, r2
  80773. 8020d1a: 687a ldr r2, [r7, #4]
  80774. 8020d1c: 4907 ldr r1, [pc, #28] @ (8020d3c <lwip_cyclic_timer+0x60>)
  80775. 8020d1e: 4618 mov r0, r3
  80776. 8020d20: f7ff ff6e bl 8020c00 <sys_timeout_abs>
  80777. sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg, cyclic->handler_name);
  80778. #else
  80779. sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg);
  80780. #endif
  80781. }
  80782. }
  80783. 8020d24: e004 b.n 8020d30 <lwip_cyclic_timer+0x54>
  80784. sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg);
  80785. 8020d26: 687a ldr r2, [r7, #4]
  80786. 8020d28: 4904 ldr r1, [pc, #16] @ (8020d3c <lwip_cyclic_timer+0x60>)
  80787. 8020d2a: 68f8 ldr r0, [r7, #12]
  80788. 8020d2c: f7ff ff68 bl 8020c00 <sys_timeout_abs>
  80789. }
  80790. 8020d30: bf00 nop
  80791. 8020d32: 3718 adds r7, #24
  80792. 8020d34: 46bd mov sp, r7
  80793. 8020d36: bd80 pop {r7, pc}
  80794. 8020d38: 2402aee0 .word 0x2402aee0
  80795. 8020d3c: 08020cdd .word 0x08020cdd
  80796. 08020d40 <sys_timeouts_init>:
  80797. /** Initialize this module */
  80798. void sys_timeouts_init(void)
  80799. {
  80800. 8020d40: b580 push {r7, lr}
  80801. 8020d42: b082 sub sp, #8
  80802. 8020d44: af00 add r7, sp, #0
  80803. size_t i;
  80804. /* tcp_tmr() at index 0 is started on demand */
  80805. for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) {
  80806. 8020d46: 2301 movs r3, #1
  80807. 8020d48: 607b str r3, [r7, #4]
  80808. 8020d4a: e00e b.n 8020d6a <sys_timeouts_init+0x2a>
  80809. /* we have to cast via size_t to get rid of const warning
  80810. (this is OK as cyclic_timer() casts back to const* */
  80811. sys_timeout(lwip_cyclic_timers[i].interval_ms, lwip_cyclic_timer, LWIP_CONST_CAST(void *, &lwip_cyclic_timers[i]));
  80812. 8020d4c: 4a0b ldr r2, [pc, #44] @ (8020d7c <sys_timeouts_init+0x3c>)
  80813. 8020d4e: 687b ldr r3, [r7, #4]
  80814. 8020d50: f852 0033 ldr.w r0, [r2, r3, lsl #3]
  80815. 8020d54: 687b ldr r3, [r7, #4]
  80816. 8020d56: 00db lsls r3, r3, #3
  80817. 8020d58: 4a08 ldr r2, [pc, #32] @ (8020d7c <sys_timeouts_init+0x3c>)
  80818. 8020d5a: 4413 add r3, r2
  80819. 8020d5c: 461a mov r2, r3
  80820. 8020d5e: 4908 ldr r1, [pc, #32] @ (8020d80 <sys_timeouts_init+0x40>)
  80821. 8020d60: f000 f810 bl 8020d84 <sys_timeout>
  80822. for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) {
  80823. 8020d64: 687b ldr r3, [r7, #4]
  80824. 8020d66: 3301 adds r3, #1
  80825. 8020d68: 607b str r3, [r7, #4]
  80826. 8020d6a: 687b ldr r3, [r7, #4]
  80827. 8020d6c: 2b04 cmp r3, #4
  80828. 8020d6e: d9ed bls.n 8020d4c <sys_timeouts_init+0xc>
  80829. }
  80830. }
  80831. 8020d70: bf00 nop
  80832. 8020d72: bf00 nop
  80833. 8020d74: 3708 adds r7, #8
  80834. 8020d76: 46bd mov sp, r7
  80835. 8020d78: bd80 pop {r7, pc}
  80836. 8020d7a: bf00 nop
  80837. 8020d7c: 08030be8 .word 0x08030be8
  80838. 8020d80: 08020cdd .word 0x08020cdd
  80839. 08020d84 <sys_timeout>:
  80840. sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char *handler_name)
  80841. #else /* LWIP_DEBUG_TIMERNAMES */
  80842. void
  80843. sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
  80844. #endif /* LWIP_DEBUG_TIMERNAMES */
  80845. {
  80846. 8020d84: b580 push {r7, lr}
  80847. 8020d86: b086 sub sp, #24
  80848. 8020d88: af00 add r7, sp, #0
  80849. 8020d8a: 60f8 str r0, [r7, #12]
  80850. 8020d8c: 60b9 str r1, [r7, #8]
  80851. 8020d8e: 607a str r2, [r7, #4]
  80852. u32_t next_timeout_time;
  80853. LWIP_ASSERT_CORE_LOCKED();
  80854. 8020d90: f7ef fbce bl 8010530 <sys_check_core_locking>
  80855. LWIP_ASSERT("Timeout time too long, max is LWIP_UINT32_MAX/4 msecs", msecs <= (LWIP_UINT32_MAX / 4));
  80856. 8020d94: 68fb ldr r3, [r7, #12]
  80857. 8020d96: f1b3 4f80 cmp.w r3, #1073741824 @ 0x40000000
  80858. 8020d9a: d306 bcc.n 8020daa <sys_timeout+0x26>
  80859. 8020d9c: 4b0a ldr r3, [pc, #40] @ (8020dc8 <sys_timeout+0x44>)
  80860. 8020d9e: f240 1229 movw r2, #297 @ 0x129
  80861. 8020da2: 490a ldr r1, [pc, #40] @ (8020dcc <sys_timeout+0x48>)
  80862. 8020da4: 480a ldr r0, [pc, #40] @ (8020dd0 <sys_timeout+0x4c>)
  80863. 8020da6: f008 fe11 bl 80299cc <iprintf>
  80864. next_timeout_time = (u32_t)(sys_now() + msecs); /* overflow handled by TIME_LESS_THAN macro */
  80865. 8020daa: f7ef f925 bl 800fff8 <sys_now>
  80866. 8020dae: 4602 mov r2, r0
  80867. 8020db0: 68fb ldr r3, [r7, #12]
  80868. 8020db2: 4413 add r3, r2
  80869. 8020db4: 617b str r3, [r7, #20]
  80870. #if LWIP_DEBUG_TIMERNAMES
  80871. sys_timeout_abs(next_timeout_time, handler, arg, handler_name);
  80872. #else
  80873. sys_timeout_abs(next_timeout_time, handler, arg);
  80874. 8020db6: 687a ldr r2, [r7, #4]
  80875. 8020db8: 68b9 ldr r1, [r7, #8]
  80876. 8020dba: 6978 ldr r0, [r7, #20]
  80877. 8020dbc: f7ff ff20 bl 8020c00 <sys_timeout_abs>
  80878. #endif
  80879. }
  80880. 8020dc0: bf00 nop
  80881. 8020dc2: 3718 adds r7, #24
  80882. 8020dc4: 46bd mov sp, r7
  80883. 8020dc6: bd80 pop {r7, pc}
  80884. 8020dc8: 0802fa08 .word 0x0802fa08
  80885. 8020dcc: 0802faa4 .word 0x0802faa4
  80886. 8020dd0: 0802fa7c .word 0x0802fa7c
  80887. 08020dd4 <sys_check_timeouts>:
  80888. *
  80889. * Must be called periodically from your main loop.
  80890. */
  80891. void
  80892. sys_check_timeouts(void)
  80893. {
  80894. 8020dd4: b580 push {r7, lr}
  80895. 8020dd6: b084 sub sp, #16
  80896. 8020dd8: af00 add r7, sp, #0
  80897. u32_t now;
  80898. LWIP_ASSERT_CORE_LOCKED();
  80899. 8020dda: f7ef fba9 bl 8010530 <sys_check_core_locking>
  80900. /* Process only timers expired at the start of the function. */
  80901. now = sys_now();
  80902. 8020dde: f7ef f90b bl 800fff8 <sys_now>
  80903. 8020de2: 60f8 str r0, [r7, #12]
  80904. sys_timeout_handler handler;
  80905. void *arg;
  80906. PBUF_CHECK_FREE_OOSEQ();
  80907. tmptimeout = next_timeout;
  80908. 8020de4: 4b17 ldr r3, [pc, #92] @ (8020e44 <sys_check_timeouts+0x70>)
  80909. 8020de6: 681b ldr r3, [r3, #0]
  80910. 8020de8: 60bb str r3, [r7, #8]
  80911. if (tmptimeout == NULL) {
  80912. 8020dea: 68bb ldr r3, [r7, #8]
  80913. 8020dec: 2b00 cmp r3, #0
  80914. 8020dee: d022 beq.n 8020e36 <sys_check_timeouts+0x62>
  80915. return;
  80916. }
  80917. if (TIME_LESS_THAN(now, tmptimeout->time)) {
  80918. 8020df0: 68bb ldr r3, [r7, #8]
  80919. 8020df2: 685b ldr r3, [r3, #4]
  80920. 8020df4: 68fa ldr r2, [r7, #12]
  80921. 8020df6: 1ad3 subs r3, r2, r3
  80922. 8020df8: 0fdb lsrs r3, r3, #31
  80923. 8020dfa: f003 0301 and.w r3, r3, #1
  80924. 8020dfe: b2db uxtb r3, r3
  80925. 8020e00: 2b00 cmp r3, #0
  80926. 8020e02: d11a bne.n 8020e3a <sys_check_timeouts+0x66>
  80927. return;
  80928. }
  80929. /* Timeout has expired */
  80930. next_timeout = tmptimeout->next;
  80931. 8020e04: 68bb ldr r3, [r7, #8]
  80932. 8020e06: 681b ldr r3, [r3, #0]
  80933. 8020e08: 4a0e ldr r2, [pc, #56] @ (8020e44 <sys_check_timeouts+0x70>)
  80934. 8020e0a: 6013 str r3, [r2, #0]
  80935. handler = tmptimeout->h;
  80936. 8020e0c: 68bb ldr r3, [r7, #8]
  80937. 8020e0e: 689b ldr r3, [r3, #8]
  80938. 8020e10: 607b str r3, [r7, #4]
  80939. arg = tmptimeout->arg;
  80940. 8020e12: 68bb ldr r3, [r7, #8]
  80941. 8020e14: 68db ldr r3, [r3, #12]
  80942. 8020e16: 603b str r3, [r7, #0]
  80943. current_timeout_due_time = tmptimeout->time;
  80944. 8020e18: 68bb ldr r3, [r7, #8]
  80945. 8020e1a: 685b ldr r3, [r3, #4]
  80946. 8020e1c: 4a0a ldr r2, [pc, #40] @ (8020e48 <sys_check_timeouts+0x74>)
  80947. 8020e1e: 6013 str r3, [r2, #0]
  80948. if (handler != NULL) {
  80949. LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s t=%"U32_F" arg=%p\n",
  80950. tmptimeout->handler_name, sys_now() - tmptimeout->time, arg));
  80951. }
  80952. #endif /* LWIP_DEBUG_TIMERNAMES */
  80953. memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
  80954. 8020e20: 68b9 ldr r1, [r7, #8]
  80955. 8020e22: 200a movs r0, #10
  80956. 8020e24: f7f8 fc6c bl 8019700 <memp_free>
  80957. if (handler != NULL) {
  80958. 8020e28: 687b ldr r3, [r7, #4]
  80959. 8020e2a: 2b00 cmp r3, #0
  80960. 8020e2c: d0da beq.n 8020de4 <sys_check_timeouts+0x10>
  80961. handler(arg);
  80962. 8020e2e: 687b ldr r3, [r7, #4]
  80963. 8020e30: 6838 ldr r0, [r7, #0]
  80964. 8020e32: 4798 blx r3
  80965. do {
  80966. 8020e34: e7d6 b.n 8020de4 <sys_check_timeouts+0x10>
  80967. return;
  80968. 8020e36: bf00 nop
  80969. 8020e38: e000 b.n 8020e3c <sys_check_timeouts+0x68>
  80970. return;
  80971. 8020e3a: bf00 nop
  80972. }
  80973. LWIP_TCPIP_THREAD_ALIVE();
  80974. /* Repeat until all expired timers have been called */
  80975. } while (1);
  80976. }
  80977. 8020e3c: 3710 adds r7, #16
  80978. 8020e3e: 46bd mov sp, r7
  80979. 8020e40: bd80 pop {r7, pc}
  80980. 8020e42: bf00 nop
  80981. 8020e44: 2402aedc .word 0x2402aedc
  80982. 8020e48: 2402aee0 .word 0x2402aee0
  80983. 08020e4c <sys_timeouts_sleeptime>:
  80984. /** Return the time left before the next timeout is due. If no timeouts are
  80985. * enqueued, returns 0xffffffff
  80986. */
  80987. u32_t
  80988. sys_timeouts_sleeptime(void)
  80989. {
  80990. 8020e4c: b580 push {r7, lr}
  80991. 8020e4e: b082 sub sp, #8
  80992. 8020e50: af00 add r7, sp, #0
  80993. u32_t now;
  80994. LWIP_ASSERT_CORE_LOCKED();
  80995. 8020e52: f7ef fb6d bl 8010530 <sys_check_core_locking>
  80996. if (next_timeout == NULL) {
  80997. 8020e56: 4b16 ldr r3, [pc, #88] @ (8020eb0 <sys_timeouts_sleeptime+0x64>)
  80998. 8020e58: 681b ldr r3, [r3, #0]
  80999. 8020e5a: 2b00 cmp r3, #0
  81000. 8020e5c: d102 bne.n 8020e64 <sys_timeouts_sleeptime+0x18>
  81001. return SYS_TIMEOUTS_SLEEPTIME_INFINITE;
  81002. 8020e5e: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  81003. 8020e62: e020 b.n 8020ea6 <sys_timeouts_sleeptime+0x5a>
  81004. }
  81005. now = sys_now();
  81006. 8020e64: f7ef f8c8 bl 800fff8 <sys_now>
  81007. 8020e68: 6078 str r0, [r7, #4]
  81008. if (TIME_LESS_THAN(next_timeout->time, now)) {
  81009. 8020e6a: 4b11 ldr r3, [pc, #68] @ (8020eb0 <sys_timeouts_sleeptime+0x64>)
  81010. 8020e6c: 681b ldr r3, [r3, #0]
  81011. 8020e6e: 685a ldr r2, [r3, #4]
  81012. 8020e70: 687b ldr r3, [r7, #4]
  81013. 8020e72: 1ad3 subs r3, r2, r3
  81014. 8020e74: 0fdb lsrs r3, r3, #31
  81015. 8020e76: f003 0301 and.w r3, r3, #1
  81016. 8020e7a: b2db uxtb r3, r3
  81017. 8020e7c: 2b00 cmp r3, #0
  81018. 8020e7e: d001 beq.n 8020e84 <sys_timeouts_sleeptime+0x38>
  81019. return 0;
  81020. 8020e80: 2300 movs r3, #0
  81021. 8020e82: e010 b.n 8020ea6 <sys_timeouts_sleeptime+0x5a>
  81022. } else {
  81023. u32_t ret = (u32_t)(next_timeout->time - now);
  81024. 8020e84: 4b0a ldr r3, [pc, #40] @ (8020eb0 <sys_timeouts_sleeptime+0x64>)
  81025. 8020e86: 681b ldr r3, [r3, #0]
  81026. 8020e88: 685a ldr r2, [r3, #4]
  81027. 8020e8a: 687b ldr r3, [r7, #4]
  81028. 8020e8c: 1ad3 subs r3, r2, r3
  81029. 8020e8e: 603b str r3, [r7, #0]
  81030. LWIP_ASSERT("invalid sleeptime", ret <= LWIP_MAX_TIMEOUT);
  81031. 8020e90: 683b ldr r3, [r7, #0]
  81032. 8020e92: 2b00 cmp r3, #0
  81033. 8020e94: da06 bge.n 8020ea4 <sys_timeouts_sleeptime+0x58>
  81034. 8020e96: 4b07 ldr r3, [pc, #28] @ (8020eb4 <sys_timeouts_sleeptime+0x68>)
  81035. 8020e98: f44f 72dc mov.w r2, #440 @ 0x1b8
  81036. 8020e9c: 4906 ldr r1, [pc, #24] @ (8020eb8 <sys_timeouts_sleeptime+0x6c>)
  81037. 8020e9e: 4807 ldr r0, [pc, #28] @ (8020ebc <sys_timeouts_sleeptime+0x70>)
  81038. 8020ea0: f008 fd94 bl 80299cc <iprintf>
  81039. return ret;
  81040. 8020ea4: 683b ldr r3, [r7, #0]
  81041. }
  81042. }
  81043. 8020ea6: 4618 mov r0, r3
  81044. 8020ea8: 3708 adds r7, #8
  81045. 8020eaa: 46bd mov sp, r7
  81046. 8020eac: bd80 pop {r7, pc}
  81047. 8020eae: bf00 nop
  81048. 8020eb0: 2402aedc .word 0x2402aedc
  81049. 8020eb4: 0802fa08 .word 0x0802fa08
  81050. 8020eb8: 0802fadc .word 0x0802fadc
  81051. 8020ebc: 0802fa7c .word 0x0802fa7c
  81052. 08020ec0 <udp_init>:
  81053. /**
  81054. * Initialize this module.
  81055. */
  81056. void
  81057. udp_init(void)
  81058. {
  81059. 8020ec0: b580 push {r7, lr}
  81060. 8020ec2: af00 add r7, sp, #0
  81061. #ifdef LWIP_RAND
  81062. udp_port = UDP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
  81063. 8020ec4: f007 fa58 bl 8028378 <rand>
  81064. 8020ec8: 4603 mov r3, r0
  81065. 8020eca: b29b uxth r3, r3
  81066. 8020ecc: f3c3 030d ubfx r3, r3, #0, #14
  81067. 8020ed0: b29b uxth r3, r3
  81068. 8020ed2: f5a3 4380 sub.w r3, r3, #16384 @ 0x4000
  81069. 8020ed6: b29a uxth r2, r3
  81070. 8020ed8: 4b01 ldr r3, [pc, #4] @ (8020ee0 <udp_init+0x20>)
  81071. 8020eda: 801a strh r2, [r3, #0]
  81072. #endif /* LWIP_RAND */
  81073. }
  81074. 8020edc: bf00 nop
  81075. 8020ede: bd80 pop {r7, pc}
  81076. 8020ee0: 24000054 .word 0x24000054
  81077. 08020ee4 <udp_new_port>:
  81078. *
  81079. * @return a new (free) local UDP port number
  81080. */
  81081. static u16_t
  81082. udp_new_port(void)
  81083. {
  81084. 8020ee4: b480 push {r7}
  81085. 8020ee6: b083 sub sp, #12
  81086. 8020ee8: af00 add r7, sp, #0
  81087. u16_t n = 0;
  81088. 8020eea: 2300 movs r3, #0
  81089. 8020eec: 80fb strh r3, [r7, #6]
  81090. struct udp_pcb *pcb;
  81091. again:
  81092. if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {
  81093. 8020eee: 4b17 ldr r3, [pc, #92] @ (8020f4c <udp_new_port+0x68>)
  81094. 8020ef0: 881b ldrh r3, [r3, #0]
  81095. 8020ef2: 1c5a adds r2, r3, #1
  81096. 8020ef4: b291 uxth r1, r2
  81097. 8020ef6: 4a15 ldr r2, [pc, #84] @ (8020f4c <udp_new_port+0x68>)
  81098. 8020ef8: 8011 strh r1, [r2, #0]
  81099. 8020efa: f64f 72ff movw r2, #65535 @ 0xffff
  81100. 8020efe: 4293 cmp r3, r2
  81101. 8020f00: d103 bne.n 8020f0a <udp_new_port+0x26>
  81102. udp_port = UDP_LOCAL_PORT_RANGE_START;
  81103. 8020f02: 4b12 ldr r3, [pc, #72] @ (8020f4c <udp_new_port+0x68>)
  81104. 8020f04: f44f 4240 mov.w r2, #49152 @ 0xc000
  81105. 8020f08: 801a strh r2, [r3, #0]
  81106. }
  81107. /* Check all PCBs. */
  81108. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  81109. 8020f0a: 4b11 ldr r3, [pc, #68] @ (8020f50 <udp_new_port+0x6c>)
  81110. 8020f0c: 681b ldr r3, [r3, #0]
  81111. 8020f0e: 603b str r3, [r7, #0]
  81112. 8020f10: e011 b.n 8020f36 <udp_new_port+0x52>
  81113. if (pcb->local_port == udp_port) {
  81114. 8020f12: 683b ldr r3, [r7, #0]
  81115. 8020f14: 8a5a ldrh r2, [r3, #18]
  81116. 8020f16: 4b0d ldr r3, [pc, #52] @ (8020f4c <udp_new_port+0x68>)
  81117. 8020f18: 881b ldrh r3, [r3, #0]
  81118. 8020f1a: 429a cmp r2, r3
  81119. 8020f1c: d108 bne.n 8020f30 <udp_new_port+0x4c>
  81120. if (++n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) {
  81121. 8020f1e: 88fb ldrh r3, [r7, #6]
  81122. 8020f20: 3301 adds r3, #1
  81123. 8020f22: 80fb strh r3, [r7, #6]
  81124. 8020f24: 88fb ldrh r3, [r7, #6]
  81125. 8020f26: f5b3 4f80 cmp.w r3, #16384 @ 0x4000
  81126. 8020f2a: d3e0 bcc.n 8020eee <udp_new_port+0xa>
  81127. return 0;
  81128. 8020f2c: 2300 movs r3, #0
  81129. 8020f2e: e007 b.n 8020f40 <udp_new_port+0x5c>
  81130. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  81131. 8020f30: 683b ldr r3, [r7, #0]
  81132. 8020f32: 68db ldr r3, [r3, #12]
  81133. 8020f34: 603b str r3, [r7, #0]
  81134. 8020f36: 683b ldr r3, [r7, #0]
  81135. 8020f38: 2b00 cmp r3, #0
  81136. 8020f3a: d1ea bne.n 8020f12 <udp_new_port+0x2e>
  81137. }
  81138. goto again;
  81139. }
  81140. }
  81141. return udp_port;
  81142. 8020f3c: 4b03 ldr r3, [pc, #12] @ (8020f4c <udp_new_port+0x68>)
  81143. 8020f3e: 881b ldrh r3, [r3, #0]
  81144. }
  81145. 8020f40: 4618 mov r0, r3
  81146. 8020f42: 370c adds r7, #12
  81147. 8020f44: 46bd mov sp, r7
  81148. 8020f46: f85d 7b04 ldr.w r7, [sp], #4
  81149. 8020f4a: 4770 bx lr
  81150. 8020f4c: 24000054 .word 0x24000054
  81151. 8020f50: 2402aee8 .word 0x2402aee8
  81152. 08020f54 <udp_input_local_match>:
  81153. * @param broadcast 1 if his is an IPv4 broadcast (global or subnet-only), 0 otherwise (only used for IPv4)
  81154. * @return 1 on match, 0 otherwise
  81155. */
  81156. static u8_t
  81157. udp_input_local_match(struct udp_pcb *pcb, struct netif *inp, u8_t broadcast)
  81158. {
  81159. 8020f54: b580 push {r7, lr}
  81160. 8020f56: b084 sub sp, #16
  81161. 8020f58: af00 add r7, sp, #0
  81162. 8020f5a: 60f8 str r0, [r7, #12]
  81163. 8020f5c: 60b9 str r1, [r7, #8]
  81164. 8020f5e: 4613 mov r3, r2
  81165. 8020f60: 71fb strb r3, [r7, #7]
  81166. LWIP_UNUSED_ARG(inp); /* in IPv6 only case */
  81167. LWIP_UNUSED_ARG(broadcast); /* in IPv6 only case */
  81168. LWIP_ASSERT("udp_input_local_match: invalid pcb", pcb != NULL);
  81169. 8020f62: 68fb ldr r3, [r7, #12]
  81170. 8020f64: 2b00 cmp r3, #0
  81171. 8020f66: d105 bne.n 8020f74 <udp_input_local_match+0x20>
  81172. 8020f68: 4b27 ldr r3, [pc, #156] @ (8021008 <udp_input_local_match+0xb4>)
  81173. 8020f6a: 2287 movs r2, #135 @ 0x87
  81174. 8020f6c: 4927 ldr r1, [pc, #156] @ (802100c <udp_input_local_match+0xb8>)
  81175. 8020f6e: 4828 ldr r0, [pc, #160] @ (8021010 <udp_input_local_match+0xbc>)
  81176. 8020f70: f008 fd2c bl 80299cc <iprintf>
  81177. LWIP_ASSERT("udp_input_local_match: invalid netif", inp != NULL);
  81178. 8020f74: 68bb ldr r3, [r7, #8]
  81179. 8020f76: 2b00 cmp r3, #0
  81180. 8020f78: d105 bne.n 8020f86 <udp_input_local_match+0x32>
  81181. 8020f7a: 4b23 ldr r3, [pc, #140] @ (8021008 <udp_input_local_match+0xb4>)
  81182. 8020f7c: 2288 movs r2, #136 @ 0x88
  81183. 8020f7e: 4925 ldr r1, [pc, #148] @ (8021014 <udp_input_local_match+0xc0>)
  81184. 8020f80: 4823 ldr r0, [pc, #140] @ (8021010 <udp_input_local_match+0xbc>)
  81185. 8020f82: f008 fd23 bl 80299cc <iprintf>
  81186. /* check if PCB is bound to specific netif */
  81187. if ((pcb->netif_idx != NETIF_NO_INDEX) &&
  81188. 8020f86: 68fb ldr r3, [r7, #12]
  81189. 8020f88: 7a1b ldrb r3, [r3, #8]
  81190. 8020f8a: 2b00 cmp r3, #0
  81191. 8020f8c: d00b beq.n 8020fa6 <udp_input_local_match+0x52>
  81192. (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
  81193. 8020f8e: 68fb ldr r3, [r7, #12]
  81194. 8020f90: 7a1a ldrb r2, [r3, #8]
  81195. 8020f92: 4b21 ldr r3, [pc, #132] @ (8021018 <udp_input_local_match+0xc4>)
  81196. 8020f94: 685b ldr r3, [r3, #4]
  81197. 8020f96: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  81198. 8020f9a: 3301 adds r3, #1
  81199. 8020f9c: b2db uxtb r3, r3
  81200. if ((pcb->netif_idx != NETIF_NO_INDEX) &&
  81201. 8020f9e: 429a cmp r2, r3
  81202. 8020fa0: d001 beq.n 8020fa6 <udp_input_local_match+0x52>
  81203. return 0;
  81204. 8020fa2: 2300 movs r3, #0
  81205. 8020fa4: e02b b.n 8020ffe <udp_input_local_match+0xaa>
  81206. /* Only need to check PCB if incoming IP version matches PCB IP version */
  81207. if (IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ip_current_dest_addr())) {
  81208. #if LWIP_IPV4
  81209. /* Special case: IPv4 broadcast: all or broadcasts in my subnet
  81210. * Note: broadcast variable can only be 1 if it is an IPv4 broadcast */
  81211. if (broadcast != 0) {
  81212. 8020fa6: 79fb ldrb r3, [r7, #7]
  81213. 8020fa8: 2b00 cmp r3, #0
  81214. 8020faa: d018 beq.n 8020fde <udp_input_local_match+0x8a>
  81215. #if IP_SOF_BROADCAST_RECV
  81216. if (ip_get_option(pcb, SOF_BROADCAST))
  81217. #endif /* IP_SOF_BROADCAST_RECV */
  81218. {
  81219. if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||
  81220. 8020fac: 68fb ldr r3, [r7, #12]
  81221. 8020fae: 2b00 cmp r3, #0
  81222. 8020fb0: d013 beq.n 8020fda <udp_input_local_match+0x86>
  81223. 8020fb2: 68fb ldr r3, [r7, #12]
  81224. 8020fb4: 681b ldr r3, [r3, #0]
  81225. 8020fb6: 2b00 cmp r3, #0
  81226. 8020fb8: d00f beq.n 8020fda <udp_input_local_match+0x86>
  81227. ((ip4_current_dest_addr()->addr == IPADDR_BROADCAST)) ||
  81228. 8020fba: 4b17 ldr r3, [pc, #92] @ (8021018 <udp_input_local_match+0xc4>)
  81229. 8020fbc: 695b ldr r3, [r3, #20]
  81230. if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||
  81231. 8020fbe: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  81232. 8020fc2: d00a beq.n 8020fda <udp_input_local_match+0x86>
  81233. ip4_addr_netcmp(ip_2_ip4(&pcb->local_ip), ip4_current_dest_addr(), netif_ip4_netmask(inp))) {
  81234. 8020fc4: 68fb ldr r3, [r7, #12]
  81235. 8020fc6: 681a ldr r2, [r3, #0]
  81236. 8020fc8: 4b13 ldr r3, [pc, #76] @ (8021018 <udp_input_local_match+0xc4>)
  81237. 8020fca: 695b ldr r3, [r3, #20]
  81238. 8020fcc: 405a eors r2, r3
  81239. 8020fce: 68bb ldr r3, [r7, #8]
  81240. 8020fd0: 3308 adds r3, #8
  81241. 8020fd2: 681b ldr r3, [r3, #0]
  81242. 8020fd4: 4013 ands r3, r2
  81243. ((ip4_current_dest_addr()->addr == IPADDR_BROADCAST)) ||
  81244. 8020fd6: 2b00 cmp r3, #0
  81245. 8020fd8: d110 bne.n 8020ffc <udp_input_local_match+0xa8>
  81246. return 1;
  81247. 8020fda: 2301 movs r3, #1
  81248. 8020fdc: e00f b.n 8020ffe <udp_input_local_match+0xaa>
  81249. }
  81250. }
  81251. } else
  81252. #endif /* LWIP_IPV4 */
  81253. /* Handle IPv4 and IPv6: all or exact match */
  81254. if (ip_addr_isany(&pcb->local_ip) || ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
  81255. 8020fde: 68fb ldr r3, [r7, #12]
  81256. 8020fe0: 2b00 cmp r3, #0
  81257. 8020fe2: d009 beq.n 8020ff8 <udp_input_local_match+0xa4>
  81258. 8020fe4: 68fb ldr r3, [r7, #12]
  81259. 8020fe6: 681b ldr r3, [r3, #0]
  81260. 8020fe8: 2b00 cmp r3, #0
  81261. 8020fea: d005 beq.n 8020ff8 <udp_input_local_match+0xa4>
  81262. 8020fec: 68fb ldr r3, [r7, #12]
  81263. 8020fee: 681a ldr r2, [r3, #0]
  81264. 8020ff0: 4b09 ldr r3, [pc, #36] @ (8021018 <udp_input_local_match+0xc4>)
  81265. 8020ff2: 695b ldr r3, [r3, #20]
  81266. 8020ff4: 429a cmp r2, r3
  81267. 8020ff6: d101 bne.n 8020ffc <udp_input_local_match+0xa8>
  81268. return 1;
  81269. 8020ff8: 2301 movs r3, #1
  81270. 8020ffa: e000 b.n 8020ffe <udp_input_local_match+0xaa>
  81271. }
  81272. }
  81273. return 0;
  81274. 8020ffc: 2300 movs r3, #0
  81275. }
  81276. 8020ffe: 4618 mov r0, r3
  81277. 8021000: 3710 adds r7, #16
  81278. 8021002: 46bd mov sp, r7
  81279. 8021004: bd80 pop {r7, pc}
  81280. 8021006: bf00 nop
  81281. 8021008: 0802faf0 .word 0x0802faf0
  81282. 802100c: 0802fb20 .word 0x0802fb20
  81283. 8021010: 0802fb44 .word 0x0802fb44
  81284. 8021014: 0802fb6c .word 0x0802fb6c
  81285. 8021018: 24024338 .word 0x24024338
  81286. 0802101c <udp_input>:
  81287. * @param inp network interface on which the datagram was received.
  81288. *
  81289. */
  81290. void
  81291. udp_input(struct pbuf *p, struct netif *inp)
  81292. {
  81293. 802101c: b590 push {r4, r7, lr}
  81294. 802101e: b08d sub sp, #52 @ 0x34
  81295. 8021020: af02 add r7, sp, #8
  81296. 8021022: 6078 str r0, [r7, #4]
  81297. 8021024: 6039 str r1, [r7, #0]
  81298. struct udp_hdr *udphdr;
  81299. struct udp_pcb *pcb, *prev;
  81300. struct udp_pcb *uncon_pcb;
  81301. u16_t src, dest;
  81302. u8_t broadcast;
  81303. u8_t for_us = 0;
  81304. 8021026: 2300 movs r3, #0
  81305. 8021028: 77fb strb r3, [r7, #31]
  81306. LWIP_UNUSED_ARG(inp);
  81307. LWIP_ASSERT_CORE_LOCKED();
  81308. 802102a: f7ef fa81 bl 8010530 <sys_check_core_locking>
  81309. LWIP_ASSERT("udp_input: invalid pbuf", p != NULL);
  81310. 802102e: 687b ldr r3, [r7, #4]
  81311. 8021030: 2b00 cmp r3, #0
  81312. 8021032: d105 bne.n 8021040 <udp_input+0x24>
  81313. 8021034: 4b7c ldr r3, [pc, #496] @ (8021228 <udp_input+0x20c>)
  81314. 8021036: 22cf movs r2, #207 @ 0xcf
  81315. 8021038: 497c ldr r1, [pc, #496] @ (802122c <udp_input+0x210>)
  81316. 802103a: 487d ldr r0, [pc, #500] @ (8021230 <udp_input+0x214>)
  81317. 802103c: f008 fcc6 bl 80299cc <iprintf>
  81318. LWIP_ASSERT("udp_input: invalid netif", inp != NULL);
  81319. 8021040: 683b ldr r3, [r7, #0]
  81320. 8021042: 2b00 cmp r3, #0
  81321. 8021044: d105 bne.n 8021052 <udp_input+0x36>
  81322. 8021046: 4b78 ldr r3, [pc, #480] @ (8021228 <udp_input+0x20c>)
  81323. 8021048: 22d0 movs r2, #208 @ 0xd0
  81324. 802104a: 497a ldr r1, [pc, #488] @ (8021234 <udp_input+0x218>)
  81325. 802104c: 4878 ldr r0, [pc, #480] @ (8021230 <udp_input+0x214>)
  81326. 802104e: f008 fcbd bl 80299cc <iprintf>
  81327. PERF_START;
  81328. UDP_STATS_INC(udp.recv);
  81329. /* Check minimum length (UDP header) */
  81330. if (p->len < UDP_HLEN) {
  81331. 8021052: 687b ldr r3, [r7, #4]
  81332. 8021054: 895b ldrh r3, [r3, #10]
  81333. 8021056: 2b07 cmp r3, #7
  81334. 8021058: d803 bhi.n 8021062 <udp_input+0x46>
  81335. LWIP_DEBUGF(UDP_DEBUG,
  81336. ("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len));
  81337. UDP_STATS_INC(udp.lenerr);
  81338. UDP_STATS_INC(udp.drop);
  81339. MIB2_STATS_INC(mib2.udpinerrors);
  81340. pbuf_free(p);
  81341. 802105a: 6878 ldr r0, [r7, #4]
  81342. 802105c: f7f9 fa3e bl 801a4dc <pbuf_free>
  81343. goto end;
  81344. 8021060: e0de b.n 8021220 <udp_input+0x204>
  81345. }
  81346. udphdr = (struct udp_hdr *)p->payload;
  81347. 8021062: 687b ldr r3, [r7, #4]
  81348. 8021064: 685b ldr r3, [r3, #4]
  81349. 8021066: 617b str r3, [r7, #20]
  81350. /* is broadcast packet ? */
  81351. broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif());
  81352. 8021068: 4b73 ldr r3, [pc, #460] @ (8021238 <udp_input+0x21c>)
  81353. 802106a: 695b ldr r3, [r3, #20]
  81354. 802106c: 4a72 ldr r2, [pc, #456] @ (8021238 <udp_input+0x21c>)
  81355. 802106e: 6812 ldr r2, [r2, #0]
  81356. 8021070: 4611 mov r1, r2
  81357. 8021072: 4618 mov r0, r3
  81358. 8021074: f003 ff54 bl 8024f20 <ip4_addr_isbroadcast_u32>
  81359. 8021078: 4603 mov r3, r0
  81360. 802107a: 74fb strb r3, [r7, #19]
  81361. LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len));
  81362. /* convert src and dest ports to host byte order */
  81363. src = lwip_ntohs(udphdr->src);
  81364. 802107c: 697b ldr r3, [r7, #20]
  81365. 802107e: 881b ldrh r3, [r3, #0]
  81366. 8021080: b29b uxth r3, r3
  81367. 8021082: 4618 mov r0, r3
  81368. 8021084: f7f7 fd48 bl 8018b18 <lwip_htons>
  81369. 8021088: 4603 mov r3, r0
  81370. 802108a: 823b strh r3, [r7, #16]
  81371. dest = lwip_ntohs(udphdr->dest);
  81372. 802108c: 697b ldr r3, [r7, #20]
  81373. 802108e: 885b ldrh r3, [r3, #2]
  81374. 8021090: b29b uxth r3, r3
  81375. 8021092: 4618 mov r0, r3
  81376. 8021094: f7f7 fd40 bl 8018b18 <lwip_htons>
  81377. 8021098: 4603 mov r3, r0
  81378. 802109a: 81fb strh r3, [r7, #14]
  81379. ip_addr_debug_print_val(UDP_DEBUG, *ip_current_dest_addr());
  81380. LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", lwip_ntohs(udphdr->dest)));
  81381. ip_addr_debug_print_val(UDP_DEBUG, *ip_current_src_addr());
  81382. LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", lwip_ntohs(udphdr->src)));
  81383. pcb = NULL;
  81384. 802109c: 2300 movs r3, #0
  81385. 802109e: 623b str r3, [r7, #32]
  81386. prev = NULL;
  81387. 80210a0: 2300 movs r3, #0
  81388. 80210a2: 627b str r3, [r7, #36] @ 0x24
  81389. uncon_pcb = NULL;
  81390. 80210a4: 2300 movs r3, #0
  81391. 80210a6: 61bb str r3, [r7, #24]
  81392. /* Iterate through the UDP pcb list for a matching pcb.
  81393. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  81394. * preferred. If no perfect match is found, the first unconnected pcb that
  81395. * matches the local port and ip address gets the datagram. */
  81396. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  81397. 80210a8: 4b64 ldr r3, [pc, #400] @ (802123c <udp_input+0x220>)
  81398. 80210aa: 681b ldr r3, [r3, #0]
  81399. 80210ac: 623b str r3, [r7, #32]
  81400. 80210ae: e054 b.n 802115a <udp_input+0x13e>
  81401. LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", pcb->local_port));
  81402. ip_addr_debug_print_val(UDP_DEBUG, pcb->remote_ip);
  81403. LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", pcb->remote_port));
  81404. /* compare PCB local addr+port to UDP destination addr+port */
  81405. if ((pcb->local_port == dest) &&
  81406. 80210b0: 6a3b ldr r3, [r7, #32]
  81407. 80210b2: 8a5b ldrh r3, [r3, #18]
  81408. 80210b4: 89fa ldrh r2, [r7, #14]
  81409. 80210b6: 429a cmp r2, r3
  81410. 80210b8: d14a bne.n 8021150 <udp_input+0x134>
  81411. (udp_input_local_match(pcb, inp, broadcast) != 0)) {
  81412. 80210ba: 7cfb ldrb r3, [r7, #19]
  81413. 80210bc: 461a mov r2, r3
  81414. 80210be: 6839 ldr r1, [r7, #0]
  81415. 80210c0: 6a38 ldr r0, [r7, #32]
  81416. 80210c2: f7ff ff47 bl 8020f54 <udp_input_local_match>
  81417. 80210c6: 4603 mov r3, r0
  81418. if ((pcb->local_port == dest) &&
  81419. 80210c8: 2b00 cmp r3, #0
  81420. 80210ca: d041 beq.n 8021150 <udp_input+0x134>
  81421. if ((pcb->flags & UDP_FLAGS_CONNECTED) == 0) {
  81422. 80210cc: 6a3b ldr r3, [r7, #32]
  81423. 80210ce: 7c1b ldrb r3, [r3, #16]
  81424. 80210d0: f003 0304 and.w r3, r3, #4
  81425. 80210d4: 2b00 cmp r3, #0
  81426. 80210d6: d11d bne.n 8021114 <udp_input+0xf8>
  81427. if (uncon_pcb == NULL) {
  81428. 80210d8: 69bb ldr r3, [r7, #24]
  81429. 80210da: 2b00 cmp r3, #0
  81430. 80210dc: d102 bne.n 80210e4 <udp_input+0xc8>
  81431. /* the first unconnected matching PCB */
  81432. uncon_pcb = pcb;
  81433. 80210de: 6a3b ldr r3, [r7, #32]
  81434. 80210e0: 61bb str r3, [r7, #24]
  81435. 80210e2: e017 b.n 8021114 <udp_input+0xf8>
  81436. #if LWIP_IPV4
  81437. } else if (broadcast && ip4_current_dest_addr()->addr == IPADDR_BROADCAST) {
  81438. 80210e4: 7cfb ldrb r3, [r7, #19]
  81439. 80210e6: 2b00 cmp r3, #0
  81440. 80210e8: d014 beq.n 8021114 <udp_input+0xf8>
  81441. 80210ea: 4b53 ldr r3, [pc, #332] @ (8021238 <udp_input+0x21c>)
  81442. 80210ec: 695b ldr r3, [r3, #20]
  81443. 80210ee: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  81444. 80210f2: d10f bne.n 8021114 <udp_input+0xf8>
  81445. /* global broadcast address (only valid for IPv4; match was checked before) */
  81446. if (!IP_IS_V4_VAL(uncon_pcb->local_ip) || !ip4_addr_cmp(ip_2_ip4(&uncon_pcb->local_ip), netif_ip4_addr(inp))) {
  81447. 80210f4: 69bb ldr r3, [r7, #24]
  81448. 80210f6: 681a ldr r2, [r3, #0]
  81449. 80210f8: 683b ldr r3, [r7, #0]
  81450. 80210fa: 3304 adds r3, #4
  81451. 80210fc: 681b ldr r3, [r3, #0]
  81452. 80210fe: 429a cmp r2, r3
  81453. 8021100: d008 beq.n 8021114 <udp_input+0xf8>
  81454. /* uncon_pcb does not match the input netif, check this pcb */
  81455. if (IP_IS_V4_VAL(pcb->local_ip) && ip4_addr_cmp(ip_2_ip4(&pcb->local_ip), netif_ip4_addr(inp))) {
  81456. 8021102: 6a3b ldr r3, [r7, #32]
  81457. 8021104: 681a ldr r2, [r3, #0]
  81458. 8021106: 683b ldr r3, [r7, #0]
  81459. 8021108: 3304 adds r3, #4
  81460. 802110a: 681b ldr r3, [r3, #0]
  81461. 802110c: 429a cmp r2, r3
  81462. 802110e: d101 bne.n 8021114 <udp_input+0xf8>
  81463. /* better match */
  81464. uncon_pcb = pcb;
  81465. 8021110: 6a3b ldr r3, [r7, #32]
  81466. 8021112: 61bb str r3, [r7, #24]
  81467. }
  81468. #endif /* SO_REUSE */
  81469. }
  81470. /* compare PCB remote addr+port to UDP source addr+port */
  81471. if ((pcb->remote_port == src) &&
  81472. 8021114: 6a3b ldr r3, [r7, #32]
  81473. 8021116: 8a9b ldrh r3, [r3, #20]
  81474. 8021118: 8a3a ldrh r2, [r7, #16]
  81475. 802111a: 429a cmp r2, r3
  81476. 802111c: d118 bne.n 8021150 <udp_input+0x134>
  81477. (ip_addr_isany_val(pcb->remote_ip) ||
  81478. 802111e: 6a3b ldr r3, [r7, #32]
  81479. 8021120: 685b ldr r3, [r3, #4]
  81480. if ((pcb->remote_port == src) &&
  81481. 8021122: 2b00 cmp r3, #0
  81482. 8021124: d005 beq.n 8021132 <udp_input+0x116>
  81483. ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()))) {
  81484. 8021126: 6a3b ldr r3, [r7, #32]
  81485. 8021128: 685a ldr r2, [r3, #4]
  81486. 802112a: 4b43 ldr r3, [pc, #268] @ (8021238 <udp_input+0x21c>)
  81487. 802112c: 691b ldr r3, [r3, #16]
  81488. (ip_addr_isany_val(pcb->remote_ip) ||
  81489. 802112e: 429a cmp r2, r3
  81490. 8021130: d10e bne.n 8021150 <udp_input+0x134>
  81491. /* the first fully matching PCB */
  81492. if (prev != NULL) {
  81493. 8021132: 6a7b ldr r3, [r7, #36] @ 0x24
  81494. 8021134: 2b00 cmp r3, #0
  81495. 8021136: d014 beq.n 8021162 <udp_input+0x146>
  81496. /* move the pcb to the front of udp_pcbs so that is
  81497. found faster next time */
  81498. prev->next = pcb->next;
  81499. 8021138: 6a3b ldr r3, [r7, #32]
  81500. 802113a: 68da ldr r2, [r3, #12]
  81501. 802113c: 6a7b ldr r3, [r7, #36] @ 0x24
  81502. 802113e: 60da str r2, [r3, #12]
  81503. pcb->next = udp_pcbs;
  81504. 8021140: 4b3e ldr r3, [pc, #248] @ (802123c <udp_input+0x220>)
  81505. 8021142: 681a ldr r2, [r3, #0]
  81506. 8021144: 6a3b ldr r3, [r7, #32]
  81507. 8021146: 60da str r2, [r3, #12]
  81508. udp_pcbs = pcb;
  81509. 8021148: 4a3c ldr r2, [pc, #240] @ (802123c <udp_input+0x220>)
  81510. 802114a: 6a3b ldr r3, [r7, #32]
  81511. 802114c: 6013 str r3, [r2, #0]
  81512. } else {
  81513. UDP_STATS_INC(udp.cachehit);
  81514. }
  81515. break;
  81516. 802114e: e008 b.n 8021162 <udp_input+0x146>
  81517. }
  81518. }
  81519. prev = pcb;
  81520. 8021150: 6a3b ldr r3, [r7, #32]
  81521. 8021152: 627b str r3, [r7, #36] @ 0x24
  81522. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  81523. 8021154: 6a3b ldr r3, [r7, #32]
  81524. 8021156: 68db ldr r3, [r3, #12]
  81525. 8021158: 623b str r3, [r7, #32]
  81526. 802115a: 6a3b ldr r3, [r7, #32]
  81527. 802115c: 2b00 cmp r3, #0
  81528. 802115e: d1a7 bne.n 80210b0 <udp_input+0x94>
  81529. 8021160: e000 b.n 8021164 <udp_input+0x148>
  81530. break;
  81531. 8021162: bf00 nop
  81532. }
  81533. /* no fully matching pcb found? then look for an unconnected pcb */
  81534. if (pcb == NULL) {
  81535. 8021164: 6a3b ldr r3, [r7, #32]
  81536. 8021166: 2b00 cmp r3, #0
  81537. 8021168: d101 bne.n 802116e <udp_input+0x152>
  81538. pcb = uncon_pcb;
  81539. 802116a: 69bb ldr r3, [r7, #24]
  81540. 802116c: 623b str r3, [r7, #32]
  81541. }
  81542. /* Check checksum if this is a match or if it was directed at us. */
  81543. if (pcb != NULL) {
  81544. 802116e: 6a3b ldr r3, [r7, #32]
  81545. 8021170: 2b00 cmp r3, #0
  81546. 8021172: d002 beq.n 802117a <udp_input+0x15e>
  81547. for_us = 1;
  81548. 8021174: 2301 movs r3, #1
  81549. 8021176: 77fb strb r3, [r7, #31]
  81550. 8021178: e00a b.n 8021190 <udp_input+0x174>
  81551. for_us = netif_get_ip6_addr_match(inp, ip6_current_dest_addr()) >= 0;
  81552. }
  81553. #endif /* LWIP_IPV6 */
  81554. #if LWIP_IPV4
  81555. if (!ip_current_is_v6()) {
  81556. for_us = ip4_addr_cmp(netif_ip4_addr(inp), ip4_current_dest_addr());
  81557. 802117a: 683b ldr r3, [r7, #0]
  81558. 802117c: 3304 adds r3, #4
  81559. 802117e: 681a ldr r2, [r3, #0]
  81560. 8021180: 4b2d ldr r3, [pc, #180] @ (8021238 <udp_input+0x21c>)
  81561. 8021182: 695b ldr r3, [r3, #20]
  81562. 8021184: 429a cmp r2, r3
  81563. 8021186: bf0c ite eq
  81564. 8021188: 2301 moveq r3, #1
  81565. 802118a: 2300 movne r3, #0
  81566. 802118c: b2db uxtb r3, r3
  81567. 802118e: 77fb strb r3, [r7, #31]
  81568. }
  81569. #endif /* LWIP_IPV4 */
  81570. }
  81571. if (for_us) {
  81572. 8021190: 7ffb ldrb r3, [r7, #31]
  81573. 8021192: 2b00 cmp r3, #0
  81574. 8021194: d041 beq.n 802121a <udp_input+0x1fe>
  81575. }
  81576. }
  81577. }
  81578. }
  81579. #endif /* CHECKSUM_CHECK_UDP */
  81580. if (pbuf_remove_header(p, UDP_HLEN)) {
  81581. 8021196: 2108 movs r1, #8
  81582. 8021198: 6878 ldr r0, [r7, #4]
  81583. 802119a: f7f9 f8e7 bl 801a36c <pbuf_remove_header>
  81584. 802119e: 4603 mov r3, r0
  81585. 80211a0: 2b00 cmp r3, #0
  81586. 80211a2: d00a beq.n 80211ba <udp_input+0x19e>
  81587. /* Can we cope with this failing? Just assert for now */
  81588. LWIP_ASSERT("pbuf_remove_header failed\n", 0);
  81589. 80211a4: 4b20 ldr r3, [pc, #128] @ (8021228 <udp_input+0x20c>)
  81590. 80211a6: f44f 72b8 mov.w r2, #368 @ 0x170
  81591. 80211aa: 4925 ldr r1, [pc, #148] @ (8021240 <udp_input+0x224>)
  81592. 80211ac: 4820 ldr r0, [pc, #128] @ (8021230 <udp_input+0x214>)
  81593. 80211ae: f008 fc0d bl 80299cc <iprintf>
  81594. UDP_STATS_INC(udp.drop);
  81595. MIB2_STATS_INC(mib2.udpinerrors);
  81596. pbuf_free(p);
  81597. 80211b2: 6878 ldr r0, [r7, #4]
  81598. 80211b4: f7f9 f992 bl 801a4dc <pbuf_free>
  81599. goto end;
  81600. 80211b8: e032 b.n 8021220 <udp_input+0x204>
  81601. }
  81602. if (pcb != NULL) {
  81603. 80211ba: 6a3b ldr r3, [r7, #32]
  81604. 80211bc: 2b00 cmp r3, #0
  81605. 80211be: d012 beq.n 80211e6 <udp_input+0x1ca>
  81606. }
  81607. }
  81608. }
  81609. #endif /* SO_REUSE && SO_REUSE_RXTOALL */
  81610. /* callback */
  81611. if (pcb->recv != NULL) {
  81612. 80211c0: 6a3b ldr r3, [r7, #32]
  81613. 80211c2: 699b ldr r3, [r3, #24]
  81614. 80211c4: 2b00 cmp r3, #0
  81615. 80211c6: d00a beq.n 80211de <udp_input+0x1c2>
  81616. /* now the recv function is responsible for freeing p */
  81617. pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
  81618. 80211c8: 6a3b ldr r3, [r7, #32]
  81619. 80211ca: 699c ldr r4, [r3, #24]
  81620. 80211cc: 6a3b ldr r3, [r7, #32]
  81621. 80211ce: 69d8 ldr r0, [r3, #28]
  81622. 80211d0: 8a3b ldrh r3, [r7, #16]
  81623. 80211d2: 9300 str r3, [sp, #0]
  81624. 80211d4: 4b1b ldr r3, [pc, #108] @ (8021244 <udp_input+0x228>)
  81625. 80211d6: 687a ldr r2, [r7, #4]
  81626. 80211d8: 6a39 ldr r1, [r7, #32]
  81627. 80211da: 47a0 blx r4
  81628. } else {
  81629. pbuf_free(p);
  81630. }
  81631. end:
  81632. PERF_STOP("udp_input");
  81633. return;
  81634. 80211dc: e021 b.n 8021222 <udp_input+0x206>
  81635. pbuf_free(p);
  81636. 80211de: 6878 ldr r0, [r7, #4]
  81637. 80211e0: f7f9 f97c bl 801a4dc <pbuf_free>
  81638. goto end;
  81639. 80211e4: e01c b.n 8021220 <udp_input+0x204>
  81640. if (!broadcast && !ip_addr_ismulticast(ip_current_dest_addr())) {
  81641. 80211e6: 7cfb ldrb r3, [r7, #19]
  81642. 80211e8: 2b00 cmp r3, #0
  81643. 80211ea: d112 bne.n 8021212 <udp_input+0x1f6>
  81644. 80211ec: 4b12 ldr r3, [pc, #72] @ (8021238 <udp_input+0x21c>)
  81645. 80211ee: 695b ldr r3, [r3, #20]
  81646. 80211f0: f003 03f0 and.w r3, r3, #240 @ 0xf0
  81647. 80211f4: 2be0 cmp r3, #224 @ 0xe0
  81648. 80211f6: d00c beq.n 8021212 <udp_input+0x1f6>
  81649. pbuf_header_force(p, (s16_t)(ip_current_header_tot_len() + UDP_HLEN));
  81650. 80211f8: 4b0f ldr r3, [pc, #60] @ (8021238 <udp_input+0x21c>)
  81651. 80211fa: 899b ldrh r3, [r3, #12]
  81652. 80211fc: 3308 adds r3, #8
  81653. 80211fe: b29b uxth r3, r3
  81654. 8021200: b21b sxth r3, r3
  81655. 8021202: 4619 mov r1, r3
  81656. 8021204: 6878 ldr r0, [r7, #4]
  81657. 8021206: f7f9 f924 bl 801a452 <pbuf_header_force>
  81658. icmp_port_unreach(ip_current_is_v6(), p);
  81659. 802120a: 2103 movs r1, #3
  81660. 802120c: 6878 ldr r0, [r7, #4]
  81661. 802120e: f003 fb3b bl 8024888 <icmp_dest_unreach>
  81662. pbuf_free(p);
  81663. 8021212: 6878 ldr r0, [r7, #4]
  81664. 8021214: f7f9 f962 bl 801a4dc <pbuf_free>
  81665. return;
  81666. 8021218: e003 b.n 8021222 <udp_input+0x206>
  81667. pbuf_free(p);
  81668. 802121a: 6878 ldr r0, [r7, #4]
  81669. 802121c: f7f9 f95e bl 801a4dc <pbuf_free>
  81670. return;
  81671. 8021220: bf00 nop
  81672. UDP_STATS_INC(udp.drop);
  81673. MIB2_STATS_INC(mib2.udpinerrors);
  81674. pbuf_free(p);
  81675. PERF_STOP("udp_input");
  81676. #endif /* CHECKSUM_CHECK_UDP */
  81677. }
  81678. 8021222: 372c adds r7, #44 @ 0x2c
  81679. 8021224: 46bd mov sp, r7
  81680. 8021226: bd90 pop {r4, r7, pc}
  81681. 8021228: 0802faf0 .word 0x0802faf0
  81682. 802122c: 0802fb94 .word 0x0802fb94
  81683. 8021230: 0802fb44 .word 0x0802fb44
  81684. 8021234: 0802fbac .word 0x0802fbac
  81685. 8021238: 24024338 .word 0x24024338
  81686. 802123c: 2402aee8 .word 0x2402aee8
  81687. 8021240: 0802fbc8 .word 0x0802fbc8
  81688. 8021244: 24024348 .word 0x24024348
  81689. 08021248 <udp_send>:
  81690. *
  81691. * @see udp_disconnect() udp_sendto()
  81692. */
  81693. err_t
  81694. udp_send(struct udp_pcb *pcb, struct pbuf *p)
  81695. {
  81696. 8021248: b580 push {r7, lr}
  81697. 802124a: b082 sub sp, #8
  81698. 802124c: af00 add r7, sp, #0
  81699. 802124e: 6078 str r0, [r7, #4]
  81700. 8021250: 6039 str r1, [r7, #0]
  81701. LWIP_ERROR("udp_send: invalid pcb", pcb != NULL, return ERR_ARG);
  81702. 8021252: 687b ldr r3, [r7, #4]
  81703. 8021254: 2b00 cmp r3, #0
  81704. 8021256: d109 bne.n 802126c <udp_send+0x24>
  81705. 8021258: 4b11 ldr r3, [pc, #68] @ (80212a0 <udp_send+0x58>)
  81706. 802125a: f240 12d5 movw r2, #469 @ 0x1d5
  81707. 802125e: 4911 ldr r1, [pc, #68] @ (80212a4 <udp_send+0x5c>)
  81708. 8021260: 4811 ldr r0, [pc, #68] @ (80212a8 <udp_send+0x60>)
  81709. 8021262: f008 fbb3 bl 80299cc <iprintf>
  81710. 8021266: f06f 030f mvn.w r3, #15
  81711. 802126a: e015 b.n 8021298 <udp_send+0x50>
  81712. LWIP_ERROR("udp_send: invalid pbuf", p != NULL, return ERR_ARG);
  81713. 802126c: 683b ldr r3, [r7, #0]
  81714. 802126e: 2b00 cmp r3, #0
  81715. 8021270: d109 bne.n 8021286 <udp_send+0x3e>
  81716. 8021272: 4b0b ldr r3, [pc, #44] @ (80212a0 <udp_send+0x58>)
  81717. 8021274: f44f 72eb mov.w r2, #470 @ 0x1d6
  81718. 8021278: 490c ldr r1, [pc, #48] @ (80212ac <udp_send+0x64>)
  81719. 802127a: 480b ldr r0, [pc, #44] @ (80212a8 <udp_send+0x60>)
  81720. 802127c: f008 fba6 bl 80299cc <iprintf>
  81721. 8021280: f06f 030f mvn.w r3, #15
  81722. 8021284: e008 b.n 8021298 <udp_send+0x50>
  81723. if (IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) {
  81724. return ERR_VAL;
  81725. }
  81726. /* send to the packet using remote ip and port stored in the pcb */
  81727. return udp_sendto(pcb, p, &pcb->remote_ip, pcb->remote_port);
  81728. 8021286: 687b ldr r3, [r7, #4]
  81729. 8021288: 1d1a adds r2, r3, #4
  81730. 802128a: 687b ldr r3, [r7, #4]
  81731. 802128c: 8a9b ldrh r3, [r3, #20]
  81732. 802128e: 6839 ldr r1, [r7, #0]
  81733. 8021290: 6878 ldr r0, [r7, #4]
  81734. 8021292: f000 f80d bl 80212b0 <udp_sendto>
  81735. 8021296: 4603 mov r3, r0
  81736. }
  81737. 8021298: 4618 mov r0, r3
  81738. 802129a: 3708 adds r7, #8
  81739. 802129c: 46bd mov sp, r7
  81740. 802129e: bd80 pop {r7, pc}
  81741. 80212a0: 0802faf0 .word 0x0802faf0
  81742. 80212a4: 0802fbe4 .word 0x0802fbe4
  81743. 80212a8: 0802fb44 .word 0x0802fb44
  81744. 80212ac: 0802fbfc .word 0x0802fbfc
  81745. 080212b0 <udp_sendto>:
  81746. * @see udp_disconnect() udp_send()
  81747. */
  81748. err_t
  81749. udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
  81750. const ip_addr_t *dst_ip, u16_t dst_port)
  81751. {
  81752. 80212b0: b580 push {r7, lr}
  81753. 80212b2: b088 sub sp, #32
  81754. 80212b4: af02 add r7, sp, #8
  81755. 80212b6: 60f8 str r0, [r7, #12]
  81756. 80212b8: 60b9 str r1, [r7, #8]
  81757. 80212ba: 607a str r2, [r7, #4]
  81758. 80212bc: 807b strh r3, [r7, #2]
  81759. u16_t dst_port, u8_t have_chksum, u16_t chksum)
  81760. {
  81761. #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
  81762. struct netif *netif;
  81763. LWIP_ERROR("udp_sendto: invalid pcb", pcb != NULL, return ERR_ARG);
  81764. 80212be: 68fb ldr r3, [r7, #12]
  81765. 80212c0: 2b00 cmp r3, #0
  81766. 80212c2: d109 bne.n 80212d8 <udp_sendto+0x28>
  81767. 80212c4: 4b23 ldr r3, [pc, #140] @ (8021354 <udp_sendto+0xa4>)
  81768. 80212c6: f44f 7206 mov.w r2, #536 @ 0x218
  81769. 80212ca: 4923 ldr r1, [pc, #140] @ (8021358 <udp_sendto+0xa8>)
  81770. 80212cc: 4823 ldr r0, [pc, #140] @ (802135c <udp_sendto+0xac>)
  81771. 80212ce: f008 fb7d bl 80299cc <iprintf>
  81772. 80212d2: f06f 030f mvn.w r3, #15
  81773. 80212d6: e038 b.n 802134a <udp_sendto+0x9a>
  81774. LWIP_ERROR("udp_sendto: invalid pbuf", p != NULL, return ERR_ARG);
  81775. 80212d8: 68bb ldr r3, [r7, #8]
  81776. 80212da: 2b00 cmp r3, #0
  81777. 80212dc: d109 bne.n 80212f2 <udp_sendto+0x42>
  81778. 80212de: 4b1d ldr r3, [pc, #116] @ (8021354 <udp_sendto+0xa4>)
  81779. 80212e0: f240 2219 movw r2, #537 @ 0x219
  81780. 80212e4: 491e ldr r1, [pc, #120] @ (8021360 <udp_sendto+0xb0>)
  81781. 80212e6: 481d ldr r0, [pc, #116] @ (802135c <udp_sendto+0xac>)
  81782. 80212e8: f008 fb70 bl 80299cc <iprintf>
  81783. 80212ec: f06f 030f mvn.w r3, #15
  81784. 80212f0: e02b b.n 802134a <udp_sendto+0x9a>
  81785. LWIP_ERROR("udp_sendto: invalid dst_ip", dst_ip != NULL, return ERR_ARG);
  81786. 80212f2: 687b ldr r3, [r7, #4]
  81787. 80212f4: 2b00 cmp r3, #0
  81788. 80212f6: d109 bne.n 802130c <udp_sendto+0x5c>
  81789. 80212f8: 4b16 ldr r3, [pc, #88] @ (8021354 <udp_sendto+0xa4>)
  81790. 80212fa: f240 221a movw r2, #538 @ 0x21a
  81791. 80212fe: 4919 ldr r1, [pc, #100] @ (8021364 <udp_sendto+0xb4>)
  81792. 8021300: 4816 ldr r0, [pc, #88] @ (802135c <udp_sendto+0xac>)
  81793. 8021302: f008 fb63 bl 80299cc <iprintf>
  81794. 8021306: f06f 030f mvn.w r3, #15
  81795. 802130a: e01e b.n 802134a <udp_sendto+0x9a>
  81796. return ERR_VAL;
  81797. }
  81798. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send\n"));
  81799. if (pcb->netif_idx != NETIF_NO_INDEX) {
  81800. 802130c: 68fb ldr r3, [r7, #12]
  81801. 802130e: 7a1b ldrb r3, [r3, #8]
  81802. 8021310: 2b00 cmp r3, #0
  81803. 8021312: d006 beq.n 8021322 <udp_sendto+0x72>
  81804. netif = netif_get_by_index(pcb->netif_idx);
  81805. 8021314: 68fb ldr r3, [r7, #12]
  81806. 8021316: 7a1b ldrb r3, [r3, #8]
  81807. 8021318: 4618 mov r0, r3
  81808. 802131a: f7f8 fd1f bl 8019d5c <netif_get_by_index>
  81809. 802131e: 6178 str r0, [r7, #20]
  81810. 8021320: e003 b.n 802132a <udp_sendto+0x7a>
  81811. if (netif == NULL)
  81812. #endif /* LWIP_MULTICAST_TX_OPTIONS */
  81813. {
  81814. /* find the outgoing network interface for this packet */
  81815. netif = ip_route(&pcb->local_ip, dst_ip);
  81816. 8021322: 6878 ldr r0, [r7, #4]
  81817. 8021324: f003 fb44 bl 80249b0 <ip4_route>
  81818. 8021328: 6178 str r0, [r7, #20]
  81819. }
  81820. }
  81821. /* no outgoing network interface could be found? */
  81822. if (netif == NULL) {
  81823. 802132a: 697b ldr r3, [r7, #20]
  81824. 802132c: 2b00 cmp r3, #0
  81825. 802132e: d102 bne.n 8021336 <udp_sendto+0x86>
  81826. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: No route to "));
  81827. ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, dst_ip);
  81828. LWIP_DEBUGF(UDP_DEBUG, ("\n"));
  81829. UDP_STATS_INC(udp.rterr);
  81830. return ERR_RTE;
  81831. 8021330: f06f 0303 mvn.w r3, #3
  81832. 8021334: e009 b.n 802134a <udp_sendto+0x9a>
  81833. }
  81834. #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
  81835. return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);
  81836. #else /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
  81837. return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);
  81838. 8021336: 887a ldrh r2, [r7, #2]
  81839. 8021338: 697b ldr r3, [r7, #20]
  81840. 802133a: 9300 str r3, [sp, #0]
  81841. 802133c: 4613 mov r3, r2
  81842. 802133e: 687a ldr r2, [r7, #4]
  81843. 8021340: 68b9 ldr r1, [r7, #8]
  81844. 8021342: 68f8 ldr r0, [r7, #12]
  81845. 8021344: f000 f810 bl 8021368 <udp_sendto_if>
  81846. 8021348: 4603 mov r3, r0
  81847. #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
  81848. }
  81849. 802134a: 4618 mov r0, r3
  81850. 802134c: 3718 adds r7, #24
  81851. 802134e: 46bd mov sp, r7
  81852. 8021350: bd80 pop {r7, pc}
  81853. 8021352: bf00 nop
  81854. 8021354: 0802faf0 .word 0x0802faf0
  81855. 8021358: 0802fc14 .word 0x0802fc14
  81856. 802135c: 0802fb44 .word 0x0802fb44
  81857. 8021360: 0802fc2c .word 0x0802fc2c
  81858. 8021364: 0802fc48 .word 0x0802fc48
  81859. 08021368 <udp_sendto_if>:
  81860. * @see udp_disconnect() udp_send()
  81861. */
  81862. err_t
  81863. udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,
  81864. const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif)
  81865. {
  81866. 8021368: b580 push {r7, lr}
  81867. 802136a: b088 sub sp, #32
  81868. 802136c: af02 add r7, sp, #8
  81869. 802136e: 60f8 str r0, [r7, #12]
  81870. 8021370: 60b9 str r1, [r7, #8]
  81871. 8021372: 607a str r2, [r7, #4]
  81872. 8021374: 807b strh r3, [r7, #2]
  81873. u16_t chksum)
  81874. {
  81875. #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
  81876. const ip_addr_t *src_ip;
  81877. LWIP_ERROR("udp_sendto_if: invalid pcb", pcb != NULL, return ERR_ARG);
  81878. 8021376: 68fb ldr r3, [r7, #12]
  81879. 8021378: 2b00 cmp r3, #0
  81880. 802137a: d109 bne.n 8021390 <udp_sendto_if+0x28>
  81881. 802137c: 4b2e ldr r3, [pc, #184] @ (8021438 <udp_sendto_if+0xd0>)
  81882. 802137e: f44f 7220 mov.w r2, #640 @ 0x280
  81883. 8021382: 492e ldr r1, [pc, #184] @ (802143c <udp_sendto_if+0xd4>)
  81884. 8021384: 482e ldr r0, [pc, #184] @ (8021440 <udp_sendto_if+0xd8>)
  81885. 8021386: f008 fb21 bl 80299cc <iprintf>
  81886. 802138a: f06f 030f mvn.w r3, #15
  81887. 802138e: e04f b.n 8021430 <udp_sendto_if+0xc8>
  81888. LWIP_ERROR("udp_sendto_if: invalid pbuf", p != NULL, return ERR_ARG);
  81889. 8021390: 68bb ldr r3, [r7, #8]
  81890. 8021392: 2b00 cmp r3, #0
  81891. 8021394: d109 bne.n 80213aa <udp_sendto_if+0x42>
  81892. 8021396: 4b28 ldr r3, [pc, #160] @ (8021438 <udp_sendto_if+0xd0>)
  81893. 8021398: f240 2281 movw r2, #641 @ 0x281
  81894. 802139c: 4929 ldr r1, [pc, #164] @ (8021444 <udp_sendto_if+0xdc>)
  81895. 802139e: 4828 ldr r0, [pc, #160] @ (8021440 <udp_sendto_if+0xd8>)
  81896. 80213a0: f008 fb14 bl 80299cc <iprintf>
  81897. 80213a4: f06f 030f mvn.w r3, #15
  81898. 80213a8: e042 b.n 8021430 <udp_sendto_if+0xc8>
  81899. LWIP_ERROR("udp_sendto_if: invalid dst_ip", dst_ip != NULL, return ERR_ARG);
  81900. 80213aa: 687b ldr r3, [r7, #4]
  81901. 80213ac: 2b00 cmp r3, #0
  81902. 80213ae: d109 bne.n 80213c4 <udp_sendto_if+0x5c>
  81903. 80213b0: 4b21 ldr r3, [pc, #132] @ (8021438 <udp_sendto_if+0xd0>)
  81904. 80213b2: f240 2282 movw r2, #642 @ 0x282
  81905. 80213b6: 4924 ldr r1, [pc, #144] @ (8021448 <udp_sendto_if+0xe0>)
  81906. 80213b8: 4821 ldr r0, [pc, #132] @ (8021440 <udp_sendto_if+0xd8>)
  81907. 80213ba: f008 fb07 bl 80299cc <iprintf>
  81908. 80213be: f06f 030f mvn.w r3, #15
  81909. 80213c2: e035 b.n 8021430 <udp_sendto_if+0xc8>
  81910. LWIP_ERROR("udp_sendto_if: invalid netif", netif != NULL, return ERR_ARG);
  81911. 80213c4: 6a3b ldr r3, [r7, #32]
  81912. 80213c6: 2b00 cmp r3, #0
  81913. 80213c8: d109 bne.n 80213de <udp_sendto_if+0x76>
  81914. 80213ca: 4b1b ldr r3, [pc, #108] @ (8021438 <udp_sendto_if+0xd0>)
  81915. 80213cc: f240 2283 movw r2, #643 @ 0x283
  81916. 80213d0: 491e ldr r1, [pc, #120] @ (802144c <udp_sendto_if+0xe4>)
  81917. 80213d2: 481b ldr r0, [pc, #108] @ (8021440 <udp_sendto_if+0xd8>)
  81918. 80213d4: f008 fafa bl 80299cc <iprintf>
  81919. 80213d8: f06f 030f mvn.w r3, #15
  81920. 80213dc: e028 b.n 8021430 <udp_sendto_if+0xc8>
  81921. #endif /* LWIP_IPV6 */
  81922. #if LWIP_IPV4 && LWIP_IPV6
  81923. else
  81924. #endif /* LWIP_IPV4 && LWIP_IPV6 */
  81925. #if LWIP_IPV4
  81926. if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||
  81927. 80213de: 68fb ldr r3, [r7, #12]
  81928. 80213e0: 2b00 cmp r3, #0
  81929. 80213e2: d009 beq.n 80213f8 <udp_sendto_if+0x90>
  81930. 80213e4: 68fb ldr r3, [r7, #12]
  81931. 80213e6: 681b ldr r3, [r3, #0]
  81932. 80213e8: 2b00 cmp r3, #0
  81933. 80213ea: d005 beq.n 80213f8 <udp_sendto_if+0x90>
  81934. ip4_addr_ismulticast(ip_2_ip4(&pcb->local_ip))) {
  81935. 80213ec: 68fb ldr r3, [r7, #12]
  81936. 80213ee: 681b ldr r3, [r3, #0]
  81937. 80213f0: f003 03f0 and.w r3, r3, #240 @ 0xf0
  81938. if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||
  81939. 80213f4: 2be0 cmp r3, #224 @ 0xe0
  81940. 80213f6: d103 bne.n 8021400 <udp_sendto_if+0x98>
  81941. /* if the local_ip is any or multicast
  81942. * use the outgoing network interface IP address as source address */
  81943. src_ip = netif_ip_addr4(netif);
  81944. 80213f8: 6a3b ldr r3, [r7, #32]
  81945. 80213fa: 3304 adds r3, #4
  81946. 80213fc: 617b str r3, [r7, #20]
  81947. 80213fe: e00b b.n 8021418 <udp_sendto_if+0xb0>
  81948. } else {
  81949. /* check if UDP PCB local IP address is correct
  81950. * this could be an old address if netif->ip_addr has changed */
  81951. if (!ip4_addr_cmp(ip_2_ip4(&(pcb->local_ip)), netif_ip4_addr(netif))) {
  81952. 8021400: 68fb ldr r3, [r7, #12]
  81953. 8021402: 681a ldr r2, [r3, #0]
  81954. 8021404: 6a3b ldr r3, [r7, #32]
  81955. 8021406: 3304 adds r3, #4
  81956. 8021408: 681b ldr r3, [r3, #0]
  81957. 802140a: 429a cmp r2, r3
  81958. 802140c: d002 beq.n 8021414 <udp_sendto_if+0xac>
  81959. /* local_ip doesn't match, drop the packet */
  81960. return ERR_RTE;
  81961. 802140e: f06f 0303 mvn.w r3, #3
  81962. 8021412: e00d b.n 8021430 <udp_sendto_if+0xc8>
  81963. }
  81964. /* use UDP PCB local IP address as source address */
  81965. src_ip = &pcb->local_ip;
  81966. 8021414: 68fb ldr r3, [r7, #12]
  81967. 8021416: 617b str r3, [r7, #20]
  81968. }
  81969. #endif /* LWIP_IPV4 */
  81970. #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
  81971. return udp_sendto_if_src_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum, src_ip);
  81972. #else /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
  81973. return udp_sendto_if_src(pcb, p, dst_ip, dst_port, netif, src_ip);
  81974. 8021418: 887a ldrh r2, [r7, #2]
  81975. 802141a: 697b ldr r3, [r7, #20]
  81976. 802141c: 9301 str r3, [sp, #4]
  81977. 802141e: 6a3b ldr r3, [r7, #32]
  81978. 8021420: 9300 str r3, [sp, #0]
  81979. 8021422: 4613 mov r3, r2
  81980. 8021424: 687a ldr r2, [r7, #4]
  81981. 8021426: 68b9 ldr r1, [r7, #8]
  81982. 8021428: 68f8 ldr r0, [r7, #12]
  81983. 802142a: f000 f811 bl 8021450 <udp_sendto_if_src>
  81984. 802142e: 4603 mov r3, r0
  81985. #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
  81986. }
  81987. 8021430: 4618 mov r0, r3
  81988. 8021432: 3718 adds r7, #24
  81989. 8021434: 46bd mov sp, r7
  81990. 8021436: bd80 pop {r7, pc}
  81991. 8021438: 0802faf0 .word 0x0802faf0
  81992. 802143c: 0802fc64 .word 0x0802fc64
  81993. 8021440: 0802fb44 .word 0x0802fb44
  81994. 8021444: 0802fc80 .word 0x0802fc80
  81995. 8021448: 0802fc9c .word 0x0802fc9c
  81996. 802144c: 0802fcbc .word 0x0802fcbc
  81997. 08021450 <udp_sendto_if_src>:
  81998. /** @ingroup udp_raw
  81999. * Same as @ref udp_sendto_if, but with source address */
  82000. err_t
  82001. udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p,
  82002. const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip)
  82003. {
  82004. 8021450: b580 push {r7, lr}
  82005. 8021452: b08c sub sp, #48 @ 0x30
  82006. 8021454: af04 add r7, sp, #16
  82007. 8021456: 60f8 str r0, [r7, #12]
  82008. 8021458: 60b9 str r1, [r7, #8]
  82009. 802145a: 607a str r2, [r7, #4]
  82010. 802145c: 807b strh r3, [r7, #2]
  82011. err_t err;
  82012. struct pbuf *q; /* q will be sent down the stack */
  82013. u8_t ip_proto;
  82014. u8_t ttl;
  82015. LWIP_ASSERT_CORE_LOCKED();
  82016. 802145e: f7ef f867 bl 8010530 <sys_check_core_locking>
  82017. LWIP_ERROR("udp_sendto_if_src: invalid pcb", pcb != NULL, return ERR_ARG);
  82018. 8021462: 68fb ldr r3, [r7, #12]
  82019. 8021464: 2b00 cmp r3, #0
  82020. 8021466: d109 bne.n 802147c <udp_sendto_if_src+0x2c>
  82021. 8021468: 4b65 ldr r3, [pc, #404] @ (8021600 <udp_sendto_if_src+0x1b0>)
  82022. 802146a: f240 22d1 movw r2, #721 @ 0x2d1
  82023. 802146e: 4965 ldr r1, [pc, #404] @ (8021604 <udp_sendto_if_src+0x1b4>)
  82024. 8021470: 4865 ldr r0, [pc, #404] @ (8021608 <udp_sendto_if_src+0x1b8>)
  82025. 8021472: f008 faab bl 80299cc <iprintf>
  82026. 8021476: f06f 030f mvn.w r3, #15
  82027. 802147a: e0bc b.n 80215f6 <udp_sendto_if_src+0x1a6>
  82028. LWIP_ERROR("udp_sendto_if_src: invalid pbuf", p != NULL, return ERR_ARG);
  82029. 802147c: 68bb ldr r3, [r7, #8]
  82030. 802147e: 2b00 cmp r3, #0
  82031. 8021480: d109 bne.n 8021496 <udp_sendto_if_src+0x46>
  82032. 8021482: 4b5f ldr r3, [pc, #380] @ (8021600 <udp_sendto_if_src+0x1b0>)
  82033. 8021484: f240 22d2 movw r2, #722 @ 0x2d2
  82034. 8021488: 4960 ldr r1, [pc, #384] @ (802160c <udp_sendto_if_src+0x1bc>)
  82035. 802148a: 485f ldr r0, [pc, #380] @ (8021608 <udp_sendto_if_src+0x1b8>)
  82036. 802148c: f008 fa9e bl 80299cc <iprintf>
  82037. 8021490: f06f 030f mvn.w r3, #15
  82038. 8021494: e0af b.n 80215f6 <udp_sendto_if_src+0x1a6>
  82039. LWIP_ERROR("udp_sendto_if_src: invalid dst_ip", dst_ip != NULL, return ERR_ARG);
  82040. 8021496: 687b ldr r3, [r7, #4]
  82041. 8021498: 2b00 cmp r3, #0
  82042. 802149a: d109 bne.n 80214b0 <udp_sendto_if_src+0x60>
  82043. 802149c: 4b58 ldr r3, [pc, #352] @ (8021600 <udp_sendto_if_src+0x1b0>)
  82044. 802149e: f240 22d3 movw r2, #723 @ 0x2d3
  82045. 80214a2: 495b ldr r1, [pc, #364] @ (8021610 <udp_sendto_if_src+0x1c0>)
  82046. 80214a4: 4858 ldr r0, [pc, #352] @ (8021608 <udp_sendto_if_src+0x1b8>)
  82047. 80214a6: f008 fa91 bl 80299cc <iprintf>
  82048. 80214aa: f06f 030f mvn.w r3, #15
  82049. 80214ae: e0a2 b.n 80215f6 <udp_sendto_if_src+0x1a6>
  82050. LWIP_ERROR("udp_sendto_if_src: invalid src_ip", src_ip != NULL, return ERR_ARG);
  82051. 80214b0: 6afb ldr r3, [r7, #44] @ 0x2c
  82052. 80214b2: 2b00 cmp r3, #0
  82053. 80214b4: d109 bne.n 80214ca <udp_sendto_if_src+0x7a>
  82054. 80214b6: 4b52 ldr r3, [pc, #328] @ (8021600 <udp_sendto_if_src+0x1b0>)
  82055. 80214b8: f44f 7235 mov.w r2, #724 @ 0x2d4
  82056. 80214bc: 4955 ldr r1, [pc, #340] @ (8021614 <udp_sendto_if_src+0x1c4>)
  82057. 80214be: 4852 ldr r0, [pc, #328] @ (8021608 <udp_sendto_if_src+0x1b8>)
  82058. 80214c0: f008 fa84 bl 80299cc <iprintf>
  82059. 80214c4: f06f 030f mvn.w r3, #15
  82060. 80214c8: e095 b.n 80215f6 <udp_sendto_if_src+0x1a6>
  82061. LWIP_ERROR("udp_sendto_if_src: invalid netif", netif != NULL, return ERR_ARG);
  82062. 80214ca: 6abb ldr r3, [r7, #40] @ 0x28
  82063. 80214cc: 2b00 cmp r3, #0
  82064. 80214ce: d109 bne.n 80214e4 <udp_sendto_if_src+0x94>
  82065. 80214d0: 4b4b ldr r3, [pc, #300] @ (8021600 <udp_sendto_if_src+0x1b0>)
  82066. 80214d2: f240 22d5 movw r2, #725 @ 0x2d5
  82067. 80214d6: 4950 ldr r1, [pc, #320] @ (8021618 <udp_sendto_if_src+0x1c8>)
  82068. 80214d8: 484b ldr r0, [pc, #300] @ (8021608 <udp_sendto_if_src+0x1b8>)
  82069. 80214da: f008 fa77 bl 80299cc <iprintf>
  82070. 80214de: f06f 030f mvn.w r3, #15
  82071. 80214e2: e088 b.n 80215f6 <udp_sendto_if_src+0x1a6>
  82072. return ERR_VAL;
  82073. }
  82074. #endif /* LWIP_IPV4 && IP_SOF_BROADCAST */
  82075. /* if the PCB is not yet bound to a port, bind it here */
  82076. if (pcb->local_port == 0) {
  82077. 80214e4: 68fb ldr r3, [r7, #12]
  82078. 80214e6: 8a5b ldrh r3, [r3, #18]
  82079. 80214e8: 2b00 cmp r3, #0
  82080. 80214ea: d10f bne.n 802150c <udp_sendto_if_src+0xbc>
  82081. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send: not yet bound to a port, binding now\n"));
  82082. err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
  82083. 80214ec: 68f9 ldr r1, [r7, #12]
  82084. 80214ee: 68fb ldr r3, [r7, #12]
  82085. 80214f0: 8a5b ldrh r3, [r3, #18]
  82086. 80214f2: 461a mov r2, r3
  82087. 80214f4: 68f8 ldr r0, [r7, #12]
  82088. 80214f6: f000 f893 bl 8021620 <udp_bind>
  82089. 80214fa: 4603 mov r3, r0
  82090. 80214fc: 76fb strb r3, [r7, #27]
  82091. if (err != ERR_OK) {
  82092. 80214fe: f997 301b ldrsb.w r3, [r7, #27]
  82093. 8021502: 2b00 cmp r3, #0
  82094. 8021504: d002 beq.n 802150c <udp_sendto_if_src+0xbc>
  82095. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: forced port bind failed\n"));
  82096. return err;
  82097. 8021506: f997 301b ldrsb.w r3, [r7, #27]
  82098. 802150a: e074 b.n 80215f6 <udp_sendto_if_src+0x1a6>
  82099. }
  82100. }
  82101. /* packet too large to add a UDP header without causing an overflow? */
  82102. if ((u16_t)(p->tot_len + UDP_HLEN) < p->tot_len) {
  82103. 802150c: 68bb ldr r3, [r7, #8]
  82104. 802150e: 891b ldrh r3, [r3, #8]
  82105. 8021510: f64f 72f7 movw r2, #65527 @ 0xfff7
  82106. 8021514: 4293 cmp r3, r2
  82107. 8021516: d902 bls.n 802151e <udp_sendto_if_src+0xce>
  82108. return ERR_MEM;
  82109. 8021518: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  82110. 802151c: e06b b.n 80215f6 <udp_sendto_if_src+0x1a6>
  82111. }
  82112. /* not enough space to add an UDP header to first pbuf in given p chain? */
  82113. if (pbuf_add_header(p, UDP_HLEN)) {
  82114. 802151e: 2108 movs r1, #8
  82115. 8021520: 68b8 ldr r0, [r7, #8]
  82116. 8021522: f7f8 ff13 bl 801a34c <pbuf_add_header>
  82117. 8021526: 4603 mov r3, r0
  82118. 8021528: 2b00 cmp r3, #0
  82119. 802152a: d015 beq.n 8021558 <udp_sendto_if_src+0x108>
  82120. /* allocate header in a separate new pbuf */
  82121. q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
  82122. 802152c: f44f 7220 mov.w r2, #640 @ 0x280
  82123. 8021530: 2108 movs r1, #8
  82124. 8021532: 2022 movs r0, #34 @ 0x22
  82125. 8021534: f7f8 fcbc bl 8019eb0 <pbuf_alloc>
  82126. 8021538: 61f8 str r0, [r7, #28]
  82127. /* new header pbuf could not be allocated? */
  82128. if (q == NULL) {
  82129. 802153a: 69fb ldr r3, [r7, #28]
  82130. 802153c: 2b00 cmp r3, #0
  82131. 802153e: d102 bne.n 8021546 <udp_sendto_if_src+0xf6>
  82132. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n"));
  82133. return ERR_MEM;
  82134. 8021540: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  82135. 8021544: e057 b.n 80215f6 <udp_sendto_if_src+0x1a6>
  82136. }
  82137. if (p->tot_len != 0) {
  82138. 8021546: 68bb ldr r3, [r7, #8]
  82139. 8021548: 891b ldrh r3, [r3, #8]
  82140. 802154a: 2b00 cmp r3, #0
  82141. 802154c: d006 beq.n 802155c <udp_sendto_if_src+0x10c>
  82142. /* chain header q in front of given pbuf p (only if p contains data) */
  82143. pbuf_chain(q, p);
  82144. 802154e: 68b9 ldr r1, [r7, #8]
  82145. 8021550: 69f8 ldr r0, [r7, #28]
  82146. 8021552: f7f9 f8e7 bl 801a724 <pbuf_chain>
  82147. 8021556: e001 b.n 802155c <udp_sendto_if_src+0x10c>
  82148. LWIP_DEBUGF(UDP_DEBUG,
  82149. ("udp_send: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p));
  82150. } else {
  82151. /* adding space for header within p succeeded */
  82152. /* first pbuf q equals given pbuf */
  82153. q = p;
  82154. 8021558: 68bb ldr r3, [r7, #8]
  82155. 802155a: 61fb str r3, [r7, #28]
  82156. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p));
  82157. }
  82158. LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
  82159. 802155c: 69fb ldr r3, [r7, #28]
  82160. 802155e: 895b ldrh r3, [r3, #10]
  82161. 8021560: 2b07 cmp r3, #7
  82162. 8021562: d806 bhi.n 8021572 <udp_sendto_if_src+0x122>
  82163. 8021564: 4b26 ldr r3, [pc, #152] @ (8021600 <udp_sendto_if_src+0x1b0>)
  82164. 8021566: f240 320d movw r2, #781 @ 0x30d
  82165. 802156a: 492c ldr r1, [pc, #176] @ (802161c <udp_sendto_if_src+0x1cc>)
  82166. 802156c: 4826 ldr r0, [pc, #152] @ (8021608 <udp_sendto_if_src+0x1b8>)
  82167. 802156e: f008 fa2d bl 80299cc <iprintf>
  82168. (q->len >= sizeof(struct udp_hdr)));
  82169. /* q now represents the packet to be sent */
  82170. udphdr = (struct udp_hdr *)q->payload;
  82171. 8021572: 69fb ldr r3, [r7, #28]
  82172. 8021574: 685b ldr r3, [r3, #4]
  82173. 8021576: 617b str r3, [r7, #20]
  82174. udphdr->src = lwip_htons(pcb->local_port);
  82175. 8021578: 68fb ldr r3, [r7, #12]
  82176. 802157a: 8a5b ldrh r3, [r3, #18]
  82177. 802157c: 4618 mov r0, r3
  82178. 802157e: f7f7 facb bl 8018b18 <lwip_htons>
  82179. 8021582: 4603 mov r3, r0
  82180. 8021584: 461a mov r2, r3
  82181. 8021586: 697b ldr r3, [r7, #20]
  82182. 8021588: 801a strh r2, [r3, #0]
  82183. udphdr->dest = lwip_htons(dst_port);
  82184. 802158a: 887b ldrh r3, [r7, #2]
  82185. 802158c: 4618 mov r0, r3
  82186. 802158e: f7f7 fac3 bl 8018b18 <lwip_htons>
  82187. 8021592: 4603 mov r3, r0
  82188. 8021594: 461a mov r2, r3
  82189. 8021596: 697b ldr r3, [r7, #20]
  82190. 8021598: 805a strh r2, [r3, #2]
  82191. /* in UDP, 0 checksum means 'no checksum' */
  82192. udphdr->chksum = 0x0000;
  82193. 802159a: 697b ldr r3, [r7, #20]
  82194. 802159c: 2200 movs r2, #0
  82195. 802159e: 719a strb r2, [r3, #6]
  82196. 80215a0: 2200 movs r2, #0
  82197. 80215a2: 71da strb r2, [r3, #7]
  82198. ip_proto = IP_PROTO_UDPLITE;
  82199. } else
  82200. #endif /* LWIP_UDPLITE */
  82201. { /* UDP */
  82202. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %"U16_F"\n", q->tot_len));
  82203. udphdr->len = lwip_htons(q->tot_len);
  82204. 80215a4: 69fb ldr r3, [r7, #28]
  82205. 80215a6: 891b ldrh r3, [r3, #8]
  82206. 80215a8: 4618 mov r0, r3
  82207. 80215aa: f7f7 fab5 bl 8018b18 <lwip_htons>
  82208. 80215ae: 4603 mov r3, r0
  82209. 80215b0: 461a mov r2, r3
  82210. 80215b2: 697b ldr r3, [r7, #20]
  82211. 80215b4: 809a strh r2, [r3, #4]
  82212. }
  82213. udphdr->chksum = udpchksum;
  82214. }
  82215. }
  82216. #endif /* CHECKSUM_GEN_UDP */
  82217. ip_proto = IP_PROTO_UDP;
  82218. 80215b6: 2311 movs r3, #17
  82219. 80215b8: 74fb strb r3, [r7, #19]
  82220. /* Determine TTL to use */
  82221. #if LWIP_MULTICAST_TX_OPTIONS
  82222. ttl = (ip_addr_ismulticast(dst_ip) ? udp_get_multicast_ttl(pcb) : pcb->ttl);
  82223. #else /* LWIP_MULTICAST_TX_OPTIONS */
  82224. ttl = pcb->ttl;
  82225. 80215ba: 68fb ldr r3, [r7, #12]
  82226. 80215bc: 7adb ldrb r3, [r3, #11]
  82227. 80215be: 74bb strb r3, [r7, #18]
  82228. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum));
  82229. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,0x%02"X16_F",)\n", (u16_t)ip_proto));
  82230. /* output to IP */
  82231. NETIF_SET_HINTS(netif, &(pcb->netif_hints));
  82232. err = ip_output_if_src(q, src_ip, dst_ip, ttl, pcb->tos, ip_proto, netif);
  82233. 80215c0: 68fb ldr r3, [r7, #12]
  82234. 80215c2: 7a9b ldrb r3, [r3, #10]
  82235. 80215c4: 7cb9 ldrb r1, [r7, #18]
  82236. 80215c6: 6aba ldr r2, [r7, #40] @ 0x28
  82237. 80215c8: 9202 str r2, [sp, #8]
  82238. 80215ca: 7cfa ldrb r2, [r7, #19]
  82239. 80215cc: 9201 str r2, [sp, #4]
  82240. 80215ce: 9300 str r3, [sp, #0]
  82241. 80215d0: 460b mov r3, r1
  82242. 80215d2: 687a ldr r2, [r7, #4]
  82243. 80215d4: 6af9 ldr r1, [r7, #44] @ 0x2c
  82244. 80215d6: 69f8 ldr r0, [r7, #28]
  82245. 80215d8: f003 fbf2 bl 8024dc0 <ip4_output_if_src>
  82246. 80215dc: 4603 mov r3, r0
  82247. 80215de: 76fb strb r3, [r7, #27]
  82248. /* @todo: must this be increased even if error occurred? */
  82249. MIB2_STATS_INC(mib2.udpoutdatagrams);
  82250. /* did we chain a separate header pbuf earlier? */
  82251. if (q != p) {
  82252. 80215e0: 69fa ldr r2, [r7, #28]
  82253. 80215e2: 68bb ldr r3, [r7, #8]
  82254. 80215e4: 429a cmp r2, r3
  82255. 80215e6: d004 beq.n 80215f2 <udp_sendto_if_src+0x1a2>
  82256. /* free the header pbuf */
  82257. pbuf_free(q);
  82258. 80215e8: 69f8 ldr r0, [r7, #28]
  82259. 80215ea: f7f8 ff77 bl 801a4dc <pbuf_free>
  82260. q = NULL;
  82261. 80215ee: 2300 movs r3, #0
  82262. 80215f0: 61fb str r3, [r7, #28]
  82263. /* p is still referenced by the caller, and will live on */
  82264. }
  82265. UDP_STATS_INC(udp.xmit);
  82266. return err;
  82267. 80215f2: f997 301b ldrsb.w r3, [r7, #27]
  82268. }
  82269. 80215f6: 4618 mov r0, r3
  82270. 80215f8: 3720 adds r7, #32
  82271. 80215fa: 46bd mov sp, r7
  82272. 80215fc: bd80 pop {r7, pc}
  82273. 80215fe: bf00 nop
  82274. 8021600: 0802faf0 .word 0x0802faf0
  82275. 8021604: 0802fcdc .word 0x0802fcdc
  82276. 8021608: 0802fb44 .word 0x0802fb44
  82277. 802160c: 0802fcfc .word 0x0802fcfc
  82278. 8021610: 0802fd1c .word 0x0802fd1c
  82279. 8021614: 0802fd40 .word 0x0802fd40
  82280. 8021618: 0802fd64 .word 0x0802fd64
  82281. 802161c: 0802fd88 .word 0x0802fd88
  82282. 08021620 <udp_bind>:
  82283. *
  82284. * @see udp_disconnect()
  82285. */
  82286. err_t
  82287. udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)
  82288. {
  82289. 8021620: b580 push {r7, lr}
  82290. 8021622: b086 sub sp, #24
  82291. 8021624: af00 add r7, sp, #0
  82292. 8021626: 60f8 str r0, [r7, #12]
  82293. 8021628: 60b9 str r1, [r7, #8]
  82294. 802162a: 4613 mov r3, r2
  82295. 802162c: 80fb strh r3, [r7, #6]
  82296. u8_t rebind;
  82297. #if LWIP_IPV6 && LWIP_IPV6_SCOPES
  82298. ip_addr_t zoned_ipaddr;
  82299. #endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
  82300. LWIP_ASSERT_CORE_LOCKED();
  82301. 802162e: f7ee ff7f bl 8010530 <sys_check_core_locking>
  82302. #if LWIP_IPV4
  82303. /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
  82304. if (ipaddr == NULL) {
  82305. 8021632: 68bb ldr r3, [r7, #8]
  82306. 8021634: 2b00 cmp r3, #0
  82307. 8021636: d101 bne.n 802163c <udp_bind+0x1c>
  82308. ipaddr = IP4_ADDR_ANY;
  82309. 8021638: 4b39 ldr r3, [pc, #228] @ (8021720 <udp_bind+0x100>)
  82310. 802163a: 60bb str r3, [r7, #8]
  82311. }
  82312. #else /* LWIP_IPV4 */
  82313. LWIP_ERROR("udp_bind: invalid ipaddr", ipaddr != NULL, return ERR_ARG);
  82314. #endif /* LWIP_IPV4 */
  82315. LWIP_ERROR("udp_bind: invalid pcb", pcb != NULL, return ERR_ARG);
  82316. 802163c: 68fb ldr r3, [r7, #12]
  82317. 802163e: 2b00 cmp r3, #0
  82318. 8021640: d109 bne.n 8021656 <udp_bind+0x36>
  82319. 8021642: 4b38 ldr r3, [pc, #224] @ (8021724 <udp_bind+0x104>)
  82320. 8021644: f240 32b7 movw r2, #951 @ 0x3b7
  82321. 8021648: 4937 ldr r1, [pc, #220] @ (8021728 <udp_bind+0x108>)
  82322. 802164a: 4838 ldr r0, [pc, #224] @ (802172c <udp_bind+0x10c>)
  82323. 802164c: f008 f9be bl 80299cc <iprintf>
  82324. 8021650: f06f 030f mvn.w r3, #15
  82325. 8021654: e060 b.n 8021718 <udp_bind+0xf8>
  82326. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = "));
  82327. ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE, ipaddr);
  82328. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  82329. rebind = 0;
  82330. 8021656: 2300 movs r3, #0
  82331. 8021658: 74fb strb r3, [r7, #19]
  82332. /* Check for double bind and rebind of the same pcb */
  82333. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  82334. 802165a: 4b35 ldr r3, [pc, #212] @ (8021730 <udp_bind+0x110>)
  82335. 802165c: 681b ldr r3, [r3, #0]
  82336. 802165e: 617b str r3, [r7, #20]
  82337. 8021660: e009 b.n 8021676 <udp_bind+0x56>
  82338. /* is this UDP PCB already on active list? */
  82339. if (pcb == ipcb) {
  82340. 8021662: 68fa ldr r2, [r7, #12]
  82341. 8021664: 697b ldr r3, [r7, #20]
  82342. 8021666: 429a cmp r2, r3
  82343. 8021668: d102 bne.n 8021670 <udp_bind+0x50>
  82344. rebind = 1;
  82345. 802166a: 2301 movs r3, #1
  82346. 802166c: 74fb strb r3, [r7, #19]
  82347. break;
  82348. 802166e: e005 b.n 802167c <udp_bind+0x5c>
  82349. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  82350. 8021670: 697b ldr r3, [r7, #20]
  82351. 8021672: 68db ldr r3, [r3, #12]
  82352. 8021674: 617b str r3, [r7, #20]
  82353. 8021676: 697b ldr r3, [r7, #20]
  82354. 8021678: 2b00 cmp r3, #0
  82355. 802167a: d1f2 bne.n 8021662 <udp_bind+0x42>
  82356. ipaddr = &zoned_ipaddr;
  82357. }
  82358. #endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
  82359. /* no port specified? */
  82360. if (port == 0) {
  82361. 802167c: 88fb ldrh r3, [r7, #6]
  82362. 802167e: 2b00 cmp r3, #0
  82363. 8021680: d109 bne.n 8021696 <udp_bind+0x76>
  82364. port = udp_new_port();
  82365. 8021682: f7ff fc2f bl 8020ee4 <udp_new_port>
  82366. 8021686: 4603 mov r3, r0
  82367. 8021688: 80fb strh r3, [r7, #6]
  82368. if (port == 0) {
  82369. 802168a: 88fb ldrh r3, [r7, #6]
  82370. 802168c: 2b00 cmp r3, #0
  82371. 802168e: d12c bne.n 80216ea <udp_bind+0xca>
  82372. /* no more ports available in local range */
  82373. LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n"));
  82374. return ERR_USE;
  82375. 8021690: f06f 0307 mvn.w r3, #7
  82376. 8021694: e040 b.n 8021718 <udp_bind+0xf8>
  82377. }
  82378. } else {
  82379. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  82380. 8021696: 4b26 ldr r3, [pc, #152] @ (8021730 <udp_bind+0x110>)
  82381. 8021698: 681b ldr r3, [r3, #0]
  82382. 802169a: 617b str r3, [r7, #20]
  82383. 802169c: e022 b.n 80216e4 <udp_bind+0xc4>
  82384. if (pcb != ipcb) {
  82385. 802169e: 68fa ldr r2, [r7, #12]
  82386. 80216a0: 697b ldr r3, [r7, #20]
  82387. 80216a2: 429a cmp r2, r3
  82388. 80216a4: d01b beq.n 80216de <udp_bind+0xbe>
  82389. if (!ip_get_option(pcb, SOF_REUSEADDR) ||
  82390. !ip_get_option(ipcb, SOF_REUSEADDR))
  82391. #endif /* SO_REUSE */
  82392. {
  82393. /* port matches that of PCB in list and REUSEADDR not set -> reject */
  82394. if ((ipcb->local_port == port) &&
  82395. 80216a6: 697b ldr r3, [r7, #20]
  82396. 80216a8: 8a5b ldrh r3, [r3, #18]
  82397. 80216aa: 88fa ldrh r2, [r7, #6]
  82398. 80216ac: 429a cmp r2, r3
  82399. 80216ae: d116 bne.n 80216de <udp_bind+0xbe>
  82400. /* IP address matches or any IP used? */
  82401. (ip_addr_cmp(&ipcb->local_ip, ipaddr) || ip_addr_isany(ipaddr) ||
  82402. 80216b0: 697b ldr r3, [r7, #20]
  82403. 80216b2: 681a ldr r2, [r3, #0]
  82404. 80216b4: 68bb ldr r3, [r7, #8]
  82405. 80216b6: 681b ldr r3, [r3, #0]
  82406. if ((ipcb->local_port == port) &&
  82407. 80216b8: 429a cmp r2, r3
  82408. 80216ba: d00d beq.n 80216d8 <udp_bind+0xb8>
  82409. (ip_addr_cmp(&ipcb->local_ip, ipaddr) || ip_addr_isany(ipaddr) ||
  82410. 80216bc: 68bb ldr r3, [r7, #8]
  82411. 80216be: 2b00 cmp r3, #0
  82412. 80216c0: d00a beq.n 80216d8 <udp_bind+0xb8>
  82413. 80216c2: 68bb ldr r3, [r7, #8]
  82414. 80216c4: 681b ldr r3, [r3, #0]
  82415. 80216c6: 2b00 cmp r3, #0
  82416. 80216c8: d006 beq.n 80216d8 <udp_bind+0xb8>
  82417. ip_addr_isany(&ipcb->local_ip))) {
  82418. 80216ca: 697b ldr r3, [r7, #20]
  82419. (ip_addr_cmp(&ipcb->local_ip, ipaddr) || ip_addr_isany(ipaddr) ||
  82420. 80216cc: 2b00 cmp r3, #0
  82421. 80216ce: d003 beq.n 80216d8 <udp_bind+0xb8>
  82422. ip_addr_isany(&ipcb->local_ip))) {
  82423. 80216d0: 697b ldr r3, [r7, #20]
  82424. 80216d2: 681b ldr r3, [r3, #0]
  82425. 80216d4: 2b00 cmp r3, #0
  82426. 80216d6: d102 bne.n 80216de <udp_bind+0xbe>
  82427. /* other PCB already binds to this local IP and port */
  82428. LWIP_DEBUGF(UDP_DEBUG,
  82429. ("udp_bind: local port %"U16_F" already bound by another pcb\n", port));
  82430. return ERR_USE;
  82431. 80216d8: f06f 0307 mvn.w r3, #7
  82432. 80216dc: e01c b.n 8021718 <udp_bind+0xf8>
  82433. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  82434. 80216de: 697b ldr r3, [r7, #20]
  82435. 80216e0: 68db ldr r3, [r3, #12]
  82436. 80216e2: 617b str r3, [r7, #20]
  82437. 80216e4: 697b ldr r3, [r7, #20]
  82438. 80216e6: 2b00 cmp r3, #0
  82439. 80216e8: d1d9 bne.n 802169e <udp_bind+0x7e>
  82440. }
  82441. }
  82442. }
  82443. }
  82444. ip_addr_set_ipaddr(&pcb->local_ip, ipaddr);
  82445. 80216ea: 68bb ldr r3, [r7, #8]
  82446. 80216ec: 2b00 cmp r3, #0
  82447. 80216ee: d002 beq.n 80216f6 <udp_bind+0xd6>
  82448. 80216f0: 68bb ldr r3, [r7, #8]
  82449. 80216f2: 681b ldr r3, [r3, #0]
  82450. 80216f4: e000 b.n 80216f8 <udp_bind+0xd8>
  82451. 80216f6: 2300 movs r3, #0
  82452. 80216f8: 68fa ldr r2, [r7, #12]
  82453. 80216fa: 6013 str r3, [r2, #0]
  82454. pcb->local_port = port;
  82455. 80216fc: 68fb ldr r3, [r7, #12]
  82456. 80216fe: 88fa ldrh r2, [r7, #6]
  82457. 8021700: 825a strh r2, [r3, #18]
  82458. mib2_udp_bind(pcb);
  82459. /* pcb not active yet? */
  82460. if (rebind == 0) {
  82461. 8021702: 7cfb ldrb r3, [r7, #19]
  82462. 8021704: 2b00 cmp r3, #0
  82463. 8021706: d106 bne.n 8021716 <udp_bind+0xf6>
  82464. /* place the PCB on the active list if not already there */
  82465. pcb->next = udp_pcbs;
  82466. 8021708: 4b09 ldr r3, [pc, #36] @ (8021730 <udp_bind+0x110>)
  82467. 802170a: 681a ldr r2, [r3, #0]
  82468. 802170c: 68fb ldr r3, [r7, #12]
  82469. 802170e: 60da str r2, [r3, #12]
  82470. udp_pcbs = pcb;
  82471. 8021710: 4a07 ldr r2, [pc, #28] @ (8021730 <udp_bind+0x110>)
  82472. 8021712: 68fb ldr r3, [r7, #12]
  82473. 8021714: 6013 str r3, [r2, #0]
  82474. }
  82475. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("udp_bind: bound to "));
  82476. ip_addr_debug_print_val(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, pcb->local_ip);
  82477. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (", port %"U16_F")\n", pcb->local_port));
  82478. return ERR_OK;
  82479. 8021716: 2300 movs r3, #0
  82480. }
  82481. 8021718: 4618 mov r0, r3
  82482. 802171a: 3718 adds r7, #24
  82483. 802171c: 46bd mov sp, r7
  82484. 802171e: bd80 pop {r7, pc}
  82485. 8021720: 08030c10 .word 0x08030c10
  82486. 8021724: 0802faf0 .word 0x0802faf0
  82487. 8021728: 0802fdb8 .word 0x0802fdb8
  82488. 802172c: 0802fb44 .word 0x0802fb44
  82489. 8021730: 2402aee8 .word 0x2402aee8
  82490. 08021734 <udp_connect>:
  82491. *
  82492. * @see udp_disconnect()
  82493. */
  82494. err_t
  82495. udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)
  82496. {
  82497. 8021734: b580 push {r7, lr}
  82498. 8021736: b086 sub sp, #24
  82499. 8021738: af00 add r7, sp, #0
  82500. 802173a: 60f8 str r0, [r7, #12]
  82501. 802173c: 60b9 str r1, [r7, #8]
  82502. 802173e: 4613 mov r3, r2
  82503. 8021740: 80fb strh r3, [r7, #6]
  82504. struct udp_pcb *ipcb;
  82505. LWIP_ASSERT_CORE_LOCKED();
  82506. 8021742: f7ee fef5 bl 8010530 <sys_check_core_locking>
  82507. LWIP_ERROR("udp_connect: invalid pcb", pcb != NULL, return ERR_ARG);
  82508. 8021746: 68fb ldr r3, [r7, #12]
  82509. 8021748: 2b00 cmp r3, #0
  82510. 802174a: d109 bne.n 8021760 <udp_connect+0x2c>
  82511. 802174c: 4b2c ldr r3, [pc, #176] @ (8021800 <udp_connect+0xcc>)
  82512. 802174e: f240 4235 movw r2, #1077 @ 0x435
  82513. 8021752: 492c ldr r1, [pc, #176] @ (8021804 <udp_connect+0xd0>)
  82514. 8021754: 482c ldr r0, [pc, #176] @ (8021808 <udp_connect+0xd4>)
  82515. 8021756: f008 f939 bl 80299cc <iprintf>
  82516. 802175a: f06f 030f mvn.w r3, #15
  82517. 802175e: e04b b.n 80217f8 <udp_connect+0xc4>
  82518. LWIP_ERROR("udp_connect: invalid ipaddr", ipaddr != NULL, return ERR_ARG);
  82519. 8021760: 68bb ldr r3, [r7, #8]
  82520. 8021762: 2b00 cmp r3, #0
  82521. 8021764: d109 bne.n 802177a <udp_connect+0x46>
  82522. 8021766: 4b26 ldr r3, [pc, #152] @ (8021800 <udp_connect+0xcc>)
  82523. 8021768: f240 4236 movw r2, #1078 @ 0x436
  82524. 802176c: 4927 ldr r1, [pc, #156] @ (802180c <udp_connect+0xd8>)
  82525. 802176e: 4826 ldr r0, [pc, #152] @ (8021808 <udp_connect+0xd4>)
  82526. 8021770: f008 f92c bl 80299cc <iprintf>
  82527. 8021774: f06f 030f mvn.w r3, #15
  82528. 8021778: e03e b.n 80217f8 <udp_connect+0xc4>
  82529. if (pcb->local_port == 0) {
  82530. 802177a: 68fb ldr r3, [r7, #12]
  82531. 802177c: 8a5b ldrh r3, [r3, #18]
  82532. 802177e: 2b00 cmp r3, #0
  82533. 8021780: d10f bne.n 80217a2 <udp_connect+0x6e>
  82534. err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
  82535. 8021782: 68f9 ldr r1, [r7, #12]
  82536. 8021784: 68fb ldr r3, [r7, #12]
  82537. 8021786: 8a5b ldrh r3, [r3, #18]
  82538. 8021788: 461a mov r2, r3
  82539. 802178a: 68f8 ldr r0, [r7, #12]
  82540. 802178c: f7ff ff48 bl 8021620 <udp_bind>
  82541. 8021790: 4603 mov r3, r0
  82542. 8021792: 75fb strb r3, [r7, #23]
  82543. if (err != ERR_OK) {
  82544. 8021794: f997 3017 ldrsb.w r3, [r7, #23]
  82545. 8021798: 2b00 cmp r3, #0
  82546. 802179a: d002 beq.n 80217a2 <udp_connect+0x6e>
  82547. return err;
  82548. 802179c: f997 3017 ldrsb.w r3, [r7, #23]
  82549. 80217a0: e02a b.n 80217f8 <udp_connect+0xc4>
  82550. }
  82551. }
  82552. ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr);
  82553. 80217a2: 68bb ldr r3, [r7, #8]
  82554. 80217a4: 2b00 cmp r3, #0
  82555. 80217a6: d002 beq.n 80217ae <udp_connect+0x7a>
  82556. 80217a8: 68bb ldr r3, [r7, #8]
  82557. 80217aa: 681b ldr r3, [r3, #0]
  82558. 80217ac: e000 b.n 80217b0 <udp_connect+0x7c>
  82559. 80217ae: 2300 movs r3, #0
  82560. 80217b0: 68fa ldr r2, [r7, #12]
  82561. 80217b2: 6053 str r3, [r2, #4]
  82562. ip6_addr_lacks_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNKNOWN)) {
  82563. ip6_addr_select_zone(ip_2_ip6(&pcb->remote_ip), ip_2_ip6(&pcb->local_ip));
  82564. }
  82565. #endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
  82566. pcb->remote_port = port;
  82567. 80217b4: 68fb ldr r3, [r7, #12]
  82568. 80217b6: 88fa ldrh r2, [r7, #6]
  82569. 80217b8: 829a strh r2, [r3, #20]
  82570. pcb->flags |= UDP_FLAGS_CONNECTED;
  82571. 80217ba: 68fb ldr r3, [r7, #12]
  82572. 80217bc: 7c1b ldrb r3, [r3, #16]
  82573. 80217be: f043 0304 orr.w r3, r3, #4
  82574. 80217c2: b2da uxtb r2, r3
  82575. 80217c4: 68fb ldr r3, [r7, #12]
  82576. 80217c6: 741a strb r2, [r3, #16]
  82577. ip_addr_debug_print_val(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  82578. pcb->remote_ip);
  82579. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (", port %"U16_F")\n", pcb->remote_port));
  82580. /* Insert UDP PCB into the list of active UDP PCBs. */
  82581. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  82582. 80217c8: 4b11 ldr r3, [pc, #68] @ (8021810 <udp_connect+0xdc>)
  82583. 80217ca: 681b ldr r3, [r3, #0]
  82584. 80217cc: 613b str r3, [r7, #16]
  82585. 80217ce: e008 b.n 80217e2 <udp_connect+0xae>
  82586. if (pcb == ipcb) {
  82587. 80217d0: 68fa ldr r2, [r7, #12]
  82588. 80217d2: 693b ldr r3, [r7, #16]
  82589. 80217d4: 429a cmp r2, r3
  82590. 80217d6: d101 bne.n 80217dc <udp_connect+0xa8>
  82591. /* already on the list, just return */
  82592. return ERR_OK;
  82593. 80217d8: 2300 movs r3, #0
  82594. 80217da: e00d b.n 80217f8 <udp_connect+0xc4>
  82595. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  82596. 80217dc: 693b ldr r3, [r7, #16]
  82597. 80217de: 68db ldr r3, [r3, #12]
  82598. 80217e0: 613b str r3, [r7, #16]
  82599. 80217e2: 693b ldr r3, [r7, #16]
  82600. 80217e4: 2b00 cmp r3, #0
  82601. 80217e6: d1f3 bne.n 80217d0 <udp_connect+0x9c>
  82602. }
  82603. }
  82604. /* PCB not yet on the list, add PCB now */
  82605. pcb->next = udp_pcbs;
  82606. 80217e8: 4b09 ldr r3, [pc, #36] @ (8021810 <udp_connect+0xdc>)
  82607. 80217ea: 681a ldr r2, [r3, #0]
  82608. 80217ec: 68fb ldr r3, [r7, #12]
  82609. 80217ee: 60da str r2, [r3, #12]
  82610. udp_pcbs = pcb;
  82611. 80217f0: 4a07 ldr r2, [pc, #28] @ (8021810 <udp_connect+0xdc>)
  82612. 80217f2: 68fb ldr r3, [r7, #12]
  82613. 80217f4: 6013 str r3, [r2, #0]
  82614. return ERR_OK;
  82615. 80217f6: 2300 movs r3, #0
  82616. }
  82617. 80217f8: 4618 mov r0, r3
  82618. 80217fa: 3718 adds r7, #24
  82619. 80217fc: 46bd mov sp, r7
  82620. 80217fe: bd80 pop {r7, pc}
  82621. 8021800: 0802faf0 .word 0x0802faf0
  82622. 8021804: 0802fdd0 .word 0x0802fdd0
  82623. 8021808: 0802fb44 .word 0x0802fb44
  82624. 802180c: 0802fdec .word 0x0802fdec
  82625. 8021810: 2402aee8 .word 0x2402aee8
  82626. 08021814 <udp_disconnect>:
  82627. *
  82628. * @param pcb the udp pcb to disconnect.
  82629. */
  82630. void
  82631. udp_disconnect(struct udp_pcb *pcb)
  82632. {
  82633. 8021814: b580 push {r7, lr}
  82634. 8021816: b082 sub sp, #8
  82635. 8021818: af00 add r7, sp, #0
  82636. 802181a: 6078 str r0, [r7, #4]
  82637. LWIP_ASSERT_CORE_LOCKED();
  82638. 802181c: f7ee fe88 bl 8010530 <sys_check_core_locking>
  82639. LWIP_ERROR("udp_disconnect: invalid pcb", pcb != NULL, return);
  82640. 8021820: 687b ldr r3, [r7, #4]
  82641. 8021822: 2b00 cmp r3, #0
  82642. 8021824: d107 bne.n 8021836 <udp_disconnect+0x22>
  82643. 8021826: 4b0d ldr r3, [pc, #52] @ (802185c <udp_disconnect+0x48>)
  82644. 8021828: f240 426a movw r2, #1130 @ 0x46a
  82645. 802182c: 490c ldr r1, [pc, #48] @ (8021860 <udp_disconnect+0x4c>)
  82646. 802182e: 480d ldr r0, [pc, #52] @ (8021864 <udp_disconnect+0x50>)
  82647. 8021830: f008 f8cc bl 80299cc <iprintf>
  82648. 8021834: e00f b.n 8021856 <udp_disconnect+0x42>
  82649. #if LWIP_IPV4 && LWIP_IPV6
  82650. if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {
  82651. ip_addr_copy(pcb->remote_ip, *IP_ANY_TYPE);
  82652. } else {
  82653. #endif
  82654. ip_addr_set_any(IP_IS_V6_VAL(pcb->remote_ip), &pcb->remote_ip);
  82655. 8021836: 687b ldr r3, [r7, #4]
  82656. 8021838: 2200 movs r2, #0
  82657. 802183a: 605a str r2, [r3, #4]
  82658. #if LWIP_IPV4 && LWIP_IPV6
  82659. }
  82660. #endif
  82661. pcb->remote_port = 0;
  82662. 802183c: 687b ldr r3, [r7, #4]
  82663. 802183e: 2200 movs r2, #0
  82664. 8021840: 829a strh r2, [r3, #20]
  82665. pcb->netif_idx = NETIF_NO_INDEX;
  82666. 8021842: 687b ldr r3, [r7, #4]
  82667. 8021844: 2200 movs r2, #0
  82668. 8021846: 721a strb r2, [r3, #8]
  82669. /* mark PCB as unconnected */
  82670. udp_clear_flags(pcb, UDP_FLAGS_CONNECTED);
  82671. 8021848: 687b ldr r3, [r7, #4]
  82672. 802184a: 7c1b ldrb r3, [r3, #16]
  82673. 802184c: f023 0304 bic.w r3, r3, #4
  82674. 8021850: b2da uxtb r2, r3
  82675. 8021852: 687b ldr r3, [r7, #4]
  82676. 8021854: 741a strb r2, [r3, #16]
  82677. }
  82678. 8021856: 3708 adds r7, #8
  82679. 8021858: 46bd mov sp, r7
  82680. 802185a: bd80 pop {r7, pc}
  82681. 802185c: 0802faf0 .word 0x0802faf0
  82682. 8021860: 0802fe08 .word 0x0802fe08
  82683. 8021864: 0802fb44 .word 0x0802fb44
  82684. 08021868 <udp_recv>:
  82685. * @param recv function pointer of the callback function
  82686. * @param recv_arg additional argument to pass to the callback function
  82687. */
  82688. void
  82689. udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg)
  82690. {
  82691. 8021868: b580 push {r7, lr}
  82692. 802186a: b084 sub sp, #16
  82693. 802186c: af00 add r7, sp, #0
  82694. 802186e: 60f8 str r0, [r7, #12]
  82695. 8021870: 60b9 str r1, [r7, #8]
  82696. 8021872: 607a str r2, [r7, #4]
  82697. LWIP_ASSERT_CORE_LOCKED();
  82698. 8021874: f7ee fe5c bl 8010530 <sys_check_core_locking>
  82699. LWIP_ERROR("udp_recv: invalid pcb", pcb != NULL, return);
  82700. 8021878: 68fb ldr r3, [r7, #12]
  82701. 802187a: 2b00 cmp r3, #0
  82702. 802187c: d107 bne.n 802188e <udp_recv+0x26>
  82703. 802187e: 4b08 ldr r3, [pc, #32] @ (80218a0 <udp_recv+0x38>)
  82704. 8021880: f240 428a movw r2, #1162 @ 0x48a
  82705. 8021884: 4907 ldr r1, [pc, #28] @ (80218a4 <udp_recv+0x3c>)
  82706. 8021886: 4808 ldr r0, [pc, #32] @ (80218a8 <udp_recv+0x40>)
  82707. 8021888: f008 f8a0 bl 80299cc <iprintf>
  82708. 802188c: e005 b.n 802189a <udp_recv+0x32>
  82709. /* remember recv() callback and user data */
  82710. pcb->recv = recv;
  82711. 802188e: 68fb ldr r3, [r7, #12]
  82712. 8021890: 68ba ldr r2, [r7, #8]
  82713. 8021892: 619a str r2, [r3, #24]
  82714. pcb->recv_arg = recv_arg;
  82715. 8021894: 68fb ldr r3, [r7, #12]
  82716. 8021896: 687a ldr r2, [r7, #4]
  82717. 8021898: 61da str r2, [r3, #28]
  82718. }
  82719. 802189a: 3710 adds r7, #16
  82720. 802189c: 46bd mov sp, r7
  82721. 802189e: bd80 pop {r7, pc}
  82722. 80218a0: 0802faf0 .word 0x0802faf0
  82723. 80218a4: 0802fe24 .word 0x0802fe24
  82724. 80218a8: 0802fb44 .word 0x0802fb44
  82725. 080218ac <udp_remove>:
  82726. *
  82727. * @see udp_new()
  82728. */
  82729. void
  82730. udp_remove(struct udp_pcb *pcb)
  82731. {
  82732. 80218ac: b580 push {r7, lr}
  82733. 80218ae: b084 sub sp, #16
  82734. 80218b0: af00 add r7, sp, #0
  82735. 80218b2: 6078 str r0, [r7, #4]
  82736. struct udp_pcb *pcb2;
  82737. LWIP_ASSERT_CORE_LOCKED();
  82738. 80218b4: f7ee fe3c bl 8010530 <sys_check_core_locking>
  82739. LWIP_ERROR("udp_remove: invalid pcb", pcb != NULL, return);
  82740. 80218b8: 687b ldr r3, [r7, #4]
  82741. 80218ba: 2b00 cmp r3, #0
  82742. 80218bc: d107 bne.n 80218ce <udp_remove+0x22>
  82743. 80218be: 4b19 ldr r3, [pc, #100] @ (8021924 <udp_remove+0x78>)
  82744. 80218c0: f240 42a1 movw r2, #1185 @ 0x4a1
  82745. 80218c4: 4918 ldr r1, [pc, #96] @ (8021928 <udp_remove+0x7c>)
  82746. 80218c6: 4819 ldr r0, [pc, #100] @ (802192c <udp_remove+0x80>)
  82747. 80218c8: f008 f880 bl 80299cc <iprintf>
  82748. 80218cc: e026 b.n 802191c <udp_remove+0x70>
  82749. mib2_udp_unbind(pcb);
  82750. /* pcb to be removed is first in list? */
  82751. if (udp_pcbs == pcb) {
  82752. 80218ce: 4b18 ldr r3, [pc, #96] @ (8021930 <udp_remove+0x84>)
  82753. 80218d0: 681b ldr r3, [r3, #0]
  82754. 80218d2: 687a ldr r2, [r7, #4]
  82755. 80218d4: 429a cmp r2, r3
  82756. 80218d6: d105 bne.n 80218e4 <udp_remove+0x38>
  82757. /* make list start at 2nd pcb */
  82758. udp_pcbs = udp_pcbs->next;
  82759. 80218d8: 4b15 ldr r3, [pc, #84] @ (8021930 <udp_remove+0x84>)
  82760. 80218da: 681b ldr r3, [r3, #0]
  82761. 80218dc: 68db ldr r3, [r3, #12]
  82762. 80218de: 4a14 ldr r2, [pc, #80] @ (8021930 <udp_remove+0x84>)
  82763. 80218e0: 6013 str r3, [r2, #0]
  82764. 80218e2: e017 b.n 8021914 <udp_remove+0x68>
  82765. /* pcb not 1st in list */
  82766. } else {
  82767. for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
  82768. 80218e4: 4b12 ldr r3, [pc, #72] @ (8021930 <udp_remove+0x84>)
  82769. 80218e6: 681b ldr r3, [r3, #0]
  82770. 80218e8: 60fb str r3, [r7, #12]
  82771. 80218ea: e010 b.n 802190e <udp_remove+0x62>
  82772. /* find pcb in udp_pcbs list */
  82773. if (pcb2->next != NULL && pcb2->next == pcb) {
  82774. 80218ec: 68fb ldr r3, [r7, #12]
  82775. 80218ee: 68db ldr r3, [r3, #12]
  82776. 80218f0: 2b00 cmp r3, #0
  82777. 80218f2: d009 beq.n 8021908 <udp_remove+0x5c>
  82778. 80218f4: 68fb ldr r3, [r7, #12]
  82779. 80218f6: 68db ldr r3, [r3, #12]
  82780. 80218f8: 687a ldr r2, [r7, #4]
  82781. 80218fa: 429a cmp r2, r3
  82782. 80218fc: d104 bne.n 8021908 <udp_remove+0x5c>
  82783. /* remove pcb from list */
  82784. pcb2->next = pcb->next;
  82785. 80218fe: 687b ldr r3, [r7, #4]
  82786. 8021900: 68da ldr r2, [r3, #12]
  82787. 8021902: 68fb ldr r3, [r7, #12]
  82788. 8021904: 60da str r2, [r3, #12]
  82789. break;
  82790. 8021906: e005 b.n 8021914 <udp_remove+0x68>
  82791. for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
  82792. 8021908: 68fb ldr r3, [r7, #12]
  82793. 802190a: 68db ldr r3, [r3, #12]
  82794. 802190c: 60fb str r3, [r7, #12]
  82795. 802190e: 68fb ldr r3, [r7, #12]
  82796. 8021910: 2b00 cmp r3, #0
  82797. 8021912: d1eb bne.n 80218ec <udp_remove+0x40>
  82798. }
  82799. }
  82800. }
  82801. memp_free(MEMP_UDP_PCB, pcb);
  82802. 8021914: 6879 ldr r1, [r7, #4]
  82803. 8021916: 2000 movs r0, #0
  82804. 8021918: f7f7 fef2 bl 8019700 <memp_free>
  82805. }
  82806. 802191c: 3710 adds r7, #16
  82807. 802191e: 46bd mov sp, r7
  82808. 8021920: bd80 pop {r7, pc}
  82809. 8021922: bf00 nop
  82810. 8021924: 0802faf0 .word 0x0802faf0
  82811. 8021928: 0802fe3c .word 0x0802fe3c
  82812. 802192c: 0802fb44 .word 0x0802fb44
  82813. 8021930: 2402aee8 .word 0x2402aee8
  82814. 08021934 <udp_new>:
  82815. *
  82816. * @see udp_remove()
  82817. */
  82818. struct udp_pcb *
  82819. udp_new(void)
  82820. {
  82821. 8021934: b580 push {r7, lr}
  82822. 8021936: b082 sub sp, #8
  82823. 8021938: af00 add r7, sp, #0
  82824. struct udp_pcb *pcb;
  82825. LWIP_ASSERT_CORE_LOCKED();
  82826. 802193a: f7ee fdf9 bl 8010530 <sys_check_core_locking>
  82827. pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB);
  82828. 802193e: 2000 movs r0, #0
  82829. 8021940: f7f7 fe68 bl 8019614 <memp_malloc>
  82830. 8021944: 6078 str r0, [r7, #4]
  82831. /* could allocate UDP PCB? */
  82832. if (pcb != NULL) {
  82833. 8021946: 687b ldr r3, [r7, #4]
  82834. 8021948: 2b00 cmp r3, #0
  82835. 802194a: d007 beq.n 802195c <udp_new+0x28>
  82836. /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0
  82837. * which means checksum is generated over the whole datagram per default
  82838. * (recommended as default by RFC 3828). */
  82839. /* initialize PCB to all zeroes */
  82840. memset(pcb, 0, sizeof(struct udp_pcb));
  82841. 802194c: 2220 movs r2, #32
  82842. 802194e: 2100 movs r1, #0
  82843. 8021950: 6878 ldr r0, [r7, #4]
  82844. 8021952: f008 f9cd bl 8029cf0 <memset>
  82845. pcb->ttl = UDP_TTL;
  82846. 8021956: 687b ldr r3, [r7, #4]
  82847. 8021958: 22ff movs r2, #255 @ 0xff
  82848. 802195a: 72da strb r2, [r3, #11]
  82849. #if LWIP_MULTICAST_TX_OPTIONS
  82850. udp_set_multicast_ttl(pcb, UDP_TTL);
  82851. #endif /* LWIP_MULTICAST_TX_OPTIONS */
  82852. }
  82853. return pcb;
  82854. 802195c: 687b ldr r3, [r7, #4]
  82855. }
  82856. 802195e: 4618 mov r0, r3
  82857. 8021960: 3708 adds r7, #8
  82858. 8021962: 46bd mov sp, r7
  82859. 8021964: bd80 pop {r7, pc}
  82860. 08021966 <udp_new_ip_type>:
  82861. *
  82862. * @see udp_remove()
  82863. */
  82864. struct udp_pcb *
  82865. udp_new_ip_type(u8_t type)
  82866. {
  82867. 8021966: b580 push {r7, lr}
  82868. 8021968: b084 sub sp, #16
  82869. 802196a: af00 add r7, sp, #0
  82870. 802196c: 4603 mov r3, r0
  82871. 802196e: 71fb strb r3, [r7, #7]
  82872. struct udp_pcb *pcb;
  82873. LWIP_ASSERT_CORE_LOCKED();
  82874. 8021970: f7ee fdde bl 8010530 <sys_check_core_locking>
  82875. pcb = udp_new();
  82876. 8021974: f7ff ffde bl 8021934 <udp_new>
  82877. 8021978: 60f8 str r0, [r7, #12]
  82878. IP_SET_TYPE_VAL(pcb->remote_ip, type);
  82879. }
  82880. #else
  82881. LWIP_UNUSED_ARG(type);
  82882. #endif /* LWIP_IPV4 && LWIP_IPV6 */
  82883. return pcb;
  82884. 802197a: 68fb ldr r3, [r7, #12]
  82885. }
  82886. 802197c: 4618 mov r0, r3
  82887. 802197e: 3710 adds r7, #16
  82888. 8021980: 46bd mov sp, r7
  82889. 8021982: bd80 pop {r7, pc}
  82890. 08021984 <udp_netif_ip_addr_changed>:
  82891. *
  82892. * @param old_addr IP address of the netif before change
  82893. * @param new_addr IP address of the netif after change
  82894. */
  82895. void udp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr)
  82896. {
  82897. 8021984: b480 push {r7}
  82898. 8021986: b085 sub sp, #20
  82899. 8021988: af00 add r7, sp, #0
  82900. 802198a: 6078 str r0, [r7, #4]
  82901. 802198c: 6039 str r1, [r7, #0]
  82902. struct udp_pcb *upcb;
  82903. if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) {
  82904. 802198e: 687b ldr r3, [r7, #4]
  82905. 8021990: 2b00 cmp r3, #0
  82906. 8021992: d01e beq.n 80219d2 <udp_netif_ip_addr_changed+0x4e>
  82907. 8021994: 687b ldr r3, [r7, #4]
  82908. 8021996: 681b ldr r3, [r3, #0]
  82909. 8021998: 2b00 cmp r3, #0
  82910. 802199a: d01a beq.n 80219d2 <udp_netif_ip_addr_changed+0x4e>
  82911. 802199c: 683b ldr r3, [r7, #0]
  82912. 802199e: 2b00 cmp r3, #0
  82913. 80219a0: d017 beq.n 80219d2 <udp_netif_ip_addr_changed+0x4e>
  82914. 80219a2: 683b ldr r3, [r7, #0]
  82915. 80219a4: 681b ldr r3, [r3, #0]
  82916. 80219a6: 2b00 cmp r3, #0
  82917. 80219a8: d013 beq.n 80219d2 <udp_netif_ip_addr_changed+0x4e>
  82918. for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) {
  82919. 80219aa: 4b0d ldr r3, [pc, #52] @ (80219e0 <udp_netif_ip_addr_changed+0x5c>)
  82920. 80219ac: 681b ldr r3, [r3, #0]
  82921. 80219ae: 60fb str r3, [r7, #12]
  82922. 80219b0: e00c b.n 80219cc <udp_netif_ip_addr_changed+0x48>
  82923. /* PCB bound to current local interface address? */
  82924. if (ip_addr_cmp(&upcb->local_ip, old_addr)) {
  82925. 80219b2: 68fb ldr r3, [r7, #12]
  82926. 80219b4: 681a ldr r2, [r3, #0]
  82927. 80219b6: 687b ldr r3, [r7, #4]
  82928. 80219b8: 681b ldr r3, [r3, #0]
  82929. 80219ba: 429a cmp r2, r3
  82930. 80219bc: d103 bne.n 80219c6 <udp_netif_ip_addr_changed+0x42>
  82931. /* The PCB is bound to the old ipaddr and
  82932. * is set to bound to the new one instead */
  82933. ip_addr_copy(upcb->local_ip, *new_addr);
  82934. 80219be: 683b ldr r3, [r7, #0]
  82935. 80219c0: 681a ldr r2, [r3, #0]
  82936. 80219c2: 68fb ldr r3, [r7, #12]
  82937. 80219c4: 601a str r2, [r3, #0]
  82938. for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) {
  82939. 80219c6: 68fb ldr r3, [r7, #12]
  82940. 80219c8: 68db ldr r3, [r3, #12]
  82941. 80219ca: 60fb str r3, [r7, #12]
  82942. 80219cc: 68fb ldr r3, [r7, #12]
  82943. 80219ce: 2b00 cmp r3, #0
  82944. 80219d0: d1ef bne.n 80219b2 <udp_netif_ip_addr_changed+0x2e>
  82945. }
  82946. }
  82947. }
  82948. }
  82949. 80219d2: bf00 nop
  82950. 80219d4: 3714 adds r7, #20
  82951. 80219d6: 46bd mov sp, r7
  82952. 80219d8: f85d 7b04 ldr.w r7, [sp], #4
  82953. 80219dc: 4770 bx lr
  82954. 80219de: bf00 nop
  82955. 80219e0: 2402aee8 .word 0x2402aee8
  82956. 080219e4 <dhcp_inc_pcb_refcount>:
  82957. static void dhcp_option_trailer(u16_t options_out_len, u8_t *options, struct pbuf *p_out);
  82958. /** Ensure DHCP PCB is allocated and bound */
  82959. static err_t
  82960. dhcp_inc_pcb_refcount(void)
  82961. {
  82962. 80219e4: b580 push {r7, lr}
  82963. 80219e6: af00 add r7, sp, #0
  82964. if (dhcp_pcb_refcount == 0) {
  82965. 80219e8: 4b20 ldr r3, [pc, #128] @ (8021a6c <dhcp_inc_pcb_refcount+0x88>)
  82966. 80219ea: 781b ldrb r3, [r3, #0]
  82967. 80219ec: 2b00 cmp r3, #0
  82968. 80219ee: d133 bne.n 8021a58 <dhcp_inc_pcb_refcount+0x74>
  82969. LWIP_ASSERT("dhcp_inc_pcb_refcount(): memory leak", dhcp_pcb == NULL);
  82970. 80219f0: 4b1f ldr r3, [pc, #124] @ (8021a70 <dhcp_inc_pcb_refcount+0x8c>)
  82971. 80219f2: 681b ldr r3, [r3, #0]
  82972. 80219f4: 2b00 cmp r3, #0
  82973. 80219f6: d005 beq.n 8021a04 <dhcp_inc_pcb_refcount+0x20>
  82974. 80219f8: 4b1e ldr r3, [pc, #120] @ (8021a74 <dhcp_inc_pcb_refcount+0x90>)
  82975. 80219fa: 22e5 movs r2, #229 @ 0xe5
  82976. 80219fc: 491e ldr r1, [pc, #120] @ (8021a78 <dhcp_inc_pcb_refcount+0x94>)
  82977. 80219fe: 481f ldr r0, [pc, #124] @ (8021a7c <dhcp_inc_pcb_refcount+0x98>)
  82978. 8021a00: f007 ffe4 bl 80299cc <iprintf>
  82979. /* allocate UDP PCB */
  82980. dhcp_pcb = udp_new();
  82981. 8021a04: f7ff ff96 bl 8021934 <udp_new>
  82982. 8021a08: 4603 mov r3, r0
  82983. 8021a0a: 4a19 ldr r2, [pc, #100] @ (8021a70 <dhcp_inc_pcb_refcount+0x8c>)
  82984. 8021a0c: 6013 str r3, [r2, #0]
  82985. if (dhcp_pcb == NULL) {
  82986. 8021a0e: 4b18 ldr r3, [pc, #96] @ (8021a70 <dhcp_inc_pcb_refcount+0x8c>)
  82987. 8021a10: 681b ldr r3, [r3, #0]
  82988. 8021a12: 2b00 cmp r3, #0
  82989. 8021a14: d102 bne.n 8021a1c <dhcp_inc_pcb_refcount+0x38>
  82990. return ERR_MEM;
  82991. 8021a16: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  82992. 8021a1a: e024 b.n 8021a66 <dhcp_inc_pcb_refcount+0x82>
  82993. }
  82994. ip_set_option(dhcp_pcb, SOF_BROADCAST);
  82995. 8021a1c: 4b14 ldr r3, [pc, #80] @ (8021a70 <dhcp_inc_pcb_refcount+0x8c>)
  82996. 8021a1e: 681b ldr r3, [r3, #0]
  82997. 8021a20: 7a5a ldrb r2, [r3, #9]
  82998. 8021a22: 4b13 ldr r3, [pc, #76] @ (8021a70 <dhcp_inc_pcb_refcount+0x8c>)
  82999. 8021a24: 681b ldr r3, [r3, #0]
  83000. 8021a26: f042 0220 orr.w r2, r2, #32
  83001. 8021a2a: b2d2 uxtb r2, r2
  83002. 8021a2c: 725a strb r2, [r3, #9]
  83003. /* set up local and remote port for the pcb -> listen on all interfaces on all src/dest IPs */
  83004. udp_bind(dhcp_pcb, IP4_ADDR_ANY, LWIP_IANA_PORT_DHCP_CLIENT);
  83005. 8021a2e: 4b10 ldr r3, [pc, #64] @ (8021a70 <dhcp_inc_pcb_refcount+0x8c>)
  83006. 8021a30: 681b ldr r3, [r3, #0]
  83007. 8021a32: 2244 movs r2, #68 @ 0x44
  83008. 8021a34: 4912 ldr r1, [pc, #72] @ (8021a80 <dhcp_inc_pcb_refcount+0x9c>)
  83009. 8021a36: 4618 mov r0, r3
  83010. 8021a38: f7ff fdf2 bl 8021620 <udp_bind>
  83011. udp_connect(dhcp_pcb, IP4_ADDR_ANY, LWIP_IANA_PORT_DHCP_SERVER);
  83012. 8021a3c: 4b0c ldr r3, [pc, #48] @ (8021a70 <dhcp_inc_pcb_refcount+0x8c>)
  83013. 8021a3e: 681b ldr r3, [r3, #0]
  83014. 8021a40: 2243 movs r2, #67 @ 0x43
  83015. 8021a42: 490f ldr r1, [pc, #60] @ (8021a80 <dhcp_inc_pcb_refcount+0x9c>)
  83016. 8021a44: 4618 mov r0, r3
  83017. 8021a46: f7ff fe75 bl 8021734 <udp_connect>
  83018. udp_recv(dhcp_pcb, dhcp_recv, NULL);
  83019. 8021a4a: 4b09 ldr r3, [pc, #36] @ (8021a70 <dhcp_inc_pcb_refcount+0x8c>)
  83020. 8021a4c: 681b ldr r3, [r3, #0]
  83021. 8021a4e: 2200 movs r2, #0
  83022. 8021a50: 490c ldr r1, [pc, #48] @ (8021a84 <dhcp_inc_pcb_refcount+0xa0>)
  83023. 8021a52: 4618 mov r0, r3
  83024. 8021a54: f7ff ff08 bl 8021868 <udp_recv>
  83025. }
  83026. dhcp_pcb_refcount++;
  83027. 8021a58: 4b04 ldr r3, [pc, #16] @ (8021a6c <dhcp_inc_pcb_refcount+0x88>)
  83028. 8021a5a: 781b ldrb r3, [r3, #0]
  83029. 8021a5c: 3301 adds r3, #1
  83030. 8021a5e: b2da uxtb r2, r3
  83031. 8021a60: 4b02 ldr r3, [pc, #8] @ (8021a6c <dhcp_inc_pcb_refcount+0x88>)
  83032. 8021a62: 701a strb r2, [r3, #0]
  83033. return ERR_OK;
  83034. 8021a64: 2300 movs r3, #0
  83035. }
  83036. 8021a66: 4618 mov r0, r3
  83037. 8021a68: bd80 pop {r7, pc}
  83038. 8021a6a: bf00 nop
  83039. 8021a6c: 2402af18 .word 0x2402af18
  83040. 8021a70: 2402af14 .word 0x2402af14
  83041. 8021a74: 0802fe54 .word 0x0802fe54
  83042. 8021a78: 0802fe8c .word 0x0802fe8c
  83043. 8021a7c: 0802feb4 .word 0x0802feb4
  83044. 8021a80: 08030c10 .word 0x08030c10
  83045. 8021a84: 08023355 .word 0x08023355
  83046. 08021a88 <dhcp_dec_pcb_refcount>:
  83047. /** Free DHCP PCB if the last netif stops using it */
  83048. static void
  83049. dhcp_dec_pcb_refcount(void)
  83050. {
  83051. 8021a88: b580 push {r7, lr}
  83052. 8021a8a: af00 add r7, sp, #0
  83053. LWIP_ASSERT("dhcp_pcb_refcount(): refcount error", (dhcp_pcb_refcount > 0));
  83054. 8021a8c: 4b0e ldr r3, [pc, #56] @ (8021ac8 <dhcp_dec_pcb_refcount+0x40>)
  83055. 8021a8e: 781b ldrb r3, [r3, #0]
  83056. 8021a90: 2b00 cmp r3, #0
  83057. 8021a92: d105 bne.n 8021aa0 <dhcp_dec_pcb_refcount+0x18>
  83058. 8021a94: 4b0d ldr r3, [pc, #52] @ (8021acc <dhcp_dec_pcb_refcount+0x44>)
  83059. 8021a96: 22ff movs r2, #255 @ 0xff
  83060. 8021a98: 490d ldr r1, [pc, #52] @ (8021ad0 <dhcp_dec_pcb_refcount+0x48>)
  83061. 8021a9a: 480e ldr r0, [pc, #56] @ (8021ad4 <dhcp_dec_pcb_refcount+0x4c>)
  83062. 8021a9c: f007 ff96 bl 80299cc <iprintf>
  83063. dhcp_pcb_refcount--;
  83064. 8021aa0: 4b09 ldr r3, [pc, #36] @ (8021ac8 <dhcp_dec_pcb_refcount+0x40>)
  83065. 8021aa2: 781b ldrb r3, [r3, #0]
  83066. 8021aa4: 3b01 subs r3, #1
  83067. 8021aa6: b2da uxtb r2, r3
  83068. 8021aa8: 4b07 ldr r3, [pc, #28] @ (8021ac8 <dhcp_dec_pcb_refcount+0x40>)
  83069. 8021aaa: 701a strb r2, [r3, #0]
  83070. if (dhcp_pcb_refcount == 0) {
  83071. 8021aac: 4b06 ldr r3, [pc, #24] @ (8021ac8 <dhcp_dec_pcb_refcount+0x40>)
  83072. 8021aae: 781b ldrb r3, [r3, #0]
  83073. 8021ab0: 2b00 cmp r3, #0
  83074. 8021ab2: d107 bne.n 8021ac4 <dhcp_dec_pcb_refcount+0x3c>
  83075. udp_remove(dhcp_pcb);
  83076. 8021ab4: 4b08 ldr r3, [pc, #32] @ (8021ad8 <dhcp_dec_pcb_refcount+0x50>)
  83077. 8021ab6: 681b ldr r3, [r3, #0]
  83078. 8021ab8: 4618 mov r0, r3
  83079. 8021aba: f7ff fef7 bl 80218ac <udp_remove>
  83080. dhcp_pcb = NULL;
  83081. 8021abe: 4b06 ldr r3, [pc, #24] @ (8021ad8 <dhcp_dec_pcb_refcount+0x50>)
  83082. 8021ac0: 2200 movs r2, #0
  83083. 8021ac2: 601a str r2, [r3, #0]
  83084. }
  83085. }
  83086. 8021ac4: bf00 nop
  83087. 8021ac6: bd80 pop {r7, pc}
  83088. 8021ac8: 2402af18 .word 0x2402af18
  83089. 8021acc: 0802fe54 .word 0x0802fe54
  83090. 8021ad0: 0802fedc .word 0x0802fedc
  83091. 8021ad4: 0802feb4 .word 0x0802feb4
  83092. 8021ad8: 2402af14 .word 0x2402af14
  83093. 08021adc <dhcp_handle_nak>:
  83094. *
  83095. * @param netif the netif under DHCP control
  83096. */
  83097. static void
  83098. dhcp_handle_nak(struct netif *netif)
  83099. {
  83100. 8021adc: b580 push {r7, lr}
  83101. 8021ade: b084 sub sp, #16
  83102. 8021ae0: af00 add r7, sp, #0
  83103. 8021ae2: 6078 str r0, [r7, #4]
  83104. struct dhcp *dhcp = netif_dhcp_data(netif);
  83105. 8021ae4: 687b ldr r3, [r7, #4]
  83106. 8021ae6: 6a5b ldr r3, [r3, #36] @ 0x24
  83107. 8021ae8: 60fb str r3, [r7, #12]
  83108. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n",
  83109. (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  83110. /* Change to a defined state - set this before assigning the address
  83111. to ensure the callback can use dhcp_supplied_address() */
  83112. dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);
  83113. 8021aea: 210c movs r1, #12
  83114. 8021aec: 68f8 ldr r0, [r7, #12]
  83115. 8021aee: f001 f862 bl 8022bb6 <dhcp_set_state>
  83116. /* remove IP address from interface (must no longer be used, as per RFC2131) */
  83117. netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);
  83118. 8021af2: 4b06 ldr r3, [pc, #24] @ (8021b0c <dhcp_handle_nak+0x30>)
  83119. 8021af4: 4a05 ldr r2, [pc, #20] @ (8021b0c <dhcp_handle_nak+0x30>)
  83120. 8021af6: 4905 ldr r1, [pc, #20] @ (8021b0c <dhcp_handle_nak+0x30>)
  83121. 8021af8: 6878 ldr r0, [r7, #4]
  83122. 8021afa: f7f7 ffa5 bl 8019a48 <netif_set_addr>
  83123. /* We can immediately restart discovery */
  83124. dhcp_discover(netif);
  83125. 8021afe: 6878 ldr r0, [r7, #4]
  83126. 8021b00: f000 fc4c bl 802239c <dhcp_discover>
  83127. }
  83128. 8021b04: bf00 nop
  83129. 8021b06: 3710 adds r7, #16
  83130. 8021b08: 46bd mov sp, r7
  83131. 8021b0a: bd80 pop {r7, pc}
  83132. 8021b0c: 08030c10 .word 0x08030c10
  83133. 08021b10 <dhcp_check>:
  83134. *
  83135. * @param netif the netif under DHCP control
  83136. */
  83137. static void
  83138. dhcp_check(struct netif *netif)
  83139. {
  83140. 8021b10: b580 push {r7, lr}
  83141. 8021b12: b084 sub sp, #16
  83142. 8021b14: af00 add r7, sp, #0
  83143. 8021b16: 6078 str r0, [r7, #4]
  83144. struct dhcp *dhcp = netif_dhcp_data(netif);
  83145. 8021b18: 687b ldr r3, [r7, #4]
  83146. 8021b1a: 6a5b ldr r3, [r3, #36] @ 0x24
  83147. 8021b1c: 60fb str r3, [r7, #12]
  83148. err_t result;
  83149. u16_t msecs;
  83150. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0],
  83151. (s16_t)netif->name[1]));
  83152. dhcp_set_state(dhcp, DHCP_STATE_CHECKING);
  83153. 8021b1e: 2108 movs r1, #8
  83154. 8021b20: 68f8 ldr r0, [r7, #12]
  83155. 8021b22: f001 f848 bl 8022bb6 <dhcp_set_state>
  83156. /* create an ARP query for the offered IP address, expecting that no host
  83157. responds, as the IP address should not be in use. */
  83158. result = etharp_query(netif, &dhcp->offered_ip_addr, NULL);
  83159. 8021b26: 68fb ldr r3, [r7, #12]
  83160. 8021b28: 331c adds r3, #28
  83161. 8021b2a: 2200 movs r2, #0
  83162. 8021b2c: 4619 mov r1, r3
  83163. 8021b2e: 6878 ldr r0, [r7, #4]
  83164. 8021b30: f002 fb88 bl 8024244 <etharp_query>
  83165. 8021b34: 4603 mov r3, r0
  83166. 8021b36: 72fb strb r3, [r7, #11]
  83167. if (result != ERR_OK) {
  83168. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_check: could not perform ARP query\n"));
  83169. }
  83170. if (dhcp->tries < 255) {
  83171. 8021b38: 68fb ldr r3, [r7, #12]
  83172. 8021b3a: 799b ldrb r3, [r3, #6]
  83173. 8021b3c: 2bff cmp r3, #255 @ 0xff
  83174. 8021b3e: d005 beq.n 8021b4c <dhcp_check+0x3c>
  83175. dhcp->tries++;
  83176. 8021b40: 68fb ldr r3, [r7, #12]
  83177. 8021b42: 799b ldrb r3, [r3, #6]
  83178. 8021b44: 3301 adds r3, #1
  83179. 8021b46: b2da uxtb r2, r3
  83180. 8021b48: 68fb ldr r3, [r7, #12]
  83181. 8021b4a: 719a strb r2, [r3, #6]
  83182. }
  83183. msecs = 500;
  83184. 8021b4c: f44f 73fa mov.w r3, #500 @ 0x1f4
  83185. 8021b50: 813b strh r3, [r7, #8]
  83186. dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
  83187. 8021b52: 893b ldrh r3, [r7, #8]
  83188. 8021b54: f203 13f3 addw r3, r3, #499 @ 0x1f3
  83189. 8021b58: 4a06 ldr r2, [pc, #24] @ (8021b74 <dhcp_check+0x64>)
  83190. 8021b5a: fb82 1203 smull r1, r2, r2, r3
  83191. 8021b5e: 1152 asrs r2, r2, #5
  83192. 8021b60: 17db asrs r3, r3, #31
  83193. 8021b62: 1ad3 subs r3, r2, r3
  83194. 8021b64: b29a uxth r2, r3
  83195. 8021b66: 68fb ldr r3, [r7, #12]
  83196. 8021b68: 811a strh r2, [r3, #8]
  83197. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_check(): set request timeout %"U16_F" msecs\n", msecs));
  83198. }
  83199. 8021b6a: bf00 nop
  83200. 8021b6c: 3710 adds r7, #16
  83201. 8021b6e: 46bd mov sp, r7
  83202. 8021b70: bd80 pop {r7, pc}
  83203. 8021b72: bf00 nop
  83204. 8021b74: 10624dd3 .word 0x10624dd3
  83205. 08021b78 <dhcp_handle_offer>:
  83206. *
  83207. * @param netif the netif under DHCP control
  83208. */
  83209. static void
  83210. dhcp_handle_offer(struct netif *netif, struct dhcp_msg *msg_in)
  83211. {
  83212. 8021b78: b580 push {r7, lr}
  83213. 8021b7a: b084 sub sp, #16
  83214. 8021b7c: af00 add r7, sp, #0
  83215. 8021b7e: 6078 str r0, [r7, #4]
  83216. 8021b80: 6039 str r1, [r7, #0]
  83217. struct dhcp *dhcp = netif_dhcp_data(netif);
  83218. 8021b82: 687b ldr r3, [r7, #4]
  83219. 8021b84: 6a5b ldr r3, [r3, #36] @ 0x24
  83220. 8021b86: 60fb str r3, [r7, #12]
  83221. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
  83222. (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  83223. /* obtain the server address */
  83224. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  83225. 8021b88: 4b0c ldr r3, [pc, #48] @ (8021bbc <dhcp_handle_offer+0x44>)
  83226. 8021b8a: 789b ldrb r3, [r3, #2]
  83227. 8021b8c: 2b00 cmp r3, #0
  83228. 8021b8e: d011 beq.n 8021bb4 <dhcp_handle_offer+0x3c>
  83229. dhcp->request_timeout = 0; /* stop timer */
  83230. 8021b90: 68fb ldr r3, [r7, #12]
  83231. 8021b92: 2200 movs r2, #0
  83232. 8021b94: 811a strh r2, [r3, #8]
  83233. ip_addr_set_ip4_u32(&dhcp->server_ip_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
  83234. 8021b96: 4b0a ldr r3, [pc, #40] @ (8021bc0 <dhcp_handle_offer+0x48>)
  83235. 8021b98: 689b ldr r3, [r3, #8]
  83236. 8021b9a: 4618 mov r0, r3
  83237. 8021b9c: f7f6 ffd1 bl 8018b42 <lwip_htonl>
  83238. 8021ba0: 4602 mov r2, r0
  83239. 8021ba2: 68fb ldr r3, [r7, #12]
  83240. 8021ba4: 619a str r2, [r3, #24]
  83241. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
  83242. ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));
  83243. /* remember offered address */
  83244. ip4_addr_copy(dhcp->offered_ip_addr, msg_in->yiaddr);
  83245. 8021ba6: 683b ldr r3, [r7, #0]
  83246. 8021ba8: 691a ldr r2, [r3, #16]
  83247. 8021baa: 68fb ldr r3, [r7, #12]
  83248. 8021bac: 61da str r2, [r3, #28]
  83249. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n",
  83250. ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  83251. dhcp_select(netif);
  83252. 8021bae: 6878 ldr r0, [r7, #4]
  83253. 8021bb0: f000 f808 bl 8021bc4 <dhcp_select>
  83254. } else {
  83255. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  83256. ("dhcp_handle_offer(netif=%p) did not get server ID!\n", (void *)netif));
  83257. }
  83258. }
  83259. 8021bb4: bf00 nop
  83260. 8021bb6: 3710 adds r7, #16
  83261. 8021bb8: 46bd mov sp, r7
  83262. 8021bba: bd80 pop {r7, pc}
  83263. 8021bbc: 2402af0c .word 0x2402af0c
  83264. 8021bc0: 2402aeec .word 0x2402aeec
  83265. 08021bc4 <dhcp_select>:
  83266. * @param netif the netif under DHCP control
  83267. * @return lwIP specific error (see error.h)
  83268. */
  83269. static err_t
  83270. dhcp_select(struct netif *netif)
  83271. {
  83272. 8021bc4: b5b0 push {r4, r5, r7, lr}
  83273. 8021bc6: b08a sub sp, #40 @ 0x28
  83274. 8021bc8: af02 add r7, sp, #8
  83275. 8021bca: 6078 str r0, [r7, #4]
  83276. u16_t msecs;
  83277. u8_t i;
  83278. struct pbuf *p_out;
  83279. u16_t options_out_len;
  83280. LWIP_ERROR("dhcp_select: netif != NULL", (netif != NULL), return ERR_ARG;);
  83281. 8021bcc: 687b ldr r3, [r7, #4]
  83282. 8021bce: 2b00 cmp r3, #0
  83283. 8021bd0: d109 bne.n 8021be6 <dhcp_select+0x22>
  83284. 8021bd2: 4b71 ldr r3, [pc, #452] @ (8021d98 <dhcp_select+0x1d4>)
  83285. 8021bd4: f240 1277 movw r2, #375 @ 0x177
  83286. 8021bd8: 4970 ldr r1, [pc, #448] @ (8021d9c <dhcp_select+0x1d8>)
  83287. 8021bda: 4871 ldr r0, [pc, #452] @ (8021da0 <dhcp_select+0x1dc>)
  83288. 8021bdc: f007 fef6 bl 80299cc <iprintf>
  83289. 8021be0: f06f 030f mvn.w r3, #15
  83290. 8021be4: e0d3 b.n 8021d8e <dhcp_select+0x1ca>
  83291. dhcp = netif_dhcp_data(netif);
  83292. 8021be6: 687b ldr r3, [r7, #4]
  83293. 8021be8: 6a5b ldr r3, [r3, #36] @ 0x24
  83294. 8021bea: 61bb str r3, [r7, #24]
  83295. LWIP_ERROR("dhcp_select: dhcp != NULL", (dhcp != NULL), return ERR_VAL;);
  83296. 8021bec: 69bb ldr r3, [r7, #24]
  83297. 8021bee: 2b00 cmp r3, #0
  83298. 8021bf0: d109 bne.n 8021c06 <dhcp_select+0x42>
  83299. 8021bf2: 4b69 ldr r3, [pc, #420] @ (8021d98 <dhcp_select+0x1d4>)
  83300. 8021bf4: f240 1279 movw r2, #377 @ 0x179
  83301. 8021bf8: 496a ldr r1, [pc, #424] @ (8021da4 <dhcp_select+0x1e0>)
  83302. 8021bfa: 4869 ldr r0, [pc, #420] @ (8021da0 <dhcp_select+0x1dc>)
  83303. 8021bfc: f007 fee6 bl 80299cc <iprintf>
  83304. 8021c00: f06f 0305 mvn.w r3, #5
  83305. 8021c04: e0c3 b.n 8021d8e <dhcp_select+0x1ca>
  83306. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_select(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  83307. dhcp_set_state(dhcp, DHCP_STATE_REQUESTING);
  83308. 8021c06: 2101 movs r1, #1
  83309. 8021c08: 69b8 ldr r0, [r7, #24]
  83310. 8021c0a: f000 ffd4 bl 8022bb6 <dhcp_set_state>
  83311. /* create and initialize the DHCP message header */
  83312. p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len);
  83313. 8021c0e: f107 030c add.w r3, r7, #12
  83314. 8021c12: 2203 movs r2, #3
  83315. 8021c14: 69b9 ldr r1, [r7, #24]
  83316. 8021c16: 6878 ldr r0, [r7, #4]
  83317. 8021c18: f001 fc66 bl 80234e8 <dhcp_create_msg>
  83318. 8021c1c: 6178 str r0, [r7, #20]
  83319. if (p_out != NULL) {
  83320. 8021c1e: 697b ldr r3, [r7, #20]
  83321. 8021c20: 2b00 cmp r3, #0
  83322. 8021c22: f000 8085 beq.w 8021d30 <dhcp_select+0x16c>
  83323. struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
  83324. 8021c26: 697b ldr r3, [r7, #20]
  83325. 8021c28: 685b ldr r3, [r3, #4]
  83326. 8021c2a: 613b str r3, [r7, #16]
  83327. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  83328. 8021c2c: 89b8 ldrh r0, [r7, #12]
  83329. 8021c2e: 693b ldr r3, [r7, #16]
  83330. 8021c30: f103 01f0 add.w r1, r3, #240 @ 0xf0
  83331. 8021c34: 2302 movs r3, #2
  83332. 8021c36: 2239 movs r2, #57 @ 0x39
  83333. 8021c38: f000 ffd8 bl 8022bec <dhcp_option>
  83334. 8021c3c: 4603 mov r3, r0
  83335. 8021c3e: 81bb strh r3, [r7, #12]
  83336. options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif));
  83337. 8021c40: 89b8 ldrh r0, [r7, #12]
  83338. 8021c42: 693b ldr r3, [r7, #16]
  83339. 8021c44: f103 01f0 add.w r1, r3, #240 @ 0xf0
  83340. 8021c48: 687b ldr r3, [r7, #4]
  83341. 8021c4a: 8d1b ldrh r3, [r3, #40] @ 0x28
  83342. 8021c4c: 461a mov r2, r3
  83343. 8021c4e: f001 f827 bl 8022ca0 <dhcp_option_short>
  83344. 8021c52: 4603 mov r3, r0
  83345. 8021c54: 81bb strh r3, [r7, #12]
  83346. /* MUST request the offered IP address */
  83347. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4);
  83348. 8021c56: 89b8 ldrh r0, [r7, #12]
  83349. 8021c58: 693b ldr r3, [r7, #16]
  83350. 8021c5a: f103 01f0 add.w r1, r3, #240 @ 0xf0
  83351. 8021c5e: 2304 movs r3, #4
  83352. 8021c60: 2232 movs r2, #50 @ 0x32
  83353. 8021c62: f000 ffc3 bl 8022bec <dhcp_option>
  83354. 8021c66: 4603 mov r3, r0
  83355. 8021c68: 81bb strh r3, [r7, #12]
  83356. options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  83357. 8021c6a: 89bc ldrh r4, [r7, #12]
  83358. 8021c6c: 693b ldr r3, [r7, #16]
  83359. 8021c6e: f103 05f0 add.w r5, r3, #240 @ 0xf0
  83360. 8021c72: 69bb ldr r3, [r7, #24]
  83361. 8021c74: 69db ldr r3, [r3, #28]
  83362. 8021c76: 4618 mov r0, r3
  83363. 8021c78: f7f6 ff63 bl 8018b42 <lwip_htonl>
  83364. 8021c7c: 4603 mov r3, r0
  83365. 8021c7e: 461a mov r2, r3
  83366. 8021c80: 4629 mov r1, r5
  83367. 8021c82: 4620 mov r0, r4
  83368. 8021c84: f001 f83e bl 8022d04 <dhcp_option_long>
  83369. 8021c88: 4603 mov r3, r0
  83370. 8021c8a: 81bb strh r3, [r7, #12]
  83371. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_SERVER_ID, 4);
  83372. 8021c8c: 89b8 ldrh r0, [r7, #12]
  83373. 8021c8e: 693b ldr r3, [r7, #16]
  83374. 8021c90: f103 01f0 add.w r1, r3, #240 @ 0xf0
  83375. 8021c94: 2304 movs r3, #4
  83376. 8021c96: 2236 movs r2, #54 @ 0x36
  83377. 8021c98: f000 ffa8 bl 8022bec <dhcp_option>
  83378. 8021c9c: 4603 mov r3, r0
  83379. 8021c9e: 81bb strh r3, [r7, #12]
  83380. options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));
  83381. 8021ca0: 89bc ldrh r4, [r7, #12]
  83382. 8021ca2: 693b ldr r3, [r7, #16]
  83383. 8021ca4: f103 05f0 add.w r5, r3, #240 @ 0xf0
  83384. 8021ca8: 69bb ldr r3, [r7, #24]
  83385. 8021caa: 699b ldr r3, [r3, #24]
  83386. 8021cac: 4618 mov r0, r3
  83387. 8021cae: f7f6 ff48 bl 8018b42 <lwip_htonl>
  83388. 8021cb2: 4603 mov r3, r0
  83389. 8021cb4: 461a mov r2, r3
  83390. 8021cb6: 4629 mov r1, r5
  83391. 8021cb8: 4620 mov r0, r4
  83392. 8021cba: f001 f823 bl 8022d04 <dhcp_option_long>
  83393. 8021cbe: 4603 mov r3, r0
  83394. 8021cc0: 81bb strh r3, [r7, #12]
  83395. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
  83396. 8021cc2: 89b8 ldrh r0, [r7, #12]
  83397. 8021cc4: 693b ldr r3, [r7, #16]
  83398. 8021cc6: f103 01f0 add.w r1, r3, #240 @ 0xf0
  83399. 8021cca: 2303 movs r3, #3
  83400. 8021ccc: 2237 movs r2, #55 @ 0x37
  83401. 8021cce: f000 ff8d bl 8022bec <dhcp_option>
  83402. 8021cd2: 4603 mov r3, r0
  83403. 8021cd4: 81bb strh r3, [r7, #12]
  83404. for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
  83405. 8021cd6: 2300 movs r3, #0
  83406. 8021cd8: 77fb strb r3, [r7, #31]
  83407. 8021cda: e00e b.n 8021cfa <dhcp_select+0x136>
  83408. options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
  83409. 8021cdc: 89b8 ldrh r0, [r7, #12]
  83410. 8021cde: 693b ldr r3, [r7, #16]
  83411. 8021ce0: f103 01f0 add.w r1, r3, #240 @ 0xf0
  83412. 8021ce4: 7ffb ldrb r3, [r7, #31]
  83413. 8021ce6: 4a30 ldr r2, [pc, #192] @ (8021da8 <dhcp_select+0x1e4>)
  83414. 8021ce8: 5cd3 ldrb r3, [r2, r3]
  83415. 8021cea: 461a mov r2, r3
  83416. 8021cec: f000 ffb2 bl 8022c54 <dhcp_option_byte>
  83417. 8021cf0: 4603 mov r3, r0
  83418. 8021cf2: 81bb strh r3, [r7, #12]
  83419. for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
  83420. 8021cf4: 7ffb ldrb r3, [r7, #31]
  83421. 8021cf6: 3301 adds r3, #1
  83422. 8021cf8: 77fb strb r3, [r7, #31]
  83423. 8021cfa: 7ffb ldrb r3, [r7, #31]
  83424. 8021cfc: 2b02 cmp r3, #2
  83425. 8021cfe: d9ed bls.n 8021cdc <dhcp_select+0x118>
  83426. #if LWIP_NETIF_HOSTNAME
  83427. options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif);
  83428. #endif /* LWIP_NETIF_HOSTNAME */
  83429. LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_REQUESTING, msg_out, DHCP_REQUEST, &options_out_len);
  83430. dhcp_option_trailer(options_out_len, msg_out->options, p_out);
  83431. 8021d00: 89b8 ldrh r0, [r7, #12]
  83432. 8021d02: 693b ldr r3, [r7, #16]
  83433. 8021d04: 33f0 adds r3, #240 @ 0xf0
  83434. 8021d06: 697a ldr r2, [r7, #20]
  83435. 8021d08: 4619 mov r1, r3
  83436. 8021d0a: f001 fcc3 bl 8023694 <dhcp_option_trailer>
  83437. /* send broadcast to any DHCP server */
  83438. result = udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY);
  83439. 8021d0e: 4b27 ldr r3, [pc, #156] @ (8021dac <dhcp_select+0x1e8>)
  83440. 8021d10: 6818 ldr r0, [r3, #0]
  83441. 8021d12: 4b27 ldr r3, [pc, #156] @ (8021db0 <dhcp_select+0x1ec>)
  83442. 8021d14: 9301 str r3, [sp, #4]
  83443. 8021d16: 687b ldr r3, [r7, #4]
  83444. 8021d18: 9300 str r3, [sp, #0]
  83445. 8021d1a: 2343 movs r3, #67 @ 0x43
  83446. 8021d1c: 4a25 ldr r2, [pc, #148] @ (8021db4 <dhcp_select+0x1f0>)
  83447. 8021d1e: 6979 ldr r1, [r7, #20]
  83448. 8021d20: f7ff fb96 bl 8021450 <udp_sendto_if_src>
  83449. 8021d24: 4603 mov r3, r0
  83450. 8021d26: 77bb strb r3, [r7, #30]
  83451. pbuf_free(p_out);
  83452. 8021d28: 6978 ldr r0, [r7, #20]
  83453. 8021d2a: f7f8 fbd7 bl 801a4dc <pbuf_free>
  83454. 8021d2e: e001 b.n 8021d34 <dhcp_select+0x170>
  83455. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n"));
  83456. } else {
  83457. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n"));
  83458. result = ERR_MEM;
  83459. 8021d30: 23ff movs r3, #255 @ 0xff
  83460. 8021d32: 77bb strb r3, [r7, #30]
  83461. }
  83462. if (dhcp->tries < 255) {
  83463. 8021d34: 69bb ldr r3, [r7, #24]
  83464. 8021d36: 799b ldrb r3, [r3, #6]
  83465. 8021d38: 2bff cmp r3, #255 @ 0xff
  83466. 8021d3a: d005 beq.n 8021d48 <dhcp_select+0x184>
  83467. dhcp->tries++;
  83468. 8021d3c: 69bb ldr r3, [r7, #24]
  83469. 8021d3e: 799b ldrb r3, [r3, #6]
  83470. 8021d40: 3301 adds r3, #1
  83471. 8021d42: b2da uxtb r2, r3
  83472. 8021d44: 69bb ldr r3, [r7, #24]
  83473. 8021d46: 719a strb r2, [r3, #6]
  83474. }
  83475. msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000);
  83476. 8021d48: 69bb ldr r3, [r7, #24]
  83477. 8021d4a: 799b ldrb r3, [r3, #6]
  83478. 8021d4c: 2b05 cmp r3, #5
  83479. 8021d4e: d80d bhi.n 8021d6c <dhcp_select+0x1a8>
  83480. 8021d50: 69bb ldr r3, [r7, #24]
  83481. 8021d52: 799b ldrb r3, [r3, #6]
  83482. 8021d54: 461a mov r2, r3
  83483. 8021d56: 2301 movs r3, #1
  83484. 8021d58: 4093 lsls r3, r2
  83485. 8021d5a: b29b uxth r3, r3
  83486. 8021d5c: 461a mov r2, r3
  83487. 8021d5e: 0152 lsls r2, r2, #5
  83488. 8021d60: 1ad2 subs r2, r2, r3
  83489. 8021d62: 0092 lsls r2, r2, #2
  83490. 8021d64: 4413 add r3, r2
  83491. 8021d66: 00db lsls r3, r3, #3
  83492. 8021d68: b29b uxth r3, r3
  83493. 8021d6a: e001 b.n 8021d70 <dhcp_select+0x1ac>
  83494. 8021d6c: f64e 2360 movw r3, #60000 @ 0xea60
  83495. 8021d70: 81fb strh r3, [r7, #14]
  83496. dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
  83497. 8021d72: 89fb ldrh r3, [r7, #14]
  83498. 8021d74: f203 13f3 addw r3, r3, #499 @ 0x1f3
  83499. 8021d78: 4a0f ldr r2, [pc, #60] @ (8021db8 <dhcp_select+0x1f4>)
  83500. 8021d7a: fb82 1203 smull r1, r2, r2, r3
  83501. 8021d7e: 1152 asrs r2, r2, #5
  83502. 8021d80: 17db asrs r3, r3, #31
  83503. 8021d82: 1ad3 subs r3, r2, r3
  83504. 8021d84: b29a uxth r2, r3
  83505. 8021d86: 69bb ldr r3, [r7, #24]
  83506. 8021d88: 811a strh r2, [r3, #8]
  83507. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs));
  83508. return result;
  83509. 8021d8a: f997 301e ldrsb.w r3, [r7, #30]
  83510. }
  83511. 8021d8e: 4618 mov r0, r3
  83512. 8021d90: 3720 adds r7, #32
  83513. 8021d92: 46bd mov sp, r7
  83514. 8021d94: bdb0 pop {r4, r5, r7, pc}
  83515. 8021d96: bf00 nop
  83516. 8021d98: 0802fe54 .word 0x0802fe54
  83517. 8021d9c: 0802ff00 .word 0x0802ff00
  83518. 8021da0: 0802feb4 .word 0x0802feb4
  83519. 8021da4: 0802ff1c .word 0x0802ff1c
  83520. 8021da8: 24000058 .word 0x24000058
  83521. 8021dac: 2402af14 .word 0x2402af14
  83522. 8021db0: 08030c10 .word 0x08030c10
  83523. 8021db4: 08030c14 .word 0x08030c14
  83524. 8021db8: 10624dd3 .word 0x10624dd3
  83525. 08021dbc <dhcp_coarse_tmr>:
  83526. * The DHCP timer that checks for lease renewal/rebind timeouts.
  83527. * Must be called once a minute (see @ref DHCP_COARSE_TIMER_SECS).
  83528. */
  83529. void
  83530. dhcp_coarse_tmr(void)
  83531. {
  83532. 8021dbc: b580 push {r7, lr}
  83533. 8021dbe: b082 sub sp, #8
  83534. 8021dc0: af00 add r7, sp, #0
  83535. struct netif *netif;
  83536. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n"));
  83537. /* iterate through all network interfaces */
  83538. NETIF_FOREACH(netif) {
  83539. 8021dc2: 4b27 ldr r3, [pc, #156] @ (8021e60 <dhcp_coarse_tmr+0xa4>)
  83540. 8021dc4: 681b ldr r3, [r3, #0]
  83541. 8021dc6: 607b str r3, [r7, #4]
  83542. 8021dc8: e042 b.n 8021e50 <dhcp_coarse_tmr+0x94>
  83543. /* only act on DHCP configured interfaces */
  83544. struct dhcp *dhcp = netif_dhcp_data(netif);
  83545. 8021dca: 687b ldr r3, [r7, #4]
  83546. 8021dcc: 6a5b ldr r3, [r3, #36] @ 0x24
  83547. 8021dce: 603b str r3, [r7, #0]
  83548. if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF)) {
  83549. 8021dd0: 683b ldr r3, [r7, #0]
  83550. 8021dd2: 2b00 cmp r3, #0
  83551. 8021dd4: d039 beq.n 8021e4a <dhcp_coarse_tmr+0x8e>
  83552. 8021dd6: 683b ldr r3, [r7, #0]
  83553. 8021dd8: 795b ldrb r3, [r3, #5]
  83554. 8021dda: 2b00 cmp r3, #0
  83555. 8021ddc: d035 beq.n 8021e4a <dhcp_coarse_tmr+0x8e>
  83556. /* compare lease time to expire timeout */
  83557. if (dhcp->t0_timeout && (++dhcp->lease_used == dhcp->t0_timeout)) {
  83558. 8021dde: 683b ldr r3, [r7, #0]
  83559. 8021de0: 8a9b ldrh r3, [r3, #20]
  83560. 8021de2: 2b00 cmp r3, #0
  83561. 8021de4: d012 beq.n 8021e0c <dhcp_coarse_tmr+0x50>
  83562. 8021de6: 683b ldr r3, [r7, #0]
  83563. 8021de8: 8a5b ldrh r3, [r3, #18]
  83564. 8021dea: 3301 adds r3, #1
  83565. 8021dec: b29a uxth r2, r3
  83566. 8021dee: 683b ldr r3, [r7, #0]
  83567. 8021df0: 825a strh r2, [r3, #18]
  83568. 8021df2: 683b ldr r3, [r7, #0]
  83569. 8021df4: 8a5a ldrh r2, [r3, #18]
  83570. 8021df6: 683b ldr r3, [r7, #0]
  83571. 8021df8: 8a9b ldrh r3, [r3, #20]
  83572. 8021dfa: 429a cmp r2, r3
  83573. 8021dfc: d106 bne.n 8021e0c <dhcp_coarse_tmr+0x50>
  83574. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t0 timeout\n"));
  83575. /* this clients' lease time has expired */
  83576. dhcp_release_and_stop(netif);
  83577. 8021dfe: 6878 ldr r0, [r7, #4]
  83578. 8021e00: f000 fe32 bl 8022a68 <dhcp_release_and_stop>
  83579. dhcp_start(netif);
  83580. 8021e04: 6878 ldr r0, [r7, #4]
  83581. 8021e06: f000 f96b bl 80220e0 <dhcp_start>
  83582. 8021e0a: e01e b.n 8021e4a <dhcp_coarse_tmr+0x8e>
  83583. /* timer is active (non zero), and triggers (zeroes) now? */
  83584. } else if (dhcp->t2_rebind_time && (dhcp->t2_rebind_time-- == 1)) {
  83585. 8021e0c: 683b ldr r3, [r7, #0]
  83586. 8021e0e: 8a1b ldrh r3, [r3, #16]
  83587. 8021e10: 2b00 cmp r3, #0
  83588. 8021e12: d00b beq.n 8021e2c <dhcp_coarse_tmr+0x70>
  83589. 8021e14: 683b ldr r3, [r7, #0]
  83590. 8021e16: 8a1b ldrh r3, [r3, #16]
  83591. 8021e18: 1e5a subs r2, r3, #1
  83592. 8021e1a: b291 uxth r1, r2
  83593. 8021e1c: 683a ldr r2, [r7, #0]
  83594. 8021e1e: 8211 strh r1, [r2, #16]
  83595. 8021e20: 2b01 cmp r3, #1
  83596. 8021e22: d103 bne.n 8021e2c <dhcp_coarse_tmr+0x70>
  83597. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t2 timeout\n"));
  83598. /* this clients' rebind timeout triggered */
  83599. dhcp_t2_timeout(netif);
  83600. 8021e24: 6878 ldr r0, [r7, #4]
  83601. 8021e26: f000 f8c7 bl 8021fb8 <dhcp_t2_timeout>
  83602. 8021e2a: e00e b.n 8021e4a <dhcp_coarse_tmr+0x8e>
  83603. /* timer is active (non zero), and triggers (zeroes) now */
  83604. } else if (dhcp->t1_renew_time && (dhcp->t1_renew_time-- == 1)) {
  83605. 8021e2c: 683b ldr r3, [r7, #0]
  83606. 8021e2e: 89db ldrh r3, [r3, #14]
  83607. 8021e30: 2b00 cmp r3, #0
  83608. 8021e32: d00a beq.n 8021e4a <dhcp_coarse_tmr+0x8e>
  83609. 8021e34: 683b ldr r3, [r7, #0]
  83610. 8021e36: 89db ldrh r3, [r3, #14]
  83611. 8021e38: 1e5a subs r2, r3, #1
  83612. 8021e3a: b291 uxth r1, r2
  83613. 8021e3c: 683a ldr r2, [r7, #0]
  83614. 8021e3e: 81d1 strh r1, [r2, #14]
  83615. 8021e40: 2b01 cmp r3, #1
  83616. 8021e42: d102 bne.n 8021e4a <dhcp_coarse_tmr+0x8e>
  83617. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t1 timeout\n"));
  83618. /* this clients' renewal timeout triggered */
  83619. dhcp_t1_timeout(netif);
  83620. 8021e44: 6878 ldr r0, [r7, #4]
  83621. 8021e46: f000 f888 bl 8021f5a <dhcp_t1_timeout>
  83622. NETIF_FOREACH(netif) {
  83623. 8021e4a: 687b ldr r3, [r7, #4]
  83624. 8021e4c: 681b ldr r3, [r3, #0]
  83625. 8021e4e: 607b str r3, [r7, #4]
  83626. 8021e50: 687b ldr r3, [r7, #4]
  83627. 8021e52: 2b00 cmp r3, #0
  83628. 8021e54: d1b9 bne.n 8021dca <dhcp_coarse_tmr+0xe>
  83629. }
  83630. }
  83631. }
  83632. }
  83633. 8021e56: bf00 nop
  83634. 8021e58: bf00 nop
  83635. 8021e5a: 3708 adds r7, #8
  83636. 8021e5c: 46bd mov sp, r7
  83637. 8021e5e: bd80 pop {r7, pc}
  83638. 8021e60: 2402ae7c .word 0x2402ae7c
  83639. 08021e64 <dhcp_fine_tmr>:
  83640. * A DHCP server is expected to respond within a short period of time.
  83641. * This timer checks whether an outstanding DHCP request is timed out.
  83642. */
  83643. void
  83644. dhcp_fine_tmr(void)
  83645. {
  83646. 8021e64: b580 push {r7, lr}
  83647. 8021e66: b082 sub sp, #8
  83648. 8021e68: af00 add r7, sp, #0
  83649. struct netif *netif;
  83650. /* loop through netif's */
  83651. NETIF_FOREACH(netif) {
  83652. 8021e6a: 4b16 ldr r3, [pc, #88] @ (8021ec4 <dhcp_fine_tmr+0x60>)
  83653. 8021e6c: 681b ldr r3, [r3, #0]
  83654. 8021e6e: 607b str r3, [r7, #4]
  83655. 8021e70: e020 b.n 8021eb4 <dhcp_fine_tmr+0x50>
  83656. struct dhcp *dhcp = netif_dhcp_data(netif);
  83657. 8021e72: 687b ldr r3, [r7, #4]
  83658. 8021e74: 6a5b ldr r3, [r3, #36] @ 0x24
  83659. 8021e76: 603b str r3, [r7, #0]
  83660. /* only act on DHCP configured interfaces */
  83661. if (dhcp != NULL) {
  83662. 8021e78: 683b ldr r3, [r7, #0]
  83663. 8021e7a: 2b00 cmp r3, #0
  83664. 8021e7c: d017 beq.n 8021eae <dhcp_fine_tmr+0x4a>
  83665. /* timer is active (non zero), and is about to trigger now */
  83666. if (dhcp->request_timeout > 1) {
  83667. 8021e7e: 683b ldr r3, [r7, #0]
  83668. 8021e80: 891b ldrh r3, [r3, #8]
  83669. 8021e82: 2b01 cmp r3, #1
  83670. 8021e84: d906 bls.n 8021e94 <dhcp_fine_tmr+0x30>
  83671. dhcp->request_timeout--;
  83672. 8021e86: 683b ldr r3, [r7, #0]
  83673. 8021e88: 891b ldrh r3, [r3, #8]
  83674. 8021e8a: 3b01 subs r3, #1
  83675. 8021e8c: b29a uxth r2, r3
  83676. 8021e8e: 683b ldr r3, [r7, #0]
  83677. 8021e90: 811a strh r2, [r3, #8]
  83678. 8021e92: e00c b.n 8021eae <dhcp_fine_tmr+0x4a>
  83679. } else if (dhcp->request_timeout == 1) {
  83680. 8021e94: 683b ldr r3, [r7, #0]
  83681. 8021e96: 891b ldrh r3, [r3, #8]
  83682. 8021e98: 2b01 cmp r3, #1
  83683. 8021e9a: d108 bne.n 8021eae <dhcp_fine_tmr+0x4a>
  83684. dhcp->request_timeout--;
  83685. 8021e9c: 683b ldr r3, [r7, #0]
  83686. 8021e9e: 891b ldrh r3, [r3, #8]
  83687. 8021ea0: 3b01 subs r3, #1
  83688. 8021ea2: b29a uxth r2, r3
  83689. 8021ea4: 683b ldr r3, [r7, #0]
  83690. 8021ea6: 811a strh r2, [r3, #8]
  83691. /* { dhcp->request_timeout == 0 } */
  83692. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_fine_tmr(): request timeout\n"));
  83693. /* this client's request timeout triggered */
  83694. dhcp_timeout(netif);
  83695. 8021ea8: 6878 ldr r0, [r7, #4]
  83696. 8021eaa: f000 f80d bl 8021ec8 <dhcp_timeout>
  83697. NETIF_FOREACH(netif) {
  83698. 8021eae: 687b ldr r3, [r7, #4]
  83699. 8021eb0: 681b ldr r3, [r3, #0]
  83700. 8021eb2: 607b str r3, [r7, #4]
  83701. 8021eb4: 687b ldr r3, [r7, #4]
  83702. 8021eb6: 2b00 cmp r3, #0
  83703. 8021eb8: d1db bne.n 8021e72 <dhcp_fine_tmr+0xe>
  83704. }
  83705. }
  83706. }
  83707. }
  83708. 8021eba: bf00 nop
  83709. 8021ebc: bf00 nop
  83710. 8021ebe: 3708 adds r7, #8
  83711. 8021ec0: 46bd mov sp, r7
  83712. 8021ec2: bd80 pop {r7, pc}
  83713. 8021ec4: 2402ae7c .word 0x2402ae7c
  83714. 08021ec8 <dhcp_timeout>:
  83715. *
  83716. * @param netif the netif under DHCP control
  83717. */
  83718. static void
  83719. dhcp_timeout(struct netif *netif)
  83720. {
  83721. 8021ec8: b580 push {r7, lr}
  83722. 8021eca: b084 sub sp, #16
  83723. 8021ecc: af00 add r7, sp, #0
  83724. 8021ece: 6078 str r0, [r7, #4]
  83725. struct dhcp *dhcp = netif_dhcp_data(netif);
  83726. 8021ed0: 687b ldr r3, [r7, #4]
  83727. 8021ed2: 6a5b ldr r3, [r3, #36] @ 0x24
  83728. 8021ed4: 60fb str r3, [r7, #12]
  83729. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n"));
  83730. /* back-off period has passed, or server selection timed out */
  83731. if ((dhcp->state == DHCP_STATE_BACKING_OFF) || (dhcp->state == DHCP_STATE_SELECTING)) {
  83732. 8021ed6: 68fb ldr r3, [r7, #12]
  83733. 8021ed8: 795b ldrb r3, [r3, #5]
  83734. 8021eda: 2b0c cmp r3, #12
  83735. 8021edc: d003 beq.n 8021ee6 <dhcp_timeout+0x1e>
  83736. 8021ede: 68fb ldr r3, [r7, #12]
  83737. 8021ee0: 795b ldrb r3, [r3, #5]
  83738. 8021ee2: 2b06 cmp r3, #6
  83739. 8021ee4: d103 bne.n 8021eee <dhcp_timeout+0x26>
  83740. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n"));
  83741. dhcp_discover(netif);
  83742. 8021ee6: 6878 ldr r0, [r7, #4]
  83743. 8021ee8: f000 fa58 bl 802239c <dhcp_discover>
  83744. dhcp_reboot(netif);
  83745. } else {
  83746. dhcp_discover(netif);
  83747. }
  83748. }
  83749. }
  83750. 8021eec: e031 b.n 8021f52 <dhcp_timeout+0x8a>
  83751. } else if (dhcp->state == DHCP_STATE_REQUESTING) {
  83752. 8021eee: 68fb ldr r3, [r7, #12]
  83753. 8021ef0: 795b ldrb r3, [r3, #5]
  83754. 8021ef2: 2b01 cmp r3, #1
  83755. 8021ef4: d10e bne.n 8021f14 <dhcp_timeout+0x4c>
  83756. if (dhcp->tries <= 5) {
  83757. 8021ef6: 68fb ldr r3, [r7, #12]
  83758. 8021ef8: 799b ldrb r3, [r3, #6]
  83759. 8021efa: 2b05 cmp r3, #5
  83760. 8021efc: d803 bhi.n 8021f06 <dhcp_timeout+0x3e>
  83761. dhcp_select(netif);
  83762. 8021efe: 6878 ldr r0, [r7, #4]
  83763. 8021f00: f7ff fe60 bl 8021bc4 <dhcp_select>
  83764. }
  83765. 8021f04: e025 b.n 8021f52 <dhcp_timeout+0x8a>
  83766. dhcp_release_and_stop(netif);
  83767. 8021f06: 6878 ldr r0, [r7, #4]
  83768. 8021f08: f000 fdae bl 8022a68 <dhcp_release_and_stop>
  83769. dhcp_start(netif);
  83770. 8021f0c: 6878 ldr r0, [r7, #4]
  83771. 8021f0e: f000 f8e7 bl 80220e0 <dhcp_start>
  83772. }
  83773. 8021f12: e01e b.n 8021f52 <dhcp_timeout+0x8a>
  83774. } else if (dhcp->state == DHCP_STATE_CHECKING) {
  83775. 8021f14: 68fb ldr r3, [r7, #12]
  83776. 8021f16: 795b ldrb r3, [r3, #5]
  83777. 8021f18: 2b08 cmp r3, #8
  83778. 8021f1a: d10b bne.n 8021f34 <dhcp_timeout+0x6c>
  83779. if (dhcp->tries <= 1) {
  83780. 8021f1c: 68fb ldr r3, [r7, #12]
  83781. 8021f1e: 799b ldrb r3, [r3, #6]
  83782. 8021f20: 2b01 cmp r3, #1
  83783. 8021f22: d803 bhi.n 8021f2c <dhcp_timeout+0x64>
  83784. dhcp_check(netif);
  83785. 8021f24: 6878 ldr r0, [r7, #4]
  83786. 8021f26: f7ff fdf3 bl 8021b10 <dhcp_check>
  83787. }
  83788. 8021f2a: e012 b.n 8021f52 <dhcp_timeout+0x8a>
  83789. dhcp_bind(netif);
  83790. 8021f2c: 6878 ldr r0, [r7, #4]
  83791. 8021f2e: f000 fad7 bl 80224e0 <dhcp_bind>
  83792. }
  83793. 8021f32: e00e b.n 8021f52 <dhcp_timeout+0x8a>
  83794. } else if (dhcp->state == DHCP_STATE_REBOOTING) {
  83795. 8021f34: 68fb ldr r3, [r7, #12]
  83796. 8021f36: 795b ldrb r3, [r3, #5]
  83797. 8021f38: 2b03 cmp r3, #3
  83798. 8021f3a: d10a bne.n 8021f52 <dhcp_timeout+0x8a>
  83799. if (dhcp->tries < REBOOT_TRIES) {
  83800. 8021f3c: 68fb ldr r3, [r7, #12]
  83801. 8021f3e: 799b ldrb r3, [r3, #6]
  83802. 8021f40: 2b01 cmp r3, #1
  83803. 8021f42: d803 bhi.n 8021f4c <dhcp_timeout+0x84>
  83804. dhcp_reboot(netif);
  83805. 8021f44: 6878 ldr r0, [r7, #4]
  83806. 8021f46: f000 fcdb bl 8022900 <dhcp_reboot>
  83807. }
  83808. 8021f4a: e002 b.n 8021f52 <dhcp_timeout+0x8a>
  83809. dhcp_discover(netif);
  83810. 8021f4c: 6878 ldr r0, [r7, #4]
  83811. 8021f4e: f000 fa25 bl 802239c <dhcp_discover>
  83812. }
  83813. 8021f52: bf00 nop
  83814. 8021f54: 3710 adds r7, #16
  83815. 8021f56: 46bd mov sp, r7
  83816. 8021f58: bd80 pop {r7, pc}
  83817. 08021f5a <dhcp_t1_timeout>:
  83818. *
  83819. * @param netif the netif under DHCP control
  83820. */
  83821. static void
  83822. dhcp_t1_timeout(struct netif *netif)
  83823. {
  83824. 8021f5a: b580 push {r7, lr}
  83825. 8021f5c: b084 sub sp, #16
  83826. 8021f5e: af00 add r7, sp, #0
  83827. 8021f60: 6078 str r0, [r7, #4]
  83828. struct dhcp *dhcp = netif_dhcp_data(netif);
  83829. 8021f62: 687b ldr r3, [r7, #4]
  83830. 8021f64: 6a5b ldr r3, [r3, #36] @ 0x24
  83831. 8021f66: 60fb str r3, [r7, #12]
  83832. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_t1_timeout()\n"));
  83833. if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) ||
  83834. 8021f68: 68fb ldr r3, [r7, #12]
  83835. 8021f6a: 795b ldrb r3, [r3, #5]
  83836. 8021f6c: 2b01 cmp r3, #1
  83837. 8021f6e: d007 beq.n 8021f80 <dhcp_t1_timeout+0x26>
  83838. 8021f70: 68fb ldr r3, [r7, #12]
  83839. 8021f72: 795b ldrb r3, [r3, #5]
  83840. 8021f74: 2b0a cmp r3, #10
  83841. 8021f76: d003 beq.n 8021f80 <dhcp_t1_timeout+0x26>
  83842. (dhcp->state == DHCP_STATE_RENEWING)) {
  83843. 8021f78: 68fb ldr r3, [r7, #12]
  83844. 8021f7a: 795b ldrb r3, [r3, #5]
  83845. if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) ||
  83846. 8021f7c: 2b05 cmp r3, #5
  83847. 8021f7e: d117 bne.n 8021fb0 <dhcp_t1_timeout+0x56>
  83848. * eventually time-out if renew tries fail. */
  83849. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  83850. ("dhcp_t1_timeout(): must renew\n"));
  83851. /* This slightly different to RFC2131: DHCPREQUEST will be sent from state
  83852. DHCP_STATE_RENEWING, not DHCP_STATE_BOUND */
  83853. dhcp_renew(netif);
  83854. 8021f80: 6878 ldr r0, [r7, #4]
  83855. 8021f82: f000 fb87 bl 8022694 <dhcp_renew>
  83856. /* Calculate next timeout */
  83857. if (((dhcp->t2_timeout - dhcp->lease_used) / 2) >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS)) {
  83858. 8021f86: 68fb ldr r3, [r7, #12]
  83859. 8021f88: 899b ldrh r3, [r3, #12]
  83860. 8021f8a: 461a mov r2, r3
  83861. 8021f8c: 68fb ldr r3, [r7, #12]
  83862. 8021f8e: 8a5b ldrh r3, [r3, #18]
  83863. 8021f90: 1ad3 subs r3, r2, r3
  83864. 8021f92: 2b01 cmp r3, #1
  83865. 8021f94: dd0c ble.n 8021fb0 <dhcp_t1_timeout+0x56>
  83866. dhcp->t1_renew_time = (u16_t)((dhcp->t2_timeout - dhcp->lease_used) / 2);
  83867. 8021f96: 68fb ldr r3, [r7, #12]
  83868. 8021f98: 899b ldrh r3, [r3, #12]
  83869. 8021f9a: 461a mov r2, r3
  83870. 8021f9c: 68fb ldr r3, [r7, #12]
  83871. 8021f9e: 8a5b ldrh r3, [r3, #18]
  83872. 8021fa0: 1ad3 subs r3, r2, r3
  83873. 8021fa2: 2b00 cmp r3, #0
  83874. 8021fa4: da00 bge.n 8021fa8 <dhcp_t1_timeout+0x4e>
  83875. 8021fa6: 3301 adds r3, #1
  83876. 8021fa8: 105b asrs r3, r3, #1
  83877. 8021faa: b29a uxth r2, r3
  83878. 8021fac: 68fb ldr r3, [r7, #12]
  83879. 8021fae: 81da strh r2, [r3, #14]
  83880. }
  83881. }
  83882. }
  83883. 8021fb0: bf00 nop
  83884. 8021fb2: 3710 adds r7, #16
  83885. 8021fb4: 46bd mov sp, r7
  83886. 8021fb6: bd80 pop {r7, pc}
  83887. 08021fb8 <dhcp_t2_timeout>:
  83888. *
  83889. * @param netif the netif under DHCP control
  83890. */
  83891. static void
  83892. dhcp_t2_timeout(struct netif *netif)
  83893. {
  83894. 8021fb8: b580 push {r7, lr}
  83895. 8021fba: b084 sub sp, #16
  83896. 8021fbc: af00 add r7, sp, #0
  83897. 8021fbe: 6078 str r0, [r7, #4]
  83898. struct dhcp *dhcp = netif_dhcp_data(netif);
  83899. 8021fc0: 687b ldr r3, [r7, #4]
  83900. 8021fc2: 6a5b ldr r3, [r3, #36] @ 0x24
  83901. 8021fc4: 60fb str r3, [r7, #12]
  83902. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_t2_timeout()\n"));
  83903. if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) ||
  83904. 8021fc6: 68fb ldr r3, [r7, #12]
  83905. 8021fc8: 795b ldrb r3, [r3, #5]
  83906. 8021fca: 2b01 cmp r3, #1
  83907. 8021fcc: d00b beq.n 8021fe6 <dhcp_t2_timeout+0x2e>
  83908. 8021fce: 68fb ldr r3, [r7, #12]
  83909. 8021fd0: 795b ldrb r3, [r3, #5]
  83910. 8021fd2: 2b0a cmp r3, #10
  83911. 8021fd4: d007 beq.n 8021fe6 <dhcp_t2_timeout+0x2e>
  83912. (dhcp->state == DHCP_STATE_RENEWING) || (dhcp->state == DHCP_STATE_REBINDING)) {
  83913. 8021fd6: 68fb ldr r3, [r7, #12]
  83914. 8021fd8: 795b ldrb r3, [r3, #5]
  83915. if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) ||
  83916. 8021fda: 2b05 cmp r3, #5
  83917. 8021fdc: d003 beq.n 8021fe6 <dhcp_t2_timeout+0x2e>
  83918. (dhcp->state == DHCP_STATE_RENEWING) || (dhcp->state == DHCP_STATE_REBINDING)) {
  83919. 8021fde: 68fb ldr r3, [r7, #12]
  83920. 8021fe0: 795b ldrb r3, [r3, #5]
  83921. 8021fe2: 2b04 cmp r3, #4
  83922. 8021fe4: d117 bne.n 8022016 <dhcp_t2_timeout+0x5e>
  83923. /* just retry to rebind */
  83924. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  83925. ("dhcp_t2_timeout(): must rebind\n"));
  83926. /* This slightly different to RFC2131: DHCPREQUEST will be sent from state
  83927. DHCP_STATE_REBINDING, not DHCP_STATE_BOUND */
  83928. dhcp_rebind(netif);
  83929. 8021fe6: 6878 ldr r0, [r7, #4]
  83930. 8021fe8: f000 fbf0 bl 80227cc <dhcp_rebind>
  83931. /* Calculate next timeout */
  83932. if (((dhcp->t0_timeout - dhcp->lease_used) / 2) >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS)) {
  83933. 8021fec: 68fb ldr r3, [r7, #12]
  83934. 8021fee: 8a9b ldrh r3, [r3, #20]
  83935. 8021ff0: 461a mov r2, r3
  83936. 8021ff2: 68fb ldr r3, [r7, #12]
  83937. 8021ff4: 8a5b ldrh r3, [r3, #18]
  83938. 8021ff6: 1ad3 subs r3, r2, r3
  83939. 8021ff8: 2b01 cmp r3, #1
  83940. 8021ffa: dd0c ble.n 8022016 <dhcp_t2_timeout+0x5e>
  83941. dhcp->t2_rebind_time = (u16_t)((dhcp->t0_timeout - dhcp->lease_used) / 2);
  83942. 8021ffc: 68fb ldr r3, [r7, #12]
  83943. 8021ffe: 8a9b ldrh r3, [r3, #20]
  83944. 8022000: 461a mov r2, r3
  83945. 8022002: 68fb ldr r3, [r7, #12]
  83946. 8022004: 8a5b ldrh r3, [r3, #18]
  83947. 8022006: 1ad3 subs r3, r2, r3
  83948. 8022008: 2b00 cmp r3, #0
  83949. 802200a: da00 bge.n 802200e <dhcp_t2_timeout+0x56>
  83950. 802200c: 3301 adds r3, #1
  83951. 802200e: 105b asrs r3, r3, #1
  83952. 8022010: b29a uxth r2, r3
  83953. 8022012: 68fb ldr r3, [r7, #12]
  83954. 8022014: 821a strh r2, [r3, #16]
  83955. }
  83956. }
  83957. }
  83958. 8022016: bf00 nop
  83959. 8022018: 3710 adds r7, #16
  83960. 802201a: 46bd mov sp, r7
  83961. 802201c: bd80 pop {r7, pc}
  83962. ...
  83963. 08022020 <dhcp_handle_ack>:
  83964. *
  83965. * @param netif the netif under DHCP control
  83966. */
  83967. static void
  83968. dhcp_handle_ack(struct netif *netif, struct dhcp_msg *msg_in)
  83969. {
  83970. 8022020: b580 push {r7, lr}
  83971. 8022022: b084 sub sp, #16
  83972. 8022024: af00 add r7, sp, #0
  83973. 8022026: 6078 str r0, [r7, #4]
  83974. 8022028: 6039 str r1, [r7, #0]
  83975. struct dhcp *dhcp = netif_dhcp_data(netif);
  83976. 802202a: 687b ldr r3, [r7, #4]
  83977. 802202c: 6a5b ldr r3, [r3, #36] @ 0x24
  83978. 802202e: 60fb str r3, [r7, #12]
  83979. #if LWIP_DHCP_GET_NTP_SRV
  83980. ip4_addr_t ntp_server_addrs[LWIP_DHCP_MAX_NTP_SERVERS];
  83981. #endif
  83982. /* clear options we might not get from the ACK */
  83983. ip4_addr_set_zero(&dhcp->offered_sn_mask);
  83984. 8022030: 68fb ldr r3, [r7, #12]
  83985. 8022032: 2200 movs r2, #0
  83986. 8022034: 621a str r2, [r3, #32]
  83987. ip4_addr_set_zero(&dhcp->offered_gw_addr);
  83988. 8022036: 68fb ldr r3, [r7, #12]
  83989. 8022038: 2200 movs r2, #0
  83990. 802203a: 625a str r2, [r3, #36] @ 0x24
  83991. #if LWIP_DHCP_BOOTP_FILE
  83992. ip4_addr_set_zero(&dhcp->offered_si_addr);
  83993. #endif /* LWIP_DHCP_BOOTP_FILE */
  83994. /* lease time given? */
  83995. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {
  83996. 802203c: 4b26 ldr r3, [pc, #152] @ (80220d8 <dhcp_handle_ack+0xb8>)
  83997. 802203e: 78db ldrb r3, [r3, #3]
  83998. 8022040: 2b00 cmp r3, #0
  83999. 8022042: d003 beq.n 802204c <dhcp_handle_ack+0x2c>
  84000. /* remember offered lease time */
  84001. dhcp->offered_t0_lease = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_LEASE_TIME);
  84002. 8022044: 4b25 ldr r3, [pc, #148] @ (80220dc <dhcp_handle_ack+0xbc>)
  84003. 8022046: 68da ldr r2, [r3, #12]
  84004. 8022048: 68fb ldr r3, [r7, #12]
  84005. 802204a: 629a str r2, [r3, #40] @ 0x28
  84006. }
  84007. /* renewal period given? */
  84008. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) {
  84009. 802204c: 4b22 ldr r3, [pc, #136] @ (80220d8 <dhcp_handle_ack+0xb8>)
  84010. 802204e: 791b ldrb r3, [r3, #4]
  84011. 8022050: 2b00 cmp r3, #0
  84012. 8022052: d004 beq.n 802205e <dhcp_handle_ack+0x3e>
  84013. /* remember given renewal period */
  84014. dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1);
  84015. 8022054: 4b21 ldr r3, [pc, #132] @ (80220dc <dhcp_handle_ack+0xbc>)
  84016. 8022056: 691a ldr r2, [r3, #16]
  84017. 8022058: 68fb ldr r3, [r7, #12]
  84018. 802205a: 62da str r2, [r3, #44] @ 0x2c
  84019. 802205c: e004 b.n 8022068 <dhcp_handle_ack+0x48>
  84020. } else {
  84021. /* calculate safe periods for renewal */
  84022. dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;
  84023. 802205e: 68fb ldr r3, [r7, #12]
  84024. 8022060: 6a9b ldr r3, [r3, #40] @ 0x28
  84025. 8022062: 085a lsrs r2, r3, #1
  84026. 8022064: 68fb ldr r3, [r7, #12]
  84027. 8022066: 62da str r2, [r3, #44] @ 0x2c
  84028. }
  84029. /* renewal period given? */
  84030. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) {
  84031. 8022068: 4b1b ldr r3, [pc, #108] @ (80220d8 <dhcp_handle_ack+0xb8>)
  84032. 802206a: 795b ldrb r3, [r3, #5]
  84033. 802206c: 2b00 cmp r3, #0
  84034. 802206e: d004 beq.n 802207a <dhcp_handle_ack+0x5a>
  84035. /* remember given rebind period */
  84036. dhcp->offered_t2_rebind = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T2);
  84037. 8022070: 4b1a ldr r3, [pc, #104] @ (80220dc <dhcp_handle_ack+0xbc>)
  84038. 8022072: 695a ldr r2, [r3, #20]
  84039. 8022074: 68fb ldr r3, [r7, #12]
  84040. 8022076: 631a str r2, [r3, #48] @ 0x30
  84041. 8022078: e007 b.n 802208a <dhcp_handle_ack+0x6a>
  84042. } else {
  84043. /* calculate safe periods for rebinding (offered_t0_lease * 0.875 -> 87.5%)*/
  84044. dhcp->offered_t2_rebind = (dhcp->offered_t0_lease * 7U) / 8U;
  84045. 802207a: 68fb ldr r3, [r7, #12]
  84046. 802207c: 6a9a ldr r2, [r3, #40] @ 0x28
  84047. 802207e: 4613 mov r3, r2
  84048. 8022080: 00db lsls r3, r3, #3
  84049. 8022082: 1a9b subs r3, r3, r2
  84050. 8022084: 08da lsrs r2, r3, #3
  84051. 8022086: 68fb ldr r3, [r7, #12]
  84052. 8022088: 631a str r2, [r3, #48] @ 0x30
  84053. }
  84054. /* (y)our internet address */
  84055. ip4_addr_copy(dhcp->offered_ip_addr, msg_in->yiaddr);
  84056. 802208a: 683b ldr r3, [r7, #0]
  84057. 802208c: 691a ldr r2, [r3, #16]
  84058. 802208e: 68fb ldr r3, [r7, #12]
  84059. 8022090: 61da str r2, [r3, #28]
  84060. boot file name copied in dhcp_parse_reply if not overloaded */
  84061. ip4_addr_copy(dhcp->offered_si_addr, msg_in->siaddr);
  84062. #endif /* LWIP_DHCP_BOOTP_FILE */
  84063. /* subnet mask given? */
  84064. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
  84065. 8022092: 4b11 ldr r3, [pc, #68] @ (80220d8 <dhcp_handle_ack+0xb8>)
  84066. 8022094: 799b ldrb r3, [r3, #6]
  84067. 8022096: 2b00 cmp r3, #0
  84068. 8022098: d00b beq.n 80220b2 <dhcp_handle_ack+0x92>
  84069. /* remember given subnet mask */
  84070. ip4_addr_set_u32(&dhcp->offered_sn_mask, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));
  84071. 802209a: 4b10 ldr r3, [pc, #64] @ (80220dc <dhcp_handle_ack+0xbc>)
  84072. 802209c: 699b ldr r3, [r3, #24]
  84073. 802209e: 4618 mov r0, r3
  84074. 80220a0: f7f6 fd4f bl 8018b42 <lwip_htonl>
  84075. 80220a4: 4602 mov r2, r0
  84076. 80220a6: 68fb ldr r3, [r7, #12]
  84077. 80220a8: 621a str r2, [r3, #32]
  84078. dhcp->subnet_mask_given = 1;
  84079. 80220aa: 68fb ldr r3, [r7, #12]
  84080. 80220ac: 2201 movs r2, #1
  84081. 80220ae: 71da strb r2, [r3, #7]
  84082. 80220b0: e002 b.n 80220b8 <dhcp_handle_ack+0x98>
  84083. } else {
  84084. dhcp->subnet_mask_given = 0;
  84085. 80220b2: 68fb ldr r3, [r7, #12]
  84086. 80220b4: 2200 movs r2, #0
  84087. 80220b6: 71da strb r2, [r3, #7]
  84088. }
  84089. /* gateway router */
  84090. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_ROUTER)) {
  84091. 80220b8: 4b07 ldr r3, [pc, #28] @ (80220d8 <dhcp_handle_ack+0xb8>)
  84092. 80220ba: 79db ldrb r3, [r3, #7]
  84093. 80220bc: 2b00 cmp r3, #0
  84094. 80220be: d007 beq.n 80220d0 <dhcp_handle_ack+0xb0>
  84095. ip4_addr_set_u32(&dhcp->offered_gw_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_ROUTER)));
  84096. 80220c0: 4b06 ldr r3, [pc, #24] @ (80220dc <dhcp_handle_ack+0xbc>)
  84097. 80220c2: 69db ldr r3, [r3, #28]
  84098. 80220c4: 4618 mov r0, r3
  84099. 80220c6: f7f6 fd3c bl 8018b42 <lwip_htonl>
  84100. 80220ca: 4602 mov r2, r0
  84101. 80220cc: 68fb ldr r3, [r7, #12]
  84102. 80220ce: 625a str r2, [r3, #36] @ 0x24
  84103. ip_addr_t dns_addr;
  84104. ip_addr_set_ip4_u32_val(dns_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n)));
  84105. dns_setserver(n, &dns_addr);
  84106. }
  84107. #endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */
  84108. }
  84109. 80220d0: bf00 nop
  84110. 80220d2: 3710 adds r7, #16
  84111. 80220d4: 46bd mov sp, r7
  84112. 80220d6: bd80 pop {r7, pc}
  84113. 80220d8: 2402af0c .word 0x2402af0c
  84114. 80220dc: 2402aeec .word 0x2402aeec
  84115. 080220e0 <dhcp_start>:
  84116. * - ERR_OK - No error
  84117. * - ERR_MEM - Out of memory
  84118. */
  84119. err_t
  84120. dhcp_start(struct netif *netif)
  84121. {
  84122. 80220e0: b580 push {r7, lr}
  84123. 80220e2: b084 sub sp, #16
  84124. 80220e4: af00 add r7, sp, #0
  84125. 80220e6: 6078 str r0, [r7, #4]
  84126. struct dhcp *dhcp;
  84127. err_t result;
  84128. LWIP_ASSERT_CORE_LOCKED();
  84129. 80220e8: f7ee fa22 bl 8010530 <sys_check_core_locking>
  84130. LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
  84131. 80220ec: 687b ldr r3, [r7, #4]
  84132. 80220ee: 2b00 cmp r3, #0
  84133. 80220f0: d109 bne.n 8022106 <dhcp_start+0x26>
  84134. 80220f2: 4b37 ldr r3, [pc, #220] @ (80221d0 <dhcp_start+0xf0>)
  84135. 80220f4: f240 22e7 movw r2, #743 @ 0x2e7
  84136. 80220f8: 4936 ldr r1, [pc, #216] @ (80221d4 <dhcp_start+0xf4>)
  84137. 80220fa: 4837 ldr r0, [pc, #220] @ (80221d8 <dhcp_start+0xf8>)
  84138. 80220fc: f007 fc66 bl 80299cc <iprintf>
  84139. 8022100: f06f 030f mvn.w r3, #15
  84140. 8022104: e060 b.n 80221c8 <dhcp_start+0xe8>
  84141. LWIP_ERROR("netif is not up, old style port?", netif_is_up(netif), return ERR_ARG;);
  84142. 8022106: 687b ldr r3, [r7, #4]
  84143. 8022108: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  84144. 802210c: f003 0301 and.w r3, r3, #1
  84145. 8022110: 2b00 cmp r3, #0
  84146. 8022112: d109 bne.n 8022128 <dhcp_start+0x48>
  84147. 8022114: 4b2e ldr r3, [pc, #184] @ (80221d0 <dhcp_start+0xf0>)
  84148. 8022116: f44f 723a mov.w r2, #744 @ 0x2e8
  84149. 802211a: 4930 ldr r1, [pc, #192] @ (80221dc <dhcp_start+0xfc>)
  84150. 802211c: 482e ldr r0, [pc, #184] @ (80221d8 <dhcp_start+0xf8>)
  84151. 802211e: f007 fc55 bl 80299cc <iprintf>
  84152. 8022122: f06f 030f mvn.w r3, #15
  84153. 8022126: e04f b.n 80221c8 <dhcp_start+0xe8>
  84154. dhcp = netif_dhcp_data(netif);
  84155. 8022128: 687b ldr r3, [r7, #4]
  84156. 802212a: 6a5b ldr r3, [r3, #36] @ 0x24
  84157. 802212c: 60fb str r3, [r7, #12]
  84158. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  84159. /* check MTU of the netif */
  84160. if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) {
  84161. 802212e: 687b ldr r3, [r7, #4]
  84162. 8022130: 8d1b ldrh r3, [r3, #40] @ 0x28
  84163. 8022132: f5b3 7f10 cmp.w r3, #576 @ 0x240
  84164. 8022136: d202 bcs.n 802213e <dhcp_start+0x5e>
  84165. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): Cannot use this netif with DHCP: MTU is too small\n"));
  84166. return ERR_MEM;
  84167. 8022138: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  84168. 802213c: e044 b.n 80221c8 <dhcp_start+0xe8>
  84169. }
  84170. /* no DHCP client attached yet? */
  84171. if (dhcp == NULL) {
  84172. 802213e: 68fb ldr r3, [r7, #12]
  84173. 8022140: 2b00 cmp r3, #0
  84174. 8022142: d10d bne.n 8022160 <dhcp_start+0x80>
  84175. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): mallocing new DHCP client\n"));
  84176. dhcp = (struct dhcp *)mem_malloc(sizeof(struct dhcp));
  84177. 8022144: 2034 movs r0, #52 @ 0x34
  84178. 8022146: f7f7 f8c9 bl 80192dc <mem_malloc>
  84179. 802214a: 60f8 str r0, [r7, #12]
  84180. if (dhcp == NULL) {
  84181. 802214c: 68fb ldr r3, [r7, #12]
  84182. 802214e: 2b00 cmp r3, #0
  84183. 8022150: d102 bne.n 8022158 <dhcp_start+0x78>
  84184. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not allocate dhcp\n"));
  84185. return ERR_MEM;
  84186. 8022152: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  84187. 8022156: e037 b.n 80221c8 <dhcp_start+0xe8>
  84188. }
  84189. /* store this dhcp client in the netif */
  84190. netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, dhcp);
  84191. 8022158: 687b ldr r3, [r7, #4]
  84192. 802215a: 68fa ldr r2, [r7, #12]
  84193. 802215c: 625a str r2, [r3, #36] @ 0x24
  84194. 802215e: e005 b.n 802216c <dhcp_start+0x8c>
  84195. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp"));
  84196. /* already has DHCP client attached */
  84197. } else {
  84198. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(): restarting DHCP configuration\n"));
  84199. if (dhcp->pcb_allocated != 0) {
  84200. 8022160: 68fb ldr r3, [r7, #12]
  84201. 8022162: 791b ldrb r3, [r3, #4]
  84202. 8022164: 2b00 cmp r3, #0
  84203. 8022166: d001 beq.n 802216c <dhcp_start+0x8c>
  84204. dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */
  84205. 8022168: f7ff fc8e bl 8021a88 <dhcp_dec_pcb_refcount>
  84206. }
  84207. /* dhcp is cleared below, no need to reset flag*/
  84208. }
  84209. /* clear data structure */
  84210. memset(dhcp, 0, sizeof(struct dhcp));
  84211. 802216c: 2234 movs r2, #52 @ 0x34
  84212. 802216e: 2100 movs r1, #0
  84213. 8022170: 68f8 ldr r0, [r7, #12]
  84214. 8022172: f007 fdbd bl 8029cf0 <memset>
  84215. /* dhcp_set_state(&dhcp, DHCP_STATE_OFF); */
  84216. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting DHCP configuration\n"));
  84217. if (dhcp_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP PCB is allocated */
  84218. 8022176: f7ff fc35 bl 80219e4 <dhcp_inc_pcb_refcount>
  84219. 802217a: 4603 mov r3, r0
  84220. 802217c: 2b00 cmp r3, #0
  84221. 802217e: d002 beq.n 8022186 <dhcp_start+0xa6>
  84222. return ERR_MEM;
  84223. 8022180: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  84224. 8022184: e020 b.n 80221c8 <dhcp_start+0xe8>
  84225. }
  84226. dhcp->pcb_allocated = 1;
  84227. 8022186: 68fb ldr r3, [r7, #12]
  84228. 8022188: 2201 movs r2, #1
  84229. 802218a: 711a strb r2, [r3, #4]
  84230. if (!netif_is_link_up(netif)) {
  84231. 802218c: 687b ldr r3, [r7, #4]
  84232. 802218e: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  84233. 8022192: f003 0304 and.w r3, r3, #4
  84234. 8022196: 2b00 cmp r3, #0
  84235. 8022198: d105 bne.n 80221a6 <dhcp_start+0xc6>
  84236. /* set state INIT and wait for dhcp_network_changed() to call dhcp_discover() */
  84237. dhcp_set_state(dhcp, DHCP_STATE_INIT);
  84238. 802219a: 2102 movs r1, #2
  84239. 802219c: 68f8 ldr r0, [r7, #12]
  84240. 802219e: f000 fd0a bl 8022bb6 <dhcp_set_state>
  84241. return ERR_OK;
  84242. 80221a2: 2300 movs r3, #0
  84243. 80221a4: e010 b.n 80221c8 <dhcp_start+0xe8>
  84244. }
  84245. /* (re)start the DHCP negotiation */
  84246. result = dhcp_discover(netif);
  84247. 80221a6: 6878 ldr r0, [r7, #4]
  84248. 80221a8: f000 f8f8 bl 802239c <dhcp_discover>
  84249. 80221ac: 4603 mov r3, r0
  84250. 80221ae: 72fb strb r3, [r7, #11]
  84251. if (result != ERR_OK) {
  84252. 80221b0: f997 300b ldrsb.w r3, [r7, #11]
  84253. 80221b4: 2b00 cmp r3, #0
  84254. 80221b6: d005 beq.n 80221c4 <dhcp_start+0xe4>
  84255. /* free resources allocated above */
  84256. dhcp_release_and_stop(netif);
  84257. 80221b8: 6878 ldr r0, [r7, #4]
  84258. 80221ba: f000 fc55 bl 8022a68 <dhcp_release_and_stop>
  84259. return ERR_MEM;
  84260. 80221be: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  84261. 80221c2: e001 b.n 80221c8 <dhcp_start+0xe8>
  84262. }
  84263. return result;
  84264. 80221c4: f997 300b ldrsb.w r3, [r7, #11]
  84265. }
  84266. 80221c8: 4618 mov r0, r3
  84267. 80221ca: 3710 adds r7, #16
  84268. 80221cc: 46bd mov sp, r7
  84269. 80221ce: bd80 pop {r7, pc}
  84270. 80221d0: 0802fe54 .word 0x0802fe54
  84271. 80221d4: 0802ff38 .word 0x0802ff38
  84272. 80221d8: 0802feb4 .word 0x0802feb4
  84273. 80221dc: 0802ff7c .word 0x0802ff7c
  84274. 080221e0 <dhcp_network_changed>:
  84275. * This enters the REBOOTING state to verify that the currently bound
  84276. * address is still valid.
  84277. */
  84278. void
  84279. dhcp_network_changed(struct netif *netif)
  84280. {
  84281. 80221e0: b580 push {r7, lr}
  84282. 80221e2: b084 sub sp, #16
  84283. 80221e4: af00 add r7, sp, #0
  84284. 80221e6: 6078 str r0, [r7, #4]
  84285. struct dhcp *dhcp = netif_dhcp_data(netif);
  84286. 80221e8: 687b ldr r3, [r7, #4]
  84287. 80221ea: 6a5b ldr r3, [r3, #36] @ 0x24
  84288. 80221ec: 60fb str r3, [r7, #12]
  84289. if (!dhcp) {
  84290. 80221ee: 68fb ldr r3, [r7, #12]
  84291. 80221f0: 2b00 cmp r3, #0
  84292. 80221f2: d025 beq.n 8022240 <dhcp_network_changed+0x60>
  84293. return;
  84294. }
  84295. switch (dhcp->state) {
  84296. 80221f4: 68fb ldr r3, [r7, #12]
  84297. 80221f6: 795b ldrb r3, [r3, #5]
  84298. 80221f8: 2b0a cmp r3, #10
  84299. 80221fa: d008 beq.n 802220e <dhcp_network_changed+0x2e>
  84300. 80221fc: 2b0a cmp r3, #10
  84301. 80221fe: dc0d bgt.n 802221c <dhcp_network_changed+0x3c>
  84302. 8022200: 2b00 cmp r3, #0
  84303. 8022202: d01f beq.n 8022244 <dhcp_network_changed+0x64>
  84304. 8022204: 2b00 cmp r3, #0
  84305. 8022206: db09 blt.n 802221c <dhcp_network_changed+0x3c>
  84306. 8022208: 3b03 subs r3, #3
  84307. 802220a: 2b02 cmp r3, #2
  84308. 802220c: d806 bhi.n 802221c <dhcp_network_changed+0x3c>
  84309. case DHCP_STATE_REBINDING:
  84310. case DHCP_STATE_RENEWING:
  84311. case DHCP_STATE_BOUND:
  84312. case DHCP_STATE_REBOOTING:
  84313. dhcp->tries = 0;
  84314. 802220e: 68fb ldr r3, [r7, #12]
  84315. 8022210: 2200 movs r2, #0
  84316. 8022212: 719a strb r2, [r3, #6]
  84317. dhcp_reboot(netif);
  84318. 8022214: 6878 ldr r0, [r7, #4]
  84319. 8022216: f000 fb73 bl 8022900 <dhcp_reboot>
  84320. break;
  84321. 802221a: e014 b.n 8022246 <dhcp_network_changed+0x66>
  84322. case DHCP_STATE_OFF:
  84323. /* stay off */
  84324. break;
  84325. default:
  84326. LWIP_ASSERT("invalid dhcp->state", dhcp->state <= DHCP_STATE_BACKING_OFF);
  84327. 802221c: 68fb ldr r3, [r7, #12]
  84328. 802221e: 795b ldrb r3, [r3, #5]
  84329. 8022220: 2b0c cmp r3, #12
  84330. 8022222: d906 bls.n 8022232 <dhcp_network_changed+0x52>
  84331. 8022224: 4b09 ldr r3, [pc, #36] @ (802224c <dhcp_network_changed+0x6c>)
  84332. 8022226: f240 326d movw r2, #877 @ 0x36d
  84333. 802222a: 4909 ldr r1, [pc, #36] @ (8022250 <dhcp_network_changed+0x70>)
  84334. 802222c: 4809 ldr r0, [pc, #36] @ (8022254 <dhcp_network_changed+0x74>)
  84335. 802222e: f007 fbcd bl 80299cc <iprintf>
  84336. autoip_stop(netif);
  84337. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;
  84338. }
  84339. #endif /* LWIP_DHCP_AUTOIP_COOP */
  84340. /* ensure we start with short timeouts, even if already discovering */
  84341. dhcp->tries = 0;
  84342. 8022232: 68fb ldr r3, [r7, #12]
  84343. 8022234: 2200 movs r2, #0
  84344. 8022236: 719a strb r2, [r3, #6]
  84345. dhcp_discover(netif);
  84346. 8022238: 6878 ldr r0, [r7, #4]
  84347. 802223a: f000 f8af bl 802239c <dhcp_discover>
  84348. break;
  84349. 802223e: e002 b.n 8022246 <dhcp_network_changed+0x66>
  84350. return;
  84351. 8022240: bf00 nop
  84352. 8022242: e000 b.n 8022246 <dhcp_network_changed+0x66>
  84353. break;
  84354. 8022244: bf00 nop
  84355. }
  84356. }
  84357. 8022246: 3710 adds r7, #16
  84358. 8022248: 46bd mov sp, r7
  84359. 802224a: bd80 pop {r7, pc}
  84360. 802224c: 0802fe54 .word 0x0802fe54
  84361. 8022250: 0802ffa0 .word 0x0802ffa0
  84362. 8022254: 0802feb4 .word 0x0802feb4
  84363. 08022258 <dhcp_arp_reply>:
  84364. * @param netif the network interface on which the reply was received
  84365. * @param addr The IP address we received a reply from
  84366. */
  84367. void
  84368. dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr)
  84369. {
  84370. 8022258: b580 push {r7, lr}
  84371. 802225a: b084 sub sp, #16
  84372. 802225c: af00 add r7, sp, #0
  84373. 802225e: 6078 str r0, [r7, #4]
  84374. 8022260: 6039 str r1, [r7, #0]
  84375. struct dhcp *dhcp;
  84376. LWIP_ERROR("netif != NULL", (netif != NULL), return;);
  84377. 8022262: 687b ldr r3, [r7, #4]
  84378. 8022264: 2b00 cmp r3, #0
  84379. 8022266: d107 bne.n 8022278 <dhcp_arp_reply+0x20>
  84380. 8022268: 4b0e ldr r3, [pc, #56] @ (80222a4 <dhcp_arp_reply+0x4c>)
  84381. 802226a: f240 328b movw r2, #907 @ 0x38b
  84382. 802226e: 490e ldr r1, [pc, #56] @ (80222a8 <dhcp_arp_reply+0x50>)
  84383. 8022270: 480e ldr r0, [pc, #56] @ (80222ac <dhcp_arp_reply+0x54>)
  84384. 8022272: f007 fbab bl 80299cc <iprintf>
  84385. 8022276: e012 b.n 802229e <dhcp_arp_reply+0x46>
  84386. dhcp = netif_dhcp_data(netif);
  84387. 8022278: 687b ldr r3, [r7, #4]
  84388. 802227a: 6a5b ldr r3, [r3, #36] @ 0x24
  84389. 802227c: 60fb str r3, [r7, #12]
  84390. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_arp_reply()\n"));
  84391. /* is a DHCP client doing an ARP check? */
  84392. if ((dhcp != NULL) && (dhcp->state == DHCP_STATE_CHECKING)) {
  84393. 802227e: 68fb ldr r3, [r7, #12]
  84394. 8022280: 2b00 cmp r3, #0
  84395. 8022282: d00c beq.n 802229e <dhcp_arp_reply+0x46>
  84396. 8022284: 68fb ldr r3, [r7, #12]
  84397. 8022286: 795b ldrb r3, [r3, #5]
  84398. 8022288: 2b08 cmp r3, #8
  84399. 802228a: d108 bne.n 802229e <dhcp_arp_reply+0x46>
  84400. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n",
  84401. ip4_addr_get_u32(addr)));
  84402. /* did a host respond with the address we
  84403. were offered by the DHCP server? */
  84404. if (ip4_addr_cmp(addr, &dhcp->offered_ip_addr)) {
  84405. 802228c: 683b ldr r3, [r7, #0]
  84406. 802228e: 681a ldr r2, [r3, #0]
  84407. 8022290: 68fb ldr r3, [r7, #12]
  84408. 8022292: 69db ldr r3, [r3, #28]
  84409. 8022294: 429a cmp r2, r3
  84410. 8022296: d102 bne.n 802229e <dhcp_arp_reply+0x46>
  84411. /* we will not accept the offered address */
  84412. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
  84413. ("dhcp_arp_reply(): arp reply matched with offered address, declining\n"));
  84414. dhcp_decline(netif);
  84415. 8022298: 6878 ldr r0, [r7, #4]
  84416. 802229a: f000 f809 bl 80222b0 <dhcp_decline>
  84417. }
  84418. }
  84419. }
  84420. 802229e: 3710 adds r7, #16
  84421. 80222a0: 46bd mov sp, r7
  84422. 80222a2: bd80 pop {r7, pc}
  84423. 80222a4: 0802fe54 .word 0x0802fe54
  84424. 80222a8: 0802ff38 .word 0x0802ff38
  84425. 80222ac: 0802feb4 .word 0x0802feb4
  84426. 080222b0 <dhcp_decline>:
  84427. *
  84428. * @param netif the netif under DHCP control
  84429. */
  84430. static err_t
  84431. dhcp_decline(struct netif *netif)
  84432. {
  84433. 80222b0: b5b0 push {r4, r5, r7, lr}
  84434. 80222b2: b08a sub sp, #40 @ 0x28
  84435. 80222b4: af02 add r7, sp, #8
  84436. 80222b6: 6078 str r0, [r7, #4]
  84437. struct dhcp *dhcp = netif_dhcp_data(netif);
  84438. 80222b8: 687b ldr r3, [r7, #4]
  84439. 80222ba: 6a5b ldr r3, [r3, #36] @ 0x24
  84440. 80222bc: 61bb str r3, [r7, #24]
  84441. u16_t msecs;
  84442. struct pbuf *p_out;
  84443. u16_t options_out_len;
  84444. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline()\n"));
  84445. dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);
  84446. 80222be: 210c movs r1, #12
  84447. 80222c0: 69b8 ldr r0, [r7, #24]
  84448. 80222c2: f000 fc78 bl 8022bb6 <dhcp_set_state>
  84449. /* create and initialize the DHCP message header */
  84450. p_out = dhcp_create_msg(netif, dhcp, DHCP_DECLINE, &options_out_len);
  84451. 80222c6: f107 030c add.w r3, r7, #12
  84452. 80222ca: 2204 movs r2, #4
  84453. 80222cc: 69b9 ldr r1, [r7, #24]
  84454. 80222ce: 6878 ldr r0, [r7, #4]
  84455. 80222d0: f001 f90a bl 80234e8 <dhcp_create_msg>
  84456. 80222d4: 6178 str r0, [r7, #20]
  84457. if (p_out != NULL) {
  84458. 80222d6: 697b ldr r3, [r7, #20]
  84459. 80222d8: 2b00 cmp r3, #0
  84460. 80222da: d035 beq.n 8022348 <dhcp_decline+0x98>
  84461. struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
  84462. 80222dc: 697b ldr r3, [r7, #20]
  84463. 80222de: 685b ldr r3, [r3, #4]
  84464. 80222e0: 613b str r3, [r7, #16]
  84465. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4);
  84466. 80222e2: 89b8 ldrh r0, [r7, #12]
  84467. 80222e4: 693b ldr r3, [r7, #16]
  84468. 80222e6: f103 01f0 add.w r1, r3, #240 @ 0xf0
  84469. 80222ea: 2304 movs r3, #4
  84470. 80222ec: 2232 movs r2, #50 @ 0x32
  84471. 80222ee: f000 fc7d bl 8022bec <dhcp_option>
  84472. 80222f2: 4603 mov r3, r0
  84473. 80222f4: 81bb strh r3, [r7, #12]
  84474. options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  84475. 80222f6: 89bc ldrh r4, [r7, #12]
  84476. 80222f8: 693b ldr r3, [r7, #16]
  84477. 80222fa: f103 05f0 add.w r5, r3, #240 @ 0xf0
  84478. 80222fe: 69bb ldr r3, [r7, #24]
  84479. 8022300: 69db ldr r3, [r3, #28]
  84480. 8022302: 4618 mov r0, r3
  84481. 8022304: f7f6 fc1d bl 8018b42 <lwip_htonl>
  84482. 8022308: 4603 mov r3, r0
  84483. 802230a: 461a mov r2, r3
  84484. 802230c: 4629 mov r1, r5
  84485. 802230e: 4620 mov r0, r4
  84486. 8022310: f000 fcf8 bl 8022d04 <dhcp_option_long>
  84487. 8022314: 4603 mov r3, r0
  84488. 8022316: 81bb strh r3, [r7, #12]
  84489. LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_BACKING_OFF, msg_out, DHCP_DECLINE, &options_out_len);
  84490. dhcp_option_trailer(options_out_len, msg_out->options, p_out);
  84491. 8022318: 89b8 ldrh r0, [r7, #12]
  84492. 802231a: 693b ldr r3, [r7, #16]
  84493. 802231c: 33f0 adds r3, #240 @ 0xf0
  84494. 802231e: 697a ldr r2, [r7, #20]
  84495. 8022320: 4619 mov r1, r3
  84496. 8022322: f001 f9b7 bl 8023694 <dhcp_option_trailer>
  84497. /* per section 4.4.4, broadcast DECLINE messages */
  84498. result = udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY);
  84499. 8022326: 4b19 ldr r3, [pc, #100] @ (802238c <dhcp_decline+0xdc>)
  84500. 8022328: 6818 ldr r0, [r3, #0]
  84501. 802232a: 4b19 ldr r3, [pc, #100] @ (8022390 <dhcp_decline+0xe0>)
  84502. 802232c: 9301 str r3, [sp, #4]
  84503. 802232e: 687b ldr r3, [r7, #4]
  84504. 8022330: 9300 str r3, [sp, #0]
  84505. 8022332: 2343 movs r3, #67 @ 0x43
  84506. 8022334: 4a17 ldr r2, [pc, #92] @ (8022394 <dhcp_decline+0xe4>)
  84507. 8022336: 6979 ldr r1, [r7, #20]
  84508. 8022338: f7ff f88a bl 8021450 <udp_sendto_if_src>
  84509. 802233c: 4603 mov r3, r0
  84510. 802233e: 77fb strb r3, [r7, #31]
  84511. pbuf_free(p_out);
  84512. 8022340: 6978 ldr r0, [r7, #20]
  84513. 8022342: f7f8 f8cb bl 801a4dc <pbuf_free>
  84514. 8022346: e001 b.n 802234c <dhcp_decline+0x9c>
  84515. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_decline: BACKING OFF\n"));
  84516. } else {
  84517. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  84518. ("dhcp_decline: could not allocate DHCP request\n"));
  84519. result = ERR_MEM;
  84520. 8022348: 23ff movs r3, #255 @ 0xff
  84521. 802234a: 77fb strb r3, [r7, #31]
  84522. }
  84523. if (dhcp->tries < 255) {
  84524. 802234c: 69bb ldr r3, [r7, #24]
  84525. 802234e: 799b ldrb r3, [r3, #6]
  84526. 8022350: 2bff cmp r3, #255 @ 0xff
  84527. 8022352: d005 beq.n 8022360 <dhcp_decline+0xb0>
  84528. dhcp->tries++;
  84529. 8022354: 69bb ldr r3, [r7, #24]
  84530. 8022356: 799b ldrb r3, [r3, #6]
  84531. 8022358: 3301 adds r3, #1
  84532. 802235a: b2da uxtb r2, r3
  84533. 802235c: 69bb ldr r3, [r7, #24]
  84534. 802235e: 719a strb r2, [r3, #6]
  84535. }
  84536. msecs = 10 * 1000;
  84537. 8022360: f242 7310 movw r3, #10000 @ 0x2710
  84538. 8022364: 81fb strh r3, [r7, #14]
  84539. dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
  84540. 8022366: 89fb ldrh r3, [r7, #14]
  84541. 8022368: f203 13f3 addw r3, r3, #499 @ 0x1f3
  84542. 802236c: 4a0a ldr r2, [pc, #40] @ (8022398 <dhcp_decline+0xe8>)
  84543. 802236e: fb82 1203 smull r1, r2, r2, r3
  84544. 8022372: 1152 asrs r2, r2, #5
  84545. 8022374: 17db asrs r3, r3, #31
  84546. 8022376: 1ad3 subs r3, r2, r3
  84547. 8022378: b29a uxth r2, r3
  84548. 802237a: 69bb ldr r3, [r7, #24]
  84549. 802237c: 811a strh r2, [r3, #8]
  84550. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline(): set request timeout %"U16_F" msecs\n", msecs));
  84551. return result;
  84552. 802237e: f997 301f ldrsb.w r3, [r7, #31]
  84553. }
  84554. 8022382: 4618 mov r0, r3
  84555. 8022384: 3720 adds r7, #32
  84556. 8022386: 46bd mov sp, r7
  84557. 8022388: bdb0 pop {r4, r5, r7, pc}
  84558. 802238a: bf00 nop
  84559. 802238c: 2402af14 .word 0x2402af14
  84560. 8022390: 08030c10 .word 0x08030c10
  84561. 8022394: 08030c14 .word 0x08030c14
  84562. 8022398: 10624dd3 .word 0x10624dd3
  84563. 0802239c <dhcp_discover>:
  84564. *
  84565. * @param netif the netif under DHCP control
  84566. */
  84567. static err_t
  84568. dhcp_discover(struct netif *netif)
  84569. {
  84570. 802239c: b580 push {r7, lr}
  84571. 802239e: b08a sub sp, #40 @ 0x28
  84572. 80223a0: af02 add r7, sp, #8
  84573. 80223a2: 6078 str r0, [r7, #4]
  84574. struct dhcp *dhcp = netif_dhcp_data(netif);
  84575. 80223a4: 687b ldr r3, [r7, #4]
  84576. 80223a6: 6a5b ldr r3, [r3, #36] @ 0x24
  84577. 80223a8: 61bb str r3, [r7, #24]
  84578. err_t result = ERR_OK;
  84579. 80223aa: 2300 movs r3, #0
  84580. 80223ac: 75fb strb r3, [r7, #23]
  84581. struct pbuf *p_out;
  84582. u16_t options_out_len;
  84583. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n"));
  84584. ip4_addr_set_any(&dhcp->offered_ip_addr);
  84585. 80223ae: 69bb ldr r3, [r7, #24]
  84586. 80223b0: 2200 movs r2, #0
  84587. 80223b2: 61da str r2, [r3, #28]
  84588. dhcp_set_state(dhcp, DHCP_STATE_SELECTING);
  84589. 80223b4: 2106 movs r1, #6
  84590. 80223b6: 69b8 ldr r0, [r7, #24]
  84591. 80223b8: f000 fbfd bl 8022bb6 <dhcp_set_state>
  84592. /* create and initialize the DHCP message header */
  84593. p_out = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER, &options_out_len);
  84594. 80223bc: f107 0308 add.w r3, r7, #8
  84595. 80223c0: 2201 movs r2, #1
  84596. 80223c2: 69b9 ldr r1, [r7, #24]
  84597. 80223c4: 6878 ldr r0, [r7, #4]
  84598. 80223c6: f001 f88f bl 80234e8 <dhcp_create_msg>
  84599. 80223ca: 6138 str r0, [r7, #16]
  84600. if (p_out != NULL) {
  84601. 80223cc: 693b ldr r3, [r7, #16]
  84602. 80223ce: 2b00 cmp r3, #0
  84603. 80223d0: d04b beq.n 802246a <dhcp_discover+0xce>
  84604. struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
  84605. 80223d2: 693b ldr r3, [r7, #16]
  84606. 80223d4: 685b ldr r3, [r3, #4]
  84607. 80223d6: 60fb str r3, [r7, #12]
  84608. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n"));
  84609. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  84610. 80223d8: 8938 ldrh r0, [r7, #8]
  84611. 80223da: 68fb ldr r3, [r7, #12]
  84612. 80223dc: f103 01f0 add.w r1, r3, #240 @ 0xf0
  84613. 80223e0: 2302 movs r3, #2
  84614. 80223e2: 2239 movs r2, #57 @ 0x39
  84615. 80223e4: f000 fc02 bl 8022bec <dhcp_option>
  84616. 80223e8: 4603 mov r3, r0
  84617. 80223ea: 813b strh r3, [r7, #8]
  84618. options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif));
  84619. 80223ec: 8938 ldrh r0, [r7, #8]
  84620. 80223ee: 68fb ldr r3, [r7, #12]
  84621. 80223f0: f103 01f0 add.w r1, r3, #240 @ 0xf0
  84622. 80223f4: 687b ldr r3, [r7, #4]
  84623. 80223f6: 8d1b ldrh r3, [r3, #40] @ 0x28
  84624. 80223f8: 461a mov r2, r3
  84625. 80223fa: f000 fc51 bl 8022ca0 <dhcp_option_short>
  84626. 80223fe: 4603 mov r3, r0
  84627. 8022400: 813b strh r3, [r7, #8]
  84628. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
  84629. 8022402: 8938 ldrh r0, [r7, #8]
  84630. 8022404: 68fb ldr r3, [r7, #12]
  84631. 8022406: f103 01f0 add.w r1, r3, #240 @ 0xf0
  84632. 802240a: 2303 movs r3, #3
  84633. 802240c: 2237 movs r2, #55 @ 0x37
  84634. 802240e: f000 fbed bl 8022bec <dhcp_option>
  84635. 8022412: 4603 mov r3, r0
  84636. 8022414: 813b strh r3, [r7, #8]
  84637. for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
  84638. 8022416: 2300 movs r3, #0
  84639. 8022418: 77fb strb r3, [r7, #31]
  84640. 802241a: e00e b.n 802243a <dhcp_discover+0x9e>
  84641. options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
  84642. 802241c: 8938 ldrh r0, [r7, #8]
  84643. 802241e: 68fb ldr r3, [r7, #12]
  84644. 8022420: f103 01f0 add.w r1, r3, #240 @ 0xf0
  84645. 8022424: 7ffb ldrb r3, [r7, #31]
  84646. 8022426: 4a29 ldr r2, [pc, #164] @ (80224cc <dhcp_discover+0x130>)
  84647. 8022428: 5cd3 ldrb r3, [r2, r3]
  84648. 802242a: 461a mov r2, r3
  84649. 802242c: f000 fc12 bl 8022c54 <dhcp_option_byte>
  84650. 8022430: 4603 mov r3, r0
  84651. 8022432: 813b strh r3, [r7, #8]
  84652. for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
  84653. 8022434: 7ffb ldrb r3, [r7, #31]
  84654. 8022436: 3301 adds r3, #1
  84655. 8022438: 77fb strb r3, [r7, #31]
  84656. 802243a: 7ffb ldrb r3, [r7, #31]
  84657. 802243c: 2b02 cmp r3, #2
  84658. 802243e: d9ed bls.n 802241c <dhcp_discover+0x80>
  84659. }
  84660. LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_SELECTING, msg_out, DHCP_DISCOVER, &options_out_len);
  84661. dhcp_option_trailer(options_out_len, msg_out->options, p_out);
  84662. 8022440: 8938 ldrh r0, [r7, #8]
  84663. 8022442: 68fb ldr r3, [r7, #12]
  84664. 8022444: 33f0 adds r3, #240 @ 0xf0
  84665. 8022446: 693a ldr r2, [r7, #16]
  84666. 8022448: 4619 mov r1, r3
  84667. 802244a: f001 f923 bl 8023694 <dhcp_option_trailer>
  84668. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER)\n"));
  84669. udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY);
  84670. 802244e: 4b20 ldr r3, [pc, #128] @ (80224d0 <dhcp_discover+0x134>)
  84671. 8022450: 6818 ldr r0, [r3, #0]
  84672. 8022452: 4b20 ldr r3, [pc, #128] @ (80224d4 <dhcp_discover+0x138>)
  84673. 8022454: 9301 str r3, [sp, #4]
  84674. 8022456: 687b ldr r3, [r7, #4]
  84675. 8022458: 9300 str r3, [sp, #0]
  84676. 802245a: 2343 movs r3, #67 @ 0x43
  84677. 802245c: 4a1e ldr r2, [pc, #120] @ (80224d8 <dhcp_discover+0x13c>)
  84678. 802245e: 6939 ldr r1, [r7, #16]
  84679. 8022460: f7fe fff6 bl 8021450 <udp_sendto_if_src>
  84680. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n"));
  84681. pbuf_free(p_out);
  84682. 8022464: 6938 ldr r0, [r7, #16]
  84683. 8022466: f7f8 f839 bl 801a4dc <pbuf_free>
  84684. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n"));
  84685. } else {
  84686. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n"));
  84687. }
  84688. if (dhcp->tries < 255) {
  84689. 802246a: 69bb ldr r3, [r7, #24]
  84690. 802246c: 799b ldrb r3, [r3, #6]
  84691. 802246e: 2bff cmp r3, #255 @ 0xff
  84692. 8022470: d005 beq.n 802247e <dhcp_discover+0xe2>
  84693. dhcp->tries++;
  84694. 8022472: 69bb ldr r3, [r7, #24]
  84695. 8022474: 799b ldrb r3, [r3, #6]
  84696. 8022476: 3301 adds r3, #1
  84697. 8022478: b2da uxtb r2, r3
  84698. 802247a: 69bb ldr r3, [r7, #24]
  84699. 802247c: 719a strb r2, [r3, #6]
  84700. if (dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) {
  84701. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON;
  84702. autoip_start(netif);
  84703. }
  84704. #endif /* LWIP_DHCP_AUTOIP_COOP */
  84705. msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000);
  84706. 802247e: 69bb ldr r3, [r7, #24]
  84707. 8022480: 799b ldrb r3, [r3, #6]
  84708. 8022482: 2b05 cmp r3, #5
  84709. 8022484: d80d bhi.n 80224a2 <dhcp_discover+0x106>
  84710. 8022486: 69bb ldr r3, [r7, #24]
  84711. 8022488: 799b ldrb r3, [r3, #6]
  84712. 802248a: 461a mov r2, r3
  84713. 802248c: 2301 movs r3, #1
  84714. 802248e: 4093 lsls r3, r2
  84715. 8022490: b29b uxth r3, r3
  84716. 8022492: 461a mov r2, r3
  84717. 8022494: 0152 lsls r2, r2, #5
  84718. 8022496: 1ad2 subs r2, r2, r3
  84719. 8022498: 0092 lsls r2, r2, #2
  84720. 802249a: 4413 add r3, r2
  84721. 802249c: 00db lsls r3, r3, #3
  84722. 802249e: b29b uxth r3, r3
  84723. 80224a0: e001 b.n 80224a6 <dhcp_discover+0x10a>
  84724. 80224a2: f64e 2360 movw r3, #60000 @ 0xea60
  84725. 80224a6: 817b strh r3, [r7, #10]
  84726. dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
  84727. 80224a8: 897b ldrh r3, [r7, #10]
  84728. 80224aa: f203 13f3 addw r3, r3, #499 @ 0x1f3
  84729. 80224ae: 4a0b ldr r2, [pc, #44] @ (80224dc <dhcp_discover+0x140>)
  84730. 80224b0: fb82 1203 smull r1, r2, r2, r3
  84731. 80224b4: 1152 asrs r2, r2, #5
  84732. 80224b6: 17db asrs r3, r3, #31
  84733. 80224b8: 1ad3 subs r3, r2, r3
  84734. 80224ba: b29a uxth r2, r3
  84735. 80224bc: 69bb ldr r3, [r7, #24]
  84736. 80224be: 811a strh r2, [r3, #8]
  84737. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs));
  84738. return result;
  84739. 80224c0: f997 3017 ldrsb.w r3, [r7, #23]
  84740. }
  84741. 80224c4: 4618 mov r0, r3
  84742. 80224c6: 3720 adds r7, #32
  84743. 80224c8: 46bd mov sp, r7
  84744. 80224ca: bd80 pop {r7, pc}
  84745. 80224cc: 24000058 .word 0x24000058
  84746. 80224d0: 2402af14 .word 0x2402af14
  84747. 80224d4: 08030c10 .word 0x08030c10
  84748. 80224d8: 08030c14 .word 0x08030c14
  84749. 80224dc: 10624dd3 .word 0x10624dd3
  84750. 080224e0 <dhcp_bind>:
  84751. *
  84752. * @param netif network interface to bind to the offered address
  84753. */
  84754. static void
  84755. dhcp_bind(struct netif *netif)
  84756. {
  84757. 80224e0: b580 push {r7, lr}
  84758. 80224e2: b088 sub sp, #32
  84759. 80224e4: af00 add r7, sp, #0
  84760. 80224e6: 6078 str r0, [r7, #4]
  84761. u32_t timeout;
  84762. struct dhcp *dhcp;
  84763. ip4_addr_t sn_mask, gw_addr;
  84764. LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;);
  84765. 80224e8: 687b ldr r3, [r7, #4]
  84766. 80224ea: 2b00 cmp r3, #0
  84767. 80224ec: d107 bne.n 80224fe <dhcp_bind+0x1e>
  84768. 80224ee: 4b64 ldr r3, [pc, #400] @ (8022680 <dhcp_bind+0x1a0>)
  84769. 80224f0: f240 4215 movw r2, #1045 @ 0x415
  84770. 80224f4: 4963 ldr r1, [pc, #396] @ (8022684 <dhcp_bind+0x1a4>)
  84771. 80224f6: 4864 ldr r0, [pc, #400] @ (8022688 <dhcp_bind+0x1a8>)
  84772. 80224f8: f007 fa68 bl 80299cc <iprintf>
  84773. 80224fc: e0bc b.n 8022678 <dhcp_bind+0x198>
  84774. dhcp = netif_dhcp_data(netif);
  84775. 80224fe: 687b ldr r3, [r7, #4]
  84776. 8022500: 6a5b ldr r3, [r3, #36] @ 0x24
  84777. 8022502: 61fb str r3, [r7, #28]
  84778. LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;);
  84779. 8022504: 69fb ldr r3, [r7, #28]
  84780. 8022506: 2b00 cmp r3, #0
  84781. 8022508: d107 bne.n 802251a <dhcp_bind+0x3a>
  84782. 802250a: 4b5d ldr r3, [pc, #372] @ (8022680 <dhcp_bind+0x1a0>)
  84783. 802250c: f240 4217 movw r2, #1047 @ 0x417
  84784. 8022510: 495e ldr r1, [pc, #376] @ (802268c <dhcp_bind+0x1ac>)
  84785. 8022512: 485d ldr r0, [pc, #372] @ (8022688 <dhcp_bind+0x1a8>)
  84786. 8022514: f007 fa5a bl 80299cc <iprintf>
  84787. 8022518: e0ae b.n 8022678 <dhcp_bind+0x198>
  84788. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  84789. /* reset time used of lease */
  84790. dhcp->lease_used = 0;
  84791. 802251a: 69fb ldr r3, [r7, #28]
  84792. 802251c: 2200 movs r2, #0
  84793. 802251e: 825a strh r2, [r3, #18]
  84794. if (dhcp->offered_t0_lease != 0xffffffffUL) {
  84795. 8022520: 69fb ldr r3, [r7, #28]
  84796. 8022522: 6a9b ldr r3, [r3, #40] @ 0x28
  84797. 8022524: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  84798. 8022528: d019 beq.n 802255e <dhcp_bind+0x7e>
  84799. /* set renewal period timer */
  84800. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t0 renewal timer %"U32_F" secs\n", dhcp->offered_t0_lease));
  84801. timeout = (dhcp->offered_t0_lease + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
  84802. 802252a: 69fb ldr r3, [r7, #28]
  84803. 802252c: 6a9b ldr r3, [r3, #40] @ 0x28
  84804. 802252e: 331e adds r3, #30
  84805. 8022530: 4a57 ldr r2, [pc, #348] @ (8022690 <dhcp_bind+0x1b0>)
  84806. 8022532: fba2 2303 umull r2, r3, r2, r3
  84807. 8022536: 095b lsrs r3, r3, #5
  84808. 8022538: 61bb str r3, [r7, #24]
  84809. if (timeout > 0xffff) {
  84810. 802253a: 69bb ldr r3, [r7, #24]
  84811. 802253c: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  84812. 8022540: d302 bcc.n 8022548 <dhcp_bind+0x68>
  84813. timeout = 0xffff;
  84814. 8022542: f64f 73ff movw r3, #65535 @ 0xffff
  84815. 8022546: 61bb str r3, [r7, #24]
  84816. }
  84817. dhcp->t0_timeout = (u16_t)timeout;
  84818. 8022548: 69bb ldr r3, [r7, #24]
  84819. 802254a: b29a uxth r2, r3
  84820. 802254c: 69fb ldr r3, [r7, #28]
  84821. 802254e: 829a strh r2, [r3, #20]
  84822. if (dhcp->t0_timeout == 0) {
  84823. 8022550: 69fb ldr r3, [r7, #28]
  84824. 8022552: 8a9b ldrh r3, [r3, #20]
  84825. 8022554: 2b00 cmp r3, #0
  84826. 8022556: d102 bne.n 802255e <dhcp_bind+0x7e>
  84827. dhcp->t0_timeout = 1;
  84828. 8022558: 69fb ldr r3, [r7, #28]
  84829. 802255a: 2201 movs r2, #1
  84830. 802255c: 829a strh r2, [r3, #20]
  84831. }
  84832. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t0_lease * 1000));
  84833. }
  84834. /* temporary DHCP lease? */
  84835. if (dhcp->offered_t1_renew != 0xffffffffUL) {
  84836. 802255e: 69fb ldr r3, [r7, #28]
  84837. 8022560: 6adb ldr r3, [r3, #44] @ 0x2c
  84838. 8022562: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  84839. 8022566: d01d beq.n 80225a4 <dhcp_bind+0xc4>
  84840. /* set renewal period timer */
  84841. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew));
  84842. timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
  84843. 8022568: 69fb ldr r3, [r7, #28]
  84844. 802256a: 6adb ldr r3, [r3, #44] @ 0x2c
  84845. 802256c: 331e adds r3, #30
  84846. 802256e: 4a48 ldr r2, [pc, #288] @ (8022690 <dhcp_bind+0x1b0>)
  84847. 8022570: fba2 2303 umull r2, r3, r2, r3
  84848. 8022574: 095b lsrs r3, r3, #5
  84849. 8022576: 61bb str r3, [r7, #24]
  84850. if (timeout > 0xffff) {
  84851. 8022578: 69bb ldr r3, [r7, #24]
  84852. 802257a: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  84853. 802257e: d302 bcc.n 8022586 <dhcp_bind+0xa6>
  84854. timeout = 0xffff;
  84855. 8022580: f64f 73ff movw r3, #65535 @ 0xffff
  84856. 8022584: 61bb str r3, [r7, #24]
  84857. }
  84858. dhcp->t1_timeout = (u16_t)timeout;
  84859. 8022586: 69bb ldr r3, [r7, #24]
  84860. 8022588: b29a uxth r2, r3
  84861. 802258a: 69fb ldr r3, [r7, #28]
  84862. 802258c: 815a strh r2, [r3, #10]
  84863. if (dhcp->t1_timeout == 0) {
  84864. 802258e: 69fb ldr r3, [r7, #28]
  84865. 8022590: 895b ldrh r3, [r3, #10]
  84866. 8022592: 2b00 cmp r3, #0
  84867. 8022594: d102 bne.n 802259c <dhcp_bind+0xbc>
  84868. dhcp->t1_timeout = 1;
  84869. 8022596: 69fb ldr r3, [r7, #28]
  84870. 8022598: 2201 movs r2, #1
  84871. 802259a: 815a strh r2, [r3, #10]
  84872. }
  84873. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew * 1000));
  84874. dhcp->t1_renew_time = dhcp->t1_timeout;
  84875. 802259c: 69fb ldr r3, [r7, #28]
  84876. 802259e: 895a ldrh r2, [r3, #10]
  84877. 80225a0: 69fb ldr r3, [r7, #28]
  84878. 80225a2: 81da strh r2, [r3, #14]
  84879. }
  84880. /* set renewal period timer */
  84881. if (dhcp->offered_t2_rebind != 0xffffffffUL) {
  84882. 80225a4: 69fb ldr r3, [r7, #28]
  84883. 80225a6: 6b1b ldr r3, [r3, #48] @ 0x30
  84884. 80225a8: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  84885. 80225ac: d01d beq.n 80225ea <dhcp_bind+0x10a>
  84886. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind));
  84887. timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
  84888. 80225ae: 69fb ldr r3, [r7, #28]
  84889. 80225b0: 6b1b ldr r3, [r3, #48] @ 0x30
  84890. 80225b2: 331e adds r3, #30
  84891. 80225b4: 4a36 ldr r2, [pc, #216] @ (8022690 <dhcp_bind+0x1b0>)
  84892. 80225b6: fba2 2303 umull r2, r3, r2, r3
  84893. 80225ba: 095b lsrs r3, r3, #5
  84894. 80225bc: 61bb str r3, [r7, #24]
  84895. if (timeout > 0xffff) {
  84896. 80225be: 69bb ldr r3, [r7, #24]
  84897. 80225c0: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  84898. 80225c4: d302 bcc.n 80225cc <dhcp_bind+0xec>
  84899. timeout = 0xffff;
  84900. 80225c6: f64f 73ff movw r3, #65535 @ 0xffff
  84901. 80225ca: 61bb str r3, [r7, #24]
  84902. }
  84903. dhcp->t2_timeout = (u16_t)timeout;
  84904. 80225cc: 69bb ldr r3, [r7, #24]
  84905. 80225ce: b29a uxth r2, r3
  84906. 80225d0: 69fb ldr r3, [r7, #28]
  84907. 80225d2: 819a strh r2, [r3, #12]
  84908. if (dhcp->t2_timeout == 0) {
  84909. 80225d4: 69fb ldr r3, [r7, #28]
  84910. 80225d6: 899b ldrh r3, [r3, #12]
  84911. 80225d8: 2b00 cmp r3, #0
  84912. 80225da: d102 bne.n 80225e2 <dhcp_bind+0x102>
  84913. dhcp->t2_timeout = 1;
  84914. 80225dc: 69fb ldr r3, [r7, #28]
  84915. 80225de: 2201 movs r2, #1
  84916. 80225e0: 819a strh r2, [r3, #12]
  84917. }
  84918. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind * 1000));
  84919. dhcp->t2_rebind_time = dhcp->t2_timeout;
  84920. 80225e2: 69fb ldr r3, [r7, #28]
  84921. 80225e4: 899a ldrh r2, [r3, #12]
  84922. 80225e6: 69fb ldr r3, [r7, #28]
  84923. 80225e8: 821a strh r2, [r3, #16]
  84924. }
  84925. /* If we have sub 1 minute lease, t2 and t1 will kick in at the same time. */
  84926. if ((dhcp->t1_timeout >= dhcp->t2_timeout) && (dhcp->t2_timeout > 0)) {
  84927. 80225ea: 69fb ldr r3, [r7, #28]
  84928. 80225ec: 895a ldrh r2, [r3, #10]
  84929. 80225ee: 69fb ldr r3, [r7, #28]
  84930. 80225f0: 899b ldrh r3, [r3, #12]
  84931. 80225f2: 429a cmp r2, r3
  84932. 80225f4: d306 bcc.n 8022604 <dhcp_bind+0x124>
  84933. 80225f6: 69fb ldr r3, [r7, #28]
  84934. 80225f8: 899b ldrh r3, [r3, #12]
  84935. 80225fa: 2b00 cmp r3, #0
  84936. 80225fc: d002 beq.n 8022604 <dhcp_bind+0x124>
  84937. dhcp->t1_timeout = 0;
  84938. 80225fe: 69fb ldr r3, [r7, #28]
  84939. 8022600: 2200 movs r2, #0
  84940. 8022602: 815a strh r2, [r3, #10]
  84941. }
  84942. if (dhcp->subnet_mask_given) {
  84943. 8022604: 69fb ldr r3, [r7, #28]
  84944. 8022606: 79db ldrb r3, [r3, #7]
  84945. 8022608: 2b00 cmp r3, #0
  84946. 802260a: d003 beq.n 8022614 <dhcp_bind+0x134>
  84947. /* copy offered network mask */
  84948. ip4_addr_copy(sn_mask, dhcp->offered_sn_mask);
  84949. 802260c: 69fb ldr r3, [r7, #28]
  84950. 802260e: 6a1b ldr r3, [r3, #32]
  84951. 8022610: 613b str r3, [r7, #16]
  84952. 8022612: e014 b.n 802263e <dhcp_bind+0x15e>
  84953. } else {
  84954. /* subnet mask not given, choose a safe subnet mask given the network class */
  84955. u8_t first_octet = ip4_addr1(&dhcp->offered_ip_addr);
  84956. 8022614: 69fb ldr r3, [r7, #28]
  84957. 8022616: 331c adds r3, #28
  84958. 8022618: 781b ldrb r3, [r3, #0]
  84959. 802261a: 75fb strb r3, [r7, #23]
  84960. if (first_octet <= 127) {
  84961. 802261c: f997 3017 ldrsb.w r3, [r7, #23]
  84962. 8022620: 2b00 cmp r3, #0
  84963. 8022622: db02 blt.n 802262a <dhcp_bind+0x14a>
  84964. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xff000000UL));
  84965. 8022624: 23ff movs r3, #255 @ 0xff
  84966. 8022626: 613b str r3, [r7, #16]
  84967. 8022628: e009 b.n 802263e <dhcp_bind+0x15e>
  84968. } else if (first_octet >= 192) {
  84969. 802262a: 7dfb ldrb r3, [r7, #23]
  84970. 802262c: 2bbf cmp r3, #191 @ 0xbf
  84971. 802262e: d903 bls.n 8022638 <dhcp_bind+0x158>
  84972. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffffff00UL));
  84973. 8022630: f06f 437f mvn.w r3, #4278190080 @ 0xff000000
  84974. 8022634: 613b str r3, [r7, #16]
  84975. 8022636: e002 b.n 802263e <dhcp_bind+0x15e>
  84976. } else {
  84977. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffff0000UL));
  84978. 8022638: f64f 73ff movw r3, #65535 @ 0xffff
  84979. 802263c: 613b str r3, [r7, #16]
  84980. }
  84981. }
  84982. ip4_addr_copy(gw_addr, dhcp->offered_gw_addr);
  84983. 802263e: 69fb ldr r3, [r7, #28]
  84984. 8022640: 6a5b ldr r3, [r3, #36] @ 0x24
  84985. 8022642: 60fb str r3, [r7, #12]
  84986. /* gateway address not given? */
  84987. if (ip4_addr_isany_val(gw_addr)) {
  84988. 8022644: 68fb ldr r3, [r7, #12]
  84989. 8022646: 2b00 cmp r3, #0
  84990. 8022648: d108 bne.n 802265c <dhcp_bind+0x17c>
  84991. /* copy network address */
  84992. ip4_addr_get_network(&gw_addr, &dhcp->offered_ip_addr, &sn_mask);
  84993. 802264a: 69fb ldr r3, [r7, #28]
  84994. 802264c: 69da ldr r2, [r3, #28]
  84995. 802264e: 693b ldr r3, [r7, #16]
  84996. 8022650: 4013 ands r3, r2
  84997. 8022652: 60fb str r3, [r7, #12]
  84998. /* use first host address on network as gateway */
  84999. ip4_addr_set_u32(&gw_addr, ip4_addr_get_u32(&gw_addr) | PP_HTONL(0x00000001UL));
  85000. 8022654: 68fb ldr r3, [r7, #12]
  85001. 8022656: f043 7380 orr.w r3, r3, #16777216 @ 0x1000000
  85002. 802265a: 60fb str r3, [r7, #12]
  85003. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F" SN: 0x%08"X32_F" GW: 0x%08"X32_F"\n",
  85004. ip4_addr_get_u32(&dhcp->offered_ip_addr), ip4_addr_get_u32(&sn_mask), ip4_addr_get_u32(&gw_addr)));
  85005. /* netif is now bound to DHCP leased address - set this before assigning the address
  85006. to ensure the callback can use dhcp_supplied_address() */
  85007. dhcp_set_state(dhcp, DHCP_STATE_BOUND);
  85008. 802265c: 210a movs r1, #10
  85009. 802265e: 69f8 ldr r0, [r7, #28]
  85010. 8022660: f000 faa9 bl 8022bb6 <dhcp_set_state>
  85011. netif_set_addr(netif, &dhcp->offered_ip_addr, &sn_mask, &gw_addr);
  85012. 8022664: 69fb ldr r3, [r7, #28]
  85013. 8022666: f103 011c add.w r1, r3, #28
  85014. 802266a: f107 030c add.w r3, r7, #12
  85015. 802266e: f107 0210 add.w r2, r7, #16
  85016. 8022672: 6878 ldr r0, [r7, #4]
  85017. 8022674: f7f7 f9e8 bl 8019a48 <netif_set_addr>
  85018. /* interface is used by routing now that an address is set */
  85019. }
  85020. 8022678: 3720 adds r7, #32
  85021. 802267a: 46bd mov sp, r7
  85022. 802267c: bd80 pop {r7, pc}
  85023. 802267e: bf00 nop
  85024. 8022680: 0802fe54 .word 0x0802fe54
  85025. 8022684: 0802ffb4 .word 0x0802ffb4
  85026. 8022688: 0802feb4 .word 0x0802feb4
  85027. 802268c: 0802ffd0 .word 0x0802ffd0
  85028. 8022690: 88888889 .word 0x88888889
  85029. 08022694 <dhcp_renew>:
  85030. *
  85031. * @param netif network interface which must renew its lease
  85032. */
  85033. err_t
  85034. dhcp_renew(struct netif *netif)
  85035. {
  85036. 8022694: b580 push {r7, lr}
  85037. 8022696: b08a sub sp, #40 @ 0x28
  85038. 8022698: af02 add r7, sp, #8
  85039. 802269a: 6078 str r0, [r7, #4]
  85040. struct dhcp *dhcp = netif_dhcp_data(netif);
  85041. 802269c: 687b ldr r3, [r7, #4]
  85042. 802269e: 6a5b ldr r3, [r3, #36] @ 0x24
  85043. 80226a0: 61bb str r3, [r7, #24]
  85044. u16_t msecs;
  85045. u8_t i;
  85046. struct pbuf *p_out;
  85047. u16_t options_out_len;
  85048. LWIP_ASSERT_CORE_LOCKED();
  85049. 80226a2: f7ed ff45 bl 8010530 <sys_check_core_locking>
  85050. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n"));
  85051. dhcp_set_state(dhcp, DHCP_STATE_RENEWING);
  85052. 80226a6: 2105 movs r1, #5
  85053. 80226a8: 69b8 ldr r0, [r7, #24]
  85054. 80226aa: f000 fa84 bl 8022bb6 <dhcp_set_state>
  85055. /* create and initialize the DHCP message header */
  85056. p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len);
  85057. 80226ae: f107 030c add.w r3, r7, #12
  85058. 80226b2: 2203 movs r2, #3
  85059. 80226b4: 69b9 ldr r1, [r7, #24]
  85060. 80226b6: 6878 ldr r0, [r7, #4]
  85061. 80226b8: f000 ff16 bl 80234e8 <dhcp_create_msg>
  85062. 80226bc: 6178 str r0, [r7, #20]
  85063. if (p_out != NULL) {
  85064. 80226be: 697b ldr r3, [r7, #20]
  85065. 80226c0: 2b00 cmp r3, #0
  85066. 80226c2: d04e beq.n 8022762 <dhcp_renew+0xce>
  85067. struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
  85068. 80226c4: 697b ldr r3, [r7, #20]
  85069. 80226c6: 685b ldr r3, [r3, #4]
  85070. 80226c8: 613b str r3, [r7, #16]
  85071. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  85072. 80226ca: 89b8 ldrh r0, [r7, #12]
  85073. 80226cc: 693b ldr r3, [r7, #16]
  85074. 80226ce: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85075. 80226d2: 2302 movs r3, #2
  85076. 80226d4: 2239 movs r2, #57 @ 0x39
  85077. 80226d6: f000 fa89 bl 8022bec <dhcp_option>
  85078. 80226da: 4603 mov r3, r0
  85079. 80226dc: 81bb strh r3, [r7, #12]
  85080. options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif));
  85081. 80226de: 89b8 ldrh r0, [r7, #12]
  85082. 80226e0: 693b ldr r3, [r7, #16]
  85083. 80226e2: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85084. 80226e6: 687b ldr r3, [r7, #4]
  85085. 80226e8: 8d1b ldrh r3, [r3, #40] @ 0x28
  85086. 80226ea: 461a mov r2, r3
  85087. 80226ec: f000 fad8 bl 8022ca0 <dhcp_option_short>
  85088. 80226f0: 4603 mov r3, r0
  85089. 80226f2: 81bb strh r3, [r7, #12]
  85090. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
  85091. 80226f4: 89b8 ldrh r0, [r7, #12]
  85092. 80226f6: 693b ldr r3, [r7, #16]
  85093. 80226f8: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85094. 80226fc: 2303 movs r3, #3
  85095. 80226fe: 2237 movs r2, #55 @ 0x37
  85096. 8022700: f000 fa74 bl 8022bec <dhcp_option>
  85097. 8022704: 4603 mov r3, r0
  85098. 8022706: 81bb strh r3, [r7, #12]
  85099. for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
  85100. 8022708: 2300 movs r3, #0
  85101. 802270a: 77bb strb r3, [r7, #30]
  85102. 802270c: e00e b.n 802272c <dhcp_renew+0x98>
  85103. options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
  85104. 802270e: 89b8 ldrh r0, [r7, #12]
  85105. 8022710: 693b ldr r3, [r7, #16]
  85106. 8022712: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85107. 8022716: 7fbb ldrb r3, [r7, #30]
  85108. 8022718: 4a29 ldr r2, [pc, #164] @ (80227c0 <dhcp_renew+0x12c>)
  85109. 802271a: 5cd3 ldrb r3, [r2, r3]
  85110. 802271c: 461a mov r2, r3
  85111. 802271e: f000 fa99 bl 8022c54 <dhcp_option_byte>
  85112. 8022722: 4603 mov r3, r0
  85113. 8022724: 81bb strh r3, [r7, #12]
  85114. for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
  85115. 8022726: 7fbb ldrb r3, [r7, #30]
  85116. 8022728: 3301 adds r3, #1
  85117. 802272a: 77bb strb r3, [r7, #30]
  85118. 802272c: 7fbb ldrb r3, [r7, #30]
  85119. 802272e: 2b02 cmp r3, #2
  85120. 8022730: d9ed bls.n 802270e <dhcp_renew+0x7a>
  85121. #if LWIP_NETIF_HOSTNAME
  85122. options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif);
  85123. #endif /* LWIP_NETIF_HOSTNAME */
  85124. LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_RENEWING, msg_out, DHCP_REQUEST, &options_out_len);
  85125. dhcp_option_trailer(options_out_len, msg_out->options, p_out);
  85126. 8022732: 89b8 ldrh r0, [r7, #12]
  85127. 8022734: 693b ldr r3, [r7, #16]
  85128. 8022736: 33f0 adds r3, #240 @ 0xf0
  85129. 8022738: 697a ldr r2, [r7, #20]
  85130. 802273a: 4619 mov r1, r3
  85131. 802273c: f000 ffaa bl 8023694 <dhcp_option_trailer>
  85132. result = udp_sendto_if(dhcp_pcb, p_out, &dhcp->server_ip_addr, LWIP_IANA_PORT_DHCP_SERVER, netif);
  85133. 8022740: 4b20 ldr r3, [pc, #128] @ (80227c4 <dhcp_renew+0x130>)
  85134. 8022742: 6818 ldr r0, [r3, #0]
  85135. 8022744: 69bb ldr r3, [r7, #24]
  85136. 8022746: f103 0218 add.w r2, r3, #24
  85137. 802274a: 687b ldr r3, [r7, #4]
  85138. 802274c: 9300 str r3, [sp, #0]
  85139. 802274e: 2343 movs r3, #67 @ 0x43
  85140. 8022750: 6979 ldr r1, [r7, #20]
  85141. 8022752: f7fe fe09 bl 8021368 <udp_sendto_if>
  85142. 8022756: 4603 mov r3, r0
  85143. 8022758: 77fb strb r3, [r7, #31]
  85144. pbuf_free(p_out);
  85145. 802275a: 6978 ldr r0, [r7, #20]
  85146. 802275c: f7f7 febe bl 801a4dc <pbuf_free>
  85147. 8022760: e001 b.n 8022766 <dhcp_renew+0xd2>
  85148. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n"));
  85149. } else {
  85150. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n"));
  85151. result = ERR_MEM;
  85152. 8022762: 23ff movs r3, #255 @ 0xff
  85153. 8022764: 77fb strb r3, [r7, #31]
  85154. }
  85155. if (dhcp->tries < 255) {
  85156. 8022766: 69bb ldr r3, [r7, #24]
  85157. 8022768: 799b ldrb r3, [r3, #6]
  85158. 802276a: 2bff cmp r3, #255 @ 0xff
  85159. 802276c: d005 beq.n 802277a <dhcp_renew+0xe6>
  85160. dhcp->tries++;
  85161. 802276e: 69bb ldr r3, [r7, #24]
  85162. 8022770: 799b ldrb r3, [r3, #6]
  85163. 8022772: 3301 adds r3, #1
  85164. 8022774: b2da uxtb r2, r3
  85165. 8022776: 69bb ldr r3, [r7, #24]
  85166. 8022778: 719a strb r2, [r3, #6]
  85167. }
  85168. /* back-off on retries, but to a maximum of 20 seconds */
  85169. msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000);
  85170. 802277a: 69bb ldr r3, [r7, #24]
  85171. 802277c: 799b ldrb r3, [r3, #6]
  85172. 802277e: 2b09 cmp r3, #9
  85173. 8022780: d809 bhi.n 8022796 <dhcp_renew+0x102>
  85174. 8022782: 69bb ldr r3, [r7, #24]
  85175. 8022784: 799b ldrb r3, [r3, #6]
  85176. 8022786: 461a mov r2, r3
  85177. 8022788: 0152 lsls r2, r2, #5
  85178. 802278a: 1ad2 subs r2, r2, r3
  85179. 802278c: 0092 lsls r2, r2, #2
  85180. 802278e: 4413 add r3, r2
  85181. 8022790: 011b lsls r3, r3, #4
  85182. 8022792: b29b uxth r3, r3
  85183. 8022794: e001 b.n 802279a <dhcp_renew+0x106>
  85184. 8022796: f644 6320 movw r3, #20000 @ 0x4e20
  85185. 802279a: 81fb strh r3, [r7, #14]
  85186. dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
  85187. 802279c: 89fb ldrh r3, [r7, #14]
  85188. 802279e: f203 13f3 addw r3, r3, #499 @ 0x1f3
  85189. 80227a2: 4a09 ldr r2, [pc, #36] @ (80227c8 <dhcp_renew+0x134>)
  85190. 80227a4: fb82 1203 smull r1, r2, r2, r3
  85191. 80227a8: 1152 asrs r2, r2, #5
  85192. 80227aa: 17db asrs r3, r3, #31
  85193. 80227ac: 1ad3 subs r3, r2, r3
  85194. 80227ae: b29a uxth r2, r3
  85195. 80227b0: 69bb ldr r3, [r7, #24]
  85196. 80227b2: 811a strh r2, [r3, #8]
  85197. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs));
  85198. return result;
  85199. 80227b4: f997 301f ldrsb.w r3, [r7, #31]
  85200. }
  85201. 80227b8: 4618 mov r0, r3
  85202. 80227ba: 3720 adds r7, #32
  85203. 80227bc: 46bd mov sp, r7
  85204. 80227be: bd80 pop {r7, pc}
  85205. 80227c0: 24000058 .word 0x24000058
  85206. 80227c4: 2402af14 .word 0x2402af14
  85207. 80227c8: 10624dd3 .word 0x10624dd3
  85208. 080227cc <dhcp_rebind>:
  85209. *
  85210. * @param netif network interface which must rebind with a DHCP server
  85211. */
  85212. static err_t
  85213. dhcp_rebind(struct netif *netif)
  85214. {
  85215. 80227cc: b580 push {r7, lr}
  85216. 80227ce: b08a sub sp, #40 @ 0x28
  85217. 80227d0: af02 add r7, sp, #8
  85218. 80227d2: 6078 str r0, [r7, #4]
  85219. struct dhcp *dhcp = netif_dhcp_data(netif);
  85220. 80227d4: 687b ldr r3, [r7, #4]
  85221. 80227d6: 6a5b ldr r3, [r3, #36] @ 0x24
  85222. 80227d8: 61bb str r3, [r7, #24]
  85223. u8_t i;
  85224. struct pbuf *p_out;
  85225. u16_t options_out_len;
  85226. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n"));
  85227. dhcp_set_state(dhcp, DHCP_STATE_REBINDING);
  85228. 80227da: 2104 movs r1, #4
  85229. 80227dc: 69b8 ldr r0, [r7, #24]
  85230. 80227de: f000 f9ea bl 8022bb6 <dhcp_set_state>
  85231. /* create and initialize the DHCP message header */
  85232. p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len);
  85233. 80227e2: f107 030c add.w r3, r7, #12
  85234. 80227e6: 2203 movs r2, #3
  85235. 80227e8: 69b9 ldr r1, [r7, #24]
  85236. 80227ea: 6878 ldr r0, [r7, #4]
  85237. 80227ec: f000 fe7c bl 80234e8 <dhcp_create_msg>
  85238. 80227f0: 6178 str r0, [r7, #20]
  85239. if (p_out != NULL) {
  85240. 80227f2: 697b ldr r3, [r7, #20]
  85241. 80227f4: 2b00 cmp r3, #0
  85242. 80227f6: d04c beq.n 8022892 <dhcp_rebind+0xc6>
  85243. struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
  85244. 80227f8: 697b ldr r3, [r7, #20]
  85245. 80227fa: 685b ldr r3, [r3, #4]
  85246. 80227fc: 613b str r3, [r7, #16]
  85247. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  85248. 80227fe: 89b8 ldrh r0, [r7, #12]
  85249. 8022800: 693b ldr r3, [r7, #16]
  85250. 8022802: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85251. 8022806: 2302 movs r3, #2
  85252. 8022808: 2239 movs r2, #57 @ 0x39
  85253. 802280a: f000 f9ef bl 8022bec <dhcp_option>
  85254. 802280e: 4603 mov r3, r0
  85255. 8022810: 81bb strh r3, [r7, #12]
  85256. options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif));
  85257. 8022812: 89b8 ldrh r0, [r7, #12]
  85258. 8022814: 693b ldr r3, [r7, #16]
  85259. 8022816: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85260. 802281a: 687b ldr r3, [r7, #4]
  85261. 802281c: 8d1b ldrh r3, [r3, #40] @ 0x28
  85262. 802281e: 461a mov r2, r3
  85263. 8022820: f000 fa3e bl 8022ca0 <dhcp_option_short>
  85264. 8022824: 4603 mov r3, r0
  85265. 8022826: 81bb strh r3, [r7, #12]
  85266. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
  85267. 8022828: 89b8 ldrh r0, [r7, #12]
  85268. 802282a: 693b ldr r3, [r7, #16]
  85269. 802282c: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85270. 8022830: 2303 movs r3, #3
  85271. 8022832: 2237 movs r2, #55 @ 0x37
  85272. 8022834: f000 f9da bl 8022bec <dhcp_option>
  85273. 8022838: 4603 mov r3, r0
  85274. 802283a: 81bb strh r3, [r7, #12]
  85275. for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
  85276. 802283c: 2300 movs r3, #0
  85277. 802283e: 77bb strb r3, [r7, #30]
  85278. 8022840: e00e b.n 8022860 <dhcp_rebind+0x94>
  85279. options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
  85280. 8022842: 89b8 ldrh r0, [r7, #12]
  85281. 8022844: 693b ldr r3, [r7, #16]
  85282. 8022846: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85283. 802284a: 7fbb ldrb r3, [r7, #30]
  85284. 802284c: 4a28 ldr r2, [pc, #160] @ (80228f0 <dhcp_rebind+0x124>)
  85285. 802284e: 5cd3 ldrb r3, [r2, r3]
  85286. 8022850: 461a mov r2, r3
  85287. 8022852: f000 f9ff bl 8022c54 <dhcp_option_byte>
  85288. 8022856: 4603 mov r3, r0
  85289. 8022858: 81bb strh r3, [r7, #12]
  85290. for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
  85291. 802285a: 7fbb ldrb r3, [r7, #30]
  85292. 802285c: 3301 adds r3, #1
  85293. 802285e: 77bb strb r3, [r7, #30]
  85294. 8022860: 7fbb ldrb r3, [r7, #30]
  85295. 8022862: 2b02 cmp r3, #2
  85296. 8022864: d9ed bls.n 8022842 <dhcp_rebind+0x76>
  85297. #if LWIP_NETIF_HOSTNAME
  85298. options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif);
  85299. #endif /* LWIP_NETIF_HOSTNAME */
  85300. LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_REBINDING, msg_out, DHCP_DISCOVER, &options_out_len);
  85301. dhcp_option_trailer(options_out_len, msg_out->options, p_out);
  85302. 8022866: 89b8 ldrh r0, [r7, #12]
  85303. 8022868: 693b ldr r3, [r7, #16]
  85304. 802286a: 33f0 adds r3, #240 @ 0xf0
  85305. 802286c: 697a ldr r2, [r7, #20]
  85306. 802286e: 4619 mov r1, r3
  85307. 8022870: f000 ff10 bl 8023694 <dhcp_option_trailer>
  85308. /* broadcast to server */
  85309. result = udp_sendto_if(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif);
  85310. 8022874: 4b1f ldr r3, [pc, #124] @ (80228f4 <dhcp_rebind+0x128>)
  85311. 8022876: 6818 ldr r0, [r3, #0]
  85312. 8022878: 687b ldr r3, [r7, #4]
  85313. 802287a: 9300 str r3, [sp, #0]
  85314. 802287c: 2343 movs r3, #67 @ 0x43
  85315. 802287e: 4a1e ldr r2, [pc, #120] @ (80228f8 <dhcp_rebind+0x12c>)
  85316. 8022880: 6979 ldr r1, [r7, #20]
  85317. 8022882: f7fe fd71 bl 8021368 <udp_sendto_if>
  85318. 8022886: 4603 mov r3, r0
  85319. 8022888: 77fb strb r3, [r7, #31]
  85320. pbuf_free(p_out);
  85321. 802288a: 6978 ldr r0, [r7, #20]
  85322. 802288c: f7f7 fe26 bl 801a4dc <pbuf_free>
  85323. 8022890: e001 b.n 8022896 <dhcp_rebind+0xca>
  85324. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n"));
  85325. } else {
  85326. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n"));
  85327. result = ERR_MEM;
  85328. 8022892: 23ff movs r3, #255 @ 0xff
  85329. 8022894: 77fb strb r3, [r7, #31]
  85330. }
  85331. if (dhcp->tries < 255) {
  85332. 8022896: 69bb ldr r3, [r7, #24]
  85333. 8022898: 799b ldrb r3, [r3, #6]
  85334. 802289a: 2bff cmp r3, #255 @ 0xff
  85335. 802289c: d005 beq.n 80228aa <dhcp_rebind+0xde>
  85336. dhcp->tries++;
  85337. 802289e: 69bb ldr r3, [r7, #24]
  85338. 80228a0: 799b ldrb r3, [r3, #6]
  85339. 80228a2: 3301 adds r3, #1
  85340. 80228a4: b2da uxtb r2, r3
  85341. 80228a6: 69bb ldr r3, [r7, #24]
  85342. 80228a8: 719a strb r2, [r3, #6]
  85343. }
  85344. msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000);
  85345. 80228aa: 69bb ldr r3, [r7, #24]
  85346. 80228ac: 799b ldrb r3, [r3, #6]
  85347. 80228ae: 2b09 cmp r3, #9
  85348. 80228b0: d809 bhi.n 80228c6 <dhcp_rebind+0xfa>
  85349. 80228b2: 69bb ldr r3, [r7, #24]
  85350. 80228b4: 799b ldrb r3, [r3, #6]
  85351. 80228b6: 461a mov r2, r3
  85352. 80228b8: 0152 lsls r2, r2, #5
  85353. 80228ba: 1ad2 subs r2, r2, r3
  85354. 80228bc: 0092 lsls r2, r2, #2
  85355. 80228be: 4413 add r3, r2
  85356. 80228c0: 00db lsls r3, r3, #3
  85357. 80228c2: b29b uxth r3, r3
  85358. 80228c4: e001 b.n 80228ca <dhcp_rebind+0xfe>
  85359. 80228c6: f242 7310 movw r3, #10000 @ 0x2710
  85360. 80228ca: 81fb strh r3, [r7, #14]
  85361. dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
  85362. 80228cc: 89fb ldrh r3, [r7, #14]
  85363. 80228ce: f203 13f3 addw r3, r3, #499 @ 0x1f3
  85364. 80228d2: 4a0a ldr r2, [pc, #40] @ (80228fc <dhcp_rebind+0x130>)
  85365. 80228d4: fb82 1203 smull r1, r2, r2, r3
  85366. 80228d8: 1152 asrs r2, r2, #5
  85367. 80228da: 17db asrs r3, r3, #31
  85368. 80228dc: 1ad3 subs r3, r2, r3
  85369. 80228de: b29a uxth r2, r3
  85370. 80228e0: 69bb ldr r3, [r7, #24]
  85371. 80228e2: 811a strh r2, [r3, #8]
  85372. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs));
  85373. return result;
  85374. 80228e4: f997 301f ldrsb.w r3, [r7, #31]
  85375. }
  85376. 80228e8: 4618 mov r0, r3
  85377. 80228ea: 3720 adds r7, #32
  85378. 80228ec: 46bd mov sp, r7
  85379. 80228ee: bd80 pop {r7, pc}
  85380. 80228f0: 24000058 .word 0x24000058
  85381. 80228f4: 2402af14 .word 0x2402af14
  85382. 80228f8: 08030c14 .word 0x08030c14
  85383. 80228fc: 10624dd3 .word 0x10624dd3
  85384. 08022900 <dhcp_reboot>:
  85385. *
  85386. * @param netif network interface which must reboot
  85387. */
  85388. static err_t
  85389. dhcp_reboot(struct netif *netif)
  85390. {
  85391. 8022900: b5b0 push {r4, r5, r7, lr}
  85392. 8022902: b08a sub sp, #40 @ 0x28
  85393. 8022904: af02 add r7, sp, #8
  85394. 8022906: 6078 str r0, [r7, #4]
  85395. struct dhcp *dhcp = netif_dhcp_data(netif);
  85396. 8022908: 687b ldr r3, [r7, #4]
  85397. 802290a: 6a5b ldr r3, [r3, #36] @ 0x24
  85398. 802290c: 61bb str r3, [r7, #24]
  85399. u8_t i;
  85400. struct pbuf *p_out;
  85401. u16_t options_out_len;
  85402. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n"));
  85403. dhcp_set_state(dhcp, DHCP_STATE_REBOOTING);
  85404. 802290e: 2103 movs r1, #3
  85405. 8022910: 69b8 ldr r0, [r7, #24]
  85406. 8022912: f000 f950 bl 8022bb6 <dhcp_set_state>
  85407. /* create and initialize the DHCP message header */
  85408. p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len);
  85409. 8022916: f107 030c add.w r3, r7, #12
  85410. 802291a: 2203 movs r2, #3
  85411. 802291c: 69b9 ldr r1, [r7, #24]
  85412. 802291e: 6878 ldr r0, [r7, #4]
  85413. 8022920: f000 fde2 bl 80234e8 <dhcp_create_msg>
  85414. 8022924: 6178 str r0, [r7, #20]
  85415. if (p_out != NULL) {
  85416. 8022926: 697b ldr r3, [r7, #20]
  85417. 8022928: 2b00 cmp r3, #0
  85418. 802292a: d066 beq.n 80229fa <dhcp_reboot+0xfa>
  85419. struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
  85420. 802292c: 697b ldr r3, [r7, #20]
  85421. 802292e: 685b ldr r3, [r3, #4]
  85422. 8022930: 613b str r3, [r7, #16]
  85423. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  85424. 8022932: 89b8 ldrh r0, [r7, #12]
  85425. 8022934: 693b ldr r3, [r7, #16]
  85426. 8022936: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85427. 802293a: 2302 movs r3, #2
  85428. 802293c: 2239 movs r2, #57 @ 0x39
  85429. 802293e: f000 f955 bl 8022bec <dhcp_option>
  85430. 8022942: 4603 mov r3, r0
  85431. 8022944: 81bb strh r3, [r7, #12]
  85432. options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN_MIN_REQUIRED);
  85433. 8022946: 89b8 ldrh r0, [r7, #12]
  85434. 8022948: 693b ldr r3, [r7, #16]
  85435. 802294a: 33f0 adds r3, #240 @ 0xf0
  85436. 802294c: f44f 7210 mov.w r2, #576 @ 0x240
  85437. 8022950: 4619 mov r1, r3
  85438. 8022952: f000 f9a5 bl 8022ca0 <dhcp_option_short>
  85439. 8022956: 4603 mov r3, r0
  85440. 8022958: 81bb strh r3, [r7, #12]
  85441. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4);
  85442. 802295a: 89b8 ldrh r0, [r7, #12]
  85443. 802295c: 693b ldr r3, [r7, #16]
  85444. 802295e: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85445. 8022962: 2304 movs r3, #4
  85446. 8022964: 2232 movs r2, #50 @ 0x32
  85447. 8022966: f000 f941 bl 8022bec <dhcp_option>
  85448. 802296a: 4603 mov r3, r0
  85449. 802296c: 81bb strh r3, [r7, #12]
  85450. options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  85451. 802296e: 89bc ldrh r4, [r7, #12]
  85452. 8022970: 693b ldr r3, [r7, #16]
  85453. 8022972: f103 05f0 add.w r5, r3, #240 @ 0xf0
  85454. 8022976: 69bb ldr r3, [r7, #24]
  85455. 8022978: 69db ldr r3, [r3, #28]
  85456. 802297a: 4618 mov r0, r3
  85457. 802297c: f7f6 f8e1 bl 8018b42 <lwip_htonl>
  85458. 8022980: 4603 mov r3, r0
  85459. 8022982: 461a mov r2, r3
  85460. 8022984: 4629 mov r1, r5
  85461. 8022986: 4620 mov r0, r4
  85462. 8022988: f000 f9bc bl 8022d04 <dhcp_option_long>
  85463. 802298c: 4603 mov r3, r0
  85464. 802298e: 81bb strh r3, [r7, #12]
  85465. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
  85466. 8022990: 89b8 ldrh r0, [r7, #12]
  85467. 8022992: 693b ldr r3, [r7, #16]
  85468. 8022994: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85469. 8022998: 2303 movs r3, #3
  85470. 802299a: 2237 movs r2, #55 @ 0x37
  85471. 802299c: f000 f926 bl 8022bec <dhcp_option>
  85472. 80229a0: 4603 mov r3, r0
  85473. 80229a2: 81bb strh r3, [r7, #12]
  85474. for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
  85475. 80229a4: 2300 movs r3, #0
  85476. 80229a6: 77bb strb r3, [r7, #30]
  85477. 80229a8: e00e b.n 80229c8 <dhcp_reboot+0xc8>
  85478. options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
  85479. 80229aa: 89b8 ldrh r0, [r7, #12]
  85480. 80229ac: 693b ldr r3, [r7, #16]
  85481. 80229ae: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85482. 80229b2: 7fbb ldrb r3, [r7, #30]
  85483. 80229b4: 4a28 ldr r2, [pc, #160] @ (8022a58 <dhcp_reboot+0x158>)
  85484. 80229b6: 5cd3 ldrb r3, [r2, r3]
  85485. 80229b8: 461a mov r2, r3
  85486. 80229ba: f000 f94b bl 8022c54 <dhcp_option_byte>
  85487. 80229be: 4603 mov r3, r0
  85488. 80229c0: 81bb strh r3, [r7, #12]
  85489. for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
  85490. 80229c2: 7fbb ldrb r3, [r7, #30]
  85491. 80229c4: 3301 adds r3, #1
  85492. 80229c6: 77bb strb r3, [r7, #30]
  85493. 80229c8: 7fbb ldrb r3, [r7, #30]
  85494. 80229ca: 2b02 cmp r3, #2
  85495. 80229cc: d9ed bls.n 80229aa <dhcp_reboot+0xaa>
  85496. #if LWIP_NETIF_HOSTNAME
  85497. options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif);
  85498. #endif /* LWIP_NETIF_HOSTNAME */
  85499. LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_REBOOTING, msg_out, DHCP_REQUEST, &options_out_len);
  85500. dhcp_option_trailer(options_out_len, msg_out->options, p_out);
  85501. 80229ce: 89b8 ldrh r0, [r7, #12]
  85502. 80229d0: 693b ldr r3, [r7, #16]
  85503. 80229d2: 33f0 adds r3, #240 @ 0xf0
  85504. 80229d4: 697a ldr r2, [r7, #20]
  85505. 80229d6: 4619 mov r1, r3
  85506. 80229d8: f000 fe5c bl 8023694 <dhcp_option_trailer>
  85507. /* broadcast to server */
  85508. result = udp_sendto_if(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif);
  85509. 80229dc: 4b1f ldr r3, [pc, #124] @ (8022a5c <dhcp_reboot+0x15c>)
  85510. 80229de: 6818 ldr r0, [r3, #0]
  85511. 80229e0: 687b ldr r3, [r7, #4]
  85512. 80229e2: 9300 str r3, [sp, #0]
  85513. 80229e4: 2343 movs r3, #67 @ 0x43
  85514. 80229e6: 4a1e ldr r2, [pc, #120] @ (8022a60 <dhcp_reboot+0x160>)
  85515. 80229e8: 6979 ldr r1, [r7, #20]
  85516. 80229ea: f7fe fcbd bl 8021368 <udp_sendto_if>
  85517. 80229ee: 4603 mov r3, r0
  85518. 80229f0: 77fb strb r3, [r7, #31]
  85519. pbuf_free(p_out);
  85520. 80229f2: 6978 ldr r0, [r7, #20]
  85521. 80229f4: f7f7 fd72 bl 801a4dc <pbuf_free>
  85522. 80229f8: e001 b.n 80229fe <dhcp_reboot+0xfe>
  85523. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n"));
  85524. } else {
  85525. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n"));
  85526. result = ERR_MEM;
  85527. 80229fa: 23ff movs r3, #255 @ 0xff
  85528. 80229fc: 77fb strb r3, [r7, #31]
  85529. }
  85530. if (dhcp->tries < 255) {
  85531. 80229fe: 69bb ldr r3, [r7, #24]
  85532. 8022a00: 799b ldrb r3, [r3, #6]
  85533. 8022a02: 2bff cmp r3, #255 @ 0xff
  85534. 8022a04: d005 beq.n 8022a12 <dhcp_reboot+0x112>
  85535. dhcp->tries++;
  85536. 8022a06: 69bb ldr r3, [r7, #24]
  85537. 8022a08: 799b ldrb r3, [r3, #6]
  85538. 8022a0a: 3301 adds r3, #1
  85539. 8022a0c: b2da uxtb r2, r3
  85540. 8022a0e: 69bb ldr r3, [r7, #24]
  85541. 8022a10: 719a strb r2, [r3, #6]
  85542. }
  85543. msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000);
  85544. 8022a12: 69bb ldr r3, [r7, #24]
  85545. 8022a14: 799b ldrb r3, [r3, #6]
  85546. 8022a16: 2b09 cmp r3, #9
  85547. 8022a18: d809 bhi.n 8022a2e <dhcp_reboot+0x12e>
  85548. 8022a1a: 69bb ldr r3, [r7, #24]
  85549. 8022a1c: 799b ldrb r3, [r3, #6]
  85550. 8022a1e: 461a mov r2, r3
  85551. 8022a20: 0152 lsls r2, r2, #5
  85552. 8022a22: 1ad2 subs r2, r2, r3
  85553. 8022a24: 0092 lsls r2, r2, #2
  85554. 8022a26: 4413 add r3, r2
  85555. 8022a28: 00db lsls r3, r3, #3
  85556. 8022a2a: b29b uxth r3, r3
  85557. 8022a2c: e001 b.n 8022a32 <dhcp_reboot+0x132>
  85558. 8022a2e: f242 7310 movw r3, #10000 @ 0x2710
  85559. 8022a32: 81fb strh r3, [r7, #14]
  85560. dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
  85561. 8022a34: 89fb ldrh r3, [r7, #14]
  85562. 8022a36: f203 13f3 addw r3, r3, #499 @ 0x1f3
  85563. 8022a3a: 4a0a ldr r2, [pc, #40] @ (8022a64 <dhcp_reboot+0x164>)
  85564. 8022a3c: fb82 1203 smull r1, r2, r2, r3
  85565. 8022a40: 1152 asrs r2, r2, #5
  85566. 8022a42: 17db asrs r3, r3, #31
  85567. 8022a44: 1ad3 subs r3, r2, r3
  85568. 8022a46: b29a uxth r2, r3
  85569. 8022a48: 69bb ldr r3, [r7, #24]
  85570. 8022a4a: 811a strh r2, [r3, #8]
  85571. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot(): set request timeout %"U16_F" msecs\n", msecs));
  85572. return result;
  85573. 8022a4c: f997 301f ldrsb.w r3, [r7, #31]
  85574. }
  85575. 8022a50: 4618 mov r0, r3
  85576. 8022a52: 3720 adds r7, #32
  85577. 8022a54: 46bd mov sp, r7
  85578. 8022a56: bdb0 pop {r4, r5, r7, pc}
  85579. 8022a58: 24000058 .word 0x24000058
  85580. 8022a5c: 2402af14 .word 0x2402af14
  85581. 8022a60: 08030c14 .word 0x08030c14
  85582. 8022a64: 10624dd3 .word 0x10624dd3
  85583. 08022a68 <dhcp_release_and_stop>:
  85584. *
  85585. * @param netif network interface
  85586. */
  85587. void
  85588. dhcp_release_and_stop(struct netif *netif)
  85589. {
  85590. 8022a68: b5b0 push {r4, r5, r7, lr}
  85591. 8022a6a: b08a sub sp, #40 @ 0x28
  85592. 8022a6c: af02 add r7, sp, #8
  85593. 8022a6e: 6078 str r0, [r7, #4]
  85594. struct dhcp *dhcp = netif_dhcp_data(netif);
  85595. 8022a70: 687b ldr r3, [r7, #4]
  85596. 8022a72: 6a5b ldr r3, [r3, #36] @ 0x24
  85597. 8022a74: 61fb str r3, [r7, #28]
  85598. ip_addr_t server_ip_addr;
  85599. LWIP_ASSERT_CORE_LOCKED();
  85600. 8022a76: f7ed fd5b bl 8010530 <sys_check_core_locking>
  85601. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release_and_stop()\n"));
  85602. if (dhcp == NULL) {
  85603. 8022a7a: 69fb ldr r3, [r7, #28]
  85604. 8022a7c: 2b00 cmp r3, #0
  85605. 8022a7e: f000 8084 beq.w 8022b8a <dhcp_release_and_stop+0x122>
  85606. return;
  85607. }
  85608. /* already off? -> nothing to do */
  85609. if (dhcp->state == DHCP_STATE_OFF) {
  85610. 8022a82: 69fb ldr r3, [r7, #28]
  85611. 8022a84: 795b ldrb r3, [r3, #5]
  85612. 8022a86: 2b00 cmp r3, #0
  85613. 8022a88: f000 8081 beq.w 8022b8e <dhcp_release_and_stop+0x126>
  85614. return;
  85615. }
  85616. ip_addr_copy(server_ip_addr, dhcp->server_ip_addr);
  85617. 8022a8c: 69fb ldr r3, [r7, #28]
  85618. 8022a8e: 699b ldr r3, [r3, #24]
  85619. 8022a90: 613b str r3, [r7, #16]
  85620. /* clean old DHCP offer */
  85621. ip_addr_set_zero_ip4(&dhcp->server_ip_addr);
  85622. 8022a92: 69fb ldr r3, [r7, #28]
  85623. 8022a94: 2200 movs r2, #0
  85624. 8022a96: 619a str r2, [r3, #24]
  85625. ip4_addr_set_zero(&dhcp->offered_ip_addr);
  85626. 8022a98: 69fb ldr r3, [r7, #28]
  85627. 8022a9a: 2200 movs r2, #0
  85628. 8022a9c: 61da str r2, [r3, #28]
  85629. ip4_addr_set_zero(&dhcp->offered_sn_mask);
  85630. 8022a9e: 69fb ldr r3, [r7, #28]
  85631. 8022aa0: 2200 movs r2, #0
  85632. 8022aa2: 621a str r2, [r3, #32]
  85633. ip4_addr_set_zero(&dhcp->offered_gw_addr);
  85634. 8022aa4: 69fb ldr r3, [r7, #28]
  85635. 8022aa6: 2200 movs r2, #0
  85636. 8022aa8: 625a str r2, [r3, #36] @ 0x24
  85637. #if LWIP_DHCP_BOOTP_FILE
  85638. ip4_addr_set_zero(&dhcp->offered_si_addr);
  85639. #endif /* LWIP_DHCP_BOOTP_FILE */
  85640. dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0;
  85641. 8022aaa: 69fb ldr r3, [r7, #28]
  85642. 8022aac: 2200 movs r2, #0
  85643. 8022aae: 631a str r2, [r3, #48] @ 0x30
  85644. 8022ab0: 69fb ldr r3, [r7, #28]
  85645. 8022ab2: 6b1a ldr r2, [r3, #48] @ 0x30
  85646. 8022ab4: 69fb ldr r3, [r7, #28]
  85647. 8022ab6: 62da str r2, [r3, #44] @ 0x2c
  85648. 8022ab8: 69fb ldr r3, [r7, #28]
  85649. 8022aba: 6ada ldr r2, [r3, #44] @ 0x2c
  85650. 8022abc: 69fb ldr r3, [r7, #28]
  85651. 8022abe: 629a str r2, [r3, #40] @ 0x28
  85652. dhcp->t1_renew_time = dhcp->t2_rebind_time = dhcp->lease_used = dhcp->t0_timeout = 0;
  85653. 8022ac0: 69fb ldr r3, [r7, #28]
  85654. 8022ac2: 2200 movs r2, #0
  85655. 8022ac4: 829a strh r2, [r3, #20]
  85656. 8022ac6: 69fb ldr r3, [r7, #28]
  85657. 8022ac8: 8a9a ldrh r2, [r3, #20]
  85658. 8022aca: 69fb ldr r3, [r7, #28]
  85659. 8022acc: 825a strh r2, [r3, #18]
  85660. 8022ace: 69fb ldr r3, [r7, #28]
  85661. 8022ad0: 8a5a ldrh r2, [r3, #18]
  85662. 8022ad2: 69fb ldr r3, [r7, #28]
  85663. 8022ad4: 821a strh r2, [r3, #16]
  85664. 8022ad6: 69fb ldr r3, [r7, #28]
  85665. 8022ad8: 8a1a ldrh r2, [r3, #16]
  85666. 8022ada: 69fb ldr r3, [r7, #28]
  85667. 8022adc: 81da strh r2, [r3, #14]
  85668. /* send release message when current IP was assigned via DHCP */
  85669. if (dhcp_supplied_address(netif)) {
  85670. 8022ade: 6878 ldr r0, [r7, #4]
  85671. 8022ae0: f000 fe06 bl 80236f0 <dhcp_supplied_address>
  85672. 8022ae4: 4603 mov r3, r0
  85673. 8022ae6: 2b00 cmp r3, #0
  85674. 8022ae8: d03b beq.n 8022b62 <dhcp_release_and_stop+0xfa>
  85675. /* create and initialize the DHCP message header */
  85676. struct pbuf *p_out;
  85677. u16_t options_out_len;
  85678. p_out = dhcp_create_msg(netif, dhcp, DHCP_RELEASE, &options_out_len);
  85679. 8022aea: f107 030e add.w r3, r7, #14
  85680. 8022aee: 2207 movs r2, #7
  85681. 8022af0: 69f9 ldr r1, [r7, #28]
  85682. 8022af2: 6878 ldr r0, [r7, #4]
  85683. 8022af4: f000 fcf8 bl 80234e8 <dhcp_create_msg>
  85684. 8022af8: 61b8 str r0, [r7, #24]
  85685. if (p_out != NULL) {
  85686. 8022afa: 69bb ldr r3, [r7, #24]
  85687. 8022afc: 2b00 cmp r3, #0
  85688. 8022afe: d030 beq.n 8022b62 <dhcp_release_and_stop+0xfa>
  85689. struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
  85690. 8022b00: 69bb ldr r3, [r7, #24]
  85691. 8022b02: 685b ldr r3, [r3, #4]
  85692. 8022b04: 617b str r3, [r7, #20]
  85693. options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_SERVER_ID, 4);
  85694. 8022b06: 89f8 ldrh r0, [r7, #14]
  85695. 8022b08: 697b ldr r3, [r7, #20]
  85696. 8022b0a: f103 01f0 add.w r1, r3, #240 @ 0xf0
  85697. 8022b0e: 2304 movs r3, #4
  85698. 8022b10: 2236 movs r2, #54 @ 0x36
  85699. 8022b12: f000 f86b bl 8022bec <dhcp_option>
  85700. 8022b16: 4603 mov r3, r0
  85701. 8022b18: 81fb strh r3, [r7, #14]
  85702. options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&server_ip_addr))));
  85703. 8022b1a: 89fc ldrh r4, [r7, #14]
  85704. 8022b1c: 697b ldr r3, [r7, #20]
  85705. 8022b1e: f103 05f0 add.w r5, r3, #240 @ 0xf0
  85706. 8022b22: 693b ldr r3, [r7, #16]
  85707. 8022b24: 4618 mov r0, r3
  85708. 8022b26: f7f6 f80c bl 8018b42 <lwip_htonl>
  85709. 8022b2a: 4603 mov r3, r0
  85710. 8022b2c: 461a mov r2, r3
  85711. 8022b2e: 4629 mov r1, r5
  85712. 8022b30: 4620 mov r0, r4
  85713. 8022b32: f000 f8e7 bl 8022d04 <dhcp_option_long>
  85714. 8022b36: 4603 mov r3, r0
  85715. 8022b38: 81fb strh r3, [r7, #14]
  85716. LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, dhcp->state, msg_out, DHCP_RELEASE, &options_out_len);
  85717. dhcp_option_trailer(options_out_len, msg_out->options, p_out);
  85718. 8022b3a: 89f8 ldrh r0, [r7, #14]
  85719. 8022b3c: 697b ldr r3, [r7, #20]
  85720. 8022b3e: 33f0 adds r3, #240 @ 0xf0
  85721. 8022b40: 69ba ldr r2, [r7, #24]
  85722. 8022b42: 4619 mov r1, r3
  85723. 8022b44: f000 fda6 bl 8023694 <dhcp_option_trailer>
  85724. udp_sendto_if(dhcp_pcb, p_out, &server_ip_addr, LWIP_IANA_PORT_DHCP_SERVER, netif);
  85725. 8022b48: 4b13 ldr r3, [pc, #76] @ (8022b98 <dhcp_release_and_stop+0x130>)
  85726. 8022b4a: 6818 ldr r0, [r3, #0]
  85727. 8022b4c: f107 0210 add.w r2, r7, #16
  85728. 8022b50: 687b ldr r3, [r7, #4]
  85729. 8022b52: 9300 str r3, [sp, #0]
  85730. 8022b54: 2343 movs r3, #67 @ 0x43
  85731. 8022b56: 69b9 ldr r1, [r7, #24]
  85732. 8022b58: f7fe fc06 bl 8021368 <udp_sendto_if>
  85733. pbuf_free(p_out);
  85734. 8022b5c: 69b8 ldr r0, [r7, #24]
  85735. 8022b5e: f7f7 fcbd bl 801a4dc <pbuf_free>
  85736. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n"));
  85737. }
  85738. }
  85739. /* remove IP address from interface (prevents routing from selecting this interface) */
  85740. netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);
  85741. 8022b62: 4b0e ldr r3, [pc, #56] @ (8022b9c <dhcp_release_and_stop+0x134>)
  85742. 8022b64: 4a0d ldr r2, [pc, #52] @ (8022b9c <dhcp_release_and_stop+0x134>)
  85743. 8022b66: 490d ldr r1, [pc, #52] @ (8022b9c <dhcp_release_and_stop+0x134>)
  85744. 8022b68: 6878 ldr r0, [r7, #4]
  85745. 8022b6a: f7f6 ff6d bl 8019a48 <netif_set_addr>
  85746. autoip_stop(netif);
  85747. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;
  85748. }
  85749. #endif /* LWIP_DHCP_AUTOIP_COOP */
  85750. dhcp_set_state(dhcp, DHCP_STATE_OFF);
  85751. 8022b6e: 2100 movs r1, #0
  85752. 8022b70: 69f8 ldr r0, [r7, #28]
  85753. 8022b72: f000 f820 bl 8022bb6 <dhcp_set_state>
  85754. if (dhcp->pcb_allocated != 0) {
  85755. 8022b76: 69fb ldr r3, [r7, #28]
  85756. 8022b78: 791b ldrb r3, [r3, #4]
  85757. 8022b7a: 2b00 cmp r3, #0
  85758. 8022b7c: d008 beq.n 8022b90 <dhcp_release_and_stop+0x128>
  85759. dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */
  85760. 8022b7e: f7fe ff83 bl 8021a88 <dhcp_dec_pcb_refcount>
  85761. dhcp->pcb_allocated = 0;
  85762. 8022b82: 69fb ldr r3, [r7, #28]
  85763. 8022b84: 2200 movs r2, #0
  85764. 8022b86: 711a strb r2, [r3, #4]
  85765. 8022b88: e002 b.n 8022b90 <dhcp_release_and_stop+0x128>
  85766. return;
  85767. 8022b8a: bf00 nop
  85768. 8022b8c: e000 b.n 8022b90 <dhcp_release_and_stop+0x128>
  85769. return;
  85770. 8022b8e: bf00 nop
  85771. }
  85772. }
  85773. 8022b90: 3720 adds r7, #32
  85774. 8022b92: 46bd mov sp, r7
  85775. 8022b94: bdb0 pop {r4, r5, r7, pc}
  85776. 8022b96: bf00 nop
  85777. 8022b98: 2402af14 .word 0x2402af14
  85778. 8022b9c: 08030c10 .word 0x08030c10
  85779. 08022ba0 <dhcp_stop>:
  85780. * This function calls dhcp_release_and_stop() internally.
  85781. * @deprecated Use dhcp_release_and_stop() instead.
  85782. */
  85783. void
  85784. dhcp_stop(struct netif *netif)
  85785. {
  85786. 8022ba0: b580 push {r7, lr}
  85787. 8022ba2: b082 sub sp, #8
  85788. 8022ba4: af00 add r7, sp, #0
  85789. 8022ba6: 6078 str r0, [r7, #4]
  85790. dhcp_release_and_stop(netif);
  85791. 8022ba8: 6878 ldr r0, [r7, #4]
  85792. 8022baa: f7ff ff5d bl 8022a68 <dhcp_release_and_stop>
  85793. }
  85794. 8022bae: bf00 nop
  85795. 8022bb0: 3708 adds r7, #8
  85796. 8022bb2: 46bd mov sp, r7
  85797. 8022bb4: bd80 pop {r7, pc}
  85798. 08022bb6 <dhcp_set_state>:
  85799. *
  85800. * If the state changed, reset the number of tries.
  85801. */
  85802. static void
  85803. dhcp_set_state(struct dhcp *dhcp, u8_t new_state)
  85804. {
  85805. 8022bb6: b480 push {r7}
  85806. 8022bb8: b083 sub sp, #12
  85807. 8022bba: af00 add r7, sp, #0
  85808. 8022bbc: 6078 str r0, [r7, #4]
  85809. 8022bbe: 460b mov r3, r1
  85810. 8022bc0: 70fb strb r3, [r7, #3]
  85811. if (new_state != dhcp->state) {
  85812. 8022bc2: 687b ldr r3, [r7, #4]
  85813. 8022bc4: 795b ldrb r3, [r3, #5]
  85814. 8022bc6: 78fa ldrb r2, [r7, #3]
  85815. 8022bc8: 429a cmp r2, r3
  85816. 8022bca: d008 beq.n 8022bde <dhcp_set_state+0x28>
  85817. dhcp->state = new_state;
  85818. 8022bcc: 687b ldr r3, [r7, #4]
  85819. 8022bce: 78fa ldrb r2, [r7, #3]
  85820. 8022bd0: 715a strb r2, [r3, #5]
  85821. dhcp->tries = 0;
  85822. 8022bd2: 687b ldr r3, [r7, #4]
  85823. 8022bd4: 2200 movs r2, #0
  85824. 8022bd6: 719a strb r2, [r3, #6]
  85825. dhcp->request_timeout = 0;
  85826. 8022bd8: 687b ldr r3, [r7, #4]
  85827. 8022bda: 2200 movs r2, #0
  85828. 8022bdc: 811a strh r2, [r3, #8]
  85829. }
  85830. }
  85831. 8022bde: bf00 nop
  85832. 8022be0: 370c adds r7, #12
  85833. 8022be2: 46bd mov sp, r7
  85834. 8022be4: f85d 7b04 ldr.w r7, [sp], #4
  85835. 8022be8: 4770 bx lr
  85836. ...
  85837. 08022bec <dhcp_option>:
  85838. * DHCP message.
  85839. *
  85840. */
  85841. static u16_t
  85842. dhcp_option(u16_t options_out_len, u8_t *options, u8_t option_type, u8_t option_len)
  85843. {
  85844. 8022bec: b580 push {r7, lr}
  85845. 8022bee: b082 sub sp, #8
  85846. 8022bf0: af00 add r7, sp, #0
  85847. 8022bf2: 6039 str r1, [r7, #0]
  85848. 8022bf4: 4611 mov r1, r2
  85849. 8022bf6: 461a mov r2, r3
  85850. 8022bf8: 4603 mov r3, r0
  85851. 8022bfa: 80fb strh r3, [r7, #6]
  85852. 8022bfc: 460b mov r3, r1
  85853. 8022bfe: 717b strb r3, [r7, #5]
  85854. 8022c00: 4613 mov r3, r2
  85855. 8022c02: 713b strb r3, [r7, #4]
  85856. LWIP_ASSERT("dhcp_option: options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
  85857. 8022c04: 88fa ldrh r2, [r7, #6]
  85858. 8022c06: 793b ldrb r3, [r7, #4]
  85859. 8022c08: 4413 add r3, r2
  85860. 8022c0a: 3302 adds r3, #2
  85861. 8022c0c: 2b44 cmp r3, #68 @ 0x44
  85862. 8022c0e: d906 bls.n 8022c1e <dhcp_option+0x32>
  85863. 8022c10: 4b0d ldr r3, [pc, #52] @ (8022c48 <dhcp_option+0x5c>)
  85864. 8022c12: f240 529a movw r2, #1434 @ 0x59a
  85865. 8022c16: 490d ldr r1, [pc, #52] @ (8022c4c <dhcp_option+0x60>)
  85866. 8022c18: 480d ldr r0, [pc, #52] @ (8022c50 <dhcp_option+0x64>)
  85867. 8022c1a: f006 fed7 bl 80299cc <iprintf>
  85868. options[options_out_len++] = option_type;
  85869. 8022c1e: 88fb ldrh r3, [r7, #6]
  85870. 8022c20: 1c5a adds r2, r3, #1
  85871. 8022c22: 80fa strh r2, [r7, #6]
  85872. 8022c24: 461a mov r2, r3
  85873. 8022c26: 683b ldr r3, [r7, #0]
  85874. 8022c28: 4413 add r3, r2
  85875. 8022c2a: 797a ldrb r2, [r7, #5]
  85876. 8022c2c: 701a strb r2, [r3, #0]
  85877. options[options_out_len++] = option_len;
  85878. 8022c2e: 88fb ldrh r3, [r7, #6]
  85879. 8022c30: 1c5a adds r2, r3, #1
  85880. 8022c32: 80fa strh r2, [r7, #6]
  85881. 8022c34: 461a mov r2, r3
  85882. 8022c36: 683b ldr r3, [r7, #0]
  85883. 8022c38: 4413 add r3, r2
  85884. 8022c3a: 793a ldrb r2, [r7, #4]
  85885. 8022c3c: 701a strb r2, [r3, #0]
  85886. return options_out_len;
  85887. 8022c3e: 88fb ldrh r3, [r7, #6]
  85888. }
  85889. 8022c40: 4618 mov r0, r3
  85890. 8022c42: 3708 adds r7, #8
  85891. 8022c44: 46bd mov sp, r7
  85892. 8022c46: bd80 pop {r7, pc}
  85893. 8022c48: 0802fe54 .word 0x0802fe54
  85894. 8022c4c: 0802ffe8 .word 0x0802ffe8
  85895. 8022c50: 0802feb4 .word 0x0802feb4
  85896. 08022c54 <dhcp_option_byte>:
  85897. * Concatenate a single byte to the outgoing DHCP message.
  85898. *
  85899. */
  85900. static u16_t
  85901. dhcp_option_byte(u16_t options_out_len, u8_t *options, u8_t value)
  85902. {
  85903. 8022c54: b580 push {r7, lr}
  85904. 8022c56: b082 sub sp, #8
  85905. 8022c58: af00 add r7, sp, #0
  85906. 8022c5a: 4603 mov r3, r0
  85907. 8022c5c: 6039 str r1, [r7, #0]
  85908. 8022c5e: 80fb strh r3, [r7, #6]
  85909. 8022c60: 4613 mov r3, r2
  85910. 8022c62: 717b strb r3, [r7, #5]
  85911. LWIP_ASSERT("dhcp_option_byte: options_out_len < DHCP_OPTIONS_LEN", options_out_len < DHCP_OPTIONS_LEN);
  85912. 8022c64: 88fb ldrh r3, [r7, #6]
  85913. 8022c66: 2b43 cmp r3, #67 @ 0x43
  85914. 8022c68: d906 bls.n 8022c78 <dhcp_option_byte+0x24>
  85915. 8022c6a: 4b0a ldr r3, [pc, #40] @ (8022c94 <dhcp_option_byte+0x40>)
  85916. 8022c6c: f240 52a6 movw r2, #1446 @ 0x5a6
  85917. 8022c70: 4909 ldr r1, [pc, #36] @ (8022c98 <dhcp_option_byte+0x44>)
  85918. 8022c72: 480a ldr r0, [pc, #40] @ (8022c9c <dhcp_option_byte+0x48>)
  85919. 8022c74: f006 feaa bl 80299cc <iprintf>
  85920. options[options_out_len++] = value;
  85921. 8022c78: 88fb ldrh r3, [r7, #6]
  85922. 8022c7a: 1c5a adds r2, r3, #1
  85923. 8022c7c: 80fa strh r2, [r7, #6]
  85924. 8022c7e: 461a mov r2, r3
  85925. 8022c80: 683b ldr r3, [r7, #0]
  85926. 8022c82: 4413 add r3, r2
  85927. 8022c84: 797a ldrb r2, [r7, #5]
  85928. 8022c86: 701a strb r2, [r3, #0]
  85929. return options_out_len;
  85930. 8022c88: 88fb ldrh r3, [r7, #6]
  85931. }
  85932. 8022c8a: 4618 mov r0, r3
  85933. 8022c8c: 3708 adds r7, #8
  85934. 8022c8e: 46bd mov sp, r7
  85935. 8022c90: bd80 pop {r7, pc}
  85936. 8022c92: bf00 nop
  85937. 8022c94: 0802fe54 .word 0x0802fe54
  85938. 8022c98: 0803002c .word 0x0803002c
  85939. 8022c9c: 0802feb4 .word 0x0802feb4
  85940. 08022ca0 <dhcp_option_short>:
  85941. static u16_t
  85942. dhcp_option_short(u16_t options_out_len, u8_t *options, u16_t value)
  85943. {
  85944. 8022ca0: b580 push {r7, lr}
  85945. 8022ca2: b082 sub sp, #8
  85946. 8022ca4: af00 add r7, sp, #0
  85947. 8022ca6: 4603 mov r3, r0
  85948. 8022ca8: 6039 str r1, [r7, #0]
  85949. 8022caa: 80fb strh r3, [r7, #6]
  85950. 8022cac: 4613 mov r3, r2
  85951. 8022cae: 80bb strh r3, [r7, #4]
  85952. LWIP_ASSERT("dhcp_option_short: options_out_len + 2 <= DHCP_OPTIONS_LEN", options_out_len + 2U <= DHCP_OPTIONS_LEN);
  85953. 8022cb0: 88fb ldrh r3, [r7, #6]
  85954. 8022cb2: 3302 adds r3, #2
  85955. 8022cb4: 2b44 cmp r3, #68 @ 0x44
  85956. 8022cb6: d906 bls.n 8022cc6 <dhcp_option_short+0x26>
  85957. 8022cb8: 4b0f ldr r3, [pc, #60] @ (8022cf8 <dhcp_option_short+0x58>)
  85958. 8022cba: f240 52ae movw r2, #1454 @ 0x5ae
  85959. 8022cbe: 490f ldr r1, [pc, #60] @ (8022cfc <dhcp_option_short+0x5c>)
  85960. 8022cc0: 480f ldr r0, [pc, #60] @ (8022d00 <dhcp_option_short+0x60>)
  85961. 8022cc2: f006 fe83 bl 80299cc <iprintf>
  85962. options[options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
  85963. 8022cc6: 88bb ldrh r3, [r7, #4]
  85964. 8022cc8: 0a1b lsrs r3, r3, #8
  85965. 8022cca: b29a uxth r2, r3
  85966. 8022ccc: 88fb ldrh r3, [r7, #6]
  85967. 8022cce: 1c59 adds r1, r3, #1
  85968. 8022cd0: 80f9 strh r1, [r7, #6]
  85969. 8022cd2: 4619 mov r1, r3
  85970. 8022cd4: 683b ldr r3, [r7, #0]
  85971. 8022cd6: 440b add r3, r1
  85972. 8022cd8: b2d2 uxtb r2, r2
  85973. 8022cda: 701a strb r2, [r3, #0]
  85974. options[options_out_len++] = (u8_t) (value & 0x00ffU);
  85975. 8022cdc: 88fb ldrh r3, [r7, #6]
  85976. 8022cde: 1c5a adds r2, r3, #1
  85977. 8022ce0: 80fa strh r2, [r7, #6]
  85978. 8022ce2: 461a mov r2, r3
  85979. 8022ce4: 683b ldr r3, [r7, #0]
  85980. 8022ce6: 4413 add r3, r2
  85981. 8022ce8: 88ba ldrh r2, [r7, #4]
  85982. 8022cea: b2d2 uxtb r2, r2
  85983. 8022cec: 701a strb r2, [r3, #0]
  85984. return options_out_len;
  85985. 8022cee: 88fb ldrh r3, [r7, #6]
  85986. }
  85987. 8022cf0: 4618 mov r0, r3
  85988. 8022cf2: 3708 adds r7, #8
  85989. 8022cf4: 46bd mov sp, r7
  85990. 8022cf6: bd80 pop {r7, pc}
  85991. 8022cf8: 0802fe54 .word 0x0802fe54
  85992. 8022cfc: 08030064 .word 0x08030064
  85993. 8022d00: 0802feb4 .word 0x0802feb4
  85994. 08022d04 <dhcp_option_long>:
  85995. static u16_t
  85996. dhcp_option_long(u16_t options_out_len, u8_t *options, u32_t value)
  85997. {
  85998. 8022d04: b580 push {r7, lr}
  85999. 8022d06: b084 sub sp, #16
  86000. 8022d08: af00 add r7, sp, #0
  86001. 8022d0a: 4603 mov r3, r0
  86002. 8022d0c: 60b9 str r1, [r7, #8]
  86003. 8022d0e: 607a str r2, [r7, #4]
  86004. 8022d10: 81fb strh r3, [r7, #14]
  86005. LWIP_ASSERT("dhcp_option_long: options_out_len + 4 <= DHCP_OPTIONS_LEN", options_out_len + 4U <= DHCP_OPTIONS_LEN);
  86006. 8022d12: 89fb ldrh r3, [r7, #14]
  86007. 8022d14: 3304 adds r3, #4
  86008. 8022d16: 2b44 cmp r3, #68 @ 0x44
  86009. 8022d18: d906 bls.n 8022d28 <dhcp_option_long+0x24>
  86010. 8022d1a: 4b19 ldr r3, [pc, #100] @ (8022d80 <dhcp_option_long+0x7c>)
  86011. 8022d1c: f240 52b7 movw r2, #1463 @ 0x5b7
  86012. 8022d20: 4918 ldr r1, [pc, #96] @ (8022d84 <dhcp_option_long+0x80>)
  86013. 8022d22: 4819 ldr r0, [pc, #100] @ (8022d88 <dhcp_option_long+0x84>)
  86014. 8022d24: f006 fe52 bl 80299cc <iprintf>
  86015. options[options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  86016. 8022d28: 687b ldr r3, [r7, #4]
  86017. 8022d2a: 0e1a lsrs r2, r3, #24
  86018. 8022d2c: 89fb ldrh r3, [r7, #14]
  86019. 8022d2e: 1c59 adds r1, r3, #1
  86020. 8022d30: 81f9 strh r1, [r7, #14]
  86021. 8022d32: 4619 mov r1, r3
  86022. 8022d34: 68bb ldr r3, [r7, #8]
  86023. 8022d36: 440b add r3, r1
  86024. 8022d38: b2d2 uxtb r2, r2
  86025. 8022d3a: 701a strb r2, [r3, #0]
  86026. options[options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  86027. 8022d3c: 687b ldr r3, [r7, #4]
  86028. 8022d3e: 0c1a lsrs r2, r3, #16
  86029. 8022d40: 89fb ldrh r3, [r7, #14]
  86030. 8022d42: 1c59 adds r1, r3, #1
  86031. 8022d44: 81f9 strh r1, [r7, #14]
  86032. 8022d46: 4619 mov r1, r3
  86033. 8022d48: 68bb ldr r3, [r7, #8]
  86034. 8022d4a: 440b add r3, r1
  86035. 8022d4c: b2d2 uxtb r2, r2
  86036. 8022d4e: 701a strb r2, [r3, #0]
  86037. options[options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
  86038. 8022d50: 687b ldr r3, [r7, #4]
  86039. 8022d52: 0a1a lsrs r2, r3, #8
  86040. 8022d54: 89fb ldrh r3, [r7, #14]
  86041. 8022d56: 1c59 adds r1, r3, #1
  86042. 8022d58: 81f9 strh r1, [r7, #14]
  86043. 8022d5a: 4619 mov r1, r3
  86044. 8022d5c: 68bb ldr r3, [r7, #8]
  86045. 8022d5e: 440b add r3, r1
  86046. 8022d60: b2d2 uxtb r2, r2
  86047. 8022d62: 701a strb r2, [r3, #0]
  86048. options[options_out_len++] = (u8_t)((value & 0x000000ffUL));
  86049. 8022d64: 89fb ldrh r3, [r7, #14]
  86050. 8022d66: 1c5a adds r2, r3, #1
  86051. 8022d68: 81fa strh r2, [r7, #14]
  86052. 8022d6a: 461a mov r2, r3
  86053. 8022d6c: 68bb ldr r3, [r7, #8]
  86054. 8022d6e: 4413 add r3, r2
  86055. 8022d70: 687a ldr r2, [r7, #4]
  86056. 8022d72: b2d2 uxtb r2, r2
  86057. 8022d74: 701a strb r2, [r3, #0]
  86058. return options_out_len;
  86059. 8022d76: 89fb ldrh r3, [r7, #14]
  86060. }
  86061. 8022d78: 4618 mov r0, r3
  86062. 8022d7a: 3710 adds r7, #16
  86063. 8022d7c: 46bd mov sp, r7
  86064. 8022d7e: bd80 pop {r7, pc}
  86065. 8022d80: 0802fe54 .word 0x0802fe54
  86066. 8022d84: 080300a0 .word 0x080300a0
  86067. 8022d88: 0802feb4 .word 0x0802feb4
  86068. 08022d8c <dhcp_parse_reply>:
  86069. * use that further on.
  86070. *
  86071. */
  86072. static err_t
  86073. dhcp_parse_reply(struct pbuf *p, struct dhcp *dhcp)
  86074. {
  86075. 8022d8c: b580 push {r7, lr}
  86076. 8022d8e: b092 sub sp, #72 @ 0x48
  86077. 8022d90: af00 add r7, sp, #0
  86078. 8022d92: 6078 str r0, [r7, #4]
  86079. 8022d94: 6039 str r1, [r7, #0]
  86080. u16_t offset;
  86081. u16_t offset_max;
  86082. u16_t options_idx;
  86083. u16_t options_idx_max;
  86084. struct pbuf *q;
  86085. int parse_file_as_options = 0;
  86086. 8022d96: 2300 movs r3, #0
  86087. 8022d98: 633b str r3, [r7, #48] @ 0x30
  86088. int parse_sname_as_options = 0;
  86089. 8022d9a: 2300 movs r3, #0
  86090. 8022d9c: 62fb str r3, [r7, #44] @ 0x2c
  86091. #endif
  86092. LWIP_UNUSED_ARG(dhcp);
  86093. /* clear received options */
  86094. dhcp_clear_all_options(dhcp);
  86095. 8022d9e: 2208 movs r2, #8
  86096. 8022da0: 2100 movs r1, #0
  86097. 8022da2: 48b8 ldr r0, [pc, #736] @ (8023084 <dhcp_parse_reply+0x2f8>)
  86098. 8022da4: f006 ffa4 bl 8029cf0 <memset>
  86099. /* check that beginning of dhcp_msg (up to and including chaddr) is in first pbuf */
  86100. if (p->len < DHCP_SNAME_OFS) {
  86101. 8022da8: 687b ldr r3, [r7, #4]
  86102. 8022daa: 895b ldrh r3, [r3, #10]
  86103. 8022dac: 2b2b cmp r3, #43 @ 0x2b
  86104. 8022dae: d802 bhi.n 8022db6 <dhcp_parse_reply+0x2a>
  86105. return ERR_BUF;
  86106. 8022db0: f06f 0301 mvn.w r3, #1
  86107. 8022db4: e2b8 b.n 8023328 <dhcp_parse_reply+0x59c>
  86108. }
  86109. msg_in = (struct dhcp_msg *)p->payload;
  86110. 8022db6: 687b ldr r3, [r7, #4]
  86111. 8022db8: 685b ldr r3, [r3, #4]
  86112. 8022dba: 61fb str r3, [r7, #28]
  86113. #endif /* LWIP_DHCP_BOOTP_FILE */
  86114. /* parse options */
  86115. /* start with options field */
  86116. options_idx = DHCP_OPTIONS_OFS;
  86117. 8022dbc: 23f0 movs r3, #240 @ 0xf0
  86118. 8022dbe: 87bb strh r3, [r7, #60] @ 0x3c
  86119. /* parse options to the end of the received packet */
  86120. options_idx_max = p->tot_len;
  86121. 8022dc0: 687b ldr r3, [r7, #4]
  86122. 8022dc2: 891b ldrh r3, [r3, #8]
  86123. 8022dc4: 877b strh r3, [r7, #58] @ 0x3a
  86124. again:
  86125. q = p;
  86126. 8022dc6: 687b ldr r3, [r7, #4]
  86127. 8022dc8: 637b str r3, [r7, #52] @ 0x34
  86128. while ((q != NULL) && (options_idx >= q->len)) {
  86129. 8022dca: e00c b.n 8022de6 <dhcp_parse_reply+0x5a>
  86130. options_idx = (u16_t)(options_idx - q->len);
  86131. 8022dcc: 6b7b ldr r3, [r7, #52] @ 0x34
  86132. 8022dce: 895b ldrh r3, [r3, #10]
  86133. 8022dd0: 8fba ldrh r2, [r7, #60] @ 0x3c
  86134. 8022dd2: 1ad3 subs r3, r2, r3
  86135. 8022dd4: 87bb strh r3, [r7, #60] @ 0x3c
  86136. options_idx_max = (u16_t)(options_idx_max - q->len);
  86137. 8022dd6: 6b7b ldr r3, [r7, #52] @ 0x34
  86138. 8022dd8: 895b ldrh r3, [r3, #10]
  86139. 8022dda: 8f7a ldrh r2, [r7, #58] @ 0x3a
  86140. 8022ddc: 1ad3 subs r3, r2, r3
  86141. 8022dde: 877b strh r3, [r7, #58] @ 0x3a
  86142. q = q->next;
  86143. 8022de0: 6b7b ldr r3, [r7, #52] @ 0x34
  86144. 8022de2: 681b ldr r3, [r3, #0]
  86145. 8022de4: 637b str r3, [r7, #52] @ 0x34
  86146. while ((q != NULL) && (options_idx >= q->len)) {
  86147. 8022de6: 6b7b ldr r3, [r7, #52] @ 0x34
  86148. 8022de8: 2b00 cmp r3, #0
  86149. 8022dea: d004 beq.n 8022df6 <dhcp_parse_reply+0x6a>
  86150. 8022dec: 6b7b ldr r3, [r7, #52] @ 0x34
  86151. 8022dee: 895b ldrh r3, [r3, #10]
  86152. 8022df0: 8fba ldrh r2, [r7, #60] @ 0x3c
  86153. 8022df2: 429a cmp r2, r3
  86154. 8022df4: d2ea bcs.n 8022dcc <dhcp_parse_reply+0x40>
  86155. }
  86156. if (q == NULL) {
  86157. 8022df6: 6b7b ldr r3, [r7, #52] @ 0x34
  86158. 8022df8: 2b00 cmp r3, #0
  86159. 8022dfa: d102 bne.n 8022e02 <dhcp_parse_reply+0x76>
  86160. return ERR_BUF;
  86161. 8022dfc: f06f 0301 mvn.w r3, #1
  86162. 8022e00: e292 b.n 8023328 <dhcp_parse_reply+0x59c>
  86163. }
  86164. offset = options_idx;
  86165. 8022e02: 8fbb ldrh r3, [r7, #60] @ 0x3c
  86166. 8022e04: f8a7 3046 strh.w r3, [r7, #70] @ 0x46
  86167. offset_max = options_idx_max;
  86168. 8022e08: 8f7b ldrh r3, [r7, #58] @ 0x3a
  86169. 8022e0a: 87fb strh r3, [r7, #62] @ 0x3e
  86170. options = (u8_t *)q->payload;
  86171. 8022e0c: 6b7b ldr r3, [r7, #52] @ 0x34
  86172. 8022e0e: 685b ldr r3, [r3, #4]
  86173. 8022e10: 643b str r3, [r7, #64] @ 0x40
  86174. /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
  86175. while ((q != NULL) && (offset < offset_max) && (options[offset] != DHCP_OPTION_END)) {
  86176. 8022e12: e247 b.n 80232a4 <dhcp_parse_reply+0x518>
  86177. u8_t op = options[offset];
  86178. 8022e14: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  86179. 8022e18: 6c3a ldr r2, [r7, #64] @ 0x40
  86180. 8022e1a: 4413 add r3, r2
  86181. 8022e1c: 781b ldrb r3, [r3, #0]
  86182. 8022e1e: 76fb strb r3, [r7, #27]
  86183. u8_t len;
  86184. u8_t decode_len = 0;
  86185. 8022e20: 2300 movs r3, #0
  86186. 8022e22: f887 302a strb.w r3, [r7, #42] @ 0x2a
  86187. int decode_idx = -1;
  86188. 8022e26: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  86189. 8022e2a: 627b str r3, [r7, #36] @ 0x24
  86190. u16_t val_offset = (u16_t)(offset + 2);
  86191. 8022e2c: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  86192. 8022e30: 3302 adds r3, #2
  86193. 8022e32: 847b strh r3, [r7, #34] @ 0x22
  86194. if (val_offset < offset) {
  86195. 8022e34: 8c7a ldrh r2, [r7, #34] @ 0x22
  86196. 8022e36: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  86197. 8022e3a: 429a cmp r2, r3
  86198. 8022e3c: d202 bcs.n 8022e44 <dhcp_parse_reply+0xb8>
  86199. /* overflow */
  86200. return ERR_BUF;
  86201. 8022e3e: f06f 0301 mvn.w r3, #1
  86202. 8022e42: e271 b.n 8023328 <dhcp_parse_reply+0x59c>
  86203. }
  86204. /* len byte might be in the next pbuf */
  86205. if ((offset + 1) < q->len) {
  86206. 8022e44: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  86207. 8022e48: 3301 adds r3, #1
  86208. 8022e4a: 6b7a ldr r2, [r7, #52] @ 0x34
  86209. 8022e4c: 8952 ldrh r2, [r2, #10]
  86210. 8022e4e: 4293 cmp r3, r2
  86211. 8022e50: da08 bge.n 8022e64 <dhcp_parse_reply+0xd8>
  86212. len = options[offset + 1];
  86213. 8022e52: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  86214. 8022e56: 3301 adds r3, #1
  86215. 8022e58: 6c3a ldr r2, [r7, #64] @ 0x40
  86216. 8022e5a: 4413 add r3, r2
  86217. 8022e5c: 781b ldrb r3, [r3, #0]
  86218. 8022e5e: f887 302b strb.w r3, [r7, #43] @ 0x2b
  86219. 8022e62: e00b b.n 8022e7c <dhcp_parse_reply+0xf0>
  86220. } else {
  86221. len = (q->next != NULL ? ((u8_t *)q->next->payload)[0] : 0);
  86222. 8022e64: 6b7b ldr r3, [r7, #52] @ 0x34
  86223. 8022e66: 681b ldr r3, [r3, #0]
  86224. 8022e68: 2b00 cmp r3, #0
  86225. 8022e6a: d004 beq.n 8022e76 <dhcp_parse_reply+0xea>
  86226. 8022e6c: 6b7b ldr r3, [r7, #52] @ 0x34
  86227. 8022e6e: 681b ldr r3, [r3, #0]
  86228. 8022e70: 685b ldr r3, [r3, #4]
  86229. 8022e72: 781b ldrb r3, [r3, #0]
  86230. 8022e74: e000 b.n 8022e78 <dhcp_parse_reply+0xec>
  86231. 8022e76: 2300 movs r3, #0
  86232. 8022e78: f887 302b strb.w r3, [r7, #43] @ 0x2b
  86233. }
  86234. /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */
  86235. decode_len = len;
  86236. 8022e7c: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86237. 8022e80: f887 302a strb.w r3, [r7, #42] @ 0x2a
  86238. switch (op) {
  86239. 8022e84: 7efb ldrb r3, [r7, #27]
  86240. 8022e86: 2b3b cmp r3, #59 @ 0x3b
  86241. 8022e88: f200 812c bhi.w 80230e4 <dhcp_parse_reply+0x358>
  86242. 8022e8c: a201 add r2, pc, #4 @ (adr r2, 8022e94 <dhcp_parse_reply+0x108>)
  86243. 8022e8e: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  86244. 8022e92: bf00 nop
  86245. 8022e94: 08022f85 .word 0x08022f85
  86246. 8022e98: 08022f95 .word 0x08022f95
  86247. 8022e9c: 080230e5 .word 0x080230e5
  86248. 8022ea0: 08022fb7 .word 0x08022fb7
  86249. 8022ea4: 080230e5 .word 0x080230e5
  86250. 8022ea8: 080230e5 .word 0x080230e5
  86251. 8022eac: 080230e5 .word 0x080230e5
  86252. 8022eb0: 080230e5 .word 0x080230e5
  86253. 8022eb4: 080230e5 .word 0x080230e5
  86254. 8022eb8: 080230e5 .word 0x080230e5
  86255. 8022ebc: 080230e5 .word 0x080230e5
  86256. 8022ec0: 080230e5 .word 0x080230e5
  86257. 8022ec4: 080230e5 .word 0x080230e5
  86258. 8022ec8: 080230e5 .word 0x080230e5
  86259. 8022ecc: 080230e5 .word 0x080230e5
  86260. 8022ed0: 080230e5 .word 0x080230e5
  86261. 8022ed4: 080230e5 .word 0x080230e5
  86262. 8022ed8: 080230e5 .word 0x080230e5
  86263. 8022edc: 080230e5 .word 0x080230e5
  86264. 8022ee0: 080230e5 .word 0x080230e5
  86265. 8022ee4: 080230e5 .word 0x080230e5
  86266. 8022ee8: 080230e5 .word 0x080230e5
  86267. 8022eec: 080230e5 .word 0x080230e5
  86268. 8022ef0: 080230e5 .word 0x080230e5
  86269. 8022ef4: 080230e5 .word 0x080230e5
  86270. 8022ef8: 080230e5 .word 0x080230e5
  86271. 8022efc: 080230e5 .word 0x080230e5
  86272. 8022f00: 080230e5 .word 0x080230e5
  86273. 8022f04: 080230e5 .word 0x080230e5
  86274. 8022f08: 080230e5 .word 0x080230e5
  86275. 8022f0c: 080230e5 .word 0x080230e5
  86276. 8022f10: 080230e5 .word 0x080230e5
  86277. 8022f14: 080230e5 .word 0x080230e5
  86278. 8022f18: 080230e5 .word 0x080230e5
  86279. 8022f1c: 080230e5 .word 0x080230e5
  86280. 8022f20: 080230e5 .word 0x080230e5
  86281. 8022f24: 080230e5 .word 0x080230e5
  86282. 8022f28: 080230e5 .word 0x080230e5
  86283. 8022f2c: 080230e5 .word 0x080230e5
  86284. 8022f30: 080230e5 .word 0x080230e5
  86285. 8022f34: 080230e5 .word 0x080230e5
  86286. 8022f38: 080230e5 .word 0x080230e5
  86287. 8022f3c: 080230e5 .word 0x080230e5
  86288. 8022f40: 080230e5 .word 0x080230e5
  86289. 8022f44: 080230e5 .word 0x080230e5
  86290. 8022f48: 080230e5 .word 0x080230e5
  86291. 8022f4c: 080230e5 .word 0x080230e5
  86292. 8022f50: 080230e5 .word 0x080230e5
  86293. 8022f54: 080230e5 .word 0x080230e5
  86294. 8022f58: 080230e5 .word 0x080230e5
  86295. 8022f5c: 080230e5 .word 0x080230e5
  86296. 8022f60: 08022fe3 .word 0x08022fe3
  86297. 8022f64: 08023005 .word 0x08023005
  86298. 8022f68: 08023041 .word 0x08023041
  86299. 8022f6c: 08023063 .word 0x08023063
  86300. 8022f70: 080230e5 .word 0x080230e5
  86301. 8022f74: 080230e5 .word 0x080230e5
  86302. 8022f78: 080230e5 .word 0x080230e5
  86303. 8022f7c: 080230a1 .word 0x080230a1
  86304. 8022f80: 080230c3 .word 0x080230c3
  86305. /* case(DHCP_OPTION_END): handled above */
  86306. case (DHCP_OPTION_PAD):
  86307. /* special option: no len encoded */
  86308. decode_len = len = 0;
  86309. 8022f84: 2300 movs r3, #0
  86310. 8022f86: f887 302b strb.w r3, [r7, #43] @ 0x2b
  86311. 8022f8a: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86312. 8022f8e: f887 302a strb.w r3, [r7, #42] @ 0x2a
  86313. /* will be increased below */
  86314. break;
  86315. 8022f92: e0ab b.n 80230ec <dhcp_parse_reply+0x360>
  86316. case (DHCP_OPTION_SUBNET_MASK):
  86317. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  86318. 8022f94: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86319. 8022f98: 2b04 cmp r3, #4
  86320. 8022f9a: d009 beq.n 8022fb0 <dhcp_parse_reply+0x224>
  86321. 8022f9c: 4b3a ldr r3, [pc, #232] @ (8023088 <dhcp_parse_reply+0x2fc>)
  86322. 8022f9e: f240 622e movw r2, #1582 @ 0x62e
  86323. 8022fa2: 493a ldr r1, [pc, #232] @ (802308c <dhcp_parse_reply+0x300>)
  86324. 8022fa4: 483a ldr r0, [pc, #232] @ (8023090 <dhcp_parse_reply+0x304>)
  86325. 8022fa6: f006 fd11 bl 80299cc <iprintf>
  86326. 8022faa: f06f 0305 mvn.w r3, #5
  86327. 8022fae: e1bb b.n 8023328 <dhcp_parse_reply+0x59c>
  86328. decode_idx = DHCP_OPTION_IDX_SUBNET_MASK;
  86329. 8022fb0: 2306 movs r3, #6
  86330. 8022fb2: 627b str r3, [r7, #36] @ 0x24
  86331. break;
  86332. 8022fb4: e09a b.n 80230ec <dhcp_parse_reply+0x360>
  86333. case (DHCP_OPTION_ROUTER):
  86334. decode_len = 4; /* only copy the first given router */
  86335. 8022fb6: 2304 movs r3, #4
  86336. 8022fb8: f887 302a strb.w r3, [r7, #42] @ 0x2a
  86337. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  86338. 8022fbc: f897 202b ldrb.w r2, [r7, #43] @ 0x2b
  86339. 8022fc0: f897 302a ldrb.w r3, [r7, #42] @ 0x2a
  86340. 8022fc4: 429a cmp r2, r3
  86341. 8022fc6: d209 bcs.n 8022fdc <dhcp_parse_reply+0x250>
  86342. 8022fc8: 4b2f ldr r3, [pc, #188] @ (8023088 <dhcp_parse_reply+0x2fc>)
  86343. 8022fca: f240 6233 movw r2, #1587 @ 0x633
  86344. 8022fce: 4931 ldr r1, [pc, #196] @ (8023094 <dhcp_parse_reply+0x308>)
  86345. 8022fd0: 482f ldr r0, [pc, #188] @ (8023090 <dhcp_parse_reply+0x304>)
  86346. 8022fd2: f006 fcfb bl 80299cc <iprintf>
  86347. 8022fd6: f06f 0305 mvn.w r3, #5
  86348. 8022fda: e1a5 b.n 8023328 <dhcp_parse_reply+0x59c>
  86349. decode_idx = DHCP_OPTION_IDX_ROUTER;
  86350. 8022fdc: 2307 movs r3, #7
  86351. 8022fde: 627b str r3, [r7, #36] @ 0x24
  86352. break;
  86353. 8022fe0: e084 b.n 80230ec <dhcp_parse_reply+0x360>
  86354. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  86355. decode_idx = DHCP_OPTION_IDX_DNS_SERVER;
  86356. break;
  86357. #endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */
  86358. case (DHCP_OPTION_LEASE_TIME):
  86359. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  86360. 8022fe2: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86361. 8022fe6: 2b04 cmp r3, #4
  86362. 8022fe8: d009 beq.n 8022ffe <dhcp_parse_reply+0x272>
  86363. 8022fea: 4b27 ldr r3, [pc, #156] @ (8023088 <dhcp_parse_reply+0x2fc>)
  86364. 8022fec: f240 6241 movw r2, #1601 @ 0x641
  86365. 8022ff0: 4926 ldr r1, [pc, #152] @ (802308c <dhcp_parse_reply+0x300>)
  86366. 8022ff2: 4827 ldr r0, [pc, #156] @ (8023090 <dhcp_parse_reply+0x304>)
  86367. 8022ff4: f006 fcea bl 80299cc <iprintf>
  86368. 8022ff8: f06f 0305 mvn.w r3, #5
  86369. 8022ffc: e194 b.n 8023328 <dhcp_parse_reply+0x59c>
  86370. decode_idx = DHCP_OPTION_IDX_LEASE_TIME;
  86371. 8022ffe: 2303 movs r3, #3
  86372. 8023000: 627b str r3, [r7, #36] @ 0x24
  86373. break;
  86374. 8023002: e073 b.n 80230ec <dhcp_parse_reply+0x360>
  86375. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  86376. decode_idx = DHCP_OPTION_IDX_NTP_SERVER;
  86377. break;
  86378. #endif /* LWIP_DHCP_GET_NTP_SRV*/
  86379. case (DHCP_OPTION_OVERLOAD):
  86380. LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
  86381. 8023004: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86382. 8023008: 2b01 cmp r3, #1
  86383. 802300a: d009 beq.n 8023020 <dhcp_parse_reply+0x294>
  86384. 802300c: 4b1e ldr r3, [pc, #120] @ (8023088 <dhcp_parse_reply+0x2fc>)
  86385. 802300e: f240 624f movw r2, #1615 @ 0x64f
  86386. 8023012: 4921 ldr r1, [pc, #132] @ (8023098 <dhcp_parse_reply+0x30c>)
  86387. 8023014: 481e ldr r0, [pc, #120] @ (8023090 <dhcp_parse_reply+0x304>)
  86388. 8023016: f006 fcd9 bl 80299cc <iprintf>
  86389. 802301a: f06f 0305 mvn.w r3, #5
  86390. 802301e: e183 b.n 8023328 <dhcp_parse_reply+0x59c>
  86391. /* decode overload only in options, not in file/sname: invalid packet */
  86392. LWIP_ERROR("overload in file/sname", options_idx == DHCP_OPTIONS_OFS, return ERR_VAL;);
  86393. 8023020: 8fbb ldrh r3, [r7, #60] @ 0x3c
  86394. 8023022: 2bf0 cmp r3, #240 @ 0xf0
  86395. 8023024: d009 beq.n 802303a <dhcp_parse_reply+0x2ae>
  86396. 8023026: 4b18 ldr r3, [pc, #96] @ (8023088 <dhcp_parse_reply+0x2fc>)
  86397. 8023028: f240 6251 movw r2, #1617 @ 0x651
  86398. 802302c: 491b ldr r1, [pc, #108] @ (802309c <dhcp_parse_reply+0x310>)
  86399. 802302e: 4818 ldr r0, [pc, #96] @ (8023090 <dhcp_parse_reply+0x304>)
  86400. 8023030: f006 fccc bl 80299cc <iprintf>
  86401. 8023034: f06f 0305 mvn.w r3, #5
  86402. 8023038: e176 b.n 8023328 <dhcp_parse_reply+0x59c>
  86403. decode_idx = DHCP_OPTION_IDX_OVERLOAD;
  86404. 802303a: 2300 movs r3, #0
  86405. 802303c: 627b str r3, [r7, #36] @ 0x24
  86406. break;
  86407. 802303e: e055 b.n 80230ec <dhcp_parse_reply+0x360>
  86408. case (DHCP_OPTION_MESSAGE_TYPE):
  86409. LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
  86410. 8023040: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86411. 8023044: 2b01 cmp r3, #1
  86412. 8023046: d009 beq.n 802305c <dhcp_parse_reply+0x2d0>
  86413. 8023048: 4b0f ldr r3, [pc, #60] @ (8023088 <dhcp_parse_reply+0x2fc>)
  86414. 802304a: f240 6255 movw r2, #1621 @ 0x655
  86415. 802304e: 4912 ldr r1, [pc, #72] @ (8023098 <dhcp_parse_reply+0x30c>)
  86416. 8023050: 480f ldr r0, [pc, #60] @ (8023090 <dhcp_parse_reply+0x304>)
  86417. 8023052: f006 fcbb bl 80299cc <iprintf>
  86418. 8023056: f06f 0305 mvn.w r3, #5
  86419. 802305a: e165 b.n 8023328 <dhcp_parse_reply+0x59c>
  86420. decode_idx = DHCP_OPTION_IDX_MSG_TYPE;
  86421. 802305c: 2301 movs r3, #1
  86422. 802305e: 627b str r3, [r7, #36] @ 0x24
  86423. break;
  86424. 8023060: e044 b.n 80230ec <dhcp_parse_reply+0x360>
  86425. case (DHCP_OPTION_SERVER_ID):
  86426. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  86427. 8023062: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86428. 8023066: 2b04 cmp r3, #4
  86429. 8023068: d009 beq.n 802307e <dhcp_parse_reply+0x2f2>
  86430. 802306a: 4b07 ldr r3, [pc, #28] @ (8023088 <dhcp_parse_reply+0x2fc>)
  86431. 802306c: f240 6259 movw r2, #1625 @ 0x659
  86432. 8023070: 4906 ldr r1, [pc, #24] @ (802308c <dhcp_parse_reply+0x300>)
  86433. 8023072: 4807 ldr r0, [pc, #28] @ (8023090 <dhcp_parse_reply+0x304>)
  86434. 8023074: f006 fcaa bl 80299cc <iprintf>
  86435. 8023078: f06f 0305 mvn.w r3, #5
  86436. 802307c: e154 b.n 8023328 <dhcp_parse_reply+0x59c>
  86437. decode_idx = DHCP_OPTION_IDX_SERVER_ID;
  86438. 802307e: 2302 movs r3, #2
  86439. 8023080: 627b str r3, [r7, #36] @ 0x24
  86440. break;
  86441. 8023082: e033 b.n 80230ec <dhcp_parse_reply+0x360>
  86442. 8023084: 2402af0c .word 0x2402af0c
  86443. 8023088: 0802fe54 .word 0x0802fe54
  86444. 802308c: 080300dc .word 0x080300dc
  86445. 8023090: 0802feb4 .word 0x0802feb4
  86446. 8023094: 080300e8 .word 0x080300e8
  86447. 8023098: 080300fc .word 0x080300fc
  86448. 802309c: 08030108 .word 0x08030108
  86449. case (DHCP_OPTION_T1):
  86450. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  86451. 80230a0: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86452. 80230a4: 2b04 cmp r3, #4
  86453. 80230a6: d009 beq.n 80230bc <dhcp_parse_reply+0x330>
  86454. 80230a8: 4ba1 ldr r3, [pc, #644] @ (8023330 <dhcp_parse_reply+0x5a4>)
  86455. 80230aa: f240 625d movw r2, #1629 @ 0x65d
  86456. 80230ae: 49a1 ldr r1, [pc, #644] @ (8023334 <dhcp_parse_reply+0x5a8>)
  86457. 80230b0: 48a1 ldr r0, [pc, #644] @ (8023338 <dhcp_parse_reply+0x5ac>)
  86458. 80230b2: f006 fc8b bl 80299cc <iprintf>
  86459. 80230b6: f06f 0305 mvn.w r3, #5
  86460. 80230ba: e135 b.n 8023328 <dhcp_parse_reply+0x59c>
  86461. decode_idx = DHCP_OPTION_IDX_T1;
  86462. 80230bc: 2304 movs r3, #4
  86463. 80230be: 627b str r3, [r7, #36] @ 0x24
  86464. break;
  86465. 80230c0: e014 b.n 80230ec <dhcp_parse_reply+0x360>
  86466. case (DHCP_OPTION_T2):
  86467. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  86468. 80230c2: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86469. 80230c6: 2b04 cmp r3, #4
  86470. 80230c8: d009 beq.n 80230de <dhcp_parse_reply+0x352>
  86471. 80230ca: 4b99 ldr r3, [pc, #612] @ (8023330 <dhcp_parse_reply+0x5a4>)
  86472. 80230cc: f240 6261 movw r2, #1633 @ 0x661
  86473. 80230d0: 4998 ldr r1, [pc, #608] @ (8023334 <dhcp_parse_reply+0x5a8>)
  86474. 80230d2: 4899 ldr r0, [pc, #612] @ (8023338 <dhcp_parse_reply+0x5ac>)
  86475. 80230d4: f006 fc7a bl 80299cc <iprintf>
  86476. 80230d8: f06f 0305 mvn.w r3, #5
  86477. 80230dc: e124 b.n 8023328 <dhcp_parse_reply+0x59c>
  86478. decode_idx = DHCP_OPTION_IDX_T2;
  86479. 80230de: 2305 movs r3, #5
  86480. 80230e0: 627b str r3, [r7, #36] @ 0x24
  86481. break;
  86482. 80230e2: e003 b.n 80230ec <dhcp_parse_reply+0x360>
  86483. default:
  86484. decode_len = 0;
  86485. 80230e4: 2300 movs r3, #0
  86486. 80230e6: f887 302a strb.w r3, [r7, #42] @ 0x2a
  86487. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", (u16_t)op));
  86488. LWIP_HOOK_DHCP_PARSE_OPTION(ip_current_netif(), dhcp, dhcp->state, msg_in,
  86489. dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) ? (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) : 0,
  86490. op, len, q, val_offset);
  86491. break;
  86492. 80230ea: bf00 nop
  86493. }
  86494. if (op == DHCP_OPTION_PAD) {
  86495. 80230ec: 7efb ldrb r3, [r7, #27]
  86496. 80230ee: 2b00 cmp r3, #0
  86497. 80230f0: d105 bne.n 80230fe <dhcp_parse_reply+0x372>
  86498. offset++;
  86499. 80230f2: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  86500. 80230f6: 3301 adds r3, #1
  86501. 80230f8: f8a7 3046 strh.w r3, [r7, #70] @ 0x46
  86502. 80230fc: e0a4 b.n 8023248 <dhcp_parse_reply+0x4bc>
  86503. } else {
  86504. if (offset + len + 2 > 0xFFFF) {
  86505. 80230fe: f8b7 2046 ldrh.w r2, [r7, #70] @ 0x46
  86506. 8023102: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86507. 8023106: 4413 add r3, r2
  86508. 8023108: f64f 72fd movw r2, #65533 @ 0xfffd
  86509. 802310c: 4293 cmp r3, r2
  86510. 802310e: dd02 ble.n 8023116 <dhcp_parse_reply+0x38a>
  86511. /* overflow */
  86512. return ERR_BUF;
  86513. 8023110: f06f 0301 mvn.w r3, #1
  86514. 8023114: e108 b.n 8023328 <dhcp_parse_reply+0x59c>
  86515. }
  86516. offset = (u16_t)(offset + len + 2);
  86517. 8023116: f897 302b ldrb.w r3, [r7, #43] @ 0x2b
  86518. 802311a: b29a uxth r2, r3
  86519. 802311c: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  86520. 8023120: 4413 add r3, r2
  86521. 8023122: b29b uxth r3, r3
  86522. 8023124: 3302 adds r3, #2
  86523. 8023126: f8a7 3046 strh.w r3, [r7, #70] @ 0x46
  86524. if (decode_len > 0) {
  86525. 802312a: f897 302a ldrb.w r3, [r7, #42] @ 0x2a
  86526. 802312e: 2b00 cmp r3, #0
  86527. 8023130: f000 808a beq.w 8023248 <dhcp_parse_reply+0x4bc>
  86528. u32_t value = 0;
  86529. 8023134: 2300 movs r3, #0
  86530. 8023136: 60fb str r3, [r7, #12]
  86531. u16_t copy_len;
  86532. decode_next:
  86533. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  86534. 8023138: 6a7b ldr r3, [r7, #36] @ 0x24
  86535. 802313a: 2b00 cmp r3, #0
  86536. 802313c: db02 blt.n 8023144 <dhcp_parse_reply+0x3b8>
  86537. 802313e: 6a7b ldr r3, [r7, #36] @ 0x24
  86538. 8023140: 2b07 cmp r3, #7
  86539. 8023142: dd06 ble.n 8023152 <dhcp_parse_reply+0x3c6>
  86540. 8023144: 4b7a ldr r3, [pc, #488] @ (8023330 <dhcp_parse_reply+0x5a4>)
  86541. 8023146: f44f 62cf mov.w r2, #1656 @ 0x678
  86542. 802314a: 497c ldr r1, [pc, #496] @ (802333c <dhcp_parse_reply+0x5b0>)
  86543. 802314c: 487a ldr r0, [pc, #488] @ (8023338 <dhcp_parse_reply+0x5ac>)
  86544. 802314e: f006 fc3d bl 80299cc <iprintf>
  86545. if (!dhcp_option_given(dhcp, decode_idx)) {
  86546. 8023152: 4a7b ldr r2, [pc, #492] @ (8023340 <dhcp_parse_reply+0x5b4>)
  86547. 8023154: 6a7b ldr r3, [r7, #36] @ 0x24
  86548. 8023156: 4413 add r3, r2
  86549. 8023158: 781b ldrb r3, [r3, #0]
  86550. 802315a: 2b00 cmp r3, #0
  86551. 802315c: d174 bne.n 8023248 <dhcp_parse_reply+0x4bc>
  86552. copy_len = LWIP_MIN(decode_len, 4);
  86553. 802315e: f897 302a ldrb.w r3, [r7, #42] @ 0x2a
  86554. 8023162: 2b04 cmp r3, #4
  86555. 8023164: bf28 it cs
  86556. 8023166: 2304 movcs r3, #4
  86557. 8023168: b2db uxtb r3, r3
  86558. 802316a: 833b strh r3, [r7, #24]
  86559. if (pbuf_copy_partial(q, &value, copy_len, val_offset) != copy_len) {
  86560. 802316c: 8c7b ldrh r3, [r7, #34] @ 0x22
  86561. 802316e: 8b3a ldrh r2, [r7, #24]
  86562. 8023170: f107 010c add.w r1, r7, #12
  86563. 8023174: 6b78 ldr r0, [r7, #52] @ 0x34
  86564. 8023176: f7f7 fbb7 bl 801a8e8 <pbuf_copy_partial>
  86565. 802317a: 4603 mov r3, r0
  86566. 802317c: 461a mov r2, r3
  86567. 802317e: 8b3b ldrh r3, [r7, #24]
  86568. 8023180: 4293 cmp r3, r2
  86569. 8023182: d002 beq.n 802318a <dhcp_parse_reply+0x3fe>
  86570. return ERR_BUF;
  86571. 8023184: f06f 0301 mvn.w r3, #1
  86572. 8023188: e0ce b.n 8023328 <dhcp_parse_reply+0x59c>
  86573. }
  86574. if (decode_len > 4) {
  86575. 802318a: f897 302a ldrb.w r3, [r7, #42] @ 0x2a
  86576. 802318e: 2b04 cmp r3, #4
  86577. 8023190: d933 bls.n 80231fa <dhcp_parse_reply+0x46e>
  86578. /* decode more than one u32_t */
  86579. u16_t next_val_offset;
  86580. LWIP_ERROR("decode_len %% 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
  86581. 8023192: f897 302a ldrb.w r3, [r7, #42] @ 0x2a
  86582. 8023196: f003 0303 and.w r3, r3, #3
  86583. 802319a: b2db uxtb r3, r3
  86584. 802319c: 2b00 cmp r3, #0
  86585. 802319e: d009 beq.n 80231b4 <dhcp_parse_reply+0x428>
  86586. 80231a0: 4b63 ldr r3, [pc, #396] @ (8023330 <dhcp_parse_reply+0x5a4>)
  86587. 80231a2: f240 6281 movw r2, #1665 @ 0x681
  86588. 80231a6: 4967 ldr r1, [pc, #412] @ (8023344 <dhcp_parse_reply+0x5b8>)
  86589. 80231a8: 4863 ldr r0, [pc, #396] @ (8023338 <dhcp_parse_reply+0x5ac>)
  86590. 80231aa: f006 fc0f bl 80299cc <iprintf>
  86591. 80231ae: f06f 0305 mvn.w r3, #5
  86592. 80231b2: e0b9 b.n 8023328 <dhcp_parse_reply+0x59c>
  86593. dhcp_got_option(dhcp, decode_idx);
  86594. 80231b4: 4a62 ldr r2, [pc, #392] @ (8023340 <dhcp_parse_reply+0x5b4>)
  86595. 80231b6: 6a7b ldr r3, [r7, #36] @ 0x24
  86596. 80231b8: 4413 add r3, r2
  86597. 80231ba: 2201 movs r2, #1
  86598. 80231bc: 701a strb r2, [r3, #0]
  86599. dhcp_set_option_value(dhcp, decode_idx, lwip_htonl(value));
  86600. 80231be: 68fb ldr r3, [r7, #12]
  86601. 80231c0: 4618 mov r0, r3
  86602. 80231c2: f7f5 fcbe bl 8018b42 <lwip_htonl>
  86603. 80231c6: 4602 mov r2, r0
  86604. 80231c8: 495f ldr r1, [pc, #380] @ (8023348 <dhcp_parse_reply+0x5bc>)
  86605. 80231ca: 6a7b ldr r3, [r7, #36] @ 0x24
  86606. 80231cc: f841 2023 str.w r2, [r1, r3, lsl #2]
  86607. decode_len = (u8_t)(decode_len - 4);
  86608. 80231d0: f897 302a ldrb.w r3, [r7, #42] @ 0x2a
  86609. 80231d4: 3b04 subs r3, #4
  86610. 80231d6: f887 302a strb.w r3, [r7, #42] @ 0x2a
  86611. next_val_offset = (u16_t)(val_offset + 4);
  86612. 80231da: 8c7b ldrh r3, [r7, #34] @ 0x22
  86613. 80231dc: 3304 adds r3, #4
  86614. 80231de: 82fb strh r3, [r7, #22]
  86615. if (next_val_offset < val_offset) {
  86616. 80231e0: 8afa ldrh r2, [r7, #22]
  86617. 80231e2: 8c7b ldrh r3, [r7, #34] @ 0x22
  86618. 80231e4: 429a cmp r2, r3
  86619. 80231e6: d202 bcs.n 80231ee <dhcp_parse_reply+0x462>
  86620. /* overflow */
  86621. return ERR_BUF;
  86622. 80231e8: f06f 0301 mvn.w r3, #1
  86623. 80231ec: e09c b.n 8023328 <dhcp_parse_reply+0x59c>
  86624. }
  86625. val_offset = next_val_offset;
  86626. 80231ee: 8afb ldrh r3, [r7, #22]
  86627. 80231f0: 847b strh r3, [r7, #34] @ 0x22
  86628. decode_idx++;
  86629. 80231f2: 6a7b ldr r3, [r7, #36] @ 0x24
  86630. 80231f4: 3301 adds r3, #1
  86631. 80231f6: 627b str r3, [r7, #36] @ 0x24
  86632. goto decode_next;
  86633. 80231f8: e79e b.n 8023138 <dhcp_parse_reply+0x3ac>
  86634. } else if (decode_len == 4) {
  86635. 80231fa: f897 302a ldrb.w r3, [r7, #42] @ 0x2a
  86636. 80231fe: 2b04 cmp r3, #4
  86637. 8023200: d106 bne.n 8023210 <dhcp_parse_reply+0x484>
  86638. value = lwip_ntohl(value);
  86639. 8023202: 68fb ldr r3, [r7, #12]
  86640. 8023204: 4618 mov r0, r3
  86641. 8023206: f7f5 fc9c bl 8018b42 <lwip_htonl>
  86642. 802320a: 4603 mov r3, r0
  86643. 802320c: 60fb str r3, [r7, #12]
  86644. 802320e: e011 b.n 8023234 <dhcp_parse_reply+0x4a8>
  86645. } else {
  86646. LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;);
  86647. 8023210: f897 302a ldrb.w r3, [r7, #42] @ 0x2a
  86648. 8023214: 2b01 cmp r3, #1
  86649. 8023216: d009 beq.n 802322c <dhcp_parse_reply+0x4a0>
  86650. 8023218: 4b45 ldr r3, [pc, #276] @ (8023330 <dhcp_parse_reply+0x5a4>)
  86651. 802321a: f44f 62d2 mov.w r2, #1680 @ 0x690
  86652. 802321e: 494b ldr r1, [pc, #300] @ (802334c <dhcp_parse_reply+0x5c0>)
  86653. 8023220: 4845 ldr r0, [pc, #276] @ (8023338 <dhcp_parse_reply+0x5ac>)
  86654. 8023222: f006 fbd3 bl 80299cc <iprintf>
  86655. 8023226: f06f 0305 mvn.w r3, #5
  86656. 802322a: e07d b.n 8023328 <dhcp_parse_reply+0x59c>
  86657. value = ((u8_t *)&value)[0];
  86658. 802322c: f107 030c add.w r3, r7, #12
  86659. 8023230: 781b ldrb r3, [r3, #0]
  86660. 8023232: 60fb str r3, [r7, #12]
  86661. }
  86662. dhcp_got_option(dhcp, decode_idx);
  86663. 8023234: 4a42 ldr r2, [pc, #264] @ (8023340 <dhcp_parse_reply+0x5b4>)
  86664. 8023236: 6a7b ldr r3, [r7, #36] @ 0x24
  86665. 8023238: 4413 add r3, r2
  86666. 802323a: 2201 movs r2, #1
  86667. 802323c: 701a strb r2, [r3, #0]
  86668. dhcp_set_option_value(dhcp, decode_idx, value);
  86669. 802323e: 68fa ldr r2, [r7, #12]
  86670. 8023240: 4941 ldr r1, [pc, #260] @ (8023348 <dhcp_parse_reply+0x5bc>)
  86671. 8023242: 6a7b ldr r3, [r7, #36] @ 0x24
  86672. 8023244: f841 2023 str.w r2, [r1, r3, lsl #2]
  86673. }
  86674. }
  86675. }
  86676. if (offset >= q->len) {
  86677. 8023248: 6b7b ldr r3, [r7, #52] @ 0x34
  86678. 802324a: 895b ldrh r3, [r3, #10]
  86679. 802324c: f8b7 2046 ldrh.w r2, [r7, #70] @ 0x46
  86680. 8023250: 429a cmp r2, r3
  86681. 8023252: d327 bcc.n 80232a4 <dhcp_parse_reply+0x518>
  86682. offset = (u16_t)(offset - q->len);
  86683. 8023254: 6b7b ldr r3, [r7, #52] @ 0x34
  86684. 8023256: 895b ldrh r3, [r3, #10]
  86685. 8023258: f8b7 2046 ldrh.w r2, [r7, #70] @ 0x46
  86686. 802325c: 1ad3 subs r3, r2, r3
  86687. 802325e: f8a7 3046 strh.w r3, [r7, #70] @ 0x46
  86688. offset_max = (u16_t)(offset_max - q->len);
  86689. 8023262: 6b7b ldr r3, [r7, #52] @ 0x34
  86690. 8023264: 895b ldrh r3, [r3, #10]
  86691. 8023266: 8ffa ldrh r2, [r7, #62] @ 0x3e
  86692. 8023268: 1ad3 subs r3, r2, r3
  86693. 802326a: 87fb strh r3, [r7, #62] @ 0x3e
  86694. if (offset < offset_max) {
  86695. 802326c: f8b7 2046 ldrh.w r2, [r7, #70] @ 0x46
  86696. 8023270: 8ffb ldrh r3, [r7, #62] @ 0x3e
  86697. 8023272: 429a cmp r2, r3
  86698. 8023274: d213 bcs.n 802329e <dhcp_parse_reply+0x512>
  86699. q = q->next;
  86700. 8023276: 6b7b ldr r3, [r7, #52] @ 0x34
  86701. 8023278: 681b ldr r3, [r3, #0]
  86702. 802327a: 637b str r3, [r7, #52] @ 0x34
  86703. LWIP_ERROR("next pbuf was null", q != NULL, return ERR_VAL;);
  86704. 802327c: 6b7b ldr r3, [r7, #52] @ 0x34
  86705. 802327e: 2b00 cmp r3, #0
  86706. 8023280: d109 bne.n 8023296 <dhcp_parse_reply+0x50a>
  86707. 8023282: 4b2b ldr r3, [pc, #172] @ (8023330 <dhcp_parse_reply+0x5a4>)
  86708. 8023284: f240 629d movw r2, #1693 @ 0x69d
  86709. 8023288: 4931 ldr r1, [pc, #196] @ (8023350 <dhcp_parse_reply+0x5c4>)
  86710. 802328a: 482b ldr r0, [pc, #172] @ (8023338 <dhcp_parse_reply+0x5ac>)
  86711. 802328c: f006 fb9e bl 80299cc <iprintf>
  86712. 8023290: f06f 0305 mvn.w r3, #5
  86713. 8023294: e048 b.n 8023328 <dhcp_parse_reply+0x59c>
  86714. options = (u8_t *)q->payload;
  86715. 8023296: 6b7b ldr r3, [r7, #52] @ 0x34
  86716. 8023298: 685b ldr r3, [r3, #4]
  86717. 802329a: 643b str r3, [r7, #64] @ 0x40
  86718. 802329c: e002 b.n 80232a4 <dhcp_parse_reply+0x518>
  86719. } else {
  86720. /* We've run out of bytes, probably no end marker. Don't proceed. */
  86721. return ERR_BUF;
  86722. 802329e: f06f 0301 mvn.w r3, #1
  86723. 80232a2: e041 b.n 8023328 <dhcp_parse_reply+0x59c>
  86724. while ((q != NULL) && (offset < offset_max) && (options[offset] != DHCP_OPTION_END)) {
  86725. 80232a4: 6b7b ldr r3, [r7, #52] @ 0x34
  86726. 80232a6: 2b00 cmp r3, #0
  86727. 80232a8: d00c beq.n 80232c4 <dhcp_parse_reply+0x538>
  86728. 80232aa: f8b7 2046 ldrh.w r2, [r7, #70] @ 0x46
  86729. 80232ae: 8ffb ldrh r3, [r7, #62] @ 0x3e
  86730. 80232b0: 429a cmp r2, r3
  86731. 80232b2: d207 bcs.n 80232c4 <dhcp_parse_reply+0x538>
  86732. 80232b4: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  86733. 80232b8: 6c3a ldr r2, [r7, #64] @ 0x40
  86734. 80232ba: 4413 add r3, r2
  86735. 80232bc: 781b ldrb r3, [r3, #0]
  86736. 80232be: 2bff cmp r3, #255 @ 0xff
  86737. 80232c0: f47f ada8 bne.w 8022e14 <dhcp_parse_reply+0x88>
  86738. }
  86739. }
  86740. }
  86741. /* is this an overloaded message? */
  86742. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  86743. 80232c4: 4b1e ldr r3, [pc, #120] @ (8023340 <dhcp_parse_reply+0x5b4>)
  86744. 80232c6: 781b ldrb r3, [r3, #0]
  86745. 80232c8: 2b00 cmp r3, #0
  86746. 80232ca: d018 beq.n 80232fe <dhcp_parse_reply+0x572>
  86747. u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  86748. 80232cc: 4b1e ldr r3, [pc, #120] @ (8023348 <dhcp_parse_reply+0x5bc>)
  86749. 80232ce: 681b ldr r3, [r3, #0]
  86750. 80232d0: 613b str r3, [r7, #16]
  86751. dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  86752. 80232d2: 4b1b ldr r3, [pc, #108] @ (8023340 <dhcp_parse_reply+0x5b4>)
  86753. 80232d4: 2200 movs r2, #0
  86754. 80232d6: 701a strb r2, [r3, #0]
  86755. if (overload == DHCP_OVERLOAD_FILE) {
  86756. 80232d8: 693b ldr r3, [r7, #16]
  86757. 80232da: 2b01 cmp r3, #1
  86758. 80232dc: d102 bne.n 80232e4 <dhcp_parse_reply+0x558>
  86759. parse_file_as_options = 1;
  86760. 80232de: 2301 movs r3, #1
  86761. 80232e0: 633b str r3, [r7, #48] @ 0x30
  86762. 80232e2: e00c b.n 80232fe <dhcp_parse_reply+0x572>
  86763. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n"));
  86764. } else if (overload == DHCP_OVERLOAD_SNAME) {
  86765. 80232e4: 693b ldr r3, [r7, #16]
  86766. 80232e6: 2b02 cmp r3, #2
  86767. 80232e8: d102 bne.n 80232f0 <dhcp_parse_reply+0x564>
  86768. parse_sname_as_options = 1;
  86769. 80232ea: 2301 movs r3, #1
  86770. 80232ec: 62fb str r3, [r7, #44] @ 0x2c
  86771. 80232ee: e006 b.n 80232fe <dhcp_parse_reply+0x572>
  86772. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n"));
  86773. } else if (overload == DHCP_OVERLOAD_SNAME_FILE) {
  86774. 80232f0: 693b ldr r3, [r7, #16]
  86775. 80232f2: 2b03 cmp r3, #3
  86776. 80232f4: d103 bne.n 80232fe <dhcp_parse_reply+0x572>
  86777. parse_sname_as_options = 1;
  86778. 80232f6: 2301 movs r3, #1
  86779. 80232f8: 62fb str r3, [r7, #44] @ 0x2c
  86780. parse_file_as_options = 1;
  86781. 80232fa: 2301 movs r3, #1
  86782. 80232fc: 633b str r3, [r7, #48] @ 0x30
  86783. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname and file field\n"));
  86784. } else {
  86785. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("invalid overload option: %d\n", (int)overload));
  86786. }
  86787. }
  86788. if (parse_file_as_options) {
  86789. 80232fe: 6b3b ldr r3, [r7, #48] @ 0x30
  86790. 8023300: 2b00 cmp r3, #0
  86791. 8023302: d006 beq.n 8023312 <dhcp_parse_reply+0x586>
  86792. /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
  86793. parse_file_as_options = 0;
  86794. 8023304: 2300 movs r3, #0
  86795. 8023306: 633b str r3, [r7, #48] @ 0x30
  86796. options_idx = DHCP_FILE_OFS;
  86797. 8023308: 236c movs r3, #108 @ 0x6c
  86798. 802330a: 87bb strh r3, [r7, #60] @ 0x3c
  86799. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  86800. 802330c: 23ec movs r3, #236 @ 0xec
  86801. 802330e: 877b strh r3, [r7, #58] @ 0x3a
  86802. #if LWIP_DHCP_BOOTP_FILE
  86803. file_overloaded = 1;
  86804. #endif
  86805. goto again;
  86806. 8023310: e559 b.n 8022dc6 <dhcp_parse_reply+0x3a>
  86807. } else if (parse_sname_as_options) {
  86808. 8023312: 6afb ldr r3, [r7, #44] @ 0x2c
  86809. 8023314: 2b00 cmp r3, #0
  86810. 8023316: d006 beq.n 8023326 <dhcp_parse_reply+0x59a>
  86811. parse_sname_as_options = 0;
  86812. 8023318: 2300 movs r3, #0
  86813. 802331a: 62fb str r3, [r7, #44] @ 0x2c
  86814. options_idx = DHCP_SNAME_OFS;
  86815. 802331c: 232c movs r3, #44 @ 0x2c
  86816. 802331e: 87bb strh r3, [r7, #60] @ 0x3c
  86817. options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN;
  86818. 8023320: 236c movs r3, #108 @ 0x6c
  86819. 8023322: 877b strh r3, [r7, #58] @ 0x3a
  86820. goto again;
  86821. 8023324: e54f b.n 8022dc6 <dhcp_parse_reply+0x3a>
  86822. }
  86823. /* make sure the string is really NULL-terminated */
  86824. dhcp->boot_file_name[DHCP_FILE_LEN-1] = 0;
  86825. }
  86826. #endif /* LWIP_DHCP_BOOTP_FILE */
  86827. return ERR_OK;
  86828. 8023326: 2300 movs r3, #0
  86829. }
  86830. 8023328: 4618 mov r0, r3
  86831. 802332a: 3748 adds r7, #72 @ 0x48
  86832. 802332c: 46bd mov sp, r7
  86833. 802332e: bd80 pop {r7, pc}
  86834. 8023330: 0802fe54 .word 0x0802fe54
  86835. 8023334: 080300dc .word 0x080300dc
  86836. 8023338: 0802feb4 .word 0x0802feb4
  86837. 802333c: 08030120 .word 0x08030120
  86838. 8023340: 2402af0c .word 0x2402af0c
  86839. 8023344: 08030134 .word 0x08030134
  86840. 8023348: 2402aeec .word 0x2402aeec
  86841. 802334c: 0803014c .word 0x0803014c
  86842. 8023350: 08030160 .word 0x08030160
  86843. 08023354 <dhcp_recv>:
  86844. /**
  86845. * If an incoming DHCP message is in response to us, then trigger the state machine
  86846. */
  86847. static void
  86848. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
  86849. {
  86850. 8023354: b580 push {r7, lr}
  86851. 8023356: b08a sub sp, #40 @ 0x28
  86852. 8023358: af00 add r7, sp, #0
  86853. 802335a: 60f8 str r0, [r7, #12]
  86854. 802335c: 60b9 str r1, [r7, #8]
  86855. 802335e: 607a str r2, [r7, #4]
  86856. 8023360: 603b str r3, [r7, #0]
  86857. struct netif *netif = ip_current_input_netif();
  86858. 8023362: 4b5e ldr r3, [pc, #376] @ (80234dc <dhcp_recv+0x188>)
  86859. 8023364: 685b ldr r3, [r3, #4]
  86860. 8023366: 61fb str r3, [r7, #28]
  86861. struct dhcp *dhcp = netif_dhcp_data(netif);
  86862. 8023368: 69fb ldr r3, [r7, #28]
  86863. 802336a: 6a5b ldr r3, [r3, #36] @ 0x24
  86864. 802336c: 61bb str r3, [r7, #24]
  86865. struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload;
  86866. 802336e: 687b ldr r3, [r7, #4]
  86867. 8023370: 685b ldr r3, [r3, #4]
  86868. 8023372: 617b str r3, [r7, #20]
  86869. struct dhcp_msg *msg_in;
  86870. LWIP_UNUSED_ARG(arg);
  86871. /* Caught DHCP message from netif that does not have DHCP enabled? -> not interested */
  86872. if ((dhcp == NULL) || (dhcp->pcb_allocated == 0)) {
  86873. 8023374: 69bb ldr r3, [r7, #24]
  86874. 8023376: 2b00 cmp r3, #0
  86875. 8023378: f000 809a beq.w 80234b0 <dhcp_recv+0x15c>
  86876. 802337c: 69bb ldr r3, [r7, #24]
  86877. 802337e: 791b ldrb r3, [r3, #4]
  86878. 8023380: 2b00 cmp r3, #0
  86879. 8023382: f000 8095 beq.w 80234b0 <dhcp_recv+0x15c>
  86880. /* prevent warnings about unused arguments */
  86881. LWIP_UNUSED_ARG(pcb);
  86882. LWIP_UNUSED_ARG(addr);
  86883. LWIP_UNUSED_ARG(port);
  86884. if (p->len < DHCP_MIN_REPLY_LEN) {
  86885. 8023386: 687b ldr r3, [r7, #4]
  86886. 8023388: 895b ldrh r3, [r3, #10]
  86887. 802338a: 2b2b cmp r3, #43 @ 0x2b
  86888. 802338c: f240 8092 bls.w 80234b4 <dhcp_recv+0x160>
  86889. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP reply message or pbuf too short\n"));
  86890. goto free_pbuf_and_return;
  86891. }
  86892. if (reply_msg->op != DHCP_BOOTREPLY) {
  86893. 8023390: 697b ldr r3, [r7, #20]
  86894. 8023392: 781b ldrb r3, [r3, #0]
  86895. 8023394: 2b02 cmp r3, #2
  86896. 8023396: f040 808f bne.w 80234b8 <dhcp_recv+0x164>
  86897. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("not a DHCP reply message, but type %"U16_F"\n", (u16_t)reply_msg->op));
  86898. goto free_pbuf_and_return;
  86899. }
  86900. /* iterate through hardware address and match against DHCP message */
  86901. for (i = 0; i < netif->hwaddr_len && i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) {
  86902. 802339a: 2300 movs r3, #0
  86903. 802339c: 74fb strb r3, [r7, #19]
  86904. 802339e: e00e b.n 80233be <dhcp_recv+0x6a>
  86905. if (netif->hwaddr[i] != reply_msg->chaddr[i]) {
  86906. 80233a0: 7cfb ldrb r3, [r7, #19]
  86907. 80233a2: 69fa ldr r2, [r7, #28]
  86908. 80233a4: 4413 add r3, r2
  86909. 80233a6: f893 202a ldrb.w r2, [r3, #42] @ 0x2a
  86910. 80233aa: 7cfb ldrb r3, [r7, #19]
  86911. 80233ac: 6979 ldr r1, [r7, #20]
  86912. 80233ae: 440b add r3, r1
  86913. 80233b0: 7f1b ldrb r3, [r3, #28]
  86914. 80233b2: 429a cmp r2, r3
  86915. 80233b4: f040 8082 bne.w 80234bc <dhcp_recv+0x168>
  86916. for (i = 0; i < netif->hwaddr_len && i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) {
  86917. 80233b8: 7cfb ldrb r3, [r7, #19]
  86918. 80233ba: 3301 adds r3, #1
  86919. 80233bc: 74fb strb r3, [r7, #19]
  86920. 80233be: 69fb ldr r3, [r7, #28]
  86921. 80233c0: f893 3030 ldrb.w r3, [r3, #48] @ 0x30
  86922. 80233c4: 7cfa ldrb r2, [r7, #19]
  86923. 80233c6: 429a cmp r2, r3
  86924. 80233c8: d202 bcs.n 80233d0 <dhcp_recv+0x7c>
  86925. 80233ca: 7cfb ldrb r3, [r7, #19]
  86926. 80233cc: 2b05 cmp r3, #5
  86927. 80233ce: d9e7 bls.n 80233a0 <dhcp_recv+0x4c>
  86928. (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i]));
  86929. goto free_pbuf_and_return;
  86930. }
  86931. }
  86932. /* match transaction ID against what we expected */
  86933. if (lwip_ntohl(reply_msg->xid) != dhcp->xid) {
  86934. 80233d0: 697b ldr r3, [r7, #20]
  86935. 80233d2: 685b ldr r3, [r3, #4]
  86936. 80233d4: 4618 mov r0, r3
  86937. 80233d6: f7f5 fbb4 bl 8018b42 <lwip_htonl>
  86938. 80233da: 4602 mov r2, r0
  86939. 80233dc: 69bb ldr r3, [r7, #24]
  86940. 80233de: 681b ldr r3, [r3, #0]
  86941. 80233e0: 429a cmp r2, r3
  86942. 80233e2: d16d bne.n 80234c0 <dhcp_recv+0x16c>
  86943. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
  86944. ("transaction id mismatch reply_msg->xid(%"X32_F")!=dhcp->xid(%"X32_F")\n", lwip_ntohl(reply_msg->xid), dhcp->xid));
  86945. goto free_pbuf_and_return;
  86946. }
  86947. /* option fields could be unfold? */
  86948. if (dhcp_parse_reply(p, dhcp) != ERR_OK) {
  86949. 80233e4: 69b9 ldr r1, [r7, #24]
  86950. 80233e6: 6878 ldr r0, [r7, #4]
  86951. 80233e8: f7ff fcd0 bl 8022d8c <dhcp_parse_reply>
  86952. 80233ec: 4603 mov r3, r0
  86953. 80233ee: 2b00 cmp r3, #0
  86954. 80233f0: d168 bne.n 80234c4 <dhcp_recv+0x170>
  86955. goto free_pbuf_and_return;
  86956. }
  86957. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("searching DHCP_OPTION_MESSAGE_TYPE\n"));
  86958. /* obtain pointer to DHCP message type */
  86959. if (!dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE)) {
  86960. 80233f2: 4b3b ldr r3, [pc, #236] @ (80234e0 <dhcp_recv+0x18c>)
  86961. 80233f4: 785b ldrb r3, [r3, #1]
  86962. 80233f6: 2b00 cmp r3, #0
  86963. 80233f8: d066 beq.n 80234c8 <dhcp_recv+0x174>
  86964. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP_OPTION_MESSAGE_TYPE option not found\n"));
  86965. goto free_pbuf_and_return;
  86966. }
  86967. msg_in = (struct dhcp_msg *)p->payload;
  86968. 80233fa: 687b ldr r3, [r7, #4]
  86969. 80233fc: 685b ldr r3, [r3, #4]
  86970. 80233fe: 627b str r3, [r7, #36] @ 0x24
  86971. /* read DHCP message type */
  86972. msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE);
  86973. 8023400: 4b38 ldr r3, [pc, #224] @ (80234e4 <dhcp_recv+0x190>)
  86974. 8023402: 685b ldr r3, [r3, #4]
  86975. 8023404: f887 3023 strb.w r3, [r7, #35] @ 0x23
  86976. /* message type is DHCP ACK? */
  86977. if (msg_type == DHCP_ACK) {
  86978. 8023408: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  86979. 802340c: 2b05 cmp r3, #5
  86980. 802340e: d12a bne.n 8023466 <dhcp_recv+0x112>
  86981. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n"));
  86982. /* in requesting state? */
  86983. if (dhcp->state == DHCP_STATE_REQUESTING) {
  86984. 8023410: 69bb ldr r3, [r7, #24]
  86985. 8023412: 795b ldrb r3, [r3, #5]
  86986. 8023414: 2b01 cmp r3, #1
  86987. 8023416: d112 bne.n 802343e <dhcp_recv+0xea>
  86988. dhcp_handle_ack(netif, msg_in);
  86989. 8023418: 6a79 ldr r1, [r7, #36] @ 0x24
  86990. 802341a: 69f8 ldr r0, [r7, #28]
  86991. 802341c: f7fe fe00 bl 8022020 <dhcp_handle_ack>
  86992. #if DHCP_DOES_ARP_CHECK
  86993. if ((netif->flags & NETIF_FLAG_ETHARP) != 0) {
  86994. 8023420: 69fb ldr r3, [r7, #28]
  86995. 8023422: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  86996. 8023426: f003 0308 and.w r3, r3, #8
  86997. 802342a: 2b00 cmp r3, #0
  86998. 802342c: d003 beq.n 8023436 <dhcp_recv+0xe2>
  86999. /* check if the acknowledged lease address is already in use */
  87000. dhcp_check(netif);
  87001. 802342e: 69f8 ldr r0, [r7, #28]
  87002. 8023430: f7fe fb6e bl 8021b10 <dhcp_check>
  87003. 8023434: e04b b.n 80234ce <dhcp_recv+0x17a>
  87004. } else {
  87005. /* bind interface to the acknowledged lease address */
  87006. dhcp_bind(netif);
  87007. 8023436: 69f8 ldr r0, [r7, #28]
  87008. 8023438: f7ff f852 bl 80224e0 <dhcp_bind>
  87009. 802343c: e047 b.n 80234ce <dhcp_recv+0x17a>
  87010. /* bind interface to the acknowledged lease address */
  87011. dhcp_bind(netif);
  87012. #endif
  87013. }
  87014. /* already bound to the given lease address? */
  87015. else if ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REBINDING) ||
  87016. 802343e: 69bb ldr r3, [r7, #24]
  87017. 8023440: 795b ldrb r3, [r3, #5]
  87018. 8023442: 2b03 cmp r3, #3
  87019. 8023444: d007 beq.n 8023456 <dhcp_recv+0x102>
  87020. 8023446: 69bb ldr r3, [r7, #24]
  87021. 8023448: 795b ldrb r3, [r3, #5]
  87022. 802344a: 2b04 cmp r3, #4
  87023. 802344c: d003 beq.n 8023456 <dhcp_recv+0x102>
  87024. (dhcp->state == DHCP_STATE_RENEWING)) {
  87025. 802344e: 69bb ldr r3, [r7, #24]
  87026. 8023450: 795b ldrb r3, [r3, #5]
  87027. else if ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REBINDING) ||
  87028. 8023452: 2b05 cmp r3, #5
  87029. 8023454: d13b bne.n 80234ce <dhcp_recv+0x17a>
  87030. dhcp_handle_ack(netif, msg_in);
  87031. 8023456: 6a79 ldr r1, [r7, #36] @ 0x24
  87032. 8023458: 69f8 ldr r0, [r7, #28]
  87033. 802345a: f7fe fde1 bl 8022020 <dhcp_handle_ack>
  87034. dhcp_bind(netif);
  87035. 802345e: 69f8 ldr r0, [r7, #28]
  87036. 8023460: f7ff f83e bl 80224e0 <dhcp_bind>
  87037. 8023464: e033 b.n 80234ce <dhcp_recv+0x17a>
  87038. }
  87039. }
  87040. /* received a DHCP_NAK in appropriate state? */
  87041. else if ((msg_type == DHCP_NAK) &&
  87042. 8023466: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  87043. 802346a: 2b06 cmp r3, #6
  87044. 802346c: d113 bne.n 8023496 <dhcp_recv+0x142>
  87045. ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) ||
  87046. 802346e: 69bb ldr r3, [r7, #24]
  87047. 8023470: 795b ldrb r3, [r3, #5]
  87048. else if ((msg_type == DHCP_NAK) &&
  87049. 8023472: 2b03 cmp r3, #3
  87050. 8023474: d00b beq.n 802348e <dhcp_recv+0x13a>
  87051. ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) ||
  87052. 8023476: 69bb ldr r3, [r7, #24]
  87053. 8023478: 795b ldrb r3, [r3, #5]
  87054. 802347a: 2b01 cmp r3, #1
  87055. 802347c: d007 beq.n 802348e <dhcp_recv+0x13a>
  87056. (dhcp->state == DHCP_STATE_REBINDING) || (dhcp->state == DHCP_STATE_RENEWING ))) {
  87057. 802347e: 69bb ldr r3, [r7, #24]
  87058. 8023480: 795b ldrb r3, [r3, #5]
  87059. ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) ||
  87060. 8023482: 2b04 cmp r3, #4
  87061. 8023484: d003 beq.n 802348e <dhcp_recv+0x13a>
  87062. (dhcp->state == DHCP_STATE_REBINDING) || (dhcp->state == DHCP_STATE_RENEWING ))) {
  87063. 8023486: 69bb ldr r3, [r7, #24]
  87064. 8023488: 795b ldrb r3, [r3, #5]
  87065. 802348a: 2b05 cmp r3, #5
  87066. 802348c: d103 bne.n 8023496 <dhcp_recv+0x142>
  87067. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_NAK received\n"));
  87068. dhcp_handle_nak(netif);
  87069. 802348e: 69f8 ldr r0, [r7, #28]
  87070. 8023490: f7fe fb24 bl 8021adc <dhcp_handle_nak>
  87071. 8023494: e01b b.n 80234ce <dhcp_recv+0x17a>
  87072. }
  87073. /* received a DHCP_OFFER in DHCP_STATE_SELECTING state? */
  87074. else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_STATE_SELECTING)) {
  87075. 8023496: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  87076. 802349a: 2b02 cmp r3, #2
  87077. 802349c: d116 bne.n 80234cc <dhcp_recv+0x178>
  87078. 802349e: 69bb ldr r3, [r7, #24]
  87079. 80234a0: 795b ldrb r3, [r3, #5]
  87080. 80234a2: 2b06 cmp r3, #6
  87081. 80234a4: d112 bne.n 80234cc <dhcp_recv+0x178>
  87082. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_OFFER received in DHCP_STATE_SELECTING state\n"));
  87083. /* remember offered lease */
  87084. dhcp_handle_offer(netif, msg_in);
  87085. 80234a6: 6a79 ldr r1, [r7, #36] @ 0x24
  87086. 80234a8: 69f8 ldr r0, [r7, #28]
  87087. 80234aa: f7fe fb65 bl 8021b78 <dhcp_handle_offer>
  87088. 80234ae: e00e b.n 80234ce <dhcp_recv+0x17a>
  87089. goto free_pbuf_and_return;
  87090. 80234b0: bf00 nop
  87091. 80234b2: e00c b.n 80234ce <dhcp_recv+0x17a>
  87092. goto free_pbuf_and_return;
  87093. 80234b4: bf00 nop
  87094. 80234b6: e00a b.n 80234ce <dhcp_recv+0x17a>
  87095. goto free_pbuf_and_return;
  87096. 80234b8: bf00 nop
  87097. 80234ba: e008 b.n 80234ce <dhcp_recv+0x17a>
  87098. goto free_pbuf_and_return;
  87099. 80234bc: bf00 nop
  87100. 80234be: e006 b.n 80234ce <dhcp_recv+0x17a>
  87101. goto free_pbuf_and_return;
  87102. 80234c0: bf00 nop
  87103. 80234c2: e004 b.n 80234ce <dhcp_recv+0x17a>
  87104. goto free_pbuf_and_return;
  87105. 80234c4: bf00 nop
  87106. 80234c6: e002 b.n 80234ce <dhcp_recv+0x17a>
  87107. goto free_pbuf_and_return;
  87108. 80234c8: bf00 nop
  87109. 80234ca: e000 b.n 80234ce <dhcp_recv+0x17a>
  87110. }
  87111. free_pbuf_and_return:
  87112. 80234cc: bf00 nop
  87113. pbuf_free(p);
  87114. 80234ce: 6878 ldr r0, [r7, #4]
  87115. 80234d0: f7f7 f804 bl 801a4dc <pbuf_free>
  87116. }
  87117. 80234d4: bf00 nop
  87118. 80234d6: 3728 adds r7, #40 @ 0x28
  87119. 80234d8: 46bd mov sp, r7
  87120. 80234da: bd80 pop {r7, pc}
  87121. 80234dc: 24024338 .word 0x24024338
  87122. 80234e0: 2402af0c .word 0x2402af0c
  87123. 80234e4: 2402aeec .word 0x2402aeec
  87124. 080234e8 <dhcp_create_msg>:
  87125. * @param dhcp dhcp control struct
  87126. * @param message_type message type of the request
  87127. */
  87128. static struct pbuf *
  87129. dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type, u16_t *options_out_len)
  87130. {
  87131. 80234e8: b580 push {r7, lr}
  87132. 80234ea: b088 sub sp, #32
  87133. 80234ec: af00 add r7, sp, #0
  87134. 80234ee: 60f8 str r0, [r7, #12]
  87135. 80234f0: 60b9 str r1, [r7, #8]
  87136. 80234f2: 603b str r3, [r7, #0]
  87137. 80234f4: 4613 mov r3, r2
  87138. 80234f6: 71fb strb r3, [r7, #7]
  87139. if (!xid_initialised) {
  87140. xid = DHCP_GLOBAL_XID;
  87141. xid_initialised = !xid_initialised;
  87142. }
  87143. #endif
  87144. LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return NULL;);
  87145. 80234f8: 68fb ldr r3, [r7, #12]
  87146. 80234fa: 2b00 cmp r3, #0
  87147. 80234fc: d108 bne.n 8023510 <dhcp_create_msg+0x28>
  87148. 80234fe: 4b5f ldr r3, [pc, #380] @ (802367c <dhcp_create_msg+0x194>)
  87149. 8023500: f240 7269 movw r2, #1897 @ 0x769
  87150. 8023504: 495e ldr r1, [pc, #376] @ (8023680 <dhcp_create_msg+0x198>)
  87151. 8023506: 485f ldr r0, [pc, #380] @ (8023684 <dhcp_create_msg+0x19c>)
  87152. 8023508: f006 fa60 bl 80299cc <iprintf>
  87153. 802350c: 2300 movs r3, #0
  87154. 802350e: e0b1 b.n 8023674 <dhcp_create_msg+0x18c>
  87155. LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return NULL;);
  87156. 8023510: 68bb ldr r3, [r7, #8]
  87157. 8023512: 2b00 cmp r3, #0
  87158. 8023514: d108 bne.n 8023528 <dhcp_create_msg+0x40>
  87159. 8023516: 4b59 ldr r3, [pc, #356] @ (802367c <dhcp_create_msg+0x194>)
  87160. 8023518: f240 726a movw r2, #1898 @ 0x76a
  87161. 802351c: 495a ldr r1, [pc, #360] @ (8023688 <dhcp_create_msg+0x1a0>)
  87162. 802351e: 4859 ldr r0, [pc, #356] @ (8023684 <dhcp_create_msg+0x19c>)
  87163. 8023520: f006 fa54 bl 80299cc <iprintf>
  87164. 8023524: 2300 movs r3, #0
  87165. 8023526: e0a5 b.n 8023674 <dhcp_create_msg+0x18c>
  87166. p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);
  87167. 8023528: f44f 7220 mov.w r2, #640 @ 0x280
  87168. 802352c: f44f 719a mov.w r1, #308 @ 0x134
  87169. 8023530: 2036 movs r0, #54 @ 0x36
  87170. 8023532: f7f6 fcbd bl 8019eb0 <pbuf_alloc>
  87171. 8023536: 61b8 str r0, [r7, #24]
  87172. if (p_out == NULL) {
  87173. 8023538: 69bb ldr r3, [r7, #24]
  87174. 802353a: 2b00 cmp r3, #0
  87175. 802353c: d101 bne.n 8023542 <dhcp_create_msg+0x5a>
  87176. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  87177. ("dhcp_create_msg(): could not allocate pbuf\n"));
  87178. return NULL;
  87179. 802353e: 2300 movs r3, #0
  87180. 8023540: e098 b.n 8023674 <dhcp_create_msg+0x18c>
  87181. }
  87182. LWIP_ASSERT("dhcp_create_msg: check that first pbuf can hold struct dhcp_msg",
  87183. 8023542: 69bb ldr r3, [r7, #24]
  87184. 8023544: 895b ldrh r3, [r3, #10]
  87185. 8023546: f5b3 7f9a cmp.w r3, #308 @ 0x134
  87186. 802354a: d206 bcs.n 802355a <dhcp_create_msg+0x72>
  87187. 802354c: 4b4b ldr r3, [pc, #300] @ (802367c <dhcp_create_msg+0x194>)
  87188. 802354e: f240 7271 movw r2, #1905 @ 0x771
  87189. 8023552: 494e ldr r1, [pc, #312] @ (802368c <dhcp_create_msg+0x1a4>)
  87190. 8023554: 484b ldr r0, [pc, #300] @ (8023684 <dhcp_create_msg+0x19c>)
  87191. 8023556: f006 fa39 bl 80299cc <iprintf>
  87192. (p_out->len >= sizeof(struct dhcp_msg)));
  87193. /* DHCP_REQUEST should reuse 'xid' from DHCPOFFER */
  87194. if ((message_type != DHCP_REQUEST) || (dhcp->state == DHCP_STATE_REBOOTING)) {
  87195. 802355a: 79fb ldrb r3, [r7, #7]
  87196. 802355c: 2b03 cmp r3, #3
  87197. 802355e: d103 bne.n 8023568 <dhcp_create_msg+0x80>
  87198. 8023560: 68bb ldr r3, [r7, #8]
  87199. 8023562: 795b ldrb r3, [r3, #5]
  87200. 8023564: 2b03 cmp r3, #3
  87201. 8023566: d10d bne.n 8023584 <dhcp_create_msg+0x9c>
  87202. /* reuse transaction identifier in retransmissions */
  87203. if (dhcp->tries == 0) {
  87204. 8023568: 68bb ldr r3, [r7, #8]
  87205. 802356a: 799b ldrb r3, [r3, #6]
  87206. 802356c: 2b00 cmp r3, #0
  87207. 802356e: d105 bne.n 802357c <dhcp_create_msg+0x94>
  87208. #if DHCP_CREATE_RAND_XID && defined(LWIP_RAND)
  87209. xid = LWIP_RAND();
  87210. 8023570: f004 ff02 bl 8028378 <rand>
  87211. 8023574: 4603 mov r3, r0
  87212. 8023576: 461a mov r2, r3
  87213. 8023578: 4b45 ldr r3, [pc, #276] @ (8023690 <dhcp_create_msg+0x1a8>)
  87214. 802357a: 601a str r2, [r3, #0]
  87215. #else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  87216. xid++;
  87217. #endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  87218. }
  87219. dhcp->xid = xid;
  87220. 802357c: 4b44 ldr r3, [pc, #272] @ (8023690 <dhcp_create_msg+0x1a8>)
  87221. 802357e: 681a ldr r2, [r3, #0]
  87222. 8023580: 68bb ldr r3, [r7, #8]
  87223. 8023582: 601a str r2, [r3, #0]
  87224. }
  87225. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
  87226. ("transaction id xid(%"X32_F")\n", xid));
  87227. msg_out = (struct dhcp_msg *)p_out->payload;
  87228. 8023584: 69bb ldr r3, [r7, #24]
  87229. 8023586: 685b ldr r3, [r3, #4]
  87230. 8023588: 617b str r3, [r7, #20]
  87231. memset(msg_out, 0, sizeof(struct dhcp_msg));
  87232. 802358a: f44f 729a mov.w r2, #308 @ 0x134
  87233. 802358e: 2100 movs r1, #0
  87234. 8023590: 6978 ldr r0, [r7, #20]
  87235. 8023592: f006 fbad bl 8029cf0 <memset>
  87236. msg_out->op = DHCP_BOOTREQUEST;
  87237. 8023596: 697b ldr r3, [r7, #20]
  87238. 8023598: 2201 movs r2, #1
  87239. 802359a: 701a strb r2, [r3, #0]
  87240. /* @todo: make link layer independent */
  87241. msg_out->htype = LWIP_IANA_HWTYPE_ETHERNET;
  87242. 802359c: 697b ldr r3, [r7, #20]
  87243. 802359e: 2201 movs r2, #1
  87244. 80235a0: 705a strb r2, [r3, #1]
  87245. msg_out->hlen = netif->hwaddr_len;
  87246. 80235a2: 68fb ldr r3, [r7, #12]
  87247. 80235a4: f893 2030 ldrb.w r2, [r3, #48] @ 0x30
  87248. 80235a8: 697b ldr r3, [r7, #20]
  87249. 80235aa: 709a strb r2, [r3, #2]
  87250. msg_out->xid = lwip_htonl(dhcp->xid);
  87251. 80235ac: 68bb ldr r3, [r7, #8]
  87252. 80235ae: 681b ldr r3, [r3, #0]
  87253. 80235b0: 4618 mov r0, r3
  87254. 80235b2: f7f5 fac6 bl 8018b42 <lwip_htonl>
  87255. 80235b6: 4602 mov r2, r0
  87256. 80235b8: 697b ldr r3, [r7, #20]
  87257. 80235ba: 605a str r2, [r3, #4]
  87258. /* we don't need the broadcast flag since we can receive unicast traffic
  87259. before being fully configured! */
  87260. /* set ciaddr to netif->ip_addr based on message_type and state */
  87261. if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) || (message_type == DHCP_RELEASE) ||
  87262. 80235bc: 79fb ldrb r3, [r7, #7]
  87263. 80235be: 2b08 cmp r3, #8
  87264. 80235c0: d010 beq.n 80235e4 <dhcp_create_msg+0xfc>
  87265. 80235c2: 79fb ldrb r3, [r7, #7]
  87266. 80235c4: 2b04 cmp r3, #4
  87267. 80235c6: d00d beq.n 80235e4 <dhcp_create_msg+0xfc>
  87268. 80235c8: 79fb ldrb r3, [r7, #7]
  87269. 80235ca: 2b07 cmp r3, #7
  87270. 80235cc: d00a beq.n 80235e4 <dhcp_create_msg+0xfc>
  87271. 80235ce: 79fb ldrb r3, [r7, #7]
  87272. 80235d0: 2b03 cmp r3, #3
  87273. 80235d2: d10c bne.n 80235ee <dhcp_create_msg+0x106>
  87274. ((message_type == DHCP_REQUEST) && /* DHCP_STATE_BOUND not used for sending! */
  87275. ((dhcp->state == DHCP_STATE_RENEWING) || dhcp->state == DHCP_STATE_REBINDING))) {
  87276. 80235d4: 68bb ldr r3, [r7, #8]
  87277. 80235d6: 795b ldrb r3, [r3, #5]
  87278. ((message_type == DHCP_REQUEST) && /* DHCP_STATE_BOUND not used for sending! */
  87279. 80235d8: 2b05 cmp r3, #5
  87280. 80235da: d003 beq.n 80235e4 <dhcp_create_msg+0xfc>
  87281. ((dhcp->state == DHCP_STATE_RENEWING) || dhcp->state == DHCP_STATE_REBINDING))) {
  87282. 80235dc: 68bb ldr r3, [r7, #8]
  87283. 80235de: 795b ldrb r3, [r3, #5]
  87284. 80235e0: 2b04 cmp r3, #4
  87285. 80235e2: d104 bne.n 80235ee <dhcp_create_msg+0x106>
  87286. ip4_addr_copy(msg_out->ciaddr, *netif_ip4_addr(netif));
  87287. 80235e4: 68fb ldr r3, [r7, #12]
  87288. 80235e6: 3304 adds r3, #4
  87289. 80235e8: 681a ldr r2, [r3, #0]
  87290. 80235ea: 697b ldr r3, [r7, #20]
  87291. 80235ec: 60da str r2, [r3, #12]
  87292. }
  87293. for (i = 0; i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) {
  87294. 80235ee: 2300 movs r3, #0
  87295. 80235f0: 83fb strh r3, [r7, #30]
  87296. 80235f2: e00c b.n 802360e <dhcp_create_msg+0x126>
  87297. /* copy netif hardware address (padded with zeroes through memset already) */
  87298. msg_out->chaddr[i] = netif->hwaddr[i];
  87299. 80235f4: 8bfa ldrh r2, [r7, #30]
  87300. 80235f6: 8bfb ldrh r3, [r7, #30]
  87301. 80235f8: 68f9 ldr r1, [r7, #12]
  87302. 80235fa: 440a add r2, r1
  87303. 80235fc: f892 102a ldrb.w r1, [r2, #42] @ 0x2a
  87304. 8023600: 697a ldr r2, [r7, #20]
  87305. 8023602: 4413 add r3, r2
  87306. 8023604: 460a mov r2, r1
  87307. 8023606: 771a strb r2, [r3, #28]
  87308. for (i = 0; i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) {
  87309. 8023608: 8bfb ldrh r3, [r7, #30]
  87310. 802360a: 3301 adds r3, #1
  87311. 802360c: 83fb strh r3, [r7, #30]
  87312. 802360e: 8bfb ldrh r3, [r7, #30]
  87313. 8023610: 2b05 cmp r3, #5
  87314. 8023612: d9ef bls.n 80235f4 <dhcp_create_msg+0x10c>
  87315. }
  87316. msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);
  87317. 8023614: 697b ldr r3, [r7, #20]
  87318. 8023616: 2200 movs r2, #0
  87319. 8023618: f042 0263 orr.w r2, r2, #99 @ 0x63
  87320. 802361c: f883 20ec strb.w r2, [r3, #236] @ 0xec
  87321. 8023620: 2200 movs r2, #0
  87322. 8023622: f062 027d orn r2, r2, #125 @ 0x7d
  87323. 8023626: f883 20ed strb.w r2, [r3, #237] @ 0xed
  87324. 802362a: 2200 movs r2, #0
  87325. 802362c: f042 0253 orr.w r2, r2, #83 @ 0x53
  87326. 8023630: f883 20ee strb.w r2, [r3, #238] @ 0xee
  87327. 8023634: 2200 movs r2, #0
  87328. 8023636: f042 0263 orr.w r2, r2, #99 @ 0x63
  87329. 802363a: f883 20ef strb.w r2, [r3, #239] @ 0xef
  87330. /* Add option MESSAGE_TYPE */
  87331. options_out_len_loc = dhcp_option(0, msg_out->options, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
  87332. 802363e: 697b ldr r3, [r7, #20]
  87333. 8023640: f103 01f0 add.w r1, r3, #240 @ 0xf0
  87334. 8023644: 2301 movs r3, #1
  87335. 8023646: 2235 movs r2, #53 @ 0x35
  87336. 8023648: 2000 movs r0, #0
  87337. 802364a: f7ff facf bl 8022bec <dhcp_option>
  87338. 802364e: 4603 mov r3, r0
  87339. 8023650: 827b strh r3, [r7, #18]
  87340. options_out_len_loc = dhcp_option_byte(options_out_len_loc, msg_out->options, message_type);
  87341. 8023652: 697b ldr r3, [r7, #20]
  87342. 8023654: f103 01f0 add.w r1, r3, #240 @ 0xf0
  87343. 8023658: 79fa ldrb r2, [r7, #7]
  87344. 802365a: 8a7b ldrh r3, [r7, #18]
  87345. 802365c: 4618 mov r0, r3
  87346. 802365e: f7ff faf9 bl 8022c54 <dhcp_option_byte>
  87347. 8023662: 4603 mov r3, r0
  87348. 8023664: 827b strh r3, [r7, #18]
  87349. if (options_out_len) {
  87350. 8023666: 683b ldr r3, [r7, #0]
  87351. 8023668: 2b00 cmp r3, #0
  87352. 802366a: d002 beq.n 8023672 <dhcp_create_msg+0x18a>
  87353. *options_out_len = options_out_len_loc;
  87354. 802366c: 683b ldr r3, [r7, #0]
  87355. 802366e: 8a7a ldrh r2, [r7, #18]
  87356. 8023670: 801a strh r2, [r3, #0]
  87357. }
  87358. return p_out;
  87359. 8023672: 69bb ldr r3, [r7, #24]
  87360. }
  87361. 8023674: 4618 mov r0, r3
  87362. 8023676: 3720 adds r7, #32
  87363. 8023678: 46bd mov sp, r7
  87364. 802367a: bd80 pop {r7, pc}
  87365. 802367c: 0802fe54 .word 0x0802fe54
  87366. 8023680: 08030174 .word 0x08030174
  87367. 8023684: 0802feb4 .word 0x0802feb4
  87368. 8023688: 08030194 .word 0x08030194
  87369. 802368c: 080301b4 .word 0x080301b4
  87370. 8023690: 2402af1c .word 0x2402af1c
  87371. 08023694 <dhcp_option_trailer>:
  87372. * Adds the END option to the DHCP message, and if
  87373. * necessary, up to three padding bytes.
  87374. */
  87375. static void
  87376. dhcp_option_trailer(u16_t options_out_len, u8_t *options, struct pbuf *p_out)
  87377. {
  87378. 8023694: b580 push {r7, lr}
  87379. 8023696: b084 sub sp, #16
  87380. 8023698: af00 add r7, sp, #0
  87381. 802369a: 4603 mov r3, r0
  87382. 802369c: 60b9 str r1, [r7, #8]
  87383. 802369e: 607a str r2, [r7, #4]
  87384. 80236a0: 81fb strh r3, [r7, #14]
  87385. options[options_out_len++] = DHCP_OPTION_END;
  87386. 80236a2: 89fb ldrh r3, [r7, #14]
  87387. 80236a4: 1c5a adds r2, r3, #1
  87388. 80236a6: 81fa strh r2, [r7, #14]
  87389. 80236a8: 461a mov r2, r3
  87390. 80236aa: 68bb ldr r3, [r7, #8]
  87391. 80236ac: 4413 add r3, r2
  87392. 80236ae: 22ff movs r2, #255 @ 0xff
  87393. 80236b0: 701a strb r2, [r3, #0]
  87394. /* packet is too small, or not 4 byte aligned? */
  87395. while (((options_out_len < DHCP_MIN_OPTIONS_LEN) || (options_out_len & 3)) &&
  87396. 80236b2: e007 b.n 80236c4 <dhcp_option_trailer+0x30>
  87397. (options_out_len < DHCP_OPTIONS_LEN)) {
  87398. /* add a fill/padding byte */
  87399. options[options_out_len++] = 0;
  87400. 80236b4: 89fb ldrh r3, [r7, #14]
  87401. 80236b6: 1c5a adds r2, r3, #1
  87402. 80236b8: 81fa strh r2, [r7, #14]
  87403. 80236ba: 461a mov r2, r3
  87404. 80236bc: 68bb ldr r3, [r7, #8]
  87405. 80236be: 4413 add r3, r2
  87406. 80236c0: 2200 movs r2, #0
  87407. 80236c2: 701a strb r2, [r3, #0]
  87408. while (((options_out_len < DHCP_MIN_OPTIONS_LEN) || (options_out_len & 3)) &&
  87409. 80236c4: 89fb ldrh r3, [r7, #14]
  87410. 80236c6: 2b43 cmp r3, #67 @ 0x43
  87411. 80236c8: d904 bls.n 80236d4 <dhcp_option_trailer+0x40>
  87412. 80236ca: 89fb ldrh r3, [r7, #14]
  87413. 80236cc: f003 0303 and.w r3, r3, #3
  87414. 80236d0: 2b00 cmp r3, #0
  87415. 80236d2: d002 beq.n 80236da <dhcp_option_trailer+0x46>
  87416. 80236d4: 89fb ldrh r3, [r7, #14]
  87417. 80236d6: 2b43 cmp r3, #67 @ 0x43
  87418. 80236d8: d9ec bls.n 80236b4 <dhcp_option_trailer+0x20>
  87419. }
  87420. /* shrink the pbuf to the actual content length */
  87421. pbuf_realloc(p_out, (u16_t)(sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + options_out_len));
  87422. 80236da: 89fb ldrh r3, [r7, #14]
  87423. 80236dc: 33f0 adds r3, #240 @ 0xf0
  87424. 80236de: b29b uxth r3, r3
  87425. 80236e0: 4619 mov r1, r3
  87426. 80236e2: 6878 ldr r0, [r7, #4]
  87427. 80236e4: f7f6 fd44 bl 801a170 <pbuf_realloc>
  87428. }
  87429. 80236e8: bf00 nop
  87430. 80236ea: 3710 adds r7, #16
  87431. 80236ec: 46bd mov sp, r7
  87432. 80236ee: bd80 pop {r7, pc}
  87433. 080236f0 <dhcp_supplied_address>:
  87434. * @return 1 if DHCP supplied netif->ip_addr (states BOUND or RENEWING),
  87435. * 0 otherwise
  87436. */
  87437. u8_t
  87438. dhcp_supplied_address(const struct netif *netif)
  87439. {
  87440. 80236f0: b480 push {r7}
  87441. 80236f2: b085 sub sp, #20
  87442. 80236f4: af00 add r7, sp, #0
  87443. 80236f6: 6078 str r0, [r7, #4]
  87444. if ((netif != NULL) && (netif_dhcp_data(netif) != NULL)) {
  87445. 80236f8: 687b ldr r3, [r7, #4]
  87446. 80236fa: 2b00 cmp r3, #0
  87447. 80236fc: d017 beq.n 802372e <dhcp_supplied_address+0x3e>
  87448. 80236fe: 687b ldr r3, [r7, #4]
  87449. 8023700: 6a5b ldr r3, [r3, #36] @ 0x24
  87450. 8023702: 2b00 cmp r3, #0
  87451. 8023704: d013 beq.n 802372e <dhcp_supplied_address+0x3e>
  87452. struct dhcp *dhcp = netif_dhcp_data(netif);
  87453. 8023706: 687b ldr r3, [r7, #4]
  87454. 8023708: 6a5b ldr r3, [r3, #36] @ 0x24
  87455. 802370a: 60fb str r3, [r7, #12]
  87456. return (dhcp->state == DHCP_STATE_BOUND) || (dhcp->state == DHCP_STATE_RENEWING) ||
  87457. 802370c: 68fb ldr r3, [r7, #12]
  87458. 802370e: 795b ldrb r3, [r3, #5]
  87459. 8023710: 2b0a cmp r3, #10
  87460. 8023712: d007 beq.n 8023724 <dhcp_supplied_address+0x34>
  87461. 8023714: 68fb ldr r3, [r7, #12]
  87462. 8023716: 795b ldrb r3, [r3, #5]
  87463. 8023718: 2b05 cmp r3, #5
  87464. 802371a: d003 beq.n 8023724 <dhcp_supplied_address+0x34>
  87465. (dhcp->state == DHCP_STATE_REBINDING);
  87466. 802371c: 68fb ldr r3, [r7, #12]
  87467. 802371e: 795b ldrb r3, [r3, #5]
  87468. return (dhcp->state == DHCP_STATE_BOUND) || (dhcp->state == DHCP_STATE_RENEWING) ||
  87469. 8023720: 2b04 cmp r3, #4
  87470. 8023722: d101 bne.n 8023728 <dhcp_supplied_address+0x38>
  87471. 8023724: 2301 movs r3, #1
  87472. 8023726: e000 b.n 802372a <dhcp_supplied_address+0x3a>
  87473. 8023728: 2300 movs r3, #0
  87474. 802372a: b2db uxtb r3, r3
  87475. 802372c: e000 b.n 8023730 <dhcp_supplied_address+0x40>
  87476. }
  87477. return 0;
  87478. 802372e: 2300 movs r3, #0
  87479. }
  87480. 8023730: 4618 mov r0, r3
  87481. 8023732: 3714 adds r7, #20
  87482. 8023734: 46bd mov sp, r7
  87483. 8023736: f85d 7b04 ldr.w r7, [sp], #4
  87484. 802373a: 4770 bx lr
  87485. 0802373c <etharp_free_entry>:
  87486. #endif /* ARP_QUEUEING */
  87487. /** Clean up ARP table entries */
  87488. static void
  87489. etharp_free_entry(int i)
  87490. {
  87491. 802373c: b580 push {r7, lr}
  87492. 802373e: b082 sub sp, #8
  87493. 8023740: af00 add r7, sp, #0
  87494. 8023742: 6078 str r0, [r7, #4]
  87495. /* remove from SNMP ARP index tree */
  87496. mib2_remove_arp_entry(arp_table[i].netif, &arp_table[i].ipaddr);
  87497. /* and empty packet queue */
  87498. if (arp_table[i].q != NULL) {
  87499. 8023744: 492b ldr r1, [pc, #172] @ (80237f4 <etharp_free_entry+0xb8>)
  87500. 8023746: 687a ldr r2, [r7, #4]
  87501. 8023748: 4613 mov r3, r2
  87502. 802374a: 005b lsls r3, r3, #1
  87503. 802374c: 4413 add r3, r2
  87504. 802374e: 00db lsls r3, r3, #3
  87505. 8023750: 440b add r3, r1
  87506. 8023752: 681b ldr r3, [r3, #0]
  87507. 8023754: 2b00 cmp r3, #0
  87508. 8023756: d013 beq.n 8023780 <etharp_free_entry+0x44>
  87509. /* remove all queued packets */
  87510. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_free_entry: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].q)));
  87511. free_etharp_q(arp_table[i].q);
  87512. 8023758: 4926 ldr r1, [pc, #152] @ (80237f4 <etharp_free_entry+0xb8>)
  87513. 802375a: 687a ldr r2, [r7, #4]
  87514. 802375c: 4613 mov r3, r2
  87515. 802375e: 005b lsls r3, r3, #1
  87516. 8023760: 4413 add r3, r2
  87517. 8023762: 00db lsls r3, r3, #3
  87518. 8023764: 440b add r3, r1
  87519. 8023766: 681b ldr r3, [r3, #0]
  87520. 8023768: 4618 mov r0, r3
  87521. 802376a: f7f6 feb7 bl 801a4dc <pbuf_free>
  87522. arp_table[i].q = NULL;
  87523. 802376e: 4921 ldr r1, [pc, #132] @ (80237f4 <etharp_free_entry+0xb8>)
  87524. 8023770: 687a ldr r2, [r7, #4]
  87525. 8023772: 4613 mov r3, r2
  87526. 8023774: 005b lsls r3, r3, #1
  87527. 8023776: 4413 add r3, r2
  87528. 8023778: 00db lsls r3, r3, #3
  87529. 802377a: 440b add r3, r1
  87530. 802377c: 2200 movs r2, #0
  87531. 802377e: 601a str r2, [r3, #0]
  87532. }
  87533. /* recycle entry for re-use */
  87534. arp_table[i].state = ETHARP_STATE_EMPTY;
  87535. 8023780: 491c ldr r1, [pc, #112] @ (80237f4 <etharp_free_entry+0xb8>)
  87536. 8023782: 687a ldr r2, [r7, #4]
  87537. 8023784: 4613 mov r3, r2
  87538. 8023786: 005b lsls r3, r3, #1
  87539. 8023788: 4413 add r3, r2
  87540. 802378a: 00db lsls r3, r3, #3
  87541. 802378c: 440b add r3, r1
  87542. 802378e: 3314 adds r3, #20
  87543. 8023790: 2200 movs r2, #0
  87544. 8023792: 701a strb r2, [r3, #0]
  87545. #ifdef LWIP_DEBUG
  87546. /* for debugging, clean out the complete entry */
  87547. arp_table[i].ctime = 0;
  87548. 8023794: 4917 ldr r1, [pc, #92] @ (80237f4 <etharp_free_entry+0xb8>)
  87549. 8023796: 687a ldr r2, [r7, #4]
  87550. 8023798: 4613 mov r3, r2
  87551. 802379a: 005b lsls r3, r3, #1
  87552. 802379c: 4413 add r3, r2
  87553. 802379e: 00db lsls r3, r3, #3
  87554. 80237a0: 440b add r3, r1
  87555. 80237a2: 3312 adds r3, #18
  87556. 80237a4: 2200 movs r2, #0
  87557. 80237a6: 801a strh r2, [r3, #0]
  87558. arp_table[i].netif = NULL;
  87559. 80237a8: 4912 ldr r1, [pc, #72] @ (80237f4 <etharp_free_entry+0xb8>)
  87560. 80237aa: 687a ldr r2, [r7, #4]
  87561. 80237ac: 4613 mov r3, r2
  87562. 80237ae: 005b lsls r3, r3, #1
  87563. 80237b0: 4413 add r3, r2
  87564. 80237b2: 00db lsls r3, r3, #3
  87565. 80237b4: 440b add r3, r1
  87566. 80237b6: 3308 adds r3, #8
  87567. 80237b8: 2200 movs r2, #0
  87568. 80237ba: 601a str r2, [r3, #0]
  87569. ip4_addr_set_zero(&arp_table[i].ipaddr);
  87570. 80237bc: 490d ldr r1, [pc, #52] @ (80237f4 <etharp_free_entry+0xb8>)
  87571. 80237be: 687a ldr r2, [r7, #4]
  87572. 80237c0: 4613 mov r3, r2
  87573. 80237c2: 005b lsls r3, r3, #1
  87574. 80237c4: 4413 add r3, r2
  87575. 80237c6: 00db lsls r3, r3, #3
  87576. 80237c8: 440b add r3, r1
  87577. 80237ca: 3304 adds r3, #4
  87578. 80237cc: 2200 movs r2, #0
  87579. 80237ce: 601a str r2, [r3, #0]
  87580. arp_table[i].ethaddr = ethzero;
  87581. 80237d0: 4908 ldr r1, [pc, #32] @ (80237f4 <etharp_free_entry+0xb8>)
  87582. 80237d2: 687a ldr r2, [r7, #4]
  87583. 80237d4: 4613 mov r3, r2
  87584. 80237d6: 005b lsls r3, r3, #1
  87585. 80237d8: 4413 add r3, r2
  87586. 80237da: 00db lsls r3, r3, #3
  87587. 80237dc: 440b add r3, r1
  87588. 80237de: 3308 adds r3, #8
  87589. 80237e0: 4a05 ldr r2, [pc, #20] @ (80237f8 <etharp_free_entry+0xbc>)
  87590. 80237e2: 3304 adds r3, #4
  87591. 80237e4: 6810 ldr r0, [r2, #0]
  87592. 80237e6: 6018 str r0, [r3, #0]
  87593. 80237e8: 8892 ldrh r2, [r2, #4]
  87594. 80237ea: 809a strh r2, [r3, #4]
  87595. #endif /* LWIP_DEBUG */
  87596. }
  87597. 80237ec: bf00 nop
  87598. 80237ee: 3708 adds r7, #8
  87599. 80237f0: 46bd mov sp, r7
  87600. 80237f2: bd80 pop {r7, pc}
  87601. 80237f4: 2402af20 .word 0x2402af20
  87602. 80237f8: 08030c20 .word 0x08030c20
  87603. 080237fc <etharp_tmr>:
  87604. * This function should be called every ARP_TMR_INTERVAL milliseconds (1 second),
  87605. * in order to expire entries in the ARP table.
  87606. */
  87607. void
  87608. etharp_tmr(void)
  87609. {
  87610. 80237fc: b580 push {r7, lr}
  87611. 80237fe: b082 sub sp, #8
  87612. 8023800: af00 add r7, sp, #0
  87613. int i;
  87614. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
  87615. /* remove expired entries from the ARP table */
  87616. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  87617. 8023802: 2300 movs r3, #0
  87618. 8023804: 607b str r3, [r7, #4]
  87619. 8023806: e096 b.n 8023936 <etharp_tmr+0x13a>
  87620. u8_t state = arp_table[i].state;
  87621. 8023808: 494f ldr r1, [pc, #316] @ (8023948 <etharp_tmr+0x14c>)
  87622. 802380a: 687a ldr r2, [r7, #4]
  87623. 802380c: 4613 mov r3, r2
  87624. 802380e: 005b lsls r3, r3, #1
  87625. 8023810: 4413 add r3, r2
  87626. 8023812: 00db lsls r3, r3, #3
  87627. 8023814: 440b add r3, r1
  87628. 8023816: 3314 adds r3, #20
  87629. 8023818: 781b ldrb r3, [r3, #0]
  87630. 802381a: 70fb strb r3, [r7, #3]
  87631. if (state != ETHARP_STATE_EMPTY
  87632. 802381c: 78fb ldrb r3, [r7, #3]
  87633. 802381e: 2b00 cmp r3, #0
  87634. 8023820: f000 8086 beq.w 8023930 <etharp_tmr+0x134>
  87635. #if ETHARP_SUPPORT_STATIC_ENTRIES
  87636. && (state != ETHARP_STATE_STATIC)
  87637. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  87638. ) {
  87639. arp_table[i].ctime++;
  87640. 8023824: 4948 ldr r1, [pc, #288] @ (8023948 <etharp_tmr+0x14c>)
  87641. 8023826: 687a ldr r2, [r7, #4]
  87642. 8023828: 4613 mov r3, r2
  87643. 802382a: 005b lsls r3, r3, #1
  87644. 802382c: 4413 add r3, r2
  87645. 802382e: 00db lsls r3, r3, #3
  87646. 8023830: 440b add r3, r1
  87647. 8023832: 3312 adds r3, #18
  87648. 8023834: 881b ldrh r3, [r3, #0]
  87649. 8023836: 3301 adds r3, #1
  87650. 8023838: b298 uxth r0, r3
  87651. 802383a: 4943 ldr r1, [pc, #268] @ (8023948 <etharp_tmr+0x14c>)
  87652. 802383c: 687a ldr r2, [r7, #4]
  87653. 802383e: 4613 mov r3, r2
  87654. 8023840: 005b lsls r3, r3, #1
  87655. 8023842: 4413 add r3, r2
  87656. 8023844: 00db lsls r3, r3, #3
  87657. 8023846: 440b add r3, r1
  87658. 8023848: 3312 adds r3, #18
  87659. 802384a: 4602 mov r2, r0
  87660. 802384c: 801a strh r2, [r3, #0]
  87661. if ((arp_table[i].ctime >= ARP_MAXAGE) ||
  87662. 802384e: 493e ldr r1, [pc, #248] @ (8023948 <etharp_tmr+0x14c>)
  87663. 8023850: 687a ldr r2, [r7, #4]
  87664. 8023852: 4613 mov r3, r2
  87665. 8023854: 005b lsls r3, r3, #1
  87666. 8023856: 4413 add r3, r2
  87667. 8023858: 00db lsls r3, r3, #3
  87668. 802385a: 440b add r3, r1
  87669. 802385c: 3312 adds r3, #18
  87670. 802385e: 881b ldrh r3, [r3, #0]
  87671. 8023860: f5b3 7f96 cmp.w r3, #300 @ 0x12c
  87672. 8023864: d215 bcs.n 8023892 <etharp_tmr+0x96>
  87673. ((arp_table[i].state == ETHARP_STATE_PENDING) &&
  87674. 8023866: 4938 ldr r1, [pc, #224] @ (8023948 <etharp_tmr+0x14c>)
  87675. 8023868: 687a ldr r2, [r7, #4]
  87676. 802386a: 4613 mov r3, r2
  87677. 802386c: 005b lsls r3, r3, #1
  87678. 802386e: 4413 add r3, r2
  87679. 8023870: 00db lsls r3, r3, #3
  87680. 8023872: 440b add r3, r1
  87681. 8023874: 3314 adds r3, #20
  87682. 8023876: 781b ldrb r3, [r3, #0]
  87683. if ((arp_table[i].ctime >= ARP_MAXAGE) ||
  87684. 8023878: 2b01 cmp r3, #1
  87685. 802387a: d10e bne.n 802389a <etharp_tmr+0x9e>
  87686. (arp_table[i].ctime >= ARP_MAXPENDING))) {
  87687. 802387c: 4932 ldr r1, [pc, #200] @ (8023948 <etharp_tmr+0x14c>)
  87688. 802387e: 687a ldr r2, [r7, #4]
  87689. 8023880: 4613 mov r3, r2
  87690. 8023882: 005b lsls r3, r3, #1
  87691. 8023884: 4413 add r3, r2
  87692. 8023886: 00db lsls r3, r3, #3
  87693. 8023888: 440b add r3, r1
  87694. 802388a: 3312 adds r3, #18
  87695. 802388c: 881b ldrh r3, [r3, #0]
  87696. ((arp_table[i].state == ETHARP_STATE_PENDING) &&
  87697. 802388e: 2b04 cmp r3, #4
  87698. 8023890: d903 bls.n 802389a <etharp_tmr+0x9e>
  87699. /* pending or stable entry has become old! */
  87700. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %d.\n",
  87701. arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", i));
  87702. /* clean up entries that have just been expired */
  87703. etharp_free_entry(i);
  87704. 8023892: 6878 ldr r0, [r7, #4]
  87705. 8023894: f7ff ff52 bl 802373c <etharp_free_entry>
  87706. 8023898: e04a b.n 8023930 <etharp_tmr+0x134>
  87707. } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_1) {
  87708. 802389a: 492b ldr r1, [pc, #172] @ (8023948 <etharp_tmr+0x14c>)
  87709. 802389c: 687a ldr r2, [r7, #4]
  87710. 802389e: 4613 mov r3, r2
  87711. 80238a0: 005b lsls r3, r3, #1
  87712. 80238a2: 4413 add r3, r2
  87713. 80238a4: 00db lsls r3, r3, #3
  87714. 80238a6: 440b add r3, r1
  87715. 80238a8: 3314 adds r3, #20
  87716. 80238aa: 781b ldrb r3, [r3, #0]
  87717. 80238ac: 2b03 cmp r3, #3
  87718. 80238ae: d10a bne.n 80238c6 <etharp_tmr+0xca>
  87719. /* Don't send more than one request every 2 seconds. */
  87720. arp_table[i].state = ETHARP_STATE_STABLE_REREQUESTING_2;
  87721. 80238b0: 4925 ldr r1, [pc, #148] @ (8023948 <etharp_tmr+0x14c>)
  87722. 80238b2: 687a ldr r2, [r7, #4]
  87723. 80238b4: 4613 mov r3, r2
  87724. 80238b6: 005b lsls r3, r3, #1
  87725. 80238b8: 4413 add r3, r2
  87726. 80238ba: 00db lsls r3, r3, #3
  87727. 80238bc: 440b add r3, r1
  87728. 80238be: 3314 adds r3, #20
  87729. 80238c0: 2204 movs r2, #4
  87730. 80238c2: 701a strb r2, [r3, #0]
  87731. 80238c4: e034 b.n 8023930 <etharp_tmr+0x134>
  87732. } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_2) {
  87733. 80238c6: 4920 ldr r1, [pc, #128] @ (8023948 <etharp_tmr+0x14c>)
  87734. 80238c8: 687a ldr r2, [r7, #4]
  87735. 80238ca: 4613 mov r3, r2
  87736. 80238cc: 005b lsls r3, r3, #1
  87737. 80238ce: 4413 add r3, r2
  87738. 80238d0: 00db lsls r3, r3, #3
  87739. 80238d2: 440b add r3, r1
  87740. 80238d4: 3314 adds r3, #20
  87741. 80238d6: 781b ldrb r3, [r3, #0]
  87742. 80238d8: 2b04 cmp r3, #4
  87743. 80238da: d10a bne.n 80238f2 <etharp_tmr+0xf6>
  87744. /* Reset state to stable, so that the next transmitted packet will
  87745. re-send an ARP request. */
  87746. arp_table[i].state = ETHARP_STATE_STABLE;
  87747. 80238dc: 491a ldr r1, [pc, #104] @ (8023948 <etharp_tmr+0x14c>)
  87748. 80238de: 687a ldr r2, [r7, #4]
  87749. 80238e0: 4613 mov r3, r2
  87750. 80238e2: 005b lsls r3, r3, #1
  87751. 80238e4: 4413 add r3, r2
  87752. 80238e6: 00db lsls r3, r3, #3
  87753. 80238e8: 440b add r3, r1
  87754. 80238ea: 3314 adds r3, #20
  87755. 80238ec: 2202 movs r2, #2
  87756. 80238ee: 701a strb r2, [r3, #0]
  87757. 80238f0: e01e b.n 8023930 <etharp_tmr+0x134>
  87758. } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
  87759. 80238f2: 4915 ldr r1, [pc, #84] @ (8023948 <etharp_tmr+0x14c>)
  87760. 80238f4: 687a ldr r2, [r7, #4]
  87761. 80238f6: 4613 mov r3, r2
  87762. 80238f8: 005b lsls r3, r3, #1
  87763. 80238fa: 4413 add r3, r2
  87764. 80238fc: 00db lsls r3, r3, #3
  87765. 80238fe: 440b add r3, r1
  87766. 8023900: 3314 adds r3, #20
  87767. 8023902: 781b ldrb r3, [r3, #0]
  87768. 8023904: 2b01 cmp r3, #1
  87769. 8023906: d113 bne.n 8023930 <etharp_tmr+0x134>
  87770. /* still pending, resend an ARP query */
  87771. etharp_request(arp_table[i].netif, &arp_table[i].ipaddr);
  87772. 8023908: 490f ldr r1, [pc, #60] @ (8023948 <etharp_tmr+0x14c>)
  87773. 802390a: 687a ldr r2, [r7, #4]
  87774. 802390c: 4613 mov r3, r2
  87775. 802390e: 005b lsls r3, r3, #1
  87776. 8023910: 4413 add r3, r2
  87777. 8023912: 00db lsls r3, r3, #3
  87778. 8023914: 440b add r3, r1
  87779. 8023916: 3308 adds r3, #8
  87780. 8023918: 6818 ldr r0, [r3, #0]
  87781. 802391a: 687a ldr r2, [r7, #4]
  87782. 802391c: 4613 mov r3, r2
  87783. 802391e: 005b lsls r3, r3, #1
  87784. 8023920: 4413 add r3, r2
  87785. 8023922: 00db lsls r3, r3, #3
  87786. 8023924: 4a08 ldr r2, [pc, #32] @ (8023948 <etharp_tmr+0x14c>)
  87787. 8023926: 4413 add r3, r2
  87788. 8023928: 3304 adds r3, #4
  87789. 802392a: 4619 mov r1, r3
  87790. 802392c: f000 fe76 bl 802461c <etharp_request>
  87791. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  87792. 8023930: 687b ldr r3, [r7, #4]
  87793. 8023932: 3301 adds r3, #1
  87794. 8023934: 607b str r3, [r7, #4]
  87795. 8023936: 687b ldr r3, [r7, #4]
  87796. 8023938: 2b09 cmp r3, #9
  87797. 802393a: f77f af65 ble.w 8023808 <etharp_tmr+0xc>
  87798. }
  87799. }
  87800. }
  87801. }
  87802. 802393e: bf00 nop
  87803. 8023940: bf00 nop
  87804. 8023942: 3708 adds r7, #8
  87805. 8023944: 46bd mov sp, r7
  87806. 8023946: bd80 pop {r7, pc}
  87807. 8023948: 2402af20 .word 0x2402af20
  87808. 0802394c <etharp_find_entry>:
  87809. * @return The ARP entry index that matched or is created, ERR_MEM if no
  87810. * entry is found or could be recycled.
  87811. */
  87812. static s16_t
  87813. etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif *netif)
  87814. {
  87815. 802394c: b580 push {r7, lr}
  87816. 802394e: b08a sub sp, #40 @ 0x28
  87817. 8023950: af00 add r7, sp, #0
  87818. 8023952: 60f8 str r0, [r7, #12]
  87819. 8023954: 460b mov r3, r1
  87820. 8023956: 607a str r2, [r7, #4]
  87821. 8023958: 72fb strb r3, [r7, #11]
  87822. s16_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  87823. 802395a: 230a movs r3, #10
  87824. 802395c: 843b strh r3, [r7, #32]
  87825. 802395e: 230a movs r3, #10
  87826. 8023960: 847b strh r3, [r7, #34] @ 0x22
  87827. s16_t empty = ARP_TABLE_SIZE;
  87828. 8023962: 230a movs r3, #10
  87829. 8023964: 84bb strh r3, [r7, #36] @ 0x24
  87830. s16_t i = 0;
  87831. 8023966: 2300 movs r3, #0
  87832. 8023968: 84fb strh r3, [r7, #38] @ 0x26
  87833. /* oldest entry with packets on queue */
  87834. s16_t old_queue = ARP_TABLE_SIZE;
  87835. 802396a: 230a movs r3, #10
  87836. 802396c: 83fb strh r3, [r7, #30]
  87837. /* its age */
  87838. u16_t age_queue = 0, age_pending = 0, age_stable = 0;
  87839. 802396e: 2300 movs r3, #0
  87840. 8023970: 83bb strh r3, [r7, #28]
  87841. 8023972: 2300 movs r3, #0
  87842. 8023974: 837b strh r3, [r7, #26]
  87843. 8023976: 2300 movs r3, #0
  87844. 8023978: 833b strh r3, [r7, #24]
  87845. * 4) remember the oldest pending entry with queued packets (if any)
  87846. * 5) search for a matching IP entry, either pending or stable
  87847. * until 5 matches, or all entries are searched for.
  87848. */
  87849. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  87850. 802397a: 2300 movs r3, #0
  87851. 802397c: 84fb strh r3, [r7, #38] @ 0x26
  87852. 802397e: e0ae b.n 8023ade <etharp_find_entry+0x192>
  87853. u8_t state = arp_table[i].state;
  87854. 8023980: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  87855. 8023984: 49a6 ldr r1, [pc, #664] @ (8023c20 <etharp_find_entry+0x2d4>)
  87856. 8023986: 4613 mov r3, r2
  87857. 8023988: 005b lsls r3, r3, #1
  87858. 802398a: 4413 add r3, r2
  87859. 802398c: 00db lsls r3, r3, #3
  87860. 802398e: 440b add r3, r1
  87861. 8023990: 3314 adds r3, #20
  87862. 8023992: 781b ldrb r3, [r3, #0]
  87863. 8023994: 75fb strb r3, [r7, #23]
  87864. /* no empty entry found yet and now we do find one? */
  87865. if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) {
  87866. 8023996: f9b7 3024 ldrsh.w r3, [r7, #36] @ 0x24
  87867. 802399a: 2b0a cmp r3, #10
  87868. 802399c: d105 bne.n 80239aa <etharp_find_entry+0x5e>
  87869. 802399e: 7dfb ldrb r3, [r7, #23]
  87870. 80239a0: 2b00 cmp r3, #0
  87871. 80239a2: d102 bne.n 80239aa <etharp_find_entry+0x5e>
  87872. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_find_entry: found empty entry %d\n", (int)i));
  87873. /* remember first empty entry */
  87874. empty = i;
  87875. 80239a4: 8cfb ldrh r3, [r7, #38] @ 0x26
  87876. 80239a6: 84bb strh r3, [r7, #36] @ 0x24
  87877. 80239a8: e095 b.n 8023ad6 <etharp_find_entry+0x18a>
  87878. } else if (state != ETHARP_STATE_EMPTY) {
  87879. 80239aa: 7dfb ldrb r3, [r7, #23]
  87880. 80239ac: 2b00 cmp r3, #0
  87881. 80239ae: f000 8092 beq.w 8023ad6 <etharp_find_entry+0x18a>
  87882. LWIP_ASSERT("state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE",
  87883. 80239b2: 7dfb ldrb r3, [r7, #23]
  87884. 80239b4: 2b01 cmp r3, #1
  87885. 80239b6: d009 beq.n 80239cc <etharp_find_entry+0x80>
  87886. 80239b8: 7dfb ldrb r3, [r7, #23]
  87887. 80239ba: 2b01 cmp r3, #1
  87888. 80239bc: d806 bhi.n 80239cc <etharp_find_entry+0x80>
  87889. 80239be: 4b99 ldr r3, [pc, #612] @ (8023c24 <etharp_find_entry+0x2d8>)
  87890. 80239c0: f240 1223 movw r2, #291 @ 0x123
  87891. 80239c4: 4998 ldr r1, [pc, #608] @ (8023c28 <etharp_find_entry+0x2dc>)
  87892. 80239c6: 4899 ldr r0, [pc, #612] @ (8023c2c <etharp_find_entry+0x2e0>)
  87893. 80239c8: f006 f800 bl 80299cc <iprintf>
  87894. state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE);
  87895. /* if given, does IP address match IP address in ARP entry? */
  87896. if (ipaddr && ip4_addr_cmp(ipaddr, &arp_table[i].ipaddr)
  87897. 80239cc: 68fb ldr r3, [r7, #12]
  87898. 80239ce: 2b00 cmp r3, #0
  87899. 80239d0: d020 beq.n 8023a14 <etharp_find_entry+0xc8>
  87900. 80239d2: 68fb ldr r3, [r7, #12]
  87901. 80239d4: 6819 ldr r1, [r3, #0]
  87902. 80239d6: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  87903. 80239da: 4891 ldr r0, [pc, #580] @ (8023c20 <etharp_find_entry+0x2d4>)
  87904. 80239dc: 4613 mov r3, r2
  87905. 80239de: 005b lsls r3, r3, #1
  87906. 80239e0: 4413 add r3, r2
  87907. 80239e2: 00db lsls r3, r3, #3
  87908. 80239e4: 4403 add r3, r0
  87909. 80239e6: 3304 adds r3, #4
  87910. 80239e8: 681b ldr r3, [r3, #0]
  87911. 80239ea: 4299 cmp r1, r3
  87912. 80239ec: d112 bne.n 8023a14 <etharp_find_entry+0xc8>
  87913. #if ETHARP_TABLE_MATCH_NETIF
  87914. && ((netif == NULL) || (netif == arp_table[i].netif))
  87915. 80239ee: 687b ldr r3, [r7, #4]
  87916. 80239f0: 2b00 cmp r3, #0
  87917. 80239f2: d00c beq.n 8023a0e <etharp_find_entry+0xc2>
  87918. 80239f4: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  87919. 80239f8: 4989 ldr r1, [pc, #548] @ (8023c20 <etharp_find_entry+0x2d4>)
  87920. 80239fa: 4613 mov r3, r2
  87921. 80239fc: 005b lsls r3, r3, #1
  87922. 80239fe: 4413 add r3, r2
  87923. 8023a00: 00db lsls r3, r3, #3
  87924. 8023a02: 440b add r3, r1
  87925. 8023a04: 3308 adds r3, #8
  87926. 8023a06: 681b ldr r3, [r3, #0]
  87927. 8023a08: 687a ldr r2, [r7, #4]
  87928. 8023a0a: 429a cmp r2, r3
  87929. 8023a0c: d102 bne.n 8023a14 <etharp_find_entry+0xc8>
  87930. #endif /* ETHARP_TABLE_MATCH_NETIF */
  87931. ) {
  87932. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: found matching entry %d\n", (int)i));
  87933. /* found exact IP address match, simply bail out */
  87934. return i;
  87935. 8023a0e: f9b7 3026 ldrsh.w r3, [r7, #38] @ 0x26
  87936. 8023a12: e100 b.n 8023c16 <etharp_find_entry+0x2ca>
  87937. }
  87938. /* pending entry? */
  87939. if (state == ETHARP_STATE_PENDING) {
  87940. 8023a14: 7dfb ldrb r3, [r7, #23]
  87941. 8023a16: 2b01 cmp r3, #1
  87942. 8023a18: d140 bne.n 8023a9c <etharp_find_entry+0x150>
  87943. /* pending with queued packets? */
  87944. if (arp_table[i].q != NULL) {
  87945. 8023a1a: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  87946. 8023a1e: 4980 ldr r1, [pc, #512] @ (8023c20 <etharp_find_entry+0x2d4>)
  87947. 8023a20: 4613 mov r3, r2
  87948. 8023a22: 005b lsls r3, r3, #1
  87949. 8023a24: 4413 add r3, r2
  87950. 8023a26: 00db lsls r3, r3, #3
  87951. 8023a28: 440b add r3, r1
  87952. 8023a2a: 681b ldr r3, [r3, #0]
  87953. 8023a2c: 2b00 cmp r3, #0
  87954. 8023a2e: d01a beq.n 8023a66 <etharp_find_entry+0x11a>
  87955. if (arp_table[i].ctime >= age_queue) {
  87956. 8023a30: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  87957. 8023a34: 497a ldr r1, [pc, #488] @ (8023c20 <etharp_find_entry+0x2d4>)
  87958. 8023a36: 4613 mov r3, r2
  87959. 8023a38: 005b lsls r3, r3, #1
  87960. 8023a3a: 4413 add r3, r2
  87961. 8023a3c: 00db lsls r3, r3, #3
  87962. 8023a3e: 440b add r3, r1
  87963. 8023a40: 3312 adds r3, #18
  87964. 8023a42: 881b ldrh r3, [r3, #0]
  87965. 8023a44: 8bba ldrh r2, [r7, #28]
  87966. 8023a46: 429a cmp r2, r3
  87967. 8023a48: d845 bhi.n 8023ad6 <etharp_find_entry+0x18a>
  87968. old_queue = i;
  87969. 8023a4a: 8cfb ldrh r3, [r7, #38] @ 0x26
  87970. 8023a4c: 83fb strh r3, [r7, #30]
  87971. age_queue = arp_table[i].ctime;
  87972. 8023a4e: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  87973. 8023a52: 4973 ldr r1, [pc, #460] @ (8023c20 <etharp_find_entry+0x2d4>)
  87974. 8023a54: 4613 mov r3, r2
  87975. 8023a56: 005b lsls r3, r3, #1
  87976. 8023a58: 4413 add r3, r2
  87977. 8023a5a: 00db lsls r3, r3, #3
  87978. 8023a5c: 440b add r3, r1
  87979. 8023a5e: 3312 adds r3, #18
  87980. 8023a60: 881b ldrh r3, [r3, #0]
  87981. 8023a62: 83bb strh r3, [r7, #28]
  87982. 8023a64: e037 b.n 8023ad6 <etharp_find_entry+0x18a>
  87983. }
  87984. } else
  87985. /* pending without queued packets? */
  87986. {
  87987. if (arp_table[i].ctime >= age_pending) {
  87988. 8023a66: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  87989. 8023a6a: 496d ldr r1, [pc, #436] @ (8023c20 <etharp_find_entry+0x2d4>)
  87990. 8023a6c: 4613 mov r3, r2
  87991. 8023a6e: 005b lsls r3, r3, #1
  87992. 8023a70: 4413 add r3, r2
  87993. 8023a72: 00db lsls r3, r3, #3
  87994. 8023a74: 440b add r3, r1
  87995. 8023a76: 3312 adds r3, #18
  87996. 8023a78: 881b ldrh r3, [r3, #0]
  87997. 8023a7a: 8b7a ldrh r2, [r7, #26]
  87998. 8023a7c: 429a cmp r2, r3
  87999. 8023a7e: d82a bhi.n 8023ad6 <etharp_find_entry+0x18a>
  88000. old_pending = i;
  88001. 8023a80: 8cfb ldrh r3, [r7, #38] @ 0x26
  88002. 8023a82: 843b strh r3, [r7, #32]
  88003. age_pending = arp_table[i].ctime;
  88004. 8023a84: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  88005. 8023a88: 4965 ldr r1, [pc, #404] @ (8023c20 <etharp_find_entry+0x2d4>)
  88006. 8023a8a: 4613 mov r3, r2
  88007. 8023a8c: 005b lsls r3, r3, #1
  88008. 8023a8e: 4413 add r3, r2
  88009. 8023a90: 00db lsls r3, r3, #3
  88010. 8023a92: 440b add r3, r1
  88011. 8023a94: 3312 adds r3, #18
  88012. 8023a96: 881b ldrh r3, [r3, #0]
  88013. 8023a98: 837b strh r3, [r7, #26]
  88014. 8023a9a: e01c b.n 8023ad6 <etharp_find_entry+0x18a>
  88015. }
  88016. }
  88017. /* stable entry? */
  88018. } else if (state >= ETHARP_STATE_STABLE) {
  88019. 8023a9c: 7dfb ldrb r3, [r7, #23]
  88020. 8023a9e: 2b01 cmp r3, #1
  88021. 8023aa0: d919 bls.n 8023ad6 <etharp_find_entry+0x18a>
  88022. /* don't record old_stable for static entries since they never expire */
  88023. if (state < ETHARP_STATE_STATIC)
  88024. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  88025. {
  88026. /* remember entry with oldest stable entry in oldest, its age in maxtime */
  88027. if (arp_table[i].ctime >= age_stable) {
  88028. 8023aa2: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  88029. 8023aa6: 495e ldr r1, [pc, #376] @ (8023c20 <etharp_find_entry+0x2d4>)
  88030. 8023aa8: 4613 mov r3, r2
  88031. 8023aaa: 005b lsls r3, r3, #1
  88032. 8023aac: 4413 add r3, r2
  88033. 8023aae: 00db lsls r3, r3, #3
  88034. 8023ab0: 440b add r3, r1
  88035. 8023ab2: 3312 adds r3, #18
  88036. 8023ab4: 881b ldrh r3, [r3, #0]
  88037. 8023ab6: 8b3a ldrh r2, [r7, #24]
  88038. 8023ab8: 429a cmp r2, r3
  88039. 8023aba: d80c bhi.n 8023ad6 <etharp_find_entry+0x18a>
  88040. old_stable = i;
  88041. 8023abc: 8cfb ldrh r3, [r7, #38] @ 0x26
  88042. 8023abe: 847b strh r3, [r7, #34] @ 0x22
  88043. age_stable = arp_table[i].ctime;
  88044. 8023ac0: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  88045. 8023ac4: 4956 ldr r1, [pc, #344] @ (8023c20 <etharp_find_entry+0x2d4>)
  88046. 8023ac6: 4613 mov r3, r2
  88047. 8023ac8: 005b lsls r3, r3, #1
  88048. 8023aca: 4413 add r3, r2
  88049. 8023acc: 00db lsls r3, r3, #3
  88050. 8023ace: 440b add r3, r1
  88051. 8023ad0: 3312 adds r3, #18
  88052. 8023ad2: 881b ldrh r3, [r3, #0]
  88053. 8023ad4: 833b strh r3, [r7, #24]
  88054. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  88055. 8023ad6: 8cfb ldrh r3, [r7, #38] @ 0x26
  88056. 8023ad8: 3301 adds r3, #1
  88057. 8023ada: b29b uxth r3, r3
  88058. 8023adc: 84fb strh r3, [r7, #38] @ 0x26
  88059. 8023ade: f9b7 3026 ldrsh.w r3, [r7, #38] @ 0x26
  88060. 8023ae2: 2b09 cmp r3, #9
  88061. 8023ae4: f77f af4c ble.w 8023980 <etharp_find_entry+0x34>
  88062. }
  88063. }
  88064. /* { we have no match } => try to create a new entry */
  88065. /* don't create new entry, only search? */
  88066. if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) ||
  88067. 8023ae8: 7afb ldrb r3, [r7, #11]
  88068. 8023aea: f003 0302 and.w r3, r3, #2
  88069. 8023aee: 2b00 cmp r3, #0
  88070. 8023af0: d108 bne.n 8023b04 <etharp_find_entry+0x1b8>
  88071. 8023af2: f9b7 3024 ldrsh.w r3, [r7, #36] @ 0x24
  88072. 8023af6: 2b0a cmp r3, #10
  88073. 8023af8: d107 bne.n 8023b0a <etharp_find_entry+0x1be>
  88074. /* or no empty entry found and not allowed to recycle? */
  88075. ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) {
  88076. 8023afa: 7afb ldrb r3, [r7, #11]
  88077. 8023afc: f003 0301 and.w r3, r3, #1
  88078. 8023b00: 2b00 cmp r3, #0
  88079. 8023b02: d102 bne.n 8023b0a <etharp_find_entry+0x1be>
  88080. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty entry found and not allowed to recycle\n"));
  88081. return (s16_t)ERR_MEM;
  88082. 8023b04: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  88083. 8023b08: e085 b.n 8023c16 <etharp_find_entry+0x2ca>
  88084. *
  88085. * { ETHARP_FLAG_TRY_HARD is set at this point }
  88086. */
  88087. /* 1) empty entry available? */
  88088. if (empty < ARP_TABLE_SIZE) {
  88089. 8023b0a: f9b7 3024 ldrsh.w r3, [r7, #36] @ 0x24
  88090. 8023b0e: 2b09 cmp r3, #9
  88091. 8023b10: dc02 bgt.n 8023b18 <etharp_find_entry+0x1cc>
  88092. i = empty;
  88093. 8023b12: 8cbb ldrh r3, [r7, #36] @ 0x24
  88094. 8023b14: 84fb strh r3, [r7, #38] @ 0x26
  88095. 8023b16: e039 b.n 8023b8c <etharp_find_entry+0x240>
  88096. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting empty entry %d\n", (int)i));
  88097. } else {
  88098. /* 2) found recyclable stable entry? */
  88099. if (old_stable < ARP_TABLE_SIZE) {
  88100. 8023b18: f9b7 3022 ldrsh.w r3, [r7, #34] @ 0x22
  88101. 8023b1c: 2b09 cmp r3, #9
  88102. 8023b1e: dc14 bgt.n 8023b4a <etharp_find_entry+0x1fe>
  88103. /* recycle oldest stable*/
  88104. i = old_stable;
  88105. 8023b20: 8c7b ldrh r3, [r7, #34] @ 0x22
  88106. 8023b22: 84fb strh r3, [r7, #38] @ 0x26
  88107. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest stable entry %d\n", (int)i));
  88108. /* no queued packets should exist on stable entries */
  88109. LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL);
  88110. 8023b24: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  88111. 8023b28: 493d ldr r1, [pc, #244] @ (8023c20 <etharp_find_entry+0x2d4>)
  88112. 8023b2a: 4613 mov r3, r2
  88113. 8023b2c: 005b lsls r3, r3, #1
  88114. 8023b2e: 4413 add r3, r2
  88115. 8023b30: 00db lsls r3, r3, #3
  88116. 8023b32: 440b add r3, r1
  88117. 8023b34: 681b ldr r3, [r3, #0]
  88118. 8023b36: 2b00 cmp r3, #0
  88119. 8023b38: d018 beq.n 8023b6c <etharp_find_entry+0x220>
  88120. 8023b3a: 4b3a ldr r3, [pc, #232] @ (8023c24 <etharp_find_entry+0x2d8>)
  88121. 8023b3c: f240 126d movw r2, #365 @ 0x16d
  88122. 8023b40: 493b ldr r1, [pc, #236] @ (8023c30 <etharp_find_entry+0x2e4>)
  88123. 8023b42: 483a ldr r0, [pc, #232] @ (8023c2c <etharp_find_entry+0x2e0>)
  88124. 8023b44: f005 ff42 bl 80299cc <iprintf>
  88125. 8023b48: e010 b.n 8023b6c <etharp_find_entry+0x220>
  88126. /* 3) found recyclable pending entry without queued packets? */
  88127. } else if (old_pending < ARP_TABLE_SIZE) {
  88128. 8023b4a: f9b7 3020 ldrsh.w r3, [r7, #32]
  88129. 8023b4e: 2b09 cmp r3, #9
  88130. 8023b50: dc02 bgt.n 8023b58 <etharp_find_entry+0x20c>
  88131. /* recycle oldest pending */
  88132. i = old_pending;
  88133. 8023b52: 8c3b ldrh r3, [r7, #32]
  88134. 8023b54: 84fb strh r3, [r7, #38] @ 0x26
  88135. 8023b56: e009 b.n 8023b6c <etharp_find_entry+0x220>
  88136. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %d (without queue)\n", (int)i));
  88137. /* 4) found recyclable pending entry with queued packets? */
  88138. } else if (old_queue < ARP_TABLE_SIZE) {
  88139. 8023b58: f9b7 301e ldrsh.w r3, [r7, #30]
  88140. 8023b5c: 2b09 cmp r3, #9
  88141. 8023b5e: dc02 bgt.n 8023b66 <etharp_find_entry+0x21a>
  88142. /* recycle oldest pending (queued packets are free in etharp_free_entry) */
  88143. i = old_queue;
  88144. 8023b60: 8bfb ldrh r3, [r7, #30]
  88145. 8023b62: 84fb strh r3, [r7, #38] @ 0x26
  88146. 8023b64: e002 b.n 8023b6c <etharp_find_entry+0x220>
  88147. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %d, freeing packet queue %p\n", (int)i, (void *)(arp_table[i].q)));
  88148. /* no empty or recyclable entries found */
  88149. } else {
  88150. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty or recyclable entries found\n"));
  88151. return (s16_t)ERR_MEM;
  88152. 8023b66: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  88153. 8023b6a: e054 b.n 8023c16 <etharp_find_entry+0x2ca>
  88154. }
  88155. /* { empty or recyclable entry found } */
  88156. LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
  88157. 8023b6c: f9b7 3026 ldrsh.w r3, [r7, #38] @ 0x26
  88158. 8023b70: 2b09 cmp r3, #9
  88159. 8023b72: dd06 ble.n 8023b82 <etharp_find_entry+0x236>
  88160. 8023b74: 4b2b ldr r3, [pc, #172] @ (8023c24 <etharp_find_entry+0x2d8>)
  88161. 8023b76: f240 127f movw r2, #383 @ 0x17f
  88162. 8023b7a: 492e ldr r1, [pc, #184] @ (8023c34 <etharp_find_entry+0x2e8>)
  88163. 8023b7c: 482b ldr r0, [pc, #172] @ (8023c2c <etharp_find_entry+0x2e0>)
  88164. 8023b7e: f005 ff25 bl 80299cc <iprintf>
  88165. etharp_free_entry(i);
  88166. 8023b82: f9b7 3026 ldrsh.w r3, [r7, #38] @ 0x26
  88167. 8023b86: 4618 mov r0, r3
  88168. 8023b88: f7ff fdd8 bl 802373c <etharp_free_entry>
  88169. }
  88170. LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
  88171. 8023b8c: f9b7 3026 ldrsh.w r3, [r7, #38] @ 0x26
  88172. 8023b90: 2b09 cmp r3, #9
  88173. 8023b92: dd06 ble.n 8023ba2 <etharp_find_entry+0x256>
  88174. 8023b94: 4b23 ldr r3, [pc, #140] @ (8023c24 <etharp_find_entry+0x2d8>)
  88175. 8023b96: f240 1283 movw r2, #387 @ 0x183
  88176. 8023b9a: 4926 ldr r1, [pc, #152] @ (8023c34 <etharp_find_entry+0x2e8>)
  88177. 8023b9c: 4823 ldr r0, [pc, #140] @ (8023c2c <etharp_find_entry+0x2e0>)
  88178. 8023b9e: f005 ff15 bl 80299cc <iprintf>
  88179. LWIP_ASSERT("arp_table[i].state == ETHARP_STATE_EMPTY",
  88180. 8023ba2: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  88181. 8023ba6: 491e ldr r1, [pc, #120] @ (8023c20 <etharp_find_entry+0x2d4>)
  88182. 8023ba8: 4613 mov r3, r2
  88183. 8023baa: 005b lsls r3, r3, #1
  88184. 8023bac: 4413 add r3, r2
  88185. 8023bae: 00db lsls r3, r3, #3
  88186. 8023bb0: 440b add r3, r1
  88187. 8023bb2: 3314 adds r3, #20
  88188. 8023bb4: 781b ldrb r3, [r3, #0]
  88189. 8023bb6: 2b00 cmp r3, #0
  88190. 8023bb8: d006 beq.n 8023bc8 <etharp_find_entry+0x27c>
  88191. 8023bba: 4b1a ldr r3, [pc, #104] @ (8023c24 <etharp_find_entry+0x2d8>)
  88192. 8023bbc: f44f 72c2 mov.w r2, #388 @ 0x184
  88193. 8023bc0: 491d ldr r1, [pc, #116] @ (8023c38 <etharp_find_entry+0x2ec>)
  88194. 8023bc2: 481a ldr r0, [pc, #104] @ (8023c2c <etharp_find_entry+0x2e0>)
  88195. 8023bc4: f005 ff02 bl 80299cc <iprintf>
  88196. arp_table[i].state == ETHARP_STATE_EMPTY);
  88197. /* IP address given? */
  88198. if (ipaddr != NULL) {
  88199. 8023bc8: 68fb ldr r3, [r7, #12]
  88200. 8023bca: 2b00 cmp r3, #0
  88201. 8023bcc: d00b beq.n 8023be6 <etharp_find_entry+0x29a>
  88202. /* set IP address */
  88203. ip4_addr_copy(arp_table[i].ipaddr, *ipaddr);
  88204. 8023bce: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  88205. 8023bd2: 68fb ldr r3, [r7, #12]
  88206. 8023bd4: 6819 ldr r1, [r3, #0]
  88207. 8023bd6: 4812 ldr r0, [pc, #72] @ (8023c20 <etharp_find_entry+0x2d4>)
  88208. 8023bd8: 4613 mov r3, r2
  88209. 8023bda: 005b lsls r3, r3, #1
  88210. 8023bdc: 4413 add r3, r2
  88211. 8023bde: 00db lsls r3, r3, #3
  88212. 8023be0: 4403 add r3, r0
  88213. 8023be2: 3304 adds r3, #4
  88214. 8023be4: 6019 str r1, [r3, #0]
  88215. }
  88216. arp_table[i].ctime = 0;
  88217. 8023be6: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  88218. 8023bea: 490d ldr r1, [pc, #52] @ (8023c20 <etharp_find_entry+0x2d4>)
  88219. 8023bec: 4613 mov r3, r2
  88220. 8023bee: 005b lsls r3, r3, #1
  88221. 8023bf0: 4413 add r3, r2
  88222. 8023bf2: 00db lsls r3, r3, #3
  88223. 8023bf4: 440b add r3, r1
  88224. 8023bf6: 3312 adds r3, #18
  88225. 8023bf8: 2200 movs r2, #0
  88226. 8023bfa: 801a strh r2, [r3, #0]
  88227. #if ETHARP_TABLE_MATCH_NETIF
  88228. arp_table[i].netif = netif;
  88229. 8023bfc: f9b7 2026 ldrsh.w r2, [r7, #38] @ 0x26
  88230. 8023c00: 4907 ldr r1, [pc, #28] @ (8023c20 <etharp_find_entry+0x2d4>)
  88231. 8023c02: 4613 mov r3, r2
  88232. 8023c04: 005b lsls r3, r3, #1
  88233. 8023c06: 4413 add r3, r2
  88234. 8023c08: 00db lsls r3, r3, #3
  88235. 8023c0a: 440b add r3, r1
  88236. 8023c0c: 3308 adds r3, #8
  88237. 8023c0e: 687a ldr r2, [r7, #4]
  88238. 8023c10: 601a str r2, [r3, #0]
  88239. #endif /* ETHARP_TABLE_MATCH_NETIF */
  88240. return (s16_t)i;
  88241. 8023c12: f9b7 3026 ldrsh.w r3, [r7, #38] @ 0x26
  88242. }
  88243. 8023c16: 4618 mov r0, r3
  88244. 8023c18: 3728 adds r7, #40 @ 0x28
  88245. 8023c1a: 46bd mov sp, r7
  88246. 8023c1c: bd80 pop {r7, pc}
  88247. 8023c1e: bf00 nop
  88248. 8023c20: 2402af20 .word 0x2402af20
  88249. 8023c24: 080301f4 .word 0x080301f4
  88250. 8023c28: 0803022c .word 0x0803022c
  88251. 8023c2c: 0803026c .word 0x0803026c
  88252. 8023c30: 08030294 .word 0x08030294
  88253. 8023c34: 080302ac .word 0x080302ac
  88254. 8023c38: 080302c0 .word 0x080302c0
  88255. 08023c3c <etharp_update_arp_entry>:
  88256. *
  88257. * @see pbuf_free()
  88258. */
  88259. static err_t
  88260. etharp_update_arp_entry(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, u8_t flags)
  88261. {
  88262. 8023c3c: b580 push {r7, lr}
  88263. 8023c3e: b088 sub sp, #32
  88264. 8023c40: af02 add r7, sp, #8
  88265. 8023c42: 60f8 str r0, [r7, #12]
  88266. 8023c44: 60b9 str r1, [r7, #8]
  88267. 8023c46: 607a str r2, [r7, #4]
  88268. 8023c48: 70fb strb r3, [r7, #3]
  88269. s16_t i;
  88270. LWIP_ASSERT("netif->hwaddr_len == ETH_HWADDR_LEN", netif->hwaddr_len == ETH_HWADDR_LEN);
  88271. 8023c4a: 68fb ldr r3, [r7, #12]
  88272. 8023c4c: f893 3030 ldrb.w r3, [r3, #48] @ 0x30
  88273. 8023c50: 2b06 cmp r3, #6
  88274. 8023c52: d006 beq.n 8023c62 <etharp_update_arp_entry+0x26>
  88275. 8023c54: 4b48 ldr r3, [pc, #288] @ (8023d78 <etharp_update_arp_entry+0x13c>)
  88276. 8023c56: f240 12a9 movw r2, #425 @ 0x1a9
  88277. 8023c5a: 4948 ldr r1, [pc, #288] @ (8023d7c <etharp_update_arp_entry+0x140>)
  88278. 8023c5c: 4848 ldr r0, [pc, #288] @ (8023d80 <etharp_update_arp_entry+0x144>)
  88279. 8023c5e: f005 feb5 bl 80299cc <iprintf>
  88280. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n",
  88281. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  88282. (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2],
  88283. (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5]));
  88284. /* non-unicast address? */
  88285. if (ip4_addr_isany(ipaddr) ||
  88286. 8023c62: 68bb ldr r3, [r7, #8]
  88287. 8023c64: 2b00 cmp r3, #0
  88288. 8023c66: d012 beq.n 8023c8e <etharp_update_arp_entry+0x52>
  88289. 8023c68: 68bb ldr r3, [r7, #8]
  88290. 8023c6a: 681b ldr r3, [r3, #0]
  88291. 8023c6c: 2b00 cmp r3, #0
  88292. 8023c6e: d00e beq.n 8023c8e <etharp_update_arp_entry+0x52>
  88293. ip4_addr_isbroadcast(ipaddr, netif) ||
  88294. 8023c70: 68bb ldr r3, [r7, #8]
  88295. 8023c72: 681b ldr r3, [r3, #0]
  88296. 8023c74: 68f9 ldr r1, [r7, #12]
  88297. 8023c76: 4618 mov r0, r3
  88298. 8023c78: f001 f952 bl 8024f20 <ip4_addr_isbroadcast_u32>
  88299. 8023c7c: 4603 mov r3, r0
  88300. if (ip4_addr_isany(ipaddr) ||
  88301. 8023c7e: 2b00 cmp r3, #0
  88302. 8023c80: d105 bne.n 8023c8e <etharp_update_arp_entry+0x52>
  88303. ip4_addr_ismulticast(ipaddr)) {
  88304. 8023c82: 68bb ldr r3, [r7, #8]
  88305. 8023c84: 681b ldr r3, [r3, #0]
  88306. 8023c86: f003 03f0 and.w r3, r3, #240 @ 0xf0
  88307. ip4_addr_isbroadcast(ipaddr, netif) ||
  88308. 8023c8a: 2be0 cmp r3, #224 @ 0xe0
  88309. 8023c8c: d102 bne.n 8023c94 <etharp_update_arp_entry+0x58>
  88310. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: will not add non-unicast IP address to ARP cache\n"));
  88311. return ERR_ARG;
  88312. 8023c8e: f06f 030f mvn.w r3, #15
  88313. 8023c92: e06c b.n 8023d6e <etharp_update_arp_entry+0x132>
  88314. }
  88315. /* find or create ARP entry */
  88316. i = etharp_find_entry(ipaddr, flags, netif);
  88317. 8023c94: 78fb ldrb r3, [r7, #3]
  88318. 8023c96: 68fa ldr r2, [r7, #12]
  88319. 8023c98: 4619 mov r1, r3
  88320. 8023c9a: 68b8 ldr r0, [r7, #8]
  88321. 8023c9c: f7ff fe56 bl 802394c <etharp_find_entry>
  88322. 8023ca0: 4603 mov r3, r0
  88323. 8023ca2: 82fb strh r3, [r7, #22]
  88324. /* bail out if no entry could be found */
  88325. if (i < 0) {
  88326. 8023ca4: f9b7 3016 ldrsh.w r3, [r7, #22]
  88327. 8023ca8: 2b00 cmp r3, #0
  88328. 8023caa: da02 bge.n 8023cb2 <etharp_update_arp_entry+0x76>
  88329. return (err_t)i;
  88330. 8023cac: 8afb ldrh r3, [r7, #22]
  88331. 8023cae: b25b sxtb r3, r3
  88332. 8023cb0: e05d b.n 8023d6e <etharp_update_arp_entry+0x132>
  88333. return ERR_VAL;
  88334. } else
  88335. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  88336. {
  88337. /* mark it stable */
  88338. arp_table[i].state = ETHARP_STATE_STABLE;
  88339. 8023cb2: f9b7 2016 ldrsh.w r2, [r7, #22]
  88340. 8023cb6: 4933 ldr r1, [pc, #204] @ (8023d84 <etharp_update_arp_entry+0x148>)
  88341. 8023cb8: 4613 mov r3, r2
  88342. 8023cba: 005b lsls r3, r3, #1
  88343. 8023cbc: 4413 add r3, r2
  88344. 8023cbe: 00db lsls r3, r3, #3
  88345. 8023cc0: 440b add r3, r1
  88346. 8023cc2: 3314 adds r3, #20
  88347. 8023cc4: 2202 movs r2, #2
  88348. 8023cc6: 701a strb r2, [r3, #0]
  88349. }
  88350. /* record network interface */
  88351. arp_table[i].netif = netif;
  88352. 8023cc8: f9b7 2016 ldrsh.w r2, [r7, #22]
  88353. 8023ccc: 492d ldr r1, [pc, #180] @ (8023d84 <etharp_update_arp_entry+0x148>)
  88354. 8023cce: 4613 mov r3, r2
  88355. 8023cd0: 005b lsls r3, r3, #1
  88356. 8023cd2: 4413 add r3, r2
  88357. 8023cd4: 00db lsls r3, r3, #3
  88358. 8023cd6: 440b add r3, r1
  88359. 8023cd8: 3308 adds r3, #8
  88360. 8023cda: 68fa ldr r2, [r7, #12]
  88361. 8023cdc: 601a str r2, [r3, #0]
  88362. /* insert in SNMP ARP index tree */
  88363. mib2_add_arp_entry(netif, &arp_table[i].ipaddr);
  88364. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"\n", i));
  88365. /* update address */
  88366. SMEMCPY(&arp_table[i].ethaddr, ethaddr, ETH_HWADDR_LEN);
  88367. 8023cde: f9b7 2016 ldrsh.w r2, [r7, #22]
  88368. 8023ce2: 4613 mov r3, r2
  88369. 8023ce4: 005b lsls r3, r3, #1
  88370. 8023ce6: 4413 add r3, r2
  88371. 8023ce8: 00db lsls r3, r3, #3
  88372. 8023cea: 3308 adds r3, #8
  88373. 8023cec: 4a25 ldr r2, [pc, #148] @ (8023d84 <etharp_update_arp_entry+0x148>)
  88374. 8023cee: 4413 add r3, r2
  88375. 8023cf0: 3304 adds r3, #4
  88376. 8023cf2: 2206 movs r2, #6
  88377. 8023cf4: 6879 ldr r1, [r7, #4]
  88378. 8023cf6: 4618 mov r0, r3
  88379. 8023cf8: f006 f8f1 bl 8029ede <memcpy>
  88380. /* reset time stamp */
  88381. arp_table[i].ctime = 0;
  88382. 8023cfc: f9b7 2016 ldrsh.w r2, [r7, #22]
  88383. 8023d00: 4920 ldr r1, [pc, #128] @ (8023d84 <etharp_update_arp_entry+0x148>)
  88384. 8023d02: 4613 mov r3, r2
  88385. 8023d04: 005b lsls r3, r3, #1
  88386. 8023d06: 4413 add r3, r2
  88387. 8023d08: 00db lsls r3, r3, #3
  88388. 8023d0a: 440b add r3, r1
  88389. 8023d0c: 3312 adds r3, #18
  88390. 8023d0e: 2200 movs r2, #0
  88391. 8023d10: 801a strh r2, [r3, #0]
  88392. /* get the packet pointer */
  88393. p = q->p;
  88394. /* now queue entry can be freed */
  88395. memp_free(MEMP_ARP_QUEUE, q);
  88396. #else /* ARP_QUEUEING */
  88397. if (arp_table[i].q != NULL) {
  88398. 8023d12: f9b7 2016 ldrsh.w r2, [r7, #22]
  88399. 8023d16: 491b ldr r1, [pc, #108] @ (8023d84 <etharp_update_arp_entry+0x148>)
  88400. 8023d18: 4613 mov r3, r2
  88401. 8023d1a: 005b lsls r3, r3, #1
  88402. 8023d1c: 4413 add r3, r2
  88403. 8023d1e: 00db lsls r3, r3, #3
  88404. 8023d20: 440b add r3, r1
  88405. 8023d22: 681b ldr r3, [r3, #0]
  88406. 8023d24: 2b00 cmp r3, #0
  88407. 8023d26: d021 beq.n 8023d6c <etharp_update_arp_entry+0x130>
  88408. struct pbuf *p = arp_table[i].q;
  88409. 8023d28: f9b7 2016 ldrsh.w r2, [r7, #22]
  88410. 8023d2c: 4915 ldr r1, [pc, #84] @ (8023d84 <etharp_update_arp_entry+0x148>)
  88411. 8023d2e: 4613 mov r3, r2
  88412. 8023d30: 005b lsls r3, r3, #1
  88413. 8023d32: 4413 add r3, r2
  88414. 8023d34: 00db lsls r3, r3, #3
  88415. 8023d36: 440b add r3, r1
  88416. 8023d38: 681b ldr r3, [r3, #0]
  88417. 8023d3a: 613b str r3, [r7, #16]
  88418. arp_table[i].q = NULL;
  88419. 8023d3c: f9b7 2016 ldrsh.w r2, [r7, #22]
  88420. 8023d40: 4910 ldr r1, [pc, #64] @ (8023d84 <etharp_update_arp_entry+0x148>)
  88421. 8023d42: 4613 mov r3, r2
  88422. 8023d44: 005b lsls r3, r3, #1
  88423. 8023d46: 4413 add r3, r2
  88424. 8023d48: 00db lsls r3, r3, #3
  88425. 8023d4a: 440b add r3, r1
  88426. 8023d4c: 2200 movs r2, #0
  88427. 8023d4e: 601a str r2, [r3, #0]
  88428. #endif /* ARP_QUEUEING */
  88429. /* send the queued IP packet */
  88430. ethernet_output(netif, p, (struct eth_addr *)(netif->hwaddr), ethaddr, ETHTYPE_IP);
  88431. 8023d50: 68fb ldr r3, [r7, #12]
  88432. 8023d52: f103 022a add.w r2, r3, #42 @ 0x2a
  88433. 8023d56: f44f 6300 mov.w r3, #2048 @ 0x800
  88434. 8023d5a: 9300 str r3, [sp, #0]
  88435. 8023d5c: 687b ldr r3, [r7, #4]
  88436. 8023d5e: 6939 ldr r1, [r7, #16]
  88437. 8023d60: 68f8 ldr r0, [r7, #12]
  88438. 8023d62: f002 f9bb bl 80260dc <ethernet_output>
  88439. /* free the queued IP packet */
  88440. pbuf_free(p);
  88441. 8023d66: 6938 ldr r0, [r7, #16]
  88442. 8023d68: f7f6 fbb8 bl 801a4dc <pbuf_free>
  88443. }
  88444. return ERR_OK;
  88445. 8023d6c: 2300 movs r3, #0
  88446. }
  88447. 8023d6e: 4618 mov r0, r3
  88448. 8023d70: 3718 adds r7, #24
  88449. 8023d72: 46bd mov sp, r7
  88450. 8023d74: bd80 pop {r7, pc}
  88451. 8023d76: bf00 nop
  88452. 8023d78: 080301f4 .word 0x080301f4
  88453. 8023d7c: 080302ec .word 0x080302ec
  88454. 8023d80: 0803026c .word 0x0803026c
  88455. 8023d84: 2402af20 .word 0x2402af20
  88456. 08023d88 <etharp_cleanup_netif>:
  88457. *
  88458. * @param netif points to a network interface
  88459. */
  88460. void
  88461. etharp_cleanup_netif(struct netif *netif)
  88462. {
  88463. 8023d88: b580 push {r7, lr}
  88464. 8023d8a: b084 sub sp, #16
  88465. 8023d8c: af00 add r7, sp, #0
  88466. 8023d8e: 6078 str r0, [r7, #4]
  88467. int i;
  88468. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  88469. 8023d90: 2300 movs r3, #0
  88470. 8023d92: 60fb str r3, [r7, #12]
  88471. 8023d94: e01e b.n 8023dd4 <etharp_cleanup_netif+0x4c>
  88472. u8_t state = arp_table[i].state;
  88473. 8023d96: 4913 ldr r1, [pc, #76] @ (8023de4 <etharp_cleanup_netif+0x5c>)
  88474. 8023d98: 68fa ldr r2, [r7, #12]
  88475. 8023d9a: 4613 mov r3, r2
  88476. 8023d9c: 005b lsls r3, r3, #1
  88477. 8023d9e: 4413 add r3, r2
  88478. 8023da0: 00db lsls r3, r3, #3
  88479. 8023da2: 440b add r3, r1
  88480. 8023da4: 3314 adds r3, #20
  88481. 8023da6: 781b ldrb r3, [r3, #0]
  88482. 8023da8: 72fb strb r3, [r7, #11]
  88483. if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) {
  88484. 8023daa: 7afb ldrb r3, [r7, #11]
  88485. 8023dac: 2b00 cmp r3, #0
  88486. 8023dae: d00e beq.n 8023dce <etharp_cleanup_netif+0x46>
  88487. 8023db0: 490c ldr r1, [pc, #48] @ (8023de4 <etharp_cleanup_netif+0x5c>)
  88488. 8023db2: 68fa ldr r2, [r7, #12]
  88489. 8023db4: 4613 mov r3, r2
  88490. 8023db6: 005b lsls r3, r3, #1
  88491. 8023db8: 4413 add r3, r2
  88492. 8023dba: 00db lsls r3, r3, #3
  88493. 8023dbc: 440b add r3, r1
  88494. 8023dbe: 3308 adds r3, #8
  88495. 8023dc0: 681b ldr r3, [r3, #0]
  88496. 8023dc2: 687a ldr r2, [r7, #4]
  88497. 8023dc4: 429a cmp r2, r3
  88498. 8023dc6: d102 bne.n 8023dce <etharp_cleanup_netif+0x46>
  88499. etharp_free_entry(i);
  88500. 8023dc8: 68f8 ldr r0, [r7, #12]
  88501. 8023dca: f7ff fcb7 bl 802373c <etharp_free_entry>
  88502. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  88503. 8023dce: 68fb ldr r3, [r7, #12]
  88504. 8023dd0: 3301 adds r3, #1
  88505. 8023dd2: 60fb str r3, [r7, #12]
  88506. 8023dd4: 68fb ldr r3, [r7, #12]
  88507. 8023dd6: 2b09 cmp r3, #9
  88508. 8023dd8: dddd ble.n 8023d96 <etharp_cleanup_netif+0xe>
  88509. }
  88510. }
  88511. }
  88512. 8023dda: bf00 nop
  88513. 8023ddc: bf00 nop
  88514. 8023dde: 3710 adds r7, #16
  88515. 8023de0: 46bd mov sp, r7
  88516. 8023de2: bd80 pop {r7, pc}
  88517. 8023de4: 2402af20 .word 0x2402af20
  88518. 08023de8 <etharp_input>:
  88519. *
  88520. * @see pbuf_free()
  88521. */
  88522. void
  88523. etharp_input(struct pbuf *p, struct netif *netif)
  88524. {
  88525. 8023de8: b5b0 push {r4, r5, r7, lr}
  88526. 8023dea: b08a sub sp, #40 @ 0x28
  88527. 8023dec: af04 add r7, sp, #16
  88528. 8023dee: 6078 str r0, [r7, #4]
  88529. 8023df0: 6039 str r1, [r7, #0]
  88530. struct etharp_hdr *hdr;
  88531. /* these are aligned properly, whereas the ARP header fields might not be */
  88532. ip4_addr_t sipaddr, dipaddr;
  88533. u8_t for_us;
  88534. LWIP_ASSERT_CORE_LOCKED();
  88535. 8023df2: f7ec fb9d bl 8010530 <sys_check_core_locking>
  88536. LWIP_ERROR("netif != NULL", (netif != NULL), return;);
  88537. 8023df6: 683b ldr r3, [r7, #0]
  88538. 8023df8: 2b00 cmp r3, #0
  88539. 8023dfa: d107 bne.n 8023e0c <etharp_input+0x24>
  88540. 8023dfc: 4b3f ldr r3, [pc, #252] @ (8023efc <etharp_input+0x114>)
  88541. 8023dfe: f240 228a movw r2, #650 @ 0x28a
  88542. 8023e02: 493f ldr r1, [pc, #252] @ (8023f00 <etharp_input+0x118>)
  88543. 8023e04: 483f ldr r0, [pc, #252] @ (8023f04 <etharp_input+0x11c>)
  88544. 8023e06: f005 fde1 bl 80299cc <iprintf>
  88545. 8023e0a: e074 b.n 8023ef6 <etharp_input+0x10e>
  88546. hdr = (struct etharp_hdr *)p->payload;
  88547. 8023e0c: 687b ldr r3, [r7, #4]
  88548. 8023e0e: 685b ldr r3, [r3, #4]
  88549. 8023e10: 617b str r3, [r7, #20]
  88550. /* RFC 826 "Packet Reception": */
  88551. if ((hdr->hwtype != PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET)) ||
  88552. 8023e12: 697b ldr r3, [r7, #20]
  88553. 8023e14: 881b ldrh r3, [r3, #0]
  88554. 8023e16: b29b uxth r3, r3
  88555. 8023e18: f5b3 7f80 cmp.w r3, #256 @ 0x100
  88556. 8023e1c: d10c bne.n 8023e38 <etharp_input+0x50>
  88557. (hdr->hwlen != ETH_HWADDR_LEN) ||
  88558. 8023e1e: 697b ldr r3, [r7, #20]
  88559. 8023e20: 791b ldrb r3, [r3, #4]
  88560. if ((hdr->hwtype != PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET)) ||
  88561. 8023e22: 2b06 cmp r3, #6
  88562. 8023e24: d108 bne.n 8023e38 <etharp_input+0x50>
  88563. (hdr->protolen != sizeof(ip4_addr_t)) ||
  88564. 8023e26: 697b ldr r3, [r7, #20]
  88565. 8023e28: 795b ldrb r3, [r3, #5]
  88566. (hdr->hwlen != ETH_HWADDR_LEN) ||
  88567. 8023e2a: 2b04 cmp r3, #4
  88568. 8023e2c: d104 bne.n 8023e38 <etharp_input+0x50>
  88569. (hdr->proto != PP_HTONS(ETHTYPE_IP))) {
  88570. 8023e2e: 697b ldr r3, [r7, #20]
  88571. 8023e30: 885b ldrh r3, [r3, #2]
  88572. 8023e32: b29b uxth r3, r3
  88573. (hdr->protolen != sizeof(ip4_addr_t)) ||
  88574. 8023e34: 2b08 cmp r3, #8
  88575. 8023e36: d003 beq.n 8023e40 <etharp_input+0x58>
  88576. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
  88577. ("etharp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F")\n",
  88578. hdr->hwtype, (u16_t)hdr->hwlen, hdr->proto, (u16_t)hdr->protolen));
  88579. ETHARP_STATS_INC(etharp.proterr);
  88580. ETHARP_STATS_INC(etharp.drop);
  88581. pbuf_free(p);
  88582. 8023e38: 6878 ldr r0, [r7, #4]
  88583. 8023e3a: f7f6 fb4f bl 801a4dc <pbuf_free>
  88584. return;
  88585. 8023e3e: e05a b.n 8023ef6 <etharp_input+0x10e>
  88586. autoip_arp_reply(netif, hdr);
  88587. #endif /* LWIP_AUTOIP */
  88588. /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without
  88589. * structure packing (not using structure copy which breaks strict-aliasing rules). */
  88590. IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr);
  88591. 8023e40: 697b ldr r3, [r7, #20]
  88592. 8023e42: 330e adds r3, #14
  88593. 8023e44: 681b ldr r3, [r3, #0]
  88594. 8023e46: 60fb str r3, [r7, #12]
  88595. IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&dipaddr, &hdr->dipaddr);
  88596. 8023e48: 697b ldr r3, [r7, #20]
  88597. 8023e4a: 3318 adds r3, #24
  88598. 8023e4c: 681b ldr r3, [r3, #0]
  88599. 8023e4e: 60bb str r3, [r7, #8]
  88600. /* this interface is not configured? */
  88601. if (ip4_addr_isany_val(*netif_ip4_addr(netif))) {
  88602. 8023e50: 683b ldr r3, [r7, #0]
  88603. 8023e52: 3304 adds r3, #4
  88604. 8023e54: 681b ldr r3, [r3, #0]
  88605. 8023e56: 2b00 cmp r3, #0
  88606. 8023e58: d102 bne.n 8023e60 <etharp_input+0x78>
  88607. for_us = 0;
  88608. 8023e5a: 2300 movs r3, #0
  88609. 8023e5c: 74fb strb r3, [r7, #19]
  88610. 8023e5e: e009 b.n 8023e74 <etharp_input+0x8c>
  88611. } else {
  88612. /* ARP packet directed to us? */
  88613. for_us = (u8_t)ip4_addr_cmp(&dipaddr, netif_ip4_addr(netif));
  88614. 8023e60: 68ba ldr r2, [r7, #8]
  88615. 8023e62: 683b ldr r3, [r7, #0]
  88616. 8023e64: 3304 adds r3, #4
  88617. 8023e66: 681b ldr r3, [r3, #0]
  88618. 8023e68: 429a cmp r2, r3
  88619. 8023e6a: bf0c ite eq
  88620. 8023e6c: 2301 moveq r3, #1
  88621. 8023e6e: 2300 movne r3, #0
  88622. 8023e70: b2db uxtb r3, r3
  88623. 8023e72: 74fb strb r3, [r7, #19]
  88624. /* ARP message directed to us?
  88625. -> add IP address in ARP cache; assume requester wants to talk to us,
  88626. can result in directly sending the queued packets for this host.
  88627. ARP message not directed to us?
  88628. -> update the source IP address in the cache, if present */
  88629. etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
  88630. 8023e74: 697b ldr r3, [r7, #20]
  88631. 8023e76: f103 0208 add.w r2, r3, #8
  88632. 8023e7a: 7cfb ldrb r3, [r7, #19]
  88633. 8023e7c: 2b00 cmp r3, #0
  88634. 8023e7e: d001 beq.n 8023e84 <etharp_input+0x9c>
  88635. 8023e80: 2301 movs r3, #1
  88636. 8023e82: e000 b.n 8023e86 <etharp_input+0x9e>
  88637. 8023e84: 2302 movs r3, #2
  88638. 8023e86: f107 010c add.w r1, r7, #12
  88639. 8023e8a: 6838 ldr r0, [r7, #0]
  88640. 8023e8c: f7ff fed6 bl 8023c3c <etharp_update_arp_entry>
  88641. for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY);
  88642. /* now act on the message itself */
  88643. switch (hdr->opcode) {
  88644. 8023e90: 697b ldr r3, [r7, #20]
  88645. 8023e92: 88db ldrh r3, [r3, #6]
  88646. 8023e94: b29b uxth r3, r3
  88647. 8023e96: f5b3 7f80 cmp.w r3, #256 @ 0x100
  88648. 8023e9a: d003 beq.n 8023ea4 <etharp_input+0xbc>
  88649. 8023e9c: f5b3 7f00 cmp.w r3, #512 @ 0x200
  88650. 8023ea0: d01e beq.n 8023ee0 <etharp_input+0xf8>
  88651. #endif /* (LWIP_DHCP && DHCP_DOES_ARP_CHECK) */
  88652. break;
  88653. default:
  88654. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP unknown opcode type %"S16_F"\n", lwip_htons(hdr->opcode)));
  88655. ETHARP_STATS_INC(etharp.err);
  88656. break;
  88657. 8023ea2: e025 b.n 8023ef0 <etharp_input+0x108>
  88658. if (for_us) {
  88659. 8023ea4: 7cfb ldrb r3, [r7, #19]
  88660. 8023ea6: 2b00 cmp r3, #0
  88661. 8023ea8: d021 beq.n 8023eee <etharp_input+0x106>
  88662. (struct eth_addr *)netif->hwaddr, &hdr->shwaddr,
  88663. 8023eaa: 683b ldr r3, [r7, #0]
  88664. 8023eac: f103 002a add.w r0, r3, #42 @ 0x2a
  88665. 8023eb0: 697b ldr r3, [r7, #20]
  88666. 8023eb2: f103 0408 add.w r4, r3, #8
  88667. (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif),
  88668. 8023eb6: 683b ldr r3, [r7, #0]
  88669. 8023eb8: f103 052a add.w r5, r3, #42 @ 0x2a
  88670. 8023ebc: 683b ldr r3, [r7, #0]
  88671. 8023ebe: 3304 adds r3, #4
  88672. &hdr->shwaddr, &sipaddr,
  88673. 8023ec0: 697a ldr r2, [r7, #20]
  88674. 8023ec2: 3208 adds r2, #8
  88675. etharp_raw(netif,
  88676. 8023ec4: 2102 movs r1, #2
  88677. 8023ec6: 9103 str r1, [sp, #12]
  88678. 8023ec8: f107 010c add.w r1, r7, #12
  88679. 8023ecc: 9102 str r1, [sp, #8]
  88680. 8023ece: 9201 str r2, [sp, #4]
  88681. 8023ed0: 9300 str r3, [sp, #0]
  88682. 8023ed2: 462b mov r3, r5
  88683. 8023ed4: 4622 mov r2, r4
  88684. 8023ed6: 4601 mov r1, r0
  88685. 8023ed8: 6838 ldr r0, [r7, #0]
  88686. 8023eda: f000 faf1 bl 80244c0 <etharp_raw>
  88687. break;
  88688. 8023ede: e006 b.n 8023eee <etharp_input+0x106>
  88689. dhcp_arp_reply(netif, &sipaddr);
  88690. 8023ee0: f107 030c add.w r3, r7, #12
  88691. 8023ee4: 4619 mov r1, r3
  88692. 8023ee6: 6838 ldr r0, [r7, #0]
  88693. 8023ee8: f7fe f9b6 bl 8022258 <dhcp_arp_reply>
  88694. break;
  88695. 8023eec: e000 b.n 8023ef0 <etharp_input+0x108>
  88696. break;
  88697. 8023eee: bf00 nop
  88698. }
  88699. /* free ARP packet */
  88700. pbuf_free(p);
  88701. 8023ef0: 6878 ldr r0, [r7, #4]
  88702. 8023ef2: f7f6 faf3 bl 801a4dc <pbuf_free>
  88703. }
  88704. 8023ef6: 3718 adds r7, #24
  88705. 8023ef8: 46bd mov sp, r7
  88706. 8023efa: bdb0 pop {r4, r5, r7, pc}
  88707. 8023efc: 080301f4 .word 0x080301f4
  88708. 8023f00: 08030344 .word 0x08030344
  88709. 8023f04: 0803026c .word 0x0803026c
  88710. 08023f08 <etharp_output_to_arp_index>:
  88711. /** Just a small helper function that sends a pbuf to an ethernet address
  88712. * in the arp_table specified by the index 'arp_idx'.
  88713. */
  88714. static err_t
  88715. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, netif_addr_idx_t arp_idx)
  88716. {
  88717. 8023f08: b580 push {r7, lr}
  88718. 8023f0a: b086 sub sp, #24
  88719. 8023f0c: af02 add r7, sp, #8
  88720. 8023f0e: 60f8 str r0, [r7, #12]
  88721. 8023f10: 60b9 str r1, [r7, #8]
  88722. 8023f12: 4613 mov r3, r2
  88723. 8023f14: 71fb strb r3, [r7, #7]
  88724. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  88725. 8023f16: 79fa ldrb r2, [r7, #7]
  88726. 8023f18: 4944 ldr r1, [pc, #272] @ (802402c <etharp_output_to_arp_index+0x124>)
  88727. 8023f1a: 4613 mov r3, r2
  88728. 8023f1c: 005b lsls r3, r3, #1
  88729. 8023f1e: 4413 add r3, r2
  88730. 8023f20: 00db lsls r3, r3, #3
  88731. 8023f22: 440b add r3, r1
  88732. 8023f24: 3314 adds r3, #20
  88733. 8023f26: 781b ldrb r3, [r3, #0]
  88734. 8023f28: 2b01 cmp r3, #1
  88735. 8023f2a: d806 bhi.n 8023f3a <etharp_output_to_arp_index+0x32>
  88736. 8023f2c: 4b40 ldr r3, [pc, #256] @ (8024030 <etharp_output_to_arp_index+0x128>)
  88737. 8023f2e: f240 22ee movw r2, #750 @ 0x2ee
  88738. 8023f32: 4940 ldr r1, [pc, #256] @ (8024034 <etharp_output_to_arp_index+0x12c>)
  88739. 8023f34: 4840 ldr r0, [pc, #256] @ (8024038 <etharp_output_to_arp_index+0x130>)
  88740. 8023f36: f005 fd49 bl 80299cc <iprintf>
  88741. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  88742. /* if arp table entry is about to expire: re-request it,
  88743. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  88744. network with ARP requests if this address is used frequently. */
  88745. if (arp_table[arp_idx].state == ETHARP_STATE_STABLE) {
  88746. 8023f3a: 79fa ldrb r2, [r7, #7]
  88747. 8023f3c: 493b ldr r1, [pc, #236] @ (802402c <etharp_output_to_arp_index+0x124>)
  88748. 8023f3e: 4613 mov r3, r2
  88749. 8023f40: 005b lsls r3, r3, #1
  88750. 8023f42: 4413 add r3, r2
  88751. 8023f44: 00db lsls r3, r3, #3
  88752. 8023f46: 440b add r3, r1
  88753. 8023f48: 3314 adds r3, #20
  88754. 8023f4a: 781b ldrb r3, [r3, #0]
  88755. 8023f4c: 2b02 cmp r3, #2
  88756. 8023f4e: d153 bne.n 8023ff8 <etharp_output_to_arp_index+0xf0>
  88757. if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_BROADCAST) {
  88758. 8023f50: 79fa ldrb r2, [r7, #7]
  88759. 8023f52: 4936 ldr r1, [pc, #216] @ (802402c <etharp_output_to_arp_index+0x124>)
  88760. 8023f54: 4613 mov r3, r2
  88761. 8023f56: 005b lsls r3, r3, #1
  88762. 8023f58: 4413 add r3, r2
  88763. 8023f5a: 00db lsls r3, r3, #3
  88764. 8023f5c: 440b add r3, r1
  88765. 8023f5e: 3312 adds r3, #18
  88766. 8023f60: 881b ldrh r3, [r3, #0]
  88767. 8023f62: f5b3 7f8e cmp.w r3, #284 @ 0x11c
  88768. 8023f66: d919 bls.n 8023f9c <etharp_output_to_arp_index+0x94>
  88769. /* issue a standard request using broadcast */
  88770. if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) {
  88771. 8023f68: 79fa ldrb r2, [r7, #7]
  88772. 8023f6a: 4613 mov r3, r2
  88773. 8023f6c: 005b lsls r3, r3, #1
  88774. 8023f6e: 4413 add r3, r2
  88775. 8023f70: 00db lsls r3, r3, #3
  88776. 8023f72: 4a2e ldr r2, [pc, #184] @ (802402c <etharp_output_to_arp_index+0x124>)
  88777. 8023f74: 4413 add r3, r2
  88778. 8023f76: 3304 adds r3, #4
  88779. 8023f78: 4619 mov r1, r3
  88780. 8023f7a: 68f8 ldr r0, [r7, #12]
  88781. 8023f7c: f000 fb4e bl 802461c <etharp_request>
  88782. 8023f80: 4603 mov r3, r0
  88783. 8023f82: 2b00 cmp r3, #0
  88784. 8023f84: d138 bne.n 8023ff8 <etharp_output_to_arp_index+0xf0>
  88785. arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1;
  88786. 8023f86: 79fa ldrb r2, [r7, #7]
  88787. 8023f88: 4928 ldr r1, [pc, #160] @ (802402c <etharp_output_to_arp_index+0x124>)
  88788. 8023f8a: 4613 mov r3, r2
  88789. 8023f8c: 005b lsls r3, r3, #1
  88790. 8023f8e: 4413 add r3, r2
  88791. 8023f90: 00db lsls r3, r3, #3
  88792. 8023f92: 440b add r3, r1
  88793. 8023f94: 3314 adds r3, #20
  88794. 8023f96: 2203 movs r2, #3
  88795. 8023f98: 701a strb r2, [r3, #0]
  88796. 8023f9a: e02d b.n 8023ff8 <etharp_output_to_arp_index+0xf0>
  88797. }
  88798. } else if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_UNICAST) {
  88799. 8023f9c: 79fa ldrb r2, [r7, #7]
  88800. 8023f9e: 4923 ldr r1, [pc, #140] @ (802402c <etharp_output_to_arp_index+0x124>)
  88801. 8023fa0: 4613 mov r3, r2
  88802. 8023fa2: 005b lsls r3, r3, #1
  88803. 8023fa4: 4413 add r3, r2
  88804. 8023fa6: 00db lsls r3, r3, #3
  88805. 8023fa8: 440b add r3, r1
  88806. 8023faa: 3312 adds r3, #18
  88807. 8023fac: 881b ldrh r3, [r3, #0]
  88808. 8023fae: f5b3 7f87 cmp.w r3, #270 @ 0x10e
  88809. 8023fb2: d321 bcc.n 8023ff8 <etharp_output_to_arp_index+0xf0>
  88810. /* issue a unicast request (for 15 seconds) to prevent unnecessary broadcast */
  88811. if (etharp_request_dst(netif, &arp_table[arp_idx].ipaddr, &arp_table[arp_idx].ethaddr) == ERR_OK) {
  88812. 8023fb4: 79fa ldrb r2, [r7, #7]
  88813. 8023fb6: 4613 mov r3, r2
  88814. 8023fb8: 005b lsls r3, r3, #1
  88815. 8023fba: 4413 add r3, r2
  88816. 8023fbc: 00db lsls r3, r3, #3
  88817. 8023fbe: 4a1b ldr r2, [pc, #108] @ (802402c <etharp_output_to_arp_index+0x124>)
  88818. 8023fc0: 4413 add r3, r2
  88819. 8023fc2: 1d19 adds r1, r3, #4
  88820. 8023fc4: 79fa ldrb r2, [r7, #7]
  88821. 8023fc6: 4613 mov r3, r2
  88822. 8023fc8: 005b lsls r3, r3, #1
  88823. 8023fca: 4413 add r3, r2
  88824. 8023fcc: 00db lsls r3, r3, #3
  88825. 8023fce: 3308 adds r3, #8
  88826. 8023fd0: 4a16 ldr r2, [pc, #88] @ (802402c <etharp_output_to_arp_index+0x124>)
  88827. 8023fd2: 4413 add r3, r2
  88828. 8023fd4: 3304 adds r3, #4
  88829. 8023fd6: 461a mov r2, r3
  88830. 8023fd8: 68f8 ldr r0, [r7, #12]
  88831. 8023fda: f000 fafd bl 80245d8 <etharp_request_dst>
  88832. 8023fde: 4603 mov r3, r0
  88833. 8023fe0: 2b00 cmp r3, #0
  88834. 8023fe2: d109 bne.n 8023ff8 <etharp_output_to_arp_index+0xf0>
  88835. arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1;
  88836. 8023fe4: 79fa ldrb r2, [r7, #7]
  88837. 8023fe6: 4911 ldr r1, [pc, #68] @ (802402c <etharp_output_to_arp_index+0x124>)
  88838. 8023fe8: 4613 mov r3, r2
  88839. 8023fea: 005b lsls r3, r3, #1
  88840. 8023fec: 4413 add r3, r2
  88841. 8023fee: 00db lsls r3, r3, #3
  88842. 8023ff0: 440b add r3, r1
  88843. 8023ff2: 3314 adds r3, #20
  88844. 8023ff4: 2203 movs r2, #3
  88845. 8023ff6: 701a strb r2, [r3, #0]
  88846. }
  88847. }
  88848. }
  88849. return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), &arp_table[arp_idx].ethaddr, ETHTYPE_IP);
  88850. 8023ff8: 68fb ldr r3, [r7, #12]
  88851. 8023ffa: f103 012a add.w r1, r3, #42 @ 0x2a
  88852. 8023ffe: 79fa ldrb r2, [r7, #7]
  88853. 8024000: 4613 mov r3, r2
  88854. 8024002: 005b lsls r3, r3, #1
  88855. 8024004: 4413 add r3, r2
  88856. 8024006: 00db lsls r3, r3, #3
  88857. 8024008: 3308 adds r3, #8
  88858. 802400a: 4a08 ldr r2, [pc, #32] @ (802402c <etharp_output_to_arp_index+0x124>)
  88859. 802400c: 4413 add r3, r2
  88860. 802400e: 3304 adds r3, #4
  88861. 8024010: f44f 6200 mov.w r2, #2048 @ 0x800
  88862. 8024014: 9200 str r2, [sp, #0]
  88863. 8024016: 460a mov r2, r1
  88864. 8024018: 68b9 ldr r1, [r7, #8]
  88865. 802401a: 68f8 ldr r0, [r7, #12]
  88866. 802401c: f002 f85e bl 80260dc <ethernet_output>
  88867. 8024020: 4603 mov r3, r0
  88868. }
  88869. 8024022: 4618 mov r0, r3
  88870. 8024024: 3710 adds r7, #16
  88871. 8024026: 46bd mov sp, r7
  88872. 8024028: bd80 pop {r7, pc}
  88873. 802402a: bf00 nop
  88874. 802402c: 2402af20 .word 0x2402af20
  88875. 8024030: 080301f4 .word 0x080301f4
  88876. 8024034: 08030364 .word 0x08030364
  88877. 8024038: 0803026c .word 0x0803026c
  88878. 0802403c <etharp_output>:
  88879. * - ERR_RTE No route to destination (no gateway to external networks),
  88880. * or the return type of either etharp_query() or ethernet_output().
  88881. */
  88882. err_t
  88883. etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr)
  88884. {
  88885. 802403c: b580 push {r7, lr}
  88886. 802403e: b08a sub sp, #40 @ 0x28
  88887. 8024040: af02 add r7, sp, #8
  88888. 8024042: 60f8 str r0, [r7, #12]
  88889. 8024044: 60b9 str r1, [r7, #8]
  88890. 8024046: 607a str r2, [r7, #4]
  88891. const struct eth_addr *dest;
  88892. struct eth_addr mcastaddr;
  88893. const ip4_addr_t *dst_addr = ipaddr;
  88894. 8024048: 687b ldr r3, [r7, #4]
  88895. 802404a: 61bb str r3, [r7, #24]
  88896. LWIP_ASSERT_CORE_LOCKED();
  88897. 802404c: f7ec fa70 bl 8010530 <sys_check_core_locking>
  88898. LWIP_ASSERT("netif != NULL", netif != NULL);
  88899. 8024050: 68fb ldr r3, [r7, #12]
  88900. 8024052: 2b00 cmp r3, #0
  88901. 8024054: d106 bne.n 8024064 <etharp_output+0x28>
  88902. 8024056: 4b73 ldr r3, [pc, #460] @ (8024224 <etharp_output+0x1e8>)
  88903. 8024058: f240 321e movw r2, #798 @ 0x31e
  88904. 802405c: 4972 ldr r1, [pc, #456] @ (8024228 <etharp_output+0x1ec>)
  88905. 802405e: 4873 ldr r0, [pc, #460] @ (802422c <etharp_output+0x1f0>)
  88906. 8024060: f005 fcb4 bl 80299cc <iprintf>
  88907. LWIP_ASSERT("q != NULL", q != NULL);
  88908. 8024064: 68bb ldr r3, [r7, #8]
  88909. 8024066: 2b00 cmp r3, #0
  88910. 8024068: d106 bne.n 8024078 <etharp_output+0x3c>
  88911. 802406a: 4b6e ldr r3, [pc, #440] @ (8024224 <etharp_output+0x1e8>)
  88912. 802406c: f240 321f movw r2, #799 @ 0x31f
  88913. 8024070: 496f ldr r1, [pc, #444] @ (8024230 <etharp_output+0x1f4>)
  88914. 8024072: 486e ldr r0, [pc, #440] @ (802422c <etharp_output+0x1f0>)
  88915. 8024074: f005 fcaa bl 80299cc <iprintf>
  88916. LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
  88917. 8024078: 687b ldr r3, [r7, #4]
  88918. 802407a: 2b00 cmp r3, #0
  88919. 802407c: d106 bne.n 802408c <etharp_output+0x50>
  88920. 802407e: 4b69 ldr r3, [pc, #420] @ (8024224 <etharp_output+0x1e8>)
  88921. 8024080: f44f 7248 mov.w r2, #800 @ 0x320
  88922. 8024084: 496b ldr r1, [pc, #428] @ (8024234 <etharp_output+0x1f8>)
  88923. 8024086: 4869 ldr r0, [pc, #420] @ (802422c <etharp_output+0x1f0>)
  88924. 8024088: f005 fca0 bl 80299cc <iprintf>
  88925. /* Determine on destination hardware address. Broadcasts and multicasts
  88926. * are special, other IP addresses are looked up in the ARP table. */
  88927. /* broadcast destination IP address? */
  88928. if (ip4_addr_isbroadcast(ipaddr, netif)) {
  88929. 802408c: 687b ldr r3, [r7, #4]
  88930. 802408e: 681b ldr r3, [r3, #0]
  88931. 8024090: 68f9 ldr r1, [r7, #12]
  88932. 8024092: 4618 mov r0, r3
  88933. 8024094: f000 ff44 bl 8024f20 <ip4_addr_isbroadcast_u32>
  88934. 8024098: 4603 mov r3, r0
  88935. 802409a: 2b00 cmp r3, #0
  88936. 802409c: d002 beq.n 80240a4 <etharp_output+0x68>
  88937. /* broadcast on Ethernet also */
  88938. dest = (const struct eth_addr *)&ethbroadcast;
  88939. 802409e: 4b66 ldr r3, [pc, #408] @ (8024238 <etharp_output+0x1fc>)
  88940. 80240a0: 61fb str r3, [r7, #28]
  88941. 80240a2: e0af b.n 8024204 <etharp_output+0x1c8>
  88942. /* multicast destination IP address? */
  88943. } else if (ip4_addr_ismulticast(ipaddr)) {
  88944. 80240a4: 687b ldr r3, [r7, #4]
  88945. 80240a6: 681b ldr r3, [r3, #0]
  88946. 80240a8: f003 03f0 and.w r3, r3, #240 @ 0xf0
  88947. 80240ac: 2be0 cmp r3, #224 @ 0xe0
  88948. 80240ae: d118 bne.n 80240e2 <etharp_output+0xa6>
  88949. /* Hash IP multicast address to MAC address.*/
  88950. mcastaddr.addr[0] = LL_IP4_MULTICAST_ADDR_0;
  88951. 80240b0: 2301 movs r3, #1
  88952. 80240b2: 743b strb r3, [r7, #16]
  88953. mcastaddr.addr[1] = LL_IP4_MULTICAST_ADDR_1;
  88954. 80240b4: 2300 movs r3, #0
  88955. 80240b6: 747b strb r3, [r7, #17]
  88956. mcastaddr.addr[2] = LL_IP4_MULTICAST_ADDR_2;
  88957. 80240b8: 235e movs r3, #94 @ 0x5e
  88958. 80240ba: 74bb strb r3, [r7, #18]
  88959. mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
  88960. 80240bc: 687b ldr r3, [r7, #4]
  88961. 80240be: 3301 adds r3, #1
  88962. 80240c0: 781b ldrb r3, [r3, #0]
  88963. 80240c2: f003 037f and.w r3, r3, #127 @ 0x7f
  88964. 80240c6: b2db uxtb r3, r3
  88965. 80240c8: 74fb strb r3, [r7, #19]
  88966. mcastaddr.addr[4] = ip4_addr3(ipaddr);
  88967. 80240ca: 687b ldr r3, [r7, #4]
  88968. 80240cc: 3302 adds r3, #2
  88969. 80240ce: 781b ldrb r3, [r3, #0]
  88970. 80240d0: 753b strb r3, [r7, #20]
  88971. mcastaddr.addr[5] = ip4_addr4(ipaddr);
  88972. 80240d2: 687b ldr r3, [r7, #4]
  88973. 80240d4: 3303 adds r3, #3
  88974. 80240d6: 781b ldrb r3, [r3, #0]
  88975. 80240d8: 757b strb r3, [r7, #21]
  88976. /* destination Ethernet address is multicast */
  88977. dest = &mcastaddr;
  88978. 80240da: f107 0310 add.w r3, r7, #16
  88979. 80240de: 61fb str r3, [r7, #28]
  88980. 80240e0: e090 b.n 8024204 <etharp_output+0x1c8>
  88981. /* unicast destination IP address? */
  88982. } else {
  88983. netif_addr_idx_t i;
  88984. /* outside local network? if so, this can neither be a global broadcast nor
  88985. a subnet broadcast. */
  88986. if (!ip4_addr_netcmp(ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) &&
  88987. 80240e2: 687b ldr r3, [r7, #4]
  88988. 80240e4: 681a ldr r2, [r3, #0]
  88989. 80240e6: 68fb ldr r3, [r7, #12]
  88990. 80240e8: 3304 adds r3, #4
  88991. 80240ea: 681b ldr r3, [r3, #0]
  88992. 80240ec: 405a eors r2, r3
  88993. 80240ee: 68fb ldr r3, [r7, #12]
  88994. 80240f0: 3308 adds r3, #8
  88995. 80240f2: 681b ldr r3, [r3, #0]
  88996. 80240f4: 4013 ands r3, r2
  88997. 80240f6: 2b00 cmp r3, #0
  88998. 80240f8: d012 beq.n 8024120 <etharp_output+0xe4>
  88999. !ip4_addr_islinklocal(ipaddr)) {
  89000. 80240fa: 687b ldr r3, [r7, #4]
  89001. 80240fc: 681b ldr r3, [r3, #0]
  89002. 80240fe: b29b uxth r3, r3
  89003. if (!ip4_addr_netcmp(ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) &&
  89004. 8024100: f64f 62a9 movw r2, #65193 @ 0xfea9
  89005. 8024104: 4293 cmp r3, r2
  89006. 8024106: d00b beq.n 8024120 <etharp_output+0xe4>
  89007. dst_addr = LWIP_HOOK_ETHARP_GET_GW(netif, ipaddr);
  89008. if (dst_addr == NULL)
  89009. #endif /* LWIP_HOOK_ETHARP_GET_GW */
  89010. {
  89011. /* interface has default gateway? */
  89012. if (!ip4_addr_isany_val(*netif_ip4_gw(netif))) {
  89013. 8024108: 68fb ldr r3, [r7, #12]
  89014. 802410a: 330c adds r3, #12
  89015. 802410c: 681b ldr r3, [r3, #0]
  89016. 802410e: 2b00 cmp r3, #0
  89017. 8024110: d003 beq.n 802411a <etharp_output+0xde>
  89018. /* send to hardware address of default gateway IP address */
  89019. dst_addr = netif_ip4_gw(netif);
  89020. 8024112: 68fb ldr r3, [r7, #12]
  89021. 8024114: 330c adds r3, #12
  89022. 8024116: 61bb str r3, [r7, #24]
  89023. 8024118: e002 b.n 8024120 <etharp_output+0xe4>
  89024. /* no default gateway available */
  89025. } else {
  89026. /* no route to destination error (default gateway missing) */
  89027. return ERR_RTE;
  89028. 802411a: f06f 0303 mvn.w r3, #3
  89029. 802411e: e07d b.n 802421c <etharp_output+0x1e0>
  89030. if (netif->hints != NULL) {
  89031. /* per-pcb cached entry was given */
  89032. netif_addr_idx_t etharp_cached_entry = netif->hints->addr_hint;
  89033. if (etharp_cached_entry < ARP_TABLE_SIZE) {
  89034. #endif /* LWIP_NETIF_HWADDRHINT */
  89035. if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
  89036. 8024120: 4b46 ldr r3, [pc, #280] @ (802423c <etharp_output+0x200>)
  89037. 8024122: 781b ldrb r3, [r3, #0]
  89038. 8024124: 4619 mov r1, r3
  89039. 8024126: 4a46 ldr r2, [pc, #280] @ (8024240 <etharp_output+0x204>)
  89040. 8024128: 460b mov r3, r1
  89041. 802412a: 005b lsls r3, r3, #1
  89042. 802412c: 440b add r3, r1
  89043. 802412e: 00db lsls r3, r3, #3
  89044. 8024130: 4413 add r3, r2
  89045. 8024132: 3314 adds r3, #20
  89046. 8024134: 781b ldrb r3, [r3, #0]
  89047. 8024136: 2b01 cmp r3, #1
  89048. 8024138: d925 bls.n 8024186 <etharp_output+0x14a>
  89049. #if ETHARP_TABLE_MATCH_NETIF
  89050. (arp_table[etharp_cached_entry].netif == netif) &&
  89051. 802413a: 4b40 ldr r3, [pc, #256] @ (802423c <etharp_output+0x200>)
  89052. 802413c: 781b ldrb r3, [r3, #0]
  89053. 802413e: 4619 mov r1, r3
  89054. 8024140: 4a3f ldr r2, [pc, #252] @ (8024240 <etharp_output+0x204>)
  89055. 8024142: 460b mov r3, r1
  89056. 8024144: 005b lsls r3, r3, #1
  89057. 8024146: 440b add r3, r1
  89058. 8024148: 00db lsls r3, r3, #3
  89059. 802414a: 4413 add r3, r2
  89060. 802414c: 3308 adds r3, #8
  89061. 802414e: 681b ldr r3, [r3, #0]
  89062. if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
  89063. 8024150: 68fa ldr r2, [r7, #12]
  89064. 8024152: 429a cmp r2, r3
  89065. 8024154: d117 bne.n 8024186 <etharp_output+0x14a>
  89066. #endif
  89067. (ip4_addr_cmp(dst_addr, &arp_table[etharp_cached_entry].ipaddr))) {
  89068. 8024156: 69bb ldr r3, [r7, #24]
  89069. 8024158: 681a ldr r2, [r3, #0]
  89070. 802415a: 4b38 ldr r3, [pc, #224] @ (802423c <etharp_output+0x200>)
  89071. 802415c: 781b ldrb r3, [r3, #0]
  89072. 802415e: 4618 mov r0, r3
  89073. 8024160: 4937 ldr r1, [pc, #220] @ (8024240 <etharp_output+0x204>)
  89074. 8024162: 4603 mov r3, r0
  89075. 8024164: 005b lsls r3, r3, #1
  89076. 8024166: 4403 add r3, r0
  89077. 8024168: 00db lsls r3, r3, #3
  89078. 802416a: 440b add r3, r1
  89079. 802416c: 3304 adds r3, #4
  89080. 802416e: 681b ldr r3, [r3, #0]
  89081. (arp_table[etharp_cached_entry].netif == netif) &&
  89082. 8024170: 429a cmp r2, r3
  89083. 8024172: d108 bne.n 8024186 <etharp_output+0x14a>
  89084. /* the per-pcb-cached entry is stable and the right one! */
  89085. ETHARP_STATS_INC(etharp.cachehit);
  89086. return etharp_output_to_arp_index(netif, q, etharp_cached_entry);
  89087. 8024174: 4b31 ldr r3, [pc, #196] @ (802423c <etharp_output+0x200>)
  89088. 8024176: 781b ldrb r3, [r3, #0]
  89089. 8024178: 461a mov r2, r3
  89090. 802417a: 68b9 ldr r1, [r7, #8]
  89091. 802417c: 68f8 ldr r0, [r7, #12]
  89092. 802417e: f7ff fec3 bl 8023f08 <etharp_output_to_arp_index>
  89093. 8024182: 4603 mov r3, r0
  89094. 8024184: e04a b.n 802421c <etharp_output+0x1e0>
  89095. }
  89096. #endif /* LWIP_NETIF_HWADDRHINT */
  89097. /* find stable entry: do this here since this is a critical path for
  89098. throughput and etharp_find_entry() is kind of slow */
  89099. for (i = 0; i < ARP_TABLE_SIZE; i++) {
  89100. 8024186: 2300 movs r3, #0
  89101. 8024188: 75fb strb r3, [r7, #23]
  89102. 802418a: e031 b.n 80241f0 <etharp_output+0x1b4>
  89103. if ((arp_table[i].state >= ETHARP_STATE_STABLE) &&
  89104. 802418c: 7dfa ldrb r2, [r7, #23]
  89105. 802418e: 492c ldr r1, [pc, #176] @ (8024240 <etharp_output+0x204>)
  89106. 8024190: 4613 mov r3, r2
  89107. 8024192: 005b lsls r3, r3, #1
  89108. 8024194: 4413 add r3, r2
  89109. 8024196: 00db lsls r3, r3, #3
  89110. 8024198: 440b add r3, r1
  89111. 802419a: 3314 adds r3, #20
  89112. 802419c: 781b ldrb r3, [r3, #0]
  89113. 802419e: 2b01 cmp r3, #1
  89114. 80241a0: d923 bls.n 80241ea <etharp_output+0x1ae>
  89115. #if ETHARP_TABLE_MATCH_NETIF
  89116. (arp_table[i].netif == netif) &&
  89117. 80241a2: 7dfa ldrb r2, [r7, #23]
  89118. 80241a4: 4926 ldr r1, [pc, #152] @ (8024240 <etharp_output+0x204>)
  89119. 80241a6: 4613 mov r3, r2
  89120. 80241a8: 005b lsls r3, r3, #1
  89121. 80241aa: 4413 add r3, r2
  89122. 80241ac: 00db lsls r3, r3, #3
  89123. 80241ae: 440b add r3, r1
  89124. 80241b0: 3308 adds r3, #8
  89125. 80241b2: 681b ldr r3, [r3, #0]
  89126. if ((arp_table[i].state >= ETHARP_STATE_STABLE) &&
  89127. 80241b4: 68fa ldr r2, [r7, #12]
  89128. 80241b6: 429a cmp r2, r3
  89129. 80241b8: d117 bne.n 80241ea <etharp_output+0x1ae>
  89130. #endif
  89131. (ip4_addr_cmp(dst_addr, &arp_table[i].ipaddr))) {
  89132. 80241ba: 69bb ldr r3, [r7, #24]
  89133. 80241bc: 6819 ldr r1, [r3, #0]
  89134. 80241be: 7dfa ldrb r2, [r7, #23]
  89135. 80241c0: 481f ldr r0, [pc, #124] @ (8024240 <etharp_output+0x204>)
  89136. 80241c2: 4613 mov r3, r2
  89137. 80241c4: 005b lsls r3, r3, #1
  89138. 80241c6: 4413 add r3, r2
  89139. 80241c8: 00db lsls r3, r3, #3
  89140. 80241ca: 4403 add r3, r0
  89141. 80241cc: 3304 adds r3, #4
  89142. 80241ce: 681b ldr r3, [r3, #0]
  89143. (arp_table[i].netif == netif) &&
  89144. 80241d0: 4299 cmp r1, r3
  89145. 80241d2: d10a bne.n 80241ea <etharp_output+0x1ae>
  89146. /* found an existing, stable entry */
  89147. ETHARP_SET_ADDRHINT(netif, i);
  89148. 80241d4: 4a19 ldr r2, [pc, #100] @ (802423c <etharp_output+0x200>)
  89149. 80241d6: 7dfb ldrb r3, [r7, #23]
  89150. 80241d8: 7013 strb r3, [r2, #0]
  89151. return etharp_output_to_arp_index(netif, q, i);
  89152. 80241da: 7dfb ldrb r3, [r7, #23]
  89153. 80241dc: 461a mov r2, r3
  89154. 80241de: 68b9 ldr r1, [r7, #8]
  89155. 80241e0: 68f8 ldr r0, [r7, #12]
  89156. 80241e2: f7ff fe91 bl 8023f08 <etharp_output_to_arp_index>
  89157. 80241e6: 4603 mov r3, r0
  89158. 80241e8: e018 b.n 802421c <etharp_output+0x1e0>
  89159. for (i = 0; i < ARP_TABLE_SIZE; i++) {
  89160. 80241ea: 7dfb ldrb r3, [r7, #23]
  89161. 80241ec: 3301 adds r3, #1
  89162. 80241ee: 75fb strb r3, [r7, #23]
  89163. 80241f0: 7dfb ldrb r3, [r7, #23]
  89164. 80241f2: 2b09 cmp r3, #9
  89165. 80241f4: d9ca bls.n 802418c <etharp_output+0x150>
  89166. }
  89167. }
  89168. /* no stable entry found, use the (slower) query function:
  89169. queue on destination Ethernet address belonging to ipaddr */
  89170. return etharp_query(netif, dst_addr, q);
  89171. 80241f6: 68ba ldr r2, [r7, #8]
  89172. 80241f8: 69b9 ldr r1, [r7, #24]
  89173. 80241fa: 68f8 ldr r0, [r7, #12]
  89174. 80241fc: f000 f822 bl 8024244 <etharp_query>
  89175. 8024200: 4603 mov r3, r0
  89176. 8024202: e00b b.n 802421c <etharp_output+0x1e0>
  89177. }
  89178. /* continuation for multicast/broadcast destinations */
  89179. /* obtain source Ethernet address of the given interface */
  89180. /* send packet directly on the link */
  89181. return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), dest, ETHTYPE_IP);
  89182. 8024204: 68fb ldr r3, [r7, #12]
  89183. 8024206: f103 022a add.w r2, r3, #42 @ 0x2a
  89184. 802420a: f44f 6300 mov.w r3, #2048 @ 0x800
  89185. 802420e: 9300 str r3, [sp, #0]
  89186. 8024210: 69fb ldr r3, [r7, #28]
  89187. 8024212: 68b9 ldr r1, [r7, #8]
  89188. 8024214: 68f8 ldr r0, [r7, #12]
  89189. 8024216: f001 ff61 bl 80260dc <ethernet_output>
  89190. 802421a: 4603 mov r3, r0
  89191. }
  89192. 802421c: 4618 mov r0, r3
  89193. 802421e: 3720 adds r7, #32
  89194. 8024220: 46bd mov sp, r7
  89195. 8024222: bd80 pop {r7, pc}
  89196. 8024224: 080301f4 .word 0x080301f4
  89197. 8024228: 08030344 .word 0x08030344
  89198. 802422c: 0803026c .word 0x0803026c
  89199. 8024230: 08030394 .word 0x08030394
  89200. 8024234: 08030334 .word 0x08030334
  89201. 8024238: 08030c18 .word 0x08030c18
  89202. 802423c: 2402b010 .word 0x2402b010
  89203. 8024240: 2402af20 .word 0x2402af20
  89204. 08024244 <etharp_query>:
  89205. * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
  89206. *
  89207. */
  89208. err_t
  89209. etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q)
  89210. {
  89211. 8024244: b580 push {r7, lr}
  89212. 8024246: b08c sub sp, #48 @ 0x30
  89213. 8024248: af02 add r7, sp, #8
  89214. 802424a: 60f8 str r0, [r7, #12]
  89215. 802424c: 60b9 str r1, [r7, #8]
  89216. 802424e: 607a str r2, [r7, #4]
  89217. struct eth_addr *srcaddr = (struct eth_addr *)netif->hwaddr;
  89218. 8024250: 68fb ldr r3, [r7, #12]
  89219. 8024252: 332a adds r3, #42 @ 0x2a
  89220. 8024254: 617b str r3, [r7, #20]
  89221. err_t result = ERR_MEM;
  89222. 8024256: 23ff movs r3, #255 @ 0xff
  89223. 8024258: f887 3027 strb.w r3, [r7, #39] @ 0x27
  89224. int is_new_entry = 0;
  89225. 802425c: 2300 movs r3, #0
  89226. 802425e: 623b str r3, [r7, #32]
  89227. s16_t i_err;
  89228. netif_addr_idx_t i;
  89229. /* non-unicast address? */
  89230. if (ip4_addr_isbroadcast(ipaddr, netif) ||
  89231. 8024260: 68bb ldr r3, [r7, #8]
  89232. 8024262: 681b ldr r3, [r3, #0]
  89233. 8024264: 68f9 ldr r1, [r7, #12]
  89234. 8024266: 4618 mov r0, r3
  89235. 8024268: f000 fe5a bl 8024f20 <ip4_addr_isbroadcast_u32>
  89236. 802426c: 4603 mov r3, r0
  89237. 802426e: 2b00 cmp r3, #0
  89238. 8024270: d10c bne.n 802428c <etharp_query+0x48>
  89239. ip4_addr_ismulticast(ipaddr) ||
  89240. 8024272: 68bb ldr r3, [r7, #8]
  89241. 8024274: 681b ldr r3, [r3, #0]
  89242. 8024276: f003 03f0 and.w r3, r3, #240 @ 0xf0
  89243. if (ip4_addr_isbroadcast(ipaddr, netif) ||
  89244. 802427a: 2be0 cmp r3, #224 @ 0xe0
  89245. 802427c: d006 beq.n 802428c <etharp_query+0x48>
  89246. ip4_addr_ismulticast(ipaddr) ||
  89247. 802427e: 68bb ldr r3, [r7, #8]
  89248. 8024280: 2b00 cmp r3, #0
  89249. 8024282: d003 beq.n 802428c <etharp_query+0x48>
  89250. ip4_addr_isany(ipaddr)) {
  89251. 8024284: 68bb ldr r3, [r7, #8]
  89252. 8024286: 681b ldr r3, [r3, #0]
  89253. 8024288: 2b00 cmp r3, #0
  89254. 802428a: d102 bne.n 8024292 <etharp_query+0x4e>
  89255. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n"));
  89256. return ERR_ARG;
  89257. 802428c: f06f 030f mvn.w r3, #15
  89258. 8024290: e101 b.n 8024496 <etharp_query+0x252>
  89259. }
  89260. /* find entry in ARP cache, ask to create entry if queueing packet */
  89261. i_err = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD, netif);
  89262. 8024292: 68fa ldr r2, [r7, #12]
  89263. 8024294: 2101 movs r1, #1
  89264. 8024296: 68b8 ldr r0, [r7, #8]
  89265. 8024298: f7ff fb58 bl 802394c <etharp_find_entry>
  89266. 802429c: 4603 mov r3, r0
  89267. 802429e: 827b strh r3, [r7, #18]
  89268. /* could not find or create entry? */
  89269. if (i_err < 0) {
  89270. 80242a0: f9b7 3012 ldrsh.w r3, [r7, #18]
  89271. 80242a4: 2b00 cmp r3, #0
  89272. 80242a6: da02 bge.n 80242ae <etharp_query+0x6a>
  89273. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not create ARP entry\n"));
  89274. if (q) {
  89275. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: packet dropped\n"));
  89276. ETHARP_STATS_INC(etharp.memerr);
  89277. }
  89278. return (err_t)i_err;
  89279. 80242a8: 8a7b ldrh r3, [r7, #18]
  89280. 80242aa: b25b sxtb r3, r3
  89281. 80242ac: e0f3 b.n 8024496 <etharp_query+0x252>
  89282. }
  89283. LWIP_ASSERT("type overflow", (size_t)i_err < NETIF_ADDR_IDX_MAX);
  89284. 80242ae: 8a7b ldrh r3, [r7, #18]
  89285. 80242b0: 2b7e cmp r3, #126 @ 0x7e
  89286. 80242b2: d906 bls.n 80242c2 <etharp_query+0x7e>
  89287. 80242b4: 4b7a ldr r3, [pc, #488] @ (80244a0 <etharp_query+0x25c>)
  89288. 80242b6: f240 32c1 movw r2, #961 @ 0x3c1
  89289. 80242ba: 497a ldr r1, [pc, #488] @ (80244a4 <etharp_query+0x260>)
  89290. 80242bc: 487a ldr r0, [pc, #488] @ (80244a8 <etharp_query+0x264>)
  89291. 80242be: f005 fb85 bl 80299cc <iprintf>
  89292. i = (netif_addr_idx_t)i_err;
  89293. 80242c2: 8a7b ldrh r3, [r7, #18]
  89294. 80242c4: 747b strb r3, [r7, #17]
  89295. /* mark a fresh entry as pending (we just sent a request) */
  89296. if (arp_table[i].state == ETHARP_STATE_EMPTY) {
  89297. 80242c6: 7c7a ldrb r2, [r7, #17]
  89298. 80242c8: 4978 ldr r1, [pc, #480] @ (80244ac <etharp_query+0x268>)
  89299. 80242ca: 4613 mov r3, r2
  89300. 80242cc: 005b lsls r3, r3, #1
  89301. 80242ce: 4413 add r3, r2
  89302. 80242d0: 00db lsls r3, r3, #3
  89303. 80242d2: 440b add r3, r1
  89304. 80242d4: 3314 adds r3, #20
  89305. 80242d6: 781b ldrb r3, [r3, #0]
  89306. 80242d8: 2b00 cmp r3, #0
  89307. 80242da: d115 bne.n 8024308 <etharp_query+0xc4>
  89308. is_new_entry = 1;
  89309. 80242dc: 2301 movs r3, #1
  89310. 80242de: 623b str r3, [r7, #32]
  89311. arp_table[i].state = ETHARP_STATE_PENDING;
  89312. 80242e0: 7c7a ldrb r2, [r7, #17]
  89313. 80242e2: 4972 ldr r1, [pc, #456] @ (80244ac <etharp_query+0x268>)
  89314. 80242e4: 4613 mov r3, r2
  89315. 80242e6: 005b lsls r3, r3, #1
  89316. 80242e8: 4413 add r3, r2
  89317. 80242ea: 00db lsls r3, r3, #3
  89318. 80242ec: 440b add r3, r1
  89319. 80242ee: 3314 adds r3, #20
  89320. 80242f0: 2201 movs r2, #1
  89321. 80242f2: 701a strb r2, [r3, #0]
  89322. /* record network interface for re-sending arp request in etharp_tmr */
  89323. arp_table[i].netif = netif;
  89324. 80242f4: 7c7a ldrb r2, [r7, #17]
  89325. 80242f6: 496d ldr r1, [pc, #436] @ (80244ac <etharp_query+0x268>)
  89326. 80242f8: 4613 mov r3, r2
  89327. 80242fa: 005b lsls r3, r3, #1
  89328. 80242fc: 4413 add r3, r2
  89329. 80242fe: 00db lsls r3, r3, #3
  89330. 8024300: 440b add r3, r1
  89331. 8024302: 3308 adds r3, #8
  89332. 8024304: 68fa ldr r2, [r7, #12]
  89333. 8024306: 601a str r2, [r3, #0]
  89334. }
  89335. /* { i is either a STABLE or (new or existing) PENDING entry } */
  89336. LWIP_ASSERT("arp_table[i].state == PENDING or STABLE",
  89337. 8024308: 7c7a ldrb r2, [r7, #17]
  89338. 802430a: 4968 ldr r1, [pc, #416] @ (80244ac <etharp_query+0x268>)
  89339. 802430c: 4613 mov r3, r2
  89340. 802430e: 005b lsls r3, r3, #1
  89341. 8024310: 4413 add r3, r2
  89342. 8024312: 00db lsls r3, r3, #3
  89343. 8024314: 440b add r3, r1
  89344. 8024316: 3314 adds r3, #20
  89345. 8024318: 781b ldrb r3, [r3, #0]
  89346. 802431a: 2b01 cmp r3, #1
  89347. 802431c: d011 beq.n 8024342 <etharp_query+0xfe>
  89348. 802431e: 7c7a ldrb r2, [r7, #17]
  89349. 8024320: 4962 ldr r1, [pc, #392] @ (80244ac <etharp_query+0x268>)
  89350. 8024322: 4613 mov r3, r2
  89351. 8024324: 005b lsls r3, r3, #1
  89352. 8024326: 4413 add r3, r2
  89353. 8024328: 00db lsls r3, r3, #3
  89354. 802432a: 440b add r3, r1
  89355. 802432c: 3314 adds r3, #20
  89356. 802432e: 781b ldrb r3, [r3, #0]
  89357. 8024330: 2b01 cmp r3, #1
  89358. 8024332: d806 bhi.n 8024342 <etharp_query+0xfe>
  89359. 8024334: 4b5a ldr r3, [pc, #360] @ (80244a0 <etharp_query+0x25c>)
  89360. 8024336: f240 32cd movw r2, #973 @ 0x3cd
  89361. 802433a: 495d ldr r1, [pc, #372] @ (80244b0 <etharp_query+0x26c>)
  89362. 802433c: 485a ldr r0, [pc, #360] @ (80244a8 <etharp_query+0x264>)
  89363. 802433e: f005 fb45 bl 80299cc <iprintf>
  89364. ((arp_table[i].state == ETHARP_STATE_PENDING) ||
  89365. (arp_table[i].state >= ETHARP_STATE_STABLE)));
  89366. /* do we have a new entry? or an implicit query request? */
  89367. if (is_new_entry || (q == NULL)) {
  89368. 8024342: 6a3b ldr r3, [r7, #32]
  89369. 8024344: 2b00 cmp r3, #0
  89370. 8024346: d102 bne.n 802434e <etharp_query+0x10a>
  89371. 8024348: 687b ldr r3, [r7, #4]
  89372. 802434a: 2b00 cmp r3, #0
  89373. 802434c: d10c bne.n 8024368 <etharp_query+0x124>
  89374. /* try to resolve it; send out ARP request */
  89375. result = etharp_request(netif, ipaddr);
  89376. 802434e: 68b9 ldr r1, [r7, #8]
  89377. 8024350: 68f8 ldr r0, [r7, #12]
  89378. 8024352: f000 f963 bl 802461c <etharp_request>
  89379. 8024356: 4603 mov r3, r0
  89380. 8024358: f887 3027 strb.w r3, [r7, #39] @ 0x27
  89381. /* ARP request couldn't be sent */
  89382. /* We don't re-send arp request in etharp_tmr, but we still queue packets,
  89383. since this failure could be temporary, and the next packet calling
  89384. etharp_query again could lead to sending the queued packets. */
  89385. }
  89386. if (q == NULL) {
  89387. 802435c: 687b ldr r3, [r7, #4]
  89388. 802435e: 2b00 cmp r3, #0
  89389. 8024360: d102 bne.n 8024368 <etharp_query+0x124>
  89390. return result;
  89391. 8024362: f997 3027 ldrsb.w r3, [r7, #39] @ 0x27
  89392. 8024366: e096 b.n 8024496 <etharp_query+0x252>
  89393. }
  89394. }
  89395. /* packet given? */
  89396. LWIP_ASSERT("q != NULL", q != NULL);
  89397. 8024368: 687b ldr r3, [r7, #4]
  89398. 802436a: 2b00 cmp r3, #0
  89399. 802436c: d106 bne.n 802437c <etharp_query+0x138>
  89400. 802436e: 4b4c ldr r3, [pc, #304] @ (80244a0 <etharp_query+0x25c>)
  89401. 8024370: f240 32e1 movw r2, #993 @ 0x3e1
  89402. 8024374: 494f ldr r1, [pc, #316] @ (80244b4 <etharp_query+0x270>)
  89403. 8024376: 484c ldr r0, [pc, #304] @ (80244a8 <etharp_query+0x264>)
  89404. 8024378: f005 fb28 bl 80299cc <iprintf>
  89405. /* stable entry? */
  89406. if (arp_table[i].state >= ETHARP_STATE_STABLE) {
  89407. 802437c: 7c7a ldrb r2, [r7, #17]
  89408. 802437e: 494b ldr r1, [pc, #300] @ (80244ac <etharp_query+0x268>)
  89409. 8024380: 4613 mov r3, r2
  89410. 8024382: 005b lsls r3, r3, #1
  89411. 8024384: 4413 add r3, r2
  89412. 8024386: 00db lsls r3, r3, #3
  89413. 8024388: 440b add r3, r1
  89414. 802438a: 3314 adds r3, #20
  89415. 802438c: 781b ldrb r3, [r3, #0]
  89416. 802438e: 2b01 cmp r3, #1
  89417. 8024390: d917 bls.n 80243c2 <etharp_query+0x17e>
  89418. /* we have a valid IP->Ethernet address mapping */
  89419. ETHARP_SET_ADDRHINT(netif, i);
  89420. 8024392: 4a49 ldr r2, [pc, #292] @ (80244b8 <etharp_query+0x274>)
  89421. 8024394: 7c7b ldrb r3, [r7, #17]
  89422. 8024396: 7013 strb r3, [r2, #0]
  89423. /* send the packet */
  89424. result = ethernet_output(netif, q, srcaddr, &(arp_table[i].ethaddr), ETHTYPE_IP);
  89425. 8024398: 7c7a ldrb r2, [r7, #17]
  89426. 802439a: 4613 mov r3, r2
  89427. 802439c: 005b lsls r3, r3, #1
  89428. 802439e: 4413 add r3, r2
  89429. 80243a0: 00db lsls r3, r3, #3
  89430. 80243a2: 3308 adds r3, #8
  89431. 80243a4: 4a41 ldr r2, [pc, #260] @ (80244ac <etharp_query+0x268>)
  89432. 80243a6: 4413 add r3, r2
  89433. 80243a8: 3304 adds r3, #4
  89434. 80243aa: f44f 6200 mov.w r2, #2048 @ 0x800
  89435. 80243ae: 9200 str r2, [sp, #0]
  89436. 80243b0: 697a ldr r2, [r7, #20]
  89437. 80243b2: 6879 ldr r1, [r7, #4]
  89438. 80243b4: 68f8 ldr r0, [r7, #12]
  89439. 80243b6: f001 fe91 bl 80260dc <ethernet_output>
  89440. 80243ba: 4603 mov r3, r0
  89441. 80243bc: f887 3027 strb.w r3, [r7, #39] @ 0x27
  89442. 80243c0: e067 b.n 8024492 <etharp_query+0x24e>
  89443. /* pending entry? (either just created or already pending */
  89444. } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
  89445. 80243c2: 7c7a ldrb r2, [r7, #17]
  89446. 80243c4: 4939 ldr r1, [pc, #228] @ (80244ac <etharp_query+0x268>)
  89447. 80243c6: 4613 mov r3, r2
  89448. 80243c8: 005b lsls r3, r3, #1
  89449. 80243ca: 4413 add r3, r2
  89450. 80243cc: 00db lsls r3, r3, #3
  89451. 80243ce: 440b add r3, r1
  89452. 80243d0: 3314 adds r3, #20
  89453. 80243d2: 781b ldrb r3, [r3, #0]
  89454. 80243d4: 2b01 cmp r3, #1
  89455. 80243d6: d15c bne.n 8024492 <etharp_query+0x24e>
  89456. /* entry is still pending, queue the given packet 'q' */
  89457. struct pbuf *p;
  89458. int copy_needed = 0;
  89459. 80243d8: 2300 movs r3, #0
  89460. 80243da: 61bb str r3, [r7, #24]
  89461. /* IF q includes a pbuf that must be copied, copy the whole chain into a
  89462. * new PBUF_RAM. See the definition of PBUF_NEEDS_COPY for details. */
  89463. p = q;
  89464. 80243dc: 687b ldr r3, [r7, #4]
  89465. 80243de: 61fb str r3, [r7, #28]
  89466. while (p) {
  89467. 80243e0: e01c b.n 802441c <etharp_query+0x1d8>
  89468. LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0));
  89469. 80243e2: 69fb ldr r3, [r7, #28]
  89470. 80243e4: 895a ldrh r2, [r3, #10]
  89471. 80243e6: 69fb ldr r3, [r7, #28]
  89472. 80243e8: 891b ldrh r3, [r3, #8]
  89473. 80243ea: 429a cmp r2, r3
  89474. 80243ec: d10a bne.n 8024404 <etharp_query+0x1c0>
  89475. 80243ee: 69fb ldr r3, [r7, #28]
  89476. 80243f0: 681b ldr r3, [r3, #0]
  89477. 80243f2: 2b00 cmp r3, #0
  89478. 80243f4: d006 beq.n 8024404 <etharp_query+0x1c0>
  89479. 80243f6: 4b2a ldr r3, [pc, #168] @ (80244a0 <etharp_query+0x25c>)
  89480. 80243f8: f240 32f1 movw r2, #1009 @ 0x3f1
  89481. 80243fc: 492f ldr r1, [pc, #188] @ (80244bc <etharp_query+0x278>)
  89482. 80243fe: 482a ldr r0, [pc, #168] @ (80244a8 <etharp_query+0x264>)
  89483. 8024400: f005 fae4 bl 80299cc <iprintf>
  89484. if (PBUF_NEEDS_COPY(p)) {
  89485. 8024404: 69fb ldr r3, [r7, #28]
  89486. 8024406: 7b1b ldrb r3, [r3, #12]
  89487. 8024408: f003 0340 and.w r3, r3, #64 @ 0x40
  89488. 802440c: 2b00 cmp r3, #0
  89489. 802440e: d002 beq.n 8024416 <etharp_query+0x1d2>
  89490. copy_needed = 1;
  89491. 8024410: 2301 movs r3, #1
  89492. 8024412: 61bb str r3, [r7, #24]
  89493. break;
  89494. 8024414: e005 b.n 8024422 <etharp_query+0x1de>
  89495. }
  89496. p = p->next;
  89497. 8024416: 69fb ldr r3, [r7, #28]
  89498. 8024418: 681b ldr r3, [r3, #0]
  89499. 802441a: 61fb str r3, [r7, #28]
  89500. while (p) {
  89501. 802441c: 69fb ldr r3, [r7, #28]
  89502. 802441e: 2b00 cmp r3, #0
  89503. 8024420: d1df bne.n 80243e2 <etharp_query+0x19e>
  89504. }
  89505. if (copy_needed) {
  89506. 8024422: 69bb ldr r3, [r7, #24]
  89507. 8024424: 2b00 cmp r3, #0
  89508. 8024426: d007 beq.n 8024438 <etharp_query+0x1f4>
  89509. /* copy the whole packet into new pbufs */
  89510. p = pbuf_clone(PBUF_LINK, PBUF_RAM, q);
  89511. 8024428: 687a ldr r2, [r7, #4]
  89512. 802442a: f44f 7120 mov.w r1, #640 @ 0x280
  89513. 802442e: 200e movs r0, #14
  89514. 8024430: f7f6 facc bl 801a9cc <pbuf_clone>
  89515. 8024434: 61f8 str r0, [r7, #28]
  89516. 8024436: e004 b.n 8024442 <etharp_query+0x1fe>
  89517. } else {
  89518. /* referencing the old pbuf is enough */
  89519. p = q;
  89520. 8024438: 687b ldr r3, [r7, #4]
  89521. 802443a: 61fb str r3, [r7, #28]
  89522. pbuf_ref(p);
  89523. 802443c: 69f8 ldr r0, [r7, #28]
  89524. 802443e: f7f6 f8f3 bl 801a628 <pbuf_ref>
  89525. }
  89526. /* packet could be taken over? */
  89527. if (p != NULL) {
  89528. 8024442: 69fb ldr r3, [r7, #28]
  89529. 8024444: 2b00 cmp r3, #0
  89530. 8024446: d021 beq.n 802448c <etharp_query+0x248>
  89531. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q));
  89532. result = ERR_MEM;
  89533. }
  89534. #else /* ARP_QUEUEING */
  89535. /* always queue one packet per ARP request only, freeing a previously queued packet */
  89536. if (arp_table[i].q != NULL) {
  89537. 8024448: 7c7a ldrb r2, [r7, #17]
  89538. 802444a: 4918 ldr r1, [pc, #96] @ (80244ac <etharp_query+0x268>)
  89539. 802444c: 4613 mov r3, r2
  89540. 802444e: 005b lsls r3, r3, #1
  89541. 8024450: 4413 add r3, r2
  89542. 8024452: 00db lsls r3, r3, #3
  89543. 8024454: 440b add r3, r1
  89544. 8024456: 681b ldr r3, [r3, #0]
  89545. 8024458: 2b00 cmp r3, #0
  89546. 802445a: d00a beq.n 8024472 <etharp_query+0x22e>
  89547. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: dropped previously queued packet %p for ARP entry %"U16_F"\n", (void *)q, (u16_t)i));
  89548. pbuf_free(arp_table[i].q);
  89549. 802445c: 7c7a ldrb r2, [r7, #17]
  89550. 802445e: 4913 ldr r1, [pc, #76] @ (80244ac <etharp_query+0x268>)
  89551. 8024460: 4613 mov r3, r2
  89552. 8024462: 005b lsls r3, r3, #1
  89553. 8024464: 4413 add r3, r2
  89554. 8024466: 00db lsls r3, r3, #3
  89555. 8024468: 440b add r3, r1
  89556. 802446a: 681b ldr r3, [r3, #0]
  89557. 802446c: 4618 mov r0, r3
  89558. 802446e: f7f6 f835 bl 801a4dc <pbuf_free>
  89559. }
  89560. arp_table[i].q = p;
  89561. 8024472: 7c7a ldrb r2, [r7, #17]
  89562. 8024474: 490d ldr r1, [pc, #52] @ (80244ac <etharp_query+0x268>)
  89563. 8024476: 4613 mov r3, r2
  89564. 8024478: 005b lsls r3, r3, #1
  89565. 802447a: 4413 add r3, r2
  89566. 802447c: 00db lsls r3, r3, #3
  89567. 802447e: 440b add r3, r1
  89568. 8024480: 69fa ldr r2, [r7, #28]
  89569. 8024482: 601a str r2, [r3, #0]
  89570. result = ERR_OK;
  89571. 8024484: 2300 movs r3, #0
  89572. 8024486: f887 3027 strb.w r3, [r7, #39] @ 0x27
  89573. 802448a: e002 b.n 8024492 <etharp_query+0x24e>
  89574. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"U16_F"\n", (void *)q, (u16_t)i));
  89575. #endif /* ARP_QUEUEING */
  89576. } else {
  89577. ETHARP_STATS_INC(etharp.memerr);
  89578. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q));
  89579. result = ERR_MEM;
  89580. 802448c: 23ff movs r3, #255 @ 0xff
  89581. 802448e: f887 3027 strb.w r3, [r7, #39] @ 0x27
  89582. }
  89583. }
  89584. return result;
  89585. 8024492: f997 3027 ldrsb.w r3, [r7, #39] @ 0x27
  89586. }
  89587. 8024496: 4618 mov r0, r3
  89588. 8024498: 3728 adds r7, #40 @ 0x28
  89589. 802449a: 46bd mov sp, r7
  89590. 802449c: bd80 pop {r7, pc}
  89591. 802449e: bf00 nop
  89592. 80244a0: 080301f4 .word 0x080301f4
  89593. 80244a4: 080303a0 .word 0x080303a0
  89594. 80244a8: 0803026c .word 0x0803026c
  89595. 80244ac: 2402af20 .word 0x2402af20
  89596. 80244b0: 080303b0 .word 0x080303b0
  89597. 80244b4: 08030394 .word 0x08030394
  89598. 80244b8: 2402b010 .word 0x2402b010
  89599. 80244bc: 080303d8 .word 0x080303d8
  89600. 080244c0 <etharp_raw>:
  89601. etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr,
  89602. const struct eth_addr *ethdst_addr,
  89603. const struct eth_addr *hwsrc_addr, const ip4_addr_t *ipsrc_addr,
  89604. const struct eth_addr *hwdst_addr, const ip4_addr_t *ipdst_addr,
  89605. const u16_t opcode)
  89606. {
  89607. 80244c0: b580 push {r7, lr}
  89608. 80244c2: b08a sub sp, #40 @ 0x28
  89609. 80244c4: af02 add r7, sp, #8
  89610. 80244c6: 60f8 str r0, [r7, #12]
  89611. 80244c8: 60b9 str r1, [r7, #8]
  89612. 80244ca: 607a str r2, [r7, #4]
  89613. 80244cc: 603b str r3, [r7, #0]
  89614. struct pbuf *p;
  89615. err_t result = ERR_OK;
  89616. 80244ce: 2300 movs r3, #0
  89617. 80244d0: 77fb strb r3, [r7, #31]
  89618. struct etharp_hdr *hdr;
  89619. LWIP_ASSERT("netif != NULL", netif != NULL);
  89620. 80244d2: 68fb ldr r3, [r7, #12]
  89621. 80244d4: 2b00 cmp r3, #0
  89622. 80244d6: d106 bne.n 80244e6 <etharp_raw+0x26>
  89623. 80244d8: 4b3a ldr r3, [pc, #232] @ (80245c4 <etharp_raw+0x104>)
  89624. 80244da: f240 4257 movw r2, #1111 @ 0x457
  89625. 80244de: 493a ldr r1, [pc, #232] @ (80245c8 <etharp_raw+0x108>)
  89626. 80244e0: 483a ldr r0, [pc, #232] @ (80245cc <etharp_raw+0x10c>)
  89627. 80244e2: f005 fa73 bl 80299cc <iprintf>
  89628. /* allocate a pbuf for the outgoing ARP request packet */
  89629. p = pbuf_alloc(PBUF_LINK, SIZEOF_ETHARP_HDR, PBUF_RAM);
  89630. 80244e6: f44f 7220 mov.w r2, #640 @ 0x280
  89631. 80244ea: 211c movs r1, #28
  89632. 80244ec: 200e movs r0, #14
  89633. 80244ee: f7f5 fcdf bl 8019eb0 <pbuf_alloc>
  89634. 80244f2: 61b8 str r0, [r7, #24]
  89635. /* could allocate a pbuf for an ARP request? */
  89636. if (p == NULL) {
  89637. 80244f4: 69bb ldr r3, [r7, #24]
  89638. 80244f6: 2b00 cmp r3, #0
  89639. 80244f8: d102 bne.n 8024500 <etharp_raw+0x40>
  89640. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  89641. ("etharp_raw: could not allocate pbuf for ARP request.\n"));
  89642. ETHARP_STATS_INC(etharp.memerr);
  89643. return ERR_MEM;
  89644. 80244fa: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  89645. 80244fe: e05d b.n 80245bc <etharp_raw+0xfc>
  89646. }
  89647. LWIP_ASSERT("check that first pbuf can hold struct etharp_hdr",
  89648. 8024500: 69bb ldr r3, [r7, #24]
  89649. 8024502: 895b ldrh r3, [r3, #10]
  89650. 8024504: 2b1b cmp r3, #27
  89651. 8024506: d806 bhi.n 8024516 <etharp_raw+0x56>
  89652. 8024508: 4b2e ldr r3, [pc, #184] @ (80245c4 <etharp_raw+0x104>)
  89653. 802450a: f240 4262 movw r2, #1122 @ 0x462
  89654. 802450e: 4930 ldr r1, [pc, #192] @ (80245d0 <etharp_raw+0x110>)
  89655. 8024510: 482e ldr r0, [pc, #184] @ (80245cc <etharp_raw+0x10c>)
  89656. 8024512: f005 fa5b bl 80299cc <iprintf>
  89657. (p->len >= SIZEOF_ETHARP_HDR));
  89658. hdr = (struct etharp_hdr *)p->payload;
  89659. 8024516: 69bb ldr r3, [r7, #24]
  89660. 8024518: 685b ldr r3, [r3, #4]
  89661. 802451a: 617b str r3, [r7, #20]
  89662. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n"));
  89663. hdr->opcode = lwip_htons(opcode);
  89664. 802451c: 8ebb ldrh r3, [r7, #52] @ 0x34
  89665. 802451e: 4618 mov r0, r3
  89666. 8024520: f7f4 fafa bl 8018b18 <lwip_htons>
  89667. 8024524: 4603 mov r3, r0
  89668. 8024526: 461a mov r2, r3
  89669. 8024528: 697b ldr r3, [r7, #20]
  89670. 802452a: 80da strh r2, [r3, #6]
  89671. LWIP_ASSERT("netif->hwaddr_len must be the same as ETH_HWADDR_LEN for etharp!",
  89672. 802452c: 68fb ldr r3, [r7, #12]
  89673. 802452e: f893 3030 ldrb.w r3, [r3, #48] @ 0x30
  89674. 8024532: 2b06 cmp r3, #6
  89675. 8024534: d006 beq.n 8024544 <etharp_raw+0x84>
  89676. 8024536: 4b23 ldr r3, [pc, #140] @ (80245c4 <etharp_raw+0x104>)
  89677. 8024538: f240 4269 movw r2, #1129 @ 0x469
  89678. 802453c: 4925 ldr r1, [pc, #148] @ (80245d4 <etharp_raw+0x114>)
  89679. 802453e: 4823 ldr r0, [pc, #140] @ (80245cc <etharp_raw+0x10c>)
  89680. 8024540: f005 fa44 bl 80299cc <iprintf>
  89681. (netif->hwaddr_len == ETH_HWADDR_LEN));
  89682. /* Write the ARP MAC-Addresses */
  89683. SMEMCPY(&hdr->shwaddr, hwsrc_addr, ETH_HWADDR_LEN);
  89684. 8024544: 697b ldr r3, [r7, #20]
  89685. 8024546: 3308 adds r3, #8
  89686. 8024548: 2206 movs r2, #6
  89687. 802454a: 6839 ldr r1, [r7, #0]
  89688. 802454c: 4618 mov r0, r3
  89689. 802454e: f005 fcc6 bl 8029ede <memcpy>
  89690. SMEMCPY(&hdr->dhwaddr, hwdst_addr, ETH_HWADDR_LEN);
  89691. 8024552: 697b ldr r3, [r7, #20]
  89692. 8024554: 3312 adds r3, #18
  89693. 8024556: 2206 movs r2, #6
  89694. 8024558: 6af9 ldr r1, [r7, #44] @ 0x2c
  89695. 802455a: 4618 mov r0, r3
  89696. 802455c: f005 fcbf bl 8029ede <memcpy>
  89697. /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without
  89698. * structure packing. */
  89699. IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->sipaddr, ipsrc_addr);
  89700. 8024560: 697b ldr r3, [r7, #20]
  89701. 8024562: 330e adds r3, #14
  89702. 8024564: 6aba ldr r2, [r7, #40] @ 0x28
  89703. 8024566: 6812 ldr r2, [r2, #0]
  89704. 8024568: 601a str r2, [r3, #0]
  89705. IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->dipaddr, ipdst_addr);
  89706. 802456a: 697b ldr r3, [r7, #20]
  89707. 802456c: 3318 adds r3, #24
  89708. 802456e: 6b3a ldr r2, [r7, #48] @ 0x30
  89709. 8024570: 6812 ldr r2, [r2, #0]
  89710. 8024572: 601a str r2, [r3, #0]
  89711. hdr->hwtype = PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET);
  89712. 8024574: 697b ldr r3, [r7, #20]
  89713. 8024576: 2200 movs r2, #0
  89714. 8024578: 701a strb r2, [r3, #0]
  89715. 802457a: 2200 movs r2, #0
  89716. 802457c: f042 0201 orr.w r2, r2, #1
  89717. 8024580: 705a strb r2, [r3, #1]
  89718. hdr->proto = PP_HTONS(ETHTYPE_IP);
  89719. 8024582: 697b ldr r3, [r7, #20]
  89720. 8024584: 2200 movs r2, #0
  89721. 8024586: f042 0208 orr.w r2, r2, #8
  89722. 802458a: 709a strb r2, [r3, #2]
  89723. 802458c: 2200 movs r2, #0
  89724. 802458e: 70da strb r2, [r3, #3]
  89725. /* set hwlen and protolen */
  89726. hdr->hwlen = ETH_HWADDR_LEN;
  89727. 8024590: 697b ldr r3, [r7, #20]
  89728. 8024592: 2206 movs r2, #6
  89729. 8024594: 711a strb r2, [r3, #4]
  89730. hdr->protolen = sizeof(ip4_addr_t);
  89731. 8024596: 697b ldr r3, [r7, #20]
  89732. 8024598: 2204 movs r2, #4
  89733. 802459a: 715a strb r2, [r3, #5]
  89734. if (ip4_addr_islinklocal(ipsrc_addr)) {
  89735. ethernet_output(netif, p, ethsrc_addr, &ethbroadcast, ETHTYPE_ARP);
  89736. } else
  89737. #endif /* LWIP_AUTOIP */
  89738. {
  89739. ethernet_output(netif, p, ethsrc_addr, ethdst_addr, ETHTYPE_ARP);
  89740. 802459c: f640 0306 movw r3, #2054 @ 0x806
  89741. 80245a0: 9300 str r3, [sp, #0]
  89742. 80245a2: 687b ldr r3, [r7, #4]
  89743. 80245a4: 68ba ldr r2, [r7, #8]
  89744. 80245a6: 69b9 ldr r1, [r7, #24]
  89745. 80245a8: 68f8 ldr r0, [r7, #12]
  89746. 80245aa: f001 fd97 bl 80260dc <ethernet_output>
  89747. }
  89748. ETHARP_STATS_INC(etharp.xmit);
  89749. /* free ARP query packet */
  89750. pbuf_free(p);
  89751. 80245ae: 69b8 ldr r0, [r7, #24]
  89752. 80245b0: f7f5 ff94 bl 801a4dc <pbuf_free>
  89753. p = NULL;
  89754. 80245b4: 2300 movs r3, #0
  89755. 80245b6: 61bb str r3, [r7, #24]
  89756. /* could not allocate pbuf for ARP request */
  89757. return result;
  89758. 80245b8: f997 301f ldrsb.w r3, [r7, #31]
  89759. }
  89760. 80245bc: 4618 mov r0, r3
  89761. 80245be: 3720 adds r7, #32
  89762. 80245c0: 46bd mov sp, r7
  89763. 80245c2: bd80 pop {r7, pc}
  89764. 80245c4: 080301f4 .word 0x080301f4
  89765. 80245c8: 08030344 .word 0x08030344
  89766. 80245cc: 0803026c .word 0x0803026c
  89767. 80245d0: 080303f4 .word 0x080303f4
  89768. 80245d4: 08030428 .word 0x08030428
  89769. 080245d8 <etharp_request_dst>:
  89770. * ERR_MEM if the ARP packet couldn't be allocated
  89771. * any other err_t on failure
  89772. */
  89773. static err_t
  89774. etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr *hw_dst_addr)
  89775. {
  89776. 80245d8: b580 push {r7, lr}
  89777. 80245da: b088 sub sp, #32
  89778. 80245dc: af04 add r7, sp, #16
  89779. 80245de: 60f8 str r0, [r7, #12]
  89780. 80245e0: 60b9 str r1, [r7, #8]
  89781. 80245e2: 607a str r2, [r7, #4]
  89782. return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, hw_dst_addr,
  89783. 80245e4: 68fb ldr r3, [r7, #12]
  89784. 80245e6: f103 012a add.w r1, r3, #42 @ 0x2a
  89785. (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif), &ethzero,
  89786. 80245ea: 68fb ldr r3, [r7, #12]
  89787. 80245ec: f103 002a add.w r0, r3, #42 @ 0x2a
  89788. 80245f0: 68fb ldr r3, [r7, #12]
  89789. 80245f2: 3304 adds r3, #4
  89790. return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, hw_dst_addr,
  89791. 80245f4: 2201 movs r2, #1
  89792. 80245f6: 9203 str r2, [sp, #12]
  89793. 80245f8: 68ba ldr r2, [r7, #8]
  89794. 80245fa: 9202 str r2, [sp, #8]
  89795. 80245fc: 4a06 ldr r2, [pc, #24] @ (8024618 <etharp_request_dst+0x40>)
  89796. 80245fe: 9201 str r2, [sp, #4]
  89797. 8024600: 9300 str r3, [sp, #0]
  89798. 8024602: 4603 mov r3, r0
  89799. 8024604: 687a ldr r2, [r7, #4]
  89800. 8024606: 68f8 ldr r0, [r7, #12]
  89801. 8024608: f7ff ff5a bl 80244c0 <etharp_raw>
  89802. 802460c: 4603 mov r3, r0
  89803. ipaddr, ARP_REQUEST);
  89804. }
  89805. 802460e: 4618 mov r0, r3
  89806. 8024610: 3710 adds r7, #16
  89807. 8024612: 46bd mov sp, r7
  89808. 8024614: bd80 pop {r7, pc}
  89809. 8024616: bf00 nop
  89810. 8024618: 08030c20 .word 0x08030c20
  89811. 0802461c <etharp_request>:
  89812. * ERR_MEM if the ARP packet couldn't be allocated
  89813. * any other err_t on failure
  89814. */
  89815. err_t
  89816. etharp_request(struct netif *netif, const ip4_addr_t *ipaddr)
  89817. {
  89818. 802461c: b580 push {r7, lr}
  89819. 802461e: b082 sub sp, #8
  89820. 8024620: af00 add r7, sp, #0
  89821. 8024622: 6078 str r0, [r7, #4]
  89822. 8024624: 6039 str r1, [r7, #0]
  89823. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n"));
  89824. return etharp_request_dst(netif, ipaddr, &ethbroadcast);
  89825. 8024626: 4a05 ldr r2, [pc, #20] @ (802463c <etharp_request+0x20>)
  89826. 8024628: 6839 ldr r1, [r7, #0]
  89827. 802462a: 6878 ldr r0, [r7, #4]
  89828. 802462c: f7ff ffd4 bl 80245d8 <etharp_request_dst>
  89829. 8024630: 4603 mov r3, r0
  89830. }
  89831. 8024632: 4618 mov r0, r3
  89832. 8024634: 3708 adds r7, #8
  89833. 8024636: 46bd mov sp, r7
  89834. 8024638: bd80 pop {r7, pc}
  89835. 802463a: bf00 nop
  89836. 802463c: 08030c18 .word 0x08030c18
  89837. 08024640 <icmp_input>:
  89838. * @param p the icmp echo request packet, p->payload pointing to the icmp header
  89839. * @param inp the netif on which this packet was received
  89840. */
  89841. void
  89842. icmp_input(struct pbuf *p, struct netif *inp)
  89843. {
  89844. 8024640: b580 push {r7, lr}
  89845. 8024642: b08e sub sp, #56 @ 0x38
  89846. 8024644: af04 add r7, sp, #16
  89847. 8024646: 6078 str r0, [r7, #4]
  89848. 8024648: 6039 str r1, [r7, #0]
  89849. const ip4_addr_t *src;
  89850. ICMP_STATS_INC(icmp.recv);
  89851. MIB2_STATS_INC(mib2.icmpinmsgs);
  89852. iphdr_in = ip4_current_header();
  89853. 802464a: 4b89 ldr r3, [pc, #548] @ (8024870 <icmp_input+0x230>)
  89854. 802464c: 689b ldr r3, [r3, #8]
  89855. 802464e: 627b str r3, [r7, #36] @ 0x24
  89856. hlen = IPH_HL_BYTES(iphdr_in);
  89857. 8024650: 6a7b ldr r3, [r7, #36] @ 0x24
  89858. 8024652: 781b ldrb r3, [r3, #0]
  89859. 8024654: f003 030f and.w r3, r3, #15
  89860. 8024658: b2db uxtb r3, r3
  89861. 802465a: 009b lsls r3, r3, #2
  89862. 802465c: b2db uxtb r3, r3
  89863. 802465e: 847b strh r3, [r7, #34] @ 0x22
  89864. if (hlen < IP_HLEN) {
  89865. 8024660: 8c7b ldrh r3, [r7, #34] @ 0x22
  89866. 8024662: 2b13 cmp r3, #19
  89867. 8024664: f240 80ed bls.w 8024842 <icmp_input+0x202>
  89868. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short IP header (%"S16_F" bytes) received\n", hlen));
  89869. goto lenerr;
  89870. }
  89871. if (p->len < sizeof(u16_t) * 2) {
  89872. 8024668: 687b ldr r3, [r7, #4]
  89873. 802466a: 895b ldrh r3, [r3, #10]
  89874. 802466c: 2b03 cmp r3, #3
  89875. 802466e: f240 80ea bls.w 8024846 <icmp_input+0x206>
  89876. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len));
  89877. goto lenerr;
  89878. }
  89879. type = *((u8_t *)p->payload);
  89880. 8024672: 687b ldr r3, [r7, #4]
  89881. 8024674: 685b ldr r3, [r3, #4]
  89882. 8024676: 781b ldrb r3, [r3, #0]
  89883. 8024678: f887 3021 strb.w r3, [r7, #33] @ 0x21
  89884. #ifdef LWIP_DEBUG
  89885. code = *(((u8_t *)p->payload) + 1);
  89886. 802467c: 687b ldr r3, [r7, #4]
  89887. 802467e: 685b ldr r3, [r3, #4]
  89888. 8024680: 785b ldrb r3, [r3, #1]
  89889. 8024682: f887 3020 strb.w r3, [r7, #32]
  89890. /* if debug is enabled but debug statement below is somehow disabled: */
  89891. LWIP_UNUSED_ARG(code);
  89892. #endif /* LWIP_DEBUG */
  89893. switch (type) {
  89894. 8024686: f897 3021 ldrb.w r3, [r7, #33] @ 0x21
  89895. 802468a: 2b00 cmp r3, #0
  89896. 802468c: f000 80d2 beq.w 8024834 <icmp_input+0x1f4>
  89897. 8024690: 2b08 cmp r3, #8
  89898. 8024692: f040 80d2 bne.w 802483a <icmp_input+0x1fa>
  89899. (as obviously, an echo request has been sent, too). */
  89900. MIB2_STATS_INC(mib2.icmpinechoreps);
  89901. break;
  89902. case ICMP_ECHO:
  89903. MIB2_STATS_INC(mib2.icmpinechos);
  89904. src = ip4_current_dest_addr();
  89905. 8024696: 4b77 ldr r3, [pc, #476] @ (8024874 <icmp_input+0x234>)
  89906. 8024698: 61fb str r3, [r7, #28]
  89907. /* multicast destination address? */
  89908. if (ip4_addr_ismulticast(ip4_current_dest_addr())) {
  89909. 802469a: 4b75 ldr r3, [pc, #468] @ (8024870 <icmp_input+0x230>)
  89910. 802469c: 695b ldr r3, [r3, #20]
  89911. 802469e: f003 03f0 and.w r3, r3, #240 @ 0xf0
  89912. 80246a2: 2be0 cmp r3, #224 @ 0xe0
  89913. 80246a4: f000 80d6 beq.w 8024854 <icmp_input+0x214>
  89914. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast pings\n"));
  89915. goto icmperr;
  89916. #endif /* LWIP_MULTICAST_PING */
  89917. }
  89918. /* broadcast destination address? */
  89919. if (ip4_addr_isbroadcast(ip4_current_dest_addr(), ip_current_netif())) {
  89920. 80246a8: 4b71 ldr r3, [pc, #452] @ (8024870 <icmp_input+0x230>)
  89921. 80246aa: 695b ldr r3, [r3, #20]
  89922. 80246ac: 4a70 ldr r2, [pc, #448] @ (8024870 <icmp_input+0x230>)
  89923. 80246ae: 6812 ldr r2, [r2, #0]
  89924. 80246b0: 4611 mov r1, r2
  89925. 80246b2: 4618 mov r0, r3
  89926. 80246b4: f000 fc34 bl 8024f20 <ip4_addr_isbroadcast_u32>
  89927. 80246b8: 4603 mov r3, r0
  89928. 80246ba: 2b00 cmp r3, #0
  89929. 80246bc: f040 80cc bne.w 8024858 <icmp_input+0x218>
  89930. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to broadcast pings\n"));
  89931. goto icmperr;
  89932. #endif /* LWIP_BROADCAST_PING */
  89933. }
  89934. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n"));
  89935. if (p->tot_len < sizeof(struct icmp_echo_hdr)) {
  89936. 80246c0: 687b ldr r3, [r7, #4]
  89937. 80246c2: 891b ldrh r3, [r3, #8]
  89938. 80246c4: 2b07 cmp r3, #7
  89939. 80246c6: f240 80c0 bls.w 802484a <icmp_input+0x20a>
  89940. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n"));
  89941. goto lenerr;
  89942. }
  89943. #if CHECKSUM_CHECK_ICMP
  89944. IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_ICMP) {
  89945. if (inet_chksum_pbuf(p) != 0) {
  89946. 80246ca: 6878 ldr r0, [r7, #4]
  89947. 80246cc: f7f4 fac1 bl 8018c52 <inet_chksum_pbuf>
  89948. 80246d0: 4603 mov r3, r0
  89949. 80246d2: 2b00 cmp r3, #0
  89950. 80246d4: d003 beq.n 80246de <icmp_input+0x9e>
  89951. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n"));
  89952. pbuf_free(p);
  89953. 80246d6: 6878 ldr r0, [r7, #4]
  89954. 80246d8: f7f5 ff00 bl 801a4dc <pbuf_free>
  89955. ICMP_STATS_INC(icmp.chkerr);
  89956. MIB2_STATS_INC(mib2.icmpinerrors);
  89957. return;
  89958. 80246dc: e0c5 b.n 802486a <icmp_input+0x22a>
  89959. }
  89960. }
  89961. #endif
  89962. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  89963. if (pbuf_add_header(p, hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN)) {
  89964. 80246de: 8c7b ldrh r3, [r7, #34] @ 0x22
  89965. 80246e0: 330e adds r3, #14
  89966. 80246e2: 4619 mov r1, r3
  89967. 80246e4: 6878 ldr r0, [r7, #4]
  89968. 80246e6: f7f5 fe31 bl 801a34c <pbuf_add_header>
  89969. 80246ea: 4603 mov r3, r0
  89970. 80246ec: 2b00 cmp r3, #0
  89971. 80246ee: d04b beq.n 8024788 <icmp_input+0x148>
  89972. /* p is not big enough to contain link headers
  89973. * allocate a new one and copy p into it
  89974. */
  89975. struct pbuf *r;
  89976. u16_t alloc_len = (u16_t)(p->tot_len + hlen);
  89977. 80246f0: 687b ldr r3, [r7, #4]
  89978. 80246f2: 891a ldrh r2, [r3, #8]
  89979. 80246f4: 8c7b ldrh r3, [r7, #34] @ 0x22
  89980. 80246f6: 4413 add r3, r2
  89981. 80246f8: 837b strh r3, [r7, #26]
  89982. if (alloc_len < p->tot_len) {
  89983. 80246fa: 687b ldr r3, [r7, #4]
  89984. 80246fc: 891b ldrh r3, [r3, #8]
  89985. 80246fe: 8b7a ldrh r2, [r7, #26]
  89986. 8024700: 429a cmp r2, r3
  89987. 8024702: f0c0 80ab bcc.w 802485c <icmp_input+0x21c>
  89988. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed (tot_len overflow)\n"));
  89989. goto icmperr;
  89990. }
  89991. /* allocate new packet buffer with space for link headers */
  89992. r = pbuf_alloc(PBUF_LINK, alloc_len, PBUF_RAM);
  89993. 8024706: 8b7b ldrh r3, [r7, #26]
  89994. 8024708: f44f 7220 mov.w r2, #640 @ 0x280
  89995. 802470c: 4619 mov r1, r3
  89996. 802470e: 200e movs r0, #14
  89997. 8024710: f7f5 fbce bl 8019eb0 <pbuf_alloc>
  89998. 8024714: 6178 str r0, [r7, #20]
  89999. if (r == NULL) {
  90000. 8024716: 697b ldr r3, [r7, #20]
  90001. 8024718: 2b00 cmp r3, #0
  90002. 802471a: f000 80a1 beq.w 8024860 <icmp_input+0x220>
  90003. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed\n"));
  90004. goto icmperr;
  90005. }
  90006. if (r->len < hlen + sizeof(struct icmp_echo_hdr)) {
  90007. 802471e: 697b ldr r3, [r7, #20]
  90008. 8024720: 895b ldrh r3, [r3, #10]
  90009. 8024722: 461a mov r2, r3
  90010. 8024724: 8c7b ldrh r3, [r7, #34] @ 0x22
  90011. 8024726: 3308 adds r3, #8
  90012. 8024728: 429a cmp r2, r3
  90013. 802472a: d203 bcs.n 8024734 <icmp_input+0xf4>
  90014. LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("first pbuf cannot hold the ICMP header"));
  90015. pbuf_free(r);
  90016. 802472c: 6978 ldr r0, [r7, #20]
  90017. 802472e: f7f5 fed5 bl 801a4dc <pbuf_free>
  90018. goto icmperr;
  90019. 8024732: e096 b.n 8024862 <icmp_input+0x222>
  90020. }
  90021. /* copy the ip header */
  90022. MEMCPY(r->payload, iphdr_in, hlen);
  90023. 8024734: 697b ldr r3, [r7, #20]
  90024. 8024736: 685b ldr r3, [r3, #4]
  90025. 8024738: 8c7a ldrh r2, [r7, #34] @ 0x22
  90026. 802473a: 6a79 ldr r1, [r7, #36] @ 0x24
  90027. 802473c: 4618 mov r0, r3
  90028. 802473e: f005 fbce bl 8029ede <memcpy>
  90029. /* switch r->payload back to icmp header (cannot fail) */
  90030. if (pbuf_remove_header(r, hlen)) {
  90031. 8024742: 8c7b ldrh r3, [r7, #34] @ 0x22
  90032. 8024744: 4619 mov r1, r3
  90033. 8024746: 6978 ldr r0, [r7, #20]
  90034. 8024748: f7f5 fe10 bl 801a36c <pbuf_remove_header>
  90035. 802474c: 4603 mov r3, r0
  90036. 802474e: 2b00 cmp r3, #0
  90037. 8024750: d009 beq.n 8024766 <icmp_input+0x126>
  90038. LWIP_ASSERT("icmp_input: moving r->payload to icmp header failed\n", 0);
  90039. 8024752: 4b49 ldr r3, [pc, #292] @ (8024878 <icmp_input+0x238>)
  90040. 8024754: 22b6 movs r2, #182 @ 0xb6
  90041. 8024756: 4949 ldr r1, [pc, #292] @ (802487c <icmp_input+0x23c>)
  90042. 8024758: 4849 ldr r0, [pc, #292] @ (8024880 <icmp_input+0x240>)
  90043. 802475a: f005 f937 bl 80299cc <iprintf>
  90044. pbuf_free(r);
  90045. 802475e: 6978 ldr r0, [r7, #20]
  90046. 8024760: f7f5 febc bl 801a4dc <pbuf_free>
  90047. goto icmperr;
  90048. 8024764: e07d b.n 8024862 <icmp_input+0x222>
  90049. }
  90050. /* copy the rest of the packet without ip header */
  90051. if (pbuf_copy(r, p) != ERR_OK) {
  90052. 8024766: 6879 ldr r1, [r7, #4]
  90053. 8024768: 6978 ldr r0, [r7, #20]
  90054. 802476a: f7f5 ffeb bl 801a744 <pbuf_copy>
  90055. 802476e: 4603 mov r3, r0
  90056. 8024770: 2b00 cmp r3, #0
  90057. 8024772: d003 beq.n 802477c <icmp_input+0x13c>
  90058. LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("icmp_input: copying to new pbuf failed"));
  90059. pbuf_free(r);
  90060. 8024774: 6978 ldr r0, [r7, #20]
  90061. 8024776: f7f5 feb1 bl 801a4dc <pbuf_free>
  90062. goto icmperr;
  90063. 802477a: e072 b.n 8024862 <icmp_input+0x222>
  90064. }
  90065. /* free the original p */
  90066. pbuf_free(p);
  90067. 802477c: 6878 ldr r0, [r7, #4]
  90068. 802477e: f7f5 fead bl 801a4dc <pbuf_free>
  90069. /* we now have an identical copy of p that has room for link headers */
  90070. p = r;
  90071. 8024782: 697b ldr r3, [r7, #20]
  90072. 8024784: 607b str r3, [r7, #4]
  90073. 8024786: e00f b.n 80247a8 <icmp_input+0x168>
  90074. } else {
  90075. /* restore p->payload to point to icmp header (cannot fail) */
  90076. if (pbuf_remove_header(p, hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN)) {
  90077. 8024788: 8c7b ldrh r3, [r7, #34] @ 0x22
  90078. 802478a: 330e adds r3, #14
  90079. 802478c: 4619 mov r1, r3
  90080. 802478e: 6878 ldr r0, [r7, #4]
  90081. 8024790: f7f5 fdec bl 801a36c <pbuf_remove_header>
  90082. 8024794: 4603 mov r3, r0
  90083. 8024796: 2b00 cmp r3, #0
  90084. 8024798: d006 beq.n 80247a8 <icmp_input+0x168>
  90085. LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0);
  90086. 802479a: 4b37 ldr r3, [pc, #220] @ (8024878 <icmp_input+0x238>)
  90087. 802479c: 22c7 movs r2, #199 @ 0xc7
  90088. 802479e: 4939 ldr r1, [pc, #228] @ (8024884 <icmp_input+0x244>)
  90089. 80247a0: 4837 ldr r0, [pc, #220] @ (8024880 <icmp_input+0x240>)
  90090. 80247a2: f005 f913 bl 80299cc <iprintf>
  90091. goto icmperr;
  90092. 80247a6: e05c b.n 8024862 <icmp_input+0x222>
  90093. }
  90094. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  90095. /* At this point, all checks are OK. */
  90096. /* We generate an answer by switching the dest and src ip addresses,
  90097. * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
  90098. iecho = (struct icmp_echo_hdr *)p->payload;
  90099. 80247a8: 687b ldr r3, [r7, #4]
  90100. 80247aa: 685b ldr r3, [r3, #4]
  90101. 80247ac: 613b str r3, [r7, #16]
  90102. if (pbuf_add_header(p, hlen)) {
  90103. 80247ae: 8c7b ldrh r3, [r7, #34] @ 0x22
  90104. 80247b0: 4619 mov r1, r3
  90105. 80247b2: 6878 ldr r0, [r7, #4]
  90106. 80247b4: f7f5 fdca bl 801a34c <pbuf_add_header>
  90107. 80247b8: 4603 mov r3, r0
  90108. 80247ba: 2b00 cmp r3, #0
  90109. 80247bc: d13c bne.n 8024838 <icmp_input+0x1f8>
  90110. LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Can't move over header in packet"));
  90111. } else {
  90112. err_t ret;
  90113. struct ip_hdr *iphdr = (struct ip_hdr *)p->payload;
  90114. 80247be: 687b ldr r3, [r7, #4]
  90115. 80247c0: 685b ldr r3, [r3, #4]
  90116. 80247c2: 60fb str r3, [r7, #12]
  90117. ip4_addr_copy(iphdr->src, *src);
  90118. 80247c4: 69fb ldr r3, [r7, #28]
  90119. 80247c6: 681a ldr r2, [r3, #0]
  90120. 80247c8: 68fb ldr r3, [r7, #12]
  90121. 80247ca: 60da str r2, [r3, #12]
  90122. ip4_addr_copy(iphdr->dest, *ip4_current_src_addr());
  90123. 80247cc: 4b28 ldr r3, [pc, #160] @ (8024870 <icmp_input+0x230>)
  90124. 80247ce: 691a ldr r2, [r3, #16]
  90125. 80247d0: 68fb ldr r3, [r7, #12]
  90126. 80247d2: 611a str r2, [r3, #16]
  90127. ICMPH_TYPE_SET(iecho, ICMP_ER);
  90128. 80247d4: 693b ldr r3, [r7, #16]
  90129. 80247d6: 2200 movs r2, #0
  90130. 80247d8: 701a strb r2, [r3, #0]
  90131. #if CHECKSUM_GEN_ICMP
  90132. IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_ICMP) {
  90133. /* adjust the checksum */
  90134. if (iecho->chksum > PP_HTONS(0xffffU - (ICMP_ECHO << 8))) {
  90135. 80247da: 693b ldr r3, [r7, #16]
  90136. 80247dc: 885b ldrh r3, [r3, #2]
  90137. 80247de: b29b uxth r3, r3
  90138. 80247e0: f64f 72f7 movw r2, #65527 @ 0xfff7
  90139. 80247e4: 4293 cmp r3, r2
  90140. 80247e6: d907 bls.n 80247f8 <icmp_input+0x1b8>
  90141. iecho->chksum = (u16_t)(iecho->chksum + PP_HTONS((u16_t)(ICMP_ECHO << 8)) + 1);
  90142. 80247e8: 693b ldr r3, [r7, #16]
  90143. 80247ea: 885b ldrh r3, [r3, #2]
  90144. 80247ec: b29b uxth r3, r3
  90145. 80247ee: 3309 adds r3, #9
  90146. 80247f0: b29a uxth r2, r3
  90147. 80247f2: 693b ldr r3, [r7, #16]
  90148. 80247f4: 805a strh r2, [r3, #2]
  90149. 80247f6: e006 b.n 8024806 <icmp_input+0x1c6>
  90150. } else {
  90151. iecho->chksum = (u16_t)(iecho->chksum + PP_HTONS(ICMP_ECHO << 8));
  90152. 80247f8: 693b ldr r3, [r7, #16]
  90153. 80247fa: 885b ldrh r3, [r3, #2]
  90154. 80247fc: b29b uxth r3, r3
  90155. 80247fe: 3308 adds r3, #8
  90156. 8024800: b29a uxth r2, r3
  90157. 8024802: 693b ldr r3, [r7, #16]
  90158. 8024804: 805a strh r2, [r3, #2]
  90159. #else /* CHECKSUM_GEN_ICMP */
  90160. iecho->chksum = 0;
  90161. #endif /* CHECKSUM_GEN_ICMP */
  90162. /* Set the correct TTL and recalculate the header checksum. */
  90163. IPH_TTL_SET(iphdr, ICMP_TTL);
  90164. 8024806: 68fb ldr r3, [r7, #12]
  90165. 8024808: 22ff movs r2, #255 @ 0xff
  90166. 802480a: 721a strb r2, [r3, #8]
  90167. IPH_CHKSUM_SET(iphdr, 0);
  90168. 802480c: 68fb ldr r3, [r7, #12]
  90169. 802480e: 2200 movs r2, #0
  90170. 8024810: 729a strb r2, [r3, #10]
  90171. 8024812: 2200 movs r2, #0
  90172. 8024814: 72da strb r2, [r3, #11]
  90173. MIB2_STATS_INC(mib2.icmpoutmsgs);
  90174. /* increase number of echo replies attempted to send */
  90175. MIB2_STATS_INC(mib2.icmpoutechoreps);
  90176. /* send an ICMP packet */
  90177. ret = ip4_output_if(p, src, LWIP_IP_HDRINCL,
  90178. 8024816: 683b ldr r3, [r7, #0]
  90179. 8024818: 9302 str r3, [sp, #8]
  90180. 802481a: 2301 movs r3, #1
  90181. 802481c: 9301 str r3, [sp, #4]
  90182. 802481e: 2300 movs r3, #0
  90183. 8024820: 9300 str r3, [sp, #0]
  90184. 8024822: 23ff movs r3, #255 @ 0xff
  90185. 8024824: 2200 movs r2, #0
  90186. 8024826: 69f9 ldr r1, [r7, #28]
  90187. 8024828: 6878 ldr r0, [r7, #4]
  90188. 802482a: f000 fa9f bl 8024d6c <ip4_output_if>
  90189. 802482e: 4603 mov r3, r0
  90190. 8024830: 72fb strb r3, [r7, #11]
  90191. ICMP_TTL, 0, IP_PROTO_ICMP, inp);
  90192. if (ret != ERR_OK) {
  90193. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %s\n", lwip_strerr(ret)));
  90194. }
  90195. }
  90196. break;
  90197. 8024832: e001 b.n 8024838 <icmp_input+0x1f8>
  90198. break;
  90199. 8024834: bf00 nop
  90200. 8024836: e000 b.n 802483a <icmp_input+0x1fa>
  90201. break;
  90202. 8024838: bf00 nop
  90203. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n",
  90204. (s16_t)type, (s16_t)code));
  90205. ICMP_STATS_INC(icmp.proterr);
  90206. ICMP_STATS_INC(icmp.drop);
  90207. }
  90208. pbuf_free(p);
  90209. 802483a: 6878 ldr r0, [r7, #4]
  90210. 802483c: f7f5 fe4e bl 801a4dc <pbuf_free>
  90211. return;
  90212. 8024840: e013 b.n 802486a <icmp_input+0x22a>
  90213. goto lenerr;
  90214. 8024842: bf00 nop
  90215. 8024844: e002 b.n 802484c <icmp_input+0x20c>
  90216. goto lenerr;
  90217. 8024846: bf00 nop
  90218. 8024848: e000 b.n 802484c <icmp_input+0x20c>
  90219. goto lenerr;
  90220. 802484a: bf00 nop
  90221. lenerr:
  90222. pbuf_free(p);
  90223. 802484c: 6878 ldr r0, [r7, #4]
  90224. 802484e: f7f5 fe45 bl 801a4dc <pbuf_free>
  90225. ICMP_STATS_INC(icmp.lenerr);
  90226. MIB2_STATS_INC(mib2.icmpinerrors);
  90227. return;
  90228. 8024852: e00a b.n 802486a <icmp_input+0x22a>
  90229. goto icmperr;
  90230. 8024854: bf00 nop
  90231. 8024856: e004 b.n 8024862 <icmp_input+0x222>
  90232. goto icmperr;
  90233. 8024858: bf00 nop
  90234. 802485a: e002 b.n 8024862 <icmp_input+0x222>
  90235. goto icmperr;
  90236. 802485c: bf00 nop
  90237. 802485e: e000 b.n 8024862 <icmp_input+0x222>
  90238. goto icmperr;
  90239. 8024860: bf00 nop
  90240. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN || !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING
  90241. icmperr:
  90242. pbuf_free(p);
  90243. 8024862: 6878 ldr r0, [r7, #4]
  90244. 8024864: f7f5 fe3a bl 801a4dc <pbuf_free>
  90245. ICMP_STATS_INC(icmp.err);
  90246. MIB2_STATS_INC(mib2.icmpinerrors);
  90247. return;
  90248. 8024868: bf00 nop
  90249. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN || !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */
  90250. }
  90251. 802486a: 3728 adds r7, #40 @ 0x28
  90252. 802486c: 46bd mov sp, r7
  90253. 802486e: bd80 pop {r7, pc}
  90254. 8024870: 24024338 .word 0x24024338
  90255. 8024874: 2402434c .word 0x2402434c
  90256. 8024878: 0803046c .word 0x0803046c
  90257. 802487c: 080304a4 .word 0x080304a4
  90258. 8024880: 080304dc .word 0x080304dc
  90259. 8024884: 08030504 .word 0x08030504
  90260. 08024888 <icmp_dest_unreach>:
  90261. * p->payload pointing to the IP header
  90262. * @param t type of the 'unreachable' packet
  90263. */
  90264. void
  90265. icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
  90266. {
  90267. 8024888: b580 push {r7, lr}
  90268. 802488a: b082 sub sp, #8
  90269. 802488c: af00 add r7, sp, #0
  90270. 802488e: 6078 str r0, [r7, #4]
  90271. 8024890: 460b mov r3, r1
  90272. 8024892: 70fb strb r3, [r7, #3]
  90273. MIB2_STATS_INC(mib2.icmpoutdestunreachs);
  90274. icmp_send_response(p, ICMP_DUR, t);
  90275. 8024894: 78fb ldrb r3, [r7, #3]
  90276. 8024896: 461a mov r2, r3
  90277. 8024898: 2103 movs r1, #3
  90278. 802489a: 6878 ldr r0, [r7, #4]
  90279. 802489c: f000 f814 bl 80248c8 <icmp_send_response>
  90280. }
  90281. 80248a0: bf00 nop
  90282. 80248a2: 3708 adds r7, #8
  90283. 80248a4: 46bd mov sp, r7
  90284. 80248a6: bd80 pop {r7, pc}
  90285. 080248a8 <icmp_time_exceeded>:
  90286. * p->payload pointing to the IP header
  90287. * @param t type of the 'time exceeded' packet
  90288. */
  90289. void
  90290. icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t)
  90291. {
  90292. 80248a8: b580 push {r7, lr}
  90293. 80248aa: b082 sub sp, #8
  90294. 80248ac: af00 add r7, sp, #0
  90295. 80248ae: 6078 str r0, [r7, #4]
  90296. 80248b0: 460b mov r3, r1
  90297. 80248b2: 70fb strb r3, [r7, #3]
  90298. MIB2_STATS_INC(mib2.icmpouttimeexcds);
  90299. icmp_send_response(p, ICMP_TE, t);
  90300. 80248b4: 78fb ldrb r3, [r7, #3]
  90301. 80248b6: 461a mov r2, r3
  90302. 80248b8: 210b movs r1, #11
  90303. 80248ba: 6878 ldr r0, [r7, #4]
  90304. 80248bc: f000 f804 bl 80248c8 <icmp_send_response>
  90305. }
  90306. 80248c0: bf00 nop
  90307. 80248c2: 3708 adds r7, #8
  90308. 80248c4: 46bd mov sp, r7
  90309. 80248c6: bd80 pop {r7, pc}
  90310. 080248c8 <icmp_send_response>:
  90311. * @param type Type of the ICMP header
  90312. * @param code Code of the ICMP header
  90313. */
  90314. static void
  90315. icmp_send_response(struct pbuf *p, u8_t type, u8_t code)
  90316. {
  90317. 80248c8: b580 push {r7, lr}
  90318. 80248ca: b08c sub sp, #48 @ 0x30
  90319. 80248cc: af04 add r7, sp, #16
  90320. 80248ce: 6078 str r0, [r7, #4]
  90321. 80248d0: 460b mov r3, r1
  90322. 80248d2: 70fb strb r3, [r7, #3]
  90323. 80248d4: 4613 mov r3, r2
  90324. 80248d6: 70bb strb r3, [r7, #2]
  90325. /* increase number of messages attempted to send */
  90326. MIB2_STATS_INC(mib2.icmpoutmsgs);
  90327. /* ICMP header + IP header + 8 bytes of data */
  90328. q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE,
  90329. 80248d8: f44f 7220 mov.w r2, #640 @ 0x280
  90330. 80248dc: 2124 movs r1, #36 @ 0x24
  90331. 80248de: 2022 movs r0, #34 @ 0x22
  90332. 80248e0: f7f5 fae6 bl 8019eb0 <pbuf_alloc>
  90333. 80248e4: 61b8 str r0, [r7, #24]
  90334. PBUF_RAM);
  90335. if (q == NULL) {
  90336. 80248e6: 69bb ldr r3, [r7, #24]
  90337. 80248e8: 2b00 cmp r3, #0
  90338. 80248ea: d056 beq.n 802499a <icmp_send_response+0xd2>
  90339. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\n"));
  90340. MIB2_STATS_INC(mib2.icmpouterrors);
  90341. return;
  90342. }
  90343. LWIP_ASSERT("check that first pbuf can hold icmp message",
  90344. 80248ec: 69bb ldr r3, [r7, #24]
  90345. 80248ee: 895b ldrh r3, [r3, #10]
  90346. 80248f0: 2b23 cmp r3, #35 @ 0x23
  90347. 80248f2: d806 bhi.n 8024902 <icmp_send_response+0x3a>
  90348. 80248f4: 4b2b ldr r3, [pc, #172] @ (80249a4 <icmp_send_response+0xdc>)
  90349. 80248f6: f44f 72b4 mov.w r2, #360 @ 0x168
  90350. 80248fa: 492b ldr r1, [pc, #172] @ (80249a8 <icmp_send_response+0xe0>)
  90351. 80248fc: 482b ldr r0, [pc, #172] @ (80249ac <icmp_send_response+0xe4>)
  90352. 80248fe: f005 f865 bl 80299cc <iprintf>
  90353. (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE)));
  90354. iphdr = (struct ip_hdr *)p->payload;
  90355. 8024902: 687b ldr r3, [r7, #4]
  90356. 8024904: 685b ldr r3, [r3, #4]
  90357. 8024906: 617b str r3, [r7, #20]
  90358. ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->src);
  90359. LWIP_DEBUGF(ICMP_DEBUG, (" to "));
  90360. ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->dest);
  90361. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  90362. icmphdr = (struct icmp_echo_hdr *)q->payload;
  90363. 8024908: 69bb ldr r3, [r7, #24]
  90364. 802490a: 685b ldr r3, [r3, #4]
  90365. 802490c: 613b str r3, [r7, #16]
  90366. icmphdr->type = type;
  90367. 802490e: 693b ldr r3, [r7, #16]
  90368. 8024910: 78fa ldrb r2, [r7, #3]
  90369. 8024912: 701a strb r2, [r3, #0]
  90370. icmphdr->code = code;
  90371. 8024914: 693b ldr r3, [r7, #16]
  90372. 8024916: 78ba ldrb r2, [r7, #2]
  90373. 8024918: 705a strb r2, [r3, #1]
  90374. icmphdr->id = 0;
  90375. 802491a: 693b ldr r3, [r7, #16]
  90376. 802491c: 2200 movs r2, #0
  90377. 802491e: 711a strb r2, [r3, #4]
  90378. 8024920: 2200 movs r2, #0
  90379. 8024922: 715a strb r2, [r3, #5]
  90380. icmphdr->seqno = 0;
  90381. 8024924: 693b ldr r3, [r7, #16]
  90382. 8024926: 2200 movs r2, #0
  90383. 8024928: 719a strb r2, [r3, #6]
  90384. 802492a: 2200 movs r2, #0
  90385. 802492c: 71da strb r2, [r3, #7]
  90386. /* copy fields from original packet */
  90387. SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload,
  90388. 802492e: 69bb ldr r3, [r7, #24]
  90389. 8024930: 685b ldr r3, [r3, #4]
  90390. 8024932: f103 0008 add.w r0, r3, #8
  90391. 8024936: 687b ldr r3, [r7, #4]
  90392. 8024938: 685b ldr r3, [r3, #4]
  90393. 802493a: 221c movs r2, #28
  90394. 802493c: 4619 mov r1, r3
  90395. 802493e: f005 face bl 8029ede <memcpy>
  90396. IP_HLEN + ICMP_DEST_UNREACH_DATASIZE);
  90397. ip4_addr_copy(iphdr_src, iphdr->src);
  90398. 8024942: 697b ldr r3, [r7, #20]
  90399. 8024944: 68db ldr r3, [r3, #12]
  90400. 8024946: 60fb str r3, [r7, #12]
  90401. ip4_addr_t iphdr_dst;
  90402. ip4_addr_copy(iphdr_dst, iphdr->dest);
  90403. netif = ip4_route_src(&iphdr_dst, &iphdr_src);
  90404. }
  90405. #else
  90406. netif = ip4_route(&iphdr_src);
  90407. 8024948: f107 030c add.w r3, r7, #12
  90408. 802494c: 4618 mov r0, r3
  90409. 802494e: f000 f82f bl 80249b0 <ip4_route>
  90410. 8024952: 61f8 str r0, [r7, #28]
  90411. #endif
  90412. if (netif != NULL) {
  90413. 8024954: 69fb ldr r3, [r7, #28]
  90414. 8024956: 2b00 cmp r3, #0
  90415. 8024958: d01b beq.n 8024992 <icmp_send_response+0xca>
  90416. /* calculate checksum */
  90417. icmphdr->chksum = 0;
  90418. 802495a: 693b ldr r3, [r7, #16]
  90419. 802495c: 2200 movs r2, #0
  90420. 802495e: 709a strb r2, [r3, #2]
  90421. 8024960: 2200 movs r2, #0
  90422. 8024962: 70da strb r2, [r3, #3]
  90423. #if CHECKSUM_GEN_ICMP
  90424. IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP) {
  90425. icmphdr->chksum = inet_chksum(icmphdr, q->len);
  90426. 8024964: 69bb ldr r3, [r7, #24]
  90427. 8024966: 895b ldrh r3, [r3, #10]
  90428. 8024968: 4619 mov r1, r3
  90429. 802496a: 6938 ldr r0, [r7, #16]
  90430. 802496c: f7f4 f95f bl 8018c2e <inet_chksum>
  90431. 8024970: 4603 mov r3, r0
  90432. 8024972: 461a mov r2, r3
  90433. 8024974: 693b ldr r3, [r7, #16]
  90434. 8024976: 805a strh r2, [r3, #2]
  90435. }
  90436. #endif
  90437. ICMP_STATS_INC(icmp.xmit);
  90438. ip4_output_if(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP, netif);
  90439. 8024978: f107 020c add.w r2, r7, #12
  90440. 802497c: 69fb ldr r3, [r7, #28]
  90441. 802497e: 9302 str r3, [sp, #8]
  90442. 8024980: 2301 movs r3, #1
  90443. 8024982: 9301 str r3, [sp, #4]
  90444. 8024984: 2300 movs r3, #0
  90445. 8024986: 9300 str r3, [sp, #0]
  90446. 8024988: 23ff movs r3, #255 @ 0xff
  90447. 802498a: 2100 movs r1, #0
  90448. 802498c: 69b8 ldr r0, [r7, #24]
  90449. 802498e: f000 f9ed bl 8024d6c <ip4_output_if>
  90450. }
  90451. pbuf_free(q);
  90452. 8024992: 69b8 ldr r0, [r7, #24]
  90453. 8024994: f7f5 fda2 bl 801a4dc <pbuf_free>
  90454. 8024998: e000 b.n 802499c <icmp_send_response+0xd4>
  90455. return;
  90456. 802499a: bf00 nop
  90457. }
  90458. 802499c: 3720 adds r7, #32
  90459. 802499e: 46bd mov sp, r7
  90460. 80249a0: bd80 pop {r7, pc}
  90461. 80249a2: bf00 nop
  90462. 80249a4: 0803046c .word 0x0803046c
  90463. 80249a8: 08030538 .word 0x08030538
  90464. 80249ac: 080304dc .word 0x080304dc
  90465. 080249b0 <ip4_route>:
  90466. * @param dest the destination IP address for which to find the route
  90467. * @return the netif on which to send to reach dest
  90468. */
  90469. struct netif *
  90470. ip4_route(const ip4_addr_t *dest)
  90471. {
  90472. 80249b0: b580 push {r7, lr}
  90473. 80249b2: b084 sub sp, #16
  90474. 80249b4: af00 add r7, sp, #0
  90475. 80249b6: 6078 str r0, [r7, #4]
  90476. #if !LWIP_SINGLE_NETIF
  90477. struct netif *netif;
  90478. LWIP_ASSERT_CORE_LOCKED();
  90479. 80249b8: f7eb fdba bl 8010530 <sys_check_core_locking>
  90480. /* bug #54569: in case LWIP_SINGLE_NETIF=1 and LWIP_DEBUGF() disabled, the following loop is optimized away */
  90481. LWIP_UNUSED_ARG(dest);
  90482. /* iterate through netifs */
  90483. NETIF_FOREACH(netif) {
  90484. 80249bc: 4b32 ldr r3, [pc, #200] @ (8024a88 <ip4_route+0xd8>)
  90485. 80249be: 681b ldr r3, [r3, #0]
  90486. 80249c0: 60fb str r3, [r7, #12]
  90487. 80249c2: e036 b.n 8024a32 <ip4_route+0x82>
  90488. /* is the netif up, does it have a link and a valid address? */
  90489. if (netif_is_up(netif) && netif_is_link_up(netif) && !ip4_addr_isany_val(*netif_ip4_addr(netif))) {
  90490. 80249c4: 68fb ldr r3, [r7, #12]
  90491. 80249c6: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  90492. 80249ca: f003 0301 and.w r3, r3, #1
  90493. 80249ce: b2db uxtb r3, r3
  90494. 80249d0: 2b00 cmp r3, #0
  90495. 80249d2: d02b beq.n 8024a2c <ip4_route+0x7c>
  90496. 80249d4: 68fb ldr r3, [r7, #12]
  90497. 80249d6: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  90498. 80249da: 089b lsrs r3, r3, #2
  90499. 80249dc: f003 0301 and.w r3, r3, #1
  90500. 80249e0: b2db uxtb r3, r3
  90501. 80249e2: 2b00 cmp r3, #0
  90502. 80249e4: d022 beq.n 8024a2c <ip4_route+0x7c>
  90503. 80249e6: 68fb ldr r3, [r7, #12]
  90504. 80249e8: 3304 adds r3, #4
  90505. 80249ea: 681b ldr r3, [r3, #0]
  90506. 80249ec: 2b00 cmp r3, #0
  90507. 80249ee: d01d beq.n 8024a2c <ip4_route+0x7c>
  90508. /* network mask matches? */
  90509. if (ip4_addr_netcmp(dest, netif_ip4_addr(netif), netif_ip4_netmask(netif))) {
  90510. 80249f0: 687b ldr r3, [r7, #4]
  90511. 80249f2: 681a ldr r2, [r3, #0]
  90512. 80249f4: 68fb ldr r3, [r7, #12]
  90513. 80249f6: 3304 adds r3, #4
  90514. 80249f8: 681b ldr r3, [r3, #0]
  90515. 80249fa: 405a eors r2, r3
  90516. 80249fc: 68fb ldr r3, [r7, #12]
  90517. 80249fe: 3308 adds r3, #8
  90518. 8024a00: 681b ldr r3, [r3, #0]
  90519. 8024a02: 4013 ands r3, r2
  90520. 8024a04: 2b00 cmp r3, #0
  90521. 8024a06: d101 bne.n 8024a0c <ip4_route+0x5c>
  90522. /* return netif on which to forward IP packet */
  90523. return netif;
  90524. 8024a08: 68fb ldr r3, [r7, #12]
  90525. 8024a0a: e038 b.n 8024a7e <ip4_route+0xce>
  90526. }
  90527. /* gateway matches on a non broadcast interface? (i.e. peer in a point to point interface) */
  90528. if (((netif->flags & NETIF_FLAG_BROADCAST) == 0) && ip4_addr_cmp(dest, netif_ip4_gw(netif))) {
  90529. 8024a0c: 68fb ldr r3, [r7, #12]
  90530. 8024a0e: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  90531. 8024a12: f003 0302 and.w r3, r3, #2
  90532. 8024a16: 2b00 cmp r3, #0
  90533. 8024a18: d108 bne.n 8024a2c <ip4_route+0x7c>
  90534. 8024a1a: 687b ldr r3, [r7, #4]
  90535. 8024a1c: 681a ldr r2, [r3, #0]
  90536. 8024a1e: 68fb ldr r3, [r7, #12]
  90537. 8024a20: 330c adds r3, #12
  90538. 8024a22: 681b ldr r3, [r3, #0]
  90539. 8024a24: 429a cmp r2, r3
  90540. 8024a26: d101 bne.n 8024a2c <ip4_route+0x7c>
  90541. /* return netif on which to forward IP packet */
  90542. return netif;
  90543. 8024a28: 68fb ldr r3, [r7, #12]
  90544. 8024a2a: e028 b.n 8024a7e <ip4_route+0xce>
  90545. NETIF_FOREACH(netif) {
  90546. 8024a2c: 68fb ldr r3, [r7, #12]
  90547. 8024a2e: 681b ldr r3, [r3, #0]
  90548. 8024a30: 60fb str r3, [r7, #12]
  90549. 8024a32: 68fb ldr r3, [r7, #12]
  90550. 8024a34: 2b00 cmp r3, #0
  90551. 8024a36: d1c5 bne.n 80249c4 <ip4_route+0x14>
  90552. return netif;
  90553. }
  90554. #endif
  90555. #endif /* !LWIP_SINGLE_NETIF */
  90556. if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default) ||
  90557. 8024a38: 4b14 ldr r3, [pc, #80] @ (8024a8c <ip4_route+0xdc>)
  90558. 8024a3a: 681b ldr r3, [r3, #0]
  90559. 8024a3c: 2b00 cmp r3, #0
  90560. 8024a3e: d01a beq.n 8024a76 <ip4_route+0xc6>
  90561. 8024a40: 4b12 ldr r3, [pc, #72] @ (8024a8c <ip4_route+0xdc>)
  90562. 8024a42: 681b ldr r3, [r3, #0]
  90563. 8024a44: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  90564. 8024a48: f003 0301 and.w r3, r3, #1
  90565. 8024a4c: 2b00 cmp r3, #0
  90566. 8024a4e: d012 beq.n 8024a76 <ip4_route+0xc6>
  90567. 8024a50: 4b0e ldr r3, [pc, #56] @ (8024a8c <ip4_route+0xdc>)
  90568. 8024a52: 681b ldr r3, [r3, #0]
  90569. 8024a54: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  90570. 8024a58: f003 0304 and.w r3, r3, #4
  90571. 8024a5c: 2b00 cmp r3, #0
  90572. 8024a5e: d00a beq.n 8024a76 <ip4_route+0xc6>
  90573. ip4_addr_isany_val(*netif_ip4_addr(netif_default)) || ip4_addr_isloopback(dest)) {
  90574. 8024a60: 4b0a ldr r3, [pc, #40] @ (8024a8c <ip4_route+0xdc>)
  90575. 8024a62: 681b ldr r3, [r3, #0]
  90576. 8024a64: 3304 adds r3, #4
  90577. 8024a66: 681b ldr r3, [r3, #0]
  90578. if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default) ||
  90579. 8024a68: 2b00 cmp r3, #0
  90580. 8024a6a: d004 beq.n 8024a76 <ip4_route+0xc6>
  90581. ip4_addr_isany_val(*netif_ip4_addr(netif_default)) || ip4_addr_isloopback(dest)) {
  90582. 8024a6c: 687b ldr r3, [r7, #4]
  90583. 8024a6e: 681b ldr r3, [r3, #0]
  90584. 8024a70: b2db uxtb r3, r3
  90585. 8024a72: 2b7f cmp r3, #127 @ 0x7f
  90586. 8024a74: d101 bne.n 8024a7a <ip4_route+0xca>
  90587. If this is not good enough for you, use LWIP_HOOK_IP4_ROUTE() */
  90588. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_route: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
  90589. ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
  90590. IP_STATS_INC(ip.rterr);
  90591. MIB2_STATS_INC(mib2.ipoutnoroutes);
  90592. return NULL;
  90593. 8024a76: 2300 movs r3, #0
  90594. 8024a78: e001 b.n 8024a7e <ip4_route+0xce>
  90595. }
  90596. return netif_default;
  90597. 8024a7a: 4b04 ldr r3, [pc, #16] @ (8024a8c <ip4_route+0xdc>)
  90598. 8024a7c: 681b ldr r3, [r3, #0]
  90599. }
  90600. 8024a7e: 4618 mov r0, r3
  90601. 8024a80: 3710 adds r7, #16
  90602. 8024a82: 46bd mov sp, r7
  90603. 8024a84: bd80 pop {r7, pc}
  90604. 8024a86: bf00 nop
  90605. 8024a88: 2402ae7c .word 0x2402ae7c
  90606. 8024a8c: 2402ae80 .word 0x2402ae80
  90607. 08024a90 <ip4_input_accept>:
  90608. #endif /* IP_FORWARD */
  90609. /** Return true if the current input packet should be accepted on this netif */
  90610. static int
  90611. ip4_input_accept(struct netif *netif)
  90612. {
  90613. 8024a90: b580 push {r7, lr}
  90614. 8024a92: b082 sub sp, #8
  90615. 8024a94: af00 add r7, sp, #0
  90616. 8024a96: 6078 str r0, [r7, #4]
  90617. ip4_addr_get_u32(ip4_current_dest_addr()) & ip4_addr_get_u32(netif_ip4_netmask(netif)),
  90618. ip4_addr_get_u32(netif_ip4_addr(netif)) & ip4_addr_get_u32(netif_ip4_netmask(netif)),
  90619. ip4_addr_get_u32(ip4_current_dest_addr()) & ~ip4_addr_get_u32(netif_ip4_netmask(netif))));
  90620. /* interface is up and configured? */
  90621. if ((netif_is_up(netif)) && (!ip4_addr_isany_val(*netif_ip4_addr(netif)))) {
  90622. 8024a98: 687b ldr r3, [r7, #4]
  90623. 8024a9a: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  90624. 8024a9e: f003 0301 and.w r3, r3, #1
  90625. 8024aa2: b2db uxtb r3, r3
  90626. 8024aa4: 2b00 cmp r3, #0
  90627. 8024aa6: d016 beq.n 8024ad6 <ip4_input_accept+0x46>
  90628. 8024aa8: 687b ldr r3, [r7, #4]
  90629. 8024aaa: 3304 adds r3, #4
  90630. 8024aac: 681b ldr r3, [r3, #0]
  90631. 8024aae: 2b00 cmp r3, #0
  90632. 8024ab0: d011 beq.n 8024ad6 <ip4_input_accept+0x46>
  90633. /* unicast to this interface address? */
  90634. if (ip4_addr_cmp(ip4_current_dest_addr(), netif_ip4_addr(netif)) ||
  90635. 8024ab2: 4b0b ldr r3, [pc, #44] @ (8024ae0 <ip4_input_accept+0x50>)
  90636. 8024ab4: 695a ldr r2, [r3, #20]
  90637. 8024ab6: 687b ldr r3, [r7, #4]
  90638. 8024ab8: 3304 adds r3, #4
  90639. 8024aba: 681b ldr r3, [r3, #0]
  90640. 8024abc: 429a cmp r2, r3
  90641. 8024abe: d008 beq.n 8024ad2 <ip4_input_accept+0x42>
  90642. /* or broadcast on this interface network address? */
  90643. ip4_addr_isbroadcast(ip4_current_dest_addr(), netif)
  90644. 8024ac0: 4b07 ldr r3, [pc, #28] @ (8024ae0 <ip4_input_accept+0x50>)
  90645. 8024ac2: 695b ldr r3, [r3, #20]
  90646. 8024ac4: 6879 ldr r1, [r7, #4]
  90647. 8024ac6: 4618 mov r0, r3
  90648. 8024ac8: f000 fa2a bl 8024f20 <ip4_addr_isbroadcast_u32>
  90649. 8024acc: 4603 mov r3, r0
  90650. if (ip4_addr_cmp(ip4_current_dest_addr(), netif_ip4_addr(netif)) ||
  90651. 8024ace: 2b00 cmp r3, #0
  90652. 8024ad0: d001 beq.n 8024ad6 <ip4_input_accept+0x46>
  90653. #endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */
  90654. ) {
  90655. LWIP_DEBUGF(IP_DEBUG, ("ip4_input: packet accepted on interface %c%c\n",
  90656. netif->name[0], netif->name[1]));
  90657. /* accept on this netif */
  90658. return 1;
  90659. 8024ad2: 2301 movs r3, #1
  90660. 8024ad4: e000 b.n 8024ad8 <ip4_input_accept+0x48>
  90661. /* accept on this netif */
  90662. return 1;
  90663. }
  90664. #endif /* LWIP_AUTOIP */
  90665. }
  90666. return 0;
  90667. 8024ad6: 2300 movs r3, #0
  90668. }
  90669. 8024ad8: 4618 mov r0, r3
  90670. 8024ada: 3708 adds r7, #8
  90671. 8024adc: 46bd mov sp, r7
  90672. 8024ade: bd80 pop {r7, pc}
  90673. 8024ae0: 24024338 .word 0x24024338
  90674. 08024ae4 <ip4_input>:
  90675. * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't
  90676. * processed, but currently always returns ERR_OK)
  90677. */
  90678. err_t
  90679. ip4_input(struct pbuf *p, struct netif *inp)
  90680. {
  90681. 8024ae4: b580 push {r7, lr}
  90682. 8024ae6: b088 sub sp, #32
  90683. 8024ae8: af00 add r7, sp, #0
  90684. 8024aea: 6078 str r0, [r7, #4]
  90685. 8024aec: 6039 str r1, [r7, #0]
  90686. const struct ip_hdr *iphdr;
  90687. struct netif *netif;
  90688. u16_t iphdr_hlen;
  90689. u16_t iphdr_len;
  90690. #if IP_ACCEPT_LINK_LAYER_ADDRESSING || LWIP_IGMP
  90691. int check_ip_src = 1;
  90692. 8024aee: 2301 movs r3, #1
  90693. 8024af0: 617b str r3, [r7, #20]
  90694. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING || LWIP_IGMP */
  90695. #if LWIP_RAW
  90696. raw_input_state_t raw_status;
  90697. #endif /* LWIP_RAW */
  90698. LWIP_ASSERT_CORE_LOCKED();
  90699. 8024af2: f7eb fd1d bl 8010530 <sys_check_core_locking>
  90700. IP_STATS_INC(ip.recv);
  90701. MIB2_STATS_INC(mib2.ipinreceives);
  90702. /* identify the IP header */
  90703. iphdr = (struct ip_hdr *)p->payload;
  90704. 8024af6: 687b ldr r3, [r7, #4]
  90705. 8024af8: 685b ldr r3, [r3, #4]
  90706. 8024afa: 613b str r3, [r7, #16]
  90707. if (IPH_V(iphdr) != 4) {
  90708. 8024afc: 693b ldr r3, [r7, #16]
  90709. 8024afe: 781b ldrb r3, [r3, #0]
  90710. 8024b00: 091b lsrs r3, r3, #4
  90711. 8024b02: b2db uxtb r3, r3
  90712. 8024b04: 2b04 cmp r3, #4
  90713. 8024b06: d004 beq.n 8024b12 <ip4_input+0x2e>
  90714. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", (u16_t)IPH_V(iphdr)));
  90715. ip4_debug_print(p);
  90716. pbuf_free(p);
  90717. 8024b08: 6878 ldr r0, [r7, #4]
  90718. 8024b0a: f7f5 fce7 bl 801a4dc <pbuf_free>
  90719. IP_STATS_INC(ip.err);
  90720. IP_STATS_INC(ip.drop);
  90721. MIB2_STATS_INC(mib2.ipinhdrerrors);
  90722. return ERR_OK;
  90723. 8024b0e: 2300 movs r3, #0
  90724. 8024b10: e123 b.n 8024d5a <ip4_input+0x276>
  90725. return ERR_OK;
  90726. }
  90727. #endif
  90728. /* obtain IP header length in bytes */
  90729. iphdr_hlen = IPH_HL_BYTES(iphdr);
  90730. 8024b12: 693b ldr r3, [r7, #16]
  90731. 8024b14: 781b ldrb r3, [r3, #0]
  90732. 8024b16: f003 030f and.w r3, r3, #15
  90733. 8024b1a: b2db uxtb r3, r3
  90734. 8024b1c: 009b lsls r3, r3, #2
  90735. 8024b1e: b2db uxtb r3, r3
  90736. 8024b20: 81fb strh r3, [r7, #14]
  90737. /* obtain ip length in bytes */
  90738. iphdr_len = lwip_ntohs(IPH_LEN(iphdr));
  90739. 8024b22: 693b ldr r3, [r7, #16]
  90740. 8024b24: 885b ldrh r3, [r3, #2]
  90741. 8024b26: b29b uxth r3, r3
  90742. 8024b28: 4618 mov r0, r3
  90743. 8024b2a: f7f3 fff5 bl 8018b18 <lwip_htons>
  90744. 8024b2e: 4603 mov r3, r0
  90745. 8024b30: 837b strh r3, [r7, #26]
  90746. /* Trim pbuf. This is especially required for packets < 60 bytes. */
  90747. if (iphdr_len < p->tot_len) {
  90748. 8024b32: 687b ldr r3, [r7, #4]
  90749. 8024b34: 891b ldrh r3, [r3, #8]
  90750. 8024b36: 8b7a ldrh r2, [r7, #26]
  90751. 8024b38: 429a cmp r2, r3
  90752. 8024b3a: d204 bcs.n 8024b46 <ip4_input+0x62>
  90753. pbuf_realloc(p, iphdr_len);
  90754. 8024b3c: 8b7b ldrh r3, [r7, #26]
  90755. 8024b3e: 4619 mov r1, r3
  90756. 8024b40: 6878 ldr r0, [r7, #4]
  90757. 8024b42: f7f5 fb15 bl 801a170 <pbuf_realloc>
  90758. }
  90759. /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
  90760. if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len) || (iphdr_hlen < IP_HLEN)) {
  90761. 8024b46: 687b ldr r3, [r7, #4]
  90762. 8024b48: 895b ldrh r3, [r3, #10]
  90763. 8024b4a: 89fa ldrh r2, [r7, #14]
  90764. 8024b4c: 429a cmp r2, r3
  90765. 8024b4e: d807 bhi.n 8024b60 <ip4_input+0x7c>
  90766. 8024b50: 687b ldr r3, [r7, #4]
  90767. 8024b52: 891b ldrh r3, [r3, #8]
  90768. 8024b54: 8b7a ldrh r2, [r7, #26]
  90769. 8024b56: 429a cmp r2, r3
  90770. 8024b58: d802 bhi.n 8024b60 <ip4_input+0x7c>
  90771. 8024b5a: 89fb ldrh r3, [r7, #14]
  90772. 8024b5c: 2b13 cmp r3, #19
  90773. 8024b5e: d804 bhi.n 8024b6a <ip4_input+0x86>
  90774. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  90775. ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
  90776. iphdr_len, p->tot_len));
  90777. }
  90778. /* free (drop) packet pbufs */
  90779. pbuf_free(p);
  90780. 8024b60: 6878 ldr r0, [r7, #4]
  90781. 8024b62: f7f5 fcbb bl 801a4dc <pbuf_free>
  90782. IP_STATS_INC(ip.lenerr);
  90783. IP_STATS_INC(ip.drop);
  90784. MIB2_STATS_INC(mib2.ipindiscards);
  90785. return ERR_OK;
  90786. 8024b66: 2300 movs r3, #0
  90787. 8024b68: e0f7 b.n 8024d5a <ip4_input+0x276>
  90788. }
  90789. }
  90790. #endif
  90791. /* copy IP addresses to aligned ip_addr_t */
  90792. ip_addr_copy_from_ip4(ip_data.current_iphdr_dest, iphdr->dest);
  90793. 8024b6a: 693b ldr r3, [r7, #16]
  90794. 8024b6c: 691b ldr r3, [r3, #16]
  90795. 8024b6e: 4a7d ldr r2, [pc, #500] @ (8024d64 <ip4_input+0x280>)
  90796. 8024b70: 6153 str r3, [r2, #20]
  90797. ip_addr_copy_from_ip4(ip_data.current_iphdr_src, iphdr->src);
  90798. 8024b72: 693b ldr r3, [r7, #16]
  90799. 8024b74: 68db ldr r3, [r3, #12]
  90800. 8024b76: 4a7b ldr r2, [pc, #492] @ (8024d64 <ip4_input+0x280>)
  90801. 8024b78: 6113 str r3, [r2, #16]
  90802. /* match packet against an interface, i.e. is this packet for us? */
  90803. if (ip4_addr_ismulticast(ip4_current_dest_addr())) {
  90804. 8024b7a: 4b7a ldr r3, [pc, #488] @ (8024d64 <ip4_input+0x280>)
  90805. 8024b7c: 695b ldr r3, [r3, #20]
  90806. 8024b7e: f003 03f0 and.w r3, r3, #240 @ 0xf0
  90807. 8024b82: 2be0 cmp r3, #224 @ 0xe0
  90808. 8024b84: d112 bne.n 8024bac <ip4_input+0xc8>
  90809. netif = inp;
  90810. } else {
  90811. netif = NULL;
  90812. }
  90813. #else /* LWIP_IGMP */
  90814. if ((netif_is_up(inp)) && (!ip4_addr_isany_val(*netif_ip4_addr(inp)))) {
  90815. 8024b86: 683b ldr r3, [r7, #0]
  90816. 8024b88: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  90817. 8024b8c: f003 0301 and.w r3, r3, #1
  90818. 8024b90: b2db uxtb r3, r3
  90819. 8024b92: 2b00 cmp r3, #0
  90820. 8024b94: d007 beq.n 8024ba6 <ip4_input+0xc2>
  90821. 8024b96: 683b ldr r3, [r7, #0]
  90822. 8024b98: 3304 adds r3, #4
  90823. 8024b9a: 681b ldr r3, [r3, #0]
  90824. 8024b9c: 2b00 cmp r3, #0
  90825. 8024b9e: d002 beq.n 8024ba6 <ip4_input+0xc2>
  90826. netif = inp;
  90827. 8024ba0: 683b ldr r3, [r7, #0]
  90828. 8024ba2: 61fb str r3, [r7, #28]
  90829. 8024ba4: e02a b.n 8024bfc <ip4_input+0x118>
  90830. } else {
  90831. netif = NULL;
  90832. 8024ba6: 2300 movs r3, #0
  90833. 8024ba8: 61fb str r3, [r7, #28]
  90834. 8024baa: e027 b.n 8024bfc <ip4_input+0x118>
  90835. }
  90836. #endif /* LWIP_IGMP */
  90837. } else {
  90838. /* start trying with inp. if that's not acceptable, start walking the
  90839. list of configured netifs. */
  90840. if (ip4_input_accept(inp)) {
  90841. 8024bac: 6838 ldr r0, [r7, #0]
  90842. 8024bae: f7ff ff6f bl 8024a90 <ip4_input_accept>
  90843. 8024bb2: 4603 mov r3, r0
  90844. 8024bb4: 2b00 cmp r3, #0
  90845. 8024bb6: d002 beq.n 8024bbe <ip4_input+0xda>
  90846. netif = inp;
  90847. 8024bb8: 683b ldr r3, [r7, #0]
  90848. 8024bba: 61fb str r3, [r7, #28]
  90849. 8024bbc: e01e b.n 8024bfc <ip4_input+0x118>
  90850. } else {
  90851. netif = NULL;
  90852. 8024bbe: 2300 movs r3, #0
  90853. 8024bc0: 61fb str r3, [r7, #28]
  90854. #if !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF
  90855. /* Packets sent to the loopback address must not be accepted on an
  90856. * interface that does not have the loopback address assigned to it,
  90857. * unless a non-loopback interface is used for loopback traffic. */
  90858. if (!ip4_addr_isloopback(ip4_current_dest_addr()))
  90859. 8024bc2: 4b68 ldr r3, [pc, #416] @ (8024d64 <ip4_input+0x280>)
  90860. 8024bc4: 695b ldr r3, [r3, #20]
  90861. 8024bc6: b2db uxtb r3, r3
  90862. 8024bc8: 2b7f cmp r3, #127 @ 0x7f
  90863. 8024bca: d017 beq.n 8024bfc <ip4_input+0x118>
  90864. #endif /* !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF */
  90865. {
  90866. #if !LWIP_SINGLE_NETIF
  90867. NETIF_FOREACH(netif) {
  90868. 8024bcc: 4b66 ldr r3, [pc, #408] @ (8024d68 <ip4_input+0x284>)
  90869. 8024bce: 681b ldr r3, [r3, #0]
  90870. 8024bd0: 61fb str r3, [r7, #28]
  90871. 8024bd2: e00e b.n 8024bf2 <ip4_input+0x10e>
  90872. if (netif == inp) {
  90873. 8024bd4: 69fa ldr r2, [r7, #28]
  90874. 8024bd6: 683b ldr r3, [r7, #0]
  90875. 8024bd8: 429a cmp r2, r3
  90876. 8024bda: d006 beq.n 8024bea <ip4_input+0x106>
  90877. /* we checked that before already */
  90878. continue;
  90879. }
  90880. if (ip4_input_accept(netif)) {
  90881. 8024bdc: 69f8 ldr r0, [r7, #28]
  90882. 8024bde: f7ff ff57 bl 8024a90 <ip4_input_accept>
  90883. 8024be2: 4603 mov r3, r0
  90884. 8024be4: 2b00 cmp r3, #0
  90885. 8024be6: d108 bne.n 8024bfa <ip4_input+0x116>
  90886. 8024be8: e000 b.n 8024bec <ip4_input+0x108>
  90887. continue;
  90888. 8024bea: bf00 nop
  90889. NETIF_FOREACH(netif) {
  90890. 8024bec: 69fb ldr r3, [r7, #28]
  90891. 8024bee: 681b ldr r3, [r3, #0]
  90892. 8024bf0: 61fb str r3, [r7, #28]
  90893. 8024bf2: 69fb ldr r3, [r7, #28]
  90894. 8024bf4: 2b00 cmp r3, #0
  90895. 8024bf6: d1ed bne.n 8024bd4 <ip4_input+0xf0>
  90896. 8024bf8: e000 b.n 8024bfc <ip4_input+0x118>
  90897. break;
  90898. 8024bfa: bf00 nop
  90899. * If you want to accept private broadcast communication while a netif is down,
  90900. * define LWIP_IP_ACCEPT_UDP_PORT(dst_port), e.g.:
  90901. *
  90902. * #define LWIP_IP_ACCEPT_UDP_PORT(dst_port) ((dst_port) == PP_NTOHS(12345))
  90903. */
  90904. if (netif == NULL) {
  90905. 8024bfc: 69fb ldr r3, [r7, #28]
  90906. 8024bfe: 2b00 cmp r3, #0
  90907. 8024c00: d111 bne.n 8024c26 <ip4_input+0x142>
  90908. /* remote port is DHCP server? */
  90909. if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
  90910. 8024c02: 693b ldr r3, [r7, #16]
  90911. 8024c04: 7a5b ldrb r3, [r3, #9]
  90912. 8024c06: 2b11 cmp r3, #17
  90913. 8024c08: d10d bne.n 8024c26 <ip4_input+0x142>
  90914. const struct udp_hdr *udphdr = (const struct udp_hdr *)((const u8_t *)iphdr + iphdr_hlen);
  90915. 8024c0a: 89fb ldrh r3, [r7, #14]
  90916. 8024c0c: 693a ldr r2, [r7, #16]
  90917. 8024c0e: 4413 add r3, r2
  90918. 8024c10: 60bb str r3, [r7, #8]
  90919. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip4_input: UDP packet to DHCP client port %"U16_F"\n",
  90920. lwip_ntohs(udphdr->dest)));
  90921. if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) {
  90922. 8024c12: 68bb ldr r3, [r7, #8]
  90923. 8024c14: 885b ldrh r3, [r3, #2]
  90924. 8024c16: b29b uxth r3, r3
  90925. 8024c18: f5b3 4f88 cmp.w r3, #17408 @ 0x4400
  90926. 8024c1c: d103 bne.n 8024c26 <ip4_input+0x142>
  90927. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip4_input: DHCP packet accepted.\n"));
  90928. netif = inp;
  90929. 8024c1e: 683b ldr r3, [r7, #0]
  90930. 8024c20: 61fb str r3, [r7, #28]
  90931. check_ip_src = 0;
  90932. 8024c22: 2300 movs r3, #0
  90933. 8024c24: 617b str r3, [r7, #20]
  90934. }
  90935. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  90936. /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
  90937. #if LWIP_IGMP || IP_ACCEPT_LINK_LAYER_ADDRESSING
  90938. if (check_ip_src
  90939. 8024c26: 697b ldr r3, [r7, #20]
  90940. 8024c28: 2b00 cmp r3, #0
  90941. 8024c2a: d017 beq.n 8024c5c <ip4_input+0x178>
  90942. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  90943. /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
  90944. && !ip4_addr_isany_val(*ip4_current_src_addr())
  90945. 8024c2c: 4b4d ldr r3, [pc, #308] @ (8024d64 <ip4_input+0x280>)
  90946. 8024c2e: 691b ldr r3, [r3, #16]
  90947. 8024c30: 2b00 cmp r3, #0
  90948. 8024c32: d013 beq.n 8024c5c <ip4_input+0x178>
  90949. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  90950. )
  90951. #endif /* LWIP_IGMP || IP_ACCEPT_LINK_LAYER_ADDRESSING */
  90952. {
  90953. if ((ip4_addr_isbroadcast(ip4_current_src_addr(), inp)) ||
  90954. 8024c34: 4b4b ldr r3, [pc, #300] @ (8024d64 <ip4_input+0x280>)
  90955. 8024c36: 691b ldr r3, [r3, #16]
  90956. 8024c38: 6839 ldr r1, [r7, #0]
  90957. 8024c3a: 4618 mov r0, r3
  90958. 8024c3c: f000 f970 bl 8024f20 <ip4_addr_isbroadcast_u32>
  90959. 8024c40: 4603 mov r3, r0
  90960. 8024c42: 2b00 cmp r3, #0
  90961. 8024c44: d105 bne.n 8024c52 <ip4_input+0x16e>
  90962. (ip4_addr_ismulticast(ip4_current_src_addr()))) {
  90963. 8024c46: 4b47 ldr r3, [pc, #284] @ (8024d64 <ip4_input+0x280>)
  90964. 8024c48: 691b ldr r3, [r3, #16]
  90965. 8024c4a: f003 03f0 and.w r3, r3, #240 @ 0xf0
  90966. if ((ip4_addr_isbroadcast(ip4_current_src_addr(), inp)) ||
  90967. 8024c4e: 2be0 cmp r3, #224 @ 0xe0
  90968. 8024c50: d104 bne.n 8024c5c <ip4_input+0x178>
  90969. /* packet source is not valid */
  90970. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip4_input: packet source is not valid.\n"));
  90971. /* free (drop) packet pbufs */
  90972. pbuf_free(p);
  90973. 8024c52: 6878 ldr r0, [r7, #4]
  90974. 8024c54: f7f5 fc42 bl 801a4dc <pbuf_free>
  90975. IP_STATS_INC(ip.drop);
  90976. MIB2_STATS_INC(mib2.ipinaddrerrors);
  90977. MIB2_STATS_INC(mib2.ipindiscards);
  90978. return ERR_OK;
  90979. 8024c58: 2300 movs r3, #0
  90980. 8024c5a: e07e b.n 8024d5a <ip4_input+0x276>
  90981. }
  90982. }
  90983. /* packet not for us? */
  90984. if (netif == NULL) {
  90985. 8024c5c: 69fb ldr r3, [r7, #28]
  90986. 8024c5e: 2b00 cmp r3, #0
  90987. 8024c60: d104 bne.n 8024c6c <ip4_input+0x188>
  90988. {
  90989. IP_STATS_INC(ip.drop);
  90990. MIB2_STATS_INC(mib2.ipinaddrerrors);
  90991. MIB2_STATS_INC(mib2.ipindiscards);
  90992. }
  90993. pbuf_free(p);
  90994. 8024c62: 6878 ldr r0, [r7, #4]
  90995. 8024c64: f7f5 fc3a bl 801a4dc <pbuf_free>
  90996. return ERR_OK;
  90997. 8024c68: 2300 movs r3, #0
  90998. 8024c6a: e076 b.n 8024d5a <ip4_input+0x276>
  90999. }
  91000. /* packet consists of multiple fragments? */
  91001. if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) {
  91002. 8024c6c: 693b ldr r3, [r7, #16]
  91003. 8024c6e: 88db ldrh r3, [r3, #6]
  91004. 8024c70: b29b uxth r3, r3
  91005. 8024c72: 461a mov r2, r3
  91006. 8024c74: f64f 733f movw r3, #65343 @ 0xff3f
  91007. 8024c78: 4013 ands r3, r2
  91008. 8024c7a: 2b00 cmp r3, #0
  91009. 8024c7c: d00b beq.n 8024c96 <ip4_input+0x1b2>
  91010. #if IP_REASSEMBLY /* packet fragment reassembly code present? */
  91011. LWIP_DEBUGF(IP_DEBUG, ("IP packet is a fragment (id=0x%04"X16_F" tot_len=%"U16_F" len=%"U16_F" MF=%"U16_F" offset=%"U16_F"), calling ip4_reass()\n",
  91012. lwip_ntohs(IPH_ID(iphdr)), p->tot_len, lwip_ntohs(IPH_LEN(iphdr)), (u16_t)!!(IPH_OFFSET(iphdr) & PP_HTONS(IP_MF)), (u16_t)((lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK) * 8)));
  91013. /* reassemble the packet*/
  91014. p = ip4_reass(p);
  91015. 8024c7e: 6878 ldr r0, [r7, #4]
  91016. 8024c80: f000 fe62 bl 8025948 <ip4_reass>
  91017. 8024c84: 6078 str r0, [r7, #4]
  91018. /* packet not fully reassembled yet? */
  91019. if (p == NULL) {
  91020. 8024c86: 687b ldr r3, [r7, #4]
  91021. 8024c88: 2b00 cmp r3, #0
  91022. 8024c8a: d101 bne.n 8024c90 <ip4_input+0x1ac>
  91023. return ERR_OK;
  91024. 8024c8c: 2300 movs r3, #0
  91025. 8024c8e: e064 b.n 8024d5a <ip4_input+0x276>
  91026. }
  91027. iphdr = (const struct ip_hdr *)p->payload;
  91028. 8024c90: 687b ldr r3, [r7, #4]
  91029. 8024c92: 685b ldr r3, [r3, #4]
  91030. 8024c94: 613b str r3, [r7, #16]
  91031. /* send to upper layers */
  91032. LWIP_DEBUGF(IP_DEBUG, ("ip4_input: \n"));
  91033. ip4_debug_print(p);
  91034. LWIP_DEBUGF(IP_DEBUG, ("ip4_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
  91035. ip_data.current_netif = netif;
  91036. 8024c96: 4a33 ldr r2, [pc, #204] @ (8024d64 <ip4_input+0x280>)
  91037. 8024c98: 69fb ldr r3, [r7, #28]
  91038. 8024c9a: 6013 str r3, [r2, #0]
  91039. ip_data.current_input_netif = inp;
  91040. 8024c9c: 4a31 ldr r2, [pc, #196] @ (8024d64 <ip4_input+0x280>)
  91041. 8024c9e: 683b ldr r3, [r7, #0]
  91042. 8024ca0: 6053 str r3, [r2, #4]
  91043. ip_data.current_ip4_header = iphdr;
  91044. 8024ca2: 4a30 ldr r2, [pc, #192] @ (8024d64 <ip4_input+0x280>)
  91045. 8024ca4: 693b ldr r3, [r7, #16]
  91046. 8024ca6: 6093 str r3, [r2, #8]
  91047. ip_data.current_ip_header_tot_len = IPH_HL_BYTES(iphdr);
  91048. 8024ca8: 693b ldr r3, [r7, #16]
  91049. 8024caa: 781b ldrb r3, [r3, #0]
  91050. 8024cac: f003 030f and.w r3, r3, #15
  91051. 8024cb0: b2db uxtb r3, r3
  91052. 8024cb2: 009b lsls r3, r3, #2
  91053. 8024cb4: b2db uxtb r3, r3
  91054. 8024cb6: 461a mov r2, r3
  91055. 8024cb8: 4b2a ldr r3, [pc, #168] @ (8024d64 <ip4_input+0x280>)
  91056. 8024cba: 819a strh r2, [r3, #12]
  91057. /* raw input did not eat the packet? */
  91058. raw_status = raw_input(p, inp);
  91059. if (raw_status != RAW_INPUT_EATEN)
  91060. #endif /* LWIP_RAW */
  91061. {
  91062. pbuf_remove_header(p, iphdr_hlen); /* Move to payload, no check necessary. */
  91063. 8024cbc: 89fb ldrh r3, [r7, #14]
  91064. 8024cbe: 4619 mov r1, r3
  91065. 8024cc0: 6878 ldr r0, [r7, #4]
  91066. 8024cc2: f7f5 fb53 bl 801a36c <pbuf_remove_header>
  91067. switch (IPH_PROTO(iphdr)) {
  91068. 8024cc6: 693b ldr r3, [r7, #16]
  91069. 8024cc8: 7a5b ldrb r3, [r3, #9]
  91070. 8024cca: 2b11 cmp r3, #17
  91071. 8024ccc: d006 beq.n 8024cdc <ip4_input+0x1f8>
  91072. 8024cce: 2b11 cmp r3, #17
  91073. 8024cd0: dc13 bgt.n 8024cfa <ip4_input+0x216>
  91074. 8024cd2: 2b01 cmp r3, #1
  91075. 8024cd4: d00c beq.n 8024cf0 <ip4_input+0x20c>
  91076. 8024cd6: 2b06 cmp r3, #6
  91077. 8024cd8: d005 beq.n 8024ce6 <ip4_input+0x202>
  91078. 8024cda: e00e b.n 8024cfa <ip4_input+0x216>
  91079. case IP_PROTO_UDP:
  91080. #if LWIP_UDPLITE
  91081. case IP_PROTO_UDPLITE:
  91082. #endif /* LWIP_UDPLITE */
  91083. MIB2_STATS_INC(mib2.ipindelivers);
  91084. udp_input(p, inp);
  91085. 8024cdc: 6839 ldr r1, [r7, #0]
  91086. 8024cde: 6878 ldr r0, [r7, #4]
  91087. 8024ce0: f7fc f99c bl 802101c <udp_input>
  91088. break;
  91089. 8024ce4: e026 b.n 8024d34 <ip4_input+0x250>
  91090. #endif /* LWIP_UDP */
  91091. #if LWIP_TCP
  91092. case IP_PROTO_TCP:
  91093. MIB2_STATS_INC(mib2.ipindelivers);
  91094. tcp_input(p, inp);
  91095. 8024ce6: 6839 ldr r1, [r7, #0]
  91096. 8024ce8: 6878 ldr r0, [r7, #4]
  91097. 8024cea: f7f7 fcdd bl 801c6a8 <tcp_input>
  91098. break;
  91099. 8024cee: e021 b.n 8024d34 <ip4_input+0x250>
  91100. #endif /* LWIP_TCP */
  91101. #if LWIP_ICMP
  91102. case IP_PROTO_ICMP:
  91103. MIB2_STATS_INC(mib2.ipindelivers);
  91104. icmp_input(p, inp);
  91105. 8024cf0: 6839 ldr r1, [r7, #0]
  91106. 8024cf2: 6878 ldr r0, [r7, #4]
  91107. 8024cf4: f7ff fca4 bl 8024640 <icmp_input>
  91108. break;
  91109. 8024cf8: e01c b.n 8024d34 <ip4_input+0x250>
  91110. } else
  91111. #endif /* LWIP_RAW */
  91112. {
  91113. #if LWIP_ICMP
  91114. /* send ICMP destination protocol unreachable unless is was a broadcast */
  91115. if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) &&
  91116. 8024cfa: 4b1a ldr r3, [pc, #104] @ (8024d64 <ip4_input+0x280>)
  91117. 8024cfc: 695b ldr r3, [r3, #20]
  91118. 8024cfe: 69f9 ldr r1, [r7, #28]
  91119. 8024d00: 4618 mov r0, r3
  91120. 8024d02: f000 f90d bl 8024f20 <ip4_addr_isbroadcast_u32>
  91121. 8024d06: 4603 mov r3, r0
  91122. 8024d08: 2b00 cmp r3, #0
  91123. 8024d0a: d10f bne.n 8024d2c <ip4_input+0x248>
  91124. !ip4_addr_ismulticast(ip4_current_dest_addr())) {
  91125. 8024d0c: 4b15 ldr r3, [pc, #84] @ (8024d64 <ip4_input+0x280>)
  91126. 8024d0e: 695b ldr r3, [r3, #20]
  91127. 8024d10: f003 03f0 and.w r3, r3, #240 @ 0xf0
  91128. if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) &&
  91129. 8024d14: 2be0 cmp r3, #224 @ 0xe0
  91130. 8024d16: d009 beq.n 8024d2c <ip4_input+0x248>
  91131. pbuf_header_force(p, (s16_t)iphdr_hlen); /* Move to ip header, no check necessary. */
  91132. 8024d18: f9b7 300e ldrsh.w r3, [r7, #14]
  91133. 8024d1c: 4619 mov r1, r3
  91134. 8024d1e: 6878 ldr r0, [r7, #4]
  91135. 8024d20: f7f5 fb97 bl 801a452 <pbuf_header_force>
  91136. icmp_dest_unreach(p, ICMP_DUR_PROTO);
  91137. 8024d24: 2102 movs r1, #2
  91138. 8024d26: 6878 ldr r0, [r7, #4]
  91139. 8024d28: f7ff fdae bl 8024888 <icmp_dest_unreach>
  91140. IP_STATS_INC(ip.proterr);
  91141. IP_STATS_INC(ip.drop);
  91142. MIB2_STATS_INC(mib2.ipinunknownprotos);
  91143. }
  91144. pbuf_free(p);
  91145. 8024d2c: 6878 ldr r0, [r7, #4]
  91146. 8024d2e: f7f5 fbd5 bl 801a4dc <pbuf_free>
  91147. break;
  91148. 8024d32: bf00 nop
  91149. }
  91150. }
  91151. /* @todo: this is not really necessary... */
  91152. ip_data.current_netif = NULL;
  91153. 8024d34: 4b0b ldr r3, [pc, #44] @ (8024d64 <ip4_input+0x280>)
  91154. 8024d36: 2200 movs r2, #0
  91155. 8024d38: 601a str r2, [r3, #0]
  91156. ip_data.current_input_netif = NULL;
  91157. 8024d3a: 4b0a ldr r3, [pc, #40] @ (8024d64 <ip4_input+0x280>)
  91158. 8024d3c: 2200 movs r2, #0
  91159. 8024d3e: 605a str r2, [r3, #4]
  91160. ip_data.current_ip4_header = NULL;
  91161. 8024d40: 4b08 ldr r3, [pc, #32] @ (8024d64 <ip4_input+0x280>)
  91162. 8024d42: 2200 movs r2, #0
  91163. 8024d44: 609a str r2, [r3, #8]
  91164. ip_data.current_ip_header_tot_len = 0;
  91165. 8024d46: 4b07 ldr r3, [pc, #28] @ (8024d64 <ip4_input+0x280>)
  91166. 8024d48: 2200 movs r2, #0
  91167. 8024d4a: 819a strh r2, [r3, #12]
  91168. ip4_addr_set_any(ip4_current_src_addr());
  91169. 8024d4c: 4b05 ldr r3, [pc, #20] @ (8024d64 <ip4_input+0x280>)
  91170. 8024d4e: 2200 movs r2, #0
  91171. 8024d50: 611a str r2, [r3, #16]
  91172. ip4_addr_set_any(ip4_current_dest_addr());
  91173. 8024d52: 4b04 ldr r3, [pc, #16] @ (8024d64 <ip4_input+0x280>)
  91174. 8024d54: 2200 movs r2, #0
  91175. 8024d56: 615a str r2, [r3, #20]
  91176. return ERR_OK;
  91177. 8024d58: 2300 movs r3, #0
  91178. }
  91179. 8024d5a: 4618 mov r0, r3
  91180. 8024d5c: 3720 adds r7, #32
  91181. 8024d5e: 46bd mov sp, r7
  91182. 8024d60: bd80 pop {r7, pc}
  91183. 8024d62: bf00 nop
  91184. 8024d64: 24024338 .word 0x24024338
  91185. 8024d68: 2402ae7c .word 0x2402ae7c
  91186. 08024d6c <ip4_output_if>:
  91187. */
  91188. err_t
  91189. ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,
  91190. u8_t ttl, u8_t tos,
  91191. u8_t proto, struct netif *netif)
  91192. {
  91193. 8024d6c: b580 push {r7, lr}
  91194. 8024d6e: b08a sub sp, #40 @ 0x28
  91195. 8024d70: af04 add r7, sp, #16
  91196. 8024d72: 60f8 str r0, [r7, #12]
  91197. 8024d74: 60b9 str r1, [r7, #8]
  91198. 8024d76: 607a str r2, [r7, #4]
  91199. 8024d78: 70fb strb r3, [r7, #3]
  91200. ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,
  91201. u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,
  91202. u16_t optlen)
  91203. {
  91204. #endif /* IP_OPTIONS_SEND */
  91205. const ip4_addr_t *src_used = src;
  91206. 8024d7a: 68bb ldr r3, [r7, #8]
  91207. 8024d7c: 617b str r3, [r7, #20]
  91208. if (dest != LWIP_IP_HDRINCL) {
  91209. 8024d7e: 687b ldr r3, [r7, #4]
  91210. 8024d80: 2b00 cmp r3, #0
  91211. 8024d82: d009 beq.n 8024d98 <ip4_output_if+0x2c>
  91212. if (ip4_addr_isany(src)) {
  91213. 8024d84: 68bb ldr r3, [r7, #8]
  91214. 8024d86: 2b00 cmp r3, #0
  91215. 8024d88: d003 beq.n 8024d92 <ip4_output_if+0x26>
  91216. 8024d8a: 68bb ldr r3, [r7, #8]
  91217. 8024d8c: 681b ldr r3, [r3, #0]
  91218. 8024d8e: 2b00 cmp r3, #0
  91219. 8024d90: d102 bne.n 8024d98 <ip4_output_if+0x2c>
  91220. src_used = netif_ip4_addr(netif);
  91221. 8024d92: 6abb ldr r3, [r7, #40] @ 0x28
  91222. 8024d94: 3304 adds r3, #4
  91223. 8024d96: 617b str r3, [r7, #20]
  91224. #if IP_OPTIONS_SEND
  91225. return ip4_output_if_opt_src(p, src_used, dest, ttl, tos, proto, netif,
  91226. ip_options, optlen);
  91227. #else /* IP_OPTIONS_SEND */
  91228. return ip4_output_if_src(p, src_used, dest, ttl, tos, proto, netif);
  91229. 8024d98: 78fa ldrb r2, [r7, #3]
  91230. 8024d9a: 6abb ldr r3, [r7, #40] @ 0x28
  91231. 8024d9c: 9302 str r3, [sp, #8]
  91232. 8024d9e: f897 3024 ldrb.w r3, [r7, #36] @ 0x24
  91233. 8024da2: 9301 str r3, [sp, #4]
  91234. 8024da4: f897 3020 ldrb.w r3, [r7, #32]
  91235. 8024da8: 9300 str r3, [sp, #0]
  91236. 8024daa: 4613 mov r3, r2
  91237. 8024dac: 687a ldr r2, [r7, #4]
  91238. 8024dae: 6979 ldr r1, [r7, #20]
  91239. 8024db0: 68f8 ldr r0, [r7, #12]
  91240. 8024db2: f000 f805 bl 8024dc0 <ip4_output_if_src>
  91241. 8024db6: 4603 mov r3, r0
  91242. #endif /* IP_OPTIONS_SEND */
  91243. }
  91244. 8024db8: 4618 mov r0, r3
  91245. 8024dba: 3718 adds r7, #24
  91246. 8024dbc: 46bd mov sp, r7
  91247. 8024dbe: bd80 pop {r7, pc}
  91248. 08024dc0 <ip4_output_if_src>:
  91249. */
  91250. err_t
  91251. ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,
  91252. u8_t ttl, u8_t tos,
  91253. u8_t proto, struct netif *netif)
  91254. {
  91255. 8024dc0: b580 push {r7, lr}
  91256. 8024dc2: b088 sub sp, #32
  91257. 8024dc4: af00 add r7, sp, #0
  91258. 8024dc6: 60f8 str r0, [r7, #12]
  91259. 8024dc8: 60b9 str r1, [r7, #8]
  91260. 8024dca: 607a str r2, [r7, #4]
  91261. 8024dcc: 70fb strb r3, [r7, #3]
  91262. ip4_addr_t dest_addr;
  91263. #if CHECKSUM_GEN_IP_INLINE
  91264. u32_t chk_sum = 0;
  91265. #endif /* CHECKSUM_GEN_IP_INLINE */
  91266. LWIP_ASSERT_CORE_LOCKED();
  91267. 8024dce: f7eb fbaf bl 8010530 <sys_check_core_locking>
  91268. LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
  91269. 8024dd2: 68fb ldr r3, [r7, #12]
  91270. 8024dd4: 7b9b ldrb r3, [r3, #14]
  91271. 8024dd6: 2b01 cmp r3, #1
  91272. 8024dd8: d006 beq.n 8024de8 <ip4_output_if_src+0x28>
  91273. 8024dda: 4b4b ldr r3, [pc, #300] @ (8024f08 <ip4_output_if_src+0x148>)
  91274. 8024ddc: f44f 7255 mov.w r2, #852 @ 0x354
  91275. 8024de0: 494a ldr r1, [pc, #296] @ (8024f0c <ip4_output_if_src+0x14c>)
  91276. 8024de2: 484b ldr r0, [pc, #300] @ (8024f10 <ip4_output_if_src+0x150>)
  91277. 8024de4: f004 fdf2 bl 80299cc <iprintf>
  91278. MIB2_STATS_INC(mib2.ipoutrequests);
  91279. /* Should the IP header be generated or is it already included in p? */
  91280. if (dest != LWIP_IP_HDRINCL) {
  91281. 8024de8: 687b ldr r3, [r7, #4]
  91282. 8024dea: 2b00 cmp r3, #0
  91283. 8024dec: d060 beq.n 8024eb0 <ip4_output_if_src+0xf0>
  91284. u16_t ip_hlen = IP_HLEN;
  91285. 8024dee: 2314 movs r3, #20
  91286. 8024df0: 837b strh r3, [r7, #26]
  91287. }
  91288. #endif /* CHECKSUM_GEN_IP_INLINE */
  91289. }
  91290. #endif /* IP_OPTIONS_SEND */
  91291. /* generate IP header */
  91292. if (pbuf_add_header(p, IP_HLEN)) {
  91293. 8024df2: 2114 movs r1, #20
  91294. 8024df4: 68f8 ldr r0, [r7, #12]
  91295. 8024df6: f7f5 faa9 bl 801a34c <pbuf_add_header>
  91296. 8024dfa: 4603 mov r3, r0
  91297. 8024dfc: 2b00 cmp r3, #0
  91298. 8024dfe: d002 beq.n 8024e06 <ip4_output_if_src+0x46>
  91299. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output: not enough room for IP header in pbuf\n"));
  91300. IP_STATS_INC(ip.err);
  91301. MIB2_STATS_INC(mib2.ipoutdiscards);
  91302. return ERR_BUF;
  91303. 8024e00: f06f 0301 mvn.w r3, #1
  91304. 8024e04: e07c b.n 8024f00 <ip4_output_if_src+0x140>
  91305. }
  91306. iphdr = (struct ip_hdr *)p->payload;
  91307. 8024e06: 68fb ldr r3, [r7, #12]
  91308. 8024e08: 685b ldr r3, [r3, #4]
  91309. 8024e0a: 61fb str r3, [r7, #28]
  91310. LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
  91311. 8024e0c: 68fb ldr r3, [r7, #12]
  91312. 8024e0e: 895b ldrh r3, [r3, #10]
  91313. 8024e10: 2b13 cmp r3, #19
  91314. 8024e12: d806 bhi.n 8024e22 <ip4_output_if_src+0x62>
  91315. 8024e14: 4b3c ldr r3, [pc, #240] @ (8024f08 <ip4_output_if_src+0x148>)
  91316. 8024e16: f44f 7262 mov.w r2, #904 @ 0x388
  91317. 8024e1a: 493e ldr r1, [pc, #248] @ (8024f14 <ip4_output_if_src+0x154>)
  91318. 8024e1c: 483c ldr r0, [pc, #240] @ (8024f10 <ip4_output_if_src+0x150>)
  91319. 8024e1e: f004 fdd5 bl 80299cc <iprintf>
  91320. (p->len >= sizeof(struct ip_hdr)));
  91321. IPH_TTL_SET(iphdr, ttl);
  91322. 8024e22: 69fb ldr r3, [r7, #28]
  91323. 8024e24: 78fa ldrb r2, [r7, #3]
  91324. 8024e26: 721a strb r2, [r3, #8]
  91325. IPH_PROTO_SET(iphdr, proto);
  91326. 8024e28: 69fb ldr r3, [r7, #28]
  91327. 8024e2a: f897 202c ldrb.w r2, [r7, #44] @ 0x2c
  91328. 8024e2e: 725a strb r2, [r3, #9]
  91329. #if CHECKSUM_GEN_IP_INLINE
  91330. chk_sum += PP_NTOHS(proto | (ttl << 8));
  91331. #endif /* CHECKSUM_GEN_IP_INLINE */
  91332. /* dest cannot be NULL here */
  91333. ip4_addr_copy(iphdr->dest, *dest);
  91334. 8024e30: 687b ldr r3, [r7, #4]
  91335. 8024e32: 681a ldr r2, [r3, #0]
  91336. 8024e34: 69fb ldr r3, [r7, #28]
  91337. 8024e36: 611a str r2, [r3, #16]
  91338. #if CHECKSUM_GEN_IP_INLINE
  91339. chk_sum += ip4_addr_get_u32(&iphdr->dest) & 0xFFFF;
  91340. chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16;
  91341. #endif /* CHECKSUM_GEN_IP_INLINE */
  91342. IPH_VHL_SET(iphdr, 4, ip_hlen / 4);
  91343. 8024e38: 8b7b ldrh r3, [r7, #26]
  91344. 8024e3a: 089b lsrs r3, r3, #2
  91345. 8024e3c: b29b uxth r3, r3
  91346. 8024e3e: b2db uxtb r3, r3
  91347. 8024e40: f043 0340 orr.w r3, r3, #64 @ 0x40
  91348. 8024e44: b2da uxtb r2, r3
  91349. 8024e46: 69fb ldr r3, [r7, #28]
  91350. 8024e48: 701a strb r2, [r3, #0]
  91351. IPH_TOS_SET(iphdr, tos);
  91352. 8024e4a: 69fb ldr r3, [r7, #28]
  91353. 8024e4c: f897 2028 ldrb.w r2, [r7, #40] @ 0x28
  91354. 8024e50: 705a strb r2, [r3, #1]
  91355. #if CHECKSUM_GEN_IP_INLINE
  91356. chk_sum += PP_NTOHS(tos | (iphdr->_v_hl << 8));
  91357. #endif /* CHECKSUM_GEN_IP_INLINE */
  91358. IPH_LEN_SET(iphdr, lwip_htons(p->tot_len));
  91359. 8024e52: 68fb ldr r3, [r7, #12]
  91360. 8024e54: 891b ldrh r3, [r3, #8]
  91361. 8024e56: 4618 mov r0, r3
  91362. 8024e58: f7f3 fe5e bl 8018b18 <lwip_htons>
  91363. 8024e5c: 4603 mov r3, r0
  91364. 8024e5e: 461a mov r2, r3
  91365. 8024e60: 69fb ldr r3, [r7, #28]
  91366. 8024e62: 805a strh r2, [r3, #2]
  91367. #if CHECKSUM_GEN_IP_INLINE
  91368. chk_sum += iphdr->_len;
  91369. #endif /* CHECKSUM_GEN_IP_INLINE */
  91370. IPH_OFFSET_SET(iphdr, 0);
  91371. 8024e64: 69fb ldr r3, [r7, #28]
  91372. 8024e66: 2200 movs r2, #0
  91373. 8024e68: 719a strb r2, [r3, #6]
  91374. 8024e6a: 2200 movs r2, #0
  91375. 8024e6c: 71da strb r2, [r3, #7]
  91376. IPH_ID_SET(iphdr, lwip_htons(ip_id));
  91377. 8024e6e: 4b2a ldr r3, [pc, #168] @ (8024f18 <ip4_output_if_src+0x158>)
  91378. 8024e70: 881b ldrh r3, [r3, #0]
  91379. 8024e72: 4618 mov r0, r3
  91380. 8024e74: f7f3 fe50 bl 8018b18 <lwip_htons>
  91381. 8024e78: 4603 mov r3, r0
  91382. 8024e7a: 461a mov r2, r3
  91383. 8024e7c: 69fb ldr r3, [r7, #28]
  91384. 8024e7e: 809a strh r2, [r3, #4]
  91385. #if CHECKSUM_GEN_IP_INLINE
  91386. chk_sum += iphdr->_id;
  91387. #endif /* CHECKSUM_GEN_IP_INLINE */
  91388. ++ip_id;
  91389. 8024e80: 4b25 ldr r3, [pc, #148] @ (8024f18 <ip4_output_if_src+0x158>)
  91390. 8024e82: 881b ldrh r3, [r3, #0]
  91391. 8024e84: 3301 adds r3, #1
  91392. 8024e86: b29a uxth r2, r3
  91393. 8024e88: 4b23 ldr r3, [pc, #140] @ (8024f18 <ip4_output_if_src+0x158>)
  91394. 8024e8a: 801a strh r2, [r3, #0]
  91395. if (src == NULL) {
  91396. 8024e8c: 68bb ldr r3, [r7, #8]
  91397. 8024e8e: 2b00 cmp r3, #0
  91398. 8024e90: d104 bne.n 8024e9c <ip4_output_if_src+0xdc>
  91399. ip4_addr_copy(iphdr->src, *IP4_ADDR_ANY4);
  91400. 8024e92: 4b22 ldr r3, [pc, #136] @ (8024f1c <ip4_output_if_src+0x15c>)
  91401. 8024e94: 681a ldr r2, [r3, #0]
  91402. 8024e96: 69fb ldr r3, [r7, #28]
  91403. 8024e98: 60da str r2, [r3, #12]
  91404. 8024e9a: e003 b.n 8024ea4 <ip4_output_if_src+0xe4>
  91405. } else {
  91406. /* src cannot be NULL here */
  91407. ip4_addr_copy(iphdr->src, *src);
  91408. 8024e9c: 68bb ldr r3, [r7, #8]
  91409. 8024e9e: 681a ldr r2, [r3, #0]
  91410. 8024ea0: 69fb ldr r3, [r7, #28]
  91411. 8024ea2: 60da str r2, [r3, #12]
  91412. else {
  91413. IPH_CHKSUM_SET(iphdr, 0);
  91414. }
  91415. #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF*/
  91416. #else /* CHECKSUM_GEN_IP_INLINE */
  91417. IPH_CHKSUM_SET(iphdr, 0);
  91418. 8024ea4: 69fb ldr r3, [r7, #28]
  91419. 8024ea6: 2200 movs r2, #0
  91420. 8024ea8: 729a strb r2, [r3, #10]
  91421. 8024eaa: 2200 movs r2, #0
  91422. 8024eac: 72da strb r2, [r3, #11]
  91423. 8024eae: e00f b.n 8024ed0 <ip4_output_if_src+0x110>
  91424. }
  91425. #endif /* CHECKSUM_GEN_IP */
  91426. #endif /* CHECKSUM_GEN_IP_INLINE */
  91427. } else {
  91428. /* IP header already included in p */
  91429. if (p->len < IP_HLEN) {
  91430. 8024eb0: 68fb ldr r3, [r7, #12]
  91431. 8024eb2: 895b ldrh r3, [r3, #10]
  91432. 8024eb4: 2b13 cmp r3, #19
  91433. 8024eb6: d802 bhi.n 8024ebe <ip4_output_if_src+0xfe>
  91434. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output: LWIP_IP_HDRINCL but pbuf is too short\n"));
  91435. IP_STATS_INC(ip.err);
  91436. MIB2_STATS_INC(mib2.ipoutdiscards);
  91437. return ERR_BUF;
  91438. 8024eb8: f06f 0301 mvn.w r3, #1
  91439. 8024ebc: e020 b.n 8024f00 <ip4_output_if_src+0x140>
  91440. }
  91441. iphdr = (struct ip_hdr *)p->payload;
  91442. 8024ebe: 68fb ldr r3, [r7, #12]
  91443. 8024ec0: 685b ldr r3, [r3, #4]
  91444. 8024ec2: 61fb str r3, [r7, #28]
  91445. ip4_addr_copy(dest_addr, iphdr->dest);
  91446. 8024ec4: 69fb ldr r3, [r7, #28]
  91447. 8024ec6: 691b ldr r3, [r3, #16]
  91448. 8024ec8: 617b str r3, [r7, #20]
  91449. dest = &dest_addr;
  91450. 8024eca: f107 0314 add.w r3, r7, #20
  91451. 8024ece: 607b str r3, [r7, #4]
  91452. }
  91453. #endif /* LWIP_MULTICAST_TX_OPTIONS */
  91454. #endif /* ENABLE_LOOPBACK */
  91455. #if IP_FRAG
  91456. /* don't fragment if interface has mtu set to 0 [loopif] */
  91457. if (netif->mtu && (p->tot_len > netif->mtu)) {
  91458. 8024ed0: 6b3b ldr r3, [r7, #48] @ 0x30
  91459. 8024ed2: 8d1b ldrh r3, [r3, #40] @ 0x28
  91460. 8024ed4: 2b00 cmp r3, #0
  91461. 8024ed6: d00c beq.n 8024ef2 <ip4_output_if_src+0x132>
  91462. 8024ed8: 68fb ldr r3, [r7, #12]
  91463. 8024eda: 891a ldrh r2, [r3, #8]
  91464. 8024edc: 6b3b ldr r3, [r7, #48] @ 0x30
  91465. 8024ede: 8d1b ldrh r3, [r3, #40] @ 0x28
  91466. 8024ee0: 429a cmp r2, r3
  91467. 8024ee2: d906 bls.n 8024ef2 <ip4_output_if_src+0x132>
  91468. return ip4_frag(p, netif, dest);
  91469. 8024ee4: 687a ldr r2, [r7, #4]
  91470. 8024ee6: 6b39 ldr r1, [r7, #48] @ 0x30
  91471. 8024ee8: 68f8 ldr r0, [r7, #12]
  91472. 8024eea: f000 ff21 bl 8025d30 <ip4_frag>
  91473. 8024eee: 4603 mov r3, r0
  91474. 8024ef0: e006 b.n 8024f00 <ip4_output_if_src+0x140>
  91475. }
  91476. #endif /* IP_FRAG */
  91477. LWIP_DEBUGF(IP_DEBUG, ("ip4_output_if: call netif->output()\n"));
  91478. return netif->output(netif, p, dest);
  91479. 8024ef2: 6b3b ldr r3, [r7, #48] @ 0x30
  91480. 8024ef4: 695b ldr r3, [r3, #20]
  91481. 8024ef6: 687a ldr r2, [r7, #4]
  91482. 8024ef8: 68f9 ldr r1, [r7, #12]
  91483. 8024efa: 6b38 ldr r0, [r7, #48] @ 0x30
  91484. 8024efc: 4798 blx r3
  91485. 8024efe: 4603 mov r3, r0
  91486. }
  91487. 8024f00: 4618 mov r0, r3
  91488. 8024f02: 3720 adds r7, #32
  91489. 8024f04: 46bd mov sp, r7
  91490. 8024f06: bd80 pop {r7, pc}
  91491. 8024f08: 08030564 .word 0x08030564
  91492. 8024f0c: 08030598 .word 0x08030598
  91493. 8024f10: 080305a4 .word 0x080305a4
  91494. 8024f14: 080305cc .word 0x080305cc
  91495. 8024f18: 2402b012 .word 0x2402b012
  91496. 8024f1c: 08030c10 .word 0x08030c10
  91497. 08024f20 <ip4_addr_isbroadcast_u32>:
  91498. * @param netif the network interface against which the address is checked
  91499. * @return returns non-zero if the address is a broadcast address
  91500. */
  91501. u8_t
  91502. ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif)
  91503. {
  91504. 8024f20: b480 push {r7}
  91505. 8024f22: b085 sub sp, #20
  91506. 8024f24: af00 add r7, sp, #0
  91507. 8024f26: 6078 str r0, [r7, #4]
  91508. 8024f28: 6039 str r1, [r7, #0]
  91509. ip4_addr_t ipaddr;
  91510. ip4_addr_set_u32(&ipaddr, addr);
  91511. 8024f2a: 687b ldr r3, [r7, #4]
  91512. 8024f2c: 60fb str r3, [r7, #12]
  91513. /* all ones (broadcast) or all zeroes (old skool broadcast) */
  91514. if ((~addr == IPADDR_ANY) ||
  91515. 8024f2e: 687b ldr r3, [r7, #4]
  91516. 8024f30: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  91517. 8024f34: d002 beq.n 8024f3c <ip4_addr_isbroadcast_u32+0x1c>
  91518. 8024f36: 687b ldr r3, [r7, #4]
  91519. 8024f38: 2b00 cmp r3, #0
  91520. 8024f3a: d101 bne.n 8024f40 <ip4_addr_isbroadcast_u32+0x20>
  91521. (addr == IPADDR_ANY)) {
  91522. return 1;
  91523. 8024f3c: 2301 movs r3, #1
  91524. 8024f3e: e02a b.n 8024f96 <ip4_addr_isbroadcast_u32+0x76>
  91525. /* no broadcast support on this network interface? */
  91526. } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
  91527. 8024f40: 683b ldr r3, [r7, #0]
  91528. 8024f42: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  91529. 8024f46: f003 0302 and.w r3, r3, #2
  91530. 8024f4a: 2b00 cmp r3, #0
  91531. 8024f4c: d101 bne.n 8024f52 <ip4_addr_isbroadcast_u32+0x32>
  91532. /* the given address cannot be a broadcast address
  91533. * nor can we check against any broadcast addresses */
  91534. return 0;
  91535. 8024f4e: 2300 movs r3, #0
  91536. 8024f50: e021 b.n 8024f96 <ip4_addr_isbroadcast_u32+0x76>
  91537. /* address matches network interface address exactly? => no broadcast */
  91538. } else if (addr == ip4_addr_get_u32(netif_ip4_addr(netif))) {
  91539. 8024f52: 683b ldr r3, [r7, #0]
  91540. 8024f54: 3304 adds r3, #4
  91541. 8024f56: 681b ldr r3, [r3, #0]
  91542. 8024f58: 687a ldr r2, [r7, #4]
  91543. 8024f5a: 429a cmp r2, r3
  91544. 8024f5c: d101 bne.n 8024f62 <ip4_addr_isbroadcast_u32+0x42>
  91545. return 0;
  91546. 8024f5e: 2300 movs r3, #0
  91547. 8024f60: e019 b.n 8024f96 <ip4_addr_isbroadcast_u32+0x76>
  91548. /* on the same (sub) network... */
  91549. } else if (ip4_addr_netcmp(&ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif))
  91550. 8024f62: 68fa ldr r2, [r7, #12]
  91551. 8024f64: 683b ldr r3, [r7, #0]
  91552. 8024f66: 3304 adds r3, #4
  91553. 8024f68: 681b ldr r3, [r3, #0]
  91554. 8024f6a: 405a eors r2, r3
  91555. 8024f6c: 683b ldr r3, [r7, #0]
  91556. 8024f6e: 3308 adds r3, #8
  91557. 8024f70: 681b ldr r3, [r3, #0]
  91558. 8024f72: 4013 ands r3, r2
  91559. 8024f74: 2b00 cmp r3, #0
  91560. 8024f76: d10d bne.n 8024f94 <ip4_addr_isbroadcast_u32+0x74>
  91561. /* ...and host identifier bits are all ones? =>... */
  91562. && ((addr & ~ip4_addr_get_u32(netif_ip4_netmask(netif))) ==
  91563. 8024f78: 683b ldr r3, [r7, #0]
  91564. 8024f7a: 3308 adds r3, #8
  91565. 8024f7c: 681b ldr r3, [r3, #0]
  91566. 8024f7e: 43da mvns r2, r3
  91567. 8024f80: 687b ldr r3, [r7, #4]
  91568. 8024f82: 401a ands r2, r3
  91569. (IPADDR_BROADCAST & ~ip4_addr_get_u32(netif_ip4_netmask(netif))))) {
  91570. 8024f84: 683b ldr r3, [r7, #0]
  91571. 8024f86: 3308 adds r3, #8
  91572. 8024f88: 681b ldr r3, [r3, #0]
  91573. 8024f8a: 43db mvns r3, r3
  91574. && ((addr & ~ip4_addr_get_u32(netif_ip4_netmask(netif))) ==
  91575. 8024f8c: 429a cmp r2, r3
  91576. 8024f8e: d101 bne.n 8024f94 <ip4_addr_isbroadcast_u32+0x74>
  91577. /* => network broadcast address */
  91578. return 1;
  91579. 8024f90: 2301 movs r3, #1
  91580. 8024f92: e000 b.n 8024f96 <ip4_addr_isbroadcast_u32+0x76>
  91581. } else {
  91582. return 0;
  91583. 8024f94: 2300 movs r3, #0
  91584. }
  91585. }
  91586. 8024f96: 4618 mov r0, r3
  91587. 8024f98: 3714 adds r7, #20
  91588. 8024f9a: 46bd mov sp, r7
  91589. 8024f9c: f85d 7b04 ldr.w r7, [sp], #4
  91590. 8024fa0: 4770 bx lr
  91591. 08024fa2 <ipaddr_addr>:
  91592. * @param cp IP address in ascii representation (e.g. "127.0.0.1")
  91593. * @return ip address in network order
  91594. */
  91595. u32_t
  91596. ipaddr_addr(const char *cp)
  91597. {
  91598. 8024fa2: b580 push {r7, lr}
  91599. 8024fa4: b084 sub sp, #16
  91600. 8024fa6: af00 add r7, sp, #0
  91601. 8024fa8: 6078 str r0, [r7, #4]
  91602. ip4_addr_t val;
  91603. if (ip4addr_aton(cp, &val)) {
  91604. 8024faa: f107 030c add.w r3, r7, #12
  91605. 8024fae: 4619 mov r1, r3
  91606. 8024fb0: 6878 ldr r0, [r7, #4]
  91607. 8024fb2: f000 f80b bl 8024fcc <ip4addr_aton>
  91608. 8024fb6: 4603 mov r3, r0
  91609. 8024fb8: 2b00 cmp r3, #0
  91610. 8024fba: d001 beq.n 8024fc0 <ipaddr_addr+0x1e>
  91611. return ip4_addr_get_u32(&val);
  91612. 8024fbc: 68fb ldr r3, [r7, #12]
  91613. 8024fbe: e001 b.n 8024fc4 <ipaddr_addr+0x22>
  91614. }
  91615. return (IPADDR_NONE);
  91616. 8024fc0: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  91617. }
  91618. 8024fc4: 4618 mov r0, r3
  91619. 8024fc6: 3710 adds r7, #16
  91620. 8024fc8: 46bd mov sp, r7
  91621. 8024fca: bd80 pop {r7, pc}
  91622. 08024fcc <ip4addr_aton>:
  91623. * @param addr pointer to which to save the ip address in network order
  91624. * @return 1 if cp could be converted to addr, 0 on failure
  91625. */
  91626. int
  91627. ip4addr_aton(const char *cp, ip4_addr_t *addr)
  91628. {
  91629. 8024fcc: b580 push {r7, lr}
  91630. 8024fce: b08a sub sp, #40 @ 0x28
  91631. 8024fd0: af00 add r7, sp, #0
  91632. 8024fd2: 6078 str r0, [r7, #4]
  91633. 8024fd4: 6039 str r1, [r7, #0]
  91634. u32_t val;
  91635. u8_t base;
  91636. char c;
  91637. u32_t parts[4];
  91638. u32_t *pp = parts;
  91639. 8024fd6: f107 030c add.w r3, r7, #12
  91640. 8024fda: 61fb str r3, [r7, #28]
  91641. c = *cp;
  91642. 8024fdc: 687b ldr r3, [r7, #4]
  91643. 8024fde: 781b ldrb r3, [r3, #0]
  91644. 8024fe0: f887 3022 strb.w r3, [r7, #34] @ 0x22
  91645. /*
  91646. * Collect number up to ``.''.
  91647. * Values are specified as for C:
  91648. * 0x=hex, 0=octal, 1-9=decimal.
  91649. */
  91650. if (!lwip_isdigit(c)) {
  91651. 8024fe4: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  91652. 8024fe8: 3301 adds r3, #1
  91653. 8024fea: 4a89 ldr r2, [pc, #548] @ (8025210 <ip4addr_aton+0x244>)
  91654. 8024fec: 4413 add r3, r2
  91655. 8024fee: 781b ldrb r3, [r3, #0]
  91656. 8024ff0: f003 0304 and.w r3, r3, #4
  91657. 8024ff4: 2b00 cmp r3, #0
  91658. 8024ff6: d101 bne.n 8024ffc <ip4addr_aton+0x30>
  91659. return 0;
  91660. 8024ff8: 2300 movs r3, #0
  91661. 8024ffa: e105 b.n 8025208 <ip4addr_aton+0x23c>
  91662. }
  91663. val = 0;
  91664. 8024ffc: 2300 movs r3, #0
  91665. 8024ffe: 627b str r3, [r7, #36] @ 0x24
  91666. base = 10;
  91667. 8025000: 230a movs r3, #10
  91668. 8025002: f887 3023 strb.w r3, [r7, #35] @ 0x23
  91669. if (c == '0') {
  91670. 8025006: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  91671. 802500a: 2b30 cmp r3, #48 @ 0x30
  91672. 802500c: d11c bne.n 8025048 <ip4addr_aton+0x7c>
  91673. c = *++cp;
  91674. 802500e: 687b ldr r3, [r7, #4]
  91675. 8025010: 3301 adds r3, #1
  91676. 8025012: 607b str r3, [r7, #4]
  91677. 8025014: 687b ldr r3, [r7, #4]
  91678. 8025016: 781b ldrb r3, [r3, #0]
  91679. 8025018: f887 3022 strb.w r3, [r7, #34] @ 0x22
  91680. if (c == 'x' || c == 'X') {
  91681. 802501c: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  91682. 8025020: 2b78 cmp r3, #120 @ 0x78
  91683. 8025022: d003 beq.n 802502c <ip4addr_aton+0x60>
  91684. 8025024: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  91685. 8025028: 2b58 cmp r3, #88 @ 0x58
  91686. 802502a: d10a bne.n 8025042 <ip4addr_aton+0x76>
  91687. base = 16;
  91688. 802502c: 2310 movs r3, #16
  91689. 802502e: f887 3023 strb.w r3, [r7, #35] @ 0x23
  91690. c = *++cp;
  91691. 8025032: 687b ldr r3, [r7, #4]
  91692. 8025034: 3301 adds r3, #1
  91693. 8025036: 607b str r3, [r7, #4]
  91694. 8025038: 687b ldr r3, [r7, #4]
  91695. 802503a: 781b ldrb r3, [r3, #0]
  91696. 802503c: f887 3022 strb.w r3, [r7, #34] @ 0x22
  91697. 8025040: e002 b.n 8025048 <ip4addr_aton+0x7c>
  91698. } else {
  91699. base = 8;
  91700. 8025042: 2308 movs r3, #8
  91701. 8025044: f887 3023 strb.w r3, [r7, #35] @ 0x23
  91702. }
  91703. }
  91704. for (;;) {
  91705. if (lwip_isdigit(c)) {
  91706. 8025048: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  91707. 802504c: 3301 adds r3, #1
  91708. 802504e: 4a70 ldr r2, [pc, #448] @ (8025210 <ip4addr_aton+0x244>)
  91709. 8025050: 4413 add r3, r2
  91710. 8025052: 781b ldrb r3, [r3, #0]
  91711. 8025054: f003 0304 and.w r3, r3, #4
  91712. 8025058: 2b00 cmp r3, #0
  91713. 802505a: d011 beq.n 8025080 <ip4addr_aton+0xb4>
  91714. val = (val * base) + (u32_t)(c - '0');
  91715. 802505c: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  91716. 8025060: 6a7a ldr r2, [r7, #36] @ 0x24
  91717. 8025062: fb03 f202 mul.w r2, r3, r2
  91718. 8025066: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  91719. 802506a: 4413 add r3, r2
  91720. 802506c: 3b30 subs r3, #48 @ 0x30
  91721. 802506e: 627b str r3, [r7, #36] @ 0x24
  91722. c = *++cp;
  91723. 8025070: 687b ldr r3, [r7, #4]
  91724. 8025072: 3301 adds r3, #1
  91725. 8025074: 607b str r3, [r7, #4]
  91726. 8025076: 687b ldr r3, [r7, #4]
  91727. 8025078: 781b ldrb r3, [r3, #0]
  91728. 802507a: f887 3022 strb.w r3, [r7, #34] @ 0x22
  91729. 802507e: e7e3 b.n 8025048 <ip4addr_aton+0x7c>
  91730. } else if (base == 16 && lwip_isxdigit(c)) {
  91731. 8025080: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  91732. 8025084: 2b10 cmp r3, #16
  91733. 8025086: d127 bne.n 80250d8 <ip4addr_aton+0x10c>
  91734. 8025088: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  91735. 802508c: 3301 adds r3, #1
  91736. 802508e: 4a60 ldr r2, [pc, #384] @ (8025210 <ip4addr_aton+0x244>)
  91737. 8025090: 4413 add r3, r2
  91738. 8025092: 781b ldrb r3, [r3, #0]
  91739. 8025094: f003 0344 and.w r3, r3, #68 @ 0x44
  91740. 8025098: 2b00 cmp r3, #0
  91741. 802509a: d01d beq.n 80250d8 <ip4addr_aton+0x10c>
  91742. val = (val << 4) | (u32_t)(c + 10 - (lwip_islower(c) ? 'a' : 'A'));
  91743. 802509c: 6a7b ldr r3, [r7, #36] @ 0x24
  91744. 802509e: 011b lsls r3, r3, #4
  91745. 80250a0: f897 2022 ldrb.w r2, [r7, #34] @ 0x22
  91746. 80250a4: f102 010a add.w r1, r2, #10
  91747. 80250a8: f897 2022 ldrb.w r2, [r7, #34] @ 0x22
  91748. 80250ac: 3201 adds r2, #1
  91749. 80250ae: 4858 ldr r0, [pc, #352] @ (8025210 <ip4addr_aton+0x244>)
  91750. 80250b0: 4402 add r2, r0
  91751. 80250b2: 7812 ldrb r2, [r2, #0]
  91752. 80250b4: f002 0203 and.w r2, r2, #3
  91753. 80250b8: 2a02 cmp r2, #2
  91754. 80250ba: d101 bne.n 80250c0 <ip4addr_aton+0xf4>
  91755. 80250bc: 2261 movs r2, #97 @ 0x61
  91756. 80250be: e000 b.n 80250c2 <ip4addr_aton+0xf6>
  91757. 80250c0: 2241 movs r2, #65 @ 0x41
  91758. 80250c2: 1a8a subs r2, r1, r2
  91759. 80250c4: 4313 orrs r3, r2
  91760. 80250c6: 627b str r3, [r7, #36] @ 0x24
  91761. c = *++cp;
  91762. 80250c8: 687b ldr r3, [r7, #4]
  91763. 80250ca: 3301 adds r3, #1
  91764. 80250cc: 607b str r3, [r7, #4]
  91765. 80250ce: 687b ldr r3, [r7, #4]
  91766. 80250d0: 781b ldrb r3, [r3, #0]
  91767. 80250d2: f887 3022 strb.w r3, [r7, #34] @ 0x22
  91768. if (lwip_isdigit(c)) {
  91769. 80250d6: e7b7 b.n 8025048 <ip4addr_aton+0x7c>
  91770. } else {
  91771. break;
  91772. }
  91773. }
  91774. if (c == '.') {
  91775. 80250d8: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  91776. 80250dc: 2b2e cmp r3, #46 @ 0x2e
  91777. 80250de: d114 bne.n 802510a <ip4addr_aton+0x13e>
  91778. * Internet format:
  91779. * a.b.c.d
  91780. * a.b.c (with c treated as 16 bits)
  91781. * a.b (with b treated as 24 bits)
  91782. */
  91783. if (pp >= parts + 3) {
  91784. 80250e0: f107 030c add.w r3, r7, #12
  91785. 80250e4: 330c adds r3, #12
  91786. 80250e6: 69fa ldr r2, [r7, #28]
  91787. 80250e8: 429a cmp r2, r3
  91788. 80250ea: d301 bcc.n 80250f0 <ip4addr_aton+0x124>
  91789. return 0;
  91790. 80250ec: 2300 movs r3, #0
  91791. 80250ee: e08b b.n 8025208 <ip4addr_aton+0x23c>
  91792. }
  91793. *pp++ = val;
  91794. 80250f0: 69fb ldr r3, [r7, #28]
  91795. 80250f2: 1d1a adds r2, r3, #4
  91796. 80250f4: 61fa str r2, [r7, #28]
  91797. 80250f6: 6a7a ldr r2, [r7, #36] @ 0x24
  91798. 80250f8: 601a str r2, [r3, #0]
  91799. c = *++cp;
  91800. 80250fa: 687b ldr r3, [r7, #4]
  91801. 80250fc: 3301 adds r3, #1
  91802. 80250fe: 607b str r3, [r7, #4]
  91803. 8025100: 687b ldr r3, [r7, #4]
  91804. 8025102: 781b ldrb r3, [r3, #0]
  91805. 8025104: f887 3022 strb.w r3, [r7, #34] @ 0x22
  91806. if (!lwip_isdigit(c)) {
  91807. 8025108: e76c b.n 8024fe4 <ip4addr_aton+0x18>
  91808. } else {
  91809. break;
  91810. 802510a: bf00 nop
  91811. }
  91812. }
  91813. /*
  91814. * Check for trailing characters.
  91815. */
  91816. if (c != '\0' && !lwip_isspace(c)) {
  91817. 802510c: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  91818. 8025110: 2b00 cmp r3, #0
  91819. 8025112: d00b beq.n 802512c <ip4addr_aton+0x160>
  91820. 8025114: f897 3022 ldrb.w r3, [r7, #34] @ 0x22
  91821. 8025118: 3301 adds r3, #1
  91822. 802511a: 4a3d ldr r2, [pc, #244] @ (8025210 <ip4addr_aton+0x244>)
  91823. 802511c: 4413 add r3, r2
  91824. 802511e: 781b ldrb r3, [r3, #0]
  91825. 8025120: f003 0308 and.w r3, r3, #8
  91826. 8025124: 2b00 cmp r3, #0
  91827. 8025126: d101 bne.n 802512c <ip4addr_aton+0x160>
  91828. return 0;
  91829. 8025128: 2300 movs r3, #0
  91830. 802512a: e06d b.n 8025208 <ip4addr_aton+0x23c>
  91831. }
  91832. /*
  91833. * Concoct the address according to
  91834. * the number of parts specified.
  91835. */
  91836. switch (pp - parts + 1) {
  91837. 802512c: f107 030c add.w r3, r7, #12
  91838. 8025130: 69fa ldr r2, [r7, #28]
  91839. 8025132: 1ad3 subs r3, r2, r3
  91840. 8025134: 109b asrs r3, r3, #2
  91841. 8025136: 3301 adds r3, #1
  91842. 8025138: 2b04 cmp r3, #4
  91843. 802513a: d853 bhi.n 80251e4 <ip4addr_aton+0x218>
  91844. 802513c: a201 add r2, pc, #4 @ (adr r2, 8025144 <ip4addr_aton+0x178>)
  91845. 802513e: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  91846. 8025142: bf00 nop
  91847. 8025144: 08025159 .word 0x08025159
  91848. 8025148: 080251f3 .word 0x080251f3
  91849. 802514c: 0802515d .word 0x0802515d
  91850. 8025150: 0802517f .word 0x0802517f
  91851. 8025154: 080251ad .word 0x080251ad
  91852. case 0:
  91853. return 0; /* initial nondigit */
  91854. 8025158: 2300 movs r3, #0
  91855. 802515a: e055 b.n 8025208 <ip4addr_aton+0x23c>
  91856. case 1: /* a -- 32 bits */
  91857. break;
  91858. case 2: /* a.b -- 8.24 bits */
  91859. if (val > 0xffffffUL) {
  91860. 802515c: 6a7b ldr r3, [r7, #36] @ 0x24
  91861. 802515e: f1b3 7f80 cmp.w r3, #16777216 @ 0x1000000
  91862. 8025162: d301 bcc.n 8025168 <ip4addr_aton+0x19c>
  91863. return 0;
  91864. 8025164: 2300 movs r3, #0
  91865. 8025166: e04f b.n 8025208 <ip4addr_aton+0x23c>
  91866. }
  91867. if (parts[0] > 0xff) {
  91868. 8025168: 68fb ldr r3, [r7, #12]
  91869. 802516a: 2bff cmp r3, #255 @ 0xff
  91870. 802516c: d901 bls.n 8025172 <ip4addr_aton+0x1a6>
  91871. return 0;
  91872. 802516e: 2300 movs r3, #0
  91873. 8025170: e04a b.n 8025208 <ip4addr_aton+0x23c>
  91874. }
  91875. val |= parts[0] << 24;
  91876. 8025172: 68fb ldr r3, [r7, #12]
  91877. 8025174: 061b lsls r3, r3, #24
  91878. 8025176: 6a7a ldr r2, [r7, #36] @ 0x24
  91879. 8025178: 4313 orrs r3, r2
  91880. 802517a: 627b str r3, [r7, #36] @ 0x24
  91881. break;
  91882. 802517c: e03a b.n 80251f4 <ip4addr_aton+0x228>
  91883. case 3: /* a.b.c -- 8.8.16 bits */
  91884. if (val > 0xffff) {
  91885. 802517e: 6a7b ldr r3, [r7, #36] @ 0x24
  91886. 8025180: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  91887. 8025184: d301 bcc.n 802518a <ip4addr_aton+0x1be>
  91888. return 0;
  91889. 8025186: 2300 movs r3, #0
  91890. 8025188: e03e b.n 8025208 <ip4addr_aton+0x23c>
  91891. }
  91892. if ((parts[0] > 0xff) || (parts[1] > 0xff)) {
  91893. 802518a: 68fb ldr r3, [r7, #12]
  91894. 802518c: 2bff cmp r3, #255 @ 0xff
  91895. 802518e: d802 bhi.n 8025196 <ip4addr_aton+0x1ca>
  91896. 8025190: 693b ldr r3, [r7, #16]
  91897. 8025192: 2bff cmp r3, #255 @ 0xff
  91898. 8025194: d901 bls.n 802519a <ip4addr_aton+0x1ce>
  91899. return 0;
  91900. 8025196: 2300 movs r3, #0
  91901. 8025198: e036 b.n 8025208 <ip4addr_aton+0x23c>
  91902. }
  91903. val |= (parts[0] << 24) | (parts[1] << 16);
  91904. 802519a: 68fb ldr r3, [r7, #12]
  91905. 802519c: 061a lsls r2, r3, #24
  91906. 802519e: 693b ldr r3, [r7, #16]
  91907. 80251a0: 041b lsls r3, r3, #16
  91908. 80251a2: 4313 orrs r3, r2
  91909. 80251a4: 6a7a ldr r2, [r7, #36] @ 0x24
  91910. 80251a6: 4313 orrs r3, r2
  91911. 80251a8: 627b str r3, [r7, #36] @ 0x24
  91912. break;
  91913. 80251aa: e023 b.n 80251f4 <ip4addr_aton+0x228>
  91914. case 4: /* a.b.c.d -- 8.8.8.8 bits */
  91915. if (val > 0xff) {
  91916. 80251ac: 6a7b ldr r3, [r7, #36] @ 0x24
  91917. 80251ae: 2bff cmp r3, #255 @ 0xff
  91918. 80251b0: d901 bls.n 80251b6 <ip4addr_aton+0x1ea>
  91919. return 0;
  91920. 80251b2: 2300 movs r3, #0
  91921. 80251b4: e028 b.n 8025208 <ip4addr_aton+0x23c>
  91922. }
  91923. if ((parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff)) {
  91924. 80251b6: 68fb ldr r3, [r7, #12]
  91925. 80251b8: 2bff cmp r3, #255 @ 0xff
  91926. 80251ba: d805 bhi.n 80251c8 <ip4addr_aton+0x1fc>
  91927. 80251bc: 693b ldr r3, [r7, #16]
  91928. 80251be: 2bff cmp r3, #255 @ 0xff
  91929. 80251c0: d802 bhi.n 80251c8 <ip4addr_aton+0x1fc>
  91930. 80251c2: 697b ldr r3, [r7, #20]
  91931. 80251c4: 2bff cmp r3, #255 @ 0xff
  91932. 80251c6: d901 bls.n 80251cc <ip4addr_aton+0x200>
  91933. return 0;
  91934. 80251c8: 2300 movs r3, #0
  91935. 80251ca: e01d b.n 8025208 <ip4addr_aton+0x23c>
  91936. }
  91937. val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
  91938. 80251cc: 68fb ldr r3, [r7, #12]
  91939. 80251ce: 061a lsls r2, r3, #24
  91940. 80251d0: 693b ldr r3, [r7, #16]
  91941. 80251d2: 041b lsls r3, r3, #16
  91942. 80251d4: 431a orrs r2, r3
  91943. 80251d6: 697b ldr r3, [r7, #20]
  91944. 80251d8: 021b lsls r3, r3, #8
  91945. 80251da: 4313 orrs r3, r2
  91946. 80251dc: 6a7a ldr r2, [r7, #36] @ 0x24
  91947. 80251de: 4313 orrs r3, r2
  91948. 80251e0: 627b str r3, [r7, #36] @ 0x24
  91949. break;
  91950. 80251e2: e007 b.n 80251f4 <ip4addr_aton+0x228>
  91951. default:
  91952. LWIP_ASSERT("unhandled", 0);
  91953. 80251e4: 4b0b ldr r3, [pc, #44] @ (8025214 <ip4addr_aton+0x248>)
  91954. 80251e6: 22f9 movs r2, #249 @ 0xf9
  91955. 80251e8: 490b ldr r1, [pc, #44] @ (8025218 <ip4addr_aton+0x24c>)
  91956. 80251ea: 480c ldr r0, [pc, #48] @ (802521c <ip4addr_aton+0x250>)
  91957. 80251ec: f004 fbee bl 80299cc <iprintf>
  91958. break;
  91959. 80251f0: e000 b.n 80251f4 <ip4addr_aton+0x228>
  91960. break;
  91961. 80251f2: bf00 nop
  91962. }
  91963. if (addr) {
  91964. 80251f4: 683b ldr r3, [r7, #0]
  91965. 80251f6: 2b00 cmp r3, #0
  91966. 80251f8: d005 beq.n 8025206 <ip4addr_aton+0x23a>
  91967. ip4_addr_set_u32(addr, lwip_htonl(val));
  91968. 80251fa: 6a78 ldr r0, [r7, #36] @ 0x24
  91969. 80251fc: f7f3 fca1 bl 8018b42 <lwip_htonl>
  91970. 8025200: 4602 mov r2, r0
  91971. 8025202: 683b ldr r3, [r7, #0]
  91972. 8025204: 601a str r2, [r3, #0]
  91973. }
  91974. return 1;
  91975. 8025206: 2301 movs r3, #1
  91976. }
  91977. 8025208: 4618 mov r0, r3
  91978. 802520a: 3728 adds r7, #40 @ 0x28
  91979. 802520c: 46bd mov sp, r7
  91980. 802520e: bd80 pop {r7, pc}
  91981. 8025210: 08030ce8 .word 0x08030ce8
  91982. 8025214: 080305fc .word 0x080305fc
  91983. 8025218: 08030638 .word 0x08030638
  91984. 802521c: 08030644 .word 0x08030644
  91985. 08025220 <ip4addr_ntoa>:
  91986. * @return pointer to a global static (!) buffer that holds the ASCII
  91987. * representation of addr
  91988. */
  91989. char *
  91990. ip4addr_ntoa(const ip4_addr_t *addr)
  91991. {
  91992. 8025220: b580 push {r7, lr}
  91993. 8025222: b082 sub sp, #8
  91994. 8025224: af00 add r7, sp, #0
  91995. 8025226: 6078 str r0, [r7, #4]
  91996. static char str[IP4ADDR_STRLEN_MAX];
  91997. return ip4addr_ntoa_r(addr, str, IP4ADDR_STRLEN_MAX);
  91998. 8025228: 2210 movs r2, #16
  91999. 802522a: 4904 ldr r1, [pc, #16] @ (802523c <ip4addr_ntoa+0x1c>)
  92000. 802522c: 6878 ldr r0, [r7, #4]
  92001. 802522e: f000 f807 bl 8025240 <ip4addr_ntoa_r>
  92002. 8025232: 4603 mov r3, r0
  92003. }
  92004. 8025234: 4618 mov r0, r3
  92005. 8025236: 3708 adds r7, #8
  92006. 8025238: 46bd mov sp, r7
  92007. 802523a: bd80 pop {r7, pc}
  92008. 802523c: 2402b014 .word 0x2402b014
  92009. 08025240 <ip4addr_ntoa_r>:
  92010. * @return either pointer to buf which now holds the ASCII
  92011. * representation of addr or NULL if buf was too small
  92012. */
  92013. char *
  92014. ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen)
  92015. {
  92016. 8025240: b480 push {r7}
  92017. 8025242: b08d sub sp, #52 @ 0x34
  92018. 8025244: af00 add r7, sp, #0
  92019. 8025246: 60f8 str r0, [r7, #12]
  92020. 8025248: 60b9 str r1, [r7, #8]
  92021. 802524a: 607a str r2, [r7, #4]
  92022. char *rp;
  92023. u8_t *ap;
  92024. u8_t rem;
  92025. u8_t n;
  92026. u8_t i;
  92027. int len = 0;
  92028. 802524c: 2300 movs r3, #0
  92029. 802524e: 623b str r3, [r7, #32]
  92030. s_addr = ip4_addr_get_u32(addr);
  92031. 8025250: 68fb ldr r3, [r7, #12]
  92032. 8025252: 681b ldr r3, [r3, #0]
  92033. 8025254: 61bb str r3, [r7, #24]
  92034. rp = buf;
  92035. 8025256: 68bb ldr r3, [r7, #8]
  92036. 8025258: 62fb str r3, [r7, #44] @ 0x2c
  92037. ap = (u8_t *)&s_addr;
  92038. 802525a: f107 0318 add.w r3, r7, #24
  92039. 802525e: 62bb str r3, [r7, #40] @ 0x28
  92040. for (n = 0; n < 4; n++) {
  92041. 8025260: 2300 movs r3, #0
  92042. 8025262: f887 3027 strb.w r3, [r7, #39] @ 0x27
  92043. 8025266: e058 b.n 802531a <ip4addr_ntoa_r+0xda>
  92044. i = 0;
  92045. 8025268: 2300 movs r3, #0
  92046. 802526a: f887 3026 strb.w r3, [r7, #38] @ 0x26
  92047. do {
  92048. rem = *ap % (u8_t)10;
  92049. 802526e: 6abb ldr r3, [r7, #40] @ 0x28
  92050. 8025270: 781a ldrb r2, [r3, #0]
  92051. 8025272: 4b32 ldr r3, [pc, #200] @ (802533c <ip4addr_ntoa_r+0xfc>)
  92052. 8025274: fba3 1302 umull r1, r3, r3, r2
  92053. 8025278: 08d9 lsrs r1, r3, #3
  92054. 802527a: 460b mov r3, r1
  92055. 802527c: 009b lsls r3, r3, #2
  92056. 802527e: 440b add r3, r1
  92057. 8025280: 005b lsls r3, r3, #1
  92058. 8025282: 1ad3 subs r3, r2, r3
  92059. 8025284: 77fb strb r3, [r7, #31]
  92060. *ap /= (u8_t)10;
  92061. 8025286: 6abb ldr r3, [r7, #40] @ 0x28
  92062. 8025288: 781b ldrb r3, [r3, #0]
  92063. 802528a: 4a2c ldr r2, [pc, #176] @ (802533c <ip4addr_ntoa_r+0xfc>)
  92064. 802528c: fba2 2303 umull r2, r3, r2, r3
  92065. 8025290: 08db lsrs r3, r3, #3
  92066. 8025292: b2da uxtb r2, r3
  92067. 8025294: 6abb ldr r3, [r7, #40] @ 0x28
  92068. 8025296: 701a strb r2, [r3, #0]
  92069. inv[i++] = (char)('0' + rem);
  92070. 8025298: f897 3026 ldrb.w r3, [r7, #38] @ 0x26
  92071. 802529c: 1c5a adds r2, r3, #1
  92072. 802529e: f887 2026 strb.w r2, [r7, #38] @ 0x26
  92073. 80252a2: 4619 mov r1, r3
  92074. 80252a4: 7ffb ldrb r3, [r7, #31]
  92075. 80252a6: 3330 adds r3, #48 @ 0x30
  92076. 80252a8: b2da uxtb r2, r3
  92077. 80252aa: f101 0330 add.w r3, r1, #48 @ 0x30
  92078. 80252ae: 443b add r3, r7
  92079. 80252b0: f803 2c1c strb.w r2, [r3, #-28]
  92080. } while (*ap);
  92081. 80252b4: 6abb ldr r3, [r7, #40] @ 0x28
  92082. 80252b6: 781b ldrb r3, [r3, #0]
  92083. 80252b8: 2b00 cmp r3, #0
  92084. 80252ba: d1d8 bne.n 802526e <ip4addr_ntoa_r+0x2e>
  92085. while (i--) {
  92086. 80252bc: e011 b.n 80252e2 <ip4addr_ntoa_r+0xa2>
  92087. if (len++ >= buflen) {
  92088. 80252be: 6a3b ldr r3, [r7, #32]
  92089. 80252c0: 1c5a adds r2, r3, #1
  92090. 80252c2: 623a str r2, [r7, #32]
  92091. 80252c4: 687a ldr r2, [r7, #4]
  92092. 80252c6: 429a cmp r2, r3
  92093. 80252c8: dc01 bgt.n 80252ce <ip4addr_ntoa_r+0x8e>
  92094. return NULL;
  92095. 80252ca: 2300 movs r3, #0
  92096. 80252cc: e030 b.n 8025330 <ip4addr_ntoa_r+0xf0>
  92097. }
  92098. *rp++ = inv[i];
  92099. 80252ce: f897 2026 ldrb.w r2, [r7, #38] @ 0x26
  92100. 80252d2: 6afb ldr r3, [r7, #44] @ 0x2c
  92101. 80252d4: 1c59 adds r1, r3, #1
  92102. 80252d6: 62f9 str r1, [r7, #44] @ 0x2c
  92103. 80252d8: 3230 adds r2, #48 @ 0x30
  92104. 80252da: 443a add r2, r7
  92105. 80252dc: f812 2c1c ldrb.w r2, [r2, #-28]
  92106. 80252e0: 701a strb r2, [r3, #0]
  92107. while (i--) {
  92108. 80252e2: f897 3026 ldrb.w r3, [r7, #38] @ 0x26
  92109. 80252e6: 1e5a subs r2, r3, #1
  92110. 80252e8: f887 2026 strb.w r2, [r7, #38] @ 0x26
  92111. 80252ec: 2b00 cmp r3, #0
  92112. 80252ee: d1e6 bne.n 80252be <ip4addr_ntoa_r+0x7e>
  92113. }
  92114. if (len++ >= buflen) {
  92115. 80252f0: 6a3b ldr r3, [r7, #32]
  92116. 80252f2: 1c5a adds r2, r3, #1
  92117. 80252f4: 623a str r2, [r7, #32]
  92118. 80252f6: 687a ldr r2, [r7, #4]
  92119. 80252f8: 429a cmp r2, r3
  92120. 80252fa: dc01 bgt.n 8025300 <ip4addr_ntoa_r+0xc0>
  92121. return NULL;
  92122. 80252fc: 2300 movs r3, #0
  92123. 80252fe: e017 b.n 8025330 <ip4addr_ntoa_r+0xf0>
  92124. }
  92125. *rp++ = '.';
  92126. 8025300: 6afb ldr r3, [r7, #44] @ 0x2c
  92127. 8025302: 1c5a adds r2, r3, #1
  92128. 8025304: 62fa str r2, [r7, #44] @ 0x2c
  92129. 8025306: 222e movs r2, #46 @ 0x2e
  92130. 8025308: 701a strb r2, [r3, #0]
  92131. ap++;
  92132. 802530a: 6abb ldr r3, [r7, #40] @ 0x28
  92133. 802530c: 3301 adds r3, #1
  92134. 802530e: 62bb str r3, [r7, #40] @ 0x28
  92135. for (n = 0; n < 4; n++) {
  92136. 8025310: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  92137. 8025314: 3301 adds r3, #1
  92138. 8025316: f887 3027 strb.w r3, [r7, #39] @ 0x27
  92139. 802531a: f897 3027 ldrb.w r3, [r7, #39] @ 0x27
  92140. 802531e: 2b03 cmp r3, #3
  92141. 8025320: d9a2 bls.n 8025268 <ip4addr_ntoa_r+0x28>
  92142. }
  92143. *--rp = 0;
  92144. 8025322: 6afb ldr r3, [r7, #44] @ 0x2c
  92145. 8025324: 3b01 subs r3, #1
  92146. 8025326: 62fb str r3, [r7, #44] @ 0x2c
  92147. 8025328: 6afb ldr r3, [r7, #44] @ 0x2c
  92148. 802532a: 2200 movs r2, #0
  92149. 802532c: 701a strb r2, [r3, #0]
  92150. return buf;
  92151. 802532e: 68bb ldr r3, [r7, #8]
  92152. }
  92153. 8025330: 4618 mov r0, r3
  92154. 8025332: 3734 adds r7, #52 @ 0x34
  92155. 8025334: 46bd mov sp, r7
  92156. 8025336: f85d 7b04 ldr.w r7, [sp], #4
  92157. 802533a: 4770 bx lr
  92158. 802533c: cccccccd .word 0xcccccccd
  92159. 08025340 <ip_reass_tmr>:
  92160. *
  92161. * Should be called every 1000 msec (defined by IP_TMR_INTERVAL).
  92162. */
  92163. void
  92164. ip_reass_tmr(void)
  92165. {
  92166. 8025340: b580 push {r7, lr}
  92167. 8025342: b084 sub sp, #16
  92168. 8025344: af00 add r7, sp, #0
  92169. struct ip_reassdata *r, *prev = NULL;
  92170. 8025346: 2300 movs r3, #0
  92171. 8025348: 60bb str r3, [r7, #8]
  92172. r = reassdatagrams;
  92173. 802534a: 4b12 ldr r3, [pc, #72] @ (8025394 <ip_reass_tmr+0x54>)
  92174. 802534c: 681b ldr r3, [r3, #0]
  92175. 802534e: 60fb str r3, [r7, #12]
  92176. while (r != NULL) {
  92177. 8025350: e018 b.n 8025384 <ip_reass_tmr+0x44>
  92178. /* Decrement the timer. Once it reaches 0,
  92179. * clean up the incomplete fragment assembly */
  92180. if (r->timer > 0) {
  92181. 8025352: 68fb ldr r3, [r7, #12]
  92182. 8025354: 7fdb ldrb r3, [r3, #31]
  92183. 8025356: 2b00 cmp r3, #0
  92184. 8025358: d00b beq.n 8025372 <ip_reass_tmr+0x32>
  92185. r->timer--;
  92186. 802535a: 68fb ldr r3, [r7, #12]
  92187. 802535c: 7fdb ldrb r3, [r3, #31]
  92188. 802535e: 3b01 subs r3, #1
  92189. 8025360: b2da uxtb r2, r3
  92190. 8025362: 68fb ldr r3, [r7, #12]
  92191. 8025364: 77da strb r2, [r3, #31]
  92192. LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n", (u16_t)r->timer));
  92193. prev = r;
  92194. 8025366: 68fb ldr r3, [r7, #12]
  92195. 8025368: 60bb str r3, [r7, #8]
  92196. r = r->next;
  92197. 802536a: 68fb ldr r3, [r7, #12]
  92198. 802536c: 681b ldr r3, [r3, #0]
  92199. 802536e: 60fb str r3, [r7, #12]
  92200. 8025370: e008 b.n 8025384 <ip_reass_tmr+0x44>
  92201. } else {
  92202. /* reassembly timed out */
  92203. struct ip_reassdata *tmp;
  92204. LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer timed out\n"));
  92205. tmp = r;
  92206. 8025372: 68fb ldr r3, [r7, #12]
  92207. 8025374: 607b str r3, [r7, #4]
  92208. /* get the next pointer before freeing */
  92209. r = r->next;
  92210. 8025376: 68fb ldr r3, [r7, #12]
  92211. 8025378: 681b ldr r3, [r3, #0]
  92212. 802537a: 60fb str r3, [r7, #12]
  92213. /* free the helper struct and all enqueued pbufs */
  92214. ip_reass_free_complete_datagram(tmp, prev);
  92215. 802537c: 68b9 ldr r1, [r7, #8]
  92216. 802537e: 6878 ldr r0, [r7, #4]
  92217. 8025380: f000 f80a bl 8025398 <ip_reass_free_complete_datagram>
  92218. while (r != NULL) {
  92219. 8025384: 68fb ldr r3, [r7, #12]
  92220. 8025386: 2b00 cmp r3, #0
  92221. 8025388: d1e3 bne.n 8025352 <ip_reass_tmr+0x12>
  92222. }
  92223. }
  92224. }
  92225. 802538a: bf00 nop
  92226. 802538c: bf00 nop
  92227. 802538e: 3710 adds r7, #16
  92228. 8025390: 46bd mov sp, r7
  92229. 8025392: bd80 pop {r7, pc}
  92230. 8025394: 2402b024 .word 0x2402b024
  92231. 08025398 <ip_reass_free_complete_datagram>:
  92232. * @param prev the previous datagram in the linked list
  92233. * @return the number of pbufs freed
  92234. */
  92235. static int
  92236. ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev)
  92237. {
  92238. 8025398: b580 push {r7, lr}
  92239. 802539a: b088 sub sp, #32
  92240. 802539c: af00 add r7, sp, #0
  92241. 802539e: 6078 str r0, [r7, #4]
  92242. 80253a0: 6039 str r1, [r7, #0]
  92243. u16_t pbufs_freed = 0;
  92244. 80253a2: 2300 movs r3, #0
  92245. 80253a4: 83fb strh r3, [r7, #30]
  92246. u16_t clen;
  92247. struct pbuf *p;
  92248. struct ip_reass_helper *iprh;
  92249. LWIP_ASSERT("prev != ipr", prev != ipr);
  92250. 80253a6: 683a ldr r2, [r7, #0]
  92251. 80253a8: 687b ldr r3, [r7, #4]
  92252. 80253aa: 429a cmp r2, r3
  92253. 80253ac: d105 bne.n 80253ba <ip_reass_free_complete_datagram+0x22>
  92254. 80253ae: 4b45 ldr r3, [pc, #276] @ (80254c4 <ip_reass_free_complete_datagram+0x12c>)
  92255. 80253b0: 22ab movs r2, #171 @ 0xab
  92256. 80253b2: 4945 ldr r1, [pc, #276] @ (80254c8 <ip_reass_free_complete_datagram+0x130>)
  92257. 80253b4: 4845 ldr r0, [pc, #276] @ (80254cc <ip_reass_free_complete_datagram+0x134>)
  92258. 80253b6: f004 fb09 bl 80299cc <iprintf>
  92259. if (prev != NULL) {
  92260. 80253ba: 683b ldr r3, [r7, #0]
  92261. 80253bc: 2b00 cmp r3, #0
  92262. 80253be: d00a beq.n 80253d6 <ip_reass_free_complete_datagram+0x3e>
  92263. LWIP_ASSERT("prev->next == ipr", prev->next == ipr);
  92264. 80253c0: 683b ldr r3, [r7, #0]
  92265. 80253c2: 681b ldr r3, [r3, #0]
  92266. 80253c4: 687a ldr r2, [r7, #4]
  92267. 80253c6: 429a cmp r2, r3
  92268. 80253c8: d005 beq.n 80253d6 <ip_reass_free_complete_datagram+0x3e>
  92269. 80253ca: 4b3e ldr r3, [pc, #248] @ (80254c4 <ip_reass_free_complete_datagram+0x12c>)
  92270. 80253cc: 22ad movs r2, #173 @ 0xad
  92271. 80253ce: 4940 ldr r1, [pc, #256] @ (80254d0 <ip_reass_free_complete_datagram+0x138>)
  92272. 80253d0: 483e ldr r0, [pc, #248] @ (80254cc <ip_reass_free_complete_datagram+0x134>)
  92273. 80253d2: f004 fafb bl 80299cc <iprintf>
  92274. }
  92275. MIB2_STATS_INC(mib2.ipreasmfails);
  92276. #if LWIP_ICMP
  92277. iprh = (struct ip_reass_helper *)ipr->p->payload;
  92278. 80253d6: 687b ldr r3, [r7, #4]
  92279. 80253d8: 685b ldr r3, [r3, #4]
  92280. 80253da: 685b ldr r3, [r3, #4]
  92281. 80253dc: 617b str r3, [r7, #20]
  92282. if (iprh->start == 0) {
  92283. 80253de: 697b ldr r3, [r7, #20]
  92284. 80253e0: 889b ldrh r3, [r3, #4]
  92285. 80253e2: b29b uxth r3, r3
  92286. 80253e4: 2b00 cmp r3, #0
  92287. 80253e6: d12a bne.n 802543e <ip_reass_free_complete_datagram+0xa6>
  92288. /* The first fragment was received, send ICMP time exceeded. */
  92289. /* First, de-queue the first pbuf from r->p. */
  92290. p = ipr->p;
  92291. 80253e8: 687b ldr r3, [r7, #4]
  92292. 80253ea: 685b ldr r3, [r3, #4]
  92293. 80253ec: 61bb str r3, [r7, #24]
  92294. ipr->p = iprh->next_pbuf;
  92295. 80253ee: 697b ldr r3, [r7, #20]
  92296. 80253f0: 681a ldr r2, [r3, #0]
  92297. 80253f2: 687b ldr r3, [r7, #4]
  92298. 80253f4: 605a str r2, [r3, #4]
  92299. /* Then, copy the original header into it. */
  92300. SMEMCPY(p->payload, &ipr->iphdr, IP_HLEN);
  92301. 80253f6: 69bb ldr r3, [r7, #24]
  92302. 80253f8: 6858 ldr r0, [r3, #4]
  92303. 80253fa: 687b ldr r3, [r7, #4]
  92304. 80253fc: 3308 adds r3, #8
  92305. 80253fe: 2214 movs r2, #20
  92306. 8025400: 4619 mov r1, r3
  92307. 8025402: f004 fd6c bl 8029ede <memcpy>
  92308. icmp_time_exceeded(p, ICMP_TE_FRAG);
  92309. 8025406: 2101 movs r1, #1
  92310. 8025408: 69b8 ldr r0, [r7, #24]
  92311. 802540a: f7ff fa4d bl 80248a8 <icmp_time_exceeded>
  92312. clen = pbuf_clen(p);
  92313. 802540e: 69b8 ldr r0, [r7, #24]
  92314. 8025410: f7f5 f8f2 bl 801a5f8 <pbuf_clen>
  92315. 8025414: 4603 mov r3, r0
  92316. 8025416: 827b strh r3, [r7, #18]
  92317. LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
  92318. 8025418: 8bfa ldrh r2, [r7, #30]
  92319. 802541a: 8a7b ldrh r3, [r7, #18]
  92320. 802541c: 4413 add r3, r2
  92321. 802541e: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  92322. 8025422: db05 blt.n 8025430 <ip_reass_free_complete_datagram+0x98>
  92323. 8025424: 4b27 ldr r3, [pc, #156] @ (80254c4 <ip_reass_free_complete_datagram+0x12c>)
  92324. 8025426: 22bc movs r2, #188 @ 0xbc
  92325. 8025428: 492a ldr r1, [pc, #168] @ (80254d4 <ip_reass_free_complete_datagram+0x13c>)
  92326. 802542a: 4828 ldr r0, [pc, #160] @ (80254cc <ip_reass_free_complete_datagram+0x134>)
  92327. 802542c: f004 face bl 80299cc <iprintf>
  92328. pbufs_freed = (u16_t)(pbufs_freed + clen);
  92329. 8025430: 8bfa ldrh r2, [r7, #30]
  92330. 8025432: 8a7b ldrh r3, [r7, #18]
  92331. 8025434: 4413 add r3, r2
  92332. 8025436: 83fb strh r3, [r7, #30]
  92333. pbuf_free(p);
  92334. 8025438: 69b8 ldr r0, [r7, #24]
  92335. 802543a: f7f5 f84f bl 801a4dc <pbuf_free>
  92336. }
  92337. #endif /* LWIP_ICMP */
  92338. /* First, free all received pbufs. The individual pbufs need to be released
  92339. separately as they have not yet been chained */
  92340. p = ipr->p;
  92341. 802543e: 687b ldr r3, [r7, #4]
  92342. 8025440: 685b ldr r3, [r3, #4]
  92343. 8025442: 61bb str r3, [r7, #24]
  92344. while (p != NULL) {
  92345. 8025444: e01f b.n 8025486 <ip_reass_free_complete_datagram+0xee>
  92346. struct pbuf *pcur;
  92347. iprh = (struct ip_reass_helper *)p->payload;
  92348. 8025446: 69bb ldr r3, [r7, #24]
  92349. 8025448: 685b ldr r3, [r3, #4]
  92350. 802544a: 617b str r3, [r7, #20]
  92351. pcur = p;
  92352. 802544c: 69bb ldr r3, [r7, #24]
  92353. 802544e: 60fb str r3, [r7, #12]
  92354. /* get the next pointer before freeing */
  92355. p = iprh->next_pbuf;
  92356. 8025450: 697b ldr r3, [r7, #20]
  92357. 8025452: 681b ldr r3, [r3, #0]
  92358. 8025454: 61bb str r3, [r7, #24]
  92359. clen = pbuf_clen(pcur);
  92360. 8025456: 68f8 ldr r0, [r7, #12]
  92361. 8025458: f7f5 f8ce bl 801a5f8 <pbuf_clen>
  92362. 802545c: 4603 mov r3, r0
  92363. 802545e: 827b strh r3, [r7, #18]
  92364. LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
  92365. 8025460: 8bfa ldrh r2, [r7, #30]
  92366. 8025462: 8a7b ldrh r3, [r7, #18]
  92367. 8025464: 4413 add r3, r2
  92368. 8025466: f5b3 3f80 cmp.w r3, #65536 @ 0x10000
  92369. 802546a: db05 blt.n 8025478 <ip_reass_free_complete_datagram+0xe0>
  92370. 802546c: 4b15 ldr r3, [pc, #84] @ (80254c4 <ip_reass_free_complete_datagram+0x12c>)
  92371. 802546e: 22cc movs r2, #204 @ 0xcc
  92372. 8025470: 4918 ldr r1, [pc, #96] @ (80254d4 <ip_reass_free_complete_datagram+0x13c>)
  92373. 8025472: 4816 ldr r0, [pc, #88] @ (80254cc <ip_reass_free_complete_datagram+0x134>)
  92374. 8025474: f004 faaa bl 80299cc <iprintf>
  92375. pbufs_freed = (u16_t)(pbufs_freed + clen);
  92376. 8025478: 8bfa ldrh r2, [r7, #30]
  92377. 802547a: 8a7b ldrh r3, [r7, #18]
  92378. 802547c: 4413 add r3, r2
  92379. 802547e: 83fb strh r3, [r7, #30]
  92380. pbuf_free(pcur);
  92381. 8025480: 68f8 ldr r0, [r7, #12]
  92382. 8025482: f7f5 f82b bl 801a4dc <pbuf_free>
  92383. while (p != NULL) {
  92384. 8025486: 69bb ldr r3, [r7, #24]
  92385. 8025488: 2b00 cmp r3, #0
  92386. 802548a: d1dc bne.n 8025446 <ip_reass_free_complete_datagram+0xae>
  92387. }
  92388. /* Then, unchain the struct ip_reassdata from the list and free it. */
  92389. ip_reass_dequeue_datagram(ipr, prev);
  92390. 802548c: 6839 ldr r1, [r7, #0]
  92391. 802548e: 6878 ldr r0, [r7, #4]
  92392. 8025490: f000 f8c2 bl 8025618 <ip_reass_dequeue_datagram>
  92393. LWIP_ASSERT("ip_reass_pbufcount >= pbufs_freed", ip_reass_pbufcount >= pbufs_freed);
  92394. 8025494: 4b10 ldr r3, [pc, #64] @ (80254d8 <ip_reass_free_complete_datagram+0x140>)
  92395. 8025496: 881b ldrh r3, [r3, #0]
  92396. 8025498: 8bfa ldrh r2, [r7, #30]
  92397. 802549a: 429a cmp r2, r3
  92398. 802549c: d905 bls.n 80254aa <ip_reass_free_complete_datagram+0x112>
  92399. 802549e: 4b09 ldr r3, [pc, #36] @ (80254c4 <ip_reass_free_complete_datagram+0x12c>)
  92400. 80254a0: 22d2 movs r2, #210 @ 0xd2
  92401. 80254a2: 490e ldr r1, [pc, #56] @ (80254dc <ip_reass_free_complete_datagram+0x144>)
  92402. 80254a4: 4809 ldr r0, [pc, #36] @ (80254cc <ip_reass_free_complete_datagram+0x134>)
  92403. 80254a6: f004 fa91 bl 80299cc <iprintf>
  92404. ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - pbufs_freed);
  92405. 80254aa: 4b0b ldr r3, [pc, #44] @ (80254d8 <ip_reass_free_complete_datagram+0x140>)
  92406. 80254ac: 881a ldrh r2, [r3, #0]
  92407. 80254ae: 8bfb ldrh r3, [r7, #30]
  92408. 80254b0: 1ad3 subs r3, r2, r3
  92409. 80254b2: b29a uxth r2, r3
  92410. 80254b4: 4b08 ldr r3, [pc, #32] @ (80254d8 <ip_reass_free_complete_datagram+0x140>)
  92411. 80254b6: 801a strh r2, [r3, #0]
  92412. return pbufs_freed;
  92413. 80254b8: 8bfb ldrh r3, [r7, #30]
  92414. }
  92415. 80254ba: 4618 mov r0, r3
  92416. 80254bc: 3720 adds r7, #32
  92417. 80254be: 46bd mov sp, r7
  92418. 80254c0: bd80 pop {r7, pc}
  92419. 80254c2: bf00 nop
  92420. 80254c4: 0803066c .word 0x0803066c
  92421. 80254c8: 080306a8 .word 0x080306a8
  92422. 80254cc: 080306b4 .word 0x080306b4
  92423. 80254d0: 080306dc .word 0x080306dc
  92424. 80254d4: 080306f0 .word 0x080306f0
  92425. 80254d8: 2402b028 .word 0x2402b028
  92426. 80254dc: 08030710 .word 0x08030710
  92427. 080254e0 <ip_reass_remove_oldest_datagram>:
  92428. * (used for freeing other datagrams if not enough space)
  92429. * @return the number of pbufs freed
  92430. */
  92431. static int
  92432. ip_reass_remove_oldest_datagram(struct ip_hdr *fraghdr, int pbufs_needed)
  92433. {
  92434. 80254e0: b580 push {r7, lr}
  92435. 80254e2: b08a sub sp, #40 @ 0x28
  92436. 80254e4: af00 add r7, sp, #0
  92437. 80254e6: 6078 str r0, [r7, #4]
  92438. 80254e8: 6039 str r1, [r7, #0]
  92439. /* @todo Can't we simply remove the last datagram in the
  92440. * linked list behind reassdatagrams?
  92441. */
  92442. struct ip_reassdata *r, *oldest, *prev, *oldest_prev;
  92443. int pbufs_freed = 0, pbufs_freed_current;
  92444. 80254ea: 2300 movs r3, #0
  92445. 80254ec: 617b str r3, [r7, #20]
  92446. int other_datagrams;
  92447. /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs,
  92448. * but don't free the datagram that 'fraghdr' belongs to! */
  92449. do {
  92450. oldest = NULL;
  92451. 80254ee: 2300 movs r3, #0
  92452. 80254f0: 623b str r3, [r7, #32]
  92453. prev = NULL;
  92454. 80254f2: 2300 movs r3, #0
  92455. 80254f4: 61fb str r3, [r7, #28]
  92456. oldest_prev = NULL;
  92457. 80254f6: 2300 movs r3, #0
  92458. 80254f8: 61bb str r3, [r7, #24]
  92459. other_datagrams = 0;
  92460. 80254fa: 2300 movs r3, #0
  92461. 80254fc: 613b str r3, [r7, #16]
  92462. r = reassdatagrams;
  92463. 80254fe: 4b28 ldr r3, [pc, #160] @ (80255a0 <ip_reass_remove_oldest_datagram+0xc0>)
  92464. 8025500: 681b ldr r3, [r3, #0]
  92465. 8025502: 627b str r3, [r7, #36] @ 0x24
  92466. while (r != NULL) {
  92467. 8025504: e030 b.n 8025568 <ip_reass_remove_oldest_datagram+0x88>
  92468. if (!IP_ADDRESSES_AND_ID_MATCH(&r->iphdr, fraghdr)) {
  92469. 8025506: 6a7b ldr r3, [r7, #36] @ 0x24
  92470. 8025508: 695a ldr r2, [r3, #20]
  92471. 802550a: 687b ldr r3, [r7, #4]
  92472. 802550c: 68db ldr r3, [r3, #12]
  92473. 802550e: 429a cmp r2, r3
  92474. 8025510: d10c bne.n 802552c <ip_reass_remove_oldest_datagram+0x4c>
  92475. 8025512: 6a7b ldr r3, [r7, #36] @ 0x24
  92476. 8025514: 699a ldr r2, [r3, #24]
  92477. 8025516: 687b ldr r3, [r7, #4]
  92478. 8025518: 691b ldr r3, [r3, #16]
  92479. 802551a: 429a cmp r2, r3
  92480. 802551c: d106 bne.n 802552c <ip_reass_remove_oldest_datagram+0x4c>
  92481. 802551e: 6a7b ldr r3, [r7, #36] @ 0x24
  92482. 8025520: 899a ldrh r2, [r3, #12]
  92483. 8025522: 687b ldr r3, [r7, #4]
  92484. 8025524: 889b ldrh r3, [r3, #4]
  92485. 8025526: b29b uxth r3, r3
  92486. 8025528: 429a cmp r2, r3
  92487. 802552a: d014 beq.n 8025556 <ip_reass_remove_oldest_datagram+0x76>
  92488. /* Not the same datagram as fraghdr */
  92489. other_datagrams++;
  92490. 802552c: 693b ldr r3, [r7, #16]
  92491. 802552e: 3301 adds r3, #1
  92492. 8025530: 613b str r3, [r7, #16]
  92493. if (oldest == NULL) {
  92494. 8025532: 6a3b ldr r3, [r7, #32]
  92495. 8025534: 2b00 cmp r3, #0
  92496. 8025536: d104 bne.n 8025542 <ip_reass_remove_oldest_datagram+0x62>
  92497. oldest = r;
  92498. 8025538: 6a7b ldr r3, [r7, #36] @ 0x24
  92499. 802553a: 623b str r3, [r7, #32]
  92500. oldest_prev = prev;
  92501. 802553c: 69fb ldr r3, [r7, #28]
  92502. 802553e: 61bb str r3, [r7, #24]
  92503. 8025540: e009 b.n 8025556 <ip_reass_remove_oldest_datagram+0x76>
  92504. } else if (r->timer <= oldest->timer) {
  92505. 8025542: 6a7b ldr r3, [r7, #36] @ 0x24
  92506. 8025544: 7fda ldrb r2, [r3, #31]
  92507. 8025546: 6a3b ldr r3, [r7, #32]
  92508. 8025548: 7fdb ldrb r3, [r3, #31]
  92509. 802554a: 429a cmp r2, r3
  92510. 802554c: d803 bhi.n 8025556 <ip_reass_remove_oldest_datagram+0x76>
  92511. /* older than the previous oldest */
  92512. oldest = r;
  92513. 802554e: 6a7b ldr r3, [r7, #36] @ 0x24
  92514. 8025550: 623b str r3, [r7, #32]
  92515. oldest_prev = prev;
  92516. 8025552: 69fb ldr r3, [r7, #28]
  92517. 8025554: 61bb str r3, [r7, #24]
  92518. }
  92519. }
  92520. if (r->next != NULL) {
  92521. 8025556: 6a7b ldr r3, [r7, #36] @ 0x24
  92522. 8025558: 681b ldr r3, [r3, #0]
  92523. 802555a: 2b00 cmp r3, #0
  92524. 802555c: d001 beq.n 8025562 <ip_reass_remove_oldest_datagram+0x82>
  92525. prev = r;
  92526. 802555e: 6a7b ldr r3, [r7, #36] @ 0x24
  92527. 8025560: 61fb str r3, [r7, #28]
  92528. }
  92529. r = r->next;
  92530. 8025562: 6a7b ldr r3, [r7, #36] @ 0x24
  92531. 8025564: 681b ldr r3, [r3, #0]
  92532. 8025566: 627b str r3, [r7, #36] @ 0x24
  92533. while (r != NULL) {
  92534. 8025568: 6a7b ldr r3, [r7, #36] @ 0x24
  92535. 802556a: 2b00 cmp r3, #0
  92536. 802556c: d1cb bne.n 8025506 <ip_reass_remove_oldest_datagram+0x26>
  92537. }
  92538. if (oldest != NULL) {
  92539. 802556e: 6a3b ldr r3, [r7, #32]
  92540. 8025570: 2b00 cmp r3, #0
  92541. 8025572: d008 beq.n 8025586 <ip_reass_remove_oldest_datagram+0xa6>
  92542. pbufs_freed_current = ip_reass_free_complete_datagram(oldest, oldest_prev);
  92543. 8025574: 69b9 ldr r1, [r7, #24]
  92544. 8025576: 6a38 ldr r0, [r7, #32]
  92545. 8025578: f7ff ff0e bl 8025398 <ip_reass_free_complete_datagram>
  92546. 802557c: 60f8 str r0, [r7, #12]
  92547. pbufs_freed += pbufs_freed_current;
  92548. 802557e: 697a ldr r2, [r7, #20]
  92549. 8025580: 68fb ldr r3, [r7, #12]
  92550. 8025582: 4413 add r3, r2
  92551. 8025584: 617b str r3, [r7, #20]
  92552. }
  92553. } while ((pbufs_freed < pbufs_needed) && (other_datagrams > 1));
  92554. 8025586: 697a ldr r2, [r7, #20]
  92555. 8025588: 683b ldr r3, [r7, #0]
  92556. 802558a: 429a cmp r2, r3
  92557. 802558c: da02 bge.n 8025594 <ip_reass_remove_oldest_datagram+0xb4>
  92558. 802558e: 693b ldr r3, [r7, #16]
  92559. 8025590: 2b01 cmp r3, #1
  92560. 8025592: dcac bgt.n 80254ee <ip_reass_remove_oldest_datagram+0xe>
  92561. return pbufs_freed;
  92562. 8025594: 697b ldr r3, [r7, #20]
  92563. }
  92564. 8025596: 4618 mov r0, r3
  92565. 8025598: 3728 adds r7, #40 @ 0x28
  92566. 802559a: 46bd mov sp, r7
  92567. 802559c: bd80 pop {r7, pc}
  92568. 802559e: bf00 nop
  92569. 80255a0: 2402b024 .word 0x2402b024
  92570. 080255a4 <ip_reass_enqueue_new_datagram>:
  92571. * @param clen number of pbufs needed to enqueue (used for freeing other datagrams if not enough space)
  92572. * @return A pointer to the queue location into which the fragment was enqueued
  92573. */
  92574. static struct ip_reassdata *
  92575. ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen)
  92576. {
  92577. 80255a4: b580 push {r7, lr}
  92578. 80255a6: b084 sub sp, #16
  92579. 80255a8: af00 add r7, sp, #0
  92580. 80255aa: 6078 str r0, [r7, #4]
  92581. 80255ac: 6039 str r1, [r7, #0]
  92582. #if ! IP_REASS_FREE_OLDEST
  92583. LWIP_UNUSED_ARG(clen);
  92584. #endif
  92585. /* No matching previous fragment found, allocate a new reassdata struct */
  92586. ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA);
  92587. 80255ae: 2004 movs r0, #4
  92588. 80255b0: f7f4 f830 bl 8019614 <memp_malloc>
  92589. 80255b4: 60f8 str r0, [r7, #12]
  92590. if (ipr == NULL) {
  92591. 80255b6: 68fb ldr r3, [r7, #12]
  92592. 80255b8: 2b00 cmp r3, #0
  92593. 80255ba: d110 bne.n 80255de <ip_reass_enqueue_new_datagram+0x3a>
  92594. #if IP_REASS_FREE_OLDEST
  92595. if (ip_reass_remove_oldest_datagram(fraghdr, clen) >= clen) {
  92596. 80255bc: 6839 ldr r1, [r7, #0]
  92597. 80255be: 6878 ldr r0, [r7, #4]
  92598. 80255c0: f7ff ff8e bl 80254e0 <ip_reass_remove_oldest_datagram>
  92599. 80255c4: 4602 mov r2, r0
  92600. 80255c6: 683b ldr r3, [r7, #0]
  92601. 80255c8: 4293 cmp r3, r2
  92602. 80255ca: dc03 bgt.n 80255d4 <ip_reass_enqueue_new_datagram+0x30>
  92603. ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA);
  92604. 80255cc: 2004 movs r0, #4
  92605. 80255ce: f7f4 f821 bl 8019614 <memp_malloc>
  92606. 80255d2: 60f8 str r0, [r7, #12]
  92607. }
  92608. if (ipr == NULL)
  92609. 80255d4: 68fb ldr r3, [r7, #12]
  92610. 80255d6: 2b00 cmp r3, #0
  92611. 80255d8: d101 bne.n 80255de <ip_reass_enqueue_new_datagram+0x3a>
  92612. #endif /* IP_REASS_FREE_OLDEST */
  92613. {
  92614. IPFRAG_STATS_INC(ip_frag.memerr);
  92615. LWIP_DEBUGF(IP_REASS_DEBUG, ("Failed to alloc reassdata struct\n"));
  92616. return NULL;
  92617. 80255da: 2300 movs r3, #0
  92618. 80255dc: e016 b.n 802560c <ip_reass_enqueue_new_datagram+0x68>
  92619. }
  92620. }
  92621. memset(ipr, 0, sizeof(struct ip_reassdata));
  92622. 80255de: 2220 movs r2, #32
  92623. 80255e0: 2100 movs r1, #0
  92624. 80255e2: 68f8 ldr r0, [r7, #12]
  92625. 80255e4: f004 fb84 bl 8029cf0 <memset>
  92626. ipr->timer = IP_REASS_MAXAGE;
  92627. 80255e8: 68fb ldr r3, [r7, #12]
  92628. 80255ea: 220f movs r2, #15
  92629. 80255ec: 77da strb r2, [r3, #31]
  92630. /* enqueue the new structure to the front of the list */
  92631. ipr->next = reassdatagrams;
  92632. 80255ee: 4b09 ldr r3, [pc, #36] @ (8025614 <ip_reass_enqueue_new_datagram+0x70>)
  92633. 80255f0: 681a ldr r2, [r3, #0]
  92634. 80255f2: 68fb ldr r3, [r7, #12]
  92635. 80255f4: 601a str r2, [r3, #0]
  92636. reassdatagrams = ipr;
  92637. 80255f6: 4a07 ldr r2, [pc, #28] @ (8025614 <ip_reass_enqueue_new_datagram+0x70>)
  92638. 80255f8: 68fb ldr r3, [r7, #12]
  92639. 80255fa: 6013 str r3, [r2, #0]
  92640. /* copy the ip header for later tests and input */
  92641. /* @todo: no ip options supported? */
  92642. SMEMCPY(&(ipr->iphdr), fraghdr, IP_HLEN);
  92643. 80255fc: 68fb ldr r3, [r7, #12]
  92644. 80255fe: 3308 adds r3, #8
  92645. 8025600: 2214 movs r2, #20
  92646. 8025602: 6879 ldr r1, [r7, #4]
  92647. 8025604: 4618 mov r0, r3
  92648. 8025606: f004 fc6a bl 8029ede <memcpy>
  92649. return ipr;
  92650. 802560a: 68fb ldr r3, [r7, #12]
  92651. }
  92652. 802560c: 4618 mov r0, r3
  92653. 802560e: 3710 adds r7, #16
  92654. 8025610: 46bd mov sp, r7
  92655. 8025612: bd80 pop {r7, pc}
  92656. 8025614: 2402b024 .word 0x2402b024
  92657. 08025618 <ip_reass_dequeue_datagram>:
  92658. * Dequeues a datagram from the datagram queue. Doesn't deallocate the pbufs.
  92659. * @param ipr points to the queue entry to dequeue
  92660. */
  92661. static void
  92662. ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev)
  92663. {
  92664. 8025618: b580 push {r7, lr}
  92665. 802561a: b082 sub sp, #8
  92666. 802561c: af00 add r7, sp, #0
  92667. 802561e: 6078 str r0, [r7, #4]
  92668. 8025620: 6039 str r1, [r7, #0]
  92669. /* dequeue the reass struct */
  92670. if (reassdatagrams == ipr) {
  92671. 8025622: 4b10 ldr r3, [pc, #64] @ (8025664 <ip_reass_dequeue_datagram+0x4c>)
  92672. 8025624: 681b ldr r3, [r3, #0]
  92673. 8025626: 687a ldr r2, [r7, #4]
  92674. 8025628: 429a cmp r2, r3
  92675. 802562a: d104 bne.n 8025636 <ip_reass_dequeue_datagram+0x1e>
  92676. /* it was the first in the list */
  92677. reassdatagrams = ipr->next;
  92678. 802562c: 687b ldr r3, [r7, #4]
  92679. 802562e: 681b ldr r3, [r3, #0]
  92680. 8025630: 4a0c ldr r2, [pc, #48] @ (8025664 <ip_reass_dequeue_datagram+0x4c>)
  92681. 8025632: 6013 str r3, [r2, #0]
  92682. 8025634: e00d b.n 8025652 <ip_reass_dequeue_datagram+0x3a>
  92683. } else {
  92684. /* it wasn't the first, so it must have a valid 'prev' */
  92685. LWIP_ASSERT("sanity check linked list", prev != NULL);
  92686. 8025636: 683b ldr r3, [r7, #0]
  92687. 8025638: 2b00 cmp r3, #0
  92688. 802563a: d106 bne.n 802564a <ip_reass_dequeue_datagram+0x32>
  92689. 802563c: 4b0a ldr r3, [pc, #40] @ (8025668 <ip_reass_dequeue_datagram+0x50>)
  92690. 802563e: f240 1245 movw r2, #325 @ 0x145
  92691. 8025642: 490a ldr r1, [pc, #40] @ (802566c <ip_reass_dequeue_datagram+0x54>)
  92692. 8025644: 480a ldr r0, [pc, #40] @ (8025670 <ip_reass_dequeue_datagram+0x58>)
  92693. 8025646: f004 f9c1 bl 80299cc <iprintf>
  92694. prev->next = ipr->next;
  92695. 802564a: 687b ldr r3, [r7, #4]
  92696. 802564c: 681a ldr r2, [r3, #0]
  92697. 802564e: 683b ldr r3, [r7, #0]
  92698. 8025650: 601a str r2, [r3, #0]
  92699. }
  92700. /* now we can free the ip_reassdata struct */
  92701. memp_free(MEMP_REASSDATA, ipr);
  92702. 8025652: 6879 ldr r1, [r7, #4]
  92703. 8025654: 2004 movs r0, #4
  92704. 8025656: f7f4 f853 bl 8019700 <memp_free>
  92705. }
  92706. 802565a: bf00 nop
  92707. 802565c: 3708 adds r7, #8
  92708. 802565e: 46bd mov sp, r7
  92709. 8025660: bd80 pop {r7, pc}
  92710. 8025662: bf00 nop
  92711. 8025664: 2402b024 .word 0x2402b024
  92712. 8025668: 0803066c .word 0x0803066c
  92713. 802566c: 08030734 .word 0x08030734
  92714. 8025670: 080306b4 .word 0x080306b4
  92715. 08025674 <ip_reass_chain_frag_into_datagram_and_validate>:
  92716. * @param is_last is 1 if this pbuf has MF==0 (ipr->flags not updated yet)
  92717. * @return see IP_REASS_VALIDATE_* defines
  92718. */
  92719. static int
  92720. ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p, int is_last)
  92721. {
  92722. 8025674: b580 push {r7, lr}
  92723. 8025676: b08c sub sp, #48 @ 0x30
  92724. 8025678: af00 add r7, sp, #0
  92725. 802567a: 60f8 str r0, [r7, #12]
  92726. 802567c: 60b9 str r1, [r7, #8]
  92727. 802567e: 607a str r2, [r7, #4]
  92728. struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev = NULL;
  92729. 8025680: 2300 movs r3, #0
  92730. 8025682: 62bb str r3, [r7, #40] @ 0x28
  92731. struct pbuf *q;
  92732. u16_t offset, len;
  92733. u8_t hlen;
  92734. struct ip_hdr *fraghdr;
  92735. int valid = 1;
  92736. 8025684: 2301 movs r3, #1
  92737. 8025686: 623b str r3, [r7, #32]
  92738. /* Extract length and fragment offset from current fragment */
  92739. fraghdr = (struct ip_hdr *)new_p->payload;
  92740. 8025688: 68bb ldr r3, [r7, #8]
  92741. 802568a: 685b ldr r3, [r3, #4]
  92742. 802568c: 61fb str r3, [r7, #28]
  92743. len = lwip_ntohs(IPH_LEN(fraghdr));
  92744. 802568e: 69fb ldr r3, [r7, #28]
  92745. 8025690: 885b ldrh r3, [r3, #2]
  92746. 8025692: b29b uxth r3, r3
  92747. 8025694: 4618 mov r0, r3
  92748. 8025696: f7f3 fa3f bl 8018b18 <lwip_htons>
  92749. 802569a: 4603 mov r3, r0
  92750. 802569c: 837b strh r3, [r7, #26]
  92751. hlen = IPH_HL_BYTES(fraghdr);
  92752. 802569e: 69fb ldr r3, [r7, #28]
  92753. 80256a0: 781b ldrb r3, [r3, #0]
  92754. 80256a2: f003 030f and.w r3, r3, #15
  92755. 80256a6: b2db uxtb r3, r3
  92756. 80256a8: 009b lsls r3, r3, #2
  92757. 80256aa: 767b strb r3, [r7, #25]
  92758. if (hlen > len) {
  92759. 80256ac: 7e7b ldrb r3, [r7, #25]
  92760. 80256ae: b29b uxth r3, r3
  92761. 80256b0: 8b7a ldrh r2, [r7, #26]
  92762. 80256b2: 429a cmp r2, r3
  92763. 80256b4: d202 bcs.n 80256bc <ip_reass_chain_frag_into_datagram_and_validate+0x48>
  92764. /* invalid datagram */
  92765. return IP_REASS_VALIDATE_PBUF_DROPPED;
  92766. 80256b6: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  92767. 80256ba: e135 b.n 8025928 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
  92768. }
  92769. len = (u16_t)(len - hlen);
  92770. 80256bc: 7e7b ldrb r3, [r7, #25]
  92771. 80256be: b29b uxth r3, r3
  92772. 80256c0: 8b7a ldrh r2, [r7, #26]
  92773. 80256c2: 1ad3 subs r3, r2, r3
  92774. 80256c4: 837b strh r3, [r7, #26]
  92775. offset = IPH_OFFSET_BYTES(fraghdr);
  92776. 80256c6: 69fb ldr r3, [r7, #28]
  92777. 80256c8: 88db ldrh r3, [r3, #6]
  92778. 80256ca: b29b uxth r3, r3
  92779. 80256cc: 4618 mov r0, r3
  92780. 80256ce: f7f3 fa23 bl 8018b18 <lwip_htons>
  92781. 80256d2: 4603 mov r3, r0
  92782. 80256d4: f3c3 030c ubfx r3, r3, #0, #13
  92783. 80256d8: b29b uxth r3, r3
  92784. 80256da: 00db lsls r3, r3, #3
  92785. 80256dc: 82fb strh r3, [r7, #22]
  92786. /* overwrite the fragment's ip header from the pbuf with our helper struct,
  92787. * and setup the embedded helper structure. */
  92788. /* make sure the struct ip_reass_helper fits into the IP header */
  92789. LWIP_ASSERT("sizeof(struct ip_reass_helper) <= IP_HLEN",
  92790. sizeof(struct ip_reass_helper) <= IP_HLEN);
  92791. iprh = (struct ip_reass_helper *)new_p->payload;
  92792. 80256de: 68bb ldr r3, [r7, #8]
  92793. 80256e0: 685b ldr r3, [r3, #4]
  92794. 80256e2: 62fb str r3, [r7, #44] @ 0x2c
  92795. iprh->next_pbuf = NULL;
  92796. 80256e4: 6afb ldr r3, [r7, #44] @ 0x2c
  92797. 80256e6: 2200 movs r2, #0
  92798. 80256e8: 701a strb r2, [r3, #0]
  92799. 80256ea: 2200 movs r2, #0
  92800. 80256ec: 705a strb r2, [r3, #1]
  92801. 80256ee: 2200 movs r2, #0
  92802. 80256f0: 709a strb r2, [r3, #2]
  92803. 80256f2: 2200 movs r2, #0
  92804. 80256f4: 70da strb r2, [r3, #3]
  92805. iprh->start = offset;
  92806. 80256f6: 6afb ldr r3, [r7, #44] @ 0x2c
  92807. 80256f8: 8afa ldrh r2, [r7, #22]
  92808. 80256fa: 809a strh r2, [r3, #4]
  92809. iprh->end = (u16_t)(offset + len);
  92810. 80256fc: 8afa ldrh r2, [r7, #22]
  92811. 80256fe: 8b7b ldrh r3, [r7, #26]
  92812. 8025700: 4413 add r3, r2
  92813. 8025702: b29a uxth r2, r3
  92814. 8025704: 6afb ldr r3, [r7, #44] @ 0x2c
  92815. 8025706: 80da strh r2, [r3, #6]
  92816. if (iprh->end < offset) {
  92817. 8025708: 6afb ldr r3, [r7, #44] @ 0x2c
  92818. 802570a: 88db ldrh r3, [r3, #6]
  92819. 802570c: b29b uxth r3, r3
  92820. 802570e: 8afa ldrh r2, [r7, #22]
  92821. 8025710: 429a cmp r2, r3
  92822. 8025712: d902 bls.n 802571a <ip_reass_chain_frag_into_datagram_and_validate+0xa6>
  92823. /* u16_t overflow, cannot handle this */
  92824. return IP_REASS_VALIDATE_PBUF_DROPPED;
  92825. 8025714: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  92826. 8025718: e106 b.n 8025928 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
  92827. }
  92828. /* Iterate through until we either get to the end of the list (append),
  92829. * or we find one with a larger offset (insert). */
  92830. for (q = ipr->p; q != NULL;) {
  92831. 802571a: 68fb ldr r3, [r7, #12]
  92832. 802571c: 685b ldr r3, [r3, #4]
  92833. 802571e: 627b str r3, [r7, #36] @ 0x24
  92834. 8025720: e068 b.n 80257f4 <ip_reass_chain_frag_into_datagram_and_validate+0x180>
  92835. iprh_tmp = (struct ip_reass_helper *)q->payload;
  92836. 8025722: 6a7b ldr r3, [r7, #36] @ 0x24
  92837. 8025724: 685b ldr r3, [r3, #4]
  92838. 8025726: 613b str r3, [r7, #16]
  92839. if (iprh->start < iprh_tmp->start) {
  92840. 8025728: 6afb ldr r3, [r7, #44] @ 0x2c
  92841. 802572a: 889b ldrh r3, [r3, #4]
  92842. 802572c: b29a uxth r2, r3
  92843. 802572e: 693b ldr r3, [r7, #16]
  92844. 8025730: 889b ldrh r3, [r3, #4]
  92845. 8025732: b29b uxth r3, r3
  92846. 8025734: 429a cmp r2, r3
  92847. 8025736: d235 bcs.n 80257a4 <ip_reass_chain_frag_into_datagram_and_validate+0x130>
  92848. /* the new pbuf should be inserted before this */
  92849. iprh->next_pbuf = q;
  92850. 8025738: 6afb ldr r3, [r7, #44] @ 0x2c
  92851. 802573a: 6a7a ldr r2, [r7, #36] @ 0x24
  92852. 802573c: 601a str r2, [r3, #0]
  92853. if (iprh_prev != NULL) {
  92854. 802573e: 6abb ldr r3, [r7, #40] @ 0x28
  92855. 8025740: 2b00 cmp r3, #0
  92856. 8025742: d020 beq.n 8025786 <ip_reass_chain_frag_into_datagram_and_validate+0x112>
  92857. /* not the fragment with the lowest offset */
  92858. #if IP_REASS_CHECK_OVERLAP
  92859. if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) {
  92860. 8025744: 6afb ldr r3, [r7, #44] @ 0x2c
  92861. 8025746: 889b ldrh r3, [r3, #4]
  92862. 8025748: b29a uxth r2, r3
  92863. 802574a: 6abb ldr r3, [r7, #40] @ 0x28
  92864. 802574c: 88db ldrh r3, [r3, #6]
  92865. 802574e: b29b uxth r3, r3
  92866. 8025750: 429a cmp r2, r3
  92867. 8025752: d307 bcc.n 8025764 <ip_reass_chain_frag_into_datagram_and_validate+0xf0>
  92868. 8025754: 6afb ldr r3, [r7, #44] @ 0x2c
  92869. 8025756: 88db ldrh r3, [r3, #6]
  92870. 8025758: b29a uxth r2, r3
  92871. 802575a: 693b ldr r3, [r7, #16]
  92872. 802575c: 889b ldrh r3, [r3, #4]
  92873. 802575e: b29b uxth r3, r3
  92874. 8025760: 429a cmp r2, r3
  92875. 8025762: d902 bls.n 802576a <ip_reass_chain_frag_into_datagram_and_validate+0xf6>
  92876. /* fragment overlaps with previous or following, throw away */
  92877. return IP_REASS_VALIDATE_PBUF_DROPPED;
  92878. 8025764: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  92879. 8025768: e0de b.n 8025928 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
  92880. }
  92881. #endif /* IP_REASS_CHECK_OVERLAP */
  92882. iprh_prev->next_pbuf = new_p;
  92883. 802576a: 6abb ldr r3, [r7, #40] @ 0x28
  92884. 802576c: 68ba ldr r2, [r7, #8]
  92885. 802576e: 601a str r2, [r3, #0]
  92886. if (iprh_prev->end != iprh->start) {
  92887. 8025770: 6abb ldr r3, [r7, #40] @ 0x28
  92888. 8025772: 88db ldrh r3, [r3, #6]
  92889. 8025774: b29a uxth r2, r3
  92890. 8025776: 6afb ldr r3, [r7, #44] @ 0x2c
  92891. 8025778: 889b ldrh r3, [r3, #4]
  92892. 802577a: b29b uxth r3, r3
  92893. 802577c: 429a cmp r2, r3
  92894. 802577e: d03d beq.n 80257fc <ip_reass_chain_frag_into_datagram_and_validate+0x188>
  92895. /* There is a fragment missing between the current
  92896. * and the previous fragment */
  92897. valid = 0;
  92898. 8025780: 2300 movs r3, #0
  92899. 8025782: 623b str r3, [r7, #32]
  92900. }
  92901. #endif /* IP_REASS_CHECK_OVERLAP */
  92902. /* fragment with the lowest offset */
  92903. ipr->p = new_p;
  92904. }
  92905. break;
  92906. 8025784: e03a b.n 80257fc <ip_reass_chain_frag_into_datagram_and_validate+0x188>
  92907. if (iprh->end > iprh_tmp->start) {
  92908. 8025786: 6afb ldr r3, [r7, #44] @ 0x2c
  92909. 8025788: 88db ldrh r3, [r3, #6]
  92910. 802578a: b29a uxth r2, r3
  92911. 802578c: 693b ldr r3, [r7, #16]
  92912. 802578e: 889b ldrh r3, [r3, #4]
  92913. 8025790: b29b uxth r3, r3
  92914. 8025792: 429a cmp r2, r3
  92915. 8025794: d902 bls.n 802579c <ip_reass_chain_frag_into_datagram_and_validate+0x128>
  92916. return IP_REASS_VALIDATE_PBUF_DROPPED;
  92917. 8025796: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  92918. 802579a: e0c5 b.n 8025928 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
  92919. ipr->p = new_p;
  92920. 802579c: 68fb ldr r3, [r7, #12]
  92921. 802579e: 68ba ldr r2, [r7, #8]
  92922. 80257a0: 605a str r2, [r3, #4]
  92923. break;
  92924. 80257a2: e02b b.n 80257fc <ip_reass_chain_frag_into_datagram_and_validate+0x188>
  92925. } else if (iprh->start == iprh_tmp->start) {
  92926. 80257a4: 6afb ldr r3, [r7, #44] @ 0x2c
  92927. 80257a6: 889b ldrh r3, [r3, #4]
  92928. 80257a8: b29a uxth r2, r3
  92929. 80257aa: 693b ldr r3, [r7, #16]
  92930. 80257ac: 889b ldrh r3, [r3, #4]
  92931. 80257ae: b29b uxth r3, r3
  92932. 80257b0: 429a cmp r2, r3
  92933. 80257b2: d102 bne.n 80257ba <ip_reass_chain_frag_into_datagram_and_validate+0x146>
  92934. /* received the same datagram twice: no need to keep the datagram */
  92935. return IP_REASS_VALIDATE_PBUF_DROPPED;
  92936. 80257b4: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  92937. 80257b8: e0b6 b.n 8025928 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
  92938. #if IP_REASS_CHECK_OVERLAP
  92939. } else if (iprh->start < iprh_tmp->end) {
  92940. 80257ba: 6afb ldr r3, [r7, #44] @ 0x2c
  92941. 80257bc: 889b ldrh r3, [r3, #4]
  92942. 80257be: b29a uxth r2, r3
  92943. 80257c0: 693b ldr r3, [r7, #16]
  92944. 80257c2: 88db ldrh r3, [r3, #6]
  92945. 80257c4: b29b uxth r3, r3
  92946. 80257c6: 429a cmp r2, r3
  92947. 80257c8: d202 bcs.n 80257d0 <ip_reass_chain_frag_into_datagram_and_validate+0x15c>
  92948. /* overlap: no need to keep the new datagram */
  92949. return IP_REASS_VALIDATE_PBUF_DROPPED;
  92950. 80257ca: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  92951. 80257ce: e0ab b.n 8025928 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
  92952. #endif /* IP_REASS_CHECK_OVERLAP */
  92953. } else {
  92954. /* Check if the fragments received so far have no holes. */
  92955. if (iprh_prev != NULL) {
  92956. 80257d0: 6abb ldr r3, [r7, #40] @ 0x28
  92957. 80257d2: 2b00 cmp r3, #0
  92958. 80257d4: d009 beq.n 80257ea <ip_reass_chain_frag_into_datagram_and_validate+0x176>
  92959. if (iprh_prev->end != iprh_tmp->start) {
  92960. 80257d6: 6abb ldr r3, [r7, #40] @ 0x28
  92961. 80257d8: 88db ldrh r3, [r3, #6]
  92962. 80257da: b29a uxth r2, r3
  92963. 80257dc: 693b ldr r3, [r7, #16]
  92964. 80257de: 889b ldrh r3, [r3, #4]
  92965. 80257e0: b29b uxth r3, r3
  92966. 80257e2: 429a cmp r2, r3
  92967. 80257e4: d001 beq.n 80257ea <ip_reass_chain_frag_into_datagram_and_validate+0x176>
  92968. /* There is a fragment missing between the current
  92969. * and the previous fragment */
  92970. valid = 0;
  92971. 80257e6: 2300 movs r3, #0
  92972. 80257e8: 623b str r3, [r7, #32]
  92973. }
  92974. }
  92975. }
  92976. q = iprh_tmp->next_pbuf;
  92977. 80257ea: 693b ldr r3, [r7, #16]
  92978. 80257ec: 681b ldr r3, [r3, #0]
  92979. 80257ee: 627b str r3, [r7, #36] @ 0x24
  92980. iprh_prev = iprh_tmp;
  92981. 80257f0: 693b ldr r3, [r7, #16]
  92982. 80257f2: 62bb str r3, [r7, #40] @ 0x28
  92983. for (q = ipr->p; q != NULL;) {
  92984. 80257f4: 6a7b ldr r3, [r7, #36] @ 0x24
  92985. 80257f6: 2b00 cmp r3, #0
  92986. 80257f8: d193 bne.n 8025722 <ip_reass_chain_frag_into_datagram_and_validate+0xae>
  92987. 80257fa: e000 b.n 80257fe <ip_reass_chain_frag_into_datagram_and_validate+0x18a>
  92988. break;
  92989. 80257fc: bf00 nop
  92990. }
  92991. /* If q is NULL, then we made it to the end of the list. Determine what to do now */
  92992. if (q == NULL) {
  92993. 80257fe: 6a7b ldr r3, [r7, #36] @ 0x24
  92994. 8025800: 2b00 cmp r3, #0
  92995. 8025802: d12d bne.n 8025860 <ip_reass_chain_frag_into_datagram_and_validate+0x1ec>
  92996. if (iprh_prev != NULL) {
  92997. 8025804: 6abb ldr r3, [r7, #40] @ 0x28
  92998. 8025806: 2b00 cmp r3, #0
  92999. 8025808: d01c beq.n 8025844 <ip_reass_chain_frag_into_datagram_and_validate+0x1d0>
  93000. /* this is (for now), the fragment with the highest offset:
  93001. * chain it to the last fragment */
  93002. #if IP_REASS_CHECK_OVERLAP
  93003. LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start);
  93004. 802580a: 6abb ldr r3, [r7, #40] @ 0x28
  93005. 802580c: 88db ldrh r3, [r3, #6]
  93006. 802580e: b29a uxth r2, r3
  93007. 8025810: 6afb ldr r3, [r7, #44] @ 0x2c
  93008. 8025812: 889b ldrh r3, [r3, #4]
  93009. 8025814: b29b uxth r3, r3
  93010. 8025816: 429a cmp r2, r3
  93011. 8025818: d906 bls.n 8025828 <ip_reass_chain_frag_into_datagram_and_validate+0x1b4>
  93012. 802581a: 4b45 ldr r3, [pc, #276] @ (8025930 <ip_reass_chain_frag_into_datagram_and_validate+0x2bc>)
  93013. 802581c: f44f 72db mov.w r2, #438 @ 0x1b6
  93014. 8025820: 4944 ldr r1, [pc, #272] @ (8025934 <ip_reass_chain_frag_into_datagram_and_validate+0x2c0>)
  93015. 8025822: 4845 ldr r0, [pc, #276] @ (8025938 <ip_reass_chain_frag_into_datagram_and_validate+0x2c4>)
  93016. 8025824: f004 f8d2 bl 80299cc <iprintf>
  93017. #endif /* IP_REASS_CHECK_OVERLAP */
  93018. iprh_prev->next_pbuf = new_p;
  93019. 8025828: 6abb ldr r3, [r7, #40] @ 0x28
  93020. 802582a: 68ba ldr r2, [r7, #8]
  93021. 802582c: 601a str r2, [r3, #0]
  93022. if (iprh_prev->end != iprh->start) {
  93023. 802582e: 6abb ldr r3, [r7, #40] @ 0x28
  93024. 8025830: 88db ldrh r3, [r3, #6]
  93025. 8025832: b29a uxth r2, r3
  93026. 8025834: 6afb ldr r3, [r7, #44] @ 0x2c
  93027. 8025836: 889b ldrh r3, [r3, #4]
  93028. 8025838: b29b uxth r3, r3
  93029. 802583a: 429a cmp r2, r3
  93030. 802583c: d010 beq.n 8025860 <ip_reass_chain_frag_into_datagram_and_validate+0x1ec>
  93031. valid = 0;
  93032. 802583e: 2300 movs r3, #0
  93033. 8025840: 623b str r3, [r7, #32]
  93034. 8025842: e00d b.n 8025860 <ip_reass_chain_frag_into_datagram_and_validate+0x1ec>
  93035. }
  93036. } else {
  93037. #if IP_REASS_CHECK_OVERLAP
  93038. LWIP_ASSERT("no previous fragment, this must be the first fragment!",
  93039. 8025844: 68fb ldr r3, [r7, #12]
  93040. 8025846: 685b ldr r3, [r3, #4]
  93041. 8025848: 2b00 cmp r3, #0
  93042. 802584a: d006 beq.n 802585a <ip_reass_chain_frag_into_datagram_and_validate+0x1e6>
  93043. 802584c: 4b38 ldr r3, [pc, #224] @ (8025930 <ip_reass_chain_frag_into_datagram_and_validate+0x2bc>)
  93044. 802584e: f44f 72df mov.w r2, #446 @ 0x1be
  93045. 8025852: 493a ldr r1, [pc, #232] @ (802593c <ip_reass_chain_frag_into_datagram_and_validate+0x2c8>)
  93046. 8025854: 4838 ldr r0, [pc, #224] @ (8025938 <ip_reass_chain_frag_into_datagram_and_validate+0x2c4>)
  93047. 8025856: f004 f8b9 bl 80299cc <iprintf>
  93048. ipr->p == NULL);
  93049. #endif /* IP_REASS_CHECK_OVERLAP */
  93050. /* this is the first fragment we ever received for this ip datagram */
  93051. ipr->p = new_p;
  93052. 802585a: 68fb ldr r3, [r7, #12]
  93053. 802585c: 68ba ldr r2, [r7, #8]
  93054. 802585e: 605a str r2, [r3, #4]
  93055. }
  93056. }
  93057. /* At this point, the validation part begins: */
  93058. /* If we already received the last fragment */
  93059. if (is_last || ((ipr->flags & IP_REASS_FLAG_LASTFRAG) != 0)) {
  93060. 8025860: 687b ldr r3, [r7, #4]
  93061. 8025862: 2b00 cmp r3, #0
  93062. 8025864: d105 bne.n 8025872 <ip_reass_chain_frag_into_datagram_and_validate+0x1fe>
  93063. 8025866: 68fb ldr r3, [r7, #12]
  93064. 8025868: 7f9b ldrb r3, [r3, #30]
  93065. 802586a: f003 0301 and.w r3, r3, #1
  93066. 802586e: 2b00 cmp r3, #0
  93067. 8025870: d059 beq.n 8025926 <ip_reass_chain_frag_into_datagram_and_validate+0x2b2>
  93068. /* and had no holes so far */
  93069. if (valid) {
  93070. 8025872: 6a3b ldr r3, [r7, #32]
  93071. 8025874: 2b00 cmp r3, #0
  93072. 8025876: d04f beq.n 8025918 <ip_reass_chain_frag_into_datagram_and_validate+0x2a4>
  93073. /* then check if the rest of the fragments is here */
  93074. /* Check if the queue starts with the first datagram */
  93075. if ((ipr->p == NULL) || (((struct ip_reass_helper *)ipr->p->payload)->start != 0)) {
  93076. 8025878: 68fb ldr r3, [r7, #12]
  93077. 802587a: 685b ldr r3, [r3, #4]
  93078. 802587c: 2b00 cmp r3, #0
  93079. 802587e: d006 beq.n 802588e <ip_reass_chain_frag_into_datagram_and_validate+0x21a>
  93080. 8025880: 68fb ldr r3, [r7, #12]
  93081. 8025882: 685b ldr r3, [r3, #4]
  93082. 8025884: 685b ldr r3, [r3, #4]
  93083. 8025886: 889b ldrh r3, [r3, #4]
  93084. 8025888: b29b uxth r3, r3
  93085. 802588a: 2b00 cmp r3, #0
  93086. 802588c: d002 beq.n 8025894 <ip_reass_chain_frag_into_datagram_and_validate+0x220>
  93087. valid = 0;
  93088. 802588e: 2300 movs r3, #0
  93089. 8025890: 623b str r3, [r7, #32]
  93090. 8025892: e041 b.n 8025918 <ip_reass_chain_frag_into_datagram_and_validate+0x2a4>
  93091. } else {
  93092. /* and check that there are no holes after this datagram */
  93093. iprh_prev = iprh;
  93094. 8025894: 6afb ldr r3, [r7, #44] @ 0x2c
  93095. 8025896: 62bb str r3, [r7, #40] @ 0x28
  93096. q = iprh->next_pbuf;
  93097. 8025898: 6afb ldr r3, [r7, #44] @ 0x2c
  93098. 802589a: 681b ldr r3, [r3, #0]
  93099. 802589c: 627b str r3, [r7, #36] @ 0x24
  93100. while (q != NULL) {
  93101. 802589e: e012 b.n 80258c6 <ip_reass_chain_frag_into_datagram_and_validate+0x252>
  93102. iprh = (struct ip_reass_helper *)q->payload;
  93103. 80258a0: 6a7b ldr r3, [r7, #36] @ 0x24
  93104. 80258a2: 685b ldr r3, [r3, #4]
  93105. 80258a4: 62fb str r3, [r7, #44] @ 0x2c
  93106. if (iprh_prev->end != iprh->start) {
  93107. 80258a6: 6abb ldr r3, [r7, #40] @ 0x28
  93108. 80258a8: 88db ldrh r3, [r3, #6]
  93109. 80258aa: b29a uxth r2, r3
  93110. 80258ac: 6afb ldr r3, [r7, #44] @ 0x2c
  93111. 80258ae: 889b ldrh r3, [r3, #4]
  93112. 80258b0: b29b uxth r3, r3
  93113. 80258b2: 429a cmp r2, r3
  93114. 80258b4: d002 beq.n 80258bc <ip_reass_chain_frag_into_datagram_and_validate+0x248>
  93115. valid = 0;
  93116. 80258b6: 2300 movs r3, #0
  93117. 80258b8: 623b str r3, [r7, #32]
  93118. break;
  93119. 80258ba: e007 b.n 80258cc <ip_reass_chain_frag_into_datagram_and_validate+0x258>
  93120. }
  93121. iprh_prev = iprh;
  93122. 80258bc: 6afb ldr r3, [r7, #44] @ 0x2c
  93123. 80258be: 62bb str r3, [r7, #40] @ 0x28
  93124. q = iprh->next_pbuf;
  93125. 80258c0: 6afb ldr r3, [r7, #44] @ 0x2c
  93126. 80258c2: 681b ldr r3, [r3, #0]
  93127. 80258c4: 627b str r3, [r7, #36] @ 0x24
  93128. while (q != NULL) {
  93129. 80258c6: 6a7b ldr r3, [r7, #36] @ 0x24
  93130. 80258c8: 2b00 cmp r3, #0
  93131. 80258ca: d1e9 bne.n 80258a0 <ip_reass_chain_frag_into_datagram_and_validate+0x22c>
  93132. }
  93133. /* if still valid, all fragments are received
  93134. * (because to the MF==0 already arrived */
  93135. if (valid) {
  93136. 80258cc: 6a3b ldr r3, [r7, #32]
  93137. 80258ce: 2b00 cmp r3, #0
  93138. 80258d0: d022 beq.n 8025918 <ip_reass_chain_frag_into_datagram_and_validate+0x2a4>
  93139. LWIP_ASSERT("sanity check", ipr->p != NULL);
  93140. 80258d2: 68fb ldr r3, [r7, #12]
  93141. 80258d4: 685b ldr r3, [r3, #4]
  93142. 80258d6: 2b00 cmp r3, #0
  93143. 80258d8: d106 bne.n 80258e8 <ip_reass_chain_frag_into_datagram_and_validate+0x274>
  93144. 80258da: 4b15 ldr r3, [pc, #84] @ (8025930 <ip_reass_chain_frag_into_datagram_and_validate+0x2bc>)
  93145. 80258dc: f240 12df movw r2, #479 @ 0x1df
  93146. 80258e0: 4917 ldr r1, [pc, #92] @ (8025940 <ip_reass_chain_frag_into_datagram_and_validate+0x2cc>)
  93147. 80258e2: 4815 ldr r0, [pc, #84] @ (8025938 <ip_reass_chain_frag_into_datagram_and_validate+0x2c4>)
  93148. 80258e4: f004 f872 bl 80299cc <iprintf>
  93149. LWIP_ASSERT("sanity check",
  93150. 80258e8: 68fb ldr r3, [r7, #12]
  93151. 80258ea: 685b ldr r3, [r3, #4]
  93152. 80258ec: 685b ldr r3, [r3, #4]
  93153. 80258ee: 6afa ldr r2, [r7, #44] @ 0x2c
  93154. 80258f0: 429a cmp r2, r3
  93155. 80258f2: d106 bne.n 8025902 <ip_reass_chain_frag_into_datagram_and_validate+0x28e>
  93156. 80258f4: 4b0e ldr r3, [pc, #56] @ (8025930 <ip_reass_chain_frag_into_datagram_and_validate+0x2bc>)
  93157. 80258f6: f44f 72f0 mov.w r2, #480 @ 0x1e0
  93158. 80258fa: 4911 ldr r1, [pc, #68] @ (8025940 <ip_reass_chain_frag_into_datagram_and_validate+0x2cc>)
  93159. 80258fc: 480e ldr r0, [pc, #56] @ (8025938 <ip_reass_chain_frag_into_datagram_and_validate+0x2c4>)
  93160. 80258fe: f004 f865 bl 80299cc <iprintf>
  93161. ((struct ip_reass_helper *)ipr->p->payload) != iprh);
  93162. LWIP_ASSERT("validate_datagram:next_pbuf!=NULL",
  93163. 8025902: 6afb ldr r3, [r7, #44] @ 0x2c
  93164. 8025904: 681b ldr r3, [r3, #0]
  93165. 8025906: 2b00 cmp r3, #0
  93166. 8025908: d006 beq.n 8025918 <ip_reass_chain_frag_into_datagram_and_validate+0x2a4>
  93167. 802590a: 4b09 ldr r3, [pc, #36] @ (8025930 <ip_reass_chain_frag_into_datagram_and_validate+0x2bc>)
  93168. 802590c: f44f 72f1 mov.w r2, #482 @ 0x1e2
  93169. 8025910: 490c ldr r1, [pc, #48] @ (8025944 <ip_reass_chain_frag_into_datagram_and_validate+0x2d0>)
  93170. 8025912: 4809 ldr r0, [pc, #36] @ (8025938 <ip_reass_chain_frag_into_datagram_and_validate+0x2c4>)
  93171. 8025914: f004 f85a bl 80299cc <iprintf>
  93172. }
  93173. }
  93174. /* If valid is 0 here, there are some fragments missing in the middle
  93175. * (since MF == 0 has already arrived). Such datagrams simply time out if
  93176. * no more fragments are received... */
  93177. return valid ? IP_REASS_VALIDATE_TELEGRAM_FINISHED : IP_REASS_VALIDATE_PBUF_QUEUED;
  93178. 8025918: 6a3b ldr r3, [r7, #32]
  93179. 802591a: 2b00 cmp r3, #0
  93180. 802591c: bf14 ite ne
  93181. 802591e: 2301 movne r3, #1
  93182. 8025920: 2300 moveq r3, #0
  93183. 8025922: b2db uxtb r3, r3
  93184. 8025924: e000 b.n 8025928 <ip_reass_chain_frag_into_datagram_and_validate+0x2b4>
  93185. }
  93186. /* If we come here, not all fragments were received, yet! */
  93187. return IP_REASS_VALIDATE_PBUF_QUEUED; /* not yet valid! */
  93188. 8025926: 2300 movs r3, #0
  93189. }
  93190. 8025928: 4618 mov r0, r3
  93191. 802592a: 3730 adds r7, #48 @ 0x30
  93192. 802592c: 46bd mov sp, r7
  93193. 802592e: bd80 pop {r7, pc}
  93194. 8025930: 0803066c .word 0x0803066c
  93195. 8025934: 08030750 .word 0x08030750
  93196. 8025938: 080306b4 .word 0x080306b4
  93197. 802593c: 08030770 .word 0x08030770
  93198. 8025940: 080307a8 .word 0x080307a8
  93199. 8025944: 080307b8 .word 0x080307b8
  93200. 08025948 <ip4_reass>:
  93201. * @param p points to a pbuf chain of the fragment
  93202. * @return NULL if reassembly is incomplete, ? otherwise
  93203. */
  93204. struct pbuf *
  93205. ip4_reass(struct pbuf *p)
  93206. {
  93207. 8025948: b580 push {r7, lr}
  93208. 802594a: b08e sub sp, #56 @ 0x38
  93209. 802594c: af00 add r7, sp, #0
  93210. 802594e: 6078 str r0, [r7, #4]
  93211. int is_last;
  93212. IPFRAG_STATS_INC(ip_frag.recv);
  93213. MIB2_STATS_INC(mib2.ipreasmreqds);
  93214. fraghdr = (struct ip_hdr *)p->payload;
  93215. 8025950: 687b ldr r3, [r7, #4]
  93216. 8025952: 685b ldr r3, [r3, #4]
  93217. 8025954: 62bb str r3, [r7, #40] @ 0x28
  93218. if (IPH_HL_BYTES(fraghdr) != IP_HLEN) {
  93219. 8025956: 6abb ldr r3, [r7, #40] @ 0x28
  93220. 8025958: 781b ldrb r3, [r3, #0]
  93221. 802595a: f003 030f and.w r3, r3, #15
  93222. 802595e: b2db uxtb r3, r3
  93223. 8025960: 009b lsls r3, r3, #2
  93224. 8025962: b2db uxtb r3, r3
  93225. 8025964: 2b14 cmp r3, #20
  93226. 8025966: f040 8171 bne.w 8025c4c <ip4_reass+0x304>
  93227. LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: IP options currently not supported!\n"));
  93228. IPFRAG_STATS_INC(ip_frag.err);
  93229. goto nullreturn;
  93230. }
  93231. offset = IPH_OFFSET_BYTES(fraghdr);
  93232. 802596a: 6abb ldr r3, [r7, #40] @ 0x28
  93233. 802596c: 88db ldrh r3, [r3, #6]
  93234. 802596e: b29b uxth r3, r3
  93235. 8025970: 4618 mov r0, r3
  93236. 8025972: f7f3 f8d1 bl 8018b18 <lwip_htons>
  93237. 8025976: 4603 mov r3, r0
  93238. 8025978: f3c3 030c ubfx r3, r3, #0, #13
  93239. 802597c: b29b uxth r3, r3
  93240. 802597e: 00db lsls r3, r3, #3
  93241. 8025980: 84fb strh r3, [r7, #38] @ 0x26
  93242. len = lwip_ntohs(IPH_LEN(fraghdr));
  93243. 8025982: 6abb ldr r3, [r7, #40] @ 0x28
  93244. 8025984: 885b ldrh r3, [r3, #2]
  93245. 8025986: b29b uxth r3, r3
  93246. 8025988: 4618 mov r0, r3
  93247. 802598a: f7f3 f8c5 bl 8018b18 <lwip_htons>
  93248. 802598e: 4603 mov r3, r0
  93249. 8025990: 84bb strh r3, [r7, #36] @ 0x24
  93250. hlen = IPH_HL_BYTES(fraghdr);
  93251. 8025992: 6abb ldr r3, [r7, #40] @ 0x28
  93252. 8025994: 781b ldrb r3, [r3, #0]
  93253. 8025996: f003 030f and.w r3, r3, #15
  93254. 802599a: b2db uxtb r3, r3
  93255. 802599c: 009b lsls r3, r3, #2
  93256. 802599e: f887 3023 strb.w r3, [r7, #35] @ 0x23
  93257. if (hlen > len) {
  93258. 80259a2: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  93259. 80259a6: b29b uxth r3, r3
  93260. 80259a8: 8cba ldrh r2, [r7, #36] @ 0x24
  93261. 80259aa: 429a cmp r2, r3
  93262. 80259ac: f0c0 8150 bcc.w 8025c50 <ip4_reass+0x308>
  93263. /* invalid datagram */
  93264. goto nullreturn;
  93265. }
  93266. len = (u16_t)(len - hlen);
  93267. 80259b0: f897 3023 ldrb.w r3, [r7, #35] @ 0x23
  93268. 80259b4: b29b uxth r3, r3
  93269. 80259b6: 8cba ldrh r2, [r7, #36] @ 0x24
  93270. 80259b8: 1ad3 subs r3, r2, r3
  93271. 80259ba: 84bb strh r3, [r7, #36] @ 0x24
  93272. /* Check if we are allowed to enqueue more datagrams. */
  93273. clen = pbuf_clen(p);
  93274. 80259bc: 6878 ldr r0, [r7, #4]
  93275. 80259be: f7f4 fe1b bl 801a5f8 <pbuf_clen>
  93276. 80259c2: 4603 mov r3, r0
  93277. 80259c4: 843b strh r3, [r7, #32]
  93278. if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) {
  93279. 80259c6: 4b8c ldr r3, [pc, #560] @ (8025bf8 <ip4_reass+0x2b0>)
  93280. 80259c8: 881b ldrh r3, [r3, #0]
  93281. 80259ca: 461a mov r2, r3
  93282. 80259cc: 8c3b ldrh r3, [r7, #32]
  93283. 80259ce: 4413 add r3, r2
  93284. 80259d0: 2b0a cmp r3, #10
  93285. 80259d2: dd10 ble.n 80259f6 <ip4_reass+0xae>
  93286. #if IP_REASS_FREE_OLDEST
  93287. if (!ip_reass_remove_oldest_datagram(fraghdr, clen) ||
  93288. 80259d4: 8c3b ldrh r3, [r7, #32]
  93289. 80259d6: 4619 mov r1, r3
  93290. 80259d8: 6ab8 ldr r0, [r7, #40] @ 0x28
  93291. 80259da: f7ff fd81 bl 80254e0 <ip_reass_remove_oldest_datagram>
  93292. 80259de: 4603 mov r3, r0
  93293. 80259e0: 2b00 cmp r3, #0
  93294. 80259e2: f000 8137 beq.w 8025c54 <ip4_reass+0x30c>
  93295. ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS))
  93296. 80259e6: 4b84 ldr r3, [pc, #528] @ (8025bf8 <ip4_reass+0x2b0>)
  93297. 80259e8: 881b ldrh r3, [r3, #0]
  93298. 80259ea: 461a mov r2, r3
  93299. 80259ec: 8c3b ldrh r3, [r7, #32]
  93300. 80259ee: 4413 add r3, r2
  93301. if (!ip_reass_remove_oldest_datagram(fraghdr, clen) ||
  93302. 80259f0: 2b0a cmp r3, #10
  93303. 80259f2: f300 812f bgt.w 8025c54 <ip4_reass+0x30c>
  93304. }
  93305. }
  93306. /* Look for the datagram the fragment belongs to in the current datagram queue,
  93307. * remembering the previous in the queue for later dequeueing. */
  93308. for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) {
  93309. 80259f6: 4b81 ldr r3, [pc, #516] @ (8025bfc <ip4_reass+0x2b4>)
  93310. 80259f8: 681b ldr r3, [r3, #0]
  93311. 80259fa: 633b str r3, [r7, #48] @ 0x30
  93312. 80259fc: e015 b.n 8025a2a <ip4_reass+0xe2>
  93313. /* Check if the incoming fragment matches the one currently present
  93314. in the reassembly buffer. If so, we proceed with copying the
  93315. fragment into the buffer. */
  93316. if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) {
  93317. 80259fe: 6b3b ldr r3, [r7, #48] @ 0x30
  93318. 8025a00: 695a ldr r2, [r3, #20]
  93319. 8025a02: 6abb ldr r3, [r7, #40] @ 0x28
  93320. 8025a04: 68db ldr r3, [r3, #12]
  93321. 8025a06: 429a cmp r2, r3
  93322. 8025a08: d10c bne.n 8025a24 <ip4_reass+0xdc>
  93323. 8025a0a: 6b3b ldr r3, [r7, #48] @ 0x30
  93324. 8025a0c: 699a ldr r2, [r3, #24]
  93325. 8025a0e: 6abb ldr r3, [r7, #40] @ 0x28
  93326. 8025a10: 691b ldr r3, [r3, #16]
  93327. 8025a12: 429a cmp r2, r3
  93328. 8025a14: d106 bne.n 8025a24 <ip4_reass+0xdc>
  93329. 8025a16: 6b3b ldr r3, [r7, #48] @ 0x30
  93330. 8025a18: 899a ldrh r2, [r3, #12]
  93331. 8025a1a: 6abb ldr r3, [r7, #40] @ 0x28
  93332. 8025a1c: 889b ldrh r3, [r3, #4]
  93333. 8025a1e: b29b uxth r3, r3
  93334. 8025a20: 429a cmp r2, r3
  93335. 8025a22: d006 beq.n 8025a32 <ip4_reass+0xea>
  93336. for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) {
  93337. 8025a24: 6b3b ldr r3, [r7, #48] @ 0x30
  93338. 8025a26: 681b ldr r3, [r3, #0]
  93339. 8025a28: 633b str r3, [r7, #48] @ 0x30
  93340. 8025a2a: 6b3b ldr r3, [r7, #48] @ 0x30
  93341. 8025a2c: 2b00 cmp r3, #0
  93342. 8025a2e: d1e6 bne.n 80259fe <ip4_reass+0xb6>
  93343. 8025a30: e000 b.n 8025a34 <ip4_reass+0xec>
  93344. LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: matching previous fragment ID=%"X16_F"\n",
  93345. lwip_ntohs(IPH_ID(fraghdr))));
  93346. IPFRAG_STATS_INC(ip_frag.cachehit);
  93347. break;
  93348. 8025a32: bf00 nop
  93349. }
  93350. }
  93351. if (ipr == NULL) {
  93352. 8025a34: 6b3b ldr r3, [r7, #48] @ 0x30
  93353. 8025a36: 2b00 cmp r3, #0
  93354. 8025a38: d109 bne.n 8025a4e <ip4_reass+0x106>
  93355. /* Enqueue a new datagram into the datagram queue */
  93356. ipr = ip_reass_enqueue_new_datagram(fraghdr, clen);
  93357. 8025a3a: 8c3b ldrh r3, [r7, #32]
  93358. 8025a3c: 4619 mov r1, r3
  93359. 8025a3e: 6ab8 ldr r0, [r7, #40] @ 0x28
  93360. 8025a40: f7ff fdb0 bl 80255a4 <ip_reass_enqueue_new_datagram>
  93361. 8025a44: 6338 str r0, [r7, #48] @ 0x30
  93362. /* Bail if unable to enqueue */
  93363. if (ipr == NULL) {
  93364. 8025a46: 6b3b ldr r3, [r7, #48] @ 0x30
  93365. 8025a48: 2b00 cmp r3, #0
  93366. 8025a4a: d11c bne.n 8025a86 <ip4_reass+0x13e>
  93367. goto nullreturn;
  93368. 8025a4c: e105 b.n 8025c5a <ip4_reass+0x312>
  93369. }
  93370. } else {
  93371. if (((lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) &&
  93372. 8025a4e: 6abb ldr r3, [r7, #40] @ 0x28
  93373. 8025a50: 88db ldrh r3, [r3, #6]
  93374. 8025a52: b29b uxth r3, r3
  93375. 8025a54: 4618 mov r0, r3
  93376. 8025a56: f7f3 f85f bl 8018b18 <lwip_htons>
  93377. 8025a5a: 4603 mov r3, r0
  93378. 8025a5c: f3c3 030c ubfx r3, r3, #0, #13
  93379. 8025a60: 2b00 cmp r3, #0
  93380. 8025a62: d110 bne.n 8025a86 <ip4_reass+0x13e>
  93381. ((lwip_ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) {
  93382. 8025a64: 6b3b ldr r3, [r7, #48] @ 0x30
  93383. 8025a66: 89db ldrh r3, [r3, #14]
  93384. 8025a68: 4618 mov r0, r3
  93385. 8025a6a: f7f3 f855 bl 8018b18 <lwip_htons>
  93386. 8025a6e: 4603 mov r3, r0
  93387. 8025a70: f3c3 030c ubfx r3, r3, #0, #13
  93388. if (((lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) &&
  93389. 8025a74: 2b00 cmp r3, #0
  93390. 8025a76: d006 beq.n 8025a86 <ip4_reass+0x13e>
  93391. /* ipr->iphdr is not the header from the first fragment, but fraghdr is
  93392. * -> copy fraghdr into ipr->iphdr since we want to have the header
  93393. * of the first fragment (for ICMP time exceeded and later, for copying
  93394. * all options, if supported)*/
  93395. SMEMCPY(&ipr->iphdr, fraghdr, IP_HLEN);
  93396. 8025a78: 6b3b ldr r3, [r7, #48] @ 0x30
  93397. 8025a7a: 3308 adds r3, #8
  93398. 8025a7c: 2214 movs r2, #20
  93399. 8025a7e: 6ab9 ldr r1, [r7, #40] @ 0x28
  93400. 8025a80: 4618 mov r0, r3
  93401. 8025a82: f004 fa2c bl 8029ede <memcpy>
  93402. /* At this point, we have either created a new entry or pointing
  93403. * to an existing one */
  93404. /* check for 'no more fragments', and update queue entry*/
  93405. is_last = (IPH_OFFSET(fraghdr) & PP_NTOHS(IP_MF)) == 0;
  93406. 8025a86: 6abb ldr r3, [r7, #40] @ 0x28
  93407. 8025a88: 88db ldrh r3, [r3, #6]
  93408. 8025a8a: b29b uxth r3, r3
  93409. 8025a8c: f003 0320 and.w r3, r3, #32
  93410. 8025a90: 2b00 cmp r3, #0
  93411. 8025a92: bf0c ite eq
  93412. 8025a94: 2301 moveq r3, #1
  93413. 8025a96: 2300 movne r3, #0
  93414. 8025a98: b2db uxtb r3, r3
  93415. 8025a9a: 61fb str r3, [r7, #28]
  93416. if (is_last) {
  93417. 8025a9c: 69fb ldr r3, [r7, #28]
  93418. 8025a9e: 2b00 cmp r3, #0
  93419. 8025aa0: d00e beq.n 8025ac0 <ip4_reass+0x178>
  93420. u16_t datagram_len = (u16_t)(offset + len);
  93421. 8025aa2: 8cfa ldrh r2, [r7, #38] @ 0x26
  93422. 8025aa4: 8cbb ldrh r3, [r7, #36] @ 0x24
  93423. 8025aa6: 4413 add r3, r2
  93424. 8025aa8: 837b strh r3, [r7, #26]
  93425. if ((datagram_len < offset) || (datagram_len > (0xFFFF - IP_HLEN))) {
  93426. 8025aaa: 8b7a ldrh r2, [r7, #26]
  93427. 8025aac: 8cfb ldrh r3, [r7, #38] @ 0x26
  93428. 8025aae: 429a cmp r2, r3
  93429. 8025ab0: f0c0 80a0 bcc.w 8025bf4 <ip4_reass+0x2ac>
  93430. 8025ab4: 8b7b ldrh r3, [r7, #26]
  93431. 8025ab6: f64f 72eb movw r2, #65515 @ 0xffeb
  93432. 8025aba: 4293 cmp r3, r2
  93433. 8025abc: f200 809a bhi.w 8025bf4 <ip4_reass+0x2ac>
  93434. goto nullreturn_ipr;
  93435. }
  93436. }
  93437. /* find the right place to insert this pbuf */
  93438. /* @todo: trim pbufs if fragments are overlapping */
  93439. valid = ip_reass_chain_frag_into_datagram_and_validate(ipr, p, is_last);
  93440. 8025ac0: 69fa ldr r2, [r7, #28]
  93441. 8025ac2: 6879 ldr r1, [r7, #4]
  93442. 8025ac4: 6b38 ldr r0, [r7, #48] @ 0x30
  93443. 8025ac6: f7ff fdd5 bl 8025674 <ip_reass_chain_frag_into_datagram_and_validate>
  93444. 8025aca: 6178 str r0, [r7, #20]
  93445. if (valid == IP_REASS_VALIDATE_PBUF_DROPPED) {
  93446. 8025acc: 697b ldr r3, [r7, #20]
  93447. 8025ace: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  93448. 8025ad2: f000 809b beq.w 8025c0c <ip4_reass+0x2c4>
  93449. /* if we come here, the pbuf has been enqueued */
  93450. /* Track the current number of pbufs current 'in-flight', in order to limit
  93451. the number of fragments that may be enqueued at any one time
  93452. (overflow checked by testing against IP_REASS_MAX_PBUFS) */
  93453. ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount + clen);
  93454. 8025ad6: 4b48 ldr r3, [pc, #288] @ (8025bf8 <ip4_reass+0x2b0>)
  93455. 8025ad8: 881a ldrh r2, [r3, #0]
  93456. 8025ada: 8c3b ldrh r3, [r7, #32]
  93457. 8025adc: 4413 add r3, r2
  93458. 8025ade: b29a uxth r2, r3
  93459. 8025ae0: 4b45 ldr r3, [pc, #276] @ (8025bf8 <ip4_reass+0x2b0>)
  93460. 8025ae2: 801a strh r2, [r3, #0]
  93461. if (is_last) {
  93462. 8025ae4: 69fb ldr r3, [r7, #28]
  93463. 8025ae6: 2b00 cmp r3, #0
  93464. 8025ae8: d00d beq.n 8025b06 <ip4_reass+0x1be>
  93465. u16_t datagram_len = (u16_t)(offset + len);
  93466. 8025aea: 8cfa ldrh r2, [r7, #38] @ 0x26
  93467. 8025aec: 8cbb ldrh r3, [r7, #36] @ 0x24
  93468. 8025aee: 4413 add r3, r2
  93469. 8025af0: 827b strh r3, [r7, #18]
  93470. ipr->datagram_len = datagram_len;
  93471. 8025af2: 6b3b ldr r3, [r7, #48] @ 0x30
  93472. 8025af4: 8a7a ldrh r2, [r7, #18]
  93473. 8025af6: 839a strh r2, [r3, #28]
  93474. ipr->flags |= IP_REASS_FLAG_LASTFRAG;
  93475. 8025af8: 6b3b ldr r3, [r7, #48] @ 0x30
  93476. 8025afa: 7f9b ldrb r3, [r3, #30]
  93477. 8025afc: f043 0301 orr.w r3, r3, #1
  93478. 8025b00: b2da uxtb r2, r3
  93479. 8025b02: 6b3b ldr r3, [r7, #48] @ 0x30
  93480. 8025b04: 779a strb r2, [r3, #30]
  93481. LWIP_DEBUGF(IP_REASS_DEBUG,
  93482. ("ip4_reass: last fragment seen, total len %"S16_F"\n",
  93483. ipr->datagram_len));
  93484. }
  93485. if (valid == IP_REASS_VALIDATE_TELEGRAM_FINISHED) {
  93486. 8025b06: 697b ldr r3, [r7, #20]
  93487. 8025b08: 2b01 cmp r3, #1
  93488. 8025b0a: d171 bne.n 8025bf0 <ip4_reass+0x2a8>
  93489. struct ip_reassdata *ipr_prev;
  93490. /* the totally last fragment (flag more fragments = 0) was received at least
  93491. * once AND all fragments are received */
  93492. u16_t datagram_len = (u16_t)(ipr->datagram_len + IP_HLEN);
  93493. 8025b0c: 6b3b ldr r3, [r7, #48] @ 0x30
  93494. 8025b0e: 8b9b ldrh r3, [r3, #28]
  93495. 8025b10: 3314 adds r3, #20
  93496. 8025b12: 823b strh r3, [r7, #16]
  93497. /* save the second pbuf before copying the header over the pointer */
  93498. r = ((struct ip_reass_helper *)ipr->p->payload)->next_pbuf;
  93499. 8025b14: 6b3b ldr r3, [r7, #48] @ 0x30
  93500. 8025b16: 685b ldr r3, [r3, #4]
  93501. 8025b18: 685b ldr r3, [r3, #4]
  93502. 8025b1a: 681b ldr r3, [r3, #0]
  93503. 8025b1c: 62fb str r3, [r7, #44] @ 0x2c
  93504. /* copy the original ip header back to the first pbuf */
  93505. fraghdr = (struct ip_hdr *)(ipr->p->payload);
  93506. 8025b1e: 6b3b ldr r3, [r7, #48] @ 0x30
  93507. 8025b20: 685b ldr r3, [r3, #4]
  93508. 8025b22: 685b ldr r3, [r3, #4]
  93509. 8025b24: 62bb str r3, [r7, #40] @ 0x28
  93510. SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN);
  93511. 8025b26: 6b3b ldr r3, [r7, #48] @ 0x30
  93512. 8025b28: 3308 adds r3, #8
  93513. 8025b2a: 2214 movs r2, #20
  93514. 8025b2c: 4619 mov r1, r3
  93515. 8025b2e: 6ab8 ldr r0, [r7, #40] @ 0x28
  93516. 8025b30: f004 f9d5 bl 8029ede <memcpy>
  93517. IPH_LEN_SET(fraghdr, lwip_htons(datagram_len));
  93518. 8025b34: 8a3b ldrh r3, [r7, #16]
  93519. 8025b36: 4618 mov r0, r3
  93520. 8025b38: f7f2 ffee bl 8018b18 <lwip_htons>
  93521. 8025b3c: 4603 mov r3, r0
  93522. 8025b3e: 461a mov r2, r3
  93523. 8025b40: 6abb ldr r3, [r7, #40] @ 0x28
  93524. 8025b42: 805a strh r2, [r3, #2]
  93525. IPH_OFFSET_SET(fraghdr, 0);
  93526. 8025b44: 6abb ldr r3, [r7, #40] @ 0x28
  93527. 8025b46: 2200 movs r2, #0
  93528. 8025b48: 719a strb r2, [r3, #6]
  93529. 8025b4a: 2200 movs r2, #0
  93530. 8025b4c: 71da strb r2, [r3, #7]
  93531. IPH_CHKSUM_SET(fraghdr, 0);
  93532. 8025b4e: 6abb ldr r3, [r7, #40] @ 0x28
  93533. 8025b50: 2200 movs r2, #0
  93534. 8025b52: 729a strb r2, [r3, #10]
  93535. 8025b54: 2200 movs r2, #0
  93536. 8025b56: 72da strb r2, [r3, #11]
  93537. IF__NETIF_CHECKSUM_ENABLED(ip_current_input_netif(), NETIF_CHECKSUM_GEN_IP) {
  93538. IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN));
  93539. }
  93540. #endif /* CHECKSUM_GEN_IP */
  93541. p = ipr->p;
  93542. 8025b58: 6b3b ldr r3, [r7, #48] @ 0x30
  93543. 8025b5a: 685b ldr r3, [r3, #4]
  93544. 8025b5c: 607b str r3, [r7, #4]
  93545. /* chain together the pbufs contained within the reass_data list. */
  93546. while (r != NULL) {
  93547. 8025b5e: e00d b.n 8025b7c <ip4_reass+0x234>
  93548. iprh = (struct ip_reass_helper *)r->payload;
  93549. 8025b60: 6afb ldr r3, [r7, #44] @ 0x2c
  93550. 8025b62: 685b ldr r3, [r3, #4]
  93551. 8025b64: 60fb str r3, [r7, #12]
  93552. /* hide the ip header for every succeeding fragment */
  93553. pbuf_remove_header(r, IP_HLEN);
  93554. 8025b66: 2114 movs r1, #20
  93555. 8025b68: 6af8 ldr r0, [r7, #44] @ 0x2c
  93556. 8025b6a: f7f4 fbff bl 801a36c <pbuf_remove_header>
  93557. pbuf_cat(p, r);
  93558. 8025b6e: 6af9 ldr r1, [r7, #44] @ 0x2c
  93559. 8025b70: 6878 ldr r0, [r7, #4]
  93560. 8025b72: f7f4 fd81 bl 801a678 <pbuf_cat>
  93561. r = iprh->next_pbuf;
  93562. 8025b76: 68fb ldr r3, [r7, #12]
  93563. 8025b78: 681b ldr r3, [r3, #0]
  93564. 8025b7a: 62fb str r3, [r7, #44] @ 0x2c
  93565. while (r != NULL) {
  93566. 8025b7c: 6afb ldr r3, [r7, #44] @ 0x2c
  93567. 8025b7e: 2b00 cmp r3, #0
  93568. 8025b80: d1ee bne.n 8025b60 <ip4_reass+0x218>
  93569. }
  93570. /* find the previous entry in the linked list */
  93571. if (ipr == reassdatagrams) {
  93572. 8025b82: 4b1e ldr r3, [pc, #120] @ (8025bfc <ip4_reass+0x2b4>)
  93573. 8025b84: 681b ldr r3, [r3, #0]
  93574. 8025b86: 6b3a ldr r2, [r7, #48] @ 0x30
  93575. 8025b88: 429a cmp r2, r3
  93576. 8025b8a: d102 bne.n 8025b92 <ip4_reass+0x24a>
  93577. ipr_prev = NULL;
  93578. 8025b8c: 2300 movs r3, #0
  93579. 8025b8e: 637b str r3, [r7, #52] @ 0x34
  93580. 8025b90: e010 b.n 8025bb4 <ip4_reass+0x26c>
  93581. } else {
  93582. for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) {
  93583. 8025b92: 4b1a ldr r3, [pc, #104] @ (8025bfc <ip4_reass+0x2b4>)
  93584. 8025b94: 681b ldr r3, [r3, #0]
  93585. 8025b96: 637b str r3, [r7, #52] @ 0x34
  93586. 8025b98: e007 b.n 8025baa <ip4_reass+0x262>
  93587. if (ipr_prev->next == ipr) {
  93588. 8025b9a: 6b7b ldr r3, [r7, #52] @ 0x34
  93589. 8025b9c: 681b ldr r3, [r3, #0]
  93590. 8025b9e: 6b3a ldr r2, [r7, #48] @ 0x30
  93591. 8025ba0: 429a cmp r2, r3
  93592. 8025ba2: d006 beq.n 8025bb2 <ip4_reass+0x26a>
  93593. for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) {
  93594. 8025ba4: 6b7b ldr r3, [r7, #52] @ 0x34
  93595. 8025ba6: 681b ldr r3, [r3, #0]
  93596. 8025ba8: 637b str r3, [r7, #52] @ 0x34
  93597. 8025baa: 6b7b ldr r3, [r7, #52] @ 0x34
  93598. 8025bac: 2b00 cmp r3, #0
  93599. 8025bae: d1f4 bne.n 8025b9a <ip4_reass+0x252>
  93600. 8025bb0: e000 b.n 8025bb4 <ip4_reass+0x26c>
  93601. break;
  93602. 8025bb2: bf00 nop
  93603. }
  93604. }
  93605. }
  93606. /* release the sources allocate for the fragment queue entry */
  93607. ip_reass_dequeue_datagram(ipr, ipr_prev);
  93608. 8025bb4: 6b79 ldr r1, [r7, #52] @ 0x34
  93609. 8025bb6: 6b38 ldr r0, [r7, #48] @ 0x30
  93610. 8025bb8: f7ff fd2e bl 8025618 <ip_reass_dequeue_datagram>
  93611. /* and adjust the number of pbufs currently queued for reassembly. */
  93612. clen = pbuf_clen(p);
  93613. 8025bbc: 6878 ldr r0, [r7, #4]
  93614. 8025bbe: f7f4 fd1b bl 801a5f8 <pbuf_clen>
  93615. 8025bc2: 4603 mov r3, r0
  93616. 8025bc4: 843b strh r3, [r7, #32]
  93617. LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= clen);
  93618. 8025bc6: 4b0c ldr r3, [pc, #48] @ (8025bf8 <ip4_reass+0x2b0>)
  93619. 8025bc8: 881b ldrh r3, [r3, #0]
  93620. 8025bca: 8c3a ldrh r2, [r7, #32]
  93621. 8025bcc: 429a cmp r2, r3
  93622. 8025bce: d906 bls.n 8025bde <ip4_reass+0x296>
  93623. 8025bd0: 4b0b ldr r3, [pc, #44] @ (8025c00 <ip4_reass+0x2b8>)
  93624. 8025bd2: f240 229b movw r2, #667 @ 0x29b
  93625. 8025bd6: 490b ldr r1, [pc, #44] @ (8025c04 <ip4_reass+0x2bc>)
  93626. 8025bd8: 480b ldr r0, [pc, #44] @ (8025c08 <ip4_reass+0x2c0>)
  93627. 8025bda: f003 fef7 bl 80299cc <iprintf>
  93628. ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - clen);
  93629. 8025bde: 4b06 ldr r3, [pc, #24] @ (8025bf8 <ip4_reass+0x2b0>)
  93630. 8025be0: 881a ldrh r2, [r3, #0]
  93631. 8025be2: 8c3b ldrh r3, [r7, #32]
  93632. 8025be4: 1ad3 subs r3, r2, r3
  93633. 8025be6: b29a uxth r2, r3
  93634. 8025be8: 4b03 ldr r3, [pc, #12] @ (8025bf8 <ip4_reass+0x2b0>)
  93635. 8025bea: 801a strh r2, [r3, #0]
  93636. MIB2_STATS_INC(mib2.ipreasmoks);
  93637. /* Return the pbuf chain */
  93638. return p;
  93639. 8025bec: 687b ldr r3, [r7, #4]
  93640. 8025bee: e038 b.n 8025c62 <ip4_reass+0x31a>
  93641. }
  93642. /* the datagram is not (yet?) reassembled completely */
  93643. LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount));
  93644. return NULL;
  93645. 8025bf0: 2300 movs r3, #0
  93646. 8025bf2: e036 b.n 8025c62 <ip4_reass+0x31a>
  93647. goto nullreturn_ipr;
  93648. 8025bf4: bf00 nop
  93649. 8025bf6: e00a b.n 8025c0e <ip4_reass+0x2c6>
  93650. 8025bf8: 2402b028 .word 0x2402b028
  93651. 8025bfc: 2402b024 .word 0x2402b024
  93652. 8025c00: 0803066c .word 0x0803066c
  93653. 8025c04: 080307dc .word 0x080307dc
  93654. 8025c08: 080306b4 .word 0x080306b4
  93655. goto nullreturn_ipr;
  93656. 8025c0c: bf00 nop
  93657. nullreturn_ipr:
  93658. LWIP_ASSERT("ipr != NULL", ipr != NULL);
  93659. 8025c0e: 6b3b ldr r3, [r7, #48] @ 0x30
  93660. 8025c10: 2b00 cmp r3, #0
  93661. 8025c12: d106 bne.n 8025c22 <ip4_reass+0x2da>
  93662. 8025c14: 4b15 ldr r3, [pc, #84] @ (8025c6c <ip4_reass+0x324>)
  93663. 8025c16: f44f 722a mov.w r2, #680 @ 0x2a8
  93664. 8025c1a: 4915 ldr r1, [pc, #84] @ (8025c70 <ip4_reass+0x328>)
  93665. 8025c1c: 4815 ldr r0, [pc, #84] @ (8025c74 <ip4_reass+0x32c>)
  93666. 8025c1e: f003 fed5 bl 80299cc <iprintf>
  93667. if (ipr->p == NULL) {
  93668. 8025c22: 6b3b ldr r3, [r7, #48] @ 0x30
  93669. 8025c24: 685b ldr r3, [r3, #4]
  93670. 8025c26: 2b00 cmp r3, #0
  93671. 8025c28: d116 bne.n 8025c58 <ip4_reass+0x310>
  93672. /* dropped pbuf after creating a new datagram entry: remove the entry, too */
  93673. LWIP_ASSERT("not firstalthough just enqueued", ipr == reassdatagrams);
  93674. 8025c2a: 4b13 ldr r3, [pc, #76] @ (8025c78 <ip4_reass+0x330>)
  93675. 8025c2c: 681b ldr r3, [r3, #0]
  93676. 8025c2e: 6b3a ldr r2, [r7, #48] @ 0x30
  93677. 8025c30: 429a cmp r2, r3
  93678. 8025c32: d006 beq.n 8025c42 <ip4_reass+0x2fa>
  93679. 8025c34: 4b0d ldr r3, [pc, #52] @ (8025c6c <ip4_reass+0x324>)
  93680. 8025c36: f240 22ab movw r2, #683 @ 0x2ab
  93681. 8025c3a: 4910 ldr r1, [pc, #64] @ (8025c7c <ip4_reass+0x334>)
  93682. 8025c3c: 480d ldr r0, [pc, #52] @ (8025c74 <ip4_reass+0x32c>)
  93683. 8025c3e: f003 fec5 bl 80299cc <iprintf>
  93684. ip_reass_dequeue_datagram(ipr, NULL);
  93685. 8025c42: 2100 movs r1, #0
  93686. 8025c44: 6b38 ldr r0, [r7, #48] @ 0x30
  93687. 8025c46: f7ff fce7 bl 8025618 <ip_reass_dequeue_datagram>
  93688. 8025c4a: e006 b.n 8025c5a <ip4_reass+0x312>
  93689. goto nullreturn;
  93690. 8025c4c: bf00 nop
  93691. 8025c4e: e004 b.n 8025c5a <ip4_reass+0x312>
  93692. goto nullreturn;
  93693. 8025c50: bf00 nop
  93694. 8025c52: e002 b.n 8025c5a <ip4_reass+0x312>
  93695. goto nullreturn;
  93696. 8025c54: bf00 nop
  93697. 8025c56: e000 b.n 8025c5a <ip4_reass+0x312>
  93698. }
  93699. nullreturn:
  93700. 8025c58: bf00 nop
  93701. LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: nullreturn\n"));
  93702. IPFRAG_STATS_INC(ip_frag.drop);
  93703. pbuf_free(p);
  93704. 8025c5a: 6878 ldr r0, [r7, #4]
  93705. 8025c5c: f7f4 fc3e bl 801a4dc <pbuf_free>
  93706. return NULL;
  93707. 8025c60: 2300 movs r3, #0
  93708. }
  93709. 8025c62: 4618 mov r0, r3
  93710. 8025c64: 3738 adds r7, #56 @ 0x38
  93711. 8025c66: 46bd mov sp, r7
  93712. 8025c68: bd80 pop {r7, pc}
  93713. 8025c6a: bf00 nop
  93714. 8025c6c: 0803066c .word 0x0803066c
  93715. 8025c70: 080307f8 .word 0x080307f8
  93716. 8025c74: 080306b4 .word 0x080306b4
  93717. 8025c78: 2402b024 .word 0x2402b024
  93718. 8025c7c: 08030804 .word 0x08030804
  93719. 08025c80 <ip_frag_alloc_pbuf_custom_ref>:
  93720. #if IP_FRAG
  93721. #if !LWIP_NETIF_TX_SINGLE_PBUF
  93722. /** Allocate a new struct pbuf_custom_ref */
  93723. static struct pbuf_custom_ref *
  93724. ip_frag_alloc_pbuf_custom_ref(void)
  93725. {
  93726. 8025c80: b580 push {r7, lr}
  93727. 8025c82: af00 add r7, sp, #0
  93728. return (struct pbuf_custom_ref *)memp_malloc(MEMP_FRAG_PBUF);
  93729. 8025c84: 2005 movs r0, #5
  93730. 8025c86: f7f3 fcc5 bl 8019614 <memp_malloc>
  93731. 8025c8a: 4603 mov r3, r0
  93732. }
  93733. 8025c8c: 4618 mov r0, r3
  93734. 8025c8e: bd80 pop {r7, pc}
  93735. 08025c90 <ip_frag_free_pbuf_custom_ref>:
  93736. /** Free a struct pbuf_custom_ref */
  93737. static void
  93738. ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref *p)
  93739. {
  93740. 8025c90: b580 push {r7, lr}
  93741. 8025c92: b082 sub sp, #8
  93742. 8025c94: af00 add r7, sp, #0
  93743. 8025c96: 6078 str r0, [r7, #4]
  93744. LWIP_ASSERT("p != NULL", p != NULL);
  93745. 8025c98: 687b ldr r3, [r7, #4]
  93746. 8025c9a: 2b00 cmp r3, #0
  93747. 8025c9c: d106 bne.n 8025cac <ip_frag_free_pbuf_custom_ref+0x1c>
  93748. 8025c9e: 4b07 ldr r3, [pc, #28] @ (8025cbc <ip_frag_free_pbuf_custom_ref+0x2c>)
  93749. 8025ca0: f44f 7231 mov.w r2, #708 @ 0x2c4
  93750. 8025ca4: 4906 ldr r1, [pc, #24] @ (8025cc0 <ip_frag_free_pbuf_custom_ref+0x30>)
  93751. 8025ca6: 4807 ldr r0, [pc, #28] @ (8025cc4 <ip_frag_free_pbuf_custom_ref+0x34>)
  93752. 8025ca8: f003 fe90 bl 80299cc <iprintf>
  93753. memp_free(MEMP_FRAG_PBUF, p);
  93754. 8025cac: 6879 ldr r1, [r7, #4]
  93755. 8025cae: 2005 movs r0, #5
  93756. 8025cb0: f7f3 fd26 bl 8019700 <memp_free>
  93757. }
  93758. 8025cb4: bf00 nop
  93759. 8025cb6: 3708 adds r7, #8
  93760. 8025cb8: 46bd mov sp, r7
  93761. 8025cba: bd80 pop {r7, pc}
  93762. 8025cbc: 0803066c .word 0x0803066c
  93763. 8025cc0: 08030824 .word 0x08030824
  93764. 8025cc4: 080306b4 .word 0x080306b4
  93765. 08025cc8 <ipfrag_free_pbuf_custom>:
  93766. /** Free-callback function to free a 'struct pbuf_custom_ref', called by
  93767. * pbuf_free. */
  93768. static void
  93769. ipfrag_free_pbuf_custom(struct pbuf *p)
  93770. {
  93771. 8025cc8: b580 push {r7, lr}
  93772. 8025cca: b084 sub sp, #16
  93773. 8025ccc: af00 add r7, sp, #0
  93774. 8025cce: 6078 str r0, [r7, #4]
  93775. struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref *)p;
  93776. 8025cd0: 687b ldr r3, [r7, #4]
  93777. 8025cd2: 60fb str r3, [r7, #12]
  93778. LWIP_ASSERT("pcr != NULL", pcr != NULL);
  93779. 8025cd4: 68fb ldr r3, [r7, #12]
  93780. 8025cd6: 2b00 cmp r3, #0
  93781. 8025cd8: d106 bne.n 8025ce8 <ipfrag_free_pbuf_custom+0x20>
  93782. 8025cda: 4b11 ldr r3, [pc, #68] @ (8025d20 <ipfrag_free_pbuf_custom+0x58>)
  93783. 8025cdc: f240 22ce movw r2, #718 @ 0x2ce
  93784. 8025ce0: 4910 ldr r1, [pc, #64] @ (8025d24 <ipfrag_free_pbuf_custom+0x5c>)
  93785. 8025ce2: 4811 ldr r0, [pc, #68] @ (8025d28 <ipfrag_free_pbuf_custom+0x60>)
  93786. 8025ce4: f003 fe72 bl 80299cc <iprintf>
  93787. LWIP_ASSERT("pcr == p", (void *)pcr == (void *)p);
  93788. 8025ce8: 68fa ldr r2, [r7, #12]
  93789. 8025cea: 687b ldr r3, [r7, #4]
  93790. 8025cec: 429a cmp r2, r3
  93791. 8025cee: d006 beq.n 8025cfe <ipfrag_free_pbuf_custom+0x36>
  93792. 8025cf0: 4b0b ldr r3, [pc, #44] @ (8025d20 <ipfrag_free_pbuf_custom+0x58>)
  93793. 8025cf2: f240 22cf movw r2, #719 @ 0x2cf
  93794. 8025cf6: 490d ldr r1, [pc, #52] @ (8025d2c <ipfrag_free_pbuf_custom+0x64>)
  93795. 8025cf8: 480b ldr r0, [pc, #44] @ (8025d28 <ipfrag_free_pbuf_custom+0x60>)
  93796. 8025cfa: f003 fe67 bl 80299cc <iprintf>
  93797. if (pcr->original != NULL) {
  93798. 8025cfe: 68fb ldr r3, [r7, #12]
  93799. 8025d00: 695b ldr r3, [r3, #20]
  93800. 8025d02: 2b00 cmp r3, #0
  93801. 8025d04: d004 beq.n 8025d10 <ipfrag_free_pbuf_custom+0x48>
  93802. pbuf_free(pcr->original);
  93803. 8025d06: 68fb ldr r3, [r7, #12]
  93804. 8025d08: 695b ldr r3, [r3, #20]
  93805. 8025d0a: 4618 mov r0, r3
  93806. 8025d0c: f7f4 fbe6 bl 801a4dc <pbuf_free>
  93807. }
  93808. ip_frag_free_pbuf_custom_ref(pcr);
  93809. 8025d10: 68f8 ldr r0, [r7, #12]
  93810. 8025d12: f7ff ffbd bl 8025c90 <ip_frag_free_pbuf_custom_ref>
  93811. }
  93812. 8025d16: bf00 nop
  93813. 8025d18: 3710 adds r7, #16
  93814. 8025d1a: 46bd mov sp, r7
  93815. 8025d1c: bd80 pop {r7, pc}
  93816. 8025d1e: bf00 nop
  93817. 8025d20: 0803066c .word 0x0803066c
  93818. 8025d24: 08030830 .word 0x08030830
  93819. 8025d28: 080306b4 .word 0x080306b4
  93820. 8025d2c: 0803083c .word 0x0803083c
  93821. 08025d30 <ip4_frag>:
  93822. *
  93823. * @return ERR_OK if sent successfully, err_t otherwise
  93824. */
  93825. err_t
  93826. ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest)
  93827. {
  93828. 8025d30: b580 push {r7, lr}
  93829. 8025d32: b094 sub sp, #80 @ 0x50
  93830. 8025d34: af02 add r7, sp, #8
  93831. 8025d36: 60f8 str r0, [r7, #12]
  93832. 8025d38: 60b9 str r1, [r7, #8]
  93833. 8025d3a: 607a str r2, [r7, #4]
  93834. struct pbuf *rambuf;
  93835. #if !LWIP_NETIF_TX_SINGLE_PBUF
  93836. struct pbuf *newpbuf;
  93837. u16_t newpbuflen = 0;
  93838. 8025d3c: 2300 movs r3, #0
  93839. 8025d3e: f8a7 3046 strh.w r3, [r7, #70] @ 0x46
  93840. u16_t left_to_copy;
  93841. #endif
  93842. struct ip_hdr *original_iphdr;
  93843. struct ip_hdr *iphdr;
  93844. const u16_t nfb = (u16_t)((netif->mtu - IP_HLEN) / 8);
  93845. 8025d42: 68bb ldr r3, [r7, #8]
  93846. 8025d44: 8d1b ldrh r3, [r3, #40] @ 0x28
  93847. 8025d46: 3b14 subs r3, #20
  93848. 8025d48: 2b00 cmp r3, #0
  93849. 8025d4a: da00 bge.n 8025d4e <ip4_frag+0x1e>
  93850. 8025d4c: 3307 adds r3, #7
  93851. 8025d4e: 10db asrs r3, r3, #3
  93852. 8025d50: 877b strh r3, [r7, #58] @ 0x3a
  93853. u16_t left, fragsize;
  93854. u16_t ofo;
  93855. int last;
  93856. u16_t poff = IP_HLEN;
  93857. 8025d52: 2314 movs r3, #20
  93858. 8025d54: 87fb strh r3, [r7, #62] @ 0x3e
  93859. u16_t tmp;
  93860. int mf_set;
  93861. original_iphdr = (struct ip_hdr *)p->payload;
  93862. 8025d56: 68fb ldr r3, [r7, #12]
  93863. 8025d58: 685b ldr r3, [r3, #4]
  93864. 8025d5a: 637b str r3, [r7, #52] @ 0x34
  93865. iphdr = original_iphdr;
  93866. 8025d5c: 6b7b ldr r3, [r7, #52] @ 0x34
  93867. 8025d5e: 633b str r3, [r7, #48] @ 0x30
  93868. if (IPH_HL_BYTES(iphdr) != IP_HLEN) {
  93869. 8025d60: 6b3b ldr r3, [r7, #48] @ 0x30
  93870. 8025d62: 781b ldrb r3, [r3, #0]
  93871. 8025d64: f003 030f and.w r3, r3, #15
  93872. 8025d68: b2db uxtb r3, r3
  93873. 8025d6a: 009b lsls r3, r3, #2
  93874. 8025d6c: b2db uxtb r3, r3
  93875. 8025d6e: 2b14 cmp r3, #20
  93876. 8025d70: d002 beq.n 8025d78 <ip4_frag+0x48>
  93877. /* ip4_frag() does not support IP options */
  93878. return ERR_VAL;
  93879. 8025d72: f06f 0305 mvn.w r3, #5
  93880. 8025d76: e110 b.n 8025f9a <ip4_frag+0x26a>
  93881. }
  93882. LWIP_ERROR("ip4_frag(): pbuf too short", p->len >= IP_HLEN, return ERR_VAL);
  93883. 8025d78: 68fb ldr r3, [r7, #12]
  93884. 8025d7a: 895b ldrh r3, [r3, #10]
  93885. 8025d7c: 2b13 cmp r3, #19
  93886. 8025d7e: d809 bhi.n 8025d94 <ip4_frag+0x64>
  93887. 8025d80: 4b88 ldr r3, [pc, #544] @ (8025fa4 <ip4_frag+0x274>)
  93888. 8025d82: f44f 723f mov.w r2, #764 @ 0x2fc
  93889. 8025d86: 4988 ldr r1, [pc, #544] @ (8025fa8 <ip4_frag+0x278>)
  93890. 8025d88: 4888 ldr r0, [pc, #544] @ (8025fac <ip4_frag+0x27c>)
  93891. 8025d8a: f003 fe1f bl 80299cc <iprintf>
  93892. 8025d8e: f06f 0305 mvn.w r3, #5
  93893. 8025d92: e102 b.n 8025f9a <ip4_frag+0x26a>
  93894. /* Save original offset */
  93895. tmp = lwip_ntohs(IPH_OFFSET(iphdr));
  93896. 8025d94: 6b3b ldr r3, [r7, #48] @ 0x30
  93897. 8025d96: 88db ldrh r3, [r3, #6]
  93898. 8025d98: b29b uxth r3, r3
  93899. 8025d9a: 4618 mov r0, r3
  93900. 8025d9c: f7f2 febc bl 8018b18 <lwip_htons>
  93901. 8025da0: 4603 mov r3, r0
  93902. 8025da2: 87bb strh r3, [r7, #60] @ 0x3c
  93903. ofo = tmp & IP_OFFMASK;
  93904. 8025da4: 8fbb ldrh r3, [r7, #60] @ 0x3c
  93905. 8025da6: f3c3 030c ubfx r3, r3, #0, #13
  93906. 8025daa: f8a7 3040 strh.w r3, [r7, #64] @ 0x40
  93907. /* already fragmented? if so, the last fragment we create must have MF, too */
  93908. mf_set = tmp & IP_MF;
  93909. 8025dae: 8fbb ldrh r3, [r7, #60] @ 0x3c
  93910. 8025db0: f403 5300 and.w r3, r3, #8192 @ 0x2000
  93911. 8025db4: 62fb str r3, [r7, #44] @ 0x2c
  93912. left = (u16_t)(p->tot_len - IP_HLEN);
  93913. 8025db6: 68fb ldr r3, [r7, #12]
  93914. 8025db8: 891b ldrh r3, [r3, #8]
  93915. 8025dba: 3b14 subs r3, #20
  93916. 8025dbc: f8a7 3042 strh.w r3, [r7, #66] @ 0x42
  93917. while (left) {
  93918. 8025dc0: e0e1 b.n 8025f86 <ip4_frag+0x256>
  93919. /* Fill this fragment */
  93920. fragsize = LWIP_MIN(left, (u16_t)(nfb * 8));
  93921. 8025dc2: 8f7b ldrh r3, [r7, #58] @ 0x3a
  93922. 8025dc4: 00db lsls r3, r3, #3
  93923. 8025dc6: b29b uxth r3, r3
  93924. 8025dc8: f8b7 2042 ldrh.w r2, [r7, #66] @ 0x42
  93925. 8025dcc: 4293 cmp r3, r2
  93926. 8025dce: bf28 it cs
  93927. 8025dd0: 4613 movcs r3, r2
  93928. 8025dd2: 857b strh r3, [r7, #42] @ 0x2a
  93929. /* When not using a static buffer, create a chain of pbufs.
  93930. * The first will be a PBUF_RAM holding the link and IP header.
  93931. * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged,
  93932. * but limited to the size of an mtu.
  93933. */
  93934. rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM);
  93935. 8025dd4: f44f 7220 mov.w r2, #640 @ 0x280
  93936. 8025dd8: 2114 movs r1, #20
  93937. 8025dda: 200e movs r0, #14
  93938. 8025ddc: f7f4 f868 bl 8019eb0 <pbuf_alloc>
  93939. 8025de0: 6278 str r0, [r7, #36] @ 0x24
  93940. if (rambuf == NULL) {
  93941. 8025de2: 6a7b ldr r3, [r7, #36] @ 0x24
  93942. 8025de4: 2b00 cmp r3, #0
  93943. 8025de6: f000 80d5 beq.w 8025f94 <ip4_frag+0x264>
  93944. goto memerr;
  93945. }
  93946. LWIP_ASSERT("this needs a pbuf in one piece!",
  93947. 8025dea: 6a7b ldr r3, [r7, #36] @ 0x24
  93948. 8025dec: 895b ldrh r3, [r3, #10]
  93949. 8025dee: 2b13 cmp r3, #19
  93950. 8025df0: d806 bhi.n 8025e00 <ip4_frag+0xd0>
  93951. 8025df2: 4b6c ldr r3, [pc, #432] @ (8025fa4 <ip4_frag+0x274>)
  93952. 8025df4: f44f 7249 mov.w r2, #804 @ 0x324
  93953. 8025df8: 496d ldr r1, [pc, #436] @ (8025fb0 <ip4_frag+0x280>)
  93954. 8025dfa: 486c ldr r0, [pc, #432] @ (8025fac <ip4_frag+0x27c>)
  93955. 8025dfc: f003 fde6 bl 80299cc <iprintf>
  93956. (rambuf->len >= (IP_HLEN)));
  93957. SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN);
  93958. 8025e00: 6a7b ldr r3, [r7, #36] @ 0x24
  93959. 8025e02: 685b ldr r3, [r3, #4]
  93960. 8025e04: 2214 movs r2, #20
  93961. 8025e06: 6b79 ldr r1, [r7, #52] @ 0x34
  93962. 8025e08: 4618 mov r0, r3
  93963. 8025e0a: f004 f868 bl 8029ede <memcpy>
  93964. iphdr = (struct ip_hdr *)rambuf->payload;
  93965. 8025e0e: 6a7b ldr r3, [r7, #36] @ 0x24
  93966. 8025e10: 685b ldr r3, [r3, #4]
  93967. 8025e12: 633b str r3, [r7, #48] @ 0x30
  93968. left_to_copy = fragsize;
  93969. 8025e14: 8d7b ldrh r3, [r7, #42] @ 0x2a
  93970. 8025e16: f8a7 3044 strh.w r3, [r7, #68] @ 0x44
  93971. while (left_to_copy) {
  93972. 8025e1a: e064 b.n 8025ee6 <ip4_frag+0x1b6>
  93973. struct pbuf_custom_ref *pcr;
  93974. u16_t plen = (u16_t)(p->len - poff);
  93975. 8025e1c: 68fb ldr r3, [r7, #12]
  93976. 8025e1e: 895a ldrh r2, [r3, #10]
  93977. 8025e20: 8ffb ldrh r3, [r7, #62] @ 0x3e
  93978. 8025e22: 1ad3 subs r3, r2, r3
  93979. 8025e24: 83fb strh r3, [r7, #30]
  93980. LWIP_ASSERT("p->len >= poff", p->len >= poff);
  93981. 8025e26: 68fb ldr r3, [r7, #12]
  93982. 8025e28: 895b ldrh r3, [r3, #10]
  93983. 8025e2a: 8ffa ldrh r2, [r7, #62] @ 0x3e
  93984. 8025e2c: 429a cmp r2, r3
  93985. 8025e2e: d906 bls.n 8025e3e <ip4_frag+0x10e>
  93986. 8025e30: 4b5c ldr r3, [pc, #368] @ (8025fa4 <ip4_frag+0x274>)
  93987. 8025e32: f240 322d movw r2, #813 @ 0x32d
  93988. 8025e36: 495f ldr r1, [pc, #380] @ (8025fb4 <ip4_frag+0x284>)
  93989. 8025e38: 485c ldr r0, [pc, #368] @ (8025fac <ip4_frag+0x27c>)
  93990. 8025e3a: f003 fdc7 bl 80299cc <iprintf>
  93991. newpbuflen = LWIP_MIN(left_to_copy, plen);
  93992. 8025e3e: 8bfa ldrh r2, [r7, #30]
  93993. 8025e40: f8b7 3044 ldrh.w r3, [r7, #68] @ 0x44
  93994. 8025e44: 4293 cmp r3, r2
  93995. 8025e46: bf28 it cs
  93996. 8025e48: 4613 movcs r3, r2
  93997. 8025e4a: f8a7 3046 strh.w r3, [r7, #70] @ 0x46
  93998. /* Is this pbuf already empty? */
  93999. if (!newpbuflen) {
  94000. 8025e4e: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  94001. 8025e52: 2b00 cmp r3, #0
  94002. 8025e54: d105 bne.n 8025e62 <ip4_frag+0x132>
  94003. poff = 0;
  94004. 8025e56: 2300 movs r3, #0
  94005. 8025e58: 87fb strh r3, [r7, #62] @ 0x3e
  94006. p = p->next;
  94007. 8025e5a: 68fb ldr r3, [r7, #12]
  94008. 8025e5c: 681b ldr r3, [r3, #0]
  94009. 8025e5e: 60fb str r3, [r7, #12]
  94010. continue;
  94011. 8025e60: e041 b.n 8025ee6 <ip4_frag+0x1b6>
  94012. }
  94013. pcr = ip_frag_alloc_pbuf_custom_ref();
  94014. 8025e62: f7ff ff0d bl 8025c80 <ip_frag_alloc_pbuf_custom_ref>
  94015. 8025e66: 61b8 str r0, [r7, #24]
  94016. if (pcr == NULL) {
  94017. 8025e68: 69bb ldr r3, [r7, #24]
  94018. 8025e6a: 2b00 cmp r3, #0
  94019. 8025e6c: d103 bne.n 8025e76 <ip4_frag+0x146>
  94020. pbuf_free(rambuf);
  94021. 8025e6e: 6a78 ldr r0, [r7, #36] @ 0x24
  94022. 8025e70: f7f4 fb34 bl 801a4dc <pbuf_free>
  94023. goto memerr;
  94024. 8025e74: e08f b.n 8025f96 <ip4_frag+0x266>
  94025. }
  94026. /* Mirror this pbuf, although we might not need all of it. */
  94027. newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc,
  94028. 8025e76: 69b8 ldr r0, [r7, #24]
  94029. (u8_t *)p->payload + poff, newpbuflen);
  94030. 8025e78: 68fb ldr r3, [r7, #12]
  94031. 8025e7a: 685a ldr r2, [r3, #4]
  94032. newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc,
  94033. 8025e7c: 8ffb ldrh r3, [r7, #62] @ 0x3e
  94034. 8025e7e: 4413 add r3, r2
  94035. 8025e80: f8b7 1046 ldrh.w r1, [r7, #70] @ 0x46
  94036. 8025e84: f8b7 2046 ldrh.w r2, [r7, #70] @ 0x46
  94037. 8025e88: 9201 str r2, [sp, #4]
  94038. 8025e8a: 9300 str r3, [sp, #0]
  94039. 8025e8c: 4603 mov r3, r0
  94040. 8025e8e: 2241 movs r2, #65 @ 0x41
  94041. 8025e90: 2000 movs r0, #0
  94042. 8025e92: f7f4 f939 bl 801a108 <pbuf_alloced_custom>
  94043. 8025e96: 6178 str r0, [r7, #20]
  94044. if (newpbuf == NULL) {
  94045. 8025e98: 697b ldr r3, [r7, #20]
  94046. 8025e9a: 2b00 cmp r3, #0
  94047. 8025e9c: d106 bne.n 8025eac <ip4_frag+0x17c>
  94048. ip_frag_free_pbuf_custom_ref(pcr);
  94049. 8025e9e: 69b8 ldr r0, [r7, #24]
  94050. 8025ea0: f7ff fef6 bl 8025c90 <ip_frag_free_pbuf_custom_ref>
  94051. pbuf_free(rambuf);
  94052. 8025ea4: 6a78 ldr r0, [r7, #36] @ 0x24
  94053. 8025ea6: f7f4 fb19 bl 801a4dc <pbuf_free>
  94054. goto memerr;
  94055. 8025eaa: e074 b.n 8025f96 <ip4_frag+0x266>
  94056. }
  94057. pbuf_ref(p);
  94058. 8025eac: 68f8 ldr r0, [r7, #12]
  94059. 8025eae: f7f4 fbbb bl 801a628 <pbuf_ref>
  94060. pcr->original = p;
  94061. 8025eb2: 69bb ldr r3, [r7, #24]
  94062. 8025eb4: 68fa ldr r2, [r7, #12]
  94063. 8025eb6: 615a str r2, [r3, #20]
  94064. pcr->pc.custom_free_function = ipfrag_free_pbuf_custom;
  94065. 8025eb8: 69bb ldr r3, [r7, #24]
  94066. 8025eba: 4a3f ldr r2, [pc, #252] @ (8025fb8 <ip4_frag+0x288>)
  94067. 8025ebc: 611a str r2, [r3, #16]
  94068. /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain
  94069. * so that it is removed when pbuf_dechain is later called on rambuf.
  94070. */
  94071. pbuf_cat(rambuf, newpbuf);
  94072. 8025ebe: 6979 ldr r1, [r7, #20]
  94073. 8025ec0: 6a78 ldr r0, [r7, #36] @ 0x24
  94074. 8025ec2: f7f4 fbd9 bl 801a678 <pbuf_cat>
  94075. left_to_copy = (u16_t)(left_to_copy - newpbuflen);
  94076. 8025ec6: f8b7 2044 ldrh.w r2, [r7, #68] @ 0x44
  94077. 8025eca: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  94078. 8025ece: 1ad3 subs r3, r2, r3
  94079. 8025ed0: f8a7 3044 strh.w r3, [r7, #68] @ 0x44
  94080. if (left_to_copy) {
  94081. 8025ed4: f8b7 3044 ldrh.w r3, [r7, #68] @ 0x44
  94082. 8025ed8: 2b00 cmp r3, #0
  94083. 8025eda: d004 beq.n 8025ee6 <ip4_frag+0x1b6>
  94084. poff = 0;
  94085. 8025edc: 2300 movs r3, #0
  94086. 8025ede: 87fb strh r3, [r7, #62] @ 0x3e
  94087. p = p->next;
  94088. 8025ee0: 68fb ldr r3, [r7, #12]
  94089. 8025ee2: 681b ldr r3, [r3, #0]
  94090. 8025ee4: 60fb str r3, [r7, #12]
  94091. while (left_to_copy) {
  94092. 8025ee6: f8b7 3044 ldrh.w r3, [r7, #68] @ 0x44
  94093. 8025eea: 2b00 cmp r3, #0
  94094. 8025eec: d196 bne.n 8025e1c <ip4_frag+0xec>
  94095. }
  94096. }
  94097. poff = (u16_t)(poff + newpbuflen);
  94098. 8025eee: 8ffa ldrh r2, [r7, #62] @ 0x3e
  94099. 8025ef0: f8b7 3046 ldrh.w r3, [r7, #70] @ 0x46
  94100. 8025ef4: 4413 add r3, r2
  94101. 8025ef6: 87fb strh r3, [r7, #62] @ 0x3e
  94102. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  94103. /* Correct header */
  94104. last = (left <= netif->mtu - IP_HLEN);
  94105. 8025ef8: 68bb ldr r3, [r7, #8]
  94106. 8025efa: 8d1b ldrh r3, [r3, #40] @ 0x28
  94107. 8025efc: f1a3 0213 sub.w r2, r3, #19
  94108. 8025f00: f8b7 3042 ldrh.w r3, [r7, #66] @ 0x42
  94109. 8025f04: 429a cmp r2, r3
  94110. 8025f06: bfcc ite gt
  94111. 8025f08: 2301 movgt r3, #1
  94112. 8025f0a: 2300 movle r3, #0
  94113. 8025f0c: b2db uxtb r3, r3
  94114. 8025f0e: 623b str r3, [r7, #32]
  94115. /* Set new offset and MF flag */
  94116. tmp = (IP_OFFMASK & (ofo));
  94117. 8025f10: f8b7 3040 ldrh.w r3, [r7, #64] @ 0x40
  94118. 8025f14: f3c3 030c ubfx r3, r3, #0, #13
  94119. 8025f18: 87bb strh r3, [r7, #60] @ 0x3c
  94120. if (!last || mf_set) {
  94121. 8025f1a: 6a3b ldr r3, [r7, #32]
  94122. 8025f1c: 2b00 cmp r3, #0
  94123. 8025f1e: d002 beq.n 8025f26 <ip4_frag+0x1f6>
  94124. 8025f20: 6afb ldr r3, [r7, #44] @ 0x2c
  94125. 8025f22: 2b00 cmp r3, #0
  94126. 8025f24: d003 beq.n 8025f2e <ip4_frag+0x1fe>
  94127. /* the last fragment has MF set if the input frame had it */
  94128. tmp = tmp | IP_MF;
  94129. 8025f26: 8fbb ldrh r3, [r7, #60] @ 0x3c
  94130. 8025f28: f443 5300 orr.w r3, r3, #8192 @ 0x2000
  94131. 8025f2c: 87bb strh r3, [r7, #60] @ 0x3c
  94132. }
  94133. IPH_OFFSET_SET(iphdr, lwip_htons(tmp));
  94134. 8025f2e: 8fbb ldrh r3, [r7, #60] @ 0x3c
  94135. 8025f30: 4618 mov r0, r3
  94136. 8025f32: f7f2 fdf1 bl 8018b18 <lwip_htons>
  94137. 8025f36: 4603 mov r3, r0
  94138. 8025f38: 461a mov r2, r3
  94139. 8025f3a: 6b3b ldr r3, [r7, #48] @ 0x30
  94140. 8025f3c: 80da strh r2, [r3, #6]
  94141. IPH_LEN_SET(iphdr, lwip_htons((u16_t)(fragsize + IP_HLEN)));
  94142. 8025f3e: 8d7b ldrh r3, [r7, #42] @ 0x2a
  94143. 8025f40: 3314 adds r3, #20
  94144. 8025f42: b29b uxth r3, r3
  94145. 8025f44: 4618 mov r0, r3
  94146. 8025f46: f7f2 fde7 bl 8018b18 <lwip_htons>
  94147. 8025f4a: 4603 mov r3, r0
  94148. 8025f4c: 461a mov r2, r3
  94149. 8025f4e: 6b3b ldr r3, [r7, #48] @ 0x30
  94150. 8025f50: 805a strh r2, [r3, #2]
  94151. IPH_CHKSUM_SET(iphdr, 0);
  94152. 8025f52: 6b3b ldr r3, [r7, #48] @ 0x30
  94153. 8025f54: 2200 movs r2, #0
  94154. 8025f56: 729a strb r2, [r3, #10]
  94155. 8025f58: 2200 movs r2, #0
  94156. 8025f5a: 72da strb r2, [r3, #11]
  94157. #endif /* CHECKSUM_GEN_IP */
  94158. /* No need for separate header pbuf - we allowed room for it in rambuf
  94159. * when allocated.
  94160. */
  94161. netif->output(netif, rambuf, dest);
  94162. 8025f5c: 68bb ldr r3, [r7, #8]
  94163. 8025f5e: 695b ldr r3, [r3, #20]
  94164. 8025f60: 687a ldr r2, [r7, #4]
  94165. 8025f62: 6a79 ldr r1, [r7, #36] @ 0x24
  94166. 8025f64: 68b8 ldr r0, [r7, #8]
  94167. 8025f66: 4798 blx r3
  94168. * recreate it next time round the loop. If we're lucky the hardware
  94169. * will have already sent the packet, the free will really free, and
  94170. * there will be zero memory penalty.
  94171. */
  94172. pbuf_free(rambuf);
  94173. 8025f68: 6a78 ldr r0, [r7, #36] @ 0x24
  94174. 8025f6a: f7f4 fab7 bl 801a4dc <pbuf_free>
  94175. left = (u16_t)(left - fragsize);
  94176. 8025f6e: f8b7 2042 ldrh.w r2, [r7, #66] @ 0x42
  94177. 8025f72: 8d7b ldrh r3, [r7, #42] @ 0x2a
  94178. 8025f74: 1ad3 subs r3, r2, r3
  94179. 8025f76: f8a7 3042 strh.w r3, [r7, #66] @ 0x42
  94180. ofo = (u16_t)(ofo + nfb);
  94181. 8025f7a: f8b7 2040 ldrh.w r2, [r7, #64] @ 0x40
  94182. 8025f7e: 8f7b ldrh r3, [r7, #58] @ 0x3a
  94183. 8025f80: 4413 add r3, r2
  94184. 8025f82: f8a7 3040 strh.w r3, [r7, #64] @ 0x40
  94185. while (left) {
  94186. 8025f86: f8b7 3042 ldrh.w r3, [r7, #66] @ 0x42
  94187. 8025f8a: 2b00 cmp r3, #0
  94188. 8025f8c: f47f af19 bne.w 8025dc2 <ip4_frag+0x92>
  94189. }
  94190. MIB2_STATS_INC(mib2.ipfragoks);
  94191. return ERR_OK;
  94192. 8025f90: 2300 movs r3, #0
  94193. 8025f92: e002 b.n 8025f9a <ip4_frag+0x26a>
  94194. goto memerr;
  94195. 8025f94: bf00 nop
  94196. memerr:
  94197. MIB2_STATS_INC(mib2.ipfragfails);
  94198. return ERR_MEM;
  94199. 8025f96: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  94200. }
  94201. 8025f9a: 4618 mov r0, r3
  94202. 8025f9c: 3748 adds r7, #72 @ 0x48
  94203. 8025f9e: 46bd mov sp, r7
  94204. 8025fa0: bd80 pop {r7, pc}
  94205. 8025fa2: bf00 nop
  94206. 8025fa4: 0803066c .word 0x0803066c
  94207. 8025fa8: 08030848 .word 0x08030848
  94208. 8025fac: 080306b4 .word 0x080306b4
  94209. 8025fb0: 08030864 .word 0x08030864
  94210. 8025fb4: 08030884 .word 0x08030884
  94211. 8025fb8: 08025cc9 .word 0x08025cc9
  94212. 08025fbc <ethernet_input>:
  94213. * @see ETHARP_SUPPORT_VLAN
  94214. * @see LWIP_HOOK_VLAN_CHECK
  94215. */
  94216. err_t
  94217. ethernet_input(struct pbuf *p, struct netif *netif)
  94218. {
  94219. 8025fbc: b580 push {r7, lr}
  94220. 8025fbe: b086 sub sp, #24
  94221. 8025fc0: af00 add r7, sp, #0
  94222. 8025fc2: 6078 str r0, [r7, #4]
  94223. 8025fc4: 6039 str r1, [r7, #0]
  94224. struct eth_hdr *ethhdr;
  94225. u16_t type;
  94226. #if LWIP_ARP || ETHARP_SUPPORT_VLAN || LWIP_IPV6
  94227. u16_t next_hdr_offset = SIZEOF_ETH_HDR;
  94228. 8025fc6: 230e movs r3, #14
  94229. 8025fc8: 82fb strh r3, [r7, #22]
  94230. #endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
  94231. LWIP_ASSERT_CORE_LOCKED();
  94232. 8025fca: f7ea fab1 bl 8010530 <sys_check_core_locking>
  94233. if (p->len <= SIZEOF_ETH_HDR) {
  94234. 8025fce: 687b ldr r3, [r7, #4]
  94235. 8025fd0: 895b ldrh r3, [r3, #10]
  94236. 8025fd2: 2b0e cmp r3, #14
  94237. 8025fd4: d96e bls.n 80260b4 <ethernet_input+0xf8>
  94238. ETHARP_STATS_INC(etharp.drop);
  94239. MIB2_STATS_NETIF_INC(netif, ifinerrors);
  94240. goto free_and_return;
  94241. }
  94242. if (p->if_idx == NETIF_NO_INDEX) {
  94243. 8025fd6: 687b ldr r3, [r7, #4]
  94244. 8025fd8: 7bdb ldrb r3, [r3, #15]
  94245. 8025fda: 2b00 cmp r3, #0
  94246. 8025fdc: d106 bne.n 8025fec <ethernet_input+0x30>
  94247. p->if_idx = netif_get_index(netif);
  94248. 8025fde: 683b ldr r3, [r7, #0]
  94249. 8025fe0: f893 3034 ldrb.w r3, [r3, #52] @ 0x34
  94250. 8025fe4: 3301 adds r3, #1
  94251. 8025fe6: b2da uxtb r2, r3
  94252. 8025fe8: 687b ldr r3, [r7, #4]
  94253. 8025fea: 73da strb r2, [r3, #15]
  94254. }
  94255. /* points to packet payload, which starts with an Ethernet header */
  94256. ethhdr = (struct eth_hdr *)p->payload;
  94257. 8025fec: 687b ldr r3, [r7, #4]
  94258. 8025fee: 685b ldr r3, [r3, #4]
  94259. 8025ff0: 613b str r3, [r7, #16]
  94260. (unsigned char)ethhdr->dest.addr[3], (unsigned char)ethhdr->dest.addr[4], (unsigned char)ethhdr->dest.addr[5],
  94261. (unsigned char)ethhdr->src.addr[0], (unsigned char)ethhdr->src.addr[1], (unsigned char)ethhdr->src.addr[2],
  94262. (unsigned char)ethhdr->src.addr[3], (unsigned char)ethhdr->src.addr[4], (unsigned char)ethhdr->src.addr[5],
  94263. lwip_htons(ethhdr->type)));
  94264. type = ethhdr->type;
  94265. 8025ff2: 693b ldr r3, [r7, #16]
  94266. 8025ff4: 7b1a ldrb r2, [r3, #12]
  94267. 8025ff6: 7b5b ldrb r3, [r3, #13]
  94268. 8025ff8: 021b lsls r3, r3, #8
  94269. 8025ffa: 4313 orrs r3, r2
  94270. 8025ffc: 81fb strh r3, [r7, #14]
  94271. #if LWIP_ARP_FILTER_NETIF
  94272. netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, lwip_htons(type));
  94273. #endif /* LWIP_ARP_FILTER_NETIF*/
  94274. if (ethhdr->dest.addr[0] & 1) {
  94275. 8025ffe: 693b ldr r3, [r7, #16]
  94276. 8026000: 781b ldrb r3, [r3, #0]
  94277. 8026002: f003 0301 and.w r3, r3, #1
  94278. 8026006: 2b00 cmp r3, #0
  94279. 8026008: d023 beq.n 8026052 <ethernet_input+0x96>
  94280. /* this might be a multicast or broadcast packet */
  94281. if (ethhdr->dest.addr[0] == LL_IP4_MULTICAST_ADDR_0) {
  94282. 802600a: 693b ldr r3, [r7, #16]
  94283. 802600c: 781b ldrb r3, [r3, #0]
  94284. 802600e: 2b01 cmp r3, #1
  94285. 8026010: d10f bne.n 8026032 <ethernet_input+0x76>
  94286. #if LWIP_IPV4
  94287. if ((ethhdr->dest.addr[1] == LL_IP4_MULTICAST_ADDR_1) &&
  94288. 8026012: 693b ldr r3, [r7, #16]
  94289. 8026014: 785b ldrb r3, [r3, #1]
  94290. 8026016: 2b00 cmp r3, #0
  94291. 8026018: d11b bne.n 8026052 <ethernet_input+0x96>
  94292. (ethhdr->dest.addr[2] == LL_IP4_MULTICAST_ADDR_2)) {
  94293. 802601a: 693b ldr r3, [r7, #16]
  94294. 802601c: 789b ldrb r3, [r3, #2]
  94295. if ((ethhdr->dest.addr[1] == LL_IP4_MULTICAST_ADDR_1) &&
  94296. 802601e: 2b5e cmp r3, #94 @ 0x5e
  94297. 8026020: d117 bne.n 8026052 <ethernet_input+0x96>
  94298. /* mark the pbuf as link-layer multicast */
  94299. p->flags |= PBUF_FLAG_LLMCAST;
  94300. 8026022: 687b ldr r3, [r7, #4]
  94301. 8026024: 7b5b ldrb r3, [r3, #13]
  94302. 8026026: f043 0310 orr.w r3, r3, #16
  94303. 802602a: b2da uxtb r2, r3
  94304. 802602c: 687b ldr r3, [r7, #4]
  94305. 802602e: 735a strb r2, [r3, #13]
  94306. 8026030: e00f b.n 8026052 <ethernet_input+0x96>
  94307. (ethhdr->dest.addr[1] == LL_IP6_MULTICAST_ADDR_1)) {
  94308. /* mark the pbuf as link-layer multicast */
  94309. p->flags |= PBUF_FLAG_LLMCAST;
  94310. }
  94311. #endif /* LWIP_IPV6 */
  94312. else if (eth_addr_cmp(&ethhdr->dest, &ethbroadcast)) {
  94313. 8026032: 693b ldr r3, [r7, #16]
  94314. 8026034: 2206 movs r2, #6
  94315. 8026036: 4928 ldr r1, [pc, #160] @ (80260d8 <ethernet_input+0x11c>)
  94316. 8026038: 4618 mov r0, r3
  94317. 802603a: f003 fe2f bl 8029c9c <memcmp>
  94318. 802603e: 4603 mov r3, r0
  94319. 8026040: 2b00 cmp r3, #0
  94320. 8026042: d106 bne.n 8026052 <ethernet_input+0x96>
  94321. /* mark the pbuf as link-layer broadcast */
  94322. p->flags |= PBUF_FLAG_LLBCAST;
  94323. 8026044: 687b ldr r3, [r7, #4]
  94324. 8026046: 7b5b ldrb r3, [r3, #13]
  94325. 8026048: f043 0308 orr.w r3, r3, #8
  94326. 802604c: b2da uxtb r2, r3
  94327. 802604e: 687b ldr r3, [r7, #4]
  94328. 8026050: 735a strb r2, [r3, #13]
  94329. }
  94330. }
  94331. switch (type) {
  94332. 8026052: 89fb ldrh r3, [r7, #14]
  94333. 8026054: 2b08 cmp r3, #8
  94334. 8026056: d003 beq.n 8026060 <ethernet_input+0xa4>
  94335. 8026058: f5b3 6fc1 cmp.w r3, #1544 @ 0x608
  94336. 802605c: d014 beq.n 8026088 <ethernet_input+0xcc>
  94337. }
  94338. #endif
  94339. ETHARP_STATS_INC(etharp.proterr);
  94340. ETHARP_STATS_INC(etharp.drop);
  94341. MIB2_STATS_NETIF_INC(netif, ifinunknownprotos);
  94342. goto free_and_return;
  94343. 802605e: e032 b.n 80260c6 <ethernet_input+0x10a>
  94344. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  94345. 8026060: 683b ldr r3, [r7, #0]
  94346. 8026062: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  94347. 8026066: f003 0308 and.w r3, r3, #8
  94348. 802606a: 2b00 cmp r3, #0
  94349. 802606c: d024 beq.n 80260b8 <ethernet_input+0xfc>
  94350. if (pbuf_remove_header(p, next_hdr_offset)) {
  94351. 802606e: 8afb ldrh r3, [r7, #22]
  94352. 8026070: 4619 mov r1, r3
  94353. 8026072: 6878 ldr r0, [r7, #4]
  94354. 8026074: f7f4 f97a bl 801a36c <pbuf_remove_header>
  94355. 8026078: 4603 mov r3, r0
  94356. 802607a: 2b00 cmp r3, #0
  94357. 802607c: d11e bne.n 80260bc <ethernet_input+0x100>
  94358. ip4_input(p, netif);
  94359. 802607e: 6839 ldr r1, [r7, #0]
  94360. 8026080: 6878 ldr r0, [r7, #4]
  94361. 8026082: f7fe fd2f bl 8024ae4 <ip4_input>
  94362. break;
  94363. 8026086: e013 b.n 80260b0 <ethernet_input+0xf4>
  94364. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  94365. 8026088: 683b ldr r3, [r7, #0]
  94366. 802608a: f893 3031 ldrb.w r3, [r3, #49] @ 0x31
  94367. 802608e: f003 0308 and.w r3, r3, #8
  94368. 8026092: 2b00 cmp r3, #0
  94369. 8026094: d014 beq.n 80260c0 <ethernet_input+0x104>
  94370. if (pbuf_remove_header(p, next_hdr_offset)) {
  94371. 8026096: 8afb ldrh r3, [r7, #22]
  94372. 8026098: 4619 mov r1, r3
  94373. 802609a: 6878 ldr r0, [r7, #4]
  94374. 802609c: f7f4 f966 bl 801a36c <pbuf_remove_header>
  94375. 80260a0: 4603 mov r3, r0
  94376. 80260a2: 2b00 cmp r3, #0
  94377. 80260a4: d10e bne.n 80260c4 <ethernet_input+0x108>
  94378. etharp_input(p, netif);
  94379. 80260a6: 6839 ldr r1, [r7, #0]
  94380. 80260a8: 6878 ldr r0, [r7, #4]
  94381. 80260aa: f7fd fe9d bl 8023de8 <etharp_input>
  94382. break;
  94383. 80260ae: bf00 nop
  94384. }
  94385. /* This means the pbuf is freed or consumed,
  94386. so the caller doesn't have to free it again */
  94387. return ERR_OK;
  94388. 80260b0: 2300 movs r3, #0
  94389. 80260b2: e00c b.n 80260ce <ethernet_input+0x112>
  94390. goto free_and_return;
  94391. 80260b4: bf00 nop
  94392. 80260b6: e006 b.n 80260c6 <ethernet_input+0x10a>
  94393. goto free_and_return;
  94394. 80260b8: bf00 nop
  94395. 80260ba: e004 b.n 80260c6 <ethernet_input+0x10a>
  94396. goto free_and_return;
  94397. 80260bc: bf00 nop
  94398. 80260be: e002 b.n 80260c6 <ethernet_input+0x10a>
  94399. goto free_and_return;
  94400. 80260c0: bf00 nop
  94401. 80260c2: e000 b.n 80260c6 <ethernet_input+0x10a>
  94402. goto free_and_return;
  94403. 80260c4: bf00 nop
  94404. free_and_return:
  94405. pbuf_free(p);
  94406. 80260c6: 6878 ldr r0, [r7, #4]
  94407. 80260c8: f7f4 fa08 bl 801a4dc <pbuf_free>
  94408. return ERR_OK;
  94409. 80260cc: 2300 movs r3, #0
  94410. }
  94411. 80260ce: 4618 mov r0, r3
  94412. 80260d0: 3718 adds r7, #24
  94413. 80260d2: 46bd mov sp, r7
  94414. 80260d4: bd80 pop {r7, pc}
  94415. 80260d6: bf00 nop
  94416. 80260d8: 08030c18 .word 0x08030c18
  94417. 080260dc <ethernet_output>:
  94418. * @return ERR_OK if the packet was sent, any other err_t on failure
  94419. */
  94420. err_t
  94421. ethernet_output(struct netif * netif, struct pbuf * p,
  94422. const struct eth_addr * src, const struct eth_addr * dst,
  94423. u16_t eth_type) {
  94424. 80260dc: b580 push {r7, lr}
  94425. 80260de: b086 sub sp, #24
  94426. 80260e0: af00 add r7, sp, #0
  94427. 80260e2: 60f8 str r0, [r7, #12]
  94428. 80260e4: 60b9 str r1, [r7, #8]
  94429. 80260e6: 607a str r2, [r7, #4]
  94430. 80260e8: 603b str r3, [r7, #0]
  94431. struct eth_hdr *ethhdr;
  94432. u16_t eth_type_be = lwip_htons(eth_type);
  94433. 80260ea: 8c3b ldrh r3, [r7, #32]
  94434. 80260ec: 4618 mov r0, r3
  94435. 80260ee: f7f2 fd13 bl 8018b18 <lwip_htons>
  94436. 80260f2: 4603 mov r3, r0
  94437. 80260f4: 82fb strh r3, [r7, #22]
  94438. eth_type_be = PP_HTONS(ETHTYPE_VLAN);
  94439. } else
  94440. #endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
  94441. {
  94442. if (pbuf_add_header(p, SIZEOF_ETH_HDR) != 0) {
  94443. 80260f6: 210e movs r1, #14
  94444. 80260f8: 68b8 ldr r0, [r7, #8]
  94445. 80260fa: f7f4 f927 bl 801a34c <pbuf_add_header>
  94446. 80260fe: 4603 mov r3, r0
  94447. 8026100: 2b00 cmp r3, #0
  94448. 8026102: d127 bne.n 8026154 <ethernet_output+0x78>
  94449. goto pbuf_header_failed;
  94450. }
  94451. }
  94452. LWIP_ASSERT_CORE_LOCKED();
  94453. 8026104: f7ea fa14 bl 8010530 <sys_check_core_locking>
  94454. ethhdr = (struct eth_hdr *)p->payload;
  94455. 8026108: 68bb ldr r3, [r7, #8]
  94456. 802610a: 685b ldr r3, [r3, #4]
  94457. 802610c: 613b str r3, [r7, #16]
  94458. ethhdr->type = eth_type_be;
  94459. 802610e: 693b ldr r3, [r7, #16]
  94460. 8026110: 8afa ldrh r2, [r7, #22]
  94461. 8026112: 819a strh r2, [r3, #12]
  94462. SMEMCPY(&ethhdr->dest, dst, ETH_HWADDR_LEN);
  94463. 8026114: 693b ldr r3, [r7, #16]
  94464. 8026116: 2206 movs r2, #6
  94465. 8026118: 6839 ldr r1, [r7, #0]
  94466. 802611a: 4618 mov r0, r3
  94467. 802611c: f003 fedf bl 8029ede <memcpy>
  94468. SMEMCPY(&ethhdr->src, src, ETH_HWADDR_LEN);
  94469. 8026120: 693b ldr r3, [r7, #16]
  94470. 8026122: 3306 adds r3, #6
  94471. 8026124: 2206 movs r2, #6
  94472. 8026126: 6879 ldr r1, [r7, #4]
  94473. 8026128: 4618 mov r0, r3
  94474. 802612a: f003 fed8 bl 8029ede <memcpy>
  94475. LWIP_ASSERT("netif->hwaddr_len must be 6 for ethernet_output!",
  94476. 802612e: 68fb ldr r3, [r7, #12]
  94477. 8026130: f893 3030 ldrb.w r3, [r3, #48] @ 0x30
  94478. 8026134: 2b06 cmp r3, #6
  94479. 8026136: d006 beq.n 8026146 <ethernet_output+0x6a>
  94480. 8026138: 4b0a ldr r3, [pc, #40] @ (8026164 <ethernet_output+0x88>)
  94481. 802613a: f44f 7299 mov.w r2, #306 @ 0x132
  94482. 802613e: 490a ldr r1, [pc, #40] @ (8026168 <ethernet_output+0x8c>)
  94483. 8026140: 480a ldr r0, [pc, #40] @ (802616c <ethernet_output+0x90>)
  94484. 8026142: f003 fc43 bl 80299cc <iprintf>
  94485. (netif->hwaddr_len == ETH_HWADDR_LEN));
  94486. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE,
  94487. ("ethernet_output: sending packet %p\n", (void *)p));
  94488. /* send the packet */
  94489. return netif->linkoutput(netif, p);
  94490. 8026146: 68fb ldr r3, [r7, #12]
  94491. 8026148: 699b ldr r3, [r3, #24]
  94492. 802614a: 68b9 ldr r1, [r7, #8]
  94493. 802614c: 68f8 ldr r0, [r7, #12]
  94494. 802614e: 4798 blx r3
  94495. 8026150: 4603 mov r3, r0
  94496. 8026152: e002 b.n 802615a <ethernet_output+0x7e>
  94497. goto pbuf_header_failed;
  94498. 8026154: bf00 nop
  94499. pbuf_header_failed:
  94500. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  94501. ("ethernet_output: could not allocate room for header.\n"));
  94502. LINK_STATS_INC(link.lenerr);
  94503. return ERR_BUF;
  94504. 8026156: f06f 0301 mvn.w r3, #1
  94505. }
  94506. 802615a: 4618 mov r0, r3
  94507. 802615c: 3718 adds r7, #24
  94508. 802615e: 46bd mov sp, r7
  94509. 8026160: bd80 pop {r7, pc}
  94510. 8026162: bf00 nop
  94511. 8026164: 08030894 .word 0x08030894
  94512. 8026168: 080308cc .word 0x080308cc
  94513. 802616c: 08030900 .word 0x08030900
  94514. 08026170 <sys_mbox_new>:
  94515. #endif
  94516. /*-----------------------------------------------------------------------------------*/
  94517. // Creates an empty mailbox.
  94518. err_t sys_mbox_new(sys_mbox_t *mbox, int size)
  94519. {
  94520. 8026170: b580 push {r7, lr}
  94521. 8026172: b082 sub sp, #8
  94522. 8026174: af00 add r7, sp, #0
  94523. 8026176: 6078 str r0, [r7, #4]
  94524. 8026178: 6039 str r1, [r7, #0]
  94525. #if (osCMSIS < 0x20000U)
  94526. osMessageQDef(QUEUE, size, void *);
  94527. *mbox = osMessageCreate(osMessageQ(QUEUE), NULL);
  94528. #else
  94529. *mbox = osMessageQueueNew(size, sizeof(void *), NULL);
  94530. 802617a: 683b ldr r3, [r7, #0]
  94531. 802617c: 2200 movs r2, #0
  94532. 802617e: 2104 movs r1, #4
  94533. 8026180: 4618 mov r0, r3
  94534. 8026182: f7ea fe6b bl 8010e5c <osMessageQueueNew>
  94535. 8026186: 4602 mov r2, r0
  94536. 8026188: 687b ldr r3, [r7, #4]
  94537. 802618a: 601a str r2, [r3, #0]
  94538. if(lwip_stats.sys.mbox.max < lwip_stats.sys.mbox.used)
  94539. {
  94540. lwip_stats.sys.mbox.max = lwip_stats.sys.mbox.used;
  94541. }
  94542. #endif /* SYS_STATS */
  94543. if(*mbox == NULL)
  94544. 802618c: 687b ldr r3, [r7, #4]
  94545. 802618e: 681b ldr r3, [r3, #0]
  94546. 8026190: 2b00 cmp r3, #0
  94547. 8026192: d102 bne.n 802619a <sys_mbox_new+0x2a>
  94548. return ERR_MEM;
  94549. 8026194: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  94550. 8026198: e000 b.n 802619c <sys_mbox_new+0x2c>
  94551. return ERR_OK;
  94552. 802619a: 2300 movs r3, #0
  94553. }
  94554. 802619c: 4618 mov r0, r3
  94555. 802619e: 3708 adds r7, #8
  94556. 80261a0: 46bd mov sp, r7
  94557. 80261a2: bd80 pop {r7, pc}
  94558. 080261a4 <sys_mbox_free>:
  94559. Deallocates a mailbox. If there are messages still present in the
  94560. mailbox when the mailbox is deallocated, it is an indication of a
  94561. programming error in lwIP and the developer should be notified.
  94562. */
  94563. void sys_mbox_free(sys_mbox_t *mbox)
  94564. {
  94565. 80261a4: b580 push {r7, lr}
  94566. 80261a6: b082 sub sp, #8
  94567. 80261a8: af00 add r7, sp, #0
  94568. 80261aa: 6078 str r0, [r7, #4]
  94569. #if (osCMSIS < 0x20000U)
  94570. if(osMessageWaiting(*mbox))
  94571. #else
  94572. if(osMessageQueueGetCount(*mbox))
  94573. 80261ac: 687b ldr r3, [r7, #4]
  94574. 80261ae: 681b ldr r3, [r3, #0]
  94575. 80261b0: 4618 mov r0, r3
  94576. 80261b2: f7ea ff85 bl 80110c0 <osMessageQueueGetCount>
  94577. }
  94578. #if (osCMSIS < 0x20000U)
  94579. osMessageDelete(*mbox);
  94580. #else
  94581. osMessageQueueDelete(*mbox);
  94582. 80261b6: 687b ldr r3, [r7, #4]
  94583. 80261b8: 681b ldr r3, [r3, #0]
  94584. 80261ba: 4618 mov r0, r3
  94585. 80261bc: f7ea ffa0 bl 8011100 <osMessageQueueDelete>
  94586. #endif
  94587. #if SYS_STATS
  94588. --lwip_stats.sys.mbox.used;
  94589. #endif /* SYS_STATS */
  94590. }
  94591. 80261c0: bf00 nop
  94592. 80261c2: 3708 adds r7, #8
  94593. 80261c4: 46bd mov sp, r7
  94594. 80261c6: bd80 pop {r7, pc}
  94595. 080261c8 <sys_mbox_trypost>:
  94596. /*-----------------------------------------------------------------------------------*/
  94597. // Try to post the "msg" to the mailbox.
  94598. err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
  94599. {
  94600. 80261c8: b580 push {r7, lr}
  94601. 80261ca: b084 sub sp, #16
  94602. 80261cc: af00 add r7, sp, #0
  94603. 80261ce: 6078 str r0, [r7, #4]
  94604. 80261d0: 6039 str r1, [r7, #0]
  94605. err_t result;
  94606. #if (osCMSIS < 0x20000U)
  94607. if(osMessagePut(*mbox, (uint32_t)msg, 0) == osOK)
  94608. #else
  94609. if(osMessageQueuePut(*mbox, &msg, 0, 0) == osOK)
  94610. 80261d2: 687b ldr r3, [r7, #4]
  94611. 80261d4: 6818 ldr r0, [r3, #0]
  94612. 80261d6: 4639 mov r1, r7
  94613. 80261d8: 2300 movs r3, #0
  94614. 80261da: 2200 movs r2, #0
  94615. 80261dc: f7ea feb2 bl 8010f44 <osMessageQueuePut>
  94616. 80261e0: 4603 mov r3, r0
  94617. 80261e2: 2b00 cmp r3, #0
  94618. 80261e4: d102 bne.n 80261ec <sys_mbox_trypost+0x24>
  94619. #endif
  94620. {
  94621. result = ERR_OK;
  94622. 80261e6: 2300 movs r3, #0
  94623. 80261e8: 73fb strb r3, [r7, #15]
  94624. 80261ea: e001 b.n 80261f0 <sys_mbox_trypost+0x28>
  94625. }
  94626. else
  94627. {
  94628. // could not post, queue must be full
  94629. result = ERR_MEM;
  94630. 80261ec: 23ff movs r3, #255 @ 0xff
  94631. 80261ee: 73fb strb r3, [r7, #15]
  94632. #if SYS_STATS
  94633. lwip_stats.sys.mbox.err++;
  94634. #endif /* SYS_STATS */
  94635. }
  94636. return result;
  94637. 80261f0: f997 300f ldrsb.w r3, [r7, #15]
  94638. }
  94639. 80261f4: 4618 mov r0, r3
  94640. 80261f6: 3710 adds r7, #16
  94641. 80261f8: 46bd mov sp, r7
  94642. 80261fa: bd80 pop {r7, pc}
  94643. 080261fc <sys_arch_mbox_fetch>:
  94644. Note that a function with a similar name, sys_mbox_fetch(), is
  94645. implemented by lwIP.
  94646. */
  94647. u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
  94648. {
  94649. 80261fc: b580 push {r7, lr}
  94650. 80261fe: b086 sub sp, #24
  94651. 8026200: af00 add r7, sp, #0
  94652. 8026202: 60f8 str r0, [r7, #12]
  94653. 8026204: 60b9 str r1, [r7, #8]
  94654. 8026206: 607a str r2, [r7, #4]
  94655. #if (osCMSIS < 0x20000U)
  94656. osEvent event;
  94657. uint32_t starttime = osKernelSysTick();
  94658. #else
  94659. osStatus_t status;
  94660. uint32_t starttime = osKernelGetTickCount();
  94661. 8026208: f7ea fb08 bl 801081c <osKernelGetTickCount>
  94662. 802620c: 6178 str r0, [r7, #20]
  94663. #endif
  94664. if(timeout != 0)
  94665. 802620e: 687b ldr r3, [r7, #4]
  94666. 8026210: 2b00 cmp r3, #0
  94667. 8026212: d013 beq.n 802623c <sys_arch_mbox_fetch+0x40>
  94668. {
  94669. *msg = (void *)event.value.v;
  94670. return (osKernelSysTick() - starttime);
  94671. }
  94672. #else
  94673. status = osMessageQueueGet(*mbox, msg, 0, timeout);
  94674. 8026214: 68fb ldr r3, [r7, #12]
  94675. 8026216: 6818 ldr r0, [r3, #0]
  94676. 8026218: 687b ldr r3, [r7, #4]
  94677. 802621a: 2200 movs r2, #0
  94678. 802621c: 68b9 ldr r1, [r7, #8]
  94679. 802621e: f7ea fef1 bl 8011004 <osMessageQueueGet>
  94680. 8026222: 6138 str r0, [r7, #16]
  94681. if (status == osOK)
  94682. 8026224: 693b ldr r3, [r7, #16]
  94683. 8026226: 2b00 cmp r3, #0
  94684. 8026228: d105 bne.n 8026236 <sys_arch_mbox_fetch+0x3a>
  94685. {
  94686. return (osKernelGetTickCount() - starttime);
  94687. 802622a: f7ea faf7 bl 801081c <osKernelGetTickCount>
  94688. 802622e: 4602 mov r2, r0
  94689. 8026230: 697b ldr r3, [r7, #20]
  94690. 8026232: 1ad3 subs r3, r2, r3
  94691. 8026234: e00f b.n 8026256 <sys_arch_mbox_fetch+0x5a>
  94692. }
  94693. #endif
  94694. else
  94695. {
  94696. return SYS_ARCH_TIMEOUT;
  94697. 8026236: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  94698. 802623a: e00c b.n 8026256 <sys_arch_mbox_fetch+0x5a>
  94699. #if (osCMSIS < 0x20000U)
  94700. event = osMessageGet (*mbox, osWaitForever);
  94701. *msg = (void *)event.value.v;
  94702. return (osKernelSysTick() - starttime);
  94703. #else
  94704. osMessageQueueGet(*mbox, msg, 0, osWaitForever );
  94705. 802623c: 68fb ldr r3, [r7, #12]
  94706. 802623e: 6818 ldr r0, [r3, #0]
  94707. 8026240: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  94708. 8026244: 2200 movs r2, #0
  94709. 8026246: 68b9 ldr r1, [r7, #8]
  94710. 8026248: f7ea fedc bl 8011004 <osMessageQueueGet>
  94711. return (osKernelGetTickCount() - starttime);
  94712. 802624c: f7ea fae6 bl 801081c <osKernelGetTickCount>
  94713. 8026250: 4602 mov r2, r0
  94714. 8026252: 697b ldr r3, [r7, #20]
  94715. 8026254: 1ad3 subs r3, r2, r3
  94716. #endif
  94717. }
  94718. }
  94719. 8026256: 4618 mov r0, r3
  94720. 8026258: 3718 adds r7, #24
  94721. 802625a: 46bd mov sp, r7
  94722. 802625c: bd80 pop {r7, pc}
  94723. 0802625e <sys_arch_mbox_tryfetch>:
  94724. /*
  94725. Similar to sys_arch_mbox_fetch, but if message is not ready immediately, we'll
  94726. return with SYS_MBOX_EMPTY. On success, 0 is returned.
  94727. */
  94728. u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
  94729. {
  94730. 802625e: b580 push {r7, lr}
  94731. 8026260: b082 sub sp, #8
  94732. 8026262: af00 add r7, sp, #0
  94733. 8026264: 6078 str r0, [r7, #4]
  94734. 8026266: 6039 str r1, [r7, #0]
  94735. if(event.status == osEventMessage)
  94736. {
  94737. *msg = (void *)event.value.v;
  94738. #else
  94739. if (osMessageQueueGet(*mbox, msg, 0, 0) == osOK)
  94740. 8026268: 687b ldr r3, [r7, #4]
  94741. 802626a: 6818 ldr r0, [r3, #0]
  94742. 802626c: 2300 movs r3, #0
  94743. 802626e: 2200 movs r2, #0
  94744. 8026270: 6839 ldr r1, [r7, #0]
  94745. 8026272: f7ea fec7 bl 8011004 <osMessageQueueGet>
  94746. 8026276: 4603 mov r3, r0
  94747. 8026278: 2b00 cmp r3, #0
  94748. 802627a: d101 bne.n 8026280 <sys_arch_mbox_tryfetch+0x22>
  94749. {
  94750. #endif
  94751. return ERR_OK;
  94752. 802627c: 2300 movs r3, #0
  94753. 802627e: e001 b.n 8026284 <sys_arch_mbox_tryfetch+0x26>
  94754. }
  94755. else
  94756. {
  94757. return SYS_MBOX_EMPTY;
  94758. 8026280: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  94759. }
  94760. }
  94761. 8026284: 4618 mov r0, r3
  94762. 8026286: 3708 adds r7, #8
  94763. 8026288: 46bd mov sp, r7
  94764. 802628a: bd80 pop {r7, pc}
  94765. 0802628c <sys_mbox_valid>:
  94766. /*----------------------------------------------------------------------------------*/
  94767. int sys_mbox_valid(sys_mbox_t *mbox)
  94768. {
  94769. 802628c: b480 push {r7}
  94770. 802628e: b083 sub sp, #12
  94771. 8026290: af00 add r7, sp, #0
  94772. 8026292: 6078 str r0, [r7, #4]
  94773. if (*mbox == SYS_MBOX_NULL)
  94774. 8026294: 687b ldr r3, [r7, #4]
  94775. 8026296: 681b ldr r3, [r3, #0]
  94776. 8026298: 2b00 cmp r3, #0
  94777. 802629a: d101 bne.n 80262a0 <sys_mbox_valid+0x14>
  94778. return 0;
  94779. 802629c: 2300 movs r3, #0
  94780. 802629e: e000 b.n 80262a2 <sys_mbox_valid+0x16>
  94781. else
  94782. return 1;
  94783. 80262a0: 2301 movs r3, #1
  94784. }
  94785. 80262a2: 4618 mov r0, r3
  94786. 80262a4: 370c adds r7, #12
  94787. 80262a6: 46bd mov sp, r7
  94788. 80262a8: f85d 7b04 ldr.w r7, [sp], #4
  94789. 80262ac: 4770 bx lr
  94790. 080262ae <sys_mbox_set_invalid>:
  94791. /*-----------------------------------------------------------------------------------*/
  94792. void sys_mbox_set_invalid(sys_mbox_t *mbox)
  94793. {
  94794. 80262ae: b480 push {r7}
  94795. 80262b0: b083 sub sp, #12
  94796. 80262b2: af00 add r7, sp, #0
  94797. 80262b4: 6078 str r0, [r7, #4]
  94798. *mbox = SYS_MBOX_NULL;
  94799. 80262b6: 687b ldr r3, [r7, #4]
  94800. 80262b8: 2200 movs r2, #0
  94801. 80262ba: 601a str r2, [r3, #0]
  94802. }
  94803. 80262bc: bf00 nop
  94804. 80262be: 370c adds r7, #12
  94805. 80262c0: 46bd mov sp, r7
  94806. 80262c2: f85d 7b04 ldr.w r7, [sp], #4
  94807. 80262c6: 4770 bx lr
  94808. 080262c8 <sys_sem_new>:
  94809. /*-----------------------------------------------------------------------------------*/
  94810. // Creates a new semaphore. The "count" argument specifies
  94811. // the initial state of the semaphore.
  94812. err_t sys_sem_new(sys_sem_t *sem, u8_t count)
  94813. {
  94814. 80262c8: b580 push {r7, lr}
  94815. 80262ca: b082 sub sp, #8
  94816. 80262cc: af00 add r7, sp, #0
  94817. 80262ce: 6078 str r0, [r7, #4]
  94818. 80262d0: 460b mov r3, r1
  94819. 80262d2: 70fb strb r3, [r7, #3]
  94820. #if (osCMSIS < 0x20000U)
  94821. osSemaphoreDef(SEM);
  94822. *sem = osSemaphoreCreate (osSemaphore(SEM), 1);
  94823. #else
  94824. *sem = osSemaphoreNew(UINT16_MAX, count, NULL);
  94825. 80262d4: 78fb ldrb r3, [r7, #3]
  94826. 80262d6: 2200 movs r2, #0
  94827. 80262d8: 4619 mov r1, r3
  94828. 80262da: f64f 70ff movw r0, #65535 @ 0xffff
  94829. 80262de: f7ea fc79 bl 8010bd4 <osSemaphoreNew>
  94830. 80262e2: 4602 mov r2, r0
  94831. 80262e4: 687b ldr r3, [r7, #4]
  94832. 80262e6: 601a str r2, [r3, #0]
  94833. #endif
  94834. if(*sem == NULL)
  94835. 80262e8: 687b ldr r3, [r7, #4]
  94836. 80262ea: 681b ldr r3, [r3, #0]
  94837. 80262ec: 2b00 cmp r3, #0
  94838. 80262ee: d102 bne.n 80262f6 <sys_sem_new+0x2e>
  94839. {
  94840. #if SYS_STATS
  94841. ++lwip_stats.sys.sem.err;
  94842. #endif /* SYS_STATS */
  94843. return ERR_MEM;
  94844. 80262f0: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  94845. 80262f4: e009 b.n 802630a <sys_sem_new+0x42>
  94846. }
  94847. if(count == 0) // Means it can't be taken
  94848. 80262f6: 78fb ldrb r3, [r7, #3]
  94849. 80262f8: 2b00 cmp r3, #0
  94850. 80262fa: d105 bne.n 8026308 <sys_sem_new+0x40>
  94851. {
  94852. #if (osCMSIS < 0x20000U)
  94853. osSemaphoreWait(*sem, 0);
  94854. #else
  94855. osSemaphoreAcquire(*sem, 0);
  94856. 80262fc: 687b ldr r3, [r7, #4]
  94857. 80262fe: 681b ldr r3, [r3, #0]
  94858. 8026300: 2100 movs r1, #0
  94859. 8026302: 4618 mov r0, r3
  94860. 8026304: f7ea fcf0 bl 8010ce8 <osSemaphoreAcquire>
  94861. if (lwip_stats.sys.sem.max < lwip_stats.sys.sem.used) {
  94862. lwip_stats.sys.sem.max = lwip_stats.sys.sem.used;
  94863. }
  94864. #endif /* SYS_STATS */
  94865. return ERR_OK;
  94866. 8026308: 2300 movs r3, #0
  94867. }
  94868. 802630a: 4618 mov r0, r3
  94869. 802630c: 3708 adds r7, #8
  94870. 802630e: 46bd mov sp, r7
  94871. 8026310: bd80 pop {r7, pc}
  94872. 08026312 <sys_arch_sem_wait>:
  94873. Notice that lwIP implements a function with a similar name,
  94874. sys_sem_wait(), that uses the sys_arch_sem_wait() function.
  94875. */
  94876. u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
  94877. {
  94878. 8026312: b580 push {r7, lr}
  94879. 8026314: b084 sub sp, #16
  94880. 8026316: af00 add r7, sp, #0
  94881. 8026318: 6078 str r0, [r7, #4]
  94882. 802631a: 6039 str r1, [r7, #0]
  94883. #if (osCMSIS < 0x20000U)
  94884. uint32_t starttime = osKernelSysTick();
  94885. #else
  94886. uint32_t starttime = osKernelGetTickCount();
  94887. 802631c: f7ea fa7e bl 801081c <osKernelGetTickCount>
  94888. 8026320: 60f8 str r0, [r7, #12]
  94889. #endif
  94890. if(timeout != 0)
  94891. 8026322: 683b ldr r3, [r7, #0]
  94892. 8026324: 2b00 cmp r3, #0
  94893. 8026326: d011 beq.n 802634c <sys_arch_sem_wait+0x3a>
  94894. #if (osCMSIS < 0x20000U)
  94895. if(osSemaphoreWait (*sem, timeout) == osOK)
  94896. {
  94897. return (osKernelSysTick() - starttime);
  94898. #else
  94899. if(osSemaphoreAcquire(*sem, timeout) == osOK)
  94900. 8026328: 687b ldr r3, [r7, #4]
  94901. 802632a: 681b ldr r3, [r3, #0]
  94902. 802632c: 6839 ldr r1, [r7, #0]
  94903. 802632e: 4618 mov r0, r3
  94904. 8026330: f7ea fcda bl 8010ce8 <osSemaphoreAcquire>
  94905. 8026334: 4603 mov r3, r0
  94906. 8026336: 2b00 cmp r3, #0
  94907. 8026338: d105 bne.n 8026346 <sys_arch_sem_wait+0x34>
  94908. {
  94909. return (osKernelGetTickCount() - starttime);
  94910. 802633a: f7ea fa6f bl 801081c <osKernelGetTickCount>
  94911. 802633e: 4602 mov r2, r0
  94912. 8026340: 68fb ldr r3, [r7, #12]
  94913. 8026342: 1ad3 subs r3, r2, r3
  94914. 8026344: e012 b.n 802636c <sys_arch_sem_wait+0x5a>
  94915. #endif
  94916. }
  94917. else
  94918. {
  94919. return SYS_ARCH_TIMEOUT;
  94920. 8026346: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  94921. 802634a: e00f b.n 802636c <sys_arch_sem_wait+0x5a>
  94922. {
  94923. #if (osCMSIS < 0x20000U)
  94924. while(osSemaphoreWait (*sem, osWaitForever) != osOK);
  94925. return (osKernelSysTick() - starttime);
  94926. #else
  94927. while(osSemaphoreAcquire(*sem, osWaitForever) != osOK);
  94928. 802634c: bf00 nop
  94929. 802634e: 687b ldr r3, [r7, #4]
  94930. 8026350: 681b ldr r3, [r3, #0]
  94931. 8026352: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  94932. 8026356: 4618 mov r0, r3
  94933. 8026358: f7ea fcc6 bl 8010ce8 <osSemaphoreAcquire>
  94934. 802635c: 4603 mov r3, r0
  94935. 802635e: 2b00 cmp r3, #0
  94936. 8026360: d1f5 bne.n 802634e <sys_arch_sem_wait+0x3c>
  94937. return (osKernelGetTickCount() - starttime);
  94938. 8026362: f7ea fa5b bl 801081c <osKernelGetTickCount>
  94939. 8026366: 4602 mov r2, r0
  94940. 8026368: 68fb ldr r3, [r7, #12]
  94941. 802636a: 1ad3 subs r3, r2, r3
  94942. #endif
  94943. }
  94944. }
  94945. 802636c: 4618 mov r0, r3
  94946. 802636e: 3710 adds r7, #16
  94947. 8026370: 46bd mov sp, r7
  94948. 8026372: bd80 pop {r7, pc}
  94949. 08026374 <sys_sem_signal>:
  94950. /*-----------------------------------------------------------------------------------*/
  94951. // Signals a semaphore
  94952. void sys_sem_signal(sys_sem_t *sem)
  94953. {
  94954. 8026374: b580 push {r7, lr}
  94955. 8026376: b082 sub sp, #8
  94956. 8026378: af00 add r7, sp, #0
  94957. 802637a: 6078 str r0, [r7, #4]
  94958. osSemaphoreRelease(*sem);
  94959. 802637c: 687b ldr r3, [r7, #4]
  94960. 802637e: 681b ldr r3, [r3, #0]
  94961. 8026380: 4618 mov r0, r3
  94962. 8026382: f7ea fd03 bl 8010d8c <osSemaphoreRelease>
  94963. }
  94964. 8026386: bf00 nop
  94965. 8026388: 3708 adds r7, #8
  94966. 802638a: 46bd mov sp, r7
  94967. 802638c: bd80 pop {r7, pc}
  94968. 0802638e <sys_sem_free>:
  94969. /*-----------------------------------------------------------------------------------*/
  94970. // Deallocates a semaphore
  94971. void sys_sem_free(sys_sem_t *sem)
  94972. {
  94973. 802638e: b580 push {r7, lr}
  94974. 8026390: b082 sub sp, #8
  94975. 8026392: af00 add r7, sp, #0
  94976. 8026394: 6078 str r0, [r7, #4]
  94977. #if SYS_STATS
  94978. --lwip_stats.sys.sem.used;
  94979. #endif /* SYS_STATS */
  94980. osSemaphoreDelete(*sem);
  94981. 8026396: 687b ldr r3, [r7, #4]
  94982. 8026398: 681b ldr r3, [r3, #0]
  94983. 802639a: 4618 mov r0, r3
  94984. 802639c: f7ea fd3a bl 8010e14 <osSemaphoreDelete>
  94985. }
  94986. 80263a0: bf00 nop
  94987. 80263a2: 3708 adds r7, #8
  94988. 80263a4: 46bd mov sp, r7
  94989. 80263a6: bd80 pop {r7, pc}
  94990. 080263a8 <sys_sem_valid>:
  94991. /*-----------------------------------------------------------------------------------*/
  94992. int sys_sem_valid(sys_sem_t *sem)
  94993. {
  94994. 80263a8: b480 push {r7}
  94995. 80263aa: b083 sub sp, #12
  94996. 80263ac: af00 add r7, sp, #0
  94997. 80263ae: 6078 str r0, [r7, #4]
  94998. if (*sem == SYS_SEM_NULL)
  94999. 80263b0: 687b ldr r3, [r7, #4]
  95000. 80263b2: 681b ldr r3, [r3, #0]
  95001. 80263b4: 2b00 cmp r3, #0
  95002. 80263b6: d101 bne.n 80263bc <sys_sem_valid+0x14>
  95003. return 0;
  95004. 80263b8: 2300 movs r3, #0
  95005. 80263ba: e000 b.n 80263be <sys_sem_valid+0x16>
  95006. else
  95007. return 1;
  95008. 80263bc: 2301 movs r3, #1
  95009. }
  95010. 80263be: 4618 mov r0, r3
  95011. 80263c0: 370c adds r7, #12
  95012. 80263c2: 46bd mov sp, r7
  95013. 80263c4: f85d 7b04 ldr.w r7, [sp], #4
  95014. 80263c8: 4770 bx lr
  95015. 080263ca <sys_sem_set_invalid>:
  95016. /*-----------------------------------------------------------------------------------*/
  95017. void sys_sem_set_invalid(sys_sem_t *sem)
  95018. {
  95019. 80263ca: b480 push {r7}
  95020. 80263cc: b083 sub sp, #12
  95021. 80263ce: af00 add r7, sp, #0
  95022. 80263d0: 6078 str r0, [r7, #4]
  95023. *sem = SYS_SEM_NULL;
  95024. 80263d2: 687b ldr r3, [r7, #4]
  95025. 80263d4: 2200 movs r2, #0
  95026. 80263d6: 601a str r2, [r3, #0]
  95027. }
  95028. 80263d8: bf00 nop
  95029. 80263da: 370c adds r7, #12
  95030. 80263dc: 46bd mov sp, r7
  95031. 80263de: f85d 7b04 ldr.w r7, [sp], #4
  95032. 80263e2: 4770 bx lr
  95033. 080263e4 <sys_init>:
  95034. #else
  95035. osMutexId_t lwip_sys_mutex;
  95036. #endif
  95037. // Initialize sys arch
  95038. void sys_init(void)
  95039. {
  95040. 80263e4: b580 push {r7, lr}
  95041. 80263e6: af00 add r7, sp, #0
  95042. #if (osCMSIS < 0x20000U)
  95043. lwip_sys_mutex = osMutexCreate(osMutex(lwip_sys_mutex));
  95044. #else
  95045. lwip_sys_mutex = osMutexNew(NULL);
  95046. 80263e8: 2000 movs r0, #0
  95047. 80263ea: f7ea fae5 bl 80109b8 <osMutexNew>
  95048. 80263ee: 4603 mov r3, r0
  95049. 80263f0: 4a01 ldr r2, [pc, #4] @ (80263f8 <sys_init+0x14>)
  95050. 80263f2: 6013 str r3, [r2, #0]
  95051. #endif
  95052. }
  95053. 80263f4: bf00 nop
  95054. 80263f6: bd80 pop {r7, pc}
  95055. 80263f8: 2402b02c .word 0x2402b02c
  95056. 080263fc <sys_mutex_new>:
  95057. /* Mutexes*/
  95058. /*-----------------------------------------------------------------------------------*/
  95059. /*-----------------------------------------------------------------------------------*/
  95060. #if LWIP_COMPAT_MUTEX == 0
  95061. /* Create a new mutex*/
  95062. err_t sys_mutex_new(sys_mutex_t *mutex) {
  95063. 80263fc: b580 push {r7, lr}
  95064. 80263fe: b082 sub sp, #8
  95065. 8026400: af00 add r7, sp, #0
  95066. 8026402: 6078 str r0, [r7, #4]
  95067. #if (osCMSIS < 0x20000U)
  95068. osMutexDef(MUTEX);
  95069. *mutex = osMutexCreate(osMutex(MUTEX));
  95070. #else
  95071. *mutex = osMutexNew(NULL);
  95072. 8026404: 2000 movs r0, #0
  95073. 8026406: f7ea fad7 bl 80109b8 <osMutexNew>
  95074. 802640a: 4602 mov r2, r0
  95075. 802640c: 687b ldr r3, [r7, #4]
  95076. 802640e: 601a str r2, [r3, #0]
  95077. #endif
  95078. if(*mutex == NULL)
  95079. 8026410: 687b ldr r3, [r7, #4]
  95080. 8026412: 681b ldr r3, [r3, #0]
  95081. 8026414: 2b00 cmp r3, #0
  95082. 8026416: d102 bne.n 802641e <sys_mutex_new+0x22>
  95083. {
  95084. #if SYS_STATS
  95085. ++lwip_stats.sys.mutex.err;
  95086. #endif /* SYS_STATS */
  95087. return ERR_MEM;
  95088. 8026418: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  95089. 802641c: e000 b.n 8026420 <sys_mutex_new+0x24>
  95090. ++lwip_stats.sys.mutex.used;
  95091. if (lwip_stats.sys.mutex.max < lwip_stats.sys.mutex.used) {
  95092. lwip_stats.sys.mutex.max = lwip_stats.sys.mutex.used;
  95093. }
  95094. #endif /* SYS_STATS */
  95095. return ERR_OK;
  95096. 802641e: 2300 movs r3, #0
  95097. }
  95098. 8026420: 4618 mov r0, r3
  95099. 8026422: 3708 adds r7, #8
  95100. 8026424: 46bd mov sp, r7
  95101. 8026426: bd80 pop {r7, pc}
  95102. 08026428 <sys_mutex_lock>:
  95103. osMutexDelete(*mutex);
  95104. }
  95105. /*-----------------------------------------------------------------------------------*/
  95106. /* Lock a mutex*/
  95107. void sys_mutex_lock(sys_mutex_t *mutex)
  95108. {
  95109. 8026428: b580 push {r7, lr}
  95110. 802642a: b082 sub sp, #8
  95111. 802642c: af00 add r7, sp, #0
  95112. 802642e: 6078 str r0, [r7, #4]
  95113. #if (osCMSIS < 0x20000U)
  95114. osMutexWait(*mutex, osWaitForever);
  95115. #else
  95116. osMutexAcquire(*mutex, osWaitForever);
  95117. 8026430: 687b ldr r3, [r7, #4]
  95118. 8026432: 681b ldr r3, [r3, #0]
  95119. 8026434: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  95120. 8026438: 4618 mov r0, r3
  95121. 802643a: f7ea fb43 bl 8010ac4 <osMutexAcquire>
  95122. #endif
  95123. }
  95124. 802643e: bf00 nop
  95125. 8026440: 3708 adds r7, #8
  95126. 8026442: 46bd mov sp, r7
  95127. 8026444: bd80 pop {r7, pc}
  95128. 08026446 <sys_mutex_unlock>:
  95129. /*-----------------------------------------------------------------------------------*/
  95130. /* Unlock a mutex*/
  95131. void sys_mutex_unlock(sys_mutex_t *mutex)
  95132. {
  95133. 8026446: b580 push {r7, lr}
  95134. 8026448: b082 sub sp, #8
  95135. 802644a: af00 add r7, sp, #0
  95136. 802644c: 6078 str r0, [r7, #4]
  95137. osMutexRelease(*mutex);
  95138. 802644e: 687b ldr r3, [r7, #4]
  95139. 8026450: 681b ldr r3, [r3, #0]
  95140. 8026452: 4618 mov r0, r3
  95141. 8026454: f7ea fb81 bl 8010b5a <osMutexRelease>
  95142. }
  95143. 8026458: bf00 nop
  95144. 802645a: 3708 adds r7, #8
  95145. 802645c: 46bd mov sp, r7
  95146. 802645e: bd80 pop {r7, pc}
  95147. 08026460 <sys_thread_new>:
  95148. function "thread()". The "arg" argument will be passed as an argument to the
  95149. thread() function. The id of the new thread is returned. Both the id and
  95150. the priority are system dependent.
  95151. */
  95152. sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread , void *arg, int stacksize, int prio)
  95153. {
  95154. 8026460: b580 push {r7, lr}
  95155. 8026462: b08e sub sp, #56 @ 0x38
  95156. 8026464: af00 add r7, sp, #0
  95157. 8026466: 60f8 str r0, [r7, #12]
  95158. 8026468: 60b9 str r1, [r7, #8]
  95159. 802646a: 607a str r2, [r7, #4]
  95160. 802646c: 603b str r3, [r7, #0]
  95161. #if (osCMSIS < 0x20000U)
  95162. const osThreadDef_t os_thread_def = { (char *)name, (os_pthread)thread, (osPriority)prio, 0, stacksize};
  95163. return osThreadCreate(&os_thread_def, arg);
  95164. #else
  95165. const osThreadAttr_t attributes = {
  95166. 802646e: f107 0314 add.w r3, r7, #20
  95167. 8026472: 2224 movs r2, #36 @ 0x24
  95168. 8026474: 2100 movs r1, #0
  95169. 8026476: 4618 mov r0, r3
  95170. 8026478: f003 fc3a bl 8029cf0 <memset>
  95171. 802647c: 68fb ldr r3, [r7, #12]
  95172. 802647e: 617b str r3, [r7, #20]
  95173. 8026480: 683b ldr r3, [r7, #0]
  95174. 8026482: 62bb str r3, [r7, #40] @ 0x28
  95175. 8026484: 6c3b ldr r3, [r7, #64] @ 0x40
  95176. 8026486: 62fb str r3, [r7, #44] @ 0x2c
  95177. .name = name,
  95178. .stack_size = stacksize,
  95179. .priority = (osPriority_t)prio,
  95180. };
  95181. return osThreadNew(thread, arg, &attributes);
  95182. 8026488: f107 0314 add.w r3, r7, #20
  95183. 802648c: 461a mov r2, r3
  95184. 802648e: 6879 ldr r1, [r7, #4]
  95185. 8026490: 68b8 ldr r0, [r7, #8]
  95186. 8026492: f7ea f9d8 bl 8010846 <osThreadNew>
  95187. 8026496: 4603 mov r3, r0
  95188. #endif
  95189. }
  95190. 8026498: 4618 mov r0, r3
  95191. 802649a: 3738 adds r7, #56 @ 0x38
  95192. 802649c: 46bd mov sp, r7
  95193. 802649e: bd80 pop {r7, pc}
  95194. 080264a0 <sys_arch_protect>:
  95195. Note: This function is based on FreeRTOS API, because no equivalent CMSIS-RTOS
  95196. API is available
  95197. */
  95198. sys_prot_t sys_arch_protect(void)
  95199. {
  95200. 80264a0: b580 push {r7, lr}
  95201. 80264a2: af00 add r7, sp, #0
  95202. #if (osCMSIS < 0x20000U)
  95203. osMutexWait(lwip_sys_mutex, osWaitForever);
  95204. #else
  95205. osMutexAcquire(lwip_sys_mutex, osWaitForever);
  95206. 80264a4: 4b04 ldr r3, [pc, #16] @ (80264b8 <sys_arch_protect+0x18>)
  95207. 80264a6: 681b ldr r3, [r3, #0]
  95208. 80264a8: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  95209. 80264ac: 4618 mov r0, r3
  95210. 80264ae: f7ea fb09 bl 8010ac4 <osMutexAcquire>
  95211. #endif
  95212. return (sys_prot_t)1;
  95213. 80264b2: 2301 movs r3, #1
  95214. }
  95215. 80264b4: 4618 mov r0, r3
  95216. 80264b6: bd80 pop {r7, pc}
  95217. 80264b8: 2402b02c .word 0x2402b02c
  95218. 080264bc <sys_arch_unprotect>:
  95219. Note: This function is based on FreeRTOS API, because no equivalent CMSIS-RTOS
  95220. API is available
  95221. */
  95222. void sys_arch_unprotect(sys_prot_t pval)
  95223. {
  95224. 80264bc: b580 push {r7, lr}
  95225. 80264be: b082 sub sp, #8
  95226. 80264c0: af00 add r7, sp, #0
  95227. 80264c2: 6078 str r0, [r7, #4]
  95228. ( void ) pval;
  95229. osMutexRelease(lwip_sys_mutex);
  95230. 80264c4: 4b04 ldr r3, [pc, #16] @ (80264d8 <sys_arch_unprotect+0x1c>)
  95231. 80264c6: 681b ldr r3, [r3, #0]
  95232. 80264c8: 4618 mov r0, r3
  95233. 80264ca: f7ea fb46 bl 8010b5a <osMutexRelease>
  95234. }
  95235. 80264ce: bf00 nop
  95236. 80264d0: 3708 adds r7, #8
  95237. 80264d2: 46bd mov sp, r7
  95238. 80264d4: bd80 pop {r7, pc}
  95239. 80264d6: bf00 nop
  95240. 80264d8: 2402b02c .word 0x2402b02c
  95241. 080264dc <NewMessageData>:
  95242. #include <string.h>
  95243. //#include "cmsis_os.h"
  95244. osMutexId_t mqttMutex;
  95245. static void NewMessageData(MessageData* md, MQTTString* aTopicName, MQTTMessage* aMessage) {
  95246. 80264dc: b480 push {r7}
  95247. 80264de: b085 sub sp, #20
  95248. 80264e0: af00 add r7, sp, #0
  95249. 80264e2: 60f8 str r0, [r7, #12]
  95250. 80264e4: 60b9 str r1, [r7, #8]
  95251. 80264e6: 607a str r2, [r7, #4]
  95252. md->topicName = aTopicName;
  95253. 80264e8: 68fb ldr r3, [r7, #12]
  95254. 80264ea: 68ba ldr r2, [r7, #8]
  95255. 80264ec: 605a str r2, [r3, #4]
  95256. md->message = aMessage;
  95257. 80264ee: 68fb ldr r3, [r7, #12]
  95258. 80264f0: 687a ldr r2, [r7, #4]
  95259. 80264f2: 601a str r2, [r3, #0]
  95260. }
  95261. 80264f4: bf00 nop
  95262. 80264f6: 3714 adds r7, #20
  95263. 80264f8: 46bd mov sp, r7
  95264. 80264fa: f85d 7b04 ldr.w r7, [sp], #4
  95265. 80264fe: 4770 bx lr
  95266. 08026500 <getNextPacketId>:
  95267. static int getNextPacketId(MQTTClient *c) {
  95268. 8026500: b480 push {r7}
  95269. 8026502: b083 sub sp, #12
  95270. 8026504: af00 add r7, sp, #0
  95271. 8026506: 6078 str r0, [r7, #4]
  95272. return c->next_packetid = (c->next_packetid == MAX_PACKET_ID) ? 1 : c->next_packetid + 1;
  95273. 8026508: 687b ldr r3, [r7, #4]
  95274. 802650a: 681b ldr r3, [r3, #0]
  95275. 802650c: f64f 72ff movw r2, #65535 @ 0xffff
  95276. 8026510: 4293 cmp r3, r2
  95277. 8026512: d003 beq.n 802651c <getNextPacketId+0x1c>
  95278. 8026514: 687b ldr r3, [r7, #4]
  95279. 8026516: 681b ldr r3, [r3, #0]
  95280. 8026518: 3301 adds r3, #1
  95281. 802651a: e000 b.n 802651e <getNextPacketId+0x1e>
  95282. 802651c: 2301 movs r3, #1
  95283. 802651e: 687a ldr r2, [r7, #4]
  95284. 8026520: 6013 str r3, [r2, #0]
  95285. 8026522: 687b ldr r3, [r7, #4]
  95286. 8026524: 681b ldr r3, [r3, #0]
  95287. }
  95288. 8026526: 4618 mov r0, r3
  95289. 8026528: 370c adds r7, #12
  95290. 802652a: 46bd mov sp, r7
  95291. 802652c: f85d 7b04 ldr.w r7, [sp], #4
  95292. 8026530: 4770 bx lr
  95293. 08026532 <sendPacket>:
  95294. static int sendPacket(MQTTClient* c, int length, Timer* timer)
  95295. {
  95296. 8026532: b5f0 push {r4, r5, r6, r7, lr}
  95297. 8026534: b087 sub sp, #28
  95298. 8026536: af00 add r7, sp, #0
  95299. 8026538: 60f8 str r0, [r7, #12]
  95300. 802653a: 60b9 str r1, [r7, #8]
  95301. 802653c: 607a str r2, [r7, #4]
  95302. int rc = FAILURE,
  95303. 802653e: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  95304. 8026542: 617b str r3, [r7, #20]
  95305. sent = 0;
  95306. 8026544: 2300 movs r3, #0
  95307. 8026546: 613b str r3, [r7, #16]
  95308. while (sent < length && !TimerIsExpired(timer))
  95309. 8026548: e018 b.n 802657c <sendPacket+0x4a>
  95310. {
  95311. rc = c->ipstack->mqttwrite(c->ipstack, &c->buf[sent], length, TimerLeftMS(timer));
  95312. 802654a: 68fb ldr r3, [r7, #12]
  95313. 802654c: 6d5b ldr r3, [r3, #84] @ 0x54
  95314. 802654e: 689c ldr r4, [r3, #8]
  95315. 8026550: 68fb ldr r3, [r7, #12]
  95316. 8026552: 6d5d ldr r5, [r3, #84] @ 0x54
  95317. 8026554: 68fb ldr r3, [r7, #12]
  95318. 8026556: 691a ldr r2, [r3, #16]
  95319. 8026558: 693b ldr r3, [r7, #16]
  95320. 802655a: 18d6 adds r6, r2, r3
  95321. 802655c: 6878 ldr r0, [r7, #4]
  95322. 802655e: f000 fed3 bl 8027308 <TimerLeftMS>
  95323. 8026562: 4603 mov r3, r0
  95324. 8026564: 68ba ldr r2, [r7, #8]
  95325. 8026566: 4631 mov r1, r6
  95326. 8026568: 4628 mov r0, r5
  95327. 802656a: 47a0 blx r4
  95328. 802656c: 6178 str r0, [r7, #20]
  95329. if (rc < 0) // there was an error writing the data
  95330. 802656e: 697b ldr r3, [r7, #20]
  95331. 8026570: 2b00 cmp r3, #0
  95332. 8026572: db0e blt.n 8026592 <sendPacket+0x60>
  95333. break;
  95334. sent += rc;
  95335. 8026574: 693a ldr r2, [r7, #16]
  95336. 8026576: 697b ldr r3, [r7, #20]
  95337. 8026578: 4413 add r3, r2
  95338. 802657a: 613b str r3, [r7, #16]
  95339. while (sent < length && !TimerIsExpired(timer))
  95340. 802657c: 693a ldr r2, [r7, #16]
  95341. 802657e: 68bb ldr r3, [r7, #8]
  95342. 8026580: 429a cmp r2, r3
  95343. 8026582: da07 bge.n 8026594 <sendPacket+0x62>
  95344. 8026584: 6878 ldr r0, [r7, #4]
  95345. 8026586: f000 fe7d bl 8027284 <TimerIsExpired>
  95346. 802658a: 4603 mov r3, r0
  95347. 802658c: 2b00 cmp r3, #0
  95348. 802658e: d0dc beq.n 802654a <sendPacket+0x18>
  95349. 8026590: e000 b.n 8026594 <sendPacket+0x62>
  95350. break;
  95351. 8026592: bf00 nop
  95352. }
  95353. if (sent == length)
  95354. 8026594: 693a ldr r2, [r7, #16]
  95355. 8026596: 68bb ldr r3, [r7, #8]
  95356. 8026598: 429a cmp r2, r3
  95357. 802659a: d10b bne.n 80265b4 <sendPacket+0x82>
  95358. {
  95359. TimerCountdown(&c->last_sent, c->keepAliveInterval); // record the fact that we have MQTT_SUCCESSfully sent the packet
  95360. 802659c: 68fb ldr r3, [r7, #12]
  95361. 802659e: f103 0258 add.w r2, r3, #88 @ 0x58
  95362. 80265a2: 68fb ldr r3, [r7, #12]
  95363. 80265a4: 699b ldr r3, [r3, #24]
  95364. 80265a6: 4619 mov r1, r3
  95365. 80265a8: 4610 mov r0, r2
  95366. 80265aa: f000 fe95 bl 80272d8 <TimerCountdown>
  95367. rc = MQTT_SUCCESS;
  95368. 80265ae: 2300 movs r3, #0
  95369. 80265b0: 617b str r3, [r7, #20]
  95370. 80265b2: e002 b.n 80265ba <sendPacket+0x88>
  95371. }
  95372. else
  95373. rc = FAILURE;
  95374. 80265b4: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  95375. 80265b8: 617b str r3, [r7, #20]
  95376. return rc;
  95377. 80265ba: 697b ldr r3, [r7, #20]
  95378. }
  95379. 80265bc: 4618 mov r0, r3
  95380. 80265be: 371c adds r7, #28
  95381. 80265c0: 46bd mov sp, r7
  95382. 80265c2: bdf0 pop {r4, r5, r6, r7, pc}
  95383. 080265c4 <MQTTClientInit>:
  95384. void MQTTClientInit(MQTTClient* c, Network* network, unsigned int command_timeout_ms,
  95385. unsigned char* sendbuf, size_t sendbuf_size, unsigned char* readbuf, size_t readbuf_size)
  95386. {
  95387. 80265c4: b580 push {r7, lr}
  95388. 80265c6: b086 sub sp, #24
  95389. 80265c8: af00 add r7, sp, #0
  95390. 80265ca: 60f8 str r0, [r7, #12]
  95391. 80265cc: 60b9 str r1, [r7, #8]
  95392. 80265ce: 607a str r2, [r7, #4]
  95393. 80265d0: 603b str r3, [r7, #0]
  95394. int i;
  95395. c->ipstack = network;
  95396. 80265d2: 68fb ldr r3, [r7, #12]
  95397. 80265d4: 68ba ldr r2, [r7, #8]
  95398. 80265d6: 655a str r2, [r3, #84] @ 0x54
  95399. for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
  95400. 80265d8: 2300 movs r3, #0
  95401. 80265da: 617b str r3, [r7, #20]
  95402. 80265dc: e008 b.n 80265f0 <MQTTClientInit+0x2c>
  95403. c->messageHandlers[i].topicFilter = 0;
  95404. 80265de: 68fb ldr r3, [r7, #12]
  95405. 80265e0: 697a ldr r2, [r7, #20]
  95406. 80265e2: 3205 adds r2, #5
  95407. 80265e4: 2100 movs r1, #0
  95408. 80265e6: f843 1032 str.w r1, [r3, r2, lsl #3]
  95409. for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
  95410. 80265ea: 697b ldr r3, [r7, #20]
  95411. 80265ec: 3301 adds r3, #1
  95412. 80265ee: 617b str r3, [r7, #20]
  95413. 80265f0: 697b ldr r3, [r7, #20]
  95414. 80265f2: 2b04 cmp r3, #4
  95415. 80265f4: ddf3 ble.n 80265de <MQTTClientInit+0x1a>
  95416. c->command_timeout_ms = command_timeout_ms;
  95417. 80265f6: 68fb ldr r3, [r7, #12]
  95418. 80265f8: 687a ldr r2, [r7, #4]
  95419. 80265fa: 605a str r2, [r3, #4]
  95420. c->buf = sendbuf;
  95421. 80265fc: 68fb ldr r3, [r7, #12]
  95422. 80265fe: 683a ldr r2, [r7, #0]
  95423. 8026600: 611a str r2, [r3, #16]
  95424. c->buf_size = sendbuf_size;
  95425. 8026602: 68fb ldr r3, [r7, #12]
  95426. 8026604: 6a3a ldr r2, [r7, #32]
  95427. 8026606: 609a str r2, [r3, #8]
  95428. c->readbuf = readbuf;
  95429. 8026608: 68fb ldr r3, [r7, #12]
  95430. 802660a: 6a7a ldr r2, [r7, #36] @ 0x24
  95431. 802660c: 615a str r2, [r3, #20]
  95432. c->readbuf_size = readbuf_size;
  95433. 802660e: 68fb ldr r3, [r7, #12]
  95434. 8026610: 6aba ldr r2, [r7, #40] @ 0x28
  95435. 8026612: 60da str r2, [r3, #12]
  95436. c->isconnected = 0;
  95437. 8026614: 68fb ldr r3, [r7, #12]
  95438. 8026616: 2200 movs r2, #0
  95439. 8026618: 621a str r2, [r3, #32]
  95440. c->cleansession = 0;
  95441. 802661a: 68fb ldr r3, [r7, #12]
  95442. 802661c: 2200 movs r2, #0
  95443. 802661e: 625a str r2, [r3, #36] @ 0x24
  95444. c->ping_outstanding = 0;
  95445. 8026620: 68fb ldr r3, [r7, #12]
  95446. 8026622: 2200 movs r2, #0
  95447. 8026624: 771a strb r2, [r3, #28]
  95448. c->defaultMessageHandler = NULL;
  95449. 8026626: 68fb ldr r3, [r7, #12]
  95450. 8026628: 2200 movs r2, #0
  95451. 802662a: 651a str r2, [r3, #80] @ 0x50
  95452. c->next_packetid = 1;
  95453. 802662c: 68fb ldr r3, [r7, #12]
  95454. 802662e: 2201 movs r2, #1
  95455. 8026630: 601a str r2, [r3, #0]
  95456. TimerInit(&c->last_sent);
  95457. 8026632: 68fb ldr r3, [r7, #12]
  95458. 8026634: 3358 adds r3, #88 @ 0x58
  95459. 8026636: 4618 mov r0, r3
  95460. 8026638: f000 fe7c bl 8027334 <TimerInit>
  95461. TimerInit(&c->last_received);
  95462. 802663c: 68fb ldr r3, [r7, #12]
  95463. 802663e: 3360 adds r3, #96 @ 0x60
  95464. 8026640: 4618 mov r0, r3
  95465. 8026642: f000 fe77 bl 8027334 <TimerInit>
  95466. #if defined(MQTT_TASK)
  95467. MutexInit(&c->mutex);
  95468. #endif
  95469. if(mqttMutex == NULL)
  95470. 8026646: 4b07 ldr r3, [pc, #28] @ (8026664 <MQTTClientInit+0xa0>)
  95471. 8026648: 681b ldr r3, [r3, #0]
  95472. 802664a: 2b00 cmp r3, #0
  95473. 802664c: d105 bne.n 802665a <MQTTClientInit+0x96>
  95474. {
  95475. // osMutexDef(mqttMutex);
  95476. // mqttMutex = osMutexNew(NULL);
  95477. c->mutex = osMutexNew(NULL);
  95478. 802664e: 2000 movs r0, #0
  95479. 8026650: f7ea f9b2 bl 80109b8 <osMutexNew>
  95480. 8026654: 4602 mov r2, r0
  95481. 8026656: 68fb ldr r3, [r7, #12]
  95482. 8026658: 669a str r2, [r3, #104] @ 0x68
  95483. }
  95484. }
  95485. 802665a: bf00 nop
  95486. 802665c: 3718 adds r7, #24
  95487. 802665e: 46bd mov sp, r7
  95488. 8026660: bd80 pop {r7, pc}
  95489. 8026662: bf00 nop
  95490. 8026664: 2402b030 .word 0x2402b030
  95491. 08026668 <decodePacket>:
  95492. static int decodePacket(MQTTClient* c, int* value, int timeout)
  95493. {
  95494. 8026668: b590 push {r4, r7, lr}
  95495. 802666a: b08b sub sp, #44 @ 0x2c
  95496. 802666c: af00 add r7, sp, #0
  95497. 802666e: 60f8 str r0, [r7, #12]
  95498. 8026670: 60b9 str r1, [r7, #8]
  95499. 8026672: 607a str r2, [r7, #4]
  95500. unsigned char i;
  95501. int multiplier = 1;
  95502. 8026674: 2301 movs r3, #1
  95503. 8026676: 627b str r3, [r7, #36] @ 0x24
  95504. int len = 0;
  95505. 8026678: 2300 movs r3, #0
  95506. 802667a: 623b str r3, [r7, #32]
  95507. const int MAX_NO_OF_REMAINING_LENGTH_BYTES = 4;
  95508. 802667c: 2304 movs r3, #4
  95509. 802667e: 61fb str r3, [r7, #28]
  95510. *value = 0;
  95511. 8026680: 68bb ldr r3, [r7, #8]
  95512. 8026682: 2200 movs r2, #0
  95513. 8026684: 601a str r2, [r3, #0]
  95514. do
  95515. {
  95516. int rc = MQTTPACKET_READ_ERROR;
  95517. 8026686: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  95518. 802668a: 61bb str r3, [r7, #24]
  95519. if (++len > MAX_NO_OF_REMAINING_LENGTH_BYTES)
  95520. 802668c: 6a3b ldr r3, [r7, #32]
  95521. 802668e: 3301 adds r3, #1
  95522. 8026690: 623b str r3, [r7, #32]
  95523. 8026692: 6a3a ldr r2, [r7, #32]
  95524. 8026694: 69fb ldr r3, [r7, #28]
  95525. 8026696: 429a cmp r2, r3
  95526. 8026698: dd03 ble.n 80266a2 <decodePacket+0x3a>
  95527. {
  95528. rc = MQTTPACKET_READ_ERROR; /* bad data */
  95529. 802669a: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  95530. 802669e: 61bb str r3, [r7, #24]
  95531. goto exit;
  95532. 80266a0: e021 b.n 80266e6 <decodePacket+0x7e>
  95533. }
  95534. rc = c->ipstack->mqttread(c->ipstack, &i, 1, timeout);
  95535. 80266a2: 68fb ldr r3, [r7, #12]
  95536. 80266a4: 6d5b ldr r3, [r3, #84] @ 0x54
  95537. 80266a6: 685c ldr r4, [r3, #4]
  95538. 80266a8: 68fb ldr r3, [r7, #12]
  95539. 80266aa: 6d58 ldr r0, [r3, #84] @ 0x54
  95540. 80266ac: f107 0117 add.w r1, r7, #23
  95541. 80266b0: 687b ldr r3, [r7, #4]
  95542. 80266b2: 2201 movs r2, #1
  95543. 80266b4: 47a0 blx r4
  95544. 80266b6: 61b8 str r0, [r7, #24]
  95545. if (rc != 1)
  95546. 80266b8: 69bb ldr r3, [r7, #24]
  95547. 80266ba: 2b01 cmp r3, #1
  95548. 80266bc: d112 bne.n 80266e4 <decodePacket+0x7c>
  95549. goto exit;
  95550. *value += (i & 127) * multiplier;
  95551. 80266be: 68bb ldr r3, [r7, #8]
  95552. 80266c0: 681a ldr r2, [r3, #0]
  95553. 80266c2: 7dfb ldrb r3, [r7, #23]
  95554. 80266c4: f003 037f and.w r3, r3, #127 @ 0x7f
  95555. 80266c8: 6a79 ldr r1, [r7, #36] @ 0x24
  95556. 80266ca: fb01 f303 mul.w r3, r1, r3
  95557. 80266ce: 441a add r2, r3
  95558. 80266d0: 68bb ldr r3, [r7, #8]
  95559. 80266d2: 601a str r2, [r3, #0]
  95560. multiplier *= 128;
  95561. 80266d4: 6a7b ldr r3, [r7, #36] @ 0x24
  95562. 80266d6: 01db lsls r3, r3, #7
  95563. 80266d8: 627b str r3, [r7, #36] @ 0x24
  95564. } while ((i & 128) != 0);
  95565. 80266da: 7dfb ldrb r3, [r7, #23]
  95566. 80266dc: b25b sxtb r3, r3
  95567. 80266de: 2b00 cmp r3, #0
  95568. 80266e0: dbd1 blt.n 8026686 <decodePacket+0x1e>
  95569. exit:
  95570. 80266e2: e000 b.n 80266e6 <decodePacket+0x7e>
  95571. goto exit;
  95572. 80266e4: bf00 nop
  95573. return len;
  95574. 80266e6: 6a3b ldr r3, [r7, #32]
  95575. }
  95576. 80266e8: 4618 mov r0, r3
  95577. 80266ea: 372c adds r7, #44 @ 0x2c
  95578. 80266ec: 46bd mov sp, r7
  95579. 80266ee: bd90 pop {r4, r7, pc}
  95580. 080266f0 <readPacket>:
  95581. static int readPacket(MQTTClient* c, Timer* timer)
  95582. {
  95583. 80266f0: b5f0 push {r4, r5, r6, r7, lr}
  95584. 80266f2: b089 sub sp, #36 @ 0x24
  95585. 80266f4: af00 add r7, sp, #0
  95586. 80266f6: 60f8 str r0, [r7, #12]
  95587. 80266f8: 60b9 str r1, [r7, #8]
  95588. MQTTHeader header = {0};
  95589. 80266fa: 2300 movs r3, #0
  95590. 80266fc: 617b str r3, [r7, #20]
  95591. int len = 0;
  95592. 80266fe: 2300 movs r3, #0
  95593. 8026700: 61bb str r3, [r7, #24]
  95594. int rem_len = 0;
  95595. 8026702: 2300 movs r3, #0
  95596. 8026704: 613b str r3, [r7, #16]
  95597. /* 1. read the header byte. This has the packet type in it */
  95598. int rc = c->ipstack->mqttread(c->ipstack, c->readbuf, 1, TimerLeftMS(timer));
  95599. 8026706: 68fb ldr r3, [r7, #12]
  95600. 8026708: 6d5b ldr r3, [r3, #84] @ 0x54
  95601. 802670a: 685c ldr r4, [r3, #4]
  95602. 802670c: 68fb ldr r3, [r7, #12]
  95603. 802670e: 6d5d ldr r5, [r3, #84] @ 0x54
  95604. 8026710: 68fb ldr r3, [r7, #12]
  95605. 8026712: 695e ldr r6, [r3, #20]
  95606. 8026714: 68b8 ldr r0, [r7, #8]
  95607. 8026716: f000 fdf7 bl 8027308 <TimerLeftMS>
  95608. 802671a: 4603 mov r3, r0
  95609. 802671c: 2201 movs r2, #1
  95610. 802671e: 4631 mov r1, r6
  95611. 8026720: 4628 mov r0, r5
  95612. 8026722: 47a0 blx r4
  95613. 8026724: 61f8 str r0, [r7, #28]
  95614. if (rc != 1)
  95615. 8026726: 69fb ldr r3, [r7, #28]
  95616. 8026728: 2b01 cmp r3, #1
  95617. 802672a: d15d bne.n 80267e8 <readPacket+0xf8>
  95618. goto exit;
  95619. len = 1;
  95620. 802672c: 2301 movs r3, #1
  95621. 802672e: 61bb str r3, [r7, #24]
  95622. /* 2. read the remaining length. This is variable in itself */
  95623. decodePacket(c, &rem_len, TimerLeftMS(timer));
  95624. 8026730: 68b8 ldr r0, [r7, #8]
  95625. 8026732: f000 fde9 bl 8027308 <TimerLeftMS>
  95626. 8026736: 4602 mov r2, r0
  95627. 8026738: f107 0310 add.w r3, r7, #16
  95628. 802673c: 4619 mov r1, r3
  95629. 802673e: 68f8 ldr r0, [r7, #12]
  95630. 8026740: f7ff ff92 bl 8026668 <decodePacket>
  95631. len += MQTTPacket_encode(c->readbuf + 1, rem_len); /* put the original remaining length back into the buffer */
  95632. 8026744: 68fb ldr r3, [r7, #12]
  95633. 8026746: 695b ldr r3, [r3, #20]
  95634. 8026748: 3301 adds r3, #1
  95635. 802674a: 693a ldr r2, [r7, #16]
  95636. 802674c: 4611 mov r1, r2
  95637. 802674e: 4618 mov r0, r3
  95638. 8026750: f001 f959 bl 8027a06 <MQTTPacket_encode>
  95639. 8026754: 4602 mov r2, r0
  95640. 8026756: 69bb ldr r3, [r7, #24]
  95641. 8026758: 4413 add r3, r2
  95642. 802675a: 61bb str r3, [r7, #24]
  95643. if (rem_len > (c->readbuf_size - len))
  95644. 802675c: 68fb ldr r3, [r7, #12]
  95645. 802675e: 68da ldr r2, [r3, #12]
  95646. 8026760: 69bb ldr r3, [r7, #24]
  95647. 8026762: 1ad3 subs r3, r2, r3
  95648. 8026764: 693a ldr r2, [r7, #16]
  95649. 8026766: 4293 cmp r3, r2
  95650. 8026768: d203 bcs.n 8026772 <readPacket+0x82>
  95651. {
  95652. rc = BUFFER_OVERFLOW;
  95653. 802676a: f06f 0301 mvn.w r3, #1
  95654. 802676e: 61fb str r3, [r7, #28]
  95655. goto exit;
  95656. 8026770: e03d b.n 80267ee <readPacket+0xfe>
  95657. }
  95658. /* 3. read the rest of the buffer using a callback to supply the rest of the data */
  95659. if (rem_len > 0 && (rc = c->ipstack->mqttread(c->ipstack, c->readbuf + len, rem_len, TimerLeftMS(timer)) != rem_len)) {
  95660. 8026772: 693b ldr r3, [r7, #16]
  95661. 8026774: 2b00 cmp r3, #0
  95662. 8026776: dd20 ble.n 80267ba <readPacket+0xca>
  95663. 8026778: 68fb ldr r3, [r7, #12]
  95664. 802677a: 6d5b ldr r3, [r3, #84] @ 0x54
  95665. 802677c: 685c ldr r4, [r3, #4]
  95666. 802677e: 68fb ldr r3, [r7, #12]
  95667. 8026780: 6d5d ldr r5, [r3, #84] @ 0x54
  95668. 8026782: 68fb ldr r3, [r7, #12]
  95669. 8026784: 695a ldr r2, [r3, #20]
  95670. 8026786: 69bb ldr r3, [r7, #24]
  95671. 8026788: 18d6 adds r6, r2, r3
  95672. 802678a: 693b ldr r3, [r7, #16]
  95673. 802678c: 607b str r3, [r7, #4]
  95674. 802678e: 68b8 ldr r0, [r7, #8]
  95675. 8026790: f000 fdba bl 8027308 <TimerLeftMS>
  95676. 8026794: 4603 mov r3, r0
  95677. 8026796: 687a ldr r2, [r7, #4]
  95678. 8026798: 4631 mov r1, r6
  95679. 802679a: 4628 mov r0, r5
  95680. 802679c: 47a0 blx r4
  95681. 802679e: 4602 mov r2, r0
  95682. 80267a0: 693b ldr r3, [r7, #16]
  95683. 80267a2: 429a cmp r2, r3
  95684. 80267a4: bf14 ite ne
  95685. 80267a6: 2301 movne r3, #1
  95686. 80267a8: 2300 moveq r3, #0
  95687. 80267aa: b2db uxtb r3, r3
  95688. 80267ac: 61fb str r3, [r7, #28]
  95689. 80267ae: 69fb ldr r3, [r7, #28]
  95690. 80267b0: 2b00 cmp r3, #0
  95691. 80267b2: d002 beq.n 80267ba <readPacket+0xca>
  95692. rc = 0;
  95693. 80267b4: 2300 movs r3, #0
  95694. 80267b6: 61fb str r3, [r7, #28]
  95695. goto exit;
  95696. 80267b8: e019 b.n 80267ee <readPacket+0xfe>
  95697. }
  95698. header.byte = c->readbuf[0];
  95699. 80267ba: 68fb ldr r3, [r7, #12]
  95700. 80267bc: 695b ldr r3, [r3, #20]
  95701. 80267be: 781b ldrb r3, [r3, #0]
  95702. 80267c0: 753b strb r3, [r7, #20]
  95703. rc = header.bits.type;
  95704. 80267c2: 7d3b ldrb r3, [r7, #20]
  95705. 80267c4: f3c3 1303 ubfx r3, r3, #4, #4
  95706. 80267c8: b2db uxtb r3, r3
  95707. 80267ca: 61fb str r3, [r7, #28]
  95708. if (c->keepAliveInterval > 0)
  95709. 80267cc: 68fb ldr r3, [r7, #12]
  95710. 80267ce: 699b ldr r3, [r3, #24]
  95711. 80267d0: 2b00 cmp r3, #0
  95712. 80267d2: d00b beq.n 80267ec <readPacket+0xfc>
  95713. TimerCountdown(&c->last_received, c->keepAliveInterval); // record the fact that we have MQTT_SUCCESSfully received a packet
  95714. 80267d4: 68fb ldr r3, [r7, #12]
  95715. 80267d6: f103 0260 add.w r2, r3, #96 @ 0x60
  95716. 80267da: 68fb ldr r3, [r7, #12]
  95717. 80267dc: 699b ldr r3, [r3, #24]
  95718. 80267de: 4619 mov r1, r3
  95719. 80267e0: 4610 mov r0, r2
  95720. 80267e2: f000 fd79 bl 80272d8 <TimerCountdown>
  95721. 80267e6: e002 b.n 80267ee <readPacket+0xfe>
  95722. goto exit;
  95723. 80267e8: bf00 nop
  95724. 80267ea: e000 b.n 80267ee <readPacket+0xfe>
  95725. exit:
  95726. 80267ec: bf00 nop
  95727. return rc;
  95728. 80267ee: 69fb ldr r3, [r7, #28]
  95729. }
  95730. 80267f0: 4618 mov r0, r3
  95731. 80267f2: 3724 adds r7, #36 @ 0x24
  95732. 80267f4: 46bd mov sp, r7
  95733. 80267f6: bdf0 pop {r4, r5, r6, r7, pc}
  95734. 080267f8 <isTopicMatched>:
  95735. // assume topic filter and name is in correct format
  95736. // # can only be at end
  95737. // + and # can only be next to separator
  95738. static char isTopicMatched(char* topicFilter, MQTTString* topicName)
  95739. {
  95740. 80267f8: b480 push {r7}
  95741. 80267fa: b087 sub sp, #28
  95742. 80267fc: af00 add r7, sp, #0
  95743. 80267fe: 6078 str r0, [r7, #4]
  95744. 8026800: 6039 str r1, [r7, #0]
  95745. char* curf = topicFilter;
  95746. 8026802: 687b ldr r3, [r7, #4]
  95747. 8026804: 617b str r3, [r7, #20]
  95748. char* curn = topicName->lenstring.data;
  95749. 8026806: 683b ldr r3, [r7, #0]
  95750. 8026808: 689b ldr r3, [r3, #8]
  95751. 802680a: 613b str r3, [r7, #16]
  95752. char* curn_end = curn + topicName->lenstring.len;
  95753. 802680c: 683b ldr r3, [r7, #0]
  95754. 802680e: 685b ldr r3, [r3, #4]
  95755. 8026810: 461a mov r2, r3
  95756. 8026812: 693b ldr r3, [r7, #16]
  95757. 8026814: 4413 add r3, r2
  95758. 8026816: 60bb str r3, [r7, #8]
  95759. while (*curf && curn < curn_end)
  95760. 8026818: e039 b.n 802688e <isTopicMatched+0x96>
  95761. {
  95762. if (*curn == '/' && *curf != '/')
  95763. 802681a: 693b ldr r3, [r7, #16]
  95764. 802681c: 781b ldrb r3, [r3, #0]
  95765. 802681e: 2b2f cmp r3, #47 @ 0x2f
  95766. 8026820: d103 bne.n 802682a <isTopicMatched+0x32>
  95767. 8026822: 697b ldr r3, [r7, #20]
  95768. 8026824: 781b ldrb r3, [r3, #0]
  95769. 8026826: 2b2f cmp r3, #47 @ 0x2f
  95770. 8026828: d13a bne.n 80268a0 <isTopicMatched+0xa8>
  95771. break;
  95772. if (*curf != '+' && *curf != '#' && *curf != *curn)
  95773. 802682a: 697b ldr r3, [r7, #20]
  95774. 802682c: 781b ldrb r3, [r3, #0]
  95775. 802682e: 2b2b cmp r3, #43 @ 0x2b
  95776. 8026830: d009 beq.n 8026846 <isTopicMatched+0x4e>
  95777. 8026832: 697b ldr r3, [r7, #20]
  95778. 8026834: 781b ldrb r3, [r3, #0]
  95779. 8026836: 2b23 cmp r3, #35 @ 0x23
  95780. 8026838: d005 beq.n 8026846 <isTopicMatched+0x4e>
  95781. 802683a: 697b ldr r3, [r7, #20]
  95782. 802683c: 781a ldrb r2, [r3, #0]
  95783. 802683e: 693b ldr r3, [r7, #16]
  95784. 8026840: 781b ldrb r3, [r3, #0]
  95785. 8026842: 429a cmp r2, r3
  95786. 8026844: d12e bne.n 80268a4 <isTopicMatched+0xac>
  95787. break;
  95788. if (*curf == '+')
  95789. 8026846: 697b ldr r3, [r7, #20]
  95790. 8026848: 781b ldrb r3, [r3, #0]
  95791. 802684a: 2b2b cmp r3, #43 @ 0x2b
  95792. 802684c: d112 bne.n 8026874 <isTopicMatched+0x7c>
  95793. { // skip until we meet the next separator, or end of string
  95794. char* nextpos = curn + 1;
  95795. 802684e: 693b ldr r3, [r7, #16]
  95796. 8026850: 3301 adds r3, #1
  95797. 8026852: 60fb str r3, [r7, #12]
  95798. while (nextpos < curn_end && *nextpos != '/')
  95799. 8026854: e005 b.n 8026862 <isTopicMatched+0x6a>
  95800. nextpos = ++curn + 1;
  95801. 8026856: 693b ldr r3, [r7, #16]
  95802. 8026858: 3301 adds r3, #1
  95803. 802685a: 613b str r3, [r7, #16]
  95804. 802685c: 693b ldr r3, [r7, #16]
  95805. 802685e: 3301 adds r3, #1
  95806. 8026860: 60fb str r3, [r7, #12]
  95807. while (nextpos < curn_end && *nextpos != '/')
  95808. 8026862: 68fa ldr r2, [r7, #12]
  95809. 8026864: 68bb ldr r3, [r7, #8]
  95810. 8026866: 429a cmp r2, r3
  95811. 8026868: d20b bcs.n 8026882 <isTopicMatched+0x8a>
  95812. 802686a: 68fb ldr r3, [r7, #12]
  95813. 802686c: 781b ldrb r3, [r3, #0]
  95814. 802686e: 2b2f cmp r3, #47 @ 0x2f
  95815. 8026870: d1f1 bne.n 8026856 <isTopicMatched+0x5e>
  95816. 8026872: e006 b.n 8026882 <isTopicMatched+0x8a>
  95817. }
  95818. else if (*curf == '#')
  95819. 8026874: 697b ldr r3, [r7, #20]
  95820. 8026876: 781b ldrb r3, [r3, #0]
  95821. 8026878: 2b23 cmp r3, #35 @ 0x23
  95822. 802687a: d102 bne.n 8026882 <isTopicMatched+0x8a>
  95823. curn = curn_end - 1; // skip until end of string
  95824. 802687c: 68bb ldr r3, [r7, #8]
  95825. 802687e: 3b01 subs r3, #1
  95826. 8026880: 613b str r3, [r7, #16]
  95827. curf++;
  95828. 8026882: 697b ldr r3, [r7, #20]
  95829. 8026884: 3301 adds r3, #1
  95830. 8026886: 617b str r3, [r7, #20]
  95831. curn++;
  95832. 8026888: 693b ldr r3, [r7, #16]
  95833. 802688a: 3301 adds r3, #1
  95834. 802688c: 613b str r3, [r7, #16]
  95835. while (*curf && curn < curn_end)
  95836. 802688e: 697b ldr r3, [r7, #20]
  95837. 8026890: 781b ldrb r3, [r3, #0]
  95838. 8026892: 2b00 cmp r3, #0
  95839. 8026894: d007 beq.n 80268a6 <isTopicMatched+0xae>
  95840. 8026896: 693a ldr r2, [r7, #16]
  95841. 8026898: 68bb ldr r3, [r7, #8]
  95842. 802689a: 429a cmp r2, r3
  95843. 802689c: d3bd bcc.n 802681a <isTopicMatched+0x22>
  95844. 802689e: e002 b.n 80268a6 <isTopicMatched+0xae>
  95845. break;
  95846. 80268a0: bf00 nop
  95847. 80268a2: e000 b.n 80268a6 <isTopicMatched+0xae>
  95848. break;
  95849. 80268a4: bf00 nop
  95850. };
  95851. return (curn == curn_end) && (*curf == '\0');
  95852. 80268a6: 693a ldr r2, [r7, #16]
  95853. 80268a8: 68bb ldr r3, [r7, #8]
  95854. 80268aa: 429a cmp r2, r3
  95855. 80268ac: d105 bne.n 80268ba <isTopicMatched+0xc2>
  95856. 80268ae: 697b ldr r3, [r7, #20]
  95857. 80268b0: 781b ldrb r3, [r3, #0]
  95858. 80268b2: 2b00 cmp r3, #0
  95859. 80268b4: d101 bne.n 80268ba <isTopicMatched+0xc2>
  95860. 80268b6: 2301 movs r3, #1
  95861. 80268b8: e000 b.n 80268bc <isTopicMatched+0xc4>
  95862. 80268ba: 2300 movs r3, #0
  95863. 80268bc: b2db uxtb r3, r3
  95864. }
  95865. 80268be: 4618 mov r0, r3
  95866. 80268c0: 371c adds r7, #28
  95867. 80268c2: 46bd mov sp, r7
  95868. 80268c4: f85d 7b04 ldr.w r7, [sp], #4
  95869. 80268c8: 4770 bx lr
  95870. 080268ca <deliverMessage>:
  95871. int deliverMessage(MQTTClient* c, MQTTString* topicName, MQTTMessage* message)
  95872. {
  95873. 80268ca: b580 push {r7, lr}
  95874. 80268cc: b08a sub sp, #40 @ 0x28
  95875. 80268ce: af00 add r7, sp, #0
  95876. 80268d0: 60f8 str r0, [r7, #12]
  95877. 80268d2: 60b9 str r1, [r7, #8]
  95878. 80268d4: 607a str r2, [r7, #4]
  95879. int i;
  95880. int rc = FAILURE;
  95881. 80268d6: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  95882. 80268da: 623b str r3, [r7, #32]
  95883. // we have to find the right message handler - indexed by topic
  95884. for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
  95885. 80268dc: 2300 movs r3, #0
  95886. 80268de: 627b str r3, [r7, #36] @ 0x24
  95887. 80268e0: e03c b.n 802695c <deliverMessage+0x92>
  95888. {
  95889. if (c->messageHandlers[i].topicFilter != 0 && (MQTTPacket_equals(topicName, (char*)c->messageHandlers[i].topicFilter) ||
  95890. 80268e2: 68fb ldr r3, [r7, #12]
  95891. 80268e4: 6a7a ldr r2, [r7, #36] @ 0x24
  95892. 80268e6: 3205 adds r2, #5
  95893. 80268e8: f853 3032 ldr.w r3, [r3, r2, lsl #3]
  95894. 80268ec: 2b00 cmp r3, #0
  95895. 80268ee: d032 beq.n 8026956 <deliverMessage+0x8c>
  95896. 80268f0: 68fb ldr r3, [r7, #12]
  95897. 80268f2: 6a7a ldr r2, [r7, #36] @ 0x24
  95898. 80268f4: 3205 adds r2, #5
  95899. 80268f6: f853 3032 ldr.w r3, [r3, r2, lsl #3]
  95900. 80268fa: 4619 mov r1, r3
  95901. 80268fc: 68b8 ldr r0, [r7, #8]
  95902. 80268fe: f001 fa51 bl 8027da4 <MQTTPacket_equals>
  95903. 8026902: 4603 mov r3, r0
  95904. 8026904: 2b00 cmp r3, #0
  95905. 8026906: d10b bne.n 8026920 <deliverMessage+0x56>
  95906. isTopicMatched((char*)c->messageHandlers[i].topicFilter, topicName)))
  95907. 8026908: 68fb ldr r3, [r7, #12]
  95908. 802690a: 6a7a ldr r2, [r7, #36] @ 0x24
  95909. 802690c: 3205 adds r2, #5
  95910. 802690e: f853 3032 ldr.w r3, [r3, r2, lsl #3]
  95911. 8026912: 68b9 ldr r1, [r7, #8]
  95912. 8026914: 4618 mov r0, r3
  95913. 8026916: f7ff ff6f bl 80267f8 <isTopicMatched>
  95914. 802691a: 4603 mov r3, r0
  95915. if (c->messageHandlers[i].topicFilter != 0 && (MQTTPacket_equals(topicName, (char*)c->messageHandlers[i].topicFilter) ||
  95916. 802691c: 2b00 cmp r3, #0
  95917. 802691e: d01a beq.n 8026956 <deliverMessage+0x8c>
  95918. {
  95919. if (c->messageHandlers[i].fp != NULL)
  95920. 8026920: 68fa ldr r2, [r7, #12]
  95921. 8026922: 6a7b ldr r3, [r7, #36] @ 0x24
  95922. 8026924: 3305 adds r3, #5
  95923. 8026926: 00db lsls r3, r3, #3
  95924. 8026928: 4413 add r3, r2
  95925. 802692a: 685b ldr r3, [r3, #4]
  95926. 802692c: 2b00 cmp r3, #0
  95927. 802692e: d012 beq.n 8026956 <deliverMessage+0x8c>
  95928. {
  95929. MessageData md;
  95930. NewMessageData(&md, topicName, message);
  95931. 8026930: f107 0318 add.w r3, r7, #24
  95932. 8026934: 687a ldr r2, [r7, #4]
  95933. 8026936: 68b9 ldr r1, [r7, #8]
  95934. 8026938: 4618 mov r0, r3
  95935. 802693a: f7ff fdcf bl 80264dc <NewMessageData>
  95936. c->messageHandlers[i].fp(&md);
  95937. 802693e: 68fa ldr r2, [r7, #12]
  95938. 8026940: 6a7b ldr r3, [r7, #36] @ 0x24
  95939. 8026942: 3305 adds r3, #5
  95940. 8026944: 00db lsls r3, r3, #3
  95941. 8026946: 4413 add r3, r2
  95942. 8026948: 685b ldr r3, [r3, #4]
  95943. 802694a: f107 0218 add.w r2, r7, #24
  95944. 802694e: 4610 mov r0, r2
  95945. 8026950: 4798 blx r3
  95946. rc = MQTT_SUCCESS;
  95947. 8026952: 2300 movs r3, #0
  95948. 8026954: 623b str r3, [r7, #32]
  95949. for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
  95950. 8026956: 6a7b ldr r3, [r7, #36] @ 0x24
  95951. 8026958: 3301 adds r3, #1
  95952. 802695a: 627b str r3, [r7, #36] @ 0x24
  95953. 802695c: 6a7b ldr r3, [r7, #36] @ 0x24
  95954. 802695e: 2b04 cmp r3, #4
  95955. 8026960: ddbf ble.n 80268e2 <deliverMessage+0x18>
  95956. }
  95957. }
  95958. }
  95959. if (rc == FAILURE && c->defaultMessageHandler != NULL)
  95960. 8026962: 6a3b ldr r3, [r7, #32]
  95961. 8026964: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  95962. 8026968: d112 bne.n 8026990 <deliverMessage+0xc6>
  95963. 802696a: 68fb ldr r3, [r7, #12]
  95964. 802696c: 6d1b ldr r3, [r3, #80] @ 0x50
  95965. 802696e: 2b00 cmp r3, #0
  95966. 8026970: d00e beq.n 8026990 <deliverMessage+0xc6>
  95967. {
  95968. MessageData md;
  95969. NewMessageData(&md, topicName, message);
  95970. 8026972: f107 0310 add.w r3, r7, #16
  95971. 8026976: 687a ldr r2, [r7, #4]
  95972. 8026978: 68b9 ldr r1, [r7, #8]
  95973. 802697a: 4618 mov r0, r3
  95974. 802697c: f7ff fdae bl 80264dc <NewMessageData>
  95975. c->defaultMessageHandler(&md);
  95976. 8026980: 68fb ldr r3, [r7, #12]
  95977. 8026982: 6d1b ldr r3, [r3, #80] @ 0x50
  95978. 8026984: f107 0210 add.w r2, r7, #16
  95979. 8026988: 4610 mov r0, r2
  95980. 802698a: 4798 blx r3
  95981. rc = MQTT_SUCCESS;
  95982. 802698c: 2300 movs r3, #0
  95983. 802698e: 623b str r3, [r7, #32]
  95984. }
  95985. return rc;
  95986. 8026990: 6a3b ldr r3, [r7, #32]
  95987. }
  95988. 8026992: 4618 mov r0, r3
  95989. 8026994: 3728 adds r7, #40 @ 0x28
  95990. 8026996: 46bd mov sp, r7
  95991. 8026998: bd80 pop {r7, pc}
  95992. 0802699a <keepalive>:
  95993. int keepalive(MQTTClient* c)
  95994. {
  95995. 802699a: b580 push {r7, lr}
  95996. 802699c: b086 sub sp, #24
  95997. 802699e: af00 add r7, sp, #0
  95998. 80269a0: 6078 str r0, [r7, #4]
  95999. int rc = MQTT_SUCCESS;
  96000. 80269a2: 2300 movs r3, #0
  96001. 80269a4: 617b str r3, [r7, #20]
  96002. if (c->keepAliveInterval == 0)
  96003. 80269a6: 687b ldr r3, [r7, #4]
  96004. 80269a8: 699b ldr r3, [r3, #24]
  96005. 80269aa: 2b00 cmp r3, #0
  96006. 80269ac: d03e beq.n 8026a2c <keepalive+0x92>
  96007. goto exit;
  96008. if (TimerIsExpired(&c->last_sent) || TimerIsExpired(&c->last_received))
  96009. 80269ae: 687b ldr r3, [r7, #4]
  96010. 80269b0: 3358 adds r3, #88 @ 0x58
  96011. 80269b2: 4618 mov r0, r3
  96012. 80269b4: f000 fc66 bl 8027284 <TimerIsExpired>
  96013. 80269b8: 4603 mov r3, r0
  96014. 80269ba: 2b00 cmp r3, #0
  96015. 80269bc: d107 bne.n 80269ce <keepalive+0x34>
  96016. 80269be: 687b ldr r3, [r7, #4]
  96017. 80269c0: 3360 adds r3, #96 @ 0x60
  96018. 80269c2: 4618 mov r0, r3
  96019. 80269c4: f000 fc5e bl 8027284 <TimerIsExpired>
  96020. 80269c8: 4603 mov r3, r0
  96021. 80269ca: 2b00 cmp r3, #0
  96022. 80269cc: d030 beq.n 8026a30 <keepalive+0x96>
  96023. {
  96024. if (c->ping_outstanding)
  96025. 80269ce: 687b ldr r3, [r7, #4]
  96026. 80269d0: 7f1b ldrb r3, [r3, #28]
  96027. 80269d2: 2b00 cmp r3, #0
  96028. 80269d4: d003 beq.n 80269de <keepalive+0x44>
  96029. rc = FAILURE; /* PINGRESP not received in keepalive interval */
  96030. 80269d6: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96031. 80269da: 617b str r3, [r7, #20]
  96032. 80269dc: e029 b.n 8026a32 <keepalive+0x98>
  96033. else
  96034. {
  96035. Timer timer;
  96036. TimerInit(&timer);
  96037. 80269de: f107 0308 add.w r3, r7, #8
  96038. 80269e2: 4618 mov r0, r3
  96039. 80269e4: f000 fca6 bl 8027334 <TimerInit>
  96040. TimerCountdownMS(&timer, 1000);
  96041. 80269e8: f107 0308 add.w r3, r7, #8
  96042. 80269ec: f44f 717a mov.w r1, #1000 @ 0x3e8
  96043. 80269f0: 4618 mov r0, r3
  96044. 80269f2: f000 fc5d bl 80272b0 <TimerCountdownMS>
  96045. int len = MQTTSerialize_pingreq(c->buf, c->buf_size);
  96046. 80269f6: 687b ldr r3, [r7, #4]
  96047. 80269f8: 691a ldr r2, [r3, #16]
  96048. 80269fa: 687b ldr r3, [r7, #4]
  96049. 80269fc: 689b ldr r3, [r3, #8]
  96050. 80269fe: 4619 mov r1, r3
  96051. 8026a00: 4610 mov r0, r2
  96052. 8026a02: f000 ff34 bl 802786e <MQTTSerialize_pingreq>
  96053. 8026a06: 6138 str r0, [r7, #16]
  96054. if (len > 0 && (rc = sendPacket(c, len, &timer)) == MQTT_SUCCESS) // send the ping packet
  96055. 8026a08: 693b ldr r3, [r7, #16]
  96056. 8026a0a: 2b00 cmp r3, #0
  96057. 8026a0c: dd11 ble.n 8026a32 <keepalive+0x98>
  96058. 8026a0e: f107 0308 add.w r3, r7, #8
  96059. 8026a12: 461a mov r2, r3
  96060. 8026a14: 6939 ldr r1, [r7, #16]
  96061. 8026a16: 6878 ldr r0, [r7, #4]
  96062. 8026a18: f7ff fd8b bl 8026532 <sendPacket>
  96063. 8026a1c: 6178 str r0, [r7, #20]
  96064. 8026a1e: 697b ldr r3, [r7, #20]
  96065. 8026a20: 2b00 cmp r3, #0
  96066. 8026a22: d106 bne.n 8026a32 <keepalive+0x98>
  96067. c->ping_outstanding = 1;
  96068. 8026a24: 687b ldr r3, [r7, #4]
  96069. 8026a26: 2201 movs r2, #1
  96070. 8026a28: 771a strb r2, [r3, #28]
  96071. 8026a2a: e002 b.n 8026a32 <keepalive+0x98>
  96072. goto exit;
  96073. 8026a2c: bf00 nop
  96074. 8026a2e: e000 b.n 8026a32 <keepalive+0x98>
  96075. }
  96076. }
  96077. exit:
  96078. 8026a30: bf00 nop
  96079. return rc;
  96080. 8026a32: 697b ldr r3, [r7, #20]
  96081. }
  96082. 8026a34: 4618 mov r0, r3
  96083. 8026a36: 3718 adds r7, #24
  96084. 8026a38: 46bd mov sp, r7
  96085. 8026a3a: bd80 pop {r7, pc}
  96086. 08026a3c <MQTTCleanSession>:
  96087. void MQTTCleanSession(MQTTClient* c)
  96088. {
  96089. 8026a3c: b480 push {r7}
  96090. 8026a3e: b085 sub sp, #20
  96091. 8026a40: af00 add r7, sp, #0
  96092. 8026a42: 6078 str r0, [r7, #4]
  96093. int i = 0;
  96094. 8026a44: 2300 movs r3, #0
  96095. 8026a46: 60fb str r3, [r7, #12]
  96096. for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
  96097. 8026a48: 2300 movs r3, #0
  96098. 8026a4a: 60fb str r3, [r7, #12]
  96099. 8026a4c: e008 b.n 8026a60 <MQTTCleanSession+0x24>
  96100. c->messageHandlers[i].topicFilter = NULL;
  96101. 8026a4e: 687b ldr r3, [r7, #4]
  96102. 8026a50: 68fa ldr r2, [r7, #12]
  96103. 8026a52: 3205 adds r2, #5
  96104. 8026a54: 2100 movs r1, #0
  96105. 8026a56: f843 1032 str.w r1, [r3, r2, lsl #3]
  96106. for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
  96107. 8026a5a: 68fb ldr r3, [r7, #12]
  96108. 8026a5c: 3301 adds r3, #1
  96109. 8026a5e: 60fb str r3, [r7, #12]
  96110. 8026a60: 68fb ldr r3, [r7, #12]
  96111. 8026a62: 2b04 cmp r3, #4
  96112. 8026a64: ddf3 ble.n 8026a4e <MQTTCleanSession+0x12>
  96113. }
  96114. 8026a66: bf00 nop
  96115. 8026a68: bf00 nop
  96116. 8026a6a: 3714 adds r7, #20
  96117. 8026a6c: 46bd mov sp, r7
  96118. 8026a6e: f85d 7b04 ldr.w r7, [sp], #4
  96119. 8026a72: 4770 bx lr
  96120. 08026a74 <MQTTCloseSession>:
  96121. void MQTTCloseSession(MQTTClient* c)
  96122. {
  96123. 8026a74: b580 push {r7, lr}
  96124. 8026a76: b082 sub sp, #8
  96125. 8026a78: af00 add r7, sp, #0
  96126. 8026a7a: 6078 str r0, [r7, #4]
  96127. c->ping_outstanding = 0;
  96128. 8026a7c: 687b ldr r3, [r7, #4]
  96129. 8026a7e: 2200 movs r2, #0
  96130. 8026a80: 771a strb r2, [r3, #28]
  96131. c->isconnected = 0;
  96132. 8026a82: 687b ldr r3, [r7, #4]
  96133. 8026a84: 2200 movs r2, #0
  96134. 8026a86: 621a str r2, [r3, #32]
  96135. if (c->cleansession)
  96136. 8026a88: 687b ldr r3, [r7, #4]
  96137. 8026a8a: 6a5b ldr r3, [r3, #36] @ 0x24
  96138. 8026a8c: 2b00 cmp r3, #0
  96139. 8026a8e: d002 beq.n 8026a96 <MQTTCloseSession+0x22>
  96140. MQTTCleanSession(c);
  96141. 8026a90: 6878 ldr r0, [r7, #4]
  96142. 8026a92: f7ff ffd3 bl 8026a3c <MQTTCleanSession>
  96143. }
  96144. 8026a96: bf00 nop
  96145. 8026a98: 3708 adds r7, #8
  96146. 8026a9a: 46bd mov sp, r7
  96147. 8026a9c: bd80 pop {r7, pc}
  96148. ...
  96149. 08026aa0 <cycle>:
  96150. int cycle(MQTTClient* c, Timer* timer)
  96151. {
  96152. 8026aa0: b5f0 push {r4, r5, r6, r7, lr}
  96153. 8026aa2: b095 sub sp, #84 @ 0x54
  96154. 8026aa4: af06 add r7, sp, #24
  96155. 8026aa6: 6078 str r0, [r7, #4]
  96156. 8026aa8: 6039 str r1, [r7, #0]
  96157. int len = 0,
  96158. 8026aaa: 2300 movs r3, #0
  96159. 8026aac: 637b str r3, [r7, #52] @ 0x34
  96160. rc = MQTT_SUCCESS;
  96161. 8026aae: 2300 movs r3, #0
  96162. 8026ab0: 633b str r3, [r7, #48] @ 0x30
  96163. int packet_type = readPacket(c, timer); /* read the socket, see what work is due */
  96164. 8026ab2: 6839 ldr r1, [r7, #0]
  96165. 8026ab4: 6878 ldr r0, [r7, #4]
  96166. 8026ab6: f7ff fe1b bl 80266f0 <readPacket>
  96167. 8026aba: 62f8 str r0, [r7, #44] @ 0x2c
  96168. switch (packet_type)
  96169. 8026abc: 6afb ldr r3, [r7, #44] @ 0x2c
  96170. 8026abe: 2b0d cmp r3, #13
  96171. 8026ac0: d81e bhi.n 8026b00 <cycle+0x60>
  96172. 8026ac2: a201 add r2, pc, #4 @ (adr r2, 8026ac8 <cycle+0x28>)
  96173. 8026ac4: f852 f023 ldr.w pc, [r2, r3, lsl #2]
  96174. 8026ac8: 08026c57 .word 0x08026c57
  96175. 8026acc: 08026b01 .word 0x08026b01
  96176. 8026ad0: 08026c57 .word 0x08026c57
  96177. 8026ad4: 08026b07 .word 0x08026b07
  96178. 8026ad8: 08026c57 .word 0x08026c57
  96179. 8026adc: 08026bd3 .word 0x08026bd3
  96180. 8026ae0: 08026bd3 .word 0x08026bd3
  96181. 8026ae4: 08026c57 .word 0x08026c57
  96182. 8026ae8: 08026b01 .word 0x08026b01
  96183. 8026aec: 08026c57 .word 0x08026c57
  96184. 8026af0: 08026b01 .word 0x08026b01
  96185. 8026af4: 08026c57 .word 0x08026c57
  96186. 8026af8: 08026b01 .word 0x08026b01
  96187. 8026afc: 08026c4f .word 0x08026c4f
  96188. {
  96189. default:
  96190. /* no more data to read, unrecoverable. Or read packet fails due to unexpected network error */
  96191. rc = packet_type;
  96192. 8026b00: 6afb ldr r3, [r7, #44] @ 0x2c
  96193. 8026b02: 633b str r3, [r7, #48] @ 0x30
  96194. goto exit;
  96195. 8026b04: e0b9 b.n 8026c7a <cycle+0x1da>
  96196. case PUBLISH:
  96197. {
  96198. MQTTString topicName;
  96199. MQTTMessage msg;
  96200. int intQoS;
  96201. msg.payloadlen = 0; /* this is a size_t, but deserialize publish sets this as int */
  96202. 8026b06: 2300 movs r3, #0
  96203. 8026b08: 61fb str r3, [r7, #28]
  96204. if (MQTTDeserialize_publish(&msg.dup, &intQoS, &msg.retained, &msg.id, &topicName,
  96205. 8026b0a: 687b ldr r3, [r7, #4]
  96206. 8026b0c: 695b ldr r3, [r3, #20]
  96207. (unsigned char**)&msg.payload, (int*)&msg.payloadlen, c->readbuf, c->readbuf_size) != 1)
  96208. 8026b0e: 687a ldr r2, [r7, #4]
  96209. 8026b10: 68d2 ldr r2, [r2, #12]
  96210. if (MQTTDeserialize_publish(&msg.dup, &intQoS, &msg.retained, &msg.id, &topicName,
  96211. 8026b12: 4616 mov r6, r2
  96212. 8026b14: f107 0210 add.w r2, r7, #16
  96213. 8026b18: 1d15 adds r5, r2, #4
  96214. 8026b1a: f107 0210 add.w r2, r7, #16
  96215. 8026b1e: 1c54 adds r4, r2, #1
  96216. 8026b20: f107 010c add.w r1, r7, #12
  96217. 8026b24: f107 0210 add.w r2, r7, #16
  96218. 8026b28: 1c90 adds r0, r2, #2
  96219. 8026b2a: 9604 str r6, [sp, #16]
  96220. 8026b2c: 9303 str r3, [sp, #12]
  96221. 8026b2e: f107 0310 add.w r3, r7, #16
  96222. 8026b32: 330c adds r3, #12
  96223. 8026b34: 9302 str r3, [sp, #8]
  96224. 8026b36: f107 0310 add.w r3, r7, #16
  96225. 8026b3a: 3308 adds r3, #8
  96226. 8026b3c: 9301 str r3, [sp, #4]
  96227. 8026b3e: f107 0320 add.w r3, r7, #32
  96228. 8026b42: 9300 str r3, [sp, #0]
  96229. 8026b44: 462b mov r3, r5
  96230. 8026b46: 4622 mov r2, r4
  96231. 8026b48: f000 fea0 bl 802788c <MQTTDeserialize_publish>
  96232. 8026b4c: 4603 mov r3, r0
  96233. 8026b4e: 2b01 cmp r3, #1
  96234. 8026b50: f040 8090 bne.w 8026c74 <cycle+0x1d4>
  96235. goto exit;
  96236. msg.qos = (enum QoS)intQoS;
  96237. 8026b54: 68fb ldr r3, [r7, #12]
  96238. 8026b56: b2db uxtb r3, r3
  96239. 8026b58: 743b strb r3, [r7, #16]
  96240. deliverMessage(c, &topicName, &msg);
  96241. 8026b5a: f107 0210 add.w r2, r7, #16
  96242. 8026b5e: f107 0320 add.w r3, r7, #32
  96243. 8026b62: 4619 mov r1, r3
  96244. 8026b64: 6878 ldr r0, [r7, #4]
  96245. 8026b66: f7ff feb0 bl 80268ca <deliverMessage>
  96246. if (msg.qos != QOS0)
  96247. 8026b6a: 7c3b ldrb r3, [r7, #16]
  96248. 8026b6c: 2b00 cmp r3, #0
  96249. 8026b6e: d074 beq.n 8026c5a <cycle+0x1ba>
  96250. {
  96251. if (msg.qos == QOS1)
  96252. 8026b70: 7c3b ldrb r3, [r7, #16]
  96253. 8026b72: 2b01 cmp r3, #1
  96254. 8026b74: d10c bne.n 8026b90 <cycle+0xf0>
  96255. len = MQTTSerialize_ack(c->buf, c->buf_size, PUBACK, 0, msg.id);
  96256. 8026b76: 687b ldr r3, [r7, #4]
  96257. 8026b78: 6918 ldr r0, [r3, #16]
  96258. 8026b7a: 687b ldr r3, [r7, #4]
  96259. 8026b7c: 689b ldr r3, [r3, #8]
  96260. 8026b7e: 4619 mov r1, r3
  96261. 8026b80: 8abb ldrh r3, [r7, #20]
  96262. 8026b82: 9300 str r3, [sp, #0]
  96263. 8026b84: 2300 movs r3, #0
  96264. 8026b86: 2204 movs r2, #4
  96265. 8026b88: f001 f9d9 bl 8027f3e <MQTTSerialize_ack>
  96266. 8026b8c: 6378 str r0, [r7, #52] @ 0x34
  96267. 8026b8e: e00e b.n 8026bae <cycle+0x10e>
  96268. else if (msg.qos == QOS2)
  96269. 8026b90: 7c3b ldrb r3, [r7, #16]
  96270. 8026b92: 2b02 cmp r3, #2
  96271. 8026b94: d10b bne.n 8026bae <cycle+0x10e>
  96272. len = MQTTSerialize_ack(c->buf, c->buf_size, PUBREC, 0, msg.id);
  96273. 8026b96: 687b ldr r3, [r7, #4]
  96274. 8026b98: 6918 ldr r0, [r3, #16]
  96275. 8026b9a: 687b ldr r3, [r7, #4]
  96276. 8026b9c: 689b ldr r3, [r3, #8]
  96277. 8026b9e: 4619 mov r1, r3
  96278. 8026ba0: 8abb ldrh r3, [r7, #20]
  96279. 8026ba2: 9300 str r3, [sp, #0]
  96280. 8026ba4: 2300 movs r3, #0
  96281. 8026ba6: 2205 movs r2, #5
  96282. 8026ba8: f001 f9c9 bl 8027f3e <MQTTSerialize_ack>
  96283. 8026bac: 6378 str r0, [r7, #52] @ 0x34
  96284. if (len <= 0)
  96285. 8026bae: 6b7b ldr r3, [r7, #52] @ 0x34
  96286. 8026bb0: 2b00 cmp r3, #0
  96287. 8026bb2: dc03 bgt.n 8026bbc <cycle+0x11c>
  96288. rc = FAILURE;
  96289. 8026bb4: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96290. 8026bb8: 633b str r3, [r7, #48] @ 0x30
  96291. 8026bba: e005 b.n 8026bc8 <cycle+0x128>
  96292. else
  96293. rc = sendPacket(c, len, timer);
  96294. 8026bbc: 683a ldr r2, [r7, #0]
  96295. 8026bbe: 6b79 ldr r1, [r7, #52] @ 0x34
  96296. 8026bc0: 6878 ldr r0, [r7, #4]
  96297. 8026bc2: f7ff fcb6 bl 8026532 <sendPacket>
  96298. 8026bc6: 6338 str r0, [r7, #48] @ 0x30
  96299. if (rc == FAILURE)
  96300. 8026bc8: 6b3b ldr r3, [r7, #48] @ 0x30
  96301. 8026bca: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  96302. 8026bce: d144 bne.n 8026c5a <cycle+0x1ba>
  96303. goto exit; // there was a problem
  96304. 8026bd0: e053 b.n 8026c7a <cycle+0x1da>
  96305. case PUBREC:
  96306. case PUBREL:
  96307. {
  96308. unsigned short mypacketid;
  96309. unsigned char dup, type;
  96310. if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)
  96311. 8026bd2: 687b ldr r3, [r7, #4]
  96312. 8026bd4: 695c ldr r4, [r3, #20]
  96313. 8026bd6: 687b ldr r3, [r7, #4]
  96314. 8026bd8: 68db ldr r3, [r3, #12]
  96315. 8026bda: f107 020a add.w r2, r7, #10
  96316. 8026bde: f107 0109 add.w r1, r7, #9
  96317. 8026be2: f107 0008 add.w r0, r7, #8
  96318. 8026be6: 9300 str r3, [sp, #0]
  96319. 8026be8: 4623 mov r3, r4
  96320. 8026bea: f000 fec1 bl 8027970 <MQTTDeserialize_ack>
  96321. 8026bee: 4603 mov r3, r0
  96322. 8026bf0: 2b01 cmp r3, #1
  96323. 8026bf2: d003 beq.n 8026bfc <cycle+0x15c>
  96324. rc = FAILURE;
  96325. 8026bf4: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96326. 8026bf8: 633b str r3, [r7, #48] @ 0x30
  96327. 8026bfa: e023 b.n 8026c44 <cycle+0x1a4>
  96328. else if ((len = MQTTSerialize_ack(c->buf, c->buf_size,
  96329. 8026bfc: 687b ldr r3, [r7, #4]
  96330. 8026bfe: 6918 ldr r0, [r3, #16]
  96331. 8026c00: 687b ldr r3, [r7, #4]
  96332. 8026c02: 689b ldr r3, [r3, #8]
  96333. 8026c04: 4619 mov r1, r3
  96334. 8026c06: 6afb ldr r3, [r7, #44] @ 0x2c
  96335. 8026c08: 2b05 cmp r3, #5
  96336. 8026c0a: d101 bne.n 8026c10 <cycle+0x170>
  96337. 8026c0c: 2206 movs r2, #6
  96338. 8026c0e: e000 b.n 8026c12 <cycle+0x172>
  96339. 8026c10: 2207 movs r2, #7
  96340. 8026c12: 897b ldrh r3, [r7, #10]
  96341. 8026c14: 9300 str r3, [sp, #0]
  96342. 8026c16: 2300 movs r3, #0
  96343. 8026c18: f001 f991 bl 8027f3e <MQTTSerialize_ack>
  96344. 8026c1c: 6378 str r0, [r7, #52] @ 0x34
  96345. 8026c1e: 6b7b ldr r3, [r7, #52] @ 0x34
  96346. 8026c20: 2b00 cmp r3, #0
  96347. 8026c22: dc03 bgt.n 8026c2c <cycle+0x18c>
  96348. (packet_type == PUBREC) ? PUBREL : PUBCOMP, 0, mypacketid)) <= 0)
  96349. rc = FAILURE;
  96350. 8026c24: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96351. 8026c28: 633b str r3, [r7, #48] @ 0x30
  96352. 8026c2a: e00b b.n 8026c44 <cycle+0x1a4>
  96353. else if ((rc = sendPacket(c, len, timer)) != MQTT_SUCCESS) // send the PUBREL packet
  96354. 8026c2c: 683a ldr r2, [r7, #0]
  96355. 8026c2e: 6b79 ldr r1, [r7, #52] @ 0x34
  96356. 8026c30: 6878 ldr r0, [r7, #4]
  96357. 8026c32: f7ff fc7e bl 8026532 <sendPacket>
  96358. 8026c36: 6338 str r0, [r7, #48] @ 0x30
  96359. 8026c38: 6b3b ldr r3, [r7, #48] @ 0x30
  96360. 8026c3a: 2b00 cmp r3, #0
  96361. 8026c3c: d002 beq.n 8026c44 <cycle+0x1a4>
  96362. rc = FAILURE; // there was a problem
  96363. 8026c3e: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96364. 8026c42: 633b str r3, [r7, #48] @ 0x30
  96365. if (rc == FAILURE)
  96366. 8026c44: 6b3b ldr r3, [r7, #48] @ 0x30
  96367. 8026c46: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  96368. 8026c4a: d108 bne.n 8026c5e <cycle+0x1be>
  96369. goto exit; // there was a problem
  96370. 8026c4c: e015 b.n 8026c7a <cycle+0x1da>
  96371. }
  96372. case PUBCOMP:
  96373. break;
  96374. case PINGRESP:
  96375. c->ping_outstanding = 0;
  96376. 8026c4e: 687b ldr r3, [r7, #4]
  96377. 8026c50: 2200 movs r2, #0
  96378. 8026c52: 771a strb r2, [r3, #28]
  96379. break;
  96380. 8026c54: e004 b.n 8026c60 <cycle+0x1c0>
  96381. break;
  96382. 8026c56: bf00 nop
  96383. 8026c58: e002 b.n 8026c60 <cycle+0x1c0>
  96384. break;
  96385. 8026c5a: bf00 nop
  96386. 8026c5c: e000 b.n 8026c60 <cycle+0x1c0>
  96387. break;
  96388. 8026c5e: bf00 nop
  96389. }
  96390. if (keepalive(c) != MQTT_SUCCESS) {
  96391. 8026c60: 6878 ldr r0, [r7, #4]
  96392. 8026c62: f7ff fe9a bl 802699a <keepalive>
  96393. 8026c66: 4603 mov r3, r0
  96394. 8026c68: 2b00 cmp r3, #0
  96395. 8026c6a: d005 beq.n 8026c78 <cycle+0x1d8>
  96396. //check only keepalive FAILURE status so that previous FAILURE status can be considered as FAULT
  96397. rc = FAILURE;
  96398. 8026c6c: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96399. 8026c70: 633b str r3, [r7, #48] @ 0x30
  96400. 8026c72: e002 b.n 8026c7a <cycle+0x1da>
  96401. goto exit;
  96402. 8026c74: bf00 nop
  96403. 8026c76: e000 b.n 8026c7a <cycle+0x1da>
  96404. }
  96405. exit:
  96406. 8026c78: bf00 nop
  96407. if (rc == MQTT_SUCCESS)
  96408. 8026c7a: 6b3b ldr r3, [r7, #48] @ 0x30
  96409. 8026c7c: 2b00 cmp r3, #0
  96410. 8026c7e: d102 bne.n 8026c86 <cycle+0x1e6>
  96411. rc = packet_type;
  96412. 8026c80: 6afb ldr r3, [r7, #44] @ 0x2c
  96413. 8026c82: 633b str r3, [r7, #48] @ 0x30
  96414. 8026c84: e006 b.n 8026c94 <cycle+0x1f4>
  96415. else if (c->isconnected)
  96416. 8026c86: 687b ldr r3, [r7, #4]
  96417. 8026c88: 6a1b ldr r3, [r3, #32]
  96418. 8026c8a: 2b00 cmp r3, #0
  96419. 8026c8c: d002 beq.n 8026c94 <cycle+0x1f4>
  96420. MQTTCloseSession(c);
  96421. 8026c8e: 6878 ldr r0, [r7, #4]
  96422. 8026c90: f7ff fef0 bl 8026a74 <MQTTCloseSession>
  96423. return rc;
  96424. 8026c94: 6b3b ldr r3, [r7, #48] @ 0x30
  96425. }
  96426. 8026c96: 4618 mov r0, r3
  96427. 8026c98: 373c adds r7, #60 @ 0x3c
  96428. 8026c9a: 46bd mov sp, r7
  96429. 8026c9c: bdf0 pop {r4, r5, r6, r7, pc}
  96430. 8026c9e: bf00 nop
  96431. 08026ca0 <MQTTYield>:
  96432. int MQTTYield(MQTTClient* c, int timeout_ms)
  96433. {
  96434. 8026ca0: b580 push {r7, lr}
  96435. 8026ca2: b086 sub sp, #24
  96436. 8026ca4: af00 add r7, sp, #0
  96437. 8026ca6: 6078 str r0, [r7, #4]
  96438. 8026ca8: 6039 str r1, [r7, #0]
  96439. int rc = MQTT_SUCCESS;
  96440. 8026caa: 2300 movs r3, #0
  96441. 8026cac: 617b str r3, [r7, #20]
  96442. Timer timer;
  96443. TimerInit(&timer);
  96444. 8026cae: f107 030c add.w r3, r7, #12
  96445. 8026cb2: 4618 mov r0, r3
  96446. 8026cb4: f000 fb3e bl 8027334 <TimerInit>
  96447. TimerCountdownMS(&timer, timeout_ms);
  96448. 8026cb8: 683a ldr r2, [r7, #0]
  96449. 8026cba: f107 030c add.w r3, r7, #12
  96450. 8026cbe: 4611 mov r1, r2
  96451. 8026cc0: 4618 mov r0, r3
  96452. 8026cc2: f000 faf5 bl 80272b0 <TimerCountdownMS>
  96453. do
  96454. {
  96455. if (cycle(c, &timer) < 0)
  96456. 8026cc6: f107 030c add.w r3, r7, #12
  96457. 8026cca: 4619 mov r1, r3
  96458. 8026ccc: 6878 ldr r0, [r7, #4]
  96459. 8026cce: f7ff fee7 bl 8026aa0 <cycle>
  96460. 8026cd2: 4603 mov r3, r0
  96461. 8026cd4: 2b00 cmp r3, #0
  96462. 8026cd6: da03 bge.n 8026ce0 <MQTTYield+0x40>
  96463. {
  96464. rc = FAILURE;
  96465. 8026cd8: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96466. 8026cdc: 617b str r3, [r7, #20]
  96467. break;
  96468. 8026cde: e007 b.n 8026cf0 <MQTTYield+0x50>
  96469. }
  96470. } while (!TimerIsExpired(&timer));
  96471. 8026ce0: f107 030c add.w r3, r7, #12
  96472. 8026ce4: 4618 mov r0, r3
  96473. 8026ce6: f000 facd bl 8027284 <TimerIsExpired>
  96474. 8026cea: 4603 mov r3, r0
  96475. 8026cec: 2b00 cmp r3, #0
  96476. 8026cee: d0ea beq.n 8026cc6 <MQTTYield+0x26>
  96477. return rc;
  96478. 8026cf0: 697b ldr r3, [r7, #20]
  96479. }
  96480. 8026cf2: 4618 mov r0, r3
  96481. 8026cf4: 3718 adds r7, #24
  96482. 8026cf6: 46bd mov sp, r7
  96483. 8026cf8: bd80 pop {r7, pc}
  96484. 08026cfa <waitfor>:
  96485. }
  96486. #endif
  96487. int waitfor(MQTTClient* c, int packet_type, Timer* timer)
  96488. {
  96489. 8026cfa: b580 push {r7, lr}
  96490. 8026cfc: b086 sub sp, #24
  96491. 8026cfe: af00 add r7, sp, #0
  96492. 8026d00: 60f8 str r0, [r7, #12]
  96493. 8026d02: 60b9 str r1, [r7, #8]
  96494. 8026d04: 607a str r2, [r7, #4]
  96495. int rc = FAILURE;
  96496. 8026d06: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96497. 8026d0a: 617b str r3, [r7, #20]
  96498. do
  96499. {
  96500. if (TimerIsExpired(timer))
  96501. 8026d0c: 6878 ldr r0, [r7, #4]
  96502. 8026d0e: f000 fab9 bl 8027284 <TimerIsExpired>
  96503. 8026d12: 4603 mov r3, r0
  96504. 8026d14: 2b00 cmp r3, #0
  96505. 8026d16: d10c bne.n 8026d32 <waitfor+0x38>
  96506. break; // we timed out
  96507. rc = cycle(c, timer);
  96508. 8026d18: 6879 ldr r1, [r7, #4]
  96509. 8026d1a: 68f8 ldr r0, [r7, #12]
  96510. 8026d1c: f7ff fec0 bl 8026aa0 <cycle>
  96511. 8026d20: 6178 str r0, [r7, #20]
  96512. }
  96513. while (rc != packet_type && rc >= 0);
  96514. 8026d22: 697a ldr r2, [r7, #20]
  96515. 8026d24: 68bb ldr r3, [r7, #8]
  96516. 8026d26: 429a cmp r2, r3
  96517. 8026d28: d004 beq.n 8026d34 <waitfor+0x3a>
  96518. 8026d2a: 697b ldr r3, [r7, #20]
  96519. 8026d2c: 2b00 cmp r3, #0
  96520. 8026d2e: daed bge.n 8026d0c <waitfor+0x12>
  96521. 8026d30: e000 b.n 8026d34 <waitfor+0x3a>
  96522. break; // we timed out
  96523. 8026d32: bf00 nop
  96524. return rc;
  96525. 8026d34: 697b ldr r3, [r7, #20]
  96526. }
  96527. 8026d36: 4618 mov r0, r3
  96528. 8026d38: 3718 adds r7, #24
  96529. 8026d3a: 46bd mov sp, r7
  96530. 8026d3c: bd80 pop {r7, pc}
  96531. ...
  96532. 08026d40 <MQTTConnectWithResults>:
  96533. int MQTTConnectWithResults(MQTTClient* c, MQTTPacket_connectData* options, MQTTConnackData* data)
  96534. {
  96535. 8026d40: b580 push {r7, lr}
  96536. 8026d42: b09e sub sp, #120 @ 0x78
  96537. 8026d44: af00 add r7, sp, #0
  96538. 8026d46: 60f8 str r0, [r7, #12]
  96539. 8026d48: 60b9 str r1, [r7, #8]
  96540. 8026d4a: 607a str r2, [r7, #4]
  96541. Timer connect_timer;
  96542. int rc = FAILURE;
  96543. 8026d4c: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96544. 8026d50: 677b str r3, [r7, #116] @ 0x74
  96545. MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer;
  96546. 8026d52: 4a49 ldr r2, [pc, #292] @ (8026e78 <MQTTConnectWithResults+0x138>)
  96547. 8026d54: f107 0310 add.w r3, r7, #16
  96548. 8026d58: 4611 mov r1, r2
  96549. 8026d5a: 2258 movs r2, #88 @ 0x58
  96550. 8026d5c: 4618 mov r0, r3
  96551. 8026d5e: f003 f8be bl 8029ede <memcpy>
  96552. int len = 0;
  96553. 8026d62: 2300 movs r3, #0
  96554. 8026d64: 673b str r3, [r7, #112] @ 0x70
  96555. #if defined(MQTT_TASK)
  96556. MutexLock(&c->mutex);
  96557. #endif
  96558. // osMutexAcquire(mqttMutex, osWaitForever);
  96559. osMutexAcquire(c->mutex, osWaitForever);
  96560. 8026d66: 68fb ldr r3, [r7, #12]
  96561. 8026d68: 6e9b ldr r3, [r3, #104] @ 0x68
  96562. 8026d6a: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  96563. 8026d6e: 4618 mov r0, r3
  96564. 8026d70: f7e9 fea8 bl 8010ac4 <osMutexAcquire>
  96565. if (c->isconnected) /* don't send connect packet again if we are already connected */
  96566. 8026d74: 68fb ldr r3, [r7, #12]
  96567. 8026d76: 6a1b ldr r3, [r3, #32]
  96568. 8026d78: 2b00 cmp r3, #0
  96569. 8026d7a: d164 bne.n 8026e46 <MQTTConnectWithResults+0x106>
  96570. goto exit;
  96571. TimerInit(&connect_timer);
  96572. 8026d7c: f107 0368 add.w r3, r7, #104 @ 0x68
  96573. 8026d80: 4618 mov r0, r3
  96574. 8026d82: f000 fad7 bl 8027334 <TimerInit>
  96575. TimerCountdownMS(&connect_timer, c->command_timeout_ms);
  96576. 8026d86: 68fb ldr r3, [r7, #12]
  96577. 8026d88: 685a ldr r2, [r3, #4]
  96578. 8026d8a: f107 0368 add.w r3, r7, #104 @ 0x68
  96579. 8026d8e: 4611 mov r1, r2
  96580. 8026d90: 4618 mov r0, r3
  96581. 8026d92: f000 fa8d bl 80272b0 <TimerCountdownMS>
  96582. if (options == 0)
  96583. 8026d96: 68bb ldr r3, [r7, #8]
  96584. 8026d98: 2b00 cmp r3, #0
  96585. 8026d9a: d102 bne.n 8026da2 <MQTTConnectWithResults+0x62>
  96586. options = &default_options; /* set default options if none were supplied */
  96587. 8026d9c: f107 0310 add.w r3, r7, #16
  96588. 8026da0: 60bb str r3, [r7, #8]
  96589. c->keepAliveInterval = options->keepAliveInterval;
  96590. 8026da2: 68bb ldr r3, [r7, #8]
  96591. 8026da4: 8b1b ldrh r3, [r3, #24]
  96592. 8026da6: 461a mov r2, r3
  96593. 8026da8: 68fb ldr r3, [r7, #12]
  96594. 8026daa: 619a str r2, [r3, #24]
  96595. c->cleansession = options->cleansession;
  96596. 8026dac: 68bb ldr r3, [r7, #8]
  96597. 8026dae: 7e9b ldrb r3, [r3, #26]
  96598. 8026db0: 461a mov r2, r3
  96599. 8026db2: 68fb ldr r3, [r7, #12]
  96600. 8026db4: 625a str r2, [r3, #36] @ 0x24
  96601. TimerCountdown(&c->last_received, c->keepAliveInterval);
  96602. 8026db6: 68fb ldr r3, [r7, #12]
  96603. 8026db8: f103 0260 add.w r2, r3, #96 @ 0x60
  96604. 8026dbc: 68fb ldr r3, [r7, #12]
  96605. 8026dbe: 699b ldr r3, [r3, #24]
  96606. 8026dc0: 4619 mov r1, r3
  96607. 8026dc2: 4610 mov r0, r2
  96608. 8026dc4: f000 fa88 bl 80272d8 <TimerCountdown>
  96609. if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0)
  96610. 8026dc8: 68fb ldr r3, [r7, #12]
  96611. 8026dca: 6918 ldr r0, [r3, #16]
  96612. 8026dcc: 68fb ldr r3, [r7, #12]
  96613. 8026dce: 689b ldr r3, [r3, #8]
  96614. 8026dd0: 68ba ldr r2, [r7, #8]
  96615. 8026dd2: 4619 mov r1, r3
  96616. 8026dd4: f000 fbd2 bl 802757c <MQTTSerialize_connect>
  96617. 8026dd8: 6738 str r0, [r7, #112] @ 0x70
  96618. 8026dda: 6f3b ldr r3, [r7, #112] @ 0x70
  96619. 8026ddc: 2b00 cmp r3, #0
  96620. 8026dde: dd34 ble.n 8026e4a <MQTTConnectWithResults+0x10a>
  96621. goto exit;
  96622. if ((rc = sendPacket(c, len, &connect_timer)) != MQTT_SUCCESS) // send the connect packet
  96623. 8026de0: f107 0368 add.w r3, r7, #104 @ 0x68
  96624. 8026de4: 461a mov r2, r3
  96625. 8026de6: 6f39 ldr r1, [r7, #112] @ 0x70
  96626. 8026de8: 68f8 ldr r0, [r7, #12]
  96627. 8026dea: f7ff fba2 bl 8026532 <sendPacket>
  96628. 8026dee: 6778 str r0, [r7, #116] @ 0x74
  96629. 8026df0: 6f7b ldr r3, [r7, #116] @ 0x74
  96630. 8026df2: 2b00 cmp r3, #0
  96631. 8026df4: d12b bne.n 8026e4e <MQTTConnectWithResults+0x10e>
  96632. goto exit; // there was a problem
  96633. // this will be a blocking call, wait for the connack
  96634. if (waitfor(c, CONNACK, &connect_timer) == CONNACK)
  96635. 8026df6: f107 0368 add.w r3, r7, #104 @ 0x68
  96636. 8026dfa: 461a mov r2, r3
  96637. 8026dfc: 2102 movs r1, #2
  96638. 8026dfe: 68f8 ldr r0, [r7, #12]
  96639. 8026e00: f7ff ff7b bl 8026cfa <waitfor>
  96640. 8026e04: 4603 mov r3, r0
  96641. 8026e06: 2b02 cmp r3, #2
  96642. 8026e08: d119 bne.n 8026e3e <MQTTConnectWithResults+0xfe>
  96643. {
  96644. data->rc = 0;
  96645. 8026e0a: 687b ldr r3, [r7, #4]
  96646. 8026e0c: 2200 movs r2, #0
  96647. 8026e0e: 701a strb r2, [r3, #0]
  96648. data->sessionPresent = 0;
  96649. 8026e10: 687b ldr r3, [r7, #4]
  96650. 8026e12: 2200 movs r2, #0
  96651. 8026e14: 705a strb r2, [r3, #1]
  96652. if (MQTTDeserialize_connack(&data->sessionPresent, &data->rc, c->readbuf, c->readbuf_size) == 1)
  96653. 8026e16: 687b ldr r3, [r7, #4]
  96654. 8026e18: 1c58 adds r0, r3, #1
  96655. 8026e1a: 6879 ldr r1, [r7, #4]
  96656. 8026e1c: 68fb ldr r3, [r7, #12]
  96657. 8026e1e: 695a ldr r2, [r3, #20]
  96658. 8026e20: 68fb ldr r3, [r7, #12]
  96659. 8026e22: 68db ldr r3, [r3, #12]
  96660. 8026e24: f000 fc96 bl 8027754 <MQTTDeserialize_connack>
  96661. 8026e28: 4603 mov r3, r0
  96662. 8026e2a: 2b01 cmp r3, #1
  96663. 8026e2c: d103 bne.n 8026e36 <MQTTConnectWithResults+0xf6>
  96664. rc = data->rc;
  96665. 8026e2e: 687b ldr r3, [r7, #4]
  96666. 8026e30: 781b ldrb r3, [r3, #0]
  96667. 8026e32: 677b str r3, [r7, #116] @ 0x74
  96668. 8026e34: e00c b.n 8026e50 <MQTTConnectWithResults+0x110>
  96669. // rc = MQTT_SUCCESS;
  96670. else
  96671. rc = FAILURE;
  96672. 8026e36: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96673. 8026e3a: 677b str r3, [r7, #116] @ 0x74
  96674. 8026e3c: e008 b.n 8026e50 <MQTTConnectWithResults+0x110>
  96675. }
  96676. else
  96677. rc = FAILURE;
  96678. 8026e3e: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96679. 8026e42: 677b str r3, [r7, #116] @ 0x74
  96680. 8026e44: e004 b.n 8026e50 <MQTTConnectWithResults+0x110>
  96681. goto exit;
  96682. 8026e46: bf00 nop
  96683. 8026e48: e002 b.n 8026e50 <MQTTConnectWithResults+0x110>
  96684. goto exit;
  96685. 8026e4a: bf00 nop
  96686. 8026e4c: e000 b.n 8026e50 <MQTTConnectWithResults+0x110>
  96687. goto exit; // there was a problem
  96688. 8026e4e: bf00 nop
  96689. exit:
  96690. if (rc == MQTT_SUCCESS)
  96691. 8026e50: 6f7b ldr r3, [r7, #116] @ 0x74
  96692. 8026e52: 2b00 cmp r3, #0
  96693. 8026e54: d105 bne.n 8026e62 <MQTTConnectWithResults+0x122>
  96694. {
  96695. c->isconnected = 1;
  96696. 8026e56: 68fb ldr r3, [r7, #12]
  96697. 8026e58: 2201 movs r2, #1
  96698. 8026e5a: 621a str r2, [r3, #32]
  96699. c->ping_outstanding = 0;
  96700. 8026e5c: 68fb ldr r3, [r7, #12]
  96701. 8026e5e: 2200 movs r2, #0
  96702. 8026e60: 771a strb r2, [r3, #28]
  96703. #if defined(MQTT_TASK)
  96704. MutexUnlock(&c->mutex);
  96705. #endif
  96706. // osMutexRelease(mqttMutex);
  96707. osMutexRelease(c->mutex);
  96708. 8026e62: 68fb ldr r3, [r7, #12]
  96709. 8026e64: 6e9b ldr r3, [r3, #104] @ 0x68
  96710. 8026e66: 4618 mov r0, r3
  96711. 8026e68: f7e9 fe77 bl 8010b5a <osMutexRelease>
  96712. return rc;
  96713. 8026e6c: 6f7b ldr r3, [r7, #116] @ 0x74
  96714. }
  96715. 8026e6e: 4618 mov r0, r3
  96716. 8026e70: 3778 adds r7, #120 @ 0x78
  96717. 8026e72: 46bd mov sp, r7
  96718. 8026e74: bd80 pop {r7, pc}
  96719. 8026e76: bf00 nop
  96720. 8026e78: 08030928 .word 0x08030928
  96721. 08026e7c <MQTTConnect>:
  96722. int MQTTConnect(MQTTClient* c, MQTTPacket_connectData* options)
  96723. {
  96724. 8026e7c: b580 push {r7, lr}
  96725. 8026e7e: b084 sub sp, #16
  96726. 8026e80: af00 add r7, sp, #0
  96727. 8026e82: 6078 str r0, [r7, #4]
  96728. 8026e84: 6039 str r1, [r7, #0]
  96729. MQTTConnackData data;
  96730. return MQTTConnectWithResults(c, options, &data);
  96731. 8026e86: f107 030c add.w r3, r7, #12
  96732. 8026e8a: 461a mov r2, r3
  96733. 8026e8c: 6839 ldr r1, [r7, #0]
  96734. 8026e8e: 6878 ldr r0, [r7, #4]
  96735. 8026e90: f7ff ff56 bl 8026d40 <MQTTConnectWithResults>
  96736. 8026e94: 4603 mov r3, r0
  96737. }
  96738. 8026e96: 4618 mov r0, r3
  96739. 8026e98: 3710 adds r7, #16
  96740. 8026e9a: 46bd mov sp, r7
  96741. 8026e9c: bd80 pop {r7, pc}
  96742. 08026e9e <MQTTSetMessageHandler>:
  96743. int MQTTSetMessageHandler(MQTTClient* c, const char* topicFilter, messageHandler messageHandler)
  96744. {
  96745. 8026e9e: b580 push {r7, lr}
  96746. 8026ea0: b086 sub sp, #24
  96747. 8026ea2: af00 add r7, sp, #0
  96748. 8026ea4: 60f8 str r0, [r7, #12]
  96749. 8026ea6: 60b9 str r1, [r7, #8]
  96750. 8026ea8: 607a str r2, [r7, #4]
  96751. int rc = FAILURE;
  96752. 8026eaa: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96753. 8026eae: 617b str r3, [r7, #20]
  96754. int i = -1;
  96755. 8026eb0: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96756. 8026eb4: 613b str r3, [r7, #16]
  96757. /* first check for an existing matching slot */
  96758. for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
  96759. 8026eb6: 2300 movs r3, #0
  96760. 8026eb8: 613b str r3, [r7, #16]
  96761. 8026eba: e028 b.n 8026f0e <MQTTSetMessageHandler+0x70>
  96762. {
  96763. if (c->messageHandlers[i].topicFilter != NULL && strcmp(c->messageHandlers[i].topicFilter, topicFilter) == 0)
  96764. 8026ebc: 68fb ldr r3, [r7, #12]
  96765. 8026ebe: 693a ldr r2, [r7, #16]
  96766. 8026ec0: 3205 adds r2, #5
  96767. 8026ec2: f853 3032 ldr.w r3, [r3, r2, lsl #3]
  96768. 8026ec6: 2b00 cmp r3, #0
  96769. 8026ec8: d01e beq.n 8026f08 <MQTTSetMessageHandler+0x6a>
  96770. 8026eca: 68fb ldr r3, [r7, #12]
  96771. 8026ecc: 693a ldr r2, [r7, #16]
  96772. 8026ece: 3205 adds r2, #5
  96773. 8026ed0: f853 3032 ldr.w r3, [r3, r2, lsl #3]
  96774. 8026ed4: 68b9 ldr r1, [r7, #8]
  96775. 8026ed6: 4618 mov r0, r3
  96776. 8026ed8: f7d9 fa02 bl 80002e0 <strcmp>
  96777. 8026edc: 4603 mov r3, r0
  96778. 8026ede: 2b00 cmp r3, #0
  96779. 8026ee0: d112 bne.n 8026f08 <MQTTSetMessageHandler+0x6a>
  96780. {
  96781. if (messageHandler == NULL) /* remove existing */
  96782. 8026ee2: 687b ldr r3, [r7, #4]
  96783. 8026ee4: 2b00 cmp r3, #0
  96784. 8026ee6: d10c bne.n 8026f02 <MQTTSetMessageHandler+0x64>
  96785. {
  96786. c->messageHandlers[i].topicFilter = NULL;
  96787. 8026ee8: 68fb ldr r3, [r7, #12]
  96788. 8026eea: 693a ldr r2, [r7, #16]
  96789. 8026eec: 3205 adds r2, #5
  96790. 8026eee: 2100 movs r1, #0
  96791. 8026ef0: f843 1032 str.w r1, [r3, r2, lsl #3]
  96792. c->messageHandlers[i].fp = NULL;
  96793. 8026ef4: 68fa ldr r2, [r7, #12]
  96794. 8026ef6: 693b ldr r3, [r7, #16]
  96795. 8026ef8: 3305 adds r3, #5
  96796. 8026efa: 00db lsls r3, r3, #3
  96797. 8026efc: 4413 add r3, r2
  96798. 8026efe: 2200 movs r2, #0
  96799. 8026f00: 605a str r2, [r3, #4]
  96800. }
  96801. rc = MQTT_SUCCESS; /* return i when adding new subscription */
  96802. 8026f02: 2300 movs r3, #0
  96803. 8026f04: 617b str r3, [r7, #20]
  96804. break;
  96805. 8026f06: e005 b.n 8026f14 <MQTTSetMessageHandler+0x76>
  96806. for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
  96807. 8026f08: 693b ldr r3, [r7, #16]
  96808. 8026f0a: 3301 adds r3, #1
  96809. 8026f0c: 613b str r3, [r7, #16]
  96810. 8026f0e: 693b ldr r3, [r7, #16]
  96811. 8026f10: 2b04 cmp r3, #4
  96812. 8026f12: ddd3 ble.n 8026ebc <MQTTSetMessageHandler+0x1e>
  96813. }
  96814. }
  96815. /* if no existing, look for empty slot (unless we are removing) */
  96816. if (messageHandler != NULL) {
  96817. 8026f14: 687b ldr r3, [r7, #4]
  96818. 8026f16: 2b00 cmp r3, #0
  96819. 8026f18: d026 beq.n 8026f68 <MQTTSetMessageHandler+0xca>
  96820. if (rc == FAILURE)
  96821. 8026f1a: 697b ldr r3, [r7, #20]
  96822. 8026f1c: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  96823. 8026f20: d112 bne.n 8026f48 <MQTTSetMessageHandler+0xaa>
  96824. {
  96825. for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
  96826. 8026f22: 2300 movs r3, #0
  96827. 8026f24: 613b str r3, [r7, #16]
  96828. 8026f26: e00c b.n 8026f42 <MQTTSetMessageHandler+0xa4>
  96829. {
  96830. if (c->messageHandlers[i].topicFilter == NULL)
  96831. 8026f28: 68fb ldr r3, [r7, #12]
  96832. 8026f2a: 693a ldr r2, [r7, #16]
  96833. 8026f2c: 3205 adds r2, #5
  96834. 8026f2e: f853 3032 ldr.w r3, [r3, r2, lsl #3]
  96835. 8026f32: 2b00 cmp r3, #0
  96836. 8026f34: d102 bne.n 8026f3c <MQTTSetMessageHandler+0x9e>
  96837. {
  96838. rc = MQTT_SUCCESS;
  96839. 8026f36: 2300 movs r3, #0
  96840. 8026f38: 617b str r3, [r7, #20]
  96841. break;
  96842. 8026f3a: e005 b.n 8026f48 <MQTTSetMessageHandler+0xaa>
  96843. for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
  96844. 8026f3c: 693b ldr r3, [r7, #16]
  96845. 8026f3e: 3301 adds r3, #1
  96846. 8026f40: 613b str r3, [r7, #16]
  96847. 8026f42: 693b ldr r3, [r7, #16]
  96848. 8026f44: 2b04 cmp r3, #4
  96849. 8026f46: ddef ble.n 8026f28 <MQTTSetMessageHandler+0x8a>
  96850. }
  96851. }
  96852. }
  96853. if (i < MAX_MESSAGE_HANDLERS)
  96854. 8026f48: 693b ldr r3, [r7, #16]
  96855. 8026f4a: 2b04 cmp r3, #4
  96856. 8026f4c: dc0c bgt.n 8026f68 <MQTTSetMessageHandler+0xca>
  96857. {
  96858. c->messageHandlers[i].topicFilter = topicFilter;
  96859. 8026f4e: 68fb ldr r3, [r7, #12]
  96860. 8026f50: 693a ldr r2, [r7, #16]
  96861. 8026f52: 3205 adds r2, #5
  96862. 8026f54: 68b9 ldr r1, [r7, #8]
  96863. 8026f56: f843 1032 str.w r1, [r3, r2, lsl #3]
  96864. c->messageHandlers[i].fp = messageHandler;
  96865. 8026f5a: 68fa ldr r2, [r7, #12]
  96866. 8026f5c: 693b ldr r3, [r7, #16]
  96867. 8026f5e: 3305 adds r3, #5
  96868. 8026f60: 00db lsls r3, r3, #3
  96869. 8026f62: 4413 add r3, r2
  96870. 8026f64: 687a ldr r2, [r7, #4]
  96871. 8026f66: 605a str r2, [r3, #4]
  96872. }
  96873. }
  96874. return rc;
  96875. 8026f68: 697b ldr r3, [r7, #20]
  96876. }
  96877. 8026f6a: 4618 mov r0, r3
  96878. 8026f6c: 3718 adds r7, #24
  96879. 8026f6e: 46bd mov sp, r7
  96880. 8026f70: bd80 pop {r7, pc}
  96881. 08026f72 <MQTTSubscribeWithResults>:
  96882. int MQTTSubscribeWithResults(MQTTClient* c, const char* topicFilter, enum QoS qos,
  96883. messageHandler messageHandler, MQTTSubackData* data)
  96884. {
  96885. 8026f72: b5b0 push {r4, r5, r7, lr}
  96886. 8026f74: b094 sub sp, #80 @ 0x50
  96887. 8026f76: af04 add r7, sp, #16
  96888. 8026f78: 60f8 str r0, [r7, #12]
  96889. 8026f7a: 60b9 str r1, [r7, #8]
  96890. 8026f7c: 603b str r3, [r7, #0]
  96891. 8026f7e: 4613 mov r3, r2
  96892. 8026f80: 71fb strb r3, [r7, #7]
  96893. int rc = FAILURE;
  96894. 8026f82: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  96895. 8026f86: 63fb str r3, [r7, #60] @ 0x3c
  96896. Timer timer;
  96897. int len = 0;
  96898. 8026f88: 2300 movs r3, #0
  96899. 8026f8a: 63bb str r3, [r7, #56] @ 0x38
  96900. MQTTString topic = MQTTString_initializer;
  96901. 8026f8c: 2300 movs r3, #0
  96902. 8026f8e: 627b str r3, [r7, #36] @ 0x24
  96903. 8026f90: 2300 movs r3, #0
  96904. 8026f92: 62bb str r3, [r7, #40] @ 0x28
  96905. 8026f94: 2300 movs r3, #0
  96906. 8026f96: 62fb str r3, [r7, #44] @ 0x2c
  96907. topic.cstring = (char *)topicFilter;
  96908. 8026f98: 68bb ldr r3, [r7, #8]
  96909. 8026f9a: 627b str r3, [r7, #36] @ 0x24
  96910. #if defined(MQTT_TASK)
  96911. MutexLock(&c->mutex);
  96912. #endif
  96913. // osMutexAcquire(mqttMutex, osWaitForever);
  96914. osMutexAcquire(c->mutex, osWaitForever);
  96915. 8026f9c: 68fb ldr r3, [r7, #12]
  96916. 8026f9e: 6e9b ldr r3, [r3, #104] @ 0x68
  96917. 8026fa0: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  96918. 8026fa4: 4618 mov r0, r3
  96919. 8026fa6: f7e9 fd8d bl 8010ac4 <osMutexAcquire>
  96920. if (!c->isconnected)
  96921. 8026faa: 68fb ldr r3, [r7, #12]
  96922. 8026fac: 6a1b ldr r3, [r3, #32]
  96923. 8026fae: 2b00 cmp r3, #0
  96924. 8026fb0: d069 beq.n 8027086 <MQTTSubscribeWithResults+0x114>
  96925. goto exit;
  96926. TimerInit(&timer);
  96927. 8026fb2: f107 0330 add.w r3, r7, #48 @ 0x30
  96928. 8026fb6: 4618 mov r0, r3
  96929. 8026fb8: f000 f9bc bl 8027334 <TimerInit>
  96930. TimerCountdownMS(&timer, c->command_timeout_ms);
  96931. 8026fbc: 68fb ldr r3, [r7, #12]
  96932. 8026fbe: 685a ldr r2, [r3, #4]
  96933. 8026fc0: f107 0330 add.w r3, r7, #48 @ 0x30
  96934. 8026fc4: 4611 mov r1, r2
  96935. 8026fc6: 4618 mov r0, r3
  96936. 8026fc8: f000 f972 bl 80272b0 <TimerCountdownMS>
  96937. int _qos[1] = {(int)qos};
  96938. 8026fcc: 79fb ldrb r3, [r7, #7]
  96939. 8026fce: 623b str r3, [r7, #32]
  96940. len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, _qos);
  96941. 8026fd0: 68fb ldr r3, [r7, #12]
  96942. 8026fd2: 691c ldr r4, [r3, #16]
  96943. 8026fd4: 68fb ldr r3, [r7, #12]
  96944. 8026fd6: 689b ldr r3, [r3, #8]
  96945. 8026fd8: 461d mov r5, r3
  96946. 8026fda: 68f8 ldr r0, [r7, #12]
  96947. 8026fdc: f7ff fa90 bl 8026500 <getNextPacketId>
  96948. 8026fe0: 4603 mov r3, r0
  96949. 8026fe2: b29a uxth r2, r3
  96950. 8026fe4: f107 0320 add.w r3, r7, #32
  96951. 8026fe8: 9302 str r3, [sp, #8]
  96952. 8026fea: f107 0324 add.w r3, r7, #36 @ 0x24
  96953. 8026fee: 9301 str r3, [sp, #4]
  96954. 8026ff0: 2301 movs r3, #1
  96955. 8026ff2: 9300 str r3, [sp, #0]
  96956. 8026ff4: 4613 mov r3, r2
  96957. 8026ff6: 2200 movs r2, #0
  96958. 8026ff8: 4629 mov r1, r5
  96959. 8026ffa: 4620 mov r0, r4
  96960. 8026ffc: f001 f81b bl 8028036 <MQTTSerialize_subscribe>
  96961. 8027000: 63b8 str r0, [r7, #56] @ 0x38
  96962. // len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, (int*)&qos);
  96963. if (len <= 0)
  96964. 8027002: 6bbb ldr r3, [r7, #56] @ 0x38
  96965. 8027004: 2b00 cmp r3, #0
  96966. 8027006: dd40 ble.n 802708a <MQTTSubscribeWithResults+0x118>
  96967. goto exit;
  96968. if ((rc = sendPacket(c, len, &timer)) != MQTT_SUCCESS) // send the subscribe packet
  96969. 8027008: f107 0330 add.w r3, r7, #48 @ 0x30
  96970. 802700c: 461a mov r2, r3
  96971. 802700e: 6bb9 ldr r1, [r7, #56] @ 0x38
  96972. 8027010: 68f8 ldr r0, [r7, #12]
  96973. 8027012: f7ff fa8e bl 8026532 <sendPacket>
  96974. 8027016: 63f8 str r0, [r7, #60] @ 0x3c
  96975. 8027018: 6bfb ldr r3, [r7, #60] @ 0x3c
  96976. 802701a: 2b00 cmp r3, #0
  96977. 802701c: d137 bne.n 802708e <MQTTSubscribeWithResults+0x11c>
  96978. goto exit; // there was a problem
  96979. if (waitfor(c, SUBACK, &timer) == SUBACK) // wait for suback
  96980. 802701e: f107 0330 add.w r3, r7, #48 @ 0x30
  96981. 8027022: 461a mov r2, r3
  96982. 8027024: 2109 movs r1, #9
  96983. 8027026: 68f8 ldr r0, [r7, #12]
  96984. 8027028: f7ff fe67 bl 8026cfa <waitfor>
  96985. 802702c: 4603 mov r3, r0
  96986. 802702e: 2b09 cmp r3, #9
  96987. 8027030: d125 bne.n 802707e <MQTTSubscribeWithResults+0x10c>
  96988. {
  96989. int count = 0;
  96990. 8027032: 2300 movs r3, #0
  96991. 8027034: 61fb str r3, [r7, #28]
  96992. unsigned short mypacketid;
  96993. data->grantedQoS = QOS0;
  96994. 8027036: 6d3b ldr r3, [r7, #80] @ 0x50
  96995. 8027038: 2200 movs r2, #0
  96996. 802703a: 701a strb r2, [r3, #0]
  96997. int _grantedQoS[1] = {(int)&data->grantedQoS};
  96998. 802703c: 6d3b ldr r3, [r7, #80] @ 0x50
  96999. 802703e: 617b str r3, [r7, #20]
  97000. // if (MQTTDeserialize_suback(&mypacketid, 1, &count, (int*)&data->grantedQoS, c->readbuf, c->readbuf_size) == 1)
  97001. if (MQTTDeserialize_suback(&mypacketid, 1, &count, _grantedQoS, c->readbuf, c->readbuf_size) == 1)
  97002. 8027040: 68fb ldr r3, [r7, #12]
  97003. 8027042: 695b ldr r3, [r3, #20]
  97004. 8027044: 68fa ldr r2, [r7, #12]
  97005. 8027046: 68d2 ldr r2, [r2, #12]
  97006. 8027048: 4614 mov r4, r2
  97007. 802704a: f107 0114 add.w r1, r7, #20
  97008. 802704e: f107 021c add.w r2, r7, #28
  97009. 8027052: f107 001a add.w r0, r7, #26
  97010. 8027056: 9401 str r4, [sp, #4]
  97011. 8027058: 9300 str r3, [sp, #0]
  97012. 802705a: 460b mov r3, r1
  97013. 802705c: 2101 movs r1, #1
  97014. 802705e: f001 f866 bl 802812e <MQTTDeserialize_suback>
  97015. 8027062: 4603 mov r3, r0
  97016. 8027064: 2b01 cmp r3, #1
  97017. 8027066: d113 bne.n 8027090 <MQTTSubscribeWithResults+0x11e>
  97018. {
  97019. if (data->grantedQoS != 0x80)
  97020. 8027068: 6d3b ldr r3, [r7, #80] @ 0x50
  97021. 802706a: 781b ldrb r3, [r3, #0]
  97022. 802706c: 2b80 cmp r3, #128 @ 0x80
  97023. 802706e: d00f beq.n 8027090 <MQTTSubscribeWithResults+0x11e>
  97024. rc = MQTTSetMessageHandler(c, topicFilter, messageHandler);
  97025. 8027070: 683a ldr r2, [r7, #0]
  97026. 8027072: 68b9 ldr r1, [r7, #8]
  97027. 8027074: 68f8 ldr r0, [r7, #12]
  97028. 8027076: f7ff ff12 bl 8026e9e <MQTTSetMessageHandler>
  97029. 802707a: 63f8 str r0, [r7, #60] @ 0x3c
  97030. 802707c: e008 b.n 8027090 <MQTTSubscribeWithResults+0x11e>
  97031. }
  97032. }
  97033. else
  97034. rc = FAILURE;
  97035. 802707e: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  97036. 8027082: 63fb str r3, [r7, #60] @ 0x3c
  97037. 8027084: e004 b.n 8027090 <MQTTSubscribeWithResults+0x11e>
  97038. goto exit;
  97039. 8027086: bf00 nop
  97040. 8027088: e002 b.n 8027090 <MQTTSubscribeWithResults+0x11e>
  97041. goto exit;
  97042. 802708a: bf00 nop
  97043. 802708c: e000 b.n 8027090 <MQTTSubscribeWithResults+0x11e>
  97044. goto exit; // there was a problem
  97045. 802708e: bf00 nop
  97046. exit:
  97047. if (rc == FAILURE)
  97048. 8027090: 6bfb ldr r3, [r7, #60] @ 0x3c
  97049. 8027092: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  97050. 8027096: d102 bne.n 802709e <MQTTSubscribeWithResults+0x12c>
  97051. MQTTCloseSession(c);
  97052. 8027098: 68f8 ldr r0, [r7, #12]
  97053. 802709a: f7ff fceb bl 8026a74 <MQTTCloseSession>
  97054. #if defined(MQTT_TASK)
  97055. MutexUnlock(&c->mutex);
  97056. #endif
  97057. // osMutexRelease(mqttMutex);
  97058. osMutexRelease(c->mutex);
  97059. 802709e: 68fb ldr r3, [r7, #12]
  97060. 80270a0: 6e9b ldr r3, [r3, #104] @ 0x68
  97061. 80270a2: 4618 mov r0, r3
  97062. 80270a4: f7e9 fd59 bl 8010b5a <osMutexRelease>
  97063. return rc;
  97064. 80270a8: 6bfb ldr r3, [r7, #60] @ 0x3c
  97065. }
  97066. 80270aa: 4618 mov r0, r3
  97067. 80270ac: 3740 adds r7, #64 @ 0x40
  97068. 80270ae: 46bd mov sp, r7
  97069. 80270b0: bdb0 pop {r4, r5, r7, pc}
  97070. 080270b2 <MQTTSubscribe>:
  97071. int MQTTSubscribe(MQTTClient* c, const char* topicFilter, enum QoS qos,
  97072. messageHandler messageHandler)
  97073. {
  97074. 80270b2: b580 push {r7, lr}
  97075. 80270b4: b088 sub sp, #32
  97076. 80270b6: af02 add r7, sp, #8
  97077. 80270b8: 60f8 str r0, [r7, #12]
  97078. 80270ba: 60b9 str r1, [r7, #8]
  97079. 80270bc: 603b str r3, [r7, #0]
  97080. 80270be: 4613 mov r3, r2
  97081. 80270c0: 71fb strb r3, [r7, #7]
  97082. MQTTSubackData data;
  97083. return MQTTSubscribeWithResults(c, topicFilter, qos, messageHandler, &data);
  97084. 80270c2: 79fa ldrb r2, [r7, #7]
  97085. 80270c4: f107 0314 add.w r3, r7, #20
  97086. 80270c8: 9300 str r3, [sp, #0]
  97087. 80270ca: 683b ldr r3, [r7, #0]
  97088. 80270cc: 68b9 ldr r1, [r7, #8]
  97089. 80270ce: 68f8 ldr r0, [r7, #12]
  97090. 80270d0: f7ff ff4f bl 8026f72 <MQTTSubscribeWithResults>
  97091. 80270d4: 4603 mov r3, r0
  97092. }
  97093. 80270d6: 4618 mov r0, r3
  97094. 80270d8: 3718 adds r7, #24
  97095. 80270da: 46bd mov sp, r7
  97096. 80270dc: bd80 pop {r7, pc}
  97097. 080270de <MQTTPublish>:
  97098. return rc;
  97099. }
  97100. int MQTTPublish(MQTTClient* c, const char* topicName, MQTTMessage* message)
  97101. {
  97102. 80270de: b5f0 push {r4, r5, r6, r7, lr}
  97103. 80270e0: b097 sub sp, #92 @ 0x5c
  97104. 80270e2: af08 add r7, sp, #32
  97105. 80270e4: 60f8 str r0, [r7, #12]
  97106. 80270e6: 60b9 str r1, [r7, #8]
  97107. 80270e8: 607a str r2, [r7, #4]
  97108. int rc = FAILURE;
  97109. 80270ea: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  97110. 80270ee: 637b str r3, [r7, #52] @ 0x34
  97111. Timer timer;
  97112. MQTTString topic = MQTTString_initializer;
  97113. 80270f0: 2300 movs r3, #0
  97114. 80270f2: 61fb str r3, [r7, #28]
  97115. 80270f4: 2300 movs r3, #0
  97116. 80270f6: 623b str r3, [r7, #32]
  97117. 80270f8: 2300 movs r3, #0
  97118. 80270fa: 627b str r3, [r7, #36] @ 0x24
  97119. topic.cstring = (char *)topicName;
  97120. 80270fc: 68bb ldr r3, [r7, #8]
  97121. 80270fe: 61fb str r3, [r7, #28]
  97122. int len = 0;
  97123. 8027100: 2300 movs r3, #0
  97124. 8027102: 633b str r3, [r7, #48] @ 0x30
  97125. #if defined(MQTT_TASK)
  97126. MutexLock(&c->mutex);
  97127. #endif
  97128. // osMutexAcquire(mqttMutex, osWaitForever);
  97129. osMutexAcquire(c->mutex, osWaitForever);
  97130. 8027104: 68fb ldr r3, [r7, #12]
  97131. 8027106: 6e9b ldr r3, [r3, #104] @ 0x68
  97132. 8027108: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  97133. 802710c: 4618 mov r0, r3
  97134. 802710e: f7e9 fcd9 bl 8010ac4 <osMutexAcquire>
  97135. if (!c->isconnected)
  97136. 8027112: 68fb ldr r3, [r7, #12]
  97137. 8027114: 6a1b ldr r3, [r3, #32]
  97138. 8027116: 2b00 cmp r3, #0
  97139. 8027118: f000 809b beq.w 8027252 <MQTTPublish+0x174>
  97140. goto exit;
  97141. TimerInit(&timer);
  97142. 802711c: f107 0328 add.w r3, r7, #40 @ 0x28
  97143. 8027120: 4618 mov r0, r3
  97144. 8027122: f000 f907 bl 8027334 <TimerInit>
  97145. TimerCountdownMS(&timer, c->command_timeout_ms);
  97146. 8027126: 68fb ldr r3, [r7, #12]
  97147. 8027128: 685a ldr r2, [r3, #4]
  97148. 802712a: f107 0328 add.w r3, r7, #40 @ 0x28
  97149. 802712e: 4611 mov r1, r2
  97150. 8027130: 4618 mov r0, r3
  97151. 8027132: f000 f8bd bl 80272b0 <TimerCountdownMS>
  97152. if (message->qos == QOS1 || message->qos == QOS2)
  97153. 8027136: 687b ldr r3, [r7, #4]
  97154. 8027138: 781b ldrb r3, [r3, #0]
  97155. 802713a: 2b01 cmp r3, #1
  97156. 802713c: d003 beq.n 8027146 <MQTTPublish+0x68>
  97157. 802713e: 687b ldr r3, [r7, #4]
  97158. 8027140: 781b ldrb r3, [r3, #0]
  97159. 8027142: 2b02 cmp r3, #2
  97160. 8027144: d106 bne.n 8027154 <MQTTPublish+0x76>
  97161. message->id = getNextPacketId(c);
  97162. 8027146: 68f8 ldr r0, [r7, #12]
  97163. 8027148: f7ff f9da bl 8026500 <getNextPacketId>
  97164. 802714c: 4603 mov r3, r0
  97165. 802714e: b29a uxth r2, r3
  97166. 8027150: 687b ldr r3, [r7, #4]
  97167. 8027152: 809a strh r2, [r3, #4]
  97168. len = MQTTSerialize_publish(c->buf, c->buf_size, 0, message->qos, message->retained, message->id,
  97169. 8027154: 68fb ldr r3, [r7, #12]
  97170. 8027156: 691b ldr r3, [r3, #16]
  97171. 8027158: 603b str r3, [r7, #0]
  97172. 802715a: 68fb ldr r3, [r7, #12]
  97173. 802715c: 689b ldr r3, [r3, #8]
  97174. 802715e: 469c mov ip, r3
  97175. 8027160: 687b ldr r3, [r7, #4]
  97176. 8027162: 781b ldrb r3, [r3, #0]
  97177. 8027164: 469e mov lr, r3
  97178. 8027166: 687b ldr r3, [r7, #4]
  97179. 8027168: 785d ldrb r5, [r3, #1]
  97180. 802716a: 687b ldr r3, [r7, #4]
  97181. 802716c: 889e ldrh r6, [r3, #4]
  97182. topic, (unsigned char*)message->payload, message->payloadlen);
  97183. 802716e: 687b ldr r3, [r7, #4]
  97184. 8027170: 689b ldr r3, [r3, #8]
  97185. 8027172: 687a ldr r2, [r7, #4]
  97186. 8027174: 68d2 ldr r2, [r2, #12]
  97187. len = MQTTSerialize_publish(c->buf, c->buf_size, 0, message->qos, message->retained, message->id,
  97188. 8027176: 9206 str r2, [sp, #24]
  97189. 8027178: 9305 str r3, [sp, #20]
  97190. 802717a: ac02 add r4, sp, #8
  97191. 802717c: f107 031c add.w r3, r7, #28
  97192. 8027180: e893 0007 ldmia.w r3, {r0, r1, r2}
  97193. 8027184: e884 0007 stmia.w r4, {r0, r1, r2}
  97194. 8027188: 9601 str r6, [sp, #4]
  97195. 802718a: 9500 str r5, [sp, #0]
  97196. 802718c: 4673 mov r3, lr
  97197. 802718e: 2200 movs r2, #0
  97198. 8027190: 4661 mov r1, ip
  97199. 8027192: 6838 ldr r0, [r7, #0]
  97200. 8027194: f000 fe5d bl 8027e52 <MQTTSerialize_publish>
  97201. 8027198: 6338 str r0, [r7, #48] @ 0x30
  97202. if (len <= 0)
  97203. 802719a: 6b3b ldr r3, [r7, #48] @ 0x30
  97204. 802719c: 2b00 cmp r3, #0
  97205. 802719e: dd5a ble.n 8027256 <MQTTPublish+0x178>
  97206. goto exit;
  97207. if ((rc = sendPacket(c, len, &timer)) != MQTT_SUCCESS) // send the subscribe packet
  97208. 80271a0: f107 0328 add.w r3, r7, #40 @ 0x28
  97209. 80271a4: 461a mov r2, r3
  97210. 80271a6: 6b39 ldr r1, [r7, #48] @ 0x30
  97211. 80271a8: 68f8 ldr r0, [r7, #12]
  97212. 80271aa: f7ff f9c2 bl 8026532 <sendPacket>
  97213. 80271ae: 6378 str r0, [r7, #52] @ 0x34
  97214. 80271b0: 6b7b ldr r3, [r7, #52] @ 0x34
  97215. 80271b2: 2b00 cmp r3, #0
  97216. 80271b4: d151 bne.n 802725a <MQTTPublish+0x17c>
  97217. goto exit; // there was a problem
  97218. if (message->qos == QOS1)
  97219. 80271b6: 687b ldr r3, [r7, #4]
  97220. 80271b8: 781b ldrb r3, [r3, #0]
  97221. 80271ba: 2b01 cmp r3, #1
  97222. 80271bc: d122 bne.n 8027204 <MQTTPublish+0x126>
  97223. {
  97224. if (waitfor(c, PUBACK, &timer) == PUBACK)
  97225. 80271be: f107 0328 add.w r3, r7, #40 @ 0x28
  97226. 80271c2: 461a mov r2, r3
  97227. 80271c4: 2104 movs r1, #4
  97228. 80271c6: 68f8 ldr r0, [r7, #12]
  97229. 80271c8: f7ff fd97 bl 8026cfa <waitfor>
  97230. 80271cc: 4603 mov r3, r0
  97231. 80271ce: 2b04 cmp r3, #4
  97232. 80271d0: d114 bne.n 80271fc <MQTTPublish+0x11e>
  97233. {
  97234. unsigned short mypacketid;
  97235. unsigned char dup, type;
  97236. if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)
  97237. 80271d2: 68fb ldr r3, [r7, #12]
  97238. 80271d4: 695c ldr r4, [r3, #20]
  97239. 80271d6: 68fb ldr r3, [r7, #12]
  97240. 80271d8: 68db ldr r3, [r3, #12]
  97241. 80271da: f107 021a add.w r2, r7, #26
  97242. 80271de: f107 0119 add.w r1, r7, #25
  97243. 80271e2: f107 0018 add.w r0, r7, #24
  97244. 80271e6: 9300 str r3, [sp, #0]
  97245. 80271e8: 4623 mov r3, r4
  97246. 80271ea: f000 fbc1 bl 8027970 <MQTTDeserialize_ack>
  97247. 80271ee: 4603 mov r3, r0
  97248. 80271f0: 2b01 cmp r3, #1
  97249. 80271f2: d035 beq.n 8027260 <MQTTPublish+0x182>
  97250. rc = FAILURE;
  97251. 80271f4: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  97252. 80271f8: 637b str r3, [r7, #52] @ 0x34
  97253. 80271fa: e031 b.n 8027260 <MQTTPublish+0x182>
  97254. }
  97255. else
  97256. rc = FAILURE;
  97257. 80271fc: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  97258. 8027200: 637b str r3, [r7, #52] @ 0x34
  97259. 8027202: e02d b.n 8027260 <MQTTPublish+0x182>
  97260. }
  97261. else if (message->qos == QOS2)
  97262. 8027204: 687b ldr r3, [r7, #4]
  97263. 8027206: 781b ldrb r3, [r3, #0]
  97264. 8027208: 2b02 cmp r3, #2
  97265. 802720a: d128 bne.n 802725e <MQTTPublish+0x180>
  97266. {
  97267. if (waitfor(c, PUBCOMP, &timer) == PUBCOMP)
  97268. 802720c: f107 0328 add.w r3, r7, #40 @ 0x28
  97269. 8027210: 461a mov r2, r3
  97270. 8027212: 2107 movs r1, #7
  97271. 8027214: 68f8 ldr r0, [r7, #12]
  97272. 8027216: f7ff fd70 bl 8026cfa <waitfor>
  97273. 802721a: 4603 mov r3, r0
  97274. 802721c: 2b07 cmp r3, #7
  97275. 802721e: d114 bne.n 802724a <MQTTPublish+0x16c>
  97276. {
  97277. unsigned short mypacketid;
  97278. unsigned char dup, type;
  97279. if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)
  97280. 8027220: 68fb ldr r3, [r7, #12]
  97281. 8027222: 695c ldr r4, [r3, #20]
  97282. 8027224: 68fb ldr r3, [r7, #12]
  97283. 8027226: 68db ldr r3, [r3, #12]
  97284. 8027228: f107 0216 add.w r2, r7, #22
  97285. 802722c: f107 0115 add.w r1, r7, #21
  97286. 8027230: f107 0014 add.w r0, r7, #20
  97287. 8027234: 9300 str r3, [sp, #0]
  97288. 8027236: 4623 mov r3, r4
  97289. 8027238: f000 fb9a bl 8027970 <MQTTDeserialize_ack>
  97290. 802723c: 4603 mov r3, r0
  97291. 802723e: 2b01 cmp r3, #1
  97292. 8027240: d00e beq.n 8027260 <MQTTPublish+0x182>
  97293. rc = FAILURE;
  97294. 8027242: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  97295. 8027246: 637b str r3, [r7, #52] @ 0x34
  97296. 8027248: e00a b.n 8027260 <MQTTPublish+0x182>
  97297. }
  97298. else
  97299. rc = FAILURE;
  97300. 802724a: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  97301. 802724e: 637b str r3, [r7, #52] @ 0x34
  97302. 8027250: e006 b.n 8027260 <MQTTPublish+0x182>
  97303. goto exit;
  97304. 8027252: bf00 nop
  97305. 8027254: e004 b.n 8027260 <MQTTPublish+0x182>
  97306. goto exit;
  97307. 8027256: bf00 nop
  97308. 8027258: e002 b.n 8027260 <MQTTPublish+0x182>
  97309. goto exit; // there was a problem
  97310. 802725a: bf00 nop
  97311. 802725c: e000 b.n 8027260 <MQTTPublish+0x182>
  97312. }
  97313. exit:
  97314. 802725e: bf00 nop
  97315. if (rc == FAILURE)
  97316. 8027260: 6b7b ldr r3, [r7, #52] @ 0x34
  97317. 8027262: f1b3 3fff cmp.w r3, #4294967295 @ 0xffffffff
  97318. 8027266: d102 bne.n 802726e <MQTTPublish+0x190>
  97319. MQTTCloseSession(c);
  97320. 8027268: 68f8 ldr r0, [r7, #12]
  97321. 802726a: f7ff fc03 bl 8026a74 <MQTTCloseSession>
  97322. #if defined(MQTT_TASK)
  97323. MutexUnlock(&c->mutex);
  97324. #endif
  97325. // osMutexRelease(mqttMutex);
  97326. osMutexRelease(c->mutex);
  97327. 802726e: 68fb ldr r3, [r7, #12]
  97328. 8027270: 6e9b ldr r3, [r3, #104] @ 0x68
  97329. 8027272: 4618 mov r0, r3
  97330. 8027274: f7e9 fc71 bl 8010b5a <osMutexRelease>
  97331. return rc;
  97332. 8027278: 6b7b ldr r3, [r7, #52] @ 0x34
  97333. }
  97334. 802727a: 4618 mov r0, r3
  97335. 802727c: 373c adds r7, #60 @ 0x3c
  97336. 802727e: 46bd mov sp, r7
  97337. 8027280: bdf0 pop {r4, r5, r6, r7, pc}
  97338. ...
  97339. 08027284 <TimerIsExpired>:
  97340. #define SERVER_IP4 34
  97341. uint32_t MilliTimer;
  97342. //Timer functions
  97343. char TimerIsExpired(Timer *timer) {
  97344. 8027284: b480 push {r7}
  97345. 8027286: b085 sub sp, #20
  97346. 8027288: af00 add r7, sp, #0
  97347. 802728a: 6078 str r0, [r7, #4]
  97348. long left = timer->end_time - MilliTimer;
  97349. 802728c: 687b ldr r3, [r7, #4]
  97350. 802728e: 685a ldr r2, [r3, #4]
  97351. 8027290: 4b06 ldr r3, [pc, #24] @ (80272ac <TimerIsExpired+0x28>)
  97352. 8027292: 681b ldr r3, [r3, #0]
  97353. 8027294: 1ad3 subs r3, r2, r3
  97354. 8027296: 60fb str r3, [r7, #12]
  97355. return (left < 0);
  97356. 8027298: 68fb ldr r3, [r7, #12]
  97357. 802729a: 0fdb lsrs r3, r3, #31
  97358. 802729c: b2db uxtb r3, r3
  97359. }
  97360. 802729e: 4618 mov r0, r3
  97361. 80272a0: 3714 adds r7, #20
  97362. 80272a2: 46bd mov sp, r7
  97363. 80272a4: f85d 7b04 ldr.w r7, [sp], #4
  97364. 80272a8: 4770 bx lr
  97365. 80272aa: bf00 nop
  97366. 80272ac: 2402b034 .word 0x2402b034
  97367. 080272b0 <TimerCountdownMS>:
  97368. void TimerCountdownMS(Timer *timer, unsigned int timeout) {
  97369. 80272b0: b480 push {r7}
  97370. 80272b2: b083 sub sp, #12
  97371. 80272b4: af00 add r7, sp, #0
  97372. 80272b6: 6078 str r0, [r7, #4]
  97373. 80272b8: 6039 str r1, [r7, #0]
  97374. timer->end_time = MilliTimer + timeout;
  97375. 80272ba: 4b06 ldr r3, [pc, #24] @ (80272d4 <TimerCountdownMS+0x24>)
  97376. 80272bc: 681a ldr r2, [r3, #0]
  97377. 80272be: 683b ldr r3, [r7, #0]
  97378. 80272c0: 441a add r2, r3
  97379. 80272c2: 687b ldr r3, [r7, #4]
  97380. 80272c4: 605a str r2, [r3, #4]
  97381. }
  97382. 80272c6: bf00 nop
  97383. 80272c8: 370c adds r7, #12
  97384. 80272ca: 46bd mov sp, r7
  97385. 80272cc: f85d 7b04 ldr.w r7, [sp], #4
  97386. 80272d0: 4770 bx lr
  97387. 80272d2: bf00 nop
  97388. 80272d4: 2402b034 .word 0x2402b034
  97389. 080272d8 <TimerCountdown>:
  97390. void TimerCountdown(Timer *timer, unsigned int timeout) {
  97391. 80272d8: b480 push {r7}
  97392. 80272da: b083 sub sp, #12
  97393. 80272dc: af00 add r7, sp, #0
  97394. 80272de: 6078 str r0, [r7, #4]
  97395. 80272e0: 6039 str r1, [r7, #0]
  97396. timer->end_time = MilliTimer + (timeout * 1000);
  97397. 80272e2: 683b ldr r3, [r7, #0]
  97398. 80272e4: f44f 727a mov.w r2, #1000 @ 0x3e8
  97399. 80272e8: fb03 f202 mul.w r2, r3, r2
  97400. 80272ec: 4b05 ldr r3, [pc, #20] @ (8027304 <TimerCountdown+0x2c>)
  97401. 80272ee: 681b ldr r3, [r3, #0]
  97402. 80272f0: 441a add r2, r3
  97403. 80272f2: 687b ldr r3, [r7, #4]
  97404. 80272f4: 605a str r2, [r3, #4]
  97405. }
  97406. 80272f6: bf00 nop
  97407. 80272f8: 370c adds r7, #12
  97408. 80272fa: 46bd mov sp, r7
  97409. 80272fc: f85d 7b04 ldr.w r7, [sp], #4
  97410. 8027300: 4770 bx lr
  97411. 8027302: bf00 nop
  97412. 8027304: 2402b034 .word 0x2402b034
  97413. 08027308 <TimerLeftMS>:
  97414. int TimerLeftMS(Timer *timer) {
  97415. 8027308: b480 push {r7}
  97416. 802730a: b085 sub sp, #20
  97417. 802730c: af00 add r7, sp, #0
  97418. 802730e: 6078 str r0, [r7, #4]
  97419. long left = timer->end_time - MilliTimer;
  97420. 8027310: 687b ldr r3, [r7, #4]
  97421. 8027312: 685a ldr r2, [r3, #4]
  97422. 8027314: 4b06 ldr r3, [pc, #24] @ (8027330 <TimerLeftMS+0x28>)
  97423. 8027316: 681b ldr r3, [r3, #0]
  97424. 8027318: 1ad3 subs r3, r2, r3
  97425. 802731a: 60fb str r3, [r7, #12]
  97426. return (left < 0) ? 0 : left;
  97427. 802731c: 68fb ldr r3, [r7, #12]
  97428. 802731e: ea23 73e3 bic.w r3, r3, r3, asr #31
  97429. }
  97430. 8027322: 4618 mov r0, r3
  97431. 8027324: 3714 adds r7, #20
  97432. 8027326: 46bd mov sp, r7
  97433. 8027328: f85d 7b04 ldr.w r7, [sp], #4
  97434. 802732c: 4770 bx lr
  97435. 802732e: bf00 nop
  97436. 8027330: 2402b034 .word 0x2402b034
  97437. 08027334 <TimerInit>:
  97438. void TimerInit(Timer *timer) {
  97439. 8027334: b480 push {r7}
  97440. 8027336: b083 sub sp, #12
  97441. 8027338: af00 add r7, sp, #0
  97442. 802733a: 6078 str r0, [r7, #4]
  97443. timer->end_time = 0;
  97444. 802733c: 687b ldr r3, [r7, #4]
  97445. 802733e: 2200 movs r2, #0
  97446. 8027340: 605a str r2, [r3, #4]
  97447. }
  97448. 8027342: bf00 nop
  97449. 8027344: 370c adds r7, #12
  97450. 8027346: 46bd mov sp, r7
  97451. 8027348: f85d 7b04 ldr.w r7, [sp], #4
  97452. 802734c: 4770 bx lr
  97453. ...
  97454. 08027350 <NewNetwork>:
  97455. #ifdef MQTT_LWIP_SOCKET
  97456. void NewNetwork(Network *n) {
  97457. 8027350: b480 push {r7}
  97458. 8027352: b083 sub sp, #12
  97459. 8027354: af00 add r7, sp, #0
  97460. 8027356: 6078 str r0, [r7, #4]
  97461. n->socket = 0; //clear
  97462. 8027358: 687b ldr r3, [r7, #4]
  97463. 802735a: 2200 movs r2, #0
  97464. 802735c: 601a str r2, [r3, #0]
  97465. n->mqttread = net_read; //receive function
  97466. 802735e: 687b ldr r3, [r7, #4]
  97467. 8027360: 4a06 ldr r2, [pc, #24] @ (802737c <NewNetwork+0x2c>)
  97468. 8027362: 605a str r2, [r3, #4]
  97469. n->mqttwrite = net_write; //send function
  97470. 8027364: 687b ldr r3, [r7, #4]
  97471. 8027366: 4a06 ldr r2, [pc, #24] @ (8027380 <NewNetwork+0x30>)
  97472. 8027368: 609a str r2, [r3, #8]
  97473. n->disconnect = net_disconnect; //disconnection function
  97474. 802736a: 687b ldr r3, [r7, #4]
  97475. 802736c: 4a05 ldr r2, [pc, #20] @ (8027384 <NewNetwork+0x34>)
  97476. 802736e: 60da str r2, [r3, #12]
  97477. }
  97478. 8027370: bf00 nop
  97479. 8027372: 370c adds r7, #12
  97480. 8027374: 46bd mov sp, r7
  97481. 8027376: f85d 7b04 ldr.w r7, [sp], #4
  97482. 802737a: 4770 bx lr
  97483. 802737c: 08027425 .word 0x08027425
  97484. 8027380: 08027475 .word 0x08027475
  97485. 8027384: 0802749b .word 0x0802749b
  97486. 08027388 <ConnectNetwork>:
  97487. int ConnectNetwork(Network *n, char *ip, int port) {
  97488. 8027388: b580 push {r7, lr}
  97489. 802738a: b088 sub sp, #32
  97490. 802738c: af00 add r7, sp, #0
  97491. 802738e: 60f8 str r0, [r7, #12]
  97492. 8027390: 60b9 str r1, [r7, #8]
  97493. 8027392: 607a str r2, [r7, #4]
  97494. struct sockaddr_in server_addr;
  97495. if(n->socket)
  97496. 8027394: 68fb ldr r3, [r7, #12]
  97497. 8027396: 681b ldr r3, [r3, #0]
  97498. 8027398: 2b00 cmp r3, #0
  97499. 802739a: d004 beq.n 80273a6 <ConnectNetwork+0x1e>
  97500. {
  97501. close(n->socket);
  97502. 802739c: 68fb ldr r3, [r7, #12]
  97503. 802739e: 681b ldr r3, [r3, #0]
  97504. 80273a0: 4618 mov r0, r3
  97505. 80273a2: f7f0 fa65 bl 8017870 <lwip_close>
  97506. }
  97507. n->socket = socket(PF_INET, SOCK_STREAM, 0); //create socket
  97508. 80273a6: 2200 movs r2, #0
  97509. 80273a8: 2101 movs r1, #1
  97510. 80273aa: 2002 movs r0, #2
  97511. 80273ac: f7f0 ff72 bl 8018294 <lwip_socket>
  97512. 80273b0: 4602 mov r2, r0
  97513. 80273b2: 68fb ldr r3, [r7, #12]
  97514. 80273b4: 601a str r2, [r3, #0]
  97515. if(n->socket < 0)
  97516. 80273b6: 68fb ldr r3, [r7, #12]
  97517. 80273b8: 681b ldr r3, [r3, #0]
  97518. 80273ba: 2b00 cmp r3, #0
  97519. 80273bc: da05 bge.n 80273ca <ConnectNetwork+0x42>
  97520. {
  97521. n->socket = 0;
  97522. 80273be: 68fb ldr r3, [r7, #12]
  97523. 80273c0: 2200 movs r2, #0
  97524. 80273c2: 601a str r2, [r3, #0]
  97525. return -1;
  97526. 80273c4: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  97527. 80273c8: e028 b.n 802741c <ConnectNetwork+0x94>
  97528. }
  97529. memset(&server_addr, 0, sizeof(struct sockaddr_in)); //broker address info
  97530. 80273ca: f107 0310 add.w r3, r7, #16
  97531. 80273ce: 2210 movs r2, #16
  97532. 80273d0: 2100 movs r1, #0
  97533. 80273d2: 4618 mov r0, r3
  97534. 80273d4: f002 fc8c bl 8029cf0 <memset>
  97535. server_addr.sin_family = AF_INET;
  97536. 80273d8: 2302 movs r3, #2
  97537. 80273da: 747b strb r3, [r7, #17]
  97538. server_addr.sin_addr.s_addr = inet_addr(ip);
  97539. 80273dc: 68b8 ldr r0, [r7, #8]
  97540. 80273de: f7fd fde0 bl 8024fa2 <ipaddr_addr>
  97541. 80273e2: 4603 mov r3, r0
  97542. 80273e4: 617b str r3, [r7, #20]
  97543. server_addr.sin_port = htons(port);
  97544. 80273e6: 687b ldr r3, [r7, #4]
  97545. 80273e8: b29b uxth r3, r3
  97546. 80273ea: 4618 mov r0, r3
  97547. 80273ec: f7f1 fb94 bl 8018b18 <lwip_htons>
  97548. 80273f0: 4603 mov r3, r0
  97549. 80273f2: 827b strh r3, [r7, #18]
  97550. if(connect(n->socket, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in)) < 0) //connect to the broker
  97551. 80273f4: 68fb ldr r3, [r7, #12]
  97552. 80273f6: 681b ldr r3, [r3, #0]
  97553. 80273f8: f107 0110 add.w r1, r7, #16
  97554. 80273fc: 2210 movs r2, #16
  97555. 80273fe: 4618 mov r0, r3
  97556. 8027400: f7f0 fa8c bl 801791c <lwip_connect>
  97557. 8027404: 4603 mov r3, r0
  97558. 8027406: 2b00 cmp r3, #0
  97559. 8027408: da07 bge.n 802741a <ConnectNetwork+0x92>
  97560. {
  97561. close(n->socket);
  97562. 802740a: 68fb ldr r3, [r7, #12]
  97563. 802740c: 681b ldr r3, [r3, #0]
  97564. 802740e: 4618 mov r0, r3
  97565. 8027410: f7f0 fa2e bl 8017870 <lwip_close>
  97566. return -1;
  97567. 8027414: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  97568. 8027418: e000 b.n 802741c <ConnectNetwork+0x94>
  97569. }
  97570. return 0;
  97571. 802741a: 2300 movs r3, #0
  97572. }
  97573. 802741c: 4618 mov r0, r3
  97574. 802741e: 3720 adds r7, #32
  97575. 8027420: 46bd mov sp, r7
  97576. 8027422: bd80 pop {r7, pc}
  97577. 08027424 <net_read>:
  97578. int net_read(Network *n, unsigned char *buffer, int len, int timeout_ms) {
  97579. 8027424: b580 push {r7, lr}
  97580. 8027426: b086 sub sp, #24
  97581. 8027428: af00 add r7, sp, #0
  97582. 802742a: 60f8 str r0, [r7, #12]
  97583. 802742c: 60b9 str r1, [r7, #8]
  97584. 802742e: 607a str r2, [r7, #4]
  97585. 8027430: 603b str r3, [r7, #0]
  97586. int available;
  97587. /* !!! LWIP_SO_RCVBUF must be enabled !!! */
  97588. if(ioctl(n->socket, FIONREAD, &available) < 0) return -1; //check receive buffer
  97589. 8027432: 68fb ldr r3, [r7, #12]
  97590. 8027434: 681b ldr r3, [r3, #0]
  97591. 8027436: f107 0214 add.w r2, r7, #20
  97592. 802743a: 490d ldr r1, [pc, #52] @ (8027470 <net_read+0x4c>)
  97593. 802743c: 4618 mov r0, r3
  97594. 802743e: f7f1 f917 bl 8018670 <lwip_ioctl>
  97595. 8027442: 4603 mov r3, r0
  97596. 8027444: 2b00 cmp r3, #0
  97597. 8027446: da02 bge.n 802744e <net_read+0x2a>
  97598. 8027448: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  97599. 802744c: e00c b.n 8027468 <net_read+0x44>
  97600. if(available > 0)
  97601. 802744e: 697b ldr r3, [r7, #20]
  97602. 8027450: 2b00 cmp r3, #0
  97603. 8027452: dd08 ble.n 8027466 <net_read+0x42>
  97604. {
  97605. return recv(n->socket, buffer, len, 0);
  97606. 8027454: 68fb ldr r3, [r7, #12]
  97607. 8027456: 6818 ldr r0, [r3, #0]
  97608. 8027458: 687a ldr r2, [r7, #4]
  97609. 802745a: 2300 movs r3, #0
  97610. 802745c: 68b9 ldr r1, [r7, #8]
  97611. 802745e: f7f0 fdf3 bl 8018048 <lwip_recv>
  97612. 8027462: 4603 mov r3, r0
  97613. 8027464: e000 b.n 8027468 <net_read+0x44>
  97614. }
  97615. return 0;
  97616. 8027466: 2300 movs r3, #0
  97617. }
  97618. 8027468: 4618 mov r0, r3
  97619. 802746a: 3718 adds r7, #24
  97620. 802746c: 46bd mov sp, r7
  97621. 802746e: bd80 pop {r7, pc}
  97622. 8027470: 4004667f .word 0x4004667f
  97623. 08027474 <net_write>:
  97624. int net_write(Network *n, unsigned char *buffer, int len, int timeout_ms) {
  97625. 8027474: b580 push {r7, lr}
  97626. 8027476: b084 sub sp, #16
  97627. 8027478: af00 add r7, sp, #0
  97628. 802747a: 60f8 str r0, [r7, #12]
  97629. 802747c: 60b9 str r1, [r7, #8]
  97630. 802747e: 607a str r2, [r7, #4]
  97631. 8027480: 603b str r3, [r7, #0]
  97632. return send(n->socket, buffer, len, 0);
  97633. 8027482: 68fb ldr r3, [r7, #12]
  97634. 8027484: 6818 ldr r0, [r3, #0]
  97635. 8027486: 687a ldr r2, [r7, #4]
  97636. 8027488: 2300 movs r3, #0
  97637. 802748a: 68b9 ldr r1, [r7, #8]
  97638. 802748c: f7f0 fdf2 bl 8018074 <lwip_send>
  97639. 8027490: 4603 mov r3, r0
  97640. }
  97641. 8027492: 4618 mov r0, r3
  97642. 8027494: 3710 adds r7, #16
  97643. 8027496: 46bd mov sp, r7
  97644. 8027498: bd80 pop {r7, pc}
  97645. 0802749a <net_disconnect>:
  97646. void net_disconnect(Network *n) {
  97647. 802749a: b580 push {r7, lr}
  97648. 802749c: b082 sub sp, #8
  97649. 802749e: af00 add r7, sp, #0
  97650. 80274a0: 6078 str r0, [r7, #4]
  97651. close(n->socket);
  97652. 80274a2: 687b ldr r3, [r7, #4]
  97653. 80274a4: 681b ldr r3, [r3, #0]
  97654. 80274a6: 4618 mov r0, r3
  97655. 80274a8: f7f0 f9e2 bl 8017870 <lwip_close>
  97656. n->socket = 0;
  97657. 80274ac: 687b ldr r3, [r7, #4]
  97658. 80274ae: 2200 movs r2, #0
  97659. 80274b0: 601a str r2, [r3, #0]
  97660. }
  97661. 80274b2: bf00 nop
  97662. 80274b4: 3708 adds r7, #8
  97663. 80274b6: 46bd mov sp, r7
  97664. 80274b8: bd80 pop {r7, pc}
  97665. 080274ba <MQTTSerialize_connectLength>:
  97666. * Determines the length of the MQTT connect packet that would be produced using the supplied connect options.
  97667. * @param options the options to be used to build the connect packet
  97668. * @return the length of buffer needed to contain the serialized version of the packet
  97669. */
  97670. int MQTTSerialize_connectLength(MQTTPacket_connectData* options)
  97671. {
  97672. 80274ba: b590 push {r4, r7, lr}
  97673. 80274bc: b085 sub sp, #20
  97674. 80274be: af00 add r7, sp, #0
  97675. 80274c0: 6078 str r0, [r7, #4]
  97676. int len = 0;
  97677. 80274c2: 2300 movs r3, #0
  97678. 80274c4: 60fb str r3, [r7, #12]
  97679. FUNC_ENTRY;
  97680. if (options->MQTTVersion == 3)
  97681. 80274c6: 687b ldr r3, [r7, #4]
  97682. 80274c8: 7a1b ldrb r3, [r3, #8]
  97683. 80274ca: 2b03 cmp r3, #3
  97684. 80274cc: d102 bne.n 80274d4 <MQTTSerialize_connectLength+0x1a>
  97685. len = 12; /* variable depending on MQTT or MQIsdp */
  97686. 80274ce: 230c movs r3, #12
  97687. 80274d0: 60fb str r3, [r7, #12]
  97688. 80274d2: e005 b.n 80274e0 <MQTTSerialize_connectLength+0x26>
  97689. else if (options->MQTTVersion == 4)
  97690. 80274d4: 687b ldr r3, [r7, #4]
  97691. 80274d6: 7a1b ldrb r3, [r3, #8]
  97692. 80274d8: 2b04 cmp r3, #4
  97693. 80274da: d101 bne.n 80274e0 <MQTTSerialize_connectLength+0x26>
  97694. len = 10;
  97695. 80274dc: 230a movs r3, #10
  97696. 80274de: 60fb str r3, [r7, #12]
  97697. len += MQTTstrlen(options->clientID)+2;
  97698. 80274e0: 687b ldr r3, [r7, #4]
  97699. 80274e2: 330c adds r3, #12
  97700. 80274e4: e893 0007 ldmia.w r3, {r0, r1, r2}
  97701. 80274e8: f000 fc43 bl 8027d72 <MQTTstrlen>
  97702. 80274ec: 4603 mov r3, r0
  97703. 80274ee: 3302 adds r3, #2
  97704. 80274f0: 68fa ldr r2, [r7, #12]
  97705. 80274f2: 4413 add r3, r2
  97706. 80274f4: 60fb str r3, [r7, #12]
  97707. if (options->willFlag)
  97708. 80274f6: 687b ldr r3, [r7, #4]
  97709. 80274f8: 7edb ldrb r3, [r3, #27]
  97710. 80274fa: 2b00 cmp r3, #0
  97711. 80274fc: d013 beq.n 8027526 <MQTTSerialize_connectLength+0x6c>
  97712. len += MQTTstrlen(options->will.topicName)+2 + MQTTstrlen(options->will.message)+2;
  97713. 80274fe: 687b ldr r3, [r7, #4]
  97714. 8027500: 3324 adds r3, #36 @ 0x24
  97715. 8027502: e893 0007 ldmia.w r3, {r0, r1, r2}
  97716. 8027506: f000 fc34 bl 8027d72 <MQTTstrlen>
  97717. 802750a: 4603 mov r3, r0
  97718. 802750c: 1c9c adds r4, r3, #2
  97719. 802750e: 687b ldr r3, [r7, #4]
  97720. 8027510: 3330 adds r3, #48 @ 0x30
  97721. 8027512: e893 0007 ldmia.w r3, {r0, r1, r2}
  97722. 8027516: f000 fc2c bl 8027d72 <MQTTstrlen>
  97723. 802751a: 4603 mov r3, r0
  97724. 802751c: 4423 add r3, r4
  97725. 802751e: 3302 adds r3, #2
  97726. 8027520: 68fa ldr r2, [r7, #12]
  97727. 8027522: 4413 add r3, r2
  97728. 8027524: 60fb str r3, [r7, #12]
  97729. if (options->username.cstring || options->username.lenstring.data)
  97730. 8027526: 687b ldr r3, [r7, #4]
  97731. 8027528: 6c1b ldr r3, [r3, #64] @ 0x40
  97732. 802752a: 2b00 cmp r3, #0
  97733. 802752c: d103 bne.n 8027536 <MQTTSerialize_connectLength+0x7c>
  97734. 802752e: 687b ldr r3, [r7, #4]
  97735. 8027530: 6c9b ldr r3, [r3, #72] @ 0x48
  97736. 8027532: 2b00 cmp r3, #0
  97737. 8027534: d00a beq.n 802754c <MQTTSerialize_connectLength+0x92>
  97738. len += MQTTstrlen(options->username)+2;
  97739. 8027536: 687b ldr r3, [r7, #4]
  97740. 8027538: 3340 adds r3, #64 @ 0x40
  97741. 802753a: e893 0007 ldmia.w r3, {r0, r1, r2}
  97742. 802753e: f000 fc18 bl 8027d72 <MQTTstrlen>
  97743. 8027542: 4603 mov r3, r0
  97744. 8027544: 3302 adds r3, #2
  97745. 8027546: 68fa ldr r2, [r7, #12]
  97746. 8027548: 4413 add r3, r2
  97747. 802754a: 60fb str r3, [r7, #12]
  97748. if (options->password.cstring || options->password.lenstring.data)
  97749. 802754c: 687b ldr r3, [r7, #4]
  97750. 802754e: 6cdb ldr r3, [r3, #76] @ 0x4c
  97751. 8027550: 2b00 cmp r3, #0
  97752. 8027552: d103 bne.n 802755c <MQTTSerialize_connectLength+0xa2>
  97753. 8027554: 687b ldr r3, [r7, #4]
  97754. 8027556: 6d5b ldr r3, [r3, #84] @ 0x54
  97755. 8027558: 2b00 cmp r3, #0
  97756. 802755a: d00a beq.n 8027572 <MQTTSerialize_connectLength+0xb8>
  97757. len += MQTTstrlen(options->password)+2;
  97758. 802755c: 687b ldr r3, [r7, #4]
  97759. 802755e: 334c adds r3, #76 @ 0x4c
  97760. 8027560: e893 0007 ldmia.w r3, {r0, r1, r2}
  97761. 8027564: f000 fc05 bl 8027d72 <MQTTstrlen>
  97762. 8027568: 4603 mov r3, r0
  97763. 802756a: 3302 adds r3, #2
  97764. 802756c: 68fa ldr r2, [r7, #12]
  97765. 802756e: 4413 add r3, r2
  97766. 8027570: 60fb str r3, [r7, #12]
  97767. FUNC_EXIT_RC(len);
  97768. return len;
  97769. 8027572: 68fb ldr r3, [r7, #12]
  97770. }
  97771. 8027574: 4618 mov r0, r3
  97772. 8027576: 3714 adds r7, #20
  97773. 8027578: 46bd mov sp, r7
  97774. 802757a: bd90 pop {r4, r7, pc}
  97775. 0802757c <MQTTSerialize_connect>:
  97776. * @param len the length in bytes of the supplied buffer
  97777. * @param options the options to be used to build the connect packet
  97778. * @return serialized length, or error if 0
  97779. */
  97780. int MQTTSerialize_connect(unsigned char* buf, int buflen, MQTTPacket_connectData* options)
  97781. {
  97782. 802757c: b580 push {r7, lr}
  97783. 802757e: b08a sub sp, #40 @ 0x28
  97784. 8027580: af00 add r7, sp, #0
  97785. 8027582: 60f8 str r0, [r7, #12]
  97786. 8027584: 60b9 str r1, [r7, #8]
  97787. 8027586: 607a str r2, [r7, #4]
  97788. unsigned char *ptr = buf;
  97789. 8027588: 68fb ldr r3, [r7, #12]
  97790. 802758a: 61fb str r3, [r7, #28]
  97791. MQTTHeader header = {0};
  97792. 802758c: 2300 movs r3, #0
  97793. 802758e: 61bb str r3, [r7, #24]
  97794. MQTTConnectFlags flags = {0};
  97795. 8027590: 2300 movs r3, #0
  97796. 8027592: 617b str r3, [r7, #20]
  97797. int len = 0;
  97798. 8027594: 2300 movs r3, #0
  97799. 8027596: 623b str r3, [r7, #32]
  97800. int rc = -1;
  97801. 8027598: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  97802. 802759c: 627b str r3, [r7, #36] @ 0x24
  97803. FUNC_ENTRY;
  97804. if (MQTTPacket_len(len = MQTTSerialize_connectLength(options)) > buflen)
  97805. 802759e: 6878 ldr r0, [r7, #4]
  97806. 80275a0: f7ff ff8b bl 80274ba <MQTTSerialize_connectLength>
  97807. 80275a4: 6238 str r0, [r7, #32]
  97808. 80275a6: 6a38 ldr r0, [r7, #32]
  97809. 80275a8: f000 fa98 bl 8027adc <MQTTPacket_len>
  97810. 80275ac: 4602 mov r2, r0
  97811. 80275ae: 68bb ldr r3, [r7, #8]
  97812. 80275b0: 4293 cmp r3, r2
  97813. 80275b2: da03 bge.n 80275bc <MQTTSerialize_connect+0x40>
  97814. {
  97815. rc = MQTTPACKET_BUFFER_TOO_SHORT;
  97816. 80275b4: f06f 0301 mvn.w r3, #1
  97817. 80275b8: 627b str r3, [r7, #36] @ 0x24
  97818. goto exit;
  97819. 80275ba: e0c2 b.n 8027742 <MQTTSerialize_connect+0x1c6>
  97820. }
  97821. header.byte = 0;
  97822. 80275bc: 2300 movs r3, #0
  97823. 80275be: 763b strb r3, [r7, #24]
  97824. header.bits.type = CONNECT;
  97825. 80275c0: 7e3b ldrb r3, [r7, #24]
  97826. 80275c2: 2201 movs r2, #1
  97827. 80275c4: f362 1307 bfi r3, r2, #4, #4
  97828. 80275c8: 763b strb r3, [r7, #24]
  97829. writeChar(&ptr, header.byte); /* write header */
  97830. 80275ca: 7e3a ldrb r2, [r7, #24]
  97831. 80275cc: f107 031c add.w r3, r7, #28
  97832. 80275d0: 4611 mov r1, r2
  97833. 80275d2: 4618 mov r0, r3
  97834. 80275d4: f000 fb11 bl 8027bfa <writeChar>
  97835. ptr += MQTTPacket_encode(ptr, len); /* write remaining length */
  97836. 80275d8: 69fb ldr r3, [r7, #28]
  97837. 80275da: 6a39 ldr r1, [r7, #32]
  97838. 80275dc: 4618 mov r0, r3
  97839. 80275de: f000 fa12 bl 8027a06 <MQTTPacket_encode>
  97840. 80275e2: 4602 mov r2, r0
  97841. 80275e4: 69fb ldr r3, [r7, #28]
  97842. 80275e6: 4413 add r3, r2
  97843. 80275e8: 61fb str r3, [r7, #28]
  97844. if (options->MQTTVersion == 4)
  97845. 80275ea: 687b ldr r3, [r7, #4]
  97846. 80275ec: 7a1b ldrb r3, [r3, #8]
  97847. 80275ee: 2b04 cmp r3, #4
  97848. 80275f0: d10c bne.n 802760c <MQTTSerialize_connect+0x90>
  97849. {
  97850. writeCString(&ptr, "MQTT");
  97851. 80275f2: f107 031c add.w r3, r7, #28
  97852. 80275f6: 4955 ldr r1, [pc, #340] @ (802774c <MQTTSerialize_connect+0x1d0>)
  97853. 80275f8: 4618 mov r0, r3
  97854. 80275fa: f000 fb3c bl 8027c76 <writeCString>
  97855. writeChar(&ptr, (char) 4);
  97856. 80275fe: f107 031c add.w r3, r7, #28
  97857. 8027602: 2104 movs r1, #4
  97858. 8027604: 4618 mov r0, r3
  97859. 8027606: f000 faf8 bl 8027bfa <writeChar>
  97860. 802760a: e00b b.n 8027624 <MQTTSerialize_connect+0xa8>
  97861. }
  97862. else
  97863. {
  97864. writeCString(&ptr, "MQIsdp");
  97865. 802760c: f107 031c add.w r3, r7, #28
  97866. 8027610: 494f ldr r1, [pc, #316] @ (8027750 <MQTTSerialize_connect+0x1d4>)
  97867. 8027612: 4618 mov r0, r3
  97868. 8027614: f000 fb2f bl 8027c76 <writeCString>
  97869. writeChar(&ptr, (char) 3);
  97870. 8027618: f107 031c add.w r3, r7, #28
  97871. 802761c: 2103 movs r1, #3
  97872. 802761e: 4618 mov r0, r3
  97873. 8027620: f000 faeb bl 8027bfa <writeChar>
  97874. }
  97875. flags.all = 0;
  97876. 8027624: 2300 movs r3, #0
  97877. 8027626: 753b strb r3, [r7, #20]
  97878. flags.bits.cleansession = options->cleansession;
  97879. 8027628: 687b ldr r3, [r7, #4]
  97880. 802762a: 7e9b ldrb r3, [r3, #26]
  97881. 802762c: f003 0301 and.w r3, r3, #1
  97882. 8027630: b2da uxtb r2, r3
  97883. 8027632: 7d3b ldrb r3, [r7, #20]
  97884. 8027634: f362 0341 bfi r3, r2, #1, #1
  97885. 8027638: 753b strb r3, [r7, #20]
  97886. flags.bits.will = (options->willFlag) ? 1 : 0;
  97887. 802763a: 687b ldr r3, [r7, #4]
  97888. 802763c: 7edb ldrb r3, [r3, #27]
  97889. 802763e: 2b00 cmp r3, #0
  97890. 8027640: bf14 ite ne
  97891. 8027642: 2301 movne r3, #1
  97892. 8027644: 2300 moveq r3, #0
  97893. 8027646: b2da uxtb r2, r3
  97894. 8027648: 7d3b ldrb r3, [r7, #20]
  97895. 802764a: f362 0382 bfi r3, r2, #2, #1
  97896. 802764e: 753b strb r3, [r7, #20]
  97897. if (flags.bits.will)
  97898. 8027650: 7d3b ldrb r3, [r7, #20]
  97899. 8027652: f003 0304 and.w r3, r3, #4
  97900. 8027656: b2db uxtb r3, r3
  97901. 8027658: 2b00 cmp r3, #0
  97902. 802765a: d013 beq.n 8027684 <MQTTSerialize_connect+0x108>
  97903. {
  97904. flags.bits.willQoS = options->will.qos;
  97905. 802765c: 687b ldr r3, [r7, #4]
  97906. 802765e: f893 303d ldrb.w r3, [r3, #61] @ 0x3d
  97907. 8027662: f003 0303 and.w r3, r3, #3
  97908. 8027666: b2da uxtb r2, r3
  97909. 8027668: 7d3b ldrb r3, [r7, #20]
  97910. 802766a: f362 03c4 bfi r3, r2, #3, #2
  97911. 802766e: 753b strb r3, [r7, #20]
  97912. flags.bits.willRetain = options->will.retained;
  97913. 8027670: 687b ldr r3, [r7, #4]
  97914. 8027672: f893 303c ldrb.w r3, [r3, #60] @ 0x3c
  97915. 8027676: f003 0301 and.w r3, r3, #1
  97916. 802767a: b2da uxtb r2, r3
  97917. 802767c: 7d3b ldrb r3, [r7, #20]
  97918. 802767e: f362 1345 bfi r3, r2, #5, #1
  97919. 8027682: 753b strb r3, [r7, #20]
  97920. }
  97921. if (options->username.cstring || options->username.lenstring.data)
  97922. 8027684: 687b ldr r3, [r7, #4]
  97923. 8027686: 6c1b ldr r3, [r3, #64] @ 0x40
  97924. 8027688: 2b00 cmp r3, #0
  97925. 802768a: d103 bne.n 8027694 <MQTTSerialize_connect+0x118>
  97926. 802768c: 687b ldr r3, [r7, #4]
  97927. 802768e: 6c9b ldr r3, [r3, #72] @ 0x48
  97928. 8027690: 2b00 cmp r3, #0
  97929. 8027692: d003 beq.n 802769c <MQTTSerialize_connect+0x120>
  97930. flags.bits.username = 1;
  97931. 8027694: 7d3b ldrb r3, [r7, #20]
  97932. 8027696: f043 0380 orr.w r3, r3, #128 @ 0x80
  97933. 802769a: 753b strb r3, [r7, #20]
  97934. if (options->password.cstring || options->password.lenstring.data)
  97935. 802769c: 687b ldr r3, [r7, #4]
  97936. 802769e: 6cdb ldr r3, [r3, #76] @ 0x4c
  97937. 80276a0: 2b00 cmp r3, #0
  97938. 80276a2: d103 bne.n 80276ac <MQTTSerialize_connect+0x130>
  97939. 80276a4: 687b ldr r3, [r7, #4]
  97940. 80276a6: 6d5b ldr r3, [r3, #84] @ 0x54
  97941. 80276a8: 2b00 cmp r3, #0
  97942. 80276aa: d003 beq.n 80276b4 <MQTTSerialize_connect+0x138>
  97943. flags.bits.password = 1;
  97944. 80276ac: 7d3b ldrb r3, [r7, #20]
  97945. 80276ae: f043 0340 orr.w r3, r3, #64 @ 0x40
  97946. 80276b2: 753b strb r3, [r7, #20]
  97947. writeChar(&ptr, flags.all);
  97948. 80276b4: 7d3a ldrb r2, [r7, #20]
  97949. 80276b6: f107 031c add.w r3, r7, #28
  97950. 80276ba: 4611 mov r1, r2
  97951. 80276bc: 4618 mov r0, r3
  97952. 80276be: f000 fa9c bl 8027bfa <writeChar>
  97953. writeInt(&ptr, options->keepAliveInterval);
  97954. 80276c2: 687b ldr r3, [r7, #4]
  97955. 80276c4: 8b1b ldrh r3, [r3, #24]
  97956. 80276c6: 461a mov r2, r3
  97957. 80276c8: f107 031c add.w r3, r7, #28
  97958. 80276cc: 4611 mov r1, r2
  97959. 80276ce: 4618 mov r0, r3
  97960. 80276d0: f000 faa8 bl 8027c24 <writeInt>
  97961. writeMQTTString(&ptr, options->clientID);
  97962. 80276d4: 687b ldr r3, [r7, #4]
  97963. 80276d6: f107 001c add.w r0, r7, #28
  97964. 80276da: 330c adds r3, #12
  97965. 80276dc: cb0e ldmia r3, {r1, r2, r3}
  97966. 80276de: f000 fae9 bl 8027cb4 <writeMQTTString>
  97967. if (options->willFlag)
  97968. 80276e2: 687b ldr r3, [r7, #4]
  97969. 80276e4: 7edb ldrb r3, [r3, #27]
  97970. 80276e6: 2b00 cmp r3, #0
  97971. 80276e8: d00d beq.n 8027706 <MQTTSerialize_connect+0x18a>
  97972. {
  97973. writeMQTTString(&ptr, options->will.topicName);
  97974. 80276ea: 687b ldr r3, [r7, #4]
  97975. 80276ec: f107 001c add.w r0, r7, #28
  97976. 80276f0: 3324 adds r3, #36 @ 0x24
  97977. 80276f2: cb0e ldmia r3, {r1, r2, r3}
  97978. 80276f4: f000 fade bl 8027cb4 <writeMQTTString>
  97979. writeMQTTString(&ptr, options->will.message);
  97980. 80276f8: 687b ldr r3, [r7, #4]
  97981. 80276fa: f107 001c add.w r0, r7, #28
  97982. 80276fe: 3330 adds r3, #48 @ 0x30
  97983. 8027700: cb0e ldmia r3, {r1, r2, r3}
  97984. 8027702: f000 fad7 bl 8027cb4 <writeMQTTString>
  97985. }
  97986. if (flags.bits.username)
  97987. 8027706: 7d3b ldrb r3, [r7, #20]
  97988. 8027708: f023 037f bic.w r3, r3, #127 @ 0x7f
  97989. 802770c: b2db uxtb r3, r3
  97990. 802770e: 2b00 cmp r3, #0
  97991. 8027710: d006 beq.n 8027720 <MQTTSerialize_connect+0x1a4>
  97992. writeMQTTString(&ptr, options->username);
  97993. 8027712: 687b ldr r3, [r7, #4]
  97994. 8027714: f107 001c add.w r0, r7, #28
  97995. 8027718: 3340 adds r3, #64 @ 0x40
  97996. 802771a: cb0e ldmia r3, {r1, r2, r3}
  97997. 802771c: f000 faca bl 8027cb4 <writeMQTTString>
  97998. if (flags.bits.password)
  97999. 8027720: 7d3b ldrb r3, [r7, #20]
  98000. 8027722: f003 0340 and.w r3, r3, #64 @ 0x40
  98001. 8027726: b2db uxtb r3, r3
  98002. 8027728: 2b00 cmp r3, #0
  98003. 802772a: d006 beq.n 802773a <MQTTSerialize_connect+0x1be>
  98004. writeMQTTString(&ptr, options->password);
  98005. 802772c: 687b ldr r3, [r7, #4]
  98006. 802772e: f107 001c add.w r0, r7, #28
  98007. 8027732: 334c adds r3, #76 @ 0x4c
  98008. 8027734: cb0e ldmia r3, {r1, r2, r3}
  98009. 8027736: f000 fabd bl 8027cb4 <writeMQTTString>
  98010. rc = ptr - buf;
  98011. 802773a: 69fa ldr r2, [r7, #28]
  98012. 802773c: 68fb ldr r3, [r7, #12]
  98013. 802773e: 1ad3 subs r3, r2, r3
  98014. 8027740: 627b str r3, [r7, #36] @ 0x24
  98015. exit: FUNC_EXIT_RC(rc);
  98016. return rc;
  98017. 8027742: 6a7b ldr r3, [r7, #36] @ 0x24
  98018. }
  98019. 8027744: 4618 mov r0, r3
  98020. 8027746: 3728 adds r7, #40 @ 0x28
  98021. 8027748: 46bd mov sp, r7
  98022. 802774a: bd80 pop {r7, pc}
  98023. 802774c: 08030980 .word 0x08030980
  98024. 8027750: 08030988 .word 0x08030988
  98025. 08027754 <MQTTDeserialize_connack>:
  98026. * @param buf the raw buffer data, of the correct length determined by the remaining length field
  98027. * @param len the length in bytes of the data in the supplied buffer
  98028. * @return error code. 1 is success, 0 is failure
  98029. */
  98030. int MQTTDeserialize_connack(unsigned char* sessionPresent, unsigned char* connack_rc, unsigned char* buf, int buflen)
  98031. {
  98032. 8027754: b580 push {r7, lr}
  98033. 8027756: b08a sub sp, #40 @ 0x28
  98034. 8027758: af00 add r7, sp, #0
  98035. 802775a: 60f8 str r0, [r7, #12]
  98036. 802775c: 60b9 str r1, [r7, #8]
  98037. 802775e: 607a str r2, [r7, #4]
  98038. 8027760: 603b str r3, [r7, #0]
  98039. MQTTHeader header = {0};
  98040. 8027762: 2300 movs r3, #0
  98041. 8027764: 61fb str r3, [r7, #28]
  98042. unsigned char* curdata = buf;
  98043. 8027766: 687b ldr r3, [r7, #4]
  98044. 8027768: 61bb str r3, [r7, #24]
  98045. unsigned char* enddata = NULL;
  98046. 802776a: 2300 movs r3, #0
  98047. 802776c: 623b str r3, [r7, #32]
  98048. int rc = 0;
  98049. 802776e: 2300 movs r3, #0
  98050. 8027770: 627b str r3, [r7, #36] @ 0x24
  98051. int mylen;
  98052. MQTTConnackFlags flags = {0};
  98053. 8027772: 2300 movs r3, #0
  98054. 8027774: 613b str r3, [r7, #16]
  98055. FUNC_ENTRY;
  98056. header.byte = readChar(&curdata);
  98057. 8027776: f107 0318 add.w r3, r7, #24
  98058. 802777a: 4618 mov r0, r3
  98059. 802777c: f000 fa29 bl 8027bd2 <readChar>
  98060. 8027780: 4603 mov r3, r0
  98061. 8027782: 773b strb r3, [r7, #28]
  98062. if (header.bits.type != CONNACK)
  98063. 8027784: 7f3b ldrb r3, [r7, #28]
  98064. 8027786: f023 030f bic.w r3, r3, #15
  98065. 802778a: b2db uxtb r3, r3
  98066. 802778c: 2b20 cmp r3, #32
  98067. 802778e: d12e bne.n 80277ee <MQTTDeserialize_connack+0x9a>
  98068. goto exit;
  98069. curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */
  98070. 8027790: 69bb ldr r3, [r7, #24]
  98071. 8027792: f107 0214 add.w r2, r7, #20
  98072. 8027796: 4611 mov r1, r2
  98073. 8027798: 4618 mov r0, r3
  98074. 802779a: f000 f9e9 bl 8027b70 <MQTTPacket_decodeBuf>
  98075. 802779e: 6278 str r0, [r7, #36] @ 0x24
  98076. 80277a0: 6a7a ldr r2, [r7, #36] @ 0x24
  98077. 80277a2: 69bb ldr r3, [r7, #24]
  98078. 80277a4: 4413 add r3, r2
  98079. 80277a6: 61bb str r3, [r7, #24]
  98080. enddata = curdata + mylen;
  98081. 80277a8: 69bb ldr r3, [r7, #24]
  98082. 80277aa: 697a ldr r2, [r7, #20]
  98083. 80277ac: 4413 add r3, r2
  98084. 80277ae: 623b str r3, [r7, #32]
  98085. if (enddata - curdata < 2)
  98086. 80277b0: 69bb ldr r3, [r7, #24]
  98087. 80277b2: 6a3a ldr r2, [r7, #32]
  98088. 80277b4: 1ad3 subs r3, r2, r3
  98089. 80277b6: 2b01 cmp r3, #1
  98090. 80277b8: dd1b ble.n 80277f2 <MQTTDeserialize_connack+0x9e>
  98091. goto exit;
  98092. flags.all = readChar(&curdata);
  98093. 80277ba: f107 0318 add.w r3, r7, #24
  98094. 80277be: 4618 mov r0, r3
  98095. 80277c0: f000 fa07 bl 8027bd2 <readChar>
  98096. 80277c4: 4603 mov r3, r0
  98097. 80277c6: 743b strb r3, [r7, #16]
  98098. *sessionPresent = flags.bits.sessionpresent;
  98099. 80277c8: 7c3b ldrb r3, [r7, #16]
  98100. 80277ca: f3c3 0300 ubfx r3, r3, #0, #1
  98101. 80277ce: b2db uxtb r3, r3
  98102. 80277d0: 461a mov r2, r3
  98103. 80277d2: 68fb ldr r3, [r7, #12]
  98104. 80277d4: 701a strb r2, [r3, #0]
  98105. *connack_rc = readChar(&curdata);
  98106. 80277d6: f107 0318 add.w r3, r7, #24
  98107. 80277da: 4618 mov r0, r3
  98108. 80277dc: f000 f9f9 bl 8027bd2 <readChar>
  98109. 80277e0: 4603 mov r3, r0
  98110. 80277e2: 461a mov r2, r3
  98111. 80277e4: 68bb ldr r3, [r7, #8]
  98112. 80277e6: 701a strb r2, [r3, #0]
  98113. rc = 1;
  98114. 80277e8: 2301 movs r3, #1
  98115. 80277ea: 627b str r3, [r7, #36] @ 0x24
  98116. 80277ec: e002 b.n 80277f4 <MQTTDeserialize_connack+0xa0>
  98117. goto exit;
  98118. 80277ee: bf00 nop
  98119. 80277f0: e000 b.n 80277f4 <MQTTDeserialize_connack+0xa0>
  98120. goto exit;
  98121. 80277f2: bf00 nop
  98122. exit:
  98123. FUNC_EXIT_RC(rc);
  98124. return rc;
  98125. 80277f4: 6a7b ldr r3, [r7, #36] @ 0x24
  98126. }
  98127. 80277f6: 4618 mov r0, r3
  98128. 80277f8: 3728 adds r7, #40 @ 0x28
  98129. 80277fa: 46bd mov sp, r7
  98130. 80277fc: bd80 pop {r7, pc}
  98131. 080277fe <MQTTSerialize_zero>:
  98132. * @param buflen the length in bytes of the supplied buffer, to avoid overruns
  98133. * @param packettype the message type
  98134. * @return serialized length, or error if 0
  98135. */
  98136. int MQTTSerialize_zero(unsigned char* buf, int buflen, unsigned char packettype)
  98137. {
  98138. 80277fe: b580 push {r7, lr}
  98139. 8027800: b088 sub sp, #32
  98140. 8027802: af00 add r7, sp, #0
  98141. 8027804: 60f8 str r0, [r7, #12]
  98142. 8027806: 60b9 str r1, [r7, #8]
  98143. 8027808: 4613 mov r3, r2
  98144. 802780a: 71fb strb r3, [r7, #7]
  98145. MQTTHeader header = {0};
  98146. 802780c: 2300 movs r3, #0
  98147. 802780e: 61bb str r3, [r7, #24]
  98148. int rc = -1;
  98149. 8027810: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  98150. 8027814: 61fb str r3, [r7, #28]
  98151. unsigned char *ptr = buf;
  98152. 8027816: 68fb ldr r3, [r7, #12]
  98153. 8027818: 617b str r3, [r7, #20]
  98154. FUNC_ENTRY;
  98155. if (buflen < 2)
  98156. 802781a: 68bb ldr r3, [r7, #8]
  98157. 802781c: 2b01 cmp r3, #1
  98158. 802781e: dc03 bgt.n 8027828 <MQTTSerialize_zero+0x2a>
  98159. {
  98160. rc = MQTTPACKET_BUFFER_TOO_SHORT;
  98161. 8027820: f06f 0301 mvn.w r3, #1
  98162. 8027824: 61fb str r3, [r7, #28]
  98163. goto exit;
  98164. 8027826: e01d b.n 8027864 <MQTTSerialize_zero+0x66>
  98165. }
  98166. header.byte = 0;
  98167. 8027828: 2300 movs r3, #0
  98168. 802782a: 763b strb r3, [r7, #24]
  98169. header.bits.type = packettype;
  98170. 802782c: 79fb ldrb r3, [r7, #7]
  98171. 802782e: f003 030f and.w r3, r3, #15
  98172. 8027832: b2da uxtb r2, r3
  98173. 8027834: 7e3b ldrb r3, [r7, #24]
  98174. 8027836: f362 1307 bfi r3, r2, #4, #4
  98175. 802783a: 763b strb r3, [r7, #24]
  98176. writeChar(&ptr, header.byte); /* write header */
  98177. 802783c: 7e3a ldrb r2, [r7, #24]
  98178. 802783e: f107 0314 add.w r3, r7, #20
  98179. 8027842: 4611 mov r1, r2
  98180. 8027844: 4618 mov r0, r3
  98181. 8027846: f000 f9d8 bl 8027bfa <writeChar>
  98182. ptr += MQTTPacket_encode(ptr, 0); /* write remaining length */
  98183. 802784a: 697b ldr r3, [r7, #20]
  98184. 802784c: 2100 movs r1, #0
  98185. 802784e: 4618 mov r0, r3
  98186. 8027850: f000 f8d9 bl 8027a06 <MQTTPacket_encode>
  98187. 8027854: 4602 mov r2, r0
  98188. 8027856: 697b ldr r3, [r7, #20]
  98189. 8027858: 4413 add r3, r2
  98190. 802785a: 617b str r3, [r7, #20]
  98191. rc = ptr - buf;
  98192. 802785c: 697a ldr r2, [r7, #20]
  98193. 802785e: 68fb ldr r3, [r7, #12]
  98194. 8027860: 1ad3 subs r3, r2, r3
  98195. 8027862: 61fb str r3, [r7, #28]
  98196. exit:
  98197. FUNC_EXIT_RC(rc);
  98198. return rc;
  98199. 8027864: 69fb ldr r3, [r7, #28]
  98200. }
  98201. 8027866: 4618 mov r0, r3
  98202. 8027868: 3720 adds r7, #32
  98203. 802786a: 46bd mov sp, r7
  98204. 802786c: bd80 pop {r7, pc}
  98205. 0802786e <MQTTSerialize_pingreq>:
  98206. * @param buf the buffer into which the packet will be serialized
  98207. * @param buflen the length in bytes of the supplied buffer, to avoid overruns
  98208. * @return serialized length, or error if 0
  98209. */
  98210. int MQTTSerialize_pingreq(unsigned char* buf, int buflen)
  98211. {
  98212. 802786e: b580 push {r7, lr}
  98213. 8027870: b082 sub sp, #8
  98214. 8027872: af00 add r7, sp, #0
  98215. 8027874: 6078 str r0, [r7, #4]
  98216. 8027876: 6039 str r1, [r7, #0]
  98217. return MQTTSerialize_zero(buf, buflen, PINGREQ);
  98218. 8027878: 220c movs r2, #12
  98219. 802787a: 6839 ldr r1, [r7, #0]
  98220. 802787c: 6878 ldr r0, [r7, #4]
  98221. 802787e: f7ff ffbe bl 80277fe <MQTTSerialize_zero>
  98222. 8027882: 4603 mov r3, r0
  98223. }
  98224. 8027884: 4618 mov r0, r3
  98225. 8027886: 3708 adds r7, #8
  98226. 8027888: 46bd mov sp, r7
  98227. 802788a: bd80 pop {r7, pc}
  98228. 0802788c <MQTTDeserialize_publish>:
  98229. * @param buflen the length in bytes of the data in the supplied buffer
  98230. * @return error code. 1 is success
  98231. */
  98232. int MQTTDeserialize_publish(unsigned char* dup, int* qos, unsigned char* retained, unsigned short* packetid, MQTTString* topicName,
  98233. unsigned char** payload, int* payloadlen, unsigned char* buf, int buflen)
  98234. {
  98235. 802788c: b580 push {r7, lr}
  98236. 802788e: b08a sub sp, #40 @ 0x28
  98237. 8027890: af00 add r7, sp, #0
  98238. 8027892: 60f8 str r0, [r7, #12]
  98239. 8027894: 60b9 str r1, [r7, #8]
  98240. 8027896: 607a str r2, [r7, #4]
  98241. 8027898: 603b str r3, [r7, #0]
  98242. MQTTHeader header = {0};
  98243. 802789a: 2300 movs r3, #0
  98244. 802789c: 61fb str r3, [r7, #28]
  98245. unsigned char* curdata = buf;
  98246. 802789e: 6bfb ldr r3, [r7, #60] @ 0x3c
  98247. 80278a0: 61bb str r3, [r7, #24]
  98248. unsigned char* enddata = NULL;
  98249. 80278a2: 2300 movs r3, #0
  98250. 80278a4: 623b str r3, [r7, #32]
  98251. int rc = 0;
  98252. 80278a6: 2300 movs r3, #0
  98253. 80278a8: 627b str r3, [r7, #36] @ 0x24
  98254. int mylen = 0;
  98255. 80278aa: 2300 movs r3, #0
  98256. 80278ac: 617b str r3, [r7, #20]
  98257. FUNC_ENTRY;
  98258. header.byte = readChar(&curdata);
  98259. 80278ae: f107 0318 add.w r3, r7, #24
  98260. 80278b2: 4618 mov r0, r3
  98261. 80278b4: f000 f98d bl 8027bd2 <readChar>
  98262. 80278b8: 4603 mov r3, r0
  98263. 80278ba: 773b strb r3, [r7, #28]
  98264. if (header.bits.type != PUBLISH)
  98265. 80278bc: 7f3b ldrb r3, [r7, #28]
  98266. 80278be: f023 030f bic.w r3, r3, #15
  98267. 80278c2: b2db uxtb r3, r3
  98268. 80278c4: 2b30 cmp r3, #48 @ 0x30
  98269. 80278c6: d14b bne.n 8027960 <MQTTDeserialize_publish+0xd4>
  98270. goto exit;
  98271. *dup = header.bits.dup;
  98272. 80278c8: 7f3b ldrb r3, [r7, #28]
  98273. 80278ca: f3c3 03c0 ubfx r3, r3, #3, #1
  98274. 80278ce: b2db uxtb r3, r3
  98275. 80278d0: 461a mov r2, r3
  98276. 80278d2: 68fb ldr r3, [r7, #12]
  98277. 80278d4: 701a strb r2, [r3, #0]
  98278. *qos = header.bits.qos;
  98279. 80278d6: 7f3b ldrb r3, [r7, #28]
  98280. 80278d8: f3c3 0341 ubfx r3, r3, #1, #2
  98281. 80278dc: b2db uxtb r3, r3
  98282. 80278de: 461a mov r2, r3
  98283. 80278e0: 68bb ldr r3, [r7, #8]
  98284. 80278e2: 601a str r2, [r3, #0]
  98285. *retained = header.bits.retain;
  98286. 80278e4: 7f3b ldrb r3, [r7, #28]
  98287. 80278e6: f3c3 0300 ubfx r3, r3, #0, #1
  98288. 80278ea: b2db uxtb r3, r3
  98289. 80278ec: 461a mov r2, r3
  98290. 80278ee: 687b ldr r3, [r7, #4]
  98291. 80278f0: 701a strb r2, [r3, #0]
  98292. curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */
  98293. 80278f2: 69bb ldr r3, [r7, #24]
  98294. 80278f4: f107 0214 add.w r2, r7, #20
  98295. 80278f8: 4611 mov r1, r2
  98296. 80278fa: 4618 mov r0, r3
  98297. 80278fc: f000 f938 bl 8027b70 <MQTTPacket_decodeBuf>
  98298. 8027900: 6278 str r0, [r7, #36] @ 0x24
  98299. 8027902: 6a7a ldr r2, [r7, #36] @ 0x24
  98300. 8027904: 69bb ldr r3, [r7, #24]
  98301. 8027906: 4413 add r3, r2
  98302. 8027908: 61bb str r3, [r7, #24]
  98303. enddata = curdata + mylen;
  98304. 802790a: 69bb ldr r3, [r7, #24]
  98305. 802790c: 697a ldr r2, [r7, #20]
  98306. 802790e: 4413 add r3, r2
  98307. 8027910: 623b str r3, [r7, #32]
  98308. if (!readMQTTLenString(topicName, &curdata, enddata) ||
  98309. 8027912: f107 0318 add.w r3, r7, #24
  98310. 8027916: 6a3a ldr r2, [r7, #32]
  98311. 8027918: 4619 mov r1, r3
  98312. 802791a: 6b38 ldr r0, [r7, #48] @ 0x30
  98313. 802791c: f000 f9f8 bl 8027d10 <readMQTTLenString>
  98314. 8027920: 4603 mov r3, r0
  98315. 8027922: 2b00 cmp r3, #0
  98316. 8027924: d01e beq.n 8027964 <MQTTDeserialize_publish+0xd8>
  98317. enddata - curdata < 0) /* do we have enough data to read the protocol version byte? */
  98318. 8027926: 69bb ldr r3, [r7, #24]
  98319. 8027928: 6a3a ldr r2, [r7, #32]
  98320. 802792a: 1ad3 subs r3, r2, r3
  98321. if (!readMQTTLenString(topicName, &curdata, enddata) ||
  98322. 802792c: 2b00 cmp r3, #0
  98323. 802792e: db19 blt.n 8027964 <MQTTDeserialize_publish+0xd8>
  98324. goto exit;
  98325. if (*qos > 0)
  98326. 8027930: 68bb ldr r3, [r7, #8]
  98327. 8027932: 681b ldr r3, [r3, #0]
  98328. 8027934: 2b00 cmp r3, #0
  98329. 8027936: dd08 ble.n 802794a <MQTTDeserialize_publish+0xbe>
  98330. *packetid = readInt(&curdata);
  98331. 8027938: f107 0318 add.w r3, r7, #24
  98332. 802793c: 4618 mov r0, r3
  98333. 802793e: f000 f92d bl 8027b9c <readInt>
  98334. 8027942: 4603 mov r3, r0
  98335. 8027944: b29a uxth r2, r3
  98336. 8027946: 683b ldr r3, [r7, #0]
  98337. 8027948: 801a strh r2, [r3, #0]
  98338. *payloadlen = enddata - curdata;
  98339. 802794a: 69bb ldr r3, [r7, #24]
  98340. 802794c: 6a3a ldr r2, [r7, #32]
  98341. 802794e: 1ad2 subs r2, r2, r3
  98342. 8027950: 6bbb ldr r3, [r7, #56] @ 0x38
  98343. 8027952: 601a str r2, [r3, #0]
  98344. *payload = curdata;
  98345. 8027954: 69ba ldr r2, [r7, #24]
  98346. 8027956: 6b7b ldr r3, [r7, #52] @ 0x34
  98347. 8027958: 601a str r2, [r3, #0]
  98348. rc = 1;
  98349. 802795a: 2301 movs r3, #1
  98350. 802795c: 627b str r3, [r7, #36] @ 0x24
  98351. 802795e: e002 b.n 8027966 <MQTTDeserialize_publish+0xda>
  98352. goto exit;
  98353. 8027960: bf00 nop
  98354. 8027962: e000 b.n 8027966 <MQTTDeserialize_publish+0xda>
  98355. goto exit;
  98356. 8027964: bf00 nop
  98357. exit:
  98358. FUNC_EXIT_RC(rc);
  98359. return rc;
  98360. 8027966: 6a7b ldr r3, [r7, #36] @ 0x24
  98361. }
  98362. 8027968: 4618 mov r0, r3
  98363. 802796a: 3728 adds r7, #40 @ 0x28
  98364. 802796c: 46bd mov sp, r7
  98365. 802796e: bd80 pop {r7, pc}
  98366. 08027970 <MQTTDeserialize_ack>:
  98367. * @param buf the raw buffer data, of the correct length determined by the remaining length field
  98368. * @param buflen the length in bytes of the data in the supplied buffer
  98369. * @return error code. 1 is success, 0 is failure
  98370. */
  98371. int MQTTDeserialize_ack(unsigned char* packettype, unsigned char* dup, unsigned short* packetid, unsigned char* buf, int buflen)
  98372. {
  98373. 8027970: b580 push {r7, lr}
  98374. 8027972: b08a sub sp, #40 @ 0x28
  98375. 8027974: af00 add r7, sp, #0
  98376. 8027976: 60f8 str r0, [r7, #12]
  98377. 8027978: 60b9 str r1, [r7, #8]
  98378. 802797a: 607a str r2, [r7, #4]
  98379. 802797c: 603b str r3, [r7, #0]
  98380. MQTTHeader header = {0};
  98381. 802797e: 2300 movs r3, #0
  98382. 8027980: 61fb str r3, [r7, #28]
  98383. unsigned char* curdata = buf;
  98384. 8027982: 683b ldr r3, [r7, #0]
  98385. 8027984: 61bb str r3, [r7, #24]
  98386. unsigned char* enddata = NULL;
  98387. 8027986: 2300 movs r3, #0
  98388. 8027988: 623b str r3, [r7, #32]
  98389. int rc = 0;
  98390. 802798a: 2300 movs r3, #0
  98391. 802798c: 627b str r3, [r7, #36] @ 0x24
  98392. int mylen;
  98393. FUNC_ENTRY;
  98394. header.byte = readChar(&curdata);
  98395. 802798e: f107 0318 add.w r3, r7, #24
  98396. 8027992: 4618 mov r0, r3
  98397. 8027994: f000 f91d bl 8027bd2 <readChar>
  98398. 8027998: 4603 mov r3, r0
  98399. 802799a: 773b strb r3, [r7, #28]
  98400. *dup = header.bits.dup;
  98401. 802799c: 7f3b ldrb r3, [r7, #28]
  98402. 802799e: f3c3 03c0 ubfx r3, r3, #3, #1
  98403. 80279a2: b2db uxtb r3, r3
  98404. 80279a4: 461a mov r2, r3
  98405. 80279a6: 68bb ldr r3, [r7, #8]
  98406. 80279a8: 701a strb r2, [r3, #0]
  98407. *packettype = header.bits.type;
  98408. 80279aa: 7f3b ldrb r3, [r7, #28]
  98409. 80279ac: f3c3 1303 ubfx r3, r3, #4, #4
  98410. 80279b0: b2db uxtb r3, r3
  98411. 80279b2: 461a mov r2, r3
  98412. 80279b4: 68fb ldr r3, [r7, #12]
  98413. 80279b6: 701a strb r2, [r3, #0]
  98414. curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */
  98415. 80279b8: 69bb ldr r3, [r7, #24]
  98416. 80279ba: f107 0214 add.w r2, r7, #20
  98417. 80279be: 4611 mov r1, r2
  98418. 80279c0: 4618 mov r0, r3
  98419. 80279c2: f000 f8d5 bl 8027b70 <MQTTPacket_decodeBuf>
  98420. 80279c6: 6278 str r0, [r7, #36] @ 0x24
  98421. 80279c8: 6a7a ldr r2, [r7, #36] @ 0x24
  98422. 80279ca: 69bb ldr r3, [r7, #24]
  98423. 80279cc: 4413 add r3, r2
  98424. 80279ce: 61bb str r3, [r7, #24]
  98425. enddata = curdata + mylen;
  98426. 80279d0: 69bb ldr r3, [r7, #24]
  98427. 80279d2: 697a ldr r2, [r7, #20]
  98428. 80279d4: 4413 add r3, r2
  98429. 80279d6: 623b str r3, [r7, #32]
  98430. if (enddata - curdata < 2)
  98431. 80279d8: 69bb ldr r3, [r7, #24]
  98432. 80279da: 6a3a ldr r2, [r7, #32]
  98433. 80279dc: 1ad3 subs r3, r2, r3
  98434. 80279de: 2b01 cmp r3, #1
  98435. 80279e0: dd0b ble.n 80279fa <MQTTDeserialize_ack+0x8a>
  98436. goto exit;
  98437. *packetid = readInt(&curdata);
  98438. 80279e2: f107 0318 add.w r3, r7, #24
  98439. 80279e6: 4618 mov r0, r3
  98440. 80279e8: f000 f8d8 bl 8027b9c <readInt>
  98441. 80279ec: 4603 mov r3, r0
  98442. 80279ee: b29a uxth r2, r3
  98443. 80279f0: 687b ldr r3, [r7, #4]
  98444. 80279f2: 801a strh r2, [r3, #0]
  98445. rc = 1;
  98446. 80279f4: 2301 movs r3, #1
  98447. 80279f6: 627b str r3, [r7, #36] @ 0x24
  98448. 80279f8: e000 b.n 80279fc <MQTTDeserialize_ack+0x8c>
  98449. goto exit;
  98450. 80279fa: bf00 nop
  98451. exit:
  98452. FUNC_EXIT_RC(rc);
  98453. return rc;
  98454. 80279fc: 6a7b ldr r3, [r7, #36] @ 0x24
  98455. }
  98456. 80279fe: 4618 mov r0, r3
  98457. 8027a00: 3728 adds r7, #40 @ 0x28
  98458. 8027a02: 46bd mov sp, r7
  98459. 8027a04: bd80 pop {r7, pc}
  98460. 08027a06 <MQTTPacket_encode>:
  98461. * @param buf the buffer into which the encoded data is written
  98462. * @param length the length to be encoded
  98463. * @return the number of bytes written to buffer
  98464. */
  98465. int MQTTPacket_encode(unsigned char* buf, int length)
  98466. {
  98467. 8027a06: b480 push {r7}
  98468. 8027a08: b085 sub sp, #20
  98469. 8027a0a: af00 add r7, sp, #0
  98470. 8027a0c: 6078 str r0, [r7, #4]
  98471. 8027a0e: 6039 str r1, [r7, #0]
  98472. int rc = 0;
  98473. 8027a10: 2300 movs r3, #0
  98474. 8027a12: 60fb str r3, [r7, #12]
  98475. FUNC_ENTRY;
  98476. do
  98477. {
  98478. char d = length % 128;
  98479. 8027a14: 683b ldr r3, [r7, #0]
  98480. 8027a16: 425a negs r2, r3
  98481. 8027a18: f003 037f and.w r3, r3, #127 @ 0x7f
  98482. 8027a1c: f002 027f and.w r2, r2, #127 @ 0x7f
  98483. 8027a20: bf58 it pl
  98484. 8027a22: 4253 negpl r3, r2
  98485. 8027a24: 72fb strb r3, [r7, #11]
  98486. length /= 128;
  98487. 8027a26: 683b ldr r3, [r7, #0]
  98488. 8027a28: 2b00 cmp r3, #0
  98489. 8027a2a: da00 bge.n 8027a2e <MQTTPacket_encode+0x28>
  98490. 8027a2c: 337f adds r3, #127 @ 0x7f
  98491. 8027a2e: 11db asrs r3, r3, #7
  98492. 8027a30: 603b str r3, [r7, #0]
  98493. /* if there are more digits to encode, set the top bit of this digit */
  98494. if (length > 0)
  98495. 8027a32: 683b ldr r3, [r7, #0]
  98496. 8027a34: 2b00 cmp r3, #0
  98497. 8027a36: dd03 ble.n 8027a40 <MQTTPacket_encode+0x3a>
  98498. d |= 0x80;
  98499. 8027a38: 7afb ldrb r3, [r7, #11]
  98500. 8027a3a: f063 037f orn r3, r3, #127 @ 0x7f
  98501. 8027a3e: 72fb strb r3, [r7, #11]
  98502. buf[rc++] = d;
  98503. 8027a40: 68fb ldr r3, [r7, #12]
  98504. 8027a42: 1c5a adds r2, r3, #1
  98505. 8027a44: 60fa str r2, [r7, #12]
  98506. 8027a46: 461a mov r2, r3
  98507. 8027a48: 687b ldr r3, [r7, #4]
  98508. 8027a4a: 4413 add r3, r2
  98509. 8027a4c: 7afa ldrb r2, [r7, #11]
  98510. 8027a4e: 701a strb r2, [r3, #0]
  98511. } while (length > 0);
  98512. 8027a50: 683b ldr r3, [r7, #0]
  98513. 8027a52: 2b00 cmp r3, #0
  98514. 8027a54: dcde bgt.n 8027a14 <MQTTPacket_encode+0xe>
  98515. FUNC_EXIT_RC(rc);
  98516. return rc;
  98517. 8027a56: 68fb ldr r3, [r7, #12]
  98518. }
  98519. 8027a58: 4618 mov r0, r3
  98520. 8027a5a: 3714 adds r7, #20
  98521. 8027a5c: 46bd mov sp, r7
  98522. 8027a5e: f85d 7b04 ldr.w r7, [sp], #4
  98523. 8027a62: 4770 bx lr
  98524. 08027a64 <MQTTPacket_decode>:
  98525. * @param getcharfn pointer to function to read the next character from the data source
  98526. * @param value the decoded length returned
  98527. * @return the number of bytes read from the socket
  98528. */
  98529. int MQTTPacket_decode(int (*getcharfn)(unsigned char*, int), int* value)
  98530. {
  98531. 8027a64: b580 push {r7, lr}
  98532. 8027a66: b086 sub sp, #24
  98533. 8027a68: af00 add r7, sp, #0
  98534. 8027a6a: 6078 str r0, [r7, #4]
  98535. 8027a6c: 6039 str r1, [r7, #0]
  98536. unsigned char c;
  98537. int multiplier = 1;
  98538. 8027a6e: 2301 movs r3, #1
  98539. 8027a70: 617b str r3, [r7, #20]
  98540. int len = 0;
  98541. 8027a72: 2300 movs r3, #0
  98542. 8027a74: 613b str r3, [r7, #16]
  98543. #define MAX_NO_OF_REMAINING_LENGTH_BYTES 4
  98544. FUNC_ENTRY;
  98545. *value = 0;
  98546. 8027a76: 683b ldr r3, [r7, #0]
  98547. 8027a78: 2200 movs r2, #0
  98548. 8027a7a: 601a str r2, [r3, #0]
  98549. do
  98550. {
  98551. int rc = MQTTPACKET_READ_ERROR;
  98552. 8027a7c: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  98553. 8027a80: 60fb str r3, [r7, #12]
  98554. if (++len > MAX_NO_OF_REMAINING_LENGTH_BYTES)
  98555. 8027a82: 693b ldr r3, [r7, #16]
  98556. 8027a84: 3301 adds r3, #1
  98557. 8027a86: 613b str r3, [r7, #16]
  98558. 8027a88: 693b ldr r3, [r7, #16]
  98559. 8027a8a: 2b04 cmp r3, #4
  98560. 8027a8c: dd03 ble.n 8027a96 <MQTTPacket_decode+0x32>
  98561. {
  98562. rc = MQTTPACKET_READ_ERROR; /* bad data */
  98563. 8027a8e: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  98564. 8027a92: 60fb str r3, [r7, #12]
  98565. goto exit;
  98566. 8027a94: e01d b.n 8027ad2 <MQTTPacket_decode+0x6e>
  98567. }
  98568. rc = (*getcharfn)(&c, 1);
  98569. 8027a96: f107 020b add.w r2, r7, #11
  98570. 8027a9a: 687b ldr r3, [r7, #4]
  98571. 8027a9c: 2101 movs r1, #1
  98572. 8027a9e: 4610 mov r0, r2
  98573. 8027aa0: 4798 blx r3
  98574. 8027aa2: 60f8 str r0, [r7, #12]
  98575. if (rc != 1)
  98576. 8027aa4: 68fb ldr r3, [r7, #12]
  98577. 8027aa6: 2b01 cmp r3, #1
  98578. 8027aa8: d112 bne.n 8027ad0 <MQTTPacket_decode+0x6c>
  98579. goto exit;
  98580. *value += (c & 127) * multiplier;
  98581. 8027aaa: 683b ldr r3, [r7, #0]
  98582. 8027aac: 681a ldr r2, [r3, #0]
  98583. 8027aae: 7afb ldrb r3, [r7, #11]
  98584. 8027ab0: f003 037f and.w r3, r3, #127 @ 0x7f
  98585. 8027ab4: 6979 ldr r1, [r7, #20]
  98586. 8027ab6: fb01 f303 mul.w r3, r1, r3
  98587. 8027aba: 441a add r2, r3
  98588. 8027abc: 683b ldr r3, [r7, #0]
  98589. 8027abe: 601a str r2, [r3, #0]
  98590. multiplier *= 128;
  98591. 8027ac0: 697b ldr r3, [r7, #20]
  98592. 8027ac2: 01db lsls r3, r3, #7
  98593. 8027ac4: 617b str r3, [r7, #20]
  98594. } while ((c & 128) != 0);
  98595. 8027ac6: 7afb ldrb r3, [r7, #11]
  98596. 8027ac8: b25b sxtb r3, r3
  98597. 8027aca: 2b00 cmp r3, #0
  98598. 8027acc: dbd6 blt.n 8027a7c <MQTTPacket_decode+0x18>
  98599. exit:
  98600. 8027ace: e000 b.n 8027ad2 <MQTTPacket_decode+0x6e>
  98601. goto exit;
  98602. 8027ad0: bf00 nop
  98603. FUNC_EXIT_RC(len);
  98604. return len;
  98605. 8027ad2: 693b ldr r3, [r7, #16]
  98606. }
  98607. 8027ad4: 4618 mov r0, r3
  98608. 8027ad6: 3718 adds r7, #24
  98609. 8027ad8: 46bd mov sp, r7
  98610. 8027ada: bd80 pop {r7, pc}
  98611. 08027adc <MQTTPacket_len>:
  98612. int MQTTPacket_len(int rem_len)
  98613. {
  98614. 8027adc: b480 push {r7}
  98615. 8027ade: b083 sub sp, #12
  98616. 8027ae0: af00 add r7, sp, #0
  98617. 8027ae2: 6078 str r0, [r7, #4]
  98618. rem_len += 1; /* header byte */
  98619. 8027ae4: 687b ldr r3, [r7, #4]
  98620. 8027ae6: 3301 adds r3, #1
  98621. 8027ae8: 607b str r3, [r7, #4]
  98622. /* now remaining_length field */
  98623. if (rem_len < 128)
  98624. 8027aea: 687b ldr r3, [r7, #4]
  98625. 8027aec: 2b7f cmp r3, #127 @ 0x7f
  98626. 8027aee: dc03 bgt.n 8027af8 <MQTTPacket_len+0x1c>
  98627. rem_len += 1;
  98628. 8027af0: 687b ldr r3, [r7, #4]
  98629. 8027af2: 3301 adds r3, #1
  98630. 8027af4: 607b str r3, [r7, #4]
  98631. 8027af6: e012 b.n 8027b1e <MQTTPacket_len+0x42>
  98632. else if (rem_len < 16384)
  98633. 8027af8: 687b ldr r3, [r7, #4]
  98634. 8027afa: f5b3 4f80 cmp.w r3, #16384 @ 0x4000
  98635. 8027afe: da03 bge.n 8027b08 <MQTTPacket_len+0x2c>
  98636. rem_len += 2;
  98637. 8027b00: 687b ldr r3, [r7, #4]
  98638. 8027b02: 3302 adds r3, #2
  98639. 8027b04: 607b str r3, [r7, #4]
  98640. 8027b06: e00a b.n 8027b1e <MQTTPacket_len+0x42>
  98641. else if (rem_len < 2097151)
  98642. 8027b08: 687b ldr r3, [r7, #4]
  98643. 8027b0a: 4a08 ldr r2, [pc, #32] @ (8027b2c <MQTTPacket_len+0x50>)
  98644. 8027b0c: 4293 cmp r3, r2
  98645. 8027b0e: dc03 bgt.n 8027b18 <MQTTPacket_len+0x3c>
  98646. rem_len += 3;
  98647. 8027b10: 687b ldr r3, [r7, #4]
  98648. 8027b12: 3303 adds r3, #3
  98649. 8027b14: 607b str r3, [r7, #4]
  98650. 8027b16: e002 b.n 8027b1e <MQTTPacket_len+0x42>
  98651. else
  98652. rem_len += 4;
  98653. 8027b18: 687b ldr r3, [r7, #4]
  98654. 8027b1a: 3304 adds r3, #4
  98655. 8027b1c: 607b str r3, [r7, #4]
  98656. return rem_len;
  98657. 8027b1e: 687b ldr r3, [r7, #4]
  98658. }
  98659. 8027b20: 4618 mov r0, r3
  98660. 8027b22: 370c adds r7, #12
  98661. 8027b24: 46bd mov sp, r7
  98662. 8027b26: f85d 7b04 ldr.w r7, [sp], #4
  98663. 8027b2a: 4770 bx lr
  98664. 8027b2c: 001ffffe .word 0x001ffffe
  98665. 08027b30 <bufchar>:
  98666. static unsigned char* bufptr;
  98667. int bufchar(unsigned char* c, int count)
  98668. {
  98669. 8027b30: b480 push {r7}
  98670. 8027b32: b085 sub sp, #20
  98671. 8027b34: af00 add r7, sp, #0
  98672. 8027b36: 6078 str r0, [r7, #4]
  98673. 8027b38: 6039 str r1, [r7, #0]
  98674. int i;
  98675. for (i = 0; i < count; ++i)
  98676. 8027b3a: 2300 movs r3, #0
  98677. 8027b3c: 60fb str r3, [r7, #12]
  98678. 8027b3e: e00a b.n 8027b56 <bufchar+0x26>
  98679. *c = *bufptr++;
  98680. 8027b40: 4b0a ldr r3, [pc, #40] @ (8027b6c <bufchar+0x3c>)
  98681. 8027b42: 681b ldr r3, [r3, #0]
  98682. 8027b44: 1c5a adds r2, r3, #1
  98683. 8027b46: 4909 ldr r1, [pc, #36] @ (8027b6c <bufchar+0x3c>)
  98684. 8027b48: 600a str r2, [r1, #0]
  98685. 8027b4a: 781a ldrb r2, [r3, #0]
  98686. 8027b4c: 687b ldr r3, [r7, #4]
  98687. 8027b4e: 701a strb r2, [r3, #0]
  98688. for (i = 0; i < count; ++i)
  98689. 8027b50: 68fb ldr r3, [r7, #12]
  98690. 8027b52: 3301 adds r3, #1
  98691. 8027b54: 60fb str r3, [r7, #12]
  98692. 8027b56: 68fa ldr r2, [r7, #12]
  98693. 8027b58: 683b ldr r3, [r7, #0]
  98694. 8027b5a: 429a cmp r2, r3
  98695. 8027b5c: dbf0 blt.n 8027b40 <bufchar+0x10>
  98696. return count;
  98697. 8027b5e: 683b ldr r3, [r7, #0]
  98698. }
  98699. 8027b60: 4618 mov r0, r3
  98700. 8027b62: 3714 adds r7, #20
  98701. 8027b64: 46bd mov sp, r7
  98702. 8027b66: f85d 7b04 ldr.w r7, [sp], #4
  98703. 8027b6a: 4770 bx lr
  98704. 8027b6c: 2402b038 .word 0x2402b038
  98705. 08027b70 <MQTTPacket_decodeBuf>:
  98706. int MQTTPacket_decodeBuf(unsigned char* buf, int* value)
  98707. {
  98708. 8027b70: b580 push {r7, lr}
  98709. 8027b72: b082 sub sp, #8
  98710. 8027b74: af00 add r7, sp, #0
  98711. 8027b76: 6078 str r0, [r7, #4]
  98712. 8027b78: 6039 str r1, [r7, #0]
  98713. bufptr = buf;
  98714. 8027b7a: 4a06 ldr r2, [pc, #24] @ (8027b94 <MQTTPacket_decodeBuf+0x24>)
  98715. 8027b7c: 687b ldr r3, [r7, #4]
  98716. 8027b7e: 6013 str r3, [r2, #0]
  98717. return MQTTPacket_decode(bufchar, value);
  98718. 8027b80: 6839 ldr r1, [r7, #0]
  98719. 8027b82: 4805 ldr r0, [pc, #20] @ (8027b98 <MQTTPacket_decodeBuf+0x28>)
  98720. 8027b84: f7ff ff6e bl 8027a64 <MQTTPacket_decode>
  98721. 8027b88: 4603 mov r3, r0
  98722. }
  98723. 8027b8a: 4618 mov r0, r3
  98724. 8027b8c: 3708 adds r7, #8
  98725. 8027b8e: 46bd mov sp, r7
  98726. 8027b90: bd80 pop {r7, pc}
  98727. 8027b92: bf00 nop
  98728. 8027b94: 2402b038 .word 0x2402b038
  98729. 8027b98: 08027b31 .word 0x08027b31
  98730. 08027b9c <readInt>:
  98731. * Calculates an integer from two bytes read from the input buffer
  98732. * @param pptr pointer to the input buffer - incremented by the number of bytes used & returned
  98733. * @return the integer value calculated
  98734. */
  98735. int readInt(unsigned char** pptr)
  98736. {
  98737. 8027b9c: b480 push {r7}
  98738. 8027b9e: b085 sub sp, #20
  98739. 8027ba0: af00 add r7, sp, #0
  98740. 8027ba2: 6078 str r0, [r7, #4]
  98741. unsigned char* ptr = *pptr;
  98742. 8027ba4: 687b ldr r3, [r7, #4]
  98743. 8027ba6: 681b ldr r3, [r3, #0]
  98744. 8027ba8: 60fb str r3, [r7, #12]
  98745. int len = 256*(*ptr) + (*(ptr+1));
  98746. 8027baa: 68fb ldr r3, [r7, #12]
  98747. 8027bac: 781b ldrb r3, [r3, #0]
  98748. 8027bae: 021b lsls r3, r3, #8
  98749. 8027bb0: 68fa ldr r2, [r7, #12]
  98750. 8027bb2: 3201 adds r2, #1
  98751. 8027bb4: 7812 ldrb r2, [r2, #0]
  98752. 8027bb6: 4413 add r3, r2
  98753. 8027bb8: 60bb str r3, [r7, #8]
  98754. *pptr += 2;
  98755. 8027bba: 687b ldr r3, [r7, #4]
  98756. 8027bbc: 681b ldr r3, [r3, #0]
  98757. 8027bbe: 1c9a adds r2, r3, #2
  98758. 8027bc0: 687b ldr r3, [r7, #4]
  98759. 8027bc2: 601a str r2, [r3, #0]
  98760. return len;
  98761. 8027bc4: 68bb ldr r3, [r7, #8]
  98762. }
  98763. 8027bc6: 4618 mov r0, r3
  98764. 8027bc8: 3714 adds r7, #20
  98765. 8027bca: 46bd mov sp, r7
  98766. 8027bcc: f85d 7b04 ldr.w r7, [sp], #4
  98767. 8027bd0: 4770 bx lr
  98768. 08027bd2 <readChar>:
  98769. * Reads one character from the input buffer.
  98770. * @param pptr pointer to the input buffer - incremented by the number of bytes used & returned
  98771. * @return the character read
  98772. */
  98773. char readChar(unsigned char** pptr)
  98774. {
  98775. 8027bd2: b480 push {r7}
  98776. 8027bd4: b085 sub sp, #20
  98777. 8027bd6: af00 add r7, sp, #0
  98778. 8027bd8: 6078 str r0, [r7, #4]
  98779. char c = **pptr;
  98780. 8027bda: 687b ldr r3, [r7, #4]
  98781. 8027bdc: 681b ldr r3, [r3, #0]
  98782. 8027bde: 781b ldrb r3, [r3, #0]
  98783. 8027be0: 73fb strb r3, [r7, #15]
  98784. (*pptr)++;
  98785. 8027be2: 687b ldr r3, [r7, #4]
  98786. 8027be4: 681b ldr r3, [r3, #0]
  98787. 8027be6: 1c5a adds r2, r3, #1
  98788. 8027be8: 687b ldr r3, [r7, #4]
  98789. 8027bea: 601a str r2, [r3, #0]
  98790. return c;
  98791. 8027bec: 7bfb ldrb r3, [r7, #15]
  98792. }
  98793. 8027bee: 4618 mov r0, r3
  98794. 8027bf0: 3714 adds r7, #20
  98795. 8027bf2: 46bd mov sp, r7
  98796. 8027bf4: f85d 7b04 ldr.w r7, [sp], #4
  98797. 8027bf8: 4770 bx lr
  98798. 08027bfa <writeChar>:
  98799. * Writes one character to an output buffer.
  98800. * @param pptr pointer to the output buffer - incremented by the number of bytes used & returned
  98801. * @param c the character to write
  98802. */
  98803. void writeChar(unsigned char** pptr, char c)
  98804. {
  98805. 8027bfa: b480 push {r7}
  98806. 8027bfc: b083 sub sp, #12
  98807. 8027bfe: af00 add r7, sp, #0
  98808. 8027c00: 6078 str r0, [r7, #4]
  98809. 8027c02: 460b mov r3, r1
  98810. 8027c04: 70fb strb r3, [r7, #3]
  98811. **pptr = c;
  98812. 8027c06: 687b ldr r3, [r7, #4]
  98813. 8027c08: 681b ldr r3, [r3, #0]
  98814. 8027c0a: 78fa ldrb r2, [r7, #3]
  98815. 8027c0c: 701a strb r2, [r3, #0]
  98816. (*pptr)++;
  98817. 8027c0e: 687b ldr r3, [r7, #4]
  98818. 8027c10: 681b ldr r3, [r3, #0]
  98819. 8027c12: 1c5a adds r2, r3, #1
  98820. 8027c14: 687b ldr r3, [r7, #4]
  98821. 8027c16: 601a str r2, [r3, #0]
  98822. }
  98823. 8027c18: bf00 nop
  98824. 8027c1a: 370c adds r7, #12
  98825. 8027c1c: 46bd mov sp, r7
  98826. 8027c1e: f85d 7b04 ldr.w r7, [sp], #4
  98827. 8027c22: 4770 bx lr
  98828. 08027c24 <writeInt>:
  98829. * Writes an integer as 2 bytes to an output buffer.
  98830. * @param pptr pointer to the output buffer - incremented by the number of bytes used & returned
  98831. * @param anInt the integer to write
  98832. */
  98833. void writeInt(unsigned char** pptr, int anInt)
  98834. {
  98835. 8027c24: b480 push {r7}
  98836. 8027c26: b083 sub sp, #12
  98837. 8027c28: af00 add r7, sp, #0
  98838. 8027c2a: 6078 str r0, [r7, #4]
  98839. 8027c2c: 6039 str r1, [r7, #0]
  98840. **pptr = (unsigned char)(anInt / 256);
  98841. 8027c2e: 683b ldr r3, [r7, #0]
  98842. 8027c30: 2b00 cmp r3, #0
  98843. 8027c32: da00 bge.n 8027c36 <writeInt+0x12>
  98844. 8027c34: 33ff adds r3, #255 @ 0xff
  98845. 8027c36: 121b asrs r3, r3, #8
  98846. 8027c38: 461a mov r2, r3
  98847. 8027c3a: 687b ldr r3, [r7, #4]
  98848. 8027c3c: 681b ldr r3, [r3, #0]
  98849. 8027c3e: b2d2 uxtb r2, r2
  98850. 8027c40: 701a strb r2, [r3, #0]
  98851. (*pptr)++;
  98852. 8027c42: 687b ldr r3, [r7, #4]
  98853. 8027c44: 681b ldr r3, [r3, #0]
  98854. 8027c46: 1c5a adds r2, r3, #1
  98855. 8027c48: 687b ldr r3, [r7, #4]
  98856. 8027c4a: 601a str r2, [r3, #0]
  98857. **pptr = (unsigned char)(anInt % 256);
  98858. 8027c4c: 683b ldr r3, [r7, #0]
  98859. 8027c4e: 425a negs r2, r3
  98860. 8027c50: b2db uxtb r3, r3
  98861. 8027c52: b2d2 uxtb r2, r2
  98862. 8027c54: bf58 it pl
  98863. 8027c56: 4253 negpl r3, r2
  98864. 8027c58: 687a ldr r2, [r7, #4]
  98865. 8027c5a: 6812 ldr r2, [r2, #0]
  98866. 8027c5c: b2db uxtb r3, r3
  98867. 8027c5e: 7013 strb r3, [r2, #0]
  98868. (*pptr)++;
  98869. 8027c60: 687b ldr r3, [r7, #4]
  98870. 8027c62: 681b ldr r3, [r3, #0]
  98871. 8027c64: 1c5a adds r2, r3, #1
  98872. 8027c66: 687b ldr r3, [r7, #4]
  98873. 8027c68: 601a str r2, [r3, #0]
  98874. }
  98875. 8027c6a: bf00 nop
  98876. 8027c6c: 370c adds r7, #12
  98877. 8027c6e: 46bd mov sp, r7
  98878. 8027c70: f85d 7b04 ldr.w r7, [sp], #4
  98879. 8027c74: 4770 bx lr
  98880. 08027c76 <writeCString>:
  98881. * Writes a "UTF" string to an output buffer. Converts C string to length-delimited.
  98882. * @param pptr pointer to the output buffer - incremented by the number of bytes used & returned
  98883. * @param string the C string to write
  98884. */
  98885. void writeCString(unsigned char** pptr, const char* string)
  98886. {
  98887. 8027c76: b580 push {r7, lr}
  98888. 8027c78: b084 sub sp, #16
  98889. 8027c7a: af00 add r7, sp, #0
  98890. 8027c7c: 6078 str r0, [r7, #4]
  98891. 8027c7e: 6039 str r1, [r7, #0]
  98892. int len = strlen(string);
  98893. 8027c80: 6838 ldr r0, [r7, #0]
  98894. 8027c82: f7d8 fb8d bl 80003a0 <strlen>
  98895. 8027c86: 4603 mov r3, r0
  98896. 8027c88: 60fb str r3, [r7, #12]
  98897. writeInt(pptr, len);
  98898. 8027c8a: 68f9 ldr r1, [r7, #12]
  98899. 8027c8c: 6878 ldr r0, [r7, #4]
  98900. 8027c8e: f7ff ffc9 bl 8027c24 <writeInt>
  98901. memcpy(*pptr, string, len);
  98902. 8027c92: 687b ldr r3, [r7, #4]
  98903. 8027c94: 681b ldr r3, [r3, #0]
  98904. 8027c96: 68fa ldr r2, [r7, #12]
  98905. 8027c98: 6839 ldr r1, [r7, #0]
  98906. 8027c9a: 4618 mov r0, r3
  98907. 8027c9c: f002 f91f bl 8029ede <memcpy>
  98908. *pptr += len;
  98909. 8027ca0: 687b ldr r3, [r7, #4]
  98910. 8027ca2: 681a ldr r2, [r3, #0]
  98911. 8027ca4: 68fb ldr r3, [r7, #12]
  98912. 8027ca6: 441a add r2, r3
  98913. 8027ca8: 687b ldr r3, [r7, #4]
  98914. 8027caa: 601a str r2, [r3, #0]
  98915. }
  98916. 8027cac: bf00 nop
  98917. 8027cae: 3710 adds r7, #16
  98918. 8027cb0: 46bd mov sp, r7
  98919. 8027cb2: bd80 pop {r7, pc}
  98920. 08027cb4 <writeMQTTString>:
  98921. return len;
  98922. }
  98923. void writeMQTTString(unsigned char** pptr, MQTTString mqttstring)
  98924. {
  98925. 8027cb4: b580 push {r7, lr}
  98926. 8027cb6: b084 sub sp, #16
  98927. 8027cb8: af00 add r7, sp, #0
  98928. 8027cba: 60f8 str r0, [r7, #12]
  98929. 8027cbc: 4638 mov r0, r7
  98930. 8027cbe: e880 000e stmia.w r0, {r1, r2, r3}
  98931. if (mqttstring.lenstring.len > 0)
  98932. 8027cc2: 687b ldr r3, [r7, #4]
  98933. 8027cc4: 2b00 cmp r3, #0
  98934. 8027cc6: dd12 ble.n 8027cee <writeMQTTString+0x3a>
  98935. {
  98936. writeInt(pptr, mqttstring.lenstring.len);
  98937. 8027cc8: 687b ldr r3, [r7, #4]
  98938. 8027cca: 4619 mov r1, r3
  98939. 8027ccc: 68f8 ldr r0, [r7, #12]
  98940. 8027cce: f7ff ffa9 bl 8027c24 <writeInt>
  98941. memcpy(*pptr, mqttstring.lenstring.data, mqttstring.lenstring.len);
  98942. 8027cd2: 68fb ldr r3, [r7, #12]
  98943. 8027cd4: 681b ldr r3, [r3, #0]
  98944. 8027cd6: 68b9 ldr r1, [r7, #8]
  98945. 8027cd8: 687a ldr r2, [r7, #4]
  98946. 8027cda: 4618 mov r0, r3
  98947. 8027cdc: f002 f8ff bl 8029ede <memcpy>
  98948. *pptr += mqttstring.lenstring.len;
  98949. 8027ce0: 68fb ldr r3, [r7, #12]
  98950. 8027ce2: 681b ldr r3, [r3, #0]
  98951. 8027ce4: 687a ldr r2, [r7, #4]
  98952. 8027ce6: 441a add r2, r3
  98953. 8027ce8: 68fb ldr r3, [r7, #12]
  98954. 8027cea: 601a str r2, [r3, #0]
  98955. }
  98956. else if (mqttstring.cstring)
  98957. writeCString(pptr, mqttstring.cstring);
  98958. else
  98959. writeInt(pptr, 0);
  98960. }
  98961. 8027cec: e00c b.n 8027d08 <writeMQTTString+0x54>
  98962. else if (mqttstring.cstring)
  98963. 8027cee: 683b ldr r3, [r7, #0]
  98964. 8027cf0: 2b00 cmp r3, #0
  98965. 8027cf2: d005 beq.n 8027d00 <writeMQTTString+0x4c>
  98966. writeCString(pptr, mqttstring.cstring);
  98967. 8027cf4: 683b ldr r3, [r7, #0]
  98968. 8027cf6: 4619 mov r1, r3
  98969. 8027cf8: 68f8 ldr r0, [r7, #12]
  98970. 8027cfa: f7ff ffbc bl 8027c76 <writeCString>
  98971. }
  98972. 8027cfe: e003 b.n 8027d08 <writeMQTTString+0x54>
  98973. writeInt(pptr, 0);
  98974. 8027d00: 2100 movs r1, #0
  98975. 8027d02: 68f8 ldr r0, [r7, #12]
  98976. 8027d04: f7ff ff8e bl 8027c24 <writeInt>
  98977. }
  98978. 8027d08: bf00 nop
  98979. 8027d0a: 3710 adds r7, #16
  98980. 8027d0c: 46bd mov sp, r7
  98981. 8027d0e: bd80 pop {r7, pc}
  98982. 08027d10 <readMQTTLenString>:
  98983. * @param pptr pointer to the output buffer - incremented by the number of bytes used & returned
  98984. * @param enddata pointer to the end of the data: do not read beyond
  98985. * @return 1 if successful, 0 if not
  98986. */
  98987. int readMQTTLenString(MQTTString* mqttstring, unsigned char** pptr, unsigned char* enddata)
  98988. {
  98989. 8027d10: b580 push {r7, lr}
  98990. 8027d12: b086 sub sp, #24
  98991. 8027d14: af00 add r7, sp, #0
  98992. 8027d16: 60f8 str r0, [r7, #12]
  98993. 8027d18: 60b9 str r1, [r7, #8]
  98994. 8027d1a: 607a str r2, [r7, #4]
  98995. int rc = 0;
  98996. 8027d1c: 2300 movs r3, #0
  98997. 8027d1e: 617b str r3, [r7, #20]
  98998. FUNC_ENTRY;
  98999. /* the first two bytes are the length of the string */
  99000. if (enddata - (*pptr) > 1) /* enough length to read the integer? */
  99001. 8027d20: 68bb ldr r3, [r7, #8]
  99002. 8027d22: 681b ldr r3, [r3, #0]
  99003. 8027d24: 687a ldr r2, [r7, #4]
  99004. 8027d26: 1ad3 subs r3, r2, r3
  99005. 8027d28: 2b01 cmp r3, #1
  99006. 8027d2a: dd1a ble.n 8027d62 <readMQTTLenString+0x52>
  99007. {
  99008. mqttstring->lenstring.len = readInt(pptr); /* increments pptr to point past length */
  99009. 8027d2c: 68b8 ldr r0, [r7, #8]
  99010. 8027d2e: f7ff ff35 bl 8027b9c <readInt>
  99011. 8027d32: 4602 mov r2, r0
  99012. 8027d34: 68fb ldr r3, [r7, #12]
  99013. 8027d36: 605a str r2, [r3, #4]
  99014. if (&(*pptr)[mqttstring->lenstring.len] <= enddata)
  99015. 8027d38: 68bb ldr r3, [r7, #8]
  99016. 8027d3a: 681b ldr r3, [r3, #0]
  99017. 8027d3c: 68fa ldr r2, [r7, #12]
  99018. 8027d3e: 6852 ldr r2, [r2, #4]
  99019. 8027d40: 4413 add r3, r2
  99020. 8027d42: 687a ldr r2, [r7, #4]
  99021. 8027d44: 429a cmp r2, r3
  99022. 8027d46: d30c bcc.n 8027d62 <readMQTTLenString+0x52>
  99023. {
  99024. mqttstring->lenstring.data = (char*)*pptr;
  99025. 8027d48: 68bb ldr r3, [r7, #8]
  99026. 8027d4a: 681a ldr r2, [r3, #0]
  99027. 8027d4c: 68fb ldr r3, [r7, #12]
  99028. 8027d4e: 609a str r2, [r3, #8]
  99029. *pptr += mqttstring->lenstring.len;
  99030. 8027d50: 68bb ldr r3, [r7, #8]
  99031. 8027d52: 681b ldr r3, [r3, #0]
  99032. 8027d54: 68fa ldr r2, [r7, #12]
  99033. 8027d56: 6852 ldr r2, [r2, #4]
  99034. 8027d58: 441a add r2, r3
  99035. 8027d5a: 68bb ldr r3, [r7, #8]
  99036. 8027d5c: 601a str r2, [r3, #0]
  99037. rc = 1;
  99038. 8027d5e: 2301 movs r3, #1
  99039. 8027d60: 617b str r3, [r7, #20]
  99040. }
  99041. }
  99042. mqttstring->cstring = NULL;
  99043. 8027d62: 68fb ldr r3, [r7, #12]
  99044. 8027d64: 2200 movs r2, #0
  99045. 8027d66: 601a str r2, [r3, #0]
  99046. FUNC_EXIT_RC(rc);
  99047. return rc;
  99048. 8027d68: 697b ldr r3, [r7, #20]
  99049. }
  99050. 8027d6a: 4618 mov r0, r3
  99051. 8027d6c: 3718 adds r7, #24
  99052. 8027d6e: 46bd mov sp, r7
  99053. 8027d70: bd80 pop {r7, pc}
  99054. 08027d72 <MQTTstrlen>:
  99055. * Return the length of the MQTTstring - C string if there is one, otherwise the length delimited string
  99056. * @param mqttstring the string to return the length of
  99057. * @return the length of the string
  99058. */
  99059. int MQTTstrlen(MQTTString mqttstring)
  99060. {
  99061. 8027d72: b580 push {r7, lr}
  99062. 8027d74: b086 sub sp, #24
  99063. 8027d76: af00 add r7, sp, #0
  99064. 8027d78: 1d3b adds r3, r7, #4
  99065. 8027d7a: e883 0007 stmia.w r3, {r0, r1, r2}
  99066. int rc = 0;
  99067. 8027d7e: 2300 movs r3, #0
  99068. 8027d80: 617b str r3, [r7, #20]
  99069. if (mqttstring.cstring)
  99070. 8027d82: 687b ldr r3, [r7, #4]
  99071. 8027d84: 2b00 cmp r3, #0
  99072. 8027d86: d006 beq.n 8027d96 <MQTTstrlen+0x24>
  99073. rc = strlen(mqttstring.cstring);
  99074. 8027d88: 687b ldr r3, [r7, #4]
  99075. 8027d8a: 4618 mov r0, r3
  99076. 8027d8c: f7d8 fb08 bl 80003a0 <strlen>
  99077. 8027d90: 4603 mov r3, r0
  99078. 8027d92: 617b str r3, [r7, #20]
  99079. 8027d94: e001 b.n 8027d9a <MQTTstrlen+0x28>
  99080. else
  99081. rc = mqttstring.lenstring.len;
  99082. 8027d96: 68bb ldr r3, [r7, #8]
  99083. 8027d98: 617b str r3, [r7, #20]
  99084. return rc;
  99085. 8027d9a: 697b ldr r3, [r7, #20]
  99086. }
  99087. 8027d9c: 4618 mov r0, r3
  99088. 8027d9e: 3718 adds r7, #24
  99089. 8027da0: 46bd mov sp, r7
  99090. 8027da2: bd80 pop {r7, pc}
  99091. 08027da4 <MQTTPacket_equals>:
  99092. * @param a the MQTTString to compare
  99093. * @param bptr the C string to compare
  99094. * @return boolean - equal or not
  99095. */
  99096. int MQTTPacket_equals(MQTTString* a, char* bptr)
  99097. {
  99098. 8027da4: b580 push {r7, lr}
  99099. 8027da6: b086 sub sp, #24
  99100. 8027da8: af00 add r7, sp, #0
  99101. 8027daa: 6078 str r0, [r7, #4]
  99102. 8027dac: 6039 str r1, [r7, #0]
  99103. int alen = 0,
  99104. 8027dae: 2300 movs r3, #0
  99105. 8027db0: 617b str r3, [r7, #20]
  99106. blen = 0;
  99107. 8027db2: 2300 movs r3, #0
  99108. 8027db4: 60fb str r3, [r7, #12]
  99109. char *aptr;
  99110. if (a->cstring)
  99111. 8027db6: 687b ldr r3, [r7, #4]
  99112. 8027db8: 681b ldr r3, [r3, #0]
  99113. 8027dba: 2b00 cmp r3, #0
  99114. 8027dbc: d00a beq.n 8027dd4 <MQTTPacket_equals+0x30>
  99115. {
  99116. aptr = a->cstring;
  99117. 8027dbe: 687b ldr r3, [r7, #4]
  99118. 8027dc0: 681b ldr r3, [r3, #0]
  99119. 8027dc2: 613b str r3, [r7, #16]
  99120. alen = strlen(a->cstring);
  99121. 8027dc4: 687b ldr r3, [r7, #4]
  99122. 8027dc6: 681b ldr r3, [r3, #0]
  99123. 8027dc8: 4618 mov r0, r3
  99124. 8027dca: f7d8 fae9 bl 80003a0 <strlen>
  99125. 8027dce: 4603 mov r3, r0
  99126. 8027dd0: 617b str r3, [r7, #20]
  99127. 8027dd2: e005 b.n 8027de0 <MQTTPacket_equals+0x3c>
  99128. }
  99129. else
  99130. {
  99131. aptr = a->lenstring.data;
  99132. 8027dd4: 687b ldr r3, [r7, #4]
  99133. 8027dd6: 689b ldr r3, [r3, #8]
  99134. 8027dd8: 613b str r3, [r7, #16]
  99135. alen = a->lenstring.len;
  99136. 8027dda: 687b ldr r3, [r7, #4]
  99137. 8027ddc: 685b ldr r3, [r3, #4]
  99138. 8027dde: 617b str r3, [r7, #20]
  99139. }
  99140. blen = strlen(bptr);
  99141. 8027de0: 6838 ldr r0, [r7, #0]
  99142. 8027de2: f7d8 fadd bl 80003a0 <strlen>
  99143. 8027de6: 4603 mov r3, r0
  99144. 8027de8: 60fb str r3, [r7, #12]
  99145. return (alen == blen) && (strncmp(aptr, bptr, alen) == 0);
  99146. 8027dea: 697a ldr r2, [r7, #20]
  99147. 8027dec: 68fb ldr r3, [r7, #12]
  99148. 8027dee: 429a cmp r2, r3
  99149. 8027df0: d10a bne.n 8027e08 <MQTTPacket_equals+0x64>
  99150. 8027df2: 697b ldr r3, [r7, #20]
  99151. 8027df4: 461a mov r2, r3
  99152. 8027df6: 6839 ldr r1, [r7, #0]
  99153. 8027df8: 6938 ldr r0, [r7, #16]
  99154. 8027dfa: f001 ff81 bl 8029d00 <strncmp>
  99155. 8027dfe: 4603 mov r3, r0
  99156. 8027e00: 2b00 cmp r3, #0
  99157. 8027e02: d101 bne.n 8027e08 <MQTTPacket_equals+0x64>
  99158. 8027e04: 2301 movs r3, #1
  99159. 8027e06: e000 b.n 8027e0a <MQTTPacket_equals+0x66>
  99160. 8027e08: 2300 movs r3, #0
  99161. }
  99162. 8027e0a: 4618 mov r0, r3
  99163. 8027e0c: 3718 adds r7, #24
  99164. 8027e0e: 46bd mov sp, r7
  99165. 8027e10: bd80 pop {r7, pc}
  99166. 08027e12 <MQTTSerialize_publishLength>:
  99167. * @param topicName the topic name to be used in the publish
  99168. * @param payloadlen the length of the payload to be sent
  99169. * @return the length of buffer needed to contain the serialized version of the packet
  99170. */
  99171. int MQTTSerialize_publishLength(int qos, MQTTString topicName, int payloadlen)
  99172. {
  99173. 8027e12: b580 push {r7, lr}
  99174. 8027e14: b086 sub sp, #24
  99175. 8027e16: af00 add r7, sp, #0
  99176. 8027e18: 60f8 str r0, [r7, #12]
  99177. 8027e1a: 4638 mov r0, r7
  99178. 8027e1c: e880 000e stmia.w r0, {r1, r2, r3}
  99179. int len = 0;
  99180. 8027e20: 2300 movs r3, #0
  99181. 8027e22: 617b str r3, [r7, #20]
  99182. len += 2 + MQTTstrlen(topicName) + payloadlen;
  99183. 8027e24: 463b mov r3, r7
  99184. 8027e26: e893 0007 ldmia.w r3, {r0, r1, r2}
  99185. 8027e2a: f7ff ffa2 bl 8027d72 <MQTTstrlen>
  99186. 8027e2e: 4603 mov r3, r0
  99187. 8027e30: 1c9a adds r2, r3, #2
  99188. 8027e32: 6a3b ldr r3, [r7, #32]
  99189. 8027e34: 4413 add r3, r2
  99190. 8027e36: 697a ldr r2, [r7, #20]
  99191. 8027e38: 4413 add r3, r2
  99192. 8027e3a: 617b str r3, [r7, #20]
  99193. if (qos > 0)
  99194. 8027e3c: 68fb ldr r3, [r7, #12]
  99195. 8027e3e: 2b00 cmp r3, #0
  99196. 8027e40: dd02 ble.n 8027e48 <MQTTSerialize_publishLength+0x36>
  99197. len += 2; /* packetid */
  99198. 8027e42: 697b ldr r3, [r7, #20]
  99199. 8027e44: 3302 adds r3, #2
  99200. 8027e46: 617b str r3, [r7, #20]
  99201. return len;
  99202. 8027e48: 697b ldr r3, [r7, #20]
  99203. }
  99204. 8027e4a: 4618 mov r0, r3
  99205. 8027e4c: 3718 adds r7, #24
  99206. 8027e4e: 46bd mov sp, r7
  99207. 8027e50: bd80 pop {r7, pc}
  99208. 08027e52 <MQTTSerialize_publish>:
  99209. * @param payloadlen integer - the length of the MQTT payload
  99210. * @return the length of the serialized data. <= 0 indicates error
  99211. */
  99212. int MQTTSerialize_publish(unsigned char* buf, int buflen, unsigned char dup, int qos, unsigned char retained, unsigned short packetid,
  99213. MQTTString topicName, unsigned char* payload, int payloadlen)
  99214. {
  99215. 8027e52: b580 push {r7, lr}
  99216. 8027e54: b08a sub sp, #40 @ 0x28
  99217. 8027e56: af02 add r7, sp, #8
  99218. 8027e58: 60f8 str r0, [r7, #12]
  99219. 8027e5a: 60b9 str r1, [r7, #8]
  99220. 8027e5c: 603b str r3, [r7, #0]
  99221. 8027e5e: 4613 mov r3, r2
  99222. 8027e60: 71fb strb r3, [r7, #7]
  99223. unsigned char *ptr = buf;
  99224. 8027e62: 68fb ldr r3, [r7, #12]
  99225. 8027e64: 617b str r3, [r7, #20]
  99226. MQTTHeader header = {0};
  99227. 8027e66: 2300 movs r3, #0
  99228. 8027e68: 613b str r3, [r7, #16]
  99229. int rem_len = 0;
  99230. 8027e6a: 2300 movs r3, #0
  99231. 8027e6c: 61bb str r3, [r7, #24]
  99232. int rc = 0;
  99233. 8027e6e: 2300 movs r3, #0
  99234. 8027e70: 61fb str r3, [r7, #28]
  99235. FUNC_ENTRY;
  99236. if (MQTTPacket_len(rem_len = MQTTSerialize_publishLength(qos, topicName, payloadlen)) > buflen)
  99237. 8027e72: 6c3b ldr r3, [r7, #64] @ 0x40
  99238. 8027e74: 9300 str r3, [sp, #0]
  99239. 8027e76: f107 0330 add.w r3, r7, #48 @ 0x30
  99240. 8027e7a: cb0e ldmia r3, {r1, r2, r3}
  99241. 8027e7c: 6838 ldr r0, [r7, #0]
  99242. 8027e7e: f7ff ffc8 bl 8027e12 <MQTTSerialize_publishLength>
  99243. 8027e82: 61b8 str r0, [r7, #24]
  99244. 8027e84: 69b8 ldr r0, [r7, #24]
  99245. 8027e86: f7ff fe29 bl 8027adc <MQTTPacket_len>
  99246. 8027e8a: 4602 mov r2, r0
  99247. 8027e8c: 68bb ldr r3, [r7, #8]
  99248. 8027e8e: 4293 cmp r3, r2
  99249. 8027e90: da03 bge.n 8027e9a <MQTTSerialize_publish+0x48>
  99250. {
  99251. rc = MQTTPACKET_BUFFER_TOO_SHORT;
  99252. 8027e92: f06f 0301 mvn.w r3, #1
  99253. 8027e96: 61fb str r3, [r7, #28]
  99254. goto exit;
  99255. 8027e98: e04c b.n 8027f34 <MQTTSerialize_publish+0xe2>
  99256. }
  99257. header.bits.type = PUBLISH;
  99258. 8027e9a: 7c3b ldrb r3, [r7, #16]
  99259. 8027e9c: 2203 movs r2, #3
  99260. 8027e9e: f362 1307 bfi r3, r2, #4, #4
  99261. 8027ea2: 743b strb r3, [r7, #16]
  99262. header.bits.dup = dup;
  99263. 8027ea4: 79fb ldrb r3, [r7, #7]
  99264. 8027ea6: f003 0301 and.w r3, r3, #1
  99265. 8027eaa: b2da uxtb r2, r3
  99266. 8027eac: 7c3b ldrb r3, [r7, #16]
  99267. 8027eae: f362 03c3 bfi r3, r2, #3, #1
  99268. 8027eb2: 743b strb r3, [r7, #16]
  99269. header.bits.qos = qos;
  99270. 8027eb4: 683b ldr r3, [r7, #0]
  99271. 8027eb6: f003 0303 and.w r3, r3, #3
  99272. 8027eba: b2da uxtb r2, r3
  99273. 8027ebc: 7c3b ldrb r3, [r7, #16]
  99274. 8027ebe: f362 0342 bfi r3, r2, #1, #2
  99275. 8027ec2: 743b strb r3, [r7, #16]
  99276. header.bits.retain = retained;
  99277. 8027ec4: f897 3028 ldrb.w r3, [r7, #40] @ 0x28
  99278. 8027ec8: f003 0301 and.w r3, r3, #1
  99279. 8027ecc: b2da uxtb r2, r3
  99280. 8027ece: 7c3b ldrb r3, [r7, #16]
  99281. 8027ed0: f362 0300 bfi r3, r2, #0, #1
  99282. 8027ed4: 743b strb r3, [r7, #16]
  99283. writeChar(&ptr, header.byte); /* write header */
  99284. 8027ed6: 7c3a ldrb r2, [r7, #16]
  99285. 8027ed8: f107 0314 add.w r3, r7, #20
  99286. 8027edc: 4611 mov r1, r2
  99287. 8027ede: 4618 mov r0, r3
  99288. 8027ee0: f7ff fe8b bl 8027bfa <writeChar>
  99289. ptr += MQTTPacket_encode(ptr, rem_len); /* write remaining length */;
  99290. 8027ee4: 697b ldr r3, [r7, #20]
  99291. 8027ee6: 69b9 ldr r1, [r7, #24]
  99292. 8027ee8: 4618 mov r0, r3
  99293. 8027eea: f7ff fd8c bl 8027a06 <MQTTPacket_encode>
  99294. 8027eee: 4602 mov r2, r0
  99295. 8027ef0: 697b ldr r3, [r7, #20]
  99296. 8027ef2: 4413 add r3, r2
  99297. 8027ef4: 617b str r3, [r7, #20]
  99298. writeMQTTString(&ptr, topicName);
  99299. 8027ef6: f107 0014 add.w r0, r7, #20
  99300. 8027efa: f107 0330 add.w r3, r7, #48 @ 0x30
  99301. 8027efe: cb0e ldmia r3, {r1, r2, r3}
  99302. 8027f00: f7ff fed8 bl 8027cb4 <writeMQTTString>
  99303. if (qos > 0)
  99304. 8027f04: 683b ldr r3, [r7, #0]
  99305. 8027f06: 2b00 cmp r3, #0
  99306. 8027f08: dd06 ble.n 8027f18 <MQTTSerialize_publish+0xc6>
  99307. writeInt(&ptr, packetid);
  99308. 8027f0a: 8dba ldrh r2, [r7, #44] @ 0x2c
  99309. 8027f0c: f107 0314 add.w r3, r7, #20
  99310. 8027f10: 4611 mov r1, r2
  99311. 8027f12: 4618 mov r0, r3
  99312. 8027f14: f7ff fe86 bl 8027c24 <writeInt>
  99313. memcpy(ptr, payload, payloadlen);
  99314. 8027f18: 697b ldr r3, [r7, #20]
  99315. 8027f1a: 6c3a ldr r2, [r7, #64] @ 0x40
  99316. 8027f1c: 6bf9 ldr r1, [r7, #60] @ 0x3c
  99317. 8027f1e: 4618 mov r0, r3
  99318. 8027f20: f001 ffdd bl 8029ede <memcpy>
  99319. ptr += payloadlen;
  99320. 8027f24: 697a ldr r2, [r7, #20]
  99321. 8027f26: 6c3b ldr r3, [r7, #64] @ 0x40
  99322. 8027f28: 4413 add r3, r2
  99323. 8027f2a: 617b str r3, [r7, #20]
  99324. rc = ptr - buf;
  99325. 8027f2c: 697a ldr r2, [r7, #20]
  99326. 8027f2e: 68fb ldr r3, [r7, #12]
  99327. 8027f30: 1ad3 subs r3, r2, r3
  99328. 8027f32: 61fb str r3, [r7, #28]
  99329. exit:
  99330. FUNC_EXIT_RC(rc);
  99331. return rc;
  99332. 8027f34: 69fb ldr r3, [r7, #28]
  99333. }
  99334. 8027f36: 4618 mov r0, r3
  99335. 8027f38: 3720 adds r7, #32
  99336. 8027f3a: 46bd mov sp, r7
  99337. 8027f3c: bd80 pop {r7, pc}
  99338. 08027f3e <MQTTSerialize_ack>:
  99339. * @param dup the MQTT dup flag
  99340. * @param packetid the MQTT packet identifier
  99341. * @return serialized length, or error if 0
  99342. */
  99343. int MQTTSerialize_ack(unsigned char* buf, int buflen, unsigned char packettype, unsigned char dup, unsigned short packetid)
  99344. {
  99345. 8027f3e: b580 push {r7, lr}
  99346. 8027f40: b088 sub sp, #32
  99347. 8027f42: af00 add r7, sp, #0
  99348. 8027f44: 60f8 str r0, [r7, #12]
  99349. 8027f46: 60b9 str r1, [r7, #8]
  99350. 8027f48: 4611 mov r1, r2
  99351. 8027f4a: 461a mov r2, r3
  99352. 8027f4c: 460b mov r3, r1
  99353. 8027f4e: 71fb strb r3, [r7, #7]
  99354. 8027f50: 4613 mov r3, r2
  99355. 8027f52: 71bb strb r3, [r7, #6]
  99356. MQTTHeader header = {0};
  99357. 8027f54: 2300 movs r3, #0
  99358. 8027f56: 61bb str r3, [r7, #24]
  99359. int rc = 0;
  99360. 8027f58: 2300 movs r3, #0
  99361. 8027f5a: 61fb str r3, [r7, #28]
  99362. unsigned char *ptr = buf;
  99363. 8027f5c: 68fb ldr r3, [r7, #12]
  99364. 8027f5e: 617b str r3, [r7, #20]
  99365. FUNC_ENTRY;
  99366. if (buflen < 4)
  99367. 8027f60: 68bb ldr r3, [r7, #8]
  99368. 8027f62: 2b03 cmp r3, #3
  99369. 8027f64: dc03 bgt.n 8027f6e <MQTTSerialize_ack+0x30>
  99370. {
  99371. rc = MQTTPACKET_BUFFER_TOO_SHORT;
  99372. 8027f66: f06f 0301 mvn.w r3, #1
  99373. 8027f6a: 61fb str r3, [r7, #28]
  99374. goto exit;
  99375. 8027f6c: e037 b.n 8027fde <MQTTSerialize_ack+0xa0>
  99376. }
  99377. header.bits.type = packettype;
  99378. 8027f6e: 79fb ldrb r3, [r7, #7]
  99379. 8027f70: f003 030f and.w r3, r3, #15
  99380. 8027f74: b2da uxtb r2, r3
  99381. 8027f76: 7e3b ldrb r3, [r7, #24]
  99382. 8027f78: f362 1307 bfi r3, r2, #4, #4
  99383. 8027f7c: 763b strb r3, [r7, #24]
  99384. header.bits.dup = dup;
  99385. 8027f7e: 79bb ldrb r3, [r7, #6]
  99386. 8027f80: f003 0301 and.w r3, r3, #1
  99387. 8027f84: b2da uxtb r2, r3
  99388. 8027f86: 7e3b ldrb r3, [r7, #24]
  99389. 8027f88: f362 03c3 bfi r3, r2, #3, #1
  99390. 8027f8c: 763b strb r3, [r7, #24]
  99391. header.bits.qos = (packettype == PUBREL) ? 1 : 0;
  99392. 8027f8e: 79fb ldrb r3, [r7, #7]
  99393. 8027f90: 2b06 cmp r3, #6
  99394. 8027f92: bf0c ite eq
  99395. 8027f94: 2301 moveq r3, #1
  99396. 8027f96: 2300 movne r3, #0
  99397. 8027f98: b2db uxtb r3, r3
  99398. 8027f9a: f003 0303 and.w r3, r3, #3
  99399. 8027f9e: b2da uxtb r2, r3
  99400. 8027fa0: 7e3b ldrb r3, [r7, #24]
  99401. 8027fa2: f362 0342 bfi r3, r2, #1, #2
  99402. 8027fa6: 763b strb r3, [r7, #24]
  99403. writeChar(&ptr, header.byte); /* write header */
  99404. 8027fa8: 7e3a ldrb r2, [r7, #24]
  99405. 8027faa: f107 0314 add.w r3, r7, #20
  99406. 8027fae: 4611 mov r1, r2
  99407. 8027fb0: 4618 mov r0, r3
  99408. 8027fb2: f7ff fe22 bl 8027bfa <writeChar>
  99409. ptr += MQTTPacket_encode(ptr, 2); /* write remaining length */
  99410. 8027fb6: 697b ldr r3, [r7, #20]
  99411. 8027fb8: 2102 movs r1, #2
  99412. 8027fba: 4618 mov r0, r3
  99413. 8027fbc: f7ff fd23 bl 8027a06 <MQTTPacket_encode>
  99414. 8027fc0: 4602 mov r2, r0
  99415. 8027fc2: 697b ldr r3, [r7, #20]
  99416. 8027fc4: 4413 add r3, r2
  99417. 8027fc6: 617b str r3, [r7, #20]
  99418. writeInt(&ptr, packetid);
  99419. 8027fc8: 8d3a ldrh r2, [r7, #40] @ 0x28
  99420. 8027fca: f107 0314 add.w r3, r7, #20
  99421. 8027fce: 4611 mov r1, r2
  99422. 8027fd0: 4618 mov r0, r3
  99423. 8027fd2: f7ff fe27 bl 8027c24 <writeInt>
  99424. rc = ptr - buf;
  99425. 8027fd6: 697a ldr r2, [r7, #20]
  99426. 8027fd8: 68fb ldr r3, [r7, #12]
  99427. 8027fda: 1ad3 subs r3, r2, r3
  99428. 8027fdc: 61fb str r3, [r7, #28]
  99429. exit:
  99430. FUNC_EXIT_RC(rc);
  99431. return rc;
  99432. 8027fde: 69fb ldr r3, [r7, #28]
  99433. }
  99434. 8027fe0: 4618 mov r0, r3
  99435. 8027fe2: 3720 adds r7, #32
  99436. 8027fe4: 46bd mov sp, r7
  99437. 8027fe6: bd80 pop {r7, pc}
  99438. 08027fe8 <MQTTSerialize_subscribeLength>:
  99439. * @param count the number of topic filter strings in topicFilters
  99440. * @param topicFilters the array of topic filter strings to be used in the publish
  99441. * @return the length of buffer needed to contain the serialized version of the packet
  99442. */
  99443. int MQTTSerialize_subscribeLength(int count, MQTTString topicFilters[])
  99444. {
  99445. 8027fe8: b580 push {r7, lr}
  99446. 8027fea: b084 sub sp, #16
  99447. 8027fec: af00 add r7, sp, #0
  99448. 8027fee: 6078 str r0, [r7, #4]
  99449. 8027ff0: 6039 str r1, [r7, #0]
  99450. int i;
  99451. int len = 2; /* packetid */
  99452. 8027ff2: 2302 movs r3, #2
  99453. 8027ff4: 60bb str r3, [r7, #8]
  99454. for (i = 0; i < count; ++i)
  99455. 8027ff6: 2300 movs r3, #0
  99456. 8027ff8: 60fb str r3, [r7, #12]
  99457. 8027ffa: e013 b.n 8028024 <MQTTSerialize_subscribeLength+0x3c>
  99458. len += 2 + MQTTstrlen(topicFilters[i]) + 1; /* length + topic + req_qos */
  99459. 8027ffc: 68fa ldr r2, [r7, #12]
  99460. 8027ffe: 4613 mov r3, r2
  99461. 8028000: 005b lsls r3, r3, #1
  99462. 8028002: 4413 add r3, r2
  99463. 8028004: 009b lsls r3, r3, #2
  99464. 8028006: 461a mov r2, r3
  99465. 8028008: 683b ldr r3, [r7, #0]
  99466. 802800a: 4413 add r3, r2
  99467. 802800c: e893 0007 ldmia.w r3, {r0, r1, r2}
  99468. 8028010: f7ff feaf bl 8027d72 <MQTTstrlen>
  99469. 8028014: 4603 mov r3, r0
  99470. 8028016: 3303 adds r3, #3
  99471. 8028018: 68ba ldr r2, [r7, #8]
  99472. 802801a: 4413 add r3, r2
  99473. 802801c: 60bb str r3, [r7, #8]
  99474. for (i = 0; i < count; ++i)
  99475. 802801e: 68fb ldr r3, [r7, #12]
  99476. 8028020: 3301 adds r3, #1
  99477. 8028022: 60fb str r3, [r7, #12]
  99478. 8028024: 68fa ldr r2, [r7, #12]
  99479. 8028026: 687b ldr r3, [r7, #4]
  99480. 8028028: 429a cmp r2, r3
  99481. 802802a: dbe7 blt.n 8027ffc <MQTTSerialize_subscribeLength+0x14>
  99482. return len;
  99483. 802802c: 68bb ldr r3, [r7, #8]
  99484. }
  99485. 802802e: 4618 mov r0, r3
  99486. 8028030: 3710 adds r7, #16
  99487. 8028032: 46bd mov sp, r7
  99488. 8028034: bd80 pop {r7, pc}
  99489. 08028036 <MQTTSerialize_subscribe>:
  99490. * @param requestedQoSs - array of requested QoS
  99491. * @return the length of the serialized data. <= 0 indicates error
  99492. */
  99493. int MQTTSerialize_subscribe(unsigned char* buf, int buflen, unsigned char dup, unsigned short packetid, int count,
  99494. MQTTString topicFilters[], int requestedQoSs[])
  99495. {
  99496. 8028036: b580 push {r7, lr}
  99497. 8028038: b08a sub sp, #40 @ 0x28
  99498. 802803a: af00 add r7, sp, #0
  99499. 802803c: 60f8 str r0, [r7, #12]
  99500. 802803e: 60b9 str r1, [r7, #8]
  99501. 8028040: 4611 mov r1, r2
  99502. 8028042: 461a mov r2, r3
  99503. 8028044: 460b mov r3, r1
  99504. 8028046: 71fb strb r3, [r7, #7]
  99505. 8028048: 4613 mov r3, r2
  99506. 802804a: 80bb strh r3, [r7, #4]
  99507. unsigned char *ptr = buf;
  99508. 802804c: 68fb ldr r3, [r7, #12]
  99509. 802804e: 61bb str r3, [r7, #24]
  99510. MQTTHeader header = {0};
  99511. 8028050: 2300 movs r3, #0
  99512. 8028052: 617b str r3, [r7, #20]
  99513. int rem_len = 0;
  99514. 8028054: 2300 movs r3, #0
  99515. 8028056: 61fb str r3, [r7, #28]
  99516. int rc = 0;
  99517. 8028058: 2300 movs r3, #0
  99518. 802805a: 627b str r3, [r7, #36] @ 0x24
  99519. int i = 0;
  99520. 802805c: 2300 movs r3, #0
  99521. 802805e: 623b str r3, [r7, #32]
  99522. FUNC_ENTRY;
  99523. if (MQTTPacket_len(rem_len = MQTTSerialize_subscribeLength(count, topicFilters)) > buflen)
  99524. 8028060: 6b79 ldr r1, [r7, #52] @ 0x34
  99525. 8028062: 6b38 ldr r0, [r7, #48] @ 0x30
  99526. 8028064: f7ff ffc0 bl 8027fe8 <MQTTSerialize_subscribeLength>
  99527. 8028068: 61f8 str r0, [r7, #28]
  99528. 802806a: 69f8 ldr r0, [r7, #28]
  99529. 802806c: f7ff fd36 bl 8027adc <MQTTPacket_len>
  99530. 8028070: 4602 mov r2, r0
  99531. 8028072: 68bb ldr r3, [r7, #8]
  99532. 8028074: 4293 cmp r3, r2
  99533. 8028076: da03 bge.n 8028080 <MQTTSerialize_subscribe+0x4a>
  99534. {
  99535. rc = MQTTPACKET_BUFFER_TOO_SHORT;
  99536. 8028078: f06f 0301 mvn.w r3, #1
  99537. 802807c: 627b str r3, [r7, #36] @ 0x24
  99538. goto exit;
  99539. 802807e: e051 b.n 8028124 <MQTTSerialize_subscribe+0xee>
  99540. }
  99541. header.byte = 0;
  99542. 8028080: 2300 movs r3, #0
  99543. 8028082: 753b strb r3, [r7, #20]
  99544. header.bits.type = SUBSCRIBE;
  99545. 8028084: 7d3b ldrb r3, [r7, #20]
  99546. 8028086: 2208 movs r2, #8
  99547. 8028088: f362 1307 bfi r3, r2, #4, #4
  99548. 802808c: 753b strb r3, [r7, #20]
  99549. header.bits.dup = dup;
  99550. 802808e: 79fb ldrb r3, [r7, #7]
  99551. 8028090: f003 0301 and.w r3, r3, #1
  99552. 8028094: b2da uxtb r2, r3
  99553. 8028096: 7d3b ldrb r3, [r7, #20]
  99554. 8028098: f362 03c3 bfi r3, r2, #3, #1
  99555. 802809c: 753b strb r3, [r7, #20]
  99556. header.bits.qos = 1;
  99557. 802809e: 7d3b ldrb r3, [r7, #20]
  99558. 80280a0: 2201 movs r2, #1
  99559. 80280a2: f362 0342 bfi r3, r2, #1, #2
  99560. 80280a6: 753b strb r3, [r7, #20]
  99561. writeChar(&ptr, header.byte); /* write header */
  99562. 80280a8: 7d3a ldrb r2, [r7, #20]
  99563. 80280aa: f107 0318 add.w r3, r7, #24
  99564. 80280ae: 4611 mov r1, r2
  99565. 80280b0: 4618 mov r0, r3
  99566. 80280b2: f7ff fda2 bl 8027bfa <writeChar>
  99567. ptr += MQTTPacket_encode(ptr, rem_len); /* write remaining length */;
  99568. 80280b6: 69bb ldr r3, [r7, #24]
  99569. 80280b8: 69f9 ldr r1, [r7, #28]
  99570. 80280ba: 4618 mov r0, r3
  99571. 80280bc: f7ff fca3 bl 8027a06 <MQTTPacket_encode>
  99572. 80280c0: 4602 mov r2, r0
  99573. 80280c2: 69bb ldr r3, [r7, #24]
  99574. 80280c4: 4413 add r3, r2
  99575. 80280c6: 61bb str r3, [r7, #24]
  99576. writeInt(&ptr, packetid);
  99577. 80280c8: 88ba ldrh r2, [r7, #4]
  99578. 80280ca: f107 0318 add.w r3, r7, #24
  99579. 80280ce: 4611 mov r1, r2
  99580. 80280d0: 4618 mov r0, r3
  99581. 80280d2: f7ff fda7 bl 8027c24 <writeInt>
  99582. for (i = 0; i < count; ++i)
  99583. 80280d6: 2300 movs r3, #0
  99584. 80280d8: 623b str r3, [r7, #32]
  99585. 80280da: e01b b.n 8028114 <MQTTSerialize_subscribe+0xde>
  99586. {
  99587. writeMQTTString(&ptr, topicFilters[i]);
  99588. 80280dc: 6a3a ldr r2, [r7, #32]
  99589. 80280de: 4613 mov r3, r2
  99590. 80280e0: 005b lsls r3, r3, #1
  99591. 80280e2: 4413 add r3, r2
  99592. 80280e4: 009b lsls r3, r3, #2
  99593. 80280e6: 461a mov r2, r3
  99594. 80280e8: 6b7b ldr r3, [r7, #52] @ 0x34
  99595. 80280ea: 4413 add r3, r2
  99596. 80280ec: f107 0018 add.w r0, r7, #24
  99597. 80280f0: cb0e ldmia r3, {r1, r2, r3}
  99598. 80280f2: f7ff fddf bl 8027cb4 <writeMQTTString>
  99599. writeChar(&ptr, requestedQoSs[i]);
  99600. 80280f6: 6a3b ldr r3, [r7, #32]
  99601. 80280f8: 009b lsls r3, r3, #2
  99602. 80280fa: 6bba ldr r2, [r7, #56] @ 0x38
  99603. 80280fc: 4413 add r3, r2
  99604. 80280fe: 681b ldr r3, [r3, #0]
  99605. 8028100: b2da uxtb r2, r3
  99606. 8028102: f107 0318 add.w r3, r7, #24
  99607. 8028106: 4611 mov r1, r2
  99608. 8028108: 4618 mov r0, r3
  99609. 802810a: f7ff fd76 bl 8027bfa <writeChar>
  99610. for (i = 0; i < count; ++i)
  99611. 802810e: 6a3b ldr r3, [r7, #32]
  99612. 8028110: 3301 adds r3, #1
  99613. 8028112: 623b str r3, [r7, #32]
  99614. 8028114: 6a3a ldr r2, [r7, #32]
  99615. 8028116: 6b3b ldr r3, [r7, #48] @ 0x30
  99616. 8028118: 429a cmp r2, r3
  99617. 802811a: dbdf blt.n 80280dc <MQTTSerialize_subscribe+0xa6>
  99618. }
  99619. rc = ptr - buf;
  99620. 802811c: 69ba ldr r2, [r7, #24]
  99621. 802811e: 68fb ldr r3, [r7, #12]
  99622. 8028120: 1ad3 subs r3, r2, r3
  99623. 8028122: 627b str r3, [r7, #36] @ 0x24
  99624. exit:
  99625. FUNC_EXIT_RC(rc);
  99626. return rc;
  99627. 8028124: 6a7b ldr r3, [r7, #36] @ 0x24
  99628. }
  99629. 8028126: 4618 mov r0, r3
  99630. 8028128: 3728 adds r7, #40 @ 0x28
  99631. 802812a: 46bd mov sp, r7
  99632. 802812c: bd80 pop {r7, pc}
  99633. 0802812e <MQTTDeserialize_suback>:
  99634. * @param buf the raw buffer data, of the correct length determined by the remaining length field
  99635. * @param buflen the length in bytes of the data in the supplied buffer
  99636. * @return error code. 1 is success, 0 is failure
  99637. */
  99638. int MQTTDeserialize_suback(unsigned short* packetid, int maxcount, int* count, int grantedQoSs[], unsigned char* buf, int buflen)
  99639. {
  99640. 802812e: b580 push {r7, lr}
  99641. 8028130: b08a sub sp, #40 @ 0x28
  99642. 8028132: af00 add r7, sp, #0
  99643. 8028134: 60f8 str r0, [r7, #12]
  99644. 8028136: 60b9 str r1, [r7, #8]
  99645. 8028138: 607a str r2, [r7, #4]
  99646. 802813a: 603b str r3, [r7, #0]
  99647. MQTTHeader header = {0};
  99648. 802813c: 2300 movs r3, #0
  99649. 802813e: 61fb str r3, [r7, #28]
  99650. unsigned char* curdata = buf;
  99651. 8028140: 6b3b ldr r3, [r7, #48] @ 0x30
  99652. 8028142: 61bb str r3, [r7, #24]
  99653. unsigned char* enddata = NULL;
  99654. 8028144: 2300 movs r3, #0
  99655. 8028146: 623b str r3, [r7, #32]
  99656. int rc = 0;
  99657. 8028148: 2300 movs r3, #0
  99658. 802814a: 627b str r3, [r7, #36] @ 0x24
  99659. int mylen;
  99660. FUNC_ENTRY;
  99661. header.byte = readChar(&curdata);
  99662. 802814c: f107 0318 add.w r3, r7, #24
  99663. 8028150: 4618 mov r0, r3
  99664. 8028152: f7ff fd3e bl 8027bd2 <readChar>
  99665. 8028156: 4603 mov r3, r0
  99666. 8028158: 773b strb r3, [r7, #28]
  99667. if (header.bits.type != SUBACK)
  99668. 802815a: 7f3b ldrb r3, [r7, #28]
  99669. 802815c: f023 030f bic.w r3, r3, #15
  99670. 8028160: b2db uxtb r3, r3
  99671. 8028162: 2b90 cmp r3, #144 @ 0x90
  99672. 8028164: d142 bne.n 80281ec <MQTTDeserialize_suback+0xbe>
  99673. goto exit;
  99674. curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */
  99675. 8028166: 69bb ldr r3, [r7, #24]
  99676. 8028168: f107 0214 add.w r2, r7, #20
  99677. 802816c: 4611 mov r1, r2
  99678. 802816e: 4618 mov r0, r3
  99679. 8028170: f7ff fcfe bl 8027b70 <MQTTPacket_decodeBuf>
  99680. 8028174: 6278 str r0, [r7, #36] @ 0x24
  99681. 8028176: 6a7a ldr r2, [r7, #36] @ 0x24
  99682. 8028178: 69bb ldr r3, [r7, #24]
  99683. 802817a: 4413 add r3, r2
  99684. 802817c: 61bb str r3, [r7, #24]
  99685. enddata = curdata + mylen;
  99686. 802817e: 69bb ldr r3, [r7, #24]
  99687. 8028180: 697a ldr r2, [r7, #20]
  99688. 8028182: 4413 add r3, r2
  99689. 8028184: 623b str r3, [r7, #32]
  99690. if (enddata - curdata < 2)
  99691. 8028186: 69bb ldr r3, [r7, #24]
  99692. 8028188: 6a3a ldr r2, [r7, #32]
  99693. 802818a: 1ad3 subs r3, r2, r3
  99694. 802818c: 2b01 cmp r3, #1
  99695. 802818e: dd2f ble.n 80281f0 <MQTTDeserialize_suback+0xc2>
  99696. goto exit;
  99697. *packetid = readInt(&curdata);
  99698. 8028190: f107 0318 add.w r3, r7, #24
  99699. 8028194: 4618 mov r0, r3
  99700. 8028196: f7ff fd01 bl 8027b9c <readInt>
  99701. 802819a: 4603 mov r3, r0
  99702. 802819c: b29a uxth r2, r3
  99703. 802819e: 68fb ldr r3, [r7, #12]
  99704. 80281a0: 801a strh r2, [r3, #0]
  99705. *count = 0;
  99706. 80281a2: 687b ldr r3, [r7, #4]
  99707. 80281a4: 2200 movs r2, #0
  99708. 80281a6: 601a str r2, [r3, #0]
  99709. while (curdata < enddata)
  99710. 80281a8: e019 b.n 80281de <MQTTDeserialize_suback+0xb0>
  99711. {
  99712. if (*count > maxcount)
  99713. 80281aa: 687b ldr r3, [r7, #4]
  99714. 80281ac: 681b ldr r3, [r3, #0]
  99715. 80281ae: 68ba ldr r2, [r7, #8]
  99716. 80281b0: 429a cmp r2, r3
  99717. 80281b2: da03 bge.n 80281bc <MQTTDeserialize_suback+0x8e>
  99718. {
  99719. rc = -1;
  99720. 80281b4: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  99721. 80281b8: 627b str r3, [r7, #36] @ 0x24
  99722. goto exit;
  99723. 80281ba: e01a b.n 80281f2 <MQTTDeserialize_suback+0xc4>
  99724. }
  99725. grantedQoSs[(*count)++] = readChar(&curdata);
  99726. 80281bc: f107 0318 add.w r3, r7, #24
  99727. 80281c0: 4618 mov r0, r3
  99728. 80281c2: f7ff fd06 bl 8027bd2 <readChar>
  99729. 80281c6: 4603 mov r3, r0
  99730. 80281c8: 4618 mov r0, r3
  99731. 80281ca: 687b ldr r3, [r7, #4]
  99732. 80281cc: 681b ldr r3, [r3, #0]
  99733. 80281ce: 1c59 adds r1, r3, #1
  99734. 80281d0: 687a ldr r2, [r7, #4]
  99735. 80281d2: 6011 str r1, [r2, #0]
  99736. 80281d4: 009b lsls r3, r3, #2
  99737. 80281d6: 683a ldr r2, [r7, #0]
  99738. 80281d8: 4413 add r3, r2
  99739. 80281da: 4602 mov r2, r0
  99740. 80281dc: 601a str r2, [r3, #0]
  99741. while (curdata < enddata)
  99742. 80281de: 69bb ldr r3, [r7, #24]
  99743. 80281e0: 6a3a ldr r2, [r7, #32]
  99744. 80281e2: 429a cmp r2, r3
  99745. 80281e4: d8e1 bhi.n 80281aa <MQTTDeserialize_suback+0x7c>
  99746. }
  99747. rc = 1;
  99748. 80281e6: 2301 movs r3, #1
  99749. 80281e8: 627b str r3, [r7, #36] @ 0x24
  99750. 80281ea: e002 b.n 80281f2 <MQTTDeserialize_suback+0xc4>
  99751. goto exit;
  99752. 80281ec: bf00 nop
  99753. 80281ee: e000 b.n 80281f2 <MQTTDeserialize_suback+0xc4>
  99754. goto exit;
  99755. 80281f0: bf00 nop
  99756. exit:
  99757. FUNC_EXIT_RC(rc);
  99758. return rc;
  99759. 80281f2: 6a7b ldr r3, [r7, #36] @ 0x24
  99760. }
  99761. 80281f4: 4618 mov r0, r3
  99762. 80281f6: 3728 adds r7, #40 @ 0x28
  99763. 80281f8: 46bd mov sp, r7
  99764. 80281fa: bd80 pop {r7, pc}
  99765. 080281fc <malloc>:
  99766. 80281fc: 4b02 ldr r3, [pc, #8] @ (8028208 <malloc+0xc>)
  99767. 80281fe: 4601 mov r1, r0
  99768. 8028200: 6818 ldr r0, [r3, #0]
  99769. 8028202: f000 b82d b.w 8028260 <_malloc_r>
  99770. 8028206: bf00 nop
  99771. 8028208: 240001d4 .word 0x240001d4
  99772. 0802820c <free>:
  99773. 802820c: 4b02 ldr r3, [pc, #8] @ (8028218 <free+0xc>)
  99774. 802820e: 4601 mov r1, r0
  99775. 8028210: 6818 ldr r0, [r3, #0]
  99776. 8028212: f002 bc7b b.w 802ab0c <_free_r>
  99777. 8028216: bf00 nop
  99778. 8028218: 240001d4 .word 0x240001d4
  99779. 0802821c <sbrk_aligned>:
  99780. 802821c: b570 push {r4, r5, r6, lr}
  99781. 802821e: 4e0f ldr r6, [pc, #60] @ (802825c <sbrk_aligned+0x40>)
  99782. 8028220: 460c mov r4, r1
  99783. 8028222: 6831 ldr r1, [r6, #0]
  99784. 8028224: 4605 mov r5, r0
  99785. 8028226: b911 cbnz r1, 802822e <sbrk_aligned+0x12>
  99786. 8028228: f001 fe0a bl 8029e40 <_sbrk_r>
  99787. 802822c: 6030 str r0, [r6, #0]
  99788. 802822e: 4621 mov r1, r4
  99789. 8028230: 4628 mov r0, r5
  99790. 8028232: f001 fe05 bl 8029e40 <_sbrk_r>
  99791. 8028236: 1c43 adds r3, r0, #1
  99792. 8028238: d103 bne.n 8028242 <sbrk_aligned+0x26>
  99793. 802823a: f04f 34ff mov.w r4, #4294967295 @ 0xffffffff
  99794. 802823e: 4620 mov r0, r4
  99795. 8028240: bd70 pop {r4, r5, r6, pc}
  99796. 8028242: 1cc4 adds r4, r0, #3
  99797. 8028244: f024 0403 bic.w r4, r4, #3
  99798. 8028248: 42a0 cmp r0, r4
  99799. 802824a: d0f8 beq.n 802823e <sbrk_aligned+0x22>
  99800. 802824c: 1a21 subs r1, r4, r0
  99801. 802824e: 4628 mov r0, r5
  99802. 8028250: f001 fdf6 bl 8029e40 <_sbrk_r>
  99803. 8028254: 3001 adds r0, #1
  99804. 8028256: d1f2 bne.n 802823e <sbrk_aligned+0x22>
  99805. 8028258: e7ef b.n 802823a <sbrk_aligned+0x1e>
  99806. 802825a: bf00 nop
  99807. 802825c: 2402b03c .word 0x2402b03c
  99808. 08028260 <_malloc_r>:
  99809. 8028260: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  99810. 8028264: 1ccd adds r5, r1, #3
  99811. 8028266: f025 0503 bic.w r5, r5, #3
  99812. 802826a: 3508 adds r5, #8
  99813. 802826c: 2d0c cmp r5, #12
  99814. 802826e: bf38 it cc
  99815. 8028270: 250c movcc r5, #12
  99816. 8028272: 2d00 cmp r5, #0
  99817. 8028274: 4606 mov r6, r0
  99818. 8028276: db01 blt.n 802827c <_malloc_r+0x1c>
  99819. 8028278: 42a9 cmp r1, r5
  99820. 802827a: d904 bls.n 8028286 <_malloc_r+0x26>
  99821. 802827c: 230c movs r3, #12
  99822. 802827e: 6033 str r3, [r6, #0]
  99823. 8028280: 2000 movs r0, #0
  99824. 8028282: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  99825. 8028286: f8df 80d4 ldr.w r8, [pc, #212] @ 802835c <_malloc_r+0xfc>
  99826. 802828a: f000 f869 bl 8028360 <__malloc_lock>
  99827. 802828e: f8d8 3000 ldr.w r3, [r8]
  99828. 8028292: 461c mov r4, r3
  99829. 8028294: bb44 cbnz r4, 80282e8 <_malloc_r+0x88>
  99830. 8028296: 4629 mov r1, r5
  99831. 8028298: 4630 mov r0, r6
  99832. 802829a: f7ff ffbf bl 802821c <sbrk_aligned>
  99833. 802829e: 1c43 adds r3, r0, #1
  99834. 80282a0: 4604 mov r4, r0
  99835. 80282a2: d158 bne.n 8028356 <_malloc_r+0xf6>
  99836. 80282a4: f8d8 4000 ldr.w r4, [r8]
  99837. 80282a8: 4627 mov r7, r4
  99838. 80282aa: 2f00 cmp r7, #0
  99839. 80282ac: d143 bne.n 8028336 <_malloc_r+0xd6>
  99840. 80282ae: 2c00 cmp r4, #0
  99841. 80282b0: d04b beq.n 802834a <_malloc_r+0xea>
  99842. 80282b2: 6823 ldr r3, [r4, #0]
  99843. 80282b4: 4639 mov r1, r7
  99844. 80282b6: 4630 mov r0, r6
  99845. 80282b8: eb04 0903 add.w r9, r4, r3
  99846. 80282bc: f001 fdc0 bl 8029e40 <_sbrk_r>
  99847. 80282c0: 4581 cmp r9, r0
  99848. 80282c2: d142 bne.n 802834a <_malloc_r+0xea>
  99849. 80282c4: 6821 ldr r1, [r4, #0]
  99850. 80282c6: 1a6d subs r5, r5, r1
  99851. 80282c8: 4629 mov r1, r5
  99852. 80282ca: 4630 mov r0, r6
  99853. 80282cc: f7ff ffa6 bl 802821c <sbrk_aligned>
  99854. 80282d0: 3001 adds r0, #1
  99855. 80282d2: d03a beq.n 802834a <_malloc_r+0xea>
  99856. 80282d4: 6823 ldr r3, [r4, #0]
  99857. 80282d6: 442b add r3, r5
  99858. 80282d8: 6023 str r3, [r4, #0]
  99859. 80282da: f8d8 3000 ldr.w r3, [r8]
  99860. 80282de: 685a ldr r2, [r3, #4]
  99861. 80282e0: bb62 cbnz r2, 802833c <_malloc_r+0xdc>
  99862. 80282e2: f8c8 7000 str.w r7, [r8]
  99863. 80282e6: e00f b.n 8028308 <_malloc_r+0xa8>
  99864. 80282e8: 6822 ldr r2, [r4, #0]
  99865. 80282ea: 1b52 subs r2, r2, r5
  99866. 80282ec: d420 bmi.n 8028330 <_malloc_r+0xd0>
  99867. 80282ee: 2a0b cmp r2, #11
  99868. 80282f0: d917 bls.n 8028322 <_malloc_r+0xc2>
  99869. 80282f2: 1961 adds r1, r4, r5
  99870. 80282f4: 42a3 cmp r3, r4
  99871. 80282f6: 6025 str r5, [r4, #0]
  99872. 80282f8: bf18 it ne
  99873. 80282fa: 6059 strne r1, [r3, #4]
  99874. 80282fc: 6863 ldr r3, [r4, #4]
  99875. 80282fe: bf08 it eq
  99876. 8028300: f8c8 1000 streq.w r1, [r8]
  99877. 8028304: 5162 str r2, [r4, r5]
  99878. 8028306: 604b str r3, [r1, #4]
  99879. 8028308: 4630 mov r0, r6
  99880. 802830a: f000 f82f bl 802836c <__malloc_unlock>
  99881. 802830e: f104 000b add.w r0, r4, #11
  99882. 8028312: 1d23 adds r3, r4, #4
  99883. 8028314: f020 0007 bic.w r0, r0, #7
  99884. 8028318: 1ac2 subs r2, r0, r3
  99885. 802831a: bf1c itt ne
  99886. 802831c: 1a1b subne r3, r3, r0
  99887. 802831e: 50a3 strne r3, [r4, r2]
  99888. 8028320: e7af b.n 8028282 <_malloc_r+0x22>
  99889. 8028322: 6862 ldr r2, [r4, #4]
  99890. 8028324: 42a3 cmp r3, r4
  99891. 8028326: bf0c ite eq
  99892. 8028328: f8c8 2000 streq.w r2, [r8]
  99893. 802832c: 605a strne r2, [r3, #4]
  99894. 802832e: e7eb b.n 8028308 <_malloc_r+0xa8>
  99895. 8028330: 4623 mov r3, r4
  99896. 8028332: 6864 ldr r4, [r4, #4]
  99897. 8028334: e7ae b.n 8028294 <_malloc_r+0x34>
  99898. 8028336: 463c mov r4, r7
  99899. 8028338: 687f ldr r7, [r7, #4]
  99900. 802833a: e7b6 b.n 80282aa <_malloc_r+0x4a>
  99901. 802833c: 461a mov r2, r3
  99902. 802833e: 685b ldr r3, [r3, #4]
  99903. 8028340: 42a3 cmp r3, r4
  99904. 8028342: d1fb bne.n 802833c <_malloc_r+0xdc>
  99905. 8028344: 2300 movs r3, #0
  99906. 8028346: 6053 str r3, [r2, #4]
  99907. 8028348: e7de b.n 8028308 <_malloc_r+0xa8>
  99908. 802834a: 230c movs r3, #12
  99909. 802834c: 6033 str r3, [r6, #0]
  99910. 802834e: 4630 mov r0, r6
  99911. 8028350: f000 f80c bl 802836c <__malloc_unlock>
  99912. 8028354: e794 b.n 8028280 <_malloc_r+0x20>
  99913. 8028356: 6005 str r5, [r0, #0]
  99914. 8028358: e7d6 b.n 8028308 <_malloc_r+0xa8>
  99915. 802835a: bf00 nop
  99916. 802835c: 2402b040 .word 0x2402b040
  99917. 08028360 <__malloc_lock>:
  99918. 8028360: 4801 ldr r0, [pc, #4] @ (8028368 <__malloc_lock+0x8>)
  99919. 8028362: f001 bdba b.w 8029eda <__retarget_lock_acquire_recursive>
  99920. 8028366: bf00 nop
  99921. 8028368: 2402b184 .word 0x2402b184
  99922. 0802836c <__malloc_unlock>:
  99923. 802836c: 4801 ldr r0, [pc, #4] @ (8028374 <__malloc_unlock+0x8>)
  99924. 802836e: f001 bdb5 b.w 8029edc <__retarget_lock_release_recursive>
  99925. 8028372: bf00 nop
  99926. 8028374: 2402b184 .word 0x2402b184
  99927. 08028378 <rand>:
  99928. 8028378: 4b16 ldr r3, [pc, #88] @ (80283d4 <rand+0x5c>)
  99929. 802837a: b510 push {r4, lr}
  99930. 802837c: 681c ldr r4, [r3, #0]
  99931. 802837e: 6b23 ldr r3, [r4, #48] @ 0x30
  99932. 8028380: b9b3 cbnz r3, 80283b0 <rand+0x38>
  99933. 8028382: 2018 movs r0, #24
  99934. 8028384: f7ff ff3a bl 80281fc <malloc>
  99935. 8028388: 4602 mov r2, r0
  99936. 802838a: 6320 str r0, [r4, #48] @ 0x30
  99937. 802838c: b920 cbnz r0, 8028398 <rand+0x20>
  99938. 802838e: 4b12 ldr r3, [pc, #72] @ (80283d8 <rand+0x60>)
  99939. 8028390: 4812 ldr r0, [pc, #72] @ (80283dc <rand+0x64>)
  99940. 8028392: 2152 movs r1, #82 @ 0x52
  99941. 8028394: f001 fdbc bl 8029f10 <__assert_func>
  99942. 8028398: 4911 ldr r1, [pc, #68] @ (80283e0 <rand+0x68>)
  99943. 802839a: 4b12 ldr r3, [pc, #72] @ (80283e4 <rand+0x6c>)
  99944. 802839c: e9c0 1300 strd r1, r3, [r0]
  99945. 80283a0: 4b11 ldr r3, [pc, #68] @ (80283e8 <rand+0x70>)
  99946. 80283a2: 6083 str r3, [r0, #8]
  99947. 80283a4: 230b movs r3, #11
  99948. 80283a6: 8183 strh r3, [r0, #12]
  99949. 80283a8: 2100 movs r1, #0
  99950. 80283aa: 2001 movs r0, #1
  99951. 80283ac: e9c2 0104 strd r0, r1, [r2, #16]
  99952. 80283b0: 6b21 ldr r1, [r4, #48] @ 0x30
  99953. 80283b2: 480e ldr r0, [pc, #56] @ (80283ec <rand+0x74>)
  99954. 80283b4: 690b ldr r3, [r1, #16]
  99955. 80283b6: 694c ldr r4, [r1, #20]
  99956. 80283b8: 4a0d ldr r2, [pc, #52] @ (80283f0 <rand+0x78>)
  99957. 80283ba: 4358 muls r0, r3
  99958. 80283bc: fb02 0004 mla r0, r2, r4, r0
  99959. 80283c0: fba3 3202 umull r3, r2, r3, r2
  99960. 80283c4: 3301 adds r3, #1
  99961. 80283c6: eb40 0002 adc.w r0, r0, r2
  99962. 80283ca: e9c1 3004 strd r3, r0, [r1, #16]
  99963. 80283ce: f020 4000 bic.w r0, r0, #2147483648 @ 0x80000000
  99964. 80283d2: bd10 pop {r4, pc}
  99965. 80283d4: 240001d4 .word 0x240001d4
  99966. 80283d8: 08030c26 .word 0x08030c26
  99967. 80283dc: 08030c3d .word 0x08030c3d
  99968. 80283e0: abcd330e .word 0xabcd330e
  99969. 80283e4: e66d1234 .word 0xe66d1234
  99970. 80283e8: 0005deec .word 0x0005deec
  99971. 80283ec: 5851f42d .word 0x5851f42d
  99972. 80283f0: 4c957f2d .word 0x4c957f2d
  99973. 080283f4 <realloc>:
  99974. 80283f4: 4b02 ldr r3, [pc, #8] @ (8028400 <realloc+0xc>)
  99975. 80283f6: 460a mov r2, r1
  99976. 80283f8: 4601 mov r1, r0
  99977. 80283fa: 6818 ldr r0, [r3, #0]
  99978. 80283fc: f000 b802 b.w 8028404 <_realloc_r>
  99979. 8028400: 240001d4 .word 0x240001d4
  99980. 08028404 <_realloc_r>:
  99981. 8028404: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  99982. 8028408: 4680 mov r8, r0
  99983. 802840a: 4615 mov r5, r2
  99984. 802840c: 460c mov r4, r1
  99985. 802840e: b921 cbnz r1, 802841a <_realloc_r+0x16>
  99986. 8028410: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  99987. 8028414: 4611 mov r1, r2
  99988. 8028416: f7ff bf23 b.w 8028260 <_malloc_r>
  99989. 802841a: b92a cbnz r2, 8028428 <_realloc_r+0x24>
  99990. 802841c: f002 fb76 bl 802ab0c <_free_r>
  99991. 8028420: 2400 movs r4, #0
  99992. 8028422: 4620 mov r0, r4
  99993. 8028424: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  99994. 8028428: f003 fbb5 bl 802bb96 <_malloc_usable_size_r>
  99995. 802842c: 4285 cmp r5, r0
  99996. 802842e: 4606 mov r6, r0
  99997. 8028430: d802 bhi.n 8028438 <_realloc_r+0x34>
  99998. 8028432: ebb5 0f50 cmp.w r5, r0, lsr #1
  99999. 8028436: d8f4 bhi.n 8028422 <_realloc_r+0x1e>
  100000. 8028438: 4629 mov r1, r5
  100001. 802843a: 4640 mov r0, r8
  100002. 802843c: f7ff ff10 bl 8028260 <_malloc_r>
  100003. 8028440: 4607 mov r7, r0
  100004. 8028442: 2800 cmp r0, #0
  100005. 8028444: d0ec beq.n 8028420 <_realloc_r+0x1c>
  100006. 8028446: 42b5 cmp r5, r6
  100007. 8028448: 462a mov r2, r5
  100008. 802844a: 4621 mov r1, r4
  100009. 802844c: bf28 it cs
  100010. 802844e: 4632 movcs r2, r6
  100011. 8028450: f001 fd45 bl 8029ede <memcpy>
  100012. 8028454: 4621 mov r1, r4
  100013. 8028456: 4640 mov r0, r8
  100014. 8028458: f002 fb58 bl 802ab0c <_free_r>
  100015. 802845c: 463c mov r4, r7
  100016. 802845e: e7e0 b.n 8028422 <_realloc_r+0x1e>
  100017. 08028460 <sulp>:
  100018. 8028460: b570 push {r4, r5, r6, lr}
  100019. 8028462: 4604 mov r4, r0
  100020. 8028464: 460d mov r5, r1
  100021. 8028466: 4616 mov r6, r2
  100022. 8028468: ec45 4b10 vmov d0, r4, r5
  100023. 802846c: f003 fa58 bl 802b920 <__ulp>
  100024. 8028470: b17e cbz r6, 8028492 <sulp+0x32>
  100025. 8028472: f3c5 530a ubfx r3, r5, #20, #11
  100026. 8028476: f1c3 036b rsb r3, r3, #107 @ 0x6b
  100027. 802847a: 2b00 cmp r3, #0
  100028. 802847c: dd09 ble.n 8028492 <sulp+0x32>
  100029. 802847e: 051b lsls r3, r3, #20
  100030. 8028480: f103 517f add.w r1, r3, #1069547520 @ 0x3fc00000
  100031. 8028484: 2000 movs r0, #0
  100032. 8028486: f501 1140 add.w r1, r1, #3145728 @ 0x300000
  100033. 802848a: ec41 0b17 vmov d7, r0, r1
  100034. 802848e: ee20 0b07 vmul.f64 d0, d0, d7
  100035. 8028492: bd70 pop {r4, r5, r6, pc}
  100036. 8028494: 0000 movs r0, r0
  100037. ...
  100038. 08028498 <_strtod_l>:
  100039. 8028498: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  100040. 802849c: ed2d 8b0a vpush {d8-d12}
  100041. 80284a0: b097 sub sp, #92 @ 0x5c
  100042. 80284a2: 4688 mov r8, r1
  100043. 80284a4: 920e str r2, [sp, #56] @ 0x38
  100044. 80284a6: 2200 movs r2, #0
  100045. 80284a8: 9212 str r2, [sp, #72] @ 0x48
  100046. 80284aa: 9005 str r0, [sp, #20]
  100047. 80284ac: f04f 0a00 mov.w sl, #0
  100048. 80284b0: f04f 0b00 mov.w fp, #0
  100049. 80284b4: 460a mov r2, r1
  100050. 80284b6: 9211 str r2, [sp, #68] @ 0x44
  100051. 80284b8: 7811 ldrb r1, [r2, #0]
  100052. 80284ba: 292b cmp r1, #43 @ 0x2b
  100053. 80284bc: d04c beq.n 8028558 <_strtod_l+0xc0>
  100054. 80284be: d839 bhi.n 8028534 <_strtod_l+0x9c>
  100055. 80284c0: 290d cmp r1, #13
  100056. 80284c2: d833 bhi.n 802852c <_strtod_l+0x94>
  100057. 80284c4: 2908 cmp r1, #8
  100058. 80284c6: d833 bhi.n 8028530 <_strtod_l+0x98>
  100059. 80284c8: 2900 cmp r1, #0
  100060. 80284ca: d03c beq.n 8028546 <_strtod_l+0xae>
  100061. 80284cc: 2200 movs r2, #0
  100062. 80284ce: 9208 str r2, [sp, #32]
  100063. 80284d0: 9d11 ldr r5, [sp, #68] @ 0x44
  100064. 80284d2: 782a ldrb r2, [r5, #0]
  100065. 80284d4: 2a30 cmp r2, #48 @ 0x30
  100066. 80284d6: f040 80b5 bne.w 8028644 <_strtod_l+0x1ac>
  100067. 80284da: 786a ldrb r2, [r5, #1]
  100068. 80284dc: f002 02df and.w r2, r2, #223 @ 0xdf
  100069. 80284e0: 2a58 cmp r2, #88 @ 0x58
  100070. 80284e2: d170 bne.n 80285c6 <_strtod_l+0x12e>
  100071. 80284e4: 9302 str r3, [sp, #8]
  100072. 80284e6: 9b08 ldr r3, [sp, #32]
  100073. 80284e8: 9301 str r3, [sp, #4]
  100074. 80284ea: ab12 add r3, sp, #72 @ 0x48
  100075. 80284ec: 9300 str r3, [sp, #0]
  100076. 80284ee: 4a8b ldr r2, [pc, #556] @ (802871c <_strtod_l+0x284>)
  100077. 80284f0: 9805 ldr r0, [sp, #20]
  100078. 80284f2: ab13 add r3, sp, #76 @ 0x4c
  100079. 80284f4: a911 add r1, sp, #68 @ 0x44
  100080. 80284f6: f002 fbbb bl 802ac70 <__gethex>
  100081. 80284fa: f010 060f ands.w r6, r0, #15
  100082. 80284fe: 4604 mov r4, r0
  100083. 8028500: d005 beq.n 802850e <_strtod_l+0x76>
  100084. 8028502: 2e06 cmp r6, #6
  100085. 8028504: d12a bne.n 802855c <_strtod_l+0xc4>
  100086. 8028506: 3501 adds r5, #1
  100087. 8028508: 2300 movs r3, #0
  100088. 802850a: 9511 str r5, [sp, #68] @ 0x44
  100089. 802850c: 9308 str r3, [sp, #32]
  100090. 802850e: 9b0e ldr r3, [sp, #56] @ 0x38
  100091. 8028510: 2b00 cmp r3, #0
  100092. 8028512: f040 852f bne.w 8028f74 <_strtod_l+0xadc>
  100093. 8028516: 9b08 ldr r3, [sp, #32]
  100094. 8028518: ec4b ab10 vmov d0, sl, fp
  100095. 802851c: b1cb cbz r3, 8028552 <_strtod_l+0xba>
  100096. 802851e: eeb1 0b40 vneg.f64 d0, d0
  100097. 8028522: b017 add sp, #92 @ 0x5c
  100098. 8028524: ecbd 8b0a vpop {d8-d12}
  100099. 8028528: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  100100. 802852c: 2920 cmp r1, #32
  100101. 802852e: d1cd bne.n 80284cc <_strtod_l+0x34>
  100102. 8028530: 3201 adds r2, #1
  100103. 8028532: e7c0 b.n 80284b6 <_strtod_l+0x1e>
  100104. 8028534: 292d cmp r1, #45 @ 0x2d
  100105. 8028536: d1c9 bne.n 80284cc <_strtod_l+0x34>
  100106. 8028538: 2101 movs r1, #1
  100107. 802853a: 9108 str r1, [sp, #32]
  100108. 802853c: 1c51 adds r1, r2, #1
  100109. 802853e: 9111 str r1, [sp, #68] @ 0x44
  100110. 8028540: 7852 ldrb r2, [r2, #1]
  100111. 8028542: 2a00 cmp r2, #0
  100112. 8028544: d1c4 bne.n 80284d0 <_strtod_l+0x38>
  100113. 8028546: 9b0e ldr r3, [sp, #56] @ 0x38
  100114. 8028548: f8cd 8044 str.w r8, [sp, #68] @ 0x44
  100115. 802854c: 2b00 cmp r3, #0
  100116. 802854e: f040 850f bne.w 8028f70 <_strtod_l+0xad8>
  100117. 8028552: ec4b ab10 vmov d0, sl, fp
  100118. 8028556: e7e4 b.n 8028522 <_strtod_l+0x8a>
  100119. 8028558: 2100 movs r1, #0
  100120. 802855a: e7ee b.n 802853a <_strtod_l+0xa2>
  100121. 802855c: 9a12 ldr r2, [sp, #72] @ 0x48
  100122. 802855e: b13a cbz r2, 8028570 <_strtod_l+0xd8>
  100123. 8028560: 2135 movs r1, #53 @ 0x35
  100124. 8028562: a814 add r0, sp, #80 @ 0x50
  100125. 8028564: f003 fad3 bl 802bb0e <__copybits>
  100126. 8028568: 9912 ldr r1, [sp, #72] @ 0x48
  100127. 802856a: 9805 ldr r0, [sp, #20]
  100128. 802856c: f002 fea4 bl 802b2b8 <_Bfree>
  100129. 8028570: 1e73 subs r3, r6, #1
  100130. 8028572: 9a13 ldr r2, [sp, #76] @ 0x4c
  100131. 8028574: 2b04 cmp r3, #4
  100132. 8028576: d806 bhi.n 8028586 <_strtod_l+0xee>
  100133. 8028578: e8df f003 tbb [pc, r3]
  100134. 802857c: 201d0314 .word 0x201d0314
  100135. 8028580: 14 .byte 0x14
  100136. 8028581: 00 .byte 0x00
  100137. 8028582: e9dd ab14 ldrd sl, fp, [sp, #80] @ 0x50
  100138. 8028586: 05e3 lsls r3, r4, #23
  100139. 8028588: bf48 it mi
  100140. 802858a: f04b 4b00 orrmi.w fp, fp, #2147483648 @ 0x80000000
  100141. 802858e: f02b 4300 bic.w r3, fp, #2147483648 @ 0x80000000
  100142. 8028592: 0d1b lsrs r3, r3, #20
  100143. 8028594: 051b lsls r3, r3, #20
  100144. 8028596: 2b00 cmp r3, #0
  100145. 8028598: d1b9 bne.n 802850e <_strtod_l+0x76>
  100146. 802859a: f001 fc73 bl 8029e84 <__errno>
  100147. 802859e: 2322 movs r3, #34 @ 0x22
  100148. 80285a0: 6003 str r3, [r0, #0]
  100149. 80285a2: e7b4 b.n 802850e <_strtod_l+0x76>
  100150. 80285a4: e9dd a314 ldrd sl, r3, [sp, #80] @ 0x50
  100151. 80285a8: f202 4233 addw r2, r2, #1075 @ 0x433
  100152. 80285ac: f423 1380 bic.w r3, r3, #1048576 @ 0x100000
  100153. 80285b0: ea43 5b02 orr.w fp, r3, r2, lsl #20
  100154. 80285b4: e7e7 b.n 8028586 <_strtod_l+0xee>
  100155. 80285b6: f8df b16c ldr.w fp, [pc, #364] @ 8028724 <_strtod_l+0x28c>
  100156. 80285ba: e7e4 b.n 8028586 <_strtod_l+0xee>
  100157. 80285bc: f06f 4b00 mvn.w fp, #2147483648 @ 0x80000000
  100158. 80285c0: f04f 3aff mov.w sl, #4294967295 @ 0xffffffff
  100159. 80285c4: e7df b.n 8028586 <_strtod_l+0xee>
  100160. 80285c6: 9b11 ldr r3, [sp, #68] @ 0x44
  100161. 80285c8: 1c5a adds r2, r3, #1
  100162. 80285ca: 9211 str r2, [sp, #68] @ 0x44
  100163. 80285cc: 785b ldrb r3, [r3, #1]
  100164. 80285ce: 2b30 cmp r3, #48 @ 0x30
  100165. 80285d0: d0f9 beq.n 80285c6 <_strtod_l+0x12e>
  100166. 80285d2: 2b00 cmp r3, #0
  100167. 80285d4: d09b beq.n 802850e <_strtod_l+0x76>
  100168. 80285d6: 2301 movs r3, #1
  100169. 80285d8: 2600 movs r6, #0
  100170. 80285da: 9307 str r3, [sp, #28]
  100171. 80285dc: 9b11 ldr r3, [sp, #68] @ 0x44
  100172. 80285de: 930a str r3, [sp, #40] @ 0x28
  100173. 80285e0: 46b1 mov r9, r6
  100174. 80285e2: 4635 mov r5, r6
  100175. 80285e4: 220a movs r2, #10
  100176. 80285e6: 9811 ldr r0, [sp, #68] @ 0x44
  100177. 80285e8: 7804 ldrb r4, [r0, #0]
  100178. 80285ea: f1a4 0330 sub.w r3, r4, #48 @ 0x30
  100179. 80285ee: b2d9 uxtb r1, r3
  100180. 80285f0: 2909 cmp r1, #9
  100181. 80285f2: d929 bls.n 8028648 <_strtod_l+0x1b0>
  100182. 80285f4: 494a ldr r1, [pc, #296] @ (8028720 <_strtod_l+0x288>)
  100183. 80285f6: 2201 movs r2, #1
  100184. 80285f8: f001 fb82 bl 8029d00 <strncmp>
  100185. 80285fc: b378 cbz r0, 802865e <_strtod_l+0x1c6>
  100186. 80285fe: 2000 movs r0, #0
  100187. 8028600: 4622 mov r2, r4
  100188. 8028602: 462b mov r3, r5
  100189. 8028604: 4607 mov r7, r0
  100190. 8028606: 9006 str r0, [sp, #24]
  100191. 8028608: 2a65 cmp r2, #101 @ 0x65
  100192. 802860a: d001 beq.n 8028610 <_strtod_l+0x178>
  100193. 802860c: 2a45 cmp r2, #69 @ 0x45
  100194. 802860e: d117 bne.n 8028640 <_strtod_l+0x1a8>
  100195. 8028610: b91b cbnz r3, 802861a <_strtod_l+0x182>
  100196. 8028612: 9b07 ldr r3, [sp, #28]
  100197. 8028614: 4303 orrs r3, r0
  100198. 8028616: d096 beq.n 8028546 <_strtod_l+0xae>
  100199. 8028618: 2300 movs r3, #0
  100200. 802861a: f8dd 8044 ldr.w r8, [sp, #68] @ 0x44
  100201. 802861e: f108 0201 add.w r2, r8, #1
  100202. 8028622: 9211 str r2, [sp, #68] @ 0x44
  100203. 8028624: f898 2001 ldrb.w r2, [r8, #1]
  100204. 8028628: 2a2b cmp r2, #43 @ 0x2b
  100205. 802862a: d06b beq.n 8028704 <_strtod_l+0x26c>
  100206. 802862c: 2a2d cmp r2, #45 @ 0x2d
  100207. 802862e: d071 beq.n 8028714 <_strtod_l+0x27c>
  100208. 8028630: f04f 0e00 mov.w lr, #0
  100209. 8028634: f1a2 0430 sub.w r4, r2, #48 @ 0x30
  100210. 8028638: 2c09 cmp r4, #9
  100211. 802863a: d979 bls.n 8028730 <_strtod_l+0x298>
  100212. 802863c: f8cd 8044 str.w r8, [sp, #68] @ 0x44
  100213. 8028640: 2400 movs r4, #0
  100214. 8028642: e094 b.n 802876e <_strtod_l+0x2d6>
  100215. 8028644: 2300 movs r3, #0
  100216. 8028646: e7c7 b.n 80285d8 <_strtod_l+0x140>
  100217. 8028648: 2d08 cmp r5, #8
  100218. 802864a: f100 0001 add.w r0, r0, #1
  100219. 802864e: bfd4 ite le
  100220. 8028650: fb02 3909 mlale r9, r2, r9, r3
  100221. 8028654: fb02 3606 mlagt r6, r2, r6, r3
  100222. 8028658: 3501 adds r5, #1
  100223. 802865a: 9011 str r0, [sp, #68] @ 0x44
  100224. 802865c: e7c3 b.n 80285e6 <_strtod_l+0x14e>
  100225. 802865e: 9b11 ldr r3, [sp, #68] @ 0x44
  100226. 8028660: 1c5a adds r2, r3, #1
  100227. 8028662: 9211 str r2, [sp, #68] @ 0x44
  100228. 8028664: 785a ldrb r2, [r3, #1]
  100229. 8028666: b375 cbz r5, 80286c6 <_strtod_l+0x22e>
  100230. 8028668: 4607 mov r7, r0
  100231. 802866a: 462b mov r3, r5
  100232. 802866c: f1a2 0130 sub.w r1, r2, #48 @ 0x30
  100233. 8028670: 2909 cmp r1, #9
  100234. 8028672: d913 bls.n 802869c <_strtod_l+0x204>
  100235. 8028674: 2101 movs r1, #1
  100236. 8028676: 9106 str r1, [sp, #24]
  100237. 8028678: e7c6 b.n 8028608 <_strtod_l+0x170>
  100238. 802867a: 9b11 ldr r3, [sp, #68] @ 0x44
  100239. 802867c: 1c5a adds r2, r3, #1
  100240. 802867e: 9211 str r2, [sp, #68] @ 0x44
  100241. 8028680: 785a ldrb r2, [r3, #1]
  100242. 8028682: 3001 adds r0, #1
  100243. 8028684: 2a30 cmp r2, #48 @ 0x30
  100244. 8028686: d0f8 beq.n 802867a <_strtod_l+0x1e2>
  100245. 8028688: f1a2 0331 sub.w r3, r2, #49 @ 0x31
  100246. 802868c: 2b08 cmp r3, #8
  100247. 802868e: f200 8476 bhi.w 8028f7e <_strtod_l+0xae6>
  100248. 8028692: 9b11 ldr r3, [sp, #68] @ 0x44
  100249. 8028694: 930a str r3, [sp, #40] @ 0x28
  100250. 8028696: 4607 mov r7, r0
  100251. 8028698: 2000 movs r0, #0
  100252. 802869a: 4603 mov r3, r0
  100253. 802869c: 3a30 subs r2, #48 @ 0x30
  100254. 802869e: f100 0101 add.w r1, r0, #1
  100255. 80286a2: d023 beq.n 80286ec <_strtod_l+0x254>
  100256. 80286a4: 440f add r7, r1
  100257. 80286a6: eb00 0c03 add.w ip, r0, r3
  100258. 80286aa: 4619 mov r1, r3
  100259. 80286ac: 240a movs r4, #10
  100260. 80286ae: 4561 cmp r1, ip
  100261. 80286b0: d10b bne.n 80286ca <_strtod_l+0x232>
  100262. 80286b2: 1c5c adds r4, r3, #1
  100263. 80286b4: 4403 add r3, r0
  100264. 80286b6: 2b08 cmp r3, #8
  100265. 80286b8: 4404 add r4, r0
  100266. 80286ba: dc11 bgt.n 80286e0 <_strtod_l+0x248>
  100267. 80286bc: 230a movs r3, #10
  100268. 80286be: fb03 2909 mla r9, r3, r9, r2
  100269. 80286c2: 2100 movs r1, #0
  100270. 80286c4: e013 b.n 80286ee <_strtod_l+0x256>
  100271. 80286c6: 4628 mov r0, r5
  100272. 80286c8: e7dc b.n 8028684 <_strtod_l+0x1ec>
  100273. 80286ca: 2908 cmp r1, #8
  100274. 80286cc: f101 0101 add.w r1, r1, #1
  100275. 80286d0: dc02 bgt.n 80286d8 <_strtod_l+0x240>
  100276. 80286d2: fb04 f909 mul.w r9, r4, r9
  100277. 80286d6: e7ea b.n 80286ae <_strtod_l+0x216>
  100278. 80286d8: 2910 cmp r1, #16
  100279. 80286da: bfd8 it le
  100280. 80286dc: 4366 mulle r6, r4
  100281. 80286de: e7e6 b.n 80286ae <_strtod_l+0x216>
  100282. 80286e0: 2b0f cmp r3, #15
  100283. 80286e2: dcee bgt.n 80286c2 <_strtod_l+0x22a>
  100284. 80286e4: 230a movs r3, #10
  100285. 80286e6: fb03 2606 mla r6, r3, r6, r2
  100286. 80286ea: e7ea b.n 80286c2 <_strtod_l+0x22a>
  100287. 80286ec: 461c mov r4, r3
  100288. 80286ee: 9b11 ldr r3, [sp, #68] @ 0x44
  100289. 80286f0: 1c5a adds r2, r3, #1
  100290. 80286f2: 9211 str r2, [sp, #68] @ 0x44
  100291. 80286f4: 785a ldrb r2, [r3, #1]
  100292. 80286f6: 4608 mov r0, r1
  100293. 80286f8: 4623 mov r3, r4
  100294. 80286fa: e7b7 b.n 802866c <_strtod_l+0x1d4>
  100295. 80286fc: 2301 movs r3, #1
  100296. 80286fe: 2700 movs r7, #0
  100297. 8028700: 9306 str r3, [sp, #24]
  100298. 8028702: e786 b.n 8028612 <_strtod_l+0x17a>
  100299. 8028704: f04f 0e00 mov.w lr, #0
  100300. 8028708: f108 0202 add.w r2, r8, #2
  100301. 802870c: 9211 str r2, [sp, #68] @ 0x44
  100302. 802870e: f898 2002 ldrb.w r2, [r8, #2]
  100303. 8028712: e78f b.n 8028634 <_strtod_l+0x19c>
  100304. 8028714: f04f 0e01 mov.w lr, #1
  100305. 8028718: e7f6 b.n 8028708 <_strtod_l+0x270>
  100306. 802871a: bf00 nop
  100307. 802871c: 08030cac .word 0x08030cac
  100308. 8028720: 08030c95 .word 0x08030c95
  100309. 8028724: 7ff00000 .word 0x7ff00000
  100310. 8028728: 9a11 ldr r2, [sp, #68] @ 0x44
  100311. 802872a: 1c54 adds r4, r2, #1
  100312. 802872c: 9411 str r4, [sp, #68] @ 0x44
  100313. 802872e: 7852 ldrb r2, [r2, #1]
  100314. 8028730: 2a30 cmp r2, #48 @ 0x30
  100315. 8028732: d0f9 beq.n 8028728 <_strtod_l+0x290>
  100316. 8028734: f1a2 0431 sub.w r4, r2, #49 @ 0x31
  100317. 8028738: 2c08 cmp r4, #8
  100318. 802873a: d881 bhi.n 8028640 <_strtod_l+0x1a8>
  100319. 802873c: f1a2 0c30 sub.w ip, r2, #48 @ 0x30
  100320. 8028740: 9a11 ldr r2, [sp, #68] @ 0x44
  100321. 8028742: 9209 str r2, [sp, #36] @ 0x24
  100322. 8028744: 9a11 ldr r2, [sp, #68] @ 0x44
  100323. 8028746: 1c51 adds r1, r2, #1
  100324. 8028748: 9111 str r1, [sp, #68] @ 0x44
  100325. 802874a: 7852 ldrb r2, [r2, #1]
  100326. 802874c: f1a2 0430 sub.w r4, r2, #48 @ 0x30
  100327. 8028750: 2c09 cmp r4, #9
  100328. 8028752: d938 bls.n 80287c6 <_strtod_l+0x32e>
  100329. 8028754: 9c09 ldr r4, [sp, #36] @ 0x24
  100330. 8028756: 1b0c subs r4, r1, r4
  100331. 8028758: 2c08 cmp r4, #8
  100332. 802875a: f644 641f movw r4, #19999 @ 0x4e1f
  100333. 802875e: dc02 bgt.n 8028766 <_strtod_l+0x2ce>
  100334. 8028760: 4564 cmp r4, ip
  100335. 8028762: bfa8 it ge
  100336. 8028764: 4664 movge r4, ip
  100337. 8028766: f1be 0f00 cmp.w lr, #0
  100338. 802876a: d000 beq.n 802876e <_strtod_l+0x2d6>
  100339. 802876c: 4264 negs r4, r4
  100340. 802876e: 2b00 cmp r3, #0
  100341. 8028770: d14e bne.n 8028810 <_strtod_l+0x378>
  100342. 8028772: 9b07 ldr r3, [sp, #28]
  100343. 8028774: 4318 orrs r0, r3
  100344. 8028776: f47f aeca bne.w 802850e <_strtod_l+0x76>
  100345. 802877a: 9b06 ldr r3, [sp, #24]
  100346. 802877c: 2b00 cmp r3, #0
  100347. 802877e: f47f aee2 bne.w 8028546 <_strtod_l+0xae>
  100348. 8028782: 2a69 cmp r2, #105 @ 0x69
  100349. 8028784: d027 beq.n 80287d6 <_strtod_l+0x33e>
  100350. 8028786: dc24 bgt.n 80287d2 <_strtod_l+0x33a>
  100351. 8028788: 2a49 cmp r2, #73 @ 0x49
  100352. 802878a: d024 beq.n 80287d6 <_strtod_l+0x33e>
  100353. 802878c: 2a4e cmp r2, #78 @ 0x4e
  100354. 802878e: f47f aeda bne.w 8028546 <_strtod_l+0xae>
  100355. 8028792: 4997 ldr r1, [pc, #604] @ (80289f0 <_strtod_l+0x558>)
  100356. 8028794: a811 add r0, sp, #68 @ 0x44
  100357. 8028796: f002 fc8d bl 802b0b4 <__match>
  100358. 802879a: 2800 cmp r0, #0
  100359. 802879c: f43f aed3 beq.w 8028546 <_strtod_l+0xae>
  100360. 80287a0: 9b11 ldr r3, [sp, #68] @ 0x44
  100361. 80287a2: 781b ldrb r3, [r3, #0]
  100362. 80287a4: 2b28 cmp r3, #40 @ 0x28
  100363. 80287a6: d12d bne.n 8028804 <_strtod_l+0x36c>
  100364. 80287a8: 4992 ldr r1, [pc, #584] @ (80289f4 <_strtod_l+0x55c>)
  100365. 80287aa: aa14 add r2, sp, #80 @ 0x50
  100366. 80287ac: a811 add r0, sp, #68 @ 0x44
  100367. 80287ae: f002 fc95 bl 802b0dc <__hexnan>
  100368. 80287b2: 2805 cmp r0, #5
  100369. 80287b4: d126 bne.n 8028804 <_strtod_l+0x36c>
  100370. 80287b6: 9b15 ldr r3, [sp, #84] @ 0x54
  100371. 80287b8: f8dd a050 ldr.w sl, [sp, #80] @ 0x50
  100372. 80287bc: f043 4bff orr.w fp, r3, #2139095040 @ 0x7f800000
  100373. 80287c0: f44b 0be0 orr.w fp, fp, #7340032 @ 0x700000
  100374. 80287c4: e6a3 b.n 802850e <_strtod_l+0x76>
  100375. 80287c6: 240a movs r4, #10
  100376. 80287c8: fb04 2c0c mla ip, r4, ip, r2
  100377. 80287cc: f1ac 0c30 sub.w ip, ip, #48 @ 0x30
  100378. 80287d0: e7b8 b.n 8028744 <_strtod_l+0x2ac>
  100379. 80287d2: 2a6e cmp r2, #110 @ 0x6e
  100380. 80287d4: e7db b.n 802878e <_strtod_l+0x2f6>
  100381. 80287d6: 4988 ldr r1, [pc, #544] @ (80289f8 <_strtod_l+0x560>)
  100382. 80287d8: a811 add r0, sp, #68 @ 0x44
  100383. 80287da: f002 fc6b bl 802b0b4 <__match>
  100384. 80287de: 2800 cmp r0, #0
  100385. 80287e0: f43f aeb1 beq.w 8028546 <_strtod_l+0xae>
  100386. 80287e4: 9b11 ldr r3, [sp, #68] @ 0x44
  100387. 80287e6: 4985 ldr r1, [pc, #532] @ (80289fc <_strtod_l+0x564>)
  100388. 80287e8: 3b01 subs r3, #1
  100389. 80287ea: a811 add r0, sp, #68 @ 0x44
  100390. 80287ec: 9311 str r3, [sp, #68] @ 0x44
  100391. 80287ee: f002 fc61 bl 802b0b4 <__match>
  100392. 80287f2: b910 cbnz r0, 80287fa <_strtod_l+0x362>
  100393. 80287f4: 9b11 ldr r3, [sp, #68] @ 0x44
  100394. 80287f6: 3301 adds r3, #1
  100395. 80287f8: 9311 str r3, [sp, #68] @ 0x44
  100396. 80287fa: f8df b214 ldr.w fp, [pc, #532] @ 8028a10 <_strtod_l+0x578>
  100397. 80287fe: f04f 0a00 mov.w sl, #0
  100398. 8028802: e684 b.n 802850e <_strtod_l+0x76>
  100399. 8028804: 487e ldr r0, [pc, #504] @ (8028a00 <_strtod_l+0x568>)
  100400. 8028806: f001 fb7b bl 8029f00 <nan>
  100401. 802880a: ec5b ab10 vmov sl, fp, d0
  100402. 802880e: e67e b.n 802850e <_strtod_l+0x76>
  100403. 8028810: ee07 9a90 vmov s15, r9
  100404. 8028814: 1be2 subs r2, r4, r7
  100405. 8028816: eeb8 7b67 vcvt.f64.u32 d7, s15
  100406. 802881a: 2d00 cmp r5, #0
  100407. 802881c: bf08 it eq
  100408. 802881e: 461d moveq r5, r3
  100409. 8028820: 2b10 cmp r3, #16
  100410. 8028822: 9209 str r2, [sp, #36] @ 0x24
  100411. 8028824: 461a mov r2, r3
  100412. 8028826: bfa8 it ge
  100413. 8028828: 2210 movge r2, #16
  100414. 802882a: 2b09 cmp r3, #9
  100415. 802882c: ec5b ab17 vmov sl, fp, d7
  100416. 8028830: dc15 bgt.n 802885e <_strtod_l+0x3c6>
  100417. 8028832: 1be1 subs r1, r4, r7
  100418. 8028834: 2900 cmp r1, #0
  100419. 8028836: f43f ae6a beq.w 802850e <_strtod_l+0x76>
  100420. 802883a: eba4 0107 sub.w r1, r4, r7
  100421. 802883e: dd72 ble.n 8028926 <_strtod_l+0x48e>
  100422. 8028840: 2916 cmp r1, #22
  100423. 8028842: dc59 bgt.n 80288f8 <_strtod_l+0x460>
  100424. 8028844: 4b6f ldr r3, [pc, #444] @ (8028a04 <_strtod_l+0x56c>)
  100425. 8028846: 9a09 ldr r2, [sp, #36] @ 0x24
  100426. 8028848: eb03 03c2 add.w r3, r3, r2, lsl #3
  100427. 802884c: ed93 7b00 vldr d7, [r3]
  100428. 8028850: ec4b ab16 vmov d6, sl, fp
  100429. 8028854: ee27 7b06 vmul.f64 d7, d7, d6
  100430. 8028858: ec5b ab17 vmov sl, fp, d7
  100431. 802885c: e657 b.n 802850e <_strtod_l+0x76>
  100432. 802885e: 4969 ldr r1, [pc, #420] @ (8028a04 <_strtod_l+0x56c>)
  100433. 8028860: eb01 01c2 add.w r1, r1, r2, lsl #3
  100434. 8028864: ed11 5b12 vldr d5, [r1, #-72] @ 0xffffffb8
  100435. 8028868: ee06 6a90 vmov s13, r6
  100436. 802886c: 2b0f cmp r3, #15
  100437. 802886e: eeb8 6b66 vcvt.f64.u32 d6, s13
  100438. 8028872: eea7 6b05 vfma.f64 d6, d7, d5
  100439. 8028876: ec5b ab16 vmov sl, fp, d6
  100440. 802887a: ddda ble.n 8028832 <_strtod_l+0x39a>
  100441. 802887c: 1a9a subs r2, r3, r2
  100442. 802887e: 1be1 subs r1, r4, r7
  100443. 8028880: 440a add r2, r1
  100444. 8028882: 2a00 cmp r2, #0
  100445. 8028884: f340 8094 ble.w 80289b0 <_strtod_l+0x518>
  100446. 8028888: f012 000f ands.w r0, r2, #15
  100447. 802888c: d00a beq.n 80288a4 <_strtod_l+0x40c>
  100448. 802888e: 495d ldr r1, [pc, #372] @ (8028a04 <_strtod_l+0x56c>)
  100449. 8028890: eb01 01c0 add.w r1, r1, r0, lsl #3
  100450. 8028894: ed91 7b00 vldr d7, [r1]
  100451. 8028898: ec4b ab16 vmov d6, sl, fp
  100452. 802889c: ee27 7b06 vmul.f64 d7, d7, d6
  100453. 80288a0: ec5b ab17 vmov sl, fp, d7
  100454. 80288a4: f032 020f bics.w r2, r2, #15
  100455. 80288a8: d073 beq.n 8028992 <_strtod_l+0x4fa>
  100456. 80288aa: f5b2 7f9a cmp.w r2, #308 @ 0x134
  100457. 80288ae: dd47 ble.n 8028940 <_strtod_l+0x4a8>
  100458. 80288b0: 2400 movs r4, #0
  100459. 80288b2: 4625 mov r5, r4
  100460. 80288b4: 9407 str r4, [sp, #28]
  100461. 80288b6: 4626 mov r6, r4
  100462. 80288b8: 9a05 ldr r2, [sp, #20]
  100463. 80288ba: f8df b154 ldr.w fp, [pc, #340] @ 8028a10 <_strtod_l+0x578>
  100464. 80288be: 2322 movs r3, #34 @ 0x22
  100465. 80288c0: 6013 str r3, [r2, #0]
  100466. 80288c2: f04f 0a00 mov.w sl, #0
  100467. 80288c6: 9b07 ldr r3, [sp, #28]
  100468. 80288c8: 2b00 cmp r3, #0
  100469. 80288ca: f43f ae20 beq.w 802850e <_strtod_l+0x76>
  100470. 80288ce: 9912 ldr r1, [sp, #72] @ 0x48
  100471. 80288d0: 9805 ldr r0, [sp, #20]
  100472. 80288d2: f002 fcf1 bl 802b2b8 <_Bfree>
  100473. 80288d6: 9805 ldr r0, [sp, #20]
  100474. 80288d8: 4631 mov r1, r6
  100475. 80288da: f002 fced bl 802b2b8 <_Bfree>
  100476. 80288de: 9805 ldr r0, [sp, #20]
  100477. 80288e0: 4629 mov r1, r5
  100478. 80288e2: f002 fce9 bl 802b2b8 <_Bfree>
  100479. 80288e6: 9907 ldr r1, [sp, #28]
  100480. 80288e8: 9805 ldr r0, [sp, #20]
  100481. 80288ea: f002 fce5 bl 802b2b8 <_Bfree>
  100482. 80288ee: 9805 ldr r0, [sp, #20]
  100483. 80288f0: 4621 mov r1, r4
  100484. 80288f2: f002 fce1 bl 802b2b8 <_Bfree>
  100485. 80288f6: e60a b.n 802850e <_strtod_l+0x76>
  100486. 80288f8: f1c3 0125 rsb r1, r3, #37 @ 0x25
  100487. 80288fc: 1be0 subs r0, r4, r7
  100488. 80288fe: 4281 cmp r1, r0
  100489. 8028900: dbbc blt.n 802887c <_strtod_l+0x3e4>
  100490. 8028902: 4a40 ldr r2, [pc, #256] @ (8028a04 <_strtod_l+0x56c>)
  100491. 8028904: f1c3 030f rsb r3, r3, #15
  100492. 8028908: eb02 01c3 add.w r1, r2, r3, lsl #3
  100493. 802890c: ed91 7b00 vldr d7, [r1]
  100494. 8028910: 9909 ldr r1, [sp, #36] @ 0x24
  100495. 8028912: ec4b ab16 vmov d6, sl, fp
  100496. 8028916: 1acb subs r3, r1, r3
  100497. 8028918: eb02 02c3 add.w r2, r2, r3, lsl #3
  100498. 802891c: ee27 7b06 vmul.f64 d7, d7, d6
  100499. 8028920: ed92 6b00 vldr d6, [r2]
  100500. 8028924: e796 b.n 8028854 <_strtod_l+0x3bc>
  100501. 8028926: 3116 adds r1, #22
  100502. 8028928: dba8 blt.n 802887c <_strtod_l+0x3e4>
  100503. 802892a: 4b36 ldr r3, [pc, #216] @ (8028a04 <_strtod_l+0x56c>)
  100504. 802892c: 1b3c subs r4, r7, r4
  100505. 802892e: eb03 04c4 add.w r4, r3, r4, lsl #3
  100506. 8028932: ed94 7b00 vldr d7, [r4]
  100507. 8028936: ec4b ab16 vmov d6, sl, fp
  100508. 802893a: ee86 7b07 vdiv.f64 d7, d6, d7
  100509. 802893e: e78b b.n 8028858 <_strtod_l+0x3c0>
  100510. 8028940: 2000 movs r0, #0
  100511. 8028942: ec4b ab17 vmov d7, sl, fp
  100512. 8028946: 4e30 ldr r6, [pc, #192] @ (8028a08 <_strtod_l+0x570>)
  100513. 8028948: 1112 asrs r2, r2, #4
  100514. 802894a: 4601 mov r1, r0
  100515. 802894c: 2a01 cmp r2, #1
  100516. 802894e: dc23 bgt.n 8028998 <_strtod_l+0x500>
  100517. 8028950: b108 cbz r0, 8028956 <_strtod_l+0x4be>
  100518. 8028952: ec5b ab17 vmov sl, fp, d7
  100519. 8028956: 4a2c ldr r2, [pc, #176] @ (8028a08 <_strtod_l+0x570>)
  100520. 8028958: 482c ldr r0, [pc, #176] @ (8028a0c <_strtod_l+0x574>)
  100521. 802895a: eb02 02c1 add.w r2, r2, r1, lsl #3
  100522. 802895e: ed92 7b00 vldr d7, [r2]
  100523. 8028962: f1ab 7b54 sub.w fp, fp, #55574528 @ 0x3500000
  100524. 8028966: ec4b ab16 vmov d6, sl, fp
  100525. 802896a: 4a29 ldr r2, [pc, #164] @ (8028a10 <_strtod_l+0x578>)
  100526. 802896c: ee27 7b06 vmul.f64 d7, d7, d6
  100527. 8028970: ee17 1a90 vmov r1, s15
  100528. 8028974: 400a ands r2, r1
  100529. 8028976: 4282 cmp r2, r0
  100530. 8028978: ec5b ab17 vmov sl, fp, d7
  100531. 802897c: d898 bhi.n 80288b0 <_strtod_l+0x418>
  100532. 802897e: f5a0 1080 sub.w r0, r0, #1048576 @ 0x100000
  100533. 8028982: 4282 cmp r2, r0
  100534. 8028984: bf86 itte hi
  100535. 8028986: f8df b08c ldrhi.w fp, [pc, #140] @ 8028a14 <_strtod_l+0x57c>
  100536. 802898a: f04f 3aff movhi.w sl, #4294967295 @ 0xffffffff
  100537. 802898e: f101 7b54 addls.w fp, r1, #55574528 @ 0x3500000
  100538. 8028992: 2200 movs r2, #0
  100539. 8028994: 9206 str r2, [sp, #24]
  100540. 8028996: e076 b.n 8028a86 <_strtod_l+0x5ee>
  100541. 8028998: f012 0f01 tst.w r2, #1
  100542. 802899c: d004 beq.n 80289a8 <_strtod_l+0x510>
  100543. 802899e: ed96 6b00 vldr d6, [r6]
  100544. 80289a2: 2001 movs r0, #1
  100545. 80289a4: ee27 7b06 vmul.f64 d7, d7, d6
  100546. 80289a8: 3101 adds r1, #1
  100547. 80289aa: 1052 asrs r2, r2, #1
  100548. 80289ac: 3608 adds r6, #8
  100549. 80289ae: e7cd b.n 802894c <_strtod_l+0x4b4>
  100550. 80289b0: d0ef beq.n 8028992 <_strtod_l+0x4fa>
  100551. 80289b2: 4252 negs r2, r2
  100552. 80289b4: f012 000f ands.w r0, r2, #15
  100553. 80289b8: d00a beq.n 80289d0 <_strtod_l+0x538>
  100554. 80289ba: 4912 ldr r1, [pc, #72] @ (8028a04 <_strtod_l+0x56c>)
  100555. 80289bc: eb01 01c0 add.w r1, r1, r0, lsl #3
  100556. 80289c0: ed91 7b00 vldr d7, [r1]
  100557. 80289c4: ec4b ab16 vmov d6, sl, fp
  100558. 80289c8: ee86 7b07 vdiv.f64 d7, d6, d7
  100559. 80289cc: ec5b ab17 vmov sl, fp, d7
  100560. 80289d0: 1112 asrs r2, r2, #4
  100561. 80289d2: d0de beq.n 8028992 <_strtod_l+0x4fa>
  100562. 80289d4: 2a1f cmp r2, #31
  100563. 80289d6: dd1f ble.n 8028a18 <_strtod_l+0x580>
  100564. 80289d8: 2400 movs r4, #0
  100565. 80289da: 4625 mov r5, r4
  100566. 80289dc: 9407 str r4, [sp, #28]
  100567. 80289de: 4626 mov r6, r4
  100568. 80289e0: 9a05 ldr r2, [sp, #20]
  100569. 80289e2: 2322 movs r3, #34 @ 0x22
  100570. 80289e4: f04f 0a00 mov.w sl, #0
  100571. 80289e8: f04f 0b00 mov.w fp, #0
  100572. 80289ec: 6013 str r3, [r2, #0]
  100573. 80289ee: e76a b.n 80288c6 <_strtod_l+0x42e>
  100574. 80289f0: 08030df6 .word 0x08030df6
  100575. 80289f4: 08030c98 .word 0x08030c98
  100576. 80289f8: 08030dee .word 0x08030dee
  100577. 80289fc: 08030e64 .word 0x08030e64
  100578. 8028a00: 08030e60 .word 0x08030e60
  100579. 8028a04: 08030fc8 .word 0x08030fc8
  100580. 8028a08: 08030fa0 .word 0x08030fa0
  100581. 8028a0c: 7ca00000 .word 0x7ca00000
  100582. 8028a10: 7ff00000 .word 0x7ff00000
  100583. 8028a14: 7fefffff .word 0x7fefffff
  100584. 8028a18: f012 0110 ands.w r1, r2, #16
  100585. 8028a1c: bf18 it ne
  100586. 8028a1e: 216a movne r1, #106 @ 0x6a
  100587. 8028a20: 9106 str r1, [sp, #24]
  100588. 8028a22: ec4b ab17 vmov d7, sl, fp
  100589. 8028a26: 49b0 ldr r1, [pc, #704] @ (8028ce8 <_strtod_l+0x850>)
  100590. 8028a28: 2000 movs r0, #0
  100591. 8028a2a: 07d6 lsls r6, r2, #31
  100592. 8028a2c: d504 bpl.n 8028a38 <_strtod_l+0x5a0>
  100593. 8028a2e: ed91 6b00 vldr d6, [r1]
  100594. 8028a32: 2001 movs r0, #1
  100595. 8028a34: ee27 7b06 vmul.f64 d7, d7, d6
  100596. 8028a38: 1052 asrs r2, r2, #1
  100597. 8028a3a: f101 0108 add.w r1, r1, #8
  100598. 8028a3e: d1f4 bne.n 8028a2a <_strtod_l+0x592>
  100599. 8028a40: b108 cbz r0, 8028a46 <_strtod_l+0x5ae>
  100600. 8028a42: ec5b ab17 vmov sl, fp, d7
  100601. 8028a46: 9a06 ldr r2, [sp, #24]
  100602. 8028a48: b1b2 cbz r2, 8028a78 <_strtod_l+0x5e0>
  100603. 8028a4a: f3cb 510a ubfx r1, fp, #20, #11
  100604. 8028a4e: f1c1 026b rsb r2, r1, #107 @ 0x6b
  100605. 8028a52: 2a00 cmp r2, #0
  100606. 8028a54: 4658 mov r0, fp
  100607. 8028a56: dd0f ble.n 8028a78 <_strtod_l+0x5e0>
  100608. 8028a58: 2a1f cmp r2, #31
  100609. 8028a5a: dd55 ble.n 8028b08 <_strtod_l+0x670>
  100610. 8028a5c: 2a34 cmp r2, #52 @ 0x34
  100611. 8028a5e: bfde ittt le
  100612. 8028a60: f04f 32ff movle.w r2, #4294967295 @ 0xffffffff
  100613. 8028a64: f1c1 014b rsble r1, r1, #75 @ 0x4b
  100614. 8028a68: 408a lslle r2, r1
  100615. 8028a6a: f04f 0a00 mov.w sl, #0
  100616. 8028a6e: bfcc ite gt
  100617. 8028a70: f04f 7b5c movgt.w fp, #57671680 @ 0x3700000
  100618. 8028a74: ea02 0b00 andle.w fp, r2, r0
  100619. 8028a78: ec4b ab17 vmov d7, sl, fp
  100620. 8028a7c: eeb5 7b40 vcmp.f64 d7, #0.0
  100621. 8028a80: eef1 fa10 vmrs APSR_nzcv, fpscr
  100622. 8028a84: d0a8 beq.n 80289d8 <_strtod_l+0x540>
  100623. 8028a86: 990a ldr r1, [sp, #40] @ 0x28
  100624. 8028a88: 9805 ldr r0, [sp, #20]
  100625. 8028a8a: f8cd 9000 str.w r9, [sp]
  100626. 8028a8e: 462a mov r2, r5
  100627. 8028a90: f002 fc7a bl 802b388 <__s2b>
  100628. 8028a94: 9007 str r0, [sp, #28]
  100629. 8028a96: 2800 cmp r0, #0
  100630. 8028a98: f43f af0a beq.w 80288b0 <_strtod_l+0x418>
  100631. 8028a9c: 9b09 ldr r3, [sp, #36] @ 0x24
  100632. 8028a9e: 1b3f subs r7, r7, r4
  100633. 8028aa0: 2b00 cmp r3, #0
  100634. 8028aa2: bfb4 ite lt
  100635. 8028aa4: 463b movlt r3, r7
  100636. 8028aa6: 2300 movge r3, #0
  100637. 8028aa8: 930a str r3, [sp, #40] @ 0x28
  100638. 8028aaa: 9b09 ldr r3, [sp, #36] @ 0x24
  100639. 8028aac: ed9f bb8a vldr d11, [pc, #552] @ 8028cd8 <_strtod_l+0x840>
  100640. 8028ab0: ea23 73e3 bic.w r3, r3, r3, asr #31
  100641. 8028ab4: 2400 movs r4, #0
  100642. 8028ab6: 930d str r3, [sp, #52] @ 0x34
  100643. 8028ab8: 4625 mov r5, r4
  100644. 8028aba: 9b07 ldr r3, [sp, #28]
  100645. 8028abc: 9805 ldr r0, [sp, #20]
  100646. 8028abe: 6859 ldr r1, [r3, #4]
  100647. 8028ac0: f002 fbba bl 802b238 <_Balloc>
  100648. 8028ac4: 4606 mov r6, r0
  100649. 8028ac6: 2800 cmp r0, #0
  100650. 8028ac8: f43f aef6 beq.w 80288b8 <_strtod_l+0x420>
  100651. 8028acc: 9b07 ldr r3, [sp, #28]
  100652. 8028ace: 691a ldr r2, [r3, #16]
  100653. 8028ad0: ec4b ab19 vmov d9, sl, fp
  100654. 8028ad4: 3202 adds r2, #2
  100655. 8028ad6: f103 010c add.w r1, r3, #12
  100656. 8028ada: 0092 lsls r2, r2, #2
  100657. 8028adc: 300c adds r0, #12
  100658. 8028ade: f001 f9fe bl 8029ede <memcpy>
  100659. 8028ae2: eeb0 0b49 vmov.f64 d0, d9
  100660. 8028ae6: 9805 ldr r0, [sp, #20]
  100661. 8028ae8: aa14 add r2, sp, #80 @ 0x50
  100662. 8028aea: a913 add r1, sp, #76 @ 0x4c
  100663. 8028aec: f002 ff88 bl 802ba00 <__d2b>
  100664. 8028af0: 9012 str r0, [sp, #72] @ 0x48
  100665. 8028af2: 2800 cmp r0, #0
  100666. 8028af4: f43f aee0 beq.w 80288b8 <_strtod_l+0x420>
  100667. 8028af8: 9805 ldr r0, [sp, #20]
  100668. 8028afa: 2101 movs r1, #1
  100669. 8028afc: f002 fcda bl 802b4b4 <__i2b>
  100670. 8028b00: 4605 mov r5, r0
  100671. 8028b02: b940 cbnz r0, 8028b16 <_strtod_l+0x67e>
  100672. 8028b04: 2500 movs r5, #0
  100673. 8028b06: e6d7 b.n 80288b8 <_strtod_l+0x420>
  100674. 8028b08: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  100675. 8028b0c: fa01 f202 lsl.w r2, r1, r2
  100676. 8028b10: ea02 0a0a and.w sl, r2, sl
  100677. 8028b14: e7b0 b.n 8028a78 <_strtod_l+0x5e0>
  100678. 8028b16: 9f13 ldr r7, [sp, #76] @ 0x4c
  100679. 8028b18: 9a14 ldr r2, [sp, #80] @ 0x50
  100680. 8028b1a: 2f00 cmp r7, #0
  100681. 8028b1c: bfab itete ge
  100682. 8028b1e: 9b0a ldrge r3, [sp, #40] @ 0x28
  100683. 8028b20: 9b0d ldrlt r3, [sp, #52] @ 0x34
  100684. 8028b22: f8dd 8034 ldrge.w r8, [sp, #52] @ 0x34
  100685. 8028b26: f8dd 9028 ldrlt.w r9, [sp, #40] @ 0x28
  100686. 8028b2a: bfac ite ge
  100687. 8028b2c: eb07 0903 addge.w r9, r7, r3
  100688. 8028b30: eba3 0807 sublt.w r8, r3, r7
  100689. 8028b34: 9b06 ldr r3, [sp, #24]
  100690. 8028b36: 1aff subs r7, r7, r3
  100691. 8028b38: 4417 add r7, r2
  100692. 8028b3a: f1c2 0336 rsb r3, r2, #54 @ 0x36
  100693. 8028b3e: 4a6b ldr r2, [pc, #428] @ (8028cec <_strtod_l+0x854>)
  100694. 8028b40: 3f01 subs r7, #1
  100695. 8028b42: 4297 cmp r7, r2
  100696. 8028b44: da51 bge.n 8028bea <_strtod_l+0x752>
  100697. 8028b46: 1bd1 subs r1, r2, r7
  100698. 8028b48: 291f cmp r1, #31
  100699. 8028b4a: eba3 0301 sub.w r3, r3, r1
  100700. 8028b4e: f04f 0201 mov.w r2, #1
  100701. 8028b52: dc3e bgt.n 8028bd2 <_strtod_l+0x73a>
  100702. 8028b54: 408a lsls r2, r1
  100703. 8028b56: 920c str r2, [sp, #48] @ 0x30
  100704. 8028b58: 2200 movs r2, #0
  100705. 8028b5a: 920b str r2, [sp, #44] @ 0x2c
  100706. 8028b5c: eb09 0703 add.w r7, r9, r3
  100707. 8028b60: 4498 add r8, r3
  100708. 8028b62: 9b06 ldr r3, [sp, #24]
  100709. 8028b64: 45b9 cmp r9, r7
  100710. 8028b66: 4498 add r8, r3
  100711. 8028b68: 464b mov r3, r9
  100712. 8028b6a: bfa8 it ge
  100713. 8028b6c: 463b movge r3, r7
  100714. 8028b6e: 4543 cmp r3, r8
  100715. 8028b70: bfa8 it ge
  100716. 8028b72: 4643 movge r3, r8
  100717. 8028b74: 2b00 cmp r3, #0
  100718. 8028b76: bfc2 ittt gt
  100719. 8028b78: 1aff subgt r7, r7, r3
  100720. 8028b7a: eba8 0803 subgt.w r8, r8, r3
  100721. 8028b7e: eba9 0903 subgt.w r9, r9, r3
  100722. 8028b82: 9b0a ldr r3, [sp, #40] @ 0x28
  100723. 8028b84: 2b00 cmp r3, #0
  100724. 8028b86: dd16 ble.n 8028bb6 <_strtod_l+0x71e>
  100725. 8028b88: 4629 mov r1, r5
  100726. 8028b8a: 9805 ldr r0, [sp, #20]
  100727. 8028b8c: 461a mov r2, r3
  100728. 8028b8e: f002 fd51 bl 802b634 <__pow5mult>
  100729. 8028b92: 4605 mov r5, r0
  100730. 8028b94: 2800 cmp r0, #0
  100731. 8028b96: d0b5 beq.n 8028b04 <_strtod_l+0x66c>
  100732. 8028b98: 4601 mov r1, r0
  100733. 8028b9a: 9a12 ldr r2, [sp, #72] @ 0x48
  100734. 8028b9c: 9805 ldr r0, [sp, #20]
  100735. 8028b9e: f002 fc9f bl 802b4e0 <__multiply>
  100736. 8028ba2: 900f str r0, [sp, #60] @ 0x3c
  100737. 8028ba4: 2800 cmp r0, #0
  100738. 8028ba6: f43f ae87 beq.w 80288b8 <_strtod_l+0x420>
  100739. 8028baa: 9912 ldr r1, [sp, #72] @ 0x48
  100740. 8028bac: 9805 ldr r0, [sp, #20]
  100741. 8028bae: f002 fb83 bl 802b2b8 <_Bfree>
  100742. 8028bb2: 9b0f ldr r3, [sp, #60] @ 0x3c
  100743. 8028bb4: 9312 str r3, [sp, #72] @ 0x48
  100744. 8028bb6: 2f00 cmp r7, #0
  100745. 8028bb8: dc1b bgt.n 8028bf2 <_strtod_l+0x75a>
  100746. 8028bba: 9b09 ldr r3, [sp, #36] @ 0x24
  100747. 8028bbc: 2b00 cmp r3, #0
  100748. 8028bbe: dd21 ble.n 8028c04 <_strtod_l+0x76c>
  100749. 8028bc0: 4631 mov r1, r6
  100750. 8028bc2: 9a0d ldr r2, [sp, #52] @ 0x34
  100751. 8028bc4: 9805 ldr r0, [sp, #20]
  100752. 8028bc6: f002 fd35 bl 802b634 <__pow5mult>
  100753. 8028bca: 4606 mov r6, r0
  100754. 8028bcc: b9d0 cbnz r0, 8028c04 <_strtod_l+0x76c>
  100755. 8028bce: 2600 movs r6, #0
  100756. 8028bd0: e672 b.n 80288b8 <_strtod_l+0x420>
  100757. 8028bd2: f1c7 477f rsb r7, r7, #4278190080 @ 0xff000000
  100758. 8028bd6: f507 077f add.w r7, r7, #16711680 @ 0xff0000
  100759. 8028bda: f507 477b add.w r7, r7, #64256 @ 0xfb00
  100760. 8028bde: 37e2 adds r7, #226 @ 0xe2
  100761. 8028be0: fa02 f107 lsl.w r1, r2, r7
  100762. 8028be4: 910b str r1, [sp, #44] @ 0x2c
  100763. 8028be6: 920c str r2, [sp, #48] @ 0x30
  100764. 8028be8: e7b8 b.n 8028b5c <_strtod_l+0x6c4>
  100765. 8028bea: 2200 movs r2, #0
  100766. 8028bec: 920b str r2, [sp, #44] @ 0x2c
  100767. 8028bee: 2201 movs r2, #1
  100768. 8028bf0: e7f9 b.n 8028be6 <_strtod_l+0x74e>
  100769. 8028bf2: 9912 ldr r1, [sp, #72] @ 0x48
  100770. 8028bf4: 9805 ldr r0, [sp, #20]
  100771. 8028bf6: 463a mov r2, r7
  100772. 8028bf8: f002 fd76 bl 802b6e8 <__lshift>
  100773. 8028bfc: 9012 str r0, [sp, #72] @ 0x48
  100774. 8028bfe: 2800 cmp r0, #0
  100775. 8028c00: d1db bne.n 8028bba <_strtod_l+0x722>
  100776. 8028c02: e659 b.n 80288b8 <_strtod_l+0x420>
  100777. 8028c04: f1b8 0f00 cmp.w r8, #0
  100778. 8028c08: dd07 ble.n 8028c1a <_strtod_l+0x782>
  100779. 8028c0a: 4631 mov r1, r6
  100780. 8028c0c: 9805 ldr r0, [sp, #20]
  100781. 8028c0e: 4642 mov r2, r8
  100782. 8028c10: f002 fd6a bl 802b6e8 <__lshift>
  100783. 8028c14: 4606 mov r6, r0
  100784. 8028c16: 2800 cmp r0, #0
  100785. 8028c18: d0d9 beq.n 8028bce <_strtod_l+0x736>
  100786. 8028c1a: f1b9 0f00 cmp.w r9, #0
  100787. 8028c1e: dd08 ble.n 8028c32 <_strtod_l+0x79a>
  100788. 8028c20: 4629 mov r1, r5
  100789. 8028c22: 9805 ldr r0, [sp, #20]
  100790. 8028c24: 464a mov r2, r9
  100791. 8028c26: f002 fd5f bl 802b6e8 <__lshift>
  100792. 8028c2a: 4605 mov r5, r0
  100793. 8028c2c: 2800 cmp r0, #0
  100794. 8028c2e: f43f ae43 beq.w 80288b8 <_strtod_l+0x420>
  100795. 8028c32: 9912 ldr r1, [sp, #72] @ 0x48
  100796. 8028c34: 9805 ldr r0, [sp, #20]
  100797. 8028c36: 4632 mov r2, r6
  100798. 8028c38: f002 fdde bl 802b7f8 <__mdiff>
  100799. 8028c3c: 4604 mov r4, r0
  100800. 8028c3e: 2800 cmp r0, #0
  100801. 8028c40: f43f ae3a beq.w 80288b8 <_strtod_l+0x420>
  100802. 8028c44: 2300 movs r3, #0
  100803. 8028c46: f8d0 800c ldr.w r8, [r0, #12]
  100804. 8028c4a: 60c3 str r3, [r0, #12]
  100805. 8028c4c: 4629 mov r1, r5
  100806. 8028c4e: f002 fdb7 bl 802b7c0 <__mcmp>
  100807. 8028c52: 2800 cmp r0, #0
  100808. 8028c54: da4e bge.n 8028cf4 <_strtod_l+0x85c>
  100809. 8028c56: ea58 080a orrs.w r8, r8, sl
  100810. 8028c5a: d174 bne.n 8028d46 <_strtod_l+0x8ae>
  100811. 8028c5c: f3cb 0313 ubfx r3, fp, #0, #20
  100812. 8028c60: 2b00 cmp r3, #0
  100813. 8028c62: d170 bne.n 8028d46 <_strtod_l+0x8ae>
  100814. 8028c64: f02b 4300 bic.w r3, fp, #2147483648 @ 0x80000000
  100815. 8028c68: 0d1b lsrs r3, r3, #20
  100816. 8028c6a: 051b lsls r3, r3, #20
  100817. 8028c6c: f1b3 6fd6 cmp.w r3, #112197632 @ 0x6b00000
  100818. 8028c70: d969 bls.n 8028d46 <_strtod_l+0x8ae>
  100819. 8028c72: 6963 ldr r3, [r4, #20]
  100820. 8028c74: b913 cbnz r3, 8028c7c <_strtod_l+0x7e4>
  100821. 8028c76: 6923 ldr r3, [r4, #16]
  100822. 8028c78: 2b01 cmp r3, #1
  100823. 8028c7a: dd64 ble.n 8028d46 <_strtod_l+0x8ae>
  100824. 8028c7c: 4621 mov r1, r4
  100825. 8028c7e: 2201 movs r2, #1
  100826. 8028c80: 9805 ldr r0, [sp, #20]
  100827. 8028c82: f002 fd31 bl 802b6e8 <__lshift>
  100828. 8028c86: 4629 mov r1, r5
  100829. 8028c88: 4604 mov r4, r0
  100830. 8028c8a: f002 fd99 bl 802b7c0 <__mcmp>
  100831. 8028c8e: 2800 cmp r0, #0
  100832. 8028c90: dd59 ble.n 8028d46 <_strtod_l+0x8ae>
  100833. 8028c92: f02b 4300 bic.w r3, fp, #2147483648 @ 0x80000000
  100834. 8028c96: 9a06 ldr r2, [sp, #24]
  100835. 8028c98: 0d1b lsrs r3, r3, #20
  100836. 8028c9a: 051b lsls r3, r3, #20
  100837. 8028c9c: 2a00 cmp r2, #0
  100838. 8028c9e: d070 beq.n 8028d82 <_strtod_l+0x8ea>
  100839. 8028ca0: f1b3 6fd6 cmp.w r3, #112197632 @ 0x6b00000
  100840. 8028ca4: d86d bhi.n 8028d82 <_strtod_l+0x8ea>
  100841. 8028ca6: f1b3 7f5c cmp.w r3, #57671680 @ 0x3700000
  100842. 8028caa: f67f ae99 bls.w 80289e0 <_strtod_l+0x548>
  100843. 8028cae: ed9f 7b0c vldr d7, [pc, #48] @ 8028ce0 <_strtod_l+0x848>
  100844. 8028cb2: ec4b ab16 vmov d6, sl, fp
  100845. 8028cb6: 4b0e ldr r3, [pc, #56] @ (8028cf0 <_strtod_l+0x858>)
  100846. 8028cb8: ee26 7b07 vmul.f64 d7, d6, d7
  100847. 8028cbc: ee17 2a90 vmov r2, s15
  100848. 8028cc0: 4013 ands r3, r2
  100849. 8028cc2: ec5b ab17 vmov sl, fp, d7
  100850. 8028cc6: 2b00 cmp r3, #0
  100851. 8028cc8: f47f ae01 bne.w 80288ce <_strtod_l+0x436>
  100852. 8028ccc: 9a05 ldr r2, [sp, #20]
  100853. 8028cce: 2322 movs r3, #34 @ 0x22
  100854. 8028cd0: 6013 str r3, [r2, #0]
  100855. 8028cd2: e5fc b.n 80288ce <_strtod_l+0x436>
  100856. 8028cd4: f3af 8000 nop.w
  100857. 8028cd8: ffc00000 .word 0xffc00000
  100858. 8028cdc: 41dfffff .word 0x41dfffff
  100859. 8028ce0: 00000000 .word 0x00000000
  100860. 8028ce4: 39500000 .word 0x39500000
  100861. 8028ce8: 08030cc0 .word 0x08030cc0
  100862. 8028cec: fffffc02 .word 0xfffffc02
  100863. 8028cf0: 7ff00000 .word 0x7ff00000
  100864. 8028cf4: 46d9 mov r9, fp
  100865. 8028cf6: d15d bne.n 8028db4 <_strtod_l+0x91c>
  100866. 8028cf8: f3cb 0313 ubfx r3, fp, #0, #20
  100867. 8028cfc: f1b8 0f00 cmp.w r8, #0
  100868. 8028d00: d02a beq.n 8028d58 <_strtod_l+0x8c0>
  100869. 8028d02: 4aab ldr r2, [pc, #684] @ (8028fb0 <_strtod_l+0xb18>)
  100870. 8028d04: 4293 cmp r3, r2
  100871. 8028d06: d12a bne.n 8028d5e <_strtod_l+0x8c6>
  100872. 8028d08: 9b06 ldr r3, [sp, #24]
  100873. 8028d0a: 4652 mov r2, sl
  100874. 8028d0c: b1fb cbz r3, 8028d4e <_strtod_l+0x8b6>
  100875. 8028d0e: 4ba9 ldr r3, [pc, #676] @ (8028fb4 <_strtod_l+0xb1c>)
  100876. 8028d10: ea0b 0303 and.w r3, fp, r3
  100877. 8028d14: f1b3 6fd4 cmp.w r3, #111149056 @ 0x6a00000
  100878. 8028d18: f04f 31ff mov.w r1, #4294967295 @ 0xffffffff
  100879. 8028d1c: d81a bhi.n 8028d54 <_strtod_l+0x8bc>
  100880. 8028d1e: 0d1b lsrs r3, r3, #20
  100881. 8028d20: f1c3 036b rsb r3, r3, #107 @ 0x6b
  100882. 8028d24: fa01 f303 lsl.w r3, r1, r3
  100883. 8028d28: 429a cmp r2, r3
  100884. 8028d2a: d118 bne.n 8028d5e <_strtod_l+0x8c6>
  100885. 8028d2c: 4ba2 ldr r3, [pc, #648] @ (8028fb8 <_strtod_l+0xb20>)
  100886. 8028d2e: 4599 cmp r9, r3
  100887. 8028d30: d102 bne.n 8028d38 <_strtod_l+0x8a0>
  100888. 8028d32: 3201 adds r2, #1
  100889. 8028d34: f43f adc0 beq.w 80288b8 <_strtod_l+0x420>
  100890. 8028d38: 4b9e ldr r3, [pc, #632] @ (8028fb4 <_strtod_l+0xb1c>)
  100891. 8028d3a: ea09 0303 and.w r3, r9, r3
  100892. 8028d3e: f503 1b80 add.w fp, r3, #1048576 @ 0x100000
  100893. 8028d42: f04f 0a00 mov.w sl, #0
  100894. 8028d46: 9b06 ldr r3, [sp, #24]
  100895. 8028d48: 2b00 cmp r3, #0
  100896. 8028d4a: d1b0 bne.n 8028cae <_strtod_l+0x816>
  100897. 8028d4c: e5bf b.n 80288ce <_strtod_l+0x436>
  100898. 8028d4e: f04f 33ff mov.w r3, #4294967295 @ 0xffffffff
  100899. 8028d52: e7e9 b.n 8028d28 <_strtod_l+0x890>
  100900. 8028d54: 460b mov r3, r1
  100901. 8028d56: e7e7 b.n 8028d28 <_strtod_l+0x890>
  100902. 8028d58: ea53 030a orrs.w r3, r3, sl
  100903. 8028d5c: d099 beq.n 8028c92 <_strtod_l+0x7fa>
  100904. 8028d5e: 9b0b ldr r3, [sp, #44] @ 0x2c
  100905. 8028d60: b1c3 cbz r3, 8028d94 <_strtod_l+0x8fc>
  100906. 8028d62: ea13 0f09 tst.w r3, r9
  100907. 8028d66: d0ee beq.n 8028d46 <_strtod_l+0x8ae>
  100908. 8028d68: 9a06 ldr r2, [sp, #24]
  100909. 8028d6a: 4650 mov r0, sl
  100910. 8028d6c: 4659 mov r1, fp
  100911. 8028d6e: f1b8 0f00 cmp.w r8, #0
  100912. 8028d72: d013 beq.n 8028d9c <_strtod_l+0x904>
  100913. 8028d74: f7ff fb74 bl 8028460 <sulp>
  100914. 8028d78: ee39 7b00 vadd.f64 d7, d9, d0
  100915. 8028d7c: ec5b ab17 vmov sl, fp, d7
  100916. 8028d80: e7e1 b.n 8028d46 <_strtod_l+0x8ae>
  100917. 8028d82: f5a3 1380 sub.w r3, r3, #1048576 @ 0x100000
  100918. 8028d86: ea6f 5b13 mvn.w fp, r3, lsr #20
  100919. 8028d8a: ea6f 5b0b mvn.w fp, fp, lsl #20
  100920. 8028d8e: f04f 3aff mov.w sl, #4294967295 @ 0xffffffff
  100921. 8028d92: e7d8 b.n 8028d46 <_strtod_l+0x8ae>
  100922. 8028d94: 9b0c ldr r3, [sp, #48] @ 0x30
  100923. 8028d96: ea13 0f0a tst.w r3, sl
  100924. 8028d9a: e7e4 b.n 8028d66 <_strtod_l+0x8ce>
  100925. 8028d9c: f7ff fb60 bl 8028460 <sulp>
  100926. 8028da0: ee39 0b40 vsub.f64 d0, d9, d0
  100927. 8028da4: eeb5 0b40 vcmp.f64 d0, #0.0
  100928. 8028da8: eef1 fa10 vmrs APSR_nzcv, fpscr
  100929. 8028dac: ec5b ab10 vmov sl, fp, d0
  100930. 8028db0: d1c9 bne.n 8028d46 <_strtod_l+0x8ae>
  100931. 8028db2: e615 b.n 80289e0 <_strtod_l+0x548>
  100932. 8028db4: 4629 mov r1, r5
  100933. 8028db6: 4620 mov r0, r4
  100934. 8028db8: f002 fe7a bl 802bab0 <__ratio>
  100935. 8028dbc: eeb0 7b00 vmov.f64 d7, #0 @ 0x40000000 2.0
  100936. 8028dc0: eeb4 0bc7 vcmpe.f64 d0, d7
  100937. 8028dc4: eef1 fa10 vmrs APSR_nzcv, fpscr
  100938. 8028dc8: d85d bhi.n 8028e86 <_strtod_l+0x9ee>
  100939. 8028dca: f1b8 0f00 cmp.w r8, #0
  100940. 8028dce: d164 bne.n 8028e9a <_strtod_l+0xa02>
  100941. 8028dd0: f1ba 0f00 cmp.w sl, #0
  100942. 8028dd4: d14b bne.n 8028e6e <_strtod_l+0x9d6>
  100943. 8028dd6: f3cb 0313 ubfx r3, fp, #0, #20
  100944. 8028dda: eeb7 8b00 vmov.f64 d8, #112 @ 0x3f800000 1.0
  100945. 8028dde: 2b00 cmp r3, #0
  100946. 8028de0: d160 bne.n 8028ea4 <_strtod_l+0xa0c>
  100947. 8028de2: eeb4 0bc8 vcmpe.f64 d0, d8
  100948. 8028de6: eeb6 8b00 vmov.f64 d8, #96 @ 0x3f000000 0.5
  100949. 8028dea: eef1 fa10 vmrs APSR_nzcv, fpscr
  100950. 8028dee: d401 bmi.n 8028df4 <_strtod_l+0x95c>
  100951. 8028df0: ee20 8b08 vmul.f64 d8, d0, d8
  100952. 8028df4: eeb1 ab48 vneg.f64 d10, d8
  100953. 8028df8: 486e ldr r0, [pc, #440] @ (8028fb4 <_strtod_l+0xb1c>)
  100954. 8028dfa: 4970 ldr r1, [pc, #448] @ (8028fbc <_strtod_l+0xb24>)
  100955. 8028dfc: ea09 0700 and.w r7, r9, r0
  100956. 8028e00: 428f cmp r7, r1
  100957. 8028e02: ec53 2b1a vmov r2, r3, d10
  100958. 8028e06: d17d bne.n 8028f04 <_strtod_l+0xa6c>
  100959. 8028e08: f1a9 7b54 sub.w fp, r9, #55574528 @ 0x3500000
  100960. 8028e0c: ec4b ab1c vmov d12, sl, fp
  100961. 8028e10: eeb0 0b4c vmov.f64 d0, d12
  100962. 8028e14: f002 fd84 bl 802b920 <__ulp>
  100963. 8028e18: 4866 ldr r0, [pc, #408] @ (8028fb4 <_strtod_l+0xb1c>)
  100964. 8028e1a: eea0 cb0a vfma.f64 d12, d0, d10
  100965. 8028e1e: ee1c 3a90 vmov r3, s25
  100966. 8028e22: 4a67 ldr r2, [pc, #412] @ (8028fc0 <_strtod_l+0xb28>)
  100967. 8028e24: ea03 0100 and.w r1, r3, r0
  100968. 8028e28: 4291 cmp r1, r2
  100969. 8028e2a: ec5b ab1c vmov sl, fp, d12
  100970. 8028e2e: d93c bls.n 8028eaa <_strtod_l+0xa12>
  100971. 8028e30: ee19 2a90 vmov r2, s19
  100972. 8028e34: 4b60 ldr r3, [pc, #384] @ (8028fb8 <_strtod_l+0xb20>)
  100973. 8028e36: 429a cmp r2, r3
  100974. 8028e38: d104 bne.n 8028e44 <_strtod_l+0x9ac>
  100975. 8028e3a: ee19 3a10 vmov r3, s18
  100976. 8028e3e: 3301 adds r3, #1
  100977. 8028e40: f43f ad3a beq.w 80288b8 <_strtod_l+0x420>
  100978. 8028e44: f8df b170 ldr.w fp, [pc, #368] @ 8028fb8 <_strtod_l+0xb20>
  100979. 8028e48: f04f 3aff mov.w sl, #4294967295 @ 0xffffffff
  100980. 8028e4c: 9912 ldr r1, [sp, #72] @ 0x48
  100981. 8028e4e: 9805 ldr r0, [sp, #20]
  100982. 8028e50: f002 fa32 bl 802b2b8 <_Bfree>
  100983. 8028e54: 9805 ldr r0, [sp, #20]
  100984. 8028e56: 4631 mov r1, r6
  100985. 8028e58: f002 fa2e bl 802b2b8 <_Bfree>
  100986. 8028e5c: 9805 ldr r0, [sp, #20]
  100987. 8028e5e: 4629 mov r1, r5
  100988. 8028e60: f002 fa2a bl 802b2b8 <_Bfree>
  100989. 8028e64: 9805 ldr r0, [sp, #20]
  100990. 8028e66: 4621 mov r1, r4
  100991. 8028e68: f002 fa26 bl 802b2b8 <_Bfree>
  100992. 8028e6c: e625 b.n 8028aba <_strtod_l+0x622>
  100993. 8028e6e: f1ba 0f01 cmp.w sl, #1
  100994. 8028e72: d103 bne.n 8028e7c <_strtod_l+0x9e4>
  100995. 8028e74: f1bb 0f00 cmp.w fp, #0
  100996. 8028e78: f43f adb2 beq.w 80289e0 <_strtod_l+0x548>
  100997. 8028e7c: eebf ab00 vmov.f64 d10, #240 @ 0xbf800000 -1.0
  100998. 8028e80: eeb7 8b00 vmov.f64 d8, #112 @ 0x3f800000 1.0
  100999. 8028e84: e7b8 b.n 8028df8 <_strtod_l+0x960>
  101000. 8028e86: eeb6 8b00 vmov.f64 d8, #96 @ 0x3f000000 0.5
  101001. 8028e8a: ee20 8b08 vmul.f64 d8, d0, d8
  101002. 8028e8e: f1b8 0f00 cmp.w r8, #0
  101003. 8028e92: d0af beq.n 8028df4 <_strtod_l+0x95c>
  101004. 8028e94: eeb0 ab48 vmov.f64 d10, d8
  101005. 8028e98: e7ae b.n 8028df8 <_strtod_l+0x960>
  101006. 8028e9a: eeb7 ab00 vmov.f64 d10, #112 @ 0x3f800000 1.0
  101007. 8028e9e: eeb0 8b4a vmov.f64 d8, d10
  101008. 8028ea2: e7a9 b.n 8028df8 <_strtod_l+0x960>
  101009. 8028ea4: eebf ab00 vmov.f64 d10, #240 @ 0xbf800000 -1.0
  101010. 8028ea8: e7a6 b.n 8028df8 <_strtod_l+0x960>
  101011. 8028eaa: f103 7b54 add.w fp, r3, #55574528 @ 0x3500000
  101012. 8028eae: 9b06 ldr r3, [sp, #24]
  101013. 8028eb0: 46d9 mov r9, fp
  101014. 8028eb2: 2b00 cmp r3, #0
  101015. 8028eb4: d1ca bne.n 8028e4c <_strtod_l+0x9b4>
  101016. 8028eb6: f02b 4300 bic.w r3, fp, #2147483648 @ 0x80000000
  101017. 8028eba: 0d1b lsrs r3, r3, #20
  101018. 8028ebc: 051b lsls r3, r3, #20
  101019. 8028ebe: 429f cmp r7, r3
  101020. 8028ec0: d1c4 bne.n 8028e4c <_strtod_l+0x9b4>
  101021. 8028ec2: ec51 0b18 vmov r0, r1, d8
  101022. 8028ec6: f7d7 fc47 bl 8000758 <__aeabi_d2lz>
  101023. 8028eca: f7d7 fbff bl 80006cc <__aeabi_l2d>
  101024. 8028ece: f3cb 0913 ubfx r9, fp, #0, #20
  101025. 8028ed2: ec41 0b17 vmov d7, r0, r1
  101026. 8028ed6: ea49 090a orr.w r9, r9, sl
  101027. 8028eda: ea59 0908 orrs.w r9, r9, r8
  101028. 8028ede: ee38 8b47 vsub.f64 d8, d8, d7
  101029. 8028ee2: d03c beq.n 8028f5e <_strtod_l+0xac6>
  101030. 8028ee4: ed9f 7b2c vldr d7, [pc, #176] @ 8028f98 <_strtod_l+0xb00>
  101031. 8028ee8: eeb4 8bc7 vcmpe.f64 d8, d7
  101032. 8028eec: eef1 fa10 vmrs APSR_nzcv, fpscr
  101033. 8028ef0: f53f aced bmi.w 80288ce <_strtod_l+0x436>
  101034. 8028ef4: ed9f 7b2a vldr d7, [pc, #168] @ 8028fa0 <_strtod_l+0xb08>
  101035. 8028ef8: eeb4 8bc7 vcmpe.f64 d8, d7
  101036. 8028efc: eef1 fa10 vmrs APSR_nzcv, fpscr
  101037. 8028f00: dda4 ble.n 8028e4c <_strtod_l+0x9b4>
  101038. 8028f02: e4e4 b.n 80288ce <_strtod_l+0x436>
  101039. 8028f04: 9906 ldr r1, [sp, #24]
  101040. 8028f06: b1e1 cbz r1, 8028f42 <_strtod_l+0xaaa>
  101041. 8028f08: f1b7 6fd4 cmp.w r7, #111149056 @ 0x6a00000
  101042. 8028f0c: d819 bhi.n 8028f42 <_strtod_l+0xaaa>
  101043. 8028f0e: eeb4 8bcb vcmpe.f64 d8, d11
  101044. 8028f12: eef1 fa10 vmrs APSR_nzcv, fpscr
  101045. 8028f16: d811 bhi.n 8028f3c <_strtod_l+0xaa4>
  101046. 8028f18: eebc 8bc8 vcvt.u32.f64 s16, d8
  101047. 8028f1c: ee18 3a10 vmov r3, s16
  101048. 8028f20: 2b01 cmp r3, #1
  101049. 8028f22: bf38 it cc
  101050. 8028f24: 2301 movcc r3, #1
  101051. 8028f26: ee08 3a10 vmov s16, r3
  101052. 8028f2a: eeb8 8b48 vcvt.f64.u32 d8, s16
  101053. 8028f2e: f1b8 0f00 cmp.w r8, #0
  101054. 8028f32: d111 bne.n 8028f58 <_strtod_l+0xac0>
  101055. 8028f34: eeb1 7b48 vneg.f64 d7, d8
  101056. 8028f38: ec53 2b17 vmov r2, r3, d7
  101057. 8028f3c: f103 61d6 add.w r1, r3, #112197632 @ 0x6b00000
  101058. 8028f40: 1bcb subs r3, r1, r7
  101059. 8028f42: eeb0 0b49 vmov.f64 d0, d9
  101060. 8028f46: ec43 2b1a vmov d10, r2, r3
  101061. 8028f4a: f002 fce9 bl 802b920 <__ulp>
  101062. 8028f4e: eeaa 9b00 vfma.f64 d9, d10, d0
  101063. 8028f52: ec5b ab19 vmov sl, fp, d9
  101064. 8028f56: e7aa b.n 8028eae <_strtod_l+0xa16>
  101065. 8028f58: eeb0 7b48 vmov.f64 d7, d8
  101066. 8028f5c: e7ec b.n 8028f38 <_strtod_l+0xaa0>
  101067. 8028f5e: ed9f 7b12 vldr d7, [pc, #72] @ 8028fa8 <_strtod_l+0xb10>
  101068. 8028f62: eeb4 8bc7 vcmpe.f64 d8, d7
  101069. 8028f66: eef1 fa10 vmrs APSR_nzcv, fpscr
  101070. 8028f6a: f57f af6f bpl.w 8028e4c <_strtod_l+0x9b4>
  101071. 8028f6e: e4ae b.n 80288ce <_strtod_l+0x436>
  101072. 8028f70: 2300 movs r3, #0
  101073. 8028f72: 9308 str r3, [sp, #32]
  101074. 8028f74: 9a0e ldr r2, [sp, #56] @ 0x38
  101075. 8028f76: 9b11 ldr r3, [sp, #68] @ 0x44
  101076. 8028f78: 6013 str r3, [r2, #0]
  101077. 8028f7a: f7ff bacc b.w 8028516 <_strtod_l+0x7e>
  101078. 8028f7e: 2a65 cmp r2, #101 @ 0x65
  101079. 8028f80: f43f abbc beq.w 80286fc <_strtod_l+0x264>
  101080. 8028f84: 2a45 cmp r2, #69 @ 0x45
  101081. 8028f86: f43f abb9 beq.w 80286fc <_strtod_l+0x264>
  101082. 8028f8a: 2301 movs r3, #1
  101083. 8028f8c: 9306 str r3, [sp, #24]
  101084. 8028f8e: f7ff bbf0 b.w 8028772 <_strtod_l+0x2da>
  101085. 8028f92: bf00 nop
  101086. 8028f94: f3af 8000 nop.w
  101087. 8028f98: 94a03595 .word 0x94a03595
  101088. 8028f9c: 3fdfffff .word 0x3fdfffff
  101089. 8028fa0: 35afe535 .word 0x35afe535
  101090. 8028fa4: 3fe00000 .word 0x3fe00000
  101091. 8028fa8: 94a03595 .word 0x94a03595
  101092. 8028fac: 3fcfffff .word 0x3fcfffff
  101093. 8028fb0: 000fffff .word 0x000fffff
  101094. 8028fb4: 7ff00000 .word 0x7ff00000
  101095. 8028fb8: 7fefffff .word 0x7fefffff
  101096. 8028fbc: 7fe00000 .word 0x7fe00000
  101097. 8028fc0: 7c9fffff .word 0x7c9fffff
  101098. 08028fc4 <strtod>:
  101099. 8028fc4: 460a mov r2, r1
  101100. 8028fc6: 4601 mov r1, r0
  101101. 8028fc8: 4802 ldr r0, [pc, #8] @ (8028fd4 <strtod+0x10>)
  101102. 8028fca: 4b03 ldr r3, [pc, #12] @ (8028fd8 <strtod+0x14>)
  101103. 8028fcc: 6800 ldr r0, [r0, #0]
  101104. 8028fce: f7ff ba63 b.w 8028498 <_strtod_l>
  101105. 8028fd2: bf00 nop
  101106. 8028fd4: 240001d4 .word 0x240001d4
  101107. 8028fd8: 24000068 .word 0x24000068
  101108. 08028fdc <__cvt>:
  101109. 8028fdc: b5f0 push {r4, r5, r6, r7, lr}
  101110. 8028fde: ed2d 8b02 vpush {d8}
  101111. 8028fe2: eeb0 8b40 vmov.f64 d8, d0
  101112. 8028fe6: b085 sub sp, #20
  101113. 8028fe8: 4617 mov r7, r2
  101114. 8028fea: 9d0d ldr r5, [sp, #52] @ 0x34
  101115. 8028fec: 9e0c ldr r6, [sp, #48] @ 0x30
  101116. 8028fee: ee18 2a90 vmov r2, s17
  101117. 8028ff2: f025 0520 bic.w r5, r5, #32
  101118. 8028ff6: 2a00 cmp r2, #0
  101119. 8028ff8: bfb6 itet lt
  101120. 8028ffa: 222d movlt r2, #45 @ 0x2d
  101121. 8028ffc: 2200 movge r2, #0
  101122. 8028ffe: eeb1 8b40 vneglt.f64 d8, d0
  101123. 8029002: 2d46 cmp r5, #70 @ 0x46
  101124. 8029004: 460c mov r4, r1
  101125. 8029006: 701a strb r2, [r3, #0]
  101126. 8029008: d004 beq.n 8029014 <__cvt+0x38>
  101127. 802900a: 2d45 cmp r5, #69 @ 0x45
  101128. 802900c: d100 bne.n 8029010 <__cvt+0x34>
  101129. 802900e: 3401 adds r4, #1
  101130. 8029010: 2102 movs r1, #2
  101131. 8029012: e000 b.n 8029016 <__cvt+0x3a>
  101132. 8029014: 2103 movs r1, #3
  101133. 8029016: ab03 add r3, sp, #12
  101134. 8029018: 9301 str r3, [sp, #4]
  101135. 802901a: ab02 add r3, sp, #8
  101136. 802901c: 9300 str r3, [sp, #0]
  101137. 802901e: 4622 mov r2, r4
  101138. 8029020: 4633 mov r3, r6
  101139. 8029022: eeb0 0b48 vmov.f64 d0, d8
  101140. 8029026: f001 f81b bl 802a060 <_dtoa_r>
  101141. 802902a: 2d47 cmp r5, #71 @ 0x47
  101142. 802902c: d114 bne.n 8029058 <__cvt+0x7c>
  101143. 802902e: 07fb lsls r3, r7, #31
  101144. 8029030: d50a bpl.n 8029048 <__cvt+0x6c>
  101145. 8029032: 1902 adds r2, r0, r4
  101146. 8029034: eeb5 8b40 vcmp.f64 d8, #0.0
  101147. 8029038: eef1 fa10 vmrs APSR_nzcv, fpscr
  101148. 802903c: bf08 it eq
  101149. 802903e: 9203 streq r2, [sp, #12]
  101150. 8029040: 2130 movs r1, #48 @ 0x30
  101151. 8029042: 9b03 ldr r3, [sp, #12]
  101152. 8029044: 4293 cmp r3, r2
  101153. 8029046: d319 bcc.n 802907c <__cvt+0xa0>
  101154. 8029048: 9b03 ldr r3, [sp, #12]
  101155. 802904a: 9a0e ldr r2, [sp, #56] @ 0x38
  101156. 802904c: 1a1b subs r3, r3, r0
  101157. 802904e: 6013 str r3, [r2, #0]
  101158. 8029050: b005 add sp, #20
  101159. 8029052: ecbd 8b02 vpop {d8}
  101160. 8029056: bdf0 pop {r4, r5, r6, r7, pc}
  101161. 8029058: 2d46 cmp r5, #70 @ 0x46
  101162. 802905a: eb00 0204 add.w r2, r0, r4
  101163. 802905e: d1e9 bne.n 8029034 <__cvt+0x58>
  101164. 8029060: 7803 ldrb r3, [r0, #0]
  101165. 8029062: 2b30 cmp r3, #48 @ 0x30
  101166. 8029064: d107 bne.n 8029076 <__cvt+0x9a>
  101167. 8029066: eeb5 8b40 vcmp.f64 d8, #0.0
  101168. 802906a: eef1 fa10 vmrs APSR_nzcv, fpscr
  101169. 802906e: bf1c itt ne
  101170. 8029070: f1c4 0401 rsbne r4, r4, #1
  101171. 8029074: 6034 strne r4, [r6, #0]
  101172. 8029076: 6833 ldr r3, [r6, #0]
  101173. 8029078: 441a add r2, r3
  101174. 802907a: e7db b.n 8029034 <__cvt+0x58>
  101175. 802907c: 1c5c adds r4, r3, #1
  101176. 802907e: 9403 str r4, [sp, #12]
  101177. 8029080: 7019 strb r1, [r3, #0]
  101178. 8029082: e7de b.n 8029042 <__cvt+0x66>
  101179. 08029084 <__exponent>:
  101180. 8029084: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  101181. 8029086: 2900 cmp r1, #0
  101182. 8029088: bfba itte lt
  101183. 802908a: 4249 neglt r1, r1
  101184. 802908c: 232d movlt r3, #45 @ 0x2d
  101185. 802908e: 232b movge r3, #43 @ 0x2b
  101186. 8029090: 2909 cmp r1, #9
  101187. 8029092: 7002 strb r2, [r0, #0]
  101188. 8029094: 7043 strb r3, [r0, #1]
  101189. 8029096: dd29 ble.n 80290ec <__exponent+0x68>
  101190. 8029098: f10d 0307 add.w r3, sp, #7
  101191. 802909c: 461d mov r5, r3
  101192. 802909e: 270a movs r7, #10
  101193. 80290a0: 461a mov r2, r3
  101194. 80290a2: fbb1 f6f7 udiv r6, r1, r7
  101195. 80290a6: fb07 1416 mls r4, r7, r6, r1
  101196. 80290aa: 3430 adds r4, #48 @ 0x30
  101197. 80290ac: f802 4c01 strb.w r4, [r2, #-1]
  101198. 80290b0: 460c mov r4, r1
  101199. 80290b2: 2c63 cmp r4, #99 @ 0x63
  101200. 80290b4: f103 33ff add.w r3, r3, #4294967295 @ 0xffffffff
  101201. 80290b8: 4631 mov r1, r6
  101202. 80290ba: dcf1 bgt.n 80290a0 <__exponent+0x1c>
  101203. 80290bc: 3130 adds r1, #48 @ 0x30
  101204. 80290be: 1e94 subs r4, r2, #2
  101205. 80290c0: f803 1c01 strb.w r1, [r3, #-1]
  101206. 80290c4: 1c41 adds r1, r0, #1
  101207. 80290c6: 4623 mov r3, r4
  101208. 80290c8: 42ab cmp r3, r5
  101209. 80290ca: d30a bcc.n 80290e2 <__exponent+0x5e>
  101210. 80290cc: f10d 0309 add.w r3, sp, #9
  101211. 80290d0: 1a9b subs r3, r3, r2
  101212. 80290d2: 42ac cmp r4, r5
  101213. 80290d4: bf88 it hi
  101214. 80290d6: 2300 movhi r3, #0
  101215. 80290d8: 3302 adds r3, #2
  101216. 80290da: 4403 add r3, r0
  101217. 80290dc: 1a18 subs r0, r3, r0
  101218. 80290de: b003 add sp, #12
  101219. 80290e0: bdf0 pop {r4, r5, r6, r7, pc}
  101220. 80290e2: f813 6b01 ldrb.w r6, [r3], #1
  101221. 80290e6: f801 6f01 strb.w r6, [r1, #1]!
  101222. 80290ea: e7ed b.n 80290c8 <__exponent+0x44>
  101223. 80290ec: 2330 movs r3, #48 @ 0x30
  101224. 80290ee: 3130 adds r1, #48 @ 0x30
  101225. 80290f0: 7083 strb r3, [r0, #2]
  101226. 80290f2: 70c1 strb r1, [r0, #3]
  101227. 80290f4: 1d03 adds r3, r0, #4
  101228. 80290f6: e7f1 b.n 80290dc <__exponent+0x58>
  101229. 080290f8 <_printf_float>:
  101230. 80290f8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  101231. 80290fc: b08d sub sp, #52 @ 0x34
  101232. 80290fe: 460c mov r4, r1
  101233. 8029100: f8dd 8058 ldr.w r8, [sp, #88] @ 0x58
  101234. 8029104: 4616 mov r6, r2
  101235. 8029106: 461f mov r7, r3
  101236. 8029108: 4605 mov r5, r0
  101237. 802910a: f000 fe0b bl 8029d24 <_localeconv_r>
  101238. 802910e: f8d0 b000 ldr.w fp, [r0]
  101239. 8029112: 4658 mov r0, fp
  101240. 8029114: f7d7 f944 bl 80003a0 <strlen>
  101241. 8029118: 2300 movs r3, #0
  101242. 802911a: 930a str r3, [sp, #40] @ 0x28
  101243. 802911c: f8d8 3000 ldr.w r3, [r8]
  101244. 8029120: f894 9018 ldrb.w r9, [r4, #24]
  101245. 8029124: 6822 ldr r2, [r4, #0]
  101246. 8029126: 9005 str r0, [sp, #20]
  101247. 8029128: 3307 adds r3, #7
  101248. 802912a: f023 0307 bic.w r3, r3, #7
  101249. 802912e: f103 0108 add.w r1, r3, #8
  101250. 8029132: f8c8 1000 str.w r1, [r8]
  101251. 8029136: ed93 0b00 vldr d0, [r3]
  101252. 802913a: ed9f 6b97 vldr d6, [pc, #604] @ 8029398 <_printf_float+0x2a0>
  101253. 802913e: eeb0 7bc0 vabs.f64 d7, d0
  101254. 8029142: eeb4 7b46 vcmp.f64 d7, d6
  101255. 8029146: eef1 fa10 vmrs APSR_nzcv, fpscr
  101256. 802914a: ed84 0b12 vstr d0, [r4, #72] @ 0x48
  101257. 802914e: dd24 ble.n 802919a <_printf_float+0xa2>
  101258. 8029150: eeb5 0bc0 vcmpe.f64 d0, #0.0
  101259. 8029154: eef1 fa10 vmrs APSR_nzcv, fpscr
  101260. 8029158: d502 bpl.n 8029160 <_printf_float+0x68>
  101261. 802915a: 232d movs r3, #45 @ 0x2d
  101262. 802915c: f884 3043 strb.w r3, [r4, #67] @ 0x43
  101263. 8029160: 498f ldr r1, [pc, #572] @ (80293a0 <_printf_float+0x2a8>)
  101264. 8029162: 4b90 ldr r3, [pc, #576] @ (80293a4 <_printf_float+0x2ac>)
  101265. 8029164: f1b9 0f47 cmp.w r9, #71 @ 0x47
  101266. 8029168: bf94 ite ls
  101267. 802916a: 4688 movls r8, r1
  101268. 802916c: 4698 movhi r8, r3
  101269. 802916e: f022 0204 bic.w r2, r2, #4
  101270. 8029172: 2303 movs r3, #3
  101271. 8029174: 6123 str r3, [r4, #16]
  101272. 8029176: 6022 str r2, [r4, #0]
  101273. 8029178: f04f 0a00 mov.w sl, #0
  101274. 802917c: 9700 str r7, [sp, #0]
  101275. 802917e: 4633 mov r3, r6
  101276. 8029180: aa0b add r2, sp, #44 @ 0x2c
  101277. 8029182: 4621 mov r1, r4
  101278. 8029184: 4628 mov r0, r5
  101279. 8029186: f000 f9d1 bl 802952c <_printf_common>
  101280. 802918a: 3001 adds r0, #1
  101281. 802918c: f040 8089 bne.w 80292a2 <_printf_float+0x1aa>
  101282. 8029190: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  101283. 8029194: b00d add sp, #52 @ 0x34
  101284. 8029196: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  101285. 802919a: eeb4 0b40 vcmp.f64 d0, d0
  101286. 802919e: eef1 fa10 vmrs APSR_nzcv, fpscr
  101287. 80291a2: d709 bvc.n 80291b8 <_printf_float+0xc0>
  101288. 80291a4: ee10 3a90 vmov r3, s1
  101289. 80291a8: 2b00 cmp r3, #0
  101290. 80291aa: bfbc itt lt
  101291. 80291ac: 232d movlt r3, #45 @ 0x2d
  101292. 80291ae: f884 3043 strblt.w r3, [r4, #67] @ 0x43
  101293. 80291b2: 497d ldr r1, [pc, #500] @ (80293a8 <_printf_float+0x2b0>)
  101294. 80291b4: 4b7d ldr r3, [pc, #500] @ (80293ac <_printf_float+0x2b4>)
  101295. 80291b6: e7d5 b.n 8029164 <_printf_float+0x6c>
  101296. 80291b8: 6863 ldr r3, [r4, #4]
  101297. 80291ba: 1c59 adds r1, r3, #1
  101298. 80291bc: f009 0adf and.w sl, r9, #223 @ 0xdf
  101299. 80291c0: d139 bne.n 8029236 <_printf_float+0x13e>
  101300. 80291c2: 2306 movs r3, #6
  101301. 80291c4: 6063 str r3, [r4, #4]
  101302. 80291c6: f442 6280 orr.w r2, r2, #1024 @ 0x400
  101303. 80291ca: 2300 movs r3, #0
  101304. 80291cc: 6022 str r2, [r4, #0]
  101305. 80291ce: 9303 str r3, [sp, #12]
  101306. 80291d0: ab0a add r3, sp, #40 @ 0x28
  101307. 80291d2: e9cd 9301 strd r9, r3, [sp, #4]
  101308. 80291d6: ab09 add r3, sp, #36 @ 0x24
  101309. 80291d8: 9300 str r3, [sp, #0]
  101310. 80291da: 6861 ldr r1, [r4, #4]
  101311. 80291dc: f10d 0323 add.w r3, sp, #35 @ 0x23
  101312. 80291e0: 4628 mov r0, r5
  101313. 80291e2: f7ff fefb bl 8028fdc <__cvt>
  101314. 80291e6: f1ba 0f47 cmp.w sl, #71 @ 0x47
  101315. 80291ea: 9909 ldr r1, [sp, #36] @ 0x24
  101316. 80291ec: 4680 mov r8, r0
  101317. 80291ee: d129 bne.n 8029244 <_printf_float+0x14c>
  101318. 80291f0: 1cc8 adds r0, r1, #3
  101319. 80291f2: db02 blt.n 80291fa <_printf_float+0x102>
  101320. 80291f4: 6863 ldr r3, [r4, #4]
  101321. 80291f6: 4299 cmp r1, r3
  101322. 80291f8: dd41 ble.n 802927e <_printf_float+0x186>
  101323. 80291fa: f1a9 0902 sub.w r9, r9, #2
  101324. 80291fe: fa5f f989 uxtb.w r9, r9
  101325. 8029202: 3901 subs r1, #1
  101326. 8029204: 464a mov r2, r9
  101327. 8029206: f104 0050 add.w r0, r4, #80 @ 0x50
  101328. 802920a: 9109 str r1, [sp, #36] @ 0x24
  101329. 802920c: f7ff ff3a bl 8029084 <__exponent>
  101330. 8029210: 9a0a ldr r2, [sp, #40] @ 0x28
  101331. 8029212: 1813 adds r3, r2, r0
  101332. 8029214: 2a01 cmp r2, #1
  101333. 8029216: 4682 mov sl, r0
  101334. 8029218: 6123 str r3, [r4, #16]
  101335. 802921a: dc02 bgt.n 8029222 <_printf_float+0x12a>
  101336. 802921c: 6822 ldr r2, [r4, #0]
  101337. 802921e: 07d2 lsls r2, r2, #31
  101338. 8029220: d501 bpl.n 8029226 <_printf_float+0x12e>
  101339. 8029222: 3301 adds r3, #1
  101340. 8029224: 6123 str r3, [r4, #16]
  101341. 8029226: f89d 3023 ldrb.w r3, [sp, #35] @ 0x23
  101342. 802922a: 2b00 cmp r3, #0
  101343. 802922c: d0a6 beq.n 802917c <_printf_float+0x84>
  101344. 802922e: 232d movs r3, #45 @ 0x2d
  101345. 8029230: f884 3043 strb.w r3, [r4, #67] @ 0x43
  101346. 8029234: e7a2 b.n 802917c <_printf_float+0x84>
  101347. 8029236: f1ba 0f47 cmp.w sl, #71 @ 0x47
  101348. 802923a: d1c4 bne.n 80291c6 <_printf_float+0xce>
  101349. 802923c: 2b00 cmp r3, #0
  101350. 802923e: d1c2 bne.n 80291c6 <_printf_float+0xce>
  101351. 8029240: 2301 movs r3, #1
  101352. 8029242: e7bf b.n 80291c4 <_printf_float+0xcc>
  101353. 8029244: f1b9 0f65 cmp.w r9, #101 @ 0x65
  101354. 8029248: d9db bls.n 8029202 <_printf_float+0x10a>
  101355. 802924a: f1b9 0f66 cmp.w r9, #102 @ 0x66
  101356. 802924e: d118 bne.n 8029282 <_printf_float+0x18a>
  101357. 8029250: 2900 cmp r1, #0
  101358. 8029252: 6863 ldr r3, [r4, #4]
  101359. 8029254: dd0b ble.n 802926e <_printf_float+0x176>
  101360. 8029256: 6121 str r1, [r4, #16]
  101361. 8029258: b913 cbnz r3, 8029260 <_printf_float+0x168>
  101362. 802925a: 6822 ldr r2, [r4, #0]
  101363. 802925c: 07d0 lsls r0, r2, #31
  101364. 802925e: d502 bpl.n 8029266 <_printf_float+0x16e>
  101365. 8029260: 3301 adds r3, #1
  101366. 8029262: 440b add r3, r1
  101367. 8029264: 6123 str r3, [r4, #16]
  101368. 8029266: 65a1 str r1, [r4, #88] @ 0x58
  101369. 8029268: f04f 0a00 mov.w sl, #0
  101370. 802926c: e7db b.n 8029226 <_printf_float+0x12e>
  101371. 802926e: b913 cbnz r3, 8029276 <_printf_float+0x17e>
  101372. 8029270: 6822 ldr r2, [r4, #0]
  101373. 8029272: 07d2 lsls r2, r2, #31
  101374. 8029274: d501 bpl.n 802927a <_printf_float+0x182>
  101375. 8029276: 3302 adds r3, #2
  101376. 8029278: e7f4 b.n 8029264 <_printf_float+0x16c>
  101377. 802927a: 2301 movs r3, #1
  101378. 802927c: e7f2 b.n 8029264 <_printf_float+0x16c>
  101379. 802927e: f04f 0967 mov.w r9, #103 @ 0x67
  101380. 8029282: 9b0a ldr r3, [sp, #40] @ 0x28
  101381. 8029284: 4299 cmp r1, r3
  101382. 8029286: db05 blt.n 8029294 <_printf_float+0x19c>
  101383. 8029288: 6823 ldr r3, [r4, #0]
  101384. 802928a: 6121 str r1, [r4, #16]
  101385. 802928c: 07d8 lsls r0, r3, #31
  101386. 802928e: d5ea bpl.n 8029266 <_printf_float+0x16e>
  101387. 8029290: 1c4b adds r3, r1, #1
  101388. 8029292: e7e7 b.n 8029264 <_printf_float+0x16c>
  101389. 8029294: 2900 cmp r1, #0
  101390. 8029296: bfd4 ite le
  101391. 8029298: f1c1 0202 rsble r2, r1, #2
  101392. 802929c: 2201 movgt r2, #1
  101393. 802929e: 4413 add r3, r2
  101394. 80292a0: e7e0 b.n 8029264 <_printf_float+0x16c>
  101395. 80292a2: 6823 ldr r3, [r4, #0]
  101396. 80292a4: 055a lsls r2, r3, #21
  101397. 80292a6: d407 bmi.n 80292b8 <_printf_float+0x1c0>
  101398. 80292a8: 6923 ldr r3, [r4, #16]
  101399. 80292aa: 4642 mov r2, r8
  101400. 80292ac: 4631 mov r1, r6
  101401. 80292ae: 4628 mov r0, r5
  101402. 80292b0: 47b8 blx r7
  101403. 80292b2: 3001 adds r0, #1
  101404. 80292b4: d12a bne.n 802930c <_printf_float+0x214>
  101405. 80292b6: e76b b.n 8029190 <_printf_float+0x98>
  101406. 80292b8: f1b9 0f65 cmp.w r9, #101 @ 0x65
  101407. 80292bc: f240 80e0 bls.w 8029480 <_printf_float+0x388>
  101408. 80292c0: ed94 7b12 vldr d7, [r4, #72] @ 0x48
  101409. 80292c4: eeb5 7b40 vcmp.f64 d7, #0.0
  101410. 80292c8: eef1 fa10 vmrs APSR_nzcv, fpscr
  101411. 80292cc: d133 bne.n 8029336 <_printf_float+0x23e>
  101412. 80292ce: 4a38 ldr r2, [pc, #224] @ (80293b0 <_printf_float+0x2b8>)
  101413. 80292d0: 2301 movs r3, #1
  101414. 80292d2: 4631 mov r1, r6
  101415. 80292d4: 4628 mov r0, r5
  101416. 80292d6: 47b8 blx r7
  101417. 80292d8: 3001 adds r0, #1
  101418. 80292da: f43f af59 beq.w 8029190 <_printf_float+0x98>
  101419. 80292de: e9dd 3809 ldrd r3, r8, [sp, #36] @ 0x24
  101420. 80292e2: 4543 cmp r3, r8
  101421. 80292e4: db02 blt.n 80292ec <_printf_float+0x1f4>
  101422. 80292e6: 6823 ldr r3, [r4, #0]
  101423. 80292e8: 07d8 lsls r0, r3, #31
  101424. 80292ea: d50f bpl.n 802930c <_printf_float+0x214>
  101425. 80292ec: 9b05 ldr r3, [sp, #20]
  101426. 80292ee: 465a mov r2, fp
  101427. 80292f0: 4631 mov r1, r6
  101428. 80292f2: 4628 mov r0, r5
  101429. 80292f4: 47b8 blx r7
  101430. 80292f6: 3001 adds r0, #1
  101431. 80292f8: f43f af4a beq.w 8029190 <_printf_float+0x98>
  101432. 80292fc: f04f 0900 mov.w r9, #0
  101433. 8029300: f108 38ff add.w r8, r8, #4294967295 @ 0xffffffff
  101434. 8029304: f104 0a1a add.w sl, r4, #26
  101435. 8029308: 45c8 cmp r8, r9
  101436. 802930a: dc09 bgt.n 8029320 <_printf_float+0x228>
  101437. 802930c: 6823 ldr r3, [r4, #0]
  101438. 802930e: 079b lsls r3, r3, #30
  101439. 8029310: f100 8107 bmi.w 8029522 <_printf_float+0x42a>
  101440. 8029314: 68e0 ldr r0, [r4, #12]
  101441. 8029316: 9b0b ldr r3, [sp, #44] @ 0x2c
  101442. 8029318: 4298 cmp r0, r3
  101443. 802931a: bfb8 it lt
  101444. 802931c: 4618 movlt r0, r3
  101445. 802931e: e739 b.n 8029194 <_printf_float+0x9c>
  101446. 8029320: 2301 movs r3, #1
  101447. 8029322: 4652 mov r2, sl
  101448. 8029324: 4631 mov r1, r6
  101449. 8029326: 4628 mov r0, r5
  101450. 8029328: 47b8 blx r7
  101451. 802932a: 3001 adds r0, #1
  101452. 802932c: f43f af30 beq.w 8029190 <_printf_float+0x98>
  101453. 8029330: f109 0901 add.w r9, r9, #1
  101454. 8029334: e7e8 b.n 8029308 <_printf_float+0x210>
  101455. 8029336: 9b09 ldr r3, [sp, #36] @ 0x24
  101456. 8029338: 2b00 cmp r3, #0
  101457. 802933a: dc3b bgt.n 80293b4 <_printf_float+0x2bc>
  101458. 802933c: 4a1c ldr r2, [pc, #112] @ (80293b0 <_printf_float+0x2b8>)
  101459. 802933e: 2301 movs r3, #1
  101460. 8029340: 4631 mov r1, r6
  101461. 8029342: 4628 mov r0, r5
  101462. 8029344: 47b8 blx r7
  101463. 8029346: 3001 adds r0, #1
  101464. 8029348: f43f af22 beq.w 8029190 <_printf_float+0x98>
  101465. 802934c: e9dd 3909 ldrd r3, r9, [sp, #36] @ 0x24
  101466. 8029350: ea59 0303 orrs.w r3, r9, r3
  101467. 8029354: d102 bne.n 802935c <_printf_float+0x264>
  101468. 8029356: 6823 ldr r3, [r4, #0]
  101469. 8029358: 07d9 lsls r1, r3, #31
  101470. 802935a: d5d7 bpl.n 802930c <_printf_float+0x214>
  101471. 802935c: 9b05 ldr r3, [sp, #20]
  101472. 802935e: 465a mov r2, fp
  101473. 8029360: 4631 mov r1, r6
  101474. 8029362: 4628 mov r0, r5
  101475. 8029364: 47b8 blx r7
  101476. 8029366: 3001 adds r0, #1
  101477. 8029368: f43f af12 beq.w 8029190 <_printf_float+0x98>
  101478. 802936c: f04f 0a00 mov.w sl, #0
  101479. 8029370: f104 0b1a add.w fp, r4, #26
  101480. 8029374: 9b09 ldr r3, [sp, #36] @ 0x24
  101481. 8029376: 425b negs r3, r3
  101482. 8029378: 4553 cmp r3, sl
  101483. 802937a: dc01 bgt.n 8029380 <_printf_float+0x288>
  101484. 802937c: 464b mov r3, r9
  101485. 802937e: e794 b.n 80292aa <_printf_float+0x1b2>
  101486. 8029380: 2301 movs r3, #1
  101487. 8029382: 465a mov r2, fp
  101488. 8029384: 4631 mov r1, r6
  101489. 8029386: 4628 mov r0, r5
  101490. 8029388: 47b8 blx r7
  101491. 802938a: 3001 adds r0, #1
  101492. 802938c: f43f af00 beq.w 8029190 <_printf_float+0x98>
  101493. 8029390: f10a 0a01 add.w sl, sl, #1
  101494. 8029394: e7ee b.n 8029374 <_printf_float+0x27c>
  101495. 8029396: bf00 nop
  101496. 8029398: ffffffff .word 0xffffffff
  101497. 802939c: 7fefffff .word 0x7fefffff
  101498. 80293a0: 08030de9 .word 0x08030de9
  101499. 80293a4: 08030ded .word 0x08030ded
  101500. 80293a8: 08030df1 .word 0x08030df1
  101501. 80293ac: 08030df5 .word 0x08030df5
  101502. 80293b0: 08030df9 .word 0x08030df9
  101503. 80293b4: 6da3 ldr r3, [r4, #88] @ 0x58
  101504. 80293b6: f8dd a028 ldr.w sl, [sp, #40] @ 0x28
  101505. 80293ba: 4553 cmp r3, sl
  101506. 80293bc: bfa8 it ge
  101507. 80293be: 4653 movge r3, sl
  101508. 80293c0: 2b00 cmp r3, #0
  101509. 80293c2: 4699 mov r9, r3
  101510. 80293c4: dc37 bgt.n 8029436 <_printf_float+0x33e>
  101511. 80293c6: 2300 movs r3, #0
  101512. 80293c8: 9307 str r3, [sp, #28]
  101513. 80293ca: ea29 79e9 bic.w r9, r9, r9, asr #31
  101514. 80293ce: f104 021a add.w r2, r4, #26
  101515. 80293d2: 6da3 ldr r3, [r4, #88] @ 0x58
  101516. 80293d4: 9907 ldr r1, [sp, #28]
  101517. 80293d6: 9306 str r3, [sp, #24]
  101518. 80293d8: eba3 0309 sub.w r3, r3, r9
  101519. 80293dc: 428b cmp r3, r1
  101520. 80293de: dc31 bgt.n 8029444 <_printf_float+0x34c>
  101521. 80293e0: 9b09 ldr r3, [sp, #36] @ 0x24
  101522. 80293e2: 459a cmp sl, r3
  101523. 80293e4: dc3b bgt.n 802945e <_printf_float+0x366>
  101524. 80293e6: 6823 ldr r3, [r4, #0]
  101525. 80293e8: 07da lsls r2, r3, #31
  101526. 80293ea: d438 bmi.n 802945e <_printf_float+0x366>
  101527. 80293ec: 9b09 ldr r3, [sp, #36] @ 0x24
  101528. 80293ee: ebaa 0903 sub.w r9, sl, r3
  101529. 80293f2: 9b06 ldr r3, [sp, #24]
  101530. 80293f4: ebaa 0303 sub.w r3, sl, r3
  101531. 80293f8: 4599 cmp r9, r3
  101532. 80293fa: bfa8 it ge
  101533. 80293fc: 4699 movge r9, r3
  101534. 80293fe: f1b9 0f00 cmp.w r9, #0
  101535. 8029402: dc34 bgt.n 802946e <_printf_float+0x376>
  101536. 8029404: f04f 0800 mov.w r8, #0
  101537. 8029408: ea29 79e9 bic.w r9, r9, r9, asr #31
  101538. 802940c: f104 0b1a add.w fp, r4, #26
  101539. 8029410: 9b09 ldr r3, [sp, #36] @ 0x24
  101540. 8029412: ebaa 0303 sub.w r3, sl, r3
  101541. 8029416: eba3 0309 sub.w r3, r3, r9
  101542. 802941a: 4543 cmp r3, r8
  101543. 802941c: f77f af76 ble.w 802930c <_printf_float+0x214>
  101544. 8029420: 2301 movs r3, #1
  101545. 8029422: 465a mov r2, fp
  101546. 8029424: 4631 mov r1, r6
  101547. 8029426: 4628 mov r0, r5
  101548. 8029428: 47b8 blx r7
  101549. 802942a: 3001 adds r0, #1
  101550. 802942c: f43f aeb0 beq.w 8029190 <_printf_float+0x98>
  101551. 8029430: f108 0801 add.w r8, r8, #1
  101552. 8029434: e7ec b.n 8029410 <_printf_float+0x318>
  101553. 8029436: 4642 mov r2, r8
  101554. 8029438: 4631 mov r1, r6
  101555. 802943a: 4628 mov r0, r5
  101556. 802943c: 47b8 blx r7
  101557. 802943e: 3001 adds r0, #1
  101558. 8029440: d1c1 bne.n 80293c6 <_printf_float+0x2ce>
  101559. 8029442: e6a5 b.n 8029190 <_printf_float+0x98>
  101560. 8029444: 2301 movs r3, #1
  101561. 8029446: 4631 mov r1, r6
  101562. 8029448: 4628 mov r0, r5
  101563. 802944a: 9206 str r2, [sp, #24]
  101564. 802944c: 47b8 blx r7
  101565. 802944e: 3001 adds r0, #1
  101566. 8029450: f43f ae9e beq.w 8029190 <_printf_float+0x98>
  101567. 8029454: 9b07 ldr r3, [sp, #28]
  101568. 8029456: 9a06 ldr r2, [sp, #24]
  101569. 8029458: 3301 adds r3, #1
  101570. 802945a: 9307 str r3, [sp, #28]
  101571. 802945c: e7b9 b.n 80293d2 <_printf_float+0x2da>
  101572. 802945e: 9b05 ldr r3, [sp, #20]
  101573. 8029460: 465a mov r2, fp
  101574. 8029462: 4631 mov r1, r6
  101575. 8029464: 4628 mov r0, r5
  101576. 8029466: 47b8 blx r7
  101577. 8029468: 3001 adds r0, #1
  101578. 802946a: d1bf bne.n 80293ec <_printf_float+0x2f4>
  101579. 802946c: e690 b.n 8029190 <_printf_float+0x98>
  101580. 802946e: 9a06 ldr r2, [sp, #24]
  101581. 8029470: 464b mov r3, r9
  101582. 8029472: 4442 add r2, r8
  101583. 8029474: 4631 mov r1, r6
  101584. 8029476: 4628 mov r0, r5
  101585. 8029478: 47b8 blx r7
  101586. 802947a: 3001 adds r0, #1
  101587. 802947c: d1c2 bne.n 8029404 <_printf_float+0x30c>
  101588. 802947e: e687 b.n 8029190 <_printf_float+0x98>
  101589. 8029480: f8dd 9028 ldr.w r9, [sp, #40] @ 0x28
  101590. 8029484: f1b9 0f01 cmp.w r9, #1
  101591. 8029488: dc01 bgt.n 802948e <_printf_float+0x396>
  101592. 802948a: 07db lsls r3, r3, #31
  101593. 802948c: d536 bpl.n 80294fc <_printf_float+0x404>
  101594. 802948e: 2301 movs r3, #1
  101595. 8029490: 4642 mov r2, r8
  101596. 8029492: 4631 mov r1, r6
  101597. 8029494: 4628 mov r0, r5
  101598. 8029496: 47b8 blx r7
  101599. 8029498: 3001 adds r0, #1
  101600. 802949a: f43f ae79 beq.w 8029190 <_printf_float+0x98>
  101601. 802949e: 9b05 ldr r3, [sp, #20]
  101602. 80294a0: 465a mov r2, fp
  101603. 80294a2: 4631 mov r1, r6
  101604. 80294a4: 4628 mov r0, r5
  101605. 80294a6: 47b8 blx r7
  101606. 80294a8: 3001 adds r0, #1
  101607. 80294aa: f43f ae71 beq.w 8029190 <_printf_float+0x98>
  101608. 80294ae: ed94 7b12 vldr d7, [r4, #72] @ 0x48
  101609. 80294b2: eeb5 7b40 vcmp.f64 d7, #0.0
  101610. 80294b6: eef1 fa10 vmrs APSR_nzcv, fpscr
  101611. 80294ba: f109 39ff add.w r9, r9, #4294967295 @ 0xffffffff
  101612. 80294be: d018 beq.n 80294f2 <_printf_float+0x3fa>
  101613. 80294c0: 464b mov r3, r9
  101614. 80294c2: f108 0201 add.w r2, r8, #1
  101615. 80294c6: 4631 mov r1, r6
  101616. 80294c8: 4628 mov r0, r5
  101617. 80294ca: 47b8 blx r7
  101618. 80294cc: 3001 adds r0, #1
  101619. 80294ce: d10c bne.n 80294ea <_printf_float+0x3f2>
  101620. 80294d0: e65e b.n 8029190 <_printf_float+0x98>
  101621. 80294d2: 2301 movs r3, #1
  101622. 80294d4: 465a mov r2, fp
  101623. 80294d6: 4631 mov r1, r6
  101624. 80294d8: 4628 mov r0, r5
  101625. 80294da: 47b8 blx r7
  101626. 80294dc: 3001 adds r0, #1
  101627. 80294de: f43f ae57 beq.w 8029190 <_printf_float+0x98>
  101628. 80294e2: f108 0801 add.w r8, r8, #1
  101629. 80294e6: 45c8 cmp r8, r9
  101630. 80294e8: dbf3 blt.n 80294d2 <_printf_float+0x3da>
  101631. 80294ea: 4653 mov r3, sl
  101632. 80294ec: f104 0250 add.w r2, r4, #80 @ 0x50
  101633. 80294f0: e6dc b.n 80292ac <_printf_float+0x1b4>
  101634. 80294f2: f04f 0800 mov.w r8, #0
  101635. 80294f6: f104 0b1a add.w fp, r4, #26
  101636. 80294fa: e7f4 b.n 80294e6 <_printf_float+0x3ee>
  101637. 80294fc: 2301 movs r3, #1
  101638. 80294fe: 4642 mov r2, r8
  101639. 8029500: e7e1 b.n 80294c6 <_printf_float+0x3ce>
  101640. 8029502: 2301 movs r3, #1
  101641. 8029504: 464a mov r2, r9
  101642. 8029506: 4631 mov r1, r6
  101643. 8029508: 4628 mov r0, r5
  101644. 802950a: 47b8 blx r7
  101645. 802950c: 3001 adds r0, #1
  101646. 802950e: f43f ae3f beq.w 8029190 <_printf_float+0x98>
  101647. 8029512: f108 0801 add.w r8, r8, #1
  101648. 8029516: 68e3 ldr r3, [r4, #12]
  101649. 8029518: 990b ldr r1, [sp, #44] @ 0x2c
  101650. 802951a: 1a5b subs r3, r3, r1
  101651. 802951c: 4543 cmp r3, r8
  101652. 802951e: dcf0 bgt.n 8029502 <_printf_float+0x40a>
  101653. 8029520: e6f8 b.n 8029314 <_printf_float+0x21c>
  101654. 8029522: f04f 0800 mov.w r8, #0
  101655. 8029526: f104 0919 add.w r9, r4, #25
  101656. 802952a: e7f4 b.n 8029516 <_printf_float+0x41e>
  101657. 0802952c <_printf_common>:
  101658. 802952c: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  101659. 8029530: 4616 mov r6, r2
  101660. 8029532: 4698 mov r8, r3
  101661. 8029534: 688a ldr r2, [r1, #8]
  101662. 8029536: 690b ldr r3, [r1, #16]
  101663. 8029538: f8dd 9020 ldr.w r9, [sp, #32]
  101664. 802953c: 4293 cmp r3, r2
  101665. 802953e: bfb8 it lt
  101666. 8029540: 4613 movlt r3, r2
  101667. 8029542: 6033 str r3, [r6, #0]
  101668. 8029544: f891 2043 ldrb.w r2, [r1, #67] @ 0x43
  101669. 8029548: 4607 mov r7, r0
  101670. 802954a: 460c mov r4, r1
  101671. 802954c: b10a cbz r2, 8029552 <_printf_common+0x26>
  101672. 802954e: 3301 adds r3, #1
  101673. 8029550: 6033 str r3, [r6, #0]
  101674. 8029552: 6823 ldr r3, [r4, #0]
  101675. 8029554: 0699 lsls r1, r3, #26
  101676. 8029556: bf42 ittt mi
  101677. 8029558: 6833 ldrmi r3, [r6, #0]
  101678. 802955a: 3302 addmi r3, #2
  101679. 802955c: 6033 strmi r3, [r6, #0]
  101680. 802955e: 6825 ldr r5, [r4, #0]
  101681. 8029560: f015 0506 ands.w r5, r5, #6
  101682. 8029564: d106 bne.n 8029574 <_printf_common+0x48>
  101683. 8029566: f104 0a19 add.w sl, r4, #25
  101684. 802956a: 68e3 ldr r3, [r4, #12]
  101685. 802956c: 6832 ldr r2, [r6, #0]
  101686. 802956e: 1a9b subs r3, r3, r2
  101687. 8029570: 42ab cmp r3, r5
  101688. 8029572: dc26 bgt.n 80295c2 <_printf_common+0x96>
  101689. 8029574: f894 3043 ldrb.w r3, [r4, #67] @ 0x43
  101690. 8029578: 6822 ldr r2, [r4, #0]
  101691. 802957a: 3b00 subs r3, #0
  101692. 802957c: bf18 it ne
  101693. 802957e: 2301 movne r3, #1
  101694. 8029580: 0692 lsls r2, r2, #26
  101695. 8029582: d42b bmi.n 80295dc <_printf_common+0xb0>
  101696. 8029584: f104 0243 add.w r2, r4, #67 @ 0x43
  101697. 8029588: 4641 mov r1, r8
  101698. 802958a: 4638 mov r0, r7
  101699. 802958c: 47c8 blx r9
  101700. 802958e: 3001 adds r0, #1
  101701. 8029590: d01e beq.n 80295d0 <_printf_common+0xa4>
  101702. 8029592: 6823 ldr r3, [r4, #0]
  101703. 8029594: 6922 ldr r2, [r4, #16]
  101704. 8029596: f003 0306 and.w r3, r3, #6
  101705. 802959a: 2b04 cmp r3, #4
  101706. 802959c: bf02 ittt eq
  101707. 802959e: 68e5 ldreq r5, [r4, #12]
  101708. 80295a0: 6833 ldreq r3, [r6, #0]
  101709. 80295a2: 1aed subeq r5, r5, r3
  101710. 80295a4: 68a3 ldr r3, [r4, #8]
  101711. 80295a6: bf0c ite eq
  101712. 80295a8: ea25 75e5 biceq.w r5, r5, r5, asr #31
  101713. 80295ac: 2500 movne r5, #0
  101714. 80295ae: 4293 cmp r3, r2
  101715. 80295b0: bfc4 itt gt
  101716. 80295b2: 1a9b subgt r3, r3, r2
  101717. 80295b4: 18ed addgt r5, r5, r3
  101718. 80295b6: 2600 movs r6, #0
  101719. 80295b8: 341a adds r4, #26
  101720. 80295ba: 42b5 cmp r5, r6
  101721. 80295bc: d11a bne.n 80295f4 <_printf_common+0xc8>
  101722. 80295be: 2000 movs r0, #0
  101723. 80295c0: e008 b.n 80295d4 <_printf_common+0xa8>
  101724. 80295c2: 2301 movs r3, #1
  101725. 80295c4: 4652 mov r2, sl
  101726. 80295c6: 4641 mov r1, r8
  101727. 80295c8: 4638 mov r0, r7
  101728. 80295ca: 47c8 blx r9
  101729. 80295cc: 3001 adds r0, #1
  101730. 80295ce: d103 bne.n 80295d8 <_printf_common+0xac>
  101731. 80295d0: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  101732. 80295d4: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  101733. 80295d8: 3501 adds r5, #1
  101734. 80295da: e7c6 b.n 802956a <_printf_common+0x3e>
  101735. 80295dc: 18e1 adds r1, r4, r3
  101736. 80295de: 1c5a adds r2, r3, #1
  101737. 80295e0: 2030 movs r0, #48 @ 0x30
  101738. 80295e2: f881 0043 strb.w r0, [r1, #67] @ 0x43
  101739. 80295e6: 4422 add r2, r4
  101740. 80295e8: f894 1045 ldrb.w r1, [r4, #69] @ 0x45
  101741. 80295ec: f882 1043 strb.w r1, [r2, #67] @ 0x43
  101742. 80295f0: 3302 adds r3, #2
  101743. 80295f2: e7c7 b.n 8029584 <_printf_common+0x58>
  101744. 80295f4: 2301 movs r3, #1
  101745. 80295f6: 4622 mov r2, r4
  101746. 80295f8: 4641 mov r1, r8
  101747. 80295fa: 4638 mov r0, r7
  101748. 80295fc: 47c8 blx r9
  101749. 80295fe: 3001 adds r0, #1
  101750. 8029600: d0e6 beq.n 80295d0 <_printf_common+0xa4>
  101751. 8029602: 3601 adds r6, #1
  101752. 8029604: e7d9 b.n 80295ba <_printf_common+0x8e>
  101753. ...
  101754. 08029608 <_printf_i>:
  101755. 8029608: e92d 47ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr}
  101756. 802960c: 7e0f ldrb r7, [r1, #24]
  101757. 802960e: 9e0c ldr r6, [sp, #48] @ 0x30
  101758. 8029610: 2f78 cmp r7, #120 @ 0x78
  101759. 8029612: 4691 mov r9, r2
  101760. 8029614: 4680 mov r8, r0
  101761. 8029616: 460c mov r4, r1
  101762. 8029618: 469a mov sl, r3
  101763. 802961a: f101 0243 add.w r2, r1, #67 @ 0x43
  101764. 802961e: d807 bhi.n 8029630 <_printf_i+0x28>
  101765. 8029620: 2f62 cmp r7, #98 @ 0x62
  101766. 8029622: d80a bhi.n 802963a <_printf_i+0x32>
  101767. 8029624: 2f00 cmp r7, #0
  101768. 8029626: f000 80d2 beq.w 80297ce <_printf_i+0x1c6>
  101769. 802962a: 2f58 cmp r7, #88 @ 0x58
  101770. 802962c: f000 80b9 beq.w 80297a2 <_printf_i+0x19a>
  101771. 8029630: f104 0642 add.w r6, r4, #66 @ 0x42
  101772. 8029634: f884 7042 strb.w r7, [r4, #66] @ 0x42
  101773. 8029638: e03a b.n 80296b0 <_printf_i+0xa8>
  101774. 802963a: f1a7 0363 sub.w r3, r7, #99 @ 0x63
  101775. 802963e: 2b15 cmp r3, #21
  101776. 8029640: d8f6 bhi.n 8029630 <_printf_i+0x28>
  101777. 8029642: a101 add r1, pc, #4 @ (adr r1, 8029648 <_printf_i+0x40>)
  101778. 8029644: f851 f023 ldr.w pc, [r1, r3, lsl #2]
  101779. 8029648: 080296a1 .word 0x080296a1
  101780. 802964c: 080296b5 .word 0x080296b5
  101781. 8029650: 08029631 .word 0x08029631
  101782. 8029654: 08029631 .word 0x08029631
  101783. 8029658: 08029631 .word 0x08029631
  101784. 802965c: 08029631 .word 0x08029631
  101785. 8029660: 080296b5 .word 0x080296b5
  101786. 8029664: 08029631 .word 0x08029631
  101787. 8029668: 08029631 .word 0x08029631
  101788. 802966c: 08029631 .word 0x08029631
  101789. 8029670: 08029631 .word 0x08029631
  101790. 8029674: 080297b5 .word 0x080297b5
  101791. 8029678: 080296df .word 0x080296df
  101792. 802967c: 0802976f .word 0x0802976f
  101793. 8029680: 08029631 .word 0x08029631
  101794. 8029684: 08029631 .word 0x08029631
  101795. 8029688: 080297d7 .word 0x080297d7
  101796. 802968c: 08029631 .word 0x08029631
  101797. 8029690: 080296df .word 0x080296df
  101798. 8029694: 08029631 .word 0x08029631
  101799. 8029698: 08029631 .word 0x08029631
  101800. 802969c: 08029777 .word 0x08029777
  101801. 80296a0: 6833 ldr r3, [r6, #0]
  101802. 80296a2: 1d1a adds r2, r3, #4
  101803. 80296a4: 681b ldr r3, [r3, #0]
  101804. 80296a6: 6032 str r2, [r6, #0]
  101805. 80296a8: f104 0642 add.w r6, r4, #66 @ 0x42
  101806. 80296ac: f884 3042 strb.w r3, [r4, #66] @ 0x42
  101807. 80296b0: 2301 movs r3, #1
  101808. 80296b2: e09d b.n 80297f0 <_printf_i+0x1e8>
  101809. 80296b4: 6833 ldr r3, [r6, #0]
  101810. 80296b6: 6820 ldr r0, [r4, #0]
  101811. 80296b8: 1d19 adds r1, r3, #4
  101812. 80296ba: 6031 str r1, [r6, #0]
  101813. 80296bc: 0606 lsls r6, r0, #24
  101814. 80296be: d501 bpl.n 80296c4 <_printf_i+0xbc>
  101815. 80296c0: 681d ldr r5, [r3, #0]
  101816. 80296c2: e003 b.n 80296cc <_printf_i+0xc4>
  101817. 80296c4: 0645 lsls r5, r0, #25
  101818. 80296c6: d5fb bpl.n 80296c0 <_printf_i+0xb8>
  101819. 80296c8: f9b3 5000 ldrsh.w r5, [r3]
  101820. 80296cc: 2d00 cmp r5, #0
  101821. 80296ce: da03 bge.n 80296d8 <_printf_i+0xd0>
  101822. 80296d0: 232d movs r3, #45 @ 0x2d
  101823. 80296d2: 426d negs r5, r5
  101824. 80296d4: f884 3043 strb.w r3, [r4, #67] @ 0x43
  101825. 80296d8: 4859 ldr r0, [pc, #356] @ (8029840 <_printf_i+0x238>)
  101826. 80296da: 230a movs r3, #10
  101827. 80296dc: e011 b.n 8029702 <_printf_i+0xfa>
  101828. 80296de: 6821 ldr r1, [r4, #0]
  101829. 80296e0: 6833 ldr r3, [r6, #0]
  101830. 80296e2: 0608 lsls r0, r1, #24
  101831. 80296e4: f853 5b04 ldr.w r5, [r3], #4
  101832. 80296e8: d402 bmi.n 80296f0 <_printf_i+0xe8>
  101833. 80296ea: 0649 lsls r1, r1, #25
  101834. 80296ec: bf48 it mi
  101835. 80296ee: b2ad uxthmi r5, r5
  101836. 80296f0: 2f6f cmp r7, #111 @ 0x6f
  101837. 80296f2: 4853 ldr r0, [pc, #332] @ (8029840 <_printf_i+0x238>)
  101838. 80296f4: 6033 str r3, [r6, #0]
  101839. 80296f6: bf14 ite ne
  101840. 80296f8: 230a movne r3, #10
  101841. 80296fa: 2308 moveq r3, #8
  101842. 80296fc: 2100 movs r1, #0
  101843. 80296fe: f884 1043 strb.w r1, [r4, #67] @ 0x43
  101844. 8029702: 6866 ldr r6, [r4, #4]
  101845. 8029704: 60a6 str r6, [r4, #8]
  101846. 8029706: 2e00 cmp r6, #0
  101847. 8029708: bfa2 ittt ge
  101848. 802970a: 6821 ldrge r1, [r4, #0]
  101849. 802970c: f021 0104 bicge.w r1, r1, #4
  101850. 8029710: 6021 strge r1, [r4, #0]
  101851. 8029712: b90d cbnz r5, 8029718 <_printf_i+0x110>
  101852. 8029714: 2e00 cmp r6, #0
  101853. 8029716: d04b beq.n 80297b0 <_printf_i+0x1a8>
  101854. 8029718: 4616 mov r6, r2
  101855. 802971a: fbb5 f1f3 udiv r1, r5, r3
  101856. 802971e: fb03 5711 mls r7, r3, r1, r5
  101857. 8029722: 5dc7 ldrb r7, [r0, r7]
  101858. 8029724: f806 7d01 strb.w r7, [r6, #-1]!
  101859. 8029728: 462f mov r7, r5
  101860. 802972a: 42bb cmp r3, r7
  101861. 802972c: 460d mov r5, r1
  101862. 802972e: d9f4 bls.n 802971a <_printf_i+0x112>
  101863. 8029730: 2b08 cmp r3, #8
  101864. 8029732: d10b bne.n 802974c <_printf_i+0x144>
  101865. 8029734: 6823 ldr r3, [r4, #0]
  101866. 8029736: 07df lsls r7, r3, #31
  101867. 8029738: d508 bpl.n 802974c <_printf_i+0x144>
  101868. 802973a: 6923 ldr r3, [r4, #16]
  101869. 802973c: 6861 ldr r1, [r4, #4]
  101870. 802973e: 4299 cmp r1, r3
  101871. 8029740: bfde ittt le
  101872. 8029742: 2330 movle r3, #48 @ 0x30
  101873. 8029744: f806 3c01 strble.w r3, [r6, #-1]
  101874. 8029748: f106 36ff addle.w r6, r6, #4294967295 @ 0xffffffff
  101875. 802974c: 1b92 subs r2, r2, r6
  101876. 802974e: 6122 str r2, [r4, #16]
  101877. 8029750: f8cd a000 str.w sl, [sp]
  101878. 8029754: 464b mov r3, r9
  101879. 8029756: aa03 add r2, sp, #12
  101880. 8029758: 4621 mov r1, r4
  101881. 802975a: 4640 mov r0, r8
  101882. 802975c: f7ff fee6 bl 802952c <_printf_common>
  101883. 8029760: 3001 adds r0, #1
  101884. 8029762: d14a bne.n 80297fa <_printf_i+0x1f2>
  101885. 8029764: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  101886. 8029768: b004 add sp, #16
  101887. 802976a: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  101888. 802976e: 6823 ldr r3, [r4, #0]
  101889. 8029770: f043 0320 orr.w r3, r3, #32
  101890. 8029774: 6023 str r3, [r4, #0]
  101891. 8029776: 4833 ldr r0, [pc, #204] @ (8029844 <_printf_i+0x23c>)
  101892. 8029778: 2778 movs r7, #120 @ 0x78
  101893. 802977a: f884 7045 strb.w r7, [r4, #69] @ 0x45
  101894. 802977e: 6823 ldr r3, [r4, #0]
  101895. 8029780: 6831 ldr r1, [r6, #0]
  101896. 8029782: 061f lsls r7, r3, #24
  101897. 8029784: f851 5b04 ldr.w r5, [r1], #4
  101898. 8029788: d402 bmi.n 8029790 <_printf_i+0x188>
  101899. 802978a: 065f lsls r7, r3, #25
  101900. 802978c: bf48 it mi
  101901. 802978e: b2ad uxthmi r5, r5
  101902. 8029790: 6031 str r1, [r6, #0]
  101903. 8029792: 07d9 lsls r1, r3, #31
  101904. 8029794: bf44 itt mi
  101905. 8029796: f043 0320 orrmi.w r3, r3, #32
  101906. 802979a: 6023 strmi r3, [r4, #0]
  101907. 802979c: b11d cbz r5, 80297a6 <_printf_i+0x19e>
  101908. 802979e: 2310 movs r3, #16
  101909. 80297a0: e7ac b.n 80296fc <_printf_i+0xf4>
  101910. 80297a2: 4827 ldr r0, [pc, #156] @ (8029840 <_printf_i+0x238>)
  101911. 80297a4: e7e9 b.n 802977a <_printf_i+0x172>
  101912. 80297a6: 6823 ldr r3, [r4, #0]
  101913. 80297a8: f023 0320 bic.w r3, r3, #32
  101914. 80297ac: 6023 str r3, [r4, #0]
  101915. 80297ae: e7f6 b.n 802979e <_printf_i+0x196>
  101916. 80297b0: 4616 mov r6, r2
  101917. 80297b2: e7bd b.n 8029730 <_printf_i+0x128>
  101918. 80297b4: 6833 ldr r3, [r6, #0]
  101919. 80297b6: 6825 ldr r5, [r4, #0]
  101920. 80297b8: 6961 ldr r1, [r4, #20]
  101921. 80297ba: 1d18 adds r0, r3, #4
  101922. 80297bc: 6030 str r0, [r6, #0]
  101923. 80297be: 062e lsls r6, r5, #24
  101924. 80297c0: 681b ldr r3, [r3, #0]
  101925. 80297c2: d501 bpl.n 80297c8 <_printf_i+0x1c0>
  101926. 80297c4: 6019 str r1, [r3, #0]
  101927. 80297c6: e002 b.n 80297ce <_printf_i+0x1c6>
  101928. 80297c8: 0668 lsls r0, r5, #25
  101929. 80297ca: d5fb bpl.n 80297c4 <_printf_i+0x1bc>
  101930. 80297cc: 8019 strh r1, [r3, #0]
  101931. 80297ce: 2300 movs r3, #0
  101932. 80297d0: 6123 str r3, [r4, #16]
  101933. 80297d2: 4616 mov r6, r2
  101934. 80297d4: e7bc b.n 8029750 <_printf_i+0x148>
  101935. 80297d6: 6833 ldr r3, [r6, #0]
  101936. 80297d8: 1d1a adds r2, r3, #4
  101937. 80297da: 6032 str r2, [r6, #0]
  101938. 80297dc: 681e ldr r6, [r3, #0]
  101939. 80297de: 6862 ldr r2, [r4, #4]
  101940. 80297e0: 2100 movs r1, #0
  101941. 80297e2: 4630 mov r0, r6
  101942. 80297e4: f7d6 fd8c bl 8000300 <memchr>
  101943. 80297e8: b108 cbz r0, 80297ee <_printf_i+0x1e6>
  101944. 80297ea: 1b80 subs r0, r0, r6
  101945. 80297ec: 6060 str r0, [r4, #4]
  101946. 80297ee: 6863 ldr r3, [r4, #4]
  101947. 80297f0: 6123 str r3, [r4, #16]
  101948. 80297f2: 2300 movs r3, #0
  101949. 80297f4: f884 3043 strb.w r3, [r4, #67] @ 0x43
  101950. 80297f8: e7aa b.n 8029750 <_printf_i+0x148>
  101951. 80297fa: 6923 ldr r3, [r4, #16]
  101952. 80297fc: 4632 mov r2, r6
  101953. 80297fe: 4649 mov r1, r9
  101954. 8029800: 4640 mov r0, r8
  101955. 8029802: 47d0 blx sl
  101956. 8029804: 3001 adds r0, #1
  101957. 8029806: d0ad beq.n 8029764 <_printf_i+0x15c>
  101958. 8029808: 6823 ldr r3, [r4, #0]
  101959. 802980a: 079b lsls r3, r3, #30
  101960. 802980c: d413 bmi.n 8029836 <_printf_i+0x22e>
  101961. 802980e: 68e0 ldr r0, [r4, #12]
  101962. 8029810: 9b03 ldr r3, [sp, #12]
  101963. 8029812: 4298 cmp r0, r3
  101964. 8029814: bfb8 it lt
  101965. 8029816: 4618 movlt r0, r3
  101966. 8029818: e7a6 b.n 8029768 <_printf_i+0x160>
  101967. 802981a: 2301 movs r3, #1
  101968. 802981c: 4632 mov r2, r6
  101969. 802981e: 4649 mov r1, r9
  101970. 8029820: 4640 mov r0, r8
  101971. 8029822: 47d0 blx sl
  101972. 8029824: 3001 adds r0, #1
  101973. 8029826: d09d beq.n 8029764 <_printf_i+0x15c>
  101974. 8029828: 3501 adds r5, #1
  101975. 802982a: 68e3 ldr r3, [r4, #12]
  101976. 802982c: 9903 ldr r1, [sp, #12]
  101977. 802982e: 1a5b subs r3, r3, r1
  101978. 8029830: 42ab cmp r3, r5
  101979. 8029832: dcf2 bgt.n 802981a <_printf_i+0x212>
  101980. 8029834: e7eb b.n 802980e <_printf_i+0x206>
  101981. 8029836: 2500 movs r5, #0
  101982. 8029838: f104 0619 add.w r6, r4, #25
  101983. 802983c: e7f5 b.n 802982a <_printf_i+0x222>
  101984. 802983e: bf00 nop
  101985. 8029840: 08030dfb .word 0x08030dfb
  101986. 8029844: 08030e0c .word 0x08030e0c
  101987. 08029848 <std>:
  101988. 8029848: 2300 movs r3, #0
  101989. 802984a: b510 push {r4, lr}
  101990. 802984c: 4604 mov r4, r0
  101991. 802984e: e9c0 3300 strd r3, r3, [r0]
  101992. 8029852: e9c0 3304 strd r3, r3, [r0, #16]
  101993. 8029856: 6083 str r3, [r0, #8]
  101994. 8029858: 8181 strh r1, [r0, #12]
  101995. 802985a: 6643 str r3, [r0, #100] @ 0x64
  101996. 802985c: 81c2 strh r2, [r0, #14]
  101997. 802985e: 6183 str r3, [r0, #24]
  101998. 8029860: 4619 mov r1, r3
  101999. 8029862: 2208 movs r2, #8
  102000. 8029864: 305c adds r0, #92 @ 0x5c
  102001. 8029866: f000 fa43 bl 8029cf0 <memset>
  102002. 802986a: 4b0d ldr r3, [pc, #52] @ (80298a0 <std+0x58>)
  102003. 802986c: 6263 str r3, [r4, #36] @ 0x24
  102004. 802986e: 4b0d ldr r3, [pc, #52] @ (80298a4 <std+0x5c>)
  102005. 8029870: 62a3 str r3, [r4, #40] @ 0x28
  102006. 8029872: 4b0d ldr r3, [pc, #52] @ (80298a8 <std+0x60>)
  102007. 8029874: 62e3 str r3, [r4, #44] @ 0x2c
  102008. 8029876: 4b0d ldr r3, [pc, #52] @ (80298ac <std+0x64>)
  102009. 8029878: 6323 str r3, [r4, #48] @ 0x30
  102010. 802987a: 4b0d ldr r3, [pc, #52] @ (80298b0 <std+0x68>)
  102011. 802987c: 6224 str r4, [r4, #32]
  102012. 802987e: 429c cmp r4, r3
  102013. 8029880: d006 beq.n 8029890 <std+0x48>
  102014. 8029882: f103 0268 add.w r2, r3, #104 @ 0x68
  102015. 8029886: 4294 cmp r4, r2
  102016. 8029888: d002 beq.n 8029890 <std+0x48>
  102017. 802988a: 33d0 adds r3, #208 @ 0xd0
  102018. 802988c: 429c cmp r4, r3
  102019. 802988e: d105 bne.n 802989c <std+0x54>
  102020. 8029890: f104 0058 add.w r0, r4, #88 @ 0x58
  102021. 8029894: e8bd 4010 ldmia.w sp!, {r4, lr}
  102022. 8029898: f000 bb1e b.w 8029ed8 <__retarget_lock_init_recursive>
  102023. 802989c: bd10 pop {r4, pc}
  102024. 802989e: bf00 nop
  102025. 80298a0: 08029aed .word 0x08029aed
  102026. 80298a4: 08029b0f .word 0x08029b0f
  102027. 80298a8: 08029b47 .word 0x08029b47
  102028. 80298ac: 08029b6b .word 0x08029b6b
  102029. 80298b0: 2402b044 .word 0x2402b044
  102030. 080298b4 <stdio_exit_handler>:
  102031. 80298b4: 4a02 ldr r2, [pc, #8] @ (80298c0 <stdio_exit_handler+0xc>)
  102032. 80298b6: 4903 ldr r1, [pc, #12] @ (80298c4 <stdio_exit_handler+0x10>)
  102033. 80298b8: 4803 ldr r0, [pc, #12] @ (80298c8 <stdio_exit_handler+0x14>)
  102034. 80298ba: f000 b869 b.w 8029990 <_fwalk_sglue>
  102035. 80298be: bf00 nop
  102036. 80298c0: 2400005c .word 0x2400005c
  102037. 80298c4: 0802c1fd .word 0x0802c1fd
  102038. 80298c8: 240001d8 .word 0x240001d8
  102039. 080298cc <cleanup_stdio>:
  102040. 80298cc: 6841 ldr r1, [r0, #4]
  102041. 80298ce: 4b0c ldr r3, [pc, #48] @ (8029900 <cleanup_stdio+0x34>)
  102042. 80298d0: 4299 cmp r1, r3
  102043. 80298d2: b510 push {r4, lr}
  102044. 80298d4: 4604 mov r4, r0
  102045. 80298d6: d001 beq.n 80298dc <cleanup_stdio+0x10>
  102046. 80298d8: f002 fc90 bl 802c1fc <_fflush_r>
  102047. 80298dc: 68a1 ldr r1, [r4, #8]
  102048. 80298de: 4b09 ldr r3, [pc, #36] @ (8029904 <cleanup_stdio+0x38>)
  102049. 80298e0: 4299 cmp r1, r3
  102050. 80298e2: d002 beq.n 80298ea <cleanup_stdio+0x1e>
  102051. 80298e4: 4620 mov r0, r4
  102052. 80298e6: f002 fc89 bl 802c1fc <_fflush_r>
  102053. 80298ea: 68e1 ldr r1, [r4, #12]
  102054. 80298ec: 4b06 ldr r3, [pc, #24] @ (8029908 <cleanup_stdio+0x3c>)
  102055. 80298ee: 4299 cmp r1, r3
  102056. 80298f0: d004 beq.n 80298fc <cleanup_stdio+0x30>
  102057. 80298f2: 4620 mov r0, r4
  102058. 80298f4: e8bd 4010 ldmia.w sp!, {r4, lr}
  102059. 80298f8: f002 bc80 b.w 802c1fc <_fflush_r>
  102060. 80298fc: bd10 pop {r4, pc}
  102061. 80298fe: bf00 nop
  102062. 8029900: 2402b044 .word 0x2402b044
  102063. 8029904: 2402b0ac .word 0x2402b0ac
  102064. 8029908: 2402b114 .word 0x2402b114
  102065. 0802990c <global_stdio_init.part.0>:
  102066. 802990c: b510 push {r4, lr}
  102067. 802990e: 4b0b ldr r3, [pc, #44] @ (802993c <global_stdio_init.part.0+0x30>)
  102068. 8029910: 4c0b ldr r4, [pc, #44] @ (8029940 <global_stdio_init.part.0+0x34>)
  102069. 8029912: 4a0c ldr r2, [pc, #48] @ (8029944 <global_stdio_init.part.0+0x38>)
  102070. 8029914: 601a str r2, [r3, #0]
  102071. 8029916: 4620 mov r0, r4
  102072. 8029918: 2200 movs r2, #0
  102073. 802991a: 2104 movs r1, #4
  102074. 802991c: f7ff ff94 bl 8029848 <std>
  102075. 8029920: f104 0068 add.w r0, r4, #104 @ 0x68
  102076. 8029924: 2201 movs r2, #1
  102077. 8029926: 2109 movs r1, #9
  102078. 8029928: f7ff ff8e bl 8029848 <std>
  102079. 802992c: f104 00d0 add.w r0, r4, #208 @ 0xd0
  102080. 8029930: 2202 movs r2, #2
  102081. 8029932: e8bd 4010 ldmia.w sp!, {r4, lr}
  102082. 8029936: 2112 movs r1, #18
  102083. 8029938: f7ff bf86 b.w 8029848 <std>
  102084. 802993c: 2402b17c .word 0x2402b17c
  102085. 8029940: 2402b044 .word 0x2402b044
  102086. 8029944: 080298b5 .word 0x080298b5
  102087. 08029948 <__sfp_lock_acquire>:
  102088. 8029948: 4801 ldr r0, [pc, #4] @ (8029950 <__sfp_lock_acquire+0x8>)
  102089. 802994a: f000 bac6 b.w 8029eda <__retarget_lock_acquire_recursive>
  102090. 802994e: bf00 nop
  102091. 8029950: 2402b185 .word 0x2402b185
  102092. 08029954 <__sfp_lock_release>:
  102093. 8029954: 4801 ldr r0, [pc, #4] @ (802995c <__sfp_lock_release+0x8>)
  102094. 8029956: f000 bac1 b.w 8029edc <__retarget_lock_release_recursive>
  102095. 802995a: bf00 nop
  102096. 802995c: 2402b185 .word 0x2402b185
  102097. 08029960 <__sinit>:
  102098. 8029960: b510 push {r4, lr}
  102099. 8029962: 4604 mov r4, r0
  102100. 8029964: f7ff fff0 bl 8029948 <__sfp_lock_acquire>
  102101. 8029968: 6a23 ldr r3, [r4, #32]
  102102. 802996a: b11b cbz r3, 8029974 <__sinit+0x14>
  102103. 802996c: e8bd 4010 ldmia.w sp!, {r4, lr}
  102104. 8029970: f7ff bff0 b.w 8029954 <__sfp_lock_release>
  102105. 8029974: 4b04 ldr r3, [pc, #16] @ (8029988 <__sinit+0x28>)
  102106. 8029976: 6223 str r3, [r4, #32]
  102107. 8029978: 4b04 ldr r3, [pc, #16] @ (802998c <__sinit+0x2c>)
  102108. 802997a: 681b ldr r3, [r3, #0]
  102109. 802997c: 2b00 cmp r3, #0
  102110. 802997e: d1f5 bne.n 802996c <__sinit+0xc>
  102111. 8029980: f7ff ffc4 bl 802990c <global_stdio_init.part.0>
  102112. 8029984: e7f2 b.n 802996c <__sinit+0xc>
  102113. 8029986: bf00 nop
  102114. 8029988: 080298cd .word 0x080298cd
  102115. 802998c: 2402b17c .word 0x2402b17c
  102116. 08029990 <_fwalk_sglue>:
  102117. 8029990: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  102118. 8029994: 4607 mov r7, r0
  102119. 8029996: 4688 mov r8, r1
  102120. 8029998: 4614 mov r4, r2
  102121. 802999a: 2600 movs r6, #0
  102122. 802999c: e9d4 9501 ldrd r9, r5, [r4, #4]
  102123. 80299a0: f1b9 0901 subs.w r9, r9, #1
  102124. 80299a4: d505 bpl.n 80299b2 <_fwalk_sglue+0x22>
  102125. 80299a6: 6824 ldr r4, [r4, #0]
  102126. 80299a8: 2c00 cmp r4, #0
  102127. 80299aa: d1f7 bne.n 802999c <_fwalk_sglue+0xc>
  102128. 80299ac: 4630 mov r0, r6
  102129. 80299ae: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  102130. 80299b2: 89ab ldrh r3, [r5, #12]
  102131. 80299b4: 2b01 cmp r3, #1
  102132. 80299b6: d907 bls.n 80299c8 <_fwalk_sglue+0x38>
  102133. 80299b8: f9b5 300e ldrsh.w r3, [r5, #14]
  102134. 80299bc: 3301 adds r3, #1
  102135. 80299be: d003 beq.n 80299c8 <_fwalk_sglue+0x38>
  102136. 80299c0: 4629 mov r1, r5
  102137. 80299c2: 4638 mov r0, r7
  102138. 80299c4: 47c0 blx r8
  102139. 80299c6: 4306 orrs r6, r0
  102140. 80299c8: 3568 adds r5, #104 @ 0x68
  102141. 80299ca: e7e9 b.n 80299a0 <_fwalk_sglue+0x10>
  102142. 080299cc <iprintf>:
  102143. 80299cc: b40f push {r0, r1, r2, r3}
  102144. 80299ce: b507 push {r0, r1, r2, lr}
  102145. 80299d0: 4906 ldr r1, [pc, #24] @ (80299ec <iprintf+0x20>)
  102146. 80299d2: ab04 add r3, sp, #16
  102147. 80299d4: 6808 ldr r0, [r1, #0]
  102148. 80299d6: f853 2b04 ldr.w r2, [r3], #4
  102149. 80299da: 6881 ldr r1, [r0, #8]
  102150. 80299dc: 9301 str r3, [sp, #4]
  102151. 80299de: f002 fa71 bl 802bec4 <_vfiprintf_r>
  102152. 80299e2: b003 add sp, #12
  102153. 80299e4: f85d eb04 ldr.w lr, [sp], #4
  102154. 80299e8: b004 add sp, #16
  102155. 80299ea: 4770 bx lr
  102156. 80299ec: 240001d4 .word 0x240001d4
  102157. 080299f0 <_puts_r>:
  102158. 80299f0: 6a03 ldr r3, [r0, #32]
  102159. 80299f2: b570 push {r4, r5, r6, lr}
  102160. 80299f4: 6884 ldr r4, [r0, #8]
  102161. 80299f6: 4605 mov r5, r0
  102162. 80299f8: 460e mov r6, r1
  102163. 80299fa: b90b cbnz r3, 8029a00 <_puts_r+0x10>
  102164. 80299fc: f7ff ffb0 bl 8029960 <__sinit>
  102165. 8029a00: 6e63 ldr r3, [r4, #100] @ 0x64
  102166. 8029a02: 07db lsls r3, r3, #31
  102167. 8029a04: d405 bmi.n 8029a12 <_puts_r+0x22>
  102168. 8029a06: 89a3 ldrh r3, [r4, #12]
  102169. 8029a08: 0598 lsls r0, r3, #22
  102170. 8029a0a: d402 bmi.n 8029a12 <_puts_r+0x22>
  102171. 8029a0c: 6da0 ldr r0, [r4, #88] @ 0x58
  102172. 8029a0e: f000 fa64 bl 8029eda <__retarget_lock_acquire_recursive>
  102173. 8029a12: 89a3 ldrh r3, [r4, #12]
  102174. 8029a14: 0719 lsls r1, r3, #28
  102175. 8029a16: d502 bpl.n 8029a1e <_puts_r+0x2e>
  102176. 8029a18: 6923 ldr r3, [r4, #16]
  102177. 8029a1a: 2b00 cmp r3, #0
  102178. 8029a1c: d135 bne.n 8029a8a <_puts_r+0x9a>
  102179. 8029a1e: 4621 mov r1, r4
  102180. 8029a20: 4628 mov r0, r5
  102181. 8029a22: f000 f8e5 bl 8029bf0 <__swsetup_r>
  102182. 8029a26: b380 cbz r0, 8029a8a <_puts_r+0x9a>
  102183. 8029a28: f04f 35ff mov.w r5, #4294967295 @ 0xffffffff
  102184. 8029a2c: 6e63 ldr r3, [r4, #100] @ 0x64
  102185. 8029a2e: 07da lsls r2, r3, #31
  102186. 8029a30: d405 bmi.n 8029a3e <_puts_r+0x4e>
  102187. 8029a32: 89a3 ldrh r3, [r4, #12]
  102188. 8029a34: 059b lsls r3, r3, #22
  102189. 8029a36: d402 bmi.n 8029a3e <_puts_r+0x4e>
  102190. 8029a38: 6da0 ldr r0, [r4, #88] @ 0x58
  102191. 8029a3a: f000 fa4f bl 8029edc <__retarget_lock_release_recursive>
  102192. 8029a3e: 4628 mov r0, r5
  102193. 8029a40: bd70 pop {r4, r5, r6, pc}
  102194. 8029a42: 2b00 cmp r3, #0
  102195. 8029a44: da04 bge.n 8029a50 <_puts_r+0x60>
  102196. 8029a46: 69a2 ldr r2, [r4, #24]
  102197. 8029a48: 429a cmp r2, r3
  102198. 8029a4a: dc17 bgt.n 8029a7c <_puts_r+0x8c>
  102199. 8029a4c: 290a cmp r1, #10
  102200. 8029a4e: d015 beq.n 8029a7c <_puts_r+0x8c>
  102201. 8029a50: 6823 ldr r3, [r4, #0]
  102202. 8029a52: 1c5a adds r2, r3, #1
  102203. 8029a54: 6022 str r2, [r4, #0]
  102204. 8029a56: 7019 strb r1, [r3, #0]
  102205. 8029a58: 68a3 ldr r3, [r4, #8]
  102206. 8029a5a: f816 1f01 ldrb.w r1, [r6, #1]!
  102207. 8029a5e: 3b01 subs r3, #1
  102208. 8029a60: 60a3 str r3, [r4, #8]
  102209. 8029a62: 2900 cmp r1, #0
  102210. 8029a64: d1ed bne.n 8029a42 <_puts_r+0x52>
  102211. 8029a66: 2b00 cmp r3, #0
  102212. 8029a68: da11 bge.n 8029a8e <_puts_r+0x9e>
  102213. 8029a6a: 4622 mov r2, r4
  102214. 8029a6c: 210a movs r1, #10
  102215. 8029a6e: 4628 mov r0, r5
  102216. 8029a70: f000 f87f bl 8029b72 <__swbuf_r>
  102217. 8029a74: 3001 adds r0, #1
  102218. 8029a76: d0d7 beq.n 8029a28 <_puts_r+0x38>
  102219. 8029a78: 250a movs r5, #10
  102220. 8029a7a: e7d7 b.n 8029a2c <_puts_r+0x3c>
  102221. 8029a7c: 4622 mov r2, r4
  102222. 8029a7e: 4628 mov r0, r5
  102223. 8029a80: f000 f877 bl 8029b72 <__swbuf_r>
  102224. 8029a84: 3001 adds r0, #1
  102225. 8029a86: d1e7 bne.n 8029a58 <_puts_r+0x68>
  102226. 8029a88: e7ce b.n 8029a28 <_puts_r+0x38>
  102227. 8029a8a: 3e01 subs r6, #1
  102228. 8029a8c: e7e4 b.n 8029a58 <_puts_r+0x68>
  102229. 8029a8e: 6823 ldr r3, [r4, #0]
  102230. 8029a90: 1c5a adds r2, r3, #1
  102231. 8029a92: 6022 str r2, [r4, #0]
  102232. 8029a94: 220a movs r2, #10
  102233. 8029a96: 701a strb r2, [r3, #0]
  102234. 8029a98: e7ee b.n 8029a78 <_puts_r+0x88>
  102235. ...
  102236. 08029a9c <puts>:
  102237. 8029a9c: 4b02 ldr r3, [pc, #8] @ (8029aa8 <puts+0xc>)
  102238. 8029a9e: 4601 mov r1, r0
  102239. 8029aa0: 6818 ldr r0, [r3, #0]
  102240. 8029aa2: f7ff bfa5 b.w 80299f0 <_puts_r>
  102241. 8029aa6: bf00 nop
  102242. 8029aa8: 240001d4 .word 0x240001d4
  102243. 08029aac <siprintf>:
  102244. 8029aac: b40e push {r1, r2, r3}
  102245. 8029aae: b500 push {lr}
  102246. 8029ab0: b09c sub sp, #112 @ 0x70
  102247. 8029ab2: ab1d add r3, sp, #116 @ 0x74
  102248. 8029ab4: 9002 str r0, [sp, #8]
  102249. 8029ab6: 9006 str r0, [sp, #24]
  102250. 8029ab8: f06f 4100 mvn.w r1, #2147483648 @ 0x80000000
  102251. 8029abc: 4809 ldr r0, [pc, #36] @ (8029ae4 <siprintf+0x38>)
  102252. 8029abe: 9107 str r1, [sp, #28]
  102253. 8029ac0: 9104 str r1, [sp, #16]
  102254. 8029ac2: 4909 ldr r1, [pc, #36] @ (8029ae8 <siprintf+0x3c>)
  102255. 8029ac4: f853 2b04 ldr.w r2, [r3], #4
  102256. 8029ac8: 9105 str r1, [sp, #20]
  102257. 8029aca: 6800 ldr r0, [r0, #0]
  102258. 8029acc: 9301 str r3, [sp, #4]
  102259. 8029ace: a902 add r1, sp, #8
  102260. 8029ad0: f002 f8d2 bl 802bc78 <_svfiprintf_r>
  102261. 8029ad4: 9b02 ldr r3, [sp, #8]
  102262. 8029ad6: 2200 movs r2, #0
  102263. 8029ad8: 701a strb r2, [r3, #0]
  102264. 8029ada: b01c add sp, #112 @ 0x70
  102265. 8029adc: f85d eb04 ldr.w lr, [sp], #4
  102266. 8029ae0: b003 add sp, #12
  102267. 8029ae2: 4770 bx lr
  102268. 8029ae4: 240001d4 .word 0x240001d4
  102269. 8029ae8: ffff0208 .word 0xffff0208
  102270. 08029aec <__sread>:
  102271. 8029aec: b510 push {r4, lr}
  102272. 8029aee: 460c mov r4, r1
  102273. 8029af0: f9b1 100e ldrsh.w r1, [r1, #14]
  102274. 8029af4: f000 f992 bl 8029e1c <_read_r>
  102275. 8029af8: 2800 cmp r0, #0
  102276. 8029afa: bfab itete ge
  102277. 8029afc: 6d63 ldrge r3, [r4, #84] @ 0x54
  102278. 8029afe: 89a3 ldrhlt r3, [r4, #12]
  102279. 8029b00: 181b addge r3, r3, r0
  102280. 8029b02: f423 5380 biclt.w r3, r3, #4096 @ 0x1000
  102281. 8029b06: bfac ite ge
  102282. 8029b08: 6563 strge r3, [r4, #84] @ 0x54
  102283. 8029b0a: 81a3 strhlt r3, [r4, #12]
  102284. 8029b0c: bd10 pop {r4, pc}
  102285. 08029b0e <__swrite>:
  102286. 8029b0e: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  102287. 8029b12: 461f mov r7, r3
  102288. 8029b14: 898b ldrh r3, [r1, #12]
  102289. 8029b16: 05db lsls r3, r3, #23
  102290. 8029b18: 4605 mov r5, r0
  102291. 8029b1a: 460c mov r4, r1
  102292. 8029b1c: 4616 mov r6, r2
  102293. 8029b1e: d505 bpl.n 8029b2c <__swrite+0x1e>
  102294. 8029b20: f9b1 100e ldrsh.w r1, [r1, #14]
  102295. 8029b24: 2302 movs r3, #2
  102296. 8029b26: 2200 movs r2, #0
  102297. 8029b28: f000 f966 bl 8029df8 <_lseek_r>
  102298. 8029b2c: 89a3 ldrh r3, [r4, #12]
  102299. 8029b2e: f9b4 100e ldrsh.w r1, [r4, #14]
  102300. 8029b32: f423 5380 bic.w r3, r3, #4096 @ 0x1000
  102301. 8029b36: 81a3 strh r3, [r4, #12]
  102302. 8029b38: 4632 mov r2, r6
  102303. 8029b3a: 463b mov r3, r7
  102304. 8029b3c: 4628 mov r0, r5
  102305. 8029b3e: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  102306. 8029b42: f000 b98d b.w 8029e60 <_write_r>
  102307. 08029b46 <__sseek>:
  102308. 8029b46: b510 push {r4, lr}
  102309. 8029b48: 460c mov r4, r1
  102310. 8029b4a: f9b1 100e ldrsh.w r1, [r1, #14]
  102311. 8029b4e: f000 f953 bl 8029df8 <_lseek_r>
  102312. 8029b52: 1c43 adds r3, r0, #1
  102313. 8029b54: 89a3 ldrh r3, [r4, #12]
  102314. 8029b56: bf15 itete ne
  102315. 8029b58: 6560 strne r0, [r4, #84] @ 0x54
  102316. 8029b5a: f423 5380 biceq.w r3, r3, #4096 @ 0x1000
  102317. 8029b5e: f443 5380 orrne.w r3, r3, #4096 @ 0x1000
  102318. 8029b62: 81a3 strheq r3, [r4, #12]
  102319. 8029b64: bf18 it ne
  102320. 8029b66: 81a3 strhne r3, [r4, #12]
  102321. 8029b68: bd10 pop {r4, pc}
  102322. 08029b6a <__sclose>:
  102323. 8029b6a: f9b1 100e ldrsh.w r1, [r1, #14]
  102324. 8029b6e: f000 b8dd b.w 8029d2c <_close_r>
  102325. 08029b72 <__swbuf_r>:
  102326. 8029b72: b5f8 push {r3, r4, r5, r6, r7, lr}
  102327. 8029b74: 460e mov r6, r1
  102328. 8029b76: 4614 mov r4, r2
  102329. 8029b78: 4605 mov r5, r0
  102330. 8029b7a: b118 cbz r0, 8029b84 <__swbuf_r+0x12>
  102331. 8029b7c: 6a03 ldr r3, [r0, #32]
  102332. 8029b7e: b90b cbnz r3, 8029b84 <__swbuf_r+0x12>
  102333. 8029b80: f7ff feee bl 8029960 <__sinit>
  102334. 8029b84: 69a3 ldr r3, [r4, #24]
  102335. 8029b86: 60a3 str r3, [r4, #8]
  102336. 8029b88: 89a3 ldrh r3, [r4, #12]
  102337. 8029b8a: 071a lsls r2, r3, #28
  102338. 8029b8c: d501 bpl.n 8029b92 <__swbuf_r+0x20>
  102339. 8029b8e: 6923 ldr r3, [r4, #16]
  102340. 8029b90: b943 cbnz r3, 8029ba4 <__swbuf_r+0x32>
  102341. 8029b92: 4621 mov r1, r4
  102342. 8029b94: 4628 mov r0, r5
  102343. 8029b96: f000 f82b bl 8029bf0 <__swsetup_r>
  102344. 8029b9a: b118 cbz r0, 8029ba4 <__swbuf_r+0x32>
  102345. 8029b9c: f04f 37ff mov.w r7, #4294967295 @ 0xffffffff
  102346. 8029ba0: 4638 mov r0, r7
  102347. 8029ba2: bdf8 pop {r3, r4, r5, r6, r7, pc}
  102348. 8029ba4: 6823 ldr r3, [r4, #0]
  102349. 8029ba6: 6922 ldr r2, [r4, #16]
  102350. 8029ba8: 1a98 subs r0, r3, r2
  102351. 8029baa: 6963 ldr r3, [r4, #20]
  102352. 8029bac: b2f6 uxtb r6, r6
  102353. 8029bae: 4283 cmp r3, r0
  102354. 8029bb0: 4637 mov r7, r6
  102355. 8029bb2: dc05 bgt.n 8029bc0 <__swbuf_r+0x4e>
  102356. 8029bb4: 4621 mov r1, r4
  102357. 8029bb6: 4628 mov r0, r5
  102358. 8029bb8: f002 fb20 bl 802c1fc <_fflush_r>
  102359. 8029bbc: 2800 cmp r0, #0
  102360. 8029bbe: d1ed bne.n 8029b9c <__swbuf_r+0x2a>
  102361. 8029bc0: 68a3 ldr r3, [r4, #8]
  102362. 8029bc2: 3b01 subs r3, #1
  102363. 8029bc4: 60a3 str r3, [r4, #8]
  102364. 8029bc6: 6823 ldr r3, [r4, #0]
  102365. 8029bc8: 1c5a adds r2, r3, #1
  102366. 8029bca: 6022 str r2, [r4, #0]
  102367. 8029bcc: 701e strb r6, [r3, #0]
  102368. 8029bce: 6962 ldr r2, [r4, #20]
  102369. 8029bd0: 1c43 adds r3, r0, #1
  102370. 8029bd2: 429a cmp r2, r3
  102371. 8029bd4: d004 beq.n 8029be0 <__swbuf_r+0x6e>
  102372. 8029bd6: 89a3 ldrh r3, [r4, #12]
  102373. 8029bd8: 07db lsls r3, r3, #31
  102374. 8029bda: d5e1 bpl.n 8029ba0 <__swbuf_r+0x2e>
  102375. 8029bdc: 2e0a cmp r6, #10
  102376. 8029bde: d1df bne.n 8029ba0 <__swbuf_r+0x2e>
  102377. 8029be0: 4621 mov r1, r4
  102378. 8029be2: 4628 mov r0, r5
  102379. 8029be4: f002 fb0a bl 802c1fc <_fflush_r>
  102380. 8029be8: 2800 cmp r0, #0
  102381. 8029bea: d0d9 beq.n 8029ba0 <__swbuf_r+0x2e>
  102382. 8029bec: e7d6 b.n 8029b9c <__swbuf_r+0x2a>
  102383. ...
  102384. 08029bf0 <__swsetup_r>:
  102385. 8029bf0: b538 push {r3, r4, r5, lr}
  102386. 8029bf2: 4b29 ldr r3, [pc, #164] @ (8029c98 <__swsetup_r+0xa8>)
  102387. 8029bf4: 4605 mov r5, r0
  102388. 8029bf6: 6818 ldr r0, [r3, #0]
  102389. 8029bf8: 460c mov r4, r1
  102390. 8029bfa: b118 cbz r0, 8029c04 <__swsetup_r+0x14>
  102391. 8029bfc: 6a03 ldr r3, [r0, #32]
  102392. 8029bfe: b90b cbnz r3, 8029c04 <__swsetup_r+0x14>
  102393. 8029c00: f7ff feae bl 8029960 <__sinit>
  102394. 8029c04: f9b4 300c ldrsh.w r3, [r4, #12]
  102395. 8029c08: 0719 lsls r1, r3, #28
  102396. 8029c0a: d422 bmi.n 8029c52 <__swsetup_r+0x62>
  102397. 8029c0c: 06da lsls r2, r3, #27
  102398. 8029c0e: d407 bmi.n 8029c20 <__swsetup_r+0x30>
  102399. 8029c10: 2209 movs r2, #9
  102400. 8029c12: 602a str r2, [r5, #0]
  102401. 8029c14: f043 0340 orr.w r3, r3, #64 @ 0x40
  102402. 8029c18: 81a3 strh r3, [r4, #12]
  102403. 8029c1a: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  102404. 8029c1e: e033 b.n 8029c88 <__swsetup_r+0x98>
  102405. 8029c20: 0758 lsls r0, r3, #29
  102406. 8029c22: d512 bpl.n 8029c4a <__swsetup_r+0x5a>
  102407. 8029c24: 6b61 ldr r1, [r4, #52] @ 0x34
  102408. 8029c26: b141 cbz r1, 8029c3a <__swsetup_r+0x4a>
  102409. 8029c28: f104 0344 add.w r3, r4, #68 @ 0x44
  102410. 8029c2c: 4299 cmp r1, r3
  102411. 8029c2e: d002 beq.n 8029c36 <__swsetup_r+0x46>
  102412. 8029c30: 4628 mov r0, r5
  102413. 8029c32: f000 ff6b bl 802ab0c <_free_r>
  102414. 8029c36: 2300 movs r3, #0
  102415. 8029c38: 6363 str r3, [r4, #52] @ 0x34
  102416. 8029c3a: 89a3 ldrh r3, [r4, #12]
  102417. 8029c3c: f023 0324 bic.w r3, r3, #36 @ 0x24
  102418. 8029c40: 81a3 strh r3, [r4, #12]
  102419. 8029c42: 2300 movs r3, #0
  102420. 8029c44: 6063 str r3, [r4, #4]
  102421. 8029c46: 6923 ldr r3, [r4, #16]
  102422. 8029c48: 6023 str r3, [r4, #0]
  102423. 8029c4a: 89a3 ldrh r3, [r4, #12]
  102424. 8029c4c: f043 0308 orr.w r3, r3, #8
  102425. 8029c50: 81a3 strh r3, [r4, #12]
  102426. 8029c52: 6923 ldr r3, [r4, #16]
  102427. 8029c54: b94b cbnz r3, 8029c6a <__swsetup_r+0x7a>
  102428. 8029c56: 89a3 ldrh r3, [r4, #12]
  102429. 8029c58: f403 7320 and.w r3, r3, #640 @ 0x280
  102430. 8029c5c: f5b3 7f00 cmp.w r3, #512 @ 0x200
  102431. 8029c60: d003 beq.n 8029c6a <__swsetup_r+0x7a>
  102432. 8029c62: 4621 mov r1, r4
  102433. 8029c64: 4628 mov r0, r5
  102434. 8029c66: f002 fb29 bl 802c2bc <__smakebuf_r>
  102435. 8029c6a: f9b4 300c ldrsh.w r3, [r4, #12]
  102436. 8029c6e: f013 0201 ands.w r2, r3, #1
  102437. 8029c72: d00a beq.n 8029c8a <__swsetup_r+0x9a>
  102438. 8029c74: 2200 movs r2, #0
  102439. 8029c76: 60a2 str r2, [r4, #8]
  102440. 8029c78: 6962 ldr r2, [r4, #20]
  102441. 8029c7a: 4252 negs r2, r2
  102442. 8029c7c: 61a2 str r2, [r4, #24]
  102443. 8029c7e: 6922 ldr r2, [r4, #16]
  102444. 8029c80: b942 cbnz r2, 8029c94 <__swsetup_r+0xa4>
  102445. 8029c82: f013 0080 ands.w r0, r3, #128 @ 0x80
  102446. 8029c86: d1c5 bne.n 8029c14 <__swsetup_r+0x24>
  102447. 8029c88: bd38 pop {r3, r4, r5, pc}
  102448. 8029c8a: 0799 lsls r1, r3, #30
  102449. 8029c8c: bf58 it pl
  102450. 8029c8e: 6962 ldrpl r2, [r4, #20]
  102451. 8029c90: 60a2 str r2, [r4, #8]
  102452. 8029c92: e7f4 b.n 8029c7e <__swsetup_r+0x8e>
  102453. 8029c94: 2000 movs r0, #0
  102454. 8029c96: e7f7 b.n 8029c88 <__swsetup_r+0x98>
  102455. 8029c98: 240001d4 .word 0x240001d4
  102456. 08029c9c <memcmp>:
  102457. 8029c9c: b510 push {r4, lr}
  102458. 8029c9e: 3901 subs r1, #1
  102459. 8029ca0: 4402 add r2, r0
  102460. 8029ca2: 4290 cmp r0, r2
  102461. 8029ca4: d101 bne.n 8029caa <memcmp+0xe>
  102462. 8029ca6: 2000 movs r0, #0
  102463. 8029ca8: e005 b.n 8029cb6 <memcmp+0x1a>
  102464. 8029caa: 7803 ldrb r3, [r0, #0]
  102465. 8029cac: f811 4f01 ldrb.w r4, [r1, #1]!
  102466. 8029cb0: 42a3 cmp r3, r4
  102467. 8029cb2: d001 beq.n 8029cb8 <memcmp+0x1c>
  102468. 8029cb4: 1b18 subs r0, r3, r4
  102469. 8029cb6: bd10 pop {r4, pc}
  102470. 8029cb8: 3001 adds r0, #1
  102471. 8029cba: e7f2 b.n 8029ca2 <memcmp+0x6>
  102472. 08029cbc <memmove>:
  102473. 8029cbc: 4288 cmp r0, r1
  102474. 8029cbe: b510 push {r4, lr}
  102475. 8029cc0: eb01 0402 add.w r4, r1, r2
  102476. 8029cc4: d902 bls.n 8029ccc <memmove+0x10>
  102477. 8029cc6: 4284 cmp r4, r0
  102478. 8029cc8: 4623 mov r3, r4
  102479. 8029cca: d807 bhi.n 8029cdc <memmove+0x20>
  102480. 8029ccc: 1e43 subs r3, r0, #1
  102481. 8029cce: 42a1 cmp r1, r4
  102482. 8029cd0: d008 beq.n 8029ce4 <memmove+0x28>
  102483. 8029cd2: f811 2b01 ldrb.w r2, [r1], #1
  102484. 8029cd6: f803 2f01 strb.w r2, [r3, #1]!
  102485. 8029cda: e7f8 b.n 8029cce <memmove+0x12>
  102486. 8029cdc: 4402 add r2, r0
  102487. 8029cde: 4601 mov r1, r0
  102488. 8029ce0: 428a cmp r2, r1
  102489. 8029ce2: d100 bne.n 8029ce6 <memmove+0x2a>
  102490. 8029ce4: bd10 pop {r4, pc}
  102491. 8029ce6: f813 4d01 ldrb.w r4, [r3, #-1]!
  102492. 8029cea: f802 4d01 strb.w r4, [r2, #-1]!
  102493. 8029cee: e7f7 b.n 8029ce0 <memmove+0x24>
  102494. 08029cf0 <memset>:
  102495. 8029cf0: 4402 add r2, r0
  102496. 8029cf2: 4603 mov r3, r0
  102497. 8029cf4: 4293 cmp r3, r2
  102498. 8029cf6: d100 bne.n 8029cfa <memset+0xa>
  102499. 8029cf8: 4770 bx lr
  102500. 8029cfa: f803 1b01 strb.w r1, [r3], #1
  102501. 8029cfe: e7f9 b.n 8029cf4 <memset+0x4>
  102502. 08029d00 <strncmp>:
  102503. 8029d00: b510 push {r4, lr}
  102504. 8029d02: b16a cbz r2, 8029d20 <strncmp+0x20>
  102505. 8029d04: 3901 subs r1, #1
  102506. 8029d06: 1884 adds r4, r0, r2
  102507. 8029d08: f810 2b01 ldrb.w r2, [r0], #1
  102508. 8029d0c: f811 3f01 ldrb.w r3, [r1, #1]!
  102509. 8029d10: 429a cmp r2, r3
  102510. 8029d12: d103 bne.n 8029d1c <strncmp+0x1c>
  102511. 8029d14: 42a0 cmp r0, r4
  102512. 8029d16: d001 beq.n 8029d1c <strncmp+0x1c>
  102513. 8029d18: 2a00 cmp r2, #0
  102514. 8029d1a: d1f5 bne.n 8029d08 <strncmp+0x8>
  102515. 8029d1c: 1ad0 subs r0, r2, r3
  102516. 8029d1e: bd10 pop {r4, pc}
  102517. 8029d20: 4610 mov r0, r2
  102518. 8029d22: e7fc b.n 8029d1e <strncmp+0x1e>
  102519. 08029d24 <_localeconv_r>:
  102520. 8029d24: 4800 ldr r0, [pc, #0] @ (8029d28 <_localeconv_r+0x4>)
  102521. 8029d26: 4770 bx lr
  102522. 8029d28: 24000158 .word 0x24000158
  102523. 08029d2c <_close_r>:
  102524. 8029d2c: b538 push {r3, r4, r5, lr}
  102525. 8029d2e: 4d06 ldr r5, [pc, #24] @ (8029d48 <_close_r+0x1c>)
  102526. 8029d30: 2300 movs r3, #0
  102527. 8029d32: 4604 mov r4, r0
  102528. 8029d34: 4608 mov r0, r1
  102529. 8029d36: 602b str r3, [r5, #0]
  102530. 8029d38: f7d9 ff3c bl 8003bb4 <_close>
  102531. 8029d3c: 1c43 adds r3, r0, #1
  102532. 8029d3e: d102 bne.n 8029d46 <_close_r+0x1a>
  102533. 8029d40: 682b ldr r3, [r5, #0]
  102534. 8029d42: b103 cbz r3, 8029d46 <_close_r+0x1a>
  102535. 8029d44: 6023 str r3, [r4, #0]
  102536. 8029d46: bd38 pop {r3, r4, r5, pc}
  102537. 8029d48: 2402b180 .word 0x2402b180
  102538. 08029d4c <_reclaim_reent>:
  102539. 8029d4c: 4b29 ldr r3, [pc, #164] @ (8029df4 <_reclaim_reent+0xa8>)
  102540. 8029d4e: 681b ldr r3, [r3, #0]
  102541. 8029d50: 4283 cmp r3, r0
  102542. 8029d52: b570 push {r4, r5, r6, lr}
  102543. 8029d54: 4604 mov r4, r0
  102544. 8029d56: d04b beq.n 8029df0 <_reclaim_reent+0xa4>
  102545. 8029d58: 69c3 ldr r3, [r0, #28]
  102546. 8029d5a: b1ab cbz r3, 8029d88 <_reclaim_reent+0x3c>
  102547. 8029d5c: 68db ldr r3, [r3, #12]
  102548. 8029d5e: b16b cbz r3, 8029d7c <_reclaim_reent+0x30>
  102549. 8029d60: 2500 movs r5, #0
  102550. 8029d62: 69e3 ldr r3, [r4, #28]
  102551. 8029d64: 68db ldr r3, [r3, #12]
  102552. 8029d66: 5959 ldr r1, [r3, r5]
  102553. 8029d68: 2900 cmp r1, #0
  102554. 8029d6a: d13b bne.n 8029de4 <_reclaim_reent+0x98>
  102555. 8029d6c: 3504 adds r5, #4
  102556. 8029d6e: 2d80 cmp r5, #128 @ 0x80
  102557. 8029d70: d1f7 bne.n 8029d62 <_reclaim_reent+0x16>
  102558. 8029d72: 69e3 ldr r3, [r4, #28]
  102559. 8029d74: 4620 mov r0, r4
  102560. 8029d76: 68d9 ldr r1, [r3, #12]
  102561. 8029d78: f000 fec8 bl 802ab0c <_free_r>
  102562. 8029d7c: 69e3 ldr r3, [r4, #28]
  102563. 8029d7e: 6819 ldr r1, [r3, #0]
  102564. 8029d80: b111 cbz r1, 8029d88 <_reclaim_reent+0x3c>
  102565. 8029d82: 4620 mov r0, r4
  102566. 8029d84: f000 fec2 bl 802ab0c <_free_r>
  102567. 8029d88: 6961 ldr r1, [r4, #20]
  102568. 8029d8a: b111 cbz r1, 8029d92 <_reclaim_reent+0x46>
  102569. 8029d8c: 4620 mov r0, r4
  102570. 8029d8e: f000 febd bl 802ab0c <_free_r>
  102571. 8029d92: 69e1 ldr r1, [r4, #28]
  102572. 8029d94: b111 cbz r1, 8029d9c <_reclaim_reent+0x50>
  102573. 8029d96: 4620 mov r0, r4
  102574. 8029d98: f000 feb8 bl 802ab0c <_free_r>
  102575. 8029d9c: 6b21 ldr r1, [r4, #48] @ 0x30
  102576. 8029d9e: b111 cbz r1, 8029da6 <_reclaim_reent+0x5a>
  102577. 8029da0: 4620 mov r0, r4
  102578. 8029da2: f000 feb3 bl 802ab0c <_free_r>
  102579. 8029da6: 6b61 ldr r1, [r4, #52] @ 0x34
  102580. 8029da8: b111 cbz r1, 8029db0 <_reclaim_reent+0x64>
  102581. 8029daa: 4620 mov r0, r4
  102582. 8029dac: f000 feae bl 802ab0c <_free_r>
  102583. 8029db0: 6ba1 ldr r1, [r4, #56] @ 0x38
  102584. 8029db2: b111 cbz r1, 8029dba <_reclaim_reent+0x6e>
  102585. 8029db4: 4620 mov r0, r4
  102586. 8029db6: f000 fea9 bl 802ab0c <_free_r>
  102587. 8029dba: 6ca1 ldr r1, [r4, #72] @ 0x48
  102588. 8029dbc: b111 cbz r1, 8029dc4 <_reclaim_reent+0x78>
  102589. 8029dbe: 4620 mov r0, r4
  102590. 8029dc0: f000 fea4 bl 802ab0c <_free_r>
  102591. 8029dc4: 6c61 ldr r1, [r4, #68] @ 0x44
  102592. 8029dc6: b111 cbz r1, 8029dce <_reclaim_reent+0x82>
  102593. 8029dc8: 4620 mov r0, r4
  102594. 8029dca: f000 fe9f bl 802ab0c <_free_r>
  102595. 8029dce: 6ae1 ldr r1, [r4, #44] @ 0x2c
  102596. 8029dd0: b111 cbz r1, 8029dd8 <_reclaim_reent+0x8c>
  102597. 8029dd2: 4620 mov r0, r4
  102598. 8029dd4: f000 fe9a bl 802ab0c <_free_r>
  102599. 8029dd8: 6a23 ldr r3, [r4, #32]
  102600. 8029dda: b14b cbz r3, 8029df0 <_reclaim_reent+0xa4>
  102601. 8029ddc: 4620 mov r0, r4
  102602. 8029dde: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  102603. 8029de2: 4718 bx r3
  102604. 8029de4: 680e ldr r6, [r1, #0]
  102605. 8029de6: 4620 mov r0, r4
  102606. 8029de8: f000 fe90 bl 802ab0c <_free_r>
  102607. 8029dec: 4631 mov r1, r6
  102608. 8029dee: e7bb b.n 8029d68 <_reclaim_reent+0x1c>
  102609. 8029df0: bd70 pop {r4, r5, r6, pc}
  102610. 8029df2: bf00 nop
  102611. 8029df4: 240001d4 .word 0x240001d4
  102612. 08029df8 <_lseek_r>:
  102613. 8029df8: b538 push {r3, r4, r5, lr}
  102614. 8029dfa: 4d07 ldr r5, [pc, #28] @ (8029e18 <_lseek_r+0x20>)
  102615. 8029dfc: 4604 mov r4, r0
  102616. 8029dfe: 4608 mov r0, r1
  102617. 8029e00: 4611 mov r1, r2
  102618. 8029e02: 2200 movs r2, #0
  102619. 8029e04: 602a str r2, [r5, #0]
  102620. 8029e06: 461a mov r2, r3
  102621. 8029e08: f7d9 fefb bl 8003c02 <_lseek>
  102622. 8029e0c: 1c43 adds r3, r0, #1
  102623. 8029e0e: d102 bne.n 8029e16 <_lseek_r+0x1e>
  102624. 8029e10: 682b ldr r3, [r5, #0]
  102625. 8029e12: b103 cbz r3, 8029e16 <_lseek_r+0x1e>
  102626. 8029e14: 6023 str r3, [r4, #0]
  102627. 8029e16: bd38 pop {r3, r4, r5, pc}
  102628. 8029e18: 2402b180 .word 0x2402b180
  102629. 08029e1c <_read_r>:
  102630. 8029e1c: b538 push {r3, r4, r5, lr}
  102631. 8029e1e: 4d07 ldr r5, [pc, #28] @ (8029e3c <_read_r+0x20>)
  102632. 8029e20: 4604 mov r4, r0
  102633. 8029e22: 4608 mov r0, r1
  102634. 8029e24: 4611 mov r1, r2
  102635. 8029e26: 2200 movs r2, #0
  102636. 8029e28: 602a str r2, [r5, #0]
  102637. 8029e2a: 461a mov r2, r3
  102638. 8029e2c: f7d9 fe89 bl 8003b42 <_read>
  102639. 8029e30: 1c43 adds r3, r0, #1
  102640. 8029e32: d102 bne.n 8029e3a <_read_r+0x1e>
  102641. 8029e34: 682b ldr r3, [r5, #0]
  102642. 8029e36: b103 cbz r3, 8029e3a <_read_r+0x1e>
  102643. 8029e38: 6023 str r3, [r4, #0]
  102644. 8029e3a: bd38 pop {r3, r4, r5, pc}
  102645. 8029e3c: 2402b180 .word 0x2402b180
  102646. 08029e40 <_sbrk_r>:
  102647. 8029e40: b538 push {r3, r4, r5, lr}
  102648. 8029e42: 4d06 ldr r5, [pc, #24] @ (8029e5c <_sbrk_r+0x1c>)
  102649. 8029e44: 2300 movs r3, #0
  102650. 8029e46: 4604 mov r4, r0
  102651. 8029e48: 4608 mov r0, r1
  102652. 8029e4a: 602b str r3, [r5, #0]
  102653. 8029e4c: f7d9 fee6 bl 8003c1c <_sbrk>
  102654. 8029e50: 1c43 adds r3, r0, #1
  102655. 8029e52: d102 bne.n 8029e5a <_sbrk_r+0x1a>
  102656. 8029e54: 682b ldr r3, [r5, #0]
  102657. 8029e56: b103 cbz r3, 8029e5a <_sbrk_r+0x1a>
  102658. 8029e58: 6023 str r3, [r4, #0]
  102659. 8029e5a: bd38 pop {r3, r4, r5, pc}
  102660. 8029e5c: 2402b180 .word 0x2402b180
  102661. 08029e60 <_write_r>:
  102662. 8029e60: b538 push {r3, r4, r5, lr}
  102663. 8029e62: 4d07 ldr r5, [pc, #28] @ (8029e80 <_write_r+0x20>)
  102664. 8029e64: 4604 mov r4, r0
  102665. 8029e66: 4608 mov r0, r1
  102666. 8029e68: 4611 mov r1, r2
  102667. 8029e6a: 2200 movs r2, #0
  102668. 8029e6c: 602a str r2, [r5, #0]
  102669. 8029e6e: 461a mov r2, r3
  102670. 8029e70: f7d9 fe84 bl 8003b7c <_write>
  102671. 8029e74: 1c43 adds r3, r0, #1
  102672. 8029e76: d102 bne.n 8029e7e <_write_r+0x1e>
  102673. 8029e78: 682b ldr r3, [r5, #0]
  102674. 8029e7a: b103 cbz r3, 8029e7e <_write_r+0x1e>
  102675. 8029e7c: 6023 str r3, [r4, #0]
  102676. 8029e7e: bd38 pop {r3, r4, r5, pc}
  102677. 8029e80: 2402b180 .word 0x2402b180
  102678. 08029e84 <__errno>:
  102679. 8029e84: 4b01 ldr r3, [pc, #4] @ (8029e8c <__errno+0x8>)
  102680. 8029e86: 6818 ldr r0, [r3, #0]
  102681. 8029e88: 4770 bx lr
  102682. 8029e8a: bf00 nop
  102683. 8029e8c: 240001d4 .word 0x240001d4
  102684. 08029e90 <__libc_init_array>:
  102685. 8029e90: b570 push {r4, r5, r6, lr}
  102686. 8029e92: 4d0d ldr r5, [pc, #52] @ (8029ec8 <__libc_init_array+0x38>)
  102687. 8029e94: 4c0d ldr r4, [pc, #52] @ (8029ecc <__libc_init_array+0x3c>)
  102688. 8029e96: 1b64 subs r4, r4, r5
  102689. 8029e98: 10a4 asrs r4, r4, #2
  102690. 8029e9a: 2600 movs r6, #0
  102691. 8029e9c: 42a6 cmp r6, r4
  102692. 8029e9e: d109 bne.n 8029eb4 <__libc_init_array+0x24>
  102693. 8029ea0: 4d0b ldr r5, [pc, #44] @ (8029ed0 <__libc_init_array+0x40>)
  102694. 8029ea2: 4c0c ldr r4, [pc, #48] @ (8029ed4 <__libc_init_array+0x44>)
  102695. 8029ea4: f002 fac8 bl 802c438 <_init>
  102696. 8029ea8: 1b64 subs r4, r4, r5
  102697. 8029eaa: 10a4 asrs r4, r4, #2
  102698. 8029eac: 2600 movs r6, #0
  102699. 8029eae: 42a6 cmp r6, r4
  102700. 8029eb0: d105 bne.n 8029ebe <__libc_init_array+0x2e>
  102701. 8029eb2: bd70 pop {r4, r5, r6, pc}
  102702. 8029eb4: f855 3b04 ldr.w r3, [r5], #4
  102703. 8029eb8: 4798 blx r3
  102704. 8029eba: 3601 adds r6, #1
  102705. 8029ebc: e7ee b.n 8029e9c <__libc_init_array+0xc>
  102706. 8029ebe: f855 3b04 ldr.w r3, [r5], #4
  102707. 8029ec2: 4798 blx r3
  102708. 8029ec4: 3601 adds r6, #1
  102709. 8029ec6: e7f2 b.n 8029eae <__libc_init_array+0x1e>
  102710. 8029ec8: 080310ac .word 0x080310ac
  102711. 8029ecc: 080310ac .word 0x080310ac
  102712. 8029ed0: 080310ac .word 0x080310ac
  102713. 8029ed4: 080310b0 .word 0x080310b0
  102714. 08029ed8 <__retarget_lock_init_recursive>:
  102715. 8029ed8: 4770 bx lr
  102716. 08029eda <__retarget_lock_acquire_recursive>:
  102717. 8029eda: 4770 bx lr
  102718. 08029edc <__retarget_lock_release_recursive>:
  102719. 8029edc: 4770 bx lr
  102720. 08029ede <memcpy>:
  102721. 8029ede: 440a add r2, r1
  102722. 8029ee0: 4291 cmp r1, r2
  102723. 8029ee2: f100 33ff add.w r3, r0, #4294967295 @ 0xffffffff
  102724. 8029ee6: d100 bne.n 8029eea <memcpy+0xc>
  102725. 8029ee8: 4770 bx lr
  102726. 8029eea: b510 push {r4, lr}
  102727. 8029eec: f811 4b01 ldrb.w r4, [r1], #1
  102728. 8029ef0: f803 4f01 strb.w r4, [r3, #1]!
  102729. 8029ef4: 4291 cmp r1, r2
  102730. 8029ef6: d1f9 bne.n 8029eec <memcpy+0xe>
  102731. 8029ef8: bd10 pop {r4, pc}
  102732. 8029efa: 0000 movs r0, r0
  102733. 8029efc: 0000 movs r0, r0
  102734. ...
  102735. 08029f00 <nan>:
  102736. 8029f00: ed9f 0b01 vldr d0, [pc, #4] @ 8029f08 <nan+0x8>
  102737. 8029f04: 4770 bx lr
  102738. 8029f06: bf00 nop
  102739. 8029f08: 00000000 .word 0x00000000
  102740. 8029f0c: 7ff80000 .word 0x7ff80000
  102741. 08029f10 <__assert_func>:
  102742. 8029f10: b51f push {r0, r1, r2, r3, r4, lr}
  102743. 8029f12: 4614 mov r4, r2
  102744. 8029f14: 461a mov r2, r3
  102745. 8029f16: 4b09 ldr r3, [pc, #36] @ (8029f3c <__assert_func+0x2c>)
  102746. 8029f18: 681b ldr r3, [r3, #0]
  102747. 8029f1a: 4605 mov r5, r0
  102748. 8029f1c: 68d8 ldr r0, [r3, #12]
  102749. 8029f1e: b954 cbnz r4, 8029f36 <__assert_func+0x26>
  102750. 8029f20: 4b07 ldr r3, [pc, #28] @ (8029f40 <__assert_func+0x30>)
  102751. 8029f22: 461c mov r4, r3
  102752. 8029f24: e9cd 3401 strd r3, r4, [sp, #4]
  102753. 8029f28: 9100 str r1, [sp, #0]
  102754. 8029f2a: 462b mov r3, r5
  102755. 8029f2c: 4905 ldr r1, [pc, #20] @ (8029f44 <__assert_func+0x34>)
  102756. 8029f2e: f002 f98d bl 802c24c <fiprintf>
  102757. 8029f32: f002 fa21 bl 802c378 <abort>
  102758. 8029f36: 4b04 ldr r3, [pc, #16] @ (8029f48 <__assert_func+0x38>)
  102759. 8029f38: e7f4 b.n 8029f24 <__assert_func+0x14>
  102760. 8029f3a: bf00 nop
  102761. 8029f3c: 240001d4 .word 0x240001d4
  102762. 8029f40: 08030e60 .word 0x08030e60
  102763. 8029f44: 08030e32 .word 0x08030e32
  102764. 8029f48: 08030e25 .word 0x08030e25
  102765. 08029f4c <quorem>:
  102766. 8029f4c: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  102767. 8029f50: 6903 ldr r3, [r0, #16]
  102768. 8029f52: 690c ldr r4, [r1, #16]
  102769. 8029f54: 42a3 cmp r3, r4
  102770. 8029f56: 4607 mov r7, r0
  102771. 8029f58: db7e blt.n 802a058 <quorem+0x10c>
  102772. 8029f5a: 3c01 subs r4, #1
  102773. 8029f5c: f101 0814 add.w r8, r1, #20
  102774. 8029f60: 00a3 lsls r3, r4, #2
  102775. 8029f62: f100 0514 add.w r5, r0, #20
  102776. 8029f66: 9300 str r3, [sp, #0]
  102777. 8029f68: eb05 0384 add.w r3, r5, r4, lsl #2
  102778. 8029f6c: 9301 str r3, [sp, #4]
  102779. 8029f6e: f858 3024 ldr.w r3, [r8, r4, lsl #2]
  102780. 8029f72: f855 2024 ldr.w r2, [r5, r4, lsl #2]
  102781. 8029f76: 3301 adds r3, #1
  102782. 8029f78: 429a cmp r2, r3
  102783. 8029f7a: eb08 0984 add.w r9, r8, r4, lsl #2
  102784. 8029f7e: fbb2 f6f3 udiv r6, r2, r3
  102785. 8029f82: d32e bcc.n 8029fe2 <quorem+0x96>
  102786. 8029f84: f04f 0a00 mov.w sl, #0
  102787. 8029f88: 46c4 mov ip, r8
  102788. 8029f8a: 46ae mov lr, r5
  102789. 8029f8c: 46d3 mov fp, sl
  102790. 8029f8e: f85c 3b04 ldr.w r3, [ip], #4
  102791. 8029f92: b298 uxth r0, r3
  102792. 8029f94: fb06 a000 mla r0, r6, r0, sl
  102793. 8029f98: 0c02 lsrs r2, r0, #16
  102794. 8029f9a: 0c1b lsrs r3, r3, #16
  102795. 8029f9c: fb06 2303 mla r3, r6, r3, r2
  102796. 8029fa0: f8de 2000 ldr.w r2, [lr]
  102797. 8029fa4: b280 uxth r0, r0
  102798. 8029fa6: b292 uxth r2, r2
  102799. 8029fa8: 1a12 subs r2, r2, r0
  102800. 8029faa: 445a add r2, fp
  102801. 8029fac: f8de 0000 ldr.w r0, [lr]
  102802. 8029fb0: ea4f 4a13 mov.w sl, r3, lsr #16
  102803. 8029fb4: b29b uxth r3, r3
  102804. 8029fb6: ebc3 4322 rsb r3, r3, r2, asr #16
  102805. 8029fba: eb03 4310 add.w r3, r3, r0, lsr #16
  102806. 8029fbe: b292 uxth r2, r2
  102807. 8029fc0: ea42 4203 orr.w r2, r2, r3, lsl #16
  102808. 8029fc4: 45e1 cmp r9, ip
  102809. 8029fc6: f84e 2b04 str.w r2, [lr], #4
  102810. 8029fca: ea4f 4b23 mov.w fp, r3, asr #16
  102811. 8029fce: d2de bcs.n 8029f8e <quorem+0x42>
  102812. 8029fd0: 9b00 ldr r3, [sp, #0]
  102813. 8029fd2: 58eb ldr r3, [r5, r3]
  102814. 8029fd4: b92b cbnz r3, 8029fe2 <quorem+0x96>
  102815. 8029fd6: 9b01 ldr r3, [sp, #4]
  102816. 8029fd8: 3b04 subs r3, #4
  102817. 8029fda: 429d cmp r5, r3
  102818. 8029fdc: 461a mov r2, r3
  102819. 8029fde: d32f bcc.n 802a040 <quorem+0xf4>
  102820. 8029fe0: 613c str r4, [r7, #16]
  102821. 8029fe2: 4638 mov r0, r7
  102822. 8029fe4: f001 fbec bl 802b7c0 <__mcmp>
  102823. 8029fe8: 2800 cmp r0, #0
  102824. 8029fea: db25 blt.n 802a038 <quorem+0xec>
  102825. 8029fec: 4629 mov r1, r5
  102826. 8029fee: 2000 movs r0, #0
  102827. 8029ff0: f858 2b04 ldr.w r2, [r8], #4
  102828. 8029ff4: f8d1 c000 ldr.w ip, [r1]
  102829. 8029ff8: fa1f fe82 uxth.w lr, r2
  102830. 8029ffc: fa1f f38c uxth.w r3, ip
  102831. 802a000: eba3 030e sub.w r3, r3, lr
  102832. 802a004: 4403 add r3, r0
  102833. 802a006: 0c12 lsrs r2, r2, #16
  102834. 802a008: ebc2 4223 rsb r2, r2, r3, asr #16
  102835. 802a00c: eb02 421c add.w r2, r2, ip, lsr #16
  102836. 802a010: b29b uxth r3, r3
  102837. 802a012: ea43 4302 orr.w r3, r3, r2, lsl #16
  102838. 802a016: 45c1 cmp r9, r8
  102839. 802a018: f841 3b04 str.w r3, [r1], #4
  102840. 802a01c: ea4f 4022 mov.w r0, r2, asr #16
  102841. 802a020: d2e6 bcs.n 8029ff0 <quorem+0xa4>
  102842. 802a022: f855 2024 ldr.w r2, [r5, r4, lsl #2]
  102843. 802a026: eb05 0384 add.w r3, r5, r4, lsl #2
  102844. 802a02a: b922 cbnz r2, 802a036 <quorem+0xea>
  102845. 802a02c: 3b04 subs r3, #4
  102846. 802a02e: 429d cmp r5, r3
  102847. 802a030: 461a mov r2, r3
  102848. 802a032: d30b bcc.n 802a04c <quorem+0x100>
  102849. 802a034: 613c str r4, [r7, #16]
  102850. 802a036: 3601 adds r6, #1
  102851. 802a038: 4630 mov r0, r6
  102852. 802a03a: b003 add sp, #12
  102853. 802a03c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  102854. 802a040: 6812 ldr r2, [r2, #0]
  102855. 802a042: 3b04 subs r3, #4
  102856. 802a044: 2a00 cmp r2, #0
  102857. 802a046: d1cb bne.n 8029fe0 <quorem+0x94>
  102858. 802a048: 3c01 subs r4, #1
  102859. 802a04a: e7c6 b.n 8029fda <quorem+0x8e>
  102860. 802a04c: 6812 ldr r2, [r2, #0]
  102861. 802a04e: 3b04 subs r3, #4
  102862. 802a050: 2a00 cmp r2, #0
  102863. 802a052: d1ef bne.n 802a034 <quorem+0xe8>
  102864. 802a054: 3c01 subs r4, #1
  102865. 802a056: e7ea b.n 802a02e <quorem+0xe2>
  102866. 802a058: 2000 movs r0, #0
  102867. 802a05a: e7ee b.n 802a03a <quorem+0xee>
  102868. 802a05c: 0000 movs r0, r0
  102869. ...
  102870. 0802a060 <_dtoa_r>:
  102871. 802a060: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  102872. 802a064: ed2d 8b02 vpush {d8}
  102873. 802a068: 69c7 ldr r7, [r0, #28]
  102874. 802a06a: b091 sub sp, #68 @ 0x44
  102875. 802a06c: ed8d 0b02 vstr d0, [sp, #8]
  102876. 802a070: ec55 4b10 vmov r4, r5, d0
  102877. 802a074: 9e1c ldr r6, [sp, #112] @ 0x70
  102878. 802a076: 9107 str r1, [sp, #28]
  102879. 802a078: 4681 mov r9, r0
  102880. 802a07a: 9209 str r2, [sp, #36] @ 0x24
  102881. 802a07c: 930d str r3, [sp, #52] @ 0x34
  102882. 802a07e: b97f cbnz r7, 802a0a0 <_dtoa_r+0x40>
  102883. 802a080: 2010 movs r0, #16
  102884. 802a082: f7fe f8bb bl 80281fc <malloc>
  102885. 802a086: 4602 mov r2, r0
  102886. 802a088: f8c9 001c str.w r0, [r9, #28]
  102887. 802a08c: b920 cbnz r0, 802a098 <_dtoa_r+0x38>
  102888. 802a08e: 4ba0 ldr r3, [pc, #640] @ (802a310 <_dtoa_r+0x2b0>)
  102889. 802a090: 21ef movs r1, #239 @ 0xef
  102890. 802a092: 48a0 ldr r0, [pc, #640] @ (802a314 <_dtoa_r+0x2b4>)
  102891. 802a094: f7ff ff3c bl 8029f10 <__assert_func>
  102892. 802a098: e9c0 7701 strd r7, r7, [r0, #4]
  102893. 802a09c: 6007 str r7, [r0, #0]
  102894. 802a09e: 60c7 str r7, [r0, #12]
  102895. 802a0a0: f8d9 301c ldr.w r3, [r9, #28]
  102896. 802a0a4: 6819 ldr r1, [r3, #0]
  102897. 802a0a6: b159 cbz r1, 802a0c0 <_dtoa_r+0x60>
  102898. 802a0a8: 685a ldr r2, [r3, #4]
  102899. 802a0aa: 604a str r2, [r1, #4]
  102900. 802a0ac: 2301 movs r3, #1
  102901. 802a0ae: 4093 lsls r3, r2
  102902. 802a0b0: 608b str r3, [r1, #8]
  102903. 802a0b2: 4648 mov r0, r9
  102904. 802a0b4: f001 f900 bl 802b2b8 <_Bfree>
  102905. 802a0b8: f8d9 301c ldr.w r3, [r9, #28]
  102906. 802a0bc: 2200 movs r2, #0
  102907. 802a0be: 601a str r2, [r3, #0]
  102908. 802a0c0: 1e2b subs r3, r5, #0
  102909. 802a0c2: bfbb ittet lt
  102910. 802a0c4: f023 4300 biclt.w r3, r3, #2147483648 @ 0x80000000
  102911. 802a0c8: 9303 strlt r3, [sp, #12]
  102912. 802a0ca: 2300 movge r3, #0
  102913. 802a0cc: 2201 movlt r2, #1
  102914. 802a0ce: bfac ite ge
  102915. 802a0d0: 6033 strge r3, [r6, #0]
  102916. 802a0d2: 6032 strlt r2, [r6, #0]
  102917. 802a0d4: 4b90 ldr r3, [pc, #576] @ (802a318 <_dtoa_r+0x2b8>)
  102918. 802a0d6: 9e03 ldr r6, [sp, #12]
  102919. 802a0d8: 43b3 bics r3, r6
  102920. 802a0da: d110 bne.n 802a0fe <_dtoa_r+0x9e>
  102921. 802a0dc: 9a0d ldr r2, [sp, #52] @ 0x34
  102922. 802a0de: f242 730f movw r3, #9999 @ 0x270f
  102923. 802a0e2: 6013 str r3, [r2, #0]
  102924. 802a0e4: f3c6 0313 ubfx r3, r6, #0, #20
  102925. 802a0e8: 4323 orrs r3, r4
  102926. 802a0ea: f000 84de beq.w 802aaaa <_dtoa_r+0xa4a>
  102927. 802a0ee: 9b1d ldr r3, [sp, #116] @ 0x74
  102928. 802a0f0: 4f8a ldr r7, [pc, #552] @ (802a31c <_dtoa_r+0x2bc>)
  102929. 802a0f2: 2b00 cmp r3, #0
  102930. 802a0f4: f000 84e0 beq.w 802aab8 <_dtoa_r+0xa58>
  102931. 802a0f8: 1cfb adds r3, r7, #3
  102932. 802a0fa: f000 bcdb b.w 802aab4 <_dtoa_r+0xa54>
  102933. 802a0fe: ed9d 8b02 vldr d8, [sp, #8]
  102934. 802a102: eeb5 8b40 vcmp.f64 d8, #0.0
  102935. 802a106: eef1 fa10 vmrs APSR_nzcv, fpscr
  102936. 802a10a: d10a bne.n 802a122 <_dtoa_r+0xc2>
  102937. 802a10c: 9a0d ldr r2, [sp, #52] @ 0x34
  102938. 802a10e: 2301 movs r3, #1
  102939. 802a110: 6013 str r3, [r2, #0]
  102940. 802a112: 9b1d ldr r3, [sp, #116] @ 0x74
  102941. 802a114: b113 cbz r3, 802a11c <_dtoa_r+0xbc>
  102942. 802a116: 9a1d ldr r2, [sp, #116] @ 0x74
  102943. 802a118: 4b81 ldr r3, [pc, #516] @ (802a320 <_dtoa_r+0x2c0>)
  102944. 802a11a: 6013 str r3, [r2, #0]
  102945. 802a11c: 4f81 ldr r7, [pc, #516] @ (802a324 <_dtoa_r+0x2c4>)
  102946. 802a11e: f000 bccb b.w 802aab8 <_dtoa_r+0xa58>
  102947. 802a122: aa0e add r2, sp, #56 @ 0x38
  102948. 802a124: a90f add r1, sp, #60 @ 0x3c
  102949. 802a126: 4648 mov r0, r9
  102950. 802a128: eeb0 0b48 vmov.f64 d0, d8
  102951. 802a12c: f001 fc68 bl 802ba00 <__d2b>
  102952. 802a130: f3c6 530a ubfx r3, r6, #20, #11
  102953. 802a134: 9a0e ldr r2, [sp, #56] @ 0x38
  102954. 802a136: 9001 str r0, [sp, #4]
  102955. 802a138: 2b00 cmp r3, #0
  102956. 802a13a: d045 beq.n 802a1c8 <_dtoa_r+0x168>
  102957. 802a13c: eeb0 7b48 vmov.f64 d7, d8
  102958. 802a140: ee18 1a90 vmov r1, s17
  102959. 802a144: f3c1 0113 ubfx r1, r1, #0, #20
  102960. 802a148: f041 517f orr.w r1, r1, #1069547520 @ 0x3fc00000
  102961. 802a14c: f441 1140 orr.w r1, r1, #3145728 @ 0x300000
  102962. 802a150: f2a3 33ff subw r3, r3, #1023 @ 0x3ff
  102963. 802a154: 2500 movs r5, #0
  102964. 802a156: ee07 1a90 vmov s15, r1
  102965. 802a15a: eeb7 6b08 vmov.f64 d6, #120 @ 0x3fc00000 1.5
  102966. 802a15e: ed9f 5b66 vldr d5, [pc, #408] @ 802a2f8 <_dtoa_r+0x298>
  102967. 802a162: ee37 7b46 vsub.f64 d7, d7, d6
  102968. 802a166: ed9f 6b66 vldr d6, [pc, #408] @ 802a300 <_dtoa_r+0x2a0>
  102969. 802a16a: eea7 6b05 vfma.f64 d6, d7, d5
  102970. 802a16e: ed9f 5b66 vldr d5, [pc, #408] @ 802a308 <_dtoa_r+0x2a8>
  102971. 802a172: ee07 3a90 vmov s15, r3
  102972. 802a176: eeb8 4be7 vcvt.f64.s32 d4, s15
  102973. 802a17a: eeb0 7b46 vmov.f64 d7, d6
  102974. 802a17e: eea4 7b05 vfma.f64 d7, d4, d5
  102975. 802a182: eefd 6bc7 vcvt.s32.f64 s13, d7
  102976. 802a186: eeb5 7bc0 vcmpe.f64 d7, #0.0
  102977. 802a18a: eef1 fa10 vmrs APSR_nzcv, fpscr
  102978. 802a18e: ee16 8a90 vmov r8, s13
  102979. 802a192: d508 bpl.n 802a1a6 <_dtoa_r+0x146>
  102980. 802a194: eeb8 6be6 vcvt.f64.s32 d6, s13
  102981. 802a198: eeb4 6b47 vcmp.f64 d6, d7
  102982. 802a19c: eef1 fa10 vmrs APSR_nzcv, fpscr
  102983. 802a1a0: bf18 it ne
  102984. 802a1a2: f108 38ff addne.w r8, r8, #4294967295 @ 0xffffffff
  102985. 802a1a6: f1b8 0f16 cmp.w r8, #22
  102986. 802a1aa: d82b bhi.n 802a204 <_dtoa_r+0x1a4>
  102987. 802a1ac: 495e ldr r1, [pc, #376] @ (802a328 <_dtoa_r+0x2c8>)
  102988. 802a1ae: eb01 01c8 add.w r1, r1, r8, lsl #3
  102989. 802a1b2: ed91 7b00 vldr d7, [r1]
  102990. 802a1b6: eeb4 8bc7 vcmpe.f64 d8, d7
  102991. 802a1ba: eef1 fa10 vmrs APSR_nzcv, fpscr
  102992. 802a1be: d501 bpl.n 802a1c4 <_dtoa_r+0x164>
  102993. 802a1c0: f108 38ff add.w r8, r8, #4294967295 @ 0xffffffff
  102994. 802a1c4: 2100 movs r1, #0
  102995. 802a1c6: e01e b.n 802a206 <_dtoa_r+0x1a6>
  102996. 802a1c8: 9b0f ldr r3, [sp, #60] @ 0x3c
  102997. 802a1ca: 4413 add r3, r2
  102998. 802a1cc: f203 4132 addw r1, r3, #1074 @ 0x432
  102999. 802a1d0: 2920 cmp r1, #32
  103000. 802a1d2: bfc1 itttt gt
  103001. 802a1d4: f1c1 0140 rsbgt r1, r1, #64 @ 0x40
  103002. 802a1d8: 408e lslgt r6, r1
  103003. 802a1da: f203 4112 addwgt r1, r3, #1042 @ 0x412
  103004. 802a1de: fa24 f101 lsrgt.w r1, r4, r1
  103005. 802a1e2: bfd6 itet le
  103006. 802a1e4: f1c1 0120 rsble r1, r1, #32
  103007. 802a1e8: 4331 orrgt r1, r6
  103008. 802a1ea: fa04 f101 lslle.w r1, r4, r1
  103009. 802a1ee: ee07 1a90 vmov s15, r1
  103010. 802a1f2: eeb8 7b67 vcvt.f64.u32 d7, s15
  103011. 802a1f6: 3b01 subs r3, #1
  103012. 802a1f8: ee17 1a90 vmov r1, s15
  103013. 802a1fc: 2501 movs r5, #1
  103014. 802a1fe: f1a1 71f8 sub.w r1, r1, #32505856 @ 0x1f00000
  103015. 802a202: e7a8 b.n 802a156 <_dtoa_r+0xf6>
  103016. 802a204: 2101 movs r1, #1
  103017. 802a206: 1ad2 subs r2, r2, r3
  103018. 802a208: 1e53 subs r3, r2, #1
  103019. 802a20a: 9306 str r3, [sp, #24]
  103020. 802a20c: bf45 ittet mi
  103021. 802a20e: f1c2 0301 rsbmi r3, r2, #1
  103022. 802a212: 9305 strmi r3, [sp, #20]
  103023. 802a214: 2300 movpl r3, #0
  103024. 802a216: 2300 movmi r3, #0
  103025. 802a218: bf4c ite mi
  103026. 802a21a: 9306 strmi r3, [sp, #24]
  103027. 802a21c: 9305 strpl r3, [sp, #20]
  103028. 802a21e: f1b8 0f00 cmp.w r8, #0
  103029. 802a222: 910c str r1, [sp, #48] @ 0x30
  103030. 802a224: db18 blt.n 802a258 <_dtoa_r+0x1f8>
  103031. 802a226: 9b06 ldr r3, [sp, #24]
  103032. 802a228: f8cd 8028 str.w r8, [sp, #40] @ 0x28
  103033. 802a22c: 4443 add r3, r8
  103034. 802a22e: 9306 str r3, [sp, #24]
  103035. 802a230: 2300 movs r3, #0
  103036. 802a232: 9a07 ldr r2, [sp, #28]
  103037. 802a234: 2a09 cmp r2, #9
  103038. 802a236: d849 bhi.n 802a2cc <_dtoa_r+0x26c>
  103039. 802a238: 2a05 cmp r2, #5
  103040. 802a23a: bfc4 itt gt
  103041. 802a23c: 3a04 subgt r2, #4
  103042. 802a23e: 9207 strgt r2, [sp, #28]
  103043. 802a240: 9a07 ldr r2, [sp, #28]
  103044. 802a242: f1a2 0202 sub.w r2, r2, #2
  103045. 802a246: bfcc ite gt
  103046. 802a248: 2400 movgt r4, #0
  103047. 802a24a: 2401 movle r4, #1
  103048. 802a24c: 2a03 cmp r2, #3
  103049. 802a24e: d848 bhi.n 802a2e2 <_dtoa_r+0x282>
  103050. 802a250: e8df f002 tbb [pc, r2]
  103051. 802a254: 3a2c2e0b .word 0x3a2c2e0b
  103052. 802a258: 9b05 ldr r3, [sp, #20]
  103053. 802a25a: 2200 movs r2, #0
  103054. 802a25c: eba3 0308 sub.w r3, r3, r8
  103055. 802a260: 9305 str r3, [sp, #20]
  103056. 802a262: 920a str r2, [sp, #40] @ 0x28
  103057. 802a264: f1c8 0300 rsb r3, r8, #0
  103058. 802a268: e7e3 b.n 802a232 <_dtoa_r+0x1d2>
  103059. 802a26a: 2200 movs r2, #0
  103060. 802a26c: 9208 str r2, [sp, #32]
  103061. 802a26e: 9a09 ldr r2, [sp, #36] @ 0x24
  103062. 802a270: 2a00 cmp r2, #0
  103063. 802a272: dc39 bgt.n 802a2e8 <_dtoa_r+0x288>
  103064. 802a274: f04f 0b01 mov.w fp, #1
  103065. 802a278: 46da mov sl, fp
  103066. 802a27a: 465a mov r2, fp
  103067. 802a27c: f8cd b024 str.w fp, [sp, #36] @ 0x24
  103068. 802a280: f8d9 701c ldr.w r7, [r9, #28]
  103069. 802a284: 2100 movs r1, #0
  103070. 802a286: 2004 movs r0, #4
  103071. 802a288: f100 0614 add.w r6, r0, #20
  103072. 802a28c: 4296 cmp r6, r2
  103073. 802a28e: d930 bls.n 802a2f2 <_dtoa_r+0x292>
  103074. 802a290: 6079 str r1, [r7, #4]
  103075. 802a292: 4648 mov r0, r9
  103076. 802a294: 9304 str r3, [sp, #16]
  103077. 802a296: f000 ffcf bl 802b238 <_Balloc>
  103078. 802a29a: 9b04 ldr r3, [sp, #16]
  103079. 802a29c: 4607 mov r7, r0
  103080. 802a29e: 2800 cmp r0, #0
  103081. 802a2a0: d146 bne.n 802a330 <_dtoa_r+0x2d0>
  103082. 802a2a2: 4b22 ldr r3, [pc, #136] @ (802a32c <_dtoa_r+0x2cc>)
  103083. 802a2a4: 4602 mov r2, r0
  103084. 802a2a6: f240 11af movw r1, #431 @ 0x1af
  103085. 802a2aa: e6f2 b.n 802a092 <_dtoa_r+0x32>
  103086. 802a2ac: 2201 movs r2, #1
  103087. 802a2ae: e7dd b.n 802a26c <_dtoa_r+0x20c>
  103088. 802a2b0: 2200 movs r2, #0
  103089. 802a2b2: 9208 str r2, [sp, #32]
  103090. 802a2b4: 9a09 ldr r2, [sp, #36] @ 0x24
  103091. 802a2b6: eb08 0b02 add.w fp, r8, r2
  103092. 802a2ba: f10b 0a01 add.w sl, fp, #1
  103093. 802a2be: 4652 mov r2, sl
  103094. 802a2c0: 2a01 cmp r2, #1
  103095. 802a2c2: bfb8 it lt
  103096. 802a2c4: 2201 movlt r2, #1
  103097. 802a2c6: e7db b.n 802a280 <_dtoa_r+0x220>
  103098. 802a2c8: 2201 movs r2, #1
  103099. 802a2ca: e7f2 b.n 802a2b2 <_dtoa_r+0x252>
  103100. 802a2cc: 2401 movs r4, #1
  103101. 802a2ce: 2200 movs r2, #0
  103102. 802a2d0: e9cd 2407 strd r2, r4, [sp, #28]
  103103. 802a2d4: f04f 3bff mov.w fp, #4294967295 @ 0xffffffff
  103104. 802a2d8: 2100 movs r1, #0
  103105. 802a2da: 46da mov sl, fp
  103106. 802a2dc: 2212 movs r2, #18
  103107. 802a2de: 9109 str r1, [sp, #36] @ 0x24
  103108. 802a2e0: e7ce b.n 802a280 <_dtoa_r+0x220>
  103109. 802a2e2: 2201 movs r2, #1
  103110. 802a2e4: 9208 str r2, [sp, #32]
  103111. 802a2e6: e7f5 b.n 802a2d4 <_dtoa_r+0x274>
  103112. 802a2e8: f8dd b024 ldr.w fp, [sp, #36] @ 0x24
  103113. 802a2ec: 46da mov sl, fp
  103114. 802a2ee: 465a mov r2, fp
  103115. 802a2f0: e7c6 b.n 802a280 <_dtoa_r+0x220>
  103116. 802a2f2: 3101 adds r1, #1
  103117. 802a2f4: 0040 lsls r0, r0, #1
  103118. 802a2f6: e7c7 b.n 802a288 <_dtoa_r+0x228>
  103119. 802a2f8: 636f4361 .word 0x636f4361
  103120. 802a2fc: 3fd287a7 .word 0x3fd287a7
  103121. 802a300: 8b60c8b3 .word 0x8b60c8b3
  103122. 802a304: 3fc68a28 .word 0x3fc68a28
  103123. 802a308: 509f79fb .word 0x509f79fb
  103124. 802a30c: 3fd34413 .word 0x3fd34413
  103125. 802a310: 08030c26 .word 0x08030c26
  103126. 802a314: 08030e6e .word 0x08030e6e
  103127. 802a318: 7ff00000 .word 0x7ff00000
  103128. 802a31c: 08030e6a .word 0x08030e6a
  103129. 802a320: 08030dfa .word 0x08030dfa
  103130. 802a324: 08030df9 .word 0x08030df9
  103131. 802a328: 08030fc8 .word 0x08030fc8
  103132. 802a32c: 08030ec6 .word 0x08030ec6
  103133. 802a330: f8d9 201c ldr.w r2, [r9, #28]
  103134. 802a334: f1ba 0f0e cmp.w sl, #14
  103135. 802a338: 6010 str r0, [r2, #0]
  103136. 802a33a: d86f bhi.n 802a41c <_dtoa_r+0x3bc>
  103137. 802a33c: 2c00 cmp r4, #0
  103138. 802a33e: d06d beq.n 802a41c <_dtoa_r+0x3bc>
  103139. 802a340: f1b8 0f00 cmp.w r8, #0
  103140. 802a344: f340 80c2 ble.w 802a4cc <_dtoa_r+0x46c>
  103141. 802a348: 4aca ldr r2, [pc, #808] @ (802a674 <_dtoa_r+0x614>)
  103142. 802a34a: f008 010f and.w r1, r8, #15
  103143. 802a34e: eb02 02c1 add.w r2, r2, r1, lsl #3
  103144. 802a352: f418 7f80 tst.w r8, #256 @ 0x100
  103145. 802a356: ed92 7b00 vldr d7, [r2]
  103146. 802a35a: ea4f 1128 mov.w r1, r8, asr #4
  103147. 802a35e: f000 80a9 beq.w 802a4b4 <_dtoa_r+0x454>
  103148. 802a362: 4ac5 ldr r2, [pc, #788] @ (802a678 <_dtoa_r+0x618>)
  103149. 802a364: ed92 6b08 vldr d6, [r2, #32]
  103150. 802a368: ee88 6b06 vdiv.f64 d6, d8, d6
  103151. 802a36c: ed8d 6b02 vstr d6, [sp, #8]
  103152. 802a370: f001 010f and.w r1, r1, #15
  103153. 802a374: 2203 movs r2, #3
  103154. 802a376: 48c0 ldr r0, [pc, #768] @ (802a678 <_dtoa_r+0x618>)
  103155. 802a378: 2900 cmp r1, #0
  103156. 802a37a: f040 809d bne.w 802a4b8 <_dtoa_r+0x458>
  103157. 802a37e: ed9d 6b02 vldr d6, [sp, #8]
  103158. 802a382: ee86 7b07 vdiv.f64 d7, d6, d7
  103159. 802a386: ed8d 7b02 vstr d7, [sp, #8]
  103160. 802a38a: 990c ldr r1, [sp, #48] @ 0x30
  103161. 802a38c: ed9d 7b02 vldr d7, [sp, #8]
  103162. 802a390: 2900 cmp r1, #0
  103163. 802a392: f000 80c1 beq.w 802a518 <_dtoa_r+0x4b8>
  103164. 802a396: eeb7 6b00 vmov.f64 d6, #112 @ 0x3f800000 1.0
  103165. 802a39a: eeb4 7bc6 vcmpe.f64 d7, d6
  103166. 802a39e: eef1 fa10 vmrs APSR_nzcv, fpscr
  103167. 802a3a2: f140 80b9 bpl.w 802a518 <_dtoa_r+0x4b8>
  103168. 802a3a6: f1ba 0f00 cmp.w sl, #0
  103169. 802a3aa: f000 80b5 beq.w 802a518 <_dtoa_r+0x4b8>
  103170. 802a3ae: f1bb 0f00 cmp.w fp, #0
  103171. 802a3b2: dd31 ble.n 802a418 <_dtoa_r+0x3b8>
  103172. 802a3b4: eeb2 6b04 vmov.f64 d6, #36 @ 0x41200000 10.0
  103173. 802a3b8: ee27 7b06 vmul.f64 d7, d7, d6
  103174. 802a3bc: ed8d 7b02 vstr d7, [sp, #8]
  103175. 802a3c0: f108 31ff add.w r1, r8, #4294967295 @ 0xffffffff
  103176. 802a3c4: 9104 str r1, [sp, #16]
  103177. 802a3c6: 3201 adds r2, #1
  103178. 802a3c8: 465c mov r4, fp
  103179. 802a3ca: ed9d 6b02 vldr d6, [sp, #8]
  103180. 802a3ce: eeb1 5b0c vmov.f64 d5, #28 @ 0x40e00000 7.0
  103181. 802a3d2: ee07 2a90 vmov s15, r2
  103182. 802a3d6: eeb8 7be7 vcvt.f64.s32 d7, s15
  103183. 802a3da: eea7 5b06 vfma.f64 d5, d7, d6
  103184. 802a3de: ee15 2a90 vmov r2, s11
  103185. 802a3e2: ec51 0b15 vmov r0, r1, d5
  103186. 802a3e6: f1a2 7150 sub.w r1, r2, #54525952 @ 0x3400000
  103187. 802a3ea: 2c00 cmp r4, #0
  103188. 802a3ec: f040 8098 bne.w 802a520 <_dtoa_r+0x4c0>
  103189. 802a3f0: eeb1 7b04 vmov.f64 d7, #20 @ 0x40a00000 5.0
  103190. 802a3f4: ee36 6b47 vsub.f64 d6, d6, d7
  103191. 802a3f8: ec41 0b17 vmov d7, r0, r1
  103192. 802a3fc: eeb4 6bc7 vcmpe.f64 d6, d7
  103193. 802a400: eef1 fa10 vmrs APSR_nzcv, fpscr
  103194. 802a404: f300 8261 bgt.w 802a8ca <_dtoa_r+0x86a>
  103195. 802a408: eeb1 7b47 vneg.f64 d7, d7
  103196. 802a40c: eeb4 6bc7 vcmpe.f64 d6, d7
  103197. 802a410: eef1 fa10 vmrs APSR_nzcv, fpscr
  103198. 802a414: f100 80f5 bmi.w 802a602 <_dtoa_r+0x5a2>
  103199. 802a418: ed8d 8b02 vstr d8, [sp, #8]
  103200. 802a41c: 9a0f ldr r2, [sp, #60] @ 0x3c
  103201. 802a41e: 2a00 cmp r2, #0
  103202. 802a420: f2c0 812c blt.w 802a67c <_dtoa_r+0x61c>
  103203. 802a424: f1b8 0f0e cmp.w r8, #14
  103204. 802a428: f300 8128 bgt.w 802a67c <_dtoa_r+0x61c>
  103205. 802a42c: 4b91 ldr r3, [pc, #580] @ (802a674 <_dtoa_r+0x614>)
  103206. 802a42e: eb03 03c8 add.w r3, r3, r8, lsl #3
  103207. 802a432: ed93 6b00 vldr d6, [r3]
  103208. 802a436: 9b09 ldr r3, [sp, #36] @ 0x24
  103209. 802a438: 2b00 cmp r3, #0
  103210. 802a43a: da03 bge.n 802a444 <_dtoa_r+0x3e4>
  103211. 802a43c: f1ba 0f00 cmp.w sl, #0
  103212. 802a440: f340 80d2 ble.w 802a5e8 <_dtoa_r+0x588>
  103213. 802a444: eeb2 4b04 vmov.f64 d4, #36 @ 0x41200000 10.0
  103214. 802a448: ed9d 7b02 vldr d7, [sp, #8]
  103215. 802a44c: 463e mov r6, r7
  103216. 802a44e: ee87 5b06 vdiv.f64 d5, d7, d6
  103217. 802a452: eebd 5bc5 vcvt.s32.f64 s10, d5
  103218. 802a456: ee15 3a10 vmov r3, s10
  103219. 802a45a: 3330 adds r3, #48 @ 0x30
  103220. 802a45c: f806 3b01 strb.w r3, [r6], #1
  103221. 802a460: 1bf3 subs r3, r6, r7
  103222. 802a462: 459a cmp sl, r3
  103223. 802a464: eeb8 3bc5 vcvt.f64.s32 d3, s10
  103224. 802a468: eea3 7b46 vfms.f64 d7, d3, d6
  103225. 802a46c: f040 80f8 bne.w 802a660 <_dtoa_r+0x600>
  103226. 802a470: ee37 7b07 vadd.f64 d7, d7, d7
  103227. 802a474: eeb4 7bc6 vcmpe.f64 d7, d6
  103228. 802a478: eef1 fa10 vmrs APSR_nzcv, fpscr
  103229. 802a47c: f300 80dd bgt.w 802a63a <_dtoa_r+0x5da>
  103230. 802a480: eeb4 7b46 vcmp.f64 d7, d6
  103231. 802a484: eef1 fa10 vmrs APSR_nzcv, fpscr
  103232. 802a488: d104 bne.n 802a494 <_dtoa_r+0x434>
  103233. 802a48a: ee15 3a10 vmov r3, s10
  103234. 802a48e: 07db lsls r3, r3, #31
  103235. 802a490: f100 80d3 bmi.w 802a63a <_dtoa_r+0x5da>
  103236. 802a494: 9901 ldr r1, [sp, #4]
  103237. 802a496: 4648 mov r0, r9
  103238. 802a498: f000 ff0e bl 802b2b8 <_Bfree>
  103239. 802a49c: 2300 movs r3, #0
  103240. 802a49e: 9a0d ldr r2, [sp, #52] @ 0x34
  103241. 802a4a0: 7033 strb r3, [r6, #0]
  103242. 802a4a2: f108 0301 add.w r3, r8, #1
  103243. 802a4a6: 6013 str r3, [r2, #0]
  103244. 802a4a8: 9b1d ldr r3, [sp, #116] @ 0x74
  103245. 802a4aa: 2b00 cmp r3, #0
  103246. 802a4ac: f000 8304 beq.w 802aab8 <_dtoa_r+0xa58>
  103247. 802a4b0: 601e str r6, [r3, #0]
  103248. 802a4b2: e301 b.n 802aab8 <_dtoa_r+0xa58>
  103249. 802a4b4: 2202 movs r2, #2
  103250. 802a4b6: e75e b.n 802a376 <_dtoa_r+0x316>
  103251. 802a4b8: 07cc lsls r4, r1, #31
  103252. 802a4ba: d504 bpl.n 802a4c6 <_dtoa_r+0x466>
  103253. 802a4bc: ed90 6b00 vldr d6, [r0]
  103254. 802a4c0: 3201 adds r2, #1
  103255. 802a4c2: ee27 7b06 vmul.f64 d7, d7, d6
  103256. 802a4c6: 1049 asrs r1, r1, #1
  103257. 802a4c8: 3008 adds r0, #8
  103258. 802a4ca: e755 b.n 802a378 <_dtoa_r+0x318>
  103259. 802a4cc: d022 beq.n 802a514 <_dtoa_r+0x4b4>
  103260. 802a4ce: f1c8 0100 rsb r1, r8, #0
  103261. 802a4d2: 4a68 ldr r2, [pc, #416] @ (802a674 <_dtoa_r+0x614>)
  103262. 802a4d4: f001 000f and.w r0, r1, #15
  103263. 802a4d8: eb02 02c0 add.w r2, r2, r0, lsl #3
  103264. 802a4dc: ed92 7b00 vldr d7, [r2]
  103265. 802a4e0: ee28 7b07 vmul.f64 d7, d8, d7
  103266. 802a4e4: ed8d 7b02 vstr d7, [sp, #8]
  103267. 802a4e8: 4863 ldr r0, [pc, #396] @ (802a678 <_dtoa_r+0x618>)
  103268. 802a4ea: 1109 asrs r1, r1, #4
  103269. 802a4ec: 2400 movs r4, #0
  103270. 802a4ee: 2202 movs r2, #2
  103271. 802a4f0: b929 cbnz r1, 802a4fe <_dtoa_r+0x49e>
  103272. 802a4f2: 2c00 cmp r4, #0
  103273. 802a4f4: f43f af49 beq.w 802a38a <_dtoa_r+0x32a>
  103274. 802a4f8: ed8d 7b02 vstr d7, [sp, #8]
  103275. 802a4fc: e745 b.n 802a38a <_dtoa_r+0x32a>
  103276. 802a4fe: 07ce lsls r6, r1, #31
  103277. 802a500: d505 bpl.n 802a50e <_dtoa_r+0x4ae>
  103278. 802a502: ed90 6b00 vldr d6, [r0]
  103279. 802a506: 3201 adds r2, #1
  103280. 802a508: 2401 movs r4, #1
  103281. 802a50a: ee27 7b06 vmul.f64 d7, d7, d6
  103282. 802a50e: 1049 asrs r1, r1, #1
  103283. 802a510: 3008 adds r0, #8
  103284. 802a512: e7ed b.n 802a4f0 <_dtoa_r+0x490>
  103285. 802a514: 2202 movs r2, #2
  103286. 802a516: e738 b.n 802a38a <_dtoa_r+0x32a>
  103287. 802a518: f8cd 8010 str.w r8, [sp, #16]
  103288. 802a51c: 4654 mov r4, sl
  103289. 802a51e: e754 b.n 802a3ca <_dtoa_r+0x36a>
  103290. 802a520: 4a54 ldr r2, [pc, #336] @ (802a674 <_dtoa_r+0x614>)
  103291. 802a522: eb02 02c4 add.w r2, r2, r4, lsl #3
  103292. 802a526: ed12 4b02 vldr d4, [r2, #-8]
  103293. 802a52a: 9a08 ldr r2, [sp, #32]
  103294. 802a52c: ec41 0b17 vmov d7, r0, r1
  103295. 802a530: 443c add r4, r7
  103296. 802a532: b34a cbz r2, 802a588 <_dtoa_r+0x528>
  103297. 802a534: eeb6 3b00 vmov.f64 d3, #96 @ 0x3f000000 0.5
  103298. 802a538: eeb7 2b00 vmov.f64 d2, #112 @ 0x3f800000 1.0
  103299. 802a53c: 463e mov r6, r7
  103300. 802a53e: ee83 5b04 vdiv.f64 d5, d3, d4
  103301. 802a542: eeb2 3b04 vmov.f64 d3, #36 @ 0x41200000 10.0
  103302. 802a546: ee35 7b47 vsub.f64 d7, d5, d7
  103303. 802a54a: eefd 4bc6 vcvt.s32.f64 s9, d6
  103304. 802a54e: ee14 2a90 vmov r2, s9
  103305. 802a552: eeb8 5be4 vcvt.f64.s32 d5, s9
  103306. 802a556: 3230 adds r2, #48 @ 0x30
  103307. 802a558: ee36 6b45 vsub.f64 d6, d6, d5
  103308. 802a55c: eeb4 6bc7 vcmpe.f64 d6, d7
  103309. 802a560: eef1 fa10 vmrs APSR_nzcv, fpscr
  103310. 802a564: f806 2b01 strb.w r2, [r6], #1
  103311. 802a568: d438 bmi.n 802a5dc <_dtoa_r+0x57c>
  103312. 802a56a: ee32 5b46 vsub.f64 d5, d2, d6
  103313. 802a56e: eeb4 5bc7 vcmpe.f64 d5, d7
  103314. 802a572: eef1 fa10 vmrs APSR_nzcv, fpscr
  103315. 802a576: d462 bmi.n 802a63e <_dtoa_r+0x5de>
  103316. 802a578: 42a6 cmp r6, r4
  103317. 802a57a: f43f af4d beq.w 802a418 <_dtoa_r+0x3b8>
  103318. 802a57e: ee27 7b03 vmul.f64 d7, d7, d3
  103319. 802a582: ee26 6b03 vmul.f64 d6, d6, d3
  103320. 802a586: e7e0 b.n 802a54a <_dtoa_r+0x4ea>
  103321. 802a588: 4621 mov r1, r4
  103322. 802a58a: 463e mov r6, r7
  103323. 802a58c: ee27 7b04 vmul.f64 d7, d7, d4
  103324. 802a590: eeb2 3b04 vmov.f64 d3, #36 @ 0x41200000 10.0
  103325. 802a594: eefd 4bc6 vcvt.s32.f64 s9, d6
  103326. 802a598: ee14 2a90 vmov r2, s9
  103327. 802a59c: 3230 adds r2, #48 @ 0x30
  103328. 802a59e: f806 2b01 strb.w r2, [r6], #1
  103329. 802a5a2: 42a6 cmp r6, r4
  103330. 802a5a4: eeb8 5be4 vcvt.f64.s32 d5, s9
  103331. 802a5a8: ee36 6b45 vsub.f64 d6, d6, d5
  103332. 802a5ac: d119 bne.n 802a5e2 <_dtoa_r+0x582>
  103333. 802a5ae: eeb6 5b00 vmov.f64 d5, #96 @ 0x3f000000 0.5
  103334. 802a5b2: ee37 4b05 vadd.f64 d4, d7, d5
  103335. 802a5b6: eeb4 6bc4 vcmpe.f64 d6, d4
  103336. 802a5ba: eef1 fa10 vmrs APSR_nzcv, fpscr
  103337. 802a5be: dc3e bgt.n 802a63e <_dtoa_r+0x5de>
  103338. 802a5c0: ee35 5b47 vsub.f64 d5, d5, d7
  103339. 802a5c4: eeb4 6bc5 vcmpe.f64 d6, d5
  103340. 802a5c8: eef1 fa10 vmrs APSR_nzcv, fpscr
  103341. 802a5cc: f57f af24 bpl.w 802a418 <_dtoa_r+0x3b8>
  103342. 802a5d0: 460e mov r6, r1
  103343. 802a5d2: 3901 subs r1, #1
  103344. 802a5d4: f816 3c01 ldrb.w r3, [r6, #-1]
  103345. 802a5d8: 2b30 cmp r3, #48 @ 0x30
  103346. 802a5da: d0f9 beq.n 802a5d0 <_dtoa_r+0x570>
  103347. 802a5dc: f8dd 8010 ldr.w r8, [sp, #16]
  103348. 802a5e0: e758 b.n 802a494 <_dtoa_r+0x434>
  103349. 802a5e2: ee26 6b03 vmul.f64 d6, d6, d3
  103350. 802a5e6: e7d5 b.n 802a594 <_dtoa_r+0x534>
  103351. 802a5e8: d10b bne.n 802a602 <_dtoa_r+0x5a2>
  103352. 802a5ea: eeb1 7b04 vmov.f64 d7, #20 @ 0x40a00000 5.0
  103353. 802a5ee: ee26 6b07 vmul.f64 d6, d6, d7
  103354. 802a5f2: ed9d 7b02 vldr d7, [sp, #8]
  103355. 802a5f6: eeb4 6bc7 vcmpe.f64 d6, d7
  103356. 802a5fa: eef1 fa10 vmrs APSR_nzcv, fpscr
  103357. 802a5fe: f2c0 8161 blt.w 802a8c4 <_dtoa_r+0x864>
  103358. 802a602: 2400 movs r4, #0
  103359. 802a604: 4625 mov r5, r4
  103360. 802a606: 9b09 ldr r3, [sp, #36] @ 0x24
  103361. 802a608: 43db mvns r3, r3
  103362. 802a60a: 9304 str r3, [sp, #16]
  103363. 802a60c: 463e mov r6, r7
  103364. 802a60e: f04f 0800 mov.w r8, #0
  103365. 802a612: 4621 mov r1, r4
  103366. 802a614: 4648 mov r0, r9
  103367. 802a616: f000 fe4f bl 802b2b8 <_Bfree>
  103368. 802a61a: 2d00 cmp r5, #0
  103369. 802a61c: d0de beq.n 802a5dc <_dtoa_r+0x57c>
  103370. 802a61e: f1b8 0f00 cmp.w r8, #0
  103371. 802a622: d005 beq.n 802a630 <_dtoa_r+0x5d0>
  103372. 802a624: 45a8 cmp r8, r5
  103373. 802a626: d003 beq.n 802a630 <_dtoa_r+0x5d0>
  103374. 802a628: 4641 mov r1, r8
  103375. 802a62a: 4648 mov r0, r9
  103376. 802a62c: f000 fe44 bl 802b2b8 <_Bfree>
  103377. 802a630: 4629 mov r1, r5
  103378. 802a632: 4648 mov r0, r9
  103379. 802a634: f000 fe40 bl 802b2b8 <_Bfree>
  103380. 802a638: e7d0 b.n 802a5dc <_dtoa_r+0x57c>
  103381. 802a63a: f8cd 8010 str.w r8, [sp, #16]
  103382. 802a63e: 4633 mov r3, r6
  103383. 802a640: 461e mov r6, r3
  103384. 802a642: f813 2d01 ldrb.w r2, [r3, #-1]!
  103385. 802a646: 2a39 cmp r2, #57 @ 0x39
  103386. 802a648: d106 bne.n 802a658 <_dtoa_r+0x5f8>
  103387. 802a64a: 429f cmp r7, r3
  103388. 802a64c: d1f8 bne.n 802a640 <_dtoa_r+0x5e0>
  103389. 802a64e: 9a04 ldr r2, [sp, #16]
  103390. 802a650: 3201 adds r2, #1
  103391. 802a652: 9204 str r2, [sp, #16]
  103392. 802a654: 2230 movs r2, #48 @ 0x30
  103393. 802a656: 703a strb r2, [r7, #0]
  103394. 802a658: 781a ldrb r2, [r3, #0]
  103395. 802a65a: 3201 adds r2, #1
  103396. 802a65c: 701a strb r2, [r3, #0]
  103397. 802a65e: e7bd b.n 802a5dc <_dtoa_r+0x57c>
  103398. 802a660: ee27 7b04 vmul.f64 d7, d7, d4
  103399. 802a664: eeb5 7b40 vcmp.f64 d7, #0.0
  103400. 802a668: eef1 fa10 vmrs APSR_nzcv, fpscr
  103401. 802a66c: f47f aeef bne.w 802a44e <_dtoa_r+0x3ee>
  103402. 802a670: e710 b.n 802a494 <_dtoa_r+0x434>
  103403. 802a672: bf00 nop
  103404. 802a674: 08030fc8 .word 0x08030fc8
  103405. 802a678: 08030fa0 .word 0x08030fa0
  103406. 802a67c: 9908 ldr r1, [sp, #32]
  103407. 802a67e: 2900 cmp r1, #0
  103408. 802a680: f000 80e3 beq.w 802a84a <_dtoa_r+0x7ea>
  103409. 802a684: 9907 ldr r1, [sp, #28]
  103410. 802a686: 2901 cmp r1, #1
  103411. 802a688: f300 80c8 bgt.w 802a81c <_dtoa_r+0x7bc>
  103412. 802a68c: 2d00 cmp r5, #0
  103413. 802a68e: f000 80c1 beq.w 802a814 <_dtoa_r+0x7b4>
  103414. 802a692: f202 4233 addw r2, r2, #1075 @ 0x433
  103415. 802a696: 9e05 ldr r6, [sp, #20]
  103416. 802a698: 461c mov r4, r3
  103417. 802a69a: 9304 str r3, [sp, #16]
  103418. 802a69c: 9b05 ldr r3, [sp, #20]
  103419. 802a69e: 4413 add r3, r2
  103420. 802a6a0: 9305 str r3, [sp, #20]
  103421. 802a6a2: 9b06 ldr r3, [sp, #24]
  103422. 802a6a4: 2101 movs r1, #1
  103423. 802a6a6: 4413 add r3, r2
  103424. 802a6a8: 4648 mov r0, r9
  103425. 802a6aa: 9306 str r3, [sp, #24]
  103426. 802a6ac: f000 ff02 bl 802b4b4 <__i2b>
  103427. 802a6b0: 9b04 ldr r3, [sp, #16]
  103428. 802a6b2: 4605 mov r5, r0
  103429. 802a6b4: b166 cbz r6, 802a6d0 <_dtoa_r+0x670>
  103430. 802a6b6: 9a06 ldr r2, [sp, #24]
  103431. 802a6b8: 2a00 cmp r2, #0
  103432. 802a6ba: dd09 ble.n 802a6d0 <_dtoa_r+0x670>
  103433. 802a6bc: 42b2 cmp r2, r6
  103434. 802a6be: 9905 ldr r1, [sp, #20]
  103435. 802a6c0: bfa8 it ge
  103436. 802a6c2: 4632 movge r2, r6
  103437. 802a6c4: 1a89 subs r1, r1, r2
  103438. 802a6c6: 9105 str r1, [sp, #20]
  103439. 802a6c8: 9906 ldr r1, [sp, #24]
  103440. 802a6ca: 1ab6 subs r6, r6, r2
  103441. 802a6cc: 1a8a subs r2, r1, r2
  103442. 802a6ce: 9206 str r2, [sp, #24]
  103443. 802a6d0: b1fb cbz r3, 802a712 <_dtoa_r+0x6b2>
  103444. 802a6d2: 9a08 ldr r2, [sp, #32]
  103445. 802a6d4: 2a00 cmp r2, #0
  103446. 802a6d6: f000 80bc beq.w 802a852 <_dtoa_r+0x7f2>
  103447. 802a6da: b19c cbz r4, 802a704 <_dtoa_r+0x6a4>
  103448. 802a6dc: 4629 mov r1, r5
  103449. 802a6de: 4622 mov r2, r4
  103450. 802a6e0: 4648 mov r0, r9
  103451. 802a6e2: 930b str r3, [sp, #44] @ 0x2c
  103452. 802a6e4: f000 ffa6 bl 802b634 <__pow5mult>
  103453. 802a6e8: 9a01 ldr r2, [sp, #4]
  103454. 802a6ea: 4601 mov r1, r0
  103455. 802a6ec: 4605 mov r5, r0
  103456. 802a6ee: 4648 mov r0, r9
  103457. 802a6f0: f000 fef6 bl 802b4e0 <__multiply>
  103458. 802a6f4: 9901 ldr r1, [sp, #4]
  103459. 802a6f6: 9004 str r0, [sp, #16]
  103460. 802a6f8: 4648 mov r0, r9
  103461. 802a6fa: f000 fddd bl 802b2b8 <_Bfree>
  103462. 802a6fe: 9a04 ldr r2, [sp, #16]
  103463. 802a700: 9b0b ldr r3, [sp, #44] @ 0x2c
  103464. 802a702: 9201 str r2, [sp, #4]
  103465. 802a704: 1b1a subs r2, r3, r4
  103466. 802a706: d004 beq.n 802a712 <_dtoa_r+0x6b2>
  103467. 802a708: 9901 ldr r1, [sp, #4]
  103468. 802a70a: 4648 mov r0, r9
  103469. 802a70c: f000 ff92 bl 802b634 <__pow5mult>
  103470. 802a710: 9001 str r0, [sp, #4]
  103471. 802a712: 2101 movs r1, #1
  103472. 802a714: 4648 mov r0, r9
  103473. 802a716: f000 fecd bl 802b4b4 <__i2b>
  103474. 802a71a: 9b0a ldr r3, [sp, #40] @ 0x28
  103475. 802a71c: 4604 mov r4, r0
  103476. 802a71e: 2b00 cmp r3, #0
  103477. 802a720: f000 81d0 beq.w 802aac4 <_dtoa_r+0xa64>
  103478. 802a724: 461a mov r2, r3
  103479. 802a726: 4601 mov r1, r0
  103480. 802a728: 4648 mov r0, r9
  103481. 802a72a: f000 ff83 bl 802b634 <__pow5mult>
  103482. 802a72e: 9b07 ldr r3, [sp, #28]
  103483. 802a730: 2b01 cmp r3, #1
  103484. 802a732: 4604 mov r4, r0
  103485. 802a734: f300 8095 bgt.w 802a862 <_dtoa_r+0x802>
  103486. 802a738: 9b02 ldr r3, [sp, #8]
  103487. 802a73a: 2b00 cmp r3, #0
  103488. 802a73c: f040 808b bne.w 802a856 <_dtoa_r+0x7f6>
  103489. 802a740: 9b03 ldr r3, [sp, #12]
  103490. 802a742: f3c3 0213 ubfx r2, r3, #0, #20
  103491. 802a746: 2a00 cmp r2, #0
  103492. 802a748: f040 8087 bne.w 802a85a <_dtoa_r+0x7fa>
  103493. 802a74c: f023 4200 bic.w r2, r3, #2147483648 @ 0x80000000
  103494. 802a750: 0d12 lsrs r2, r2, #20
  103495. 802a752: 0512 lsls r2, r2, #20
  103496. 802a754: 2a00 cmp r2, #0
  103497. 802a756: f000 8082 beq.w 802a85e <_dtoa_r+0x7fe>
  103498. 802a75a: 9b05 ldr r3, [sp, #20]
  103499. 802a75c: 3301 adds r3, #1
  103500. 802a75e: 9305 str r3, [sp, #20]
  103501. 802a760: 9b06 ldr r3, [sp, #24]
  103502. 802a762: 3301 adds r3, #1
  103503. 802a764: 9306 str r3, [sp, #24]
  103504. 802a766: 2301 movs r3, #1
  103505. 802a768: 930b str r3, [sp, #44] @ 0x2c
  103506. 802a76a: 9b0a ldr r3, [sp, #40] @ 0x28
  103507. 802a76c: 2b00 cmp r3, #0
  103508. 802a76e: f000 81af beq.w 802aad0 <_dtoa_r+0xa70>
  103509. 802a772: 6922 ldr r2, [r4, #16]
  103510. 802a774: eb04 0282 add.w r2, r4, r2, lsl #2
  103511. 802a778: 6910 ldr r0, [r2, #16]
  103512. 802a77a: f000 fe4f bl 802b41c <__hi0bits>
  103513. 802a77e: f1c0 0020 rsb r0, r0, #32
  103514. 802a782: 9b06 ldr r3, [sp, #24]
  103515. 802a784: 4418 add r0, r3
  103516. 802a786: f010 001f ands.w r0, r0, #31
  103517. 802a78a: d076 beq.n 802a87a <_dtoa_r+0x81a>
  103518. 802a78c: f1c0 0220 rsb r2, r0, #32
  103519. 802a790: 2a04 cmp r2, #4
  103520. 802a792: dd69 ble.n 802a868 <_dtoa_r+0x808>
  103521. 802a794: 9b05 ldr r3, [sp, #20]
  103522. 802a796: f1c0 001c rsb r0, r0, #28
  103523. 802a79a: 4403 add r3, r0
  103524. 802a79c: 9305 str r3, [sp, #20]
  103525. 802a79e: 9b06 ldr r3, [sp, #24]
  103526. 802a7a0: 4406 add r6, r0
  103527. 802a7a2: 4403 add r3, r0
  103528. 802a7a4: 9306 str r3, [sp, #24]
  103529. 802a7a6: 9b05 ldr r3, [sp, #20]
  103530. 802a7a8: 2b00 cmp r3, #0
  103531. 802a7aa: dd05 ble.n 802a7b8 <_dtoa_r+0x758>
  103532. 802a7ac: 9901 ldr r1, [sp, #4]
  103533. 802a7ae: 461a mov r2, r3
  103534. 802a7b0: 4648 mov r0, r9
  103535. 802a7b2: f000 ff99 bl 802b6e8 <__lshift>
  103536. 802a7b6: 9001 str r0, [sp, #4]
  103537. 802a7b8: 9b06 ldr r3, [sp, #24]
  103538. 802a7ba: 2b00 cmp r3, #0
  103539. 802a7bc: dd05 ble.n 802a7ca <_dtoa_r+0x76a>
  103540. 802a7be: 4621 mov r1, r4
  103541. 802a7c0: 461a mov r2, r3
  103542. 802a7c2: 4648 mov r0, r9
  103543. 802a7c4: f000 ff90 bl 802b6e8 <__lshift>
  103544. 802a7c8: 4604 mov r4, r0
  103545. 802a7ca: 9b0c ldr r3, [sp, #48] @ 0x30
  103546. 802a7cc: 2b00 cmp r3, #0
  103547. 802a7ce: d056 beq.n 802a87e <_dtoa_r+0x81e>
  103548. 802a7d0: 9801 ldr r0, [sp, #4]
  103549. 802a7d2: 4621 mov r1, r4
  103550. 802a7d4: f000 fff4 bl 802b7c0 <__mcmp>
  103551. 802a7d8: 2800 cmp r0, #0
  103552. 802a7da: da50 bge.n 802a87e <_dtoa_r+0x81e>
  103553. 802a7dc: f108 33ff add.w r3, r8, #4294967295 @ 0xffffffff
  103554. 802a7e0: 9304 str r3, [sp, #16]
  103555. 802a7e2: 9901 ldr r1, [sp, #4]
  103556. 802a7e4: 2300 movs r3, #0
  103557. 802a7e6: 220a movs r2, #10
  103558. 802a7e8: 4648 mov r0, r9
  103559. 802a7ea: f000 fd87 bl 802b2fc <__multadd>
  103560. 802a7ee: 9b08 ldr r3, [sp, #32]
  103561. 802a7f0: 9001 str r0, [sp, #4]
  103562. 802a7f2: 2b00 cmp r3, #0
  103563. 802a7f4: f000 816e beq.w 802aad4 <_dtoa_r+0xa74>
  103564. 802a7f8: 4629 mov r1, r5
  103565. 802a7fa: 2300 movs r3, #0
  103566. 802a7fc: 220a movs r2, #10
  103567. 802a7fe: 4648 mov r0, r9
  103568. 802a800: f000 fd7c bl 802b2fc <__multadd>
  103569. 802a804: f1bb 0f00 cmp.w fp, #0
  103570. 802a808: 4605 mov r5, r0
  103571. 802a80a: dc64 bgt.n 802a8d6 <_dtoa_r+0x876>
  103572. 802a80c: 9b07 ldr r3, [sp, #28]
  103573. 802a80e: 2b02 cmp r3, #2
  103574. 802a810: dc3e bgt.n 802a890 <_dtoa_r+0x830>
  103575. 802a812: e060 b.n 802a8d6 <_dtoa_r+0x876>
  103576. 802a814: 9a0e ldr r2, [sp, #56] @ 0x38
  103577. 802a816: f1c2 0236 rsb r2, r2, #54 @ 0x36
  103578. 802a81a: e73c b.n 802a696 <_dtoa_r+0x636>
  103579. 802a81c: f10a 34ff add.w r4, sl, #4294967295 @ 0xffffffff
  103580. 802a820: 42a3 cmp r3, r4
  103581. 802a822: bfbf itttt lt
  103582. 802a824: 1ae2 sublt r2, r4, r3
  103583. 802a826: 9b0a ldrlt r3, [sp, #40] @ 0x28
  103584. 802a828: 189b addlt r3, r3, r2
  103585. 802a82a: 930a strlt r3, [sp, #40] @ 0x28
  103586. 802a82c: bfae itee ge
  103587. 802a82e: 1b1c subge r4, r3, r4
  103588. 802a830: 4623 movlt r3, r4
  103589. 802a832: 2400 movlt r4, #0
  103590. 802a834: f1ba 0f00 cmp.w sl, #0
  103591. 802a838: bfb5 itete lt
  103592. 802a83a: 9a05 ldrlt r2, [sp, #20]
  103593. 802a83c: 9e05 ldrge r6, [sp, #20]
  103594. 802a83e: eba2 060a sublt.w r6, r2, sl
  103595. 802a842: 4652 movge r2, sl
  103596. 802a844: bfb8 it lt
  103597. 802a846: 2200 movlt r2, #0
  103598. 802a848: e727 b.n 802a69a <_dtoa_r+0x63a>
  103599. 802a84a: 9e05 ldr r6, [sp, #20]
  103600. 802a84c: 9d08 ldr r5, [sp, #32]
  103601. 802a84e: 461c mov r4, r3
  103602. 802a850: e730 b.n 802a6b4 <_dtoa_r+0x654>
  103603. 802a852: 461a mov r2, r3
  103604. 802a854: e758 b.n 802a708 <_dtoa_r+0x6a8>
  103605. 802a856: 2300 movs r3, #0
  103606. 802a858: e786 b.n 802a768 <_dtoa_r+0x708>
  103607. 802a85a: 9b02 ldr r3, [sp, #8]
  103608. 802a85c: e784 b.n 802a768 <_dtoa_r+0x708>
  103609. 802a85e: 920b str r2, [sp, #44] @ 0x2c
  103610. 802a860: e783 b.n 802a76a <_dtoa_r+0x70a>
  103611. 802a862: 2300 movs r3, #0
  103612. 802a864: 930b str r3, [sp, #44] @ 0x2c
  103613. 802a866: e784 b.n 802a772 <_dtoa_r+0x712>
  103614. 802a868: d09d beq.n 802a7a6 <_dtoa_r+0x746>
  103615. 802a86a: 9b05 ldr r3, [sp, #20]
  103616. 802a86c: 321c adds r2, #28
  103617. 802a86e: 4413 add r3, r2
  103618. 802a870: 9305 str r3, [sp, #20]
  103619. 802a872: 9b06 ldr r3, [sp, #24]
  103620. 802a874: 4416 add r6, r2
  103621. 802a876: 4413 add r3, r2
  103622. 802a878: e794 b.n 802a7a4 <_dtoa_r+0x744>
  103623. 802a87a: 4602 mov r2, r0
  103624. 802a87c: e7f5 b.n 802a86a <_dtoa_r+0x80a>
  103625. 802a87e: f1ba 0f00 cmp.w sl, #0
  103626. 802a882: f8cd 8010 str.w r8, [sp, #16]
  103627. 802a886: 46d3 mov fp, sl
  103628. 802a888: dc21 bgt.n 802a8ce <_dtoa_r+0x86e>
  103629. 802a88a: 9b07 ldr r3, [sp, #28]
  103630. 802a88c: 2b02 cmp r3, #2
  103631. 802a88e: dd1e ble.n 802a8ce <_dtoa_r+0x86e>
  103632. 802a890: f1bb 0f00 cmp.w fp, #0
  103633. 802a894: f47f aeb7 bne.w 802a606 <_dtoa_r+0x5a6>
  103634. 802a898: 4621 mov r1, r4
  103635. 802a89a: 465b mov r3, fp
  103636. 802a89c: 2205 movs r2, #5
  103637. 802a89e: 4648 mov r0, r9
  103638. 802a8a0: f000 fd2c bl 802b2fc <__multadd>
  103639. 802a8a4: 4601 mov r1, r0
  103640. 802a8a6: 4604 mov r4, r0
  103641. 802a8a8: 9801 ldr r0, [sp, #4]
  103642. 802a8aa: f000 ff89 bl 802b7c0 <__mcmp>
  103643. 802a8ae: 2800 cmp r0, #0
  103644. 802a8b0: f77f aea9 ble.w 802a606 <_dtoa_r+0x5a6>
  103645. 802a8b4: 463e mov r6, r7
  103646. 802a8b6: 2331 movs r3, #49 @ 0x31
  103647. 802a8b8: f806 3b01 strb.w r3, [r6], #1
  103648. 802a8bc: 9b04 ldr r3, [sp, #16]
  103649. 802a8be: 3301 adds r3, #1
  103650. 802a8c0: 9304 str r3, [sp, #16]
  103651. 802a8c2: e6a4 b.n 802a60e <_dtoa_r+0x5ae>
  103652. 802a8c4: f8cd 8010 str.w r8, [sp, #16]
  103653. 802a8c8: 4654 mov r4, sl
  103654. 802a8ca: 4625 mov r5, r4
  103655. 802a8cc: e7f2 b.n 802a8b4 <_dtoa_r+0x854>
  103656. 802a8ce: 9b08 ldr r3, [sp, #32]
  103657. 802a8d0: 2b00 cmp r3, #0
  103658. 802a8d2: f000 8103 beq.w 802aadc <_dtoa_r+0xa7c>
  103659. 802a8d6: 2e00 cmp r6, #0
  103660. 802a8d8: dd05 ble.n 802a8e6 <_dtoa_r+0x886>
  103661. 802a8da: 4629 mov r1, r5
  103662. 802a8dc: 4632 mov r2, r6
  103663. 802a8de: 4648 mov r0, r9
  103664. 802a8e0: f000 ff02 bl 802b6e8 <__lshift>
  103665. 802a8e4: 4605 mov r5, r0
  103666. 802a8e6: 9b0b ldr r3, [sp, #44] @ 0x2c
  103667. 802a8e8: 2b00 cmp r3, #0
  103668. 802a8ea: d058 beq.n 802a99e <_dtoa_r+0x93e>
  103669. 802a8ec: 6869 ldr r1, [r5, #4]
  103670. 802a8ee: 4648 mov r0, r9
  103671. 802a8f0: f000 fca2 bl 802b238 <_Balloc>
  103672. 802a8f4: 4606 mov r6, r0
  103673. 802a8f6: b928 cbnz r0, 802a904 <_dtoa_r+0x8a4>
  103674. 802a8f8: 4b82 ldr r3, [pc, #520] @ (802ab04 <_dtoa_r+0xaa4>)
  103675. 802a8fa: 4602 mov r2, r0
  103676. 802a8fc: f240 21ef movw r1, #751 @ 0x2ef
  103677. 802a900: f7ff bbc7 b.w 802a092 <_dtoa_r+0x32>
  103678. 802a904: 692a ldr r2, [r5, #16]
  103679. 802a906: 3202 adds r2, #2
  103680. 802a908: 0092 lsls r2, r2, #2
  103681. 802a90a: f105 010c add.w r1, r5, #12
  103682. 802a90e: 300c adds r0, #12
  103683. 802a910: f7ff fae5 bl 8029ede <memcpy>
  103684. 802a914: 2201 movs r2, #1
  103685. 802a916: 4631 mov r1, r6
  103686. 802a918: 4648 mov r0, r9
  103687. 802a91a: f000 fee5 bl 802b6e8 <__lshift>
  103688. 802a91e: 1c7b adds r3, r7, #1
  103689. 802a920: 9305 str r3, [sp, #20]
  103690. 802a922: eb07 030b add.w r3, r7, fp
  103691. 802a926: 9309 str r3, [sp, #36] @ 0x24
  103692. 802a928: 9b02 ldr r3, [sp, #8]
  103693. 802a92a: f003 0301 and.w r3, r3, #1
  103694. 802a92e: 46a8 mov r8, r5
  103695. 802a930: 9308 str r3, [sp, #32]
  103696. 802a932: 4605 mov r5, r0
  103697. 802a934: 9b05 ldr r3, [sp, #20]
  103698. 802a936: 9801 ldr r0, [sp, #4]
  103699. 802a938: 4621 mov r1, r4
  103700. 802a93a: f103 3bff add.w fp, r3, #4294967295 @ 0xffffffff
  103701. 802a93e: f7ff fb05 bl 8029f4c <quorem>
  103702. 802a942: 4641 mov r1, r8
  103703. 802a944: 9002 str r0, [sp, #8]
  103704. 802a946: f100 0a30 add.w sl, r0, #48 @ 0x30
  103705. 802a94a: 9801 ldr r0, [sp, #4]
  103706. 802a94c: f000 ff38 bl 802b7c0 <__mcmp>
  103707. 802a950: 462a mov r2, r5
  103708. 802a952: 9006 str r0, [sp, #24]
  103709. 802a954: 4621 mov r1, r4
  103710. 802a956: 4648 mov r0, r9
  103711. 802a958: f000 ff4e bl 802b7f8 <__mdiff>
  103712. 802a95c: 68c2 ldr r2, [r0, #12]
  103713. 802a95e: 4606 mov r6, r0
  103714. 802a960: b9fa cbnz r2, 802a9a2 <_dtoa_r+0x942>
  103715. 802a962: 4601 mov r1, r0
  103716. 802a964: 9801 ldr r0, [sp, #4]
  103717. 802a966: f000 ff2b bl 802b7c0 <__mcmp>
  103718. 802a96a: 4602 mov r2, r0
  103719. 802a96c: 4631 mov r1, r6
  103720. 802a96e: 4648 mov r0, r9
  103721. 802a970: 920a str r2, [sp, #40] @ 0x28
  103722. 802a972: f000 fca1 bl 802b2b8 <_Bfree>
  103723. 802a976: 9b07 ldr r3, [sp, #28]
  103724. 802a978: 9a0a ldr r2, [sp, #40] @ 0x28
  103725. 802a97a: 9e05 ldr r6, [sp, #20]
  103726. 802a97c: ea43 0102 orr.w r1, r3, r2
  103727. 802a980: 9b08 ldr r3, [sp, #32]
  103728. 802a982: 4319 orrs r1, r3
  103729. 802a984: d10f bne.n 802a9a6 <_dtoa_r+0x946>
  103730. 802a986: f1ba 0f39 cmp.w sl, #57 @ 0x39
  103731. 802a98a: d028 beq.n 802a9de <_dtoa_r+0x97e>
  103732. 802a98c: 9b06 ldr r3, [sp, #24]
  103733. 802a98e: 2b00 cmp r3, #0
  103734. 802a990: dd02 ble.n 802a998 <_dtoa_r+0x938>
  103735. 802a992: 9b02 ldr r3, [sp, #8]
  103736. 802a994: f103 0a31 add.w sl, r3, #49 @ 0x31
  103737. 802a998: f88b a000 strb.w sl, [fp]
  103738. 802a99c: e639 b.n 802a612 <_dtoa_r+0x5b2>
  103739. 802a99e: 4628 mov r0, r5
  103740. 802a9a0: e7bd b.n 802a91e <_dtoa_r+0x8be>
  103741. 802a9a2: 2201 movs r2, #1
  103742. 802a9a4: e7e2 b.n 802a96c <_dtoa_r+0x90c>
  103743. 802a9a6: 9b06 ldr r3, [sp, #24]
  103744. 802a9a8: 2b00 cmp r3, #0
  103745. 802a9aa: db04 blt.n 802a9b6 <_dtoa_r+0x956>
  103746. 802a9ac: 9907 ldr r1, [sp, #28]
  103747. 802a9ae: 430b orrs r3, r1
  103748. 802a9b0: 9908 ldr r1, [sp, #32]
  103749. 802a9b2: 430b orrs r3, r1
  103750. 802a9b4: d120 bne.n 802a9f8 <_dtoa_r+0x998>
  103751. 802a9b6: 2a00 cmp r2, #0
  103752. 802a9b8: ddee ble.n 802a998 <_dtoa_r+0x938>
  103753. 802a9ba: 9901 ldr r1, [sp, #4]
  103754. 802a9bc: 2201 movs r2, #1
  103755. 802a9be: 4648 mov r0, r9
  103756. 802a9c0: f000 fe92 bl 802b6e8 <__lshift>
  103757. 802a9c4: 4621 mov r1, r4
  103758. 802a9c6: 9001 str r0, [sp, #4]
  103759. 802a9c8: f000 fefa bl 802b7c0 <__mcmp>
  103760. 802a9cc: 2800 cmp r0, #0
  103761. 802a9ce: dc03 bgt.n 802a9d8 <_dtoa_r+0x978>
  103762. 802a9d0: d1e2 bne.n 802a998 <_dtoa_r+0x938>
  103763. 802a9d2: f01a 0f01 tst.w sl, #1
  103764. 802a9d6: d0df beq.n 802a998 <_dtoa_r+0x938>
  103765. 802a9d8: f1ba 0f39 cmp.w sl, #57 @ 0x39
  103766. 802a9dc: d1d9 bne.n 802a992 <_dtoa_r+0x932>
  103767. 802a9de: 2339 movs r3, #57 @ 0x39
  103768. 802a9e0: f88b 3000 strb.w r3, [fp]
  103769. 802a9e4: 4633 mov r3, r6
  103770. 802a9e6: 461e mov r6, r3
  103771. 802a9e8: 3b01 subs r3, #1
  103772. 802a9ea: f816 2c01 ldrb.w r2, [r6, #-1]
  103773. 802a9ee: 2a39 cmp r2, #57 @ 0x39
  103774. 802a9f0: d053 beq.n 802aa9a <_dtoa_r+0xa3a>
  103775. 802a9f2: 3201 adds r2, #1
  103776. 802a9f4: 701a strb r2, [r3, #0]
  103777. 802a9f6: e60c b.n 802a612 <_dtoa_r+0x5b2>
  103778. 802a9f8: 2a00 cmp r2, #0
  103779. 802a9fa: dd07 ble.n 802aa0c <_dtoa_r+0x9ac>
  103780. 802a9fc: f1ba 0f39 cmp.w sl, #57 @ 0x39
  103781. 802aa00: d0ed beq.n 802a9de <_dtoa_r+0x97e>
  103782. 802aa02: f10a 0301 add.w r3, sl, #1
  103783. 802aa06: f88b 3000 strb.w r3, [fp]
  103784. 802aa0a: e602 b.n 802a612 <_dtoa_r+0x5b2>
  103785. 802aa0c: 9b05 ldr r3, [sp, #20]
  103786. 802aa0e: 9a05 ldr r2, [sp, #20]
  103787. 802aa10: f803 ac01 strb.w sl, [r3, #-1]
  103788. 802aa14: 9b09 ldr r3, [sp, #36] @ 0x24
  103789. 802aa16: 4293 cmp r3, r2
  103790. 802aa18: d029 beq.n 802aa6e <_dtoa_r+0xa0e>
  103791. 802aa1a: 9901 ldr r1, [sp, #4]
  103792. 802aa1c: 2300 movs r3, #0
  103793. 802aa1e: 220a movs r2, #10
  103794. 802aa20: 4648 mov r0, r9
  103795. 802aa22: f000 fc6b bl 802b2fc <__multadd>
  103796. 802aa26: 45a8 cmp r8, r5
  103797. 802aa28: 9001 str r0, [sp, #4]
  103798. 802aa2a: f04f 0300 mov.w r3, #0
  103799. 802aa2e: f04f 020a mov.w r2, #10
  103800. 802aa32: 4641 mov r1, r8
  103801. 802aa34: 4648 mov r0, r9
  103802. 802aa36: d107 bne.n 802aa48 <_dtoa_r+0x9e8>
  103803. 802aa38: f000 fc60 bl 802b2fc <__multadd>
  103804. 802aa3c: 4680 mov r8, r0
  103805. 802aa3e: 4605 mov r5, r0
  103806. 802aa40: 9b05 ldr r3, [sp, #20]
  103807. 802aa42: 3301 adds r3, #1
  103808. 802aa44: 9305 str r3, [sp, #20]
  103809. 802aa46: e775 b.n 802a934 <_dtoa_r+0x8d4>
  103810. 802aa48: f000 fc58 bl 802b2fc <__multadd>
  103811. 802aa4c: 4629 mov r1, r5
  103812. 802aa4e: 4680 mov r8, r0
  103813. 802aa50: 2300 movs r3, #0
  103814. 802aa52: 220a movs r2, #10
  103815. 802aa54: 4648 mov r0, r9
  103816. 802aa56: f000 fc51 bl 802b2fc <__multadd>
  103817. 802aa5a: 4605 mov r5, r0
  103818. 802aa5c: e7f0 b.n 802aa40 <_dtoa_r+0x9e0>
  103819. 802aa5e: f1bb 0f00 cmp.w fp, #0
  103820. 802aa62: bfcc ite gt
  103821. 802aa64: 465e movgt r6, fp
  103822. 802aa66: 2601 movle r6, #1
  103823. 802aa68: 443e add r6, r7
  103824. 802aa6a: f04f 0800 mov.w r8, #0
  103825. 802aa6e: 9901 ldr r1, [sp, #4]
  103826. 802aa70: 2201 movs r2, #1
  103827. 802aa72: 4648 mov r0, r9
  103828. 802aa74: f000 fe38 bl 802b6e8 <__lshift>
  103829. 802aa78: 4621 mov r1, r4
  103830. 802aa7a: 9001 str r0, [sp, #4]
  103831. 802aa7c: f000 fea0 bl 802b7c0 <__mcmp>
  103832. 802aa80: 2800 cmp r0, #0
  103833. 802aa82: dcaf bgt.n 802a9e4 <_dtoa_r+0x984>
  103834. 802aa84: d102 bne.n 802aa8c <_dtoa_r+0xa2c>
  103835. 802aa86: f01a 0f01 tst.w sl, #1
  103836. 802aa8a: d1ab bne.n 802a9e4 <_dtoa_r+0x984>
  103837. 802aa8c: 4633 mov r3, r6
  103838. 802aa8e: 461e mov r6, r3
  103839. 802aa90: f813 2d01 ldrb.w r2, [r3, #-1]!
  103840. 802aa94: 2a30 cmp r2, #48 @ 0x30
  103841. 802aa96: d0fa beq.n 802aa8e <_dtoa_r+0xa2e>
  103842. 802aa98: e5bb b.n 802a612 <_dtoa_r+0x5b2>
  103843. 802aa9a: 429f cmp r7, r3
  103844. 802aa9c: d1a3 bne.n 802a9e6 <_dtoa_r+0x986>
  103845. 802aa9e: 9b04 ldr r3, [sp, #16]
  103846. 802aaa0: 3301 adds r3, #1
  103847. 802aaa2: 9304 str r3, [sp, #16]
  103848. 802aaa4: 2331 movs r3, #49 @ 0x31
  103849. 802aaa6: 703b strb r3, [r7, #0]
  103850. 802aaa8: e5b3 b.n 802a612 <_dtoa_r+0x5b2>
  103851. 802aaaa: 9b1d ldr r3, [sp, #116] @ 0x74
  103852. 802aaac: 4f16 ldr r7, [pc, #88] @ (802ab08 <_dtoa_r+0xaa8>)
  103853. 802aaae: b11b cbz r3, 802aab8 <_dtoa_r+0xa58>
  103854. 802aab0: f107 0308 add.w r3, r7, #8
  103855. 802aab4: 9a1d ldr r2, [sp, #116] @ 0x74
  103856. 802aab6: 6013 str r3, [r2, #0]
  103857. 802aab8: 4638 mov r0, r7
  103858. 802aaba: b011 add sp, #68 @ 0x44
  103859. 802aabc: ecbd 8b02 vpop {d8}
  103860. 802aac0: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  103861. 802aac4: 9b07 ldr r3, [sp, #28]
  103862. 802aac6: 2b01 cmp r3, #1
  103863. 802aac8: f77f ae36 ble.w 802a738 <_dtoa_r+0x6d8>
  103864. 802aacc: 9b0a ldr r3, [sp, #40] @ 0x28
  103865. 802aace: 930b str r3, [sp, #44] @ 0x2c
  103866. 802aad0: 2001 movs r0, #1
  103867. 802aad2: e656 b.n 802a782 <_dtoa_r+0x722>
  103868. 802aad4: f1bb 0f00 cmp.w fp, #0
  103869. 802aad8: f77f aed7 ble.w 802a88a <_dtoa_r+0x82a>
  103870. 802aadc: 463e mov r6, r7
  103871. 802aade: 9801 ldr r0, [sp, #4]
  103872. 802aae0: 4621 mov r1, r4
  103873. 802aae2: f7ff fa33 bl 8029f4c <quorem>
  103874. 802aae6: f100 0a30 add.w sl, r0, #48 @ 0x30
  103875. 802aaea: f806 ab01 strb.w sl, [r6], #1
  103876. 802aaee: 1bf2 subs r2, r6, r7
  103877. 802aaf0: 4593 cmp fp, r2
  103878. 802aaf2: ddb4 ble.n 802aa5e <_dtoa_r+0x9fe>
  103879. 802aaf4: 9901 ldr r1, [sp, #4]
  103880. 802aaf6: 2300 movs r3, #0
  103881. 802aaf8: 220a movs r2, #10
  103882. 802aafa: 4648 mov r0, r9
  103883. 802aafc: f000 fbfe bl 802b2fc <__multadd>
  103884. 802ab00: 9001 str r0, [sp, #4]
  103885. 802ab02: e7ec b.n 802aade <_dtoa_r+0xa7e>
  103886. 802ab04: 08030ec6 .word 0x08030ec6
  103887. 802ab08: 08030e61 .word 0x08030e61
  103888. 0802ab0c <_free_r>:
  103889. 802ab0c: b538 push {r3, r4, r5, lr}
  103890. 802ab0e: 4605 mov r5, r0
  103891. 802ab10: 2900 cmp r1, #0
  103892. 802ab12: d041 beq.n 802ab98 <_free_r+0x8c>
  103893. 802ab14: f851 3c04 ldr.w r3, [r1, #-4]
  103894. 802ab18: 1f0c subs r4, r1, #4
  103895. 802ab1a: 2b00 cmp r3, #0
  103896. 802ab1c: bfb8 it lt
  103897. 802ab1e: 18e4 addlt r4, r4, r3
  103898. 802ab20: f7fd fc1e bl 8028360 <__malloc_lock>
  103899. 802ab24: 4a1d ldr r2, [pc, #116] @ (802ab9c <_free_r+0x90>)
  103900. 802ab26: 6813 ldr r3, [r2, #0]
  103901. 802ab28: b933 cbnz r3, 802ab38 <_free_r+0x2c>
  103902. 802ab2a: 6063 str r3, [r4, #4]
  103903. 802ab2c: 6014 str r4, [r2, #0]
  103904. 802ab2e: 4628 mov r0, r5
  103905. 802ab30: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  103906. 802ab34: f7fd bc1a b.w 802836c <__malloc_unlock>
  103907. 802ab38: 42a3 cmp r3, r4
  103908. 802ab3a: d908 bls.n 802ab4e <_free_r+0x42>
  103909. 802ab3c: 6820 ldr r0, [r4, #0]
  103910. 802ab3e: 1821 adds r1, r4, r0
  103911. 802ab40: 428b cmp r3, r1
  103912. 802ab42: bf01 itttt eq
  103913. 802ab44: 6819 ldreq r1, [r3, #0]
  103914. 802ab46: 685b ldreq r3, [r3, #4]
  103915. 802ab48: 1809 addeq r1, r1, r0
  103916. 802ab4a: 6021 streq r1, [r4, #0]
  103917. 802ab4c: e7ed b.n 802ab2a <_free_r+0x1e>
  103918. 802ab4e: 461a mov r2, r3
  103919. 802ab50: 685b ldr r3, [r3, #4]
  103920. 802ab52: b10b cbz r3, 802ab58 <_free_r+0x4c>
  103921. 802ab54: 42a3 cmp r3, r4
  103922. 802ab56: d9fa bls.n 802ab4e <_free_r+0x42>
  103923. 802ab58: 6811 ldr r1, [r2, #0]
  103924. 802ab5a: 1850 adds r0, r2, r1
  103925. 802ab5c: 42a0 cmp r0, r4
  103926. 802ab5e: d10b bne.n 802ab78 <_free_r+0x6c>
  103927. 802ab60: 6820 ldr r0, [r4, #0]
  103928. 802ab62: 4401 add r1, r0
  103929. 802ab64: 1850 adds r0, r2, r1
  103930. 802ab66: 4283 cmp r3, r0
  103931. 802ab68: 6011 str r1, [r2, #0]
  103932. 802ab6a: d1e0 bne.n 802ab2e <_free_r+0x22>
  103933. 802ab6c: 6818 ldr r0, [r3, #0]
  103934. 802ab6e: 685b ldr r3, [r3, #4]
  103935. 802ab70: 6053 str r3, [r2, #4]
  103936. 802ab72: 4408 add r0, r1
  103937. 802ab74: 6010 str r0, [r2, #0]
  103938. 802ab76: e7da b.n 802ab2e <_free_r+0x22>
  103939. 802ab78: d902 bls.n 802ab80 <_free_r+0x74>
  103940. 802ab7a: 230c movs r3, #12
  103941. 802ab7c: 602b str r3, [r5, #0]
  103942. 802ab7e: e7d6 b.n 802ab2e <_free_r+0x22>
  103943. 802ab80: 6820 ldr r0, [r4, #0]
  103944. 802ab82: 1821 adds r1, r4, r0
  103945. 802ab84: 428b cmp r3, r1
  103946. 802ab86: bf04 itt eq
  103947. 802ab88: 6819 ldreq r1, [r3, #0]
  103948. 802ab8a: 685b ldreq r3, [r3, #4]
  103949. 802ab8c: 6063 str r3, [r4, #4]
  103950. 802ab8e: bf04 itt eq
  103951. 802ab90: 1809 addeq r1, r1, r0
  103952. 802ab92: 6021 streq r1, [r4, #0]
  103953. 802ab94: 6054 str r4, [r2, #4]
  103954. 802ab96: e7ca b.n 802ab2e <_free_r+0x22>
  103955. 802ab98: bd38 pop {r3, r4, r5, pc}
  103956. 802ab9a: bf00 nop
  103957. 802ab9c: 2402b040 .word 0x2402b040
  103958. 0802aba0 <rshift>:
  103959. 802aba0: 6903 ldr r3, [r0, #16]
  103960. 802aba2: ebb3 1f61 cmp.w r3, r1, asr #5
  103961. 802aba6: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  103962. 802abaa: ea4f 1261 mov.w r2, r1, asr #5
  103963. 802abae: f100 0414 add.w r4, r0, #20
  103964. 802abb2: dd45 ble.n 802ac40 <rshift+0xa0>
  103965. 802abb4: f011 011f ands.w r1, r1, #31
  103966. 802abb8: eb04 0683 add.w r6, r4, r3, lsl #2
  103967. 802abbc: eb04 0582 add.w r5, r4, r2, lsl #2
  103968. 802abc0: d10c bne.n 802abdc <rshift+0x3c>
  103969. 802abc2: f100 0710 add.w r7, r0, #16
  103970. 802abc6: 4629 mov r1, r5
  103971. 802abc8: 42b1 cmp r1, r6
  103972. 802abca: d334 bcc.n 802ac36 <rshift+0x96>
  103973. 802abcc: 1a9b subs r3, r3, r2
  103974. 802abce: 009b lsls r3, r3, #2
  103975. 802abd0: 1eea subs r2, r5, #3
  103976. 802abd2: 4296 cmp r6, r2
  103977. 802abd4: bf38 it cc
  103978. 802abd6: 2300 movcc r3, #0
  103979. 802abd8: 4423 add r3, r4
  103980. 802abda: e015 b.n 802ac08 <rshift+0x68>
  103981. 802abdc: f854 7022 ldr.w r7, [r4, r2, lsl #2]
  103982. 802abe0: f1c1 0820 rsb r8, r1, #32
  103983. 802abe4: 40cf lsrs r7, r1
  103984. 802abe6: f105 0e04 add.w lr, r5, #4
  103985. 802abea: 46a1 mov r9, r4
  103986. 802abec: 4576 cmp r6, lr
  103987. 802abee: 46f4 mov ip, lr
  103988. 802abf0: d815 bhi.n 802ac1e <rshift+0x7e>
  103989. 802abf2: 1a9a subs r2, r3, r2
  103990. 802abf4: 0092 lsls r2, r2, #2
  103991. 802abf6: 3a04 subs r2, #4
  103992. 802abf8: 3501 adds r5, #1
  103993. 802abfa: 42ae cmp r6, r5
  103994. 802abfc: bf38 it cc
  103995. 802abfe: 2200 movcc r2, #0
  103996. 802ac00: 18a3 adds r3, r4, r2
  103997. 802ac02: 50a7 str r7, [r4, r2]
  103998. 802ac04: b107 cbz r7, 802ac08 <rshift+0x68>
  103999. 802ac06: 3304 adds r3, #4
  104000. 802ac08: 1b1a subs r2, r3, r4
  104001. 802ac0a: 42a3 cmp r3, r4
  104002. 802ac0c: ea4f 02a2 mov.w r2, r2, asr #2
  104003. 802ac10: bf08 it eq
  104004. 802ac12: 2300 moveq r3, #0
  104005. 802ac14: 6102 str r2, [r0, #16]
  104006. 802ac16: bf08 it eq
  104007. 802ac18: 6143 streq r3, [r0, #20]
  104008. 802ac1a: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  104009. 802ac1e: f8dc c000 ldr.w ip, [ip]
  104010. 802ac22: fa0c fc08 lsl.w ip, ip, r8
  104011. 802ac26: ea4c 0707 orr.w r7, ip, r7
  104012. 802ac2a: f849 7b04 str.w r7, [r9], #4
  104013. 802ac2e: f85e 7b04 ldr.w r7, [lr], #4
  104014. 802ac32: 40cf lsrs r7, r1
  104015. 802ac34: e7da b.n 802abec <rshift+0x4c>
  104016. 802ac36: f851 cb04 ldr.w ip, [r1], #4
  104017. 802ac3a: f847 cf04 str.w ip, [r7, #4]!
  104018. 802ac3e: e7c3 b.n 802abc8 <rshift+0x28>
  104019. 802ac40: 4623 mov r3, r4
  104020. 802ac42: e7e1 b.n 802ac08 <rshift+0x68>
  104021. 0802ac44 <__hexdig_fun>:
  104022. 802ac44: f1a0 0330 sub.w r3, r0, #48 @ 0x30
  104023. 802ac48: 2b09 cmp r3, #9
  104024. 802ac4a: d802 bhi.n 802ac52 <__hexdig_fun+0xe>
  104025. 802ac4c: 3820 subs r0, #32
  104026. 802ac4e: b2c0 uxtb r0, r0
  104027. 802ac50: 4770 bx lr
  104028. 802ac52: f1a0 0361 sub.w r3, r0, #97 @ 0x61
  104029. 802ac56: 2b05 cmp r3, #5
  104030. 802ac58: d801 bhi.n 802ac5e <__hexdig_fun+0x1a>
  104031. 802ac5a: 3847 subs r0, #71 @ 0x47
  104032. 802ac5c: e7f7 b.n 802ac4e <__hexdig_fun+0xa>
  104033. 802ac5e: f1a0 0341 sub.w r3, r0, #65 @ 0x41
  104034. 802ac62: 2b05 cmp r3, #5
  104035. 802ac64: d801 bhi.n 802ac6a <__hexdig_fun+0x26>
  104036. 802ac66: 3827 subs r0, #39 @ 0x27
  104037. 802ac68: e7f1 b.n 802ac4e <__hexdig_fun+0xa>
  104038. 802ac6a: 2000 movs r0, #0
  104039. 802ac6c: 4770 bx lr
  104040. ...
  104041. 0802ac70 <__gethex>:
  104042. 802ac70: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  104043. 802ac74: b085 sub sp, #20
  104044. 802ac76: 468a mov sl, r1
  104045. 802ac78: 9302 str r3, [sp, #8]
  104046. 802ac7a: 680b ldr r3, [r1, #0]
  104047. 802ac7c: 9001 str r0, [sp, #4]
  104048. 802ac7e: 4690 mov r8, r2
  104049. 802ac80: 1c9c adds r4, r3, #2
  104050. 802ac82: 46a1 mov r9, r4
  104051. 802ac84: f814 0b01 ldrb.w r0, [r4], #1
  104052. 802ac88: 2830 cmp r0, #48 @ 0x30
  104053. 802ac8a: d0fa beq.n 802ac82 <__gethex+0x12>
  104054. 802ac8c: eba9 0303 sub.w r3, r9, r3
  104055. 802ac90: f1a3 0b02 sub.w fp, r3, #2
  104056. 802ac94: f7ff ffd6 bl 802ac44 <__hexdig_fun>
  104057. 802ac98: 4605 mov r5, r0
  104058. 802ac9a: 2800 cmp r0, #0
  104059. 802ac9c: d168 bne.n 802ad70 <__gethex+0x100>
  104060. 802ac9e: 49a0 ldr r1, [pc, #640] @ (802af20 <__gethex+0x2b0>)
  104061. 802aca0: 2201 movs r2, #1
  104062. 802aca2: 4648 mov r0, r9
  104063. 802aca4: f7ff f82c bl 8029d00 <strncmp>
  104064. 802aca8: 4607 mov r7, r0
  104065. 802acaa: 2800 cmp r0, #0
  104066. 802acac: d167 bne.n 802ad7e <__gethex+0x10e>
  104067. 802acae: f899 0001 ldrb.w r0, [r9, #1]
  104068. 802acb2: 4626 mov r6, r4
  104069. 802acb4: f7ff ffc6 bl 802ac44 <__hexdig_fun>
  104070. 802acb8: 2800 cmp r0, #0
  104071. 802acba: d062 beq.n 802ad82 <__gethex+0x112>
  104072. 802acbc: 4623 mov r3, r4
  104073. 802acbe: 7818 ldrb r0, [r3, #0]
  104074. 802acc0: 2830 cmp r0, #48 @ 0x30
  104075. 802acc2: 4699 mov r9, r3
  104076. 802acc4: f103 0301 add.w r3, r3, #1
  104077. 802acc8: d0f9 beq.n 802acbe <__gethex+0x4e>
  104078. 802acca: f7ff ffbb bl 802ac44 <__hexdig_fun>
  104079. 802acce: fab0 f580 clz r5, r0
  104080. 802acd2: 096d lsrs r5, r5, #5
  104081. 802acd4: f04f 0b01 mov.w fp, #1
  104082. 802acd8: 464a mov r2, r9
  104083. 802acda: 4616 mov r6, r2
  104084. 802acdc: 3201 adds r2, #1
  104085. 802acde: 7830 ldrb r0, [r6, #0]
  104086. 802ace0: f7ff ffb0 bl 802ac44 <__hexdig_fun>
  104087. 802ace4: 2800 cmp r0, #0
  104088. 802ace6: d1f8 bne.n 802acda <__gethex+0x6a>
  104089. 802ace8: 498d ldr r1, [pc, #564] @ (802af20 <__gethex+0x2b0>)
  104090. 802acea: 2201 movs r2, #1
  104091. 802acec: 4630 mov r0, r6
  104092. 802acee: f7ff f807 bl 8029d00 <strncmp>
  104093. 802acf2: 2800 cmp r0, #0
  104094. 802acf4: d13f bne.n 802ad76 <__gethex+0x106>
  104095. 802acf6: b944 cbnz r4, 802ad0a <__gethex+0x9a>
  104096. 802acf8: 1c74 adds r4, r6, #1
  104097. 802acfa: 4622 mov r2, r4
  104098. 802acfc: 4616 mov r6, r2
  104099. 802acfe: 3201 adds r2, #1
  104100. 802ad00: 7830 ldrb r0, [r6, #0]
  104101. 802ad02: f7ff ff9f bl 802ac44 <__hexdig_fun>
  104102. 802ad06: 2800 cmp r0, #0
  104103. 802ad08: d1f8 bne.n 802acfc <__gethex+0x8c>
  104104. 802ad0a: 1ba4 subs r4, r4, r6
  104105. 802ad0c: 00a7 lsls r7, r4, #2
  104106. 802ad0e: 7833 ldrb r3, [r6, #0]
  104107. 802ad10: f003 03df and.w r3, r3, #223 @ 0xdf
  104108. 802ad14: 2b50 cmp r3, #80 @ 0x50
  104109. 802ad16: d13e bne.n 802ad96 <__gethex+0x126>
  104110. 802ad18: 7873 ldrb r3, [r6, #1]
  104111. 802ad1a: 2b2b cmp r3, #43 @ 0x2b
  104112. 802ad1c: d033 beq.n 802ad86 <__gethex+0x116>
  104113. 802ad1e: 2b2d cmp r3, #45 @ 0x2d
  104114. 802ad20: d034 beq.n 802ad8c <__gethex+0x11c>
  104115. 802ad22: 1c71 adds r1, r6, #1
  104116. 802ad24: 2400 movs r4, #0
  104117. 802ad26: 7808 ldrb r0, [r1, #0]
  104118. 802ad28: f7ff ff8c bl 802ac44 <__hexdig_fun>
  104119. 802ad2c: 1e43 subs r3, r0, #1
  104120. 802ad2e: b2db uxtb r3, r3
  104121. 802ad30: 2b18 cmp r3, #24
  104122. 802ad32: d830 bhi.n 802ad96 <__gethex+0x126>
  104123. 802ad34: f1a0 0210 sub.w r2, r0, #16
  104124. 802ad38: f811 0f01 ldrb.w r0, [r1, #1]!
  104125. 802ad3c: f7ff ff82 bl 802ac44 <__hexdig_fun>
  104126. 802ad40: f100 3cff add.w ip, r0, #4294967295 @ 0xffffffff
  104127. 802ad44: fa5f fc8c uxtb.w ip, ip
  104128. 802ad48: f1bc 0f18 cmp.w ip, #24
  104129. 802ad4c: f04f 030a mov.w r3, #10
  104130. 802ad50: d91e bls.n 802ad90 <__gethex+0x120>
  104131. 802ad52: b104 cbz r4, 802ad56 <__gethex+0xe6>
  104132. 802ad54: 4252 negs r2, r2
  104133. 802ad56: 4417 add r7, r2
  104134. 802ad58: f8ca 1000 str.w r1, [sl]
  104135. 802ad5c: b1ed cbz r5, 802ad9a <__gethex+0x12a>
  104136. 802ad5e: f1bb 0f00 cmp.w fp, #0
  104137. 802ad62: bf0c ite eq
  104138. 802ad64: 2506 moveq r5, #6
  104139. 802ad66: 2500 movne r5, #0
  104140. 802ad68: 4628 mov r0, r5
  104141. 802ad6a: b005 add sp, #20
  104142. 802ad6c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  104143. 802ad70: 2500 movs r5, #0
  104144. 802ad72: 462c mov r4, r5
  104145. 802ad74: e7b0 b.n 802acd8 <__gethex+0x68>
  104146. 802ad76: 2c00 cmp r4, #0
  104147. 802ad78: d1c7 bne.n 802ad0a <__gethex+0x9a>
  104148. 802ad7a: 4627 mov r7, r4
  104149. 802ad7c: e7c7 b.n 802ad0e <__gethex+0x9e>
  104150. 802ad7e: 464e mov r6, r9
  104151. 802ad80: 462f mov r7, r5
  104152. 802ad82: 2501 movs r5, #1
  104153. 802ad84: e7c3 b.n 802ad0e <__gethex+0x9e>
  104154. 802ad86: 2400 movs r4, #0
  104155. 802ad88: 1cb1 adds r1, r6, #2
  104156. 802ad8a: e7cc b.n 802ad26 <__gethex+0xb6>
  104157. 802ad8c: 2401 movs r4, #1
  104158. 802ad8e: e7fb b.n 802ad88 <__gethex+0x118>
  104159. 802ad90: fb03 0002 mla r0, r3, r2, r0
  104160. 802ad94: e7ce b.n 802ad34 <__gethex+0xc4>
  104161. 802ad96: 4631 mov r1, r6
  104162. 802ad98: e7de b.n 802ad58 <__gethex+0xe8>
  104163. 802ad9a: eba6 0309 sub.w r3, r6, r9
  104164. 802ad9e: 3b01 subs r3, #1
  104165. 802ada0: 4629 mov r1, r5
  104166. 802ada2: 2b07 cmp r3, #7
  104167. 802ada4: dc0a bgt.n 802adbc <__gethex+0x14c>
  104168. 802ada6: 9801 ldr r0, [sp, #4]
  104169. 802ada8: f000 fa46 bl 802b238 <_Balloc>
  104170. 802adac: 4604 mov r4, r0
  104171. 802adae: b940 cbnz r0, 802adc2 <__gethex+0x152>
  104172. 802adb0: 4b5c ldr r3, [pc, #368] @ (802af24 <__gethex+0x2b4>)
  104173. 802adb2: 4602 mov r2, r0
  104174. 802adb4: 21e4 movs r1, #228 @ 0xe4
  104175. 802adb6: 485c ldr r0, [pc, #368] @ (802af28 <__gethex+0x2b8>)
  104176. 802adb8: f7ff f8aa bl 8029f10 <__assert_func>
  104177. 802adbc: 3101 adds r1, #1
  104178. 802adbe: 105b asrs r3, r3, #1
  104179. 802adc0: e7ef b.n 802ada2 <__gethex+0x132>
  104180. 802adc2: f100 0a14 add.w sl, r0, #20
  104181. 802adc6: 2300 movs r3, #0
  104182. 802adc8: 4655 mov r5, sl
  104183. 802adca: 469b mov fp, r3
  104184. 802adcc: 45b1 cmp r9, r6
  104185. 802adce: d337 bcc.n 802ae40 <__gethex+0x1d0>
  104186. 802add0: f845 bb04 str.w fp, [r5], #4
  104187. 802add4: eba5 050a sub.w r5, r5, sl
  104188. 802add8: 10ad asrs r5, r5, #2
  104189. 802adda: 6125 str r5, [r4, #16]
  104190. 802addc: 4658 mov r0, fp
  104191. 802adde: f000 fb1d bl 802b41c <__hi0bits>
  104192. 802ade2: 016d lsls r5, r5, #5
  104193. 802ade4: f8d8 6000 ldr.w r6, [r8]
  104194. 802ade8: 1a2d subs r5, r5, r0
  104195. 802adea: 42b5 cmp r5, r6
  104196. 802adec: dd54 ble.n 802ae98 <__gethex+0x228>
  104197. 802adee: 1bad subs r5, r5, r6
  104198. 802adf0: 4629 mov r1, r5
  104199. 802adf2: 4620 mov r0, r4
  104200. 802adf4: f000 feae bl 802bb54 <__any_on>
  104201. 802adf8: 4681 mov r9, r0
  104202. 802adfa: b178 cbz r0, 802ae1c <__gethex+0x1ac>
  104203. 802adfc: 1e6b subs r3, r5, #1
  104204. 802adfe: 1159 asrs r1, r3, #5
  104205. 802ae00: f003 021f and.w r2, r3, #31
  104206. 802ae04: f85a 1021 ldr.w r1, [sl, r1, lsl #2]
  104207. 802ae08: f04f 0901 mov.w r9, #1
  104208. 802ae0c: fa09 f202 lsl.w r2, r9, r2
  104209. 802ae10: 420a tst r2, r1
  104210. 802ae12: d003 beq.n 802ae1c <__gethex+0x1ac>
  104211. 802ae14: 454b cmp r3, r9
  104212. 802ae16: dc36 bgt.n 802ae86 <__gethex+0x216>
  104213. 802ae18: f04f 0902 mov.w r9, #2
  104214. 802ae1c: 4629 mov r1, r5
  104215. 802ae1e: 4620 mov r0, r4
  104216. 802ae20: f7ff febe bl 802aba0 <rshift>
  104217. 802ae24: 442f add r7, r5
  104218. 802ae26: f8d8 3008 ldr.w r3, [r8, #8]
  104219. 802ae2a: 42bb cmp r3, r7
  104220. 802ae2c: da42 bge.n 802aeb4 <__gethex+0x244>
  104221. 802ae2e: 9801 ldr r0, [sp, #4]
  104222. 802ae30: 4621 mov r1, r4
  104223. 802ae32: f000 fa41 bl 802b2b8 <_Bfree>
  104224. 802ae36: 9a0e ldr r2, [sp, #56] @ 0x38
  104225. 802ae38: 2300 movs r3, #0
  104226. 802ae3a: 6013 str r3, [r2, #0]
  104227. 802ae3c: 25a3 movs r5, #163 @ 0xa3
  104228. 802ae3e: e793 b.n 802ad68 <__gethex+0xf8>
  104229. 802ae40: f816 2d01 ldrb.w r2, [r6, #-1]!
  104230. 802ae44: 2a2e cmp r2, #46 @ 0x2e
  104231. 802ae46: d012 beq.n 802ae6e <__gethex+0x1fe>
  104232. 802ae48: 2b20 cmp r3, #32
  104233. 802ae4a: d104 bne.n 802ae56 <__gethex+0x1e6>
  104234. 802ae4c: f845 bb04 str.w fp, [r5], #4
  104235. 802ae50: f04f 0b00 mov.w fp, #0
  104236. 802ae54: 465b mov r3, fp
  104237. 802ae56: 7830 ldrb r0, [r6, #0]
  104238. 802ae58: 9303 str r3, [sp, #12]
  104239. 802ae5a: f7ff fef3 bl 802ac44 <__hexdig_fun>
  104240. 802ae5e: 9b03 ldr r3, [sp, #12]
  104241. 802ae60: f000 000f and.w r0, r0, #15
  104242. 802ae64: 4098 lsls r0, r3
  104243. 802ae66: ea4b 0b00 orr.w fp, fp, r0
  104244. 802ae6a: 3304 adds r3, #4
  104245. 802ae6c: e7ae b.n 802adcc <__gethex+0x15c>
  104246. 802ae6e: 45b1 cmp r9, r6
  104247. 802ae70: d8ea bhi.n 802ae48 <__gethex+0x1d8>
  104248. 802ae72: 492b ldr r1, [pc, #172] @ (802af20 <__gethex+0x2b0>)
  104249. 802ae74: 9303 str r3, [sp, #12]
  104250. 802ae76: 2201 movs r2, #1
  104251. 802ae78: 4630 mov r0, r6
  104252. 802ae7a: f7fe ff41 bl 8029d00 <strncmp>
  104253. 802ae7e: 9b03 ldr r3, [sp, #12]
  104254. 802ae80: 2800 cmp r0, #0
  104255. 802ae82: d1e1 bne.n 802ae48 <__gethex+0x1d8>
  104256. 802ae84: e7a2 b.n 802adcc <__gethex+0x15c>
  104257. 802ae86: 1ea9 subs r1, r5, #2
  104258. 802ae88: 4620 mov r0, r4
  104259. 802ae8a: f000 fe63 bl 802bb54 <__any_on>
  104260. 802ae8e: 2800 cmp r0, #0
  104261. 802ae90: d0c2 beq.n 802ae18 <__gethex+0x1a8>
  104262. 802ae92: f04f 0903 mov.w r9, #3
  104263. 802ae96: e7c1 b.n 802ae1c <__gethex+0x1ac>
  104264. 802ae98: da09 bge.n 802aeae <__gethex+0x23e>
  104265. 802ae9a: 1b75 subs r5, r6, r5
  104266. 802ae9c: 4621 mov r1, r4
  104267. 802ae9e: 9801 ldr r0, [sp, #4]
  104268. 802aea0: 462a mov r2, r5
  104269. 802aea2: f000 fc21 bl 802b6e8 <__lshift>
  104270. 802aea6: 1b7f subs r7, r7, r5
  104271. 802aea8: 4604 mov r4, r0
  104272. 802aeaa: f100 0a14 add.w sl, r0, #20
  104273. 802aeae: f04f 0900 mov.w r9, #0
  104274. 802aeb2: e7b8 b.n 802ae26 <__gethex+0x1b6>
  104275. 802aeb4: f8d8 5004 ldr.w r5, [r8, #4]
  104276. 802aeb8: 42bd cmp r5, r7
  104277. 802aeba: dd6f ble.n 802af9c <__gethex+0x32c>
  104278. 802aebc: 1bed subs r5, r5, r7
  104279. 802aebe: 42ae cmp r6, r5
  104280. 802aec0: dc34 bgt.n 802af2c <__gethex+0x2bc>
  104281. 802aec2: f8d8 300c ldr.w r3, [r8, #12]
  104282. 802aec6: 2b02 cmp r3, #2
  104283. 802aec8: d022 beq.n 802af10 <__gethex+0x2a0>
  104284. 802aeca: 2b03 cmp r3, #3
  104285. 802aecc: d024 beq.n 802af18 <__gethex+0x2a8>
  104286. 802aece: 2b01 cmp r3, #1
  104287. 802aed0: d115 bne.n 802aefe <__gethex+0x28e>
  104288. 802aed2: 42ae cmp r6, r5
  104289. 802aed4: d113 bne.n 802aefe <__gethex+0x28e>
  104290. 802aed6: 2e01 cmp r6, #1
  104291. 802aed8: d10b bne.n 802aef2 <__gethex+0x282>
  104292. 802aeda: 9a02 ldr r2, [sp, #8]
  104293. 802aedc: f8d8 3004 ldr.w r3, [r8, #4]
  104294. 802aee0: 6013 str r3, [r2, #0]
  104295. 802aee2: 2301 movs r3, #1
  104296. 802aee4: 6123 str r3, [r4, #16]
  104297. 802aee6: f8ca 3000 str.w r3, [sl]
  104298. 802aeea: 9b0e ldr r3, [sp, #56] @ 0x38
  104299. 802aeec: 2562 movs r5, #98 @ 0x62
  104300. 802aeee: 601c str r4, [r3, #0]
  104301. 802aef0: e73a b.n 802ad68 <__gethex+0xf8>
  104302. 802aef2: 1e71 subs r1, r6, #1
  104303. 802aef4: 4620 mov r0, r4
  104304. 802aef6: f000 fe2d bl 802bb54 <__any_on>
  104305. 802aefa: 2800 cmp r0, #0
  104306. 802aefc: d1ed bne.n 802aeda <__gethex+0x26a>
  104307. 802aefe: 9801 ldr r0, [sp, #4]
  104308. 802af00: 4621 mov r1, r4
  104309. 802af02: f000 f9d9 bl 802b2b8 <_Bfree>
  104310. 802af06: 9a0e ldr r2, [sp, #56] @ 0x38
  104311. 802af08: 2300 movs r3, #0
  104312. 802af0a: 6013 str r3, [r2, #0]
  104313. 802af0c: 2550 movs r5, #80 @ 0x50
  104314. 802af0e: e72b b.n 802ad68 <__gethex+0xf8>
  104315. 802af10: 9b0f ldr r3, [sp, #60] @ 0x3c
  104316. 802af12: 2b00 cmp r3, #0
  104317. 802af14: d1f3 bne.n 802aefe <__gethex+0x28e>
  104318. 802af16: e7e0 b.n 802aeda <__gethex+0x26a>
  104319. 802af18: 9b0f ldr r3, [sp, #60] @ 0x3c
  104320. 802af1a: 2b00 cmp r3, #0
  104321. 802af1c: d1dd bne.n 802aeda <__gethex+0x26a>
  104322. 802af1e: e7ee b.n 802aefe <__gethex+0x28e>
  104323. 802af20: 08030c95 .word 0x08030c95
  104324. 802af24: 08030ec6 .word 0x08030ec6
  104325. 802af28: 08030ed7 .word 0x08030ed7
  104326. 802af2c: 1e6f subs r7, r5, #1
  104327. 802af2e: f1b9 0f00 cmp.w r9, #0
  104328. 802af32: d130 bne.n 802af96 <__gethex+0x326>
  104329. 802af34: b127 cbz r7, 802af40 <__gethex+0x2d0>
  104330. 802af36: 4639 mov r1, r7
  104331. 802af38: 4620 mov r0, r4
  104332. 802af3a: f000 fe0b bl 802bb54 <__any_on>
  104333. 802af3e: 4681 mov r9, r0
  104334. 802af40: 117a asrs r2, r7, #5
  104335. 802af42: 2301 movs r3, #1
  104336. 802af44: f85a 2022 ldr.w r2, [sl, r2, lsl #2]
  104337. 802af48: f007 071f and.w r7, r7, #31
  104338. 802af4c: 40bb lsls r3, r7
  104339. 802af4e: 4213 tst r3, r2
  104340. 802af50: 4629 mov r1, r5
  104341. 802af52: 4620 mov r0, r4
  104342. 802af54: bf18 it ne
  104343. 802af56: f049 0902 orrne.w r9, r9, #2
  104344. 802af5a: f7ff fe21 bl 802aba0 <rshift>
  104345. 802af5e: f8d8 7004 ldr.w r7, [r8, #4]
  104346. 802af62: 1b76 subs r6, r6, r5
  104347. 802af64: 2502 movs r5, #2
  104348. 802af66: f1b9 0f00 cmp.w r9, #0
  104349. 802af6a: d047 beq.n 802affc <__gethex+0x38c>
  104350. 802af6c: f8d8 300c ldr.w r3, [r8, #12]
  104351. 802af70: 2b02 cmp r3, #2
  104352. 802af72: d015 beq.n 802afa0 <__gethex+0x330>
  104353. 802af74: 2b03 cmp r3, #3
  104354. 802af76: d017 beq.n 802afa8 <__gethex+0x338>
  104355. 802af78: 2b01 cmp r3, #1
  104356. 802af7a: d109 bne.n 802af90 <__gethex+0x320>
  104357. 802af7c: f019 0f02 tst.w r9, #2
  104358. 802af80: d006 beq.n 802af90 <__gethex+0x320>
  104359. 802af82: f8da 3000 ldr.w r3, [sl]
  104360. 802af86: ea49 0903 orr.w r9, r9, r3
  104361. 802af8a: f019 0f01 tst.w r9, #1
  104362. 802af8e: d10e bne.n 802afae <__gethex+0x33e>
  104363. 802af90: f045 0510 orr.w r5, r5, #16
  104364. 802af94: e032 b.n 802affc <__gethex+0x38c>
  104365. 802af96: f04f 0901 mov.w r9, #1
  104366. 802af9a: e7d1 b.n 802af40 <__gethex+0x2d0>
  104367. 802af9c: 2501 movs r5, #1
  104368. 802af9e: e7e2 b.n 802af66 <__gethex+0x2f6>
  104369. 802afa0: 9b0f ldr r3, [sp, #60] @ 0x3c
  104370. 802afa2: f1c3 0301 rsb r3, r3, #1
  104371. 802afa6: 930f str r3, [sp, #60] @ 0x3c
  104372. 802afa8: 9b0f ldr r3, [sp, #60] @ 0x3c
  104373. 802afaa: 2b00 cmp r3, #0
  104374. 802afac: d0f0 beq.n 802af90 <__gethex+0x320>
  104375. 802afae: f8d4 b010 ldr.w fp, [r4, #16]
  104376. 802afb2: f104 0314 add.w r3, r4, #20
  104377. 802afb6: ea4f 0a8b mov.w sl, fp, lsl #2
  104378. 802afba: eb03 018b add.w r1, r3, fp, lsl #2
  104379. 802afbe: f04f 0c00 mov.w ip, #0
  104380. 802afc2: 4618 mov r0, r3
  104381. 802afc4: f853 2b04 ldr.w r2, [r3], #4
  104382. 802afc8: f1b2 3fff cmp.w r2, #4294967295 @ 0xffffffff
  104383. 802afcc: d01b beq.n 802b006 <__gethex+0x396>
  104384. 802afce: 3201 adds r2, #1
  104385. 802afd0: 6002 str r2, [r0, #0]
  104386. 802afd2: 2d02 cmp r5, #2
  104387. 802afd4: f104 0314 add.w r3, r4, #20
  104388. 802afd8: d13c bne.n 802b054 <__gethex+0x3e4>
  104389. 802afda: f8d8 2000 ldr.w r2, [r8]
  104390. 802afde: 3a01 subs r2, #1
  104391. 802afe0: 42b2 cmp r2, r6
  104392. 802afe2: d109 bne.n 802aff8 <__gethex+0x388>
  104393. 802afe4: 1171 asrs r1, r6, #5
  104394. 802afe6: 2201 movs r2, #1
  104395. 802afe8: f853 3021 ldr.w r3, [r3, r1, lsl #2]
  104396. 802afec: f006 061f and.w r6, r6, #31
  104397. 802aff0: fa02 f606 lsl.w r6, r2, r6
  104398. 802aff4: 421e tst r6, r3
  104399. 802aff6: d13a bne.n 802b06e <__gethex+0x3fe>
  104400. 802aff8: f045 0520 orr.w r5, r5, #32
  104401. 802affc: 9b0e ldr r3, [sp, #56] @ 0x38
  104402. 802affe: 601c str r4, [r3, #0]
  104403. 802b000: 9b02 ldr r3, [sp, #8]
  104404. 802b002: 601f str r7, [r3, #0]
  104405. 802b004: e6b0 b.n 802ad68 <__gethex+0xf8>
  104406. 802b006: 4299 cmp r1, r3
  104407. 802b008: f843 cc04 str.w ip, [r3, #-4]
  104408. 802b00c: d8d9 bhi.n 802afc2 <__gethex+0x352>
  104409. 802b00e: 68a3 ldr r3, [r4, #8]
  104410. 802b010: 459b cmp fp, r3
  104411. 802b012: db17 blt.n 802b044 <__gethex+0x3d4>
  104412. 802b014: 6861 ldr r1, [r4, #4]
  104413. 802b016: 9801 ldr r0, [sp, #4]
  104414. 802b018: 3101 adds r1, #1
  104415. 802b01a: f000 f90d bl 802b238 <_Balloc>
  104416. 802b01e: 4681 mov r9, r0
  104417. 802b020: b918 cbnz r0, 802b02a <__gethex+0x3ba>
  104418. 802b022: 4b1a ldr r3, [pc, #104] @ (802b08c <__gethex+0x41c>)
  104419. 802b024: 4602 mov r2, r0
  104420. 802b026: 2184 movs r1, #132 @ 0x84
  104421. 802b028: e6c5 b.n 802adb6 <__gethex+0x146>
  104422. 802b02a: 6922 ldr r2, [r4, #16]
  104423. 802b02c: 3202 adds r2, #2
  104424. 802b02e: f104 010c add.w r1, r4, #12
  104425. 802b032: 0092 lsls r2, r2, #2
  104426. 802b034: 300c adds r0, #12
  104427. 802b036: f7fe ff52 bl 8029ede <memcpy>
  104428. 802b03a: 4621 mov r1, r4
  104429. 802b03c: 9801 ldr r0, [sp, #4]
  104430. 802b03e: f000 f93b bl 802b2b8 <_Bfree>
  104431. 802b042: 464c mov r4, r9
  104432. 802b044: 6923 ldr r3, [r4, #16]
  104433. 802b046: 1c5a adds r2, r3, #1
  104434. 802b048: eb04 0383 add.w r3, r4, r3, lsl #2
  104435. 802b04c: 6122 str r2, [r4, #16]
  104436. 802b04e: 2201 movs r2, #1
  104437. 802b050: 615a str r2, [r3, #20]
  104438. 802b052: e7be b.n 802afd2 <__gethex+0x362>
  104439. 802b054: 6922 ldr r2, [r4, #16]
  104440. 802b056: 455a cmp r2, fp
  104441. 802b058: dd0b ble.n 802b072 <__gethex+0x402>
  104442. 802b05a: 2101 movs r1, #1
  104443. 802b05c: 4620 mov r0, r4
  104444. 802b05e: f7ff fd9f bl 802aba0 <rshift>
  104445. 802b062: f8d8 3008 ldr.w r3, [r8, #8]
  104446. 802b066: 3701 adds r7, #1
  104447. 802b068: 42bb cmp r3, r7
  104448. 802b06a: f6ff aee0 blt.w 802ae2e <__gethex+0x1be>
  104449. 802b06e: 2501 movs r5, #1
  104450. 802b070: e7c2 b.n 802aff8 <__gethex+0x388>
  104451. 802b072: f016 061f ands.w r6, r6, #31
  104452. 802b076: d0fa beq.n 802b06e <__gethex+0x3fe>
  104453. 802b078: 4453 add r3, sl
  104454. 802b07a: f1c6 0620 rsb r6, r6, #32
  104455. 802b07e: f853 0c04 ldr.w r0, [r3, #-4]
  104456. 802b082: f000 f9cb bl 802b41c <__hi0bits>
  104457. 802b086: 42b0 cmp r0, r6
  104458. 802b088: dbe7 blt.n 802b05a <__gethex+0x3ea>
  104459. 802b08a: e7f0 b.n 802b06e <__gethex+0x3fe>
  104460. 802b08c: 08030ec6 .word 0x08030ec6
  104461. 0802b090 <L_shift>:
  104462. 802b090: f1c2 0208 rsb r2, r2, #8
  104463. 802b094: 0092 lsls r2, r2, #2
  104464. 802b096: b570 push {r4, r5, r6, lr}
  104465. 802b098: f1c2 0620 rsb r6, r2, #32
  104466. 802b09c: 6843 ldr r3, [r0, #4]
  104467. 802b09e: 6804 ldr r4, [r0, #0]
  104468. 802b0a0: fa03 f506 lsl.w r5, r3, r6
  104469. 802b0a4: 432c orrs r4, r5
  104470. 802b0a6: 40d3 lsrs r3, r2
  104471. 802b0a8: 6004 str r4, [r0, #0]
  104472. 802b0aa: f840 3f04 str.w r3, [r0, #4]!
  104473. 802b0ae: 4288 cmp r0, r1
  104474. 802b0b0: d3f4 bcc.n 802b09c <L_shift+0xc>
  104475. 802b0b2: bd70 pop {r4, r5, r6, pc}
  104476. 0802b0b4 <__match>:
  104477. 802b0b4: b530 push {r4, r5, lr}
  104478. 802b0b6: 6803 ldr r3, [r0, #0]
  104479. 802b0b8: 3301 adds r3, #1
  104480. 802b0ba: f811 4b01 ldrb.w r4, [r1], #1
  104481. 802b0be: b914 cbnz r4, 802b0c6 <__match+0x12>
  104482. 802b0c0: 6003 str r3, [r0, #0]
  104483. 802b0c2: 2001 movs r0, #1
  104484. 802b0c4: bd30 pop {r4, r5, pc}
  104485. 802b0c6: f813 2b01 ldrb.w r2, [r3], #1
  104486. 802b0ca: f1a2 0541 sub.w r5, r2, #65 @ 0x41
  104487. 802b0ce: 2d19 cmp r5, #25
  104488. 802b0d0: bf98 it ls
  104489. 802b0d2: 3220 addls r2, #32
  104490. 802b0d4: 42a2 cmp r2, r4
  104491. 802b0d6: d0f0 beq.n 802b0ba <__match+0x6>
  104492. 802b0d8: 2000 movs r0, #0
  104493. 802b0da: e7f3 b.n 802b0c4 <__match+0x10>
  104494. 0802b0dc <__hexnan>:
  104495. 802b0dc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  104496. 802b0e0: 680b ldr r3, [r1, #0]
  104497. 802b0e2: 6801 ldr r1, [r0, #0]
  104498. 802b0e4: 115e asrs r6, r3, #5
  104499. 802b0e6: eb02 0686 add.w r6, r2, r6, lsl #2
  104500. 802b0ea: f013 031f ands.w r3, r3, #31
  104501. 802b0ee: b087 sub sp, #28
  104502. 802b0f0: bf18 it ne
  104503. 802b0f2: 3604 addne r6, #4
  104504. 802b0f4: 2500 movs r5, #0
  104505. 802b0f6: 1f37 subs r7, r6, #4
  104506. 802b0f8: 4682 mov sl, r0
  104507. 802b0fa: 4690 mov r8, r2
  104508. 802b0fc: 9301 str r3, [sp, #4]
  104509. 802b0fe: f846 5c04 str.w r5, [r6, #-4]
  104510. 802b102: 46b9 mov r9, r7
  104511. 802b104: 463c mov r4, r7
  104512. 802b106: 9502 str r5, [sp, #8]
  104513. 802b108: 46ab mov fp, r5
  104514. 802b10a: 784a ldrb r2, [r1, #1]
  104515. 802b10c: 1c4b adds r3, r1, #1
  104516. 802b10e: 9303 str r3, [sp, #12]
  104517. 802b110: b342 cbz r2, 802b164 <__hexnan+0x88>
  104518. 802b112: 4610 mov r0, r2
  104519. 802b114: 9105 str r1, [sp, #20]
  104520. 802b116: 9204 str r2, [sp, #16]
  104521. 802b118: f7ff fd94 bl 802ac44 <__hexdig_fun>
  104522. 802b11c: 2800 cmp r0, #0
  104523. 802b11e: d151 bne.n 802b1c4 <__hexnan+0xe8>
  104524. 802b120: 9a04 ldr r2, [sp, #16]
  104525. 802b122: 9905 ldr r1, [sp, #20]
  104526. 802b124: 2a20 cmp r2, #32
  104527. 802b126: d818 bhi.n 802b15a <__hexnan+0x7e>
  104528. 802b128: 9b02 ldr r3, [sp, #8]
  104529. 802b12a: 459b cmp fp, r3
  104530. 802b12c: dd13 ble.n 802b156 <__hexnan+0x7a>
  104531. 802b12e: 454c cmp r4, r9
  104532. 802b130: d206 bcs.n 802b140 <__hexnan+0x64>
  104533. 802b132: 2d07 cmp r5, #7
  104534. 802b134: dc04 bgt.n 802b140 <__hexnan+0x64>
  104535. 802b136: 462a mov r2, r5
  104536. 802b138: 4649 mov r1, r9
  104537. 802b13a: 4620 mov r0, r4
  104538. 802b13c: f7ff ffa8 bl 802b090 <L_shift>
  104539. 802b140: 4544 cmp r4, r8
  104540. 802b142: d952 bls.n 802b1ea <__hexnan+0x10e>
  104541. 802b144: 2300 movs r3, #0
  104542. 802b146: f1a4 0904 sub.w r9, r4, #4
  104543. 802b14a: f844 3c04 str.w r3, [r4, #-4]
  104544. 802b14e: f8cd b008 str.w fp, [sp, #8]
  104545. 802b152: 464c mov r4, r9
  104546. 802b154: 461d mov r5, r3
  104547. 802b156: 9903 ldr r1, [sp, #12]
  104548. 802b158: e7d7 b.n 802b10a <__hexnan+0x2e>
  104549. 802b15a: 2a29 cmp r2, #41 @ 0x29
  104550. 802b15c: d157 bne.n 802b20e <__hexnan+0x132>
  104551. 802b15e: 3102 adds r1, #2
  104552. 802b160: f8ca 1000 str.w r1, [sl]
  104553. 802b164: f1bb 0f00 cmp.w fp, #0
  104554. 802b168: d051 beq.n 802b20e <__hexnan+0x132>
  104555. 802b16a: 454c cmp r4, r9
  104556. 802b16c: d206 bcs.n 802b17c <__hexnan+0xa0>
  104557. 802b16e: 2d07 cmp r5, #7
  104558. 802b170: dc04 bgt.n 802b17c <__hexnan+0xa0>
  104559. 802b172: 462a mov r2, r5
  104560. 802b174: 4649 mov r1, r9
  104561. 802b176: 4620 mov r0, r4
  104562. 802b178: f7ff ff8a bl 802b090 <L_shift>
  104563. 802b17c: 4544 cmp r4, r8
  104564. 802b17e: d936 bls.n 802b1ee <__hexnan+0x112>
  104565. 802b180: f1a8 0204 sub.w r2, r8, #4
  104566. 802b184: 4623 mov r3, r4
  104567. 802b186: f853 1b04 ldr.w r1, [r3], #4
  104568. 802b18a: f842 1f04 str.w r1, [r2, #4]!
  104569. 802b18e: 429f cmp r7, r3
  104570. 802b190: d2f9 bcs.n 802b186 <__hexnan+0xaa>
  104571. 802b192: 1b3b subs r3, r7, r4
  104572. 802b194: f023 0303 bic.w r3, r3, #3
  104573. 802b198: 3304 adds r3, #4
  104574. 802b19a: 3401 adds r4, #1
  104575. 802b19c: 3e03 subs r6, #3
  104576. 802b19e: 42b4 cmp r4, r6
  104577. 802b1a0: bf88 it hi
  104578. 802b1a2: 2304 movhi r3, #4
  104579. 802b1a4: 4443 add r3, r8
  104580. 802b1a6: 2200 movs r2, #0
  104581. 802b1a8: f843 2b04 str.w r2, [r3], #4
  104582. 802b1ac: 429f cmp r7, r3
  104583. 802b1ae: d2fb bcs.n 802b1a8 <__hexnan+0xcc>
  104584. 802b1b0: 683b ldr r3, [r7, #0]
  104585. 802b1b2: b91b cbnz r3, 802b1bc <__hexnan+0xe0>
  104586. 802b1b4: 4547 cmp r7, r8
  104587. 802b1b6: d128 bne.n 802b20a <__hexnan+0x12e>
  104588. 802b1b8: 2301 movs r3, #1
  104589. 802b1ba: 603b str r3, [r7, #0]
  104590. 802b1bc: 2005 movs r0, #5
  104591. 802b1be: b007 add sp, #28
  104592. 802b1c0: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  104593. 802b1c4: 3501 adds r5, #1
  104594. 802b1c6: 2d08 cmp r5, #8
  104595. 802b1c8: f10b 0b01 add.w fp, fp, #1
  104596. 802b1cc: dd06 ble.n 802b1dc <__hexnan+0x100>
  104597. 802b1ce: 4544 cmp r4, r8
  104598. 802b1d0: d9c1 bls.n 802b156 <__hexnan+0x7a>
  104599. 802b1d2: 2300 movs r3, #0
  104600. 802b1d4: f844 3c04 str.w r3, [r4, #-4]
  104601. 802b1d8: 2501 movs r5, #1
  104602. 802b1da: 3c04 subs r4, #4
  104603. 802b1dc: 6822 ldr r2, [r4, #0]
  104604. 802b1de: f000 000f and.w r0, r0, #15
  104605. 802b1e2: ea40 1002 orr.w r0, r0, r2, lsl #4
  104606. 802b1e6: 6020 str r0, [r4, #0]
  104607. 802b1e8: e7b5 b.n 802b156 <__hexnan+0x7a>
  104608. 802b1ea: 2508 movs r5, #8
  104609. 802b1ec: e7b3 b.n 802b156 <__hexnan+0x7a>
  104610. 802b1ee: 9b01 ldr r3, [sp, #4]
  104611. 802b1f0: 2b00 cmp r3, #0
  104612. 802b1f2: d0dd beq.n 802b1b0 <__hexnan+0xd4>
  104613. 802b1f4: f1c3 0320 rsb r3, r3, #32
  104614. 802b1f8: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  104615. 802b1fc: 40da lsrs r2, r3
  104616. 802b1fe: f856 3c04 ldr.w r3, [r6, #-4]
  104617. 802b202: 4013 ands r3, r2
  104618. 802b204: f846 3c04 str.w r3, [r6, #-4]
  104619. 802b208: e7d2 b.n 802b1b0 <__hexnan+0xd4>
  104620. 802b20a: 3f04 subs r7, #4
  104621. 802b20c: e7d0 b.n 802b1b0 <__hexnan+0xd4>
  104622. 802b20e: 2004 movs r0, #4
  104623. 802b210: e7d5 b.n 802b1be <__hexnan+0xe2>
  104624. 0802b212 <__ascii_mbtowc>:
  104625. 802b212: b082 sub sp, #8
  104626. 802b214: b901 cbnz r1, 802b218 <__ascii_mbtowc+0x6>
  104627. 802b216: a901 add r1, sp, #4
  104628. 802b218: b142 cbz r2, 802b22c <__ascii_mbtowc+0x1a>
  104629. 802b21a: b14b cbz r3, 802b230 <__ascii_mbtowc+0x1e>
  104630. 802b21c: 7813 ldrb r3, [r2, #0]
  104631. 802b21e: 600b str r3, [r1, #0]
  104632. 802b220: 7812 ldrb r2, [r2, #0]
  104633. 802b222: 1e10 subs r0, r2, #0
  104634. 802b224: bf18 it ne
  104635. 802b226: 2001 movne r0, #1
  104636. 802b228: b002 add sp, #8
  104637. 802b22a: 4770 bx lr
  104638. 802b22c: 4610 mov r0, r2
  104639. 802b22e: e7fb b.n 802b228 <__ascii_mbtowc+0x16>
  104640. 802b230: f06f 0001 mvn.w r0, #1
  104641. 802b234: e7f8 b.n 802b228 <__ascii_mbtowc+0x16>
  104642. ...
  104643. 0802b238 <_Balloc>:
  104644. 802b238: b570 push {r4, r5, r6, lr}
  104645. 802b23a: 69c6 ldr r6, [r0, #28]
  104646. 802b23c: 4604 mov r4, r0
  104647. 802b23e: 460d mov r5, r1
  104648. 802b240: b976 cbnz r6, 802b260 <_Balloc+0x28>
  104649. 802b242: 2010 movs r0, #16
  104650. 802b244: f7fc ffda bl 80281fc <malloc>
  104651. 802b248: 4602 mov r2, r0
  104652. 802b24a: 61e0 str r0, [r4, #28]
  104653. 802b24c: b920 cbnz r0, 802b258 <_Balloc+0x20>
  104654. 802b24e: 4b18 ldr r3, [pc, #96] @ (802b2b0 <_Balloc+0x78>)
  104655. 802b250: 4818 ldr r0, [pc, #96] @ (802b2b4 <_Balloc+0x7c>)
  104656. 802b252: 216b movs r1, #107 @ 0x6b
  104657. 802b254: f7fe fe5c bl 8029f10 <__assert_func>
  104658. 802b258: e9c0 6601 strd r6, r6, [r0, #4]
  104659. 802b25c: 6006 str r6, [r0, #0]
  104660. 802b25e: 60c6 str r6, [r0, #12]
  104661. 802b260: 69e6 ldr r6, [r4, #28]
  104662. 802b262: 68f3 ldr r3, [r6, #12]
  104663. 802b264: b183 cbz r3, 802b288 <_Balloc+0x50>
  104664. 802b266: 69e3 ldr r3, [r4, #28]
  104665. 802b268: 68db ldr r3, [r3, #12]
  104666. 802b26a: f853 0025 ldr.w r0, [r3, r5, lsl #2]
  104667. 802b26e: b9b8 cbnz r0, 802b2a0 <_Balloc+0x68>
  104668. 802b270: 2101 movs r1, #1
  104669. 802b272: fa01 f605 lsl.w r6, r1, r5
  104670. 802b276: 1d72 adds r2, r6, #5
  104671. 802b278: 0092 lsls r2, r2, #2
  104672. 802b27a: 4620 mov r0, r4
  104673. 802b27c: f001 f883 bl 802c386 <_calloc_r>
  104674. 802b280: b160 cbz r0, 802b29c <_Balloc+0x64>
  104675. 802b282: e9c0 5601 strd r5, r6, [r0, #4]
  104676. 802b286: e00e b.n 802b2a6 <_Balloc+0x6e>
  104677. 802b288: 2221 movs r2, #33 @ 0x21
  104678. 802b28a: 2104 movs r1, #4
  104679. 802b28c: 4620 mov r0, r4
  104680. 802b28e: f001 f87a bl 802c386 <_calloc_r>
  104681. 802b292: 69e3 ldr r3, [r4, #28]
  104682. 802b294: 60f0 str r0, [r6, #12]
  104683. 802b296: 68db ldr r3, [r3, #12]
  104684. 802b298: 2b00 cmp r3, #0
  104685. 802b29a: d1e4 bne.n 802b266 <_Balloc+0x2e>
  104686. 802b29c: 2000 movs r0, #0
  104687. 802b29e: bd70 pop {r4, r5, r6, pc}
  104688. 802b2a0: 6802 ldr r2, [r0, #0]
  104689. 802b2a2: f843 2025 str.w r2, [r3, r5, lsl #2]
  104690. 802b2a6: 2300 movs r3, #0
  104691. 802b2a8: e9c0 3303 strd r3, r3, [r0, #12]
  104692. 802b2ac: e7f7 b.n 802b29e <_Balloc+0x66>
  104693. 802b2ae: bf00 nop
  104694. 802b2b0: 08030c26 .word 0x08030c26
  104695. 802b2b4: 08030f37 .word 0x08030f37
  104696. 0802b2b8 <_Bfree>:
  104697. 802b2b8: b570 push {r4, r5, r6, lr}
  104698. 802b2ba: 69c6 ldr r6, [r0, #28]
  104699. 802b2bc: 4605 mov r5, r0
  104700. 802b2be: 460c mov r4, r1
  104701. 802b2c0: b976 cbnz r6, 802b2e0 <_Bfree+0x28>
  104702. 802b2c2: 2010 movs r0, #16
  104703. 802b2c4: f7fc ff9a bl 80281fc <malloc>
  104704. 802b2c8: 4602 mov r2, r0
  104705. 802b2ca: 61e8 str r0, [r5, #28]
  104706. 802b2cc: b920 cbnz r0, 802b2d8 <_Bfree+0x20>
  104707. 802b2ce: 4b09 ldr r3, [pc, #36] @ (802b2f4 <_Bfree+0x3c>)
  104708. 802b2d0: 4809 ldr r0, [pc, #36] @ (802b2f8 <_Bfree+0x40>)
  104709. 802b2d2: 218f movs r1, #143 @ 0x8f
  104710. 802b2d4: f7fe fe1c bl 8029f10 <__assert_func>
  104711. 802b2d8: e9c0 6601 strd r6, r6, [r0, #4]
  104712. 802b2dc: 6006 str r6, [r0, #0]
  104713. 802b2de: 60c6 str r6, [r0, #12]
  104714. 802b2e0: b13c cbz r4, 802b2f2 <_Bfree+0x3a>
  104715. 802b2e2: 69eb ldr r3, [r5, #28]
  104716. 802b2e4: 6862 ldr r2, [r4, #4]
  104717. 802b2e6: 68db ldr r3, [r3, #12]
  104718. 802b2e8: f853 1022 ldr.w r1, [r3, r2, lsl #2]
  104719. 802b2ec: 6021 str r1, [r4, #0]
  104720. 802b2ee: f843 4022 str.w r4, [r3, r2, lsl #2]
  104721. 802b2f2: bd70 pop {r4, r5, r6, pc}
  104722. 802b2f4: 08030c26 .word 0x08030c26
  104723. 802b2f8: 08030f37 .word 0x08030f37
  104724. 0802b2fc <__multadd>:
  104725. 802b2fc: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  104726. 802b300: 690d ldr r5, [r1, #16]
  104727. 802b302: 4607 mov r7, r0
  104728. 802b304: 460c mov r4, r1
  104729. 802b306: 461e mov r6, r3
  104730. 802b308: f101 0c14 add.w ip, r1, #20
  104731. 802b30c: 2000 movs r0, #0
  104732. 802b30e: f8dc 3000 ldr.w r3, [ip]
  104733. 802b312: b299 uxth r1, r3
  104734. 802b314: fb02 6101 mla r1, r2, r1, r6
  104735. 802b318: 0c1e lsrs r6, r3, #16
  104736. 802b31a: 0c0b lsrs r3, r1, #16
  104737. 802b31c: fb02 3306 mla r3, r2, r6, r3
  104738. 802b320: b289 uxth r1, r1
  104739. 802b322: 3001 adds r0, #1
  104740. 802b324: eb01 4103 add.w r1, r1, r3, lsl #16
  104741. 802b328: 4285 cmp r5, r0
  104742. 802b32a: f84c 1b04 str.w r1, [ip], #4
  104743. 802b32e: ea4f 4613 mov.w r6, r3, lsr #16
  104744. 802b332: dcec bgt.n 802b30e <__multadd+0x12>
  104745. 802b334: b30e cbz r6, 802b37a <__multadd+0x7e>
  104746. 802b336: 68a3 ldr r3, [r4, #8]
  104747. 802b338: 42ab cmp r3, r5
  104748. 802b33a: dc19 bgt.n 802b370 <__multadd+0x74>
  104749. 802b33c: 6861 ldr r1, [r4, #4]
  104750. 802b33e: 4638 mov r0, r7
  104751. 802b340: 3101 adds r1, #1
  104752. 802b342: f7ff ff79 bl 802b238 <_Balloc>
  104753. 802b346: 4680 mov r8, r0
  104754. 802b348: b928 cbnz r0, 802b356 <__multadd+0x5a>
  104755. 802b34a: 4602 mov r2, r0
  104756. 802b34c: 4b0c ldr r3, [pc, #48] @ (802b380 <__multadd+0x84>)
  104757. 802b34e: 480d ldr r0, [pc, #52] @ (802b384 <__multadd+0x88>)
  104758. 802b350: 21ba movs r1, #186 @ 0xba
  104759. 802b352: f7fe fddd bl 8029f10 <__assert_func>
  104760. 802b356: 6922 ldr r2, [r4, #16]
  104761. 802b358: 3202 adds r2, #2
  104762. 802b35a: f104 010c add.w r1, r4, #12
  104763. 802b35e: 0092 lsls r2, r2, #2
  104764. 802b360: 300c adds r0, #12
  104765. 802b362: f7fe fdbc bl 8029ede <memcpy>
  104766. 802b366: 4621 mov r1, r4
  104767. 802b368: 4638 mov r0, r7
  104768. 802b36a: f7ff ffa5 bl 802b2b8 <_Bfree>
  104769. 802b36e: 4644 mov r4, r8
  104770. 802b370: eb04 0385 add.w r3, r4, r5, lsl #2
  104771. 802b374: 3501 adds r5, #1
  104772. 802b376: 615e str r6, [r3, #20]
  104773. 802b378: 6125 str r5, [r4, #16]
  104774. 802b37a: 4620 mov r0, r4
  104775. 802b37c: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  104776. 802b380: 08030ec6 .word 0x08030ec6
  104777. 802b384: 08030f37 .word 0x08030f37
  104778. 0802b388 <__s2b>:
  104779. 802b388: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  104780. 802b38c: 460c mov r4, r1
  104781. 802b38e: 4615 mov r5, r2
  104782. 802b390: 461f mov r7, r3
  104783. 802b392: 2209 movs r2, #9
  104784. 802b394: 3308 adds r3, #8
  104785. 802b396: 4606 mov r6, r0
  104786. 802b398: fb93 f3f2 sdiv r3, r3, r2
  104787. 802b39c: 2100 movs r1, #0
  104788. 802b39e: 2201 movs r2, #1
  104789. 802b3a0: 429a cmp r2, r3
  104790. 802b3a2: db09 blt.n 802b3b8 <__s2b+0x30>
  104791. 802b3a4: 4630 mov r0, r6
  104792. 802b3a6: f7ff ff47 bl 802b238 <_Balloc>
  104793. 802b3aa: b940 cbnz r0, 802b3be <__s2b+0x36>
  104794. 802b3ac: 4602 mov r2, r0
  104795. 802b3ae: 4b19 ldr r3, [pc, #100] @ (802b414 <__s2b+0x8c>)
  104796. 802b3b0: 4819 ldr r0, [pc, #100] @ (802b418 <__s2b+0x90>)
  104797. 802b3b2: 21d3 movs r1, #211 @ 0xd3
  104798. 802b3b4: f7fe fdac bl 8029f10 <__assert_func>
  104799. 802b3b8: 0052 lsls r2, r2, #1
  104800. 802b3ba: 3101 adds r1, #1
  104801. 802b3bc: e7f0 b.n 802b3a0 <__s2b+0x18>
  104802. 802b3be: 9b08 ldr r3, [sp, #32]
  104803. 802b3c0: 6143 str r3, [r0, #20]
  104804. 802b3c2: 2d09 cmp r5, #9
  104805. 802b3c4: f04f 0301 mov.w r3, #1
  104806. 802b3c8: 6103 str r3, [r0, #16]
  104807. 802b3ca: dd16 ble.n 802b3fa <__s2b+0x72>
  104808. 802b3cc: f104 0909 add.w r9, r4, #9
  104809. 802b3d0: 46c8 mov r8, r9
  104810. 802b3d2: 442c add r4, r5
  104811. 802b3d4: f818 3b01 ldrb.w r3, [r8], #1
  104812. 802b3d8: 4601 mov r1, r0
  104813. 802b3da: 3b30 subs r3, #48 @ 0x30
  104814. 802b3dc: 220a movs r2, #10
  104815. 802b3de: 4630 mov r0, r6
  104816. 802b3e0: f7ff ff8c bl 802b2fc <__multadd>
  104817. 802b3e4: 45a0 cmp r8, r4
  104818. 802b3e6: d1f5 bne.n 802b3d4 <__s2b+0x4c>
  104819. 802b3e8: f1a5 0408 sub.w r4, r5, #8
  104820. 802b3ec: 444c add r4, r9
  104821. 802b3ee: 1b2d subs r5, r5, r4
  104822. 802b3f0: 1963 adds r3, r4, r5
  104823. 802b3f2: 42bb cmp r3, r7
  104824. 802b3f4: db04 blt.n 802b400 <__s2b+0x78>
  104825. 802b3f6: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  104826. 802b3fa: 340a adds r4, #10
  104827. 802b3fc: 2509 movs r5, #9
  104828. 802b3fe: e7f6 b.n 802b3ee <__s2b+0x66>
  104829. 802b400: f814 3b01 ldrb.w r3, [r4], #1
  104830. 802b404: 4601 mov r1, r0
  104831. 802b406: 3b30 subs r3, #48 @ 0x30
  104832. 802b408: 220a movs r2, #10
  104833. 802b40a: 4630 mov r0, r6
  104834. 802b40c: f7ff ff76 bl 802b2fc <__multadd>
  104835. 802b410: e7ee b.n 802b3f0 <__s2b+0x68>
  104836. 802b412: bf00 nop
  104837. 802b414: 08030ec6 .word 0x08030ec6
  104838. 802b418: 08030f37 .word 0x08030f37
  104839. 0802b41c <__hi0bits>:
  104840. 802b41c: f5b0 3f80 cmp.w r0, #65536 @ 0x10000
  104841. 802b420: 4603 mov r3, r0
  104842. 802b422: bf36 itet cc
  104843. 802b424: 0403 lslcc r3, r0, #16
  104844. 802b426: 2000 movcs r0, #0
  104845. 802b428: 2010 movcc r0, #16
  104846. 802b42a: f1b3 7f80 cmp.w r3, #16777216 @ 0x1000000
  104847. 802b42e: bf3c itt cc
  104848. 802b430: 021b lslcc r3, r3, #8
  104849. 802b432: 3008 addcc r0, #8
  104850. 802b434: f1b3 5f80 cmp.w r3, #268435456 @ 0x10000000
  104851. 802b438: bf3c itt cc
  104852. 802b43a: 011b lslcc r3, r3, #4
  104853. 802b43c: 3004 addcc r0, #4
  104854. 802b43e: f1b3 4f80 cmp.w r3, #1073741824 @ 0x40000000
  104855. 802b442: bf3c itt cc
  104856. 802b444: 009b lslcc r3, r3, #2
  104857. 802b446: 3002 addcc r0, #2
  104858. 802b448: 2b00 cmp r3, #0
  104859. 802b44a: db05 blt.n 802b458 <__hi0bits+0x3c>
  104860. 802b44c: f013 4f80 tst.w r3, #1073741824 @ 0x40000000
  104861. 802b450: f100 0001 add.w r0, r0, #1
  104862. 802b454: bf08 it eq
  104863. 802b456: 2020 moveq r0, #32
  104864. 802b458: 4770 bx lr
  104865. 0802b45a <__lo0bits>:
  104866. 802b45a: 6803 ldr r3, [r0, #0]
  104867. 802b45c: 4602 mov r2, r0
  104868. 802b45e: f013 0007 ands.w r0, r3, #7
  104869. 802b462: d00b beq.n 802b47c <__lo0bits+0x22>
  104870. 802b464: 07d9 lsls r1, r3, #31
  104871. 802b466: d421 bmi.n 802b4ac <__lo0bits+0x52>
  104872. 802b468: 0798 lsls r0, r3, #30
  104873. 802b46a: bf49 itett mi
  104874. 802b46c: 085b lsrmi r3, r3, #1
  104875. 802b46e: 089b lsrpl r3, r3, #2
  104876. 802b470: 2001 movmi r0, #1
  104877. 802b472: 6013 strmi r3, [r2, #0]
  104878. 802b474: bf5c itt pl
  104879. 802b476: 6013 strpl r3, [r2, #0]
  104880. 802b478: 2002 movpl r0, #2
  104881. 802b47a: 4770 bx lr
  104882. 802b47c: b299 uxth r1, r3
  104883. 802b47e: b909 cbnz r1, 802b484 <__lo0bits+0x2a>
  104884. 802b480: 0c1b lsrs r3, r3, #16
  104885. 802b482: 2010 movs r0, #16
  104886. 802b484: b2d9 uxtb r1, r3
  104887. 802b486: b909 cbnz r1, 802b48c <__lo0bits+0x32>
  104888. 802b488: 3008 adds r0, #8
  104889. 802b48a: 0a1b lsrs r3, r3, #8
  104890. 802b48c: 0719 lsls r1, r3, #28
  104891. 802b48e: bf04 itt eq
  104892. 802b490: 091b lsreq r3, r3, #4
  104893. 802b492: 3004 addeq r0, #4
  104894. 802b494: 0799 lsls r1, r3, #30
  104895. 802b496: bf04 itt eq
  104896. 802b498: 089b lsreq r3, r3, #2
  104897. 802b49a: 3002 addeq r0, #2
  104898. 802b49c: 07d9 lsls r1, r3, #31
  104899. 802b49e: d403 bmi.n 802b4a8 <__lo0bits+0x4e>
  104900. 802b4a0: 085b lsrs r3, r3, #1
  104901. 802b4a2: f100 0001 add.w r0, r0, #1
  104902. 802b4a6: d003 beq.n 802b4b0 <__lo0bits+0x56>
  104903. 802b4a8: 6013 str r3, [r2, #0]
  104904. 802b4aa: 4770 bx lr
  104905. 802b4ac: 2000 movs r0, #0
  104906. 802b4ae: 4770 bx lr
  104907. 802b4b0: 2020 movs r0, #32
  104908. 802b4b2: 4770 bx lr
  104909. 0802b4b4 <__i2b>:
  104910. 802b4b4: b510 push {r4, lr}
  104911. 802b4b6: 460c mov r4, r1
  104912. 802b4b8: 2101 movs r1, #1
  104913. 802b4ba: f7ff febd bl 802b238 <_Balloc>
  104914. 802b4be: 4602 mov r2, r0
  104915. 802b4c0: b928 cbnz r0, 802b4ce <__i2b+0x1a>
  104916. 802b4c2: 4b05 ldr r3, [pc, #20] @ (802b4d8 <__i2b+0x24>)
  104917. 802b4c4: 4805 ldr r0, [pc, #20] @ (802b4dc <__i2b+0x28>)
  104918. 802b4c6: f240 1145 movw r1, #325 @ 0x145
  104919. 802b4ca: f7fe fd21 bl 8029f10 <__assert_func>
  104920. 802b4ce: 2301 movs r3, #1
  104921. 802b4d0: 6144 str r4, [r0, #20]
  104922. 802b4d2: 6103 str r3, [r0, #16]
  104923. 802b4d4: bd10 pop {r4, pc}
  104924. 802b4d6: bf00 nop
  104925. 802b4d8: 08030ec6 .word 0x08030ec6
  104926. 802b4dc: 08030f37 .word 0x08030f37
  104927. 0802b4e0 <__multiply>:
  104928. 802b4e0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  104929. 802b4e4: 4614 mov r4, r2
  104930. 802b4e6: 690a ldr r2, [r1, #16]
  104931. 802b4e8: 6923 ldr r3, [r4, #16]
  104932. 802b4ea: 429a cmp r2, r3
  104933. 802b4ec: bfa8 it ge
  104934. 802b4ee: 4623 movge r3, r4
  104935. 802b4f0: 460f mov r7, r1
  104936. 802b4f2: bfa4 itt ge
  104937. 802b4f4: 460c movge r4, r1
  104938. 802b4f6: 461f movge r7, r3
  104939. 802b4f8: f8d4 a010 ldr.w sl, [r4, #16]
  104940. 802b4fc: f8d7 9010 ldr.w r9, [r7, #16]
  104941. 802b500: 68a3 ldr r3, [r4, #8]
  104942. 802b502: 6861 ldr r1, [r4, #4]
  104943. 802b504: eb0a 0609 add.w r6, sl, r9
  104944. 802b508: 42b3 cmp r3, r6
  104945. 802b50a: b085 sub sp, #20
  104946. 802b50c: bfb8 it lt
  104947. 802b50e: 3101 addlt r1, #1
  104948. 802b510: f7ff fe92 bl 802b238 <_Balloc>
  104949. 802b514: b930 cbnz r0, 802b524 <__multiply+0x44>
  104950. 802b516: 4602 mov r2, r0
  104951. 802b518: 4b44 ldr r3, [pc, #272] @ (802b62c <__multiply+0x14c>)
  104952. 802b51a: 4845 ldr r0, [pc, #276] @ (802b630 <__multiply+0x150>)
  104953. 802b51c: f44f 71b1 mov.w r1, #354 @ 0x162
  104954. 802b520: f7fe fcf6 bl 8029f10 <__assert_func>
  104955. 802b524: f100 0514 add.w r5, r0, #20
  104956. 802b528: eb05 0886 add.w r8, r5, r6, lsl #2
  104957. 802b52c: 462b mov r3, r5
  104958. 802b52e: 2200 movs r2, #0
  104959. 802b530: 4543 cmp r3, r8
  104960. 802b532: d321 bcc.n 802b578 <__multiply+0x98>
  104961. 802b534: f107 0114 add.w r1, r7, #20
  104962. 802b538: f104 0214 add.w r2, r4, #20
  104963. 802b53c: eb02 028a add.w r2, r2, sl, lsl #2
  104964. 802b540: eb01 0389 add.w r3, r1, r9, lsl #2
  104965. 802b544: 9302 str r3, [sp, #8]
  104966. 802b546: 1b13 subs r3, r2, r4
  104967. 802b548: 3b15 subs r3, #21
  104968. 802b54a: f023 0303 bic.w r3, r3, #3
  104969. 802b54e: 3304 adds r3, #4
  104970. 802b550: f104 0715 add.w r7, r4, #21
  104971. 802b554: 42ba cmp r2, r7
  104972. 802b556: bf38 it cc
  104973. 802b558: 2304 movcc r3, #4
  104974. 802b55a: 9301 str r3, [sp, #4]
  104975. 802b55c: 9b02 ldr r3, [sp, #8]
  104976. 802b55e: 9103 str r1, [sp, #12]
  104977. 802b560: 428b cmp r3, r1
  104978. 802b562: d80c bhi.n 802b57e <__multiply+0x9e>
  104979. 802b564: 2e00 cmp r6, #0
  104980. 802b566: dd03 ble.n 802b570 <__multiply+0x90>
  104981. 802b568: f858 3d04 ldr.w r3, [r8, #-4]!
  104982. 802b56c: 2b00 cmp r3, #0
  104983. 802b56e: d05b beq.n 802b628 <__multiply+0x148>
  104984. 802b570: 6106 str r6, [r0, #16]
  104985. 802b572: b005 add sp, #20
  104986. 802b574: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  104987. 802b578: f843 2b04 str.w r2, [r3], #4
  104988. 802b57c: e7d8 b.n 802b530 <__multiply+0x50>
  104989. 802b57e: f8b1 a000 ldrh.w sl, [r1]
  104990. 802b582: f1ba 0f00 cmp.w sl, #0
  104991. 802b586: d024 beq.n 802b5d2 <__multiply+0xf2>
  104992. 802b588: f104 0e14 add.w lr, r4, #20
  104993. 802b58c: 46a9 mov r9, r5
  104994. 802b58e: f04f 0c00 mov.w ip, #0
  104995. 802b592: f85e 7b04 ldr.w r7, [lr], #4
  104996. 802b596: f8d9 3000 ldr.w r3, [r9]
  104997. 802b59a: fa1f fb87 uxth.w fp, r7
  104998. 802b59e: b29b uxth r3, r3
  104999. 802b5a0: fb0a 330b mla r3, sl, fp, r3
  105000. 802b5a4: ea4f 4b17 mov.w fp, r7, lsr #16
  105001. 802b5a8: f8d9 7000 ldr.w r7, [r9]
  105002. 802b5ac: 4463 add r3, ip
  105003. 802b5ae: ea4f 4c17 mov.w ip, r7, lsr #16
  105004. 802b5b2: fb0a c70b mla r7, sl, fp, ip
  105005. 802b5b6: eb07 4713 add.w r7, r7, r3, lsr #16
  105006. 802b5ba: b29b uxth r3, r3
  105007. 802b5bc: ea43 4307 orr.w r3, r3, r7, lsl #16
  105008. 802b5c0: 4572 cmp r2, lr
  105009. 802b5c2: f849 3b04 str.w r3, [r9], #4
  105010. 802b5c6: ea4f 4c17 mov.w ip, r7, lsr #16
  105011. 802b5ca: d8e2 bhi.n 802b592 <__multiply+0xb2>
  105012. 802b5cc: 9b01 ldr r3, [sp, #4]
  105013. 802b5ce: f845 c003 str.w ip, [r5, r3]
  105014. 802b5d2: 9b03 ldr r3, [sp, #12]
  105015. 802b5d4: f8b3 9002 ldrh.w r9, [r3, #2]
  105016. 802b5d8: 3104 adds r1, #4
  105017. 802b5da: f1b9 0f00 cmp.w r9, #0
  105018. 802b5de: d021 beq.n 802b624 <__multiply+0x144>
  105019. 802b5e0: 682b ldr r3, [r5, #0]
  105020. 802b5e2: f104 0c14 add.w ip, r4, #20
  105021. 802b5e6: 46ae mov lr, r5
  105022. 802b5e8: f04f 0a00 mov.w sl, #0
  105023. 802b5ec: f8bc b000 ldrh.w fp, [ip]
  105024. 802b5f0: f8be 7002 ldrh.w r7, [lr, #2]
  105025. 802b5f4: fb09 770b mla r7, r9, fp, r7
  105026. 802b5f8: 4457 add r7, sl
  105027. 802b5fa: b29b uxth r3, r3
  105028. 802b5fc: ea43 4307 orr.w r3, r3, r7, lsl #16
  105029. 802b600: f84e 3b04 str.w r3, [lr], #4
  105030. 802b604: f85c 3b04 ldr.w r3, [ip], #4
  105031. 802b608: ea4f 4a13 mov.w sl, r3, lsr #16
  105032. 802b60c: f8be 3000 ldrh.w r3, [lr]
  105033. 802b610: fb09 330a mla r3, r9, sl, r3
  105034. 802b614: eb03 4317 add.w r3, r3, r7, lsr #16
  105035. 802b618: 4562 cmp r2, ip
  105036. 802b61a: ea4f 4a13 mov.w sl, r3, lsr #16
  105037. 802b61e: d8e5 bhi.n 802b5ec <__multiply+0x10c>
  105038. 802b620: 9f01 ldr r7, [sp, #4]
  105039. 802b622: 51eb str r3, [r5, r7]
  105040. 802b624: 3504 adds r5, #4
  105041. 802b626: e799 b.n 802b55c <__multiply+0x7c>
  105042. 802b628: 3e01 subs r6, #1
  105043. 802b62a: e79b b.n 802b564 <__multiply+0x84>
  105044. 802b62c: 08030ec6 .word 0x08030ec6
  105045. 802b630: 08030f37 .word 0x08030f37
  105046. 0802b634 <__pow5mult>:
  105047. 802b634: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  105048. 802b638: 4615 mov r5, r2
  105049. 802b63a: f012 0203 ands.w r2, r2, #3
  105050. 802b63e: 4607 mov r7, r0
  105051. 802b640: 460e mov r6, r1
  105052. 802b642: d007 beq.n 802b654 <__pow5mult+0x20>
  105053. 802b644: 4c25 ldr r4, [pc, #148] @ (802b6dc <__pow5mult+0xa8>)
  105054. 802b646: 3a01 subs r2, #1
  105055. 802b648: 2300 movs r3, #0
  105056. 802b64a: f854 2022 ldr.w r2, [r4, r2, lsl #2]
  105057. 802b64e: f7ff fe55 bl 802b2fc <__multadd>
  105058. 802b652: 4606 mov r6, r0
  105059. 802b654: 10ad asrs r5, r5, #2
  105060. 802b656: d03d beq.n 802b6d4 <__pow5mult+0xa0>
  105061. 802b658: 69fc ldr r4, [r7, #28]
  105062. 802b65a: b97c cbnz r4, 802b67c <__pow5mult+0x48>
  105063. 802b65c: 2010 movs r0, #16
  105064. 802b65e: f7fc fdcd bl 80281fc <malloc>
  105065. 802b662: 4602 mov r2, r0
  105066. 802b664: 61f8 str r0, [r7, #28]
  105067. 802b666: b928 cbnz r0, 802b674 <__pow5mult+0x40>
  105068. 802b668: 4b1d ldr r3, [pc, #116] @ (802b6e0 <__pow5mult+0xac>)
  105069. 802b66a: 481e ldr r0, [pc, #120] @ (802b6e4 <__pow5mult+0xb0>)
  105070. 802b66c: f240 11b3 movw r1, #435 @ 0x1b3
  105071. 802b670: f7fe fc4e bl 8029f10 <__assert_func>
  105072. 802b674: e9c0 4401 strd r4, r4, [r0, #4]
  105073. 802b678: 6004 str r4, [r0, #0]
  105074. 802b67a: 60c4 str r4, [r0, #12]
  105075. 802b67c: f8d7 801c ldr.w r8, [r7, #28]
  105076. 802b680: f8d8 4008 ldr.w r4, [r8, #8]
  105077. 802b684: b94c cbnz r4, 802b69a <__pow5mult+0x66>
  105078. 802b686: f240 2171 movw r1, #625 @ 0x271
  105079. 802b68a: 4638 mov r0, r7
  105080. 802b68c: f7ff ff12 bl 802b4b4 <__i2b>
  105081. 802b690: 2300 movs r3, #0
  105082. 802b692: f8c8 0008 str.w r0, [r8, #8]
  105083. 802b696: 4604 mov r4, r0
  105084. 802b698: 6003 str r3, [r0, #0]
  105085. 802b69a: f04f 0900 mov.w r9, #0
  105086. 802b69e: 07eb lsls r3, r5, #31
  105087. 802b6a0: d50a bpl.n 802b6b8 <__pow5mult+0x84>
  105088. 802b6a2: 4631 mov r1, r6
  105089. 802b6a4: 4622 mov r2, r4
  105090. 802b6a6: 4638 mov r0, r7
  105091. 802b6a8: f7ff ff1a bl 802b4e0 <__multiply>
  105092. 802b6ac: 4631 mov r1, r6
  105093. 802b6ae: 4680 mov r8, r0
  105094. 802b6b0: 4638 mov r0, r7
  105095. 802b6b2: f7ff fe01 bl 802b2b8 <_Bfree>
  105096. 802b6b6: 4646 mov r6, r8
  105097. 802b6b8: 106d asrs r5, r5, #1
  105098. 802b6ba: d00b beq.n 802b6d4 <__pow5mult+0xa0>
  105099. 802b6bc: 6820 ldr r0, [r4, #0]
  105100. 802b6be: b938 cbnz r0, 802b6d0 <__pow5mult+0x9c>
  105101. 802b6c0: 4622 mov r2, r4
  105102. 802b6c2: 4621 mov r1, r4
  105103. 802b6c4: 4638 mov r0, r7
  105104. 802b6c6: f7ff ff0b bl 802b4e0 <__multiply>
  105105. 802b6ca: 6020 str r0, [r4, #0]
  105106. 802b6cc: f8c0 9000 str.w r9, [r0]
  105107. 802b6d0: 4604 mov r4, r0
  105108. 802b6d2: e7e4 b.n 802b69e <__pow5mult+0x6a>
  105109. 802b6d4: 4630 mov r0, r6
  105110. 802b6d6: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  105111. 802b6da: bf00 nop
  105112. 802b6dc: 08030f90 .word 0x08030f90
  105113. 802b6e0: 08030c26 .word 0x08030c26
  105114. 802b6e4: 08030f37 .word 0x08030f37
  105115. 0802b6e8 <__lshift>:
  105116. 802b6e8: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  105117. 802b6ec: 460c mov r4, r1
  105118. 802b6ee: 6849 ldr r1, [r1, #4]
  105119. 802b6f0: 6923 ldr r3, [r4, #16]
  105120. 802b6f2: eb03 1862 add.w r8, r3, r2, asr #5
  105121. 802b6f6: 68a3 ldr r3, [r4, #8]
  105122. 802b6f8: 4607 mov r7, r0
  105123. 802b6fa: 4691 mov r9, r2
  105124. 802b6fc: ea4f 1a62 mov.w sl, r2, asr #5
  105125. 802b700: f108 0601 add.w r6, r8, #1
  105126. 802b704: 42b3 cmp r3, r6
  105127. 802b706: db0b blt.n 802b720 <__lshift+0x38>
  105128. 802b708: 4638 mov r0, r7
  105129. 802b70a: f7ff fd95 bl 802b238 <_Balloc>
  105130. 802b70e: 4605 mov r5, r0
  105131. 802b710: b948 cbnz r0, 802b726 <__lshift+0x3e>
  105132. 802b712: 4602 mov r2, r0
  105133. 802b714: 4b28 ldr r3, [pc, #160] @ (802b7b8 <__lshift+0xd0>)
  105134. 802b716: 4829 ldr r0, [pc, #164] @ (802b7bc <__lshift+0xd4>)
  105135. 802b718: f44f 71ef mov.w r1, #478 @ 0x1de
  105136. 802b71c: f7fe fbf8 bl 8029f10 <__assert_func>
  105137. 802b720: 3101 adds r1, #1
  105138. 802b722: 005b lsls r3, r3, #1
  105139. 802b724: e7ee b.n 802b704 <__lshift+0x1c>
  105140. 802b726: 2300 movs r3, #0
  105141. 802b728: f100 0114 add.w r1, r0, #20
  105142. 802b72c: f100 0210 add.w r2, r0, #16
  105143. 802b730: 4618 mov r0, r3
  105144. 802b732: 4553 cmp r3, sl
  105145. 802b734: db33 blt.n 802b79e <__lshift+0xb6>
  105146. 802b736: 6920 ldr r0, [r4, #16]
  105147. 802b738: ea2a 7aea bic.w sl, sl, sl, asr #31
  105148. 802b73c: f104 0314 add.w r3, r4, #20
  105149. 802b740: f019 091f ands.w r9, r9, #31
  105150. 802b744: eb01 018a add.w r1, r1, sl, lsl #2
  105151. 802b748: eb03 0c80 add.w ip, r3, r0, lsl #2
  105152. 802b74c: d02b beq.n 802b7a6 <__lshift+0xbe>
  105153. 802b74e: f1c9 0e20 rsb lr, r9, #32
  105154. 802b752: 468a mov sl, r1
  105155. 802b754: 2200 movs r2, #0
  105156. 802b756: 6818 ldr r0, [r3, #0]
  105157. 802b758: fa00 f009 lsl.w r0, r0, r9
  105158. 802b75c: 4310 orrs r0, r2
  105159. 802b75e: f84a 0b04 str.w r0, [sl], #4
  105160. 802b762: f853 2b04 ldr.w r2, [r3], #4
  105161. 802b766: 459c cmp ip, r3
  105162. 802b768: fa22 f20e lsr.w r2, r2, lr
  105163. 802b76c: d8f3 bhi.n 802b756 <__lshift+0x6e>
  105164. 802b76e: ebac 0304 sub.w r3, ip, r4
  105165. 802b772: 3b15 subs r3, #21
  105166. 802b774: f023 0303 bic.w r3, r3, #3
  105167. 802b778: 3304 adds r3, #4
  105168. 802b77a: f104 0015 add.w r0, r4, #21
  105169. 802b77e: 4584 cmp ip, r0
  105170. 802b780: bf38 it cc
  105171. 802b782: 2304 movcc r3, #4
  105172. 802b784: 50ca str r2, [r1, r3]
  105173. 802b786: b10a cbz r2, 802b78c <__lshift+0xa4>
  105174. 802b788: f108 0602 add.w r6, r8, #2
  105175. 802b78c: 3e01 subs r6, #1
  105176. 802b78e: 4638 mov r0, r7
  105177. 802b790: 612e str r6, [r5, #16]
  105178. 802b792: 4621 mov r1, r4
  105179. 802b794: f7ff fd90 bl 802b2b8 <_Bfree>
  105180. 802b798: 4628 mov r0, r5
  105181. 802b79a: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  105182. 802b79e: f842 0f04 str.w r0, [r2, #4]!
  105183. 802b7a2: 3301 adds r3, #1
  105184. 802b7a4: e7c5 b.n 802b732 <__lshift+0x4a>
  105185. 802b7a6: 3904 subs r1, #4
  105186. 802b7a8: f853 2b04 ldr.w r2, [r3], #4
  105187. 802b7ac: f841 2f04 str.w r2, [r1, #4]!
  105188. 802b7b0: 459c cmp ip, r3
  105189. 802b7b2: d8f9 bhi.n 802b7a8 <__lshift+0xc0>
  105190. 802b7b4: e7ea b.n 802b78c <__lshift+0xa4>
  105191. 802b7b6: bf00 nop
  105192. 802b7b8: 08030ec6 .word 0x08030ec6
  105193. 802b7bc: 08030f37 .word 0x08030f37
  105194. 0802b7c0 <__mcmp>:
  105195. 802b7c0: 690a ldr r2, [r1, #16]
  105196. 802b7c2: 4603 mov r3, r0
  105197. 802b7c4: 6900 ldr r0, [r0, #16]
  105198. 802b7c6: 1a80 subs r0, r0, r2
  105199. 802b7c8: b530 push {r4, r5, lr}
  105200. 802b7ca: d10e bne.n 802b7ea <__mcmp+0x2a>
  105201. 802b7cc: 3314 adds r3, #20
  105202. 802b7ce: 3114 adds r1, #20
  105203. 802b7d0: eb03 0482 add.w r4, r3, r2, lsl #2
  105204. 802b7d4: eb01 0182 add.w r1, r1, r2, lsl #2
  105205. 802b7d8: f854 5d04 ldr.w r5, [r4, #-4]!
  105206. 802b7dc: f851 2d04 ldr.w r2, [r1, #-4]!
  105207. 802b7e0: 4295 cmp r5, r2
  105208. 802b7e2: d003 beq.n 802b7ec <__mcmp+0x2c>
  105209. 802b7e4: d205 bcs.n 802b7f2 <__mcmp+0x32>
  105210. 802b7e6: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  105211. 802b7ea: bd30 pop {r4, r5, pc}
  105212. 802b7ec: 42a3 cmp r3, r4
  105213. 802b7ee: d3f3 bcc.n 802b7d8 <__mcmp+0x18>
  105214. 802b7f0: e7fb b.n 802b7ea <__mcmp+0x2a>
  105215. 802b7f2: 2001 movs r0, #1
  105216. 802b7f4: e7f9 b.n 802b7ea <__mcmp+0x2a>
  105217. ...
  105218. 0802b7f8 <__mdiff>:
  105219. 802b7f8: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  105220. 802b7fc: 4689 mov r9, r1
  105221. 802b7fe: 4606 mov r6, r0
  105222. 802b800: 4611 mov r1, r2
  105223. 802b802: 4648 mov r0, r9
  105224. 802b804: 4614 mov r4, r2
  105225. 802b806: f7ff ffdb bl 802b7c0 <__mcmp>
  105226. 802b80a: 1e05 subs r5, r0, #0
  105227. 802b80c: d112 bne.n 802b834 <__mdiff+0x3c>
  105228. 802b80e: 4629 mov r1, r5
  105229. 802b810: 4630 mov r0, r6
  105230. 802b812: f7ff fd11 bl 802b238 <_Balloc>
  105231. 802b816: 4602 mov r2, r0
  105232. 802b818: b928 cbnz r0, 802b826 <__mdiff+0x2e>
  105233. 802b81a: 4b3f ldr r3, [pc, #252] @ (802b918 <__mdiff+0x120>)
  105234. 802b81c: f240 2137 movw r1, #567 @ 0x237
  105235. 802b820: 483e ldr r0, [pc, #248] @ (802b91c <__mdiff+0x124>)
  105236. 802b822: f7fe fb75 bl 8029f10 <__assert_func>
  105237. 802b826: 2301 movs r3, #1
  105238. 802b828: e9c0 3504 strd r3, r5, [r0, #16]
  105239. 802b82c: 4610 mov r0, r2
  105240. 802b82e: b003 add sp, #12
  105241. 802b830: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  105242. 802b834: bfbc itt lt
  105243. 802b836: 464b movlt r3, r9
  105244. 802b838: 46a1 movlt r9, r4
  105245. 802b83a: 4630 mov r0, r6
  105246. 802b83c: f8d9 1004 ldr.w r1, [r9, #4]
  105247. 802b840: bfba itte lt
  105248. 802b842: 461c movlt r4, r3
  105249. 802b844: 2501 movlt r5, #1
  105250. 802b846: 2500 movge r5, #0
  105251. 802b848: f7ff fcf6 bl 802b238 <_Balloc>
  105252. 802b84c: 4602 mov r2, r0
  105253. 802b84e: b918 cbnz r0, 802b858 <__mdiff+0x60>
  105254. 802b850: 4b31 ldr r3, [pc, #196] @ (802b918 <__mdiff+0x120>)
  105255. 802b852: f240 2145 movw r1, #581 @ 0x245
  105256. 802b856: e7e3 b.n 802b820 <__mdiff+0x28>
  105257. 802b858: f8d9 7010 ldr.w r7, [r9, #16]
  105258. 802b85c: 6926 ldr r6, [r4, #16]
  105259. 802b85e: 60c5 str r5, [r0, #12]
  105260. 802b860: f109 0310 add.w r3, r9, #16
  105261. 802b864: f109 0514 add.w r5, r9, #20
  105262. 802b868: f104 0e14 add.w lr, r4, #20
  105263. 802b86c: f100 0b14 add.w fp, r0, #20
  105264. 802b870: eb05 0887 add.w r8, r5, r7, lsl #2
  105265. 802b874: eb0e 0686 add.w r6, lr, r6, lsl #2
  105266. 802b878: 9301 str r3, [sp, #4]
  105267. 802b87a: 46d9 mov r9, fp
  105268. 802b87c: f04f 0c00 mov.w ip, #0
  105269. 802b880: 9b01 ldr r3, [sp, #4]
  105270. 802b882: f85e 0b04 ldr.w r0, [lr], #4
  105271. 802b886: f853 af04 ldr.w sl, [r3, #4]!
  105272. 802b88a: 9301 str r3, [sp, #4]
  105273. 802b88c: fa1f f38a uxth.w r3, sl
  105274. 802b890: 4619 mov r1, r3
  105275. 802b892: b283 uxth r3, r0
  105276. 802b894: 1acb subs r3, r1, r3
  105277. 802b896: 0c00 lsrs r0, r0, #16
  105278. 802b898: 4463 add r3, ip
  105279. 802b89a: ebc0 401a rsb r0, r0, sl, lsr #16
  105280. 802b89e: eb00 4023 add.w r0, r0, r3, asr #16
  105281. 802b8a2: b29b uxth r3, r3
  105282. 802b8a4: ea43 4300 orr.w r3, r3, r0, lsl #16
  105283. 802b8a8: 4576 cmp r6, lr
  105284. 802b8aa: f849 3b04 str.w r3, [r9], #4
  105285. 802b8ae: ea4f 4c20 mov.w ip, r0, asr #16
  105286. 802b8b2: d8e5 bhi.n 802b880 <__mdiff+0x88>
  105287. 802b8b4: 1b33 subs r3, r6, r4
  105288. 802b8b6: 3b15 subs r3, #21
  105289. 802b8b8: f023 0303 bic.w r3, r3, #3
  105290. 802b8bc: 3415 adds r4, #21
  105291. 802b8be: 3304 adds r3, #4
  105292. 802b8c0: 42a6 cmp r6, r4
  105293. 802b8c2: bf38 it cc
  105294. 802b8c4: 2304 movcc r3, #4
  105295. 802b8c6: 441d add r5, r3
  105296. 802b8c8: 445b add r3, fp
  105297. 802b8ca: 461e mov r6, r3
  105298. 802b8cc: 462c mov r4, r5
  105299. 802b8ce: 4544 cmp r4, r8
  105300. 802b8d0: d30e bcc.n 802b8f0 <__mdiff+0xf8>
  105301. 802b8d2: f108 0103 add.w r1, r8, #3
  105302. 802b8d6: 1b49 subs r1, r1, r5
  105303. 802b8d8: f021 0103 bic.w r1, r1, #3
  105304. 802b8dc: 3d03 subs r5, #3
  105305. 802b8de: 45a8 cmp r8, r5
  105306. 802b8e0: bf38 it cc
  105307. 802b8e2: 2100 movcc r1, #0
  105308. 802b8e4: 440b add r3, r1
  105309. 802b8e6: f853 1d04 ldr.w r1, [r3, #-4]!
  105310. 802b8ea: b191 cbz r1, 802b912 <__mdiff+0x11a>
  105311. 802b8ec: 6117 str r7, [r2, #16]
  105312. 802b8ee: e79d b.n 802b82c <__mdiff+0x34>
  105313. 802b8f0: f854 1b04 ldr.w r1, [r4], #4
  105314. 802b8f4: 46e6 mov lr, ip
  105315. 802b8f6: 0c08 lsrs r0, r1, #16
  105316. 802b8f8: fa1c fc81 uxtah ip, ip, r1
  105317. 802b8fc: 4471 add r1, lr
  105318. 802b8fe: eb00 402c add.w r0, r0, ip, asr #16
  105319. 802b902: b289 uxth r1, r1
  105320. 802b904: ea41 4100 orr.w r1, r1, r0, lsl #16
  105321. 802b908: f846 1b04 str.w r1, [r6], #4
  105322. 802b90c: ea4f 4c20 mov.w ip, r0, asr #16
  105323. 802b910: e7dd b.n 802b8ce <__mdiff+0xd6>
  105324. 802b912: 3f01 subs r7, #1
  105325. 802b914: e7e7 b.n 802b8e6 <__mdiff+0xee>
  105326. 802b916: bf00 nop
  105327. 802b918: 08030ec6 .word 0x08030ec6
  105328. 802b91c: 08030f37 .word 0x08030f37
  105329. 0802b920 <__ulp>:
  105330. 802b920: b082 sub sp, #8
  105331. 802b922: ed8d 0b00 vstr d0, [sp]
  105332. 802b926: 9a01 ldr r2, [sp, #4]
  105333. 802b928: 4b0f ldr r3, [pc, #60] @ (802b968 <__ulp+0x48>)
  105334. 802b92a: 4013 ands r3, r2
  105335. 802b92c: f1a3 7350 sub.w r3, r3, #54525952 @ 0x3400000
  105336. 802b930: 2b00 cmp r3, #0
  105337. 802b932: dc08 bgt.n 802b946 <__ulp+0x26>
  105338. 802b934: 425b negs r3, r3
  105339. 802b936: f1b3 7fa0 cmp.w r3, #20971520 @ 0x1400000
  105340. 802b93a: ea4f 5223 mov.w r2, r3, asr #20
  105341. 802b93e: da04 bge.n 802b94a <__ulp+0x2a>
  105342. 802b940: f44f 2300 mov.w r3, #524288 @ 0x80000
  105343. 802b944: 4113 asrs r3, r2
  105344. 802b946: 2200 movs r2, #0
  105345. 802b948: e008 b.n 802b95c <__ulp+0x3c>
  105346. 802b94a: f1a2 0314 sub.w r3, r2, #20
  105347. 802b94e: 2b1e cmp r3, #30
  105348. 802b950: bfda itte le
  105349. 802b952: f04f 4200 movle.w r2, #2147483648 @ 0x80000000
  105350. 802b956: 40da lsrle r2, r3
  105351. 802b958: 2201 movgt r2, #1
  105352. 802b95a: 2300 movs r3, #0
  105353. 802b95c: 4619 mov r1, r3
  105354. 802b95e: 4610 mov r0, r2
  105355. 802b960: ec41 0b10 vmov d0, r0, r1
  105356. 802b964: b002 add sp, #8
  105357. 802b966: 4770 bx lr
  105358. 802b968: 7ff00000 .word 0x7ff00000
  105359. 0802b96c <__b2d>:
  105360. 802b96c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  105361. 802b970: 6906 ldr r6, [r0, #16]
  105362. 802b972: f100 0814 add.w r8, r0, #20
  105363. 802b976: eb08 0686 add.w r6, r8, r6, lsl #2
  105364. 802b97a: 1f37 subs r7, r6, #4
  105365. 802b97c: f856 2c04 ldr.w r2, [r6, #-4]
  105366. 802b980: 4610 mov r0, r2
  105367. 802b982: f7ff fd4b bl 802b41c <__hi0bits>
  105368. 802b986: f1c0 0320 rsb r3, r0, #32
  105369. 802b98a: 280a cmp r0, #10
  105370. 802b98c: 600b str r3, [r1, #0]
  105371. 802b98e: 491b ldr r1, [pc, #108] @ (802b9fc <__b2d+0x90>)
  105372. 802b990: dc15 bgt.n 802b9be <__b2d+0x52>
  105373. 802b992: f1c0 0c0b rsb ip, r0, #11
  105374. 802b996: fa22 f30c lsr.w r3, r2, ip
  105375. 802b99a: 45b8 cmp r8, r7
  105376. 802b99c: ea43 0501 orr.w r5, r3, r1
  105377. 802b9a0: bf34 ite cc
  105378. 802b9a2: f856 3c08 ldrcc.w r3, [r6, #-8]
  105379. 802b9a6: 2300 movcs r3, #0
  105380. 802b9a8: 3015 adds r0, #21
  105381. 802b9aa: fa02 f000 lsl.w r0, r2, r0
  105382. 802b9ae: fa23 f30c lsr.w r3, r3, ip
  105383. 802b9b2: 4303 orrs r3, r0
  105384. 802b9b4: 461c mov r4, r3
  105385. 802b9b6: ec45 4b10 vmov d0, r4, r5
  105386. 802b9ba: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  105387. 802b9be: 45b8 cmp r8, r7
  105388. 802b9c0: bf3a itte cc
  105389. 802b9c2: f856 3c08 ldrcc.w r3, [r6, #-8]
  105390. 802b9c6: f1a6 0708 subcc.w r7, r6, #8
  105391. 802b9ca: 2300 movcs r3, #0
  105392. 802b9cc: 380b subs r0, #11
  105393. 802b9ce: d012 beq.n 802b9f6 <__b2d+0x8a>
  105394. 802b9d0: f1c0 0120 rsb r1, r0, #32
  105395. 802b9d4: fa23 f401 lsr.w r4, r3, r1
  105396. 802b9d8: 4082 lsls r2, r0
  105397. 802b9da: 4322 orrs r2, r4
  105398. 802b9dc: 4547 cmp r7, r8
  105399. 802b9de: f042 557f orr.w r5, r2, #1069547520 @ 0x3fc00000
  105400. 802b9e2: bf8c ite hi
  105401. 802b9e4: f857 2c04 ldrhi.w r2, [r7, #-4]
  105402. 802b9e8: 2200 movls r2, #0
  105403. 802b9ea: 4083 lsls r3, r0
  105404. 802b9ec: 40ca lsrs r2, r1
  105405. 802b9ee: f445 1540 orr.w r5, r5, #3145728 @ 0x300000
  105406. 802b9f2: 4313 orrs r3, r2
  105407. 802b9f4: e7de b.n 802b9b4 <__b2d+0x48>
  105408. 802b9f6: ea42 0501 orr.w r5, r2, r1
  105409. 802b9fa: e7db b.n 802b9b4 <__b2d+0x48>
  105410. 802b9fc: 3ff00000 .word 0x3ff00000
  105411. 0802ba00 <__d2b>:
  105412. 802ba00: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr}
  105413. 802ba04: 460f mov r7, r1
  105414. 802ba06: 2101 movs r1, #1
  105415. 802ba08: ec59 8b10 vmov r8, r9, d0
  105416. 802ba0c: 4616 mov r6, r2
  105417. 802ba0e: f7ff fc13 bl 802b238 <_Balloc>
  105418. 802ba12: 4604 mov r4, r0
  105419. 802ba14: b930 cbnz r0, 802ba24 <__d2b+0x24>
  105420. 802ba16: 4602 mov r2, r0
  105421. 802ba18: 4b23 ldr r3, [pc, #140] @ (802baa8 <__d2b+0xa8>)
  105422. 802ba1a: 4824 ldr r0, [pc, #144] @ (802baac <__d2b+0xac>)
  105423. 802ba1c: f240 310f movw r1, #783 @ 0x30f
  105424. 802ba20: f7fe fa76 bl 8029f10 <__assert_func>
  105425. 802ba24: f3c9 550a ubfx r5, r9, #20, #11
  105426. 802ba28: f3c9 0313 ubfx r3, r9, #0, #20
  105427. 802ba2c: b10d cbz r5, 802ba32 <__d2b+0x32>
  105428. 802ba2e: f443 1380 orr.w r3, r3, #1048576 @ 0x100000
  105429. 802ba32: 9301 str r3, [sp, #4]
  105430. 802ba34: f1b8 0300 subs.w r3, r8, #0
  105431. 802ba38: d023 beq.n 802ba82 <__d2b+0x82>
  105432. 802ba3a: 4668 mov r0, sp
  105433. 802ba3c: 9300 str r3, [sp, #0]
  105434. 802ba3e: f7ff fd0c bl 802b45a <__lo0bits>
  105435. 802ba42: e9dd 1200 ldrd r1, r2, [sp]
  105436. 802ba46: b1d0 cbz r0, 802ba7e <__d2b+0x7e>
  105437. 802ba48: f1c0 0320 rsb r3, r0, #32
  105438. 802ba4c: fa02 f303 lsl.w r3, r2, r3
  105439. 802ba50: 430b orrs r3, r1
  105440. 802ba52: 40c2 lsrs r2, r0
  105441. 802ba54: 6163 str r3, [r4, #20]
  105442. 802ba56: 9201 str r2, [sp, #4]
  105443. 802ba58: 9b01 ldr r3, [sp, #4]
  105444. 802ba5a: 61a3 str r3, [r4, #24]
  105445. 802ba5c: 2b00 cmp r3, #0
  105446. 802ba5e: bf0c ite eq
  105447. 802ba60: 2201 moveq r2, #1
  105448. 802ba62: 2202 movne r2, #2
  105449. 802ba64: 6122 str r2, [r4, #16]
  105450. 802ba66: b1a5 cbz r5, 802ba92 <__d2b+0x92>
  105451. 802ba68: f2a5 4533 subw r5, r5, #1075 @ 0x433
  105452. 802ba6c: 4405 add r5, r0
  105453. 802ba6e: 603d str r5, [r7, #0]
  105454. 802ba70: f1c0 0035 rsb r0, r0, #53 @ 0x35
  105455. 802ba74: 6030 str r0, [r6, #0]
  105456. 802ba76: 4620 mov r0, r4
  105457. 802ba78: b003 add sp, #12
  105458. 802ba7a: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  105459. 802ba7e: 6161 str r1, [r4, #20]
  105460. 802ba80: e7ea b.n 802ba58 <__d2b+0x58>
  105461. 802ba82: a801 add r0, sp, #4
  105462. 802ba84: f7ff fce9 bl 802b45a <__lo0bits>
  105463. 802ba88: 9b01 ldr r3, [sp, #4]
  105464. 802ba8a: 6163 str r3, [r4, #20]
  105465. 802ba8c: 3020 adds r0, #32
  105466. 802ba8e: 2201 movs r2, #1
  105467. 802ba90: e7e8 b.n 802ba64 <__d2b+0x64>
  105468. 802ba92: eb04 0382 add.w r3, r4, r2, lsl #2
  105469. 802ba96: f2a0 4032 subw r0, r0, #1074 @ 0x432
  105470. 802ba9a: 6038 str r0, [r7, #0]
  105471. 802ba9c: 6918 ldr r0, [r3, #16]
  105472. 802ba9e: f7ff fcbd bl 802b41c <__hi0bits>
  105473. 802baa2: ebc0 1042 rsb r0, r0, r2, lsl #5
  105474. 802baa6: e7e5 b.n 802ba74 <__d2b+0x74>
  105475. 802baa8: 08030ec6 .word 0x08030ec6
  105476. 802baac: 08030f37 .word 0x08030f37
  105477. 0802bab0 <__ratio>:
  105478. 802bab0: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  105479. 802bab4: 4688 mov r8, r1
  105480. 802bab6: 4669 mov r1, sp
  105481. 802bab8: 4681 mov r9, r0
  105482. 802baba: f7ff ff57 bl 802b96c <__b2d>
  105483. 802babe: a901 add r1, sp, #4
  105484. 802bac0: 4640 mov r0, r8
  105485. 802bac2: ec55 4b10 vmov r4, r5, d0
  105486. 802bac6: f7ff ff51 bl 802b96c <__b2d>
  105487. 802baca: f8d8 3010 ldr.w r3, [r8, #16]
  105488. 802bace: f8d9 2010 ldr.w r2, [r9, #16]
  105489. 802bad2: 1ad2 subs r2, r2, r3
  105490. 802bad4: e9dd 3100 ldrd r3, r1, [sp]
  105491. 802bad8: 1a5b subs r3, r3, r1
  105492. 802bada: eb03 1342 add.w r3, r3, r2, lsl #5
  105493. 802bade: ec57 6b10 vmov r6, r7, d0
  105494. 802bae2: 2b00 cmp r3, #0
  105495. 802bae4: bfd6 itet le
  105496. 802bae6: ebc3 3303 rsble r3, r3, r3, lsl #12
  105497. 802baea: 462a movgt r2, r5
  105498. 802baec: 463a movle r2, r7
  105499. 802baee: 46ab mov fp, r5
  105500. 802baf0: 46a2 mov sl, r4
  105501. 802baf2: bfce itee gt
  105502. 802baf4: eb02 5b03 addgt.w fp, r2, r3, lsl #20
  105503. 802baf8: eb02 5303 addle.w r3, r2, r3, lsl #20
  105504. 802bafc: ee00 3a90 vmovle s1, r3
  105505. 802bb00: ec4b ab17 vmov d7, sl, fp
  105506. 802bb04: ee87 0b00 vdiv.f64 d0, d7, d0
  105507. 802bb08: b003 add sp, #12
  105508. 802bb0a: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  105509. 0802bb0e <__copybits>:
  105510. 802bb0e: 3901 subs r1, #1
  105511. 802bb10: b570 push {r4, r5, r6, lr}
  105512. 802bb12: 1149 asrs r1, r1, #5
  105513. 802bb14: 6914 ldr r4, [r2, #16]
  105514. 802bb16: 3101 adds r1, #1
  105515. 802bb18: f102 0314 add.w r3, r2, #20
  105516. 802bb1c: eb00 0181 add.w r1, r0, r1, lsl #2
  105517. 802bb20: eb03 0484 add.w r4, r3, r4, lsl #2
  105518. 802bb24: 1f05 subs r5, r0, #4
  105519. 802bb26: 42a3 cmp r3, r4
  105520. 802bb28: d30c bcc.n 802bb44 <__copybits+0x36>
  105521. 802bb2a: 1aa3 subs r3, r4, r2
  105522. 802bb2c: 3b11 subs r3, #17
  105523. 802bb2e: f023 0303 bic.w r3, r3, #3
  105524. 802bb32: 3211 adds r2, #17
  105525. 802bb34: 42a2 cmp r2, r4
  105526. 802bb36: bf88 it hi
  105527. 802bb38: 2300 movhi r3, #0
  105528. 802bb3a: 4418 add r0, r3
  105529. 802bb3c: 2300 movs r3, #0
  105530. 802bb3e: 4288 cmp r0, r1
  105531. 802bb40: d305 bcc.n 802bb4e <__copybits+0x40>
  105532. 802bb42: bd70 pop {r4, r5, r6, pc}
  105533. 802bb44: f853 6b04 ldr.w r6, [r3], #4
  105534. 802bb48: f845 6f04 str.w r6, [r5, #4]!
  105535. 802bb4c: e7eb b.n 802bb26 <__copybits+0x18>
  105536. 802bb4e: f840 3b04 str.w r3, [r0], #4
  105537. 802bb52: e7f4 b.n 802bb3e <__copybits+0x30>
  105538. 0802bb54 <__any_on>:
  105539. 802bb54: f100 0214 add.w r2, r0, #20
  105540. 802bb58: 6900 ldr r0, [r0, #16]
  105541. 802bb5a: 114b asrs r3, r1, #5
  105542. 802bb5c: 4298 cmp r0, r3
  105543. 802bb5e: b510 push {r4, lr}
  105544. 802bb60: db11 blt.n 802bb86 <__any_on+0x32>
  105545. 802bb62: dd0a ble.n 802bb7a <__any_on+0x26>
  105546. 802bb64: f011 011f ands.w r1, r1, #31
  105547. 802bb68: d007 beq.n 802bb7a <__any_on+0x26>
  105548. 802bb6a: f852 4023 ldr.w r4, [r2, r3, lsl #2]
  105549. 802bb6e: fa24 f001 lsr.w r0, r4, r1
  105550. 802bb72: fa00 f101 lsl.w r1, r0, r1
  105551. 802bb76: 428c cmp r4, r1
  105552. 802bb78: d10b bne.n 802bb92 <__any_on+0x3e>
  105553. 802bb7a: eb02 0383 add.w r3, r2, r3, lsl #2
  105554. 802bb7e: 4293 cmp r3, r2
  105555. 802bb80: d803 bhi.n 802bb8a <__any_on+0x36>
  105556. 802bb82: 2000 movs r0, #0
  105557. 802bb84: bd10 pop {r4, pc}
  105558. 802bb86: 4603 mov r3, r0
  105559. 802bb88: e7f7 b.n 802bb7a <__any_on+0x26>
  105560. 802bb8a: f853 1d04 ldr.w r1, [r3, #-4]!
  105561. 802bb8e: 2900 cmp r1, #0
  105562. 802bb90: d0f5 beq.n 802bb7e <__any_on+0x2a>
  105563. 802bb92: 2001 movs r0, #1
  105564. 802bb94: e7f6 b.n 802bb84 <__any_on+0x30>
  105565. 0802bb96 <_malloc_usable_size_r>:
  105566. 802bb96: f851 3c04 ldr.w r3, [r1, #-4]
  105567. 802bb9a: 1f18 subs r0, r3, #4
  105568. 802bb9c: 2b00 cmp r3, #0
  105569. 802bb9e: bfbc itt lt
  105570. 802bba0: 580b ldrlt r3, [r1, r0]
  105571. 802bba2: 18c0 addlt r0, r0, r3
  105572. 802bba4: 4770 bx lr
  105573. 0802bba6 <__ascii_wctomb>:
  105574. 802bba6: 4603 mov r3, r0
  105575. 802bba8: 4608 mov r0, r1
  105576. 802bbaa: b141 cbz r1, 802bbbe <__ascii_wctomb+0x18>
  105577. 802bbac: 2aff cmp r2, #255 @ 0xff
  105578. 802bbae: d904 bls.n 802bbba <__ascii_wctomb+0x14>
  105579. 802bbb0: 228a movs r2, #138 @ 0x8a
  105580. 802bbb2: 601a str r2, [r3, #0]
  105581. 802bbb4: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  105582. 802bbb8: 4770 bx lr
  105583. 802bbba: 700a strb r2, [r1, #0]
  105584. 802bbbc: 2001 movs r0, #1
  105585. 802bbbe: 4770 bx lr
  105586. 0802bbc0 <__ssputs_r>:
  105587. 802bbc0: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  105588. 802bbc4: 688e ldr r6, [r1, #8]
  105589. 802bbc6: 461f mov r7, r3
  105590. 802bbc8: 42be cmp r6, r7
  105591. 802bbca: 680b ldr r3, [r1, #0]
  105592. 802bbcc: 4682 mov sl, r0
  105593. 802bbce: 460c mov r4, r1
  105594. 802bbd0: 4690 mov r8, r2
  105595. 802bbd2: d82d bhi.n 802bc30 <__ssputs_r+0x70>
  105596. 802bbd4: f9b1 200c ldrsh.w r2, [r1, #12]
  105597. 802bbd8: f412 6f90 tst.w r2, #1152 @ 0x480
  105598. 802bbdc: d026 beq.n 802bc2c <__ssputs_r+0x6c>
  105599. 802bbde: 6965 ldr r5, [r4, #20]
  105600. 802bbe0: 6909 ldr r1, [r1, #16]
  105601. 802bbe2: eb05 0545 add.w r5, r5, r5, lsl #1
  105602. 802bbe6: eba3 0901 sub.w r9, r3, r1
  105603. 802bbea: eb05 75d5 add.w r5, r5, r5, lsr #31
  105604. 802bbee: 1c7b adds r3, r7, #1
  105605. 802bbf0: 444b add r3, r9
  105606. 802bbf2: 106d asrs r5, r5, #1
  105607. 802bbf4: 429d cmp r5, r3
  105608. 802bbf6: bf38 it cc
  105609. 802bbf8: 461d movcc r5, r3
  105610. 802bbfa: 0553 lsls r3, r2, #21
  105611. 802bbfc: d527 bpl.n 802bc4e <__ssputs_r+0x8e>
  105612. 802bbfe: 4629 mov r1, r5
  105613. 802bc00: f7fc fb2e bl 8028260 <_malloc_r>
  105614. 802bc04: 4606 mov r6, r0
  105615. 802bc06: b360 cbz r0, 802bc62 <__ssputs_r+0xa2>
  105616. 802bc08: 6921 ldr r1, [r4, #16]
  105617. 802bc0a: 464a mov r2, r9
  105618. 802bc0c: f7fe f967 bl 8029ede <memcpy>
  105619. 802bc10: 89a3 ldrh r3, [r4, #12]
  105620. 802bc12: f423 6390 bic.w r3, r3, #1152 @ 0x480
  105621. 802bc16: f043 0380 orr.w r3, r3, #128 @ 0x80
  105622. 802bc1a: 81a3 strh r3, [r4, #12]
  105623. 802bc1c: 6126 str r6, [r4, #16]
  105624. 802bc1e: 6165 str r5, [r4, #20]
  105625. 802bc20: 444e add r6, r9
  105626. 802bc22: eba5 0509 sub.w r5, r5, r9
  105627. 802bc26: 6026 str r6, [r4, #0]
  105628. 802bc28: 60a5 str r5, [r4, #8]
  105629. 802bc2a: 463e mov r6, r7
  105630. 802bc2c: 42be cmp r6, r7
  105631. 802bc2e: d900 bls.n 802bc32 <__ssputs_r+0x72>
  105632. 802bc30: 463e mov r6, r7
  105633. 802bc32: 6820 ldr r0, [r4, #0]
  105634. 802bc34: 4632 mov r2, r6
  105635. 802bc36: 4641 mov r1, r8
  105636. 802bc38: f7fe f840 bl 8029cbc <memmove>
  105637. 802bc3c: 68a3 ldr r3, [r4, #8]
  105638. 802bc3e: 1b9b subs r3, r3, r6
  105639. 802bc40: 60a3 str r3, [r4, #8]
  105640. 802bc42: 6823 ldr r3, [r4, #0]
  105641. 802bc44: 4433 add r3, r6
  105642. 802bc46: 6023 str r3, [r4, #0]
  105643. 802bc48: 2000 movs r0, #0
  105644. 802bc4a: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  105645. 802bc4e: 462a mov r2, r5
  105646. 802bc50: f7fc fbd8 bl 8028404 <_realloc_r>
  105647. 802bc54: 4606 mov r6, r0
  105648. 802bc56: 2800 cmp r0, #0
  105649. 802bc58: d1e0 bne.n 802bc1c <__ssputs_r+0x5c>
  105650. 802bc5a: 6921 ldr r1, [r4, #16]
  105651. 802bc5c: 4650 mov r0, sl
  105652. 802bc5e: f7fe ff55 bl 802ab0c <_free_r>
  105653. 802bc62: 230c movs r3, #12
  105654. 802bc64: f8ca 3000 str.w r3, [sl]
  105655. 802bc68: 89a3 ldrh r3, [r4, #12]
  105656. 802bc6a: f043 0340 orr.w r3, r3, #64 @ 0x40
  105657. 802bc6e: 81a3 strh r3, [r4, #12]
  105658. 802bc70: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  105659. 802bc74: e7e9 b.n 802bc4a <__ssputs_r+0x8a>
  105660. ...
  105661. 0802bc78 <_svfiprintf_r>:
  105662. 802bc78: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  105663. 802bc7c: 4698 mov r8, r3
  105664. 802bc7e: 898b ldrh r3, [r1, #12]
  105665. 802bc80: 061b lsls r3, r3, #24
  105666. 802bc82: b09d sub sp, #116 @ 0x74
  105667. 802bc84: 4607 mov r7, r0
  105668. 802bc86: 460d mov r5, r1
  105669. 802bc88: 4614 mov r4, r2
  105670. 802bc8a: d510 bpl.n 802bcae <_svfiprintf_r+0x36>
  105671. 802bc8c: 690b ldr r3, [r1, #16]
  105672. 802bc8e: b973 cbnz r3, 802bcae <_svfiprintf_r+0x36>
  105673. 802bc90: 2140 movs r1, #64 @ 0x40
  105674. 802bc92: f7fc fae5 bl 8028260 <_malloc_r>
  105675. 802bc96: 6028 str r0, [r5, #0]
  105676. 802bc98: 6128 str r0, [r5, #16]
  105677. 802bc9a: b930 cbnz r0, 802bcaa <_svfiprintf_r+0x32>
  105678. 802bc9c: 230c movs r3, #12
  105679. 802bc9e: 603b str r3, [r7, #0]
  105680. 802bca0: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  105681. 802bca4: b01d add sp, #116 @ 0x74
  105682. 802bca6: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  105683. 802bcaa: 2340 movs r3, #64 @ 0x40
  105684. 802bcac: 616b str r3, [r5, #20]
  105685. 802bcae: 2300 movs r3, #0
  105686. 802bcb0: 9309 str r3, [sp, #36] @ 0x24
  105687. 802bcb2: 2320 movs r3, #32
  105688. 802bcb4: f88d 3029 strb.w r3, [sp, #41] @ 0x29
  105689. 802bcb8: f8cd 800c str.w r8, [sp, #12]
  105690. 802bcbc: 2330 movs r3, #48 @ 0x30
  105691. 802bcbe: f8df 819c ldr.w r8, [pc, #412] @ 802be5c <_svfiprintf_r+0x1e4>
  105692. 802bcc2: f88d 302a strb.w r3, [sp, #42] @ 0x2a
  105693. 802bcc6: f04f 0901 mov.w r9, #1
  105694. 802bcca: 4623 mov r3, r4
  105695. 802bccc: 469a mov sl, r3
  105696. 802bcce: f813 2b01 ldrb.w r2, [r3], #1
  105697. 802bcd2: b10a cbz r2, 802bcd8 <_svfiprintf_r+0x60>
  105698. 802bcd4: 2a25 cmp r2, #37 @ 0x25
  105699. 802bcd6: d1f9 bne.n 802bccc <_svfiprintf_r+0x54>
  105700. 802bcd8: ebba 0b04 subs.w fp, sl, r4
  105701. 802bcdc: d00b beq.n 802bcf6 <_svfiprintf_r+0x7e>
  105702. 802bcde: 465b mov r3, fp
  105703. 802bce0: 4622 mov r2, r4
  105704. 802bce2: 4629 mov r1, r5
  105705. 802bce4: 4638 mov r0, r7
  105706. 802bce6: f7ff ff6b bl 802bbc0 <__ssputs_r>
  105707. 802bcea: 3001 adds r0, #1
  105708. 802bcec: f000 80a7 beq.w 802be3e <_svfiprintf_r+0x1c6>
  105709. 802bcf0: 9a09 ldr r2, [sp, #36] @ 0x24
  105710. 802bcf2: 445a add r2, fp
  105711. 802bcf4: 9209 str r2, [sp, #36] @ 0x24
  105712. 802bcf6: f89a 3000 ldrb.w r3, [sl]
  105713. 802bcfa: 2b00 cmp r3, #0
  105714. 802bcfc: f000 809f beq.w 802be3e <_svfiprintf_r+0x1c6>
  105715. 802bd00: 2300 movs r3, #0
  105716. 802bd02: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  105717. 802bd06: e9cd 2305 strd r2, r3, [sp, #20]
  105718. 802bd0a: f10a 0a01 add.w sl, sl, #1
  105719. 802bd0e: 9304 str r3, [sp, #16]
  105720. 802bd10: 9307 str r3, [sp, #28]
  105721. 802bd12: f88d 3053 strb.w r3, [sp, #83] @ 0x53
  105722. 802bd16: 931a str r3, [sp, #104] @ 0x68
  105723. 802bd18: 4654 mov r4, sl
  105724. 802bd1a: 2205 movs r2, #5
  105725. 802bd1c: f814 1b01 ldrb.w r1, [r4], #1
  105726. 802bd20: 484e ldr r0, [pc, #312] @ (802be5c <_svfiprintf_r+0x1e4>)
  105727. 802bd22: f7d4 faed bl 8000300 <memchr>
  105728. 802bd26: 9a04 ldr r2, [sp, #16]
  105729. 802bd28: b9d8 cbnz r0, 802bd62 <_svfiprintf_r+0xea>
  105730. 802bd2a: 06d0 lsls r0, r2, #27
  105731. 802bd2c: bf44 itt mi
  105732. 802bd2e: 2320 movmi r3, #32
  105733. 802bd30: f88d 3053 strbmi.w r3, [sp, #83] @ 0x53
  105734. 802bd34: 0711 lsls r1, r2, #28
  105735. 802bd36: bf44 itt mi
  105736. 802bd38: 232b movmi r3, #43 @ 0x2b
  105737. 802bd3a: f88d 3053 strbmi.w r3, [sp, #83] @ 0x53
  105738. 802bd3e: f89a 3000 ldrb.w r3, [sl]
  105739. 802bd42: 2b2a cmp r3, #42 @ 0x2a
  105740. 802bd44: d015 beq.n 802bd72 <_svfiprintf_r+0xfa>
  105741. 802bd46: 9a07 ldr r2, [sp, #28]
  105742. 802bd48: 4654 mov r4, sl
  105743. 802bd4a: 2000 movs r0, #0
  105744. 802bd4c: f04f 0c0a mov.w ip, #10
  105745. 802bd50: 4621 mov r1, r4
  105746. 802bd52: f811 3b01 ldrb.w r3, [r1], #1
  105747. 802bd56: 3b30 subs r3, #48 @ 0x30
  105748. 802bd58: 2b09 cmp r3, #9
  105749. 802bd5a: d94b bls.n 802bdf4 <_svfiprintf_r+0x17c>
  105750. 802bd5c: b1b0 cbz r0, 802bd8c <_svfiprintf_r+0x114>
  105751. 802bd5e: 9207 str r2, [sp, #28]
  105752. 802bd60: e014 b.n 802bd8c <_svfiprintf_r+0x114>
  105753. 802bd62: eba0 0308 sub.w r3, r0, r8
  105754. 802bd66: fa09 f303 lsl.w r3, r9, r3
  105755. 802bd6a: 4313 orrs r3, r2
  105756. 802bd6c: 9304 str r3, [sp, #16]
  105757. 802bd6e: 46a2 mov sl, r4
  105758. 802bd70: e7d2 b.n 802bd18 <_svfiprintf_r+0xa0>
  105759. 802bd72: 9b03 ldr r3, [sp, #12]
  105760. 802bd74: 1d19 adds r1, r3, #4
  105761. 802bd76: 681b ldr r3, [r3, #0]
  105762. 802bd78: 9103 str r1, [sp, #12]
  105763. 802bd7a: 2b00 cmp r3, #0
  105764. 802bd7c: bfbb ittet lt
  105765. 802bd7e: 425b neglt r3, r3
  105766. 802bd80: f042 0202 orrlt.w r2, r2, #2
  105767. 802bd84: 9307 strge r3, [sp, #28]
  105768. 802bd86: 9307 strlt r3, [sp, #28]
  105769. 802bd88: bfb8 it lt
  105770. 802bd8a: 9204 strlt r2, [sp, #16]
  105771. 802bd8c: 7823 ldrb r3, [r4, #0]
  105772. 802bd8e: 2b2e cmp r3, #46 @ 0x2e
  105773. 802bd90: d10a bne.n 802bda8 <_svfiprintf_r+0x130>
  105774. 802bd92: 7863 ldrb r3, [r4, #1]
  105775. 802bd94: 2b2a cmp r3, #42 @ 0x2a
  105776. 802bd96: d132 bne.n 802bdfe <_svfiprintf_r+0x186>
  105777. 802bd98: 9b03 ldr r3, [sp, #12]
  105778. 802bd9a: 1d1a adds r2, r3, #4
  105779. 802bd9c: 681b ldr r3, [r3, #0]
  105780. 802bd9e: 9203 str r2, [sp, #12]
  105781. 802bda0: ea43 73e3 orr.w r3, r3, r3, asr #31
  105782. 802bda4: 3402 adds r4, #2
  105783. 802bda6: 9305 str r3, [sp, #20]
  105784. 802bda8: f8df a0c0 ldr.w sl, [pc, #192] @ 802be6c <_svfiprintf_r+0x1f4>
  105785. 802bdac: 7821 ldrb r1, [r4, #0]
  105786. 802bdae: 2203 movs r2, #3
  105787. 802bdb0: 4650 mov r0, sl
  105788. 802bdb2: f7d4 faa5 bl 8000300 <memchr>
  105789. 802bdb6: b138 cbz r0, 802bdc8 <_svfiprintf_r+0x150>
  105790. 802bdb8: 9b04 ldr r3, [sp, #16]
  105791. 802bdba: eba0 000a sub.w r0, r0, sl
  105792. 802bdbe: 2240 movs r2, #64 @ 0x40
  105793. 802bdc0: 4082 lsls r2, r0
  105794. 802bdc2: 4313 orrs r3, r2
  105795. 802bdc4: 3401 adds r4, #1
  105796. 802bdc6: 9304 str r3, [sp, #16]
  105797. 802bdc8: f814 1b01 ldrb.w r1, [r4], #1
  105798. 802bdcc: 4824 ldr r0, [pc, #144] @ (802be60 <_svfiprintf_r+0x1e8>)
  105799. 802bdce: f88d 1028 strb.w r1, [sp, #40] @ 0x28
  105800. 802bdd2: 2206 movs r2, #6
  105801. 802bdd4: f7d4 fa94 bl 8000300 <memchr>
  105802. 802bdd8: 2800 cmp r0, #0
  105803. 802bdda: d036 beq.n 802be4a <_svfiprintf_r+0x1d2>
  105804. 802bddc: 4b21 ldr r3, [pc, #132] @ (802be64 <_svfiprintf_r+0x1ec>)
  105805. 802bdde: bb1b cbnz r3, 802be28 <_svfiprintf_r+0x1b0>
  105806. 802bde0: 9b03 ldr r3, [sp, #12]
  105807. 802bde2: 3307 adds r3, #7
  105808. 802bde4: f023 0307 bic.w r3, r3, #7
  105809. 802bde8: 3308 adds r3, #8
  105810. 802bdea: 9303 str r3, [sp, #12]
  105811. 802bdec: 9b09 ldr r3, [sp, #36] @ 0x24
  105812. 802bdee: 4433 add r3, r6
  105813. 802bdf0: 9309 str r3, [sp, #36] @ 0x24
  105814. 802bdf2: e76a b.n 802bcca <_svfiprintf_r+0x52>
  105815. 802bdf4: fb0c 3202 mla r2, ip, r2, r3
  105816. 802bdf8: 460c mov r4, r1
  105817. 802bdfa: 2001 movs r0, #1
  105818. 802bdfc: e7a8 b.n 802bd50 <_svfiprintf_r+0xd8>
  105819. 802bdfe: 2300 movs r3, #0
  105820. 802be00: 3401 adds r4, #1
  105821. 802be02: 9305 str r3, [sp, #20]
  105822. 802be04: 4619 mov r1, r3
  105823. 802be06: f04f 0c0a mov.w ip, #10
  105824. 802be0a: 4620 mov r0, r4
  105825. 802be0c: f810 2b01 ldrb.w r2, [r0], #1
  105826. 802be10: 3a30 subs r2, #48 @ 0x30
  105827. 802be12: 2a09 cmp r2, #9
  105828. 802be14: d903 bls.n 802be1e <_svfiprintf_r+0x1a6>
  105829. 802be16: 2b00 cmp r3, #0
  105830. 802be18: d0c6 beq.n 802bda8 <_svfiprintf_r+0x130>
  105831. 802be1a: 9105 str r1, [sp, #20]
  105832. 802be1c: e7c4 b.n 802bda8 <_svfiprintf_r+0x130>
  105833. 802be1e: fb0c 2101 mla r1, ip, r1, r2
  105834. 802be22: 4604 mov r4, r0
  105835. 802be24: 2301 movs r3, #1
  105836. 802be26: e7f0 b.n 802be0a <_svfiprintf_r+0x192>
  105837. 802be28: ab03 add r3, sp, #12
  105838. 802be2a: 9300 str r3, [sp, #0]
  105839. 802be2c: 462a mov r2, r5
  105840. 802be2e: 4b0e ldr r3, [pc, #56] @ (802be68 <_svfiprintf_r+0x1f0>)
  105841. 802be30: a904 add r1, sp, #16
  105842. 802be32: 4638 mov r0, r7
  105843. 802be34: f7fd f960 bl 80290f8 <_printf_float>
  105844. 802be38: 1c42 adds r2, r0, #1
  105845. 802be3a: 4606 mov r6, r0
  105846. 802be3c: d1d6 bne.n 802bdec <_svfiprintf_r+0x174>
  105847. 802be3e: 89ab ldrh r3, [r5, #12]
  105848. 802be40: 065b lsls r3, r3, #25
  105849. 802be42: f53f af2d bmi.w 802bca0 <_svfiprintf_r+0x28>
  105850. 802be46: 9809 ldr r0, [sp, #36] @ 0x24
  105851. 802be48: e72c b.n 802bca4 <_svfiprintf_r+0x2c>
  105852. 802be4a: ab03 add r3, sp, #12
  105853. 802be4c: 9300 str r3, [sp, #0]
  105854. 802be4e: 462a mov r2, r5
  105855. 802be50: 4b05 ldr r3, [pc, #20] @ (802be68 <_svfiprintf_r+0x1f0>)
  105856. 802be52: a904 add r1, sp, #16
  105857. 802be54: 4638 mov r0, r7
  105858. 802be56: f7fd fbd7 bl 8029608 <_printf_i>
  105859. 802be5a: e7ed b.n 802be38 <_svfiprintf_r+0x1c0>
  105860. 802be5c: 08031090 .word 0x08031090
  105861. 802be60: 0803109a .word 0x0803109a
  105862. 802be64: 080290f9 .word 0x080290f9
  105863. 802be68: 0802bbc1 .word 0x0802bbc1
  105864. 802be6c: 08031096 .word 0x08031096
  105865. 0802be70 <__sfputc_r>:
  105866. 802be70: 6893 ldr r3, [r2, #8]
  105867. 802be72: 3b01 subs r3, #1
  105868. 802be74: 2b00 cmp r3, #0
  105869. 802be76: b410 push {r4}
  105870. 802be78: 6093 str r3, [r2, #8]
  105871. 802be7a: da08 bge.n 802be8e <__sfputc_r+0x1e>
  105872. 802be7c: 6994 ldr r4, [r2, #24]
  105873. 802be7e: 42a3 cmp r3, r4
  105874. 802be80: db01 blt.n 802be86 <__sfputc_r+0x16>
  105875. 802be82: 290a cmp r1, #10
  105876. 802be84: d103 bne.n 802be8e <__sfputc_r+0x1e>
  105877. 802be86: f85d 4b04 ldr.w r4, [sp], #4
  105878. 802be8a: f7fd be72 b.w 8029b72 <__swbuf_r>
  105879. 802be8e: 6813 ldr r3, [r2, #0]
  105880. 802be90: 1c58 adds r0, r3, #1
  105881. 802be92: 6010 str r0, [r2, #0]
  105882. 802be94: 7019 strb r1, [r3, #0]
  105883. 802be96: 4608 mov r0, r1
  105884. 802be98: f85d 4b04 ldr.w r4, [sp], #4
  105885. 802be9c: 4770 bx lr
  105886. 0802be9e <__sfputs_r>:
  105887. 802be9e: b5f8 push {r3, r4, r5, r6, r7, lr}
  105888. 802bea0: 4606 mov r6, r0
  105889. 802bea2: 460f mov r7, r1
  105890. 802bea4: 4614 mov r4, r2
  105891. 802bea6: 18d5 adds r5, r2, r3
  105892. 802bea8: 42ac cmp r4, r5
  105893. 802beaa: d101 bne.n 802beb0 <__sfputs_r+0x12>
  105894. 802beac: 2000 movs r0, #0
  105895. 802beae: e007 b.n 802bec0 <__sfputs_r+0x22>
  105896. 802beb0: f814 1b01 ldrb.w r1, [r4], #1
  105897. 802beb4: 463a mov r2, r7
  105898. 802beb6: 4630 mov r0, r6
  105899. 802beb8: f7ff ffda bl 802be70 <__sfputc_r>
  105900. 802bebc: 1c43 adds r3, r0, #1
  105901. 802bebe: d1f3 bne.n 802bea8 <__sfputs_r+0xa>
  105902. 802bec0: bdf8 pop {r3, r4, r5, r6, r7, pc}
  105903. ...
  105904. 0802bec4 <_vfiprintf_r>:
  105905. 802bec4: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  105906. 802bec8: 460d mov r5, r1
  105907. 802beca: b09d sub sp, #116 @ 0x74
  105908. 802becc: 4614 mov r4, r2
  105909. 802bece: 4698 mov r8, r3
  105910. 802bed0: 4606 mov r6, r0
  105911. 802bed2: b118 cbz r0, 802bedc <_vfiprintf_r+0x18>
  105912. 802bed4: 6a03 ldr r3, [r0, #32]
  105913. 802bed6: b90b cbnz r3, 802bedc <_vfiprintf_r+0x18>
  105914. 802bed8: f7fd fd42 bl 8029960 <__sinit>
  105915. 802bedc: 6e6b ldr r3, [r5, #100] @ 0x64
  105916. 802bede: 07d9 lsls r1, r3, #31
  105917. 802bee0: d405 bmi.n 802beee <_vfiprintf_r+0x2a>
  105918. 802bee2: 89ab ldrh r3, [r5, #12]
  105919. 802bee4: 059a lsls r2, r3, #22
  105920. 802bee6: d402 bmi.n 802beee <_vfiprintf_r+0x2a>
  105921. 802bee8: 6da8 ldr r0, [r5, #88] @ 0x58
  105922. 802beea: f7fd fff6 bl 8029eda <__retarget_lock_acquire_recursive>
  105923. 802beee: 89ab ldrh r3, [r5, #12]
  105924. 802bef0: 071b lsls r3, r3, #28
  105925. 802bef2: d501 bpl.n 802bef8 <_vfiprintf_r+0x34>
  105926. 802bef4: 692b ldr r3, [r5, #16]
  105927. 802bef6: b99b cbnz r3, 802bf20 <_vfiprintf_r+0x5c>
  105928. 802bef8: 4629 mov r1, r5
  105929. 802befa: 4630 mov r0, r6
  105930. 802befc: f7fd fe78 bl 8029bf0 <__swsetup_r>
  105931. 802bf00: b170 cbz r0, 802bf20 <_vfiprintf_r+0x5c>
  105932. 802bf02: 6e6b ldr r3, [r5, #100] @ 0x64
  105933. 802bf04: 07dc lsls r4, r3, #31
  105934. 802bf06: d504 bpl.n 802bf12 <_vfiprintf_r+0x4e>
  105935. 802bf08: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  105936. 802bf0c: b01d add sp, #116 @ 0x74
  105937. 802bf0e: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  105938. 802bf12: 89ab ldrh r3, [r5, #12]
  105939. 802bf14: 0598 lsls r0, r3, #22
  105940. 802bf16: d4f7 bmi.n 802bf08 <_vfiprintf_r+0x44>
  105941. 802bf18: 6da8 ldr r0, [r5, #88] @ 0x58
  105942. 802bf1a: f7fd ffdf bl 8029edc <__retarget_lock_release_recursive>
  105943. 802bf1e: e7f3 b.n 802bf08 <_vfiprintf_r+0x44>
  105944. 802bf20: 2300 movs r3, #0
  105945. 802bf22: 9309 str r3, [sp, #36] @ 0x24
  105946. 802bf24: 2320 movs r3, #32
  105947. 802bf26: f88d 3029 strb.w r3, [sp, #41] @ 0x29
  105948. 802bf2a: f8cd 800c str.w r8, [sp, #12]
  105949. 802bf2e: 2330 movs r3, #48 @ 0x30
  105950. 802bf30: f8df 81ac ldr.w r8, [pc, #428] @ 802c0e0 <_vfiprintf_r+0x21c>
  105951. 802bf34: f88d 302a strb.w r3, [sp, #42] @ 0x2a
  105952. 802bf38: f04f 0901 mov.w r9, #1
  105953. 802bf3c: 4623 mov r3, r4
  105954. 802bf3e: 469a mov sl, r3
  105955. 802bf40: f813 2b01 ldrb.w r2, [r3], #1
  105956. 802bf44: b10a cbz r2, 802bf4a <_vfiprintf_r+0x86>
  105957. 802bf46: 2a25 cmp r2, #37 @ 0x25
  105958. 802bf48: d1f9 bne.n 802bf3e <_vfiprintf_r+0x7a>
  105959. 802bf4a: ebba 0b04 subs.w fp, sl, r4
  105960. 802bf4e: d00b beq.n 802bf68 <_vfiprintf_r+0xa4>
  105961. 802bf50: 465b mov r3, fp
  105962. 802bf52: 4622 mov r2, r4
  105963. 802bf54: 4629 mov r1, r5
  105964. 802bf56: 4630 mov r0, r6
  105965. 802bf58: f7ff ffa1 bl 802be9e <__sfputs_r>
  105966. 802bf5c: 3001 adds r0, #1
  105967. 802bf5e: f000 80a7 beq.w 802c0b0 <_vfiprintf_r+0x1ec>
  105968. 802bf62: 9a09 ldr r2, [sp, #36] @ 0x24
  105969. 802bf64: 445a add r2, fp
  105970. 802bf66: 9209 str r2, [sp, #36] @ 0x24
  105971. 802bf68: f89a 3000 ldrb.w r3, [sl]
  105972. 802bf6c: 2b00 cmp r3, #0
  105973. 802bf6e: f000 809f beq.w 802c0b0 <_vfiprintf_r+0x1ec>
  105974. 802bf72: 2300 movs r3, #0
  105975. 802bf74: f04f 32ff mov.w r2, #4294967295 @ 0xffffffff
  105976. 802bf78: e9cd 2305 strd r2, r3, [sp, #20]
  105977. 802bf7c: f10a 0a01 add.w sl, sl, #1
  105978. 802bf80: 9304 str r3, [sp, #16]
  105979. 802bf82: 9307 str r3, [sp, #28]
  105980. 802bf84: f88d 3053 strb.w r3, [sp, #83] @ 0x53
  105981. 802bf88: 931a str r3, [sp, #104] @ 0x68
  105982. 802bf8a: 4654 mov r4, sl
  105983. 802bf8c: 2205 movs r2, #5
  105984. 802bf8e: f814 1b01 ldrb.w r1, [r4], #1
  105985. 802bf92: 4853 ldr r0, [pc, #332] @ (802c0e0 <_vfiprintf_r+0x21c>)
  105986. 802bf94: f7d4 f9b4 bl 8000300 <memchr>
  105987. 802bf98: 9a04 ldr r2, [sp, #16]
  105988. 802bf9a: b9d8 cbnz r0, 802bfd4 <_vfiprintf_r+0x110>
  105989. 802bf9c: 06d1 lsls r1, r2, #27
  105990. 802bf9e: bf44 itt mi
  105991. 802bfa0: 2320 movmi r3, #32
  105992. 802bfa2: f88d 3053 strbmi.w r3, [sp, #83] @ 0x53
  105993. 802bfa6: 0713 lsls r3, r2, #28
  105994. 802bfa8: bf44 itt mi
  105995. 802bfaa: 232b movmi r3, #43 @ 0x2b
  105996. 802bfac: f88d 3053 strbmi.w r3, [sp, #83] @ 0x53
  105997. 802bfb0: f89a 3000 ldrb.w r3, [sl]
  105998. 802bfb4: 2b2a cmp r3, #42 @ 0x2a
  105999. 802bfb6: d015 beq.n 802bfe4 <_vfiprintf_r+0x120>
  106000. 802bfb8: 9a07 ldr r2, [sp, #28]
  106001. 802bfba: 4654 mov r4, sl
  106002. 802bfbc: 2000 movs r0, #0
  106003. 802bfbe: f04f 0c0a mov.w ip, #10
  106004. 802bfc2: 4621 mov r1, r4
  106005. 802bfc4: f811 3b01 ldrb.w r3, [r1], #1
  106006. 802bfc8: 3b30 subs r3, #48 @ 0x30
  106007. 802bfca: 2b09 cmp r3, #9
  106008. 802bfcc: d94b bls.n 802c066 <_vfiprintf_r+0x1a2>
  106009. 802bfce: b1b0 cbz r0, 802bffe <_vfiprintf_r+0x13a>
  106010. 802bfd0: 9207 str r2, [sp, #28]
  106011. 802bfd2: e014 b.n 802bffe <_vfiprintf_r+0x13a>
  106012. 802bfd4: eba0 0308 sub.w r3, r0, r8
  106013. 802bfd8: fa09 f303 lsl.w r3, r9, r3
  106014. 802bfdc: 4313 orrs r3, r2
  106015. 802bfde: 9304 str r3, [sp, #16]
  106016. 802bfe0: 46a2 mov sl, r4
  106017. 802bfe2: e7d2 b.n 802bf8a <_vfiprintf_r+0xc6>
  106018. 802bfe4: 9b03 ldr r3, [sp, #12]
  106019. 802bfe6: 1d19 adds r1, r3, #4
  106020. 802bfe8: 681b ldr r3, [r3, #0]
  106021. 802bfea: 9103 str r1, [sp, #12]
  106022. 802bfec: 2b00 cmp r3, #0
  106023. 802bfee: bfbb ittet lt
  106024. 802bff0: 425b neglt r3, r3
  106025. 802bff2: f042 0202 orrlt.w r2, r2, #2
  106026. 802bff6: 9307 strge r3, [sp, #28]
  106027. 802bff8: 9307 strlt r3, [sp, #28]
  106028. 802bffa: bfb8 it lt
  106029. 802bffc: 9204 strlt r2, [sp, #16]
  106030. 802bffe: 7823 ldrb r3, [r4, #0]
  106031. 802c000: 2b2e cmp r3, #46 @ 0x2e
  106032. 802c002: d10a bne.n 802c01a <_vfiprintf_r+0x156>
  106033. 802c004: 7863 ldrb r3, [r4, #1]
  106034. 802c006: 2b2a cmp r3, #42 @ 0x2a
  106035. 802c008: d132 bne.n 802c070 <_vfiprintf_r+0x1ac>
  106036. 802c00a: 9b03 ldr r3, [sp, #12]
  106037. 802c00c: 1d1a adds r2, r3, #4
  106038. 802c00e: 681b ldr r3, [r3, #0]
  106039. 802c010: 9203 str r2, [sp, #12]
  106040. 802c012: ea43 73e3 orr.w r3, r3, r3, asr #31
  106041. 802c016: 3402 adds r4, #2
  106042. 802c018: 9305 str r3, [sp, #20]
  106043. 802c01a: f8df a0d4 ldr.w sl, [pc, #212] @ 802c0f0 <_vfiprintf_r+0x22c>
  106044. 802c01e: 7821 ldrb r1, [r4, #0]
  106045. 802c020: 2203 movs r2, #3
  106046. 802c022: 4650 mov r0, sl
  106047. 802c024: f7d4 f96c bl 8000300 <memchr>
  106048. 802c028: b138 cbz r0, 802c03a <_vfiprintf_r+0x176>
  106049. 802c02a: 9b04 ldr r3, [sp, #16]
  106050. 802c02c: eba0 000a sub.w r0, r0, sl
  106051. 802c030: 2240 movs r2, #64 @ 0x40
  106052. 802c032: 4082 lsls r2, r0
  106053. 802c034: 4313 orrs r3, r2
  106054. 802c036: 3401 adds r4, #1
  106055. 802c038: 9304 str r3, [sp, #16]
  106056. 802c03a: f814 1b01 ldrb.w r1, [r4], #1
  106057. 802c03e: 4829 ldr r0, [pc, #164] @ (802c0e4 <_vfiprintf_r+0x220>)
  106058. 802c040: f88d 1028 strb.w r1, [sp, #40] @ 0x28
  106059. 802c044: 2206 movs r2, #6
  106060. 802c046: f7d4 f95b bl 8000300 <memchr>
  106061. 802c04a: 2800 cmp r0, #0
  106062. 802c04c: d03f beq.n 802c0ce <_vfiprintf_r+0x20a>
  106063. 802c04e: 4b26 ldr r3, [pc, #152] @ (802c0e8 <_vfiprintf_r+0x224>)
  106064. 802c050: bb1b cbnz r3, 802c09a <_vfiprintf_r+0x1d6>
  106065. 802c052: 9b03 ldr r3, [sp, #12]
  106066. 802c054: 3307 adds r3, #7
  106067. 802c056: f023 0307 bic.w r3, r3, #7
  106068. 802c05a: 3308 adds r3, #8
  106069. 802c05c: 9303 str r3, [sp, #12]
  106070. 802c05e: 9b09 ldr r3, [sp, #36] @ 0x24
  106071. 802c060: 443b add r3, r7
  106072. 802c062: 9309 str r3, [sp, #36] @ 0x24
  106073. 802c064: e76a b.n 802bf3c <_vfiprintf_r+0x78>
  106074. 802c066: fb0c 3202 mla r2, ip, r2, r3
  106075. 802c06a: 460c mov r4, r1
  106076. 802c06c: 2001 movs r0, #1
  106077. 802c06e: e7a8 b.n 802bfc2 <_vfiprintf_r+0xfe>
  106078. 802c070: 2300 movs r3, #0
  106079. 802c072: 3401 adds r4, #1
  106080. 802c074: 9305 str r3, [sp, #20]
  106081. 802c076: 4619 mov r1, r3
  106082. 802c078: f04f 0c0a mov.w ip, #10
  106083. 802c07c: 4620 mov r0, r4
  106084. 802c07e: f810 2b01 ldrb.w r2, [r0], #1
  106085. 802c082: 3a30 subs r2, #48 @ 0x30
  106086. 802c084: 2a09 cmp r2, #9
  106087. 802c086: d903 bls.n 802c090 <_vfiprintf_r+0x1cc>
  106088. 802c088: 2b00 cmp r3, #0
  106089. 802c08a: d0c6 beq.n 802c01a <_vfiprintf_r+0x156>
  106090. 802c08c: 9105 str r1, [sp, #20]
  106091. 802c08e: e7c4 b.n 802c01a <_vfiprintf_r+0x156>
  106092. 802c090: fb0c 2101 mla r1, ip, r1, r2
  106093. 802c094: 4604 mov r4, r0
  106094. 802c096: 2301 movs r3, #1
  106095. 802c098: e7f0 b.n 802c07c <_vfiprintf_r+0x1b8>
  106096. 802c09a: ab03 add r3, sp, #12
  106097. 802c09c: 9300 str r3, [sp, #0]
  106098. 802c09e: 462a mov r2, r5
  106099. 802c0a0: 4b12 ldr r3, [pc, #72] @ (802c0ec <_vfiprintf_r+0x228>)
  106100. 802c0a2: a904 add r1, sp, #16
  106101. 802c0a4: 4630 mov r0, r6
  106102. 802c0a6: f7fd f827 bl 80290f8 <_printf_float>
  106103. 802c0aa: 4607 mov r7, r0
  106104. 802c0ac: 1c78 adds r0, r7, #1
  106105. 802c0ae: d1d6 bne.n 802c05e <_vfiprintf_r+0x19a>
  106106. 802c0b0: 6e6b ldr r3, [r5, #100] @ 0x64
  106107. 802c0b2: 07d9 lsls r1, r3, #31
  106108. 802c0b4: d405 bmi.n 802c0c2 <_vfiprintf_r+0x1fe>
  106109. 802c0b6: 89ab ldrh r3, [r5, #12]
  106110. 802c0b8: 059a lsls r2, r3, #22
  106111. 802c0ba: d402 bmi.n 802c0c2 <_vfiprintf_r+0x1fe>
  106112. 802c0bc: 6da8 ldr r0, [r5, #88] @ 0x58
  106113. 802c0be: f7fd ff0d bl 8029edc <__retarget_lock_release_recursive>
  106114. 802c0c2: 89ab ldrh r3, [r5, #12]
  106115. 802c0c4: 065b lsls r3, r3, #25
  106116. 802c0c6: f53f af1f bmi.w 802bf08 <_vfiprintf_r+0x44>
  106117. 802c0ca: 9809 ldr r0, [sp, #36] @ 0x24
  106118. 802c0cc: e71e b.n 802bf0c <_vfiprintf_r+0x48>
  106119. 802c0ce: ab03 add r3, sp, #12
  106120. 802c0d0: 9300 str r3, [sp, #0]
  106121. 802c0d2: 462a mov r2, r5
  106122. 802c0d4: 4b05 ldr r3, [pc, #20] @ (802c0ec <_vfiprintf_r+0x228>)
  106123. 802c0d6: a904 add r1, sp, #16
  106124. 802c0d8: 4630 mov r0, r6
  106125. 802c0da: f7fd fa95 bl 8029608 <_printf_i>
  106126. 802c0de: e7e4 b.n 802c0aa <_vfiprintf_r+0x1e6>
  106127. 802c0e0: 08031090 .word 0x08031090
  106128. 802c0e4: 0803109a .word 0x0803109a
  106129. 802c0e8: 080290f9 .word 0x080290f9
  106130. 802c0ec: 0802be9f .word 0x0802be9f
  106131. 802c0f0: 08031096 .word 0x08031096
  106132. 0802c0f4 <__sflush_r>:
  106133. 802c0f4: f9b1 200c ldrsh.w r2, [r1, #12]
  106134. 802c0f8: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  106135. 802c0fc: 0716 lsls r6, r2, #28
  106136. 802c0fe: 4605 mov r5, r0
  106137. 802c100: 460c mov r4, r1
  106138. 802c102: d454 bmi.n 802c1ae <__sflush_r+0xba>
  106139. 802c104: 684b ldr r3, [r1, #4]
  106140. 802c106: 2b00 cmp r3, #0
  106141. 802c108: dc02 bgt.n 802c110 <__sflush_r+0x1c>
  106142. 802c10a: 6c0b ldr r3, [r1, #64] @ 0x40
  106143. 802c10c: 2b00 cmp r3, #0
  106144. 802c10e: dd48 ble.n 802c1a2 <__sflush_r+0xae>
  106145. 802c110: 6ae6 ldr r6, [r4, #44] @ 0x2c
  106146. 802c112: 2e00 cmp r6, #0
  106147. 802c114: d045 beq.n 802c1a2 <__sflush_r+0xae>
  106148. 802c116: 2300 movs r3, #0
  106149. 802c118: f412 5280 ands.w r2, r2, #4096 @ 0x1000
  106150. 802c11c: 682f ldr r7, [r5, #0]
  106151. 802c11e: 6a21 ldr r1, [r4, #32]
  106152. 802c120: 602b str r3, [r5, #0]
  106153. 802c122: d030 beq.n 802c186 <__sflush_r+0x92>
  106154. 802c124: 6d62 ldr r2, [r4, #84] @ 0x54
  106155. 802c126: 89a3 ldrh r3, [r4, #12]
  106156. 802c128: 0759 lsls r1, r3, #29
  106157. 802c12a: d505 bpl.n 802c138 <__sflush_r+0x44>
  106158. 802c12c: 6863 ldr r3, [r4, #4]
  106159. 802c12e: 1ad2 subs r2, r2, r3
  106160. 802c130: 6b63 ldr r3, [r4, #52] @ 0x34
  106161. 802c132: b10b cbz r3, 802c138 <__sflush_r+0x44>
  106162. 802c134: 6c23 ldr r3, [r4, #64] @ 0x40
  106163. 802c136: 1ad2 subs r2, r2, r3
  106164. 802c138: 2300 movs r3, #0
  106165. 802c13a: 6ae6 ldr r6, [r4, #44] @ 0x2c
  106166. 802c13c: 6a21 ldr r1, [r4, #32]
  106167. 802c13e: 4628 mov r0, r5
  106168. 802c140: 47b0 blx r6
  106169. 802c142: 1c43 adds r3, r0, #1
  106170. 802c144: 89a3 ldrh r3, [r4, #12]
  106171. 802c146: d106 bne.n 802c156 <__sflush_r+0x62>
  106172. 802c148: 6829 ldr r1, [r5, #0]
  106173. 802c14a: 291d cmp r1, #29
  106174. 802c14c: d82b bhi.n 802c1a6 <__sflush_r+0xb2>
  106175. 802c14e: 4a2a ldr r2, [pc, #168] @ (802c1f8 <__sflush_r+0x104>)
  106176. 802c150: 410a asrs r2, r1
  106177. 802c152: 07d6 lsls r6, r2, #31
  106178. 802c154: d427 bmi.n 802c1a6 <__sflush_r+0xb2>
  106179. 802c156: 2200 movs r2, #0
  106180. 802c158: 6062 str r2, [r4, #4]
  106181. 802c15a: 04d9 lsls r1, r3, #19
  106182. 802c15c: 6922 ldr r2, [r4, #16]
  106183. 802c15e: 6022 str r2, [r4, #0]
  106184. 802c160: d504 bpl.n 802c16c <__sflush_r+0x78>
  106185. 802c162: 1c42 adds r2, r0, #1
  106186. 802c164: d101 bne.n 802c16a <__sflush_r+0x76>
  106187. 802c166: 682b ldr r3, [r5, #0]
  106188. 802c168: b903 cbnz r3, 802c16c <__sflush_r+0x78>
  106189. 802c16a: 6560 str r0, [r4, #84] @ 0x54
  106190. 802c16c: 6b61 ldr r1, [r4, #52] @ 0x34
  106191. 802c16e: 602f str r7, [r5, #0]
  106192. 802c170: b1b9 cbz r1, 802c1a2 <__sflush_r+0xae>
  106193. 802c172: f104 0344 add.w r3, r4, #68 @ 0x44
  106194. 802c176: 4299 cmp r1, r3
  106195. 802c178: d002 beq.n 802c180 <__sflush_r+0x8c>
  106196. 802c17a: 4628 mov r0, r5
  106197. 802c17c: f7fe fcc6 bl 802ab0c <_free_r>
  106198. 802c180: 2300 movs r3, #0
  106199. 802c182: 6363 str r3, [r4, #52] @ 0x34
  106200. 802c184: e00d b.n 802c1a2 <__sflush_r+0xae>
  106201. 802c186: 2301 movs r3, #1
  106202. 802c188: 4628 mov r0, r5
  106203. 802c18a: 47b0 blx r6
  106204. 802c18c: 4602 mov r2, r0
  106205. 802c18e: 1c50 adds r0, r2, #1
  106206. 802c190: d1c9 bne.n 802c126 <__sflush_r+0x32>
  106207. 802c192: 682b ldr r3, [r5, #0]
  106208. 802c194: 2b00 cmp r3, #0
  106209. 802c196: d0c6 beq.n 802c126 <__sflush_r+0x32>
  106210. 802c198: 2b1d cmp r3, #29
  106211. 802c19a: d001 beq.n 802c1a0 <__sflush_r+0xac>
  106212. 802c19c: 2b16 cmp r3, #22
  106213. 802c19e: d11e bne.n 802c1de <__sflush_r+0xea>
  106214. 802c1a0: 602f str r7, [r5, #0]
  106215. 802c1a2: 2000 movs r0, #0
  106216. 802c1a4: e022 b.n 802c1ec <__sflush_r+0xf8>
  106217. 802c1a6: f043 0340 orr.w r3, r3, #64 @ 0x40
  106218. 802c1aa: b21b sxth r3, r3
  106219. 802c1ac: e01b b.n 802c1e6 <__sflush_r+0xf2>
  106220. 802c1ae: 690f ldr r7, [r1, #16]
  106221. 802c1b0: 2f00 cmp r7, #0
  106222. 802c1b2: d0f6 beq.n 802c1a2 <__sflush_r+0xae>
  106223. 802c1b4: 0793 lsls r3, r2, #30
  106224. 802c1b6: 680e ldr r6, [r1, #0]
  106225. 802c1b8: bf08 it eq
  106226. 802c1ba: 694b ldreq r3, [r1, #20]
  106227. 802c1bc: 600f str r7, [r1, #0]
  106228. 802c1be: bf18 it ne
  106229. 802c1c0: 2300 movne r3, #0
  106230. 802c1c2: eba6 0807 sub.w r8, r6, r7
  106231. 802c1c6: 608b str r3, [r1, #8]
  106232. 802c1c8: f1b8 0f00 cmp.w r8, #0
  106233. 802c1cc: dde9 ble.n 802c1a2 <__sflush_r+0xae>
  106234. 802c1ce: 6a21 ldr r1, [r4, #32]
  106235. 802c1d0: 6aa6 ldr r6, [r4, #40] @ 0x28
  106236. 802c1d2: 4643 mov r3, r8
  106237. 802c1d4: 463a mov r2, r7
  106238. 802c1d6: 4628 mov r0, r5
  106239. 802c1d8: 47b0 blx r6
  106240. 802c1da: 2800 cmp r0, #0
  106241. 802c1dc: dc08 bgt.n 802c1f0 <__sflush_r+0xfc>
  106242. 802c1de: f9b4 300c ldrsh.w r3, [r4, #12]
  106243. 802c1e2: f043 0340 orr.w r3, r3, #64 @ 0x40
  106244. 802c1e6: 81a3 strh r3, [r4, #12]
  106245. 802c1e8: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  106246. 802c1ec: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  106247. 802c1f0: 4407 add r7, r0
  106248. 802c1f2: eba8 0800 sub.w r8, r8, r0
  106249. 802c1f6: e7e7 b.n 802c1c8 <__sflush_r+0xd4>
  106250. 802c1f8: dfbffffe .word 0xdfbffffe
  106251. 0802c1fc <_fflush_r>:
  106252. 802c1fc: b538 push {r3, r4, r5, lr}
  106253. 802c1fe: 690b ldr r3, [r1, #16]
  106254. 802c200: 4605 mov r5, r0
  106255. 802c202: 460c mov r4, r1
  106256. 802c204: b913 cbnz r3, 802c20c <_fflush_r+0x10>
  106257. 802c206: 2500 movs r5, #0
  106258. 802c208: 4628 mov r0, r5
  106259. 802c20a: bd38 pop {r3, r4, r5, pc}
  106260. 802c20c: b118 cbz r0, 802c216 <_fflush_r+0x1a>
  106261. 802c20e: 6a03 ldr r3, [r0, #32]
  106262. 802c210: b90b cbnz r3, 802c216 <_fflush_r+0x1a>
  106263. 802c212: f7fd fba5 bl 8029960 <__sinit>
  106264. 802c216: f9b4 300c ldrsh.w r3, [r4, #12]
  106265. 802c21a: 2b00 cmp r3, #0
  106266. 802c21c: d0f3 beq.n 802c206 <_fflush_r+0xa>
  106267. 802c21e: 6e62 ldr r2, [r4, #100] @ 0x64
  106268. 802c220: 07d0 lsls r0, r2, #31
  106269. 802c222: d404 bmi.n 802c22e <_fflush_r+0x32>
  106270. 802c224: 0599 lsls r1, r3, #22
  106271. 802c226: d402 bmi.n 802c22e <_fflush_r+0x32>
  106272. 802c228: 6da0 ldr r0, [r4, #88] @ 0x58
  106273. 802c22a: f7fd fe56 bl 8029eda <__retarget_lock_acquire_recursive>
  106274. 802c22e: 4628 mov r0, r5
  106275. 802c230: 4621 mov r1, r4
  106276. 802c232: f7ff ff5f bl 802c0f4 <__sflush_r>
  106277. 802c236: 6e63 ldr r3, [r4, #100] @ 0x64
  106278. 802c238: 07da lsls r2, r3, #31
  106279. 802c23a: 4605 mov r5, r0
  106280. 802c23c: d4e4 bmi.n 802c208 <_fflush_r+0xc>
  106281. 802c23e: 89a3 ldrh r3, [r4, #12]
  106282. 802c240: 059b lsls r3, r3, #22
  106283. 802c242: d4e1 bmi.n 802c208 <_fflush_r+0xc>
  106284. 802c244: 6da0 ldr r0, [r4, #88] @ 0x58
  106285. 802c246: f7fd fe49 bl 8029edc <__retarget_lock_release_recursive>
  106286. 802c24a: e7dd b.n 802c208 <_fflush_r+0xc>
  106287. 0802c24c <fiprintf>:
  106288. 802c24c: b40e push {r1, r2, r3}
  106289. 802c24e: b503 push {r0, r1, lr}
  106290. 802c250: 4601 mov r1, r0
  106291. 802c252: ab03 add r3, sp, #12
  106292. 802c254: 4805 ldr r0, [pc, #20] @ (802c26c <fiprintf+0x20>)
  106293. 802c256: f853 2b04 ldr.w r2, [r3], #4
  106294. 802c25a: 6800 ldr r0, [r0, #0]
  106295. 802c25c: 9301 str r3, [sp, #4]
  106296. 802c25e: f7ff fe31 bl 802bec4 <_vfiprintf_r>
  106297. 802c262: b002 add sp, #8
  106298. 802c264: f85d eb04 ldr.w lr, [sp], #4
  106299. 802c268: b003 add sp, #12
  106300. 802c26a: 4770 bx lr
  106301. 802c26c: 240001d4 .word 0x240001d4
  106302. 0802c270 <__swhatbuf_r>:
  106303. 802c270: b570 push {r4, r5, r6, lr}
  106304. 802c272: 460c mov r4, r1
  106305. 802c274: f9b1 100e ldrsh.w r1, [r1, #14]
  106306. 802c278: 2900 cmp r1, #0
  106307. 802c27a: b096 sub sp, #88 @ 0x58
  106308. 802c27c: 4615 mov r5, r2
  106309. 802c27e: 461e mov r6, r3
  106310. 802c280: da0d bge.n 802c29e <__swhatbuf_r+0x2e>
  106311. 802c282: 89a3 ldrh r3, [r4, #12]
  106312. 802c284: f013 0f80 tst.w r3, #128 @ 0x80
  106313. 802c288: f04f 0100 mov.w r1, #0
  106314. 802c28c: bf14 ite ne
  106315. 802c28e: 2340 movne r3, #64 @ 0x40
  106316. 802c290: f44f 6380 moveq.w r3, #1024 @ 0x400
  106317. 802c294: 2000 movs r0, #0
  106318. 802c296: 6031 str r1, [r6, #0]
  106319. 802c298: 602b str r3, [r5, #0]
  106320. 802c29a: b016 add sp, #88 @ 0x58
  106321. 802c29c: bd70 pop {r4, r5, r6, pc}
  106322. 802c29e: 466a mov r2, sp
  106323. 802c2a0: f000 f848 bl 802c334 <_fstat_r>
  106324. 802c2a4: 2800 cmp r0, #0
  106325. 802c2a6: dbec blt.n 802c282 <__swhatbuf_r+0x12>
  106326. 802c2a8: 9901 ldr r1, [sp, #4]
  106327. 802c2aa: f401 4170 and.w r1, r1, #61440 @ 0xf000
  106328. 802c2ae: f5a1 5300 sub.w r3, r1, #8192 @ 0x2000
  106329. 802c2b2: 4259 negs r1, r3
  106330. 802c2b4: 4159 adcs r1, r3
  106331. 802c2b6: f44f 6380 mov.w r3, #1024 @ 0x400
  106332. 802c2ba: e7eb b.n 802c294 <__swhatbuf_r+0x24>
  106333. 0802c2bc <__smakebuf_r>:
  106334. 802c2bc: 898b ldrh r3, [r1, #12]
  106335. 802c2be: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  106336. 802c2c0: 079d lsls r5, r3, #30
  106337. 802c2c2: 4606 mov r6, r0
  106338. 802c2c4: 460c mov r4, r1
  106339. 802c2c6: d507 bpl.n 802c2d8 <__smakebuf_r+0x1c>
  106340. 802c2c8: f104 0347 add.w r3, r4, #71 @ 0x47
  106341. 802c2cc: 6023 str r3, [r4, #0]
  106342. 802c2ce: 6123 str r3, [r4, #16]
  106343. 802c2d0: 2301 movs r3, #1
  106344. 802c2d2: 6163 str r3, [r4, #20]
  106345. 802c2d4: b003 add sp, #12
  106346. 802c2d6: bdf0 pop {r4, r5, r6, r7, pc}
  106347. 802c2d8: ab01 add r3, sp, #4
  106348. 802c2da: 466a mov r2, sp
  106349. 802c2dc: f7ff ffc8 bl 802c270 <__swhatbuf_r>
  106350. 802c2e0: 9f00 ldr r7, [sp, #0]
  106351. 802c2e2: 4605 mov r5, r0
  106352. 802c2e4: 4639 mov r1, r7
  106353. 802c2e6: 4630 mov r0, r6
  106354. 802c2e8: f7fb ffba bl 8028260 <_malloc_r>
  106355. 802c2ec: b948 cbnz r0, 802c302 <__smakebuf_r+0x46>
  106356. 802c2ee: f9b4 300c ldrsh.w r3, [r4, #12]
  106357. 802c2f2: 059a lsls r2, r3, #22
  106358. 802c2f4: d4ee bmi.n 802c2d4 <__smakebuf_r+0x18>
  106359. 802c2f6: f023 0303 bic.w r3, r3, #3
  106360. 802c2fa: f043 0302 orr.w r3, r3, #2
  106361. 802c2fe: 81a3 strh r3, [r4, #12]
  106362. 802c300: e7e2 b.n 802c2c8 <__smakebuf_r+0xc>
  106363. 802c302: 89a3 ldrh r3, [r4, #12]
  106364. 802c304: 6020 str r0, [r4, #0]
  106365. 802c306: f043 0380 orr.w r3, r3, #128 @ 0x80
  106366. 802c30a: 81a3 strh r3, [r4, #12]
  106367. 802c30c: 9b01 ldr r3, [sp, #4]
  106368. 802c30e: e9c4 0704 strd r0, r7, [r4, #16]
  106369. 802c312: b15b cbz r3, 802c32c <__smakebuf_r+0x70>
  106370. 802c314: f9b4 100e ldrsh.w r1, [r4, #14]
  106371. 802c318: 4630 mov r0, r6
  106372. 802c31a: f000 f81d bl 802c358 <_isatty_r>
  106373. 802c31e: b128 cbz r0, 802c32c <__smakebuf_r+0x70>
  106374. 802c320: 89a3 ldrh r3, [r4, #12]
  106375. 802c322: f023 0303 bic.w r3, r3, #3
  106376. 802c326: f043 0301 orr.w r3, r3, #1
  106377. 802c32a: 81a3 strh r3, [r4, #12]
  106378. 802c32c: 89a3 ldrh r3, [r4, #12]
  106379. 802c32e: 431d orrs r5, r3
  106380. 802c330: 81a5 strh r5, [r4, #12]
  106381. 802c332: e7cf b.n 802c2d4 <__smakebuf_r+0x18>
  106382. 0802c334 <_fstat_r>:
  106383. 802c334: b538 push {r3, r4, r5, lr}
  106384. 802c336: 4d07 ldr r5, [pc, #28] @ (802c354 <_fstat_r+0x20>)
  106385. 802c338: 2300 movs r3, #0
  106386. 802c33a: 4604 mov r4, r0
  106387. 802c33c: 4608 mov r0, r1
  106388. 802c33e: 4611 mov r1, r2
  106389. 802c340: 602b str r3, [r5, #0]
  106390. 802c342: f7d7 fc43 bl 8003bcc <_fstat>
  106391. 802c346: 1c43 adds r3, r0, #1
  106392. 802c348: d102 bne.n 802c350 <_fstat_r+0x1c>
  106393. 802c34a: 682b ldr r3, [r5, #0]
  106394. 802c34c: b103 cbz r3, 802c350 <_fstat_r+0x1c>
  106395. 802c34e: 6023 str r3, [r4, #0]
  106396. 802c350: bd38 pop {r3, r4, r5, pc}
  106397. 802c352: bf00 nop
  106398. 802c354: 2402b180 .word 0x2402b180
  106399. 0802c358 <_isatty_r>:
  106400. 802c358: b538 push {r3, r4, r5, lr}
  106401. 802c35a: 4d06 ldr r5, [pc, #24] @ (802c374 <_isatty_r+0x1c>)
  106402. 802c35c: 2300 movs r3, #0
  106403. 802c35e: 4604 mov r4, r0
  106404. 802c360: 4608 mov r0, r1
  106405. 802c362: 602b str r3, [r5, #0]
  106406. 802c364: f7d7 fc42 bl 8003bec <_isatty>
  106407. 802c368: 1c43 adds r3, r0, #1
  106408. 802c36a: d102 bne.n 802c372 <_isatty_r+0x1a>
  106409. 802c36c: 682b ldr r3, [r5, #0]
  106410. 802c36e: b103 cbz r3, 802c372 <_isatty_r+0x1a>
  106411. 802c370: 6023 str r3, [r4, #0]
  106412. 802c372: bd38 pop {r3, r4, r5, pc}
  106413. 802c374: 2402b180 .word 0x2402b180
  106414. 0802c378 <abort>:
  106415. 802c378: b508 push {r3, lr}
  106416. 802c37a: 2006 movs r0, #6
  106417. 802c37c: f000 f840 bl 802c400 <raise>
  106418. 802c380: 2001 movs r0, #1
  106419. 802c382: f7d7 fbd3 bl 8003b2c <_exit>
  106420. 0802c386 <_calloc_r>:
  106421. 802c386: b570 push {r4, r5, r6, lr}
  106422. 802c388: fba1 5402 umull r5, r4, r1, r2
  106423. 802c38c: b93c cbnz r4, 802c39e <_calloc_r+0x18>
  106424. 802c38e: 4629 mov r1, r5
  106425. 802c390: f7fb ff66 bl 8028260 <_malloc_r>
  106426. 802c394: 4606 mov r6, r0
  106427. 802c396: b928 cbnz r0, 802c3a4 <_calloc_r+0x1e>
  106428. 802c398: 2600 movs r6, #0
  106429. 802c39a: 4630 mov r0, r6
  106430. 802c39c: bd70 pop {r4, r5, r6, pc}
  106431. 802c39e: 220c movs r2, #12
  106432. 802c3a0: 6002 str r2, [r0, #0]
  106433. 802c3a2: e7f9 b.n 802c398 <_calloc_r+0x12>
  106434. 802c3a4: 462a mov r2, r5
  106435. 802c3a6: 4621 mov r1, r4
  106436. 802c3a8: f7fd fca2 bl 8029cf0 <memset>
  106437. 802c3ac: e7f5 b.n 802c39a <_calloc_r+0x14>
  106438. 0802c3ae <_raise_r>:
  106439. 802c3ae: 291f cmp r1, #31
  106440. 802c3b0: b538 push {r3, r4, r5, lr}
  106441. 802c3b2: 4605 mov r5, r0
  106442. 802c3b4: 460c mov r4, r1
  106443. 802c3b6: d904 bls.n 802c3c2 <_raise_r+0x14>
  106444. 802c3b8: 2316 movs r3, #22
  106445. 802c3ba: 6003 str r3, [r0, #0]
  106446. 802c3bc: f04f 30ff mov.w r0, #4294967295 @ 0xffffffff
  106447. 802c3c0: bd38 pop {r3, r4, r5, pc}
  106448. 802c3c2: 6bc2 ldr r2, [r0, #60] @ 0x3c
  106449. 802c3c4: b112 cbz r2, 802c3cc <_raise_r+0x1e>
  106450. 802c3c6: f852 3021 ldr.w r3, [r2, r1, lsl #2]
  106451. 802c3ca: b94b cbnz r3, 802c3e0 <_raise_r+0x32>
  106452. 802c3cc: 4628 mov r0, r5
  106453. 802c3ce: f000 f831 bl 802c434 <_getpid_r>
  106454. 802c3d2: 4622 mov r2, r4
  106455. 802c3d4: 4601 mov r1, r0
  106456. 802c3d6: 4628 mov r0, r5
  106457. 802c3d8: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  106458. 802c3dc: f000 b818 b.w 802c410 <_kill_r>
  106459. 802c3e0: 2b01 cmp r3, #1
  106460. 802c3e2: d00a beq.n 802c3fa <_raise_r+0x4c>
  106461. 802c3e4: 1c59 adds r1, r3, #1
  106462. 802c3e6: d103 bne.n 802c3f0 <_raise_r+0x42>
  106463. 802c3e8: 2316 movs r3, #22
  106464. 802c3ea: 6003 str r3, [r0, #0]
  106465. 802c3ec: 2001 movs r0, #1
  106466. 802c3ee: e7e7 b.n 802c3c0 <_raise_r+0x12>
  106467. 802c3f0: 2100 movs r1, #0
  106468. 802c3f2: f842 1024 str.w r1, [r2, r4, lsl #2]
  106469. 802c3f6: 4620 mov r0, r4
  106470. 802c3f8: 4798 blx r3
  106471. 802c3fa: 2000 movs r0, #0
  106472. 802c3fc: e7e0 b.n 802c3c0 <_raise_r+0x12>
  106473. ...
  106474. 0802c400 <raise>:
  106475. 802c400: 4b02 ldr r3, [pc, #8] @ (802c40c <raise+0xc>)
  106476. 802c402: 4601 mov r1, r0
  106477. 802c404: 6818 ldr r0, [r3, #0]
  106478. 802c406: f7ff bfd2 b.w 802c3ae <_raise_r>
  106479. 802c40a: bf00 nop
  106480. 802c40c: 240001d4 .word 0x240001d4
  106481. 0802c410 <_kill_r>:
  106482. 802c410: b538 push {r3, r4, r5, lr}
  106483. 802c412: 4d07 ldr r5, [pc, #28] @ (802c430 <_kill_r+0x20>)
  106484. 802c414: 2300 movs r3, #0
  106485. 802c416: 4604 mov r4, r0
  106486. 802c418: 4608 mov r0, r1
  106487. 802c41a: 4611 mov r1, r2
  106488. 802c41c: 602b str r3, [r5, #0]
  106489. 802c41e: f7d7 fb73 bl 8003b08 <_kill>
  106490. 802c422: 1c43 adds r3, r0, #1
  106491. 802c424: d102 bne.n 802c42c <_kill_r+0x1c>
  106492. 802c426: 682b ldr r3, [r5, #0]
  106493. 802c428: b103 cbz r3, 802c42c <_kill_r+0x1c>
  106494. 802c42a: 6023 str r3, [r4, #0]
  106495. 802c42c: bd38 pop {r3, r4, r5, pc}
  106496. 802c42e: bf00 nop
  106497. 802c430: 2402b180 .word 0x2402b180
  106498. 0802c434 <_getpid_r>:
  106499. 802c434: f7d7 bb5f b.w 8003af6 <_getpid>
  106500. 0802c438 <_init>:
  106501. 802c438: b5f8 push {r3, r4, r5, r6, r7, lr}
  106502. 802c43a: bf00 nop
  106503. 802c43c: bcf8 pop {r3, r4, r5, r6, r7}
  106504. 802c43e: bc08 pop {r3}
  106505. 802c440: 469e mov lr, r3
  106506. 802c442: 4770 bx lr
  106507. 0802c444 <_fini>:
  106508. 802c444: b5f8 push {r3, r4, r5, r6, r7, lr}
  106509. 802c446: bf00 nop
  106510. 802c448: bcf8 pop {r3, r4, r5, r6, r7}
  106511. 802c44a: bc08 pop {r3}
  106512. 802c44c: 469e mov lr, r3
  106513. 802c44e: 4770 bx lr