stm32bt6702.lss 2.8 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731
  1. ../build/bt6702/stm32bt6702/stm32bt6702.elf: file format elf32-littlearm
  2. Sections:
  3. Idx Name Size VMA LMA File off Algn
  4. 0 .isr_vector 00000188 08020000 08020000 00008000 2**0
  5. CONTENTS, ALLOC, LOAD, READONLY, DATA
  6. 1 .text 00020878 08020188 08020188 00008188 2**3
  7. CONTENTS, ALLOC, LOAD, READONLY, CODE
  8. 2 .ARM 00000008 08040a00 08040a00 00028a00 2**2
  9. CONTENTS, ALLOC, LOAD, READONLY, DATA
  10. 3 .init_array 00000004 08040a08 08040a08 00028a08 2**2
  11. CONTENTS, ALLOC, LOAD, DATA
  12. 4 .fini_array 00000004 08040a0c 08040a0c 00028a0c 2**2
  13. CONTENTS, ALLOC, LOAD, DATA
  14. 5 .data 00001900 20000000 08040a10 00030000 2**2
  15. CONTENTS, ALLOC, LOAD, DATA
  16. 6 .fill 0007dcec 08042310 08042310 00032310 2**0
  17. CONTENTS, ALLOC, LOAD, DATA
  18. 7 .crc 00000004 080bfffc 080bfffc 000afffc 2**2
  19. CONTENTS, ALLOC, LOAD, DATA
  20. 8 .bss 0001393c 20001900 08042310 000b1900 2**2
  21. ALLOC
  22. 9 ._user_heap_stack 00000200 2001523c 08055c4c 000b1900 2**0
  23. ALLOC
  24. 10 .memory_b1_text 0000f000 10000000 10000000 000b0000 2**0
  25. ALLOC
  26. 11 .ARM.attributes 0000002f 00000000 00000000 000b0000 2**0
  27. CONTENTS, READONLY
  28. 12 .debug_info 00047ada 00000000 00000000 000b002f 2**0
  29. CONTENTS, READONLY, DEBUGGING
  30. 13 .debug_abbrev 0000bc52 00000000 00000000 000f7b09 2**0
  31. CONTENTS, READONLY, DEBUGGING
  32. 14 .debug_loc 0002322f 00000000 00000000 0010375b 2**0
  33. CONTENTS, READONLY, DEBUGGING
  34. 15 .debug_aranges 00002dc8 00000000 00000000 00126990 2**3
  35. CONTENTS, READONLY, DEBUGGING
  36. 16 .debug_ranges 00003728 00000000 00000000 00129758 2**3
  37. CONTENTS, READONLY, DEBUGGING
  38. 17 .debug_macro 0001f0a9 00000000 00000000 0012ce80 2**0
  39. CONTENTS, READONLY, DEBUGGING
  40. 18 .debug_line 000221cd 00000000 00000000 0014bf29 2**0
  41. CONTENTS, READONLY, DEBUGGING
  42. 19 .debug_str 000803ff 00000000 00000000 0016e0f6 2**0
  43. CONTENTS, READONLY, DEBUGGING
  44. 20 .comment 00000030 00000000 00000000 001ee4f5 2**0
  45. CONTENTS, READONLY
  46. 21 .debug_frame 00007ac0 00000000 00000000 001ee528 2**2
  47. CONTENTS, READONLY, DEBUGGING
  48. Disassembly of section .text:
  49. 08020188 <deregister_tm_clones>:
  50. 8020188: b508 push {r3, lr}
  51. 802018a: f641 1000 movw r0, #6400 ; 0x1900
  52. 802018e: 4b07 ldr r3, [pc, #28] ; (80201ac <deregister_tm_clones+0x24>)
  53. 8020190: f2c2 0000 movt r0, #8192 ; 0x2000
  54. 8020194: 1a1b subs r3, r3, r0
  55. 8020196: 2b06 cmp r3, #6
  56. 8020198: d800 bhi.n 802019c <deregister_tm_clones+0x14>
  57. 802019a: bd08 pop {r3, pc}
  58. 802019c: f240 0300 movw r3, #0
  59. 80201a0: f2c0 0300 movt r3, #0
  60. 80201a4: 2b00 cmp r3, #0
  61. 80201a6: d0f8 beq.n 802019a <deregister_tm_clones+0x12>
  62. 80201a8: 4798 blx r3
  63. 80201aa: e7f6 b.n 802019a <deregister_tm_clones+0x12>
  64. 80201ac: 20001903 .word 0x20001903
  65. 080201b0 <register_tm_clones>:
  66. 80201b0: b508 push {r3, lr}
  67. 80201b2: f641 1000 movw r0, #6400 ; 0x1900
  68. 80201b6: f641 1300 movw r3, #6400 ; 0x1900
  69. 80201ba: f2c2 0000 movt r0, #8192 ; 0x2000
  70. 80201be: f2c2 0300 movt r3, #8192 ; 0x2000
  71. 80201c2: 1a1b subs r3, r3, r0
  72. 80201c4: 109b asrs r3, r3, #2
  73. 80201c6: eb03 73d3 add.w r3, r3, r3, lsr #31
  74. 80201ca: 1059 asrs r1, r3, #1
  75. 80201cc: d100 bne.n 80201d0 <register_tm_clones+0x20>
  76. 80201ce: bd08 pop {r3, pc}
  77. 80201d0: f240 0200 movw r2, #0
  78. 80201d4: f2c0 0200 movt r2, #0
  79. 80201d8: 2a00 cmp r2, #0
  80. 80201da: d0f8 beq.n 80201ce <register_tm_clones+0x1e>
  81. 80201dc: 4790 blx r2
  82. 80201de: e7f6 b.n 80201ce <register_tm_clones+0x1e>
  83. 080201e0 <__do_global_dtors_aux>:
  84. 80201e0: b510 push {r4, lr}
  85. 80201e2: f641 1400 movw r4, #6400 ; 0x1900
  86. 80201e6: f2c2 0400 movt r4, #8192 ; 0x2000
  87. 80201ea: 7823 ldrb r3, [r4, #0]
  88. 80201ec: b973 cbnz r3, 802020c <__do_global_dtors_aux+0x2c>
  89. 80201ee: f7ff ffcb bl 8020188 <deregister_tm_clones>
  90. 80201f2: f240 0300 movw r3, #0
  91. 80201f6: f2c0 0300 movt r3, #0
  92. 80201fa: b12b cbz r3, 8020208 <__do_global_dtors_aux+0x28>
  93. 80201fc: f640 10e8 movw r0, #2536 ; 0x9e8
  94. 8020200: f6c0 0004 movt r0, #2052 ; 0x804
  95. 8020204: f3af 8000 nop.w
  96. 8020208: 2301 movs r3, #1
  97. 802020a: 7023 strb r3, [r4, #0]
  98. 802020c: bd10 pop {r4, pc}
  99. 802020e: bf00 nop
  100. 08020210 <frame_dummy>:
  101. 8020210: b508 push {r3, lr}
  102. 8020212: f240 0300 movw r3, #0
  103. 8020216: f2c0 0300 movt r3, #0
  104. 802021a: b14b cbz r3, 8020230 <frame_dummy+0x20>
  105. 802021c: f640 10e8 movw r0, #2536 ; 0x9e8
  106. 8020220: f641 1104 movw r1, #6404 ; 0x1904
  107. 8020224: f6c0 0004 movt r0, #2052 ; 0x804
  108. 8020228: f2c2 0100 movt r1, #8192 ; 0x2000
  109. 802022c: f3af 8000 nop.w
  110. 8020230: f641 1000 movw r0, #6400 ; 0x1900
  111. 8020234: f2c2 0000 movt r0, #8192 ; 0x2000
  112. 8020238: 6803 ldr r3, [r0, #0]
  113. 802023a: b12b cbz r3, 8020248 <frame_dummy+0x38>
  114. 802023c: f240 0300 movw r3, #0
  115. 8020240: f2c0 0300 movt r3, #0
  116. 8020244: b103 cbz r3, 8020248 <frame_dummy+0x38>
  117. 8020246: 4798 blx r3
  118. 8020248: e8bd 4008 ldmia.w sp!, {r3, lr}
  119. 802024c: f7ff bfb0 b.w 80201b0 <register_tm_clones>
  120. 08020250 <__aeabi_drsub>:
  121. 8020250: f081 4100 eor.w r1, r1, #2147483648 ; 0x80000000
  122. 8020254: e002 b.n 802025c <__adddf3>
  123. 8020256: bf00 nop
  124. 08020258 <__aeabi_dsub>:
  125. 8020258: f083 4300 eor.w r3, r3, #2147483648 ; 0x80000000
  126. 0802025c <__adddf3>:
  127. 802025c: b530 push {r4, r5, lr}
  128. 802025e: ea4f 0441 mov.w r4, r1, lsl #1
  129. 8020262: ea4f 0543 mov.w r5, r3, lsl #1
  130. 8020266: ea94 0f05 teq r4, r5
  131. 802026a: bf08 it eq
  132. 802026c: ea90 0f02 teqeq r0, r2
  133. 8020270: bf1f itttt ne
  134. 8020272: ea54 0c00 orrsne.w ip, r4, r0
  135. 8020276: ea55 0c02 orrsne.w ip, r5, r2
  136. 802027a: ea7f 5c64 mvnsne.w ip, r4, asr #21
  137. 802027e: ea7f 5c65 mvnsne.w ip, r5, asr #21
  138. 8020282: f000 80e2 beq.w 802044a <__adddf3+0x1ee>
  139. 8020286: ea4f 5454 mov.w r4, r4, lsr #21
  140. 802028a: ebd4 5555 rsbs r5, r4, r5, lsr #21
  141. 802028e: bfb8 it lt
  142. 8020290: 426d neglt r5, r5
  143. 8020292: dd0c ble.n 80202ae <__adddf3+0x52>
  144. 8020294: 442c add r4, r5
  145. 8020296: ea80 0202 eor.w r2, r0, r2
  146. 802029a: ea81 0303 eor.w r3, r1, r3
  147. 802029e: ea82 0000 eor.w r0, r2, r0
  148. 80202a2: ea83 0101 eor.w r1, r3, r1
  149. 80202a6: ea80 0202 eor.w r2, r0, r2
  150. 80202aa: ea81 0303 eor.w r3, r1, r3
  151. 80202ae: 2d36 cmp r5, #54 ; 0x36
  152. 80202b0: bf88 it hi
  153. 80202b2: bd30 pophi {r4, r5, pc}
  154. 80202b4: f011 4f00 tst.w r1, #2147483648 ; 0x80000000
  155. 80202b8: ea4f 3101 mov.w r1, r1, lsl #12
  156. 80202bc: f44f 1c80 mov.w ip, #1048576 ; 0x100000
  157. 80202c0: ea4c 3111 orr.w r1, ip, r1, lsr #12
  158. 80202c4: d002 beq.n 80202cc <__adddf3+0x70>
  159. 80202c6: 4240 negs r0, r0
  160. 80202c8: eb61 0141 sbc.w r1, r1, r1, lsl #1
  161. 80202cc: f013 4f00 tst.w r3, #2147483648 ; 0x80000000
  162. 80202d0: ea4f 3303 mov.w r3, r3, lsl #12
  163. 80202d4: ea4c 3313 orr.w r3, ip, r3, lsr #12
  164. 80202d8: d002 beq.n 80202e0 <__adddf3+0x84>
  165. 80202da: 4252 negs r2, r2
  166. 80202dc: eb63 0343 sbc.w r3, r3, r3, lsl #1
  167. 80202e0: ea94 0f05 teq r4, r5
  168. 80202e4: f000 80a7 beq.w 8020436 <__adddf3+0x1da>
  169. 80202e8: f1a4 0401 sub.w r4, r4, #1
  170. 80202ec: f1d5 0e20 rsbs lr, r5, #32
  171. 80202f0: db0d blt.n 802030e <__adddf3+0xb2>
  172. 80202f2: fa02 fc0e lsl.w ip, r2, lr
  173. 80202f6: fa22 f205 lsr.w r2, r2, r5
  174. 80202fa: 1880 adds r0, r0, r2
  175. 80202fc: f141 0100 adc.w r1, r1, #0
  176. 8020300: fa03 f20e lsl.w r2, r3, lr
  177. 8020304: 1880 adds r0, r0, r2
  178. 8020306: fa43 f305 asr.w r3, r3, r5
  179. 802030a: 4159 adcs r1, r3
  180. 802030c: e00e b.n 802032c <__adddf3+0xd0>
  181. 802030e: f1a5 0520 sub.w r5, r5, #32
  182. 8020312: f10e 0e20 add.w lr, lr, #32
  183. 8020316: 2a01 cmp r2, #1
  184. 8020318: fa03 fc0e lsl.w ip, r3, lr
  185. 802031c: bf28 it cs
  186. 802031e: f04c 0c02 orrcs.w ip, ip, #2
  187. 8020322: fa43 f305 asr.w r3, r3, r5
  188. 8020326: 18c0 adds r0, r0, r3
  189. 8020328: eb51 71e3 adcs.w r1, r1, r3, asr #31
  190. 802032c: f001 4500 and.w r5, r1, #2147483648 ; 0x80000000
  191. 8020330: d507 bpl.n 8020342 <__adddf3+0xe6>
  192. 8020332: f04f 0e00 mov.w lr, #0
  193. 8020336: f1dc 0c00 rsbs ip, ip, #0
  194. 802033a: eb7e 0000 sbcs.w r0, lr, r0
  195. 802033e: eb6e 0101 sbc.w r1, lr, r1
  196. 8020342: f5b1 1f80 cmp.w r1, #1048576 ; 0x100000
  197. 8020346: d31b bcc.n 8020380 <__adddf3+0x124>
  198. 8020348: f5b1 1f00 cmp.w r1, #2097152 ; 0x200000
  199. 802034c: d30c bcc.n 8020368 <__adddf3+0x10c>
  200. 802034e: 0849 lsrs r1, r1, #1
  201. 8020350: ea5f 0030 movs.w r0, r0, rrx
  202. 8020354: ea4f 0c3c mov.w ip, ip, rrx
  203. 8020358: f104 0401 add.w r4, r4, #1
  204. 802035c: ea4f 5244 mov.w r2, r4, lsl #21
  205. 8020360: f512 0f80 cmn.w r2, #4194304 ; 0x400000
  206. 8020364: f080 809a bcs.w 802049c <__adddf3+0x240>
  207. 8020368: f1bc 4f00 cmp.w ip, #2147483648 ; 0x80000000
  208. 802036c: bf08 it eq
  209. 802036e: ea5f 0c50 movseq.w ip, r0, lsr #1
  210. 8020372: f150 0000 adcs.w r0, r0, #0
  211. 8020376: eb41 5104 adc.w r1, r1, r4, lsl #20
  212. 802037a: ea41 0105 orr.w r1, r1, r5
  213. 802037e: bd30 pop {r4, r5, pc}
  214. 8020380: ea5f 0c4c movs.w ip, ip, lsl #1
  215. 8020384: 4140 adcs r0, r0
  216. 8020386: eb41 0101 adc.w r1, r1, r1
  217. 802038a: f411 1f80 tst.w r1, #1048576 ; 0x100000
  218. 802038e: f1a4 0401 sub.w r4, r4, #1
  219. 8020392: d1e9 bne.n 8020368 <__adddf3+0x10c>
  220. 8020394: f091 0f00 teq r1, #0
  221. 8020398: bf04 itt eq
  222. 802039a: 4601 moveq r1, r0
  223. 802039c: 2000 moveq r0, #0
  224. 802039e: fab1 f381 clz r3, r1
  225. 80203a2: bf08 it eq
  226. 80203a4: 3320 addeq r3, #32
  227. 80203a6: f1a3 030b sub.w r3, r3, #11
  228. 80203aa: f1b3 0220 subs.w r2, r3, #32
  229. 80203ae: da0c bge.n 80203ca <__adddf3+0x16e>
  230. 80203b0: 320c adds r2, #12
  231. 80203b2: dd08 ble.n 80203c6 <__adddf3+0x16a>
  232. 80203b4: f102 0c14 add.w ip, r2, #20
  233. 80203b8: f1c2 020c rsb r2, r2, #12
  234. 80203bc: fa01 f00c lsl.w r0, r1, ip
  235. 80203c0: fa21 f102 lsr.w r1, r1, r2
  236. 80203c4: e00c b.n 80203e0 <__adddf3+0x184>
  237. 80203c6: f102 0214 add.w r2, r2, #20
  238. 80203ca: bfd8 it le
  239. 80203cc: f1c2 0c20 rsble ip, r2, #32
  240. 80203d0: fa01 f102 lsl.w r1, r1, r2
  241. 80203d4: fa20 fc0c lsr.w ip, r0, ip
  242. 80203d8: bfdc itt le
  243. 80203da: ea41 010c orrle.w r1, r1, ip
  244. 80203de: 4090 lslle r0, r2
  245. 80203e0: 1ae4 subs r4, r4, r3
  246. 80203e2: bfa2 ittt ge
  247. 80203e4: eb01 5104 addge.w r1, r1, r4, lsl #20
  248. 80203e8: 4329 orrge r1, r5
  249. 80203ea: bd30 popge {r4, r5, pc}
  250. 80203ec: ea6f 0404 mvn.w r4, r4
  251. 80203f0: 3c1f subs r4, #31
  252. 80203f2: da1c bge.n 802042e <__adddf3+0x1d2>
  253. 80203f4: 340c adds r4, #12
  254. 80203f6: dc0e bgt.n 8020416 <__adddf3+0x1ba>
  255. 80203f8: f104 0414 add.w r4, r4, #20
  256. 80203fc: f1c4 0220 rsb r2, r4, #32
  257. 8020400: fa20 f004 lsr.w r0, r0, r4
  258. 8020404: fa01 f302 lsl.w r3, r1, r2
  259. 8020408: ea40 0003 orr.w r0, r0, r3
  260. 802040c: fa21 f304 lsr.w r3, r1, r4
  261. 8020410: ea45 0103 orr.w r1, r5, r3
  262. 8020414: bd30 pop {r4, r5, pc}
  263. 8020416: f1c4 040c rsb r4, r4, #12
  264. 802041a: f1c4 0220 rsb r2, r4, #32
  265. 802041e: fa20 f002 lsr.w r0, r0, r2
  266. 8020422: fa01 f304 lsl.w r3, r1, r4
  267. 8020426: ea40 0003 orr.w r0, r0, r3
  268. 802042a: 4629 mov r1, r5
  269. 802042c: bd30 pop {r4, r5, pc}
  270. 802042e: fa21 f004 lsr.w r0, r1, r4
  271. 8020432: 4629 mov r1, r5
  272. 8020434: bd30 pop {r4, r5, pc}
  273. 8020436: f094 0f00 teq r4, #0
  274. 802043a: f483 1380 eor.w r3, r3, #1048576 ; 0x100000
  275. 802043e: bf06 itte eq
  276. 8020440: f481 1180 eoreq.w r1, r1, #1048576 ; 0x100000
  277. 8020444: 3401 addeq r4, #1
  278. 8020446: 3d01 subne r5, #1
  279. 8020448: e74e b.n 80202e8 <__adddf3+0x8c>
  280. 802044a: ea7f 5c64 mvns.w ip, r4, asr #21
  281. 802044e: bf18 it ne
  282. 8020450: ea7f 5c65 mvnsne.w ip, r5, asr #21
  283. 8020454: d029 beq.n 80204aa <__adddf3+0x24e>
  284. 8020456: ea94 0f05 teq r4, r5
  285. 802045a: bf08 it eq
  286. 802045c: ea90 0f02 teqeq r0, r2
  287. 8020460: d005 beq.n 802046e <__adddf3+0x212>
  288. 8020462: ea54 0c00 orrs.w ip, r4, r0
  289. 8020466: bf04 itt eq
  290. 8020468: 4619 moveq r1, r3
  291. 802046a: 4610 moveq r0, r2
  292. 802046c: bd30 pop {r4, r5, pc}
  293. 802046e: ea91 0f03 teq r1, r3
  294. 8020472: bf1e ittt ne
  295. 8020474: 2100 movne r1, #0
  296. 8020476: 2000 movne r0, #0
  297. 8020478: bd30 popne {r4, r5, pc}
  298. 802047a: ea5f 5c54 movs.w ip, r4, lsr #21
  299. 802047e: d105 bne.n 802048c <__adddf3+0x230>
  300. 8020480: 0040 lsls r0, r0, #1
  301. 8020482: 4149 adcs r1, r1
  302. 8020484: bf28 it cs
  303. 8020486: f041 4100 orrcs.w r1, r1, #2147483648 ; 0x80000000
  304. 802048a: bd30 pop {r4, r5, pc}
  305. 802048c: f514 0480 adds.w r4, r4, #4194304 ; 0x400000
  306. 8020490: bf3c itt cc
  307. 8020492: f501 1180 addcc.w r1, r1, #1048576 ; 0x100000
  308. 8020496: bd30 popcc {r4, r5, pc}
  309. 8020498: f001 4500 and.w r5, r1, #2147483648 ; 0x80000000
  310. 802049c: f045 41fe orr.w r1, r5, #2130706432 ; 0x7f000000
  311. 80204a0: f441 0170 orr.w r1, r1, #15728640 ; 0xf00000
  312. 80204a4: f04f 0000 mov.w r0, #0
  313. 80204a8: bd30 pop {r4, r5, pc}
  314. 80204aa: ea7f 5c64 mvns.w ip, r4, asr #21
  315. 80204ae: bf1a itte ne
  316. 80204b0: 4619 movne r1, r3
  317. 80204b2: 4610 movne r0, r2
  318. 80204b4: ea7f 5c65 mvnseq.w ip, r5, asr #21
  319. 80204b8: bf1c itt ne
  320. 80204ba: 460b movne r3, r1
  321. 80204bc: 4602 movne r2, r0
  322. 80204be: ea50 3401 orrs.w r4, r0, r1, lsl #12
  323. 80204c2: bf06 itte eq
  324. 80204c4: ea52 3503 orrseq.w r5, r2, r3, lsl #12
  325. 80204c8: ea91 0f03 teqeq r1, r3
  326. 80204cc: f441 2100 orrne.w r1, r1, #524288 ; 0x80000
  327. 80204d0: bd30 pop {r4, r5, pc}
  328. 80204d2: bf00 nop
  329. 080204d4 <__aeabi_ui2d>:
  330. 80204d4: f090 0f00 teq r0, #0
  331. 80204d8: bf04 itt eq
  332. 80204da: 2100 moveq r1, #0
  333. 80204dc: 4770 bxeq lr
  334. 80204de: b530 push {r4, r5, lr}
  335. 80204e0: f44f 6480 mov.w r4, #1024 ; 0x400
  336. 80204e4: f104 0432 add.w r4, r4, #50 ; 0x32
  337. 80204e8: f04f 0500 mov.w r5, #0
  338. 80204ec: f04f 0100 mov.w r1, #0
  339. 80204f0: e750 b.n 8020394 <__adddf3+0x138>
  340. 80204f2: bf00 nop
  341. 080204f4 <__aeabi_i2d>:
  342. 80204f4: f090 0f00 teq r0, #0
  343. 80204f8: bf04 itt eq
  344. 80204fa: 2100 moveq r1, #0
  345. 80204fc: 4770 bxeq lr
  346. 80204fe: b530 push {r4, r5, lr}
  347. 8020500: f44f 6480 mov.w r4, #1024 ; 0x400
  348. 8020504: f104 0432 add.w r4, r4, #50 ; 0x32
  349. 8020508: f010 4500 ands.w r5, r0, #2147483648 ; 0x80000000
  350. 802050c: bf48 it mi
  351. 802050e: 4240 negmi r0, r0
  352. 8020510: f04f 0100 mov.w r1, #0
  353. 8020514: e73e b.n 8020394 <__adddf3+0x138>
  354. 8020516: bf00 nop
  355. 08020518 <__aeabi_f2d>:
  356. 8020518: 0042 lsls r2, r0, #1
  357. 802051a: ea4f 01e2 mov.w r1, r2, asr #3
  358. 802051e: ea4f 0131 mov.w r1, r1, rrx
  359. 8020522: ea4f 7002 mov.w r0, r2, lsl #28
  360. 8020526: bf1f itttt ne
  361. 8020528: f012 437f andsne.w r3, r2, #4278190080 ; 0xff000000
  362. 802052c: f093 4f7f teqne r3, #4278190080 ; 0xff000000
  363. 8020530: f081 5160 eorne.w r1, r1, #939524096 ; 0x38000000
  364. 8020534: 4770 bxne lr
  365. 8020536: f092 0f00 teq r2, #0
  366. 802053a: bf14 ite ne
  367. 802053c: f093 4f7f teqne r3, #4278190080 ; 0xff000000
  368. 8020540: 4770 bxeq lr
  369. 8020542: b530 push {r4, r5, lr}
  370. 8020544: f44f 7460 mov.w r4, #896 ; 0x380
  371. 8020548: f001 4500 and.w r5, r1, #2147483648 ; 0x80000000
  372. 802054c: f021 4100 bic.w r1, r1, #2147483648 ; 0x80000000
  373. 8020550: e720 b.n 8020394 <__adddf3+0x138>
  374. 8020552: bf00 nop
  375. 08020554 <__aeabi_ul2d>:
  376. 8020554: ea50 0201 orrs.w r2, r0, r1
  377. 8020558: bf08 it eq
  378. 802055a: 4770 bxeq lr
  379. 802055c: b530 push {r4, r5, lr}
  380. 802055e: f04f 0500 mov.w r5, #0
  381. 8020562: e00a b.n 802057a <__aeabi_l2d+0x16>
  382. 08020564 <__aeabi_l2d>:
  383. 8020564: ea50 0201 orrs.w r2, r0, r1
  384. 8020568: bf08 it eq
  385. 802056a: 4770 bxeq lr
  386. 802056c: b530 push {r4, r5, lr}
  387. 802056e: f011 4500 ands.w r5, r1, #2147483648 ; 0x80000000
  388. 8020572: d502 bpl.n 802057a <__aeabi_l2d+0x16>
  389. 8020574: 4240 negs r0, r0
  390. 8020576: eb61 0141 sbc.w r1, r1, r1, lsl #1
  391. 802057a: f44f 6480 mov.w r4, #1024 ; 0x400
  392. 802057e: f104 0432 add.w r4, r4, #50 ; 0x32
  393. 8020582: ea5f 5c91 movs.w ip, r1, lsr #22
  394. 8020586: f43f aedc beq.w 8020342 <__adddf3+0xe6>
  395. 802058a: f04f 0203 mov.w r2, #3
  396. 802058e: ea5f 0cdc movs.w ip, ip, lsr #3
  397. 8020592: bf18 it ne
  398. 8020594: 3203 addne r2, #3
  399. 8020596: ea5f 0cdc movs.w ip, ip, lsr #3
  400. 802059a: bf18 it ne
  401. 802059c: 3203 addne r2, #3
  402. 802059e: eb02 02dc add.w r2, r2, ip, lsr #3
  403. 80205a2: f1c2 0320 rsb r3, r2, #32
  404. 80205a6: fa00 fc03 lsl.w ip, r0, r3
  405. 80205aa: fa20 f002 lsr.w r0, r0, r2
  406. 80205ae: fa01 fe03 lsl.w lr, r1, r3
  407. 80205b2: ea40 000e orr.w r0, r0, lr
  408. 80205b6: fa21 f102 lsr.w r1, r1, r2
  409. 80205ba: 4414 add r4, r2
  410. 80205bc: e6c1 b.n 8020342 <__adddf3+0xe6>
  411. 80205be: bf00 nop
  412. 080205c0 <__aeabi_dmul>:
  413. 80205c0: b570 push {r4, r5, r6, lr}
  414. 80205c2: f04f 0cff mov.w ip, #255 ; 0xff
  415. 80205c6: f44c 6ce0 orr.w ip, ip, #1792 ; 0x700
  416. 80205ca: ea1c 5411 ands.w r4, ip, r1, lsr #20
  417. 80205ce: bf1d ittte ne
  418. 80205d0: ea1c 5513 andsne.w r5, ip, r3, lsr #20
  419. 80205d4: ea94 0f0c teqne r4, ip
  420. 80205d8: ea95 0f0c teqne r5, ip
  421. 80205dc: f000 f8de bleq 802079c <__aeabi_dmul+0x1dc>
  422. 80205e0: 442c add r4, r5
  423. 80205e2: ea81 0603 eor.w r6, r1, r3
  424. 80205e6: ea21 514c bic.w r1, r1, ip, lsl #21
  425. 80205ea: ea23 534c bic.w r3, r3, ip, lsl #21
  426. 80205ee: ea50 3501 orrs.w r5, r0, r1, lsl #12
  427. 80205f2: bf18 it ne
  428. 80205f4: ea52 3503 orrsne.w r5, r2, r3, lsl #12
  429. 80205f8: f441 1180 orr.w r1, r1, #1048576 ; 0x100000
  430. 80205fc: f443 1380 orr.w r3, r3, #1048576 ; 0x100000
  431. 8020600: d038 beq.n 8020674 <__aeabi_dmul+0xb4>
  432. 8020602: fba0 ce02 umull ip, lr, r0, r2
  433. 8020606: f04f 0500 mov.w r5, #0
  434. 802060a: fbe1 e502 umlal lr, r5, r1, r2
  435. 802060e: f006 4200 and.w r2, r6, #2147483648 ; 0x80000000
  436. 8020612: fbe0 e503 umlal lr, r5, r0, r3
  437. 8020616: f04f 0600 mov.w r6, #0
  438. 802061a: fbe1 5603 umlal r5, r6, r1, r3
  439. 802061e: f09c 0f00 teq ip, #0
  440. 8020622: bf18 it ne
  441. 8020624: f04e 0e01 orrne.w lr, lr, #1
  442. 8020628: f1a4 04ff sub.w r4, r4, #255 ; 0xff
  443. 802062c: f5b6 7f00 cmp.w r6, #512 ; 0x200
  444. 8020630: f564 7440 sbc.w r4, r4, #768 ; 0x300
  445. 8020634: d204 bcs.n 8020640 <__aeabi_dmul+0x80>
  446. 8020636: ea5f 0e4e movs.w lr, lr, lsl #1
  447. 802063a: 416d adcs r5, r5
  448. 802063c: eb46 0606 adc.w r6, r6, r6
  449. 8020640: ea42 21c6 orr.w r1, r2, r6, lsl #11
  450. 8020644: ea41 5155 orr.w r1, r1, r5, lsr #21
  451. 8020648: ea4f 20c5 mov.w r0, r5, lsl #11
  452. 802064c: ea40 505e orr.w r0, r0, lr, lsr #21
  453. 8020650: ea4f 2ece mov.w lr, lr, lsl #11
  454. 8020654: f1b4 0cfd subs.w ip, r4, #253 ; 0xfd
  455. 8020658: bf88 it hi
  456. 802065a: f5bc 6fe0 cmphi.w ip, #1792 ; 0x700
  457. 802065e: d81e bhi.n 802069e <__aeabi_dmul+0xde>
  458. 8020660: f1be 4f00 cmp.w lr, #2147483648 ; 0x80000000
  459. 8020664: bf08 it eq
  460. 8020666: ea5f 0e50 movseq.w lr, r0, lsr #1
  461. 802066a: f150 0000 adcs.w r0, r0, #0
  462. 802066e: eb41 5104 adc.w r1, r1, r4, lsl #20
  463. 8020672: bd70 pop {r4, r5, r6, pc}
  464. 8020674: f006 4600 and.w r6, r6, #2147483648 ; 0x80000000
  465. 8020678: ea46 0101 orr.w r1, r6, r1
  466. 802067c: ea40 0002 orr.w r0, r0, r2
  467. 8020680: ea81 0103 eor.w r1, r1, r3
  468. 8020684: ebb4 045c subs.w r4, r4, ip, lsr #1
  469. 8020688: bfc2 ittt gt
  470. 802068a: ebd4 050c rsbsgt r5, r4, ip
  471. 802068e: ea41 5104 orrgt.w r1, r1, r4, lsl #20
  472. 8020692: bd70 popgt {r4, r5, r6, pc}
  473. 8020694: f441 1180 orr.w r1, r1, #1048576 ; 0x100000
  474. 8020698: f04f 0e00 mov.w lr, #0
  475. 802069c: 3c01 subs r4, #1
  476. 802069e: f300 80ab bgt.w 80207f8 <__aeabi_dmul+0x238>
  477. 80206a2: f114 0f36 cmn.w r4, #54 ; 0x36
  478. 80206a6: bfde ittt le
  479. 80206a8: 2000 movle r0, #0
  480. 80206aa: f001 4100 andle.w r1, r1, #2147483648 ; 0x80000000
  481. 80206ae: bd70 pople {r4, r5, r6, pc}
  482. 80206b0: f1c4 0400 rsb r4, r4, #0
  483. 80206b4: 3c20 subs r4, #32
  484. 80206b6: da35 bge.n 8020724 <__aeabi_dmul+0x164>
  485. 80206b8: 340c adds r4, #12
  486. 80206ba: dc1b bgt.n 80206f4 <__aeabi_dmul+0x134>
  487. 80206bc: f104 0414 add.w r4, r4, #20
  488. 80206c0: f1c4 0520 rsb r5, r4, #32
  489. 80206c4: fa00 f305 lsl.w r3, r0, r5
  490. 80206c8: fa20 f004 lsr.w r0, r0, r4
  491. 80206cc: fa01 f205 lsl.w r2, r1, r5
  492. 80206d0: ea40 0002 orr.w r0, r0, r2
  493. 80206d4: f001 4200 and.w r2, r1, #2147483648 ; 0x80000000
  494. 80206d8: f021 4100 bic.w r1, r1, #2147483648 ; 0x80000000
  495. 80206dc: eb10 70d3 adds.w r0, r0, r3, lsr #31
  496. 80206e0: fa21 f604 lsr.w r6, r1, r4
  497. 80206e4: eb42 0106 adc.w r1, r2, r6
  498. 80206e8: ea5e 0e43 orrs.w lr, lr, r3, lsl #1
  499. 80206ec: bf08 it eq
  500. 80206ee: ea20 70d3 biceq.w r0, r0, r3, lsr #31
  501. 80206f2: bd70 pop {r4, r5, r6, pc}
  502. 80206f4: f1c4 040c rsb r4, r4, #12
  503. 80206f8: f1c4 0520 rsb r5, r4, #32
  504. 80206fc: fa00 f304 lsl.w r3, r0, r4
  505. 8020700: fa20 f005 lsr.w r0, r0, r5
  506. 8020704: fa01 f204 lsl.w r2, r1, r4
  507. 8020708: ea40 0002 orr.w r0, r0, r2
  508. 802070c: f001 4100 and.w r1, r1, #2147483648 ; 0x80000000
  509. 8020710: eb10 70d3 adds.w r0, r0, r3, lsr #31
  510. 8020714: f141 0100 adc.w r1, r1, #0
  511. 8020718: ea5e 0e43 orrs.w lr, lr, r3, lsl #1
  512. 802071c: bf08 it eq
  513. 802071e: ea20 70d3 biceq.w r0, r0, r3, lsr #31
  514. 8020722: bd70 pop {r4, r5, r6, pc}
  515. 8020724: f1c4 0520 rsb r5, r4, #32
  516. 8020728: fa00 f205 lsl.w r2, r0, r5
  517. 802072c: ea4e 0e02 orr.w lr, lr, r2
  518. 8020730: fa20 f304 lsr.w r3, r0, r4
  519. 8020734: fa01 f205 lsl.w r2, r1, r5
  520. 8020738: ea43 0302 orr.w r3, r3, r2
  521. 802073c: fa21 f004 lsr.w r0, r1, r4
  522. 8020740: f001 4100 and.w r1, r1, #2147483648 ; 0x80000000
  523. 8020744: fa21 f204 lsr.w r2, r1, r4
  524. 8020748: ea20 0002 bic.w r0, r0, r2
  525. 802074c: eb00 70d3 add.w r0, r0, r3, lsr #31
  526. 8020750: ea5e 0e43 orrs.w lr, lr, r3, lsl #1
  527. 8020754: bf08 it eq
  528. 8020756: ea20 70d3 biceq.w r0, r0, r3, lsr #31
  529. 802075a: bd70 pop {r4, r5, r6, pc}
  530. 802075c: f094 0f00 teq r4, #0
  531. 8020760: d10f bne.n 8020782 <__aeabi_dmul+0x1c2>
  532. 8020762: f001 4600 and.w r6, r1, #2147483648 ; 0x80000000
  533. 8020766: 0040 lsls r0, r0, #1
  534. 8020768: eb41 0101 adc.w r1, r1, r1
  535. 802076c: f411 1f80 tst.w r1, #1048576 ; 0x100000
  536. 8020770: bf08 it eq
  537. 8020772: 3c01 subeq r4, #1
  538. 8020774: d0f7 beq.n 8020766 <__aeabi_dmul+0x1a6>
  539. 8020776: ea41 0106 orr.w r1, r1, r6
  540. 802077a: f095 0f00 teq r5, #0
  541. 802077e: bf18 it ne
  542. 8020780: 4770 bxne lr
  543. 8020782: f003 4600 and.w r6, r3, #2147483648 ; 0x80000000
  544. 8020786: 0052 lsls r2, r2, #1
  545. 8020788: eb43 0303 adc.w r3, r3, r3
  546. 802078c: f413 1f80 tst.w r3, #1048576 ; 0x100000
  547. 8020790: bf08 it eq
  548. 8020792: 3d01 subeq r5, #1
  549. 8020794: d0f7 beq.n 8020786 <__aeabi_dmul+0x1c6>
  550. 8020796: ea43 0306 orr.w r3, r3, r6
  551. 802079a: 4770 bx lr
  552. 802079c: ea94 0f0c teq r4, ip
  553. 80207a0: ea0c 5513 and.w r5, ip, r3, lsr #20
  554. 80207a4: bf18 it ne
  555. 80207a6: ea95 0f0c teqne r5, ip
  556. 80207aa: d00c beq.n 80207c6 <__aeabi_dmul+0x206>
  557. 80207ac: ea50 0641 orrs.w r6, r0, r1, lsl #1
  558. 80207b0: bf18 it ne
  559. 80207b2: ea52 0643 orrsne.w r6, r2, r3, lsl #1
  560. 80207b6: d1d1 bne.n 802075c <__aeabi_dmul+0x19c>
  561. 80207b8: ea81 0103 eor.w r1, r1, r3
  562. 80207bc: f001 4100 and.w r1, r1, #2147483648 ; 0x80000000
  563. 80207c0: f04f 0000 mov.w r0, #0
  564. 80207c4: bd70 pop {r4, r5, r6, pc}
  565. 80207c6: ea50 0641 orrs.w r6, r0, r1, lsl #1
  566. 80207ca: bf06 itte eq
  567. 80207cc: 4610 moveq r0, r2
  568. 80207ce: 4619 moveq r1, r3
  569. 80207d0: ea52 0643 orrsne.w r6, r2, r3, lsl #1
  570. 80207d4: d019 beq.n 802080a <__aeabi_dmul+0x24a>
  571. 80207d6: ea94 0f0c teq r4, ip
  572. 80207da: d102 bne.n 80207e2 <__aeabi_dmul+0x222>
  573. 80207dc: ea50 3601 orrs.w r6, r0, r1, lsl #12
  574. 80207e0: d113 bne.n 802080a <__aeabi_dmul+0x24a>
  575. 80207e2: ea95 0f0c teq r5, ip
  576. 80207e6: d105 bne.n 80207f4 <__aeabi_dmul+0x234>
  577. 80207e8: ea52 3603 orrs.w r6, r2, r3, lsl #12
  578. 80207ec: bf1c itt ne
  579. 80207ee: 4610 movne r0, r2
  580. 80207f0: 4619 movne r1, r3
  581. 80207f2: d10a bne.n 802080a <__aeabi_dmul+0x24a>
  582. 80207f4: ea81 0103 eor.w r1, r1, r3
  583. 80207f8: f001 4100 and.w r1, r1, #2147483648 ; 0x80000000
  584. 80207fc: f041 41fe orr.w r1, r1, #2130706432 ; 0x7f000000
  585. 8020800: f441 0170 orr.w r1, r1, #15728640 ; 0xf00000
  586. 8020804: f04f 0000 mov.w r0, #0
  587. 8020808: bd70 pop {r4, r5, r6, pc}
  588. 802080a: f041 41fe orr.w r1, r1, #2130706432 ; 0x7f000000
  589. 802080e: f441 0178 orr.w r1, r1, #16252928 ; 0xf80000
  590. 8020812: bd70 pop {r4, r5, r6, pc}
  591. 08020814 <__aeabi_ddiv>:
  592. 8020814: b570 push {r4, r5, r6, lr}
  593. 8020816: f04f 0cff mov.w ip, #255 ; 0xff
  594. 802081a: f44c 6ce0 orr.w ip, ip, #1792 ; 0x700
  595. 802081e: ea1c 5411 ands.w r4, ip, r1, lsr #20
  596. 8020822: bf1d ittte ne
  597. 8020824: ea1c 5513 andsne.w r5, ip, r3, lsr #20
  598. 8020828: ea94 0f0c teqne r4, ip
  599. 802082c: ea95 0f0c teqne r5, ip
  600. 8020830: f000 f8a7 bleq 8020982 <__aeabi_ddiv+0x16e>
  601. 8020834: eba4 0405 sub.w r4, r4, r5
  602. 8020838: ea81 0e03 eor.w lr, r1, r3
  603. 802083c: ea52 3503 orrs.w r5, r2, r3, lsl #12
  604. 8020840: ea4f 3101 mov.w r1, r1, lsl #12
  605. 8020844: f000 8088 beq.w 8020958 <__aeabi_ddiv+0x144>
  606. 8020848: ea4f 3303 mov.w r3, r3, lsl #12
  607. 802084c: f04f 5580 mov.w r5, #268435456 ; 0x10000000
  608. 8020850: ea45 1313 orr.w r3, r5, r3, lsr #4
  609. 8020854: ea43 6312 orr.w r3, r3, r2, lsr #24
  610. 8020858: ea4f 2202 mov.w r2, r2, lsl #8
  611. 802085c: ea45 1511 orr.w r5, r5, r1, lsr #4
  612. 8020860: ea45 6510 orr.w r5, r5, r0, lsr #24
  613. 8020864: ea4f 2600 mov.w r6, r0, lsl #8
  614. 8020868: f00e 4100 and.w r1, lr, #2147483648 ; 0x80000000
  615. 802086c: 429d cmp r5, r3
  616. 802086e: bf08 it eq
  617. 8020870: 4296 cmpeq r6, r2
  618. 8020872: f144 04fd adc.w r4, r4, #253 ; 0xfd
  619. 8020876: f504 7440 add.w r4, r4, #768 ; 0x300
  620. 802087a: d202 bcs.n 8020882 <__aeabi_ddiv+0x6e>
  621. 802087c: 085b lsrs r3, r3, #1
  622. 802087e: ea4f 0232 mov.w r2, r2, rrx
  623. 8020882: 1ab6 subs r6, r6, r2
  624. 8020884: eb65 0503 sbc.w r5, r5, r3
  625. 8020888: 085b lsrs r3, r3, #1
  626. 802088a: ea4f 0232 mov.w r2, r2, rrx
  627. 802088e: f44f 1080 mov.w r0, #1048576 ; 0x100000
  628. 8020892: f44f 2c00 mov.w ip, #524288 ; 0x80000
  629. 8020896: ebb6 0e02 subs.w lr, r6, r2
  630. 802089a: eb75 0e03 sbcs.w lr, r5, r3
  631. 802089e: bf22 ittt cs
  632. 80208a0: 1ab6 subcs r6, r6, r2
  633. 80208a2: 4675 movcs r5, lr
  634. 80208a4: ea40 000c orrcs.w r0, r0, ip
  635. 80208a8: 085b lsrs r3, r3, #1
  636. 80208aa: ea4f 0232 mov.w r2, r2, rrx
  637. 80208ae: ebb6 0e02 subs.w lr, r6, r2
  638. 80208b2: eb75 0e03 sbcs.w lr, r5, r3
  639. 80208b6: bf22 ittt cs
  640. 80208b8: 1ab6 subcs r6, r6, r2
  641. 80208ba: 4675 movcs r5, lr
  642. 80208bc: ea40 005c orrcs.w r0, r0, ip, lsr #1
  643. 80208c0: 085b lsrs r3, r3, #1
  644. 80208c2: ea4f 0232 mov.w r2, r2, rrx
  645. 80208c6: ebb6 0e02 subs.w lr, r6, r2
  646. 80208ca: eb75 0e03 sbcs.w lr, r5, r3
  647. 80208ce: bf22 ittt cs
  648. 80208d0: 1ab6 subcs r6, r6, r2
  649. 80208d2: 4675 movcs r5, lr
  650. 80208d4: ea40 009c orrcs.w r0, r0, ip, lsr #2
  651. 80208d8: 085b lsrs r3, r3, #1
  652. 80208da: ea4f 0232 mov.w r2, r2, rrx
  653. 80208de: ebb6 0e02 subs.w lr, r6, r2
  654. 80208e2: eb75 0e03 sbcs.w lr, r5, r3
  655. 80208e6: bf22 ittt cs
  656. 80208e8: 1ab6 subcs r6, r6, r2
  657. 80208ea: 4675 movcs r5, lr
  658. 80208ec: ea40 00dc orrcs.w r0, r0, ip, lsr #3
  659. 80208f0: ea55 0e06 orrs.w lr, r5, r6
  660. 80208f4: d018 beq.n 8020928 <__aeabi_ddiv+0x114>
  661. 80208f6: ea4f 1505 mov.w r5, r5, lsl #4
  662. 80208fa: ea45 7516 orr.w r5, r5, r6, lsr #28
  663. 80208fe: ea4f 1606 mov.w r6, r6, lsl #4
  664. 8020902: ea4f 03c3 mov.w r3, r3, lsl #3
  665. 8020906: ea43 7352 orr.w r3, r3, r2, lsr #29
  666. 802090a: ea4f 02c2 mov.w r2, r2, lsl #3
  667. 802090e: ea5f 1c1c movs.w ip, ip, lsr #4
  668. 8020912: d1c0 bne.n 8020896 <__aeabi_ddiv+0x82>
  669. 8020914: f411 1f80 tst.w r1, #1048576 ; 0x100000
  670. 8020918: d10b bne.n 8020932 <__aeabi_ddiv+0x11e>
  671. 802091a: ea41 0100 orr.w r1, r1, r0
  672. 802091e: f04f 0000 mov.w r0, #0
  673. 8020922: f04f 4c00 mov.w ip, #2147483648 ; 0x80000000
  674. 8020926: e7b6 b.n 8020896 <__aeabi_ddiv+0x82>
  675. 8020928: f411 1f80 tst.w r1, #1048576 ; 0x100000
  676. 802092c: bf04 itt eq
  677. 802092e: 4301 orreq r1, r0
  678. 8020930: 2000 moveq r0, #0
  679. 8020932: f1b4 0cfd subs.w ip, r4, #253 ; 0xfd
  680. 8020936: bf88 it hi
  681. 8020938: f5bc 6fe0 cmphi.w ip, #1792 ; 0x700
  682. 802093c: f63f aeaf bhi.w 802069e <__aeabi_dmul+0xde>
  683. 8020940: ebb5 0c03 subs.w ip, r5, r3
  684. 8020944: bf04 itt eq
  685. 8020946: ebb6 0c02 subseq.w ip, r6, r2
  686. 802094a: ea5f 0c50 movseq.w ip, r0, lsr #1
  687. 802094e: f150 0000 adcs.w r0, r0, #0
  688. 8020952: eb41 5104 adc.w r1, r1, r4, lsl #20
  689. 8020956: bd70 pop {r4, r5, r6, pc}
  690. 8020958: f00e 4e00 and.w lr, lr, #2147483648 ; 0x80000000
  691. 802095c: ea4e 3111 orr.w r1, lr, r1, lsr #12
  692. 8020960: eb14 045c adds.w r4, r4, ip, lsr #1
  693. 8020964: bfc2 ittt gt
  694. 8020966: ebd4 050c rsbsgt r5, r4, ip
  695. 802096a: ea41 5104 orrgt.w r1, r1, r4, lsl #20
  696. 802096e: bd70 popgt {r4, r5, r6, pc}
  697. 8020970: f441 1180 orr.w r1, r1, #1048576 ; 0x100000
  698. 8020974: f04f 0e00 mov.w lr, #0
  699. 8020978: 3c01 subs r4, #1
  700. 802097a: e690 b.n 802069e <__aeabi_dmul+0xde>
  701. 802097c: ea45 0e06 orr.w lr, r5, r6
  702. 8020980: e68d b.n 802069e <__aeabi_dmul+0xde>
  703. 8020982: ea0c 5513 and.w r5, ip, r3, lsr #20
  704. 8020986: ea94 0f0c teq r4, ip
  705. 802098a: bf08 it eq
  706. 802098c: ea95 0f0c teqeq r5, ip
  707. 8020990: f43f af3b beq.w 802080a <__aeabi_dmul+0x24a>
  708. 8020994: ea94 0f0c teq r4, ip
  709. 8020998: d10a bne.n 80209b0 <__aeabi_ddiv+0x19c>
  710. 802099a: ea50 3401 orrs.w r4, r0, r1, lsl #12
  711. 802099e: f47f af34 bne.w 802080a <__aeabi_dmul+0x24a>
  712. 80209a2: ea95 0f0c teq r5, ip
  713. 80209a6: f47f af25 bne.w 80207f4 <__aeabi_dmul+0x234>
  714. 80209aa: 4610 mov r0, r2
  715. 80209ac: 4619 mov r1, r3
  716. 80209ae: e72c b.n 802080a <__aeabi_dmul+0x24a>
  717. 80209b0: ea95 0f0c teq r5, ip
  718. 80209b4: d106 bne.n 80209c4 <__aeabi_ddiv+0x1b0>
  719. 80209b6: ea52 3503 orrs.w r5, r2, r3, lsl #12
  720. 80209ba: f43f aefd beq.w 80207b8 <__aeabi_dmul+0x1f8>
  721. 80209be: 4610 mov r0, r2
  722. 80209c0: 4619 mov r1, r3
  723. 80209c2: e722 b.n 802080a <__aeabi_dmul+0x24a>
  724. 80209c4: ea50 0641 orrs.w r6, r0, r1, lsl #1
  725. 80209c8: bf18 it ne
  726. 80209ca: ea52 0643 orrsne.w r6, r2, r3, lsl #1
  727. 80209ce: f47f aec5 bne.w 802075c <__aeabi_dmul+0x19c>
  728. 80209d2: ea50 0441 orrs.w r4, r0, r1, lsl #1
  729. 80209d6: f47f af0d bne.w 80207f4 <__aeabi_dmul+0x234>
  730. 80209da: ea52 0543 orrs.w r5, r2, r3, lsl #1
  731. 80209de: f47f aeeb bne.w 80207b8 <__aeabi_dmul+0x1f8>
  732. 80209e2: e712 b.n 802080a <__aeabi_dmul+0x24a>
  733. 080209e4 <__gedf2>:
  734. 80209e4: f04f 3cff mov.w ip, #4294967295
  735. 80209e8: e006 b.n 80209f8 <__cmpdf2+0x4>
  736. 80209ea: bf00 nop
  737. 080209ec <__ledf2>:
  738. 80209ec: f04f 0c01 mov.w ip, #1
  739. 80209f0: e002 b.n 80209f8 <__cmpdf2+0x4>
  740. 80209f2: bf00 nop
  741. 080209f4 <__cmpdf2>:
  742. 80209f4: f04f 0c01 mov.w ip, #1
  743. 80209f8: f84d cd04 str.w ip, [sp, #-4]!
  744. 80209fc: ea4f 0c41 mov.w ip, r1, lsl #1
  745. 8020a00: ea7f 5c6c mvns.w ip, ip, asr #21
  746. 8020a04: ea4f 0c43 mov.w ip, r3, lsl #1
  747. 8020a08: bf18 it ne
  748. 8020a0a: ea7f 5c6c mvnsne.w ip, ip, asr #21
  749. 8020a0e: d01b beq.n 8020a48 <__cmpdf2+0x54>
  750. 8020a10: b001 add sp, #4
  751. 8020a12: ea50 0c41 orrs.w ip, r0, r1, lsl #1
  752. 8020a16: bf0c ite eq
  753. 8020a18: ea52 0c43 orrseq.w ip, r2, r3, lsl #1
  754. 8020a1c: ea91 0f03 teqne r1, r3
  755. 8020a20: bf02 ittt eq
  756. 8020a22: ea90 0f02 teqeq r0, r2
  757. 8020a26: 2000 moveq r0, #0
  758. 8020a28: 4770 bxeq lr
  759. 8020a2a: f110 0f00 cmn.w r0, #0
  760. 8020a2e: ea91 0f03 teq r1, r3
  761. 8020a32: bf58 it pl
  762. 8020a34: 4299 cmppl r1, r3
  763. 8020a36: bf08 it eq
  764. 8020a38: 4290 cmpeq r0, r2
  765. 8020a3a: bf2c ite cs
  766. 8020a3c: 17d8 asrcs r0, r3, #31
  767. 8020a3e: ea6f 70e3 mvncc.w r0, r3, asr #31
  768. 8020a42: f040 0001 orr.w r0, r0, #1
  769. 8020a46: 4770 bx lr
  770. 8020a48: ea4f 0c41 mov.w ip, r1, lsl #1
  771. 8020a4c: ea7f 5c6c mvns.w ip, ip, asr #21
  772. 8020a50: d102 bne.n 8020a58 <__cmpdf2+0x64>
  773. 8020a52: ea50 3c01 orrs.w ip, r0, r1, lsl #12
  774. 8020a56: d107 bne.n 8020a68 <__cmpdf2+0x74>
  775. 8020a58: ea4f 0c43 mov.w ip, r3, lsl #1
  776. 8020a5c: ea7f 5c6c mvns.w ip, ip, asr #21
  777. 8020a60: d1d6 bne.n 8020a10 <__cmpdf2+0x1c>
  778. 8020a62: ea52 3c03 orrs.w ip, r2, r3, lsl #12
  779. 8020a66: d0d3 beq.n 8020a10 <__cmpdf2+0x1c>
  780. 8020a68: f85d 0b04 ldr.w r0, [sp], #4
  781. 8020a6c: 4770 bx lr
  782. 8020a6e: bf00 nop
  783. 08020a70 <__aeabi_cdrcmple>:
  784. 8020a70: 4684 mov ip, r0
  785. 8020a72: 4610 mov r0, r2
  786. 8020a74: 4662 mov r2, ip
  787. 8020a76: 468c mov ip, r1
  788. 8020a78: 4619 mov r1, r3
  789. 8020a7a: 4663 mov r3, ip
  790. 8020a7c: e000 b.n 8020a80 <__aeabi_cdcmpeq>
  791. 8020a7e: bf00 nop
  792. 08020a80 <__aeabi_cdcmpeq>:
  793. 8020a80: b501 push {r0, lr}
  794. 8020a82: f7ff ffb7 bl 80209f4 <__cmpdf2>
  795. 8020a86: 2800 cmp r0, #0
  796. 8020a88: bf48 it mi
  797. 8020a8a: f110 0f00 cmnmi.w r0, #0
  798. 8020a8e: bd01 pop {r0, pc}
  799. 08020a90 <__aeabi_dcmpeq>:
  800. 8020a90: f84d ed08 str.w lr, [sp, #-8]!
  801. 8020a94: f7ff fff4 bl 8020a80 <__aeabi_cdcmpeq>
  802. 8020a98: bf0c ite eq
  803. 8020a9a: 2001 moveq r0, #1
  804. 8020a9c: 2000 movne r0, #0
  805. 8020a9e: f85d fb08 ldr.w pc, [sp], #8
  806. 8020aa2: bf00 nop
  807. 08020aa4 <__aeabi_dcmplt>:
  808. 8020aa4: f84d ed08 str.w lr, [sp, #-8]!
  809. 8020aa8: f7ff ffea bl 8020a80 <__aeabi_cdcmpeq>
  810. 8020aac: bf34 ite cc
  811. 8020aae: 2001 movcc r0, #1
  812. 8020ab0: 2000 movcs r0, #0
  813. 8020ab2: f85d fb08 ldr.w pc, [sp], #8
  814. 8020ab6: bf00 nop
  815. 08020ab8 <__aeabi_dcmple>:
  816. 8020ab8: f84d ed08 str.w lr, [sp, #-8]!
  817. 8020abc: f7ff ffe0 bl 8020a80 <__aeabi_cdcmpeq>
  818. 8020ac0: bf94 ite ls
  819. 8020ac2: 2001 movls r0, #1
  820. 8020ac4: 2000 movhi r0, #0
  821. 8020ac6: f85d fb08 ldr.w pc, [sp], #8
  822. 8020aca: bf00 nop
  823. 08020acc <__aeabi_dcmpge>:
  824. 8020acc: f84d ed08 str.w lr, [sp, #-8]!
  825. 8020ad0: f7ff ffce bl 8020a70 <__aeabi_cdrcmple>
  826. 8020ad4: bf94 ite ls
  827. 8020ad6: 2001 movls r0, #1
  828. 8020ad8: 2000 movhi r0, #0
  829. 8020ada: f85d fb08 ldr.w pc, [sp], #8
  830. 8020ade: bf00 nop
  831. 08020ae0 <__aeabi_dcmpgt>:
  832. 8020ae0: f84d ed08 str.w lr, [sp, #-8]!
  833. 8020ae4: f7ff ffc4 bl 8020a70 <__aeabi_cdrcmple>
  834. 8020ae8: bf34 ite cc
  835. 8020aea: 2001 movcc r0, #1
  836. 8020aec: 2000 movcs r0, #0
  837. 8020aee: f85d fb08 ldr.w pc, [sp], #8
  838. 8020af2: bf00 nop
  839. 08020af4 <__aeabi_d2iz>:
  840. 8020af4: ea4f 0241 mov.w r2, r1, lsl #1
  841. 8020af8: f512 1200 adds.w r2, r2, #2097152 ; 0x200000
  842. 8020afc: d215 bcs.n 8020b2a <__aeabi_d2iz+0x36>
  843. 8020afe: d511 bpl.n 8020b24 <__aeabi_d2iz+0x30>
  844. 8020b00: f46f 7378 mvn.w r3, #992 ; 0x3e0
  845. 8020b04: ebb3 5262 subs.w r2, r3, r2, asr #21
  846. 8020b08: d912 bls.n 8020b30 <__aeabi_d2iz+0x3c>
  847. 8020b0a: ea4f 23c1 mov.w r3, r1, lsl #11
  848. 8020b0e: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000
  849. 8020b12: ea43 5350 orr.w r3, r3, r0, lsr #21
  850. 8020b16: f011 4f00 tst.w r1, #2147483648 ; 0x80000000
  851. 8020b1a: fa23 f002 lsr.w r0, r3, r2
  852. 8020b1e: bf18 it ne
  853. 8020b20: 4240 negne r0, r0
  854. 8020b22: 4770 bx lr
  855. 8020b24: f04f 0000 mov.w r0, #0
  856. 8020b28: 4770 bx lr
  857. 8020b2a: ea50 3001 orrs.w r0, r0, r1, lsl #12
  858. 8020b2e: d105 bne.n 8020b3c <__aeabi_d2iz+0x48>
  859. 8020b30: f011 4000 ands.w r0, r1, #2147483648 ; 0x80000000
  860. 8020b34: bf08 it eq
  861. 8020b36: f06f 4000 mvneq.w r0, #2147483648 ; 0x80000000
  862. 8020b3a: 4770 bx lr
  863. 8020b3c: f04f 0000 mov.w r0, #0
  864. 8020b40: 4770 bx lr
  865. 8020b42: bf00 nop
  866. 08020b44 <__aeabi_d2f>:
  867. 8020b44: ea4f 0241 mov.w r2, r1, lsl #1
  868. 8020b48: f1b2 43e0 subs.w r3, r2, #1879048192 ; 0x70000000
  869. 8020b4c: bf24 itt cs
  870. 8020b4e: f5b3 1c00 subscs.w ip, r3, #2097152 ; 0x200000
  871. 8020b52: f1dc 5cfe rsbscs ip, ip, #532676608 ; 0x1fc00000
  872. 8020b56: d90d bls.n 8020b74 <__aeabi_d2f+0x30>
  873. 8020b58: f001 4c00 and.w ip, r1, #2147483648 ; 0x80000000
  874. 8020b5c: ea4f 02c0 mov.w r2, r0, lsl #3
  875. 8020b60: ea4c 7050 orr.w r0, ip, r0, lsr #29
  876. 8020b64: f1b2 4f00 cmp.w r2, #2147483648 ; 0x80000000
  877. 8020b68: eb40 0083 adc.w r0, r0, r3, lsl #2
  878. 8020b6c: bf08 it eq
  879. 8020b6e: f020 0001 biceq.w r0, r0, #1
  880. 8020b72: 4770 bx lr
  881. 8020b74: f011 4f80 tst.w r1, #1073741824 ; 0x40000000
  882. 8020b78: d121 bne.n 8020bbe <__aeabi_d2f+0x7a>
  883. 8020b7a: f113 7238 adds.w r2, r3, #48234496 ; 0x2e00000
  884. 8020b7e: bfbc itt lt
  885. 8020b80: f001 4000 andlt.w r0, r1, #2147483648 ; 0x80000000
  886. 8020b84: 4770 bxlt lr
  887. 8020b86: f441 1180 orr.w r1, r1, #1048576 ; 0x100000
  888. 8020b8a: ea4f 5252 mov.w r2, r2, lsr #21
  889. 8020b8e: f1c2 0218 rsb r2, r2, #24
  890. 8020b92: f1c2 0c20 rsb ip, r2, #32
  891. 8020b96: fa10 f30c lsls.w r3, r0, ip
  892. 8020b9a: fa20 f002 lsr.w r0, r0, r2
  893. 8020b9e: bf18 it ne
  894. 8020ba0: f040 0001 orrne.w r0, r0, #1
  895. 8020ba4: ea4f 23c1 mov.w r3, r1, lsl #11
  896. 8020ba8: ea4f 23d3 mov.w r3, r3, lsr #11
  897. 8020bac: fa03 fc0c lsl.w ip, r3, ip
  898. 8020bb0: ea40 000c orr.w r0, r0, ip
  899. 8020bb4: fa23 f302 lsr.w r3, r3, r2
  900. 8020bb8: ea4f 0343 mov.w r3, r3, lsl #1
  901. 8020bbc: e7cc b.n 8020b58 <__aeabi_d2f+0x14>
  902. 8020bbe: ea7f 5362 mvns.w r3, r2, asr #21
  903. 8020bc2: d107 bne.n 8020bd4 <__aeabi_d2f+0x90>
  904. 8020bc4: ea50 3301 orrs.w r3, r0, r1, lsl #12
  905. 8020bc8: bf1e ittt ne
  906. 8020bca: f04f 40fe movne.w r0, #2130706432 ; 0x7f000000
  907. 8020bce: f440 0040 orrne.w r0, r0, #12582912 ; 0xc00000
  908. 8020bd2: 4770 bxne lr
  909. 8020bd4: f001 4000 and.w r0, r1, #2147483648 ; 0x80000000
  910. 8020bd8: f040 40fe orr.w r0, r0, #2130706432 ; 0x7f000000
  911. 8020bdc: f440 0000 orr.w r0, r0, #8388608 ; 0x800000
  912. 8020be0: 4770 bx lr
  913. 8020be2: bf00 nop
  914. 08020be4 <__aeabi_frsub>:
  915. 8020be4: f080 4000 eor.w r0, r0, #2147483648 ; 0x80000000
  916. 8020be8: e002 b.n 8020bf0 <__addsf3>
  917. 8020bea: bf00 nop
  918. 08020bec <__aeabi_fsub>:
  919. 8020bec: f081 4100 eor.w r1, r1, #2147483648 ; 0x80000000
  920. 08020bf0 <__addsf3>:
  921. 8020bf0: 0042 lsls r2, r0, #1
  922. 8020bf2: bf1f itttt ne
  923. 8020bf4: ea5f 0341 movsne.w r3, r1, lsl #1
  924. 8020bf8: ea92 0f03 teqne r2, r3
  925. 8020bfc: ea7f 6c22 mvnsne.w ip, r2, asr #24
  926. 8020c00: ea7f 6c23 mvnsne.w ip, r3, asr #24
  927. 8020c04: d06a beq.n 8020cdc <__addsf3+0xec>
  928. 8020c06: ea4f 6212 mov.w r2, r2, lsr #24
  929. 8020c0a: ebd2 6313 rsbs r3, r2, r3, lsr #24
  930. 8020c0e: bfc1 itttt gt
  931. 8020c10: 18d2 addgt r2, r2, r3
  932. 8020c12: 4041 eorgt r1, r0
  933. 8020c14: 4048 eorgt r0, r1
  934. 8020c16: 4041 eorgt r1, r0
  935. 8020c18: bfb8 it lt
  936. 8020c1a: 425b neglt r3, r3
  937. 8020c1c: 2b19 cmp r3, #25
  938. 8020c1e: bf88 it hi
  939. 8020c20: 4770 bxhi lr
  940. 8020c22: f010 4f00 tst.w r0, #2147483648 ; 0x80000000
  941. 8020c26: f440 0000 orr.w r0, r0, #8388608 ; 0x800000
  942. 8020c2a: f020 407f bic.w r0, r0, #4278190080 ; 0xff000000
  943. 8020c2e: bf18 it ne
  944. 8020c30: 4240 negne r0, r0
  945. 8020c32: f011 4f00 tst.w r1, #2147483648 ; 0x80000000
  946. 8020c36: f441 0100 orr.w r1, r1, #8388608 ; 0x800000
  947. 8020c3a: f021 417f bic.w r1, r1, #4278190080 ; 0xff000000
  948. 8020c3e: bf18 it ne
  949. 8020c40: 4249 negne r1, r1
  950. 8020c42: ea92 0f03 teq r2, r3
  951. 8020c46: d03f beq.n 8020cc8 <__addsf3+0xd8>
  952. 8020c48: f1a2 0201 sub.w r2, r2, #1
  953. 8020c4c: fa41 fc03 asr.w ip, r1, r3
  954. 8020c50: eb10 000c adds.w r0, r0, ip
  955. 8020c54: f1c3 0320 rsb r3, r3, #32
  956. 8020c58: fa01 f103 lsl.w r1, r1, r3
  957. 8020c5c: f000 4300 and.w r3, r0, #2147483648 ; 0x80000000
  958. 8020c60: d502 bpl.n 8020c68 <__addsf3+0x78>
  959. 8020c62: 4249 negs r1, r1
  960. 8020c64: eb60 0040 sbc.w r0, r0, r0, lsl #1
  961. 8020c68: f5b0 0f00 cmp.w r0, #8388608 ; 0x800000
  962. 8020c6c: d313 bcc.n 8020c96 <__addsf3+0xa6>
  963. 8020c6e: f1b0 7f80 cmp.w r0, #16777216 ; 0x1000000
  964. 8020c72: d306 bcc.n 8020c82 <__addsf3+0x92>
  965. 8020c74: 0840 lsrs r0, r0, #1
  966. 8020c76: ea4f 0131 mov.w r1, r1, rrx
  967. 8020c7a: f102 0201 add.w r2, r2, #1
  968. 8020c7e: 2afe cmp r2, #254 ; 0xfe
  969. 8020c80: d251 bcs.n 8020d26 <__addsf3+0x136>
  970. 8020c82: f1b1 4f00 cmp.w r1, #2147483648 ; 0x80000000
  971. 8020c86: eb40 50c2 adc.w r0, r0, r2, lsl #23
  972. 8020c8a: bf08 it eq
  973. 8020c8c: f020 0001 biceq.w r0, r0, #1
  974. 8020c90: ea40 0003 orr.w r0, r0, r3
  975. 8020c94: 4770 bx lr
  976. 8020c96: 0049 lsls r1, r1, #1
  977. 8020c98: eb40 0000 adc.w r0, r0, r0
  978. 8020c9c: f410 0f00 tst.w r0, #8388608 ; 0x800000
  979. 8020ca0: f1a2 0201 sub.w r2, r2, #1
  980. 8020ca4: d1ed bne.n 8020c82 <__addsf3+0x92>
  981. 8020ca6: fab0 fc80 clz ip, r0
  982. 8020caa: f1ac 0c08 sub.w ip, ip, #8
  983. 8020cae: ebb2 020c subs.w r2, r2, ip
  984. 8020cb2: fa00 f00c lsl.w r0, r0, ip
  985. 8020cb6: bfaa itet ge
  986. 8020cb8: eb00 50c2 addge.w r0, r0, r2, lsl #23
  987. 8020cbc: 4252 neglt r2, r2
  988. 8020cbe: 4318 orrge r0, r3
  989. 8020cc0: bfbc itt lt
  990. 8020cc2: 40d0 lsrlt r0, r2
  991. 8020cc4: 4318 orrlt r0, r3
  992. 8020cc6: 4770 bx lr
  993. 8020cc8: f092 0f00 teq r2, #0
  994. 8020ccc: f481 0100 eor.w r1, r1, #8388608 ; 0x800000
  995. 8020cd0: bf06 itte eq
  996. 8020cd2: f480 0000 eoreq.w r0, r0, #8388608 ; 0x800000
  997. 8020cd6: 3201 addeq r2, #1
  998. 8020cd8: 3b01 subne r3, #1
  999. 8020cda: e7b5 b.n 8020c48 <__addsf3+0x58>
  1000. 8020cdc: ea4f 0341 mov.w r3, r1, lsl #1
  1001. 8020ce0: ea7f 6c22 mvns.w ip, r2, asr #24
  1002. 8020ce4: bf18 it ne
  1003. 8020ce6: ea7f 6c23 mvnsne.w ip, r3, asr #24
  1004. 8020cea: d021 beq.n 8020d30 <__addsf3+0x140>
  1005. 8020cec: ea92 0f03 teq r2, r3
  1006. 8020cf0: d004 beq.n 8020cfc <__addsf3+0x10c>
  1007. 8020cf2: f092 0f00 teq r2, #0
  1008. 8020cf6: bf08 it eq
  1009. 8020cf8: 4608 moveq r0, r1
  1010. 8020cfa: 4770 bx lr
  1011. 8020cfc: ea90 0f01 teq r0, r1
  1012. 8020d00: bf1c itt ne
  1013. 8020d02: 2000 movne r0, #0
  1014. 8020d04: 4770 bxne lr
  1015. 8020d06: f012 4f7f tst.w r2, #4278190080 ; 0xff000000
  1016. 8020d0a: d104 bne.n 8020d16 <__addsf3+0x126>
  1017. 8020d0c: 0040 lsls r0, r0, #1
  1018. 8020d0e: bf28 it cs
  1019. 8020d10: f040 4000 orrcs.w r0, r0, #2147483648 ; 0x80000000
  1020. 8020d14: 4770 bx lr
  1021. 8020d16: f112 7200 adds.w r2, r2, #33554432 ; 0x2000000
  1022. 8020d1a: bf3c itt cc
  1023. 8020d1c: f500 0000 addcc.w r0, r0, #8388608 ; 0x800000
  1024. 8020d20: 4770 bxcc lr
  1025. 8020d22: f000 4300 and.w r3, r0, #2147483648 ; 0x80000000
  1026. 8020d26: f043 40fe orr.w r0, r3, #2130706432 ; 0x7f000000
  1027. 8020d2a: f440 0000 orr.w r0, r0, #8388608 ; 0x800000
  1028. 8020d2e: 4770 bx lr
  1029. 8020d30: ea7f 6222 mvns.w r2, r2, asr #24
  1030. 8020d34: bf16 itet ne
  1031. 8020d36: 4608 movne r0, r1
  1032. 8020d38: ea7f 6323 mvnseq.w r3, r3, asr #24
  1033. 8020d3c: 4601 movne r1, r0
  1034. 8020d3e: 0242 lsls r2, r0, #9
  1035. 8020d40: bf06 itte eq
  1036. 8020d42: ea5f 2341 movseq.w r3, r1, lsl #9
  1037. 8020d46: ea90 0f01 teqeq r0, r1
  1038. 8020d4a: f440 0080 orrne.w r0, r0, #4194304 ; 0x400000
  1039. 8020d4e: 4770 bx lr
  1040. 08020d50 <__aeabi_ui2f>:
  1041. 8020d50: f04f 0300 mov.w r3, #0
  1042. 8020d54: e004 b.n 8020d60 <__aeabi_i2f+0x8>
  1043. 8020d56: bf00 nop
  1044. 08020d58 <__aeabi_i2f>:
  1045. 8020d58: f010 4300 ands.w r3, r0, #2147483648 ; 0x80000000
  1046. 8020d5c: bf48 it mi
  1047. 8020d5e: 4240 negmi r0, r0
  1048. 8020d60: ea5f 0c00 movs.w ip, r0
  1049. 8020d64: bf08 it eq
  1050. 8020d66: 4770 bxeq lr
  1051. 8020d68: f043 4396 orr.w r3, r3, #1258291200 ; 0x4b000000
  1052. 8020d6c: 4601 mov r1, r0
  1053. 8020d6e: f04f 0000 mov.w r0, #0
  1054. 8020d72: e01c b.n 8020dae <__aeabi_l2f+0x2a>
  1055. 08020d74 <__aeabi_ul2f>:
  1056. 8020d74: ea50 0201 orrs.w r2, r0, r1
  1057. 8020d78: bf08 it eq
  1058. 8020d7a: 4770 bxeq lr
  1059. 8020d7c: f04f 0300 mov.w r3, #0
  1060. 8020d80: e00a b.n 8020d98 <__aeabi_l2f+0x14>
  1061. 8020d82: bf00 nop
  1062. 08020d84 <__aeabi_l2f>:
  1063. 8020d84: ea50 0201 orrs.w r2, r0, r1
  1064. 8020d88: bf08 it eq
  1065. 8020d8a: 4770 bxeq lr
  1066. 8020d8c: f011 4300 ands.w r3, r1, #2147483648 ; 0x80000000
  1067. 8020d90: d502 bpl.n 8020d98 <__aeabi_l2f+0x14>
  1068. 8020d92: 4240 negs r0, r0
  1069. 8020d94: eb61 0141 sbc.w r1, r1, r1, lsl #1
  1070. 8020d98: ea5f 0c01 movs.w ip, r1
  1071. 8020d9c: bf02 ittt eq
  1072. 8020d9e: 4684 moveq ip, r0
  1073. 8020da0: 4601 moveq r1, r0
  1074. 8020da2: 2000 moveq r0, #0
  1075. 8020da4: f043 43b6 orr.w r3, r3, #1526726656 ; 0x5b000000
  1076. 8020da8: bf08 it eq
  1077. 8020daa: f1a3 5380 subeq.w r3, r3, #268435456 ; 0x10000000
  1078. 8020dae: f5a3 0300 sub.w r3, r3, #8388608 ; 0x800000
  1079. 8020db2: fabc f28c clz r2, ip
  1080. 8020db6: 3a08 subs r2, #8
  1081. 8020db8: eba3 53c2 sub.w r3, r3, r2, lsl #23
  1082. 8020dbc: db10 blt.n 8020de0 <__aeabi_l2f+0x5c>
  1083. 8020dbe: fa01 fc02 lsl.w ip, r1, r2
  1084. 8020dc2: 4463 add r3, ip
  1085. 8020dc4: fa00 fc02 lsl.w ip, r0, r2
  1086. 8020dc8: f1c2 0220 rsb r2, r2, #32
  1087. 8020dcc: f1bc 4f00 cmp.w ip, #2147483648 ; 0x80000000
  1088. 8020dd0: fa20 f202 lsr.w r2, r0, r2
  1089. 8020dd4: eb43 0002 adc.w r0, r3, r2
  1090. 8020dd8: bf08 it eq
  1091. 8020dda: f020 0001 biceq.w r0, r0, #1
  1092. 8020dde: 4770 bx lr
  1093. 8020de0: f102 0220 add.w r2, r2, #32
  1094. 8020de4: fa01 fc02 lsl.w ip, r1, r2
  1095. 8020de8: f1c2 0220 rsb r2, r2, #32
  1096. 8020dec: ea50 004c orrs.w r0, r0, ip, lsl #1
  1097. 8020df0: fa21 f202 lsr.w r2, r1, r2
  1098. 8020df4: eb43 0002 adc.w r0, r3, r2
  1099. 8020df8: bf08 it eq
  1100. 8020dfa: ea20 70dc biceq.w r0, r0, ip, lsr #31
  1101. 8020dfe: 4770 bx lr
  1102. 08020e00 <__gesf2>:
  1103. 8020e00: f04f 3cff mov.w ip, #4294967295
  1104. 8020e04: e006 b.n 8020e14 <__cmpsf2+0x4>
  1105. 8020e06: bf00 nop
  1106. 08020e08 <__lesf2>:
  1107. 8020e08: f04f 0c01 mov.w ip, #1
  1108. 8020e0c: e002 b.n 8020e14 <__cmpsf2+0x4>
  1109. 8020e0e: bf00 nop
  1110. 08020e10 <__cmpsf2>:
  1111. 8020e10: f04f 0c01 mov.w ip, #1
  1112. 8020e14: f84d cd04 str.w ip, [sp, #-4]!
  1113. 8020e18: ea4f 0240 mov.w r2, r0, lsl #1
  1114. 8020e1c: ea4f 0341 mov.w r3, r1, lsl #1
  1115. 8020e20: ea7f 6c22 mvns.w ip, r2, asr #24
  1116. 8020e24: bf18 it ne
  1117. 8020e26: ea7f 6c23 mvnsne.w ip, r3, asr #24
  1118. 8020e2a: d011 beq.n 8020e50 <__cmpsf2+0x40>
  1119. 8020e2c: b001 add sp, #4
  1120. 8020e2e: ea52 0c53 orrs.w ip, r2, r3, lsr #1
  1121. 8020e32: bf18 it ne
  1122. 8020e34: ea90 0f01 teqne r0, r1
  1123. 8020e38: bf58 it pl
  1124. 8020e3a: ebb2 0003 subspl.w r0, r2, r3
  1125. 8020e3e: bf88 it hi
  1126. 8020e40: 17c8 asrhi r0, r1, #31
  1127. 8020e42: bf38 it cc
  1128. 8020e44: ea6f 70e1 mvncc.w r0, r1, asr #31
  1129. 8020e48: bf18 it ne
  1130. 8020e4a: f040 0001 orrne.w r0, r0, #1
  1131. 8020e4e: 4770 bx lr
  1132. 8020e50: ea7f 6c22 mvns.w ip, r2, asr #24
  1133. 8020e54: d102 bne.n 8020e5c <__cmpsf2+0x4c>
  1134. 8020e56: ea5f 2c40 movs.w ip, r0, lsl #9
  1135. 8020e5a: d105 bne.n 8020e68 <__cmpsf2+0x58>
  1136. 8020e5c: ea7f 6c23 mvns.w ip, r3, asr #24
  1137. 8020e60: d1e4 bne.n 8020e2c <__cmpsf2+0x1c>
  1138. 8020e62: ea5f 2c41 movs.w ip, r1, lsl #9
  1139. 8020e66: d0e1 beq.n 8020e2c <__cmpsf2+0x1c>
  1140. 8020e68: f85d 0b04 ldr.w r0, [sp], #4
  1141. 8020e6c: 4770 bx lr
  1142. 8020e6e: bf00 nop
  1143. 08020e70 <__aeabi_cfrcmple>:
  1144. 8020e70: 4684 mov ip, r0
  1145. 8020e72: 4608 mov r0, r1
  1146. 8020e74: 4661 mov r1, ip
  1147. 8020e76: e7ff b.n 8020e78 <__aeabi_cfcmpeq>
  1148. 08020e78 <__aeabi_cfcmpeq>:
  1149. 8020e78: b50f push {r0, r1, r2, r3, lr}
  1150. 8020e7a: f7ff ffc9 bl 8020e10 <__cmpsf2>
  1151. 8020e7e: 2800 cmp r0, #0
  1152. 8020e80: bf48 it mi
  1153. 8020e82: f110 0f00 cmnmi.w r0, #0
  1154. 8020e86: bd0f pop {r0, r1, r2, r3, pc}
  1155. 08020e88 <__aeabi_fcmpeq>:
  1156. 8020e88: f84d ed08 str.w lr, [sp, #-8]!
  1157. 8020e8c: f7ff fff4 bl 8020e78 <__aeabi_cfcmpeq>
  1158. 8020e90: bf0c ite eq
  1159. 8020e92: 2001 moveq r0, #1
  1160. 8020e94: 2000 movne r0, #0
  1161. 8020e96: f85d fb08 ldr.w pc, [sp], #8
  1162. 8020e9a: bf00 nop
  1163. 08020e9c <__aeabi_fcmplt>:
  1164. 8020e9c: f84d ed08 str.w lr, [sp, #-8]!
  1165. 8020ea0: f7ff ffea bl 8020e78 <__aeabi_cfcmpeq>
  1166. 8020ea4: bf34 ite cc
  1167. 8020ea6: 2001 movcc r0, #1
  1168. 8020ea8: 2000 movcs r0, #0
  1169. 8020eaa: f85d fb08 ldr.w pc, [sp], #8
  1170. 8020eae: bf00 nop
  1171. 08020eb0 <__aeabi_fcmple>:
  1172. 8020eb0: f84d ed08 str.w lr, [sp, #-8]!
  1173. 8020eb4: f7ff ffe0 bl 8020e78 <__aeabi_cfcmpeq>
  1174. 8020eb8: bf94 ite ls
  1175. 8020eba: 2001 movls r0, #1
  1176. 8020ebc: 2000 movhi r0, #0
  1177. 8020ebe: f85d fb08 ldr.w pc, [sp], #8
  1178. 8020ec2: bf00 nop
  1179. 08020ec4 <__aeabi_fcmpge>:
  1180. 8020ec4: f84d ed08 str.w lr, [sp, #-8]!
  1181. 8020ec8: f7ff ffd2 bl 8020e70 <__aeabi_cfrcmple>
  1182. 8020ecc: bf94 ite ls
  1183. 8020ece: 2001 movls r0, #1
  1184. 8020ed0: 2000 movhi r0, #0
  1185. 8020ed2: f85d fb08 ldr.w pc, [sp], #8
  1186. 8020ed6: bf00 nop
  1187. 08020ed8 <__aeabi_fcmpgt>:
  1188. 8020ed8: f84d ed08 str.w lr, [sp, #-8]!
  1189. 8020edc: f7ff ffc8 bl 8020e70 <__aeabi_cfrcmple>
  1190. 8020ee0: bf34 ite cc
  1191. 8020ee2: 2001 movcc r0, #1
  1192. 8020ee4: 2000 movcs r0, #0
  1193. 8020ee6: f85d fb08 ldr.w pc, [sp], #8
  1194. 8020eea: bf00 nop
  1195. 08020eec <__aeabi_uldivmod>:
  1196. 8020eec: b94b cbnz r3, 8020f02 <__aeabi_uldivmod+0x16>
  1197. 8020eee: b942 cbnz r2, 8020f02 <__aeabi_uldivmod+0x16>
  1198. 8020ef0: 2900 cmp r1, #0
  1199. 8020ef2: bf08 it eq
  1200. 8020ef4: 2800 cmpeq r0, #0
  1201. 8020ef6: d002 beq.n 8020efe <__aeabi_uldivmod+0x12>
  1202. 8020ef8: f04f 31ff mov.w r1, #4294967295
  1203. 8020efc: 4608 mov r0, r1
  1204. 8020efe: f000 b83b b.w 8020f78 <__aeabi_idiv0>
  1205. 8020f02: b082 sub sp, #8
  1206. 8020f04: 46ec mov ip, sp
  1207. 8020f06: e92d 5000 stmdb sp!, {ip, lr}
  1208. 8020f0a: f000 f81d bl 8020f48 <__gnu_uldivmod_helper>
  1209. 8020f0e: f8dd e004 ldr.w lr, [sp, #4]
  1210. 8020f12: b002 add sp, #8
  1211. 8020f14: bc0c pop {r2, r3}
  1212. 8020f16: 4770 bx lr
  1213. 08020f18 <__gnu_ldivmod_helper>:
  1214. 8020f18: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  1215. 8020f1c: 4690 mov r8, r2
  1216. 8020f1e: 4699 mov r9, r3
  1217. 8020f20: 4606 mov r6, r0
  1218. 8020f22: 460f mov r7, r1
  1219. 8020f24: f000 f82a bl 8020f7c <__divdi3>
  1220. 8020f28: 9b08 ldr r3, [sp, #32]
  1221. 8020f2a: fba8 4500 umull r4, r5, r8, r0
  1222. 8020f2e: fb08 f801 mul.w r8, r8, r1
  1223. 8020f32: fb00 8209 mla r2, r0, r9, r8
  1224. 8020f36: 1955 adds r5, r2, r5
  1225. 8020f38: 1b34 subs r4, r6, r4
  1226. 8020f3a: eb67 0505 sbc.w r5, r7, r5
  1227. 8020f3e: e9c3 4500 strd r4, r5, [r3]
  1228. 8020f42: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  1229. 8020f46: bf00 nop
  1230. 08020f48 <__gnu_uldivmod_helper>:
  1231. 8020f48: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  1232. 8020f4c: 4690 mov r8, r2
  1233. 8020f4e: 4606 mov r6, r0
  1234. 8020f50: 460f mov r7, r1
  1235. 8020f52: 461d mov r5, r3
  1236. 8020f54: f000 f9c8 bl 80212e8 <__udivdi3>
  1237. 8020f58: fb00 f305 mul.w r3, r0, r5
  1238. 8020f5c: fba0 4508 umull r4, r5, r0, r8
  1239. 8020f60: fb08 3801 mla r8, r8, r1, r3
  1240. 8020f64: 9b06 ldr r3, [sp, #24]
  1241. 8020f66: 4445 add r5, r8
  1242. 8020f68: 1b34 subs r4, r6, r4
  1243. 8020f6a: eb67 0505 sbc.w r5, r7, r5
  1244. 8020f6e: e9c3 4500 strd r4, r5, [r3]
  1245. 8020f72: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  1246. 8020f76: bf00 nop
  1247. 08020f78 <__aeabi_idiv0>:
  1248. 8020f78: 4770 bx lr
  1249. 8020f7a: bf00 nop
  1250. 08020f7c <__divdi3>:
  1251. 8020f7c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  1252. 8020f80: 2500 movs r5, #0
  1253. 8020f82: 2900 cmp r1, #0
  1254. 8020f84: b085 sub sp, #20
  1255. 8020f86: 461c mov r4, r3
  1256. 8020f88: f2c0 8149 blt.w 802121e <__divdi3+0x2a2>
  1257. 8020f8c: 2c00 cmp r4, #0
  1258. 8020f8e: f2c0 8141 blt.w 8021214 <__divdi3+0x298>
  1259. 8020f92: 468c mov ip, r1
  1260. 8020f94: 460f mov r7, r1
  1261. 8020f96: 4682 mov sl, r0
  1262. 8020f98: 4691 mov r9, r2
  1263. 8020f9a: 4614 mov r4, r2
  1264. 8020f9c: 4606 mov r6, r0
  1265. 8020f9e: 4619 mov r1, r3
  1266. 8020fa0: 2b00 cmp r3, #0
  1267. 8020fa2: d14b bne.n 802103c <__divdi3+0xc0>
  1268. 8020fa4: 4562 cmp r2, ip
  1269. 8020fa6: d959 bls.n 802105c <__divdi3+0xe0>
  1270. 8020fa8: fab2 f382 clz r3, r2
  1271. 8020fac: b143 cbz r3, 8020fc0 <__divdi3+0x44>
  1272. 8020fae: f1c3 0220 rsb r2, r3, #32
  1273. 8020fb2: fa0c f703 lsl.w r7, ip, r3
  1274. 8020fb6: fa20 f202 lsr.w r2, r0, r2
  1275. 8020fba: 409c lsls r4, r3
  1276. 8020fbc: 4317 orrs r7, r2
  1277. 8020fbe: 409e lsls r6, r3
  1278. 8020fc0: ea4f 4814 mov.w r8, r4, lsr #16
  1279. 8020fc4: 4638 mov r0, r7
  1280. 8020fc6: 4641 mov r1, r8
  1281. 8020fc8: fa1f f984 uxth.w r9, r4
  1282. 8020fcc: f000 fb18 bl 8021600 <__aeabi_uidiv>
  1283. 8020fd0: 4641 mov r1, r8
  1284. 8020fd2: 4682 mov sl, r0
  1285. 8020fd4: 4638 mov r0, r7
  1286. 8020fd6: f000 fc41 bl 802185c <__aeabi_uidivmod>
  1287. 8020fda: 0c33 lsrs r3, r6, #16
  1288. 8020fdc: fb09 f00a mul.w r0, r9, sl
  1289. 8020fe0: ea43 4101 orr.w r1, r3, r1, lsl #16
  1290. 8020fe4: 4288 cmp r0, r1
  1291. 8020fe6: d90a bls.n 8020ffe <__divdi3+0x82>
  1292. 8020fe8: 1909 adds r1, r1, r4
  1293. 8020fea: f10a 32ff add.w r2, sl, #4294967295
  1294. 8020fee: d205 bcs.n 8020ffc <__divdi3+0x80>
  1295. 8020ff0: 4288 cmp r0, r1
  1296. 8020ff2: bf84 itt hi
  1297. 8020ff4: f1aa 0a02 subhi.w sl, sl, #2
  1298. 8020ff8: 1909 addhi r1, r1, r4
  1299. 8020ffa: d800 bhi.n 8020ffe <__divdi3+0x82>
  1300. 8020ffc: 4692 mov sl, r2
  1301. 8020ffe: ebc0 0b01 rsb fp, r0, r1
  1302. 8021002: 4641 mov r1, r8
  1303. 8021004: 4658 mov r0, fp
  1304. 8021006: b2b6 uxth r6, r6
  1305. 8021008: f000 fafa bl 8021600 <__aeabi_uidiv>
  1306. 802100c: 4641 mov r1, r8
  1307. 802100e: 4607 mov r7, r0
  1308. 8021010: 4658 mov r0, fp
  1309. 8021012: f000 fc23 bl 802185c <__aeabi_uidivmod>
  1310. 8021016: fb09 f907 mul.w r9, r9, r7
  1311. 802101a: ea46 4101 orr.w r1, r6, r1, lsl #16
  1312. 802101e: 4589 cmp r9, r1
  1313. 8021020: d907 bls.n 8021032 <__divdi3+0xb6>
  1314. 8021022: 1e7b subs r3, r7, #1
  1315. 8021024: 190c adds r4, r1, r4
  1316. 8021026: f080 8157 bcs.w 80212d8 <__divdi3+0x35c>
  1317. 802102a: 3f02 subs r7, #2
  1318. 802102c: 45a1 cmp r9, r4
  1319. 802102e: f240 8153 bls.w 80212d8 <__divdi3+0x35c>
  1320. 8021032: ea47 400a orr.w r0, r7, sl, lsl #16
  1321. 8021036: f04f 0800 mov.w r8, #0
  1322. 802103a: e004 b.n 8021046 <__divdi3+0xca>
  1323. 802103c: 4563 cmp r3, ip
  1324. 802103e: d958 bls.n 80210f2 <__divdi3+0x176>
  1325. 8021040: f04f 0800 mov.w r8, #0
  1326. 8021044: 4640 mov r0, r8
  1327. 8021046: 4602 mov r2, r0
  1328. 8021048: 4643 mov r3, r8
  1329. 802104a: b115 cbz r5, 8021052 <__divdi3+0xd6>
  1330. 802104c: 4252 negs r2, r2
  1331. 802104e: eb63 0343 sbc.w r3, r3, r3, lsl #1
  1332. 8021052: 4610 mov r0, r2
  1333. 8021054: 4619 mov r1, r3
  1334. 8021056: b005 add sp, #20
  1335. 8021058: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  1336. 802105c: b922 cbnz r2, 8021068 <__divdi3+0xec>
  1337. 802105e: 2001 movs r0, #1
  1338. 8021060: 4611 mov r1, r2
  1339. 8021062: f000 facd bl 8021600 <__aeabi_uidiv>
  1340. 8021066: 4604 mov r4, r0
  1341. 8021068: fab4 f384 clz r3, r4
  1342. 802106c: 2b00 cmp r3, #0
  1343. 802106e: f040 80dc bne.w 802122a <__divdi3+0x2ae>
  1344. 8021072: 1b3f subs r7, r7, r4
  1345. 8021074: ea4f 4914 mov.w r9, r4, lsr #16
  1346. 8021078: fa1f fa84 uxth.w sl, r4
  1347. 802107c: f04f 0801 mov.w r8, #1
  1348. 8021080: 4649 mov r1, r9
  1349. 8021082: 4638 mov r0, r7
  1350. 8021084: f000 fabc bl 8021600 <__aeabi_uidiv>
  1351. 8021088: 4649 mov r1, r9
  1352. 802108a: 4683 mov fp, r0
  1353. 802108c: 4638 mov r0, r7
  1354. 802108e: f000 fbe5 bl 802185c <__aeabi_uidivmod>
  1355. 8021092: 0c33 lsrs r3, r6, #16
  1356. 8021094: fb0a f00b mul.w r0, sl, fp
  1357. 8021098: ea43 4101 orr.w r1, r3, r1, lsl #16
  1358. 802109c: 4288 cmp r0, r1
  1359. 802109e: d90b bls.n 80210b8 <__divdi3+0x13c>
  1360. 80210a0: 1909 adds r1, r1, r4
  1361. 80210a2: f10b 33ff add.w r3, fp, #4294967295
  1362. 80210a6: f080 8115 bcs.w 80212d4 <__divdi3+0x358>
  1363. 80210aa: 4288 cmp r0, r1
  1364. 80210ac: bf84 itt hi
  1365. 80210ae: f1ab 0b02 subhi.w fp, fp, #2
  1366. 80210b2: 1909 addhi r1, r1, r4
  1367. 80210b4: f240 810e bls.w 80212d4 <__divdi3+0x358>
  1368. 80210b8: 1a0b subs r3, r1, r0
  1369. 80210ba: 4649 mov r1, r9
  1370. 80210bc: 4618 mov r0, r3
  1371. 80210be: 9301 str r3, [sp, #4]
  1372. 80210c0: f000 fa9e bl 8021600 <__aeabi_uidiv>
  1373. 80210c4: 9b01 ldr r3, [sp, #4]
  1374. 80210c6: 4649 mov r1, r9
  1375. 80210c8: b2b6 uxth r6, r6
  1376. 80210ca: 4607 mov r7, r0
  1377. 80210cc: 4618 mov r0, r3
  1378. 80210ce: f000 fbc5 bl 802185c <__aeabi_uidivmod>
  1379. 80210d2: fb0a fa07 mul.w sl, sl, r7
  1380. 80210d6: ea46 4101 orr.w r1, r6, r1, lsl #16
  1381. 80210da: 458a cmp sl, r1
  1382. 80210dc: d906 bls.n 80210ec <__divdi3+0x170>
  1383. 80210de: 1e7b subs r3, r7, #1
  1384. 80210e0: 190c adds r4, r1, r4
  1385. 80210e2: d202 bcs.n 80210ea <__divdi3+0x16e>
  1386. 80210e4: 3f02 subs r7, #2
  1387. 80210e6: 45a2 cmp sl, r4
  1388. 80210e8: d800 bhi.n 80210ec <__divdi3+0x170>
  1389. 80210ea: 461f mov r7, r3
  1390. 80210ec: ea47 400b orr.w r0, r7, fp, lsl #16
  1391. 80210f0: e7a9 b.n 8021046 <__divdi3+0xca>
  1392. 80210f2: fab3 f483 clz r4, r3
  1393. 80210f6: 2c00 cmp r4, #0
  1394. 80210f8: f000 80e4 beq.w 80212c4 <__divdi3+0x348>
  1395. 80210fc: f1c4 0320 rsb r3, r4, #32
  1396. 8021100: fa01 f104 lsl.w r1, r1, r4
  1397. 8021104: fa22 fa03 lsr.w sl, r2, r3
  1398. 8021108: fa2c fb03 lsr.w fp, ip, r3
  1399. 802110c: ea4a 0a01 orr.w sl, sl, r1
  1400. 8021110: fa20 f803 lsr.w r8, r0, r3
  1401. 8021114: fa0c fc04 lsl.w ip, ip, r4
  1402. 8021118: 4658 mov r0, fp
  1403. 802111a: ea4f 471a mov.w r7, sl, lsr #16
  1404. 802111e: ea48 080c orr.w r8, r8, ip
  1405. 8021122: 4639 mov r1, r7
  1406. 8021124: fa02 f904 lsl.w r9, r2, r4
  1407. 8021128: f8cd 900c str.w r9, [sp, #12]
  1408. 802112c: f000 fa68 bl 8021600 <__aeabi_uidiv>
  1409. 8021130: 4639 mov r1, r7
  1410. 8021132: 4681 mov r9, r0
  1411. 8021134: 4658 mov r0, fp
  1412. 8021136: f000 fb91 bl 802185c <__aeabi_uidivmod>
  1413. 802113a: fa1f fc8a uxth.w ip, sl
  1414. 802113e: ea4f 4318 mov.w r3, r8, lsr #16
  1415. 8021142: fb0c f009 mul.w r0, ip, r9
  1416. 8021146: ea43 4301 orr.w r3, r3, r1, lsl #16
  1417. 802114a: 4298 cmp r0, r3
  1418. 802114c: d90c bls.n 8021168 <__divdi3+0x1ec>
  1419. 802114e: eb13 030a adds.w r3, r3, sl
  1420. 8021152: f109 31ff add.w r1, r9, #4294967295
  1421. 8021156: f080 80c3 bcs.w 80212e0 <__divdi3+0x364>
  1422. 802115a: 4298 cmp r0, r3
  1423. 802115c: bf84 itt hi
  1424. 802115e: f1a9 0902 subhi.w r9, r9, #2
  1425. 8021162: 4453 addhi r3, sl
  1426. 8021164: f240 80bc bls.w 80212e0 <__divdi3+0x364>
  1427. 8021168: 1a1b subs r3, r3, r0
  1428. 802116a: 4639 mov r1, r7
  1429. 802116c: 4618 mov r0, r3
  1430. 802116e: f8cd c008 str.w ip, [sp, #8]
  1431. 8021172: 9301 str r3, [sp, #4]
  1432. 8021174: f000 fa44 bl 8021600 <__aeabi_uidiv>
  1433. 8021178: 9b01 ldr r3, [sp, #4]
  1434. 802117a: 4639 mov r1, r7
  1435. 802117c: fa1f f888 uxth.w r8, r8
  1436. 8021180: 4683 mov fp, r0
  1437. 8021182: 4618 mov r0, r3
  1438. 8021184: f000 fb6a bl 802185c <__aeabi_uidivmod>
  1439. 8021188: f8dd c008 ldr.w ip, [sp, #8]
  1440. 802118c: fb0c f30b mul.w r3, ip, fp
  1441. 8021190: ea48 4101 orr.w r1, r8, r1, lsl #16
  1442. 8021194: 428b cmp r3, r1
  1443. 8021196: d90c bls.n 80211b2 <__divdi3+0x236>
  1444. 8021198: eb11 010a adds.w r1, r1, sl
  1445. 802119c: f10b 30ff add.w r0, fp, #4294967295
  1446. 80211a0: f080 809c bcs.w 80212dc <__divdi3+0x360>
  1447. 80211a4: 428b cmp r3, r1
  1448. 80211a6: bf84 itt hi
  1449. 80211a8: f1ab 0b02 subhi.w fp, fp, #2
  1450. 80211ac: 4451 addhi r1, sl
  1451. 80211ae: f240 8095 bls.w 80212dc <__divdi3+0x360>
  1452. 80211b2: 9f03 ldr r7, [sp, #12]
  1453. 80211b4: ea4b 4009 orr.w r0, fp, r9, lsl #16
  1454. 80211b8: 1ac9 subs r1, r1, r3
  1455. 80211ba: fa1f fc80 uxth.w ip, r0
  1456. 80211be: b2ba uxth r2, r7
  1457. 80211c0: ea4f 4917 mov.w r9, r7, lsr #16
  1458. 80211c4: 0c07 lsrs r7, r0, #16
  1459. 80211c6: fb02 f80c mul.w r8, r2, ip
  1460. 80211ca: fb02 f207 mul.w r2, r2, r7
  1461. 80211ce: fb09 230c mla r3, r9, ip, r2
  1462. 80211d2: fb09 f907 mul.w r9, r9, r7
  1463. 80211d6: eb03 4318 add.w r3, r3, r8, lsr #16
  1464. 80211da: 429a cmp r2, r3
  1465. 80211dc: bf88 it hi
  1466. 80211de: f509 3980 addhi.w r9, r9, #65536 ; 0x10000
  1467. 80211e2: eb09 4913 add.w r9, r9, r3, lsr #16
  1468. 80211e6: 4549 cmp r1, r9
  1469. 80211e8: d310 bcc.n 802120c <__divdi3+0x290>
  1470. 80211ea: fa1f f888 uxth.w r8, r8
  1471. 80211ee: bf14 ite ne
  1472. 80211f0: 2200 movne r2, #0
  1473. 80211f2: 2201 moveq r2, #1
  1474. 80211f4: fa06 f404 lsl.w r4, r6, r4
  1475. 80211f8: eb08 4303 add.w r3, r8, r3, lsl #16
  1476. 80211fc: 429c cmp r4, r3
  1477. 80211fe: bf2c ite cs
  1478. 8021200: 2300 movcs r3, #0
  1479. 8021202: f002 0301 andcc.w r3, r2, #1
  1480. 8021206: 2b00 cmp r3, #0
  1481. 8021208: f43f af15 beq.w 8021036 <__divdi3+0xba>
  1482. 802120c: 3801 subs r0, #1
  1483. 802120e: f04f 0800 mov.w r8, #0
  1484. 8021212: e718 b.n 8021046 <__divdi3+0xca>
  1485. 8021214: 4252 negs r2, r2
  1486. 8021216: eb63 0343 sbc.w r3, r3, r3, lsl #1
  1487. 802121a: 43ed mvns r5, r5
  1488. 802121c: e6b9 b.n 8020f92 <__divdi3+0x16>
  1489. 802121e: 4240 negs r0, r0
  1490. 8021220: eb61 0141 sbc.w r1, r1, r1, lsl #1
  1491. 8021224: f04f 35ff mov.w r5, #4294967295
  1492. 8021228: e6b0 b.n 8020f8c <__divdi3+0x10>
  1493. 802122a: 409c lsls r4, r3
  1494. 802122c: f1c3 0b20 rsb fp, r3, #32
  1495. 8021230: fa27 f80b lsr.w r8, r7, fp
  1496. 8021234: fa07 f703 lsl.w r7, r7, r3
  1497. 8021238: ea4f 4914 mov.w r9, r4, lsr #16
  1498. 802123c: 4640 mov r0, r8
  1499. 802123e: 4649 mov r1, r9
  1500. 8021240: fa26 fb0b lsr.w fp, r6, fp
  1501. 8021244: 409e lsls r6, r3
  1502. 8021246: f000 f9db bl 8021600 <__aeabi_uidiv>
  1503. 802124a: 4649 mov r1, r9
  1504. 802124c: fa1f fa84 uxth.w sl, r4
  1505. 8021250: ea4b 0b07 orr.w fp, fp, r7
  1506. 8021254: 4603 mov r3, r0
  1507. 8021256: 4640 mov r0, r8
  1508. 8021258: 9301 str r3, [sp, #4]
  1509. 802125a: f000 faff bl 802185c <__aeabi_uidivmod>
  1510. 802125e: 9b01 ldr r3, [sp, #4]
  1511. 8021260: ea4f 421b mov.w r2, fp, lsr #16
  1512. 8021264: fb0a f003 mul.w r0, sl, r3
  1513. 8021268: ea42 4101 orr.w r1, r2, r1, lsl #16
  1514. 802126c: 4288 cmp r0, r1
  1515. 802126e: d906 bls.n 802127e <__divdi3+0x302>
  1516. 8021270: 1e5a subs r2, r3, #1
  1517. 8021272: 1909 adds r1, r1, r4
  1518. 8021274: d236 bcs.n 80212e4 <__divdi3+0x368>
  1519. 8021276: 4288 cmp r0, r1
  1520. 8021278: d934 bls.n 80212e4 <__divdi3+0x368>
  1521. 802127a: 3b02 subs r3, #2
  1522. 802127c: 1909 adds r1, r1, r4
  1523. 802127e: 1a0f subs r7, r1, r0
  1524. 8021280: 4649 mov r1, r9
  1525. 8021282: 4638 mov r0, r7
  1526. 8021284: 9301 str r3, [sp, #4]
  1527. 8021286: f000 f9bb bl 8021600 <__aeabi_uidiv>
  1528. 802128a: 4649 mov r1, r9
  1529. 802128c: fa1f fb8b uxth.w fp, fp
  1530. 8021290: 4680 mov r8, r0
  1531. 8021292: 4638 mov r0, r7
  1532. 8021294: f000 fae2 bl 802185c <__aeabi_uidivmod>
  1533. 8021298: 9b01 ldr r3, [sp, #4]
  1534. 802129a: fb0a f708 mul.w r7, sl, r8
  1535. 802129e: ea4b 4101 orr.w r1, fp, r1, lsl #16
  1536. 80212a2: 428f cmp r7, r1
  1537. 80212a4: d90a bls.n 80212bc <__divdi3+0x340>
  1538. 80212a6: 1909 adds r1, r1, r4
  1539. 80212a8: f108 32ff add.w r2, r8, #4294967295
  1540. 80212ac: d205 bcs.n 80212ba <__divdi3+0x33e>
  1541. 80212ae: 428f cmp r7, r1
  1542. 80212b0: bf84 itt hi
  1543. 80212b2: f1a8 0802 subhi.w r8, r8, #2
  1544. 80212b6: 1909 addhi r1, r1, r4
  1545. 80212b8: d800 bhi.n 80212bc <__divdi3+0x340>
  1546. 80212ba: 4690 mov r8, r2
  1547. 80212bc: 1bcf subs r7, r1, r7
  1548. 80212be: ea48 4803 orr.w r8, r8, r3, lsl #16
  1549. 80212c2: e6dd b.n 8021080 <__divdi3+0x104>
  1550. 80212c4: 2001 movs r0, #1
  1551. 80212c6: 4563 cmp r3, ip
  1552. 80212c8: bf28 it cs
  1553. 80212ca: 4552 cmpcs r2, sl
  1554. 80212cc: 46a0 mov r8, r4
  1555. 80212ce: f67f aeba bls.w 8021046 <__divdi3+0xca>
  1556. 80212d2: e6b5 b.n 8021040 <__divdi3+0xc4>
  1557. 80212d4: 469b mov fp, r3
  1558. 80212d6: e6ef b.n 80210b8 <__divdi3+0x13c>
  1559. 80212d8: 461f mov r7, r3
  1560. 80212da: e6aa b.n 8021032 <__divdi3+0xb6>
  1561. 80212dc: 4683 mov fp, r0
  1562. 80212de: e768 b.n 80211b2 <__divdi3+0x236>
  1563. 80212e0: 4689 mov r9, r1
  1564. 80212e2: e741 b.n 8021168 <__divdi3+0x1ec>
  1565. 80212e4: 4613 mov r3, r2
  1566. 80212e6: e7ca b.n 802127e <__divdi3+0x302>
  1567. 080212e8 <__udivdi3>:
  1568. 80212e8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  1569. 80212ec: 4606 mov r6, r0
  1570. 80212ee: b083 sub sp, #12
  1571. 80212f0: 460d mov r5, r1
  1572. 80212f2: 4614 mov r4, r2
  1573. 80212f4: 4607 mov r7, r0
  1574. 80212f6: 4688 mov r8, r1
  1575. 80212f8: 2b00 cmp r3, #0
  1576. 80212fa: d14a bne.n 8021392 <__udivdi3+0xaa>
  1577. 80212fc: 428a cmp r2, r1
  1578. 80212fe: d955 bls.n 80213ac <__udivdi3+0xc4>
  1579. 8021300: fab2 f382 clz r3, r2
  1580. 8021304: b14b cbz r3, 802131a <__udivdi3+0x32>
  1581. 8021306: f1c3 0220 rsb r2, r3, #32
  1582. 802130a: fa01 f803 lsl.w r8, r1, r3
  1583. 802130e: fa20 f202 lsr.w r2, r0, r2
  1584. 8021312: 409c lsls r4, r3
  1585. 8021314: ea42 0808 orr.w r8, r2, r8
  1586. 8021318: 409f lsls r7, r3
  1587. 802131a: 0c25 lsrs r5, r4, #16
  1588. 802131c: 4640 mov r0, r8
  1589. 802131e: 4629 mov r1, r5
  1590. 8021320: fa1f fa84 uxth.w sl, r4
  1591. 8021324: f000 f96c bl 8021600 <__aeabi_uidiv>
  1592. 8021328: 4629 mov r1, r5
  1593. 802132a: 4681 mov r9, r0
  1594. 802132c: 4640 mov r0, r8
  1595. 802132e: f000 fa95 bl 802185c <__aeabi_uidivmod>
  1596. 8021332: 0c3b lsrs r3, r7, #16
  1597. 8021334: fb0a f009 mul.w r0, sl, r9
  1598. 8021338: ea43 4101 orr.w r1, r3, r1, lsl #16
  1599. 802133c: 4288 cmp r0, r1
  1600. 802133e: d90a bls.n 8021356 <__udivdi3+0x6e>
  1601. 8021340: 1909 adds r1, r1, r4
  1602. 8021342: f109 32ff add.w r2, r9, #4294967295
  1603. 8021346: d205 bcs.n 8021354 <__udivdi3+0x6c>
  1604. 8021348: 4288 cmp r0, r1
  1605. 802134a: bf84 itt hi
  1606. 802134c: f1a9 0902 subhi.w r9, r9, #2
  1607. 8021350: 1909 addhi r1, r1, r4
  1608. 8021352: d800 bhi.n 8021356 <__udivdi3+0x6e>
  1609. 8021354: 4691 mov r9, r2
  1610. 8021356: ebc0 0801 rsb r8, r0, r1
  1611. 802135a: 4629 mov r1, r5
  1612. 802135c: 4640 mov r0, r8
  1613. 802135e: b2bf uxth r7, r7
  1614. 8021360: f000 f94e bl 8021600 <__aeabi_uidiv>
  1615. 8021364: 4629 mov r1, r5
  1616. 8021366: 4606 mov r6, r0
  1617. 8021368: 4640 mov r0, r8
  1618. 802136a: f000 fa77 bl 802185c <__aeabi_uidivmod>
  1619. 802136e: fb0a fa06 mul.w sl, sl, r6
  1620. 8021372: ea47 4101 orr.w r1, r7, r1, lsl #16
  1621. 8021376: 458a cmp sl, r1
  1622. 8021378: d907 bls.n 802138a <__udivdi3+0xa2>
  1623. 802137a: 1e73 subs r3, r6, #1
  1624. 802137c: 190c adds r4, r1, r4
  1625. 802137e: f080 8122 bcs.w 80215c6 <__udivdi3+0x2de>
  1626. 8021382: 3e02 subs r6, #2
  1627. 8021384: 45a2 cmp sl, r4
  1628. 8021386: f240 811e bls.w 80215c6 <__udivdi3+0x2de>
  1629. 802138a: ea46 4009 orr.w r0, r6, r9, lsl #16
  1630. 802138e: 2600 movs r6, #0
  1631. 8021390: e058 b.n 8021444 <__udivdi3+0x15c>
  1632. 8021392: 428b cmp r3, r1
  1633. 8021394: d854 bhi.n 8021440 <__udivdi3+0x158>
  1634. 8021396: fab3 f483 clz r4, r3
  1635. 802139a: 2c00 cmp r4, #0
  1636. 802139c: d156 bne.n 802144c <__udivdi3+0x164>
  1637. 802139e: 428b cmp r3, r1
  1638. 80213a0: bf28 it cs
  1639. 80213a2: 4282 cmpcs r2, r0
  1640. 80213a4: d84c bhi.n 8021440 <__udivdi3+0x158>
  1641. 80213a6: 4626 mov r6, r4
  1642. 80213a8: 2001 movs r0, #1
  1643. 80213aa: e04b b.n 8021444 <__udivdi3+0x15c>
  1644. 80213ac: b922 cbnz r2, 80213b8 <__udivdi3+0xd0>
  1645. 80213ae: 2001 movs r0, #1
  1646. 80213b0: 4611 mov r1, r2
  1647. 80213b2: f000 f925 bl 8021600 <__aeabi_uidiv>
  1648. 80213b6: 4604 mov r4, r0
  1649. 80213b8: fab4 f384 clz r3, r4
  1650. 80213bc: 2b00 cmp r3, #0
  1651. 80213be: f040 80b9 bne.w 8021534 <__udivdi3+0x24c>
  1652. 80213c2: 1b2d subs r5, r5, r4
  1653. 80213c4: ea4f 4814 mov.w r8, r4, lsr #16
  1654. 80213c8: fa1f fa84 uxth.w sl, r4
  1655. 80213cc: 2601 movs r6, #1
  1656. 80213ce: 4641 mov r1, r8
  1657. 80213d0: 4628 mov r0, r5
  1658. 80213d2: f000 f915 bl 8021600 <__aeabi_uidiv>
  1659. 80213d6: 4641 mov r1, r8
  1660. 80213d8: 4681 mov r9, r0
  1661. 80213da: 4628 mov r0, r5
  1662. 80213dc: f000 fa3e bl 802185c <__aeabi_uidivmod>
  1663. 80213e0: 0c3b lsrs r3, r7, #16
  1664. 80213e2: fb0a f009 mul.w r0, sl, r9
  1665. 80213e6: ea43 4101 orr.w r1, r3, r1, lsl #16
  1666. 80213ea: 4288 cmp r0, r1
  1667. 80213ec: d90b bls.n 8021406 <__udivdi3+0x11e>
  1668. 80213ee: 1909 adds r1, r1, r4
  1669. 80213f0: f109 33ff add.w r3, r9, #4294967295
  1670. 80213f4: f080 80e9 bcs.w 80215ca <__udivdi3+0x2e2>
  1671. 80213f8: 4288 cmp r0, r1
  1672. 80213fa: bf84 itt hi
  1673. 80213fc: f1a9 0902 subhi.w r9, r9, #2
  1674. 8021400: 1909 addhi r1, r1, r4
  1675. 8021402: f240 80e2 bls.w 80215ca <__udivdi3+0x2e2>
  1676. 8021406: ebc0 0b01 rsb fp, r0, r1
  1677. 802140a: 4641 mov r1, r8
  1678. 802140c: 4658 mov r0, fp
  1679. 802140e: b2bf uxth r7, r7
  1680. 8021410: f000 f8f6 bl 8021600 <__aeabi_uidiv>
  1681. 8021414: 4641 mov r1, r8
  1682. 8021416: 4605 mov r5, r0
  1683. 8021418: 4658 mov r0, fp
  1684. 802141a: f000 fa1f bl 802185c <__aeabi_uidivmod>
  1685. 802141e: fb0a fa05 mul.w sl, sl, r5
  1686. 8021422: ea47 4101 orr.w r1, r7, r1, lsl #16
  1687. 8021426: 458a cmp sl, r1
  1688. 8021428: d907 bls.n 802143a <__udivdi3+0x152>
  1689. 802142a: 1e6b subs r3, r5, #1
  1690. 802142c: 190c adds r4, r1, r4
  1691. 802142e: f080 80ce bcs.w 80215ce <__udivdi3+0x2e6>
  1692. 8021432: 3d02 subs r5, #2
  1693. 8021434: 45a2 cmp sl, r4
  1694. 8021436: f240 80ca bls.w 80215ce <__udivdi3+0x2e6>
  1695. 802143a: ea45 4009 orr.w r0, r5, r9, lsl #16
  1696. 802143e: e001 b.n 8021444 <__udivdi3+0x15c>
  1697. 8021440: 2600 movs r6, #0
  1698. 8021442: 4630 mov r0, r6
  1699. 8021444: 4631 mov r1, r6
  1700. 8021446: b003 add sp, #12
  1701. 8021448: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  1702. 802144c: f1c4 0120 rsb r1, r4, #32
  1703. 8021450: fa03 f304 lsl.w r3, r3, r4
  1704. 8021454: fa22 f801 lsr.w r8, r2, r1
  1705. 8021458: fa25 f701 lsr.w r7, r5, r1
  1706. 802145c: ea48 0803 orr.w r8, r8, r3
  1707. 8021460: fa20 f101 lsr.w r1, r0, r1
  1708. 8021464: fa05 f504 lsl.w r5, r5, r4
  1709. 8021468: 4638 mov r0, r7
  1710. 802146a: ea4f 4918 mov.w r9, r8, lsr #16
  1711. 802146e: 430d orrs r5, r1
  1712. 8021470: 4649 mov r1, r9
  1713. 8021472: fa02 f204 lsl.w r2, r2, r4
  1714. 8021476: 9201 str r2, [sp, #4]
  1715. 8021478: f000 f8c2 bl 8021600 <__aeabi_uidiv>
  1716. 802147c: 4649 mov r1, r9
  1717. 802147e: 4682 mov sl, r0
  1718. 8021480: 4638 mov r0, r7
  1719. 8021482: f000 f9eb bl 802185c <__aeabi_uidivmod>
  1720. 8021486: fa1f f288 uxth.w r2, r8
  1721. 802148a: 0c2f lsrs r7, r5, #16
  1722. 802148c: fb02 f00a mul.w r0, r2, sl
  1723. 8021490: ea47 4701 orr.w r7, r7, r1, lsl #16
  1724. 8021494: 42b8 cmp r0, r7
  1725. 8021496: d906 bls.n 80214a6 <__udivdi3+0x1be>
  1726. 8021498: eb17 0708 adds.w r7, r7, r8
  1727. 802149c: f10a 31ff add.w r1, sl, #4294967295
  1728. 80214a0: f0c0 809f bcc.w 80215e2 <__udivdi3+0x2fa>
  1729. 80214a4: 468a mov sl, r1
  1730. 80214a6: 1a3f subs r7, r7, r0
  1731. 80214a8: 4649 mov r1, r9
  1732. 80214aa: 4638 mov r0, r7
  1733. 80214ac: 9200 str r2, [sp, #0]
  1734. 80214ae: f000 f8a7 bl 8021600 <__aeabi_uidiv>
  1735. 80214b2: 4649 mov r1, r9
  1736. 80214b4: b2ad uxth r5, r5
  1737. 80214b6: 4683 mov fp, r0
  1738. 80214b8: 4638 mov r0, r7
  1739. 80214ba: f000 f9cf bl 802185c <__aeabi_uidivmod>
  1740. 80214be: 9a00 ldr r2, [sp, #0]
  1741. 80214c0: fb02 f70b mul.w r7, r2, fp
  1742. 80214c4: ea45 4101 orr.w r1, r5, r1, lsl #16
  1743. 80214c8: 428f cmp r7, r1
  1744. 80214ca: d905 bls.n 80214d8 <__udivdi3+0x1f0>
  1745. 80214cc: eb11 0108 adds.w r1, r1, r8
  1746. 80214d0: f10b 32ff add.w r2, fp, #4294967295
  1747. 80214d4: d37d bcc.n 80215d2 <__udivdi3+0x2ea>
  1748. 80214d6: 4693 mov fp, r2
  1749. 80214d8: 9b01 ldr r3, [sp, #4]
  1750. 80214da: ea4b 400a orr.w r0, fp, sl, lsl #16
  1751. 80214de: 1bc9 subs r1, r1, r7
  1752. 80214e0: ea4f 4c10 mov.w ip, r0, lsr #16
  1753. 80214e4: b29d uxth r5, r3
  1754. 80214e6: ea4f 4a13 mov.w sl, r3, lsr #16
  1755. 80214ea: b283 uxth r3, r0
  1756. 80214ec: fb05 f203 mul.w r2, r5, r3
  1757. 80214f0: fb05 f50c mul.w r5, r5, ip
  1758. 80214f4: fb0a 5303 mla r3, sl, r3, r5
  1759. 80214f8: fb0a fa0c mul.w sl, sl, ip
  1760. 80214fc: eb03 4312 add.w r3, r3, r2, lsr #16
  1761. 8021500: 429d cmp r5, r3
  1762. 8021502: bf88 it hi
  1763. 8021504: f50a 3a80 addhi.w sl, sl, #65536 ; 0x10000
  1764. 8021508: eb0a 4a13 add.w sl, sl, r3, lsr #16
  1765. 802150c: 4551 cmp r1, sl
  1766. 802150e: d30e bcc.n 802152e <__udivdi3+0x246>
  1767. 8021510: b292 uxth r2, r2
  1768. 8021512: bf14 ite ne
  1769. 8021514: 2100 movne r1, #0
  1770. 8021516: 2101 moveq r1, #1
  1771. 8021518: fa06 f604 lsl.w r6, r6, r4
  1772. 802151c: eb02 4303 add.w r3, r2, r3, lsl #16
  1773. 8021520: 429e cmp r6, r3
  1774. 8021522: bf2c ite cs
  1775. 8021524: 2600 movcs r6, #0
  1776. 8021526: f001 0601 andcc.w r6, r1, #1
  1777. 802152a: 2e00 cmp r6, #0
  1778. 802152c: d08a beq.n 8021444 <__udivdi3+0x15c>
  1779. 802152e: 3801 subs r0, #1
  1780. 8021530: 2600 movs r6, #0
  1781. 8021532: e787 b.n 8021444 <__udivdi3+0x15c>
  1782. 8021534: 409c lsls r4, r3
  1783. 8021536: f1c3 0220 rsb r2, r3, #32
  1784. 802153a: fa25 fa02 lsr.w sl, r5, r2
  1785. 802153e: fa26 f902 lsr.w r9, r6, r2
  1786. 8021542: ea4f 4814 mov.w r8, r4, lsr #16
  1787. 8021546: 4650 mov r0, sl
  1788. 8021548: 4641 mov r1, r8
  1789. 802154a: fa05 f503 lsl.w r5, r5, r3
  1790. 802154e: fa06 f703 lsl.w r7, r6, r3
  1791. 8021552: f000 f855 bl 8021600 <__aeabi_uidiv>
  1792. 8021556: 4641 mov r1, r8
  1793. 8021558: ea49 0905 orr.w r9, r9, r5
  1794. 802155c: 4683 mov fp, r0
  1795. 802155e: 4650 mov r0, sl
  1796. 8021560: f000 f97c bl 802185c <__aeabi_uidivmod>
  1797. 8021564: fa1f fa84 uxth.w sl, r4
  1798. 8021568: ea4f 4319 mov.w r3, r9, lsr #16
  1799. 802156c: fb0a f00b mul.w r0, sl, fp
  1800. 8021570: ea43 4101 orr.w r1, r3, r1, lsl #16
  1801. 8021574: 4288 cmp r0, r1
  1802. 8021576: d909 bls.n 802158c <__udivdi3+0x2a4>
  1803. 8021578: 1909 adds r1, r1, r4
  1804. 802157a: f10b 33ff add.w r3, fp, #4294967295
  1805. 802157e: d238 bcs.n 80215f2 <__udivdi3+0x30a>
  1806. 8021580: 4288 cmp r0, r1
  1807. 8021582: bf84 itt hi
  1808. 8021584: f1ab 0b02 subhi.w fp, fp, #2
  1809. 8021588: 1909 addhi r1, r1, r4
  1810. 802158a: d932 bls.n 80215f2 <__udivdi3+0x30a>
  1811. 802158c: 1a0d subs r5, r1, r0
  1812. 802158e: 4641 mov r1, r8
  1813. 8021590: 4628 mov r0, r5
  1814. 8021592: fa1f f989 uxth.w r9, r9
  1815. 8021596: f000 f833 bl 8021600 <__aeabi_uidiv>
  1816. 802159a: 4641 mov r1, r8
  1817. 802159c: 4606 mov r6, r0
  1818. 802159e: 4628 mov r0, r5
  1819. 80215a0: f000 f95c bl 802185c <__aeabi_uidivmod>
  1820. 80215a4: fb0a f506 mul.w r5, sl, r6
  1821. 80215a8: ea49 4101 orr.w r1, r9, r1, lsl #16
  1822. 80215ac: 428d cmp r5, r1
  1823. 80215ae: d906 bls.n 80215be <__udivdi3+0x2d6>
  1824. 80215b0: 1e73 subs r3, r6, #1
  1825. 80215b2: 1909 adds r1, r1, r4
  1826. 80215b4: d21f bcs.n 80215f6 <__udivdi3+0x30e>
  1827. 80215b6: 428d cmp r5, r1
  1828. 80215b8: d91d bls.n 80215f6 <__udivdi3+0x30e>
  1829. 80215ba: 3e02 subs r6, #2
  1830. 80215bc: 1909 adds r1, r1, r4
  1831. 80215be: 1b4d subs r5, r1, r5
  1832. 80215c0: ea46 460b orr.w r6, r6, fp, lsl #16
  1833. 80215c4: e703 b.n 80213ce <__udivdi3+0xe6>
  1834. 80215c6: 461e mov r6, r3
  1835. 80215c8: e6df b.n 802138a <__udivdi3+0xa2>
  1836. 80215ca: 4699 mov r9, r3
  1837. 80215cc: e71b b.n 8021406 <__udivdi3+0x11e>
  1838. 80215ce: 461d mov r5, r3
  1839. 80215d0: e733 b.n 802143a <__udivdi3+0x152>
  1840. 80215d2: 428f cmp r7, r1
  1841. 80215d4: bf84 itt hi
  1842. 80215d6: f1ab 0b02 subhi.w fp, fp, #2
  1843. 80215da: 4441 addhi r1, r8
  1844. 80215dc: f63f af7c bhi.w 80214d8 <__udivdi3+0x1f0>
  1845. 80215e0: e779 b.n 80214d6 <__udivdi3+0x1ee>
  1846. 80215e2: 42b8 cmp r0, r7
  1847. 80215e4: bf84 itt hi
  1848. 80215e6: f1aa 0a02 subhi.w sl, sl, #2
  1849. 80215ea: 4447 addhi r7, r8
  1850. 80215ec: f63f af5b bhi.w 80214a6 <__udivdi3+0x1be>
  1851. 80215f0: e758 b.n 80214a4 <__udivdi3+0x1bc>
  1852. 80215f2: 469b mov fp, r3
  1853. 80215f4: e7ca b.n 802158c <__udivdi3+0x2a4>
  1854. 80215f6: 461e mov r6, r3
  1855. 80215f8: e7e1 b.n 80215be <__udivdi3+0x2d6>
  1856. 80215fa: bf00 nop
  1857. 80215fc: 0000 movs r0, r0
  1858. 80215fe: 0000 movs r0, r0
  1859. 08021600 <__aeabi_uidiv>:
  1860. 8021600: 1e4a subs r2, r1, #1
  1861. 8021602: bf08 it eq
  1862. 8021604: 4770 bxeq lr
  1863. 8021606: f0c0 8124 bcc.w 8021852 <__aeabi_uidiv+0x252>
  1864. 802160a: 4288 cmp r0, r1
  1865. 802160c: f240 8116 bls.w 802183c <__aeabi_uidiv+0x23c>
  1866. 8021610: 4211 tst r1, r2
  1867. 8021612: f000 8117 beq.w 8021844 <__aeabi_uidiv+0x244>
  1868. 8021616: fab0 f380 clz r3, r0
  1869. 802161a: fab1 f281 clz r2, r1
  1870. 802161e: eba2 0303 sub.w r3, r2, r3
  1871. 8021622: f1c3 031f rsb r3, r3, #31
  1872. 8021626: a204 add r2, pc, #16 ; (adr r2, 8021638 <__aeabi_uidiv+0x38>)
  1873. 8021628: eb02 1303 add.w r3, r2, r3, lsl #4
  1874. 802162c: f04f 0200 mov.w r2, #0
  1875. 8021630: 469f mov pc, r3
  1876. 8021632: bf00 nop
  1877. 8021634: f3af 8000 nop.w
  1878. 8021638: ebb0 7fc1 cmp.w r0, r1, lsl #31
  1879. 802163c: bf00 nop
  1880. 802163e: eb42 0202 adc.w r2, r2, r2
  1881. 8021642: bf28 it cs
  1882. 8021644: eba0 70c1 subcs.w r0, r0, r1, lsl #31
  1883. 8021648: ebb0 7f81 cmp.w r0, r1, lsl #30
  1884. 802164c: bf00 nop
  1885. 802164e: eb42 0202 adc.w r2, r2, r2
  1886. 8021652: bf28 it cs
  1887. 8021654: eba0 7081 subcs.w r0, r0, r1, lsl #30
  1888. 8021658: ebb0 7f41 cmp.w r0, r1, lsl #29
  1889. 802165c: bf00 nop
  1890. 802165e: eb42 0202 adc.w r2, r2, r2
  1891. 8021662: bf28 it cs
  1892. 8021664: eba0 7041 subcs.w r0, r0, r1, lsl #29
  1893. 8021668: ebb0 7f01 cmp.w r0, r1, lsl #28
  1894. 802166c: bf00 nop
  1895. 802166e: eb42 0202 adc.w r2, r2, r2
  1896. 8021672: bf28 it cs
  1897. 8021674: eba0 7001 subcs.w r0, r0, r1, lsl #28
  1898. 8021678: ebb0 6fc1 cmp.w r0, r1, lsl #27
  1899. 802167c: bf00 nop
  1900. 802167e: eb42 0202 adc.w r2, r2, r2
  1901. 8021682: bf28 it cs
  1902. 8021684: eba0 60c1 subcs.w r0, r0, r1, lsl #27
  1903. 8021688: ebb0 6f81 cmp.w r0, r1, lsl #26
  1904. 802168c: bf00 nop
  1905. 802168e: eb42 0202 adc.w r2, r2, r2
  1906. 8021692: bf28 it cs
  1907. 8021694: eba0 6081 subcs.w r0, r0, r1, lsl #26
  1908. 8021698: ebb0 6f41 cmp.w r0, r1, lsl #25
  1909. 802169c: bf00 nop
  1910. 802169e: eb42 0202 adc.w r2, r2, r2
  1911. 80216a2: bf28 it cs
  1912. 80216a4: eba0 6041 subcs.w r0, r0, r1, lsl #25
  1913. 80216a8: ebb0 6f01 cmp.w r0, r1, lsl #24
  1914. 80216ac: bf00 nop
  1915. 80216ae: eb42 0202 adc.w r2, r2, r2
  1916. 80216b2: bf28 it cs
  1917. 80216b4: eba0 6001 subcs.w r0, r0, r1, lsl #24
  1918. 80216b8: ebb0 5fc1 cmp.w r0, r1, lsl #23
  1919. 80216bc: bf00 nop
  1920. 80216be: eb42 0202 adc.w r2, r2, r2
  1921. 80216c2: bf28 it cs
  1922. 80216c4: eba0 50c1 subcs.w r0, r0, r1, lsl #23
  1923. 80216c8: ebb0 5f81 cmp.w r0, r1, lsl #22
  1924. 80216cc: bf00 nop
  1925. 80216ce: eb42 0202 adc.w r2, r2, r2
  1926. 80216d2: bf28 it cs
  1927. 80216d4: eba0 5081 subcs.w r0, r0, r1, lsl #22
  1928. 80216d8: ebb0 5f41 cmp.w r0, r1, lsl #21
  1929. 80216dc: bf00 nop
  1930. 80216de: eb42 0202 adc.w r2, r2, r2
  1931. 80216e2: bf28 it cs
  1932. 80216e4: eba0 5041 subcs.w r0, r0, r1, lsl #21
  1933. 80216e8: ebb0 5f01 cmp.w r0, r1, lsl #20
  1934. 80216ec: bf00 nop
  1935. 80216ee: eb42 0202 adc.w r2, r2, r2
  1936. 80216f2: bf28 it cs
  1937. 80216f4: eba0 5001 subcs.w r0, r0, r1, lsl #20
  1938. 80216f8: ebb0 4fc1 cmp.w r0, r1, lsl #19
  1939. 80216fc: bf00 nop
  1940. 80216fe: eb42 0202 adc.w r2, r2, r2
  1941. 8021702: bf28 it cs
  1942. 8021704: eba0 40c1 subcs.w r0, r0, r1, lsl #19
  1943. 8021708: ebb0 4f81 cmp.w r0, r1, lsl #18
  1944. 802170c: bf00 nop
  1945. 802170e: eb42 0202 adc.w r2, r2, r2
  1946. 8021712: bf28 it cs
  1947. 8021714: eba0 4081 subcs.w r0, r0, r1, lsl #18
  1948. 8021718: ebb0 4f41 cmp.w r0, r1, lsl #17
  1949. 802171c: bf00 nop
  1950. 802171e: eb42 0202 adc.w r2, r2, r2
  1951. 8021722: bf28 it cs
  1952. 8021724: eba0 4041 subcs.w r0, r0, r1, lsl #17
  1953. 8021728: ebb0 4f01 cmp.w r0, r1, lsl #16
  1954. 802172c: bf00 nop
  1955. 802172e: eb42 0202 adc.w r2, r2, r2
  1956. 8021732: bf28 it cs
  1957. 8021734: eba0 4001 subcs.w r0, r0, r1, lsl #16
  1958. 8021738: ebb0 3fc1 cmp.w r0, r1, lsl #15
  1959. 802173c: bf00 nop
  1960. 802173e: eb42 0202 adc.w r2, r2, r2
  1961. 8021742: bf28 it cs
  1962. 8021744: eba0 30c1 subcs.w r0, r0, r1, lsl #15
  1963. 8021748: ebb0 3f81 cmp.w r0, r1, lsl #14
  1964. 802174c: bf00 nop
  1965. 802174e: eb42 0202 adc.w r2, r2, r2
  1966. 8021752: bf28 it cs
  1967. 8021754: eba0 3081 subcs.w r0, r0, r1, lsl #14
  1968. 8021758: ebb0 3f41 cmp.w r0, r1, lsl #13
  1969. 802175c: bf00 nop
  1970. 802175e: eb42 0202 adc.w r2, r2, r2
  1971. 8021762: bf28 it cs
  1972. 8021764: eba0 3041 subcs.w r0, r0, r1, lsl #13
  1973. 8021768: ebb0 3f01 cmp.w r0, r1, lsl #12
  1974. 802176c: bf00 nop
  1975. 802176e: eb42 0202 adc.w r2, r2, r2
  1976. 8021772: bf28 it cs
  1977. 8021774: eba0 3001 subcs.w r0, r0, r1, lsl #12
  1978. 8021778: ebb0 2fc1 cmp.w r0, r1, lsl #11
  1979. 802177c: bf00 nop
  1980. 802177e: eb42 0202 adc.w r2, r2, r2
  1981. 8021782: bf28 it cs
  1982. 8021784: eba0 20c1 subcs.w r0, r0, r1, lsl #11
  1983. 8021788: ebb0 2f81 cmp.w r0, r1, lsl #10
  1984. 802178c: bf00 nop
  1985. 802178e: eb42 0202 adc.w r2, r2, r2
  1986. 8021792: bf28 it cs
  1987. 8021794: eba0 2081 subcs.w r0, r0, r1, lsl #10
  1988. 8021798: ebb0 2f41 cmp.w r0, r1, lsl #9
  1989. 802179c: bf00 nop
  1990. 802179e: eb42 0202 adc.w r2, r2, r2
  1991. 80217a2: bf28 it cs
  1992. 80217a4: eba0 2041 subcs.w r0, r0, r1, lsl #9
  1993. 80217a8: ebb0 2f01 cmp.w r0, r1, lsl #8
  1994. 80217ac: bf00 nop
  1995. 80217ae: eb42 0202 adc.w r2, r2, r2
  1996. 80217b2: bf28 it cs
  1997. 80217b4: eba0 2001 subcs.w r0, r0, r1, lsl #8
  1998. 80217b8: ebb0 1fc1 cmp.w r0, r1, lsl #7
  1999. 80217bc: bf00 nop
  2000. 80217be: eb42 0202 adc.w r2, r2, r2
  2001. 80217c2: bf28 it cs
  2002. 80217c4: eba0 10c1 subcs.w r0, r0, r1, lsl #7
  2003. 80217c8: ebb0 1f81 cmp.w r0, r1, lsl #6
  2004. 80217cc: bf00 nop
  2005. 80217ce: eb42 0202 adc.w r2, r2, r2
  2006. 80217d2: bf28 it cs
  2007. 80217d4: eba0 1081 subcs.w r0, r0, r1, lsl #6
  2008. 80217d8: ebb0 1f41 cmp.w r0, r1, lsl #5
  2009. 80217dc: bf00 nop
  2010. 80217de: eb42 0202 adc.w r2, r2, r2
  2011. 80217e2: bf28 it cs
  2012. 80217e4: eba0 1041 subcs.w r0, r0, r1, lsl #5
  2013. 80217e8: ebb0 1f01 cmp.w r0, r1, lsl #4
  2014. 80217ec: bf00 nop
  2015. 80217ee: eb42 0202 adc.w r2, r2, r2
  2016. 80217f2: bf28 it cs
  2017. 80217f4: eba0 1001 subcs.w r0, r0, r1, lsl #4
  2018. 80217f8: ebb0 0fc1 cmp.w r0, r1, lsl #3
  2019. 80217fc: bf00 nop
  2020. 80217fe: eb42 0202 adc.w r2, r2, r2
  2021. 8021802: bf28 it cs
  2022. 8021804: eba0 00c1 subcs.w r0, r0, r1, lsl #3
  2023. 8021808: ebb0 0f81 cmp.w r0, r1, lsl #2
  2024. 802180c: bf00 nop
  2025. 802180e: eb42 0202 adc.w r2, r2, r2
  2026. 8021812: bf28 it cs
  2027. 8021814: eba0 0081 subcs.w r0, r0, r1, lsl #2
  2028. 8021818: ebb0 0f41 cmp.w r0, r1, lsl #1
  2029. 802181c: bf00 nop
  2030. 802181e: eb42 0202 adc.w r2, r2, r2
  2031. 8021822: bf28 it cs
  2032. 8021824: eba0 0041 subcs.w r0, r0, r1, lsl #1
  2033. 8021828: ebb0 0f01 cmp.w r0, r1
  2034. 802182c: bf00 nop
  2035. 802182e: eb42 0202 adc.w r2, r2, r2
  2036. 8021832: bf28 it cs
  2037. 8021834: eba0 0001 subcs.w r0, r0, r1
  2038. 8021838: 4610 mov r0, r2
  2039. 802183a: 4770 bx lr
  2040. 802183c: bf0c ite eq
  2041. 802183e: 2001 moveq r0, #1
  2042. 8021840: 2000 movne r0, #0
  2043. 8021842: 4770 bx lr
  2044. 8021844: fab1 f281 clz r2, r1
  2045. 8021848: f1c2 021f rsb r2, r2, #31
  2046. 802184c: fa20 f002 lsr.w r0, r0, r2
  2047. 8021850: 4770 bx lr
  2048. 8021852: b108 cbz r0, 8021858 <__aeabi_uidiv+0x258>
  2049. 8021854: f04f 30ff mov.w r0, #4294967295
  2050. 8021858: f7ff bb8e b.w 8020f78 <__aeabi_idiv0>
  2051. 0802185c <__aeabi_uidivmod>:
  2052. 802185c: 2900 cmp r1, #0
  2053. 802185e: d0f8 beq.n 8021852 <__aeabi_uidiv+0x252>
  2054. 8021860: e92d 4003 stmdb sp!, {r0, r1, lr}
  2055. 8021864: f7ff fecc bl 8021600 <__aeabi_uidiv>
  2056. 8021868: e8bd 4006 ldmia.w sp!, {r1, r2, lr}
  2057. 802186c: fb02 f300 mul.w r3, r2, r0
  2058. 8021870: eba1 0103 sub.w r1, r1, r3
  2059. 8021874: 4770 bx lr
  2060. 8021876: bf00 nop
  2061. 08021878 <atof>:
  2062. 8021878: 2100 movs r1, #0
  2063. 802187a: f001 bde7 b.w 802344c <strtod>
  2064. 802187e: bf00 nop
  2065. 08021880 <atoi>:
  2066. 8021880: 2100 movs r1, #0
  2067. 8021882: 220a movs r2, #10
  2068. 8021884: f001 bee2 b.w 802364c <strtol>
  2069. 08021888 <_atoi_r>:
  2070. 8021888: 2200 movs r2, #0
  2071. 802188a: 230a movs r3, #10
  2072. 802188c: f001 be3c b.w 8023508 <_strtol_r>
  2073. 08021890 <__libc_init_array>:
  2074. 8021890: b570 push {r4, r5, r6, lr}
  2075. 8021892: f640 2608 movw r6, #2568 ; 0xa08
  2076. 8021896: f640 2508 movw r5, #2568 ; 0xa08
  2077. 802189a: f6c0 0604 movt r6, #2052 ; 0x804
  2078. 802189e: f6c0 0504 movt r5, #2052 ; 0x804
  2079. 80218a2: 1b76 subs r6, r6, r5
  2080. 80218a4: 10b6 asrs r6, r6, #2
  2081. 80218a6: d007 beq.n 80218b8 <__libc_init_array+0x28>
  2082. 80218a8: 3d04 subs r5, #4
  2083. 80218aa: 2400 movs r4, #0
  2084. 80218ac: f855 3f04 ldr.w r3, [r5, #4]!
  2085. 80218b0: 3401 adds r4, #1
  2086. 80218b2: 4798 blx r3
  2087. 80218b4: 42a6 cmp r6, r4
  2088. 80218b6: d1f9 bne.n 80218ac <__libc_init_array+0x1c>
  2089. 80218b8: f640 260c movw r6, #2572 ; 0xa0c
  2090. 80218bc: f640 2508 movw r5, #2568 ; 0xa08
  2091. 80218c0: f6c0 0604 movt r6, #2052 ; 0x804
  2092. 80218c4: f6c0 0504 movt r5, #2052 ; 0x804
  2093. 80218c8: 1b76 subs r6, r6, r5
  2094. 80218ca: f01f f88d bl 80409e8 <_init>
  2095. 80218ce: 10b6 asrs r6, r6, #2
  2096. 80218d0: d008 beq.n 80218e4 <__libc_init_array+0x54>
  2097. 80218d2: 3d04 subs r5, #4
  2098. 80218d4: 2400 movs r4, #0
  2099. 80218d6: f855 3f04 ldr.w r3, [r5, #4]!
  2100. 80218da: 3401 adds r4, #1
  2101. 80218dc: 4798 blx r3
  2102. 80218de: 42a6 cmp r6, r4
  2103. 80218e0: d1f9 bne.n 80218d6 <__libc_init_array+0x46>
  2104. 80218e2: bd70 pop {r4, r5, r6, pc}
  2105. 80218e4: bd70 pop {r4, r5, r6, pc}
  2106. 80218e6: bf00 nop
  2107. 080218e8 <memcmp>:
  2108. 80218e8: 2a03 cmp r2, #3
  2109. 80218ea: b470 push {r4, r5, r6}
  2110. 80218ec: d922 bls.n 8021934 <memcmp+0x4c>
  2111. 80218ee: ea41 0300 orr.w r3, r1, r0
  2112. 80218f2: 079b lsls r3, r3, #30
  2113. 80218f4: d013 beq.n 802191e <memcmp+0x36>
  2114. 80218f6: 7805 ldrb r5, [r0, #0]
  2115. 80218f8: 3a01 subs r2, #1
  2116. 80218fa: 780c ldrb r4, [r1, #0]
  2117. 80218fc: 2300 movs r3, #0
  2118. 80218fe: 42a5 cmp r5, r4
  2119. 8021900: d006 beq.n 8021910 <memcmp+0x28>
  2120. 8021902: e01b b.n 802193c <memcmp+0x54>
  2121. 8021904: f810 5f01 ldrb.w r5, [r0, #1]!
  2122. 8021908: f811 4f01 ldrb.w r4, [r1, #1]!
  2123. 802190c: 42a5 cmp r5, r4
  2124. 802190e: d115 bne.n 802193c <memcmp+0x54>
  2125. 8021910: 4293 cmp r3, r2
  2126. 8021912: f103 0301 add.w r3, r3, #1
  2127. 8021916: d1f5 bne.n 8021904 <memcmp+0x1c>
  2128. 8021918: 2000 movs r0, #0
  2129. 802191a: bc70 pop {r4, r5, r6}
  2130. 802191c: 4770 bx lr
  2131. 802191e: 460c mov r4, r1
  2132. 8021920: 4603 mov r3, r0
  2133. 8021922: 3104 adds r1, #4
  2134. 8021924: 3004 adds r0, #4
  2135. 8021926: 681e ldr r6, [r3, #0]
  2136. 8021928: 6825 ldr r5, [r4, #0]
  2137. 802192a: 42ae cmp r6, r5
  2138. 802192c: d108 bne.n 8021940 <memcmp+0x58>
  2139. 802192e: 3a04 subs r2, #4
  2140. 8021930: 2a03 cmp r2, #3
  2141. 8021932: d8f4 bhi.n 802191e <memcmp+0x36>
  2142. 8021934: 2a00 cmp r2, #0
  2143. 8021936: d1de bne.n 80218f6 <memcmp+0xe>
  2144. 8021938: 4610 mov r0, r2
  2145. 802193a: e7ee b.n 802191a <memcmp+0x32>
  2146. 802193c: 1b28 subs r0, r5, r4
  2147. 802193e: e7ec b.n 802191a <memcmp+0x32>
  2148. 8021940: 4621 mov r1, r4
  2149. 8021942: 4618 mov r0, r3
  2150. 8021944: 2a00 cmp r2, #0
  2151. 8021946: d1d6 bne.n 80218f6 <memcmp+0xe>
  2152. 8021948: e7f6 b.n 8021938 <memcmp+0x50>
  2153. 802194a: bf00 nop
  2154. 0802194c <memcpy>:
  2155. 802194c: 2a03 cmp r2, #3
  2156. 802194e: e92d 0ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp}
  2157. 8021952: d809 bhi.n 8021968 <memcpy+0x1c>
  2158. 8021954: b12a cbz r2, 8021962 <memcpy+0x16>
  2159. 8021956: 2300 movs r3, #0
  2160. 8021958: 5ccc ldrb r4, [r1, r3]
  2161. 802195a: 54c4 strb r4, [r0, r3]
  2162. 802195c: 3301 adds r3, #1
  2163. 802195e: 4293 cmp r3, r2
  2164. 8021960: d1fa bne.n 8021958 <memcpy+0xc>
  2165. 8021962: e8bd 0ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp}
  2166. 8021966: 4770 bx lr
  2167. 8021968: 0783 lsls r3, r0, #30
  2168. 802196a: 4402 add r2, r0
  2169. 802196c: d00e beq.n 802198c <memcpy+0x40>
  2170. 802196e: 1c44 adds r4, r0, #1
  2171. 8021970: 1c4d adds r5, r1, #1
  2172. 8021972: f815 7c01 ldrb.w r7, [r5, #-1]
  2173. 8021976: f004 0603 and.w r6, r4, #3
  2174. 802197a: 4623 mov r3, r4
  2175. 802197c: 3401 adds r4, #1
  2176. 802197e: 4629 mov r1, r5
  2177. 8021980: 3501 adds r5, #1
  2178. 8021982: f804 7c02 strb.w r7, [r4, #-2]
  2179. 8021986: 2e00 cmp r6, #0
  2180. 8021988: d1f3 bne.n 8021972 <memcpy+0x26>
  2181. 802198a: e000 b.n 802198e <memcpy+0x42>
  2182. 802198c: 4603 mov r3, r0
  2183. 802198e: f011 0403 ands.w r4, r1, #3
  2184. 8021992: d06d beq.n 8021a70 <memcpy+0x124>
  2185. 8021994: 1ad7 subs r7, r2, r3
  2186. 8021996: 1b0d subs r5, r1, r4
  2187. 8021998: 2f03 cmp r7, #3
  2188. 802199a: 682e ldr r6, [r5, #0]
  2189. 802199c: dd19 ble.n 80219d2 <memcpy+0x86>
  2190. 802199e: f1c4 0c04 rsb ip, r4, #4
  2191. 80219a2: ea4f 08c4 mov.w r8, r4, lsl #3
  2192. 80219a6: 1d1c adds r4, r3, #4
  2193. 80219a8: ea4f 0ccc mov.w ip, ip, lsl #3
  2194. 80219ac: f855 7f04 ldr.w r7, [r5, #4]!
  2195. 80219b0: ebc4 0902 rsb r9, r4, r2
  2196. 80219b4: 4623 mov r3, r4
  2197. 80219b6: 3104 adds r1, #4
  2198. 80219b8: 3404 adds r4, #4
  2199. 80219ba: f1b9 0f03 cmp.w r9, #3
  2200. 80219be: fa26 fa08 lsr.w sl, r6, r8
  2201. 80219c2: fa07 fb0c lsl.w fp, r7, ip
  2202. 80219c6: 463e mov r6, r7
  2203. 80219c8: ea4b 070a orr.w r7, fp, sl
  2204. 80219cc: f844 7c08 str.w r7, [r4, #-8]
  2205. 80219d0: dcec bgt.n 80219ac <memcpy+0x60>
  2206. 80219d2: 429a cmp r2, r3
  2207. 80219d4: d9c5 bls.n 8021962 <memcpy+0x16>
  2208. 80219d6: 3301 adds r3, #1
  2209. 80219d8: 3101 adds r1, #1
  2210. 80219da: 3201 adds r2, #1
  2211. 80219dc: f811 4c01 ldrb.w r4, [r1, #-1]
  2212. 80219e0: 3301 adds r3, #1
  2213. 80219e2: 3101 adds r1, #1
  2214. 80219e4: 4293 cmp r3, r2
  2215. 80219e6: f803 4c02 strb.w r4, [r3, #-2]
  2216. 80219ea: d1f7 bne.n 80219dc <memcpy+0x90>
  2217. 80219ec: e7b9 b.n 8021962 <memcpy+0x16>
  2218. 80219ee: 680c ldr r4, [r1, #0]
  2219. 80219f0: 3340 adds r3, #64 ; 0x40
  2220. 80219f2: 3140 adds r1, #64 ; 0x40
  2221. 80219f4: f843 4c40 str.w r4, [r3, #-64]
  2222. 80219f8: f851 4c3c ldr.w r4, [r1, #-60]
  2223. 80219fc: f843 4c3c str.w r4, [r3, #-60]
  2224. 8021a00: f851 4c38 ldr.w r4, [r1, #-56]
  2225. 8021a04: f843 4c38 str.w r4, [r3, #-56]
  2226. 8021a08: f851 4c34 ldr.w r4, [r1, #-52]
  2227. 8021a0c: f843 4c34 str.w r4, [r3, #-52]
  2228. 8021a10: f851 4c30 ldr.w r4, [r1, #-48]
  2229. 8021a14: f843 4c30 str.w r4, [r3, #-48]
  2230. 8021a18: f851 4c2c ldr.w r4, [r1, #-44]
  2231. 8021a1c: f843 4c2c str.w r4, [r3, #-44]
  2232. 8021a20: f851 4c28 ldr.w r4, [r1, #-40]
  2233. 8021a24: f843 4c28 str.w r4, [r3, #-40]
  2234. 8021a28: f851 4c24 ldr.w r4, [r1, #-36]
  2235. 8021a2c: f843 4c24 str.w r4, [r3, #-36]
  2236. 8021a30: f851 4c20 ldr.w r4, [r1, #-32]
  2237. 8021a34: f843 4c20 str.w r4, [r3, #-32]
  2238. 8021a38: f851 4c1c ldr.w r4, [r1, #-28]
  2239. 8021a3c: f843 4c1c str.w r4, [r3, #-28]
  2240. 8021a40: f851 4c18 ldr.w r4, [r1, #-24]
  2241. 8021a44: f843 4c18 str.w r4, [r3, #-24]
  2242. 8021a48: f851 4c14 ldr.w r4, [r1, #-20]
  2243. 8021a4c: f843 4c14 str.w r4, [r3, #-20]
  2244. 8021a50: f851 4c10 ldr.w r4, [r1, #-16]
  2245. 8021a54: f843 4c10 str.w r4, [r3, #-16]
  2246. 8021a58: f851 4c0c ldr.w r4, [r1, #-12]
  2247. 8021a5c: f843 4c0c str.w r4, [r3, #-12]
  2248. 8021a60: f851 4c08 ldr.w r4, [r1, #-8]
  2249. 8021a64: f843 4c08 str.w r4, [r3, #-8]
  2250. 8021a68: f851 4c04 ldr.w r4, [r1, #-4]
  2251. 8021a6c: f843 4c04 str.w r4, [r3, #-4]
  2252. 8021a70: 1ad4 subs r4, r2, r3
  2253. 8021a72: 2c3f cmp r4, #63 ; 0x3f
  2254. 8021a74: dcbb bgt.n 80219ee <memcpy+0xa2>
  2255. 8021a76: e011 b.n 8021a9c <memcpy+0x150>
  2256. 8021a78: 680c ldr r4, [r1, #0]
  2257. 8021a7a: 3310 adds r3, #16
  2258. 8021a7c: 3110 adds r1, #16
  2259. 8021a7e: f843 4c10 str.w r4, [r3, #-16]
  2260. 8021a82: f851 4c0c ldr.w r4, [r1, #-12]
  2261. 8021a86: f843 4c0c str.w r4, [r3, #-12]
  2262. 8021a8a: f851 4c08 ldr.w r4, [r1, #-8]
  2263. 8021a8e: f843 4c08 str.w r4, [r3, #-8]
  2264. 8021a92: f851 4c04 ldr.w r4, [r1, #-4]
  2265. 8021a96: f843 4c04 str.w r4, [r3, #-4]
  2266. 8021a9a: 1ad4 subs r4, r2, r3
  2267. 8021a9c: 2c0f cmp r4, #15
  2268. 8021a9e: dceb bgt.n 8021a78 <memcpy+0x12c>
  2269. 8021aa0: 2c03 cmp r4, #3
  2270. 8021aa2: dd96 ble.n 80219d2 <memcpy+0x86>
  2271. 8021aa4: 1d1c adds r4, r3, #4
  2272. 8021aa6: 1d0d adds r5, r1, #4
  2273. 8021aa8: f855 7c04 ldr.w r7, [r5, #-4]
  2274. 8021aac: 1b16 subs r6, r2, r4
  2275. 8021aae: 4623 mov r3, r4
  2276. 8021ab0: 4629 mov r1, r5
  2277. 8021ab2: 3404 adds r4, #4
  2278. 8021ab4: 3504 adds r5, #4
  2279. 8021ab6: 2e03 cmp r6, #3
  2280. 8021ab8: f844 7c08 str.w r7, [r4, #-8]
  2281. 8021abc: dcf4 bgt.n 8021aa8 <memcpy+0x15c>
  2282. 8021abe: e788 b.n 80219d2 <memcpy+0x86>
  2283. 08021ac0 <memset>:
  2284. 8021ac0: 2a03 cmp r2, #3
  2285. 8021ac2: b2c9 uxtb r1, r1
  2286. 8021ac4: b470 push {r4, r5, r6}
  2287. 8021ac6: d808 bhi.n 8021ada <memset+0x1a>
  2288. 8021ac8: b12a cbz r2, 8021ad6 <memset+0x16>
  2289. 8021aca: 4603 mov r3, r0
  2290. 8021acc: 1812 adds r2, r2, r0
  2291. 8021ace: f803 1b01 strb.w r1, [r3], #1
  2292. 8021ad2: 4293 cmp r3, r2
  2293. 8021ad4: d1fb bne.n 8021ace <memset+0xe>
  2294. 8021ad6: bc70 pop {r4, r5, r6}
  2295. 8021ad8: 4770 bx lr
  2296. 8021ada: 0783 lsls r3, r0, #30
  2297. 8021adc: 4402 add r2, r0
  2298. 8021ade: d009 beq.n 8021af4 <memset+0x34>
  2299. 8021ae0: 1c44 adds r4, r0, #1
  2300. 8021ae2: f004 0503 and.w r5, r4, #3
  2301. 8021ae6: 4623 mov r3, r4
  2302. 8021ae8: f804 1c01 strb.w r1, [r4, #-1]
  2303. 8021aec: 3401 adds r4, #1
  2304. 8021aee: 2d00 cmp r5, #0
  2305. 8021af0: d1f7 bne.n 8021ae2 <memset+0x22>
  2306. 8021af2: e000 b.n 8021af6 <memset+0x36>
  2307. 8021af4: 4603 mov r3, r0
  2308. 8021af6: 1ad5 subs r5, r2, r3
  2309. 8021af8: eb01 2401 add.w r4, r1, r1, lsl #8
  2310. 8021afc: 2d3f cmp r5, #63 ; 0x3f
  2311. 8021afe: eb04 4404 add.w r4, r4, r4, lsl #16
  2312. 8021b02: dd2c ble.n 8021b5e <memset+0x9e>
  2313. 8021b04: 601c str r4, [r3, #0]
  2314. 8021b06: 3340 adds r3, #64 ; 0x40
  2315. 8021b08: 1ad5 subs r5, r2, r3
  2316. 8021b0a: f843 4c3c str.w r4, [r3, #-60]
  2317. 8021b0e: 2d3f cmp r5, #63 ; 0x3f
  2318. 8021b10: f843 4c38 str.w r4, [r3, #-56]
  2319. 8021b14: f843 4c34 str.w r4, [r3, #-52]
  2320. 8021b18: f843 4c30 str.w r4, [r3, #-48]
  2321. 8021b1c: f843 4c2c str.w r4, [r3, #-44]
  2322. 8021b20: f843 4c28 str.w r4, [r3, #-40]
  2323. 8021b24: f843 4c24 str.w r4, [r3, #-36]
  2324. 8021b28: f843 4c20 str.w r4, [r3, #-32]
  2325. 8021b2c: f843 4c1c str.w r4, [r3, #-28]
  2326. 8021b30: f843 4c18 str.w r4, [r3, #-24]
  2327. 8021b34: f843 4c14 str.w r4, [r3, #-20]
  2328. 8021b38: f843 4c10 str.w r4, [r3, #-16]
  2329. 8021b3c: f843 4c0c str.w r4, [r3, #-12]
  2330. 8021b40: f843 4c08 str.w r4, [r3, #-8]
  2331. 8021b44: f843 4c04 str.w r4, [r3, #-4]
  2332. 8021b48: dcdc bgt.n 8021b04 <memset+0x44>
  2333. 8021b4a: e008 b.n 8021b5e <memset+0x9e>
  2334. 8021b4c: 601c str r4, [r3, #0]
  2335. 8021b4e: 3310 adds r3, #16
  2336. 8021b50: 1ad5 subs r5, r2, r3
  2337. 8021b52: f843 4c0c str.w r4, [r3, #-12]
  2338. 8021b56: f843 4c08 str.w r4, [r3, #-8]
  2339. 8021b5a: f843 4c04 str.w r4, [r3, #-4]
  2340. 8021b5e: 2d0f cmp r5, #15
  2341. 8021b60: dcf4 bgt.n 8021b4c <memset+0x8c>
  2342. 8021b62: 2d03 cmp r5, #3
  2343. 8021b64: dd08 ble.n 8021b78 <memset+0xb8>
  2344. 8021b66: 1d1d adds r5, r3, #4
  2345. 8021b68: 1b56 subs r6, r2, r5
  2346. 8021b6a: f845 4c04 str.w r4, [r5, #-4]
  2347. 8021b6e: 2e03 cmp r6, #3
  2348. 8021b70: 462b mov r3, r5
  2349. 8021b72: f105 0504 add.w r5, r5, #4
  2350. 8021b76: dcf7 bgt.n 8021b68 <memset+0xa8>
  2351. 8021b78: 429a cmp r2, r3
  2352. 8021b7a: d9ac bls.n 8021ad6 <memset+0x16>
  2353. 8021b7c: 3301 adds r3, #1
  2354. 8021b7e: 3201 adds r2, #1
  2355. 8021b80: f803 1c01 strb.w r1, [r3, #-1]
  2356. 8021b84: 3301 adds r3, #1
  2357. 8021b86: 4293 cmp r3, r2
  2358. 8021b88: d1fa bne.n 8021b80 <memset+0xc0>
  2359. 8021b8a: e7a4 b.n 8021ad6 <memset+0x16>
  2360. 08021b8c <strcat>:
  2361. 8021b8c: 0783 lsls r3, r0, #30
  2362. 8021b8e: b570 push {r4, r5, r6, lr}
  2363. 8021b90: 4606 mov r6, r0
  2364. 8021b92: d114 bne.n 8021bbe <strcat+0x32>
  2365. 8021b94: 6803 ldr r3, [r0, #0]
  2366. 8021b96: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  2367. 8021b9a: ea22 0303 bic.w r3, r2, r3
  2368. 8021b9e: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  2369. 8021ba2: d10c bne.n 8021bbe <strcat+0x32>
  2370. 8021ba4: 1d03 adds r3, r0, #4
  2371. 8021ba6: 461a mov r2, r3
  2372. 8021ba8: f853 4b04 ldr.w r4, [r3], #4
  2373. 8021bac: f1a4 3501 sub.w r5, r4, #16843009 ; 0x1010101
  2374. 8021bb0: ea25 0404 bic.w r4, r5, r4
  2375. 8021bb4: f014 3f80 tst.w r4, #2155905152 ; 0x80808080
  2376. 8021bb8: d0f5 beq.n 8021ba6 <strcat+0x1a>
  2377. 8021bba: 4610 mov r0, r2
  2378. 8021bbc: e000 b.n 8021bc0 <strcat+0x34>
  2379. 8021bbe: 4630 mov r0, r6
  2380. 8021bc0: 7803 ldrb r3, [r0, #0]
  2381. 8021bc2: b12b cbz r3, 8021bd0 <strcat+0x44>
  2382. 8021bc4: 1c43 adds r3, r0, #1
  2383. 8021bc6: 4618 mov r0, r3
  2384. 8021bc8: 3301 adds r3, #1
  2385. 8021bca: 7804 ldrb r4, [r0, #0]
  2386. 8021bcc: 2c00 cmp r4, #0
  2387. 8021bce: d1fa bne.n 8021bc6 <strcat+0x3a>
  2388. 8021bd0: f000 f8f0 bl 8021db4 <strcpy>
  2389. 8021bd4: 4630 mov r0, r6
  2390. 8021bd6: bd70 pop {r4, r5, r6, pc}
  2391. 08021bd8 <strcmp>:
  2392. 8021bd8: ea80 0201 eor.w r2, r0, r1
  2393. 8021bdc: f012 0f03 tst.w r2, #3
  2394. 8021be0: f040 803a bne.w 8021c58 <strcmp_unaligned>
  2395. 8021be4: f010 0203 ands.w r2, r0, #3
  2396. 8021be8: f020 0003 bic.w r0, r0, #3
  2397. 8021bec: f021 0103 bic.w r1, r1, #3
  2398. 8021bf0: f850 cb04 ldr.w ip, [r0], #4
  2399. 8021bf4: bf08 it eq
  2400. 8021bf6: f851 3b04 ldreq.w r3, [r1], #4
  2401. 8021bfa: d00d beq.n 8021c18 <strcmp+0x40>
  2402. 8021bfc: f082 0203 eor.w r2, r2, #3
  2403. 8021c00: ea4f 02c2 mov.w r2, r2, lsl #3
  2404. 8021c04: f06f 437f mvn.w r3, #4278190080 ; 0xff000000
  2405. 8021c08: fa23 f202 lsr.w r2, r3, r2
  2406. 8021c0c: f851 3b04 ldr.w r3, [r1], #4
  2407. 8021c10: ea4c 0c02 orr.w ip, ip, r2
  2408. 8021c14: ea43 0302 orr.w r3, r3, r2
  2409. 8021c18: f1ac 3201 sub.w r2, ip, #16843009 ; 0x1010101
  2410. 8021c1c: 459c cmp ip, r3
  2411. 8021c1e: bf01 itttt eq
  2412. 8021c20: ea22 020c biceq.w r2, r2, ip
  2413. 8021c24: f012 3f80 tsteq.w r2, #2155905152 ; 0x80808080
  2414. 8021c28: f850 cb04 ldreq.w ip, [r0], #4
  2415. 8021c2c: f851 3b04 ldreq.w r3, [r1], #4
  2416. 8021c30: d0f2 beq.n 8021c18 <strcmp+0x40>
  2417. 8021c32: ea4f 600c mov.w r0, ip, lsl #24
  2418. 8021c36: ea4f 2c1c mov.w ip, ip, lsr #8
  2419. 8021c3a: 2801 cmp r0, #1
  2420. 8021c3c: bf28 it cs
  2421. 8021c3e: ebb0 6f03 cmpcs.w r0, r3, lsl #24
  2422. 8021c42: bf08 it eq
  2423. 8021c44: 0a1b lsreq r3, r3, #8
  2424. 8021c46: d0f4 beq.n 8021c32 <strcmp+0x5a>
  2425. 8021c48: f003 03ff and.w r3, r3, #255 ; 0xff
  2426. 8021c4c: ea4f 6010 mov.w r0, r0, lsr #24
  2427. 8021c50: eba0 0003 sub.w r0, r0, r3
  2428. 8021c54: 4770 bx lr
  2429. 8021c56: bf00 nop
  2430. 08021c58 <strcmp_unaligned>:
  2431. 8021c58: f010 0f03 tst.w r0, #3
  2432. 8021c5c: d00a beq.n 8021c74 <strcmp_unaligned+0x1c>
  2433. 8021c5e: f810 2b01 ldrb.w r2, [r0], #1
  2434. 8021c62: f811 3b01 ldrb.w r3, [r1], #1
  2435. 8021c66: 2a01 cmp r2, #1
  2436. 8021c68: bf28 it cs
  2437. 8021c6a: 429a cmpcs r2, r3
  2438. 8021c6c: d0f4 beq.n 8021c58 <strcmp_unaligned>
  2439. 8021c6e: eba2 0003 sub.w r0, r2, r3
  2440. 8021c72: 4770 bx lr
  2441. 8021c74: f84d 5d04 str.w r5, [sp, #-4]!
  2442. 8021c78: f84d 4d04 str.w r4, [sp, #-4]!
  2443. 8021c7c: f04f 0201 mov.w r2, #1
  2444. 8021c80: ea42 2202 orr.w r2, r2, r2, lsl #8
  2445. 8021c84: ea42 4202 orr.w r2, r2, r2, lsl #16
  2446. 8021c88: f001 0c03 and.w ip, r1, #3
  2447. 8021c8c: f021 0103 bic.w r1, r1, #3
  2448. 8021c90: f850 4b04 ldr.w r4, [r0], #4
  2449. 8021c94: f851 5b04 ldr.w r5, [r1], #4
  2450. 8021c98: f1bc 0f02 cmp.w ip, #2
  2451. 8021c9c: d026 beq.n 8021cec <strcmp_unaligned+0x94>
  2452. 8021c9e: d84b bhi.n 8021d38 <strcmp_unaligned+0xe0>
  2453. 8021ca0: f024 4c7f bic.w ip, r4, #4278190080 ; 0xff000000
  2454. 8021ca4: ebbc 2f15 cmp.w ip, r5, lsr #8
  2455. 8021ca8: eba4 0302 sub.w r3, r4, r2
  2456. 8021cac: ea23 0304 bic.w r3, r3, r4
  2457. 8021cb0: d10d bne.n 8021cce <strcmp_unaligned+0x76>
  2458. 8021cb2: ea13 13c2 ands.w r3, r3, r2, lsl #7
  2459. 8021cb6: bf08 it eq
  2460. 8021cb8: f851 5b04 ldreq.w r5, [r1], #4
  2461. 8021cbc: d10a bne.n 8021cd4 <strcmp_unaligned+0x7c>
  2462. 8021cbe: ea8c 0c04 eor.w ip, ip, r4
  2463. 8021cc2: ebbc 6f05 cmp.w ip, r5, lsl #24
  2464. 8021cc6: d10c bne.n 8021ce2 <strcmp_unaligned+0x8a>
  2465. 8021cc8: f850 4b04 ldr.w r4, [r0], #4
  2466. 8021ccc: e7e8 b.n 8021ca0 <strcmp_unaligned+0x48>
  2467. 8021cce: ea4f 2515 mov.w r5, r5, lsr #8
  2468. 8021cd2: e05c b.n 8021d8e <strcmp_unaligned+0x136>
  2469. 8021cd4: f033 437f bics.w r3, r3, #4278190080 ; 0xff000000
  2470. 8021cd8: d152 bne.n 8021d80 <strcmp_unaligned+0x128>
  2471. 8021cda: 780d ldrb r5, [r1, #0]
  2472. 8021cdc: ea4f 6c14 mov.w ip, r4, lsr #24
  2473. 8021ce0: e055 b.n 8021d8e <strcmp_unaligned+0x136>
  2474. 8021ce2: ea4f 6c14 mov.w ip, r4, lsr #24
  2475. 8021ce6: f005 05ff and.w r5, r5, #255 ; 0xff
  2476. 8021cea: e050 b.n 8021d8e <strcmp_unaligned+0x136>
  2477. 8021cec: ea4f 4c04 mov.w ip, r4, lsl #16
  2478. 8021cf0: eba4 0302 sub.w r3, r4, r2
  2479. 8021cf4: ea4f 4c1c mov.w ip, ip, lsr #16
  2480. 8021cf8: ea23 0304 bic.w r3, r3, r4
  2481. 8021cfc: ebbc 4f15 cmp.w ip, r5, lsr #16
  2482. 8021d00: d117 bne.n 8021d32 <strcmp_unaligned+0xda>
  2483. 8021d02: ea13 13c2 ands.w r3, r3, r2, lsl #7
  2484. 8021d06: bf08 it eq
  2485. 8021d08: f851 5b04 ldreq.w r5, [r1], #4
  2486. 8021d0c: d107 bne.n 8021d1e <strcmp_unaligned+0xc6>
  2487. 8021d0e: ea8c 0c04 eor.w ip, ip, r4
  2488. 8021d12: ebbc 4f05 cmp.w ip, r5, lsl #16
  2489. 8021d16: d108 bne.n 8021d2a <strcmp_unaligned+0xd2>
  2490. 8021d18: f850 4b04 ldr.w r4, [r0], #4
  2491. 8021d1c: e7e6 b.n 8021cec <strcmp_unaligned+0x94>
  2492. 8021d1e: 041b lsls r3, r3, #16
  2493. 8021d20: d12e bne.n 8021d80 <strcmp_unaligned+0x128>
  2494. 8021d22: 880d ldrh r5, [r1, #0]
  2495. 8021d24: ea4f 4c14 mov.w ip, r4, lsr #16
  2496. 8021d28: e031 b.n 8021d8e <strcmp_unaligned+0x136>
  2497. 8021d2a: ea4f 4505 mov.w r5, r5, lsl #16
  2498. 8021d2e: ea4f 4c14 mov.w ip, r4, lsr #16
  2499. 8021d32: ea4f 4515 mov.w r5, r5, lsr #16
  2500. 8021d36: e02a b.n 8021d8e <strcmp_unaligned+0x136>
  2501. 8021d38: f004 0cff and.w ip, r4, #255 ; 0xff
  2502. 8021d3c: ebbc 6f15 cmp.w ip, r5, lsr #24
  2503. 8021d40: eba4 0302 sub.w r3, r4, r2
  2504. 8021d44: ea23 0304 bic.w r3, r3, r4
  2505. 8021d48: d10d bne.n 8021d66 <strcmp_unaligned+0x10e>
  2506. 8021d4a: ea13 13c2 ands.w r3, r3, r2, lsl #7
  2507. 8021d4e: bf08 it eq
  2508. 8021d50: f851 5b04 ldreq.w r5, [r1], #4
  2509. 8021d54: d10a bne.n 8021d6c <strcmp_unaligned+0x114>
  2510. 8021d56: ea8c 0c04 eor.w ip, ip, r4
  2511. 8021d5a: ebbc 2f05 cmp.w ip, r5, lsl #8
  2512. 8021d5e: d10a bne.n 8021d76 <strcmp_unaligned+0x11e>
  2513. 8021d60: f850 4b04 ldr.w r4, [r0], #4
  2514. 8021d64: e7e8 b.n 8021d38 <strcmp_unaligned+0xe0>
  2515. 8021d66: ea4f 6515 mov.w r5, r5, lsr #24
  2516. 8021d6a: e010 b.n 8021d8e <strcmp_unaligned+0x136>
  2517. 8021d6c: f014 0fff tst.w r4, #255 ; 0xff
  2518. 8021d70: d006 beq.n 8021d80 <strcmp_unaligned+0x128>
  2519. 8021d72: f851 5b04 ldr.w r5, [r1], #4
  2520. 8021d76: ea4f 2c14 mov.w ip, r4, lsr #8
  2521. 8021d7a: f025 457f bic.w r5, r5, #4278190080 ; 0xff000000
  2522. 8021d7e: e006 b.n 8021d8e <strcmp_unaligned+0x136>
  2523. 8021d80: f04f 0000 mov.w r0, #0
  2524. 8021d84: f85d 4b04 ldr.w r4, [sp], #4
  2525. 8021d88: f85d 5b04 ldr.w r5, [sp], #4
  2526. 8021d8c: 4770 bx lr
  2527. 8021d8e: f00c 02ff and.w r2, ip, #255 ; 0xff
  2528. 8021d92: f005 00ff and.w r0, r5, #255 ; 0xff
  2529. 8021d96: 2801 cmp r0, #1
  2530. 8021d98: bf28 it cs
  2531. 8021d9a: 4290 cmpcs r0, r2
  2532. 8021d9c: bf04 itt eq
  2533. 8021d9e: ea4f 2c1c moveq.w ip, ip, lsr #8
  2534. 8021da2: 0a2d lsreq r5, r5, #8
  2535. 8021da4: d0f3 beq.n 8021d8e <strcmp_unaligned+0x136>
  2536. 8021da6: eba2 0000 sub.w r0, r2, r0
  2537. 8021daa: f85d 4b04 ldr.w r4, [sp], #4
  2538. 8021dae: f85d 5b04 ldr.w r5, [sp], #4
  2539. 8021db2: 4770 bx lr
  2540. 08021db4 <strcpy>:
  2541. 8021db4: ea80 0201 eor.w r2, r0, r1
  2542. 8021db8: 4684 mov ip, r0
  2543. 8021dba: f012 0f03 tst.w r2, #3
  2544. 8021dbe: d14f bne.n 8021e60 <strcpy+0xac>
  2545. 8021dc0: f011 0f03 tst.w r1, #3
  2546. 8021dc4: d132 bne.n 8021e2c <strcpy+0x78>
  2547. 8021dc6: f84d 4d04 str.w r4, [sp, #-4]!
  2548. 8021dca: f011 0f04 tst.w r1, #4
  2549. 8021dce: f851 3b04 ldr.w r3, [r1], #4
  2550. 8021dd2: d00b beq.n 8021dec <strcpy+0x38>
  2551. 8021dd4: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  2552. 8021dd8: 439a bics r2, r3
  2553. 8021dda: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  2554. 8021dde: bf04 itt eq
  2555. 8021de0: f84c 3b04 streq.w r3, [ip], #4
  2556. 8021de4: f851 3b04 ldreq.w r3, [r1], #4
  2557. 8021de8: d116 bne.n 8021e18 <strcpy+0x64>
  2558. 8021dea: bf00 nop
  2559. 8021dec: f851 4b04 ldr.w r4, [r1], #4
  2560. 8021df0: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  2561. 8021df4: 439a bics r2, r3
  2562. 8021df6: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  2563. 8021dfa: f1a4 3201 sub.w r2, r4, #16843009 ; 0x1010101
  2564. 8021dfe: d10b bne.n 8021e18 <strcpy+0x64>
  2565. 8021e00: f84c 3b04 str.w r3, [ip], #4
  2566. 8021e04: 43a2 bics r2, r4
  2567. 8021e06: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  2568. 8021e0a: bf04 itt eq
  2569. 8021e0c: f851 3b04 ldreq.w r3, [r1], #4
  2570. 8021e10: f84c 4b04 streq.w r4, [ip], #4
  2571. 8021e14: d0ea beq.n 8021dec <strcpy+0x38>
  2572. 8021e16: 4623 mov r3, r4
  2573. 8021e18: f80c 3b01 strb.w r3, [ip], #1
  2574. 8021e1c: f013 0fff tst.w r3, #255 ; 0xff
  2575. 8021e20: ea4f 2333 mov.w r3, r3, ror #8
  2576. 8021e24: d1f8 bne.n 8021e18 <strcpy+0x64>
  2577. 8021e26: f85d 4b04 ldr.w r4, [sp], #4
  2578. 8021e2a: 4770 bx lr
  2579. 8021e2c: f011 0f01 tst.w r1, #1
  2580. 8021e30: d006 beq.n 8021e40 <strcpy+0x8c>
  2581. 8021e32: f811 2b01 ldrb.w r2, [r1], #1
  2582. 8021e36: f80c 2b01 strb.w r2, [ip], #1
  2583. 8021e3a: 2a00 cmp r2, #0
  2584. 8021e3c: bf08 it eq
  2585. 8021e3e: 4770 bxeq lr
  2586. 8021e40: f011 0f02 tst.w r1, #2
  2587. 8021e44: d0bf beq.n 8021dc6 <strcpy+0x12>
  2588. 8021e46: f831 2b02 ldrh.w r2, [r1], #2
  2589. 8021e4a: f012 0fff tst.w r2, #255 ; 0xff
  2590. 8021e4e: bf16 itet ne
  2591. 8021e50: f82c 2b02 strhne.w r2, [ip], #2
  2592. 8021e54: f88c 2000 strbeq.w r2, [ip]
  2593. 8021e58: f412 4f7f tstne.w r2, #65280 ; 0xff00
  2594. 8021e5c: d1b3 bne.n 8021dc6 <strcpy+0x12>
  2595. 8021e5e: 4770 bx lr
  2596. 8021e60: f811 2b01 ldrb.w r2, [r1], #1
  2597. 8021e64: f80c 2b01 strb.w r2, [ip], #1
  2598. 8021e68: 2a00 cmp r2, #0
  2599. 8021e6a: d1f9 bne.n 8021e60 <strcpy+0xac>
  2600. 8021e6c: 4770 bx lr
  2601. 8021e6e: bf00 nop
  2602. 08021e70 <strlen>:
  2603. 8021e70: f020 0103 bic.w r1, r0, #3
  2604. 8021e74: f010 0003 ands.w r0, r0, #3
  2605. 8021e78: f1c0 0000 rsb r0, r0, #0
  2606. 8021e7c: f851 3b04 ldr.w r3, [r1], #4
  2607. 8021e80: f100 0c04 add.w ip, r0, #4
  2608. 8021e84: ea4f 0ccc mov.w ip, ip, lsl #3
  2609. 8021e88: f06f 0200 mvn.w r2, #0
  2610. 8021e8c: bf1c itt ne
  2611. 8021e8e: fa22 f20c lsrne.w r2, r2, ip
  2612. 8021e92: 4313 orrne r3, r2
  2613. 8021e94: f04f 0c01 mov.w ip, #1
  2614. 8021e98: ea4c 2c0c orr.w ip, ip, ip, lsl #8
  2615. 8021e9c: ea4c 4c0c orr.w ip, ip, ip, lsl #16
  2616. 8021ea0: eba3 020c sub.w r2, r3, ip
  2617. 8021ea4: ea22 0203 bic.w r2, r2, r3
  2618. 8021ea8: ea12 12cc ands.w r2, r2, ip, lsl #7
  2619. 8021eac: bf04 itt eq
  2620. 8021eae: f851 3b04 ldreq.w r3, [r1], #4
  2621. 8021eb2: 3004 addeq r0, #4
  2622. 8021eb4: d0f4 beq.n 8021ea0 <strlen+0x30>
  2623. 8021eb6: f013 0fff tst.w r3, #255 ; 0xff
  2624. 8021eba: bf1f itttt ne
  2625. 8021ebc: 3001 addne r0, #1
  2626. 8021ebe: f413 4f7f tstne.w r3, #65280 ; 0xff00
  2627. 8021ec2: 3001 addne r0, #1
  2628. 8021ec4: f413 0f7f tstne.w r3, #16711680 ; 0xff0000
  2629. 8021ec8: bf18 it ne
  2630. 8021eca: 3001 addne r0, #1
  2631. 8021ecc: 4770 bx lr
  2632. 8021ece: bf00 nop
  2633. 08021ed0 <strncat>:
  2634. 8021ed0: 0783 lsls r3, r0, #30
  2635. 8021ed2: b470 push {r4, r5, r6}
  2636. 8021ed4: d113 bne.n 8021efe <strncat+0x2e>
  2637. 8021ed6: 6803 ldr r3, [r0, #0]
  2638. 8021ed8: f1a3 3401 sub.w r4, r3, #16843009 ; 0x1010101
  2639. 8021edc: ea24 0303 bic.w r3, r4, r3
  2640. 8021ee0: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  2641. 8021ee4: d10b bne.n 8021efe <strncat+0x2e>
  2642. 8021ee6: 1d03 adds r3, r0, #4
  2643. 8021ee8: 461d mov r5, r3
  2644. 8021eea: f853 4b04 ldr.w r4, [r3], #4
  2645. 8021eee: f1a4 3601 sub.w r6, r4, #16843009 ; 0x1010101
  2646. 8021ef2: ea26 0404 bic.w r4, r6, r4
  2647. 8021ef6: f014 3f80 tst.w r4, #2155905152 ; 0x80808080
  2648. 8021efa: d0f5 beq.n 8021ee8 <strncat+0x18>
  2649. 8021efc: e000 b.n 8021f00 <strncat+0x30>
  2650. 8021efe: 4605 mov r5, r0
  2651. 8021f00: 782b ldrb r3, [r5, #0]
  2652. 8021f02: b12b cbz r3, 8021f10 <strncat+0x40>
  2653. 8021f04: 1c6b adds r3, r5, #1
  2654. 8021f06: 461d mov r5, r3
  2655. 8021f08: 3301 adds r3, #1
  2656. 8021f0a: 782c ldrb r4, [r5, #0]
  2657. 8021f0c: 2c00 cmp r4, #0
  2658. 8021f0e: d1fa bne.n 8021f06 <strncat+0x36>
  2659. 8021f10: 3901 subs r1, #1
  2660. 8021f12: 3d01 subs r5, #1
  2661. 8021f14: 1e53 subs r3, r2, #1
  2662. 8021f16: b15a cbz r2, 8021f30 <strncat+0x60>
  2663. 8021f18: f811 4f01 ldrb.w r4, [r1, #1]!
  2664. 8021f1c: 461a mov r2, r3
  2665. 8021f1e: f805 4f01 strb.w r4, [r5, #1]!
  2666. 8021f22: b12c cbz r4, 8021f30 <strncat+0x60>
  2667. 8021f24: 2b00 cmp r3, #0
  2668. 8021f26: d1f5 bne.n 8021f14 <strncat+0x44>
  2669. 8021f28: 706b strb r3, [r5, #1]
  2670. 8021f2a: 1e53 subs r3, r2, #1
  2671. 8021f2c: 2a00 cmp r2, #0
  2672. 8021f2e: d1f3 bne.n 8021f18 <strncat+0x48>
  2673. 8021f30: bc70 pop {r4, r5, r6}
  2674. 8021f32: 4770 bx lr
  2675. 08021f34 <strncmp>:
  2676. 8021f34: b470 push {r4, r5, r6}
  2677. 8021f36: 2a00 cmp r2, #0
  2678. 8021f38: d045 beq.n 8021fc6 <strncmp+0x92>
  2679. 8021f3a: ea41 0300 orr.w r3, r1, r0
  2680. 8021f3e: f013 0303 ands.w r3, r3, #3
  2681. 8021f42: d129 bne.n 8021f98 <strncmp+0x64>
  2682. 8021f44: 2a03 cmp r2, #3
  2683. 8021f46: d927 bls.n 8021f98 <strncmp+0x64>
  2684. 8021f48: 6805 ldr r5, [r0, #0]
  2685. 8021f4a: 680c ldr r4, [r1, #0]
  2686. 8021f4c: 42a5 cmp r5, r4
  2687. 8021f4e: d123 bne.n 8021f98 <strncmp+0x64>
  2688. 8021f50: 1f14 subs r4, r2, #4
  2689. 8021f52: d03a beq.n 8021fca <strncmp+0x96>
  2690. 8021f54: f1a5 3201 sub.w r2, r5, #16843009 ; 0x1010101
  2691. 8021f58: ea22 0505 bic.w r5, r2, r5
  2692. 8021f5c: f015 3f80 tst.w r5, #2155905152 ; 0x80808080
  2693. 8021f60: d00d beq.n 8021f7e <strncmp+0x4a>
  2694. 8021f62: e03a b.n 8021fda <strncmp+0xa6>
  2695. 8021f64: 685b ldr r3, [r3, #4]
  2696. 8021f66: 686a ldr r2, [r5, #4]
  2697. 8021f68: f1a3 3501 sub.w r5, r3, #16843009 ; 0x1010101
  2698. 8021f6c: 4293 cmp r3, r2
  2699. 8021f6e: ea25 0503 bic.w r5, r5, r3
  2700. 8021f72: d12e bne.n 8021fd2 <strncmp+0x9e>
  2701. 8021f74: 3c04 subs r4, #4
  2702. 8021f76: d028 beq.n 8021fca <strncmp+0x96>
  2703. 8021f78: f015 3f80 tst.w r5, #2155905152 ; 0x80808080
  2704. 8021f7c: d127 bne.n 8021fce <strncmp+0x9a>
  2705. 8021f7e: 460d mov r5, r1
  2706. 8021f80: 4603 mov r3, r0
  2707. 8021f82: 3104 adds r1, #4
  2708. 8021f84: 3004 adds r0, #4
  2709. 8021f86: 2c03 cmp r4, #3
  2710. 8021f88: d8ec bhi.n 8021f64 <strncmp+0x30>
  2711. 8021f8a: 1e66 subs r6, r4, #1
  2712. 8021f8c: b92c cbnz r4, 8021f9a <strncmp+0x66>
  2713. 8021f8e: 791c ldrb r4, [r3, #4]
  2714. 8021f90: 792a ldrb r2, [r5, #4]
  2715. 8021f92: 1aa0 subs r0, r4, r2
  2716. 8021f94: bc70 pop {r4, r5, r6}
  2717. 8021f96: 4770 bx lr
  2718. 8021f98: 1e56 subs r6, r2, #1
  2719. 8021f9a: 7804 ldrb r4, [r0, #0]
  2720. 8021f9c: 780a ldrb r2, [r1, #0]
  2721. 8021f9e: 4294 cmp r4, r2
  2722. 8021fa0: d1f7 bne.n 8021f92 <strncmp+0x5e>
  2723. 8021fa2: b1c6 cbz r6, 8021fd6 <strncmp+0xa2>
  2724. 8021fa4: b18c cbz r4, 8021fca <strncmp+0x96>
  2725. 8021fa6: 3601 adds r6, #1
  2726. 8021fa8: 1c8b adds r3, r1, #2
  2727. 8021faa: 1989 adds r1, r1, r6
  2728. 8021fac: e004 b.n 8021fb8 <strncmp+0x84>
  2729. 8021fae: 428b cmp r3, r1
  2730. 8021fb0: f103 0301 add.w r3, r3, #1
  2731. 8021fb4: d00b beq.n 8021fce <strncmp+0x9a>
  2732. 8021fb6: b144 cbz r4, 8021fca <strncmp+0x96>
  2733. 8021fb8: f813 2c01 ldrb.w r2, [r3, #-1]
  2734. 8021fbc: f810 4f01 ldrb.w r4, [r0, #1]!
  2735. 8021fc0: 4294 cmp r4, r2
  2736. 8021fc2: d0f4 beq.n 8021fae <strncmp+0x7a>
  2737. 8021fc4: e7e5 b.n 8021f92 <strncmp+0x5e>
  2738. 8021fc6: 4610 mov r0, r2
  2739. 8021fc8: e7e4 b.n 8021f94 <strncmp+0x60>
  2740. 8021fca: 4620 mov r0, r4
  2741. 8021fcc: e7e2 b.n 8021f94 <strncmp+0x60>
  2742. 8021fce: 2000 movs r0, #0
  2743. 8021fd0: e7e0 b.n 8021f94 <strncmp+0x60>
  2744. 8021fd2: 1e66 subs r6, r4, #1
  2745. 8021fd4: e7e1 b.n 8021f9a <strncmp+0x66>
  2746. 8021fd6: 4630 mov r0, r6
  2747. 8021fd8: e7dc b.n 8021f94 <strncmp+0x60>
  2748. 8021fda: 4618 mov r0, r3
  2749. 8021fdc: e7da b.n 8021f94 <strncmp+0x60>
  2750. 8021fde: bf00 nop
  2751. 08021fe0 <strncpy>:
  2752. 8021fe0: ea41 0300 orr.w r3, r1, r0
  2753. 8021fe4: f013 0f03 tst.w r3, #3
  2754. 8021fe8: 4603 mov r3, r0
  2755. 8021fea: b470 push {r4, r5, r6}
  2756. 8021fec: d025 beq.n 802203a <strncpy+0x5a>
  2757. 8021fee: b1aa cbz r2, 802201c <strncpy+0x3c>
  2758. 8021ff0: 780c ldrb r4, [r1, #0]
  2759. 8021ff2: 3a01 subs r2, #1
  2760. 8021ff4: f803 4b01 strb.w r4, [r3], #1
  2761. 8021ff8: b14c cbz r4, 802200e <strncpy+0x2e>
  2762. 8021ffa: 461c mov r4, r3
  2763. 8021ffc: b172 cbz r2, 802201c <strncpy+0x3c>
  2764. 8021ffe: f811 5f01 ldrb.w r5, [r1, #1]!
  2765. 8022002: 3a01 subs r2, #1
  2766. 8022004: f804 5b01 strb.w r5, [r4], #1
  2767. 8022008: 4623 mov r3, r4
  2768. 802200a: 2d00 cmp r5, #0
  2769. 802200c: d1f6 bne.n 8021ffc <strncpy+0x1c>
  2770. 802200e: b12a cbz r2, 802201c <strncpy+0x3c>
  2771. 8022010: 189a adds r2, r3, r2
  2772. 8022012: 2100 movs r1, #0
  2773. 8022014: f803 1b01 strb.w r1, [r3], #1
  2774. 8022018: 4293 cmp r3, r2
  2775. 802201a: d1fb bne.n 8022014 <strncpy+0x34>
  2776. 802201c: bc70 pop {r4, r5, r6}
  2777. 802201e: 4770 bx lr
  2778. 8022020: 460e mov r6, r1
  2779. 8022022: f851 4b04 ldr.w r4, [r1], #4
  2780. 8022026: f1a4 3501 sub.w r5, r4, #16843009 ; 0x1010101
  2781. 802202a: ea25 0504 bic.w r5, r5, r4
  2782. 802202e: f015 3f80 tst.w r5, #2155905152 ; 0x80808080
  2783. 8022032: d105 bne.n 8022040 <strncpy+0x60>
  2784. 8022034: 3a04 subs r2, #4
  2785. 8022036: f843 4b04 str.w r4, [r3], #4
  2786. 802203a: 2a03 cmp r2, #3
  2787. 802203c: d8f0 bhi.n 8022020 <strncpy+0x40>
  2788. 802203e: e7d6 b.n 8021fee <strncpy+0xe>
  2789. 8022040: 4631 mov r1, r6
  2790. 8022042: e7d4 b.n 8021fee <strncpy+0xe>
  2791. 08022044 <strpbrk>:
  2792. 8022044: b4f0 push {r4, r5, r6, r7}
  2793. 8022046: 7804 ldrb r4, [r0, #0]
  2794. 8022048: 2c00 cmp r4, #0
  2795. 802204a: d021 beq.n 8022090 <strpbrk+0x4c>
  2796. 802204c: 780f ldrb r7, [r1, #0]
  2797. 802204e: 4606 mov r6, r0
  2798. 8022050: 4630 mov r0, r6
  2799. 8022052: b1af cbz r7, 8022080 <strpbrk+0x3c>
  2800. 8022054: 42a7 cmp r7, r4
  2801. 8022056: d019 beq.n 802208c <strpbrk+0x48>
  2802. 8022058: 1c4b adds r3, r1, #1
  2803. 802205a: e001 b.n 8022060 <strpbrk+0x1c>
  2804. 802205c: 4294 cmp r4, r2
  2805. 802205e: d009 beq.n 8022074 <strpbrk+0x30>
  2806. 8022060: 461d mov r5, r3
  2807. 8022062: f813 2b01 ldrb.w r2, [r3], #1
  2808. 8022066: 2a00 cmp r2, #0
  2809. 8022068: d1f8 bne.n 802205c <strpbrk+0x18>
  2810. 802206a: 7844 ldrb r4, [r0, #1]
  2811. 802206c: 3601 adds r6, #1
  2812. 802206e: 2c00 cmp r4, #0
  2813. 8022070: d1ee bne.n 8022050 <strpbrk+0xc>
  2814. 8022072: 782a ldrb r2, [r5, #0]
  2815. 8022074: 2a00 cmp r2, #0
  2816. 8022076: bf14 ite ne
  2817. 8022078: 4630 movne r0, r6
  2818. 802207a: 2000 moveq r0, #0
  2819. 802207c: bcf0 pop {r4, r5, r6, r7}
  2820. 802207e: 4770 bx lr
  2821. 8022080: 7844 ldrb r4, [r0, #1]
  2822. 8022082: 460d mov r5, r1
  2823. 8022084: 3601 adds r6, #1
  2824. 8022086: 2c00 cmp r4, #0
  2825. 8022088: d1e2 bne.n 8022050 <strpbrk+0xc>
  2826. 802208a: e7f2 b.n 8022072 <strpbrk+0x2e>
  2827. 802208c: 463a mov r2, r7
  2828. 802208e: e7f1 b.n 8022074 <strpbrk+0x30>
  2829. 8022090: 4620 mov r0, r4
  2830. 8022092: e7f3 b.n 802207c <strpbrk+0x38>
  2831. 08022094 <critical_factorization>:
  2832. 8022094: e92d 07f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl}
  2833. 8022098: 2701 movs r7, #1
  2834. 802209a: 463c mov r4, r7
  2835. 802209c: 2500 movs r5, #0
  2836. 802209e: f04f 36ff mov.w r6, #4294967295
  2837. 80220a2: 1963 adds r3, r4, r5
  2838. 80220a4: eb00 0c06 add.w ip, r0, r6
  2839. 80220a8: 428b cmp r3, r1
  2840. 80220aa: d20d bcs.n 80220c8 <critical_factorization+0x34>
  2841. 80220ac: f81c c004 ldrb.w ip, [ip, r4]
  2842. 80220b0: f810 8003 ldrb.w r8, [r0, r3]
  2843. 80220b4: 45e0 cmp r8, ip
  2844. 80220b6: d22e bcs.n 8022116 <critical_factorization+0x82>
  2845. 80220b8: 2401 movs r4, #1
  2846. 80220ba: 461d mov r5, r3
  2847. 80220bc: 1b9f subs r7, r3, r6
  2848. 80220be: 1963 adds r3, r4, r5
  2849. 80220c0: 428b cmp r3, r1
  2850. 80220c2: eb00 0c06 add.w ip, r0, r6
  2851. 80220c6: d3f1 bcc.n 80220ac <critical_factorization+0x18>
  2852. 80220c8: f04f 0a01 mov.w sl, #1
  2853. 80220cc: 2500 movs r5, #0
  2854. 80220ce: 4654 mov r4, sl
  2855. 80220d0: f04f 3cff mov.w ip, #4294967295
  2856. 80220d4: 6017 str r7, [r2, #0]
  2857. 80220d6: 1963 adds r3, r4, r5
  2858. 80220d8: eb00 080c add.w r8, r0, ip
  2859. 80220dc: 4299 cmp r1, r3
  2860. 80220de: d90e bls.n 80220fe <critical_factorization+0x6a>
  2861. 80220e0: f818 8004 ldrb.w r8, [r8, r4]
  2862. 80220e4: f810 9003 ldrb.w r9, [r0, r3]
  2863. 80220e8: 45c1 cmp r9, r8
  2864. 80220ea: d91a bls.n 8022122 <critical_factorization+0x8e>
  2865. 80220ec: 2401 movs r4, #1
  2866. 80220ee: 461d mov r5, r3
  2867. 80220f0: ebcc 0a03 rsb sl, ip, r3
  2868. 80220f4: 1963 adds r3, r4, r5
  2869. 80220f6: 4299 cmp r1, r3
  2870. 80220f8: eb00 080c add.w r8, r0, ip
  2871. 80220fc: d8f0 bhi.n 80220e0 <critical_factorization+0x4c>
  2872. 80220fe: f10c 0001 add.w r0, ip, #1
  2873. 8022102: 3601 adds r6, #1
  2874. 8022104: 42b0 cmp r0, r6
  2875. 8022106: bf3c itt cc
  2876. 8022108: 46ba movcc sl, r7
  2877. 802210a: 4630 movcc r0, r6
  2878. 802210c: f8c2 a000 str.w sl, [r2]
  2879. 8022110: e8bd 07f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl}
  2880. 8022114: 4770 bx lr
  2881. 8022116: d00b beq.n 8022130 <critical_factorization+0x9c>
  2882. 8022118: 2701 movs r7, #1
  2883. 802211a: 462e mov r6, r5
  2884. 802211c: 463c mov r4, r7
  2885. 802211e: 19ed adds r5, r5, r7
  2886. 8022120: e7bf b.n 80220a2 <critical_factorization+0xe>
  2887. 8022122: d009 beq.n 8022138 <critical_factorization+0xa4>
  2888. 8022124: f04f 0a01 mov.w sl, #1
  2889. 8022128: 46ac mov ip, r5
  2890. 802212a: 4654 mov r4, sl
  2891. 802212c: 4455 add r5, sl
  2892. 802212e: e7d2 b.n 80220d6 <critical_factorization+0x42>
  2893. 8022130: 42bc cmp r4, r7
  2894. 8022132: d005 beq.n 8022140 <critical_factorization+0xac>
  2895. 8022134: 3401 adds r4, #1
  2896. 8022136: e7b4 b.n 80220a2 <critical_factorization+0xe>
  2897. 8022138: 4554 cmp r4, sl
  2898. 802213a: d005 beq.n 8022148 <critical_factorization+0xb4>
  2899. 802213c: 3401 adds r4, #1
  2900. 802213e: e7ca b.n 80220d6 <critical_factorization+0x42>
  2901. 8022140: 4627 mov r7, r4
  2902. 8022142: 461d mov r5, r3
  2903. 8022144: 2401 movs r4, #1
  2904. 8022146: e7ac b.n 80220a2 <critical_factorization+0xe>
  2905. 8022148: 46a2 mov sl, r4
  2906. 802214a: 461d mov r5, r3
  2907. 802214c: 2401 movs r4, #1
  2908. 802214e: e7c2 b.n 80220d6 <critical_factorization+0x42>
  2909. 08022150 <two_way_long_needle>:
  2910. 8022150: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  2911. 8022154: f2ad 4d24 subw sp, sp, #1060 ; 0x424
  2912. 8022158: 4616 mov r6, r2
  2913. 802215a: 4680 mov r8, r0
  2914. 802215c: 460c mov r4, r1
  2915. 802215e: 4610 mov r0, r2
  2916. 8022160: 4619 mov r1, r3
  2917. 8022162: aa07 add r2, sp, #28
  2918. 8022164: 461d mov r5, r3
  2919. 8022166: f7ff ff95 bl 8022094 <critical_factorization>
  2920. 802216a: ab07 add r3, sp, #28
  2921. 802216c: f20d 421c addw r2, sp, #1052 ; 0x41c
  2922. 8022170: 9003 str r0, [sp, #12]
  2923. 8022172: f843 5f04 str.w r5, [r3, #4]!
  2924. 8022176: 4293 cmp r3, r2
  2925. 8022178: d1fb bne.n 8022172 <two_way_long_needle+0x22>
  2926. 802217a: 1e6f subs r7, r5, #1
  2927. 802217c: 2300 movs r3, #0
  2928. 802217e: a808 add r0, sp, #32
  2929. 8022180: b135 cbz r5, 8022190 <two_way_long_needle+0x40>
  2930. 8022182: 5cf2 ldrb r2, [r6, r3]
  2931. 8022184: 1af9 subs r1, r7, r3
  2932. 8022186: 3301 adds r3, #1
  2933. 8022188: 42ab cmp r3, r5
  2934. 802218a: f840 1022 str.w r1, [r0, r2, lsl #2]
  2935. 802218e: d1f8 bne.n 8022182 <two_way_long_needle+0x32>
  2936. 8022190: 9907 ldr r1, [sp, #28]
  2937. 8022192: 4630 mov r0, r6
  2938. 8022194: 9a03 ldr r2, [sp, #12]
  2939. 8022196: 1871 adds r1, r6, r1
  2940. 8022198: f7ff fba6 bl 80218e8 <memcmp>
  2941. 802219c: 2800 cmp r0, #0
  2942. 802219e: d17f bne.n 80222a0 <two_way_long_needle+0x150>
  2943. 80221a0: f8dd c00c ldr.w ip, [sp, #12]
  2944. 80221a4: 4622 mov r2, r4
  2945. 80221a6: 4682 mov sl, r0
  2946. 80221a8: 1e6f subs r7, r5, #1
  2947. 80221aa: f10c 3cff add.w ip, ip, #4294967295
  2948. 80221ae: f8cd c008 str.w ip, [sp, #8]
  2949. 80221b2: 44b4 add ip, r6
  2950. 80221b4: f8cd c014 str.w ip, [sp, #20]
  2951. 80221b8: f8dd c00c ldr.w ip, [sp, #12]
  2952. 80221bc: 4604 mov r4, r0
  2953. 80221be: 9501 str r5, [sp, #4]
  2954. 80221c0: f1cc 0c01 rsb ip, ip, #1
  2955. 80221c4: f8cd c010 str.w ip, [sp, #16]
  2956. 80221c8: e009 b.n 80221de <two_way_long_needle+0x8e>
  2957. 80221ca: b134 cbz r4, 80221da <two_way_long_needle+0x8a>
  2958. 80221cc: 9a07 ldr r2, [sp, #28]
  2959. 80221ce: 4293 cmp r3, r2
  2960. 80221d0: bf3e ittt cc
  2961. 80221d2: 4604 movcc r4, r0
  2962. 80221d4: 9901 ldrcc r1, [sp, #4]
  2963. 80221d6: ebc2 0301 rsbcc r3, r2, r1
  2964. 80221da: 449a add sl, r3
  2965. 80221dc: 462a mov r2, r5
  2966. 80221de: 9b01 ldr r3, [sp, #4]
  2967. 80221e0: eb08 0002 add.w r0, r8, r2
  2968. 80221e4: 2100 movs r1, #0
  2969. 80221e6: eb0a 0503 add.w r5, sl, r3
  2970. 80221ea: 1aaa subs r2, r5, r2
  2971. 80221ec: f002 fa90 bl 8024710 <memchr>
  2972. 80221f0: 2800 cmp r0, #0
  2973. 80221f2: d14f bne.n 8022294 <two_way_long_needle+0x144>
  2974. 80221f4: 2d00 cmp r5, #0
  2975. 80221f6: d04d beq.n 8022294 <two_way_long_needle+0x144>
  2976. 80221f8: eb08 0305 add.w r3, r8, r5
  2977. 80221fc: a908 add r1, sp, #32
  2978. 80221fe: f813 3c01 ldrb.w r3, [r3, #-1]
  2979. 8022202: f851 3023 ldr.w r3, [r1, r3, lsl #2]
  2980. 8022206: 2b00 cmp r3, #0
  2981. 8022208: d1df bne.n 80221ca <two_way_long_needle+0x7a>
  2982. 802220a: 9a03 ldr r2, [sp, #12]
  2983. 802220c: 4294 cmp r4, r2
  2984. 802220e: bf28 it cs
  2985. 8022210: 4622 movcs r2, r4
  2986. 8022212: 42ba cmp r2, r7
  2987. 8022214: d211 bcs.n 802223a <two_way_long_needle+0xea>
  2988. 8022216: eb08 030a add.w r3, r8, sl
  2989. 802221a: f816 c002 ldrb.w ip, [r6, r2]
  2990. 802221e: 18b1 adds r1, r6, r2
  2991. 8022220: 5c98 ldrb r0, [r3, r2]
  2992. 8022222: 4584 cmp ip, r0
  2993. 8022224: d006 beq.n 8022234 <two_way_long_needle+0xe4>
  2994. 8022226: e02f b.n 8022288 <two_way_long_needle+0x138>
  2995. 8022228: f811 0f01 ldrb.w r0, [r1, #1]!
  2996. 802222c: f813 c002 ldrb.w ip, [r3, r2]
  2997. 8022230: 4584 cmp ip, r0
  2998. 8022232: d129 bne.n 8022288 <two_way_long_needle+0x138>
  2999. 8022234: 3201 adds r2, #1
  3000. 8022236: 42ba cmp r2, r7
  3001. 8022238: d3f6 bcc.n 8022228 <two_way_long_needle+0xd8>
  3002. 802223a: 9b03 ldr r3, [sp, #12]
  3003. 802223c: 9802 ldr r0, [sp, #8]
  3004. 802223e: 429c cmp r4, r3
  3005. 8022240: bf28 it cs
  3006. 8022242: 4618 movcs r0, r3
  3007. 8022244: d218 bcs.n 8022278 <two_way_long_needle+0x128>
  3008. 8022246: f8dd c008 ldr.w ip, [sp, #8]
  3009. 802224a: eb08 030a add.w r3, r8, sl
  3010. 802224e: f816 100c ldrb.w r1, [r6, ip]
  3011. 8022252: f813 200c ldrb.w r2, [r3, ip]
  3012. 8022256: 4291 cmp r1, r2
  3013. 8022258: f040 8085 bne.w 8022366 <two_way_long_needle+0x216>
  3014. 802225c: 9a05 ldr r2, [sp, #20]
  3015. 802225e: eb06 0b04 add.w fp, r6, r4
  3016. 8022262: e006 b.n 8022272 <two_way_long_needle+0x122>
  3017. 8022264: f813 c001 ldrb.w ip, [r3, r1]
  3018. 8022268: f812 9d01 ldrb.w r9, [r2, #-1]!
  3019. 802226c: 45e1 cmp r9, ip
  3020. 802226e: d103 bne.n 8022278 <two_way_long_needle+0x128>
  3021. 8022270: 4608 mov r0, r1
  3022. 8022272: 1e41 subs r1, r0, #1
  3023. 8022274: 455a cmp r2, fp
  3024. 8022276: d1f5 bne.n 8022264 <two_way_long_needle+0x114>
  3025. 8022278: 3401 adds r4, #1
  3026. 802227a: 4284 cmp r4, r0
  3027. 802227c: d875 bhi.n 802236a <two_way_long_needle+0x21a>
  3028. 802227e: 9c07 ldr r4, [sp, #28]
  3029. 8022280: 9b01 ldr r3, [sp, #4]
  3030. 8022282: 44a2 add sl, r4
  3031. 8022284: 1b1c subs r4, r3, r4
  3032. 8022286: e7a9 b.n 80221dc <two_way_long_needle+0x8c>
  3033. 8022288: f8dd c010 ldr.w ip, [sp, #16]
  3034. 802228c: 2400 movs r4, #0
  3035. 802228e: 44e2 add sl, ip
  3036. 8022290: 4492 add sl, r2
  3037. 8022292: e7a3 b.n 80221dc <two_way_long_needle+0x8c>
  3038. 8022294: 2000 movs r0, #0
  3039. 8022296: b009 add sp, #36 ; 0x24
  3040. 8022298: f50d 6d80 add.w sp, sp, #1024 ; 0x400
  3041. 802229c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  3042. 80222a0: f8dd c00c ldr.w ip, [sp, #12]
  3043. 80222a4: f04f 0a00 mov.w sl, #0
  3044. 80222a8: f8dd b00c ldr.w fp, [sp, #12]
  3045. 80222ac: f10d 0920 add.w r9, sp, #32
  3046. 80222b0: ebcc 0305 rsb r3, ip, r5
  3047. 80222b4: 1e6f subs r7, r5, #1
  3048. 80222b6: 4563 cmp r3, ip
  3049. 80222b8: bf38 it cc
  3050. 80222ba: 4663 movcc r3, ip
  3051. 80222bc: 4622 mov r2, r4
  3052. 80222be: 3301 adds r3, #1
  3053. 80222c0: 9307 str r3, [sp, #28]
  3054. 80222c2: f10c 33ff add.w r3, ip, #4294967295
  3055. 80222c6: 9301 str r3, [sp, #4]
  3056. 80222c8: 9b03 ldr r3, [sp, #12]
  3057. 80222ca: 44b4 add ip, r6
  3058. 80222cc: f8cd c008 str.w ip, [sp, #8]
  3059. 80222d0: f1c3 0301 rsb r3, r3, #1
  3060. 80222d4: 9304 str r3, [sp, #16]
  3061. 80222d6: eb0a 0405 add.w r4, sl, r5
  3062. 80222da: eb08 0002 add.w r0, r8, r2
  3063. 80222de: 2100 movs r1, #0
  3064. 80222e0: 1aa2 subs r2, r4, r2
  3065. 80222e2: f002 fa15 bl 8024710 <memchr>
  3066. 80222e6: 2800 cmp r0, #0
  3067. 80222e8: d1d4 bne.n 8022294 <two_way_long_needle+0x144>
  3068. 80222ea: 2c00 cmp r4, #0
  3069. 80222ec: d0d2 beq.n 8022294 <two_way_long_needle+0x144>
  3070. 80222ee: eb08 0304 add.w r3, r8, r4
  3071. 80222f2: f813 3c01 ldrb.w r3, [r3, #-1]
  3072. 80222f6: f859 3023 ldr.w r3, [r9, r3, lsl #2]
  3073. 80222fa: bb63 cbnz r3, 8022356 <two_way_long_needle+0x206>
  3074. 80222fc: 45bb cmp fp, r7
  3075. 80222fe: eb08 000a add.w r0, r8, sl
  3076. 8022302: d215 bcs.n 8022330 <two_way_long_needle+0x1e0>
  3077. 8022304: f8dd c008 ldr.w ip, [sp, #8]
  3078. 8022308: f810 300b ldrb.w r3, [r0, fp]
  3079. 802230c: f89c 2000 ldrb.w r2, [ip]
  3080. 8022310: 429a cmp r2, r3
  3081. 8022312: bf18 it ne
  3082. 8022314: 465b movne r3, fp
  3083. 8022316: d121 bne.n 802235c <two_way_long_needle+0x20c>
  3084. 8022318: 9a02 ldr r2, [sp, #8]
  3085. 802231a: 465b mov r3, fp
  3086. 802231c: e005 b.n 802232a <two_way_long_needle+0x1da>
  3087. 802231e: f812 1f01 ldrb.w r1, [r2, #1]!
  3088. 8022322: f810 c003 ldrb.w ip, [r0, r3]
  3089. 8022326: 458c cmp ip, r1
  3090. 8022328: d118 bne.n 802235c <two_way_long_needle+0x20c>
  3091. 802232a: 3301 adds r3, #1
  3092. 802232c: 42bb cmp r3, r7
  3093. 802232e: d3f6 bcc.n 802231e <two_way_long_needle+0x1ce>
  3094. 8022330: 9b01 ldr r3, [sp, #4]
  3095. 8022332: 1c5a adds r2, r3, #1
  3096. 8022334: d0af beq.n 8022296 <two_way_long_needle+0x146>
  3097. 8022336: f8dd c004 ldr.w ip, [sp, #4]
  3098. 802233a: f816 100c ldrb.w r1, [r6, ip]
  3099. 802233e: f810 200c ldrb.w r2, [r0, ip]
  3100. 8022342: 4291 cmp r1, r2
  3101. 8022344: d106 bne.n 8022354 <two_way_long_needle+0x204>
  3102. 8022346: f113 33ff adds.w r3, r3, #4294967295
  3103. 802234a: d3a4 bcc.n 8022296 <two_way_long_needle+0x146>
  3104. 802234c: 5cf1 ldrb r1, [r6, r3]
  3105. 802234e: 5cc2 ldrb r2, [r0, r3]
  3106. 8022350: 4291 cmp r1, r2
  3107. 8022352: d0f8 beq.n 8022346 <two_way_long_needle+0x1f6>
  3108. 8022354: 9b07 ldr r3, [sp, #28]
  3109. 8022356: 449a add sl, r3
  3110. 8022358: 4622 mov r2, r4
  3111. 802235a: e7bc b.n 80222d6 <two_way_long_needle+0x186>
  3112. 802235c: f8dd c010 ldr.w ip, [sp, #16]
  3113. 8022360: 44e2 add sl, ip
  3114. 8022362: 449a add sl, r3
  3115. 8022364: e7f8 b.n 8022358 <two_way_long_needle+0x208>
  3116. 8022366: 9803 ldr r0, [sp, #12]
  3117. 8022368: e786 b.n 8022278 <two_way_long_needle+0x128>
  3118. 802236a: eb08 000a add.w r0, r8, sl
  3119. 802236e: e792 b.n 8022296 <two_way_long_needle+0x146>
  3120. 08022370 <strstr>:
  3121. 8022370: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  3122. 8022374: 4680 mov r8, r0
  3123. 8022376: 7803 ldrb r3, [r0, #0]
  3124. 8022378: b087 sub sp, #28
  3125. 802237a: 460e mov r6, r1
  3126. 802237c: 2b00 cmp r3, #0
  3127. 802237e: f000 80f7 beq.w 8022570 <strstr+0x200>
  3128. 8022382: 780a ldrb r2, [r1, #0]
  3129. 8022384: b19a cbz r2, 80223ae <strstr+0x3e>
  3130. 8022386: 4684 mov ip, r0
  3131. 8022388: 3101 adds r1, #1
  3132. 802238a: 2701 movs r7, #1
  3133. 802238c: e002 b.n 8022394 <strstr+0x24>
  3134. 802238e: f811 2b01 ldrb.w r2, [r1], #1
  3135. 8022392: b15a cbz r2, 80223ac <strstr+0x3c>
  3136. 8022394: 4293 cmp r3, r2
  3137. 8022396: bf14 ite ne
  3138. 8022398: 2700 movne r7, #0
  3139. 802239a: f007 0701 andeq.w r7, r7, #1
  3140. 802239e: f81c 3f01 ldrb.w r3, [ip, #1]!
  3141. 80223a2: 460d mov r5, r1
  3142. 80223a4: 2b00 cmp r3, #0
  3143. 80223a6: d1f2 bne.n 802238e <strstr+0x1e>
  3144. 80223a8: 782b ldrb r3, [r5, #0]
  3145. 80223aa: bb03 cbnz r3, 80223ee <strstr+0x7e>
  3146. 80223ac: b11f cbz r7, 80223b6 <strstr+0x46>
  3147. 80223ae: 4640 mov r0, r8
  3148. 80223b0: b007 add sp, #28
  3149. 80223b2: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  3150. 80223b6: f108 0001 add.w r0, r8, #1
  3151. 80223ba: 7831 ldrb r1, [r6, #0]
  3152. 80223bc: f002 fe92 bl 80250e4 <strchr>
  3153. 80223c0: 1bad subs r5, r5, r6
  3154. 80223c2: 2d01 cmp r5, #1
  3155. 80223c4: bf18 it ne
  3156. 80223c6: 2800 cmpne r0, #0
  3157. 80223c8: 4607 mov r7, r0
  3158. 80223ca: bf08 it eq
  3159. 80223cc: 4680 moveq r8, r0
  3160. 80223ce: d0ee beq.n 80223ae <strstr+0x3e>
  3161. 80223d0: 44a8 add r8, r5
  3162. 80223d2: 4540 cmp r0, r8
  3163. 80223d4: bf94 ite ls
  3164. 80223d6: ebc0 0408 rsbls r4, r0, r8
  3165. 80223da: 2401 movhi r4, #1
  3166. 80223dc: 2d1f cmp r5, #31
  3167. 80223de: d909 bls.n 80223f4 <strstr+0x84>
  3168. 80223e0: 4621 mov r1, r4
  3169. 80223e2: 4632 mov r2, r6
  3170. 80223e4: 462b mov r3, r5
  3171. 80223e6: f7ff feb3 bl 8022150 <two_way_long_needle>
  3172. 80223ea: 4680 mov r8, r0
  3173. 80223ec: e7df b.n 80223ae <strstr+0x3e>
  3174. 80223ee: f04f 0800 mov.w r8, #0
  3175. 80223f2: e7dc b.n 80223ae <strstr+0x3e>
  3176. 80223f4: 4629 mov r1, r5
  3177. 80223f6: aa05 add r2, sp, #20
  3178. 80223f8: 4630 mov r0, r6
  3179. 80223fa: f7ff fe4b bl 8022094 <critical_factorization>
  3180. 80223fe: 9905 ldr r1, [sp, #20]
  3181. 8022400: 1871 adds r1, r6, r1
  3182. 8022402: 9001 str r0, [sp, #4]
  3183. 8022404: 4630 mov r0, r6
  3184. 8022406: 9a01 ldr r2, [sp, #4]
  3185. 8022408: f7ff fa6e bl 80218e8 <memcmp>
  3186. 802240c: 2800 cmp r0, #0
  3187. 802240e: d152 bne.n 80224b6 <strstr+0x146>
  3188. 8022410: 9b01 ldr r3, [sp, #4]
  3189. 8022412: 4683 mov fp, r0
  3190. 8022414: 4680 mov r8, r0
  3191. 8022416: 3b01 subs r3, #1
  3192. 8022418: 9300 str r3, [sp, #0]
  3193. 802241a: 18f3 adds r3, r6, r3
  3194. 802241c: 9303 str r3, [sp, #12]
  3195. 802241e: 9b01 ldr r3, [sp, #4]
  3196. 8022420: f1c3 0301 rsb r3, r3, #1
  3197. 8022424: 9302 str r3, [sp, #8]
  3198. 8022426: 4622 mov r2, r4
  3199. 8022428: eb08 0405 add.w r4, r8, r5
  3200. 802242c: 18b8 adds r0, r7, r2
  3201. 802242e: 2100 movs r1, #0
  3202. 8022430: 1aa2 subs r2, r4, r2
  3203. 8022432: f002 f96d bl 8024710 <memchr>
  3204. 8022436: 2800 cmp r0, #0
  3205. 8022438: d1d9 bne.n 80223ee <strstr+0x7e>
  3206. 802243a: 2c00 cmp r4, #0
  3207. 802243c: d0d7 beq.n 80223ee <strstr+0x7e>
  3208. 802243e: 9b01 ldr r3, [sp, #4]
  3209. 8022440: 459b cmp fp, r3
  3210. 8022442: bf28 it cs
  3211. 8022444: 465b movcs r3, fp
  3212. 8022446: 429d cmp r5, r3
  3213. 8022448: d913 bls.n 8022472 <strstr+0x102>
  3214. 802244a: 18f9 adds r1, r7, r3
  3215. 802244c: 5cf0 ldrb r0, [r6, r3]
  3216. 802244e: 18f2 adds r2, r6, r3
  3217. 8022450: f811 1008 ldrb.w r1, [r1, r8]
  3218. 8022454: 4288 cmp r0, r1
  3219. 8022456: f040 8085 bne.w 8022564 <strstr+0x1f4>
  3220. 802245a: eb07 0c08 add.w ip, r7, r8
  3221. 802245e: e005 b.n 802246c <strstr+0xfc>
  3222. 8022460: f812 1f01 ldrb.w r1, [r2, #1]!
  3223. 8022464: f81c 0003 ldrb.w r0, [ip, r3]
  3224. 8022468: 4288 cmp r0, r1
  3225. 802246a: d17b bne.n 8022564 <strstr+0x1f4>
  3226. 802246c: 3301 adds r3, #1
  3227. 802246e: 429d cmp r5, r3
  3228. 8022470: d8f6 bhi.n 8022460 <strstr+0xf0>
  3229. 8022472: e89d 000a ldmia.w sp, {r1, r3}
  3230. 8022476: 455b cmp r3, fp
  3231. 8022478: d97d bls.n 8022576 <strstr+0x206>
  3232. 802247a: eb07 0908 add.w r9, r7, r8
  3233. 802247e: 5c72 ldrb r2, [r6, r1]
  3234. 8022480: f819 3001 ldrb.w r3, [r9, r1]
  3235. 8022484: 429a cmp r2, r3
  3236. 8022486: d176 bne.n 8022576 <strstr+0x206>
  3237. 8022488: 9b03 ldr r3, [sp, #12]
  3238. 802248a: eb06 0a0b add.w sl, r6, fp
  3239. 802248e: e006 b.n 802249e <strstr+0x12e>
  3240. 8022490: f819 0002 ldrb.w r0, [r9, r2]
  3241. 8022494: f813 cd01 ldrb.w ip, [r3, #-1]!
  3242. 8022498: 4584 cmp ip, r0
  3243. 802249a: d103 bne.n 80224a4 <strstr+0x134>
  3244. 802249c: 4611 mov r1, r2
  3245. 802249e: 1e4a subs r2, r1, #1
  3246. 80224a0: 4553 cmp r3, sl
  3247. 80224a2: d1f5 bne.n 8022490 <strstr+0x120>
  3248. 80224a4: f10b 0b01 add.w fp, fp, #1
  3249. 80224a8: 458b cmp fp, r1
  3250. 80224aa: d866 bhi.n 802257a <strstr+0x20a>
  3251. 80224ac: 9b05 ldr r3, [sp, #20]
  3252. 80224ae: 4498 add r8, r3
  3253. 80224b0: ebc3 0b05 rsb fp, r3, r5
  3254. 80224b4: e7b7 b.n 8022426 <strstr+0xb6>
  3255. 80224b6: 9801 ldr r0, [sp, #4]
  3256. 80224b8: f04f 0b00 mov.w fp, #0
  3257. 80224bc: 4622 mov r2, r4
  3258. 80224be: 1a2b subs r3, r5, r0
  3259. 80224c0: eb06 0900 add.w r9, r6, r0
  3260. 80224c4: f100 38ff add.w r8, r0, #4294967295
  3261. 80224c8: 4682 mov sl, r0
  3262. 80224ca: 4283 cmp r3, r0
  3263. 80224cc: bf38 it cc
  3264. 80224ce: 4603 movcc r3, r0
  3265. 80224d0: 1839 adds r1, r7, r0
  3266. 80224d2: 3301 adds r3, #1
  3267. 80224d4: 9100 str r1, [sp, #0]
  3268. 80224d6: 9305 str r3, [sp, #20]
  3269. 80224d8: f1c0 0301 rsb r3, r0, #1
  3270. 80224dc: 9302 str r3, [sp, #8]
  3271. 80224de: eb0b 0405 add.w r4, fp, r5
  3272. 80224e2: 18b8 adds r0, r7, r2
  3273. 80224e4: 2100 movs r1, #0
  3274. 80224e6: 1aa2 subs r2, r4, r2
  3275. 80224e8: f002 f912 bl 8024710 <memchr>
  3276. 80224ec: 2800 cmp r0, #0
  3277. 80224ee: f47f af7e bne.w 80223ee <strstr+0x7e>
  3278. 80224f2: 2c00 cmp r4, #0
  3279. 80224f4: f43f af7b beq.w 80223ee <strstr+0x7e>
  3280. 80224f8: 4555 cmp r5, sl
  3281. 80224fa: bf98 it ls
  3282. 80224fc: eb07 000b addls.w r0, r7, fp
  3283. 8022500: d914 bls.n 802252c <strstr+0x1bc>
  3284. 8022502: 9800 ldr r0, [sp, #0]
  3285. 8022504: f899 2000 ldrb.w r2, [r9]
  3286. 8022508: f810 300b ldrb.w r3, [r0, fp]
  3287. 802250c: 429a cmp r2, r3
  3288. 802250e: d124 bne.n 802255a <strstr+0x1ea>
  3289. 8022510: 464a mov r2, r9
  3290. 8022512: 4653 mov r3, sl
  3291. 8022514: eb07 000b add.w r0, r7, fp
  3292. 8022518: e005 b.n 8022526 <strstr+0x1b6>
  3293. 802251a: f812 1f01 ldrb.w r1, [r2, #1]!
  3294. 802251e: f810 c003 ldrb.w ip, [r0, r3]
  3295. 8022522: 458c cmp ip, r1
  3296. 8022524: d11a bne.n 802255c <strstr+0x1ec>
  3297. 8022526: 3301 adds r3, #1
  3298. 8022528: 429d cmp r5, r3
  3299. 802252a: d8f6 bhi.n 802251a <strstr+0x1aa>
  3300. 802252c: f1b8 3fff cmp.w r8, #4294967295
  3301. 8022530: 4643 mov r3, r8
  3302. 8022532: f43f af5a beq.w 80223ea <strstr+0x7a>
  3303. 8022536: f816 1008 ldrb.w r1, [r6, r8]
  3304. 802253a: f810 2008 ldrb.w r2, [r0, r8]
  3305. 802253e: 4291 cmp r1, r2
  3306. 8022540: d107 bne.n 8022552 <strstr+0x1e2>
  3307. 8022542: f113 33ff adds.w r3, r3, #4294967295
  3308. 8022546: f4ff af50 bcc.w 80223ea <strstr+0x7a>
  3309. 802254a: 5cf1 ldrb r1, [r6, r3]
  3310. 802254c: 5cc2 ldrb r2, [r0, r3]
  3311. 802254e: 4291 cmp r1, r2
  3312. 8022550: d0f7 beq.n 8022542 <strstr+0x1d2>
  3313. 8022552: 9b05 ldr r3, [sp, #20]
  3314. 8022554: 449b add fp, r3
  3315. 8022556: 4622 mov r2, r4
  3316. 8022558: e7c1 b.n 80224de <strstr+0x16e>
  3317. 802255a: 4653 mov r3, sl
  3318. 802255c: 9a02 ldr r2, [sp, #8]
  3319. 802255e: 4493 add fp, r2
  3320. 8022560: 449b add fp, r3
  3321. 8022562: e7f8 b.n 8022556 <strstr+0x1e6>
  3322. 8022564: 9902 ldr r1, [sp, #8]
  3323. 8022566: f04f 0b00 mov.w fp, #0
  3324. 802256a: 4488 add r8, r1
  3325. 802256c: 4498 add r8, r3
  3326. 802256e: e75a b.n 8022426 <strstr+0xb6>
  3327. 8022570: 460d mov r5, r1
  3328. 8022572: 2701 movs r7, #1
  3329. 8022574: e718 b.n 80223a8 <strstr+0x38>
  3330. 8022576: 9901 ldr r1, [sp, #4]
  3331. 8022578: e794 b.n 80224a4 <strstr+0x134>
  3332. 802257a: 44b8 add r8, r7
  3333. 802257c: e717 b.n 80223ae <strstr+0x3e>
  3334. 802257e: bf00 nop
  3335. 08022580 <_strtod_r>:
  3336. 8022580: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  3337. 8022584: b09d sub sp, #116 ; 0x74
  3338. 8022586: 468c mov ip, r1
  3339. 8022588: 4683 mov fp, r0
  3340. 802258a: 9210 str r2, [sp, #64] ; 0x40
  3341. 802258c: 4662 mov r2, ip
  3342. 802258e: 2000 movs r0, #0
  3343. 8022590: 2100 movs r1, #0
  3344. 8022592: f8cd c05c str.w ip, [sp, #92] ; 0x5c
  3345. 8022596: e9cd 0106 strd r0, r1, [sp, #24]
  3346. 802259a: 4611 mov r1, r2
  3347. 802259c: f812 3b01 ldrb.w r3, [r2], #1
  3348. 80225a0: 2b2d cmp r3, #45 ; 0x2d
  3349. 80225a2: f200 8147 bhi.w 8022834 <_strtod_r+0x2b4>
  3350. 80225a6: e8df f013 tbh [pc, r3, lsl #1]
  3351. 80225aa: 0131 .short 0x0131
  3352. 80225ac: 01450145 .word 0x01450145
  3353. 80225b0: 01450145 .word 0x01450145
  3354. 80225b4: 01450145 .word 0x01450145
  3355. 80225b8: 01450145 .word 0x01450145
  3356. 80225bc: 01640164 .word 0x01640164
  3357. 80225c0: 01640164 .word 0x01640164
  3358. 80225c4: 01450164 .word 0x01450164
  3359. 80225c8: 01450145 .word 0x01450145
  3360. 80225cc: 01450145 .word 0x01450145
  3361. 80225d0: 01450145 .word 0x01450145
  3362. 80225d4: 01450145 .word 0x01450145
  3363. 80225d8: 01450145 .word 0x01450145
  3364. 80225dc: 01450145 .word 0x01450145
  3365. 80225e0: 01450145 .word 0x01450145
  3366. 80225e4: 01450145 .word 0x01450145
  3367. 80225e8: 01640145 .word 0x01640145
  3368. 80225ec: 01450145 .word 0x01450145
  3369. 80225f0: 01450145 .word 0x01450145
  3370. 80225f4: 01450145 .word 0x01450145
  3371. 80225f8: 01450145 .word 0x01450145
  3372. 80225fc: 01450145 .word 0x01450145
  3373. 8022600: 0145012e .word 0x0145012e
  3374. 8022604: 002e .short 0x002e
  3375. 8022606: 2501 movs r5, #1
  3376. 8022608: 9512 str r5, [sp, #72] ; 0x48
  3377. 802260a: 1c4e adds r6, r1, #1
  3378. 802260c: 9617 str r6, [sp, #92] ; 0x5c
  3379. 802260e: 784b ldrb r3, [r1, #1]
  3380. 8022610: 4699 mov r9, r3
  3381. 8022612: 469a mov sl, r3
  3382. 8022614: 2b00 cmp r3, #0
  3383. 8022616: f000 80fc beq.w 8022812 <_strtod_r+0x292>
  3384. 802261a: 2b30 cmp r3, #48 ; 0x30
  3385. 802261c: bf18 it ne
  3386. 802261e: f04f 0900 movne.w r9, #0
  3387. 8022622: f000 8110 beq.w 8022846 <_strtod_r+0x2c6>
  3388. 8022626: 2b2f cmp r3, #47 ; 0x2f
  3389. 8022628: 461d mov r5, r3
  3390. 802262a: f04f 0a00 mov.w sl, #0
  3391. 802262e: f340 84f9 ble.w 8023024 <_strtod_r+0xaa4>
  3392. 8022632: 2b39 cmp r3, #57 ; 0x39
  3393. 8022634: f300 84f6 bgt.w 8023024 <_strtod_r+0xaa4>
  3394. 8022638: 1c72 adds r2, r6, #1
  3395. 802263a: 4657 mov r7, sl
  3396. 802263c: 4654 mov r4, sl
  3397. 802263e: e001 b.n 8022644 <_strtod_r+0xc4>
  3398. 8022640: 2b39 cmp r3, #57 ; 0x39
  3399. 8022642: dc18 bgt.n 8022676 <_strtod_r+0xf6>
  3400. 8022644: eb07 0187 add.w r1, r7, r7, lsl #2
  3401. 8022648: 2c08 cmp r4, #8
  3402. 802264a: eb03 0141 add.w r1, r3, r1, lsl #1
  3403. 802264e: bfd8 it le
  3404. 8022650: f1a1 0730 suble.w r7, r1, #48 ; 0x30
  3405. 8022654: dd07 ble.n 8022666 <_strtod_r+0xe6>
  3406. 8022656: eb0a 018a add.w r1, sl, sl, lsl #2
  3407. 802265a: 2c0f cmp r4, #15
  3408. 802265c: eb03 0341 add.w r3, r3, r1, lsl #1
  3409. 8022660: bfd8 it le
  3410. 8022662: f1a3 0a30 suble.w sl, r3, #48 ; 0x30
  3411. 8022666: 9217 str r2, [sp, #92] ; 0x5c
  3412. 8022668: 4690 mov r8, r2
  3413. 802266a: f812 3b01 ldrb.w r3, [r2], #1
  3414. 802266e: 3401 adds r4, #1
  3415. 8022670: 2b2f cmp r3, #47 ; 0x2f
  3416. 8022672: 461d mov r5, r3
  3417. 8022674: dce4 bgt.n 8022640 <_strtod_r+0xc0>
  3418. 8022676: 4658 mov r0, fp
  3419. 8022678: f8cd c010 str.w ip, [sp, #16]
  3420. 802267c: f001 fd5a bl 8024134 <_localeconv_r>
  3421. 8022680: 6801 ldr r1, [r0, #0]
  3422. 8022682: 4658 mov r0, fp
  3423. 8022684: 9105 str r1, [sp, #20]
  3424. 8022686: f001 fd55 bl 8024134 <_localeconv_r>
  3425. 802268a: 6800 ldr r0, [r0, #0]
  3426. 802268c: f7ff fbf0 bl 8021e70 <strlen>
  3427. 8022690: 9905 ldr r1, [sp, #20]
  3428. 8022692: 4602 mov r2, r0
  3429. 8022694: 4640 mov r0, r8
  3430. 8022696: f7ff fc4d bl 8021f34 <strncmp>
  3431. 802269a: f8dd c010 ldr.w ip, [sp, #16]
  3432. 802269e: 4680 mov r8, r0
  3433. 80226a0: 2800 cmp r0, #0
  3434. 80226a2: f000 8142 beq.w 802292a <_strtod_r+0x3aa>
  3435. 80226a6: 2000 movs r0, #0
  3436. 80226a8: 46a0 mov r8, r4
  3437. 80226aa: 4601 mov r1, r0
  3438. 80226ac: 9009 str r0, [sp, #36] ; 0x24
  3439. 80226ae: f025 0320 bic.w r3, r5, #32
  3440. 80226b2: 2b45 cmp r3, #69 ; 0x45
  3441. 80226b4: f040 80df bne.w 8022876 <_strtod_r+0x2f6>
  3442. 80226b8: ea48 0300 orr.w r3, r8, r0
  3443. 80226bc: ea53 0309 orrs.w r3, r3, r9
  3444. 80226c0: f000 811d beq.w 80228fe <_strtod_r+0x37e>
  3445. 80226c4: f8dd c05c ldr.w ip, [sp, #92] ; 0x5c
  3446. 80226c8: f10c 0301 add.w r3, ip, #1
  3447. 80226cc: 9317 str r3, [sp, #92] ; 0x5c
  3448. 80226ce: f89c 5001 ldrb.w r5, [ip, #1]
  3449. 80226d2: 2d2b cmp r5, #43 ; 0x2b
  3450. 80226d4: f000 84ab beq.w 802302e <_strtod_r+0xaae>
  3451. 80226d8: 2d2d cmp r5, #45 ; 0x2d
  3452. 80226da: f000 833d beq.w 8022d58 <_strtod_r+0x7d8>
  3453. 80226de: 2200 movs r2, #0
  3454. 80226e0: 920a str r2, [sp, #40] ; 0x28
  3455. 80226e2: f1a5 0330 sub.w r3, r5, #48 ; 0x30
  3456. 80226e6: 2b09 cmp r3, #9
  3457. 80226e8: f200 842c bhi.w 8022f44 <_strtod_r+0x9c4>
  3458. 80226ec: 2d30 cmp r5, #48 ; 0x30
  3459. 80226ee: d106 bne.n 80226fe <_strtod_r+0x17e>
  3460. 80226f0: 9b17 ldr r3, [sp, #92] ; 0x5c
  3461. 80226f2: 3301 adds r3, #1
  3462. 80226f4: 9317 str r3, [sp, #92] ; 0x5c
  3463. 80226f6: f813 5b01 ldrb.w r5, [r3], #1
  3464. 80226fa: 2d30 cmp r5, #48 ; 0x30
  3465. 80226fc: d0fa beq.n 80226f4 <_strtod_r+0x174>
  3466. 80226fe: f1a5 0331 sub.w r3, r5, #49 ; 0x31
  3467. 8022702: 2b08 cmp r3, #8
  3468. 8022704: f200 80b7 bhi.w 8022876 <_strtod_r+0x2f6>
  3469. 8022708: 9a17 ldr r2, [sp, #92] ; 0x5c
  3470. 802270a: 3d30 subs r5, #48 ; 0x30
  3471. 802270c: 950d str r5, [sp, #52] ; 0x34
  3472. 802270e: 1c53 adds r3, r2, #1
  3473. 8022710: 9317 str r3, [sp, #92] ; 0x5c
  3474. 8022712: 7855 ldrb r5, [r2, #1]
  3475. 8022714: 920b str r2, [sp, #44] ; 0x2c
  3476. 8022716: 2d2f cmp r5, #47 ; 0x2f
  3477. 8022718: dd16 ble.n 8022748 <_strtod_r+0x1c8>
  3478. 802271a: 2d39 cmp r5, #57 ; 0x39
  3479. 802271c: dc14 bgt.n 8022748 <_strtod_r+0x1c8>
  3480. 802271e: 1c93 adds r3, r2, #2
  3481. 8022720: 910c str r1, [sp, #48] ; 0x30
  3482. 8022722: 9a0d ldr r2, [sp, #52] ; 0x34
  3483. 8022724: e001 b.n 802272a <_strtod_r+0x1aa>
  3484. 8022726: 2d39 cmp r5, #57 ; 0x39
  3485. 8022728: dc0b bgt.n 8022742 <_strtod_r+0x1c2>
  3486. 802272a: 9317 str r3, [sp, #92] ; 0x5c
  3487. 802272c: 4619 mov r1, r3
  3488. 802272e: eb02 0282 add.w r2, r2, r2, lsl #2
  3489. 8022732: 3301 adds r3, #1
  3490. 8022734: eb05 0242 add.w r2, r5, r2, lsl #1
  3491. 8022738: f813 5c01 ldrb.w r5, [r3, #-1]
  3492. 802273c: 3a30 subs r2, #48 ; 0x30
  3493. 802273e: 2d2f cmp r5, #47 ; 0x2f
  3494. 8022740: dcf1 bgt.n 8022726 <_strtod_r+0x1a6>
  3495. 8022742: 460b mov r3, r1
  3496. 8022744: 990c ldr r1, [sp, #48] ; 0x30
  3497. 8022746: 920d str r2, [sp, #52] ; 0x34
  3498. 8022748: 9a0b ldr r2, [sp, #44] ; 0x2c
  3499. 802274a: 1a9b subs r3, r3, r2
  3500. 802274c: 2b08 cmp r3, #8
  3501. 802274e: bfc8 it gt
  3502. 8022750: f644 621f movwgt r2, #19999 ; 0x4e1f
  3503. 8022754: dc05 bgt.n 8022762 <_strtod_r+0x1e2>
  3504. 8022756: 9a0d ldr r2, [sp, #52] ; 0x34
  3505. 8022758: f644 631f movw r3, #19999 ; 0x4e1f
  3506. 802275c: 429a cmp r2, r3
  3507. 802275e: bfa8 it ge
  3508. 8022760: 461a movge r2, r3
  3509. 8022762: 9b0a ldr r3, [sp, #40] ; 0x28
  3510. 8022764: b103 cbz r3, 8022768 <_strtod_r+0x1e8>
  3511. 8022766: 4252 negs r2, r2
  3512. 8022768: f1b8 0f00 cmp.w r8, #0
  3513. 802276c: f000 8088 beq.w 8022880 <_strtod_r+0x300>
  3514. 8022770: 9d09 ldr r5, [sp, #36] ; 0x24
  3515. 8022772: 4638 mov r0, r7
  3516. 8022774: 2c00 cmp r4, #0
  3517. 8022776: bf08 it eq
  3518. 8022778: 4644 moveq r4, r8
  3519. 802277a: 940a str r4, [sp, #40] ; 0x28
  3520. 802277c: 1b52 subs r2, r2, r5
  3521. 802277e: 9209 str r2, [sp, #36] ; 0x24
  3522. 8022780: f7fd fea8 bl 80204d4 <__aeabi_ui2d>
  3523. 8022784: f1b8 0f10 cmp.w r8, #16
  3524. 8022788: bfb4 ite lt
  3525. 802278a: 46c1 movlt r9, r8
  3526. 802278c: f04f 0910 movge.w r9, #16
  3527. 8022790: f1b9 0f09 cmp.w r9, #9
  3528. 8022794: 4602 mov r2, r0
  3529. 8022796: 460b mov r3, r1
  3530. 8022798: e9cd 2306 strd r2, r3, [sp, #24]
  3531. 802279c: dd16 ble.n 80227cc <_strtod_r+0x24c>
  3532. 802279e: f645 4318 movw r3, #23576 ; 0x5c18
  3533. 80227a2: f6c0 0303 movt r3, #2051 ; 0x803
  3534. 80227a6: eb03 03c9 add.w r3, r3, r9, lsl #3
  3535. 80227aa: e953 2312 ldrd r2, r3, [r3, #-72] ; 0x48
  3536. 80227ae: f7fd ff07 bl 80205c0 <__aeabi_dmul>
  3537. 80227b2: 4604 mov r4, r0
  3538. 80227b4: 4650 mov r0, sl
  3539. 80227b6: 460d mov r5, r1
  3540. 80227b8: f7fd fe8c bl 80204d4 <__aeabi_ui2d>
  3541. 80227bc: 4602 mov r2, r0
  3542. 80227be: 460b mov r3, r1
  3543. 80227c0: 4620 mov r0, r4
  3544. 80227c2: 4629 mov r1, r5
  3545. 80227c4: f7fd fd4a bl 802025c <__adddf3>
  3546. 80227c8: e9cd 0106 strd r0, r1, [sp, #24]
  3547. 80227cc: f1b8 0f0f cmp.w r8, #15
  3548. 80227d0: f300 80f2 bgt.w 80229b8 <_strtod_r+0x438>
  3549. 80227d4: 9c09 ldr r4, [sp, #36] ; 0x24
  3550. 80227d6: 2c00 cmp r4, #0
  3551. 80227d8: f000 80a2 beq.w 8022920 <_strtod_r+0x3a0>
  3552. 80227dc: f340 8591 ble.w 8023302 <_strtod_r+0xd82>
  3553. 80227e0: 9d09 ldr r5, [sp, #36] ; 0x24
  3554. 80227e2: 2d16 cmp r5, #22
  3555. 80227e4: f300 8545 bgt.w 8023272 <_strtod_r+0xcf2>
  3556. 80227e8: f645 4118 movw r1, #23576 ; 0x5c18
  3557. 80227ec: e9dd 2306 ldrd r2, r3, [sp, #24]
  3558. 80227f0: f6c0 0103 movt r1, #2051 ; 0x803
  3559. 80227f4: eb01 01c5 add.w r1, r1, r5, lsl #3
  3560. 80227f8: e9d1 0100 ldrd r0, r1, [r1]
  3561. 80227fc: f7fd fee0 bl 80205c0 <__aeabi_dmul>
  3562. 8022800: 4681 mov r9, r0
  3563. 8022802: 468a mov sl, r1
  3564. 8022804: e009 b.n 802281a <_strtod_r+0x29a>
  3565. 8022806: 2400 movs r4, #0
  3566. 8022808: 9412 str r4, [sp, #72] ; 0x48
  3567. 802280a: e6fe b.n 802260a <_strtod_r+0x8a>
  3568. 802280c: f04f 0900 mov.w r9, #0
  3569. 8022810: 46ca mov sl, r9
  3570. 8022812: 2400 movs r4, #0
  3571. 8022814: f8cd c05c str.w ip, [sp, #92] ; 0x5c
  3572. 8022818: 9412 str r4, [sp, #72] ; 0x48
  3573. 802281a: 9c10 ldr r4, [sp, #64] ; 0x40
  3574. 802281c: b10c cbz r4, 8022822 <_strtod_r+0x2a2>
  3575. 802281e: 9b17 ldr r3, [sp, #92] ; 0x5c
  3576. 8022820: 6023 str r3, [r4, #0]
  3577. 8022822: 9d12 ldr r5, [sp, #72] ; 0x48
  3578. 8022824: b10d cbz r5, 802282a <_strtod_r+0x2aa>
  3579. 8022826: f10a 4a00 add.w sl, sl, #2147483648 ; 0x80000000
  3580. 802282a: 4648 mov r0, r9
  3581. 802282c: 4651 mov r1, sl
  3582. 802282e: b01d add sp, #116 ; 0x74
  3583. 8022830: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  3584. 8022834: 2500 movs r5, #0
  3585. 8022836: 2b30 cmp r3, #48 ; 0x30
  3586. 8022838: 460e mov r6, r1
  3587. 802283a: 9512 str r5, [sp, #72] ; 0x48
  3588. 802283c: bf18 it ne
  3589. 802283e: f04f 0900 movne.w r9, #0
  3590. 8022842: f47f aef0 bne.w 8022626 <_strtod_r+0xa6>
  3591. 8022846: 7873 ldrb r3, [r6, #1]
  3592. 8022848: 2b58 cmp r3, #88 ; 0x58
  3593. 802284a: f000 8383 beq.w 8022f54 <_strtod_r+0x9d4>
  3594. 802284e: 1c72 adds r2, r6, #1
  3595. 8022850: 2b78 cmp r3, #120 ; 0x78
  3596. 8022852: f000 837f beq.w 8022f54 <_strtod_r+0x9d4>
  3597. 8022856: 4616 mov r6, r2
  3598. 8022858: 9217 str r2, [sp, #92] ; 0x5c
  3599. 802285a: f812 3b01 ldrb.w r3, [r2], #1
  3600. 802285e: 2b30 cmp r3, #48 ; 0x30
  3601. 8022860: d0f9 beq.n 8022856 <_strtod_r+0x2d6>
  3602. 8022862: f04f 0901 mov.w r9, #1
  3603. 8022866: 2b00 cmp r3, #0
  3604. 8022868: f47f aedd bne.w 8022626 <_strtod_r+0xa6>
  3605. 802286c: 4699 mov r9, r3
  3606. 802286e: 469a mov sl, r3
  3607. 8022870: e7d3 b.n 802281a <_strtod_r+0x29a>
  3608. 8022872: 9217 str r2, [sp, #92] ; 0x5c
  3609. 8022874: e691 b.n 802259a <_strtod_r+0x1a>
  3610. 8022876: 2200 movs r2, #0
  3611. 8022878: f1b8 0f00 cmp.w r8, #0
  3612. 802287c: f47f af78 bne.w 8022770 <_strtod_r+0x1f0>
  3613. 8022880: ea50 0009 orrs.w r0, r0, r9
  3614. 8022884: d14c bne.n 8022920 <_strtod_r+0x3a0>
  3615. 8022886: 2900 cmp r1, #0
  3616. 8022888: d139 bne.n 80228fe <_strtod_r+0x37e>
  3617. 802288a: 3d49 subs r5, #73 ; 0x49
  3618. 802288c: 2d25 cmp r5, #37 ; 0x25
  3619. 802288e: d836 bhi.n 80228fe <_strtod_r+0x37e>
  3620. 8022890: e8df f015 tbh [pc, r5, lsl #1]
  3621. 8022894: 0035026a .word 0x0035026a
  3622. 8022898: 00350035 .word 0x00350035
  3623. 802289c: 00260035 .word 0x00260035
  3624. 80228a0: 00350035 .word 0x00350035
  3625. 80228a4: 00350035 .word 0x00350035
  3626. 80228a8: 00350035 .word 0x00350035
  3627. 80228ac: 00350035 .word 0x00350035
  3628. 80228b0: 00350035 .word 0x00350035
  3629. 80228b4: 00350035 .word 0x00350035
  3630. 80228b8: 00350035 .word 0x00350035
  3631. 80228bc: 00350035 .word 0x00350035
  3632. 80228c0: 00350035 .word 0x00350035
  3633. 80228c4: 00350035 .word 0x00350035
  3634. 80228c8: 00350035 .word 0x00350035
  3635. 80228cc: 00350035 .word 0x00350035
  3636. 80228d0: 00350035 .word 0x00350035
  3637. 80228d4: 0035026a .word 0x0035026a
  3638. 80228d8: 00350035 .word 0x00350035
  3639. 80228dc: 00260035 .word 0x00260035
  3640. 80228e0: 4853 ldr r0, [pc, #332] ; (8022a30 <_strtod_r+0x4b0>)
  3641. 80228e2: 9a17 ldr r2, [sp, #92] ; 0x5c
  3642. 80228e4: f810 1f01 ldrb.w r1, [r0, #1]!
  3643. 80228e8: 4613 mov r3, r2
  3644. 80228ea: b169 cbz r1, 8022908 <_strtod_r+0x388>
  3645. 80228ec: 785b ldrb r3, [r3, #1]
  3646. 80228ee: 3201 adds r2, #1
  3647. 80228f0: 2b40 cmp r3, #64 ; 0x40
  3648. 80228f2: dd02 ble.n 80228fa <_strtod_r+0x37a>
  3649. 80228f4: 2b5a cmp r3, #90 ; 0x5a
  3650. 80228f6: bfd8 it le
  3651. 80228f8: 3320 addle r3, #32
  3652. 80228fa: 428b cmp r3, r1
  3653. 80228fc: d0f2 beq.n 80228e4 <_strtod_r+0x364>
  3654. 80228fe: f8dd 9018 ldr.w r9, [sp, #24]
  3655. 8022902: f8dd a01c ldr.w sl, [sp, #28]
  3656. 8022906: e784 b.n 8022812 <_strtod_r+0x292>
  3657. 8022908: 1c53 adds r3, r2, #1
  3658. 802290a: 9317 str r3, [sp, #92] ; 0x5c
  3659. 802290c: 7853 ldrb r3, [r2, #1]
  3660. 802290e: 2b28 cmp r3, #40 ; 0x28
  3661. 8022910: f000 8575 beq.w 80233fe <_strtod_r+0xe7e>
  3662. 8022914: 2300 movs r3, #0
  3663. 8022916: 9306 str r3, [sp, #24]
  3664. 8022918: 461c mov r4, r3
  3665. 802291a: f6cf 74f8 movt r4, #65528 ; 0xfff8
  3666. 802291e: 9407 str r4, [sp, #28]
  3667. 8022920: f8dd 9018 ldr.w r9, [sp, #24]
  3668. 8022924: f8dd a01c ldr.w sl, [sp, #28]
  3669. 8022928: e777 b.n 802281a <_strtod_r+0x29a>
  3670. 802292a: 4658 mov r0, fp
  3671. 802292c: 9d17 ldr r5, [sp, #92] ; 0x5c
  3672. 802292e: f001 fc01 bl 8024134 <_localeconv_r>
  3673. 8022932: 6800 ldr r0, [r0, #0]
  3674. 8022934: f7ff fa9c bl 8021e70 <strlen>
  3675. 8022938: f8dd c010 ldr.w ip, [sp, #16]
  3676. 802293c: 182b adds r3, r5, r0
  3677. 802293e: 9317 str r3, [sp, #92] ; 0x5c
  3678. 8022940: 5c2d ldrb r5, [r5, r0]
  3679. 8022942: 2c00 cmp r4, #0
  3680. 8022944: f040 819b bne.w 8022c7e <_strtod_r+0x6fe>
  3681. 8022948: 2d30 cmp r5, #48 ; 0x30
  3682. 802294a: 4620 mov r0, r4
  3683. 802294c: d105 bne.n 802295a <_strtod_r+0x3da>
  3684. 802294e: 3301 adds r3, #1
  3685. 8022950: 9317 str r3, [sp, #92] ; 0x5c
  3686. 8022952: 3001 adds r0, #1
  3687. 8022954: 781d ldrb r5, [r3, #0]
  3688. 8022956: 2d30 cmp r5, #48 ; 0x30
  3689. 8022958: d0f9 beq.n 802294e <_strtod_r+0x3ce>
  3690. 802295a: f1a5 0331 sub.w r3, r5, #49 ; 0x31
  3691. 802295e: 2b08 cmp r3, #8
  3692. 8022960: f200 819a bhi.w 8022c98 <_strtod_r+0x718>
  3693. 8022964: 9e17 ldr r6, [sp, #92] ; 0x5c
  3694. 8022966: f04f 0800 mov.w r8, #0
  3695. 802296a: 9009 str r0, [sp, #36] ; 0x24
  3696. 802296c: f1a5 0130 sub.w r1, r5, #48 ; 0x30
  3697. 8022970: 2001 movs r0, #1
  3698. 8022972: 960a str r6, [sp, #40] ; 0x28
  3699. 8022974: 2900 cmp r1, #0
  3700. 8022976: f000 836c beq.w 8023052 <_strtod_r+0xad2>
  3701. 802297a: 9a09 ldr r2, [sp, #36] ; 0x24
  3702. 802297c: 2801 cmp r0, #1
  3703. 802297e: 4402 add r2, r0
  3704. 8022980: 9209 str r2, [sp, #36] ; 0x24
  3705. 8022982: f000 8532 beq.w 80233ea <_strtod_r+0xe6a>
  3706. 8022986: eb08 0200 add.w r2, r8, r0
  3707. 802298a: 4643 mov r3, r8
  3708. 802298c: 3a01 subs r2, #1
  3709. 802298e: f8cd 802c str.w r8, [sp, #44] ; 0x2c
  3710. 8022992: 4690 mov r8, r2
  3711. 8022994: e003 b.n 802299e <_strtod_r+0x41e>
  3712. 8022996: 006f lsls r7, r5, #1
  3713. 8022998: 4543 cmp r3, r8
  3714. 802299a: f000 834b beq.w 8023034 <_strtod_r+0xab4>
  3715. 802299e: 3301 adds r3, #1
  3716. 80229a0: eb07 0587 add.w r5, r7, r7, lsl #2
  3717. 80229a4: 1e5a subs r2, r3, #1
  3718. 80229a6: 2a08 cmp r2, #8
  3719. 80229a8: ddf5 ble.n 8022996 <_strtod_r+0x416>
  3720. 80229aa: eb0a 028a add.w r2, sl, sl, lsl #2
  3721. 80229ae: 2b10 cmp r3, #16
  3722. 80229b0: bfd8 it le
  3723. 80229b2: ea4f 0a42 movle.w sl, r2, lsl #1
  3724. 80229b6: e7ef b.n 8022998 <_strtod_r+0x418>
  3725. 80229b8: 9d09 ldr r5, [sp, #36] ; 0x24
  3726. 80229ba: ebc9 0908 rsb r9, r9, r8
  3727. 80229be: eb05 0409 add.w r4, r5, r9
  3728. 80229c2: 2c00 cmp r4, #0
  3729. 80229c4: f340 83de ble.w 8023184 <_strtod_r+0xc04>
  3730. 80229c8: f014 000f ands.w r0, r4, #15
  3731. 80229cc: d00d beq.n 80229ea <_strtod_r+0x46a>
  3732. 80229ce: f645 4118 movw r1, #23576 ; 0x5c18
  3733. 80229d2: e9dd 2306 ldrd r2, r3, [sp, #24]
  3734. 80229d6: f6c0 0103 movt r1, #2051 ; 0x803
  3735. 80229da: eb01 01c0 add.w r1, r1, r0, lsl #3
  3736. 80229de: e9d1 0100 ldrd r0, r1, [r1]
  3737. 80229e2: f7fd fded bl 80205c0 <__aeabi_dmul>
  3738. 80229e6: e9cd 0106 strd r0, r1, [sp, #24]
  3739. 80229ea: f034 040f bics.w r4, r4, #15
  3740. 80229ee: f040 815f bne.w 8022cb0 <_strtod_r+0x730>
  3741. 80229f2: f8dd 9018 ldr.w r9, [sp, #24]
  3742. 80229f6: f8dd a01c ldr.w sl, [sp, #28]
  3743. 80229fa: 940b str r4, [sp, #44] ; 0x2c
  3744. 80229fc: 9700 str r7, [sp, #0]
  3745. 80229fe: 4658 mov r0, fp
  3746. 8022a00: 4631 mov r1, r6
  3747. 8022a02: 9a0a ldr r2, [sp, #40] ; 0x28
  3748. 8022a04: 4643 mov r3, r8
  3749. 8022a06: f001 ff67 bl 80248d8 <__s2b>
  3750. 8022a0a: 9d09 ldr r5, [sp, #36] ; 0x24
  3751. 8022a0c: 2d00 cmp r5, #0
  3752. 8022a0e: 9011 str r0, [sp, #68] ; 0x44
  3753. 8022a10: f2c0 8472 blt.w 80232f8 <_strtod_r+0xd78>
  3754. 8022a14: 2400 movs r4, #0
  3755. 8022a16: 940d str r4, [sp, #52] ; 0x34
  3756. 8022a18: 9d09 ldr r5, [sp, #36] ; 0x24
  3757. 8022a1a: 9c11 ldr r4, [sp, #68] ; 0x44
  3758. 8022a1c: ea25 75e5 bic.w r5, r5, r5, asr #31
  3759. 8022a20: f8cd 9024 str.w r9, [sp, #36] ; 0x24
  3760. 8022a24: 340c adds r4, #12
  3761. 8022a26: 950e str r5, [sp, #56] ; 0x38
  3762. 8022a28: 9413 str r4, [sp, #76] ; 0x4c
  3763. 8022a2a: f8cd a028 str.w sl, [sp, #40] ; 0x28
  3764. 8022a2e: e073 b.n 8022b18 <_strtod_r+0x598>
  3765. 8022a30: 080409b3 .word 0x080409b3
  3766. 8022a34: 9b0f ldr r3, [sp, #60] ; 0x3c
  3767. 8022a36: 2b00 cmp r3, #0
  3768. 8022a38: f000 81a8 beq.w 8022d8c <_strtod_r+0x80c>
  3769. 8022a3c: f04f 0900 mov.w r9, #0
  3770. 8022a40: 2500 movs r5, #0
  3771. 8022a42: f8dd c01c ldr.w ip, [sp, #28]
  3772. 8022a46: 2400 movs r4, #0
  3773. 8022a48: f6c3 75f0 movt r5, #16368 ; 0x3ff0
  3774. 8022a4c: f6c3 79f0 movt r9, #16368 ; 0x3ff0
  3775. 8022a50: f8cd 8030 str.w r8, [sp, #48] ; 0x30
  3776. 8022a54: f04f 0800 mov.w r8, #0
  3777. 8022a58: 4643 mov r3, r8
  3778. 8022a5a: f6c7 78f0 movt r8, #32752 ; 0x7ff0
  3779. 8022a5e: f6c7 73e0 movt r3, #32736 ; 0x7fe0
  3780. 8022a62: ea0c 0808 and.w r8, ip, r8
  3781. 8022a66: 4598 cmp r8, r3
  3782. 8022a68: f000 81c5 beq.w 8022df6 <_strtod_r+0x876>
  3783. 8022a6c: 9a0b ldr r2, [sp, #44] ; 0x2c
  3784. 8022a6e: f1b8 6fd4 cmp.w r8, #111149056 ; 0x6a00000
  3785. 8022a72: bf8c ite hi
  3786. 8022a74: 2300 movhi r3, #0
  3787. 8022a76: 2301 movls r3, #1
  3788. 8022a78: 2a00 cmp r2, #0
  3789. 8022a7a: bf08 it eq
  3790. 8022a7c: 2300 moveq r3, #0
  3791. 8022a7e: b1eb cbz r3, 8022abc <_strtod_r+0x53c>
  3792. 8022a80: 980c ldr r0, [sp, #48] ; 0x30
  3793. 8022a82: 4649 mov r1, r9
  3794. 8022a84: a388 add r3, pc, #544 ; (adr r3, 8022ca8 <_strtod_r+0x728>)
  3795. 8022a86: e9d3 2300 ldrd r2, r3, [r3]
  3796. 8022a8a: f7fe f815 bl 8020ab8 <__aeabi_dcmple>
  3797. 8022a8e: b188 cbz r0, 8022ab4 <_strtod_r+0x534>
  3798. 8022a90: 980c ldr r0, [sp, #48] ; 0x30
  3799. 8022a92: 4649 mov r1, r9
  3800. 8022a94: f002 fbd6 bl 8025244 <__aeabi_d2uiz>
  3801. 8022a98: 2800 cmp r0, #0
  3802. 8022a9a: f000 8246 beq.w 8022f2a <_strtod_r+0x9aa>
  3803. 8022a9e: f7fd fd19 bl 80204d4 <__aeabi_ui2d>
  3804. 8022aa2: 4689 mov r9, r1
  3805. 8022aa4: 900c str r0, [sp, #48] ; 0x30
  3806. 8022aa6: 9c0f ldr r4, [sp, #60] ; 0x3c
  3807. 8022aa8: f109 4300 add.w r3, r9, #2147483648 ; 0x80000000
  3808. 8022aac: b104 cbz r4, 8022ab0 <_strtod_r+0x530>
  3809. 8022aae: 464b mov r3, r9
  3810. 8022ab0: 9c0c ldr r4, [sp, #48] ; 0x30
  3811. 8022ab2: 461d mov r5, r3
  3812. 8022ab4: f105 63d6 add.w r3, r5, #112197632 ; 0x6b00000
  3813. 8022ab8: ebc8 0503 rsb r5, r8, r3
  3814. 8022abc: 9809 ldr r0, [sp, #36] ; 0x24
  3815. 8022abe: 990a ldr r1, [sp, #40] ; 0x28
  3816. 8022ac0: f002 f98a bl 8024dd8 <__ulp>
  3817. 8022ac4: 4602 mov r2, r0
  3818. 8022ac6: 460b mov r3, r1
  3819. 8022ac8: 4620 mov r0, r4
  3820. 8022aca: 4629 mov r1, r5
  3821. 8022acc: f7fd fd78 bl 80205c0 <__aeabi_dmul>
  3822. 8022ad0: 4602 mov r2, r0
  3823. 8022ad2: 460b mov r3, r1
  3824. 8022ad4: 9809 ldr r0, [sp, #36] ; 0x24
  3825. 8022ad6: 990a ldr r1, [sp, #40] ; 0x28
  3826. 8022ad8: f7fd fbc0 bl 802025c <__adddf3>
  3827. 8022adc: e9cd 0106 strd r0, r1, [sp, #24]
  3828. 8022ae0: 9c07 ldr r4, [sp, #28]
  3829. 8022ae2: 9009 str r0, [sp, #36] ; 0x24
  3830. 8022ae4: 910a str r1, [sp, #40] ; 0x28
  3831. 8022ae6: 9d0b ldr r5, [sp, #44] ; 0x2c
  3832. 8022ae8: b935 cbnz r5, 8022af8 <_strtod_r+0x578>
  3833. 8022aea: 2300 movs r3, #0
  3834. 8022aec: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  3835. 8022af0: 4023 ands r3, r4
  3836. 8022af2: 4598 cmp r8, r3
  3837. 8022af4: f000 81bc beq.w 8022e70 <_strtod_r+0x8f0>
  3838. 8022af8: 4658 mov r0, fp
  3839. 8022afa: 9918 ldr r1, [sp, #96] ; 0x60
  3840. 8022afc: f001 fe8c bl 8024818 <_Bfree>
  3841. 8022b00: 4658 mov r0, fp
  3842. 8022b02: 4651 mov r1, sl
  3843. 8022b04: f001 fe88 bl 8024818 <_Bfree>
  3844. 8022b08: 4658 mov r0, fp
  3845. 8022b0a: 4639 mov r1, r7
  3846. 8022b0c: f001 fe84 bl 8024818 <_Bfree>
  3847. 8022b10: 4658 mov r0, fp
  3848. 8022b12: 4631 mov r1, r6
  3849. 8022b14: f001 fe80 bl 8024818 <_Bfree>
  3850. 8022b18: 9c11 ldr r4, [sp, #68] ; 0x44
  3851. 8022b1a: 4658 mov r0, fp
  3852. 8022b1c: ad16 add r5, sp, #88 ; 0x58
  3853. 8022b1e: 6861 ldr r1, [r4, #4]
  3854. 8022b20: f001 fe44 bl 80247ac <_Balloc>
  3855. 8022b24: 6923 ldr r3, [r4, #16]
  3856. 8022b26: 9913 ldr r1, [sp, #76] ; 0x4c
  3857. 8022b28: 1c9a adds r2, r3, #2
  3858. 8022b2a: 0092 lsls r2, r2, #2
  3859. 8022b2c: 4682 mov sl, r0
  3860. 8022b2e: 300c adds r0, #12
  3861. 8022b30: f7fe ff0c bl 802194c <memcpy>
  3862. 8022b34: 9a09 ldr r2, [sp, #36] ; 0x24
  3863. 8022b36: 9b0a ldr r3, [sp, #40] ; 0x28
  3864. 8022b38: a819 add r0, sp, #100 ; 0x64
  3865. 8022b3a: 9500 str r5, [sp, #0]
  3866. 8022b3c: 9001 str r0, [sp, #4]
  3867. 8022b3e: 4658 mov r0, fp
  3868. 8022b40: f002 f9c4 bl 8024ecc <__d2b>
  3869. 8022b44: 2101 movs r1, #1
  3870. 8022b46: 9018 str r0, [sp, #96] ; 0x60
  3871. 8022b48: 4658 mov r0, fp
  3872. 8022b4a: f001 ff5d bl 8024a08 <__i2b>
  3873. 8022b4e: 9a16 ldr r2, [sp, #88] ; 0x58
  3874. 8022b50: 9b19 ldr r3, [sp, #100] ; 0x64
  3875. 8022b52: f46f 717f mvn.w r1, #1020 ; 0x3fc
  3876. 8022b56: 2a00 cmp r2, #0
  3877. 8022b58: bfaa itet ge
  3878. 8022b5a: 9d0d ldrge r5, [sp, #52] ; 0x34
  3879. 8022b5c: 9c0e ldrlt r4, [sp, #56] ; 0x38
  3880. 8022b5e: 18ac addge r4, r5, r2
  3881. 8022b60: 9d0b ldr r5, [sp, #44] ; 0x2c
  3882. 8022b62: 4607 mov r7, r0
  3883. 8022b64: bfb8 it lt
  3884. 8022b66: ebc2 0004 rsblt r0, r2, r4
  3885. 8022b6a: ebc5 0202 rsb r2, r5, r2
  3886. 8022b6e: bfb8 it lt
  3887. 8022b70: 9c0d ldrlt r4, [sp, #52] ; 0x34
  3888. 8022b72: eb02 0503 add.w r5, r2, r3
  3889. 8022b76: bfa8 it ge
  3890. 8022b78: 980e ldrge r0, [sp, #56] ; 0x38
  3891. 8022b7a: 428d cmp r5, r1
  3892. 8022b7c: 990d ldr r1, [sp, #52] ; 0x34
  3893. 8022b7e: bfb4 ite lt
  3894. 8022b80: f202 4333 addwlt r3, r2, #1075 ; 0x433
  3895. 8022b84: f1c3 0336 rsbge r3, r3, #54 ; 0x36
  3896. 8022b88: 18e6 adds r6, r4, r3
  3897. 8022b8a: 18c3 adds r3, r0, r3
  3898. 8022b8c: 980b ldr r0, [sp, #44] ; 0x2c
  3899. 8022b8e: 181d adds r5, r3, r0
  3900. 8022b90: 42a6 cmp r6, r4
  3901. 8022b92: bfb4 ite lt
  3902. 8022b94: 4633 movlt r3, r6
  3903. 8022b96: 4623 movge r3, r4
  3904. 8022b98: 42ab cmp r3, r5
  3905. 8022b9a: bfa8 it ge
  3906. 8022b9c: 462b movge r3, r5
  3907. 8022b9e: 2b00 cmp r3, #0
  3908. 8022ba0: bfc2 ittt gt
  3909. 8022ba2: ebc3 0606 rsbgt r6, r3, r6
  3910. 8022ba6: ebc3 0505 rsbgt r5, r3, r5
  3911. 8022baa: ebc3 0404 rsbgt r4, r3, r4
  3912. 8022bae: b189 cbz r1, 8022bd4 <_strtod_r+0x654>
  3913. 8022bb0: 460a mov r2, r1
  3914. 8022bb2: 4658 mov r0, fp
  3915. 8022bb4: 4639 mov r1, r7
  3916. 8022bb6: f001 ffcf bl 8024b58 <__pow5mult>
  3917. 8022bba: 9a18 ldr r2, [sp, #96] ; 0x60
  3918. 8022bbc: 4607 mov r7, r0
  3919. 8022bbe: 4658 mov r0, fp
  3920. 8022bc0: 4639 mov r1, r7
  3921. 8022bc2: f001 ff2b bl 8024a1c <__multiply>
  3922. 8022bc6: 9918 ldr r1, [sp, #96] ; 0x60
  3923. 8022bc8: 4680 mov r8, r0
  3924. 8022bca: 4658 mov r0, fp
  3925. 8022bcc: f001 fe24 bl 8024818 <_Bfree>
  3926. 8022bd0: f8cd 8060 str.w r8, [sp, #96] ; 0x60
  3927. 8022bd4: 2e00 cmp r6, #0
  3928. 8022bd6: dd05 ble.n 8022be4 <_strtod_r+0x664>
  3929. 8022bd8: 4658 mov r0, fp
  3930. 8022bda: 9918 ldr r1, [sp, #96] ; 0x60
  3931. 8022bdc: 4632 mov r2, r6
  3932. 8022bde: f002 f80d bl 8024bfc <__lshift>
  3933. 8022be2: 9018 str r0, [sp, #96] ; 0x60
  3934. 8022be4: 9a0e ldr r2, [sp, #56] ; 0x38
  3935. 8022be6: b122 cbz r2, 8022bf2 <_strtod_r+0x672>
  3936. 8022be8: 4651 mov r1, sl
  3937. 8022bea: 4658 mov r0, fp
  3938. 8022bec: f001 ffb4 bl 8024b58 <__pow5mult>
  3939. 8022bf0: 4682 mov sl, r0
  3940. 8022bf2: 2d00 cmp r5, #0
  3941. 8022bf4: dd05 ble.n 8022c02 <_strtod_r+0x682>
  3942. 8022bf6: 4651 mov r1, sl
  3943. 8022bf8: 4658 mov r0, fp
  3944. 8022bfa: 462a mov r2, r5
  3945. 8022bfc: f001 fffe bl 8024bfc <__lshift>
  3946. 8022c00: 4682 mov sl, r0
  3947. 8022c02: 2c00 cmp r4, #0
  3948. 8022c04: dd05 ble.n 8022c12 <_strtod_r+0x692>
  3949. 8022c06: 4639 mov r1, r7
  3950. 8022c08: 4658 mov r0, fp
  3951. 8022c0a: 4622 mov r2, r4
  3952. 8022c0c: f001 fff6 bl 8024bfc <__lshift>
  3953. 8022c10: 4607 mov r7, r0
  3954. 8022c12: 9918 ldr r1, [sp, #96] ; 0x60
  3955. 8022c14: 4652 mov r2, sl
  3956. 8022c16: 4658 mov r0, fp
  3957. 8022c18: f04f 0800 mov.w r8, #0
  3958. 8022c1c: f002 f866 bl 8024cec <__mdiff>
  3959. 8022c20: 4639 mov r1, r7
  3960. 8022c22: 68c4 ldr r4, [r0, #12]
  3961. 8022c24: 4606 mov r6, r0
  3962. 8022c26: f8c0 800c str.w r8, [r0, #12]
  3963. 8022c2a: 940f str r4, [sp, #60] ; 0x3c
  3964. 8022c2c: f002 f840 bl 8024cb0 <__mcmp>
  3965. 8022c30: 4540 cmp r0, r8
  3966. 8022c32: f2c0 8213 blt.w 802305c <_strtod_r+0xadc>
  3967. 8022c36: f000 8261 beq.w 80230fc <_strtod_r+0xb7c>
  3968. 8022c3a: 4630 mov r0, r6
  3969. 8022c3c: 4639 mov r1, r7
  3970. 8022c3e: f002 f9a3 bl 8024f88 <__ratio>
  3971. 8022c42: 2200 movs r2, #0
  3972. 8022c44: f04f 4380 mov.w r3, #1073741824 ; 0x40000000
  3973. 8022c48: 4604 mov r4, r0
  3974. 8022c4a: 460d mov r5, r1
  3975. 8022c4c: f7fd ff34 bl 8020ab8 <__aeabi_dcmple>
  3976. 8022c50: 2800 cmp r0, #0
  3977. 8022c52: f47f aeef bne.w 8022a34 <_strtod_r+0x4b4>
  3978. 8022c56: 2300 movs r3, #0
  3979. 8022c58: 4620 mov r0, r4
  3980. 8022c5a: f6c3 73e0 movt r3, #16352 ; 0x3fe0
  3981. 8022c5e: 4629 mov r1, r5
  3982. 8022c60: 2200 movs r2, #0
  3983. 8022c62: f7fd fcad bl 80205c0 <__aeabi_dmul>
  3984. 8022c66: 9c0f ldr r4, [sp, #60] ; 0x3c
  3985. 8022c68: 900c str r0, [sp, #48] ; 0x30
  3986. 8022c6a: 4689 mov r9, r1
  3987. 8022c6c: f101 4300 add.w r3, r1, #2147483648 ; 0x80000000
  3988. 8022c70: b104 cbz r4, 8022c74 <_strtod_r+0x6f4>
  3989. 8022c72: 460b mov r3, r1
  3990. 8022c74: 9c0c ldr r4, [sp, #48] ; 0x30
  3991. 8022c76: 461d mov r5, r3
  3992. 8022c78: f8dd c01c ldr.w ip, [sp, #28]
  3993. 8022c7c: e6ea b.n 8022a54 <_strtod_r+0x4d4>
  3994. 8022c7e: 4640 mov r0, r8
  3995. 8022c80: 46a0 mov r8, r4
  3996. 8022c82: 9009 str r0, [sp, #36] ; 0x24
  3997. 8022c84: f1a5 0130 sub.w r1, r5, #48 ; 0x30
  3998. 8022c88: 2909 cmp r1, #9
  3999. 8022c8a: d803 bhi.n 8022c94 <_strtod_r+0x714>
  4000. 8022c8c: 9a17 ldr r2, [sp, #92] ; 0x5c
  4001. 8022c8e: 3001 adds r0, #1
  4002. 8022c90: 920a str r2, [sp, #40] ; 0x28
  4003. 8022c92: e66f b.n 8022974 <_strtod_r+0x3f4>
  4004. 8022c94: 2101 movs r1, #1
  4005. 8022c96: e50a b.n 80226ae <_strtod_r+0x12e>
  4006. 8022c98: f04f 0800 mov.w r8, #0
  4007. 8022c9c: 2101 movs r1, #1
  4008. 8022c9e: f8cd 8024 str.w r8, [sp, #36] ; 0x24
  4009. 8022ca2: e504 b.n 80226ae <_strtod_r+0x12e>
  4010. 8022ca4: f3af 8000 nop.w
  4011. 8022ca8: ffc00000 .word 0xffc00000
  4012. 8022cac: 41dfffff .word 0x41dfffff
  4013. 8022cb0: f5b4 7f9a cmp.w r4, #308 ; 0x134
  4014. 8022cb4: f300 8258 bgt.w 8023168 <_strtod_r+0xbe8>
  4015. 8022cb8: 1124 asrs r4, r4, #4
  4016. 8022cba: f645 5a08 movw sl, #23816 ; 0x5d08
  4017. 8022cbe: 2c01 cmp r4, #1
  4018. 8022cc0: f340 8398 ble.w 80233f4 <_strtod_r+0xe74>
  4019. 8022cc4: f6c0 0a03 movt sl, #2051 ; 0x803
  4020. 8022cc8: e9dd 2306 ldrd r2, r3, [sp, #24]
  4021. 8022ccc: f04f 0900 mov.w r9, #0
  4022. 8022cd0: 4655 mov r5, sl
  4023. 8022cd2: f014 0f01 tst.w r4, #1
  4024. 8022cd6: 4610 mov r0, r2
  4025. 8022cd8: 4619 mov r1, r3
  4026. 8022cda: ea4f 0464 mov.w r4, r4, asr #1
  4027. 8022cde: f109 0901 add.w r9, r9, #1
  4028. 8022ce2: d005 beq.n 8022cf0 <_strtod_r+0x770>
  4029. 8022ce4: e9d5 2300 ldrd r2, r3, [r5]
  4030. 8022ce8: f7fd fc6a bl 80205c0 <__aeabi_dmul>
  4031. 8022cec: 4602 mov r2, r0
  4032. 8022cee: 460b mov r3, r1
  4033. 8022cf0: 3508 adds r5, #8
  4034. 8022cf2: 2c01 cmp r4, #1
  4035. 8022cf4: dced bgt.n 8022cd2 <_strtod_r+0x752>
  4036. 8022cf6: 4610 mov r0, r2
  4037. 8022cf8: 4619 mov r1, r3
  4038. 8022cfa: e9cd 0106 strd r0, r1, [sp, #24]
  4039. 8022cfe: 9907 ldr r1, [sp, #28]
  4040. 8022d00: eb0a 09c9 add.w r9, sl, r9, lsl #3
  4041. 8022d04: f1a1 7154 sub.w r1, r1, #55574528 ; 0x3500000
  4042. 8022d08: 9107 str r1, [sp, #28]
  4043. 8022d0a: e9dd 2306 ldrd r2, r3, [sp, #24]
  4044. 8022d0e: e9d9 0100 ldrd r0, r1, [r9]
  4045. 8022d12: f7fd fc55 bl 80205c0 <__aeabi_dmul>
  4046. 8022d16: 2300 movs r3, #0
  4047. 8022d18: 2200 movs r2, #0
  4048. 8022d1a: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  4049. 8022d1e: f6c7 42a0 movt r2, #31904 ; 0x7ca0
  4050. 8022d22: e9cd 0106 strd r0, r1, [sp, #24]
  4051. 8022d26: 9907 ldr r1, [sp, #28]
  4052. 8022d28: 400b ands r3, r1
  4053. 8022d2a: 4293 cmp r3, r2
  4054. 8022d2c: f200 821c bhi.w 8023168 <_strtod_r+0xbe8>
  4055. 8022d30: 2200 movs r2, #0
  4056. 8022d32: f6c7 4290 movt r2, #31888 ; 0x7c90
  4057. 8022d36: 4293 cmp r3, r2
  4058. 8022d38: f240 8305 bls.w 8023346 <_strtod_r+0xdc6>
  4059. 8022d3c: f64f 72ff movw r2, #65535 ; 0xffff
  4060. 8022d40: f04f 30ff mov.w r0, #4294967295
  4061. 8022d44: 4615 mov r5, r2
  4062. 8022d46: 2400 movs r4, #0
  4063. 8022d48: f6c7 75ef movt r5, #32751 ; 0x7fef
  4064. 8022d4c: 940b str r4, [sp, #44] ; 0x2c
  4065. 8022d4e: 9507 str r5, [sp, #28]
  4066. 8022d50: 4681 mov r9, r0
  4067. 8022d52: 9006 str r0, [sp, #24]
  4068. 8022d54: 46aa mov sl, r5
  4069. 8022d56: e651 b.n 80229fc <_strtod_r+0x47c>
  4070. 8022d58: 2301 movs r3, #1
  4071. 8022d5a: 930a str r3, [sp, #40] ; 0x28
  4072. 8022d5c: f10c 0302 add.w r3, ip, #2
  4073. 8022d60: 9317 str r3, [sp, #92] ; 0x5c
  4074. 8022d62: f89c 5002 ldrb.w r5, [ip, #2]
  4075. 8022d66: e4bc b.n 80226e2 <_strtod_r+0x162>
  4076. 8022d68: 48ab ldr r0, [pc, #684] ; (8023018 <_strtod_r+0xa98>)
  4077. 8022d6a: 9a17 ldr r2, [sp, #92] ; 0x5c
  4078. 8022d6c: f810 1f01 ldrb.w r1, [r0, #1]!
  4079. 8022d70: 4613 mov r3, r2
  4080. 8022d72: 2900 cmp r1, #0
  4081. 8022d74: f000 8311 beq.w 802339a <_strtod_r+0xe1a>
  4082. 8022d78: 785b ldrb r3, [r3, #1]
  4083. 8022d7a: 3201 adds r2, #1
  4084. 8022d7c: 2b40 cmp r3, #64 ; 0x40
  4085. 8022d7e: dd02 ble.n 8022d86 <_strtod_r+0x806>
  4086. 8022d80: 2b5a cmp r3, #90 ; 0x5a
  4087. 8022d82: bfd8 it le
  4088. 8022d84: 3320 addle r3, #32
  4089. 8022d86: 428b cmp r3, r1
  4090. 8022d88: d0f0 beq.n 8022d6c <_strtod_r+0x7ec>
  4091. 8022d8a: e5b8 b.n 80228fe <_strtod_r+0x37e>
  4092. 8022d8c: 9b06 ldr r3, [sp, #24]
  4093. 8022d8e: f8dd c01c ldr.w ip, [sp, #28]
  4094. 8022d92: 2b00 cmp r3, #0
  4095. 8022d94: f040 80a6 bne.w 8022ee4 <_strtod_r+0x964>
  4096. 8022d98: f3cc 0313 ubfx r3, ip, #0, #20
  4097. 8022d9c: bb03 cbnz r3, 8022de0 <_strtod_r+0x860>
  4098. 8022d9e: 2300 movs r3, #0
  4099. 8022da0: 4620 mov r0, r4
  4100. 8022da2: 4629 mov r1, r5
  4101. 8022da4: 2200 movs r2, #0
  4102. 8022da6: f6c3 73f0 movt r3, #16368 ; 0x3ff0
  4103. 8022daa: f8cd c010 str.w ip, [sp, #16]
  4104. 8022dae: f7fd fe79 bl 8020aa4 <__aeabi_dcmplt>
  4105. 8022db2: f8dd c010 ldr.w ip, [sp, #16]
  4106. 8022db6: 2800 cmp r0, #0
  4107. 8022db8: f040 8246 bne.w 8023248 <_strtod_r+0xcc8>
  4108. 8022dbc: 2300 movs r3, #0
  4109. 8022dbe: 2200 movs r2, #0
  4110. 8022dc0: f6c3 73e0 movt r3, #16352 ; 0x3fe0
  4111. 8022dc4: 4620 mov r0, r4
  4112. 8022dc6: 4629 mov r1, r5
  4113. 8022dc8: f7fd fbfa bl 80205c0 <__aeabi_dmul>
  4114. 8022dcc: f8dd c010 ldr.w ip, [sp, #16]
  4115. 8022dd0: 4689 mov r9, r1
  4116. 8022dd2: 4602 mov r2, r0
  4117. 8022dd4: f101 4300 add.w r3, r1, #2147483648 ; 0x80000000
  4118. 8022dd8: 900c str r0, [sp, #48] ; 0x30
  4119. 8022dda: 4614 mov r4, r2
  4120. 8022ddc: 461d mov r5, r3
  4121. 8022dde: e639 b.n 8022a54 <_strtod_r+0x4d4>
  4122. 8022de0: f04f 0900 mov.w r9, #0
  4123. 8022de4: 2500 movs r5, #0
  4124. 8022de6: f8cd 9030 str.w r9, [sp, #48] ; 0x30
  4125. 8022dea: 2400 movs r4, #0
  4126. 8022dec: f6cb 75f0 movt r5, #49136 ; 0xbff0
  4127. 8022df0: f6c3 79f0 movt r9, #16368 ; 0x3ff0
  4128. 8022df4: e62e b.n 8022a54 <_strtod_r+0x4d4>
  4129. 8022df6: f1ac 7c54 sub.w ip, ip, #55574528 ; 0x3500000
  4130. 8022dfa: 9a09 ldr r2, [sp, #36] ; 0x24
  4131. 8022dfc: f8cd c01c str.w ip, [sp, #28]
  4132. 8022e00: 9b0a ldr r3, [sp, #40] ; 0x28
  4133. 8022e02: e9dd 0106 ldrd r0, r1, [sp, #24]
  4134. 8022e06: e9cd 4502 strd r4, r5, [sp, #8]
  4135. 8022e0a: 4614 mov r4, r2
  4136. 8022e0c: 461d mov r5, r3
  4137. 8022e0e: e9cd 4514 strd r4, r5, [sp, #80] ; 0x50
  4138. 8022e12: f001 ffe1 bl 8024dd8 <__ulp>
  4139. 8022e16: 4602 mov r2, r0
  4140. 8022e18: 460b mov r3, r1
  4141. 8022e1a: e9dd 0102 ldrd r0, r1, [sp, #8]
  4142. 8022e1e: f7fd fbcf bl 80205c0 <__aeabi_dmul>
  4143. 8022e22: 4602 mov r2, r0
  4144. 8022e24: 460b mov r3, r1
  4145. 8022e26: e9dd 0106 ldrd r0, r1, [sp, #24]
  4146. 8022e2a: f7fd fa17 bl 802025c <__adddf3>
  4147. 8022e2e: 2300 movs r3, #0
  4148. 8022e30: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  4149. 8022e34: f64f 72ff movw r2, #65535 ; 0xffff
  4150. 8022e38: f6c7 429f movt r2, #31903 ; 0x7c9f
  4151. 8022e3c: e9cd 0106 strd r0, r1, [sp, #24]
  4152. 8022e40: 9c07 ldr r4, [sp, #28]
  4153. 8022e42: 4023 ands r3, r4
  4154. 8022e44: 4293 cmp r3, r2
  4155. 8022e46: d976 bls.n 8022f36 <_strtod_r+0x9b6>
  4156. 8022e48: f64f 73ff movw r3, #65535 ; 0xffff
  4157. 8022e4c: 9d15 ldr r5, [sp, #84] ; 0x54
  4158. 8022e4e: f6c7 73ef movt r3, #32751 ; 0x7fef
  4159. 8022e52: 429d cmp r5, r3
  4160. 8022e54: f000 8177 beq.w 8023146 <_strtod_r+0xbc6>
  4161. 8022e58: f64f 71ff movw r1, #65535 ; 0xffff
  4162. 8022e5c: f04f 33ff mov.w r3, #4294967295
  4163. 8022e60: 460a mov r2, r1
  4164. 8022e62: 9306 str r3, [sp, #24]
  4165. 8022e64: f6c7 72ef movt r2, #32751 ; 0x7fef
  4166. 8022e68: 9309 str r3, [sp, #36] ; 0x24
  4167. 8022e6a: 9207 str r2, [sp, #28]
  4168. 8022e6c: 920a str r2, [sp, #40] ; 0x28
  4169. 8022e6e: e643 b.n 8022af8 <_strtod_r+0x578>
  4170. 8022e70: 4649 mov r1, r9
  4171. 8022e72: 980c ldr r0, [sp, #48] ; 0x30
  4172. 8022e74: f7fd fe3e bl 8020af4 <__aeabi_d2iz>
  4173. 8022e78: f7fd fb3c bl 80204f4 <__aeabi_i2d>
  4174. 8022e7c: 4602 mov r2, r0
  4175. 8022e7e: 460b mov r3, r1
  4176. 8022e80: 980c ldr r0, [sp, #48] ; 0x30
  4177. 8022e82: 4649 mov r1, r9
  4178. 8022e84: f7fd f9e8 bl 8020258 <__aeabi_dsub>
  4179. 8022e88: 9d0f ldr r5, [sp, #60] ; 0x3c
  4180. 8022e8a: 4680 mov r8, r0
  4181. 8022e8c: 4689 mov r9, r1
  4182. 8022e8e: 2d00 cmp r5, #0
  4183. 8022e90: d137 bne.n 8022f02 <_strtod_r+0x982>
  4184. 8022e92: 9a06 ldr r2, [sp, #24]
  4185. 8022e94: 2a00 cmp r2, #0
  4186. 8022e96: d134 bne.n 8022f02 <_strtod_r+0x982>
  4187. 8022e98: f3c4 0413 ubfx r4, r4, #0, #20
  4188. 8022e9c: 2c00 cmp r4, #0
  4189. 8022e9e: d130 bne.n 8022f02 <_strtod_r+0x982>
  4190. 8022ea0: a357 add r3, pc, #348 ; (adr r3, 8023000 <_strtod_r+0xa80>)
  4191. 8022ea2: e9d3 2300 ldrd r2, r3, [r3]
  4192. 8022ea6: f7fd fdfd bl 8020aa4 <__aeabi_dcmplt>
  4193. 8022eaa: 2800 cmp r0, #0
  4194. 8022eac: f43f ae24 beq.w 8022af8 <_strtod_r+0x578>
  4195. 8022eb0: 4654 mov r4, sl
  4196. 8022eb2: f8dd 9024 ldr.w r9, [sp, #36] ; 0x24
  4197. 8022eb6: f8dd a028 ldr.w sl, [sp, #40] ; 0x28
  4198. 8022eba: 4658 mov r0, fp
  4199. 8022ebc: 9918 ldr r1, [sp, #96] ; 0x60
  4200. 8022ebe: f001 fcab bl 8024818 <_Bfree>
  4201. 8022ec2: 4658 mov r0, fp
  4202. 8022ec4: 4621 mov r1, r4
  4203. 8022ec6: f001 fca7 bl 8024818 <_Bfree>
  4204. 8022eca: 4658 mov r0, fp
  4205. 8022ecc: 4639 mov r1, r7
  4206. 8022ece: f001 fca3 bl 8024818 <_Bfree>
  4207. 8022ed2: 4658 mov r0, fp
  4208. 8022ed4: 9911 ldr r1, [sp, #68] ; 0x44
  4209. 8022ed6: f001 fc9f bl 8024818 <_Bfree>
  4210. 8022eda: 4658 mov r0, fp
  4211. 8022edc: 4631 mov r1, r6
  4212. 8022ede: f001 fc9b bl 8024818 <_Bfree>
  4213. 8022ee2: e49a b.n 802281a <_strtod_r+0x29a>
  4214. 8022ee4: 2b01 cmp r3, #1
  4215. 8022ee6: f47f af7b bne.w 8022de0 <_strtod_r+0x860>
  4216. 8022eea: 4661 mov r1, ip
  4217. 8022eec: 2900 cmp r1, #0
  4218. 8022eee: f47f af77 bne.w 8022de0 <_strtod_r+0x860>
  4219. 8022ef2: 4654 mov r4, sl
  4220. 8022ef4: f04f 0900 mov.w r9, #0
  4221. 8022ef8: 46ca mov sl, r9
  4222. 8022efa: 2322 movs r3, #34 ; 0x22
  4223. 8022efc: f8cb 3000 str.w r3, [fp]
  4224. 8022f00: e7db b.n 8022eba <_strtod_r+0x93a>
  4225. 8022f02: 4640 mov r0, r8
  4226. 8022f04: 4649 mov r1, r9
  4227. 8022f06: a340 add r3, pc, #256 ; (adr r3, 8023008 <_strtod_r+0xa88>)
  4228. 8022f08: e9d3 2300 ldrd r2, r3, [r3]
  4229. 8022f0c: f7fd fdca bl 8020aa4 <__aeabi_dcmplt>
  4230. 8022f10: 2800 cmp r0, #0
  4231. 8022f12: d1cd bne.n 8022eb0 <_strtod_r+0x930>
  4232. 8022f14: 4640 mov r0, r8
  4233. 8022f16: 4649 mov r1, r9
  4234. 8022f18: a33d add r3, pc, #244 ; (adr r3, 8023010 <_strtod_r+0xa90>)
  4235. 8022f1a: e9d3 2300 ldrd r2, r3, [r3]
  4236. 8022f1e: f7fd fddf bl 8020ae0 <__aeabi_dcmpgt>
  4237. 8022f22: 2800 cmp r0, #0
  4238. 8022f24: f43f ade8 beq.w 8022af8 <_strtod_r+0x578>
  4239. 8022f28: e7c2 b.n 8022eb0 <_strtod_r+0x930>
  4240. 8022f2a: f04f 0900 mov.w r9, #0
  4241. 8022f2e: 900c str r0, [sp, #48] ; 0x30
  4242. 8022f30: f6c3 79f0 movt r9, #16368 ; 0x3ff0
  4243. 8022f34: e5b7 b.n 8022aa6 <_strtod_r+0x526>
  4244. 8022f36: 9906 ldr r1, [sp, #24]
  4245. 8022f38: f104 7454 add.w r4, r4, #55574528 ; 0x3500000
  4246. 8022f3c: 9407 str r4, [sp, #28]
  4247. 8022f3e: 940a str r4, [sp, #40] ; 0x28
  4248. 8022f40: 9109 str r1, [sp, #36] ; 0x24
  4249. 8022f42: e5d0 b.n 8022ae6 <_strtod_r+0x566>
  4250. 8022f44: f8cd c05c str.w ip, [sp, #92] ; 0x5c
  4251. 8022f48: 2200 movs r2, #0
  4252. 8022f4a: f1b8 0f00 cmp.w r8, #0
  4253. 8022f4e: f47f ac0f bne.w 8022770 <_strtod_r+0x1f0>
  4254. 8022f52: e495 b.n 8022880 <_strtod_r+0x300>
  4255. 8022f54: 9d12 ldr r5, [sp, #72] ; 0x48
  4256. 8022f56: f240 0404 movw r4, #4
  4257. 8022f5a: f2c2 0400 movt r4, #8192 ; 0x2000
  4258. 8022f5e: ab18 add r3, sp, #96 ; 0x60
  4259. 8022f60: 4658 mov r0, fp
  4260. 8022f62: e88d 0028 stmia.w sp, {r3, r5}
  4261. 8022f66: a917 add r1, sp, #92 ; 0x5c
  4262. 8022f68: 4622 mov r2, r4
  4263. 8022f6a: ab19 add r3, sp, #100 ; 0x64
  4264. 8022f6c: f000 fd1c bl 80239a8 <__gethex>
  4265. 8022f70: f010 0707 ands.w r7, r0, #7
  4266. 8022f74: 4605 mov r5, r0
  4267. 8022f76: bf04 itt eq
  4268. 8022f78: 46b9 moveq r9, r7
  4269. 8022f7a: 46ca moveq sl, r9
  4270. 8022f7c: f43f ac4d beq.w 802281a <_strtod_r+0x29a>
  4271. 8022f80: 2f06 cmp r7, #6
  4272. 8022f82: f000 816f beq.w 8023264 <_strtod_r+0xce4>
  4273. 8022f86: 9a18 ldr r2, [sp, #96] ; 0x60
  4274. 8022f88: b13a cbz r2, 8022f9a <_strtod_r+0xa1a>
  4275. 8022f8a: 6821 ldr r1, [r4, #0]
  4276. 8022f8c: a81a add r0, sp, #104 ; 0x68
  4277. 8022f8e: f002 f845 bl 802501c <__copybits>
  4278. 8022f92: 4658 mov r0, fp
  4279. 8022f94: 9918 ldr r1, [sp, #96] ; 0x60
  4280. 8022f96: f001 fc3f bl 8024818 <_Bfree>
  4281. 8022f9a: 9b19 ldr r3, [sp, #100] ; 0x64
  4282. 8022f9c: 2f06 cmp r7, #6
  4283. 8022f9e: d80b bhi.n 8022fb8 <_strtod_r+0xa38>
  4284. 8022fa0: e8df f007 tbb [pc, r7]
  4285. 8022fa4: 141b203c .word 0x141b203c
  4286. 8022fa8: 2004 .short 0x2004
  4287. 8022faa: 3c .byte 0x3c
  4288. 8022fab: 00 .byte 0x00
  4289. 8022fac: f06f 4400 mvn.w r4, #2147483648 ; 0x80000000
  4290. 8022fb0: f04f 30ff mov.w r0, #4294967295
  4291. 8022fb4: 9407 str r4, [sp, #28]
  4292. 8022fb6: 9006 str r0, [sp, #24]
  4293. 8022fb8: 072b lsls r3, r5, #28
  4294. 8022fba: f57f acb1 bpl.w 8022920 <_strtod_r+0x3a0>
  4295. 8022fbe: 9907 ldr r1, [sp, #28]
  4296. 8022fc0: f8dd 9018 ldr.w r9, [sp, #24]
  4297. 8022fc4: f041 4300 orr.w r3, r1, #2147483648 ; 0x80000000
  4298. 8022fc8: 469a mov sl, r3
  4299. 8022fca: e426 b.n 802281a <_strtod_r+0x29a>
  4300. 8022fcc: 2100 movs r1, #0
  4301. 8022fce: 9106 str r1, [sp, #24]
  4302. 8022fd0: 460a mov r2, r1
  4303. 8022fd2: f6c7 72f0 movt r2, #32752 ; 0x7ff0
  4304. 8022fd6: 9207 str r2, [sp, #28]
  4305. 8022fd8: e7ee b.n 8022fb8 <_strtod_r+0xa38>
  4306. 8022fda: 9b1a ldr r3, [sp, #104] ; 0x68
  4307. 8022fdc: 9c1b ldr r4, [sp, #108] ; 0x6c
  4308. 8022fde: 9306 str r3, [sp, #24]
  4309. 8022fe0: 9407 str r4, [sp, #28]
  4310. 8022fe2: e7e9 b.n 8022fb8 <_strtod_r+0xa38>
  4311. 8022fe4: 981a ldr r0, [sp, #104] ; 0x68
  4312. 8022fe6: f203 4333 addw r3, r3, #1075 ; 0x433
  4313. 8022fea: 9a1b ldr r2, [sp, #108] ; 0x6c
  4314. 8022fec: f422 1280 bic.w r2, r2, #1048576 ; 0x100000
  4315. 8022ff0: 9006 str r0, [sp, #24]
  4316. 8022ff2: ea42 5203 orr.w r2, r2, r3, lsl #20
  4317. 8022ff6: 9207 str r2, [sp, #28]
  4318. 8022ff8: e7de b.n 8022fb8 <_strtod_r+0xa38>
  4319. 8022ffa: bf00 nop
  4320. 8022ffc: f3af 8000 nop.w
  4321. 8023000: 94a03595 .word 0x94a03595
  4322. 8023004: 3fcfffff .word 0x3fcfffff
  4323. 8023008: 94a03595 .word 0x94a03595
  4324. 802300c: 3fdfffff .word 0x3fdfffff
  4325. 8023010: 35afe535 .word 0x35afe535
  4326. 8023014: 3fe00000 .word 0x3fe00000
  4327. 8023018: 080409a7 .word 0x080409a7
  4328. 802301c: 2100 movs r1, #0
  4329. 802301e: 9107 str r1, [sp, #28]
  4330. 8023020: 9106 str r1, [sp, #24]
  4331. 8023022: e7c9 b.n 8022fb8 <_strtod_r+0xa38>
  4332. 8023024: 46b0 mov r8, r6
  4333. 8023026: 4657 mov r7, sl
  4334. 8023028: 4654 mov r4, sl
  4335. 802302a: f7ff bb24 b.w 8022676 <_strtod_r+0xf6>
  4336. 802302e: 2300 movs r3, #0
  4337. 8023030: 930a str r3, [sp, #40] ; 0x28
  4338. 8023032: e693 b.n 8022d5c <_strtod_r+0x7dc>
  4339. 8023034: f8dd 802c ldr.w r8, [sp, #44] ; 0x2c
  4340. 8023038: eb08 0300 add.w r3, r8, r0
  4341. 802303c: 3b01 subs r3, #1
  4342. 802303e: 2b08 cmp r3, #8
  4343. 8023040: f103 0801 add.w r8, r3, #1
  4344. 8023044: f300 8172 bgt.w 802332c <_strtod_r+0xdac>
  4345. 8023048: eb07 0787 add.w r7, r7, r7, lsl #2
  4346. 802304c: 2000 movs r0, #0
  4347. 802304e: eb01 0747 add.w r7, r1, r7, lsl #1
  4348. 8023052: 9d0a ldr r5, [sp, #40] ; 0x28
  4349. 8023054: 1c6b adds r3, r5, #1
  4350. 8023056: 9317 str r3, [sp, #92] ; 0x5c
  4351. 8023058: 786d ldrb r5, [r5, #1]
  4352. 802305a: e613 b.n 8022c84 <_strtod_r+0x704>
  4353. 802305c: 9d0f ldr r5, [sp, #60] ; 0x3c
  4354. 802305e: 4654 mov r4, sl
  4355. 8023060: bb7d cbnz r5, 80230c2 <_strtod_r+0xb42>
  4356. 8023062: 9806 ldr r0, [sp, #24]
  4357. 8023064: bb68 cbnz r0, 80230c2 <_strtod_r+0xb42>
  4358. 8023066: 9a07 ldr r2, [sp, #28]
  4359. 8023068: f3c2 0313 ubfx r3, r2, #0, #20
  4360. 802306c: bb4b cbnz r3, 80230c2 <_strtod_r+0xb42>
  4361. 802306e: 4643 mov r3, r8
  4362. 8023070: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  4363. 8023074: 4013 ands r3, r2
  4364. 8023076: f1b3 6fd6 cmp.w r3, #112197632 ; 0x6b00000
  4365. 802307a: d922 bls.n 80230c2 <_strtod_r+0xb42>
  4366. 802307c: 6973 ldr r3, [r6, #20]
  4367. 802307e: b913 cbnz r3, 8023086 <_strtod_r+0xb06>
  4368. 8023080: 6933 ldr r3, [r6, #16]
  4369. 8023082: 2b01 cmp r3, #1
  4370. 8023084: dd1d ble.n 80230c2 <_strtod_r+0xb42>
  4371. 8023086: 4631 mov r1, r6
  4372. 8023088: 2201 movs r2, #1
  4373. 802308a: 4658 mov r0, fp
  4374. 802308c: f001 fdb6 bl 8024bfc <__lshift>
  4375. 8023090: 4639 mov r1, r7
  4376. 8023092: 4606 mov r6, r0
  4377. 8023094: f001 fe0c bl 8024cb0 <__mcmp>
  4378. 8023098: 2800 cmp r0, #0
  4379. 802309a: dd12 ble.n 80230c2 <_strtod_r+0xb42>
  4380. 802309c: 9d0b ldr r5, [sp, #44] ; 0x2c
  4381. 802309e: 2d00 cmp r5, #0
  4382. 80230a0: f040 8195 bne.w 80233ce <_strtod_r+0xe4e>
  4383. 80230a4: 9807 ldr r0, [sp, #28]
  4384. 80230a6: f020 4300 bic.w r3, r0, #2147483648 ; 0x80000000
  4385. 80230aa: 0d1b lsrs r3, r3, #20
  4386. 80230ac: 051b lsls r3, r3, #20
  4387. 80230ae: f5a3 1380 sub.w r3, r3, #1048576 ; 0x100000
  4388. 80230b2: f04f 32ff mov.w r2, #4294967295
  4389. 80230b6: 9206 str r2, [sp, #24]
  4390. 80230b8: ea6f 5313 mvn.w r3, r3, lsr #20
  4391. 80230bc: ea6f 5303 mvn.w r3, r3, lsl #20
  4392. 80230c0: 9307 str r3, [sp, #28]
  4393. 80230c2: 9d0b ldr r5, [sp, #44] ; 0x2c
  4394. 80230c4: 2d00 cmp r5, #0
  4395. 80230c6: f000 80c8 beq.w 802325a <_strtod_r+0xcda>
  4396. 80230ca: 2200 movs r2, #0
  4397. 80230cc: 2300 movs r3, #0
  4398. 80230ce: f6c3 1250 movt r2, #14672 ; 0x3950
  4399. 80230d2: 9314 str r3, [sp, #80] ; 0x50
  4400. 80230d4: 9215 str r2, [sp, #84] ; 0x54
  4401. 80230d6: e9dd 0106 ldrd r0, r1, [sp, #24]
  4402. 80230da: e9dd 2314 ldrd r2, r3, [sp, #80] ; 0x50
  4403. 80230de: f7fd fa6f bl 80205c0 <__aeabi_dmul>
  4404. 80230e2: e9cd 0106 strd r0, r1, [sp, #24]
  4405. 80230e6: 468a mov sl, r1
  4406. 80230e8: 9907 ldr r1, [sp, #28]
  4407. 80230ea: 4681 mov r9, r0
  4408. 80230ec: 2900 cmp r1, #0
  4409. 80230ee: f47f aee4 bne.w 8022eba <_strtod_r+0x93a>
  4410. 80230f2: 9a06 ldr r2, [sp, #24]
  4411. 80230f4: 2a00 cmp r2, #0
  4412. 80230f6: f47f aee0 bne.w 8022eba <_strtod_r+0x93a>
  4413. 80230fa: e6fe b.n 8022efa <_strtod_r+0x97a>
  4414. 80230fc: 9d0f ldr r5, [sp, #60] ; 0x3c
  4415. 80230fe: 4654 mov r4, sl
  4416. 8023100: f8dd 9024 ldr.w r9, [sp, #36] ; 0x24
  4417. 8023104: f8dd a028 ldr.w sl, [sp, #40] ; 0x28
  4418. 8023108: 2d00 cmp r5, #0
  4419. 802310a: f000 80d3 beq.w 80232b4 <_strtod_r+0xd34>
  4420. 802310e: 9b07 ldr r3, [sp, #28]
  4421. 8023110: f64f 72ff movw r2, #65535 ; 0xffff
  4422. 8023114: f2c0 020f movt r2, #15
  4423. 8023118: f023 417f bic.w r1, r3, #4278190080 ; 0xff000000
  4424. 802311c: f421 0170 bic.w r1, r1, #15728640 ; 0xf00000
  4425. 8023120: 4291 cmp r1, r2
  4426. 8023122: 9906 ldr r1, [sp, #24]
  4427. 8023124: f000 8119 beq.w 802335a <_strtod_r+0xdda>
  4428. 8023128: 07cb lsls r3, r1, #31
  4429. 802312a: d5ca bpl.n 80230c2 <_strtod_r+0xb42>
  4430. 802312c: 4648 mov r0, r9
  4431. 802312e: 4651 mov r1, sl
  4432. 8023130: f001 fe52 bl 8024dd8 <__ulp>
  4433. 8023134: 4602 mov r2, r0
  4434. 8023136: 460b mov r3, r1
  4435. 8023138: 4648 mov r0, r9
  4436. 802313a: 4651 mov r1, sl
  4437. 802313c: f7fd f88e bl 802025c <__adddf3>
  4438. 8023140: e9cd 0106 strd r0, r1, [sp, #24]
  4439. 8023144: e7bd b.n 80230c2 <_strtod_r+0xb42>
  4440. 8023146: 9814 ldr r0, [sp, #80] ; 0x50
  4441. 8023148: 3001 adds r0, #1
  4442. 802314a: f47f ae85 bne.w 8022e58 <_strtod_r+0x8d8>
  4443. 802314e: 2000 movs r0, #0
  4444. 8023150: 4654 mov r4, sl
  4445. 8023152: 4601 mov r1, r0
  4446. 8023154: 2322 movs r3, #34 ; 0x22
  4447. 8023156: f6c7 71f0 movt r1, #32752 ; 0x7ff0
  4448. 802315a: f8cb 3000 str.w r3, [fp]
  4449. 802315e: 9107 str r1, [sp, #28]
  4450. 8023160: 4681 mov r9, r0
  4451. 8023162: 9006 str r0, [sp, #24]
  4452. 8023164: 468a mov sl, r1
  4453. 8023166: e6a8 b.n 8022eba <_strtod_r+0x93a>
  4454. 8023168: 2300 movs r3, #0
  4455. 802316a: 2500 movs r5, #0
  4456. 802316c: 461c mov r4, r3
  4457. 802316e: 9506 str r5, [sp, #24]
  4458. 8023170: f6c7 74f0 movt r4, #32752 ; 0x7ff0
  4459. 8023174: 2322 movs r3, #34 ; 0x22
  4460. 8023176: 9407 str r4, [sp, #28]
  4461. 8023178: 46a9 mov r9, r5
  4462. 802317a: f8cb 3000 str.w r3, [fp]
  4463. 802317e: 46a2 mov sl, r4
  4464. 8023180: f7ff bb4b b.w 802281a <_strtod_r+0x29a>
  4465. 8023184: f43f ac35 beq.w 80229f2 <_strtod_r+0x472>
  4466. 8023188: 4264 negs r4, r4
  4467. 802318a: f014 020f ands.w r2, r4, #15
  4468. 802318e: d00d beq.n 80231ac <_strtod_r+0xc2c>
  4469. 8023190: f645 4318 movw r3, #23576 ; 0x5c18
  4470. 8023194: e9dd 0106 ldrd r0, r1, [sp, #24]
  4471. 8023198: f6c0 0303 movt r3, #2051 ; 0x803
  4472. 802319c: eb03 03c2 add.w r3, r3, r2, lsl #3
  4473. 80231a0: e9d3 2300 ldrd r2, r3, [r3]
  4474. 80231a4: f7fd fb36 bl 8020814 <__aeabi_ddiv>
  4475. 80231a8: e9cd 0106 strd r0, r1, [sp, #24]
  4476. 80231ac: 1124 asrs r4, r4, #4
  4477. 80231ae: f43f ac20 beq.w 80229f2 <_strtod_r+0x472>
  4478. 80231b2: 2c1f cmp r4, #31
  4479. 80231b4: dc40 bgt.n 8023238 <_strtod_r+0xcb8>
  4480. 80231b6: f014 0f10 tst.w r4, #16
  4481. 80231ba: bf14 ite ne
  4482. 80231bc: 256a movne r5, #106 ; 0x6a
  4483. 80231be: 2500 moveq r5, #0
  4484. 80231c0: 2c00 cmp r4, #0
  4485. 80231c2: 950b str r5, [sp, #44] ; 0x2c
  4486. 80231c4: dd17 ble.n 80231f6 <_strtod_r+0xc76>
  4487. 80231c6: f645 35e0 movw r5, #23520 ; 0x5be0
  4488. 80231ca: e9dd 2306 ldrd r2, r3, [sp, #24]
  4489. 80231ce: f6c0 0503 movt r5, #2051 ; 0x803
  4490. 80231d2: f014 0f01 tst.w r4, #1
  4491. 80231d6: 4610 mov r0, r2
  4492. 80231d8: 4619 mov r1, r3
  4493. 80231da: d005 beq.n 80231e8 <_strtod_r+0xc68>
  4494. 80231dc: e9d5 2300 ldrd r2, r3, [r5]
  4495. 80231e0: f7fd f9ee bl 80205c0 <__aeabi_dmul>
  4496. 80231e4: 4602 mov r2, r0
  4497. 80231e6: 460b mov r3, r1
  4498. 80231e8: 3508 adds r5, #8
  4499. 80231ea: 1064 asrs r4, r4, #1
  4500. 80231ec: d1f1 bne.n 80231d2 <_strtod_r+0xc52>
  4501. 80231ee: 4610 mov r0, r2
  4502. 80231f0: 4619 mov r1, r3
  4503. 80231f2: e9cd 0106 strd r0, r1, [sp, #24]
  4504. 80231f6: 9c0b ldr r4, [sp, #44] ; 0x2c
  4505. 80231f8: b18c cbz r4, 802321e <_strtod_r+0xc9e>
  4506. 80231fa: 9a07 ldr r2, [sp, #28]
  4507. 80231fc: f3c2 530a ubfx r3, r2, #20, #11
  4508. 8023200: f1c3 036b rsb r3, r3, #107 ; 0x6b
  4509. 8023204: 2b00 cmp r3, #0
  4510. 8023206: dd0a ble.n 802321e <_strtod_r+0xc9e>
  4511. 8023208: 2b1f cmp r3, #31
  4512. 802320a: f340 810a ble.w 8023422 <_strtod_r+0xea2>
  4513. 802320e: 2100 movs r1, #0
  4514. 8023210: 2b34 cmp r3, #52 ; 0x34
  4515. 8023212: 9106 str r1, [sp, #24]
  4516. 8023214: f340 810d ble.w 8023432 <_strtod_r+0xeb2>
  4517. 8023218: f04f 725c mov.w r2, #57671680 ; 0x3700000
  4518. 802321c: 9207 str r2, [sp, #28]
  4519. 802321e: 9d06 ldr r5, [sp, #24]
  4520. 8023220: 2200 movs r2, #0
  4521. 8023222: 9c07 ldr r4, [sp, #28]
  4522. 8023224: 2300 movs r3, #0
  4523. 8023226: 4628 mov r0, r5
  4524. 8023228: 46a9 mov r9, r5
  4525. 802322a: 4621 mov r1, r4
  4526. 802322c: 46a2 mov sl, r4
  4527. 802322e: f7fd fc2f bl 8020a90 <__aeabi_dcmpeq>
  4528. 8023232: 2800 cmp r0, #0
  4529. 8023234: f43f abe2 beq.w 80229fc <_strtod_r+0x47c>
  4530. 8023238: f04f 0900 mov.w r9, #0
  4531. 802323c: 2322 movs r3, #34 ; 0x22
  4532. 802323e: 46ca mov sl, r9
  4533. 8023240: f8cb 3000 str.w r3, [fp]
  4534. 8023244: f7ff bae9 b.w 802281a <_strtod_r+0x29a>
  4535. 8023248: 9a0f ldr r2, [sp, #60] ; 0x3c
  4536. 802324a: 2300 movs r3, #0
  4537. 802324c: 4699 mov r9, r3
  4538. 802324e: f6cb 73e0 movt r3, #49120 ; 0xbfe0
  4539. 8023252: f6c3 79e0 movt r9, #16352 ; 0x3fe0
  4540. 8023256: 920c str r2, [sp, #48] ; 0x30
  4541. 8023258: e5bf b.n 8022dda <_strtod_r+0x85a>
  4542. 802325a: f8dd 9018 ldr.w r9, [sp, #24]
  4543. 802325e: f8dd a01c ldr.w sl, [sp, #28]
  4544. 8023262: e62a b.n 8022eba <_strtod_r+0x93a>
  4545. 8023264: f04f 0900 mov.w r9, #0
  4546. 8023268: 3601 adds r6, #1
  4547. 802326a: 46ca mov sl, r9
  4548. 802326c: 9617 str r6, [sp, #92] ; 0x5c
  4549. 802326e: f7ff bad4 b.w 802281a <_strtod_r+0x29a>
  4550. 8023272: 9c09 ldr r4, [sp, #36] ; 0x24
  4551. 8023274: f1c8 0325 rsb r3, r8, #37 ; 0x25
  4552. 8023278: 429c cmp r4, r3
  4553. 802327a: f73f ab9d bgt.w 80229b8 <_strtod_r+0x438>
  4554. 802327e: f1c8 080f rsb r8, r8, #15
  4555. 8023282: f645 4418 movw r4, #23576 ; 0x5c18
  4556. 8023286: f6c0 0403 movt r4, #2051 ; 0x803
  4557. 802328a: e9dd 2306 ldrd r2, r3, [sp, #24]
  4558. 802328e: eb04 01c8 add.w r1, r4, r8, lsl #3
  4559. 8023292: e9d1 0100 ldrd r0, r1, [r1]
  4560. 8023296: f7fd f993 bl 80205c0 <__aeabi_dmul>
  4561. 802329a: 9d09 ldr r5, [sp, #36] ; 0x24
  4562. 802329c: ebc8 0805 rsb r8, r8, r5
  4563. 80232a0: eb04 04c8 add.w r4, r4, r8, lsl #3
  4564. 80232a4: e9d4 2300 ldrd r2, r3, [r4]
  4565. 80232a8: f7fd f98a bl 80205c0 <__aeabi_dmul>
  4566. 80232ac: 4681 mov r9, r0
  4567. 80232ae: 468a mov sl, r1
  4568. 80232b0: f7ff bab3 b.w 802281a <_strtod_r+0x29a>
  4569. 80232b4: 9907 ldr r1, [sp, #28]
  4570. 80232b6: f3c1 0313 ubfx r3, r1, #0, #20
  4571. 80232ba: 2b00 cmp r3, #0
  4572. 80232bc: d141 bne.n 8023342 <_strtod_r+0xdc2>
  4573. 80232be: 9b06 ldr r3, [sp, #24]
  4574. 80232c0: 2b00 cmp r3, #0
  4575. 80232c2: f43f aeeb beq.w 802309c <_strtod_r+0xb1c>
  4576. 80232c6: 07da lsls r2, r3, #31
  4577. 80232c8: f57f aefb bpl.w 80230c2 <_strtod_r+0xb42>
  4578. 80232cc: 4648 mov r0, r9
  4579. 80232ce: 4651 mov r1, sl
  4580. 80232d0: f001 fd82 bl 8024dd8 <__ulp>
  4581. 80232d4: 4602 mov r2, r0
  4582. 80232d6: 460b mov r3, r1
  4583. 80232d8: 4648 mov r0, r9
  4584. 80232da: 4651 mov r1, sl
  4585. 80232dc: f7fc ffbc bl 8020258 <__aeabi_dsub>
  4586. 80232e0: 4602 mov r2, r0
  4587. 80232e2: 460b mov r3, r1
  4588. 80232e4: e9cd 2306 strd r2, r3, [sp, #24]
  4589. 80232e8: 2200 movs r2, #0
  4590. 80232ea: 2300 movs r3, #0
  4591. 80232ec: f7fd fbd0 bl 8020a90 <__aeabi_dcmpeq>
  4592. 80232f0: 2800 cmp r0, #0
  4593. 80232f2: f47f adff bne.w 8022ef4 <_strtod_r+0x974>
  4594. 80232f6: e6e4 b.n 80230c2 <_strtod_r+0xb42>
  4595. 80232f8: 9d09 ldr r5, [sp, #36] ; 0x24
  4596. 80232fa: 426d negs r5, r5
  4597. 80232fc: 950d str r5, [sp, #52] ; 0x34
  4598. 80232fe: f7ff bb8b b.w 8022a18 <_strtod_r+0x498>
  4599. 8023302: 9c09 ldr r4, [sp, #36] ; 0x24
  4600. 8023304: f114 0f16 cmn.w r4, #22
  4601. 8023308: f6ff ab56 blt.w 80229b8 <_strtod_r+0x438>
  4602. 802330c: f645 4318 movw r3, #23576 ; 0x5c18
  4603. 8023310: e9dd 0106 ldrd r0, r1, [sp, #24]
  4604. 8023314: f6c0 0303 movt r3, #2051 ; 0x803
  4605. 8023318: eba3 03c4 sub.w r3, r3, r4, lsl #3
  4606. 802331c: e9d3 2300 ldrd r2, r3, [r3]
  4607. 8023320: f7fd fa78 bl 8020814 <__aeabi_ddiv>
  4608. 8023324: 4681 mov r9, r0
  4609. 8023326: 468a mov sl, r1
  4610. 8023328: f7ff ba77 b.w 802281a <_strtod_r+0x29a>
  4611. 802332c: 2000 movs r0, #0
  4612. 802332e: f1b8 0f10 cmp.w r8, #16
  4613. 8023332: f73f ae8e bgt.w 8023052 <_strtod_r+0xad2>
  4614. 8023336: eb0a 0a8a add.w sl, sl, sl, lsl #2
  4615. 802333a: 2000 movs r0, #0
  4616. 802333c: eb01 0a4a add.w sl, r1, sl, lsl #1
  4617. 8023340: e687 b.n 8023052 <_strtod_r+0xad2>
  4618. 8023342: 9b06 ldr r3, [sp, #24]
  4619. 8023344: e7bf b.n 80232c6 <_strtod_r+0xd46>
  4620. 8023346: f101 7154 add.w r1, r1, #55574528 ; 0x3500000
  4621. 802334a: 2400 movs r4, #0
  4622. 802334c: 9107 str r1, [sp, #28]
  4623. 802334e: 468a mov sl, r1
  4624. 8023350: 940b str r4, [sp, #44] ; 0x2c
  4625. 8023352: f8dd 9018 ldr.w r9, [sp, #24]
  4626. 8023356: f7ff bb51 b.w 80229fc <_strtod_r+0x47c>
  4627. 802335a: 9d0b ldr r5, [sp, #44] ; 0x2c
  4628. 802335c: b1d5 cbz r5, 8023394 <_strtod_r+0xe14>
  4629. 802335e: 2200 movs r2, #0
  4630. 8023360: f6c7 72f0 movt r2, #32752 ; 0x7ff0
  4631. 8023364: 401a ands r2, r3
  4632. 8023366: f1b2 6fd4 cmp.w r2, #111149056 ; 0x6a00000
  4633. 802336a: d813 bhi.n 8023394 <_strtod_r+0xe14>
  4634. 802336c: 0d12 lsrs r2, r2, #20
  4635. 802336e: f04f 30ff mov.w r0, #4294967295
  4636. 8023372: f1c2 026b rsb r2, r2, #107 ; 0x6b
  4637. 8023376: fa00 f202 lsl.w r2, r0, r2
  4638. 802337a: 4291 cmp r1, r2
  4639. 802337c: f47f aed4 bne.w 8023128 <_strtod_r+0xba8>
  4640. 8023380: 2200 movs r2, #0
  4641. 8023382: 2000 movs r0, #0
  4642. 8023384: f6c7 72f0 movt r2, #32752 ; 0x7ff0
  4643. 8023388: 9006 str r0, [sp, #24]
  4644. 802338a: 401a ands r2, r3
  4645. 802338c: f502 1280 add.w r2, r2, #1048576 ; 0x100000
  4646. 8023390: 9207 str r2, [sp, #28]
  4647. 8023392: e696 b.n 80230c2 <_strtod_r+0xb42>
  4648. 8023394: f04f 32ff mov.w r2, #4294967295
  4649. 8023398: e7ef b.n 802337a <_strtod_r+0xdfa>
  4650. 802339a: 4c2a ldr r4, [pc, #168] ; (8023444 <_strtod_r+0xec4>)
  4651. 802339c: 4611 mov r1, r2
  4652. 802339e: 9217 str r2, [sp, #92] ; 0x5c
  4653. 80233a0: f814 0f01 ldrb.w r0, [r4, #1]!
  4654. 80233a4: 460b mov r3, r1
  4655. 80233a6: b310 cbz r0, 80233ee <_strtod_r+0xe6e>
  4656. 80233a8: 785b ldrb r3, [r3, #1]
  4657. 80233aa: 3101 adds r1, #1
  4658. 80233ac: 2b40 cmp r3, #64 ; 0x40
  4659. 80233ae: dd02 ble.n 80233b6 <_strtod_r+0xe36>
  4660. 80233b0: 2b5a cmp r3, #90 ; 0x5a
  4661. 80233b2: bfd8 it le
  4662. 80233b4: 3320 addle r3, #32
  4663. 80233b6: 4283 cmp r3, r0
  4664. 80233b8: d0f2 beq.n 80233a0 <_strtod_r+0xe20>
  4665. 80233ba: 3201 adds r2, #1
  4666. 80233bc: 9217 str r2, [sp, #92] ; 0x5c
  4667. 80233be: 2500 movs r5, #0
  4668. 80233c0: 9506 str r5, [sp, #24]
  4669. 80233c2: 4628 mov r0, r5
  4670. 80233c4: f6c7 70f0 movt r0, #32752 ; 0x7ff0
  4671. 80233c8: 9007 str r0, [sp, #28]
  4672. 80233ca: f7ff baa9 b.w 8022920 <_strtod_r+0x3a0>
  4673. 80233ce: 9907 ldr r1, [sp, #28]
  4674. 80233d0: f021 4300 bic.w r3, r1, #2147483648 ; 0x80000000
  4675. 80233d4: 0d1b lsrs r3, r3, #20
  4676. 80233d6: 051b lsls r3, r3, #20
  4677. 80233d8: f1b3 6fd6 cmp.w r3, #112197632 ; 0x6b00000
  4678. 80233dc: f63f ae67 bhi.w 80230ae <_strtod_r+0xb2e>
  4679. 80233e0: f1b3 7f5c cmp.w r3, #57671680 ; 0x3700000
  4680. 80233e4: f63f ae71 bhi.w 80230ca <_strtod_r+0xb4a>
  4681. 80233e8: e584 b.n 8022ef4 <_strtod_r+0x974>
  4682. 80233ea: 4643 mov r3, r8
  4683. 80233ec: e627 b.n 802303e <_strtod_r+0xabe>
  4684. 80233ee: 3101 adds r1, #1
  4685. 80233f0: 9117 str r1, [sp, #92] ; 0x5c
  4686. 80233f2: e7e4 b.n 80233be <_strtod_r+0xe3e>
  4687. 80233f4: f04f 0900 mov.w r9, #0
  4688. 80233f8: f6c0 0a03 movt sl, #2051 ; 0x803
  4689. 80233fc: e47f b.n 8022cfe <_strtod_r+0x77e>
  4690. 80233fe: a817 add r0, sp, #92 ; 0x5c
  4691. 8023400: 4911 ldr r1, [pc, #68] ; (8023448 <_strtod_r+0xec8>)
  4692. 8023402: aa1a add r2, sp, #104 ; 0x68
  4693. 8023404: f000 fd7e bl 8023f04 <__hexnan>
  4694. 8023408: 2805 cmp r0, #5
  4695. 802340a: f47f aa83 bne.w 8022914 <_strtod_r+0x394>
  4696. 802340e: 9b1b ldr r3, [sp, #108] ; 0x6c
  4697. 8023410: 9a1a ldr r2, [sp, #104] ; 0x68
  4698. 8023412: f043 43ff orr.w r3, r3, #2139095040 ; 0x7f800000
  4699. 8023416: f443 03e0 orr.w r3, r3, #7340032 ; 0x700000
  4700. 802341a: 9307 str r3, [sp, #28]
  4701. 802341c: 9206 str r2, [sp, #24]
  4702. 802341e: f7ff ba7f b.w 8022920 <_strtod_r+0x3a0>
  4703. 8023422: f04f 32ff mov.w r2, #4294967295
  4704. 8023426: 9c06 ldr r4, [sp, #24]
  4705. 8023428: fa02 f303 lsl.w r3, r2, r3
  4706. 802342c: 401c ands r4, r3
  4707. 802342e: 9406 str r4, [sp, #24]
  4708. 8023430: e6f5 b.n 802321e <_strtod_r+0xc9e>
  4709. 8023432: f04f 31ff mov.w r1, #4294967295
  4710. 8023436: 3b20 subs r3, #32
  4711. 8023438: fa01 f303 lsl.w r3, r1, r3
  4712. 802343c: 4013 ands r3, r2
  4713. 802343e: 9307 str r3, [sp, #28]
  4714. 8023440: e6ed b.n 802321e <_strtod_r+0xc9e>
  4715. 8023442: bf00 nop
  4716. 8023444: 080409ab .word 0x080409ab
  4717. 8023448: 20000018 .word 0x20000018
  4718. 0802344c <strtod>:
  4719. 802344c: f240 032c movw r3, #44 ; 0x2c
  4720. 8023450: 460a mov r2, r1
  4721. 8023452: f2c2 0300 movt r3, #8192 ; 0x2000
  4722. 8023456: 4601 mov r1, r0
  4723. 8023458: 6818 ldr r0, [r3, #0]
  4724. 802345a: f7ff b891 b.w 8022580 <_strtod_r>
  4725. 802345e: bf00 nop
  4726. 08023460 <strtof>:
  4727. 8023460: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  4728. 8023464: f240 062c movw r6, #44 ; 0x2c
  4729. 8023468: f2c2 0600 movt r6, #8192 ; 0x2000
  4730. 802346c: 460a mov r2, r1
  4731. 802346e: 4601 mov r1, r0
  4732. 8023470: f04f 0801 mov.w r8, #1
  4733. 8023474: 6830 ldr r0, [r6, #0]
  4734. 8023476: f7ff f883 bl 8022580 <_strtod_r>
  4735. 802347a: 460d mov r5, r1
  4736. 802347c: 4604 mov r4, r0
  4737. 802347e: f7fd fb61 bl 8020b44 <__aeabi_d2f>
  4738. 8023482: 2100 movs r1, #0
  4739. 8023484: 4607 mov r7, r0
  4740. 8023486: f7fd fcff bl 8020e88 <__aeabi_fcmpeq>
  4741. 802348a: b908 cbnz r0, 8023490 <strtof+0x30>
  4742. 802348c: f04f 0800 mov.w r8, #0
  4743. 8023490: 4620 mov r0, r4
  4744. 8023492: 4629 mov r1, r5
  4745. 8023494: 2200 movs r2, #0
  4746. 8023496: 2300 movs r3, #0
  4747. 8023498: f04f 0901 mov.w r9, #1
  4748. 802349c: f7fd faf8 bl 8020a90 <__aeabi_dcmpeq>
  4749. 80234a0: b108 cbz r0, 80234a6 <strtof+0x46>
  4750. 80234a2: f04f 0900 mov.w r9, #0
  4751. 80234a6: ea08 0809 and.w r8, r8, r9
  4752. 80234aa: f018 0fff tst.w r8, #255 ; 0xff
  4753. 80234ae: d116 bne.n 80234de <strtof+0x7e>
  4754. 80234b0: f64f 71ff movw r1, #65535 ; 0xffff
  4755. 80234b4: 4638 mov r0, r7
  4756. 80234b6: f6c7 717f movt r1, #32639 ; 0x7f7f
  4757. 80234ba: f7fd fd0d bl 8020ed8 <__aeabi_fcmpgt>
  4758. 80234be: b9a0 cbnz r0, 80234ea <strtof+0x8a>
  4759. 80234c0: 4638 mov r0, r7
  4760. 80234c2: f46f 0100 mvn.w r1, #8388608 ; 0x800000
  4761. 80234c6: f7fd fce9 bl 8020e9c <__aeabi_fcmplt>
  4762. 80234ca: b158 cbz r0, 80234e4 <strtof+0x84>
  4763. 80234cc: 4620 mov r0, r4
  4764. 80234ce: 4629 mov r1, r5
  4765. 80234d0: f04f 32ff mov.w r2, #4294967295
  4766. 80234d4: f46f 1380 mvn.w r3, #1048576 ; 0x100000
  4767. 80234d8: f7fd fae4 bl 8020aa4 <__aeabi_dcmplt>
  4768. 80234dc: b910 cbnz r0, 80234e4 <strtof+0x84>
  4769. 80234de: 6833 ldr r3, [r6, #0]
  4770. 80234e0: 2222 movs r2, #34 ; 0x22
  4771. 80234e2: 601a str r2, [r3, #0]
  4772. 80234e4: 4638 mov r0, r7
  4773. 80234e6: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  4774. 80234ea: f64f 73ff movw r3, #65535 ; 0xffff
  4775. 80234ee: 4620 mov r0, r4
  4776. 80234f0: 4629 mov r1, r5
  4777. 80234f2: f04f 32ff mov.w r2, #4294967295
  4778. 80234f6: f6c7 73ef movt r3, #32751 ; 0x7fef
  4779. 80234fa: f7fd faf1 bl 8020ae0 <__aeabi_dcmpgt>
  4780. 80234fe: 2800 cmp r0, #0
  4781. 8023500: d0ed beq.n 80234de <strtof+0x7e>
  4782. 8023502: e7dd b.n 80234c0 <strtof+0x60>
  4783. 8023504: f3af 8000 nop.w
  4784. 08023508 <_strtol_r>:
  4785. 8023508: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  4786. 802350c: f240 0400 movw r4, #0
  4787. 8023510: f2c2 0400 movt r4, #8192 ; 0x2000
  4788. 8023514: b085 sub sp, #20
  4789. 8023516: 4699 mov r9, r3
  4790. 8023518: 460b mov r3, r1
  4791. 802351a: f8d4 8000 ldr.w r8, [r4]
  4792. 802351e: 9102 str r1, [sp, #8]
  4793. 8023520: 9003 str r0, [sp, #12]
  4794. 8023522: 461c mov r4, r3
  4795. 8023524: f814 5b01 ldrb.w r5, [r4], #1
  4796. 8023528: eb08 0105 add.w r1, r8, r5
  4797. 802352c: 4623 mov r3, r4
  4798. 802352e: 7849 ldrb r1, [r1, #1]
  4799. 8023530: f001 0108 and.w r1, r1, #8
  4800. 8023534: b2c9 uxtb r1, r1
  4801. 8023536: 2900 cmp r1, #0
  4802. 8023538: d1f3 bne.n 8023522 <_strtol_r+0x1a>
  4803. 802353a: 2d2d cmp r5, #45 ; 0x2d
  4804. 802353c: d07b beq.n 8023636 <_strtol_r+0x12e>
  4805. 802353e: 2d2b cmp r5, #43 ; 0x2b
  4806. 8023540: bf05 ittet eq
  4807. 8023542: 4624 moveq r4, r4
  4808. 8023544: 460b moveq r3, r1
  4809. 8023546: 460b movne r3, r1
  4810. 8023548: f814 5b01 ldrbeq.w r5, [r4], #1
  4811. 802354c: f039 0110 bics.w r1, r9, #16
  4812. 8023550: d112 bne.n 8023578 <_strtol_r+0x70>
  4813. 8023552: f1d9 0001 rsbs r0, r9, #1
  4814. 8023556: bf38 it cc
  4815. 8023558: 2000 movcc r0, #0
  4816. 802355a: 2d30 cmp r5, #48 ; 0x30
  4817. 802355c: d004 beq.n 8023568 <_strtol_r+0x60>
  4818. 802355e: b158 cbz r0, 8023578 <_strtol_r+0x70>
  4819. 8023560: f04f 090a mov.w r9, #10
  4820. 8023564: 46cb mov fp, r9
  4821. 8023566: e008 b.n 802357a <_strtol_r+0x72>
  4822. 8023568: 7821 ldrb r1, [r4, #0]
  4823. 802356a: f001 01df and.w r1, r1, #223 ; 0xdf
  4824. 802356e: 2958 cmp r1, #88 ; 0x58
  4825. 8023570: d065 beq.n 802363e <_strtol_r+0x136>
  4826. 8023572: b108 cbz r0, 8023578 <_strtol_r+0x70>
  4827. 8023574: f04f 0908 mov.w r9, #8
  4828. 8023578: 46cb mov fp, r9
  4829. 802357a: 2b00 cmp r3, #0
  4830. 802357c: 4659 mov r1, fp
  4831. 802357e: bf0c ite eq
  4832. 8023580: f06f 4600 mvneq.w r6, #2147483648 ; 0x80000000
  4833. 8023584: f04f 4600 movne.w r6, #2147483648 ; 0x80000000
  4834. 8023588: e88d 000c stmia.w sp, {r2, r3}
  4835. 802358c: 4630 mov r0, r6
  4836. 802358e: 2700 movs r7, #0
  4837. 8023590: f7fe f964 bl 802185c <__aeabi_uidivmod>
  4838. 8023594: 4630 mov r0, r6
  4839. 8023596: 468a mov sl, r1
  4840. 8023598: 4659 mov r1, fp
  4841. 802359a: f7fe f831 bl 8021600 <__aeabi_uidiv>
  4842. 802359e: 46bc mov ip, r7
  4843. 80235a0: e89d 000c ldmia.w sp, {r2, r3}
  4844. 80235a4: e016 b.n 80235d4 <_strtol_r+0xcc>
  4845. 80235a6: 3d30 subs r5, #48 ; 0x30
  4846. 80235a8: 45a9 cmp r9, r5
  4847. 80235aa: dd25 ble.n 80235f8 <_strtol_r+0xf0>
  4848. 80235ac: 4584 cmp ip, r0
  4849. 80235ae: bf94 ite ls
  4850. 80235b0: 2100 movls r1, #0
  4851. 80235b2: 2101 movhi r1, #1
  4852. 80235b4: ea51 77d7 orrs.w r7, r1, r7, lsr #31
  4853. 80235b8: d129 bne.n 802360e <_strtol_r+0x106>
  4854. 80235ba: 4555 cmp r5, sl
  4855. 80235bc: bfd4 ite le
  4856. 80235be: 2100 movle r1, #0
  4857. 80235c0: 2101 movgt r1, #1
  4858. 80235c2: 4584 cmp ip, r0
  4859. 80235c4: bf18 it ne
  4860. 80235c6: 2100 movne r1, #0
  4861. 80235c8: bb09 cbnz r1, 802360e <_strtol_r+0x106>
  4862. 80235ca: fb0b 5c0c mla ip, fp, ip, r5
  4863. 80235ce: 2701 movs r7, #1
  4864. 80235d0: f814 5b01 ldrb.w r5, [r4], #1
  4865. 80235d4: eb08 0105 add.w r1, r8, r5
  4866. 80235d8: 7849 ldrb r1, [r1, #1]
  4867. 80235da: f001 0604 and.w r6, r1, #4
  4868. 80235de: b2f6 uxtb r6, r6
  4869. 80235e0: 2e00 cmp r6, #0
  4870. 80235e2: d1e0 bne.n 80235a6 <_strtol_r+0x9e>
  4871. 80235e4: f011 0103 ands.w r1, r1, #3
  4872. 80235e8: d006 beq.n 80235f8 <_strtol_r+0xf0>
  4873. 80235ea: 2901 cmp r1, #1
  4874. 80235ec: bf14 ite ne
  4875. 80235ee: 2157 movne r1, #87 ; 0x57
  4876. 80235f0: 2137 moveq r1, #55 ; 0x37
  4877. 80235f2: 1a6d subs r5, r5, r1
  4878. 80235f4: 45a9 cmp r9, r5
  4879. 80235f6: dcd9 bgt.n 80235ac <_strtol_r+0xa4>
  4880. 80235f8: 1c79 adds r1, r7, #1
  4881. 80235fa: d00b beq.n 8023614 <_strtol_r+0x10c>
  4882. 80235fc: b9c3 cbnz r3, 8023630 <_strtol_r+0x128>
  4883. 80235fe: 4660 mov r0, ip
  4884. 8023600: b112 cbz r2, 8023608 <_strtol_r+0x100>
  4885. 8023602: b997 cbnz r7, 802362a <_strtol_r+0x122>
  4886. 8023604: 9b02 ldr r3, [sp, #8]
  4887. 8023606: 6013 str r3, [r2, #0]
  4888. 8023608: b005 add sp, #20
  4889. 802360a: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  4890. 802360e: f04f 37ff mov.w r7, #4294967295
  4891. 8023612: e7dd b.n 80235d0 <_strtol_r+0xc8>
  4892. 8023614: 9903 ldr r1, [sp, #12]
  4893. 8023616: 2b00 cmp r3, #0
  4894. 8023618: bf0c ite eq
  4895. 802361a: f06f 4000 mvneq.w r0, #2147483648 ; 0x80000000
  4896. 802361e: f04f 4000 movne.w r0, #2147483648 ; 0x80000000
  4897. 8023622: 2322 movs r3, #34 ; 0x22
  4898. 8023624: 600b str r3, [r1, #0]
  4899. 8023626: 2a00 cmp r2, #0
  4900. 8023628: d0ee beq.n 8023608 <_strtol_r+0x100>
  4901. 802362a: 3c01 subs r4, #1
  4902. 802362c: 9402 str r4, [sp, #8]
  4903. 802362e: e7e9 b.n 8023604 <_strtol_r+0xfc>
  4904. 8023630: f1cc 0c00 rsb ip, ip, #0
  4905. 8023634: e7e3 b.n 80235fe <_strtol_r+0xf6>
  4906. 8023636: f814 5b01 ldrb.w r5, [r4], #1
  4907. 802363a: 2301 movs r3, #1
  4908. 802363c: e786 b.n 802354c <_strtol_r+0x44>
  4909. 802363e: f04f 0910 mov.w r9, #16
  4910. 8023642: 7865 ldrb r5, [r4, #1]
  4911. 8023644: 46cb mov fp, r9
  4912. 8023646: 3402 adds r4, #2
  4913. 8023648: e797 b.n 802357a <_strtol_r+0x72>
  4914. 802364a: bf00 nop
  4915. 0802364c <strtol>:
  4916. 802364c: b430 push {r4, r5}
  4917. 802364e: f240 042c movw r4, #44 ; 0x2c
  4918. 8023652: f2c2 0400 movt r4, #8192 ; 0x2000
  4919. 8023656: 460d mov r5, r1
  4920. 8023658: 4613 mov r3, r2
  4921. 802365a: 4601 mov r1, r0
  4922. 802365c: 462a mov r2, r5
  4923. 802365e: 6820 ldr r0, [r4, #0]
  4924. 8023660: bc30 pop {r4, r5}
  4925. 8023662: f7ff bf51 b.w 8023508 <_strtol_r>
  4926. 8023666: bf00 nop
  4927. 08023668 <_malloc_trim_r>:
  4928. 8023668: b5f8 push {r3, r4, r5, r6, r7, lr}
  4929. 802366a: f240 149c movw r4, #412 ; 0x19c
  4930. 802366e: f2c2 0400 movt r4, #8192 ; 0x2000
  4931. 8023672: 460f mov r7, r1
  4932. 8023674: 4605 mov r5, r0
  4933. 8023676: f001 f895 bl 80247a4 <__malloc_lock>
  4934. 802367a: 68a3 ldr r3, [r4, #8]
  4935. 802367c: 685e ldr r6, [r3, #4]
  4936. 802367e: f026 0603 bic.w r6, r6, #3
  4937. 8023682: f606 73ef addw r3, r6, #4079 ; 0xfef
  4938. 8023686: 1bdf subs r7, r3, r7
  4939. 8023688: 0b3f lsrs r7, r7, #12
  4940. 802368a: 3f01 subs r7, #1
  4941. 802368c: 033f lsls r7, r7, #12
  4942. 802368e: f5b7 5f80 cmp.w r7, #4096 ; 0x1000
  4943. 8023692: db07 blt.n 80236a4 <_malloc_trim_r+0x3c>
  4944. 8023694: 2100 movs r1, #0
  4945. 8023696: 4628 mov r0, r5
  4946. 8023698: f001 fd10 bl 80250bc <_sbrk_r>
  4947. 802369c: 68a3 ldr r3, [r4, #8]
  4948. 802369e: 199b adds r3, r3, r6
  4949. 80236a0: 4298 cmp r0, r3
  4950. 80236a2: d004 beq.n 80236ae <_malloc_trim_r+0x46>
  4951. 80236a4: 4628 mov r0, r5
  4952. 80236a6: f001 f87f bl 80247a8 <__malloc_unlock>
  4953. 80236aa: 2000 movs r0, #0
  4954. 80236ac: bdf8 pop {r3, r4, r5, r6, r7, pc}
  4955. 80236ae: 4279 negs r1, r7
  4956. 80236b0: 4628 mov r0, r5
  4957. 80236b2: f001 fd03 bl 80250bc <_sbrk_r>
  4958. 80236b6: 3001 adds r0, #1
  4959. 80236b8: d010 beq.n 80236dc <_malloc_trim_r+0x74>
  4960. 80236ba: f641 1320 movw r3, #6432 ; 0x1920
  4961. 80236be: 68a1 ldr r1, [r4, #8]
  4962. 80236c0: f2c2 0300 movt r3, #8192 ; 0x2000
  4963. 80236c4: 1bf6 subs r6, r6, r7
  4964. 80236c6: 4628 mov r0, r5
  4965. 80236c8: f046 0601 orr.w r6, r6, #1
  4966. 80236cc: 681a ldr r2, [r3, #0]
  4967. 80236ce: 604e str r6, [r1, #4]
  4968. 80236d0: 1bd7 subs r7, r2, r7
  4969. 80236d2: 601f str r7, [r3, #0]
  4970. 80236d4: f001 f868 bl 80247a8 <__malloc_unlock>
  4971. 80236d8: 2001 movs r0, #1
  4972. 80236da: bdf8 pop {r3, r4, r5, r6, r7, pc}
  4973. 80236dc: 2100 movs r1, #0
  4974. 80236de: 4628 mov r0, r5
  4975. 80236e0: f001 fcec bl 80250bc <_sbrk_r>
  4976. 80236e4: 68a3 ldr r3, [r4, #8]
  4977. 80236e6: 1ac2 subs r2, r0, r3
  4978. 80236e8: 2a0f cmp r2, #15
  4979. 80236ea: dddb ble.n 80236a4 <_malloc_trim_r+0x3c>
  4980. 80236ec: f240 54a4 movw r4, #1444 ; 0x5a4
  4981. 80236f0: f641 1120 movw r1, #6432 ; 0x1920
  4982. 80236f4: f2c2 0400 movt r4, #8192 ; 0x2000
  4983. 80236f8: f2c2 0100 movt r1, #8192 ; 0x2000
  4984. 80236fc: f042 0201 orr.w r2, r2, #1
  4985. 8023700: 605a str r2, [r3, #4]
  4986. 8023702: 6823 ldr r3, [r4, #0]
  4987. 8023704: 1ac0 subs r0, r0, r3
  4988. 8023706: 6008 str r0, [r1, #0]
  4989. 8023708: e7cc b.n 80236a4 <_malloc_trim_r+0x3c>
  4990. 802370a: bf00 nop
  4991. 0802370c <_free_r>:
  4992. 802370c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  4993. 8023710: 460e mov r6, r1
  4994. 8023712: 4680 mov r8, r0
  4995. 8023714: 2900 cmp r1, #0
  4996. 8023716: d05c beq.n 80237d2 <_free_r+0xc6>
  4997. 8023718: f001 f844 bl 80247a4 <__malloc_lock>
  4998. 802371c: f240 159c movw r5, #412 ; 0x19c
  4999. 8023720: f856 1c04 ldr.w r1, [r6, #-4]
  5000. 8023724: f2c2 0500 movt r5, #8192 ; 0x2000
  5001. 8023728: f1a6 0408 sub.w r4, r6, #8
  5002. 802372c: f021 0301 bic.w r3, r1, #1
  5003. 8023730: 68af ldr r7, [r5, #8]
  5004. 8023732: 18e2 adds r2, r4, r3
  5005. 8023734: 4297 cmp r7, r2
  5006. 8023736: 6850 ldr r0, [r2, #4]
  5007. 8023738: f020 0003 bic.w r0, r0, #3
  5008. 802373c: d067 beq.n 802380e <_free_r+0x102>
  5009. 802373e: f011 0101 ands.w r1, r1, #1
  5010. 8023742: 6050 str r0, [r2, #4]
  5011. 8023744: d035 beq.n 80237b2 <_free_r+0xa6>
  5012. 8023746: 2100 movs r1, #0
  5013. 8023748: 1816 adds r6, r2, r0
  5014. 802374a: 6876 ldr r6, [r6, #4]
  5015. 802374c: f016 0f01 tst.w r6, #1
  5016. 8023750: d106 bne.n 8023760 <_free_r+0x54>
  5017. 8023752: 181b adds r3, r3, r0
  5018. 8023754: 6890 ldr r0, [r2, #8]
  5019. 8023756: 2900 cmp r1, #0
  5020. 8023758: d04d beq.n 80237f6 <_free_r+0xea>
  5021. 802375a: 68d2 ldr r2, [r2, #12]
  5022. 802375c: 60c2 str r2, [r0, #12]
  5023. 802375e: 6090 str r0, [r2, #8]
  5024. 8023760: f043 0201 orr.w r2, r3, #1
  5025. 8023764: 50e3 str r3, [r4, r3]
  5026. 8023766: 6062 str r2, [r4, #4]
  5027. 8023768: b9f1 cbnz r1, 80237a8 <_free_r+0x9c>
  5028. 802376a: f5b3 7f00 cmp.w r3, #512 ; 0x200
  5029. 802376e: d332 bcc.n 80237d6 <_free_r+0xca>
  5030. 8023770: 0a5a lsrs r2, r3, #9
  5031. 8023772: 2a04 cmp r2, #4
  5032. 8023774: d86c bhi.n 8023850 <_free_r+0x144>
  5033. 8023776: 0998 lsrs r0, r3, #6
  5034. 8023778: 3038 adds r0, #56 ; 0x38
  5035. 802377a: 0041 lsls r1, r0, #1
  5036. 802377c: eb05 0581 add.w r5, r5, r1, lsl #2
  5037. 8023780: f240 119c movw r1, #412 ; 0x19c
  5038. 8023784: f2c2 0100 movt r1, #8192 ; 0x2000
  5039. 8023788: 68aa ldr r2, [r5, #8]
  5040. 802378a: 42aa cmp r2, r5
  5041. 802378c: d06b beq.n 8023866 <_free_r+0x15a>
  5042. 802378e: 6851 ldr r1, [r2, #4]
  5043. 8023790: f021 0103 bic.w r1, r1, #3
  5044. 8023794: 428b cmp r3, r1
  5045. 8023796: d202 bcs.n 802379e <_free_r+0x92>
  5046. 8023798: 6892 ldr r2, [r2, #8]
  5047. 802379a: 4295 cmp r5, r2
  5048. 802379c: d1f7 bne.n 802378e <_free_r+0x82>
  5049. 802379e: 68d3 ldr r3, [r2, #12]
  5050. 80237a0: 60e3 str r3, [r4, #12]
  5051. 80237a2: 60a2 str r2, [r4, #8]
  5052. 80237a4: 60d4 str r4, [r2, #12]
  5053. 80237a6: 609c str r4, [r3, #8]
  5054. 80237a8: 4640 mov r0, r8
  5055. 80237aa: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  5056. 80237ae: f000 bffb b.w 80247a8 <__malloc_unlock>
  5057. 80237b2: f856 6c08 ldr.w r6, [r6, #-8]
  5058. 80237b6: f105 0c08 add.w ip, r5, #8
  5059. 80237ba: 1ba4 subs r4, r4, r6
  5060. 80237bc: 199b adds r3, r3, r6
  5061. 80237be: 68a6 ldr r6, [r4, #8]
  5062. 80237c0: 4566 cmp r6, ip
  5063. 80237c2: d043 beq.n 802384c <_free_r+0x140>
  5064. 80237c4: f8d4 c00c ldr.w ip, [r4, #12]
  5065. 80237c8: f8c6 c00c str.w ip, [r6, #12]
  5066. 80237cc: f8cc 6008 str.w r6, [ip, #8]
  5067. 80237d0: e7ba b.n 8023748 <_free_r+0x3c>
  5068. 80237d2: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  5069. 80237d6: 08db lsrs r3, r3, #3
  5070. 80237d8: 2101 movs r1, #1
  5071. 80237da: 6868 ldr r0, [r5, #4]
  5072. 80237dc: eb05 02c3 add.w r2, r5, r3, lsl #3
  5073. 80237e0: 109b asrs r3, r3, #2
  5074. 80237e2: fa01 f303 lsl.w r3, r1, r3
  5075. 80237e6: 60e2 str r2, [r4, #12]
  5076. 80237e8: 6891 ldr r1, [r2, #8]
  5077. 80237ea: 4318 orrs r0, r3
  5078. 80237ec: 6068 str r0, [r5, #4]
  5079. 80237ee: 60a1 str r1, [r4, #8]
  5080. 80237f0: 60cc str r4, [r1, #12]
  5081. 80237f2: 6094 str r4, [r2, #8]
  5082. 80237f4: e7d8 b.n 80237a8 <_free_r+0x9c>
  5083. 80237f6: 4e29 ldr r6, [pc, #164] ; (802389c <_free_r+0x190>)
  5084. 80237f8: 42b0 cmp r0, r6
  5085. 80237fa: d1ae bne.n 802375a <_free_r+0x4e>
  5086. 80237fc: 616c str r4, [r5, #20]
  5087. 80237fe: f043 0201 orr.w r2, r3, #1
  5088. 8023802: 612c str r4, [r5, #16]
  5089. 8023804: 60e0 str r0, [r4, #12]
  5090. 8023806: 60a0 str r0, [r4, #8]
  5091. 8023808: 6062 str r2, [r4, #4]
  5092. 802380a: 50e3 str r3, [r4, r3]
  5093. 802380c: e7cc b.n 80237a8 <_free_r+0x9c>
  5094. 802380e: 18c0 adds r0, r0, r3
  5095. 8023810: 07cb lsls r3, r1, #31
  5096. 8023812: d407 bmi.n 8023824 <_free_r+0x118>
  5097. 8023814: f856 3c08 ldr.w r3, [r6, #-8]
  5098. 8023818: 1ae4 subs r4, r4, r3
  5099. 802381a: 18c0 adds r0, r0, r3
  5100. 802381c: 68a2 ldr r2, [r4, #8]
  5101. 802381e: 68e3 ldr r3, [r4, #12]
  5102. 8023820: 60d3 str r3, [r2, #12]
  5103. 8023822: 609a str r2, [r3, #8]
  5104. 8023824: f240 52a8 movw r2, #1448 ; 0x5a8
  5105. 8023828: f040 0301 orr.w r3, r0, #1
  5106. 802382c: f2c2 0200 movt r2, #8192 ; 0x2000
  5107. 8023830: 6063 str r3, [r4, #4]
  5108. 8023832: 60ac str r4, [r5, #8]
  5109. 8023834: 6813 ldr r3, [r2, #0]
  5110. 8023836: 4298 cmp r0, r3
  5111. 8023838: d3b6 bcc.n 80237a8 <_free_r+0x9c>
  5112. 802383a: f641 131c movw r3, #6428 ; 0x191c
  5113. 802383e: 4640 mov r0, r8
  5114. 8023840: f2c2 0300 movt r3, #8192 ; 0x2000
  5115. 8023844: 6819 ldr r1, [r3, #0]
  5116. 8023846: f7ff ff0f bl 8023668 <_malloc_trim_r>
  5117. 802384a: e7ad b.n 80237a8 <_free_r+0x9c>
  5118. 802384c: 2101 movs r1, #1
  5119. 802384e: e77b b.n 8023748 <_free_r+0x3c>
  5120. 8023850: f102 005b add.w r0, r2, #91 ; 0x5b
  5121. 8023854: 0041 lsls r1, r0, #1
  5122. 8023856: 2a14 cmp r2, #20
  5123. 8023858: d990 bls.n 802377c <_free_r+0x70>
  5124. 802385a: 2a54 cmp r2, #84 ; 0x54
  5125. 802385c: d80c bhi.n 8023878 <_free_r+0x16c>
  5126. 802385e: 0b18 lsrs r0, r3, #12
  5127. 8023860: 306e adds r0, #110 ; 0x6e
  5128. 8023862: 0041 lsls r1, r0, #1
  5129. 8023864: e78a b.n 802377c <_free_r+0x70>
  5130. 8023866: 2601 movs r6, #1
  5131. 8023868: 684d ldr r5, [r1, #4]
  5132. 802386a: 1080 asrs r0, r0, #2
  5133. 802386c: 4613 mov r3, r2
  5134. 802386e: fa06 f000 lsl.w r0, r6, r0
  5135. 8023872: 4305 orrs r5, r0
  5136. 8023874: 604d str r5, [r1, #4]
  5137. 8023876: e793 b.n 80237a0 <_free_r+0x94>
  5138. 8023878: f5b2 7faa cmp.w r2, #340 ; 0x154
  5139. 802387c: d803 bhi.n 8023886 <_free_r+0x17a>
  5140. 802387e: 0bd8 lsrs r0, r3, #15
  5141. 8023880: 3077 adds r0, #119 ; 0x77
  5142. 8023882: 0041 lsls r1, r0, #1
  5143. 8023884: e77a b.n 802377c <_free_r+0x70>
  5144. 8023886: f240 5154 movw r1, #1364 ; 0x554
  5145. 802388a: 428a cmp r2, r1
  5146. 802388c: d803 bhi.n 8023896 <_free_r+0x18a>
  5147. 802388e: 0c98 lsrs r0, r3, #18
  5148. 8023890: 307c adds r0, #124 ; 0x7c
  5149. 8023892: 0041 lsls r1, r0, #1
  5150. 8023894: e772 b.n 802377c <_free_r+0x70>
  5151. 8023896: 21fc movs r1, #252 ; 0xfc
  5152. 8023898: 207e movs r0, #126 ; 0x7e
  5153. 802389a: e76f b.n 802377c <_free_r+0x70>
  5154. 802389c: 200001a4 .word 0x200001a4
  5155. 080238a0 <rshift>:
  5156. 80238a0: 6902 ldr r2, [r0, #16]
  5157. 80238a2: 114b asrs r3, r1, #5
  5158. 80238a4: e92d 01f0 stmdb sp!, {r4, r5, r6, r7, r8}
  5159. 80238a8: 4293 cmp r3, r2
  5160. 80238aa: f100 0714 add.w r7, r0, #20
  5161. 80238ae: da2d bge.n 802390c <rshift+0x6c>
  5162. 80238b0: 3304 adds r3, #4
  5163. 80238b2: eb00 0282 add.w r2, r0, r2, lsl #2
  5164. 80238b6: 3214 adds r2, #20
  5165. 80238b8: f011 011f ands.w r1, r1, #31
  5166. 80238bc: eb00 0383 add.w r3, r0, r3, lsl #2
  5167. 80238c0: f103 0c04 add.w ip, r3, #4
  5168. 80238c4: d029 beq.n 802391a <rshift+0x7a>
  5169. 80238c6: 685c ldr r4, [r3, #4]
  5170. 80238c8: f10c 0304 add.w r3, ip, #4
  5171. 80238cc: 429a cmp r2, r3
  5172. 80238ce: f1c1 0820 rsb r8, r1, #32
  5173. 80238d2: fa24 f401 lsr.w r4, r4, r1
  5174. 80238d6: d938 bls.n 802394a <rshift+0xaa>
  5175. 80238d8: 463d mov r5, r7
  5176. 80238da: 681e ldr r6, [r3, #0]
  5177. 80238dc: fa06 f608 lsl.w r6, r6, r8
  5178. 80238e0: 4334 orrs r4, r6
  5179. 80238e2: f845 4b04 str.w r4, [r5], #4
  5180. 80238e6: f853 4b04 ldr.w r4, [r3], #4
  5181. 80238ea: 429a cmp r2, r3
  5182. 80238ec: fa24 f401 lsr.w r4, r4, r1
  5183. 80238f0: d8f3 bhi.n 80238da <rshift+0x3a>
  5184. 80238f2: ebcc 0302 rsb r3, ip, r2
  5185. 80238f6: 3b05 subs r3, #5
  5186. 80238f8: f023 0303 bic.w r3, r3, #3
  5187. 80238fc: 18c3 adds r3, r0, r3
  5188. 80238fe: 3318 adds r3, #24
  5189. 8023900: 601c str r4, [r3, #0]
  5190. 8023902: b1e4 cbz r4, 802393e <rshift+0x9e>
  5191. 8023904: 3304 adds r3, #4
  5192. 8023906: 1bdf subs r7, r3, r7
  5193. 8023908: 10bf asrs r7, r7, #2
  5194. 802390a: e01a b.n 8023942 <rshift+0xa2>
  5195. 802390c: 2300 movs r3, #0
  5196. 802390e: 6103 str r3, [r0, #16]
  5197. 8023910: 2300 movs r3, #0
  5198. 8023912: 6143 str r3, [r0, #20]
  5199. 8023914: e8bd 01f0 ldmia.w sp!, {r4, r5, r6, r7, r8}
  5200. 8023918: 4770 bx lr
  5201. 802391a: 4562 cmp r2, ip
  5202. 802391c: bf84 itt hi
  5203. 802391e: 4663 movhi r3, ip
  5204. 8023920: 4639 movhi r1, r7
  5205. 8023922: d9f3 bls.n 802390c <rshift+0x6c>
  5206. 8023924: f853 4b04 ldr.w r4, [r3], #4
  5207. 8023928: 429a cmp r2, r3
  5208. 802392a: f841 4b04 str.w r4, [r1], #4
  5209. 802392e: d8f9 bhi.n 8023924 <rshift+0x84>
  5210. 8023930: ea6f 030c mvn.w r3, ip
  5211. 8023934: 189b adds r3, r3, r2
  5212. 8023936: f023 0303 bic.w r3, r3, #3
  5213. 802393a: 18c3 adds r3, r0, r3
  5214. 802393c: 3318 adds r3, #24
  5215. 802393e: 1bdf subs r7, r3, r7
  5216. 8023940: 10bf asrs r7, r7, #2
  5217. 8023942: 6107 str r7, [r0, #16]
  5218. 8023944: 2f00 cmp r7, #0
  5219. 8023946: d1e5 bne.n 8023914 <rshift+0x74>
  5220. 8023948: e7e2 b.n 8023910 <rshift+0x70>
  5221. 802394a: 463b mov r3, r7
  5222. 802394c: e7d8 b.n 8023900 <rshift+0x60>
  5223. 802394e: bf00 nop
  5224. 08023950 <__hexdig_init>:
  5225. 8023950: f640 10c8 movw r0, #2504 ; 0x9c8
  5226. 8023954: f245 133c movw r3, #20796 ; 0x513c
  5227. 8023958: f6c0 0004 movt r0, #2052 ; 0x804
  5228. 802395c: 2110 movs r1, #16
  5229. 802395e: 2230 movs r2, #48 ; 0x30
  5230. 8023960: f2c2 0301 movt r3, #8193 ; 0x2001
  5231. 8023964: 5499 strb r1, [r3, r2]
  5232. 8023966: 3101 adds r1, #1
  5233. 8023968: f810 2f01 ldrb.w r2, [r0, #1]!
  5234. 802396c: b2c9 uxtb r1, r1
  5235. 802396e: 2a00 cmp r2, #0
  5236. 8023970: d1f8 bne.n 8023964 <__hexdig_init+0x14>
  5237. 8023972: f640 10c0 movw r0, #2496 ; 0x9c0
  5238. 8023976: 211a movs r1, #26
  5239. 8023978: f6c0 0004 movt r0, #2052 ; 0x804
  5240. 802397c: 2261 movs r2, #97 ; 0x61
  5241. 802397e: 5499 strb r1, [r3, r2]
  5242. 8023980: 3101 adds r1, #1
  5243. 8023982: f810 2f01 ldrb.w r2, [r0, #1]!
  5244. 8023986: b2c9 uxtb r1, r1
  5245. 8023988: 2a00 cmp r2, #0
  5246. 802398a: d1f8 bne.n 802397e <__hexdig_init+0x2e>
  5247. 802398c: f640 10b8 movw r0, #2488 ; 0x9b8
  5248. 8023990: 211a movs r1, #26
  5249. 8023992: f6c0 0004 movt r0, #2052 ; 0x804
  5250. 8023996: 2241 movs r2, #65 ; 0x41
  5251. 8023998: 5499 strb r1, [r3, r2]
  5252. 802399a: 3101 adds r1, #1
  5253. 802399c: f810 2f01 ldrb.w r2, [r0, #1]!
  5254. 80239a0: b2c9 uxtb r1, r1
  5255. 80239a2: 2a00 cmp r2, #0
  5256. 80239a4: d1f8 bne.n 8023998 <__hexdig_init+0x48>
  5257. 80239a6: 4770 bx lr
  5258. 080239a8 <__gethex>:
  5259. 80239a8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  5260. 80239ac: b08b sub sp, #44 ; 0x2c
  5261. 80239ae: 4688 mov r8, r1
  5262. 80239b0: f245 163c movw r6, #20796 ; 0x513c
  5263. 80239b4: 9206 str r2, [sp, #24]
  5264. 80239b6: f2c2 0601 movt r6, #8193 ; 0x2001
  5265. 80239ba: 9309 str r3, [sp, #36] ; 0x24
  5266. 80239bc: 9007 str r0, [sp, #28]
  5267. 80239be: f000 fbb9 bl 8024134 <_localeconv_r>
  5268. 80239c2: 6800 ldr r0, [r0, #0]
  5269. 80239c4: 9002 str r0, [sp, #8]
  5270. 80239c6: f7fe fa53 bl 8021e70 <strlen>
  5271. 80239ca: 9b02 ldr r3, [sp, #8]
  5272. 80239cc: 181a adds r2, r3, r0
  5273. 80239ce: f896 3030 ldrb.w r3, [r6, #48] ; 0x30
  5274. 80239d2: 9003 str r0, [sp, #12]
  5275. 80239d4: f812 ac01 ldrb.w sl, [r2, #-1]
  5276. 80239d8: 2b00 cmp r3, #0
  5277. 80239da: f000 810e beq.w 8023bfa <__gethex+0x252>
  5278. 80239de: f8d8 3000 ldr.w r3, [r8]
  5279. 80239e2: 1c9d adds r5, r3, #2
  5280. 80239e4: 789a ldrb r2, [r3, #2]
  5281. 80239e6: 2a30 cmp r2, #48 ; 0x30
  5282. 80239e8: f040 8200 bne.w 8023dec <__gethex+0x444>
  5283. 80239ec: 3303 adds r3, #3
  5284. 80239ee: 2700 movs r7, #0
  5285. 80239f0: 461d mov r5, r3
  5286. 80239f2: f813 2b01 ldrb.w r2, [r3], #1
  5287. 80239f6: 3701 adds r7, #1
  5288. 80239f8: 2a30 cmp r2, #48 ; 0x30
  5289. 80239fa: d0f9 beq.n 80239f0 <__gethex+0x48>
  5290. 80239fc: f816 b002 ldrb.w fp, [r6, r2]
  5291. 8023a00: f245 193c movw r9, #20796 ; 0x513c
  5292. 8023a04: f2c2 0901 movt r9, #8193 ; 0x2001
  5293. 8023a08: f1bb 0f00 cmp.w fp, #0
  5294. 8023a0c: f000 80f8 beq.w 8023c00 <__gethex+0x258>
  5295. 8023a10: 782b ldrb r3, [r5, #0]
  5296. 8023a12: f04f 0b00 mov.w fp, #0
  5297. 8023a16: f819 4003 ldrb.w r4, [r9, r3]
  5298. 8023a1a: 2c00 cmp r4, #0
  5299. 8023a1c: f000 8200 beq.w 8023e20 <__gethex+0x478>
  5300. 8023a20: 1c6a adds r2, r5, #1
  5301. 8023a22: 4614 mov r4, r2
  5302. 8023a24: 3201 adds r2, #1
  5303. 8023a26: 7823 ldrb r3, [r4, #0]
  5304. 8023a28: 5cf3 ldrb r3, [r6, r3]
  5305. 8023a2a: 2b00 cmp r3, #0
  5306. 8023a2c: d1f9 bne.n 8023a22 <__gethex+0x7a>
  5307. 8023a2e: 4699 mov r9, r3
  5308. 8023a30: 4620 mov r0, r4
  5309. 8023a32: 9902 ldr r1, [sp, #8]
  5310. 8023a34: 9a03 ldr r2, [sp, #12]
  5311. 8023a36: f7fe fa7d bl 8021f34 <strncmp>
  5312. 8023a3a: b1e8 cbz r0, 8023a78 <__gethex+0xd0>
  5313. 8023a3c: 7823 ldrb r3, [r4, #0]
  5314. 8023a3e: f1bb 0f00 cmp.w fp, #0
  5315. 8023a42: f000 81c1 beq.w 8023dc8 <__gethex+0x420>
  5316. 8023a46: ebc4 0b0b rsb fp, r4, fp
  5317. 8023a4a: ea4f 028b mov.w r2, fp, lsl #2
  5318. 8023a4e: 9205 str r2, [sp, #20]
  5319. 8023a50: 2b50 cmp r3, #80 ; 0x50
  5320. 8023a52: f000 809b beq.w 8023b8c <__gethex+0x1e4>
  5321. 8023a56: 2b70 cmp r3, #112 ; 0x70
  5322. 8023a58: f000 8098 beq.w 8023b8c <__gethex+0x1e4>
  5323. 8023a5c: 4622 mov r2, r4
  5324. 8023a5e: f8c8 2000 str.w r2, [r8]
  5325. 8023a62: f1b9 0f00 cmp.w r9, #0
  5326. 8023a66: d00d beq.n 8023a84 <__gethex+0xdc>
  5327. 8023a68: 2f00 cmp r7, #0
  5328. 8023a6a: bf0c ite eq
  5329. 8023a6c: 2706 moveq r7, #6
  5330. 8023a6e: 2700 movne r7, #0
  5331. 8023a70: 4638 mov r0, r7
  5332. 8023a72: b00b add sp, #44 ; 0x2c
  5333. 8023a74: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  5334. 8023a78: f1bb 0f00 cmp.w fp, #0
  5335. 8023a7c: f000 81be beq.w 8023dfc <__gethex+0x454>
  5336. 8023a80: 7823 ldrb r3, [r4, #0]
  5337. 8023a82: e7e0 b.n 8023a46 <__gethex+0x9e>
  5338. 8023a84: 1b63 subs r3, r4, r5
  5339. 8023a86: 4649 mov r1, r9
  5340. 8023a88: 3b01 subs r3, #1
  5341. 8023a8a: 2b07 cmp r3, #7
  5342. 8023a8c: dd03 ble.n 8023a96 <__gethex+0xee>
  5343. 8023a8e: 105b asrs r3, r3, #1
  5344. 8023a90: 3101 adds r1, #1
  5345. 8023a92: 2b07 cmp r3, #7
  5346. 8023a94: dcfb bgt.n 8023a8e <__gethex+0xe6>
  5347. 8023a96: 9807 ldr r0, [sp, #28]
  5348. 8023a98: f000 fe88 bl 80247ac <_Balloc>
  5349. 8023a9c: 42a5 cmp r5, r4
  5350. 8023a9e: f100 0314 add.w r3, r0, #20
  5351. 8023aa2: 9004 str r0, [sp, #16]
  5352. 8023aa4: 9308 str r3, [sp, #32]
  5353. 8023aa6: f080 81db bcs.w 8023e60 <__gethex+0x4b8>
  5354. 8023aaa: 469b mov fp, r3
  5355. 8023aac: 9b03 ldr r3, [sp, #12]
  5356. 8023aae: f04f 0800 mov.w r8, #0
  5357. 8023ab2: 4647 mov r7, r8
  5358. 8023ab4: f1c3 0c01 rsb ip, r3, #1
  5359. 8023ab8: e00f b.n 8023ada <__gethex+0x132>
  5360. 8023aba: 2f20 cmp r7, #32
  5361. 8023abc: d05f beq.n 8023b7e <__gethex+0x1d6>
  5362. 8023abe: 463a mov r2, r7
  5363. 8023ac0: 3704 adds r7, #4
  5364. 8023ac2: f814 3c01 ldrb.w r3, [r4, #-1]
  5365. 8023ac6: 464c mov r4, r9
  5366. 8023ac8: 42a5 cmp r5, r4
  5367. 8023aca: 5cf3 ldrb r3, [r6, r3]
  5368. 8023acc: f003 030f and.w r3, r3, #15
  5369. 8023ad0: fa03 f302 lsl.w r3, r3, r2
  5370. 8023ad4: ea48 0803 orr.w r8, r8, r3
  5371. 8023ad8: d219 bcs.n 8023b0e <__gethex+0x166>
  5372. 8023ada: f814 3c01 ldrb.w r3, [r4, #-1]
  5373. 8023ade: f104 39ff add.w r9, r4, #4294967295
  5374. 8023ae2: 4553 cmp r3, sl
  5375. 8023ae4: d1e9 bne.n 8023aba <__gethex+0x112>
  5376. 8023ae6: eb09 030c add.w r3, r9, ip
  5377. 8023aea: 429d cmp r5, r3
  5378. 8023aec: d8e5 bhi.n 8023aba <__gethex+0x112>
  5379. 8023aee: 4618 mov r0, r3
  5380. 8023af0: 9902 ldr r1, [sp, #8]
  5381. 8023af2: 9a03 ldr r2, [sp, #12]
  5382. 8023af4: 9301 str r3, [sp, #4]
  5383. 8023af6: f8cd c000 str.w ip, [sp]
  5384. 8023afa: f7fe fa1b bl 8021f34 <strncmp>
  5385. 8023afe: 9b01 ldr r3, [sp, #4]
  5386. 8023b00: f8dd c000 ldr.w ip, [sp]
  5387. 8023b04: 2800 cmp r0, #0
  5388. 8023b06: d1d8 bne.n 8023aba <__gethex+0x112>
  5389. 8023b08: 461c mov r4, r3
  5390. 8023b0a: 42a5 cmp r5, r4
  5391. 8023b0c: d3e5 bcc.n 8023ada <__gethex+0x132>
  5392. 8023b0e: 9b08 ldr r3, [sp, #32]
  5393. 8023b10: 4640 mov r0, r8
  5394. 8023b12: f84b 8b04 str.w r8, [fp], #4
  5395. 8023b16: 9904 ldr r1, [sp, #16]
  5396. 8023b18: ebc3 0b0b rsb fp, r3, fp
  5397. 8023b1c: ea4f 03ab mov.w r3, fp, asr #2
  5398. 8023b20: 610b str r3, [r1, #16]
  5399. 8023b22: 015d lsls r5, r3, #5
  5400. 8023b24: f000 ff24 bl 8024970 <__hi0bits>
  5401. 8023b28: 9a06 ldr r2, [sp, #24]
  5402. 8023b2a: 6814 ldr r4, [r2, #0]
  5403. 8023b2c: 1a28 subs r0, r5, r0
  5404. 8023b2e: 42a0 cmp r0, r4
  5405. 8023b30: f300 8125 bgt.w 8023d7e <__gethex+0x3d6>
  5406. 8023b34: f2c0 814b blt.w 8023dce <__gethex+0x426>
  5407. 8023b38: 2500 movs r5, #0
  5408. 8023b3a: 9806 ldr r0, [sp, #24]
  5409. 8023b3c: 9905 ldr r1, [sp, #20]
  5410. 8023b3e: 6883 ldr r3, [r0, #8]
  5411. 8023b40: 4299 cmp r1, r3
  5412. 8023b42: f300 80f6 bgt.w 8023d32 <__gethex+0x38a>
  5413. 8023b46: 9806 ldr r0, [sp, #24]
  5414. 8023b48: 9905 ldr r1, [sp, #20]
  5415. 8023b4a: 6843 ldr r3, [r0, #4]
  5416. 8023b4c: 4299 cmp r1, r3
  5417. 8023b4e: f280 8100 bge.w 8023d52 <__gethex+0x3aa>
  5418. 8023b52: 1a5e subs r6, r3, r1
  5419. 8023b54: 42b4 cmp r4, r6
  5420. 8023b56: dc76 bgt.n 8023c46 <__gethex+0x29e>
  5421. 8023b58: 68c2 ldr r2, [r0, #12]
  5422. 8023b5a: 2a02 cmp r2, #2
  5423. 8023b5c: f000 816f beq.w 8023e3e <__gethex+0x496>
  5424. 8023b60: 2a03 cmp r2, #3
  5425. 8023b62: f000 8198 beq.w 8023e96 <__gethex+0x4ee>
  5426. 8023b66: 2a01 cmp r2, #1
  5427. 8023b68: f000 8186 beq.w 8023e78 <__gethex+0x4d0>
  5428. 8023b6c: 9807 ldr r0, [sp, #28]
  5429. 8023b6e: 2750 movs r7, #80 ; 0x50
  5430. 8023b70: 9904 ldr r1, [sp, #16]
  5431. 8023b72: f000 fe51 bl 8024818 <_Bfree>
  5432. 8023b76: 9814 ldr r0, [sp, #80] ; 0x50
  5433. 8023b78: 2300 movs r3, #0
  5434. 8023b7a: 6003 str r3, [r0, #0]
  5435. 8023b7c: e778 b.n 8023a70 <__gethex+0xc8>
  5436. 8023b7e: f84b 8b04 str.w r8, [fp], #4
  5437. 8023b82: f04f 0800 mov.w r8, #0
  5438. 8023b86: 2704 movs r7, #4
  5439. 8023b88: 4642 mov r2, r8
  5440. 8023b8a: e79a b.n 8023ac2 <__gethex+0x11a>
  5441. 8023b8c: 7863 ldrb r3, [r4, #1]
  5442. 8023b8e: 2b2b cmp r3, #43 ; 0x2b
  5443. 8023b90: f000 80f2 beq.w 8023d78 <__gethex+0x3d0>
  5444. 8023b94: 2b2d cmp r3, #45 ; 0x2d
  5445. 8023b96: f000 80ea beq.w 8023d6e <__gethex+0x3c6>
  5446. 8023b9a: 1c60 adds r0, r4, #1
  5447. 8023b9c: f04f 0b00 mov.w fp, #0
  5448. 8023ba0: 5cf1 ldrb r1, [r6, r3]
  5449. 8023ba2: f245 133c movw r3, #20796 ; 0x513c
  5450. 8023ba6: f2c2 0301 movt r3, #8193 ; 0x2001
  5451. 8023baa: 2900 cmp r1, #0
  5452. 8023bac: f43f af56 beq.w 8023a5c <__gethex+0xb4>
  5453. 8023bb0: 2919 cmp r1, #25
  5454. 8023bb2: f73f af53 bgt.w 8023a5c <__gethex+0xb4>
  5455. 8023bb6: f890 c001 ldrb.w ip, [r0, #1]
  5456. 8023bba: 3910 subs r1, #16
  5457. 8023bbc: 1c42 adds r2, r0, #1
  5458. 8023bbe: f813 300c ldrb.w r3, [r3, ip]
  5459. 8023bc2: b193 cbz r3, 8023bea <__gethex+0x242>
  5460. 8023bc4: 2b19 cmp r3, #25
  5461. 8023bc6: dc10 bgt.n 8023bea <__gethex+0x242>
  5462. 8023bc8: 3002 adds r0, #2
  5463. 8023bca: e001 b.n 8023bd0 <__gethex+0x228>
  5464. 8023bcc: 2b19 cmp r3, #25
  5465. 8023bce: dc0c bgt.n 8023bea <__gethex+0x242>
  5466. 8023bd0: 4602 mov r2, r0
  5467. 8023bd2: eb01 0181 add.w r1, r1, r1, lsl #2
  5468. 8023bd6: 3001 adds r0, #1
  5469. 8023bd8: f892 c000 ldrb.w ip, [r2]
  5470. 8023bdc: eb03 0141 add.w r1, r3, r1, lsl #1
  5471. 8023be0: 3910 subs r1, #16
  5472. 8023be2: f816 300c ldrb.w r3, [r6, ip]
  5473. 8023be6: 2b00 cmp r3, #0
  5474. 8023be8: d1f0 bne.n 8023bcc <__gethex+0x224>
  5475. 8023bea: f1bb 0f00 cmp.w fp, #0
  5476. 8023bee: d000 beq.n 8023bf2 <__gethex+0x24a>
  5477. 8023bf0: 4249 negs r1, r1
  5478. 8023bf2: 9b05 ldr r3, [sp, #20]
  5479. 8023bf4: 185b adds r3, r3, r1
  5480. 8023bf6: 9305 str r3, [sp, #20]
  5481. 8023bf8: e731 b.n 8023a5e <__gethex+0xb6>
  5482. 8023bfa: f7ff fea9 bl 8023950 <__hexdig_init>
  5483. 8023bfe: e6ee b.n 80239de <__gethex+0x36>
  5484. 8023c00: 4628 mov r0, r5
  5485. 8023c02: 9902 ldr r1, [sp, #8]
  5486. 8023c04: 9a03 ldr r2, [sp, #12]
  5487. 8023c06: f7fe f995 bl 8021f34 <strncmp>
  5488. 8023c0a: 2800 cmp r0, #0
  5489. 8023c0c: f040 809a bne.w 8023d44 <__gethex+0x39c>
  5490. 8023c10: 9803 ldr r0, [sp, #12]
  5491. 8023c12: 182c adds r4, r5, r0
  5492. 8023c14: 5c2b ldrb r3, [r5, r0]
  5493. 8023c16: f819 2003 ldrb.w r2, [r9, r3]
  5494. 8023c1a: 2a00 cmp r2, #0
  5495. 8023c1c: f000 80e8 beq.w 8023df0 <__gethex+0x448>
  5496. 8023c20: 2b30 cmp r3, #48 ; 0x30
  5497. 8023c22: f040 8108 bne.w 8023e36 <__gethex+0x48e>
  5498. 8023c26: 1c63 adds r3, r4, #1
  5499. 8023c28: 461d mov r5, r3
  5500. 8023c2a: f813 2b01 ldrb.w r2, [r3], #1
  5501. 8023c2e: 2a30 cmp r2, #48 ; 0x30
  5502. 8023c30: d0fa beq.n 8023c28 <__gethex+0x280>
  5503. 8023c32: 5cb3 ldrb r3, [r6, r2]
  5504. 8023c34: 2b00 cmp r3, #0
  5505. 8023c36: f040 80ff bne.w 8023e38 <__gethex+0x490>
  5506. 8023c3a: f04f 0901 mov.w r9, #1
  5507. 8023c3e: 46a3 mov fp, r4
  5508. 8023c40: 464f mov r7, r9
  5509. 8023c42: 462c mov r4, r5
  5510. 8023c44: e6f4 b.n 8023a30 <__gethex+0x88>
  5511. 8023c46: 1e77 subs r7, r6, #1
  5512. 8023c48: 2d00 cmp r5, #0
  5513. 8023c4a: f040 80e7 bne.w 8023e1c <__gethex+0x474>
  5514. 8023c4e: 2f00 cmp r7, #0
  5515. 8023c50: dd04 ble.n 8023c5c <__gethex+0x2b4>
  5516. 8023c52: 9804 ldr r0, [sp, #16]
  5517. 8023c54: 4639 mov r1, r7
  5518. 8023c56: f001 fa05 bl 8025064 <__any_on>
  5519. 8023c5a: 4605 mov r5, r0
  5520. 8023c5c: 9908 ldr r1, [sp, #32]
  5521. 8023c5e: 117b asrs r3, r7, #5
  5522. 8023c60: 2201 movs r2, #1
  5523. 8023c62: f007 071f and.w r7, r7, #31
  5524. 8023c66: 9804 ldr r0, [sp, #16]
  5525. 8023c68: 1ba4 subs r4, r4, r6
  5526. 8023c6a: f851 3023 ldr.w r3, [r1, r3, lsl #2]
  5527. 8023c6e: fa02 f207 lsl.w r2, r2, r7
  5528. 8023c72: 4631 mov r1, r6
  5529. 8023c74: 421a tst r2, r3
  5530. 8023c76: bf18 it ne
  5531. 8023c78: f045 0502 orrne.w r5, r5, #2
  5532. 8023c7c: f7ff fe10 bl 80238a0 <rshift>
  5533. 8023c80: 9b06 ldr r3, [sp, #24]
  5534. 8023c82: 2702 movs r7, #2
  5535. 8023c84: 685b ldr r3, [r3, #4]
  5536. 8023c86: 9305 str r3, [sp, #20]
  5537. 8023c88: 2d00 cmp r5, #0
  5538. 8023c8a: d069 beq.n 8023d60 <__gethex+0x3b8>
  5539. 8023c8c: 9806 ldr r0, [sp, #24]
  5540. 8023c8e: 68c3 ldr r3, [r0, #12]
  5541. 8023c90: 2b02 cmp r3, #2
  5542. 8023c92: f000 80ea beq.w 8023e6a <__gethex+0x4c2>
  5543. 8023c96: 2b03 cmp r3, #3
  5544. 8023c98: d05d beq.n 8023d56 <__gethex+0x3ae>
  5545. 8023c9a: 2b01 cmp r3, #1
  5546. 8023c9c: d15e bne.n 8023d5c <__gethex+0x3b4>
  5547. 8023c9e: 07aa lsls r2, r5, #30
  5548. 8023ca0: d55c bpl.n 8023d5c <__gethex+0x3b4>
  5549. 8023ca2: 9908 ldr r1, [sp, #32]
  5550. 8023ca4: 680b ldr r3, [r1, #0]
  5551. 8023ca6: 432b orrs r3, r5
  5552. 8023ca8: 07db lsls r3, r3, #31
  5553. 8023caa: d557 bpl.n 8023d5c <__gethex+0x3b4>
  5554. 8023cac: 9b04 ldr r3, [sp, #16]
  5555. 8023cae: 2600 movs r6, #0
  5556. 8023cb0: 9904 ldr r1, [sp, #16]
  5557. 8023cb2: 691d ldr r5, [r3, #16]
  5558. 8023cb4: 9b08 ldr r3, [sp, #32]
  5559. 8023cb6: eb01 0085 add.w r0, r1, r5, lsl #2
  5560. 8023cba: 3014 adds r0, #20
  5561. 8023cbc: 4619 mov r1, r3
  5562. 8023cbe: f853 2b04 ldr.w r2, [r3], #4
  5563. 8023cc2: f1b2 3fff cmp.w r2, #4294967295
  5564. 8023cc6: f040 80eb bne.w 8023ea0 <__gethex+0x4f8>
  5565. 8023cca: 4298 cmp r0, r3
  5566. 8023ccc: f843 6c04 str.w r6, [r3, #-4]
  5567. 8023cd0: d8f4 bhi.n 8023cbc <__gethex+0x314>
  5568. 8023cd2: 9a04 ldr r2, [sp, #16]
  5569. 8023cd4: 6893 ldr r3, [r2, #8]
  5570. 8023cd6: 429d cmp r5, r3
  5571. 8023cd8: bfb8 it lt
  5572. 8023cda: 462b movlt r3, r5
  5573. 8023cdc: f280 80f9 bge.w 8023ed2 <__gethex+0x52a>
  5574. 8023ce0: 9904 ldr r1, [sp, #16]
  5575. 8023ce2: eb01 0283 add.w r2, r1, r3, lsl #2
  5576. 8023ce6: 3301 adds r3, #1
  5577. 8023ce8: 610b str r3, [r1, #16]
  5578. 8023cea: 2301 movs r3, #1
  5579. 8023cec: 6153 str r3, [r2, #20]
  5580. 8023cee: 2f02 cmp r7, #2
  5581. 8023cf0: f000 80d9 beq.w 8023ea6 <__gethex+0x4fe>
  5582. 8023cf4: 9904 ldr r1, [sp, #16]
  5583. 8023cf6: 690b ldr r3, [r1, #16]
  5584. 8023cf8: 429d cmp r5, r3
  5585. 8023cfa: db0e blt.n 8023d1a <__gethex+0x372>
  5586. 8023cfc: f014 041f ands.w r4, r4, #31
  5587. 8023d00: f000 80ac beq.w 8023e5c <__gethex+0x4b4>
  5588. 8023d04: 9b04 ldr r3, [sp, #16]
  5589. 8023d06: eb03 0585 add.w r5, r3, r5, lsl #2
  5590. 8023d0a: 6928 ldr r0, [r5, #16]
  5591. 8023d0c: f000 fe30 bl 8024970 <__hi0bits>
  5592. 8023d10: f1c4 0320 rsb r3, r4, #32
  5593. 8023d14: 4298 cmp r0, r3
  5594. 8023d16: f280 80a1 bge.w 8023e5c <__gethex+0x4b4>
  5595. 8023d1a: 9804 ldr r0, [sp, #16]
  5596. 8023d1c: 2101 movs r1, #1
  5597. 8023d1e: f7ff fdbf bl 80238a0 <rshift>
  5598. 8023d22: 9a06 ldr r2, [sp, #24]
  5599. 8023d24: 9805 ldr r0, [sp, #20]
  5600. 8023d26: 6893 ldr r3, [r2, #8]
  5601. 8023d28: 3001 adds r0, #1
  5602. 8023d2a: 9005 str r0, [sp, #20]
  5603. 8023d2c: 4298 cmp r0, r3
  5604. 8023d2e: f340 8095 ble.w 8023e5c <__gethex+0x4b4>
  5605. 8023d32: 9807 ldr r0, [sp, #28]
  5606. 8023d34: 27a3 movs r7, #163 ; 0xa3
  5607. 8023d36: 9904 ldr r1, [sp, #16]
  5608. 8023d38: f000 fd6e bl 8024818 <_Bfree>
  5609. 8023d3c: 9a14 ldr r2, [sp, #80] ; 0x50
  5610. 8023d3e: 2300 movs r3, #0
  5611. 8023d40: 6013 str r3, [r2, #0]
  5612. 8023d42: e695 b.n 8023a70 <__gethex+0xc8>
  5613. 8023d44: 782b ldrb r3, [r5, #0]
  5614. 8023d46: 462c mov r4, r5
  5615. 8023d48: f8cd b014 str.w fp, [sp, #20]
  5616. 8023d4c: f04f 0901 mov.w r9, #1
  5617. 8023d50: e67e b.n 8023a50 <__gethex+0xa8>
  5618. 8023d52: 2701 movs r7, #1
  5619. 8023d54: e798 b.n 8023c88 <__gethex+0x2e0>
  5620. 8023d56: 9b15 ldr r3, [sp, #84] ; 0x54
  5621. 8023d58: 2b00 cmp r3, #0
  5622. 8023d5a: d1a7 bne.n 8023cac <__gethex+0x304>
  5623. 8023d5c: f047 0710 orr.w r7, r7, #16
  5624. 8023d60: 9b04 ldr r3, [sp, #16]
  5625. 8023d62: 9814 ldr r0, [sp, #80] ; 0x50
  5626. 8023d64: 6003 str r3, [r0, #0]
  5627. 8023d66: 9b05 ldr r3, [sp, #20]
  5628. 8023d68: 9809 ldr r0, [sp, #36] ; 0x24
  5629. 8023d6a: 6003 str r3, [r0, #0]
  5630. 8023d6c: e680 b.n 8023a70 <__gethex+0xc8>
  5631. 8023d6e: f04f 0b01 mov.w fp, #1
  5632. 8023d72: 78a3 ldrb r3, [r4, #2]
  5633. 8023d74: 1ca0 adds r0, r4, #2
  5634. 8023d76: e713 b.n 8023ba0 <__gethex+0x1f8>
  5635. 8023d78: f04f 0b00 mov.w fp, #0
  5636. 8023d7c: e7f9 b.n 8023d72 <__gethex+0x3ca>
  5637. 8023d7e: 1b06 subs r6, r0, r4
  5638. 8023d80: 9804 ldr r0, [sp, #16]
  5639. 8023d82: 4631 mov r1, r6
  5640. 8023d84: f001 f96e bl 8025064 <__any_on>
  5641. 8023d88: 4605 mov r5, r0
  5642. 8023d8a: b1a8 cbz r0, 8023db8 <__gethex+0x410>
  5643. 8023d8c: 1e73 subs r3, r6, #1
  5644. 8023d8e: 9804 ldr r0, [sp, #16]
  5645. 8023d90: 2501 movs r5, #1
  5646. 8023d92: f003 011f and.w r1, r3, #31
  5647. 8023d96: 115a asrs r2, r3, #5
  5648. 8023d98: fa05 f101 lsl.w r1, r5, r1
  5649. 8023d9c: eb00 0282 add.w r2, r0, r2, lsl #2
  5650. 8023da0: 6952 ldr r2, [r2, #20]
  5651. 8023da2: 4211 tst r1, r2
  5652. 8023da4: d008 beq.n 8023db8 <__gethex+0x410>
  5653. 8023da6: 42ab cmp r3, r5
  5654. 8023da8: dd05 ble.n 8023db6 <__gethex+0x40e>
  5655. 8023daa: 9804 ldr r0, [sp, #16]
  5656. 8023dac: 1eb1 subs r1, r6, #2
  5657. 8023dae: f001 f959 bl 8025064 <__any_on>
  5658. 8023db2: 2503 movs r5, #3
  5659. 8023db4: b900 cbnz r0, 8023db8 <__gethex+0x410>
  5660. 8023db6: 2502 movs r5, #2
  5661. 8023db8: 9804 ldr r0, [sp, #16]
  5662. 8023dba: 4631 mov r1, r6
  5663. 8023dbc: f7ff fd70 bl 80238a0 <rshift>
  5664. 8023dc0: 9b05 ldr r3, [sp, #20]
  5665. 8023dc2: 199b adds r3, r3, r6
  5666. 8023dc4: 9305 str r3, [sp, #20]
  5667. 8023dc6: e6b8 b.n 8023b3a <__gethex+0x192>
  5668. 8023dc8: f8cd b014 str.w fp, [sp, #20]
  5669. 8023dcc: e640 b.n 8023a50 <__gethex+0xa8>
  5670. 8023dce: 1a25 subs r5, r4, r0
  5671. 8023dd0: 9904 ldr r1, [sp, #16]
  5672. 8023dd2: 462a mov r2, r5
  5673. 8023dd4: 9807 ldr r0, [sp, #28]
  5674. 8023dd6: f000 ff11 bl 8024bfc <__lshift>
  5675. 8023dda: 9b05 ldr r3, [sp, #20]
  5676. 8023ddc: 1b5b subs r3, r3, r5
  5677. 8023dde: 2500 movs r5, #0
  5678. 8023de0: 9305 str r3, [sp, #20]
  5679. 8023de2: 9004 str r0, [sp, #16]
  5680. 8023de4: f100 0314 add.w r3, r0, #20
  5681. 8023de8: 9308 str r3, [sp, #32]
  5682. 8023dea: e6a6 b.n 8023b3a <__gethex+0x192>
  5683. 8023dec: 2700 movs r7, #0
  5684. 8023dee: e605 b.n 80239fc <__gethex+0x54>
  5685. 8023df0: 9205 str r2, [sp, #20]
  5686. 8023df2: f04f 0901 mov.w r9, #1
  5687. 8023df6: e62b b.n 8023a50 <__gethex+0xa8>
  5688. 8023df8: 462c mov r4, r5
  5689. 8023dfa: 4681 mov r9, r0
  5690. 8023dfc: 9903 ldr r1, [sp, #12]
  5691. 8023dfe: eb04 0b01 add.w fp, r4, r1
  5692. 8023e02: 5c63 ldrb r3, [r4, r1]
  5693. 8023e04: 5cf2 ldrb r2, [r6, r3]
  5694. 8023e06: 2a00 cmp r2, #0
  5695. 8023e08: d07a beq.n 8023f00 <__gethex+0x558>
  5696. 8023e0a: f10b 0201 add.w r2, fp, #1
  5697. 8023e0e: 4614 mov r4, r2
  5698. 8023e10: f812 3b01 ldrb.w r3, [r2], #1
  5699. 8023e14: 5cf1 ldrb r1, [r6, r3]
  5700. 8023e16: 2900 cmp r1, #0
  5701. 8023e18: d1f9 bne.n 8023e0e <__gethex+0x466>
  5702. 8023e1a: e614 b.n 8023a46 <__gethex+0x9e>
  5703. 8023e1c: 2501 movs r5, #1
  5704. 8023e1e: e71d b.n 8023c5c <__gethex+0x2b4>
  5705. 8023e20: 4628 mov r0, r5
  5706. 8023e22: 9902 ldr r1, [sp, #8]
  5707. 8023e24: 9a03 ldr r2, [sp, #12]
  5708. 8023e26: f7fe f885 bl 8021f34 <strncmp>
  5709. 8023e2a: 2800 cmp r0, #0
  5710. 8023e2c: d0e4 beq.n 8023df8 <__gethex+0x450>
  5711. 8023e2e: 46a1 mov r9, r4
  5712. 8023e30: 462c mov r4, r5
  5713. 8023e32: 46cb mov fp, r9
  5714. 8023e34: e602 b.n 8023a3c <__gethex+0x94>
  5715. 8023e36: 4625 mov r5, r4
  5716. 8023e38: 46a3 mov fp, r4
  5717. 8023e3a: 2701 movs r7, #1
  5718. 8023e3c: e5f0 b.n 8023a20 <__gethex+0x78>
  5719. 8023e3e: 9815 ldr r0, [sp, #84] ; 0x54
  5720. 8023e40: 2800 cmp r0, #0
  5721. 8023e42: f47f ae93 bne.w 8023b6c <__gethex+0x1c4>
  5722. 8023e46: 9a09 ldr r2, [sp, #36] ; 0x24
  5723. 8023e48: 2762 movs r7, #98 ; 0x62
  5724. 8023e4a: 9804 ldr r0, [sp, #16]
  5725. 8023e4c: 9908 ldr r1, [sp, #32]
  5726. 8023e4e: 6013 str r3, [r2, #0]
  5727. 8023e50: 2301 movs r3, #1
  5728. 8023e52: 9a14 ldr r2, [sp, #80] ; 0x50
  5729. 8023e54: 6103 str r3, [r0, #16]
  5730. 8023e56: 600b str r3, [r1, #0]
  5731. 8023e58: 6010 str r0, [r2, #0]
  5732. 8023e5a: e609 b.n 8023a70 <__gethex+0xc8>
  5733. 8023e5c: 2721 movs r7, #33 ; 0x21
  5734. 8023e5e: e77f b.n 8023d60 <__gethex+0x3b8>
  5735. 8023e60: f8dd b020 ldr.w fp, [sp, #32]
  5736. 8023e64: f04f 0800 mov.w r8, #0
  5737. 8023e68: e651 b.n 8023b0e <__gethex+0x166>
  5738. 8023e6a: 9a15 ldr r2, [sp, #84] ; 0x54
  5739. 8023e6c: f1c2 0301 rsb r3, r2, #1
  5740. 8023e70: 2b00 cmp r3, #0
  5741. 8023e72: f43f af73 beq.w 8023d5c <__gethex+0x3b4>
  5742. 8023e76: e719 b.n 8023cac <__gethex+0x304>
  5743. 8023e78: 42a6 cmp r6, r4
  5744. 8023e7a: f47f ae77 bne.w 8023b6c <__gethex+0x1c4>
  5745. 8023e7e: 2c01 cmp r4, #1
  5746. 8023e80: dde1 ble.n 8023e46 <__gethex+0x49e>
  5747. 8023e82: 9804 ldr r0, [sp, #16]
  5748. 8023e84: 1e61 subs r1, r4, #1
  5749. 8023e86: f001 f8ed bl 8025064 <__any_on>
  5750. 8023e8a: 2800 cmp r0, #0
  5751. 8023e8c: f43f ae6e beq.w 8023b6c <__gethex+0x1c4>
  5752. 8023e90: 9a06 ldr r2, [sp, #24]
  5753. 8023e92: 6853 ldr r3, [r2, #4]
  5754. 8023e94: e7d7 b.n 8023e46 <__gethex+0x49e>
  5755. 8023e96: 9915 ldr r1, [sp, #84] ; 0x54
  5756. 8023e98: 2900 cmp r1, #0
  5757. 8023e9a: f43f ae67 beq.w 8023b6c <__gethex+0x1c4>
  5758. 8023e9e: e7d2 b.n 8023e46 <__gethex+0x49e>
  5759. 8023ea0: 3201 adds r2, #1
  5760. 8023ea2: 600a str r2, [r1, #0]
  5761. 8023ea4: e723 b.n 8023cee <__gethex+0x346>
  5762. 8023ea6: 9a06 ldr r2, [sp, #24]
  5763. 8023ea8: 2722 movs r7, #34 ; 0x22
  5764. 8023eaa: 6813 ldr r3, [r2, #0]
  5765. 8023eac: 3b01 subs r3, #1
  5766. 8023eae: 42a3 cmp r3, r4
  5767. 8023eb0: f47f af56 bne.w 8023d60 <__gethex+0x3b8>
  5768. 8023eb4: 1163 asrs r3, r4, #5
  5769. 8023eb6: 9804 ldr r0, [sp, #16]
  5770. 8023eb8: 2201 movs r2, #1
  5771. 8023eba: f004 041f and.w r4, r4, #31
  5772. 8023ebe: eb00 0383 add.w r3, r0, r3, lsl #2
  5773. 8023ec2: fa02 f204 lsl.w r2, r2, r4
  5774. 8023ec6: 695b ldr r3, [r3, #20]
  5775. 8023ec8: 421a tst r2, r3
  5776. 8023eca: bf14 ite ne
  5777. 8023ecc: 2721 movne r7, #33 ; 0x21
  5778. 8023ece: 2722 moveq r7, #34 ; 0x22
  5779. 8023ed0: e746 b.n 8023d60 <__gethex+0x3b8>
  5780. 8023ed2: 6851 ldr r1, [r2, #4]
  5781. 8023ed4: 9807 ldr r0, [sp, #28]
  5782. 8023ed6: 3101 adds r1, #1
  5783. 8023ed8: f000 fc68 bl 80247ac <_Balloc>
  5784. 8023edc: 4606 mov r6, r0
  5785. 8023ede: 9804 ldr r0, [sp, #16]
  5786. 8023ee0: f100 010c add.w r1, r0, #12
  5787. 8023ee4: 6903 ldr r3, [r0, #16]
  5788. 8023ee6: f106 000c add.w r0, r6, #12
  5789. 8023eea: 1c9a adds r2, r3, #2
  5790. 8023eec: 0092 lsls r2, r2, #2
  5791. 8023eee: f7fd fd2d bl 802194c <memcpy>
  5792. 8023ef2: 9904 ldr r1, [sp, #16]
  5793. 8023ef4: 9807 ldr r0, [sp, #28]
  5794. 8023ef6: 9604 str r6, [sp, #16]
  5795. 8023ef8: f000 fc8e bl 8024818 <_Bfree>
  5796. 8023efc: 6933 ldr r3, [r6, #16]
  5797. 8023efe: e6ef b.n 8023ce0 <__gethex+0x338>
  5798. 8023f00: 465c mov r4, fp
  5799. 8023f02: e5a0 b.n 8023a46 <__gethex+0x9e>
  5800. 08023f04 <__hexnan>:
  5801. 8023f04: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  5802. 8023f08: f245 183c movw r8, #20796 ; 0x513c
  5803. 8023f0c: f2c2 0801 movt r8, #8193 ; 0x2001
  5804. 8023f10: b085 sub sp, #20
  5805. 8023f12: 460c mov r4, r1
  5806. 8023f14: 4692 mov sl, r2
  5807. 8023f16: f898 3030 ldrb.w r3, [r8, #48] ; 0x30
  5808. 8023f1a: 9002 str r0, [sp, #8]
  5809. 8023f1c: 2b00 cmp r3, #0
  5810. 8023f1e: f000 80ad beq.w 802407c <__hexnan+0x178>
  5811. 8023f22: 6823 ldr r3, [r4, #0]
  5812. 8023f24: 115a asrs r2, r3, #5
  5813. 8023f26: f013 031f ands.w r3, r3, #31
  5814. 8023f2a: 9303 str r3, [sp, #12]
  5815. 8023f2c: eb0a 0282 add.w r2, sl, r2, lsl #2
  5816. 8023f30: 9200 str r2, [sp, #0]
  5817. 8023f32: d001 beq.n 8023f38 <__hexnan+0x34>
  5818. 8023f34: 3204 adds r2, #4
  5819. 8023f36: 9200 str r2, [sp, #0]
  5820. 8023f38: 9a00 ldr r2, [sp, #0]
  5821. 8023f3a: 2300 movs r3, #0
  5822. 8023f3c: 4699 mov r9, r3
  5823. 8023f3e: 9900 ldr r1, [sp, #0]
  5824. 8023f40: 46cb mov fp, r9
  5825. 8023f42: 464e mov r6, r9
  5826. 8023f44: f842 3c04 str.w r3, [r2, #-4]
  5827. 8023f48: 3904 subs r1, #4
  5828. 8023f4a: 9b02 ldr r3, [sp, #8]
  5829. 8023f4c: 9101 str r1, [sp, #4]
  5830. 8023f4e: f8dd c004 ldr.w ip, [sp, #4]
  5831. 8023f52: 6819 ldr r1, [r3, #0]
  5832. 8023f54: 4664 mov r4, ip
  5833. 8023f56: 784b ldrb r3, [r1, #1]
  5834. 8023f58: 2b00 cmp r3, #0
  5835. 8023f5a: d033 beq.n 8023fc4 <__hexnan+0xc0>
  5836. 8023f5c: f818 2003 ldrb.w r2, [r8, r3]
  5837. 8023f60: 2a00 cmp r2, #0
  5838. 8023f62: d16f bne.n 8024044 <__hexnan+0x140>
  5839. 8023f64: 2b20 cmp r3, #32
  5840. 8023f66: f200 8083 bhi.w 8024070 <__hexnan+0x16c>
  5841. 8023f6a: 455e cmp r6, fp
  5842. 8023f6c: dd26 ble.n 8023fbc <__hexnan+0xb8>
  5843. 8023f6e: f1b9 0f07 cmp.w r9, #7
  5844. 8023f72: bfcc ite gt
  5845. 8023f74: 2300 movgt r3, #0
  5846. 8023f76: 2301 movle r3, #1
  5847. 8023f78: 4564 cmp r4, ip
  5848. 8023f7a: bf28 it cs
  5849. 8023f7c: 2300 movcs r3, #0
  5850. 8023f7e: b193 cbz r3, 8023fa6 <__hexnan+0xa2>
  5851. 8023f80: f1c9 0908 rsb r9, r9, #8
  5852. 8023f84: 6822 ldr r2, [r4, #0]
  5853. 8023f86: 4623 mov r3, r4
  5854. 8023f88: ea4f 0989 mov.w r9, r9, lsl #2
  5855. 8023f8c: f1c9 0720 rsb r7, r9, #32
  5856. 8023f90: 6858 ldr r0, [r3, #4]
  5857. 8023f92: fa00 f507 lsl.w r5, r0, r7
  5858. 8023f96: 4315 orrs r5, r2
  5859. 8023f98: fa20 f209 lsr.w r2, r0, r9
  5860. 8023f9c: 601d str r5, [r3, #0]
  5861. 8023f9e: f843 2f04 str.w r2, [r3, #4]!
  5862. 8023fa2: 459c cmp ip, r3
  5863. 8023fa4: d8f4 bhi.n 8023f90 <__hexnan+0x8c>
  5864. 8023fa6: 4554 cmp r4, sl
  5865. 8023fa8: bf98 it ls
  5866. 8023faa: f04f 0908 movls.w r9, #8
  5867. 8023fae: d905 bls.n 8023fbc <__hexnan+0xb8>
  5868. 8023fb0: 2200 movs r2, #0
  5869. 8023fb2: 3c04 subs r4, #4
  5870. 8023fb4: 6022 str r2, [r4, #0]
  5871. 8023fb6: 46b3 mov fp, r6
  5872. 8023fb8: 46a4 mov ip, r4
  5873. 8023fba: 4691 mov r9, r2
  5874. 8023fbc: 3101 adds r1, #1
  5875. 8023fbe: 784b ldrb r3, [r1, #1]
  5876. 8023fc0: 2b00 cmp r3, #0
  5877. 8023fc2: d1cb bne.n 8023f5c <__hexnan+0x58>
  5878. 8023fc4: 2e00 cmp r6, #0
  5879. 8023fc6: d055 beq.n 8024074 <__hexnan+0x170>
  5880. 8023fc8: f1b9 0f07 cmp.w r9, #7
  5881. 8023fcc: bfcc ite gt
  5882. 8023fce: 2300 movgt r3, #0
  5883. 8023fd0: 2301 movle r3, #1
  5884. 8023fd2: 4564 cmp r4, ip
  5885. 8023fd4: bf28 it cs
  5886. 8023fd6: 2300 movcs r3, #0
  5887. 8023fd8: b193 cbz r3, 8024000 <__hexnan+0xfc>
  5888. 8023fda: f1c9 0908 rsb r9, r9, #8
  5889. 8023fde: 6822 ldr r2, [r4, #0]
  5890. 8023fe0: 4623 mov r3, r4
  5891. 8023fe2: ea4f 0989 mov.w r9, r9, lsl #2
  5892. 8023fe6: f1c9 0520 rsb r5, r9, #32
  5893. 8023fea: 6859 ldr r1, [r3, #4]
  5894. 8023fec: fa01 f005 lsl.w r0, r1, r5
  5895. 8023ff0: 4310 orrs r0, r2
  5896. 8023ff2: fa21 f209 lsr.w r2, r1, r9
  5897. 8023ff6: 6018 str r0, [r3, #0]
  5898. 8023ff8: f843 2f04 str.w r2, [r3, #4]!
  5899. 8023ffc: 4563 cmp r3, ip
  5900. 8023ffe: d3f4 bcc.n 8023fea <__hexnan+0xe6>
  5901. 8024000: 45a2 cmp sl, r4
  5902. 8024002: d23e bcs.n 8024082 <__hexnan+0x17e>
  5903. 8024004: 9801 ldr r0, [sp, #4]
  5904. 8024006: 4652 mov r2, sl
  5905. 8024008: f854 1b04 ldr.w r1, [r4], #4
  5906. 802400c: 4613 mov r3, r2
  5907. 802400e: 42a0 cmp r0, r4
  5908. 8024010: f843 1b04 str.w r1, [r3], #4
  5909. 8024014: 461a mov r2, r3
  5910. 8024016: d2f7 bcs.n 8024008 <__hexnan+0x104>
  5911. 8024018: 9901 ldr r1, [sp, #4]
  5912. 802401a: 2200 movs r2, #0
  5913. 802401c: f843 2b04 str.w r2, [r3], #4
  5914. 8024020: 4299 cmp r1, r3
  5915. 8024022: d2fb bcs.n 802401c <__hexnan+0x118>
  5916. 8024024: 9900 ldr r1, [sp, #0]
  5917. 8024026: f851 3c04 ldr.w r3, [r1, #-4]
  5918. 802402a: b94b cbnz r3, 8024040 <__hexnan+0x13c>
  5919. 802402c: 9b01 ldr r3, [sp, #4]
  5920. 802402e: 459a cmp sl, r3
  5921. 8024030: d102 bne.n 8024038 <__hexnan+0x134>
  5922. 8024032: e038 b.n 80240a6 <__hexnan+0x1a2>
  5923. 8024034: 459a cmp sl, r3
  5924. 8024036: d037 beq.n 80240a8 <__hexnan+0x1a4>
  5925. 8024038: f853 2d04 ldr.w r2, [r3, #-4]!
  5926. 802403c: 2a00 cmp r2, #0
  5927. 802403e: d0f9 beq.n 8024034 <__hexnan+0x130>
  5928. 8024040: 2005 movs r0, #5
  5929. 8024042: e018 b.n 8024076 <__hexnan+0x172>
  5930. 8024044: f109 0901 add.w r9, r9, #1
  5931. 8024048: 3601 adds r6, #1
  5932. 802404a: f1b9 0f08 cmp.w r9, #8
  5933. 802404e: dc07 bgt.n 8024060 <__hexnan+0x15c>
  5934. 8024050: 6823 ldr r3, [r4, #0]
  5935. 8024052: 011b lsls r3, r3, #4
  5936. 8024054: f002 020f and.w r2, r2, #15
  5937. 8024058: 3101 adds r1, #1
  5938. 802405a: 431a orrs r2, r3
  5939. 802405c: 6022 str r2, [r4, #0]
  5940. 802405e: e7ae b.n 8023fbe <__hexnan+0xba>
  5941. 8024060: 4554 cmp r4, sl
  5942. 8024062: d9ab bls.n 8023fbc <__hexnan+0xb8>
  5943. 8024064: 2300 movs r3, #0
  5944. 8024066: 3c04 subs r4, #4
  5945. 8024068: 6023 str r3, [r4, #0]
  5946. 802406a: f04f 0901 mov.w r9, #1
  5947. 802406e: e7f1 b.n 8024054 <__hexnan+0x150>
  5948. 8024070: 2b29 cmp r3, #41 ; 0x29
  5949. 8024072: d01d beq.n 80240b0 <__hexnan+0x1ac>
  5950. 8024074: 2004 movs r0, #4
  5951. 8024076: b005 add sp, #20
  5952. 8024078: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  5953. 802407c: f7ff fc68 bl 8023950 <__hexdig_init>
  5954. 8024080: e74f b.n 8023f22 <__hexnan+0x1e>
  5955. 8024082: 9a03 ldr r2, [sp, #12]
  5956. 8024084: 2a00 cmp r2, #0
  5957. 8024086: d0cd beq.n 8024024 <__hexnan+0x120>
  5958. 8024088: 9a00 ldr r2, [sp, #0]
  5959. 802408a: 9903 ldr r1, [sp, #12]
  5960. 802408c: f852 3c04 ldr.w r3, [r2, #-4]
  5961. 8024090: f1c1 0220 rsb r2, r1, #32
  5962. 8024094: f04f 31ff mov.w r1, #4294967295
  5963. 8024098: fa21 f202 lsr.w r2, r1, r2
  5964. 802409c: 4013 ands r3, r2
  5965. 802409e: 9a00 ldr r2, [sp, #0]
  5966. 80240a0: f842 3c04 str.w r3, [r2, #-4]
  5967. 80240a4: e7c1 b.n 802402a <__hexnan+0x126>
  5968. 80240a6: 4653 mov r3, sl
  5969. 80240a8: 2201 movs r2, #1
  5970. 80240aa: 2005 movs r0, #5
  5971. 80240ac: 601a str r2, [r3, #0]
  5972. 80240ae: e7e2 b.n 8024076 <__hexnan+0x172>
  5973. 80240b0: 9b02 ldr r3, [sp, #8]
  5974. 80240b2: 3102 adds r1, #2
  5975. 80240b4: 6019 str r1, [r3, #0]
  5976. 80240b6: 2e00 cmp r6, #0
  5977. 80240b8: d186 bne.n 8023fc8 <__hexnan+0xc4>
  5978. 80240ba: e7db b.n 8024074 <__hexnan+0x170>
  5979. 080240bc <_setlocale_r>:
  5980. 80240bc: b510 push {r4, lr}
  5981. 80240be: 4614 mov r4, r2
  5982. 80240c0: b13a cbz r2, 80240d2 <_setlocale_r+0x16>
  5983. 80240c2: f640 11d8 movw r1, #2520 ; 0x9d8
  5984. 80240c6: 4610 mov r0, r2
  5985. 80240c8: f6c0 0104 movt r1, #2052 ; 0x804
  5986. 80240cc: f7fd fd84 bl 8021bd8 <strcmp>
  5987. 80240d0: b920 cbnz r0, 80240dc <_setlocale_r+0x20>
  5988. 80240d2: f640 10d4 movw r0, #2516 ; 0x9d4
  5989. 80240d6: f6c0 0004 movt r0, #2052 ; 0x804
  5990. 80240da: bd10 pop {r4, pc}
  5991. 80240dc: f640 11d4 movw r1, #2516 ; 0x9d4
  5992. 80240e0: 4620 mov r0, r4
  5993. 80240e2: f6c0 0104 movt r1, #2052 ; 0x804
  5994. 80240e6: f7fd fd77 bl 8021bd8 <strcmp>
  5995. 80240ea: 2800 cmp r0, #0
  5996. 80240ec: d0f1 beq.n 80240d2 <_setlocale_r+0x16>
  5997. 80240ee: f640 11e0 movw r1, #2528 ; 0x9e0
  5998. 80240f2: 4620 mov r0, r4
  5999. 80240f4: f6c0 0104 movt r1, #2052 ; 0x804
  6000. 80240f8: f7fd fd6e bl 8021bd8 <strcmp>
  6001. 80240fc: f640 13d4 movw r3, #2516 ; 0x9d4
  6002. 8024100: f6c0 0304 movt r3, #2052 ; 0x804
  6003. 8024104: 2800 cmp r0, #0
  6004. 8024106: bf0c ite eq
  6005. 8024108: 4618 moveq r0, r3
  6006. 802410a: 2000 movne r0, #0
  6007. 802410c: bd10 pop {r4, pc}
  6008. 802410e: bf00 nop
  6009. 08024110 <__locale_charset>:
  6010. 8024110: f240 1020 movw r0, #288 ; 0x120
  6011. 8024114: f2c2 0000 movt r0, #8192 ; 0x2000
  6012. 8024118: 4770 bx lr
  6013. 802411a: bf00 nop
  6014. 0802411c <__locale_mb_cur_max>:
  6015. 802411c: f240 1320 movw r3, #288 ; 0x120
  6016. 8024120: f2c2 0300 movt r3, #8192 ; 0x2000
  6017. 8024124: 6a18 ldr r0, [r3, #32]
  6018. 8024126: 4770 bx lr
  6019. 08024128 <__locale_msgcharset>:
  6020. 8024128: 4800 ldr r0, [pc, #0] ; (802412c <__locale_msgcharset+0x4>)
  6021. 802412a: 4770 bx lr
  6022. 802412c: 20000144 .word 0x20000144
  6023. 08024130 <__locale_cjk_lang>:
  6024. 8024130: 2000 movs r0, #0
  6025. 8024132: 4770 bx lr
  6026. 08024134 <_localeconv_r>:
  6027. 8024134: 4800 ldr r0, [pc, #0] ; (8024138 <_localeconv_r+0x4>)
  6028. 8024136: 4770 bx lr
  6029. 8024138: 20000164 .word 0x20000164
  6030. 0802413c <setlocale>:
  6031. 802413c: f240 032c movw r3, #44 ; 0x2c
  6032. 8024140: 460a mov r2, r1
  6033. 8024142: f2c2 0300 movt r3, #8192 ; 0x2000
  6034. 8024146: 4601 mov r1, r0
  6035. 8024148: 6818 ldr r0, [r3, #0]
  6036. 802414a: f7ff bfb7 b.w 80240bc <_setlocale_r>
  6037. 802414e: bf00 nop
  6038. 08024150 <localeconv>:
  6039. 8024150: 4800 ldr r0, [pc, #0] ; (8024154 <localeconv+0x4>)
  6040. 8024152: 4770 bx lr
  6041. 8024154: 20000164 .word 0x20000164
  6042. 08024158 <malloc>:
  6043. 8024158: f240 032c movw r3, #44 ; 0x2c
  6044. 802415c: 4601 mov r1, r0
  6045. 802415e: f2c2 0300 movt r3, #8192 ; 0x2000
  6046. 8024162: 6818 ldr r0, [r3, #0]
  6047. 8024164: f000 b808 b.w 8024178 <_malloc_r>
  6048. 08024168 <free>:
  6049. 8024168: f240 032c movw r3, #44 ; 0x2c
  6050. 802416c: 4601 mov r1, r0
  6051. 802416e: f2c2 0300 movt r3, #8192 ; 0x2000
  6052. 8024172: 6818 ldr r0, [r3, #0]
  6053. 8024174: f7ff baca b.w 802370c <_free_r>
  6054. 08024178 <_malloc_r>:
  6055. 8024178: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  6056. 802417c: f101 040b add.w r4, r1, #11
  6057. 8024180: 2c16 cmp r4, #22
  6058. 8024182: b083 sub sp, #12
  6059. 8024184: 4607 mov r7, r0
  6060. 8024186: d930 bls.n 80241ea <_malloc_r+0x72>
  6061. 8024188: f024 0407 bic.w r4, r4, #7
  6062. 802418c: 0fe3 lsrs r3, r4, #31
  6063. 802418e: 428c cmp r4, r1
  6064. 8024190: bf2c ite cs
  6065. 8024192: 4619 movcs r1, r3
  6066. 8024194: f043 0101 orrcc.w r1, r3, #1
  6067. 8024198: 2900 cmp r1, #0
  6068. 802419a: d12f bne.n 80241fc <_malloc_r+0x84>
  6069. 802419c: 4638 mov r0, r7
  6070. 802419e: f000 fb01 bl 80247a4 <__malloc_lock>
  6071. 80241a2: f5b4 7ffc cmp.w r4, #504 ; 0x1f8
  6072. 80241a6: d22e bcs.n 8024206 <_malloc_r+0x8e>
  6073. 80241a8: ea4f 0cd4 mov.w ip, r4, lsr #3
  6074. 80241ac: f240 169c movw r6, #412 ; 0x19c
  6075. 80241b0: f2c2 0600 movt r6, #8192 ; 0x2000
  6076. 80241b4: eb06 02cc add.w r2, r6, ip, lsl #3
  6077. 80241b8: 68d3 ldr r3, [r2, #12]
  6078. 80241ba: 4293 cmp r3, r2
  6079. 80241bc: f000 8211 beq.w 80245e2 <_malloc_r+0x46a>
  6080. 80241c0: 6859 ldr r1, [r3, #4]
  6081. 80241c2: f103 0808 add.w r8, r3, #8
  6082. 80241c6: 68da ldr r2, [r3, #12]
  6083. 80241c8: 4638 mov r0, r7
  6084. 80241ca: f021 0403 bic.w r4, r1, #3
  6085. 80241ce: 6899 ldr r1, [r3, #8]
  6086. 80241d0: 191b adds r3, r3, r4
  6087. 80241d2: 685c ldr r4, [r3, #4]
  6088. 80241d4: 60ca str r2, [r1, #12]
  6089. 80241d6: f044 0401 orr.w r4, r4, #1
  6090. 80241da: 6091 str r1, [r2, #8]
  6091. 80241dc: 605c str r4, [r3, #4]
  6092. 80241de: f000 fae3 bl 80247a8 <__malloc_unlock>
  6093. 80241e2: 4640 mov r0, r8
  6094. 80241e4: b003 add sp, #12
  6095. 80241e6: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  6096. 80241ea: 2300 movs r3, #0
  6097. 80241ec: 2410 movs r4, #16
  6098. 80241ee: 428c cmp r4, r1
  6099. 80241f0: bf2c ite cs
  6100. 80241f2: 4619 movcs r1, r3
  6101. 80241f4: f043 0101 orrcc.w r1, r3, #1
  6102. 80241f8: 2900 cmp r1, #0
  6103. 80241fa: d0cf beq.n 802419c <_malloc_r+0x24>
  6104. 80241fc: 230c movs r3, #12
  6105. 80241fe: f04f 0800 mov.w r8, #0
  6106. 8024202: 603b str r3, [r7, #0]
  6107. 8024204: e7ed b.n 80241e2 <_malloc_r+0x6a>
  6108. 8024206: ea5f 2c54 movs.w ip, r4, lsr #9
  6109. 802420a: bf04 itt eq
  6110. 802420c: ea4f 0cd4 moveq.w ip, r4, lsr #3
  6111. 8024210: ea4f 054c moveq.w r5, ip, lsl #1
  6112. 8024214: f040 808f bne.w 8024336 <_malloc_r+0x1be>
  6113. 8024218: f240 169c movw r6, #412 ; 0x19c
  6114. 802421c: f2c2 0600 movt r6, #8192 ; 0x2000
  6115. 8024220: eb06 0585 add.w r5, r6, r5, lsl #2
  6116. 8024224: 68eb ldr r3, [r5, #12]
  6117. 8024226: 429d cmp r5, r3
  6118. 8024228: d106 bne.n 8024238 <_malloc_r+0xc0>
  6119. 802422a: e00d b.n 8024248 <_malloc_r+0xd0>
  6120. 802422c: 2a00 cmp r2, #0
  6121. 802422e: f280 8155 bge.w 80244dc <_malloc_r+0x364>
  6122. 8024232: 68db ldr r3, [r3, #12]
  6123. 8024234: 429d cmp r5, r3
  6124. 8024236: d007 beq.n 8024248 <_malloc_r+0xd0>
  6125. 8024238: 6859 ldr r1, [r3, #4]
  6126. 802423a: f021 0103 bic.w r1, r1, #3
  6127. 802423e: 1b0a subs r2, r1, r4
  6128. 8024240: 2a0f cmp r2, #15
  6129. 8024242: ddf3 ble.n 802422c <_malloc_r+0xb4>
  6130. 8024244: f10c 3cff add.w ip, ip, #4294967295
  6131. 8024248: f10c 0c01 add.w ip, ip, #1
  6132. 802424c: f240 129c movw r2, #412 ; 0x19c
  6133. 8024250: 6933 ldr r3, [r6, #16]
  6134. 8024252: f2c2 0200 movt r2, #8192 ; 0x2000
  6135. 8024256: f102 0e08 add.w lr, r2, #8
  6136. 802425a: 4573 cmp r3, lr
  6137. 802425c: bf08 it eq
  6138. 802425e: f8d2 9004 ldreq.w r9, [r2, #4]
  6139. 8024262: d022 beq.n 80242aa <_malloc_r+0x132>
  6140. 8024264: 6858 ldr r0, [r3, #4]
  6141. 8024266: f020 0003 bic.w r0, r0, #3
  6142. 802426a: 1b01 subs r1, r0, r4
  6143. 802426c: 290f cmp r1, #15
  6144. 802426e: f300 8184 bgt.w 802457a <_malloc_r+0x402>
  6145. 8024272: 2900 cmp r1, #0
  6146. 8024274: f8c2 e014 str.w lr, [r2, #20]
  6147. 8024278: f8c2 e010 str.w lr, [r2, #16]
  6148. 802427c: da66 bge.n 802434c <_malloc_r+0x1d4>
  6149. 802427e: f5b0 7f00 cmp.w r0, #512 ; 0x200
  6150. 8024282: f080 814e bcs.w 8024522 <_malloc_r+0x3aa>
  6151. 8024286: 08c1 lsrs r1, r0, #3
  6152. 8024288: f04f 0801 mov.w r8, #1
  6153. 802428c: eb02 00c1 add.w r0, r2, r1, lsl #3
  6154. 8024290: 1089 asrs r1, r1, #2
  6155. 8024292: fa08 f801 lsl.w r8, r8, r1
  6156. 8024296: 6851 ldr r1, [r2, #4]
  6157. 8024298: 6885 ldr r5, [r0, #8]
  6158. 802429a: 60d8 str r0, [r3, #12]
  6159. 802429c: ea48 0901 orr.w r9, r8, r1
  6160. 80242a0: f8c2 9004 str.w r9, [r2, #4]
  6161. 80242a4: 609d str r5, [r3, #8]
  6162. 80242a6: 60eb str r3, [r5, #12]
  6163. 80242a8: 6083 str r3, [r0, #8]
  6164. 80242aa: 2201 movs r2, #1
  6165. 80242ac: ea4f 03ac mov.w r3, ip, asr #2
  6166. 80242b0: fa02 f303 lsl.w r3, r2, r3
  6167. 80242b4: 454b cmp r3, r9
  6168. 80242b6: d854 bhi.n 8024362 <_malloc_r+0x1ea>
  6169. 80242b8: ea19 0f03 tst.w r9, r3
  6170. 80242bc: d10d bne.n 80242da <_malloc_r+0x162>
  6171. 80242be: 4093 lsls r3, r2
  6172. 80242c0: f02c 0c03 bic.w ip, ip, #3
  6173. 80242c4: ea19 0f03 tst.w r9, r3
  6174. 80242c8: f10c 0c04 add.w ip, ip, #4
  6175. 80242cc: d105 bne.n 80242da <_malloc_r+0x162>
  6176. 80242ce: 005b lsls r3, r3, #1
  6177. 80242d0: f10c 0c04 add.w ip, ip, #4
  6178. 80242d4: ea19 0f03 tst.w r9, r3
  6179. 80242d8: d0f9 beq.n 80242ce <_malloc_r+0x156>
  6180. 80242da: eb06 09cc add.w r9, r6, ip, lsl #3
  6181. 80242de: 46e0 mov r8, ip
  6182. 80242e0: 4648 mov r0, r9
  6183. 80242e2: 68c2 ldr r2, [r0, #12]
  6184. 80242e4: 4290 cmp r0, r2
  6185. 80242e6: d107 bne.n 80242f8 <_malloc_r+0x180>
  6186. 80242e8: e15b b.n 80245a2 <_malloc_r+0x42a>
  6187. 80242ea: 2900 cmp r1, #0
  6188. 80242ec: f280 8183 bge.w 80245f6 <_malloc_r+0x47e>
  6189. 80242f0: 68d2 ldr r2, [r2, #12]
  6190. 80242f2: 4290 cmp r0, r2
  6191. 80242f4: f000 8155 beq.w 80245a2 <_malloc_r+0x42a>
  6192. 80242f8: 6855 ldr r5, [r2, #4]
  6193. 80242fa: f025 0503 bic.w r5, r5, #3
  6194. 80242fe: 1b29 subs r1, r5, r4
  6195. 8024300: 290f cmp r1, #15
  6196. 8024302: ddf2 ble.n 80242ea <_malloc_r+0x172>
  6197. 8024304: 4690 mov r8, r2
  6198. 8024306: 1913 adds r3, r2, r4
  6199. 8024308: 68d5 ldr r5, [r2, #12]
  6200. 802430a: f044 0001 orr.w r0, r4, #1
  6201. 802430e: f858 4f08 ldr.w r4, [r8, #8]!
  6202. 8024312: f041 0c01 orr.w ip, r1, #1
  6203. 8024316: 6050 str r0, [r2, #4]
  6204. 8024318: 4638 mov r0, r7
  6205. 802431a: f8c3 c004 str.w ip, [r3, #4]
  6206. 802431e: 60e5 str r5, [r4, #12]
  6207. 8024320: 60ac str r4, [r5, #8]
  6208. 8024322: 6173 str r3, [r6, #20]
  6209. 8024324: 6133 str r3, [r6, #16]
  6210. 8024326: f8c3 e00c str.w lr, [r3, #12]
  6211. 802432a: f8c3 e008 str.w lr, [r3, #8]
  6212. 802432e: 5059 str r1, [r3, r1]
  6213. 8024330: f000 fa3a bl 80247a8 <__malloc_unlock>
  6214. 8024334: e755 b.n 80241e2 <_malloc_r+0x6a>
  6215. 8024336: f1bc 0f04 cmp.w ip, #4
  6216. 802433a: f200 80de bhi.w 80244fa <_malloc_r+0x382>
  6217. 802433e: ea4f 1c94 mov.w ip, r4, lsr #6
  6218. 8024342: f10c 0c38 add.w ip, ip, #56 ; 0x38
  6219. 8024346: ea4f 054c mov.w r5, ip, lsl #1
  6220. 802434a: e765 b.n 8024218 <_malloc_r+0xa0>
  6221. 802434c: 181a adds r2, r3, r0
  6222. 802434e: f103 0808 add.w r8, r3, #8
  6223. 8024352: 4638 mov r0, r7
  6224. 8024354: 6853 ldr r3, [r2, #4]
  6225. 8024356: f043 0301 orr.w r3, r3, #1
  6226. 802435a: 6053 str r3, [r2, #4]
  6227. 802435c: f000 fa24 bl 80247a8 <__malloc_unlock>
  6228. 8024360: e73f b.n 80241e2 <_malloc_r+0x6a>
  6229. 8024362: 68b5 ldr r5, [r6, #8]
  6230. 8024364: 686b ldr r3, [r5, #4]
  6231. 8024366: f023 0a03 bic.w sl, r3, #3
  6232. 802436a: 4554 cmp r4, sl
  6233. 802436c: d804 bhi.n 8024378 <_malloc_r+0x200>
  6234. 802436e: ebc4 030a rsb r3, r4, sl
  6235. 8024372: 2b0f cmp r3, #15
  6236. 8024374: f300 80a4 bgt.w 80244c0 <_malloc_r+0x348>
  6237. 8024378: f641 191c movw r9, #6428 ; 0x191c
  6238. 802437c: f8d6 1408 ldr.w r1, [r6, #1032] ; 0x408
  6239. 8024380: f2c2 0900 movt r9, #8192 ; 0x2000
  6240. 8024384: eb05 020a add.w r2, r5, sl
  6241. 8024388: 3101 adds r1, #1
  6242. 802438a: f8d9 3000 ldr.w r3, [r9]
  6243. 802438e: 4423 add r3, r4
  6244. 8024390: bf08 it eq
  6245. 8024392: f103 0b10 addeq.w fp, r3, #16
  6246. 8024396: d006 beq.n 80243a6 <_malloc_r+0x22e>
  6247. 8024398: f503 5380 add.w r3, r3, #4096 ; 0x1000
  6248. 802439c: 330f adds r3, #15
  6249. 802439e: f423 637f bic.w r3, r3, #4080 ; 0xff0
  6250. 80243a2: f023 0b0f bic.w fp, r3, #15
  6251. 80243a6: 4638 mov r0, r7
  6252. 80243a8: 4659 mov r1, fp
  6253. 80243aa: 9201 str r2, [sp, #4]
  6254. 80243ac: f000 fe86 bl 80250bc <_sbrk_r>
  6255. 80243b0: 9a01 ldr r2, [sp, #4]
  6256. 80243b2: 1c41 adds r1, r0, #1
  6257. 80243b4: 4680 mov r8, r0
  6258. 80243b6: f000 8168 beq.w 802468a <_malloc_r+0x512>
  6259. 80243ba: 4282 cmp r2, r0
  6260. 80243bc: f200 8131 bhi.w 8024622 <_malloc_r+0x4aa>
  6261. 80243c0: f8d9 3004 ldr.w r3, [r9, #4]
  6262. 80243c4: 4542 cmp r2, r8
  6263. 80243c6: 445b add r3, fp
  6264. 80243c8: f8c9 3004 str.w r3, [r9, #4]
  6265. 80243cc: f000 8166 beq.w 802469c <_malloc_r+0x524>
  6266. 80243d0: f8d6 1408 ldr.w r1, [r6, #1032] ; 0x408
  6267. 80243d4: f240 109c movw r0, #412 ; 0x19c
  6268. 80243d8: f2c2 0000 movt r0, #8192 ; 0x2000
  6269. 80243dc: 3101 adds r1, #1
  6270. 80243de: bf17 itett ne
  6271. 80243e0: ebc2 0208 rsbne r2, r2, r8
  6272. 80243e4: f8c0 8408 streq.w r8, [r0, #1032] ; 0x408
  6273. 80243e8: 189b addne r3, r3, r2
  6274. 80243ea: f8c9 3004 strne.w r3, [r9, #4]
  6275. 80243ee: f018 0307 ands.w r3, r8, #7
  6276. 80243f2: 4638 mov r0, r7
  6277. 80243f4: bf1f itttt ne
  6278. 80243f6: f1c3 0208 rsbne r2, r3, #8
  6279. 80243fa: f5c3 5380 rsbne r3, r3, #4096 ; 0x1000
  6280. 80243fe: 4490 addne r8, r2
  6281. 8024400: f103 0208 addne.w r2, r3, #8
  6282. 8024404: eb08 030b add.w r3, r8, fp
  6283. 8024408: bf08 it eq
  6284. 802440a: f44f 5280 moveq.w r2, #4096 ; 0x1000
  6285. 802440e: 051b lsls r3, r3, #20
  6286. 8024410: 0d1b lsrs r3, r3, #20
  6287. 8024412: ebc3 0b02 rsb fp, r3, r2
  6288. 8024416: 4659 mov r1, fp
  6289. 8024418: f000 fe50 bl 80250bc <_sbrk_r>
  6290. 802441c: 1c43 adds r3, r0, #1
  6291. 802441e: f000 8149 beq.w 80246b4 <_malloc_r+0x53c>
  6292. 8024422: ebc8 0100 rsb r1, r8, r0
  6293. 8024426: 4459 add r1, fp
  6294. 8024428: f041 0101 orr.w r1, r1, #1
  6295. 802442c: f8d9 3004 ldr.w r3, [r9, #4]
  6296. 8024430: 42b5 cmp r5, r6
  6297. 8024432: f641 121c movw r2, #6428 ; 0x191c
  6298. 8024436: f8c6 8008 str.w r8, [r6, #8]
  6299. 802443a: 445b add r3, fp
  6300. 802443c: f2c2 0200 movt r2, #8192 ; 0x2000
  6301. 8024440: f8c8 1004 str.w r1, [r8, #4]
  6302. 8024444: f8c9 3004 str.w r3, [r9, #4]
  6303. 8024448: d018 beq.n 802447c <_malloc_r+0x304>
  6304. 802444a: f1ba 0f0f cmp.w sl, #15
  6305. 802444e: f240 810b bls.w 8024668 <_malloc_r+0x4f0>
  6306. 8024452: f1aa 000c sub.w r0, sl, #12
  6307. 8024456: 6869 ldr r1, [r5, #4]
  6308. 8024458: f020 0007 bic.w r0, r0, #7
  6309. 802445c: f04f 0c05 mov.w ip, #5
  6310. 8024460: eb05 0e00 add.w lr, r5, r0
  6311. 8024464: 280f cmp r0, #15
  6312. 8024466: f001 0101 and.w r1, r1, #1
  6313. 802446a: ea40 0101 orr.w r1, r0, r1
  6314. 802446e: 6069 str r1, [r5, #4]
  6315. 8024470: f8ce c004 str.w ip, [lr, #4]
  6316. 8024474: f8ce c008 str.w ip, [lr, #8]
  6317. 8024478: f200 8120 bhi.w 80246bc <_malloc_r+0x544>
  6318. 802447c: f641 121c movw r2, #6428 ; 0x191c
  6319. 8024480: f8d9 102c ldr.w r1, [r9, #44] ; 0x2c
  6320. 8024484: f2c2 0200 movt r2, #8192 ; 0x2000
  6321. 8024488: 68b5 ldr r5, [r6, #8]
  6322. 802448a: 428b cmp r3, r1
  6323. 802448c: f8d9 1030 ldr.w r1, [r9, #48] ; 0x30
  6324. 8024490: bf88 it hi
  6325. 8024492: 62d3 strhi r3, [r2, #44] ; 0x2c
  6326. 8024494: f641 121c movw r2, #6428 ; 0x191c
  6327. 8024498: f2c2 0200 movt r2, #8192 ; 0x2000
  6328. 802449c: 428b cmp r3, r1
  6329. 802449e: bf88 it hi
  6330. 80244a0: 6313 strhi r3, [r2, #48] ; 0x30
  6331. 80244a2: 686a ldr r2, [r5, #4]
  6332. 80244a4: f022 0203 bic.w r2, r2, #3
  6333. 80244a8: 4294 cmp r4, r2
  6334. 80244aa: ebc4 0302 rsb r3, r4, r2
  6335. 80244ae: d801 bhi.n 80244b4 <_malloc_r+0x33c>
  6336. 80244b0: 2b0f cmp r3, #15
  6337. 80244b2: dc05 bgt.n 80244c0 <_malloc_r+0x348>
  6338. 80244b4: 4638 mov r0, r7
  6339. 80244b6: f04f 0800 mov.w r8, #0
  6340. 80244ba: f000 f975 bl 80247a8 <__malloc_unlock>
  6341. 80244be: e690 b.n 80241e2 <_malloc_r+0x6a>
  6342. 80244c0: 192a adds r2, r5, r4
  6343. 80244c2: f043 0301 orr.w r3, r3, #1
  6344. 80244c6: f044 0401 orr.w r4, r4, #1
  6345. 80244ca: 4638 mov r0, r7
  6346. 80244cc: 606c str r4, [r5, #4]
  6347. 80244ce: f105 0808 add.w r8, r5, #8
  6348. 80244d2: 6053 str r3, [r2, #4]
  6349. 80244d4: 60b2 str r2, [r6, #8]
  6350. 80244d6: f000 f967 bl 80247a8 <__malloc_unlock>
  6351. 80244da: e682 b.n 80241e2 <_malloc_r+0x6a>
  6352. 80244dc: 1859 adds r1, r3, r1
  6353. 80244de: 68da ldr r2, [r3, #12]
  6354. 80244e0: 689c ldr r4, [r3, #8]
  6355. 80244e2: 4638 mov r0, r7
  6356. 80244e4: 684d ldr r5, [r1, #4]
  6357. 80244e6: f103 0808 add.w r8, r3, #8
  6358. 80244ea: f045 0501 orr.w r5, r5, #1
  6359. 80244ee: 60e2 str r2, [r4, #12]
  6360. 80244f0: 6094 str r4, [r2, #8]
  6361. 80244f2: 604d str r5, [r1, #4]
  6362. 80244f4: f000 f958 bl 80247a8 <__malloc_unlock>
  6363. 80244f8: e673 b.n 80241e2 <_malloc_r+0x6a>
  6364. 80244fa: f1bc 0f14 cmp.w ip, #20
  6365. 80244fe: bf9c itt ls
  6366. 8024500: f10c 0c5b addls.w ip, ip, #91 ; 0x5b
  6367. 8024504: ea4f 054c movls.w r5, ip, lsl #1
  6368. 8024508: f67f ae86 bls.w 8024218 <_malloc_r+0xa0>
  6369. 802450c: f1bc 0f54 cmp.w ip, #84 ; 0x54
  6370. 8024510: f200 8093 bhi.w 802463a <_malloc_r+0x4c2>
  6371. 8024514: ea4f 3c14 mov.w ip, r4, lsr #12
  6372. 8024518: f10c 0c6e add.w ip, ip, #110 ; 0x6e
  6373. 802451c: ea4f 054c mov.w r5, ip, lsl #1
  6374. 8024520: e67a b.n 8024218 <_malloc_r+0xa0>
  6375. 8024522: 0a42 lsrs r2, r0, #9
  6376. 8024524: 2a04 cmp r2, #4
  6377. 8024526: d975 bls.n 8024614 <_malloc_r+0x49c>
  6378. 8024528: 2a14 cmp r2, #20
  6379. 802452a: bf9c itt ls
  6380. 802452c: f102 095b addls.w r9, r2, #91 ; 0x5b
  6381. 8024530: ea4f 0549 movls.w r5, r9, lsl #1
  6382. 8024534: d908 bls.n 8024548 <_malloc_r+0x3d0>
  6383. 8024536: 2a54 cmp r2, #84 ; 0x54
  6384. 8024538: f200 80c9 bhi.w 80246ce <_malloc_r+0x556>
  6385. 802453c: ea4f 3910 mov.w r9, r0, lsr #12
  6386. 8024540: f109 096e add.w r9, r9, #110 ; 0x6e
  6387. 8024544: ea4f 0549 mov.w r5, r9, lsl #1
  6388. 8024548: eb06 0585 add.w r5, r6, r5, lsl #2
  6389. 802454c: f240 189c movw r8, #412 ; 0x19c
  6390. 8024550: f2c2 0800 movt r8, #8192 ; 0x2000
  6391. 8024554: 68aa ldr r2, [r5, #8]
  6392. 8024556: 42aa cmp r2, r5
  6393. 8024558: d079 beq.n 802464e <_malloc_r+0x4d6>
  6394. 802455a: 6851 ldr r1, [r2, #4]
  6395. 802455c: f021 0103 bic.w r1, r1, #3
  6396. 8024560: 4288 cmp r0, r1
  6397. 8024562: d202 bcs.n 802456a <_malloc_r+0x3f2>
  6398. 8024564: 6892 ldr r2, [r2, #8]
  6399. 8024566: 4295 cmp r5, r2
  6400. 8024568: d1f7 bne.n 802455a <_malloc_r+0x3e2>
  6401. 802456a: 68d0 ldr r0, [r2, #12]
  6402. 802456c: f8d6 9004 ldr.w r9, [r6, #4]
  6403. 8024570: 60d8 str r0, [r3, #12]
  6404. 8024572: 609a str r2, [r3, #8]
  6405. 8024574: 60d3 str r3, [r2, #12]
  6406. 8024576: 6083 str r3, [r0, #8]
  6407. 8024578: e697 b.n 80242aa <_malloc_r+0x132>
  6408. 802457a: 191d adds r5, r3, r4
  6409. 802457c: f041 0601 orr.w r6, r1, #1
  6410. 8024580: 6155 str r5, [r2, #20]
  6411. 8024582: f044 0401 orr.w r4, r4, #1
  6412. 8024586: 6115 str r5, [r2, #16]
  6413. 8024588: 4638 mov r0, r7
  6414. 802458a: 605c str r4, [r3, #4]
  6415. 802458c: f103 0808 add.w r8, r3, #8
  6416. 8024590: f8c5 e00c str.w lr, [r5, #12]
  6417. 8024594: f8c5 e008 str.w lr, [r5, #8]
  6418. 8024598: 606e str r6, [r5, #4]
  6419. 802459a: 5069 str r1, [r5, r1]
  6420. 802459c: f000 f904 bl 80247a8 <__malloc_unlock>
  6421. 80245a0: e61f b.n 80241e2 <_malloc_r+0x6a>
  6422. 80245a2: f108 0801 add.w r8, r8, #1
  6423. 80245a6: 3008 adds r0, #8
  6424. 80245a8: f018 0f03 tst.w r8, #3
  6425. 80245ac: f47f ae99 bne.w 80242e2 <_malloc_r+0x16a>
  6426. 80245b0: 464a mov r2, r9
  6427. 80245b2: f01c 0f03 tst.w ip, #3
  6428. 80245b6: f1a2 0108 sub.w r1, r2, #8
  6429. 80245ba: f10c 3cff add.w ip, ip, #4294967295
  6430. 80245be: f000 809e beq.w 80246fe <_malloc_r+0x586>
  6431. 80245c2: 6812 ldr r2, [r2, #0]
  6432. 80245c4: 428a cmp r2, r1
  6433. 80245c6: d0f4 beq.n 80245b2 <_malloc_r+0x43a>
  6434. 80245c8: 6872 ldr r2, [r6, #4]
  6435. 80245ca: 005b lsls r3, r3, #1
  6436. 80245cc: 4293 cmp r3, r2
  6437. 80245ce: f63f aec8 bhi.w 8024362 <_malloc_r+0x1ea>
  6438. 80245d2: 2b00 cmp r3, #0
  6439. 80245d4: f43f aec5 beq.w 8024362 <_malloc_r+0x1ea>
  6440. 80245d8: 421a tst r2, r3
  6441. 80245da: f000 8095 beq.w 8024708 <_malloc_r+0x590>
  6442. 80245de: 46c4 mov ip, r8
  6443. 80245e0: e67b b.n 80242da <_malloc_r+0x162>
  6444. 80245e2: f103 0208 add.w r2, r3, #8
  6445. 80245e6: 695b ldr r3, [r3, #20]
  6446. 80245e8: 429a cmp r2, r3
  6447. 80245ea: bf08 it eq
  6448. 80245ec: f10c 0c02 addeq.w ip, ip, #2
  6449. 80245f0: f43f ae2c beq.w 802424c <_malloc_r+0xd4>
  6450. 80245f4: e5e4 b.n 80241c0 <_malloc_r+0x48>
  6451. 80245f6: 4690 mov r8, r2
  6452. 80245f8: 1955 adds r5, r2, r5
  6453. 80245fa: 68d3 ldr r3, [r2, #12]
  6454. 80245fc: 4638 mov r0, r7
  6455. 80245fe: f858 2f08 ldr.w r2, [r8, #8]!
  6456. 8024602: 6869 ldr r1, [r5, #4]
  6457. 8024604: 60d3 str r3, [r2, #12]
  6458. 8024606: f041 0101 orr.w r1, r1, #1
  6459. 802460a: 609a str r2, [r3, #8]
  6460. 802460c: 6069 str r1, [r5, #4]
  6461. 802460e: f000 f8cb bl 80247a8 <__malloc_unlock>
  6462. 8024612: e5e6 b.n 80241e2 <_malloc_r+0x6a>
  6463. 8024614: ea4f 1990 mov.w r9, r0, lsr #6
  6464. 8024618: f109 0938 add.w r9, r9, #56 ; 0x38
  6465. 802461c: ea4f 0549 mov.w r5, r9, lsl #1
  6466. 8024620: e792 b.n 8024548 <_malloc_r+0x3d0>
  6467. 8024622: 42b5 cmp r5, r6
  6468. 8024624: f240 139c movw r3, #412 ; 0x19c
  6469. 8024628: f2c2 0300 movt r3, #8192 ; 0x2000
  6470. 802462c: f43f aec8 beq.w 80243c0 <_malloc_r+0x248>
  6471. 8024630: 689d ldr r5, [r3, #8]
  6472. 8024632: 686a ldr r2, [r5, #4]
  6473. 8024634: f022 0203 bic.w r2, r2, #3
  6474. 8024638: e736 b.n 80244a8 <_malloc_r+0x330>
  6475. 802463a: f5bc 7faa cmp.w ip, #340 ; 0x154
  6476. 802463e: d819 bhi.n 8024674 <_malloc_r+0x4fc>
  6477. 8024640: ea4f 3cd4 mov.w ip, r4, lsr #15
  6478. 8024644: f10c 0c77 add.w ip, ip, #119 ; 0x77
  6479. 8024648: ea4f 054c mov.w r5, ip, lsl #1
  6480. 802464c: e5e4 b.n 8024218 <_malloc_r+0xa0>
  6481. 802464e: 2501 movs r5, #1
  6482. 8024650: f8d8 1004 ldr.w r1, [r8, #4]
  6483. 8024654: ea4f 09a9 mov.w r9, r9, asr #2
  6484. 8024658: 4610 mov r0, r2
  6485. 802465a: fa05 f509 lsl.w r5, r5, r9
  6486. 802465e: ea45 0901 orr.w r9, r5, r1
  6487. 8024662: f8c8 9004 str.w r9, [r8, #4]
  6488. 8024666: e783 b.n 8024570 <_malloc_r+0x3f8>
  6489. 8024668: 2301 movs r3, #1
  6490. 802466a: 4645 mov r5, r8
  6491. 802466c: f8c8 3004 str.w r3, [r8, #4]
  6492. 8024670: 2200 movs r2, #0
  6493. 8024672: e719 b.n 80244a8 <_malloc_r+0x330>
  6494. 8024674: f240 5354 movw r3, #1364 ; 0x554
  6495. 8024678: 459c cmp ip, r3
  6496. 802467a: d80b bhi.n 8024694 <_malloc_r+0x51c>
  6497. 802467c: ea4f 4c94 mov.w ip, r4, lsr #18
  6498. 8024680: f10c 0c7c add.w ip, ip, #124 ; 0x7c
  6499. 8024684: ea4f 054c mov.w r5, ip, lsl #1
  6500. 8024688: e5c6 b.n 8024218 <_malloc_r+0xa0>
  6501. 802468a: 68b5 ldr r5, [r6, #8]
  6502. 802468c: 686a ldr r2, [r5, #4]
  6503. 802468e: f022 0203 bic.w r2, r2, #3
  6504. 8024692: e709 b.n 80244a8 <_malloc_r+0x330>
  6505. 8024694: 25fc movs r5, #252 ; 0xfc
  6506. 8024696: f04f 0c7e mov.w ip, #126 ; 0x7e
  6507. 802469a: e5bd b.n 8024218 <_malloc_r+0xa0>
  6508. 802469c: 0511 lsls r1, r2, #20
  6509. 802469e: 0d09 lsrs r1, r1, #20
  6510. 80246a0: 2900 cmp r1, #0
  6511. 80246a2: f47f ae95 bne.w 80243d0 <_malloc_r+0x258>
  6512. 80246a6: 68b2 ldr r2, [r6, #8]
  6513. 80246a8: eb0b 010a add.w r1, fp, sl
  6514. 80246ac: f041 0101 orr.w r1, r1, #1
  6515. 80246b0: 6051 str r1, [r2, #4]
  6516. 80246b2: e6e3 b.n 802447c <_malloc_r+0x304>
  6517. 80246b4: 2101 movs r1, #1
  6518. 80246b6: f04f 0b00 mov.w fp, #0
  6519. 80246ba: e6b7 b.n 802442c <_malloc_r+0x2b4>
  6520. 80246bc: 4638 mov r0, r7
  6521. 80246be: f105 0108 add.w r1, r5, #8
  6522. 80246c2: 9201 str r2, [sp, #4]
  6523. 80246c4: f7ff f822 bl 802370c <_free_r>
  6524. 80246c8: 9a01 ldr r2, [sp, #4]
  6525. 80246ca: 6853 ldr r3, [r2, #4]
  6526. 80246cc: e6d6 b.n 802447c <_malloc_r+0x304>
  6527. 80246ce: f5b2 7faa cmp.w r2, #340 ; 0x154
  6528. 80246d2: d806 bhi.n 80246e2 <_malloc_r+0x56a>
  6529. 80246d4: ea4f 39d0 mov.w r9, r0, lsr #15
  6530. 80246d8: f109 0977 add.w r9, r9, #119 ; 0x77
  6531. 80246dc: ea4f 0549 mov.w r5, r9, lsl #1
  6532. 80246e0: e732 b.n 8024548 <_malloc_r+0x3d0>
  6533. 80246e2: f240 5154 movw r1, #1364 ; 0x554
  6534. 80246e6: 25fc movs r5, #252 ; 0xfc
  6535. 80246e8: 428a cmp r2, r1
  6536. 80246ea: f04f 097e mov.w r9, #126 ; 0x7e
  6537. 80246ee: bf9e ittt ls
  6538. 80246f0: ea4f 4990 movls.w r9, r0, lsr #18
  6539. 80246f4: f109 097c addls.w r9, r9, #124 ; 0x7c
  6540. 80246f8: ea4f 0549 movls.w r5, r9, lsl #1
  6541. 80246fc: e724 b.n 8024548 <_malloc_r+0x3d0>
  6542. 80246fe: 6872 ldr r2, [r6, #4]
  6543. 8024700: ea22 0203 bic.w r2, r2, r3
  6544. 8024704: 6072 str r2, [r6, #4]
  6545. 8024706: e760 b.n 80245ca <_malloc_r+0x452>
  6546. 8024708: 005b lsls r3, r3, #1
  6547. 802470a: f108 0804 add.w r8, r8, #4
  6548. 802470e: e763 b.n 80245d8 <_malloc_r+0x460>
  6549. 08024710 <memchr>:
  6550. 8024710: 0783 lsls r3, r0, #30
  6551. 8024712: b2c9 uxtb r1, r1
  6552. 8024714: b470 push {r4, r5, r6}
  6553. 8024716: d040 beq.n 802479a <memchr+0x8a>
  6554. 8024718: 1e54 subs r4, r2, #1
  6555. 802471a: 2a00 cmp r2, #0
  6556. 802471c: d03f beq.n 802479e <memchr+0x8e>
  6557. 802471e: 7803 ldrb r3, [r0, #0]
  6558. 8024720: 428b cmp r3, r1
  6559. 8024722: d021 beq.n 8024768 <memchr+0x58>
  6560. 8024724: 1c43 adds r3, r0, #1
  6561. 8024726: e004 b.n 8024732 <memchr+0x22>
  6562. 8024728: b304 cbz r4, 802476c <memchr+0x5c>
  6563. 802472a: 7802 ldrb r2, [r0, #0]
  6564. 802472c: 3c01 subs r4, #1
  6565. 802472e: 428a cmp r2, r1
  6566. 8024730: d01a beq.n 8024768 <memchr+0x58>
  6567. 8024732: f013 0f03 tst.w r3, #3
  6568. 8024736: 4618 mov r0, r3
  6569. 8024738: f103 0301 add.w r3, r3, #1
  6570. 802473c: d1f4 bne.n 8024728 <memchr+0x18>
  6571. 802473e: 2c03 cmp r4, #3
  6572. 8024740: d816 bhi.n 8024770 <memchr+0x60>
  6573. 8024742: 1e65 subs r5, r4, #1
  6574. 8024744: b194 cbz r4, 802476c <memchr+0x5c>
  6575. 8024746: 7803 ldrb r3, [r0, #0]
  6576. 8024748: 428b cmp r3, r1
  6577. 802474a: d00d beq.n 8024768 <memchr+0x58>
  6578. 802474c: 1c42 adds r2, r0, #1
  6579. 802474e: 2300 movs r3, #0
  6580. 8024750: e002 b.n 8024758 <memchr+0x48>
  6581. 8024752: 7804 ldrb r4, [r0, #0]
  6582. 8024754: 428c cmp r4, r1
  6583. 8024756: d007 beq.n 8024768 <memchr+0x58>
  6584. 8024758: 429d cmp r5, r3
  6585. 802475a: 4610 mov r0, r2
  6586. 802475c: f103 0301 add.w r3, r3, #1
  6587. 8024760: f102 0201 add.w r2, r2, #1
  6588. 8024764: d1f5 bne.n 8024752 <memchr+0x42>
  6589. 8024766: 2000 movs r0, #0
  6590. 8024768: bc70 pop {r4, r5, r6}
  6591. 802476a: 4770 bx lr
  6592. 802476c: 4620 mov r0, r4
  6593. 802476e: e7fb b.n 8024768 <memchr+0x58>
  6594. 8024770: ea41 2601 orr.w r6, r1, r1, lsl #8
  6595. 8024774: ea46 4606 orr.w r6, r6, r6, lsl #16
  6596. 8024778: 4602 mov r2, r0
  6597. 802477a: 3004 adds r0, #4
  6598. 802477c: 6813 ldr r3, [r2, #0]
  6599. 802477e: 4073 eors r3, r6
  6600. 8024780: f1a3 3501 sub.w r5, r3, #16843009 ; 0x1010101
  6601. 8024784: ea25 0303 bic.w r3, r5, r3
  6602. 8024788: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  6603. 802478c: d103 bne.n 8024796 <memchr+0x86>
  6604. 802478e: 3c04 subs r4, #4
  6605. 8024790: 2c03 cmp r4, #3
  6606. 8024792: d8f1 bhi.n 8024778 <memchr+0x68>
  6607. 8024794: e7d5 b.n 8024742 <memchr+0x32>
  6608. 8024796: 4610 mov r0, r2
  6609. 8024798: e7d3 b.n 8024742 <memchr+0x32>
  6610. 802479a: 4614 mov r4, r2
  6611. 802479c: e7cf b.n 802473e <memchr+0x2e>
  6612. 802479e: 4610 mov r0, r2
  6613. 80247a0: e7e2 b.n 8024768 <memchr+0x58>
  6614. 80247a2: bf00 nop
  6615. 080247a4 <__malloc_lock>:
  6616. 80247a4: 4770 bx lr
  6617. 80247a6: bf00 nop
  6618. 080247a8 <__malloc_unlock>:
  6619. 80247a8: 4770 bx lr
  6620. 80247aa: bf00 nop
  6621. 080247ac <_Balloc>:
  6622. 80247ac: b570 push {r4, r5, r6, lr}
  6623. 80247ae: 4606 mov r6, r0
  6624. 80247b0: 6a44 ldr r4, [r0, #36] ; 0x24
  6625. 80247b2: 460d mov r5, r1
  6626. 80247b4: b15c cbz r4, 80247ce <_Balloc+0x22>
  6627. 80247b6: 68e2 ldr r2, [r4, #12]
  6628. 80247b8: b19a cbz r2, 80247e2 <_Balloc+0x36>
  6629. 80247ba: f852 0025 ldr.w r0, [r2, r5, lsl #2]
  6630. 80247be: b1e0 cbz r0, 80247fa <_Balloc+0x4e>
  6631. 80247c0: 6801 ldr r1, [r0, #0]
  6632. 80247c2: f842 1025 str.w r1, [r2, r5, lsl #2]
  6633. 80247c6: 2200 movs r2, #0
  6634. 80247c8: 6102 str r2, [r0, #16]
  6635. 80247ca: 60c2 str r2, [r0, #12]
  6636. 80247cc: bd70 pop {r4, r5, r6, pc}
  6637. 80247ce: 2010 movs r0, #16
  6638. 80247d0: f7ff fcc2 bl 8024158 <malloc>
  6639. 80247d4: 2300 movs r3, #0
  6640. 80247d6: 4604 mov r4, r0
  6641. 80247d8: 6270 str r0, [r6, #36] ; 0x24
  6642. 80247da: 6043 str r3, [r0, #4]
  6643. 80247dc: 6083 str r3, [r0, #8]
  6644. 80247de: 6003 str r3, [r0, #0]
  6645. 80247e0: 60c3 str r3, [r0, #12]
  6646. 80247e2: 2221 movs r2, #33 ; 0x21
  6647. 80247e4: 4630 mov r0, r6
  6648. 80247e6: 2104 movs r1, #4
  6649. 80247e8: f000 fcfc bl 80251e4 <_calloc_r>
  6650. 80247ec: 6a73 ldr r3, [r6, #36] ; 0x24
  6651. 80247ee: 60e0 str r0, [r4, #12]
  6652. 80247f0: 68da ldr r2, [r3, #12]
  6653. 80247f2: 2a00 cmp r2, #0
  6654. 80247f4: d1e1 bne.n 80247ba <_Balloc+0xe>
  6655. 80247f6: 2000 movs r0, #0
  6656. 80247f8: bd70 pop {r4, r5, r6, pc}
  6657. 80247fa: 2301 movs r3, #1
  6658. 80247fc: 4630 mov r0, r6
  6659. 80247fe: 4619 mov r1, r3
  6660. 8024800: fa03 f405 lsl.w r4, r3, r5
  6661. 8024804: 1d62 adds r2, r4, #5
  6662. 8024806: 0092 lsls r2, r2, #2
  6663. 8024808: f000 fcec bl 80251e4 <_calloc_r>
  6664. 802480c: 2800 cmp r0, #0
  6665. 802480e: d0f2 beq.n 80247f6 <_Balloc+0x4a>
  6666. 8024810: 6045 str r5, [r0, #4]
  6667. 8024812: 6084 str r4, [r0, #8]
  6668. 8024814: e7d7 b.n 80247c6 <_Balloc+0x1a>
  6669. 8024816: bf00 nop
  6670. 08024818 <_Bfree>:
  6671. 8024818: b530 push {r4, r5, lr}
  6672. 802481a: 4604 mov r4, r0
  6673. 802481c: 6a45 ldr r5, [r0, #36] ; 0x24
  6674. 802481e: b083 sub sp, #12
  6675. 8024820: b155 cbz r5, 8024838 <_Bfree+0x20>
  6676. 8024822: b139 cbz r1, 8024834 <_Bfree+0x1c>
  6677. 8024824: 6a63 ldr r3, [r4, #36] ; 0x24
  6678. 8024826: 684a ldr r2, [r1, #4]
  6679. 8024828: 68db ldr r3, [r3, #12]
  6680. 802482a: f853 0022 ldr.w r0, [r3, r2, lsl #2]
  6681. 802482e: 6008 str r0, [r1, #0]
  6682. 8024830: f843 1022 str.w r1, [r3, r2, lsl #2]
  6683. 8024834: b003 add sp, #12
  6684. 8024836: bd30 pop {r4, r5, pc}
  6685. 8024838: 2010 movs r0, #16
  6686. 802483a: 9101 str r1, [sp, #4]
  6687. 802483c: f7ff fc8c bl 8024158 <malloc>
  6688. 8024840: 9901 ldr r1, [sp, #4]
  6689. 8024842: 6260 str r0, [r4, #36] ; 0x24
  6690. 8024844: 6045 str r5, [r0, #4]
  6691. 8024846: 6085 str r5, [r0, #8]
  6692. 8024848: 6005 str r5, [r0, #0]
  6693. 802484a: 60c5 str r5, [r0, #12]
  6694. 802484c: e7e9 b.n 8024822 <_Bfree+0xa>
  6695. 802484e: bf00 nop
  6696. 08024850 <__multadd>:
  6697. 8024850: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  6698. 8024854: 4688 mov r8, r1
  6699. 8024856: f8d1 a010 ldr.w sl, [r1, #16]
  6700. 802485a: b082 sub sp, #8
  6701. 802485c: 4681 mov r9, r0
  6702. 802485e: f101 0514 add.w r5, r1, #20
  6703. 8024862: 2400 movs r4, #0
  6704. 8024864: 682f ldr r7, [r5, #0]
  6705. 8024866: 3401 adds r4, #1
  6706. 8024868: b2be uxth r6, r7
  6707. 802486a: 0c3f lsrs r7, r7, #16
  6708. 802486c: fb02 3606 mla r6, r2, r6, r3
  6709. 8024870: fb02 f307 mul.w r3, r2, r7
  6710. 8024874: eb03 4316 add.w r3, r3, r6, lsr #16
  6711. 8024878: b2b6 uxth r6, r6
  6712. 802487a: eb06 4603 add.w r6, r6, r3, lsl #16
  6713. 802487e: 0c1b lsrs r3, r3, #16
  6714. 8024880: 45a2 cmp sl, r4
  6715. 8024882: f845 6b04 str.w r6, [r5], #4
  6716. 8024886: dced bgt.n 8024864 <__multadd+0x14>
  6717. 8024888: b153 cbz r3, 80248a0 <__multadd+0x50>
  6718. 802488a: f8d8 2008 ldr.w r2, [r8, #8]
  6719. 802488e: 4592 cmp sl, r2
  6720. 8024890: da0a bge.n 80248a8 <__multadd+0x58>
  6721. 8024892: eb08 028a add.w r2, r8, sl, lsl #2
  6722. 8024896: f10a 0101 add.w r1, sl, #1
  6723. 802489a: f8c8 1010 str.w r1, [r8, #16]
  6724. 802489e: 6153 str r3, [r2, #20]
  6725. 80248a0: 4640 mov r0, r8
  6726. 80248a2: b002 add sp, #8
  6727. 80248a4: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  6728. 80248a8: f8d8 1004 ldr.w r1, [r8, #4]
  6729. 80248ac: 4648 mov r0, r9
  6730. 80248ae: 9301 str r3, [sp, #4]
  6731. 80248b0: 3101 adds r1, #1
  6732. 80248b2: f7ff ff7b bl 80247ac <_Balloc>
  6733. 80248b6: f8d8 2010 ldr.w r2, [r8, #16]
  6734. 80248ba: f108 010c add.w r1, r8, #12
  6735. 80248be: 3202 adds r2, #2
  6736. 80248c0: 0092 lsls r2, r2, #2
  6737. 80248c2: 4604 mov r4, r0
  6738. 80248c4: 300c adds r0, #12
  6739. 80248c6: f7fd f841 bl 802194c <memcpy>
  6740. 80248ca: 4641 mov r1, r8
  6741. 80248cc: 4648 mov r0, r9
  6742. 80248ce: 46a0 mov r8, r4
  6743. 80248d0: f7ff ffa2 bl 8024818 <_Bfree>
  6744. 80248d4: 9b01 ldr r3, [sp, #4]
  6745. 80248d6: e7dc b.n 8024892 <__multadd+0x42>
  6746. 080248d8 <__s2b>:
  6747. 80248d8: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  6748. 80248dc: f648 6539 movw r5, #36409 ; 0x8e39
  6749. 80248e0: 461f mov r7, r3
  6750. 80248e2: f6c3 05e3 movt r5, #14563 ; 0x38e3
  6751. 80248e6: 3308 adds r3, #8
  6752. 80248e8: 4606 mov r6, r0
  6753. 80248ea: 460c mov r4, r1
  6754. 80248ec: 4690 mov r8, r2
  6755. 80248ee: fb85 1003 smull r1, r0, r5, r3
  6756. 80248f2: 17db asrs r3, r3, #31
  6757. 80248f4: ebc3 0060 rsb r0, r3, r0, asr #1
  6758. 80248f8: 2801 cmp r0, #1
  6759. 80248fa: dd37 ble.n 802496c <__s2b+0x94>
  6760. 80248fc: 2501 movs r5, #1
  6761. 80248fe: 2100 movs r1, #0
  6762. 8024900: 006d lsls r5, r5, #1
  6763. 8024902: 3101 adds r1, #1
  6764. 8024904: 42a8 cmp r0, r5
  6765. 8024906: dcfb bgt.n 8024900 <__s2b+0x28>
  6766. 8024908: 4630 mov r0, r6
  6767. 802490a: f7ff ff4f bl 80247ac <_Balloc>
  6768. 802490e: 9b08 ldr r3, [sp, #32]
  6769. 8024910: 6143 str r3, [r0, #20]
  6770. 8024912: 2301 movs r3, #1
  6771. 8024914: f1b8 0f09 cmp.w r8, #9
  6772. 8024918: 4601 mov r1, r0
  6773. 802491a: 6103 str r3, [r0, #16]
  6774. 802491c: dd22 ble.n 8024964 <__s2b+0x8c>
  6775. 802491e: f104 0909 add.w r9, r4, #9
  6776. 8024922: 4444 add r4, r8
  6777. 8024924: 464d mov r5, r9
  6778. 8024926: f815 3b01 ldrb.w r3, [r5], #1
  6779. 802492a: 220a movs r2, #10
  6780. 802492c: 4630 mov r0, r6
  6781. 802492e: 3b30 subs r3, #48 ; 0x30
  6782. 8024930: f7ff ff8e bl 8024850 <__multadd>
  6783. 8024934: 42a5 cmp r5, r4
  6784. 8024936: 4601 mov r1, r0
  6785. 8024938: d1f5 bne.n 8024926 <__s2b+0x4e>
  6786. 802493a: eb09 0408 add.w r4, r9, r8
  6787. 802493e: 3c08 subs r4, #8
  6788. 8024940: 4547 cmp r7, r8
  6789. 8024942: dd0c ble.n 802495e <__s2b+0x86>
  6790. 8024944: ebc8 0707 rsb r7, r8, r7
  6791. 8024948: 19e7 adds r7, r4, r7
  6792. 802494a: f814 3b01 ldrb.w r3, [r4], #1
  6793. 802494e: 220a movs r2, #10
  6794. 8024950: 4630 mov r0, r6
  6795. 8024952: 3b30 subs r3, #48 ; 0x30
  6796. 8024954: f7ff ff7c bl 8024850 <__multadd>
  6797. 8024958: 42bc cmp r4, r7
  6798. 802495a: 4601 mov r1, r0
  6799. 802495c: d1f5 bne.n 802494a <__s2b+0x72>
  6800. 802495e: 4608 mov r0, r1
  6801. 8024960: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  6802. 8024964: 340a adds r4, #10
  6803. 8024966: f04f 0809 mov.w r8, #9
  6804. 802496a: e7e9 b.n 8024940 <__s2b+0x68>
  6805. 802496c: 2100 movs r1, #0
  6806. 802496e: e7cb b.n 8024908 <__s2b+0x30>
  6807. 08024970 <__hi0bits>:
  6808. 8024970: 4603 mov r3, r0
  6809. 8024972: 2000 movs r0, #0
  6810. 8024974: 0c1a lsrs r2, r3, #16
  6811. 8024976: d101 bne.n 802497c <__hi0bits+0xc>
  6812. 8024978: 041b lsls r3, r3, #16
  6813. 802497a: 2010 movs r0, #16
  6814. 802497c: f013 4f7f tst.w r3, #4278190080 ; 0xff000000
  6815. 8024980: d101 bne.n 8024986 <__hi0bits+0x16>
  6816. 8024982: 3008 adds r0, #8
  6817. 8024984: 021b lsls r3, r3, #8
  6818. 8024986: f013 4f70 tst.w r3, #4026531840 ; 0xf0000000
  6819. 802498a: d101 bne.n 8024990 <__hi0bits+0x20>
  6820. 802498c: 3004 adds r0, #4
  6821. 802498e: 011b lsls r3, r3, #4
  6822. 8024990: f013 4f40 tst.w r3, #3221225472 ; 0xc0000000
  6823. 8024994: d101 bne.n 802499a <__hi0bits+0x2a>
  6824. 8024996: 3002 adds r0, #2
  6825. 8024998: 009b lsls r3, r3, #2
  6826. 802499a: 2b00 cmp r3, #0
  6827. 802499c: db02 blt.n 80249a4 <__hi0bits+0x34>
  6828. 802499e: 005b lsls r3, r3, #1
  6829. 80249a0: d401 bmi.n 80249a6 <__hi0bits+0x36>
  6830. 80249a2: 2020 movs r0, #32
  6831. 80249a4: 4770 bx lr
  6832. 80249a6: 3001 adds r0, #1
  6833. 80249a8: 4770 bx lr
  6834. 80249aa: bf00 nop
  6835. 080249ac <__lo0bits>:
  6836. 80249ac: 6803 ldr r3, [r0, #0]
  6837. 80249ae: 4602 mov r2, r0
  6838. 80249b0: f013 0007 ands.w r0, r3, #7
  6839. 80249b4: d007 beq.n 80249c6 <__lo0bits+0x1a>
  6840. 80249b6: 07d9 lsls r1, r3, #31
  6841. 80249b8: d41f bmi.n 80249fa <__lo0bits+0x4e>
  6842. 80249ba: 0798 lsls r0, r3, #30
  6843. 80249bc: d41f bmi.n 80249fe <__lo0bits+0x52>
  6844. 80249be: 089b lsrs r3, r3, #2
  6845. 80249c0: 2002 movs r0, #2
  6846. 80249c2: 6013 str r3, [r2, #0]
  6847. 80249c4: 4770 bx lr
  6848. 80249c6: b299 uxth r1, r3
  6849. 80249c8: b909 cbnz r1, 80249ce <__lo0bits+0x22>
  6850. 80249ca: 0c1b lsrs r3, r3, #16
  6851. 80249cc: 2010 movs r0, #16
  6852. 80249ce: f013 0fff tst.w r3, #255 ; 0xff
  6853. 80249d2: d101 bne.n 80249d8 <__lo0bits+0x2c>
  6854. 80249d4: 3008 adds r0, #8
  6855. 80249d6: 0a1b lsrs r3, r3, #8
  6856. 80249d8: 0719 lsls r1, r3, #28
  6857. 80249da: d101 bne.n 80249e0 <__lo0bits+0x34>
  6858. 80249dc: 3004 adds r0, #4
  6859. 80249de: 091b lsrs r3, r3, #4
  6860. 80249e0: 0799 lsls r1, r3, #30
  6861. 80249e2: d101 bne.n 80249e8 <__lo0bits+0x3c>
  6862. 80249e4: 3002 adds r0, #2
  6863. 80249e6: 089b lsrs r3, r3, #2
  6864. 80249e8: 07d9 lsls r1, r3, #31
  6865. 80249ea: d404 bmi.n 80249f6 <__lo0bits+0x4a>
  6866. 80249ec: 085b lsrs r3, r3, #1
  6867. 80249ee: d101 bne.n 80249f4 <__lo0bits+0x48>
  6868. 80249f0: 2020 movs r0, #32
  6869. 80249f2: 4770 bx lr
  6870. 80249f4: 3001 adds r0, #1
  6871. 80249f6: 6013 str r3, [r2, #0]
  6872. 80249f8: 4770 bx lr
  6873. 80249fa: 2000 movs r0, #0
  6874. 80249fc: 4770 bx lr
  6875. 80249fe: 085b lsrs r3, r3, #1
  6876. 8024a00: 2001 movs r0, #1
  6877. 8024a02: 6013 str r3, [r2, #0]
  6878. 8024a04: 4770 bx lr
  6879. 8024a06: bf00 nop
  6880. 08024a08 <__i2b>:
  6881. 8024a08: b510 push {r4, lr}
  6882. 8024a0a: 460c mov r4, r1
  6883. 8024a0c: 2101 movs r1, #1
  6884. 8024a0e: f7ff fecd bl 80247ac <_Balloc>
  6885. 8024a12: 2201 movs r2, #1
  6886. 8024a14: 6144 str r4, [r0, #20]
  6887. 8024a16: 6102 str r2, [r0, #16]
  6888. 8024a18: bd10 pop {r4, pc}
  6889. 8024a1a: bf00 nop
  6890. 08024a1c <__multiply>:
  6891. 8024a1c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  6892. 8024a20: 460c mov r4, r1
  6893. 8024a22: 690e ldr r6, [r1, #16]
  6894. 8024a24: b085 sub sp, #20
  6895. 8024a26: 6915 ldr r5, [r2, #16]
  6896. 8024a28: 4617 mov r7, r2
  6897. 8024a2a: 42ae cmp r6, r5
  6898. 8024a2c: da04 bge.n 8024a38 <__multiply+0x1c>
  6899. 8024a2e: 4632 mov r2, r6
  6900. 8024a30: 463c mov r4, r7
  6901. 8024a32: 462e mov r6, r5
  6902. 8024a34: 460f mov r7, r1
  6903. 8024a36: 4615 mov r5, r2
  6904. 8024a38: 68a3 ldr r3, [r4, #8]
  6905. 8024a3a: eb06 0805 add.w r8, r6, r5
  6906. 8024a3e: 6861 ldr r1, [r4, #4]
  6907. 8024a40: 4598 cmp r8, r3
  6908. 8024a42: bfc8 it gt
  6909. 8024a44: 3101 addgt r1, #1
  6910. 8024a46: f7ff feb1 bl 80247ac <_Balloc>
  6911. 8024a4a: eb00 0988 add.w r9, r0, r8, lsl #2
  6912. 8024a4e: f100 0314 add.w r3, r0, #20
  6913. 8024a52: f109 0914 add.w r9, r9, #20
  6914. 8024a56: 9001 str r0, [sp, #4]
  6915. 8024a58: 2000 movs r0, #0
  6916. 8024a5a: 454b cmp r3, r9
  6917. 8024a5c: d203 bcs.n 8024a66 <__multiply+0x4a>
  6918. 8024a5e: f843 0b04 str.w r0, [r3], #4
  6919. 8024a62: 4599 cmp r9, r3
  6920. 8024a64: d8fb bhi.n 8024a5e <__multiply+0x42>
  6921. 8024a66: eb07 0585 add.w r5, r7, r5, lsl #2
  6922. 8024a6a: eb04 0686 add.w r6, r4, r6, lsl #2
  6923. 8024a6e: 3714 adds r7, #20
  6924. 8024a70: 3514 adds r5, #20
  6925. 8024a72: 3414 adds r4, #20
  6926. 8024a74: 3614 adds r6, #20
  6927. 8024a76: 42af cmp r7, r5
  6928. 8024a78: d257 bcs.n 8024b2a <__multiply+0x10e>
  6929. 8024a7a: 9a01 ldr r2, [sp, #4]
  6930. 8024a7c: f8cd 9008 str.w r9, [sp, #8]
  6931. 8024a80: 46a9 mov r9, r5
  6932. 8024a82: f8cd 800c str.w r8, [sp, #12]
  6933. 8024a86: f102 0c18 add.w ip, r2, #24
  6934. 8024a8a: 46a0 mov r8, r4
  6935. 8024a8c: f857 4b04 ldr.w r4, [r7], #4
  6936. 8024a90: b2a0 uxth r0, r4
  6937. 8024a92: b1f0 cbz r0, 8024ad2 <__multiply+0xb6>
  6938. 8024a94: 4642 mov r2, r8
  6939. 8024a96: f1ac 0304 sub.w r3, ip, #4
  6940. 8024a9a: 2400 movs r4, #0
  6941. 8024a9c: f852 1b04 ldr.w r1, [r2], #4
  6942. 8024aa0: 681d ldr r5, [r3, #0]
  6943. 8024aa2: fa1f fa81 uxth.w sl, r1
  6944. 8024aa6: 0c09 lsrs r1, r1, #16
  6945. 8024aa8: fa1f fb85 uxth.w fp, r5
  6946. 8024aac: 0c2d lsrs r5, r5, #16
  6947. 8024aae: fb00 ba0a mla sl, r0, sl, fp
  6948. 8024ab2: fb00 5101 mla r1, r0, r1, r5
  6949. 8024ab6: 4454 add r4, sl
  6950. 8024ab8: eb01 4114 add.w r1, r1, r4, lsr #16
  6951. 8024abc: b2a4 uxth r4, r4
  6952. 8024abe: ea44 4501 orr.w r5, r4, r1, lsl #16
  6953. 8024ac2: 0c0c lsrs r4, r1, #16
  6954. 8024ac4: 4296 cmp r6, r2
  6955. 8024ac6: f843 5b04 str.w r5, [r3], #4
  6956. 8024aca: d8e7 bhi.n 8024a9c <__multiply+0x80>
  6957. 8024acc: 601c str r4, [r3, #0]
  6958. 8024ace: f857 4c04 ldr.w r4, [r7, #-4]
  6959. 8024ad2: 0c24 lsrs r4, r4, #16
  6960. 8024ad4: d021 beq.n 8024b1a <__multiply+0xfe>
  6961. 8024ad6: f85c 1c04 ldr.w r1, [ip, #-4]
  6962. 8024ada: 4642 mov r2, r8
  6963. 8024adc: 4663 mov r3, ip
  6964. 8024ade: 2500 movs r5, #0
  6965. 8024ae0: 4608 mov r0, r1
  6966. 8024ae2: f8b2 a000 ldrh.w sl, [r2]
  6967. 8024ae6: 0c00 lsrs r0, r0, #16
  6968. 8024ae8: b289 uxth r1, r1
  6969. 8024aea: 469b mov fp, r3
  6970. 8024aec: fb04 000a mla r0, r4, sl, r0
  6971. 8024af0: 1945 adds r5, r0, r5
  6972. 8024af2: ea41 4105 orr.w r1, r1, r5, lsl #16
  6973. 8024af6: f843 1c04 str.w r1, [r3, #-4]
  6974. 8024afa: f853 0b04 ldr.w r0, [r3], #4
  6975. 8024afe: f852 1b04 ldr.w r1, [r2], #4
  6976. 8024b02: fa1f fa80 uxth.w sl, r0
  6977. 8024b06: 0c09 lsrs r1, r1, #16
  6978. 8024b08: fb04 a101 mla r1, r4, r1, sl
  6979. 8024b0c: eb01 4115 add.w r1, r1, r5, lsr #16
  6980. 8024b10: 0c0d lsrs r5, r1, #16
  6981. 8024b12: 4296 cmp r6, r2
  6982. 8024b14: d8e5 bhi.n 8024ae2 <__multiply+0xc6>
  6983. 8024b16: f8cb 1000 str.w r1, [fp]
  6984. 8024b1a: 45b9 cmp r9, r7
  6985. 8024b1c: f10c 0c04 add.w ip, ip, #4
  6986. 8024b20: d8b4 bhi.n 8024a8c <__multiply+0x70>
  6987. 8024b22: f8dd 9008 ldr.w r9, [sp, #8]
  6988. 8024b26: f8dd 800c ldr.w r8, [sp, #12]
  6989. 8024b2a: f1b8 0f00 cmp.w r8, #0
  6990. 8024b2e: dd0b ble.n 8024b48 <__multiply+0x12c>
  6991. 8024b30: f859 3c04 ldr.w r3, [r9, #-4]
  6992. 8024b34: f1a9 0904 sub.w r9, r9, #4
  6993. 8024b38: b11b cbz r3, 8024b42 <__multiply+0x126>
  6994. 8024b3a: e005 b.n 8024b48 <__multiply+0x12c>
  6995. 8024b3c: f859 3d04 ldr.w r3, [r9, #-4]!
  6996. 8024b40: b913 cbnz r3, 8024b48 <__multiply+0x12c>
  6997. 8024b42: f1b8 0801 subs.w r8, r8, #1
  6998. 8024b46: d1f9 bne.n 8024b3c <__multiply+0x120>
  6999. 8024b48: 9b01 ldr r3, [sp, #4]
  7000. 8024b4a: 4618 mov r0, r3
  7001. 8024b4c: f8c3 8010 str.w r8, [r3, #16]
  7002. 8024b50: b005 add sp, #20
  7003. 8024b52: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  7004. 8024b56: bf00 nop
  7005. 08024b58 <__pow5mult>:
  7006. 8024b58: f012 0303 ands.w r3, r2, #3
  7007. 8024b5c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  7008. 8024b60: 4614 mov r4, r2
  7009. 8024b62: 4680 mov r8, r0
  7010. 8024b64: 460f mov r7, r1
  7011. 8024b66: d128 bne.n 8024bba <__pow5mult+0x62>
  7012. 8024b68: 10a4 asrs r4, r4, #2
  7013. 8024b6a: d01a beq.n 8024ba2 <__pow5mult+0x4a>
  7014. 8024b6c: f8d8 5024 ldr.w r5, [r8, #36] ; 0x24
  7015. 8024b70: 2d00 cmp r5, #0
  7016. 8024b72: d02e beq.n 8024bd2 <__pow5mult+0x7a>
  7017. 8024b74: 68ae ldr r6, [r5, #8]
  7018. 8024b76: b92e cbnz r6, 8024b84 <__pow5mult+0x2c>
  7019. 8024b78: e036 b.n 8024be8 <__pow5mult+0x90>
  7020. 8024b7a: 1064 asrs r4, r4, #1
  7021. 8024b7c: d011 beq.n 8024ba2 <__pow5mult+0x4a>
  7022. 8024b7e: 6835 ldr r5, [r6, #0]
  7023. 8024b80: b195 cbz r5, 8024ba8 <__pow5mult+0x50>
  7024. 8024b82: 462e mov r6, r5
  7025. 8024b84: 07e0 lsls r0, r4, #31
  7026. 8024b86: d5f8 bpl.n 8024b7a <__pow5mult+0x22>
  7027. 8024b88: 4639 mov r1, r7
  7028. 8024b8a: 4632 mov r2, r6
  7029. 8024b8c: 4640 mov r0, r8
  7030. 8024b8e: f7ff ff45 bl 8024a1c <__multiply>
  7031. 8024b92: 4639 mov r1, r7
  7032. 8024b94: 4605 mov r5, r0
  7033. 8024b96: 4640 mov r0, r8
  7034. 8024b98: f7ff fe3e bl 8024818 <_Bfree>
  7035. 8024b9c: 1064 asrs r4, r4, #1
  7036. 8024b9e: 462f mov r7, r5
  7037. 8024ba0: d1ed bne.n 8024b7e <__pow5mult+0x26>
  7038. 8024ba2: 4638 mov r0, r7
  7039. 8024ba4: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  7040. 8024ba8: 4631 mov r1, r6
  7041. 8024baa: 4632 mov r2, r6
  7042. 8024bac: 4640 mov r0, r8
  7043. 8024bae: f7ff ff35 bl 8024a1c <__multiply>
  7044. 8024bb2: 6030 str r0, [r6, #0]
  7045. 8024bb4: 4606 mov r6, r0
  7046. 8024bb6: 6005 str r5, [r0, #0]
  7047. 8024bb8: e7e4 b.n 8024b84 <__pow5mult+0x2c>
  7048. 8024bba: f645 4208 movw r2, #23560 ; 0x5c08
  7049. 8024bbe: 1e5d subs r5, r3, #1
  7050. 8024bc0: f6c0 0203 movt r2, #2051 ; 0x803
  7051. 8024bc4: 2300 movs r3, #0
  7052. 8024bc6: f852 2025 ldr.w r2, [r2, r5, lsl #2]
  7053. 8024bca: f7ff fe41 bl 8024850 <__multadd>
  7054. 8024bce: 4607 mov r7, r0
  7055. 8024bd0: e7ca b.n 8024b68 <__pow5mult+0x10>
  7056. 8024bd2: 2010 movs r0, #16
  7057. 8024bd4: f7ff fac0 bl 8024158 <malloc>
  7058. 8024bd8: 2300 movs r3, #0
  7059. 8024bda: 4605 mov r5, r0
  7060. 8024bdc: f8c8 0024 str.w r0, [r8, #36] ; 0x24
  7061. 8024be0: 6043 str r3, [r0, #4]
  7062. 8024be2: 6083 str r3, [r0, #8]
  7063. 8024be4: 6003 str r3, [r0, #0]
  7064. 8024be6: 60c3 str r3, [r0, #12]
  7065. 8024be8: 4640 mov r0, r8
  7066. 8024bea: f240 2171 movw r1, #625 ; 0x271
  7067. 8024bee: f7ff ff0b bl 8024a08 <__i2b>
  7068. 8024bf2: 2300 movs r3, #0
  7069. 8024bf4: 60a8 str r0, [r5, #8]
  7070. 8024bf6: 4606 mov r6, r0
  7071. 8024bf8: 6003 str r3, [r0, #0]
  7072. 8024bfa: e7c3 b.n 8024b84 <__pow5mult+0x2c>
  7073. 08024bfc <__lshift>:
  7074. 8024bfc: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  7075. 8024c00: 4693 mov fp, r2
  7076. 8024c02: 690a ldr r2, [r1, #16]
  7077. 8024c04: 460f mov r7, r1
  7078. 8024c06: ea4f 156b mov.w r5, fp, asr #5
  7079. 8024c0a: 688b ldr r3, [r1, #8]
  7080. 8024c0c: eb05 0a02 add.w sl, r5, r2
  7081. 8024c10: 4681 mov r9, r0
  7082. 8024c12: f10a 0601 add.w r6, sl, #1
  7083. 8024c16: 6849 ldr r1, [r1, #4]
  7084. 8024c18: 429e cmp r6, r3
  7085. 8024c1a: dd03 ble.n 8024c24 <__lshift+0x28>
  7086. 8024c1c: 005b lsls r3, r3, #1
  7087. 8024c1e: 3101 adds r1, #1
  7088. 8024c20: 429e cmp r6, r3
  7089. 8024c22: dcfb bgt.n 8024c1c <__lshift+0x20>
  7090. 8024c24: 4648 mov r0, r9
  7091. 8024c26: f7ff fdc1 bl 80247ac <_Balloc>
  7092. 8024c2a: 2d00 cmp r5, #0
  7093. 8024c2c: 4680 mov r8, r0
  7094. 8024c2e: f100 0414 add.w r4, r0, #20
  7095. 8024c32: dd0a ble.n 8024c4a <__lshift+0x4e>
  7096. 8024c34: 2300 movs r3, #0
  7097. 8024c36: 461a mov r2, r3
  7098. 8024c38: 3301 adds r3, #1
  7099. 8024c3a: f844 2b04 str.w r2, [r4], #4
  7100. 8024c3e: 42ab cmp r3, r5
  7101. 8024c40: d1fa bne.n 8024c38 <__lshift+0x3c>
  7102. 8024c42: eb08 0383 add.w r3, r8, r3, lsl #2
  7103. 8024c46: f103 0414 add.w r4, r3, #20
  7104. 8024c4a: 6938 ldr r0, [r7, #16]
  7105. 8024c4c: f107 0514 add.w r5, r7, #20
  7106. 8024c50: eb07 0080 add.w r0, r7, r0, lsl #2
  7107. 8024c54: 3014 adds r0, #20
  7108. 8024c56: f01b 0b1f ands.w fp, fp, #31
  7109. 8024c5a: d01c beq.n 8024c96 <__lshift+0x9a>
  7110. 8024c5c: f1cb 0320 rsb r3, fp, #32
  7111. 8024c60: 2200 movs r2, #0
  7112. 8024c62: 6829 ldr r1, [r5, #0]
  7113. 8024c64: fa01 f10b lsl.w r1, r1, fp
  7114. 8024c68: 430a orrs r2, r1
  7115. 8024c6a: f844 2b04 str.w r2, [r4], #4
  7116. 8024c6e: f855 2b04 ldr.w r2, [r5], #4
  7117. 8024c72: 42a8 cmp r0, r5
  7118. 8024c74: fa22 f203 lsr.w r2, r2, r3
  7119. 8024c78: d8f3 bhi.n 8024c62 <__lshift+0x66>
  7120. 8024c7a: 6022 str r2, [r4, #0]
  7121. 8024c7c: b10a cbz r2, 8024c82 <__lshift+0x86>
  7122. 8024c7e: f10a 0602 add.w r6, sl, #2
  7123. 8024c82: 4648 mov r0, r9
  7124. 8024c84: 3e01 subs r6, #1
  7125. 8024c86: 4639 mov r1, r7
  7126. 8024c88: f8c8 6010 str.w r6, [r8, #16]
  7127. 8024c8c: f7ff fdc4 bl 8024818 <_Bfree>
  7128. 8024c90: 4640 mov r0, r8
  7129. 8024c92: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  7130. 8024c96: f855 3b04 ldr.w r3, [r5], #4
  7131. 8024c9a: 42a8 cmp r0, r5
  7132. 8024c9c: f844 3b04 str.w r3, [r4], #4
  7133. 8024ca0: d9ef bls.n 8024c82 <__lshift+0x86>
  7134. 8024ca2: f855 3b04 ldr.w r3, [r5], #4
  7135. 8024ca6: 42a8 cmp r0, r5
  7136. 8024ca8: f844 3b04 str.w r3, [r4], #4
  7137. 8024cac: d8f3 bhi.n 8024c96 <__lshift+0x9a>
  7138. 8024cae: e7e8 b.n 8024c82 <__lshift+0x86>
  7139. 08024cb0 <__mcmp>:
  7140. 8024cb0: 4603 mov r3, r0
  7141. 8024cb2: 690a ldr r2, [r1, #16]
  7142. 8024cb4: 6900 ldr r0, [r0, #16]
  7143. 8024cb6: b430 push {r4, r5}
  7144. 8024cb8: 1a80 subs r0, r0, r2
  7145. 8024cba: d10f bne.n 8024cdc <__mcmp+0x2c>
  7146. 8024cbc: 3204 adds r2, #4
  7147. 8024cbe: f103 0514 add.w r5, r3, #20
  7148. 8024cc2: 0092 lsls r2, r2, #2
  7149. 8024cc4: 189b adds r3, r3, r2
  7150. 8024cc6: 1889 adds r1, r1, r2
  7151. 8024cc8: 3304 adds r3, #4
  7152. 8024cca: 3104 adds r1, #4
  7153. 8024ccc: f853 2d04 ldr.w r2, [r3, #-4]!
  7154. 8024cd0: f851 4d04 ldr.w r4, [r1, #-4]!
  7155. 8024cd4: 42a2 cmp r2, r4
  7156. 8024cd6: d103 bne.n 8024ce0 <__mcmp+0x30>
  7157. 8024cd8: 429d cmp r5, r3
  7158. 8024cda: d3f7 bcc.n 8024ccc <__mcmp+0x1c>
  7159. 8024cdc: bc30 pop {r4, r5}
  7160. 8024cde: 4770 bx lr
  7161. 8024ce0: 4294 cmp r4, r2
  7162. 8024ce2: bf94 ite ls
  7163. 8024ce4: 2001 movls r0, #1
  7164. 8024ce6: f04f 30ff movhi.w r0, #4294967295
  7165. 8024cea: e7f7 b.n 8024cdc <__mcmp+0x2c>
  7166. 08024cec <__mdiff>:
  7167. 8024cec: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  7168. 8024cf0: 468b mov fp, r1
  7169. 8024cf2: 4604 mov r4, r0
  7170. 8024cf4: 4611 mov r1, r2
  7171. 8024cf6: 4658 mov r0, fp
  7172. 8024cf8: 4691 mov r9, r2
  7173. 8024cfa: f7ff ffd9 bl 8024cb0 <__mcmp>
  7174. 8024cfe: 1e05 subs r5, r0, #0
  7175. 8024d00: d061 beq.n 8024dc6 <__mdiff+0xda>
  7176. 8024d02: bfbc itt lt
  7177. 8024d04: 465b movlt r3, fp
  7178. 8024d06: 46cb movlt fp, r9
  7179. 8024d08: 4620 mov r0, r4
  7180. 8024d0a: bfb8 it lt
  7181. 8024d0c: 4699 movlt r9, r3
  7182. 8024d0e: f8db 1004 ldr.w r1, [fp, #4]
  7183. 8024d12: bfac ite ge
  7184. 8024d14: f04f 0800 movge.w r8, #0
  7185. 8024d18: f04f 0801 movlt.w r8, #1
  7186. 8024d1c: f7ff fd46 bl 80247ac <_Balloc>
  7187. 8024d20: f8db 7010 ldr.w r7, [fp, #16]
  7188. 8024d24: f109 0514 add.w r5, r9, #20
  7189. 8024d28: f8d9 3010 ldr.w r3, [r9, #16]
  7190. 8024d2c: f10b 0614 add.w r6, fp, #20
  7191. 8024d30: 2400 movs r4, #0
  7192. 8024d32: eb0b 0c87 add.w ip, fp, r7, lsl #2
  7193. 8024d36: eb09 0983 add.w r9, r9, r3, lsl #2
  7194. 8024d3a: f10c 0c14 add.w ip, ip, #20
  7195. 8024d3e: f109 0914 add.w r9, r9, #20
  7196. 8024d42: f100 0a14 add.w sl, r0, #20
  7197. 8024d46: f8c0 800c str.w r8, [r0, #12]
  7198. 8024d4a: f856 8b04 ldr.w r8, [r6], #4
  7199. 8024d4e: 4653 mov r3, sl
  7200. 8024d50: f855 ab04 ldr.w sl, [r5], #4
  7201. 8024d54: 4632 mov r2, r6
  7202. 8024d56: fa1f f188 uxth.w r1, r8
  7203. 8024d5a: 1909 adds r1, r1, r4
  7204. 8024d5c: fa1f fb8a uxth.w fp, sl
  7205. 8024d60: ebcb 0101 rsb r1, fp, r1
  7206. 8024d64: ea4f 441a mov.w r4, sl, lsr #16
  7207. 8024d68: ebc4 4418 rsb r4, r4, r8, lsr #16
  7208. 8024d6c: eb04 4421 add.w r4, r4, r1, asr #16
  7209. 8024d70: b289 uxth r1, r1
  7210. 8024d72: ea41 4104 orr.w r1, r1, r4, lsl #16
  7211. 8024d76: 1424 asrs r4, r4, #16
  7212. 8024d78: 45a9 cmp r9, r5
  7213. 8024d7a: f843 1b04 str.w r1, [r3], #4
  7214. 8024d7e: 469a mov sl, r3
  7215. 8024d80: d8e3 bhi.n 8024d4a <__mdiff+0x5e>
  7216. 8024d82: 45b4 cmp ip, r6
  7217. 8024d84: 4698 mov r8, r3
  7218. 8024d86: d914 bls.n 8024db2 <__mdiff+0xc6>
  7219. 8024d88: f852 5b04 ldr.w r5, [r2], #4
  7220. 8024d8c: b2a9 uxth r1, r5
  7221. 8024d8e: 0c2d lsrs r5, r5, #16
  7222. 8024d90: 190c adds r4, r1, r4
  7223. 8024d92: eb05 4524 add.w r5, r5, r4, asr #16
  7224. 8024d96: b2a4 uxth r4, r4
  7225. 8024d98: ea44 4105 orr.w r1, r4, r5, lsl #16
  7226. 8024d9c: 142c asrs r4, r5, #16
  7227. 8024d9e: 4594 cmp ip, r2
  7228. 8024da0: f843 1b04 str.w r1, [r3], #4
  7229. 8024da4: d8f0 bhi.n 8024d88 <__mdiff+0x9c>
  7230. 8024da6: 43f3 mvns r3, r6
  7231. 8024da8: 4463 add r3, ip
  7232. 8024daa: f023 0303 bic.w r3, r3, #3
  7233. 8024dae: 3304 adds r3, #4
  7234. 8024db0: 4443 add r3, r8
  7235. 8024db2: 3b04 subs r3, #4
  7236. 8024db4: b921 cbnz r1, 8024dc0 <__mdiff+0xd4>
  7237. 8024db6: f853 2d04 ldr.w r2, [r3, #-4]!
  7238. 8024dba: 3f01 subs r7, #1
  7239. 8024dbc: 2a00 cmp r2, #0
  7240. 8024dbe: d0fa beq.n 8024db6 <__mdiff+0xca>
  7241. 8024dc0: 6107 str r7, [r0, #16]
  7242. 8024dc2: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  7243. 8024dc6: 4620 mov r0, r4
  7244. 8024dc8: 4629 mov r1, r5
  7245. 8024dca: f7ff fcef bl 80247ac <_Balloc>
  7246. 8024dce: 2301 movs r3, #1
  7247. 8024dd0: 6145 str r5, [r0, #20]
  7248. 8024dd2: 6103 str r3, [r0, #16]
  7249. 8024dd4: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  7250. 08024dd8 <__ulp>:
  7251. 8024dd8: 2300 movs r3, #0
  7252. 8024dda: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  7253. 8024dde: 400b ands r3, r1
  7254. 8024de0: f1a3 7350 sub.w r3, r3, #54525952 ; 0x3400000
  7255. 8024de4: 2b00 cmp r3, #0
  7256. 8024de6: dd02 ble.n 8024dee <__ulp+0x16>
  7257. 8024de8: 4619 mov r1, r3
  7258. 8024dea: 2000 movs r0, #0
  7259. 8024dec: 4770 bx lr
  7260. 8024dee: 425b negs r3, r3
  7261. 8024df0: 2100 movs r1, #0
  7262. 8024df2: 151b asrs r3, r3, #20
  7263. 8024df4: 2b13 cmp r3, #19
  7264. 8024df6: dd0b ble.n 8024e10 <__ulp+0x38>
  7265. 8024df8: 2b32 cmp r3, #50 ; 0x32
  7266. 8024dfa: dd02 ble.n 8024e02 <__ulp+0x2a>
  7267. 8024dfc: 2301 movs r3, #1
  7268. 8024dfe: 4618 mov r0, r3
  7269. 8024e00: 4770 bx lr
  7270. 8024e02: 2201 movs r2, #1
  7271. 8024e04: f1c3 0333 rsb r3, r3, #51 ; 0x33
  7272. 8024e08: fa02 f303 lsl.w r3, r2, r3
  7273. 8024e0c: 4618 mov r0, r3
  7274. 8024e0e: 4770 bx lr
  7275. 8024e10: f44f 2200 mov.w r2, #524288 ; 0x80000
  7276. 8024e14: 2000 movs r0, #0
  7277. 8024e16: fa42 f103 asr.w r1, r2, r3
  7278. 8024e1a: 4770 bx lr
  7279. 08024e1c <__b2d>:
  7280. 8024e1c: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  7281. 8024e20: f100 0814 add.w r8, r0, #20
  7282. 8024e24: 6906 ldr r6, [r0, #16]
  7283. 8024e26: 4689 mov r9, r1
  7284. 8024e28: 3604 adds r6, #4
  7285. 8024e2a: eb00 0686 add.w r6, r0, r6, lsl #2
  7286. 8024e2e: 4634 mov r4, r6
  7287. 8024e30: 4637 mov r7, r6
  7288. 8024e32: f854 5b04 ldr.w r5, [r4], #4
  7289. 8024e36: 4628 mov r0, r5
  7290. 8024e38: f7ff fd9a bl 8024970 <__hi0bits>
  7291. 8024e3c: 280a cmp r0, #10
  7292. 8024e3e: f1c0 0320 rsb r3, r0, #32
  7293. 8024e42: f8c9 3000 str.w r3, [r9]
  7294. 8024e46: dc18 bgt.n 8024e7a <__b2d+0x5e>
  7295. 8024e48: 45b0 cmp r8, r6
  7296. 8024e4a: f1c0 010b rsb r1, r0, #11
  7297. 8024e4e: fa25 f701 lsr.w r7, r5, r1
  7298. 8024e52: bf38 it cc
  7299. 8024e54: f854 4c08 ldrcc.w r4, [r4, #-8]
  7300. 8024e58: f047 577f orr.w r7, r7, #1069547520 ; 0x3fc00000
  7301. 8024e5c: f447 1340 orr.w r3, r7, #3145728 ; 0x300000
  7302. 8024e60: bf34 ite cc
  7303. 8024e62: fa24 f101 lsrcc.w r1, r4, r1
  7304. 8024e66: 2100 movcs r1, #0
  7305. 8024e68: 3015 adds r0, #21
  7306. 8024e6a: fa05 f500 lsl.w r5, r5, r0
  7307. 8024e6e: ea41 0205 orr.w r2, r1, r5
  7308. 8024e72: 4610 mov r0, r2
  7309. 8024e74: 4619 mov r1, r3
  7310. 8024e76: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  7311. 8024e7a: 2100 movs r1, #0
  7312. 8024e7c: 45b0 cmp r8, r6
  7313. 8024e7e: d202 bcs.n 8024e86 <__b2d+0x6a>
  7314. 8024e80: f854 1c08 ldr.w r1, [r4, #-8]
  7315. 8024e84: 1f37 subs r7, r6, #4
  7316. 8024e86: f1b0 040b subs.w r4, r0, #11
  7317. 8024e8a: d018 beq.n 8024ebe <__b2d+0xa2>
  7318. 8024e8c: fa05 f504 lsl.w r5, r5, r4
  7319. 8024e90: f1c0 002b rsb r0, r0, #43 ; 0x2b
  7320. 8024e94: 4547 cmp r7, r8
  7321. 8024e96: f045 557f orr.w r5, r5, #1069547520 ; 0x3fc00000
  7322. 8024e9a: fa21 f600 lsr.w r6, r1, r0
  7323. 8024e9e: f445 1540 orr.w r5, r5, #3145728 ; 0x300000
  7324. 8024ea2: ea45 0306 orr.w r3, r5, r6
  7325. 8024ea6: bf88 it hi
  7326. 8024ea8: f857 5c04 ldrhi.w r5, [r7, #-4]
  7327. 8024eac: fa01 f104 lsl.w r1, r1, r4
  7328. 8024eb0: bf8c ite hi
  7329. 8024eb2: fa25 f000 lsrhi.w r0, r5, r0
  7330. 8024eb6: 2000 movls r0, #0
  7331. 8024eb8: ea40 0201 orr.w r2, r0, r1
  7332. 8024ebc: e7d9 b.n 8024e72 <__b2d+0x56>
  7333. 8024ebe: f045 557f orr.w r5, r5, #1069547520 ; 0x3fc00000
  7334. 8024ec2: 460a mov r2, r1
  7335. 8024ec4: f445 1340 orr.w r3, r5, #3145728 ; 0x300000
  7336. 8024ec8: e7d3 b.n 8024e72 <__b2d+0x56>
  7337. 8024eca: bf00 nop
  7338. 08024ecc <__d2b>:
  7339. 8024ecc: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  7340. 8024ed0: b083 sub sp, #12
  7341. 8024ed2: 2101 movs r1, #1
  7342. 8024ed4: 461d mov r5, r3
  7343. 8024ed6: 4614 mov r4, r2
  7344. 8024ed8: 9f0a ldr r7, [sp, #40] ; 0x28
  7345. 8024eda: f7ff fc67 bl 80247ac <_Balloc>
  7346. 8024ede: f3c5 560a ubfx r6, r5, #20, #11
  7347. 8024ee2: f025 437f bic.w r3, r5, #4278190080 ; 0xff000000
  7348. 8024ee6: 46a9 mov r9, r5
  7349. 8024ee8: f423 0370 bic.w r3, r3, #15728640 ; 0xf00000
  7350. 8024eec: 4680 mov r8, r0
  7351. 8024eee: b10e cbz r6, 8024ef4 <__d2b+0x28>
  7352. 8024ef0: f443 1380 orr.w r3, r3, #1048576 ; 0x100000
  7353. 8024ef4: 9301 str r3, [sp, #4]
  7354. 8024ef6: 2c00 cmp r4, #0
  7355. 8024ef8: d024 beq.n 8024f44 <__d2b+0x78>
  7356. 8024efa: a802 add r0, sp, #8
  7357. 8024efc: f840 4d08 str.w r4, [r0, #-8]!
  7358. 8024f00: 4668 mov r0, sp
  7359. 8024f02: f7ff fd53 bl 80249ac <__lo0bits>
  7360. 8024f06: 9b01 ldr r3, [sp, #4]
  7361. 8024f08: 2800 cmp r0, #0
  7362. 8024f0a: d131 bne.n 8024f70 <__d2b+0xa4>
  7363. 8024f0c: 9a00 ldr r2, [sp, #0]
  7364. 8024f0e: f8c8 2014 str.w r2, [r8, #20]
  7365. 8024f12: 2b00 cmp r3, #0
  7366. 8024f14: bf0c ite eq
  7367. 8024f16: 2401 moveq r4, #1
  7368. 8024f18: 2402 movne r4, #2
  7369. 8024f1a: f8c8 3018 str.w r3, [r8, #24]
  7370. 8024f1e: f8c8 4010 str.w r4, [r8, #16]
  7371. 8024f22: b9e6 cbnz r6, 8024f5e <__d2b+0x92>
  7372. 8024f24: eb08 0384 add.w r3, r8, r4, lsl #2
  7373. 8024f28: f2a0 4032 subw r0, r0, #1074 ; 0x432
  7374. 8024f2c: 6038 str r0, [r7, #0]
  7375. 8024f2e: 6918 ldr r0, [r3, #16]
  7376. 8024f30: f7ff fd1e bl 8024970 <__hi0bits>
  7377. 8024f34: 9b0b ldr r3, [sp, #44] ; 0x2c
  7378. 8024f36: ebc0 1044 rsb r0, r0, r4, lsl #5
  7379. 8024f3a: 6018 str r0, [r3, #0]
  7380. 8024f3c: 4640 mov r0, r8
  7381. 8024f3e: b003 add sp, #12
  7382. 8024f40: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  7383. 8024f44: a801 add r0, sp, #4
  7384. 8024f46: f7ff fd31 bl 80249ac <__lo0bits>
  7385. 8024f4a: 2301 movs r3, #1
  7386. 8024f4c: 461c mov r4, r3
  7387. 8024f4e: f8c8 3010 str.w r3, [r8, #16]
  7388. 8024f52: 9b01 ldr r3, [sp, #4]
  7389. 8024f54: f8c8 3014 str.w r3, [r8, #20]
  7390. 8024f58: 3020 adds r0, #32
  7391. 8024f5a: 2e00 cmp r6, #0
  7392. 8024f5c: d0e2 beq.n 8024f24 <__d2b+0x58>
  7393. 8024f5e: 9a0b ldr r2, [sp, #44] ; 0x2c
  7394. 8024f60: f2a6 4933 subw r9, r6, #1075 ; 0x433
  7395. 8024f64: f1c0 0335 rsb r3, r0, #53 ; 0x35
  7396. 8024f68: 4448 add r0, r9
  7397. 8024f6a: 6038 str r0, [r7, #0]
  7398. 8024f6c: 6013 str r3, [r2, #0]
  7399. 8024f6e: e7e5 b.n 8024f3c <__d2b+0x70>
  7400. 8024f70: f1c0 0120 rsb r1, r0, #32
  7401. 8024f74: 9a00 ldr r2, [sp, #0]
  7402. 8024f76: fa03 f101 lsl.w r1, r3, r1
  7403. 8024f7a: fa23 f300 lsr.w r3, r3, r0
  7404. 8024f7e: 430a orrs r2, r1
  7405. 8024f80: 9301 str r3, [sp, #4]
  7406. 8024f82: f8c8 2014 str.w r2, [r8, #20]
  7407. 8024f86: e7c4 b.n 8024f12 <__d2b+0x46>
  7408. 08024f88 <__ratio>:
  7409. 8024f88: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  7410. 8024f8c: b083 sub sp, #12
  7411. 8024f8e: 4688 mov r8, r1
  7412. 8024f90: 4669 mov r1, sp
  7413. 8024f92: 4606 mov r6, r0
  7414. 8024f94: f7ff ff42 bl 8024e1c <__b2d>
  7415. 8024f98: 460d mov r5, r1
  7416. 8024f9a: 4604 mov r4, r0
  7417. 8024f9c: a901 add r1, sp, #4
  7418. 8024f9e: 4640 mov r0, r8
  7419. 8024fa0: f7ff ff3c bl 8024e1c <__b2d>
  7420. 8024fa4: 462f mov r7, r5
  7421. 8024fa6: 460b mov r3, r1
  7422. 8024fa8: 4602 mov r2, r0
  7423. 8024faa: f8d8 1010 ldr.w r1, [r8, #16]
  7424. 8024fae: 4699 mov r9, r3
  7425. 8024fb0: 6930 ldr r0, [r6, #16]
  7426. 8024fb2: 4626 mov r6, r4
  7427. 8024fb4: 4690 mov r8, r2
  7428. 8024fb6: ebc1 0e00 rsb lr, r1, r0
  7429. 8024fba: e89d 0003 ldmia.w sp, {r0, r1}
  7430. 8024fbe: 1a40 subs r0, r0, r1
  7431. 8024fc0: eb00 114e add.w r1, r0, lr, lsl #5
  7432. 8024fc4: 2900 cmp r1, #0
  7433. 8024fc6: bfc9 itett gt
  7434. 8024fc8: eb05 5701 addgt.w r7, r5, r1, lsl #20
  7435. 8024fcc: eba3 5901 suble.w r9, r3, r1, lsl #20
  7436. 8024fd0: 4624 movgt r4, r4
  7437. 8024fd2: 463d movgt r5, r7
  7438. 8024fd4: bfdc itt le
  7439. 8024fd6: 4612 movle r2, r2
  7440. 8024fd8: 464b movle r3, r9
  7441. 8024fda: 4620 mov r0, r4
  7442. 8024fdc: 4629 mov r1, r5
  7443. 8024fde: f7fb fc19 bl 8020814 <__aeabi_ddiv>
  7444. 8024fe2: b003 add sp, #12
  7445. 8024fe4: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  7446. 08024fe8 <_mprec_log10>:
  7447. 8024fe8: 2817 cmp r0, #23
  7448. 8024fea: b510 push {r4, lr}
  7449. 8024fec: 4604 mov r4, r0
  7450. 8024fee: dd0c ble.n 802500a <_mprec_log10+0x22>
  7451. 8024ff0: 2100 movs r1, #0
  7452. 8024ff2: 2000 movs r0, #0
  7453. 8024ff4: f6c3 71f0 movt r1, #16368 ; 0x3ff0
  7454. 8024ff8: 2300 movs r3, #0
  7455. 8024ffa: 2200 movs r2, #0
  7456. 8024ffc: f2c4 0324 movt r3, #16420 ; 0x4024
  7457. 8025000: f7fb fade bl 80205c0 <__aeabi_dmul>
  7458. 8025004: 3c01 subs r4, #1
  7459. 8025006: d1f7 bne.n 8024ff8 <_mprec_log10+0x10>
  7460. 8025008: bd10 pop {r4, pc}
  7461. 802500a: f645 4308 movw r3, #23560 ; 0x5c08
  7462. 802500e: f6c0 0303 movt r3, #2051 ; 0x803
  7463. 8025012: eb03 03c0 add.w r3, r3, r0, lsl #3
  7464. 8025016: e9d3 0104 ldrd r0, r1, [r3, #16]
  7465. 802501a: bd10 pop {r4, pc}
  7466. 0802501c <__copybits>:
  7467. 802501c: b470 push {r4, r5, r6}
  7468. 802501e: 3901 subs r1, #1
  7469. 8025020: 6915 ldr r5, [r2, #16]
  7470. 8025022: f102 0314 add.w r3, r2, #20
  7471. 8025026: 114e asrs r6, r1, #5
  7472. 8025028: 3601 adds r6, #1
  7473. 802502a: eb02 0585 add.w r5, r2, r5, lsl #2
  7474. 802502e: 3514 adds r5, #20
  7475. 8025030: eb00 0686 add.w r6, r0, r6, lsl #2
  7476. 8025034: 42ab cmp r3, r5
  7477. 8025036: d20c bcs.n 8025052 <__copybits+0x36>
  7478. 8025038: 4601 mov r1, r0
  7479. 802503a: f853 4b04 ldr.w r4, [r3], #4
  7480. 802503e: 429d cmp r5, r3
  7481. 8025040: f841 4b04 str.w r4, [r1], #4
  7482. 8025044: d8f9 bhi.n 802503a <__copybits+0x1e>
  7483. 8025046: 1aab subs r3, r5, r2
  7484. 8025048: 3b15 subs r3, #21
  7485. 802504a: f023 0303 bic.w r3, r3, #3
  7486. 802504e: 3304 adds r3, #4
  7487. 8025050: 18c0 adds r0, r0, r3
  7488. 8025052: 4286 cmp r6, r0
  7489. 8025054: d904 bls.n 8025060 <__copybits+0x44>
  7490. 8025056: 2300 movs r3, #0
  7491. 8025058: f840 3b04 str.w r3, [r0], #4
  7492. 802505c: 4286 cmp r6, r0
  7493. 802505e: d8fb bhi.n 8025058 <__copybits+0x3c>
  7494. 8025060: bc70 pop {r4, r5, r6}
  7495. 8025062: 4770 bx lr
  7496. 08025064 <__any_on>:
  7497. 8025064: b430 push {r4, r5}
  7498. 8025066: 114b asrs r3, r1, #5
  7499. 8025068: 6904 ldr r4, [r0, #16]
  7500. 802506a: f100 0214 add.w r2, r0, #20
  7501. 802506e: 429c cmp r4, r3
  7502. 8025070: bfb8 it lt
  7503. 8025072: 4623 movlt r3, r4
  7504. 8025074: db00 blt.n 8025078 <__any_on+0x14>
  7505. 8025076: dc11 bgt.n 802509c <__any_on+0x38>
  7506. 8025078: 3304 adds r3, #4
  7507. 802507a: eb00 0083 add.w r0, r0, r3, lsl #2
  7508. 802507e: 1d03 adds r3, r0, #4
  7509. 8025080: 429a cmp r2, r3
  7510. 8025082: d218 bcs.n 80250b6 <__any_on+0x52>
  7511. 8025084: f853 3c04 ldr.w r3, [r3, #-4]
  7512. 8025088: b92b cbnz r3, 8025096 <__any_on+0x32>
  7513. 802508a: 4282 cmp r2, r0
  7514. 802508c: d213 bcs.n 80250b6 <__any_on+0x52>
  7515. 802508e: f850 3d04 ldr.w r3, [r0, #-4]!
  7516. 8025092: 2b00 cmp r3, #0
  7517. 8025094: d0f9 beq.n 802508a <__any_on+0x26>
  7518. 8025096: 2001 movs r0, #1
  7519. 8025098: bc30 pop {r4, r5}
  7520. 802509a: 4770 bx lr
  7521. 802509c: f011 011f ands.w r1, r1, #31
  7522. 80250a0: d0ea beq.n 8025078 <__any_on+0x14>
  7523. 80250a2: eb00 0483 add.w r4, r0, r3, lsl #2
  7524. 80250a6: 6964 ldr r4, [r4, #20]
  7525. 80250a8: fa24 f501 lsr.w r5, r4, r1
  7526. 80250ac: fa05 f101 lsl.w r1, r5, r1
  7527. 80250b0: 42a1 cmp r1, r4
  7528. 80250b2: d1f0 bne.n 8025096 <__any_on+0x32>
  7529. 80250b4: e7e0 b.n 8025078 <__any_on+0x14>
  7530. 80250b6: 2000 movs r0, #0
  7531. 80250b8: e7ee b.n 8025098 <__any_on+0x34>
  7532. 80250ba: bf00 nop
  7533. 080250bc <_sbrk_r>:
  7534. 80250bc: b538 push {r3, r4, r5, lr}
  7535. 80250be: f245 1438 movw r4, #20792 ; 0x5138
  7536. 80250c2: f2c2 0401 movt r4, #8193 ; 0x2001
  7537. 80250c6: 4605 mov r5, r0
  7538. 80250c8: 4608 mov r0, r1
  7539. 80250ca: 2300 movs r3, #0
  7540. 80250cc: 6023 str r3, [r4, #0]
  7541. 80250ce: f010 fcbf bl 8035a50 <_sbrk>
  7542. 80250d2: 1c43 adds r3, r0, #1
  7543. 80250d4: d000 beq.n 80250d8 <_sbrk_r+0x1c>
  7544. 80250d6: bd38 pop {r3, r4, r5, pc}
  7545. 80250d8: 6823 ldr r3, [r4, #0]
  7546. 80250da: 2b00 cmp r3, #0
  7547. 80250dc: d0fb beq.n 80250d6 <_sbrk_r+0x1a>
  7548. 80250de: 602b str r3, [r5, #0]
  7549. 80250e0: bd38 pop {r3, r4, r5, pc}
  7550. 80250e2: bf00 nop
  7551. 080250e4 <strchr>:
  7552. 80250e4: b2c9 uxtb r1, r1
  7553. 80250e6: b4f0 push {r4, r5, r6, r7}
  7554. 80250e8: 2900 cmp r1, #0
  7555. 80250ea: d04b beq.n 8025184 <strchr+0xa0>
  7556. 80250ec: 0783 lsls r3, r0, #30
  7557. 80250ee: d00f beq.n 8025110 <strchr+0x2c>
  7558. 80250f0: 7803 ldrb r3, [r0, #0]
  7559. 80250f2: 2b00 cmp r3, #0
  7560. 80250f4: d073 beq.n 80251de <strchr+0xfa>
  7561. 80250f6: 4299 cmp r1, r3
  7562. 80250f8: d042 beq.n 8025180 <strchr+0x9c>
  7563. 80250fa: 1c43 adds r3, r0, #1
  7564. 80250fc: e005 b.n 802510a <strchr+0x26>
  7565. 80250fe: f813 2b01 ldrb.w r2, [r3], #1
  7566. 8025102: 2a00 cmp r2, #0
  7567. 8025104: d03b beq.n 802517e <strchr+0x9a>
  7568. 8025106: 4291 cmp r1, r2
  7569. 8025108: d03a beq.n 8025180 <strchr+0x9c>
  7570. 802510a: 079a lsls r2, r3, #30
  7571. 802510c: 4618 mov r0, r3
  7572. 802510e: d1f6 bne.n 80250fe <strchr+0x1a>
  7573. 8025110: 6803 ldr r3, [r0, #0]
  7574. 8025112: ea41 2701 orr.w r7, r1, r1, lsl #8
  7575. 8025116: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  7576. 802511a: ea47 4707 orr.w r7, r7, r7, lsl #16
  7577. 802511e: ea22 0203 bic.w r2, r2, r3
  7578. 8025122: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  7579. 8025126: d11c bne.n 8025162 <strchr+0x7e>
  7580. 8025128: 407b eors r3, r7
  7581. 802512a: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  7582. 802512e: ea22 0303 bic.w r3, r2, r3
  7583. 8025132: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  7584. 8025136: d114 bne.n 8025162 <strchr+0x7e>
  7585. 8025138: 1d02 adds r2, r0, #4
  7586. 802513a: e002 b.n 8025142 <strchr+0x5e>
  7587. 802513c: f014 3f80 tst.w r4, #2155905152 ; 0x80808080
  7588. 8025140: d10f bne.n 8025162 <strchr+0x7e>
  7589. 8025142: 4610 mov r0, r2
  7590. 8025144: f852 3b04 ldr.w r3, [r2], #4
  7591. 8025148: f1a3 3601 sub.w r6, r3, #16843009 ; 0x1010101
  7592. 802514c: ea87 0403 eor.w r4, r7, r3
  7593. 8025150: ea26 0303 bic.w r3, r6, r3
  7594. 8025154: f1a4 3501 sub.w r5, r4, #16843009 ; 0x1010101
  7595. 8025158: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  7596. 802515c: ea25 0404 bic.w r4, r5, r4
  7597. 8025160: d0ec beq.n 802513c <strchr+0x58>
  7598. 8025162: 7803 ldrb r3, [r0, #0]
  7599. 8025164: 2b00 cmp r3, #0
  7600. 8025166: d03a beq.n 80251de <strchr+0xfa>
  7601. 8025168: 4299 cmp r1, r3
  7602. 802516a: d009 beq.n 8025180 <strchr+0x9c>
  7603. 802516c: 1c43 adds r3, r0, #1
  7604. 802516e: e001 b.n 8025174 <strchr+0x90>
  7605. 8025170: 4291 cmp r1, r2
  7606. 8025172: d005 beq.n 8025180 <strchr+0x9c>
  7607. 8025174: 4618 mov r0, r3
  7608. 8025176: f813 2b01 ldrb.w r2, [r3], #1
  7609. 802517a: 2a00 cmp r2, #0
  7610. 802517c: d1f8 bne.n 8025170 <strchr+0x8c>
  7611. 802517e: 4610 mov r0, r2
  7612. 8025180: bcf0 pop {r4, r5, r6, r7}
  7613. 8025182: 4770 bx lr
  7614. 8025184: 0781 lsls r1, r0, #30
  7615. 8025186: d00d beq.n 80251a4 <strchr+0xc0>
  7616. 8025188: 7803 ldrb r3, [r0, #0]
  7617. 802518a: 2b00 cmp r3, #0
  7618. 802518c: d0f8 beq.n 8025180 <strchr+0x9c>
  7619. 802518e: 1c43 adds r3, r0, #1
  7620. 8025190: e002 b.n 8025198 <strchr+0xb4>
  7621. 8025192: 7802 ldrb r2, [r0, #0]
  7622. 8025194: 2a00 cmp r2, #0
  7623. 8025196: d0f3 beq.n 8025180 <strchr+0x9c>
  7624. 8025198: f013 0f03 tst.w r3, #3
  7625. 802519c: 4618 mov r0, r3
  7626. 802519e: f103 0301 add.w r3, r3, #1
  7627. 80251a2: d1f6 bne.n 8025192 <strchr+0xae>
  7628. 80251a4: 6803 ldr r3, [r0, #0]
  7629. 80251a6: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  7630. 80251aa: ea22 0303 bic.w r3, r2, r3
  7631. 80251ae: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  7632. 80251b2: d10a bne.n 80251ca <strchr+0xe6>
  7633. 80251b4: 1d02 adds r2, r0, #4
  7634. 80251b6: 4610 mov r0, r2
  7635. 80251b8: f852 1b04 ldr.w r1, [r2], #4
  7636. 80251bc: f1a1 3401 sub.w r4, r1, #16843009 ; 0x1010101
  7637. 80251c0: ea24 0101 bic.w r1, r4, r1
  7638. 80251c4: f011 3f80 tst.w r1, #2155905152 ; 0x80808080
  7639. 80251c8: d0f5 beq.n 80251b6 <strchr+0xd2>
  7640. 80251ca: 7803 ldrb r3, [r0, #0]
  7641. 80251cc: 2b00 cmp r3, #0
  7642. 80251ce: d0d7 beq.n 8025180 <strchr+0x9c>
  7643. 80251d0: 1c43 adds r3, r0, #1
  7644. 80251d2: 4618 mov r0, r3
  7645. 80251d4: 3301 adds r3, #1
  7646. 80251d6: 7802 ldrb r2, [r0, #0]
  7647. 80251d8: 2a00 cmp r2, #0
  7648. 80251da: d1fa bne.n 80251d2 <strchr+0xee>
  7649. 80251dc: e7d0 b.n 8025180 <strchr+0x9c>
  7650. 80251de: 4618 mov r0, r3
  7651. 80251e0: e7ce b.n 8025180 <strchr+0x9c>
  7652. 80251e2: bf00 nop
  7653. 080251e4 <_calloc_r>:
  7654. 80251e4: b510 push {r4, lr}
  7655. 80251e6: fb01 f102 mul.w r1, r1, r2
  7656. 80251ea: f7fe ffc5 bl 8024178 <_malloc_r>
  7657. 80251ee: 4604 mov r4, r0
  7658. 80251f0: b170 cbz r0, 8025210 <_calloc_r+0x2c>
  7659. 80251f2: f850 2c04 ldr.w r2, [r0, #-4]
  7660. 80251f6: f022 0203 bic.w r2, r2, #3
  7661. 80251fa: 3a04 subs r2, #4
  7662. 80251fc: 2a24 cmp r2, #36 ; 0x24
  7663. 80251fe: d81c bhi.n 802523a <_calloc_r+0x56>
  7664. 8025200: 2a13 cmp r2, #19
  7665. 8025202: bf98 it ls
  7666. 8025204: 4603 movls r3, r0
  7667. 8025206: d805 bhi.n 8025214 <_calloc_r+0x30>
  7668. 8025208: 2200 movs r2, #0
  7669. 802520a: 601a str r2, [r3, #0]
  7670. 802520c: 605a str r2, [r3, #4]
  7671. 802520e: 609a str r2, [r3, #8]
  7672. 8025210: 4620 mov r0, r4
  7673. 8025212: bd10 pop {r4, pc}
  7674. 8025214: 2100 movs r1, #0
  7675. 8025216: 2a1b cmp r2, #27
  7676. 8025218: 6001 str r1, [r0, #0]
  7677. 802521a: bf98 it ls
  7678. 802521c: f100 0308 addls.w r3, r0, #8
  7679. 8025220: 6041 str r1, [r0, #4]
  7680. 8025222: d9f1 bls.n 8025208 <_calloc_r+0x24>
  7681. 8025224: 2a24 cmp r2, #36 ; 0x24
  7682. 8025226: 6081 str r1, [r0, #8]
  7683. 8025228: 60c1 str r1, [r0, #12]
  7684. 802522a: bf11 iteee ne
  7685. 802522c: f100 0310 addne.w r3, r0, #16
  7686. 8025230: 6101 streq r1, [r0, #16]
  7687. 8025232: f100 0318 addeq.w r3, r0, #24
  7688. 8025236: 6141 streq r1, [r0, #20]
  7689. 8025238: e7e6 b.n 8025208 <_calloc_r+0x24>
  7690. 802523a: 2100 movs r1, #0
  7691. 802523c: f7fc fc40 bl 8021ac0 <memset>
  7692. 8025240: 4620 mov r0, r4
  7693. 8025242: bd10 pop {r4, pc}
  7694. 08025244 <__aeabi_d2uiz>:
  7695. 8025244: 004a lsls r2, r1, #1
  7696. 8025246: d211 bcs.n 802526c <__aeabi_d2uiz+0x28>
  7697. 8025248: f512 1200 adds.w r2, r2, #2097152 ; 0x200000
  7698. 802524c: d211 bcs.n 8025272 <__aeabi_d2uiz+0x2e>
  7699. 802524e: d50d bpl.n 802526c <__aeabi_d2uiz+0x28>
  7700. 8025250: f46f 7378 mvn.w r3, #992 ; 0x3e0
  7701. 8025254: ebb3 5262 subs.w r2, r3, r2, asr #21
  7702. 8025258: d40e bmi.n 8025278 <__aeabi_d2uiz+0x34>
  7703. 802525a: ea4f 23c1 mov.w r3, r1, lsl #11
  7704. 802525e: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000
  7705. 8025262: ea43 5350 orr.w r3, r3, r0, lsr #21
  7706. 8025266: fa23 f002 lsr.w r0, r3, r2
  7707. 802526a: 4770 bx lr
  7708. 802526c: f04f 0000 mov.w r0, #0
  7709. 8025270: 4770 bx lr
  7710. 8025272: ea50 3001 orrs.w r0, r0, r1, lsl #12
  7711. 8025276: d102 bne.n 802527e <__aeabi_d2uiz+0x3a>
  7712. 8025278: f04f 30ff mov.w r0, #4294967295
  7713. 802527c: 4770 bx lr
  7714. 802527e: f04f 0000 mov.w r0, #0
  7715. 8025282: 4770 bx lr
  7716. 08025284 <fabs>:
  7717. 8025284: f021 4100 bic.w r1, r1, #2147483648 ; 0x80000000
  7718. 8025288: 4770 bx lr
  7719. 802528a: bf00 nop
  7720. 0802528c <NVIC_PriorityGroupConfig>:
  7721. {
  7722. /* Check the parameters */
  7723. assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  7724. /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  7725. SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
  7726. 802528c: f040 60bf orr.w r0, r0, #100139008 ; 0x5f80000
  7727. 8025290: 4b02 ldr r3, [pc, #8] ; (802529c <NVIC_PriorityGroupConfig+0x10>)
  7728. 8025292: f440 3000 orr.w r0, r0, #131072 ; 0x20000
  7729. 8025296: 60d8 str r0, [r3, #12]
  7730. 8025298: 4770 bx lr
  7731. 802529a: bf00 nop
  7732. 802529c: e000ed00 .word 0xe000ed00
  7733. 080252a0 <NVIC_Init>:
  7734. /* Check the parameters */
  7735. assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
  7736. assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));
  7737. assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
  7738. if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  7739. 80252a0: 78c3 ldrb r3, [r0, #3]
  7740. 80252a2: b30b cbz r3, 80252e8 <NVIC_Init+0x48>
  7741. {
  7742. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7743. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7744. 80252a4: 4b16 ldr r3, [pc, #88] ; (8025300 <NVIC_Init+0x60>)
  7745. tmppre = (0x4 - tmppriority);
  7746. tmpsub = tmpsub >> tmppriority;
  7747. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7748. 80252a6: 7841 ldrb r1, [r0, #1]
  7749. assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
  7750. if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  7751. {
  7752. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7753. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7754. 80252a8: 68db ldr r3, [r3, #12]
  7755. 80252aa: 43db mvns r3, r3
  7756. 80252ac: f3c3 2302 ubfx r3, r3, #8, #3
  7757. tmppre = (0x4 - tmppriority);
  7758. 80252b0: f1c3 0204 rsb r2, r3, #4
  7759. tmpsub = tmpsub >> tmppriority;
  7760. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7761. 80252b4: b2d2 uxtb r2, r2
  7762. 80252b6: fa01 f202 lsl.w r2, r1, r2
  7763. if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  7764. {
  7765. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7766. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7767. tmppre = (0x4 - tmppriority);
  7768. tmpsub = tmpsub >> tmppriority;
  7769. 80252ba: 210f movs r1, #15
  7770. 80252bc: fa41 f303 asr.w r3, r1, r3
  7771. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7772. tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);
  7773. 80252c0: 7881 ldrb r1, [r0, #2]
  7774. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7775. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7776. tmppre = (0x4 - tmppriority);
  7777. tmpsub = tmpsub >> tmppriority;
  7778. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7779. 80252c2: b2d2 uxtb r2, r2
  7780. tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);
  7781. 80252c4: 400b ands r3, r1
  7782. 80252c6: 431a orrs r2, r3
  7783. tmppriority = tmppriority << 0x04;
  7784. NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
  7785. 80252c8: 7803 ldrb r3, [r0, #0]
  7786. 80252ca: f103 4360 add.w r3, r3, #3758096384 ; 0xe0000000
  7787. 80252ce: f503 4361 add.w r3, r3, #57600 ; 0xe100
  7788. tmpsub = tmpsub >> tmppriority;
  7789. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7790. tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);
  7791. tmppriority = tmppriority << 0x04;
  7792. 80252d2: 0112 lsls r2, r2, #4
  7793. NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
  7794. 80252d4: f883 2300 strb.w r2, [r3, #768] ; 0x300
  7795. /* Enable the Selected IRQ Channels --------------------------------------*/
  7796. NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  7797. 80252d8: 7803 ldrb r3, [r0, #0]
  7798. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7799. 80252da: 2201 movs r2, #1
  7800. tmppriority = tmppriority << 0x04;
  7801. NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
  7802. /* Enable the Selected IRQ Channels --------------------------------------*/
  7803. NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  7804. 80252dc: 0959 lsrs r1, r3, #5
  7805. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7806. 80252de: f003 031f and.w r3, r3, #31
  7807. 80252e2: fa02 f303 lsl.w r3, r2, r3
  7808. 80252e6: e007 b.n 80252f8 <NVIC_Init+0x58>
  7809. }
  7810. else
  7811. {
  7812. /* Disable the Selected IRQ Channels -------------------------------------*/
  7813. NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  7814. 80252e8: 7803 ldrb r3, [r0, #0]
  7815. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7816. 80252ea: 2201 movs r2, #1
  7817. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7818. }
  7819. else
  7820. {
  7821. /* Disable the Selected IRQ Channels -------------------------------------*/
  7822. NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  7823. 80252ec: 0959 lsrs r1, r3, #5
  7824. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7825. 80252ee: f003 031f and.w r3, r3, #31
  7826. 80252f2: fa02 f303 lsl.w r3, r2, r3
  7827. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7828. }
  7829. else
  7830. {
  7831. /* Disable the Selected IRQ Channels -------------------------------------*/
  7832. NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  7833. 80252f6: 3120 adds r1, #32
  7834. 80252f8: 4a02 ldr r2, [pc, #8] ; (8025304 <NVIC_Init+0x64>)
  7835. 80252fa: f842 3021 str.w r3, [r2, r1, lsl #2]
  7836. 80252fe: 4770 bx lr
  7837. 8025300: e000ed00 .word 0xe000ed00
  7838. 8025304: e000e100 .word 0xe000e100
  7839. 08025308 <NVIC_SetVectorTable>:
  7840. {
  7841. /* Check the parameters */
  7842. assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  7843. assert_param(IS_NVIC_OFFSET(Offset));
  7844. SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
  7845. 8025308: f021 4160 bic.w r1, r1, #3758096384 ; 0xe0000000
  7846. 802530c: f021 017f bic.w r1, r1, #127 ; 0x7f
  7847. 8025310: 4b01 ldr r3, [pc, #4] ; (8025318 <NVIC_SetVectorTable+0x10>)
  7848. 8025312: 4308 orrs r0, r1
  7849. 8025314: 6098 str r0, [r3, #8]
  7850. 8025316: 4770 bx lr
  7851. 8025318: e000ed00 .word 0xe000ed00
  7852. 0802531c <CRC_ResetDR>:
  7853. * @retval None
  7854. */
  7855. void CRC_ResetDR(void)
  7856. {
  7857. /* Reset CRC generator */
  7858. CRC->CR = CRC_CR_RESET;
  7859. 802531c: 4b01 ldr r3, [pc, #4] ; (8025324 <CRC_ResetDR+0x8>)
  7860. 802531e: 2201 movs r2, #1
  7861. 8025320: 609a str r2, [r3, #8]
  7862. 8025322: 4770 bx lr
  7863. 8025324: 40023000 .word 0x40023000
  7864. 08025328 <CRC_CalcBlockCRC>:
  7865. * @param pBuffer: pointer to the buffer containing the data to be computed
  7866. * @param BufferLength: length of the buffer to be computed
  7867. * @retval 32-bit CRC
  7868. */
  7869. uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
  7870. {
  7871. 8025328: b510 push {r4, lr}
  7872. uint32_t index = 0;
  7873. for(index = 0; index < BufferLength; index++)
  7874. 802532a: 2300 movs r3, #0
  7875. 802532c: 4c05 ldr r4, [pc, #20] ; (8025344 <CRC_CalcBlockCRC+0x1c>)
  7876. 802532e: e003 b.n 8025338 <CRC_CalcBlockCRC+0x10>
  7877. {
  7878. CRC->DR = pBuffer[index];
  7879. 8025330: f850 2023 ldr.w r2, [r0, r3, lsl #2]
  7880. */
  7881. uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
  7882. {
  7883. uint32_t index = 0;
  7884. for(index = 0; index < BufferLength; index++)
  7885. 8025334: 3301 adds r3, #1
  7886. {
  7887. CRC->DR = pBuffer[index];
  7888. 8025336: 6022 str r2, [r4, #0]
  7889. */
  7890. uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
  7891. {
  7892. uint32_t index = 0;
  7893. for(index = 0; index < BufferLength; index++)
  7894. 8025338: 428b cmp r3, r1
  7895. 802533a: d1f9 bne.n 8025330 <CRC_CalcBlockCRC+0x8>
  7896. {
  7897. CRC->DR = pBuffer[index];
  7898. }
  7899. return (CRC->DR);
  7900. 802533c: 4b01 ldr r3, [pc, #4] ; (8025344 <CRC_CalcBlockCRC+0x1c>)
  7901. 802533e: 6818 ldr r0, [r3, #0]
  7902. }
  7903. 8025340: bd10 pop {r4, pc}
  7904. 8025342: bf00 nop
  7905. 8025344: 40023000 .word 0x40023000
  7906. 08025348 <FLASH_Unlock>:
  7907. * @param None
  7908. * @retval None
  7909. */
  7910. void FLASH_Unlock(void)
  7911. {
  7912. if((FLASH->CR & FLASH_CR_LOCK) != RESET)
  7913. 8025348: 4b04 ldr r3, [pc, #16] ; (802535c <FLASH_Unlock+0x14>)
  7914. 802534a: 691a ldr r2, [r3, #16]
  7915. 802534c: 2a00 cmp r2, #0
  7916. 802534e: da04 bge.n 802535a <FLASH_Unlock+0x12>
  7917. {
  7918. /* Authorize the FLASH Registers access */
  7919. FLASH->KEYR = FLASH_KEY1;
  7920. 8025350: 4a03 ldr r2, [pc, #12] ; (8025360 <FLASH_Unlock+0x18>)
  7921. 8025352: 605a str r2, [r3, #4]
  7922. FLASH->KEYR = FLASH_KEY2;
  7923. 8025354: f102 3288 add.w r2, r2, #2290649224 ; 0x88888888
  7924. 8025358: 605a str r2, [r3, #4]
  7925. 802535a: 4770 bx lr
  7926. 802535c: 40023c00 .word 0x40023c00
  7927. 8025360: 45670123 .word 0x45670123
  7928. 08025364 <FLASH_Lock>:
  7929. * @retval None
  7930. */
  7931. void FLASH_Lock(void)
  7932. {
  7933. /* Set the LOCK Bit to lock the FLASH Registers access */
  7934. FLASH->CR |= FLASH_CR_LOCK;
  7935. 8025364: 4b02 ldr r3, [pc, #8] ; (8025370 <FLASH_Lock+0xc>)
  7936. 8025366: 691a ldr r2, [r3, #16]
  7937. 8025368: f042 4200 orr.w r2, r2, #2147483648 ; 0x80000000
  7938. 802536c: 611a str r2, [r3, #16]
  7939. 802536e: 4770 bx lr
  7940. 8025370: 40023c00 .word 0x40023c00
  7941. 08025374 <FLASH_ClearFlag>:
  7942. {
  7943. /* Check the parameters */
  7944. assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG));
  7945. /* Clear the flags */
  7946. FLASH->SR = FLASH_FLAG;
  7947. 8025374: 4b01 ldr r3, [pc, #4] ; (802537c <FLASH_ClearFlag+0x8>)
  7948. 8025376: 60d8 str r0, [r3, #12]
  7949. 8025378: 4770 bx lr
  7950. 802537a: bf00 nop
  7951. 802537c: 40023c00 .word 0x40023c00
  7952. 08025380 <FLASH_GetStatus>:
  7953. */
  7954. FLASH_Status FLASH_GetStatus(void)
  7955. {
  7956. FLASH_Status flashstatus = FLASH_COMPLETE;
  7957. if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)
  7958. 8025380: 4b0b ldr r3, [pc, #44] ; (80253b0 <FLASH_GetStatus+0x30>)
  7959. 8025382: 68da ldr r2, [r3, #12]
  7960. 8025384: 03d0 lsls r0, r2, #15
  7961. 8025386: d40d bmi.n 80253a4 <FLASH_GetStatus+0x24>
  7962. {
  7963. flashstatus = FLASH_BUSY;
  7964. }
  7965. else
  7966. {
  7967. if((FLASH->SR & FLASH_FLAG_WRPERR) != (uint32_t)0x00)
  7968. 8025388: 68da ldr r2, [r3, #12]
  7969. 802538a: 06d1 lsls r1, r2, #27
  7970. 802538c: d40c bmi.n 80253a8 <FLASH_GetStatus+0x28>
  7971. {
  7972. flashstatus = FLASH_ERROR_WRP;
  7973. }
  7974. else
  7975. {
  7976. if((FLASH->SR & (uint32_t)0xEF) != (uint32_t)0x00)
  7977. 802538e: 68da ldr r2, [r3, #12]
  7978. 8025390: f012 0fef tst.w r2, #239 ; 0xef
  7979. 8025394: d10a bne.n 80253ac <FLASH_GetStatus+0x2c>
  7980. {
  7981. flashstatus = FLASH_ERROR_PROGRAM;
  7982. }
  7983. else
  7984. {
  7985. if((FLASH->SR & FLASH_FLAG_OPERR) != (uint32_t)0x00)
  7986. 8025396: 68db ldr r3, [r3, #12]
  7987. 8025398: f013 0f02 tst.w r3, #2
  7988. {
  7989. flashstatus = FLASH_ERROR_OPERATION;
  7990. 802539c: bf0c ite eq
  7991. 802539e: 2008 moveq r0, #8
  7992. 80253a0: 2007 movne r0, #7
  7993. 80253a2: 4770 bx lr
  7994. {
  7995. FLASH_Status flashstatus = FLASH_COMPLETE;
  7996. if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)
  7997. {
  7998. flashstatus = FLASH_BUSY;
  7999. 80253a4: 2001 movs r0, #1
  8000. 80253a6: 4770 bx lr
  8001. }
  8002. else
  8003. {
  8004. if((FLASH->SR & FLASH_FLAG_WRPERR) != (uint32_t)0x00)
  8005. {
  8006. flashstatus = FLASH_ERROR_WRP;
  8007. 80253a8: 2005 movs r0, #5
  8008. 80253aa: 4770 bx lr
  8009. }
  8010. else
  8011. {
  8012. if((FLASH->SR & (uint32_t)0xEF) != (uint32_t)0x00)
  8013. {
  8014. flashstatus = FLASH_ERROR_PROGRAM;
  8015. 80253ac: 2006 movs r0, #6
  8016. }
  8017. }
  8018. }
  8019. /* Return the FLASH Status */
  8020. return flashstatus;
  8021. }
  8022. 80253ae: 4770 bx lr
  8023. 80253b0: 40023c00 .word 0x40023c00
  8024. 080253b4 <FLASH_WaitForLastOperation>:
  8025. * @param None
  8026. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  8027. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  8028. */
  8029. FLASH_Status FLASH_WaitForLastOperation(void)
  8030. {
  8031. 80253b4: b507 push {r0, r1, r2, lr}
  8032. __IO FLASH_Status status = FLASH_COMPLETE;
  8033. 80253b6: 2308 movs r3, #8
  8034. 80253b8: f88d 3007 strb.w r3, [sp, #7]
  8035. /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
  8036. Even if the FLASH operation fails, the BUSY flag will be reset and an error
  8037. flag will be set */
  8038. while(status == FLASH_BUSY)
  8039. {
  8040. status = FLASH_GetStatus();
  8041. 80253bc: f7ff ffe0 bl 8025380 <FLASH_GetStatus>
  8042. 80253c0: f88d 0007 strb.w r0, [sp, #7]
  8043. status = FLASH_GetStatus();
  8044. /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
  8045. Even if the FLASH operation fails, the BUSY flag will be reset and an error
  8046. flag will be set */
  8047. while(status == FLASH_BUSY)
  8048. 80253c4: f89d 3007 ldrb.w r3, [sp, #7]
  8049. 80253c8: 2b01 cmp r3, #1
  8050. 80253ca: d0f7 beq.n 80253bc <FLASH_WaitForLastOperation+0x8>
  8051. {
  8052. status = FLASH_GetStatus();
  8053. }
  8054. /* Return the operation status */
  8055. return status;
  8056. 80253cc: f89d 0007 ldrb.w r0, [sp, #7]
  8057. }
  8058. 80253d0: bd0e pop {r1, r2, r3, pc}
  8059. 80253d2: 0000 movs r0, r0
  8060. 080253d4 <FLASH_ProgramByte>:
  8061. * @param Data: specifies the data to be programmed.
  8062. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  8063. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  8064. */
  8065. FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data)
  8066. {
  8067. 80253d4: b570 push {r4, r5, r6, lr}
  8068. 80253d6: 4605 mov r5, r0
  8069. 80253d8: 460e mov r6, r1
  8070. /* Check the parameters */
  8071. assert_param(IS_FLASH_ADDRESS(Address));
  8072. /* Wait for last operation to be completed */
  8073. status = FLASH_WaitForLastOperation();
  8074. 80253da: f7ff ffeb bl 80253b4 <FLASH_WaitForLastOperation>
  8075. if(status == FLASH_COMPLETE)
  8076. 80253de: 2808 cmp r0, #8
  8077. 80253e0: d111 bne.n 8025406 <FLASH_ProgramByte+0x32>
  8078. {
  8079. /* if the previous operation is completed, proceed to program the new data */
  8080. FLASH->CR &= CR_PSIZE_MASK;
  8081. 80253e2: 4c09 ldr r4, [pc, #36] ; (8025408 <FLASH_ProgramByte+0x34>)
  8082. 80253e4: 6923 ldr r3, [r4, #16]
  8083. 80253e6: f423 7340 bic.w r3, r3, #768 ; 0x300
  8084. 80253ea: 6123 str r3, [r4, #16]
  8085. FLASH->CR |= FLASH_PSIZE_BYTE;
  8086. 80253ec: 6923 ldr r3, [r4, #16]
  8087. 80253ee: 6123 str r3, [r4, #16]
  8088. FLASH->CR |= FLASH_CR_PG;
  8089. 80253f0: 6923 ldr r3, [r4, #16]
  8090. 80253f2: f043 0301 orr.w r3, r3, #1
  8091. 80253f6: 6123 str r3, [r4, #16]
  8092. *(__IO uint8_t*)Address = Data;
  8093. 80253f8: 702e strb r6, [r5, #0]
  8094. /* Wait for last operation to be completed */
  8095. status = FLASH_WaitForLastOperation();
  8096. 80253fa: f7ff ffdb bl 80253b4 <FLASH_WaitForLastOperation>
  8097. /* if the program operation is completed, disable the PG Bit */
  8098. FLASH->CR &= (~FLASH_CR_PG);
  8099. 80253fe: 6923 ldr r3, [r4, #16]
  8100. 8025400: f023 0301 bic.w r3, r3, #1
  8101. 8025404: 6123 str r3, [r4, #16]
  8102. }
  8103. /* Return the Program Status */
  8104. return status;
  8105. }
  8106. 8025406: bd70 pop {r4, r5, r6, pc}
  8107. 8025408: 40023c00 .word 0x40023c00
  8108. 0802540c <FLASH_ProgramWord>:
  8109. * @param Data: specifies the data to be programmed.
  8110. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  8111. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  8112. */
  8113. FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
  8114. {
  8115. 802540c: b570 push {r4, r5, r6, lr}
  8116. 802540e: 4605 mov r5, r0
  8117. 8025410: 460e mov r6, r1
  8118. /* Check the parameters */
  8119. assert_param(IS_FLASH_ADDRESS(Address));
  8120. /* Wait for last operation to be completed */
  8121. status = FLASH_WaitForLastOperation();
  8122. 8025412: f7ff ffcf bl 80253b4 <FLASH_WaitForLastOperation>
  8123. if(status == FLASH_COMPLETE)
  8124. 8025416: 2808 cmp r0, #8
  8125. 8025418: d113 bne.n 8025442 <FLASH_ProgramWord+0x36>
  8126. {
  8127. /* if the previous operation is completed, proceed to program the new data */
  8128. FLASH->CR &= CR_PSIZE_MASK;
  8129. 802541a: 4c0a ldr r4, [pc, #40] ; (8025444 <FLASH_ProgramWord+0x38>)
  8130. 802541c: 6923 ldr r3, [r4, #16]
  8131. 802541e: f423 7340 bic.w r3, r3, #768 ; 0x300
  8132. 8025422: 6123 str r3, [r4, #16]
  8133. FLASH->CR |= FLASH_PSIZE_WORD;
  8134. 8025424: 6923 ldr r3, [r4, #16]
  8135. 8025426: f443 7300 orr.w r3, r3, #512 ; 0x200
  8136. 802542a: 6123 str r3, [r4, #16]
  8137. FLASH->CR |= FLASH_CR_PG;
  8138. 802542c: 6923 ldr r3, [r4, #16]
  8139. 802542e: f043 0301 orr.w r3, r3, #1
  8140. 8025432: 6123 str r3, [r4, #16]
  8141. *(__IO uint32_t*)Address = Data;
  8142. 8025434: 602e str r6, [r5, #0]
  8143. /* Wait for last operation to be completed */
  8144. status = FLASH_WaitForLastOperation();
  8145. 8025436: f7ff ffbd bl 80253b4 <FLASH_WaitForLastOperation>
  8146. /* if the program operation is completed, disable the PG Bit */
  8147. FLASH->CR &= (~FLASH_CR_PG);
  8148. 802543a: 6923 ldr r3, [r4, #16]
  8149. 802543c: f023 0301 bic.w r3, r3, #1
  8150. 8025440: 6123 str r3, [r4, #16]
  8151. }
  8152. /* Return the Program Status */
  8153. return status;
  8154. }
  8155. 8025442: bd70 pop {r4, r5, r6, pc}
  8156. 8025444: 40023c00 .word 0x40023c00
  8157. 08025448 <FLASH_EraseSector>:
  8158. *
  8159. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  8160. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  8161. */
  8162. FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange)
  8163. {
  8164. 8025448: b570 push {r4, r5, r6, lr}
  8165. 802544a: 4606 mov r6, r0
  8166. /* Check the parameters */
  8167. assert_param(IS_FLASH_SECTOR(FLASH_Sector));
  8168. assert_param(IS_VOLTAGERANGE(VoltageRange));
  8169. if(VoltageRange == VoltageRange_1)
  8170. 802544c: b141 cbz r1, 8025460 <FLASH_EraseSector+0x18>
  8171. {
  8172. tmp_psize = FLASH_PSIZE_BYTE;
  8173. }
  8174. else if(VoltageRange == VoltageRange_2)
  8175. 802544e: 2901 cmp r1, #1
  8176. 8025450: d008 beq.n 8025464 <FLASH_EraseSector+0x1c>
  8177. {
  8178. tmp_psize = FLASH_PSIZE_HALF_WORD;
  8179. }
  8180. else if(VoltageRange == VoltageRange_3)
  8181. {
  8182. tmp_psize = FLASH_PSIZE_WORD;
  8183. 8025452: 2902 cmp r1, #2
  8184. 8025454: bf14 ite ne
  8185. 8025456: f44f 7540 movne.w r5, #768 ; 0x300
  8186. 802545a: f44f 7500 moveq.w r5, #512 ; 0x200
  8187. 802545e: e003 b.n 8025468 <FLASH_EraseSector+0x20>
  8188. assert_param(IS_FLASH_SECTOR(FLASH_Sector));
  8189. assert_param(IS_VOLTAGERANGE(VoltageRange));
  8190. if(VoltageRange == VoltageRange_1)
  8191. {
  8192. tmp_psize = FLASH_PSIZE_BYTE;
  8193. 8025460: 460d mov r5, r1
  8194. 8025462: e001 b.n 8025468 <FLASH_EraseSector+0x20>
  8195. }
  8196. else if(VoltageRange == VoltageRange_2)
  8197. {
  8198. tmp_psize = FLASH_PSIZE_HALF_WORD;
  8199. 8025464: f44f 7580 mov.w r5, #256 ; 0x100
  8200. else
  8201. {
  8202. tmp_psize = FLASH_PSIZE_DOUBLE_WORD;
  8203. }
  8204. /* Wait for last operation to be completed */
  8205. status = FLASH_WaitForLastOperation();
  8206. 8025468: f7ff ffa4 bl 80253b4 <FLASH_WaitForLastOperation>
  8207. if(status == FLASH_COMPLETE)
  8208. 802546c: 2808 cmp r0, #8
  8209. 802546e: d11e bne.n 80254ae <FLASH_EraseSector+0x66>
  8210. {
  8211. /* if the previous operation is completed, proceed to erase the sector */
  8212. FLASH->CR &= CR_PSIZE_MASK;
  8213. 8025470: 4c0f ldr r4, [pc, #60] ; (80254b0 <FLASH_EraseSector+0x68>)
  8214. 8025472: 6923 ldr r3, [r4, #16]
  8215. 8025474: f423 7340 bic.w r3, r3, #768 ; 0x300
  8216. 8025478: 6123 str r3, [r4, #16]
  8217. FLASH->CR |= tmp_psize;
  8218. 802547a: 6921 ldr r1, [r4, #16]
  8219. 802547c: 430d orrs r5, r1
  8220. 802547e: 6125 str r5, [r4, #16]
  8221. FLASH->CR &= SECTOR_MASK;
  8222. 8025480: 6923 ldr r3, [r4, #16]
  8223. 8025482: f023 03f8 bic.w r3, r3, #248 ; 0xf8
  8224. 8025486: 6123 str r3, [r4, #16]
  8225. FLASH->CR |= FLASH_CR_SER | FLASH_Sector;
  8226. 8025488: 6923 ldr r3, [r4, #16]
  8227. 802548a: f043 0302 orr.w r3, r3, #2
  8228. 802548e: 431e orrs r6, r3
  8229. 8025490: 6126 str r6, [r4, #16]
  8230. FLASH->CR |= FLASH_CR_STRT;
  8231. 8025492: 6923 ldr r3, [r4, #16]
  8232. 8025494: f443 3380 orr.w r3, r3, #65536 ; 0x10000
  8233. 8025498: 6123 str r3, [r4, #16]
  8234. /* Wait for last operation to be completed */
  8235. status = FLASH_WaitForLastOperation();
  8236. 802549a: f7ff ff8b bl 80253b4 <FLASH_WaitForLastOperation>
  8237. /* if the erase operation is completed, disable the SER Bit */
  8238. FLASH->CR &= (~FLASH_CR_SER);
  8239. 802549e: 6923 ldr r3, [r4, #16]
  8240. 80254a0: f023 0302 bic.w r3, r3, #2
  8241. 80254a4: 6123 str r3, [r4, #16]
  8242. FLASH->CR &= SECTOR_MASK;
  8243. 80254a6: 6923 ldr r3, [r4, #16]
  8244. 80254a8: f023 03f8 bic.w r3, r3, #248 ; 0xf8
  8245. 80254ac: 6123 str r3, [r4, #16]
  8246. }
  8247. /* Return the Erase Status */
  8248. return status;
  8249. }
  8250. 80254ae: bd70 pop {r4, r5, r6, pc}
  8251. 80254b0: 40023c00 .word 0x40023c00
  8252. 080254b4 <GPIO_DeInit>:
  8253. * @note By default, The GPIO pins are configured in input floating mode (except JTAG pins).
  8254. * @param GPIOx: where x can be (A..I) to select the GPIO peripheral.
  8255. * @retval None
  8256. */
  8257. void GPIO_DeInit(GPIO_TypeDef* GPIOx)
  8258. {
  8259. 80254b4: b508 push {r3, lr}
  8260. /* Check the parameters */
  8261. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8262. if (GPIOx == GPIOA)
  8263. 80254b6: 4b2c ldr r3, [pc, #176] ; (8025568 <GPIO_DeInit+0xb4>)
  8264. 80254b8: 4298 cmp r0, r3
  8265. 80254ba: d105 bne.n 80254c8 <GPIO_DeInit+0x14>
  8266. {
  8267. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  8268. 80254bc: 2001 movs r0, #1
  8269. 80254be: 4601 mov r1, r0
  8270. 80254c0: f000 f974 bl 80257ac <RCC_AHB1PeriphResetCmd>
  8271. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, DISABLE);
  8272. 80254c4: 2001 movs r0, #1
  8273. 80254c6: e048 b.n 802555a <GPIO_DeInit+0xa6>
  8274. }
  8275. else if (GPIOx == GPIOB)
  8276. 80254c8: 4b28 ldr r3, [pc, #160] ; (802556c <GPIO_DeInit+0xb8>)
  8277. 80254ca: 4298 cmp r0, r3
  8278. 80254cc: d105 bne.n 80254da <GPIO_DeInit+0x26>
  8279. {
  8280. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  8281. 80254ce: 2002 movs r0, #2
  8282. 80254d0: 2101 movs r1, #1
  8283. 80254d2: f000 f96b bl 80257ac <RCC_AHB1PeriphResetCmd>
  8284. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, DISABLE);
  8285. 80254d6: 2002 movs r0, #2
  8286. 80254d8: e03f b.n 802555a <GPIO_DeInit+0xa6>
  8287. }
  8288. else if (GPIOx == GPIOC)
  8289. 80254da: 4b25 ldr r3, [pc, #148] ; (8025570 <GPIO_DeInit+0xbc>)
  8290. 80254dc: 4298 cmp r0, r3
  8291. 80254de: d105 bne.n 80254ec <GPIO_DeInit+0x38>
  8292. {
  8293. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  8294. 80254e0: 2004 movs r0, #4
  8295. 80254e2: 2101 movs r1, #1
  8296. 80254e4: f000 f962 bl 80257ac <RCC_AHB1PeriphResetCmd>
  8297. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, DISABLE);
  8298. 80254e8: 2004 movs r0, #4
  8299. 80254ea: e036 b.n 802555a <GPIO_DeInit+0xa6>
  8300. }
  8301. else if (GPIOx == GPIOD)
  8302. 80254ec: 4b21 ldr r3, [pc, #132] ; (8025574 <GPIO_DeInit+0xc0>)
  8303. 80254ee: 4298 cmp r0, r3
  8304. 80254f0: d105 bne.n 80254fe <GPIO_DeInit+0x4a>
  8305. {
  8306. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  8307. 80254f2: 2008 movs r0, #8
  8308. 80254f4: 2101 movs r1, #1
  8309. 80254f6: f000 f959 bl 80257ac <RCC_AHB1PeriphResetCmd>
  8310. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, DISABLE);
  8311. 80254fa: 2008 movs r0, #8
  8312. 80254fc: e02d b.n 802555a <GPIO_DeInit+0xa6>
  8313. }
  8314. else if (GPIOx == GPIOE)
  8315. 80254fe: 4b1e ldr r3, [pc, #120] ; (8025578 <GPIO_DeInit+0xc4>)
  8316. 8025500: 4298 cmp r0, r3
  8317. 8025502: d105 bne.n 8025510 <GPIO_DeInit+0x5c>
  8318. {
  8319. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  8320. 8025504: 2010 movs r0, #16
  8321. 8025506: 2101 movs r1, #1
  8322. 8025508: f000 f950 bl 80257ac <RCC_AHB1PeriphResetCmd>
  8323. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE, DISABLE);
  8324. 802550c: 2010 movs r0, #16
  8325. 802550e: e024 b.n 802555a <GPIO_DeInit+0xa6>
  8326. }
  8327. else if (GPIOx == GPIOF)
  8328. 8025510: 4b1a ldr r3, [pc, #104] ; (802557c <GPIO_DeInit+0xc8>)
  8329. 8025512: 4298 cmp r0, r3
  8330. 8025514: d105 bne.n 8025522 <GPIO_DeInit+0x6e>
  8331. {
  8332. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOF, ENABLE);
  8333. 8025516: 2020 movs r0, #32
  8334. 8025518: 2101 movs r1, #1
  8335. 802551a: f000 f947 bl 80257ac <RCC_AHB1PeriphResetCmd>
  8336. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOF, DISABLE);
  8337. 802551e: 2020 movs r0, #32
  8338. 8025520: e01b b.n 802555a <GPIO_DeInit+0xa6>
  8339. }
  8340. else if (GPIOx == GPIOG)
  8341. 8025522: 4b17 ldr r3, [pc, #92] ; (8025580 <GPIO_DeInit+0xcc>)
  8342. 8025524: 4298 cmp r0, r3
  8343. 8025526: d105 bne.n 8025534 <GPIO_DeInit+0x80>
  8344. {
  8345. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOG, ENABLE);
  8346. 8025528: 2040 movs r0, #64 ; 0x40
  8347. 802552a: 2101 movs r1, #1
  8348. 802552c: f000 f93e bl 80257ac <RCC_AHB1PeriphResetCmd>
  8349. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOG, DISABLE);
  8350. 8025530: 2040 movs r0, #64 ; 0x40
  8351. 8025532: e012 b.n 802555a <GPIO_DeInit+0xa6>
  8352. }
  8353. else if (GPIOx == GPIOH)
  8354. 8025534: 4b13 ldr r3, [pc, #76] ; (8025584 <GPIO_DeInit+0xd0>)
  8355. 8025536: 4298 cmp r0, r3
  8356. 8025538: d105 bne.n 8025546 <GPIO_DeInit+0x92>
  8357. {
  8358. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOH, ENABLE);
  8359. 802553a: 2080 movs r0, #128 ; 0x80
  8360. 802553c: 2101 movs r1, #1
  8361. 802553e: f000 f935 bl 80257ac <RCC_AHB1PeriphResetCmd>
  8362. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOH, DISABLE);
  8363. 8025542: 2080 movs r0, #128 ; 0x80
  8364. 8025544: e009 b.n 802555a <GPIO_DeInit+0xa6>
  8365. }
  8366. else
  8367. {
  8368. if (GPIOx == GPIOI)
  8369. 8025546: 4b10 ldr r3, [pc, #64] ; (8025588 <GPIO_DeInit+0xd4>)
  8370. 8025548: 4298 cmp r0, r3
  8371. 802554a: d10b bne.n 8025564 <GPIO_DeInit+0xb0>
  8372. {
  8373. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, ENABLE);
  8374. 802554c: f44f 7080 mov.w r0, #256 ; 0x100
  8375. 8025550: 2101 movs r1, #1
  8376. 8025552: f000 f92b bl 80257ac <RCC_AHB1PeriphResetCmd>
  8377. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, DISABLE);
  8378. 8025556: f44f 7080 mov.w r0, #256 ; 0x100
  8379. 802555a: 2100 movs r1, #0
  8380. }
  8381. }
  8382. }
  8383. 802555c: e8bd 4008 ldmia.w sp!, {r3, lr}
  8384. else
  8385. {
  8386. if (GPIOx == GPIOI)
  8387. {
  8388. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, ENABLE);
  8389. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, DISABLE);
  8390. 8025560: f000 b924 b.w 80257ac <RCC_AHB1PeriphResetCmd>
  8391. 8025564: bd08 pop {r3, pc}
  8392. 8025566: bf00 nop
  8393. 8025568: 40020000 .word 0x40020000
  8394. 802556c: 40020400 .word 0x40020400
  8395. 8025570: 40020800 .word 0x40020800
  8396. 8025574: 40020c00 .word 0x40020c00
  8397. 8025578: 40021000 .word 0x40021000
  8398. 802557c: 40021400 .word 0x40021400
  8399. 8025580: 40021800 .word 0x40021800
  8400. 8025584: 40021c00 .word 0x40021c00
  8401. 8025588: 40022000 .word 0x40022000
  8402. 0802558c <GPIO_Init>:
  8403. * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
  8404. * the configuration information for the specified GPIO peripheral.
  8405. * @retval None
  8406. */
  8407. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  8408. {
  8409. 802558c: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  8410. /*-- GPIO Mode Configuration --*/
  8411. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8412. {
  8413. pos = ((uint32_t)0x01) << pinpos;
  8414. /* Get the port pins position */
  8415. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8416. 8025590: 680f ldr r7, [r1, #0]
  8417. assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  8418. assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));
  8419. /* -------------------------Configure the port pins---------------- */
  8420. /*-- GPIO Mode Configuration --*/
  8421. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8422. 8025592: 2300 movs r3, #0
  8423. {
  8424. pos = ((uint32_t)0x01) << pinpos;
  8425. 8025594: f04f 0c01 mov.w ip, #1
  8426. /* Get the port pins position */
  8427. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8428. if (currentpin == pos)
  8429. {
  8430. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8431. 8025598: f04f 0803 mov.w r8, #3
  8432. /* -------------------------Configure the port pins---------------- */
  8433. /*-- GPIO Mode Configuration --*/
  8434. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8435. {
  8436. pos = ((uint32_t)0x01) << pinpos;
  8437. 802559c: fa0c f203 lsl.w r2, ip, r3
  8438. /* Get the port pins position */
  8439. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8440. 80255a0: ea02 0507 and.w r5, r2, r7
  8441. if (currentpin == pos)
  8442. 80255a4: 4295 cmp r5, r2
  8443. 80255a6: d131 bne.n 802560c <GPIO_Init+0x80>
  8444. * @param GPIOx: where x can be (A..I) to select the GPIO peripheral.
  8445. * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
  8446. * the configuration information for the specified GPIO peripheral.
  8447. * @retval None
  8448. */
  8449. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  8450. 80255a8: 005a lsls r2, r3, #1
  8451. /* Get the port pins position */
  8452. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8453. if (currentpin == pos)
  8454. {
  8455. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8456. 80255aa: 6806 ldr r6, [r0, #0]
  8457. 80255ac: fa08 f402 lsl.w r4, r8, r2
  8458. 80255b0: 43e4 mvns r4, r4
  8459. 80255b2: 4026 ands r6, r4
  8460. 80255b4: 6006 str r6, [r0, #0]
  8461. GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));
  8462. 80255b6: 790e ldrb r6, [r1, #4]
  8463. 80255b8: f8d0 9000 ldr.w r9, [r0]
  8464. 80255bc: fa06 fa02 lsl.w sl, r6, r2
  8465. if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
  8466. 80255c0: 3e01 subs r6, #1
  8467. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8468. if (currentpin == pos)
  8469. {
  8470. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8471. GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));
  8472. 80255c2: ea4a 0909 orr.w r9, sl, r9
  8473. if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
  8474. 80255c6: 2e01 cmp r6, #1
  8475. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8476. if (currentpin == pos)
  8477. {
  8478. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8479. GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));
  8480. 80255c8: f8c0 9000 str.w r9, [r0]
  8481. if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
  8482. 80255cc: d815 bhi.n 80255fa <GPIO_Init+0x6e>
  8483. {
  8484. /* Check Speed mode parameters */
  8485. assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
  8486. /* Speed mode configuration */
  8487. GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));
  8488. 80255ce: 6886 ldr r6, [r0, #8]
  8489. GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2));
  8490. 80255d0: f891 9005 ldrb.w r9, [r1, #5]
  8491. {
  8492. /* Check Speed mode parameters */
  8493. assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
  8494. /* Speed mode configuration */
  8495. GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));
  8496. 80255d4: 4026 ands r6, r4
  8497. 80255d6: 6086 str r6, [r0, #8]
  8498. GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2));
  8499. 80255d8: 6886 ldr r6, [r0, #8]
  8500. 80255da: fa09 f902 lsl.w r9, r9, r2
  8501. 80255de: ea49 0606 orr.w r6, r9, r6
  8502. 80255e2: 6086 str r6, [r0, #8]
  8503. /* Check Output mode parameters */
  8504. assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType));
  8505. /* Output mode configuration*/
  8506. GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)) ;
  8507. 80255e4: 6846 ldr r6, [r0, #4]
  8508. 80255e6: ea26 0505 bic.w r5, r6, r5
  8509. 80255ea: 6045 str r5, [r0, #4]
  8510. GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos));
  8511. 80255ec: 798d ldrb r5, [r1, #6]
  8512. 80255ee: 6846 ldr r6, [r0, #4]
  8513. 80255f0: fa05 f503 lsl.w r5, r5, r3
  8514. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8515. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8516. temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  8517. GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
  8518. }
  8519. 80255f4: b2ad uxth r5, r5
  8520. /* Check Output mode parameters */
  8521. assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType));
  8522. /* Output mode configuration*/
  8523. GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)) ;
  8524. GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos));
  8525. 80255f6: 4335 orrs r5, r6
  8526. 80255f8: 6045 str r5, [r0, #4]
  8527. }
  8528. /* Pull-up Pull down resistor configuration*/
  8529. GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2));
  8530. 80255fa: 68c5 ldr r5, [r0, #12]
  8531. 80255fc: 402c ands r4, r5
  8532. 80255fe: 60c4 str r4, [r0, #12]
  8533. GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2));
  8534. 8025600: 79cd ldrb r5, [r1, #7]
  8535. 8025602: 68c4 ldr r4, [r0, #12]
  8536. 8025604: fa05 f202 lsl.w r2, r5, r2
  8537. 8025608: 4322 orrs r2, r4
  8538. 802560a: 60c2 str r2, [r0, #12]
  8539. assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  8540. assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));
  8541. /* -------------------------Configure the port pins---------------- */
  8542. /*-- GPIO Mode Configuration --*/
  8543. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8544. 802560c: 3301 adds r3, #1
  8545. 802560e: 2b10 cmp r3, #16
  8546. 8025610: d1c4 bne.n 802559c <GPIO_Init+0x10>
  8547. /* Pull-up Pull down resistor configuration*/
  8548. GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2));
  8549. GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2));
  8550. }
  8551. }
  8552. }
  8553. 8025612: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  8554. 08025616 <GPIO_SetBits>:
  8555. {
  8556. /* Check the parameters */
  8557. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8558. assert_param(IS_GPIO_PIN(GPIO_Pin));
  8559. GPIOx->BSRRL = GPIO_Pin;
  8560. 8025616: 8301 strh r1, [r0, #24]
  8561. 8025618: 4770 bx lr
  8562. 0802561a <GPIO_ResetBits>:
  8563. {
  8564. /* Check the parameters */
  8565. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8566. assert_param(IS_GPIO_PIN(GPIO_Pin));
  8567. GPIOx->BSRRH = GPIO_Pin;
  8568. 802561a: 8341 strh r1, [r0, #26]
  8569. 802561c: 4770 bx lr
  8570. 0802561e <GPIO_PinAFConfig>:
  8571. /* Check the parameters */
  8572. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8573. assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  8574. assert_param(IS_GPIO_AF(GPIO_AF));
  8575. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8576. 802561e: f001 0307 and.w r3, r1, #7
  8577. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8578. 8025622: 08c9 lsrs r1, r1, #3
  8579. 8025624: 3108 adds r1, #8
  8580. * @arg GPIO_AF_DCMI: Connect DCMI pins to AF13
  8581. * @arg GPIO_AF_EVENTOUT: Connect EVENTOUT pins to AF15
  8582. * @retval None
  8583. */
  8584. void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
  8585. {
  8586. 8025626: b530 push {r4, r5, lr}
  8587. /* Check the parameters */
  8588. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8589. assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  8590. assert_param(IS_GPIO_AF(GPIO_AF));
  8591. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8592. 8025628: 009b lsls r3, r3, #2
  8593. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8594. 802562a: f850 5021 ldr.w r5, [r0, r1, lsl #2]
  8595. 802562e: 240f movs r4, #15
  8596. 8025630: fa04 f403 lsl.w r4, r4, r3
  8597. 8025634: ea25 0404 bic.w r4, r5, r4
  8598. 8025638: f840 4021 str.w r4, [r0, r1, lsl #2]
  8599. temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  8600. 802563c: f850 4021 ldr.w r4, [r0, r1, lsl #2]
  8601. /* Check the parameters */
  8602. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8603. assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  8604. assert_param(IS_GPIO_AF(GPIO_AF));
  8605. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8606. 8025640: fa02 f203 lsl.w r2, r2, r3
  8607. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8608. temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  8609. 8025644: 4314 orrs r4, r2
  8610. GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
  8611. 8025646: f840 4021 str.w r4, [r0, r1, lsl #2]
  8612. 802564a: bd30 pop {r4, r5, pc}
  8613. 0802564c <PWR_BackupAccessCmd>:
  8614. void PWR_BackupAccessCmd(FunctionalState NewState)
  8615. {
  8616. /* Check the parameters */
  8617. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8618. *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState;
  8619. 802564c: 4b01 ldr r3, [pc, #4] ; (8025654 <PWR_BackupAccessCmd+0x8>)
  8620. 802564e: 6018 str r0, [r3, #0]
  8621. 8025650: 4770 bx lr
  8622. 8025652: bf00 nop
  8623. 8025654: 420e0020 .word 0x420e0020
  8624. 08025658 <RCC_LSEConfig>:
  8625. /* Check the parameters */
  8626. assert_param(IS_RCC_LSE(RCC_LSE));
  8627. /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/
  8628. /* Reset LSEON bit */
  8629. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8630. 8025658: 4b06 ldr r3, [pc, #24] ; (8025674 <RCC_LSEConfig+0x1c>)
  8631. 802565a: 2200 movs r2, #0
  8632. /* Reset LSEBYP bit */
  8633. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8634. /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */
  8635. switch (RCC_LSE)
  8636. 802565c: 2801 cmp r0, #1
  8637. /* Check the parameters */
  8638. assert_param(IS_RCC_LSE(RCC_LSE));
  8639. /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/
  8640. /* Reset LSEON bit */
  8641. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8642. 802565e: 701a strb r2, [r3, #0]
  8643. /* Reset LSEBYP bit */
  8644. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8645. 8025660: 701a strb r2, [r3, #0]
  8646. /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */
  8647. switch (RCC_LSE)
  8648. 8025662: d002 beq.n 802566a <RCC_LSEConfig+0x12>
  8649. 8025664: 2804 cmp r0, #4
  8650. 8025666: d104 bne.n 8025672 <RCC_LSEConfig+0x1a>
  8651. 8025668: e001 b.n 802566e <RCC_LSEConfig+0x16>
  8652. {
  8653. case RCC_LSE_ON:
  8654. /* Set LSEON bit */
  8655. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_ON;
  8656. 802566a: 7018 strb r0, [r3, #0]
  8657. break;
  8658. 802566c: 4770 bx lr
  8659. case RCC_LSE_Bypass:
  8660. /* Set LSEBYP and LSEON bits */
  8661. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON;
  8662. 802566e: 2205 movs r2, #5
  8663. 8025670: 701a strb r2, [r3, #0]
  8664. 8025672: 4770 bx lr
  8665. 8025674: 40023870 .word 0x40023870
  8666. 08025678 <RCC_LSICmd>:
  8667. void RCC_LSICmd(FunctionalState NewState)
  8668. {
  8669. /* Check the parameters */
  8670. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8671. *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState;
  8672. 8025678: 4b01 ldr r3, [pc, #4] ; (8025680 <RCC_LSICmd+0x8>)
  8673. 802567a: 6018 str r0, [r3, #0]
  8674. 802567c: 4770 bx lr
  8675. 802567e: bf00 nop
  8676. 8025680: 42470e80 .word 0x42470e80
  8677. 08025684 <RCC_GetClocksFreq>:
  8678. void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
  8679. {
  8680. uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
  8681. /* Get SYSCLK source -------------------------------------------------------*/
  8682. tmp = RCC->CFGR & RCC_CFGR_SWS;
  8683. 8025684: 4b1e ldr r3, [pc, #120] ; (8025700 <RCC_GetClocksFreq+0x7c>)
  8684. 8025686: 689a ldr r2, [r3, #8]
  8685. 8025688: f002 020c and.w r2, r2, #12
  8686. switch (tmp)
  8687. 802568c: 2a04 cmp r2, #4
  8688. * configuration based on this function will be incorrect.
  8689. *
  8690. * @retval None
  8691. */
  8692. void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
  8693. {
  8694. 802568e: b510 push {r4, lr}
  8695. uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
  8696. /* Get SYSCLK source -------------------------------------------------------*/
  8697. tmp = RCC->CFGR & RCC_CFGR_SWS;
  8698. switch (tmp)
  8699. 8025690: d003 beq.n 802569a <RCC_GetClocksFreq+0x16>
  8700. 8025692: 2a08 cmp r2, #8
  8701. 8025694: d003 beq.n 802569e <RCC_GetClocksFreq+0x1a>
  8702. 8025696: 4b1b ldr r3, [pc, #108] ; (8025704 <RCC_GetClocksFreq+0x80>)
  8703. 8025698: e018 b.n 80256cc <RCC_GetClocksFreq+0x48>
  8704. {
  8705. case 0x00: /* HSI used as system clock source */
  8706. RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
  8707. break;
  8708. case 0x04: /* HSE used as system clock source */
  8709. RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
  8710. 802569a: 4b1b ldr r3, [pc, #108] ; (8025708 <RCC_GetClocksFreq+0x84>)
  8711. 802569c: e016 b.n 80256cc <RCC_GetClocksFreq+0x48>
  8712. case 0x08: /* PLL used as system clock source */
  8713. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  8714. SYSCLK = PLL_VCO / PLLP
  8715. */
  8716. pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
  8717. 802569e: 6859 ldr r1, [r3, #4]
  8718. pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
  8719. 80256a0: 685a ldr r2, [r3, #4]
  8720. if (pllsource != 0)
  8721. 80256a2: f411 0f80 tst.w r1, #4194304 ; 0x400000
  8722. {
  8723. /* HSE used as PLL clock source */
  8724. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8725. 80256a6: 6859 ldr r1, [r3, #4]
  8726. 80256a8: bf14 ite ne
  8727. 80256aa: 4b17 ldrne r3, [pc, #92] ; (8025708 <RCC_GetClocksFreq+0x84>)
  8728. }
  8729. else
  8730. {
  8731. /* HSI used as PLL clock source */
  8732. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8733. 80256ac: 4b15 ldreq r3, [pc, #84] ; (8025704 <RCC_GetClocksFreq+0x80>)
  8734. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  8735. SYSCLK = PLL_VCO / PLLP
  8736. */
  8737. pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
  8738. pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
  8739. 80256ae: f002 023f and.w r2, r2, #63 ; 0x3f
  8740. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8741. }
  8742. else
  8743. {
  8744. /* HSI used as PLL clock source */
  8745. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8746. 80256b2: fbb3 f3f2 udiv r3, r3, r2
  8747. }
  8748. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8749. 80256b6: 4a12 ldr r2, [pc, #72] ; (8025700 <RCC_GetClocksFreq+0x7c>)
  8750. 80256b8: 6852 ldr r2, [r2, #4]
  8751. 80256ba: f3c2 4201 ubfx r2, r2, #16, #2
  8752. pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
  8753. if (pllsource != 0)
  8754. {
  8755. /* HSE used as PLL clock source */
  8756. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8757. 80256be: f3c1 1188 ubfx r1, r1, #6, #9
  8758. {
  8759. /* HSI used as PLL clock source */
  8760. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8761. }
  8762. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8763. 80256c2: 3201 adds r2, #1
  8764. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8765. }
  8766. else
  8767. {
  8768. /* HSI used as PLL clock source */
  8769. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8770. 80256c4: 434b muls r3, r1
  8771. }
  8772. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8773. 80256c6: 0052 lsls r2, r2, #1
  8774. RCC_Clocks->SYSCLK_Frequency = pllvco/pllp;
  8775. 80256c8: fbb3 f3f2 udiv r3, r3, r2
  8776. break;
  8777. }
  8778. /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
  8779. /* Get HCLK prescaler */
  8780. tmp = RCC->CFGR & RCC_CFGR_HPRE;
  8781. 80256cc: 490c ldr r1, [pc, #48] ; (8025700 <RCC_GetClocksFreq+0x7c>)
  8782. /* HSI used as PLL clock source */
  8783. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8784. }
  8785. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8786. RCC_Clocks->SYSCLK_Frequency = pllvco/pllp;
  8787. 80256ce: 6003 str r3, [r0, #0]
  8788. break;
  8789. }
  8790. /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
  8791. /* Get HCLK prescaler */
  8792. tmp = RCC->CFGR & RCC_CFGR_HPRE;
  8793. 80256d0: 688b ldr r3, [r1, #8]
  8794. tmp = tmp >> 4;
  8795. presc = APBAHBPrescTable[tmp];
  8796. 80256d2: 4a0e ldr r2, [pc, #56] ; (802570c <RCC_GetClocksFreq+0x88>)
  8797. }
  8798. /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
  8799. /* Get HCLK prescaler */
  8800. tmp = RCC->CFGR & RCC_CFGR_HPRE;
  8801. tmp = tmp >> 4;
  8802. 80256d4: f3c3 1303 ubfx r3, r3, #4, #4
  8803. presc = APBAHBPrescTable[tmp];
  8804. 80256d8: 5cd4 ldrb r4, [r2, r3]
  8805. /* HCLK clock frequency */
  8806. RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;
  8807. 80256da: 6803 ldr r3, [r0, #0]
  8808. 80256dc: fa23 f304 lsr.w r3, r3, r4
  8809. 80256e0: 6043 str r3, [r0, #4]
  8810. /* Get PCLK1 prescaler */
  8811. tmp = RCC->CFGR & RCC_CFGR_PPRE1;
  8812. 80256e2: 688c ldr r4, [r1, #8]
  8813. tmp = tmp >> 10;
  8814. 80256e4: f3c4 2482 ubfx r4, r4, #10, #3
  8815. presc = APBAHBPrescTable[tmp];
  8816. 80256e8: 5d14 ldrb r4, [r2, r4]
  8817. /* PCLK1 clock frequency */
  8818. RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  8819. 80256ea: fa23 f404 lsr.w r4, r3, r4
  8820. 80256ee: 6084 str r4, [r0, #8]
  8821. /* Get PCLK2 prescaler */
  8822. tmp = RCC->CFGR & RCC_CFGR_PPRE2;
  8823. 80256f0: 6889 ldr r1, [r1, #8]
  8824. tmp = tmp >> 13;
  8825. 80256f2: f3c1 3142 ubfx r1, r1, #13, #3
  8826. presc = APBAHBPrescTable[tmp];
  8827. 80256f6: 5c52 ldrb r2, [r2, r1]
  8828. /* PCLK2 clock frequency */
  8829. RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  8830. 80256f8: fa23 f302 lsr.w r3, r3, r2
  8831. 80256fc: 60c3 str r3, [r0, #12]
  8832. 80256fe: bd10 pop {r4, pc}
  8833. 8025700: 40023800 .word 0x40023800
  8834. 8025704: 00f42400 .word 0x00f42400
  8835. 8025708: 017d7840 .word 0x017d7840
  8836. 802570c: 200005ac .word 0x200005ac
  8837. 08025710 <RCC_RTCCLKConfig>:
  8838. uint32_t tmpreg = 0;
  8839. /* Check the parameters */
  8840. assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));
  8841. if ((RCC_RTCCLKSource & 0x00000300) == 0x00000300)
  8842. 8025710: f400 7340 and.w r3, r0, #768 ; 0x300
  8843. 8025714: f5b3 7f40 cmp.w r3, #768 ; 0x300
  8844. 8025718: 4b08 ldr r3, [pc, #32] ; (802573c <RCC_RTCCLKConfig+0x2c>)
  8845. 802571a: d108 bne.n 802572e <RCC_RTCCLKConfig+0x1e>
  8846. { /* If HSE is selected as RTC clock source, configure HSE division factor for RTC clock */
  8847. tmpreg = RCC->CFGR;
  8848. 802571c: 6899 ldr r1, [r3, #8]
  8849. /* Clear RTCPRE[4:0] bits */
  8850. tmpreg &= ~RCC_CFGR_RTCPRE;
  8851. /* Configure HSE division factor for RTC clock */
  8852. tmpreg |= (RCC_RTCCLKSource & 0xFFFFCFF);
  8853. 802571e: f020 4270 bic.w r2, r0, #4026531840 ; 0xf0000000
  8854. if ((RCC_RTCCLKSource & 0x00000300) == 0x00000300)
  8855. { /* If HSE is selected as RTC clock source, configure HSE division factor for RTC clock */
  8856. tmpreg = RCC->CFGR;
  8857. /* Clear RTCPRE[4:0] bits */
  8858. tmpreg &= ~RCC_CFGR_RTCPRE;
  8859. 8025722: f421 11f8 bic.w r1, r1, #2031616 ; 0x1f0000
  8860. /* Configure HSE division factor for RTC clock */
  8861. tmpreg |= (RCC_RTCCLKSource & 0xFFFFCFF);
  8862. 8025726: f422 7240 bic.w r2, r2, #768 ; 0x300
  8863. 802572a: 430a orrs r2, r1
  8864. /* Store the new value */
  8865. RCC->CFGR = tmpreg;
  8866. 802572c: 609a str r2, [r3, #8]
  8867. }
  8868. /* Select the RTC clock source */
  8869. RCC->BDCR |= (RCC_RTCCLKSource & 0x00000FFF);
  8870. 802572e: 6f1a ldr r2, [r3, #112] ; 0x70
  8871. 8025730: 0500 lsls r0, r0, #20
  8872. 8025732: ea42 5010 orr.w r0, r2, r0, lsr #20
  8873. 8025736: 6718 str r0, [r3, #112] ; 0x70
  8874. 8025738: 4770 bx lr
  8875. 802573a: bf00 nop
  8876. 802573c: 40023800 .word 0x40023800
  8877. 08025740 <RCC_RTCCLKCmd>:
  8878. void RCC_RTCCLKCmd(FunctionalState NewState)
  8879. {
  8880. /* Check the parameters */
  8881. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8882. *(__IO uint32_t *) BDCR_RTCEN_BB = (uint32_t)NewState;
  8883. 8025740: 4b01 ldr r3, [pc, #4] ; (8025748 <RCC_RTCCLKCmd+0x8>)
  8884. 8025742: 6018 str r0, [r3, #0]
  8885. 8025744: 4770 bx lr
  8886. 8025746: bf00 nop
  8887. 8025748: 42470e3c .word 0x42470e3c
  8888. 0802574c <RCC_AHB1PeriphClockCmd>:
  8889. * @param NewState: new state of the specified peripheral clock.
  8890. * This parameter can be: ENABLE or DISABLE.
  8891. * @retval None
  8892. */
  8893. void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
  8894. {
  8895. 802574c: 4b04 ldr r3, [pc, #16] ; (8025760 <RCC_AHB1PeriphClockCmd+0x14>)
  8896. assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
  8897. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8898. if (NewState != DISABLE)
  8899. {
  8900. RCC->AHB1ENR |= RCC_AHB1Periph;
  8901. 802574e: 6b1a ldr r2, [r3, #48] ; 0x30
  8902. {
  8903. /* Check the parameters */
  8904. assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
  8905. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8906. if (NewState != DISABLE)
  8907. 8025750: b109 cbz r1, 8025756 <RCC_AHB1PeriphClockCmd+0xa>
  8908. {
  8909. RCC->AHB1ENR |= RCC_AHB1Periph;
  8910. 8025752: 4310 orrs r0, r2
  8911. 8025754: e001 b.n 802575a <RCC_AHB1PeriphClockCmd+0xe>
  8912. }
  8913. else
  8914. {
  8915. RCC->AHB1ENR &= ~RCC_AHB1Periph;
  8916. 8025756: ea22 0000 bic.w r0, r2, r0
  8917. 802575a: 6318 str r0, [r3, #48] ; 0x30
  8918. 802575c: 4770 bx lr
  8919. 802575e: bf00 nop
  8920. 8025760: 40023800 .word 0x40023800
  8921. 08025764 <RCC_AHB2PeriphClockCmd>:
  8922. * @param NewState: new state of the specified peripheral clock.
  8923. * This parameter can be: ENABLE or DISABLE.
  8924. * @retval None
  8925. */
  8926. void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState)
  8927. {
  8928. 8025764: 4b04 ldr r3, [pc, #16] ; (8025778 <RCC_AHB2PeriphClockCmd+0x14>)
  8929. assert_param(IS_RCC_AHB2_PERIPH(RCC_AHB2Periph));
  8930. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8931. if (NewState != DISABLE)
  8932. {
  8933. RCC->AHB2ENR |= RCC_AHB2Periph;
  8934. 8025766: 6b5a ldr r2, [r3, #52] ; 0x34
  8935. {
  8936. /* Check the parameters */
  8937. assert_param(IS_RCC_AHB2_PERIPH(RCC_AHB2Periph));
  8938. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8939. if (NewState != DISABLE)
  8940. 8025768: b109 cbz r1, 802576e <RCC_AHB2PeriphClockCmd+0xa>
  8941. {
  8942. RCC->AHB2ENR |= RCC_AHB2Periph;
  8943. 802576a: 4310 orrs r0, r2
  8944. 802576c: e001 b.n 8025772 <RCC_AHB2PeriphClockCmd+0xe>
  8945. }
  8946. else
  8947. {
  8948. RCC->AHB2ENR &= ~RCC_AHB2Periph;
  8949. 802576e: ea22 0000 bic.w r0, r2, r0
  8950. 8025772: 6358 str r0, [r3, #52] ; 0x34
  8951. 8025774: 4770 bx lr
  8952. 8025776: bf00 nop
  8953. 8025778: 40023800 .word 0x40023800
  8954. 0802577c <RCC_APB1PeriphClockCmd>:
  8955. * @param NewState: new state of the specified peripheral clock.
  8956. * This parameter can be: ENABLE or DISABLE.
  8957. * @retval None
  8958. */
  8959. void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  8960. {
  8961. 802577c: 4b04 ldr r3, [pc, #16] ; (8025790 <RCC_APB1PeriphClockCmd+0x14>)
  8962. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  8963. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8964. if (NewState != DISABLE)
  8965. {
  8966. RCC->APB1ENR |= RCC_APB1Periph;
  8967. 802577e: 6c1a ldr r2, [r3, #64] ; 0x40
  8968. {
  8969. /* Check the parameters */
  8970. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  8971. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8972. if (NewState != DISABLE)
  8973. 8025780: b109 cbz r1, 8025786 <RCC_APB1PeriphClockCmd+0xa>
  8974. {
  8975. RCC->APB1ENR |= RCC_APB1Periph;
  8976. 8025782: 4310 orrs r0, r2
  8977. 8025784: e001 b.n 802578a <RCC_APB1PeriphClockCmd+0xe>
  8978. }
  8979. else
  8980. {
  8981. RCC->APB1ENR &= ~RCC_APB1Periph;
  8982. 8025786: ea22 0000 bic.w r0, r2, r0
  8983. 802578a: 6418 str r0, [r3, #64] ; 0x40
  8984. 802578c: 4770 bx lr
  8985. 802578e: bf00 nop
  8986. 8025790: 40023800 .word 0x40023800
  8987. 08025794 <RCC_APB2PeriphClockCmd>:
  8988. * @param NewState: new state of the specified peripheral clock.
  8989. * This parameter can be: ENABLE or DISABLE.
  8990. * @retval None
  8991. */
  8992. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  8993. {
  8994. 8025794: 4b04 ldr r3, [pc, #16] ; (80257a8 <RCC_APB2PeriphClockCmd+0x14>)
  8995. assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  8996. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8997. if (NewState != DISABLE)
  8998. {
  8999. RCC->APB2ENR |= RCC_APB2Periph;
  9000. 8025796: 6c5a ldr r2, [r3, #68] ; 0x44
  9001. {
  9002. /* Check the parameters */
  9003. assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  9004. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9005. if (NewState != DISABLE)
  9006. 8025798: b109 cbz r1, 802579e <RCC_APB2PeriphClockCmd+0xa>
  9007. {
  9008. RCC->APB2ENR |= RCC_APB2Periph;
  9009. 802579a: 4310 orrs r0, r2
  9010. 802579c: e001 b.n 80257a2 <RCC_APB2PeriphClockCmd+0xe>
  9011. }
  9012. else
  9013. {
  9014. RCC->APB2ENR &= ~RCC_APB2Periph;
  9015. 802579e: ea22 0000 bic.w r0, r2, r0
  9016. 80257a2: 6458 str r0, [r3, #68] ; 0x44
  9017. 80257a4: 4770 bx lr
  9018. 80257a6: bf00 nop
  9019. 80257a8: 40023800 .word 0x40023800
  9020. 080257ac <RCC_AHB1PeriphResetCmd>:
  9021. * @param NewState: new state of the specified peripheral reset.
  9022. * This parameter can be: ENABLE or DISABLE.
  9023. * @retval None
  9024. */
  9025. void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
  9026. {
  9027. 80257ac: 4b04 ldr r3, [pc, #16] ; (80257c0 <RCC_AHB1PeriphResetCmd+0x14>)
  9028. assert_param(IS_RCC_AHB1_RESET_PERIPH(RCC_AHB1Periph));
  9029. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9030. if (NewState != DISABLE)
  9031. {
  9032. RCC->AHB1RSTR |= RCC_AHB1Periph;
  9033. 80257ae: 691a ldr r2, [r3, #16]
  9034. {
  9035. /* Check the parameters */
  9036. assert_param(IS_RCC_AHB1_RESET_PERIPH(RCC_AHB1Periph));
  9037. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9038. if (NewState != DISABLE)
  9039. 80257b0: b109 cbz r1, 80257b6 <RCC_AHB1PeriphResetCmd+0xa>
  9040. {
  9041. RCC->AHB1RSTR |= RCC_AHB1Periph;
  9042. 80257b2: 4310 orrs r0, r2
  9043. 80257b4: e001 b.n 80257ba <RCC_AHB1PeriphResetCmd+0xe>
  9044. }
  9045. else
  9046. {
  9047. RCC->AHB1RSTR &= ~RCC_AHB1Periph;
  9048. 80257b6: ea22 0000 bic.w r0, r2, r0
  9049. 80257ba: 6118 str r0, [r3, #16]
  9050. 80257bc: 4770 bx lr
  9051. 80257be: bf00 nop
  9052. 80257c0: 40023800 .word 0x40023800
  9053. 080257c4 <RCC_APB1PeriphResetCmd>:
  9054. * @param NewState: new state of the specified peripheral reset.
  9055. * This parameter can be: ENABLE or DISABLE.
  9056. * @retval None
  9057. */
  9058. void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  9059. {
  9060. 80257c4: 4b04 ldr r3, [pc, #16] ; (80257d8 <RCC_APB1PeriphResetCmd+0x14>)
  9061. /* Check the parameters */
  9062. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  9063. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9064. if (NewState != DISABLE)
  9065. {
  9066. RCC->APB1RSTR |= RCC_APB1Periph;
  9067. 80257c6: 6a1a ldr r2, [r3, #32]
  9068. void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  9069. {
  9070. /* Check the parameters */
  9071. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  9072. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9073. if (NewState != DISABLE)
  9074. 80257c8: b109 cbz r1, 80257ce <RCC_APB1PeriphResetCmd+0xa>
  9075. {
  9076. RCC->APB1RSTR |= RCC_APB1Periph;
  9077. 80257ca: 4310 orrs r0, r2
  9078. 80257cc: e001 b.n 80257d2 <RCC_APB1PeriphResetCmd+0xe>
  9079. }
  9080. else
  9081. {
  9082. RCC->APB1RSTR &= ~RCC_APB1Periph;
  9083. 80257ce: ea22 0000 bic.w r0, r2, r0
  9084. 80257d2: 6218 str r0, [r3, #32]
  9085. 80257d4: 4770 bx lr
  9086. 80257d6: bf00 nop
  9087. 80257d8: 40023800 .word 0x40023800
  9088. 080257dc <RCC_APB2PeriphResetCmd>:
  9089. * @param NewState: new state of the specified peripheral reset.
  9090. * This parameter can be: ENABLE or DISABLE.
  9091. * @retval None
  9092. */
  9093. void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  9094. {
  9095. 80257dc: 4b04 ldr r3, [pc, #16] ; (80257f0 <RCC_APB2PeriphResetCmd+0x14>)
  9096. /* Check the parameters */
  9097. assert_param(IS_RCC_APB2_RESET_PERIPH(RCC_APB2Periph));
  9098. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9099. if (NewState != DISABLE)
  9100. {
  9101. RCC->APB2RSTR |= RCC_APB2Periph;
  9102. 80257de: 6a5a ldr r2, [r3, #36] ; 0x24
  9103. void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  9104. {
  9105. /* Check the parameters */
  9106. assert_param(IS_RCC_APB2_RESET_PERIPH(RCC_APB2Periph));
  9107. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9108. if (NewState != DISABLE)
  9109. 80257e0: b109 cbz r1, 80257e6 <RCC_APB2PeriphResetCmd+0xa>
  9110. {
  9111. RCC->APB2RSTR |= RCC_APB2Periph;
  9112. 80257e2: 4310 orrs r0, r2
  9113. 80257e4: e001 b.n 80257ea <RCC_APB2PeriphResetCmd+0xe>
  9114. }
  9115. else
  9116. {
  9117. RCC->APB2RSTR &= ~RCC_APB2Periph;
  9118. 80257e6: ea22 0000 bic.w r0, r2, r0
  9119. 80257ea: 6258 str r0, [r3, #36] ; 0x24
  9120. 80257ec: 4770 bx lr
  9121. 80257ee: bf00 nop
  9122. 80257f0: 40023800 .word 0x40023800
  9123. 080257f4 <RCC_GetFlagStatus>:
  9124. /* Check the parameters */
  9125. assert_param(IS_RCC_FLAG(RCC_FLAG));
  9126. /* Get the RCC register index */
  9127. tmp = RCC_FLAG >> 5;
  9128. 80257f4: 0943 lsrs r3, r0, #5
  9129. if (tmp == 1) /* The flag to check is in CR register */
  9130. 80257f6: 2b01 cmp r3, #1
  9131. 80257f8: 4a07 ldr r2, [pc, #28] ; (8025818 <RCC_GetFlagStatus+0x24>)
  9132. 80257fa: d101 bne.n 8025800 <RCC_GetFlagStatus+0xc>
  9133. {
  9134. statusreg = RCC->CR;
  9135. 80257fc: 6813 ldr r3, [r2, #0]
  9136. 80257fe: e003 b.n 8025808 <RCC_GetFlagStatus+0x14>
  9137. }
  9138. else if (tmp == 2) /* The flag to check is in BDCR register */
  9139. 8025800: 2b02 cmp r3, #2
  9140. {
  9141. statusreg = RCC->BDCR;
  9142. 8025802: bf0c ite eq
  9143. 8025804: 6f13 ldreq r3, [r2, #112] ; 0x70
  9144. }
  9145. else /* The flag to check is in CSR register */
  9146. {
  9147. statusreg = RCC->CSR;
  9148. 8025806: 6f53 ldrne r3, [r2, #116] ; 0x74
  9149. }
  9150. /* Get the flag position */
  9151. tmp = RCC_FLAG & FLAG_MASK;
  9152. if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET)
  9153. 8025808: f000 001f and.w r0, r0, #31
  9154. 802580c: fa23 f000 lsr.w r0, r3, r0
  9155. {
  9156. bitstatus = RESET;
  9157. }
  9158. /* Return the flag status */
  9159. return bitstatus;
  9160. }
  9161. 8025810: f000 0001 and.w r0, r0, #1
  9162. 8025814: 4770 bx lr
  9163. 8025816: bf00 nop
  9164. 8025818: 40023800 .word 0x40023800
  9165. 0802581c <RNG_Cmd>:
  9166. * @param NewState: new state of the RNG peripheral.
  9167. * This parameter can be: ENABLE or DISABLE.
  9168. * @retval None
  9169. */
  9170. void RNG_Cmd(FunctionalState NewState)
  9171. {
  9172. 802581c: 4b04 ldr r3, [pc, #16] ; (8025830 <RNG_Cmd+0x14>)
  9173. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9174. if (NewState != DISABLE)
  9175. {
  9176. /* Enable the RNG */
  9177. RNG->CR |= RNG_CR_RNGEN;
  9178. 802581e: 681a ldr r2, [r3, #0]
  9179. void RNG_Cmd(FunctionalState NewState)
  9180. {
  9181. /* Check the parameters */
  9182. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9183. if (NewState != DISABLE)
  9184. 8025820: b110 cbz r0, 8025828 <RNG_Cmd+0xc>
  9185. {
  9186. /* Enable the RNG */
  9187. RNG->CR |= RNG_CR_RNGEN;
  9188. 8025822: f042 0204 orr.w r2, r2, #4
  9189. 8025826: e001 b.n 802582c <RNG_Cmd+0x10>
  9190. }
  9191. else
  9192. {
  9193. /* Disable the RNG */
  9194. RNG->CR &= ~RNG_CR_RNGEN;
  9195. 8025828: f022 0204 bic.w r2, r2, #4
  9196. 802582c: 601a str r2, [r3, #0]
  9197. 802582e: 4770 bx lr
  9198. 8025830: 50060800 .word 0x50060800
  9199. 08025834 <RNG_GetRandomNumber>:
  9200. * @retval 32-bit random number.
  9201. */
  9202. uint32_t RNG_GetRandomNumber(void)
  9203. {
  9204. /* Return the 32 bit random number from the DR register */
  9205. return RNG->DR;
  9206. 8025834: 4b01 ldr r3, [pc, #4] ; (802583c <RNG_GetRandomNumber+0x8>)
  9207. 8025836: 6898 ldr r0, [r3, #8]
  9208. }
  9209. 8025838: 4770 bx lr
  9210. 802583a: bf00 nop
  9211. 802583c: 50060800 .word 0x50060800
  9212. 08025840 <RTC_ByteToBcd2>:
  9213. * @param Value: Byte to be converted.
  9214. * @retval Converted byte
  9215. */
  9216. static uint8_t RTC_ByteToBcd2(uint8_t Value)
  9217. {
  9218. uint8_t bcdhigh = 0;
  9219. 8025840: 2300 movs r3, #0
  9220. while (Value >= 10)
  9221. 8025842: e003 b.n 802584c <RTC_ByteToBcd2+0xc>
  9222. {
  9223. bcdhigh++;
  9224. 8025844: 3301 adds r3, #1
  9225. Value -= 10;
  9226. 8025846: 380a subs r0, #10
  9227. {
  9228. uint8_t bcdhigh = 0;
  9229. while (Value >= 10)
  9230. {
  9231. bcdhigh++;
  9232. 8025848: b2db uxtb r3, r3
  9233. Value -= 10;
  9234. 802584a: b2c0 uxtb r0, r0
  9235. */
  9236. static uint8_t RTC_ByteToBcd2(uint8_t Value)
  9237. {
  9238. uint8_t bcdhigh = 0;
  9239. while (Value >= 10)
  9240. 802584c: 2809 cmp r0, #9
  9241. 802584e: d8f9 bhi.n 8025844 <RTC_ByteToBcd2+0x4>
  9242. {
  9243. bcdhigh++;
  9244. Value -= 10;
  9245. }
  9246. return ((uint8_t)(bcdhigh << 4) | Value);
  9247. 8025850: ea40 1003 orr.w r0, r0, r3, lsl #4
  9248. }
  9249. 8025854: b2c0 uxtb r0, r0
  9250. 8025856: 4770 bx lr
  9251. 08025858 <RTC_Bcd2ToByte>:
  9252. * @retval Converted word
  9253. */
  9254. static uint8_t RTC_Bcd2ToByte(uint8_t Value)
  9255. {
  9256. uint8_t tmp = 0;
  9257. tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10;
  9258. 8025858: 0902 lsrs r2, r0, #4
  9259. return (tmp + (Value & (uint8_t)0x0F));
  9260. 802585a: f000 030f and.w r3, r0, #15
  9261. 802585e: 200a movs r0, #10
  9262. 8025860: fb00 3002 mla r0, r0, r2, r3
  9263. }
  9264. 8025864: b2c0 uxtb r0, r0
  9265. 8025866: 4770 bx lr
  9266. 08025868 <RTC_EnterInitMode>:
  9267. * @retval An ErrorStatus enumeration value:
  9268. * - SUCCESS: RTC is in Init mode
  9269. * - ERROR: RTC is not in Init mode
  9270. */
  9271. ErrorStatus RTC_EnterInitMode(void)
  9272. {
  9273. 8025868: b082 sub sp, #8
  9274. __IO uint32_t initcounter = 0x00;
  9275. 802586a: 2300 movs r3, #0
  9276. 802586c: 9301 str r3, [sp, #4]
  9277. ErrorStatus status = ERROR;
  9278. uint32_t initstatus = 0x00;
  9279. /* Check if the Initialization mode is set */
  9280. if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t)RESET)
  9281. 802586e: 4b0d ldr r3, [pc, #52] ; (80258a4 <RTC_EnterInitMode+0x3c>)
  9282. 8025870: 68da ldr r2, [r3, #12]
  9283. 8025872: 0650 lsls r0, r2, #25
  9284. 8025874: d413 bmi.n 802589e <RTC_EnterInitMode+0x36>
  9285. {
  9286. /* Set the Initialization mode */
  9287. RTC->ISR = (uint32_t)RTC_INIT_MASK;
  9288. 8025876: f04f 32ff mov.w r2, #4294967295
  9289. 802587a: 60da str r2, [r3, #12]
  9290. /* Wait till RTC is in INIT state and if Time out is reached exit */
  9291. do
  9292. {
  9293. initstatus = RTC->ISR & RTC_ISR_INITF;
  9294. 802587c: 68da ldr r2, [r3, #12]
  9295. initcounter++;
  9296. 802587e: 9901 ldr r1, [sp, #4]
  9297. 8025880: 3101 adds r1, #1
  9298. 8025882: 9101 str r1, [sp, #4]
  9299. } while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00));
  9300. 8025884: 9901 ldr r1, [sp, #4]
  9301. 8025886: f5b1 3f80 cmp.w r1, #65536 ; 0x10000
  9302. RTC->ISR = (uint32_t)RTC_INIT_MASK;
  9303. /* Wait till RTC is in INIT state and if Time out is reached exit */
  9304. do
  9305. {
  9306. initstatus = RTC->ISR & RTC_ISR_INITF;
  9307. 802588a: f002 0240 and.w r2, r2, #64 ; 0x40
  9308. initcounter++;
  9309. } while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00));
  9310. 802588e: d001 beq.n 8025894 <RTC_EnterInitMode+0x2c>
  9311. 8025890: 2a00 cmp r2, #0
  9312. 8025892: d0f3 beq.n 802587c <RTC_EnterInitMode+0x14>
  9313. if ((RTC->ISR & RTC_ISR_INITF) != RESET)
  9314. 8025894: 4b03 ldr r3, [pc, #12] ; (80258a4 <RTC_EnterInitMode+0x3c>)
  9315. 8025896: 68d8 ldr r0, [r3, #12]
  9316. {
  9317. status = SUCCESS;
  9318. 8025898: f3c0 1080 ubfx r0, r0, #6, #1
  9319. 802589c: e000 b.n 80258a0 <RTC_EnterInitMode+0x38>
  9320. status = ERROR;
  9321. }
  9322. }
  9323. else
  9324. {
  9325. status = SUCCESS;
  9326. 802589e: 2001 movs r0, #1
  9327. }
  9328. return (status);
  9329. }
  9330. 80258a0: b002 add sp, #8
  9331. 80258a2: 4770 bx lr
  9332. 80258a4: 40002800 .word 0x40002800
  9333. 080258a8 <RTC_ExitInitMode>:
  9334. * @retval None
  9335. */
  9336. void RTC_ExitInitMode(void)
  9337. {
  9338. /* Exit Initialization mode */
  9339. RTC->ISR &= (uint32_t)~RTC_ISR_INIT;
  9340. 80258a8: 4b02 ldr r3, [pc, #8] ; (80258b4 <RTC_ExitInitMode+0xc>)
  9341. 80258aa: 68da ldr r2, [r3, #12]
  9342. 80258ac: f022 0280 bic.w r2, r2, #128 ; 0x80
  9343. 80258b0: 60da str r2, [r3, #12]
  9344. 80258b2: 4770 bx lr
  9345. 80258b4: 40002800 .word 0x40002800
  9346. 080258b8 <RTC_Init>:
  9347. * @retval An ErrorStatus enumeration value:
  9348. * - SUCCESS: RTC registers are initialized
  9349. * - ERROR: RTC registers are not initialized
  9350. */
  9351. ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct)
  9352. {
  9353. 80258b8: b538 push {r3, r4, r5, lr}
  9354. assert_param(IS_RTC_HOUR_FORMAT(RTC_InitStruct->RTC_HourFormat));
  9355. assert_param(IS_RTC_ASYNCH_PREDIV(RTC_InitStruct->RTC_AsynchPrediv));
  9356. assert_param(IS_RTC_SYNCH_PREDIV(RTC_InitStruct->RTC_SynchPrediv));
  9357. /* Disable the write protection for RTC registers */
  9358. RTC->WPR = 0xCA;
  9359. 80258ba: 4c0f ldr r4, [pc, #60] ; (80258f8 <RTC_Init+0x40>)
  9360. 80258bc: 23ca movs r3, #202 ; 0xca
  9361. 80258be: 6263 str r3, [r4, #36] ; 0x24
  9362. RTC->WPR = 0x53;
  9363. 80258c0: 2353 movs r3, #83 ; 0x53
  9364. 80258c2: 6263 str r3, [r4, #36] ; 0x24
  9365. * @retval An ErrorStatus enumeration value:
  9366. * - SUCCESS: RTC registers are initialized
  9367. * - ERROR: RTC registers are not initialized
  9368. */
  9369. ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct)
  9370. {
  9371. 80258c4: 4605 mov r5, r0
  9372. /* Disable the write protection for RTC registers */
  9373. RTC->WPR = 0xCA;
  9374. RTC->WPR = 0x53;
  9375. /* Set Initialization mode */
  9376. if (RTC_EnterInitMode() == ERROR)
  9377. 80258c6: f7ff ffcf bl 8025868 <RTC_EnterInitMode>
  9378. 80258ca: b188 cbz r0, 80258f0 <RTC_Init+0x38>
  9379. status = ERROR;
  9380. }
  9381. else
  9382. {
  9383. /* Clear RTC CR FMT Bit */
  9384. RTC->CR &= ((uint32_t)~(RTC_CR_FMT));
  9385. 80258cc: 68a3 ldr r3, [r4, #8]
  9386. 80258ce: f023 0340 bic.w r3, r3, #64 ; 0x40
  9387. 80258d2: 60a3 str r3, [r4, #8]
  9388. /* Set RTC_CR register */
  9389. RTC->CR |= ((uint32_t)(RTC_InitStruct->RTC_HourFormat));
  9390. 80258d4: 68a2 ldr r2, [r4, #8]
  9391. 80258d6: 682b ldr r3, [r5, #0]
  9392. 80258d8: 4313 orrs r3, r2
  9393. 80258da: 60a3 str r3, [r4, #8]
  9394. /* Configure the RTC PRER */
  9395. RTC->PRER = (uint32_t)(RTC_InitStruct->RTC_SynchPrediv);
  9396. 80258dc: 68ab ldr r3, [r5, #8]
  9397. 80258de: 6123 str r3, [r4, #16]
  9398. RTC->PRER |= (uint32_t)(RTC_InitStruct->RTC_AsynchPrediv << 16);
  9399. 80258e0: 6923 ldr r3, [r4, #16]
  9400. 80258e2: 686a ldr r2, [r5, #4]
  9401. 80258e4: ea43 4302 orr.w r3, r3, r2, lsl #16
  9402. 80258e8: 6123 str r3, [r4, #16]
  9403. /* Exit Initialization mode */
  9404. RTC_ExitInitMode();
  9405. 80258ea: f7ff ffdd bl 80258a8 <RTC_ExitInitMode>
  9406. status = SUCCESS;
  9407. 80258ee: 2001 movs r0, #1
  9408. }
  9409. /* Enable the write protection for RTC registers */
  9410. RTC->WPR = 0xFF;
  9411. 80258f0: 4b01 ldr r3, [pc, #4] ; (80258f8 <RTC_Init+0x40>)
  9412. 80258f2: 22ff movs r2, #255 ; 0xff
  9413. 80258f4: 625a str r2, [r3, #36] ; 0x24
  9414. return status;
  9415. }
  9416. 80258f6: bd38 pop {r3, r4, r5, pc}
  9417. 80258f8: 40002800 .word 0x40002800
  9418. 080258fc <RTC_WaitForSynchro>:
  9419. * @retval An ErrorStatus enumeration value:
  9420. * - SUCCESS: RTC registers are synchronised
  9421. * - ERROR: RTC registers are not synchronised
  9422. */
  9423. ErrorStatus RTC_WaitForSynchro(void)
  9424. {
  9425. 80258fc: b082 sub sp, #8
  9426. __IO uint32_t synchrocounter = 0;
  9427. 80258fe: 2300 movs r3, #0
  9428. 8025900: 9301 str r3, [sp, #4]
  9429. ErrorStatus status = ERROR;
  9430. uint32_t synchrostatus = 0x00;
  9431. /* Disable the write protection for RTC registers */
  9432. RTC->WPR = 0xCA;
  9433. 8025902: 4b0e ldr r3, [pc, #56] ; (802593c <RTC_WaitForSynchro+0x40>)
  9434. 8025904: 22ca movs r2, #202 ; 0xca
  9435. 8025906: 625a str r2, [r3, #36] ; 0x24
  9436. RTC->WPR = 0x53;
  9437. 8025908: 2253 movs r2, #83 ; 0x53
  9438. 802590a: 625a str r2, [r3, #36] ; 0x24
  9439. /* Clear RSF flag */
  9440. RTC->ISR &= (uint32_t)RTC_RSF_MASK;
  9441. 802590c: 68da ldr r2, [r3, #12]
  9442. 802590e: f022 02a0 bic.w r2, r2, #160 ; 0xa0
  9443. 8025912: 60da str r2, [r3, #12]
  9444. /* Wait the registers to be synchronised */
  9445. do
  9446. {
  9447. synchrostatus = RTC->ISR & RTC_ISR_RSF;
  9448. 8025914: 68d9 ldr r1, [r3, #12]
  9449. synchrocounter++;
  9450. 8025916: 9a01 ldr r2, [sp, #4]
  9451. 8025918: 3201 adds r2, #1
  9452. 802591a: 9201 str r2, [sp, #4]
  9453. } while((synchrocounter != SYNCHRO_TIMEOUT) && (synchrostatus == 0x00));
  9454. 802591c: 9a01 ldr r2, [sp, #4]
  9455. 802591e: f5b2 3f00 cmp.w r2, #131072 ; 0x20000
  9456. RTC->ISR &= (uint32_t)RTC_RSF_MASK;
  9457. /* Wait the registers to be synchronised */
  9458. do
  9459. {
  9460. synchrostatus = RTC->ISR & RTC_ISR_RSF;
  9461. 8025922: f001 0120 and.w r1, r1, #32
  9462. 8025926: 4a05 ldr r2, [pc, #20] ; (802593c <RTC_WaitForSynchro+0x40>)
  9463. synchrocounter++;
  9464. } while((synchrocounter != SYNCHRO_TIMEOUT) && (synchrostatus == 0x00));
  9465. 8025928: d001 beq.n 802592e <RTC_WaitForSynchro+0x32>
  9466. 802592a: 2900 cmp r1, #0
  9467. 802592c: d0f2 beq.n 8025914 <RTC_WaitForSynchro+0x18>
  9468. if ((RTC->ISR & RTC_ISR_RSF) != RESET)
  9469. 802592e: 68d0 ldr r0, [r2, #12]
  9470. {
  9471. status = ERROR;
  9472. }
  9473. /* Enable the write protection for RTC registers */
  9474. RTC->WPR = 0xFF;
  9475. 8025930: 23ff movs r3, #255 ; 0xff
  9476. 8025932: 6253 str r3, [r2, #36] ; 0x24
  9477. return (status);
  9478. }
  9479. 8025934: f3c0 1040 ubfx r0, r0, #5, #1
  9480. 8025938: b002 add sp, #8
  9481. 802593a: 4770 bx lr
  9482. 802593c: 40002800 .word 0x40002800
  9483. 08025940 <RTC_SetTime>:
  9484. * @retval An ErrorStatus enumeration value:
  9485. * - SUCCESS: RTC Time register is configured
  9486. * - ERROR: RTC Time register is not configured
  9487. */
  9488. ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
  9489. {
  9490. 8025940: b5f8 push {r3, r4, r5, r6, r7, lr}
  9491. 8025942: 4b24 ldr r3, [pc, #144] ; (80259d4 <RTC_SetTime+0x94>)
  9492. 8025944: 460c mov r4, r1
  9493. /* Check the parameters */
  9494. assert_param(IS_RTC_FORMAT(RTC_Format));
  9495. if (RTC_Format == RTC_Format_BIN)
  9496. {
  9497. if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
  9498. 8025946: 689b ldr r3, [r3, #8]
  9499. ErrorStatus status = ERROR;
  9500. /* Check the parameters */
  9501. assert_param(IS_RTC_FORMAT(RTC_Format));
  9502. if (RTC_Format == RTC_Format_BIN)
  9503. 8025948: b920 cbnz r0, 8025954 <RTC_SetTime+0x14>
  9504. {
  9505. if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
  9506. 802594a: f013 0340 ands.w r3, r3, #64 ; 0x40
  9507. 802594e: d12e bne.n 80259ae <RTC_SetTime+0x6e>
  9508. assert_param(IS_RTC_HOUR12(RTC_TimeStruct->RTC_Hours));
  9509. assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12));
  9510. }
  9511. else
  9512. {
  9513. RTC_TimeStruct->RTC_H12 = 0x00;
  9514. 8025950: 70cb strb r3, [r1, #3]
  9515. 8025952: e02c b.n 80259ae <RTC_SetTime+0x6e>
  9516. assert_param(IS_RTC_MINUTES(RTC_TimeStruct->RTC_Minutes));
  9517. assert_param(IS_RTC_SECONDS(RTC_TimeStruct->RTC_Seconds));
  9518. }
  9519. else
  9520. {
  9521. if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
  9522. 8025954: f013 0340 ands.w r3, r3, #64 ; 0x40
  9523. 8025958: d11e bne.n 8025998 <RTC_SetTime+0x58>
  9524. assert_param(IS_RTC_HOUR12(tmpreg));
  9525. assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12));
  9526. }
  9527. else
  9528. {
  9529. RTC_TimeStruct->RTC_H12 = 0x00;
  9530. 802595a: 70cb strb r3, [r1, #3]
  9531. 802595c: e01c b.n 8025998 <RTC_SetTime+0x58>
  9532. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Seconds)) | \
  9533. (((uint32_t)RTC_TimeStruct->RTC_H12) << 16));
  9534. }
  9535. /* Disable the write protection for RTC registers */
  9536. RTC->WPR = 0xCA;
  9537. 802595e: 4c1d ldr r4, [pc, #116] ; (80259d4 <RTC_SetTime+0x94>)
  9538. 8025960: 23ca movs r3, #202 ; 0xca
  9539. 8025962: 6263 str r3, [r4, #36] ; 0x24
  9540. RTC->WPR = 0x53;
  9541. 8025964: 2353 movs r3, #83 ; 0x53
  9542. 8025966: 6263 str r3, [r4, #36] ; 0x24
  9543. /* Set Initialization mode */
  9544. if (RTC_EnterInitMode() == ERROR)
  9545. 8025968: f7ff ff7e bl 8025868 <RTC_EnterInitMode>
  9546. 802596c: b180 cbz r0, 8025990 <RTC_SetTime+0x50>
  9547. status = ERROR;
  9548. }
  9549. else
  9550. {
  9551. /* Set the RTC_TR register */
  9552. RTC->TR = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK);
  9553. 802596e: f005 357f and.w r5, r5, #2139062143 ; 0x7f7f7f7f
  9554. 8025972: f025 45fe bic.w r5, r5, #2130706432 ; 0x7f000000
  9555. 8025976: 6025 str r5, [r4, #0]
  9556. /* Exit Initialization mode */
  9557. RTC_ExitInitMode();
  9558. 8025978: f7ff ff96 bl 80258a8 <RTC_ExitInitMode>
  9559. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  9560. if ((RTC->CR & RTC_CR_BYPSHAD) == RESET)
  9561. 802597c: 68a3 ldr r3, [r4, #8]
  9562. 802597e: 0699 lsls r1, r3, #26
  9563. 8025980: d405 bmi.n 802598e <RTC_SetTime+0x4e>
  9564. {
  9565. if (RTC_WaitForSynchro() == ERROR)
  9566. 8025982: f7ff ffbb bl 80258fc <RTC_WaitForSynchro>
  9567. RTC->WPR = 0x53;
  9568. /* Set Initialization mode */
  9569. if (RTC_EnterInitMode() == ERROR)
  9570. {
  9571. status = ERROR;
  9572. 8025986: 3000 adds r0, #0
  9573. 8025988: bf18 it ne
  9574. 802598a: 2001 movne r0, #1
  9575. 802598c: e000 b.n 8025990 <RTC_SetTime+0x50>
  9576. status = SUCCESS;
  9577. }
  9578. }
  9579. else
  9580. {
  9581. status = SUCCESS;
  9582. 802598e: 2001 movs r0, #1
  9583. }
  9584. }
  9585. /* Enable the write protection for RTC registers */
  9586. RTC->WPR = 0xFF;
  9587. 8025990: 4b10 ldr r3, [pc, #64] ; (80259d4 <RTC_SetTime+0x94>)
  9588. 8025992: 22ff movs r2, #255 ; 0xff
  9589. 8025994: 625a str r2, [r3, #36] ; 0x24
  9590. 8025996: bdf8 pop {r3, r4, r5, r6, r7, pc}
  9591. /* Check the input parameters format */
  9592. if (RTC_Format != RTC_Format_BIN)
  9593. {
  9594. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9595. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9596. 8025998: 7865 ldrb r5, [r4, #1]
  9597. }
  9598. /* Check the input parameters format */
  9599. if (RTC_Format != RTC_Format_BIN)
  9600. {
  9601. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9602. 802599a: 7823 ldrb r3, [r4, #0]
  9603. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9604. 802599c: 022d lsls r5, r5, #8
  9605. }
  9606. /* Check the input parameters format */
  9607. if (RTC_Format != RTC_Format_BIN)
  9608. {
  9609. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9610. 802599e: ea45 4503 orr.w r5, r5, r3, lsl #16
  9611. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9612. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9613. 80259a2: 78a3 ldrb r3, [r4, #2]
  9614. /* Check the input parameters format */
  9615. if (RTC_Format != RTC_Format_BIN)
  9616. {
  9617. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9618. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9619. 80259a4: 431d orrs r5, r3
  9620. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9621. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9622. 80259a6: 78e3 ldrb r3, [r4, #3]
  9623. }
  9624. /* Check the input parameters format */
  9625. if (RTC_Format != RTC_Format_BIN)
  9626. {
  9627. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9628. 80259a8: ea45 4503 orr.w r5, r5, r3, lsl #16
  9629. 80259ac: e7d7 b.n 802595e <RTC_SetTime+0x1e>
  9630. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9631. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9632. }
  9633. else
  9634. {
  9635. tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \
  9636. 80259ae: 7820 ldrb r0, [r4, #0]
  9637. 80259b0: f7ff ff46 bl 8025840 <RTC_ByteToBcd2>
  9638. 80259b4: 4607 mov r7, r0
  9639. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9640. 80259b6: 7860 ldrb r0, [r4, #1]
  9641. 80259b8: f7ff ff42 bl 8025840 <RTC_ByteToBcd2>
  9642. 80259bc: 4606 mov r6, r0
  9643. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Seconds)) | \
  9644. 80259be: 78a0 ldrb r0, [r4, #2]
  9645. 80259c0: f7ff ff3e bl 8025840 <RTC_ByteToBcd2>
  9646. (((uint32_t)RTC_TimeStruct->RTC_H12) << 16));
  9647. 80259c4: 78e5 ldrb r5, [r4, #3]
  9648. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9649. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9650. }
  9651. else
  9652. {
  9653. tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \
  9654. 80259c6: ea40 4005 orr.w r0, r0, r5, lsl #16
  9655. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9656. 80259ca: ea40 4507 orr.w r5, r0, r7, lsl #16
  9657. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9658. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9659. }
  9660. else
  9661. {
  9662. tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \
  9663. 80259ce: ea45 2506 orr.w r5, r5, r6, lsl #8
  9664. 80259d2: e7c4 b.n 802595e <RTC_SetTime+0x1e>
  9665. 80259d4: 40002800 .word 0x40002800
  9666. 080259d8 <RTC_GetTime>:
  9667. /* Check the parameters */
  9668. assert_param(IS_RTC_FORMAT(RTC_Format));
  9669. /* Get the RTC_TR register */
  9670. tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);
  9671. 80259d8: 4b0f ldr r3, [pc, #60] ; (8025a18 <RTC_GetTime+0x40>)
  9672. 80259da: 681b ldr r3, [r3, #0]
  9673. * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that will
  9674. * contain the returned current time configuration.
  9675. * @retval None
  9676. */
  9677. void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
  9678. {
  9679. 80259dc: b570 push {r4, r5, r6, lr}
  9680. /* Get the RTC_TR register */
  9681. tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);
  9682. /* Fill the structure fields with the read parameters */
  9683. RTC_TimeStruct->RTC_Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16);
  9684. 80259de: f3c3 4205 ubfx r2, r3, #16, #6
  9685. RTC_TimeStruct->RTC_Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8);
  9686. 80259e2: f3c3 2606 ubfx r6, r3, #8, #7
  9687. RTC_TimeStruct->RTC_Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU));
  9688. 80259e6: f003 057f and.w r5, r3, #127 ; 0x7f
  9689. RTC_TimeStruct->RTC_H12 = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16);
  9690. 80259ea: f403 0380 and.w r3, r3, #4194304 ; 0x400000
  9691. 80259ee: 0c1b lsrs r3, r3, #16
  9692. * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that will
  9693. * contain the returned current time configuration.
  9694. * @retval None
  9695. */
  9696. void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
  9697. {
  9698. 80259f0: 460c mov r4, r1
  9699. /* Get the RTC_TR register */
  9700. tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);
  9701. /* Fill the structure fields with the read parameters */
  9702. RTC_TimeStruct->RTC_Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16);
  9703. 80259f2: 700a strb r2, [r1, #0]
  9704. RTC_TimeStruct->RTC_Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8);
  9705. 80259f4: 704e strb r6, [r1, #1]
  9706. RTC_TimeStruct->RTC_Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU));
  9707. 80259f6: 708d strb r5, [r1, #2]
  9708. RTC_TimeStruct->RTC_H12 = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16);
  9709. 80259f8: 70cb strb r3, [r1, #3]
  9710. /* Check the input parameters format */
  9711. if (RTC_Format == RTC_Format_BIN)
  9712. 80259fa: b958 cbnz r0, 8025a14 <RTC_GetTime+0x3c>
  9713. {
  9714. /* Convert the structure parameters to Binary format */
  9715. RTC_TimeStruct->RTC_Hours = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours);
  9716. 80259fc: 4610 mov r0, r2
  9717. 80259fe: f7ff ff2b bl 8025858 <RTC_Bcd2ToByte>
  9718. 8025a02: 7020 strb r0, [r4, #0]
  9719. RTC_TimeStruct->RTC_Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Minutes);
  9720. 8025a04: 4630 mov r0, r6
  9721. 8025a06: f7ff ff27 bl 8025858 <RTC_Bcd2ToByte>
  9722. 8025a0a: 7060 strb r0, [r4, #1]
  9723. RTC_TimeStruct->RTC_Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Seconds);
  9724. 8025a0c: 4628 mov r0, r5
  9725. 8025a0e: f7ff ff23 bl 8025858 <RTC_Bcd2ToByte>
  9726. 8025a12: 70a0 strb r0, [r4, #2]
  9727. 8025a14: bd70 pop {r4, r5, r6, pc}
  9728. 8025a16: bf00 nop
  9729. 8025a18: 40002800 .word 0x40002800
  9730. 08025a1c <RTC_SetDate>:
  9731. * @retval An ErrorStatus enumeration value:
  9732. * - SUCCESS: RTC Date register is configured
  9733. * - ERROR: RTC Date register is not configured
  9734. */
  9735. ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
  9736. {
  9737. 8025a1c: b5f8 push {r3, r4, r5, r6, r7, lr}
  9738. 8025a1e: 460c mov r4, r1
  9739. 8025a20: 784b ldrb r3, [r1, #1]
  9740. ErrorStatus status = ERROR;
  9741. /* Check the parameters */
  9742. assert_param(IS_RTC_FORMAT(RTC_Format));
  9743. if ((RTC_Format == RTC_Format_BIN) && ((RTC_DateStruct->RTC_Month & 0x10) == 0x10))
  9744. 8025a22: 2800 cmp r0, #0
  9745. 8025a24: d138 bne.n 8025a98 <RTC_SetDate+0x7c>
  9746. 8025a26: f003 0210 and.w r2, r3, #16
  9747. 8025a2a: b2d2 uxtb r2, r2
  9748. 8025a2c: b30a cbz r2, 8025a72 <RTC_SetDate+0x56>
  9749. {
  9750. RTC_DateStruct->RTC_Month = (RTC_DateStruct->RTC_Month & (uint32_t)~(0x10)) + 0x0A;
  9751. 8025a2e: f023 0310 bic.w r3, r3, #16
  9752. 8025a32: 330a adds r3, #10
  9753. 8025a34: 704b strb r3, [r1, #1]
  9754. 8025a36: e01c b.n 8025a72 <RTC_SetDate+0x56>
  9755. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Date)) | \
  9756. ((uint32_t)RTC_DateStruct->RTC_WeekDay << 13));
  9757. }
  9758. /* Disable the write protection for RTC registers */
  9759. RTC->WPR = 0xCA;
  9760. 8025a38: 4c1c ldr r4, [pc, #112] ; (8025aac <RTC_SetDate+0x90>)
  9761. 8025a3a: 23ca movs r3, #202 ; 0xca
  9762. 8025a3c: 6263 str r3, [r4, #36] ; 0x24
  9763. RTC->WPR = 0x53;
  9764. 8025a3e: 2353 movs r3, #83 ; 0x53
  9765. 8025a40: 6263 str r3, [r4, #36] ; 0x24
  9766. /* Set Initialization mode */
  9767. if (RTC_EnterInitMode() == ERROR)
  9768. 8025a42: f7ff ff11 bl 8025868 <RTC_EnterInitMode>
  9769. 8025a46: b180 cbz r0, 8025a6a <RTC_SetDate+0x4e>
  9770. status = ERROR;
  9771. }
  9772. else
  9773. {
  9774. /* Set the RTC_DR register */
  9775. RTC->DR = (uint32_t)(tmpreg & RTC_DR_RESERVED_MASK);
  9776. 8025a48: f025 457f bic.w r5, r5, #4278190080 ; 0xff000000
  9777. 8025a4c: f025 05c0 bic.w r5, r5, #192 ; 0xc0
  9778. 8025a50: 6065 str r5, [r4, #4]
  9779. /* Exit Initialization mode */
  9780. RTC_ExitInitMode();
  9781. 8025a52: f7ff ff29 bl 80258a8 <RTC_ExitInitMode>
  9782. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  9783. if ((RTC->CR & RTC_CR_BYPSHAD) == RESET)
  9784. 8025a56: 68a3 ldr r3, [r4, #8]
  9785. 8025a58: 0698 lsls r0, r3, #26
  9786. 8025a5a: d405 bmi.n 8025a68 <RTC_SetDate+0x4c>
  9787. {
  9788. if (RTC_WaitForSynchro() == ERROR)
  9789. 8025a5c: f7ff ff4e bl 80258fc <RTC_WaitForSynchro>
  9790. RTC->WPR = 0x53;
  9791. /* Set Initialization mode */
  9792. if (RTC_EnterInitMode() == ERROR)
  9793. {
  9794. status = ERROR;
  9795. 8025a60: 3000 adds r0, #0
  9796. 8025a62: bf18 it ne
  9797. 8025a64: 2001 movne r0, #1
  9798. 8025a66: e000 b.n 8025a6a <RTC_SetDate+0x4e>
  9799. status = SUCCESS;
  9800. }
  9801. }
  9802. else
  9803. {
  9804. status = SUCCESS;
  9805. 8025a68: 2001 movs r0, #1
  9806. }
  9807. }
  9808. /* Enable the write protection for RTC registers */
  9809. RTC->WPR = 0xFF;
  9810. 8025a6a: 4b10 ldr r3, [pc, #64] ; (8025aac <RTC_SetDate+0x90>)
  9811. 8025a6c: 22ff movs r2, #255 ; 0xff
  9812. 8025a6e: 625a str r2, [r3, #36] ; 0x24
  9813. 8025a70: bdf8 pop {r3, r4, r5, r6, r7, pc}
  9814. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  9815. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  9816. }
  9817. else
  9818. {
  9819. tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \
  9820. 8025a72: 78e0 ldrb r0, [r4, #3]
  9821. 8025a74: f7ff fee4 bl 8025840 <RTC_ByteToBcd2>
  9822. 8025a78: 4607 mov r7, r0
  9823. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Month) << 8) | \
  9824. 8025a7a: 7860 ldrb r0, [r4, #1]
  9825. 8025a7c: f7ff fee0 bl 8025840 <RTC_ByteToBcd2>
  9826. 8025a80: 4606 mov r6, r0
  9827. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Date)) | \
  9828. 8025a82: 78a0 ldrb r0, [r4, #2]
  9829. 8025a84: f7ff fedc bl 8025840 <RTC_ByteToBcd2>
  9830. ((uint32_t)RTC_DateStruct->RTC_WeekDay << 13));
  9831. 8025a88: 7825 ldrb r5, [r4, #0]
  9832. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  9833. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  9834. }
  9835. else
  9836. {
  9837. tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \
  9838. 8025a8a: ea40 3045 orr.w r0, r0, r5, lsl #13
  9839. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Month) << 8) | \
  9840. 8025a8e: ea40 4507 orr.w r5, r0, r7, lsl #16
  9841. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  9842. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  9843. }
  9844. else
  9845. {
  9846. tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \
  9847. 8025a92: ea45 2506 orr.w r5, r5, r6, lsl #8
  9848. 8025a96: e7cf b.n 8025a38 <RTC_SetDate+0x1c>
  9849. assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay));
  9850. /* Check the input parameters format */
  9851. if (RTC_Format != RTC_Format_BIN)
  9852. {
  9853. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  9854. 8025a98: 78cd ldrb r5, [r1, #3]
  9855. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  9856. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  9857. 8025a9a: 788a ldrb r2, [r1, #2]
  9858. /* Check the input parameters format */
  9859. if (RTC_Format != RTC_Format_BIN)
  9860. {
  9861. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  9862. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  9863. 8025a9c: 021b lsls r3, r3, #8
  9864. assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay));
  9865. /* Check the input parameters format */
  9866. if (RTC_Format != RTC_Format_BIN)
  9867. {
  9868. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  9869. 8025a9e: ea43 4505 orr.w r5, r3, r5, lsl #16
  9870. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  9871. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  9872. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  9873. 8025aa2: 780b ldrb r3, [r1, #0]
  9874. /* Check the input parameters format */
  9875. if (RTC_Format != RTC_Format_BIN)
  9876. {
  9877. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  9878. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  9879. 8025aa4: 4315 orrs r5, r2
  9880. assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay));
  9881. /* Check the input parameters format */
  9882. if (RTC_Format != RTC_Format_BIN)
  9883. {
  9884. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  9885. 8025aa6: ea45 3543 orr.w r5, r5, r3, lsl #13
  9886. 8025aaa: e7c5 b.n 8025a38 <RTC_SetDate+0x1c>
  9887. 8025aac: 40002800 .word 0x40002800
  9888. 08025ab0 <RTC_GetDate>:
  9889. /* Check the parameters */
  9890. assert_param(IS_RTC_FORMAT(RTC_Format));
  9891. /* Get the RTC_TR register */
  9892. tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);
  9893. 8025ab0: 4b0e ldr r3, [pc, #56] ; (8025aec <RTC_GetDate+0x3c>)
  9894. 8025ab2: 685b ldr r3, [r3, #4]
  9895. * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that will
  9896. * contain the returned current date configuration.
  9897. * @retval None
  9898. */
  9899. void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
  9900. {
  9901. 8025ab4: b570 push {r4, r5, r6, lr}
  9902. /* Get the RTC_TR register */
  9903. tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);
  9904. /* Fill the structure fields with the read parameters */
  9905. RTC_DateStruct->RTC_Year = (uint8_t)((tmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16);
  9906. 8025ab6: f3c3 4207 ubfx r2, r3, #16, #8
  9907. RTC_DateStruct->RTC_Month = (uint8_t)((tmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8);
  9908. 8025aba: f3c3 2604 ubfx r6, r3, #8, #5
  9909. RTC_DateStruct->RTC_Date = (uint8_t)(tmpreg & (RTC_DR_DT | RTC_DR_DU));
  9910. 8025abe: f003 053f and.w r5, r3, #63 ; 0x3f
  9911. RTC_DateStruct->RTC_WeekDay = (uint8_t)((tmpreg & (RTC_DR_WDU)) >> 13);
  9912. 8025ac2: f3c3 3342 ubfx r3, r3, #13, #3
  9913. * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that will
  9914. * contain the returned current date configuration.
  9915. * @retval None
  9916. */
  9917. void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
  9918. {
  9919. 8025ac6: 460c mov r4, r1
  9920. /* Get the RTC_TR register */
  9921. tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);
  9922. /* Fill the structure fields with the read parameters */
  9923. RTC_DateStruct->RTC_Year = (uint8_t)((tmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16);
  9924. 8025ac8: 70ca strb r2, [r1, #3]
  9925. RTC_DateStruct->RTC_Month = (uint8_t)((tmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8);
  9926. 8025aca: 704e strb r6, [r1, #1]
  9927. RTC_DateStruct->RTC_Date = (uint8_t)(tmpreg & (RTC_DR_DT | RTC_DR_DU));
  9928. 8025acc: 708d strb r5, [r1, #2]
  9929. RTC_DateStruct->RTC_WeekDay = (uint8_t)((tmpreg & (RTC_DR_WDU)) >> 13);
  9930. 8025ace: 700b strb r3, [r1, #0]
  9931. /* Check the input parameters format */
  9932. if (RTC_Format == RTC_Format_BIN)
  9933. 8025ad0: b958 cbnz r0, 8025aea <RTC_GetDate+0x3a>
  9934. {
  9935. /* Convert the structure parameters to Binary format */
  9936. RTC_DateStruct->RTC_Year = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year);
  9937. 8025ad2: 4610 mov r0, r2
  9938. 8025ad4: f7ff fec0 bl 8025858 <RTC_Bcd2ToByte>
  9939. 8025ad8: 70e0 strb r0, [r4, #3]
  9940. RTC_DateStruct->RTC_Month = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month);
  9941. 8025ada: 4630 mov r0, r6
  9942. 8025adc: f7ff febc bl 8025858 <RTC_Bcd2ToByte>
  9943. 8025ae0: 7060 strb r0, [r4, #1]
  9944. RTC_DateStruct->RTC_Date = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date);
  9945. 8025ae2: 4628 mov r0, r5
  9946. 8025ae4: f7ff feb8 bl 8025858 <RTC_Bcd2ToByte>
  9947. 8025ae8: 70a0 strb r0, [r4, #2]
  9948. 8025aea: bd70 pop {r4, r5, r6, pc}
  9949. 8025aec: 40002800 .word 0x40002800
  9950. 08025af0 <RTC_WriteBackupRegister>:
  9951. * specify the register.
  9952. * @param Data: Data to be written in the specified RTC Backup data register.
  9953. * @retval None
  9954. */
  9955. void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data)
  9956. {
  9957. 8025af0: b082 sub sp, #8
  9958. __IO uint32_t tmp = 0;
  9959. 8025af2: 2300 movs r3, #0
  9960. 8025af4: 9301 str r3, [sp, #4]
  9961. /* Check the parameters */
  9962. assert_param(IS_RTC_BKP(RTC_BKP_DR));
  9963. tmp = RTC_BASE + 0x50;
  9964. 8025af6: 4b05 ldr r3, [pc, #20] ; (8025b0c <RTC_WriteBackupRegister+0x1c>)
  9965. 8025af8: 9301 str r3, [sp, #4]
  9966. tmp += (RTC_BKP_DR * 4);
  9967. 8025afa: 9b01 ldr r3, [sp, #4]
  9968. 8025afc: eb03 0080 add.w r0, r3, r0, lsl #2
  9969. 8025b00: 9001 str r0, [sp, #4]
  9970. /* Write the specified register */
  9971. *(__IO uint32_t *)tmp = (uint32_t)Data;
  9972. 8025b02: 9b01 ldr r3, [sp, #4]
  9973. 8025b04: 6019 str r1, [r3, #0]
  9974. }
  9975. 8025b06: b002 add sp, #8
  9976. 8025b08: 4770 bx lr
  9977. 8025b0a: bf00 nop
  9978. 8025b0c: 40002850 .word 0x40002850
  9979. 08025b10 <RTC_ReadBackupRegister>:
  9980. * This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to
  9981. * specify the register.
  9982. * @retval None
  9983. */
  9984. uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR)
  9985. {
  9986. 8025b10: b082 sub sp, #8
  9987. __IO uint32_t tmp = 0;
  9988. 8025b12: 2300 movs r3, #0
  9989. 8025b14: 9301 str r3, [sp, #4]
  9990. /* Check the parameters */
  9991. assert_param(IS_RTC_BKP(RTC_BKP_DR));
  9992. tmp = RTC_BASE + 0x50;
  9993. 8025b16: 4b05 ldr r3, [pc, #20] ; (8025b2c <RTC_ReadBackupRegister+0x1c>)
  9994. 8025b18: 9301 str r3, [sp, #4]
  9995. tmp += (RTC_BKP_DR * 4);
  9996. 8025b1a: 9b01 ldr r3, [sp, #4]
  9997. 8025b1c: eb03 0080 add.w r0, r3, r0, lsl #2
  9998. 8025b20: 9001 str r0, [sp, #4]
  9999. /* Read the specified register */
  10000. return (*(__IO uint32_t *)tmp);
  10001. 8025b22: 9b01 ldr r3, [sp, #4]
  10002. 8025b24: 6818 ldr r0, [r3, #0]
  10003. }
  10004. 8025b26: b002 add sp, #8
  10005. 8025b28: 4770 bx lr
  10006. 8025b2a: bf00 nop
  10007. 8025b2c: 40002850 .word 0x40002850
  10008. 08025b30 <RTC_GetITStatus>:
  10009. /* Check the parameters */
  10010. assert_param(IS_RTC_GET_IT(RTC_IT));
  10011. /* Get the TAMPER Interrupt enable bit and pending bit */
  10012. tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE));
  10013. 8025b30: 4b0a ldr r3, [pc, #40] ; (8025b5c <RTC_GetITStatus+0x2c>)
  10014. 8025b32: 6c1a ldr r2, [r3, #64] ; 0x40
  10015. * @arg RTC_IT_ALRA: Alarm A interrupt
  10016. * @arg RTC_IT_TAMP1: Tamper 1 event interrupt
  10017. * @retval The new state of RTC_IT (SET or RESET).
  10018. */
  10019. ITStatus RTC_GetITStatus(uint32_t RTC_IT)
  10020. {
  10021. 8025b34: b510 push {r4, lr}
  10022. /* Get the TAMPER Interrupt enable bit and pending bit */
  10023. tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE));
  10024. /* Get the Interrupt enable Status */
  10025. enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & (RTC_IT >> 15)));
  10026. 8025b36: 689c ldr r4, [r3, #8]
  10027. /* Get the Interrupt pending bit */
  10028. tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4)));
  10029. 8025b38: 68d9 ldr r1, [r3, #12]
  10030. /* Check the parameters */
  10031. assert_param(IS_RTC_GET_IT(RTC_IT));
  10032. /* Get the TAMPER Interrupt enable bit and pending bit */
  10033. tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE));
  10034. 8025b3a: f002 0204 and.w r2, r2, #4
  10035. /* Get the Interrupt enable Status */
  10036. enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & (RTC_IT >> 15)));
  10037. 8025b3e: ea02 32d0 and.w r2, r2, r0, lsr #15
  10038. 8025b42: ea00 0304 and.w r3, r0, r4
  10039. /* Get the Interrupt pending bit */
  10040. tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4)));
  10041. /* Get the status of the Interrupt */
  10042. if ((enablestatus != (uint32_t)RESET) && ((tmpreg & 0x0000FFFF) != (uint32_t)RESET))
  10043. 8025b46: 4313 orrs r3, r2
  10044. 8025b48: d006 beq.n 8025b58 <RTC_GetITStatus+0x28>
  10045. /* Get the Interrupt enable Status */
  10046. enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & (RTC_IT >> 15)));
  10047. /* Get the Interrupt pending bit */
  10048. tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4)));
  10049. 8025b4a: b28b uxth r3, r1
  10050. /* Get the status of the Interrupt */
  10051. if ((enablestatus != (uint32_t)RESET) && ((tmpreg & 0x0000FFFF) != (uint32_t)RESET))
  10052. 8025b4c: ea13 1310 ands.w r3, r3, r0, lsr #4
  10053. {
  10054. bitstatus = SET;
  10055. 8025b50: bf0c ite eq
  10056. 8025b52: 2000 moveq r0, #0
  10057. 8025b54: 2001 movne r0, #1
  10058. 8025b56: bd10 pop {r4, pc}
  10059. }
  10060. else
  10061. {
  10062. bitstatus = RESET;
  10063. 8025b58: 4618 mov r0, r3
  10064. }
  10065. return bitstatus;
  10066. }
  10067. 8025b5a: bd10 pop {r4, pc}
  10068. 8025b5c: 40002800 .word 0x40002800
  10069. 08025b60 <RTC_ClearITPendingBit>:
  10070. /* Get the RTC_ISR Interrupt pending bits mask */
  10071. tmpreg = (uint32_t)(RTC_IT >> 4);
  10072. /* Clear the interrupt pending bits in the RTC_ISR register */
  10073. RTC->ISR = (uint32_t)((uint32_t)(~((tmpreg | RTC_ISR_INIT)& 0x0000FFFF) | (uint32_t)(RTC->ISR & RTC_ISR_INIT)));
  10074. 8025b60: 4b05 ldr r3, [pc, #20] ; (8025b78 <RTC_ClearITPendingBit+0x18>)
  10075. 8025b62: 68da ldr r2, [r3, #12]
  10076. 8025b64: f3c0 100f ubfx r0, r0, #4, #16
  10077. 8025b68: f040 0080 orr.w r0, r0, #128 ; 0x80
  10078. 8025b6c: f002 0280 and.w r2, r2, #128 ; 0x80
  10079. 8025b70: ea62 0200 orn r2, r2, r0
  10080. 8025b74: 60da str r2, [r3, #12]
  10081. 8025b76: 4770 bx lr
  10082. 8025b78: 40002800 .word 0x40002800
  10083. 08025b7c <SYSCFG_ETH_MediaInterfaceConfig>:
  10084. */
  10085. void SYSCFG_ETH_MediaInterfaceConfig(uint32_t SYSCFG_ETH_MediaInterface)
  10086. {
  10087. assert_param(IS_SYSCFG_ETH_MEDIA_INTERFACE(SYSCFG_ETH_MediaInterface));
  10088. /* Configure MII_RMII selection bit */
  10089. *(__IO uint32_t *) PMC_MII_RMII_SEL_BB = SYSCFG_ETH_MediaInterface;
  10090. 8025b7c: 4b01 ldr r3, [pc, #4] ; (8025b84 <SYSCFG_ETH_MediaInterfaceConfig+0x8>)
  10091. 8025b7e: 6018 str r0, [r3, #0]
  10092. 8025b80: 4770 bx lr
  10093. 8025b82: bf00 nop
  10094. 8025b84: 422700dc .word 0x422700dc
  10095. 08025b88 <TIM_ClearITPendingBit>:
  10096. {
  10097. /* Check the parameters */
  10098. assert_param(IS_TIM_ALL_PERIPH(TIMx));
  10099. /* Clear the IT pending Bit */
  10100. TIMx->SR = (uint16_t)~TIM_IT;
  10101. 8025b88: 43c9 mvns r1, r1
  10102. 8025b8a: 8201 strh r1, [r0, #16]
  10103. 8025b8c: 4770 bx lr
  10104. 8025b8e: 0000 movs r0, r0
  10105. 08025b90 <USART_DeInit>:
  10106. * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or
  10107. * UART peripheral.
  10108. * @retval None
  10109. */
  10110. void USART_DeInit(USART_TypeDef* USARTx)
  10111. {
  10112. 8025b90: b508 push {r3, lr}
  10113. /* Check the parameters */
  10114. assert_param(IS_USART_ALL_PERIPH(USARTx));
  10115. if (USARTx == USART1)
  10116. 8025b92: 4b23 ldr r3, [pc, #140] ; (8025c20 <USART_DeInit+0x90>)
  10117. 8025b94: 4298 cmp r0, r3
  10118. 8025b96: d105 bne.n 8025ba4 <USART_DeInit+0x14>
  10119. {
  10120. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
  10121. 8025b98: 2010 movs r0, #16
  10122. 8025b9a: 2101 movs r1, #1
  10123. 8025b9c: f7ff fe1e bl 80257dc <RCC_APB2PeriphResetCmd>
  10124. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
  10125. 8025ba0: 2010 movs r0, #16
  10126. 8025ba2: e037 b.n 8025c14 <USART_DeInit+0x84>
  10127. }
  10128. else if (USARTx == USART2)
  10129. 8025ba4: 4b1f ldr r3, [pc, #124] ; (8025c24 <USART_DeInit+0x94>)
  10130. 8025ba6: 4298 cmp r0, r3
  10131. 8025ba8: d107 bne.n 8025bba <USART_DeInit+0x2a>
  10132. {
  10133. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);
  10134. 8025baa: f44f 3000 mov.w r0, #131072 ; 0x20000
  10135. 8025bae: 2101 movs r1, #1
  10136. 8025bb0: f7ff fe08 bl 80257c4 <RCC_APB1PeriphResetCmd>
  10137. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
  10138. 8025bb4: f44f 3000 mov.w r0, #131072 ; 0x20000
  10139. 8025bb8: e009 b.n 8025bce <USART_DeInit+0x3e>
  10140. }
  10141. else if (USARTx == USART3)
  10142. 8025bba: 4b1b ldr r3, [pc, #108] ; (8025c28 <USART_DeInit+0x98>)
  10143. 8025bbc: 4298 cmp r0, r3
  10144. 8025bbe: d10b bne.n 8025bd8 <USART_DeInit+0x48>
  10145. {
  10146. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
  10147. 8025bc0: f44f 2080 mov.w r0, #262144 ; 0x40000
  10148. 8025bc4: 2101 movs r1, #1
  10149. 8025bc6: f7ff fdfd bl 80257c4 <RCC_APB1PeriphResetCmd>
  10150. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
  10151. 8025bca: f44f 2080 mov.w r0, #262144 ; 0x40000
  10152. 8025bce: 2100 movs r1, #0
  10153. {
  10154. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE);
  10155. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE);
  10156. }
  10157. }
  10158. }
  10159. 8025bd0: e8bd 4008 ldmia.w sp!, {r3, lr}
  10160. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
  10161. }
  10162. else if (USARTx == USART3)
  10163. {
  10164. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
  10165. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
  10166. 8025bd4: f7ff bdf6 b.w 80257c4 <RCC_APB1PeriphResetCmd>
  10167. }
  10168. else if (USARTx == UART4)
  10169. 8025bd8: 4b14 ldr r3, [pc, #80] ; (8025c2c <USART_DeInit+0x9c>)
  10170. 8025bda: 4298 cmp r0, r3
  10171. 8025bdc: d107 bne.n 8025bee <USART_DeInit+0x5e>
  10172. {
  10173. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE);
  10174. 8025bde: f44f 2000 mov.w r0, #524288 ; 0x80000
  10175. 8025be2: 2101 movs r1, #1
  10176. 8025be4: f7ff fdee bl 80257c4 <RCC_APB1PeriphResetCmd>
  10177. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE);
  10178. 8025be8: f44f 2000 mov.w r0, #524288 ; 0x80000
  10179. 8025bec: e7ef b.n 8025bce <USART_DeInit+0x3e>
  10180. }
  10181. else if (USARTx == UART5)
  10182. 8025bee: 4b10 ldr r3, [pc, #64] ; (8025c30 <USART_DeInit+0xa0>)
  10183. 8025bf0: 4298 cmp r0, r3
  10184. 8025bf2: d107 bne.n 8025c04 <USART_DeInit+0x74>
  10185. {
  10186. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE);
  10187. 8025bf4: f44f 1080 mov.w r0, #1048576 ; 0x100000
  10188. 8025bf8: 2101 movs r1, #1
  10189. 8025bfa: f7ff fde3 bl 80257c4 <RCC_APB1PeriphResetCmd>
  10190. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE);
  10191. 8025bfe: f44f 1080 mov.w r0, #1048576 ; 0x100000
  10192. 8025c02: e7e4 b.n 8025bce <USART_DeInit+0x3e>
  10193. }
  10194. else
  10195. {
  10196. if (USARTx == USART6)
  10197. 8025c04: 4b0b ldr r3, [pc, #44] ; (8025c34 <USART_DeInit+0xa4>)
  10198. 8025c06: 4298 cmp r0, r3
  10199. 8025c08: d109 bne.n 8025c1e <USART_DeInit+0x8e>
  10200. {
  10201. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE);
  10202. 8025c0a: 2020 movs r0, #32
  10203. 8025c0c: 2101 movs r1, #1
  10204. 8025c0e: f7ff fde5 bl 80257dc <RCC_APB2PeriphResetCmd>
  10205. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE);
  10206. 8025c12: 2020 movs r0, #32
  10207. 8025c14: 2100 movs r1, #0
  10208. }
  10209. }
  10210. }
  10211. 8025c16: e8bd 4008 ldmia.w sp!, {r3, lr}
  10212. else
  10213. {
  10214. if (USARTx == USART6)
  10215. {
  10216. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE);
  10217. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE);
  10218. 8025c1a: f7ff bddf b.w 80257dc <RCC_APB2PeriphResetCmd>
  10219. 8025c1e: bd08 pop {r3, pc}
  10220. 8025c20: 40011000 .word 0x40011000
  10221. 8025c24: 40004400 .word 0x40004400
  10222. 8025c28: 40004800 .word 0x40004800
  10223. 8025c2c: 40004c00 .word 0x40004c00
  10224. 8025c30: 40005000 .word 0x40005000
  10225. 8025c34: 40011400 .word 0x40011400
  10226. 08025c38 <USART_Init>:
  10227. {
  10228. assert_param(IS_USART_1236_PERIPH(USARTx));
  10229. }
  10230. /*---------------------------- USART CR2 Configuration -----------------------*/
  10231. tmpreg = USARTx->CR2;
  10232. 8025c38: 8a03 ldrh r3, [r0, #16]
  10233. /* Clear STOP[13:12] bits */
  10234. tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP);
  10235. /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit :
  10236. Set STOP[13:12] bits according to USART_StopBits value */
  10237. tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
  10238. 8025c3a: 88ca ldrh r2, [r1, #6]
  10239. {
  10240. assert_param(IS_USART_1236_PERIPH(USARTx));
  10241. }
  10242. /*---------------------------- USART CR2 Configuration -----------------------*/
  10243. tmpreg = USARTx->CR2;
  10244. 8025c3c: b29b uxth r3, r3
  10245. /* Clear STOP[13:12] bits */
  10246. tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP);
  10247. 8025c3e: f423 5340 bic.w r3, r3, #12288 ; 0x3000
  10248. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  10249. * the configuration information for the specified USART peripheral.
  10250. * @retval None
  10251. */
  10252. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  10253. {
  10254. 8025c42: b530 push {r4, r5, lr}
  10255. /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit :
  10256. Set STOP[13:12] bits according to USART_StopBits value */
  10257. tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
  10258. /* Write to USART CR2 */
  10259. USARTx->CR2 = (uint16_t)tmpreg;
  10260. 8025c44: 4313 orrs r3, r2
  10261. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  10262. * the configuration information for the specified USART peripheral.
  10263. * @retval None
  10264. */
  10265. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  10266. {
  10267. 8025c46: 460d mov r5, r1
  10268. /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit :
  10269. Set STOP[13:12] bits according to USART_StopBits value */
  10270. tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
  10271. /* Write to USART CR2 */
  10272. USARTx->CR2 = (uint16_t)tmpreg;
  10273. 8025c48: 8203 strh r3, [r0, #16]
  10274. /*---------------------------- USART CR1 Configuration -----------------------*/
  10275. tmpreg = USARTx->CR1;
  10276. 8025c4a: 8983 ldrh r3, [r0, #12]
  10277. /* Configure the USART Word Length, Parity and mode:
  10278. Set the M bits according to USART_WordLength value
  10279. Set PCE and PS bits according to USART_Parity value
  10280. Set TE and RE bits according to USART_Mode value */
  10281. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10282. 8025c4c: 8909 ldrh r1, [r1, #8]
  10283. 8025c4e: 88aa ldrh r2, [r5, #4]
  10284. /*---------------------------- USART CR1 Configuration -----------------------*/
  10285. tmpreg = USARTx->CR1;
  10286. /* Clear M, PCE, PS, TE and RE bits */
  10287. tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK);
  10288. 8025c50: f423 53b0 bic.w r3, r3, #5632 ; 0x1600
  10289. /* Configure the USART Word Length, Parity and mode:
  10290. Set the M bits according to USART_WordLength value
  10291. Set PCE and PS bits according to USART_Parity value
  10292. Set TE and RE bits according to USART_Mode value */
  10293. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10294. 8025c54: 430a orrs r2, r1
  10295. 8025c56: 8969 ldrh r1, [r5, #10]
  10296. /*---------------------------- USART CR1 Configuration -----------------------*/
  10297. tmpreg = USARTx->CR1;
  10298. /* Clear M, PCE, PS, TE and RE bits */
  10299. tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK);
  10300. 8025c58: f023 030c bic.w r3, r3, #12
  10301. 8025c5c: 041b lsls r3, r3, #16
  10302. /* Configure the USART Word Length, Parity and mode:
  10303. Set the M bits according to USART_WordLength value
  10304. Set PCE and PS bits according to USART_Parity value
  10305. Set TE and RE bits according to USART_Mode value */
  10306. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10307. 8025c5e: 430a orrs r2, r1
  10308. /*---------------------------- USART CR1 Configuration -----------------------*/
  10309. tmpreg = USARTx->CR1;
  10310. /* Clear M, PCE, PS, TE and RE bits */
  10311. tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK);
  10312. 8025c60: 0c1b lsrs r3, r3, #16
  10313. /* Configure the USART Word Length, Parity and mode:
  10314. Set the M bits according to USART_WordLength value
  10315. Set PCE and PS bits according to USART_Parity value
  10316. Set TE and RE bits according to USART_Mode value */
  10317. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10318. 8025c62: b292 uxth r2, r2
  10319. USART_InitStruct->USART_Mode;
  10320. /* Write to USART CR1 */
  10321. USARTx->CR1 = (uint16_t)tmpreg;
  10322. 8025c64: 4313 orrs r3, r2
  10323. 8025c66: 8183 strh r3, [r0, #12]
  10324. /*---------------------------- USART CR3 Configuration -----------------------*/
  10325. tmpreg = USARTx->CR3;
  10326. 8025c68: 8a83 ldrh r3, [r0, #20]
  10327. /* Clear CTSE and RTSE bits */
  10328. tmpreg &= (uint32_t)~((uint32_t)CR3_CLEAR_MASK);
  10329. /* Configure the USART HFC :
  10330. Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
  10331. tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
  10332. 8025c6a: 89aa ldrh r2, [r5, #12]
  10333. /* Write to USART CR1 */
  10334. USARTx->CR1 = (uint16_t)tmpreg;
  10335. /*---------------------------- USART CR3 Configuration -----------------------*/
  10336. tmpreg = USARTx->CR3;
  10337. 8025c6c: b29b uxth r3, r3
  10338. /* Clear CTSE and RTSE bits */
  10339. tmpreg &= (uint32_t)~((uint32_t)CR3_CLEAR_MASK);
  10340. 8025c6e: f423 7340 bic.w r3, r3, #768 ; 0x300
  10341. /* Configure the USART HFC :
  10342. Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
  10343. tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
  10344. /* Write to USART CR3 */
  10345. USARTx->CR3 = (uint16_t)tmpreg;
  10346. 8025c72: 4313 orrs r3, r2
  10347. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  10348. * the configuration information for the specified USART peripheral.
  10349. * @retval None
  10350. */
  10351. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  10352. {
  10353. 8025c74: b085 sub sp, #20
  10354. /* Configure the USART HFC :
  10355. Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
  10356. tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
  10357. /* Write to USART CR3 */
  10358. USARTx->CR3 = (uint16_t)tmpreg;
  10359. 8025c76: 8283 strh r3, [r0, #20]
  10360. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  10361. * the configuration information for the specified USART peripheral.
  10362. * @retval None
  10363. */
  10364. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  10365. {
  10366. 8025c78: 4604 mov r4, r0
  10367. /* Write to USART CR3 */
  10368. USARTx->CR3 = (uint16_t)tmpreg;
  10369. /*---------------------------- USART BRR Configuration -----------------------*/
  10370. /* Configure the USART Baud Rate */
  10371. RCC_GetClocksFreq(&RCC_ClocksStatus);
  10372. 8025c7a: 4668 mov r0, sp
  10373. 8025c7c: f7ff fd02 bl 8025684 <RCC_GetClocksFreq>
  10374. if ((USARTx == USART1) || (USARTx == USART6))
  10375. 8025c80: 4b19 ldr r3, [pc, #100] ; (8025ce8 <USART_Init+0xb0>)
  10376. 8025c82: 429c cmp r4, r3
  10377. 8025c84: d003 beq.n 8025c8e <USART_Init+0x56>
  10378. 8025c86: f503 6380 add.w r3, r3, #1024 ; 0x400
  10379. 8025c8a: 429c cmp r4, r3
  10380. 8025c8c: d101 bne.n 8025c92 <USART_Init+0x5a>
  10381. {
  10382. apbclock = RCC_ClocksStatus.PCLK2_Frequency;
  10383. 8025c8e: 9b03 ldr r3, [sp, #12]
  10384. 8025c90: e000 b.n 8025c94 <USART_Init+0x5c>
  10385. }
  10386. else
  10387. {
  10388. apbclock = RCC_ClocksStatus.PCLK1_Frequency;
  10389. 8025c92: 9b02 ldr r3, [sp, #8]
  10390. }
  10391. /* Determine the integer part */
  10392. if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  10393. 8025c94: 89a2 ldrh r2, [r4, #12]
  10394. 8025c96: b212 sxth r2, r2
  10395. 8025c98: 2a00 cmp r2, #0
  10396. 8025c9a: f04f 0119 mov.w r1, #25
  10397. 8025c9e: 682a ldr r2, [r5, #0]
  10398. {
  10399. /* Integer part computing in case Oversampling mode is 8 Samples */
  10400. integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
  10401. 8025ca0: fb01 f103 mul.w r1, r1, r3
  10402. {
  10403. apbclock = RCC_ClocksStatus.PCLK1_Frequency;
  10404. }
  10405. /* Determine the integer part */
  10406. if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  10407. 8025ca4: da01 bge.n 8025caa <USART_Init+0x72>
  10408. {
  10409. /* Integer part computing in case Oversampling mode is 8 Samples */
  10410. integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
  10411. 8025ca6: 0052 lsls r2, r2, #1
  10412. 8025ca8: e000 b.n 8025cac <USART_Init+0x74>
  10413. }
  10414. else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  10415. {
  10416. /* Integer part computing in case Oversampling mode is 16 Samples */
  10417. integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));
  10418. 8025caa: 0092 lsls r2, r2, #2
  10419. }
  10420. tmpreg = (integerdivider / 100) << 4;
  10421. 8025cac: 2364 movs r3, #100 ; 0x64
  10422. integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
  10423. }
  10424. else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  10425. {
  10426. /* Integer part computing in case Oversampling mode is 16 Samples */
  10427. integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));
  10428. 8025cae: fbb1 f1f2 udiv r1, r1, r2
  10429. }
  10430. tmpreg = (integerdivider / 100) << 4;
  10431. 8025cb2: fbb1 f2f3 udiv r2, r1, r3
  10432. 8025cb6: 0112 lsls r2, r2, #4
  10433. /* Determine the fractional part */
  10434. fractionaldivider = integerdivider - (100 * (tmpreg >> 4));
  10435. 8025cb8: 0910 lsrs r0, r2, #4
  10436. 8025cba: fb03 1110 mls r1, r3, r0, r1
  10437. /* Implement the fractional part in the register */
  10438. if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  10439. 8025cbe: 89a0 ldrh r0, [r4, #12]
  10440. 8025cc0: b200 sxth r0, r0
  10441. 8025cc2: 2800 cmp r0, #0
  10442. 8025cc4: da06 bge.n 8025cd4 <USART_Init+0x9c>
  10443. {
  10444. tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
  10445. 8025cc6: 00c9 lsls r1, r1, #3
  10446. 8025cc8: 3132 adds r1, #50 ; 0x32
  10447. 8025cca: fbb1 f3f3 udiv r3, r1, r3
  10448. 8025cce: f003 0307 and.w r3, r3, #7
  10449. 8025cd2: e005 b.n 8025ce0 <USART_Init+0xa8>
  10450. }
  10451. else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  10452. {
  10453. tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
  10454. 8025cd4: 0109 lsls r1, r1, #4
  10455. 8025cd6: 3132 adds r1, #50 ; 0x32
  10456. 8025cd8: fbb1 f3f3 udiv r3, r1, r3
  10457. 8025cdc: f003 030f and.w r3, r3, #15
  10458. 8025ce0: 431a orrs r2, r3
  10459. }
  10460. /* Write to USART BRR register */
  10461. USARTx->BRR = (uint16_t)tmpreg;
  10462. 8025ce2: 8122 strh r2, [r4, #8]
  10463. }
  10464. 8025ce4: b005 add sp, #20
  10465. 8025ce6: bd30 pop {r4, r5, pc}
  10466. 8025ce8: 40011000 .word 0x40011000
  10467. 08025cec <USART_Cmd>:
  10468. assert_param(IS_FUNCTIONAL_STATE(NewState));
  10469. if (NewState != DISABLE)
  10470. {
  10471. /* Enable the selected USART by setting the UE bit in the CR1 register */
  10472. USARTx->CR1 |= USART_CR1_UE;
  10473. 8025cec: 8983 ldrh r3, [r0, #12]
  10474. {
  10475. /* Check the parameters */
  10476. assert_param(IS_USART_ALL_PERIPH(USARTx));
  10477. assert_param(IS_FUNCTIONAL_STATE(NewState));
  10478. if (NewState != DISABLE)
  10479. 8025cee: b119 cbz r1, 8025cf8 <USART_Cmd+0xc>
  10480. {
  10481. /* Enable the selected USART by setting the UE bit in the CR1 register */
  10482. USARTx->CR1 |= USART_CR1_UE;
  10483. 8025cf0: b29b uxth r3, r3
  10484. 8025cf2: f443 5300 orr.w r3, r3, #8192 ; 0x2000
  10485. 8025cf6: e003 b.n 8025d00 <USART_Cmd+0x14>
  10486. }
  10487. else
  10488. {
  10489. /* Disable the selected USART by clearing the UE bit in the CR1 register */
  10490. USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE);
  10491. 8025cf8: f423 5300 bic.w r3, r3, #8192 ; 0x2000
  10492. 8025cfc: 041b lsls r3, r3, #16
  10493. 8025cfe: 0c1b lsrs r3, r3, #16
  10494. 8025d00: 8183 strh r3, [r0, #12]
  10495. 8025d02: 4770 bx lr
  10496. 08025d04 <USART_ITConfig>:
  10497. }
  10498. usartxbase = (uint32_t)USARTx;
  10499. /* Get the USART register index */
  10500. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10501. 8025d04: f3c1 1342 ubfx r3, r1, #5, #3
  10502. * @param NewState: new state of the specified USARTx interrupts.
  10503. * This parameter can be: ENABLE or DISABLE.
  10504. * @retval None
  10505. */
  10506. void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
  10507. {
  10508. 8025d08: b510 push {r4, lr}
  10509. /* Get the USART register index */
  10510. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10511. /* Get the interrupt position */
  10512. itpos = USART_IT & IT_MASK;
  10513. itmask = (((uint32_t)0x01) << itpos);
  10514. 8025d0a: 2401 movs r4, #1
  10515. 8025d0c: f001 011f and.w r1, r1, #31
  10516. if (usartreg == 0x01) /* The IT is in CR1 register */
  10517. 8025d10: 42a3 cmp r3, r4
  10518. /* Get the USART register index */
  10519. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10520. /* Get the interrupt position */
  10521. itpos = USART_IT & IT_MASK;
  10522. itmask = (((uint32_t)0x01) << itpos);
  10523. 8025d12: fa04 f101 lsl.w r1, r4, r1
  10524. if (usartreg == 0x01) /* The IT is in CR1 register */
  10525. 8025d16: d101 bne.n 8025d1c <USART_ITConfig+0x18>
  10526. {
  10527. usartxbase += 0x0C;
  10528. 8025d18: 300c adds r0, #12
  10529. 8025d1a: e004 b.n 8025d26 <USART_ITConfig+0x22>
  10530. }
  10531. else if (usartreg == 0x02) /* The IT is in CR2 register */
  10532. 8025d1c: 2b02 cmp r3, #2
  10533. 8025d1e: d101 bne.n 8025d24 <USART_ITConfig+0x20>
  10534. {
  10535. usartxbase += 0x10;
  10536. 8025d20: 3010 adds r0, #16
  10537. 8025d22: e000 b.n 8025d26 <USART_ITConfig+0x22>
  10538. }
  10539. else /* The IT is in CR3 register */
  10540. {
  10541. usartxbase += 0x14;
  10542. 8025d24: 3014 adds r0, #20
  10543. }
  10544. if (NewState != DISABLE)
  10545. {
  10546. *(__IO uint32_t*)usartxbase |= itmask;
  10547. 8025d26: 6803 ldr r3, [r0, #0]
  10548. }
  10549. else /* The IT is in CR3 register */
  10550. {
  10551. usartxbase += 0x14;
  10552. }
  10553. if (NewState != DISABLE)
  10554. 8025d28: b10a cbz r2, 8025d2e <USART_ITConfig+0x2a>
  10555. {
  10556. *(__IO uint32_t*)usartxbase |= itmask;
  10557. 8025d2a: 4319 orrs r1, r3
  10558. 8025d2c: e001 b.n 8025d32 <USART_ITConfig+0x2e>
  10559. }
  10560. else
  10561. {
  10562. *(__IO uint32_t*)usartxbase &= ~itmask;
  10563. 8025d2e: ea23 0101 bic.w r1, r3, r1
  10564. 8025d32: 6001 str r1, [r0, #0]
  10565. 8025d34: bd10 pop {r4, pc}
  10566. 08025d36 <USART_GetITStatus>:
  10567. * @arg USART_IT_FE: Framing Error interrupt
  10568. * @arg USART_IT_PE: Parity Error interrupt
  10569. * @retval The new state of USART_IT (SET or RESET).
  10570. */
  10571. ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
  10572. {
  10573. 8025d36: b510 push {r4, lr}
  10574. {
  10575. assert_param(IS_USART_1236_PERIPH(USARTx));
  10576. }
  10577. /* Get the USART register index */
  10578. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10579. 8025d38: f3c1 1442 ubfx r4, r1, #5, #3
  10580. /* Get the interrupt position */
  10581. itmask = USART_IT & IT_MASK;
  10582. itmask = (uint32_t)0x01 << itmask;
  10583. 8025d3c: 2201 movs r2, #1
  10584. 8025d3e: f001 031f and.w r3, r1, #31
  10585. if (usartreg == 0x01) /* The IT is in CR1 register */
  10586. 8025d42: 2c01 cmp r4, #1
  10587. /* Get the USART register index */
  10588. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10589. /* Get the interrupt position */
  10590. itmask = USART_IT & IT_MASK;
  10591. itmask = (uint32_t)0x01 << itmask;
  10592. 8025d44: fa02 f203 lsl.w r2, r2, r3
  10593. if (usartreg == 0x01) /* The IT is in CR1 register */
  10594. 8025d48: d101 bne.n 8025d4e <USART_GetITStatus+0x18>
  10595. {
  10596. itmask &= USARTx->CR1;
  10597. 8025d4a: 8983 ldrh r3, [r0, #12]
  10598. 8025d4c: e003 b.n 8025d56 <USART_GetITStatus+0x20>
  10599. }
  10600. else if (usartreg == 0x02) /* The IT is in CR2 register */
  10601. 8025d4e: 2c02 cmp r4, #2
  10602. {
  10603. itmask &= USARTx->CR2;
  10604. 8025d50: bf0c ite eq
  10605. 8025d52: 8a03 ldrheq r3, [r0, #16]
  10606. }
  10607. else /* The IT is in CR3 register */
  10608. {
  10609. itmask &= USARTx->CR3;
  10610. 8025d54: 8a83 ldrhne r3, [r0, #20]
  10611. 8025d56: b29b uxth r3, r3
  10612. 8025d58: 4013 ands r3, r2
  10613. }
  10614. bitpos = USART_IT >> 0x08;
  10615. bitpos = (uint32_t)0x01 << bitpos;
  10616. bitpos &= USARTx->SR;
  10617. 8025d5a: 8802 ldrh r2, [r0, #0]
  10618. 8025d5c: b292 uxth r2, r2
  10619. if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET))
  10620. 8025d5e: b143 cbz r3, 8025d72 <USART_GetITStatus+0x3c>
  10621. {
  10622. itmask &= USARTx->CR3;
  10623. }
  10624. bitpos = USART_IT >> 0x08;
  10625. bitpos = (uint32_t)0x01 << bitpos;
  10626. 8025d60: 2301 movs r3, #1
  10627. 8025d62: 0a09 lsrs r1, r1, #8
  10628. 8025d64: fa03 f101 lsl.w r1, r3, r1
  10629. bitpos &= USARTx->SR;
  10630. if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET))
  10631. 8025d68: 4211 tst r1, r2
  10632. {
  10633. bitstatus = SET;
  10634. 8025d6a: bf0c ite eq
  10635. 8025d6c: 2000 moveq r0, #0
  10636. 8025d6e: 2001 movne r0, #1
  10637. 8025d70: bd10 pop {r4, pc}
  10638. }
  10639. else
  10640. {
  10641. bitstatus = RESET;
  10642. 8025d72: 4618 mov r0, r3
  10643. }
  10644. return bitstatus;
  10645. }
  10646. 8025d74: bd10 pop {r4, pc}
  10647. 08025d76 <USART_ClearITPendingBit>:
  10648. {
  10649. assert_param(IS_USART_1236_PERIPH(USARTx));
  10650. }
  10651. bitpos = USART_IT >> 0x08;
  10652. itmask = ((uint16_t)0x01 << (uint16_t)bitpos);
  10653. 8025d76: 0a09 lsrs r1, r1, #8
  10654. 8025d78: 2301 movs r3, #1
  10655. 8025d7a: fa03 f301 lsl.w r3, r3, r1
  10656. USARTx->SR = (uint16_t)~itmask;
  10657. 8025d7e: 43db mvns r3, r3
  10658. 8025d80: 8003 strh r3, [r0, #0]
  10659. 8025d82: 4770 bx lr
  10660. 08025d84 <SystemInit>:
  10661. SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
  10662. #endif
  10663. /* Reset the RCC clock configuration to the default reset state ------------*/
  10664. /* Set HSION bit */
  10665. RCC->CR |= (uint32_t)0x00000001;
  10666. 8025d84: 4b35 ldr r3, [pc, #212] ; (8025e5c <SystemInit+0xd8>)
  10667. 8025d86: 681a ldr r2, [r3, #0]
  10668. 8025d88: f042 0201 orr.w r2, r2, #1
  10669. 8025d8c: 601a str r2, [r3, #0]
  10670. /* Reset CFGR register */
  10671. RCC->CFGR = 0x00000000;
  10672. 8025d8e: 2200 movs r2, #0
  10673. 8025d90: 609a str r2, [r3, #8]
  10674. /* Reset HSEON, CSSON and PLLON bits */
  10675. RCC->CR &= (uint32_t)0xFEF6FFFF;
  10676. 8025d92: 6819 ldr r1, [r3, #0]
  10677. 8025d94: f021 7184 bic.w r1, r1, #17301504 ; 0x1080000
  10678. 8025d98: f421 3180 bic.w r1, r1, #65536 ; 0x10000
  10679. 8025d9c: 6019 str r1, [r3, #0]
  10680. /* Reset PLLCFGR register */
  10681. RCC->PLLCFGR = 0x24003010;
  10682. 8025d9e: 4930 ldr r1, [pc, #192] ; (8025e60 <SystemInit+0xdc>)
  10683. 8025da0: 6059 str r1, [r3, #4]
  10684. /* Reset HSEBYP bit */
  10685. RCC->CR &= (uint32_t)0xFFFBFFFF;
  10686. 8025da2: 6819 ldr r1, [r3, #0]
  10687. * SystemFrequency variable.
  10688. * @param None
  10689. * @retval None
  10690. */
  10691. void SystemInit(void)
  10692. {
  10693. 8025da4: b082 sub sp, #8
  10694. /* Reset PLLCFGR register */
  10695. RCC->PLLCFGR = 0x24003010;
  10696. /* Reset HSEBYP bit */
  10697. RCC->CR &= (uint32_t)0xFFFBFFFF;
  10698. 8025da6: f421 2180 bic.w r1, r1, #262144 ; 0x40000
  10699. 8025daa: 6019 str r1, [r3, #0]
  10700. /* Disable all interrupts */
  10701. RCC->CIR = 0x00000000;
  10702. 8025dac: 60da str r2, [r3, #12]
  10703. static void SetSysClock(void)
  10704. {
  10705. /******************************************************************************/
  10706. /* PLL (clocked by HSE) used as System clock source */
  10707. /******************************************************************************/
  10708. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  10709. 8025dae: 9200 str r2, [sp, #0]
  10710. 8025db0: 9201 str r2, [sp, #4]
  10711. /* Enable HSE */
  10712. RCC->CR |= ((uint32_t)RCC_CR_HSEON);
  10713. 8025db2: 681a ldr r2, [r3, #0]
  10714. 8025db4: f442 3280 orr.w r2, r2, #65536 ; 0x10000
  10715. 8025db8: 601a str r2, [r3, #0]
  10716. /* Wait till HSE is ready and if Time out is reached exit */
  10717. do
  10718. {
  10719. HSEStatus = RCC->CR & RCC_CR_HSERDY;
  10720. 8025dba: 681a ldr r2, [r3, #0]
  10721. 8025dbc: f402 3200 and.w r2, r2, #131072 ; 0x20000
  10722. 8025dc0: 9201 str r2, [sp, #4]
  10723. StartUpCounter++;
  10724. 8025dc2: 9a00 ldr r2, [sp, #0]
  10725. 8025dc4: 3201 adds r2, #1
  10726. 8025dc6: 9200 str r2, [sp, #0]
  10727. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  10728. 8025dc8: 9a01 ldr r2, [sp, #4]
  10729. 8025dca: b91a cbnz r2, 8025dd4 <SystemInit+0x50>
  10730. 8025dcc: 9a00 ldr r2, [sp, #0]
  10731. 8025dce: f5b2 6fa0 cmp.w r2, #1280 ; 0x500
  10732. 8025dd2: d1f2 bne.n 8025dba <SystemInit+0x36>
  10733. if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  10734. 8025dd4: 4b21 ldr r3, [pc, #132] ; (8025e5c <SystemInit+0xd8>)
  10735. 8025dd6: 681b ldr r3, [r3, #0]
  10736. 8025dd8: f413 3300 ands.w r3, r3, #131072 ; 0x20000
  10737. {
  10738. HSEStatus = (uint32_t)0x01;
  10739. 8025ddc: bf18 it ne
  10740. 8025dde: 2301 movne r3, #1
  10741. }
  10742. else
  10743. {
  10744. HSEStatus = (uint32_t)0x00;
  10745. 8025de0: 9301 str r3, [sp, #4]
  10746. }
  10747. if (HSEStatus == (uint32_t)0x01)
  10748. 8025de2: 9b01 ldr r3, [sp, #4]
  10749. 8025de4: 2b01 cmp r3, #1
  10750. 8025de6: d133 bne.n 8025e50 <SystemInit+0xcc>
  10751. {
  10752. /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */
  10753. RCC->APB1ENR |= RCC_APB1ENR_PWREN;
  10754. 8025de8: 4b1c ldr r3, [pc, #112] ; (8025e5c <SystemInit+0xd8>)
  10755. 8025dea: 6c1a ldr r2, [r3, #64] ; 0x40
  10756. 8025dec: f042 5280 orr.w r2, r2, #268435456 ; 0x10000000
  10757. 8025df0: 641a str r2, [r3, #64] ; 0x40
  10758. PWR->CR |= PWR_CR_VOS;
  10759. 8025df2: 4a1c ldr r2, [pc, #112] ; (8025e64 <SystemInit+0xe0>)
  10760. 8025df4: 6811 ldr r1, [r2, #0]
  10761. 8025df6: f441 4180 orr.w r1, r1, #16384 ; 0x4000
  10762. 8025dfa: 6011 str r1, [r2, #0]
  10763. /* HCLK = SYSCLK / 1*/
  10764. RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
  10765. 8025dfc: 689a ldr r2, [r3, #8]
  10766. 8025dfe: 609a str r2, [r3, #8]
  10767. /* PCLK2 = HCLK / 2*/
  10768. RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
  10769. 8025e00: 689a ldr r2, [r3, #8]
  10770. 8025e02: f442 4200 orr.w r2, r2, #32768 ; 0x8000
  10771. 8025e06: 609a str r2, [r3, #8]
  10772. /* PCLK1 = HCLK / 4*/
  10773. RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
  10774. 8025e08: 689a ldr r2, [r3, #8]
  10775. 8025e0a: f442 52a0 orr.w r2, r2, #5120 ; 0x1400
  10776. 8025e0e: 609a str r2, [r3, #8]
  10777. /* Configure the main PLL */
  10778. RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
  10779. 8025e10: 4a15 ldr r2, [pc, #84] ; (8025e68 <SystemInit+0xe4>)
  10780. 8025e12: 605a str r2, [r3, #4]
  10781. (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
  10782. /* Enable the main PLL */
  10783. RCC->CR |= RCC_CR_PLLON;
  10784. 8025e14: 681a ldr r2, [r3, #0]
  10785. 8025e16: f042 7280 orr.w r2, r2, #16777216 ; 0x1000000
  10786. 8025e1a: 601a str r2, [r3, #0]
  10787. /* Wait till the main PLL is ready */
  10788. while((RCC->CR & RCC_CR_PLLRDY) == 0)
  10789. 8025e1c: 6819 ldr r1, [r3, #0]
  10790. 8025e1e: 4a0f ldr r2, [pc, #60] ; (8025e5c <SystemInit+0xd8>)
  10791. 8025e20: 0189 lsls r1, r1, #6
  10792. 8025e22: d5fb bpl.n 8025e1c <SystemInit+0x98>
  10793. {
  10794. }
  10795. /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
  10796. FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
  10797. 8025e24: 4b11 ldr r3, [pc, #68] ; (8025e6c <SystemInit+0xe8>)
  10798. 8025e26: f240 6105 movw r1, #1541 ; 0x605
  10799. 8025e2a: 6019 str r1, [r3, #0]
  10800. /* Select the main PLL as system clock source */
  10801. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
  10802. 8025e2c: 6893 ldr r3, [r2, #8]
  10803. 8025e2e: f023 0303 bic.w r3, r3, #3
  10804. 8025e32: 6093 str r3, [r2, #8]
  10805. RCC->CFGR |= RCC_CFGR_SW_PLL;
  10806. 8025e34: 6893 ldr r3, [r2, #8]
  10807. 8025e36: f043 0302 orr.w r3, r3, #2
  10808. 8025e3a: 6093 str r3, [r2, #8]
  10809. /* Wait till the main PLL is used as system clock source */
  10810. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
  10811. 8025e3c: 6891 ldr r1, [r2, #8]
  10812. 8025e3e: 4b07 ldr r3, [pc, #28] ; (8025e5c <SystemInit+0xd8>)
  10813. 8025e40: f001 010c and.w r1, r1, #12
  10814. 8025e44: 2908 cmp r1, #8
  10815. 8025e46: d1f9 bne.n 8025e3c <SystemInit+0xb8>
  10816. {
  10817. }
  10818. /* Добавил переход на внутренний генератор в случае отказа HSE */
  10819. RCC->CR|=RCC_CR_CSSON;
  10820. 8025e48: 681a ldr r2, [r3, #0]
  10821. 8025e4a: f442 2200 orr.w r2, r2, #524288 ; 0x80000
  10822. 8025e4e: 601a str r2, [r3, #0]
  10823. /* Configure the Vector Table location add offset address ------------------*/
  10824. #ifdef VECT_TAB_SRAM
  10825. SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
  10826. #else
  10827. SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
  10828. 8025e50: 4b07 ldr r3, [pc, #28] ; (8025e70 <SystemInit+0xec>)
  10829. 8025e52: f04f 6200 mov.w r2, #134217728 ; 0x8000000
  10830. 8025e56: 609a str r2, [r3, #8]
  10831. #endif
  10832. }
  10833. 8025e58: b002 add sp, #8
  10834. 8025e5a: 4770 bx lr
  10835. 8025e5c: 40023800 .word 0x40023800
  10836. 8025e60: 24003010 .word 0x24003010
  10837. 8025e64: 40007000 .word 0x40007000
  10838. 8025e68: 07405419 .word 0x07405419
  10839. 8025e6c: 40023c00 .word 0x40023c00
  10840. 8025e70: e000ed00 .word 0xe000ed00
  10841. 08025e74 <gpio_hw_config_pin>:
  10842. GPIO_TABLE(EXPAND_AS_DEFS)
  10843. };
  10844. void gpio_hw_config_pin(GPIO_TypeDef *port, uint8_t pin, uint16_t conf) {
  10845. uint8_t shift;
  10846. shift = pin * 2;
  10847. 8025e74: 004b lsls r3, r1, #1
  10848. port->MODER &= ~(GPIO_MODER_MASK << shift);
  10849. 8025e76: b2db uxtb r3, r3
  10850. gpio_pindef_t gpio_pins[] = {
  10851. GPIO_TABLE(EXPAND_AS_DEFS)
  10852. };
  10853. void gpio_hw_config_pin(GPIO_TypeDef *port, uint8_t pin, uint16_t conf) {
  10854. 8025e78: b570 push {r4, r5, r6, lr}
  10855. uint8_t shift;
  10856. shift = pin * 2;
  10857. port->MODER &= ~(GPIO_MODER_MASK << shift);
  10858. 8025e7a: 2403 movs r4, #3
  10859. 8025e7c: 6805 ldr r5, [r0, #0]
  10860. 8025e7e: fa04 f403 lsl.w r4, r4, r3
  10861. 8025e82: 43e4 mvns r4, r4
  10862. 8025e84: 4025 ands r5, r4
  10863. 8025e86: 6005 str r5, [r0, #0]
  10864. port->MODER |= (uint32_t)((conf >> GPIO_MODE_CFG_SHIFT) & GPIO_MODER_MASK) << shift;
  10865. 8025e88: 6806 ldr r6, [r0, #0]
  10866. 8025e8a: f002 0503 and.w r5, r2, #3
  10867. 8025e8e: fa05 f503 lsl.w r5, r5, r3
  10868. 8025e92: 4335 orrs r5, r6
  10869. 8025e94: 6005 str r5, [r0, #0]
  10870. port->OTYPER &= ~(GPIO_TYPER_MASK << pin);
  10871. 8025e96: 6846 ldr r6, [r0, #4]
  10872. 8025e98: 2501 movs r5, #1
  10873. 8025e9a: fa05 f501 lsl.w r5, r5, r1
  10874. 8025e9e: ea26 0505 bic.w r5, r6, r5
  10875. 8025ea2: 6045 str r5, [r0, #4]
  10876. port->OTYPER |= (uint32_t)((conf >> GPIO_TYPE_CFG_SHIFT) & GPIO_TYPER_MASK) << pin;
  10877. 8025ea4: 6845 ldr r5, [r0, #4]
  10878. 8025ea6: f3c2 0680 ubfx r6, r2, #2, #1
  10879. 8025eaa: fa06 f101 lsl.w r1, r6, r1
  10880. 8025eae: 4329 orrs r1, r5
  10881. 8025eb0: 6041 str r1, [r0, #4]
  10882. port->OSPEEDR &= ~(GPIO_SPEEDR_MASK << shift);
  10883. 8025eb2: 6881 ldr r1, [r0, #8]
  10884. 8025eb4: 4021 ands r1, r4
  10885. 8025eb6: 6081 str r1, [r0, #8]
  10886. port->OSPEEDR |= (uint32_t)((conf >> GPIO_SPEED_CFG_SHIFT) & GPIO_SPEEDR_MASK) << shift;
  10887. 8025eb8: 6885 ldr r5, [r0, #8]
  10888. 8025eba: f3c2 1101 ubfx r1, r2, #4, #2
  10889. 8025ebe: fa01 f103 lsl.w r1, r1, r3
  10890. 8025ec2: 4329 orrs r1, r5
  10891. 8025ec4: 6081 str r1, [r0, #8]
  10892. port->PUPDR &= ~(GPIO_PUPDR_MASK << shift);
  10893. 8025ec6: 68c1 ldr r1, [r0, #12]
  10894. 8025ec8: 400c ands r4, r1
  10895. 8025eca: 60c4 str r4, [r0, #12]
  10896. port->PUPDR |= (uint32_t)((conf >> GPIO_PUPD_CFG_SHIFT) & GPIO_PUPDR_MASK) << shift;
  10897. 8025ecc: 68c1 ldr r1, [r0, #12]
  10898. 8025ece: f3c2 1281 ubfx r2, r2, #6, #2
  10899. 8025ed2: fa02 f303 lsl.w r3, r2, r3
  10900. 8025ed6: 430b orrs r3, r1
  10901. 8025ed8: 60c3 str r3, [r0, #12]
  10902. 8025eda: bd70 pop {r4, r5, r6, pc}
  10903. 08025edc <gpio_connect_af>:
  10904. }
  10905. void gpio_connect_af(gpio_t id, uint8_t af_n) {
  10906. 8025edc: b510 push {r4, lr}
  10907. gpio_pindef_t *pin = &gpio_pins[id];
  10908. 8025ede: 4b13 ldr r3, [pc, #76] ; (8025f2c <gpio_connect_af+0x50>)
  10909. 8025ee0: eb03 02c0 add.w r2, r3, r0, lsl #3
  10910. uint8_t shift;
  10911. if (pin->pin < 8) {
  10912. shift = pin->pin * 4;
  10913. pin->port->AFR[0] &= ~((uint32_t)GPIO_AFR_MASK << shift);
  10914. 8025ee4: f853 3030 ldr.w r3, [r3, r0, lsl #3]
  10915. }
  10916. void gpio_connect_af(gpio_t id, uint8_t af_n) {
  10917. gpio_pindef_t *pin = &gpio_pins[id];
  10918. uint8_t shift;
  10919. if (pin->pin < 8) {
  10920. 8025ee8: 7912 ldrb r2, [r2, #4]
  10921. 8025eea: 2a07 cmp r2, #7
  10922. 8025eec: d80e bhi.n 8025f0c <gpio_connect_af+0x30>
  10923. shift = pin->pin * 4;
  10924. 8025eee: 0092 lsls r2, r2, #2
  10925. pin->port->AFR[0] &= ~((uint32_t)GPIO_AFR_MASK << shift);
  10926. 8025ef0: 6a1c ldr r4, [r3, #32]
  10927. 8025ef2: b2d2 uxtb r2, r2
  10928. 8025ef4: 200f movs r0, #15
  10929. 8025ef6: fa00 f002 lsl.w r0, r0, r2
  10930. 8025efa: ea24 0000 bic.w r0, r4, r0
  10931. 8025efe: 6218 str r0, [r3, #32]
  10932. pin->port->AFR[0] |= af_n << shift;
  10933. 8025f00: 6a18 ldr r0, [r3, #32]
  10934. 8025f02: fa01 f202 lsl.w r2, r1, r2
  10935. 8025f06: 4302 orrs r2, r0
  10936. 8025f08: 621a str r2, [r3, #32]
  10937. 8025f0a: bd10 pop {r4, pc}
  10938. }
  10939. else {
  10940. shift = (pin->pin - 8) * 4;
  10941. 8025f0c: 3a08 subs r2, #8
  10942. 8025f0e: 0092 lsls r2, r2, #2
  10943. pin->port->AFR[1] &= ~((uint32_t)GPIO_AFR_MASK << shift);
  10944. 8025f10: 6a5c ldr r4, [r3, #36] ; 0x24
  10945. 8025f12: b2d2 uxtb r2, r2
  10946. 8025f14: 200f movs r0, #15
  10947. 8025f16: fa00 f002 lsl.w r0, r0, r2
  10948. 8025f1a: ea24 0000 bic.w r0, r4, r0
  10949. 8025f1e: 6258 str r0, [r3, #36] ; 0x24
  10950. pin->port->AFR[1] |= af_n << shift;
  10951. 8025f20: 6a58 ldr r0, [r3, #36] ; 0x24
  10952. 8025f22: fa01 f202 lsl.w r2, r1, r2
  10953. 8025f26: 4302 orrs r2, r0
  10954. 8025f28: 625a str r2, [r3, #36] ; 0x24
  10955. 8025f2a: bd10 pop {r4, pc}
  10956. 8025f2c: 200005c0 .word 0x200005c0
  10957. 08025f30 <gpio_set>:
  10958. }
  10959. }
  10960. }
  10961. void gpio_set(gpio_t pin, bool value) {
  10962. if (gpio_pins[pin].flags & GPIO_INV)
  10963. 8025f30: 4b0e ldr r3, [pc, #56] ; (8025f6c <gpio_set+0x3c>)
  10964. 8025f32: eb03 02c0 add.w r2, r3, r0, lsl #3
  10965. 8025f36: 88d2 ldrh r2, [r2, #6]
  10966. 8025f38: f002 0210 and.w r2, r2, #16
  10967. 8025f3c: b292 uxth r2, r2
  10968. 8025f3e: b10a cbz r2, 8025f44 <gpio_set+0x14>
  10969. value = !value;
  10970. 8025f40: f081 0101 eor.w r1, r1, #1
  10971. 8025f44: 00c2 lsls r2, r0, #3
  10972. if (value)
  10973. 8025f46: b141 cbz r1, 8025f5a <gpio_set+0x2a>
  10974. gpio_pins[pin].port->BSRRL = 1 << gpio_pins[pin].pin;
  10975. 8025f48: f853 1030 ldr.w r1, [r3, r0, lsl #3]
  10976. 8025f4c: 189b adds r3, r3, r2
  10977. 8025f4e: 2201 movs r2, #1
  10978. 8025f50: 791b ldrb r3, [r3, #4]
  10979. 8025f52: fa02 f303 lsl.w r3, r2, r3
  10980. 8025f56: 830b strh r3, [r1, #24]
  10981. 8025f58: 4770 bx lr
  10982. else
  10983. gpio_pins[pin].port->BSRRH = 1 << gpio_pins[pin].pin;
  10984. 8025f5a: f853 1030 ldr.w r1, [r3, r0, lsl #3]
  10985. 8025f5e: 189b adds r3, r3, r2
  10986. 8025f60: 2201 movs r2, #1
  10987. 8025f62: 791b ldrb r3, [r3, #4]
  10988. 8025f64: fa02 f303 lsl.w r3, r2, r3
  10989. 8025f68: 834b strh r3, [r1, #26]
  10990. 8025f6a: 4770 bx lr
  10991. 8025f6c: 200005c0 .word 0x200005c0
  10992. 08025f70 <gpio_set_config>:
  10993. }
  10994. /*
  10995. * TODO add analog flag and setup ADC pins in a proper way
  10996. */
  10997. static void gpio_set_config(gpio_t id) {
  10998. 8025f70: b570 push {r4, r5, r6, lr}
  10999. gpio_pindef_t *pin = &gpio_pins[id];
  11000. 8025f72: 4e1e ldr r6, [pc, #120] ; (8025fec <gpio_set_config+0x7c>)
  11001. 8025f74: eb06 05c0 add.w r5, r6, r0, lsl #3
  11002. }
  11003. /*
  11004. * TODO add analog flag and setup ADC pins in a proper way
  11005. */
  11006. static void gpio_set_config(gpio_t id) {
  11007. 8025f78: 4604 mov r4, r0
  11008. gpio_pindef_t *pin = &gpio_pins[id];
  11009. if (pin->flags & GPIO_AF) {
  11010. 8025f7a: 88e9 ldrh r1, [r5, #6]
  11011. 8025f7c: f401 7300 and.w r3, r1, #512 ; 0x200
  11012. 8025f80: b29b uxth r3, r3
  11013. 8025f82: b13b cbz r3, 8025f94 <gpio_set_config+0x24>
  11014. uint8_t af_n = (uint8_t)(pin->flags >> _GPIO_AF_SHIFT);
  11015. gpio_connect_af(id, af_n);
  11016. 8025f84: 0a89 lsrs r1, r1, #10
  11017. 8025f86: f7ff ffa9 bl 8025edc <gpio_connect_af>
  11018. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_AF_CFG |
  11019. 8025f8a: f856 0034 ldr.w r0, [r6, r4, lsl #3]
  11020. 8025f8e: 7929 ldrb r1, [r5, #4]
  11021. 8025f90: 2232 movs r2, #50 ; 0x32
  11022. 8025f92: e005 b.n 8025fa0 <gpio_set_config+0x30>
  11023. GPIO_SPEED_HIGH_CFG);
  11024. }
  11025. else if (pin->flags & GPIO_IN)
  11026. 8025f94: 07cb lsls r3, r1, #31
  11027. 8025f96: d507 bpl.n 8025fa8 <gpio_set_config+0x38>
  11028. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_IN_CFG |
  11029. 8025f98: f856 0030 ldr.w r0, [r6, r0, lsl #3]
  11030. 8025f9c: 7929 ldrb r1, [r5, #4]
  11031. 8025f9e: 2230 movs r2, #48 ; 0x30
  11032. ((pin->flags & GPIO_OD) ?
  11033. GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
  11034. GPIO_SPEED_HIGH_CFG);
  11035. gpio_set(id, pin->flags & GPIO_SET);
  11036. }
  11037. }
  11038. 8025fa0: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  11039. gpio_connect_af(id, af_n);
  11040. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_AF_CFG |
  11041. GPIO_SPEED_HIGH_CFG);
  11042. }
  11043. else if (pin->flags & GPIO_IN)
  11044. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_IN_CFG |
  11045. 8025fa4: f7ff bf66 b.w 8025e74 <gpio_hw_config_pin>
  11046. GPIO_SPEED_HIGH_CFG);
  11047. else if (pin->flags & GPIO_IN_PU) {
  11048. 8025fa8: f001 0302 and.w r3, r1, #2
  11049. 8025fac: b29b uxth r3, r3
  11050. 8025fae: b123 cbz r3, 8025fba <gpio_set_config+0x4a>
  11051. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_IN_CFG | GPIO_PU_CFG |
  11052. 8025fb0: f856 0030 ldr.w r0, [r6, r0, lsl #3]
  11053. 8025fb4: 7929 ldrb r1, [r5, #4]
  11054. 8025fb6: 2270 movs r2, #112 ; 0x70
  11055. 8025fb8: e00d b.n 8025fd6 <gpio_set_config+0x66>
  11056. GPIO_SPEED_HIGH_CFG);
  11057. gpio_set(id, pin->flags & GPIO_SET);
  11058. }
  11059. else if (pin->flags & GPIO_OUT) {
  11060. 8025fba: f001 0304 and.w r3, r1, #4
  11061. 8025fbe: b29b uxth r3, r3
  11062. 8025fc0: b19b cbz r3, 8025fea <gpio_set_config+0x7a>
  11063. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_OUT_CFG |
  11064. 8025fc2: f001 0120 and.w r1, r1, #32
  11065. 8025fc6: b28a uxth r2, r1
  11066. 8025fc8: f856 0030 ldr.w r0, [r6, r0, lsl #3]
  11067. 8025fcc: 7929 ldrb r1, [r5, #4]
  11068. 8025fce: 2a00 cmp r2, #0
  11069. 8025fd0: bf0c ite eq
  11070. 8025fd2: 2231 moveq r2, #49 ; 0x31
  11071. 8025fd4: 2235 movne r2, #53 ; 0x35
  11072. 8025fd6: f7ff ff4d bl 8025e74 <gpio_hw_config_pin>
  11073. ((pin->flags & GPIO_OD) ?
  11074. GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
  11075. GPIO_SPEED_HIGH_CFG);
  11076. gpio_set(id, pin->flags & GPIO_SET);
  11077. 8025fda: 88e9 ldrh r1, [r5, #6]
  11078. 8025fdc: 4620 mov r0, r4
  11079. 8025fde: f3c1 01c0 ubfx r1, r1, #3, #1
  11080. }
  11081. }
  11082. 8025fe2: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  11083. else if (pin->flags & GPIO_OUT) {
  11084. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_OUT_CFG |
  11085. ((pin->flags & GPIO_OD) ?
  11086. GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
  11087. GPIO_SPEED_HIGH_CFG);
  11088. gpio_set(id, pin->flags & GPIO_SET);
  11089. 8025fe6: f7ff bfa3 b.w 8025f30 <gpio_set>
  11090. 8025fea: bd70 pop {r4, r5, r6, pc}
  11091. 8025fec: 200005c0 .word 0x200005c0
  11092. 08025ff0 <gpio_init>:
  11093. }
  11094. }
  11095. void gpio_init(void) {
  11096. 8025ff0: b538 push {r3, r4, r5, lr}
  11097. uint32_t i;
  11098. GPIO_DeInit(GPIOA);
  11099. 8025ff2: 4812 ldr r0, [pc, #72] ; (802603c <gpio_init+0x4c>)
  11100. GPIO_SPEED_HIGH_CFG);
  11101. gpio_set(id, pin->flags & GPIO_SET);
  11102. }
  11103. }
  11104. void gpio_init(void) {
  11105. 8025ff4: 4d12 ldr r5, [pc, #72] ; (8026040 <gpio_init+0x50>)
  11106. uint32_t i;
  11107. GPIO_DeInit(GPIOA);
  11108. 8025ff6: f7ff fa5d bl 80254b4 <GPIO_DeInit>
  11109. GPIO_DeInit(GPIOB);
  11110. 8025ffa: 4812 ldr r0, [pc, #72] ; (8026044 <gpio_init+0x54>)
  11111. 8025ffc: f7ff fa5a bl 80254b4 <GPIO_DeInit>
  11112. GPIO_DeInit(GPIOC);
  11113. 8026000: 4811 ldr r0, [pc, #68] ; (8026048 <gpio_init+0x58>)
  11114. 8026002: f7ff fa57 bl 80254b4 <GPIO_DeInit>
  11115. GPIO_DeInit(GPIOD);
  11116. 8026006: 4811 ldr r0, [pc, #68] ; (802604c <gpio_init+0x5c>)
  11117. 8026008: f7ff fa54 bl 80254b4 <GPIO_DeInit>
  11118. GPIO_DeInit(GPIOE);
  11119. 802600c: 4810 ldr r0, [pc, #64] ; (8026050 <gpio_init+0x60>)
  11120. 802600e: f7ff fa51 bl 80254b4 <GPIO_DeInit>
  11121. // configure clocks
  11122. RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN |
  11123. 8026012: 4b10 ldr r3, [pc, #64] ; (8026054 <gpio_init+0x64>)
  11124. 8026014: 6b1a ldr r2, [r3, #48] ; 0x30
  11125. 8026016: f042 021f orr.w r2, r2, #31
  11126. 802601a: 631a str r2, [r3, #48] ; 0x30
  11127. RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN |
  11128. RCC_AHB1ENR_GPIOEEN;
  11129. // configure gpios
  11130. for (i = 0; i < GPIO_TOTAL_COUNT; i++) {
  11131. 802601c: 2400 movs r4, #0
  11132. GPIO_SPEED_HIGH_CFG);
  11133. gpio_set(id, pin->flags & GPIO_SET);
  11134. }
  11135. }
  11136. void gpio_init(void) {
  11137. 802601e: eb05 03c4 add.w r3, r5, r4, lsl #3
  11138. RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN |
  11139. RCC_AHB1ENR_GPIOEEN;
  11140. // configure gpios
  11141. for (i = 0; i < GPIO_TOTAL_COUNT; i++) {
  11142. if (gpio_pins[i].flags & GPIO_NOINIT)
  11143. 8026022: 88db ldrh r3, [r3, #6]
  11144. 8026024: f003 0380 and.w r3, r3, #128 ; 0x80
  11145. 8026028: b29b uxth r3, r3
  11146. 802602a: b913 cbnz r3, 8026032 <gpio_init+0x42>
  11147. continue;
  11148. else {
  11149. gpio_set_config(i);
  11150. 802602c: b2e0 uxtb r0, r4
  11151. 802602e: f7ff ff9f bl 8025f70 <gpio_set_config>
  11152. RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN |
  11153. RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN |
  11154. RCC_AHB1ENR_GPIOEEN;
  11155. // configure gpios
  11156. for (i = 0; i < GPIO_TOTAL_COUNT; i++) {
  11157. 8026032: 3401 adds r4, #1
  11158. 8026034: 2c11 cmp r4, #17
  11159. 8026036: d1f2 bne.n 802601e <gpio_init+0x2e>
  11160. continue;
  11161. else {
  11162. gpio_set_config(i);
  11163. }
  11164. }
  11165. }
  11166. 8026038: bd38 pop {r3, r4, r5, pc}
  11167. 802603a: bf00 nop
  11168. 802603c: 40020000 .word 0x40020000
  11169. 8026040: 200005c0 .word 0x200005c0
  11170. 8026044: 40020400 .word 0x40020400
  11171. 8026048: 40020800 .word 0x40020800
  11172. 802604c: 40020c00 .word 0x40020c00
  11173. 8026050: 40021000 .word 0x40021000
  11174. 8026054: 40023800 .word 0x40023800
  11175. 08026058 <gpio_invert_output>:
  11176. gpio_pins[pin].port->BSRRH = 1 << gpio_pins[pin].pin;
  11177. }
  11178. void gpio_invert_output(gpio_t pin) {
  11179. gpio_pins[pin].port->ODR ^= 1 << gpio_pins[pin].pin;
  11180. 8026058: 4a06 ldr r2, [pc, #24] ; (8026074 <gpio_invert_output+0x1c>)
  11181. 802605a: f852 3030 ldr.w r3, [r2, r0, lsl #3]
  11182. 802605e: eb02 02c0 add.w r2, r2, r0, lsl #3
  11183. 8026062: 6959 ldr r1, [r3, #20]
  11184. 8026064: 7912 ldrb r2, [r2, #4]
  11185. 8026066: 2001 movs r0, #1
  11186. 8026068: fa00 f202 lsl.w r2, r0, r2
  11187. 802606c: 404a eors r2, r1
  11188. 802606e: 615a str r2, [r3, #20]
  11189. 8026070: 4770 bx lr
  11190. 8026072: bf00 nop
  11191. 8026074: 200005c0 .word 0x200005c0
  11192. 08026078 <gpio_get>:
  11193. }
  11194. bool gpio_get(gpio_t pin) {
  11195. bool value;
  11196. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  11197. 8026078: 490e ldr r1, [pc, #56] ; (80260b4 <gpio_get+0x3c>)
  11198. 802607a: eb01 02c0 add.w r2, r1, r0, lsl #3
  11199. void gpio_invert_output(gpio_t pin) {
  11200. gpio_pins[pin].port->ODR ^= 1 << gpio_pins[pin].pin;
  11201. }
  11202. bool gpio_get(gpio_t pin) {
  11203. 802607e: b510 push {r4, lr}
  11204. bool value;
  11205. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  11206. 8026080: 88d3 ldrh r3, [r2, #6]
  11207. 8026082: f003 0480 and.w r4, r3, #128 ; 0x80
  11208. 8026086: b2a4 uxth r4, r4
  11209. 8026088: b994 cbnz r4, 80260b0 <gpio_get+0x38>
  11210. return false;
  11211. }
  11212. else {
  11213. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  11214. 802608a: f851 1030 ldr.w r1, [r1, r0, lsl #3]
  11215. 802608e: 7912 ldrb r2, [r2, #4]
  11216. 8026090: 6908 ldr r0, [r1, #16]
  11217. 8026092: 2101 movs r1, #1
  11218. 8026094: fa01 f102 lsl.w r1, r1, r2
  11219. 8026098: 4001 ands r1, r0
  11220. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  11221. 802609a: f003 0310 and.w r3, r3, #16
  11222. bool value;
  11223. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  11224. return false;
  11225. }
  11226. else {
  11227. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  11228. 802609e: 40d1 lsrs r1, r2
  11229. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  11230. 80260a0: b29b uxth r3, r3
  11231. bool value;
  11232. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  11233. return false;
  11234. }
  11235. else {
  11236. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  11237. 80260a2: bf0c ite eq
  11238. 80260a4: 2000 moveq r0, #0
  11239. 80260a6: 2001 movne r0, #1
  11240. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  11241. 80260a8: b11b cbz r3, 80260b2 <gpio_get+0x3a>
  11242. 80260aa: f080 0001 eor.w r0, r0, #1
  11243. 80260ae: bd10 pop {r4, pc}
  11244. }
  11245. bool gpio_get(gpio_t pin) {
  11246. bool value;
  11247. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  11248. return false;
  11249. 80260b0: 2000 movs r0, #0
  11250. }
  11251. else {
  11252. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  11253. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  11254. }
  11255. }
  11256. 80260b2: bd10 pop {r4, pc}
  11257. 80260b4: 200005c0 .word 0x200005c0
  11258. 080260b8 <RNG_Init>:
  11259. #include "rng.h"
  11260. #include "stm32f4xx.h"
  11261. void RNG_Init(void)
  11262. {
  11263. 80260b8: b508 push {r3, lr}
  11264. RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);
  11265. 80260ba: 2040 movs r0, #64 ; 0x40
  11266. 80260bc: 2101 movs r1, #1
  11267. 80260be: f7ff fb51 bl 8025764 <RCC_AHB2PeriphClockCmd>
  11268. RNG_Cmd(ENABLE);
  11269. 80260c2: 2001 movs r0, #1
  11270. }
  11271. 80260c4: e8bd 4008 ldmia.w sp!, {r3, lr}
  11272. void RNG_Init(void)
  11273. {
  11274. RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);
  11275. RNG_Cmd(ENABLE);
  11276. 80260c8: f7ff bba8 b.w 802581c <RNG_Cmd>
  11277. 080260cc <GetRandomNumber>:
  11278. }
  11279. uint32_t GetRandomNumber(void) {
  11280. return RNG_GetRandomNumber();;
  11281. 80260cc: f7ff bbb2 b.w 8025834 <RNG_GetRandomNumber>
  11282. 080260d0 <TM_RTC_SetDateTime>:
  11283. /* Устанавливаем новое время */
  11284. TM_RTC_GetDateTimeFromUnix(&newData, unixTime);
  11285. TM_RTC_SetDateTime(&newData, TM_RTC_Format_BIN);
  11286. }
  11287. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11288. 80260d0: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  11289. TM_RTC_t tmp;
  11290. /* Check date and time validation */
  11291. if (format == TM_RTC_Format_BCD) {
  11292. 80260d4: 2901 cmp r1, #1
  11293. /* Устанавливаем новое время */
  11294. TM_RTC_GetDateTimeFromUnix(&newData, unixTime);
  11295. TM_RTC_SetDateTime(&newData, TM_RTC_Format_BIN);
  11296. }
  11297. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11298. 80260d6: 4603 mov r3, r0
  11299. 80260d8: 460e mov r6, r1
  11300. 80260da: 79c0 ldrb r0, [r0, #7]
  11301. TM_RTC_t tmp;
  11302. /* Check date and time validation */
  11303. if (format == TM_RTC_Format_BCD) {
  11304. 80260dc: d137 bne.n 802614e <TM_RTC_SetDateTime+0x7e>
  11305. tmp.date = TM_RTC_BCD2BIN(data->date);
  11306. tmp.month = TM_RTC_BCD2BIN(data->month);
  11307. 80260de: 7a1c ldrb r4, [r3, #8]
  11308. tmp.year = TM_RTC_BCD2BIN(data->year);
  11309. 80260e0: 7a5d ldrb r5, [r3, #9]
  11310. tmp.hours = TM_RTC_BCD2BIN(data->hours);
  11311. tmp.minutes = TM_RTC_BCD2BIN(data->minutes);
  11312. tmp.seconds = TM_RTC_BCD2BIN(data->seconds);
  11313. 80260e2: f893 8000 ldrb.w r8, [r3]
  11314. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11315. TM_RTC_t tmp;
  11316. /* Check date and time validation */
  11317. if (format == TM_RTC_Format_BCD) {
  11318. tmp.date = TM_RTC_BCD2BIN(data->date);
  11319. 80260e6: 220a movs r2, #10
  11320. 80260e8: 0901 lsrs r1, r0, #4
  11321. 80260ea: f000 000f and.w r0, r0, #15
  11322. 80260ee: fb02 0001 mla r0, r2, r1, r0
  11323. tmp.month = TM_RTC_BCD2BIN(data->month);
  11324. 80260f2: 0921 lsrs r1, r4, #4
  11325. 80260f4: f004 040f and.w r4, r4, #15
  11326. 80260f8: fb02 4101 mla r1, r2, r1, r4
  11327. tmp.year = TM_RTC_BCD2BIN(data->year);
  11328. 80260fc: 092c lsrs r4, r5, #4
  11329. 80260fe: f005 050f and.w r5, r5, #15
  11330. 8026102: fb02 5404 mla r4, r2, r4, r5
  11331. tmp.hours = TM_RTC_BCD2BIN(data->hours);
  11332. 8026106: 795d ldrb r5, [r3, #5]
  11333. 8026108: ea4f 1c15 mov.w ip, r5, lsr #4
  11334. 802610c: f005 050f and.w r5, r5, #15
  11335. 8026110: fb02 5c0c mla ip, r2, ip, r5
  11336. tmp.minutes = TM_RTC_BCD2BIN(data->minutes);
  11337. 8026114: 791d ldrb r5, [r3, #4]
  11338. 8026116: 092f lsrs r7, r5, #4
  11339. 8026118: f005 050f and.w r5, r5, #15
  11340. 802611c: fb02 5707 mla r7, r2, r7, r5
  11341. tmp.seconds = TM_RTC_BCD2BIN(data->seconds);
  11342. 8026120: ea4f 1518 mov.w r5, r8, lsr #4
  11343. 8026124: f008 080f and.w r8, r8, #15
  11344. 8026128: fb02 8505 mla r5, r2, r5, r8
  11345. tmp.day = TM_RTC_BCD2BIN(data->day);
  11346. 802612c: f893 8006 ldrb.w r8, [r3, #6]
  11347. 8026130: ea4f 1918 mov.w r9, r8, lsr #4
  11348. 8026134: f008 080f and.w r8, r8, #15
  11349. 8026138: fb02 8209 mla r2, r2, r9, r8
  11350. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11351. TM_RTC_t tmp;
  11352. /* Check date and time validation */
  11353. if (format == TM_RTC_Format_BCD) {
  11354. tmp.date = TM_RTC_BCD2BIN(data->date);
  11355. 802613c: b2c0 uxtb r0, r0
  11356. tmp.month = TM_RTC_BCD2BIN(data->month);
  11357. 802613e: b2c9 uxtb r1, r1
  11358. tmp.year = TM_RTC_BCD2BIN(data->year);
  11359. 8026140: b2e4 uxtb r4, r4
  11360. tmp.hours = TM_RTC_BCD2BIN(data->hours);
  11361. 8026142: fa5f fc8c uxtb.w ip, ip
  11362. tmp.minutes = TM_RTC_BCD2BIN(data->minutes);
  11363. 8026146: b2ff uxtb r7, r7
  11364. tmp.seconds = TM_RTC_BCD2BIN(data->seconds);
  11365. 8026148: b2ed uxtb r5, r5
  11366. tmp.day = TM_RTC_BCD2BIN(data->day);
  11367. 802614a: b2d2 uxtb r2, r2
  11368. 802614c: e006 b.n 802615c <TM_RTC_SetDateTime+0x8c>
  11369. } else {
  11370. tmp.date = data->date;
  11371. tmp.month = data->month;
  11372. 802614e: 7a19 ldrb r1, [r3, #8]
  11373. tmp.year = data->year;
  11374. 8026150: 7a5c ldrb r4, [r3, #9]
  11375. tmp.hours = data->hours;
  11376. 8026152: f893 c005 ldrb.w ip, [r3, #5]
  11377. tmp.minutes = data->minutes;
  11378. 8026156: 791f ldrb r7, [r3, #4]
  11379. tmp.seconds = data->seconds;
  11380. 8026158: 781d ldrb r5, [r3, #0]
  11381. tmp.day = data->day;
  11382. 802615a: 799a ldrb r2, [r3, #6]
  11383. }
  11384. /* Check year and month */
  11385. if (
  11386. 802615c: 2c63 cmp r4, #99 ; 0x63
  11387. 802615e: d86c bhi.n 802623a <TM_RTC_SetDateTime+0x16a>
  11388. tmp.year > 99 ||
  11389. 8026160: 2900 cmp r1, #0
  11390. 8026162: d06a beq.n 802623a <TM_RTC_SetDateTime+0x16a>
  11391. tmp.month == 0 ||
  11392. 8026164: 290c cmp r1, #12
  11393. 8026166: d868 bhi.n 802623a <TM_RTC_SetDateTime+0x16a>
  11394. tmp.month > 12 ||
  11395. 8026168: 2800 cmp r0, #0
  11396. 802616a: d066 beq.n 802623a <TM_RTC_SetDateTime+0x16a>
  11397. tmp.date == 0 ||
  11398. tmp.date > TM_RTC_Months[TM_RTC_LEAP_YEAR(2000 + tmp.year) ? 1 : 0][tmp.month - 1] ||
  11399. 802616c: f014 0f03 tst.w r4, #3
  11400. 8026170: d10a bne.n 8026188 <TM_RTC_SetDateTime+0xb8>
  11401. 8026172: f504 69fa add.w r9, r4, #2000 ; 0x7d0
  11402. 8026176: f04f 0864 mov.w r8, #100 ; 0x64
  11403. 802617a: fb99 faf8 sdiv sl, r9, r8
  11404. 802617e: fb08 981a mls r8, r8, sl, r9
  11405. 8026182: f1b8 0f00 cmp.w r8, #0
  11406. 8026186: d10c bne.n 80261a2 <TM_RTC_SetDateTime+0xd2>
  11407. 8026188: f504 64fa add.w r4, r4, #2000 ; 0x7d0
  11408. 802618c: f44f 78c8 mov.w r8, #400 ; 0x190
  11409. 8026190: fb94 f9f8 sdiv r9, r4, r8
  11410. 8026194: fb08 4419 mls r4, r8, r9, r4
  11411. 8026198: f1d4 0401 rsbs r4, r4, #1
  11412. 802619c: bf38 it cc
  11413. 802619e: 2400 movcc r4, #0
  11414. 80261a0: e000 b.n 80261a4 <TM_RTC_SetDateTime+0xd4>
  11415. 80261a2: 2401 movs r4, #1
  11416. 80261a4: f8df 80a8 ldr.w r8, [pc, #168] ; 8026250 <TM_RTC_SetDateTime+0x180>
  11417. 80261a8: f04f 090c mov.w r9, #12
  11418. 80261ac: fb09 8404 mla r4, r9, r4, r8
  11419. 80261b0: 1861 adds r1, r4, r1
  11420. /* Check year and month */
  11421. if (
  11422. tmp.year > 99 ||
  11423. tmp.month == 0 ||
  11424. tmp.month > 12 ||
  11425. tmp.date == 0 ||
  11426. 80261b2: f811 1c01 ldrb.w r1, [r1, #-1]
  11427. 80261b6: 4281 cmp r1, r0
  11428. 80261b8: d33f bcc.n 802623a <TM_RTC_SetDateTime+0x16a>
  11429. tmp.date > TM_RTC_Months[TM_RTC_LEAP_YEAR(2000 + tmp.year) ? 1 : 0][tmp.month - 1] ||
  11430. 80261ba: f1bc 0f17 cmp.w ip, #23
  11431. 80261be: d83c bhi.n 802623a <TM_RTC_SetDateTime+0x16a>
  11432. tmp.hours > 23 ||
  11433. 80261c0: 2f3b cmp r7, #59 ; 0x3b
  11434. 80261c2: d83a bhi.n 802623a <TM_RTC_SetDateTime+0x16a>
  11435. tmp.minutes > 59 ||
  11436. 80261c4: 2d3b cmp r5, #59 ; 0x3b
  11437. 80261c6: d838 bhi.n 802623a <TM_RTC_SetDateTime+0x16a>
  11438. tmp.seconds > 59 ||
  11439. 80261c8: 2a00 cmp r2, #0
  11440. 80261ca: d036 beq.n 802623a <TM_RTC_SetDateTime+0x16a>
  11441. tmp.day == 0 ||
  11442. 80261cc: 2a07 cmp r2, #7
  11443. 80261ce: d834 bhi.n 802623a <TM_RTC_SetDateTime+0x16a>
  11444. /* Invalid date */
  11445. return TM_RTC_Result_Error;
  11446. }
  11447. /* Fill time */
  11448. RTC_TimeStruct.RTC_Hours = data->hours;
  11449. 80261d0: 795a ldrb r2, [r3, #5]
  11450. 80261d2: 4d1b ldr r5, [pc, #108] ; (8026240 <TM_RTC_SetDateTime+0x170>)
  11451. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11452. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11453. /* Fill date */
  11454. RTC_DateStruct.RTC_Date = data->date;
  11455. 80261d4: 4c1b ldr r4, [pc, #108] ; (8026244 <TM_RTC_SetDateTime+0x174>)
  11456. /* Invalid date */
  11457. return TM_RTC_Result_Error;
  11458. }
  11459. /* Fill time */
  11460. RTC_TimeStruct.RTC_Hours = data->hours;
  11461. 80261d6: 702a strb r2, [r5, #0]
  11462. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11463. 80261d8: 791a ldrb r2, [r3, #4]
  11464. RTC_DateStruct.RTC_Month = data->month;
  11465. RTC_DateStruct.RTC_Year = data->year;
  11466. RTC_DateStruct.RTC_WeekDay = data->day;
  11467. /* Set the RTC time base to 1s and hours format to 24h */
  11468. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11469. 80261da: 481b ldr r0, [pc, #108] ; (8026248 <TM_RTC_SetDateTime+0x178>)
  11470. return TM_RTC_Result_Error;
  11471. }
  11472. /* Fill time */
  11473. RTC_TimeStruct.RTC_Hours = data->hours;
  11474. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11475. 80261dc: 706a strb r2, [r5, #1]
  11476. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11477. 80261de: 781a ldrb r2, [r3, #0]
  11478. 80261e0: 70aa strb r2, [r5, #2]
  11479. /* Fill date */
  11480. RTC_DateStruct.RTC_Date = data->date;
  11481. 80261e2: 79da ldrb r2, [r3, #7]
  11482. 80261e4: 70a2 strb r2, [r4, #2]
  11483. RTC_DateStruct.RTC_Month = data->month;
  11484. 80261e6: 7a1a ldrb r2, [r3, #8]
  11485. 80261e8: 7062 strb r2, [r4, #1]
  11486. RTC_DateStruct.RTC_Year = data->year;
  11487. 80261ea: 7a5a ldrb r2, [r3, #9]
  11488. RTC_DateStruct.RTC_WeekDay = data->day;
  11489. 80261ec: 799b ldrb r3, [r3, #6]
  11490. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11491. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11492. /* Fill date */
  11493. RTC_DateStruct.RTC_Date = data->date;
  11494. RTC_DateStruct.RTC_Month = data->month;
  11495. RTC_DateStruct.RTC_Year = data->year;
  11496. 80261ee: 70e2 strb r2, [r4, #3]
  11497. RTC_DateStruct.RTC_WeekDay = data->day;
  11498. /* Set the RTC time base to 1s and hours format to 24h */
  11499. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11500. RTC_InitStruct.RTC_AsynchPrediv = RTC_ASYNC_PREDIV;
  11501. 80261f0: 221f movs r2, #31
  11502. RTC_DateStruct.RTC_Month = data->month;
  11503. RTC_DateStruct.RTC_Year = data->year;
  11504. RTC_DateStruct.RTC_WeekDay = data->day;
  11505. /* Set the RTC time base to 1s and hours format to 24h */
  11506. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11507. 80261f2: 2700 movs r7, #0
  11508. RTC_InitStruct.RTC_AsynchPrediv = RTC_ASYNC_PREDIV;
  11509. 80261f4: 6042 str r2, [r0, #4]
  11510. RTC_InitStruct.RTC_SynchPrediv = RTC_SYNC_PREDIV;
  11511. 80261f6: f502 7278 add.w r2, r2, #992 ; 0x3e0
  11512. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11513. /* Fill date */
  11514. RTC_DateStruct.RTC_Date = data->date;
  11515. RTC_DateStruct.RTC_Month = data->month;
  11516. RTC_DateStruct.RTC_Year = data->year;
  11517. RTC_DateStruct.RTC_WeekDay = data->day;
  11518. 80261fa: 7023 strb r3, [r4, #0]
  11519. /* Set the RTC time base to 1s and hours format to 24h */
  11520. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11521. 80261fc: 6007 str r7, [r0, #0]
  11522. RTC_InitStruct.RTC_AsynchPrediv = RTC_ASYNC_PREDIV;
  11523. RTC_InitStruct.RTC_SynchPrediv = RTC_SYNC_PREDIV;
  11524. 80261fe: 6082 str r2, [r0, #8]
  11525. RTC_Init(&RTC_InitStruct);
  11526. 8026200: f7ff fb5a bl 80258b8 <RTC_Init>
  11527. /* Set time */
  11528. if (format == TM_RTC_Format_BCD) {
  11529. 8026204: 2e01 cmp r6, #1
  11530. 8026206: d105 bne.n 8026214 <TM_RTC_SetDateTime+0x144>
  11531. RTC_SetTime(RTC_Format_BCD, &RTC_TimeStruct);
  11532. 8026208: 4630 mov r0, r6
  11533. 802620a: 4629 mov r1, r5
  11534. 802620c: f7ff fb98 bl 8025940 <RTC_SetTime>
  11535. RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
  11536. }
  11537. /* Set date */
  11538. if (format == TM_RTC_Format_BCD) {
  11539. RTC_SetDate(RTC_Format_BCD, &RTC_DateStruct);
  11540. 8026210: 4630 mov r0, r6
  11541. 8026212: e004 b.n 802621e <TM_RTC_SetDateTime+0x14e>
  11542. /* Set time */
  11543. if (format == TM_RTC_Format_BCD) {
  11544. RTC_SetTime(RTC_Format_BCD, &RTC_TimeStruct);
  11545. } else {
  11546. RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
  11547. 8026214: 4638 mov r0, r7
  11548. 8026216: 4629 mov r1, r5
  11549. 8026218: f7ff fb92 bl 8025940 <RTC_SetTime>
  11550. /* Set date */
  11551. if (format == TM_RTC_Format_BCD) {
  11552. RTC_SetDate(RTC_Format_BCD, &RTC_DateStruct);
  11553. } else {
  11554. RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct);
  11555. 802621c: 4638 mov r0, r7
  11556. 802621e: 4621 mov r1, r4
  11557. 8026220: f7ff fbfc bl 8025a1c <RTC_SetDate>
  11558. }
  11559. if (TM_RTC_Status != RTC_STATUS_ZERO) {
  11560. 8026224: 4b09 ldr r3, [pc, #36] ; (802624c <TM_RTC_SetDateTime+0x17c>)
  11561. 8026226: 6818 ldr r0, [r3, #0]
  11562. 8026228: b140 cbz r0, 802623c <TM_RTC_SetDateTime+0x16c>
  11563. /* Write backup registers */
  11564. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_TIME_OK);
  11565. 802622a: 2013 movs r0, #19
  11566. 802622c: f244 3121 movw r1, #17185 ; 0x4321
  11567. 8026230: f7ff fc5e bl 8025af0 <RTC_WriteBackupRegister>
  11568. }
  11569. /* Return OK */
  11570. return TM_RTC_Result_Ok;
  11571. 8026234: 2000 movs r0, #0
  11572. 8026236: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  11573. tmp.seconds > 59 ||
  11574. tmp.day == 0 ||
  11575. tmp.day > 7
  11576. ) {
  11577. /* Invalid date */
  11578. return TM_RTC_Result_Error;
  11579. 802623a: 2001 movs r0, #1
  11580. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_TIME_OK);
  11581. }
  11582. /* Return OK */
  11583. return TM_RTC_Result_Ok;
  11584. }
  11585. 802623c: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  11586. 8026240: 2000e51c .word 0x2000e51c
  11587. 8026244: 2000e52c .word 0x2000e52c
  11588. 8026248: 2000e520 .word 0x2000e520
  11589. 802624c: 20001950 .word 0x20001950
  11590. 8026250: 20000648 .word 0x20000648
  11591. 08026254 <TM_RTC_SetDateTimeString>:
  11592. TM_RTC_Result_t TM_RTC_SetDateTimeString(char* str) {
  11593. 8026254: b530 push {r4, r5, lr}
  11594. TM_RTC_t tmp;
  11595. uint8_t i = 0;
  11596. /* Get date */
  11597. tmp.date = 0;
  11598. while (TM_RTC_CHARISNUM(*(str + i))) {
  11599. 8026256: 2200 movs r2, #0
  11600. /* Return OK */
  11601. return TM_RTC_Result_Ok;
  11602. }
  11603. TM_RTC_Result_t TM_RTC_SetDateTimeString(char* str) {
  11604. 8026258: b085 sub sp, #20
  11605. TM_RTC_t tmp;
  11606. uint8_t i = 0;
  11607. 802625a: 4613 mov r3, r2
  11608. /* Get date */
  11609. tmp.date = 0;
  11610. while (TM_RTC_CHARISNUM(*(str + i))) {
  11611. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11612. 802625c: 250a movs r5, #10
  11613. TM_RTC_t tmp;
  11614. uint8_t i = 0;
  11615. /* Get date */
  11616. tmp.date = 0;
  11617. while (TM_RTC_CHARISNUM(*(str + i))) {
  11618. 802625e: e006 b.n 802626e <TM_RTC_SetDateTimeString+0x1a>
  11619. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11620. 8026260: fb05 1202 mla r2, r5, r2, r1
  11621. 8026264: 3a30 subs r2, #48 ; 0x30
  11622. i++;
  11623. 8026266: 3301 adds r3, #1
  11624. uint8_t i = 0;
  11625. /* Get date */
  11626. tmp.date = 0;
  11627. while (TM_RTC_CHARISNUM(*(str + i))) {
  11628. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11629. 8026268: f002 02ff and.w r2, r2, #255 ; 0xff
  11630. i++;
  11631. 802626c: b2db uxtb r3, r3
  11632. TM_RTC_t tmp;
  11633. uint8_t i = 0;
  11634. /* Get date */
  11635. tmp.date = 0;
  11636. while (TM_RTC_CHARISNUM(*(str + i))) {
  11637. 802626e: 5cc1 ldrb r1, [r0, r3]
  11638. 8026270: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  11639. 8026274: 2c09 cmp r4, #9
  11640. 8026276: d9f3 bls.n 8026260 <TM_RTC_SetDateTimeString+0xc>
  11641. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11642. i++;
  11643. }
  11644. i++;
  11645. 8026278: 3301 adds r3, #1
  11646. 802627a: f88d 2007 strb.w r2, [sp, #7]
  11647. 802627e: b2db uxtb r3, r3
  11648. /* Get month */
  11649. tmp.month = 0;
  11650. while (TM_RTC_CHARISNUM(*(str + i))) {
  11651. 8026280: 2200 movs r2, #0
  11652. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11653. 8026282: 250a movs r5, #10
  11654. }
  11655. i++;
  11656. /* Get month */
  11657. tmp.month = 0;
  11658. while (TM_RTC_CHARISNUM(*(str + i))) {
  11659. 8026284: e006 b.n 8026294 <TM_RTC_SetDateTimeString+0x40>
  11660. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11661. 8026286: fb05 1202 mla r2, r5, r2, r1
  11662. 802628a: 3a30 subs r2, #48 ; 0x30
  11663. i++;
  11664. 802628c: 3301 adds r3, #1
  11665. i++;
  11666. /* Get month */
  11667. tmp.month = 0;
  11668. while (TM_RTC_CHARISNUM(*(str + i))) {
  11669. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11670. 802628e: f002 02ff and.w r2, r2, #255 ; 0xff
  11671. i++;
  11672. 8026292: b2db uxtb r3, r3
  11673. }
  11674. i++;
  11675. /* Get month */
  11676. tmp.month = 0;
  11677. while (TM_RTC_CHARISNUM(*(str + i))) {
  11678. 8026294: 5cc1 ldrb r1, [r0, r3]
  11679. 8026296: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  11680. 802629a: 2c09 cmp r4, #9
  11681. 802629c: d9f3 bls.n 8026286 <TM_RTC_SetDateTimeString+0x32>
  11682. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11683. i++;
  11684. }
  11685. i++;
  11686. 802629e: 3301 adds r3, #1
  11687. 80262a0: f88d 2008 strb.w r2, [sp, #8]
  11688. 80262a4: b2db uxtb r3, r3
  11689. /* Get year */
  11690. tmp.year = 0;
  11691. while (TM_RTC_CHARISNUM(*(str + i))) {
  11692. 80262a6: 2200 movs r2, #0
  11693. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11694. 80262a8: 250a movs r5, #10
  11695. }
  11696. i++;
  11697. /* Get year */
  11698. tmp.year = 0;
  11699. while (TM_RTC_CHARISNUM(*(str + i))) {
  11700. 80262aa: e006 b.n 80262ba <TM_RTC_SetDateTimeString+0x66>
  11701. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11702. 80262ac: fb05 1202 mla r2, r5, r2, r1
  11703. 80262b0: 3a30 subs r2, #48 ; 0x30
  11704. i++;
  11705. 80262b2: 3301 adds r3, #1
  11706. i++;
  11707. /* Get year */
  11708. tmp.year = 0;
  11709. while (TM_RTC_CHARISNUM(*(str + i))) {
  11710. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11711. 80262b4: f002 02ff and.w r2, r2, #255 ; 0xff
  11712. i++;
  11713. 80262b8: b2db uxtb r3, r3
  11714. }
  11715. i++;
  11716. /* Get year */
  11717. tmp.year = 0;
  11718. while (TM_RTC_CHARISNUM(*(str + i))) {
  11719. 80262ba: 5cc1 ldrb r1, [r0, r3]
  11720. 80262bc: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  11721. 80262c0: 2c09 cmp r4, #9
  11722. 80262c2: d9f3 bls.n 80262ac <TM_RTC_SetDateTimeString+0x58>
  11723. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11724. i++;
  11725. }
  11726. i++;
  11727. 80262c4: 3301 adds r3, #1
  11728. 80262c6: f88d 2009 strb.w r2, [sp, #9]
  11729. 80262ca: b2db uxtb r3, r3
  11730. /* Get day in a week */
  11731. tmp.day = 0;
  11732. while (TM_RTC_CHARISNUM(*(str + i))) {
  11733. 80262cc: 2200 movs r2, #0
  11734. tmp.day = tmp.day * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11735. 80262ce: 250a movs r5, #10
  11736. }
  11737. i++;
  11738. /* Get day in a week */
  11739. tmp.day = 0;
  11740. while (TM_RTC_CHARISNUM(*(str + i))) {
  11741. 80262d0: e006 b.n 80262e0 <TM_RTC_SetDateTimeString+0x8c>
  11742. tmp.day = tmp.day * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11743. 80262d2: fb05 1202 mla r2, r5, r2, r1
  11744. 80262d6: 3a30 subs r2, #48 ; 0x30
  11745. i++;
  11746. 80262d8: 3301 adds r3, #1
  11747. i++;
  11748. /* Get day in a week */
  11749. tmp.day = 0;
  11750. while (TM_RTC_CHARISNUM(*(str + i))) {
  11751. tmp.day = tmp.day * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11752. 80262da: f002 02ff and.w r2, r2, #255 ; 0xff
  11753. i++;
  11754. 80262de: b2db uxtb r3, r3
  11755. }
  11756. i++;
  11757. /* Get day in a week */
  11758. tmp.day = 0;
  11759. while (TM_RTC_CHARISNUM(*(str + i))) {
  11760. 80262e0: 5cc1 ldrb r1, [r0, r3]
  11761. 80262e2: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  11762. 80262e6: 2c09 cmp r4, #9
  11763. 80262e8: d9f3 bls.n 80262d2 <TM_RTC_SetDateTimeString+0x7e>
  11764. tmp.day = tmp.day * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11765. i++;
  11766. }
  11767. i++;
  11768. 80262ea: 3301 adds r3, #1
  11769. 80262ec: f88d 2006 strb.w r2, [sp, #6]
  11770. 80262f0: b2db uxtb r3, r3
  11771. /* Get hours */
  11772. tmp.hours = 0;
  11773. while (TM_RTC_CHARISNUM(*(str + i))) {
  11774. 80262f2: 2200 movs r2, #0
  11775. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11776. 80262f4: 250a movs r5, #10
  11777. }
  11778. i++;
  11779. /* Get hours */
  11780. tmp.hours = 0;
  11781. while (TM_RTC_CHARISNUM(*(str + i))) {
  11782. 80262f6: e006 b.n 8026306 <TM_RTC_SetDateTimeString+0xb2>
  11783. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11784. 80262f8: fb05 1202 mla r2, r5, r2, r1
  11785. 80262fc: 3a30 subs r2, #48 ; 0x30
  11786. i++;
  11787. 80262fe: 3301 adds r3, #1
  11788. i++;
  11789. /* Get hours */
  11790. tmp.hours = 0;
  11791. while (TM_RTC_CHARISNUM(*(str + i))) {
  11792. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11793. 8026300: f002 02ff and.w r2, r2, #255 ; 0xff
  11794. i++;
  11795. 8026304: b2db uxtb r3, r3
  11796. }
  11797. i++;
  11798. /* Get hours */
  11799. tmp.hours = 0;
  11800. while (TM_RTC_CHARISNUM(*(str + i))) {
  11801. 8026306: 5cc1 ldrb r1, [r0, r3]
  11802. 8026308: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  11803. 802630c: 2c09 cmp r4, #9
  11804. 802630e: d9f3 bls.n 80262f8 <TM_RTC_SetDateTimeString+0xa4>
  11805. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11806. i++;
  11807. }
  11808. i++;
  11809. 8026310: 3301 adds r3, #1
  11810. 8026312: f88d 2005 strb.w r2, [sp, #5]
  11811. 8026316: b2db uxtb r3, r3
  11812. /* Get minutes */
  11813. tmp.minutes = 0;
  11814. while (TM_RTC_CHARISNUM(*(str + i))) {
  11815. 8026318: 2200 movs r2, #0
  11816. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11817. 802631a: 250a movs r5, #10
  11818. }
  11819. i++;
  11820. /* Get minutes */
  11821. tmp.minutes = 0;
  11822. while (TM_RTC_CHARISNUM(*(str + i))) {
  11823. 802631c: e006 b.n 802632c <TM_RTC_SetDateTimeString+0xd8>
  11824. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11825. 802631e: fb05 1202 mla r2, r5, r2, r1
  11826. 8026322: 3a30 subs r2, #48 ; 0x30
  11827. i++;
  11828. 8026324: 3301 adds r3, #1
  11829. i++;
  11830. /* Get minutes */
  11831. tmp.minutes = 0;
  11832. while (TM_RTC_CHARISNUM(*(str + i))) {
  11833. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11834. 8026326: f002 02ff and.w r2, r2, #255 ; 0xff
  11835. i++;
  11836. 802632a: b2db uxtb r3, r3
  11837. }
  11838. i++;
  11839. /* Get minutes */
  11840. tmp.minutes = 0;
  11841. while (TM_RTC_CHARISNUM(*(str + i))) {
  11842. 802632c: 5cc1 ldrb r1, [r0, r3]
  11843. 802632e: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  11844. 8026332: 2c09 cmp r4, #9
  11845. 8026334: d9f3 bls.n 802631e <TM_RTC_SetDateTimeString+0xca>
  11846. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11847. i++;
  11848. }
  11849. i++;
  11850. 8026336: 3301 adds r3, #1
  11851. 8026338: f88d 2004 strb.w r2, [sp, #4]
  11852. 802633c: b2db uxtb r3, r3
  11853. /* Get seconds */
  11854. tmp.seconds = 0;
  11855. while (TM_RTC_CHARISNUM(*(str + i))) {
  11856. 802633e: 2200 movs r2, #0
  11857. tmp.seconds = tmp.seconds * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11858. 8026340: 250a movs r5, #10
  11859. }
  11860. i++;
  11861. /* Get seconds */
  11862. tmp.seconds = 0;
  11863. while (TM_RTC_CHARISNUM(*(str + i))) {
  11864. 8026342: e006 b.n 8026352 <TM_RTC_SetDateTimeString+0xfe>
  11865. tmp.seconds = tmp.seconds * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11866. 8026344: fb05 1202 mla r2, r5, r2, r1
  11867. 8026348: 3a30 subs r2, #48 ; 0x30
  11868. i++;
  11869. 802634a: 3301 adds r3, #1
  11870. i++;
  11871. /* Get seconds */
  11872. tmp.seconds = 0;
  11873. while (TM_RTC_CHARISNUM(*(str + i))) {
  11874. tmp.seconds = tmp.seconds * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11875. 802634c: f002 02ff and.w r2, r2, #255 ; 0xff
  11876. i++;
  11877. 8026350: b2db uxtb r3, r3
  11878. }
  11879. i++;
  11880. /* Get seconds */
  11881. tmp.seconds = 0;
  11882. while (TM_RTC_CHARISNUM(*(str + i))) {
  11883. 8026352: 5cc1 ldrb r1, [r0, r3]
  11884. 8026354: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  11885. 8026358: 2c09 cmp r4, #9
  11886. 802635a: d9f3 bls.n 8026344 <TM_RTC_SetDateTimeString+0xf0>
  11887. 802635c: a804 add r0, sp, #16
  11888. i++;
  11889. }
  11890. i++;
  11891. /* Return status from set date time function */
  11892. return TM_RTC_SetDateTime(&tmp, TM_RTC_Format_BIN);
  11893. 802635e: 2100 movs r1, #0
  11894. 8026360: f800 2d10 strb.w r2, [r0, #-16]!
  11895. 8026364: 4668 mov r0, sp
  11896. 8026366: f7ff feb3 bl 80260d0 <TM_RTC_SetDateTime>
  11897. }
  11898. 802636a: b005 add sp, #20
  11899. 802636c: bd30 pop {r4, r5, pc}
  11900. 0802636e <TM_RTC_Config>:
  11901. uint16_t TM_RTC_GetDaysInYear(uint8_t year) {
  11902. /* Return days in year */
  11903. return TM_RTC_DAYS_IN_YEAR(2000 + year);
  11904. }
  11905. void TM_RTC_Config(TM_RTC_ClockSource_t source) {
  11906. 802636e: b508 push {r3, lr}
  11907. if (source == TM_RTC_ClockSource_Internal) {
  11908. 8026370: b950 cbnz r0, 8026388 <TM_RTC_Config+0x1a>
  11909. /* Enable the LSI OSC */
  11910. RCC_LSICmd(ENABLE);
  11911. 8026372: 2001 movs r0, #1
  11912. 8026374: f7ff f980 bl 8025678 <RCC_LSICmd>
  11913. /* Wait till LSI is ready */
  11914. while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
  11915. 8026378: 2061 movs r0, #97 ; 0x61
  11916. 802637a: f7ff fa3b bl 80257f4 <RCC_GetFlagStatus>
  11917. 802637e: 2800 cmp r0, #0
  11918. 8026380: d0fa beq.n 8026378 <TM_RTC_Config+0xa>
  11919. /* Select the RTC Clock Source */
  11920. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
  11921. 8026382: f44f 7000 mov.w r0, #512 ; 0x200
  11922. 8026386: e00a b.n 802639e <TM_RTC_Config+0x30>
  11923. } else if (source == TM_RTC_ClockSource_External) {
  11924. 8026388: 2801 cmp r0, #1
  11925. 802638a: d10a bne.n 80263a2 <TM_RTC_Config+0x34>
  11926. /* Enable the LSE OSC */
  11927. RCC_LSEConfig(RCC_LSE_ON);
  11928. 802638c: f7ff f964 bl 8025658 <RCC_LSEConfig>
  11929. /* Wait till LSE is ready */
  11930. while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
  11931. 8026390: 2041 movs r0, #65 ; 0x41
  11932. 8026392: f7ff fa2f bl 80257f4 <RCC_GetFlagStatus>
  11933. 8026396: 2800 cmp r0, #0
  11934. 8026398: d0fa beq.n 8026390 <TM_RTC_Config+0x22>
  11935. /* Select the RTC Clock Source */
  11936. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  11937. 802639a: f44f 7080 mov.w r0, #256 ; 0x100
  11938. 802639e: f7ff f9b7 bl 8025710 <RCC_RTCCLKConfig>
  11939. }
  11940. /* Enable the RTC Clock */
  11941. RCC_RTCCLKCmd(ENABLE);
  11942. 80263a2: 2001 movs r0, #1
  11943. 80263a4: f7ff f9cc bl 8025740 <RCC_RTCCLKCmd>
  11944. /* Wait for register synchronization */
  11945. RTC_WaitForSynchro();
  11946. 80263a8: f7ff faa8 bl 80258fc <RTC_WaitForSynchro>
  11947. /* Write status */
  11948. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_INIT_OK);
  11949. 80263ac: 2013 movs r0, #19
  11950. 80263ae: f241 2134 movw r1, #4660 ; 0x1234
  11951. }
  11952. 80263b2: e8bd 4008 ldmia.w sp!, {r3, lr}
  11953. /* Wait for register synchronization */
  11954. RTC_WaitForSynchro();
  11955. /* Write status */
  11956. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_INIT_OK);
  11957. 80263b6: f7ff bb9b b.w 8025af0 <RTC_WriteBackupRegister>
  11958. 80263ba: 0000 movs r0, r0
  11959. 080263bc <TM_RTC_GetUnixTimeStamp>:
  11960. /* Enable wakeup command */
  11961. RTC_WakeUpCmd(ENABLE);
  11962. }
  11963. }
  11964. uint32_t TM_RTC_GetUnixTimeStamp(TM_RTC_t* data) {
  11965. 80263bc: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  11966. uint32_t days = 0, seconds = 0;
  11967. uint16_t i;
  11968. uint16_t year = (uint16_t) (data->year + 2000);
  11969. 80263c0: 7a42 ldrb r2, [r0, #9]
  11970. 80263c2: f240 73b2 movw r3, #1970 ; 0x7b2
  11971. 80263c6: f502 62fa add.w r2, r2, #2000 ; 0x7d0
  11972. 80263ca: 2100 movs r1, #0
  11973. if (year < TM_RTC_OFFSET_YEAR) {
  11974. return 0;
  11975. }
  11976. /* Days in back years */
  11977. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  11978. days += TM_RTC_DAYS_IN_YEAR(i);
  11979. 80263cc: f44f 75c8 mov.w r5, #400 ; 0x190
  11980. 80263d0: 2664 movs r6, #100 ; 0x64
  11981. 80263d2: 079c lsls r4, r3, #30
  11982. 80263d4: d108 bne.n 80263e8 <TM_RTC_GetUnixTimeStamp+0x2c>
  11983. 80263d6: fbb3 f4f6 udiv r4, r3, r6
  11984. 80263da: fb06 3414 mls r4, r6, r4, r3
  11985. 80263de: b2a4 uxth r4, r4
  11986. 80263e0: b114 cbz r4, 80263e8 <TM_RTC_GetUnixTimeStamp+0x2c>
  11987. 80263e2: f44f 74b7 mov.w r4, #366 ; 0x16e
  11988. 80263e6: e008 b.n 80263fa <TM_RTC_GetUnixTimeStamp+0x3e>
  11989. 80263e8: fbb3 f4f5 udiv r4, r3, r5
  11990. 80263ec: fb05 3414 mls r4, r5, r4, r3
  11991. 80263f0: b2a4 uxth r4, r4
  11992. 80263f2: 2c00 cmp r4, #0
  11993. 80263f4: d0f5 beq.n 80263e2 <TM_RTC_GetUnixTimeStamp+0x26>
  11994. 80263f6: f240 146d movw r4, #365 ; 0x16d
  11995. /* Year is below offset year */
  11996. if (year < TM_RTC_OFFSET_YEAR) {
  11997. return 0;
  11998. }
  11999. /* Days in back years */
  12000. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  12001. 80263fa: 3301 adds r3, #1
  12002. 80263fc: b29b uxth r3, r3
  12003. 80263fe: 4293 cmp r3, r2
  12004. days += TM_RTC_DAYS_IN_YEAR(i);
  12005. 8026400: 4421 add r1, r4
  12006. /* Year is below offset year */
  12007. if (year < TM_RTC_OFFSET_YEAR) {
  12008. return 0;
  12009. }
  12010. /* Days in back years */
  12011. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  12012. 8026402: d3e6 bcc.n 80263d2 <TM_RTC_GetUnixTimeStamp+0x16>
  12013. days += TM_RTC_DAYS_IN_YEAR(i);
  12014. }
  12015. /* Days in current year */
  12016. for (i = 1; i < data->month; i++) {
  12017. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  12018. 8026404: 2364 movs r3, #100 ; 0x64
  12019. 8026406: fbb2 f7f3 udiv r7, r2, r3
  12020. 802640a: fb03 2317 mls r3, r3, r7, r2
  12021. 802640e: b29f uxth r7, r3
  12022. 8026410: f44f 73c8 mov.w r3, #400 ; 0x190
  12023. 8026414: fbb2 f4f3 udiv r4, r2, r3
  12024. 8026418: fb03 2414 mls r4, r3, r4, r2
  12025. 802641c: b2a4 uxth r4, r4
  12026. 802641e: f1d4 0401 rsbs r4, r4, #1
  12027. 8026422: bf38 it cc
  12028. 8026424: 2400 movcc r4, #0
  12029. /* Days in back years */
  12030. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  12031. days += TM_RTC_DAYS_IN_YEAR(i);
  12032. }
  12033. /* Days in current year */
  12034. for (i = 1; i < data->month; i++) {
  12035. 8026426: 7a06 ldrb r6, [r0, #8]
  12036. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  12037. 8026428: f8df c058 ldr.w ip, [pc, #88] ; 8026484 <TM_RTC_GetUnixTimeStamp+0xc8>
  12038. 802642c: 2300 movs r3, #0
  12039. 802642e: f002 0203 and.w r2, r2, #3
  12040. 8026432: f04f 080c mov.w r8, #12
  12041. 8026436: e00c b.n 8026452 <TM_RTC_GetUnixTimeStamp+0x96>
  12042. 8026438: b922 cbnz r2, 8026444 <TM_RTC_GetUnixTimeStamp+0x88>
  12043. 802643a: 2f00 cmp r7, #0
  12044. 802643c: bf0c ite eq
  12045. 802643e: 4625 moveq r5, r4
  12046. 8026440: 2501 movne r5, #1
  12047. 8026442: e000 b.n 8026446 <TM_RTC_GetUnixTimeStamp+0x8a>
  12048. 8026444: 4625 mov r5, r4
  12049. 8026446: fb08 3505 mla r5, r8, r5, r3
  12050. 802644a: 3301 adds r3, #1
  12051. 802644c: f81c 5005 ldrb.w r5, [ip, r5]
  12052. 8026450: 1949 adds r1, r1, r5
  12053. /* Days in back years */
  12054. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  12055. days += TM_RTC_DAYS_IN_YEAR(i);
  12056. }
  12057. /* Days in current year */
  12058. for (i = 1; i < data->month; i++) {
  12059. 8026452: 1c5d adds r5, r3, #1
  12060. 8026454: b2ad uxth r5, r5
  12061. 8026456: 42b5 cmp r5, r6
  12062. 8026458: d3ee bcc.n 8026438 <TM_RTC_GetUnixTimeStamp+0x7c>
  12063. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  12064. }
  12065. /* Day starts with 1 */
  12066. days += data->date - 1;
  12067. 802645a: 79c3 ldrb r3, [r0, #7]
  12068. seconds = days * TM_RTC_SECONDS_PER_DAY;
  12069. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  12070. 802645c: 7944 ldrb r4, [r0, #5]
  12071. /* Days in current year */
  12072. for (i = 1; i < data->month; i++) {
  12073. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  12074. }
  12075. /* Day starts with 1 */
  12076. days += data->date - 1;
  12077. 802645e: 3b01 subs r3, #1
  12078. 8026460: 1859 adds r1, r3, r1
  12079. seconds = days * TM_RTC_SECONDS_PER_DAY;
  12080. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  12081. seconds += data->minutes * TM_RTC_SECONDS_PER_MINUTE;
  12082. 8026462: 7903 ldrb r3, [r0, #4]
  12083. 8026464: 009a lsls r2, r3, #2
  12084. 8026466: 019b lsls r3, r3, #6
  12085. 8026468: 1a9a subs r2, r3, r2
  12086. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  12087. }
  12088. /* Day starts with 1 */
  12089. days += data->date - 1;
  12090. seconds = days * TM_RTC_SECONDS_PER_DAY;
  12091. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  12092. 802646a: f44f 6361 mov.w r3, #3600 ; 0xe10
  12093. 802646e: fb03 2304 mla r3, r3, r4, r2
  12094. seconds += data->minutes * TM_RTC_SECONDS_PER_MINUTE;
  12095. seconds += data->seconds;
  12096. 8026472: 7802 ldrb r2, [r0, #0]
  12097. /* seconds = days * 86400; */
  12098. return seconds;
  12099. }
  12100. 8026474: 4802 ldr r0, [pc, #8] ; (8026480 <TM_RTC_GetUnixTimeStamp+0xc4>)
  12101. }
  12102. /* Day starts with 1 */
  12103. days += data->date - 1;
  12104. seconds = days * TM_RTC_SECONDS_PER_DAY;
  12105. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  12106. seconds += data->minutes * TM_RTC_SECONDS_PER_MINUTE;
  12107. 8026476: 189b adds r3, r3, r2
  12108. seconds += data->seconds;
  12109. /* seconds = days * 86400; */
  12110. return seconds;
  12111. }
  12112. 8026478: fb00 3001 mla r0, r0, r1, r3
  12113. 802647c: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  12114. 8026480: 00015180 .word 0x00015180
  12115. 8026484: 20000648 .word 0x20000648
  12116. 08026488 <TM_RTC_GetDateTime>:
  12117. /* Return status from set date time function */
  12118. return TM_RTC_SetDateTime(&tmp, TM_RTC_Format_BIN);
  12119. }
  12120. void TM_RTC_GetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  12121. 8026488: b538 push {r3, r4, r5, lr}
  12122. 802648a: 4604 mov r4, r0
  12123. uint32_t unix;
  12124. /* Get time */
  12125. if (format == TM_RTC_Format_BIN) {
  12126. 802648c: 460d mov r5, r1
  12127. 802648e: b909 cbnz r1, 8026494 <TM_RTC_GetDateTime+0xc>
  12128. RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);
  12129. 8026490: 4608 mov r0, r1
  12130. 8026492: e000 b.n 8026496 <TM_RTC_GetDateTime+0xe>
  12131. } else {
  12132. RTC_GetTime(RTC_Format_BCD, &RTC_TimeStruct);
  12133. 8026494: 2001 movs r0, #1
  12134. 8026496: 4911 ldr r1, [pc, #68] ; (80264dc <TM_RTC_GetDateTime+0x54>)
  12135. 8026498: f7ff fa9e bl 80259d8 <RTC_GetTime>
  12136. }
  12137. /* Format hours */
  12138. data->hours = RTC_TimeStruct.RTC_Hours;
  12139. 802649c: 4b0f ldr r3, [pc, #60] ; (80264dc <TM_RTC_GetDateTime+0x54>)
  12140. 802649e: 781a ldrb r2, [r3, #0]
  12141. 80264a0: 7162 strb r2, [r4, #5]
  12142. data->minutes = RTC_TimeStruct.RTC_Minutes;
  12143. 80264a2: 785a ldrb r2, [r3, #1]
  12144. data->seconds = RTC_TimeStruct.RTC_Seconds;
  12145. 80264a4: 789b ldrb r3, [r3, #2]
  12146. RTC_GetTime(RTC_Format_BCD, &RTC_TimeStruct);
  12147. }
  12148. /* Format hours */
  12149. data->hours = RTC_TimeStruct.RTC_Hours;
  12150. data->minutes = RTC_TimeStruct.RTC_Minutes;
  12151. 80264a6: 7122 strb r2, [r4, #4]
  12152. data->seconds = RTC_TimeStruct.RTC_Seconds;
  12153. 80264a8: 7023 strb r3, [r4, #0]
  12154. /* Get subseconds */
  12155. data->subseconds = RTC->SSR;
  12156. 80264aa: 4b0d ldr r3, [pc, #52] ; (80264e0 <TM_RTC_GetDateTime+0x58>)
  12157. 80264ac: 6a9b ldr r3, [r3, #40] ; 0x28
  12158. 80264ae: 8063 strh r3, [r4, #2]
  12159. /* Get date */
  12160. if (format == TM_RTC_Format_BIN) {
  12161. 80264b0: b90d cbnz r5, 80264b6 <TM_RTC_GetDateTime+0x2e>
  12162. RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
  12163. 80264b2: 4628 mov r0, r5
  12164. 80264b4: e000 b.n 80264b8 <TM_RTC_GetDateTime+0x30>
  12165. } else {
  12166. RTC_GetDate(RTC_Format_BCD, &RTC_DateStruct);
  12167. 80264b6: 2001 movs r0, #1
  12168. 80264b8: 490a ldr r1, [pc, #40] ; (80264e4 <TM_RTC_GetDateTime+0x5c>)
  12169. 80264ba: f7ff faf9 bl 8025ab0 <RTC_GetDate>
  12170. }
  12171. /* Format date */
  12172. data->year = RTC_DateStruct.RTC_Year;
  12173. 80264be: 4b09 ldr r3, [pc, #36] ; (80264e4 <TM_RTC_GetDateTime+0x5c>)
  12174. 80264c0: 78da ldrb r2, [r3, #3]
  12175. 80264c2: 7262 strb r2, [r4, #9]
  12176. data->month = RTC_DateStruct.RTC_Month;
  12177. 80264c4: 785a ldrb r2, [r3, #1]
  12178. 80264c6: 7222 strb r2, [r4, #8]
  12179. data->date = RTC_DateStruct.RTC_Date;
  12180. 80264c8: 789a ldrb r2, [r3, #2]
  12181. data->day = RTC_DateStruct.RTC_WeekDay;
  12182. 80264ca: 781b ldrb r3, [r3, #0]
  12183. }
  12184. /* Format date */
  12185. data->year = RTC_DateStruct.RTC_Year;
  12186. data->month = RTC_DateStruct.RTC_Month;
  12187. data->date = RTC_DateStruct.RTC_Date;
  12188. 80264cc: 71e2 strb r2, [r4, #7]
  12189. data->day = RTC_DateStruct.RTC_WeekDay;
  12190. 80264ce: 71a3 strb r3, [r4, #6]
  12191. /* Calculate unix offset */
  12192. unix = TM_RTC_GetUnixTimeStamp(data);
  12193. 80264d0: 4620 mov r0, r4
  12194. 80264d2: f7ff ff73 bl 80263bc <TM_RTC_GetUnixTimeStamp>
  12195. data->unix = unix;
  12196. 80264d6: 60e0 str r0, [r4, #12]
  12197. 80264d8: bd38 pop {r3, r4, r5, pc}
  12198. 80264da: bf00 nop
  12199. 80264dc: 2000e51c .word 0x2000e51c
  12200. 80264e0: 40002800 .word 0x40002800
  12201. 80264e4: 2000e52c .word 0x2000e52c
  12202. 080264e8 <TM_RTC_Init>:
  12203. }
  12204. }
  12205. uint32_t TM_RTC_Init(TM_RTC_ClockSource_t source)
  12206. {
  12207. 80264e8: b5f0 push {r4, r5, r6, r7, lr}
  12208. uint32_t status;
  12209. uint8_t stat = 1;
  12210. TM_RTC_t datatime;
  12211. /* Enable PWR peripheral clock */
  12212. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  12213. 80264ea: 2101 movs r1, #1
  12214. }
  12215. }
  12216. uint32_t TM_RTC_Init(TM_RTC_ClockSource_t source)
  12217. {
  12218. 80264ec: b085 sub sp, #20
  12219. 80264ee: 4605 mov r5, r0
  12220. uint32_t status;
  12221. uint8_t stat = 1;
  12222. TM_RTC_t datatime;
  12223. /* Enable PWR peripheral clock */
  12224. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  12225. 80264f0: f04f 5080 mov.w r0, #268435456 ; 0x10000000
  12226. 80264f4: f7ff f942 bl 802577c <RCC_APB1PeriphClockCmd>
  12227. /* Allow access to BKP Domain */
  12228. PWR_BackupAccessCmd(ENABLE);
  12229. 80264f8: 2001 movs r0, #1
  12230. 80264fa: f7ff f8a7 bl 802564c <PWR_BackupAccessCmd>
  12231. /* Get RTC status */
  12232. status = RTC_ReadBackupRegister(RTC_STATUS_REG);
  12233. 80264fe: 2013 movs r0, #19
  12234. 8026500: f7ff fb06 bl 8025b10 <RTC_ReadBackupRegister>
  12235. if (status == RTC_STATUS_TIME_OK)
  12236. 8026504: f244 3321 movw r3, #17185 ; 0x4321
  12237. 8026508: 4298 cmp r0, r3
  12238. 802650a: 4e25 ldr r6, [pc, #148] ; (80265a0 <TM_RTC_Init+0xb8>)
  12239. 802650c: d113 bne.n 8026536 <TM_RTC_Init+0x4e>
  12240. {
  12241. TM_RTC_Status = RTC_STATUS_TIME_OK;
  12242. 802650e: 6030 str r0, [r6, #0]
  12243. /* Start internal clock if we choose internal clock */
  12244. if (source == TM_RTC_ClockSource_Internal)
  12245. 8026510: b915 cbnz r5, 8026518 <TM_RTC_Init+0x30>
  12246. TM_RTC_Config(TM_RTC_ClockSource_Internal);
  12247. 8026512: 4628 mov r0, r5
  12248. 8026514: f7ff ff2b bl 802636e <TM_RTC_Config>
  12249. /* Wait for RTC APB registers synchronisation (needed after start-up from Reset) */
  12250. RTC_WaitForSynchro();
  12251. 8026518: f7ff f9f0 bl 80258fc <RTC_WaitForSynchro>
  12252. /* Clear interrupt flags */
  12253. RTC_ClearITPendingBit(RTC_IT_WUT);
  12254. 802651c: f44f 4080 mov.w r0, #16384 ; 0x4000
  12255. 8026520: f7ff fb1e bl 8025b60 <RTC_ClearITPendingBit>
  12256. EXTI->PR = 0x00400000;
  12257. 8026524: 4b1f ldr r3, [pc, #124] ; (80265a4 <TM_RTC_Init+0xbc>)
  12258. 8026526: f44f 0280 mov.w r2, #4194304 ; 0x400000
  12259. 802652a: 615a str r2, [r3, #20]
  12260. /* Get date and time */
  12261. TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN);
  12262. 802652c: 4668 mov r0, sp
  12263. 802652e: 2100 movs r1, #0
  12264. 8026530: f7ff ffaa bl 8026488 <TM_RTC_GetDateTime>
  12265. 8026534: e02f b.n 8026596 <TM_RTC_Init+0xae>
  12266. }
  12267. else if (status == RTC_STATUS_INIT_OK)
  12268. 8026536: f241 2734 movw r7, #4660 ; 0x1234
  12269. 802653a: 42b8 cmp r0, r7
  12270. 802653c: d10f bne.n 802655e <TM_RTC_Init+0x76>
  12271. {
  12272. TM_RTC_Status = RTC_STATUS_INIT_OK;
  12273. 802653e: 6030 str r0, [r6, #0]
  12274. /* Start internal clock if we choose internal clock */
  12275. if (source == TM_RTC_ClockSource_Internal)
  12276. 8026540: b915 cbnz r5, 8026548 <TM_RTC_Init+0x60>
  12277. TM_RTC_Config(TM_RTC_ClockSource_Internal);
  12278. 8026542: 4628 mov r0, r5
  12279. 8026544: f7ff ff13 bl 802636e <TM_RTC_Config>
  12280. /* Wait for RTC APB registers synchronisation (needed after start-up from Reset) */
  12281. RTC_WaitForSynchro();
  12282. 8026548: f7ff f9d8 bl 80258fc <RTC_WaitForSynchro>
  12283. /* Clear interrupt flags */
  12284. RTC_ClearITPendingBit(RTC_IT_WUT);
  12285. 802654c: f44f 4080 mov.w r0, #16384 ; 0x4000
  12286. 8026550: f7ff fb06 bl 8025b60 <RTC_ClearITPendingBit>
  12287. EXTI->PR = 0x00400000;
  12288. 8026554: 4b13 ldr r3, [pc, #76] ; (80265a4 <TM_RTC_Init+0xbc>)
  12289. 8026556: f44f 0280 mov.w r2, #4194304 ; 0x400000
  12290. 802655a: 615a str r2, [r3, #20]
  12291. 802655c: e01b b.n 8026596 <TM_RTC_Init+0xae>
  12292. /* Get date and time */
  12293. //TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN);
  12294. }
  12295. else
  12296. {
  12297. TM_RTC_Status = RTC_STATUS_ZERO;
  12298. 802655e: 2400 movs r4, #0
  12299. /* Return status = 0 -> RTC Never initialized before */
  12300. stat = RTC_STATUS_ZERO;
  12301. /* Config RTC */
  12302. TM_RTC_Config(source);
  12303. 8026560: 4628 mov r0, r5
  12304. /* Get date and time */
  12305. //TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN);
  12306. }
  12307. else
  12308. {
  12309. TM_RTC_Status = RTC_STATUS_ZERO;
  12310. 8026562: 6034 str r4, [r6, #0]
  12311. /* Return status = 0 -> RTC Never initialized before */
  12312. stat = RTC_STATUS_ZERO;
  12313. /* Config RTC */
  12314. TM_RTC_Config(source);
  12315. 8026564: f7ff ff03 bl 802636e <TM_RTC_Config>
  12316. datatime.day = 1;
  12317. datatime.month = 1;
  12318. datatime.year = 0;
  12319. datatime.hours = 0;
  12320. datatime.minutes = 0;
  12321. datatime.seconds = 0;
  12322. 8026568: a804 add r0, sp, #16
  12323. stat = RTC_STATUS_ZERO;
  12324. /* Config RTC */
  12325. TM_RTC_Config(source);
  12326. /* Set date and time */
  12327. datatime.date = 1;
  12328. 802656a: 2301 movs r3, #1
  12329. datatime.day = 1;
  12330. datatime.month = 1;
  12331. datatime.year = 0;
  12332. datatime.hours = 0;
  12333. datatime.minutes = 0;
  12334. datatime.seconds = 0;
  12335. 802656c: f800 4d10 strb.w r4, [r0, #-16]!
  12336. /* Set date and time */
  12337. TM_RTC_SetDateTime(&datatime, TM_RTC_Format_BIN);
  12338. 8026570: 4621 mov r1, r4
  12339. 8026572: 4668 mov r0, sp
  12340. stat = RTC_STATUS_ZERO;
  12341. /* Config RTC */
  12342. TM_RTC_Config(source);
  12343. /* Set date and time */
  12344. datatime.date = 1;
  12345. 8026574: f88d 3007 strb.w r3, [sp, #7]
  12346. datatime.day = 1;
  12347. 8026578: f88d 3006 strb.w r3, [sp, #6]
  12348. datatime.month = 1;
  12349. 802657c: f88d 3008 strb.w r3, [sp, #8]
  12350. datatime.year = 0;
  12351. 8026580: f88d 4009 strb.w r4, [sp, #9]
  12352. datatime.hours = 0;
  12353. 8026584: f88d 4005 strb.w r4, [sp, #5]
  12354. datatime.minutes = 0;
  12355. 8026588: f88d 4004 strb.w r4, [sp, #4]
  12356. datatime.seconds = 0;
  12357. /* Set date and time */
  12358. TM_RTC_SetDateTime(&datatime, TM_RTC_Format_BIN);
  12359. 802658c: f7ff fda0 bl 80260d0 <TM_RTC_SetDateTime>
  12360. /* Initialized OK */
  12361. TM_RTC_Status = RTC_STATUS_INIT_OK;
  12362. 8026590: 6037 str r7, [r6, #0]
  12363. }
  12364. /* If first time initialized */
  12365. if (stat == RTC_STATUS_ZERO)
  12366. return 0;
  12367. 8026592: 4620 mov r0, r4
  12368. 8026594: e001 b.n 802659a <TM_RTC_Init+0xb2>
  12369. return TM_RTC_Status;
  12370. 8026596: 4b02 ldr r3, [pc, #8] ; (80265a0 <TM_RTC_Init+0xb8>)
  12371. 8026598: 6818 ldr r0, [r3, #0]
  12372. }
  12373. 802659a: b005 add sp, #20
  12374. 802659c: bdf0 pop {r4, r5, r6, r7, pc}
  12375. 802659e: bf00 nop
  12376. 80265a0: 20001950 .word 0x20001950
  12377. 80265a4: 40013c00 .word 0x40013c00
  12378. 080265a8 <TM_RTC_GetDateTimeFromUnix>:
  12379. uint16_t year;
  12380. /* Store unix time to unix in struct */
  12381. data->unix = unix;
  12382. /* Get seconds from unix */
  12383. data->seconds = unix % 60;
  12384. 80265a8: 233c movs r3, #60 ; 0x3c
  12385. /* seconds = days * 86400; */
  12386. return seconds;
  12387. }
  12388. void TM_RTC_GetDateTimeFromUnix(TM_RTC_t* data, uint32_t unix) {
  12389. 80265aa: b5f0 push {r4, r5, r6, r7, lr}
  12390. uint16_t year;
  12391. /* Store unix time to unix in struct */
  12392. data->unix = unix;
  12393. /* Get seconds from unix */
  12394. data->seconds = unix % 60;
  12395. 80265ac: fbb1 f4f3 udiv r4, r1, r3
  12396. /* Go to minutes */
  12397. unix /= 60;
  12398. /* Get minutes */
  12399. data->minutes = unix % 60;
  12400. 80265b0: fbb4 f2f3 udiv r2, r4, r3
  12401. void TM_RTC_GetDateTimeFromUnix(TM_RTC_t* data, uint32_t unix) {
  12402. uint16_t year;
  12403. /* Store unix time to unix in struct */
  12404. data->unix = unix;
  12405. 80265b4: 60c1 str r1, [r0, #12]
  12406. /* Get seconds from unix */
  12407. data->seconds = unix % 60;
  12408. 80265b6: fb03 1114 mls r1, r3, r4, r1
  12409. 80265ba: 7001 strb r1, [r0, #0]
  12410. /* Go to minutes */
  12411. unix /= 60;
  12412. /* Get minutes */
  12413. data->minutes = unix % 60;
  12414. 80265bc: fb03 4312 mls r3, r3, r2, r4
  12415. /* Go to hours */
  12416. unix /= 60;
  12417. /* Get hours */
  12418. data->hours = unix % 24;
  12419. 80265c0: 2118 movs r1, #24
  12420. /* Get seconds from unix */
  12421. data->seconds = unix % 60;
  12422. /* Go to minutes */
  12423. unix /= 60;
  12424. /* Get minutes */
  12425. data->minutes = unix % 60;
  12426. 80265c2: 7103 strb r3, [r0, #4]
  12427. /* Go to hours */
  12428. unix /= 60;
  12429. /* Get hours */
  12430. data->hours = unix % 24;
  12431. 80265c4: fbb2 f3f1 udiv r3, r2, r1
  12432. 80265c8: fb01 2213 mls r2, r1, r3, r2
  12433. 80265cc: 7142 strb r2, [r0, #5]
  12434. /* Go to days */
  12435. unix /= 24;
  12436. /* Get week day */
  12437. /* Monday is day one */
  12438. data->day = (unix + 3) % 7 + 1;
  12439. 80265ce: 1cd9 adds r1, r3, #3
  12440. 80265d0: 2207 movs r2, #7
  12441. 80265d2: fbb1 f4f2 udiv r4, r1, r2
  12442. 80265d6: fb02 1214 mls r2, r2, r4, r1
  12443. 80265da: 3201 adds r2, #1
  12444. 80265dc: 7182 strb r2, [r0, #6]
  12445. /* Get year */
  12446. year = 1970;
  12447. while (1) {
  12448. if (TM_RTC_LEAP_YEAR(year)) {
  12449. if (unix >= 366) {
  12450. 80265de: f240 156d movw r5, #365 ; 0x16d
  12451. /* Get week day */
  12452. /* Monday is day one */
  12453. data->day = (unix + 3) % 7 + 1;
  12454. /* Get year */
  12455. year = 1970;
  12456. 80265e2: f240 72b2 movw r2, #1970 ; 0x7b2
  12457. while (1) {
  12458. if (TM_RTC_LEAP_YEAR(year)) {
  12459. 80265e6: f44f 71c8 mov.w r1, #400 ; 0x190
  12460. 80265ea: 2464 movs r4, #100 ; 0x64
  12461. 80265ec: f012 0603 ands.w r6, r2, #3
  12462. 80265f0: d105 bne.n 80265fe <TM_RTC_GetDateTimeFromUnix+0x56>
  12463. 80265f2: fbb2 f7f4 udiv r7, r2, r4
  12464. 80265f6: fb04 2717 mls r7, r4, r7, r2
  12465. 80265fa: b2bf uxth r7, r7
  12466. 80265fc: b92f cbnz r7, 802660a <TM_RTC_GetDateTimeFromUnix+0x62>
  12467. 80265fe: fbb2 f7f1 udiv r7, r2, r1
  12468. 8026602: fb01 2717 mls r7, r1, r7, r2
  12469. 8026606: b2bf uxth r7, r7
  12470. 8026608: b927 cbnz r7, 8026614 <TM_RTC_GetDateTimeFromUnix+0x6c>
  12471. if (unix >= 366) {
  12472. 802660a: 42ab cmp r3, r5
  12473. 802660c: d90b bls.n 8026626 <TM_RTC_GetDateTimeFromUnix+0x7e>
  12474. unix -= 366;
  12475. 802660e: f5a3 73b7 sub.w r3, r3, #366 ; 0x16e
  12476. /* Get year */
  12477. year = 1970;
  12478. while (1) {
  12479. if (TM_RTC_LEAP_YEAR(year)) {
  12480. if (unix >= 366) {
  12481. 8026612: e005 b.n 8026620 <TM_RTC_GetDateTimeFromUnix+0x78>
  12482. unix -= 366;
  12483. } else {
  12484. break;
  12485. }
  12486. } else if (unix >= 365) {
  12487. 8026614: f5b3 7fb6 cmp.w r3, #364 ; 0x16c
  12488. 8026618: d905 bls.n 8026626 <TM_RTC_GetDateTimeFromUnix+0x7e>
  12489. unix -= 365;
  12490. 802661a: f46f 76b6 mvn.w r6, #364 ; 0x16c
  12491. 802661e: 199b adds r3, r3, r6
  12492. } else {
  12493. break;
  12494. }
  12495. year++;
  12496. 8026620: 3201 adds r2, #1
  12497. 8026622: b292 uxth r2, r2
  12498. }
  12499. 8026624: e7e2 b.n 80265ec <TM_RTC_GetDateTimeFromUnix+0x44>
  12500. /* Get year in xx format */
  12501. data->year = (uint8_t) (year - 2000);
  12502. 8026626: f102 0130 add.w r1, r2, #48 ; 0x30
  12503. 802662a: 7241 strb r1, [r0, #9]
  12504. /* Get month */
  12505. for (data->month = 0; data->month < 12; data->month++) {
  12506. 802662c: 2100 movs r1, #0
  12507. 802662e: 7201 strb r1, [r0, #8]
  12508. if (TM_RTC_LEAP_YEAR(year) && unix >= (uint32_t)TM_RTC_Months[1][data->month]) {
  12509. 8026630: 2164 movs r1, #100 ; 0x64
  12510. 8026632: fbb2 f7f1 udiv r7, r2, r1
  12511. 8026636: fb01 2117 mls r1, r1, r7, r2
  12512. 802663a: b28f uxth r7, r1
  12513. 802663c: f44f 71c8 mov.w r1, #400 ; 0x190
  12514. 8026640: fbb2 f4f1 udiv r4, r2, r1
  12515. 8026644: fb01 2214 mls r2, r1, r4, r2
  12516. 8026648: b292 uxth r2, r2
  12517. unix -= TM_RTC_Months[1][data->month];
  12518. } else if (unix >= (uint32_t)TM_RTC_Months[0][data->month]) {
  12519. 802664a: 4c0c ldr r4, [pc, #48] ; (802667c <TM_RTC_GetDateTimeFromUnix+0xd4>)
  12520. year++;
  12521. }
  12522. /* Get year in xx format */
  12523. data->year = (uint8_t) (year - 2000);
  12524. /* Get month */
  12525. for (data->month = 0; data->month < 12; data->month++) {
  12526. 802664c: e012 b.n 8026674 <TM_RTC_GetDateTimeFromUnix+0xcc>
  12527. if (TM_RTC_LEAP_YEAR(year) && unix >= (uint32_t)TM_RTC_Months[1][data->month]) {
  12528. 802664e: b906 cbnz r6, 8026652 <TM_RTC_GetDateTimeFromUnix+0xaa>
  12529. 8026650: b907 cbnz r7, 8026654 <TM_RTC_GetDateTimeFromUnix+0xac>
  12530. 8026652: b922 cbnz r2, 802665e <TM_RTC_GetDateTimeFromUnix+0xb6>
  12531. 8026654: 1865 adds r5, r4, r1
  12532. 8026656: 7b2d ldrb r5, [r5, #12]
  12533. 8026658: 42ab cmp r3, r5
  12534. 802665a: d300 bcc.n 802665e <TM_RTC_GetDateTimeFromUnix+0xb6>
  12535. 802665c: e007 b.n 802666e <TM_RTC_GetDateTimeFromUnix+0xc6>
  12536. unix -= TM_RTC_Months[1][data->month];
  12537. } else if (unix >= (uint32_t)TM_RTC_Months[0][data->month]) {
  12538. 802665e: 5c65 ldrb r5, [r4, r1]
  12539. 8026660: 42ab cmp r3, r5
  12540. 8026662: d204 bcs.n 802666e <TM_RTC_GetDateTimeFromUnix+0xc6>
  12541. break;
  12542. }
  12543. }
  12544. /* Get month */
  12545. /* Month starts with 1 */
  12546. data->month++;
  12547. 8026664: 3101 adds r1, #1
  12548. /* Get date */
  12549. /* Date starts with 1 */
  12550. data->date = unix + 1;
  12551. 8026666: 3301 adds r3, #1
  12552. break;
  12553. }
  12554. }
  12555. /* Get month */
  12556. /* Month starts with 1 */
  12557. data->month++;
  12558. 8026668: 7201 strb r1, [r0, #8]
  12559. /* Get date */
  12560. /* Date starts with 1 */
  12561. data->date = unix + 1;
  12562. 802666a: 71c3 strb r3, [r0, #7]
  12563. 802666c: bdf0 pop {r4, r5, r6, r7, pc}
  12564. year++;
  12565. }
  12566. /* Get year in xx format */
  12567. data->year = (uint8_t) (year - 2000);
  12568. /* Get month */
  12569. for (data->month = 0; data->month < 12; data->month++) {
  12570. 802666e: 3101 adds r1, #1
  12571. if (TM_RTC_LEAP_YEAR(year) && unix >= (uint32_t)TM_RTC_Months[1][data->month]) {
  12572. unix -= TM_RTC_Months[1][data->month];
  12573. } else if (unix >= (uint32_t)TM_RTC_Months[0][data->month]) {
  12574. unix -= TM_RTC_Months[0][data->month];
  12575. 8026670: 1b5b subs r3, r3, r5
  12576. year++;
  12577. }
  12578. /* Get year in xx format */
  12579. data->year = (uint8_t) (year - 2000);
  12580. /* Get month */
  12581. for (data->month = 0; data->month < 12; data->month++) {
  12582. 8026672: 7201 strb r1, [r0, #8]
  12583. 8026674: 7a01 ldrb r1, [r0, #8]
  12584. 8026676: 290b cmp r1, #11
  12585. 8026678: d9e9 bls.n 802664e <TM_RTC_GetDateTimeFromUnix+0xa6>
  12586. 802667a: e7f3 b.n 8026664 <TM_RTC_GetDateTimeFromUnix+0xbc>
  12587. 802667c: 20000648 .word 0x20000648
  12588. 08026680 <TM_RTC_Correction>:
  12589. * @brief Кореектировака времени.
  12590. * @param Часовой пояс
  12591. * @retval
  12592. */
  12593. void TM_RTC_Correction(float utc)
  12594. {
  12595. 8026680: b510 push {r4, lr}
  12596. 8026682: b088 sub sp, #32
  12597. 8026684: 4604 mov r4, r0
  12598. TM_RTC_t newData;
  12599. int utcSec;
  12600. uint32_t unixTime;
  12601. /* Получаем текущее время */
  12602. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  12603. 8026686: 2100 movs r1, #0
  12604. 8026688: 4668 mov r0, sp
  12605. 802668a: f7ff fefd bl 8026488 <TM_RTC_GetDateTime>
  12606. /* Рассчитываем поправку */
  12607. utcSec = (int)(3600.0*utc);
  12608. 802668e: 4620 mov r0, r4
  12609. 8026690: f7f9 ff42 bl 8020518 <__aeabi_f2d>
  12610. 8026694: a308 add r3, pc, #32 ; (adr r3, 80266b8 <TM_RTC_Correction+0x38>)
  12611. 8026696: e9d3 2300 ldrd r2, r3, [r3]
  12612. 802669a: f7f9 ff91 bl 80205c0 <__aeabi_dmul>
  12613. 802669e: f7fa fa29 bl 8020af4 <__aeabi_d2iz>
  12614. unixTime = data.unix + utcSec;
  12615. 80266a2: 9903 ldr r1, [sp, #12]
  12616. 80266a4: 1841 adds r1, r0, r1
  12617. /* Устанавливаем новое время */
  12618. TM_RTC_GetDateTimeFromUnix(&newData, unixTime);
  12619. 80266a6: a804 add r0, sp, #16
  12620. 80266a8: f7ff ff7e bl 80265a8 <TM_RTC_GetDateTimeFromUnix>
  12621. TM_RTC_SetDateTime(&newData, TM_RTC_Format_BIN);
  12622. 80266ac: a804 add r0, sp, #16
  12623. 80266ae: 2100 movs r1, #0
  12624. 80266b0: f7ff fd0e bl 80260d0 <TM_RTC_SetDateTime>
  12625. }
  12626. 80266b4: b008 add sp, #32
  12627. 80266b6: bd10 pop {r4, pc}
  12628. 80266b8: 00000000 .word 0x00000000
  12629. 80266bc: 40ac2000 .word 0x40ac2000
  12630. 080266c0 <TM_RTC_SetDataTimeUnix>:
  12631. return TM_RTC_Status;
  12632. }
  12633. void TM_RTC_SetDataTimeUnix(uint32_t unixTime)
  12634. {
  12635. 80266c0: b51f push {r0, r1, r2, r3, r4, lr}
  12636. 80266c2: 4601 mov r1, r0
  12637. TM_RTC_t data;
  12638. TM_RTC_GetDateTimeFromUnix(&data, unixTime);
  12639. 80266c4: 4668 mov r0, sp
  12640. 80266c6: f7ff ff6f bl 80265a8 <TM_RTC_GetDateTimeFromUnix>
  12641. TM_RTC_SetDateTime(&data, TM_RTC_Format_BIN);
  12642. 80266ca: 4668 mov r0, sp
  12643. 80266cc: 2100 movs r1, #0
  12644. 80266ce: f7ff fcff bl 80260d0 <TM_RTC_SetDateTime>
  12645. }
  12646. 80266d2: b005 add sp, #20
  12647. 80266d4: bd00 pop {pc}
  12648. 080266d6 <TM_RTC_RequestHandler>:
  12649. /* Read data from backup register */
  12650. return *(uint32_t *)((&RTC->BKP0R) + 4 * location);
  12651. }
  12652. /* Callbacks */
  12653. __weak void TM_RTC_RequestHandler(void) {
  12654. 80266d6: 4770 bx lr
  12655. 080266d8 <TM_RTC_AlarmAHandler>:
  12656. /* If user needs this function, then they should be defined separatelly in your project */
  12657. }
  12658. __weak void TM_RTC_AlarmAHandler(void) {
  12659. 80266d8: 4770 bx lr
  12660. 080266da <TM_RTC_AlarmBHandler>:
  12661. /* If user needs this function, then they should be defined separatelly in your project */
  12662. }
  12663. __weak void TM_RTC_AlarmBHandler(void) {
  12664. 80266da: 4770 bx lr
  12665. 080266dc <RTC_WKUP_IRQHandler>:
  12666. /* If user needs this function, then they should be defined separatelly in your project */
  12667. }
  12668. /* Private RTC IRQ handlers */
  12669. void RTC_WKUP_IRQHandler(void) {
  12670. 80266dc: b508 push {r3, lr}
  12671. /* Check for RTC interrupt */
  12672. if (RTC_GetITStatus(RTC_IT_WUT) != RESET) {
  12673. 80266de: f44f 4080 mov.w r0, #16384 ; 0x4000
  12674. 80266e2: f7ff fa25 bl 8025b30 <RTC_GetITStatus>
  12675. 80266e6: b128 cbz r0, 80266f4 <RTC_WKUP_IRQHandler+0x18>
  12676. /* Clear interrupt flags */
  12677. RTC_ClearITPendingBit(RTC_IT_WUT);
  12678. 80266e8: f44f 4080 mov.w r0, #16384 ; 0x4000
  12679. 80266ec: f7ff fa38 bl 8025b60 <RTC_ClearITPendingBit>
  12680. /* Call user function */
  12681. TM_RTC_RequestHandler();
  12682. 80266f0: f7ff fff1 bl 80266d6 <TM_RTC_RequestHandler>
  12683. }
  12684. /* Clear EXTI line 22 bit */
  12685. EXTI->PR = 0x00400000;
  12686. 80266f4: 4b02 ldr r3, [pc, #8] ; (8026700 <RTC_WKUP_IRQHandler+0x24>)
  12687. 80266f6: f44f 0280 mov.w r2, #4194304 ; 0x400000
  12688. 80266fa: 615a str r2, [r3, #20]
  12689. 80266fc: bd08 pop {r3, pc}
  12690. 80266fe: bf00 nop
  12691. 8026700: 40013c00 .word 0x40013c00
  12692. 08026704 <RTC_Alarm_IRQHandler>:
  12693. }
  12694. void RTC_Alarm_IRQHandler(void) {
  12695. 8026704: b508 push {r3, lr}
  12696. /* RTC Alarm A check */
  12697. if (RTC_GetITStatus(RTC_IT_ALRA) != RESET) {
  12698. 8026706: f44f 5080 mov.w r0, #4096 ; 0x1000
  12699. 802670a: f7ff fa11 bl 8025b30 <RTC_GetITStatus>
  12700. 802670e: b128 cbz r0, 802671c <RTC_Alarm_IRQHandler+0x18>
  12701. /* Clear RTC Alarm A interrupt flag */
  12702. RTC_ClearITPendingBit(RTC_IT_ALRA);
  12703. 8026710: f44f 5080 mov.w r0, #4096 ; 0x1000
  12704. 8026714: f7ff fa24 bl 8025b60 <RTC_ClearITPendingBit>
  12705. /* Call user function for Alarm A */
  12706. TM_RTC_AlarmAHandler();
  12707. 8026718: f7ff ffde bl 80266d8 <TM_RTC_AlarmAHandler>
  12708. }
  12709. /* RTC Alarm B check */
  12710. if (RTC_GetITStatus(RTC_IT_ALRB) != RESET) {
  12711. 802671c: f44f 5000 mov.w r0, #8192 ; 0x2000
  12712. 8026720: f7ff fa06 bl 8025b30 <RTC_GetITStatus>
  12713. 8026724: b128 cbz r0, 8026732 <RTC_Alarm_IRQHandler+0x2e>
  12714. /* Clear RTC Alarm A interrupt flag */
  12715. RTC_ClearITPendingBit(RTC_IT_ALRB);
  12716. 8026726: f44f 5000 mov.w r0, #8192 ; 0x2000
  12717. 802672a: f7ff fa19 bl 8025b60 <RTC_ClearITPendingBit>
  12718. /* Call user function for Alarm B */
  12719. TM_RTC_AlarmBHandler();
  12720. 802672e: f7ff ffd4 bl 80266da <TM_RTC_AlarmBHandler>
  12721. }
  12722. /* Clear EXTI line 17 bit */
  12723. EXTI->PR = 0x00020000;
  12724. 8026732: 4b02 ldr r3, [pc, #8] ; (802673c <RTC_Alarm_IRQHandler+0x38>)
  12725. 8026734: f44f 3200 mov.w r2, #131072 ; 0x20000
  12726. 8026738: 615a str r2, [r3, #20]
  12727. 802673a: bd08 pop {r3, pc}
  12728. 802673c: 40013c00 .word 0x40013c00
  12729. 08026740 <RTC_SetProfTime>:
  12730. /**
  12731. * @brief Установливает время срабатывания профилактики сульфатации
  12732. */
  12733. void RTC_SetProfTime(char *str)
  12734. {
  12735. 8026740: b530 push {r4, r5, lr}
  12736. uint32_t unixTime;
  12737. uint8_t i = 0;
  12738. /* Get date */
  12739. tmp.date = 0;
  12740. while (TM_RTC_CHARISNUM(*(str + i))) {
  12741. 8026742: 2200 movs r2, #0
  12742. /**
  12743. * @brief Установливает время срабатывания профилактики сульфатации
  12744. */
  12745. void RTC_SetProfTime(char *str)
  12746. {
  12747. 8026744: b085 sub sp, #20
  12748. TM_RTC_t tmp;
  12749. uint32_t unixTime;
  12750. uint8_t i = 0;
  12751. 8026746: 4613 mov r3, r2
  12752. /* Get date */
  12753. tmp.date = 0;
  12754. while (TM_RTC_CHARISNUM(*(str + i))) {
  12755. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12756. 8026748: 250a movs r5, #10
  12757. uint32_t unixTime;
  12758. uint8_t i = 0;
  12759. /* Get date */
  12760. tmp.date = 0;
  12761. while (TM_RTC_CHARISNUM(*(str + i))) {
  12762. 802674a: e006 b.n 802675a <RTC_SetProfTime+0x1a>
  12763. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12764. 802674c: fb05 1202 mla r2, r5, r2, r1
  12765. 8026750: 3a30 subs r2, #48 ; 0x30
  12766. i++;
  12767. 8026752: 3301 adds r3, #1
  12768. uint8_t i = 0;
  12769. /* Get date */
  12770. tmp.date = 0;
  12771. while (TM_RTC_CHARISNUM(*(str + i))) {
  12772. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12773. 8026754: f002 02ff and.w r2, r2, #255 ; 0xff
  12774. i++;
  12775. 8026758: b2db uxtb r3, r3
  12776. uint32_t unixTime;
  12777. uint8_t i = 0;
  12778. /* Get date */
  12779. tmp.date = 0;
  12780. while (TM_RTC_CHARISNUM(*(str + i))) {
  12781. 802675a: 5cc1 ldrb r1, [r0, r3]
  12782. 802675c: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12783. 8026760: 2c09 cmp r4, #9
  12784. 8026762: d9f3 bls.n 802674c <RTC_SetProfTime+0xc>
  12785. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12786. i++;
  12787. }
  12788. i++;
  12789. 8026764: 3301 adds r3, #1
  12790. 8026766: f88d 2007 strb.w r2, [sp, #7]
  12791. 802676a: b2db uxtb r3, r3
  12792. /* Get month */
  12793. tmp.month = 0;
  12794. while (TM_RTC_CHARISNUM(*(str + i))) {
  12795. 802676c: 2200 movs r2, #0
  12796. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12797. 802676e: 250a movs r5, #10
  12798. }
  12799. i++;
  12800. /* Get month */
  12801. tmp.month = 0;
  12802. while (TM_RTC_CHARISNUM(*(str + i))) {
  12803. 8026770: e006 b.n 8026780 <RTC_SetProfTime+0x40>
  12804. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12805. 8026772: fb05 1202 mla r2, r5, r2, r1
  12806. 8026776: 3a30 subs r2, #48 ; 0x30
  12807. i++;
  12808. 8026778: 3301 adds r3, #1
  12809. i++;
  12810. /* Get month */
  12811. tmp.month = 0;
  12812. while (TM_RTC_CHARISNUM(*(str + i))) {
  12813. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12814. 802677a: f002 02ff and.w r2, r2, #255 ; 0xff
  12815. i++;
  12816. 802677e: b2db uxtb r3, r3
  12817. }
  12818. i++;
  12819. /* Get month */
  12820. tmp.month = 0;
  12821. while (TM_RTC_CHARISNUM(*(str + i))) {
  12822. 8026780: 5cc1 ldrb r1, [r0, r3]
  12823. 8026782: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12824. 8026786: 2c09 cmp r4, #9
  12825. 8026788: d9f3 bls.n 8026772 <RTC_SetProfTime+0x32>
  12826. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12827. i++;
  12828. }
  12829. //i++;
  12830. i+=3;
  12831. 802678a: 3303 adds r3, #3
  12832. 802678c: f88d 2008 strb.w r2, [sp, #8]
  12833. 8026790: b2db uxtb r3, r3
  12834. /* Get year */
  12835. tmp.year = 0;
  12836. while (TM_RTC_CHARISNUM(*(str + i))) {
  12837. 8026792: 2200 movs r2, #0
  12838. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12839. 8026794: 250a movs r5, #10
  12840. //i++;
  12841. i+=3;
  12842. /* Get year */
  12843. tmp.year = 0;
  12844. while (TM_RTC_CHARISNUM(*(str + i))) {
  12845. 8026796: e006 b.n 80267a6 <RTC_SetProfTime+0x66>
  12846. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12847. 8026798: fb05 1202 mla r2, r5, r2, r1
  12848. 802679c: 3a30 subs r2, #48 ; 0x30
  12849. i++;
  12850. 802679e: 3301 adds r3, #1
  12851. i+=3;
  12852. /* Get year */
  12853. tmp.year = 0;
  12854. while (TM_RTC_CHARISNUM(*(str + i))) {
  12855. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12856. 80267a0: f002 02ff and.w r2, r2, #255 ; 0xff
  12857. i++;
  12858. 80267a4: b2db uxtb r3, r3
  12859. //i++;
  12860. i+=3;
  12861. /* Get year */
  12862. tmp.year = 0;
  12863. while (TM_RTC_CHARISNUM(*(str + i))) {
  12864. 80267a6: 5cc1 ldrb r1, [r0, r3]
  12865. 80267a8: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12866. 80267ac: 2c09 cmp r4, #9
  12867. 80267ae: d9f3 bls.n 8026798 <RTC_SetProfTime+0x58>
  12868. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12869. i++;
  12870. }
  12871. i++;
  12872. i++;
  12873. 80267b0: 3302 adds r3, #2
  12874. 80267b2: f88d 2009 strb.w r2, [sp, #9]
  12875. 80267b6: b2db uxtb r3, r3
  12876. /* Get hours */
  12877. tmp.hours = 0;
  12878. while (TM_RTC_CHARISNUM(*(str + i))) {
  12879. 80267b8: 2200 movs r2, #0
  12880. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12881. 80267ba: 250a movs r5, #10
  12882. i++;
  12883. i++;
  12884. /* Get hours */
  12885. tmp.hours = 0;
  12886. while (TM_RTC_CHARISNUM(*(str + i))) {
  12887. 80267bc: e006 b.n 80267cc <RTC_SetProfTime+0x8c>
  12888. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12889. 80267be: fb05 1202 mla r2, r5, r2, r1
  12890. 80267c2: 3a30 subs r2, #48 ; 0x30
  12891. i++;
  12892. 80267c4: 3301 adds r3, #1
  12893. i++;
  12894. /* Get hours */
  12895. tmp.hours = 0;
  12896. while (TM_RTC_CHARISNUM(*(str + i))) {
  12897. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12898. 80267c6: f002 02ff and.w r2, r2, #255 ; 0xff
  12899. i++;
  12900. 80267ca: b2db uxtb r3, r3
  12901. i++;
  12902. i++;
  12903. /* Get hours */
  12904. tmp.hours = 0;
  12905. while (TM_RTC_CHARISNUM(*(str + i))) {
  12906. 80267cc: 5cc1 ldrb r1, [r0, r3]
  12907. 80267ce: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12908. 80267d2: 2c09 cmp r4, #9
  12909. 80267d4: d9f3 bls.n 80267be <RTC_SetProfTime+0x7e>
  12910. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12911. i++;
  12912. }
  12913. i++;
  12914. 80267d6: 3301 adds r3, #1
  12915. 80267d8: f88d 2005 strb.w r2, [sp, #5]
  12916. 80267dc: b2db uxtb r3, r3
  12917. /* Get minutes */
  12918. tmp.minutes = 0;
  12919. while (TM_RTC_CHARISNUM(*(str + i))) {
  12920. 80267de: 2200 movs r2, #0
  12921. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12922. 80267e0: 250a movs r5, #10
  12923. }
  12924. i++;
  12925. /* Get minutes */
  12926. tmp.minutes = 0;
  12927. while (TM_RTC_CHARISNUM(*(str + i))) {
  12928. 80267e2: e006 b.n 80267f2 <RTC_SetProfTime+0xb2>
  12929. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12930. 80267e4: fb05 1202 mla r2, r5, r2, r1
  12931. 80267e8: 3a30 subs r2, #48 ; 0x30
  12932. i++;
  12933. 80267ea: 3301 adds r3, #1
  12934. i++;
  12935. /* Get minutes */
  12936. tmp.minutes = 0;
  12937. while (TM_RTC_CHARISNUM(*(str + i))) {
  12938. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12939. 80267ec: f002 02ff and.w r2, r2, #255 ; 0xff
  12940. i++;
  12941. 80267f0: b2db uxtb r3, r3
  12942. }
  12943. i++;
  12944. /* Get minutes */
  12945. tmp.minutes = 0;
  12946. while (TM_RTC_CHARISNUM(*(str + i))) {
  12947. 80267f2: 5cc1 ldrb r1, [r0, r3]
  12948. 80267f4: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12949. 80267f8: 2c09 cmp r4, #9
  12950. 80267fa: d9f3 bls.n 80267e4 <RTC_SetProfTime+0xa4>
  12951. i++;
  12952. }
  12953. i++;
  12954. /* Get seconds */
  12955. tmp.seconds = 0;
  12956. 80267fc: 2300 movs r3, #0
  12957. 80267fe: f88d 3000 strb.w r3, [sp]
  12958. /* Устанавливаем +1 для профилактики */
  12959. tmp.year += 1;
  12960. 8026802: f89d 3009 ldrb.w r3, [sp, #9]
  12961. 8026806: f88d 2004 strb.w r2, [sp, #4]
  12962. 802680a: 3301 adds r3, #1
  12963. unixTime = TM_RTC_GetUnixTimeStamp(&tmp);
  12964. 802680c: 4668 mov r0, sp
  12965. /* Get seconds */
  12966. tmp.seconds = 0;
  12967. /* Устанавливаем +1 для профилактики */
  12968. tmp.year += 1;
  12969. 802680e: f88d 3009 strb.w r3, [sp, #9]
  12970. unixTime = TM_RTC_GetUnixTimeStamp(&tmp);
  12971. 8026812: f7ff fdd3 bl 80263bc <TM_RTC_GetUnixTimeStamp>
  12972. if (location > 18) {
  12973. return;
  12974. }
  12975. /* Write data to backup register */
  12976. *(uint32_t *)((&RTC->BKP0R) + 4 * location) = value;
  12977. 8026816: 4b02 ldr r3, [pc, #8] ; (8026820 <RTC_SetProfTime+0xe0>)
  12978. 8026818: 6018 str r0, [r3, #0]
  12979. /* Устанавливаем +1 для профилактики */
  12980. tmp.year += 1;
  12981. unixTime = TM_RTC_GetUnixTimeStamp(&tmp);
  12982. TM_RTC_WriteBackupRegister(RTC_BKP_DR0, unixTime);
  12983. 802681a: b005 add sp, #20
  12984. 802681c: bd30 pop {r4, r5, pc}
  12985. 802681e: bf00 nop
  12986. 8026820: 40002850 .word 0x40002850
  12987. 08026824 <spi_tx_rx>:
  12988. //static TN_MUTEX spi_mutex;
  12989. static uint8_t spi_tx_rx(uint8_t byte) {
  12990. while (!(SPI2->SR & SPI_SR_TXE)) {}
  12991. 8026824: 4907 ldr r1, [pc, #28] ; (8026844 <spi_tx_rx+0x20>)
  12992. 8026826: 890a ldrh r2, [r1, #8]
  12993. 8026828: 4b06 ldr r3, [pc, #24] ; (8026844 <spi_tx_rx+0x20>)
  12994. 802682a: f002 0202 and.w r2, r2, #2
  12995. 802682e: b292 uxth r2, r2
  12996. 8026830: 2a00 cmp r2, #0
  12997. 8026832: d0f8 beq.n 8026826 <spi_tx_rx+0x2>
  12998. SPI2->DR = byte;
  12999. 8026834: 8198 strh r0, [r3, #12]
  13000. while (!(SPI2->SR & SPI_SR_RXNE)) {}
  13001. 8026836: 891a ldrh r2, [r3, #8]
  13002. 8026838: 07d2 lsls r2, r2, #31
  13003. 802683a: d5fc bpl.n 8026836 <spi_tx_rx+0x12>
  13004. return SPI2->DR;
  13005. 802683c: 4b01 ldr r3, [pc, #4] ; (8026844 <spi_tx_rx+0x20>)
  13006. 802683e: 8998 ldrh r0, [r3, #12]
  13007. }
  13008. 8026840: b2c0 uxtb r0, r0
  13009. 8026842: 4770 bx lr
  13010. 8026844: 40003800 .word 0x40003800
  13011. 08026848 <send_addr>:
  13012. status = spi_tx_rx(0);
  13013. } while (status & SR_WIP);
  13014. SPI_FLASH_CS_H();
  13015. }
  13016. static inline void send_addr(int addr) {
  13017. 8026848: b510 push {r4, lr}
  13018. 802684a: 4604 mov r4, r0
  13019. spi_tx_rx((addr >> 16) & 0xFF);
  13020. 802684c: f3c0 4007 ubfx r0, r0, #16, #8
  13021. 8026850: f7ff ffe8 bl 8026824 <spi_tx_rx>
  13022. spi_tx_rx((addr >> 8) & 0xFF);
  13023. 8026854: f3c4 2007 ubfx r0, r4, #8, #8
  13024. 8026858: f7ff ffe4 bl 8026824 <spi_tx_rx>
  13025. spi_tx_rx(addr & 0xFF);
  13026. 802685c: b2e0 uxtb r0, r4
  13027. }
  13028. 802685e: e8bd 4010 ldmia.w sp!, {r4, lr}
  13029. }
  13030. static inline void send_addr(int addr) {
  13031. spi_tx_rx((addr >> 16) & 0xFF);
  13032. spi_tx_rx((addr >> 8) & 0xFF);
  13033. spi_tx_rx(addr & 0xFF);
  13034. 8026862: f7ff bfdf b.w 8026824 <spi_tx_rx>
  13035. 08026866 <wait_write_enable>:
  13036. spi_flash_desc_t spi_flash_desc;
  13037. static inline void wait_write_enable(void) {
  13038. uint8_t status;
  13039. // spi_cs_down();
  13040. SPI_FLASH_CS_L();
  13041. 8026866: 2005 movs r0, #5
  13042. #define SR_WEL (1 << 1)
  13043. #define SR_SRWD (1 << 7)
  13044. spi_flash_desc_t spi_flash_desc;
  13045. static inline void wait_write_enable(void) {
  13046. 8026868: b508 push {r3, lr}
  13047. uint8_t status;
  13048. // spi_cs_down();
  13049. SPI_FLASH_CS_L();
  13050. 802686a: 2100 movs r1, #0
  13051. 802686c: f7ff fb60 bl 8025f30 <gpio_set>
  13052. spi_tx_rx(CMD_RDSR);
  13053. 8026870: 2005 movs r0, #5
  13054. 8026872: f7ff ffd7 bl 8026824 <spi_tx_rx>
  13055. do {
  13056. status = spi_tx_rx(0);
  13057. 8026876: 2000 movs r0, #0
  13058. 8026878: f7ff ffd4 bl 8026824 <spi_tx_rx>
  13059. } while (!(status & SR_WEL));
  13060. 802687c: f000 0002 and.w r0, r0, #2
  13061. 8026880: b2c0 uxtb r0, r0
  13062. 8026882: 2800 cmp r0, #0
  13063. 8026884: d0f7 beq.n 8026876 <wait_write_enable+0x10>
  13064. // spi_cs_up();
  13065. SPI_FLASH_CS_H();
  13066. 8026886: 2005 movs r0, #5
  13067. 8026888: 2101 movs r1, #1
  13068. }
  13069. 802688a: e8bd 4008 ldmia.w sp!, {r3, lr}
  13070. spi_tx_rx(CMD_RDSR);
  13071. do {
  13072. status = spi_tx_rx(0);
  13073. } while (!(status & SR_WEL));
  13074. // spi_cs_up();
  13075. SPI_FLASH_CS_H();
  13076. 802688e: f7ff bb4f b.w 8025f30 <gpio_set>
  13077. 08026892 <wait_write_end>:
  13078. }
  13079. static inline void wait_write_end(void) {
  13080. uint8_t status;
  13081. SPI_FLASH_CS_L();
  13082. 8026892: 2005 movs r0, #5
  13083. } while (!(status & SR_WEL));
  13084. // spi_cs_up();
  13085. SPI_FLASH_CS_H();
  13086. }
  13087. static inline void wait_write_end(void) {
  13088. 8026894: b508 push {r3, lr}
  13089. uint8_t status;
  13090. SPI_FLASH_CS_L();
  13091. 8026896: 2100 movs r1, #0
  13092. 8026898: f7ff fb4a bl 8025f30 <gpio_set>
  13093. spi_tx_rx(CMD_RDSR);
  13094. 802689c: 2005 movs r0, #5
  13095. 802689e: f7ff ffc1 bl 8026824 <spi_tx_rx>
  13096. do {
  13097. status = spi_tx_rx(0);
  13098. 80268a2: 2000 movs r0, #0
  13099. 80268a4: f7ff ffbe bl 8026824 <spi_tx_rx>
  13100. } while (status & SR_WIP);
  13101. 80268a8: 07c1 lsls r1, r0, #31
  13102. 80268aa: d4fa bmi.n 80268a2 <wait_write_end+0x10>
  13103. SPI_FLASH_CS_H();
  13104. 80268ac: 2005 movs r0, #5
  13105. 80268ae: 2101 movs r1, #1
  13106. }
  13107. 80268b0: e8bd 4008 ldmia.w sp!, {r3, lr}
  13108. SPI_FLASH_CS_L();
  13109. spi_tx_rx(CMD_RDSR);
  13110. do {
  13111. status = spi_tx_rx(0);
  13112. } while (status & SR_WIP);
  13113. SPI_FLASH_CS_H();
  13114. 80268b4: f7ff bb3c b.w 8025f30 <gpio_set>
  13115. 080268b8 <spi_flash_read>:
  13116. *((uint8_t *)buf++) = spi_tx_rx(0);
  13117. SPI_FLASH_CS_H();
  13118. return 0;
  13119. }
  13120. ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout) {
  13121. 80268b8: b570 push {r4, r5, r6, lr}
  13122. 80268ba: 4605 mov r5, r0
  13123. 80268bc: 460c mov r4, r1
  13124. ssize_t ret = 0;
  13125. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13126. // if (ret != TERR_NO_ERR)
  13127. // return ret;
  13128. SPI_FLASH_CS_L();
  13129. 80268be: 2005 movs r0, #5
  13130. 80268c0: 2100 movs r1, #0
  13131. *((uint8_t *)buf++) = spi_tx_rx(0);
  13132. SPI_FLASH_CS_H();
  13133. return 0;
  13134. }
  13135. ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout) {
  13136. 80268c2: 4616 mov r6, r2
  13137. ssize_t ret = 0;
  13138. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13139. // if (ret != TERR_NO_ERR)
  13140. // return ret;
  13141. SPI_FLASH_CS_L();
  13142. 80268c4: f7ff fb34 bl 8025f30 <gpio_set>
  13143. spi_tx_rx(CMD_READ);
  13144. 80268c8: 2003 movs r0, #3
  13145. 80268ca: f7ff ffab bl 8026824 <spi_tx_rx>
  13146. send_addr(addr);
  13147. 80268ce: 4628 mov r0, r5
  13148. 80268d0: f7ff ffba bl 8026848 <send_addr>
  13149. *((uint8_t *)buf++) = spi_tx_rx(0);
  13150. SPI_FLASH_CS_H();
  13151. return 0;
  13152. }
  13153. ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout) {
  13154. 80268d4: 19a6 adds r6, r4, r6
  13155. // return ret;
  13156. SPI_FLASH_CS_L();
  13157. spi_tx_rx(CMD_READ);
  13158. send_addr(addr);
  13159. while (len--)
  13160. 80268d6: e004 b.n 80268e2 <spi_flash_read+0x2a>
  13161. *((uint8_t *)buf++) = spi_tx_rx(0);
  13162. 80268d8: 2000 movs r0, #0
  13163. 80268da: f7ff ffa3 bl 8026824 <spi_tx_rx>
  13164. 80268de: f804 0b01 strb.w r0, [r4], #1
  13165. // return ret;
  13166. SPI_FLASH_CS_L();
  13167. spi_tx_rx(CMD_READ);
  13168. send_addr(addr);
  13169. while (len--)
  13170. 80268e2: 42b4 cmp r4, r6
  13171. 80268e4: d1f8 bne.n 80268d8 <spi_flash_read+0x20>
  13172. *((uint8_t *)buf++) = spi_tx_rx(0);
  13173. SPI_FLASH_CS_H();
  13174. 80268e6: 2005 movs r0, #5
  13175. 80268e8: 2101 movs r1, #1
  13176. 80268ea: f7ff fb21 bl 8025f30 <gpio_set>
  13177. // tn_mutex_unlock(&spi_mutex);
  13178. return len;
  13179. }
  13180. 80268ee: f04f 30ff mov.w r0, #4294967295
  13181. 80268f2: bd70 pop {r4, r5, r6, pc}
  13182. 080268f4 <spi_flash_pp>:
  13183. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13184. // if (ret != TERR_NO_ERR)
  13185. // return ret;
  13186. // don't allow page wrapping
  13187. ssize_t ret = 0;
  13188. if ((addr & 0xFF) + len > 0xFF)
  13189. 80268f4: b2c3 uxtb r3, r0
  13190. return len;
  13191. }
  13192. #define TIMEOUT 10000
  13193. uint16_t spi_flash_pp(int addr, const void *buf, size_t len, uint32_t timeout) {
  13194. 80268f6: b570 push {r4, r5, r6, lr}
  13195. 80268f8: 4615 mov r5, r2
  13196. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13197. // if (ret != TERR_NO_ERR)
  13198. // return ret;
  13199. // don't allow page wrapping
  13200. ssize_t ret = 0;
  13201. if ((addr & 0xFF) + len > 0xFF)
  13202. 80268fa: 18d2 adds r2, r2, r3
  13203. 80268fc: 2aff cmp r2, #255 ; 0xff
  13204. len = 0x100 - (addr & 0xFF);
  13205. 80268fe: bf88 it hi
  13206. 8026900: f5c3 7580 rsbhi r5, r3, #256 ; 0x100
  13207. return len;
  13208. }
  13209. #define TIMEOUT 10000
  13210. uint16_t spi_flash_pp(int addr, const void *buf, size_t len, uint32_t timeout) {
  13211. 8026904: 4604 mov r4, r0
  13212. 8026906: 460e mov r6, r1
  13213. ssize_t ret = 0;
  13214. if ((addr & 0xFF) + len > 0xFF)
  13215. len = 0x100 - (addr & 0xFF);
  13216. ret = len;
  13217. SPI_FLASH_CS_L();
  13218. 8026908: 2005 movs r0, #5
  13219. 802690a: 2100 movs r1, #0
  13220. 802690c: f7ff fb10 bl 8025f30 <gpio_set>
  13221. spi_tx_rx(CMD_WREN);
  13222. 8026910: 2006 movs r0, #6
  13223. 8026912: f7ff ff87 bl 8026824 <spi_tx_rx>
  13224. SPI_FLASH_CS_H();
  13225. 8026916: 2005 movs r0, #5
  13226. 8026918: 2101 movs r1, #1
  13227. 802691a: f7ff fb09 bl 8025f30 <gpio_set>
  13228. wait_write_enable();
  13229. 802691e: f7ff ffa2 bl 8026866 <wait_write_enable>
  13230. SPI_FLASH_CS_L();
  13231. 8026922: 2100 movs r1, #0
  13232. 8026924: 2005 movs r0, #5
  13233. 8026926: f7ff fb03 bl 8025f30 <gpio_set>
  13234. spi_tx_rx(CMD_PP);
  13235. 802692a: 2002 movs r0, #2
  13236. 802692c: f7ff ff7a bl 8026824 <spi_tx_rx>
  13237. send_addr(addr);
  13238. 8026930: 4620 mov r0, r4
  13239. 8026932: f7ff ff89 bl 8026848 <send_addr>
  13240. while (len--)
  13241. 8026936: 2400 movs r4, #0
  13242. 8026938: e003 b.n 8026942 <spi_flash_pp+0x4e>
  13243. spi_tx_rx(*((uint8_t *)buf++));
  13244. 802693a: 5d30 ldrb r0, [r6, r4]
  13245. 802693c: f7ff ff72 bl 8026824 <spi_tx_rx>
  13246. 8026940: 3401 adds r4, #1
  13247. wait_write_enable();
  13248. SPI_FLASH_CS_L();
  13249. spi_tx_rx(CMD_PP);
  13250. send_addr(addr);
  13251. while (len--)
  13252. 8026942: 42ac cmp r4, r5
  13253. 8026944: d1f9 bne.n 802693a <spi_flash_pp+0x46>
  13254. spi_tx_rx(*((uint8_t *)buf++));
  13255. SPI_FLASH_CS_H();
  13256. 8026946: 2005 movs r0, #5
  13257. 8026948: 2101 movs r1, #1
  13258. 802694a: f7ff faf1 bl 8025f30 <gpio_set>
  13259. wait_write_end();
  13260. 802694e: f7ff ffa0 bl 8026892 <wait_write_end>
  13261. // tn_mutex_unlock(&spi_mutex);
  13262. return ret;
  13263. }
  13264. 8026952: b2a0 uxth r0, r4
  13265. 8026954: bd70 pop {r4, r5, r6, pc}
  13266. 08026956 <spi_flash_write>:
  13267. ssize_t spi_flash_write(int addr, const void *buf, size_t len, uint32_t timeout) {
  13268. 8026956: b5f8 push {r3, r4, r5, r6, r7, lr}
  13269. 8026958: 4607 mov r7, r0
  13270. 802695a: 460e mov r6, r1
  13271. 802695c: 4615 mov r5, r2
  13272. int ret = 0, offset = 0;
  13273. 802695e: 2400 movs r4, #0
  13274. do {
  13275. ret = spi_flash_pp(addr + offset, buf + offset, len - offset, 0);
  13276. 8026960: 1938 adds r0, r7, r4
  13277. 8026962: 1931 adds r1, r6, r4
  13278. 8026964: 1b2a subs r2, r5, r4
  13279. 8026966: 2300 movs r3, #0
  13280. 8026968: f7ff ffc4 bl 80268f4 <spi_flash_pp>
  13281. offset += ret;
  13282. 802696c: 1824 adds r4, r4, r0
  13283. } while (len - offset);
  13284. 802696e: 42a5 cmp r5, r4
  13285. 8026970: d1f6 bne.n 8026960 <spi_flash_write+0xa>
  13286. return 0;
  13287. }
  13288. 8026972: 2000 movs r0, #0
  13289. 8026974: bdf8 pop {r3, r4, r5, r6, r7, pc}
  13290. 08026976 <spi_flash_erase_sector>:
  13291. wait_write_end();
  13292. return 0;
  13293. }
  13294. int spi_flash_erase_sector(int addr, uint32_t timeout) {
  13295. 8026976: b510 push {r4, lr}
  13296. int ret = 0;
  13297. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13298. // if (ret != TERR_NO_ERR)
  13299. // return ret;
  13300. SPI_FLASH_CS_L();
  13301. 8026978: 2100 movs r1, #0
  13302. wait_write_end();
  13303. return 0;
  13304. }
  13305. int spi_flash_erase_sector(int addr, uint32_t timeout) {
  13306. 802697a: 4604 mov r4, r0
  13307. int ret = 0;
  13308. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13309. // if (ret != TERR_NO_ERR)
  13310. // return ret;
  13311. SPI_FLASH_CS_L();
  13312. 802697c: 2005 movs r0, #5
  13313. 802697e: f7ff fad7 bl 8025f30 <gpio_set>
  13314. spi_tx_rx(CMD_WREN);
  13315. 8026982: 2006 movs r0, #6
  13316. 8026984: f7ff ff4e bl 8026824 <spi_tx_rx>
  13317. SPI_FLASH_CS_H();
  13318. 8026988: 2005 movs r0, #5
  13319. 802698a: 2101 movs r1, #1
  13320. 802698c: f7ff fad0 bl 8025f30 <gpio_set>
  13321. wait_write_enable();
  13322. 8026990: f7ff ff69 bl 8026866 <wait_write_enable>
  13323. SPI_FLASH_CS_L();
  13324. 8026994: 2100 movs r1, #0
  13325. 8026996: 2005 movs r0, #5
  13326. 8026998: f7ff faca bl 8025f30 <gpio_set>
  13327. spi_tx_rx(CMD_SE);
  13328. 802699c: 2020 movs r0, #32
  13329. 802699e: f7ff ff41 bl 8026824 <spi_tx_rx>
  13330. send_addr(addr);
  13331. 80269a2: 4620 mov r0, r4
  13332. 80269a4: f7ff ff50 bl 8026848 <send_addr>
  13333. SPI_FLASH_CS_H();
  13334. 80269a8: 2005 movs r0, #5
  13335. 80269aa: 2101 movs r1, #1
  13336. 80269ac: f7ff fac0 bl 8025f30 <gpio_set>
  13337. wait_write_end();
  13338. 80269b0: f7ff ff6f bl 8026892 <wait_write_end>
  13339. // tn_mutex_unlock(&spi_mutex);
  13340. return 0;
  13341. }
  13342. 80269b4: 2000 movs r0, #0
  13343. 80269b6: bd10 pop {r4, pc}
  13344. 080269b8 <spi_flash_init>:
  13345. bool spi_flash_init(void) {
  13346. uint32_t i, ptable, bitsize = 0;
  13347. uint8_t tmp[4];
  13348. spi_flash_desc.present = false;
  13349. 80269b8: 4b28 ldr r3, [pc, #160] ; (8026a5c <spi_flash_init+0xa4>)
  13350. // tn_mutex_unlock(&spi_mutex);
  13351. return 0;
  13352. }
  13353. bool spi_flash_init(void) {
  13354. 80269ba: b513 push {r0, r1, r4, lr}
  13355. uint32_t i, ptable, bitsize = 0;
  13356. uint8_t tmp[4];
  13357. spi_flash_desc.present = false;
  13358. 80269bc: 2400 movs r4, #0
  13359. 80269be: 701c strb r4, [r3, #0]
  13360. static void spi_init_(void) {
  13361. // tn_mutex_create(&spi_mutex, TN_MUTEX_ATTR_INHERIT, 0);
  13362. //tn_sem_create(&xact.ready, 0, 1);
  13363. RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
  13364. 80269c0: 4b27 ldr r3, [pc, #156] ; (8026a60 <spi_flash_init+0xa8>)
  13365. 80269c2: 6c1a ldr r2, [r3, #64] ; 0x40
  13366. 80269c4: f442 4280 orr.w r2, r2, #16384 ; 0x4000
  13367. 80269c8: 641a str r2, [r3, #64] ; 0x40
  13368. RCC->APB1RSTR |= RCC_APB1RSTR_SPI2RST;
  13369. 80269ca: 6a1a ldr r2, [r3, #32]
  13370. 80269cc: f442 4200 orr.w r2, r2, #32768 ; 0x8000
  13371. 80269d0: 621a str r2, [r3, #32]
  13372. RCC->APB1RSTR &= ~RCC_APB1RSTR_SPI2RST;
  13373. 80269d2: 6a1a ldr r2, [r3, #32]
  13374. 80269d4: f422 4200 bic.w r2, r2, #32768 ; 0x8000
  13375. 80269d8: 621a str r2, [r3, #32]
  13376. SPI2->CR1 &= ~SPI_CR1_SPE;
  13377. 80269da: f5a3 3300 sub.w r3, r3, #131072 ; 0x20000
  13378. spi_tx_rx((addr >> 8) & 0xFF);
  13379. spi_tx_rx(addr & 0xFF);
  13380. }
  13381. static int spi_flash_read_sfdp(int addr, void *buf, size_t len) {
  13382. SPI_FLASH_CS_L();
  13383. 80269de: 4621 mov r1, r4
  13384. RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
  13385. RCC->APB1RSTR |= RCC_APB1RSTR_SPI2RST;
  13386. RCC->APB1RSTR &= ~RCC_APB1RSTR_SPI2RST;
  13387. SPI2->CR1 &= ~SPI_CR1_SPE;
  13388. 80269e0: 881a ldrh r2, [r3, #0]
  13389. 80269e2: f022 0240 bic.w r2, r2, #64 ; 0x40
  13390. 80269e6: 0412 lsls r2, r2, #16
  13391. 80269e8: 0c12 lsrs r2, r2, #16
  13392. 80269ea: 801a strh r2, [r3, #0]
  13393. //SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI;
  13394. SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI;
  13395. 80269ec: f44f 7241 mov.w r2, #772 ; 0x304
  13396. 80269f0: 801a strh r2, [r3, #0]
  13397. SPI2->CR2 = 0;//SPI_CR2_SSOE;
  13398. 80269f2: 809c strh r4, [r3, #4]
  13399. SPI2->CR1 |= SPI_CR1_SPE;
  13400. 80269f4: 881a ldrh r2, [r3, #0]
  13401. 80269f6: b292 uxth r2, r2
  13402. 80269f8: f042 0240 orr.w r2, r2, #64 ; 0x40
  13403. 80269fc: 801a strh r2, [r3, #0]
  13404. spi_tx_rx((addr >> 8) & 0xFF);
  13405. spi_tx_rx(addr & 0xFF);
  13406. }
  13407. static int spi_flash_read_sfdp(int addr, void *buf, size_t len) {
  13408. SPI_FLASH_CS_L();
  13409. 80269fe: 2005 movs r0, #5
  13410. 8026a00: f7ff fa96 bl 8025f30 <gpio_set>
  13411. spi_tx_rx(CMD_RDSFDP);
  13412. 8026a04: 205a movs r0, #90 ; 0x5a
  13413. 8026a06: f7ff ff0d bl 8026824 <spi_tx_rx>
  13414. send_addr(addr);
  13415. 8026a0a: 4620 mov r0, r4
  13416. 8026a0c: f7ff ff1c bl 8026848 <send_addr>
  13417. spi_tx_rx(0);
  13418. 8026a10: 4620 mov r0, r4
  13419. 8026a12: f7ff ff07 bl 8026824 <spi_tx_rx>
  13420. while (len--)
  13421. *((uint8_t *)buf++) = spi_tx_rx(0);
  13422. 8026a16: 2000 movs r0, #0
  13423. 8026a18: f7ff ff04 bl 8026824 <spi_tx_rx>
  13424. 8026a1c: ab01 add r3, sp, #4
  13425. 8026a1e: 5518 strb r0, [r3, r4]
  13426. 8026a20: 3401 adds r4, #1
  13427. static int spi_flash_read_sfdp(int addr, void *buf, size_t len) {
  13428. SPI_FLASH_CS_L();
  13429. spi_tx_rx(CMD_RDSFDP);
  13430. send_addr(addr);
  13431. spi_tx_rx(0);
  13432. while (len--)
  13433. 8026a22: 2c04 cmp r4, #4
  13434. 8026a24: d1f7 bne.n 8026a16 <spi_flash_init+0x5e>
  13435. *((uint8_t *)buf++) = spi_tx_rx(0);
  13436. SPI_FLASH_CS_H();
  13437. 8026a26: 2005 movs r0, #5
  13438. 8026a28: 2101 movs r1, #1
  13439. 8026a2a: f7ff fa81 bl 8025f30 <gpio_set>
  13440. spi_init_();
  13441. // check SFDP magic
  13442. spi_flash_read_sfdp(0, tmp, 4);
  13443. if (!(tmp[0] == 0x53 && tmp[1] == 0x46 &&
  13444. 8026a2e: f89d 3004 ldrb.w r3, [sp, #4]
  13445. 8026a32: 2b53 cmp r3, #83 ; 0x53
  13446. 8026a34: d110 bne.n 8026a58 <spi_flash_init+0xa0>
  13447. 8026a36: f89d 3005 ldrb.w r3, [sp, #5]
  13448. 8026a3a: 2b46 cmp r3, #70 ; 0x46
  13449. 8026a3c: d10c bne.n 8026a58 <spi_flash_init+0xa0>
  13450. 8026a3e: f89d 3006 ldrb.w r3, [sp, #6]
  13451. 8026a42: 2b44 cmp r3, #68 ; 0x44
  13452. 8026a44: d108 bne.n 8026a58 <spi_flash_init+0xa0>
  13453. 8026a46: f89d 0007 ldrb.w r0, [sp, #7]
  13454. 8026a4a: f1b0 0c50 subs.w ip, r0, #80 ; 0x50
  13455. 8026a4e: f1dc 0000 rsbs r0, ip, #0
  13456. 8026a52: eb50 000c adcs.w r0, r0, ip
  13457. 8026a56: e000 b.n 8026a5a <spi_flash_init+0xa2>
  13458. tmp[2] == 0x44 && tmp[3] == 0x50))
  13459. return 0;
  13460. 8026a58: 2000 movs r0, #0
  13461. if (!spi_flash_desc.sector_size)
  13462. return;
  13463. spi_flash_desc.present = true;
  13464. */
  13465. }
  13466. 8026a5a: bd1c pop {r2, r3, r4, pc}
  13467. 8026a5c: 2000e54c .word 0x2000e54c
  13468. 8026a60: 40023800 .word 0x40023800
  13469. 08026a64 <spi_flash_test>:
  13470. #define bufsize2 (countof(txbuf2)-1)
  13471. uint8_t rxbuf1[bufsize1] = {0};
  13472. uint8_t rxbuf2[bufsize2] = {0};
  13473. void spi_flash_test(void) {
  13474. 8026a64: b510 push {r4, lr}
  13475. if (!spi_flash_init())
  13476. 8026a66: f7ff ffa7 bl 80269b8 <spi_flash_init>
  13477. 8026a6a: 2800 cmp r0, #0
  13478. 8026a6c: d04a beq.n 8026b04 <spi_flash_test+0xa0>
  13479. return;
  13480. int ret = 0, addr = 0, offset = 0;
  13481. spi_flash_read(0, rxbuf1, bufsize1, 0);
  13482. 8026a6e: 2000 movs r0, #0
  13483. 8026a70: f640 62f9 movw r2, #3833 ; 0xef9
  13484. 8026a74: 4603 mov r3, r0
  13485. 8026a76: 4924 ldr r1, [pc, #144] ; (8026b08 <spi_flash_test+0xa4>)
  13486. 8026a78: f7ff ff1e bl 80268b8 <spi_flash_read>
  13487. spi_flash_erase_sector(0,0);
  13488. 8026a7c: 2000 movs r0, #0
  13489. 8026a7e: 4601 mov r1, r0
  13490. 8026a80: f7ff ff79 bl 8026976 <spi_flash_erase_sector>
  13491. spi_flash_read(0, rxbuf1, bufsize1, 0);
  13492. 8026a84: 2000 movs r0, #0
  13493. 8026a86: 4920 ldr r1, [pc, #128] ; (8026b08 <spi_flash_test+0xa4>)
  13494. 8026a88: f640 62f9 movw r2, #3833 ; 0xef9
  13495. 8026a8c: 4603 mov r3, r0
  13496. 8026a8e: f7ff ff13 bl 80268b8 <spi_flash_read>
  13497. spi_flash_write(addr, txbuf1, bufsize1, 0);
  13498. 8026a92: 2000 movs r0, #0
  13499. 8026a94: 4603 mov r3, r0
  13500. 8026a96: 491d ldr r1, [pc, #116] ; (8026b0c <spi_flash_test+0xa8>)
  13501. 8026a98: f640 62f9 movw r2, #3833 ; 0xef9
  13502. 8026a9c: f7ff ff5b bl 8026956 <spi_flash_write>
  13503. memset(rxbuf1, 0, bufsize1);
  13504. 8026aa0: 2100 movs r1, #0
  13505. 8026aa2: f640 62f9 movw r2, #3833 ; 0xef9
  13506. 8026aa6: 4818 ldr r0, [pc, #96] ; (8026b08 <spi_flash_test+0xa4>)
  13507. 8026aa8: f7fb f80a bl 8021ac0 <memset>
  13508. spi_flash_read(0, rxbuf1, bufsize1, 0);
  13509. 8026aac: 2000 movs r0, #0
  13510. 8026aae: 4916 ldr r1, [pc, #88] ; (8026b08 <spi_flash_test+0xa4>)
  13511. 8026ab0: f640 62f9 movw r2, #3833 ; 0xef9
  13512. 8026ab4: 4603 mov r3, r0
  13513. 8026ab6: f7ff feff bl 80268b8 <spi_flash_read>
  13514. if (memcmp(txbuf1, rxbuf1, bufsize1) != 0)
  13515. 8026aba: 4814 ldr r0, [pc, #80] ; (8026b0c <spi_flash_test+0xa8>)
  13516. 8026abc: 4912 ldr r1, [pc, #72] ; (8026b08 <spi_flash_test+0xa4>)
  13517. 8026abe: f640 62f9 movw r2, #3833 ; 0xef9
  13518. 8026ac2: f7fa ff11 bl 80218e8 <memcmp>
  13519. 8026ac6: 4604 mov r4, r0
  13520. 8026ac8: b9e0 cbnz r0, 8026b04 <spi_flash_test+0xa0>
  13521. return;
  13522. spi_flash_erase_sector(0,0);
  13523. 8026aca: 4601 mov r1, r0
  13524. 8026acc: f7ff ff53 bl 8026976 <spi_flash_erase_sector>
  13525. spi_flash_read(0, rxbuf1, bufsize1, 0);
  13526. 8026ad0: 4623 mov r3, r4
  13527. 8026ad2: 4620 mov r0, r4
  13528. 8026ad4: 490c ldr r1, [pc, #48] ; (8026b08 <spi_flash_test+0xa4>)
  13529. 8026ad6: f640 62f9 movw r2, #3833 ; 0xef9
  13530. 8026ada: f7ff feed bl 80268b8 <spi_flash_read>
  13531. spi_flash_write(0, txbuf2, bufsize2, 0);
  13532. 8026ade: 4623 mov r3, r4
  13533. 8026ae0: 224e movs r2, #78 ; 0x4e
  13534. 8026ae2: 4620 mov r0, r4
  13535. 8026ae4: 490a ldr r1, [pc, #40] ; (8026b10 <spi_flash_test+0xac>)
  13536. 8026ae6: f7ff ff36 bl 8026956 <spi_flash_write>
  13537. memset(rxbuf2, 0, bufsize2);
  13538. 8026aea: 4621 mov r1, r4
  13539. 8026aec: 224e movs r2, #78 ; 0x4e
  13540. 8026aee: 4809 ldr r0, [pc, #36] ; (8026b14 <spi_flash_test+0xb0>)
  13541. 8026af0: f7fa ffe6 bl 8021ac0 <memset>
  13542. spi_flash_read(0, rxbuf2, bufsize2, 0);
  13543. 8026af4: 4907 ldr r1, [pc, #28] ; (8026b14 <spi_flash_test+0xb0>)
  13544. 8026af6: 4620 mov r0, r4
  13545. 8026af8: 224e movs r2, #78 ; 0x4e
  13546. 8026afa: 4623 mov r3, r4
  13547. spi_flash_desc.sector_size,
  13548. spi_flash_desc.sector_size * spi_flash_desc.sector_count);
  13549. return 0;
  13550. */
  13551. }
  13552. 8026afc: e8bd 4010 ldmia.w sp!, {r4, lr}
  13553. spi_flash_read(0, rxbuf1, bufsize1, 0);
  13554. spi_flash_write(0, txbuf2, bufsize2, 0);
  13555. memset(rxbuf2, 0, bufsize2);
  13556. spi_flash_read(0, rxbuf2, bufsize2, 0);
  13557. 8026b00: f7ff beda b.w 80268b8 <spi_flash_read>
  13558. 8026b04: bd10 pop {r4, pc}
  13559. 8026b06: bf00 nop
  13560. 8026b08: 20001954 .word 0x20001954
  13561. 8026b0c: 200006af .word 0x200006af
  13562. 8026b10: 20000660 .word 0x20000660
  13563. 8026b14: 2000284d .word 0x2000284d
  13564. 08026b18 <NVIC_EncodePriority.constprop.0>:
  13565. \param [in] SubPriority Subpriority value (starting from 0).
  13566. \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority().
  13567. */
  13568. __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
  13569. {
  13570. uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */
  13571. 8026b18: f000 0007 and.w r0, r0, #7
  13572. uint32_t PreemptPriorityBits;
  13573. uint32_t SubPriorityBits;
  13574. PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;
  13575. 8026b1c: f1c0 0307 rsb r3, r0, #7
  13576. SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;
  13577. 8026b20: 1d02 adds r2, r0, #4
  13578. {
  13579. uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */
  13580. uint32_t PreemptPriorityBits;
  13581. uint32_t SubPriorityBits;
  13582. PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;
  13583. 8026b22: 2b04 cmp r3, #4
  13584. 8026b24: bf28 it cs
  13585. 8026b26: 2304 movcs r3, #4
  13586. SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;
  13587. 8026b28: 2a06 cmp r2, #6
  13588. 8026b2a: d901 bls.n 8026b30 <NVIC_EncodePriority.constprop.0+0x18>
  13589. 8026b2c: 3803 subs r0, #3
  13590. 8026b2e: e000 b.n 8026b32 <NVIC_EncodePriority.constprop.0+0x1a>
  13591. 8026b30: 2000 movs r0, #0
  13592. return (
  13593. ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) |
  13594. 8026b32: 2201 movs r2, #1
  13595. 8026b34: fa02 f303 lsl.w r3, r2, r3
  13596. 8026b38: 3b01 subs r3, #1
  13597. 8026b3a: f003 0305 and.w r3, r3, #5
  13598. ((SubPriority & ((1 << (SubPriorityBits )) - 1)))
  13599. );
  13600. }
  13601. 8026b3e: fa03 f000 lsl.w r0, r3, r0
  13602. 8026b42: 4770 bx lr
  13603. 08026b44 <uart_hw_init>:
  13604. uint32_t ups_tx_fifo[UPS_RBUF_SIZE];
  13605. SemaphoreHandle_t xSem_rx_buf;
  13606. USART_InitTypeDef USART_InitStructure;
  13607. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  13608. 8026b44: b570 push {r4, r5, r6, lr}
  13609. if (wordlen == 8)
  13610. wordlen_tmp = USART_WordLength_8b;
  13611. if (wordlen == 9)
  13612. wordlen_tmp = USART_WordLength_9b;
  13613. USART_InitStructure.USART_BaudRate = baud;
  13614. 8026b46: 4d34 ldr r5, [pc, #208] ; (8026c18 <uart_hw_init+0xd4>)
  13615. uint32_t ups_tx_fifo[UPS_RBUF_SIZE];
  13616. SemaphoreHandle_t xSem_rx_buf;
  13617. USART_InitTypeDef USART_InitStructure;
  13618. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  13619. 8026b48: f8bd 6010 ldrh.w r6, [sp, #16]
  13620. wordlen_tmp = USART_WordLength_9b;
  13621. USART_InitStructure.USART_BaudRate = baud;
  13622. USART_InitStructure.USART_WordLength = wordlen_tmp;
  13623. USART_InitStructure.USART_StopBits = stop;
  13624. USART_InitStructure.USART_Parity = parity;
  13625. 8026b4c: 812b strh r3, [r5, #8]
  13626. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  13627. uint16_t wordlen_tmp;
  13628. if (wordlen == 8)
  13629. wordlen_tmp = USART_WordLength_8b;
  13630. if (wordlen == 9)
  13631. 8026b4e: 2a09 cmp r2, #9
  13632. 8026b50: bf0c ite eq
  13633. 8026b52: f44f 5280 moveq.w r2, #4096 ; 0x1000
  13634. 8026b56: 2200 movne r2, #0
  13635. USART_InitStructure.USART_BaudRate = baud;
  13636. USART_InitStructure.USART_WordLength = wordlen_tmp;
  13637. USART_InitStructure.USART_StopBits = stop;
  13638. USART_InitStructure.USART_Parity = parity;
  13639. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  13640. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  13641. 8026b58: 230c movs r3, #12
  13642. if (wordlen == 9)
  13643. wordlen_tmp = USART_WordLength_9b;
  13644. USART_InitStructure.USART_BaudRate = baud;
  13645. USART_InitStructure.USART_WordLength = wordlen_tmp;
  13646. USART_InitStructure.USART_StopBits = stop;
  13647. 8026b5a: 80ee strh r6, [r5, #6]
  13648. USART_InitStructure.USART_Parity = parity;
  13649. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  13650. 8026b5c: 2600 movs r6, #0
  13651. uint32_t ups_tx_fifo[UPS_RBUF_SIZE];
  13652. SemaphoreHandle_t xSem_rx_buf;
  13653. USART_InitTypeDef USART_InitStructure;
  13654. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  13655. 8026b5e: 4604 mov r4, r0
  13656. USART_InitStructure.USART_BaudRate = baud;
  13657. USART_InitStructure.USART_WordLength = wordlen_tmp;
  13658. USART_InitStructure.USART_StopBits = stop;
  13659. USART_InitStructure.USART_Parity = parity;
  13660. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  13661. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  13662. 8026b60: 816b strh r3, [r5, #10]
  13663. if (wordlen == 8)
  13664. wordlen_tmp = USART_WordLength_8b;
  13665. if (wordlen == 9)
  13666. wordlen_tmp = USART_WordLength_9b;
  13667. USART_InitStructure.USART_BaudRate = baud;
  13668. 8026b62: 6029 str r1, [r5, #0]
  13669. USART_InitStructure.USART_WordLength = wordlen_tmp;
  13670. 8026b64: 80aa strh r2, [r5, #4]
  13671. USART_InitStructure.USART_StopBits = stop;
  13672. USART_InitStructure.USART_Parity = parity;
  13673. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  13674. 8026b66: 81ae strh r6, [r5, #12]
  13675. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  13676. USART_DeInit(uart);
  13677. 8026b68: f7ff f812 bl 8025b90 <USART_DeInit>
  13678. if (uart == USART1) {
  13679. 8026b6c: 4b2b ldr r3, [pc, #172] ; (8026c1c <uart_hw_init+0xd8>)
  13680. 8026b6e: 429c cmp r4, r3
  13681. 8026b70: d111 bne.n 8026b96 <uart_hw_init+0x52>
  13682. RCC->APB2ENR |= RCC_APB2Periph_USART1;
  13683. 8026b72: f503 3394 add.w r3, r3, #75776 ; 0x12800
  13684. 8026b76: 6c5a ldr r2, [r3, #68] ; 0x44
  13685. 8026b78: f042 0210 orr.w r2, r2, #16
  13686. 8026b7c: 645a str r2, [r3, #68] ; 0x44
  13687. \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
  13688. */
  13689. __STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void)
  13690. {
  13691. return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */
  13692. 8026b7e: 4b28 ldr r3, [pc, #160] ; (8026c20 <uart_hw_init+0xdc>)
  13693. 8026b80: 68d8 ldr r0, [r3, #12]
  13694. NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  13695. 8026b82: f3c0 2002 ubfx r0, r0, #8, #3
  13696. 8026b86: f7ff ffc7 bl 8026b18 <NVIC_EncodePriority.constprop.0>
  13697. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  13698. {
  13699. if(IRQn < 0) {
  13700. SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */
  13701. else {
  13702. NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
  13703. 8026b8a: 4b26 ldr r3, [pc, #152] ; (8026c24 <uart_hw_init+0xe0>)
  13704. 8026b8c: 0100 lsls r0, r0, #4
  13705. 8026b8e: f883 0325 strb.w r0, [r3, #805] ; 0x325
  13706. \param [in] IRQn External interrupt number. Value cannot be negative.
  13707. */
  13708. __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
  13709. {
  13710. /* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */
  13711. NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */
  13712. 8026b92: 2220 movs r2, #32
  13713. 8026b94: e028 b.n 8026be8 <uart_hw_init+0xa4>
  13714. USART_Cmd(USART1, ENABLE);
  13715. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  13716. USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
  13717. }
  13718. if (uart == USART2) {
  13719. 8026b96: 4b24 ldr r3, [pc, #144] ; (8026c28 <uart_hw_init+0xe4>)
  13720. 8026b98: 429c cmp r4, r3
  13721. 8026b9a: d111 bne.n 8026bc0 <uart_hw_init+0x7c>
  13722. RCC->APB1ENR |= RCC_APB1Periph_USART2;
  13723. 8026b9c: f503 33fa add.w r3, r3, #128000 ; 0x1f400
  13724. 8026ba0: 6c1a ldr r2, [r3, #64] ; 0x40
  13725. 8026ba2: f442 3200 orr.w r2, r2, #131072 ; 0x20000
  13726. 8026ba6: 641a str r2, [r3, #64] ; 0x40
  13727. \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
  13728. */
  13729. __STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void)
  13730. {
  13731. return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */
  13732. 8026ba8: 4b1d ldr r3, [pc, #116] ; (8026c20 <uart_hw_init+0xdc>)
  13733. 8026baa: 68d8 ldr r0, [r3, #12]
  13734. NVIC_SetPriority(USART2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  13735. 8026bac: f3c0 2002 ubfx r0, r0, #8, #3
  13736. 8026bb0: f7ff ffb2 bl 8026b18 <NVIC_EncodePriority.constprop.0>
  13737. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  13738. {
  13739. if(IRQn < 0) {
  13740. SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */
  13741. else {
  13742. NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
  13743. 8026bb4: 4b1b ldr r3, [pc, #108] ; (8026c24 <uart_hw_init+0xe0>)
  13744. 8026bb6: 0100 lsls r0, r0, #4
  13745. 8026bb8: f883 0326 strb.w r0, [r3, #806] ; 0x326
  13746. \param [in] IRQn External interrupt number. Value cannot be negative.
  13747. */
  13748. __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
  13749. {
  13750. /* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */
  13751. NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */
  13752. 8026bbc: 2240 movs r2, #64 ; 0x40
  13753. 8026bbe: e013 b.n 8026be8 <uart_hw_init+0xa4>
  13754. USART_Cmd(USART2, ENABLE);
  13755. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  13756. USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
  13757. }
  13758. if (uart == USART3) {
  13759. 8026bc0: 4b1a ldr r3, [pc, #104] ; (8026c2c <uart_hw_init+0xe8>)
  13760. 8026bc2: 429c cmp r4, r3
  13761. 8026bc4: d127 bne.n 8026c16 <uart_hw_init+0xd2>
  13762. RCC->APB1ENR |= RCC_APB1Periph_USART3;
  13763. 8026bc6: f503 33f8 add.w r3, r3, #126976 ; 0x1f000
  13764. 8026bca: 6c1a ldr r2, [r3, #64] ; 0x40
  13765. 8026bcc: f442 2280 orr.w r2, r2, #262144 ; 0x40000
  13766. 8026bd0: 641a str r2, [r3, #64] ; 0x40
  13767. \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
  13768. */
  13769. __STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void)
  13770. {
  13771. return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */
  13772. 8026bd2: 4b13 ldr r3, [pc, #76] ; (8026c20 <uart_hw_init+0xdc>)
  13773. 8026bd4: 68d8 ldr r0, [r3, #12]
  13774. NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  13775. 8026bd6: f3c0 2002 ubfx r0, r0, #8, #3
  13776. 8026bda: f7ff ff9d bl 8026b18 <NVIC_EncodePriority.constprop.0>
  13777. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  13778. {
  13779. if(IRQn < 0) {
  13780. SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */
  13781. else {
  13782. NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
  13783. 8026bde: 4b11 ldr r3, [pc, #68] ; (8026c24 <uart_hw_init+0xe0>)
  13784. 8026be0: 0100 lsls r0, r0, #4
  13785. 8026be2: f883 0327 strb.w r0, [r3, #807] ; 0x327
  13786. \param [in] IRQn External interrupt number. Value cannot be negative.
  13787. */
  13788. __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
  13789. {
  13790. /* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */
  13791. NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */
  13792. 8026be6: 2280 movs r2, #128 ; 0x80
  13793. 8026be8: 605a str r2, [r3, #4]
  13794. NVIC_EnableIRQ(USART3_IRQn);
  13795. USART_Init(USART3, &USART_InitStructure);
  13796. 8026bea: 4620 mov r0, r4
  13797. 8026bec: 4629 mov r1, r5
  13798. 8026bee: f7ff f823 bl 8025c38 <USART_Init>
  13799. USART_Cmd(USART3, ENABLE);
  13800. 8026bf2: 4620 mov r0, r4
  13801. 8026bf4: 2101 movs r1, #1
  13802. 8026bf6: f7ff f879 bl 8025cec <USART_Cmd>
  13803. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  13804. 8026bfa: 4620 mov r0, r4
  13805. 8026bfc: 2201 movs r2, #1
  13806. 8026bfe: f240 5125 movw r1, #1317 ; 0x525
  13807. 8026c02: f7ff f87f bl 8025d04 <USART_ITConfig>
  13808. USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  13809. 8026c06: 4620 mov r0, r4
  13810. 8026c08: f240 7127 movw r1, #1831 ; 0x727
  13811. 8026c0c: 4632 mov r2, r6
  13812. }
  13813. }
  13814. 8026c0e: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  13815. NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  13816. NVIC_EnableIRQ(USART3_IRQn);
  13817. USART_Init(USART3, &USART_InitStructure);
  13818. USART_Cmd(USART3, ENABLE);
  13819. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  13820. USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  13821. 8026c12: f7ff b877 b.w 8025d04 <USART_ITConfig>
  13822. 8026c16: bd70 pop {r4, r5, r6, pc}
  13823. 8026c18: 2000e898 .word 0x2000e898
  13824. 8026c1c: 40011000 .word 0x40011000
  13825. 8026c20: e000ed00 .word 0xe000ed00
  13826. 8026c24: e000e100 .word 0xe000e100
  13827. 8026c28: 40004400 .word 0x40004400
  13828. 8026c2c: 40004800 .word 0x40004800
  13829. 08026c30 <InitUSART>:
  13830. }
  13831. }
  13832. void InitUSART(void) {
  13833. 8026c30: b507 push {r0, r1, r2, lr}
  13834. xSem_rx_buf = xSemaphoreCreateCounting( UPS_RBUF_SIZE, 0 );
  13835. 8026c32: 2100 movs r1, #0
  13836. 8026c34: 2064 movs r0, #100 ; 0x64
  13837. 8026c36: f002 f943 bl 8028ec0 <xQueueCreateCountingSemaphore>
  13838. 8026c3a: 4b0a ldr r3, [pc, #40] ; (8026c64 <InitUSART+0x34>)
  13839. rbuf32_init(&ups_tx_rbuf, ups_tx_fifo, UPS_RBUF_SIZE);
  13840. 8026c3c: 490a ldr r1, [pc, #40] ; (8026c68 <InitUSART+0x38>)
  13841. USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  13842. }
  13843. }
  13844. void InitUSART(void) {
  13845. xSem_rx_buf = xSemaphoreCreateCounting( UPS_RBUF_SIZE, 0 );
  13846. 8026c3e: 6018 str r0, [r3, #0]
  13847. rbuf32_init(&ups_tx_rbuf, ups_tx_fifo, UPS_RBUF_SIZE);
  13848. 8026c40: 2264 movs r2, #100 ; 0x64
  13849. 8026c42: 480a ldr r0, [pc, #40] ; (8026c6c <InitUSART+0x3c>)
  13850. 8026c44: f001 ffe8 bl 8028c18 <rbuf32_init>
  13851. rbuf32_init(&ups_rx_rbuf, ups_rx_fifo, UPS_RBUF_SIZE);
  13852. 8026c48: 2264 movs r2, #100 ; 0x64
  13853. 8026c4a: 4809 ldr r0, [pc, #36] ; (8026c70 <InitUSART+0x40>)
  13854. 8026c4c: 4909 ldr r1, [pc, #36] ; (8026c74 <InitUSART+0x44>)
  13855. 8026c4e: f001 ffe3 bl 8028c18 <rbuf32_init>
  13856. uart_hw_init(UPS_USART, UPS_USART_BAUD, UPS_USART_WORD_LEN, UPS_USART_PARITY, UPS_USART_STOP_BIT);
  13857. 8026c52: 2300 movs r3, #0
  13858. 8026c54: 9300 str r3, [sp, #0]
  13859. 8026c56: 4808 ldr r0, [pc, #32] ; (8026c78 <InitUSART+0x48>)
  13860. 8026c58: f44f 6116 mov.w r1, #2400 ; 0x960
  13861. 8026c5c: 2208 movs r2, #8
  13862. 8026c5e: f7ff ff71 bl 8026b44 <uart_hw_init>
  13863. }
  13864. 8026c62: bd0e pop {r1, r2, r3, pc}
  13865. 8026c64: 2000e8a8 .word 0x2000e8a8
  13866. 8026c68: 2000e568 .word 0x2000e568
  13867. 8026c6c: 2000e888 .word 0x2000e888
  13868. 8026c70: 2000e558 .word 0x2000e558
  13869. 8026c74: 2000e6f8 .word 0x2000e6f8
  13870. 8026c78: 40004400 .word 0x40004400
  13871. 08026c7c <ups_send_block>:
  13872. }
  13873. int ups_send_block(void *data, uint8_t len) {
  13874. int i = 0;
  13875. uint32_t s_temp = 0;
  13876. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13877. 8026c7c: 4a0f ldr r2, [pc, #60] ; (8026cbc <ups_send_block+0x40>)
  13878. 8026c7e: 8993 ldrh r3, [r2, #12]
  13879. 8026c80: f023 0380 bic.w r3, r3, #128 ; 0x80
  13880. 8026c84: 041b lsls r3, r3, #16
  13881. 8026c86: 0c1b lsrs r3, r3, #16
  13882. rbuf32_put(&ups_tx_rbuf, (uint32_t)(byte));
  13883. }
  13884. UPS_USART->CR1 |= USART_CR1_TXEIE;
  13885. }
  13886. int ups_send_block(void *data, uint8_t len) {
  13887. 8026c88: b570 push {r4, r5, r6, lr}
  13888. 8026c8a: 4606 mov r6, r0
  13889. 8026c8c: 460d mov r5, r1
  13890. int i = 0;
  13891. uint32_t s_temp = 0;
  13892. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13893. 8026c8e: 8193 strh r3, [r2, #12]
  13894. }
  13895. UPS_USART->CR1 |= USART_CR1_TXEIE;
  13896. }
  13897. int ups_send_block(void *data, uint8_t len) {
  13898. int i = 0;
  13899. 8026c90: 2400 movs r4, #0
  13900. uint32_t s_temp = 0;
  13901. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13902. //DBG printf("STOP \r\n");
  13903. while (i < len) {
  13904. 8026c92: e008 b.n 8026ca6 <ups_send_block+0x2a>
  13905. if (!rbuf_isfull(&ups_tx_rbuf)) {
  13906. 8026c94: 480a ldr r0, [pc, #40] ; (8026cc0 <ups_send_block+0x44>)
  13907. 8026c96: f001 ffc5 bl 8028c24 <rbuf_isfull>
  13908. 8026c9a: b930 cbnz r0, 8026caa <ups_send_block+0x2e>
  13909. s_temp = ((uint8_t *)data)[i++];
  13910. 8026c9c: 5d31 ldrb r1, [r6, r4]
  13911. rbuf32_put(&ups_tx_rbuf, s_temp);
  13912. 8026c9e: 4808 ldr r0, [pc, #32] ; (8026cc0 <ups_send_block+0x44>)
  13913. uint32_t s_temp = 0;
  13914. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13915. //DBG printf("STOP \r\n");
  13916. while (i < len) {
  13917. if (!rbuf_isfull(&ups_tx_rbuf)) {
  13918. s_temp = ((uint8_t *)data)[i++];
  13919. 8026ca0: 3401 adds r4, #1
  13920. rbuf32_put(&ups_tx_rbuf, s_temp);
  13921. 8026ca2: f001 ffe0 bl 8028c66 <rbuf32_put>
  13922. int ups_send_block(void *data, uint8_t len) {
  13923. int i = 0;
  13924. uint32_t s_temp = 0;
  13925. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13926. //DBG printf("STOP \r\n");
  13927. while (i < len) {
  13928. 8026ca6: 42ac cmp r4, r5
  13929. 8026ca8: dbf4 blt.n 8026c94 <ups_send_block+0x18>
  13930. rbuf32_put(&ups_tx_rbuf, s_temp);
  13931. }
  13932. else
  13933. break;
  13934. }
  13935. UPS_USART->CR1 |= USART_CR1_TXEIE;
  13936. 8026caa: 4b04 ldr r3, [pc, #16] ; (8026cbc <ups_send_block+0x40>)
  13937. 8026cac: 899a ldrh r2, [r3, #12]
  13938. 8026cae: b292 uxth r2, r2
  13939. 8026cb0: f042 0280 orr.w r2, r2, #128 ; 0x80
  13940. 8026cb4: 819a strh r2, [r3, #12]
  13941. return i;
  13942. }
  13943. 8026cb6: 4620 mov r0, r4
  13944. 8026cb8: bd70 pop {r4, r5, r6, pc}
  13945. 8026cba: bf00 nop
  13946. 8026cbc: 40004400 .word 0x40004400
  13947. 8026cc0: 2000e888 .word 0x2000e888
  13948. 08026cc4 <ups_getchar>:
  13949. int ups_getchar(unsigned int timeout) {
  13950. int res;
  13951. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  13952. 8026cc4: 4b09 ldr r3, [pc, #36] ; (8026cec <ups_getchar+0x28>)
  13953. }
  13954. UPS_USART->CR1 |= USART_CR1_TXEIE;
  13955. return i;
  13956. }
  13957. int ups_getchar(unsigned int timeout) {
  13958. 8026cc6: b507 push {r0, r1, r2, lr}
  13959. int res;
  13960. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  13961. 8026cc8: 2100 movs r1, #0
  13962. }
  13963. UPS_USART->CR1 |= USART_CR1_TXEIE;
  13964. return i;
  13965. }
  13966. int ups_getchar(unsigned int timeout) {
  13967. 8026cca: 4602 mov r2, r0
  13968. int res;
  13969. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  13970. 8026ccc: 6818 ldr r0, [r3, #0]
  13971. 8026cce: 460b mov r3, r1
  13972. 8026cd0: f002 fa4c bl 802916c <xQueueGenericReceive>
  13973. 8026cd4: 9001 str r0, [sp, #4]
  13974. if (res == pdFALSE) {
  13975. 8026cd6: b128 cbz r0, 8026ce4 <ups_getchar+0x20>
  13976. return -1;
  13977. }
  13978. rbuf32_get(&ups_rx_rbuf, &res);
  13979. 8026cd8: 4805 ldr r0, [pc, #20] ; (8026cf0 <ups_getchar+0x2c>)
  13980. 8026cda: a901 add r1, sp, #4
  13981. 8026cdc: f001 ffae bl 8028c3c <rbuf32_get>
  13982. // DBG printf("STOP \r\n");
  13983. // DBG printf("wr: %d 0x%x\r\n", rs485_rx_rbuf.read_index,res);
  13984. return res;
  13985. 8026ce0: 9801 ldr r0, [sp, #4]
  13986. 8026ce2: e001 b.n 8026ce8 <ups_getchar+0x24>
  13987. int ups_getchar(unsigned int timeout) {
  13988. int res;
  13989. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  13990. if (res == pdFALSE) {
  13991. return -1;
  13992. 8026ce4: f04f 30ff mov.w r0, #4294967295
  13993. }
  13994. rbuf32_get(&ups_rx_rbuf, &res);
  13995. // DBG printf("STOP \r\n");
  13996. // DBG printf("wr: %d 0x%x\r\n", rs485_rx_rbuf.read_index,res);
  13997. return res;
  13998. }
  13999. 8026ce8: bd0e pop {r1, r2, r3, pc}
  14000. 8026cea: bf00 nop
  14001. 8026cec: 2000e8a8 .word 0x2000e8a8
  14002. 8026cf0: 2000e558 .word 0x2000e558
  14003. 08026cf4 <USART1_IRQHandler>:
  14004. portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  14005. }
  14006. }
  14007. void USART1_IRQHandler(void) {
  14008. 8026cf4: 4770 bx lr
  14009. 8026cf6: 0000 movs r0, r0
  14010. 08026cf8 <USART2_IRQHandler>:
  14011. }
  14012. void USART2_IRQHandler(void) {
  14013. 8026cf8: b513 push {r0, r1, r4, lr}
  14014. inline void rs232_irq_handler(void)
  14015. {
  14016. uint32_t c = 0;
  14017. 8026cfa: 2300 movs r3, #0
  14018. 8026cfc: 9301 str r3, [sp, #4]
  14019. static BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  14020. if ((UPS_USART->SR & USART_SR_ORE)) {
  14021. 8026cfe: 4b26 ldr r3, [pc, #152] ; (8026d98 <USART2_IRQHandler+0xa0>)
  14022. 8026d00: 881a ldrh r2, [r3, #0]
  14023. 8026d02: f002 0208 and.w r2, r2, #8
  14024. 8026d06: b292 uxth r2, r2
  14025. 8026d08: b112 cbz r2, 8026d10 <USART2_IRQHandler+0x18>
  14026. c = (uint32_t)UPS_USART->DR;
  14027. 8026d0a: 889b ldrh r3, [r3, #4]
  14028. 8026d0c: b29b uxth r3, r3
  14029. 8026d0e: 9301 str r3, [sp, #4]
  14030. //DBG printf("overrunRS485\r\n");
  14031. }
  14032. if (USART_GetITStatus(UPS_USART, USART_IT_TXE) != RESET) {
  14033. 8026d10: 4c21 ldr r4, [pc, #132] ; (8026d98 <USART2_IRQHandler+0xa0>)
  14034. 8026d12: f240 7127 movw r1, #1831 ; 0x727
  14035. 8026d16: 4620 mov r0, r4
  14036. 8026d18: f7ff f80d bl 8025d36 <USART_GetITStatus>
  14037. 8026d1c: b1c0 cbz r0, 8026d50 <USART2_IRQHandler+0x58>
  14038. if(rbuf32_get(&ups_tx_rbuf, &c)) {
  14039. 8026d1e: 481f ldr r0, [pc, #124] ; (8026d9c <USART2_IRQHandler+0xa4>)
  14040. 8026d20: a901 add r1, sp, #4
  14041. 8026d22: f001 ff8b bl 8028c3c <rbuf32_get>
  14042. 8026d26: b118 cbz r0, 8026d30 <USART2_IRQHandler+0x38>
  14043. UPS_USART->DR = (uint16_t)c;
  14044. 8026d28: f8bd 3004 ldrh.w r3, [sp, #4]
  14045. 8026d2c: 80a3 strh r3, [r4, #4]
  14046. 8026d2e: e00a b.n 8026d46 <USART2_IRQHandler+0x4e>
  14047. //DBG printf("wr: %d 0x%x\r\n", rs485_tx_rbuf.read_index,c);
  14048. }
  14049. else {
  14050. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  14051. 8026d30: 89a3 ldrh r3, [r4, #12]
  14052. 8026d32: f023 0380 bic.w r3, r3, #128 ; 0x80
  14053. 8026d36: 041b lsls r3, r3, #16
  14054. 8026d38: 0c1b lsrs r3, r3, #16
  14055. 8026d3a: 81a3 strh r3, [r4, #12]
  14056. UPS_USART->CR1 |= USART_CR1_RXNEIE;
  14057. 8026d3c: 89a3 ldrh r3, [r4, #12]
  14058. 8026d3e: b29b uxth r3, r3
  14059. 8026d40: f043 0320 orr.w r3, r3, #32
  14060. 8026d44: 81a3 strh r3, [r4, #12]
  14061. }
  14062. USART_ClearITPendingBit(UPS_USART, USART_IT_TXE);
  14063. 8026d46: 4814 ldr r0, [pc, #80] ; (8026d98 <USART2_IRQHandler+0xa0>)
  14064. 8026d48: f240 7127 movw r1, #1831 ; 0x727
  14065. 8026d4c: f7ff f813 bl 8025d76 <USART_ClearITPendingBit>
  14066. }
  14067. if(USART_GetITStatus(UPS_USART, USART_IT_RXNE) != RESET)
  14068. 8026d50: 4c11 ldr r4, [pc, #68] ; (8026d98 <USART2_IRQHandler+0xa0>)
  14069. 8026d52: f240 5125 movw r1, #1317 ; 0x525
  14070. 8026d56: 4620 mov r0, r4
  14071. 8026d58: f7fe ffed bl 8025d36 <USART_GetITStatus>
  14072. 8026d5c: b1d8 cbz r0, 8026d96 <USART2_IRQHandler+0x9e>
  14073. {
  14074. c = (uint32_t)UPS_USART->DR;
  14075. 8026d5e: 88a3 ldrh r3, [r4, #4]
  14076. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  14077. if (!rbuf_isfull(&ups_rx_rbuf))
  14078. 8026d60: 480f ldr r0, [pc, #60] ; (8026da0 <USART2_IRQHandler+0xa8>)
  14079. }
  14080. USART_ClearITPendingBit(UPS_USART, USART_IT_TXE);
  14081. }
  14082. if(USART_GetITStatus(UPS_USART, USART_IT_RXNE) != RESET)
  14083. {
  14084. c = (uint32_t)UPS_USART->DR;
  14085. 8026d62: b29b uxth r3, r3
  14086. 8026d64: 9301 str r3, [sp, #4]
  14087. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  14088. if (!rbuf_isfull(&ups_rx_rbuf))
  14089. 8026d66: f001 ff5d bl 8028c24 <rbuf_isfull>
  14090. 8026d6a: b918 cbnz r0, 8026d74 <USART2_IRQHandler+0x7c>
  14091. rbuf32_put(&ups_rx_rbuf, c);
  14092. 8026d6c: 480c ldr r0, [pc, #48] ; (8026da0 <USART2_IRQHandler+0xa8>)
  14093. 8026d6e: 9901 ldr r1, [sp, #4]
  14094. 8026d70: f001 ff79 bl 8028c66 <rbuf32_put>
  14095. USART_ClearITPendingBit(UPS_USART, USART_IT_RXNE);
  14096. 8026d74: 4808 ldr r0, [pc, #32] ; (8026d98 <USART2_IRQHandler+0xa0>)
  14097. xSemaphoreGiveFromISR(xSem_rx_buf, &xHigherPriorityTaskWoken);
  14098. 8026d76: 4c0b ldr r4, [pc, #44] ; (8026da4 <USART2_IRQHandler+0xac>)
  14099. {
  14100. c = (uint32_t)UPS_USART->DR;
  14101. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  14102. if (!rbuf_isfull(&ups_rx_rbuf))
  14103. rbuf32_put(&ups_rx_rbuf, c);
  14104. USART_ClearITPendingBit(UPS_USART, USART_IT_RXNE);
  14105. 8026d78: f240 5125 movw r1, #1317 ; 0x525
  14106. 8026d7c: f7fe fffb bl 8025d76 <USART_ClearITPendingBit>
  14107. xSemaphoreGiveFromISR(xSem_rx_buf, &xHigherPriorityTaskWoken);
  14108. 8026d80: 4b09 ldr r3, [pc, #36] ; (8026da8 <USART2_IRQHandler+0xb0>)
  14109. 8026d82: 4621 mov r1, r4
  14110. 8026d84: 6818 ldr r0, [r3, #0]
  14111. 8026d86: f002 f9bf bl 8029108 <xQueueGiveFromISR>
  14112. portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  14113. 8026d8a: 6823 ldr r3, [r4, #0]
  14114. 8026d8c: b11b cbz r3, 8026d96 <USART2_IRQHandler+0x9e>
  14115. 8026d8e: 4b07 ldr r3, [pc, #28] ; (8026dac <USART2_IRQHandler+0xb4>)
  14116. 8026d90: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  14117. 8026d94: 601a str r2, [r3, #0]
  14118. }
  14119. void USART2_IRQHandler(void) {
  14120. rs232_irq_handler();
  14121. }
  14122. 8026d96: bd1c pop {r2, r3, r4, pc}
  14123. 8026d98: 40004400 .word 0x40004400
  14124. 8026d9c: 2000e888 .word 0x2000e888
  14125. 8026da0: 2000e558 .word 0x2000e558
  14126. 8026da4: 2000289c .word 0x2000289c
  14127. 8026da8: 2000e8a8 .word 0x2000e8a8
  14128. 8026dac: e000ed04 .word 0xe000ed04
  14129. 08026db0 <USART3_IRQHandler>:
  14130. void USART3_IRQHandler(void) {
  14131. 8026db0: 4770 bx lr
  14132. 8026db2: 0000 movs r0, r0
  14133. 08026db4 <InitTask>:
  14134. /**
  14135. * @brief Задача инициализации. Запускает основные задачи девайса и умирает.
  14136. * @retval
  14137. */
  14138. void InitTask(void *params)
  14139. {
  14140. 8026db4: b51f push {r0, r1, r2, r3, r4, lr}
  14141. // -----------------------------------------------------------------------------
  14142. #ifdef LED_ENABLE
  14143. LED_Init();
  14144. /* Простая мигалка для подтверждения живучести контроллера */
  14145. xTaskCreate(vTaskLedBlink, "LED_Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);//&xTaskToKill
  14146. 8026db6: 2400 movs r4, #0
  14147. void InitTask(void *params)
  14148. {
  14149. // -----------------------------------------------------------------------------
  14150. // xTaskCreate(vTaskWdt, "WDT", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  14151. // -----------------------------------------------------------------------------
  14152. InitUSART();
  14153. 8026db8: f7ff ff3a bl 8026c30 <InitUSART>
  14154. ups_megatec_init();
  14155. 8026dbc: f001 ff18 bl 8028bf0 <ups_megatec_init>
  14156. // -----------------------------------------------------------------------------
  14157. // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  14158. /* SETTINGS_SetDefaultDebug();
  14159. SETTINGS_Save();*/
  14160. SETTINGS_Load();
  14161. 8026dc0: f001 fc74 bl 80286ac <SETTINGS_Load>
  14162. set_mode_jumper();
  14163. 8026dc4: f001 fda0 bl 8028908 <set_mode_jumper>
  14164. #endif
  14165. // -----------------------------------------------------------------------------
  14166. // -----------------------------------------------------------------------------
  14167. #ifdef LED_ENABLE
  14168. LED_Init();
  14169. 8026dc8: f001 fd1d bl 8028806 <LED_Init>
  14170. /* Простая мигалка для подтверждения живучести контроллера */
  14171. xTaskCreate(vTaskLedBlink, "LED_Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);//&xTaskToKill
  14172. 8026dcc: 2280 movs r2, #128 ; 0x80
  14173. 8026dce: 4623 mov r3, r4
  14174. 8026dd0: 4921 ldr r1, [pc, #132] ; (8026e58 <InitTask+0xa4>)
  14175. 8026dd2: 9400 str r4, [sp, #0]
  14176. 8026dd4: 9401 str r4, [sp, #4]
  14177. 8026dd6: 9402 str r4, [sp, #8]
  14178. 8026dd8: 9403 str r4, [sp, #12]
  14179. 8026dda: 4820 ldr r0, [pc, #128] ; (8026e5c <InitTask+0xa8>)
  14180. 8026ddc: f002 fad0 bl 8029380 <xTaskGenericCreate>
  14181. #endif
  14182. // -----------------------------------------------------------------------------
  14183. // -----------------------------------------------------------------------------
  14184. #ifdef BUTTON_ENABLE
  14185. BUTTON_Init();
  14186. 8026de0: f001 fd4a bl 8028878 <BUTTON_Init>
  14187. xTaskCreate(vTaskButtons, "Buttons", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  14188. 8026de4: 2280 movs r2, #128 ; 0x80
  14189. 8026de6: 4623 mov r3, r4
  14190. 8026de8: 491d ldr r1, [pc, #116] ; (8026e60 <InitTask+0xac>)
  14191. 8026dea: 9400 str r4, [sp, #0]
  14192. 8026dec: 9401 str r4, [sp, #4]
  14193. 8026dee: 9402 str r4, [sp, #8]
  14194. 8026df0: 9403 str r4, [sp, #12]
  14195. 8026df2: 481c ldr r0, [pc, #112] ; (8026e64 <InitTask+0xb0>)
  14196. 8026df4: f002 fac4 bl 8029380 <xTaskGenericCreate>
  14197. //xTaskCreate( d_inouts_task, "inouts_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  14198. // xTaskCreate( d_inouts_test, "d_inouts_test", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  14199. // -----------------------------------------------------------------------------
  14200. #ifdef RTC_ENABLE
  14201. TM_RTC_Init(TM_RTC_ClockSource_External); // Так было
  14202. 8026df8: 2001 movs r0, #1
  14203. 8026dfa: f7ff fb75 bl 80264e8 <TM_RTC_Init>
  14204. xTaskCreate(UPS_TaskState, "UPS_State", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  14205. xTaskCreate(UPS_Monitor, "UPS_Monitor", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);*/
  14206. #endif
  14207. // -----------------------------------------------------------------------------
  14208. /* Random number generator */
  14209. RNG_Init();
  14210. 8026dfe: f7ff f95b bl 80260b8 <RNG_Init>
  14211. // -----------------------------------------------------------------------------
  14212. #ifdef NET_ENABLE
  14213. ETH_BSP_Config();
  14214. 8026e02: f00e f9a5 bl 8035150 <ETH_BSP_Config>
  14215. LwIP_Init();
  14216. 8026e06: f00d fea3 bl 8034b50 <LwIP_Init>
  14217. #ifdef WEB_SERVER_ENABLE
  14218. HTTP_Init();
  14219. 8026e0a: f003 fb89 bl 802a520 <HTTP_Init>
  14220. #endif
  14221. #endif
  14222. // -----------------------------------------------------------------------------
  14223. /* SNTP */
  14224. SNTP_Init();
  14225. 8026e0e: f00e f925 bl 803505c <SNTP_Init>
  14226. xTaskCreate(vTaskOnceSynchro, "sntpOnceSinhro", 2*configMINIMAL_STACK_SIZE,
  14227. 8026e12: 4b15 ldr r3, [pc, #84] ; (8026e68 <InitTask+0xb4>)
  14228. 8026e14: 9400 str r4, [sp, #0]
  14229. 8026e16: 9301 str r3, [sp, #4]
  14230. 8026e18: 9402 str r4, [sp, #8]
  14231. 8026e1a: 4623 mov r3, r4
  14232. 8026e1c: 9403 str r4, [sp, #12]
  14233. 8026e1e: 4913 ldr r1, [pc, #76] ; (8026e6c <InitTask+0xb8>)
  14234. 8026e20: 4813 ldr r0, [pc, #76] ; (8026e70 <InitTask+0xbc>)
  14235. 8026e22: f44f 7280 mov.w r2, #256 ; 0x100
  14236. 8026e26: f002 faab bl 8029380 <xTaskGenericCreate>
  14237. NULL, tskIDLE_PRIORITY, &xHandleSntpOnceSinhro);
  14238. xTaskCreate(vTaskPeriodicSynchro, "sntpPeriodicSinhro", 2*configMINIMAL_STACK_SIZE,
  14239. 8026e2a: 4912 ldr r1, [pc, #72] ; (8026e74 <InitTask+0xc0>)
  14240. 8026e2c: 9400 str r4, [sp, #0]
  14241. 8026e2e: f44f 7280 mov.w r2, #256 ; 0x100
  14242. 8026e32: 4623 mov r3, r4
  14243. 8026e34: 9401 str r4, [sp, #4]
  14244. 8026e36: 9402 str r4, [sp, #8]
  14245. 8026e38: 9403 str r4, [sp, #12]
  14246. 8026e3a: 480f ldr r0, [pc, #60] ; (8026e78 <InitTask+0xc4>)
  14247. 8026e3c: f002 faa0 bl 8029380 <xTaskGenericCreate>
  14248. //TEST_IO();
  14249. /* Контроль успешной загрузки. Сброс флага bootry */
  14250. /* Сброс флага и сохранение нового значения во флеш памяти происходт после
  14251. некоторой задержки для запуска всех задач */
  14252. vTaskDelay(4000);
  14253. 8026e40: f44f 607a mov.w r0, #4000 ; 0xfa0
  14254. 8026e44: f002 fd36 bl 80298b4 <vTaskDelay>
  14255. /* if (!dhcp)
  14256. SNMP_SendUserTrap(DEVICE_REBOOTED);
  14257. printf("Hello world\r\n");*/
  14258. vTaskDelete(NULL);
  14259. 8026e48: 4620 mov r0, r4
  14260. 8026e4a: f002 fb71 bl 8029530 <vTaskDelete>
  14261. taskYIELD();
  14262. }
  14263. 8026e4e: b004 add sp, #16
  14264. 8026e50: e8bd 4010 ldmia.w sp!, {r4, lr}
  14265. SNMP_SendUserTrap(DEVICE_REBOOTED);
  14266. printf("Hello world\r\n");*/
  14267. vTaskDelete(NULL);
  14268. taskYIELD();
  14269. 8026e54: f003 b8e4 b.w 802a020 <vPortYield>
  14270. 8026e58: 08035d30 .word 0x08035d30
  14271. 8026e5c: 080287e9 .word 0x080287e9
  14272. 8026e60: 08035d3a .word 0x08035d3a
  14273. 8026e64: 080288f5 .word 0x080288f5
  14274. 8026e68: 200028a0 .word 0x200028a0
  14275. 8026e6c: 08035d42 .word 0x08035d42
  14276. 8026e70: 08035129 .word 0x08035129
  14277. 8026e74: 08035d51 .word 0x08035d51
  14278. 8026e78: 080350e1 .word 0x080350e1
  14279. 08026e7c <main>:
  14280. void vApplicationTickHook(void) {
  14281. }
  14282. int main()
  14283. {
  14284. 8026e7c: b51f push {r0, r1, r2, r3, r4, lr}
  14285. This function disables IRQ interrupts by setting the I-bit in the CPSR.
  14286. Can only be executed in Privileged modes.
  14287. */
  14288. __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
  14289. {
  14290. __ASM volatile ("cpsid i" : : : "memory");
  14291. 8026e7e: b672 cpsid i
  14292. //TIM_Cmd(TIM13, DISABLE);
  14293. //TIM_ClearITPendingBit(TIM13, TIM_IT_Update);
  14294. __disable_irq();
  14295. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x20000);
  14296. 8026e80: f04f 6000 mov.w r0, #134217728 ; 0x8000000
  14297. 8026e84: f44f 3100 mov.w r1, #131072 ; 0x20000
  14298. 8026e88: f7fe fa3e bl 8025308 <NVIC_SetVectorTable>
  14299. __STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
  14300. {
  14301. uint32_t reg_value;
  14302. uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */
  14303. reg_value = SCB->AIRCR; /* read old register configuration */
  14304. 8026e8c: 4a17 ldr r2, [pc, #92] ; (8026eec <main+0x70>)
  14305. 8026e8e: 68d1 ldr r1, [r2, #12]
  14306. reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */
  14307. 8026e90: f64f 03ff movw r3, #63743 ; 0xf8ff
  14308. 8026e94: 400b ands r3, r1
  14309. reg_value = (reg_value |
  14310. 8026e96: f043 63bf orr.w r3, r3, #100139008 ; 0x5f80000
  14311. 8026e9a: f443 3300 orr.w r3, r3, #131072 ; 0x20000
  14312. ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  14313. (PriorityGroupTmp << 8)); /* Insert write key and priorty group */
  14314. SCB->AIRCR = reg_value;
  14315. 8026e9e: 60d3 str r3, [r2, #12]
  14316. NVIC_SetPriorityGrouping(0);
  14317. NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
  14318. 8026ea0: f44f 7040 mov.w r0, #768 ; 0x300
  14319. 8026ea4: f7fe f9f2 bl 802528c <NVIC_PriorityGroupConfig>
  14320. This function enables IRQ interrupts by clearing the I-bit in the CPSR.
  14321. Can only be executed in Privileged modes.
  14322. */
  14323. __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
  14324. {
  14325. __ASM volatile ("cpsie i" : : : "memory");
  14326. 8026ea8: b662 cpsie i
  14327. __enable_irq();
  14328. //WDG_Init();
  14329. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  14330. 8026eaa: 2101 movs r1, #1
  14331. 8026eac: f44f 5080 mov.w r0, #4096 ; 0x1000
  14332. 8026eb0: f7fe fc4c bl 802574c <RCC_AHB1PeriphClockCmd>
  14333. /* Clear flash error flags if were set */
  14334. FLASH_ClearFlag(FLASH_FLAG_PGPERR);
  14335. 8026eb4: 2040 movs r0, #64 ; 0x40
  14336. gpio_init();
  14337. spi_flash_test();
  14338. // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  14339. xTaskCreate( InitTask, "InitTask", 1000, NULL, tskIDLE_PRIORITY, NULL);
  14340. 8026eb6: 2400 movs r4, #0
  14341. //WDG_Init();
  14342. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  14343. /* Clear flash error flags if were set */
  14344. FLASH_ClearFlag(FLASH_FLAG_PGPERR);
  14345. 8026eb8: f7fe fa5c bl 8025374 <FLASH_ClearFlag>
  14346. FLASH_ClearFlag(FLASH_FLAG_PGSERR);
  14347. 8026ebc: 2080 movs r0, #128 ; 0x80
  14348. 8026ebe: f7fe fa59 bl 8025374 <FLASH_ClearFlag>
  14349. gpio_init();
  14350. 8026ec2: f7ff f895 bl 8025ff0 <gpio_init>
  14351. spi_flash_test();
  14352. 8026ec6: f7ff fdcd bl 8026a64 <spi_flash_test>
  14353. // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  14354. xTaskCreate( InitTask, "InitTask", 1000, NULL, tskIDLE_PRIORITY, NULL);
  14355. 8026eca: 4909 ldr r1, [pc, #36] ; (8026ef0 <main+0x74>)
  14356. 8026ecc: 9400 str r4, [sp, #0]
  14357. 8026ece: f44f 727a mov.w r2, #1000 ; 0x3e8
  14358. 8026ed2: 4623 mov r3, r4
  14359. 8026ed4: 9401 str r4, [sp, #4]
  14360. 8026ed6: 9402 str r4, [sp, #8]
  14361. 8026ed8: 9403 str r4, [sp, #12]
  14362. 8026eda: 4806 ldr r0, [pc, #24] ; (8026ef4 <main+0x78>)
  14363. 8026edc: f002 fa50 bl 8029380 <xTaskGenericCreate>
  14364. vTaskStartScheduler();
  14365. 8026ee0: f002 fb80 bl 80295e4 <vTaskStartScheduler>
  14366. /*while(1)
  14367. {
  14368. }*/
  14369. }
  14370. 8026ee4: 4620 mov r0, r4
  14371. 8026ee6: b004 add sp, #16
  14372. 8026ee8: bd10 pop {r4, pc}
  14373. 8026eea: bf00 nop
  14374. 8026eec: e000ed00 .word 0xe000ed00
  14375. 8026ef0: 08035d64 .word 0x08035d64
  14376. 8026ef4: 08026db5 .word 0x08026db5
  14377. 08026ef8 <NMI_Handler>:
  14378. * @brief This function handles NMI exception.
  14379. * @param None
  14380. * @retval None
  14381. */
  14382. void NMI_Handler(void)
  14383. {
  14384. 8026ef8: 4770 bx lr
  14385. 8026efa: 0000 movs r0, r0
  14386. 08026efc <HardFault_Output>:
  14387. }
  14388. void HardFault_Output(uint32_t *sp)
  14389. {
  14390. 8026efc: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  14391. uint32_t r0 = sp[0];
  14392. uint32_t r1 = sp[1];
  14393. 8026f00: e890 0808 ldmia.w r0, {r3, fp}
  14394. uint32_t r2 = sp[2];
  14395. 8026f04: f8d0 a008 ldr.w sl, [r0, #8]
  14396. uint32_t r3 = sp[3];
  14397. 8026f08: f8d0 900c ldr.w r9, [r0, #12]
  14398. uint32_t r12 = sp[4];
  14399. 8026f0c: f8d0 8010 ldr.w r8, [r0, #16]
  14400. uint32_t lr = sp[5];
  14401. 8026f10: 6947 ldr r7, [r0, #20]
  14402. uint32_t pc = sp[6];
  14403. 8026f12: 6986 ldr r6, [r0, #24]
  14404. uint32_t psr = sp[7];
  14405. 8026f14: 69c5 ldr r5, [r0, #28]
  14406. printf("HardFault:\n\r");
  14407. 8026f16: 9301 str r3, [sp, #4]
  14408. void NMI_Handler(void)
  14409. {
  14410. }
  14411. void HardFault_Output(uint32_t *sp)
  14412. {
  14413. 8026f18: 4604 mov r4, r0
  14414. uint32_t r12 = sp[4];
  14415. uint32_t lr = sp[5];
  14416. uint32_t pc = sp[6];
  14417. uint32_t psr = sp[7];
  14418. printf("HardFault:\n\r");
  14419. 8026f1a: 4816 ldr r0, [pc, #88] ; (8026f74 <HardFault_Output+0x78>)
  14420. 8026f1c: f000 fbc6 bl 80276ac <tfp_printf>
  14421. /* Print CFSR register */
  14422. /* Print CPU registers */
  14423. printf("\n\rRegisters:\n\r");
  14424. 8026f20: 4815 ldr r0, [pc, #84] ; (8026f78 <HardFault_Output+0x7c>)
  14425. 8026f22: f000 fbc3 bl 80276ac <tfp_printf>
  14426. printf("SP 0x%08lx\n\r", (uint32_t)sp);
  14427. 8026f26: 4815 ldr r0, [pc, #84] ; (8026f7c <HardFault_Output+0x80>)
  14428. 8026f28: 4621 mov r1, r4
  14429. 8026f2a: f000 fbbf bl 80276ac <tfp_printf>
  14430. printf("R0 0x%08lx\n\r", r0);
  14431. 8026f2e: 9b01 ldr r3, [sp, #4]
  14432. 8026f30: 4813 ldr r0, [pc, #76] ; (8026f80 <HardFault_Output+0x84>)
  14433. 8026f32: 4619 mov r1, r3
  14434. 8026f34: f000 fbba bl 80276ac <tfp_printf>
  14435. printf("R1 0x%08lx\n\r", r1);
  14436. 8026f38: 4812 ldr r0, [pc, #72] ; (8026f84 <HardFault_Output+0x88>)
  14437. 8026f3a: 4659 mov r1, fp
  14438. 8026f3c: f000 fbb6 bl 80276ac <tfp_printf>
  14439. printf("R2 0x%08lx\n\r", r2);
  14440. 8026f40: 4811 ldr r0, [pc, #68] ; (8026f88 <HardFault_Output+0x8c>)
  14441. 8026f42: 4651 mov r1, sl
  14442. 8026f44: f000 fbb2 bl 80276ac <tfp_printf>
  14443. printf("R3 0x%08lx\n\r", r3);
  14444. 8026f48: 4810 ldr r0, [pc, #64] ; (8026f8c <HardFault_Output+0x90>)
  14445. 8026f4a: 4649 mov r1, r9
  14446. 8026f4c: f000 fbae bl 80276ac <tfp_printf>
  14447. printf("R12 0x%08lx\n\r", r12);
  14448. 8026f50: 480f ldr r0, [pc, #60] ; (8026f90 <HardFault_Output+0x94>)
  14449. 8026f52: 4641 mov r1, r8
  14450. 8026f54: f000 fbaa bl 80276ac <tfp_printf>
  14451. printf("LR 0x%08lx\n\r", lr);
  14452. 8026f58: 480e ldr r0, [pc, #56] ; (8026f94 <HardFault_Output+0x98>)
  14453. 8026f5a: 4639 mov r1, r7
  14454. 8026f5c: f000 fba6 bl 80276ac <tfp_printf>
  14455. printf("PC 0x%08lx\n\r", pc);
  14456. 8026f60: 480d ldr r0, [pc, #52] ; (8026f98 <HardFault_Output+0x9c>)
  14457. 8026f62: 4631 mov r1, r6
  14458. 8026f64: f000 fba2 bl 80276ac <tfp_printf>
  14459. printf("PSR 0x%08lx\n\r", psr);
  14460. 8026f68: 480c ldr r0, [pc, #48] ; (8026f9c <HardFault_Output+0xa0>)
  14461. 8026f6a: 4629 mov r1, r5
  14462. 8026f6c: f000 fb9e bl 80276ac <tfp_printf>
  14463. 8026f70: e7fe b.n 8026f70 <HardFault_Output+0x74>
  14464. 8026f72: bf00 nop
  14465. 8026f74: 08035d6d .word 0x08035d6d
  14466. 8026f78: 08035d7a .word 0x08035d7a
  14467. 8026f7c: 08035d89 .word 0x08035d89
  14468. 8026f80: 08035d9f .word 0x08035d9f
  14469. 8026f84: 08035db5 .word 0x08035db5
  14470. 8026f88: 08035dcb .word 0x08035dcb
  14471. 8026f8c: 08035de1 .word 0x08035de1
  14472. 8026f90: 08035df7 .word 0x08035df7
  14473. 8026f94: 08035e0d .word 0x08035e0d
  14474. 8026f98: 08035e23 .word 0x08035e23
  14475. 8026f9c: 08035e39 .word 0x08035e39
  14476. 08026fa0 <HardFault_Handler>:
  14477. * @retval None
  14478. */
  14479. __attribute__( (naked) )
  14480. void HardFault_Handler(void)
  14481. {
  14482. __asm volatile
  14483. 8026fa0: f01e 0f04 tst.w lr, #4
  14484. 8026fa4: bf0c ite eq
  14485. 8026fa6: f3ef 8008 mrseq r0, MSP
  14486. 8026faa: f3ef 8009 mrsne r0, PSP
  14487. 8026fae: f8df 1004 ldr.w r1, [pc, #4] ; 8026fb4 <debugHardfault_address>
  14488. 8026fb2: 4708 bx r1
  14489. 08026fb4 <debugHardfault_address>:
  14490. 8026fb4: 08026efd .word 0x08026efd
  14491. 08026fb8 <MemManage_Handler>:
  14492. * @brief This function handles Memory Manage exception.
  14493. * @param None
  14494. * @retval None
  14495. */
  14496. void MemManage_Handler(void)
  14497. {
  14498. 8026fb8: e7fe b.n 8026fb8 <MemManage_Handler>
  14499. 8026fba: 0000 movs r0, r0
  14500. 08026fbc <TIM8_UP_TIM13_IRQHandler>:
  14501. }
  14502. }
  14503. void TIM8_UP_TIM13_IRQHandler(void)
  14504. {
  14505. TIM_ClearITPendingBit(TIM13, TIM_IT_Update);
  14506. 8026fbc: 4801 ldr r0, [pc, #4] ; (8026fc4 <TIM8_UP_TIM13_IRQHandler+0x8>)
  14507. 8026fbe: 2101 movs r1, #1
  14508. 8026fc0: f7fe bde2 b.w 8025b88 <TIM_ClearITPendingBit>
  14509. 8026fc4: 40001c00 .word 0x40001c00
  14510. 08026fc8 <BusFault_Handler>:
  14511. * @brief This function handles Bus Fault exception.
  14512. * @param None
  14513. * @retval None
  14514. */
  14515. void BusFault_Handler(void)
  14516. {
  14517. 8026fc8: e7fe b.n 8026fc8 <BusFault_Handler>
  14518. 08026fca <UsageFault_Handler>:
  14519. * @brief This function handles Usage Fault exception.
  14520. * @param None
  14521. * @retval None
  14522. */
  14523. void UsageFault_Handler(void)
  14524. {
  14525. 8026fca: e7fe b.n 8026fca <UsageFault_Handler>
  14526. 08026fcc <DebugMon_Handler>:
  14527. * @brief This function handles Debug Monitor exception.
  14528. * @param None
  14529. * @retval None
  14530. */
  14531. void DebugMon_Handler(void)
  14532. {
  14533. 8026fcc: 4770 bx lr
  14534. 08026fce <SDIO_IRQHandler>:
  14535. /*void PPP_IRQHandler(void)
  14536. {
  14537. }*/
  14538. void SDIO_IRQHandler(void)
  14539. {
  14540. 8026fce: 4770 bx lr
  14541. 08026fd0 <ETH_IRQHandler>:
  14542. * @brief This function handles ethernet DMA interrupt request.
  14543. * @param None
  14544. * @retval None
  14545. */
  14546. void ETH_IRQHandler(void)
  14547. {
  14548. 8026fd0: b507 push {r0, r1, r2, lr}
  14549. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  14550. 8026fd2: 2300 movs r3, #0
  14551. /* Frame received */
  14552. if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)
  14553. 8026fd4: 2040 movs r0, #64 ; 0x40
  14554. * @param None
  14555. * @retval None
  14556. */
  14557. void ETH_IRQHandler(void)
  14558. {
  14559. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  14560. 8026fd6: 9301 str r3, [sp, #4]
  14561. /* Frame received */
  14562. if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)
  14563. 8026fd8: f00e fb58 bl 803568c <ETH_GetDMAFlagStatus>
  14564. 8026fdc: 2801 cmp r0, #1
  14565. 8026fde: d104 bne.n 8026fea <ETH_IRQHandler+0x1a>
  14566. {
  14567. /* Give the semaphore to wakeup LwIP task */
  14568. xSemaphoreGiveFromISR( s_xSemaphore, &xHigherPriorityTaskWoken );
  14569. 8026fe0: 4b09 ldr r3, [pc, #36] ; (8027008 <ETH_IRQHandler+0x38>)
  14570. 8026fe2: a901 add r1, sp, #4
  14571. 8026fe4: 6818 ldr r0, [r3, #0]
  14572. 8026fe6: f002 f88f bl 8029108 <xQueueGiveFromISR>
  14573. }
  14574. /* Clear the interrupt flags. */
  14575. /* Clear the Eth DMA Rx IT pending bits */
  14576. ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
  14577. 8026fea: 2040 movs r0, #64 ; 0x40
  14578. 8026fec: f00e fb64 bl 80356b8 <ETH_DMAClearITPendingBit>
  14579. ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
  14580. 8026ff0: f44f 3080 mov.w r0, #65536 ; 0x10000
  14581. 8026ff4: f00e fb60 bl 80356b8 <ETH_DMAClearITPendingBit>
  14582. // Switch tasks if necessary. */
  14583. if( xHigherPriorityTaskWoken != pdFALSE )
  14584. 8026ff8: 9b01 ldr r3, [sp, #4]
  14585. 8026ffa: b11b cbz r3, 8027004 <ETH_IRQHandler+0x34>
  14586. {
  14587. portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
  14588. 8026ffc: 4b03 ldr r3, [pc, #12] ; (802700c <ETH_IRQHandler+0x3c>)
  14589. 8026ffe: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  14590. 8027002: 601a str r2, [r3, #0]
  14591. }
  14592. }
  14593. 8027004: bd0e pop {r1, r2, r3, pc}
  14594. 8027006: bf00 nop
  14595. 8027008: 2000e4dc .word 0x2000e4dc
  14596. 802700c: e000ed04 .word 0xe000ed04
  14597. 08027010 <ulli2a>:
  14598. #ifdef PRINTF_LONG_LONG_SUPPORT
  14599. static void _TFP_GCC_NO_INLINE_ ulli2a(
  14600. unsigned long long int num, struct param *p)
  14601. {
  14602. 8027010: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  14603. int n = 0;
  14604. unsigned long long int d = 1;
  14605. char *bf = p->bf;
  14606. while (num / d >= p->base)
  14607. 8027014: 68d3 ldr r3, [r2, #12]
  14608. static void _TFP_GCC_NO_INLINE_ ulli2a(
  14609. unsigned long long int num, struct param *p)
  14610. {
  14611. int n = 0;
  14612. unsigned long long int d = 1;
  14613. char *bf = p->bf;
  14614. 8027016: f8d2 b010 ldr.w fp, [r2, #16]
  14615. #ifdef PRINTF_LONG_LONG_SUPPORT
  14616. static void _TFP_GCC_NO_INLINE_ ulli2a(
  14617. unsigned long long int num, struct param *p)
  14618. {
  14619. 802701a: 4681 mov r9, r0
  14620. 802701c: 468a mov sl, r1
  14621. 802701e: 4690 mov r8, r2
  14622. int n = 0;
  14623. unsigned long long int d = 1;
  14624. char *bf = p->bf;
  14625. while (num / d >= p->base)
  14626. 8027020: 461e mov r6, r3
  14627. 8027022: 2700 movs r7, #0
  14628. #ifdef PRINTF_LONG_LONG_SUPPORT
  14629. static void _TFP_GCC_NO_INLINE_ ulli2a(
  14630. unsigned long long int num, struct param *p)
  14631. {
  14632. int n = 0;
  14633. unsigned long long int d = 1;
  14634. 8027024: 2401 movs r4, #1
  14635. 8027026: 2500 movs r5, #0
  14636. char *bf = p->bf;
  14637. while (num / d >= p->base)
  14638. 8027028: e006 b.n 8027038 <ulli2a+0x28>
  14639. d *= p->base;
  14640. 802702a: fb04 f307 mul.w r3, r4, r7
  14641. 802702e: fb06 3305 mla r3, r6, r5, r3
  14642. 8027032: fba4 4506 umull r4, r5, r4, r6
  14643. 8027036: 195d adds r5, r3, r5
  14644. unsigned long long int num, struct param *p)
  14645. {
  14646. int n = 0;
  14647. unsigned long long int d = 1;
  14648. char *bf = p->bf;
  14649. while (num / d >= p->base)
  14650. 8027038: 4648 mov r0, r9
  14651. 802703a: 4651 mov r1, sl
  14652. 802703c: 4622 mov r2, r4
  14653. 802703e: 462b mov r3, r5
  14654. 8027040: f7f9 ff54 bl 8020eec <__aeabi_uldivmod>
  14655. 8027044: 42b9 cmp r1, r7
  14656. 8027046: bf08 it eq
  14657. 8027048: 42b0 cmpeq r0, r6
  14658. 802704a: d2ee bcs.n 802702a <ulli2a+0x1a>
  14659. 802704c: 2600 movs r6, #0
  14660. 802704e: e02d b.n 80270ac <ulli2a+0x9c>
  14661. d *= p->base;
  14662. while (d != 0) {
  14663. int dgt = num / d;
  14664. 8027050: 4622 mov r2, r4
  14665. 8027052: 462b mov r3, r5
  14666. 8027054: 4648 mov r0, r9
  14667. 8027056: 4651 mov r1, sl
  14668. 8027058: f7f9 ff48 bl 8020eec <__aeabi_uldivmod>
  14669. num %= d;
  14670. 802705c: 4651 mov r1, sl
  14671. 802705e: 4622 mov r2, r4
  14672. 8027060: 462b mov r3, r5
  14673. unsigned long long int d = 1;
  14674. char *bf = p->bf;
  14675. while (num / d >= p->base)
  14676. d *= p->base;
  14677. while (d != 0) {
  14678. int dgt = num / d;
  14679. 8027062: 4607 mov r7, r0
  14680. num %= d;
  14681. 8027064: 4648 mov r0, r9
  14682. 8027066: f7f9 ff41 bl 8020eec <__aeabi_uldivmod>
  14683. d /= p->base;
  14684. 802706a: 4620 mov r0, r4
  14685. 802706c: 4629 mov r1, r5
  14686. char *bf = p->bf;
  14687. while (num / d >= p->base)
  14688. d *= p->base;
  14689. while (d != 0) {
  14690. int dgt = num / d;
  14691. num %= d;
  14692. 802706e: 4691 mov r9, r2
  14693. 8027070: 469a mov sl, r3
  14694. d /= p->base;
  14695. 8027072: f8d8 200c ldr.w r2, [r8, #12]
  14696. 8027076: 2300 movs r3, #0
  14697. 8027078: f7f9 ff38 bl 8020eec <__aeabi_uldivmod>
  14698. 802707c: 4604 mov r4, r0
  14699. 802707e: 460d mov r5, r1
  14700. if (n || dgt > 0 || d == 0) {
  14701. 8027080: b926 cbnz r6, 802708c <ulli2a+0x7c>
  14702. 8027082: 2f00 cmp r7, #0
  14703. 8027084: dc02 bgt.n 802708c <ulli2a+0x7c>
  14704. 8027086: ea54 0305 orrs.w r3, r4, r5
  14705. 802708a: d1e1 bne.n 8027050 <ulli2a+0x40>
  14706. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  14707. 802708c: 2f09 cmp r7, #9
  14708. 802708e: b2fa uxtb r2, r7
  14709. 8027090: dd07 ble.n 80270a2 <ulli2a+0x92>
  14710. 8027092: f898 3000 ldrb.w r3, [r8]
  14711. 8027096: f013 0f04 tst.w r3, #4
  14712. 802709a: bf0c ite eq
  14713. 802709c: 2357 moveq r3, #87 ; 0x57
  14714. 802709e: 2337 movne r3, #55 ; 0x37
  14715. 80270a0: e000 b.n 80270a4 <ulli2a+0x94>
  14716. 80270a2: 2330 movs r3, #48 ; 0x30
  14717. 80270a4: 189b adds r3, r3, r2
  14718. 80270a6: f80b 3b01 strb.w r3, [fp], #1
  14719. ++n;
  14720. 80270aa: 3601 adds r6, #1
  14721. int n = 0;
  14722. unsigned long long int d = 1;
  14723. char *bf = p->bf;
  14724. while (num / d >= p->base)
  14725. d *= p->base;
  14726. while (d != 0) {
  14727. 80270ac: ea54 0305 orrs.w r3, r4, r5
  14728. 80270b0: d1ce bne.n 8027050 <ulli2a+0x40>
  14729. if (n || dgt > 0 || d == 0) {
  14730. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  14731. ++n;
  14732. }
  14733. }
  14734. *bf = 0;
  14735. 80270b2: 2300 movs r3, #0
  14736. 80270b4: f88b 3000 strb.w r3, [fp]
  14737. 80270b8: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  14738. 080270bc <uli2a>:
  14739. }
  14740. #endif
  14741. #ifdef PRINTF_LONG_SUPPORT
  14742. static void uli2a(unsigned long int num, struct param *p)
  14743. {
  14744. 80270bc: b570 push {r4, r5, r6, lr}
  14745. int n = 0;
  14746. unsigned long int d = 1;
  14747. char *bf = p->bf;
  14748. while (num / d >= p->base)
  14749. 80270be: 68ca ldr r2, [r1, #12]
  14750. #ifdef PRINTF_LONG_SUPPORT
  14751. static void uli2a(unsigned long int num, struct param *p)
  14752. {
  14753. int n = 0;
  14754. unsigned long int d = 1;
  14755. char *bf = p->bf;
  14756. 80270c0: 690c ldr r4, [r1, #16]
  14757. #ifdef PRINTF_LONG_SUPPORT
  14758. static void uli2a(unsigned long int num, struct param *p)
  14759. {
  14760. int n = 0;
  14761. unsigned long int d = 1;
  14762. 80270c2: 2301 movs r3, #1
  14763. char *bf = p->bf;
  14764. while (num / d >= p->base)
  14765. 80270c4: e000 b.n 80270c8 <uli2a+0xc>
  14766. d *= p->base;
  14767. 80270c6: 4353 muls r3, r2
  14768. static void uli2a(unsigned long int num, struct param *p)
  14769. {
  14770. int n = 0;
  14771. unsigned long int d = 1;
  14772. char *bf = p->bf;
  14773. while (num / d >= p->base)
  14774. 80270c8: fbb0 f5f3 udiv r5, r0, r3
  14775. 80270cc: 4295 cmp r5, r2
  14776. 80270ce: d2fa bcs.n 80270c6 <uli2a+0xa>
  14777. 80270d0: 2500 movs r5, #0
  14778. 80270d2: e01a b.n 802710a <uli2a+0x4e>
  14779. d *= p->base;
  14780. while (d != 0) {
  14781. int dgt = num / d;
  14782. num %= d;
  14783. d /= p->base;
  14784. 80270d4: 68ce ldr r6, [r1, #12]
  14785. unsigned long int d = 1;
  14786. char *bf = p->bf;
  14787. while (num / d >= p->base)
  14788. d *= p->base;
  14789. while (d != 0) {
  14790. int dgt = num / d;
  14791. 80270d6: fbb0 f2f3 udiv r2, r0, r3
  14792. num %= d;
  14793. 80270da: fb03 0012 mls r0, r3, r2, r0
  14794. d /= p->base;
  14795. 80270de: fbb3 f3f6 udiv r3, r3, r6
  14796. if (n || dgt > 0 || d == 0) {
  14797. 80270e2: b91d cbnz r5, 80270ec <uli2a+0x30>
  14798. 80270e4: 2a00 cmp r2, #0
  14799. 80270e6: dc01 bgt.n 80270ec <uli2a+0x30>
  14800. 80270e8: 2b00 cmp r3, #0
  14801. 80270ea: d1f3 bne.n 80270d4 <uli2a+0x18>
  14802. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  14803. 80270ec: 2a09 cmp r2, #9
  14804. 80270ee: b2d6 uxtb r6, r2
  14805. 80270f0: dd06 ble.n 8027100 <uli2a+0x44>
  14806. 80270f2: 780a ldrb r2, [r1, #0]
  14807. 80270f4: f012 0f04 tst.w r2, #4
  14808. 80270f8: bf0c ite eq
  14809. 80270fa: 2257 moveq r2, #87 ; 0x57
  14810. 80270fc: 2237 movne r2, #55 ; 0x37
  14811. 80270fe: e000 b.n 8027102 <uli2a+0x46>
  14812. 8027100: 2230 movs r2, #48 ; 0x30
  14813. 8027102: 1992 adds r2, r2, r6
  14814. 8027104: f804 2b01 strb.w r2, [r4], #1
  14815. ++n;
  14816. 8027108: 3501 adds r5, #1
  14817. int n = 0;
  14818. unsigned long int d = 1;
  14819. char *bf = p->bf;
  14820. while (num / d >= p->base)
  14821. d *= p->base;
  14822. while (d != 0) {
  14823. 802710a: 2b00 cmp r3, #0
  14824. 802710c: d1e2 bne.n 80270d4 <uli2a+0x18>
  14825. if (n || dgt > 0 || d == 0) {
  14826. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  14827. ++n;
  14828. }
  14829. }
  14830. *bf = 0;
  14831. 802710e: 7023 strb r3, [r4, #0]
  14832. 8027110: bd70 pop {r4, r5, r6, pc}
  14833. 08027112 <ui2a>:
  14834. uli2a(num, p);
  14835. }
  14836. #endif
  14837. static void ui2a(unsigned int num, struct param *p)
  14838. {
  14839. 8027112: b570 push {r4, r5, r6, lr}
  14840. int n = 0;
  14841. unsigned int d = 1;
  14842. char *bf = p->bf;
  14843. while (num / d >= p->base)
  14844. 8027114: 68ca ldr r2, [r1, #12]
  14845. static void ui2a(unsigned int num, struct param *p)
  14846. {
  14847. int n = 0;
  14848. unsigned int d = 1;
  14849. char *bf = p->bf;
  14850. 8027116: 690c ldr r4, [r1, #16]
  14851. #endif
  14852. static void ui2a(unsigned int num, struct param *p)
  14853. {
  14854. int n = 0;
  14855. unsigned int d = 1;
  14856. 8027118: 2301 movs r3, #1
  14857. char *bf = p->bf;
  14858. while (num / d >= p->base)
  14859. 802711a: e000 b.n 802711e <ui2a+0xc>
  14860. d *= p->base;
  14861. 802711c: 4353 muls r3, r2
  14862. static void ui2a(unsigned int num, struct param *p)
  14863. {
  14864. int n = 0;
  14865. unsigned int d = 1;
  14866. char *bf = p->bf;
  14867. while (num / d >= p->base)
  14868. 802711e: fbb0 f5f3 udiv r5, r0, r3
  14869. 8027122: 4295 cmp r5, r2
  14870. 8027124: d2fa bcs.n 802711c <ui2a+0xa>
  14871. 8027126: 2500 movs r5, #0
  14872. 8027128: e01a b.n 8027160 <ui2a+0x4e>
  14873. d *= p->base;
  14874. while (d != 0) {
  14875. int dgt = num / d;
  14876. num %= d;
  14877. d /= p->base;
  14878. 802712a: 68ce ldr r6, [r1, #12]
  14879. unsigned int d = 1;
  14880. char *bf = p->bf;
  14881. while (num / d >= p->base)
  14882. d *= p->base;
  14883. while (d != 0) {
  14884. int dgt = num / d;
  14885. 802712c: fbb0 f2f3 udiv r2, r0, r3
  14886. num %= d;
  14887. 8027130: fb03 0012 mls r0, r3, r2, r0
  14888. d /= p->base;
  14889. 8027134: fbb3 f3f6 udiv r3, r3, r6
  14890. if (n || dgt > 0 || d == 0) {
  14891. 8027138: b91d cbnz r5, 8027142 <ui2a+0x30>
  14892. 802713a: 2a00 cmp r2, #0
  14893. 802713c: dc01 bgt.n 8027142 <ui2a+0x30>
  14894. 802713e: 2b00 cmp r3, #0
  14895. 8027140: d1f3 bne.n 802712a <ui2a+0x18>
  14896. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  14897. 8027142: 2a09 cmp r2, #9
  14898. 8027144: b2d6 uxtb r6, r2
  14899. 8027146: dd06 ble.n 8027156 <ui2a+0x44>
  14900. 8027148: 780a ldrb r2, [r1, #0]
  14901. 802714a: f012 0f04 tst.w r2, #4
  14902. 802714e: bf0c ite eq
  14903. 8027150: 2257 moveq r2, #87 ; 0x57
  14904. 8027152: 2237 movne r2, #55 ; 0x37
  14905. 8027154: e000 b.n 8027158 <ui2a+0x46>
  14906. 8027156: 2230 movs r2, #48 ; 0x30
  14907. 8027158: 1992 adds r2, r2, r6
  14908. 802715a: f804 2b01 strb.w r2, [r4], #1
  14909. ++n;
  14910. 802715e: 3501 adds r5, #1
  14911. int n = 0;
  14912. unsigned int d = 1;
  14913. char *bf = p->bf;
  14914. while (num / d >= p->base)
  14915. d *= p->base;
  14916. while (d != 0) {
  14917. 8027160: 2b00 cmp r3, #0
  14918. 8027162: d1e2 bne.n 802712a <ui2a+0x18>
  14919. if (n || dgt > 0 || d == 0) {
  14920. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  14921. ++n;
  14922. }
  14923. }
  14924. *bf = 0;
  14925. 8027164: 7023 strb r3, [r4, #0]
  14926. 8027166: bd70 pop {r4, r5, r6, pc}
  14927. 08027168 <putchw>:
  14928. }
  14929. static void putchw(void *putp, putcf putf, struct param *p)
  14930. {
  14931. 8027168: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  14932. char ch;
  14933. int n = p->width;
  14934. char *bf = p->bf;
  14935. 802716c: 6913 ldr r3, [r2, #16]
  14936. }
  14937. static void putchw(void *putp, putcf putf, struct param *p)
  14938. {
  14939. char ch;
  14940. int n = p->width;
  14941. 802716e: 6854 ldr r4, [r2, #4]
  14942. }
  14943. static void putchw(void *putp, putcf putf, struct param *p)
  14944. {
  14945. 8027170: 4606 mov r6, r0
  14946. 8027172: 460f mov r7, r1
  14947. 8027174: 4615 mov r5, r2
  14948. char ch;
  14949. int n = p->width;
  14950. char *bf = p->bf;
  14951. /* Number of filling characters */
  14952. while (*bf++ && n > 0)
  14953. 8027176: e000 b.n 802717a <putchw+0x12>
  14954. n--;
  14955. 8027178: 3c01 subs r4, #1
  14956. char ch;
  14957. int n = p->width;
  14958. char *bf = p->bf;
  14959. /* Number of filling characters */
  14960. while (*bf++ && n > 0)
  14961. 802717a: f813 2b01 ldrb.w r2, [r3], #1
  14962. 802717e: b912 cbnz r2, 8027186 <putchw+0x1e>
  14963. n--;
  14964. if (p->sign)
  14965. 8027180: 7a2b ldrb r3, [r5, #8]
  14966. 8027182: b91b cbnz r3, 802718c <putchw+0x24>
  14967. 8027184: e003 b.n 802718e <putchw+0x26>
  14968. char ch;
  14969. int n = p->width;
  14970. char *bf = p->bf;
  14971. /* Number of filling characters */
  14972. while (*bf++ && n > 0)
  14973. 8027186: 2c00 cmp r4, #0
  14974. 8027188: dcf6 bgt.n 8027178 <putchw+0x10>
  14975. 802718a: e7f9 b.n 8027180 <putchw+0x18>
  14976. n--;
  14977. if (p->sign)
  14978. n--;
  14979. 802718c: 3c01 subs r4, #1
  14980. if (p->alt && p->base == 16)
  14981. 802718e: 782b ldrb r3, [r5, #0]
  14982. 8027190: 0799 lsls r1, r3, #30
  14983. 8027192: d507 bpl.n 80271a4 <putchw+0x3c>
  14984. 8027194: 68eb ldr r3, [r5, #12]
  14985. 8027196: 2b10 cmp r3, #16
  14986. 8027198: d101 bne.n 802719e <putchw+0x36>
  14987. n -= 2;
  14988. 802719a: 3c02 subs r4, #2
  14989. 802719c: e002 b.n 80271a4 <putchw+0x3c>
  14990. else if (p->alt && p->base == 8)
  14991. 802719e: 2b08 cmp r3, #8
  14992. n--;
  14993. 80271a0: bf08 it eq
  14994. 80271a2: 3c01 subeq r4, #1
  14995. /* Fill with space to align to the right, before alternate or sign */
  14996. if (!p->lz && !p->align_left) {
  14997. 80271a4: 782b ldrb r3, [r5, #0]
  14998. 80271a6: f013 0f09 tst.w r3, #9
  14999. 80271aa: d10d bne.n 80271c8 <putchw+0x60>
  15000. 80271ac: 46a0 mov r8, r4
  15001. 80271ae: e004 b.n 80271ba <putchw+0x52>
  15002. while (n-- > 0)
  15003. putf(putp, ' ');
  15004. 80271b0: 4630 mov r0, r6
  15005. 80271b2: 2120 movs r1, #32
  15006. 80271b4: 47b8 blx r7
  15007. 80271b6: f108 38ff add.w r8, r8, #4294967295
  15008. else if (p->alt && p->base == 8)
  15009. n--;
  15010. /* Fill with space to align to the right, before alternate or sign */
  15011. if (!p->lz && !p->align_left) {
  15012. while (n-- > 0)
  15013. 80271ba: f1b8 0f00 cmp.w r8, #0
  15014. 80271be: dcf7 bgt.n 80271b0 <putchw+0x48>
  15015. return neg ? -fvalue : fvalue;
  15016. }
  15017. static void putchw(void *putp, putcf putf, struct param *p)
  15018. 80271c0: 1e63 subs r3, r4, #1
  15019. 80271c2: ea24 74e4 bic.w r4, r4, r4, asr #31
  15020. 80271c6: 1b1c subs r4, r3, r4
  15021. while (n-- > 0)
  15022. putf(putp, ' ');
  15023. }
  15024. /* print sign */
  15025. if (p->sign)
  15026. 80271c8: 7a29 ldrb r1, [r5, #8]
  15027. 80271ca: b109 cbz r1, 80271d0 <putchw+0x68>
  15028. putf(putp, p->sign);
  15029. 80271cc: 4630 mov r0, r6
  15030. 80271ce: 47b8 blx r7
  15031. /* Alternate */
  15032. if (p->alt && p->base == 16) {
  15033. 80271d0: 782b ldrb r3, [r5, #0]
  15034. 80271d2: 079a lsls r2, r3, #30
  15035. 80271d4: d512 bpl.n 80271fc <putchw+0x94>
  15036. 80271d6: 68eb ldr r3, [r5, #12]
  15037. 80271d8: 2b10 cmp r3, #16
  15038. 80271da: d10a bne.n 80271f2 <putchw+0x8a>
  15039. putf(putp, '0');
  15040. 80271dc: 2130 movs r1, #48 ; 0x30
  15041. 80271de: 4630 mov r0, r6
  15042. 80271e0: 47b8 blx r7
  15043. putf(putp, (p->uc ? 'X' : 'x'));
  15044. 80271e2: 782b ldrb r3, [r5, #0]
  15045. 80271e4: f013 0f04 tst.w r3, #4
  15046. 80271e8: 4630 mov r0, r6
  15047. 80271ea: bf0c ite eq
  15048. 80271ec: 2178 moveq r1, #120 ; 0x78
  15049. 80271ee: 2158 movne r1, #88 ; 0x58
  15050. 80271f0: e003 b.n 80271fa <putchw+0x92>
  15051. } else if (p->alt && p->base == 8) {
  15052. 80271f2: 2b08 cmp r3, #8
  15053. 80271f4: d102 bne.n 80271fc <putchw+0x94>
  15054. putf(putp, '0');
  15055. 80271f6: 4630 mov r0, r6
  15056. 80271f8: 2130 movs r1, #48 ; 0x30
  15057. 80271fa: 47b8 blx r7
  15058. }
  15059. /* Fill with zeros, after alternate or sign */
  15060. if (p->lz) {
  15061. 80271fc: 782b ldrb r3, [r5, #0]
  15062. 80271fe: 07db lsls r3, r3, #31
  15063. 8027200: d50d bpl.n 802721e <putchw+0xb6>
  15064. 8027202: 46a0 mov r8, r4
  15065. 8027204: e004 b.n 8027210 <putchw+0xa8>
  15066. while (n-- > 0)
  15067. putf(putp, '0');
  15068. 8027206: 4630 mov r0, r6
  15069. 8027208: 2130 movs r1, #48 ; 0x30
  15070. 802720a: 47b8 blx r7
  15071. 802720c: f108 38ff add.w r8, r8, #4294967295
  15072. putf(putp, '0');
  15073. }
  15074. /* Fill with zeros, after alternate or sign */
  15075. if (p->lz) {
  15076. while (n-- > 0)
  15077. 8027210: f1b8 0f00 cmp.w r8, #0
  15078. 8027214: dcf7 bgt.n 8027206 <putchw+0x9e>
  15079. return neg ? -fvalue : fvalue;
  15080. }
  15081. static void putchw(void *putp, putcf putf, struct param *p)
  15082. 8027216: 1e63 subs r3, r4, #1
  15083. 8027218: ea24 74e4 bic.w r4, r4, r4, asr #31
  15084. 802721c: 1b1c subs r4, r3, r4
  15085. while (n-- > 0)
  15086. putf(putp, '0');
  15087. }
  15088. /* Put actual buffer */
  15089. bf = p->bf;
  15090. 802721e: f8d5 8010 ldr.w r8, [r5, #16]
  15091. while ((ch = *bf++))
  15092. 8027222: e001 b.n 8027228 <putchw+0xc0>
  15093. putf(putp, ch);
  15094. 8027224: 4630 mov r0, r6
  15095. 8027226: 47b8 blx r7
  15096. putf(putp, '0');
  15097. }
  15098. /* Put actual buffer */
  15099. bf = p->bf;
  15100. while ((ch = *bf++))
  15101. 8027228: f818 1b01 ldrb.w r1, [r8], #1
  15102. 802722c: 2900 cmp r1, #0
  15103. 802722e: d1f9 bne.n 8027224 <putchw+0xbc>
  15104. putf(putp, ch);
  15105. /* Fill with space to align to the left, after string */
  15106. if (!p->lz && p->align_left) {
  15107. 8027230: 782b ldrb r3, [r5, #0]
  15108. 8027232: f003 0309 and.w r3, r3, #9
  15109. 8027236: 2b08 cmp r3, #8
  15110. 8027238: d106 bne.n 8027248 <putchw+0xe0>
  15111. 802723a: e003 b.n 8027244 <putchw+0xdc>
  15112. while (n-- > 0)
  15113. putf(putp, ' ');
  15114. 802723c: 4630 mov r0, r6
  15115. 802723e: 2120 movs r1, #32
  15116. 8027240: 47b8 blx r7
  15117. 8027242: 3c01 subs r4, #1
  15118. while ((ch = *bf++))
  15119. putf(putp, ch);
  15120. /* Fill with space to align to the left, after string */
  15121. if (!p->lz && p->align_left) {
  15122. while (n-- > 0)
  15123. 8027244: 2c00 cmp r4, #0
  15124. 8027246: dcf9 bgt.n 802723c <putchw+0xd4>
  15125. 8027248: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  15126. 0802724c <_vsnprintf_putcf>:
  15127. };
  15128. static void _vsnprintf_putcf(void *p, char c)
  15129. {
  15130. struct _vsnprintf_putcf_data *data = (struct _vsnprintf_putcf_data*)p;
  15131. if (data->num_chars < data->dest_capacity)
  15132. 802724c: 6883 ldr r3, [r0, #8]
  15133. 802724e: 6802 ldr r2, [r0, #0]
  15134. 8027250: 4293 cmp r3, r2
  15135. data->dest[data->num_chars] = c;
  15136. 8027252: bf3c itt cc
  15137. 8027254: 6842 ldrcc r2, [r0, #4]
  15138. 8027256: 54d1 strbcc r1, [r2, r3]
  15139. data->num_chars ++;
  15140. 8027258: 6883 ldr r3, [r0, #8]
  15141. 802725a: 3301 adds r3, #1
  15142. 802725c: 6083 str r3, [r0, #8]
  15143. 802725e: 4770 bx lr
  15144. 08027260 <_vsprintf_putcf>:
  15145. };
  15146. static void _vsprintf_putcf(void *p, char c)
  15147. {
  15148. struct _vsprintf_putcf_data *data = (struct _vsprintf_putcf_data*)p;
  15149. data->dest[data->num_chars++] = c;
  15150. 8027260: e890 000c ldmia.w r0, {r2, r3}
  15151. 8027264: 54d1 strb r1, [r2, r3]
  15152. 8027266: 3301 adds r3, #1
  15153. 8027268: 6043 str r3, [r0, #4]
  15154. 802726a: 4770 bx lr
  15155. 0802726c <tfp_format>:
  15156. putf(putp, ' ');
  15157. }
  15158. }
  15159. void tfp_format(void *putp, putcf putf, const char *fmt, va_list va)
  15160. {
  15161. 802726c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  15162. 8027270: b09b sub sp, #108 ; 0x6c
  15163. 8027272: 4617 mov r7, r2
  15164. char bf[23]; /* long = 64b on some architectures */
  15165. #else
  15166. char bf[12]; /* int = 32b on some architectures */
  15167. #endif
  15168. char ch;
  15169. p.bf = bf;
  15170. 8027274: aa04 add r2, sp, #16
  15171. putf(putp, ' ');
  15172. }
  15173. }
  15174. void tfp_format(void *putp, putcf putf, const char *fmt, va_list va)
  15175. {
  15176. 8027276: 4605 mov r5, r0
  15177. 8027278: 460e mov r6, r1
  15178. 802727a: 461c mov r4, r3
  15179. char bf[23]; /* long = 64b on some architectures */
  15180. #else
  15181. char bf[12]; /* int = 32b on some architectures */
  15182. #endif
  15183. char ch;
  15184. p.bf = bf;
  15185. 802727c: 920e str r2, [sp, #56] ; 0x38
  15186. while ((ch = *(fmt++))) {
  15187. 802727e: e208 b.n 8027692 <tfp_format+0x426>
  15188. if (ch != '%') {
  15189. 8027280: 2925 cmp r1, #37 ; 0x25
  15190. 8027282: d000 beq.n 8027286 <tfp_format+0x1a>
  15191. 8027284: e13a b.n 80274fc <tfp_format+0x290>
  15192. #endif
  15193. /* Init parameter struct */
  15194. p.lz = 0;
  15195. p.alt = 0;
  15196. p.width = 0;
  15197. p.align_left = 0;
  15198. 8027286: f89d 2028 ldrb.w r2, [sp, #40] ; 0x28
  15199. char lng = 0; /* 1 for long, 2 for long long */
  15200. #endif
  15201. /* Init parameter struct */
  15202. p.lz = 0;
  15203. p.alt = 0;
  15204. p.width = 0;
  15205. 802728a: 2300 movs r3, #0
  15206. p.align_left = 0;
  15207. 802728c: f002 02fc and.w r2, r2, #252 ; 0xfc
  15208. 8027290: f363 02c3 bfi r2, r3, #3, #1
  15209. 8027294: f88d 2028 strb.w r2, [sp, #40] ; 0x28
  15210. p.sign = 0;
  15211. p.prec = 2;
  15212. 8027298: 2102 movs r1, #2
  15213. } else {
  15214. #ifdef PRINTF_LONG_SUPPORT
  15215. char lng = 0; /* 1 for long, 2 for long long */
  15216. #endif
  15217. /* Init parameter struct */
  15218. p.lz = 0;
  15219. 802729a: b2d2 uxtb r2, r2
  15220. 802729c: f002 0c01 and.w ip, r2, #1
  15221. 80272a0: f3c2 0040 ubfx r0, r2, #1, #1
  15222. p.alt = 0;
  15223. p.width = 0;
  15224. 80272a4: 930b str r3, [sp, #44] ; 0x2c
  15225. p.align_left = 0;
  15226. p.sign = 0;
  15227. 80272a6: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  15228. p.prec = 2;
  15229. 80272aa: f88d 103c strb.w r1, [sp, #60] ; 0x3c
  15230. 80272ae: f3c2 02c0 ubfx r2, r2, #3, #1
  15231. /* Flags */
  15232. while ((ch = *(fmt++))) {
  15233. 80272b2: e012 b.n 80272da <tfp_format+0x6e>
  15234. switch (ch) {
  15235. 80272b4: 292d cmp r1, #45 ; 0x2d
  15236. 80272b6: d00f beq.n 80272d8 <tfp_format+0x6c>
  15237. 80272b8: d804 bhi.n 80272c4 <tfp_format+0x58>
  15238. 80272ba: 2923 cmp r1, #35 ; 0x23
  15239. 80272bc: d008 beq.n 80272d0 <tfp_format+0x64>
  15240. 80272be: 292b cmp r1, #43 ; 0x2b
  15241. 80272c0: d10f bne.n 80272e2 <tfp_format+0x76>
  15242. 80272c2: e007 b.n 80272d4 <tfp_format+0x68>
  15243. 80272c4: 2930 cmp r1, #48 ; 0x30
  15244. 80272c6: d000 beq.n 80272ca <tfp_format+0x5e>
  15245. 80272c8: e00b b.n 80272e2 <tfp_format+0x76>
  15246. case '-':
  15247. p.align_left = 1;
  15248. continue;
  15249. case '0':
  15250. p.lz = 1;
  15251. 80272ca: f04f 0c01 mov.w ip, #1
  15252. continue;
  15253. 80272ce: e004 b.n 80272da <tfp_format+0x6e>
  15254. case '#':
  15255. p.alt = 1;
  15256. 80272d0: 2001 movs r0, #1
  15257. continue;
  15258. 80272d2: e002 b.n 80272da <tfp_format+0x6e>
  15259. case '+':
  15260. p.sign = 1;
  15261. 80272d4: 2301 movs r3, #1
  15262. continue;
  15263. 80272d6: e000 b.n 80272da <tfp_format+0x6e>
  15264. /* Flags */
  15265. while ((ch = *(fmt++))) {
  15266. switch (ch) {
  15267. case '-':
  15268. p.align_left = 1;
  15269. 80272d8: 2201 movs r2, #1
  15270. p.align_left = 0;
  15271. p.sign = 0;
  15272. p.prec = 2;
  15273. /* Flags */
  15274. while ((ch = *(fmt++))) {
  15275. 80272da: f817 1b01 ldrb.w r1, [r7], #1
  15276. 80272de: 2900 cmp r1, #0
  15277. 80272e0: d1e8 bne.n 80272b4 <tfp_format+0x48>
  15278. 80272e2: f89d 8028 ldrb.w r8, [sp, #40] ; 0x28
  15279. 80272e6: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  15280. 80272ea: f36c 0800 bfi r8, ip, #0, #1
  15281. 80272ee: 46c4 mov ip, r8
  15282. 80272f0: f360 0c41 bfi ip, r0, #1, #1
  15283. 80272f4: 4660 mov r0, ip
  15284. }
  15285. break;
  15286. }
  15287. /* Width */
  15288. if (ch >= '0' && ch <= '9') {
  15289. 80272f6: f1a1 0330 sub.w r3, r1, #48 ; 0x30
  15290. 80272fa: f362 00c3 bfi r0, r2, #3, #1
  15291. 80272fe: 2b09 cmp r3, #9
  15292. 8027300: f88d 0028 strb.w r0, [sp, #40] ; 0x28
  15293. 8027304: d81d bhi.n 8027342 <tfp_format+0xd6>
  15294. 8027306: e004 b.n 8027312 <tfp_format+0xa6>
  15295. unsigned int num = 0;
  15296. int digit;
  15297. while ((digit = a2d(ch)) >= 0) {
  15298. if (digit > base)
  15299. break;
  15300. num = num * base + digit;
  15301. 8027308: fb00 3202 mla r2, r0, r2, r3
  15302. ch = *p++;
  15303. 802730c: f817 1b01 ldrb.w r1, [r7], #1
  15304. 8027310: e001 b.n 8027316 <tfp_format+0xaa>
  15305. }
  15306. break;
  15307. }
  15308. /* Width */
  15309. if (ch >= '0' && ch <= '9') {
  15310. 8027312: 2200 movs r2, #0
  15311. unsigned int num = 0;
  15312. int digit;
  15313. while ((digit = a2d(ch)) >= 0) {
  15314. if (digit > base)
  15315. break;
  15316. num = num * base + digit;
  15317. 8027314: 200a movs r0, #10
  15318. ui2a(num, p);
  15319. }
  15320. static int a2d(char ch)
  15321. {
  15322. if (ch >= '0' && ch <= '9')
  15323. 8027316: f1a1 0330 sub.w r3, r1, #48 ; 0x30
  15324. 802731a: fa5f fc83 uxtb.w ip, r3
  15325. 802731e: f1bc 0f09 cmp.w ip, #9
  15326. 8027322: d9f1 bls.n 8027308 <tfp_format+0x9c>
  15327. return ch - '0';
  15328. else if (ch >= 'a' && ch <= 'f')
  15329. 8027324: f1a1 0361 sub.w r3, r1, #97 ; 0x61
  15330. 8027328: 2b05 cmp r3, #5
  15331. 802732a: d802 bhi.n 8027332 <tfp_format+0xc6>
  15332. return ch - 'a' + 10;
  15333. 802732c: f1a1 0357 sub.w r3, r1, #87 ; 0x57
  15334. 8027330: e1b5 b.n 802769e <tfp_format+0x432>
  15335. else if (ch >= 'A' && ch <= 'F')
  15336. 8027332: f1a1 0341 sub.w r3, r1, #65 ; 0x41
  15337. 8027336: 2b05 cmp r3, #5
  15338. 8027338: d802 bhi.n 8027340 <tfp_format+0xd4>
  15339. return ch - 'A' + 10;
  15340. 802733a: f1a1 0337 sub.w r3, r1, #55 ; 0x37
  15341. 802733e: e1ae b.n 802769e <tfp_format+0x432>
  15342. break;
  15343. num = num * base + digit;
  15344. ch = *p++;
  15345. }
  15346. *src = p;
  15347. *nump = num;
  15348. 8027340: 920b str r2, [sp, #44] ; 0x2c
  15349. }
  15350. /* We accept 'x.y' format but don't support it completely:
  15351. * we ignore the 'y' digit => this ignores 0-fill
  15352. * size and makes it == width (ie. 'x') */
  15353. if (ch == '.') {
  15354. 8027342: 292e cmp r1, #46 ; 0x2e
  15355. 8027344: d10e bne.n 8027364 <tfp_format+0xf8>
  15356. //p.lz = 1; /* zero-padding */
  15357. /* ignore actual 0-fill size: */
  15358. ch = *(fmt++);
  15359. if (ch >= '0' && ch <= '9')
  15360. 8027346: 783a ldrb r2, [r7, #0]
  15361. 8027348: 3a30 subs r2, #48 ; 0x30
  15362. 802734a: b2d2 uxtb r2, r2
  15363. * we ignore the 'y' digit => this ignores 0-fill
  15364. * size and makes it == width (ie. 'x') */
  15365. if (ch == '.') {
  15366. //p.lz = 1; /* zero-padding */
  15367. /* ignore actual 0-fill size: */
  15368. ch = *(fmt++);
  15369. 802734c: 1c7b adds r3, r7, #1
  15370. if (ch >= '0' && ch <= '9')
  15371. 802734e: 2a09 cmp r2, #9
  15372. p.prec = ch - '0';
  15373. 8027350: bf98 it ls
  15374. 8027352: f88d 203c strbls.w r2, [sp, #60] ; 0x3c
  15375. do
  15376. {
  15377. ch = *(fmt++);
  15378. 8027356: f813 1b01 ldrb.w r1, [r3], #1
  15379. } while (ch >= '0' && ch <= '9');
  15380. 802735a: f1a1 0230 sub.w r2, r1, #48 ; 0x30
  15381. 802735e: 2a09 cmp r2, #9
  15382. ch = *(fmt++);
  15383. if (ch >= '0' && ch <= '9')
  15384. p.prec = ch - '0';
  15385. do
  15386. {
  15387. ch = *(fmt++);
  15388. 8027360: 461f mov r7, r3
  15389. } while (ch >= '0' && ch <= '9');
  15390. 8027362: d9f8 bls.n 8027356 <tfp_format+0xea>
  15391. }
  15392. #ifdef PRINTF_SIZE_T_SUPPORT
  15393. # ifdef PRINTF_LONG_SUPPORT
  15394. if (ch == 'z') {
  15395. 8027364: 297a cmp r1, #122 ; 0x7a
  15396. 8027366: d102 bne.n 802736e <tfp_format+0x102>
  15397. ch = *(fmt++);
  15398. 8027368: f817 1b01 ldrb.w r1, [r7], #1
  15399. 802736c: e005 b.n 802737a <tfp_format+0x10e>
  15400. } else
  15401. # endif
  15402. #endif
  15403. #ifdef PRINTF_LONG_SUPPORT
  15404. if (ch == 'l') {
  15405. 802736e: 296c cmp r1, #108 ; 0x6c
  15406. 8027370: d109 bne.n 8027386 <tfp_format+0x11a>
  15407. ch = *(fmt++);
  15408. 8027372: 7839 ldrb r1, [r7, #0]
  15409. lng = 1;
  15410. #ifdef PRINTF_LONG_LONG_SUPPORT
  15411. if (ch == 'l') {
  15412. 8027374: 296c cmp r1, #108 ; 0x6c
  15413. 8027376: d002 beq.n 802737e <tfp_format+0x112>
  15414. # endif
  15415. #endif
  15416. #ifdef PRINTF_LONG_SUPPORT
  15417. if (ch == 'l') {
  15418. ch = *(fmt++);
  15419. 8027378: 3701 adds r7, #1
  15420. lng = 1;
  15421. 802737a: 2301 movs r3, #1
  15422. 802737c: e004 b.n 8027388 <tfp_format+0x11c>
  15423. #ifdef PRINTF_LONG_LONG_SUPPORT
  15424. if (ch == 'l') {
  15425. ch = *(fmt++);
  15426. 802737e: 7879 ldrb r1, [r7, #1]
  15427. lng = 2;
  15428. 8027380: 2302 movs r3, #2
  15429. if (ch == 'l') {
  15430. ch = *(fmt++);
  15431. lng = 1;
  15432. #ifdef PRINTF_LONG_LONG_SUPPORT
  15433. if (ch == 'l') {
  15434. ch = *(fmt++);
  15435. 8027382: 3702 adds r7, #2
  15436. 8027384: e000 b.n 8027388 <tfp_format+0x11c>
  15437. while ((ch = *(fmt++))) {
  15438. if (ch != '%') {
  15439. putf(putp, ch);
  15440. } else {
  15441. #ifdef PRINTF_LONG_SUPPORT
  15442. char lng = 0; /* 1 for long, 2 for long long */
  15443. 8027386: 2300 movs r3, #0
  15444. lng = 2;
  15445. }
  15446. #endif
  15447. }
  15448. #endif
  15449. switch (ch) {
  15450. 8027388: 2969 cmp r1, #105 ; 0x69
  15451. 802738a: d036 beq.n 80273fa <tfp_format+0x18e>
  15452. 802738c: d816 bhi.n 80273bc <tfp_format+0x150>
  15453. 802738e: 2963 cmp r1, #99 ; 0x63
  15454. 8027390: f000 80a1 beq.w 80274d6 <tfp_format+0x26a>
  15455. 8027394: d80c bhi.n 80273b0 <tfp_format+0x144>
  15456. 8027396: 2946 cmp r1, #70 ; 0x46
  15457. 8027398: f000 80b3 beq.w 8027502 <tfp_format+0x296>
  15458. 802739c: d806 bhi.n 80273ac <tfp_format+0x140>
  15459. 802739e: 2900 cmp r1, #0
  15460. 80273a0: f000 8181 beq.w 80276a6 <tfp_format+0x43a>
  15461. 80273a4: 2925 cmp r1, #37 ; 0x25
  15462. 80273a6: f040 8174 bne.w 8027692 <tfp_format+0x426>
  15463. 80273aa: e0a7 b.n 80274fc <tfp_format+0x290>
  15464. 80273ac: 2958 cmp r1, #88 ; 0x58
  15465. 80273ae: e012 b.n 80273d6 <tfp_format+0x16a>
  15466. 80273b0: 2964 cmp r1, #100 ; 0x64
  15467. 80273b2: d022 beq.n 80273fa <tfp_format+0x18e>
  15468. 80273b4: 2966 cmp r1, #102 ; 0x66
  15469. 80273b6: f040 816c bne.w 8027692 <tfp_format+0x426>
  15470. 80273ba: e0a2 b.n 8027502 <tfp_format+0x296>
  15471. 80273bc: 2973 cmp r1, #115 ; 0x73
  15472. 80273be: f000 8090 beq.w 80274e2 <tfp_format+0x276>
  15473. 80273c2: d805 bhi.n 80273d0 <tfp_format+0x164>
  15474. 80273c4: 296f cmp r1, #111 ; 0x6f
  15475. 80273c6: d078 beq.n 80274ba <tfp_format+0x24e>
  15476. 80273c8: 2970 cmp r1, #112 ; 0x70
  15477. 80273ca: f040 8162 bne.w 8027692 <tfp_format+0x426>
  15478. 80273ce: e040 b.n 8027452 <tfp_format+0x1e6>
  15479. 80273d0: 2975 cmp r1, #117 ; 0x75
  15480. 80273d2: d003 beq.n 80273dc <tfp_format+0x170>
  15481. 80273d4: 2978 cmp r1, #120 ; 0x78
  15482. 80273d6: f040 815c bne.w 8027692 <tfp_format+0x426>
  15483. 80273da: e041 b.n 8027460 <tfp_format+0x1f4>
  15484. case 0:
  15485. goto abort;
  15486. case 'u':
  15487. p.base = 10;
  15488. 80273dc: 220a movs r2, #10
  15489. #ifdef PRINTF_LONG_SUPPORT
  15490. #ifdef PRINTF_LONG_LONG_SUPPORT
  15491. if (2 == lng)
  15492. 80273de: 2b02 cmp r3, #2
  15493. #endif
  15494. switch (ch) {
  15495. case 0:
  15496. goto abort;
  15497. case 'u':
  15498. p.base = 10;
  15499. 80273e0: 920d str r2, [sp, #52] ; 0x34
  15500. #ifdef PRINTF_LONG_SUPPORT
  15501. #ifdef PRINTF_LONG_LONG_SUPPORT
  15502. if (2 == lng)
  15503. 80273e2: d107 bne.n 80273f4 <tfp_format+0x188>
  15504. ulli2a(va_arg(va, unsigned long long int), &p);
  15505. 80273e4: 3407 adds r4, #7
  15506. 80273e6: f024 0307 bic.w r3, r4, #7
  15507. 80273ea: f103 0408 add.w r4, r3, #8
  15508. 80273ee: e9d3 0100 ldrd r0, r1, [r3]
  15509. 80273f2: e017 b.n 8027424 <tfp_format+0x1b8>
  15510. else
  15511. #endif
  15512. if (1 == lng)
  15513. uli2a(va_arg(va, unsigned long int), &p);
  15514. 80273f4: 6820 ldr r0, [r4, #0]
  15515. 80273f6: a90a add r1, sp, #40 ; 0x28
  15516. 80273f8: e04f b.n 802749a <tfp_format+0x22e>
  15517. ui2a(va_arg(va, unsigned int), &p);
  15518. putchw(putp, putf, &p);
  15519. break;
  15520. case 'd':
  15521. case 'i':
  15522. p.base = 10;
  15523. 80273fa: 220a movs r2, #10
  15524. #ifdef PRINTF_LONG_SUPPORT
  15525. #ifdef PRINTF_LONG_LONG_SUPPORT
  15526. if (2 == lng)
  15527. 80273fc: 2b02 cmp r3, #2
  15528. ui2a(va_arg(va, unsigned int), &p);
  15529. putchw(putp, putf, &p);
  15530. break;
  15531. case 'd':
  15532. case 'i':
  15533. p.base = 10;
  15534. 80273fe: 920d str r2, [sp, #52] ; 0x34
  15535. #ifdef PRINTF_LONG_SUPPORT
  15536. #ifdef PRINTF_LONG_LONG_SUPPORT
  15537. if (2 == lng)
  15538. 8027400: d112 bne.n 8027428 <tfp_format+0x1bc>
  15539. lli2a(va_arg(va, long long int), &p);
  15540. 8027402: 3407 adds r4, #7
  15541. 8027404: f024 0307 bic.w r3, r4, #7
  15542. 8027408: e9d3 0100 ldrd r0, r1, [r3]
  15543. 802740c: f103 0408 add.w r4, r3, #8
  15544. *bf = 0;
  15545. }
  15546. static void lli2a(long long int num, struct param *p)
  15547. {
  15548. if (num < 0) {
  15549. 8027410: 2800 cmp r0, #0
  15550. 8027412: f171 0300 sbcs.w r3, r1, #0
  15551. 8027416: da05 bge.n 8027424 <tfp_format+0x1b8>
  15552. num = -num;
  15553. p->sign = '-';
  15554. 8027418: 232d movs r3, #45 ; 0x2d
  15555. }
  15556. static void lli2a(long long int num, struct param *p)
  15557. {
  15558. if (num < 0) {
  15559. num = -num;
  15560. 802741a: 4240 negs r0, r0
  15561. 802741c: eb61 0141 sbc.w r1, r1, r1, lsl #1
  15562. p->sign = '-';
  15563. 8027420: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  15564. }
  15565. ulli2a(num, p);
  15566. 8027424: aa0a add r2, sp, #40 ; 0x28
  15567. 8027426: e033 b.n 8027490 <tfp_format+0x224>
  15568. #ifdef PRINTF_LONG_LONG_SUPPORT
  15569. if (2 == lng)
  15570. lli2a(va_arg(va, long long int), &p);
  15571. else
  15572. #endif
  15573. if (1 == lng)
  15574. 8027428: 2b01 cmp r3, #1
  15575. li2a(va_arg(va, long int), &p);
  15576. 802742a: 6820 ldr r0, [r4, #0]
  15577. 802742c: f104 0804 add.w r8, r4, #4
  15578. #ifdef PRINTF_LONG_LONG_SUPPORT
  15579. if (2 == lng)
  15580. lli2a(va_arg(va, long long int), &p);
  15581. else
  15582. #endif
  15583. if (1 == lng)
  15584. 8027430: d107 bne.n 8027442 <tfp_format+0x1d6>
  15585. *bf = 0;
  15586. }
  15587. static void li2a(long num, struct param *p)
  15588. {
  15589. if (num < 0) {
  15590. 8027432: 2800 cmp r0, #0
  15591. 8027434: da03 bge.n 802743e <tfp_format+0x1d2>
  15592. num = -num;
  15593. p->sign = '-';
  15594. 8027436: 232d movs r3, #45 ; 0x2d
  15595. }
  15596. static void li2a(long num, struct param *p)
  15597. {
  15598. if (num < 0) {
  15599. num = -num;
  15600. 8027438: 4240 negs r0, r0
  15601. p->sign = '-';
  15602. 802743a: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  15603. }
  15604. uli2a(num, p);
  15605. 802743e: a90a add r1, sp, #40 ; 0x28
  15606. 8027440: e02f b.n 80274a2 <tfp_format+0x236>
  15607. *bf = 0;
  15608. }
  15609. static void i2a(int num, struct param *p)
  15610. {
  15611. if (num < 0) {
  15612. 8027442: 2800 cmp r0, #0
  15613. 8027444: da03 bge.n 802744e <tfp_format+0x1e2>
  15614. num = -num;
  15615. p->sign = '-';
  15616. 8027446: 232d movs r3, #45 ; 0x2d
  15617. }
  15618. static void i2a(int num, struct param *p)
  15619. {
  15620. if (num < 0) {
  15621. num = -num;
  15622. 8027448: 4240 negs r0, r0
  15623. p->sign = '-';
  15624. 802744a: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  15625. }
  15626. ui2a(num, p);
  15627. 802744e: a90a add r1, sp, #40 ; 0x28
  15628. 8027450: e02a b.n 80274a8 <tfp_format+0x23c>
  15629. i2a(va_arg(va, int), &p);
  15630. putchw(putp, putf, &p);
  15631. break;
  15632. #ifdef SIZEOF_POINTER
  15633. case 'p':
  15634. p.alt = 1;
  15635. 8027452: f89d 3028 ldrb.w r3, [sp, #40] ; 0x28
  15636. 8027456: f043 0302 orr.w r3, r3, #2
  15637. 802745a: f88d 3028 strb.w r3, [sp, #40] ; 0x28
  15638. # if defined(SIZEOF_INT) && SIZEOF_POINTER <= SIZEOF_INT
  15639. lng = 0;
  15640. 802745e: 2300 movs r3, #0
  15641. lng = 2;
  15642. # endif
  15643. #endif
  15644. case 'x':
  15645. case 'X':
  15646. p.base = 16;
  15647. 8027460: 2210 movs r2, #16
  15648. p.uc = (ch == 'X')?1:0;
  15649. 8027462: f1b1 0e58 subs.w lr, r1, #88 ; 0x58
  15650. 8027466: f1de 0100 rsbs r1, lr, #0
  15651. 802746a: f89d 0028 ldrb.w r0, [sp, #40] ; 0x28
  15652. lng = 2;
  15653. # endif
  15654. #endif
  15655. case 'x':
  15656. case 'X':
  15657. p.base = 16;
  15658. 802746e: 920d str r2, [sp, #52] ; 0x34
  15659. p.uc = (ch == 'X')?1:0;
  15660. 8027470: eb51 010e adcs.w r1, r1, lr
  15661. 8027474: aa1a add r2, sp, #104 ; 0x68
  15662. 8027476: f361 0082 bfi r0, r1, #2, #1
  15663. #ifdef PRINTF_LONG_SUPPORT
  15664. #ifdef PRINTF_LONG_LONG_SUPPORT
  15665. if (2 == lng)
  15666. 802747a: 2b02 cmp r3, #2
  15667. # endif
  15668. #endif
  15669. case 'x':
  15670. case 'X':
  15671. p.base = 16;
  15672. p.uc = (ch == 'X')?1:0;
  15673. 802747c: f802 0d40 strb.w r0, [r2, #-64]!
  15674. #ifdef PRINTF_LONG_SUPPORT
  15675. #ifdef PRINTF_LONG_LONG_SUPPORT
  15676. if (2 == lng)
  15677. 8027480: d109 bne.n 8027496 <tfp_format+0x22a>
  15678. ulli2a(va_arg(va, unsigned long long int), &p);
  15679. 8027482: 3407 adds r4, #7
  15680. 8027484: f024 0307 bic.w r3, r4, #7
  15681. 8027488: e9d3 0100 ldrd r0, r1, [r3]
  15682. 802748c: f103 0408 add.w r4, r3, #8
  15683. 8027490: f7ff fdbe bl 8027010 <ulli2a>
  15684. 8027494: e00b b.n 80274ae <tfp_format+0x242>
  15685. else
  15686. #endif
  15687. if (1 == lng)
  15688. uli2a(va_arg(va, unsigned long int), &p);
  15689. 8027496: 6820 ldr r0, [r4, #0]
  15690. 8027498: 4611 mov r1, r2
  15691. #ifdef PRINTF_LONG_LONG_SUPPORT
  15692. if (2 == lng)
  15693. ulli2a(va_arg(va, unsigned long long int), &p);
  15694. else
  15695. #endif
  15696. if (1 == lng)
  15697. 802749a: 2b01 cmp r3, #1
  15698. 802749c: f104 0804 add.w r8, r4, #4
  15699. 80274a0: d102 bne.n 80274a8 <tfp_format+0x23c>
  15700. uli2a(va_arg(va, unsigned long int), &p);
  15701. 80274a2: f7ff fe0b bl 80270bc <uli2a>
  15702. 80274a6: e001 b.n 80274ac <tfp_format+0x240>
  15703. else
  15704. #endif
  15705. ui2a(va_arg(va, unsigned int), &p);
  15706. 80274a8: f7ff fe33 bl 8027112 <ui2a>
  15707. 80274ac: 4644 mov r4, r8
  15708. putchw(putp, putf, &p);
  15709. 80274ae: 4628 mov r0, r5
  15710. 80274b0: 4631 mov r1, r6
  15711. 80274b2: aa0a add r2, sp, #40 ; 0x28
  15712. 80274b4: f7ff fe58 bl 8027168 <putchw>
  15713. break;
  15714. 80274b8: e0eb b.n 8027692 <tfp_format+0x426>
  15715. case 'o':
  15716. p.base = 8;
  15717. 80274ba: 2308 movs r3, #8
  15718. ui2a(va_arg(va, unsigned int), &p);
  15719. 80274bc: 6820 ldr r0, [r4, #0]
  15720. #endif
  15721. ui2a(va_arg(va, unsigned int), &p);
  15722. putchw(putp, putf, &p);
  15723. break;
  15724. case 'o':
  15725. p.base = 8;
  15726. 80274be: 930d str r3, [sp, #52] ; 0x34
  15727. ui2a(va_arg(va, unsigned int), &p);
  15728. 80274c0: a90a add r1, sp, #40 ; 0x28
  15729. 80274c2: f7ff fe26 bl 8027112 <ui2a>
  15730. putchw(putp, putf, &p);
  15731. 80274c6: 4628 mov r0, r5
  15732. 80274c8: 4631 mov r1, r6
  15733. 80274ca: aa0a add r2, sp, #40 ; 0x28
  15734. ui2a(va_arg(va, unsigned int), &p);
  15735. putchw(putp, putf, &p);
  15736. break;
  15737. case 'o':
  15738. p.base = 8;
  15739. ui2a(va_arg(va, unsigned int), &p);
  15740. 80274cc: f104 0804 add.w r8, r4, #4
  15741. putchw(putp, putf, &p);
  15742. 80274d0: f7ff fe4a bl 8027168 <putchw>
  15743. 80274d4: e010 b.n 80274f8 <tfp_format+0x28c>
  15744. break;
  15745. case 'c':
  15746. putf(putp, (char)(va_arg(va, int)));
  15747. 80274d6: 4628 mov r0, r5
  15748. 80274d8: 7821 ldrb r1, [r4, #0]
  15749. 80274da: f104 0804 add.w r8, r4, #4
  15750. 80274de: 47b0 blx r6
  15751. 80274e0: e00a b.n 80274f8 <tfp_format+0x28c>
  15752. break;
  15753. case 's':
  15754. p.bf = va_arg(va, char *);
  15755. 80274e2: 6823 ldr r3, [r4, #0]
  15756. putchw(putp, putf, &p);
  15757. 80274e4: aa0a add r2, sp, #40 ; 0x28
  15758. 80274e6: 4628 mov r0, r5
  15759. 80274e8: 4631 mov r1, r6
  15760. break;
  15761. case 'c':
  15762. putf(putp, (char)(va_arg(va, int)));
  15763. break;
  15764. case 's':
  15765. p.bf = va_arg(va, char *);
  15766. 80274ea: 930e str r3, [sp, #56] ; 0x38
  15767. putchw(putp, putf, &p);
  15768. 80274ec: f7ff fe3c bl 8027168 <putchw>
  15769. p.bf = bf;
  15770. 80274f0: aa04 add r2, sp, #16
  15771. break;
  15772. case 'c':
  15773. putf(putp, (char)(va_arg(va, int)));
  15774. break;
  15775. case 's':
  15776. p.bf = va_arg(va, char *);
  15777. 80274f2: f104 0804 add.w r8, r4, #4
  15778. putchw(putp, putf, &p);
  15779. p.bf = bf;
  15780. 80274f6: 920e str r2, [sp, #56] ; 0x38
  15781. break;
  15782. case 'c':
  15783. putf(putp, (char)(va_arg(va, int)));
  15784. break;
  15785. case 's':
  15786. p.bf = va_arg(va, char *);
  15787. 80274f8: 4644 mov r4, r8
  15788. putchw(putp, putf, &p);
  15789. p.bf = bf;
  15790. break;
  15791. 80274fa: e0ca b.n 8027692 <tfp_format+0x426>
  15792. case '%':
  15793. putf(putp, ch);
  15794. 80274fc: 4628 mov r0, r5
  15795. 80274fe: 47b0 blx r6
  15796. break;
  15797. 8027500: e0c7 b.n 8027692 <tfp_format+0x426>
  15798. case 'f':
  15799. case 'F':
  15800. fval = va_arg(va, double);
  15801. 8027502: 3407 adds r4, #7
  15802. 8027504: f024 0307 bic.w r3, r4, #7
  15803. 8027508: f103 0408 add.w r4, r3, #8
  15804. 802750c: e893 0404 ldmia.w r3, {r2, sl}
  15805. 8027510: 9200 str r2, [sp, #0]
  15806. sign = 0;
  15807. if (fval < 0)
  15808. 8027512: 4610 mov r0, r2
  15809. 8027514: 4651 mov r1, sl
  15810. 8027516: 2200 movs r2, #0
  15811. 8027518: 2300 movs r3, #0
  15812. 802751a: f7f9 fac3 bl 8020aa4 <__aeabi_dcmplt>
  15813. 802751e: b138 cbz r0, 8027530 <tfp_format+0x2c4>
  15814. {
  15815. sign = 1;
  15816. p.width--;
  15817. 8027520: 9b0b ldr r3, [sp, #44] ; 0x2c
  15818. 8027522: 3b01 subs r3, #1
  15819. 8027524: 930b str r3, [sp, #44] ; 0x2c
  15820. fval = - fval;
  15821. 8027526: f10a 4a00 add.w sl, sl, #2147483648 ; 0x80000000
  15822. case 'F':
  15823. fval = va_arg(va, double);
  15824. sign = 0;
  15825. if (fval < 0)
  15826. {
  15827. sign = 1;
  15828. 802752a: f04f 0b01 mov.w fp, #1
  15829. 802752e: e009 b.n 8027544 <tfp_format+0x2d8>
  15830. p.width--;
  15831. fval = - fval;
  15832. }
  15833. else if (p.sign) {
  15834. 8027530: f89d 3030 ldrb.w r3, [sp, #48] ; 0x30
  15835. 8027534: b12b cbz r3, 8027542 <tfp_format+0x2d6>
  15836. sign = 2;
  15837. p.width--;
  15838. 8027536: 9b0b ldr r3, [sp, #44] ; 0x2c
  15839. 8027538: 3b01 subs r3, #1
  15840. 802753a: 930b str r3, [sp, #44] ; 0x2c
  15841. sign = 1;
  15842. p.width--;
  15843. fval = - fval;
  15844. }
  15845. else if (p.sign) {
  15846. sign = 2;
  15847. 802753c: f04f 0b02 mov.w fp, #2
  15848. 8027540: e000 b.n 8027544 <tfp_format+0x2d8>
  15849. putf(putp, ch);
  15850. break;
  15851. case 'f':
  15852. case 'F':
  15853. fval = va_arg(va, double);
  15854. sign = 0;
  15855. 8027542: 469b mov fp, r3
  15856. else if (p.sign) {
  15857. sign = 2;
  15858. p.width--;
  15859. }
  15860. fpart = (int)fval;
  15861. 8027544: 4651 mov r1, sl
  15862. 8027546: 9800 ldr r0, [sp, #0]
  15863. 8027548: f7f9 fad4 bl 8020af4 <__aeabi_d2iz>
  15864. fiter = 0;
  15865. 802754c: 2200 movs r2, #0
  15866. else if (p.sign) {
  15867. sign = 2;
  15868. p.width--;
  15869. }
  15870. fpart = (int)fval;
  15871. 802754e: 9001 str r0, [sp, #4]
  15872. 8027550: 4680 mov r8, r0
  15873. fiter = 0;
  15874. while (fpart != 0)
  15875. {
  15876. temp_buffer[fiter++] = fpart % 10;
  15877. 8027552: 210a movs r1, #10
  15878. }
  15879. fpart = (int)fval;
  15880. fiter = 0;
  15881. while (fpart != 0)
  15882. 8027554: e008 b.n 8027568 <tfp_format+0x2fc>
  15883. {
  15884. temp_buffer[fiter++] = fpart % 10;
  15885. 8027556: fb98 f0f1 sdiv r0, r8, r1
  15886. 802755a: ab10 add r3, sp, #64 ; 0x40
  15887. 802755c: fb01 8810 mls r8, r1, r0, r8
  15888. 8027560: f843 8022 str.w r8, [r3, r2, lsl #2]
  15889. 8027564: 3201 adds r2, #1
  15890. fpart = fpart / 10;
  15891. 8027566: 4680 mov r8, r0
  15892. }
  15893. fpart = (int)fval;
  15894. fiter = 0;
  15895. while (fpart != 0)
  15896. 8027568: f1b8 0f00 cmp.w r8, #0
  15897. 802756c: d1f3 bne.n 8027556 <tfp_format+0x2ea>
  15898. temp_buffer[fiter++] = fpart % 10;
  15899. fpart = fpart / 10;
  15900. }
  15901. fiter--;
  15902. if (fiter == -1)
  15903. 802756e: f102 39ff add.w r9, r2, #4294967295
  15904. 8027572: b912 cbnz r2, 802757a <tfp_format+0x30e>
  15905. p.width--;
  15906. 8027574: 9a0b ldr r2, [sp, #44] ; 0x2c
  15907. 8027576: 3a01 subs r2, #1
  15908. 8027578: 920b str r2, [sp, #44] ; 0x2c
  15909. /* Leading zeros */
  15910. if (p.lz) {
  15911. 802757a: f89d 2028 ldrb.w r2, [sp, #40] ; 0x28
  15912. 802757e: 07d0 lsls r0, r2, #31
  15913. 8027580: d51b bpl.n 80275ba <tfp_format+0x34e>
  15914. if (sign == 1)
  15915. 8027582: f1bb 0f01 cmp.w fp, #1
  15916. 8027586: d102 bne.n 802758e <tfp_format+0x322>
  15917. putf(putp, '-');
  15918. 8027588: 4628 mov r0, r5
  15919. 802758a: 212d movs r1, #45 ; 0x2d
  15920. 802758c: e007 b.n 802759e <tfp_format+0x332>
  15921. else if (sign == 2)
  15922. 802758e: f1bb 0f02 cmp.w fp, #2
  15923. 8027592: d105 bne.n 80275a0 <tfp_format+0x334>
  15924. putf(putp, '+');
  15925. 8027594: 4628 mov r0, r5
  15926. 8027596: 212b movs r1, #43 ; 0x2b
  15927. 8027598: e001 b.n 802759e <tfp_format+0x332>
  15928. while (p.width-- > p.prec + fiter + 2)
  15929. {
  15930. putf(putp, '0');
  15931. 802759a: 4628 mov r0, r5
  15932. 802759c: 2130 movs r1, #48 ; 0x30
  15933. 802759e: 47b0 blx r6
  15934. if (sign == 1)
  15935. putf(putp, '-');
  15936. else if (sign == 2)
  15937. putf(putp, '+');
  15938. while (p.width-- > p.prec + fiter + 2)
  15939. 80275a0: f89d 203c ldrb.w r2, [sp, #60] ; 0x3c
  15940. 80275a4: 9b0b ldr r3, [sp, #44] ; 0x2c
  15941. 80275a6: 444a add r2, r9
  15942. 80275a8: 3202 adds r2, #2
  15943. 80275aa: 1e59 subs r1, r3, #1
  15944. 80275ac: 4293 cmp r3, r2
  15945. 80275ae: 910b str r1, [sp, #44] ; 0x2c
  15946. 80275b0: dcf3 bgt.n 802759a <tfp_format+0x32e>
  15947. 80275b2: e017 b.n 80275e4 <tfp_format+0x378>
  15948. else
  15949. {
  15950. while (p.width-- > p.prec + fiter + 2)
  15951. {
  15952. putf(putp, ' ');
  15953. 80275b4: 4628 mov r0, r5
  15954. 80275b6: 2120 movs r1, #32
  15955. 80275b8: 47b0 blx r6
  15956. }
  15957. }
  15958. else
  15959. {
  15960. while (p.width-- > p.prec + fiter + 2)
  15961. 80275ba: f89d 103c ldrb.w r1, [sp, #60] ; 0x3c
  15962. 80275be: 9a0b ldr r2, [sp, #44] ; 0x2c
  15963. 80275c0: 4449 add r1, r9
  15964. 80275c2: 3102 adds r1, #2
  15965. 80275c4: 1e50 subs r0, r2, #1
  15966. 80275c6: 428a cmp r2, r1
  15967. 80275c8: 900b str r0, [sp, #44] ; 0x2c
  15968. 80275ca: dcf3 bgt.n 80275b4 <tfp_format+0x348>
  15969. {
  15970. putf(putp, ' ');
  15971. }
  15972. if (sign == 1)
  15973. 80275cc: f1bb 0f01 cmp.w fp, #1
  15974. 80275d0: d102 bne.n 80275d8 <tfp_format+0x36c>
  15975. putf(putp, '-');
  15976. 80275d2: 4628 mov r0, r5
  15977. 80275d4: 212d movs r1, #45 ; 0x2d
  15978. 80275d6: e004 b.n 80275e2 <tfp_format+0x376>
  15979. else if (sign == 2)
  15980. 80275d8: f1bb 0f02 cmp.w fp, #2
  15981. 80275dc: d102 bne.n 80275e4 <tfp_format+0x378>
  15982. putf(putp, '+');
  15983. 80275de: 4628 mov r0, r5
  15984. 80275e0: 212b movs r1, #43 ; 0x2b
  15985. 80275e2: 47b0 blx r6
  15986. }
  15987. if (fiter == -1)
  15988. 80275e4: f1b9 3fff cmp.w r9, #4294967295
  15989. 80275e8: d102 bne.n 80275f0 <tfp_format+0x384>
  15990. putf(putp, '0');
  15991. 80275ea: 4628 mov r0, r5
  15992. 80275ec: 2130 movs r1, #48 ; 0x30
  15993. 80275ee: e007 b.n 8027600 <tfp_format+0x394>
  15994. while (fiter > -1)
  15995. {
  15996. putf(putp, '0' + (temp_buffer[fiter--]));
  15997. 80275f0: ab10 add r3, sp, #64 ; 0x40
  15998. 80275f2: 4628 mov r0, r5
  15999. 80275f4: f853 1029 ldr.w r1, [r3, r9, lsl #2]
  16000. 80275f8: 3130 adds r1, #48 ; 0x30
  16001. 80275fa: f109 39ff add.w r9, r9, #4294967295
  16002. 80275fe: b2c9 uxtb r1, r1
  16003. 8027600: 47b0 blx r6
  16004. }
  16005. if (fiter == -1)
  16006. putf(putp, '0');
  16007. while (fiter > -1)
  16008. 8027602: f1b9 3fff cmp.w r9, #4294967295
  16009. 8027606: d1f3 bne.n 80275f0 <tfp_format+0x384>
  16010. {
  16011. putf(putp, '0' + (temp_buffer[fiter--]));
  16012. }
  16013. putf(putp, '.');
  16014. 8027608: 4628 mov r0, r5
  16015. 802760a: 212e movs r1, #46 ; 0x2e
  16016. 802760c: 47b0 blx r6
  16017. ffactor = 1;
  16018. 802760e: f04f 0901 mov.w r9, #1
  16019. while (p.prec-- > 0)
  16020. 8027612: e01d b.n 8027650 <tfp_format+0x3e4>
  16021. {
  16022. ffactor *= 10;
  16023. 8027614: 230a movs r3, #10
  16024. fpart = (int)((fval - (int)fval)*ffactor);
  16025. 8027616: 9801 ldr r0, [sp, #4]
  16026. putf(putp, '.');
  16027. ffactor = 1;
  16028. while (p.prec-- > 0)
  16029. {
  16030. ffactor *= 10;
  16031. 8027618: fb03 f909 mul.w r9, r3, r9
  16032. fpart = (int)((fval - (int)fval)*ffactor);
  16033. 802761c: f7f8 ff6a bl 80204f4 <__aeabi_i2d>
  16034. 8027620: 4602 mov r2, r0
  16035. 8027622: 460b mov r3, r1
  16036. 8027624: 9800 ldr r0, [sp, #0]
  16037. 8027626: 4651 mov r1, sl
  16038. 8027628: f7f8 fe16 bl 8020258 <__aeabi_dsub>
  16039. 802762c: e9cd 0102 strd r0, r1, [sp, #8]
  16040. 8027630: 4648 mov r0, r9
  16041. 8027632: f7f8 ff5f bl 80204f4 <__aeabi_i2d>
  16042. 8027636: 4602 mov r2, r0
  16043. 8027638: 460b mov r3, r1
  16044. 802763a: e9dd 0102 ldrd r0, r1, [sp, #8]
  16045. 802763e: f7f8 ffbf bl 80205c0 <__aeabi_dmul>
  16046. 8027642: f7f9 fa57 bl 8020af4 <__aeabi_d2iz>
  16047. if (fpart == 0)
  16048. 8027646: 4680 mov r8, r0
  16049. 8027648: b910 cbnz r0, 8027650 <tfp_format+0x3e4>
  16050. putf(putp, '0');
  16051. 802764a: 4628 mov r0, r5
  16052. 802764c: 2130 movs r1, #48 ; 0x30
  16053. 802764e: 47b0 blx r6
  16054. putf(putp, '0' + (temp_buffer[fiter--]));
  16055. }
  16056. putf(putp, '.');
  16057. ffactor = 1;
  16058. while (p.prec-- > 0)
  16059. 8027650: f89d 303c ldrb.w r3, [sp, #60] ; 0x3c
  16060. 8027654: 1e5a subs r2, r3, #1
  16061. 8027656: f88d 203c strb.w r2, [sp, #60] ; 0x3c
  16062. 802765a: 2b00 cmp r3, #0
  16063. 802765c: d1da bne.n 8027614 <tfp_format+0x3a8>
  16064. putf(putp, '0');
  16065. }
  16066. fiter = 0;
  16067. while (fpart != 0)
  16068. {
  16069. temp_buffer[fiter++] = fpart % 10;
  16070. 802765e: 220a movs r2, #10
  16071. 8027660: e008 b.n 8027674 <tfp_format+0x408>
  16072. 8027662: fb98 f1f2 sdiv r1, r8, r2
  16073. 8027666: a810 add r0, sp, #64 ; 0x40
  16074. 8027668: fb02 8811 mls r8, r2, r1, r8
  16075. 802766c: f840 8023 str.w r8, [r0, r3, lsl #2]
  16076. 8027670: 3301 adds r3, #1
  16077. fpart = fpart / 10;
  16078. 8027672: 4688 mov r8, r1
  16079. fpart = (int)((fval - (int)fval)*ffactor);
  16080. if (fpart == 0)
  16081. putf(putp, '0');
  16082. }
  16083. fiter = 0;
  16084. while (fpart != 0)
  16085. 8027674: f1b8 0f00 cmp.w r8, #0
  16086. 8027678: d1f3 bne.n 8027662 <tfp_format+0x3f6>
  16087. 802767a: 4698 mov r8, r3
  16088. temp_buffer[fiter++] = fpart % 10;
  16089. fpart = fpart / 10;
  16090. }
  16091. fiter--;
  16092. while (fiter > -1)
  16093. 802767c: e006 b.n 802768c <tfp_format+0x420>
  16094. {
  16095. putf(putp, '0' + (temp_buffer[fiter--]));
  16096. 802767e: ab10 add r3, sp, #64 ; 0x40
  16097. 8027680: 4628 mov r0, r5
  16098. 8027682: f853 1028 ldr.w r1, [r3, r8, lsl #2]
  16099. 8027686: 3130 adds r1, #48 ; 0x30
  16100. 8027688: b2c9 uxtb r1, r1
  16101. 802768a: 47b0 blx r6
  16102. temp_buffer[fiter++] = fpart % 10;
  16103. fpart = fpart / 10;
  16104. }
  16105. fiter--;
  16106. while (fiter > -1)
  16107. 802768c: f118 38ff adds.w r8, r8, #4294967295
  16108. 8027690: d2f5 bcs.n 802767e <tfp_format+0x412>
  16109. char bf[12]; /* int = 32b on some architectures */
  16110. #endif
  16111. char ch;
  16112. p.bf = bf;
  16113. while ((ch = *(fmt++))) {
  16114. 8027692: f817 1b01 ldrb.w r1, [r7], #1
  16115. 8027696: 2900 cmp r1, #0
  16116. 8027698: f47f adf2 bne.w 8027280 <tfp_format+0x14>
  16117. 802769c: e003 b.n 80276a6 <tfp_format+0x43a>
  16118. {
  16119. const char *p = *src;
  16120. unsigned int num = 0;
  16121. int digit;
  16122. while ((digit = a2d(ch)) >= 0) {
  16123. if (digit > base)
  16124. 802769e: 2b0a cmp r3, #10
  16125. 80276a0: f77f ae32 ble.w 8027308 <tfp_format+0x9c>
  16126. 80276a4: e64c b.n 8027340 <tfp_format+0xd4>
  16127. break;
  16128. }
  16129. }
  16130. }
  16131. abort:;
  16132. }
  16133. 80276a6: b01b add sp, #108 ; 0x6c
  16134. 80276a8: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  16135. 080276ac <tfp_printf>:
  16136. stdout_putf = putf;
  16137. stdout_putp = putp;
  16138. }
  16139. void tfp_printf(char *fmt, ...)
  16140. {
  16141. 80276ac: b40f push {r0, r1, r2, r3}
  16142. 80276ae: b507 push {r0, r1, r2, lr}
  16143. va_list va;
  16144. va_start(va, fmt);
  16145. tfp_format(stdout_putp, stdout_putf, fmt, va);
  16146. 80276b0: 4906 ldr r1, [pc, #24] ; (80276cc <tfp_printf+0x20>)
  16147. stdout_putf = putf;
  16148. stdout_putp = putp;
  16149. }
  16150. void tfp_printf(char *fmt, ...)
  16151. {
  16152. 80276b2: ab04 add r3, sp, #16
  16153. va_list va;
  16154. va_start(va, fmt);
  16155. tfp_format(stdout_putp, stdout_putf, fmt, va);
  16156. 80276b4: 6808 ldr r0, [r1, #0]
  16157. 80276b6: 4906 ldr r1, [pc, #24] ; (80276d0 <tfp_printf+0x24>)
  16158. stdout_putf = putf;
  16159. stdout_putp = putp;
  16160. }
  16161. void tfp_printf(char *fmt, ...)
  16162. {
  16163. 80276b8: f853 2b04 ldr.w r2, [r3], #4
  16164. va_list va;
  16165. va_start(va, fmt);
  16166. tfp_format(stdout_putp, stdout_putf, fmt, va);
  16167. 80276bc: 6809 ldr r1, [r1, #0]
  16168. }
  16169. void tfp_printf(char *fmt, ...)
  16170. {
  16171. va_list va;
  16172. va_start(va, fmt);
  16173. 80276be: 9301 str r3, [sp, #4]
  16174. tfp_format(stdout_putp, stdout_putf, fmt, va);
  16175. 80276c0: f7ff fdd4 bl 802726c <tfp_format>
  16176. va_end(va);
  16177. }
  16178. 80276c4: e8bd 400e ldmia.w sp!, {r1, r2, r3, lr}
  16179. 80276c8: b004 add sp, #16
  16180. 80276ca: 4770 bx lr
  16181. 80276cc: 200028a8 .word 0x200028a8
  16182. 80276d0: 200028a4 .word 0x200028a4
  16183. 080276d4 <tfp_vsnprintf>:
  16184. data->dest[data->num_chars] = c;
  16185. data->num_chars ++;
  16186. }
  16187. int tfp_vsnprintf(char *str, size_t size, const char *format, va_list ap)
  16188. {
  16189. 80276d4: b51f push {r0, r1, r2, r3, r4, lr}
  16190. 80276d6: 2400 movs r4, #0
  16191. struct _vsnprintf_putcf_data data;
  16192. if (size < 1)
  16193. 80276d8: b181 cbz r1, 80276fc <tfp_vsnprintf+0x28>
  16194. return 0;
  16195. data.dest = str;
  16196. data.dest_capacity = size-1;
  16197. 80276da: 3901 subs r1, #1
  16198. struct _vsnprintf_putcf_data data;
  16199. if (size < 1)
  16200. return 0;
  16201. data.dest = str;
  16202. 80276dc: 9002 str r0, [sp, #8]
  16203. data.dest_capacity = size-1;
  16204. 80276de: 9101 str r1, [sp, #4]
  16205. data.num_chars = 0;
  16206. tfp_format(&data, _vsnprintf_putcf, format, ap);
  16207. 80276e0: a801 add r0, sp, #4
  16208. 80276e2: 4908 ldr r1, [pc, #32] ; (8027704 <tfp_vsnprintf+0x30>)
  16209. if (size < 1)
  16210. return 0;
  16211. data.dest = str;
  16212. data.dest_capacity = size-1;
  16213. data.num_chars = 0;
  16214. 80276e4: 9403 str r4, [sp, #12]
  16215. tfp_format(&data, _vsnprintf_putcf, format, ap);
  16216. 80276e6: f7ff fdc1 bl 802726c <tfp_format>
  16217. if (data.num_chars < data.dest_capacity)
  16218. 80276ea: 9903 ldr r1, [sp, #12]
  16219. 80276ec: 9b01 ldr r3, [sp, #4]
  16220. 80276ee: 9a02 ldr r2, [sp, #8]
  16221. 80276f0: 4299 cmp r1, r3
  16222. data.dest[data.num_chars] = '\0';
  16223. 80276f2: bf34 ite cc
  16224. 80276f4: 5454 strbcc r4, [r2, r1]
  16225. else
  16226. data.dest[data.dest_capacity] = '\0';
  16227. 80276f6: 54d4 strbcs r4, [r2, r3]
  16228. return data.num_chars;
  16229. 80276f8: 9803 ldr r0, [sp, #12]
  16230. 80276fa: e000 b.n 80276fe <tfp_vsnprintf+0x2a>
  16231. int tfp_vsnprintf(char *str, size_t size, const char *format, va_list ap)
  16232. {
  16233. struct _vsnprintf_putcf_data data;
  16234. if (size < 1)
  16235. return 0;
  16236. 80276fc: 4608 mov r0, r1
  16237. data.dest[data.num_chars] = '\0';
  16238. else
  16239. data.dest[data.dest_capacity] = '\0';
  16240. return data.num_chars;
  16241. }
  16242. 80276fe: b004 add sp, #16
  16243. 8027700: bd10 pop {r4, pc}
  16244. 8027702: bf00 nop
  16245. 8027704: 0802724d .word 0x0802724d
  16246. 08027708 <tfp_snprintf>:
  16247. int tfp_snprintf(char *str, size_t size, const char *format, ...)
  16248. {
  16249. 8027708: b40c push {r2, r3}
  16250. 802770a: b507 push {r0, r1, r2, lr}
  16251. 802770c: ab04 add r3, sp, #16
  16252. 802770e: f853 2b04 ldr.w r2, [r3], #4
  16253. va_list ap;
  16254. int retval;
  16255. va_start(ap, format);
  16256. 8027712: 9301 str r3, [sp, #4]
  16257. retval = tfp_vsnprintf(str, size, format, ap);
  16258. 8027714: f7ff ffde bl 80276d4 <tfp_vsnprintf>
  16259. va_end(ap);
  16260. return retval;
  16261. }
  16262. 8027718: e8bd 400e ldmia.w sp!, {r1, r2, r3, lr}
  16263. 802771c: b002 add sp, #8
  16264. 802771e: 4770 bx lr
  16265. 08027720 <tfp_vsprintf>:
  16266. struct _vsprintf_putcf_data *data = (struct _vsprintf_putcf_data*)p;
  16267. data->dest[data->num_chars++] = c;
  16268. }
  16269. int tfp_vsprintf(char *str, const char *format, va_list ap)
  16270. {
  16271. 8027720: b537 push {r0, r1, r2, r4, r5, lr}
  16272. 8027722: 460d mov r5, r1
  16273. 8027724: 4613 mov r3, r2
  16274. struct _vsprintf_putcf_data data;
  16275. data.dest = str;
  16276. 8027726: 9000 str r0, [sp, #0]
  16277. data.num_chars = 0;
  16278. 8027728: 2400 movs r4, #0
  16279. tfp_format(&data, _vsprintf_putcf, format, ap);
  16280. 802772a: 4668 mov r0, sp
  16281. 802772c: 462a mov r2, r5
  16282. 802772e: 4904 ldr r1, [pc, #16] ; (8027740 <tfp_vsprintf+0x20>)
  16283. int tfp_vsprintf(char *str, const char *format, va_list ap)
  16284. {
  16285. struct _vsprintf_putcf_data data;
  16286. data.dest = str;
  16287. data.num_chars = 0;
  16288. 8027730: 9401 str r4, [sp, #4]
  16289. tfp_format(&data, _vsprintf_putcf, format, ap);
  16290. 8027732: f7ff fd9b bl 802726c <tfp_format>
  16291. data.dest[data.num_chars] = '\0';
  16292. 8027736: e89d 000c ldmia.w sp, {r2, r3}
  16293. 802773a: 54d4 strb r4, [r2, r3]
  16294. return data.num_chars;
  16295. }
  16296. 802773c: 9801 ldr r0, [sp, #4]
  16297. 802773e: bd3e pop {r1, r2, r3, r4, r5, pc}
  16298. 8027740: 08027261 .word 0x08027261
  16299. 08027744 <tfp_sprintf>:
  16300. int tfp_sprintf(char *str, const char *format, ...)
  16301. {
  16302. 8027744: b40e push {r1, r2, r3}
  16303. 8027746: b503 push {r0, r1, lr}
  16304. 8027748: aa03 add r2, sp, #12
  16305. 802774a: f852 1b04 ldr.w r1, [r2], #4
  16306. va_list ap;
  16307. int retval;
  16308. va_start(ap, format);
  16309. 802774e: 9201 str r2, [sp, #4]
  16310. retval = tfp_vsprintf(str, format, ap);
  16311. 8027750: f7ff ffe6 bl 8027720 <tfp_vsprintf>
  16312. va_end(ap);
  16313. return retval;
  16314. }
  16315. 8027754: e8bd 400c ldmia.w sp!, {r2, r3, lr}
  16316. 8027758: b003 add sp, #12
  16317. 802775a: 4770 bx lr
  16318. 0802775c <GetLineFailBitStr>:
  16319. /* if (upsParams.lineFailBit)
  16320. *str = '1';
  16321. else
  16322. *str = '0';*/
  16323. *str = '0';
  16324. 802775c: 2330 movs r3, #48 ; 0x30
  16325. 802775e: 7003 strb r3, [r0, #0]
  16326. *len = 1;
  16327. 8027760: 2301 movs r3, #1
  16328. 8027762: 700b strb r3, [r1, #0]
  16329. 8027764: 4770 bx lr
  16330. 08027766 <GetLowBatteryBitStr>:
  16331. *str = '1';
  16332. else
  16333. *str = '0';
  16334. *len = 1;*/
  16335. *str = '0';
  16336. 8027766: 2330 movs r3, #48 ; 0x30
  16337. 8027768: 7003 strb r3, [r0, #0]
  16338. *len = 1;
  16339. 802776a: 2301 movs r3, #1
  16340. 802776c: 700b strb r3, [r1, #0]
  16341. 802776e: 4770 bx lr
  16342. 08027770 <GetInputFreqStr>:
  16343. /**
  16344. * @brief
  16345. */
  16346. void GetInputFreqStr(char *str, uint8_t *len)
  16347. {
  16348. 8027770: b538 push {r3, r4, r5, lr}
  16349. sprintf(str, "%0.1f", UPS.Freq_in);
  16350. 8027772: 4b08 ldr r3, [pc, #32] ; (8027794 <GetInputFreqStr+0x24>)
  16351. /**
  16352. * @brief
  16353. */
  16354. void GetInputFreqStr(char *str, uint8_t *len)
  16355. {
  16356. 8027774: 4604 mov r4, r0
  16357. sprintf(str, "%0.1f", UPS.Freq_in);
  16358. 8027776: 6818 ldr r0, [r3, #0]
  16359. /**
  16360. * @brief
  16361. */
  16362. void GetInputFreqStr(char *str, uint8_t *len)
  16363. {
  16364. 8027778: 460d mov r5, r1
  16365. sprintf(str, "%0.1f", UPS.Freq_in);
  16366. 802777a: f7f8 fecd bl 8020518 <__aeabi_f2d>
  16367. 802777e: 4602 mov r2, r0
  16368. 8027780: 460b mov r3, r1
  16369. 8027782: 4620 mov r0, r4
  16370. 8027784: 4904 ldr r1, [pc, #16] ; (8027798 <GetInputFreqStr+0x28>)
  16371. 8027786: f7ff ffdd bl 8027744 <tfp_sprintf>
  16372. *len = strlen(str);
  16373. 802778a: 4620 mov r0, r4
  16374. 802778c: f7fa fb70 bl 8021e70 <strlen>
  16375. 8027790: 7028 strb r0, [r5, #0]
  16376. 8027792: bd38 pop {r3, r4, r5, pc}
  16377. 8027794: 2000e8b4 .word 0x2000e8b4
  16378. 8027798: 08035e4f .word 0x08035e4f
  16379. 0802779c <GetOutputFreqStr>:
  16380. /**
  16381. * @brief
  16382. */
  16383. void GetOutputFreqStr(char *str, uint8_t *len)
  16384. {
  16385. 802779c: b538 push {r3, r4, r5, lr}
  16386. sprintf(str, "%0.1f", UPS.Freq_in);
  16387. 802779e: 4b08 ldr r3, [pc, #32] ; (80277c0 <GetOutputFreqStr+0x24>)
  16388. /**
  16389. * @brief
  16390. */
  16391. void GetOutputFreqStr(char *str, uint8_t *len)
  16392. {
  16393. 80277a0: 4604 mov r4, r0
  16394. sprintf(str, "%0.1f", UPS.Freq_in);
  16395. 80277a2: 6818 ldr r0, [r3, #0]
  16396. /**
  16397. * @brief
  16398. */
  16399. void GetOutputFreqStr(char *str, uint8_t *len)
  16400. {
  16401. 80277a4: 460d mov r5, r1
  16402. sprintf(str, "%0.1f", UPS.Freq_in);
  16403. 80277a6: f7f8 feb7 bl 8020518 <__aeabi_f2d>
  16404. 80277aa: 4602 mov r2, r0
  16405. 80277ac: 460b mov r3, r1
  16406. 80277ae: 4620 mov r0, r4
  16407. 80277b0: 4904 ldr r1, [pc, #16] ; (80277c4 <GetOutputFreqStr+0x28>)
  16408. 80277b2: f7ff ffc7 bl 8027744 <tfp_sprintf>
  16409. *len = strlen(str);
  16410. 80277b6: 4620 mov r0, r4
  16411. 80277b8: f7fa fb5a bl 8021e70 <strlen>
  16412. 80277bc: 7028 strb r0, [r5, #0]
  16413. 80277be: bd38 pop {r3, r4, r5, pc}
  16414. 80277c0: 2000e8b4 .word 0x2000e8b4
  16415. 80277c4: 08035e4f .word 0x08035e4f
  16416. 080277c8 <GetInputVoltageStr>:
  16417. /**
  16418. * @brief
  16419. */
  16420. void GetInputVoltageStr(char *str, uint8_t *len)
  16421. {
  16422. 80277c8: b538 push {r3, r4, r5, lr}
  16423. sprintf(str, "%0.1f", UPS.VAC_in);
  16424. 80277ca: 4b08 ldr r3, [pc, #32] ; (80277ec <GetInputVoltageStr+0x24>)
  16425. /**
  16426. * @brief
  16427. */
  16428. void GetInputVoltageStr(char *str, uint8_t *len)
  16429. {
  16430. 80277cc: 4604 mov r4, r0
  16431. sprintf(str, "%0.1f", UPS.VAC_in);
  16432. 80277ce: 6858 ldr r0, [r3, #4]
  16433. /**
  16434. * @brief
  16435. */
  16436. void GetInputVoltageStr(char *str, uint8_t *len)
  16437. {
  16438. 80277d0: 460d mov r5, r1
  16439. sprintf(str, "%0.1f", UPS.VAC_in);
  16440. 80277d2: f7f8 fea1 bl 8020518 <__aeabi_f2d>
  16441. 80277d6: 4602 mov r2, r0
  16442. 80277d8: 460b mov r3, r1
  16443. 80277da: 4620 mov r0, r4
  16444. 80277dc: 4904 ldr r1, [pc, #16] ; (80277f0 <GetInputVoltageStr+0x28>)
  16445. 80277de: f7ff ffb1 bl 8027744 <tfp_sprintf>
  16446. *len = strlen(str);
  16447. 80277e2: 4620 mov r0, r4
  16448. 80277e4: f7fa fb44 bl 8021e70 <strlen>
  16449. 80277e8: 7028 strb r0, [r5, #0]
  16450. 80277ea: bd38 pop {r3, r4, r5, pc}
  16451. 80277ec: 2000e8b4 .word 0x2000e8b4
  16452. 80277f0: 08035e4f .word 0x08035e4f
  16453. 080277f4 <GetOutputVoltageStr>:
  16454. /**
  16455. * @brief
  16456. */
  16457. void GetOutputVoltageStr(char *str, uint8_t *len)
  16458. {
  16459. 80277f4: b538 push {r3, r4, r5, lr}
  16460. sprintf(str, "%0.1f", UPS.VAC_out);
  16461. 80277f6: 4b08 ldr r3, [pc, #32] ; (8027818 <GetOutputVoltageStr+0x24>)
  16462. /**
  16463. * @brief
  16464. */
  16465. void GetOutputVoltageStr(char *str, uint8_t *len)
  16466. {
  16467. 80277f8: 4604 mov r4, r0
  16468. sprintf(str, "%0.1f", UPS.VAC_out);
  16469. 80277fa: 6898 ldr r0, [r3, #8]
  16470. /**
  16471. * @brief
  16472. */
  16473. void GetOutputVoltageStr(char *str, uint8_t *len)
  16474. {
  16475. 80277fc: 460d mov r5, r1
  16476. sprintf(str, "%0.1f", UPS.VAC_out);
  16477. 80277fe: f7f8 fe8b bl 8020518 <__aeabi_f2d>
  16478. 8027802: 4602 mov r2, r0
  16479. 8027804: 460b mov r3, r1
  16480. 8027806: 4620 mov r0, r4
  16481. 8027808: 4904 ldr r1, [pc, #16] ; (802781c <GetOutputVoltageStr+0x28>)
  16482. 802780a: f7ff ff9b bl 8027744 <tfp_sprintf>
  16483. *len = strlen(str);
  16484. 802780e: 4620 mov r0, r4
  16485. 8027810: f7fa fb2e bl 8021e70 <strlen>
  16486. 8027814: 7028 strb r0, [r5, #0]
  16487. 8027816: bd38 pop {r3, r4, r5, pc}
  16488. 8027818: 2000e8b4 .word 0x2000e8b4
  16489. 802781c: 08035e4f .word 0x08035e4f
  16490. 08027820 <GetPowerStr>:
  16491. /**
  16492. * @brief
  16493. */
  16494. void GetPowerStr(char *str, uint8_t *len)
  16495. {
  16496. 8027820: b538 push {r3, r4, r5, lr}
  16497. sprintf(str, "%0.1f", UPS.Load);
  16498. 8027822: 4b06 ldr r3, [pc, #24] ; (802783c <GetPowerStr+0x1c>)
  16499. /**
  16500. * @brief
  16501. */
  16502. void GetPowerStr(char *str, uint8_t *len)
  16503. {
  16504. 8027824: 4605 mov r5, r0
  16505. 8027826: 460c mov r4, r1
  16506. sprintf(str, "%0.1f", UPS.Load);
  16507. 8027828: 7c1a ldrb r2, [r3, #16]
  16508. 802782a: 4905 ldr r1, [pc, #20] ; (8027840 <GetPowerStr+0x20>)
  16509. 802782c: f7ff ff8a bl 8027744 <tfp_sprintf>
  16510. *len = strlen(str);
  16511. 8027830: 4628 mov r0, r5
  16512. 8027832: f7fa fb1d bl 8021e70 <strlen>
  16513. 8027836: 7020 strb r0, [r4, #0]
  16514. 8027838: bd38 pop {r3, r4, r5, pc}
  16515. 802783a: bf00 nop
  16516. 802783c: 2000e8b4 .word 0x2000e8b4
  16517. 8027840: 08035e4f .word 0x08035e4f
  16518. 08027844 <GetBatCapacityStr>:
  16519. /**
  16520. * @brief
  16521. */
  16522. void GetBatCapacityStr(char *str, uint8_t *len)
  16523. {
  16524. 8027844: b538 push {r3, r4, r5, lr}
  16525. sprintf(str, "%0.1f", UPS.SOC);
  16526. 8027846: 4b06 ldr r3, [pc, #24] ; (8027860 <GetBatCapacityStr+0x1c>)
  16527. /**
  16528. * @brief
  16529. */
  16530. void GetBatCapacityStr(char *str, uint8_t *len)
  16531. {
  16532. 8027848: 4605 mov r5, r0
  16533. 802784a: 460c mov r4, r1
  16534. sprintf(str, "%0.1f", UPS.SOC);
  16535. 802784c: 7c5a ldrb r2, [r3, #17]
  16536. 802784e: 4905 ldr r1, [pc, #20] ; (8027864 <GetBatCapacityStr+0x20>)
  16537. 8027850: f7ff ff78 bl 8027744 <tfp_sprintf>
  16538. *len = strlen(str);
  16539. 8027854: 4628 mov r0, r5
  16540. 8027856: f7fa fb0b bl 8021e70 <strlen>
  16541. 802785a: 7020 strb r0, [r4, #0]
  16542. 802785c: bd38 pop {r3, r4, r5, pc}
  16543. 802785e: bf00 nop
  16544. 8027860: 2000e8b4 .word 0x2000e8b4
  16545. 8027864: 08035e4f .word 0x08035e4f
  16546. 08027868 <GetRuntimeStr>:
  16547. /**
  16548. * @brief
  16549. */
  16550. void GetRuntimeStr(char *str, uint8_t *len)
  16551. {
  16552. 8027868: b538 push {r3, r4, r5, lr}
  16553. sprintf(str, "%d", UPS.work_time);
  16554. 802786a: 4b06 ldr r3, [pc, #24] ; (8027884 <GetRuntimeStr+0x1c>)
  16555. /**
  16556. * @brief
  16557. */
  16558. void GetRuntimeStr(char *str, uint8_t *len)
  16559. {
  16560. 802786c: 4605 mov r5, r0
  16561. 802786e: 460c mov r4, r1
  16562. sprintf(str, "%d", UPS.work_time);
  16563. 8027870: 7c9a ldrb r2, [r3, #18]
  16564. 8027872: 4905 ldr r1, [pc, #20] ; (8027888 <GetRuntimeStr+0x20>)
  16565. 8027874: f7ff ff66 bl 8027744 <tfp_sprintf>
  16566. *len = strlen(str);
  16567. 8027878: 4628 mov r0, r5
  16568. 802787a: f7fa faf9 bl 8021e70 <strlen>
  16569. 802787e: 7020 strb r0, [r4, #0]
  16570. 8027880: bd38 pop {r3, r4, r5, pc}
  16571. 8027882: bf00 nop
  16572. 8027884: 2000e8b4 .word 0x2000e8b4
  16573. 8027888: 08035e55 .word 0x08035e55
  16574. 0802788c <GetInternalTempStr>:
  16575. /**
  16576. * @brief
  16577. */
  16578. void GetInternalTempStr(char *str, uint8_t *len)
  16579. {
  16580. 802788c: b538 push {r3, r4, r5, lr}
  16581. sprintf(str, "%0.1f", UPS.Temp);
  16582. 802788e: 4b08 ldr r3, [pc, #32] ; (80278b0 <GetInternalTempStr+0x24>)
  16583. /**
  16584. * @brief
  16585. */
  16586. void GetInternalTempStr(char *str, uint8_t *len)
  16587. {
  16588. 8027890: 4604 mov r4, r0
  16589. sprintf(str, "%0.1f", UPS.Temp);
  16590. 8027892: 68d8 ldr r0, [r3, #12]
  16591. /**
  16592. * @brief
  16593. */
  16594. void GetInternalTempStr(char *str, uint8_t *len)
  16595. {
  16596. 8027894: 460d mov r5, r1
  16597. sprintf(str, "%0.1f", UPS.Temp);
  16598. 8027896: f7f8 fe3f bl 8020518 <__aeabi_f2d>
  16599. 802789a: 4602 mov r2, r0
  16600. 802789c: 460b mov r3, r1
  16601. 802789e: 4620 mov r0, r4
  16602. 80278a0: 4904 ldr r1, [pc, #16] ; (80278b4 <GetInternalTempStr+0x28>)
  16603. 80278a2: f7ff ff4f bl 8027744 <tfp_sprintf>
  16604. *len = strlen(str);
  16605. 80278a6: 4620 mov r0, r4
  16606. 80278a8: f7fa fae2 bl 8021e70 <strlen>
  16607. 80278ac: 7028 strb r0, [r5, #0]
  16608. 80278ae: bd38 pop {r3, r4, r5, pc}
  16609. 80278b0: 2000e8b4 .word 0x2000e8b4
  16610. 80278b4: 08035e4f .word 0x08035e4f
  16611. 080278b8 <GetLoadMonitorStr>:
  16612. {
  16613. /* // if (upsParams.monitor_power)
  16614. *str = '1';
  16615. else
  16616. *str = '0';*/
  16617. *str = '0';
  16618. 80278b8: 2330 movs r3, #48 ; 0x30
  16619. 80278ba: 7003 strb r3, [r0, #0]
  16620. *len = 1;
  16621. 80278bc: 2301 movs r3, #1
  16622. 80278be: 700b strb r3, [r1, #0]
  16623. 80278c0: 4770 bx lr
  16624. 080278c2 <GetTempMonitorStr>:
  16625. {
  16626. /*// if (upsParams.monitor_temperature)
  16627. *str = '1';
  16628. else
  16629. *str = '0';*/
  16630. *str = '0';
  16631. 80278c2: 2330 movs r3, #48 ; 0x30
  16632. 80278c4: 7003 strb r3, [r0, #0]
  16633. *len = 1;
  16634. 80278c6: 2301 movs r3, #1
  16635. 80278c8: 700b strb r3, [r1, #0]
  16636. 80278ca: 4770 bx lr
  16637. 080278cc <GetConnectMonitorStr>:
  16638. // 0 - коннект есть, 1 - нет
  16639. /* if (upsParams.connect)
  16640. *str = '0';
  16641. else
  16642. *str = '1';*/
  16643. *str = '0';
  16644. 80278cc: 2330 movs r3, #48 ; 0x30
  16645. 80278ce: 7003 strb r3, [r0, #0]
  16646. *len = 1;
  16647. 80278d0: 2301 movs r3, #1
  16648. 80278d2: 700b strb r3, [r1, #0]
  16649. 80278d4: 4770 bx lr
  16650. 80278d6: 0000 movs r0, r0
  16651. 080278d8 <GetAlarmStr>:
  16652. /**
  16653. * @brief Индикация аварийных ситуаций
  16654. */
  16655. void GetAlarmStr(char *str, uint8_t *len)
  16656. {
  16657. 80278d8: b538 push {r3, r4, r5, lr}
  16658. sprintf(str, "%d", UPS.Status);
  16659. 80278da: 4b06 ldr r3, [pc, #24] ; (80278f4 <GetAlarmStr+0x1c>)
  16660. /**
  16661. * @brief Индикация аварийных ситуаций
  16662. */
  16663. void GetAlarmStr(char *str, uint8_t *len)
  16664. {
  16665. 80278dc: 4605 mov r5, r0
  16666. 80278de: 460c mov r4, r1
  16667. sprintf(str, "%d", UPS.Status);
  16668. 80278e0: 7cda ldrb r2, [r3, #19]
  16669. 80278e2: 4905 ldr r1, [pc, #20] ; (80278f8 <GetAlarmStr+0x20>)
  16670. 80278e4: f7ff ff2e bl 8027744 <tfp_sprintf>
  16671. *len = strlen(str);
  16672. 80278e8: 4628 mov r0, r5
  16673. 80278ea: f7fa fac1 bl 8021e70 <strlen>
  16674. 80278ee: 7020 strb r0, [r4, #0]
  16675. 80278f0: bd38 pop {r3, r4, r5, pc}
  16676. 80278f2: bf00 nop
  16677. 80278f4: 2000e8b4 .word 0x2000e8b4
  16678. 80278f8: 08035e55 .word 0x08035e55
  16679. 080278fc <GetDateStr>:
  16680. /**
  16681. * @brief Дата (Ready for PRS!)
  16682. */
  16683. void GetDateStr(char *str, uint8_t *len)
  16684. {
  16685. 80278fc: b530 push {r4, r5, lr}
  16686. 80278fe: b087 sub sp, #28
  16687. 8027900: 4604 mov r4, r0
  16688. 8027902: 460d mov r5, r1
  16689. TM_RTC_t data;
  16690. uint16_t sys_year ;
  16691. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  16692. 8027904: a802 add r0, sp, #8
  16693. 8027906: 2100 movs r1, #0
  16694. 8027908: f7fe fdbe bl 8026488 <TM_RTC_GetDateTime>
  16695. sys_year = 2000 + data.year;
  16696. sprintf(str, "%04i-%02i-%02i", sys_year, data.month, data.date);
  16697. 802790c: f89d 100f ldrb.w r1, [sp, #15]
  16698. {
  16699. TM_RTC_t data;
  16700. uint16_t sys_year ;
  16701. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  16702. sys_year = 2000 + data.year;
  16703. 8027910: f89d 2011 ldrb.w r2, [sp, #17]
  16704. sprintf(str, "%04i-%02i-%02i", sys_year, data.month, data.date);
  16705. 8027914: f89d 3010 ldrb.w r3, [sp, #16]
  16706. 8027918: 9100 str r1, [sp, #0]
  16707. 802791a: f502 62fa add.w r2, r2, #2000 ; 0x7d0
  16708. 802791e: 4905 ldr r1, [pc, #20] ; (8027934 <GetDateStr+0x38>)
  16709. 8027920: 4620 mov r0, r4
  16710. 8027922: f7ff ff0f bl 8027744 <tfp_sprintf>
  16711. *len = strlen(str);
  16712. 8027926: 4620 mov r0, r4
  16713. 8027928: f7fa faa2 bl 8021e70 <strlen>
  16714. 802792c: 7028 strb r0, [r5, #0]
  16715. }
  16716. 802792e: b007 add sp, #28
  16717. 8027930: bd30 pop {r4, r5, pc}
  16718. 8027932: bf00 nop
  16719. 8027934: 08035e58 .word 0x08035e58
  16720. 08027938 <GetTimeStr>:
  16721. /**
  16722. * @brief Время (Ready for PRS!)
  16723. */
  16724. void GetTimeStr(char *str, uint8_t *len)
  16725. {
  16726. 8027938: b530 push {r4, r5, lr}
  16727. 802793a: b085 sub sp, #20
  16728. 802793c: 4604 mov r4, r0
  16729. 802793e: 460d mov r5, r1
  16730. TM_RTC_t data;
  16731. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  16732. 8027940: 4668 mov r0, sp
  16733. 8027942: 2100 movs r1, #0
  16734. 8027944: f7fe fda0 bl 8026488 <TM_RTC_GetDateTime>
  16735. sprintf(str, "%02i:%02i", data.hours, data.minutes);
  16736. 8027948: 4906 ldr r1, [pc, #24] ; (8027964 <GetTimeStr+0x2c>)
  16737. 802794a: f89d 2005 ldrb.w r2, [sp, #5]
  16738. 802794e: f89d 3004 ldrb.w r3, [sp, #4]
  16739. 8027952: 4620 mov r0, r4
  16740. 8027954: f7ff fef6 bl 8027744 <tfp_sprintf>
  16741. *len = strlen(str);
  16742. 8027958: 4620 mov r0, r4
  16743. 802795a: f7fa fa89 bl 8021e70 <strlen>
  16744. 802795e: 7028 strb r0, [r5, #0]
  16745. }
  16746. 8027960: b005 add sp, #20
  16747. 8027962: bd30 pop {r4, r5, pc}
  16748. 8027964: 08035e9b .word 0x08035e9b
  16749. 08027968 <GetUnixTimeStr>:
  16750. /**
  16751. * @brief Время (Ready for PRS!)
  16752. */
  16753. void GetUnixTimeStr(char *str, uint8_t *len)
  16754. {
  16755. 8027968: b530 push {r4, r5, lr}
  16756. 802796a: b085 sub sp, #20
  16757. 802796c: 4604 mov r4, r0
  16758. 802796e: 460d mov r5, r1
  16759. TM_RTC_t data;
  16760. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  16761. 8027970: 4668 mov r0, sp
  16762. 8027972: 2100 movs r1, #0
  16763. 8027974: f7fe fd88 bl 8026488 <TM_RTC_GetDateTime>
  16764. sprintf(str, "%d", data.unix);
  16765. 8027978: 4905 ldr r1, [pc, #20] ; (8027990 <GetUnixTimeStr+0x28>)
  16766. 802797a: 9a03 ldr r2, [sp, #12]
  16767. 802797c: 4620 mov r0, r4
  16768. 802797e: f7ff fee1 bl 8027744 <tfp_sprintf>
  16769. *len = strlen(str);
  16770. 8027982: 4620 mov r0, r4
  16771. 8027984: f7fa fa74 bl 8021e70 <strlen>
  16772. 8027988: 7028 strb r0, [r5, #0]
  16773. }
  16774. 802798a: b005 add sp, #20
  16775. 802798c: bd30 pop {r4, r5, pc}
  16776. 802798e: bf00 nop
  16777. 8027990: 08035e55 .word 0x08035e55
  16778. 08027994 <GetSntpStateStr>:
  16779. /**
  16780. * @brief Состояние SNTP (Ready for PRS!)
  16781. */
  16782. void GetSntpStateStr(char *str, uint8_t *len)
  16783. {
  16784. 8027994: b538 push {r3, r4, r5, lr}
  16785. if (sSettings.sSNTP.sntpEnable)
  16786. 8027996: 4b08 ldr r3, [pc, #32] ; (80279b8 <GetSntpStateStr+0x24>)
  16787. 8027998: f893 3344 ldrb.w r3, [r3, #836] ; 0x344
  16788. /**
  16789. * @brief Состояние SNTP (Ready for PRS!)
  16790. */
  16791. void GetSntpStateStr(char *str, uint8_t *len)
  16792. {
  16793. 802799c: 460c mov r4, r1
  16794. 802799e: 4605 mov r5, r0
  16795. if (sSettings.sSNTP.sntpEnable)
  16796. {
  16797. sprintf(str, "%s", "1"); //авто
  16798. 80279a0: 4906 ldr r1, [pc, #24] ; (80279bc <GetSntpStateStr+0x28>)
  16799. /**
  16800. * @brief Состояние SNTP (Ready for PRS!)
  16801. */
  16802. void GetSntpStateStr(char *str, uint8_t *len)
  16803. {
  16804. if (sSettings.sSNTP.sntpEnable)
  16805. 80279a2: b10b cbz r3, 80279a8 <GetSntpStateStr+0x14>
  16806. {
  16807. sprintf(str, "%s", "1"); //авто
  16808. 80279a4: 4a06 ldr r2, [pc, #24] ; (80279c0 <GetSntpStateStr+0x2c>)
  16809. 80279a6: e000 b.n 80279aa <GetSntpStateStr+0x16>
  16810. *len = strlen(str);
  16811. }
  16812. else
  16813. {
  16814. sprintf(str, "%s", "0"); //ручной
  16815. 80279a8: 4a06 ldr r2, [pc, #24] ; (80279c4 <GetSntpStateStr+0x30>)
  16816. 80279aa: f7ff fecb bl 8027744 <tfp_sprintf>
  16817. *len = strlen(str);
  16818. 80279ae: 4628 mov r0, r5
  16819. 80279b0: f7fa fa5e bl 8021e70 <strlen>
  16820. 80279b4: 7020 strb r0, [r4, #0]
  16821. 80279b6: bd38 pop {r3, r4, r5, pc}
  16822. 80279b8: 2000e8e4 .word 0x2000e8e4
  16823. 80279bc: 08035e67 .word 0x08035e67
  16824. 80279c0: 08035f50 .word 0x08035f50
  16825. 80279c4: 08035ef3 .word 0x08035ef3
  16826. 080279c8 <GetSntpServerIpStr>:
  16827. /**
  16828. * @brief IP адрес SNTP сервера (Ready for PRS!)
  16829. */
  16830. void GetSntpServerIpStr(char *str, uint8_t *len)
  16831. {
  16832. 80279c8: b538 push {r3, r4, r5, lr}
  16833. sprintf(str, "%s", sSettings.sSNTP.ip);
  16834. 80279ca: 4a05 ldr r2, [pc, #20] ; (80279e0 <GetSntpServerIpStr+0x18>)
  16835. /**
  16836. * @brief IP адрес SNTP сервера (Ready for PRS!)
  16837. */
  16838. void GetSntpServerIpStr(char *str, uint8_t *len)
  16839. {
  16840. 80279cc: 4605 mov r5, r0
  16841. 80279ce: 460c mov r4, r1
  16842. sprintf(str, "%s", sSettings.sSNTP.ip);
  16843. 80279d0: 4904 ldr r1, [pc, #16] ; (80279e4 <GetSntpServerIpStr+0x1c>)
  16844. 80279d2: f7ff feb7 bl 8027744 <tfp_sprintf>
  16845. *len = strlen(str);
  16846. 80279d6: 4628 mov r0, r5
  16847. 80279d8: f7fa fa4a bl 8021e70 <strlen>
  16848. 80279dc: 7020 strb r0, [r4, #0]
  16849. 80279de: bd38 pop {r3, r4, r5, pc}
  16850. 80279e0: 2000ec29 .word 0x2000ec29
  16851. 80279e4: 08035e67 .word 0x08035e67
  16852. 080279e8 <GetSntpTimeZoneStr>:
  16853. /**
  16854. * @brief Часовой пояс контроллера (Ready for PRS!)
  16855. */
  16856. void GetSntpTimeZoneStr(char *str, uint8_t *len)
  16857. {
  16858. 80279e8: b538 push {r3, r4, r5, lr}
  16859. sprintf(str, "%0.1f", sSettings.sSNTP.timeZone);
  16860. 80279ea: 4b09 ldr r3, [pc, #36] ; (8027a10 <GetSntpTimeZoneStr+0x28>)
  16861. /**
  16862. * @brief Часовой пояс контроллера (Ready for PRS!)
  16863. */
  16864. void GetSntpTimeZoneStr(char *str, uint8_t *len)
  16865. {
  16866. 80279ec: 4604 mov r4, r0
  16867. sprintf(str, "%0.1f", sSettings.sSNTP.timeZone);
  16868. 80279ee: f8d3 0374 ldr.w r0, [r3, #884] ; 0x374
  16869. /**
  16870. * @brief Часовой пояс контроллера (Ready for PRS!)
  16871. */
  16872. void GetSntpTimeZoneStr(char *str, uint8_t *len)
  16873. {
  16874. 80279f2: 460d mov r5, r1
  16875. sprintf(str, "%0.1f", sSettings.sSNTP.timeZone);
  16876. 80279f4: f7f8 fd90 bl 8020518 <__aeabi_f2d>
  16877. 80279f8: 4602 mov r2, r0
  16878. 80279fa: 460b mov r3, r1
  16879. 80279fc: 4620 mov r0, r4
  16880. 80279fe: 4905 ldr r1, [pc, #20] ; (8027a14 <GetSntpTimeZoneStr+0x2c>)
  16881. 8027a00: f7ff fea0 bl 8027744 <tfp_sprintf>
  16882. *len = strlen(str);
  16883. 8027a04: 4620 mov r0, r4
  16884. 8027a06: f7fa fa33 bl 8021e70 <strlen>
  16885. 8027a0a: 7028 strb r0, [r5, #0]
  16886. 8027a0c: bd38 pop {r3, r4, r5, pc}
  16887. 8027a0e: bf00 nop
  16888. 8027a10: 2000e8e4 .word 0x2000e8e4
  16889. 8027a14: 08035e4f .word 0x08035e4f
  16890. 08027a18 <GetSntpLastDataStr>:
  16891. /**
  16892. * @brief Дата последней синхронизации SNTP (Ready for PRS!)
  16893. */
  16894. void GetSntpLastDataStr(char *str, uint8_t *len)
  16895. {
  16896. 8027a18: b538 push {r3, r4, r5, lr}
  16897. sprintf(str, "%s", sSettings.sSNTP.data);
  16898. 8027a1a: 4a05 ldr r2, [pc, #20] ; (8027a30 <GetSntpLastDataStr+0x18>)
  16899. /**
  16900. * @brief Дата последней синхронизации SNTP (Ready for PRS!)
  16901. */
  16902. void GetSntpLastDataStr(char *str, uint8_t *len)
  16903. {
  16904. 8027a1c: 4605 mov r5, r0
  16905. 8027a1e: 460c mov r4, r1
  16906. sprintf(str, "%s", sSettings.sSNTP.data);
  16907. 8027a20: 4904 ldr r1, [pc, #16] ; (8027a34 <GetSntpLastDataStr+0x1c>)
  16908. 8027a22: f7ff fe8f bl 8027744 <tfp_sprintf>
  16909. *len = strlen(str);
  16910. 8027a26: 4628 mov r0, r5
  16911. 8027a28: f7fa fa22 bl 8021e70 <strlen>
  16912. 8027a2c: 7020 strb r0, [r4, #0]
  16913. 8027a2e: bd38 pop {r3, r4, r5, pc}
  16914. 8027a30: 2000ec39 .word 0x2000ec39
  16915. 8027a34: 08035e67 .word 0x08035e67
  16916. 08027a38 <GetDINTypeActStr>:
  16917. /**
  16918. * @brief Тип действий при срабатывание сухих контактов
  16919. */
  16920. void GetDINTypeActStr(char *str, uint8_t *len, uint8_t num)
  16921. {
  16922. 8027a38: b538 push {r3, r4, r5, lr}
  16923. sprintf(str, "%d", sSettings.sInOuts.din_type_act[num]);
  16924. 8027a3a: 4b07 ldr r3, [pc, #28] ; (8027a58 <GetDINTypeActStr+0x20>)
  16925. 8027a3c: 189a adds r2, r3, r2
  16926. /**
  16927. * @brief Тип действий при срабатывание сухих контактов
  16928. */
  16929. void GetDINTypeActStr(char *str, uint8_t *len, uint8_t num)
  16930. {
  16931. 8027a3e: 4605 mov r5, r0
  16932. 8027a40: 460c mov r4, r1
  16933. sprintf(str, "%d", sSettings.sInOuts.din_type_act[num]);
  16934. 8027a42: f892 237a ldrb.w r2, [r2, #890] ; 0x37a
  16935. 8027a46: 4905 ldr r1, [pc, #20] ; (8027a5c <GetDINTypeActStr+0x24>)
  16936. 8027a48: f7ff fe7c bl 8027744 <tfp_sprintf>
  16937. *len = strlen(str);
  16938. 8027a4c: 4628 mov r0, r5
  16939. 8027a4e: f7fa fa0f bl 8021e70 <strlen>
  16940. 8027a52: 7020 strb r0, [r4, #0]
  16941. 8027a54: bd38 pop {r3, r4, r5, pc}
  16942. 8027a56: bf00 nop
  16943. 8027a58: 2000e8e4 .word 0x2000e8e4
  16944. 8027a5c: 08035e55 .word 0x08035e55
  16945. 08027a60 <GetROTypeActStr>:
  16946. /**
  16947. * @brief Источник срабатывания реле
  16948. */
  16949. void GetROTypeActStr(char *str, uint8_t *len, uint8_t num)
  16950. {
  16951. 8027a60: b538 push {r3, r4, r5, lr}
  16952. sprintf(str, "%d", sSettings.sInOuts.ro_type_source[num]);
  16953. 8027a62: 4b07 ldr r3, [pc, #28] ; (8027a80 <GetROTypeActStr+0x20>)
  16954. 8027a64: 189a adds r2, r3, r2
  16955. /**
  16956. * @brief Источник срабатывания реле
  16957. */
  16958. void GetROTypeActStr(char *str, uint8_t *len, uint8_t num)
  16959. {
  16960. 8027a66: 4605 mov r5, r0
  16961. 8027a68: 460c mov r4, r1
  16962. sprintf(str, "%d", sSettings.sInOuts.ro_type_source[num]);
  16963. 8027a6a: f892 2378 ldrb.w r2, [r2, #888] ; 0x378
  16964. 8027a6e: 4905 ldr r1, [pc, #20] ; (8027a84 <GetROTypeActStr+0x24>)
  16965. 8027a70: f7ff fe68 bl 8027744 <tfp_sprintf>
  16966. *len = strlen(str);
  16967. 8027a74: 4628 mov r0, r5
  16968. 8027a76: f7fa f9fb bl 8021e70 <strlen>
  16969. 8027a7a: 7020 strb r0, [r4, #0]
  16970. 8027a7c: bd38 pop {r3, r4, r5, pc}
  16971. 8027a7e: bf00 nop
  16972. 8027a80: 2000e8e4 .word 0x2000e8e4
  16973. 8027a84: 08035e55 .word 0x08035e55
  16974. 08027a88 <GetWorkTimeStr>:
  16975. /**
  16976. * @brief Время работы устройства
  16977. */
  16978. void GetWorkTimeStr(char *str, uint8_t *len)
  16979. {
  16980. 8027a88: b57f push {r0, r1, r2, r3, r4, r5, r6, lr}
  16981. 8027a8a: 4604 mov r4, r0
  16982. u32_t tick;
  16983. uint16_t day;
  16984. uint8_t hour;
  16985. uint8_t min;
  16986. snmp_get_sysuptime(&tick);
  16987. 8027a8c: a803 add r0, sp, #12
  16988. /**
  16989. * @brief Время работы устройства
  16990. */
  16991. void GetWorkTimeStr(char *str, uint8_t *len)
  16992. {
  16993. 8027a8e: 460e mov r6, r1
  16994. u32_t tick;
  16995. uint16_t day;
  16996. uint8_t hour;
  16997. uint8_t min;
  16998. snmp_get_sysuptime(&tick);
  16999. 8027a90: f009 fdc0 bl 8031614 <snmp_get_sysuptime>
  17000. day = tick/8640000;
  17001. 8027a94: 9803 ldr r0, [sp, #12]
  17002. tick = tick%8640000;
  17003. 8027a96: 4b0c ldr r3, [pc, #48] ; (8027ac8 <GetWorkTimeStr+0x40>)
  17004. hour = tick/360000;
  17005. tick = tick%360000;
  17006. 8027a98: 4d0c ldr r5, [pc, #48] ; (8027acc <GetWorkTimeStr+0x44>)
  17007. snmp_get_sysuptime(&tick);
  17008. day = tick/8640000;
  17009. tick = tick%8640000;
  17010. 8027a9a: fbb0 f2f3 udiv r2, r0, r3
  17011. 8027a9e: fb03 0012 mls r0, r3, r2, r0
  17012. hour = tick/360000;
  17013. tick = tick%360000;
  17014. 8027aa2: fbb0 f3f5 udiv r3, r0, r5
  17015. 8027aa6: fb05 0013 mls r0, r5, r3, r0
  17016. min = tick/6000;
  17017. 8027aaa: f241 7170 movw r1, #6000 ; 0x1770
  17018. day = tick/8640000;
  17019. tick = tick%8640000;
  17020. hour = tick/360000;
  17021. tick = tick%360000;
  17022. 8027aae: 9003 str r0, [sp, #12]
  17023. min = tick/6000;
  17024. 8027ab0: fbb0 f0f1 udiv r0, r0, r1
  17025. sprintf(str, "%d дн. %d ч. %d мин.", day, hour, min);
  17026. 8027ab4: 9000 str r0, [sp, #0]
  17027. 8027ab6: 4906 ldr r1, [pc, #24] ; (8027ad0 <GetWorkTimeStr+0x48>)
  17028. 8027ab8: 4620 mov r0, r4
  17029. 8027aba: f7ff fe43 bl 8027744 <tfp_sprintf>
  17030. *len = strlen(str);
  17031. 8027abe: 4620 mov r0, r4
  17032. 8027ac0: f7fa f9d6 bl 8021e70 <strlen>
  17033. 8027ac4: 7030 strb r0, [r6, #0]
  17034. }
  17035. 8027ac6: bd7f pop {r0, r1, r2, r3, r4, r5, r6, pc}
  17036. 8027ac8: 0083d600 .word 0x0083d600
  17037. 8027acc: 00057e40 .word 0x00057e40
  17038. 8027ad0: 08035e6a .word 0x08035e6a
  17039. 08027ad4 <GetModelStr>:
  17040. /**
  17041. * @brief Модель устройства
  17042. */
  17043. void GetModelStr(char *str, uint8_t *len)
  17044. {
  17045. 8027ad4: b570 push {r4, r5, r6, lr}
  17046. *len = strlen(sSettings.sSnmp.sysName);
  17047. 8027ad6: 4c07 ldr r4, [pc, #28] ; (8027af4 <GetModelStr+0x20>)
  17048. /**
  17049. * @brief Модель устройства
  17050. */
  17051. void GetModelStr(char *str, uint8_t *len)
  17052. {
  17053. 8027ad8: 4605 mov r5, r0
  17054. *len = strlen(sSettings.sSnmp.sysName);
  17055. 8027ada: 4620 mov r0, r4
  17056. /**
  17057. * @brief Модель устройства
  17058. */
  17059. void GetModelStr(char *str, uint8_t *len)
  17060. {
  17061. 8027adc: 460e mov r6, r1
  17062. *len = strlen(sSettings.sSnmp.sysName);
  17063. 8027ade: f7fa f9c7 bl 8021e70 <strlen>
  17064. 8027ae2: 4602 mov r2, r0
  17065. 8027ae4: 7030 strb r0, [r6, #0]
  17066. strncpy(str, sSettings.sSnmp.sysName, *len);
  17067. 8027ae6: 4621 mov r1, r4
  17068. 8027ae8: 4628 mov r0, r5
  17069. 8027aea: b2d2 uxtb r2, r2
  17070. }
  17071. 8027aec: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17072. * @brief Модель устройства
  17073. */
  17074. void GetModelStr(char *str, uint8_t *len)
  17075. {
  17076. *len = strlen(sSettings.sSnmp.sysName);
  17077. strncpy(str, sSettings.sSnmp.sysName, *len);
  17078. 8027af0: f7fa ba76 b.w 8021fe0 <strncpy>
  17079. 8027af4: 2000ea42 .word 0x2000ea42
  17080. 08027af8 <GetProductionDataStr>:
  17081. /**
  17082. * @brief Дата производства
  17083. */
  17084. void GetProductionDataStr(char *str, uint8_t *len)
  17085. {
  17086. 8027af8: b570 push {r4, r5, r6, lr}
  17087. *len = strlen(sSettings.sInfo.productionData);
  17088. 8027afa: 4c07 ldr r4, [pc, #28] ; (8027b18 <GetProductionDataStr+0x20>)
  17089. /**
  17090. * @brief Дата производства
  17091. */
  17092. void GetProductionDataStr(char *str, uint8_t *len)
  17093. {
  17094. 8027afc: 4605 mov r5, r0
  17095. *len = strlen(sSettings.sInfo.productionData);
  17096. 8027afe: 4620 mov r0, r4
  17097. /**
  17098. * @brief Дата производства
  17099. */
  17100. void GetProductionDataStr(char *str, uint8_t *len)
  17101. {
  17102. 8027b00: 460e mov r6, r1
  17103. *len = strlen(sSettings.sInfo.productionData);
  17104. 8027b02: f7fa f9b5 bl 8021e70 <strlen>
  17105. 8027b06: 4602 mov r2, r0
  17106. 8027b08: 7030 strb r0, [r6, #0]
  17107. strncpy(str, sSettings.sInfo.productionData, *len);
  17108. 8027b0a: 4621 mov r1, r4
  17109. 8027b0c: 4628 mov r0, r5
  17110. 8027b0e: b2d2 uxtb r2, r2
  17111. }
  17112. 8027b10: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17113. * @brief Дата производства
  17114. */
  17115. void GetProductionDataStr(char *str, uint8_t *len)
  17116. {
  17117. *len = strlen(sSettings.sInfo.productionData);
  17118. strncpy(str, sSettings.sInfo.productionData, *len);
  17119. 8027b14: f7fa ba64 b.w 8021fe0 <strncpy>
  17120. 8027b18: 2000eb28 .word 0x2000eb28
  17121. 08027b1c <GetVersionStr>:
  17122. /**
  17123. * @brief Версия ПО
  17124. */
  17125. void GetVersionStr(char *str, uint8_t *len) // +
  17126. {
  17127. 8027b1c: b570 push {r4, r5, r6, lr}
  17128. *len = strlen(VERSION);
  17129. 8027b1e: 4c07 ldr r4, [pc, #28] ; (8027b3c <GetVersionStr+0x20>)
  17130. /**
  17131. * @brief Версия ПО
  17132. */
  17133. void GetVersionStr(char *str, uint8_t *len) // +
  17134. {
  17135. 8027b20: 4605 mov r5, r0
  17136. *len = strlen(VERSION);
  17137. 8027b22: 4620 mov r0, r4
  17138. /**
  17139. * @brief Версия ПО
  17140. */
  17141. void GetVersionStr(char *str, uint8_t *len) // +
  17142. {
  17143. 8027b24: 460e mov r6, r1
  17144. *len = strlen(VERSION);
  17145. 8027b26: f7fa f9a3 bl 8021e70 <strlen>
  17146. 8027b2a: 4602 mov r2, r0
  17147. 8027b2c: 7030 strb r0, [r6, #0]
  17148. strncpy(str, VERSION, *len);
  17149. 8027b2e: 4621 mov r1, r4
  17150. 8027b30: 4628 mov r0, r5
  17151. 8027b32: b2d2 uxtb r2, r2
  17152. }
  17153. 8027b34: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17154. * @brief Версия ПО
  17155. */
  17156. void GetVersionStr(char *str, uint8_t *len) // +
  17157. {
  17158. *len = strlen(VERSION);
  17159. strncpy(str, VERSION, *len);
  17160. 8027b38: f7fa ba52 b.w 8021fe0 <strncpy>
  17161. 8027b3c: 08035e85 .word 0x08035e85
  17162. 08027b40 <GetMacStr>:
  17163. /**
  17164. * @brief MAC адрес устройства
  17165. */
  17166. void GetMacStr(char *str, uint8_t *len)
  17167. {
  17168. 8027b40: b570 push {r4, r5, r6, lr}
  17169. *len = strlen(sSettings.sInfo.mac);
  17170. 8027b42: 4c07 ldr r4, [pc, #28] ; (8027b60 <GetMacStr+0x20>)
  17171. /**
  17172. * @brief MAC адрес устройства
  17173. */
  17174. void GetMacStr(char *str, uint8_t *len)
  17175. {
  17176. 8027b44: 4605 mov r5, r0
  17177. *len = strlen(sSettings.sInfo.mac);
  17178. 8027b46: 4620 mov r0, r4
  17179. /**
  17180. * @brief MAC адрес устройства
  17181. */
  17182. void GetMacStr(char *str, uint8_t *len)
  17183. {
  17184. 8027b48: 460e mov r6, r1
  17185. *len = strlen(sSettings.sInfo.mac);
  17186. 8027b4a: f7fa f991 bl 8021e70 <strlen>
  17187. 8027b4e: 4602 mov r2, r0
  17188. 8027b50: 7030 strb r0, [r6, #0]
  17189. strncpy(str, sSettings.sInfo.mac, *len);
  17190. 8027b52: 4621 mov r1, r4
  17191. 8027b54: 4628 mov r0, r5
  17192. 8027b56: b2d2 uxtb r2, r2
  17193. }
  17194. 8027b58: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17195. * @brief MAC адрес устройства
  17196. */
  17197. void GetMacStr(char *str, uint8_t *len)
  17198. {
  17199. *len = strlen(sSettings.sInfo.mac);
  17200. strncpy(str, sSettings.sInfo.mac, *len);
  17201. 8027b5c: f7fa ba40 b.w 8021fe0 <strncpy>
  17202. 8027b60: 2000eb50 .word 0x2000eb50
  17203. 08027b64 <GetSerialNumberStr>:
  17204. /**
  17205. * @brief Серийный номер устройства
  17206. */
  17207. void GetSerialNumberStr(char *str, uint8_t *len)
  17208. {
  17209. 8027b64: b570 push {r4, r5, r6, lr}
  17210. *len = strlen(sSettings.sInfo.serialNumber);
  17211. 8027b66: 4c07 ldr r4, [pc, #28] ; (8027b84 <GetSerialNumberStr+0x20>)
  17212. /**
  17213. * @brief Серийный номер устройства
  17214. */
  17215. void GetSerialNumberStr(char *str, uint8_t *len)
  17216. {
  17217. 8027b68: 4605 mov r5, r0
  17218. *len = strlen(sSettings.sInfo.serialNumber);
  17219. 8027b6a: 4620 mov r0, r4
  17220. /**
  17221. * @brief Серийный номер устройства
  17222. */
  17223. void GetSerialNumberStr(char *str, uint8_t *len)
  17224. {
  17225. 8027b6c: 460e mov r6, r1
  17226. *len = strlen(sSettings.sInfo.serialNumber);
  17227. 8027b6e: f7fa f97f bl 8021e70 <strlen>
  17228. 8027b72: 4602 mov r2, r0
  17229. 8027b74: 7030 strb r0, [r6, #0]
  17230. strncpy(str, sSettings.sInfo.serialNumber, *len);
  17231. 8027b76: 4621 mov r1, r4
  17232. 8027b78: 4628 mov r0, r5
  17233. 8027b7a: b2d2 uxtb r2, r2
  17234. }
  17235. 8027b7c: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17236. * @brief Серийный номер устройства
  17237. */
  17238. void GetSerialNumberStr(char *str, uint8_t *len)
  17239. {
  17240. *len = strlen(sSettings.sInfo.serialNumber);
  17241. strncpy(str, sSettings.sInfo.serialNumber, *len);
  17242. 8027b80: f7fa ba2e b.w 8021fe0 <strncpy>
  17243. 8027b84: 2000eb62 .word 0x2000eb62
  17244. 08027b88 <GetOwnerStr>:
  17245. /**
  17246. * @brief Владелец устройства
  17247. */
  17248. void GetOwnerStr(char *str, uint8_t *len)
  17249. {
  17250. 8027b88: b570 push {r4, r5, r6, lr}
  17251. *len = strlen(sSettings.sSnmp.sysContact);
  17252. 8027b8a: 4c07 ldr r4, [pc, #28] ; (8027ba8 <GetOwnerStr+0x20>)
  17253. /**
  17254. * @brief Владелец устройства
  17255. */
  17256. void GetOwnerStr(char *str, uint8_t *len)
  17257. {
  17258. 8027b8c: 4605 mov r5, r0
  17259. *len = strlen(sSettings.sSnmp.sysContact);
  17260. 8027b8e: 4620 mov r0, r4
  17261. /**
  17262. * @brief Владелец устройства
  17263. */
  17264. void GetOwnerStr(char *str, uint8_t *len)
  17265. {
  17266. 8027b90: 460e mov r6, r1
  17267. *len = strlen(sSettings.sSnmp.sysContact);
  17268. 8027b92: f7fa f96d bl 8021e70 <strlen>
  17269. 8027b96: 4602 mov r2, r0
  17270. 8027b98: 7030 strb r0, [r6, #0]
  17271. strncpy(str, sSettings.sSnmp.sysContact, *len);
  17272. 8027b9a: 4621 mov r1, r4
  17273. 8027b9c: 4628 mov r0, r5
  17274. 8027b9e: b2d2 uxtb r2, r2
  17275. }
  17276. 8027ba0: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17277. * @brief Владелец устройства
  17278. */
  17279. void GetOwnerStr(char *str, uint8_t *len)
  17280. {
  17281. *len = strlen(sSettings.sSnmp.sysContact);
  17282. strncpy(str, sSettings.sSnmp.sysContact, *len);
  17283. 8027ba4: f7fa ba1c b.w 8021fe0 <strncpy>
  17284. 8027ba8: 2000ea10 .word 0x2000ea10
  17285. 08027bac <GetLocationStr>:
  17286. /**
  17287. * @brief Местоположение устройства
  17288. */
  17289. void GetLocationStr(char *str, uint8_t *len)
  17290. {
  17291. 8027bac: b570 push {r4, r5, r6, lr}
  17292. *len = strlen(sSettings.sSnmp.sysLocation);
  17293. 8027bae: 4c07 ldr r4, [pc, #28] ; (8027bcc <GetLocationStr+0x20>)
  17294. /**
  17295. * @brief Местоположение устройства
  17296. */
  17297. void GetLocationStr(char *str, uint8_t *len)
  17298. {
  17299. 8027bb0: 4605 mov r5, r0
  17300. *len = strlen(sSettings.sSnmp.sysLocation);
  17301. 8027bb2: 4620 mov r0, r4
  17302. /**
  17303. * @brief Местоположение устройства
  17304. */
  17305. void GetLocationStr(char *str, uint8_t *len)
  17306. {
  17307. 8027bb4: 460e mov r6, r1
  17308. *len = strlen(sSettings.sSnmp.sysLocation);
  17309. 8027bb6: f7fa f95b bl 8021e70 <strlen>
  17310. 8027bba: 4602 mov r2, r0
  17311. 8027bbc: 7030 strb r0, [r6, #0]
  17312. strncpy(str, sSettings.sSnmp.sysLocation, *len);
  17313. 8027bbe: 4621 mov r1, r4
  17314. 8027bc0: 4628 mov r0, r5
  17315. 8027bc2: b2d2 uxtb r2, r2
  17316. }
  17317. 8027bc4: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17318. * @brief Местоположение устройства
  17319. */
  17320. void GetLocationStr(char *str, uint8_t *len)
  17321. {
  17322. *len = strlen(sSettings.sSnmp.sysLocation);
  17323. strncpy(str, sSettings.sSnmp.sysLocation, *len);
  17324. 8027bc8: f7fa ba0a b.w 8021fe0 <strncpy>
  17325. 8027bcc: 2000ea56 .word 0x2000ea56
  17326. 08027bd0 <GetCommentsStr>:
  17327. /**
  17328. * @brief Комментарии
  17329. */
  17330. void GetCommentsStr(char *str, uint8_t *len)
  17331. {
  17332. 8027bd0: b570 push {r4, r5, r6, lr}
  17333. *len = strlen(sSettings.sInfo.comments);
  17334. 8027bd2: 4c07 ldr r4, [pc, #28] ; (8027bf0 <GetCommentsStr+0x20>)
  17335. /**
  17336. * @brief Комментарии
  17337. */
  17338. void GetCommentsStr(char *str, uint8_t *len)
  17339. {
  17340. 8027bd4: 4605 mov r5, r0
  17341. *len = strlen(sSettings.sInfo.comments);
  17342. 8027bd6: 4620 mov r0, r4
  17343. /**
  17344. * @brief Комментарии
  17345. */
  17346. void GetCommentsStr(char *str, uint8_t *len)
  17347. {
  17348. 8027bd8: 460e mov r6, r1
  17349. *len = strlen(sSettings.sInfo.comments);
  17350. 8027bda: f7fa f949 bl 8021e70 <strlen>
  17351. 8027bde: 4602 mov r2, r0
  17352. 8027be0: 7030 strb r0, [r6, #0]
  17353. strncpy(str, sSettings.sInfo.comments, *len);
  17354. 8027be2: 4621 mov r1, r4
  17355. 8027be4: 4628 mov r0, r5
  17356. 8027be6: b2d2 uxtb r2, r2
  17357. }
  17358. 8027be8: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17359. * @brief Комментарии
  17360. */
  17361. void GetCommentsStr(char *str, uint8_t *len)
  17362. {
  17363. *len = strlen(sSettings.sInfo.comments);
  17364. strncpy(str, sSettings.sInfo.comments, *len);
  17365. 8027bec: f7fa b9f8 b.w 8021fe0 <strncpy>
  17366. 8027bf0: 2000eb72 .word 0x2000eb72
  17367. 08027bf4 <GetUPSModelStr>:
  17368. /**
  17369. * @brief Модель UPS
  17370. */
  17371. void GetUPSModelStr(char *str, uint8_t *len)
  17372. {
  17373. 8027bf4: b570 push {r4, r5, r6, lr}
  17374. *len = strlen(UPS.model);
  17375. 8027bf6: 4c07 ldr r4, [pc, #28] ; (8027c14 <GetUPSModelStr+0x20>)
  17376. /**
  17377. * @brief Модель UPS
  17378. */
  17379. void GetUPSModelStr(char *str, uint8_t *len)
  17380. {
  17381. 8027bf8: 4605 mov r5, r0
  17382. *len = strlen(UPS.model);
  17383. 8027bfa: 4620 mov r0, r4
  17384. /**
  17385. * @brief Модель UPS
  17386. */
  17387. void GetUPSModelStr(char *str, uint8_t *len)
  17388. {
  17389. 8027bfc: 460e mov r6, r1
  17390. *len = strlen(UPS.model);
  17391. 8027bfe: f7fa f937 bl 8021e70 <strlen>
  17392. 8027c02: 4602 mov r2, r0
  17393. 8027c04: 7030 strb r0, [r6, #0]
  17394. strncpy(str, UPS.model, *len);
  17395. 8027c06: 4621 mov r1, r4
  17396. 8027c08: 4628 mov r0, r5
  17397. 8027c0a: b2d2 uxtb r2, r2
  17398. }
  17399. 8027c0c: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17400. * @brief Модель UPS
  17401. */
  17402. void GetUPSModelStr(char *str, uint8_t *len)
  17403. {
  17404. *len = strlen(UPS.model);
  17405. strncpy(str, UPS.model, *len);
  17406. 8027c10: f7fa b9e6 b.w 8021fe0 <strncpy>
  17407. 8027c14: 2000e8c8 .word 0x2000e8c8
  17408. 08027c18 <GetUPSVersionStr>:
  17409. /**
  17410. * @brief Версия UPS ПО
  17411. */
  17412. void GetUPSVersionStr(char *str, uint8_t *len) // +
  17413. {
  17414. 8027c18: b570 push {r4, r5, r6, lr}
  17415. *len = strlen(UPS.vertion);
  17416. 8027c1a: 4c07 ldr r4, [pc, #28] ; (8027c38 <GetUPSVersionStr+0x20>)
  17417. /**
  17418. * @brief Версия UPS ПО
  17419. */
  17420. void GetUPSVersionStr(char *str, uint8_t *len) // +
  17421. {
  17422. 8027c1c: 4605 mov r5, r0
  17423. *len = strlen(UPS.vertion);
  17424. 8027c1e: 4620 mov r0, r4
  17425. /**
  17426. * @brief Версия UPS ПО
  17427. */
  17428. void GetUPSVersionStr(char *str, uint8_t *len) // +
  17429. {
  17430. 8027c20: 460e mov r6, r1
  17431. *len = strlen(UPS.vertion);
  17432. 8027c22: f7fa f925 bl 8021e70 <strlen>
  17433. 8027c26: 4602 mov r2, r0
  17434. 8027c28: 7030 strb r0, [r6, #0]
  17435. strncpy(str, UPS.vertion, *len);
  17436. 8027c2a: 4621 mov r1, r4
  17437. 8027c2c: 4628 mov r0, r5
  17438. 8027c2e: b2d2 uxtb r2, r2
  17439. }
  17440. 8027c30: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17441. * @brief Версия UPS ПО
  17442. */
  17443. void GetUPSVersionStr(char *str, uint8_t *len) // +
  17444. {
  17445. *len = strlen(UPS.vertion);
  17446. strncpy(str, UPS.vertion, *len);
  17447. 8027c34: f7fa b9d4 b.w 8021fe0 <strncpy>
  17448. 8027c38: 2000e8d3 .word 0x2000e8d3
  17449. 08027c3c <GetUserLogin>:
  17450. // ************************************************************************** //
  17451. // Настройки аутентификации
  17452. void GetUserLogin(uint8_t user_id, char *str, uint8_t *len)
  17453. {
  17454. 8027c3c: b538 push {r3, r4, r5, lr}
  17455. sprintf(str, "%s", sSettings.sAuth[user_id].login);
  17456. 8027c3e: 4b08 ldr r3, [pc, #32] ; (8027c60 <GetUserLogin+0x24>)
  17457. // ************************************************************************** //
  17458. // Настройки аутентификации
  17459. void GetUserLogin(uint8_t user_id, char *str, uint8_t *len)
  17460. {
  17461. 8027c40: 4615 mov r5, r2
  17462. sprintf(str, "%s", sSettings.sAuth[user_id].login);
  17463. 8027c42: 2217 movs r2, #23
  17464. 8027c44: fb02 3200 mla r2, r2, r0, r3
  17465. // ************************************************************************** //
  17466. // Настройки аутентификации
  17467. void GetUserLogin(uint8_t user_id, char *str, uint8_t *len)
  17468. {
  17469. 8027c48: 460c mov r4, r1
  17470. sprintf(str, "%s", sSettings.sAuth[user_id].login);
  17471. 8027c4a: 4608 mov r0, r1
  17472. 8027c4c: 3205 adds r2, #5
  17473. 8027c4e: 4905 ldr r1, [pc, #20] ; (8027c64 <GetUserLogin+0x28>)
  17474. 8027c50: f7ff fd78 bl 8027744 <tfp_sprintf>
  17475. *len = strlen(str);
  17476. 8027c54: 4620 mov r0, r4
  17477. 8027c56: f7fa f90b bl 8021e70 <strlen>
  17478. 8027c5a: 7028 strb r0, [r5, #0]
  17479. 8027c5c: bd38 pop {r3, r4, r5, pc}
  17480. 8027c5e: bf00 nop
  17481. 8027c60: 2000ebf4 .word 0x2000ebf4
  17482. 8027c64: 08035e67 .word 0x08035e67
  17483. 08027c68 <GetUserPassword>:
  17484. }
  17485. void GetUserPassword(uint8_t user_id, char *str, uint8_t *len)
  17486. {
  17487. 8027c68: b538 push {r3, r4, r5, lr}
  17488. sprintf(str, "%s", sSettings.sAuth[user_id].password);
  17489. 8027c6a: 4b08 ldr r3, [pc, #32] ; (8027c8c <GetUserPassword+0x24>)
  17490. sprintf(str, "%s", sSettings.sAuth[user_id].login);
  17491. *len = strlen(str);
  17492. }
  17493. void GetUserPassword(uint8_t user_id, char *str, uint8_t *len)
  17494. {
  17495. 8027c6c: 4615 mov r5, r2
  17496. sprintf(str, "%s", sSettings.sAuth[user_id].password);
  17497. 8027c6e: 2217 movs r2, #23
  17498. 8027c70: fb02 3200 mla r2, r2, r0, r3
  17499. sprintf(str, "%s", sSettings.sAuth[user_id].login);
  17500. *len = strlen(str);
  17501. }
  17502. void GetUserPassword(uint8_t user_id, char *str, uint8_t *len)
  17503. {
  17504. 8027c74: 460c mov r4, r1
  17505. sprintf(str, "%s", sSettings.sAuth[user_id].password);
  17506. 8027c76: 4608 mov r0, r1
  17507. 8027c78: 3208 adds r2, #8
  17508. 8027c7a: 4905 ldr r1, [pc, #20] ; (8027c90 <GetUserPassword+0x28>)
  17509. 8027c7c: f7ff fd62 bl 8027744 <tfp_sprintf>
  17510. *len = strlen(str);
  17511. 8027c80: 4620 mov r0, r4
  17512. 8027c82: f7fa f8f5 bl 8021e70 <strlen>
  17513. 8027c86: 7028 strb r0, [r5, #0]
  17514. 8027c88: bd38 pop {r3, r4, r5, pc}
  17515. 8027c8a: bf00 nop
  17516. 8027c8c: 2000ebfc .word 0x2000ebfc
  17517. 8027c90: 08035e67 .word 0x08035e67
  17518. 08027c94 <GetUserLevelInt>:
  17519. *len = strlen(str);
  17520. }
  17521. void GetUserLevelInt(uint8_t user_id, uint8_t *value)
  17522. {
  17523. *value = sSettings.sAuth[user_id].level;
  17524. 8027c94: 4b03 ldr r3, [pc, #12] ; (8027ca4 <GetUserLevelInt+0x10>)
  17525. 8027c96: 2217 movs r2, #23
  17526. 8027c98: fb02 3000 mla r0, r2, r0, r3
  17527. 8027c9c: f890 3314 ldrb.w r3, [r0, #788] ; 0x314
  17528. 8027ca0: 700b strb r3, [r1, #0]
  17529. 8027ca2: 4770 bx lr
  17530. 8027ca4: 2000e8e4 .word 0x2000e8e4
  17531. 08027ca8 <GetIpStr>:
  17532. * @brief Текущий IP адрес
  17533. */
  17534. void GetIpStr(char *str, uint8_t *len)
  17535. {
  17536. /* Если сейчас временные настройки */
  17537. if (sSettings.sFlags.netsettingsChanged)
  17538. 8027ca8: 4a08 ldr r2, [pc, #32] ; (8027ccc <GetIpStr+0x24>)
  17539. /**
  17540. * @brief Текущий IP адрес
  17541. */
  17542. void GetIpStr(char *str, uint8_t *len)
  17543. {
  17544. 8027caa: b538 push {r3, r4, r5, lr}
  17545. /* Если сейчас временные настройки */
  17546. if (sSettings.sFlags.netsettingsChanged)
  17547. 8027cac: f892 32fc ldrb.w r3, [r2, #764] ; 0x2fc
  17548. /**
  17549. * @brief Текущий IP адрес
  17550. */
  17551. void GetIpStr(char *str, uint8_t *len)
  17552. {
  17553. 8027cb0: 460c mov r4, r1
  17554. 8027cb2: 4605 mov r5, r0
  17555. /* Если сейчас временные настройки */
  17556. if (sSettings.sFlags.netsettingsChanged)
  17557. sprintf(str, "%s", sSettings.sWebTempParams.ip);
  17558. 8027cb4: 4906 ldr r1, [pc, #24] ; (8027cd0 <GetIpStr+0x28>)
  17559. * @brief Текущий IP адрес
  17560. */
  17561. void GetIpStr(char *str, uint8_t *len)
  17562. {
  17563. /* Если сейчас временные настройки */
  17564. if (sSettings.sFlags.netsettingsChanged)
  17565. 8027cb6: b10b cbz r3, 8027cbc <GetIpStr+0x14>
  17566. sprintf(str, "%s", sSettings.sWebTempParams.ip);
  17567. 8027cb8: 3233 adds r2, #51 ; 0x33
  17568. 8027cba: e000 b.n 8027cbe <GetIpStr+0x16>
  17569. else
  17570. sprintf(str, "%s", sSettings.sWebParams.ip);
  17571. 8027cbc: 3202 adds r2, #2
  17572. 8027cbe: f7ff fd41 bl 8027744 <tfp_sprintf>
  17573. *len = strlen(str);
  17574. 8027cc2: 4628 mov r0, r5
  17575. 8027cc4: f7fa f8d4 bl 8021e70 <strlen>
  17576. 8027cc8: 7020 strb r0, [r4, #0]
  17577. 8027cca: bd38 pop {r3, r4, r5, pc}
  17578. 8027ccc: 2000e8e4 .word 0x2000e8e4
  17579. 8027cd0: 08035e67 .word 0x08035e67
  17580. 08027cd4 <GetGatewayStr>:
  17581. * @brief Текущий шлюз
  17582. */
  17583. void GetGatewayStr(char *str, uint8_t *len)
  17584. {
  17585. /* Если сейчас временные настройки */
  17586. if (sSettings.sFlags.netsettingsChanged)
  17587. 8027cd4: 4a08 ldr r2, [pc, #32] ; (8027cf8 <GetGatewayStr+0x24>)
  17588. /**
  17589. * @brief Текущий шлюз
  17590. */
  17591. void GetGatewayStr(char *str, uint8_t *len)
  17592. {
  17593. 8027cd6: b538 push {r3, r4, r5, lr}
  17594. /* Если сейчас временные настройки */
  17595. if (sSettings.sFlags.netsettingsChanged)
  17596. 8027cd8: f892 32fc ldrb.w r3, [r2, #764] ; 0x2fc
  17597. /**
  17598. * @brief Текущий шлюз
  17599. */
  17600. void GetGatewayStr(char *str, uint8_t *len)
  17601. {
  17602. 8027cdc: 460c mov r4, r1
  17603. 8027cde: 4605 mov r5, r0
  17604. /* Если сейчас временные настройки */
  17605. if (sSettings.sFlags.netsettingsChanged)
  17606. sprintf(str, "%s", sSettings.sWebTempParams.gate);
  17607. 8027ce0: 4906 ldr r1, [pc, #24] ; (8027cfc <GetGatewayStr+0x28>)
  17608. * @brief Текущий шлюз
  17609. */
  17610. void GetGatewayStr(char *str, uint8_t *len)
  17611. {
  17612. /* Если сейчас временные настройки */
  17613. if (sSettings.sFlags.netsettingsChanged)
  17614. 8027ce2: b10b cbz r3, 8027ce8 <GetGatewayStr+0x14>
  17615. sprintf(str, "%s", sSettings.sWebTempParams.gate);
  17616. 8027ce4: 3243 adds r2, #67 ; 0x43
  17617. 8027ce6: e000 b.n 8027cea <GetGatewayStr+0x16>
  17618. else
  17619. sprintf(str, "%s", sSettings.sWebParams.gate);
  17620. 8027ce8: 3212 adds r2, #18
  17621. 8027cea: f7ff fd2b bl 8027744 <tfp_sprintf>
  17622. *len = strlen(str);
  17623. 8027cee: 4628 mov r0, r5
  17624. 8027cf0: f7fa f8be bl 8021e70 <strlen>
  17625. 8027cf4: 7020 strb r0, [r4, #0]
  17626. 8027cf6: bd38 pop {r3, r4, r5, pc}
  17627. 8027cf8: 2000e8e4 .word 0x2000e8e4
  17628. 8027cfc: 08035e67 .word 0x08035e67
  17629. 08027d00 <GetMaskStr>:
  17630. * @brief Текущая маска подсети
  17631. */
  17632. void GetMaskStr(char *str, uint8_t *len)
  17633. {
  17634. /* Если сейчас временные настройки */
  17635. if (sSettings.sFlags.netsettingsChanged)
  17636. 8027d00: 4a08 ldr r2, [pc, #32] ; (8027d24 <GetMaskStr+0x24>)
  17637. /**
  17638. * @brief Текущая маска подсети
  17639. */
  17640. void GetMaskStr(char *str, uint8_t *len)
  17641. {
  17642. 8027d02: b538 push {r3, r4, r5, lr}
  17643. /* Если сейчас временные настройки */
  17644. if (sSettings.sFlags.netsettingsChanged)
  17645. 8027d04: f892 32fc ldrb.w r3, [r2, #764] ; 0x2fc
  17646. /**
  17647. * @brief Текущая маска подсети
  17648. */
  17649. void GetMaskStr(char *str, uint8_t *len)
  17650. {
  17651. 8027d08: 460c mov r4, r1
  17652. 8027d0a: 4605 mov r5, r0
  17653. /* Если сейчас временные настройки */
  17654. if (sSettings.sFlags.netsettingsChanged)
  17655. sprintf(str, "%s", sSettings.sWebTempParams.mask);
  17656. 8027d0c: 4906 ldr r1, [pc, #24] ; (8027d28 <GetMaskStr+0x28>)
  17657. * @brief Текущая маска подсети
  17658. */
  17659. void GetMaskStr(char *str, uint8_t *len)
  17660. {
  17661. /* Если сейчас временные настройки */
  17662. if (sSettings.sFlags.netsettingsChanged)
  17663. 8027d0e: b10b cbz r3, 8027d14 <GetMaskStr+0x14>
  17664. sprintf(str, "%s", sSettings.sWebTempParams.mask);
  17665. 8027d10: 3253 adds r2, #83 ; 0x53
  17666. 8027d12: e000 b.n 8027d16 <GetMaskStr+0x16>
  17667. else
  17668. sprintf(str, "%s", sSettings.sWebParams.mask);
  17669. 8027d14: 3222 adds r2, #34 ; 0x22
  17670. 8027d16: f7ff fd15 bl 8027744 <tfp_sprintf>
  17671. *len = strlen(str);
  17672. 8027d1a: 4628 mov r0, r5
  17673. 8027d1c: f7fa f8a8 bl 8021e70 <strlen>
  17674. 8027d20: 7020 strb r0, [r4, #0]
  17675. 8027d22: bd38 pop {r3, r4, r5, pc}
  17676. 8027d24: 2000e8e4 .word 0x2000e8e4
  17677. 8027d28: 08035e67 .word 0x08035e67
  17678. 08027d2c <GetDhcpStateStr>:
  17679. * @brief Настройка DHCP
  17680. */
  17681. void GetDhcpStateStr(char *str, uint8_t *len)
  17682. {
  17683. /* Если сейчас временные настройки */
  17684. if (sSettings.sFlags.netsettingsChanged)
  17685. 8027d2c: 4b08 ldr r3, [pc, #32] ; (8027d50 <GetDhcpStateStr+0x24>)
  17686. 8027d2e: f893 22fc ldrb.w r2, [r3, #764] ; 0x2fc
  17687. 8027d32: b112 cbz r2, 8027d3a <GetDhcpStateStr+0xe>
  17688. {
  17689. if (sSettings.sWebTempParams.dhcpEnable)
  17690. 8027d34: f893 3063 ldrb.w r3, [r3, #99] ; 0x63
  17691. 8027d38: e001 b.n 8027d3e <GetDhcpStateStr+0x12>
  17692. else
  17693. *str = '0';
  17694. }
  17695. else
  17696. {
  17697. if (sSettings.sWebParams.dhcpEnable)
  17698. 8027d3a: f893 3032 ldrb.w r3, [r3, #50] ; 0x32
  17699. 8027d3e: b10b cbz r3, 8027d44 <GetDhcpStateStr+0x18>
  17700. *str = '1';
  17701. 8027d40: 2331 movs r3, #49 ; 0x31
  17702. 8027d42: e000 b.n 8027d46 <GetDhcpStateStr+0x1a>
  17703. else
  17704. *str = '0';
  17705. 8027d44: 2330 movs r3, #48 ; 0x30
  17706. 8027d46: 7003 strb r3, [r0, #0]
  17707. }
  17708. *len = 1;
  17709. 8027d48: 2301 movs r3, #1
  17710. 8027d4a: 700b strb r3, [r1, #0]
  17711. 8027d4c: 4770 bx lr
  17712. 8027d4e: bf00 nop
  17713. 8027d50: 2000e8e4 .word 0x2000e8e4
  17714. 08027d54 <GetReadCommunity>:
  17715. /**
  17716. * @brief Текущее community для чтения
  17717. */
  17718. void GetReadCommunity(char *str, uint8_t *len)
  17719. {
  17720. 8027d54: b538 push {r3, r4, r5, lr}
  17721. sprintf(str, "%s", sSettings.sSnmp.readCommunity);
  17722. 8027d56: 4a05 ldr r2, [pc, #20] ; (8027d6c <GetReadCommunity+0x18>)
  17723. /**
  17724. * @brief Текущее community для чтения
  17725. */
  17726. void GetReadCommunity(char *str, uint8_t *len)
  17727. {
  17728. 8027d58: 4605 mov r5, r0
  17729. 8027d5a: 460c mov r4, r1
  17730. sprintf(str, "%s", sSettings.sSnmp.readCommunity);
  17731. 8027d5c: 4904 ldr r1, [pc, #16] ; (8027d70 <GetReadCommunity+0x1c>)
  17732. 8027d5e: f7ff fcf1 bl 8027744 <tfp_sprintf>
  17733. *len = strlen(str);
  17734. 8027d62: 4628 mov r0, r5
  17735. 8027d64: f7fa f884 bl 8021e70 <strlen>
  17736. 8027d68: 7020 strb r0, [r4, #0]
  17737. 8027d6a: bd38 pop {r3, r4, r5, pc}
  17738. 8027d6c: 2000e9e8 .word 0x2000e9e8
  17739. 8027d70: 08035e67 .word 0x08035e67
  17740. 08027d74 <GetWriteCommunity>:
  17741. /**
  17742. * @brief Текущее community для записи
  17743. */
  17744. void GetWriteCommunity(char *str, uint8_t *len)
  17745. {
  17746. 8027d74: b538 push {r3, r4, r5, lr}
  17747. sprintf(str, "%s", sSettings.sSnmp.writeCommunity);
  17748. 8027d76: 4a05 ldr r2, [pc, #20] ; (8027d8c <GetWriteCommunity+0x18>)
  17749. /**
  17750. * @brief Текущее community для записи
  17751. */
  17752. void GetWriteCommunity(char *str, uint8_t *len)
  17753. {
  17754. 8027d78: 4605 mov r5, r0
  17755. 8027d7a: 460c mov r4, r1
  17756. sprintf(str, "%s", sSettings.sSnmp.writeCommunity);
  17757. 8027d7c: 4904 ldr r1, [pc, #16] ; (8027d90 <GetWriteCommunity+0x1c>)
  17758. 8027d7e: f7ff fce1 bl 8027744 <tfp_sprintf>
  17759. *len = strlen(str);
  17760. 8027d82: 4628 mov r0, r5
  17761. 8027d84: f7fa f874 bl 8021e70 <strlen>
  17762. 8027d88: 7020 strb r0, [r4, #0]
  17763. 8027d8a: bd38 pop {r3, r4, r5, pc}
  17764. 8027d8c: 2000e9fc .word 0x2000e9fc
  17765. 8027d90: 08035e67 .word 0x08035e67
  17766. 08027d94 <GetManagerIp>:
  17767. /**
  17768. * @brief IP SNMP менеджера
  17769. */
  17770. void GetManagerIp(char *str, uint8_t *len)
  17771. {
  17772. 8027d94: b538 push {r3, r4, r5, lr}
  17773. sprintf(str, "%s", sSettings.sSnmp.managerIP);
  17774. 8027d96: 4a05 ldr r2, [pc, #20] ; (8027dac <GetManagerIp+0x18>)
  17775. /**
  17776. * @brief IP SNMP менеджера
  17777. */
  17778. void GetManagerIp(char *str, uint8_t *len)
  17779. {
  17780. 8027d98: 4605 mov r5, r0
  17781. 8027d9a: 460c mov r4, r1
  17782. sprintf(str, "%s", sSettings.sSnmp.managerIP);
  17783. 8027d9c: 4904 ldr r1, [pc, #16] ; (8027db0 <GetManagerIp+0x1c>)
  17784. 8027d9e: f7ff fcd1 bl 8027744 <tfp_sprintf>
  17785. *len = strlen(str);
  17786. 8027da2: 4628 mov r0, r5
  17787. 8027da4: f7fa f864 bl 8021e70 <strlen>
  17788. 8027da8: 7020 strb r0, [r4, #0]
  17789. 8027daa: bd38 pop {r3, r4, r5, pc}
  17790. 8027dac: 2000eac4 .word 0x2000eac4
  17791. 8027db0: 08035e67 .word 0x08035e67
  17792. 08027db4 <GetManagerIp2>:
  17793. }
  17794. void GetManagerIp2(char *str, uint8_t *len)
  17795. {
  17796. 8027db4: b538 push {r3, r4, r5, lr}
  17797. sprintf(str, "%s", sSettings.sSnmp.managerIP2);
  17798. 8027db6: 4a05 ldr r2, [pc, #20] ; (8027dcc <GetManagerIp2+0x18>)
  17799. sprintf(str, "%s", sSettings.sSnmp.managerIP);
  17800. *len = strlen(str);
  17801. }
  17802. void GetManagerIp2(char *str, uint8_t *len)
  17803. {
  17804. 8027db8: 4605 mov r5, r0
  17805. 8027dba: 460c mov r4, r1
  17806. sprintf(str, "%s", sSettings.sSnmp.managerIP2);
  17807. 8027dbc: 4904 ldr r1, [pc, #16] ; (8027dd0 <GetManagerIp2+0x1c>)
  17808. 8027dbe: f7ff fcc1 bl 8027744 <tfp_sprintf>
  17809. *len = strlen(str);
  17810. 8027dc2: 4628 mov r0, r5
  17811. 8027dc4: f7fa f854 bl 8021e70 <strlen>
  17812. 8027dc8: 7020 strb r0, [r4, #0]
  17813. 8027dca: bd38 pop {r3, r4, r5, pc}
  17814. 8027dcc: 2000ead8 .word 0x2000ead8
  17815. 8027dd0: 08035e67 .word 0x08035e67
  17816. 08027dd4 <GetManagerIp3>:
  17817. }
  17818. void GetManagerIp3(char *str, uint8_t *len)
  17819. {
  17820. 8027dd4: b538 push {r3, r4, r5, lr}
  17821. sprintf(str, "%s", sSettings.sSnmp.managerIP3);
  17822. 8027dd6: 4a05 ldr r2, [pc, #20] ; (8027dec <GetManagerIp3+0x18>)
  17823. sprintf(str, "%s", sSettings.sSnmp.managerIP2);
  17824. *len = strlen(str);
  17825. }
  17826. void GetManagerIp3(char *str, uint8_t *len)
  17827. {
  17828. 8027dd8: 4605 mov r5, r0
  17829. 8027dda: 460c mov r4, r1
  17830. sprintf(str, "%s", sSettings.sSnmp.managerIP3);
  17831. 8027ddc: 4904 ldr r1, [pc, #16] ; (8027df0 <GetManagerIp3+0x1c>)
  17832. 8027dde: f7ff fcb1 bl 8027744 <tfp_sprintf>
  17833. *len = strlen(str);
  17834. 8027de2: 4628 mov r0, r5
  17835. 8027de4: f7fa f844 bl 8021e70 <strlen>
  17836. 8027de8: 7020 strb r0, [r4, #0]
  17837. 8027dea: bd38 pop {r3, r4, r5, pc}
  17838. 8027dec: 2000eaec .word 0x2000eaec
  17839. 8027df0: 08035e67 .word 0x08035e67
  17840. 08027df4 <GetManagerIp4>:
  17841. }
  17842. void GetManagerIp4(char *str, uint8_t *len)
  17843. {
  17844. 8027df4: b538 push {r3, r4, r5, lr}
  17845. sprintf(str, "%s", sSettings.sSnmp.managerIP4);
  17846. 8027df6: 4a05 ldr r2, [pc, #20] ; (8027e0c <GetManagerIp4+0x18>)
  17847. sprintf(str, "%s", sSettings.sSnmp.managerIP3);
  17848. *len = strlen(str);
  17849. }
  17850. void GetManagerIp4(char *str, uint8_t *len)
  17851. {
  17852. 8027df8: 4605 mov r5, r0
  17853. 8027dfa: 460c mov r4, r1
  17854. sprintf(str, "%s", sSettings.sSnmp.managerIP4);
  17855. 8027dfc: 4904 ldr r1, [pc, #16] ; (8027e10 <GetManagerIp4+0x1c>)
  17856. 8027dfe: f7ff fca1 bl 8027744 <tfp_sprintf>
  17857. *len = strlen(str);
  17858. 8027e02: 4628 mov r0, r5
  17859. 8027e04: f7fa f834 bl 8021e70 <strlen>
  17860. 8027e08: 7020 strb r0, [r4, #0]
  17861. 8027e0a: bd38 pop {r3, r4, r5, pc}
  17862. 8027e0c: 2000eb00 .word 0x2000eb00
  17863. 8027e10: 08035e67 .word 0x08035e67
  17864. 08027e14 <GetManagerIp5>:
  17865. }
  17866. void GetManagerIp5(char *str, uint8_t *len)
  17867. {
  17868. 8027e14: b538 push {r3, r4, r5, lr}
  17869. sprintf(str, "%s", sSettings.sSnmp.managerIP5);
  17870. 8027e16: 4a05 ldr r2, [pc, #20] ; (8027e2c <GetManagerIp5+0x18>)
  17871. sprintf(str, "%s", sSettings.sSnmp.managerIP4);
  17872. *len = strlen(str);
  17873. }
  17874. void GetManagerIp5(char *str, uint8_t *len)
  17875. {
  17876. 8027e18: 4605 mov r5, r0
  17877. 8027e1a: 460c mov r4, r1
  17878. sprintf(str, "%s", sSettings.sSnmp.managerIP5);
  17879. 8027e1c: 4904 ldr r1, [pc, #16] ; (8027e30 <GetManagerIp5+0x1c>)
  17880. 8027e1e: f7ff fc91 bl 8027744 <tfp_sprintf>
  17881. *len = strlen(str);
  17882. 8027e22: 4628 mov r0, r5
  17883. 8027e24: f7fa f824 bl 8021e70 <strlen>
  17884. 8027e28: 7020 strb r0, [r4, #0]
  17885. 8027e2a: bd38 pop {r3, r4, r5, pc}
  17886. 8027e2c: 2000eb14 .word 0x2000eb14
  17887. 8027e30: 08035e67 .word 0x08035e67
  17888. 08027e34 <GetRDSIpStr>:
  17889. /**
  17890. * @brief Текущий IP адрес
  17891. */
  17892. void GetRDSIpStr(char *str, uint8_t *len)
  17893. {
  17894. 8027e34: b538 push {r3, r4, r5, lr}
  17895. sprintf(str, "%s", sSettings.sRADIUS.ServerIP);
  17896. 8027e36: 4a05 ldr r2, [pc, #20] ; (8027e4c <GetRDSIpStr+0x18>)
  17897. /**
  17898. * @brief Текущий IP адрес
  17899. */
  17900. void GetRDSIpStr(char *str, uint8_t *len)
  17901. {
  17902. 8027e38: 4605 mov r5, r0
  17903. 8027e3a: 460c mov r4, r1
  17904. sprintf(str, "%s", sSettings.sRADIUS.ServerIP);
  17905. 8027e3c: 4904 ldr r1, [pc, #16] ; (8027e50 <GetRDSIpStr+0x1c>)
  17906. 8027e3e: f7ff fc81 bl 8027744 <tfp_sprintf>
  17907. *len = strlen(str);
  17908. 8027e42: 4628 mov r0, r5
  17909. 8027e44: f7fa f814 bl 8021e70 <strlen>
  17910. 8027e48: 7020 strb r0, [r4, #0]
  17911. 8027e4a: bd38 pop {r3, r4, r5, pc}
  17912. 8027e4c: 2000ec60 .word 0x2000ec60
  17913. 8027e50: 08035e67 .word 0x08035e67
  17914. 08027e54 <GetRDSPortStr>:
  17915. /**
  17916. * @brief Текущий Порт
  17917. */
  17918. void GetRDSPortStr(char *str, uint8_t *len)
  17919. {
  17920. 8027e54: b538 push {r3, r4, r5, lr}
  17921. sprintf(str, "%d", sSettings.sRADIUS.port);
  17922. 8027e56: 4b06 ldr r3, [pc, #24] ; (8027e70 <GetRDSPortStr+0x1c>)
  17923. /**
  17924. * @brief Текущий Порт
  17925. */
  17926. void GetRDSPortStr(char *str, uint8_t *len)
  17927. {
  17928. 8027e58: 4605 mov r5, r0
  17929. 8027e5a: 460c mov r4, r1
  17930. sprintf(str, "%d", sSettings.sRADIUS.port);
  17931. 8027e5c: f8d3 23a0 ldr.w r2, [r3, #928] ; 0x3a0
  17932. 8027e60: 4904 ldr r1, [pc, #16] ; (8027e74 <GetRDSPortStr+0x20>)
  17933. 8027e62: f7ff fc6f bl 8027744 <tfp_sprintf>
  17934. *len = strlen(str);
  17935. 8027e66: 4628 mov r0, r5
  17936. 8027e68: f7fa f802 bl 8021e70 <strlen>
  17937. 8027e6c: 7020 strb r0, [r4, #0]
  17938. 8027e6e: bd38 pop {r3, r4, r5, pc}
  17939. 8027e70: 2000e8e4 .word 0x2000e8e4
  17940. 8027e74: 08035e55 .word 0x08035e55
  17941. 08027e78 <GetRDSKeyAccesstStr>:
  17942. /**
  17943. * @brief Текущий Код access
  17944. */
  17945. void GetRDSKeyAccesstStr(char *str, uint8_t *len)
  17946. {
  17947. 8027e78: b538 push {r3, r4, r5, lr}
  17948. sprintf(str, "%d", sSettings.sRADIUS.key_access);
  17949. 8027e7a: 4b06 ldr r3, [pc, #24] ; (8027e94 <GetRDSKeyAccesstStr+0x1c>)
  17950. /**
  17951. * @brief Текущий Код access
  17952. */
  17953. void GetRDSKeyAccesstStr(char *str, uint8_t *len)
  17954. {
  17955. 8027e7c: 4605 mov r5, r0
  17956. 8027e7e: 460c mov r4, r1
  17957. sprintf(str, "%d", sSettings.sRADIUS.key_access);
  17958. 8027e80: f8d3 23a4 ldr.w r2, [r3, #932] ; 0x3a4
  17959. 8027e84: 4904 ldr r1, [pc, #16] ; (8027e98 <GetRDSKeyAccesstStr+0x20>)
  17960. 8027e86: f7ff fc5d bl 8027744 <tfp_sprintf>
  17961. *len = strlen(str);
  17962. 8027e8a: 4628 mov r0, r5
  17963. 8027e8c: f7f9 fff0 bl 8021e70 <strlen>
  17964. 8027e90: 7020 strb r0, [r4, #0]
  17965. 8027e92: bd38 pop {r3, r4, r5, pc}
  17966. 8027e94: 2000e8e4 .word 0x2000e8e4
  17967. 8027e98: 08035e55 .word 0x08035e55
  17968. 08027e9c <GetRDSPasswordkStr>:
  17969. /**
  17970. * @brief Текущая пароль RADIUS
  17971. */
  17972. void GetRDSPasswordkStr(char *str, uint8_t *len)
  17973. {
  17974. 8027e9c: b538 push {r3, r4, r5, lr}
  17975. sprintf(str, "%s", sSettings.sRADIUS.rds_password);
  17976. 8027e9e: 4a05 ldr r2, [pc, #20] ; (8027eb4 <GetRDSPasswordkStr+0x18>)
  17977. /**
  17978. * @brief Текущая пароль RADIUS
  17979. */
  17980. void GetRDSPasswordkStr(char *str, uint8_t *len)
  17981. {
  17982. 8027ea0: 4605 mov r5, r0
  17983. 8027ea2: 460c mov r4, r1
  17984. sprintf(str, "%s", sSettings.sRADIUS.rds_password);
  17985. 8027ea4: 4904 ldr r1, [pc, #16] ; (8027eb8 <GetRDSPasswordkStr+0x1c>)
  17986. 8027ea6: f7ff fc4d bl 8027744 <tfp_sprintf>
  17987. *len = strlen(str);
  17988. 8027eaa: 4628 mov r0, r5
  17989. 8027eac: f7f9 ffe0 bl 8021e70 <strlen>
  17990. 8027eb0: 7020 strb r0, [r4, #0]
  17991. 8027eb2: bd38 pop {r3, r4, r5, pc}
  17992. 8027eb4: 2000ec70 .word 0x2000ec70
  17993. 8027eb8: 08035e67 .word 0x08035e67
  17994. 08027ebc <GetRDSEnableStateStr>:
  17995. /**
  17996. * @brief Настройка вкл/ выкл RADIUS сервера
  17997. */
  17998. void GetRDSEnableStateStr(char *str, uint8_t *len)
  17999. {
  18000. if (sSettings.sRADIUS.RDSEnable)
  18001. 8027ebc: 4b05 ldr r3, [pc, #20] ; (8027ed4 <GetRDSEnableStateStr+0x18>)
  18002. 8027ebe: f893 339d ldrb.w r3, [r3, #925] ; 0x39d
  18003. 8027ec2: b10b cbz r3, 8027ec8 <GetRDSEnableStateStr+0xc>
  18004. *str = '1';
  18005. 8027ec4: 2331 movs r3, #49 ; 0x31
  18006. 8027ec6: e000 b.n 8027eca <GetRDSEnableStateStr+0xe>
  18007. else
  18008. *str = '0';
  18009. 8027ec8: 2330 movs r3, #48 ; 0x30
  18010. 8027eca: 7003 strb r3, [r0, #0]
  18011. *len = 1;
  18012. 8027ecc: 2301 movs r3, #1
  18013. 8027ece: 700b strb r3, [r1, #0]
  18014. 8027ed0: 4770 bx lr
  18015. 8027ed2: bf00 nop
  18016. 8027ed4: 2000e8e4 .word 0x2000e8e4
  18017. 08027ed8 <GetRestore>:
  18018. /**
  18019. * @brief Произошел сброс настроек
  18020. */
  18021. void GetRestore(char *str, uint8_t *len) // +
  18022. {
  18023. 8027ed8: b510 push {r4, lr}
  18024. sprintf(str, "%s", "1");
  18025. 8027eda: 4a04 ldr r2, [pc, #16] ; (8027eec <GetRestore+0x14>)
  18026. /**
  18027. * @brief Произошел сброс настроек
  18028. */
  18029. void GetRestore(char *str, uint8_t *len) // +
  18030. {
  18031. 8027edc: 460c mov r4, r1
  18032. sprintf(str, "%s", "1");
  18033. 8027ede: 4904 ldr r1, [pc, #16] ; (8027ef0 <GetRestore+0x18>)
  18034. 8027ee0: f7ff fc30 bl 8027744 <tfp_sprintf>
  18035. *len = 1;
  18036. 8027ee4: 2301 movs r3, #1
  18037. 8027ee6: 7023 strb r3, [r4, #0]
  18038. 8027ee8: bd10 pop {r4, pc}
  18039. 8027eea: bf00 nop
  18040. 8027eec: 08035f50 .word 0x08035f50
  18041. 8027ef0: 08035e67 .word 0x08035e67
  18042. 08027ef4 <GetReboot>:
  18043. /**
  18044. * @brief Произошла перезагрузка
  18045. */
  18046. void GetReboot(char *str, uint8_t *len) // +
  18047. {
  18048. 8027ef4: b510 push {r4, lr}
  18049. sprintf(str, "%s", "1");
  18050. 8027ef6: 4a04 ldr r2, [pc, #16] ; (8027f08 <GetReboot+0x14>)
  18051. /**
  18052. * @brief Произошла перезагрузка
  18053. */
  18054. void GetReboot(char *str, uint8_t *len) // +
  18055. {
  18056. 8027ef8: 460c mov r4, r1
  18057. sprintf(str, "%s", "1");
  18058. 8027efa: 4904 ldr r1, [pc, #16] ; (8027f0c <GetReboot+0x18>)
  18059. 8027efc: f7ff fc22 bl 8027744 <tfp_sprintf>
  18060. *len = 1;
  18061. 8027f00: 2301 movs r3, #1
  18062. 8027f02: 7023 strb r3, [r4, #0]
  18063. 8027f04: bd10 pop {r4, pc}
  18064. 8027f06: bf00 nop
  18065. 8027f08: 08035f50 .word 0x08035f50
  18066. 8027f0c: 08035e67 .word 0x08035e67
  18067. 08027f10 <GetWebReinitFlag>:
  18068. /**
  18069. * @brief Вернуть признак изменения сетевых параметров
  18070. */
  18071. void GetWebReinitFlag(char *str, uint8_t *len)
  18072. {
  18073. 8027f10: b538 push {r3, r4, r5, lr}
  18074. if (sSettings.sFlags.netsettingsChanged)
  18075. 8027f12: 4b08 ldr r3, [pc, #32] ; (8027f34 <GetWebReinitFlag+0x24>)
  18076. 8027f14: f893 32fc ldrb.w r3, [r3, #764] ; 0x2fc
  18077. /**
  18078. * @brief Вернуть признак изменения сетевых параметров
  18079. */
  18080. void GetWebReinitFlag(char *str, uint8_t *len)
  18081. {
  18082. 8027f18: 460c mov r4, r1
  18083. 8027f1a: 4605 mov r5, r0
  18084. if (sSettings.sFlags.netsettingsChanged)
  18085. {
  18086. sprintf(str, "%s", "true");
  18087. 8027f1c: 4906 ldr r1, [pc, #24] ; (8027f38 <GetWebReinitFlag+0x28>)
  18088. /**
  18089. * @brief Вернуть признак изменения сетевых параметров
  18090. */
  18091. void GetWebReinitFlag(char *str, uint8_t *len)
  18092. {
  18093. if (sSettings.sFlags.netsettingsChanged)
  18094. 8027f1e: b10b cbz r3, 8027f24 <GetWebReinitFlag+0x14>
  18095. {
  18096. sprintf(str, "%s", "true");
  18097. 8027f20: 4a06 ldr r2, [pc, #24] ; (8027f3c <GetWebReinitFlag+0x2c>)
  18098. 8027f22: e000 b.n 8027f26 <GetWebReinitFlag+0x16>
  18099. *len = strlen(str);
  18100. }
  18101. else
  18102. {
  18103. sprintf(str, "%s", "false");
  18104. 8027f24: 4a06 ldr r2, [pc, #24] ; (8027f40 <GetWebReinitFlag+0x30>)
  18105. 8027f26: f7ff fc0d bl 8027744 <tfp_sprintf>
  18106. *len = strlen(str);
  18107. 8027f2a: 4628 mov r0, r5
  18108. 8027f2c: f7f9 ffa0 bl 8021e70 <strlen>
  18109. 8027f30: 7020 strb r0, [r4, #0]
  18110. 8027f32: bd38 pop {r3, r4, r5, pc}
  18111. 8027f34: 2000e8e4 .word 0x2000e8e4
  18112. 8027f38: 08035e67 .word 0x08035e67
  18113. 8027f3c: 08035e89 .word 0x08035e89
  18114. 8027f40: 08035e8e .word 0x08035e8e
  18115. 08027f44 <SetLoadMode>:
  18116. /**
  18117. * @brief Установить признак обновления ПО.
  18118. */
  18119. void SetLoadMode(void)
  18120. {
  18121. sSettings.bootParams.loadMode = 1;
  18122. 8027f44: 4b01 ldr r3, [pc, #4] ; (8027f4c <SetLoadMode+0x8>)
  18123. 8027f46: 2201 movs r2, #1
  18124. 8027f48: 701a strb r2, [r3, #0]
  18125. 8027f4a: 4770 bx lr
  18126. 8027f4c: 2000e8e4 .word 0x2000e8e4
  18127. 08027f50 <SetWebReinitFlag>:
  18128. /**
  18129. * @brief Установить признак изменения сетевых параметров
  18130. */
  18131. void SetWebReinitFlag(bool value)
  18132. {
  18133. sSettings.sFlags.netsettingsChanged = value;
  18134. 8027f50: 4b01 ldr r3, [pc, #4] ; (8027f58 <SetWebReinitFlag+0x8>)
  18135. 8027f52: f883 02fc strb.w r0, [r3, #764] ; 0x2fc
  18136. 8027f56: 4770 bx lr
  18137. 8027f58: 2000e8e4 .word 0x2000e8e4
  18138. 08027f5c <SetConfirmWebParamsFlag>:
  18139. /**
  18140. * @brief Установить флаг подтверждения сетевых настроек пользователем
  18141. */
  18142. void SetConfirmWebParamsFlag(void)
  18143. {
  18144. fConfirmWebParams = true;
  18145. 8027f5c: 4b01 ldr r3, [pc, #4] ; (8027f64 <SetConfirmWebParamsFlag+0x8>)
  18146. 8027f5e: 2201 movs r2, #1
  18147. 8027f60: 701a strb r2, [r3, #0]
  18148. 8027f62: 4770 bx lr
  18149. 8027f64: 200028ac .word 0x200028ac
  18150. 08027f68 <SetIPStr>:
  18151. // Сетевые параметры
  18152. /**
  18153. * @brief IP адрес
  18154. */
  18155. void SetIPStr(char *str)
  18156. {
  18157. 8027f68: 4601 mov r1, r0
  18158. //strcpy(sSettings.sWebParams.ip, str);
  18159. strcpy(sSettings.sWebTempParams.ip, str);
  18160. 8027f6a: 4801 ldr r0, [pc, #4] ; (8027f70 <SetIPStr+0x8>)
  18161. 8027f6c: f7f9 bf22 b.w 8021db4 <strcpy>
  18162. 8027f70: 2000e917 .word 0x2000e917
  18163. 08027f74 <SetGatewayStr>:
  18164. /**
  18165. * @brief Шлюз
  18166. */
  18167. void SetGatewayStr(char *str)
  18168. {
  18169. 8027f74: 4601 mov r1, r0
  18170. //strcpy(sSettings.sWebParams.gate, str);
  18171. strcpy(sSettings.sWebTempParams.gate, str);
  18172. 8027f76: 4801 ldr r0, [pc, #4] ; (8027f7c <SetGatewayStr+0x8>)
  18173. 8027f78: f7f9 bf1c b.w 8021db4 <strcpy>
  18174. 8027f7c: 2000e927 .word 0x2000e927
  18175. 08027f80 <SetMaskStr>:
  18176. /**
  18177. * @brief Текущая маска подсети
  18178. */
  18179. void SetMaskStr(char *str)
  18180. {
  18181. 8027f80: 4601 mov r1, r0
  18182. //strcpy(sSettings.sWebParams.mask, str);
  18183. strcpy(sSettings.sWebTempParams.mask, str);
  18184. 8027f82: 4801 ldr r0, [pc, #4] ; (8027f88 <SetMaskStr+0x8>)
  18185. 8027f84: f7f9 bf16 b.w 8021db4 <strcpy>
  18186. 8027f88: 2000e937 .word 0x2000e937
  18187. 08027f8c <SetDhcpStateStr>:
  18188. /**
  18189. * @brief Настройка DHCP
  18190. */
  18191. void SetDhcpStateStr(char *str)
  18192. {
  18193. 8027f8c: b508 push {r3, lr}
  18194. if (strncmp(str, "on", 2) == 0)
  18195. 8027f8e: 4906 ldr r1, [pc, #24] ; (8027fa8 <SetDhcpStateStr+0x1c>)
  18196. 8027f90: 2202 movs r2, #2
  18197. 8027f92: f7f9 ffcf bl 8021f34 <strncmp>
  18198. 8027f96: 4b05 ldr r3, [pc, #20] ; (8027fac <SetDhcpStateStr+0x20>)
  18199. 8027f98: b908 cbnz r0, 8027f9e <SetDhcpStateStr+0x12>
  18200. //sSettings.sWebParams.dhcpEnable = 1;
  18201. sSettings.sWebTempParams.dhcpEnable = 1;
  18202. 8027f9a: 2201 movs r2, #1
  18203. 8027f9c: e000 b.n 8027fa0 <SetDhcpStateStr+0x14>
  18204. else
  18205. //sSettings.sWebParams.dhcpEnable = 0;
  18206. sSettings.sWebTempParams.dhcpEnable = 0;
  18207. 8027f9e: 2200 movs r2, #0
  18208. 8027fa0: f883 2063 strb.w r2, [r3, #99] ; 0x63
  18209. 8027fa4: bd08 pop {r3, pc}
  18210. 8027fa6: bf00 nop
  18211. 8027fa8: 08035e94 .word 0x08035e94
  18212. 8027fac: 2000e8e4 .word 0x2000e8e4
  18213. 08027fb0 <SetReadCommunity>:
  18214. /**
  18215. * @brief Community для чтения
  18216. */
  18217. void SetReadCommunity(char *str)
  18218. {
  18219. 8027fb0: 4601 mov r1, r0
  18220. strcpy(sSettings.sSnmp.readCommunity, str);
  18221. 8027fb2: 4801 ldr r0, [pc, #4] ; (8027fb8 <SetReadCommunity+0x8>)
  18222. 8027fb4: f7f9 befe b.w 8021db4 <strcpy>
  18223. 8027fb8: 2000e9e8 .word 0x2000e9e8
  18224. 08027fbc <SetWriteCommunity>:
  18225. /**
  18226. * @brief Community для записи
  18227. */
  18228. void SetWriteCommunity(char *str)
  18229. {
  18230. 8027fbc: 4601 mov r1, r0
  18231. strcpy(sSettings.sSnmp.writeCommunity, str);
  18232. 8027fbe: 4801 ldr r0, [pc, #4] ; (8027fc4 <SetWriteCommunity+0x8>)
  18233. 8027fc0: f7f9 bef8 b.w 8021db4 <strcpy>
  18234. 8027fc4: 2000e9fc .word 0x2000e9fc
  18235. 08027fc8 <SetManagerIp>:
  18236. /**
  18237. * @brief IP SNMP менеджера
  18238. */
  18239. void SetManagerIp(char *str)
  18240. {
  18241. 8027fc8: b510 push {r4, lr}
  18242. strcpy(sSettings.sSnmp.managerIP, str);
  18243. 8027fca: 4c05 ldr r4, [pc, #20] ; (8027fe0 <SetManagerIp+0x18>)
  18244. /**
  18245. * @brief IP SNMP менеджера
  18246. */
  18247. void SetManagerIp(char *str)
  18248. {
  18249. 8027fcc: 4601 mov r1, r0
  18250. strcpy(sSettings.sSnmp.managerIP, str);
  18251. 8027fce: 4620 mov r0, r4
  18252. 8027fd0: f7f9 fef0 bl 8021db4 <strcpy>
  18253. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  18254. 8027fd4: 4620 mov r0, r4
  18255. }
  18256. 8027fd6: e8bd 4010 ldmia.w sp!, {r4, lr}
  18257. * @brief IP SNMP менеджера
  18258. */
  18259. void SetManagerIp(char *str)
  18260. {
  18261. strcpy(sSettings.sSnmp.managerIP, str);
  18262. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  18263. 8027fda: f00c bf97 b.w 8034f0c <SNMP_SetManagerIP>
  18264. 8027fde: bf00 nop
  18265. 8027fe0: 2000eac4 .word 0x2000eac4
  18266. 08027fe4 <SetManagerIp2>:
  18267. }
  18268. void SetManagerIp2(char *str)
  18269. {
  18270. 8027fe4: b510 push {r4, lr}
  18271. strcpy(sSettings.sSnmp.managerIP2, str);
  18272. 8027fe6: 4c05 ldr r4, [pc, #20] ; (8027ffc <SetManagerIp2+0x18>)
  18273. strcpy(sSettings.sSnmp.managerIP, str);
  18274. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  18275. }
  18276. void SetManagerIp2(char *str)
  18277. {
  18278. 8027fe8: 4601 mov r1, r0
  18279. strcpy(sSettings.sSnmp.managerIP2, str);
  18280. 8027fea: 4620 mov r0, r4
  18281. 8027fec: f7f9 fee2 bl 8021db4 <strcpy>
  18282. SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);
  18283. 8027ff0: 4620 mov r0, r4
  18284. }
  18285. 8027ff2: e8bd 4010 ldmia.w sp!, {r4, lr}
  18286. }
  18287. void SetManagerIp2(char *str)
  18288. {
  18289. strcpy(sSettings.sSnmp.managerIP2, str);
  18290. SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);
  18291. 8027ff6: f00c bf89 b.w 8034f0c <SNMP_SetManagerIP>
  18292. 8027ffa: bf00 nop
  18293. 8027ffc: 2000ead8 .word 0x2000ead8
  18294. 08028000 <SetManagerIp3>:
  18295. }
  18296. void SetManagerIp3(char *str)
  18297. {
  18298. 8028000: b510 push {r4, lr}
  18299. strcpy(sSettings.sSnmp.managerIP3, str);
  18300. 8028002: 4c05 ldr r4, [pc, #20] ; (8028018 <SetManagerIp3+0x18>)
  18301. strcpy(sSettings.sSnmp.managerIP2, str);
  18302. SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);
  18303. }
  18304. void SetManagerIp3(char *str)
  18305. {
  18306. 8028004: 4601 mov r1, r0
  18307. strcpy(sSettings.sSnmp.managerIP3, str);
  18308. 8028006: 4620 mov r0, r4
  18309. 8028008: f7f9 fed4 bl 8021db4 <strcpy>
  18310. SNMP_SetManagerIP(sSettings.sSnmp.managerIP3);
  18311. 802800c: 4620 mov r0, r4
  18312. }
  18313. 802800e: e8bd 4010 ldmia.w sp!, {r4, lr}
  18314. }
  18315. void SetManagerIp3(char *str)
  18316. {
  18317. strcpy(sSettings.sSnmp.managerIP3, str);
  18318. SNMP_SetManagerIP(sSettings.sSnmp.managerIP3);
  18319. 8028012: f00c bf7b b.w 8034f0c <SNMP_SetManagerIP>
  18320. 8028016: bf00 nop
  18321. 8028018: 2000eaec .word 0x2000eaec
  18322. 0802801c <SetManagerIp4>:
  18323. }
  18324. void SetManagerIp4(char *str)
  18325. {
  18326. 802801c: b510 push {r4, lr}
  18327. strcpy(sSettings.sSnmp.managerIP4, str);
  18328. 802801e: 4c05 ldr r4, [pc, #20] ; (8028034 <SetManagerIp4+0x18>)
  18329. strcpy(sSettings.sSnmp.managerIP3, str);
  18330. SNMP_SetManagerIP(sSettings.sSnmp.managerIP3);
  18331. }
  18332. void SetManagerIp4(char *str)
  18333. {
  18334. 8028020: 4601 mov r1, r0
  18335. strcpy(sSettings.sSnmp.managerIP4, str);
  18336. 8028022: 4620 mov r0, r4
  18337. 8028024: f7f9 fec6 bl 8021db4 <strcpy>
  18338. SNMP_SetManagerIP(sSettings.sSnmp.managerIP4);
  18339. 8028028: 4620 mov r0, r4
  18340. }
  18341. 802802a: e8bd 4010 ldmia.w sp!, {r4, lr}
  18342. }
  18343. void SetManagerIp4(char *str)
  18344. {
  18345. strcpy(sSettings.sSnmp.managerIP4, str);
  18346. SNMP_SetManagerIP(sSettings.sSnmp.managerIP4);
  18347. 802802e: f00c bf6d b.w 8034f0c <SNMP_SetManagerIP>
  18348. 8028032: bf00 nop
  18349. 8028034: 2000eb00 .word 0x2000eb00
  18350. 08028038 <SetManagerIp5>:
  18351. }
  18352. void SetManagerIp5(char *str)
  18353. {
  18354. 8028038: b510 push {r4, lr}
  18355. strcpy(sSettings.sSnmp.managerIP5, str);
  18356. 802803a: 4c05 ldr r4, [pc, #20] ; (8028050 <SetManagerIp5+0x18>)
  18357. strcpy(sSettings.sSnmp.managerIP4, str);
  18358. SNMP_SetManagerIP(sSettings.sSnmp.managerIP4);
  18359. }
  18360. void SetManagerIp5(char *str)
  18361. {
  18362. 802803c: 4601 mov r1, r0
  18363. strcpy(sSettings.sSnmp.managerIP5, str);
  18364. 802803e: 4620 mov r0, r4
  18365. 8028040: f7f9 feb8 bl 8021db4 <strcpy>
  18366. SNMP_SetManagerIP(sSettings.sSnmp.managerIP5);
  18367. 8028044: 4620 mov r0, r4
  18368. }
  18369. 8028046: e8bd 4010 ldmia.w sp!, {r4, lr}
  18370. }
  18371. void SetManagerIp5(char *str)
  18372. {
  18373. strcpy(sSettings.sSnmp.managerIP5, str);
  18374. SNMP_SetManagerIP(sSettings.sSnmp.managerIP5);
  18375. 802804a: f00c bf5f b.w 8034f0c <SNMP_SetManagerIP>
  18376. 802804e: bf00 nop
  18377. 8028050: 2000eb14 .word 0x2000eb14
  18378. 08028054 <SetOwner>:
  18379. /**
  18380. * @brief Установить владельца
  18381. */
  18382. void SetOwner(char *str)
  18383. {
  18384. 8028054: b510 push {r4, lr}
  18385. strcpy(sSettings.sSnmp.sysContact, str);
  18386. 8028056: 4c06 ldr r4, [pc, #24] ; (8028070 <SetOwner+0x1c>)
  18387. /**
  18388. * @brief Установить владельца
  18389. */
  18390. void SetOwner(char *str)
  18391. {
  18392. 8028058: 4601 mov r1, r0
  18393. strcpy(sSettings.sSnmp.sysContact, str);
  18394. 802805a: 4620 mov r0, r4
  18395. 802805c: f7f9 feaa bl 8021db4 <strcpy>
  18396. SNMP_SetSysContact(sSettings.sSnmp.sysContact);
  18397. 8028060: 4620 mov r0, r4
  18398. 8028062: f00c ff37 bl 8034ed4 <SNMP_SetSysContact>
  18399. SNMP_SetObjDescr();
  18400. }
  18401. 8028066: e8bd 4010 ldmia.w sp!, {r4, lr}
  18402. */
  18403. void SetOwner(char *str)
  18404. {
  18405. strcpy(sSettings.sSnmp.sysContact, str);
  18406. SNMP_SetSysContact(sSettings.sSnmp.sysContact);
  18407. SNMP_SetObjDescr();
  18408. 802806a: f00c befd b.w 8034e68 <SNMP_SetObjDescr>
  18409. 802806e: bf00 nop
  18410. 8028070: 2000ea10 .word 0x2000ea10
  18411. 08028074 <SetLocation>:
  18412. /**
  18413. * @brief Установить местоположение
  18414. */
  18415. void SetLocation(char *str)
  18416. {
  18417. 8028074: b510 push {r4, lr}
  18418. strcpy(sSettings.sSnmp.sysLocation, str);
  18419. 8028076: 4c05 ldr r4, [pc, #20] ; (802808c <SetLocation+0x18>)
  18420. /**
  18421. * @brief Установить местоположение
  18422. */
  18423. void SetLocation(char *str)
  18424. {
  18425. 8028078: 4601 mov r1, r0
  18426. strcpy(sSettings.sSnmp.sysLocation, str);
  18427. 802807a: 4620 mov r0, r4
  18428. 802807c: f7f9 fe9a bl 8021db4 <strcpy>
  18429. SNMP_SetSysLocation(sSettings.sSnmp.sysLocation);
  18430. 8028080: 4620 mov r0, r4
  18431. }
  18432. 8028082: e8bd 4010 ldmia.w sp!, {r4, lr}
  18433. * @brief Установить местоположение
  18434. */
  18435. void SetLocation(char *str)
  18436. {
  18437. strcpy(sSettings.sSnmp.sysLocation, str);
  18438. SNMP_SetSysLocation(sSettings.sSnmp.sysLocation);
  18439. 8028086: f00c bf33 b.w 8034ef0 <SNMP_SetSysLocation>
  18440. 802808a: bf00 nop
  18441. 802808c: 2000ea56 .word 0x2000ea56
  18442. 08028090 <SetComment>:
  18443. /**
  18444. * @brief Установить комментарий
  18445. */
  18446. void SetComment(char *str)
  18447. {
  18448. 8028090: 4601 mov r1, r0
  18449. strcpy(sSettings.sInfo.comments, str);
  18450. 8028092: 4801 ldr r0, [pc, #4] ; (8028098 <SetComment+0x8>)
  18451. 8028094: f7f9 be8e b.w 8021db4 <strcpy>
  18452. 8028098: 2000eb72 .word 0x2000eb72
  18453. 0802809c <SetRDSIpStr>:
  18454. // Сетевые параметры RADIUS сервера
  18455. /**
  18456. * @brief IP адрес
  18457. */
  18458. void SetRDSIpStr(char *str)
  18459. {
  18460. 802809c: 4601 mov r1, r0
  18461. strcpy(sSettings.sRADIUS.ServerIP, str);
  18462. 802809e: 4801 ldr r0, [pc, #4] ; (80280a4 <SetRDSIpStr+0x8>)
  18463. 80280a0: f7f9 be88 b.w 8021db4 <strcpy>
  18464. 80280a4: 2000ec60 .word 0x2000ec60
  18465. 080280a8 <SetRDSPortStr>:
  18466. /**
  18467. * @brief Порт
  18468. */
  18469. void SetRDSPortStr(char *str)
  18470. {
  18471. 80280a8: b508 push {r3, lr}
  18472. sSettings.sRADIUS.port = atoi(str);
  18473. 80280aa: f7f9 fbe9 bl 8021880 <atoi>
  18474. 80280ae: 4b02 ldr r3, [pc, #8] ; (80280b8 <SetRDSPortStr+0x10>)
  18475. 80280b0: f8c3 03a0 str.w r0, [r3, #928] ; 0x3a0
  18476. 80280b4: bd08 pop {r3, pc}
  18477. 80280b6: bf00 nop
  18478. 80280b8: 2000e8e4 .word 0x2000e8e4
  18479. 080280bc <SetRDSKeyAccesstStr>:
  18480. /**
  18481. * @brief Код access
  18482. */
  18483. void SetRDSKeyAccesstStr(char *str)
  18484. {
  18485. 80280bc: b508 push {r3, lr}
  18486. sSettings.sRADIUS.key_access = atoi(str);
  18487. 80280be: f7f9 fbdf bl 8021880 <atoi>
  18488. 80280c2: 4b02 ldr r3, [pc, #8] ; (80280cc <SetRDSKeyAccesstStr+0x10>)
  18489. 80280c4: f8c3 03a4 str.w r0, [r3, #932] ; 0x3a4
  18490. 80280c8: bd08 pop {r3, pc}
  18491. 80280ca: bf00 nop
  18492. 80280cc: 2000e8e4 .word 0x2000e8e4
  18493. 080280d0 <SetRDSPasswordkStr>:
  18494. /**
  18495. * @brief пароль RADIUS
  18496. */
  18497. void SetRDSPasswordkStr(char *str)
  18498. {
  18499. 80280d0: 4601 mov r1, r0
  18500. strcpy(sSettings.sRADIUS.rds_password, str);
  18501. 80280d2: 4801 ldr r0, [pc, #4] ; (80280d8 <SetRDSPasswordkStr+0x8>)
  18502. 80280d4: f7f9 be6e b.w 8021db4 <strcpy>
  18503. 80280d8: 2000ec70 .word 0x2000ec70
  18504. 080280dc <SetRDSEnableStateStr>:
  18505. /**
  18506. * @brief Настройка вкл/ выкл RADIUS сервера
  18507. */
  18508. void SetRDSEnableStateStr(char *str)
  18509. {
  18510. 80280dc: b508 push {r3, lr}
  18511. if (strncmp(str, "on", 2) == 0)
  18512. 80280de: 4906 ldr r1, [pc, #24] ; (80280f8 <SetRDSEnableStateStr+0x1c>)
  18513. 80280e0: 2202 movs r2, #2
  18514. 80280e2: f7f9 ff27 bl 8021f34 <strncmp>
  18515. 80280e6: 4b05 ldr r3, [pc, #20] ; (80280fc <SetRDSEnableStateStr+0x20>)
  18516. 80280e8: b908 cbnz r0, 80280ee <SetRDSEnableStateStr+0x12>
  18517. sSettings.sRADIUS.RDSEnable = 1;
  18518. 80280ea: 2201 movs r2, #1
  18519. 80280ec: e000 b.n 80280f0 <SetRDSEnableStateStr+0x14>
  18520. else
  18521. sSettings.sRADIUS.RDSEnable = 0;
  18522. 80280ee: 2200 movs r2, #0
  18523. 80280f0: f883 239d strb.w r2, [r3, #925] ; 0x39d
  18524. 80280f4: bd08 pop {r3, pc}
  18525. 80280f6: bf00 nop
  18526. 80280f8: 08035e94 .word 0x08035e94
  18527. 80280fc: 2000e8e4 .word 0x2000e8e4
  18528. 08028100 <SetDateStr>:
  18529. /**
  18530. * @brief Дата
  18531. */
  18532. void SetDateStr(char *str)
  18533. {
  18534. 8028100: b510 push {r4, lr}
  18535. 8028102: b08c sub sp, #48 ; 0x30
  18536. 8028104: 4604 mov r4, r0
  18537. TM_RTC_t tmp_data;
  18538. char str_data[18];
  18539. char str_time[9];
  18540. uint8_t len;
  18541. memset(str_data, 0, 18);
  18542. 8028106: 2100 movs r1, #0
  18543. 8028108: 2212 movs r2, #18
  18544. 802810a: a807 add r0, sp, #28
  18545. 802810c: f7f9 fcd8 bl 8021ac0 <memset>
  18546. memset(str_time, 0, 9);
  18547. 8028110: 2100 movs r1, #0
  18548. 8028112: 2209 movs r2, #9
  18549. 8028114: 4668 mov r0, sp
  18550. 8028116: f7f9 fcd3 bl 8021ac0 <memset>
  18551. str += 2;
  18552. strncpy(str_data, (str + 6), 2);
  18553. 802811a: f104 0108 add.w r1, r4, #8
  18554. 802811e: 2202 movs r2, #2
  18555. 8028120: a807 add r0, sp, #28
  18556. 8028122: f7f9 ff5d bl 8021fe0 <strncpy>
  18557. strncat(str_data, (str + 2), 4);
  18558. 8028126: 1d21 adds r1, r4, #4
  18559. 8028128: 2204 movs r2, #4
  18560. 802812a: a807 add r0, sp, #28
  18561. 802812c: f7f9 fed0 bl 8021ed0 <strncat>
  18562. strncat(str_data, str, 2);
  18563. 8028130: 2202 movs r2, #2
  18564. 8028132: 1ca1 adds r1, r4, #2
  18565. 8028134: a807 add r0, sp, #28
  18566. 8028136: f7f9 fecb bl 8021ed0 <strncat>
  18567. TM_RTC_GetDateTime(&tmp_data, TM_RTC_Format_BIN);
  18568. 802813a: a803 add r0, sp, #12
  18569. 802813c: 2100 movs r1, #0
  18570. 802813e: f7fe f9a3 bl 8026488 <TM_RTC_GetDateTime>
  18571. sprintf(str_time, "-01-%02i:%02i", tmp_data.hours, tmp_data.minutes);
  18572. 8028142: f89d 2011 ldrb.w r2, [sp, #17]
  18573. 8028146: f89d 3010 ldrb.w r3, [sp, #16]
  18574. 802814a: 4908 ldr r1, [pc, #32] ; (802816c <SetDateStr+0x6c>)
  18575. 802814c: 4668 mov r0, sp
  18576. 802814e: f7ff faf9 bl 8027744 <tfp_sprintf>
  18577. len = strlen(str_time);
  18578. 8028152: 4668 mov r0, sp
  18579. 8028154: f7f9 fe8c bl 8021e70 <strlen>
  18580. strncat(str_data, str_time, len);
  18581. 8028158: 4669 mov r1, sp
  18582. 802815a: b2c2 uxtb r2, r0
  18583. 802815c: a807 add r0, sp, #28
  18584. 802815e: f7f9 feb7 bl 8021ed0 <strncat>
  18585. TM_RTC_SetDateTimeString(&str_data);
  18586. 8028162: a807 add r0, sp, #28
  18587. 8028164: f7fe f876 bl 8026254 <TM_RTC_SetDateTimeString>
  18588. }
  18589. 8028168: b00c add sp, #48 ; 0x30
  18590. 802816a: bd10 pop {r4, pc}
  18591. 802816c: 08035e97 .word 0x08035e97
  18592. 08028170 <SetTimeStr>:
  18593. /**
  18594. * @brief Время
  18595. */
  18596. void SetTimeStr(char *str)
  18597. {
  18598. 8028170: b510 push {r4, lr}
  18599. 8028172: b090 sub sp, #64 ; 0x40
  18600. 8028174: 4604 mov r4, r0
  18601. TM_RTC_t tmp_data;
  18602. char str_data[18];
  18603. char str_date[14];
  18604. uint8_t len;
  18605. memset(str_data, 0, 18);
  18606. 8028176: 2100 movs r1, #0
  18607. 8028178: 2212 movs r2, #18
  18608. 802817a: a80b add r0, sp, #44 ; 0x2c
  18609. 802817c: f7f9 fca0 bl 8021ac0 <memset>
  18610. memset(str_date, 0, 14);
  18611. 8028180: 220e movs r2, #14
  18612. 8028182: 2100 movs r1, #0
  18613. 8028184: a803 add r0, sp, #12
  18614. 8028186: f7f9 fc9b bl 8021ac0 <memset>
  18615. TM_RTC_GetDateTime(&tmp_data, TM_RTC_Format_BIN);
  18616. 802818a: a807 add r0, sp, #28
  18617. 802818c: 2100 movs r1, #0
  18618. 802818e: f7fe f97b bl 8026488 <TM_RTC_GetDateTime>
  18619. sprintf(str_date, "%02i-%02i-%02i-01-", tmp_data.date, tmp_data.month, tmp_data.year);
  18620. 8028192: f89d 1025 ldrb.w r1, [sp, #37] ; 0x25
  18621. 8028196: f89d 3024 ldrb.w r3, [sp, #36] ; 0x24
  18622. 802819a: f89d 2023 ldrb.w r2, [sp, #35] ; 0x23
  18623. 802819e: 9100 str r1, [sp, #0]
  18624. 80281a0: a803 add r0, sp, #12
  18625. 80281a2: 490a ldr r1, [pc, #40] ; (80281cc <SetTimeStr+0x5c>)
  18626. 80281a4: f7ff face bl 8027744 <tfp_sprintf>
  18627. len = strlen(str_date);
  18628. 80281a8: a803 add r0, sp, #12
  18629. 80281aa: f7f9 fe61 bl 8021e70 <strlen>
  18630. strncat(str_data, str_date, len);
  18631. 80281ae: a903 add r1, sp, #12
  18632. 80281b0: b2c2 uxtb r2, r0
  18633. 80281b2: a80b add r0, sp, #44 ; 0x2c
  18634. 80281b4: f7f9 fe8c bl 8021ed0 <strncat>
  18635. strncat(str_data, str, 5);
  18636. 80281b8: a80b add r0, sp, #44 ; 0x2c
  18637. 80281ba: 4621 mov r1, r4
  18638. 80281bc: 2205 movs r2, #5
  18639. 80281be: f7f9 fe87 bl 8021ed0 <strncat>
  18640. TM_RTC_SetDateTimeString(&str_data);
  18641. 80281c2: a80b add r0, sp, #44 ; 0x2c
  18642. 80281c4: f7fe f846 bl 8026254 <TM_RTC_SetDateTimeString>
  18643. }
  18644. 80281c8: b010 add sp, #64 ; 0x40
  18645. 80281ca: bd10 pop {r4, pc}
  18646. 80281cc: 08035ea5 .word 0x08035ea5
  18647. 080281d0 <SetSntpStateStr>:
  18648. /**
  18649. * @brief Состояние SNTP
  18650. */
  18651. void SetSntpStateStr(char *str)
  18652. {
  18653. 80281d0: b538 push {r3, r4, r5, lr}
  18654. bool old_sntpEnable = sSettings.sSNTP.sntpEnable;
  18655. 80281d2: 4c0d ldr r4, [pc, #52] ; (8028208 <SetSntpStateStr+0x38>)
  18656. if (strncmp(str, "1", 1) == 0){
  18657. 80281d4: 490d ldr r1, [pc, #52] ; (802820c <SetSntpStateStr+0x3c>)
  18658. /**
  18659. * @brief Состояние SNTP
  18660. */
  18661. void SetSntpStateStr(char *str)
  18662. {
  18663. bool old_sntpEnable = sSettings.sSNTP.sntpEnable;
  18664. 80281d6: f894 5344 ldrb.w r5, [r4, #836] ; 0x344
  18665. if (strncmp(str, "1", 1) == 0){
  18666. 80281da: 2201 movs r2, #1
  18667. 80281dc: f7f9 feaa bl 8021f34 <strncmp>
  18668. 80281e0: b948 cbnz r0, 80281f6 <SetSntpStateStr+0x26>
  18669. sSettings.sSNTP.sntpEnable = true;
  18670. 80281e2: 2001 movs r0, #1
  18671. 80281e4: f884 0344 strb.w r0, [r4, #836] ; 0x344
  18672. if(old_sntpEnable != sSettings.sSNTP.sntpEnable){
  18673. 80281e8: b965 cbnz r5, 8028204 <SetSntpStateStr+0x34>
  18674. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  18675. 80281ea: f00c ff05 bl 8034ff8 <SNTP_Enable>
  18676. }
  18677. else{
  18678. sSettings.sSNTP.sntpEnable = false;
  18679. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  18680. }
  18681. }
  18682. 80281ee: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  18683. bool old_sntpEnable = sSettings.sSNTP.sntpEnable;
  18684. if (strncmp(str, "1", 1) == 0){
  18685. sSettings.sSNTP.sntpEnable = true;
  18686. if(old_sntpEnable != sSettings.sSNTP.sntpEnable){
  18687. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  18688. SNTP_Poll();
  18689. 80281f2: f00c bf43 b.w 803507c <SNTP_Poll>
  18690. }
  18691. }
  18692. else{
  18693. sSettings.sSNTP.sntpEnable = false;
  18694. 80281f6: 2000 movs r0, #0
  18695. 80281f8: f884 0344 strb.w r0, [r4, #836] ; 0x344
  18696. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  18697. }
  18698. }
  18699. 80281fc: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  18700. SNTP_Poll();
  18701. }
  18702. }
  18703. else{
  18704. sSettings.sSNTP.sntpEnable = false;
  18705. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  18706. 8028200: f00c befa b.w 8034ff8 <SNTP_Enable>
  18707. 8028204: bd38 pop {r3, r4, r5, pc}
  18708. 8028206: bf00 nop
  18709. 8028208: 2000e8e4 .word 0x2000e8e4
  18710. 802820c: 08035f50 .word 0x08035f50
  18711. 08028210 <SetSntpServerIpStr>:
  18712. /**
  18713. * @brief IP адрес SNTP сервера
  18714. */
  18715. void SetSntpServerIpStr(char *str)
  18716. {
  18717. 8028210: 4601 mov r1, r0
  18718. strcpy(sSettings.sSNTP.ip, str);
  18719. 8028212: 4801 ldr r0, [pc, #4] ; (8028218 <SetSntpServerIpStr+0x8>)
  18720. 8028214: f7f9 bdce b.w 8021db4 <strcpy>
  18721. 8028218: 2000ec29 .word 0x2000ec29
  18722. 0802821c <SetSntpTimeZoneStr>:
  18723. /**
  18724. * @brief Часовой пояс контроллера
  18725. */
  18726. void SetSntpTimeZoneStr(char *str)
  18727. {
  18728. 802821c: b570 push {r4, r5, r6, lr}
  18729. float newUtc;
  18730. newUtc = atof(str);
  18731. 802821e: f7f9 fb2b bl 8021878 <atof>
  18732. 8028222: f7f8 fc8f bl 8020b44 <__aeabi_d2f>
  18733. if (sSettings.sSNTP.timeZone > 0)
  18734. 8028226: 4b27 ldr r3, [pc, #156] ; (80282c4 <SetSntpTimeZoneStr+0xa8>)
  18735. 8028228: f8d3 4374 ldr.w r4, [r3, #884] ; 0x374
  18736. */
  18737. void SetSntpTimeZoneStr(char *str)
  18738. {
  18739. float newUtc;
  18740. newUtc = atof(str);
  18741. 802822c: 4606 mov r6, r0
  18742. if (sSettings.sSNTP.timeZone > 0)
  18743. 802822e: 2100 movs r1, #0
  18744. 8028230: 4620 mov r0, r4
  18745. 8028232: f7f8 fe51 bl 8020ed8 <__aeabi_fcmpgt>
  18746. 8028236: b100 cbz r0, 802823a <SetSntpTimeZoneStr+0x1e>
  18747. 8028238: e033 b.n 80282a2 <SetSntpTimeZoneStr+0x86>
  18748. {
  18749. TM_RTC_Correction(newUtc - sSettings.sSNTP.timeZone);
  18750. }
  18751. }
  18752. else if (sSettings.sSNTP.timeZone < 0)
  18753. 802823a: 4620 mov r0, r4
  18754. 802823c: 2100 movs r1, #0
  18755. 802823e: f7f8 fe2d bl 8020e9c <__aeabi_fcmplt>
  18756. 8028242: 2800 cmp r0, #0
  18757. 8028244: d032 beq.n 80282ac <SetSntpTimeZoneStr+0x90>
  18758. {
  18759. if (newUtc >= 0)
  18760. 8028246: 4630 mov r0, r6
  18761. 8028248: 2100 movs r1, #0
  18762. 802824a: f7f8 fe3b bl 8020ec4 <__aeabi_fcmpge>
  18763. 802824e: b170 cbz r0, 802826e <SetSntpTimeZoneStr+0x52>
  18764. {
  18765. TM_RTC_Correction(newUtc + fabs(sSettings.sSNTP.timeZone));
  18766. 8028250: 4620 mov r0, r4
  18767. 8028252: f7f8 f961 bl 8020518 <__aeabi_f2d>
  18768. 8028256: f7fd f815 bl 8025284 <fabs>
  18769. 802825a: 4604 mov r4, r0
  18770. 802825c: 460d mov r5, r1
  18771. 802825e: 4630 mov r0, r6
  18772. 8028260: f7f8 f95a bl 8020518 <__aeabi_f2d>
  18773. 8028264: 4622 mov r2, r4
  18774. 8028266: 462b mov r3, r5
  18775. 8028268: f7f7 fff8 bl 802025c <__adddf3>
  18776. 802826c: e016 b.n 802829c <SetSntpTimeZoneStr+0x80>
  18777. }
  18778. else
  18779. {
  18780. if (newUtc >= sSettings.sSNTP.timeZone)
  18781. 802826e: 4630 mov r0, r6
  18782. 8028270: 4621 mov r1, r4
  18783. 8028272: f7f8 fe27 bl 8020ec4 <__aeabi_fcmpge>
  18784. 8028276: b1a0 cbz r0, 80282a2 <SetSntpTimeZoneStr+0x86>
  18785. TM_RTC_Correction(fabs(sSettings.sSNTP.timeZone) - fabs(newUtc));
  18786. 8028278: 4620 mov r0, r4
  18787. 802827a: f7f8 f94d bl 8020518 <__aeabi_f2d>
  18788. 802827e: f7fd f801 bl 8025284 <fabs>
  18789. 8028282: 4604 mov r4, r0
  18790. 8028284: 4630 mov r0, r6
  18791. 8028286: 460d mov r5, r1
  18792. 8028288: f7f8 f946 bl 8020518 <__aeabi_f2d>
  18793. 802828c: f7fc fffa bl 8025284 <fabs>
  18794. 8028290: 4602 mov r2, r0
  18795. 8028292: 460b mov r3, r1
  18796. 8028294: 4620 mov r0, r4
  18797. 8028296: 4629 mov r1, r5
  18798. 8028298: f7f7 ffde bl 8020258 <__aeabi_dsub>
  18799. 802829c: f7f8 fc52 bl 8020b44 <__aeabi_d2f>
  18800. 80282a0: e00a b.n 80282b8 <SetSntpTimeZoneStr+0x9c>
  18801. else
  18802. TM_RTC_Correction(newUtc - sSettings.sSNTP.timeZone);
  18803. 80282a2: 4630 mov r0, r6
  18804. 80282a4: 4621 mov r1, r4
  18805. 80282a6: f7f8 fca1 bl 8020bec <__aeabi_fsub>
  18806. 80282aa: e005 b.n 80282b8 <SetSntpTimeZoneStr+0x9c>
  18807. }
  18808. }
  18809. else if (sSettings.sSNTP.timeZone == 0)
  18810. 80282ac: 4620 mov r0, r4
  18811. 80282ae: 2100 movs r1, #0
  18812. 80282b0: f7f8 fdea bl 8020e88 <__aeabi_fcmpeq>
  18813. 80282b4: b110 cbz r0, 80282bc <SetSntpTimeZoneStr+0xa0>
  18814. {
  18815. TM_RTC_Correction(newUtc);
  18816. 80282b6: 4630 mov r0, r6
  18817. 80282b8: f7fe f9e2 bl 8026680 <TM_RTC_Correction>
  18818. }
  18819. sSettings.sSNTP.timeZone = newUtc; // atof(str);
  18820. 80282bc: 4b01 ldr r3, [pc, #4] ; (80282c4 <SetSntpTimeZoneStr+0xa8>)
  18821. 80282be: f8c3 6374 str.w r6, [r3, #884] ; 0x374
  18822. 80282c2: bd70 pop {r4, r5, r6, pc}
  18823. 80282c4: 2000e8e4 .word 0x2000e8e4
  18824. 080282c8 <SetDINTypeActStr>:
  18825. /**
  18826. * @brief Тип действий при срабатывание сухих контактов
  18827. */
  18828. void SetDINTypeActStr(char *str, uint8_t num)
  18829. {
  18830. 80282c8: b510 push {r4, lr}
  18831. 80282ca: 460c mov r4, r1
  18832. sSettings.sInOuts.din_type_act[num] = atoi(str);
  18833. 80282cc: f7f9 fad8 bl 8021880 <atoi>
  18834. 80282d0: 4902 ldr r1, [pc, #8] ; (80282dc <SetDINTypeActStr+0x14>)
  18835. 80282d2: 1909 adds r1, r1, r4
  18836. 80282d4: f881 037a strb.w r0, [r1, #890] ; 0x37a
  18837. 80282d8: bd10 pop {r4, pc}
  18838. 80282da: bf00 nop
  18839. 80282dc: 2000e8e4 .word 0x2000e8e4
  18840. 080282e0 <SetROTypeActStr>:
  18841. /**
  18842. * @brief Источник срабатывания реле
  18843. */
  18844. void SetROTypeActStr(char *str, uint8_t num)
  18845. {
  18846. 80282e0: b510 push {r4, lr}
  18847. 80282e2: 460c mov r4, r1
  18848. sSettings.sInOuts.ro_type_source[num] = atoi(str);
  18849. 80282e4: f7f9 facc bl 8021880 <atoi>
  18850. 80282e8: 4902 ldr r1, [pc, #8] ; (80282f4 <SetROTypeActStr+0x14>)
  18851. 80282ea: 1909 adds r1, r1, r4
  18852. 80282ec: f881 0378 strb.w r0, [r1, #888] ; 0x378
  18853. 80282f0: bd10 pop {r4, pc}
  18854. 80282f2: bf00 nop
  18855. 80282f4: 2000e8e4 .word 0x2000e8e4
  18856. 080282f8 <SETTINGS_SetBootParamsDef>:
  18857. /**
  18858. * @brief Установить параметры обновления ПО по умолчанию
  18859. */
  18860. void SETTINGS_SetBootParamsDef(void)
  18861. {
  18862. sSettings.bootParams.loadMode = 1;
  18863. 80282f8: 4b02 ldr r3, [pc, #8] ; (8028304 <SETTINGS_SetBootParamsDef+0xc>)
  18864. 80282fa: 2201 movs r2, #1
  18865. 80282fc: 701a strb r2, [r3, #0]
  18866. sSettings.bootParams.bootTry = 0;
  18867. 80282fe: 2200 movs r2, #0
  18868. 8028300: 705a strb r2, [r3, #1]
  18869. 8028302: 4770 bx lr
  18870. 8028304: 2000e8e4 .word 0x2000e8e4
  18871. 08028308 <SETTINGS_SetWebParamsDef>:
  18872. /**
  18873. * @brief Установить параметры сетевого подключения по умолчанию
  18874. */
  18875. void SETTINGS_SetWebParamsDef(void)
  18876. {
  18877. 8028308: b510 push {r4, lr}
  18878. strcpy(sSettings.sWebParams.ip, "192.168.1.2");
  18879. 802830a: 4c09 ldr r4, [pc, #36] ; (8028330 <SETTINGS_SetWebParamsDef+0x28>)
  18880. 802830c: 4909 ldr r1, [pc, #36] ; (8028334 <SETTINGS_SetWebParamsDef+0x2c>)
  18881. 802830e: 4620 mov r0, r4
  18882. 8028310: f7f9 fd50 bl 8021db4 <strcpy>
  18883. strcpy(sSettings.sWebParams.gate, "192.168.1.1");
  18884. 8028314: 4908 ldr r1, [pc, #32] ; (8028338 <SETTINGS_SetWebParamsDef+0x30>)
  18885. 8028316: f104 0010 add.w r0, r4, #16
  18886. 802831a: f7f9 fd4b bl 8021db4 <strcpy>
  18887. strcpy(sSettings.sWebParams.mask, "255.255.255.0");
  18888. 802831e: f104 0020 add.w r0, r4, #32
  18889. 8028322: 4906 ldr r1, [pc, #24] ; (802833c <SETTINGS_SetWebParamsDef+0x34>)
  18890. 8028324: f7f9 fd46 bl 8021db4 <strcpy>
  18891. sSettings.sWebParams.dhcpEnable = 1;
  18892. 8028328: 2201 movs r2, #1
  18893. 802832a: f884 2030 strb.w r2, [r4, #48] ; 0x30
  18894. 802832e: bd10 pop {r4, pc}
  18895. 8028330: 2000e8e6 .word 0x2000e8e6
  18896. 8028334: 08035eb8 .word 0x08035eb8
  18897. 8028338: 08035ec4 .word 0x08035ec4
  18898. 802833c: 08035ed0 .word 0x08035ed0
  18899. 08028340 <SETTINGS_SetTempWebParamsDef>:
  18900. /**
  18901. * @brief Установить временные параметры сетевого подключения по умолчанию
  18902. */
  18903. void SETTINGS_SetTempWebParamsDef(void)
  18904. {
  18905. 8028340: b510 push {r4, lr}
  18906. strcpy(sSettings.sWebParams.ip, "192.168.1.2");
  18907. 8028342: 4c09 ldr r4, [pc, #36] ; (8028368 <SETTINGS_SetTempWebParamsDef+0x28>)
  18908. 8028344: 4909 ldr r1, [pc, #36] ; (802836c <SETTINGS_SetTempWebParamsDef+0x2c>)
  18909. 8028346: 4620 mov r0, r4
  18910. 8028348: f7f9 fd34 bl 8021db4 <strcpy>
  18911. strcpy(sSettings.sWebParams.gate, "192.168.1.1");
  18912. 802834c: 4908 ldr r1, [pc, #32] ; (8028370 <SETTINGS_SetTempWebParamsDef+0x30>)
  18913. 802834e: f104 0010 add.w r0, r4, #16
  18914. 8028352: f7f9 fd2f bl 8021db4 <strcpy>
  18915. strcpy(sSettings.sWebParams.mask, "255.255.255.0");
  18916. 8028356: f104 0020 add.w r0, r4, #32
  18917. 802835a: 4906 ldr r1, [pc, #24] ; (8028374 <SETTINGS_SetTempWebParamsDef+0x34>)
  18918. 802835c: f7f9 fd2a bl 8021db4 <strcpy>
  18919. sSettings.sWebParams.dhcpEnable = 1;
  18920. 8028360: 2201 movs r2, #1
  18921. 8028362: f884 2030 strb.w r2, [r4, #48] ; 0x30
  18922. 8028366: bd10 pop {r4, pc}
  18923. 8028368: 2000e8e6 .word 0x2000e8e6
  18924. 802836c: 08035eb8 .word 0x08035eb8
  18925. 8028370: 08035ec4 .word 0x08035ec4
  18926. 8028374: 08035ed0 .word 0x08035ed0
  18927. 08028378 <SETTINGS_SetSnmpDef>:
  18928. /**
  18929. * @brief Установить параметры SNMP по умолчанию
  18930. */
  18931. void SETTINGS_SetSnmpDef(void)
  18932. {
  18933. 8028378: b570 push {r4, r5, r6, lr}
  18934. strcpy(sSettings.sSnmp.sysDescr, "");
  18935. 802837a: 4c1e ldr r4, [pc, #120] ; (80283f4 <SETTINGS_SetSnmpDef+0x7c>)
  18936. 802837c: 4d1e ldr r5, [pc, #120] ; (80283f8 <SETTINGS_SetSnmpDef+0x80>)
  18937. strcpy(sSettings.sSnmp.readCommunity, "public");
  18938. 802837e: 4e1f ldr r6, [pc, #124] ; (80283fc <SETTINGS_SetSnmpDef+0x84>)
  18939. /**
  18940. * @brief Установить параметры SNMP по умолчанию
  18941. */
  18942. void SETTINGS_SetSnmpDef(void)
  18943. {
  18944. strcpy(sSettings.sSnmp.sysDescr, "");
  18945. 8028380: 4629 mov r1, r5
  18946. 8028382: 4620 mov r0, r4
  18947. 8028384: f7f9 fd16 bl 8021db4 <strcpy>
  18948. strcpy(sSettings.sSnmp.readCommunity, "public");
  18949. 8028388: 4631 mov r1, r6
  18950. 802838a: f104 00a0 add.w r0, r4, #160 ; 0xa0
  18951. 802838e: f7f9 fd11 bl 8021db4 <strcpy>
  18952. strcpy(sSettings.sSnmp.writeCommunity, "public");
  18953. 8028392: 4631 mov r1, r6
  18954. 8028394: f104 00b4 add.w r0, r4, #180 ; 0xb4
  18955. 8028398: f7f9 fd0c bl 8021db4 <strcpy>
  18956. strcpy(sSettings.sSnmp.sysContact, "");
  18957. 802839c: 4629 mov r1, r5
  18958. 802839e: f104 00c8 add.w r0, r4, #200 ; 0xc8
  18959. 80283a2: f7f9 fd07 bl 8021db4 <strcpy>
  18960. strcpy(sSettings.sSnmp.sysName, "BT-6701");
  18961. 80283a6: f104 00fa add.w r0, r4, #250 ; 0xfa
  18962. 80283aa: 4915 ldr r1, [pc, #84] ; (8028400 <SETTINGS_SetSnmpDef+0x88>)
  18963. 80283ac: f7f9 fd02 bl 8021db4 <strcpy>
  18964. strcpy(sSettings.sSnmp.sysLocation, "");
  18965. 80283b0: 4629 mov r1, r5
  18966. strcpy(sSettings.sSnmp.managerIP, "0.0.0.0");
  18967. 80283b2: 4d14 ldr r5, [pc, #80] ; (8028404 <SETTINGS_SetSnmpDef+0x8c>)
  18968. strcpy(sSettings.sSnmp.sysDescr, "");
  18969. strcpy(sSettings.sSnmp.readCommunity, "public");
  18970. strcpy(sSettings.sSnmp.writeCommunity, "public");
  18971. strcpy(sSettings.sSnmp.sysContact, "");
  18972. strcpy(sSettings.sSnmp.sysName, "BT-6701");
  18973. strcpy(sSettings.sSnmp.sysLocation, "");
  18974. 80283b4: f504 7087 add.w r0, r4, #270 ; 0x10e
  18975. 80283b8: f7f9 fcfc bl 8021db4 <strcpy>
  18976. strcpy(sSettings.sSnmp.managerIP, "0.0.0.0");
  18977. 80283bc: 4629 mov r1, r5
  18978. 80283be: f504 70be add.w r0, r4, #380 ; 0x17c
  18979. 80283c2: f7f9 fcf7 bl 8021db4 <strcpy>
  18980. strcpy(sSettings.sSnmp.managerIP2, "0.0.0.0");
  18981. 80283c6: 4629 mov r1, r5
  18982. 80283c8: f504 70c8 add.w r0, r4, #400 ; 0x190
  18983. 80283cc: f7f9 fcf2 bl 8021db4 <strcpy>
  18984. strcpy(sSettings.sSnmp.managerIP3, "0.0.0.0");
  18985. 80283d0: 4629 mov r1, r5
  18986. 80283d2: f504 70d2 add.w r0, r4, #420 ; 0x1a4
  18987. 80283d6: f7f9 fced bl 8021db4 <strcpy>
  18988. strcpy(sSettings.sSnmp.managerIP4, "0.0.0.0");
  18989. 80283da: 4629 mov r1, r5
  18990. 80283dc: f504 70dc add.w r0, r4, #440 ; 0x1b8
  18991. 80283e0: f7f9 fce8 bl 8021db4 <strcpy>
  18992. strcpy(sSettings.sSnmp.managerIP5, "0.0.0.0");
  18993. 80283e4: f504 70e6 add.w r0, r4, #460 ; 0x1cc
  18994. 80283e8: 4629 mov r1, r5
  18995. }
  18996. 80283ea: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  18997. strcpy(sSettings.sSnmp.sysLocation, "");
  18998. strcpy(sSettings.sSnmp.managerIP, "0.0.0.0");
  18999. strcpy(sSettings.sSnmp.managerIP2, "0.0.0.0");
  19000. strcpy(sSettings.sSnmp.managerIP3, "0.0.0.0");
  19001. strcpy(sSettings.sSnmp.managerIP4, "0.0.0.0");
  19002. strcpy(sSettings.sSnmp.managerIP5, "0.0.0.0");
  19003. 80283ee: f7f9 bce1 b.w 8021db4 <strcpy>
  19004. 80283f2: bf00 nop
  19005. 80283f4: 2000e948 .word 0x2000e948
  19006. 80283f8: 0803a119 .word 0x0803a119
  19007. 80283fc: 08035ede .word 0x08035ede
  19008. 8028400: 08035ee5 .word 0x08035ee5
  19009. 8028404: 08035eed .word 0x08035eed
  19010. 08028408 <SETTINGS_SetInfoDef>:
  19011. /**
  19012. * @brief Установить Информацию об устройстве по умолчанию
  19013. */
  19014. void SETTINGS_SetInfoDef(void)
  19015. {
  19016. 8028408: b510 push {r4, lr}
  19017. strcpy(sSettings.sInfo.productionData, "08.07.2016");
  19018. 802840a: 4c0b ldr r4, [pc, #44] ; (8028438 <SETTINGS_SetInfoDef+0x30>)
  19019. 802840c: 490b ldr r1, [pc, #44] ; (802843c <SETTINGS_SetInfoDef+0x34>)
  19020. 802840e: 4620 mov r0, r4
  19021. 8028410: f7f9 fcd0 bl 8021db4 <strcpy>
  19022. //strcpy(sSettings.sInfo.mac, "EC-4C-4D-00-90-01");
  19023. strcpy(sSettings.sInfo.mac, "EC-4C-4D-00-00-0A");
  19024. 8028414: f104 0028 add.w r0, r4, #40 ; 0x28
  19025. 8028418: 4909 ldr r1, [pc, #36] ; (8028440 <SETTINGS_SetInfoDef+0x38>)
  19026. 802841a: f7f9 fccb bl 8021db4 <strcpy>
  19027. strcpy(sSettings.sInfo.serialNumber, "KN-03-00001");
  19028. 802841e: f104 003a add.w r0, r4, #58 ; 0x3a
  19029. 8028422: 4908 ldr r1, [pc, #32] ; (8028444 <SETTINGS_SetInfoDef+0x3c>)
  19030. 8028424: f7f9 fcc6 bl 8021db4 <strcpy>
  19031. strcpy(sSettings.sInfo.comments, "");
  19032. 8028428: 4907 ldr r1, [pc, #28] ; (8028448 <SETTINGS_SetInfoDef+0x40>)
  19033. 802842a: f104 004a add.w r0, r4, #74 ; 0x4a
  19034. }
  19035. 802842e: e8bd 4010 ldmia.w sp!, {r4, lr}
  19036. {
  19037. strcpy(sSettings.sInfo.productionData, "08.07.2016");
  19038. //strcpy(sSettings.sInfo.mac, "EC-4C-4D-00-90-01");
  19039. strcpy(sSettings.sInfo.mac, "EC-4C-4D-00-00-0A");
  19040. strcpy(sSettings.sInfo.serialNumber, "KN-03-00001");
  19041. strcpy(sSettings.sInfo.comments, "");
  19042. 8028432: f7f9 bcbf b.w 8021db4 <strcpy>
  19043. 8028436: bf00 nop
  19044. 8028438: 2000eb28 .word 0x2000eb28
  19045. 802843c: 08035ef5 .word 0x08035ef5
  19046. 8028440: 08035f00 .word 0x08035f00
  19047. 8028444: 08035f12 .word 0x08035f12
  19048. 8028448: 0803a119 .word 0x0803a119
  19049. 0802844c <SETTINGS_SetServiceDef>:
  19050. /**
  19051. * @brief Установить значение сервисных настроек по умолчанию
  19052. */
  19053. void SETTINGS_SetServiceDef(void)
  19054. {
  19055. 802844c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  19056. 8028450: 4d13 ldr r5, [pc, #76] ; (80284a0 <SETTINGS_SetServiceDef+0x54>)
  19057. 8028452: 2400 movs r4, #0
  19058. }
  19059. /**
  19060. * @brief Установить значение сервисных настроек по умолчанию
  19061. */
  19062. void SETTINGS_SetServiceDef(void)
  19063. 8028454: 2717 movs r7, #23
  19064. strcpy(sSettings.sAuth[user_id].login, "admin");
  19065. strcpy(sSettings.sAuth[user_id].password, "12345");
  19066. break;
  19067. case 1:
  19068. default:
  19069. sSettings.sAuth[user_id].level = USER;
  19070. 8028456: f04f 0801 mov.w r8, #1
  19071. {
  19072. uint8_t user_id;
  19073. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  19074. switch (user_id) {
  19075. 802845a: f014 03ff ands.w r3, r4, #255 ; 0xff
  19076. 802845e: d108 bne.n 8028472 <SETTINGS_SetServiceDef+0x26>
  19077. /* First users in the system is always ADMIN.
  19078. * Others are USER */
  19079. case 0:
  19080. sSettings.sAuth[user_id].level = ADMIN;
  19081. strcpy(sSettings.sAuth[user_id].login, "admin");
  19082. 8028460: 4910 ldr r1, [pc, #64] ; (80284a4 <SETTINGS_SetServiceDef+0x58>)
  19083. 8028462: 4811 ldr r0, [pc, #68] ; (80284a8 <SETTINGS_SetServiceDef+0x5c>)
  19084. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  19085. switch (user_id) {
  19086. /* First users in the system is always ADMIN.
  19087. * Others are USER */
  19088. case 0:
  19089. sSettings.sAuth[user_id].level = ADMIN;
  19090. 8028464: f885 3314 strb.w r3, [r5, #788] ; 0x314
  19091. strcpy(sSettings.sAuth[user_id].login, "admin");
  19092. 8028468: f7f9 fca4 bl 8021db4 <strcpy>
  19093. strcpy(sSettings.sAuth[user_id].password, "12345");
  19094. 802846c: 480f ldr r0, [pc, #60] ; (80284ac <SETTINGS_SetServiceDef+0x60>)
  19095. 802846e: 4910 ldr r1, [pc, #64] ; (80284b0 <SETTINGS_SetServiceDef+0x64>)
  19096. 8028470: e00f b.n 8028492 <SETTINGS_SetServiceDef+0x46>
  19097. }
  19098. /**
  19099. * @brief Установить значение сервисных настроек по умолчанию
  19100. */
  19101. void SETTINGS_SetServiceDef(void)
  19102. 8028472: fb07 f604 mul.w r6, r7, r4
  19103. 8028476: 19ab adds r3, r5, r6
  19104. strcpy(sSettings.sAuth[user_id].password, "12345");
  19105. break;
  19106. case 1:
  19107. default:
  19108. sSettings.sAuth[user_id].level = USER;
  19109. strcpy(sSettings.sAuth[user_id].login, "user");
  19110. 8028478: f506 7044 add.w r0, r6, #784 ; 0x310
  19111. 802847c: 1828 adds r0, r5, r0
  19112. 802847e: 490d ldr r1, [pc, #52] ; (80284b4 <SETTINGS_SetServiceDef+0x68>)
  19113. strcpy(sSettings.sAuth[user_id].login, "admin");
  19114. strcpy(sSettings.sAuth[user_id].password, "12345");
  19115. break;
  19116. case 1:
  19117. default:
  19118. sSettings.sAuth[user_id].level = USER;
  19119. 8028480: f883 8314 strb.w r8, [r3, #788] ; 0x314
  19120. strcpy(sSettings.sAuth[user_id].login, "user");
  19121. 8028484: 3005 adds r0, #5
  19122. 8028486: f7f9 fc95 bl 8021db4 <strcpy>
  19123. strcpy(sSettings.sAuth[user_id].password, "1234");
  19124. 802848a: 19a8 adds r0, r5, r6
  19125. 802848c: 490a ldr r1, [pc, #40] ; (80284b8 <SETTINGS_SetServiceDef+0x6c>)
  19126. 802848e: f500 7048 add.w r0, r0, #800 ; 0x320
  19127. 8028492: 3401 adds r4, #1
  19128. 8028494: f7f9 fc8e bl 8021db4 <strcpy>
  19129. void SETTINGS_SetServiceDef(void)
  19130. {
  19131. uint8_t user_id;
  19132. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  19133. 8028498: 2c02 cmp r4, #2
  19134. 802849a: d1de bne.n 802845a <SETTINGS_SetServiceDef+0xe>
  19135. strcpy(sSettings.sAuth[user_id].login, "user");
  19136. strcpy(sSettings.sAuth[user_id].password, "1234");
  19137. break;
  19138. }
  19139. }
  19140. }
  19141. 802849c: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  19142. 80284a0: 2000e8e4 .word 0x2000e8e4
  19143. 80284a4: 08035f1e .word 0x08035f1e
  19144. 80284a8: 2000ebf9 .word 0x2000ebf9
  19145. 80284ac: 2000ec04 .word 0x2000ec04
  19146. 80284b0: 08035f24 .word 0x08035f24
  19147. 80284b4: 08035f2a .word 0x08035f2a
  19148. 80284b8: 08035f2f .word 0x08035f2f
  19149. 080284bc <SETTINGS_SetSntpDef>:
  19150. /**
  19151. * @brief Установить параметры SNTP по умолчанию
  19152. */
  19153. void SETTINGS_SetSntpDef(void)
  19154. {
  19155. 80284bc: b510 push {r4, lr}
  19156. sSettings.sSNTP.sntpEnable = true;
  19157. 80284be: 4c08 ldr r4, [pc, #32] ; (80284e0 <SETTINGS_SetSntpDef+0x24>)
  19158. strcpy(sSettings.sSNTP.ip, "88.147.254.235");
  19159. 80284c0: 4908 ldr r1, [pc, #32] ; (80284e4 <SETTINGS_SetSntpDef+0x28>)
  19160. 80284c2: 4809 ldr r0, [pc, #36] ; (80284e8 <SETTINGS_SetSntpDef+0x2c>)
  19161. /**
  19162. * @brief Установить параметры SNTP по умолчанию
  19163. */
  19164. void SETTINGS_SetSntpDef(void)
  19165. {
  19166. sSettings.sSNTP.sntpEnable = true;
  19167. 80284c4: 2301 movs r3, #1
  19168. 80284c6: f884 3344 strb.w r3, [r4, #836] ; 0x344
  19169. strcpy(sSettings.sSNTP.ip, "88.147.254.235");
  19170. 80284ca: f7f9 fc73 bl 8021db4 <strcpy>
  19171. sSettings.sSNTP.timeZone = 3.0;
  19172. 80284ce: 4b07 ldr r3, [pc, #28] ; (80284ec <SETTINGS_SetSntpDef+0x30>)
  19173. strcpy(sSettings.sSNTP.data, "none");
  19174. 80284d0: 4807 ldr r0, [pc, #28] ; (80284f0 <SETTINGS_SetSntpDef+0x34>)
  19175. 80284d2: 4908 ldr r1, [pc, #32] ; (80284f4 <SETTINGS_SetSntpDef+0x38>)
  19176. */
  19177. void SETTINGS_SetSntpDef(void)
  19178. {
  19179. sSettings.sSNTP.sntpEnable = true;
  19180. strcpy(sSettings.sSNTP.ip, "88.147.254.235");
  19181. sSettings.sSNTP.timeZone = 3.0;
  19182. 80284d4: f8c4 3374 str.w r3, [r4, #884] ; 0x374
  19183. strcpy(sSettings.sSNTP.data, "none");
  19184. }
  19185. 80284d8: e8bd 4010 ldmia.w sp!, {r4, lr}
  19186. void SETTINGS_SetSntpDef(void)
  19187. {
  19188. sSettings.sSNTP.sntpEnable = true;
  19189. strcpy(sSettings.sSNTP.ip, "88.147.254.235");
  19190. sSettings.sSNTP.timeZone = 3.0;
  19191. strcpy(sSettings.sSNTP.data, "none");
  19192. 80284dc: f7f9 bc6a b.w 8021db4 <strcpy>
  19193. 80284e0: 2000e8e4 .word 0x2000e8e4
  19194. 80284e4: 08035f34 .word 0x08035f34
  19195. 80284e8: 2000ec29 .word 0x2000ec29
  19196. 80284ec: 40400000 .word 0x40400000
  19197. 80284f0: 2000ec39 .word 0x2000ec39
  19198. 80284f4: 08035f43 .word 0x08035f43
  19199. 080284f8 <SETTINGS_SetINOUTSDef>:
  19200. /**
  19201. * @brief Установить параметры настроек сухих контактов / реле по умолчанию
  19202. */
  19203. void SETTINGS_SetINOUTSDef(void)
  19204. {
  19205. sSettings.sInOuts.ro_type_source[0] = CRITICAL;
  19206. 80284f8: 4b05 ldr r3, [pc, #20] ; (8028510 <SETTINGS_SetINOUTSDef+0x18>)
  19207. 80284fa: 2201 movs r2, #1
  19208. 80284fc: f883 2378 strb.w r2, [r3, #888] ; 0x378
  19209. sSettings.sInOuts.ro_type_source[1] = SNMP_SET;
  19210. 8028500: 2203 movs r2, #3
  19211. 8028502: f883 2379 strb.w r2, [r3, #889] ; 0x379
  19212. sSettings.sInOuts.din_type_act[0] = SNMP_TRAP;
  19213. 8028506: 2202 movs r2, #2
  19214. 8028508: f883 237a strb.w r2, [r3, #890] ; 0x37a
  19215. 802850c: 4770 bx lr
  19216. 802850e: bf00 nop
  19217. 8028510: 2000e8e4 .word 0x2000e8e4
  19218. 08028514 <SETTINGS_SetRADIUSDef>:
  19219. /**
  19220. * @brief Установить параметры RADIUS по умолчанию
  19221. */
  19222. void SETTINGS_SetRADIUSDef(void)
  19223. {
  19224. 8028514: b510 push {r4, lr}
  19225. sSettings.sRADIUS.RDSEnable = true;
  19226. 8028516: 4c0b ldr r4, [pc, #44] ; (8028544 <SETTINGS_SetRADIUSDef+0x30>)
  19227. strcpy(sSettings.sRADIUS.ServerIP, "127.0.0.1");
  19228. 8028518: 490b ldr r1, [pc, #44] ; (8028548 <SETTINGS_SetRADIUSDef+0x34>)
  19229. /**
  19230. * @brief Установить параметры RADIUS по умолчанию
  19231. */
  19232. void SETTINGS_SetRADIUSDef(void)
  19233. {
  19234. sSettings.sRADIUS.RDSEnable = true;
  19235. 802851a: 2301 movs r3, #1
  19236. strcpy(sSettings.sRADIUS.ServerIP, "127.0.0.1");
  19237. 802851c: f504 705f add.w r0, r4, #892 ; 0x37c
  19238. /**
  19239. * @brief Установить параметры RADIUS по умолчанию
  19240. */
  19241. void SETTINGS_SetRADIUSDef(void)
  19242. {
  19243. sSettings.sRADIUS.RDSEnable = true;
  19244. 8028520: f884 339d strb.w r3, [r4, #925] ; 0x39d
  19245. strcpy(sSettings.sRADIUS.ServerIP, "127.0.0.1");
  19246. 8028524: f7f9 fc46 bl 8021db4 <strcpy>
  19247. sSettings.sRADIUS.port = 1227;
  19248. 8028528: f240 43cb movw r3, #1227 ; 0x4cb
  19249. sSettings.sRADIUS.key_access = 123;
  19250. strcpy(sSettings.sRADIUS.rds_password, "12345");
  19251. 802852c: 4907 ldr r1, [pc, #28] ; (802854c <SETTINGS_SetRADIUSDef+0x38>)
  19252. */
  19253. void SETTINGS_SetRADIUSDef(void)
  19254. {
  19255. sSettings.sRADIUS.RDSEnable = true;
  19256. strcpy(sSettings.sRADIUS.ServerIP, "127.0.0.1");
  19257. sSettings.sRADIUS.port = 1227;
  19258. 802852e: f8c4 33a0 str.w r3, [r4, #928] ; 0x3a0
  19259. sSettings.sRADIUS.key_access = 123;
  19260. strcpy(sSettings.sRADIUS.rds_password, "12345");
  19261. 8028532: f504 7063 add.w r0, r4, #908 ; 0x38c
  19262. void SETTINGS_SetRADIUSDef(void)
  19263. {
  19264. sSettings.sRADIUS.RDSEnable = true;
  19265. strcpy(sSettings.sRADIUS.ServerIP, "127.0.0.1");
  19266. sSettings.sRADIUS.port = 1227;
  19267. sSettings.sRADIUS.key_access = 123;
  19268. 8028536: 237b movs r3, #123 ; 0x7b
  19269. 8028538: f8c4 33a4 str.w r3, [r4, #932] ; 0x3a4
  19270. strcpy(sSettings.sRADIUS.rds_password, "12345");
  19271. }
  19272. 802853c: e8bd 4010 ldmia.w sp!, {r4, lr}
  19273. {
  19274. sSettings.sRADIUS.RDSEnable = true;
  19275. strcpy(sSettings.sRADIUS.ServerIP, "127.0.0.1");
  19276. sSettings.sRADIUS.port = 1227;
  19277. sSettings.sRADIUS.key_access = 123;
  19278. strcpy(sSettings.sRADIUS.rds_password, "12345");
  19279. 8028540: f7f9 bc38 b.w 8021db4 <strcpy>
  19280. 8028544: 2000e8e4 .word 0x2000e8e4
  19281. 8028548: 08035f48 .word 0x08035f48
  19282. 802854c: 08035f24 .word 0x08035f24
  19283. 08028550 <SETTINGS_ReadFromFlash>:
  19284. */
  19285. void SETTINGS_ReadFromFlash(uint8_t *data, uint32_t size)
  19286. {
  19287. uint32_t baseAddress = SETTINGS_SECTOR;
  19288. for (uint32_t i = 0; i < size; i++)
  19289. 8028550: 2300 movs r3, #0
  19290. 8028552: e006 b.n 8028562 <SETTINGS_ReadFromFlash+0x12>
  19291. *data++ = (*(uint32_t*)baseAddress++);;
  19292. 8028554: f103 6200 add.w r2, r3, #134217728 ; 0x8000000
  19293. 8028558: f502 4280 add.w r2, r2, #16384 ; 0x4000
  19294. 802855c: 6812 ldr r2, [r2, #0]
  19295. 802855e: 54c2 strb r2, [r0, r3]
  19296. */
  19297. void SETTINGS_ReadFromFlash(uint8_t *data, uint32_t size)
  19298. {
  19299. uint32_t baseAddress = SETTINGS_SECTOR;
  19300. for (uint32_t i = 0; i < size; i++)
  19301. 8028560: 3301 adds r3, #1
  19302. 8028562: 428b cmp r3, r1
  19303. 8028564: d1f6 bne.n 8028554 <SETTINGS_ReadFromFlash+0x4>
  19304. *data++ = (*(uint32_t*)baseAddress++);;
  19305. }
  19306. 8028566: 4770 bx lr
  19307. 08028568 <SETTINGS_EraseFlashSector>:
  19308. */
  19309. void SETTINGS_EraseFlashSector(void)
  19310. {
  19311. FLASH_Status status;
  19312. if ((status = FLASH_EraseSector(FLASH_Sector_1, VoltageRange_3)) != FLASH_COMPLETE) {
  19313. 8028568: 2008 movs r0, #8
  19314. 802856a: 2102 movs r1, #2
  19315. 802856c: f7fc bf6c b.w 8025448 <FLASH_EraseSector>
  19316. 08028570 <SETTINGS_GetCRC>:
  19317. /**
  19318. * @brief
  19319. * @retval
  19320. */
  19321. uint32_t SETTINGS_GetCRC(void)
  19322. {
  19323. 8028570: b508 push {r3, lr}
  19324. CRC_ResetDR();
  19325. 8028572: f7fc fed3 bl 802531c <CRC_ResetDR>
  19326. return CRC_CalcBlockCRC((uint32_t*)&sSettings, sizeof(sSettings)/4);
  19327. 8028576: 4803 ldr r0, [pc, #12] ; (8028584 <SETTINGS_GetCRC+0x14>)
  19328. 8028578: 21ea movs r1, #234 ; 0xea
  19329. }
  19330. 802857a: e8bd 4008 ldmia.w sp!, {r3, lr}
  19331. * @retval
  19332. */
  19333. uint32_t SETTINGS_GetCRC(void)
  19334. {
  19335. CRC_ResetDR();
  19336. return CRC_CalcBlockCRC((uint32_t*)&sSettings, sizeof(sSettings)/4);
  19337. 802857e: f7fc bed3 b.w 8025328 <CRC_CalcBlockCRC>
  19338. 8028582: bf00 nop
  19339. 8028584: 2000e8e4 .word 0x2000e8e4
  19340. 08028588 <SETTINGS_WriteToFlash>:
  19341. /**
  19342. * @brief
  19343. */
  19344. void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
  19345. {
  19346. 8028588: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  19347. 802858c: 4606 mov r6, r0
  19348. 802858e: 468a mov sl, r1
  19349. uint32_t baseAddress = SETTINGS_SECTOR;
  19350. uint32_t checkCrc = 0;
  19351. uint32_t crc = SETTINGS_GetCRC();
  19352. 8028590: f7ff ffee bl 8028570 <SETTINGS_GetCRC>
  19353. /**
  19354. * @brief
  19355. */
  19356. void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
  19357. {
  19358. uint32_t baseAddress = SETTINGS_SECTOR;
  19359. 8028594: 4c17 ldr r4, [pc, #92] ; (80285f4 <SETTINGS_WriteToFlash+0x6c>)
  19360. uint32_t checkCrc = 0;
  19361. uint32_t crc = SETTINGS_GetCRC();
  19362. 8028596: 4680 mov r8, r0
  19363. 8028598: 2703 movs r7, #3
  19364. FLASH_Status status;
  19365. for (uint8_t i = 0; i < 3; i++)
  19366. {
  19367. fAlarm = 0;
  19368. FLASH_Unlock();
  19369. 802859a: f7fc fed5 bl 8025348 <FLASH_Unlock>
  19370. 802859e: 4635 mov r5, r6
  19371. SETTINGS_EraseFlashSector();
  19372. 80285a0: f7ff ffe2 bl 8028568 <SETTINGS_EraseFlashSector>
  19373. }
  19374. /**
  19375. * @brief
  19376. */
  19377. void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
  19378. 80285a4: eb04 0b0a add.w fp, r4, sl
  19379. fAlarm = 0;
  19380. FLASH_Unlock();
  19381. SETTINGS_EraseFlashSector();
  19382. for (uint32_t i = 0; i < size; i++)
  19383. 80285a8: e00a b.n 80285c0 <SETTINGS_WriteToFlash+0x38>
  19384. if ((status = FLASH_ProgramByte(baseAddress++, *data++)) != FLASH_COMPLETE) {
  19385. 80285aa: f815 1b01 ldrb.w r1, [r5], #1
  19386. 80285ae: 4620 mov r0, r4
  19387. 80285b0: f7fc ff10 bl 80253d4 <FLASH_ProgramByte>
  19388. 80285b4: f104 0901 add.w r9, r4, #1
  19389. 80285b8: 2808 cmp r0, #8
  19390. 80285ba: 462e mov r6, r5
  19391. 80285bc: 464c mov r4, r9
  19392. 80285be: d102 bne.n 80285c6 <SETTINGS_WriteToFlash+0x3e>
  19393. fAlarm = 0;
  19394. FLASH_Unlock();
  19395. SETTINGS_EraseFlashSector();
  19396. for (uint32_t i = 0; i < size; i++)
  19397. 80285c0: 455c cmp r4, fp
  19398. 80285c2: 462e mov r6, r5
  19399. 80285c4: d1f1 bne.n 80285aa <SETTINGS_WriteToFlash+0x22>
  19400. if ((status = FLASH_ProgramByte(baseAddress++, *data++)) != FLASH_COMPLETE) {
  19401. DBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
  19402. break;
  19403. }
  19404. if ((status = FLASH_ProgramWord((uint32_t)CRC_ADDRESS, crc)) != FLASH_COMPLETE) {
  19405. 80285c6: 4641 mov r1, r8
  19406. 80285c8: 480b ldr r0, [pc, #44] ; (80285f8 <SETTINGS_WriteToFlash+0x70>)
  19407. 80285ca: f7fc ff1f bl 802540c <FLASH_ProgramWord>
  19408. DBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
  19409. }
  19410. FLASH_Lock();
  19411. 80285ce: f7fc fec9 bl 8025364 <FLASH_Lock>
  19412. /* Считываем что записали */
  19413. SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
  19414. 80285d2: 480a ldr r0, [pc, #40] ; (80285fc <SETTINGS_WriteToFlash+0x74>)
  19415. 80285d4: f44f 716a mov.w r1, #936 ; 0x3a8
  19416. 80285d8: f7ff ffba bl 8028550 <SETTINGS_ReadFromFlash>
  19417. checkCrc = SETTINGS_GetCRC();
  19418. 80285dc: f7ff ffc8 bl 8028570 <SETTINGS_GetCRC>
  19419. /* Проверяем CRC того что было записано */
  19420. if (checkCrc == crc)
  19421. 80285e0: 4540 cmp r0, r8
  19422. 80285e2: d004 beq.n 80285ee <SETTINGS_WriteToFlash+0x66>
  19423. 80285e4: 3f01 subs r7, #1
  19424. uint32_t checkCrc = 0;
  19425. uint32_t crc = SETTINGS_GetCRC();
  19426. bool fAlarm = 0;
  19427. FLASH_Status status;
  19428. for (uint8_t i = 0; i < 3; i++)
  19429. 80285e6: f017 07ff ands.w r7, r7, #255 ; 0xff
  19430. 80285ea: d1d6 bne.n 802859a <SETTINGS_WriteToFlash+0x12>
  19431. 80285ec: e7fe b.n 80285ec <SETTINGS_WriteToFlash+0x64>
  19432. 80285ee: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  19433. 80285f2: bf00 nop
  19434. 80285f4: 08004000 .word 0x08004000
  19435. 80285f8: 08007f9c .word 0x08007f9c
  19436. 80285fc: 2000e8e4 .word 0x2000e8e4
  19437. 08028600 <SETTINGS_GetCritSecCRC>:
  19438. /**
  19439. * @brief
  19440. * @retval
  19441. */
  19442. uint32_t SETTINGS_GetCritSecCRC(void)
  19443. {
  19444. 8028600: b508 push {r3, lr}
  19445. CRC_ResetDR();
  19446. 8028602: f7fc fe8b bl 802531c <CRC_ResetDR>
  19447. uint32_t critsec_len = (uint32_t)((uint8_t *)(&sSettings.CritSecCRC) - (uint8_t *)&sSettings) / 4;
  19448. return CRC_CalcBlockCRC((uint32_t *)&sSettings, critsec_len);
  19449. 8028606: 4803 ldr r0, [pc, #12] ; (8028614 <SETTINGS_GetCritSecCRC+0x14>)
  19450. 8028608: 21c4 movs r1, #196 ; 0xc4
  19451. }
  19452. 802860a: e8bd 4008 ldmia.w sp!, {r3, lr}
  19453. */
  19454. uint32_t SETTINGS_GetCritSecCRC(void)
  19455. {
  19456. CRC_ResetDR();
  19457. uint32_t critsec_len = (uint32_t)((uint8_t *)(&sSettings.CritSecCRC) - (uint8_t *)&sSettings) / 4;
  19458. return CRC_CalcBlockCRC((uint32_t *)&sSettings, critsec_len);
  19459. 802860e: f7fc be8b b.w 8025328 <CRC_CalcBlockCRC>
  19460. 8028612: bf00 nop
  19461. 8028614: 2000e8e4 .word 0x2000e8e4
  19462. 08028618 <SETTINGS_Save>:
  19463. /**
  19464. * @brief Запись структуры настроек во flesh
  19465. */
  19466. void SETTINGS_Save(void)
  19467. {
  19468. 8028618: b508 push {r3, lr}
  19469. /* Calc critical section CRC and store to the settings structure */
  19470. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  19471. 802861a: f7ff fff1 bl 8028600 <SETTINGS_GetCritSecCRC>
  19472. 802861e: 4b05 ldr r3, [pc, #20] ; (8028634 <SETTINGS_Save+0x1c>)
  19473. SETTINGS_WriteToFlash((uint8_t*)&sSettings, sizeof(sSettings));
  19474. 8028620: f44f 716a mov.w r1, #936 ; 0x3a8
  19475. * @brief Запись структуры настроек во flesh
  19476. */
  19477. void SETTINGS_Save(void)
  19478. {
  19479. /* Calc critical section CRC and store to the settings structure */
  19480. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  19481. 8028624: f8c3 0310 str.w r0, [r3, #784] ; 0x310
  19482. SETTINGS_WriteToFlash((uint8_t*)&sSettings, sizeof(sSettings));
  19483. 8028628: 4618 mov r0, r3
  19484. }
  19485. 802862a: e8bd 4008 ldmia.w sp!, {r3, lr}
  19486. void SETTINGS_Save(void)
  19487. {
  19488. /* Calc critical section CRC and store to the settings structure */
  19489. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  19490. SETTINGS_WriteToFlash((uint8_t*)&sSettings, sizeof(sSettings));
  19491. 802862e: f7ff bfab b.w 8028588 <SETTINGS_WriteToFlash>
  19492. 8028632: bf00 nop
  19493. 8028634: 2000e8e4 .word 0x2000e8e4
  19494. 08028638 <SETTINGS_SetDefaultDebug>:
  19495. /**
  19496. * @brief Установка настроек для отладки
  19497. */
  19498. void SETTINGS_SetDefaultDebug(void)
  19499. {
  19500. 8028638: b510 push {r4, lr}
  19501. /**
  19502. * @brief Установить флаги по умолчанию
  19503. */
  19504. void SETTINGS_SetFlagsDef(void)
  19505. {
  19506. sSettings.sFlags.netsettingsChanged = false;
  19507. 802863a: 4c0c ldr r4, [pc, #48] ; (802866c <SETTINGS_SetDefaultDebug+0x34>)
  19508. /**
  19509. * @brief Установка настроек для отладки
  19510. */
  19511. void SETTINGS_SetDefaultDebug(void)
  19512. {
  19513. SETTINGS_SetWebParamsDef();
  19514. 802863c: f7ff fe64 bl 8028308 <SETTINGS_SetWebParamsDef>
  19515. SETTINGS_SetTempWebParamsDef();
  19516. 8028640: f7ff fe7e bl 8028340 <SETTINGS_SetTempWebParamsDef>
  19517. SETTINGS_SetSnmpDef();
  19518. 8028644: f7ff fe98 bl 8028378 <SETTINGS_SetSnmpDef>
  19519. SETTINGS_SetBootParamsDef();
  19520. 8028648: f7ff fe56 bl 80282f8 <SETTINGS_SetBootParamsDef>
  19521. /**
  19522. * @brief Установить флаги по умолчанию
  19523. */
  19524. void SETTINGS_SetFlagsDef(void)
  19525. {
  19526. sSettings.sFlags.netsettingsChanged = false;
  19527. 802864c: 2300 movs r3, #0
  19528. 802864e: f884 32fc strb.w r3, [r4, #764] ; 0x2fc
  19529. SETTINGS_SetWebParamsDef();
  19530. SETTINGS_SetTempWebParamsDef();
  19531. SETTINGS_SetSnmpDef();
  19532. SETTINGS_SetBootParamsDef();
  19533. SETTINGS_SetFlagsDef();
  19534. SETTINGS_SetServiceDef();
  19535. 8028652: f7ff fefb bl 802844c <SETTINGS_SetServiceDef>
  19536. SETTINGS_SetSntpDef();
  19537. 8028656: f7ff ff31 bl 80284bc <SETTINGS_SetSntpDef>
  19538. SETTINGS_SetINOUTSDef();
  19539. 802865a: f7ff ff4d bl 80284f8 <SETTINGS_SetINOUTSDef>
  19540. SETTINGS_SetRADIUSDef();
  19541. 802865e: f7ff ff59 bl 8028514 <SETTINGS_SetRADIUSDef>
  19542. //SETTINGS_SetInfoDef();
  19543. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  19544. 8028662: f7ff ffcd bl 8028600 <SETTINGS_GetCritSecCRC>
  19545. 8028666: f8c4 0310 str.w r0, [r4, #784] ; 0x310
  19546. 802866a: bd10 pop {r4, pc}
  19547. 802866c: 2000e8e4 .word 0x2000e8e4
  19548. 08028670 <SETTINGS_SetAllDefault>:
  19549. /**
  19550. * @brief Сброс всех настроек в значения по умолчанию
  19551. */
  19552. void SETTINGS_SetAllDefault(void)
  19553. {
  19554. 8028670: b510 push {r4, lr}
  19555. /**
  19556. * @brief Установить флаги по умолчанию
  19557. */
  19558. void SETTINGS_SetFlagsDef(void)
  19559. {
  19560. sSettings.sFlags.netsettingsChanged = false;
  19561. 8028672: 4c0d ldr r4, [pc, #52] ; (80286a8 <SETTINGS_SetAllDefault+0x38>)
  19562. /**
  19563. * @brief Сброс всех настроек в значения по умолчанию
  19564. */
  19565. void SETTINGS_SetAllDefault(void)
  19566. {
  19567. SETTINGS_SetBootParamsDef();
  19568. 8028674: f7ff fe40 bl 80282f8 <SETTINGS_SetBootParamsDef>
  19569. SETTINGS_SetWebParamsDef();
  19570. 8028678: f7ff fe46 bl 8028308 <SETTINGS_SetWebParamsDef>
  19571. SETTINGS_SetTempWebParamsDef();
  19572. 802867c: f7ff fe60 bl 8028340 <SETTINGS_SetTempWebParamsDef>
  19573. SETTINGS_SetSnmpDef();
  19574. 8028680: f7ff fe7a bl 8028378 <SETTINGS_SetSnmpDef>
  19575. SETTINGS_SetInfoDef();
  19576. 8028684: f7ff fec0 bl 8028408 <SETTINGS_SetInfoDef>
  19577. /**
  19578. * @brief Установить флаги по умолчанию
  19579. */
  19580. void SETTINGS_SetFlagsDef(void)
  19581. {
  19582. sSettings.sFlags.netsettingsChanged = false;
  19583. 8028688: 2300 movs r3, #0
  19584. 802868a: f884 32fc strb.w r3, [r4, #764] ; 0x2fc
  19585. SETTINGS_SetWebParamsDef();
  19586. SETTINGS_SetTempWebParamsDef();
  19587. SETTINGS_SetSnmpDef();
  19588. SETTINGS_SetInfoDef();
  19589. SETTINGS_SetFlagsDef();
  19590. SETTINGS_SetServiceDef();
  19591. 802868e: f7ff fedd bl 802844c <SETTINGS_SetServiceDef>
  19592. SETTINGS_SetSntpDef();
  19593. 8028692: f7ff ff13 bl 80284bc <SETTINGS_SetSntpDef>
  19594. SETTINGS_SetINOUTSDef();
  19595. 8028696: f7ff ff2f bl 80284f8 <SETTINGS_SetINOUTSDef>
  19596. SETTINGS_SetRADIUSDef();
  19597. 802869a: f7ff ff3b bl 8028514 <SETTINGS_SetRADIUSDef>
  19598. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  19599. 802869e: f7ff ffaf bl 8028600 <SETTINGS_GetCritSecCRC>
  19600. 80286a2: f8c4 0310 str.w r0, [r4, #784] ; 0x310
  19601. 80286a6: bd10 pop {r4, pc}
  19602. 80286a8: 2000e8e4 .word 0x2000e8e4
  19603. 080286ac <SETTINGS_Load>:
  19604. /**
  19605. * @brief Загрузка структуры настроек из flesh
  19606. */
  19607. void SETTINGS_Load(void)
  19608. {
  19609. 80286ac: b510 push {r4, lr}
  19610. SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
  19611. 80286ae: 4c09 ldr r4, [pc, #36] ; (80286d4 <SETTINGS_Load+0x28>)
  19612. 80286b0: f44f 716a mov.w r1, #936 ; 0x3a8
  19613. 80286b4: 4620 mov r0, r4
  19614. 80286b6: f7ff ff4b bl 8028550 <SETTINGS_ReadFromFlash>
  19615. /* Проверка CRC критической секции сектора настроек.
  19616. * Если CRC не совпадает, скорее всего настройки отсутствуют,
  19617. * прошиваем значения по умолчанию */
  19618. uint32_t crc = SETTINGS_GetCritSecCRC();
  19619. 80286ba: f7ff ffa1 bl 8028600 <SETTINGS_GetCritSecCRC>
  19620. if (sSettings.CritSecCRC != crc) {
  19621. 80286be: f8d4 3310 ldr.w r3, [r4, #784] ; 0x310
  19622. 80286c2: 4283 cmp r3, r0
  19623. 80286c4: d005 beq.n 80286d2 <SETTINGS_Load+0x26>
  19624. SETTINGS_SetAllDefault();
  19625. 80286c6: f7ff ffd3 bl 8028670 <SETTINGS_SetAllDefault>
  19626. SETTINGS_Save();
  19627. }
  19628. }
  19629. 80286ca: e8bd 4010 ldmia.w sp!, {r4, lr}
  19630. * прошиваем значения по умолчанию */
  19631. uint32_t crc = SETTINGS_GetCritSecCRC();
  19632. if (sSettings.CritSecCRC != crc) {
  19633. SETTINGS_SetAllDefault();
  19634. SETTINGS_Save();
  19635. 80286ce: f7ff bfa3 b.w 8028618 <SETTINGS_Save>
  19636. 80286d2: bd10 pop {r4, pc}
  19637. 80286d4: 2000e8e4 .word 0x2000e8e4
  19638. 080286d8 <SETTINGS_SetPartDefault>:
  19639. /**
  19640. * @brief Сброс всех настроек в значения по умолчанию кроме сетевых настроек
  19641. */
  19642. void SETTINGS_SetPartDefault(void)
  19643. {
  19644. 80286d8: b510 push {r4, lr}
  19645. /**
  19646. * @brief Установить флаги по умолчанию
  19647. */
  19648. void SETTINGS_SetFlagsDef(void)
  19649. {
  19650. sSettings.sFlags.netsettingsChanged = false;
  19651. 80286da: 4c0a ldr r4, [pc, #40] ; (8028704 <SETTINGS_SetPartDefault+0x2c>)
  19652. /**
  19653. * @brief Сброс всех настроек в значения по умолчанию кроме сетевых настроек
  19654. */
  19655. void SETTINGS_SetPartDefault(void)
  19656. {
  19657. SETTINGS_SetBootParamsDef();
  19658. 80286dc: f7ff fe0c bl 80282f8 <SETTINGS_SetBootParamsDef>
  19659. SETTINGS_SetSnmpDef();
  19660. 80286e0: f7ff fe4a bl 8028378 <SETTINGS_SetSnmpDef>
  19661. /**
  19662. * @brief Установить флаги по умолчанию
  19663. */
  19664. void SETTINGS_SetFlagsDef(void)
  19665. {
  19666. sSettings.sFlags.netsettingsChanged = false;
  19667. 80286e4: 2300 movs r3, #0
  19668. 80286e6: f884 32fc strb.w r3, [r4, #764] ; 0x2fc
  19669. void SETTINGS_SetPartDefault(void)
  19670. {
  19671. SETTINGS_SetBootParamsDef();
  19672. SETTINGS_SetSnmpDef();
  19673. SETTINGS_SetFlagsDef();
  19674. SETTINGS_SetServiceDef();
  19675. 80286ea: f7ff feaf bl 802844c <SETTINGS_SetServiceDef>
  19676. SETTINGS_SetSntpDef();
  19677. 80286ee: f7ff fee5 bl 80284bc <SETTINGS_SetSntpDef>
  19678. SETTINGS_SetINOUTSDef();
  19679. 80286f2: f7ff ff01 bl 80284f8 <SETTINGS_SetINOUTSDef>
  19680. SETTINGS_SetRADIUSDef();
  19681. 80286f6: f7ff ff0d bl 8028514 <SETTINGS_SetRADIUSDef>
  19682. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  19683. 80286fa: f7ff ff81 bl 8028600 <SETTINGS_GetCritSecCRC>
  19684. 80286fe: f8c4 0310 str.w r0, [r4, #784] ; 0x310
  19685. 8028702: bd10 pop {r4, pc}
  19686. 8028704: 2000e8e4 .word 0x2000e8e4
  19687. 08028708 <SETTINGS_GetMac>:
  19688. /**
  19689. * @brief Преобразует mac адрес строкового формата в массив uint8_t
  19690. * @param mac - буфер для вывода mac адреса
  19691. */
  19692. void SETTINGS_GetMac(uint8_t *mac)
  19693. {
  19694. 8028708: b573 push {r0, r1, r4, r5, r6, lr}
  19695. char dummy[2];
  19696. char *macPtr = sSettings.sInfo.mac;
  19697. for (uint8_t i = 0; i < 6; i++)
  19698. {
  19699. strncpy(dummy, macPtr+i*3, 2);
  19700. 802870a: 4e0a ldr r6, [pc, #40] ; (8028734 <SETTINGS_GetMac+0x2c>)
  19701. /**
  19702. * @brief Преобразует mac адрес строкового формата в массив uint8_t
  19703. * @param mac - буфер для вывода mac адреса
  19704. */
  19705. void SETTINGS_GetMac(uint8_t *mac)
  19706. 802870c: 1e45 subs r5, r0, #1
  19707. 802870e: 2400 movs r4, #0
  19708. char dummy[2];
  19709. char *macPtr = sSettings.sInfo.mac;
  19710. for (uint8_t i = 0; i < 6; i++)
  19711. {
  19712. strncpy(dummy, macPtr+i*3, 2);
  19713. 8028710: 1931 adds r1, r6, r4
  19714. 8028712: 2202 movs r2, #2
  19715. 8028714: f501 711b add.w r1, r1, #620 ; 0x26c
  19716. 8028718: a801 add r0, sp, #4
  19717. 802871a: f7f9 fc61 bl 8021fe0 <strncpy>
  19718. mac[i] = (uint8_t)strtol(dummy, NULL, 16);
  19719. 802871e: 2100 movs r1, #0
  19720. 8028720: 2210 movs r2, #16
  19721. 8028722: a801 add r0, sp, #4
  19722. 8028724: f7fa ff92 bl 802364c <strtol>
  19723. 8028728: 3403 adds r4, #3
  19724. void SETTINGS_GetMac(uint8_t *mac)
  19725. {
  19726. char dummy[2];
  19727. char *macPtr = sSettings.sInfo.mac;
  19728. for (uint8_t i = 0; i < 6; i++)
  19729. 802872a: 2c12 cmp r4, #18
  19730. {
  19731. strncpy(dummy, macPtr+i*3, 2);
  19732. mac[i] = (uint8_t)strtol(dummy, NULL, 16);
  19733. 802872c: f805 0f01 strb.w r0, [r5, #1]!
  19734. void SETTINGS_GetMac(uint8_t *mac)
  19735. {
  19736. char dummy[2];
  19737. char *macPtr = sSettings.sInfo.mac;
  19738. for (uint8_t i = 0; i < 6; i++)
  19739. 8028730: d1ee bne.n 8028710 <SETTINGS_GetMac+0x8>
  19740. {
  19741. strncpy(dummy, macPtr+i*3, 2);
  19742. mac[i] = (uint8_t)strtol(dummy, NULL, 16);
  19743. }
  19744. }
  19745. 8028732: bd7c pop {r2, r3, r4, r5, r6, pc}
  19746. 8028734: 2000e8e4 .word 0x2000e8e4
  19747. 08028738 <SETTINGS_SetProDate>:
  19748. /**
  19749. * @brief Установить дату производства
  19750. */
  19751. void SETTINGS_SetProDate(char *proDate, uint8_t len)
  19752. {
  19753. 8028738: b570 push {r4, r5, r6, lr}
  19754. memset(sSettings.sInfo.productionData, 0, 40);
  19755. 802873a: 4c07 ldr r4, [pc, #28] ; (8028758 <SETTINGS_SetProDate+0x20>)
  19756. /**
  19757. * @brief Установить дату производства
  19758. */
  19759. void SETTINGS_SetProDate(char *proDate, uint8_t len)
  19760. {
  19761. 802873c: 4606 mov r6, r0
  19762. 802873e: 460d mov r5, r1
  19763. memset(sSettings.sInfo.productionData, 0, 40);
  19764. 8028740: 2228 movs r2, #40 ; 0x28
  19765. 8028742: 2100 movs r1, #0
  19766. 8028744: 4620 mov r0, r4
  19767. 8028746: f7f9 f9bb bl 8021ac0 <memset>
  19768. memcpy(sSettings.sInfo.productionData, proDate, len);
  19769. 802874a: 4620 mov r0, r4
  19770. 802874c: 4631 mov r1, r6
  19771. 802874e: 462a mov r2, r5
  19772. }
  19773. 8028750: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  19774. * @brief Установить дату производства
  19775. */
  19776. void SETTINGS_SetProDate(char *proDate, uint8_t len)
  19777. {
  19778. memset(sSettings.sInfo.productionData, 0, 40);
  19779. memcpy(sSettings.sInfo.productionData, proDate, len);
  19780. 8028754: f7f9 b8fa b.w 802194c <memcpy>
  19781. 8028758: 2000eb28 .word 0x2000eb28
  19782. 0802875c <from_hex>:
  19783. #include <ctype.h>
  19784. #include <stdint.h>
  19785. /* Converts a hex character to its integer value */
  19786. char from_hex(char ch) {
  19787. return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
  19788. 802875c: 4b08 ldr r3, [pc, #32] ; (8028780 <from_hex+0x24>)
  19789. 802875e: 681b ldr r3, [r3, #0]
  19790. 8028760: 181b adds r3, r3, r0
  19791. 8028762: 785b ldrb r3, [r3, #1]
  19792. 8028764: f003 0204 and.w r2, r3, #4
  19793. 8028768: b2d2 uxtb r2, r2
  19794. 802876a: b10a cbz r2, 8028770 <from_hex+0x14>
  19795. 802876c: 3830 subs r0, #48 ; 0x30
  19796. 802876e: e005 b.n 802877c <from_hex+0x20>
  19797. 8028770: f003 0303 and.w r3, r3, #3
  19798. 8028774: 2b01 cmp r3, #1
  19799. 8028776: bf08 it eq
  19800. 8028778: 3020 addeq r0, #32
  19801. 802877a: 3857 subs r0, #87 ; 0x57
  19802. 802877c: b2c0 uxtb r0, r0
  19803. }
  19804. 802877e: 4770 bx lr
  19805. 8028780: 20000000 .word 0x20000000
  19806. 08028784 <url_decode>:
  19807. return buf;
  19808. }
  19809. /* Returns a url-decoded version of str */
  19810. /* IMPORTANT: be sure that outbuf is big enougth */
  19811. char *url_decode(char *outbuf, uint32_t outlen, char *inbuf) {
  19812. 8028784: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  19813. 8028788: 4607 mov r7, r0
  19814. 802878a: 460e mov r6, r1
  19815. char *pstr = inbuf, *buf = outbuf, *pbuf = buf;
  19816. 802878c: 4604 mov r4, r0
  19817. 802878e: 4615 mov r5, r2
  19818. if (pstr[1] && pstr[2]) {
  19819. *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
  19820. pstr += 2;
  19821. }
  19822. } else if (*pstr == '+') {
  19823. *pbuf++ = ' ';
  19824. 8028790: f04f 0920 mov.w r9, #32
  19825. /* Returns a url-decoded version of str */
  19826. /* IMPORTANT: be sure that outbuf is big enougth */
  19827. char *url_decode(char *outbuf, uint32_t outlen, char *inbuf) {
  19828. char *pstr = inbuf, *buf = outbuf, *pbuf = buf;
  19829. while ((*pstr) && outlen > 1) {
  19830. 8028794: e01e b.n 80287d4 <url_decode+0x50>
  19831. if (*pstr == '%') {
  19832. 8028796: 2b25 cmp r3, #37 ; 0x25
  19833. 8028798: d112 bne.n 80287c0 <url_decode+0x3c>
  19834. if (pstr[1] && pstr[2]) {
  19835. 802879a: 7868 ldrb r0, [r5, #1]
  19836. 802879c: b1c0 cbz r0, 80287d0 <url_decode+0x4c>
  19837. 802879e: f895 8002 ldrb.w r8, [r5, #2]
  19838. 80287a2: f1b8 0f00 cmp.w r8, #0
  19839. 80287a6: d013 beq.n 80287d0 <url_decode+0x4c>
  19840. *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
  19841. 80287a8: f7ff ffd8 bl 802875c <from_hex>
  19842. 80287ac: 4682 mov sl, r0
  19843. 80287ae: 4640 mov r0, r8
  19844. 80287b0: f7ff ffd4 bl 802875c <from_hex>
  19845. 80287b4: ea40 100a orr.w r0, r0, sl, lsl #4
  19846. 80287b8: f804 0b01 strb.w r0, [r4], #1
  19847. pstr += 2;
  19848. 80287bc: 3502 adds r5, #2
  19849. 80287be: e007 b.n 80287d0 <url_decode+0x4c>
  19850. }
  19851. } else if (*pstr == '+') {
  19852. 80287c0: 2b2b cmp r3, #43 ; 0x2b
  19853. 80287c2: f104 0201 add.w r2, r4, #1
  19854. *pbuf++ = ' ';
  19855. 80287c6: bf0c ite eq
  19856. 80287c8: f884 9000 strbeq.w r9, [r4]
  19857. } else {
  19858. *pbuf++ = *pstr;
  19859. 80287cc: 7023 strbne r3, [r4, #0]
  19860. 80287ce: 4614 mov r4, r2
  19861. }
  19862. pstr++;
  19863. 80287d0: 3501 adds r5, #1
  19864. outlen--;
  19865. 80287d2: 3e01 subs r6, #1
  19866. /* Returns a url-decoded version of str */
  19867. /* IMPORTANT: be sure that outbuf is big enougth */
  19868. char *url_decode(char *outbuf, uint32_t outlen, char *inbuf) {
  19869. char *pstr = inbuf, *buf = outbuf, *pbuf = buf;
  19870. while ((*pstr) && outlen > 1) {
  19871. 80287d4: 782b ldrb r3, [r5, #0]
  19872. 80287d6: b10b cbz r3, 80287dc <url_decode+0x58>
  19873. 80287d8: 2e01 cmp r6, #1
  19874. 80287da: d8dc bhi.n 8028796 <url_decode+0x12>
  19875. *pbuf++ = *pstr;
  19876. }
  19877. pstr++;
  19878. outlen--;
  19879. }
  19880. *pbuf = '\0';
  19881. 80287dc: 2300 movs r3, #0
  19882. 80287de: 7023 strb r3, [r4, #0]
  19883. return buf;
  19884. }
  19885. 80287e0: 4638 mov r0, r7
  19886. 80287e2: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  19887. 80287e6: 0000 movs r0, r0
  19888. 080287e8 <vTaskLedBlink>:
  19889. /**
  19890. * @brief Задача простой мигалки
  19891. */
  19892. void vTaskLedBlink(void *arg)
  19893. {
  19894. 80287e8: b510 push {r4, lr}
  19895. /* Просто отражает состояние контроллера - "живой" */
  19896. // LED_Toggle(LED_INIT_G);
  19897. //LED_Toggle(LED_INIT_R);
  19898. LED_Toggle(LED_MAJOR_R);
  19899. // LED_Toggle(LED_MINOR_R);
  19900. vTaskDelay(statusLedFreq);
  19901. 80287ea: 4c04 ldr r4, [pc, #16] ; (80287fc <vTaskLedBlink+0x14>)
  19902. /**
  19903. * @brief Изменить состояние LED
  19904. */
  19905. void LED_Toggle(gpio_t pin)
  19906. {
  19907. gpio_invert_output(pin);
  19908. 80287ec: 200b movs r0, #11
  19909. 80287ee: f7fd fc33 bl 8026058 <gpio_invert_output>
  19910. /* Просто отражает состояние контроллера - "живой" */
  19911. // LED_Toggle(LED_INIT_G);
  19912. //LED_Toggle(LED_INIT_R);
  19913. LED_Toggle(LED_MAJOR_R);
  19914. // LED_Toggle(LED_MINOR_R);
  19915. vTaskDelay(statusLedFreq);
  19916. 80287f2: 8820 ldrh r0, [r4, #0]
  19917. 80287f4: f001 f85e bl 80298b4 <vTaskDelay>
  19918. 80287f8: e7f8 b.n 80287ec <vTaskLedBlink+0x4>
  19919. 80287fa: bf00 nop
  19920. 80287fc: 200015aa .word 0x200015aa
  19921. 08028800 <LED_Off>:
  19922. /**
  19923. * @brief
  19924. */
  19925. void LED_Off(gpio_t pin)
  19926. {
  19927. gpio_set(pin, 0);
  19928. 8028800: 2100 movs r1, #0
  19929. 8028802: f7fd bb95 b.w 8025f30 <gpio_set>
  19930. 08028806 <LED_Init>:
  19931. /**
  19932. * @brief
  19933. * @retval
  19934. */
  19935. void LED_Init(void)
  19936. {
  19937. 8028806: b508 push {r3, lr}
  19938. LED_Off(LED_INIT_R);
  19939. 8028808: 2009 movs r0, #9
  19940. 802880a: f7ff fff9 bl 8028800 <LED_Off>
  19941. LED_Off(LED_INIT_G);
  19942. 802880e: 200a movs r0, #10
  19943. 8028810: f7ff fff6 bl 8028800 <LED_Off>
  19944. LED_Off(LED_MAJOR_R);
  19945. 8028814: 200b movs r0, #11
  19946. 8028816: f7ff fff3 bl 8028800 <LED_Off>
  19947. LED_Off(LED_MINOR_G);
  19948. 802881a: 200c movs r0, #12
  19949. 802881c: f7ff fff0 bl 8028800 <LED_Off>
  19950. LED_Off(LED_MINOR_R);
  19951. 8028820: 200d movs r0, #13
  19952. }
  19953. 8028822: e8bd 4008 ldmia.w sp!, {r3, lr}
  19954. {
  19955. LED_Off(LED_INIT_R);
  19956. LED_Off(LED_INIT_G);
  19957. LED_Off(LED_MAJOR_R);
  19958. LED_Off(LED_MINOR_G);
  19959. LED_Off(LED_MINOR_R);
  19960. 8028826: f7ff bfeb b.w 8028800 <LED_Off>
  19961. 802882a: 0000 movs r0, r0
  19962. 0802882c <LED_SetStatusLedFreq>:
  19963. /**
  19964. * @brief
  19965. */
  19966. void LED_SetStatusLedFreq(uint16_t freq)
  19967. {
  19968. statusLedFreq = freq;
  19969. 802882c: 4b01 ldr r3, [pc, #4] ; (8028834 <LED_SetStatusLedFreq+0x8>)
  19970. 802882e: 8018 strh r0, [r3, #0]
  19971. 8028830: 4770 bx lr
  19972. 8028832: bf00 nop
  19973. 8028834: 200015aa .word 0x200015aa
  19974. 08028838 <BUTTON_VoidHandler>:
  19975. /**
  19976. * @brief Заглушка
  19977. */
  19978. void BUTTON_VoidHandler(void)
  19979. {
  19980. 8028838: 4770 bx lr
  19981. 802883a: 0000 movs r0, r0
  19982. 0802883c <BUTTON_DEF_DownHandler>:
  19983. /**
  19984. * @brief Хендлер кнопки DEFAULT. Сброс всех настроек, сохранение и перезагрузка
  19985. */
  19986. void BUTTON_DEF_DownHandler(void)
  19987. {
  19988. 802883c: b508 push {r3, lr}
  19989. //taskENTER_CRITICAL();
  19990. SETTINGS_SetDefaultDebug();
  19991. 802883e: f7ff fefb bl 8028638 <SETTINGS_SetDefaultDebug>
  19992. SETTINGS_Save();
  19993. 8028842: f7ff fee9 bl 8028618 <SETTINGS_Save>
  19994. vTaskDelay(1010);
  19995. 8028846: f240 30f2 movw r0, #1010 ; 0x3f2
  19996. 802884a: f001 f833 bl 80298b4 <vTaskDelay>
  19997. This function acts as a special kind of Data Memory Barrier.
  19998. It completes when all explicit memory accesses before this instruction complete.
  19999. */
  20000. __attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void)
  20001. {
  20002. __ASM volatile ("dsb");
  20003. 802884e: f3bf 8f4f dsb sy
  20004. //static inline void NVIC_SystemReset(void)
  20005. {
  20006. __DSB(); /* Ensure all outstanding memory accesses included
  20007. buffered write are completed before reset */
  20008. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  20009. (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  20010. 8028852: 4a05 ldr r2, [pc, #20] ; (8028868 <BUTTON_DEF_DownHandler+0x2c>)
  20011. 8028854: 4b05 ldr r3, [pc, #20] ; (802886c <BUTTON_DEF_DownHandler+0x30>)
  20012. 8028856: 68d1 ldr r1, [r2, #12]
  20013. 8028858: f401 61e0 and.w r1, r1, #1792 ; 0x700
  20014. 802885c: 430b orrs r3, r1
  20015. __STATIC_INLINE void NVIC_SystemReset(void)
  20016. //static inline void NVIC_SystemReset(void)
  20017. {
  20018. __DSB(); /* Ensure all outstanding memory accesses included
  20019. buffered write are completed before reset */
  20020. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  20021. 802885e: 60d3 str r3, [r2, #12]
  20022. 8028860: f3bf 8f4f dsb sy
  20023. 8028864: e7fe b.n 8028864 <BUTTON_DEF_DownHandler+0x28>
  20024. 8028866: bf00 nop
  20025. 8028868: e000ed00 .word 0xe000ed00
  20026. 802886c: 05fa0004 .word 0x05fa0004
  20027. 08028870 <BUTTON_GetState>:
  20028. /**
  20029. * @brief Возвращает сотояние ключа
  20030. */
  20031. BUTTON_STATE_t BUTTON_GetState(BUTTON_NO_FIX_t *button)
  20032. {
  20033. return (BUTTON_STATE_t)gpio_get(button->id_pin);
  20034. 8028870: 7800 ldrb r0, [r0, #0]
  20035. 8028872: f7fd bc01 b.w 8026078 <gpio_get>
  20036. 8028876: 0000 movs r0, r0
  20037. 08028878 <BUTTON_Init>:
  20038. /**
  20039. * @brief
  20040. * @retval
  20041. */
  20042. void BUTTON_Init(void)
  20043. {
  20044. 8028878: b510 push {r4, lr}
  20045. defButton.id_pin = KEY_DEF;
  20046. 802887a: 4c09 ldr r4, [pc, #36] ; (80288a0 <BUTTON_Init+0x28>)
  20047. 802887c: 230f movs r3, #15
  20048. 802887e: 7023 strb r3, [r4, #0]
  20049. defButton.timeDelay = 5;
  20050. 8028880: 2305 movs r3, #5
  20051. 8028882: 8063 strh r3, [r4, #2]
  20052. defButton.pressHandler = BUTTON_VoidHandler;
  20053. 8028884: 4b07 ldr r3, [pc, #28] ; (80288a4 <BUTTON_Init+0x2c>)
  20054. 8028886: 60a3 str r3, [r4, #8]
  20055. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  20056. 8028888: 4b07 ldr r3, [pc, #28] ; (80288a8 <BUTTON_Init+0x30>)
  20057. defButton.counterActivation = 0;
  20058. defButton.timeActivation = 40;
  20059. 802888a: 2228 movs r2, #40 ; 0x28
  20060. void BUTTON_Init(void)
  20061. {
  20062. defButton.id_pin = KEY_DEF;
  20063. defButton.timeDelay = 5;
  20064. defButton.pressHandler = BUTTON_VoidHandler;
  20065. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  20066. 802888c: 60e3 str r3, [r4, #12]
  20067. defButton.counterActivation = 0;
  20068. defButton.timeActivation = 40;
  20069. defButton.fActivation = false;
  20070. defButton.stateOld = BUTTON_GetState(&defButton);
  20071. 802888e: 4620 mov r0, r4
  20072. {
  20073. defButton.id_pin = KEY_DEF;
  20074. defButton.timeDelay = 5;
  20075. defButton.pressHandler = BUTTON_VoidHandler;
  20076. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  20077. defButton.counterActivation = 0;
  20078. 8028890: 2300 movs r3, #0
  20079. 8028892: 6163 str r3, [r4, #20]
  20080. defButton.timeActivation = 40;
  20081. 8028894: 8322 strh r2, [r4, #24]
  20082. defButton.fActivation = false;
  20083. 8028896: 76a3 strb r3, [r4, #26]
  20084. defButton.stateOld = BUTTON_GetState(&defButton);
  20085. 8028898: f7ff ffea bl 8028870 <BUTTON_GetState>
  20086. 802889c: 71a0 strb r0, [r4, #6]
  20087. 802889e: bd10 pop {r4, pc}
  20088. 80288a0: 2000ec8c .word 0x2000ec8c
  20089. 80288a4: 08028839 .word 0x08028839
  20090. 80288a8: 0802883d .word 0x0802883d
  20091. 080288ac <BUTTON_DellayHandler>:
  20092. время нажатия.
  20093. * @param *button: указатель на структуру типа BUTTON_NO_FIX
  20094. * @retval нет
  20095. */
  20096. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  20097. {
  20098. 80288ac: b510 push {r4, lr}
  20099. 80288ae: 4604 mov r4, r0
  20100. /* Кнопка нажата. Ведем отсчет времени удержания */
  20101. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  20102. 80288b0: 7800 ldrb r0, [r0, #0]
  20103. 80288b2: f7fd fbe1 bl 8026078 <gpio_get>
  20104. 80288b6: 6963 ldr r3, [r4, #20]
  20105. 80288b8: b950 cbnz r0, 80288d0 <BUTTON_DellayHandler+0x24>
  20106. {
  20107. button->counterActivation++;
  20108. button->fActivation = false;
  20109. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  20110. if (button->counterActivation > button->timeActivation)
  20111. 80288ba: 8b22 ldrh r2, [r4, #24]
  20112. {
  20113. /* Кнопка нажата. Ведем отсчет времени удержания */
  20114. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  20115. {
  20116. button->counterActivation++;
  20117. button->fActivation = false;
  20118. 80288bc: 76a0 strb r0, [r4, #26]
  20119. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  20120. {
  20121. /* Кнопка нажата. Ведем отсчет времени удержания */
  20122. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  20123. {
  20124. button->counterActivation++;
  20125. 80288be: 3301 adds r3, #1
  20126. button->fActivation = false;
  20127. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  20128. if (button->counterActivation > button->timeActivation)
  20129. 80288c0: 4293 cmp r3, r2
  20130. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  20131. {
  20132. /* Кнопка нажата. Ведем отсчет времени удержания */
  20133. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  20134. {
  20135. button->counterActivation++;
  20136. 80288c2: 6163 str r3, [r4, #20]
  20137. button->fActivation = false;
  20138. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  20139. if (button->counterActivation > button->timeActivation)
  20140. 80288c4: d914 bls.n 80288f0 <BUTTON_DellayHandler+0x44>
  20141. LED_SetStatusLedFreq(100);
  20142. 80288c6: 2064 movs r0, #100 ; 0x64
  20143. }
  20144. else
  20145. button->counterActivation = 0;
  20146. }
  20147. }
  20148. 80288c8: e8bd 4010 ldmia.w sp!, {r4, lr}
  20149. button->counterActivation++;
  20150. button->fActivation = false;
  20151. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  20152. if (button->counterActivation > button->timeActivation)
  20153. LED_SetStatusLedFreq(100);
  20154. 80288cc: f7ff bfae b.w 802882c <LED_SetStatusLedFreq>
  20155. }
  20156. /* Кнопку отжата. Если до этого она была нажата нужное время - вызываем хендлер */
  20157. else
  20158. {
  20159. if ((button->counterActivation > button->timeActivation)
  20160. 80288d0: 8b22 ldrh r2, [r4, #24]
  20161. 80288d2: 4293 cmp r3, r2
  20162. 80288d4: d90a bls.n 80288ec <BUTTON_DellayHandler+0x40>
  20163. && button->fActivation == false)
  20164. 80288d6: 7ea3 ldrb r3, [r4, #26]
  20165. 80288d8: b943 cbnz r3, 80288ec <BUTTON_DellayHandler+0x40>
  20166. {
  20167. button->fActivation = true;
  20168. 80288da: 2301 movs r3, #1
  20169. 80288dc: 76a3 strb r3, [r4, #26]
  20170. LED_SetStatusLedFreq(1000);
  20171. 80288de: f44f 707a mov.w r0, #1000 ; 0x3e8
  20172. 80288e2: f7ff ffa3 bl 802882c <LED_SetStatusLedFreq>
  20173. button->unpressHandler();
  20174. 80288e6: 68e3 ldr r3, [r4, #12]
  20175. 80288e8: 4798 blx r3
  20176. 80288ea: bd10 pop {r4, pc}
  20177. }
  20178. else
  20179. button->counterActivation = 0;
  20180. 80288ec: 2300 movs r3, #0
  20181. 80288ee: 6163 str r3, [r4, #20]
  20182. 80288f0: bd10 pop {r4, pc}
  20183. 80288f2: 0000 movs r0, r0
  20184. 080288f4 <vTaskButtons>:
  20185. /**
  20186. * @brief Опрос кнопок
  20187. */
  20188. void vTaskButtons(void *pvParameters)
  20189. {
  20190. 80288f4: b508 push {r3, lr}
  20191. for (;;)
  20192. {
  20193. BUTTON_DellayHandler(&defButton);
  20194. 80288f6: 4803 ldr r0, [pc, #12] ; (8028904 <vTaskButtons+0x10>)
  20195. 80288f8: f7ff ffd8 bl 80288ac <BUTTON_DellayHandler>
  20196. vTaskDelay(100); //20
  20197. 80288fc: 2064 movs r0, #100 ; 0x64
  20198. 80288fe: f000 ffd9 bl 80298b4 <vTaskDelay>
  20199. 8028902: e7f8 b.n 80288f6 <vTaskButtons+0x2>
  20200. 8028904: 2000ec8c .word 0x2000ec8c
  20201. 08028908 <set_mode_jumper>:
  20202. #include "gpio.h"
  20203. bool value_jumper;
  20204. void set_mode_jumper(void)
  20205. {
  20206. 8028908: b508 push {r3, lr}
  20207. value_jumper = gpio_get(MODE_JUMPER);
  20208. 802890a: 200e movs r0, #14
  20209. 802890c: f7fd fbb4 bl 8026078 <gpio_get>
  20210. 8028910: 4b01 ldr r3, [pc, #4] ; (8028918 <set_mode_jumper+0x10>)
  20211. 8028912: 7018 strb r0, [r3, #0]
  20212. 8028914: bd08 pop {r3, pc}
  20213. 8028916: bf00 nop
  20214. 8028918: 2000eca8 .word 0x2000eca8
  20215. 0802891c <send_MegaTec_cmd.part.0>:
  20216. }
  20217. else if(command == ups_shutdown_restore){
  20218. }
  20219. else{
  20220. ups_send_block(MegaTecCMD[command], strlen(MegaTecCMD[command]));
  20221. 802891c: 4b06 ldr r3, [pc, #24] ; (8028938 <send_MegaTec_cmd.part.0+0x1c>)
  20222. memset(UPS.model, 0, 11);
  20223. memset(UPS.vertion, 0, 11);
  20224. }
  20225. void send_MegaTec_cmd(cmdMegaTecEnums_t command)
  20226. 802891e: b510 push {r4, lr}
  20227. }
  20228. else if(command == ups_shutdown_restore){
  20229. }
  20230. else{
  20231. ups_send_block(MegaTecCMD[command], strlen(MegaTecCMD[command]));
  20232. 8028920: f853 4020 ldr.w r4, [r3, r0, lsl #2]
  20233. 8028924: 4620 mov r0, r4
  20234. 8028926: f7f9 faa3 bl 8021e70 <strlen>
  20235. 802892a: b2c1 uxtb r1, r0
  20236. 802892c: 4620 mov r0, r4
  20237. }
  20238. }
  20239. 802892e: e8bd 4010 ldmia.w sp!, {r4, lr}
  20240. }
  20241. else if(command == ups_shutdown_restore){
  20242. }
  20243. else{
  20244. ups_send_block(MegaTecCMD[command], strlen(MegaTecCMD[command]));
  20245. 8028932: f7fe b9a3 b.w 8026c7c <ups_send_block>
  20246. 8028936: bf00 nop
  20247. 8028938: 200015ac .word 0x200015ac
  20248. 0802893c <init_UPS_value>:
  20249. "F\r"
  20250. };
  20251. void init_UPS_value(void)
  20252. {
  20253. 802893c: b538 push {r3, r4, r5, lr}
  20254. UPS.Freq_in = 0;
  20255. 802893e: 4c0d ldr r4, [pc, #52] ; (8028974 <init_UPS_value+0x38>)
  20256. UPS.VAC_in = 0;
  20257. UPS.VAC_out = 0;
  20258. UPS.Temp = 0;
  20259. UPS.Load = 0;
  20260. 8028940: 2500 movs r5, #0
  20261. };
  20262. void init_UPS_value(void)
  20263. {
  20264. UPS.Freq_in = 0;
  20265. 8028942: 2300 movs r3, #0
  20266. UPS.SOC = 0;
  20267. UPS.work_time = 0;
  20268. UPS.Status = 0;
  20269. UPS.Present = false;
  20270. memset(UPS.model, 0, 11);
  20271. 8028944: 4629 mov r1, r5
  20272. 8028946: 220b movs r2, #11
  20273. 8028948: f104 0014 add.w r0, r4, #20
  20274. };
  20275. void init_UPS_value(void)
  20276. {
  20277. UPS.Freq_in = 0;
  20278. 802894c: 6023 str r3, [r4, #0]
  20279. UPS.VAC_in = 0;
  20280. 802894e: 6063 str r3, [r4, #4]
  20281. UPS.VAC_out = 0;
  20282. 8028950: 60a3 str r3, [r4, #8]
  20283. UPS.Temp = 0;
  20284. 8028952: 60e3 str r3, [r4, #12]
  20285. UPS.Load = 0;
  20286. 8028954: 7425 strb r5, [r4, #16]
  20287. UPS.SOC = 0;
  20288. 8028956: 7465 strb r5, [r4, #17]
  20289. UPS.work_time = 0;
  20290. 8028958: 74a5 strb r5, [r4, #18]
  20291. UPS.Status = 0;
  20292. 802895a: 74e5 strb r5, [r4, #19]
  20293. UPS.Present = false;
  20294. 802895c: f884 502a strb.w r5, [r4, #42] ; 0x2a
  20295. memset(UPS.model, 0, 11);
  20296. 8028960: f7f9 f8ae bl 8021ac0 <memset>
  20297. memset(UPS.vertion, 0, 11);
  20298. 8028964: f104 001f add.w r0, r4, #31
  20299. 8028968: 4629 mov r1, r5
  20300. 802896a: 220b movs r2, #11
  20301. }
  20302. 802896c: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  20303. UPS.work_time = 0;
  20304. UPS.Status = 0;
  20305. UPS.Present = false;
  20306. memset(UPS.model, 0, 11);
  20307. memset(UPS.vertion, 0, 11);
  20308. 8028970: f7f9 b8a6 b.w 8021ac0 <memset>
  20309. 8028974: 2000e8b4 .word 0x2000e8b4
  20310. 08028978 <ups_megatec_rx_pdu>:
  20311. ups_send_block(MegaTecCMD[command], strlen(MegaTecCMD[command]));
  20312. }
  20313. }
  20314. bool ups_megatec_rx_pdu(void)
  20315. {
  20316. 8028978: b510 push {r4, lr}
  20317. int c = 0;
  20318. ups_pdu.len = 0;
  20319. 802897a: 4c0e ldr r4, [pc, #56] ; (80289b4 <ups_megatec_rx_pdu+0x3c>)
  20320. 802897c: 2000 movs r0, #0
  20321. 802897e: 8660 strh r0, [r4, #50] ; 0x32
  20322. while ((ups_pdu.len < UPS_PDU_MAX_LEN) && (c != 0x0d)) {
  20323. 8028980: e00d b.n 802899e <ups_megatec_rx_pdu+0x26>
  20324. c = ups_getchar(500);//portMAX_DELAY
  20325. 8028982: f44f 70fa mov.w r0, #500 ; 0x1f4
  20326. 8028986: f7fe f99d bl 8026cc4 <ups_getchar>
  20327. if(c < 0)
  20328. 802898a: 2800 cmp r0, #0
  20329. 802898c: da03 bge.n 8028996 <ups_megatec_rx_pdu+0x1e>
  20330. {
  20331. ups_pdu.len = 0;
  20332. 802898e: 4b09 ldr r3, [pc, #36] ; (80289b4 <ups_megatec_rx_pdu+0x3c>)
  20333. 8028990: 2200 movs r2, #0
  20334. 8028992: 865a strh r2, [r3, #50] ; 0x32
  20335. break;
  20336. 8028994: e008 b.n 80289a8 <ups_megatec_rx_pdu+0x30>
  20337. }
  20338. ups_pdu.data[ups_pdu.len++] = c;
  20339. 8028996: 8e63 ldrh r3, [r4, #50] ; 0x32
  20340. 8028998: 54e0 strb r0, [r4, r3]
  20341. 802899a: 3301 adds r3, #1
  20342. 802899c: 8663 strh r3, [r4, #50] ; 0x32
  20343. {
  20344. int c = 0;
  20345. ups_pdu.len = 0;
  20346. while ((ups_pdu.len < UPS_PDU_MAX_LEN) && (c != 0x0d)) {
  20347. 802899e: 8e63 ldrh r3, [r4, #50] ; 0x32
  20348. 80289a0: 2b31 cmp r3, #49 ; 0x31
  20349. 80289a2: d801 bhi.n 80289a8 <ups_megatec_rx_pdu+0x30>
  20350. 80289a4: 280d cmp r0, #13
  20351. 80289a6: d1ec bne.n 8028982 <ups_megatec_rx_pdu+0xa>
  20352. break;
  20353. }
  20354. ups_pdu.data[ups_pdu.len++] = c;
  20355. }
  20356. if (ups_pdu.len == 0)
  20357. 80289a8: 4b02 ldr r3, [pc, #8] ; (80289b4 <ups_megatec_rx_pdu+0x3c>)
  20358. 80289aa: 8e58 ldrh r0, [r3, #50] ; 0x32
  20359. return false;
  20360. return true;
  20361. }
  20362. 80289ac: 3000 adds r0, #0
  20363. 80289ae: bf18 it ne
  20364. 80289b0: 2001 movne r0, #1
  20365. 80289b2: bd10 pop {r4, pc}
  20366. 80289b4: 200028ae .word 0x200028ae
  20367. 080289b8 <ups_status_response>:
  20368. void ups_status_response(char *data)
  20369. {
  20370. 80289b8: e92d 41ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, lr}
  20371. uint8_t i;
  20372. char *endValue;
  20373. char value[10];
  20374. uint8_t len = 0;
  20375. if(data[0] != '(')
  20376. 80289bc: 7803 ldrb r3, [r0, #0]
  20377. 80289be: 2b28 cmp r3, #40 ; 0x28
  20378. 80289c0: f040 80c1 bne.w 8028b46 <ups_status_response+0x18e>
  20379. return;
  20380. data++;
  20381. 80289c4: 1c44 adds r4, r0, #1
  20382. memset(value, 0, 10);
  20383. 80289c6: 220a movs r2, #10
  20384. 80289c8: 2100 movs r1, #0
  20385. 80289ca: a801 add r0, sp, #4
  20386. 80289cc: f7f9 f878 bl 8021ac0 <memset>
  20387. endValue = strpbrk(data," ");
  20388. 80289d0: 4620 mov r0, r4
  20389. 80289d2: 495e ldr r1, [pc, #376] ; (8028b4c <ups_status_response+0x194>)
  20390. 80289d4: f7f9 fb36 bl 8022044 <strpbrk>
  20391. len = endValue - data;
  20392. 80289d8: 1b00 subs r0, r0, r4
  20393. void ups_megatec_init(void) {
  20394. init_UPS_value();
  20395. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  20396. }
  20397. 80289da: b2c6 uxtb r6, r0
  20398. data++;
  20399. memset(value, 0, 10);
  20400. endValue = strpbrk(data," ");
  20401. len = endValue - data;
  20402. strncpy(value, data, len);
  20403. 80289dc: 4632 mov r2, r6
  20404. 80289de: 4621 mov r1, r4
  20405. 80289e0: a801 add r0, sp, #4
  20406. 80289e2: f7f9 fafd bl 8021fe0 <strncpy>
  20407. data += (len + 1);
  20408. UPS.VAC_in = atof(value);
  20409. 80289e6: a801 add r0, sp, #4
  20410. 80289e8: f7f8 ff46 bl 8021878 <atof>
  20411. 80289ec: f7f8 f8aa bl 8020b44 <__aeabi_d2f>
  20412. memset(value, 0, 10);
  20413. endValue = strpbrk(data," ");
  20414. len = endValue - data;
  20415. strncpy(value, data, len);
  20416. data += (len + 1);
  20417. 80289f0: 3601 adds r6, #1
  20418. 80289f2: 19a6 adds r6, r4, r6
  20419. UPS.VAC_in = atof(value);
  20420. 80289f4: 4c56 ldr r4, [pc, #344] ; (8028b50 <ups_status_response+0x198>)
  20421. //TODO
  20422. memset(value, 0, 10);
  20423. 80289f6: 220a movs r2, #10
  20424. 80289f8: 2100 movs r1, #0
  20425. memset(value, 0, 10);
  20426. endValue = strpbrk(data," ");
  20427. len = endValue - data;
  20428. strncpy(value, data, len);
  20429. data += (len + 1);
  20430. UPS.VAC_in = atof(value);
  20431. 80289fa: 6060 str r0, [r4, #4]
  20432. //TODO
  20433. memset(value, 0, 10);
  20434. 80289fc: a801 add r0, sp, #4
  20435. 80289fe: f7f9 f85f bl 8021ac0 <memset>
  20436. endValue = strpbrk(data," ");
  20437. 8028a02: 4630 mov r0, r6
  20438. 8028a04: 4951 ldr r1, [pc, #324] ; (8028b4c <ups_status_response+0x194>)
  20439. 8028a06: f7f9 fb1d bl 8022044 <strpbrk>
  20440. len = endValue - data;
  20441. 8028a0a: 1b80 subs r0, r0, r6
  20442. void ups_megatec_init(void) {
  20443. init_UPS_value();
  20444. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  20445. }
  20446. 8028a0c: b2c5 uxtb r5, r0
  20447. //TODO
  20448. memset(value, 0, 10);
  20449. endValue = strpbrk(data," ");
  20450. len = endValue - data;
  20451. strncpy(value, data, len);
  20452. 8028a0e: 4631 mov r1, r6
  20453. 8028a10: 462a mov r2, r5
  20454. 8028a12: a801 add r0, sp, #4
  20455. data += (len + 1);
  20456. 8028a14: 3501 adds r5, #1
  20457. //TODO
  20458. memset(value, 0, 10);
  20459. endValue = strpbrk(data," ");
  20460. len = endValue - data;
  20461. strncpy(value, data, len);
  20462. 8028a16: f7f9 fae3 bl 8021fe0 <strncpy>
  20463. data += (len + 1);
  20464. 8028a1a: 1975 adds r5, r6, r5
  20465. memset(value, 0, 10);
  20466. 8028a1c: 220a movs r2, #10
  20467. 8028a1e: 2100 movs r1, #0
  20468. 8028a20: a801 add r0, sp, #4
  20469. 8028a22: f7f9 f84d bl 8021ac0 <memset>
  20470. endValue = strpbrk(data," ");
  20471. 8028a26: 4628 mov r0, r5
  20472. 8028a28: 4948 ldr r1, [pc, #288] ; (8028b4c <ups_status_response+0x194>)
  20473. 8028a2a: f7f9 fb0b bl 8022044 <strpbrk>
  20474. len = endValue - data;
  20475. 8028a2e: 1b40 subs r0, r0, r5
  20476. void ups_megatec_init(void) {
  20477. init_UPS_value();
  20478. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  20479. }
  20480. 8028a30: fa5f f880 uxtb.w r8, r0
  20481. data += (len + 1);
  20482. memset(value, 0, 10);
  20483. endValue = strpbrk(data," ");
  20484. len = endValue - data;
  20485. strncpy(value, data, len);
  20486. 8028a34: 4642 mov r2, r8
  20487. 8028a36: 4629 mov r1, r5
  20488. 8028a38: a801 add r0, sp, #4
  20489. 8028a3a: f7f9 fad1 bl 8021fe0 <strncpy>
  20490. data += (len + 1);
  20491. UPS.VAC_out = atof(value);
  20492. 8028a3e: a801 add r0, sp, #4
  20493. 8028a40: f7f8 ff1a bl 8021878 <atof>
  20494. 8028a44: f7f8 f87e bl 8020b44 <__aeabi_d2f>
  20495. memset(value, 0, 10);
  20496. endValue = strpbrk(data," ");
  20497. len = endValue - data;
  20498. strncpy(value, data, len);
  20499. data += (len + 1);
  20500. 8028a48: f108 0801 add.w r8, r8, #1
  20501. 8028a4c: 44a8 add r8, r5
  20502. UPS.VAC_out = atof(value);
  20503. memset(value, 0, 10);
  20504. 8028a4e: 220a movs r2, #10
  20505. 8028a50: 2100 movs r1, #0
  20506. memset(value, 0, 10);
  20507. endValue = strpbrk(data," ");
  20508. len = endValue - data;
  20509. strncpy(value, data, len);
  20510. data += (len + 1);
  20511. UPS.VAC_out = atof(value);
  20512. 8028a52: 60a0 str r0, [r4, #8]
  20513. memset(value, 0, 10);
  20514. 8028a54: a801 add r0, sp, #4
  20515. 8028a56: f7f9 f833 bl 8021ac0 <memset>
  20516. endValue = strpbrk(data," ");
  20517. 8028a5a: 493c ldr r1, [pc, #240] ; (8028b4c <ups_status_response+0x194>)
  20518. 8028a5c: 4640 mov r0, r8
  20519. 8028a5e: f7f9 faf1 bl 8022044 <strpbrk>
  20520. len = endValue - data;
  20521. 8028a62: ebc8 0000 rsb r0, r8, r0
  20522. void ups_megatec_init(void) {
  20523. init_UPS_value();
  20524. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  20525. }
  20526. 8028a66: b2c7 uxtb r7, r0
  20527. UPS.VAC_out = atof(value);
  20528. memset(value, 0, 10);
  20529. endValue = strpbrk(data," ");
  20530. len = endValue - data;
  20531. strncpy(value, data, len);
  20532. 8028a68: 463a mov r2, r7
  20533. 8028a6a: 4641 mov r1, r8
  20534. 8028a6c: a801 add r0, sp, #4
  20535. 8028a6e: f7f9 fab7 bl 8021fe0 <strncpy>
  20536. data += (len + 1);
  20537. UPS.Load = atoi(value);
  20538. 8028a72: a801 add r0, sp, #4
  20539. 8028a74: f7f8 ff04 bl 8021880 <atoi>
  20540. memset(value, 0, 10);
  20541. endValue = strpbrk(data," ");
  20542. len = endValue - data;
  20543. strncpy(value, data, len);
  20544. data += (len + 1);
  20545. 8028a78: 3701 adds r7, #1
  20546. 8028a7a: 4447 add r7, r8
  20547. UPS.Load = atoi(value);
  20548. memset(value, 0, 10);
  20549. 8028a7c: 220a movs r2, #10
  20550. 8028a7e: 2100 movs r1, #0
  20551. memset(value, 0, 10);
  20552. endValue = strpbrk(data," ");
  20553. len = endValue - data;
  20554. strncpy(value, data, len);
  20555. data += (len + 1);
  20556. UPS.Load = atoi(value);
  20557. 8028a80: 7420 strb r0, [r4, #16]
  20558. memset(value, 0, 10);
  20559. 8028a82: a801 add r0, sp, #4
  20560. 8028a84: f7f9 f81c bl 8021ac0 <memset>
  20561. endValue = strpbrk(data," ");
  20562. 8028a88: 4930 ldr r1, [pc, #192] ; (8028b4c <ups_status_response+0x194>)
  20563. 8028a8a: 4638 mov r0, r7
  20564. 8028a8c: f7f9 fada bl 8022044 <strpbrk>
  20565. len = endValue - data;
  20566. 8028a90: 1bc0 subs r0, r0, r7
  20567. void ups_megatec_init(void) {
  20568. init_UPS_value();
  20569. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  20570. }
  20571. 8028a92: b2c6 uxtb r6, r0
  20572. UPS.Load = atoi(value);
  20573. memset(value, 0, 10);
  20574. endValue = strpbrk(data," ");
  20575. len = endValue - data;
  20576. strncpy(value, data, len);
  20577. 8028a94: 4632 mov r2, r6
  20578. 8028a96: 4639 mov r1, r7
  20579. 8028a98: a801 add r0, sp, #4
  20580. 8028a9a: f7f9 faa1 bl 8021fe0 <strncpy>
  20581. data += (len + 1);
  20582. UPS.Freq_in = atof(value);
  20583. 8028a9e: a801 add r0, sp, #4
  20584. 8028aa0: f7f8 feea bl 8021878 <atof>
  20585. 8028aa4: f7f8 f84e bl 8020b44 <__aeabi_d2f>
  20586. memset(value, 0, 10);
  20587. endValue = strpbrk(data," ");
  20588. len = endValue - data;
  20589. strncpy(value, data, len);
  20590. data += (len + 1);
  20591. 8028aa8: 3601 adds r6, #1
  20592. 8028aaa: 19be adds r6, r7, r6
  20593. UPS.Freq_in = atof(value);
  20594. //TODO
  20595. memset(value, 0, 10);
  20596. 8028aac: 220a movs r2, #10
  20597. memset(value, 0, 10);
  20598. endValue = strpbrk(data," ");
  20599. len = endValue - data;
  20600. strncpy(value, data, len);
  20601. data += (len + 1);
  20602. UPS.Freq_in = atof(value);
  20603. 8028aae: 6020 str r0, [r4, #0]
  20604. //TODO
  20605. memset(value, 0, 10);
  20606. 8028ab0: 2100 movs r1, #0
  20607. 8028ab2: a801 add r0, sp, #4
  20608. 8028ab4: f7f9 f804 bl 8021ac0 <memset>
  20609. endValue = strpbrk(data," ");
  20610. 8028ab8: 4630 mov r0, r6
  20611. 8028aba: 4924 ldr r1, [pc, #144] ; (8028b4c <ups_status_response+0x194>)
  20612. 8028abc: f7f9 fac2 bl 8022044 <strpbrk>
  20613. len = endValue - data;
  20614. 8028ac0: 1b80 subs r0, r0, r6
  20615. void ups_megatec_init(void) {
  20616. init_UPS_value();
  20617. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  20618. }
  20619. 8028ac2: b2c5 uxtb r5, r0
  20620. //TODO
  20621. memset(value, 0, 10);
  20622. endValue = strpbrk(data," ");
  20623. len = endValue - data;
  20624. strncpy(value, data, len);
  20625. 8028ac4: 4631 mov r1, r6
  20626. 8028ac6: 462a mov r2, r5
  20627. 8028ac8: a801 add r0, sp, #4
  20628. data += (len + 1);
  20629. 8028aca: 3501 adds r5, #1
  20630. //TODO
  20631. memset(value, 0, 10);
  20632. endValue = strpbrk(data," ");
  20633. len = endValue - data;
  20634. strncpy(value, data, len);
  20635. 8028acc: f7f9 fa88 bl 8021fe0 <strncpy>
  20636. data += (len + 1);
  20637. 8028ad0: 1975 adds r5, r6, r5
  20638. memset(value, 0, 10);
  20639. 8028ad2: 220a movs r2, #10
  20640. 8028ad4: 2100 movs r1, #0
  20641. 8028ad6: a801 add r0, sp, #4
  20642. 8028ad8: f7f8 fff2 bl 8021ac0 <memset>
  20643. endValue = strpbrk(data," ");
  20644. 8028adc: 4628 mov r0, r5
  20645. 8028ade: 491b ldr r1, [pc, #108] ; (8028b4c <ups_status_response+0x194>)
  20646. 8028ae0: f7f9 fab0 bl 8022044 <strpbrk>
  20647. len = endValue - data;
  20648. 8028ae4: 1b40 subs r0, r0, r5
  20649. void ups_megatec_init(void) {
  20650. init_UPS_value();
  20651. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  20652. }
  20653. 8028ae6: b2c6 uxtb r6, r0
  20654. data += (len + 1);
  20655. memset(value, 0, 10);
  20656. endValue = strpbrk(data," ");
  20657. len = endValue - data;
  20658. strncpy(value, data, len);
  20659. 8028ae8: 4632 mov r2, r6
  20660. 8028aea: 4629 mov r1, r5
  20661. 8028aec: a801 add r0, sp, #4
  20662. 8028aee: f7f9 fa77 bl 8021fe0 <strncpy>
  20663. data += (len + 1);
  20664. UPS.Temp = atof(value);
  20665. 8028af2: a801 add r0, sp, #4
  20666. 8028af4: f7f8 fec0 bl 8021878 <atof>
  20667. 8028af8: f7f8 f824 bl 8020b44 <__aeabi_d2f>
  20668. memset(value, 0, 10);
  20669. endValue = strpbrk(data," ");
  20670. len = endValue - data;
  20671. strncpy(value, data, len);
  20672. data += (len + 1);
  20673. 8028afc: 3601 adds r6, #1
  20674. 8028afe: 19ad adds r5, r5, r6
  20675. UPS.Temp = atof(value);
  20676. memset(value, 0, 10);
  20677. 8028b00: 220a movs r2, #10
  20678. memset(value, 0, 10);
  20679. endValue = strpbrk(data," ");
  20680. len = endValue - data;
  20681. strncpy(value, data, len);
  20682. data += (len + 1);
  20683. UPS.Temp = atof(value);
  20684. 8028b02: 60e0 str r0, [r4, #12]
  20685. memset(value, 0, 10);
  20686. 8028b04: 2100 movs r1, #0
  20687. 8028b06: a801 add r0, sp, #4
  20688. 8028b08: f7f8 ffda bl 8021ac0 <memset>
  20689. endValue = strpbrk(data,"\r");
  20690. 8028b0c: 4911 ldr r1, [pc, #68] ; (8028b54 <ups_status_response+0x19c>)
  20691. 8028b0e: 4628 mov r0, r5
  20692. 8028b10: f7f9 fa98 bl 8022044 <strpbrk>
  20693. len = endValue - data;
  20694. 8028b14: 1b40 subs r0, r0, r5
  20695. 8028b16: b2c6 uxtb r6, r0
  20696. strncpy(value, data, len);
  20697. 8028b18: 4629 mov r1, r5
  20698. 8028b1a: a801 add r0, sp, #4
  20699. 8028b1c: 4632 mov r2, r6
  20700. 8028b1e: f7f9 fa5f bl 8021fe0 <strncpy>
  20701. 8028b22: 7ce1 ldrb r1, [r4, #19]
  20702. for(i = 0; i < len; i ++)
  20703. 8028b24: 2300 movs r3, #0
  20704. 8028b26: e009 b.n 8028b3c <ups_status_response+0x184>
  20705. {
  20706. UPS.Status |= (value[i] - 0x30) << (7-i);
  20707. 8028b28: aa01 add r2, sp, #4
  20708. return false;
  20709. return true;
  20710. }
  20711. void ups_status_response(char *data)
  20712. 8028b2a: f1c3 0007 rsb r0, r3, #7
  20713. endValue = strpbrk(data,"\r");
  20714. len = endValue - data;
  20715. strncpy(value, data, len);
  20716. for(i = 0; i < len; i ++)
  20717. {
  20718. UPS.Status |= (value[i] - 0x30) << (7-i);
  20719. 8028b2e: 5c9a ldrb r2, [r3, r2]
  20720. 8028b30: 3a30 subs r2, #48 ; 0x30
  20721. 8028b32: fa02 f200 lsl.w r2, r2, r0
  20722. 8028b36: 4311 orrs r1, r2
  20723. 8028b38: b2c9 uxtb r1, r1
  20724. 8028b3a: 3301 adds r3, #1
  20725. memset(value, 0, 10);
  20726. endValue = strpbrk(data,"\r");
  20727. len = endValue - data;
  20728. strncpy(value, data, len);
  20729. for(i = 0; i < len; i ++)
  20730. 8028b3c: b2da uxtb r2, r3
  20731. 8028b3e: 42b2 cmp r2, r6
  20732. 8028b40: d3f2 bcc.n 8028b28 <ups_status_response+0x170>
  20733. 8028b42: 4b03 ldr r3, [pc, #12] ; (8028b50 <ups_status_response+0x198>)
  20734. 8028b44: 74d9 strb r1, [r3, #19]
  20735. {
  20736. UPS.Status |= (value[i] - 0x30) << (7-i);
  20737. }
  20738. }
  20739. 8028b46: e8bd 81ff ldmia.w sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, pc}
  20740. 8028b4a: bf00 nop
  20741. 8028b4c: 08035f57 .word 0x08035f57
  20742. 8028b50: 2000e8b4 .word 0x2000e8b4
  20743. 8028b54: 080409a5 .word 0x080409a5
  20744. 08028b58 <ups_info_response>:
  20745. void ups_info_response(char *data)
  20746. {
  20747. 8028b58: b538 push {r3, r4, r5, lr}
  20748. uint8_t i = 0;
  20749. char *endValue;
  20750. uint8_t len = 0;
  20751. if(data[0] != '#')
  20752. 8028b5a: 7803 ldrb r3, [r0, #0]
  20753. 8028b5c: 2b23 cmp r3, #35 ; 0x23
  20754. 8028b5e: d123 bne.n 8028ba8 <ups_info_response+0x50>
  20755. return;
  20756. data++;
  20757. data += 16;
  20758. 8028b60: 3011 adds r0, #17
  20759. while(data[0] == ' '){
  20760. 8028b62: 4603 mov r3, r0
  20761. 8028b64: 461c mov r4, r3
  20762. UPS.Status |= (value[i] - 0x30) << (7-i);
  20763. }
  20764. }
  20765. void ups_info_response(char *data)
  20766. 8028b66: 1a1a subs r2, r3, r0
  20767. data++;
  20768. data += 16;
  20769. while(data[0] == ' '){
  20770. 8028b68: 7821 ldrb r1, [r4, #0]
  20771. 8028b6a: 3301 adds r3, #1
  20772. 8028b6c: 2920 cmp r1, #32
  20773. UPS.Status |= (value[i] - 0x30) << (7-i);
  20774. }
  20775. }
  20776. void ups_info_response(char *data)
  20777. 8028b6e: b2d2 uxtb r2, r2
  20778. data++;
  20779. data += 16;
  20780. while(data[0] == ' '){
  20781. 8028b70: d0f8 beq.n 8028b64 <ups_info_response+0xc>
  20782. data ++;
  20783. i ++;
  20784. }
  20785. if(i < 11){
  20786. 8028b72: 2a0a cmp r2, #10
  20787. 8028b74: d80c bhi.n 8028b90 <ups_info_response+0x38>
  20788. endValue = strpbrk(data," ");
  20789. 8028b76: 4620 mov r0, r4
  20790. 8028b78: 490c ldr r1, [pc, #48] ; (8028bac <ups_info_response+0x54>)
  20791. 8028b7a: f7f9 fa63 bl 8022044 <strpbrk>
  20792. len = endValue - data;
  20793. 8028b7e: 1b00 subs r0, r0, r4
  20794. void ups_megatec_init(void) {
  20795. init_UPS_value();
  20796. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  20797. }
  20798. 8028b80: b2c5 uxtb r5, r0
  20799. i ++;
  20800. }
  20801. if(i < 11){
  20802. endValue = strpbrk(data," ");
  20803. len = endValue - data;
  20804. strncpy(UPS.model, data, len);
  20805. 8028b82: 4621 mov r1, r4
  20806. 8028b84: 462a mov r2, r5
  20807. 8028b86: 480a ldr r0, [pc, #40] ; (8028bb0 <ups_info_response+0x58>)
  20808. 8028b88: f7f9 fa2a bl 8021fe0 <strncpy>
  20809. data += (len + 1);
  20810. 8028b8c: 3501 adds r5, #1
  20811. 8028b8e: 1964 adds r4, r4, r5
  20812. }
  20813. endValue = strpbrk(data,"\r");
  20814. 8028b90: 4620 mov r0, r4
  20815. 8028b92: 4908 ldr r1, [pc, #32] ; (8028bb4 <ups_info_response+0x5c>)
  20816. 8028b94: f7f9 fa56 bl 8022044 <strpbrk>
  20817. len = endValue - data;
  20818. 8028b98: 1b02 subs r2, r0, r4
  20819. strncpy(UPS.vertion, data, len);
  20820. 8028b9a: 4807 ldr r0, [pc, #28] ; (8028bb8 <ups_info_response+0x60>)
  20821. 8028b9c: 4621 mov r1, r4
  20822. 8028b9e: b2d2 uxtb r2, r2
  20823. }
  20824. 8028ba0: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  20825. data += (len + 1);
  20826. }
  20827. endValue = strpbrk(data,"\r");
  20828. len = endValue - data;
  20829. strncpy(UPS.vertion, data, len);
  20830. 8028ba4: f7f9 ba1c b.w 8021fe0 <strncpy>
  20831. 8028ba8: bd38 pop {r3, r4, r5, pc}
  20832. 8028baa: bf00 nop
  20833. 8028bac: 08035f57 .word 0x08035f57
  20834. 8028bb0: 2000e8c8 .word 0x2000e8c8
  20835. 8028bb4: 080409a5 .word 0x080409a5
  20836. 8028bb8: 2000e8d3 .word 0x2000e8d3
  20837. 08028bbc <request_task>:
  20838. break;
  20839. }
  20840. }
  20841. void request_task(void)
  20842. {
  20843. 8028bbc: b508 push {r3, lr}
  20844. 8028bbe: 2000 movs r0, #0
  20845. 8028bc0: f7ff feac bl 802891c <send_MegaTec_cmd.part.0>
  20846. for(;;)
  20847. {
  20848. send_MegaTec_cmd(ups_status_req);
  20849. if (ups_megatec_rx_pdu())
  20850. 8028bc4: f7ff fed8 bl 8028978 <ups_megatec_rx_pdu>
  20851. 8028bc8: b110 cbz r0, 8028bd0 <request_task+0x14>
  20852. void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
  20853. {
  20854. switch(command)
  20855. {
  20856. case ups_status_req:
  20857. ups_status_response(ups_pdu.data);
  20858. 8028bca: 4808 ldr r0, [pc, #32] ; (8028bec <request_task+0x30>)
  20859. 8028bcc: f7ff fef4 bl 80289b8 <ups_status_response>
  20860. 8028bd0: 2009 movs r0, #9
  20861. 8028bd2: f7ff fea3 bl 802891c <send_MegaTec_cmd.part.0>
  20862. {
  20863. send_MegaTec_cmd(ups_status_req);
  20864. if (ups_megatec_rx_pdu())
  20865. ups_megatec_process_pdu(ups_status_req);
  20866. send_MegaTec_cmd(ups_info);
  20867. if (ups_megatec_rx_pdu())
  20868. 8028bd6: f7ff fecf bl 8028978 <ups_megatec_rx_pdu>
  20869. 8028bda: b110 cbz r0, 8028be2 <request_task+0x26>
  20870. {
  20871. case ups_status_req:
  20872. ups_status_response(ups_pdu.data);
  20873. break;
  20874. case ups_info:
  20875. ups_info_response(ups_pdu.data);
  20876. 8028bdc: 4803 ldr r0, [pc, #12] ; (8028bec <request_task+0x30>)
  20877. 8028bde: f7ff ffbb bl 8028b58 <ups_info_response>
  20878. ups_megatec_process_pdu(ups_status_req);
  20879. send_MegaTec_cmd(ups_info);
  20880. if (ups_megatec_rx_pdu())
  20881. ups_megatec_process_pdu(ups_info);
  20882. vTaskDelay(1000);
  20883. 8028be2: f44f 707a mov.w r0, #1000 ; 0x3e8
  20884. 8028be6: f000 fe65 bl 80298b4 <vTaskDelay>
  20885. }
  20886. 8028bea: e7e8 b.n 8028bbe <request_task+0x2>
  20887. 8028bec: 200028ae .word 0x200028ae
  20888. 08028bf0 <ups_megatec_init>:
  20889. }
  20890. void ups_megatec_init(void) {
  20891. 8028bf0: b51f push {r0, r1, r2, r3, r4, lr}
  20892. init_UPS_value();
  20893. 8028bf2: f7ff fea3 bl 802893c <init_UPS_value>
  20894. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  20895. 8028bf6: 2300 movs r3, #0
  20896. 8028bf8: 9300 str r3, [sp, #0]
  20897. 8028bfa: 9301 str r3, [sp, #4]
  20898. 8028bfc: 9302 str r3, [sp, #8]
  20899. 8028bfe: 9303 str r3, [sp, #12]
  20900. 8028c00: 4903 ldr r1, [pc, #12] ; (8028c10 <ups_megatec_init+0x20>)
  20901. 8028c02: 4804 ldr r0, [pc, #16] ; (8028c14 <ups_megatec_init+0x24>)
  20902. 8028c04: f44f 7280 mov.w r2, #256 ; 0x100
  20903. 8028c08: f000 fbba bl 8029380 <xTaskGenericCreate>
  20904. }
  20905. 8028c0c: b005 add sp, #20
  20906. 8028c0e: bd00 pop {pc}
  20907. 8028c10: 08035f59 .word 0x08035f59
  20908. 8028c14: 08028bbd .word 0x08028bbd
  20909. 08028c18 <rbuf32_init>:
  20910. #define _size_w(n) sizeof(n) / sizeof(int)
  20911. void rbuf32_init(rbuf_t *rbuf32, uint32_t *buffer, uint32_t size) {
  20912. rbuf32->buf_ptr = buffer;
  20913. rbuf32->size = size;
  20914. rbuf32->read_index = 0;
  20915. 8028c18: 2300 movs r3, #0
  20916. #define _size_w(n) sizeof(n) / sizeof(int)
  20917. void rbuf32_init(rbuf_t *rbuf32, uint32_t *buffer, uint32_t size) {
  20918. rbuf32->buf_ptr = buffer;
  20919. rbuf32->size = size;
  20920. 8028c1a: e880 0006 stmia.w r0, {r1, r2}
  20921. rbuf32->read_index = 0;
  20922. 8028c1e: 6083 str r3, [r0, #8]
  20923. rbuf32->write_index = 0;
  20924. 8028c20: 60c3 str r3, [r0, #12]
  20925. 8028c22: 4770 bx lr
  20926. 08028c24 <rbuf_isfull>:
  20927. return full_space;
  20928. }
  20929. bool rbuf_isfull(rbuf_t *rbuf) {
  20930. int r_tmp;
  20931. if (rbuf->write_index == (rbuf->size - 1)) {
  20932. 8028c24: 6842 ldr r2, [r0, #4]
  20933. 8028c26: 68c3 ldr r3, [r0, #12]
  20934. 8028c28: 6880 ldr r0, [r0, #8]
  20935. 8028c2a: 1e51 subs r1, r2, #1
  20936. 8028c2c: 428b cmp r3, r1
  20937. r_tmp = rbuf->read_index + rbuf->size;
  20938. 8028c2e: bf08 it eq
  20939. 8028c30: 1810 addeq r0, r2, r0
  20940. }
  20941. else
  20942. r_tmp = rbuf->read_index;
  20943. if (r_tmp - rbuf->write_index == 1)
  20944. 8028c32: 1ac0 subs r0, r0, r3
  20945. return true;
  20946. else
  20947. return false;
  20948. }
  20949. 8028c34: 1e42 subs r2, r0, #1
  20950. 8028c36: 4250 negs r0, r2
  20951. 8028c38: 4150 adcs r0, r2
  20952. 8028c3a: 4770 bx lr
  20953. 08028c3c <rbuf32_get>:
  20954. rbuf64->read_index = 0;
  20955. rbuf64->write_index = 0;
  20956. }
  20957. bool rbuf_isempty(rbuf_t *rbuf) {
  20958. if (rbuf->read_index == rbuf->write_index)
  20959. 8028c3c: 6883 ldr r3, [r0, #8]
  20960. 8028c3e: 68c2 ldr r2, [r0, #12]
  20961. 8028c40: 4293 cmp r3, r2
  20962. 8028c42: d105 bne.n 8028c50 <rbuf32_get+0x14>
  20963. 8028c44: e002 b.n 8028c4c <rbuf32_get+0x10>
  20964. /* Check whether buffer is not empty */
  20965. if (!rbuf_isempty(rbuf32)) {
  20966. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  20967. /* swap the read pointer */
  20968. if (rbuf32->read_index == (rbuf32->size))
  20969. rbuf32->read_index = 0;
  20970. 8028c46: 2300 movs r3, #0
  20971. 8028c48: 6083 str r3, [r0, #8]
  20972. 8028c4a: e00a b.n 8028c62 <rbuf32_get+0x26>
  20973. return true;
  20974. }
  20975. else
  20976. return false;
  20977. 8028c4c: 2000 movs r0, #0
  20978. 8028c4e: 4770 bx lr
  20979. }
  20980. bool rbuf32_get(rbuf_t *rbuf32, uint32_t *data) {
  20981. /* Check whether buffer is not empty */
  20982. if (!rbuf_isempty(rbuf32)) {
  20983. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  20984. 8028c50: 6802 ldr r2, [r0, #0]
  20985. 8028c52: f852 2023 ldr.w r2, [r2, r3, lsl #2]
  20986. 8028c56: 600a str r2, [r1, #0]
  20987. /* swap the read pointer */
  20988. if (rbuf32->read_index == (rbuf32->size))
  20989. 8028c58: 6842 ldr r2, [r0, #4]
  20990. }
  20991. bool rbuf32_get(rbuf_t *rbuf32, uint32_t *data) {
  20992. /* Check whether buffer is not empty */
  20993. if (!rbuf_isempty(rbuf32)) {
  20994. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  20995. 8028c5a: 3301 adds r3, #1
  20996. /* swap the read pointer */
  20997. if (rbuf32->read_index == (rbuf32->size))
  20998. 8028c5c: 4293 cmp r3, r2
  20999. }
  21000. bool rbuf32_get(rbuf_t *rbuf32, uint32_t *data) {
  21001. /* Check whether buffer is not empty */
  21002. if (!rbuf_isempty(rbuf32)) {
  21003. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  21004. 8028c5e: 6083 str r3, [r0, #8]
  21005. /* swap the read pointer */
  21006. if (rbuf32->read_index == (rbuf32->size))
  21007. 8028c60: d0f1 beq.n 8028c46 <rbuf32_get+0xa>
  21008. rbuf32->read_index = 0;
  21009. return true;
  21010. 8028c62: 2001 movs r0, #1
  21011. }
  21012. else
  21013. return false;
  21014. }
  21015. 8028c64: 4770 bx lr
  21016. 08028c66 <rbuf32_put>:
  21017. /*
  21018. * Oldest data is overwriting when write_ptr reaches read_ptr - 1 (!).
  21019. * For check use rbuf_isfull.
  21020. */
  21021. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  21022. 8028c66: b538 push {r3, r4, r5, lr}
  21023. 8028c68: 4604 mov r4, r0
  21024. 8028c6a: 460d mov r5, r1
  21025. if(!rbuf_isfull(rbuf32))
  21026. 8028c6c: f7ff ffda bl 8028c24 <rbuf_isfull>
  21027. 8028c70: b950 cbnz r0, 8028c88 <rbuf32_put+0x22>
  21028. {
  21029. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  21030. 8028c72: 68e3 ldr r3, [r4, #12]
  21031. 8028c74: 6822 ldr r2, [r4, #0]
  21032. 8028c76: f842 5023 str.w r5, [r2, r3, lsl #2]
  21033. /* swap the write pointer */
  21034. if (rbuf32->write_index == (rbuf32->size))
  21035. 8028c7a: 6862 ldr r2, [r4, #4]
  21036. */
  21037. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  21038. if(!rbuf_isfull(rbuf32))
  21039. {
  21040. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  21041. 8028c7c: 3301 adds r3, #1
  21042. /* swap the write pointer */
  21043. if (rbuf32->write_index == (rbuf32->size))
  21044. 8028c7e: 4293 cmp r3, r2
  21045. */
  21046. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  21047. if(!rbuf_isfull(rbuf32))
  21048. {
  21049. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  21050. 8028c80: 60e3 str r3, [r4, #12]
  21051. /* swap the write pointer */
  21052. if (rbuf32->write_index == (rbuf32->size))
  21053. 8028c82: d103 bne.n 8028c8c <rbuf32_put+0x26>
  21054. rbuf32->write_index = 0;
  21055. 8028c84: 60e0 str r0, [r4, #12]
  21056. 8028c86: e001 b.n 8028c8c <rbuf32_put+0x26>
  21057. return true;
  21058. }
  21059. else
  21060. return false;
  21061. 8028c88: 2000 movs r0, #0
  21062. 8028c8a: bd38 pop {r3, r4, r5, pc}
  21063. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  21064. if(!rbuf_isfull(rbuf32))
  21065. {
  21066. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  21067. /* swap the write pointer */
  21068. if (rbuf32->write_index == (rbuf32->size))
  21069. 8028c8c: 2001 movs r0, #1
  21070. rbuf32->write_index = 0;
  21071. return true;
  21072. }
  21073. else
  21074. return false;
  21075. }
  21076. 8028c8e: bd38 pop {r3, r4, r5, pc}
  21077. 08028c90 <vListInitialise>:
  21078. void vListInitialise( List_t * const pxList )
  21079. {
  21080. /* The list structure contains a list item which is used to mark the
  21081. end of the list. To initialise the list the list end is inserted
  21082. as the only list entry. */
  21083. pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
  21084. 8028c90: f100 0308 add.w r3, r0, #8
  21085. 8028c94: 6043 str r3, [r0, #4]
  21086. /* The list end value is the highest possible value in the list to
  21087. ensure it remains at the end of the list. */
  21088. pxList->xListEnd.xItemValue = portMAX_DELAY;
  21089. 8028c96: f04f 32ff mov.w r2, #4294967295
  21090. /* The list end next and previous pointers point to itself so we know
  21091. when the list is empty. */
  21092. pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
  21093. 8028c9a: 60c3 str r3, [r0, #12]
  21094. pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
  21095. 8028c9c: 6103 str r3, [r0, #16]
  21096. pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
  21097. 8028c9e: 2300 movs r3, #0
  21098. as the only list entry. */
  21099. pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
  21100. /* The list end value is the highest possible value in the list to
  21101. ensure it remains at the end of the list. */
  21102. pxList->xListEnd.xItemValue = portMAX_DELAY;
  21103. 8028ca0: 6082 str r2, [r0, #8]
  21104. /* The list end next and previous pointers point to itself so we know
  21105. when the list is empty. */
  21106. pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
  21107. pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
  21108. pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
  21109. 8028ca2: 6003 str r3, [r0, #0]
  21110. 8028ca4: 4770 bx lr
  21111. 08028ca6 <vListInitialiseItem>:
  21112. /*-----------------------------------------------------------*/
  21113. void vListInitialiseItem( ListItem_t * const pxItem )
  21114. {
  21115. /* Make sure the list item is not recorded as being on a list. */
  21116. pxItem->pvContainer = NULL;
  21117. 8028ca6: 2300 movs r3, #0
  21118. 8028ca8: 6103 str r3, [r0, #16]
  21119. 8028caa: 4770 bx lr
  21120. 08028cac <vListInsertEnd>:
  21121. }
  21122. /*-----------------------------------------------------------*/
  21123. void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
  21124. {
  21125. ListItem_t * const pxIndex = pxList->pxIndex;
  21126. 8028cac: 6843 ldr r3, [r0, #4]
  21127. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  21128. pxIndex->pxPrevious->pxNext = pxNewListItem;
  21129. pxIndex->pxPrevious = pxNewListItem;
  21130. /* Remember which list the item is in. */
  21131. pxNewListItem->pvContainer = ( void * ) pxList;
  21132. 8028cae: 6108 str r0, [r1, #16]
  21133. /* Insert a new list item into pxList, but rather than sort the list,
  21134. makes the new list item the last item to be removed by a call to
  21135. listGET_OWNER_OF_NEXT_ENTRY(). */
  21136. pxNewListItem->pxNext = pxIndex;
  21137. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  21138. 8028cb0: 689a ldr r2, [r3, #8]
  21139. listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );
  21140. /* Insert a new list item into pxList, but rather than sort the list,
  21141. makes the new list item the last item to be removed by a call to
  21142. listGET_OWNER_OF_NEXT_ENTRY(). */
  21143. pxNewListItem->pxNext = pxIndex;
  21144. 8028cb2: 604b str r3, [r1, #4]
  21145. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  21146. 8028cb4: 608a str r2, [r1, #8]
  21147. pxIndex->pxPrevious->pxNext = pxNewListItem;
  21148. 8028cb6: 689a ldr r2, [r3, #8]
  21149. pxIndex->pxPrevious = pxNewListItem;
  21150. 8028cb8: 6099 str r1, [r3, #8]
  21151. /* Remember which list the item is in. */
  21152. pxNewListItem->pvContainer = ( void * ) pxList;
  21153. ( pxList->uxNumberOfItems )++;
  21154. 8028cba: 6803 ldr r3, [r0, #0]
  21155. /* Insert a new list item into pxList, but rather than sort the list,
  21156. makes the new list item the last item to be removed by a call to
  21157. listGET_OWNER_OF_NEXT_ENTRY(). */
  21158. pxNewListItem->pxNext = pxIndex;
  21159. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  21160. pxIndex->pxPrevious->pxNext = pxNewListItem;
  21161. 8028cbc: 6051 str r1, [r2, #4]
  21162. pxIndex->pxPrevious = pxNewListItem;
  21163. /* Remember which list the item is in. */
  21164. pxNewListItem->pvContainer = ( void * ) pxList;
  21165. ( pxList->uxNumberOfItems )++;
  21166. 8028cbe: 3301 adds r3, #1
  21167. 8028cc0: 6003 str r3, [r0, #0]
  21168. 8028cc2: 4770 bx lr
  21169. 08028cc4 <vListInsert>:
  21170. /*-----------------------------------------------------------*/
  21171. void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
  21172. {
  21173. ListItem_t *pxIterator;
  21174. const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
  21175. 8028cc4: 680a ldr r2, [r1, #0]
  21176. new list item should be placed after it. This ensures that TCB's which are
  21177. stored in ready lists (all of which have the same xItemValue value) get a
  21178. share of the CPU. However, if the xItemValue is the same as the back marker
  21179. the iteration loop below will not end. Therefore the value is checked
  21180. first, and the algorithm slightly modified if necessary. */
  21181. if( xValueOfInsertion == portMAX_DELAY )
  21182. 8028cc6: 1c53 adds r3, r2, #1
  21183. ( pxList->uxNumberOfItems )++;
  21184. }
  21185. /*-----------------------------------------------------------*/
  21186. void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
  21187. {
  21188. 8028cc8: b530 push {r4, r5, lr}
  21189. new list item should be placed after it. This ensures that TCB's which are
  21190. stored in ready lists (all of which have the same xItemValue value) get a
  21191. share of the CPU. However, if the xItemValue is the same as the back marker
  21192. the iteration loop below will not end. Therefore the value is checked
  21193. first, and the algorithm slightly modified if necessary. */
  21194. if( xValueOfInsertion == portMAX_DELAY )
  21195. 8028cca: d101 bne.n 8028cd0 <vListInsert+0xc>
  21196. {
  21197. pxIterator = pxList->xListEnd.pxPrevious;
  21198. 8028ccc: 6903 ldr r3, [r0, #16]
  21199. 8028cce: e007 b.n 8028ce0 <vListInsert+0x1c>
  21200. 4) Using a queue or semaphore before it has been initialised or
  21201. before the scheduler has been started (are interrupts firing
  21202. before vTaskStartScheduler() has been called?).
  21203. **********************************************************************/
  21204. for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
  21205. 8028cd0: f100 0308 add.w r3, r0, #8
  21206. 8028cd4: e000 b.n 8028cd8 <vListInsert+0x14>
  21207. 8028cd6: 4623 mov r3, r4
  21208. 8028cd8: 685c ldr r4, [r3, #4]
  21209. 8028cda: 6825 ldr r5, [r4, #0]
  21210. 8028cdc: 4295 cmp r5, r2
  21211. 8028cde: d9fa bls.n 8028cd6 <vListInsert+0x12>
  21212. /* There is nothing to do here, just iterating to the wanted
  21213. insertion position. */
  21214. }
  21215. }
  21216. pxNewListItem->pxNext = pxIterator->pxNext;
  21217. 8028ce0: 685a ldr r2, [r3, #4]
  21218. pxNewListItem->pxPrevious = pxIterator;
  21219. pxIterator->pxNext = pxNewListItem;
  21220. /* Remember which list the item is in. This allows fast removal of the
  21221. item later. */
  21222. pxNewListItem->pvContainer = ( void * ) pxList;
  21223. 8028ce2: 6108 str r0, [r1, #16]
  21224. /* There is nothing to do here, just iterating to the wanted
  21225. insertion position. */
  21226. }
  21227. }
  21228. pxNewListItem->pxNext = pxIterator->pxNext;
  21229. 8028ce4: 604a str r2, [r1, #4]
  21230. pxNewListItem->pxNext->pxPrevious = pxNewListItem;
  21231. 8028ce6: 6091 str r1, [r2, #8]
  21232. pxNewListItem->pxPrevious = pxIterator;
  21233. pxIterator->pxNext = pxNewListItem;
  21234. 8028ce8: 6059 str r1, [r3, #4]
  21235. }
  21236. }
  21237. pxNewListItem->pxNext = pxIterator->pxNext;
  21238. pxNewListItem->pxNext->pxPrevious = pxNewListItem;
  21239. pxNewListItem->pxPrevious = pxIterator;
  21240. 8028cea: 608b str r3, [r1, #8]
  21241. /* Remember which list the item is in. This allows fast removal of the
  21242. item later. */
  21243. pxNewListItem->pvContainer = ( void * ) pxList;
  21244. ( pxList->uxNumberOfItems )++;
  21245. 8028cec: 6803 ldr r3, [r0, #0]
  21246. 8028cee: 3301 adds r3, #1
  21247. 8028cf0: 6003 str r3, [r0, #0]
  21248. 8028cf2: bd30 pop {r4, r5, pc}
  21249. 08028cf4 <uxListRemove>:
  21250. {
  21251. /* The list item knows which list it is in. Obtain the list from the list
  21252. item. */
  21253. List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
  21254. pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
  21255. 8028cf4: 6841 ldr r1, [r0, #4]
  21256. 8028cf6: 6882 ldr r2, [r0, #8]
  21257. UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
  21258. {
  21259. /* The list item knows which list it is in. Obtain the list from the list
  21260. item. */
  21261. List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
  21262. 8028cf8: 6903 ldr r3, [r0, #16]
  21263. pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
  21264. 8028cfa: 608a str r2, [r1, #8]
  21265. pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
  21266. 8028cfc: 6882 ldr r2, [r0, #8]
  21267. 8028cfe: 6051 str r1, [r2, #4]
  21268. /* Make sure the index is left pointing to a valid item. */
  21269. if( pxList->pxIndex == pxItemToRemove )
  21270. 8028d00: 6859 ldr r1, [r3, #4]
  21271. 8028d02: 4281 cmp r1, r0
  21272. {
  21273. pxList->pxIndex = pxItemToRemove->pxPrevious;
  21274. 8028d04: bf08 it eq
  21275. 8028d06: 605a streq r2, [r3, #4]
  21276. else
  21277. {
  21278. mtCOVERAGE_TEST_MARKER();
  21279. }
  21280. pxItemToRemove->pvContainer = NULL;
  21281. 8028d08: 2200 movs r2, #0
  21282. 8028d0a: 6102 str r2, [r0, #16]
  21283. ( pxList->uxNumberOfItems )--;
  21284. 8028d0c: 6818 ldr r0, [r3, #0]
  21285. 8028d0e: 3801 subs r0, #1
  21286. 8028d10: 6018 str r0, [r3, #0]
  21287. return pxList->uxNumberOfItems;
  21288. }
  21289. 8028d12: 4770 bx lr
  21290. 08028d14 <prvUnlockQueue>:
  21291. }
  21292. }
  21293. /*-----------------------------------------------------------*/
  21294. static void prvUnlockQueue( Queue_t * const pxQueue )
  21295. {
  21296. 8028d14: b538 push {r3, r4, r5, lr}
  21297. 8028d16: 4604 mov r4, r0
  21298. {
  21299. /* Tasks that are removed from the event list will get added to
  21300. the pending ready list as the scheduler is still suspended. */
  21301. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  21302. {
  21303. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  21304. 8028d18: f104 0524 add.w r5, r4, #36 ; 0x24
  21305. /* The lock counts contains the number of extra data items placed or
  21306. removed from the queue while the queue was locked. When a queue is
  21307. locked items can be added or removed, but the event lists cannot be
  21308. updated. */
  21309. taskENTER_CRITICAL();
  21310. 8028d1c: f001 f994 bl 802a048 <vPortEnterCritical>
  21311. {
  21312. /* See if data was added to the queue while it was locked. */
  21313. while( pxQueue->xTxLock > queueLOCKED_UNMODIFIED )
  21314. 8028d20: e00a b.n 8028d38 <prvUnlockQueue+0x24>
  21315. }
  21316. #else /* configUSE_QUEUE_SETS */
  21317. {
  21318. /* Tasks that are removed from the event list will get added to
  21319. the pending ready list as the scheduler is still suspended. */
  21320. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  21321. 8028d22: 6a63 ldr r3, [r4, #36] ; 0x24
  21322. 8028d24: b15b cbz r3, 8028d3e <prvUnlockQueue+0x2a>
  21323. {
  21324. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  21325. 8028d26: 4628 mov r0, r5
  21326. 8028d28: f000 fe82 bl 8029a30 <xTaskRemoveFromEventList>
  21327. 8028d2c: b108 cbz r0, 8028d32 <prvUnlockQueue+0x1e>
  21328. {
  21329. /* The task waiting has a higher priority so record that a
  21330. context switch is required. */
  21331. vTaskMissedYield();
  21332. 8028d2e: f000 fef9 bl 8029b24 <vTaskMissedYield>
  21333. break;
  21334. }
  21335. }
  21336. #endif /* configUSE_QUEUE_SETS */
  21337. --( pxQueue->xTxLock );
  21338. 8028d32: 6ca3 ldr r3, [r4, #72] ; 0x48
  21339. 8028d34: 3b01 subs r3, #1
  21340. 8028d36: 64a3 str r3, [r4, #72] ; 0x48
  21341. locked items can be added or removed, but the event lists cannot be
  21342. updated. */
  21343. taskENTER_CRITICAL();
  21344. {
  21345. /* See if data was added to the queue while it was locked. */
  21346. while( pxQueue->xTxLock > queueLOCKED_UNMODIFIED )
  21347. 8028d38: 6ca3 ldr r3, [r4, #72] ; 0x48
  21348. 8028d3a: 2b00 cmp r3, #0
  21349. 8028d3c: dcf1 bgt.n 8028d22 <prvUnlockQueue+0xe>
  21350. #endif /* configUSE_QUEUE_SETS */
  21351. --( pxQueue->xTxLock );
  21352. }
  21353. pxQueue->xTxLock = queueUNLOCKED;
  21354. 8028d3e: f04f 33ff mov.w r3, #4294967295
  21355. 8028d42: 64a3 str r3, [r4, #72] ; 0x48
  21356. }
  21357. taskEXIT_CRITICAL();
  21358. 8028d44: f001 f9ac bl 802a0a0 <vPortExitCritical>
  21359. {
  21360. while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED )
  21361. {
  21362. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  21363. {
  21364. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  21365. 8028d48: f104 0510 add.w r5, r4, #16
  21366. pxQueue->xTxLock = queueUNLOCKED;
  21367. }
  21368. taskEXIT_CRITICAL();
  21369. /* Do the same for the Rx lock. */
  21370. taskENTER_CRITICAL();
  21371. 8028d4c: f001 f97c bl 802a048 <vPortEnterCritical>
  21372. {
  21373. while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED )
  21374. 8028d50: e00a b.n 8028d68 <prvUnlockQueue+0x54>
  21375. {
  21376. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  21377. 8028d52: 6923 ldr r3, [r4, #16]
  21378. 8028d54: b15b cbz r3, 8028d6e <prvUnlockQueue+0x5a>
  21379. {
  21380. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  21381. 8028d56: 4628 mov r0, r5
  21382. 8028d58: f000 fe6a bl 8029a30 <xTaskRemoveFromEventList>
  21383. 8028d5c: b108 cbz r0, 8028d62 <prvUnlockQueue+0x4e>
  21384. {
  21385. vTaskMissedYield();
  21386. 8028d5e: f000 fee1 bl 8029b24 <vTaskMissedYield>
  21387. else
  21388. {
  21389. mtCOVERAGE_TEST_MARKER();
  21390. }
  21391. --( pxQueue->xRxLock );
  21392. 8028d62: 6c63 ldr r3, [r4, #68] ; 0x44
  21393. 8028d64: 3b01 subs r3, #1
  21394. 8028d66: 6463 str r3, [r4, #68] ; 0x44
  21395. taskEXIT_CRITICAL();
  21396. /* Do the same for the Rx lock. */
  21397. taskENTER_CRITICAL();
  21398. {
  21399. while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED )
  21400. 8028d68: 6c63 ldr r3, [r4, #68] ; 0x44
  21401. 8028d6a: 2b00 cmp r3, #0
  21402. 8028d6c: dcf1 bgt.n 8028d52 <prvUnlockQueue+0x3e>
  21403. {
  21404. break;
  21405. }
  21406. }
  21407. pxQueue->xRxLock = queueUNLOCKED;
  21408. 8028d6e: f04f 33ff mov.w r3, #4294967295
  21409. 8028d72: 6463 str r3, [r4, #68] ; 0x44
  21410. }
  21411. taskEXIT_CRITICAL();
  21412. }
  21413. 8028d74: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  21414. }
  21415. }
  21416. pxQueue->xRxLock = queueUNLOCKED;
  21417. }
  21418. taskEXIT_CRITICAL();
  21419. 8028d78: f001 b992 b.w 802a0a0 <vPortExitCritical>
  21420. 08028d7c <prvCopyDataFromQueue>:
  21421. }
  21422. /*-----------------------------------------------------------*/
  21423. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  21424. {
  21425. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  21426. 8028d7c: 6c02 ldr r2, [r0, #64] ; 0x40
  21427. return xReturn;
  21428. }
  21429. /*-----------------------------------------------------------*/
  21430. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  21431. {
  21432. 8028d7e: b530 push {r4, r5, lr}
  21433. 8028d80: 4603 mov r3, r0
  21434. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  21435. 8028d82: b16a cbz r2, 8028da0 <prvCopyDataFromQueue+0x24>
  21436. {
  21437. pxQueue->u.pcReadFrom += pxQueue->uxItemSize;
  21438. 8028d84: 68c4 ldr r4, [r0, #12]
  21439. if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */
  21440. 8028d86: 6845 ldr r5, [r0, #4]
  21441. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  21442. {
  21443. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  21444. {
  21445. pxQueue->u.pcReadFrom += pxQueue->uxItemSize;
  21446. 8028d88: 18a4 adds r4, r4, r2
  21447. if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */
  21448. 8028d8a: 42ac cmp r4, r5
  21449. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  21450. {
  21451. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  21452. {
  21453. pxQueue->u.pcReadFrom += pxQueue->uxItemSize;
  21454. 8028d8c: 60c4 str r4, [r0, #12]
  21455. if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */
  21456. {
  21457. pxQueue->u.pcReadFrom = pxQueue->pcHead;
  21458. 8028d8e: bf24 itt cs
  21459. 8028d90: 6804 ldrcs r4, [r0, #0]
  21460. 8028d92: 60c4 strcs r4, [r0, #12]
  21461. }
  21462. else
  21463. {
  21464. mtCOVERAGE_TEST_MARKER();
  21465. }
  21466. ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 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. */
  21467. 8028d94: 4608 mov r0, r1
  21468. 8028d96: 68d9 ldr r1, [r3, #12]
  21469. }
  21470. }
  21471. 8028d98: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
  21472. }
  21473. else
  21474. {
  21475. mtCOVERAGE_TEST_MARKER();
  21476. }
  21477. ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 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. */
  21478. 8028d9c: f7f8 bdd6 b.w 802194c <memcpy>
  21479. 8028da0: bd30 pop {r4, r5, pc}
  21480. 08028da2 <prvCopyDataToQueue>:
  21481. #endif /* configUSE_TRACE_FACILITY */
  21482. /*-----------------------------------------------------------*/
  21483. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  21484. {
  21485. 8028da2: b538 push {r3, r4, r5, lr}
  21486. 8028da4: 4615 mov r5, r2
  21487. BaseType_t xReturn = pdFALSE;
  21488. if( pxQueue->uxItemSize == ( UBaseType_t ) 0 )
  21489. 8028da6: 6c02 ldr r2, [r0, #64] ; 0x40
  21490. #endif /* configUSE_TRACE_FACILITY */
  21491. /*-----------------------------------------------------------*/
  21492. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  21493. {
  21494. 8028da8: 4604 mov r4, r0
  21495. BaseType_t xReturn = pdFALSE;
  21496. if( pxQueue->uxItemSize == ( UBaseType_t ) 0 )
  21497. 8028daa: b93a cbnz r2, 8028dbc <prvCopyDataToQueue+0x1a>
  21498. {
  21499. #if ( configUSE_MUTEXES == 1 )
  21500. {
  21501. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  21502. 8028dac: 6805 ldr r5, [r0, #0]
  21503. 8028dae: b105 cbz r5, 8028db2 <prvCopyDataToQueue+0x10>
  21504. 8028db0: e028 b.n 8028e04 <prvCopyDataToQueue+0x62>
  21505. {
  21506. /* The mutex is no longer being held. */
  21507. xReturn = xTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder );
  21508. 8028db2: 6840 ldr r0, [r0, #4]
  21509. 8028db4: f000 ff18 bl 8029be8 <xTaskPriorityDisinherit>
  21510. pxQueue->pxMutexHolder = NULL;
  21511. 8028db8: 6065 str r5, [r4, #4]
  21512. 8028dba: e024 b.n 8028e06 <prvCopyDataToQueue+0x64>
  21513. mtCOVERAGE_TEST_MARKER();
  21514. }
  21515. }
  21516. #endif /* configUSE_MUTEXES */
  21517. }
  21518. else if( xPosition == queueSEND_TO_BACK )
  21519. 8028dbc: b96d cbnz r5, 8028dda <prvCopyDataToQueue+0x38>
  21520. {
  21521. ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 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. */
  21522. 8028dbe: 6880 ldr r0, [r0, #8]
  21523. 8028dc0: f7f8 fdc4 bl 802194c <memcpy>
  21524. pxQueue->pcWriteTo += pxQueue->uxItemSize;
  21525. 8028dc4: 68a2 ldr r2, [r4, #8]
  21526. 8028dc6: 6c23 ldr r3, [r4, #64] ; 0x40
  21527. 8028dc8: 18d3 adds r3, r2, r3
  21528. if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  21529. 8028dca: 6862 ldr r2, [r4, #4]
  21530. #endif /* configUSE_MUTEXES */
  21531. }
  21532. else if( xPosition == queueSEND_TO_BACK )
  21533. {
  21534. ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 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. */
  21535. pxQueue->pcWriteTo += pxQueue->uxItemSize;
  21536. 8028dcc: 60a3 str r3, [r4, #8]
  21537. if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  21538. 8028dce: 4293 cmp r3, r2
  21539. 8028dd0: d318 bcc.n 8028e04 <prvCopyDataToQueue+0x62>
  21540. {
  21541. pxQueue->pcWriteTo = pxQueue->pcHead;
  21542. 8028dd2: 6823 ldr r3, [r4, #0]
  21543. #endif /* configUSE_TRACE_FACILITY */
  21544. /*-----------------------------------------------------------*/
  21545. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  21546. {
  21547. BaseType_t xReturn = pdFALSE;
  21548. 8028dd4: 4628 mov r0, r5
  21549. {
  21550. ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 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. */
  21551. pxQueue->pcWriteTo += pxQueue->uxItemSize;
  21552. if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  21553. {
  21554. pxQueue->pcWriteTo = pxQueue->pcHead;
  21555. 8028dd6: 60a3 str r3, [r4, #8]
  21556. 8028dd8: e015 b.n 8028e06 <prvCopyDataToQueue+0x64>
  21557. mtCOVERAGE_TEST_MARKER();
  21558. }
  21559. }
  21560. else
  21561. {
  21562. ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  21563. 8028dda: 68c0 ldr r0, [r0, #12]
  21564. 8028ddc: f7f8 fdb6 bl 802194c <memcpy>
  21565. pxQueue->u.pcReadFrom -= pxQueue->uxItemSize;
  21566. 8028de0: 6c23 ldr r3, [r4, #64] ; 0x40
  21567. 8028de2: 68e2 ldr r2, [r4, #12]
  21568. if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  21569. 8028de4: 6821 ldr r1, [r4, #0]
  21570. }
  21571. }
  21572. else
  21573. {
  21574. ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  21575. pxQueue->u.pcReadFrom -= pxQueue->uxItemSize;
  21576. 8028de6: 425b negs r3, r3
  21577. 8028de8: 18d2 adds r2, r2, r3
  21578. if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  21579. 8028dea: 428a cmp r2, r1
  21580. }
  21581. }
  21582. else
  21583. {
  21584. ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  21585. pxQueue->u.pcReadFrom -= pxQueue->uxItemSize;
  21586. 8028dec: 60e2 str r2, [r4, #12]
  21587. if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  21588. 8028dee: d202 bcs.n 8028df6 <prvCopyDataToQueue+0x54>
  21589. {
  21590. pxQueue->u.pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize );
  21591. 8028df0: 6862 ldr r2, [r4, #4]
  21592. 8028df2: 18d3 adds r3, r2, r3
  21593. 8028df4: 60e3 str r3, [r4, #12]
  21594. else
  21595. {
  21596. mtCOVERAGE_TEST_MARKER();
  21597. }
  21598. if( xPosition == queueOVERWRITE )
  21599. 8028df6: 2d02 cmp r5, #2
  21600. 8028df8: d104 bne.n 8028e04 <prvCopyDataToQueue+0x62>
  21601. {
  21602. if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )
  21603. 8028dfa: 6ba3 ldr r3, [r4, #56] ; 0x38
  21604. 8028dfc: b113 cbz r3, 8028e04 <prvCopyDataToQueue+0x62>
  21605. {
  21606. /* An item is not being added but overwritten, so subtract
  21607. one from the recorded number of items in the queue so when
  21608. one is added again below the number of recorded items remains
  21609. correct. */
  21610. --( pxQueue->uxMessagesWaiting );
  21611. 8028dfe: 6ba3 ldr r3, [r4, #56] ; 0x38
  21612. 8028e00: 3b01 subs r3, #1
  21613. 8028e02: 63a3 str r3, [r4, #56] ; 0x38
  21614. #endif /* configUSE_TRACE_FACILITY */
  21615. /*-----------------------------------------------------------*/
  21616. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  21617. {
  21618. BaseType_t xReturn = pdFALSE;
  21619. 8028e04: 2000 movs r0, #0
  21620. {
  21621. mtCOVERAGE_TEST_MARKER();
  21622. }
  21623. }
  21624. ++( pxQueue->uxMessagesWaiting );
  21625. 8028e06: 6ba3 ldr r3, [r4, #56] ; 0x38
  21626. 8028e08: 3301 adds r3, #1
  21627. 8028e0a: 63a3 str r3, [r4, #56] ; 0x38
  21628. return xReturn;
  21629. }
  21630. 8028e0c: bd38 pop {r3, r4, r5, pc}
  21631. 08028e0e <xQueueGenericReset>:
  21632. } \
  21633. taskEXIT_CRITICAL()
  21634. /*-----------------------------------------------------------*/
  21635. BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue )
  21636. {
  21637. 8028e0e: b538 push {r3, r4, r5, lr}
  21638. 8028e10: 460d mov r5, r1
  21639. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  21640. configASSERT( pxQueue );
  21641. 8028e12: 4604 mov r4, r0
  21642. 8028e14: b910 cbnz r0, 8028e1c <xQueueGenericReset+0xe>
  21643. 8028e16: f001 f90f bl 802a038 <ulPortSetInterruptMask>
  21644. 8028e1a: e7fe b.n 8028e1a <xQueueGenericReset+0xc>
  21645. taskENTER_CRITICAL();
  21646. 8028e1c: f001 f914 bl 802a048 <vPortEnterCritical>
  21647. {
  21648. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  21649. 8028e20: 6823 ldr r3, [r4, #0]
  21650. 8028e22: 6be0 ldr r0, [r4, #60] ; 0x3c
  21651. 8028e24: 6c22 ldr r2, [r4, #64] ; 0x40
  21652. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  21653. pxQueue->pcWriteTo = pxQueue->pcHead;
  21654. 8028e26: 60a3 str r3, [r4, #8]
  21655. configASSERT( pxQueue );
  21656. taskENTER_CRITICAL();
  21657. {
  21658. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  21659. 8028e28: fb00 3102 mla r1, r0, r2, r3
  21660. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  21661. pxQueue->pcWriteTo = pxQueue->pcHead;
  21662. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  21663. 8028e2c: 3801 subs r0, #1
  21664. 8028e2e: fb02 3300 mla r3, r2, r0, r3
  21665. configASSERT( pxQueue );
  21666. taskENTER_CRITICAL();
  21667. {
  21668. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  21669. 8028e32: 6061 str r1, [r4, #4]
  21670. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  21671. pxQueue->pcWriteTo = pxQueue->pcHead;
  21672. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  21673. 8028e34: 60e3 str r3, [r4, #12]
  21674. configASSERT( pxQueue );
  21675. taskENTER_CRITICAL();
  21676. {
  21677. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  21678. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  21679. 8028e36: 2100 movs r1, #0
  21680. pxQueue->pcWriteTo = pxQueue->pcHead;
  21681. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  21682. pxQueue->xRxLock = queueUNLOCKED;
  21683. 8028e38: f04f 33ff mov.w r3, #4294967295
  21684. configASSERT( pxQueue );
  21685. taskENTER_CRITICAL();
  21686. {
  21687. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  21688. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  21689. 8028e3c: 63a1 str r1, [r4, #56] ; 0x38
  21690. pxQueue->pcWriteTo = pxQueue->pcHead;
  21691. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  21692. pxQueue->xRxLock = queueUNLOCKED;
  21693. 8028e3e: 6463 str r3, [r4, #68] ; 0x44
  21694. pxQueue->xTxLock = queueUNLOCKED;
  21695. 8028e40: 64a3 str r3, [r4, #72] ; 0x48
  21696. if( xNewQueue == pdFALSE )
  21697. 8028e42: b955 cbnz r5, 8028e5a <xQueueGenericReset+0x4c>
  21698. /* If there are tasks blocked waiting to read from the queue, then
  21699. the tasks will remain blocked as after this function exits the queue
  21700. will still be empty. If there are tasks blocked waiting to write to
  21701. the queue, then one should be unblocked as after this function exits
  21702. it will be possible to write to it. */
  21703. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  21704. 8028e44: 6923 ldr r3, [r4, #16]
  21705. 8028e46: b183 cbz r3, 8028e6a <xQueueGenericReset+0x5c>
  21706. {
  21707. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE )
  21708. 8028e48: f104 0010 add.w r0, r4, #16
  21709. 8028e4c: f000 fdf0 bl 8029a30 <xTaskRemoveFromEventList>
  21710. 8028e50: 2801 cmp r0, #1
  21711. 8028e52: d10a bne.n 8028e6a <xQueueGenericReset+0x5c>
  21712. {
  21713. queueYIELD_IF_USING_PREEMPTION();
  21714. 8028e54: f001 f8e4 bl 802a020 <vPortYield>
  21715. 8028e58: e007 b.n 8028e6a <xQueueGenericReset+0x5c>
  21716. }
  21717. }
  21718. else
  21719. {
  21720. /* Ensure the event queues start in the correct state. */
  21721. vListInitialise( &( pxQueue->xTasksWaitingToSend ) );
  21722. 8028e5a: f104 0010 add.w r0, r4, #16
  21723. 8028e5e: f7ff ff17 bl 8028c90 <vListInitialise>
  21724. vListInitialise( &( pxQueue->xTasksWaitingToReceive ) );
  21725. 8028e62: f104 0024 add.w r0, r4, #36 ; 0x24
  21726. 8028e66: f7ff ff13 bl 8028c90 <vListInitialise>
  21727. }
  21728. }
  21729. taskEXIT_CRITICAL();
  21730. 8028e6a: f001 f919 bl 802a0a0 <vPortExitCritical>
  21731. /* A value is returned for calling semantic consistency with previous
  21732. versions. */
  21733. return pdPASS;
  21734. }
  21735. 8028e6e: 2001 movs r0, #1
  21736. 8028e70: bd38 pop {r3, r4, r5, pc}
  21737. 08028e72 <xQueueGenericCreate>:
  21738. /*-----------------------------------------------------------*/
  21739. QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType )
  21740. {
  21741. 8028e72: b5f8 push {r3, r4, r5, r6, r7, lr}
  21742. 8028e74: 460d mov r5, r1
  21743. 8028e76: 4617 mov r7, r2
  21744. /* Remove compiler warnings about unused parameters should
  21745. configUSE_TRACE_FACILITY not be set to 1. */
  21746. ( void ) ucQueueType;
  21747. configASSERT( uxQueueLength > ( UBaseType_t ) 0 );
  21748. 8028e78: 4606 mov r6, r0
  21749. 8028e7a: b910 cbnz r0, 8028e82 <xQueueGenericCreate+0x10>
  21750. 8028e7c: f001 f8dc bl 802a038 <ulPortSetInterruptMask>
  21751. 8028e80: e7fe b.n 8028e80 <xQueueGenericCreate+0xe>
  21752. if( uxItemSize == ( UBaseType_t ) 0 )
  21753. 8028e82: b111 cbz r1, 8028e8a <xQueueGenericCreate+0x18>
  21754. }
  21755. else
  21756. {
  21757. /* The queue is one byte longer than asked for to make wrap checking
  21758. easier/faster. */
  21759. xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  21760. 8028e84: 4348 muls r0, r1
  21761. 8028e86: 3001 adds r0, #1
  21762. 8028e88: e000 b.n 8028e8c <xQueueGenericCreate+0x1a>
  21763. configASSERT( uxQueueLength > ( UBaseType_t ) 0 );
  21764. if( uxItemSize == ( UBaseType_t ) 0 )
  21765. {
  21766. /* There is not going to be a queue storage area. */
  21767. xQueueSizeInBytes = ( size_t ) 0;
  21768. 8028e8a: 4608 mov r0, r1
  21769. easier/faster. */
  21770. xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  21771. }
  21772. /* Allocate the new queue structure and storage area. */
  21773. pcAllocatedBuffer = ( int8_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes );
  21774. 8028e8c: 3054 adds r0, #84 ; 0x54
  21775. 8028e8e: f001 f9e9 bl 802a264 <pvPortMalloc>
  21776. if( pcAllocatedBuffer != NULL )
  21777. 8028e92: 4604 mov r4, r0
  21778. 8028e94: b138 cbz r0, 8028ea6 <xQueueGenericCreate+0x34>
  21779. {
  21780. pxNewQueue = ( Queue_t * ) pcAllocatedBuffer; /*lint !e826 MISRA The buffer cannot be to small because it was dimensioned by sizeof( Queue_t ) + xQueueSizeInBytes. */
  21781. if( uxItemSize == ( UBaseType_t ) 0 )
  21782. 8028e96: b90d cbnz r5, 8028e9c <xQueueGenericCreate+0x2a>
  21783. {
  21784. /* No RAM was allocated for the queue storage area, but PC head
  21785. cannot be set to NULL because NULL is used as a key to say the queue
  21786. is used as a mutex. Therefore just set pcHead to point to the queue
  21787. as a benign value that is known to be within the memory map. */
  21788. pxNewQueue->pcHead = ( int8_t * ) pxNewQueue;
  21789. 8028e98: 6020 str r0, [r4, #0]
  21790. 8028e9a: e007 b.n 8028eac <xQueueGenericCreate+0x3a>
  21791. }
  21792. else
  21793. {
  21794. /* Jump past the queue structure to find the location of the queue
  21795. storage area - adding the padding bytes to get a better alignment. */
  21796. pxNewQueue->pcHead = pcAllocatedBuffer + sizeof( Queue_t );
  21797. 8028e9c: f100 0354 add.w r3, r0, #84 ; 0x54
  21798. 8028ea0: 6003 str r3, [r0, #0]
  21799. 8028ea2: e003 b.n 8028eac <xQueueGenericCreate+0x3a>
  21800. 8028ea4: e7fe b.n 8028ea4 <xQueueGenericCreate+0x32>
  21801. else
  21802. {
  21803. mtCOVERAGE_TEST_MARKER();
  21804. }
  21805. configASSERT( xReturn );
  21806. 8028ea6: f001 f8c7 bl 802a038 <ulPortSetInterruptMask>
  21807. 8028eaa: e7fb b.n 8028ea4 <xQueueGenericCreate+0x32>
  21808. pxNewQueue->pcHead = pcAllocatedBuffer + sizeof( Queue_t );
  21809. }
  21810. /* Initialise the queue members as described above where the queue type
  21811. is defined. */
  21812. pxNewQueue->uxLength = uxQueueLength;
  21813. 8028eac: 63e6 str r6, [r4, #60] ; 0x3c
  21814. pxNewQueue->uxItemSize = uxItemSize;
  21815. 8028eae: 6425 str r5, [r4, #64] ; 0x40
  21816. ( void ) xQueueGenericReset( pxNewQueue, pdTRUE );
  21817. 8028eb0: 4620 mov r0, r4
  21818. 8028eb2: 2101 movs r1, #1
  21819. 8028eb4: f7ff ffab bl 8028e0e <xQueueGenericReset>
  21820. #if ( configUSE_TRACE_FACILITY == 1 )
  21821. {
  21822. pxNewQueue->ucQueueType = ucQueueType;
  21823. 8028eb8: f884 7050 strb.w r7, [r4, #80] ; 0x50
  21824. }
  21825. configASSERT( xReturn );
  21826. return xReturn;
  21827. }
  21828. 8028ebc: 4620 mov r0, r4
  21829. 8028ebe: bdf8 pop {r3, r4, r5, r6, r7, pc}
  21830. 08028ec0 <xQueueCreateCountingSemaphore>:
  21831. /*-----------------------------------------------------------*/
  21832. #if ( configUSE_COUNTING_SEMAPHORES == 1 )
  21833. QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount )
  21834. {
  21835. 8028ec0: b510 push {r4, lr}
  21836. 8028ec2: 460c mov r4, r1
  21837. QueueHandle_t xHandle;
  21838. configASSERT( uxMaxCount != 0 );
  21839. 8028ec4: b910 cbnz r0, 8028ecc <xQueueCreateCountingSemaphore+0xc>
  21840. 8028ec6: f001 f8b7 bl 802a038 <ulPortSetInterruptMask>
  21841. 8028eca: e7fe b.n 8028eca <xQueueCreateCountingSemaphore+0xa>
  21842. configASSERT( uxInitialCount <= uxMaxCount );
  21843. 8028ecc: 4281 cmp r1, r0
  21844. 8028ece: d902 bls.n 8028ed6 <xQueueCreateCountingSemaphore+0x16>
  21845. 8028ed0: f001 f8b2 bl 802a038 <ulPortSetInterruptMask>
  21846. 8028ed4: e7fe b.n 8028ed4 <xQueueCreateCountingSemaphore+0x14>
  21847. xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE );
  21848. 8028ed6: 2100 movs r1, #0
  21849. 8028ed8: 2202 movs r2, #2
  21850. 8028eda: f7ff ffca bl 8028e72 <xQueueGenericCreate>
  21851. if( xHandle != NULL )
  21852. 8028ede: b110 cbz r0, 8028ee6 <xQueueCreateCountingSemaphore+0x26>
  21853. {
  21854. ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;
  21855. 8028ee0: 6384 str r4, [r0, #56] ; 0x38
  21856. 8028ee2: bd10 pop {r4, pc}
  21857. 8028ee4: e7fe b.n 8028ee4 <xQueueCreateCountingSemaphore+0x24>
  21858. else
  21859. {
  21860. traceCREATE_COUNTING_SEMAPHORE_FAILED();
  21861. }
  21862. configASSERT( xHandle );
  21863. 8028ee6: f001 f8a7 bl 802a038 <ulPortSetInterruptMask>
  21864. 8028eea: e7fb b.n 8028ee4 <xQueueCreateCountingSemaphore+0x24>
  21865. 08028eec <xQueueGenericSend>:
  21866. #endif /* configUSE_COUNTING_SEMAPHORES */
  21867. /*-----------------------------------------------------------*/
  21868. BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition )
  21869. {
  21870. 8028eec: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  21871. 8028ef0: b085 sub sp, #20
  21872. 8028ef2: 460f mov r7, r1
  21873. 8028ef4: 9201 str r2, [sp, #4]
  21874. 8028ef6: 461d mov r5, r3
  21875. BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;
  21876. TimeOut_t xTimeOut;
  21877. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  21878. configASSERT( pxQueue );
  21879. 8028ef8: 4604 mov r4, r0
  21880. 8028efa: b910 cbnz r0, 8028f02 <xQueueGenericSend+0x16>
  21881. 8028efc: f001 f89c bl 802a038 <ulPortSetInterruptMask>
  21882. 8028f00: e7fe b.n 8028f00 <xQueueGenericSend+0x14>
  21883. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  21884. 8028f02: 2900 cmp r1, #0
  21885. 8028f04: d17b bne.n 8028ffe <xQueueGenericSend+0x112>
  21886. 8028f06: 6c03 ldr r3, [r0, #64] ; 0x40
  21887. 8028f08: 2b00 cmp r3, #0
  21888. 8028f0a: d078 beq.n 8028ffe <xQueueGenericSend+0x112>
  21889. 8028f0c: e074 b.n 8028ff8 <xQueueGenericSend+0x10c>
  21890. 8028f0e: e7fe b.n 8028f0e <xQueueGenericSend+0x22>
  21891. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  21892. 8028f10: 6be3 ldr r3, [r4, #60] ; 0x3c
  21893. 8028f12: 2b01 cmp r3, #1
  21894. 8028f14: d176 bne.n 8029004 <xQueueGenericSend+0x118>
  21895. 8028f16: e078 b.n 802900a <xQueueGenericSend+0x11e>
  21896. 8028f18: e7fe b.n 8028f18 <xQueueGenericSend+0x2c>
  21897. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  21898. {
  21899. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  21900. 8028f1a: 9e01 ldr r6, [sp, #4]
  21901. 8028f1c: b126 cbz r6, 8028f28 <xQueueGenericSend+0x3c>
  21902. 8028f1e: e079 b.n 8029014 <xQueueGenericSend+0x128>
  21903. 8028f20: e7fe b.n 8028f20 <xQueueGenericSend+0x34>
  21904. 8028f22: 2601 movs r6, #1
  21905. 8028f24: e002 b.n 8028f2c <xQueueGenericSend+0x40>
  21906. 8028f26: 2600 movs r6, #0
  21907. /* Interrupts and other tasks can send to and receive from the queue
  21908. now the critical section has been exited. */
  21909. vTaskSuspendAll();
  21910. prvLockQueue( pxQueue );
  21911. 8028f28: f04f 0800 mov.w r8, #0
  21912. /* This function relaxes the coding standard somewhat to allow return
  21913. statements within the function itself. This is done in the interest
  21914. of execution time efficiency. */
  21915. for( ;; )
  21916. {
  21917. taskENTER_CRITICAL();
  21918. 8028f2c: f001 f88c bl 802a048 <vPortEnterCritical>
  21919. {
  21920. /* Is there room on the queue now? The running task must be
  21921. the highest priority task wanting to access the queue. If
  21922. the head item in the queue is to be overwritten then it does
  21923. not matter if the queue is full. */
  21924. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  21925. 8028f30: 6ba2 ldr r2, [r4, #56] ; 0x38
  21926. 8028f32: 6be3 ldr r3, [r4, #60] ; 0x3c
  21927. 8028f34: 429a cmp r2, r3
  21928. 8028f36: d301 bcc.n 8028f3c <xQueueGenericSend+0x50>
  21929. 8028f38: 2d02 cmp r5, #2
  21930. 8028f3a: d115 bne.n 8028f68 <xQueueGenericSend+0x7c>
  21931. {
  21932. traceQUEUE_SEND( pxQueue );
  21933. xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
  21934. 8028f3c: 4620 mov r0, r4
  21935. 8028f3e: 4639 mov r1, r7
  21936. 8028f40: 462a mov r2, r5
  21937. 8028f42: f7ff ff2e bl 8028da2 <prvCopyDataToQueue>
  21938. }
  21939. #else /* configUSE_QUEUE_SETS */
  21940. {
  21941. /* If there was a task waiting for data to arrive on the
  21942. queue then unblock it now. */
  21943. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  21944. 8028f46: 6a63 ldr r3, [r4, #36] ; 0x24
  21945. 8028f48: b143 cbz r3, 8028f5c <xQueueGenericSend+0x70>
  21946. {
  21947. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE )
  21948. 8028f4a: f104 0024 add.w r0, r4, #36 ; 0x24
  21949. 8028f4e: f000 fd6f bl 8029a30 <xTaskRemoveFromEventList>
  21950. 8028f52: 2801 cmp r0, #1
  21951. 8028f54: d104 bne.n 8028f60 <xQueueGenericSend+0x74>
  21952. {
  21953. /* The unblocked task has a priority higher than
  21954. our own so yield immediately. Yes it is ok to do
  21955. this from within the critical section - the kernel
  21956. takes care of that. */
  21957. queueYIELD_IF_USING_PREEMPTION();
  21958. 8028f56: f001 f863 bl 802a020 <vPortYield>
  21959. 8028f5a: e001 b.n 8028f60 <xQueueGenericSend+0x74>
  21960. else
  21961. {
  21962. mtCOVERAGE_TEST_MARKER();
  21963. }
  21964. }
  21965. else if( xYieldRequired != pdFALSE )
  21966. 8028f5c: 2800 cmp r0, #0
  21967. 8028f5e: d1fa bne.n 8028f56 <xQueueGenericSend+0x6a>
  21968. mtCOVERAGE_TEST_MARKER();
  21969. }
  21970. }
  21971. #endif /* configUSE_QUEUE_SETS */
  21972. taskEXIT_CRITICAL();
  21973. 8028f60: f001 f89e bl 802a0a0 <vPortExitCritical>
  21974. return pdPASS;
  21975. 8028f64: 2001 movs r0, #1
  21976. 8028f66: e058 b.n 802901a <xQueueGenericSend+0x12e>
  21977. }
  21978. else
  21979. {
  21980. if( xTicksToWait == ( TickType_t ) 0 )
  21981. 8028f68: f8dd 9004 ldr.w r9, [sp, #4]
  21982. 8028f6c: f1b9 0f00 cmp.w r9, #0
  21983. 8028f70: d102 bne.n 8028f78 <xQueueGenericSend+0x8c>
  21984. {
  21985. /* The queue was full and no block time is specified (or
  21986. the block time has expired) so leave now. */
  21987. taskEXIT_CRITICAL();
  21988. 8028f72: f001 f895 bl 802a0a0 <vPortExitCritical>
  21989. 8028f76: e03d b.n 8028ff4 <xQueueGenericSend+0x108>
  21990. /* Return to the original privilege level before exiting
  21991. the function. */
  21992. traceQUEUE_SEND_FAILED( pxQueue );
  21993. return errQUEUE_FULL;
  21994. }
  21995. else if( xEntryTimeSet == pdFALSE )
  21996. 8028f78: b916 cbnz r6, 8028f80 <xQueueGenericSend+0x94>
  21997. {
  21998. /* The queue was full and a block time was specified so
  21999. configure the timeout structure. */
  22000. vTaskSetTimeOutState( &xTimeOut );
  22001. 8028f7a: a802 add r0, sp, #8
  22002. 8028f7c: f000 fd94 bl 8029aa8 <vTaskSetTimeOutState>
  22003. /* Entry time was already set. */
  22004. mtCOVERAGE_TEST_MARKER();
  22005. }
  22006. }
  22007. }
  22008. taskEXIT_CRITICAL();
  22009. 8028f80: f001 f88e bl 802a0a0 <vPortExitCritical>
  22010. /* Interrupts and other tasks can send to and receive from the queue
  22011. now the critical section has been exited. */
  22012. vTaskSuspendAll();
  22013. 8028f84: f000 fb5c bl 8029640 <vTaskSuspendAll>
  22014. prvLockQueue( pxQueue );
  22015. 8028f88: f001 f85e bl 802a048 <vPortEnterCritical>
  22016. 8028f8c: 6c63 ldr r3, [r4, #68] ; 0x44
  22017. 8028f8e: 3301 adds r3, #1
  22018. 8028f90: bf08 it eq
  22019. 8028f92: f8c4 8044 streq.w r8, [r4, #68] ; 0x44
  22020. 8028f96: 6ca3 ldr r3, [r4, #72] ; 0x48
  22021. 8028f98: 3301 adds r3, #1
  22022. 8028f9a: bf08 it eq
  22023. 8028f9c: f8c4 8048 streq.w r8, [r4, #72] ; 0x48
  22024. 8028fa0: f001 f87e bl 802a0a0 <vPortExitCritical>
  22025. /* Update the timeout state to see if it has expired yet. */
  22026. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  22027. 8028fa4: a802 add r0, sp, #8
  22028. 8028fa6: a901 add r1, sp, #4
  22029. 8028fa8: f000 fd8e bl 8029ac8 <xTaskCheckForTimeOut>
  22030. 8028fac: b9e8 cbnz r0, 8028fea <xQueueGenericSend+0xfe>
  22031. static BaseType_t prvIsQueueFull( const Queue_t *pxQueue )
  22032. {
  22033. BaseType_t xReturn;
  22034. taskENTER_CRITICAL();
  22035. 8028fae: f001 f84b bl 802a048 <vPortEnterCritical>
  22036. {
  22037. if( pxQueue->uxMessagesWaiting == pxQueue->uxLength )
  22038. 8028fb2: f8d4 9038 ldr.w r9, [r4, #56] ; 0x38
  22039. 8028fb6: 6be6 ldr r6, [r4, #60] ; 0x3c
  22040. else
  22041. {
  22042. xReturn = pdFALSE;
  22043. }
  22044. }
  22045. taskEXIT_CRITICAL();
  22046. 8028fb8: f001 f872 bl 802a0a0 <vPortExitCritical>
  22047. prvLockQueue( pxQueue );
  22048. /* Update the timeout state to see if it has expired yet. */
  22049. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  22050. {
  22051. if( prvIsQueueFull( pxQueue ) != pdFALSE )
  22052. 8028fbc: 45b1 cmp r9, r6
  22053. 8028fbe: d10e bne.n 8028fde <xQueueGenericSend+0xf2>
  22054. {
  22055. traceBLOCKING_ON_QUEUE_SEND( pxQueue );
  22056. vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );
  22057. 8028fc0: f104 0010 add.w r0, r4, #16
  22058. 8028fc4: 9901 ldr r1, [sp, #4]
  22059. 8028fc6: f000 fcd7 bl 8029978 <vTaskPlaceOnEventList>
  22060. /* Unlocking the queue means queue events can effect the
  22061. event list. It is possible that interrupts occurring now
  22062. remove this task from the event list again - but as the
  22063. scheduler is suspended the task will go onto the pending
  22064. ready last instead of the actual ready list. */
  22065. prvUnlockQueue( pxQueue );
  22066. 8028fca: 4620 mov r0, r4
  22067. 8028fcc: f7ff fea2 bl 8028d14 <prvUnlockQueue>
  22068. /* Resuming the scheduler will move tasks from the pending
  22069. ready list into the ready list - so it is feasible that this
  22070. task is already in a ready list before it yields - in which
  22071. case the yield will not cause a context switch unless there
  22072. is also a higher priority task in the pending ready list. */
  22073. if( xTaskResumeAll() == pdFALSE )
  22074. 8028fd0: f000 fbd2 bl 8029778 <xTaskResumeAll>
  22075. 8028fd4: 2800 cmp r0, #0
  22076. 8028fd6: d1a4 bne.n 8028f22 <xQueueGenericSend+0x36>
  22077. {
  22078. portYIELD_WITHIN_API();
  22079. 8028fd8: f001 f822 bl 802a020 <vPortYield>
  22080. 8028fdc: e7a1 b.n 8028f22 <xQueueGenericSend+0x36>
  22081. }
  22082. }
  22083. else
  22084. {
  22085. /* Try again. */
  22086. prvUnlockQueue( pxQueue );
  22087. 8028fde: 4620 mov r0, r4
  22088. 8028fe0: f7ff fe98 bl 8028d14 <prvUnlockQueue>
  22089. ( void ) xTaskResumeAll();
  22090. 8028fe4: f000 fbc8 bl 8029778 <xTaskResumeAll>
  22091. 8028fe8: e79b b.n 8028f22 <xQueueGenericSend+0x36>
  22092. }
  22093. }
  22094. else
  22095. {
  22096. /* The timeout has expired. */
  22097. prvUnlockQueue( pxQueue );
  22098. 8028fea: 4620 mov r0, r4
  22099. 8028fec: f7ff fe92 bl 8028d14 <prvUnlockQueue>
  22100. ( void ) xTaskResumeAll();
  22101. 8028ff0: f000 fbc2 bl 8029778 <xTaskResumeAll>
  22102. /* Return to the original privilege level before exiting the
  22103. function. */
  22104. traceQUEUE_SEND_FAILED( pxQueue );
  22105. return errQUEUE_FULL;
  22106. 8028ff4: 2000 movs r0, #0
  22107. 8028ff6: e010 b.n 802901a <xQueueGenericSend+0x12e>
  22108. BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;
  22109. TimeOut_t xTimeOut;
  22110. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  22111. configASSERT( pxQueue );
  22112. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  22113. 8028ff8: f001 f81e bl 802a038 <ulPortSetInterruptMask>
  22114. 8028ffc: e787 b.n 8028f0e <xQueueGenericSend+0x22>
  22115. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  22116. 8028ffe: 2d02 cmp r5, #2
  22117. 8029000: d103 bne.n 802900a <xQueueGenericSend+0x11e>
  22118. 8029002: e785 b.n 8028f10 <xQueueGenericSend+0x24>
  22119. 8029004: f001 f818 bl 802a038 <ulPortSetInterruptMask>
  22120. 8029008: e786 b.n 8028f18 <xQueueGenericSend+0x2c>
  22121. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  22122. {
  22123. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  22124. 802900a: f000 fd91 bl 8029b30 <xTaskGetSchedulerState>
  22125. 802900e: 2800 cmp r0, #0
  22126. 8029010: d189 bne.n 8028f26 <xQueueGenericSend+0x3a>
  22127. 8029012: e782 b.n 8028f1a <xQueueGenericSend+0x2e>
  22128. 8029014: f001 f810 bl 802a038 <ulPortSetInterruptMask>
  22129. 8029018: e782 b.n 8028f20 <xQueueGenericSend+0x34>
  22130. function. */
  22131. traceQUEUE_SEND_FAILED( pxQueue );
  22132. return errQUEUE_FULL;
  22133. }
  22134. }
  22135. }
  22136. 802901a: b005 add sp, #20
  22137. 802901c: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  22138. 08029020 <xQueueCreateMutex>:
  22139. /*-----------------------------------------------------------*/
  22140. #if ( configUSE_MUTEXES == 1 )
  22141. QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType )
  22142. {
  22143. 8029020: b570 push {r4, r5, r6, lr}
  22144. 8029022: 4606 mov r6, r0
  22145. /* Prevent compiler warnings about unused parameters if
  22146. configUSE_TRACE_FACILITY does not equal 1. */
  22147. ( void ) ucQueueType;
  22148. /* Allocate the new queue structure. */
  22149. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  22150. 8029024: 2054 movs r0, #84 ; 0x54
  22151. 8029026: f001 f91d bl 802a264 <pvPortMalloc>
  22152. if( pxNewQueue != NULL )
  22153. 802902a: 4604 mov r4, r0
  22154. 802902c: b108 cbz r0, 8029032 <xQueueCreateMutex+0x12>
  22155. 802902e: e003 b.n 8029038 <xQueueCreateMutex+0x18>
  22156. 8029030: e7fe b.n 8029030 <xQueueCreateMutex+0x10>
  22157. else
  22158. {
  22159. traceCREATE_MUTEX_FAILED();
  22160. }
  22161. configASSERT( pxNewQueue );
  22162. 8029032: f001 f801 bl 802a038 <ulPortSetInterruptMask>
  22163. 8029036: e7fb b.n 8029030 <xQueueCreateMutex+0x10>
  22164. /* Each mutex has a length of 1 (like a binary semaphore) and
  22165. an item size of 0 as nothing is actually copied into or out
  22166. of the mutex. */
  22167. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  22168. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  22169. 8029038: 2301 movs r3, #1
  22170. /* Allocate the new queue structure. */
  22171. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  22172. if( pxNewQueue != NULL )
  22173. {
  22174. /* Information required for priority inheritance. */
  22175. pxNewQueue->pxMutexHolder = NULL;
  22176. 802903a: 2500 movs r5, #0
  22177. /* Each mutex has a length of 1 (like a binary semaphore) and
  22178. an item size of 0 as nothing is actually copied into or out
  22179. of the mutex. */
  22180. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  22181. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  22182. 802903c: 63c3 str r3, [r0, #60] ; 0x3c
  22183. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  22184. pxNewQueue->xRxLock = queueUNLOCKED;
  22185. 802903e: f04f 33ff mov.w r3, #4294967295
  22186. pxNewQueue->u.pcReadFrom = NULL;
  22187. /* Each mutex has a length of 1 (like a binary semaphore) and
  22188. an item size of 0 as nothing is actually copied into or out
  22189. of the mutex. */
  22190. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  22191. 8029042: 6385 str r5, [r0, #56] ; 0x38
  22192. /* Allocate the new queue structure. */
  22193. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  22194. if( pxNewQueue != NULL )
  22195. {
  22196. /* Information required for priority inheritance. */
  22197. pxNewQueue->pxMutexHolder = NULL;
  22198. 8029044: 6045 str r5, [r0, #4]
  22199. an item size of 0 as nothing is actually copied into or out
  22200. of the mutex. */
  22201. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  22202. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  22203. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  22204. pxNewQueue->xRxLock = queueUNLOCKED;
  22205. 8029046: 6443 str r3, [r0, #68] ; 0x44
  22206. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  22207. if( pxNewQueue != NULL )
  22208. {
  22209. /* Information required for priority inheritance. */
  22210. pxNewQueue->pxMutexHolder = NULL;
  22211. pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX;
  22212. 8029048: 6005 str r5, [r0, #0]
  22213. of the mutex. */
  22214. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  22215. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  22216. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  22217. pxNewQueue->xRxLock = queueUNLOCKED;
  22218. pxNewQueue->xTxLock = queueUNLOCKED;
  22219. 802904a: 6483 str r3, [r0, #72] ; 0x48
  22220. pxNewQueue->pxMutexHolder = NULL;
  22221. pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX;
  22222. /* Queues used as a mutex no data is actually copied into or out
  22223. of the queue. */
  22224. pxNewQueue->pcWriteTo = NULL;
  22225. 802904c: 6085 str r5, [r0, #8]
  22226. pxNewQueue->u.pcReadFrom = NULL;
  22227. 802904e: 60c5 str r5, [r0, #12]
  22228. /* Each mutex has a length of 1 (like a binary semaphore) and
  22229. an item size of 0 as nothing is actually copied into or out
  22230. of the mutex. */
  22231. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  22232. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  22233. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  22234. 8029050: 6405 str r5, [r0, #64] ; 0x40
  22235. pxNewQueue->xRxLock = queueUNLOCKED;
  22236. pxNewQueue->xTxLock = queueUNLOCKED;
  22237. #if ( configUSE_TRACE_FACILITY == 1 )
  22238. {
  22239. pxNewQueue->ucQueueType = ucQueueType;
  22240. 8029052: f880 6050 strb.w r6, [r0, #80] ; 0x50
  22241. pxNewQueue->pxQueueSetContainer = NULL;
  22242. }
  22243. #endif
  22244. /* Ensure the event queues start with the correct state. */
  22245. vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) );
  22246. 8029056: 3010 adds r0, #16
  22247. 8029058: f7ff fe1a bl 8028c90 <vListInitialise>
  22248. vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) );
  22249. 802905c: f104 0024 add.w r0, r4, #36 ; 0x24
  22250. 8029060: f7ff fe16 bl 8028c90 <vListInitialise>
  22251. traceCREATE_MUTEX( pxNewQueue );
  22252. /* Start with the semaphore in the expected state. */
  22253. ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK );
  22254. 8029064: 4620 mov r0, r4
  22255. 8029066: 4629 mov r1, r5
  22256. 8029068: 462a mov r2, r5
  22257. 802906a: 462b mov r3, r5
  22258. 802906c: f7ff ff3e bl 8028eec <xQueueGenericSend>
  22259. traceCREATE_MUTEX_FAILED();
  22260. }
  22261. configASSERT( pxNewQueue );
  22262. return pxNewQueue;
  22263. }
  22264. 8029070: 4620 mov r0, r4
  22265. 8029072: bd70 pop {r4, r5, r6, pc}
  22266. 08029074 <xQueueGenericSendFromISR>:
  22267. #endif /* configUSE_ALTERNATIVE_API */
  22268. /*-----------------------------------------------------------*/
  22269. BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition )
  22270. {
  22271. 8029074: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  22272. 8029078: 460f mov r7, r1
  22273. 802907a: 4616 mov r6, r2
  22274. 802907c: 461d mov r5, r3
  22275. BaseType_t xReturn;
  22276. UBaseType_t uxSavedInterruptStatus;
  22277. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  22278. configASSERT( pxQueue );
  22279. 802907e: 4604 mov r4, r0
  22280. 8029080: b910 cbnz r0, 8029088 <xQueueGenericSendFromISR+0x14>
  22281. 8029082: f000 ffd9 bl 802a038 <ulPortSetInterruptMask>
  22282. 8029086: e7fe b.n 8029086 <xQueueGenericSendFromISR+0x12>
  22283. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  22284. 8029088: bb41 cbnz r1, 80290dc <xQueueGenericSendFromISR+0x68>
  22285. 802908a: 6c03 ldr r3, [r0, #64] ; 0x40
  22286. 802908c: b333 cbz r3, 80290dc <xQueueGenericSendFromISR+0x68>
  22287. 802908e: e022 b.n 80290d6 <xQueueGenericSendFromISR+0x62>
  22288. 8029090: e7fe b.n 8029090 <xQueueGenericSendFromISR+0x1c>
  22289. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  22290. 8029092: 6be3 ldr r3, [r4, #60] ; 0x3c
  22291. 8029094: 2b01 cmp r3, #1
  22292. 8029096: d124 bne.n 80290e2 <xQueueGenericSendFromISR+0x6e>
  22293. 8029098: e026 b.n 80290e8 <xQueueGenericSendFromISR+0x74>
  22294. 802909a: e7fe b.n 802909a <xQueueGenericSendFromISR+0x26>
  22295. read, instead return a flag to say whether a context switch is required or
  22296. not (i.e. has a task with a higher priority than us been woken by this
  22297. post). */
  22298. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  22299. {
  22300. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  22301. 802909c: 2d02 cmp r5, #2
  22302. 802909e: d118 bne.n 80290d2 <xQueueGenericSendFromISR+0x5e>
  22303. /* A task can only have an inherited priority if it is a mutex
  22304. holder - and if there is a mutex holder then the mutex cannot be
  22305. given from an ISR. Therefore, unlike the xQueueGenericGive()
  22306. function, there is no need to determine the need for priority
  22307. disinheritance here or to clear the mutex holder TCB member. */
  22308. ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
  22309. 80290a0: 4620 mov r0, r4
  22310. 80290a2: 4639 mov r1, r7
  22311. 80290a4: 462a mov r2, r5
  22312. 80290a6: f7ff fe7c bl 8028da2 <prvCopyDataToQueue>
  22313. /* The event list is not altered if the queue is locked. This will
  22314. be done when the queue is unlocked later. */
  22315. if( pxQueue->xTxLock == queueUNLOCKED )
  22316. 80290aa: 6ca3 ldr r3, [r4, #72] ; 0x48
  22317. 80290ac: 3301 adds r3, #1
  22318. 80290ae: d10b bne.n 80290c8 <xQueueGenericSendFromISR+0x54>
  22319. }
  22320. }
  22321. }
  22322. #else /* configUSE_QUEUE_SETS */
  22323. {
  22324. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  22325. 80290b0: 6a63 ldr r3, [r4, #36] ; 0x24
  22326. 80290b2: b903 cbnz r3, 80290b6 <xQueueGenericSendFromISR+0x42>
  22327. 80290b4: e00b b.n 80290ce <xQueueGenericSendFromISR+0x5a>
  22328. {
  22329. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  22330. 80290b6: f104 0024 add.w r0, r4, #36 ; 0x24
  22331. 80290ba: f000 fcb9 bl 8029a30 <xTaskRemoveFromEventList>
  22332. 80290be: b130 cbz r0, 80290ce <xQueueGenericSendFromISR+0x5a>
  22333. {
  22334. /* The task waiting has a higher priority so record that a
  22335. context switch is required. */
  22336. if( pxHigherPriorityTaskWoken != NULL )
  22337. 80290c0: b12e cbz r6, 80290ce <xQueueGenericSendFromISR+0x5a>
  22338. {
  22339. *pxHigherPriorityTaskWoken = pdTRUE;
  22340. 80290c2: 2401 movs r4, #1
  22341. 80290c4: 6034 str r4, [r6, #0]
  22342. 80290c6: e019 b.n 80290fc <xQueueGenericSendFromISR+0x88>
  22343. }
  22344. else
  22345. {
  22346. /* Increment the lock count so the task that unlocks the queue
  22347. knows that data was posted while it was locked. */
  22348. ++( pxQueue->xTxLock );
  22349. 80290c8: 6ca3 ldr r3, [r4, #72] ; 0x48
  22350. 80290ca: 3301 adds r3, #1
  22351. 80290cc: 64a3 str r3, [r4, #72] ; 0x48
  22352. }
  22353. xReturn = pdPASS;
  22354. 80290ce: 2401 movs r4, #1
  22355. 80290d0: e014 b.n 80290fc <xQueueGenericSendFromISR+0x88>
  22356. }
  22357. else
  22358. {
  22359. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  22360. xReturn = errQUEUE_FULL;
  22361. 80290d2: 2400 movs r4, #0
  22362. 80290d4: e012 b.n 80290fc <xQueueGenericSendFromISR+0x88>
  22363. BaseType_t xReturn;
  22364. UBaseType_t uxSavedInterruptStatus;
  22365. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  22366. configASSERT( pxQueue );
  22367. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  22368. 80290d6: f000 ffaf bl 802a038 <ulPortSetInterruptMask>
  22369. 80290da: e7d9 b.n 8029090 <xQueueGenericSendFromISR+0x1c>
  22370. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  22371. 80290dc: 2d02 cmp r5, #2
  22372. 80290de: d103 bne.n 80290e8 <xQueueGenericSendFromISR+0x74>
  22373. 80290e0: e7d7 b.n 8029092 <xQueueGenericSendFromISR+0x1e>
  22374. 80290e2: f000 ffa9 bl 802a038 <ulPortSetInterruptMask>
  22375. 80290e6: e7d8 b.n 802909a <xQueueGenericSendFromISR+0x26>
  22376. that have been assigned a priority at or (logically) below the maximum
  22377. system call interrupt priority. FreeRTOS maintains a separate interrupt
  22378. safe API to ensure interrupt entry is as fast and as simple as possible.
  22379. More information (albeit Cortex-M specific) is provided on the following
  22380. link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
  22381. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  22382. 80290e8: f001 f876 bl 802a1d8 <vPortValidateInterruptPriority>
  22383. /* Similar to xQueueGenericSend, except without blocking if there is no room
  22384. in the queue. Also don't directly wake a task that was blocked on a queue
  22385. read, instead return a flag to say whether a context switch is required or
  22386. not (i.e. has a task with a higher priority than us been woken by this
  22387. post). */
  22388. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  22389. 80290ec: f000 ffa4 bl 802a038 <ulPortSetInterruptMask>
  22390. {
  22391. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  22392. 80290f0: 6ba2 ldr r2, [r4, #56] ; 0x38
  22393. 80290f2: 6be3 ldr r3, [r4, #60] ; 0x3c
  22394. 80290f4: 429a cmp r2, r3
  22395. /* Similar to xQueueGenericSend, except without blocking if there is no room
  22396. in the queue. Also don't directly wake a task that was blocked on a queue
  22397. read, instead return a flag to say whether a context switch is required or
  22398. not (i.e. has a task with a higher priority than us been woken by this
  22399. post). */
  22400. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  22401. 80290f6: 4680 mov r8, r0
  22402. {
  22403. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  22404. 80290f8: d2d0 bcs.n 802909c <xQueueGenericSendFromISR+0x28>
  22405. 80290fa: e7d1 b.n 80290a0 <xQueueGenericSendFromISR+0x2c>
  22406. {
  22407. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  22408. xReturn = errQUEUE_FULL;
  22409. }
  22410. }
  22411. portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  22412. 80290fc: 4640 mov r0, r8
  22413. 80290fe: f000 ffcb bl 802a098 <vPortClearInterruptMask>
  22414. return xReturn;
  22415. }
  22416. 8029102: 4620 mov r0, r4
  22417. 8029104: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  22418. 08029108 <xQueueGiveFromISR>:
  22419. /*-----------------------------------------------------------*/
  22420. BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken )
  22421. {
  22422. 8029108: b5f8 push {r3, r4, r5, r6, r7, lr}
  22423. 802910a: 460d mov r5, r1
  22424. BaseType_t xReturn;
  22425. UBaseType_t uxSavedInterruptStatus;
  22426. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  22427. configASSERT( pxQueue );
  22428. 802910c: 4604 mov r4, r0
  22429. 802910e: b910 cbnz r0, 8029116 <xQueueGiveFromISR+0xe>
  22430. 8029110: f000 ff92 bl 802a038 <ulPortSetInterruptMask>
  22431. 8029114: e7fe b.n 8029114 <xQueueGiveFromISR+0xc>
  22432. /* xQueueGenericSendFromISR() should be used in the item size is not 0. */
  22433. configASSERT( pxQueue->uxItemSize == 0 );
  22434. 8029116: 6c06 ldr r6, [r0, #64] ; 0x40
  22435. 8029118: b116 cbz r6, 8029120 <xQueueGiveFromISR+0x18>
  22436. 802911a: f000 ff8d bl 802a038 <ulPortSetInterruptMask>
  22437. 802911e: e7fe b.n 802911e <xQueueGiveFromISR+0x16>
  22438. that have been assigned a priority at or (logically) below the maximum
  22439. system call interrupt priority. FreeRTOS maintains a separate interrupt
  22440. safe API to ensure interrupt entry is as fast and as simple as possible.
  22441. More information (albeit Cortex-M specific) is provided on the following
  22442. link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
  22443. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  22444. 8029120: f001 f85a bl 802a1d8 <vPortValidateInterruptPriority>
  22445. /* Similar to xQueueGenericSendFromISR() but used with semaphores where the
  22446. item size is 0. Don't directly wake a task that was blocked on a queue
  22447. read, instead return a flag to say whether a context switch is required or
  22448. not (i.e. has a task with a higher priority than us been woken by this
  22449. post). */
  22450. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  22451. 8029124: f000 ff88 bl 802a038 <ulPortSetInterruptMask>
  22452. {
  22453. /* When the queue is used to implement a semaphore no data is ever
  22454. moved through the queue but it is still valid to see if the queue 'has
  22455. space'. */
  22456. if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )
  22457. 8029128: 6ba2 ldr r2, [r4, #56] ; 0x38
  22458. 802912a: 6be3 ldr r3, [r4, #60] ; 0x3c
  22459. 802912c: 429a cmp r2, r3
  22460. /* Similar to xQueueGenericSendFromISR() but used with semaphores where the
  22461. item size is 0. Don't directly wake a task that was blocked on a queue
  22462. read, instead return a flag to say whether a context switch is required or
  22463. not (i.e. has a task with a higher priority than us been woken by this
  22464. post). */
  22465. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  22466. 802912e: 4607 mov r7, r0
  22467. {
  22468. /* When the queue is used to implement a semaphore no data is ever
  22469. moved through the queue but it is still valid to see if the queue 'has
  22470. space'. */
  22471. if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )
  22472. 8029130: d216 bcs.n 8029160 <xQueueGiveFromISR+0x58>
  22473. holder - and if there is a mutex holder then the mutex cannot be
  22474. given from an ISR. Therefore, unlike the xQueueGenericGive()
  22475. function, there is no need to determine the need for priority
  22476. disinheritance here or to clear the mutex holder TCB member. */
  22477. ++( pxQueue->uxMessagesWaiting );
  22478. 8029132: 6ba3 ldr r3, [r4, #56] ; 0x38
  22479. 8029134: 3301 adds r3, #1
  22480. 8029136: 63a3 str r3, [r4, #56] ; 0x38
  22481. /* The event list is not altered if the queue is locked. This will
  22482. be done when the queue is unlocked later. */
  22483. if( pxQueue->xTxLock == queueUNLOCKED )
  22484. 8029138: 6ca3 ldr r3, [r4, #72] ; 0x48
  22485. 802913a: 3301 adds r3, #1
  22486. 802913c: d10b bne.n 8029156 <xQueueGiveFromISR+0x4e>
  22487. }
  22488. }
  22489. }
  22490. #else /* configUSE_QUEUE_SETS */
  22491. {
  22492. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  22493. 802913e: 6a63 ldr r3, [r4, #36] ; 0x24
  22494. 8029140: b903 cbnz r3, 8029144 <xQueueGiveFromISR+0x3c>
  22495. 8029142: e00b b.n 802915c <xQueueGiveFromISR+0x54>
  22496. {
  22497. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  22498. 8029144: f104 0024 add.w r0, r4, #36 ; 0x24
  22499. 8029148: f000 fc72 bl 8029a30 <xTaskRemoveFromEventList>
  22500. 802914c: b130 cbz r0, 802915c <xQueueGiveFromISR+0x54>
  22501. {
  22502. /* The task waiting has a higher priority so record that a
  22503. context switch is required. */
  22504. if( pxHigherPriorityTaskWoken != NULL )
  22505. 802914e: b12d cbz r5, 802915c <xQueueGiveFromISR+0x54>
  22506. {
  22507. *pxHigherPriorityTaskWoken = pdTRUE;
  22508. 8029150: 2401 movs r4, #1
  22509. 8029152: 602c str r4, [r5, #0]
  22510. 8029154: e005 b.n 8029162 <xQueueGiveFromISR+0x5a>
  22511. }
  22512. else
  22513. {
  22514. /* Increment the lock count so the task that unlocks the queue
  22515. knows that data was posted while it was locked. */
  22516. ++( pxQueue->xTxLock );
  22517. 8029156: 6ca3 ldr r3, [r4, #72] ; 0x48
  22518. 8029158: 3301 adds r3, #1
  22519. 802915a: 64a3 str r3, [r4, #72] ; 0x48
  22520. }
  22521. xReturn = pdPASS;
  22522. 802915c: 2401 movs r4, #1
  22523. 802915e: e000 b.n 8029162 <xQueueGiveFromISR+0x5a>
  22524. }
  22525. else
  22526. {
  22527. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  22528. xReturn = errQUEUE_FULL;
  22529. 8029160: 4634 mov r4, r6
  22530. }
  22531. }
  22532. portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  22533. 8029162: 4638 mov r0, r7
  22534. 8029164: f000 ff98 bl 802a098 <vPortClearInterruptMask>
  22535. return xReturn;
  22536. }
  22537. 8029168: 4620 mov r0, r4
  22538. 802916a: bdf8 pop {r3, r4, r5, r6, r7, pc}
  22539. 0802916c <xQueueGenericReceive>:
  22540. /*-----------------------------------------------------------*/
  22541. BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeeking )
  22542. {
  22543. 802916c: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  22544. 8029170: b085 sub sp, #20
  22545. 8029172: 460e mov r6, r1
  22546. 8029174: 9201 str r2, [sp, #4]
  22547. 8029176: 4699 mov r9, r3
  22548. BaseType_t xEntryTimeSet = pdFALSE;
  22549. TimeOut_t xTimeOut;
  22550. int8_t *pcOriginalReadPosition;
  22551. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  22552. configASSERT( pxQueue );
  22553. 8029178: 4604 mov r4, r0
  22554. 802917a: b910 cbnz r0, 8029182 <xQueueGenericReceive+0x16>
  22555. 802917c: f000 ff5c bl 802a038 <ulPortSetInterruptMask>
  22556. 8029180: e7fe b.n 8029180 <xQueueGenericReceive+0x14>
  22557. configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  22558. 8029182: 2900 cmp r1, #0
  22559. 8029184: f040 8089 bne.w 802929a <xQueueGenericReceive+0x12e>
  22560. 8029188: 6c03 ldr r3, [r0, #64] ; 0x40
  22561. 802918a: 2b00 cmp r3, #0
  22562. 802918c: f000 8085 beq.w 802929a <xQueueGenericReceive+0x12e>
  22563. 8029190: e080 b.n 8029294 <xQueueGenericReceive+0x128>
  22564. 8029192: e7fe b.n 8029192 <xQueueGenericReceive+0x26>
  22565. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  22566. {
  22567. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  22568. 8029194: 9d01 ldr r5, [sp, #4]
  22569. 8029196: b125 cbz r5, 80291a2 <xQueueGenericReceive+0x36>
  22570. 8029198: e085 b.n 80292a6 <xQueueGenericReceive+0x13a>
  22571. 802919a: e7fe b.n 802919a <xQueueGenericReceive+0x2e>
  22572. 802919c: 2501 movs r5, #1
  22573. 802919e: e001 b.n 80291a4 <xQueueGenericReceive+0x38>
  22574. 80291a0: 2500 movs r5, #0
  22575. /* Interrupts and other tasks can send to and receive from the queue
  22576. now the critical section has been exited. */
  22577. vTaskSuspendAll();
  22578. prvLockQueue( pxQueue );
  22579. 80291a2: 2700 movs r7, #0
  22580. statements within the function itself. This is done in the interest
  22581. of execution time efficiency. */
  22582. for( ;; )
  22583. {
  22584. taskENTER_CRITICAL();
  22585. 80291a4: f000 ff50 bl 802a048 <vPortEnterCritical>
  22586. {
  22587. /* Is there data in the queue now? To be running the calling task
  22588. must be the highest priority task wanting to access the queue. */
  22589. if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )
  22590. 80291a8: 6ba3 ldr r3, [r4, #56] ; 0x38
  22591. 80291aa: b33b cbz r3, 80291fc <xQueueGenericReceive+0x90>
  22592. {
  22593. /* Remember the read position in case the queue is only being
  22594. peeked. */
  22595. pcOriginalReadPosition = pxQueue->u.pcReadFrom;
  22596. prvCopyDataFromQueue( pxQueue, pvBuffer );
  22597. 80291ac: 4620 mov r0, r4
  22598. 80291ae: 4631 mov r1, r6
  22599. must be the highest priority task wanting to access the queue. */
  22600. if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )
  22601. {
  22602. /* Remember the read position in case the queue is only being
  22603. peeked. */
  22604. pcOriginalReadPosition = pxQueue->u.pcReadFrom;
  22605. 80291b0: 68e5 ldr r5, [r4, #12]
  22606. prvCopyDataFromQueue( pxQueue, pvBuffer );
  22607. 80291b2: f7ff fde3 bl 8028d7c <prvCopyDataFromQueue>
  22608. if( xJustPeeking == pdFALSE )
  22609. 80291b6: f1b9 0f00 cmp.w r9, #0
  22610. 80291ba: d112 bne.n 80291e2 <xQueueGenericReceive+0x76>
  22611. {
  22612. traceQUEUE_RECEIVE( pxQueue );
  22613. /* Actually removing data, not just peeking. */
  22614. --( pxQueue->uxMessagesWaiting );
  22615. 80291bc: 6ba3 ldr r3, [r4, #56] ; 0x38
  22616. 80291be: 3b01 subs r3, #1
  22617. 80291c0: 63a3 str r3, [r4, #56] ; 0x38
  22618. #if ( configUSE_MUTEXES == 1 )
  22619. {
  22620. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  22621. 80291c2: 6823 ldr r3, [r4, #0]
  22622. 80291c4: b913 cbnz r3, 80291cc <xQueueGenericReceive+0x60>
  22623. {
  22624. /* Record the information required to implement
  22625. priority inheritance should it become necessary. */
  22626. pxQueue->pxMutexHolder = ( int8_t * ) pvTaskIncrementMutexHeldCount(); /*lint !e961 Cast is not redundant as TaskHandle_t is a typedef. */
  22627. 80291c6: f000 fd4d bl 8029c64 <pvTaskIncrementMutexHeldCount>
  22628. 80291ca: 6060 str r0, [r4, #4]
  22629. mtCOVERAGE_TEST_MARKER();
  22630. }
  22631. }
  22632. #endif /* configUSE_MUTEXES */
  22633. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  22634. 80291cc: 6923 ldr r3, [r4, #16]
  22635. 80291ce: b18b cbz r3, 80291f4 <xQueueGenericReceive+0x88>
  22636. {
  22637. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE )
  22638. 80291d0: f104 0010 add.w r0, r4, #16
  22639. 80291d4: f000 fc2c bl 8029a30 <xTaskRemoveFromEventList>
  22640. 80291d8: 2801 cmp r0, #1
  22641. 80291da: d10b bne.n 80291f4 <xQueueGenericReceive+0x88>
  22642. {
  22643. queueYIELD_IF_USING_PREEMPTION();
  22644. 80291dc: f000 ff20 bl 802a020 <vPortYield>
  22645. 80291e0: e008 b.n 80291f4 <xQueueGenericReceive+0x88>
  22646. pointer. */
  22647. pxQueue->u.pcReadFrom = pcOriginalReadPosition;
  22648. /* The data is being left in the queue, so see if there are
  22649. any other tasks waiting for the data. */
  22650. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  22651. 80291e2: 6a63 ldr r3, [r4, #36] ; 0x24
  22652. {
  22653. traceQUEUE_PEEK( pxQueue );
  22654. /* The data is not being removed, so reset the read
  22655. pointer. */
  22656. pxQueue->u.pcReadFrom = pcOriginalReadPosition;
  22657. 80291e4: 60e5 str r5, [r4, #12]
  22658. /* The data is being left in the queue, so see if there are
  22659. any other tasks waiting for the data. */
  22660. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  22661. 80291e6: b12b cbz r3, 80291f4 <xQueueGenericReceive+0x88>
  22662. {
  22663. /* Tasks that are removed from the event list will get added to
  22664. the pending ready list as the scheduler is still suspended. */
  22665. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  22666. 80291e8: f104 0024 add.w r0, r4, #36 ; 0x24
  22667. 80291ec: f000 fc20 bl 8029a30 <xTaskRemoveFromEventList>
  22668. 80291f0: 2800 cmp r0, #0
  22669. 80291f2: d1f3 bne.n 80291dc <xQueueGenericReceive+0x70>
  22670. {
  22671. mtCOVERAGE_TEST_MARKER();
  22672. }
  22673. }
  22674. taskEXIT_CRITICAL();
  22675. 80291f4: f000 ff54 bl 802a0a0 <vPortExitCritical>
  22676. return pdPASS;
  22677. 80291f8: 2001 movs r0, #1
  22678. 80291fa: e057 b.n 80292ac <xQueueGenericReceive+0x140>
  22679. }
  22680. else
  22681. {
  22682. if( xTicksToWait == ( TickType_t ) 0 )
  22683. 80291fc: f8dd 8004 ldr.w r8, [sp, #4]
  22684. 8029200: f1b8 0f00 cmp.w r8, #0
  22685. 8029204: d102 bne.n 802920c <xQueueGenericReceive+0xa0>
  22686. {
  22687. /* The queue was empty and no block time is specified (or
  22688. the block time has expired) so leave now. */
  22689. taskEXIT_CRITICAL();
  22690. 8029206: f000 ff4b bl 802a0a0 <vPortExitCritical>
  22691. 802920a: e041 b.n 8029290 <xQueueGenericReceive+0x124>
  22692. traceQUEUE_RECEIVE_FAILED( pxQueue );
  22693. return errQUEUE_EMPTY;
  22694. }
  22695. else if( xEntryTimeSet == pdFALSE )
  22696. 802920c: b915 cbnz r5, 8029214 <xQueueGenericReceive+0xa8>
  22697. {
  22698. /* The queue was empty and a block time was specified so
  22699. configure the timeout structure. */
  22700. vTaskSetTimeOutState( &xTimeOut );
  22701. 802920e: a802 add r0, sp, #8
  22702. 8029210: f000 fc4a bl 8029aa8 <vTaskSetTimeOutState>
  22703. /* Entry time was already set. */
  22704. mtCOVERAGE_TEST_MARKER();
  22705. }
  22706. }
  22707. }
  22708. taskEXIT_CRITICAL();
  22709. 8029214: f000 ff44 bl 802a0a0 <vPortExitCritical>
  22710. /* Interrupts and other tasks can send to and receive from the queue
  22711. now the critical section has been exited. */
  22712. vTaskSuspendAll();
  22713. 8029218: f000 fa12 bl 8029640 <vTaskSuspendAll>
  22714. prvLockQueue( pxQueue );
  22715. 802921c: f000 ff14 bl 802a048 <vPortEnterCritical>
  22716. 8029220: 6c63 ldr r3, [r4, #68] ; 0x44
  22717. 8029222: 3301 adds r3, #1
  22718. 8029224: bf08 it eq
  22719. 8029226: 6467 streq r7, [r4, #68] ; 0x44
  22720. 8029228: 6ca3 ldr r3, [r4, #72] ; 0x48
  22721. 802922a: 3301 adds r3, #1
  22722. 802922c: bf08 it eq
  22723. 802922e: 64a7 streq r7, [r4, #72] ; 0x48
  22724. 8029230: f000 ff36 bl 802a0a0 <vPortExitCritical>
  22725. /* Update the timeout state to see if it has expired yet. */
  22726. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  22727. 8029234: a802 add r0, sp, #8
  22728. 8029236: a901 add r1, sp, #4
  22729. 8029238: f000 fc46 bl 8029ac8 <xTaskCheckForTimeOut>
  22730. 802923c: bb18 cbnz r0, 8029286 <xQueueGenericReceive+0x11a>
  22731. static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue )
  22732. {
  22733. BaseType_t xReturn;
  22734. taskENTER_CRITICAL();
  22735. 802923e: f000 ff03 bl 802a048 <vPortEnterCritical>
  22736. {
  22737. if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 )
  22738. 8029242: 6ba5 ldr r5, [r4, #56] ; 0x38
  22739. else
  22740. {
  22741. xReturn = pdFALSE;
  22742. }
  22743. }
  22744. taskEXIT_CRITICAL();
  22745. 8029244: f000 ff2c bl 802a0a0 <vPortExitCritical>
  22746. prvLockQueue( pxQueue );
  22747. /* Update the timeout state to see if it has expired yet. */
  22748. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  22749. {
  22750. if( prvIsQueueEmpty( pxQueue ) != pdFALSE )
  22751. 8029248: b9bd cbnz r5, 802927a <xQueueGenericReceive+0x10e>
  22752. {
  22753. traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );
  22754. #if ( configUSE_MUTEXES == 1 )
  22755. {
  22756. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  22757. 802924a: 6823 ldr r3, [r4, #0]
  22758. 802924c: b933 cbnz r3, 802925c <xQueueGenericReceive+0xf0>
  22759. {
  22760. taskENTER_CRITICAL();
  22761. 802924e: f000 fefb bl 802a048 <vPortEnterCritical>
  22762. {
  22763. vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder );
  22764. 8029252: 6860 ldr r0, [r4, #4]
  22765. 8029254: f000 fc7c bl 8029b50 <vTaskPriorityInherit>
  22766. }
  22767. taskEXIT_CRITICAL();
  22768. 8029258: f000 ff22 bl 802a0a0 <vPortExitCritical>
  22769. mtCOVERAGE_TEST_MARKER();
  22770. }
  22771. }
  22772. #endif
  22773. vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );
  22774. 802925c: f104 0024 add.w r0, r4, #36 ; 0x24
  22775. 8029260: 9901 ldr r1, [sp, #4]
  22776. 8029262: f000 fb89 bl 8029978 <vTaskPlaceOnEventList>
  22777. prvUnlockQueue( pxQueue );
  22778. 8029266: 4620 mov r0, r4
  22779. 8029268: f7ff fd54 bl 8028d14 <prvUnlockQueue>
  22780. if( xTaskResumeAll() == pdFALSE )
  22781. 802926c: f000 fa84 bl 8029778 <xTaskResumeAll>
  22782. 8029270: 2800 cmp r0, #0
  22783. 8029272: d193 bne.n 802919c <xQueueGenericReceive+0x30>
  22784. {
  22785. portYIELD_WITHIN_API();
  22786. 8029274: f000 fed4 bl 802a020 <vPortYield>
  22787. 8029278: e790 b.n 802919c <xQueueGenericReceive+0x30>
  22788. }
  22789. }
  22790. else
  22791. {
  22792. /* Try again. */
  22793. prvUnlockQueue( pxQueue );
  22794. 802927a: 4620 mov r0, r4
  22795. 802927c: f7ff fd4a bl 8028d14 <prvUnlockQueue>
  22796. ( void ) xTaskResumeAll();
  22797. 8029280: f000 fa7a bl 8029778 <xTaskResumeAll>
  22798. 8029284: e78a b.n 802919c <xQueueGenericReceive+0x30>
  22799. }
  22800. }
  22801. else
  22802. {
  22803. prvUnlockQueue( pxQueue );
  22804. 8029286: 4620 mov r0, r4
  22805. 8029288: f7ff fd44 bl 8028d14 <prvUnlockQueue>
  22806. ( void ) xTaskResumeAll();
  22807. 802928c: f000 fa74 bl 8029778 <xTaskResumeAll>
  22808. traceQUEUE_RECEIVE_FAILED( pxQueue );
  22809. return errQUEUE_EMPTY;
  22810. 8029290: 2000 movs r0, #0
  22811. 8029292: e00b b.n 80292ac <xQueueGenericReceive+0x140>
  22812. TimeOut_t xTimeOut;
  22813. int8_t *pcOriginalReadPosition;
  22814. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  22815. configASSERT( pxQueue );
  22816. configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  22817. 8029294: f000 fed0 bl 802a038 <ulPortSetInterruptMask>
  22818. 8029298: e77b b.n 8029192 <xQueueGenericReceive+0x26>
  22819. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  22820. {
  22821. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  22822. 802929a: f000 fc49 bl 8029b30 <xTaskGetSchedulerState>
  22823. 802929e: 2800 cmp r0, #0
  22824. 80292a0: f47f af7e bne.w 80291a0 <xQueueGenericReceive+0x34>
  22825. 80292a4: e776 b.n 8029194 <xQueueGenericReceive+0x28>
  22826. 80292a6: f000 fec7 bl 802a038 <ulPortSetInterruptMask>
  22827. 80292aa: e776 b.n 802919a <xQueueGenericReceive+0x2e>
  22828. ( void ) xTaskResumeAll();
  22829. traceQUEUE_RECEIVE_FAILED( pxQueue );
  22830. return errQUEUE_EMPTY;
  22831. }
  22832. }
  22833. }
  22834. 80292ac: b005 add sp, #20
  22835. 80292ae: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  22836. 080292b2 <uxQueueSpacesAvailable>:
  22837. return uxReturn;
  22838. } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */
  22839. /*-----------------------------------------------------------*/
  22840. UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue )
  22841. {
  22842. 80292b2: b510 push {r4, lr}
  22843. UBaseType_t uxReturn;
  22844. Queue_t *pxQueue;
  22845. pxQueue = ( Queue_t * ) xQueue;
  22846. configASSERT( pxQueue );
  22847. 80292b4: 4604 mov r4, r0
  22848. 80292b6: b910 cbnz r0, 80292be <uxQueueSpacesAvailable+0xc>
  22849. 80292b8: f000 febe bl 802a038 <ulPortSetInterruptMask>
  22850. 80292bc: e7fe b.n 80292bc <uxQueueSpacesAvailable+0xa>
  22851. taskENTER_CRITICAL();
  22852. 80292be: f000 fec3 bl 802a048 <vPortEnterCritical>
  22853. {
  22854. uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting;
  22855. 80292c2: 6ba3 ldr r3, [r4, #56] ; 0x38
  22856. 80292c4: 6be4 ldr r4, [r4, #60] ; 0x3c
  22857. 80292c6: 1ae4 subs r4, r4, r3
  22858. }
  22859. taskEXIT_CRITICAL();
  22860. 80292c8: f000 feea bl 802a0a0 <vPortExitCritical>
  22861. return uxReturn;
  22862. } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */
  22863. 80292cc: 4620 mov r0, r4
  22864. 80292ce: bd10 pop {r4, pc}
  22865. 080292d0 <vQueueWaitForMessageRestricted>:
  22866. /*-----------------------------------------------------------*/
  22867. #if ( configUSE_TIMERS == 1 )
  22868. void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait )
  22869. {
  22870. 80292d0: b538 push {r3, r4, r5, lr}
  22871. 80292d2: 4604 mov r4, r0
  22872. 80292d4: 460d mov r5, r1
  22873. will not actually cause the task to block, just place it on a blocked
  22874. list. It will not block until the scheduler is unlocked - at which
  22875. time a yield will be performed. If an item is added to the queue while
  22876. the queue is locked, and the calling task blocks on the queue, then the
  22877. calling task will be immediately unblocked when the queue is unlocked. */
  22878. prvLockQueue( pxQueue );
  22879. 80292d6: f000 feb7 bl 802a048 <vPortEnterCritical>
  22880. 80292da: 6c63 ldr r3, [r4, #68] ; 0x44
  22881. 80292dc: 3301 adds r3, #1
  22882. 80292de: d101 bne.n 80292e4 <vQueueWaitForMessageRestricted+0x14>
  22883. 80292e0: 2300 movs r3, #0
  22884. 80292e2: 6463 str r3, [r4, #68] ; 0x44
  22885. 80292e4: 6ca3 ldr r3, [r4, #72] ; 0x48
  22886. 80292e6: 3301 adds r3, #1
  22887. 80292e8: d101 bne.n 80292ee <vQueueWaitForMessageRestricted+0x1e>
  22888. 80292ea: 2300 movs r3, #0
  22889. 80292ec: 64a3 str r3, [r4, #72] ; 0x48
  22890. 80292ee: f000 fed7 bl 802a0a0 <vPortExitCritical>
  22891. if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U )
  22892. 80292f2: 6ba3 ldr r3, [r4, #56] ; 0x38
  22893. 80292f4: b923 cbnz r3, 8029300 <vQueueWaitForMessageRestricted+0x30>
  22894. {
  22895. /* There is nothing in the queue, block for the specified period. */
  22896. vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );
  22897. 80292f6: f104 0024 add.w r0, r4, #36 ; 0x24
  22898. 80292fa: 4629 mov r1, r5
  22899. 80292fc: f000 fb70 bl 80299e0 <vTaskPlaceOnEventListRestricted>
  22900. }
  22901. else
  22902. {
  22903. mtCOVERAGE_TEST_MARKER();
  22904. }
  22905. prvUnlockQueue( pxQueue );
  22906. 8029300: 4620 mov r0, r4
  22907. }
  22908. 8029302: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  22909. }
  22910. else
  22911. {
  22912. mtCOVERAGE_TEST_MARKER();
  22913. }
  22914. prvUnlockQueue( pxQueue );
  22915. 8029306: f7ff bd05 b.w 8028d14 <prvUnlockQueue>
  22916. 802930a: 0000 movs r0, r0
  22917. 0802930c <prvResetNextTaskUnblockTime>:
  22918. static void prvResetNextTaskUnblockTime( void )
  22919. {
  22920. TCB_t *pxTCB;
  22921. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  22922. 802930c: 4a06 ldr r2, [pc, #24] ; (8029328 <prvResetNextTaskUnblockTime+0x1c>)
  22923. 802930e: 6813 ldr r3, [r2, #0]
  22924. 8029310: 6819 ldr r1, [r3, #0]
  22925. 8029312: 4b06 ldr r3, [pc, #24] ; (802932c <prvResetNextTaskUnblockTime+0x20>)
  22926. 8029314: b911 cbnz r1, 802931c <prvResetNextTaskUnblockTime+0x10>
  22927. /* The new current delayed list is empty. Set
  22928. xNextTaskUnblockTime to the maximum possible value so it is
  22929. extremely unlikely that the
  22930. if( xTickCount >= xNextTaskUnblockTime ) test will pass until
  22931. there is an item in the delayed list. */
  22932. xNextTaskUnblockTime = portMAX_DELAY;
  22933. 8029316: f04f 32ff mov.w r2, #4294967295
  22934. 802931a: e003 b.n 8029324 <prvResetNextTaskUnblockTime+0x18>
  22935. {
  22936. /* The new current delayed list is not empty, get the value of
  22937. the item at the head of the delayed list. This is the time at
  22938. which the task at the head of the delayed list should be removed
  22939. from the Blocked state. */
  22940. ( pxTCB ) = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );
  22941. 802931c: 6812 ldr r2, [r2, #0]
  22942. 802931e: 68d2 ldr r2, [r2, #12]
  22943. xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xGenericListItem ) );
  22944. 8029320: 68d2 ldr r2, [r2, #12]
  22945. 8029322: 6852 ldr r2, [r2, #4]
  22946. 8029324: 601a str r2, [r3, #0]
  22947. 8029326: 4770 bx lr
  22948. 8029328: 200028e8 .word 0x200028e8
  22949. 802932c: 200015d8 .word 0x200015d8
  22950. 08029330 <prvAddCurrentTaskToDelayedList>:
  22951. /*-----------------------------------------------------------*/
  22952. static void prvAddCurrentTaskToDelayedList( const TickType_t xTimeToWake )
  22953. {
  22954. /* The list item will be inserted in wake time order. */
  22955. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  22956. 8029330: 4b0e ldr r3, [pc, #56] ; (802936c <prvAddCurrentTaskToDelayedList+0x3c>)
  22957. 8029332: 681a ldr r2, [r3, #0]
  22958. #endif /* vTaskDelete */
  22959. }
  22960. /*-----------------------------------------------------------*/
  22961. static void prvAddCurrentTaskToDelayedList( const TickType_t xTimeToWake )
  22962. {
  22963. 8029334: b510 push {r4, lr}
  22964. /* The list item will be inserted in wake time order. */
  22965. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  22966. 8029336: 6050 str r0, [r2, #4]
  22967. if( xTimeToWake < xTickCount )
  22968. 8029338: 4a0d ldr r2, [pc, #52] ; (8029370 <prvAddCurrentTaskToDelayedList+0x40>)
  22969. 802933a: 6812 ldr r2, [r2, #0]
  22970. 802933c: 4290 cmp r0, r2
  22971. #endif /* vTaskDelete */
  22972. }
  22973. /*-----------------------------------------------------------*/
  22974. static void prvAddCurrentTaskToDelayedList( const TickType_t xTimeToWake )
  22975. {
  22976. 802933e: 4604 mov r4, r0
  22977. /* The list item will be inserted in wake time order. */
  22978. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  22979. if( xTimeToWake < xTickCount )
  22980. 8029340: d207 bcs.n 8029352 <prvAddCurrentTaskToDelayedList+0x22>
  22981. {
  22982. /* Wake time has overflowed. Place this item in the overflow list. */
  22983. vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  22984. 8029342: 4a0c ldr r2, [pc, #48] ; (8029374 <prvAddCurrentTaskToDelayedList+0x44>)
  22985. 8029344: 6810 ldr r0, [r2, #0]
  22986. 8029346: 6819 ldr r1, [r3, #0]
  22987. 8029348: 3104 adds r1, #4
  22988. else
  22989. {
  22990. mtCOVERAGE_TEST_MARKER();
  22991. }
  22992. }
  22993. }
  22994. 802934a: e8bd 4010 ldmia.w sp!, {r4, lr}
  22995. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  22996. if( xTimeToWake < xTickCount )
  22997. {
  22998. /* Wake time has overflowed. Place this item in the overflow list. */
  22999. vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  23000. 802934e: f7ff bcb9 b.w 8028cc4 <vListInsert>
  23001. }
  23002. else
  23003. {
  23004. /* The wake time has not overflowed, so the current block list is used. */
  23005. vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  23006. 8029352: 4a09 ldr r2, [pc, #36] ; (8029378 <prvAddCurrentTaskToDelayedList+0x48>)
  23007. 8029354: 6810 ldr r0, [r2, #0]
  23008. 8029356: 6819 ldr r1, [r3, #0]
  23009. 8029358: 3104 adds r1, #4
  23010. 802935a: f7ff fcb3 bl 8028cc4 <vListInsert>
  23011. /* If the task entering the blocked state was placed at the head of the
  23012. list of blocked tasks then xNextTaskUnblockTime needs to be updated
  23013. too. */
  23014. if( xTimeToWake < xNextTaskUnblockTime )
  23015. 802935e: 4b07 ldr r3, [pc, #28] ; (802937c <prvAddCurrentTaskToDelayedList+0x4c>)
  23016. 8029360: 681a ldr r2, [r3, #0]
  23017. 8029362: 4294 cmp r4, r2
  23018. {
  23019. xNextTaskUnblockTime = xTimeToWake;
  23020. 8029364: bf38 it cc
  23021. 8029366: 601c strcc r4, [r3, #0]
  23022. 8029368: bd10 pop {r4, pc}
  23023. 802936a: bf00 nop
  23024. 802936c: 20002998 .word 0x20002998
  23025. 8029370: 200029b4 .word 0x200029b4
  23026. 8029374: 200029b8 .word 0x200029b8
  23027. 8029378: 200028e8 .word 0x200028e8
  23028. 802937c: 200015d8 .word 0x200015d8
  23029. 08029380 <xTaskGenericCreate>:
  23030. #endif
  23031. /*-----------------------------------------------------------*/
  23032. BaseType_t xTaskGenericCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask, StackType_t * const puxStackBuffer, const MemoryRegion_t * const xRegions ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
  23033. {
  23034. 8029380: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  23035. 8029384: 9d0a ldr r5, [sp, #40] ; 0x28
  23036. 8029386: f8dd 802c ldr.w r8, [sp, #44] ; 0x2c
  23037. 802938a: 9e0c ldr r6, [sp, #48] ; 0x30
  23038. 802938c: 460f mov r7, r1
  23039. 802938e: 4693 mov fp, r2
  23040. 8029390: 469a mov sl, r3
  23041. BaseType_t xReturn;
  23042. TCB_t * pxNewTCB;
  23043. StackType_t *pxTopOfStack;
  23044. configASSERT( pxTaskCode );
  23045. 8029392: 4681 mov r9, r0
  23046. 8029394: b910 cbnz r0, 802939c <xTaskGenericCreate+0x1c>
  23047. 8029396: f000 fe4f bl 802a038 <ulPortSetInterruptMask>
  23048. 802939a: e7fe b.n 802939a <xTaskGenericCreate+0x1a>
  23049. configASSERT( ( ( uxPriority & ( ~portPRIVILEGE_BIT ) ) < configMAX_PRIORITIES ) );
  23050. 802939c: 2d04 cmp r5, #4
  23051. 802939e: d902 bls.n 80293a6 <xTaskGenericCreate+0x26>
  23052. 80293a0: f000 fe4a bl 802a038 <ulPortSetInterruptMask>
  23053. 80293a4: e7fe b.n 80293a4 <xTaskGenericCreate+0x24>
  23054. #else /* portSTACK_GROWTH */
  23055. {
  23056. StackType_t *pxStack;
  23057. /* Allocate space for the stack used by the task being created. */
  23058. pxStack = ( StackType_t * ) pvPortMallocAligned( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ), puxStackBuffer ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  23059. 80293a6: b936 cbnz r6, 80293b6 <xTaskGenericCreate+0x36>
  23060. 80293a8: 0090 lsls r0, r2, #2
  23061. 80293aa: f000 ff5b bl 802a264 <pvPortMalloc>
  23062. if( pxStack != NULL )
  23063. 80293ae: 4606 mov r6, r0
  23064. 80293b0: 2800 cmp r0, #0
  23065. 80293b2: f000 809e beq.w 80294f2 <xTaskGenericCreate+0x172>
  23066. {
  23067. /* Allocate space for the TCB. Where the memory comes from depends
  23068. on the implementation of the port malloc function. */
  23069. pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) );
  23070. 80293b6: 205c movs r0, #92 ; 0x5c
  23071. 80293b8: f000 ff54 bl 802a264 <pvPortMalloc>
  23072. if( pxNewTCB != NULL )
  23073. 80293bc: 4604 mov r4, r0
  23074. 80293be: b178 cbz r0, 80293e0 <xTaskGenericCreate+0x60>
  23075. {
  23076. /* Store the stack location in the TCB. */
  23077. pxNewTCB->pxStack = pxStack;
  23078. 80293c0: 6306 str r6, [r0, #48] ; 0x30
  23079. {
  23080. /* Avoid dependency on memset() if it is not required. */
  23081. #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) )
  23082. {
  23083. /* Just to help debugging. */
  23084. ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) usStackDepth * sizeof( StackType_t ) );
  23085. 80293c2: ea4f 028b mov.w r2, fp, lsl #2
  23086. 80293c6: 4630 mov r0, r6
  23087. 80293c8: 21a5 movs r1, #165 ; 0xa5
  23088. 80293ca: f7f8 fb79 bl 8021ac0 <memset>
  23089. stack grows from high memory to low (as per the 80x86) or vice versa.
  23090. portSTACK_GROWTH is used to make the result positive or negative as
  23091. required by the port. */
  23092. #if( portSTACK_GROWTH < 0 )
  23093. {
  23094. pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - ( uint16_t ) 1 );
  23095. 80293ce: 6b23 ldr r3, [r4, #48] ; 0x30
  23096. 80293d0: f10b 3bff add.w fp, fp, #4294967295
  23097. 80293d4: eb03 0b8b add.w fp, r3, fp, lsl #2
  23098. pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK ) ); /*lint !e923 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. */
  23099. 80293d8: f02b 0b07 bic.w fp, fp, #7
  23100. static void prvInitialiseTCBVariables( TCB_t * const pxTCB, const char * const pcName, UBaseType_t uxPriority, const MemoryRegion_t * const xRegions, const uint16_t usStackDepth ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
  23101. {
  23102. UBaseType_t x;
  23103. /* Store the task name in the TCB. */
  23104. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  23105. 80293dc: 2600 movs r6, #0
  23106. 80293de: e003 b.n 80293e8 <xTaskGenericCreate+0x68>
  23107. }
  23108. else
  23109. {
  23110. /* The stack cannot be used as the TCB was not created. Free it
  23111. again. */
  23112. vPortFree( pxStack );
  23113. 80293e0: 4630 mov r0, r6
  23114. 80293e2: f000 ffc5 bl 802a370 <vPortFree>
  23115. 80293e6: e084 b.n 80294f2 <xTaskGenericCreate+0x172>
  23116. static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName );
  23117. #endif
  23118. /*-----------------------------------------------------------*/
  23119. BaseType_t xTaskGenericCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask, StackType_t * const puxStackBuffer, const MemoryRegion_t * const xRegions ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
  23120. 80293e8: 19a3 adds r3, r4, r6
  23121. UBaseType_t x;
  23122. /* Store the task name in the TCB. */
  23123. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  23124. {
  23125. pxTCB->pcTaskName[ x ] = pcName[ x ];
  23126. 80293ea: 5dba ldrb r2, [r7, r6]
  23127. 80293ec: f883 2034 strb.w r2, [r3, #52] ; 0x34
  23128. /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than
  23129. configMAX_TASK_NAME_LEN characters just in case the memory after the
  23130. string is not accessible (extremely unlikely). */
  23131. if( pcName[ x ] == 0x00 )
  23132. 80293f0: 5dbb ldrb r3, [r7, r6]
  23133. 80293f2: b113 cbz r3, 80293fa <xTaskGenericCreate+0x7a>
  23134. static void prvInitialiseTCBVariables( TCB_t * const pxTCB, const char * const pcName, UBaseType_t uxPriority, const MemoryRegion_t * const xRegions, const uint16_t usStackDepth ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
  23135. {
  23136. UBaseType_t x;
  23137. /* Store the task name in the TCB. */
  23138. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  23139. 80293f4: 3601 adds r6, #1
  23140. 80293f6: 2e10 cmp r6, #16
  23141. 80293f8: d1f6 bne.n 80293e8 <xTaskGenericCreate+0x68>
  23142. }
  23143. }
  23144. /* Ensure the name string is terminated in the case that the string length
  23145. was greater or equal to configMAX_TASK_NAME_LEN. */
  23146. pxTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0';
  23147. 80293fa: 2600 movs r6, #0
  23148. pxTCB->uxBasePriority = uxPriority;
  23149. pxTCB->uxMutexesHeld = 0;
  23150. }
  23151. #endif /* configUSE_MUTEXES */
  23152. vListInitialiseItem( &( pxTCB->xGenericListItem ) );
  23153. 80293fc: 1d27 adds r7, r4, #4
  23154. 80293fe: 4638 mov r0, r7
  23155. }
  23156. }
  23157. /* Ensure the name string is terminated in the case that the string length
  23158. was greater or equal to configMAX_TASK_NAME_LEN. */
  23159. pxTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0';
  23160. 8029400: f884 6043 strb.w r6, [r4, #67] ; 0x43
  23161. else
  23162. {
  23163. mtCOVERAGE_TEST_MARKER();
  23164. }
  23165. pxTCB->uxPriority = uxPriority;
  23166. 8029404: 62e5 str r5, [r4, #44] ; 0x2c
  23167. #if ( configUSE_MUTEXES == 1 )
  23168. {
  23169. pxTCB->uxBasePriority = uxPriority;
  23170. 8029406: 64e5 str r5, [r4, #76] ; 0x4c
  23171. pxTCB->uxMutexesHeld = 0;
  23172. 8029408: 6526 str r6, [r4, #80] ; 0x50
  23173. }
  23174. #endif /* configUSE_MUTEXES */
  23175. vListInitialiseItem( &( pxTCB->xGenericListItem ) );
  23176. 802940a: f7ff fc4c bl 8028ca6 <vListInitialiseItem>
  23177. vListInitialiseItem( &( pxTCB->xEventListItem ) );
  23178. 802940e: f104 0018 add.w r0, r4, #24
  23179. 8029412: f7ff fc48 bl 8028ca6 <vListInitialiseItem>
  23180. /* Set the pxTCB as a link back from the ListItem_t. This is so we can get
  23181. back to the containing TCB from a generic item in a list. */
  23182. listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB );
  23183. /* Event lists are always in priority order. */
  23184. listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  23185. 8029416: f1c5 0305 rsb r3, r5, #5
  23186. }
  23187. #endif /* portUSING_MPU_WRAPPERS */
  23188. #if ( configUSE_TASK_NOTIFICATIONS == 1 )
  23189. {
  23190. pxTCB->ulNotifiedValue = 0;
  23191. 802941a: 6566 str r6, [r4, #84] ; 0x54
  23192. vListInitialiseItem( &( pxTCB->xGenericListItem ) );
  23193. vListInitialiseItem( &( pxTCB->xEventListItem ) );
  23194. /* Set the pxTCB as a link back from the ListItem_t. This is so we can get
  23195. back to the containing TCB from a generic item in a list. */
  23196. listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB );
  23197. 802941c: 6124 str r4, [r4, #16]
  23198. /* Event lists are always in priority order. */
  23199. listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  23200. 802941e: 61a3 str r3, [r4, #24]
  23201. listSET_LIST_ITEM_OWNER( &( pxTCB->xEventListItem ), pxTCB );
  23202. 8029420: 6264 str r4, [r4, #36] ; 0x24
  23203. #endif /* portUSING_MPU_WRAPPERS */
  23204. #if ( configUSE_TASK_NOTIFICATIONS == 1 )
  23205. {
  23206. pxTCB->ulNotifiedValue = 0;
  23207. pxTCB->eNotifyState = eNotWaitingNotification;
  23208. 8029422: f884 6058 strb.w r6, [r4, #88] ; 0x58
  23209. {
  23210. pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged );
  23211. }
  23212. #else /* portUSING_MPU_WRAPPERS */
  23213. {
  23214. pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters );
  23215. 8029426: 4658 mov r0, fp
  23216. 8029428: 4649 mov r1, r9
  23217. 802942a: 4652 mov r2, sl
  23218. 802942c: f000 fdd8 bl 8029fe0 <pxPortInitialiseStack>
  23219. 8029430: 6020 str r0, [r4, #0]
  23220. }
  23221. #endif /* portUSING_MPU_WRAPPERS */
  23222. if( ( void * ) pxCreatedTask != NULL )
  23223. 8029432: f1b8 0f00 cmp.w r8, #0
  23224. 8029436: d001 beq.n 802943c <xTaskGenericCreate+0xbc>
  23225. {
  23226. /* Pass the TCB out - in an anonymous way. The calling function/
  23227. task can use this as a handle to delete the task later if
  23228. required.*/
  23229. *pxCreatedTask = ( TaskHandle_t ) pxNewTCB;
  23230. 8029438: f8c8 4000 str.w r4, [r8]
  23231. mtCOVERAGE_TEST_MARKER();
  23232. }
  23233. /* Ensure interrupts don't access the task lists while they are being
  23234. updated. */
  23235. taskENTER_CRITICAL();
  23236. 802943c: f000 fe04 bl 802a048 <vPortEnterCritical>
  23237. {
  23238. uxCurrentNumberOfTasks++;
  23239. 8029440: 4a2e ldr r2, [pc, #184] ; (80294fc <xTaskGenericCreate+0x17c>)
  23240. 8029442: 6813 ldr r3, [r2, #0]
  23241. 8029444: 3301 adds r3, #1
  23242. 8029446: 6013 str r3, [r2, #0]
  23243. if( pxCurrentTCB == NULL )
  23244. 8029448: 4b2d ldr r3, [pc, #180] ; (8029500 <xTaskGenericCreate+0x180>)
  23245. 802944a: 681e ldr r6, [r3, #0]
  23246. 802944c: bb36 cbnz r6, 802949c <xTaskGenericCreate+0x11c>
  23247. {
  23248. /* There are no other tasks, or all the other tasks are in
  23249. the suspended state - make this the current task. */
  23250. pxCurrentTCB = pxNewTCB;
  23251. 802944e: 601c str r4, [r3, #0]
  23252. if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 )
  23253. 8029450: 6813 ldr r3, [r2, #0]
  23254. 8029452: 2b01 cmp r3, #1
  23255. 8029454: d12a bne.n 80294ac <xTaskGenericCreate+0x12c>
  23256. {
  23257. UBaseType_t uxPriority;
  23258. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  23259. {
  23260. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  23261. 8029456: f8df 80d0 ldr.w r8, [pc, #208] ; 8029528 <xTaskGenericCreate+0x1a8>
  23262. 802945a: f04f 0914 mov.w r9, #20
  23263. 802945e: fb09 8006 mla r0, r9, r6, r8
  23264. static void prvInitialiseTaskLists( void )
  23265. {
  23266. UBaseType_t uxPriority;
  23267. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  23268. 8029462: 3601 adds r6, #1
  23269. {
  23270. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  23271. 8029464: f7ff fc14 bl 8028c90 <vListInitialise>
  23272. static void prvInitialiseTaskLists( void )
  23273. {
  23274. UBaseType_t uxPriority;
  23275. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  23276. 8029468: 2e05 cmp r6, #5
  23277. 802946a: d1f8 bne.n 802945e <xTaskGenericCreate+0xde>
  23278. {
  23279. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  23280. }
  23281. vListInitialise( &xDelayedTaskList1 );
  23282. 802946c: f8df 80bc ldr.w r8, [pc, #188] ; 802952c <xTaskGenericCreate+0x1ac>
  23283. vListInitialise( &xDelayedTaskList2 );
  23284. 8029470: 4e24 ldr r6, [pc, #144] ; (8029504 <xTaskGenericCreate+0x184>)
  23285. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  23286. {
  23287. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  23288. }
  23289. vListInitialise( &xDelayedTaskList1 );
  23290. 8029472: 4640 mov r0, r8
  23291. 8029474: f7ff fc0c bl 8028c90 <vListInitialise>
  23292. vListInitialise( &xDelayedTaskList2 );
  23293. 8029478: 4630 mov r0, r6
  23294. 802947a: f7ff fc09 bl 8028c90 <vListInitialise>
  23295. vListInitialise( &xPendingReadyList );
  23296. 802947e: 4822 ldr r0, [pc, #136] ; (8029508 <xTaskGenericCreate+0x188>)
  23297. 8029480: f7ff fc06 bl 8028c90 <vListInitialise>
  23298. #if ( INCLUDE_vTaskDelete == 1 )
  23299. {
  23300. vListInitialise( &xTasksWaitingTermination );
  23301. 8029484: 4821 ldr r0, [pc, #132] ; (802950c <xTaskGenericCreate+0x18c>)
  23302. 8029486: f7ff fc03 bl 8028c90 <vListInitialise>
  23303. }
  23304. #endif /* INCLUDE_vTaskDelete */
  23305. #if ( INCLUDE_vTaskSuspend == 1 )
  23306. {
  23307. vListInitialise( &xSuspendedTaskList );
  23308. 802948a: 4821 ldr r0, [pc, #132] ; (8029510 <xTaskGenericCreate+0x190>)
  23309. 802948c: f7ff fc00 bl 8028c90 <vListInitialise>
  23310. }
  23311. #endif /* INCLUDE_vTaskSuspend */
  23312. /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList
  23313. using list2. */
  23314. pxDelayedTaskList = &xDelayedTaskList1;
  23315. 8029490: 4b20 ldr r3, [pc, #128] ; (8029514 <xTaskGenericCreate+0x194>)
  23316. 8029492: f8c3 8000 str.w r8, [r3]
  23317. pxOverflowDelayedTaskList = &xDelayedTaskList2;
  23318. 8029496: 4b20 ldr r3, [pc, #128] ; (8029518 <xTaskGenericCreate+0x198>)
  23319. 8029498: 601e str r6, [r3, #0]
  23320. 802949a: e007 b.n 80294ac <xTaskGenericCreate+0x12c>
  23321. else
  23322. {
  23323. /* If the scheduler is not already running, make this task the
  23324. current task if it is the highest priority task to be created
  23325. so far. */
  23326. if( xSchedulerRunning == pdFALSE )
  23327. 802949c: 4a1f ldr r2, [pc, #124] ; (802951c <xTaskGenericCreate+0x19c>)
  23328. 802949e: 6812 ldr r2, [r2, #0]
  23329. 80294a0: b922 cbnz r2, 80294ac <xTaskGenericCreate+0x12c>
  23330. {
  23331. if( pxCurrentTCB->uxPriority <= uxPriority )
  23332. 80294a2: 681a ldr r2, [r3, #0]
  23333. 80294a4: 6ad2 ldr r2, [r2, #44] ; 0x2c
  23334. 80294a6: 42aa cmp r2, r5
  23335. {
  23336. pxCurrentTCB = pxNewTCB;
  23337. 80294a8: bf98 it ls
  23338. 80294aa: 601c strls r4, [r3, #0]
  23339. {
  23340. mtCOVERAGE_TEST_MARKER();
  23341. }
  23342. }
  23343. uxTaskNumber++;
  23344. 80294ac: 4a1c ldr r2, [pc, #112] ; (8029520 <xTaskGenericCreate+0x1a0>)
  23345. 80294ae: 6813 ldr r3, [r2, #0]
  23346. 80294b0: 3301 adds r3, #1
  23347. 80294b2: 6013 str r3, [r2, #0]
  23348. pxNewTCB->uxTCBNumber = uxTaskNumber;
  23349. }
  23350. #endif /* configUSE_TRACE_FACILITY */
  23351. traceTASK_CREATE( pxNewTCB );
  23352. prvAddTaskToReadyList( pxNewTCB );
  23353. 80294b4: 4a1b ldr r2, [pc, #108] ; (8029524 <xTaskGenericCreate+0x1a4>)
  23354. uxTaskNumber++;
  23355. #if ( configUSE_TRACE_FACILITY == 1 )
  23356. {
  23357. /* Add a counter into the TCB for tracing only. */
  23358. pxNewTCB->uxTCBNumber = uxTaskNumber;
  23359. 80294b6: 6463 str r3, [r4, #68] ; 0x44
  23360. }
  23361. #endif /* configUSE_TRACE_FACILITY */
  23362. traceTASK_CREATE( pxNewTCB );
  23363. prvAddTaskToReadyList( pxNewTCB );
  23364. 80294b8: 6ae3 ldr r3, [r4, #44] ; 0x2c
  23365. 80294ba: 6811 ldr r1, [r2, #0]
  23366. 80294bc: 2401 movs r4, #1
  23367. 80294be: fa04 f003 lsl.w r0, r4, r3
  23368. 80294c2: 4301 orrs r1, r0
  23369. 80294c4: 6011 str r1, [r2, #0]
  23370. 80294c6: 4a18 ldr r2, [pc, #96] ; (8029528 <xTaskGenericCreate+0x1a8>)
  23371. 80294c8: 2014 movs r0, #20
  23372. 80294ca: fb00 2003 mla r0, r0, r3, r2
  23373. 80294ce: 4639 mov r1, r7
  23374. 80294d0: f7ff fbec bl 8028cac <vListInsertEnd>
  23375. xReturn = pdPASS;
  23376. portSETUP_TCB( pxNewTCB );
  23377. }
  23378. taskEXIT_CRITICAL();
  23379. 80294d4: f000 fde4 bl 802a0a0 <vPortExitCritical>
  23380. traceTASK_CREATE_FAILED();
  23381. }
  23382. if( xReturn == pdPASS )
  23383. {
  23384. if( xSchedulerRunning != pdFALSE )
  23385. 80294d8: 4b10 ldr r3, [pc, #64] ; (802951c <xTaskGenericCreate+0x19c>)
  23386. 80294da: 681b ldr r3, [r3, #0]
  23387. 80294dc: b133 cbz r3, 80294ec <xTaskGenericCreate+0x16c>
  23388. {
  23389. /* If the created task is of a higher priority than the current task
  23390. then it should run now. */
  23391. if( pxCurrentTCB->uxPriority < uxPriority )
  23392. 80294de: 4b08 ldr r3, [pc, #32] ; (8029500 <xTaskGenericCreate+0x180>)
  23393. 80294e0: 681b ldr r3, [r3, #0]
  23394. 80294e2: 6adb ldr r3, [r3, #44] ; 0x2c
  23395. 80294e4: 42ab cmp r3, r5
  23396. 80294e6: d201 bcs.n 80294ec <xTaskGenericCreate+0x16c>
  23397. {
  23398. taskYIELD_IF_USING_PREEMPTION();
  23399. 80294e8: f000 fd9a bl 802a020 <vPortYield>
  23400. #endif /* configUSE_TRACE_FACILITY */
  23401. traceTASK_CREATE( pxNewTCB );
  23402. prvAddTaskToReadyList( pxNewTCB );
  23403. xReturn = pdPASS;
  23404. 80294ec: 4620 mov r0, r4
  23405. 80294ee: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  23406. }
  23407. taskEXIT_CRITICAL();
  23408. }
  23409. else
  23410. {
  23411. xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
  23412. 80294f2: f04f 30ff mov.w r0, #4294967295
  23413. mtCOVERAGE_TEST_MARKER();
  23414. }
  23415. }
  23416. return xReturn;
  23417. }
  23418. 80294f6: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  23419. 80294fa: bf00 nop
  23420. 80294fc: 200029c0 .word 0x200029c0
  23421. 8029500: 20002998 .word 0x20002998
  23422. 8029504: 20002908 .word 0x20002908
  23423. 8029508: 2000299c .word 0x2000299c
  23424. 802950c: 20002984 .word 0x20002984
  23425. 8029510: 200029c4 .word 0x200029c4
  23426. 8029514: 200028e8 .word 0x200028e8
  23427. 8029518: 200029b8 .word 0x200029b8
  23428. 802951c: 200028ec .word 0x200028ec
  23429. 8029520: 200029bc .word 0x200029bc
  23430. 8029524: 200029d8 .word 0x200029d8
  23431. 8029528: 20002920 .word 0x20002920
  23432. 802952c: 200028f4 .word 0x200028f4
  23433. 08029530 <vTaskDelete>:
  23434. /*-----------------------------------------------------------*/
  23435. #if ( INCLUDE_vTaskDelete == 1 )
  23436. void vTaskDelete( TaskHandle_t xTaskToDelete )
  23437. {
  23438. 8029530: b538 push {r3, r4, r5, lr}
  23439. 8029532: 4604 mov r4, r0
  23440. TCB_t *pxTCB;
  23441. taskENTER_CRITICAL();
  23442. 8029534: f000 fd88 bl 802a048 <vPortEnterCritical>
  23443. {
  23444. /* If null is passed in here then it is the calling task that is
  23445. being deleted. */
  23446. pxTCB = prvGetTCBFromHandle( xTaskToDelete );
  23447. 8029538: b90c cbnz r4, 802953e <vTaskDelete+0xe>
  23448. 802953a: 4b22 ldr r3, [pc, #136] ; (80295c4 <vTaskDelete+0x94>)
  23449. 802953c: 681c ldr r4, [r3, #0]
  23450. /* Remove task from the ready list and place in the termination list.
  23451. This will stop the task from be scheduled. The idle task will check
  23452. the termination list and free up any memory allocated by the
  23453. scheduler for the TCB and stack. */
  23454. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  23455. 802953e: 1d25 adds r5, r4, #4
  23456. 8029540: 4628 mov r0, r5
  23457. 8029542: f7ff fbd7 bl 8028cf4 <uxListRemove>
  23458. 8029546: b968 cbnz r0, 8029564 <vTaskDelete+0x34>
  23459. {
  23460. taskRESET_READY_PRIORITY( pxTCB->uxPriority );
  23461. 8029548: 6ae2 ldr r2, [r4, #44] ; 0x2c
  23462. 802954a: 491f ldr r1, [pc, #124] ; (80295c8 <vTaskDelete+0x98>)
  23463. 802954c: 2314 movs r3, #20
  23464. 802954e: 4353 muls r3, r2
  23465. 8029550: 58cb ldr r3, [r1, r3]
  23466. 8029552: b93b cbnz r3, 8029564 <vTaskDelete+0x34>
  23467. 8029554: 4b1d ldr r3, [pc, #116] ; (80295cc <vTaskDelete+0x9c>)
  23468. 8029556: 2001 movs r0, #1
  23469. 8029558: 6819 ldr r1, [r3, #0]
  23470. 802955a: fa00 f202 lsl.w r2, r0, r2
  23471. 802955e: ea21 0202 bic.w r2, r1, r2
  23472. 8029562: 601a str r2, [r3, #0]
  23473. {
  23474. mtCOVERAGE_TEST_MARKER();
  23475. }
  23476. /* Is the task waiting on an event also? */
  23477. if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
  23478. 8029564: 6aa3 ldr r3, [r4, #40] ; 0x28
  23479. 8029566: b11b cbz r3, 8029570 <vTaskDelete+0x40>
  23480. {
  23481. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  23482. 8029568: f104 0018 add.w r0, r4, #24
  23483. 802956c: f7ff fbc2 bl 8028cf4 <uxListRemove>
  23484. else
  23485. {
  23486. mtCOVERAGE_TEST_MARKER();
  23487. }
  23488. vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) );
  23489. 8029570: 4817 ldr r0, [pc, #92] ; (80295d0 <vTaskDelete+0xa0>)
  23490. 8029572: 4629 mov r1, r5
  23491. 8029574: f7ff fb9a bl 8028cac <vListInsertEnd>
  23492. /* Increment the ucTasksDeleted variable so the idle task knows
  23493. there is a task that has been deleted and that it should therefore
  23494. check the xTasksWaitingTermination list. */
  23495. ++uxTasksDeleted;
  23496. 8029578: 4b16 ldr r3, [pc, #88] ; (80295d4 <vTaskDelete+0xa4>)
  23497. 802957a: 681a ldr r2, [r3, #0]
  23498. 802957c: 3201 adds r2, #1
  23499. 802957e: 601a str r2, [r3, #0]
  23500. /* Increment the uxTaskNumberVariable also so kernel aware debuggers
  23501. can detect that the task lists need re-generating. */
  23502. uxTaskNumber++;
  23503. 8029580: 4b15 ldr r3, [pc, #84] ; (80295d8 <vTaskDelete+0xa8>)
  23504. 8029582: 681a ldr r2, [r3, #0]
  23505. 8029584: 3201 adds r2, #1
  23506. 8029586: 601a str r2, [r3, #0]
  23507. traceTASK_DELETE( pxTCB );
  23508. }
  23509. taskEXIT_CRITICAL();
  23510. 8029588: f000 fd8a bl 802a0a0 <vPortExitCritical>
  23511. /* Force a reschedule if it is the currently running task that has just
  23512. been deleted. */
  23513. if( xSchedulerRunning != pdFALSE )
  23514. 802958c: 4b13 ldr r3, [pc, #76] ; (80295dc <vTaskDelete+0xac>)
  23515. 802958e: 681b ldr r3, [r3, #0]
  23516. 8029590: 2b00 cmp r3, #0
  23517. 8029592: d015 beq.n 80295c0 <vTaskDelete+0x90>
  23518. {
  23519. if( pxTCB == pxCurrentTCB )
  23520. 8029594: 4b0b ldr r3, [pc, #44] ; (80295c4 <vTaskDelete+0x94>)
  23521. 8029596: 681b ldr r3, [r3, #0]
  23522. 8029598: 429c cmp r4, r3
  23523. 802959a: d109 bne.n 80295b0 <vTaskDelete+0x80>
  23524. {
  23525. configASSERT( uxSchedulerSuspended == 0 );
  23526. 802959c: 4b10 ldr r3, [pc, #64] ; (80295e0 <vTaskDelete+0xb0>)
  23527. 802959e: 681b ldr r3, [r3, #0]
  23528. 80295a0: b113 cbz r3, 80295a8 <vTaskDelete+0x78>
  23529. 80295a2: f000 fd49 bl 802a038 <ulPortSetInterruptMask>
  23530. 80295a6: e7fe b.n 80295a6 <vTaskDelete+0x76>
  23531. prvResetNextTaskUnblockTime();
  23532. }
  23533. taskEXIT_CRITICAL();
  23534. }
  23535. }
  23536. }
  23537. 80295a8: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  23538. in which Windows specific clean up operations are performed,
  23539. after which it is not possible to yield away from this task -
  23540. hence xYieldPending is used to latch that a context switch is
  23541. required. */
  23542. portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending );
  23543. portYIELD_WITHIN_API();
  23544. 80295ac: f000 bd38 b.w 802a020 <vPortYield>
  23545. }
  23546. else
  23547. {
  23548. /* Reset the next expected unblock time in case it referred to
  23549. the task that has just been deleted. */
  23550. taskENTER_CRITICAL();
  23551. 80295b0: f000 fd4a bl 802a048 <vPortEnterCritical>
  23552. {
  23553. prvResetNextTaskUnblockTime();
  23554. 80295b4: f7ff feaa bl 802930c <prvResetNextTaskUnblockTime>
  23555. }
  23556. taskEXIT_CRITICAL();
  23557. }
  23558. }
  23559. }
  23560. 80295b8: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  23561. the task that has just been deleted. */
  23562. taskENTER_CRITICAL();
  23563. {
  23564. prvResetNextTaskUnblockTime();
  23565. }
  23566. taskEXIT_CRITICAL();
  23567. 80295bc: f000 bd70 b.w 802a0a0 <vPortExitCritical>
  23568. 80295c0: bd38 pop {r3, r4, r5, pc}
  23569. 80295c2: bf00 nop
  23570. 80295c4: 20002998 .word 0x20002998
  23571. 80295c8: 20002920 .word 0x20002920
  23572. 80295cc: 200029d8 .word 0x200029d8
  23573. 80295d0: 20002984 .word 0x20002984
  23574. 80295d4: 200028f0 .word 0x200028f0
  23575. 80295d8: 200029bc .word 0x200029bc
  23576. 80295dc: 200028ec .word 0x200028ec
  23577. 80295e0: 200029b0 .word 0x200029b0
  23578. 080295e4 <vTaskStartScheduler>:
  23579. #endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */
  23580. /*-----------------------------------------------------------*/
  23581. void vTaskStartScheduler( void )
  23582. {
  23583. 80295e4: b530 push {r4, r5, lr}
  23584. 80295e6: b085 sub sp, #20
  23585. xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */
  23586. }
  23587. #else
  23588. {
  23589. /* Create the idle task without storing its handle. */
  23590. xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */
  23591. 80295e8: 2400 movs r4, #0
  23592. 80295ea: 2280 movs r2, #128 ; 0x80
  23593. 80295ec: 9400 str r4, [sp, #0]
  23594. 80295ee: 9401 str r4, [sp, #4]
  23595. 80295f0: 9402 str r4, [sp, #8]
  23596. 80295f2: 9403 str r4, [sp, #12]
  23597. 80295f4: 480e ldr r0, [pc, #56] ; (8029630 <vTaskStartScheduler+0x4c>)
  23598. 80295f6: 490f ldr r1, [pc, #60] ; (8029634 <vTaskStartScheduler+0x50>)
  23599. 80295f8: 4623 mov r3, r4
  23600. 80295fa: f7ff fec1 bl 8029380 <xTaskGenericCreate>
  23601. }
  23602. #endif /* INCLUDE_xTaskGetIdleTaskHandle */
  23603. #if ( configUSE_TIMERS == 1 )
  23604. {
  23605. if( xReturn == pdPASS )
  23606. 80295fe: 2801 cmp r0, #1
  23607. xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */
  23608. }
  23609. #else
  23610. {
  23611. /* Create the idle task without storing its handle. */
  23612. xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */
  23613. 8029600: 4605 mov r5, r0
  23614. }
  23615. #endif /* INCLUDE_xTaskGetIdleTaskHandle */
  23616. #if ( configUSE_TIMERS == 1 )
  23617. {
  23618. if( xReturn == pdPASS )
  23619. 8029602: d10f bne.n 8029624 <vTaskStartScheduler+0x40>
  23620. {
  23621. xReturn = xTimerCreateTimerTask();
  23622. 8029604: f000 fb82 bl 8029d0c <xTimerCreateTimerTask>
  23623. mtCOVERAGE_TEST_MARKER();
  23624. }
  23625. }
  23626. #endif /* configUSE_TIMERS */
  23627. if( xReturn == pdPASS )
  23628. 8029608: 2801 cmp r0, #1
  23629. #if ( configUSE_TIMERS == 1 )
  23630. {
  23631. if( xReturn == pdPASS )
  23632. {
  23633. xReturn = xTimerCreateTimerTask();
  23634. 802960a: 4605 mov r5, r0
  23635. mtCOVERAGE_TEST_MARKER();
  23636. }
  23637. }
  23638. #endif /* configUSE_TIMERS */
  23639. if( xReturn == pdPASS )
  23640. 802960c: d10a bne.n 8029624 <vTaskStartScheduler+0x40>
  23641. /* Interrupts are turned off here, to ensure a tick does not occur
  23642. before or during the call to xPortStartScheduler(). The stacks of
  23643. the created tasks contain a status word with interrupts switched on
  23644. so interrupts will automatically get re-enabled when the first task
  23645. starts to run. */
  23646. portDISABLE_INTERRUPTS();
  23647. 802960e: f000 fd13 bl 802a038 <ulPortSetInterruptMask>
  23648. structure specific to the task that will run first. */
  23649. _impure_ptr = &( pxCurrentTCB->xNewLib_reent );
  23650. }
  23651. #endif /* configUSE_NEWLIB_REENTRANT */
  23652. xSchedulerRunning = pdTRUE;
  23653. 8029612: 4b09 ldr r3, [pc, #36] ; (8029638 <vTaskStartScheduler+0x54>)
  23654. 8029614: 601d str r5, [r3, #0]
  23655. xTickCount = ( TickType_t ) 0U;
  23656. 8029616: 4b09 ldr r3, [pc, #36] ; (802963c <vTaskStartScheduler+0x58>)
  23657. 8029618: 601c str r4, [r3, #0]
  23658. /* This line will only be reached if the kernel could not be started,
  23659. because there was not enough FreeRTOS heap to create the idle task
  23660. or the timer task. */
  23661. configASSERT( xReturn );
  23662. }
  23663. }
  23664. 802961a: b005 add sp, #20
  23665. 802961c: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
  23666. the run time counter time base. */
  23667. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS();
  23668. /* Setting up the timer tick is hardware specific and thus in the
  23669. portable interface. */
  23670. if( xPortStartScheduler() != pdFALSE )
  23671. 8029620: f000 bd96 b.w 802a150 <xPortStartScheduler>
  23672. else
  23673. {
  23674. /* This line will only be reached if the kernel could not be started,
  23675. because there was not enough FreeRTOS heap to create the idle task
  23676. or the timer task. */
  23677. configASSERT( xReturn );
  23678. 8029624: b915 cbnz r5, 802962c <vTaskStartScheduler+0x48>
  23679. 8029626: f000 fd07 bl 802a038 <ulPortSetInterruptMask>
  23680. 802962a: e7fe b.n 802962a <vTaskStartScheduler+0x46>
  23681. }
  23682. }
  23683. 802962c: b005 add sp, #20
  23684. 802962e: bd30 pop {r4, r5, pc}
  23685. 8029630: 08029851 .word 0x08029851
  23686. 8029634: 08035f84 .word 0x08035f84
  23687. 8029638: 200028ec .word 0x200028ec
  23688. 802963c: 200029b4 .word 0x200029b4
  23689. 08029640 <vTaskSuspendAll>:
  23690. {
  23691. /* A critical section is not required as the variable is of type
  23692. BaseType_t. Please read Richard Barry's reply in the following link to a
  23693. post in the FreeRTOS support forum before reporting this as a bug! -
  23694. http://goo.gl/wu4acr */
  23695. ++uxSchedulerSuspended;
  23696. 8029640: 4b02 ldr r3, [pc, #8] ; (802964c <vTaskSuspendAll+0xc>)
  23697. 8029642: 681a ldr r2, [r3, #0]
  23698. 8029644: 3201 adds r2, #1
  23699. 8029646: 601a str r2, [r3, #0]
  23700. 8029648: 4770 bx lr
  23701. 802964a: bf00 nop
  23702. 802964c: 200029b0 .word 0x200029b0
  23703. 08029650 <xTaskGetTickCount>:
  23704. TickType_t xTicks;
  23705. /* Critical section required if running on a 16 bit processor. */
  23706. portTICK_TYPE_ENTER_CRITICAL();
  23707. {
  23708. xTicks = xTickCount;
  23709. 8029650: 4b01 ldr r3, [pc, #4] ; (8029658 <xTaskGetTickCount+0x8>)
  23710. 8029652: 6818 ldr r0, [r3, #0]
  23711. }
  23712. portTICK_TYPE_EXIT_CRITICAL();
  23713. return xTicks;
  23714. }
  23715. 8029654: 4770 bx lr
  23716. 8029656: bf00 nop
  23717. 8029658: 200029b4 .word 0x200029b4
  23718. 0802965c <xTaskIncrementTick>:
  23719. /* Called by the portable layer each time a tick interrupt occurs.
  23720. Increments the tick then checks to see if the new tick value will cause any
  23721. tasks to be unblocked. */
  23722. traceTASK_INCREMENT_TICK( xTickCount );
  23723. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  23724. 802965c: 4b3b ldr r3, [pc, #236] ; (802974c <xTaskIncrementTick+0xf0>)
  23725. 802965e: 681b ldr r3, [r3, #0]
  23726. #endif /* configUSE_TICKLESS_IDLE */
  23727. /*----------------------------------------------------------*/
  23728. BaseType_t xTaskIncrementTick( void )
  23729. {
  23730. 8029660: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  23731. /* Called by the portable layer each time a tick interrupt occurs.
  23732. Increments the tick then checks to see if the new tick value will cause any
  23733. tasks to be unblocked. */
  23734. traceTASK_INCREMENT_TICK( xTickCount );
  23735. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  23736. 8029664: 2b00 cmp r3, #0
  23737. 8029666: d15b bne.n 8029720 <xTaskIncrementTick+0xc4>
  23738. {
  23739. /* Increment the RTOS tick, switching the delayed and overflowed
  23740. delayed lists if it wraps to 0. */
  23741. ++xTickCount;
  23742. 8029668: 4b39 ldr r3, [pc, #228] ; (8029750 <xTaskIncrementTick+0xf4>)
  23743. 802966a: 681a ldr r2, [r3, #0]
  23744. 802966c: 3201 adds r2, #1
  23745. 802966e: 601a str r2, [r3, #0]
  23746. {
  23747. /* Minor optimisation. The tick count cannot change in this
  23748. block. */
  23749. const TickType_t xConstTickCount = xTickCount;
  23750. 8029670: 681e ldr r6, [r3, #0]
  23751. if( xConstTickCount == ( TickType_t ) 0U )
  23752. 8029672: b98e cbnz r6, 8029698 <xTaskIncrementTick+0x3c>
  23753. {
  23754. taskSWITCH_DELAYED_LISTS();
  23755. 8029674: 4b37 ldr r3, [pc, #220] ; (8029754 <xTaskIncrementTick+0xf8>)
  23756. 8029676: 681a ldr r2, [r3, #0]
  23757. 8029678: 6812 ldr r2, [r2, #0]
  23758. 802967a: b112 cbz r2, 8029682 <xTaskIncrementTick+0x26>
  23759. 802967c: f000 fcdc bl 802a038 <ulPortSetInterruptMask>
  23760. 8029680: e7fe b.n 8029680 <xTaskIncrementTick+0x24>
  23761. 8029682: 4a35 ldr r2, [pc, #212] ; (8029758 <xTaskIncrementTick+0xfc>)
  23762. 8029684: 6819 ldr r1, [r3, #0]
  23763. 8029686: 6810 ldr r0, [r2, #0]
  23764. 8029688: 6018 str r0, [r3, #0]
  23765. 802968a: 4b34 ldr r3, [pc, #208] ; (802975c <xTaskIncrementTick+0x100>)
  23766. 802968c: 6011 str r1, [r2, #0]
  23767. 802968e: 681a ldr r2, [r3, #0]
  23768. 8029690: 3201 adds r2, #1
  23769. 8029692: 601a str r2, [r3, #0]
  23770. 8029694: f7ff fe3a bl 802930c <prvResetNextTaskUnblockTime>
  23771. /* See if this tick has made a timeout expire. Tasks are stored in
  23772. the queue in the order of their wake time - meaning once one task
  23773. has been found whose block time has not expired there is no need to
  23774. look any further down the list. */
  23775. if( xConstTickCount >= xNextTaskUnblockTime )
  23776. 8029698: 4b31 ldr r3, [pc, #196] ; (8029760 <xTaskIncrementTick+0x104>)
  23777. 802969a: 681b ldr r3, [r3, #0]
  23778. 802969c: 2400 movs r4, #0
  23779. 802969e: 429e cmp r6, r3
  23780. 80296a0: d200 bcs.n 80296a4 <xTaskIncrementTick+0x48>
  23781. 80296a2: e032 b.n 802970a <xTaskIncrementTick+0xae>
  23782. {
  23783. for( ;; )
  23784. {
  23785. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  23786. 80296a4: 4f2b ldr r7, [pc, #172] ; (8029754 <xTaskIncrementTick+0xf8>)
  23787. mtCOVERAGE_TEST_MARKER();
  23788. }
  23789. /* Place the unblocked task into the appropriate ready
  23790. list. */
  23791. prvAddTaskToReadyList( pxTCB );
  23792. 80296a6: f8df 80cc ldr.w r8, [pc, #204] ; 8029774 <xTaskIncrementTick+0x118>
  23793. 80296aa: f8df a0bc ldr.w sl, [pc, #188] ; 8029768 <xTaskIncrementTick+0x10c>
  23794. look any further down the list. */
  23795. if( xConstTickCount >= xNextTaskUnblockTime )
  23796. {
  23797. for( ;; )
  23798. {
  23799. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  23800. 80296ae: 683b ldr r3, [r7, #0]
  23801. 80296b0: 681b ldr r3, [r3, #0]
  23802. 80296b2: 2b00 cmp r3, #0
  23803. 80296b4: d13a bne.n 802972c <xTaskIncrementTick+0xd0>
  23804. /* The delayed list is empty. Set xNextTaskUnblockTime
  23805. to the maximum possible value so it is extremely
  23806. unlikely that the
  23807. if( xTickCount >= xNextTaskUnblockTime ) test will pass
  23808. next time through. */
  23809. xNextTaskUnblockTime = portMAX_DELAY;
  23810. 80296b6: 4b2a ldr r3, [pc, #168] ; (8029760 <xTaskIncrementTick+0x104>)
  23811. 80296b8: f04f 32ff mov.w r2, #4294967295
  23812. 80296bc: 601a str r2, [r3, #0]
  23813. break;
  23814. 80296be: e024 b.n 802970a <xTaskIncrementTick+0xae>
  23815. /* It is not time to unblock this item yet, but the
  23816. item value is the time at which the task at the head
  23817. of the blocked list must be removed from the Blocked
  23818. state - so record the item value in
  23819. xNextTaskUnblockTime. */
  23820. xNextTaskUnblockTime = xItemValue;
  23821. 80296c0: 4a27 ldr r2, [pc, #156] ; (8029760 <xTaskIncrementTick+0x104>)
  23822. 80296c2: 6013 str r3, [r2, #0]
  23823. break;
  23824. 80296c4: e021 b.n 802970a <xTaskIncrementTick+0xae>
  23825. {
  23826. mtCOVERAGE_TEST_MARKER();
  23827. }
  23828. /* It is time to remove the item from the Blocked state. */
  23829. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  23830. 80296c6: f105 0904 add.w r9, r5, #4
  23831. 80296ca: 4648 mov r0, r9
  23832. 80296cc: f7ff fb12 bl 8028cf4 <uxListRemove>
  23833. /* Is the task waiting on an event also? If so remove
  23834. it from the event list. */
  23835. if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
  23836. 80296d0: 6aab ldr r3, [r5, #40] ; 0x28
  23837. 80296d2: b11b cbz r3, 80296dc <xTaskIncrementTick+0x80>
  23838. {
  23839. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  23840. 80296d4: f105 0018 add.w r0, r5, #24
  23841. 80296d8: f7ff fb0c bl 8028cf4 <uxListRemove>
  23842. mtCOVERAGE_TEST_MARKER();
  23843. }
  23844. /* Place the unblocked task into the appropriate ready
  23845. list. */
  23846. prvAddTaskToReadyList( pxTCB );
  23847. 80296dc: 6aeb ldr r3, [r5, #44] ; 0x2c
  23848. 80296de: f8d8 1000 ldr.w r1, [r8]
  23849. 80296e2: 2201 movs r2, #1
  23850. 80296e4: fa02 f203 lsl.w r2, r2, r3
  23851. 80296e8: 2014 movs r0, #20
  23852. 80296ea: 430a orrs r2, r1
  23853. 80296ec: fb00 a003 mla r0, r0, r3, sl
  23854. 80296f0: 4649 mov r1, r9
  23855. 80296f2: f8c8 2000 str.w r2, [r8]
  23856. 80296f6: f7ff fad9 bl 8028cac <vListInsertEnd>
  23857. {
  23858. /* Preemption is on, but a context switch should
  23859. only be performed if the unblocked task has a
  23860. priority that is equal to or higher than the
  23861. currently executing task. */
  23862. if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
  23863. 80296fa: 4b1a ldr r3, [pc, #104] ; (8029764 <xTaskIncrementTick+0x108>)
  23864. 80296fc: 6aea ldr r2, [r5, #44] ; 0x2c
  23865. 80296fe: 681b ldr r3, [r3, #0]
  23866. 8029700: 6adb ldr r3, [r3, #44] ; 0x2c
  23867. {
  23868. xSwitchRequired = pdTRUE;
  23869. 8029702: 429a cmp r2, r3
  23870. 8029704: bf28 it cs
  23871. 8029706: 2401 movcs r4, #1
  23872. 8029708: e7d1 b.n 80296ae <xTaskIncrementTick+0x52>
  23873. /* Tasks of equal priority to the currently running task will share
  23874. processing time (time slice) if preemption is on, and the application
  23875. writer has not explicitly turned time slicing off. */
  23876. #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) )
  23877. {
  23878. if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 )
  23879. 802970a: 4b16 ldr r3, [pc, #88] ; (8029764 <xTaskIncrementTick+0x108>)
  23880. 802970c: 681b ldr r3, [r3, #0]
  23881. 802970e: 6adb ldr r3, [r3, #44] ; 0x2c
  23882. 8029710: 2214 movs r2, #20
  23883. 8029712: 4353 muls r3, r2
  23884. 8029714: 4a14 ldr r2, [pc, #80] ; (8029768 <xTaskIncrementTick+0x10c>)
  23885. 8029716: 58d3 ldr r3, [r2, r3]
  23886. {
  23887. xSwitchRequired = pdTRUE;
  23888. 8029718: 2b01 cmp r3, #1
  23889. 802971a: bf88 it hi
  23890. 802971c: 2401 movhi r4, #1
  23891. 802971e: e00c b.n 802973a <xTaskIncrementTick+0xde>
  23892. }
  23893. #endif /* configUSE_TICK_HOOK */
  23894. }
  23895. else
  23896. {
  23897. ++uxPendedTicks;
  23898. 8029720: 4b12 ldr r3, [pc, #72] ; (802976c <xTaskIncrementTick+0x110>)
  23899. 8029722: 681a ldr r2, [r3, #0]
  23900. 8029724: 3201 adds r2, #1
  23901. 8029726: 601a str r2, [r3, #0]
  23902. BaseType_t xTaskIncrementTick( void )
  23903. {
  23904. TCB_t * pxTCB;
  23905. TickType_t xItemValue;
  23906. BaseType_t xSwitchRequired = pdFALSE;
  23907. 8029728: 2400 movs r4, #0
  23908. 802972a: e006 b.n 802973a <xTaskIncrementTick+0xde>
  23909. {
  23910. /* The delayed list is not empty, get the value of the
  23911. item at the head of the delayed list. This is the time
  23912. at which the task at the head of the delayed list must
  23913. be removed from the Blocked state. */
  23914. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );
  23915. 802972c: 683b ldr r3, [r7, #0]
  23916. 802972e: 68db ldr r3, [r3, #12]
  23917. 8029730: 68dd ldr r5, [r3, #12]
  23918. xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) );
  23919. 8029732: 686b ldr r3, [r5, #4]
  23920. if( xConstTickCount < xItemValue )
  23921. 8029734: 429e cmp r6, r3
  23922. 8029736: d2c6 bcs.n 80296c6 <xTaskIncrementTick+0x6a>
  23923. 8029738: e7c2 b.n 80296c0 <xTaskIncrementTick+0x64>
  23924. #endif
  23925. }
  23926. #if ( configUSE_PREEMPTION == 1 )
  23927. {
  23928. if( xYieldPending != pdFALSE )
  23929. 802973a: 4b0d ldr r3, [pc, #52] ; (8029770 <xTaskIncrementTick+0x114>)
  23930. 802973c: 681b ldr r3, [r3, #0]
  23931. {
  23932. xSwitchRequired = pdTRUE;
  23933. 802973e: 2b00 cmp r3, #0
  23934. 8029740: bf18 it ne
  23935. 8029742: 2401 movne r4, #1
  23936. }
  23937. }
  23938. #endif /* configUSE_PREEMPTION */
  23939. return xSwitchRequired;
  23940. }
  23941. 8029744: 4620 mov r0, r4
  23942. 8029746: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  23943. 802974a: bf00 nop
  23944. 802974c: 200029b0 .word 0x200029b0
  23945. 8029750: 200029b4 .word 0x200029b4
  23946. 8029754: 200028e8 .word 0x200028e8
  23947. 8029758: 200029b8 .word 0x200029b8
  23948. 802975c: 200028e4 .word 0x200028e4
  23949. 8029760: 200015d8 .word 0x200015d8
  23950. 8029764: 20002998 .word 0x20002998
  23951. 8029768: 20002920 .word 0x20002920
  23952. 802976c: 2000291c .word 0x2000291c
  23953. 8029770: 200029dc .word 0x200029dc
  23954. 8029774: 200029d8 .word 0x200029d8
  23955. 08029778 <xTaskResumeAll>:
  23956. #endif /* configUSE_TICKLESS_IDLE */
  23957. /*----------------------------------------------------------*/
  23958. BaseType_t xTaskResumeAll( void )
  23959. {
  23960. 8029778: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  23961. TCB_t *pxTCB;
  23962. BaseType_t xAlreadyYielded = pdFALSE;
  23963. /* If uxSchedulerSuspended is zero then this function does not match a
  23964. previous call to vTaskSuspendAll(). */
  23965. configASSERT( uxSchedulerSuspended );
  23966. 802977c: 4c2c ldr r4, [pc, #176] ; (8029830 <xTaskResumeAll+0xb8>)
  23967. 802977e: 6823 ldr r3, [r4, #0]
  23968. 8029780: b913 cbnz r3, 8029788 <xTaskResumeAll+0x10>
  23969. 8029782: f000 fc59 bl 802a038 <ulPortSetInterruptMask>
  23970. 8029786: e7fe b.n 8029786 <xTaskResumeAll+0xe>
  23971. /* It is possible that an ISR caused a task to be removed from an event
  23972. list while the scheduler was suspended. If this was the case then the
  23973. removed task will have been added to the xPendingReadyList. Once the
  23974. scheduler has been resumed it is safe to move all the pending ready
  23975. tasks from this list into their appropriate ready list. */
  23976. taskENTER_CRITICAL();
  23977. 8029788: f000 fc5e bl 802a048 <vPortEnterCritical>
  23978. {
  23979. --uxSchedulerSuspended;
  23980. 802978c: 6823 ldr r3, [r4, #0]
  23981. 802978e: 3b01 subs r3, #1
  23982. 8029790: 6023 str r3, [r4, #0]
  23983. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  23984. 8029792: 6823 ldr r3, [r4, #0]
  23985. 8029794: b10b cbz r3, 802979a <xTaskResumeAll+0x22>
  23986. /*----------------------------------------------------------*/
  23987. BaseType_t xTaskResumeAll( void )
  23988. {
  23989. TCB_t *pxTCB;
  23990. BaseType_t xAlreadyYielded = pdFALSE;
  23991. 8029796: 2400 movs r4, #0
  23992. 8029798: e044 b.n 8029824 <xTaskResumeAll+0xac>
  23993. {
  23994. --uxSchedulerSuspended;
  23995. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  23996. {
  23997. if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
  23998. 802979a: 4b26 ldr r3, [pc, #152] ; (8029834 <xTaskResumeAll+0xbc>)
  23999. 802979c: 681b ldr r3, [r3, #0]
  24000. 802979e: bb0b cbnz r3, 80297e4 <xTaskResumeAll+0x6c>
  24001. 80297a0: e7f9 b.n 8029796 <xTaskResumeAll+0x1e>
  24002. {
  24003. /* Move any readied tasks from the pending list into the
  24004. appropriate ready list. */
  24005. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  24006. {
  24007. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
  24008. 80297a2: 68f3 ldr r3, [r6, #12]
  24009. 80297a4: 68dc ldr r4, [r3, #12]
  24010. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  24011. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  24012. 80297a6: f104 0804 add.w r8, r4, #4
  24013. /* Move any readied tasks from the pending list into the
  24014. appropriate ready list. */
  24015. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  24016. {
  24017. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
  24018. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  24019. 80297aa: f104 0018 add.w r0, r4, #24
  24020. 80297ae: f7ff faa1 bl 8028cf4 <uxListRemove>
  24021. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  24022. 80297b2: 4640 mov r0, r8
  24023. 80297b4: f7ff fa9e bl 8028cf4 <uxListRemove>
  24024. prvAddTaskToReadyList( pxTCB );
  24025. 80297b8: 6ae3 ldr r3, [r4, #44] ; 0x2c
  24026. 80297ba: 682a ldr r2, [r5, #0]
  24027. 80297bc: 2701 movs r7, #1
  24028. 80297be: fa07 f103 lsl.w r1, r7, r3
  24029. 80297c2: 2014 movs r0, #20
  24030. 80297c4: 430a orrs r2, r1
  24031. 80297c6: fb00 9003 mla r0, r0, r3, r9
  24032. 80297ca: 4641 mov r1, r8
  24033. 80297cc: 602a str r2, [r5, #0]
  24034. 80297ce: f7ff fa6d bl 8028cac <vListInsertEnd>
  24035. /* If the moved task has a priority higher than the current
  24036. task then a yield must be performed. */
  24037. if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
  24038. 80297d2: 4b19 ldr r3, [pc, #100] ; (8029838 <xTaskResumeAll+0xc0>)
  24039. 80297d4: 6ae2 ldr r2, [r4, #44] ; 0x2c
  24040. 80297d6: 681b ldr r3, [r3, #0]
  24041. 80297d8: 6adb ldr r3, [r3, #44] ; 0x2c
  24042. 80297da: 429a cmp r2, r3
  24043. 80297dc: d306 bcc.n 80297ec <xTaskResumeAll+0x74>
  24044. {
  24045. xYieldPending = pdTRUE;
  24046. 80297de: 4b17 ldr r3, [pc, #92] ; (802983c <xTaskResumeAll+0xc4>)
  24047. 80297e0: 601f str r7, [r3, #0]
  24048. 80297e2: e003 b.n 80297ec <xTaskResumeAll+0x74>
  24049. {
  24050. if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
  24051. {
  24052. /* Move any readied tasks from the pending list into the
  24053. appropriate ready list. */
  24054. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  24055. 80297e4: 4e16 ldr r6, [pc, #88] ; (8029840 <xTaskResumeAll+0xc8>)
  24056. {
  24057. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
  24058. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  24059. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  24060. prvAddTaskToReadyList( pxTCB );
  24061. 80297e6: 4d17 ldr r5, [pc, #92] ; (8029844 <xTaskResumeAll+0xcc>)
  24062. 80297e8: f8df 9060 ldr.w r9, [pc, #96] ; 802984c <xTaskResumeAll+0xd4>
  24063. {
  24064. if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
  24065. {
  24066. /* Move any readied tasks from the pending list into the
  24067. appropriate ready list. */
  24068. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  24069. 80297ec: 6833 ldr r3, [r6, #0]
  24070. 80297ee: 2b00 cmp r3, #0
  24071. 80297f0: d1d7 bne.n 80297a2 <xTaskResumeAll+0x2a>
  24072. /* If any ticks occurred while the scheduler was suspended then
  24073. they should be processed now. This ensures the tick count does
  24074. not slip, and that any delayed tasks are resumed at the correct
  24075. time. */
  24076. if( uxPendedTicks > ( UBaseType_t ) 0U )
  24077. 80297f2: 4c15 ldr r4, [pc, #84] ; (8029848 <xTaskResumeAll+0xd0>)
  24078. 80297f4: 6823 ldr r3, [r4, #0]
  24079. 80297f6: b96b cbnz r3, 8029814 <xTaskResumeAll+0x9c>
  24080. else
  24081. {
  24082. mtCOVERAGE_TEST_MARKER();
  24083. }
  24084. if( xYieldPending == pdTRUE )
  24085. 80297f8: 4b10 ldr r3, [pc, #64] ; (802983c <xTaskResumeAll+0xc4>)
  24086. 80297fa: 681c ldr r4, [r3, #0]
  24087. 80297fc: 2c01 cmp r4, #1
  24088. 80297fe: d1ca bne.n 8029796 <xTaskResumeAll+0x1e>
  24089. 8029800: e00e b.n 8029820 <xTaskResumeAll+0xa8>
  24090. time. */
  24091. if( uxPendedTicks > ( UBaseType_t ) 0U )
  24092. {
  24093. while( uxPendedTicks > ( UBaseType_t ) 0U )
  24094. {
  24095. if( xTaskIncrementTick() != pdFALSE )
  24096. 8029802: f7ff ff2b bl 802965c <xTaskIncrementTick>
  24097. 8029806: b108 cbz r0, 802980c <xTaskResumeAll+0x94>
  24098. {
  24099. xYieldPending = pdTRUE;
  24100. 8029808: 2301 movs r3, #1
  24101. 802980a: 6033 str r3, [r6, #0]
  24102. }
  24103. else
  24104. {
  24105. mtCOVERAGE_TEST_MARKER();
  24106. }
  24107. --uxPendedTicks;
  24108. 802980c: 682b ldr r3, [r5, #0]
  24109. 802980e: 3b01 subs r3, #1
  24110. 8029810: 602b str r3, [r5, #0]
  24111. 8029812: e001 b.n 8029818 <xTaskResumeAll+0xa0>
  24112. {
  24113. while( uxPendedTicks > ( UBaseType_t ) 0U )
  24114. {
  24115. if( xTaskIncrementTick() != pdFALSE )
  24116. {
  24117. xYieldPending = pdTRUE;
  24118. 8029814: 4e09 ldr r6, [pc, #36] ; (802983c <xTaskResumeAll+0xc4>)
  24119. 8029816: 4625 mov r5, r4
  24120. they should be processed now. This ensures the tick count does
  24121. not slip, and that any delayed tasks are resumed at the correct
  24122. time. */
  24123. if( uxPendedTicks > ( UBaseType_t ) 0U )
  24124. {
  24125. while( uxPendedTicks > ( UBaseType_t ) 0U )
  24126. 8029818: 6823 ldr r3, [r4, #0]
  24127. 802981a: 2b00 cmp r3, #0
  24128. 802981c: d1f1 bne.n 8029802 <xTaskResumeAll+0x8a>
  24129. 802981e: e7eb b.n 80297f8 <xTaskResumeAll+0x80>
  24130. #if( configUSE_PREEMPTION != 0 )
  24131. {
  24132. xAlreadyYielded = pdTRUE;
  24133. }
  24134. #endif
  24135. taskYIELD_IF_USING_PREEMPTION();
  24136. 8029820: f000 fbfe bl 802a020 <vPortYield>
  24137. else
  24138. {
  24139. mtCOVERAGE_TEST_MARKER();
  24140. }
  24141. }
  24142. taskEXIT_CRITICAL();
  24143. 8029824: f000 fc3c bl 802a0a0 <vPortExitCritical>
  24144. return xAlreadyYielded;
  24145. }
  24146. 8029828: 4620 mov r0, r4
  24147. 802982a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  24148. 802982e: bf00 nop
  24149. 8029830: 200029b0 .word 0x200029b0
  24150. 8029834: 200029c0 .word 0x200029c0
  24151. 8029838: 20002998 .word 0x20002998
  24152. 802983c: 200029dc .word 0x200029dc
  24153. 8029840: 2000299c .word 0x2000299c
  24154. 8029844: 200029d8 .word 0x200029d8
  24155. 8029848: 2000291c .word 0x2000291c
  24156. 802984c: 20002920 .word 0x20002920
  24157. 08029850 <prvIdleTask>:
  24158. *
  24159. * void prvIdleTask( void *pvParameters );
  24160. *
  24161. */
  24162. static portTASK_FUNCTION( prvIdleTask, pvParameters )
  24163. {
  24164. 8029850: b5f8 push {r3, r4, r5, r6, r7, lr}
  24165. {
  24166. BaseType_t xListIsEmpty;
  24167. /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called
  24168. too often in the idle task. */
  24169. while( uxTasksDeleted > ( UBaseType_t ) 0U )
  24170. 8029852: 4c14 ldr r4, [pc, #80] ; (80298a4 <prvIdleTask+0x54>)
  24171. {
  24172. vTaskSuspendAll();
  24173. {
  24174. xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );
  24175. 8029854: 4e14 ldr r6, [pc, #80] ; (80298a8 <prvIdleTask+0x58>)
  24176. taskENTER_CRITICAL();
  24177. {
  24178. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
  24179. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  24180. --uxCurrentNumberOfTasks;
  24181. 8029856: 4f15 ldr r7, [pc, #84] ; (80298ac <prvIdleTask+0x5c>)
  24182. {
  24183. BaseType_t xListIsEmpty;
  24184. /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called
  24185. too often in the idle task. */
  24186. while( uxTasksDeleted > ( UBaseType_t ) 0U )
  24187. 8029858: 6823 ldr r3, [r4, #0]
  24188. 802985a: b1e3 cbz r3, 8029896 <prvIdleTask+0x46>
  24189. {
  24190. vTaskSuspendAll();
  24191. 802985c: f7ff fef0 bl 8029640 <vTaskSuspendAll>
  24192. {
  24193. xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );
  24194. 8029860: 6835 ldr r5, [r6, #0]
  24195. }
  24196. ( void ) xTaskResumeAll();
  24197. 8029862: f7ff ff89 bl 8029778 <xTaskResumeAll>
  24198. if( xListIsEmpty == pdFALSE )
  24199. 8029866: 2d00 cmp r5, #0
  24200. 8029868: d0f6 beq.n 8029858 <prvIdleTask+0x8>
  24201. {
  24202. TCB_t *pxTCB;
  24203. taskENTER_CRITICAL();
  24204. 802986a: f000 fbed bl 802a048 <vPortEnterCritical>
  24205. {
  24206. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
  24207. 802986e: 68f3 ldr r3, [r6, #12]
  24208. 8029870: 68dd ldr r5, [r3, #12]
  24209. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  24210. 8029872: 1d28 adds r0, r5, #4
  24211. 8029874: f7ff fa3e bl 8028cf4 <uxListRemove>
  24212. --uxCurrentNumberOfTasks;
  24213. 8029878: 683b ldr r3, [r7, #0]
  24214. 802987a: 3b01 subs r3, #1
  24215. 802987c: 603b str r3, [r7, #0]
  24216. --uxTasksDeleted;
  24217. 802987e: 6823 ldr r3, [r4, #0]
  24218. 8029880: 3b01 subs r3, #1
  24219. 8029882: 6023 str r3, [r4, #0]
  24220. }
  24221. taskEXIT_CRITICAL();
  24222. 8029884: f000 fc0c bl 802a0a0 <vPortExitCritical>
  24223. vPortFreeAligned( pxTCB->pxStack );
  24224. }
  24225. }
  24226. #else
  24227. {
  24228. vPortFreeAligned( pxTCB->pxStack );
  24229. 8029888: 6b28 ldr r0, [r5, #48] ; 0x30
  24230. 802988a: f000 fd71 bl 802a370 <vPortFree>
  24231. }
  24232. #endif
  24233. vPortFree( pxTCB );
  24234. 802988e: 4628 mov r0, r5
  24235. 8029890: f000 fd6e bl 802a370 <vPortFree>
  24236. 8029894: e7e0 b.n 8029858 <prvIdleTask+0x8>
  24237. A critical region is not required here as we are just reading from
  24238. the list, and an occasional incorrect value will not matter. If
  24239. the ready list at the idle priority contains more than one task
  24240. then a task other than the idle task is ready to execute. */
  24241. if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 )
  24242. 8029896: 4b06 ldr r3, [pc, #24] ; (80298b0 <prvIdleTask+0x60>)
  24243. 8029898: 681b ldr r3, [r3, #0]
  24244. 802989a: 2b01 cmp r3, #1
  24245. 802989c: d9dc bls.n 8029858 <prvIdleTask+0x8>
  24246. {
  24247. taskYIELD();
  24248. 802989e: f000 fbbf bl 802a020 <vPortYield>
  24249. 80298a2: e7d9 b.n 8029858 <prvIdleTask+0x8>
  24250. 80298a4: 200028f0 .word 0x200028f0
  24251. 80298a8: 20002984 .word 0x20002984
  24252. 80298ac: 200029c0 .word 0x200029c0
  24253. 80298b0: 20002920 .word 0x20002920
  24254. 080298b4 <vTaskDelay>:
  24255. /*-----------------------------------------------------------*/
  24256. #if ( INCLUDE_vTaskDelay == 1 )
  24257. void vTaskDelay( const TickType_t xTicksToDelay )
  24258. {
  24259. 80298b4: b538 push {r3, r4, r5, lr}
  24260. TickType_t xTimeToWake;
  24261. BaseType_t xAlreadyYielded = pdFALSE;
  24262. /* A delay time of zero just forces a reschedule. */
  24263. if( xTicksToDelay > ( TickType_t ) 0U )
  24264. 80298b6: 4604 mov r4, r0
  24265. 80298b8: b918 cbnz r0, 80298c2 <vTaskDelay+0xe>
  24266. }
  24267. else
  24268. {
  24269. mtCOVERAGE_TEST_MARKER();
  24270. }
  24271. }
  24272. 80298ba: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  24273. /* Force a reschedule if xTaskResumeAll has not already done so, we may
  24274. have put ourselves to sleep. */
  24275. if( xAlreadyYielded == pdFALSE )
  24276. {
  24277. portYIELD_WITHIN_API();
  24278. 80298be: f000 bbaf b.w 802a020 <vPortYield>
  24279. /* A delay time of zero just forces a reschedule. */
  24280. if( xTicksToDelay > ( TickType_t ) 0U )
  24281. {
  24282. configASSERT( uxSchedulerSuspended == 0 );
  24283. 80298c2: 4b11 ldr r3, [pc, #68] ; (8029908 <vTaskDelay+0x54>)
  24284. 80298c4: 681b ldr r3, [r3, #0]
  24285. 80298c6: b113 cbz r3, 80298ce <vTaskDelay+0x1a>
  24286. 80298c8: f000 fbb6 bl 802a038 <ulPortSetInterruptMask>
  24287. 80298cc: e7fe b.n 80298cc <vTaskDelay+0x18>
  24288. vTaskSuspendAll();
  24289. 80298ce: f7ff feb7 bl 8029640 <vTaskSuspendAll>
  24290. This task cannot be in an event list as it is the currently
  24291. executing task. */
  24292. /* Calculate the time to wake - this may overflow but this is
  24293. not a problem. */
  24294. xTimeToWake = xTickCount + xTicksToDelay;
  24295. 80298d2: 4b0e ldr r3, [pc, #56] ; (802990c <vTaskDelay+0x58>)
  24296. 80298d4: 681d ldr r5, [r3, #0]
  24297. 80298d6: 1965 adds r5, r4, r5
  24298. /* We must remove ourselves from the ready list before adding
  24299. ourselves to the blocked list as the same list item is used for
  24300. both lists. */
  24301. if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  24302. 80298d8: 4c0d ldr r4, [pc, #52] ; (8029910 <vTaskDelay+0x5c>)
  24303. 80298da: 6820 ldr r0, [r4, #0]
  24304. 80298dc: 3004 adds r0, #4
  24305. 80298de: f7ff fa09 bl 8028cf4 <uxListRemove>
  24306. 80298e2: b948 cbnz r0, 80298f8 <vTaskDelay+0x44>
  24307. {
  24308. /* The current task must be in a ready list, so there is
  24309. no need to check, and the port reset macro can be called
  24310. directly. */
  24311. portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
  24312. 80298e4: 4b0b ldr r3, [pc, #44] ; (8029914 <vTaskDelay+0x60>)
  24313. 80298e6: 6819 ldr r1, [r3, #0]
  24314. 80298e8: 6822 ldr r2, [r4, #0]
  24315. 80298ea: 6ad2 ldr r2, [r2, #44] ; 0x2c
  24316. 80298ec: 2001 movs r0, #1
  24317. 80298ee: fa00 f202 lsl.w r2, r0, r2
  24318. 80298f2: ea21 0202 bic.w r2, r1, r2
  24319. 80298f6: 601a str r2, [r3, #0]
  24320. }
  24321. else
  24322. {
  24323. mtCOVERAGE_TEST_MARKER();
  24324. }
  24325. prvAddCurrentTaskToDelayedList( xTimeToWake );
  24326. 80298f8: 4628 mov r0, r5
  24327. 80298fa: f7ff fd19 bl 8029330 <prvAddCurrentTaskToDelayedList>
  24328. }
  24329. xAlreadyYielded = xTaskResumeAll();
  24330. 80298fe: f7ff ff3b bl 8029778 <xTaskResumeAll>
  24331. mtCOVERAGE_TEST_MARKER();
  24332. }
  24333. /* Force a reschedule if xTaskResumeAll has not already done so, we may
  24334. have put ourselves to sleep. */
  24335. if( xAlreadyYielded == pdFALSE )
  24336. 8029902: 2800 cmp r0, #0
  24337. 8029904: d0d9 beq.n 80298ba <vTaskDelay+0x6>
  24338. }
  24339. else
  24340. {
  24341. mtCOVERAGE_TEST_MARKER();
  24342. }
  24343. }
  24344. 8029906: bd38 pop {r3, r4, r5, pc}
  24345. 8029908: 200029b0 .word 0x200029b0
  24346. 802990c: 200029b4 .word 0x200029b4
  24347. 8029910: 20002998 .word 0x20002998
  24348. 8029914: 200029d8 .word 0x200029d8
  24349. 08029918 <vTaskSwitchContext>:
  24350. #endif /* configUSE_APPLICATION_TASK_TAG */
  24351. /*-----------------------------------------------------------*/
  24352. void vTaskSwitchContext( void )
  24353. {
  24354. 8029918: b508 push {r3, lr}
  24355. if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE )
  24356. 802991a: 4b12 ldr r3, [pc, #72] ; (8029964 <vTaskSwitchContext+0x4c>)
  24357. 802991c: 681a ldr r2, [r3, #0]
  24358. 802991e: 4b12 ldr r3, [pc, #72] ; (8029968 <vTaskSwitchContext+0x50>)
  24359. 8029920: b10a cbz r2, 8029926 <vTaskSwitchContext+0xe>
  24360. {
  24361. /* The scheduler is currently suspended - do not allow a context
  24362. switch. */
  24363. xYieldPending = pdTRUE;
  24364. 8029922: 2201 movs r2, #1
  24365. 8029924: e01c b.n 8029960 <vTaskSwitchContext+0x48>
  24366. }
  24367. else
  24368. {
  24369. xYieldPending = pdFALSE;
  24370. 8029926: 601a str r2, [r3, #0]
  24371. taskFIRST_CHECK_FOR_STACK_OVERFLOW();
  24372. taskSECOND_CHECK_FOR_STACK_OVERFLOW();
  24373. /* Select a new task to run using either the generic C or port
  24374. optimised asm code. */
  24375. taskSELECT_HIGHEST_PRIORITY_TASK();
  24376. 8029928: 4b10 ldr r3, [pc, #64] ; (802996c <vTaskSwitchContext+0x54>)
  24377. 802992a: 681a ldr r2, [r3, #0]
  24378. /* Generic helper function. */
  24379. __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap )
  24380. {
  24381. uint8_t ucReturn;
  24382. __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) );
  24383. 802992c: fab2 f282 clz r2, r2
  24384. 8029930: b2d2 uxtb r2, r2
  24385. 8029932: 2314 movs r3, #20
  24386. 8029934: f1c2 021f rsb r2, r2, #31
  24387. 8029938: 490d ldr r1, [pc, #52] ; (8029970 <vTaskSwitchContext+0x58>)
  24388. 802993a: 435a muls r2, r3
  24389. 802993c: 188b adds r3, r1, r2
  24390. 802993e: 588a ldr r2, [r1, r2]
  24391. 8029940: b912 cbnz r2, 8029948 <vTaskSwitchContext+0x30>
  24392. 8029942: f000 fb79 bl 802a038 <ulPortSetInterruptMask>
  24393. 8029946: e7fe b.n 8029946 <vTaskSwitchContext+0x2e>
  24394. 8029948: 685a ldr r2, [r3, #4]
  24395. 802994a: 6852 ldr r2, [r2, #4]
  24396. 802994c: f103 0108 add.w r1, r3, #8
  24397. 8029950: 428a cmp r2, r1
  24398. 8029952: 605a str r2, [r3, #4]
  24399. 8029954: bf04 itt eq
  24400. 8029956: 6852 ldreq r2, [r2, #4]
  24401. 8029958: 605a streq r2, [r3, #4]
  24402. 802995a: 685b ldr r3, [r3, #4]
  24403. 802995c: 68da ldr r2, [r3, #12]
  24404. 802995e: 4b05 ldr r3, [pc, #20] ; (8029974 <vTaskSwitchContext+0x5c>)
  24405. 8029960: 601a str r2, [r3, #0]
  24406. 8029962: bd08 pop {r3, pc}
  24407. 8029964: 200029b0 .word 0x200029b0
  24408. 8029968: 200029dc .word 0x200029dc
  24409. 802996c: 200029d8 .word 0x200029d8
  24410. 8029970: 20002920 .word 0x20002920
  24411. 8029974: 20002998 .word 0x20002998
  24412. 08029978 <vTaskPlaceOnEventList>:
  24413. }
  24414. }
  24415. /*-----------------------------------------------------------*/
  24416. void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait )
  24417. {
  24418. 8029978: b538 push {r3, r4, r5, lr}
  24419. 802997a: 460d mov r5, r1
  24420. TickType_t xTimeToWake;
  24421. configASSERT( pxEventList );
  24422. 802997c: b910 cbnz r0, 8029984 <vTaskPlaceOnEventList+0xc>
  24423. 802997e: f000 fb5b bl 802a038 <ulPortSetInterruptMask>
  24424. 8029982: e7fe b.n 8029982 <vTaskPlaceOnEventList+0xa>
  24425. /* Place the event list item of the TCB in the appropriate event list.
  24426. This is placed in the list in priority order so the highest priority task
  24427. is the first to be woken by the event. The queue that contains the event
  24428. list is locked, preventing simultaneous access from interrupts. */
  24429. vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) );
  24430. 8029984: 4c12 ldr r4, [pc, #72] ; (80299d0 <vTaskPlaceOnEventList+0x58>)
  24431. 8029986: 6821 ldr r1, [r4, #0]
  24432. 8029988: 3118 adds r1, #24
  24433. 802998a: f7ff f99b bl 8028cc4 <vListInsert>
  24434. /* The task must be removed from from the ready list before it is added to
  24435. the blocked list as the same list item is used for both lists. Exclusive
  24436. access to the ready lists guaranteed because the scheduler is locked. */
  24437. if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  24438. 802998e: 6820 ldr r0, [r4, #0]
  24439. 8029990: 3004 adds r0, #4
  24440. 8029992: f7ff f9af bl 8028cf4 <uxListRemove>
  24441. 8029996: b948 cbnz r0, 80299ac <vTaskPlaceOnEventList+0x34>
  24442. {
  24443. /* The current task must be in a ready list, so there is no need to
  24444. check, and the port reset macro can be called directly. */
  24445. portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
  24446. 8029998: 4b0e ldr r3, [pc, #56] ; (80299d4 <vTaskPlaceOnEventList+0x5c>)
  24447. 802999a: 6819 ldr r1, [r3, #0]
  24448. 802999c: 6822 ldr r2, [r4, #0]
  24449. 802999e: 6ad2 ldr r2, [r2, #44] ; 0x2c
  24450. 80299a0: 2001 movs r0, #1
  24451. 80299a2: fa00 f202 lsl.w r2, r0, r2
  24452. 80299a6: ea21 0202 bic.w r2, r1, r2
  24453. 80299aa: 601a str r2, [r3, #0]
  24454. mtCOVERAGE_TEST_MARKER();
  24455. }
  24456. #if ( INCLUDE_vTaskSuspend == 1 )
  24457. {
  24458. if( xTicksToWait == portMAX_DELAY )
  24459. 80299ac: 1c69 adds r1, r5, #1
  24460. 80299ae: d107 bne.n 80299c0 <vTaskPlaceOnEventList+0x48>
  24461. {
  24462. /* Add the task to the suspended task list instead of a delayed task
  24463. list to ensure the task is not woken by a timing event. It will
  24464. block indefinitely. */
  24465. vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  24466. 80299b0: 4b07 ldr r3, [pc, #28] ; (80299d0 <vTaskPlaceOnEventList+0x58>)
  24467. 80299b2: 4809 ldr r0, [pc, #36] ; (80299d8 <vTaskPlaceOnEventList+0x60>)
  24468. 80299b4: 6819 ldr r1, [r3, #0]
  24469. 80299b6: 3104 adds r1, #4
  24470. will handle it. */
  24471. xTimeToWake = xTickCount + xTicksToWait;
  24472. prvAddCurrentTaskToDelayedList( xTimeToWake );
  24473. }
  24474. #endif /* INCLUDE_vTaskSuspend */
  24475. }
  24476. 80299b8: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  24477. if( xTicksToWait == portMAX_DELAY )
  24478. {
  24479. /* Add the task to the suspended task list instead of a delayed task
  24480. list to ensure the task is not woken by a timing event. It will
  24481. block indefinitely. */
  24482. vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  24483. 80299bc: f7ff b976 b.w 8028cac <vListInsertEnd>
  24484. else
  24485. {
  24486. /* Calculate the time at which the task should be woken if the event
  24487. does not occur. This may overflow but this doesn't matter, the
  24488. scheduler will handle it. */
  24489. xTimeToWake = xTickCount + xTicksToWait;
  24490. 80299c0: 4b06 ldr r3, [pc, #24] ; (80299dc <vTaskPlaceOnEventList+0x64>)
  24491. 80299c2: 6818 ldr r0, [r3, #0]
  24492. prvAddCurrentTaskToDelayedList( xTimeToWake );
  24493. 80299c4: 1828 adds r0, r5, r0
  24494. will handle it. */
  24495. xTimeToWake = xTickCount + xTicksToWait;
  24496. prvAddCurrentTaskToDelayedList( xTimeToWake );
  24497. }
  24498. #endif /* INCLUDE_vTaskSuspend */
  24499. }
  24500. 80299c6: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  24501. {
  24502. /* Calculate the time at which the task should be woken if the event
  24503. does not occur. This may overflow but this doesn't matter, the
  24504. scheduler will handle it. */
  24505. xTimeToWake = xTickCount + xTicksToWait;
  24506. prvAddCurrentTaskToDelayedList( xTimeToWake );
  24507. 80299ca: f7ff bcb1 b.w 8029330 <prvAddCurrentTaskToDelayedList>
  24508. 80299ce: bf00 nop
  24509. 80299d0: 20002998 .word 0x20002998
  24510. 80299d4: 200029d8 .word 0x200029d8
  24511. 80299d8: 200029c4 .word 0x200029c4
  24512. 80299dc: 200029b4 .word 0x200029b4
  24513. 080299e0 <vTaskPlaceOnEventListRestricted>:
  24514. /*-----------------------------------------------------------*/
  24515. #if configUSE_TIMERS == 1
  24516. void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, const TickType_t xTicksToWait )
  24517. {
  24518. 80299e0: b538 push {r3, r4, r5, lr}
  24519. 80299e2: 460d mov r5, r1
  24520. TickType_t xTimeToWake;
  24521. configASSERT( pxEventList );
  24522. 80299e4: b910 cbnz r0, 80299ec <vTaskPlaceOnEventListRestricted+0xc>
  24523. 80299e6: f000 fb27 bl 802a038 <ulPortSetInterruptMask>
  24524. 80299ea: e7fe b.n 80299ea <vTaskPlaceOnEventListRestricted+0xa>
  24525. /* Place the event list item of the TCB in the appropriate event list.
  24526. In this case it is assume that this is the only task that is going to
  24527. be waiting on this event list, so the faster vListInsertEnd() function
  24528. can be used in place of vListInsert. */
  24529. vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) );
  24530. 80299ec: 4c0d ldr r4, [pc, #52] ; (8029a24 <vTaskPlaceOnEventListRestricted+0x44>)
  24531. 80299ee: 6821 ldr r1, [r4, #0]
  24532. 80299f0: 3118 adds r1, #24
  24533. 80299f2: f7ff f95b bl 8028cac <vListInsertEnd>
  24534. /* We must remove this task from the ready list before adding it to the
  24535. blocked list as the same list item is used for both lists. This
  24536. function is called form a critical section. */
  24537. if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  24538. 80299f6: 6820 ldr r0, [r4, #0]
  24539. 80299f8: 3004 adds r0, #4
  24540. 80299fa: f7ff f97b bl 8028cf4 <uxListRemove>
  24541. 80299fe: b948 cbnz r0, 8029a14 <vTaskPlaceOnEventListRestricted+0x34>
  24542. {
  24543. /* The current task must be in a ready list, so there is no need to
  24544. check, and the port reset macro can be called directly. */
  24545. portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
  24546. 8029a00: 4b09 ldr r3, [pc, #36] ; (8029a28 <vTaskPlaceOnEventListRestricted+0x48>)
  24547. 8029a02: 6819 ldr r1, [r3, #0]
  24548. 8029a04: 6822 ldr r2, [r4, #0]
  24549. 8029a06: 6ad2 ldr r2, [r2, #44] ; 0x2c
  24550. 8029a08: 2001 movs r0, #1
  24551. 8029a0a: fa00 f202 lsl.w r2, r0, r2
  24552. 8029a0e: ea21 0202 bic.w r2, r1, r2
  24553. 8029a12: 601a str r2, [r3, #0]
  24554. mtCOVERAGE_TEST_MARKER();
  24555. }
  24556. /* Calculate the time at which the task should be woken if the event does
  24557. not occur. This may overflow but this doesn't matter. */
  24558. xTimeToWake = xTickCount + xTicksToWait;
  24559. 8029a14: 4b05 ldr r3, [pc, #20] ; (8029a2c <vTaskPlaceOnEventListRestricted+0x4c>)
  24560. 8029a16: 6818 ldr r0, [r3, #0]
  24561. traceTASK_DELAY_UNTIL();
  24562. prvAddCurrentTaskToDelayedList( xTimeToWake );
  24563. 8029a18: 1828 adds r0, r5, r0
  24564. }
  24565. 8029a1a: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  24566. /* Calculate the time at which the task should be woken if the event does
  24567. not occur. This may overflow but this doesn't matter. */
  24568. xTimeToWake = xTickCount + xTicksToWait;
  24569. traceTASK_DELAY_UNTIL();
  24570. prvAddCurrentTaskToDelayedList( xTimeToWake );
  24571. 8029a1e: f7ff bc87 b.w 8029330 <prvAddCurrentTaskToDelayedList>
  24572. 8029a22: bf00 nop
  24573. 8029a24: 20002998 .word 0x20002998
  24574. 8029a28: 200029d8 .word 0x200029d8
  24575. 8029a2c: 200029b4 .word 0x200029b4
  24576. 08029a30 <xTaskRemoveFromEventList>:
  24577. #endif /* configUSE_TIMERS */
  24578. /*-----------------------------------------------------------*/
  24579. BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList )
  24580. {
  24581. 8029a30: b538 push {r3, r4, r5, lr}
  24582. get called - the lock count on the queue will get modified instead. This
  24583. means exclusive access to the event list is guaranteed here.
  24584. This function assumes that a check has already been made to ensure that
  24585. pxEventList is not empty. */
  24586. pxUnblockedTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList );
  24587. 8029a32: 68c3 ldr r3, [r0, #12]
  24588. 8029a34: 68dc ldr r4, [r3, #12]
  24589. configASSERT( pxUnblockedTCB );
  24590. 8029a36: b914 cbnz r4, 8029a3e <xTaskRemoveFromEventList+0xe>
  24591. 8029a38: f000 fafe bl 802a038 <ulPortSetInterruptMask>
  24592. 8029a3c: e7fe b.n 8029a3c <xTaskRemoveFromEventList+0xc>
  24593. ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) );
  24594. 8029a3e: f104 0518 add.w r5, r4, #24
  24595. 8029a42: 4628 mov r0, r5
  24596. 8029a44: f7ff f956 bl 8028cf4 <uxListRemove>
  24597. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  24598. 8029a48: 4b11 ldr r3, [pc, #68] ; (8029a90 <xTaskRemoveFromEventList+0x60>)
  24599. 8029a4a: 681b ldr r3, [r3, #0]
  24600. 8029a4c: b983 cbnz r3, 8029a70 <xTaskRemoveFromEventList+0x40>
  24601. {
  24602. ( void ) uxListRemove( &( pxUnblockedTCB->xGenericListItem ) );
  24603. 8029a4e: 1d25 adds r5, r4, #4
  24604. 8029a50: 4628 mov r0, r5
  24605. 8029a52: f7ff f94f bl 8028cf4 <uxListRemove>
  24606. prvAddTaskToReadyList( pxUnblockedTCB );
  24607. 8029a56: 4a0f ldr r2, [pc, #60] ; (8029a94 <xTaskRemoveFromEventList+0x64>)
  24608. 8029a58: 6ae3 ldr r3, [r4, #44] ; 0x2c
  24609. 8029a5a: 6810 ldr r0, [r2, #0]
  24610. 8029a5c: 2101 movs r1, #1
  24611. 8029a5e: fa01 f103 lsl.w r1, r1, r3
  24612. 8029a62: 4301 orrs r1, r0
  24613. 8029a64: 6011 str r1, [r2, #0]
  24614. 8029a66: 4a0c ldr r2, [pc, #48] ; (8029a98 <xTaskRemoveFromEventList+0x68>)
  24615. 8029a68: 2014 movs r0, #20
  24616. 8029a6a: fb00 2003 mla r0, r0, r3, r2
  24617. 8029a6e: e000 b.n 8029a72 <xTaskRemoveFromEventList+0x42>
  24618. }
  24619. else
  24620. {
  24621. /* The delayed and ready lists cannot be accessed, so hold this task
  24622. pending until the scheduler is resumed. */
  24623. vListInsertEnd( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) );
  24624. 8029a70: 480a ldr r0, [pc, #40] ; (8029a9c <xTaskRemoveFromEventList+0x6c>)
  24625. 8029a72: 4629 mov r1, r5
  24626. 8029a74: f7ff f91a bl 8028cac <vListInsertEnd>
  24627. }
  24628. if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority )
  24629. 8029a78: 4b09 ldr r3, [pc, #36] ; (8029aa0 <xTaskRemoveFromEventList+0x70>)
  24630. 8029a7a: 6ae2 ldr r2, [r4, #44] ; 0x2c
  24631. 8029a7c: 681b ldr r3, [r3, #0]
  24632. 8029a7e: 6adb ldr r3, [r3, #44] ; 0x2c
  24633. 8029a80: 429a cmp r2, r3
  24634. 8029a82: d903 bls.n 8029a8c <xTaskRemoveFromEventList+0x5c>
  24635. it should force a context switch now. */
  24636. xReturn = pdTRUE;
  24637. /* Mark that a yield is pending in case the user is not using the
  24638. "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */
  24639. xYieldPending = pdTRUE;
  24640. 8029a84: 4b07 ldr r3, [pc, #28] ; (8029aa4 <xTaskRemoveFromEventList+0x74>)
  24641. 8029a86: 2001 movs r0, #1
  24642. 8029a88: 6018 str r0, [r3, #0]
  24643. 8029a8a: bd38 pop {r3, r4, r5, pc}
  24644. }
  24645. else
  24646. {
  24647. xReturn = pdFALSE;
  24648. 8029a8c: 2000 movs r0, #0
  24649. prvResetNextTaskUnblockTime();
  24650. }
  24651. #endif
  24652. return xReturn;
  24653. }
  24654. 8029a8e: bd38 pop {r3, r4, r5, pc}
  24655. 8029a90: 200029b0 .word 0x200029b0
  24656. 8029a94: 200029d8 .word 0x200029d8
  24657. 8029a98: 20002920 .word 0x20002920
  24658. 8029a9c: 2000299c .word 0x2000299c
  24659. 8029aa0: 20002998 .word 0x20002998
  24660. 8029aa4: 200029dc .word 0x200029dc
  24661. 08029aa8 <vTaskSetTimeOutState>:
  24662. return xReturn;
  24663. }
  24664. /*-----------------------------------------------------------*/
  24665. void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )
  24666. {
  24667. 8029aa8: b508 push {r3, lr}
  24668. configASSERT( pxTimeOut );
  24669. 8029aaa: b910 cbnz r0, 8029ab2 <vTaskSetTimeOutState+0xa>
  24670. 8029aac: f000 fac4 bl 802a038 <ulPortSetInterruptMask>
  24671. 8029ab0: e7fe b.n 8029ab0 <vTaskSetTimeOutState+0x8>
  24672. pxTimeOut->xOverflowCount = xNumOfOverflows;
  24673. 8029ab2: 4b03 ldr r3, [pc, #12] ; (8029ac0 <vTaskSetTimeOutState+0x18>)
  24674. 8029ab4: 681b ldr r3, [r3, #0]
  24675. 8029ab6: 6003 str r3, [r0, #0]
  24676. pxTimeOut->xTimeOnEntering = xTickCount;
  24677. 8029ab8: 4b02 ldr r3, [pc, #8] ; (8029ac4 <vTaskSetTimeOutState+0x1c>)
  24678. 8029aba: 681b ldr r3, [r3, #0]
  24679. 8029abc: 6043 str r3, [r0, #4]
  24680. 8029abe: bd08 pop {r3, pc}
  24681. 8029ac0: 200028e4 .word 0x200028e4
  24682. 8029ac4: 200029b4 .word 0x200029b4
  24683. 08029ac8 <xTaskCheckForTimeOut>:
  24684. }
  24685. /*-----------------------------------------------------------*/
  24686. BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait )
  24687. {
  24688. 8029ac8: b538 push {r3, r4, r5, lr}
  24689. 8029aca: 460d mov r5, r1
  24690. BaseType_t xReturn;
  24691. configASSERT( pxTimeOut );
  24692. 8029acc: 4604 mov r4, r0
  24693. 8029ace: b910 cbnz r0, 8029ad6 <xTaskCheckForTimeOut+0xe>
  24694. 8029ad0: f000 fab2 bl 802a038 <ulPortSetInterruptMask>
  24695. 8029ad4: e7fe b.n 8029ad4 <xTaskCheckForTimeOut+0xc>
  24696. configASSERT( pxTicksToWait );
  24697. 8029ad6: b911 cbnz r1, 8029ade <xTaskCheckForTimeOut+0x16>
  24698. 8029ad8: f000 faae bl 802a038 <ulPortSetInterruptMask>
  24699. 8029adc: e7fe b.n 8029adc <xTaskCheckForTimeOut+0x14>
  24700. taskENTER_CRITICAL();
  24701. 8029ade: f000 fab3 bl 802a048 <vPortEnterCritical>
  24702. {
  24703. /* Minor optimisation. The tick count cannot change in this block. */
  24704. const TickType_t xConstTickCount = xTickCount;
  24705. 8029ae2: 4b0e ldr r3, [pc, #56] ; (8029b1c <xTaskCheckForTimeOut+0x54>)
  24706. 8029ae4: 681a ldr r2, [r3, #0]
  24707. #if ( INCLUDE_vTaskSuspend == 1 )
  24708. /* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is
  24709. the maximum block time then the task should block indefinitely, and
  24710. therefore never time out. */
  24711. if( *pxTicksToWait == portMAX_DELAY )
  24712. 8029ae6: 682b ldr r3, [r5, #0]
  24713. 8029ae8: 1c59 adds r1, r3, #1
  24714. 8029aea: d010 beq.n 8029b0e <xTaskCheckForTimeOut+0x46>
  24715. xReturn = pdFALSE;
  24716. }
  24717. else /* We are not blocking indefinitely, perform the checks below. */
  24718. #endif
  24719. if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */
  24720. 8029aec: 490c ldr r1, [pc, #48] ; (8029b20 <xTaskCheckForTimeOut+0x58>)
  24721. 8029aee: 6808 ldr r0, [r1, #0]
  24722. 8029af0: 6821 ldr r1, [r4, #0]
  24723. 8029af2: 4288 cmp r0, r1
  24724. 8029af4: 6861 ldr r1, [r4, #4]
  24725. 8029af6: d001 beq.n 8029afc <xTaskCheckForTimeOut+0x34>
  24726. 8029af8: 428a cmp r2, r1
  24727. 8029afa: d20a bcs.n 8029b12 <xTaskCheckForTimeOut+0x4a>
  24728. was called, but has also overflowed since vTaskSetTimeOut() was called.
  24729. It must have wrapped all the way around and gone past us again. This
  24730. passed since vTaskSetTimeout() was called. */
  24731. xReturn = pdTRUE;
  24732. }
  24733. else if( ( xConstTickCount - pxTimeOut->xTimeOnEntering ) < *pxTicksToWait )
  24734. 8029afc: 1a50 subs r0, r2, r1
  24735. 8029afe: 4298 cmp r0, r3
  24736. 8029b00: d207 bcs.n 8029b12 <xTaskCheckForTimeOut+0x4a>
  24737. {
  24738. /* Not a genuine timeout. Adjust parameters for time remaining. */
  24739. *pxTicksToWait -= ( xConstTickCount - pxTimeOut->xTimeOnEntering );
  24740. 8029b02: 1a8a subs r2, r1, r2
  24741. 8029b04: 18d3 adds r3, r2, r3
  24742. 8029b06: 602b str r3, [r5, #0]
  24743. vTaskSetTimeOutState( pxTimeOut );
  24744. 8029b08: 4620 mov r0, r4
  24745. 8029b0a: f7ff ffcd bl 8029aa8 <vTaskSetTimeOutState>
  24746. /* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is
  24747. the maximum block time then the task should block indefinitely, and
  24748. therefore never time out. */
  24749. if( *pxTicksToWait == portMAX_DELAY )
  24750. {
  24751. xReturn = pdFALSE;
  24752. 8029b0e: 2400 movs r4, #0
  24753. 8029b10: e000 b.n 8029b14 <xTaskCheckForTimeOut+0x4c>
  24754. {
  24755. /* The tick count is greater than the time at which vTaskSetTimeout()
  24756. was called, but has also overflowed since vTaskSetTimeOut() was called.
  24757. It must have wrapped all the way around and gone past us again. This
  24758. passed since vTaskSetTimeout() was called. */
  24759. xReturn = pdTRUE;
  24760. 8029b12: 2401 movs r4, #1
  24761. else
  24762. {
  24763. xReturn = pdTRUE;
  24764. }
  24765. }
  24766. taskEXIT_CRITICAL();
  24767. 8029b14: f000 fac4 bl 802a0a0 <vPortExitCritical>
  24768. return xReturn;
  24769. }
  24770. 8029b18: 4620 mov r0, r4
  24771. 8029b1a: bd38 pop {r3, r4, r5, pc}
  24772. 8029b1c: 200029b4 .word 0x200029b4
  24773. 8029b20: 200028e4 .word 0x200028e4
  24774. 08029b24 <vTaskMissedYield>:
  24775. /*-----------------------------------------------------------*/
  24776. void vTaskMissedYield( void )
  24777. {
  24778. xYieldPending = pdTRUE;
  24779. 8029b24: 4b01 ldr r3, [pc, #4] ; (8029b2c <vTaskMissedYield+0x8>)
  24780. 8029b26: 2201 movs r2, #1
  24781. 8029b28: 601a str r2, [r3, #0]
  24782. 8029b2a: 4770 bx lr
  24783. 8029b2c: 200029dc .word 0x200029dc
  24784. 08029b30 <xTaskGetSchedulerState>:
  24785. BaseType_t xTaskGetSchedulerState( void )
  24786. {
  24787. BaseType_t xReturn;
  24788. if( xSchedulerRunning == pdFALSE )
  24789. 8029b30: 4b05 ldr r3, [pc, #20] ; (8029b48 <xTaskGetSchedulerState+0x18>)
  24790. 8029b32: 681b ldr r3, [r3, #0]
  24791. 8029b34: b133 cbz r3, 8029b44 <xTaskGetSchedulerState+0x14>
  24792. {
  24793. xReturn = taskSCHEDULER_NOT_STARTED;
  24794. }
  24795. else
  24796. {
  24797. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  24798. 8029b36: 4b05 ldr r3, [pc, #20] ; (8029b4c <xTaskGetSchedulerState+0x1c>)
  24799. 8029b38: 6818 ldr r0, [r3, #0]
  24800. {
  24801. xReturn = taskSCHEDULER_RUNNING;
  24802. 8029b3a: 2800 cmp r0, #0
  24803. 8029b3c: bf0c ite eq
  24804. 8029b3e: 2002 moveq r0, #2
  24805. 8029b40: 2000 movne r0, #0
  24806. 8029b42: 4770 bx lr
  24807. {
  24808. BaseType_t xReturn;
  24809. if( xSchedulerRunning == pdFALSE )
  24810. {
  24811. xReturn = taskSCHEDULER_NOT_STARTED;
  24812. 8029b44: 2001 movs r0, #1
  24813. xReturn = taskSCHEDULER_SUSPENDED;
  24814. }
  24815. }
  24816. return xReturn;
  24817. }
  24818. 8029b46: 4770 bx lr
  24819. 8029b48: 200028ec .word 0x200028ec
  24820. 8029b4c: 200029b0 .word 0x200029b0
  24821. 08029b50 <vTaskPriorityInherit>:
  24822. /*-----------------------------------------------------------*/
  24823. #if ( configUSE_MUTEXES == 1 )
  24824. void vTaskPriorityInherit( TaskHandle_t const pxMutexHolder )
  24825. {
  24826. 8029b50: b5f8 push {r3, r4, r5, r6, r7, lr}
  24827. TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
  24828. /* If the mutex was given back by an interrupt while the queue was
  24829. locked then the mutex holder might now be NULL. */
  24830. if( pxMutexHolder != NULL )
  24831. 8029b52: 4604 mov r4, r0
  24832. 8029b54: 2800 cmp r0, #0
  24833. 8029b56: d040 beq.n 8029bda <vTaskPriorityInherit+0x8a>
  24834. {
  24835. if( pxTCB->uxPriority < pxCurrentTCB->uxPriority )
  24836. 8029b58: 4a20 ldr r2, [pc, #128] ; (8029bdc <vTaskPriorityInherit+0x8c>)
  24837. 8029b5a: 6ac3 ldr r3, [r0, #44] ; 0x2c
  24838. 8029b5c: 6811 ldr r1, [r2, #0]
  24839. 8029b5e: 6ac9 ldr r1, [r1, #44] ; 0x2c
  24840. 8029b60: 428b cmp r3, r1
  24841. 8029b62: d23a bcs.n 8029bda <vTaskPriorityInherit+0x8a>
  24842. {
  24843. /* Adjust the mutex holder state to account for its new
  24844. priority. Only reset the event list item value if the value is
  24845. not being used for anything else. */
  24846. if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL )
  24847. 8029b64: 6981 ldr r1, [r0, #24]
  24848. 8029b66: 2900 cmp r1, #0
  24849. 8029b68: db04 blt.n 8029b74 <vTaskPriorityInherit+0x24>
  24850. {
  24851. listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  24852. 8029b6a: 6812 ldr r2, [r2, #0]
  24853. 8029b6c: 6ad2 ldr r2, [r2, #44] ; 0x2c
  24854. 8029b6e: f1c2 0205 rsb r2, r2, #5
  24855. 8029b72: 6182 str r2, [r0, #24]
  24856. mtCOVERAGE_TEST_MARKER();
  24857. }
  24858. /* If the task being modified is in the ready state it will need to
  24859. be moved into a new list. */
  24860. if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE )
  24861. 8029b74: 4e1a ldr r6, [pc, #104] ; (8029be0 <vTaskPriorityInherit+0x90>)
  24862. 8029b76: 6962 ldr r2, [r4, #20]
  24863. 8029b78: 2714 movs r7, #20
  24864. 8029b7a: fb07 6303 mla r3, r7, r3, r6
  24865. 8029b7e: 429a cmp r2, r3
  24866. 8029b80: d127 bne.n 8029bd2 <vTaskPriorityInherit+0x82>
  24867. 8029b82: e01f b.n 8029bc4 <vTaskPriorityInherit+0x74>
  24868. {
  24869. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  24870. {
  24871. taskRESET_READY_PRIORITY( pxTCB->uxPriority );
  24872. 8029b84: 6ae2 ldr r2, [r4, #44] ; 0x2c
  24873. 8029b86: 4357 muls r7, r2
  24874. 8029b88: 59f3 ldr r3, [r6, r7]
  24875. 8029b8a: b93b cbnz r3, 8029b9c <vTaskPriorityInherit+0x4c>
  24876. 8029b8c: 4b15 ldr r3, [pc, #84] ; (8029be4 <vTaskPriorityInherit+0x94>)
  24877. 8029b8e: 2001 movs r0, #1
  24878. 8029b90: 6819 ldr r1, [r3, #0]
  24879. 8029b92: fa00 f202 lsl.w r2, r0, r2
  24880. 8029b96: ea21 0202 bic.w r2, r1, r2
  24881. 8029b9a: 601a str r2, [r3, #0]
  24882. {
  24883. mtCOVERAGE_TEST_MARKER();
  24884. }
  24885. /* Inherit the priority before being moved into the new list. */
  24886. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  24887. 8029b9c: 4b0f ldr r3, [pc, #60] ; (8029bdc <vTaskPriorityInherit+0x8c>)
  24888. prvAddTaskToReadyList( pxTCB );
  24889. 8029b9e: 4a11 ldr r2, [pc, #68] ; (8029be4 <vTaskPriorityInherit+0x94>)
  24890. {
  24891. mtCOVERAGE_TEST_MARKER();
  24892. }
  24893. /* Inherit the priority before being moved into the new list. */
  24894. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  24895. 8029ba0: 681b ldr r3, [r3, #0]
  24896. prvAddTaskToReadyList( pxTCB );
  24897. 8029ba2: 6810 ldr r0, [r2, #0]
  24898. {
  24899. mtCOVERAGE_TEST_MARKER();
  24900. }
  24901. /* Inherit the priority before being moved into the new list. */
  24902. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  24903. 8029ba4: 6adb ldr r3, [r3, #44] ; 0x2c
  24904. prvAddTaskToReadyList( pxTCB );
  24905. 8029ba6: 2101 movs r1, #1
  24906. 8029ba8: fa01 f103 lsl.w r1, r1, r3
  24907. 8029bac: 4301 orrs r1, r0
  24908. 8029bae: 6011 str r1, [r2, #0]
  24909. 8029bb0: 4a0b ldr r2, [pc, #44] ; (8029be0 <vTaskPriorityInherit+0x90>)
  24910. {
  24911. mtCOVERAGE_TEST_MARKER();
  24912. }
  24913. /* Inherit the priority before being moved into the new list. */
  24914. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  24915. 8029bb2: 62e3 str r3, [r4, #44] ; 0x2c
  24916. prvAddTaskToReadyList( pxTCB );
  24917. 8029bb4: 2014 movs r0, #20
  24918. 8029bb6: fb00 2003 mla r0, r0, r3, r2
  24919. 8029bba: 4629 mov r1, r5
  24920. }
  24921. else
  24922. {
  24923. mtCOVERAGE_TEST_MARKER();
  24924. }
  24925. }
  24926. 8029bbc: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  24927. mtCOVERAGE_TEST_MARKER();
  24928. }
  24929. /* Inherit the priority before being moved into the new list. */
  24930. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  24931. prvAddTaskToReadyList( pxTCB );
  24932. 8029bc0: f7ff b874 b.w 8028cac <vListInsertEnd>
  24933. /* If the task being modified is in the ready state it will need to
  24934. be moved into a new list. */
  24935. if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE )
  24936. {
  24937. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  24938. 8029bc4: 1d25 adds r5, r4, #4
  24939. 8029bc6: 4628 mov r0, r5
  24940. 8029bc8: f7ff f894 bl 8028cf4 <uxListRemove>
  24941. 8029bcc: 2800 cmp r0, #0
  24942. 8029bce: d0d9 beq.n 8029b84 <vTaskPriorityInherit+0x34>
  24943. 8029bd0: e7e4 b.n 8029b9c <vTaskPriorityInherit+0x4c>
  24944. prvAddTaskToReadyList( pxTCB );
  24945. }
  24946. else
  24947. {
  24948. /* Just inherit the priority. */
  24949. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  24950. 8029bd2: 4b02 ldr r3, [pc, #8] ; (8029bdc <vTaskPriorityInherit+0x8c>)
  24951. 8029bd4: 681b ldr r3, [r3, #0]
  24952. 8029bd6: 6adb ldr r3, [r3, #44] ; 0x2c
  24953. 8029bd8: 62e3 str r3, [r4, #44] ; 0x2c
  24954. 8029bda: bdf8 pop {r3, r4, r5, r6, r7, pc}
  24955. 8029bdc: 20002998 .word 0x20002998
  24956. 8029be0: 20002920 .word 0x20002920
  24957. 8029be4: 200029d8 .word 0x200029d8
  24958. 08029be8 <xTaskPriorityDisinherit>:
  24959. /*-----------------------------------------------------------*/
  24960. #if ( configUSE_MUTEXES == 1 )
  24961. BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )
  24962. {
  24963. 8029be8: b538 push {r3, r4, r5, lr}
  24964. TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
  24965. BaseType_t xReturn = pdFALSE;
  24966. if( pxMutexHolder != NULL )
  24967. 8029bea: 4604 mov r4, r0
  24968. 8029bec: b908 cbnz r0, 8029bf2 <xTaskPriorityDisinherit+0xa>
  24969. #if ( configUSE_MUTEXES == 1 )
  24970. BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )
  24971. {
  24972. TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
  24973. BaseType_t xReturn = pdFALSE;
  24974. 8029bee: 2000 movs r0, #0
  24975. 8029bf0: bd38 pop {r3, r4, r5, pc}
  24976. if( pxMutexHolder != NULL )
  24977. {
  24978. configASSERT( pxTCB->uxMutexesHeld );
  24979. 8029bf2: 6d03 ldr r3, [r0, #80] ; 0x50
  24980. 8029bf4: b913 cbnz r3, 8029bfc <xTaskPriorityDisinherit+0x14>
  24981. 8029bf6: f000 fa1f bl 802a038 <ulPortSetInterruptMask>
  24982. 8029bfa: e7fe b.n 8029bfa <xTaskPriorityDisinherit+0x12>
  24983. ( pxTCB->uxMutexesHeld )--;
  24984. if( pxTCB->uxPriority != pxTCB->uxBasePriority )
  24985. 8029bfc: 6ac1 ldr r1, [r0, #44] ; 0x2c
  24986. 8029bfe: 6cc2 ldr r2, [r0, #76] ; 0x4c
  24987. BaseType_t xReturn = pdFALSE;
  24988. if( pxMutexHolder != NULL )
  24989. {
  24990. configASSERT( pxTCB->uxMutexesHeld );
  24991. ( pxTCB->uxMutexesHeld )--;
  24992. 8029c00: 3b01 subs r3, #1
  24993. if( pxTCB->uxPriority != pxTCB->uxBasePriority )
  24994. 8029c02: 4291 cmp r1, r2
  24995. BaseType_t xReturn = pdFALSE;
  24996. if( pxMutexHolder != NULL )
  24997. {
  24998. configASSERT( pxTCB->uxMutexesHeld );
  24999. ( pxTCB->uxMutexesHeld )--;
  25000. 8029c04: 6503 str r3, [r0, #80] ; 0x50
  25001. if( pxTCB->uxPriority != pxTCB->uxBasePriority )
  25002. 8029c06: d0f2 beq.n 8029bee <xTaskPriorityDisinherit+0x6>
  25003. {
  25004. /* Only disinherit if no other mutexes are held. */
  25005. if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 )
  25006. 8029c08: 2b00 cmp r3, #0
  25007. 8029c0a: d1f0 bne.n 8029bee <xTaskPriorityDisinherit+0x6>
  25008. /* A task can only have an inhertied priority if it holds
  25009. the mutex. If the mutex is held by a task then it cannot be
  25010. given from an interrupt, and if a mutex is given by the
  25011. holding task then it must be the running state task. Remove
  25012. the holding task from the ready list. */
  25013. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  25014. 8029c0c: 1d05 adds r5, r0, #4
  25015. 8029c0e: 4628 mov r0, r5
  25016. 8029c10: f7ff f870 bl 8028cf4 <uxListRemove>
  25017. 8029c14: b968 cbnz r0, 8029c32 <xTaskPriorityDisinherit+0x4a>
  25018. {
  25019. taskRESET_READY_PRIORITY( pxTCB->uxPriority );
  25020. 8029c16: 6ae2 ldr r2, [r4, #44] ; 0x2c
  25021. 8029c18: 4910 ldr r1, [pc, #64] ; (8029c5c <xTaskPriorityDisinherit+0x74>)
  25022. 8029c1a: 2314 movs r3, #20
  25023. 8029c1c: 4353 muls r3, r2
  25024. 8029c1e: 58cb ldr r3, [r1, r3]
  25025. 8029c20: b93b cbnz r3, 8029c32 <xTaskPriorityDisinherit+0x4a>
  25026. 8029c22: 4b0f ldr r3, [pc, #60] ; (8029c60 <xTaskPriorityDisinherit+0x78>)
  25027. 8029c24: 2001 movs r0, #1
  25028. 8029c26: 6819 ldr r1, [r3, #0]
  25029. 8029c28: fa00 f202 lsl.w r2, r0, r2
  25030. 8029c2c: ea21 0202 bic.w r2, r1, r2
  25031. 8029c30: 601a str r2, [r3, #0]
  25032. }
  25033. /* Disinherit the priority before adding the task into the
  25034. new ready list. */
  25035. traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );
  25036. pxTCB->uxPriority = pxTCB->uxBasePriority;
  25037. 8029c32: 6ce3 ldr r3, [r4, #76] ; 0x4c
  25038. /* Reset the event list item value. It cannot be in use for
  25039. any other purpose if this task is running, and it must be
  25040. running to give back the mutex. */
  25041. 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. */
  25042. 8029c34: f1c3 0205 rsb r2, r3, #5
  25043. 8029c38: 61a2 str r2, [r4, #24]
  25044. prvAddTaskToReadyList( pxTCB );
  25045. 8029c3a: 4a09 ldr r2, [pc, #36] ; (8029c60 <xTaskPriorityDisinherit+0x78>)
  25046. }
  25047. /* Disinherit the priority before adding the task into the
  25048. new ready list. */
  25049. traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );
  25050. pxTCB->uxPriority = pxTCB->uxBasePriority;
  25051. 8029c3c: 62e3 str r3, [r4, #44] ; 0x2c
  25052. /* Reset the event list item value. It cannot be in use for
  25053. any other purpose if this task is running, and it must be
  25054. running to give back the mutex. */
  25055. 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. */
  25056. prvAddTaskToReadyList( pxTCB );
  25057. 8029c3e: 6811 ldr r1, [r2, #0]
  25058. 8029c40: 2401 movs r4, #1
  25059. 8029c42: fa04 f003 lsl.w r0, r4, r3
  25060. 8029c46: 4301 orrs r1, r0
  25061. 8029c48: 6011 str r1, [r2, #0]
  25062. 8029c4a: 4a04 ldr r2, [pc, #16] ; (8029c5c <xTaskPriorityDisinherit+0x74>)
  25063. 8029c4c: 2014 movs r0, #20
  25064. 8029c4e: fb00 2003 mla r0, r0, r3, r2
  25065. 8029c52: 4629 mov r1, r5
  25066. 8029c54: f7ff f82a bl 8028cac <vListInsertEnd>
  25067. in an order different to that in which they were taken.
  25068. If a context switch did not occur when the first mutex was
  25069. returned, even if a task was waiting on it, then a context
  25070. switch should occur when the last mutex is returned whether
  25071. a task is waiting on it or not. */
  25072. xReturn = pdTRUE;
  25073. 8029c58: 4620 mov r0, r4
  25074. {
  25075. mtCOVERAGE_TEST_MARKER();
  25076. }
  25077. return xReturn;
  25078. }
  25079. 8029c5a: bd38 pop {r3, r4, r5, pc}
  25080. 8029c5c: 20002920 .word 0x20002920
  25081. 8029c60: 200029d8 .word 0x200029d8
  25082. 08029c64 <pvTaskIncrementMutexHeldCount>:
  25083. void *pvTaskIncrementMutexHeldCount( void )
  25084. {
  25085. /* If xSemaphoreCreateMutex() is called before any tasks have been created
  25086. then pxCurrentTCB will be NULL. */
  25087. if( pxCurrentTCB != NULL )
  25088. 8029c64: 4b04 ldr r3, [pc, #16] ; (8029c78 <pvTaskIncrementMutexHeldCount+0x14>)
  25089. 8029c66: 681a ldr r2, [r3, #0]
  25090. 8029c68: b11a cbz r2, 8029c72 <pvTaskIncrementMutexHeldCount+0xe>
  25091. {
  25092. ( pxCurrentTCB->uxMutexesHeld )++;
  25093. 8029c6a: 681a ldr r2, [r3, #0]
  25094. 8029c6c: 6d11 ldr r1, [r2, #80] ; 0x50
  25095. 8029c6e: 3101 adds r1, #1
  25096. 8029c70: 6511 str r1, [r2, #80] ; 0x50
  25097. }
  25098. return pxCurrentTCB;
  25099. 8029c72: 6818 ldr r0, [r3, #0]
  25100. }
  25101. 8029c74: 4770 bx lr
  25102. 8029c76: bf00 nop
  25103. 8029c78: 20002998 .word 0x20002998
  25104. 08029c7c <prvCheckForValidListAndQueue>:
  25105. pxOverflowTimerList = pxTemp;
  25106. }
  25107. /*-----------------------------------------------------------*/
  25108. static void prvCheckForValidListAndQueue( void )
  25109. {
  25110. 8029c7c: b5f8 push {r3, r4, r5, r6, r7, lr}
  25111. /* Check that the list from which active timers are referenced, and the
  25112. queue used to communicate with the timer service, have been
  25113. initialised. */
  25114. taskENTER_CRITICAL();
  25115. {
  25116. if( xTimerQueue == NULL )
  25117. 8029c7e: 4c0f ldr r4, [pc, #60] ; (8029cbc <prvCheckForValidListAndQueue+0x40>)
  25118. static void prvCheckForValidListAndQueue( void )
  25119. {
  25120. /* Check that the list from which active timers are referenced, and the
  25121. queue used to communicate with the timer service, have been
  25122. initialised. */
  25123. taskENTER_CRITICAL();
  25124. 8029c80: f000 f9e2 bl 802a048 <vPortEnterCritical>
  25125. {
  25126. if( xTimerQueue == NULL )
  25127. 8029c84: 6825 ldr r5, [r4, #0]
  25128. 8029c86: b9ad cbnz r5, 8029cb4 <prvCheckForValidListAndQueue+0x38>
  25129. {
  25130. vListInitialise( &xActiveTimerList1 );
  25131. 8029c88: 4f0d ldr r7, [pc, #52] ; (8029cc0 <prvCheckForValidListAndQueue+0x44>)
  25132. vListInitialise( &xActiveTimerList2 );
  25133. 8029c8a: 4e0e ldr r6, [pc, #56] ; (8029cc4 <prvCheckForValidListAndQueue+0x48>)
  25134. initialised. */
  25135. taskENTER_CRITICAL();
  25136. {
  25137. if( xTimerQueue == NULL )
  25138. {
  25139. vListInitialise( &xActiveTimerList1 );
  25140. 8029c8c: 4638 mov r0, r7
  25141. 8029c8e: f7fe ffff bl 8028c90 <vListInitialise>
  25142. vListInitialise( &xActiveTimerList2 );
  25143. 8029c92: 4630 mov r0, r6
  25144. 8029c94: f7fe fffc bl 8028c90 <vListInitialise>
  25145. pxCurrentTimerList = &xActiveTimerList1;
  25146. 8029c98: 4b0b ldr r3, [pc, #44] ; (8029cc8 <prvCheckForValidListAndQueue+0x4c>)
  25147. 8029c9a: 601f str r7, [r3, #0]
  25148. pxOverflowTimerList = &xActiveTimerList2;
  25149. 8029c9c: 4b0b ldr r3, [pc, #44] ; (8029ccc <prvCheckForValidListAndQueue+0x50>)
  25150. xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) );
  25151. 8029c9e: 200a movs r0, #10
  25152. 8029ca0: 210c movs r1, #12
  25153. 8029ca2: 462a mov r2, r5
  25154. if( xTimerQueue == NULL )
  25155. {
  25156. vListInitialise( &xActiveTimerList1 );
  25157. vListInitialise( &xActiveTimerList2 );
  25158. pxCurrentTimerList = &xActiveTimerList1;
  25159. pxOverflowTimerList = &xActiveTimerList2;
  25160. 8029ca4: 601e str r6, [r3, #0]
  25161. xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) );
  25162. 8029ca6: f7ff f8e4 bl 8028e72 <xQueueGenericCreate>
  25163. 8029caa: 6020 str r0, [r4, #0]
  25164. configASSERT( xTimerQueue );
  25165. 8029cac: b910 cbnz r0, 8029cb4 <prvCheckForValidListAndQueue+0x38>
  25166. 8029cae: f000 f9c3 bl 802a038 <ulPortSetInterruptMask>
  25167. 8029cb2: e7fe b.n 8029cb2 <prvCheckForValidListAndQueue+0x36>
  25168. {
  25169. mtCOVERAGE_TEST_MARKER();
  25170. }
  25171. }
  25172. taskEXIT_CRITICAL();
  25173. }
  25174. 8029cb4: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  25175. else
  25176. {
  25177. mtCOVERAGE_TEST_MARKER();
  25178. }
  25179. }
  25180. taskEXIT_CRITICAL();
  25181. 8029cb8: f000 b9f2 b.w 802a0a0 <vPortExitCritical>
  25182. 8029cbc: 20002a10 .word 0x20002a10
  25183. 8029cc0: 200029e4 .word 0x200029e4
  25184. 8029cc4: 200029f8 .word 0x200029f8
  25185. 8029cc8: 200029e0 .word 0x200029e0
  25186. 8029ccc: 20002a14 .word 0x20002a14
  25187. 08029cd0 <prvInsertTimerInActiveList>:
  25188. return xTimeNow;
  25189. }
  25190. /*-----------------------------------------------------------*/
  25191. static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime )
  25192. {
  25193. 8029cd0: b510 push {r4, lr}
  25194. 8029cd2: 4604 mov r4, r0
  25195. BaseType_t xProcessTimerNow = pdFALSE;
  25196. listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime );
  25197. listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );
  25198. if( xNextExpiryTime <= xTimeNow )
  25199. 8029cd4: 4291 cmp r1, r2
  25200. static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime )
  25201. {
  25202. BaseType_t xProcessTimerNow = pdFALSE;
  25203. listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime );
  25204. 8029cd6: 6041 str r1, [r0, #4]
  25205. listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );
  25206. 8029cd8: 6120 str r0, [r4, #16]
  25207. if( xNextExpiryTime <= xTimeNow )
  25208. 8029cda: d805 bhi.n 8029ce8 <prvInsertTimerInActiveList+0x18>
  25209. {
  25210. /* Has the expiry time elapsed between the command to start/reset a
  25211. timer was issued, and the time the command was processed? */
  25212. if( ( xTimeNow - xCommandTime ) >= pxTimer->xTimerPeriodInTicks )
  25213. 8029cdc: 6981 ldr r1, [r0, #24]
  25214. 8029cde: 1ad2 subs r2, r2, r3
  25215. 8029ce0: 428a cmp r2, r1
  25216. 8029ce2: d20c bcs.n 8029cfe <prvInsertTimerInActiveList+0x2e>
  25217. processed actually exceeds the timers period. */
  25218. xProcessTimerNow = pdTRUE;
  25219. }
  25220. else
  25221. {
  25222. vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) );
  25223. 8029ce4: 4b07 ldr r3, [pc, #28] ; (8029d04 <prvInsertTimerInActiveList+0x34>)
  25224. 8029ce6: e004 b.n 8029cf2 <prvInsertTimerInActiveList+0x22>
  25225. }
  25226. }
  25227. else
  25228. {
  25229. if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) )
  25230. 8029ce8: 429a cmp r2, r3
  25231. 8029cea: d201 bcs.n 8029cf0 <prvInsertTimerInActiveList+0x20>
  25232. 8029cec: 4299 cmp r1, r3
  25233. 8029cee: d206 bcs.n 8029cfe <prvInsertTimerInActiveList+0x2e>
  25234. its expiry time and should be processed immediately. */
  25235. xProcessTimerNow = pdTRUE;
  25236. }
  25237. else
  25238. {
  25239. vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
  25240. 8029cf0: 4b05 ldr r3, [pc, #20] ; (8029d08 <prvInsertTimerInActiveList+0x38>)
  25241. 8029cf2: 6818 ldr r0, [r3, #0]
  25242. 8029cf4: 1d21 adds r1, r4, #4
  25243. 8029cf6: f7fe ffe5 bl 8028cc4 <vListInsert>
  25244. }
  25245. /*-----------------------------------------------------------*/
  25246. static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime )
  25247. {
  25248. BaseType_t xProcessTimerNow = pdFALSE;
  25249. 8029cfa: 2000 movs r0, #0
  25250. 8029cfc: bd10 pop {r4, pc}
  25251. timer was issued, and the time the command was processed? */
  25252. if( ( xTimeNow - xCommandTime ) >= pxTimer->xTimerPeriodInTicks )
  25253. {
  25254. /* The time between a command being issued and the command being
  25255. processed actually exceeds the timers period. */
  25256. xProcessTimerNow = pdTRUE;
  25257. 8029cfe: 2001 movs r0, #1
  25258. vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
  25259. }
  25260. }
  25261. return xProcessTimerNow;
  25262. }
  25263. 8029d00: bd10 pop {r4, pc}
  25264. 8029d02: bf00 nop
  25265. 8029d04: 20002a14 .word 0x20002a14
  25266. 8029d08: 200029e0 .word 0x200029e0
  25267. 08029d0c <xTimerCreateTimerTask>:
  25268. static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, const BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION;
  25269. /*-----------------------------------------------------------*/
  25270. BaseType_t xTimerCreateTimerTask( void )
  25271. {
  25272. 8029d0c: b51f push {r0, r1, r2, r3, r4, lr}
  25273. /* This function is called when the scheduler is started if
  25274. configUSE_TIMERS is set to 1. Check that the infrastructure used by the
  25275. timer service task has been created/initialised. If timers have already
  25276. been created then the initialisation will already have been performed. */
  25277. prvCheckForValidListAndQueue();
  25278. 8029d0e: f7ff ffb5 bl 8029c7c <prvCheckForValidListAndQueue>
  25279. if( xTimerQueue != NULL )
  25280. 8029d12: 4b0b ldr r3, [pc, #44] ; (8029d40 <xTimerCreateTimerTask+0x34>)
  25281. 8029d14: 681b ldr r3, [r3, #0]
  25282. 8029d16: b913 cbnz r3, 8029d1e <xTimerCreateTimerTask+0x12>
  25283. else
  25284. {
  25285. mtCOVERAGE_TEST_MARKER();
  25286. }
  25287. configASSERT( xReturn );
  25288. 8029d18: f000 f98e bl 802a038 <ulPortSetInterruptMask>
  25289. 8029d1c: e00d b.n 8029d3a <xTimerCreateTimerTask+0x2e>
  25290. xReturn = xTaskCreate( prvTimerTask, "Tmr Svc", ( uint16_t ) configTIMER_TASK_STACK_DEPTH, NULL, ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, &xTimerTaskHandle );
  25291. }
  25292. #else
  25293. {
  25294. /* Create the timer task without storing its handle. */
  25295. xReturn = xTaskCreate( prvTimerTask, "Tmr Svc", ( uint16_t ) configTIMER_TASK_STACK_DEPTH, NULL, ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, NULL);
  25296. 8029d1e: 2301 movs r3, #1
  25297. 8029d20: 9300 str r3, [sp, #0]
  25298. 8029d22: 2300 movs r3, #0
  25299. 8029d24: 9301 str r3, [sp, #4]
  25300. 8029d26: 9302 str r3, [sp, #8]
  25301. 8029d28: 9303 str r3, [sp, #12]
  25302. 8029d2a: 4806 ldr r0, [pc, #24] ; (8029d44 <xTimerCreateTimerTask+0x38>)
  25303. 8029d2c: 4906 ldr r1, [pc, #24] ; (8029d48 <xTimerCreateTimerTask+0x3c>)
  25304. 8029d2e: f44f 7280 mov.w r2, #256 ; 0x100
  25305. 8029d32: f7ff fb25 bl 8029380 <xTaskGenericCreate>
  25306. else
  25307. {
  25308. mtCOVERAGE_TEST_MARKER();
  25309. }
  25310. configASSERT( xReturn );
  25311. 8029d36: b908 cbnz r0, 8029d3c <xTimerCreateTimerTask+0x30>
  25312. 8029d38: e7ee b.n 8029d18 <xTimerCreateTimerTask+0xc>
  25313. 8029d3a: e7fe b.n 8029d3a <xTimerCreateTimerTask+0x2e>
  25314. return xReturn;
  25315. }
  25316. 8029d3c: b005 add sp, #20
  25317. 8029d3e: bd00 pop {pc}
  25318. 8029d40: 20002a10 .word 0x20002a10
  25319. 8029d44: 08029e45 .word 0x08029e45
  25320. 8029d48: 08035f98 .word 0x08035f98
  25321. 08029d4c <xTimerCreate>:
  25322. /*-----------------------------------------------------------*/
  25323. TimerHandle_t xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
  25324. {
  25325. 8029d4c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  25326. 8029d50: 4680 mov r8, r0
  25327. 8029d52: 4617 mov r7, r2
  25328. 8029d54: 461e mov r6, r3
  25329. Timer_t *pxNewTimer;
  25330. /* Allocate the timer structure. */
  25331. if( xTimerPeriodInTicks == ( TickType_t ) 0U )
  25332. 8029d56: 460d mov r5, r1
  25333. 8029d58: b191 cbz r1, 8029d80 <xTimerCreate+0x34>
  25334. {
  25335. pxNewTimer = NULL;
  25336. }
  25337. else
  25338. {
  25339. pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) );
  25340. 8029d5a: 202c movs r0, #44 ; 0x2c
  25341. 8029d5c: f000 fa82 bl 802a264 <pvPortMalloc>
  25342. if( pxNewTimer != NULL )
  25343. 8029d60: 4604 mov r4, r0
  25344. 8029d62: b180 cbz r0, 8029d86 <xTimerCreate+0x3a>
  25345. {
  25346. /* Ensure the infrastructure used by the timer service task has been
  25347. created/initialised. */
  25348. prvCheckForValidListAndQueue();
  25349. 8029d64: f7ff ff8a bl 8029c7c <prvCheckForValidListAndQueue>
  25350. /* Initialise the timer structure members using the function parameters. */
  25351. pxNewTimer->pcTimerName = pcTimerName;
  25352. pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks;
  25353. pxNewTimer->uxAutoReload = uxAutoReload;
  25354. pxNewTimer->pvTimerID = pvTimerID;
  25355. pxNewTimer->pxCallbackFunction = pxCallbackFunction;
  25356. 8029d68: 9b06 ldr r3, [sp, #24]
  25357. /* Ensure the infrastructure used by the timer service task has been
  25358. created/initialised. */
  25359. prvCheckForValidListAndQueue();
  25360. /* Initialise the timer structure members using the function parameters. */
  25361. pxNewTimer->pcTimerName = pcTimerName;
  25362. 8029d6a: f8c4 8000 str.w r8, [r4]
  25363. pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks;
  25364. 8029d6e: 61a5 str r5, [r4, #24]
  25365. pxNewTimer->uxAutoReload = uxAutoReload;
  25366. 8029d70: 61e7 str r7, [r4, #28]
  25367. pxNewTimer->pvTimerID = pvTimerID;
  25368. 8029d72: 6226 str r6, [r4, #32]
  25369. pxNewTimer->pxCallbackFunction = pxCallbackFunction;
  25370. 8029d74: 6263 str r3, [r4, #36] ; 0x24
  25371. vListInitialiseItem( &( pxNewTimer->xTimerListItem ) );
  25372. 8029d76: 1d20 adds r0, r4, #4
  25373. 8029d78: f7fe ff95 bl 8028ca6 <vListInitialiseItem>
  25374. 8029d7c: e003 b.n 8029d86 <xTimerCreate+0x3a>
  25375. 8029d7e: e7fe b.n 8029d7e <xTimerCreate+0x32>
  25376. traceTIMER_CREATE_FAILED();
  25377. }
  25378. }
  25379. /* 0 is not a valid value for xTimerPeriodInTicks. */
  25380. configASSERT( ( xTimerPeriodInTicks > 0 ) );
  25381. 8029d80: f000 f95a bl 802a038 <ulPortSetInterruptMask>
  25382. 8029d84: e7fb b.n 8029d7e <xTimerCreate+0x32>
  25383. return ( TimerHandle_t ) pxNewTimer;
  25384. }
  25385. 8029d86: 4620 mov r0, r4
  25386. 8029d88: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  25387. 08029d8c <xTimerGenericCommand>:
  25388. /*-----------------------------------------------------------*/
  25389. BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait )
  25390. {
  25391. 8029d8c: b530 push {r4, r5, lr}
  25392. BaseType_t xReturn = pdFAIL;
  25393. DaemonTaskMessage_t xMessage;
  25394. /* Send a message to the timer service task to perform a particular action
  25395. on a particular timer definition. */
  25396. if( xTimerQueue != NULL )
  25397. 8029d8e: 4c0f ldr r4, [pc, #60] ; (8029dcc <xTimerGenericCommand+0x40>)
  25398. return ( TimerHandle_t ) pxNewTimer;
  25399. }
  25400. /*-----------------------------------------------------------*/
  25401. BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait )
  25402. {
  25403. 8029d90: 4605 mov r5, r0
  25404. BaseType_t xReturn = pdFAIL;
  25405. DaemonTaskMessage_t xMessage;
  25406. /* Send a message to the timer service task to perform a particular action
  25407. on a particular timer definition. */
  25408. if( xTimerQueue != NULL )
  25409. 8029d92: 6820 ldr r0, [r4, #0]
  25410. return ( TimerHandle_t ) pxNewTimer;
  25411. }
  25412. /*-----------------------------------------------------------*/
  25413. BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait )
  25414. {
  25415. 8029d94: b085 sub sp, #20
  25416. BaseType_t xReturn = pdFAIL;
  25417. DaemonTaskMessage_t xMessage;
  25418. /* Send a message to the timer service task to perform a particular action
  25419. on a particular timer definition. */
  25420. if( xTimerQueue != NULL )
  25421. 8029d96: b1b8 cbz r0, 8029dc8 <xTimerGenericCommand+0x3c>
  25422. /* Send a command to the timer service task to start the xTimer timer. */
  25423. xMessage.xMessageID = xCommandID;
  25424. xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;
  25425. xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer;
  25426. if( xCommandID < tmrFIRST_FROM_ISR_COMMAND )
  25427. 8029d98: 2905 cmp r1, #5
  25428. /* Send a message to the timer service task to perform a particular action
  25429. on a particular timer definition. */
  25430. if( xTimerQueue != NULL )
  25431. {
  25432. /* Send a command to the timer service task to start the xTimer timer. */
  25433. xMessage.xMessageID = xCommandID;
  25434. 8029d9a: 9101 str r1, [sp, #4]
  25435. xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;
  25436. 8029d9c: 9202 str r2, [sp, #8]
  25437. xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer;
  25438. 8029d9e: 9503 str r5, [sp, #12]
  25439. if( xCommandID < tmrFIRST_FROM_ISR_COMMAND )
  25440. 8029da0: dc0d bgt.n 8029dbe <xTimerGenericCommand+0x32>
  25441. {
  25442. if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING )
  25443. 8029da2: f7ff fec5 bl 8029b30 <xTaskGetSchedulerState>
  25444. 8029da6: 2802 cmp r0, #2
  25445. {
  25446. xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait );
  25447. 8029da8: a901 add r1, sp, #4
  25448. 8029daa: 6820 ldr r0, [r4, #0]
  25449. xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;
  25450. xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer;
  25451. if( xCommandID < tmrFIRST_FROM_ISR_COMMAND )
  25452. {
  25453. if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING )
  25454. 8029dac: d102 bne.n 8029db4 <xTimerGenericCommand+0x28>
  25455. {
  25456. xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait );
  25457. 8029dae: 9a08 ldr r2, [sp, #32]
  25458. 8029db0: 2300 movs r3, #0
  25459. 8029db2: e001 b.n 8029db8 <xTimerGenericCommand+0x2c>
  25460. }
  25461. else
  25462. {
  25463. xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY );
  25464. 8029db4: 2200 movs r2, #0
  25465. 8029db6: 4613 mov r3, r2
  25466. 8029db8: f7ff f898 bl 8028eec <xQueueGenericSend>
  25467. 8029dbc: e004 b.n 8029dc8 <xTimerGenericCommand+0x3c>
  25468. }
  25469. }
  25470. else
  25471. {
  25472. xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken );
  25473. 8029dbe: 461a mov r2, r3
  25474. 8029dc0: a901 add r1, sp, #4
  25475. 8029dc2: 2300 movs r3, #0
  25476. 8029dc4: f7ff f956 bl 8029074 <xQueueGenericSendFromISR>
  25477. {
  25478. mtCOVERAGE_TEST_MARKER();
  25479. }
  25480. return xReturn;
  25481. }
  25482. 8029dc8: b005 add sp, #20
  25483. 8029dca: bd30 pop {r4, r5, pc}
  25484. 8029dcc: 20002a10 .word 0x20002a10
  25485. 08029dd0 <prvSwitchTimerLists>:
  25486. }
  25487. }
  25488. /*-----------------------------------------------------------*/
  25489. static void prvSwitchTimerLists( void )
  25490. {
  25491. 8029dd0: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
  25492. /* The tick count has overflowed. The timer lists must be switched.
  25493. If there are any timers still referenced from the current timer list
  25494. then they must have expired and should be processed before the lists
  25495. are switched. */
  25496. while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )
  25497. 8029dd4: 4e19 ldr r6, [pc, #100] ; (8029e3c <prvSwitchTimerLists+0x6c>)
  25498. listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );
  25499. vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
  25500. }
  25501. else
  25502. {
  25503. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY );
  25504. 8029dd6: f04f 0800 mov.w r8, #0
  25505. 8029dda: e023 b.n 8029e24 <prvSwitchTimerLists+0x54>
  25506. If there are any timers still referenced from the current timer list
  25507. then they must have expired and should be processed before the lists
  25508. are switched. */
  25509. while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )
  25510. {
  25511. xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );
  25512. 8029ddc: 68db ldr r3, [r3, #12]
  25513. /* Remove the timer from the list. */
  25514. pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList );
  25515. 8029dde: 68dc ldr r4, [r3, #12]
  25516. If there are any timers still referenced from the current timer list
  25517. then they must have expired and should be processed before the lists
  25518. are switched. */
  25519. while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )
  25520. {
  25521. xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );
  25522. 8029de0: 681d ldr r5, [r3, #0]
  25523. /* Remove the timer from the list. */
  25524. pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList );
  25525. ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
  25526. 8029de2: 1d27 adds r7, r4, #4
  25527. 8029de4: 4638 mov r0, r7
  25528. 8029de6: f7fe ff85 bl 8028cf4 <uxListRemove>
  25529. traceTIMER_EXPIRED( pxTimer );
  25530. /* Execute its callback, then send a command to restart the timer if
  25531. it is an auto-reload timer. It cannot be restarted here as the lists
  25532. have not yet been switched. */
  25533. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  25534. 8029dea: 6a63 ldr r3, [r4, #36] ; 0x24
  25535. 8029dec: 4620 mov r0, r4
  25536. 8029dee: 4798 blx r3
  25537. if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE )
  25538. 8029df0: 69e3 ldr r3, [r4, #28]
  25539. 8029df2: 2b01 cmp r3, #1
  25540. 8029df4: d116 bne.n 8029e24 <prvSwitchTimerLists+0x54>
  25541. the timer going into the same timer list then it has already expired
  25542. and the timer should be re-inserted into the current list so it is
  25543. processed again within this loop. Otherwise a command should be sent
  25544. to restart the timer to ensure it is only inserted into a list after
  25545. the lists have been swapped. */
  25546. xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks );
  25547. 8029df6: 69a3 ldr r3, [r4, #24]
  25548. 8029df8: 18eb adds r3, r5, r3
  25549. if( xReloadTime > xNextExpireTime )
  25550. 8029dfa: 42ab cmp r3, r5
  25551. 8029dfc: d906 bls.n 8029e0c <prvSwitchTimerLists+0x3c>
  25552. {
  25553. listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime );
  25554. 8029dfe: 6063 str r3, [r4, #4]
  25555. listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );
  25556. 8029e00: 6124 str r4, [r4, #16]
  25557. vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
  25558. 8029e02: 6830 ldr r0, [r6, #0]
  25559. 8029e04: 4639 mov r1, r7
  25560. 8029e06: f7fe ff5d bl 8028cc4 <vListInsert>
  25561. 8029e0a: e00b b.n 8029e24 <prvSwitchTimerLists+0x54>
  25562. }
  25563. else
  25564. {
  25565. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY );
  25566. 8029e0c: 2100 movs r1, #0
  25567. 8029e0e: f8cd 8000 str.w r8, [sp]
  25568. 8029e12: 4620 mov r0, r4
  25569. 8029e14: 462a mov r2, r5
  25570. 8029e16: 460b mov r3, r1
  25571. 8029e18: f7ff ffb8 bl 8029d8c <xTimerGenericCommand>
  25572. configASSERT( xResult );
  25573. 8029e1c: b910 cbnz r0, 8029e24 <prvSwitchTimerLists+0x54>
  25574. 8029e1e: f000 f90b bl 802a038 <ulPortSetInterruptMask>
  25575. 8029e22: e7fe b.n 8029e22 <prvSwitchTimerLists+0x52>
  25576. /* The tick count has overflowed. The timer lists must be switched.
  25577. If there are any timers still referenced from the current timer list
  25578. then they must have expired and should be processed before the lists
  25579. are switched. */
  25580. while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )
  25581. 8029e24: 6833 ldr r3, [r6, #0]
  25582. 8029e26: 681a ldr r2, [r3, #0]
  25583. 8029e28: 2a00 cmp r2, #0
  25584. 8029e2a: d1d7 bne.n 8029ddc <prvSwitchTimerLists+0xc>
  25585. mtCOVERAGE_TEST_MARKER();
  25586. }
  25587. }
  25588. pxTemp = pxCurrentTimerList;
  25589. pxCurrentTimerList = pxOverflowTimerList;
  25590. 8029e2c: 4a04 ldr r2, [pc, #16] ; (8029e40 <prvSwitchTimerLists+0x70>)
  25591. 8029e2e: 4803 ldr r0, [pc, #12] ; (8029e3c <prvSwitchTimerLists+0x6c>)
  25592. 8029e30: 6811 ldr r1, [r2, #0]
  25593. pxOverflowTimerList = pxTemp;
  25594. 8029e32: 6013 str r3, [r2, #0]
  25595. mtCOVERAGE_TEST_MARKER();
  25596. }
  25597. }
  25598. pxTemp = pxCurrentTimerList;
  25599. pxCurrentTimerList = pxOverflowTimerList;
  25600. 8029e34: 6001 str r1, [r0, #0]
  25601. pxOverflowTimerList = pxTemp;
  25602. }
  25603. 8029e36: e8bd 81fc ldmia.w sp!, {r2, r3, r4, r5, r6, r7, r8, pc}
  25604. 8029e3a: bf00 nop
  25605. 8029e3c: 200029e0 .word 0x200029e0
  25606. 8029e40: 20002a14 .word 0x20002a14
  25607. 08029e44 <prvTimerTask>:
  25608. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  25609. }
  25610. /*-----------------------------------------------------------*/
  25611. static void prvTimerTask( void *pvParameters )
  25612. {
  25613. 8029e44: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  25614. TickType_t xTimeNow;
  25615. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  25616. xTimeNow = xTaskGetTickCount();
  25617. if( xTimeNow < xLastTime )
  25618. 8029e48: f8df 816c ldr.w r8, [pc, #364] ; 8029fb8 <prvTimerTask+0x174>
  25619. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  25620. }
  25621. /*-----------------------------------------------------------*/
  25622. static void prvTimerTask( void *pvParameters )
  25623. {
  25624. 8029e4c: b087 sub sp, #28
  25625. 8029e4e: 46c1 mov r9, r8
  25626. the timer with the nearest expiry time will expire. If there are no
  25627. active timers then just set the next expire time to 0. That will cause
  25628. this task to unblock when the tick count overflows, at which point the
  25629. timer lists will be switched and the next expiry time can be
  25630. re-assessed. */
  25631. *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList );
  25632. 8029e50: 4b57 ldr r3, [pc, #348] ; (8029fb0 <prvTimerTask+0x16c>)
  25633. 8029e52: 681b ldr r3, [r3, #0]
  25634. 8029e54: 681f ldr r7, [r3, #0]
  25635. 8029e56: f1d7 0701 rsbs r7, r7, #1
  25636. 8029e5a: bf38 it cc
  25637. 8029e5c: 2700 movcc r7, #0
  25638. if( *pxListWasEmpty == pdFALSE )
  25639. 8029e5e: b917 cbnz r7, 8029e66 <prvTimerTask+0x22>
  25640. {
  25641. xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );
  25642. 8029e60: 68db ldr r3, [r3, #12]
  25643. 8029e62: 681d ldr r5, [r3, #0]
  25644. 8029e64: e000 b.n 8029e68 <prvTimerTask+0x24>
  25645. }
  25646. else
  25647. {
  25648. /* Ensure the task unblocks when the tick count rolls over. */
  25649. xNextExpireTime = ( TickType_t ) 0U;
  25650. 8029e66: 2500 movs r5, #0
  25651. static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, const BaseType_t xListWasEmpty )
  25652. {
  25653. TickType_t xTimeNow;
  25654. BaseType_t xTimerListsWereSwitched;
  25655. vTaskSuspendAll();
  25656. 8029e68: f7ff fbea bl 8029640 <vTaskSuspendAll>
  25657. static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched )
  25658. {
  25659. TickType_t xTimeNow;
  25660. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  25661. xTimeNow = xTaskGetTickCount();
  25662. 8029e6c: f7ff fbf0 bl 8029650 <xTaskGetTickCount>
  25663. if( xTimeNow < xLastTime )
  25664. 8029e70: f8d8 3000 ldr.w r3, [r8]
  25665. 8029e74: 4298 cmp r0, r3
  25666. static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched )
  25667. {
  25668. TickType_t xTimeNow;
  25669. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  25670. xTimeNow = xTaskGetTickCount();
  25671. 8029e76: 4606 mov r6, r0
  25672. if( xTimeNow < xLastTime )
  25673. 8029e78: d203 bcs.n 8029e82 <prvTimerTask+0x3e>
  25674. {
  25675. prvSwitchTimerLists();
  25676. 8029e7a: f7ff ffa9 bl 8029dd0 <prvSwitchTimerLists>
  25677. *pxTimerListsWereSwitched = pdTRUE;
  25678. 8029e7e: 2301 movs r3, #1
  25679. 8029e80: e000 b.n 8029e84 <prvTimerTask+0x40>
  25680. }
  25681. else
  25682. {
  25683. *pxTimerListsWereSwitched = pdFALSE;
  25684. 8029e82: 2300 movs r3, #0
  25685. }
  25686. xLastTime = xTimeNow;
  25687. 8029e84: f8c9 6000 str.w r6, [r9]
  25688. has expired or not. If obtaining the time causes the lists to switch
  25689. then don't process this timer as any timers that remained in the list
  25690. when the lists were switched will have been processed within the
  25691. prvSampleTimeNow() function. */
  25692. xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
  25693. if( xTimerListsWereSwitched == pdFALSE )
  25694. 8029e88: 2b00 cmp r3, #0
  25695. 8029e8a: d132 bne.n 8029ef2 <prvTimerTask+0xae>
  25696. {
  25697. /* The tick count has not overflowed, has the timer expired? */
  25698. if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) )
  25699. 8029e8c: bb2f cbnz r7, 8029eda <prvTimerTask+0x96>
  25700. 8029e8e: 42b5 cmp r5, r6
  25701. 8029e90: d823 bhi.n 8029eda <prvTimerTask+0x96>
  25702. {
  25703. ( void ) xTaskResumeAll();
  25704. 8029e92: f7ff fc71 bl 8029778 <xTaskResumeAll>
  25705. /*-----------------------------------------------------------*/
  25706. static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow )
  25707. {
  25708. BaseType_t xResult;
  25709. Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList );
  25710. 8029e96: 4b46 ldr r3, [pc, #280] ; (8029fb0 <prvTimerTask+0x16c>)
  25711. 8029e98: 681b ldr r3, [r3, #0]
  25712. 8029e9a: 68db ldr r3, [r3, #12]
  25713. 8029e9c: 68dc ldr r4, [r3, #12]
  25714. /* Remove the timer from the list of active timers. A check has already
  25715. been performed to ensure the list is not empty. */
  25716. ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
  25717. 8029e9e: 1d20 adds r0, r4, #4
  25718. 8029ea0: f7fe ff28 bl 8028cf4 <uxListRemove>
  25719. traceTIMER_EXPIRED( pxTimer );
  25720. /* If the timer is an auto reload timer then calculate the next
  25721. expiry time and re-insert the timer in the list of active timers. */
  25722. if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE )
  25723. 8029ea4: 69e3 ldr r3, [r4, #28]
  25724. 8029ea6: 2b01 cmp r3, #1
  25725. 8029ea8: d113 bne.n 8029ed2 <prvTimerTask+0x8e>
  25726. {
  25727. /* The timer is inserted into a list using a time relative to anything
  25728. other than the current time. It will therefore be inserted into the
  25729. correct list relative to the time this task thinks it is now. */
  25730. if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) == pdTRUE )
  25731. 8029eaa: 69a1 ldr r1, [r4, #24]
  25732. 8029eac: 4620 mov r0, r4
  25733. 8029eae: 1869 adds r1, r5, r1
  25734. 8029eb0: 4632 mov r2, r6
  25735. 8029eb2: 462b mov r3, r5
  25736. 8029eb4: f7ff ff0c bl 8029cd0 <prvInsertTimerInActiveList>
  25737. 8029eb8: 2801 cmp r0, #1
  25738. 8029eba: d10a bne.n 8029ed2 <prvTimerTask+0x8e>
  25739. {
  25740. /* The timer expired before it was added to the active timer
  25741. list. Reload it now. */
  25742. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY );
  25743. 8029ebc: 9700 str r7, [sp, #0]
  25744. 8029ebe: 4620 mov r0, r4
  25745. 8029ec0: 4639 mov r1, r7
  25746. 8029ec2: 462a mov r2, r5
  25747. 8029ec4: 463b mov r3, r7
  25748. 8029ec6: f7ff ff61 bl 8029d8c <xTimerGenericCommand>
  25749. configASSERT( xResult );
  25750. 8029eca: b910 cbnz r0, 8029ed2 <prvTimerTask+0x8e>
  25751. 8029ecc: f000 f8b4 bl 802a038 <ulPortSetInterruptMask>
  25752. 8029ed0: e7fe b.n 8029ed0 <prvTimerTask+0x8c>
  25753. {
  25754. mtCOVERAGE_TEST_MARKER();
  25755. }
  25756. /* Call the timer callback. */
  25757. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  25758. 8029ed2: 6a63 ldr r3, [r4, #36] ; 0x24
  25759. 8029ed4: 4620 mov r0, r4
  25760. 8029ed6: 4798 blx r3
  25761. 8029ed8: e05f b.n 8029f9a <prvTimerTask+0x156>
  25762. time has not been reached yet. This task should therefore
  25763. block to wait for the next expire time or a command to be
  25764. received - whichever comes first. The following line cannot
  25765. be reached unless xNextExpireTime > xTimeNow, except in the
  25766. case when the current timer list is empty. */
  25767. vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ) );
  25768. 8029eda: 4b36 ldr r3, [pc, #216] ; (8029fb4 <prvTimerTask+0x170>)
  25769. 8029edc: 1ba9 subs r1, r5, r6
  25770. 8029ede: 6818 ldr r0, [r3, #0]
  25771. 8029ee0: f7ff f9f6 bl 80292d0 <vQueueWaitForMessageRestricted>
  25772. if( xTaskResumeAll() == pdFALSE )
  25773. 8029ee4: f7ff fc48 bl 8029778 <xTaskResumeAll>
  25774. 8029ee8: 2800 cmp r0, #0
  25775. 8029eea: d156 bne.n 8029f9a <prvTimerTask+0x156>
  25776. {
  25777. /* Yield to wait for either a command to arrive, or the
  25778. block time to expire. If a command arrived between the
  25779. critical section being exited and this yield then the yield
  25780. will not cause the task to block. */
  25781. portYIELD_WITHIN_API();
  25782. 8029eec: f000 f898 bl 802a020 <vPortYield>
  25783. 8029ef0: e053 b.n 8029f9a <prvTimerTask+0x156>
  25784. }
  25785. }
  25786. }
  25787. else
  25788. {
  25789. ( void ) xTaskResumeAll();
  25790. 8029ef2: f7ff fc41 bl 8029778 <xTaskResumeAll>
  25791. 8029ef6: e050 b.n 8029f9a <prvTimerTask+0x156>
  25792. }
  25793. #endif /* INCLUDE_xTimerPendFunctionCall */
  25794. /* Commands that are positive are timer commands rather than pended
  25795. function calls. */
  25796. if( xMessage.xMessageID >= ( BaseType_t ) 0 )
  25797. 8029ef8: 9b03 ldr r3, [sp, #12]
  25798. 8029efa: 2b00 cmp r3, #0
  25799. 8029efc: db4e blt.n 8029f9c <prvTimerTask+0x158>
  25800. {
  25801. /* The messages uses the xTimerParameters member to work on a
  25802. software timer. */
  25803. pxTimer = xMessage.u.xTimerParameters.pxTimer;
  25804. 8029efe: 9c05 ldr r4, [sp, #20]
  25805. if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE )
  25806. 8029f00: 6963 ldr r3, [r4, #20]
  25807. 8029f02: b113 cbz r3, 8029f0a <prvTimerTask+0xc6>
  25808. {
  25809. /* The timer is in a list, remove it. */
  25810. ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
  25811. 8029f04: 1d20 adds r0, r4, #4
  25812. 8029f06: f7fe fef5 bl 8028cf4 <uxListRemove>
  25813. static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched )
  25814. {
  25815. TickType_t xTimeNow;
  25816. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  25817. xTimeNow = xTaskGetTickCount();
  25818. 8029f0a: f7ff fba1 bl 8029650 <xTaskGetTickCount>
  25819. if( xTimeNow < xLastTime )
  25820. 8029f0e: f8d8 3000 ldr.w r3, [r8]
  25821. 8029f12: 4298 cmp r0, r3
  25822. static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched )
  25823. {
  25824. TickType_t xTimeNow;
  25825. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  25826. xTimeNow = xTaskGetTickCount();
  25827. 8029f14: 4605 mov r5, r0
  25828. if( xTimeNow < xLastTime )
  25829. 8029f16: d201 bcs.n 8029f1c <prvTimerTask+0xd8>
  25830. {
  25831. prvSwitchTimerLists();
  25832. 8029f18: f7ff ff5a bl 8029dd0 <prvSwitchTimerLists>
  25833. possibility of a higher priority task adding a message to the message
  25834. queue with a time that is ahead of the timer daemon task (because it
  25835. pre-empted the timer daemon task after the xTimeNow value was set). */
  25836. xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
  25837. switch( xMessage.xMessageID )
  25838. 8029f1c: 9b03 ldr r3, [sp, #12]
  25839. else
  25840. {
  25841. *pxTimerListsWereSwitched = pdFALSE;
  25842. }
  25843. xLastTime = xTimeNow;
  25844. 8029f1e: f8c9 5000 str.w r5, [r9]
  25845. possibility of a higher priority task adding a message to the message
  25846. queue with a time that is ahead of the timer daemon task (because it
  25847. pre-empted the timer daemon task after the xTimeNow value was set). */
  25848. xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
  25849. switch( xMessage.xMessageID )
  25850. 8029f22: 2b09 cmp r3, #9
  25851. 8029f24: d83a bhi.n 8029f9c <prvTimerTask+0x158>
  25852. 8029f26: f04f 6204 mov.w r2, #138412032 ; 0x8400000
  25853. 8029f2a: 409a lsls r2, r3
  25854. 8029f2c: d424 bmi.n 8029f78 <prvTimerTask+0x134>
  25855. 8029f2e: f04f 4263 mov.w r2, #3808428032 ; 0xe3000000
  25856. 8029f32: 409a lsls r2, r3
  25857. 8029f34: d404 bmi.n 8029f40 <prvTimerTask+0xfc>
  25858. 8029f36: f04f 6280 mov.w r2, #67108864 ; 0x4000000
  25859. 8029f3a: 409a lsls r2, r3
  25860. 8029f3c: d429 bmi.n 8029f92 <prvTimerTask+0x14e>
  25861. 8029f3e: e02d b.n 8029f9c <prvTimerTask+0x158>
  25862. case tmrCOMMAND_START_FROM_ISR :
  25863. case tmrCOMMAND_RESET :
  25864. case tmrCOMMAND_RESET_FROM_ISR :
  25865. case tmrCOMMAND_START_DONT_TRACE :
  25866. /* Start or restart a timer. */
  25867. if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) == pdTRUE )
  25868. 8029f40: 9b04 ldr r3, [sp, #16]
  25869. 8029f42: 69a1 ldr r1, [r4, #24]
  25870. 8029f44: 4620 mov r0, r4
  25871. 8029f46: 1859 adds r1, r3, r1
  25872. 8029f48: 462a mov r2, r5
  25873. 8029f4a: f7ff fec1 bl 8029cd0 <prvInsertTimerInActiveList>
  25874. 8029f4e: 2801 cmp r0, #1
  25875. 8029f50: d124 bne.n 8029f9c <prvTimerTask+0x158>
  25876. {
  25877. /* The timer expired before it was added to the active
  25878. timer list. Process it now. */
  25879. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  25880. 8029f52: 6a63 ldr r3, [r4, #36] ; 0x24
  25881. 8029f54: 4620 mov r0, r4
  25882. 8029f56: 4798 blx r3
  25883. traceTIMER_EXPIRED( pxTimer );
  25884. if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE )
  25885. 8029f58: 69e3 ldr r3, [r4, #28]
  25886. 8029f5a: 2b01 cmp r3, #1
  25887. 8029f5c: d11e bne.n 8029f9c <prvTimerTask+0x158>
  25888. {
  25889. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY );
  25890. 8029f5e: 69a2 ldr r2, [r4, #24]
  25891. 8029f60: 9b04 ldr r3, [sp, #16]
  25892. 8029f62: 2100 movs r1, #0
  25893. 8029f64: 18d2 adds r2, r2, r3
  25894. 8029f66: 9100 str r1, [sp, #0]
  25895. 8029f68: 4620 mov r0, r4
  25896. 8029f6a: 460b mov r3, r1
  25897. 8029f6c: f7ff ff0e bl 8029d8c <xTimerGenericCommand>
  25898. configASSERT( xResult );
  25899. 8029f70: b9a0 cbnz r0, 8029f9c <prvTimerTask+0x158>
  25900. 8029f72: f000 f861 bl 802a038 <ulPortSetInterruptMask>
  25901. 8029f76: e7fe b.n 8029f76 <prvTimerTask+0x132>
  25902. There is nothing to do here. */
  25903. break;
  25904. case tmrCOMMAND_CHANGE_PERIOD :
  25905. case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR :
  25906. pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue;
  25907. 8029f78: 9904 ldr r1, [sp, #16]
  25908. 8029f7a: 61a1 str r1, [r4, #24]
  25909. configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) );
  25910. 8029f7c: b911 cbnz r1, 8029f84 <prvTimerTask+0x140>
  25911. 8029f7e: f000 f85b bl 802a038 <ulPortSetInterruptMask>
  25912. 8029f82: e7fe b.n 8029f82 <prvTimerTask+0x13e>
  25913. longer or shorter than the old one. The command time is
  25914. therefore set to the current time, and as the period cannot be
  25915. zero the next expiry time can only be in the future, meaning
  25916. (unlike for the xTimerStart() case above) there is no fail case
  25917. that needs to be handled here. */
  25918. ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow );
  25919. 8029f84: 4620 mov r0, r4
  25920. 8029f86: 1869 adds r1, r5, r1
  25921. 8029f88: 462a mov r2, r5
  25922. 8029f8a: 462b mov r3, r5
  25923. 8029f8c: f7ff fea0 bl 8029cd0 <prvInsertTimerInActiveList>
  25924. 8029f90: e004 b.n 8029f9c <prvTimerTask+0x158>
  25925. break;
  25926. case tmrCOMMAND_DELETE :
  25927. /* The timer has already been removed from the active list,
  25928. just free up the memory. */
  25929. vPortFree( pxTimer );
  25930. 8029f92: 4620 mov r0, r4
  25931. 8029f94: f000 f9ec bl 802a370 <vPortFree>
  25932. 8029f98: e000 b.n 8029f9c <prvTimerTask+0x158>
  25933. DaemonTaskMessage_t xMessage;
  25934. Timer_t *pxTimer;
  25935. BaseType_t xTimerListsWereSwitched, xResult;
  25936. TickType_t xTimeNow;
  25937. 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. */
  25938. 8029f9a: 4e06 ldr r6, [pc, #24] ; (8029fb4 <prvTimerTask+0x170>)
  25939. 8029f9c: 2200 movs r2, #0
  25940. 8029f9e: 6830 ldr r0, [r6, #0]
  25941. 8029fa0: a903 add r1, sp, #12
  25942. 8029fa2: 4613 mov r3, r2
  25943. 8029fa4: f7ff f8e2 bl 802916c <xQueueGenericReceive>
  25944. 8029fa8: 2800 cmp r0, #0
  25945. 8029faa: d1a5 bne.n 8029ef8 <prvTimerTask+0xb4>
  25946. 8029fac: e750 b.n 8029e50 <prvTimerTask+0xc>
  25947. 8029fae: bf00 nop
  25948. 8029fb0: 200029e0 .word 0x200029e0
  25949. 8029fb4: 20002a10 .word 0x20002a10
  25950. 8029fb8: 20002a0c .word 0x20002a0c
  25951. 08029fbc <pvTimerGetTimerID>:
  25952. void *pvTimerGetTimerID( const TimerHandle_t xTimer )
  25953. {
  25954. Timer_t * const pxTimer = ( Timer_t * ) xTimer;
  25955. return pxTimer->pvTimerID;
  25956. }
  25957. 8029fbc: 6a00 ldr r0, [r0, #32]
  25958. 8029fbe: 4770 bx lr
  25959. 08029fc0 <prvPortStartFirstTask>:
  25960. }
  25961. /*-----------------------------------------------------------*/
  25962. static void prvPortStartFirstTask( void )
  25963. {
  25964. __asm volatile(
  25965. 8029fc0: 4806 ldr r0, [pc, #24] ; (8029fdc <prvPortStartFirstTask+0x1c>)
  25966. 8029fc2: 6800 ldr r0, [r0, #0]
  25967. 8029fc4: 6800 ldr r0, [r0, #0]
  25968. 8029fc6: f380 8808 msr MSP, r0
  25969. 8029fca: b662 cpsie i
  25970. 8029fcc: b661 cpsie f
  25971. 8029fce: f3bf 8f4f dsb sy
  25972. 8029fd2: f3bf 8f6f isb sy
  25973. 8029fd6: df00 svc 0
  25974. 8029fd8: bf00 nop
  25975. 8029fda: 0000 .short 0x0000
  25976. 8029fdc: e000ed08 .word 0xe000ed08
  25977. 08029fe0 <pxPortInitialiseStack>:
  25978. StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
  25979. {
  25980. /* Simulate the stack frame as it would be created by a context switch
  25981. interrupt. */
  25982. pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
  25983. *pxTopOfStack = portINITIAL_XPSR; /* xPSR */
  25984. 8029fe0: f04f 7380 mov.w r3, #16777216 ; 0x1000000
  25985. pxTopOfStack--;
  25986. *pxTopOfStack = ( StackType_t ) pxCode; /* PC */
  25987. 8029fe4: e900 000a stmdb r0, {r1, r3}
  25988. pxTopOfStack--;
  25989. *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */
  25990. 8029fe8: 4b03 ldr r3, [pc, #12] ; (8029ff8 <pxPortInitialiseStack+0x18>)
  25991. pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
  25992. *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
  25993. 8029fea: f840 2c20 str.w r2, [r0, #-32]
  25994. pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
  25995. *pxTopOfStack = portINITIAL_XPSR; /* xPSR */
  25996. pxTopOfStack--;
  25997. *pxTopOfStack = ( StackType_t ) pxCode; /* PC */
  25998. pxTopOfStack--;
  25999. *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */
  26000. 8029fee: f840 3c0c str.w r3, [r0, #-12]
  26001. pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
  26002. *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
  26003. pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */
  26004. return pxTopOfStack;
  26005. }
  26006. 8029ff2: 3840 subs r0, #64 ; 0x40
  26007. 8029ff4: 4770 bx lr
  26008. 8029ff6: bf00 nop
  26009. 8029ff8: 0802a07d .word 0x0802a07d
  26010. 08029ffc <SVC_Handler>:
  26011. }
  26012. /*-----------------------------------------------------------*/
  26013. void vPortSVCHandler( void )
  26014. {
  26015. __asm volatile (
  26016. 8029ffc: 4b07 ldr r3, [pc, #28] ; (802a01c <pxCurrentTCBConst2>)
  26017. 8029ffe: 6819 ldr r1, [r3, #0]
  26018. 802a000: 6808 ldr r0, [r1, #0]
  26019. 802a002: e8b0 0ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp}
  26020. 802a006: f380 8809 msr PSP, r0
  26021. 802a00a: f3bf 8f6f isb sy
  26022. 802a00e: f04f 0000 mov.w r0, #0
  26023. 802a012: f380 8811 msr BASEPRI, r0
  26024. 802a016: f04e 0e0d orr.w lr, lr, #13
  26025. 802a01a: 4770 bx lr
  26026. 0802a01c <pxCurrentTCBConst2>:
  26027. 802a01c: 20002998 .word 0x20002998
  26028. 0802a020 <vPortYield>:
  26029. /*-----------------------------------------------------------*/
  26030. void vPortYield( void )
  26031. {
  26032. /* Set a PendSV to request a context switch. */
  26033. portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
  26034. 802a020: 4b04 ldr r3, [pc, #16] ; (802a034 <vPortYield+0x14>)
  26035. 802a022: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  26036. 802a026: 601a str r2, [r3, #0]
  26037. /* Barriers are normally not required but do ensure the code is completely
  26038. within the specified behaviour for the architecture. */
  26039. __asm volatile( "dsb" );
  26040. 802a028: f3bf 8f4f dsb sy
  26041. __asm volatile( "isb" );
  26042. 802a02c: f3bf 8f6f isb sy
  26043. 802a030: 4770 bx lr
  26044. 802a032: bf00 nop
  26045. 802a034: e000ed04 .word 0xe000ed04
  26046. 0802a038 <ulPortSetInterruptMask>:
  26047. }
  26048. /*-----------------------------------------------------------*/
  26049. __attribute__(( naked )) uint32_t ulPortSetInterruptMask( void )
  26050. {
  26051. __asm volatile \
  26052. 802a038: f3ef 8011 mrs r0, BASEPRI
  26053. 802a03c: f04f 0150 mov.w r1, #80 ; 0x50
  26054. 802a040: f381 8811 msr BASEPRI, r1
  26055. 802a044: 4770 bx lr
  26056. );
  26057. /* This return will not be reached but is necessary to prevent compiler
  26058. warnings. */
  26059. return 0;
  26060. }
  26061. 802a046: 2000 movs r0, #0
  26062. 0802a048 <vPortEnterCritical>:
  26063. __asm volatile( "isb" );
  26064. }
  26065. /*-----------------------------------------------------------*/
  26066. void vPortEnterCritical( void )
  26067. {
  26068. 802a048: b508 push {r3, lr}
  26069. portDISABLE_INTERRUPTS();
  26070. 802a04a: f7ff fff5 bl 802a038 <ulPortSetInterruptMask>
  26071. uxCriticalNesting++;
  26072. 802a04e: 4a09 ldr r2, [pc, #36] ; (802a074 <vPortEnterCritical+0x2c>)
  26073. 802a050: 6813 ldr r3, [r2, #0]
  26074. 802a052: 3301 adds r3, #1
  26075. 802a054: 6013 str r3, [r2, #0]
  26076. __asm volatile( "dsb" );
  26077. 802a056: f3bf 8f4f dsb sy
  26078. __asm volatile( "isb" );
  26079. 802a05a: f3bf 8f6f isb sy
  26080. /* This is not the interrupt safe version of the enter critical function so
  26081. assert() if it is being called from an interrupt context. Only API
  26082. functions that end in "FromISR" can be used in an interrupt. Only assert if
  26083. the critical nesting count is 1 to protect against recursive calls if the
  26084. assert function also uses a critical section. */
  26085. if( uxCriticalNesting == 1 )
  26086. 802a05e: 2b01 cmp r3, #1
  26087. 802a060: d107 bne.n 802a072 <vPortEnterCritical+0x2a>
  26088. {
  26089. configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
  26090. 802a062: 4b05 ldr r3, [pc, #20] ; (802a078 <vPortEnterCritical+0x30>)
  26091. 802a064: 681b ldr r3, [r3, #0]
  26092. 802a066: f013 0fff tst.w r3, #255 ; 0xff
  26093. 802a06a: d002 beq.n 802a072 <vPortEnterCritical+0x2a>
  26094. 802a06c: f7ff ffe4 bl 802a038 <ulPortSetInterruptMask>
  26095. 802a070: e7fe b.n 802a070 <vPortEnterCritical+0x28>
  26096. 802a072: bd08 pop {r3, pc}
  26097. 802a074: 200015dc .word 0x200015dc
  26098. 802a078: e000ed04 .word 0xe000ed04
  26099. 0802a07c <prvTaskExitError>:
  26100. return pxTopOfStack;
  26101. }
  26102. /*-----------------------------------------------------------*/
  26103. static void prvTaskExitError( void )
  26104. {
  26105. 802a07c: b508 push {r3, lr}
  26106. its caller as there is nothing to return to. If a task wants to exit it
  26107. should instead call vTaskDelete( NULL ).
  26108. Artificially force an assert() to be triggered if configASSERT() is
  26109. defined, then stop here so application writers can catch the error. */
  26110. configASSERT( uxCriticalNesting == ~0UL );
  26111. 802a07e: 4b05 ldr r3, [pc, #20] ; (802a094 <prvTaskExitError+0x18>)
  26112. 802a080: 681b ldr r3, [r3, #0]
  26113. 802a082: 3301 adds r3, #1
  26114. 802a084: d002 beq.n 802a08c <prvTaskExitError+0x10>
  26115. 802a086: f7ff ffd7 bl 802a038 <ulPortSetInterruptMask>
  26116. 802a08a: e7fe b.n 802a08a <prvTaskExitError+0xe>
  26117. portDISABLE_INTERRUPTS();
  26118. 802a08c: f7ff ffd4 bl 802a038 <ulPortSetInterruptMask>
  26119. 802a090: e7fe b.n 802a090 <prvTaskExitError+0x14>
  26120. 802a092: bf00 nop
  26121. 802a094: 200015dc .word 0x200015dc
  26122. 0802a098 <vPortClearInterruptMask>:
  26123. }
  26124. /*-----------------------------------------------------------*/
  26125. __attribute__(( naked )) void vPortClearInterruptMask( uint32_t ulNewMaskValue )
  26126. {
  26127. __asm volatile \
  26128. 802a098: f380 8811 msr BASEPRI, r0
  26129. 802a09c: 4770 bx lr
  26130. 802a09e: 0000 movs r0, r0
  26131. 0802a0a0 <vPortExitCritical>:
  26132. }
  26133. }
  26134. /*-----------------------------------------------------------*/
  26135. void vPortExitCritical( void )
  26136. {
  26137. 802a0a0: b508 push {r3, lr}
  26138. configASSERT( uxCriticalNesting );
  26139. 802a0a2: 4b07 ldr r3, [pc, #28] ; (802a0c0 <vPortExitCritical+0x20>)
  26140. 802a0a4: 6818 ldr r0, [r3, #0]
  26141. 802a0a6: b910 cbnz r0, 802a0ae <vPortExitCritical+0xe>
  26142. 802a0a8: f7ff ffc6 bl 802a038 <ulPortSetInterruptMask>
  26143. 802a0ac: e7fe b.n 802a0ac <vPortExitCritical+0xc>
  26144. uxCriticalNesting--;
  26145. 802a0ae: 3801 subs r0, #1
  26146. 802a0b0: 6018 str r0, [r3, #0]
  26147. if( uxCriticalNesting == 0 )
  26148. 802a0b2: b918 cbnz r0, 802a0bc <vPortExitCritical+0x1c>
  26149. {
  26150. portENABLE_INTERRUPTS();
  26151. }
  26152. }
  26153. 802a0b4: e8bd 4008 ldmia.w sp!, {r3, lr}
  26154. {
  26155. configASSERT( uxCriticalNesting );
  26156. uxCriticalNesting--;
  26157. if( uxCriticalNesting == 0 )
  26158. {
  26159. portENABLE_INTERRUPTS();
  26160. 802a0b8: f7ff bfee b.w 802a098 <vPortClearInterruptMask>
  26161. 802a0bc: bd08 pop {r3, pc}
  26162. 802a0be: bf00 nop
  26163. 802a0c0: 200015dc .word 0x200015dc
  26164. 0802a0c4 <PendSV_Handler>:
  26165. void xPortPendSVHandler( void )
  26166. {
  26167. /* This is a naked function. */
  26168. __asm volatile
  26169. 802a0c4: f3ef 8009 mrs r0, PSP
  26170. 802a0c8: f3bf 8f6f isb sy
  26171. 802a0cc: 4b0d ldr r3, [pc, #52] ; (802a104 <pxCurrentTCBConst>)
  26172. 802a0ce: 681a ldr r2, [r3, #0]
  26173. 802a0d0: e920 0ff0 stmdb r0!, {r4, r5, r6, r7, r8, r9, sl, fp}
  26174. 802a0d4: 6010 str r0, [r2, #0]
  26175. 802a0d6: e92d 4008 stmdb sp!, {r3, lr}
  26176. 802a0da: f04f 0050 mov.w r0, #80 ; 0x50
  26177. 802a0de: f380 8811 msr BASEPRI, r0
  26178. 802a0e2: f7ff fc19 bl 8029918 <vTaskSwitchContext>
  26179. 802a0e6: f04f 0000 mov.w r0, #0
  26180. 802a0ea: f380 8811 msr BASEPRI, r0
  26181. 802a0ee: e8bd 4008 ldmia.w sp!, {r3, lr}
  26182. 802a0f2: 6819 ldr r1, [r3, #0]
  26183. 802a0f4: 6808 ldr r0, [r1, #0]
  26184. 802a0f6: e8b0 0ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp}
  26185. 802a0fa: f380 8809 msr PSP, r0
  26186. 802a0fe: f3bf 8f6f isb sy
  26187. 802a102: 4770 bx lr
  26188. 0802a104 <pxCurrentTCBConst>:
  26189. 802a104: 20002998 .word 0x20002998
  26190. 0802a108 <SysTick_Handler>:
  26191. );
  26192. }
  26193. /*-----------------------------------------------------------*/
  26194. void xPortSysTickHandler( void )
  26195. {
  26196. 802a108: b508 push {r3, lr}
  26197. /* The SysTick runs at the lowest interrupt priority, so when this interrupt
  26198. executes all interrupts must be unmasked. There is therefore no need to
  26199. save and then restore the interrupt mask value as its value is already
  26200. known. */
  26201. ( void ) portSET_INTERRUPT_MASK_FROM_ISR();
  26202. 802a10a: f7ff ff95 bl 802a038 <ulPortSetInterruptMask>
  26203. {
  26204. /* Increment the RTOS tick. */
  26205. if( xTaskIncrementTick() != pdFALSE )
  26206. 802a10e: f7ff faa5 bl 802965c <xTaskIncrementTick>
  26207. 802a112: b118 cbz r0, 802a11c <SysTick_Handler+0x14>
  26208. {
  26209. /* A context switch is required. Context switching is performed in
  26210. the PendSV interrupt. Pend the PendSV interrupt. */
  26211. portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
  26212. 802a114: 4b04 ldr r3, [pc, #16] ; (802a128 <SysTick_Handler+0x20>)
  26213. 802a116: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  26214. 802a11a: 601a str r2, [r3, #0]
  26215. }
  26216. }
  26217. portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );
  26218. 802a11c: 2000 movs r0, #0
  26219. }
  26220. 802a11e: e8bd 4008 ldmia.w sp!, {r3, lr}
  26221. /* A context switch is required. Context switching is performed in
  26222. the PendSV interrupt. Pend the PendSV interrupt. */
  26223. portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
  26224. }
  26225. }
  26226. portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );
  26227. 802a122: f7ff bfb9 b.w 802a098 <vPortClearInterruptMask>
  26228. 802a126: bf00 nop
  26229. 802a128: e000ed04 .word 0xe000ed04
  26230. 0802a12c <vPortSetupTimerInterrupt>:
  26231. ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
  26232. }
  26233. #endif /* configUSE_TICKLESS_IDLE */
  26234. /* Configure SysTick to interrupt at the requested rate. */
  26235. portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
  26236. 802a12c: 4b06 ldr r3, [pc, #24] ; (802a148 <vPortSetupTimerInterrupt+0x1c>)
  26237. 802a12e: 681a ldr r2, [r3, #0]
  26238. 802a130: f44f 737a mov.w r3, #1000 ; 0x3e8
  26239. 802a134: fbb2 f2f3 udiv r2, r2, r3
  26240. 802a138: 4b04 ldr r3, [pc, #16] ; (802a14c <vPortSetupTimerInterrupt+0x20>)
  26241. 802a13a: 3a01 subs r2, #1
  26242. 802a13c: 601a str r2, [r3, #0]
  26243. portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
  26244. 802a13e: 2207 movs r2, #7
  26245. 802a140: f843 2c04 str.w r2, [r3, #-4]
  26246. 802a144: 4770 bx lr
  26247. 802a146: bf00 nop
  26248. 802a148: 200005bc .word 0x200005bc
  26249. 802a14c: e000e014 .word 0xe000e014
  26250. 0802a150 <xPortStartScheduler>:
  26251. /*
  26252. * See header file for description.
  26253. */
  26254. BaseType_t xPortStartScheduler( void )
  26255. {
  26256. 802a150: b507 push {r0, r1, r2, lr}
  26257. functions can be called. ISR safe functions are those that end in
  26258. "FromISR". FreeRTOS maintains separate thread and ISR API functions to
  26259. ensure interrupt entry is as fast and simple as possible.
  26260. Save the interrupt priority value that is about to be clobbered. */
  26261. ulOriginalPriority = *pucFirstUserPriorityRegister;
  26262. 802a152: 4b1d ldr r3, [pc, #116] ; (802a1c8 <xPortStartScheduler+0x78>)
  26263. 802a154: 781a ldrb r2, [r3, #0]
  26264. 802a156: 9201 str r2, [sp, #4]
  26265. /* Determine the number of priority bits available. First write to all
  26266. possible bits. */
  26267. *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
  26268. 802a158: 22ff movs r2, #255 ; 0xff
  26269. 802a15a: 701a strb r2, [r3, #0]
  26270. /* Read the value back to see how many bits stuck. */
  26271. ucMaxPriorityValue = *pucFirstUserPriorityRegister;
  26272. 802a15c: 781b ldrb r3, [r3, #0]
  26273. 802a15e: f88d 3003 strb.w r3, [sp, #3]
  26274. /* Use the same mask on the maximum system call priority. */
  26275. ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
  26276. 802a162: f89d 2003 ldrb.w r2, [sp, #3]
  26277. 802a166: 4b19 ldr r3, [pc, #100] ; (802a1cc <xPortStartScheduler+0x7c>)
  26278. 802a168: f002 0250 and.w r2, r2, #80 ; 0x50
  26279. 802a16c: 701a strb r2, [r3, #0]
  26280. /* Calculate the maximum acceptable priority group value for the number
  26281. of bits read back. */
  26282. ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
  26283. 802a16e: 4a18 ldr r2, [pc, #96] ; (802a1d0 <xPortStartScheduler+0x80>)
  26284. 802a170: 2307 movs r3, #7
  26285. 802a172: 6013 str r3, [r2, #0]
  26286. while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
  26287. 802a174: e005 b.n 802a182 <xPortStartScheduler+0x32>
  26288. {
  26289. ulMaxPRIGROUPValue--;
  26290. ucMaxPriorityValue <<= ( uint8_t ) 0x01;
  26291. 802a176: f89d 3003 ldrb.w r3, [sp, #3]
  26292. 802a17a: 005b lsls r3, r3, #1
  26293. 802a17c: f88d 3003 strb.w r3, [sp, #3]
  26294. 802a180: 460b mov r3, r1
  26295. ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
  26296. /* Calculate the maximum acceptable priority group value for the number
  26297. of bits read back. */
  26298. ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
  26299. while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
  26300. 802a182: f89d 2003 ldrb.w r2, [sp, #3]
  26301. 802a186: 1e59 subs r1, r3, #1
  26302. 802a188: 0612 lsls r2, r2, #24
  26303. 802a18a: d4f4 bmi.n 802a176 <xPortStartScheduler+0x26>
  26304. }
  26305. /* Shift the priority group value back to its position within the AIRCR
  26306. register. */
  26307. ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
  26308. ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
  26309. 802a18c: 4a10 ldr r2, [pc, #64] ; (802a1d0 <xPortStartScheduler+0x80>)
  26310. ucMaxPriorityValue <<= ( uint8_t ) 0x01;
  26311. }
  26312. /* Shift the priority group value back to its position within the AIRCR
  26313. register. */
  26314. ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
  26315. 802a18e: 021b lsls r3, r3, #8
  26316. ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
  26317. 802a190: f403 63e0 and.w r3, r3, #1792 ; 0x700
  26318. 802a194: 6013 str r3, [r2, #0]
  26319. /* Restore the clobbered interrupt priority register to its original
  26320. value. */
  26321. *pucFirstUserPriorityRegister = ulOriginalPriority;
  26322. 802a196: 4b0c ldr r3, [pc, #48] ; (802a1c8 <xPortStartScheduler+0x78>)
  26323. 802a198: 9a01 ldr r2, [sp, #4]
  26324. 802a19a: 701a strb r2, [r3, #0]
  26325. }
  26326. #endif /* conifgASSERT_DEFINED */
  26327. /* Make PendSV and SysTick the lowest priority interrupts. */
  26328. portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
  26329. 802a19c: f8d3 2920 ldr.w r2, [r3, #2336] ; 0x920
  26330. 802a1a0: f442 0270 orr.w r2, r2, #15728640 ; 0xf00000
  26331. 802a1a4: f8c3 2920 str.w r2, [r3, #2336] ; 0x920
  26332. portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
  26333. 802a1a8: f8d3 2920 ldr.w r2, [r3, #2336] ; 0x920
  26334. 802a1ac: f042 4270 orr.w r2, r2, #4026531840 ; 0xf0000000
  26335. 802a1b0: f8c3 2920 str.w r2, [r3, #2336] ; 0x920
  26336. /* Start the timer that generates the tick ISR. Interrupts are disabled
  26337. here already. */
  26338. vPortSetupTimerInterrupt();
  26339. 802a1b4: f7ff ffba bl 802a12c <vPortSetupTimerInterrupt>
  26340. /* Initialise the critical nesting count ready for the first task. */
  26341. uxCriticalNesting = 0;
  26342. 802a1b8: 4b06 ldr r3, [pc, #24] ; (802a1d4 <xPortStartScheduler+0x84>)
  26343. 802a1ba: 2200 movs r2, #0
  26344. 802a1bc: 601a str r2, [r3, #0]
  26345. /* Start the first task. */
  26346. prvPortStartFirstTask();
  26347. 802a1be: f7ff feff bl 8029fc0 <prvPortStartFirstTask>
  26348. /* Should never get here as the tasks will now be executing! Call the task
  26349. exit error function to prevent compiler warnings about a static function
  26350. not being called in the case that the application writer overrides this
  26351. functionality by defining configTASK_RETURN_ADDRESS. */
  26352. prvTaskExitError();
  26353. 802a1c2: f7ff ff5b bl 802a07c <prvTaskExitError>
  26354. 802a1c6: bf00 nop
  26355. 802a1c8: e000e400 .word 0xe000e400
  26356. 802a1cc: 20002a18 .word 0x20002a18
  26357. 802a1d0: 20002a1c .word 0x20002a1c
  26358. 802a1d4: 200015dc .word 0x200015dc
  26359. 0802a1d8 <vPortValidateInterruptPriority>:
  26360. /*-----------------------------------------------------------*/
  26361. #if( configASSERT_DEFINED == 1 )
  26362. void vPortValidateInterruptPriority( void )
  26363. {
  26364. 802a1d8: b508 push {r3, lr}
  26365. uint32_t ulCurrentInterrupt;
  26366. uint8_t ucCurrentPriority;
  26367. /* Obtain the number of the currently executing interrupt. */
  26368. __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) );
  26369. 802a1da: f3ef 8305 mrs r3, IPSR
  26370. /* Is the interrupt number a user defined interrupt? */
  26371. if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
  26372. 802a1de: 2b0f cmp r3, #15
  26373. 802a1e0: d908 bls.n 802a1f4 <vPortValidateInterruptPriority+0x1c>
  26374. {
  26375. /* Look up the interrupt's priority. */
  26376. ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
  26377. 802a1e2: 4a0a ldr r2, [pc, #40] ; (802a20c <vPortValidateInterruptPriority+0x34>)
  26378. 802a1e4: 5c9b ldrb r3, [r3, r2]
  26379. interrupt entry is as fast and simple as possible.
  26380. The following links provide detailed information:
  26381. http://www.freertos.org/RTOS-Cortex-M3-M4.html
  26382. http://www.freertos.org/FAQHelp.html */
  26383. configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
  26384. 802a1e6: 4a0a ldr r2, [pc, #40] ; (802a210 <vPortValidateInterruptPriority+0x38>)
  26385. 802a1e8: 7812 ldrb r2, [r2, #0]
  26386. 802a1ea: 429a cmp r2, r3
  26387. 802a1ec: d902 bls.n 802a1f4 <vPortValidateInterruptPriority+0x1c>
  26388. 802a1ee: f7ff ff23 bl 802a038 <ulPortSetInterruptMask>
  26389. 802a1f2: e7fe b.n 802a1f2 <vPortValidateInterruptPriority+0x1a>
  26390. configuration then the correct setting can be achieved on all Cortex-M
  26391. devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
  26392. scheduler. Note however that some vendor specific peripheral libraries
  26393. assume a non-zero priority group setting, in which cases using a value
  26394. of zero will result in unpredicable behaviour. */
  26395. configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
  26396. 802a1f4: 4b07 ldr r3, [pc, #28] ; (802a214 <vPortValidateInterruptPriority+0x3c>)
  26397. 802a1f6: 681a ldr r2, [r3, #0]
  26398. 802a1f8: 4b07 ldr r3, [pc, #28] ; (802a218 <vPortValidateInterruptPriority+0x40>)
  26399. 802a1fa: 681b ldr r3, [r3, #0]
  26400. 802a1fc: f402 62e0 and.w r2, r2, #1792 ; 0x700
  26401. 802a200: 429a cmp r2, r3
  26402. 802a202: d902 bls.n 802a20a <vPortValidateInterruptPriority+0x32>
  26403. 802a204: f7ff ff18 bl 802a038 <ulPortSetInterruptMask>
  26404. 802a208: e7fe b.n 802a208 <vPortValidateInterruptPriority+0x30>
  26405. 802a20a: bd08 pop {r3, pc}
  26406. 802a20c: e000e3f0 .word 0xe000e3f0
  26407. 802a210: 20002a18 .word 0x20002a18
  26408. 802a214: e000ed0c .word 0xe000ed0c
  26409. 802a218: 20002a1c .word 0x20002a1c
  26410. 0802a21c <prvInsertBlockIntoFreeList>:
  26411. xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 );
  26412. }
  26413. /*-----------------------------------------------------------*/
  26414. static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert )
  26415. {
  26416. 802a21c: b510 push {r4, lr}
  26417. BlockLink_t *pxIterator;
  26418. uint8_t *puc;
  26419. /* Iterate through the list until a block is found that has a higher address
  26420. than the block being inserted. */
  26421. for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
  26422. 802a21e: 4b0f ldr r3, [pc, #60] ; (802a25c <prvInsertBlockIntoFreeList+0x40>)
  26423. 802a220: e000 b.n 802a224 <prvInsertBlockIntoFreeList+0x8>
  26424. 802a222: 4613 mov r3, r2
  26425. 802a224: 681a ldr r2, [r3, #0]
  26426. 802a226: 4282 cmp r2, r0
  26427. 802a228: d3fb bcc.n 802a222 <prvInsertBlockIntoFreeList+0x6>
  26428. }
  26429. /* Do the block being inserted, and the block it is being inserted after
  26430. make a contiguous block of memory? */
  26431. puc = ( uint8_t * ) pxIterator;
  26432. if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
  26433. 802a22a: 6859 ldr r1, [r3, #4]
  26434. 802a22c: 185c adds r4, r3, r1
  26435. 802a22e: 4284 cmp r4, r0
  26436. 802a230: d103 bne.n 802a23a <prvInsertBlockIntoFreeList+0x1e>
  26437. {
  26438. pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
  26439. 802a232: 6840 ldr r0, [r0, #4]
  26440. 802a234: 1841 adds r1, r0, r1
  26441. 802a236: 6059 str r1, [r3, #4]
  26442. 802a238: 4618 mov r0, r3
  26443. }
  26444. /* Do the block being inserted, and the block it is being inserted before
  26445. make a contiguous block of memory? */
  26446. puc = ( uint8_t * ) pxBlockToInsert;
  26447. if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
  26448. 802a23a: 6841 ldr r1, [r0, #4]
  26449. 802a23c: 1844 adds r4, r0, r1
  26450. 802a23e: 4294 cmp r4, r2
  26451. 802a240: d106 bne.n 802a250 <prvInsertBlockIntoFreeList+0x34>
  26452. {
  26453. if( pxIterator->pxNextFreeBlock != pxEnd )
  26454. 802a242: 4c07 ldr r4, [pc, #28] ; (802a260 <prvInsertBlockIntoFreeList+0x44>)
  26455. 802a244: 6824 ldr r4, [r4, #0]
  26456. 802a246: 42a2 cmp r2, r4
  26457. 802a248: d002 beq.n 802a250 <prvInsertBlockIntoFreeList+0x34>
  26458. {
  26459. /* Form one big block from the two blocks. */
  26460. pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
  26461. pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
  26462. 802a24a: ca14 ldmia r2, {r2, r4}
  26463. if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
  26464. {
  26465. if( pxIterator->pxNextFreeBlock != pxEnd )
  26466. {
  26467. /* Form one big block from the two blocks. */
  26468. pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
  26469. 802a24c: 1861 adds r1, r4, r1
  26470. 802a24e: 6041 str r1, [r0, #4]
  26471. /* If the block being inserted plugged a gab, so was merged with the block
  26472. before and the block after, then it's pxNextFreeBlock pointer will have
  26473. already been set, and should not be set here as that would make it point
  26474. to itself. */
  26475. if( pxIterator != pxBlockToInsert )
  26476. 802a250: 4283 cmp r3, r0
  26477. pxBlockToInsert->pxNextFreeBlock = pxEnd;
  26478. }
  26479. }
  26480. else
  26481. {
  26482. pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
  26483. 802a252: 6002 str r2, [r0, #0]
  26484. before and the block after, then it's pxNextFreeBlock pointer will have
  26485. already been set, and should not be set here as that would make it point
  26486. to itself. */
  26487. if( pxIterator != pxBlockToInsert )
  26488. {
  26489. pxIterator->pxNextFreeBlock = pxBlockToInsert;
  26490. 802a254: bf18 it ne
  26491. 802a256: 6018 strne r0, [r3, #0]
  26492. 802a258: bd10 pop {r4, pc}
  26493. 802a25a: bf00 nop
  26494. 802a25c: 20002a28 .word 0x20002a28
  26495. 802a260: 20002a24 .word 0x20002a24
  26496. 0802a264 <pvPortMalloc>:
  26497. static size_t xBlockAllocatedBit = 0;
  26498. /*-----------------------------------------------------------*/
  26499. void *pvPortMalloc( size_t xWantedSize )
  26500. {
  26501. 802a264: b5f8 push {r3, r4, r5, r6, r7, lr}
  26502. 802a266: 4605 mov r5, r0
  26503. BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
  26504. void *pvReturn = NULL;
  26505. vTaskSuspendAll();
  26506. 802a268: f7ff f9ea bl 8029640 <vTaskSuspendAll>
  26507. {
  26508. /* If this is the first call to malloc then the heap will require
  26509. initialisation to setup the list of free blocks. */
  26510. if( pxEnd == NULL )
  26511. 802a26c: 4b3a ldr r3, [pc, #232] ; (802a358 <pvPortMalloc+0xf4>)
  26512. 802a26e: 681b ldr r3, [r3, #0]
  26513. 802a270: bb1b cbnz r3, 802a2ba <pvPortMalloc+0x56>
  26514. uint8_t *pucAlignedHeap;
  26515. uint32_t ulAddress;
  26516. size_t xTotalHeapSize = configTOTAL_HEAP_SIZE;
  26517. /* Ensure the heap starts on a correctly aligned boundary. */
  26518. ulAddress = ( uint32_t ) ucHeap;
  26519. 802a272: 4a3a ldr r2, [pc, #232] ; (802a35c <pvPortMalloc+0xf8>)
  26520. if( ( ulAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
  26521. 802a274: 0756 lsls r6, r2, #29
  26522. 802a276: d007 beq.n 802a288 <pvPortMalloc+0x24>
  26523. {
  26524. ulAddress += ( portBYTE_ALIGNMENT - 1 );
  26525. 802a278: 1dd3 adds r3, r2, #7
  26526. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  26527. 802a27a: f023 0307 bic.w r3, r3, #7
  26528. xTotalHeapSize -= ulAddress - ( uint32_t ) ucHeap;
  26529. 802a27e: f502 4270 add.w r2, r2, #61440 ; 0xf000
  26530. 802a282: 1ad1 subs r1, r2, r3
  26531. ulAddress = ( uint32_t ) ucHeap;
  26532. if( ( ulAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
  26533. {
  26534. ulAddress += ( portBYTE_ALIGNMENT - 1 );
  26535. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  26536. 802a284: 461a mov r2, r3
  26537. 802a286: e001 b.n 802a28c <pvPortMalloc+0x28>
  26538. static void prvHeapInit( void )
  26539. {
  26540. BlockLink_t *pxFirstFreeBlock;
  26541. uint8_t *pucAlignedHeap;
  26542. uint32_t ulAddress;
  26543. size_t xTotalHeapSize = configTOTAL_HEAP_SIZE;
  26544. 802a288: f44f 4170 mov.w r1, #61440 ; 0xf000
  26545. xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
  26546. xStart.xBlockSize = ( size_t ) 0;
  26547. /* pxEnd is used to mark the end of the list of free blocks and is inserted
  26548. at the end of the heap space. */
  26549. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  26550. 802a28c: 1851 adds r1, r2, r1
  26551. ulAddress -= xHeapStructSize;
  26552. 802a28e: 3908 subs r1, #8
  26553. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  26554. 802a290: f021 0107 bic.w r1, r1, #7
  26555. pucAlignedHeap = ( uint8_t * ) ulAddress;
  26556. /* xStart is used to hold a pointer to the first item in the list of free
  26557. blocks. The void cast is used to prevent compiler warnings. */
  26558. xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
  26559. 802a294: 4832 ldr r0, [pc, #200] ; (802a360 <pvPortMalloc+0xfc>)
  26560. xStart.xBlockSize = ( size_t ) 0;
  26561. 802a296: 2300 movs r3, #0
  26562. 802a298: e880 000c stmia.w r0, {r2, r3}
  26563. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  26564. ulAddress -= xHeapStructSize;
  26565. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  26566. pxEnd = ( void * ) ulAddress;
  26567. pxEnd->xBlockSize = 0;
  26568. pxEnd->pxNextFreeBlock = NULL;
  26569. 802a29c: 600b str r3, [r1, #0]
  26570. at the end of the heap space. */
  26571. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  26572. ulAddress -= xHeapStructSize;
  26573. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  26574. pxEnd = ( void * ) ulAddress;
  26575. pxEnd->xBlockSize = 0;
  26576. 802a29e: 604b str r3, [r1, #4]
  26577. pxEnd->pxNextFreeBlock = NULL;
  26578. /* To start with there is a single free block that is sized to take up the
  26579. entire heap space, minus the space taken by pxEnd. */
  26580. pxFirstFreeBlock = ( void * ) pucAlignedHeap;
  26581. pxFirstFreeBlock->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlock;
  26582. 802a2a0: 1a8b subs r3, r1, r2
  26583. pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
  26584. 802a2a2: e882 000a stmia.w r2, {r1, r3}
  26585. /* Only one block exists - and it covers the entire usable heap space. */
  26586. xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  26587. 802a2a6: 4a2f ldr r2, [pc, #188] ; (802a364 <pvPortMalloc+0x100>)
  26588. /* pxEnd is used to mark the end of the list of free blocks and is inserted
  26589. at the end of the heap space. */
  26590. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  26591. ulAddress -= xHeapStructSize;
  26592. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  26593. pxEnd = ( void * ) ulAddress;
  26594. 802a2a8: 482b ldr r0, [pc, #172] ; (802a358 <pvPortMalloc+0xf4>)
  26595. pxFirstFreeBlock = ( void * ) pucAlignedHeap;
  26596. pxFirstFreeBlock->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlock;
  26597. pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
  26598. /* Only one block exists - and it covers the entire usable heap space. */
  26599. xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  26600. 802a2aa: 6013 str r3, [r2, #0]
  26601. xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  26602. 802a2ac: 4a2e ldr r2, [pc, #184] ; (802a368 <pvPortMalloc+0x104>)
  26603. /* pxEnd is used to mark the end of the list of free blocks and is inserted
  26604. at the end of the heap space. */
  26605. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  26606. ulAddress -= xHeapStructSize;
  26607. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  26608. pxEnd = ( void * ) ulAddress;
  26609. 802a2ae: 6001 str r1, [r0, #0]
  26610. pxFirstFreeBlock->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlock;
  26611. pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
  26612. /* Only one block exists - and it covers the entire usable heap space. */
  26613. xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  26614. xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  26615. 802a2b0: 6013 str r3, [r2, #0]
  26616. /* Work out the position of the top bit in a size_t variable. */
  26617. xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 );
  26618. 802a2b2: 4b2e ldr r3, [pc, #184] ; (802a36c <pvPortMalloc+0x108>)
  26619. 802a2b4: f04f 4200 mov.w r2, #2147483648 ; 0x80000000
  26620. 802a2b8: 601a str r2, [r3, #0]
  26621. /* Check the requested block size is not so large that the top bit is
  26622. set. The top bit of the block size member of the BlockLink_t structure
  26623. is used to determine who owns the block - the application or the
  26624. kernel, so it must be free. */
  26625. if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
  26626. 802a2ba: 4b2c ldr r3, [pc, #176] ; (802a36c <pvPortMalloc+0x108>)
  26627. 802a2bc: 681e ldr r6, [r3, #0]
  26628. 802a2be: 4235 tst r5, r6
  26629. 802a2c0: d140 bne.n 802a344 <pvPortMalloc+0xe0>
  26630. {
  26631. /* The wanted size is increased so it can contain a BlockLink_t
  26632. structure in addition to the requested amount of bytes. */
  26633. if( xWantedSize > 0 )
  26634. 802a2c2: 2d00 cmp r5, #0
  26635. 802a2c4: d03f beq.n 802a346 <pvPortMalloc+0xe2>
  26636. {
  26637. xWantedSize += xHeapStructSize;
  26638. 802a2c6: f105 0308 add.w r3, r5, #8
  26639. /* Ensure that blocks are always aligned to the required number
  26640. of bytes. */
  26641. if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
  26642. 802a2ca: 0758 lsls r0, r3, #29
  26643. {
  26644. /* Byte alignment required. */
  26645. xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
  26646. 802a2cc: bf1c itt ne
  26647. 802a2ce: f023 0307 bicne.w r3, r3, #7
  26648. 802a2d2: 3308 addne r3, #8
  26649. else
  26650. {
  26651. mtCOVERAGE_TEST_MARKER();
  26652. }
  26653. if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
  26654. 802a2d4: 2b00 cmp r3, #0
  26655. 802a2d6: d033 beq.n 802a340 <pvPortMalloc+0xdc>
  26656. 802a2d8: 4a23 ldr r2, [pc, #140] ; (802a368 <pvPortMalloc+0x104>)
  26657. 802a2da: 6817 ldr r7, [r2, #0]
  26658. 802a2dc: 42bb cmp r3, r7
  26659. 802a2de: d831 bhi.n 802a344 <pvPortMalloc+0xe0>
  26660. {
  26661. /* Traverse the list from the start (lowest address) block until
  26662. one of adequate size is found. */
  26663. pxPreviousBlock = &xStart;
  26664. pxBlock = xStart.pxNextFreeBlock;
  26665. 802a2e0: 4a1f ldr r2, [pc, #124] ; (802a360 <pvPortMalloc+0xfc>)
  26666. 802a2e2: 6814 ldr r4, [r2, #0]
  26667. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  26668. 802a2e4: e001 b.n 802a2ea <pvPortMalloc+0x86>
  26669. 802a2e6: 4622 mov r2, r4
  26670. {
  26671. pxPreviousBlock = pxBlock;
  26672. pxBlock = pxBlock->pxNextFreeBlock;
  26673. 802a2e8: 4604 mov r4, r0
  26674. {
  26675. /* Traverse the list from the start (lowest address) block until
  26676. one of adequate size is found. */
  26677. pxPreviousBlock = &xStart;
  26678. pxBlock = xStart.pxNextFreeBlock;
  26679. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  26680. 802a2ea: 6861 ldr r1, [r4, #4]
  26681. 802a2ec: 4299 cmp r1, r3
  26682. 802a2ee: d304 bcc.n 802a2fa <pvPortMalloc+0x96>
  26683. pxBlock = pxBlock->pxNextFreeBlock;
  26684. }
  26685. /* If the end marker was reached then a block of adequate size
  26686. was not found. */
  26687. if( pxBlock != pxEnd )
  26688. 802a2f0: 4819 ldr r0, [pc, #100] ; (802a358 <pvPortMalloc+0xf4>)
  26689. 802a2f2: 6800 ldr r0, [r0, #0]
  26690. 802a2f4: 4284 cmp r4, r0
  26691. 802a2f6: d104 bne.n 802a302 <pvPortMalloc+0x9e>
  26692. 802a2f8: e024 b.n 802a344 <pvPortMalloc+0xe0>
  26693. {
  26694. /* Traverse the list from the start (lowest address) block until
  26695. one of adequate size is found. */
  26696. pxPreviousBlock = &xStart;
  26697. pxBlock = xStart.pxNextFreeBlock;
  26698. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  26699. 802a2fa: 6820 ldr r0, [r4, #0]
  26700. 802a2fc: 2800 cmp r0, #0
  26701. 802a2fe: d1f2 bne.n 802a2e6 <pvPortMalloc+0x82>
  26702. 802a300: e7f6 b.n 802a2f0 <pvPortMalloc+0x8c>
  26703. BlockLink_t structure at its start. */
  26704. pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
  26705. /* This block is being returned for use so must be taken out
  26706. of the list of free blocks. */
  26707. pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
  26708. 802a302: 6820 ldr r0, [r4, #0]
  26709. was not found. */
  26710. if( pxBlock != pxEnd )
  26711. {
  26712. /* Return the memory space pointed to - jumping over the
  26713. BlockLink_t structure at its start. */
  26714. pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
  26715. 802a304: 6815 ldr r5, [r2, #0]
  26716. /* This block is being returned for use so must be taken out
  26717. of the list of free blocks. */
  26718. pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
  26719. 802a306: 6010 str r0, [r2, #0]
  26720. /* If the block is larger than required it can be split into
  26721. two. */
  26722. if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
  26723. 802a308: 1aca subs r2, r1, r3
  26724. was not found. */
  26725. if( pxBlock != pxEnd )
  26726. {
  26727. /* Return the memory space pointed to - jumping over the
  26728. BlockLink_t structure at its start. */
  26729. pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
  26730. 802a30a: 3508 adds r5, #8
  26731. of the list of free blocks. */
  26732. pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
  26733. /* If the block is larger than required it can be split into
  26734. two. */
  26735. if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
  26736. 802a30c: 2a10 cmp r2, #16
  26737. 802a30e: d909 bls.n 802a324 <pvPortMalloc+0xc0>
  26738. {
  26739. /* This block is to be split into two. Create a new
  26740. block following the number of bytes requested. The void
  26741. cast is used to prevent byte alignment warnings from the
  26742. compiler. */
  26743. pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
  26744. 802a310: 18e0 adds r0, r4, r3
  26745. configASSERT( ( ( ( uint32_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 );
  26746. 802a312: 0741 lsls r1, r0, #29
  26747. 802a314: d002 beq.n 802a31c <pvPortMalloc+0xb8>
  26748. 802a316: f7ff fe8f bl 802a038 <ulPortSetInterruptMask>
  26749. 802a31a: e7fe b.n 802a31a <pvPortMalloc+0xb6>
  26750. /* Calculate the sizes of two blocks split from the
  26751. single block. */
  26752. pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
  26753. 802a31c: 6042 str r2, [r0, #4]
  26754. pxBlock->xBlockSize = xWantedSize;
  26755. 802a31e: 6063 str r3, [r4, #4]
  26756. /* Insert the new block into the list of free blocks. */
  26757. prvInsertBlockIntoFreeList( ( pxNewBlockLink ) );
  26758. 802a320: f7ff ff7c bl 802a21c <prvInsertBlockIntoFreeList>
  26759. else
  26760. {
  26761. mtCOVERAGE_TEST_MARKER();
  26762. }
  26763. xFreeBytesRemaining -= pxBlock->xBlockSize;
  26764. 802a324: 6862 ldr r2, [r4, #4]
  26765. 802a326: 4910 ldr r1, [pc, #64] ; (802a368 <pvPortMalloc+0x104>)
  26766. 802a328: 1abb subs r3, r7, r2
  26767. 802a32a: 600b str r3, [r1, #0]
  26768. if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
  26769. 802a32c: 490d ldr r1, [pc, #52] ; (802a364 <pvPortMalloc+0x100>)
  26770. 802a32e: 6808 ldr r0, [r1, #0]
  26771. 802a330: 4283 cmp r3, r0
  26772. {
  26773. xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
  26774. 802a332: bf38 it cc
  26775. 802a334: 600b strcc r3, [r1, #0]
  26776. mtCOVERAGE_TEST_MARKER();
  26777. }
  26778. /* The block is being returned - it is allocated and owned
  26779. by the application and has no "next" block. */
  26780. pxBlock->xBlockSize |= xBlockAllocatedBit;
  26781. 802a336: 4316 orrs r6, r2
  26782. pxBlock->pxNextFreeBlock = NULL;
  26783. 802a338: 2300 movs r3, #0
  26784. 802a33a: e884 0048 stmia.w r4, {r3, r6}
  26785. 802a33e: e002 b.n 802a346 <pvPortMalloc+0xe2>
  26786. /*-----------------------------------------------------------*/
  26787. void *pvPortMalloc( size_t xWantedSize )
  26788. {
  26789. BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
  26790. void *pvReturn = NULL;
  26791. 802a340: 461d mov r5, r3
  26792. 802a342: e000 b.n 802a346 <pvPortMalloc+0xe2>
  26793. 802a344: 2500 movs r5, #0
  26794. mtCOVERAGE_TEST_MARKER();
  26795. }
  26796. traceMALLOC( pvReturn, xWantedSize );
  26797. }
  26798. ( void ) xTaskResumeAll();
  26799. 802a346: f7ff fa17 bl 8029778 <xTaskResumeAll>
  26800. mtCOVERAGE_TEST_MARKER();
  26801. }
  26802. }
  26803. #endif
  26804. configASSERT( ( ( ( uint32_t ) pvReturn ) & portBYTE_ALIGNMENT_MASK ) == 0 );
  26805. 802a34a: 076b lsls r3, r5, #29
  26806. 802a34c: d002 beq.n 802a354 <pvPortMalloc+0xf0>
  26807. 802a34e: f7ff fe73 bl 802a038 <ulPortSetInterruptMask>
  26808. 802a352: e7fe b.n 802a352 <pvPortMalloc+0xee>
  26809. return pvReturn;
  26810. }
  26811. 802a354: 4628 mov r0, r5
  26812. 802a356: bdf8 pop {r3, r4, r5, r6, r7, pc}
  26813. 802a358: 20002a24 .word 0x20002a24
  26814. 802a35c: 10000000 .word 0x10000000
  26815. 802a360: 20002a28 .word 0x20002a28
  26816. 802a364: 20002a30 .word 0x20002a30
  26817. 802a368: 20002a20 .word 0x20002a20
  26818. 802a36c: 20002a34 .word 0x20002a34
  26819. 0802a370 <vPortFree>:
  26820. /*-----------------------------------------------------------*/
  26821. void vPortFree( void *pv )
  26822. {
  26823. 802a370: b510 push {r4, lr}
  26824. uint8_t *puc = ( uint8_t * ) pv;
  26825. BlockLink_t *pxLink;
  26826. if( pv != NULL )
  26827. 802a372: 4604 mov r4, r0
  26828. 802a374: b310 cbz r0, 802a3bc <vPortFree+0x4c>
  26829. /* This casting is to keep the compiler from issuing warnings. */
  26830. pxLink = ( void * ) puc;
  26831. /* Check the block is actually allocated. */
  26832. configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
  26833. 802a376: 4a12 ldr r2, [pc, #72] ; (802a3c0 <vPortFree+0x50>)
  26834. 802a378: f850 3c04 ldr.w r3, [r0, #-4]
  26835. 802a37c: 6812 ldr r2, [r2, #0]
  26836. 802a37e: 421a tst r2, r3
  26837. 802a380: d102 bne.n 802a388 <vPortFree+0x18>
  26838. 802a382: f7ff fe59 bl 802a038 <ulPortSetInterruptMask>
  26839. 802a386: e7fe b.n 802a386 <vPortFree+0x16>
  26840. configASSERT( pxLink->pxNextFreeBlock == NULL );
  26841. 802a388: f850 1c08 ldr.w r1, [r0, #-8]
  26842. 802a38c: b111 cbz r1, 802a394 <vPortFree+0x24>
  26843. 802a38e: f7ff fe53 bl 802a038 <ulPortSetInterruptMask>
  26844. 802a392: e7fe b.n 802a392 <vPortFree+0x22>
  26845. {
  26846. if( pxLink->pxNextFreeBlock == NULL )
  26847. {
  26848. /* The block is being returned to the heap - it is no longer
  26849. allocated. */
  26850. pxLink->xBlockSize &= ~xBlockAllocatedBit;
  26851. 802a394: ea23 0302 bic.w r3, r3, r2
  26852. 802a398: f840 3c04 str.w r3, [r0, #-4]
  26853. vTaskSuspendAll();
  26854. 802a39c: f7ff f950 bl 8029640 <vTaskSuspendAll>
  26855. {
  26856. /* Add this block to the list of free blocks. */
  26857. xFreeBytesRemaining += pxLink->xBlockSize;
  26858. 802a3a0: 4b08 ldr r3, [pc, #32] ; (802a3c4 <vPortFree+0x54>)
  26859. 802a3a2: f854 1c04 ldr.w r1, [r4, #-4]
  26860. 802a3a6: 681a ldr r2, [r3, #0]
  26861. traceFREE( pv, pxLink->xBlockSize );
  26862. prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
  26863. 802a3a8: f1a4 0008 sub.w r0, r4, #8
  26864. pxLink->xBlockSize &= ~xBlockAllocatedBit;
  26865. vTaskSuspendAll();
  26866. {
  26867. /* Add this block to the list of free blocks. */
  26868. xFreeBytesRemaining += pxLink->xBlockSize;
  26869. 802a3ac: 188a adds r2, r1, r2
  26870. 802a3ae: 601a str r2, [r3, #0]
  26871. traceFREE( pv, pxLink->xBlockSize );
  26872. prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
  26873. 802a3b0: f7ff ff34 bl 802a21c <prvInsertBlockIntoFreeList>
  26874. else
  26875. {
  26876. mtCOVERAGE_TEST_MARKER();
  26877. }
  26878. }
  26879. }
  26880. 802a3b4: e8bd 4010 ldmia.w sp!, {r4, lr}
  26881. /* Add this block to the list of free blocks. */
  26882. xFreeBytesRemaining += pxLink->xBlockSize;
  26883. traceFREE( pv, pxLink->xBlockSize );
  26884. prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
  26885. }
  26886. ( void ) xTaskResumeAll();
  26887. 802a3b8: f7ff b9de b.w 8029778 <xTaskResumeAll>
  26888. 802a3bc: bd10 pop {r4, pc}
  26889. 802a3be: bf00 nop
  26890. 802a3c0: 20002a34 .word 0x20002a34
  26891. 802a3c4: 20002a20 .word 0x20002a20
  26892. 0802a3c8 <HTTP_UpdateUserLoginTime>:
  26893. /**
  26894. * @brief Обновление времени последней активности пользователя
  26895. */
  26896. static void HTTP_UpdateUserLoginTime(uint8_t user_id)
  26897. {
  26898. xTimerStart(users[user_id].LogoutTimer, 0);
  26899. 802a3c8: 4b07 ldr r3, [pc, #28] ; (802a3e8 <HTTP_UpdateUserLoginTime+0x20>)
  26900. 802a3ca: 2214 movs r2, #20
  26901. /**
  26902. * @brief Обновление времени последней активности пользователя
  26903. */
  26904. static void HTTP_UpdateUserLoginTime(uint8_t user_id)
  26905. {
  26906. 802a3cc: b513 push {r0, r1, r4, lr}
  26907. xTimerStart(users[user_id].LogoutTimer, 0);
  26908. 802a3ce: fb02 3000 mla r0, r2, r0, r3
  26909. 802a3d2: 6904 ldr r4, [r0, #16]
  26910. 802a3d4: f7ff f93c bl 8029650 <xTaskGetTickCount>
  26911. 802a3d8: 2300 movs r3, #0
  26912. 802a3da: 4602 mov r2, r0
  26913. 802a3dc: 9300 str r3, [sp, #0]
  26914. 802a3de: 4620 mov r0, r4
  26915. 802a3e0: 2101 movs r1, #1
  26916. 802a3e2: f7ff fcd3 bl 8029d8c <xTimerGenericCommand>
  26917. }
  26918. 802a3e6: bd1c pop {r2, r3, r4, pc}
  26919. 802a3e8: 2000fb5c .word 0x2000fb5c
  26920. 0802a3ec <fs_open>:
  26921. * @param name : pointer to a file name
  26922. * @param file : pointer to a fs_file structure
  26923. * @retval 1 if success, 0 if fail
  26924. */
  26925. static int fs_open(char *name, struct fs_file *file)
  26926. {
  26927. 802a3ec: b570 push {r4, r5, r6, lr}
  26928. struct fsdata_file_noconst *f;
  26929. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  26930. 802a3ee: 4c09 ldr r4, [pc, #36] ; (802a414 <fs_open+0x28>)
  26931. * @param name : pointer to a file name
  26932. * @param file : pointer to a fs_file structure
  26933. * @retval 1 if success, 0 if fail
  26934. */
  26935. static int fs_open(char *name, struct fs_file *file)
  26936. {
  26937. 802a3f0: 4606 mov r6, r0
  26938. 802a3f2: 460d mov r5, r1
  26939. struct fsdata_file_noconst *f;
  26940. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  26941. {
  26942. if (!strcmp(name, f->name))
  26943. 802a3f4: 4630 mov r0, r6
  26944. 802a3f6: 6861 ldr r1, [r4, #4]
  26945. 802a3f8: f7f7 fbee bl 8021bd8 <strcmp>
  26946. 802a3fc: b928 cbnz r0, 802a40a <fs_open+0x1e>
  26947. {
  26948. file->data = f->data;
  26949. 802a3fe: 68a3 ldr r3, [r4, #8]
  26950. 802a400: 602b str r3, [r5, #0]
  26951. file->len = f->len;
  26952. 802a402: 68e3 ldr r3, [r4, #12]
  26953. return 1;
  26954. 802a404: 2001 movs r0, #1
  26955. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  26956. {
  26957. if (!strcmp(name, f->name))
  26958. {
  26959. file->data = f->data;
  26960. file->len = f->len;
  26961. 802a406: 606b str r3, [r5, #4]
  26962. return 1;
  26963. 802a408: bd70 pop {r4, r5, r6, pc}
  26964. */
  26965. static int fs_open(char *name, struct fs_file *file)
  26966. {
  26967. struct fsdata_file_noconst *f;
  26968. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  26969. 802a40a: 6824 ldr r4, [r4, #0]
  26970. 802a40c: 2c00 cmp r4, #0
  26971. 802a40e: d1f1 bne.n 802a3f4 <fs_open+0x8>
  26972. file->data = f->data;
  26973. file->len = f->len;
  26974. return 1;
  26975. }
  26976. }
  26977. return 0;
  26978. 802a410: 4620 mov r0, r4
  26979. }
  26980. 802a412: bd70 pop {r4, r5, r6, pc}
  26981. 802a414: 0803cd28 .word 0x0803cd28
  26982. 0802a418 <http_accept>:
  26983. * @param pcb: pointer to a tcp_pcb structure
  26984. * &param err: Lwip stack error code
  26985. * @retval err
  26986. */
  26987. static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
  26988. {
  26989. 802a418: b538 push {r3, r4, r5, lr}
  26990. struct http_state *hs;
  26991. /* Allocate memory for the structure that holds the state of the connection */
  26992. hs = mem_malloc(sizeof(struct http_state));
  26993. 802a41a: 2008 movs r0, #8
  26994. * @param pcb: pointer to a tcp_pcb structure
  26995. * &param err: Lwip stack error code
  26996. * @retval err
  26997. */
  26998. static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
  26999. {
  27000. 802a41c: 460c mov r4, r1
  27001. struct http_state *hs;
  27002. /* Allocate memory for the structure that holds the state of the connection */
  27003. hs = mem_malloc(sizeof(struct http_state));
  27004. 802a41e: f002 fc5d bl 802ccdc <mem_malloc>
  27005. if (hs == NULL)
  27006. 802a422: 4601 mov r1, r0
  27007. 802a424: b1a0 cbz r0, 802a450 <http_accept+0x38>
  27008. {
  27009. return ERR_MEM;
  27010. }
  27011. /* Initialize the structure. */
  27012. hs->file = NULL;
  27013. 802a426: 2500 movs r5, #0
  27014. 802a428: 6005 str r5, [r0, #0]
  27015. hs->left = 0;
  27016. 802a42a: 6045 str r5, [r0, #4]
  27017. /* Tell TCP that this is the structure we wish to be passed for our
  27018. callbacks. */
  27019. tcp_arg(pcb, hs);
  27020. 802a42c: 4620 mov r0, r4
  27021. 802a42e: f003 f8c3 bl 802d5b8 <tcp_arg>
  27022. /* Tell TCP that we wish to be informed of incoming data by a call
  27023. to the http_recv() function. */
  27024. tcp_recv(pcb, http_recv);
  27025. 802a432: 4620 mov r0, r4
  27026. 802a434: 4908 ldr r1, [pc, #32] ; (802a458 <http_accept+0x40>)
  27027. 802a436: f003 f8c1 bl 802d5bc <tcp_recv>
  27028. tcp_err(pcb, conn_err);
  27029. 802a43a: 4620 mov r0, r4
  27030. 802a43c: 4907 ldr r1, [pc, #28] ; (802a45c <http_accept+0x44>)
  27031. 802a43e: f003 f8c1 bl 802d5c4 <tcp_err>
  27032. tcp_poll(pcb, http_poll, 10);
  27033. 802a442: 4620 mov r0, r4
  27034. 802a444: 4906 ldr r1, [pc, #24] ; (802a460 <http_accept+0x48>)
  27035. 802a446: 220a movs r2, #10
  27036. 802a448: f003 f8c1 bl 802d5ce <tcp_poll>
  27037. return ERR_OK;
  27038. 802a44c: 4628 mov r0, r5
  27039. 802a44e: e000 b.n 802a452 <http_accept+0x3a>
  27040. /* Allocate memory for the structure that holds the state of the connection */
  27041. hs = mem_malloc(sizeof(struct http_state));
  27042. if (hs == NULL)
  27043. {
  27044. return ERR_MEM;
  27045. 802a450: 20ff movs r0, #255 ; 0xff
  27046. tcp_err(pcb, conn_err);
  27047. tcp_poll(pcb, http_poll, 10);
  27048. return ERR_OK;
  27049. }
  27050. 802a452: b240 sxtb r0, r0
  27051. 802a454: bd38 pop {r3, r4, r5, pc}
  27052. 802a456: bf00 nop
  27053. 802a458: 0802ae31 .word 0x0802ae31
  27054. 802a45c: 0802a4a7 .word 0x0802a4a7
  27055. 802a460: 0802a48f .word 0x0802a48f
  27056. 0802a464 <send_data>:
  27057. * @param pcb: pointer to a tcp_pcb struct
  27058. * @param hs: pointer to a http_state struct
  27059. * @retval none
  27060. */
  27061. static void send_data(struct tcp_pcb *pcb, struct http_state *hs)
  27062. {
  27063. 802a464: b538 push {r3, r4, r5, lr}
  27064. err_t err;
  27065. u16_t len;
  27066. /* We cannot send more data than space available in the send
  27067. buffer */
  27068. if (tcp_sndbuf(pcb) < hs->left)
  27069. 802a466: 684b ldr r3, [r1, #4]
  27070. 802a468: f8b0 5066 ldrh.w r5, [r0, #102] ; 0x66
  27071. 802a46c: 429d cmp r5, r3
  27072. {
  27073. len = tcp_sndbuf(pcb);
  27074. }
  27075. else
  27076. {
  27077. len = hs->left;
  27078. 802a46e: bf28 it cs
  27079. 802a470: b29d uxthcs r5, r3
  27080. * @param pcb: pointer to a tcp_pcb struct
  27081. * @param hs: pointer to a http_state struct
  27082. * @retval none
  27083. */
  27084. static void send_data(struct tcp_pcb *pcb, struct http_state *hs)
  27085. {
  27086. 802a472: 460c mov r4, r1
  27087. }
  27088. else
  27089. {
  27090. len = hs->left;
  27091. }
  27092. err = tcp_write(pcb, hs->file, len, 0);
  27093. 802a474: 462a mov r2, r5
  27094. 802a476: 6809 ldr r1, [r1, #0]
  27095. 802a478: 2300 movs r3, #0
  27096. 802a47a: f004 fc02 bl 802ec82 <tcp_write>
  27097. if (err == ERR_OK)
  27098. 802a47e: b928 cbnz r0, 802a48c <send_data+0x28>
  27099. {
  27100. hs->file += len;
  27101. 802a480: 6823 ldr r3, [r4, #0]
  27102. 802a482: 195b adds r3, r3, r5
  27103. 802a484: 6023 str r3, [r4, #0]
  27104. hs->left -= len;
  27105. 802a486: 6863 ldr r3, [r4, #4]
  27106. 802a488: 1b5d subs r5, r3, r5
  27107. 802a48a: 6065 str r5, [r4, #4]
  27108. 802a48c: bd38 pop {r3, r4, r5, pc}
  27109. 0802a48e <http_poll>:
  27110. * @param arg: pointer to an argument to be passed to callback function
  27111. * @param pcb: pointer on tcp_pcb structure
  27112. * @retval err_t
  27113. */
  27114. static err_t http_poll(void *arg, struct tcp_pcb *pcb)
  27115. {
  27116. 802a48e: b508 push {r3, lr}
  27117. if (arg == NULL)
  27118. 802a490: 4603 mov r3, r0
  27119. {
  27120. tcp_close(pcb);
  27121. 802a492: 4608 mov r0, r1
  27122. * @param pcb: pointer on tcp_pcb structure
  27123. * @retval err_t
  27124. */
  27125. static err_t http_poll(void *arg, struct tcp_pcb *pcb)
  27126. {
  27127. if (arg == NULL)
  27128. 802a494: b913 cbnz r3, 802a49c <http_poll+0xe>
  27129. {
  27130. tcp_close(pcb);
  27131. 802a496: f003 fb2d bl 802daf4 <tcp_close>
  27132. 802a49a: e002 b.n 802a4a2 <http_poll+0x14>
  27133. }
  27134. else
  27135. {
  27136. send_data(pcb, (struct http_state *)arg);
  27137. 802a49c: 4619 mov r1, r3
  27138. 802a49e: f7ff ffe1 bl 802a464 <send_data>
  27139. }
  27140. return ERR_OK;
  27141. }
  27142. 802a4a2: 2000 movs r0, #0
  27143. 802a4a4: bd08 pop {r3, pc}
  27144. 0802a4a6 <conn_err>:
  27145. static void conn_err(void *arg, err_t err)
  27146. {
  27147. struct http_state *hs;
  27148. hs = arg;
  27149. mem_free(hs);
  27150. 802a4a6: f002 bb51 b.w 802cb4c <mem_free>
  27151. 0802a4aa <close_conn>:
  27152. * @param pcb: pointer to a tcp_pcb struct
  27153. * @param hs: pointer to a http_state struct
  27154. * @retval
  27155. */
  27156. static void close_conn(struct tcp_pcb *pcb, struct http_state *hs)
  27157. {
  27158. 802a4aa: b538 push {r3, r4, r5, lr}
  27159. 802a4ac: 4604 mov r4, r0
  27160. 802a4ae: 460d mov r5, r1
  27161. tcp_arg(pcb, NULL);
  27162. 802a4b0: 2100 movs r1, #0
  27163. 802a4b2: f003 f881 bl 802d5b8 <tcp_arg>
  27164. tcp_sent(pcb, NULL);
  27165. 802a4b6: 4620 mov r0, r4
  27166. 802a4b8: 2100 movs r1, #0
  27167. 802a4ba: f003 f881 bl 802d5c0 <tcp_sent>
  27168. tcp_recv(pcb, NULL);
  27169. 802a4be: 4620 mov r0, r4
  27170. 802a4c0: 2100 movs r1, #0
  27171. 802a4c2: f003 f87b bl 802d5bc <tcp_recv>
  27172. mem_free(hs);
  27173. 802a4c6: 4628 mov r0, r5
  27174. 802a4c8: f002 fb40 bl 802cb4c <mem_free>
  27175. tcp_close(pcb);
  27176. 802a4cc: 4620 mov r0, r4
  27177. }
  27178. 802a4ce: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  27179. {
  27180. tcp_arg(pcb, NULL);
  27181. tcp_sent(pcb, NULL);
  27182. tcp_recv(pcb, NULL);
  27183. mem_free(hs);
  27184. tcp_close(pcb);
  27185. 802a4d2: f003 bb0f b.w 802daf4 <tcp_close>
  27186. 0802a4d6 <http_sent>:
  27187. * @param pcb: pointer on tcp_pcb structure
  27188. * @param len
  27189. * @retval err : LwIP error code
  27190. */
  27191. static err_t http_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
  27192. {
  27193. 802a4d6: b508 push {r3, lr}
  27194. 802a4d8: 4603 mov r3, r0
  27195. 802a4da: 4608 mov r0, r1
  27196. struct http_state *hs;
  27197. hs = arg;
  27198. if (hs->left > 0)
  27199. 802a4dc: 685a ldr r2, [r3, #4]
  27200. {
  27201. send_data(pcb, hs);
  27202. 802a4de: 4619 mov r1, r3
  27203. {
  27204. struct http_state *hs;
  27205. hs = arg;
  27206. if (hs->left > 0)
  27207. 802a4e0: b112 cbz r2, 802a4e8 <http_sent+0x12>
  27208. {
  27209. send_data(pcb, hs);
  27210. 802a4e2: f7ff ffbf bl 802a464 <send_data>
  27211. 802a4e6: e001 b.n 802a4ec <http_sent+0x16>
  27212. }
  27213. else
  27214. {
  27215. close_conn(pcb, hs);
  27216. 802a4e8: f7ff ffdf bl 802a4aa <close_conn>
  27217. }
  27218. return ERR_OK;
  27219. }
  27220. 802a4ec: 2000 movs r0, #0
  27221. 802a4ee: bd08 pop {r3, pc}
  27222. 0802a4f0 <LogoutTimerCallback>:
  27223. }
  27224. /**
  27225. * @brief >Callback таймера логаута пользователя
  27226. */
  27227. void LogoutTimerCallback(TimerHandle_t pxTimer) {
  27228. 802a4f0: b51f push {r0, r1, r2, r3, r4, lr}
  27229. uint8_t user_id = (uint8_t)pvTimerGetTimerID( pxTimer );
  27230. 802a4f2: f7ff fd63 bl 8029fbc <pvTimerGetTimerID>
  27231. 802a4f6: 4604 mov r4, r0
  27232. static void HTTP_ForceUserLogout(uint8_t user_id)
  27233. {
  27234. char cookie[MAX_WEB_COOKIE_LEN];
  27235. /* Flush user cookie by random value */
  27236. sprintf(cookie, "%X", (unsigned int)GetRandomNumber());
  27237. 802a4f8: f7fb fde8 bl 80260cc <GetRandomNumber>
  27238. 802a4fc: 4906 ldr r1, [pc, #24] ; (802a518 <LogoutTimerCallback+0x28>)
  27239. 802a4fe: 4602 mov r2, r0
  27240. 802a500: 4668 mov r0, sp
  27241. 802a502: f7fd f91f bl 8027744 <tfp_sprintf>
  27242. /**
  27243. * @brief Установка Cookie пользователя
  27244. */
  27245. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  27246. {
  27247. strcpy(users[user_id].cookie, str);
  27248. 802a506: 4b05 ldr r3, [pc, #20] ; (802a51c <LogoutTimerCallback+0x2c>)
  27249. 802a508: b2e0 uxtb r0, r4
  27250. 802a50a: 2214 movs r2, #20
  27251. 802a50c: fb00 3002 mla r0, r0, r2, r3
  27252. 802a510: 4669 mov r1, sp
  27253. 802a512: f7f7 fc4f bl 8021db4 <strcpy>
  27254. */
  27255. void LogoutTimerCallback(TimerHandle_t pxTimer) {
  27256. uint8_t user_id = (uint8_t)pvTimerGetTimerID( pxTimer );
  27257. HTTP_ForceUserLogout(user_id);
  27258. }
  27259. 802a516: bd1f pop {r0, r1, r2, r3, r4, pc}
  27260. 802a518: 0803a02c .word 0x0803a02c
  27261. 802a51c: 2000fb5c .word 0x2000fb5c
  27262. 0802a520 <HTTP_Init>:
  27263. * @brief Initialize the HTTP server (start its thread)
  27264. * @param none
  27265. * @retval None
  27266. */
  27267. void HTTP_Init()
  27268. {
  27269. 802a520: b5f0 push {r4, r5, r6, r7, lr}
  27270. 802a522: b087 sub sp, #28
  27271. char buf[MAX_WEB_COOKIE_LEN];
  27272. uint8_t user_id;
  27273. //sys_thread_new("HTTP", http_server_netconn_thread, NULL, 3000, 2);
  27274. struct tcp_pcb *pcb;
  27275. /*create new pcb*/
  27276. pcb = tcp_new();
  27277. 802a524: f003 fc14 bl 802dd50 <tcp_new>
  27278. /* bind HTTP traffic to pcb */
  27279. tcp_bind(pcb, IP_ADDR_ANY, 80);
  27280. 802a528: 2250 movs r2, #80 ; 0x50
  27281. char buf[MAX_WEB_COOKIE_LEN];
  27282. uint8_t user_id;
  27283. //sys_thread_new("HTTP", http_server_netconn_thread, NULL, 3000, 2);
  27284. struct tcp_pcb *pcb;
  27285. /*create new pcb*/
  27286. pcb = tcp_new();
  27287. 802a52a: 4604 mov r4, r0
  27288. /* bind HTTP traffic to pcb */
  27289. tcp_bind(pcb, IP_ADDR_ANY, 80);
  27290. 802a52c: 4913 ldr r1, [pc, #76] ; (802a57c <HTTP_Init+0x5c>)
  27291. /**
  27292. * @brief Установка Cookie пользователя
  27293. */
  27294. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  27295. {
  27296. strcpy(users[user_id].cookie, str);
  27297. 802a52e: 4f14 ldr r7, [pc, #80] ; (802a580 <HTTP_Init+0x60>)
  27298. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  27299. HTTP_SetUserCookie(buf, user_id);
  27300. /* Create user logout timers */
  27301. users[user_id].LogoutTimer =
  27302. xTimerCreate("LogoutTmr", WEB_LOGOUT_TIME, pdFALSE, ( void * ) user_id, LogoutTimerCallback);
  27303. 802a530: 4e14 ldr r6, [pc, #80] ; (802a584 <HTTP_Init+0x64>)
  27304. //sys_thread_new("HTTP", http_server_netconn_thread, NULL, 3000, 2);
  27305. struct tcp_pcb *pcb;
  27306. /*create new pcb*/
  27307. pcb = tcp_new();
  27308. /* bind HTTP traffic to pcb */
  27309. tcp_bind(pcb, IP_ADDR_ANY, 80);
  27310. 802a532: f002 ff6f bl 802d414 <tcp_bind>
  27311. /* start listening on port 80 */
  27312. pcb = tcp_listen(pcb);
  27313. 802a536: 4620 mov r0, r4
  27314. 802a538: 21ff movs r1, #255 ; 0xff
  27315. 802a53a: f002 ffa3 bl 802d484 <tcp_listen_with_backlog>
  27316. /* define callback function for TCP connection setup */
  27317. tcp_accept(pcb, http_accept);
  27318. 802a53e: 4912 ldr r1, [pc, #72] ; (802a588 <HTTP_Init+0x68>)
  27319. 802a540: f003 f843 bl 802d5ca <tcp_accept>
  27320. 802a544: 2400 movs r4, #0
  27321. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  27322. /* Flush user cookie by random value */
  27323. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  27324. 802a546: f7fb fdc1 bl 80260cc <GetRandomNumber>
  27325. /**
  27326. * @brief Установка Cookie пользователя
  27327. */
  27328. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  27329. {
  27330. strcpy(users[user_id].cookie, str);
  27331. 802a54a: 2514 movs r5, #20
  27332. pcb = tcp_listen(pcb);
  27333. /* define callback function for TCP connection setup */
  27334. tcp_accept(pcb, http_accept);
  27335. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  27336. /* Flush user cookie by random value */
  27337. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  27338. 802a54c: 4602 mov r2, r0
  27339. /**
  27340. * @brief Установка Cookie пользователя
  27341. */
  27342. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  27343. {
  27344. strcpy(users[user_id].cookie, str);
  27345. 802a54e: fb05 7504 mla r5, r5, r4, r7
  27346. pcb = tcp_listen(pcb);
  27347. /* define callback function for TCP connection setup */
  27348. tcp_accept(pcb, http_accept);
  27349. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  27350. /* Flush user cookie by random value */
  27351. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  27352. 802a552: 490e ldr r1, [pc, #56] ; (802a58c <HTTP_Init+0x6c>)
  27353. 802a554: a802 add r0, sp, #8
  27354. 802a556: f7fd f8f5 bl 8027744 <tfp_sprintf>
  27355. /**
  27356. * @brief Установка Cookie пользователя
  27357. */
  27358. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  27359. {
  27360. strcpy(users[user_id].cookie, str);
  27361. 802a55a: a902 add r1, sp, #8
  27362. 802a55c: 4628 mov r0, r5
  27363. 802a55e: f7f7 fc29 bl 8021db4 <strcpy>
  27364. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  27365. HTTP_SetUserCookie(buf, user_id);
  27366. /* Create user logout timers */
  27367. users[user_id].LogoutTimer =
  27368. xTimerCreate("LogoutTmr", WEB_LOGOUT_TIME, pdFALSE, ( void * ) user_id, LogoutTimerCallback);
  27369. 802a562: 2200 movs r2, #0
  27370. 802a564: 4623 mov r3, r4
  27371. 802a566: 9600 str r6, [sp, #0]
  27372. 802a568: 4809 ldr r0, [pc, #36] ; (802a590 <HTTP_Init+0x70>)
  27373. 802a56a: 490a ldr r1, [pc, #40] ; (802a594 <HTTP_Init+0x74>)
  27374. 802a56c: f7ff fbee bl 8029d4c <xTimerCreate>
  27375. 802a570: 3401 adds r4, #1
  27376. tcp_bind(pcb, IP_ADDR_ANY, 80);
  27377. /* start listening on port 80 */
  27378. pcb = tcp_listen(pcb);
  27379. /* define callback function for TCP connection setup */
  27380. tcp_accept(pcb, http_accept);
  27381. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  27382. 802a572: 2c02 cmp r4, #2
  27383. /* Flush user cookie by random value */
  27384. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  27385. HTTP_SetUserCookie(buf, user_id);
  27386. /* Create user logout timers */
  27387. users[user_id].LogoutTimer =
  27388. 802a574: 6128 str r0, [r5, #16]
  27389. tcp_bind(pcb, IP_ADDR_ANY, 80);
  27390. /* start listening on port 80 */
  27391. pcb = tcp_listen(pcb);
  27392. /* define callback function for TCP connection setup */
  27393. tcp_accept(pcb, http_accept);
  27394. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  27395. 802a576: d1e6 bne.n 802a546 <HTTP_Init+0x26>
  27396. /* Create user logout timers */
  27397. users[user_id].LogoutTimer =
  27398. xTimerCreate("LogoutTmr", WEB_LOGOUT_TIME, pdFALSE, ( void * ) user_id, LogoutTimerCallback);
  27399. }
  27400. }
  27401. 802a578: b007 add sp, #28
  27402. 802a57a: bdf0 pop {r4, r5, r6, r7, pc}
  27403. 802a57c: 0803fe88 .word 0x0803fe88
  27404. 802a580: 2000fb5c .word 0x2000fb5c
  27405. 802a584: 0802a4f1 .word 0x0802a4f1
  27406. 802a588: 0802a419 .word 0x0802a419
  27407. 802a58c: 0803a02c .word 0x0803a02c
  27408. 802a590: 0803a02f .word 0x0803a02f
  27409. 802a594: 001b7740 .word 0x001b7740
  27410. 0802a598 <HTTP_Progon>:
  27411. /**
  27412. * @brief Возвращает uptime, freq, dutycicle
  27413. */
  27414. void HTTP_Progon(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  27415. {
  27416. 802a598: b538 push {r3, r4, r5, lr}
  27417. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  27418. 802a59a: f44f 62fa mov.w r2, #2000 ; 0x7d0
  27419. /**
  27420. * @brief Возвращает uptime, freq, dutycicle
  27421. */
  27422. void HTTP_Progon(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  27423. {
  27424. 802a59e: 460c mov r4, r1
  27425. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  27426. 802a5a0: 4608 mov r0, r1
  27427. 802a5a2: 2100 movs r1, #0
  27428. /**
  27429. * @brief Возвращает uptime, freq, dutycicle
  27430. */
  27431. void HTTP_Progon(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  27432. {
  27433. 802a5a4: 461d mov r5, r3
  27434. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  27435. 802a5a6: f7f7 fa8b bl 8021ac0 <memset>
  27436. HTTP_GetProgonParams(bufOut);
  27437. 802a5aa: 4620 mov r0, r4
  27438. 802a5ac: f001 fb22 bl 802bbf4 <HTTP_GetProgonParams>
  27439. *lenBufOut = strlen(bufOut);
  27440. 802a5b0: 4620 mov r0, r4
  27441. 802a5b2: f7f7 fc5d bl 8021e70 <strlen>
  27442. 802a5b6: 8028 strh r0, [r5, #0]
  27443. 802a5b8: bd38 pop {r3, r4, r5, pc}
  27444. 802a5ba: 0000 movs r0, r0
  27445. 0802a5bc <GetParamValue>:
  27446. /**
  27447. * @brief
  27448. * @retval None
  27449. */
  27450. uint8_t GetParamValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen)
  27451. {
  27452. 802a5bc: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  27453. 802a5c0: 4690 mov r8, r2
  27454. 802a5c2: 461f mov r7, r3
  27455. char *beginValue = 0;
  27456. char *endValue = 0;
  27457. int len = 0;
  27458. char *strPtr = 0;
  27459. strPtr = strstr(inStr, paramName);
  27460. 802a5c4: f7f7 fed4 bl 8022370 <strstr>
  27461. if (strPtr != 0)
  27462. 802a5c8: 4605 mov r5, r0
  27463. 802a5ca: b1e0 cbz r0, 802a606 <GetParamValue+0x4a>
  27464. {
  27465. beginValue = strpbrk(strPtr,"=");
  27466. 802a5cc: 490f ldr r1, [pc, #60] ; (802a60c <GetParamValue+0x50>)
  27467. 802a5ce: f7f7 fd39 bl 8022044 <strpbrk>
  27468. endValue = strpbrk(strPtr,"&");
  27469. 802a5d2: 490f ldr r1, [pc, #60] ; (802a610 <GetParamValue+0x54>)
  27470. strPtr = strstr(inStr, paramName);
  27471. if (strPtr != 0)
  27472. {
  27473. beginValue = strpbrk(strPtr,"=");
  27474. 802a5d4: 4606 mov r6, r0
  27475. endValue = strpbrk(strPtr,"&");
  27476. 802a5d6: 4628 mov r0, r5
  27477. 802a5d8: f7f7 fd34 bl 8022044 <strpbrk>
  27478. if (endValue == 0)
  27479. 802a5dc: 4604 mov r4, r0
  27480. 802a5de: b920 cbnz r0, 802a5ea <GetParamValue+0x2e>
  27481. endValue = strpbrk(strPtr," ");
  27482. 802a5e0: 4628 mov r0, r5
  27483. 802a5e2: 490c ldr r1, [pc, #48] ; (802a614 <GetParamValue+0x58>)
  27484. 802a5e4: f7f7 fd2e bl 8022044 <strpbrk>
  27485. 802a5e8: 4604 mov r4, r0
  27486. len = endValue - beginValue - 1;
  27487. 802a5ea: 1ba5 subs r5, r4, r6
  27488. 802a5ec: 3d01 subs r5, #1
  27489. strncpy(paramValue, beginValue + 1, len);
  27490. 802a5ee: 4640 mov r0, r8
  27491. 802a5f0: 1c71 adds r1, r6, #1
  27492. 802a5f2: 462a mov r2, r5
  27493. 802a5f4: f7f7 fcf4 bl 8021fe0 <strncpy>
  27494. *endValue = '0';
  27495. 802a5f8: 2330 movs r3, #48 ; 0x30
  27496. 802a5fa: 7023 strb r3, [r4, #0]
  27497. *beginValue = '0';
  27498. *paramLen = len;
  27499. return 1;
  27500. 802a5fc: 2001 movs r0, #1
  27501. if (endValue == 0)
  27502. endValue = strpbrk(strPtr," ");
  27503. len = endValue - beginValue - 1;
  27504. strncpy(paramValue, beginValue + 1, len);
  27505. *endValue = '0';
  27506. *beginValue = '0';
  27507. 802a5fe: 7033 strb r3, [r6, #0]
  27508. *paramLen = len;
  27509. 802a600: 703d strb r5, [r7, #0]
  27510. return 1;
  27511. 802a602: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  27512. }
  27513. else
  27514. {
  27515. *paramLen = 0;
  27516. 802a606: 7038 strb r0, [r7, #0]
  27517. return 0;
  27518. }
  27519. }
  27520. 802a608: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  27521. 802a60c: 0803a205 .word 0x0803a205
  27522. 802a610: 0803a039 .word 0x0803a039
  27523. 802a614: 08035f57 .word 0x08035f57
  27524. 0802a618 <HTTP_ConfirmWebPwd>:
  27525. /**
  27526. * @brief Проверка пароля для входа в Web
  27527. * @retval None
  27528. */
  27529. int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  27530. {
  27531. 802a618: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  27532. 802a61c: b0a8 sub sp, #160 ; 0xa0
  27533. 802a61e: 4604 mov r4, r0
  27534. char *strPtr = 0;
  27535. char WebPassword[MAX_WEB_PASSWD_LEN];
  27536. char WebLogin[MAX_WEB_LOGIN_LEN];
  27537. char buf[40];
  27538. memset(login, 0, 20);
  27539. 802a620: 2214 movs r2, #20
  27540. /**
  27541. * @brief Проверка пароля для входа в Web
  27542. * @retval None
  27543. */
  27544. int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  27545. {
  27546. 802a622: 460d mov r5, r1
  27547. char *strPtr = 0;
  27548. char WebPassword[MAX_WEB_PASSWD_LEN];
  27549. char WebLogin[MAX_WEB_LOGIN_LEN];
  27550. char buf[40];
  27551. memset(login, 0, 20);
  27552. 802a624: a807 add r0, sp, #28
  27553. 802a626: 2100 movs r1, #0
  27554. /**
  27555. * @brief Проверка пароля для входа в Web
  27556. * @retval None
  27557. */
  27558. int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  27559. {
  27560. 802a628: 4698 mov r8, r3
  27561. char *strPtr = 0;
  27562. char WebPassword[MAX_WEB_PASSWD_LEN];
  27563. char WebLogin[MAX_WEB_LOGIN_LEN];
  27564. char buf[40];
  27565. memset(login, 0, 20);
  27566. 802a62a: f7f7 fa49 bl 8021ac0 <memset>
  27567. memset(password, 0, 20);
  27568. 802a62e: 2100 movs r1, #0
  27569. 802a630: 2214 movs r2, #20
  27570. 802a632: a80c add r0, sp, #48 ; 0x30
  27571. 802a634: f7f7 fa44 bl 8021ac0 <memset>
  27572. memset(tempStr, 0, 50);
  27573. 802a638: 2100 movs r1, #0
  27574. 802a63a: 2232 movs r2, #50 ; 0x32
  27575. 802a63c: a81b add r0, sp, #108 ; 0x6c
  27576. 802a63e: f7f7 fa3f bl 8021ac0 <memset>
  27577. /* Get first 50 bytes of string */
  27578. strncpy(tempStr, bufIn, 49);
  27579. 802a642: 2231 movs r2, #49 ; 0x31
  27580. 802a644: 4621 mov r1, r4
  27581. 802a646: a81b add r0, sp, #108 ; 0x6c
  27582. 802a648: f7f7 fcca bl 8021fe0 <strncpy>
  27583. /* Add " " to the string in order GetParamValue() can be able to parse the param */
  27584. strcat(tempStr, " ");
  27585. if (GetParamValue(tempStr, "login=", login, &valueLen) &&
  27586. 802a64c: f10d 0603 add.w r6, sp, #3
  27587. /* Get first 50 bytes of string */
  27588. strncpy(tempStr, bufIn, 49);
  27589. /* Add " " to the string in order GetParamValue() can be able to parse the param */
  27590. strcat(tempStr, " ");
  27591. 802a650: 4941 ldr r1, [pc, #260] ; (802a758 <HTTP_ConfirmWebPwd+0x140>)
  27592. 802a652: a81b add r0, sp, #108 ; 0x6c
  27593. 802a654: f7f7 fa9a bl 8021b8c <strcat>
  27594. if (GetParamValue(tempStr, "login=", login, &valueLen) &&
  27595. 802a658: a81b add r0, sp, #108 ; 0x6c
  27596. 802a65a: 4940 ldr r1, [pc, #256] ; (802a75c <HTTP_ConfirmWebPwd+0x144>)
  27597. 802a65c: aa07 add r2, sp, #28
  27598. 802a65e: 4633 mov r3, r6
  27599. 802a660: f7ff ffac bl 802a5bc <GetParamValue>
  27600. 802a664: b920 cbnz r0, 802a670 <HTTP_ConfirmWebPwd+0x58>
  27601. }
  27602. }
  27603. /* No valid login and pass found */
  27604. /* TODO replace global flag with user-pass-cookie*/
  27605. Authenticated = false;
  27606. 802a666: 4b3e ldr r3, [pc, #248] ; (802a760 <HTTP_ConfirmWebPwd+0x148>)
  27607. 802a668: 2200 movs r2, #0
  27608. 802a66a: 701a strb r2, [r3, #0]
  27609. /* Wrong login or pass, return */
  27610. return SEND_REQUIRED_NO;
  27611. 802a66c: 2001 movs r0, #1
  27612. 802a66e: e06f b.n 802a750 <HTTP_ConfirmWebPwd+0x138>
  27613. /* Add " " to the string in order GetParamValue() can be able to parse the param */
  27614. strcat(tempStr, " ");
  27615. if (GetParamValue(tempStr, "login=", login, &valueLen) &&
  27616. GetParamValue(tempStr, "password=", password, &valueLen))
  27617. 802a670: a81b add r0, sp, #108 ; 0x6c
  27618. 802a672: 493c ldr r1, [pc, #240] ; (802a764 <HTTP_ConfirmWebPwd+0x14c>)
  27619. 802a674: aa0c add r2, sp, #48 ; 0x30
  27620. 802a676: 4633 mov r3, r6
  27621. 802a678: f7ff ffa0 bl 802a5bc <GetParamValue>
  27622. strncpy(tempStr, bufIn, 49);
  27623. /* Add " " to the string in order GetParamValue() can be able to parse the param */
  27624. strcat(tempStr, " ");
  27625. if (GetParamValue(tempStr, "login=", login, &valueLen) &&
  27626. 802a67c: 2800 cmp r0, #0
  27627. 802a67e: d0f2 beq.n 802a666 <HTTP_ConfirmWebPwd+0x4e>
  27628. 802a680: 2400 movs r4, #0
  27629. GetParamValue(tempStr, "password=", password, &valueLen))
  27630. {
  27631. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  27632. GetUserLogin(user_id, WebLogin, &valueLen);
  27633. 802a682: 4637 mov r7, r6
  27634. 802a684: 4620 mov r0, r4
  27635. 802a686: a904 add r1, sp, #16
  27636. 802a688: 463a mov r2, r7
  27637. 802a68a: f7fd fad7 bl 8027c3c <GetUserLogin>
  27638. GetUserPassword(user_id, WebPassword, &valueLen);
  27639. 802a68e: 4620 mov r0, r4
  27640. 802a690: a901 add r1, sp, #4
  27641. 802a692: 463a mov r2, r7
  27642. 802a694: f7fd fae8 bl 8027c68 <GetUserPassword>
  27643. /* Check login and password */
  27644. if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
  27645. 802a698: a804 add r0, sp, #16
  27646. 802a69a: a907 add r1, sp, #28
  27647. 802a69c: 220b movs r2, #11
  27648. 802a69e: f7f7 fc49 bl 8021f34 <strncmp>
  27649. 802a6a2: 2800 cmp r0, #0
  27650. 802a6a4: d14f bne.n 802a746 <HTTP_ConfirmWebPwd+0x12e>
  27651. (strncmp(WebPassword, password, MAX_WEB_PASSWD_LEN) == 0)) {
  27652. 802a6a6: a801 add r0, sp, #4
  27653. 802a6a8: a90c add r1, sp, #48 ; 0x30
  27654. 802a6aa: 220b movs r2, #11
  27655. 802a6ac: f7f7 fc42 bl 8021f34 <strncmp>
  27656. GetUserLogin(user_id, WebLogin, &valueLen);
  27657. GetUserPassword(user_id, WebPassword, &valueLen);
  27658. /* Check login and password */
  27659. if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
  27660. 802a6b0: 4606 mov r6, r0
  27661. 802a6b2: 2800 cmp r0, #0
  27662. 802a6b4: d147 bne.n 802a746 <HTTP_ConfirmWebPwd+0x12e>
  27663. if (user_id >= 1) {
  27664. }
  27665. /* TODO replace global flag with user-pass-cookie */
  27666. Authenticated = true;
  27667. 802a6b6: 4b2a ldr r3, [pc, #168] ; (802a760 <HTTP_ConfirmWebPwd+0x148>)
  27668. 802a6b8: 2201 movs r2, #1
  27669. 802a6ba: 701a strb r2, [r3, #0]
  27670. /* Generate cookie */
  27671. sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
  27672. 802a6bc: f7fb fd06 bl 80260cc <GetRandomNumber>
  27673. 802a6c0: 4929 ldr r1, [pc, #164] ; (802a768 <HTTP_ConfirmWebPwd+0x150>)
  27674. 802a6c2: 4602 mov r2, r0
  27675. 802a6c4: a81b add r0, sp, #108 ; 0x6c
  27676. 802a6c6: f7fd f83d bl 8027744 <tfp_sprintf>
  27677. /**
  27678. * @brief Установка Cookie пользователя
  27679. */
  27680. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  27681. {
  27682. strcpy(users[user_id].cookie, str);
  27683. 802a6ca: 4b28 ldr r3, [pc, #160] ; (802a76c <HTTP_ConfirmWebPwd+0x154>)
  27684. 802a6cc: 2014 movs r0, #20
  27685. 802a6ce: fb00 3004 mla r0, r0, r4, r3
  27686. 802a6d2: a91b add r1, sp, #108 ; 0x6c
  27687. 802a6d4: f7f7 fb6e bl 8021db4 <strcpy>
  27688. sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
  27689. /* Set users cookie */
  27690. HTTP_SetUserCookie(tempStr, user_id);
  27691. HTTP_UpdateUserLoginTime(user_id);
  27692. 802a6d8: 4620 mov r0, r4
  27693. 802a6da: f7ff fe75 bl 802a3c8 <HTTP_UpdateUserLoginTime>
  27694. /* Send login and cookie back */
  27695. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\nSet-Cookie: uname=");
  27696. 802a6de: 4924 ldr r1, [pc, #144] ; (802a770 <HTTP_ConfirmWebPwd+0x158>)
  27697. 802a6e0: 4628 mov r0, r5
  27698. 802a6e2: f7f7 fb67 bl 8021db4 <strcpy>
  27699. strcat(bufOut, WebLogin);
  27700. 802a6e6: a904 add r1, sp, #16
  27701. 802a6e8: 4628 mov r0, r5
  27702. 802a6ea: f7f7 fa4f bl 8021b8c <strcat>
  27703. strcat(bufOut, "\r\nSet-Cookie: id=");
  27704. 802a6ee: 4921 ldr r1, [pc, #132] ; (802a774 <HTTP_ConfirmWebPwd+0x15c>)
  27705. 802a6f0: 4628 mov r0, r5
  27706. 802a6f2: f7f7 fa4b bl 8021b8c <strcat>
  27707. strcat(bufOut, tempStr);
  27708. 802a6f6: a91b add r1, sp, #108 ; 0x6c
  27709. 802a6f8: 4628 mov r0, r5
  27710. 802a6fa: f7f7 fa47 bl 8021b8c <strcat>
  27711. sprintf(tempStr, "%d", user_id);
  27712. 802a6fe: 4622 mov r2, r4
  27713. 802a700: 491d ldr r1, [pc, #116] ; (802a778 <HTTP_ConfirmWebPwd+0x160>)
  27714. 802a702: a81b add r0, sp, #108 ; 0x6c
  27715. 802a704: f7fd f81e bl 8027744 <tfp_sprintf>
  27716. strcat(bufOut, "\r\nSet-Cookie: role=");
  27717. 802a708: 491c ldr r1, [pc, #112] ; (802a77c <HTTP_ConfirmWebPwd+0x164>)
  27718. 802a70a: 4628 mov r0, r5
  27719. 802a70c: f7f7 fa3e bl 8021b8c <strcat>
  27720. strcat(bufOut, tempStr);
  27721. 802a710: a91b add r1, sp, #108 ; 0x6c
  27722. 802a712: 4628 mov r0, r5
  27723. 802a714: f7f7 fa3a bl 8021b8c <strcat>
  27724. strcat(bufOut, "\r\n\r\n");
  27725. 802a718: 4919 ldr r1, [pc, #100] ; (802a780 <HTTP_ConfirmWebPwd+0x168>)
  27726. 802a71a: 4628 mov r0, r5
  27727. 802a71c: f7f7 fa36 bl 8021b8c <strcat>
  27728. strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
  27729. 802a720: 4918 ldr r1, [pc, #96] ; (802a784 <HTTP_ConfirmWebPwd+0x16c>)
  27730. 802a722: 4628 mov r0, r5
  27731. 802a724: f7f7 fa32 bl 8021b8c <strcat>
  27732. *lenBufOut = strlen(bufOut);
  27733. 802a728: 4628 mov r0, r5
  27734. 802a72a: f7f7 fba1 bl 8021e70 <strlen>
  27735. switch (user_id) {
  27736. case 0:
  27737. snprintf(buf, sizeof(buf), "Администратор");
  27738. break;
  27739. case 1:
  27740. snprintf(buf, sizeof(buf), "Пользователь");
  27741. 802a72e: 2128 movs r1, #40 ; 0x28
  27742. strcat(bufOut, "\r\n\r\n");
  27743. strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
  27744. *lenBufOut = strlen(bufOut);
  27745. switch (user_id) {
  27746. 802a730: 2c01 cmp r4, #1
  27747. strcat(bufOut, "\r\nSet-Cookie: role=");
  27748. strcat(bufOut, tempStr);
  27749. strcat(bufOut, "\r\n\r\n");
  27750. strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
  27751. *lenBufOut = strlen(bufOut);
  27752. 802a732: f8a8 0000 strh.w r0, [r8]
  27753. switch (user_id) {
  27754. case 0:
  27755. snprintf(buf, sizeof(buf), "Администратор");
  27756. 802a736: bf14 ite ne
  27757. 802a738: 4a13 ldrne r2, [pc, #76] ; (802a788 <HTTP_ConfirmWebPwd+0x170>)
  27758. break;
  27759. case 1:
  27760. snprintf(buf, sizeof(buf), "Пользователь");
  27761. 802a73a: 4a14 ldreq r2, [pc, #80] ; (802a78c <HTTP_ConfirmWebPwd+0x174>)
  27762. 802a73c: a811 add r0, sp, #68 ; 0x44
  27763. 802a73e: f7fc ffe3 bl 8027708 <tfp_snprintf>
  27764. break;
  27765. }
  27766. /* Запускаем задачу-таймер логаута. */
  27767. /* TODO отправить ответ серверу о статусе пароля */
  27768. return SEND_REQUIRED_YES;
  27769. 802a742: 4630 mov r0, r6
  27770. case 0:
  27771. snprintf(buf, sizeof(buf), "Администратор");
  27772. break;
  27773. case 1:
  27774. snprintf(buf, sizeof(buf), "Пользователь");
  27775. break;
  27776. 802a744: e004 b.n 802a750 <HTTP_ConfirmWebPwd+0x138>
  27777. strcat(tempStr, " ");
  27778. if (GetParamValue(tempStr, "login=", login, &valueLen) &&
  27779. GetParamValue(tempStr, "password=", password, &valueLen))
  27780. {
  27781. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  27782. 802a746: 3401 adds r4, #1
  27783. 802a748: b2e4 uxtb r4, r4
  27784. 802a74a: 2c02 cmp r4, #2
  27785. 802a74c: d08b beq.n 802a666 <HTTP_ConfirmWebPwd+0x4e>
  27786. 802a74e: e799 b.n 802a684 <HTTP_ConfirmWebPwd+0x6c>
  27787. /* TODO replace global flag with user-pass-cookie*/
  27788. Authenticated = false;
  27789. /* Wrong login or pass, return */
  27790. return SEND_REQUIRED_NO;
  27791. }
  27792. 802a750: b028 add sp, #160 ; 0xa0
  27793. 802a752: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  27794. 802a756: bf00 nop
  27795. 802a758: 08035f57 .word 0x08035f57
  27796. 802a75c: 0803a03b .word 0x0803a03b
  27797. 802a760: 20002a39 .word 0x20002a39
  27798. 802a764: 0803a042 .word 0x0803a042
  27799. 802a768: 0803a02c .word 0x0803a02c
  27800. 802a76c: 2000fb5c .word 0x2000fb5c
  27801. 802a770: 0803a04c .word 0x0803a04c
  27802. 802a774: 0803a088 .word 0x0803a088
  27803. 802a778: 08035e55 .word 0x08035e55
  27804. 802a77c: 0803a09a .word 0x0803a09a
  27805. 802a780: 0803a115 .word 0x0803a115
  27806. 802a784: 0803a0ae .word 0x0803a0ae
  27807. 802a788: 0803a11a .word 0x0803a11a
  27808. 802a78c: 0803a135 .word 0x0803a135
  27809. 0802a790 <HTTP_ConfirmBootPwd>:
  27810. /**
  27811. * @brief Проверка пароля для перехода в режим bootloader
  27812. * @retval None
  27813. */
  27814. void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  27815. {
  27816. 802a790: b530 push {r4, r5, lr}
  27817. 802a792: 4602 mov r2, r0
  27818. 802a794: b095 sub sp, #84 ; 0x54
  27819. 802a796: 460c mov r4, r1
  27820. char tempStr[50];
  27821. strncpy(tempStr, bufIn, 50);
  27822. 802a798: a807 add r0, sp, #28
  27823. 802a79a: 4611 mov r1, r2
  27824. 802a79c: 2232 movs r2, #50 ; 0x32
  27825. /**
  27826. * @brief Проверка пароля для перехода в режим bootloader
  27827. * @retval None
  27828. */
  27829. void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  27830. {
  27831. 802a79e: 461d mov r5, r3
  27832. char tempStr[50];
  27833. strncpy(tempStr, bufIn, 50);
  27834. 802a7a0: f7f7 fc1e bl 8021fe0 <strncpy>
  27835. char value[20];
  27836. uint8_t valueLen;
  27837. memset(value, 0, 20);
  27838. 802a7a4: 2100 movs r1, #0
  27839. 802a7a6: 2214 movs r2, #20
  27840. 802a7a8: a802 add r0, sp, #8
  27841. 802a7aa: f7f7 f989 bl 8021ac0 <memset>
  27842. if (GetParamValue(tempStr, "password=", value, &valueLen))
  27843. 802a7ae: a807 add r0, sp, #28
  27844. 802a7b0: 490b ldr r1, [pc, #44] ; (802a7e0 <HTTP_ConfirmBootPwd+0x50>)
  27845. 802a7b2: aa02 add r2, sp, #8
  27846. 802a7b4: f10d 0307 add.w r3, sp, #7
  27847. 802a7b8: f7ff ff00 bl 802a5bc <GetParamValue>
  27848. 802a7bc: b170 cbz r0, 802a7dc <HTTP_ConfirmBootPwd+0x4c>
  27849. {
  27850. if (strcmp(BOOTLOADER_PASWORD, value) == 0)
  27851. 802a7be: 4809 ldr r0, [pc, #36] ; (802a7e4 <HTTP_ConfirmBootPwd+0x54>)
  27852. 802a7c0: a902 add r1, sp, #8
  27853. 802a7c2: f7f7 fa09 bl 8021bd8 <strcmp>
  27854. 802a7c6: b928 cbnz r0, 802a7d4 <HTTP_ConfirmBootPwd+0x44>
  27855. {
  27856. *bufOut = '1';
  27857. 802a7c8: 2331 movs r3, #49 ; 0x31
  27858. 802a7ca: 7023 strb r3, [r4, #0]
  27859. /* Запускаем задачу отложенной перезагрузки. Контроллер должен успеть
  27860. отправить ответ серверу о статусе пароля */
  27861. HTTP_StartResetTask(true);
  27862. 802a7cc: 2001 movs r0, #1
  27863. 802a7ce: f001 fa55 bl 802bc7c <HTTP_StartResetTask>
  27864. 802a7d2: e001 b.n 802a7d8 <HTTP_ConfirmBootPwd+0x48>
  27865. }
  27866. else
  27867. *bufOut = '0';
  27868. 802a7d4: 2330 movs r3, #48 ; 0x30
  27869. 802a7d6: 7023 strb r3, [r4, #0]
  27870. *lenBufOut = 1;
  27871. 802a7d8: 2301 movs r3, #1
  27872. 802a7da: 802b strh r3, [r5, #0]
  27873. }
  27874. }
  27875. 802a7dc: b015 add sp, #84 ; 0x54
  27876. 802a7de: bd30 pop {r4, r5, pc}
  27877. 802a7e0: 0803a042 .word 0x0803a042
  27878. 802a7e4: 0803a14e .word 0x0803a14e
  27879. 0802a7e8 <GetCookieValue>:
  27880. /**
  27881. * @brief
  27882. * @retval None
  27883. */
  27884. uint8_t GetCookieValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen)
  27885. {
  27886. 802a7e8: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  27887. 802a7ec: 4690 mov r8, r2
  27888. 802a7ee: 461f mov r7, r3
  27889. char *beginValue = 0;
  27890. char *endValue = 0;
  27891. int len = 0;
  27892. char *strPtr = 0;
  27893. strPtr = strstr(inStr, paramName);
  27894. 802a7f0: f7f7 fdbe bl 8022370 <strstr>
  27895. if (strPtr != 0)
  27896. 802a7f4: 4605 mov r5, r0
  27897. 802a7f6: b1e0 cbz r0, 802a832 <GetCookieValue+0x4a>
  27898. {
  27899. beginValue = strpbrk(strPtr,"=");
  27900. 802a7f8: 490f ldr r1, [pc, #60] ; (802a838 <GetCookieValue+0x50>)
  27901. 802a7fa: f7f7 fc23 bl 8022044 <strpbrk>
  27902. endValue = strpbrk(strPtr,";");
  27903. 802a7fe: 490f ldr r1, [pc, #60] ; (802a83c <GetCookieValue+0x54>)
  27904. strPtr = strstr(inStr, paramName);
  27905. if (strPtr != 0)
  27906. {
  27907. beginValue = strpbrk(strPtr,"=");
  27908. 802a800: 4606 mov r6, r0
  27909. endValue = strpbrk(strPtr,";");
  27910. 802a802: 4628 mov r0, r5
  27911. 802a804: f7f7 fc1e bl 8022044 <strpbrk>
  27912. if (endValue == 0)
  27913. 802a808: 4604 mov r4, r0
  27914. 802a80a: b920 cbnz r0, 802a816 <GetCookieValue+0x2e>
  27915. endValue = strpbrk(strPtr,"\n");
  27916. 802a80c: 4628 mov r0, r5
  27917. 802a80e: 490c ldr r1, [pc, #48] ; (802a840 <GetCookieValue+0x58>)
  27918. 802a810: f7f7 fc18 bl 8022044 <strpbrk>
  27919. 802a814: 4604 mov r4, r0
  27920. len = endValue - beginValue - 1;
  27921. 802a816: 1ba5 subs r5, r4, r6
  27922. 802a818: 3d01 subs r5, #1
  27923. strncpy(paramValue, beginValue + 1, len);
  27924. 802a81a: 4640 mov r0, r8
  27925. 802a81c: 1c71 adds r1, r6, #1
  27926. 802a81e: 462a mov r2, r5
  27927. 802a820: f7f7 fbde bl 8021fe0 <strncpy>
  27928. *endValue = '0';
  27929. 802a824: 2330 movs r3, #48 ; 0x30
  27930. 802a826: 7023 strb r3, [r4, #0]
  27931. *beginValue = '0';
  27932. *paramLen = len;
  27933. return 1;
  27934. 802a828: 2001 movs r0, #1
  27935. if (endValue == 0)
  27936. endValue = strpbrk(strPtr,"\n");
  27937. len = endValue - beginValue - 1;
  27938. strncpy(paramValue, beginValue + 1, len);
  27939. *endValue = '0';
  27940. *beginValue = '0';
  27941. 802a82a: 7033 strb r3, [r6, #0]
  27942. *paramLen = len;
  27943. 802a82c: 703d strb r5, [r7, #0]
  27944. return 1;
  27945. 802a82e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  27946. }
  27947. else
  27948. {
  27949. *paramLen = 0;
  27950. 802a832: 7038 strb r0, [r7, #0]
  27951. return 0;
  27952. }
  27953. }
  27954. 802a834: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  27955. 802a838: 0803a205 .word 0x0803a205
  27956. 802a83c: 0803a157 .word 0x0803a157
  27957. 802a840: 0803a118 .word 0x0803a118
  27958. 0802a844 <ClearParamString>:
  27959. }
  27960. }
  27961. */
  27962. void ClearParamString(char *inBuf)
  27963. {
  27964. 802a844: b510 push {r4, lr}
  27965. uint16_t len;
  27966. char *str;
  27967. str = strstr(inBuf, "HTTP");
  27968. 802a846: 4908 ldr r1, [pc, #32] ; (802a868 <ClearParamString+0x24>)
  27969. }
  27970. }
  27971. */
  27972. void ClearParamString(char *inBuf)
  27973. {
  27974. 802a848: 4604 mov r4, r0
  27975. uint16_t len;
  27976. char *str;
  27977. str = strstr(inBuf, "HTTP");
  27978. 802a84a: f7f7 fd91 bl 8022370 <strstr>
  27979. if (str != 0)
  27980. 802a84e: b148 cbz r0, 802a864 <ClearParamString+0x20>
  27981. {
  27982. len = str - inBuf;
  27983. 802a850: 1b02 subs r2, r0, r4
  27984. memset(str, 0, RECIVE_BUF_MAX_LEN - len - 1);
  27985. 802a852: b292 uxth r2, r2
  27986. 802a854: f5c2 62bb rsb r2, r2, #1496 ; 0x5d8
  27987. 802a858: 2100 movs r1, #0
  27988. 802a85a: 3203 adds r2, #3
  27989. }
  27990. }
  27991. 802a85c: e8bd 4010 ldmia.w sp!, {r4, lr}
  27992. str = strstr(inBuf, "HTTP");
  27993. if (str != 0)
  27994. {
  27995. len = str - inBuf;
  27996. memset(str, 0, RECIVE_BUF_MAX_LEN - len - 1);
  27997. 802a860: f7f7 b92e b.w 8021ac0 <memset>
  27998. 802a864: bd10 pop {r4, pc}
  27999. 802a866: bf00 nop
  28000. 802a868: 0803a159 .word 0x0803a159
  28001. 0802a86c <HTTP_SetSettings>:
  28002. /**
  28003. * @brief
  28004. * @retval None
  28005. */
  28006. void HTTP_SetSettings(char *buf, uint16_t lenBuf)
  28007. {
  28008. 802a86c: b530 push {r4, r5, lr}
  28009. 802a86e: b0a3 sub sp, #140 ; 0x8c
  28010. uint8_t valueLen = 0;
  28011. 802a870: 2500 movs r5, #0
  28012. /**
  28013. * @brief
  28014. * @retval None
  28015. */
  28016. void HTTP_SetSettings(char *buf, uint16_t lenBuf)
  28017. {
  28018. 802a872: 4604 mov r4, r0
  28019. uint8_t valueLen = 0;
  28020. 802a874: f88d 5007 strb.w r5, [sp, #7]
  28021. char value[MAX_WEB_PARAM_LEN];
  28022. char str[MAX_WEB_PARAM_LEN];
  28023. //printf(buf);
  28024. ClearParamString(buf);
  28025. 802a878: f7ff ffe4 bl 802a844 <ClearParamString>
  28026. memset(value, 0, len);
  28027. 802a87c: 2240 movs r2, #64 ; 0x40
  28028. 802a87e: 4629 mov r1, r5
  28029. 802a880: a802 add r0, sp, #8
  28030. 802a882: f7f7 f91d bl 8021ac0 <memset>
  28031. memset(str, 0, MAX_WEB_PARAM_LEN);
  28032. 802a886: 2240 movs r2, #64 ; 0x40
  28033. 802a888: 4629 mov r1, r5
  28034. 802a88a: a812 add r0, sp, #72 ; 0x48
  28035. 802a88c: f7f7 f918 bl 8021ac0 <memset>
  28036. /* SNMP */
  28037. GetParamValue(buf, "read_community=", value, &valueLen);
  28038. 802a890: f10d 0307 add.w r3, sp, #7
  28039. 802a894: 49a5 ldr r1, [pc, #660] ; (802ab2c <HTTP_SetSettings+0x2c0>)
  28040. 802a896: aa02 add r2, sp, #8
  28041. 802a898: 4620 mov r0, r4
  28042. 802a89a: f7ff fe8f bl 802a5bc <GetParamValue>
  28043. SetReadCommunity(value);
  28044. 802a89e: a802 add r0, sp, #8
  28045. 802a8a0: f7fd fb86 bl 8027fb0 <SetReadCommunity>
  28046. memset(value, 0, len);
  28047. 802a8a4: 2240 movs r2, #64 ; 0x40
  28048. 802a8a6: 4629 mov r1, r5
  28049. 802a8a8: a802 add r0, sp, #8
  28050. 802a8aa: f7f7 f909 bl 8021ac0 <memset>
  28051. GetParamValue(buf, "write_community=", value, &valueLen);
  28052. 802a8ae: f10d 0307 add.w r3, sp, #7
  28053. 802a8b2: 499f ldr r1, [pc, #636] ; (802ab30 <HTTP_SetSettings+0x2c4>)
  28054. 802a8b4: aa02 add r2, sp, #8
  28055. 802a8b6: 4620 mov r0, r4
  28056. 802a8b8: f7ff fe80 bl 802a5bc <GetParamValue>
  28057. SetWriteCommunity(value);
  28058. 802a8bc: a802 add r0, sp, #8
  28059. 802a8be: f7fd fb7d bl 8027fbc <SetWriteCommunity>
  28060. memset(value, 0, len);
  28061. 802a8c2: 2240 movs r2, #64 ; 0x40
  28062. 802a8c4: 4629 mov r1, r5
  28063. 802a8c6: a802 add r0, sp, #8
  28064. 802a8c8: f7f7 f8fa bl 8021ac0 <memset>
  28065. GetParamValue(buf, "managerIP=", value, &valueLen);
  28066. 802a8cc: f10d 0307 add.w r3, sp, #7
  28067. 802a8d0: 4998 ldr r1, [pc, #608] ; (802ab34 <HTTP_SetSettings+0x2c8>)
  28068. 802a8d2: aa02 add r2, sp, #8
  28069. 802a8d4: 4620 mov r0, r4
  28070. 802a8d6: f7ff fe71 bl 802a5bc <GetParamValue>
  28071. SetManagerIp(value);
  28072. 802a8da: a802 add r0, sp, #8
  28073. 802a8dc: f7fd fb74 bl 8027fc8 <SetManagerIp>
  28074. memset(value, 0, len);
  28075. 802a8e0: 2240 movs r2, #64 ; 0x40
  28076. 802a8e2: 4629 mov r1, r5
  28077. 802a8e4: a802 add r0, sp, #8
  28078. 802a8e6: f7f7 f8eb bl 8021ac0 <memset>
  28079. GetParamValue(buf, "managerIP2=", value, &valueLen);
  28080. 802a8ea: f10d 0307 add.w r3, sp, #7
  28081. 802a8ee: 4992 ldr r1, [pc, #584] ; (802ab38 <HTTP_SetSettings+0x2cc>)
  28082. 802a8f0: aa02 add r2, sp, #8
  28083. 802a8f2: 4620 mov r0, r4
  28084. 802a8f4: f7ff fe62 bl 802a5bc <GetParamValue>
  28085. SetManagerIp2(value);
  28086. 802a8f8: a802 add r0, sp, #8
  28087. 802a8fa: f7fd fb73 bl 8027fe4 <SetManagerIp2>
  28088. memset(value, 0, len);
  28089. 802a8fe: 2240 movs r2, #64 ; 0x40
  28090. 802a900: 4629 mov r1, r5
  28091. 802a902: a802 add r0, sp, #8
  28092. 802a904: f7f7 f8dc bl 8021ac0 <memset>
  28093. GetParamValue(buf, "managerIP3=", value, &valueLen);
  28094. 802a908: f10d 0307 add.w r3, sp, #7
  28095. 802a90c: 498b ldr r1, [pc, #556] ; (802ab3c <HTTP_SetSettings+0x2d0>)
  28096. 802a90e: aa02 add r2, sp, #8
  28097. 802a910: 4620 mov r0, r4
  28098. 802a912: f7ff fe53 bl 802a5bc <GetParamValue>
  28099. SetManagerIp3(value);
  28100. 802a916: a802 add r0, sp, #8
  28101. 802a918: f7fd fb72 bl 8028000 <SetManagerIp3>
  28102. memset(value, 0, len);
  28103. 802a91c: 2240 movs r2, #64 ; 0x40
  28104. 802a91e: 4629 mov r1, r5
  28105. 802a920: a802 add r0, sp, #8
  28106. 802a922: f7f7 f8cd bl 8021ac0 <memset>
  28107. GetParamValue(buf, "managerIP4=", value, &valueLen);
  28108. 802a926: f10d 0307 add.w r3, sp, #7
  28109. 802a92a: 4985 ldr r1, [pc, #532] ; (802ab40 <HTTP_SetSettings+0x2d4>)
  28110. 802a92c: aa02 add r2, sp, #8
  28111. 802a92e: 4620 mov r0, r4
  28112. 802a930: f7ff fe44 bl 802a5bc <GetParamValue>
  28113. SetManagerIp4(value);
  28114. 802a934: a802 add r0, sp, #8
  28115. 802a936: f7fd fb71 bl 802801c <SetManagerIp4>
  28116. memset(value, 0, len);
  28117. 802a93a: 2240 movs r2, #64 ; 0x40
  28118. 802a93c: 4629 mov r1, r5
  28119. 802a93e: a802 add r0, sp, #8
  28120. 802a940: f7f7 f8be bl 8021ac0 <memset>
  28121. GetParamValue(buf, "managerIP5=", value, &valueLen);
  28122. 802a944: f10d 0307 add.w r3, sp, #7
  28123. 802a948: 497e ldr r1, [pc, #504] ; (802ab44 <HTTP_SetSettings+0x2d8>)
  28124. 802a94a: aa02 add r2, sp, #8
  28125. 802a94c: 4620 mov r0, r4
  28126. 802a94e: f7ff fe35 bl 802a5bc <GetParamValue>
  28127. SetManagerIp5(value);
  28128. 802a952: a802 add r0, sp, #8
  28129. 802a954: f7fd fb70 bl 8028038 <SetManagerIp5>
  28130. memset(value, 0, len);
  28131. 802a958: 4629 mov r1, r5
  28132. 802a95a: 2240 movs r2, #64 ; 0x40
  28133. 802a95c: a802 add r0, sp, #8
  28134. 802a95e: f7f7 f8af bl 8021ac0 <memset>
  28135. /* Сетевые параметры */
  28136. GetParamValue(buf, "dhcp=", value, &valueLen);
  28137. 802a962: 4979 ldr r1, [pc, #484] ; (802ab48 <HTTP_SetSettings+0x2dc>)
  28138. 802a964: aa02 add r2, sp, #8
  28139. 802a966: f10d 0307 add.w r3, sp, #7
  28140. 802a96a: 4620 mov r0, r4
  28141. 802a96c: f7ff fe26 bl 802a5bc <GetParamValue>
  28142. SetDhcpStateStr(value);
  28143. 802a970: a802 add r0, sp, #8
  28144. 802a972: f7fd fb0b bl 8027f8c <SetDhcpStateStr>
  28145. if (strncmp(value, "on", 2) != 0) // Если dhcp off устанавливаем параметры
  28146. 802a976: a802 add r0, sp, #8
  28147. 802a978: 4974 ldr r1, [pc, #464] ; (802ab4c <HTTP_SetSettings+0x2e0>)
  28148. 802a97a: 2202 movs r2, #2
  28149. 802a97c: f7f7 fada bl 8021f34 <strncmp>
  28150. 802a980: 2800 cmp r0, #0
  28151. 802a982: d031 beq.n 802a9e8 <HTTP_SetSettings+0x17c>
  28152. {
  28153. memset(value, 0, len);
  28154. 802a984: 4629 mov r1, r5
  28155. 802a986: 2240 movs r2, #64 ; 0x40
  28156. 802a988: a802 add r0, sp, #8
  28157. 802a98a: f7f7 f899 bl 8021ac0 <memset>
  28158. GetParamValue(buf, "ipaddr=", value, &valueLen);
  28159. 802a98e: f10d 0307 add.w r3, sp, #7
  28160. 802a992: 496f ldr r1, [pc, #444] ; (802ab50 <HTTP_SetSettings+0x2e4>)
  28161. 802a994: aa02 add r2, sp, #8
  28162. 802a996: 4620 mov r0, r4
  28163. 802a998: f7ff fe10 bl 802a5bc <GetParamValue>
  28164. SetIPStr(value);
  28165. 802a99c: a802 add r0, sp, #8
  28166. 802a99e: f7fd fae3 bl 8027f68 <SetIPStr>
  28167. memset(value, 0, len);
  28168. 802a9a2: 4629 mov r1, r5
  28169. 802a9a4: 2240 movs r2, #64 ; 0x40
  28170. 802a9a6: a802 add r0, sp, #8
  28171. 802a9a8: f7f7 f88a bl 8021ac0 <memset>
  28172. GetParamValue(buf, "gw=", value, &valueLen);
  28173. 802a9ac: f10d 0307 add.w r3, sp, #7
  28174. 802a9b0: 4968 ldr r1, [pc, #416] ; (802ab54 <HTTP_SetSettings+0x2e8>)
  28175. 802a9b2: aa02 add r2, sp, #8
  28176. 802a9b4: 4620 mov r0, r4
  28177. 802a9b6: f7ff fe01 bl 802a5bc <GetParamValue>
  28178. SetGatewayStr(value);
  28179. 802a9ba: a802 add r0, sp, #8
  28180. 802a9bc: f7fd fada bl 8027f74 <SetGatewayStr>
  28181. memset(value, 0, len);
  28182. 802a9c0: 4629 mov r1, r5
  28183. 802a9c2: 2240 movs r2, #64 ; 0x40
  28184. 802a9c4: a802 add r0, sp, #8
  28185. 802a9c6: f7f7 f87b bl 8021ac0 <memset>
  28186. GetParamValue(buf, "mask=", value, &valueLen);
  28187. 802a9ca: 4963 ldr r1, [pc, #396] ; (802ab58 <HTTP_SetSettings+0x2ec>)
  28188. 802a9cc: aa02 add r2, sp, #8
  28189. 802a9ce: f10d 0307 add.w r3, sp, #7
  28190. 802a9d2: 4620 mov r0, r4
  28191. 802a9d4: f7ff fdf2 bl 802a5bc <GetParamValue>
  28192. SetMaskStr(value);
  28193. 802a9d8: a802 add r0, sp, #8
  28194. 802a9da: f7fd fad1 bl 8027f80 <SetMaskStr>
  28195. memset(value, 0, len);
  28196. 802a9de: a802 add r0, sp, #8
  28197. 802a9e0: 4629 mov r1, r5
  28198. 802a9e2: 2240 movs r2, #64 ; 0x40
  28199. 802a9e4: f7f7 f86c bl 8021ac0 <memset>
  28200. }
  28201. memset(value, 0, len);
  28202. 802a9e8: 2100 movs r1, #0
  28203. 802a9ea: 2240 movs r2, #64 ; 0x40
  28204. 802a9ec: a802 add r0, sp, #8
  28205. 802a9ee: f7f7 f867 bl 8021ac0 <memset>
  28206. /* параметры RADIUS*/
  28207. GetParamValue(buf, "rs_enabled=", value, &valueLen);
  28208. 802a9f2: f10d 0307 add.w r3, sp, #7
  28209. 802a9f6: 4959 ldr r1, [pc, #356] ; (802ab5c <HTTP_SetSettings+0x2f0>)
  28210. 802a9f8: aa02 add r2, sp, #8
  28211. 802a9fa: 4620 mov r0, r4
  28212. 802a9fc: f7ff fdde bl 802a5bc <GetParamValue>
  28213. SetRDSEnableStateStr(value);
  28214. 802aa00: a802 add r0, sp, #8
  28215. 802aa02: f7fd fb6b bl 80280dc <SetRDSEnableStateStr>
  28216. memset(value, 0, len);
  28217. 802aa06: 2100 movs r1, #0
  28218. 802aa08: 2240 movs r2, #64 ; 0x40
  28219. 802aa0a: a802 add r0, sp, #8
  28220. 802aa0c: f7f7 f858 bl 8021ac0 <memset>
  28221. GetParamValue(buf, "rs_server=", value, &valueLen);
  28222. 802aa10: f10d 0307 add.w r3, sp, #7
  28223. 802aa14: 4952 ldr r1, [pc, #328] ; (802ab60 <HTTP_SetSettings+0x2f4>)
  28224. 802aa16: aa02 add r2, sp, #8
  28225. 802aa18: 4620 mov r0, r4
  28226. 802aa1a: f7ff fdcf bl 802a5bc <GetParamValue>
  28227. SetRDSIpStr(value);
  28228. 802aa1e: a802 add r0, sp, #8
  28229. 802aa20: f7fd fb3c bl 802809c <SetRDSIpStr>
  28230. memset(value, 0, len);
  28231. 802aa24: 2100 movs r1, #0
  28232. 802aa26: 2240 movs r2, #64 ; 0x40
  28233. 802aa28: a802 add r0, sp, #8
  28234. 802aa2a: f7f7 f849 bl 8021ac0 <memset>
  28235. GetParamValue(buf, "rs_port=", value, &valueLen);
  28236. 802aa2e: f10d 0307 add.w r3, sp, #7
  28237. 802aa32: 494c ldr r1, [pc, #304] ; (802ab64 <HTTP_SetSettings+0x2f8>)
  28238. 802aa34: aa02 add r2, sp, #8
  28239. 802aa36: 4620 mov r0, r4
  28240. 802aa38: f7ff fdc0 bl 802a5bc <GetParamValue>
  28241. SetRDSPortStr(value);
  28242. 802aa3c: a802 add r0, sp, #8
  28243. 802aa3e: f7fd fb33 bl 80280a8 <SetRDSPortStr>
  28244. memset(value, 0, len);
  28245. 802aa42: 2100 movs r1, #0
  28246. 802aa44: 2240 movs r2, #64 ; 0x40
  28247. 802aa46: a802 add r0, sp, #8
  28248. 802aa48: f7f7 f83a bl 8021ac0 <memset>
  28249. GetParamValue(buf, "rs_pwd=", value, &valueLen);
  28250. 802aa4c: f10d 0307 add.w r3, sp, #7
  28251. 802aa50: 4945 ldr r1, [pc, #276] ; (802ab68 <HTTP_SetSettings+0x2fc>)
  28252. 802aa52: aa02 add r2, sp, #8
  28253. 802aa54: 4620 mov r0, r4
  28254. 802aa56: f7ff fdb1 bl 802a5bc <GetParamValue>
  28255. SetRDSPasswordkStr(value);
  28256. 802aa5a: a802 add r0, sp, #8
  28257. 802aa5c: f7fd fb38 bl 80280d0 <SetRDSPasswordkStr>
  28258. memset(value, 0, len);
  28259. 802aa60: 2100 movs r1, #0
  28260. 802aa62: 2240 movs r2, #64 ; 0x40
  28261. 802aa64: a802 add r0, sp, #8
  28262. 802aa66: f7f7 f82b bl 8021ac0 <memset>
  28263. GetParamValue(buf, "rs_key=", value, &valueLen);
  28264. 802aa6a: f10d 0307 add.w r3, sp, #7
  28265. 802aa6e: 493f ldr r1, [pc, #252] ; (802ab6c <HTTP_SetSettings+0x300>)
  28266. 802aa70: aa02 add r2, sp, #8
  28267. 802aa72: 4620 mov r0, r4
  28268. 802aa74: f7ff fda2 bl 802a5bc <GetParamValue>
  28269. SetRDSKeyAccesstStr(value);
  28270. 802aa78: a802 add r0, sp, #8
  28271. 802aa7a: f7fd fb1f bl 80280bc <SetRDSKeyAccesstStr>
  28272. memset(value, 0, len);
  28273. 802aa7e: 2100 movs r1, #0
  28274. 802aa80: 2240 movs r2, #64 ; 0x40
  28275. 802aa82: a802 add r0, sp, #8
  28276. 802aa84: f7f7 f81c bl 8021ac0 <memset>
  28277. // Параметры реле и сухих контактов
  28278. GetParamValue(buf, "di1=", value, &valueLen);
  28279. 802aa88: f10d 0307 add.w r3, sp, #7
  28280. 802aa8c: aa02 add r2, sp, #8
  28281. 802aa8e: 4938 ldr r1, [pc, #224] ; (802ab70 <HTTP_SetSettings+0x304>)
  28282. 802aa90: 4620 mov r0, r4
  28283. 802aa92: f7ff fd93 bl 802a5bc <GetParamValue>
  28284. SetDINTypeActStr(value, 0);
  28285. 802aa96: 2100 movs r1, #0
  28286. 802aa98: a802 add r0, sp, #8
  28287. 802aa9a: f7fd fc15 bl 80282c8 <SetDINTypeActStr>
  28288. memset(value, 0, len);
  28289. 802aa9e: 2100 movs r1, #0
  28290. 802aaa0: 2240 movs r2, #64 ; 0x40
  28291. 802aaa2: a802 add r0, sp, #8
  28292. 802aaa4: f7f7 f80c bl 8021ac0 <memset>
  28293. GetParamValue(buf, "ro1=", value, &valueLen);
  28294. 802aaa8: f10d 0307 add.w r3, sp, #7
  28295. 802aaac: aa02 add r2, sp, #8
  28296. 802aaae: 4931 ldr r1, [pc, #196] ; (802ab74 <HTTP_SetSettings+0x308>)
  28297. 802aab0: 4620 mov r0, r4
  28298. 802aab2: f7ff fd83 bl 802a5bc <GetParamValue>
  28299. SetROTypeActStr(value, 0);
  28300. 802aab6: a802 add r0, sp, #8
  28301. 802aab8: 2100 movs r1, #0
  28302. 802aaba: f7fd fc11 bl 80282e0 <SetROTypeActStr>
  28303. memset(value, 0, len);
  28304. 802aabe: 2100 movs r1, #0
  28305. 802aac0: 2240 movs r2, #64 ; 0x40
  28306. 802aac2: a802 add r0, sp, #8
  28307. 802aac4: f7f6 fffc bl 8021ac0 <memset>
  28308. GetParamValue(buf, "ro2=", value, &valueLen);
  28309. 802aac8: f10d 0307 add.w r3, sp, #7
  28310. 802aacc: aa02 add r2, sp, #8
  28311. 802aace: 492a ldr r1, [pc, #168] ; (802ab78 <HTTP_SetSettings+0x30c>)
  28312. 802aad0: 4620 mov r0, r4
  28313. 802aad2: f7ff fd73 bl 802a5bc <GetParamValue>
  28314. SetROTypeActStr(value, 1);
  28315. 802aad6: a802 add r0, sp, #8
  28316. 802aad8: 2101 movs r1, #1
  28317. 802aada: f7fd fc01 bl 80282e0 <SetROTypeActStr>
  28318. memset(value, 0, len);
  28319. 802aade: 2100 movs r1, #0
  28320. 802aae0: 2240 movs r2, #64 ; 0x40
  28321. 802aae2: a802 add r0, sp, #8
  28322. 802aae4: f7f6 ffec bl 8021ac0 <memset>
  28323. // Параметры даты и времени
  28324. GetParamValue(buf, "ntp=", value, &valueLen);
  28325. 802aae8: 4924 ldr r1, [pc, #144] ; (802ab7c <HTTP_SetSettings+0x310>)
  28326. 802aaea: aa02 add r2, sp, #8
  28327. 802aaec: f10d 0307 add.w r3, sp, #7
  28328. 802aaf0: 4620 mov r0, r4
  28329. 802aaf2: f7ff fd63 bl 802a5bc <GetParamValue>
  28330. SetSntpStateStr(value);
  28331. 802aaf6: a802 add r0, sp, #8
  28332. 802aaf8: f7fd fb6a bl 80281d0 <SetSntpStateStr>
  28333. if (strncmp(value, "1", 1) == 0) // Если ntp on устанавливаем параметры
  28334. 802aafc: a802 add r0, sp, #8
  28335. 802aafe: 4920 ldr r1, [pc, #128] ; (802ab80 <HTTP_SetSettings+0x314>)
  28336. 802ab00: 2201 movs r2, #1
  28337. 802ab02: f7f7 fa17 bl 8021f34 <strncmp>
  28338. 802ab06: 4605 mov r5, r0
  28339. {
  28340. memset(value, 0, len);
  28341. 802ab08: a802 add r0, sp, #8
  28342. // Параметры даты и времени
  28343. GetParamValue(buf, "ntp=", value, &valueLen);
  28344. SetSntpStateStr(value);
  28345. if (strncmp(value, "1", 1) == 0) // Если ntp on устанавливаем параметры
  28346. 802ab0a: 2d00 cmp r5, #0
  28347. 802ab0c: d13c bne.n 802ab88 <HTTP_SetSettings+0x31c>
  28348. {
  28349. memset(value, 0, len);
  28350. 802ab0e: 4629 mov r1, r5
  28351. 802ab10: 2240 movs r2, #64 ; 0x40
  28352. 802ab12: f7f6 ffd5 bl 8021ac0 <memset>
  28353. GetParamValue(buf, "ntpservip=", value, &valueLen);
  28354. 802ab16: 4620 mov r0, r4
  28355. 802ab18: 491a ldr r1, [pc, #104] ; (802ab84 <HTTP_SetSettings+0x318>)
  28356. 802ab1a: aa02 add r2, sp, #8
  28357. 802ab1c: f10d 0307 add.w r3, sp, #7
  28358. 802ab20: f7ff fd4c bl 802a5bc <GetParamValue>
  28359. SetSntpServerIpStr(value);
  28360. 802ab24: a802 add r0, sp, #8
  28361. 802ab26: f7fd fb73 bl 8028210 <SetSntpServerIpStr>
  28362. 802ab2a: e051 b.n 802abd0 <HTTP_SetSettings+0x364>
  28363. 802ab2c: 0803a15e .word 0x0803a15e
  28364. 802ab30: 0803a16e .word 0x0803a16e
  28365. 802ab34: 0803a17f .word 0x0803a17f
  28366. 802ab38: 0803a18a .word 0x0803a18a
  28367. 802ab3c: 0803a196 .word 0x0803a196
  28368. 802ab40: 0803a1a2 .word 0x0803a1a2
  28369. 802ab44: 0803a1ae .word 0x0803a1ae
  28370. 802ab48: 0803a1ba .word 0x0803a1ba
  28371. 802ab4c: 08035e94 .word 0x08035e94
  28372. 802ab50: 0803a1c0 .word 0x0803a1c0
  28373. 802ab54: 0803a1c8 .word 0x0803a1c8
  28374. 802ab58: 0803a1cc .word 0x0803a1cc
  28375. 802ab5c: 0803a1d2 .word 0x0803a1d2
  28376. 802ab60: 0803a1de .word 0x0803a1de
  28377. 802ab64: 0803a1e9 .word 0x0803a1e9
  28378. 802ab68: 0803a1f2 .word 0x0803a1f2
  28379. 802ab6c: 0803a1fa .word 0x0803a1fa
  28380. 802ab70: 0803a202 .word 0x0803a202
  28381. 802ab74: 0803a207 .word 0x0803a207
  28382. 802ab78: 0803a20c .word 0x0803a20c
  28383. 802ab7c: 0803a211 .word 0x0803a211
  28384. 802ab80: 08035f50 .word 0x08035f50
  28385. 802ab84: 0803a216 .word 0x0803a216
  28386. memset(value, 0, len);
  28387. }
  28388. else if (strncmp(value, "0", 1) == 0){
  28389. 802ab88: 4929 ldr r1, [pc, #164] ; (802ac30 <HTTP_SetSettings+0x3c4>)
  28390. 802ab8a: 2201 movs r2, #1
  28391. 802ab8c: f7f7 f9d2 bl 8021f34 <strncmp>
  28392. 802ab90: 4605 mov r5, r0
  28393. 802ab92: bb10 cbnz r0, 802abda <HTTP_SetSettings+0x36e>
  28394. GetParamValue(buf, "date=", value, &valueLen);
  28395. 802ab94: f10d 0307 add.w r3, sp, #7
  28396. 802ab98: 4926 ldr r1, [pc, #152] ; (802ac34 <HTTP_SetSettings+0x3c8>)
  28397. 802ab9a: aa02 add r2, sp, #8
  28398. 802ab9c: 4620 mov r0, r4
  28399. 802ab9e: f7ff fd0d bl 802a5bc <GetParamValue>
  28400. SetDateStr(value);
  28401. 802aba2: a802 add r0, sp, #8
  28402. 802aba4: f7fd faac bl 8028100 <SetDateStr>
  28403. memset(value, 0, len);
  28404. 802aba8: 4629 mov r1, r5
  28405. 802abaa: 2240 movs r2, #64 ; 0x40
  28406. 802abac: a802 add r0, sp, #8
  28407. 802abae: f7f6 ff87 bl 8021ac0 <memset>
  28408. GetParamValue(buf, "time=", value, &valueLen);
  28409. 802abb2: 4921 ldr r1, [pc, #132] ; (802ac38 <HTTP_SetSettings+0x3cc>)
  28410. 802abb4: aa02 add r2, sp, #8
  28411. 802abb6: f10d 0307 add.w r3, sp, #7
  28412. 802abba: 4620 mov r0, r4
  28413. 802abbc: f7ff fcfe bl 802a5bc <GetParamValue>
  28414. url_decode(str, sizeof(str), value);
  28415. 802abc0: a812 add r0, sp, #72 ; 0x48
  28416. 802abc2: 2140 movs r1, #64 ; 0x40
  28417. 802abc4: aa02 add r2, sp, #8
  28418. 802abc6: f7fd fddd bl 8028784 <url_decode>
  28419. SetTimeStr(str);
  28420. 802abca: a812 add r0, sp, #72 ; 0x48
  28421. 802abcc: f7fd fad0 bl 8028170 <SetTimeStr>
  28422. memset(value, 0, len);
  28423. 802abd0: a802 add r0, sp, #8
  28424. 802abd2: 4629 mov r1, r5
  28425. 802abd4: 2240 movs r2, #64 ; 0x40
  28426. 802abd6: f7f6 ff73 bl 8021ac0 <memset>
  28427. }
  28428. GetParamValue(buf, "utc=", value, &valueLen);
  28429. 802abda: 4918 ldr r1, [pc, #96] ; (802ac3c <HTTP_SetSettings+0x3d0>)
  28430. 802abdc: aa02 add r2, sp, #8
  28431. 802abde: f10d 0307 add.w r3, sp, #7
  28432. 802abe2: 4620 mov r0, r4
  28433. 802abe4: f7ff fcea bl 802a5bc <GetParamValue>
  28434. SetSntpTimeZoneStr(value);
  28435. 802abe8: a802 add r0, sp, #8
  28436. 802abea: f7fd fb17 bl 802821c <SetSntpTimeZoneStr>
  28437. memset(value, 0, len);
  28438. 802abee: 2100 movs r1, #0
  28439. 802abf0: 2240 movs r2, #64 ; 0x40
  28440. 802abf2: a802 add r0, sp, #8
  28441. 802abf4: f7f6 ff64 bl 8021ac0 <memset>
  28442. /* Если параметры WEB изменились выставляем флаг, сохраняем настройки и перезагружаемся */
  28443. if (GetStateWebReinit() == true)
  28444. 802abf8: f00a f832 bl 8034c60 <GetStateWebReinit>
  28445. 802abfc: b1a0 cbz r0, 802ac28 <HTTP_SetSettings+0x3bc>
  28446. {
  28447. SetWebReinitFlag(true);
  28448. 802abfe: 2001 movs r0, #1
  28449. 802ac00: f7fd f9a6 bl 8027f50 <SetWebReinitFlag>
  28450. HTTP_SaveSettings();
  28451. 802ac04: f001 f831 bl 802bc6a <HTTP_SaveSettings>
  28452. /* Блокируем управление ключем на тау секунд*/
  28453. //IO_KeyBlockOn();
  28454. vTaskDelay(1010);
  28455. 802ac08: f240 30f2 movw r0, #1010 ; 0x3f2
  28456. 802ac0c: f7fe fe52 bl 80298b4 <vTaskDelay>
  28457. 802ac10: f3bf 8f4f dsb sy
  28458. (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  28459. 802ac14: 4a0a ldr r2, [pc, #40] ; (802ac40 <HTTP_SetSettings+0x3d4>)
  28460. 802ac16: 4b0b ldr r3, [pc, #44] ; (802ac44 <HTTP_SetSettings+0x3d8>)
  28461. 802ac18: 68d1 ldr r1, [r2, #12]
  28462. 802ac1a: f401 61e0 and.w r1, r1, #1792 ; 0x700
  28463. 802ac1e: 430b orrs r3, r1
  28464. __STATIC_INLINE void NVIC_SystemReset(void)
  28465. //static inline void NVIC_SystemReset(void)
  28466. {
  28467. __DSB(); /* Ensure all outstanding memory accesses included
  28468. buffered write are completed before reset */
  28469. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  28470. 802ac20: 60d3 str r3, [r2, #12]
  28471. 802ac22: f3bf 8f4f dsb sy
  28472. 802ac26: e7fe b.n 802ac26 <HTTP_SetSettings+0x3ba>
  28473. NVIC_SystemReset();
  28474. }
  28475. HTTP_SaveSettings();
  28476. 802ac28: f001 f81f bl 802bc6a <HTTP_SaveSettings>
  28477. }
  28478. 802ac2c: b023 add sp, #140 ; 0x8c
  28479. 802ac2e: bd30 pop {r4, r5, pc}
  28480. 802ac30: 08035ef3 .word 0x08035ef3
  28481. 802ac34: 0803a231 .word 0x0803a231
  28482. 802ac38: 0803a221 .word 0x0803a221
  28483. 802ac3c: 0803a227 .word 0x0803a227
  28484. 802ac40: e000ed00 .word 0xe000ed00
  28485. 802ac44: 05fa0004 .word 0x05fa0004
  28486. 0802ac48 <HTTP_SettingsPage>:
  28487. /**
  28488. * @brief
  28489. * @retval None
  28490. */
  28491. int HTTP_SettingsPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  28492. {
  28493. 802ac48: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  28494. 802ac4c: 4606 mov r6, r0
  28495. 802ac4e: b088 sub sp, #32
  28496. 802ac50: 460c mov r4, r1
  28497. 802ac52: 4690 mov r8, r2
  28498. char tempStr[30];
  28499. strncpy(tempStr, bufIn, 30);
  28500. 802ac54: 4631 mov r1, r6
  28501. 802ac56: 221e movs r2, #30
  28502. 802ac58: 4668 mov r0, sp
  28503. /**
  28504. * @brief
  28505. * @retval None
  28506. */
  28507. int HTTP_SettingsPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  28508. {
  28509. 802ac5a: 461f mov r7, r3
  28510. char tempStr[30];
  28511. strncpy(tempStr, bufIn, 30);
  28512. 802ac5c: f7f7 f9c0 bl 8021fe0 <strncpy>
  28513. /* В запросе нет параметров, нужно формировать JSON ответ */
  28514. if (strpbrk(tempStr,"?") == 0)
  28515. 802ac60: 4668 mov r0, sp
  28516. 802ac62: 490e ldr r1, [pc, #56] ; (802ac9c <HTTP_SettingsPage+0x54>)
  28517. 802ac64: f7f7 f9ee bl 8022044 <strpbrk>
  28518. 802ac68: 4605 mov r5, r0
  28519. 802ac6a: b970 cbnz r0, 802ac8a <HTTP_SettingsPage+0x42>
  28520. {
  28521. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  28522. 802ac6c: 4629 mov r1, r5
  28523. 802ac6e: f44f 62fa mov.w r2, #2000 ; 0x7d0
  28524. 802ac72: 4620 mov r0, r4
  28525. 802ac74: f7f6 ff24 bl 8021ac0 <memset>
  28526. HTTP_GetSettings(bufOut);
  28527. 802ac78: 4620 mov r0, r4
  28528. 802ac7a: f000 fcfb bl 802b674 <HTTP_GetSettings>
  28529. //printf(bufOut);
  28530. *lenBufOut = strlen(bufOut);
  28531. 802ac7e: 4620 mov r0, r4
  28532. 802ac80: f7f7 f8f6 bl 8021e70 <strlen>
  28533. 802ac84: 8038 strh r0, [r7, #0]
  28534. return SEND_REQUIRED_YES;
  28535. 802ac86: 4628 mov r0, r5
  28536. 802ac88: e004 b.n 802ac94 <HTTP_SettingsPage+0x4c>
  28537. }
  28538. /* В запросе есть параметры, нужно парсить и сохранять настройки */
  28539. else
  28540. {
  28541. HTTP_SetSettings(bufIn, lenBufIn);
  28542. 802ac8a: 4630 mov r0, r6
  28543. 802ac8c: 4641 mov r1, r8
  28544. 802ac8e: f7ff fded bl 802a86c <HTTP_SetSettings>
  28545. return SEND_REQUIRED_NO;
  28546. 802ac92: 2001 movs r0, #1
  28547. }
  28548. }
  28549. 802ac94: b008 add sp, #32
  28550. 802ac96: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  28551. 802ac9a: bf00 nop
  28552. 802ac9c: 0803a22c .word 0x0803a22c
  28553. 0802aca0 <HTTP_Prodate>:
  28554. /**
  28555. * @brief Установка даты производства
  28556. */
  28557. // TODO Убрать заглушку!
  28558. void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  28559. {
  28560. 802aca0: b5f0 push {r4, r5, r6, r7, lr}
  28561. uint8_t valueLen = 0;
  28562. 802aca2: 2500 movs r5, #0
  28563. /**
  28564. * @brief Установка даты производства
  28565. */
  28566. // TODO Убрать заглушку!
  28567. void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  28568. {
  28569. 802aca4: b087 sub sp, #28
  28570. 802aca6: 4606 mov r6, r0
  28571. 802aca8: 460c mov r4, r1
  28572. uint8_t valueLen = 0;
  28573. char value[20];
  28574. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  28575. 802acaa: f44f 62fa mov.w r2, #2000 ; 0x7d0
  28576. 802acae: 4608 mov r0, r1
  28577. 802acb0: 4629 mov r1, r5
  28578. /**
  28579. * @brief Установка даты производства
  28580. */
  28581. // TODO Убрать заглушку!
  28582. void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  28583. {
  28584. 802acb2: 461f mov r7, r3
  28585. uint8_t valueLen = 0;
  28586. 802acb4: f88d 5003 strb.w r5, [sp, #3]
  28587. char value[20];
  28588. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  28589. 802acb8: f7f6 ff02 bl 8021ac0 <memset>
  28590. ClearParamString(bufIn);
  28591. 802acbc: 4630 mov r0, r6
  28592. 802acbe: f7ff fdc1 bl 802a844 <ClearParamString>
  28593. memset(value, 0, 20);
  28594. 802acc2: 4629 mov r1, r5
  28595. 802acc4: 2214 movs r2, #20
  28596. 802acc6: a801 add r0, sp, #4
  28597. 802acc8: f7f6 fefa bl 8021ac0 <memset>
  28598. GetParamValue(bufIn, "prodate=", value, &valueLen);
  28599. 802accc: aa01 add r2, sp, #4
  28600. 802acce: f10d 0303 add.w r3, sp, #3
  28601. 802acd2: 490b ldr r1, [pc, #44] ; (802ad00 <HTTP_Prodate+0x60>)
  28602. 802acd4: 4630 mov r0, r6
  28603. 802acd6: f7ff fc71 bl 802a5bc <GetParamValue>
  28604. printf(value);
  28605. printf("\r\n");
  28606. */
  28607. /* Устанавливаем дату производства */
  28608. SETTINGS_SetProDate(value, valueLen);
  28609. 802acda: f89d 1003 ldrb.w r1, [sp, #3]
  28610. 802acde: a801 add r0, sp, #4
  28611. 802ace0: f7fd fd2a bl 8028738 <SETTINGS_SetProDate>
  28612. /* Устанавливаем дату следующей профилактики +1 год */
  28613. RTC_SetProfTime(value);
  28614. 802ace4: a801 add r0, sp, #4
  28615. 802ace6: f7fb fd2b bl 8026740 <RTC_SetProfTime>
  28616. /* Пока отправляем true */
  28617. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\nTrue");
  28618. 802acea: 4906 ldr r1, [pc, #24] ; (802ad04 <HTTP_Prodate+0x64>)
  28619. 802acec: 4620 mov r0, r4
  28620. 802acee: f7f7 f861 bl 8021db4 <strcpy>
  28621. *lenBufOut = strlen(bufOut);
  28622. 802acf2: 4620 mov r0, r4
  28623. 802acf4: f7f7 f8bc bl 8021e70 <strlen>
  28624. 802acf8: 8038 strh r0, [r7, #0]
  28625. // TEST_SetServerFlag();
  28626. }
  28627. 802acfa: b007 add sp, #28
  28628. 802acfc: bdf0 pop {r4, r5, r6, r7, pc}
  28629. 802acfe: bf00 nop
  28630. 802ad00: 0803a22e .word 0x0803a22e
  28631. 802ad04: 0803a237 .word 0x0803a237
  28632. 0802ad08 <HTTP_ReplaceSimbol>:
  28633. * @param *str - входная строка
  28634. * @param sim1 - символ который надо заменить
  28635. * @param sim2 - символ на который надо заменить
  28636. */
  28637. void HTTP_ReplaceSimbol(char *str, char sim1, char sim2)
  28638. {
  28639. 802ad08: b570 push {r4, r5, r6, lr}
  28640. 802ad0a: 4604 mov r4, r0
  28641. 802ad0c: 460d mov r5, r1
  28642. 802ad0e: 4616 mov r6, r2
  28643. uint16_t len = strlen(str);
  28644. 802ad10: f7f7 f8ae bl 8021e70 <strlen>
  28645. for (uint16_t i = 0; i < len; i++)
  28646. 802ad14: 4623 mov r3, r4
  28647. * @param sim1 - символ который надо заменить
  28648. * @param sim2 - символ на который надо заменить
  28649. */
  28650. void HTTP_ReplaceSimbol(char *str, char sim1, char sim2)
  28651. {
  28652. uint16_t len = strlen(str);
  28653. 802ad16: b280 uxth r0, r0
  28654. for (uint16_t i = 0; i < len; i++)
  28655. 802ad18: e005 b.n 802ad26 <HTTP_ReplaceSimbol+0x1e>
  28656. {
  28657. if (*str == sim1)
  28658. 802ad1a: f813 2b01 ldrb.w r2, [r3], #1
  28659. 802ad1e: 42aa cmp r2, r5
  28660. *str = sim2;
  28661. 802ad20: bf08 it eq
  28662. 802ad22: f803 6c01 strbeq.w r6, [r3, #-1]
  28663. */
  28664. void HTTP_ReplaceSimbol(char *str, char sim1, char sim2)
  28665. {
  28666. uint16_t len = strlen(str);
  28667. for (uint16_t i = 0; i < len; i++)
  28668. 802ad26: 1b1a subs r2, r3, r4
  28669. 802ad28: b292 uxth r2, r2
  28670. 802ad2a: 4282 cmp r2, r0
  28671. 802ad2c: d3f5 bcc.n 802ad1a <HTTP_ReplaceSimbol+0x12>
  28672. {
  28673. if (*str == sim1)
  28674. *str = sim2;
  28675. str++;
  28676. }
  28677. }
  28678. 802ad2e: bd70 pop {r4, r5, r6, pc}
  28679. 0802ad30 <HTTP_SetInfo>:
  28680. /**
  28681. * @brief
  28682. * @retval None
  28683. */
  28684. void HTTP_SetInfo(char *buf, uint16_t lenBuf)
  28685. {
  28686. 802ad30: b530 push {r4, r5, lr}
  28687. 802ad32: b09f sub sp, #124 ; 0x7c
  28688. uint8_t valueLen = 0;
  28689. 802ad34: 2400 movs r4, #0
  28690. /**
  28691. * @brief
  28692. * @retval None
  28693. */
  28694. void HTTP_SetInfo(char *buf, uint16_t lenBuf)
  28695. {
  28696. 802ad36: 4605 mov r5, r0
  28697. uint8_t valueLen = 0;
  28698. 802ad38: f88d 4007 strb.w r4, [sp, #7]
  28699. const uint8_t len = 110;
  28700. char value[110];
  28701. ClearParamString(buf);
  28702. 802ad3c: f7ff fd82 bl 802a844 <ClearParamString>
  28703. memset(value, 0, len);
  28704. 802ad40: 4621 mov r1, r4
  28705. 802ad42: 226e movs r2, #110 ; 0x6e
  28706. 802ad44: a802 add r0, sp, #8
  28707. 802ad46: f7f6 febb bl 8021ac0 <memset>
  28708. /* Владелец */
  28709. GetParamValue(buf, "owner=", value, &valueLen);
  28710. 802ad4a: f10d 0307 add.w r3, sp, #7
  28711. 802ad4e: aa02 add r2, sp, #8
  28712. 802ad50: 4628 mov r0, r5
  28713. 802ad52: 491e ldr r1, [pc, #120] ; (802adcc <HTTP_SetInfo+0x9c>)
  28714. 802ad54: f7ff fc32 bl 802a5bc <GetParamValue>
  28715. HTTP_ReplaceSimbol(value, '+', ' ');
  28716. 802ad58: 212b movs r1, #43 ; 0x2b
  28717. 802ad5a: 2220 movs r2, #32
  28718. 802ad5c: a802 add r0, sp, #8
  28719. 802ad5e: f7ff ffd3 bl 802ad08 <HTTP_ReplaceSimbol>
  28720. SetOwner(value);
  28721. 802ad62: a802 add r0, sp, #8
  28722. 802ad64: f7fd f976 bl 8028054 <SetOwner>
  28723. memset(value, 0, len);
  28724. 802ad68: 4621 mov r1, r4
  28725. 802ad6a: 226e movs r2, #110 ; 0x6e
  28726. 802ad6c: a802 add r0, sp, #8
  28727. 802ad6e: f7f6 fea7 bl 8021ac0 <memset>
  28728. /* Владелец */
  28729. GetParamValue(buf, "sysLocation=", value, &valueLen);
  28730. 802ad72: f10d 0307 add.w r3, sp, #7
  28731. 802ad76: aa02 add r2, sp, #8
  28732. 802ad78: 4628 mov r0, r5
  28733. 802ad7a: 4915 ldr r1, [pc, #84] ; (802add0 <HTTP_SetInfo+0xa0>)
  28734. 802ad7c: f7ff fc1e bl 802a5bc <GetParamValue>
  28735. HTTP_ReplaceSimbol(value, '+', ' ');
  28736. 802ad80: 212b movs r1, #43 ; 0x2b
  28737. 802ad82: 2220 movs r2, #32
  28738. 802ad84: a802 add r0, sp, #8
  28739. 802ad86: f7ff ffbf bl 802ad08 <HTTP_ReplaceSimbol>
  28740. SetLocation(value);
  28741. 802ad8a: a802 add r0, sp, #8
  28742. 802ad8c: f7fd f972 bl 8028074 <SetLocation>
  28743. memset(value, 0, len);
  28744. 802ad90: 4621 mov r1, r4
  28745. 802ad92: 226e movs r2, #110 ; 0x6e
  28746. 802ad94: a802 add r0, sp, #8
  28747. 802ad96: f7f6 fe93 bl 8021ac0 <memset>
  28748. /* Комментарий */
  28749. GetParamValue(buf, "comment=", value, &valueLen);
  28750. 802ad9a: f10d 0307 add.w r3, sp, #7
  28751. 802ad9e: aa02 add r2, sp, #8
  28752. 802ada0: 4628 mov r0, r5
  28753. 802ada2: 490c ldr r1, [pc, #48] ; (802add4 <HTTP_SetInfo+0xa4>)
  28754. 802ada4: f7ff fc0a bl 802a5bc <GetParamValue>
  28755. HTTP_ReplaceSimbol(value, '+', ' ');
  28756. 802ada8: 212b movs r1, #43 ; 0x2b
  28757. 802adaa: 2220 movs r2, #32
  28758. 802adac: a802 add r0, sp, #8
  28759. 802adae: f7ff ffab bl 802ad08 <HTTP_ReplaceSimbol>
  28760. SetComment(value);
  28761. 802adb2: a802 add r0, sp, #8
  28762. 802adb4: f7fd f96c bl 8028090 <SetComment>
  28763. memset(value, 0, len);
  28764. 802adb8: 4621 mov r1, r4
  28765. 802adba: 226e movs r2, #110 ; 0x6e
  28766. 802adbc: a802 add r0, sp, #8
  28767. 802adbe: f7f6 fe7f bl 8021ac0 <memset>
  28768. HTTP_SaveSettings();
  28769. 802adc2: f000 ff52 bl 802bc6a <HTTP_SaveSettings>
  28770. }
  28771. 802adc6: b01f add sp, #124 ; 0x7c
  28772. 802adc8: bd30 pop {r4, r5, pc}
  28773. 802adca: bf00 nop
  28774. 802adcc: 0803a267 .word 0x0803a267
  28775. 802add0: 0803a26e .word 0x0803a26e
  28776. 802add4: 0803a27b .word 0x0803a27b
  28777. 0802add8 <HTTP_InfoPage>:
  28778. /**
  28779. * @brief
  28780. * @retval None
  28781. */
  28782. int HTTP_InfoPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  28783. {
  28784. 802add8: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  28785. 802addc: 4606 mov r6, r0
  28786. 802adde: b088 sub sp, #32
  28787. 802ade0: 460c mov r4, r1
  28788. 802ade2: 4690 mov r8, r2
  28789. char tempStr[30];
  28790. strncpy(tempStr, bufIn, 30);
  28791. 802ade4: 4631 mov r1, r6
  28792. 802ade6: 221e movs r2, #30
  28793. 802ade8: 4668 mov r0, sp
  28794. /**
  28795. * @brief
  28796. * @retval None
  28797. */
  28798. int HTTP_InfoPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  28799. {
  28800. 802adea: 461f mov r7, r3
  28801. char tempStr[30];
  28802. strncpy(tempStr, bufIn, 30);
  28803. 802adec: f7f7 f8f8 bl 8021fe0 <strncpy>
  28804. /* В запросе нет параметров, нужно формировать JSON ответ */
  28805. if (strpbrk(tempStr,"?") == 0)
  28806. 802adf0: 4668 mov r0, sp
  28807. 802adf2: 490e ldr r1, [pc, #56] ; (802ae2c <HTTP_InfoPage+0x54>)
  28808. 802adf4: f7f7 f926 bl 8022044 <strpbrk>
  28809. 802adf8: 4605 mov r5, r0
  28810. 802adfa: b970 cbnz r0, 802ae1a <HTTP_InfoPage+0x42>
  28811. {
  28812. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  28813. 802adfc: 4629 mov r1, r5
  28814. 802adfe: f44f 62fa mov.w r2, #2000 ; 0x7d0
  28815. 802ae02: 4620 mov r0, r4
  28816. 802ae04: f7f6 fe5c bl 8021ac0 <memset>
  28817. HTTP_GetInfo(bufOut);
  28818. 802ae08: 4620 mov r0, r4
  28819. 802ae0a: f000 fe15 bl 802ba38 <HTTP_GetInfo>
  28820. *lenBufOut = strlen(bufOut);
  28821. 802ae0e: 4620 mov r0, r4
  28822. 802ae10: f7f7 f82e bl 8021e70 <strlen>
  28823. 802ae14: 8038 strh r0, [r7, #0]
  28824. return SEND_REQUIRED_YES;
  28825. 802ae16: 4628 mov r0, r5
  28826. 802ae18: e004 b.n 802ae24 <HTTP_InfoPage+0x4c>
  28827. }
  28828. /* В запросе есть параметры, нужно парсить и сохранять настройки */
  28829. else
  28830. {
  28831. HTTP_SetInfo(bufIn, lenBufIn);
  28832. 802ae1a: 4630 mov r0, r6
  28833. 802ae1c: 4641 mov r1, r8
  28834. 802ae1e: f7ff ff87 bl 802ad30 <HTTP_SetInfo>
  28835. return SEND_REQUIRED_NO;
  28836. 802ae22: 2001 movs r0, #1
  28837. /*
  28838. HTTP_SetSettings(bufIn, lenBufIn);
  28839. return SEND_REQUIRED_NO;
  28840. */
  28841. }
  28842. }
  28843. 802ae24: b008 add sp, #32
  28844. 802ae26: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  28845. 802ae2a: bf00 nop
  28846. 802ae2c: 0803a22c .word 0x0803a22c
  28847. 0802ae30 <http_recv>:
  28848. * @param p: pointer to a packet buffer
  28849. * @param err: LwIP error code
  28850. * @retval err
  28851. */
  28852. static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  28853. {
  28854. 802ae30: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  28855. 802ae34: b09d sub sp, #116 ; 0x74
  28856. 802ae36: 4617 mov r7, r2
  28857. struct http_state *hs;
  28858. char CookieBuf[50];
  28859. char *CookiePtr = NULL;
  28860. char name[MAX_WEB_COOKIE_LEN];
  28861. char id[MAX_WEB_COOKIE_LEN];
  28862. uint8_t nameLen = 0, idLen = 0;
  28863. 802ae38: 2200 movs r2, #0
  28864. * @param p: pointer to a packet buffer
  28865. * @param err: LwIP error code
  28866. * @retval err
  28867. */
  28868. static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  28869. {
  28870. 802ae3a: 4604 mov r4, r0
  28871. 802ae3c: 460d mov r5, r1
  28872. struct http_state *hs;
  28873. char CookieBuf[50];
  28874. char *CookiePtr = NULL;
  28875. char name[MAX_WEB_COOKIE_LEN];
  28876. char id[MAX_WEB_COOKIE_LEN];
  28877. uint8_t nameLen = 0, idLen = 0;
  28878. 802ae3e: f88d 200a strb.w r2, [sp, #10]
  28879. 802ae42: f88d 200b strb.w r2, [sp, #11]
  28880. struct fs_file file = {0, 0};
  28881. 802ae46: 9205 str r2, [sp, #20]
  28882. 802ae48: 9206 str r2, [sp, #24]
  28883. hs = arg;
  28884. if (err == ERR_OK && p != NULL)
  28885. 802ae4a: 2b00 cmp r3, #0
  28886. 802ae4c: f040 8294 bne.w 802b378 <http_recv+0x548>
  28887. {
  28888. tcp_recved(pcb, p->tot_len);
  28889. 802ae50: 4608 mov r0, r1
  28890. uint8_t nameLen = 0, idLen = 0;
  28891. struct fs_file file = {0, 0};
  28892. hs = arg;
  28893. if (err == ERR_OK && p != NULL)
  28894. 802ae52: 2f00 cmp r7, #0
  28895. 802ae54: f000 828d beq.w 802b372 <http_recv+0x542>
  28896. {
  28897. tcp_recved(pcb, p->tot_len);
  28898. 802ae58: 8939 ldrh r1, [r7, #8]
  28899. 802ae5a: f002 fb7b bl 802d554 <tcp_recved>
  28900. if (hs->file == NULL)
  28901. 802ae5e: f8d4 8000 ldr.w r8, [r4]
  28902. 802ae62: f1b8 0f00 cmp.w r8, #0
  28903. 802ae66: f040 8280 bne.w 802b36a <http_recv+0x53a>
  28904. printLen = p->tot_len;
  28905. memcpy(printBuf, p->payload , printLen);
  28906. printf(printBuf);
  28907. */
  28908. receivedBufLen = p->tot_len;
  28909. memcpy(receiveBuf, p->payload , receivedBufLen);
  28910. 802ae6a: f8df a2fc ldr.w sl, [pc, #764] ; 802b168 <http_recv+0x338>
  28911. {
  28912. tcp_recved(pcb, p->tot_len);
  28913. if (hs->file == NULL)
  28914. {
  28915. data = p->payload;
  28916. 802ae6e: 687e ldr r6, [r7, #4]
  28917. /*
  28918. printLen = p->tot_len;
  28919. memcpy(printBuf, p->payload , printLen);
  28920. printf(printBuf);
  28921. */
  28922. receivedBufLen = p->tot_len;
  28923. 802ae70: 893a ldrh r2, [r7, #8]
  28924. 802ae72: f8df 92f0 ldr.w r9, [pc, #752] ; 802b164 <http_recv+0x334>
  28925. memcpy(receiveBuf, p->payload , receivedBufLen);
  28926. 802ae76: 4650 mov r0, sl
  28927. 802ae78: 4631 mov r1, r6
  28928. /*
  28929. printLen = p->tot_len;
  28930. memcpy(printBuf, p->payload , printLen);
  28931. printf(printBuf);
  28932. */
  28933. receivedBufLen = p->tot_len;
  28934. 802ae7a: f8a9 2000 strh.w r2, [r9]
  28935. memcpy(receiveBuf, p->payload , receivedBufLen);
  28936. 802ae7e: f7f6 fd65 bl 802194c <memcpy>
  28937. receiveBuf[receivedBufLen] = '\0';
  28938. 802ae82: f8b9 3000 ldrh.w r3, [r9]
  28939. // printf("receive %s \r\n", receiveBuf);
  28940. /* Get cookie "uname" value */
  28941. CookiePtr = strstr(receiveBuf, "uname=");
  28942. 802ae86: 49a7 ldr r1, [pc, #668] ; (802b124 <http_recv+0x2f4>)
  28943. printf(printBuf);
  28944. */
  28945. receivedBufLen = p->tot_len;
  28946. memcpy(receiveBuf, p->payload , receivedBufLen);
  28947. receiveBuf[receivedBufLen] = '\0';
  28948. 802ae88: f80a 8003 strb.w r8, [sl, r3]
  28949. // printf("receive %s \r\n", receiveBuf);
  28950. /* Get cookie "uname" value */
  28951. CookiePtr = strstr(receiveBuf, "uname=");
  28952. 802ae8c: 4650 mov r0, sl
  28953. 802ae8e: f7f7 fa6f bl 8022370 <strstr>
  28954. strncpy(CookieBuf, CookiePtr, 50);
  28955. 802ae92: f10d 093c add.w r9, sp, #60 ; 0x3c
  28956. memcpy(receiveBuf, p->payload , receivedBufLen);
  28957. receiveBuf[receivedBufLen] = '\0';
  28958. // printf("receive %s \r\n", receiveBuf);
  28959. /* Get cookie "uname" value */
  28960. CookiePtr = strstr(receiveBuf, "uname=");
  28961. 802ae96: 4601 mov r1, r0
  28962. strncpy(CookieBuf, CookiePtr, 50);
  28963. 802ae98: 2232 movs r2, #50 ; 0x32
  28964. 802ae9a: 4648 mov r0, r9
  28965. 802ae9c: f7f7 f8a0 bl 8021fe0 <strncpy>
  28966. //printf("********CookieBuf1= %s\r\n", CookieBuf);
  28967. memset(name, 0, MAX_WEB_COOKIE_LEN);
  28968. 802aea0: 4641 mov r1, r8
  28969. 802aea2: 2210 movs r2, #16
  28970. 802aea4: a807 add r0, sp, #28
  28971. 802aea6: f7f6 fe0b bl 8021ac0 <memset>
  28972. GetCookieValue(CookieBuf, "uname=", name, &nameLen);
  28973. 802aeaa: f10d 030a add.w r3, sp, #10
  28974. 802aeae: aa07 add r2, sp, #28
  28975. 802aeb0: 499c ldr r1, [pc, #624] ; (802b124 <http_recv+0x2f4>)
  28976. 802aeb2: 4648 mov r0, r9
  28977. 802aeb4: f7ff fc98 bl 802a7e8 <GetCookieValue>
  28978. //printf("********CookieBuf2= %s\r\n", CookieBuf);
  28979. //printf("********uname= %s\r\n", name);
  28980. /* Get cookie "id" value */
  28981. CookiePtr = strstr(receiveBuf, "id=");
  28982. 802aeb8: 4650 mov r0, sl
  28983. 802aeba: 499b ldr r1, [pc, #620] ; (802b128 <http_recv+0x2f8>)
  28984. 802aebc: f7f7 fa58 bl 8022370 <strstr>
  28985. strncpy(CookieBuf, CookiePtr, 50);
  28986. //printf("********CookieBuf1= %s\r\n", CookieBuf);
  28987. memset(id, 0, MAX_WEB_COOKIE_LEN);
  28988. 802aec0: f10d 0b2c add.w fp, sp, #44 ; 0x2c
  28989. GetCookieValue(CookieBuf, "uname=", name, &nameLen);
  28990. //printf("********CookieBuf2= %s\r\n", CookieBuf);
  28991. //printf("********uname= %s\r\n", name);
  28992. /* Get cookie "id" value */
  28993. CookiePtr = strstr(receiveBuf, "id=");
  28994. 802aec4: 4601 mov r1, r0
  28995. strncpy(CookieBuf, CookiePtr, 50);
  28996. 802aec6: 2232 movs r2, #50 ; 0x32
  28997. 802aec8: 4648 mov r0, r9
  28998. 802aeca: f7f7 f889 bl 8021fe0 <strncpy>
  28999. //printf("********CookieBuf1= %s\r\n", CookieBuf);
  29000. memset(id, 0, MAX_WEB_COOKIE_LEN);
  29001. 802aece: 4641 mov r1, r8
  29002. 802aed0: 2210 movs r2, #16
  29003. 802aed2: 4658 mov r0, fp
  29004. 802aed4: f7f6 fdf4 bl 8021ac0 <memset>
  29005. GetCookieValue(CookieBuf, "id=", id, &idLen);
  29006. 802aed8: 465a mov r2, fp
  29007. 802aeda: f10d 030b add.w r3, sp, #11
  29008. 802aede: 4648 mov r0, r9
  29009. 802aee0: 4991 ldr r1, [pc, #580] ; (802b128 <http_recv+0x2f8>)
  29010. 802aee2: f7ff fc81 bl 802a7e8 <GetCookieValue>
  29011. /* Id of currently logged-in user */
  29012. uint8_t user_id;
  29013. /* Level of currently logged-in user */
  29014. seclevel = 0xFF;
  29015. 802aee6: 4b91 ldr r3, [pc, #580] ; (802b12c <http_recv+0x2fc>)
  29016. 802aee8: 22ff movs r2, #255 ; 0xff
  29017. 802aeea: 701a strb r2, [r3, #0]
  29018. /**
  29019. * @brief Чтение Cookie пользователя
  29020. */
  29021. static void HTTP_GetUserCookie(uint8_t user_id, char *str, uint8_t *len)
  29022. {
  29023. sprintf(str, "%s", users[user_id].cookie);
  29024. 802aeec: 4b90 ldr r3, [pc, #576] ; (802b130 <http_recv+0x300>)
  29025. uint8_t user_id;
  29026. /* Level of currently logged-in user */
  29027. seclevel = 0xFF;
  29028. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  29029. HTTP_GetUserCookie(user_id, CookieBuf, &idLen);
  29030. 802aeee: 46ca mov sl, r9
  29031. /**
  29032. * @brief Чтение Cookie пользователя
  29033. */
  29034. static void HTTP_GetUserCookie(uint8_t user_id, char *str, uint8_t *len)
  29035. {
  29036. sprintf(str, "%s", users[user_id].cookie);
  29037. 802aef0: 2214 movs r2, #20
  29038. 802aef2: fb02 3208 mla r2, r2, r8, r3
  29039. 802aef6: 498f ldr r1, [pc, #572] ; (802b134 <http_recv+0x304>)
  29040. 802aef8: 9301 str r3, [sp, #4]
  29041. 802aefa: 4650 mov r0, sl
  29042. 802aefc: f7fc fc22 bl 8027744 <tfp_sprintf>
  29043. *len = strlen(str);
  29044. 802af00: 4650 mov r0, sl
  29045. 802af02: f7f6 ffb5 bl 8021e70 <strlen>
  29046. 802af06: 4602 mov r2, r0
  29047. 802af08: f88d 000b strb.w r0, [sp, #11]
  29048. /* Level of currently logged-in user */
  29049. seclevel = 0xFF;
  29050. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  29051. HTTP_GetUserCookie(user_id, CookieBuf, &idLen);
  29052. if (strncmp(id, CookieBuf, idLen) == 0 ) {
  29053. 802af0c: b2d2 uxtb r2, r2
  29054. 802af0e: 4658 mov r0, fp
  29055. 802af10: 4651 mov r1, sl
  29056. 802af12: f7f7 f80f bl 8021f34 <strncmp>
  29057. 802af16: fa5f f988 uxtb.w r9, r8
  29058. 802af1a: 4a87 ldr r2, [pc, #540] ; (802b138 <http_recv+0x308>)
  29059. 802af1c: 9b01 ldr r3, [sp, #4]
  29060. 802af1e: b940 cbnz r0, 802af32 <http_recv+0x102>
  29061. GetUserLevelInt(user_id, &seclevel);
  29062. 802af20: 4648 mov r0, r9
  29063. 802af22: 4982 ldr r1, [pc, #520] ; (802b12c <http_recv+0x2fc>)
  29064. 802af24: 9201 str r2, [sp, #4]
  29065. 802af26: f7fc feb5 bl 8027c94 <GetUserLevelInt>
  29066. Authenticated = true;
  29067. 802af2a: 9a01 ldr r2, [sp, #4]
  29068. 802af2c: 2301 movs r3, #1
  29069. 802af2e: 7013 strb r3, [r2, #0]
  29070. break;
  29071. 802af30: e00a b.n 802af48 <http_recv+0x118>
  29072. }
  29073. Authenticated = false;
  29074. 802af32: 2100 movs r1, #0
  29075. 802af34: 7011 strb r1, [r2, #0]
  29076. 802af36: f108 0801 add.w r8, r8, #1
  29077. seclevel = 0xFF;
  29078. 802af3a: 4a7c ldr r2, [pc, #496] ; (802b12c <http_recv+0x2fc>)
  29079. 802af3c: 21ff movs r1, #255 ; 0xff
  29080. /* Id of currently logged-in user */
  29081. uint8_t user_id;
  29082. /* Level of currently logged-in user */
  29083. seclevel = 0xFF;
  29084. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  29085. 802af3e: f1b8 0f02 cmp.w r8, #2
  29086. GetUserLevelInt(user_id, &seclevel);
  29087. Authenticated = true;
  29088. break;
  29089. }
  29090. Authenticated = false;
  29091. seclevel = 0xFF;
  29092. 802af42: 7011 strb r1, [r2, #0]
  29093. /* Id of currently logged-in user */
  29094. uint8_t user_id;
  29095. /* Level of currently logged-in user */
  29096. seclevel = 0xFF;
  29097. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  29098. 802af44: d1d4 bne.n 802aef0 <http_recv+0xc0>
  29099. 802af46: 46c1 mov r9, r8
  29100. }
  29101. Authenticated = false;
  29102. seclevel = 0xFF;
  29103. }
  29104. if ( Authenticated == false )
  29105. 802af48: 4b7b ldr r3, [pc, #492] ; (802b138 <http_recv+0x308>)
  29106. {
  29107. if (strncmp(data, "GET /main.css", 13) == 0) // +
  29108. 802af4a: 497c ldr r1, [pc, #496] ; (802b13c <http_recv+0x30c>)
  29109. }
  29110. Authenticated = false;
  29111. seclevel = 0xFF;
  29112. }
  29113. if ( Authenticated == false )
  29114. 802af4c: 781b ldrb r3, [r3, #0]
  29115. {
  29116. if (strncmp(data, "GET /main.css", 13) == 0) // +
  29117. 802af4e: 4630 mov r0, r6
  29118. 802af50: 220d movs r2, #13
  29119. }
  29120. Authenticated = false;
  29121. seclevel = 0xFF;
  29122. }
  29123. if ( Authenticated == false )
  29124. 802af52: 2b00 cmp r3, #0
  29125. 802af54: f040 812e bne.w 802b1b4 <http_recv+0x384>
  29126. {
  29127. if (strncmp(data, "GET /main.css", 13) == 0) // +
  29128. 802af58: f7f6 ffec bl 8021f34 <strncmp>
  29129. 802af5c: b900 cbnz r0, 802af60 <http_recv+0x130>
  29130. 802af5e: e12c b.n 802b1ba <http_recv+0x38a>
  29131. hs->file = file.data;
  29132. hs->left = file.len;
  29133. send_data(pcb, hs);
  29134. tcp_sent(pcb, http_sent);
  29135. }
  29136. else if (strncmp(data, "GET /rotek.png", 14) == 0) // +
  29137. 802af60: 4630 mov r0, r6
  29138. 802af62: 4977 ldr r1, [pc, #476] ; (802b140 <http_recv+0x310>)
  29139. 802af64: 220e movs r2, #14
  29140. 802af66: f7f6 ffe5 bl 8021f34 <strncmp>
  29141. 802af6a: b900 cbnz r0, 802af6e <http_recv+0x13e>
  29142. 802af6c: e12d b.n 802b1ca <http_recv+0x39a>
  29143. hs->file = file.data;
  29144. hs->left = file.len;
  29145. send_data(pcb, hs);
  29146. tcp_sent(pcb, http_sent);
  29147. }
  29148. else if (strncmp(data, "GET /favicon.ico", 16) == 0) // ?
  29149. 802af6e: 4630 mov r0, r6
  29150. 802af70: 4974 ldr r1, [pc, #464] ; (802b144 <http_recv+0x314>)
  29151. 802af72: 2210 movs r2, #16
  29152. 802af74: f7f6 ffde bl 8021f34 <strncmp>
  29153. 802af78: b900 cbnz r0, 802af7c <http_recv+0x14c>
  29154. 802af7a: e12e b.n 802b1da <http_recv+0x3aa>
  29155. hs->file = file.data;
  29156. hs->left = file.len;
  29157. send_data(pcb, hs);
  29158. tcp_sent(pcb, http_sent);
  29159. }
  29160. else if (strncmp(data, "GET /role.js", 12) == 0)
  29161. 802af7c: 4630 mov r0, r6
  29162. 802af7e: 4972 ldr r1, [pc, #456] ; (802b148 <http_recv+0x318>)
  29163. 802af80: 220c movs r2, #12
  29164. 802af82: f7f6 ffd7 bl 8021f34 <strncmp>
  29165. 802af86: b900 cbnz r0, 802af8a <http_recv+0x15a>
  29166. 802af88: e137 b.n 802b1fa <http_recv+0x3ca>
  29167. hs->left = file.len;
  29168. send_data(pcb, hs);
  29169. tcp_sent(pcb, http_sent);
  29170. }
  29171. else if ((strncmp(data, "POST /login.cgi", 15) == 0) || (log_post_reqn > 0))
  29172. 802af8a: 4630 mov r0, r6
  29173. 802af8c: 496f ldr r1, [pc, #444] ; (802b14c <http_recv+0x31c>)
  29174. 802af8e: 220f movs r2, #15
  29175. 802af90: f7f6 ffd0 bl 8021f34 <strncmp>
  29176. 802af94: b120 cbz r0, 802afa0 <http_recv+0x170>
  29177. 802af96: 4b6e ldr r3, [pc, #440] ; (802b150 <http_recv+0x320>)
  29178. 802af98: 681b ldr r3, [r3, #0]
  29179. 802af9a: 2b00 cmp r3, #0
  29180. 802af9c: f000 80a8 beq.w 802b0f0 <http_recv+0x2c0>
  29181. {
  29182. uint32_t i=0,size=0, S=1;
  29183. int32_t j=0;
  29184. char sizestring[6], *ptr;
  29185. ContentLengthOffset =0;
  29186. 802afa0: 4a6c ldr r2, [pc, #432] ; (802b154 <http_recv+0x324>)
  29187. uint32_t i, offset = 0, req_data_received = 0;
  29188. //printf("request 1: %d\r\n", receivedBufLen);
  29189. /* parse packet for Content-length field */
  29190. post_data_count = Parse_Content_Length(data, p->tot_len);
  29191. 802afa2: f8b7 9008 ldrh.w r9, [r7, #8]
  29192. {
  29193. uint32_t i=0,size=0, S=1;
  29194. int32_t j=0;
  29195. char sizestring[6], *ptr;
  29196. ContentLengthOffset =0;
  29197. 802afa6: 2300 movs r3, #0
  29198. 802afa8: 6013 str r3, [r2, #0]
  29199. /* find Content-Length data in packet buffer */
  29200. for (i=0;i<len;i++)
  29201. 802afaa: 4698 mov r8, r3
  29202. 802afac: e00d b.n 802afca <http_recv+0x19a>
  29203. {
  29204. if (strncmp ((char*)(data+i), Content_Length, 16)==0)
  29205. 802afae: eb06 0008 add.w r0, r6, r8
  29206. 802afb2: 4969 ldr r1, [pc, #420] ; (802b158 <http_recv+0x328>)
  29207. 802afb4: 2210 movs r2, #16
  29208. 802afb6: f7f6 ffbd bl 8021f34 <strncmp>
  29209. 802afba: b920 cbnz r0, 802afc6 <http_recv+0x196>
  29210. {
  29211. ContentLengthOffset = i+16;
  29212. 802afbc: 4b65 ldr r3, [pc, #404] ; (802b154 <http_recv+0x324>)
  29213. 802afbe: f108 0210 add.w r2, r8, #16
  29214. 802afc2: 601a str r2, [r3, #0]
  29215. 802afc4: e003 b.n 802afce <http_recv+0x19e>
  29216. char sizestring[6], *ptr;
  29217. ContentLengthOffset =0;
  29218. /* find Content-Length data in packet buffer */
  29219. for (i=0;i<len;i++)
  29220. 802afc6: f108 0801 add.w r8, r8, #1
  29221. 802afca: 45c8 cmp r8, r9
  29222. 802afcc: d3ef bcc.n 802afae <http_recv+0x17e>
  29223. ContentLengthOffset = i+16;
  29224. break;
  29225. }
  29226. }
  29227. /* read Content-Length value */
  29228. if (ContentLengthOffset)
  29229. 802afce: 4b61 ldr r3, [pc, #388] ; (802b154 <http_recv+0x324>)
  29230. 802afd0: 681a ldr r2, [r3, #0]
  29231. 802afd2: 4618 mov r0, r3
  29232. 802afd4: b90a cbnz r2, 802afda <http_recv+0x1aa>
  29233. * @param len : buffer length
  29234. * @retval size : Content_length in numeric format
  29235. */
  29236. static uint32_t Parse_Content_Length(char *data, uint32_t len)
  29237. {
  29238. uint32_t i=0,size=0, S=1;
  29239. 802afd6: 2200 movs r2, #0
  29240. 802afd8: e023 b.n 802b022 <http_recv+0x1f2>
  29241. }
  29242. /* read Content-Length value */
  29243. if (ContentLengthOffset)
  29244. {
  29245. i=0;
  29246. ptr = (char*)(data + ContentLengthOffset);
  29247. 802afda: eb06 0c02 add.w ip, r6, r2
  29248. }
  29249. }
  29250. /* read Content-Length value */
  29251. if (ContentLengthOffset)
  29252. {
  29253. i=0;
  29254. 802afde: 2300 movs r3, #0
  29255. 802afe0: e004 b.n 802afec <http_recv+0x1bc>
  29256. ptr = (char*)(data + ContentLengthOffset);
  29257. while(*(ptr+i)!=0x0d)
  29258. {
  29259. sizestring[i] = *(ptr+i);
  29260. 802afe2: f10d 0e0c add.w lr, sp, #12
  29261. 802afe6: f803 100e strb.w r1, [r3, lr]
  29262. i++;
  29263. 802afea: 3301 adds r3, #1
  29264. /* read Content-Length value */
  29265. if (ContentLengthOffset)
  29266. {
  29267. i=0;
  29268. ptr = (char*)(data + ContentLengthOffset);
  29269. while(*(ptr+i)!=0x0d)
  29270. 802afec: f81c 1003 ldrb.w r1, [ip, r3]
  29271. 802aff0: 290d cmp r1, #13
  29272. 802aff2: eb03 0e02 add.w lr, r3, r2
  29273. 802aff6: d1f4 bne.n 802afe2 <http_recv+0x1b2>
  29274. 802aff8: f8c0 e000 str.w lr, [r0]
  29275. {
  29276. sizestring[i] = *(ptr+i);
  29277. i++;
  29278. ContentLengthOffset++;
  29279. }
  29280. if (i>0)
  29281. 802affc: 2b00 cmp r3, #0
  29282. 802affe: d0ea beq.n 802afd6 <http_recv+0x1a6>
  29283. {
  29284. /* transform string data into numeric format */
  29285. for(j=i-1;j>=0;j--)
  29286. 802b000: 3b01 subs r3, #1
  29287. * @param len : buffer length
  29288. * @retval size : Content_length in numeric format
  29289. */
  29290. static uint32_t Parse_Content_Length(char *data, uint32_t len)
  29291. {
  29292. uint32_t i=0,size=0, S=1;
  29293. 802b002: 2101 movs r1, #1
  29294. 802b004: 2200 movs r2, #0
  29295. {
  29296. /* transform string data into numeric format */
  29297. for(j=i-1;j>=0;j--)
  29298. {
  29299. size += (sizestring[j]-0x30)*S;
  29300. S=S*10;
  29301. 802b006: 200a movs r0, #10
  29302. 802b008: e009 b.n 802b01e <http_recv+0x1ee>
  29303. if (i>0)
  29304. {
  29305. /* transform string data into numeric format */
  29306. for(j=i-1;j>=0;j--)
  29307. {
  29308. size += (sizestring[j]-0x30)*S;
  29309. 802b00a: f10d 0e0c add.w lr, sp, #12
  29310. 802b00e: f813 e00e ldrb.w lr, [r3, lr]
  29311. 802b012: f1ae 0e30 sub.w lr, lr, #48 ; 0x30
  29312. 802b016: fb01 220e mla r2, r1, lr, r2
  29313. ContentLengthOffset++;
  29314. }
  29315. if (i>0)
  29316. {
  29317. /* transform string data into numeric format */
  29318. for(j=i-1;j>=0;j--)
  29319. 802b01a: 3b01 subs r3, #1
  29320. {
  29321. size += (sizestring[j]-0x30)*S;
  29322. S=S*10;
  29323. 802b01c: 4341 muls r1, r0
  29324. ContentLengthOffset++;
  29325. }
  29326. if (i>0)
  29327. {
  29328. /* transform string data into numeric format */
  29329. for(j=i-1;j>=0;j--)
  29330. 802b01e: 2b00 cmp r3, #0
  29331. 802b020: daf3 bge.n 802b00a <http_recv+0x1da>
  29332. uint32_t i, offset = 0, req_data_received = 0;
  29333. //printf("request 1: %d\r\n", receivedBufLen);
  29334. /* parse packet for Content-length field */
  29335. post_data_count = Parse_Content_Length(data, p->tot_len);
  29336. 802b022: f8df 8150 ldr.w r8, [pc, #336] ; 802b174 <http_recv+0x344>
  29337. //printf("Content-length: %d\r\n", (int)post_data_count);
  29338. if (post_data_count < MAX_POST_REQ_LEN) {
  29339. 802b026: 2aff cmp r2, #255 ; 0xff
  29340. uint32_t i, offset = 0, req_data_received = 0;
  29341. //printf("request 1: %d\r\n", receivedBufLen);
  29342. /* parse packet for Content-length field */
  29343. post_data_count = Parse_Content_Length(data, p->tot_len);
  29344. 802b028: f8c8 2000 str.w r2, [r8]
  29345. //printf("Content-length: %d\r\n", (int)post_data_count);
  29346. if (post_data_count < MAX_POST_REQ_LEN) {
  29347. 802b02c: d857 bhi.n 802b0de <http_recv+0x2ae>
  29348. memset(post_req_data, 0, MAX_POST_REQ_LEN);
  29349. 802b02e: 484b ldr r0, [pc, #300] ; (802b15c <http_recv+0x32c>)
  29350. /* parse packet for "\r\n\r\n" */
  29351. for (i = 0; i < receivedBufLen; i++)
  29352. 802b030: f8df 9130 ldr.w r9, [pc, #304] ; 802b164 <http_recv+0x334>
  29353. post_data_count = Parse_Content_Length(data, p->tot_len);
  29354. //printf("Content-length: %d\r\n", (int)post_data_count);
  29355. if (post_data_count < MAX_POST_REQ_LEN) {
  29356. memset(post_req_data, 0, MAX_POST_REQ_LEN);
  29357. 802b034: 2100 movs r1, #0
  29358. 802b036: f44f 7280 mov.w r2, #256 ; 0x100
  29359. 802b03a: f7f6 fd41 bl 8021ac0 <memset>
  29360. /* parse packet for "\r\n\r\n" */
  29361. for (i = 0; i < receivedBufLen; i++)
  29362. 802b03e: f04f 0800 mov.w r8, #0
  29363. 802b042: e00b b.n 802b05c <http_recv+0x22c>
  29364. {
  29365. if (strncmp ((char*)(data+i), "\r\n\r\n", 4) == 0)
  29366. 802b044: eb06 0008 add.w r0, r6, r8
  29367. 802b048: 4945 ldr r1, [pc, #276] ; (802b160 <http_recv+0x330>)
  29368. 802b04a: 2204 movs r2, #4
  29369. 802b04c: f7f6 ff72 bl 8021f34 <strncmp>
  29370. 802b050: b910 cbnz r0, 802b058 <http_recv+0x228>
  29371. {
  29372. offset = i+4;
  29373. 802b052: f108 0804 add.w r8, r8, #4
  29374. //printf("offset: %d\r\n", (int)offset);
  29375. break;
  29376. 802b056: e007 b.n 802b068 <http_recv+0x238>
  29377. if (post_data_count < MAX_POST_REQ_LEN) {
  29378. memset(post_req_data, 0, MAX_POST_REQ_LEN);
  29379. /* parse packet for "\r\n\r\n" */
  29380. for (i = 0; i < receivedBufLen; i++)
  29381. 802b058: f108 0801 add.w r8, r8, #1
  29382. 802b05c: f8b9 3000 ldrh.w r3, [r9]
  29383. 802b060: 4598 cmp r8, r3
  29384. 802b062: d3ef bcc.n 802b044 <http_recv+0x214>
  29385. tcp_sent(pcb, http_sent);
  29386. }
  29387. else if ((strncmp(data, "POST /login.cgi", 15) == 0) || (log_post_reqn > 0))
  29388. {
  29389. uint32_t i, offset = 0, req_data_received = 0;
  29390. 802b064: f04f 0800 mov.w r8, #0
  29391. //printf("offset: %d\r\n", (int)offset);
  29392. break;
  29393. }
  29394. }
  29395. req_data_received = receivedBufLen - offset;
  29396. 802b068: 4b3e ldr r3, [pc, #248] ; (802b164 <http_recv+0x334>)
  29397. 802b06a: f8b3 a000 ldrh.w sl, [r3]
  29398. 802b06e: ebc8 0a0a rsb sl, r8, sl
  29399. //printf("req data received: %d\r\n", (int)req_data_received);
  29400. /* Check if "\r\n\r\n" was found */
  29401. if (offset != 0) {
  29402. 802b072: f1b8 0f00 cmp.w r8, #0
  29403. 802b076: d015 beq.n 802b0a4 <http_recv+0x274>
  29404. /* if data was splited in two packets */
  29405. if (req_data_received < post_data_count) {
  29406. 802b078: f8df 90f8 ldr.w r9, [pc, #248] ; 802b174 <http_recv+0x344>
  29407. /* Copy request data to buffer */
  29408. snprintf(post_req_data, req_data_received, "%s", receiveBuf);
  29409. 802b07c: 4837 ldr r0, [pc, #220] ; (802b15c <http_recv+0x32c>)
  29410. /* Check if "\r\n\r\n" was found */
  29411. if (offset != 0) {
  29412. /* if data was splited in two packets */
  29413. if (req_data_received < post_data_count) {
  29414. 802b07e: f8d9 2000 ldr.w r2, [r9]
  29415. 802b082: 4592 cmp sl, r2
  29416. 802b084: d20b bcs.n 802b09e <http_recv+0x26e>
  29417. /* Copy request data to buffer */
  29418. snprintf(post_req_data, req_data_received, "%s", receiveBuf);
  29419. 802b086: 4b38 ldr r3, [pc, #224] ; (802b168 <http_recv+0x338>)
  29420. 802b088: 4a2a ldr r2, [pc, #168] ; (802b134 <http_recv+0x304>)
  29421. 802b08a: 4651 mov r1, sl
  29422. 802b08c: f7fc fb3c bl 8027708 <tfp_snprintf>
  29423. //printf("copied: %d\r\n", (int)req_data_received);
  29424. post_data_count -= req_data_received;
  29425. 802b090: f8d9 3000 ldr.w r3, [r9]
  29426. 802b094: ebca 0303 rsb r3, sl, r3
  29427. 802b098: f8c9 3000 str.w r3, [r9]
  29428. 802b09c: e165 b.n 802b36a <http_recv+0x53a>
  29429. }
  29430. /* if data received completely */
  29431. else {
  29432. strncat(post_req_data, (char *)(data + offset), post_data_count);
  29433. 802b09e: eb06 0108 add.w r1, r6, r8
  29434. 802b0a2: e02b b.n 802b0fc <http_recv+0x2cc>
  29435. /* request was fragmented before "\r\n\r\n" */
  29436. else {
  29437. //printf("no data found!\r\n");
  29438. /* wait next packet */
  29439. log_post_reqn++;
  29440. 802b0a4: 4e2a ldr r6, [pc, #168] ; (802b150 <http_recv+0x320>)
  29441. 802b0a6: 6833 ldr r3, [r6, #0]
  29442. 802b0a8: 3301 adds r3, #1
  29443. /* wait max 2 requests */
  29444. if (log_post_reqn > 1) {
  29445. 802b0aa: 2b01 cmp r3, #1
  29446. /* request was fragmented before "\r\n\r\n" */
  29447. else {
  29448. //printf("no data found!\r\n");
  29449. /* wait next packet */
  29450. log_post_reqn++;
  29451. 802b0ac: 6033 str r3, [r6, #0]
  29452. /* wait max 2 requests */
  29453. if (log_post_reqn > 1) {
  29454. 802b0ae: f240 815c bls.w 802b36a <http_recv+0x53a>
  29455. /* Redirect to login page */
  29456. fs_open("/login.html", &file);
  29457. 802b0b2: a905 add r1, sp, #20
  29458. 802b0b4: 482d ldr r0, [pc, #180] ; (802b16c <http_recv+0x33c>)
  29459. 802b0b6: f7ff f999 bl 802a3ec <fs_open>
  29460. hs->file = file.data;
  29461. 802b0ba: 9b05 ldr r3, [sp, #20]
  29462. 802b0bc: 6023 str r3, [r4, #0]
  29463. hs->left = file.len;
  29464. 802b0be: 9b06 ldr r3, [sp, #24]
  29465. send_data(pcb, hs);
  29466. 802b0c0: 4628 mov r0, r5
  29467. /* wait max 2 requests */
  29468. if (log_post_reqn > 1) {
  29469. /* Redirect to login page */
  29470. fs_open("/login.html", &file);
  29471. hs->file = file.data;
  29472. hs->left = file.len;
  29473. 802b0c2: 6063 str r3, [r4, #4]
  29474. send_data(pcb, hs);
  29475. 802b0c4: 4621 mov r1, r4
  29476. 802b0c6: f7ff f9cd bl 802a464 <send_data>
  29477. tcp_sent(pcb, http_sent);
  29478. 802b0ca: 4628 mov r0, r5
  29479. 802b0cc: 4928 ldr r1, [pc, #160] ; (802b170 <http_recv+0x340>)
  29480. 802b0ce: f002 fa77 bl 802d5c0 <tcp_sent>
  29481. /* End reqest */
  29482. post_data_count = 0;
  29483. 802b0d2: 4b28 ldr r3, [pc, #160] ; (802b174 <http_recv+0x344>)
  29484. log_post_reqn = 0;
  29485. 802b0d4: f8c6 8000 str.w r8, [r6]
  29486. hs->left = file.len;
  29487. send_data(pcb, hs);
  29488. tcp_sent(pcb, http_sent);
  29489. /* End reqest */
  29490. post_data_count = 0;
  29491. 802b0d8: f8c3 8000 str.w r8, [r3]
  29492. 802b0dc: e145 b.n 802b36a <http_recv+0x53a>
  29493. log_post_reqn = 0;
  29494. }
  29495. }
  29496. }
  29497. else {
  29498. printf("Too long POST request!\r\n");
  29499. 802b0de: 4826 ldr r0, [pc, #152] ; (802b178 <http_recv+0x348>)
  29500. 802b0e0: f7fc fae4 bl 80276ac <tfp_printf>
  29501. /* Ignore request */
  29502. post_data_count = 0;
  29503. log_post_reqn = 0;
  29504. 802b0e4: 4a1a ldr r2, [pc, #104] ; (802b150 <http_recv+0x320>)
  29505. }
  29506. }
  29507. else {
  29508. printf("Too long POST request!\r\n");
  29509. /* Ignore request */
  29510. post_data_count = 0;
  29511. 802b0e6: 2300 movs r3, #0
  29512. 802b0e8: f8c8 3000 str.w r3, [r8]
  29513. log_post_reqn = 0;
  29514. 802b0ec: 6013 str r3, [r2, #0]
  29515. 802b0ee: e05f b.n 802b1b0 <http_recv+0x380>
  29516. hs->left = file.len;
  29517. send_data(pcb, hs);
  29518. tcp_sent(pcb, http_sent);
  29519. }
  29520. }
  29521. else if (post_data_count > 0)
  29522. 802b0f0: 4b20 ldr r3, [pc, #128] ; (802b174 <http_recv+0x344>)
  29523. 802b0f2: 681a ldr r2, [r3, #0]
  29524. 802b0f4: 2a00 cmp r2, #0
  29525. 802b0f6: d05b beq.n 802b1b0 <http_recv+0x380>
  29526. {
  29527. strncat(post_req_data, data, post_data_count);
  29528. 802b0f8: 4818 ldr r0, [pc, #96] ; (802b15c <http_recv+0x32c>)
  29529. 802b0fa: 4631 mov r1, r6
  29530. 802b0fc: f7f6 fee8 bl 8021ed0 <strncat>
  29531. //printf("copied: %d\r\n", (int)post_data_count);
  29532. //printf("post_req_data: %s\r\n", post_req_data);
  29533. if (HTTP_ConfirmWebPwd(post_req_data, sendBuf, strlen(post_req_data), &sendBufLoadLen) == SEND_REQUIRED_YES) {
  29534. 802b100: 4816 ldr r0, [pc, #88] ; (802b15c <http_recv+0x32c>)
  29535. 802b102: f8df 807c ldr.w r8, [pc, #124] ; 802b180 <http_recv+0x350>
  29536. 802b106: 4e1d ldr r6, [pc, #116] ; (802b17c <http_recv+0x34c>)
  29537. 802b108: f7f6 feb2 bl 8021e70 <strlen>
  29538. 802b10c: 4641 mov r1, r8
  29539. 802b10e: b282 uxth r2, r0
  29540. 802b110: 4633 mov r3, r6
  29541. 802b112: 4812 ldr r0, [pc, #72] ; (802b15c <http_recv+0x32c>)
  29542. 802b114: f7ff fa80 bl 802a618 <HTTP_ConfirmWebPwd>
  29543. 802b118: bba0 cbnz r0, 802b184 <http_recv+0x354>
  29544. hs->file = sendBuf;
  29545. 802b11a: f8c4 8000 str.w r8, [r4]
  29546. hs->left = sendBufLoadLen;
  29547. 802b11e: 8833 ldrh r3, [r6, #0]
  29548. 802b120: e037 b.n 802b192 <http_recv+0x362>
  29549. 802b122: bf00 nop
  29550. 802b124: 0803a081 .word 0x0803a081
  29551. 802b128: 0803a096 .word 0x0803a096
  29552. 802b12c: 200015e0 .word 0x200015e0
  29553. 802b130: 2000fb5c .word 0x2000fb5c
  29554. 802b134: 08035e67 .word 0x08035e67
  29555. 802b138: 20002a39 .word 0x20002a39
  29556. 802b13c: 0803a284 .word 0x0803a284
  29557. 802b140: 0803a292 .word 0x0803a292
  29558. 802b144: 0803a2a1 .word 0x0803a2a1
  29559. 802b148: 0803a2b2 .word 0x0803a2b2
  29560. 802b14c: 0803a2bf .word 0x0803a2bf
  29561. 802b150: 2000fb58 .word 0x2000fb58
  29562. 802b154: 20002a3c .word 0x20002a3c
  29563. 802b158: 08039fcb .word 0x08039fcb
  29564. 802b15c: 2000fa58 .word 0x2000fa58
  29565. 802b160: 0803a115 .word 0x0803a115
  29566. 802b164: 20002a42 .word 0x20002a42
  29567. 802b168: 2000f47c .word 0x2000f47c
  29568. 802b16c: 0803a2cf .word 0x0803a2cf
  29569. 802b170: 0802a4d7 .word 0x0802a4d7
  29570. 802b174: 2000fb84 .word 0x2000fb84
  29571. 802b178: 0803a2db .word 0x0803a2db
  29572. 802b17c: 20002a40 .word 0x20002a40
  29573. 802b180: 2000ecac .word 0x2000ecac
  29574. tcp_sent(pcb, http_sent);
  29575. }
  29576. else {
  29577. /* Redirect to login page */
  29578. fs_open("/login.html", &file);
  29579. 802b184: 487e ldr r0, [pc, #504] ; (802b380 <http_recv+0x550>)
  29580. 802b186: a905 add r1, sp, #20
  29581. 802b188: f7ff f930 bl 802a3ec <fs_open>
  29582. hs->file = file.data;
  29583. 802b18c: 9b05 ldr r3, [sp, #20]
  29584. 802b18e: 6023 str r3, [r4, #0]
  29585. hs->left = file.len;
  29586. 802b190: 9b06 ldr r3, [sp, #24]
  29587. 802b192: 6063 str r3, [r4, #4]
  29588. send_data(pcb, hs);
  29589. 802b194: 4628 mov r0, r5
  29590. 802b196: 4621 mov r1, r4
  29591. 802b198: f7ff f964 bl 802a464 <send_data>
  29592. tcp_sent(pcb, http_sent);
  29593. 802b19c: 4628 mov r0, r5
  29594. 802b19e: 4979 ldr r1, [pc, #484] ; (802b384 <http_recv+0x554>)
  29595. 802b1a0: f002 fa0e bl 802d5c0 <tcp_sent>
  29596. }
  29597. /* End reqest */
  29598. post_data_count = 0;
  29599. 802b1a4: 4a78 ldr r2, [pc, #480] ; (802b388 <http_recv+0x558>)
  29600. 802b1a6: 2300 movs r3, #0
  29601. 802b1a8: 6013 str r3, [r2, #0]
  29602. log_post_reqn = 0;
  29603. 802b1aa: 4a78 ldr r2, [pc, #480] ; (802b38c <http_recv+0x55c>)
  29604. 802b1ac: 6013 str r3, [r2, #0]
  29605. 802b1ae: e0dc b.n 802b36a <http_recv+0x53a>
  29606. }
  29607. else
  29608. {
  29609. fs_open("/login.html", &file);
  29610. 802b1b0: 4873 ldr r0, [pc, #460] ; (802b380 <http_recv+0x550>)
  29611. 802b1b2: e0cb b.n 802b34c <http_recv+0x51c>
  29612. }
  29613. else if ( Authenticated == true ) {
  29614. if (strncmp(data, "GET /main.css", 13) == 0) // +
  29615. 802b1b4: f7f6 febe bl 8021f34 <strncmp>
  29616. 802b1b8: b908 cbnz r0, 802b1be <http_recv+0x38e>
  29617. {
  29618. fs_open("/main.css", &file);
  29619. 802b1ba: 4875 ldr r0, [pc, #468] ; (802b390 <http_recv+0x560>)
  29620. 802b1bc: e0c6 b.n 802b34c <http_recv+0x51c>
  29621. hs->file = file.data;
  29622. hs->left = file.len;
  29623. send_data(pcb, hs);
  29624. tcp_sent(pcb, http_sent);
  29625. }
  29626. else if (strncmp(data, "GET /rotek.png", 14) == 0) // +
  29627. 802b1be: 4630 mov r0, r6
  29628. 802b1c0: 4974 ldr r1, [pc, #464] ; (802b394 <http_recv+0x564>)
  29629. 802b1c2: 220e movs r2, #14
  29630. 802b1c4: f7f6 feb6 bl 8021f34 <strncmp>
  29631. 802b1c8: b908 cbnz r0, 802b1ce <http_recv+0x39e>
  29632. {
  29633. fs_open("/rotek.png", &file);
  29634. 802b1ca: 4873 ldr r0, [pc, #460] ; (802b398 <http_recv+0x568>)
  29635. 802b1cc: e0be b.n 802b34c <http_recv+0x51c>
  29636. hs->file = file.data;
  29637. hs->left = file.len;
  29638. send_data(pcb, hs);
  29639. tcp_sent(pcb, http_sent);
  29640. }
  29641. else if (strncmp(data, "GET /favicon.ico", 16) == 0) // ?
  29642. 802b1ce: 4630 mov r0, r6
  29643. 802b1d0: 4972 ldr r1, [pc, #456] ; (802b39c <http_recv+0x56c>)
  29644. 802b1d2: 2210 movs r2, #16
  29645. 802b1d4: f7f6 feae bl 8021f34 <strncmp>
  29646. 802b1d8: b908 cbnz r0, 802b1de <http_recv+0x3ae>
  29647. {
  29648. fs_open("/favicon.ico", &file);
  29649. 802b1da: 4871 ldr r0, [pc, #452] ; (802b3a0 <http_recv+0x570>)
  29650. 802b1dc: e0b6 b.n 802b34c <http_recv+0x51c>
  29651. hs->file = file.data;
  29652. hs->left = file.len;
  29653. send_data(pcb, hs);
  29654. tcp_sent(pcb, http_sent);
  29655. }
  29656. else if (strncmp(data, "GET /main.js", 12) == 0) // +
  29657. 802b1de: 4630 mov r0, r6
  29658. 802b1e0: 4970 ldr r1, [pc, #448] ; (802b3a4 <http_recv+0x574>)
  29659. 802b1e2: 220c movs r2, #12
  29660. 802b1e4: f7f6 fea6 bl 8021f34 <strncmp>
  29661. 802b1e8: b908 cbnz r0, 802b1ee <http_recv+0x3be>
  29662. {
  29663. fs_open("/main.js", &file);
  29664. 802b1ea: 486f ldr r0, [pc, #444] ; (802b3a8 <http_recv+0x578>)
  29665. 802b1ec: e0ae b.n 802b34c <http_recv+0x51c>
  29666. hs->left = file.len;
  29667. send_data(pcb, hs);
  29668. tcp_sent(pcb, http_sent);
  29669. }
  29670. else if (strncmp(data, "GET /role.js", 12) == 0)
  29671. 802b1ee: 4630 mov r0, r6
  29672. 802b1f0: 496e ldr r1, [pc, #440] ; (802b3ac <http_recv+0x57c>)
  29673. 802b1f2: 220c movs r2, #12
  29674. 802b1f4: f7f6 fe9e bl 8021f34 <strncmp>
  29675. 802b1f8: b908 cbnz r0, 802b1fe <http_recv+0x3ce>
  29676. {
  29677. fs_open("/role.js", &file);
  29678. 802b1fa: 486d ldr r0, [pc, #436] ; (802b3b0 <http_recv+0x580>)
  29679. 802b1fc: e0a6 b.n 802b34c <http_recv+0x51c>
  29680. hs->left = file.len;
  29681. send_data(pcb, hs);
  29682. tcp_sent(pcb, http_sent);
  29683. }
  29684. else if (strncmp(data, "GET /settings.html", 18) == 0) // +
  29685. 802b1fe: 4630 mov r0, r6
  29686. 802b200: 496c ldr r1, [pc, #432] ; (802b3b4 <http_recv+0x584>)
  29687. 802b202: 2212 movs r2, #18
  29688. 802b204: f7f6 fe96 bl 8021f34 <strncmp>
  29689. 802b208: b918 cbnz r0, 802b212 <http_recv+0x3e2>
  29690. {
  29691. HTTP_UpdateUserLoginTime(user_id);
  29692. 802b20a: 4648 mov r0, r9
  29693. 802b20c: f7ff f8dc bl 802a3c8 <HTTP_UpdateUserLoginTime>
  29694. 802b210: e04c b.n 802b2ac <http_recv+0x47c>
  29695. hs->file = file.data;
  29696. hs->left = file.len;
  29697. send_data(pcb, hs);
  29698. tcp_sent(pcb, http_sent);
  29699. }
  29700. else if (strncmp(data, "GET /info.html", 14) == 0) // +
  29701. 802b212: 4630 mov r0, r6
  29702. 802b214: 4968 ldr r1, [pc, #416] ; (802b3b8 <http_recv+0x588>)
  29703. 802b216: 220e movs r2, #14
  29704. 802b218: f7f6 fe8c bl 8021f34 <strncmp>
  29705. 802b21c: b918 cbnz r0, 802b226 <http_recv+0x3f6>
  29706. {
  29707. HTTP_UpdateUserLoginTime(user_id);
  29708. 802b21e: 4648 mov r0, r9
  29709. 802b220: f7ff f8d2 bl 802a3c8 <HTTP_UpdateUserLoginTime>
  29710. 802b224: e036 b.n 802b294 <http_recv+0x464>
  29711. hs->file = file.data;
  29712. hs->left = file.len;
  29713. send_data(pcb, hs);
  29714. tcp_sent(pcb, http_sent);
  29715. }
  29716. else if (strncmp(data, "GET /getJson.cgi", 16) == 0) // +
  29717. 802b226: 4630 mov r0, r6
  29718. 802b228: 4964 ldr r1, [pc, #400] ; (802b3bc <http_recv+0x58c>)
  29719. 802b22a: 2210 movs r2, #16
  29720. 802b22c: f7f6 fe82 bl 8021f34 <strncmp>
  29721. 802b230: b948 cbnz r0, 802b246 <http_recv+0x416>
  29722. {
  29723. HTTP_GetParamsPage1(sendBuf);
  29724. 802b232: 4e63 ldr r6, [pc, #396] ; (802b3c0 <http_recv+0x590>)
  29725. 802b234: 4630 mov r0, r6
  29726. 802b236: f000 f907 bl 802b448 <HTTP_GetParamsPage1>
  29727. hs->file = sendBuf;
  29728. 802b23a: 6026 str r6, [r4, #0]
  29729. hs->left = strlen(sendBuf);
  29730. 802b23c: 4630 mov r0, r6
  29731. 802b23e: f7f6 fe17 bl 8021e70 <strlen>
  29732. 802b242: 6060 str r0, [r4, #4]
  29733. 802b244: e089 b.n 802b35a <http_recv+0x52a>
  29734. send_data(pcb, hs);
  29735. tcp_sent(pcb, http_sent);
  29736. }
  29737. else if (strncmp(data, "GET /settings.cgi", 17) == 0) // +
  29738. 802b246: 4630 mov r0, r6
  29739. 802b248: 495e ldr r1, [pc, #376] ; (802b3c4 <http_recv+0x594>)
  29740. 802b24a: 2211 movs r2, #17
  29741. 802b24c: f7f6 fe72 bl 8021f34 <strncmp>
  29742. 802b250: b970 cbnz r0, 802b270 <http_recv+0x440>
  29743. {
  29744. SET_PAGE = SET_PAGE_PAGE2;
  29745. 802b252: 4b5d ldr r3, [pc, #372] ; (802b3c8 <http_recv+0x598>)
  29746. if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
  29747. 802b254: f8df 8168 ldr.w r8, [pc, #360] ; 802b3c0 <http_recv+0x590>
  29748. 802b258: 4e5c ldr r6, [pc, #368] ; (802b3cc <http_recv+0x59c>)
  29749. 802b25a: 485d ldr r0, [pc, #372] ; (802b3d0 <http_recv+0x5a0>)
  29750. send_data(pcb, hs);
  29751. tcp_sent(pcb, http_sent);
  29752. }
  29753. else if (strncmp(data, "GET /settings.cgi", 17) == 0) // +
  29754. {
  29755. SET_PAGE = SET_PAGE_PAGE2;
  29756. 802b25c: 2202 movs r2, #2
  29757. 802b25e: 701a strb r2, [r3, #0]
  29758. if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
  29759. 802b260: 4b5c ldr r3, [pc, #368] ; (802b3d4 <http_recv+0x5a4>)
  29760. 802b262: 4641 mov r1, r8
  29761. 802b264: 881a ldrh r2, [r3, #0]
  29762. 802b266: 4633 mov r3, r6
  29763. 802b268: f7ff fcee bl 802ac48 <HTTP_SettingsPage>
  29764. 802b26c: b9f0 cbnz r0, 802b2ac <http_recv+0x47c>
  29765. 802b26e: e065 b.n 802b33c <http_recv+0x50c>
  29766. hs->left = file.len;
  29767. send_data(pcb, hs);
  29768. tcp_sent(pcb, http_sent);
  29769. }
  29770. }
  29771. else if (strncmp(data, "GET /info.cgi", 13) == 0) // +
  29772. 802b270: 4630 mov r0, r6
  29773. 802b272: 4959 ldr r1, [pc, #356] ; (802b3d8 <http_recv+0x5a8>)
  29774. 802b274: 220d movs r2, #13
  29775. 802b276: f7f6 fe5d bl 8021f34 <strncmp>
  29776. 802b27a: b968 cbnz r0, 802b298 <http_recv+0x468>
  29777. {
  29778. if (HTTP_InfoPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
  29779. 802b27c: 4b55 ldr r3, [pc, #340] ; (802b3d4 <http_recv+0x5a4>)
  29780. 802b27e: f8df 8140 ldr.w r8, [pc, #320] ; 802b3c0 <http_recv+0x590>
  29781. 802b282: 4e52 ldr r6, [pc, #328] ; (802b3cc <http_recv+0x59c>)
  29782. 802b284: 881a ldrh r2, [r3, #0]
  29783. 802b286: 4852 ldr r0, [pc, #328] ; (802b3d0 <http_recv+0x5a0>)
  29784. 802b288: 4641 mov r1, r8
  29785. 802b28a: 4633 mov r3, r6
  29786. 802b28c: f7ff fda4 bl 802add8 <HTTP_InfoPage>
  29787. 802b290: b900 cbnz r0, 802b294 <http_recv+0x464>
  29788. 802b292: e053 b.n 802b33c <http_recv+0x50c>
  29789. send_data(pcb, hs);
  29790. tcp_sent(pcb, http_sent);
  29791. }
  29792. else
  29793. {
  29794. fs_open("/info.html", &file);
  29795. 802b294: 4851 ldr r0, [pc, #324] ; (802b3dc <http_recv+0x5ac>)
  29796. 802b296: e059 b.n 802b34c <http_recv+0x51c>
  29797. send_data(pcb, hs);
  29798. tcp_sent(pcb, http_sent);
  29799. }
  29800. }
  29801. /* Сброс настроек и сохранине */
  29802. else if (strncmp(data, "GET /reset.cgi", 14) == 0)
  29803. 802b298: 4630 mov r0, r6
  29804. 802b29a: 4951 ldr r1, [pc, #324] ; (802b3e0 <http_recv+0x5b0>)
  29805. 802b29c: 220e movs r2, #14
  29806. 802b29e: f7f6 fe49 bl 8021f34 <strncmp>
  29807. 802b2a2: b928 cbnz r0, 802b2b0 <http_recv+0x480>
  29808. {
  29809. HTTP_ResetSettings();
  29810. 802b2a4: f000 fcda bl 802bc5c <HTTP_ResetSettings>
  29811. HTTP_SaveSettings();
  29812. 802b2a8: f000 fcdf bl 802bc6a <HTTP_SaveSettings>
  29813. fs_open("/settings.html", &file);
  29814. 802b2ac: 484d ldr r0, [pc, #308] ; (802b3e4 <http_recv+0x5b4>)
  29815. 802b2ae: e04d b.n 802b34c <http_recv+0x51c>
  29816. hs->left = file.len;
  29817. send_data(pcb, hs);
  29818. tcp_sent(pcb, http_sent);
  29819. }
  29820. /* Перезагрузка контроллера */
  29821. else if (strncmp(data, "GET /reboot.cgi", 15) == 0)
  29822. 802b2b0: 4630 mov r0, r6
  29823. 802b2b2: 494d ldr r1, [pc, #308] ; (802b3e8 <http_recv+0x5b8>)
  29824. 802b2b4: 220f movs r2, #15
  29825. 802b2b6: f7f6 fe3d bl 8021f34 <strncmp>
  29826. 802b2ba: b910 cbnz r0, 802b2c2 <http_recv+0x492>
  29827. {
  29828. HTTP_Reboot();
  29829. 802b2bc: f000 fcd7 bl 802bc6e <HTTP_Reboot>
  29830. 802b2c0: e053 b.n 802b36a <http_recv+0x53a>
  29831. }
  29832. /* Подтверждение новых сетевых настроек */
  29833. else if (strncmp(data, "GET /confirm.cgi", 16) == 0)
  29834. 802b2c2: 4630 mov r0, r6
  29835. 802b2c4: 4949 ldr r1, [pc, #292] ; (802b3ec <http_recv+0x5bc>)
  29836. 802b2c6: 2210 movs r2, #16
  29837. 802b2c8: f7f6 fe34 bl 8021f34 <strncmp>
  29838. 802b2cc: b920 cbnz r0, 802b2d8 <http_recv+0x4a8>
  29839. {
  29840. SetWebReinitFlag(false);
  29841. 802b2ce: f7fc fe3f bl 8027f50 <SetWebReinitFlag>
  29842. SetConfirmWebParamsFlag();
  29843. 802b2d2: f7fc fe43 bl 8027f5c <SetConfirmWebParamsFlag>
  29844. 802b2d6: e038 b.n 802b34a <http_recv+0x51a>
  29845. hs->left = file.len;
  29846. send_data(pcb, hs);
  29847. tcp_sent(pcb, http_sent);
  29848. }
  29849. /* Проверка пароля, переход в bootloader */
  29850. else if (strncmp(data, "POST /checkpwd.cgi", 18) == 0)
  29851. 802b2d8: 4630 mov r0, r6
  29852. 802b2da: 4945 ldr r1, [pc, #276] ; (802b3f0 <http_recv+0x5c0>)
  29853. 802b2dc: 2212 movs r2, #18
  29854. 802b2de: f7f6 fe29 bl 8021f34 <strncmp>
  29855. 802b2e2: b950 cbnz r0, 802b2fa <http_recv+0x4ca>
  29856. {
  29857. HTTP_ConfirmBootPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  29858. 802b2e4: f8df 80d8 ldr.w r8, [pc, #216] ; 802b3c0 <http_recv+0x590>
  29859. 802b2e8: 4e38 ldr r6, [pc, #224] ; (802b3cc <http_recv+0x59c>)
  29860. 802b2ea: 4b3a ldr r3, [pc, #232] ; (802b3d4 <http_recv+0x5a4>)
  29861. 802b2ec: 4838 ldr r0, [pc, #224] ; (802b3d0 <http_recv+0x5a0>)
  29862. 802b2ee: 881a ldrh r2, [r3, #0]
  29863. 802b2f0: 4641 mov r1, r8
  29864. 802b2f2: 4633 mov r3, r6
  29865. 802b2f4: f7ff fa4c bl 802a790 <HTTP_ConfirmBootPwd>
  29866. 802b2f8: e020 b.n 802b33c <http_recv+0x50c>
  29867. hs->left = sendBufLoadLen;
  29868. send_data(pcb, hs);
  29869. tcp_sent(pcb, http_sent);
  29870. }
  29871. // На производстве
  29872. else if (strncmp(data, "GET /setProdate.cgi", 19) == 0)
  29873. 802b2fa: 4630 mov r0, r6
  29874. 802b2fc: 493d ldr r1, [pc, #244] ; (802b3f4 <http_recv+0x5c4>)
  29875. 802b2fe: 2213 movs r2, #19
  29876. 802b300: f7f6 fe18 bl 8021f34 <strncmp>
  29877. 802b304: b950 cbnz r0, 802b31c <http_recv+0x4ec>
  29878. {
  29879. HTTP_Prodate(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  29880. 802b306: f8df 80b8 ldr.w r8, [pc, #184] ; 802b3c0 <http_recv+0x590>
  29881. 802b30a: 4e30 ldr r6, [pc, #192] ; (802b3cc <http_recv+0x59c>)
  29882. 802b30c: 4b31 ldr r3, [pc, #196] ; (802b3d4 <http_recv+0x5a4>)
  29883. 802b30e: 4830 ldr r0, [pc, #192] ; (802b3d0 <http_recv+0x5a0>)
  29884. 802b310: 881a ldrh r2, [r3, #0]
  29885. 802b312: 4641 mov r1, r8
  29886. 802b314: 4633 mov r3, r6
  29887. 802b316: f7ff fcc3 bl 802aca0 <HTTP_Prodate>
  29888. 802b31a: e00f b.n 802b33c <http_recv+0x50c>
  29889. hs->left = sendBufLoadLen;
  29890. send_data(pcb, hs);
  29891. tcp_sent(pcb, http_sent);
  29892. }
  29893. // На производстве
  29894. else if (strncmp(data, "GET /progon.cgi", 15) == 0)
  29895. 802b31c: 4630 mov r0, r6
  29896. 802b31e: 4936 ldr r1, [pc, #216] ; (802b3f8 <http_recv+0x5c8>)
  29897. 802b320: 220f movs r2, #15
  29898. 802b322: f7f6 fe07 bl 8021f34 <strncmp>
  29899. 802b326: b968 cbnz r0, 802b344 <http_recv+0x514>
  29900. {
  29901. HTTP_Progon(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  29902. 802b328: 4b2a ldr r3, [pc, #168] ; (802b3d4 <http_recv+0x5a4>)
  29903. 802b32a: f8df 8094 ldr.w r8, [pc, #148] ; 802b3c0 <http_recv+0x590>
  29904. 802b32e: 4e27 ldr r6, [pc, #156] ; (802b3cc <http_recv+0x59c>)
  29905. 802b330: 881a ldrh r2, [r3, #0]
  29906. 802b332: 4827 ldr r0, [pc, #156] ; (802b3d0 <http_recv+0x5a0>)
  29907. 802b334: 4641 mov r1, r8
  29908. 802b336: 4633 mov r3, r6
  29909. 802b338: f7ff f92e bl 802a598 <HTTP_Progon>
  29910. hs->file = sendBuf;
  29911. 802b33c: f8c4 8000 str.w r8, [r4]
  29912. hs->left = sendBufLoadLen;
  29913. 802b340: 8833 ldrh r3, [r6, #0]
  29914. 802b342: e009 b.n 802b358 <http_recv+0x528>
  29915. send_data(pcb, hs);
  29916. tcp_sent(pcb, http_sent);
  29917. }
  29918. else
  29919. {
  29920. HTTP_UpdateUserLoginTime(user_id);
  29921. 802b344: 4648 mov r0, r9
  29922. 802b346: f7ff f83f bl 802a3c8 <HTTP_UpdateUserLoginTime>
  29923. fs_open("/index.html", &file); // +
  29924. 802b34a: 482c ldr r0, [pc, #176] ; (802b3fc <http_recv+0x5cc>)
  29925. 802b34c: a905 add r1, sp, #20
  29926. 802b34e: f7ff f84d bl 802a3ec <fs_open>
  29927. hs->file = file.data;
  29928. 802b352: 9b05 ldr r3, [sp, #20]
  29929. 802b354: 6023 str r3, [r4, #0]
  29930. hs->left = file.len;
  29931. 802b356: 9b06 ldr r3, [sp, #24]
  29932. 802b358: 6063 str r3, [r4, #4]
  29933. send_data(pcb, hs);
  29934. 802b35a: 4628 mov r0, r5
  29935. 802b35c: 4621 mov r1, r4
  29936. 802b35e: f7ff f881 bl 802a464 <send_data>
  29937. tcp_sent(pcb, http_sent);
  29938. 802b362: 4628 mov r0, r5
  29939. 802b364: 4907 ldr r1, [pc, #28] ; (802b384 <http_recv+0x554>)
  29940. 802b366: f002 f92b bl 802d5c0 <tcp_sent>
  29941. }
  29942. }
  29943. }
  29944. pbuf_free(p);
  29945. 802b36a: 4638 mov r0, r7
  29946. 802b36c: f001 fe60 bl 802d030 <pbuf_free>
  29947. close_conn(pcb,hs);
  29948. 802b370: 4628 mov r0, r5
  29949. }
  29950. if (err == ERR_OK && p == NULL)
  29951. {
  29952. close_conn(pcb, hs);
  29953. 802b372: 4621 mov r1, r4
  29954. 802b374: f7ff f899 bl 802a4aa <close_conn>
  29955. }
  29956. return ERR_OK;
  29957. }
  29958. 802b378: 2000 movs r0, #0
  29959. 802b37a: b01d add sp, #116 ; 0x74
  29960. 802b37c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  29961. 802b380: 0803a2cf .word 0x0803a2cf
  29962. 802b384: 0802a4d7 .word 0x0802a4d7
  29963. 802b388: 2000fb84 .word 0x2000fb84
  29964. 802b38c: 2000fb58 .word 0x2000fb58
  29965. 802b390: 0803a288 .word 0x0803a288
  29966. 802b394: 0803a292 .word 0x0803a292
  29967. 802b398: 0803a296 .word 0x0803a296
  29968. 802b39c: 0803a2a1 .word 0x0803a2a1
  29969. 802b3a0: 0803a2a5 .word 0x0803a2a5
  29970. 802b3a4: 0803a2f4 .word 0x0803a2f4
  29971. 802b3a8: 0803a2f8 .word 0x0803a2f8
  29972. 802b3ac: 0803a2b2 .word 0x0803a2b2
  29973. 802b3b0: 0803a2b6 .word 0x0803a2b6
  29974. 802b3b4: 0803a301 .word 0x0803a301
  29975. 802b3b8: 0803a314 .word 0x0803a314
  29976. 802b3bc: 0803a323 .word 0x0803a323
  29977. 802b3c0: 2000ecac .word 0x2000ecac
  29978. 802b3c4: 0803a334 .word 0x0803a334
  29979. 802b3c8: 20002a38 .word 0x20002a38
  29980. 802b3cc: 20002a40 .word 0x20002a40
  29981. 802b3d0: 2000f47c .word 0x2000f47c
  29982. 802b3d4: 20002a42 .word 0x20002a42
  29983. 802b3d8: 0803a346 .word 0x0803a346
  29984. 802b3dc: 0803a318 .word 0x0803a318
  29985. 802b3e0: 0803a354 .word 0x0803a354
  29986. 802b3e4: 0803a305 .word 0x0803a305
  29987. 802b3e8: 0803a363 .word 0x0803a363
  29988. 802b3ec: 0803a373 .word 0x0803a373
  29989. 802b3f0: 0803a390 .word 0x0803a390
  29990. 802b3f4: 0803a3a3 .word 0x0803a3a3
  29991. 802b3f8: 0803a3b7 .word 0x0803a3b7
  29992. 802b3fc: 0803a384 .word 0x0803a384
  29993. 0802b400 <NVIC_SystemReset>:
  29994. 802b400: f3bf 8f4f dsb sy
  29995. (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  29996. 802b404: 4a04 ldr r2, [pc, #16] ; (802b418 <NVIC_SystemReset+0x18>)
  29997. 802b406: 4b05 ldr r3, [pc, #20] ; (802b41c <NVIC_SystemReset+0x1c>)
  29998. 802b408: 68d1 ldr r1, [r2, #12]
  29999. 802b40a: f401 61e0 and.w r1, r1, #1792 ; 0x700
  30000. 802b40e: 430b orrs r3, r1
  30001. __STATIC_INLINE void NVIC_SystemReset(void)
  30002. //static inline void NVIC_SystemReset(void)
  30003. {
  30004. __DSB(); /* Ensure all outstanding memory accesses included
  30005. buffered write are completed before reset */
  30006. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  30007. 802b410: 60d3 str r3, [r2, #12]
  30008. 802b412: f3bf 8f4f dsb sy
  30009. 802b416: e7fe b.n 802b416 <NVIC_SystemReset+0x16>
  30010. 802b418: e000ed00 .word 0xe000ed00
  30011. 802b41c: 05fa0004 .word 0x05fa0004
  30012. 0802b420 <vTaskReboot>:
  30013. /**
  30014. * @brief
  30015. */
  30016. void vTaskReboot(void * pvParameters)
  30017. {
  30018. 802b420: b508 push {r3, lr}
  30019. for (;;)
  30020. {
  30021. mode = *(bool*)pvParameters;
  30022. if (mode)
  30023. 802b422: 7803 ldrb r3, [r0, #0]
  30024. 802b424: b133 cbz r3, 802b434 <vTaskReboot+0x14>
  30025. {
  30026. SetLoadMode();
  30027. 802b426: f7fc fd8d bl 8027f44 <SetLoadMode>
  30028. */
  30029. void HTTP_SaveSettings(void)
  30030. {
  30031. // taskENTER_CRITICAL();
  30032. SETTINGS_Save();
  30033. 802b42a: f7fd f8f5 bl 8028618 <SETTINGS_Save>
  30034. if (mode)
  30035. {
  30036. SetLoadMode();
  30037. HTTP_SaveSettings();
  30038. SNMP_SendUserTrap(FW_VERSION_UPDATE);
  30039. 802b42e: 2001 movs r0, #1
  30040. 802b430: f009 fcfa bl 8034e28 <SNMP_SendUserTrap>
  30041. vTaskDelay(1010);
  30042. NVIC_SystemReset();
  30043. }
  30044. else
  30045. {
  30046. vTaskDelay(1000);
  30047. 802b434: f44f 707a mov.w r0, #1000 ; 0x3e8
  30048. 802b438: f7fe fa3c bl 80298b4 <vTaskDelay>
  30049. /* Блокируем управление ключем на тау секунд*/
  30050. //IO_KeyBlockOn();
  30051. vTaskDelay(1010);
  30052. 802b43c: f240 30f2 movw r0, #1010 ; 0x3f2
  30053. 802b440: f7fe fa38 bl 80298b4 <vTaskDelay>
  30054. NVIC_SystemReset();
  30055. 802b444: f7ff ffdc bl 802b400 <NVIC_SystemReset>
  30056. 0802b448 <HTTP_GetParamsPage1>:
  30057. /**
  30058. * @brief Возвращяет строку с настройками на первой странице
  30059. * @retval None
  30060. */
  30061. void HTTP_GetParamsPage1(char *buf)
  30062. {
  30063. 802b448: b510 push {r4, lr}
  30064. char str[40];
  30065. uint8_t len;
  30066. memset(buf, 0, 1000);
  30067. 802b44a: f44f 727a mov.w r2, #1000 ; 0x3e8
  30068. /**
  30069. * @brief Возвращяет строку с настройками на первой странице
  30070. * @retval None
  30071. */
  30072. void HTTP_GetParamsPage1(char *buf)
  30073. {
  30074. 802b44e: b08c sub sp, #48 ; 0x30
  30075. 802b450: 4604 mov r4, r0
  30076. char str[40];
  30077. uint8_t len;
  30078. memset(buf, 0, 1000);
  30079. 802b452: 2100 movs r1, #0
  30080. 802b454: f7f6 fb34 bl 8021ac0 <memset>
  30081. // Headers для поддержки saffari
  30082. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  30083. 802b458: 4620 mov r0, r4
  30084. 802b45a: 4975 ldr r1, [pc, #468] ; (802b630 <HTTP_GetParamsPage1+0x1e8>)
  30085. 802b45c: f7f6 fcaa bl 8021db4 <strcpy>
  30086. // Параметры UPS
  30087. GetInputVoltageStr(str, &len);
  30088. 802b460: a802 add r0, sp, #8
  30089. 802b462: f10d 0107 add.w r1, sp, #7
  30090. 802b466: f7fc f9af bl 80277c8 <GetInputVoltageStr>
  30091. strcat(buf, "{\"AC\":\"");
  30092. 802b46a: 4620 mov r0, r4
  30093. 802b46c: 4971 ldr r1, [pc, #452] ; (802b634 <HTTP_GetParamsPage1+0x1ec>)
  30094. 802b46e: f7f6 fb8d bl 8021b8c <strcat>
  30095. strncat(buf, str, len);
  30096. 802b472: f89d 2007 ldrb.w r2, [sp, #7]
  30097. 802b476: a902 add r1, sp, #8
  30098. 802b478: 4620 mov r0, r4
  30099. 802b47a: f7f6 fd29 bl 8021ed0 <strncat>
  30100. GetOutputVoltageStr(str, &len);
  30101. 802b47e: a802 add r0, sp, #8
  30102. 802b480: f10d 0107 add.w r1, sp, #7
  30103. 802b484: f7fc f9b6 bl 80277f4 <GetOutputVoltageStr>
  30104. strcat(buf, "\",\"DC\":\"");
  30105. 802b488: 4620 mov r0, r4
  30106. 802b48a: 496b ldr r1, [pc, #428] ; (802b638 <HTTP_GetParamsPage1+0x1f0>)
  30107. 802b48c: f7f6 fb7e bl 8021b8c <strcat>
  30108. strncat(buf, str, len);
  30109. 802b490: f89d 2007 ldrb.w r2, [sp, #7]
  30110. 802b494: a902 add r1, sp, #8
  30111. 802b496: 4620 mov r0, r4
  30112. 802b498: f7f6 fd1a bl 8021ed0 <strncat>
  30113. GetInputFreqStr(str, &len);
  30114. 802b49c: a802 add r0, sp, #8
  30115. 802b49e: f10d 0107 add.w r1, sp, #7
  30116. 802b4a2: f7fc f965 bl 8027770 <GetInputFreqStr>
  30117. strcat(buf, "\",\"in_freq\":\"");
  30118. 802b4a6: 4620 mov r0, r4
  30119. 802b4a8: 4964 ldr r1, [pc, #400] ; (802b63c <HTTP_GetParamsPage1+0x1f4>)
  30120. 802b4aa: f7f6 fb6f bl 8021b8c <strcat>
  30121. strncat(buf, str, len);
  30122. 802b4ae: f89d 2007 ldrb.w r2, [sp, #7]
  30123. 802b4b2: a902 add r1, sp, #8
  30124. 802b4b4: 4620 mov r0, r4
  30125. 802b4b6: f7f6 fd0b bl 8021ed0 <strncat>
  30126. GetOutputFreqStr(str, &len);
  30127. 802b4ba: a802 add r0, sp, #8
  30128. 802b4bc: f10d 0107 add.w r1, sp, #7
  30129. 802b4c0: f7fc f96c bl 802779c <GetOutputFreqStr>
  30130. strcat(buf, "\",\"out_freq\":\"");
  30131. 802b4c4: 4620 mov r0, r4
  30132. 802b4c6: 495e ldr r1, [pc, #376] ; (802b640 <HTTP_GetParamsPage1+0x1f8>)
  30133. 802b4c8: f7f6 fb60 bl 8021b8c <strcat>
  30134. strncat(buf, str, len);
  30135. 802b4cc: f89d 2007 ldrb.w r2, [sp, #7]
  30136. 802b4d0: a902 add r1, sp, #8
  30137. 802b4d2: 4620 mov r0, r4
  30138. 802b4d4: f7f6 fcfc bl 8021ed0 <strncat>
  30139. GetPowerStr(str, &len);
  30140. 802b4d8: a802 add r0, sp, #8
  30141. 802b4da: f10d 0107 add.w r1, sp, #7
  30142. 802b4de: f7fc f99f bl 8027820 <GetPowerStr>
  30143. strcat(buf, "\",\"pwr\":\"");
  30144. 802b4e2: 4620 mov r0, r4
  30145. 802b4e4: 4957 ldr r1, [pc, #348] ; (802b644 <HTTP_GetParamsPage1+0x1fc>)
  30146. 802b4e6: f7f6 fb51 bl 8021b8c <strcat>
  30147. strncat(buf, str, len);
  30148. 802b4ea: f89d 2007 ldrb.w r2, [sp, #7]
  30149. 802b4ee: a902 add r1, sp, #8
  30150. 802b4f0: 4620 mov r0, r4
  30151. 802b4f2: f7f6 fced bl 8021ed0 <strncat>
  30152. GetLineFailBitStr(str, &len);
  30153. 802b4f6: a802 add r0, sp, #8
  30154. 802b4f8: f10d 0107 add.w r1, sp, #7
  30155. 802b4fc: f7fc f92e bl 802775c <GetLineFailBitStr>
  30156. strcat(buf, "\",\"line_fail\":\"");
  30157. 802b500: 4620 mov r0, r4
  30158. 802b502: 4951 ldr r1, [pc, #324] ; (802b648 <HTTP_GetParamsPage1+0x200>)
  30159. 802b504: f7f6 fb42 bl 8021b8c <strcat>
  30160. strncat(buf, str, len);
  30161. 802b508: f89d 2007 ldrb.w r2, [sp, #7]
  30162. 802b50c: a902 add r1, sp, #8
  30163. 802b50e: 4620 mov r0, r4
  30164. 802b510: f7f6 fcde bl 8021ed0 <strncat>
  30165. GetLowBatteryBitStr(str, &len);
  30166. 802b514: a802 add r0, sp, #8
  30167. 802b516: f10d 0107 add.w r1, sp, #7
  30168. 802b51a: f7fc f924 bl 8027766 <GetLowBatteryBitStr>
  30169. strcat(buf, "\",\"low_battery\":\"");
  30170. 802b51e: 4620 mov r0, r4
  30171. 802b520: 494a ldr r1, [pc, #296] ; (802b64c <HTTP_GetParamsPage1+0x204>)
  30172. 802b522: f7f6 fb33 bl 8021b8c <strcat>
  30173. strncat(buf, str, len);
  30174. 802b526: f89d 2007 ldrb.w r2, [sp, #7]
  30175. 802b52a: a902 add r1, sp, #8
  30176. 802b52c: 4620 mov r0, r4
  30177. 802b52e: f7f6 fccf bl 8021ed0 <strncat>
  30178. GetBatCapacityStr(str, &len);
  30179. 802b532: a802 add r0, sp, #8
  30180. 802b534: f10d 0107 add.w r1, sp, #7
  30181. 802b538: f7fc f984 bl 8027844 <GetBatCapacityStr>
  30182. strcat(buf, "\",\"bat_cap\":\"");
  30183. 802b53c: 4620 mov r0, r4
  30184. 802b53e: 4944 ldr r1, [pc, #272] ; (802b650 <HTTP_GetParamsPage1+0x208>)
  30185. 802b540: f7f6 fb24 bl 8021b8c <strcat>
  30186. strncat(buf, str, len);
  30187. 802b544: f89d 2007 ldrb.w r2, [sp, #7]
  30188. 802b548: a902 add r1, sp, #8
  30189. 802b54a: 4620 mov r0, r4
  30190. 802b54c: f7f6 fcc0 bl 8021ed0 <strncat>
  30191. GetInternalTempStr(str, &len);
  30192. 802b550: a802 add r0, sp, #8
  30193. 802b552: f10d 0107 add.w r1, sp, #7
  30194. 802b556: f7fc f999 bl 802788c <GetInternalTempStr>
  30195. strcat(buf, "\",\"inner_temp\":\"");
  30196. 802b55a: 4620 mov r0, r4
  30197. 802b55c: 493d ldr r1, [pc, #244] ; (802b654 <HTTP_GetParamsPage1+0x20c>)
  30198. 802b55e: f7f6 fb15 bl 8021b8c <strcat>
  30199. strncat(buf, str, len);
  30200. 802b562: f89d 2007 ldrb.w r2, [sp, #7]
  30201. 802b566: a902 add r1, sp, #8
  30202. 802b568: 4620 mov r0, r4
  30203. 802b56a: f7f6 fcb1 bl 8021ed0 <strncat>
  30204. GetRuntimeStr(str, &len);
  30205. 802b56e: a802 add r0, sp, #8
  30206. 802b570: f10d 0107 add.w r1, sp, #7
  30207. 802b574: f7fc f978 bl 8027868 <GetRuntimeStr>
  30208. strcat(buf, "\",\"bat_time_left\":\"");
  30209. 802b578: 4620 mov r0, r4
  30210. 802b57a: 4937 ldr r1, [pc, #220] ; (802b658 <HTTP_GetParamsPage1+0x210>)
  30211. 802b57c: f7f6 fb06 bl 8021b8c <strcat>
  30212. strncat(buf, str, len);
  30213. 802b580: f89d 2007 ldrb.w r2, [sp, #7]
  30214. 802b584: a902 add r1, sp, #8
  30215. 802b586: 4620 mov r0, r4
  30216. 802b588: f7f6 fca2 bl 8021ed0 <strncat>
  30217. // Мониторинг
  30218. // load_monitor (нагрузка, 0 - норма, 1 - fail)
  30219. // temp_monitor (внутренняя температура, 0 - норма, 1 - fail)
  30220. // connect_monitor (связь с UPSом, 0 - норма, 1 - fail)
  30221. GetLoadMonitorStr(str, &len);
  30222. 802b58c: a802 add r0, sp, #8
  30223. 802b58e: f10d 0107 add.w r1, sp, #7
  30224. 802b592: f7fc f991 bl 80278b8 <GetLoadMonitorStr>
  30225. strcat(buf, "\",\"load_monitor\":\"");
  30226. 802b596: 4620 mov r0, r4
  30227. 802b598: 4930 ldr r1, [pc, #192] ; (802b65c <HTTP_GetParamsPage1+0x214>)
  30228. 802b59a: f7f6 faf7 bl 8021b8c <strcat>
  30229. strncat(buf, str, len);
  30230. 802b59e: f89d 2007 ldrb.w r2, [sp, #7]
  30231. 802b5a2: a902 add r1, sp, #8
  30232. 802b5a4: 4620 mov r0, r4
  30233. 802b5a6: f7f6 fc93 bl 8021ed0 <strncat>
  30234. GetTempMonitorStr(str, &len);
  30235. 802b5aa: a802 add r0, sp, #8
  30236. 802b5ac: f10d 0107 add.w r1, sp, #7
  30237. 802b5b0: f7fc f987 bl 80278c2 <GetTempMonitorStr>
  30238. strcat(buf, "\",\"temp_monitor\":\"");
  30239. 802b5b4: 4620 mov r0, r4
  30240. 802b5b6: 492a ldr r1, [pc, #168] ; (802b660 <HTTP_GetParamsPage1+0x218>)
  30241. 802b5b8: f7f6 fae8 bl 8021b8c <strcat>
  30242. strncat(buf, str, len);
  30243. 802b5bc: f89d 2007 ldrb.w r2, [sp, #7]
  30244. 802b5c0: a902 add r1, sp, #8
  30245. 802b5c2: 4620 mov r0, r4
  30246. 802b5c4: f7f6 fc84 bl 8021ed0 <strncat>
  30247. GetConnectMonitorStr(str, &len);
  30248. 802b5c8: a802 add r0, sp, #8
  30249. 802b5ca: f10d 0107 add.w r1, sp, #7
  30250. 802b5ce: f7fc f97d bl 80278cc <GetConnectMonitorStr>
  30251. strcat(buf, "\",\"connect_monitor\":\"");
  30252. 802b5d2: 4620 mov r0, r4
  30253. 802b5d4: 4923 ldr r1, [pc, #140] ; (802b664 <HTTP_GetParamsPage1+0x21c>)
  30254. 802b5d6: f7f6 fad9 bl 8021b8c <strcat>
  30255. strncat(buf, str, len);
  30256. 802b5da: f89d 2007 ldrb.w r2, [sp, #7]
  30257. 802b5de: a902 add r1, sp, #8
  30258. 802b5e0: 4620 mov r0, r4
  30259. 802b5e2: f7f6 fc75 bl 8021ed0 <strncat>
  30260. GetAlarmStr(str, &len);
  30261. 802b5e6: a802 add r0, sp, #8
  30262. 802b5e8: f10d 0107 add.w r1, sp, #7
  30263. 802b5ec: f7fc f974 bl 80278d8 <GetAlarmStr>
  30264. strcat(buf, "\",\"alarm\":\"");
  30265. 802b5f0: 4620 mov r0, r4
  30266. 802b5f2: 491d ldr r1, [pc, #116] ; (802b668 <HTTP_GetParamsPage1+0x220>)
  30267. 802b5f4: f7f6 faca bl 8021b8c <strcat>
  30268. strncat(buf, str, len);
  30269. 802b5f8: f89d 2007 ldrb.w r2, [sp, #7]
  30270. 802b5fc: a902 add r1, sp, #8
  30271. 802b5fe: 4620 mov r0, r4
  30272. 802b600: f7f6 fc66 bl 8021ed0 <strncat>
  30273. // Признак изменения сетевых настроек
  30274. GetWebReinitFlag(str, &len);
  30275. 802b604: a802 add r0, sp, #8
  30276. 802b606: f10d 0107 add.w r1, sp, #7
  30277. 802b60a: f7fc fc81 bl 8027f10 <GetWebReinitFlag>
  30278. strcat(buf, "\",\"netsettings_changed\":\"");
  30279. 802b60e: 4620 mov r0, r4
  30280. 802b610: 4916 ldr r1, [pc, #88] ; (802b66c <HTTP_GetParamsPage1+0x224>)
  30281. 802b612: f7f6 fabb bl 8021b8c <strcat>
  30282. strncat(buf, str, len);
  30283. 802b616: a902 add r1, sp, #8
  30284. 802b618: f89d 2007 ldrb.w r2, [sp, #7]
  30285. 802b61c: 4620 mov r0, r4
  30286. 802b61e: f7f6 fc57 bl 8021ed0 <strncat>
  30287. strncat(buf, "\"}", 2);
  30288. 802b622: 4620 mov r0, r4
  30289. 802b624: 4912 ldr r1, [pc, #72] ; (802b670 <HTTP_GetParamsPage1+0x228>)
  30290. 802b626: 2202 movs r2, #2
  30291. 802b628: f7f6 fc52 bl 8021ed0 <strncat>
  30292. //printf(buf);
  30293. }
  30294. 802b62c: b00c add sp, #48 ; 0x30
  30295. 802b62e: bd10 pop {r4, pc}
  30296. 802b630: 0803fae4 .word 0x0803fae4
  30297. 802b634: 0803fb10 .word 0x0803fb10
  30298. 802b638: 0803fb18 .word 0x0803fb18
  30299. 802b63c: 0803fb21 .word 0x0803fb21
  30300. 802b640: 0803fb2f .word 0x0803fb2f
  30301. 802b644: 0803fb3e .word 0x0803fb3e
  30302. 802b648: 0803fb48 .word 0x0803fb48
  30303. 802b64c: 0803fb58 .word 0x0803fb58
  30304. 802b650: 0803fb6a .word 0x0803fb6a
  30305. 802b654: 0803fb78 .word 0x0803fb78
  30306. 802b658: 0803fb89 .word 0x0803fb89
  30307. 802b65c: 0803fb9d .word 0x0803fb9d
  30308. 802b660: 0803fbb0 .word 0x0803fbb0
  30309. 802b664: 0803fbc3 .word 0x0803fbc3
  30310. 802b668: 0803fbd9 .word 0x0803fbd9
  30311. 802b66c: 0803fbe5 .word 0x0803fbe5
  30312. 802b670: 0803fbff .word 0x0803fbff
  30313. 0802b674 <HTTP_GetSettings>:
  30314. /**
  30315. * @brief Возвращяет строку с настройками на второй странице
  30316. * @retval None
  30317. */
  30318. void HTTP_GetSettings(char *buf)
  30319. {
  30320. 802b674: b510 push {r4, lr}
  30321. char str[30];
  30322. uint8_t len;
  30323. /* Headers для поддержки saffari */
  30324. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  30325. 802b676: 49bf ldr r1, [pc, #764] ; (802b974 <HTTP_GetSettings+0x300>)
  30326. /**
  30327. * @brief Возвращяет строку с настройками на второй странице
  30328. * @retval None
  30329. */
  30330. void HTTP_GetSettings(char *buf)
  30331. {
  30332. 802b678: b08a sub sp, #40 ; 0x28
  30333. 802b67a: 4604 mov r4, r0
  30334. char str[30];
  30335. uint8_t len;
  30336. /* Headers для поддержки saffari */
  30337. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  30338. 802b67c: f7f6 fb9a bl 8021db4 <strcpy>
  30339. /* SNMP */
  30340. GetReadCommunity(str, &len);
  30341. 802b680: a802 add r0, sp, #8
  30342. 802b682: f10d 0107 add.w r1, sp, #7
  30343. 802b686: f7fc fb65 bl 8027d54 <GetReadCommunity>
  30344. strcat(buf, "{\"read_community\":\"");
  30345. 802b68a: 4620 mov r0, r4
  30346. 802b68c: 49ba ldr r1, [pc, #744] ; (802b978 <HTTP_GetSettings+0x304>)
  30347. 802b68e: f7f6 fa7d bl 8021b8c <strcat>
  30348. strncat(buf, str, len);
  30349. 802b692: f89d 2007 ldrb.w r2, [sp, #7]
  30350. 802b696: a902 add r1, sp, #8
  30351. 802b698: 4620 mov r0, r4
  30352. 802b69a: f7f6 fc19 bl 8021ed0 <strncat>
  30353. GetWriteCommunity(str, &len);
  30354. 802b69e: a802 add r0, sp, #8
  30355. 802b6a0: f10d 0107 add.w r1, sp, #7
  30356. 802b6a4: f7fc fb66 bl 8027d74 <GetWriteCommunity>
  30357. strcat(buf, "\",\"write_community\":\"");
  30358. 802b6a8: 4620 mov r0, r4
  30359. 802b6aa: 49b4 ldr r1, [pc, #720] ; (802b97c <HTTP_GetSettings+0x308>)
  30360. 802b6ac: f7f6 fa6e bl 8021b8c <strcat>
  30361. strncat(buf, str, len);
  30362. 802b6b0: f89d 2007 ldrb.w r2, [sp, #7]
  30363. 802b6b4: a902 add r1, sp, #8
  30364. 802b6b6: 4620 mov r0, r4
  30365. 802b6b8: f7f6 fc0a bl 8021ed0 <strncat>
  30366. GetManagerIp(str, &len);
  30367. 802b6bc: a802 add r0, sp, #8
  30368. 802b6be: f10d 0107 add.w r1, sp, #7
  30369. 802b6c2: f7fc fb67 bl 8027d94 <GetManagerIp>
  30370. strcat(buf, "\",\"managerIP\":\"");
  30371. 802b6c6: 4620 mov r0, r4
  30372. 802b6c8: 49ad ldr r1, [pc, #692] ; (802b980 <HTTP_GetSettings+0x30c>)
  30373. 802b6ca: f7f6 fa5f bl 8021b8c <strcat>
  30374. strncat(buf, str, len);
  30375. 802b6ce: f89d 2007 ldrb.w r2, [sp, #7]
  30376. 802b6d2: a902 add r1, sp, #8
  30377. 802b6d4: 4620 mov r0, r4
  30378. 802b6d6: f7f6 fbfb bl 8021ed0 <strncat>
  30379. GetManagerIp2(str, &len);
  30380. 802b6da: a802 add r0, sp, #8
  30381. 802b6dc: f10d 0107 add.w r1, sp, #7
  30382. 802b6e0: f7fc fb68 bl 8027db4 <GetManagerIp2>
  30383. strcat(buf, "\",\"managerIP2\":\"");
  30384. 802b6e4: 4620 mov r0, r4
  30385. 802b6e6: 49a7 ldr r1, [pc, #668] ; (802b984 <HTTP_GetSettings+0x310>)
  30386. 802b6e8: f7f6 fa50 bl 8021b8c <strcat>
  30387. strncat(buf, str, len);
  30388. 802b6ec: f89d 2007 ldrb.w r2, [sp, #7]
  30389. 802b6f0: a902 add r1, sp, #8
  30390. 802b6f2: 4620 mov r0, r4
  30391. 802b6f4: f7f6 fbec bl 8021ed0 <strncat>
  30392. GetManagerIp3(str, &len);
  30393. 802b6f8: a802 add r0, sp, #8
  30394. 802b6fa: f10d 0107 add.w r1, sp, #7
  30395. 802b6fe: f7fc fb69 bl 8027dd4 <GetManagerIp3>
  30396. strcat(buf, "\",\"managerIP3\":\"");
  30397. 802b702: 4620 mov r0, r4
  30398. 802b704: 49a0 ldr r1, [pc, #640] ; (802b988 <HTTP_GetSettings+0x314>)
  30399. 802b706: f7f6 fa41 bl 8021b8c <strcat>
  30400. strncat(buf, str, len);
  30401. 802b70a: f89d 2007 ldrb.w r2, [sp, #7]
  30402. 802b70e: a902 add r1, sp, #8
  30403. 802b710: 4620 mov r0, r4
  30404. 802b712: f7f6 fbdd bl 8021ed0 <strncat>
  30405. GetManagerIp4(str, &len);
  30406. 802b716: a802 add r0, sp, #8
  30407. 802b718: f10d 0107 add.w r1, sp, #7
  30408. 802b71c: f7fc fb6a bl 8027df4 <GetManagerIp4>
  30409. strcat(buf, "\",\"managerIP4\":\"");
  30410. 802b720: 4620 mov r0, r4
  30411. 802b722: 499a ldr r1, [pc, #616] ; (802b98c <HTTP_GetSettings+0x318>)
  30412. 802b724: f7f6 fa32 bl 8021b8c <strcat>
  30413. strncat(buf, str, len);
  30414. 802b728: f89d 2007 ldrb.w r2, [sp, #7]
  30415. 802b72c: a902 add r1, sp, #8
  30416. 802b72e: 4620 mov r0, r4
  30417. 802b730: f7f6 fbce bl 8021ed0 <strncat>
  30418. GetManagerIp5(str, &len);
  30419. 802b734: a802 add r0, sp, #8
  30420. 802b736: f10d 0107 add.w r1, sp, #7
  30421. 802b73a: f7fc fb6b bl 8027e14 <GetManagerIp5>
  30422. strcat(buf, "\",\"managerIP5\":\"");
  30423. 802b73e: 4620 mov r0, r4
  30424. 802b740: 4993 ldr r1, [pc, #588] ; (802b990 <HTTP_GetSettings+0x31c>)
  30425. 802b742: f7f6 fa23 bl 8021b8c <strcat>
  30426. strncat(buf, str, len);
  30427. 802b746: a902 add r1, sp, #8
  30428. 802b748: f89d 2007 ldrb.w r2, [sp, #7]
  30429. 802b74c: 4620 mov r0, r4
  30430. 802b74e: f7f6 fbbf bl 8021ed0 <strncat>
  30431. /*Параметры реле и сухих контактов*/
  30432. GetDINTypeActStr(str, &len, 0);
  30433. 802b752: 2200 movs r2, #0
  30434. 802b754: a802 add r0, sp, #8
  30435. 802b756: f10d 0107 add.w r1, sp, #7
  30436. 802b75a: f7fc f96d bl 8027a38 <GetDINTypeActStr>
  30437. strcat(buf, "\",\"di1\":\"");
  30438. 802b75e: 4620 mov r0, r4
  30439. 802b760: 498c ldr r1, [pc, #560] ; (802b994 <HTTP_GetSettings+0x320>)
  30440. 802b762: f7f6 fa13 bl 8021b8c <strcat>
  30441. strncat(buf, str, len);
  30442. 802b766: a902 add r1, sp, #8
  30443. 802b768: f89d 2007 ldrb.w r2, [sp, #7]
  30444. 802b76c: 4620 mov r0, r4
  30445. 802b76e: f7f6 fbaf bl 8021ed0 <strncat>
  30446. GetROTypeActStr(str, &len, 0);
  30447. 802b772: 2200 movs r2, #0
  30448. 802b774: a802 add r0, sp, #8
  30449. 802b776: f10d 0107 add.w r1, sp, #7
  30450. 802b77a: f7fc f971 bl 8027a60 <GetROTypeActStr>
  30451. strcat(buf, "\",\"ro1\":\"");
  30452. 802b77e: 4620 mov r0, r4
  30453. 802b780: 4985 ldr r1, [pc, #532] ; (802b998 <HTTP_GetSettings+0x324>)
  30454. 802b782: f7f6 fa03 bl 8021b8c <strcat>
  30455. strncat(buf, str, len);
  30456. 802b786: a902 add r1, sp, #8
  30457. 802b788: f89d 2007 ldrb.w r2, [sp, #7]
  30458. 802b78c: 4620 mov r0, r4
  30459. 802b78e: f7f6 fb9f bl 8021ed0 <strncat>
  30460. GetROTypeActStr(str, &len, 1);
  30461. 802b792: 2201 movs r2, #1
  30462. 802b794: a802 add r0, sp, #8
  30463. 802b796: f10d 0107 add.w r1, sp, #7
  30464. 802b79a: f7fc f961 bl 8027a60 <GetROTypeActStr>
  30465. strcat(buf, "\",\"ro2\":\"");
  30466. 802b79e: 4620 mov r0, r4
  30467. 802b7a0: 497e ldr r1, [pc, #504] ; (802b99c <HTTP_GetSettings+0x328>)
  30468. 802b7a2: f7f6 f9f3 bl 8021b8c <strcat>
  30469. strncat(buf, str, len);
  30470. 802b7a6: f89d 2007 ldrb.w r2, [sp, #7]
  30471. 802b7aa: a902 add r1, sp, #8
  30472. 802b7ac: 4620 mov r0, r4
  30473. 802b7ae: f7f6 fb8f bl 8021ed0 <strncat>
  30474. /* WEB */
  30475. GetIpStr(str, &len);
  30476. 802b7b2: a802 add r0, sp, #8
  30477. 802b7b4: f10d 0107 add.w r1, sp, #7
  30478. 802b7b8: f7fc fa76 bl 8027ca8 <GetIpStr>
  30479. strcat(buf, "\",\"ipaddr\":\"");
  30480. 802b7bc: 4620 mov r0, r4
  30481. 802b7be: 4978 ldr r1, [pc, #480] ; (802b9a0 <HTTP_GetSettings+0x32c>)
  30482. 802b7c0: f7f6 f9e4 bl 8021b8c <strcat>
  30483. strncat(buf, str, len);
  30484. 802b7c4: f89d 2007 ldrb.w r2, [sp, #7]
  30485. 802b7c8: a902 add r1, sp, #8
  30486. 802b7ca: 4620 mov r0, r4
  30487. 802b7cc: f7f6 fb80 bl 8021ed0 <strncat>
  30488. GetGatewayStr(str, &len);
  30489. 802b7d0: a802 add r0, sp, #8
  30490. 802b7d2: f10d 0107 add.w r1, sp, #7
  30491. 802b7d6: f7fc fa7d bl 8027cd4 <GetGatewayStr>
  30492. strcat(buf, "\",\"gw\":\"");
  30493. 802b7da: 4620 mov r0, r4
  30494. 802b7dc: 4971 ldr r1, [pc, #452] ; (802b9a4 <HTTP_GetSettings+0x330>)
  30495. 802b7de: f7f6 f9d5 bl 8021b8c <strcat>
  30496. strncat(buf, str, len);
  30497. 802b7e2: f89d 2007 ldrb.w r2, [sp, #7]
  30498. 802b7e6: a902 add r1, sp, #8
  30499. 802b7e8: 4620 mov r0, r4
  30500. 802b7ea: f7f6 fb71 bl 8021ed0 <strncat>
  30501. GetMaskStr(str, &len);
  30502. 802b7ee: a802 add r0, sp, #8
  30503. 802b7f0: f10d 0107 add.w r1, sp, #7
  30504. 802b7f4: f7fc fa84 bl 8027d00 <GetMaskStr>
  30505. strcat(buf, "\",\"mask\":\"");
  30506. 802b7f8: 4620 mov r0, r4
  30507. 802b7fa: 496b ldr r1, [pc, #428] ; (802b9a8 <HTTP_GetSettings+0x334>)
  30508. 802b7fc: f7f6 f9c6 bl 8021b8c <strcat>
  30509. strncat(buf, str, len);
  30510. 802b800: f89d 2007 ldrb.w r2, [sp, #7]
  30511. 802b804: a902 add r1, sp, #8
  30512. 802b806: 4620 mov r0, r4
  30513. 802b808: f7f6 fb62 bl 8021ed0 <strncat>
  30514. GetDhcpStateStr(str, &len);
  30515. 802b80c: a802 add r0, sp, #8
  30516. 802b80e: f10d 0107 add.w r1, sp, #7
  30517. 802b812: f7fc fa8b bl 8027d2c <GetDhcpStateStr>
  30518. strcat(buf, "\",\"dhcp\":");
  30519. 802b816: 4620 mov r0, r4
  30520. 802b818: 4964 ldr r1, [pc, #400] ; (802b9ac <HTTP_GetSettings+0x338>)
  30521. 802b81a: f7f6 f9b7 bl 8021b8c <strcat>
  30522. strncat(buf, str, len);
  30523. 802b81e: f89d 2007 ldrb.w r2, [sp, #7]
  30524. 802b822: a902 add r1, sp, #8
  30525. 802b824: 4620 mov r0, r4
  30526. 802b826: f7f6 fb53 bl 8021ed0 <strncat>
  30527. /* RADIUS */
  30528. GetRDSIpStr(str, &len);
  30529. 802b82a: a802 add r0, sp, #8
  30530. 802b82c: f10d 0107 add.w r1, sp, #7
  30531. 802b830: f7fc fb00 bl 8027e34 <GetRDSIpStr>
  30532. strcat(buf, ",\"rs_server\":\"");
  30533. 802b834: 4620 mov r0, r4
  30534. 802b836: 495e ldr r1, [pc, #376] ; (802b9b0 <HTTP_GetSettings+0x33c>)
  30535. 802b838: f7f6 f9a8 bl 8021b8c <strcat>
  30536. strncat(buf, str, len);
  30537. 802b83c: f89d 2007 ldrb.w r2, [sp, #7]
  30538. 802b840: a902 add r1, sp, #8
  30539. 802b842: 4620 mov r0, r4
  30540. 802b844: f7f6 fb44 bl 8021ed0 <strncat>
  30541. GetRDSPortStr(str, &len);
  30542. 802b848: a802 add r0, sp, #8
  30543. 802b84a: f10d 0107 add.w r1, sp, #7
  30544. 802b84e: f7fc fb01 bl 8027e54 <GetRDSPortStr>
  30545. strcat(buf, "\",\"rs_port\":\"");
  30546. 802b852: 4620 mov r0, r4
  30547. 802b854: 4957 ldr r1, [pc, #348] ; (802b9b4 <HTTP_GetSettings+0x340>)
  30548. 802b856: f7f6 f999 bl 8021b8c <strcat>
  30549. strncat(buf, str, len);
  30550. 802b85a: f89d 2007 ldrb.w r2, [sp, #7]
  30551. 802b85e: a902 add r1, sp, #8
  30552. 802b860: 4620 mov r0, r4
  30553. 802b862: f7f6 fb35 bl 8021ed0 <strncat>
  30554. GetRDSPasswordkStr(str, &len);
  30555. 802b866: a802 add r0, sp, #8
  30556. 802b868: f10d 0107 add.w r1, sp, #7
  30557. 802b86c: f7fc fb16 bl 8027e9c <GetRDSPasswordkStr>
  30558. strcat(buf, "\",\"rs_pwd\":\"");
  30559. 802b870: 4620 mov r0, r4
  30560. 802b872: 4951 ldr r1, [pc, #324] ; (802b9b8 <HTTP_GetSettings+0x344>)
  30561. 802b874: f7f6 f98a bl 8021b8c <strcat>
  30562. strncat(buf, str, len);
  30563. 802b878: f89d 2007 ldrb.w r2, [sp, #7]
  30564. 802b87c: a902 add r1, sp, #8
  30565. 802b87e: 4620 mov r0, r4
  30566. 802b880: f7f6 fb26 bl 8021ed0 <strncat>
  30567. GetRDSKeyAccesstStr(str, &len);
  30568. 802b884: a802 add r0, sp, #8
  30569. 802b886: f10d 0107 add.w r1, sp, #7
  30570. 802b88a: f7fc faf5 bl 8027e78 <GetRDSKeyAccesstStr>
  30571. strcat(buf, "\",\"rs_key\":\"");
  30572. 802b88e: 4620 mov r0, r4
  30573. 802b890: 494a ldr r1, [pc, #296] ; (802b9bc <HTTP_GetSettings+0x348>)
  30574. 802b892: f7f6 f97b bl 8021b8c <strcat>
  30575. strncat(buf, str, len);
  30576. 802b896: f89d 2007 ldrb.w r2, [sp, #7]
  30577. 802b89a: a902 add r1, sp, #8
  30578. 802b89c: 4620 mov r0, r4
  30579. 802b89e: f7f6 fb17 bl 8021ed0 <strncat>
  30580. GetRDSEnableStateStr(str, &len);
  30581. 802b8a2: a802 add r0, sp, #8
  30582. 802b8a4: f10d 0107 add.w r1, sp, #7
  30583. 802b8a8: f7fc fb08 bl 8027ebc <GetRDSEnableStateStr>
  30584. strcat(buf, "\",\"rs_enabled\":");
  30585. 802b8ac: 4620 mov r0, r4
  30586. 802b8ae: 4944 ldr r1, [pc, #272] ; (802b9c0 <HTTP_GetSettings+0x34c>)
  30587. 802b8b0: f7f6 f96c bl 8021b8c <strcat>
  30588. strncat(buf, str, len);
  30589. 802b8b4: f89d 2007 ldrb.w r2, [sp, #7]
  30590. 802b8b8: a902 add r1, sp, #8
  30591. 802b8ba: 4620 mov r0, r4
  30592. 802b8bc: f7f6 fb08 bl 8021ed0 <strncat>
  30593. /* Параметры даты и времени */
  30594. GetDateStr(str, &len);
  30595. 802b8c0: a802 add r0, sp, #8
  30596. 802b8c2: f10d 0107 add.w r1, sp, #7
  30597. 802b8c6: f7fc f819 bl 80278fc <GetDateStr>
  30598. strcat(buf, ",\"date\":\"");
  30599. 802b8ca: 4620 mov r0, r4
  30600. 802b8cc: 493d ldr r1, [pc, #244] ; (802b9c4 <HTTP_GetSettings+0x350>)
  30601. 802b8ce: f7f6 f95d bl 8021b8c <strcat>
  30602. strncat(buf, str, len);
  30603. 802b8d2: f89d 2007 ldrb.w r2, [sp, #7]
  30604. 802b8d6: a902 add r1, sp, #8
  30605. 802b8d8: 4620 mov r0, r4
  30606. 802b8da: f7f6 faf9 bl 8021ed0 <strncat>
  30607. GetTimeStr(str, &len);
  30608. 802b8de: a802 add r0, sp, #8
  30609. 802b8e0: f10d 0107 add.w r1, sp, #7
  30610. 802b8e4: f7fc f828 bl 8027938 <GetTimeStr>
  30611. strcat(buf, "\",\"time\":\"");
  30612. 802b8e8: 4620 mov r0, r4
  30613. 802b8ea: 4937 ldr r1, [pc, #220] ; (802b9c8 <HTTP_GetSettings+0x354>)
  30614. 802b8ec: f7f6 f94e bl 8021b8c <strcat>
  30615. strncat(buf, str, len);
  30616. 802b8f0: f89d 2007 ldrb.w r2, [sp, #7]
  30617. 802b8f4: a902 add r1, sp, #8
  30618. 802b8f6: 4620 mov r0, r4
  30619. 802b8f8: f7f6 faea bl 8021ed0 <strncat>
  30620. /* Параметры SNTP */
  30621. GetSntpStateStr(str, &len);
  30622. 802b8fc: a802 add r0, sp, #8
  30623. 802b8fe: f10d 0107 add.w r1, sp, #7
  30624. 802b902: f7fc f847 bl 8027994 <GetSntpStateStr>
  30625. strcat(buf, "\",\"ntp\":\"");
  30626. 802b906: 4620 mov r0, r4
  30627. 802b908: 4930 ldr r1, [pc, #192] ; (802b9cc <HTTP_GetSettings+0x358>)
  30628. 802b90a: f7f6 f93f bl 8021b8c <strcat>
  30629. strncat(buf, str, len);
  30630. 802b90e: f89d 2007 ldrb.w r2, [sp, #7]
  30631. 802b912: a902 add r1, sp, #8
  30632. 802b914: 4620 mov r0, r4
  30633. 802b916: f7f6 fadb bl 8021ed0 <strncat>
  30634. GetSntpServerIpStr(str, &len);
  30635. 802b91a: a802 add r0, sp, #8
  30636. 802b91c: f10d 0107 add.w r1, sp, #7
  30637. 802b920: f7fc f852 bl 80279c8 <GetSntpServerIpStr>
  30638. strcat(buf, "\",\"ntpservip\":\"");
  30639. 802b924: 4620 mov r0, r4
  30640. 802b926: 492a ldr r1, [pc, #168] ; (802b9d0 <HTTP_GetSettings+0x35c>)
  30641. 802b928: f7f6 f930 bl 8021b8c <strcat>
  30642. strncat(buf, str, len);
  30643. 802b92c: f89d 2007 ldrb.w r2, [sp, #7]
  30644. 802b930: a902 add r1, sp, #8
  30645. 802b932: 4620 mov r0, r4
  30646. 802b934: f7f6 facc bl 8021ed0 <strncat>
  30647. GetSntpTimeZoneStr(str, &len);
  30648. 802b938: a802 add r0, sp, #8
  30649. 802b93a: f10d 0107 add.w r1, sp, #7
  30650. 802b93e: f7fc f853 bl 80279e8 <GetSntpTimeZoneStr>
  30651. strcat(buf, "\",\"utc\":\"");
  30652. 802b942: 4620 mov r0, r4
  30653. 802b944: 4923 ldr r1, [pc, #140] ; (802b9d4 <HTTP_GetSettings+0x360>)
  30654. 802b946: f7f6 f921 bl 8021b8c <strcat>
  30655. strncat(buf, str, len);
  30656. 802b94a: f89d 2007 ldrb.w r2, [sp, #7]
  30657. 802b94e: a902 add r1, sp, #8
  30658. 802b950: 4620 mov r0, r4
  30659. 802b952: f7f6 fabd bl 8021ed0 <strncat>
  30660. GetUnixTimeStr(str, &len);
  30661. 802b956: a802 add r0, sp, #8
  30662. 802b958: f10d 0107 add.w r1, sp, #7
  30663. 802b95c: f7fc f804 bl 8027968 <GetUnixTimeStr>
  30664. strcat(buf, "\",\"utm\":\"");
  30665. 802b960: 4620 mov r0, r4
  30666. 802b962: 491d ldr r1, [pc, #116] ; (802b9d8 <HTTP_GetSettings+0x364>)
  30667. 802b964: f7f6 f912 bl 8021b8c <strcat>
  30668. strncat(buf, str, len);
  30669. 802b968: f89d 2007 ldrb.w r2, [sp, #7]
  30670. 802b96c: a902 add r1, sp, #8
  30671. 802b96e: 4620 mov r0, r4
  30672. 802b970: e034 b.n 802b9dc <HTTP_GetSettings+0x368>
  30673. 802b972: bf00 nop
  30674. 802b974: 0803fae4 .word 0x0803fae4
  30675. 802b978: 0803fc02 .word 0x0803fc02
  30676. 802b97c: 0803fc16 .word 0x0803fc16
  30677. 802b980: 0803fc2c .word 0x0803fc2c
  30678. 802b984: 0803fc3c .word 0x0803fc3c
  30679. 802b988: 0803fc4d .word 0x0803fc4d
  30680. 802b98c: 0803fc5e .word 0x0803fc5e
  30681. 802b990: 0803fc6f .word 0x0803fc6f
  30682. 802b994: 0803fc80 .word 0x0803fc80
  30683. 802b998: 0803fc8a .word 0x0803fc8a
  30684. 802b99c: 0803fc94 .word 0x0803fc94
  30685. 802b9a0: 0803fc9e .word 0x0803fc9e
  30686. 802b9a4: 0803fcab .word 0x0803fcab
  30687. 802b9a8: 0803fcb4 .word 0x0803fcb4
  30688. 802b9ac: 0803fcbf .word 0x0803fcbf
  30689. 802b9b0: 0803fcc9 .word 0x0803fcc9
  30690. 802b9b4: 0803fcd8 .word 0x0803fcd8
  30691. 802b9b8: 0803fce6 .word 0x0803fce6
  30692. 802b9bc: 0803fcf3 .word 0x0803fcf3
  30693. 802b9c0: 0803fd00 .word 0x0803fd00
  30694. 802b9c4: 0803fd10 .word 0x0803fd10
  30695. 802b9c8: 0803fd1a .word 0x0803fd1a
  30696. 802b9cc: 0803fd25 .word 0x0803fd25
  30697. 802b9d0: 0803fd2f .word 0x0803fd2f
  30698. 802b9d4: 0803fd3f .word 0x0803fd3f
  30699. 802b9d8: 0803fd49 .word 0x0803fd49
  30700. 802b9dc: f7f6 fa78 bl 8021ed0 <strncat>
  30701. GetSntpLastDataStr(str, &len);
  30702. 802b9e0: a802 add r0, sp, #8
  30703. 802b9e2: f10d 0107 add.w r1, sp, #7
  30704. 802b9e6: f7fc f817 bl 8027a18 <GetSntpLastDataStr>
  30705. strcat(buf, "\",\"lastsynctime\":\"");
  30706. 802b9ea: 4620 mov r0, r4
  30707. 802b9ec: 490f ldr r1, [pc, #60] ; (802ba2c <HTTP_GetSettings+0x3b8>)
  30708. 802b9ee: f7f6 f8cd bl 8021b8c <strcat>
  30709. strncat(buf, str, len);
  30710. 802b9f2: f89d 2007 ldrb.w r2, [sp, #7]
  30711. 802b9f6: a902 add r1, sp, #8
  30712. 802b9f8: 4620 mov r0, r4
  30713. 802b9fa: f7f6 fa69 bl 8021ed0 <strncat>
  30714. /* Признак изменения сетевых настроек */
  30715. GetWebReinitFlag(str, &len);
  30716. 802b9fe: a802 add r0, sp, #8
  30717. 802ba00: f10d 0107 add.w r1, sp, #7
  30718. 802ba04: f7fc fa84 bl 8027f10 <GetWebReinitFlag>
  30719. strcat(buf, "\",\"netsettings_changed\":\"");
  30720. 802ba08: 4620 mov r0, r4
  30721. 802ba0a: 4909 ldr r1, [pc, #36] ; (802ba30 <HTTP_GetSettings+0x3bc>)
  30722. 802ba0c: f7f6 f8be bl 8021b8c <strcat>
  30723. strncat(buf, str, len);
  30724. 802ba10: a902 add r1, sp, #8
  30725. 802ba12: f89d 2007 ldrb.w r2, [sp, #7]
  30726. 802ba16: 4620 mov r0, r4
  30727. 802ba18: f7f6 fa5a bl 8021ed0 <strncat>
  30728. strncat(buf, "\"}", 2);
  30729. 802ba1c: 4620 mov r0, r4
  30730. 802ba1e: 4905 ldr r1, [pc, #20] ; (802ba34 <HTTP_GetSettings+0x3c0>)
  30731. 802ba20: 2202 movs r2, #2
  30732. 802ba22: f7f6 fa55 bl 8021ed0 <strncat>
  30733. //printf(buf);
  30734. }
  30735. 802ba26: b00a add sp, #40 ; 0x28
  30736. 802ba28: bd10 pop {r4, pc}
  30737. 802ba2a: bf00 nop
  30738. 802ba2c: 0803fd53 .word 0x0803fd53
  30739. 802ba30: 0803fbe5 .word 0x0803fbe5
  30740. 802ba34: 0803fbff .word 0x0803fbff
  30741. 0802ba38 <HTTP_GetInfo>:
  30742. * @brief Возвращяет строку с информацией об устройстве
  30743. * @retval None
  30744. */
  30745. // TODO Согласовать максимальную длину строк
  30746. void HTTP_GetInfo(char *buf)
  30747. {
  30748. 802ba38: b510 push {r4, lr}
  30749. char str[40];
  30750. uint8_t len;
  30751. /* Headers для поддержки saffari */
  30752. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  30753. 802ba3a: 4960 ldr r1, [pc, #384] ; (802bbbc <HTTP_GetInfo+0x184>)
  30754. * @brief Возвращяет строку с информацией об устройстве
  30755. * @retval None
  30756. */
  30757. // TODO Согласовать максимальную длину строк
  30758. void HTTP_GetInfo(char *buf)
  30759. {
  30760. 802ba3c: b08c sub sp, #48 ; 0x30
  30761. 802ba3e: 4604 mov r4, r0
  30762. char str[40];
  30763. uint8_t len;
  30764. /* Headers для поддержки saffari */
  30765. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  30766. 802ba40: f7f6 f9b8 bl 8021db4 <strcpy>
  30767. GetWorkTimeStr(str, &len);
  30768. 802ba44: a802 add r0, sp, #8
  30769. 802ba46: f10d 0107 add.w r1, sp, #7
  30770. 802ba4a: f7fc f81d bl 8027a88 <GetWorkTimeStr>
  30771. strcat(buf, "{\"uptime\":\"");
  30772. 802ba4e: 4620 mov r0, r4
  30773. 802ba50: 495b ldr r1, [pc, #364] ; (802bbc0 <HTTP_GetInfo+0x188>)
  30774. 802ba52: f7f6 f89b bl 8021b8c <strcat>
  30775. strncat(buf, str, len);
  30776. 802ba56: f89d 2007 ldrb.w r2, [sp, #7]
  30777. 802ba5a: a902 add r1, sp, #8
  30778. 802ba5c: 4620 mov r0, r4
  30779. 802ba5e: f7f6 fa37 bl 8021ed0 <strncat>
  30780. GetModelStr(str, &len);
  30781. 802ba62: a802 add r0, sp, #8
  30782. 802ba64: f10d 0107 add.w r1, sp, #7
  30783. 802ba68: f7fc f834 bl 8027ad4 <GetModelStr>
  30784. strcat(buf, "\",\"model\":\"");
  30785. 802ba6c: 4620 mov r0, r4
  30786. 802ba6e: 4955 ldr r1, [pc, #340] ; (802bbc4 <HTTP_GetInfo+0x18c>)
  30787. 802ba70: f7f6 f88c bl 8021b8c <strcat>
  30788. strncat(buf, str, len);
  30789. 802ba74: f89d 2007 ldrb.w r2, [sp, #7]
  30790. 802ba78: a902 add r1, sp, #8
  30791. 802ba7a: 4620 mov r0, r4
  30792. 802ba7c: f7f6 fa28 bl 8021ed0 <strncat>
  30793. GetProductionDataStr(str, &len);
  30794. 802ba80: a802 add r0, sp, #8
  30795. 802ba82: f10d 0107 add.w r1, sp, #7
  30796. 802ba86: f7fc f837 bl 8027af8 <GetProductionDataStr>
  30797. strcat(buf, "\",\"prodate\":\"");
  30798. 802ba8a: 4620 mov r0, r4
  30799. 802ba8c: 494e ldr r1, [pc, #312] ; (802bbc8 <HTTP_GetInfo+0x190>)
  30800. 802ba8e: f7f6 f87d bl 8021b8c <strcat>
  30801. strncat(buf, str, len);
  30802. 802ba92: f89d 2007 ldrb.w r2, [sp, #7]
  30803. 802ba96: a902 add r1, sp, #8
  30804. 802ba98: 4620 mov r0, r4
  30805. 802ba9a: f7f6 fa19 bl 8021ed0 <strncat>
  30806. GetVersionStr(str, &len);
  30807. 802ba9e: a802 add r0, sp, #8
  30808. 802baa0: f10d 0107 add.w r1, sp, #7
  30809. 802baa4: f7fc f83a bl 8027b1c <GetVersionStr>
  30810. strcat(buf, "\",\"fwversion\":\"");
  30811. 802baa8: 4620 mov r0, r4
  30812. 802baaa: 4948 ldr r1, [pc, #288] ; (802bbcc <HTTP_GetInfo+0x194>)
  30813. 802baac: f7f6 f86e bl 8021b8c <strcat>
  30814. strncat(buf, str, len);
  30815. 802bab0: f89d 2007 ldrb.w r2, [sp, #7]
  30816. 802bab4: a902 add r1, sp, #8
  30817. 802bab6: 4620 mov r0, r4
  30818. 802bab8: f7f6 fa0a bl 8021ed0 <strncat>
  30819. GetMacStr(str, &len);
  30820. 802babc: a802 add r0, sp, #8
  30821. 802babe: f10d 0107 add.w r1, sp, #7
  30822. 802bac2: f7fc f83d bl 8027b40 <GetMacStr>
  30823. strcat(buf, "\",\"macaddr\":\"");
  30824. 802bac6: 4620 mov r0, r4
  30825. 802bac8: 4941 ldr r1, [pc, #260] ; (802bbd0 <HTTP_GetInfo+0x198>)
  30826. 802baca: f7f6 f85f bl 8021b8c <strcat>
  30827. strncat(buf, str, len);
  30828. 802bace: f89d 2007 ldrb.w r2, [sp, #7]
  30829. 802bad2: a902 add r1, sp, #8
  30830. 802bad4: 4620 mov r0, r4
  30831. 802bad6: f7f6 f9fb bl 8021ed0 <strncat>
  30832. GetSerialNumberStr(str, &len);
  30833. 802bada: a802 add r0, sp, #8
  30834. 802badc: f10d 0107 add.w r1, sp, #7
  30835. 802bae0: f7fc f840 bl 8027b64 <GetSerialNumberStr>
  30836. strcat(buf, "\",\"serno\":\"");
  30837. 802bae4: 4620 mov r0, r4
  30838. 802bae6: 493b ldr r1, [pc, #236] ; (802bbd4 <HTTP_GetInfo+0x19c>)
  30839. 802bae8: f7f6 f850 bl 8021b8c <strcat>
  30840. strncat(buf, str, len);
  30841. 802baec: f89d 2007 ldrb.w r2, [sp, #7]
  30842. 802baf0: a902 add r1, sp, #8
  30843. 802baf2: 4620 mov r0, r4
  30844. 802baf4: f7f6 f9ec bl 8021ed0 <strncat>
  30845. GetOwnerStr(str, &len);
  30846. 802baf8: a802 add r0, sp, #8
  30847. 802bafa: f10d 0107 add.w r1, sp, #7
  30848. 802bafe: f7fc f843 bl 8027b88 <GetOwnerStr>
  30849. strcat(buf, "\",\"owner\":\"");
  30850. 802bb02: 4620 mov r0, r4
  30851. 802bb04: 4934 ldr r1, [pc, #208] ; (802bbd8 <HTTP_GetInfo+0x1a0>)
  30852. 802bb06: f7f6 f841 bl 8021b8c <strcat>
  30853. strncat(buf, str, len);
  30854. 802bb0a: f89d 2007 ldrb.w r2, [sp, #7]
  30855. 802bb0e: a902 add r1, sp, #8
  30856. 802bb10: 4620 mov r0, r4
  30857. 802bb12: f7f6 f9dd bl 8021ed0 <strncat>
  30858. GetLocationStr(str, &len);
  30859. 802bb16: a802 add r0, sp, #8
  30860. 802bb18: f10d 0107 add.w r1, sp, #7
  30861. 802bb1c: f7fc f846 bl 8027bac <GetLocationStr>
  30862. strcat(buf, "\",\"sysLocation\":\"");
  30863. 802bb20: 4620 mov r0, r4
  30864. 802bb22: 492e ldr r1, [pc, #184] ; (802bbdc <HTTP_GetInfo+0x1a4>)
  30865. 802bb24: f7f6 f832 bl 8021b8c <strcat>
  30866. strncat(buf, str, len);
  30867. 802bb28: f89d 2007 ldrb.w r2, [sp, #7]
  30868. 802bb2c: a902 add r1, sp, #8
  30869. 802bb2e: 4620 mov r0, r4
  30870. 802bb30: f7f6 f9ce bl 8021ed0 <strncat>
  30871. GetCommentsStr(str, &len);
  30872. 802bb34: a802 add r0, sp, #8
  30873. 802bb36: f10d 0107 add.w r1, sp, #7
  30874. 802bb3a: f7fc f849 bl 8027bd0 <GetCommentsStr>
  30875. strcat(buf, "\",\"comment\":\"");
  30876. 802bb3e: 4620 mov r0, r4
  30877. 802bb40: 4927 ldr r1, [pc, #156] ; (802bbe0 <HTTP_GetInfo+0x1a8>)
  30878. 802bb42: f7f6 f823 bl 8021b8c <strcat>
  30879. strncat(buf, str, len);
  30880. 802bb46: f89d 2007 ldrb.w r2, [sp, #7]
  30881. 802bb4a: a902 add r1, sp, #8
  30882. 802bb4c: 4620 mov r0, r4
  30883. 802bb4e: f7f6 f9bf bl 8021ed0 <strncat>
  30884. GetUPSModelStr(str, &len);
  30885. 802bb52: a802 add r0, sp, #8
  30886. 802bb54: f10d 0107 add.w r1, sp, #7
  30887. 802bb58: f7fc f84c bl 8027bf4 <GetUPSModelStr>
  30888. strcat(buf, "\",\"ups_model\":\"");
  30889. 802bb5c: 4620 mov r0, r4
  30890. 802bb5e: 4921 ldr r1, [pc, #132] ; (802bbe4 <HTTP_GetInfo+0x1ac>)
  30891. 802bb60: f7f6 f814 bl 8021b8c <strcat>
  30892. strncat(buf, str, len);
  30893. 802bb64: f89d 2007 ldrb.w r2, [sp, #7]
  30894. 802bb68: a902 add r1, sp, #8
  30895. 802bb6a: 4620 mov r0, r4
  30896. 802bb6c: f7f6 f9b0 bl 8021ed0 <strncat>
  30897. GetUPSVersionStr(str, &len);
  30898. 802bb70: a802 add r0, sp, #8
  30899. 802bb72: f10d 0107 add.w r1, sp, #7
  30900. 802bb76: f7fc f84f bl 8027c18 <GetUPSVersionStr>
  30901. strcat(buf, "\",\"ups_fwversion\":\"");
  30902. 802bb7a: 4620 mov r0, r4
  30903. 802bb7c: 491a ldr r1, [pc, #104] ; (802bbe8 <HTTP_GetInfo+0x1b0>)
  30904. 802bb7e: f7f6 f805 bl 8021b8c <strcat>
  30905. strncat(buf, str, len);
  30906. 802bb82: f89d 2007 ldrb.w r2, [sp, #7]
  30907. 802bb86: a902 add r1, sp, #8
  30908. 802bb88: 4620 mov r0, r4
  30909. 802bb8a: f7f6 f9a1 bl 8021ed0 <strncat>
  30910. /* Признак изменения сетевых настроек */
  30911. GetWebReinitFlag(str, &len);
  30912. 802bb8e: a802 add r0, sp, #8
  30913. 802bb90: f10d 0107 add.w r1, sp, #7
  30914. 802bb94: f7fc f9bc bl 8027f10 <GetWebReinitFlag>
  30915. strcat(buf, "\",\"netsettings_changed\":\"");
  30916. 802bb98: 4620 mov r0, r4
  30917. 802bb9a: 4914 ldr r1, [pc, #80] ; (802bbec <HTTP_GetInfo+0x1b4>)
  30918. 802bb9c: f7f5 fff6 bl 8021b8c <strcat>
  30919. strncat(buf, str, len);
  30920. 802bba0: a902 add r1, sp, #8
  30921. 802bba2: f89d 2007 ldrb.w r2, [sp, #7]
  30922. 802bba6: 4620 mov r0, r4
  30923. 802bba8: f7f6 f992 bl 8021ed0 <strncat>
  30924. strncat(buf, "\"}", 2);
  30925. 802bbac: 4620 mov r0, r4
  30926. 802bbae: 4910 ldr r1, [pc, #64] ; (802bbf0 <HTTP_GetInfo+0x1b8>)
  30927. 802bbb0: 2202 movs r2, #2
  30928. 802bbb2: f7f6 f98d bl 8021ed0 <strncat>
  30929. }
  30930. 802bbb6: b00c add sp, #48 ; 0x30
  30931. 802bbb8: bd10 pop {r4, pc}
  30932. 802bbba: bf00 nop
  30933. 802bbbc: 0803fae4 .word 0x0803fae4
  30934. 802bbc0: 0803fd66 .word 0x0803fd66
  30935. 802bbc4: 0803fd72 .word 0x0803fd72
  30936. 802bbc8: 0803fd7e .word 0x0803fd7e
  30937. 802bbcc: 0803fd8c .word 0x0803fd8c
  30938. 802bbd0: 0803fd9c .word 0x0803fd9c
  30939. 802bbd4: 0803fdaa .word 0x0803fdaa
  30940. 802bbd8: 0803fdb6 .word 0x0803fdb6
  30941. 802bbdc: 0803fdc2 .word 0x0803fdc2
  30942. 802bbe0: 0803fdd4 .word 0x0803fdd4
  30943. 802bbe4: 0803fde2 .word 0x0803fde2
  30944. 802bbe8: 0803fdf2 .word 0x0803fdf2
  30945. 802bbec: 0803fbe5 .word 0x0803fbe5
  30946. 802bbf0: 0803fbff .word 0x0803fbff
  30947. 0802bbf4 <HTTP_GetProgonParams>:
  30948. /**
  30949. * @brief Возвращает uptime, freq, dutycicle
  30950. */
  30951. void HTTP_GetProgonParams(char *buf)
  30952. {
  30953. 802bbf4: b510 push {r4, lr}
  30954. char str[20];
  30955. u32_t tick;
  30956. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  30957. 802bbf6: 4915 ldr r1, [pc, #84] ; (802bc4c <HTTP_GetProgonParams+0x58>)
  30958. /**
  30959. * @brief Возвращает uptime, freq, dutycicle
  30960. */
  30961. void HTTP_GetProgonParams(char *buf)
  30962. {
  30963. 802bbf8: b086 sub sp, #24
  30964. 802bbfa: 4604 mov r4, r0
  30965. char str[20];
  30966. u32_t tick;
  30967. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  30968. 802bbfc: f7f6 f8da bl 8021db4 <strcpy>
  30969. strcat(buf, "{\"uptime\":\"");
  30970. 802bc00: 4913 ldr r1, [pc, #76] ; (802bc50 <HTTP_GetProgonParams+0x5c>)
  30971. 802bc02: 4620 mov r0, r4
  30972. 802bc04: f7f5 ffc2 bl 8021b8c <strcat>
  30973. snmp_get_sysuptime(&tick);
  30974. 802bc08: 4668 mov r0, sp
  30975. 802bc0a: f005 fd03 bl 8031614 <snmp_get_sysuptime>
  30976. tick = tick/100;
  30977. 802bc0e: 9b00 ldr r3, [sp, #0]
  30978. 802bc10: 2264 movs r2, #100 ; 0x64
  30979. 802bc12: fbb3 f3f2 udiv r3, r3, r2
  30980. memset(str, 0, 20);
  30981. 802bc16: 2100 movs r1, #0
  30982. 802bc18: 2214 movs r2, #20
  30983. 802bc1a: a801 add r0, sp, #4
  30984. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  30985. strcat(buf, "{\"uptime\":\"");
  30986. snmp_get_sysuptime(&tick);
  30987. tick = tick/100;
  30988. 802bc1c: 9300 str r3, [sp, #0]
  30989. memset(str, 0, 20);
  30990. 802bc1e: f7f5 ff4f bl 8021ac0 <memset>
  30991. sprintf(str, "%d", tick);
  30992. 802bc22: 9a00 ldr r2, [sp, #0]
  30993. 802bc24: 490b ldr r1, [pc, #44] ; (802bc54 <HTTP_GetProgonParams+0x60>)
  30994. 802bc26: a801 add r0, sp, #4
  30995. 802bc28: f7fb fd8c bl 8027744 <tfp_sprintf>
  30996. strncat(buf, str, strlen(str));
  30997. 802bc2c: a801 add r0, sp, #4
  30998. 802bc2e: f7f6 f91f bl 8021e70 <strlen>
  30999. 802bc32: a901 add r1, sp, #4
  31000. 802bc34: 4602 mov r2, r0
  31001. 802bc36: 4620 mov r0, r4
  31002. 802bc38: f7f6 f94a bl 8021ed0 <strncat>
  31003. strncat(buf, "\"}", 2);
  31004. 802bc3c: 4620 mov r0, r4
  31005. 802bc3e: 4906 ldr r1, [pc, #24] ; (802bc58 <HTTP_GetProgonParams+0x64>)
  31006. 802bc40: 2202 movs r2, #2
  31007. 802bc42: f7f6 f945 bl 8021ed0 <strncat>
  31008. }
  31009. 802bc46: b006 add sp, #24
  31010. 802bc48: bd10 pop {r4, pc}
  31011. 802bc4a: bf00 nop
  31012. 802bc4c: 0803fae4 .word 0x0803fae4
  31013. 802bc50: 0803fd66 .word 0x0803fd66
  31014. 802bc54: 08035e55 .word 0x08035e55
  31015. 802bc58: 0803fbff .word 0x0803fbff
  31016. 0802bc5c <HTTP_ResetSettings>:
  31017. /**
  31018. * @brief Сброс настроек (всё кроме сетевых параметров)
  31019. */
  31020. void HTTP_ResetSettings(void)
  31021. {
  31022. 802bc5c: b508 push {r3, lr}
  31023. //taskENTER_CRITICAL();
  31024. SETTINGS_SetPartDefault();
  31025. 802bc5e: f7fc fd3b bl 80286d8 <SETTINGS_SetPartDefault>
  31026. SETTINGS_Save();
  31027. //taskEXIT_CRITICAL();
  31028. }
  31029. 802bc62: e8bd 4008 ldmia.w sp!, {r3, lr}
  31030. void HTTP_ResetSettings(void)
  31031. {
  31032. //taskENTER_CRITICAL();
  31033. SETTINGS_SetPartDefault();
  31034. SETTINGS_Save();
  31035. 802bc66: f7fc bcd7 b.w 8028618 <SETTINGS_Save>
  31036. 0802bc6a <HTTP_SaveSettings>:
  31037. */
  31038. void HTTP_SaveSettings(void)
  31039. {
  31040. // taskENTER_CRITICAL();
  31041. SETTINGS_Save();
  31042. 802bc6a: f7fc bcd5 b.w 8028618 <SETTINGS_Save>
  31043. 0802bc6e <HTTP_Reboot>:
  31044. /**
  31045. * @brief Перезагрузка контроллера
  31046. */
  31047. void HTTP_Reboot(void)
  31048. {
  31049. 802bc6e: b508 push {r3, lr}
  31050. vTaskDelay(1010);
  31051. 802bc70: f240 30f2 movw r0, #1010 ; 0x3f2
  31052. 802bc74: f7fd fe1e bl 80298b4 <vTaskDelay>
  31053. NVIC_SystemReset();
  31054. 802bc78: f7ff fbc2 bl 802b400 <NVIC_SystemReset>
  31055. 0802bc7c <HTTP_StartResetTask>:
  31056. * bootloader и перезаписаны настройки
  31057. *
  31058. * false - обычная перезагрузка
  31059. */
  31060. void HTTP_StartResetTask(bool fBootMode)
  31061. {
  31062. 802bc7c: b51f push {r0, r1, r2, r3, r4, lr}
  31063. static bool temp;
  31064. temp = fBootMode;
  31065. 802bc7e: 4b07 ldr r3, [pc, #28] ; (802bc9c <HTTP_StartResetTask+0x20>)
  31066. xTaskCreate(vTaskReboot, "RebootTask", configMINIMAL_STACK_SIZE,
  31067. 802bc80: 4907 ldr r1, [pc, #28] ; (802bca0 <HTTP_StartResetTask+0x24>)
  31068. */
  31069. void HTTP_StartResetTask(bool fBootMode)
  31070. {
  31071. static bool temp;
  31072. temp = fBootMode;
  31073. 802bc82: 7018 strb r0, [r3, #0]
  31074. xTaskCreate(vTaskReboot, "RebootTask", configMINIMAL_STACK_SIZE,
  31075. 802bc84: 2200 movs r2, #0
  31076. 802bc86: 9200 str r2, [sp, #0]
  31077. 802bc88: 9201 str r2, [sp, #4]
  31078. 802bc8a: 9202 str r2, [sp, #8]
  31079. 802bc8c: 9203 str r2, [sp, #12]
  31080. 802bc8e: 4805 ldr r0, [pc, #20] ; (802bca4 <HTTP_StartResetTask+0x28>)
  31081. 802bc90: 2280 movs r2, #128 ; 0x80
  31082. 802bc92: f7fd fb75 bl 8029380 <xTaskGenericCreate>
  31083. (void*)&temp, tskIDLE_PRIORITY, NULL);
  31084. }
  31085. 802bc96: b005 add sp, #20
  31086. 802bc98: bd00 pop {pc}
  31087. 802bc9a: bf00 nop
  31088. 802bc9c: 20002a44 .word 0x20002a44
  31089. 802bca0: 0803fe06 .word 0x0803fe06
  31090. 802bca4: 0802b421 .word 0x0802b421
  31091. 0802bca8 <tcpip_thread>:
  31092. tcpip_thread(void *arg)
  31093. {
  31094. struct tcpip_msg *msg;
  31095. LWIP_UNUSED_ARG(arg);
  31096. if (tcpip_init_done != NULL) {
  31097. 802bca8: 4b1e ldr r3, [pc, #120] ; (802bd24 <tcpip_thread+0x7c>)
  31098. 802bcaa: 681b ldr r3, [r3, #0]
  31099. *
  31100. * @param arg unused argument
  31101. */
  31102. static void
  31103. tcpip_thread(void *arg)
  31104. {
  31105. 802bcac: b507 push {r0, r1, r2, lr}
  31106. struct tcpip_msg *msg;
  31107. LWIP_UNUSED_ARG(arg);
  31108. if (tcpip_init_done != NULL) {
  31109. 802bcae: b113 cbz r3, 802bcb6 <tcpip_thread+0xe>
  31110. tcpip_init_done(tcpip_init_done_arg);
  31111. 802bcb0: 4a1d ldr r2, [pc, #116] ; (802bd28 <tcpip_thread+0x80>)
  31112. 802bcb2: 6810 ldr r0, [r2, #0]
  31113. 802bcb4: 4798 blx r3
  31114. LOCK_TCPIP_CORE();
  31115. while (1) { /* MAIN Loop */
  31116. UNLOCK_TCPIP_CORE();
  31117. LWIP_TCPIP_THREAD_ALIVE();
  31118. /* wait for a message, timeouts are processed while waiting */
  31119. sys_timeouts_mbox_fetch(&mbox, (void **)&msg);
  31120. 802bcb6: 481d ldr r0, [pc, #116] ; (802bd2c <tcpip_thread+0x84>)
  31121. 802bcb8: a901 add r1, sp, #4
  31122. 802bcba: f003 fd0d bl 802f6d8 <sys_timeouts_mbox_fetch>
  31123. LOCK_TCPIP_CORE();
  31124. switch (msg->type) {
  31125. 802bcbe: 9b01 ldr r3, [sp, #4]
  31126. 802bcc0: 781a ldrb r2, [r3, #0]
  31127. 802bcc2: 2a05 cmp r2, #5
  31128. 802bcc4: d8f7 bhi.n 802bcb6 <tcpip_thread+0xe>
  31129. 802bcc6: e8df f002 tbb [pc, r2]
  31130. 802bcca: 0703 .short 0x0703
  31131. 802bccc: 28201b15 .word 0x28201b15
  31132. #if LWIP_NETCONN
  31133. case TCPIP_MSG_API:
  31134. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
  31135. msg->msg.apimsg->function(&(msg->msg.apimsg->msg));
  31136. 802bcd0: 6898 ldr r0, [r3, #8]
  31137. 802bcd2: 6803 ldr r3, [r0, #0]
  31138. 802bcd4: 3004 adds r0, #4
  31139. 802bcd6: e7ed b.n 802bcb4 <tcpip_thread+0xc>
  31140. #if !LWIP_TCPIP_CORE_LOCKING_INPUT
  31141. case TCPIP_MSG_INPKT:
  31142. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
  31143. #if LWIP_ETHERNET
  31144. if (msg->msg.inp.netif->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
  31145. 802bcd8: 68d9 ldr r1, [r3, #12]
  31146. ethernet_input(msg->msg.inp.p, msg->msg.inp.netif);
  31147. 802bcda: 6898 ldr r0, [r3, #8]
  31148. #if !LWIP_TCPIP_CORE_LOCKING_INPUT
  31149. case TCPIP_MSG_INPKT:
  31150. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
  31151. #if LWIP_ETHERNET
  31152. if (msg->msg.inp.netif->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
  31153. 802bcdc: f891 202d ldrb.w r2, [r1, #45] ; 0x2d
  31154. 802bce0: f012 0f60 tst.w r2, #96 ; 0x60
  31155. 802bce4: d002 beq.n 802bcec <tcpip_thread+0x44>
  31156. ethernet_input(msg->msg.inp.p, msg->msg.inp.netif);
  31157. 802bce6: f008 fb51 bl 803438c <ethernet_input>
  31158. 802bcea: e001 b.n 802bcf0 <tcpip_thread+0x48>
  31159. } else
  31160. #endif /* LWIP_ETHERNET */
  31161. {
  31162. ip_input(msg->msg.inp.p, msg->msg.inp.netif);
  31163. 802bcec: f004 f94e bl 802ff8c <ip_input>
  31164. }
  31165. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  31166. 802bcf0: 2008 movs r0, #8
  31167. 802bcf2: e00e b.n 802bd12 <tcpip_thread+0x6a>
  31168. #endif /* LWIP_NETIF_API */
  31169. #if LWIP_TCPIP_TIMEOUT
  31170. case TCPIP_MSG_TIMEOUT:
  31171. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: TIMEOUT %p\n", (void *)msg));
  31172. sys_timeout(msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);
  31173. 802bcf4: f103 0008 add.w r0, r3, #8
  31174. 802bcf8: c807 ldmia r0, {r0, r1, r2}
  31175. 802bcfa: f003 fc1f bl 802f53c <sys_timeout>
  31176. 802bcfe: e007 b.n 802bd10 <tcpip_thread+0x68>
  31177. memp_free(MEMP_TCPIP_MSG_API, msg);
  31178. break;
  31179. case TCPIP_MSG_UNTIMEOUT:
  31180. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: UNTIMEOUT %p\n", (void *)msg));
  31181. sys_untimeout(msg->msg.tmo.h, msg->msg.tmo.arg);
  31182. 802bd00: 68d8 ldr r0, [r3, #12]
  31183. 802bd02: 6919 ldr r1, [r3, #16]
  31184. 802bd04: f003 fcc4 bl 802f690 <sys_untimeout>
  31185. 802bd08: e002 b.n 802bd10 <tcpip_thread+0x68>
  31186. break;
  31187. #endif /* LWIP_TCPIP_TIMEOUT */
  31188. case TCPIP_MSG_CALLBACK:
  31189. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
  31190. msg->msg.cb.function(msg->msg.cb.ctx);
  31191. 802bd0a: 689a ldr r2, [r3, #8]
  31192. 802bd0c: 68d8 ldr r0, [r3, #12]
  31193. 802bd0e: 4790 blx r2
  31194. memp_free(MEMP_TCPIP_MSG_API, msg);
  31195. 802bd10: 2007 movs r0, #7
  31196. 802bd12: 9901 ldr r1, [sp, #4]
  31197. 802bd14: f001 f882 bl 802ce1c <memp_free>
  31198. break;
  31199. 802bd18: e7cd b.n 802bcb6 <tcpip_thread+0xe>
  31200. case TCPIP_MSG_CALLBACK_STATIC:
  31201. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK_STATIC %p\n", (void *)msg));
  31202. msg->msg.cb.function(msg->msg.cb.ctx);
  31203. 802bd1a: 689a ldr r2, [r3, #8]
  31204. 802bd1c: 68d8 ldr r0, [r3, #12]
  31205. 802bd1e: 4790 blx r2
  31206. break;
  31207. 802bd20: e7c9 b.n 802bcb6 <tcpip_thread+0xe>
  31208. 802bd22: bf00 nop
  31209. 802bd24: 20002a50 .word 0x20002a50
  31210. 802bd28: 20002a4c .word 0x20002a4c
  31211. 802bd2c: 20002a48 .word 0x20002a48
  31212. 0802bd30 <tcpip_input>:
  31213. * NETIF_FLAG_ETHERNET flags)
  31214. * @param inp the network interface on which the packet was received
  31215. */
  31216. err_t
  31217. tcpip_input(struct pbuf *p, struct netif *inp)
  31218. {
  31219. 802bd30: b5f8 push {r3, r4, r5, r6, r7, lr}
  31220. UNLOCK_TCPIP_CORE();
  31221. return ret;
  31222. #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  31223. struct tcpip_msg *msg;
  31224. if (!sys_mbox_valid(&mbox)) {
  31225. 802bd32: 4d0e ldr r5, [pc, #56] ; (802bd6c <tcpip_input+0x3c>)
  31226. 802bd34: 682b ldr r3, [r5, #0]
  31227. * NETIF_FLAG_ETHERNET flags)
  31228. * @param inp the network interface on which the packet was received
  31229. */
  31230. err_t
  31231. tcpip_input(struct pbuf *p, struct netif *inp)
  31232. {
  31233. 802bd36: 4606 mov r6, r0
  31234. 802bd38: 460f mov r7, r1
  31235. UNLOCK_TCPIP_CORE();
  31236. return ret;
  31237. #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  31238. struct tcpip_msg *msg;
  31239. if (!sys_mbox_valid(&mbox)) {
  31240. 802bd3a: b193 cbz r3, 802bd62 <tcpip_input+0x32>
  31241. return ERR_VAL;
  31242. }
  31243. msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
  31244. 802bd3c: 2008 movs r0, #8
  31245. 802bd3e: f001 f857 bl 802cdf0 <memp_malloc>
  31246. if (msg == NULL) {
  31247. 802bd42: 4604 mov r4, r0
  31248. 802bd44: b178 cbz r0, 802bd66 <tcpip_input+0x36>
  31249. return ERR_MEM;
  31250. }
  31251. msg->type = TCPIP_MSG_INPKT;
  31252. 802bd46: 2301 movs r3, #1
  31253. 802bd48: 7003 strb r3, [r0, #0]
  31254. msg->msg.inp.p = p;
  31255. 802bd4a: 6086 str r6, [r0, #8]
  31256. msg->msg.inp.netif = inp;
  31257. 802bd4c: 60c7 str r7, [r0, #12]
  31258. if (sys_mbox_trypost(&mbox, msg) != ERR_OK) {
  31259. 802bd4e: 4621 mov r1, r4
  31260. 802bd50: 4628 mov r0, r5
  31261. 802bd52: f008 fd69 bl 8034828 <sys_mbox_trypost>
  31262. 802bd56: b138 cbz r0, 802bd68 <tcpip_input+0x38>
  31263. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  31264. 802bd58: 2008 movs r0, #8
  31265. 802bd5a: 4621 mov r1, r4
  31266. 802bd5c: f001 f85e bl 802ce1c <memp_free>
  31267. 802bd60: e001 b.n 802bd66 <tcpip_input+0x36>
  31268. return ret;
  31269. #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  31270. struct tcpip_msg *msg;
  31271. if (!sys_mbox_valid(&mbox)) {
  31272. return ERR_VAL;
  31273. 802bd62: 20fa movs r0, #250 ; 0xfa
  31274. 802bd64: e000 b.n 802bd68 <tcpip_input+0x38>
  31275. }
  31276. msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
  31277. if (msg == NULL) {
  31278. return ERR_MEM;
  31279. 802bd66: 20ff movs r0, #255 ; 0xff
  31280. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  31281. return ERR_MEM;
  31282. }
  31283. return ERR_OK;
  31284. #endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  31285. }
  31286. 802bd68: b240 sxtb r0, r0
  31287. 802bd6a: bdf8 pop {r3, r4, r5, r6, r7, pc}
  31288. 802bd6c: 20002a48 .word 0x20002a48
  31289. 0802bd70 <tcpip_init>:
  31290. * @param initfunc a function to call when tcpip_thread is running and finished initializing
  31291. * @param arg argument to pass to initfunc
  31292. */
  31293. void
  31294. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  31295. {
  31296. 802bd70: b537 push {r0, r1, r2, r4, r5, lr}
  31297. 802bd72: 4604 mov r4, r0
  31298. 802bd74: 460d mov r5, r1
  31299. lwip_init();
  31300. 802bd76: f000 feb3 bl 802cae0 <lwip_init>
  31301. tcpip_init_done = initfunc;
  31302. 802bd7a: 4b09 ldr r3, [pc, #36] ; (802bda0 <tcpip_init+0x30>)
  31303. tcpip_init_done_arg = arg;
  31304. if(sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  31305. 802bd7c: 4809 ldr r0, [pc, #36] ; (802bda4 <tcpip_init+0x34>)
  31306. void
  31307. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  31308. {
  31309. lwip_init();
  31310. tcpip_init_done = initfunc;
  31311. 802bd7e: 601c str r4, [r3, #0]
  31312. tcpip_init_done_arg = arg;
  31313. 802bd80: 4b09 ldr r3, [pc, #36] ; (802bda8 <tcpip_init+0x38>)
  31314. if(sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  31315. 802bd82: 2132 movs r1, #50 ; 0x32
  31316. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  31317. {
  31318. lwip_init();
  31319. tcpip_init_done = initfunc;
  31320. tcpip_init_done_arg = arg;
  31321. 802bd84: 601d str r5, [r3, #0]
  31322. if(sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  31323. 802bd86: f008 fd41 bl 803480c <sys_mbox_new>
  31324. if(sys_mutex_new(&lock_tcpip_core) != ERR_OK) {
  31325. LWIP_ASSERT("failed to create lock_tcpip_core", 0);
  31326. }
  31327. #endif /* LWIP_TCPIP_CORE_LOCKING */
  31328. sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);
  31329. 802bd8a: 2303 movs r3, #3
  31330. 802bd8c: 9300 str r3, [sp, #0]
  31331. 802bd8e: 4907 ldr r1, [pc, #28] ; (802bdac <tcpip_init+0x3c>)
  31332. 802bd90: 4807 ldr r0, [pc, #28] ; (802bdb0 <tcpip_init+0x40>)
  31333. 802bd92: 2200 movs r2, #0
  31334. 802bd94: f44f 73c8 mov.w r3, #400 ; 0x190
  31335. 802bd98: f008 fdb7 bl 803490a <sys_thread_new>
  31336. }
  31337. 802bd9c: bd3e pop {r1, r2, r3, r4, r5, pc}
  31338. 802bd9e: bf00 nop
  31339. 802bda0: 20002a50 .word 0x20002a50
  31340. 802bda4: 20002a48 .word 0x20002a48
  31341. 802bda8: 20002a4c .word 0x20002a4c
  31342. 802bdac: 0802bca9 .word 0x0802bca9
  31343. 802bdb0: 0803fe11 .word 0x0803fe11
  31344. 0802bdb4 <lwip_htons>:
  31345. * @return n in network byte order
  31346. */
  31347. u16_t
  31348. lwip_htons(u16_t n)
  31349. {
  31350. return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);
  31351. 802bdb4: 0a03 lsrs r3, r0, #8
  31352. 802bdb6: ea43 2000 orr.w r0, r3, r0, lsl #8
  31353. }
  31354. 802bdba: b280 uxth r0, r0
  31355. 802bdbc: 4770 bx lr
  31356. 0802bdbe <lwip_ntohs>:
  31357. * @return n in network byte order
  31358. */
  31359. u16_t
  31360. lwip_htons(u16_t n)
  31361. {
  31362. return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);
  31363. 802bdbe: 0a03 lsrs r3, r0, #8
  31364. 802bdc0: ea43 2000 orr.w r0, r3, r0, lsl #8
  31365. */
  31366. u16_t
  31367. lwip_ntohs(u16_t n)
  31368. {
  31369. return lwip_htons(n);
  31370. }
  31371. 802bdc4: b280 uxth r0, r0
  31372. 802bdc6: 4770 bx lr
  31373. 0802bdc8 <lwip_htonl>:
  31374. {
  31375. return ((n & 0xff) << 24) |
  31376. ((n & 0xff00) << 8) |
  31377. ((n & 0xff0000UL) >> 8) |
  31378. ((n & 0xff000000UL) >> 24);
  31379. }
  31380. 802bdc8: ba00 rev r0, r0
  31381. 802bdca: 4770 bx lr
  31382. 0802bdcc <lwip_ntohl>:
  31383. * @return n in host byte order
  31384. */
  31385. u32_t
  31386. lwip_ntohl(u32_t n)
  31387. {
  31388. return lwip_htonl(n);
  31389. 802bdcc: f7ff bffc b.w 802bdc8 <lwip_htonl>
  31390. 0802bdd0 <dhcp_set_state>:
  31391. * If the state changed, reset the number of tries.
  31392. */
  31393. static void
  31394. dhcp_set_state(struct dhcp *dhcp, u8_t new_state)
  31395. {
  31396. if (new_state != dhcp->state) {
  31397. 802bdd0: 7b03 ldrb r3, [r0, #12]
  31398. 802bdd2: 428b cmp r3, r1
  31399. 802bdd4: d003 beq.n 802bdde <dhcp_set_state+0xe>
  31400. dhcp->state = new_state;
  31401. dhcp->tries = 0;
  31402. 802bdd6: 2300 movs r3, #0
  31403. */
  31404. static void
  31405. dhcp_set_state(struct dhcp *dhcp, u8_t new_state)
  31406. {
  31407. if (new_state != dhcp->state) {
  31408. dhcp->state = new_state;
  31409. 802bdd8: 7301 strb r1, [r0, #12]
  31410. dhcp->tries = 0;
  31411. 802bdda: 7343 strb r3, [r0, #13]
  31412. dhcp->request_timeout = 0;
  31413. 802bddc: 8343 strh r3, [r0, #26]
  31414. 802bdde: 4770 bx lr
  31415. 0802bde0 <dhcp_option>:
  31416. */
  31417. static void
  31418. dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
  31419. {
  31420. LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
  31421. dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
  31422. 802bde0: 8b03 ldrh r3, [r0, #24]
  31423. * DHCP message.
  31424. *
  31425. */
  31426. static void
  31427. dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
  31428. {
  31429. 802bde2: b510 push {r4, lr}
  31430. LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
  31431. dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
  31432. 802bde4: 6944 ldr r4, [r0, #20]
  31433. 802bde6: 18e4 adds r4, r4, r3
  31434. 802bde8: f884 10f0 strb.w r1, [r4, #240] ; 0xf0
  31435. dhcp->msg_out->options[dhcp->options_out_len++] = option_len;
  31436. 802bdec: 6941 ldr r1, [r0, #20]
  31437. */
  31438. static void
  31439. dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
  31440. {
  31441. LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
  31442. dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
  31443. 802bdee: 1c5c adds r4, r3, #1
  31444. dhcp->msg_out->options[dhcp->options_out_len++] = option_len;
  31445. 802bdf0: fa11 f184 uxtah r1, r1, r4
  31446. 802bdf4: 3302 adds r3, #2
  31447. 802bdf6: f881 20f0 strb.w r2, [r1, #240] ; 0xf0
  31448. 802bdfa: 8303 strh r3, [r0, #24]
  31449. 802bdfc: bd10 pop {r4, pc}
  31450. 0802bdfe <dhcp_option_byte>:
  31451. */
  31452. static void
  31453. dhcp_option_byte(struct dhcp *dhcp, u8_t value)
  31454. {
  31455. LWIP_ASSERT("dhcp_option_byte: dhcp->options_out_len < DHCP_OPTIONS_LEN", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  31456. dhcp->msg_out->options[dhcp->options_out_len++] = value;
  31457. 802bdfe: 8b03 ldrh r3, [r0, #24]
  31458. 802be00: 6942 ldr r2, [r0, #20]
  31459. 802be02: 18d2 adds r2, r2, r3
  31460. 802be04: 3301 adds r3, #1
  31461. 802be06: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  31462. 802be0a: 8303 strh r3, [r0, #24]
  31463. 802be0c: 4770 bx lr
  31464. 0802be0e <dhcp_option_short>:
  31465. static void
  31466. dhcp_option_short(struct dhcp *dhcp, u16_t value)
  31467. {
  31468. LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);
  31469. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
  31470. 802be0e: 8b03 ldrh r3, [r0, #24]
  31471. 802be10: 6942 ldr r2, [r0, #20]
  31472. 802be12: 18d2 adds r2, r2, r3
  31473. dhcp->msg_out->options[dhcp->options_out_len++] = value;
  31474. }
  31475. static void
  31476. dhcp_option_short(struct dhcp *dhcp, u16_t value)
  31477. {
  31478. 802be14: b510 push {r4, lr}
  31479. LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);
  31480. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
  31481. 802be16: 0a0c lsrs r4, r1, #8
  31482. 802be18: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  31483. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);
  31484. 802be1c: 6942 ldr r2, [r0, #20]
  31485. static void
  31486. dhcp_option_short(struct dhcp *dhcp, u16_t value)
  31487. {
  31488. LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);
  31489. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
  31490. 802be1e: 1c5c adds r4, r3, #1
  31491. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);
  31492. 802be20: fa12 f284 uxtah r2, r2, r4
  31493. 802be24: 3302 adds r3, #2
  31494. 802be26: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  31495. 802be2a: 8303 strh r3, [r0, #24]
  31496. 802be2c: bd10 pop {r4, pc}
  31497. 0802be2e <dhcp_option_long>:
  31498. static void
  31499. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  31500. {
  31501. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  31502. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  31503. 802be2e: 8b03 ldrh r3, [r0, #24]
  31504. 802be30: 6942 ldr r2, [r0, #20]
  31505. 802be32: 18d2 adds r2, r2, r3
  31506. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);
  31507. }
  31508. static void
  31509. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  31510. {
  31511. 802be34: b510 push {r4, lr}
  31512. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  31513. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  31514. 802be36: 0e0c lsrs r4, r1, #24
  31515. 802be38: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  31516. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  31517. 802be3c: 6942 ldr r2, [r0, #20]
  31518. static void
  31519. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  31520. {
  31521. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  31522. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  31523. 802be3e: 1c5c adds r4, r3, #1
  31524. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  31525. 802be40: fa12 f284 uxtah r2, r2, r4
  31526. 802be44: f3c1 4407 ubfx r4, r1, #16, #8
  31527. 802be48: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  31528. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
  31529. 802be4c: 6942 ldr r2, [r0, #20]
  31530. static void
  31531. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  31532. {
  31533. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  31534. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  31535. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  31536. 802be4e: 1c9c adds r4, r3, #2
  31537. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
  31538. 802be50: fa12 f284 uxtah r2, r2, r4
  31539. 802be54: f3c1 2407 ubfx r4, r1, #8, #8
  31540. 802be58: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  31541. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL));
  31542. 802be5c: 6942 ldr r2, [r0, #20]
  31543. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  31544. {
  31545. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  31546. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  31547. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  31548. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
  31549. 802be5e: 1cdc adds r4, r3, #3
  31550. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL));
  31551. 802be60: fa12 f284 uxtah r2, r2, r4
  31552. 802be64: 3304 adds r3, #4
  31553. 802be66: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  31554. 802be6a: 8303 strh r3, [r0, #24]
  31555. 802be6c: bd10 pop {r4, pc}
  31556. 0802be6e <dhcp_option_trailer>:
  31557. * @param dhcp DHCP state structure
  31558. */
  31559. static void
  31560. dhcp_option_trailer(struct dhcp *dhcp)
  31561. {
  31562. LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;);
  31563. 802be6e: b190 cbz r0, 802be96 <dhcp_option_trailer+0x28>
  31564. LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
  31565. LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  31566. dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
  31567. 802be70: 8b03 ldrh r3, [r0, #24]
  31568. 802be72: 6942 ldr r2, [r0, #20]
  31569. 802be74: 18d2 adds r2, r2, r3
  31570. 802be76: 21ff movs r1, #255 ; 0xff
  31571. 802be78: 3301 adds r3, #1
  31572. 802be7a: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  31573. 802be7e: 8303 strh r3, [r0, #24]
  31574. /* packet is too small, or not 4 byte aligned? */
  31575. while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&
  31576. (dhcp->options_out_len < DHCP_OPTIONS_LEN)) {
  31577. /* add a fill/padding byte */
  31578. dhcp->msg_out->options[dhcp->options_out_len++] = 0;
  31579. 802be80: 2100 movs r1, #0
  31580. LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;);
  31581. LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
  31582. LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  31583. dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
  31584. /* packet is too small, or not 4 byte aligned? */
  31585. while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&
  31586. 802be82: e005 b.n 802be90 <dhcp_option_trailer+0x22>
  31587. (dhcp->options_out_len < DHCP_OPTIONS_LEN)) {
  31588. /* add a fill/padding byte */
  31589. dhcp->msg_out->options[dhcp->options_out_len++] = 0;
  31590. 802be84: 6942 ldr r2, [r0, #20]
  31591. 802be86: 18d2 adds r2, r2, r3
  31592. 802be88: 3301 adds r3, #1
  31593. 802be8a: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  31594. 802be8e: 8303 strh r3, [r0, #24]
  31595. LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;);
  31596. LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
  31597. LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  31598. dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
  31599. /* packet is too small, or not 4 byte aligned? */
  31600. while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&
  31601. 802be90: 8b03 ldrh r3, [r0, #24]
  31602. 802be92: 2b43 cmp r3, #67 ; 0x43
  31603. 802be94: d9f6 bls.n 802be84 <dhcp_option_trailer+0x16>
  31604. 802be96: 4770 bx lr
  31605. 0802be98 <dhcp_create_msg>:
  31606. * @param dhcp dhcp control struct
  31607. * @param message_type message type of the request
  31608. */
  31609. static err_t
  31610. dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type)
  31611. {
  31612. 802be98: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  31613. 802be9c: 460c mov r4, r1
  31614. 802be9e: 4617 mov r7, r2
  31615. if (!xid_initialised) {
  31616. xid = DHCP_GLOBAL_XID;
  31617. xid_initialised = !xid_initialised;
  31618. }
  31619. #endif
  31620. LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return ERR_ARG;);
  31621. 802bea0: 4606 mov r6, r0
  31622. 802bea2: 2800 cmp r0, #0
  31623. 802bea4: f000 808e beq.w 802bfc4 <dhcp_create_msg+0x12c>
  31624. LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return ERR_VAL;);
  31625. 802bea8: 2900 cmp r1, #0
  31626. 802beaa: f000 808d beq.w 802bfc8 <dhcp_create_msg+0x130>
  31627. LWIP_ASSERT("dhcp_create_msg: dhcp->p_out == NULL", dhcp->p_out == NULL);
  31628. LWIP_ASSERT("dhcp_create_msg: dhcp->msg_out == NULL", dhcp->msg_out == NULL);
  31629. dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);
  31630. 802beae: 2000 movs r0, #0
  31631. 802beb0: f44f 719a mov.w r1, #308 ; 0x134
  31632. 802beb4: 4602 mov r2, r0
  31633. 802beb6: f001 f908 bl 802d0ca <pbuf_alloc>
  31634. 802beba: 6120 str r0, [r4, #16]
  31635. if (dhcp->p_out == NULL) {
  31636. 802bebc: 2800 cmp r0, #0
  31637. 802bebe: f000 8085 beq.w 802bfcc <dhcp_create_msg+0x134>
  31638. }
  31639. LWIP_ASSERT("dhcp_create_msg: check that first pbuf can hold struct dhcp_msg",
  31640. (dhcp->p_out->len >= sizeof(struct dhcp_msg)));
  31641. /* reuse transaction identifier in retransmissions */
  31642. if (dhcp->tries == 0) {
  31643. 802bec2: 7b62 ldrb r2, [r4, #13]
  31644. 802bec4: 4b43 ldr r3, [pc, #268] ; (802bfd4 <dhcp_create_msg+0x13c>)
  31645. 802bec6: b912 cbnz r2, 802bece <dhcp_create_msg+0x36>
  31646. #if DHCP_CREATE_RAND_XID && defined(LWIP_RAND)
  31647. xid = LWIP_RAND();
  31648. #else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  31649. xid++;
  31650. 802bec8: 681a ldr r2, [r3, #0]
  31651. 802beca: 3201 adds r2, #1
  31652. 802becc: 601a str r2, [r3, #0]
  31653. #endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  31654. }
  31655. dhcp->xid = xid;
  31656. 802bece: 681b ldr r3, [r3, #0]
  31657. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
  31658. ("transaction id xid(%"X32_F")\n", xid));
  31659. dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
  31660. 802bed0: 6842 ldr r2, [r0, #4]
  31661. xid = LWIP_RAND();
  31662. #else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  31663. xid++;
  31664. #endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  31665. }
  31666. dhcp->xid = xid;
  31667. 802bed2: 6023 str r3, [r4, #0]
  31668. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
  31669. ("transaction id xid(%"X32_F")\n", xid));
  31670. dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
  31671. dhcp->msg_out->op = DHCP_BOOTREQUEST;
  31672. 802bed4: 2301 movs r3, #1
  31673. }
  31674. dhcp->xid = xid;
  31675. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
  31676. ("transaction id xid(%"X32_F")\n", xid));
  31677. dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
  31678. 802bed6: 6162 str r2, [r4, #20]
  31679. dhcp->msg_out->op = DHCP_BOOTREQUEST;
  31680. 802bed8: 7013 strb r3, [r2, #0]
  31681. /* TODO: make link layer independent */
  31682. dhcp->msg_out->htype = DHCP_HTYPE_ETH;
  31683. 802beda: 6962 ldr r2, [r4, #20]
  31684. 802bedc: 7053 strb r3, [r2, #1]
  31685. dhcp->msg_out->hlen = netif->hwaddr_len;
  31686. 802bede: 6963 ldr r3, [r4, #20]
  31687. 802bee0: f896 2026 ldrb.w r2, [r6, #38] ; 0x26
  31688. 802bee4: 709a strb r2, [r3, #2]
  31689. dhcp->msg_out->hops = 0;
  31690. 802bee6: 6963 ldr r3, [r4, #20]
  31691. 802bee8: 2500 movs r5, #0
  31692. 802beea: 70dd strb r5, [r3, #3]
  31693. dhcp->msg_out->xid = htonl(dhcp->xid);
  31694. 802beec: 6820 ldr r0, [r4, #0]
  31695. 802beee: f8d4 8014 ldr.w r8, [r4, #20]
  31696. 802bef2: f7ff ff69 bl 802bdc8 <lwip_htonl>
  31697. 802bef6: f8c8 0004 str.w r0, [r8, #4]
  31698. dhcp->msg_out->secs = 0;
  31699. 802befa: 6963 ldr r3, [r4, #20]
  31700. /* we don't need the broadcast flag since we can receive unicast traffic
  31701. before being fully configured! */
  31702. dhcp->msg_out->flags = 0;
  31703. ip_addr_set_zero(&dhcp->msg_out->ciaddr);
  31704. /* set ciaddr to netif->ip_addr based on message_type and state */
  31705. if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) ||
  31706. 802befc: 2f08 cmp r7, #8
  31707. /* TODO: make link layer independent */
  31708. dhcp->msg_out->htype = DHCP_HTYPE_ETH;
  31709. dhcp->msg_out->hlen = netif->hwaddr_len;
  31710. dhcp->msg_out->hops = 0;
  31711. dhcp->msg_out->xid = htonl(dhcp->xid);
  31712. dhcp->msg_out->secs = 0;
  31713. 802befe: 721d strb r5, [r3, #8]
  31714. 802bf00: 725d strb r5, [r3, #9]
  31715. /* we don't need the broadcast flag since we can receive unicast traffic
  31716. before being fully configured! */
  31717. dhcp->msg_out->flags = 0;
  31718. 802bf02: 729d strb r5, [r3, #10]
  31719. 802bf04: 72dd strb r5, [r3, #11]
  31720. ip_addr_set_zero(&dhcp->msg_out->ciaddr);
  31721. 802bf06: 731d strb r5, [r3, #12]
  31722. 802bf08: 735d strb r5, [r3, #13]
  31723. 802bf0a: 739d strb r5, [r3, #14]
  31724. 802bf0c: 73dd strb r5, [r3, #15]
  31725. /* set ciaddr to netif->ip_addr based on message_type and state */
  31726. if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) ||
  31727. 802bf0e: d007 beq.n 802bf20 <dhcp_create_msg+0x88>
  31728. 802bf10: 2f04 cmp r7, #4
  31729. 802bf12: d005 beq.n 802bf20 <dhcp_create_msg+0x88>
  31730. 802bf14: 2f03 cmp r7, #3
  31731. 802bf16: d105 bne.n 802bf24 <dhcp_create_msg+0x8c>
  31732. ((message_type == DHCP_REQUEST) && /* DHCP_BOUND not used for sending! */
  31733. ((dhcp->state==DHCP_RENEWING) || dhcp->state==DHCP_REBINDING))) {
  31734. 802bf18: 7b22 ldrb r2, [r4, #12]
  31735. before being fully configured! */
  31736. dhcp->msg_out->flags = 0;
  31737. ip_addr_set_zero(&dhcp->msg_out->ciaddr);
  31738. /* set ciaddr to netif->ip_addr based on message_type and state */
  31739. if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) ||
  31740. ((message_type == DHCP_REQUEST) && /* DHCP_BOUND not used for sending! */
  31741. 802bf1a: 3a04 subs r2, #4
  31742. 802bf1c: 2a01 cmp r2, #1
  31743. 802bf1e: d801 bhi.n 802bf24 <dhcp_create_msg+0x8c>
  31744. ((dhcp->state==DHCP_RENEWING) || dhcp->state==DHCP_REBINDING))) {
  31745. ip_addr_copy(dhcp->msg_out->ciaddr, netif->ip_addr);
  31746. 802bf20: 6872 ldr r2, [r6, #4]
  31747. 802bf22: 60da str r2, [r3, #12]
  31748. }
  31749. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  31750. 802bf24: 2500 movs r5, #0
  31751. 802bf26: 741d strb r5, [r3, #16]
  31752. 802bf28: 745d strb r5, [r3, #17]
  31753. 802bf2a: 749d strb r5, [r3, #18]
  31754. 802bf2c: 74dd strb r5, [r3, #19]
  31755. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  31756. 802bf2e: 751d strb r5, [r3, #20]
  31757. 802bf30: 755d strb r5, [r3, #21]
  31758. 802bf32: 759d strb r5, [r3, #22]
  31759. 802bf34: 75dd strb r5, [r3, #23]
  31760. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  31761. 802bf36: 761d strb r5, [r3, #24]
  31762. 802bf38: 765d strb r5, [r3, #25]
  31763. 802bf3a: 769d strb r5, [r3, #26]
  31764. 802bf3c: 76dd strb r5, [r3, #27]
  31765. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  31766. /* copy netif hardware address, pad with zeroes */
  31767. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  31768. 802bf3e: f896 1026 ldrb.w r1, [r6, #38] ; 0x26
  31769. 802bf42: 6962 ldr r2, [r4, #20]
  31770. 802bf44: b2ab uxth r3, r5
  31771. 802bf46: 4299 cmp r1, r3
  31772. * @param netif the netif under DHCP control
  31773. * @param dhcp dhcp control struct
  31774. * @param message_type message type of the request
  31775. */
  31776. static err_t
  31777. dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type)
  31778. 802bf48: bf88 it hi
  31779. 802bf4a: 1973 addhi r3, r6, r5
  31780. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  31781. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  31782. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  31783. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  31784. /* copy netif hardware address, pad with zeroes */
  31785. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  31786. 802bf4c: 442a add r2, r5
  31787. 802bf4e: bf8c ite hi
  31788. 802bf50: f893 3027 ldrbhi.w r3, [r3, #39] ; 0x27
  31789. 802bf54: 2300 movls r3, #0
  31790. 802bf56: 3501 adds r5, #1
  31791. ip_addr_copy(dhcp->msg_out->ciaddr, netif->ip_addr);
  31792. }
  31793. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  31794. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  31795. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  31796. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  31797. 802bf58: 2d10 cmp r5, #16
  31798. /* copy netif hardware address, pad with zeroes */
  31799. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  31800. 802bf5a: 7713 strb r3, [r2, #28]
  31801. ip_addr_copy(dhcp->msg_out->ciaddr, netif->ip_addr);
  31802. }
  31803. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  31804. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  31805. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  31806. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  31807. 802bf5c: d1ef bne.n 802bf3e <dhcp_create_msg+0xa6>
  31808. 802bf5e: 2300 movs r3, #0
  31809. /* copy netif hardware address, pad with zeroes */
  31810. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  31811. }
  31812. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  31813. dhcp->msg_out->sname[i] = 0;
  31814. 802bf60: 4619 mov r1, r3
  31815. 802bf62: 6962 ldr r2, [r4, #20]
  31816. 802bf64: 18d2 adds r2, r2, r3
  31817. 802bf66: 3301 adds r3, #1
  31818. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  31819. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  31820. /* copy netif hardware address, pad with zeroes */
  31821. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  31822. }
  31823. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  31824. 802bf68: 2b40 cmp r3, #64 ; 0x40
  31825. dhcp->msg_out->sname[i] = 0;
  31826. 802bf6a: f882 102c strb.w r1, [r2, #44] ; 0x2c
  31827. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  31828. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  31829. /* copy netif hardware address, pad with zeroes */
  31830. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  31831. }
  31832. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  31833. 802bf6e: d1f8 bne.n 802bf62 <dhcp_create_msg+0xca>
  31834. 802bf70: 2200 movs r2, #0
  31835. dhcp->msg_out->sname[i] = 0;
  31836. }
  31837. for (i = 0; i < DHCP_FILE_LEN; i++) {
  31838. dhcp->msg_out->file[i] = 0;
  31839. 802bf72: 4610 mov r0, r2
  31840. 802bf74: 6963 ldr r3, [r4, #20]
  31841. 802bf76: 1899 adds r1, r3, r2
  31842. 802bf78: 3201 adds r2, #1
  31843. 802bf7a: 2300 movs r3, #0
  31844. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  31845. }
  31846. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  31847. dhcp->msg_out->sname[i] = 0;
  31848. }
  31849. for (i = 0; i < DHCP_FILE_LEN; i++) {
  31850. 802bf7c: 2a80 cmp r2, #128 ; 0x80
  31851. dhcp->msg_out->file[i] = 0;
  31852. 802bf7e: f881 006c strb.w r0, [r1, #108] ; 0x6c
  31853. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  31854. }
  31855. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  31856. dhcp->msg_out->sname[i] = 0;
  31857. }
  31858. for (i = 0; i < DHCP_FILE_LEN; i++) {
  31859. 802bf82: d1f7 bne.n 802bf74 <dhcp_create_msg+0xdc>
  31860. dhcp->msg_out->file[i] = 0;
  31861. }
  31862. dhcp->msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);
  31863. 802bf84: 6962 ldr r2, [r4, #20]
  31864. 802bf86: f06f 007d mvn.w r0, #125 ; 0x7d
  31865. 802bf8a: 2163 movs r1, #99 ; 0x63
  31866. 802bf8c: f882 00ed strb.w r0, [r2, #237] ; 0xed
  31867. 802bf90: 2053 movs r0, #83 ; 0x53
  31868. 802bf92: f882 10ec strb.w r1, [r2, #236] ; 0xec
  31869. 802bf96: f882 00ee strb.w r0, [r2, #238] ; 0xee
  31870. 802bf9a: f882 10ef strb.w r1, [r2, #239] ; 0xef
  31871. dhcp->options_out_len = 0;
  31872. 802bf9e: 8323 strh r3, [r4, #24]
  31873. /* fill options field with an incrementing array (for debugging purposes) */
  31874. for (i = 0; i < DHCP_OPTIONS_LEN; i++) {
  31875. dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */
  31876. 802bfa0: 6962 ldr r2, [r4, #20]
  31877. 802bfa2: 18d2 adds r2, r2, r3
  31878. 802bfa4: f882 30f0 strb.w r3, [r2, #240] ; 0xf0
  31879. 802bfa8: 3301 adds r3, #1
  31880. dhcp->msg_out->file[i] = 0;
  31881. }
  31882. dhcp->msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);
  31883. dhcp->options_out_len = 0;
  31884. /* fill options field with an incrementing array (for debugging purposes) */
  31885. for (i = 0; i < DHCP_OPTIONS_LEN; i++) {
  31886. 802bfaa: 2b44 cmp r3, #68 ; 0x44
  31887. 802bfac: d1f8 bne.n 802bfa0 <dhcp_create_msg+0x108>
  31888. dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */
  31889. }
  31890. /* Add option MESSAGE_TYPE */
  31891. dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
  31892. 802bfae: 4620 mov r0, r4
  31893. 802bfb0: 2135 movs r1, #53 ; 0x35
  31894. 802bfb2: 2201 movs r2, #1
  31895. 802bfb4: f7ff ff14 bl 802bde0 <dhcp_option>
  31896. dhcp_option_byte(dhcp, message_type);
  31897. 802bfb8: 4620 mov r0, r4
  31898. 802bfba: 4639 mov r1, r7
  31899. 802bfbc: f7ff ff1f bl 802bdfe <dhcp_option_byte>
  31900. return ERR_OK;
  31901. 802bfc0: 2000 movs r0, #0
  31902. 802bfc2: e004 b.n 802bfce <dhcp_create_msg+0x136>
  31903. if (!xid_initialised) {
  31904. xid = DHCP_GLOBAL_XID;
  31905. xid_initialised = !xid_initialised;
  31906. }
  31907. #endif
  31908. LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return ERR_ARG;);
  31909. 802bfc4: 20f2 movs r0, #242 ; 0xf2
  31910. 802bfc6: e002 b.n 802bfce <dhcp_create_msg+0x136>
  31911. LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return ERR_VAL;);
  31912. 802bfc8: 20fa movs r0, #250 ; 0xfa
  31913. 802bfca: e000 b.n 802bfce <dhcp_create_msg+0x136>
  31914. LWIP_ASSERT("dhcp_create_msg: dhcp->msg_out == NULL", dhcp->msg_out == NULL);
  31915. dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);
  31916. if (dhcp->p_out == NULL) {
  31917. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  31918. ("dhcp_create_msg(): could not allocate pbuf\n"));
  31919. return ERR_MEM;
  31920. 802bfcc: 20ff movs r0, #255 ; 0xff
  31921. }
  31922. /* Add option MESSAGE_TYPE */
  31923. dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
  31924. dhcp_option_byte(dhcp, message_type);
  31925. return ERR_OK;
  31926. }
  31927. 802bfce: b240 sxtb r0, r0
  31928. 802bfd0: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  31929. 802bfd4: 200015e4 .word 0x200015e4
  31930. 0802bfd8 <dhcp_delete_msg>:
  31931. *
  31932. * @param dhcp the dhcp struct to free the request from
  31933. */
  31934. static void
  31935. dhcp_delete_msg(struct dhcp *dhcp)
  31936. {
  31937. 802bfd8: b510 push {r4, lr}
  31938. LWIP_ERROR("dhcp_delete_msg: dhcp != NULL", (dhcp != NULL), return;);
  31939. 802bfda: 4604 mov r4, r0
  31940. 802bfdc: b130 cbz r0, 802bfec <dhcp_delete_msg+0x14>
  31941. LWIP_ASSERT("dhcp_delete_msg: dhcp->p_out != NULL", dhcp->p_out != NULL);
  31942. LWIP_ASSERT("dhcp_delete_msg: dhcp->msg_out != NULL", dhcp->msg_out != NULL);
  31943. if (dhcp->p_out != NULL) {
  31944. 802bfde: 6900 ldr r0, [r0, #16]
  31945. 802bfe0: b108 cbz r0, 802bfe6 <dhcp_delete_msg+0xe>
  31946. pbuf_free(dhcp->p_out);
  31947. 802bfe2: f001 f825 bl 802d030 <pbuf_free>
  31948. }
  31949. dhcp->p_out = NULL;
  31950. 802bfe6: 2300 movs r3, #0
  31951. 802bfe8: 6123 str r3, [r4, #16]
  31952. dhcp->msg_out = NULL;
  31953. 802bfea: 6163 str r3, [r4, #20]
  31954. 802bfec: bd10 pop {r4, pc}
  31955. 802bfee: 0000 movs r0, r0
  31956. 0802bff0 <dhcp_discover>:
  31957. *
  31958. * @param netif the netif under DHCP control
  31959. */
  31960. static err_t
  31961. dhcp_discover(struct netif *netif)
  31962. {
  31963. 802bff0: b573 push {r0, r1, r4, r5, r6, lr}
  31964. struct dhcp *dhcp = netif->dhcp;
  31965. 802bff2: 6a04 ldr r4, [r0, #32]
  31966. err_t result = ERR_OK;
  31967. u16_t msecs;
  31968. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n"));
  31969. ip_addr_set_any(&dhcp->offered_ip_addr);
  31970. 802bff4: 2300 movs r3, #0
  31971. *
  31972. * @param netif the netif under DHCP control
  31973. */
  31974. static err_t
  31975. dhcp_discover(struct netif *netif)
  31976. {
  31977. 802bff6: 4605 mov r5, r0
  31978. struct dhcp *dhcp = netif->dhcp;
  31979. err_t result = ERR_OK;
  31980. u16_t msecs;
  31981. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n"));
  31982. ip_addr_set_any(&dhcp->offered_ip_addr);
  31983. 802bff8: 6263 str r3, [r4, #36] ; 0x24
  31984. dhcp_set_state(dhcp, DHCP_SELECTING);
  31985. 802bffa: 4620 mov r0, r4
  31986. 802bffc: 2106 movs r1, #6
  31987. 802bffe: f7ff fee7 bl 802bdd0 <dhcp_set_state>
  31988. /* create and initialize the DHCP message header */
  31989. result = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER);
  31990. 802c002: 4628 mov r0, r5
  31991. 802c004: 4621 mov r1, r4
  31992. 802c006: 2201 movs r2, #1
  31993. 802c008: f7ff ff46 bl 802be98 <dhcp_create_msg>
  31994. if (result == ERR_OK) {
  31995. 802c00c: 4606 mov r6, r0
  31996. 802c00e: 2800 cmp r0, #0
  31997. 802c010: d130 bne.n 802c074 <dhcp_discover+0x84>
  31998. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n"));
  31999. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  32000. 802c012: 2202 movs r2, #2
  32001. 802c014: 4620 mov r0, r4
  32002. 802c016: 2139 movs r1, #57 ; 0x39
  32003. 802c018: f7ff fee2 bl 802bde0 <dhcp_option>
  32004. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  32005. 802c01c: 4620 mov r0, r4
  32006. 802c01e: 8ca9 ldrh r1, [r5, #36] ; 0x24
  32007. 802c020: f7ff fef5 bl 802be0e <dhcp_option_short>
  32008. dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/);
  32009. 802c024: 2204 movs r2, #4
  32010. 802c026: 4620 mov r0, r4
  32011. 802c028: 2137 movs r1, #55 ; 0x37
  32012. 802c02a: f7ff fed9 bl 802bde0 <dhcp_option>
  32013. dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK);
  32014. 802c02e: 4620 mov r0, r4
  32015. 802c030: 2101 movs r1, #1
  32016. 802c032: f7ff fee4 bl 802bdfe <dhcp_option_byte>
  32017. dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER);
  32018. 802c036: 4620 mov r0, r4
  32019. 802c038: 2103 movs r1, #3
  32020. 802c03a: f7ff fee0 bl 802bdfe <dhcp_option_byte>
  32021. dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST);
  32022. 802c03e: 4620 mov r0, r4
  32023. 802c040: 211c movs r1, #28
  32024. 802c042: f7ff fedc bl 802bdfe <dhcp_option_byte>
  32025. dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER);
  32026. 802c046: 2106 movs r1, #6
  32027. 802c048: 4620 mov r0, r4
  32028. 802c04a: f7ff fed8 bl 802bdfe <dhcp_option_byte>
  32029. dhcp_option_trailer(dhcp);
  32030. 802c04e: 4620 mov r0, r4
  32031. 802c050: f7ff ff0d bl 802be6e <dhcp_option_trailer>
  32032. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: realloc()ing\n"));
  32033. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  32034. 802c054: 8b21 ldrh r1, [r4, #24]
  32035. 802c056: 6920 ldr r0, [r4, #16]
  32036. 802c058: 31f0 adds r1, #240 ; 0xf0
  32037. 802c05a: b289 uxth r1, r1
  32038. 802c05c: f001 f80f bl 802d07e <pbuf_realloc>
  32039. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n"));
  32040. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  32041. 802c060: 9500 str r5, [sp, #0]
  32042. 802c062: 6860 ldr r0, [r4, #4]
  32043. 802c064: 6921 ldr r1, [r4, #16]
  32044. 802c066: 4a0f ldr r2, [pc, #60] ; (802c0a4 <dhcp_discover+0xb4>)
  32045. 802c068: 2343 movs r3, #67 ; 0x43
  32046. 802c06a: f003 fc81 bl 802f970 <udp_sendto_if>
  32047. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n"));
  32048. dhcp_delete_msg(dhcp);
  32049. 802c06e: 4620 mov r0, r4
  32050. 802c070: f7ff ffb2 bl 802bfd8 <dhcp_delete_msg>
  32051. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n"));
  32052. } else {
  32053. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n"));
  32054. }
  32055. dhcp->tries++;
  32056. 802c074: 7b63 ldrb r3, [r4, #13]
  32057. 802c076: 3301 adds r3, #1
  32058. 802c078: b2db uxtb r3, r3
  32059. if(dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) {
  32060. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON;
  32061. autoip_start(netif);
  32062. }
  32063. #endif /* LWIP_DHCP_AUTOIP_COOP */
  32064. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  32065. 802c07a: 2b05 cmp r3, #5
  32066. 802c07c: bf98 it ls
  32067. 802c07e: f44f 727a movls.w r2, #1000 ; 0x3e8
  32068. dhcp_delete_msg(dhcp);
  32069. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n"));
  32070. } else {
  32071. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n"));
  32072. }
  32073. dhcp->tries++;
  32074. 802c082: 7363 strb r3, [r4, #13]
  32075. if(dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) {
  32076. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON;
  32077. autoip_start(netif);
  32078. }
  32079. #endif /* LWIP_DHCP_AUTOIP_COOP */
  32080. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  32081. 802c084: bf9a itte ls
  32082. 802c086: fa02 f303 lslls.w r3, r2, r3
  32083. 802c08a: b29b uxthls r3, r3
  32084. 802c08c: f64e 2360 movwhi r3, #60000 ; 0xea60
  32085. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  32086. 802c090: f44f 72fa mov.w r2, #500 ; 0x1f4
  32087. 802c094: f203 13f3 addw r3, r3, #499 ; 0x1f3
  32088. 802c098: fb93 f3f2 sdiv r3, r3, r2
  32089. 802c09c: 8363 strh r3, [r4, #26]
  32090. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs));
  32091. return result;
  32092. }
  32093. 802c09e: 4630 mov r0, r6
  32094. 802c0a0: bd7c pop {r2, r3, r4, r5, r6, pc}
  32095. 802c0a2: bf00 nop
  32096. 802c0a4: 0803fe84 .word 0x0803fe84
  32097. 0802c0a8 <dhcp_rebind>:
  32098. *
  32099. * @param netif network interface which must rebind with a DHCP server
  32100. */
  32101. static err_t
  32102. dhcp_rebind(struct netif *netif)
  32103. {
  32104. 802c0a8: b573 push {r0, r1, r4, r5, r6, lr}
  32105. struct dhcp *dhcp = netif->dhcp;
  32106. 802c0aa: 6a04 ldr r4, [r0, #32]
  32107. *
  32108. * @param netif network interface which must rebind with a DHCP server
  32109. */
  32110. static err_t
  32111. dhcp_rebind(struct netif *netif)
  32112. {
  32113. 802c0ac: 4605 mov r5, r0
  32114. struct dhcp *dhcp = netif->dhcp;
  32115. err_t result;
  32116. u16_t msecs;
  32117. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n"));
  32118. dhcp_set_state(dhcp, DHCP_REBINDING);
  32119. 802c0ae: 2104 movs r1, #4
  32120. 802c0b0: 4620 mov r0, r4
  32121. 802c0b2: f7ff fe8d bl 802bdd0 <dhcp_set_state>
  32122. /* create and initialize the DHCP message header */
  32123. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  32124. 802c0b6: 4628 mov r0, r5
  32125. 802c0b8: 4621 mov r1, r4
  32126. 802c0ba: 2203 movs r2, #3
  32127. 802c0bc: f7ff feec bl 802be98 <dhcp_create_msg>
  32128. if (result == ERR_OK) {
  32129. 802c0c0: 4606 mov r6, r0
  32130. 802c0c2: b9d8 cbnz r0, 802c0fc <dhcp_rebind+0x54>
  32131. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  32132. 802c0c4: 2202 movs r2, #2
  32133. 802c0c6: 4620 mov r0, r4
  32134. 802c0c8: 2139 movs r1, #57 ; 0x39
  32135. 802c0ca: f7ff fe89 bl 802bde0 <dhcp_option>
  32136. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  32137. 802c0ce: 8ca9 ldrh r1, [r5, #36] ; 0x24
  32138. 802c0d0: 4620 mov r0, r4
  32139. 802c0d2: f7ff fe9c bl 802be0e <dhcp_option_short>
  32140. dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
  32141. dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr));
  32142. #endif
  32143. dhcp_option_trailer(dhcp);
  32144. 802c0d6: 4620 mov r0, r4
  32145. 802c0d8: f7ff fec9 bl 802be6e <dhcp_option_trailer>
  32146. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  32147. 802c0dc: 8b21 ldrh r1, [r4, #24]
  32148. 802c0de: 6920 ldr r0, [r4, #16]
  32149. 802c0e0: 31f0 adds r1, #240 ; 0xf0
  32150. 802c0e2: b289 uxth r1, r1
  32151. 802c0e4: f000 ffcb bl 802d07e <pbuf_realloc>
  32152. /* broadcast to server */
  32153. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  32154. 802c0e8: 9500 str r5, [sp, #0]
  32155. 802c0ea: 6860 ldr r0, [r4, #4]
  32156. 802c0ec: 6921 ldr r1, [r4, #16]
  32157. 802c0ee: 4a0e ldr r2, [pc, #56] ; (802c128 <dhcp_rebind+0x80>)
  32158. 802c0f0: 2343 movs r3, #67 ; 0x43
  32159. 802c0f2: f003 fc3d bl 802f970 <udp_sendto_if>
  32160. dhcp_delete_msg(dhcp);
  32161. 802c0f6: 4620 mov r0, r4
  32162. 802c0f8: f7ff ff6e bl 802bfd8 <dhcp_delete_msg>
  32163. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n"));
  32164. } else {
  32165. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n"));
  32166. }
  32167. dhcp->tries++;
  32168. 802c0fc: 7b63 ldrb r3, [r4, #13]
  32169. 802c0fe: 3301 adds r3, #1
  32170. 802c100: b2db uxtb r3, r3
  32171. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  32172. 802c102: 2b09 cmp r3, #9
  32173. dhcp_delete_msg(dhcp);
  32174. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n"));
  32175. } else {
  32176. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n"));
  32177. }
  32178. dhcp->tries++;
  32179. 802c104: 7363 strb r3, [r4, #13]
  32180. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  32181. 802c106: d804 bhi.n 802c112 <dhcp_rebind+0x6a>
  32182. 802c108: f44f 727a mov.w r2, #1000 ; 0x3e8
  32183. 802c10c: 4353 muls r3, r2
  32184. 802c10e: b29b uxth r3, r3
  32185. 802c110: e001 b.n 802c116 <dhcp_rebind+0x6e>
  32186. 802c112: f242 7310 movw r3, #10000 ; 0x2710
  32187. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  32188. 802c116: f44f 72fa mov.w r2, #500 ; 0x1f4
  32189. 802c11a: f203 13f3 addw r3, r3, #499 ; 0x1f3
  32190. 802c11e: fb93 f3f2 sdiv r3, r3, r2
  32191. 802c122: 8363 strh r3, [r4, #26]
  32192. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs));
  32193. return result;
  32194. }
  32195. 802c124: 4630 mov r0, r6
  32196. 802c126: bd7c pop {r2, r3, r4, r5, r6, pc}
  32197. 802c128: 0803fe84 .word 0x0803fe84
  32198. 0802c12c <dhcp_reboot>:
  32199. *
  32200. * @param netif network interface which must reboot
  32201. */
  32202. static err_t
  32203. dhcp_reboot(struct netif *netif)
  32204. {
  32205. 802c12c: b573 push {r0, r1, r4, r5, r6, lr}
  32206. struct dhcp *dhcp = netif->dhcp;
  32207. 802c12e: 6a04 ldr r4, [r0, #32]
  32208. *
  32209. * @param netif network interface which must reboot
  32210. */
  32211. static err_t
  32212. dhcp_reboot(struct netif *netif)
  32213. {
  32214. 802c130: 4605 mov r5, r0
  32215. struct dhcp *dhcp = netif->dhcp;
  32216. err_t result;
  32217. u16_t msecs;
  32218. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n"));
  32219. dhcp_set_state(dhcp, DHCP_REBOOTING);
  32220. 802c132: 2103 movs r1, #3
  32221. 802c134: 4620 mov r0, r4
  32222. 802c136: f7ff fe4b bl 802bdd0 <dhcp_set_state>
  32223. /* create and initialize the DHCP message header */
  32224. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  32225. 802c13a: 4628 mov r0, r5
  32226. 802c13c: 4621 mov r1, r4
  32227. 802c13e: 2203 movs r2, #3
  32228. 802c140: f7ff feaa bl 802be98 <dhcp_create_msg>
  32229. if (result == ERR_OK) {
  32230. 802c144: 4606 mov r6, r0
  32231. 802c146: bb40 cbnz r0, 802c19a <dhcp_reboot+0x6e>
  32232. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  32233. 802c148: 2202 movs r2, #2
  32234. 802c14a: 4620 mov r0, r4
  32235. 802c14c: 2139 movs r1, #57 ; 0x39
  32236. 802c14e: f7ff fe47 bl 802bde0 <dhcp_option>
  32237. dhcp_option_short(dhcp, 576);
  32238. 802c152: 4620 mov r0, r4
  32239. 802c154: f44f 7110 mov.w r1, #576 ; 0x240
  32240. 802c158: f7ff fe59 bl 802be0e <dhcp_option_short>
  32241. dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
  32242. 802c15c: 2204 movs r2, #4
  32243. 802c15e: 2132 movs r1, #50 ; 0x32
  32244. 802c160: 4620 mov r0, r4
  32245. 802c162: f7ff fe3d bl 802bde0 <dhcp_option>
  32246. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  32247. 802c166: 6a60 ldr r0, [r4, #36] ; 0x24
  32248. 802c168: f7ff fe30 bl 802bdcc <lwip_ntohl>
  32249. 802c16c: 4601 mov r1, r0
  32250. 802c16e: 4620 mov r0, r4
  32251. 802c170: f7ff fe5d bl 802be2e <dhcp_option_long>
  32252. dhcp_option_trailer(dhcp);
  32253. 802c174: 4620 mov r0, r4
  32254. 802c176: f7ff fe7a bl 802be6e <dhcp_option_trailer>
  32255. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  32256. 802c17a: 8b21 ldrh r1, [r4, #24]
  32257. 802c17c: 6920 ldr r0, [r4, #16]
  32258. 802c17e: 31f0 adds r1, #240 ; 0xf0
  32259. 802c180: b289 uxth r1, r1
  32260. 802c182: f000 ff7c bl 802d07e <pbuf_realloc>
  32261. /* broadcast to server */
  32262. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  32263. 802c186: 9500 str r5, [sp, #0]
  32264. 802c188: 6860 ldr r0, [r4, #4]
  32265. 802c18a: 6921 ldr r1, [r4, #16]
  32266. 802c18c: 4a0e ldr r2, [pc, #56] ; (802c1c8 <dhcp_reboot+0x9c>)
  32267. 802c18e: 2343 movs r3, #67 ; 0x43
  32268. 802c190: f003 fbee bl 802f970 <udp_sendto_if>
  32269. dhcp_delete_msg(dhcp);
  32270. 802c194: 4620 mov r0, r4
  32271. 802c196: f7ff ff1f bl 802bfd8 <dhcp_delete_msg>
  32272. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n"));
  32273. } else {
  32274. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n"));
  32275. }
  32276. dhcp->tries++;
  32277. 802c19a: 7b63 ldrb r3, [r4, #13]
  32278. 802c19c: 3301 adds r3, #1
  32279. 802c19e: b2db uxtb r3, r3
  32280. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  32281. 802c1a0: 2b09 cmp r3, #9
  32282. dhcp_delete_msg(dhcp);
  32283. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n"));
  32284. } else {
  32285. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n"));
  32286. }
  32287. dhcp->tries++;
  32288. 802c1a2: 7363 strb r3, [r4, #13]
  32289. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  32290. 802c1a4: d804 bhi.n 802c1b0 <dhcp_reboot+0x84>
  32291. 802c1a6: f44f 727a mov.w r2, #1000 ; 0x3e8
  32292. 802c1aa: 4353 muls r3, r2
  32293. 802c1ac: b29b uxth r3, r3
  32294. 802c1ae: e001 b.n 802c1b4 <dhcp_reboot+0x88>
  32295. 802c1b0: f242 7310 movw r3, #10000 ; 0x2710
  32296. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  32297. 802c1b4: f44f 72fa mov.w r2, #500 ; 0x1f4
  32298. 802c1b8: f203 13f3 addw r3, r3, #499 ; 0x1f3
  32299. 802c1bc: fb93 f3f2 sdiv r3, r3, r2
  32300. 802c1c0: 8363 strh r3, [r4, #26]
  32301. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot(): set request timeout %"U16_F" msecs\n", msecs));
  32302. return result;
  32303. }
  32304. 802c1c2: 4630 mov r0, r6
  32305. 802c1c4: bd7c pop {r2, r3, r4, r5, r6, pc}
  32306. 802c1c6: bf00 nop
  32307. 802c1c8: 0803fe84 .word 0x0803fe84
  32308. 0802c1cc <dhcp_select>:
  32309. * @param netif the netif under DHCP control
  32310. * @return lwIP specific error (see error.h)
  32311. */
  32312. static err_t
  32313. dhcp_select(struct netif *netif)
  32314. {
  32315. 802c1cc: b573 push {r0, r1, r4, r5, r6, lr}
  32316. struct dhcp *dhcp = netif->dhcp;
  32317. 802c1ce: 6a04 ldr r4, [r0, #32]
  32318. * @param netif the netif under DHCP control
  32319. * @return lwIP specific error (see error.h)
  32320. */
  32321. static err_t
  32322. dhcp_select(struct netif *netif)
  32323. {
  32324. 802c1d0: 4605 mov r5, r0
  32325. struct dhcp *dhcp = netif->dhcp;
  32326. err_t result;
  32327. u16_t msecs;
  32328. 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));
  32329. dhcp_set_state(dhcp, DHCP_REQUESTING);
  32330. 802c1d2: 2101 movs r1, #1
  32331. 802c1d4: 4620 mov r0, r4
  32332. 802c1d6: f7ff fdfb bl 802bdd0 <dhcp_set_state>
  32333. /* create and initialize the DHCP message header */
  32334. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  32335. 802c1da: 4628 mov r0, r5
  32336. 802c1dc: 4621 mov r1, r4
  32337. 802c1de: 2203 movs r2, #3
  32338. 802c1e0: f7ff fe5a bl 802be98 <dhcp_create_msg>
  32339. if (result == ERR_OK) {
  32340. 802c1e4: 4606 mov r6, r0
  32341. 802c1e6: 2800 cmp r0, #0
  32342. 802c1e8: d148 bne.n 802c27c <dhcp_select+0xb0>
  32343. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  32344. 802c1ea: 2202 movs r2, #2
  32345. 802c1ec: 4620 mov r0, r4
  32346. 802c1ee: 2139 movs r1, #57 ; 0x39
  32347. 802c1f0: f7ff fdf6 bl 802bde0 <dhcp_option>
  32348. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  32349. 802c1f4: 4620 mov r0, r4
  32350. 802c1f6: 8ca9 ldrh r1, [r5, #36] ; 0x24
  32351. 802c1f8: f7ff fe09 bl 802be0e <dhcp_option_short>
  32352. /* MUST request the offered IP address */
  32353. dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
  32354. 802c1fc: 2204 movs r2, #4
  32355. 802c1fe: 2132 movs r1, #50 ; 0x32
  32356. 802c200: 4620 mov r0, r4
  32357. 802c202: f7ff fded bl 802bde0 <dhcp_option>
  32358. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  32359. 802c206: 6a60 ldr r0, [r4, #36] ; 0x24
  32360. 802c208: f7ff fde0 bl 802bdcc <lwip_ntohl>
  32361. 802c20c: 4601 mov r1, r0
  32362. 802c20e: 4620 mov r0, r4
  32363. 802c210: f7ff fe0d bl 802be2e <dhcp_option_long>
  32364. dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
  32365. 802c214: 2204 movs r2, #4
  32366. 802c216: 2136 movs r1, #54 ; 0x36
  32367. 802c218: 4620 mov r0, r4
  32368. 802c21a: f7ff fde1 bl 802bde0 <dhcp_option>
  32369. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->server_ip_addr)));
  32370. 802c21e: 6a20 ldr r0, [r4, #32]
  32371. 802c220: f7ff fdd4 bl 802bdcc <lwip_ntohl>
  32372. 802c224: 4601 mov r1, r0
  32373. 802c226: 4620 mov r0, r4
  32374. 802c228: f7ff fe01 bl 802be2e <dhcp_option_long>
  32375. dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/);
  32376. 802c22c: 2204 movs r2, #4
  32377. 802c22e: 4620 mov r0, r4
  32378. 802c230: 2137 movs r1, #55 ; 0x37
  32379. 802c232: f7ff fdd5 bl 802bde0 <dhcp_option>
  32380. dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK);
  32381. 802c236: 4620 mov r0, r4
  32382. 802c238: 2101 movs r1, #1
  32383. 802c23a: f7ff fde0 bl 802bdfe <dhcp_option_byte>
  32384. dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER);
  32385. 802c23e: 4620 mov r0, r4
  32386. 802c240: 2103 movs r1, #3
  32387. 802c242: f7ff fddc bl 802bdfe <dhcp_option_byte>
  32388. dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST);
  32389. 802c246: 4620 mov r0, r4
  32390. 802c248: 211c movs r1, #28
  32391. 802c24a: f7ff fdd8 bl 802bdfe <dhcp_option_byte>
  32392. dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER);
  32393. 802c24e: 2106 movs r1, #6
  32394. 802c250: 4620 mov r0, r4
  32395. 802c252: f7ff fdd4 bl 802bdfe <dhcp_option_byte>
  32396. #if LWIP_NETIF_HOSTNAME
  32397. dhcp_option_hostname(dhcp, netif);
  32398. #endif /* LWIP_NETIF_HOSTNAME */
  32399. dhcp_option_trailer(dhcp);
  32400. 802c256: 4620 mov r0, r4
  32401. 802c258: f7ff fe09 bl 802be6e <dhcp_option_trailer>
  32402. /* shrink the pbuf to the actual content length */
  32403. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  32404. 802c25c: 8b21 ldrh r1, [r4, #24]
  32405. 802c25e: 6920 ldr r0, [r4, #16]
  32406. 802c260: 31f0 adds r1, #240 ; 0xf0
  32407. 802c262: b289 uxth r1, r1
  32408. 802c264: f000 ff0b bl 802d07e <pbuf_realloc>
  32409. /* send broadcast to any DHCP server */
  32410. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  32411. 802c268: 9500 str r5, [sp, #0]
  32412. 802c26a: 6860 ldr r0, [r4, #4]
  32413. 802c26c: 6921 ldr r1, [r4, #16]
  32414. 802c26e: 4a0f ldr r2, [pc, #60] ; (802c2ac <dhcp_select+0xe0>)
  32415. 802c270: 2343 movs r3, #67 ; 0x43
  32416. 802c272: f003 fb7d bl 802f970 <udp_sendto_if>
  32417. dhcp_delete_msg(dhcp);
  32418. 802c276: 4620 mov r0, r4
  32419. 802c278: f7ff feae bl 802bfd8 <dhcp_delete_msg>
  32420. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n"));
  32421. } else {
  32422. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n"));
  32423. }
  32424. dhcp->tries++;
  32425. 802c27c: 7b63 ldrb r3, [r4, #13]
  32426. 802c27e: 3301 adds r3, #1
  32427. 802c280: b2db uxtb r3, r3
  32428. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  32429. 802c282: 2b05 cmp r3, #5
  32430. 802c284: bf98 it ls
  32431. 802c286: f44f 727a movls.w r2, #1000 ; 0x3e8
  32432. dhcp_delete_msg(dhcp);
  32433. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n"));
  32434. } else {
  32435. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n"));
  32436. }
  32437. dhcp->tries++;
  32438. 802c28a: 7363 strb r3, [r4, #13]
  32439. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  32440. 802c28c: bf9a itte ls
  32441. 802c28e: fa02 f303 lslls.w r3, r2, r3
  32442. 802c292: b29b uxthls r3, r3
  32443. 802c294: f64e 2360 movwhi r3, #60000 ; 0xea60
  32444. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  32445. 802c298: f44f 72fa mov.w r2, #500 ; 0x1f4
  32446. 802c29c: f203 13f3 addw r3, r3, #499 ; 0x1f3
  32447. 802c2a0: fb93 f3f2 sdiv r3, r3, r2
  32448. 802c2a4: 8363 strh r3, [r4, #26]
  32449. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs));
  32450. return result;
  32451. }
  32452. 802c2a6: 4630 mov r0, r6
  32453. 802c2a8: bd7c pop {r2, r3, r4, r5, r6, pc}
  32454. 802c2aa: bf00 nop
  32455. 802c2ac: 0803fe84 .word 0x0803fe84
  32456. 0802c2b0 <dhcp_check>:
  32457. *
  32458. * @param netif the netif under DHCP control
  32459. */
  32460. static void
  32461. dhcp_check(struct netif *netif)
  32462. {
  32463. 802c2b0: b538 push {r3, r4, r5, lr}
  32464. struct dhcp *dhcp = netif->dhcp;
  32465. 802c2b2: 6a04 ldr r4, [r0, #32]
  32466. *
  32467. * @param netif the netif under DHCP control
  32468. */
  32469. static void
  32470. dhcp_check(struct netif *netif)
  32471. {
  32472. 802c2b4: 4605 mov r5, r0
  32473. struct dhcp *dhcp = netif->dhcp;
  32474. err_t result;
  32475. u16_t msecs;
  32476. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0],
  32477. (s16_t)netif->name[1]));
  32478. dhcp_set_state(dhcp, DHCP_CHECKING);
  32479. 802c2b6: 2108 movs r1, #8
  32480. 802c2b8: 4620 mov r0, r4
  32481. 802c2ba: f7ff fd89 bl 802bdd0 <dhcp_set_state>
  32482. /* create an ARP query for the offered IP address, expecting that no host
  32483. responds, as the IP address should not be in use. */
  32484. result = etharp_query(netif, &dhcp->offered_ip_addr, NULL);
  32485. 802c2be: 4628 mov r0, r5
  32486. 802c2c0: f104 0124 add.w r1, r4, #36 ; 0x24
  32487. 802c2c4: 2200 movs r2, #0
  32488. 802c2c6: f007 ff41 bl 803414c <etharp_query>
  32489. if (result != ERR_OK) {
  32490. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_check: could not perform ARP query\n"));
  32491. }
  32492. dhcp->tries++;
  32493. 802c2ca: 7b63 ldrb r3, [r4, #13]
  32494. 802c2cc: 3301 adds r3, #1
  32495. 802c2ce: 7363 strb r3, [r4, #13]
  32496. msecs = 500;
  32497. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  32498. 802c2d0: 2301 movs r3, #1
  32499. 802c2d2: 8363 strh r3, [r4, #26]
  32500. 802c2d4: bd38 pop {r3, r4, r5, pc}
  32501. 0802c2d6 <dhcp_bind>:
  32502. *
  32503. * @param netif network interface to bind to the offered address
  32504. */
  32505. static void
  32506. dhcp_bind(struct netif *netif)
  32507. {
  32508. 802c2d6: b537 push {r0, r1, r2, r4, r5, lr}
  32509. u32_t timeout;
  32510. struct dhcp *dhcp;
  32511. ip_addr_t sn_mask, gw_addr;
  32512. LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;);
  32513. 802c2d8: 4605 mov r5, r0
  32514. 802c2da: 2800 cmp r0, #0
  32515. 802c2dc: d059 beq.n 802c392 <dhcp_bind+0xbc>
  32516. dhcp = netif->dhcp;
  32517. 802c2de: 6a04 ldr r4, [r0, #32]
  32518. LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;);
  32519. 802c2e0: 2c00 cmp r4, #0
  32520. 802c2e2: d056 beq.n 802c392 <dhcp_bind+0xbc>
  32521. 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));
  32522. /* temporary DHCP lease? */
  32523. if (dhcp->offered_t1_renew != 0xffffffffUL) {
  32524. 802c2e4: 6b63 ldr r3, [r4, #52] ; 0x34
  32525. 802c2e6: 1c58 adds r0, r3, #1
  32526. 802c2e8: d00d beq.n 802c306 <dhcp_bind+0x30>
  32527. /* set renewal period timer */
  32528. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew));
  32529. timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
  32530. 802c2ea: 223c movs r2, #60 ; 0x3c
  32531. 802c2ec: 331e adds r3, #30
  32532. 802c2ee: fbb3 f3f2 udiv r3, r3, r2
  32533. if(timeout > 0xffff) {
  32534. timeout = 0xffff;
  32535. }
  32536. dhcp->t1_timeout = (u16_t)timeout;
  32537. 802c2f2: f64f 72ff movw r2, #65535 ; 0xffff
  32538. 802c2f6: 4293 cmp r3, r2
  32539. 802c2f8: bf28 it cs
  32540. 802c2fa: 4613 movcs r3, r2
  32541. 802c2fc: b29b uxth r3, r3
  32542. 802c2fe: 83a3 strh r3, [r4, #28]
  32543. if (dhcp->t1_timeout == 0) {
  32544. 802c300: b90b cbnz r3, 802c306 <dhcp_bind+0x30>
  32545. dhcp->t1_timeout = 1;
  32546. 802c302: 2301 movs r3, #1
  32547. 802c304: 83a3 strh r3, [r4, #28]
  32548. }
  32549. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew*1000));
  32550. }
  32551. /* set renewal period timer */
  32552. if (dhcp->offered_t2_rebind != 0xffffffffUL) {
  32553. 802c306: 6ba3 ldr r3, [r4, #56] ; 0x38
  32554. 802c308: 1c59 adds r1, r3, #1
  32555. 802c30a: d00d beq.n 802c328 <dhcp_bind+0x52>
  32556. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind));
  32557. timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
  32558. 802c30c: 223c movs r2, #60 ; 0x3c
  32559. 802c30e: 331e adds r3, #30
  32560. 802c310: fbb3 f3f2 udiv r3, r3, r2
  32561. if(timeout > 0xffff) {
  32562. timeout = 0xffff;
  32563. }
  32564. dhcp->t2_timeout = (u16_t)timeout;
  32565. 802c314: f64f 72ff movw r2, #65535 ; 0xffff
  32566. 802c318: 4293 cmp r3, r2
  32567. 802c31a: bf28 it cs
  32568. 802c31c: 4613 movcs r3, r2
  32569. 802c31e: b29b uxth r3, r3
  32570. 802c320: 83e3 strh r3, [r4, #30]
  32571. if (dhcp->t2_timeout == 0) {
  32572. 802c322: b90b cbnz r3, 802c328 <dhcp_bind+0x52>
  32573. dhcp->t2_timeout = 1;
  32574. 802c324: 2301 movs r3, #1
  32575. 802c326: 83e3 strh r3, [r4, #30]
  32576. }
  32577. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind*1000));
  32578. }
  32579. /* If we have sub 1 minute lease, t2 and t1 will kick in at the same time. */
  32580. if ((dhcp->t1_timeout >= dhcp->t2_timeout) && (dhcp->t2_timeout > 0)) {
  32581. 802c328: 8be3 ldrh r3, [r4, #30]
  32582. 802c32a: 8ba2 ldrh r2, [r4, #28]
  32583. 802c32c: 429a cmp r2, r3
  32584. 802c32e: d302 bcc.n 802c336 <dhcp_bind+0x60>
  32585. 802c330: b10b cbz r3, 802c336 <dhcp_bind+0x60>
  32586. dhcp->t1_timeout = 0;
  32587. 802c332: 2300 movs r3, #0
  32588. 802c334: 83a3 strh r3, [r4, #28]
  32589. }
  32590. if (dhcp->subnet_mask_given) {
  32591. 802c336: 7ba3 ldrb r3, [r4, #14]
  32592. 802c338: b10b cbz r3, 802c33e <dhcp_bind+0x68>
  32593. /* copy offered network mask */
  32594. ip_addr_copy(sn_mask, dhcp->offered_sn_mask);
  32595. 802c33a: 6aa3 ldr r3, [r4, #40] ; 0x28
  32596. 802c33c: e00b b.n 802c356 <dhcp_bind+0x80>
  32597. } else {
  32598. /* subnet mask not given, choose a safe subnet mask given the network class */
  32599. u8_t first_octet = ip4_addr1(&dhcp->offered_ip_addr);
  32600. 802c33e: f894 3024 ldrb.w r3, [r4, #36] ; 0x24
  32601. if (first_octet <= 127) {
  32602. 802c342: 061a lsls r2, r3, #24
  32603. 802c344: d401 bmi.n 802c34a <dhcp_bind+0x74>
  32604. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xff000000UL));
  32605. 802c346: 23ff movs r3, #255 ; 0xff
  32606. 802c348: e005 b.n 802c356 <dhcp_bind+0x80>
  32607. } else if (first_octet >= 192) {
  32608. 802c34a: 2bbf cmp r3, #191 ; 0xbf
  32609. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffffff00UL));
  32610. 802c34c: bf8c ite hi
  32611. 802c34e: f06f 437f mvnhi.w r3, #4278190080 ; 0xff000000
  32612. } else {
  32613. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffff0000UL));
  32614. 802c352: f64f 73ff movwls r3, #65535 ; 0xffff
  32615. 802c356: 9300 str r3, [sp, #0]
  32616. }
  32617. }
  32618. ip_addr_copy(gw_addr, dhcp->offered_gw_addr);
  32619. 802c358: 6ae3 ldr r3, [r4, #44] ; 0x2c
  32620. 802c35a: 9301 str r3, [sp, #4]
  32621. /* gateway address not given? */
  32622. if (ip_addr_isany(&gw_addr)) {
  32623. 802c35c: b92b cbnz r3, 802c36a <dhcp_bind+0x94>
  32624. /* copy network address */
  32625. ip_addr_get_network(&gw_addr, &dhcp->offered_ip_addr, &sn_mask);
  32626. 802c35e: 6a63 ldr r3, [r4, #36] ; 0x24
  32627. 802c360: 9a00 ldr r2, [sp, #0]
  32628. 802c362: 4013 ands r3, r2
  32629. /* use first host address on network as gateway */
  32630. ip4_addr_set_u32(&gw_addr, ip4_addr_get_u32(&gw_addr) | PP_HTONL(0x00000001UL));
  32631. 802c364: f043 7380 orr.w r3, r3, #16777216 ; 0x1000000
  32632. 802c368: 9301 str r3, [sp, #4]
  32633. }
  32634. #endif /* LWIP_DHCP_AUTOIP_COOP */
  32635. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F"\n",
  32636. ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  32637. netif_set_ipaddr(netif, &dhcp->offered_ip_addr);
  32638. 802c36a: 4628 mov r0, r5
  32639. 802c36c: f104 0124 add.w r1, r4, #36 ; 0x24
  32640. 802c370: f000 fd6a bl 802ce48 <netif_set_ipaddr>
  32641. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): SN: 0x%08"X32_F"\n",
  32642. ip4_addr_get_u32(&sn_mask)));
  32643. netif_set_netmask(netif, &sn_mask);
  32644. 802c374: 4628 mov r0, r5
  32645. 802c376: 4669 mov r1, sp
  32646. 802c378: f000 fda6 bl 802cec8 <netif_set_netmask>
  32647. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): GW: 0x%08"X32_F"\n",
  32648. ip4_addr_get_u32(&gw_addr)));
  32649. netif_set_gw(netif, &gw_addr);
  32650. 802c37c: a901 add r1, sp, #4
  32651. 802c37e: 4628 mov r0, r5
  32652. 802c380: f000 fd9e bl 802cec0 <netif_set_gw>
  32653. /* bring the interface up */
  32654. netif_set_up(netif);
  32655. 802c384: 4628 mov r0, r5
  32656. 802c386: f000 fdf5 bl 802cf74 <netif_set_up>
  32657. /* netif is now bound to DHCP leased address */
  32658. dhcp_set_state(dhcp, DHCP_BOUND);
  32659. 802c38a: 4620 mov r0, r4
  32660. 802c38c: 210a movs r1, #10
  32661. 802c38e: f7ff fd1f bl 802bdd0 <dhcp_set_state>
  32662. }
  32663. 802c392: bd3e pop {r1, r2, r3, r4, r5, pc}
  32664. 0802c394 <dhcp_recv>:
  32665. /**
  32666. * If an incoming DHCP message is in response to us, then trigger the state machine
  32667. */
  32668. static void
  32669. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  32670. {
  32671. 802c394: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  32672. 802c398: 4692 mov sl, r2
  32673. 802c39a: b08b sub sp, #44 ; 0x2c
  32674. LWIP_UNUSED_ARG(addr);
  32675. LWIP_UNUSED_ARG(port);
  32676. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  32677. if (p->len < DHCP_MIN_REPLY_LEN) {
  32678. 802c39c: f8ba 300a ldrh.w r3, [sl, #10]
  32679. */
  32680. static void
  32681. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  32682. {
  32683. struct netif *netif = (struct netif *)arg;
  32684. struct dhcp *dhcp = netif->dhcp;
  32685. 802c3a0: f8d0 8020 ldr.w r8, [r0, #32]
  32686. struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload;
  32687. 802c3a4: 6852 ldr r2, [r2, #4]
  32688. LWIP_UNUSED_ARG(addr);
  32689. LWIP_UNUSED_ARG(port);
  32690. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  32691. if (p->len < DHCP_MIN_REPLY_LEN) {
  32692. 802c3a6: 2b2b cmp r3, #43 ; 0x2b
  32693. /**
  32694. * If an incoming DHCP message is in response to us, then trigger the state machine
  32695. */
  32696. static void
  32697. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  32698. {
  32699. 802c3a8: 4605 mov r5, r0
  32700. LWIP_UNUSED_ARG(addr);
  32701. LWIP_UNUSED_ARG(port);
  32702. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  32703. if (p->len < DHCP_MIN_REPLY_LEN) {
  32704. 802c3aa: f240 81b8 bls.w 802c71e <dhcp_recv+0x38a>
  32705. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP reply message or pbuf too short\n"));
  32706. goto free_pbuf_and_return;
  32707. }
  32708. if (reply_msg->op != DHCP_BOOTREPLY) {
  32709. 802c3ae: 7813 ldrb r3, [r2, #0]
  32710. 802c3b0: 2b02 cmp r3, #2
  32711. 802c3b2: f040 81b4 bne.w 802c71e <dhcp_recv+0x38a>
  32712. 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));
  32713. goto free_pbuf_and_return;
  32714. }
  32715. /* iterate through hardware address and match against DHCP message */
  32716. for (i = 0; i < netif->hwaddr_len; i++) {
  32717. 802c3b6: f890 1026 ldrb.w r1, [r0, #38] ; 0x26
  32718. 802c3ba: 2300 movs r3, #0
  32719. 802c3bc: e008 b.n 802c3d0 <dhcp_recv+0x3c>
  32720. /**
  32721. * If an incoming DHCP message is in response to us, then trigger the state machine
  32722. */
  32723. static void
  32724. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  32725. 802c3be: 18e8 adds r0, r5, r3
  32726. 802c3c0: 3301 adds r3, #1
  32727. 802c3c2: 18d4 adds r4, r2, r3
  32728. 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));
  32729. goto free_pbuf_and_return;
  32730. }
  32731. /* iterate through hardware address and match against DHCP message */
  32732. for (i = 0; i < netif->hwaddr_len; i++) {
  32733. if (netif->hwaddr[i] != reply_msg->chaddr[i]) {
  32734. 802c3c4: f890 0027 ldrb.w r0, [r0, #39] ; 0x27
  32735. 802c3c8: 7ee4 ldrb r4, [r4, #27]
  32736. 802c3ca: 4284 cmp r4, r0
  32737. 802c3cc: f040 81a7 bne.w 802c71e <dhcp_recv+0x38a>
  32738. if (reply_msg->op != DHCP_BOOTREPLY) {
  32739. 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));
  32740. goto free_pbuf_and_return;
  32741. }
  32742. /* iterate through hardware address and match against DHCP message */
  32743. for (i = 0; i < netif->hwaddr_len; i++) {
  32744. 802c3d0: b2d8 uxtb r0, r3
  32745. 802c3d2: 4288 cmp r0, r1
  32746. 802c3d4: d3f3 bcc.n 802c3be <dhcp_recv+0x2a>
  32747. (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i]));
  32748. goto free_pbuf_and_return;
  32749. }
  32750. }
  32751. /* match transaction ID against what we expected */
  32752. if (ntohl(reply_msg->xid) != dhcp->xid) {
  32753. 802c3d6: 6850 ldr r0, [r2, #4]
  32754. 802c3d8: f7ff fcf8 bl 802bdcc <lwip_ntohl>
  32755. 802c3dc: f8d8 3000 ldr.w r3, [r8]
  32756. 802c3e0: 4298 cmp r0, r3
  32757. 802c3e2: f040 819c bne.w 802c71e <dhcp_recv+0x38a>
  32758. struct pbuf *q;
  32759. int parse_file_as_options = 0;
  32760. int parse_sname_as_options = 0;
  32761. /* clear received options */
  32762. dhcp_clear_all_options(dhcp);
  32763. 802c3e6: 2100 movs r1, #0
  32764. 802c3e8: 220a movs r2, #10
  32765. 802c3ea: 489d ldr r0, [pc, #628] ; (802c660 <dhcp_recv+0x2cc>)
  32766. 802c3ec: f7f5 fb68 bl 8021ac0 <memset>
  32767. /* check that beginning of dhcp_msg (up to and including chaddr) is in first pbuf */
  32768. if (p->len < DHCP_SNAME_OFS) {
  32769. 802c3f0: f8ba 300a ldrh.w r3, [sl, #10]
  32770. 802c3f4: 2b2b cmp r3, #43 ; 0x2b
  32771. 802c3f6: f240 8192 bls.w 802c71e <dhcp_recv+0x38a>
  32772. return ERR_BUF;
  32773. }
  32774. dhcp->msg_in = (struct dhcp_msg *)p->payload;
  32775. 802c3fa: f8da 3004 ldr.w r3, [sl, #4]
  32776. /* parse options */
  32777. /* start with options field */
  32778. options_idx = DHCP_OPTIONS_OFS;
  32779. /* parse options to the end of the received packet */
  32780. options_idx_max = p->tot_len;
  32781. 802c3fe: f8ba 9008 ldrh.w r9, [sl, #8]
  32782. dhcp_clear_all_options(dhcp);
  32783. /* check that beginning of dhcp_msg (up to and including chaddr) is in first pbuf */
  32784. if (p->len < DHCP_SNAME_OFS) {
  32785. return ERR_BUF;
  32786. }
  32787. dhcp->msg_in = (struct dhcp_msg *)p->payload;
  32788. 802c402: f8c8 3008 str.w r3, [r8, #8]
  32789. u16_t offset_max;
  32790. u16_t options_idx;
  32791. u16_t options_idx_max;
  32792. struct pbuf *q;
  32793. int parse_file_as_options = 0;
  32794. int parse_sname_as_options = 0;
  32795. 802c406: f04f 0b00 mov.w fp, #0
  32796. #endif /* LWIP_DHCP_BOOTP_FILE */
  32797. /* parse options */
  32798. /* start with options field */
  32799. options_idx = DHCP_OPTIONS_OFS;
  32800. 802c40a: 22f0 movs r2, #240 ; 0xf0
  32801. 802c40c: e004 b.n 802c418 <dhcp_recv+0x84>
  32802. parse_file_as_options = 0;
  32803. options_idx = DHCP_FILE_OFS;
  32804. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  32805. goto again;
  32806. } else if (parse_sname_as_options) {
  32807. parse_sname_as_options = 0;
  32808. 802c40e: f04f 0b00 mov.w fp, #0
  32809. options_idx = DHCP_SNAME_OFS;
  32810. options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN;
  32811. 802c412: f04f 096c mov.w r9, #108 ; 0x6c
  32812. options_idx = DHCP_FILE_OFS;
  32813. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  32814. goto again;
  32815. } else if (parse_sname_as_options) {
  32816. parse_sname_as_options = 0;
  32817. options_idx = DHCP_SNAME_OFS;
  32818. 802c416: 222c movs r2, #44 ; 0x2c
  32819. #endif /* LWIP_DHCP_BOOTP_FILE */
  32820. /* parse options */
  32821. /* start with options field */
  32822. options_idx = DHCP_OPTIONS_OFS;
  32823. 802c418: 4657 mov r7, sl
  32824. 802c41a: e009 b.n 802c430 <dhcp_recv+0x9c>
  32825. again:
  32826. q = p;
  32827. while((q != NULL) && (options_idx >= q->len)) {
  32828. options_idx -= q->len;
  32829. options_idx_max -= q->len;
  32830. q = q->next;
  32831. 802c41c: 683f ldr r7, [r7, #0]
  32832. /* parse options to the end of the received packet */
  32833. options_idx_max = p->tot_len;
  32834. again:
  32835. q = p;
  32836. while((q != NULL) && (options_idx >= q->len)) {
  32837. options_idx -= q->len;
  32838. 802c41e: 1ad2 subs r2, r2, r3
  32839. options_idx_max -= q->len;
  32840. 802c420: ebc3 0909 rsb r9, r3, r9
  32841. /* parse options to the end of the received packet */
  32842. options_idx_max = p->tot_len;
  32843. again:
  32844. q = p;
  32845. while((q != NULL) && (options_idx >= q->len)) {
  32846. options_idx -= q->len;
  32847. 802c424: b292 uxth r2, r2
  32848. options_idx_max -= q->len;
  32849. 802c426: fa1f f989 uxth.w r9, r9
  32850. options_idx = DHCP_OPTIONS_OFS;
  32851. /* parse options to the end of the received packet */
  32852. options_idx_max = p->tot_len;
  32853. again:
  32854. q = p;
  32855. while((q != NULL) && (options_idx >= q->len)) {
  32856. 802c42a: 2f00 cmp r7, #0
  32857. 802c42c: f000 8177 beq.w 802c71e <dhcp_recv+0x38a>
  32858. 802c430: 897b ldrh r3, [r7, #10]
  32859. 802c432: 429a cmp r2, r3
  32860. 802c434: d2f2 bcs.n 802c41c <dhcp_recv+0x88>
  32861. if (q == NULL) {
  32862. return ERR_BUF;
  32863. }
  32864. offset = options_idx;
  32865. offset_max = options_idx_max;
  32866. options = (u8_t*)q->payload;
  32867. 802c436: 6878 ldr r0, [r7, #4]
  32868. 802c438: 9003 str r0, [sp, #12]
  32869. 802c43a: e0db b.n 802c5f4 <dhcp_recv+0x260>
  32870. u8_t len;
  32871. u8_t decode_len = 0;
  32872. int decode_idx = -1;
  32873. u16_t val_offset = offset + 2;
  32874. /* len byte might be in the next pbuf */
  32875. if (offset + 1 < q->len) {
  32876. 802c43c: 897b ldrh r3, [r7, #10]
  32877. 802c43e: 1c50 adds r0, r2, #1
  32878. 802c440: 4298 cmp r0, r3
  32879. 802c442: da03 bge.n 802c44c <dhcp_recv+0xb8>
  32880. len = options[offset + 1];
  32881. 802c444: 9803 ldr r0, [sp, #12]
  32882. 802c446: 1883 adds r3, r0, r2
  32883. 802c448: 785b ldrb r3, [r3, #1]
  32884. 802c44a: e003 b.n 802c454 <dhcp_recv+0xc0>
  32885. } else {
  32886. len = (q->next != NULL ? ((u8_t*)q->next->payload)[0] : 0);
  32887. 802c44c: 683b ldr r3, [r7, #0]
  32888. 802c44e: b10b cbz r3, 802c454 <dhcp_recv+0xc0>
  32889. 802c450: 685b ldr r3, [r3, #4]
  32890. 802c452: 781b ldrb r3, [r3, #0]
  32891. }
  32892. /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */
  32893. decode_len = len;
  32894. switch(op) {
  32895. 802c454: 2933 cmp r1, #51 ; 0x33
  32896. 802c456: d038 beq.n 802c4ca <dhcp_recv+0x136>
  32897. 802c458: d807 bhi.n 802c46a <dhcp_recv+0xd6>
  32898. 802c45a: 2901 cmp r1, #1
  32899. 802c45c: d019 beq.n 802c492 <dhcp_recv+0xfe>
  32900. 802c45e: d311 bcc.n 802c484 <dhcp_recv+0xf0>
  32901. 802c460: 2903 cmp r1, #3
  32902. 802c462: d01d beq.n 802c4a0 <dhcp_recv+0x10c>
  32903. 802c464: 2906 cmp r1, #6
  32904. 802c466: d155 bne.n 802c514 <dhcp_recv+0x180>
  32905. 802c468: e021 b.n 802c4ae <dhcp_recv+0x11a>
  32906. 802c46a: 2936 cmp r1, #54 ; 0x36
  32907. 802c46c: d03d beq.n 802c4ea <dhcp_recv+0x156>
  32908. 802c46e: d804 bhi.n 802c47a <dhcp_recv+0xe6>
  32909. 802c470: 2934 cmp r1, #52 ; 0x34
  32910. 802c472: d031 beq.n 802c4d8 <dhcp_recv+0x144>
  32911. 802c474: 2935 cmp r1, #53 ; 0x35
  32912. 802c476: d14d bne.n 802c514 <dhcp_recv+0x180>
  32913. 802c478: e035 b.n 802c4e6 <dhcp_recv+0x152>
  32914. 802c47a: 293a cmp r1, #58 ; 0x3a
  32915. 802c47c: d03c beq.n 802c4f8 <dhcp_recv+0x164>
  32916. 802c47e: 293b cmp r1, #59 ; 0x3b
  32917. 802c480: d148 bne.n 802c514 <dhcp_recv+0x180>
  32918. 802c482: e040 b.n 802c506 <dhcp_recv+0x172>
  32919. /* case(DHCP_OPTION_END): handled above */
  32920. case(DHCP_OPTION_PAD):
  32921. /* special option: no len encoded */
  32922. decode_len = len = 0;
  32923. /* will be increased below */
  32924. offset--;
  32925. 802c484: 1e51 subs r1, r2, #1
  32926. decode_len = len;
  32927. switch(op) {
  32928. /* case(DHCP_OPTION_END): handled above */
  32929. case(DHCP_OPTION_PAD):
  32930. /* special option: no len encoded */
  32931. decode_len = len = 0;
  32932. 802c486: 2300 movs r3, #0
  32933. /* will be increased below */
  32934. offset--;
  32935. 802c488: b289 uxth r1, r1
  32936. /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
  32937. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  32938. u8_t op = options[offset];
  32939. u8_t len;
  32940. u8_t decode_len = 0;
  32941. int decode_idx = -1;
  32942. 802c48a: f04f 34ff mov.w r4, #4294967295
  32943. decode_len = len;
  32944. switch(op) {
  32945. /* case(DHCP_OPTION_END): handled above */
  32946. case(DHCP_OPTION_PAD):
  32947. /* special option: no len encoded */
  32948. decode_len = len = 0;
  32949. 802c48e: 461e mov r6, r3
  32950. 802c490: e044 b.n 802c51c <dhcp_recv+0x188>
  32951. /* will be increased below */
  32952. offset--;
  32953. break;
  32954. case(DHCP_OPTION_SUBNET_MASK):
  32955. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  32956. 802c492: 2b04 cmp r3, #4
  32957. 802c494: f040 8143 bne.w 802c71e <dhcp_recv+0x38a>
  32958. 802c498: 461e mov r6, r3
  32959. 802c49a: 4611 mov r1, r2
  32960. decode_idx = DHCP_OPTION_IDX_SUBNET_MASK;
  32961. 802c49c: 2406 movs r4, #6
  32962. 802c49e: e03d b.n 802c51c <dhcp_recv+0x188>
  32963. break;
  32964. case(DHCP_OPTION_ROUTER):
  32965. decode_len = 4; /* only copy the first given router */
  32966. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  32967. 802c4a0: 2b03 cmp r3, #3
  32968. 802c4a2: f240 813c bls.w 802c71e <dhcp_recv+0x38a>
  32969. 802c4a6: 4611 mov r1, r2
  32970. decode_idx = DHCP_OPTION_IDX_ROUTER;
  32971. 802c4a8: 2407 movs r4, #7
  32972. case(DHCP_OPTION_SUBNET_MASK):
  32973. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  32974. decode_idx = DHCP_OPTION_IDX_SUBNET_MASK;
  32975. break;
  32976. case(DHCP_OPTION_ROUTER):
  32977. decode_len = 4; /* only copy the first given router */
  32978. 802c4aa: 2604 movs r6, #4
  32979. 802c4ac: e036 b.n 802c51c <dhcp_recv+0x188>
  32980. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  32981. decode_idx = DHCP_OPTION_IDX_ROUTER;
  32982. break;
  32983. case(DHCP_OPTION_DNS_SERVER):
  32984. /* special case: there might be more than one server */
  32985. LWIP_ERROR("len % 4 == 0", len % 4 == 0, return ERR_VAL;);
  32986. 802c4ae: 0799 lsls r1, r3, #30
  32987. 802c4b0: f040 8135 bne.w 802c71e <dhcp_recv+0x38a>
  32988. /* limit number of DNS servers */
  32989. decode_len = LWIP_MIN(len, 4 * DNS_MAX_SERVERS);
  32990. 802c4b4: 2b08 cmp r3, #8
  32991. 802c4b6: bf34 ite cc
  32992. 802c4b8: 461e movcc r6, r3
  32993. 802c4ba: 2608 movcs r6, #8
  32994. 802c4bc: b2f6 uxtb r6, r6
  32995. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  32996. 802c4be: 42b3 cmp r3, r6
  32997. 802c4c0: f0c0 812d bcc.w 802c71e <dhcp_recv+0x38a>
  32998. 802c4c4: 4611 mov r1, r2
  32999. decode_idx = DHCP_OPTION_IDX_DNS_SERVER;
  33000. 802c4c6: 2408 movs r4, #8
  33001. 802c4c8: e028 b.n 802c51c <dhcp_recv+0x188>
  33002. break;
  33003. case(DHCP_OPTION_LEASE_TIME):
  33004. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  33005. 802c4ca: 2b04 cmp r3, #4
  33006. 802c4cc: f040 8127 bne.w 802c71e <dhcp_recv+0x38a>
  33007. 802c4d0: 461e mov r6, r3
  33008. 802c4d2: 4611 mov r1, r2
  33009. decode_idx = DHCP_OPTION_IDX_LEASE_TIME;
  33010. 802c4d4: 2403 movs r4, #3
  33011. 802c4d6: e021 b.n 802c51c <dhcp_recv+0x188>
  33012. break;
  33013. case(DHCP_OPTION_OVERLOAD):
  33014. LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
  33015. 802c4d8: 2b01 cmp r3, #1
  33016. 802c4da: f040 8120 bne.w 802c71e <dhcp_recv+0x38a>
  33017. 802c4de: 461e mov r6, r3
  33018. 802c4e0: 4611 mov r1, r2
  33019. decode_idx = DHCP_OPTION_IDX_OVERLOAD;
  33020. 802c4e2: 2400 movs r4, #0
  33021. 802c4e4: e01a b.n 802c51c <dhcp_recv+0x188>
  33022. break;
  33023. case(DHCP_OPTION_MESSAGE_TYPE):
  33024. LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
  33025. 802c4e6: 2b01 cmp r3, #1
  33026. 802c4e8: e007 b.n 802c4fa <dhcp_recv+0x166>
  33027. decode_idx = DHCP_OPTION_IDX_MSG_TYPE;
  33028. break;
  33029. case(DHCP_OPTION_SERVER_ID):
  33030. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  33031. 802c4ea: 2b04 cmp r3, #4
  33032. 802c4ec: f040 8117 bne.w 802c71e <dhcp_recv+0x38a>
  33033. 802c4f0: 461e mov r6, r3
  33034. 802c4f2: 4611 mov r1, r2
  33035. decode_idx = DHCP_OPTION_IDX_SERVER_ID;
  33036. 802c4f4: 2402 movs r4, #2
  33037. 802c4f6: e011 b.n 802c51c <dhcp_recv+0x188>
  33038. break;
  33039. case(DHCP_OPTION_T1):
  33040. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  33041. 802c4f8: 2b04 cmp r3, #4
  33042. 802c4fa: f040 8110 bne.w 802c71e <dhcp_recv+0x38a>
  33043. 802c4fe: 461e mov r6, r3
  33044. 802c500: 4611 mov r1, r2
  33045. decode_idx = DHCP_OPTION_IDX_T1;
  33046. 802c502: 461c mov r4, r3
  33047. 802c504: e00a b.n 802c51c <dhcp_recv+0x188>
  33048. break;
  33049. case(DHCP_OPTION_T2):
  33050. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  33051. 802c506: 2b04 cmp r3, #4
  33052. 802c508: f040 8109 bne.w 802c71e <dhcp_recv+0x38a>
  33053. 802c50c: 461e mov r6, r3
  33054. 802c50e: 4611 mov r1, r2
  33055. decode_idx = DHCP_OPTION_IDX_T2;
  33056. 802c510: 2405 movs r4, #5
  33057. 802c512: e003 b.n 802c51c <dhcp_recv+0x188>
  33058. } else {
  33059. len = (q->next != NULL ? ((u8_t*)q->next->payload)[0] : 0);
  33060. }
  33061. /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */
  33062. decode_len = len;
  33063. switch(op) {
  33064. 802c514: 4611 mov r1, r2
  33065. /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
  33066. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  33067. u8_t op = options[offset];
  33068. u8_t len;
  33069. u8_t decode_len = 0;
  33070. int decode_idx = -1;
  33071. 802c516: f04f 34ff mov.w r4, #4294967295
  33072. case(DHCP_OPTION_T2):
  33073. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  33074. decode_idx = DHCP_OPTION_IDX_T2;
  33075. break;
  33076. default:
  33077. decode_len = 0;
  33078. 802c51a: 2600 movs r6, #0
  33079. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  33080. break;
  33081. }
  33082. offset += len + 2;
  33083. 802c51c: 3102 adds r1, #2
  33084. 802c51e: fa13 f381 uxtah r3, r3, r1
  33085. 802c522: b29b uxth r3, r3
  33086. 802c524: 9301 str r3, [sp, #4]
  33087. if (decode_len > 0) {
  33088. 802c526: 2e00 cmp r6, #0
  33089. 802c528: d04f beq.n 802c5ca <dhcp_recv+0x236>
  33090. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  33091. u8_t op = options[offset];
  33092. u8_t len;
  33093. u8_t decode_len = 0;
  33094. int decode_idx = -1;
  33095. u16_t val_offset = offset + 2;
  33096. 802c52a: 3202 adds r2, #2
  33097. 802c52c: b292 uxth r2, r2
  33098. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  33099. break;
  33100. }
  33101. offset += len + 2;
  33102. if (decode_len > 0) {
  33103. u32_t value = 0;
  33104. 802c52e: a90a add r1, sp, #40 ; 0x28
  33105. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  33106. u8_t op = options[offset];
  33107. u8_t len;
  33108. u8_t decode_len = 0;
  33109. int decode_idx = -1;
  33110. u16_t val_offset = offset + 2;
  33111. 802c530: 9205 str r2, [sp, #20]
  33112. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  33113. break;
  33114. }
  33115. offset += len + 2;
  33116. if (decode_len > 0) {
  33117. u32_t value = 0;
  33118. 802c532: 2300 movs r3, #0
  33119. /**
  33120. * If an incoming DHCP message is in response to us, then trigger the state machine
  33121. */
  33122. static void
  33123. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  33124. 802c534: 4a4b ldr r2, [pc, #300] ; (802c664 <dhcp_recv+0x2d0>)
  33125. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  33126. break;
  33127. }
  33128. offset += len + 2;
  33129. if (decode_len > 0) {
  33130. u32_t value = 0;
  33131. 802c536: f841 3d04 str.w r3, [r1, #-4]!
  33132. /**
  33133. * If an incoming DHCP message is in response to us, then trigger the state machine
  33134. */
  33135. static void
  33136. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  33137. 802c53a: eb02 0284 add.w r2, r2, r4, lsl #2
  33138. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  33139. break;
  33140. }
  33141. offset += len + 2;
  33142. if (decode_len > 0) {
  33143. u32_t value = 0;
  33144. 802c53e: 9104 str r1, [sp, #16]
  33145. /**
  33146. * If an incoming DHCP message is in response to us, then trigger the state machine
  33147. */
  33148. static void
  33149. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  33150. 802c540: 9206 str r2, [sp, #24]
  33151. 802c542: 9302 str r3, [sp, #8]
  33152. 802c544: 9805 ldr r0, [sp, #20]
  33153. 802c546: 9902 ldr r1, [sp, #8]
  33154. if (decode_len > 0) {
  33155. u32_t value = 0;
  33156. u16_t copy_len;
  33157. decode_next:
  33158. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  33159. if (!dhcp_option_given(dhcp, decode_idx)) {
  33160. 802c548: 4a45 ldr r2, [pc, #276] ; (802c660 <dhcp_recv+0x2cc>)
  33161. /**
  33162. * If an incoming DHCP message is in response to us, then trigger the state machine
  33163. */
  33164. static void
  33165. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  33166. 802c54a: 1843 adds r3, r0, r1
  33167. if (decode_len > 0) {
  33168. u32_t value = 0;
  33169. u16_t copy_len;
  33170. decode_next:
  33171. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  33172. if (!dhcp_option_given(dhcp, decode_idx)) {
  33173. 802c54c: 4844 ldr r0, [pc, #272] ; (802c660 <dhcp_recv+0x2cc>)
  33174. 802c54e: 18a2 adds r2, r4, r2
  33175. 802c550: 9207 str r2, [sp, #28]
  33176. 802c552: 5c22 ldrb r2, [r4, r0]
  33177. /**
  33178. * If an incoming DHCP message is in response to us, then trigger the state machine
  33179. */
  33180. static void
  33181. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  33182. 802c554: ebc1 0c06 rsb ip, r1, r6
  33183. 802c558: b29b uxth r3, r3
  33184. 802c55a: fa5f fc8c uxtb.w ip, ip
  33185. if (decode_len > 0) {
  33186. u32_t value = 0;
  33187. u16_t copy_len;
  33188. decode_next:
  33189. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  33190. if (!dhcp_option_given(dhcp, decode_idx)) {
  33191. 802c55e: 2a00 cmp r2, #0
  33192. 802c560: d133 bne.n 802c5ca <dhcp_recv+0x236>
  33193. copy_len = LWIP_MIN(decode_len, 4);
  33194. pbuf_copy_partial(q, &value, copy_len, val_offset);
  33195. 802c562: f1bc 0f03 cmp.w ip, #3
  33196. 802c566: bf94 ite ls
  33197. 802c568: 4662 movls r2, ip
  33198. 802c56a: 2204 movhi r2, #4
  33199. 802c56c: 4638 mov r0, r7
  33200. 802c56e: 9904 ldr r1, [sp, #16]
  33201. 802c570: f8cd c000 str.w ip, [sp]
  33202. 802c574: f000 feaa bl 802d2cc <pbuf_copy_partial>
  33203. if (decode_len > 4) {
  33204. 802c578: f8dd c000 ldr.w ip, [sp]
  33205. 802c57c: f1bc 0f04 cmp.w ip, #4
  33206. 802c580: d90f bls.n 802c5a2 <dhcp_recv+0x20e>
  33207. /* decode more than one u32_t */
  33208. LWIP_ERROR("decode_len % 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
  33209. 802c582: f01c 0f03 tst.w ip, #3
  33210. 802c586: f040 80ca bne.w 802c71e <dhcp_recv+0x38a>
  33211. dhcp_got_option(dhcp, decode_idx);
  33212. 802c58a: 9907 ldr r1, [sp, #28]
  33213. dhcp_set_option_value(dhcp, decode_idx, htonl(value));
  33214. 802c58c: 9809 ldr r0, [sp, #36] ; 0x24
  33215. copy_len = LWIP_MIN(decode_len, 4);
  33216. pbuf_copy_partial(q, &value, copy_len, val_offset);
  33217. if (decode_len > 4) {
  33218. /* decode more than one u32_t */
  33219. LWIP_ERROR("decode_len % 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
  33220. dhcp_got_option(dhcp, decode_idx);
  33221. 802c58e: 2201 movs r2, #1
  33222. 802c590: 700a strb r2, [r1, #0]
  33223. dhcp_set_option_value(dhcp, decode_idx, htonl(value));
  33224. 802c592: f7ff fc19 bl 802bdc8 <lwip_htonl>
  33225. 802c596: 9b02 ldr r3, [sp, #8]
  33226. 802c598: 9906 ldr r1, [sp, #24]
  33227. decode_len -= 4;
  33228. val_offset += 4;
  33229. decode_idx++;
  33230. 802c59a: 3401 adds r4, #1
  33231. pbuf_copy_partial(q, &value, copy_len, val_offset);
  33232. if (decode_len > 4) {
  33233. /* decode more than one u32_t */
  33234. LWIP_ERROR("decode_len % 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
  33235. dhcp_got_option(dhcp, decode_idx);
  33236. dhcp_set_option_value(dhcp, decode_idx, htonl(value));
  33237. 802c59c: 50c8 str r0, [r1, r3]
  33238. 802c59e: 3304 adds r3, #4
  33239. 802c5a0: e7cf b.n 802c542 <dhcp_recv+0x1ae>
  33240. decode_len -= 4;
  33241. val_offset += 4;
  33242. decode_idx++;
  33243. goto decode_next;
  33244. } else if (decode_len == 4) {
  33245. 802c5a2: d104 bne.n 802c5ae <dhcp_recv+0x21a>
  33246. value = ntohl(value);
  33247. 802c5a4: 9809 ldr r0, [sp, #36] ; 0x24
  33248. 802c5a6: f7ff fc11 bl 802bdcc <lwip_ntohl>
  33249. 802c5aa: 9009 str r0, [sp, #36] ; 0x24
  33250. 802c5ac: e006 b.n 802c5bc <dhcp_recv+0x228>
  33251. } else {
  33252. LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;);
  33253. 802c5ae: f1bc 0f01 cmp.w ip, #1
  33254. 802c5b2: f040 80b4 bne.w 802c71e <dhcp_recv+0x38a>
  33255. value = ((u8_t*)&value)[0];
  33256. 802c5b6: f89d 3024 ldrb.w r3, [sp, #36] ; 0x24
  33257. 802c5ba: 9309 str r3, [sp, #36] ; 0x24
  33258. }
  33259. dhcp_got_option(dhcp, decode_idx);
  33260. 802c5bc: 4a28 ldr r2, [pc, #160] ; (802c660 <dhcp_recv+0x2cc>)
  33261. dhcp_set_option_value(dhcp, decode_idx, value);
  33262. 802c5be: 4829 ldr r0, [pc, #164] ; (802c664 <dhcp_recv+0x2d0>)
  33263. value = ntohl(value);
  33264. } else {
  33265. LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;);
  33266. value = ((u8_t*)&value)[0];
  33267. }
  33268. dhcp_got_option(dhcp, decode_idx);
  33269. 802c5c0: 2301 movs r3, #1
  33270. 802c5c2: 5513 strb r3, [r2, r4]
  33271. dhcp_set_option_value(dhcp, decode_idx, value);
  33272. 802c5c4: 9b09 ldr r3, [sp, #36] ; 0x24
  33273. 802c5c6: f840 3024 str.w r3, [r0, r4, lsl #2]
  33274. }
  33275. }
  33276. if (offset >= q->len) {
  33277. 802c5ca: 897b ldrh r3, [r7, #10]
  33278. 802c5cc: 9901 ldr r1, [sp, #4]
  33279. 802c5ce: 4299 cmp r1, r3
  33280. 802c5d0: d30f bcc.n 802c5f2 <dhcp_recv+0x25e>
  33281. offset -= q->len;
  33282. 802c5d2: 1aca subs r2, r1, r3
  33283. offset_max -= q->len;
  33284. 802c5d4: ebc3 0909 rsb r9, r3, r9
  33285. dhcp_got_option(dhcp, decode_idx);
  33286. dhcp_set_option_value(dhcp, decode_idx, value);
  33287. }
  33288. }
  33289. if (offset >= q->len) {
  33290. offset -= q->len;
  33291. 802c5d8: b292 uxth r2, r2
  33292. offset_max -= q->len;
  33293. 802c5da: fa1f f989 uxth.w r9, r9
  33294. if ((offset < offset_max) && offset_max) {
  33295. 802c5de: 454a cmp r2, r9
  33296. dhcp_got_option(dhcp, decode_idx);
  33297. dhcp_set_option_value(dhcp, decode_idx, value);
  33298. }
  33299. }
  33300. if (offset >= q->len) {
  33301. offset -= q->len;
  33302. 802c5e0: 9201 str r2, [sp, #4]
  33303. offset_max -= q->len;
  33304. if ((offset < offset_max) && offset_max) {
  33305. 802c5e2: d303 bcc.n 802c5ec <dhcp_recv+0x258>
  33306. break;
  33307. }
  33308. }
  33309. }
  33310. /* is this an overloaded message? */
  33311. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  33312. 802c5e4: 4a1e ldr r2, [pc, #120] ; (802c660 <dhcp_recv+0x2cc>)
  33313. 802c5e6: 7813 ldrb r3, [r2, #0]
  33314. 802c5e8: b963 cbnz r3, 802c604 <dhcp_recv+0x270>
  33315. 802c5ea: e09f b.n 802c72c <dhcp_recv+0x398>
  33316. }
  33317. if (offset >= q->len) {
  33318. offset -= q->len;
  33319. offset_max -= q->len;
  33320. if ((offset < offset_max) && offset_max) {
  33321. q = q->next;
  33322. 802c5ec: 683f ldr r7, [r7, #0]
  33323. LWIP_ASSERT("next pbuf was null", q);
  33324. options = (u8_t*)q->payload;
  33325. 802c5ee: 687b ldr r3, [r7, #4]
  33326. 802c5f0: 9303 str r3, [sp, #12]
  33327. u32_t value = 0;
  33328. u16_t copy_len;
  33329. decode_next:
  33330. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  33331. if (!dhcp_option_given(dhcp, decode_idx)) {
  33332. copy_len = LWIP_MIN(decode_len, 4);
  33333. 802c5f2: 9a01 ldr r2, [sp, #4]
  33334. }
  33335. offset = options_idx;
  33336. offset_max = options_idx_max;
  33337. options = (u8_t*)q->payload;
  33338. /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
  33339. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  33340. 802c5f4: 9803 ldr r0, [sp, #12]
  33341. 802c5f6: 5c81 ldrb r1, [r0, r2]
  33342. 802c5f8: 29ff cmp r1, #255 ; 0xff
  33343. 802c5fa: d0f3 beq.n 802c5e4 <dhcp_recv+0x250>
  33344. 802c5fc: 454a cmp r2, r9
  33345. 802c5fe: f4ff af1d bcc.w 802c43c <dhcp_recv+0xa8>
  33346. 802c602: e7ef b.n 802c5e4 <dhcp_recv+0x250>
  33347. }
  33348. }
  33349. }
  33350. /* is this an overloaded message? */
  33351. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  33352. u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  33353. 802c604: 4b17 ldr r3, [pc, #92] ; (802c664 <dhcp_recv+0x2d0>)
  33354. dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  33355. 802c606: 4916 ldr r1, [pc, #88] ; (802c660 <dhcp_recv+0x2cc>)
  33356. }
  33357. }
  33358. }
  33359. /* is this an overloaded message? */
  33360. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  33361. u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  33362. 802c608: 681b ldr r3, [r3, #0]
  33363. dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  33364. 802c60a: 2200 movs r2, #0
  33365. if (overload == DHCP_OVERLOAD_FILE) {
  33366. 802c60c: 2b01 cmp r3, #1
  33367. }
  33368. }
  33369. /* is this an overloaded message? */
  33370. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  33371. u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  33372. dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  33373. 802c60e: 700a strb r2, [r1, #0]
  33374. if (overload == DHCP_OVERLOAD_FILE) {
  33375. 802c610: f000 8093 beq.w 802c73a <dhcp_recv+0x3a6>
  33376. parse_file_as_options = 1;
  33377. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n"));
  33378. } else if (overload == DHCP_OVERLOAD_SNAME) {
  33379. 802c614: 2b02 cmp r3, #2
  33380. 802c616: f43f aefa beq.w 802c40e <dhcp_recv+0x7a>
  33381. parse_sname_as_options = 1;
  33382. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n"));
  33383. } else if (overload == DHCP_OVERLOAD_SNAME_FILE) {
  33384. 802c61a: 2b03 cmp r3, #3
  33385. 802c61c: f040 8086 bne.w 802c72c <dhcp_recv+0x398>
  33386. 802c620: e089 b.n 802c736 <dhcp_recv+0x3a2>
  33387. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP_OPTION_MESSAGE_TYPE option not found\n"));
  33388. goto free_pbuf_and_return;
  33389. }
  33390. /* read DHCP message type */
  33391. msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE);
  33392. 802c622: 4a10 ldr r2, [pc, #64] ; (802c664 <dhcp_recv+0x2d0>)
  33393. 802c624: 7911 ldrb r1, [r2, #4]
  33394. /* message type is DHCP ACK? */
  33395. if (msg_type == DHCP_ACK) {
  33396. 802c626: 2905 cmp r1, #5
  33397. 802c628: d140 bne.n 802c6ac <dhcp_recv+0x318>
  33398. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n"));
  33399. /* in requesting state? */
  33400. if (dhcp->state == DHCP_REQUESTING) {
  33401. 802c62a: f898 100c ldrb.w r1, [r8, #12]
  33402. 802c62e: 2901 cmp r1, #1
  33403. 802c630: d135 bne.n 802c69e <dhcp_recv+0x30a>
  33404. * @param netif the netif under DHCP control
  33405. */
  33406. static void
  33407. dhcp_handle_ack(struct netif *netif)
  33408. {
  33409. struct dhcp *dhcp = netif->dhcp;
  33410. 802c632: 6a2c ldr r4, [r5, #32]
  33411. #if LWIP_DHCP_BOOTP_FILE
  33412. ip_addr_set_zero(&dhcp->offered_si_addr);
  33413. #endif /* LWIP_DHCP_BOOTP_FILE */
  33414. /* lease time given? */
  33415. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {
  33416. 802c634: 78db ldrb r3, [r3, #3]
  33417. #if LWIP_DNS
  33418. u8_t n;
  33419. #endif /* LWIP_DNS */
  33420. /* clear options we might not get from the ACK */
  33421. ip_addr_set_zero(&dhcp->offered_sn_mask);
  33422. 802c636: f8c4 b028 str.w fp, [r4, #40] ; 0x28
  33423. ip_addr_set_zero(&dhcp->offered_gw_addr);
  33424. 802c63a: f8c4 b02c str.w fp, [r4, #44] ; 0x2c
  33425. #if LWIP_DHCP_BOOTP_FILE
  33426. ip_addr_set_zero(&dhcp->offered_si_addr);
  33427. #endif /* LWIP_DHCP_BOOTP_FILE */
  33428. /* lease time given? */
  33429. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {
  33430. 802c63e: b10b cbz r3, 802c644 <dhcp_recv+0x2b0>
  33431. /* remember offered lease time */
  33432. dhcp->offered_t0_lease = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_LEASE_TIME);
  33433. 802c640: 68d3 ldr r3, [r2, #12]
  33434. 802c642: 6323 str r3, [r4, #48] ; 0x30
  33435. }
  33436. /* renewal period given? */
  33437. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) {
  33438. 802c644: 4b06 ldr r3, [pc, #24] ; (802c660 <dhcp_recv+0x2cc>)
  33439. 802c646: 791a ldrb r2, [r3, #4]
  33440. 802c648: b112 cbz r2, 802c650 <dhcp_recv+0x2bc>
  33441. /* remember given renewal period */
  33442. dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1);
  33443. 802c64a: 4a06 ldr r2, [pc, #24] ; (802c664 <dhcp_recv+0x2d0>)
  33444. 802c64c: 6912 ldr r2, [r2, #16]
  33445. 802c64e: e001 b.n 802c654 <dhcp_recv+0x2c0>
  33446. } else {
  33447. /* calculate safe periods for renewal */
  33448. dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;
  33449. 802c650: 6b22 ldr r2, [r4, #48] ; 0x30
  33450. 802c652: 0852 lsrs r2, r2, #1
  33451. }
  33452. /* renewal period given? */
  33453. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) {
  33454. 802c654: 795b ldrb r3, [r3, #5]
  33455. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) {
  33456. /* remember given renewal period */
  33457. dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1);
  33458. } else {
  33459. /* calculate safe periods for renewal */
  33460. dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;
  33461. 802c656: 6362 str r2, [r4, #52] ; 0x34
  33462. }
  33463. /* renewal period given? */
  33464. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) {
  33465. 802c658: b133 cbz r3, 802c668 <dhcp_recv+0x2d4>
  33466. /* remember given rebind period */
  33467. dhcp->offered_t2_rebind = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T2);
  33468. 802c65a: 4b02 ldr r3, [pc, #8] ; (802c664 <dhcp_recv+0x2d0>)
  33469. 802c65c: 695b ldr r3, [r3, #20]
  33470. 802c65e: e004 b.n 802c66a <dhcp_recv+0x2d6>
  33471. 802c660: 2000fb88 .word 0x2000fb88
  33472. 802c664: 2000fb94 .word 0x2000fb94
  33473. } else {
  33474. /* calculate safe periods for rebinding */
  33475. dhcp->offered_t2_rebind = dhcp->offered_t0_lease;
  33476. 802c668: 6b23 ldr r3, [r4, #48] ; 0x30
  33477. 802c66a: 63a3 str r3, [r4, #56] ; 0x38
  33478. }
  33479. /* (y)our internet address */
  33480. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  33481. 802c66c: 68a3 ldr r3, [r4, #8]
  33482. boot file name copied in dhcp_parse_reply if not overloaded */
  33483. ip_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr);
  33484. #endif /* LWIP_DHCP_BOOTP_FILE */
  33485. /* subnet mask given? */
  33486. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
  33487. 802c66e: 4a39 ldr r2, [pc, #228] ; (802c754 <dhcp_recv+0x3c0>)
  33488. /* calculate safe periods for rebinding */
  33489. dhcp->offered_t2_rebind = dhcp->offered_t0_lease;
  33490. }
  33491. /* (y)our internet address */
  33492. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  33493. 802c670: 691b ldr r3, [r3, #16]
  33494. 802c672: 6263 str r3, [r4, #36] ; 0x24
  33495. boot file name copied in dhcp_parse_reply if not overloaded */
  33496. ip_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr);
  33497. #endif /* LWIP_DHCP_BOOTP_FILE */
  33498. /* subnet mask given? */
  33499. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
  33500. 802c674: 7993 ldrb r3, [r2, #6]
  33501. 802c676: 4616 mov r6, r2
  33502. 802c678: b12b cbz r3, 802c686 <dhcp_recv+0x2f2>
  33503. /* remember given subnet mask */
  33504. ip4_addr_set_u32(&dhcp->offered_sn_mask, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));
  33505. 802c67a: 4b37 ldr r3, [pc, #220] ; (802c758 <dhcp_recv+0x3c4>)
  33506. 802c67c: 6998 ldr r0, [r3, #24]
  33507. 802c67e: f7ff fba3 bl 802bdc8 <lwip_htonl>
  33508. dhcp->subnet_mask_given = 1;
  33509. 802c682: 2301 movs r3, #1
  33510. #endif /* LWIP_DHCP_BOOTP_FILE */
  33511. /* subnet mask given? */
  33512. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
  33513. /* remember given subnet mask */
  33514. ip4_addr_set_u32(&dhcp->offered_sn_mask, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));
  33515. 802c684: 62a0 str r0, [r4, #40] ; 0x28
  33516. dhcp->subnet_mask_given = 1;
  33517. } else {
  33518. dhcp->subnet_mask_given = 0;
  33519. 802c686: 73a3 strb r3, [r4, #14]
  33520. }
  33521. /* gateway router */
  33522. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_ROUTER)) {
  33523. 802c688: 79f3 ldrb r3, [r6, #7]
  33524. 802c68a: b123 cbz r3, 802c696 <dhcp_recv+0x302>
  33525. ip4_addr_set_u32(&dhcp->offered_gw_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_ROUTER)));
  33526. 802c68c: 4b32 ldr r3, [pc, #200] ; (802c758 <dhcp_recv+0x3c4>)
  33527. 802c68e: 69d8 ldr r0, [r3, #28]
  33528. 802c690: f7ff fb9a bl 802bdc8 <lwip_htonl>
  33529. 802c694: 62e0 str r0, [r4, #44] ; 0x2c
  33530. /* in requesting state? */
  33531. if (dhcp->state == DHCP_REQUESTING) {
  33532. dhcp_handle_ack(netif);
  33533. #if DHCP_DOES_ARP_CHECK
  33534. /* check if the acknowledged lease address is already in use */
  33535. dhcp_check(netif);
  33536. 802c696: 4628 mov r0, r5
  33537. 802c698: f7ff fe0a bl 802c2b0 <dhcp_check>
  33538. 802c69c: e03f b.n 802c71e <dhcp_recv+0x38a>
  33539. /* bind interface to the acknowledged lease address */
  33540. dhcp_bind(netif);
  33541. #endif
  33542. }
  33543. /* already bound to the given lease address? */
  33544. else if ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING)) {
  33545. 802c69e: 3903 subs r1, #3
  33546. 802c6a0: 2902 cmp r1, #2
  33547. 802c6a2: d83c bhi.n 802c71e <dhcp_recv+0x38a>
  33548. dhcp_bind(netif);
  33549. 802c6a4: 4628 mov r0, r5
  33550. 802c6a6: f7ff fe16 bl 802c2d6 <dhcp_bind>
  33551. 802c6aa: e038 b.n 802c71e <dhcp_recv+0x38a>
  33552. }
  33553. }
  33554. /* received a DHCP_NAK in appropriate state? */
  33555. else if ((msg_type == DHCP_NAK) &&
  33556. 802c6ac: 2906 cmp r1, #6
  33557. 802c6ae: d121 bne.n 802c6f4 <dhcp_recv+0x360>
  33558. 802c6b0: f898 300c ldrb.w r3, [r8, #12]
  33559. 802c6b4: 2b05 cmp r3, #5
  33560. 802c6b6: d832 bhi.n 802c71e <dhcp_recv+0x38a>
  33561. 802c6b8: f998 300c ldrsb.w r3, [r8, #12]
  33562. 802c6bc: f04f 42b8 mov.w r2, #1543503872 ; 0x5c000000
  33563. 802c6c0: 409a lsls r2, r3
  33564. 802c6c2: d52c bpl.n 802c71e <dhcp_recv+0x38a>
  33565. {
  33566. struct dhcp *dhcp = netif->dhcp;
  33567. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n",
  33568. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  33569. /* Set the interface down since the address must no longer be used, as per RFC2131 */
  33570. netif_set_down(netif);
  33571. 802c6c4: 4628 mov r0, r5
  33572. * @param netif the netif under DHCP control
  33573. */
  33574. static void
  33575. dhcp_handle_nak(struct netif *netif)
  33576. {
  33577. struct dhcp *dhcp = netif->dhcp;
  33578. 802c6c6: 6a2c ldr r4, [r5, #32]
  33579. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n",
  33580. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  33581. /* Set the interface down since the address must no longer be used, as per RFC2131 */
  33582. netif_set_down(netif);
  33583. 802c6c8: f000 fc6e bl 802cfa8 <netif_set_down>
  33584. /* remove IP address from interface */
  33585. netif_set_ipaddr(netif, IP_ADDR_ANY);
  33586. 802c6cc: 4628 mov r0, r5
  33587. 802c6ce: 4923 ldr r1, [pc, #140] ; (802c75c <dhcp_recv+0x3c8>)
  33588. 802c6d0: f000 fbba bl 802ce48 <netif_set_ipaddr>
  33589. netif_set_gw(netif, IP_ADDR_ANY);
  33590. 802c6d4: 4628 mov r0, r5
  33591. 802c6d6: 4921 ldr r1, [pc, #132] ; (802c75c <dhcp_recv+0x3c8>)
  33592. 802c6d8: f000 fbf2 bl 802cec0 <netif_set_gw>
  33593. netif_set_netmask(netif, IP_ADDR_ANY);
  33594. 802c6dc: 4628 mov r0, r5
  33595. 802c6de: 491f ldr r1, [pc, #124] ; (802c75c <dhcp_recv+0x3c8>)
  33596. 802c6e0: f000 fbf2 bl 802cec8 <netif_set_netmask>
  33597. /* Change to a defined state */
  33598. dhcp_set_state(dhcp, DHCP_BACKING_OFF);
  33599. 802c6e4: 4620 mov r0, r4
  33600. 802c6e6: 210c movs r1, #12
  33601. 802c6e8: f7ff fb72 bl 802bdd0 <dhcp_set_state>
  33602. /* We can immediately restart discovery */
  33603. dhcp_discover(netif);
  33604. 802c6ec: 4628 mov r0, r5
  33605. 802c6ee: f7ff fc7f bl 802bff0 <dhcp_discover>
  33606. 802c6f2: e014 b.n 802c71e <dhcp_recv+0x38a>
  33607. (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING ))) {
  33608. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_NAK received\n"));
  33609. dhcp_handle_nak(netif);
  33610. }
  33611. /* received a DHCP_OFFER in DHCP_SELECTING state? */
  33612. else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_SELECTING)) {
  33613. 802c6f4: 2902 cmp r1, #2
  33614. 802c6f6: d112 bne.n 802c71e <dhcp_recv+0x38a>
  33615. 802c6f8: f898 100c ldrb.w r1, [r8, #12]
  33616. 802c6fc: 2906 cmp r1, #6
  33617. 802c6fe: d10e bne.n 802c71e <dhcp_recv+0x38a>
  33618. {
  33619. struct dhcp *dhcp = netif->dhcp;
  33620. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
  33621. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  33622. /* obtain the server address */
  33623. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  33624. 802c700: 789b ldrb r3, [r3, #2]
  33625. dhcp_handle_nak(netif);
  33626. }
  33627. /* received a DHCP_OFFER in DHCP_SELECTING state? */
  33628. else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_SELECTING)) {
  33629. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_OFFER received in DHCP_SELECTING state\n"));
  33630. dhcp->request_timeout = 0;
  33631. 802c702: f8a8 b01a strh.w fp, [r8, #26]
  33632. * @param netif the netif under DHCP control
  33633. */
  33634. static void
  33635. dhcp_handle_offer(struct netif *netif)
  33636. {
  33637. struct dhcp *dhcp = netif->dhcp;
  33638. 802c706: 6a2c ldr r4, [r5, #32]
  33639. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
  33640. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  33641. /* obtain the server address */
  33642. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  33643. 802c708: b14b cbz r3, 802c71e <dhcp_recv+0x38a>
  33644. ip4_addr_set_u32(&dhcp->server_ip_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
  33645. 802c70a: 6890 ldr r0, [r2, #8]
  33646. 802c70c: f7ff fb5c bl 802bdc8 <lwip_htonl>
  33647. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
  33648. ip4_addr_get_u32(&dhcp->server_ip_addr)));
  33649. /* remember offered address */
  33650. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  33651. 802c710: 68a3 ldr r3, [r4, #8]
  33652. struct dhcp *dhcp = netif->dhcp;
  33653. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
  33654. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  33655. /* obtain the server address */
  33656. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  33657. ip4_addr_set_u32(&dhcp->server_ip_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
  33658. 802c712: 6220 str r0, [r4, #32]
  33659. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
  33660. ip4_addr_get_u32(&dhcp->server_ip_addr)));
  33661. /* remember offered address */
  33662. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  33663. 802c714: 691b ldr r3, [r3, #16]
  33664. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n",
  33665. ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  33666. dhcp_select(netif);
  33667. 802c716: 4628 mov r0, r5
  33668. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  33669. ip4_addr_set_u32(&dhcp->server_ip_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
  33670. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
  33671. ip4_addr_get_u32(&dhcp->server_ip_addr)));
  33672. /* remember offered address */
  33673. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  33674. 802c718: 6263 str r3, [r4, #36] ; 0x24
  33675. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n",
  33676. ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  33677. dhcp_select(netif);
  33678. 802c71a: f7ff fd57 bl 802c1cc <dhcp_select>
  33679. dhcp->request_timeout = 0;
  33680. /* remember offered lease */
  33681. dhcp_handle_offer(netif);
  33682. }
  33683. free_pbuf_and_return:
  33684. dhcp->msg_in = NULL;
  33685. 802c71e: 2300 movs r3, #0
  33686. 802c720: f8c8 3008 str.w r3, [r8, #8]
  33687. pbuf_free(p);
  33688. 802c724: 4650 mov r0, sl
  33689. 802c726: f000 fc83 bl 802d030 <pbuf_free>
  33690. 802c72a: e010 b.n 802c74e <dhcp_recv+0x3ba>
  33691. /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
  33692. parse_file_as_options = 0;
  33693. options_idx = DHCP_FILE_OFS;
  33694. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  33695. goto again;
  33696. } else if (parse_sname_as_options) {
  33697. 802c72c: f1bb 0f00 cmp.w fp, #0
  33698. 802c730: f47f ae6d bne.w 802c40e <dhcp_recv+0x7a>
  33699. 802c734: e005 b.n 802c742 <dhcp_recv+0x3ae>
  33700. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n"));
  33701. } else if (overload == DHCP_OVERLOAD_SNAME) {
  33702. parse_sname_as_options = 1;
  33703. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n"));
  33704. } else if (overload == DHCP_OVERLOAD_SNAME_FILE) {
  33705. parse_sname_as_options = 1;
  33706. 802c736: f04f 0b01 mov.w fp, #1
  33707. }
  33708. if (parse_file_as_options) {
  33709. /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
  33710. parse_file_as_options = 0;
  33711. options_idx = DHCP_FILE_OFS;
  33712. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  33713. 802c73a: f04f 09ec mov.w r9, #236 ; 0xec
  33714. #endif /* LWIP_DHCP_BOOTP_FILE */
  33715. }
  33716. if (parse_file_as_options) {
  33717. /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
  33718. parse_file_as_options = 0;
  33719. options_idx = DHCP_FILE_OFS;
  33720. 802c73e: 226c movs r2, #108 ; 0x6c
  33721. 802c740: e66a b.n 802c418 <dhcp_recv+0x84>
  33722. goto free_pbuf_and_return;
  33723. }
  33724. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("searching DHCP_OPTION_MESSAGE_TYPE\n"));
  33725. /* obtain pointer to DHCP message type */
  33726. if (!dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE)) {
  33727. 802c742: 4b04 ldr r3, [pc, #16] ; (802c754 <dhcp_recv+0x3c0>)
  33728. 802c744: 785a ldrb r2, [r3, #1]
  33729. 802c746: 2a00 cmp r2, #0
  33730. 802c748: f47f af6b bne.w 802c622 <dhcp_recv+0x28e>
  33731. 802c74c: e7e7 b.n 802c71e <dhcp_recv+0x38a>
  33732. dhcp_handle_offer(netif);
  33733. }
  33734. free_pbuf_and_return:
  33735. dhcp->msg_in = NULL;
  33736. pbuf_free(p);
  33737. }
  33738. 802c74e: b00b add sp, #44 ; 0x2c
  33739. 802c750: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  33740. 802c754: 2000fb88 .word 0x2000fb88
  33741. 802c758: 2000fb94 .word 0x2000fb94
  33742. 802c75c: 0803fe88 .word 0x0803fe88
  33743. 0802c760 <dhcp_arp_reply>:
  33744. *
  33745. * @param netif the network interface on which the reply was received
  33746. * @param addr The IP address we received a reply from
  33747. */
  33748. void dhcp_arp_reply(struct netif *netif, ip_addr_t *addr)
  33749. {
  33750. 802c760: b537 push {r0, r1, r2, r4, r5, lr}
  33751. LWIP_ERROR("netif != NULL", (netif != NULL), return;);
  33752. 802c762: 4605 mov r5, r0
  33753. 802c764: 2800 cmp r0, #0
  33754. 802c766: d037 beq.n 802c7d8 <dhcp_arp_reply+0x78>
  33755. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_arp_reply()\n"));
  33756. /* is a DHCP client doing an ARP check? */
  33757. if ((netif->dhcp != NULL) && (netif->dhcp->state == DHCP_CHECKING)) {
  33758. 802c768: 6a04 ldr r4, [r0, #32]
  33759. 802c76a: 2c00 cmp r4, #0
  33760. 802c76c: d034 beq.n 802c7d8 <dhcp_arp_reply+0x78>
  33761. 802c76e: 7b23 ldrb r3, [r4, #12]
  33762. 802c770: 2b08 cmp r3, #8
  33763. 802c772: d131 bne.n 802c7d8 <dhcp_arp_reply+0x78>
  33764. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n",
  33765. ip4_addr_get_u32(addr)));
  33766. /* did a host respond with the address we
  33767. were offered by the DHCP server? */
  33768. if (ip_addr_cmp(addr, &netif->dhcp->offered_ip_addr)) {
  33769. 802c774: 680a ldr r2, [r1, #0]
  33770. 802c776: 6a63 ldr r3, [r4, #36] ; 0x24
  33771. 802c778: 429a cmp r2, r3
  33772. 802c77a: d12d bne.n 802c7d8 <dhcp_arp_reply+0x78>
  33773. {
  33774. struct dhcp *dhcp = netif->dhcp;
  33775. err_t result = ERR_OK;
  33776. u16_t msecs;
  33777. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline()\n"));
  33778. dhcp_set_state(dhcp, DHCP_BACKING_OFF);
  33779. 802c77c: 4620 mov r0, r4
  33780. 802c77e: 210c movs r1, #12
  33781. 802c780: f7ff fb26 bl 802bdd0 <dhcp_set_state>
  33782. /* create and initialize the DHCP message header */
  33783. result = dhcp_create_msg(netif, dhcp, DHCP_DECLINE);
  33784. 802c784: 4628 mov r0, r5
  33785. 802c786: 4621 mov r1, r4
  33786. 802c788: 2204 movs r2, #4
  33787. 802c78a: f7ff fb85 bl 802be98 <dhcp_create_msg>
  33788. if (result == ERR_OK) {
  33789. 802c78e: b9f0 cbnz r0, 802c7ce <dhcp_arp_reply+0x6e>
  33790. dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
  33791. 802c790: 2204 movs r2, #4
  33792. 802c792: 2132 movs r1, #50 ; 0x32
  33793. 802c794: 4620 mov r0, r4
  33794. 802c796: f7ff fb23 bl 802bde0 <dhcp_option>
  33795. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  33796. 802c79a: 6a60 ldr r0, [r4, #36] ; 0x24
  33797. 802c79c: f7ff fb16 bl 802bdcc <lwip_ntohl>
  33798. 802c7a0: 4601 mov r1, r0
  33799. 802c7a2: 4620 mov r0, r4
  33800. 802c7a4: f7ff fb43 bl 802be2e <dhcp_option_long>
  33801. dhcp_option_trailer(dhcp);
  33802. 802c7a8: 4620 mov r0, r4
  33803. 802c7aa: f7ff fb60 bl 802be6e <dhcp_option_trailer>
  33804. /* resize pbuf to reflect true size of options */
  33805. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  33806. 802c7ae: 8b21 ldrh r1, [r4, #24]
  33807. 802c7b0: 6920 ldr r0, [r4, #16]
  33808. 802c7b2: 31f0 adds r1, #240 ; 0xf0
  33809. 802c7b4: b289 uxth r1, r1
  33810. 802c7b6: f000 fc62 bl 802d07e <pbuf_realloc>
  33811. /* per section 4.4.4, broadcast DECLINE messages */
  33812. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  33813. 802c7ba: 9500 str r5, [sp, #0]
  33814. 802c7bc: 6860 ldr r0, [r4, #4]
  33815. 802c7be: 6921 ldr r1, [r4, #16]
  33816. 802c7c0: 4a06 ldr r2, [pc, #24] ; (802c7dc <dhcp_arp_reply+0x7c>)
  33817. 802c7c2: 2343 movs r3, #67 ; 0x43
  33818. 802c7c4: f003 f8d4 bl 802f970 <udp_sendto_if>
  33819. dhcp_delete_msg(dhcp);
  33820. 802c7c8: 4620 mov r0, r4
  33821. 802c7ca: f7ff fc05 bl 802bfd8 <dhcp_delete_msg>
  33822. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_decline: BACKING OFF\n"));
  33823. } else {
  33824. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  33825. ("dhcp_decline: could not allocate DHCP request\n"));
  33826. }
  33827. dhcp->tries++;
  33828. 802c7ce: 7b63 ldrb r3, [r4, #13]
  33829. 802c7d0: 3301 adds r3, #1
  33830. 802c7d2: 7363 strb r3, [r4, #13]
  33831. msecs = 10*1000;
  33832. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  33833. 802c7d4: 2314 movs r3, #20
  33834. 802c7d6: 8363 strh r3, [r4, #26]
  33835. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
  33836. ("dhcp_arp_reply(): arp reply matched with offered address, declining\n"));
  33837. dhcp_decline(netif);
  33838. }
  33839. }
  33840. }
  33841. 802c7d8: bd3e pop {r1, r2, r3, r4, r5, pc}
  33842. 802c7da: bf00 nop
  33843. 802c7dc: 0803fe84 .word 0x0803fe84
  33844. 0802c7e0 <dhcp_renew>:
  33845. *
  33846. * @param netif network interface which must renew its lease
  33847. */
  33848. err_t
  33849. dhcp_renew(struct netif *netif)
  33850. {
  33851. 802c7e0: b573 push {r0, r1, r4, r5, r6, lr}
  33852. struct dhcp *dhcp = netif->dhcp;
  33853. 802c7e2: 6a04 ldr r4, [r0, #32]
  33854. *
  33855. * @param netif network interface which must renew its lease
  33856. */
  33857. err_t
  33858. dhcp_renew(struct netif *netif)
  33859. {
  33860. 802c7e4: 4605 mov r5, r0
  33861. struct dhcp *dhcp = netif->dhcp;
  33862. err_t result;
  33863. u16_t msecs;
  33864. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n"));
  33865. dhcp_set_state(dhcp, DHCP_RENEWING);
  33866. 802c7e6: 2105 movs r1, #5
  33867. 802c7e8: 4620 mov r0, r4
  33868. 802c7ea: f7ff faf1 bl 802bdd0 <dhcp_set_state>
  33869. /* create and initialize the DHCP message header */
  33870. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  33871. 802c7ee: 4628 mov r0, r5
  33872. 802c7f0: 4621 mov r1, r4
  33873. 802c7f2: 2203 movs r2, #3
  33874. 802c7f4: f7ff fb50 bl 802be98 <dhcp_create_msg>
  33875. if (result == ERR_OK) {
  33876. 802c7f8: 4606 mov r6, r0
  33877. 802c7fa: b9e0 cbnz r0, 802c836 <dhcp_renew+0x56>
  33878. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  33879. 802c7fc: 2202 movs r2, #2
  33880. 802c7fe: 4620 mov r0, r4
  33881. 802c800: 2139 movs r1, #57 ; 0x39
  33882. 802c802: f7ff faed bl 802bde0 <dhcp_option>
  33883. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  33884. 802c806: 8ca9 ldrh r1, [r5, #36] ; 0x24
  33885. 802c808: 4620 mov r0, r4
  33886. 802c80a: f7ff fb00 bl 802be0e <dhcp_option_short>
  33887. #if LWIP_NETIF_HOSTNAME
  33888. dhcp_option_hostname(dhcp, netif);
  33889. #endif /* LWIP_NETIF_HOSTNAME */
  33890. /* append DHCP message trailer */
  33891. dhcp_option_trailer(dhcp);
  33892. 802c80e: 4620 mov r0, r4
  33893. 802c810: f7ff fb2d bl 802be6e <dhcp_option_trailer>
  33894. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  33895. 802c814: 8b21 ldrh r1, [r4, #24]
  33896. 802c816: 6920 ldr r0, [r4, #16]
  33897. 802c818: 31f0 adds r1, #240 ; 0xf0
  33898. 802c81a: b289 uxth r1, r1
  33899. 802c81c: f000 fc2f bl 802d07e <pbuf_realloc>
  33900. udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif);
  33901. 802c820: 9500 str r5, [sp, #0]
  33902. 802c822: 6860 ldr r0, [r4, #4]
  33903. 802c824: 6921 ldr r1, [r4, #16]
  33904. 802c826: f104 0220 add.w r2, r4, #32
  33905. 802c82a: 2343 movs r3, #67 ; 0x43
  33906. 802c82c: f003 f8a0 bl 802f970 <udp_sendto_if>
  33907. dhcp_delete_msg(dhcp);
  33908. 802c830: 4620 mov r0, r4
  33909. 802c832: f7ff fbd1 bl 802bfd8 <dhcp_delete_msg>
  33910. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n"));
  33911. } else {
  33912. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n"));
  33913. }
  33914. dhcp->tries++;
  33915. 802c836: 7b63 ldrb r3, [r4, #13]
  33916. 802c838: 3301 adds r3, #1
  33917. 802c83a: b2db uxtb r3, r3
  33918. /* back-off on retries, but to a maximum of 20 seconds */
  33919. msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000;
  33920. 802c83c: 2b09 cmp r3, #9
  33921. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n"));
  33922. } else {
  33923. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n"));
  33924. }
  33925. dhcp->tries++;
  33926. 802c83e: 7363 strb r3, [r4, #13]
  33927. /* back-off on retries, but to a maximum of 20 seconds */
  33928. msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000;
  33929. 802c840: d804 bhi.n 802c84c <dhcp_renew+0x6c>
  33930. 802c842: f44f 62fa mov.w r2, #2000 ; 0x7d0
  33931. 802c846: 4353 muls r3, r2
  33932. 802c848: b29b uxth r3, r3
  33933. 802c84a: e001 b.n 802c850 <dhcp_renew+0x70>
  33934. 802c84c: f644 6320 movw r3, #20000 ; 0x4e20
  33935. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  33936. 802c850: f44f 72fa mov.w r2, #500 ; 0x1f4
  33937. 802c854: f203 13f3 addw r3, r3, #499 ; 0x1f3
  33938. 802c858: fb93 f3f2 sdiv r3, r3, r2
  33939. 802c85c: 8363 strh r3, [r4, #26]
  33940. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs));
  33941. return result;
  33942. }
  33943. 802c85e: 4630 mov r0, r6
  33944. 802c860: bd7c pop {r2, r3, r4, r5, r6, pc}
  33945. 802c862: 0000 movs r0, r0
  33946. 0802c864 <dhcp_coarse_tmr>:
  33947. /**
  33948. * The DHCP timer that checks for lease renewal/rebind timeouts.
  33949. */
  33950. void
  33951. dhcp_coarse_tmr()
  33952. {
  33953. 802c864: b538 push {r3, r4, r5, lr}
  33954. struct netif *netif = netif_list;
  33955. 802c866: 4b15 ldr r3, [pc, #84] ; (802c8bc <dhcp_coarse_tmr+0x58>)
  33956. 802c868: 4d15 ldr r5, [pc, #84] ; (802c8c0 <dhcp_coarse_tmr+0x5c>)
  33957. 802c86a: 681c ldr r4, [r3, #0]
  33958. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n"));
  33959. /* iterate through all network interfaces */
  33960. while (netif != NULL) {
  33961. 802c86c: e023 b.n 802c8b6 <dhcp_coarse_tmr+0x52>
  33962. /* only act on DHCP configured interfaces */
  33963. if (netif->dhcp != NULL) {
  33964. 802c86e: 6a23 ldr r3, [r4, #32]
  33965. 802c870: b303 cbz r3, 802c8b4 <dhcp_coarse_tmr+0x50>
  33966. /* timer is active (non zero), and triggers (zeroes) now? */
  33967. if (netif->dhcp->t2_timeout-- == 1) {
  33968. 802c872: 8bda ldrh r2, [r3, #30]
  33969. 802c874: 1e51 subs r1, r2, #1
  33970. 802c876: 2a01 cmp r2, #1
  33971. 802c878: 83d9 strh r1, [r3, #30]
  33972. 802c87a: d10b bne.n 802c894 <dhcp_coarse_tmr+0x30>
  33973. 802c87c: 7b1a ldrb r2, [r3, #12]
  33974. 802c87e: 2a0a cmp r2, #10
  33975. 802c880: d818 bhi.n 802c8b4 <dhcp_coarse_tmr+0x50>
  33976. 802c882: f993 300c ldrsb.w r3, [r3, #12]
  33977. 802c886: fa15 f303 lsls.w r3, r5, r3
  33978. 802c88a: d513 bpl.n 802c8b4 <dhcp_coarse_tmr+0x50>
  33979. /* just retry to rebind */
  33980. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  33981. ("dhcp_t2_timeout(): must rebind\n"));
  33982. /* This slightly different to RFC2131: DHCPREQUEST will be sent from state
  33983. DHCP_REBINDING, not DHCP_BOUND */
  33984. dhcp_rebind(netif);
  33985. 802c88c: 4620 mov r0, r4
  33986. 802c88e: f7ff fc0b bl 802c0a8 <dhcp_rebind>
  33987. 802c892: e00f b.n 802c8b4 <dhcp_coarse_tmr+0x50>
  33988. if (netif->dhcp->t2_timeout-- == 1) {
  33989. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t2 timeout\n"));
  33990. /* this clients' rebind timeout triggered */
  33991. dhcp_t2_timeout(netif);
  33992. /* timer is active (non zero), and triggers (zeroes) now */
  33993. } else if (netif->dhcp->t1_timeout-- == 1) {
  33994. 802c894: 8b9a ldrh r2, [r3, #28]
  33995. 802c896: 1e51 subs r1, r2, #1
  33996. 802c898: 2a01 cmp r2, #1
  33997. 802c89a: 8399 strh r1, [r3, #28]
  33998. 802c89c: d10a bne.n 802c8b4 <dhcp_coarse_tmr+0x50>
  33999. 802c89e: 7b1a ldrb r2, [r3, #12]
  34000. 802c8a0: 2a0a cmp r2, #10
  34001. 802c8a2: d807 bhi.n 802c8b4 <dhcp_coarse_tmr+0x50>
  34002. 802c8a4: f993 300c ldrsb.w r3, [r3, #12]
  34003. 802c8a8: fa15 f303 lsls.w r3, r5, r3
  34004. 802c8ac: d502 bpl.n 802c8b4 <dhcp_coarse_tmr+0x50>
  34005. * eventually time-out if renew tries fail. */
  34006. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  34007. ("dhcp_t1_timeout(): must renew\n"));
  34008. /* This slightly different to RFC2131: DHCPREQUEST will be sent from state
  34009. DHCP_RENEWING, not DHCP_BOUND */
  34010. dhcp_renew(netif);
  34011. 802c8ae: 4620 mov r0, r4
  34012. 802c8b0: f7ff ff96 bl 802c7e0 <dhcp_renew>
  34013. /* this clients' renewal timeout triggered */
  34014. dhcp_t1_timeout(netif);
  34015. }
  34016. }
  34017. /* proceed to next netif */
  34018. netif = netif->next;
  34019. 802c8b4: 6824 ldr r4, [r4, #0]
  34020. dhcp_coarse_tmr()
  34021. {
  34022. struct netif *netif = netif_list;
  34023. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n"));
  34024. /* iterate through all network interfaces */
  34025. while (netif != NULL) {
  34026. 802c8b6: 2c00 cmp r4, #0
  34027. 802c8b8: d1d9 bne.n 802c86e <dhcp_coarse_tmr+0xa>
  34028. }
  34029. }
  34030. /* proceed to next netif */
  34031. netif = netif->next;
  34032. }
  34033. }
  34034. 802c8ba: bd38 pop {r3, r4, r5, pc}
  34035. 802c8bc: 20010fd0 .word 0x20010fd0
  34036. 802c8c0: 44200000 .word 0x44200000
  34037. 0802c8c4 <dhcp_release>:
  34038. *
  34039. * @param netif network interface which must release its lease
  34040. */
  34041. err_t
  34042. dhcp_release(struct netif *netif)
  34043. {
  34044. 802c8c4: b573 push {r0, r1, r4, r5, r6, lr}
  34045. struct dhcp *dhcp = netif->dhcp;
  34046. 802c8c6: 6a04 ldr r4, [r0, #32]
  34047. *
  34048. * @param netif network interface which must release its lease
  34049. */
  34050. err_t
  34051. dhcp_release(struct netif *netif)
  34052. {
  34053. 802c8c8: 4605 mov r5, r0
  34054. err_t result;
  34055. u16_t msecs;
  34056. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release()\n"));
  34057. /* idle DHCP client */
  34058. dhcp_set_state(dhcp, DHCP_OFF);
  34059. 802c8ca: 2100 movs r1, #0
  34060. 802c8cc: 4620 mov r0, r4
  34061. 802c8ce: f7ff fa7f bl 802bdd0 <dhcp_set_state>
  34062. /* clean old DHCP offer */
  34063. ip_addr_set_zero(&dhcp->server_ip_addr);
  34064. 802c8d2: 2300 movs r3, #0
  34065. 802c8d4: 6223 str r3, [r4, #32]
  34066. ip_addr_set_zero(&dhcp->offered_ip_addr);
  34067. 802c8d6: 6263 str r3, [r4, #36] ; 0x24
  34068. ip_addr_set_zero(&dhcp->offered_sn_mask);
  34069. 802c8d8: 62a3 str r3, [r4, #40] ; 0x28
  34070. ip_addr_set_zero(&dhcp->offered_gw_addr);
  34071. 802c8da: 62e3 str r3, [r4, #44] ; 0x2c
  34072. #if LWIP_DHCP_BOOTP_FILE
  34073. ip_addr_set_zero(&dhcp->offered_si_addr);
  34074. #endif /* LWIP_DHCP_BOOTP_FILE */
  34075. dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0;
  34076. 802c8dc: 63a3 str r3, [r4, #56] ; 0x38
  34077. 802c8de: 6363 str r3, [r4, #52] ; 0x34
  34078. 802c8e0: 6323 str r3, [r4, #48] ; 0x30
  34079. /* create and initialize the DHCP message header */
  34080. result = dhcp_create_msg(netif, dhcp, DHCP_RELEASE);
  34081. 802c8e2: 4628 mov r0, r5
  34082. 802c8e4: 4621 mov r1, r4
  34083. 802c8e6: 2207 movs r2, #7
  34084. 802c8e8: f7ff fad6 bl 802be98 <dhcp_create_msg>
  34085. if (result == ERR_OK) {
  34086. 802c8ec: 4606 mov r6, r0
  34087. 802c8ee: b998 cbnz r0, 802c918 <dhcp_release+0x54>
  34088. dhcp_option_trailer(dhcp);
  34089. 802c8f0: 4620 mov r0, r4
  34090. 802c8f2: f7ff fabc bl 802be6e <dhcp_option_trailer>
  34091. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  34092. 802c8f6: 8b21 ldrh r1, [r4, #24]
  34093. 802c8f8: 6920 ldr r0, [r4, #16]
  34094. 802c8fa: 31f0 adds r1, #240 ; 0xf0
  34095. 802c8fc: b289 uxth r1, r1
  34096. 802c8fe: f000 fbbe bl 802d07e <pbuf_realloc>
  34097. udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif);
  34098. 802c902: 9500 str r5, [sp, #0]
  34099. 802c904: 6860 ldr r0, [r4, #4]
  34100. 802c906: 6921 ldr r1, [r4, #16]
  34101. 802c908: f104 0220 add.w r2, r4, #32
  34102. 802c90c: 2343 movs r3, #67 ; 0x43
  34103. 802c90e: f003 f82f bl 802f970 <udp_sendto_if>
  34104. dhcp_delete_msg(dhcp);
  34105. 802c912: 4620 mov r0, r4
  34106. 802c914: f7ff fb60 bl 802bfd8 <dhcp_delete_msg>
  34107. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_OFF\n"));
  34108. } else {
  34109. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n"));
  34110. }
  34111. dhcp->tries++;
  34112. 802c918: 7b63 ldrb r3, [r4, #13]
  34113. 802c91a: 3301 adds r3, #1
  34114. 802c91c: b2db uxtb r3, r3
  34115. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  34116. 802c91e: 2b09 cmp r3, #9
  34117. dhcp_delete_msg(dhcp);
  34118. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_OFF\n"));
  34119. } else {
  34120. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n"));
  34121. }
  34122. dhcp->tries++;
  34123. 802c920: 7363 strb r3, [r4, #13]
  34124. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  34125. 802c922: d804 bhi.n 802c92e <dhcp_release+0x6a>
  34126. 802c924: f44f 727a mov.w r2, #1000 ; 0x3e8
  34127. 802c928: 4353 muls r3, r2
  34128. 802c92a: b29b uxth r3, r3
  34129. 802c92c: e001 b.n 802c932 <dhcp_release+0x6e>
  34130. 802c92e: f242 7310 movw r3, #10000 ; 0x2710
  34131. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  34132. 802c932: f44f 72fa mov.w r2, #500 ; 0x1f4
  34133. 802c936: f203 13f3 addw r3, r3, #499 ; 0x1f3
  34134. 802c93a: fb93 f3f2 sdiv r3, r3, r2
  34135. 802c93e: 8363 strh r3, [r4, #26]
  34136. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release(): set request timeout %"U16_F" msecs\n", msecs));
  34137. /* bring the interface down */
  34138. netif_set_down(netif);
  34139. 802c940: 4628 mov r0, r5
  34140. 802c942: f000 fb31 bl 802cfa8 <netif_set_down>
  34141. /* remove IP address from interface */
  34142. netif_set_ipaddr(netif, IP_ADDR_ANY);
  34143. 802c946: 4628 mov r0, r5
  34144. 802c948: 4906 ldr r1, [pc, #24] ; (802c964 <dhcp_release+0xa0>)
  34145. 802c94a: f000 fa7d bl 802ce48 <netif_set_ipaddr>
  34146. netif_set_gw(netif, IP_ADDR_ANY);
  34147. 802c94e: 4628 mov r0, r5
  34148. 802c950: 4904 ldr r1, [pc, #16] ; (802c964 <dhcp_release+0xa0>)
  34149. 802c952: f000 fab5 bl 802cec0 <netif_set_gw>
  34150. netif_set_netmask(netif, IP_ADDR_ANY);
  34151. 802c956: 4628 mov r0, r5
  34152. 802c958: 4902 ldr r1, [pc, #8] ; (802c964 <dhcp_release+0xa0>)
  34153. 802c95a: f000 fab5 bl 802cec8 <netif_set_netmask>
  34154. return result;
  34155. }
  34156. 802c95e: 4630 mov r0, r6
  34157. 802c960: bd7c pop {r2, r3, r4, r5, r6, pc}
  34158. 802c962: bf00 nop
  34159. 802c964: 0803fe88 .word 0x0803fe88
  34160. 0802c968 <dhcp_fine_tmr>:
  34161. * A DHCP server is expected to respond within a short period of time.
  34162. * This timer checks whether an outstanding DHCP request is timed out.
  34163. */
  34164. void
  34165. dhcp_fine_tmr()
  34166. {
  34167. 802c968: b538 push {r3, r4, r5, lr}
  34168. struct netif *netif = netif_list;
  34169. 802c96a: 4b26 ldr r3, [pc, #152] ; (802ca04 <dhcp_fine_tmr+0x9c>)
  34170. /* timer is active (non zero), and is about to trigger now */
  34171. if (netif->dhcp->request_timeout > 1) {
  34172. netif->dhcp->request_timeout--;
  34173. }
  34174. else if (netif->dhcp->request_timeout == 1) {
  34175. netif->dhcp->request_timeout--;
  34176. 802c96c: 2500 movs r5, #0
  34177. * This timer checks whether an outstanding DHCP request is timed out.
  34178. */
  34179. void
  34180. dhcp_fine_tmr()
  34181. {
  34182. struct netif *netif = netif_list;
  34183. 802c96e: 681c ldr r4, [r3, #0]
  34184. /* loop through netif's */
  34185. while (netif != NULL) {
  34186. 802c970: e044 b.n 802c9fc <dhcp_fine_tmr+0x94>
  34187. /* only act on DHCP configured interfaces */
  34188. if (netif->dhcp != NULL) {
  34189. 802c972: 6a23 ldr r3, [r4, #32]
  34190. 802c974: 2b00 cmp r3, #0
  34191. 802c976: d040 beq.n 802c9fa <dhcp_fine_tmr+0x92>
  34192. /* timer is active (non zero), and is about to trigger now */
  34193. if (netif->dhcp->request_timeout > 1) {
  34194. 802c978: 8b5a ldrh r2, [r3, #26]
  34195. 802c97a: 2a01 cmp r2, #1
  34196. 802c97c: d902 bls.n 802c984 <dhcp_fine_tmr+0x1c>
  34197. netif->dhcp->request_timeout--;
  34198. 802c97e: 3a01 subs r2, #1
  34199. 802c980: 835a strh r2, [r3, #26]
  34200. 802c982: e03a b.n 802c9fa <dhcp_fine_tmr+0x92>
  34201. }
  34202. else if (netif->dhcp->request_timeout == 1) {
  34203. 802c984: d139 bne.n 802c9fa <dhcp_fine_tmr+0x92>
  34204. dhcp_timeout(struct netif *netif)
  34205. {
  34206. struct dhcp *dhcp = netif->dhcp;
  34207. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n"));
  34208. /* back-off period has passed, or server selection timed out */
  34209. if ((dhcp->state == DHCP_BACKING_OFF) || (dhcp->state == DHCP_SELECTING)) {
  34210. 802c986: 7b1a ldrb r2, [r3, #12]
  34211. /* timer is active (non zero), and is about to trigger now */
  34212. if (netif->dhcp->request_timeout > 1) {
  34213. netif->dhcp->request_timeout--;
  34214. }
  34215. else if (netif->dhcp->request_timeout == 1) {
  34216. netif->dhcp->request_timeout--;
  34217. 802c988: 835d strh r5, [r3, #26]
  34218. dhcp_timeout(struct netif *netif)
  34219. {
  34220. struct dhcp *dhcp = netif->dhcp;
  34221. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n"));
  34222. /* back-off period has passed, or server selection timed out */
  34223. if ((dhcp->state == DHCP_BACKING_OFF) || (dhcp->state == DHCP_SELECTING)) {
  34224. 802c98a: 2a0c cmp r2, #12
  34225. 802c98c: d028 beq.n 802c9e0 <dhcp_fine_tmr+0x78>
  34226. 802c98e: 2a06 cmp r2, #6
  34227. 802c990: d100 bne.n 802c994 <dhcp_fine_tmr+0x2c>
  34228. 802c992: e025 b.n 802c9e0 <dhcp_fine_tmr+0x78>
  34229. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n"));
  34230. dhcp_discover(netif);
  34231. /* receiving the requested lease timed out */
  34232. } else if (dhcp->state == DHCP_REQUESTING) {
  34233. 802c994: 2a01 cmp r2, #1
  34234. 802c996: d106 bne.n 802c9a6 <dhcp_fine_tmr+0x3e>
  34235. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n"));
  34236. if (dhcp->tries <= 5) {
  34237. 802c998: 7b5b ldrb r3, [r3, #13]
  34238. 802c99a: 2b05 cmp r3, #5
  34239. dhcp_select(netif);
  34240. 802c99c: 4620 mov r0, r4
  34241. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n"));
  34242. dhcp_discover(netif);
  34243. /* receiving the requested lease timed out */
  34244. } else if (dhcp->state == DHCP_REQUESTING) {
  34245. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n"));
  34246. if (dhcp->tries <= 5) {
  34247. 802c99e: d81d bhi.n 802c9dc <dhcp_fine_tmr+0x74>
  34248. dhcp_select(netif);
  34249. 802c9a0: f7ff fc14 bl 802c1cc <dhcp_select>
  34250. 802c9a4: e029 b.n 802c9fa <dhcp_fine_tmr+0x92>
  34251. dhcp_release(netif);
  34252. dhcp_discover(netif);
  34253. }
  34254. #if DHCP_DOES_ARP_CHECK
  34255. /* received no ARP reply for the offered address (which is good) */
  34256. } else if (dhcp->state == DHCP_CHECKING) {
  34257. 802c9a6: 2a08 cmp r2, #8
  34258. 802c9a8: d109 bne.n 802c9be <dhcp_fine_tmr+0x56>
  34259. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n"));
  34260. if (dhcp->tries <= 1) {
  34261. 802c9aa: 7b5b ldrb r3, [r3, #13]
  34262. 802c9ac: 2b01 cmp r3, #1
  34263. dhcp_check(netif);
  34264. 802c9ae: 4620 mov r0, r4
  34265. }
  34266. #if DHCP_DOES_ARP_CHECK
  34267. /* received no ARP reply for the offered address (which is good) */
  34268. } else if (dhcp->state == DHCP_CHECKING) {
  34269. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n"));
  34270. if (dhcp->tries <= 1) {
  34271. 802c9b0: d802 bhi.n 802c9b8 <dhcp_fine_tmr+0x50>
  34272. dhcp_check(netif);
  34273. 802c9b2: f7ff fc7d bl 802c2b0 <dhcp_check>
  34274. 802c9b6: e020 b.n 802c9fa <dhcp_fine_tmr+0x92>
  34275. /* no ARP replies on the offered address,
  34276. looks like the IP address is indeed free */
  34277. } else {
  34278. /* bind the interface to the offered address */
  34279. dhcp_bind(netif);
  34280. 802c9b8: f7ff fc8d bl 802c2d6 <dhcp_bind>
  34281. 802c9bc: e01d b.n 802c9fa <dhcp_fine_tmr+0x92>
  34282. }
  34283. #endif /* DHCP_DOES_ARP_CHECK */
  34284. }
  34285. /* did not get response to renew request? */
  34286. else if (dhcp->state == DHCP_RENEWING) {
  34287. 802c9be: 2a05 cmp r2, #5
  34288. 802c9c0: d103 bne.n 802c9ca <dhcp_fine_tmr+0x62>
  34289. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RENEWING, DHCP request timed out\n"));
  34290. /* just retry renewal */
  34291. /* note that the rebind timer will eventually time-out if renew does not work */
  34292. dhcp_renew(netif);
  34293. 802c9c2: 4620 mov r0, r4
  34294. 802c9c4: f7ff ff0c bl 802c7e0 <dhcp_renew>
  34295. 802c9c8: e017 b.n 802c9fa <dhcp_fine_tmr+0x92>
  34296. /* did not get response to rebind request? */
  34297. } else if (dhcp->state == DHCP_REBINDING) {
  34298. 802c9ca: 2a04 cmp r2, #4
  34299. 802c9cc: d10a bne.n 802c9e4 <dhcp_fine_tmr+0x7c>
  34300. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n"));
  34301. if (dhcp->tries <= 8) {
  34302. 802c9ce: 7b5b ldrb r3, [r3, #13]
  34303. 802c9d0: 2b08 cmp r3, #8
  34304. dhcp_rebind(netif);
  34305. 802c9d2: 4620 mov r0, r4
  34306. /* note that the rebind timer will eventually time-out if renew does not work */
  34307. dhcp_renew(netif);
  34308. /* did not get response to rebind request? */
  34309. } else if (dhcp->state == DHCP_REBINDING) {
  34310. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n"));
  34311. if (dhcp->tries <= 8) {
  34312. 802c9d4: d802 bhi.n 802c9dc <dhcp_fine_tmr+0x74>
  34313. dhcp_rebind(netif);
  34314. 802c9d6: f7ff fb67 bl 802c0a8 <dhcp_rebind>
  34315. 802c9da: e00e b.n 802c9fa <dhcp_fine_tmr+0x92>
  34316. } else {
  34317. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n"));
  34318. dhcp_release(netif);
  34319. 802c9dc: f7ff ff72 bl 802c8c4 <dhcp_release>
  34320. dhcp_discover(netif);
  34321. 802c9e0: 4620 mov r0, r4
  34322. 802c9e2: e008 b.n 802c9f6 <dhcp_fine_tmr+0x8e>
  34323. }
  34324. } else if (dhcp->state == DHCP_REBOOTING) {
  34325. 802c9e4: 2a03 cmp r2, #3
  34326. 802c9e6: d108 bne.n 802c9fa <dhcp_fine_tmr+0x92>
  34327. if (dhcp->tries < REBOOT_TRIES) {
  34328. 802c9e8: 7b5b ldrb r3, [r3, #13]
  34329. 802c9ea: 2b01 cmp r3, #1
  34330. dhcp_reboot(netif);
  34331. 802c9ec: 4620 mov r0, r4
  34332. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n"));
  34333. dhcp_release(netif);
  34334. dhcp_discover(netif);
  34335. }
  34336. } else if (dhcp->state == DHCP_REBOOTING) {
  34337. if (dhcp->tries < REBOOT_TRIES) {
  34338. 802c9ee: d802 bhi.n 802c9f6 <dhcp_fine_tmr+0x8e>
  34339. dhcp_reboot(netif);
  34340. 802c9f0: f7ff fb9c bl 802c12c <dhcp_reboot>
  34341. 802c9f4: e001 b.n 802c9fa <dhcp_fine_tmr+0x92>
  34342. } else {
  34343. dhcp_discover(netif);
  34344. 802c9f6: f7ff fafb bl 802bff0 <dhcp_discover>
  34345. /* this client's request timeout triggered */
  34346. dhcp_timeout(netif);
  34347. }
  34348. }
  34349. /* proceed to next network interface */
  34350. netif = netif->next;
  34351. 802c9fa: 6824 ldr r4, [r4, #0]
  34352. void
  34353. dhcp_fine_tmr()
  34354. {
  34355. struct netif *netif = netif_list;
  34356. /* loop through netif's */
  34357. while (netif != NULL) {
  34358. 802c9fc: 2c00 cmp r4, #0
  34359. 802c9fe: d1b8 bne.n 802c972 <dhcp_fine_tmr+0xa>
  34360. }
  34361. }
  34362. /* proceed to next network interface */
  34363. netif = netif->next;
  34364. }
  34365. }
  34366. 802ca00: bd38 pop {r3, r4, r5, pc}
  34367. 802ca02: bf00 nop
  34368. 802ca04: 20010fd0 .word 0x20010fd0
  34369. 0802ca08 <dhcp_stop>:
  34370. *
  34371. * @param netif The network interface to stop DHCP on
  34372. */
  34373. void
  34374. dhcp_stop(struct netif *netif)
  34375. {
  34376. 802ca08: b510 push {r4, lr}
  34377. struct dhcp *dhcp;
  34378. LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;);
  34379. 802ca0a: b198 cbz r0, 802ca34 <dhcp_stop+0x2c>
  34380. dhcp = netif->dhcp;
  34381. /* Remove the flag that says this netif is handled by DHCP. */
  34382. netif->flags &= ~NETIF_FLAG_DHCP;
  34383. 802ca0c: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  34384. void
  34385. dhcp_stop(struct netif *netif)
  34386. {
  34387. struct dhcp *dhcp;
  34388. LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;);
  34389. dhcp = netif->dhcp;
  34390. 802ca10: 6a04 ldr r4, [r0, #32]
  34391. /* Remove the flag that says this netif is handled by DHCP. */
  34392. netif->flags &= ~NETIF_FLAG_DHCP;
  34393. 802ca12: f023 0308 bic.w r3, r3, #8
  34394. 802ca16: f880 302d strb.w r3, [r0, #45] ; 0x2d
  34395. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_stop()\n"));
  34396. /* netif is DHCP configured? */
  34397. if (dhcp != NULL) {
  34398. 802ca1a: b15c cbz r4, 802ca34 <dhcp_stop+0x2c>
  34399. autoip_stop(netif);
  34400. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;
  34401. }
  34402. #endif /* LWIP_DHCP_AUTOIP_COOP */
  34403. if (dhcp->pcb != NULL) {
  34404. 802ca1c: 6860 ldr r0, [r4, #4]
  34405. 802ca1e: b118 cbz r0, 802ca28 <dhcp_stop+0x20>
  34406. udp_remove(dhcp->pcb);
  34407. 802ca20: f003 f852 bl 802fac8 <udp_remove>
  34408. dhcp->pcb = NULL;
  34409. 802ca24: 2300 movs r3, #0
  34410. 802ca26: 6063 str r3, [r4, #4]
  34411. }
  34412. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  34413. dhcp_set_state(dhcp, DHCP_OFF);
  34414. 802ca28: 4620 mov r0, r4
  34415. 802ca2a: 2100 movs r1, #0
  34416. }
  34417. }
  34418. 802ca2c: e8bd 4010 ldmia.w sp!, {r4, lr}
  34419. if (dhcp->pcb != NULL) {
  34420. udp_remove(dhcp->pcb);
  34421. dhcp->pcb = NULL;
  34422. }
  34423. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  34424. dhcp_set_state(dhcp, DHCP_OFF);
  34425. 802ca30: f7ff b9ce b.w 802bdd0 <dhcp_set_state>
  34426. 802ca34: bd10 pop {r4, pc}
  34427. 802ca36: 0000 movs r0, r0
  34428. 0802ca38 <dhcp_start>:
  34429. * - ERR_OK - No error
  34430. * - ERR_MEM - Out of memory
  34431. */
  34432. err_t
  34433. dhcp_start(struct netif *netif)
  34434. {
  34435. 802ca38: b538 push {r3, r4, r5, lr}
  34436. struct dhcp *dhcp;
  34437. err_t result = ERR_OK;
  34438. LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
  34439. 802ca3a: 4604 mov r4, r0
  34440. 802ca3c: b908 cbnz r0, 802ca42 <dhcp_start+0xa>
  34441. 802ca3e: 20f2 movs r0, #242 ; 0xf2
  34442. 802ca40: e047 b.n 802cad2 <dhcp_start+0x9a>
  34443. dhcp = netif->dhcp;
  34444. 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));
  34445. /* Remove the flag that says this netif is handled by DHCP,
  34446. it is set when we succeeded starting. */
  34447. netif->flags &= ~NETIF_FLAG_DHCP;
  34448. 802ca42: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  34449. {
  34450. struct dhcp *dhcp;
  34451. err_t result = ERR_OK;
  34452. LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
  34453. dhcp = netif->dhcp;
  34454. 802ca46: 6a05 ldr r5, [r0, #32]
  34455. 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));
  34456. /* Remove the flag that says this netif is handled by DHCP,
  34457. it is set when we succeeded starting. */
  34458. netif->flags &= ~NETIF_FLAG_DHCP;
  34459. 802ca48: f023 0208 bic.w r2, r3, #8
  34460. /* check hwtype of the netif */
  34461. if ((netif->flags & NETIF_FLAG_ETHARP) == 0) {
  34462. 802ca4c: f003 0320 and.w r3, r3, #32
  34463. 802ca50: b2db uxtb r3, r3
  34464. LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
  34465. dhcp = netif->dhcp;
  34466. 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));
  34467. /* Remove the flag that says this netif is handled by DHCP,
  34468. it is set when we succeeded starting. */
  34469. netif->flags &= ~NETIF_FLAG_DHCP;
  34470. 802ca52: f880 202d strb.w r2, [r0, #45] ; 0x2d
  34471. /* check hwtype of the netif */
  34472. if ((netif->flags & NETIF_FLAG_ETHARP) == 0) {
  34473. 802ca56: 2b00 cmp r3, #0
  34474. 802ca58: d0f1 beq.n 802ca3e <dhcp_start+0x6>
  34475. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): No ETHARP netif\n"));
  34476. return ERR_ARG;
  34477. }
  34478. /* check MTU of the netif */
  34479. if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) {
  34480. 802ca5a: 8c83 ldrh r3, [r0, #36] ; 0x24
  34481. 802ca5c: f5b3 7f10 cmp.w r3, #576 ; 0x240
  34482. 802ca60: d200 bcs.n 802ca64 <dhcp_start+0x2c>
  34483. 802ca62: e02e b.n 802cac2 <dhcp_start+0x8a>
  34484. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): Cannot use this netif with DHCP: MTU is too small\n"));
  34485. return ERR_MEM;
  34486. }
  34487. /* no DHCP client attached yet? */
  34488. if (dhcp == NULL) {
  34489. 802ca64: b935 cbnz r5, 802ca74 <dhcp_start+0x3c>
  34490. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting new DHCP client\n"));
  34491. dhcp = (struct dhcp *)mem_malloc(sizeof(struct dhcp));
  34492. 802ca66: 203c movs r0, #60 ; 0x3c
  34493. 802ca68: f000 f938 bl 802ccdc <mem_malloc>
  34494. if (dhcp == NULL) {
  34495. 802ca6c: 4605 mov r5, r0
  34496. 802ca6e: b340 cbz r0, 802cac2 <dhcp_start+0x8a>
  34497. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not allocate dhcp\n"));
  34498. return ERR_MEM;
  34499. }
  34500. /* store this dhcp client in the netif */
  34501. netif->dhcp = dhcp;
  34502. 802ca70: 6220 str r0, [r4, #32]
  34503. 802ca72: e003 b.n 802ca7c <dhcp_start+0x44>
  34504. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp"));
  34505. /* already has DHCP client attached */
  34506. } else {
  34507. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(): restarting DHCP configuration\n"));
  34508. if (dhcp->pcb != NULL) {
  34509. 802ca74: 6868 ldr r0, [r5, #4]
  34510. 802ca76: b108 cbz r0, 802ca7c <dhcp_start+0x44>
  34511. udp_remove(dhcp->pcb);
  34512. 802ca78: f003 f826 bl 802fac8 <udp_remove>
  34513. LWIP_ASSERT("pbuf p_out wasn't freed", dhcp->p_out == NULL);
  34514. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL );
  34515. }
  34516. /* clear data structure */
  34517. memset(dhcp, 0, sizeof(struct dhcp));
  34518. 802ca7c: 2100 movs r1, #0
  34519. 802ca7e: 223c movs r2, #60 ; 0x3c
  34520. 802ca80: 4628 mov r0, r5
  34521. 802ca82: f7f5 f81d bl 8021ac0 <memset>
  34522. /* dhcp_set_state(&dhcp, DHCP_OFF); */
  34523. /* allocate UDP PCB */
  34524. dhcp->pcb = udp_new();
  34525. 802ca86: f003 f83b bl 802fb00 <udp_new>
  34526. 802ca8a: 6068 str r0, [r5, #4]
  34527. if (dhcp->pcb == NULL) {
  34528. 802ca8c: b1c8 cbz r0, 802cac2 <dhcp_start+0x8a>
  34529. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not obtain pcb\n"));
  34530. return ERR_MEM;
  34531. }
  34532. ip_set_option(dhcp->pcb, SOF_BROADCAST);
  34533. 802ca8e: 7a03 ldrb r3, [r0, #8]
  34534. /* set up local and remote port for the pcb */
  34535. udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
  34536. 802ca90: 4911 ldr r1, [pc, #68] ; (802cad8 <dhcp_start+0xa0>)
  34537. dhcp->pcb = udp_new();
  34538. if (dhcp->pcb == NULL) {
  34539. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not obtain pcb\n"));
  34540. return ERR_MEM;
  34541. }
  34542. ip_set_option(dhcp->pcb, SOF_BROADCAST);
  34543. 802ca92: f043 0320 orr.w r3, r3, #32
  34544. 802ca96: 7203 strb r3, [r0, #8]
  34545. /* set up local and remote port for the pcb */
  34546. udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
  34547. 802ca98: 2244 movs r2, #68 ; 0x44
  34548. 802ca9a: 6868 ldr r0, [r5, #4]
  34549. 802ca9c: f002 ff18 bl 802f8d0 <udp_bind>
  34550. udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
  34551. 802caa0: 490d ldr r1, [pc, #52] ; (802cad8 <dhcp_start+0xa0>)
  34552. 802caa2: 6868 ldr r0, [r5, #4]
  34553. 802caa4: 2243 movs r2, #67 ; 0x43
  34554. 802caa6: f002 ffdd bl 802fa64 <udp_connect>
  34555. /* set up the recv callback and argument */
  34556. udp_recv(dhcp->pcb, dhcp_recv, netif);
  34557. 802caaa: 6868 ldr r0, [r5, #4]
  34558. 802caac: 490b ldr r1, [pc, #44] ; (802cadc <dhcp_start+0xa4>)
  34559. 802caae: 4622 mov r2, r4
  34560. 802cab0: f003 f806 bl 802fac0 <udp_recv>
  34561. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting DHCP configuration\n"));
  34562. /* (re)start the DHCP negotiation */
  34563. result = dhcp_discover(netif);
  34564. 802cab4: 4620 mov r0, r4
  34565. 802cab6: f7ff fa9b bl 802bff0 <dhcp_discover>
  34566. if (result != ERR_OK) {
  34567. 802caba: b120 cbz r0, 802cac6 <dhcp_start+0x8e>
  34568. /* free resources allocated above */
  34569. dhcp_stop(netif);
  34570. 802cabc: 4620 mov r0, r4
  34571. 802cabe: f7ff ffa3 bl 802ca08 <dhcp_stop>
  34572. return ERR_MEM;
  34573. 802cac2: 20ff movs r0, #255 ; 0xff
  34574. 802cac4: e005 b.n 802cad2 <dhcp_start+0x9a>
  34575. }
  34576. /* Set the flag that says this netif is handled by DHCP. */
  34577. netif->flags |= NETIF_FLAG_DHCP;
  34578. 802cac6: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  34579. 802caca: f043 0308 orr.w r3, r3, #8
  34580. 802cace: f884 302d strb.w r3, [r4, #45] ; 0x2d
  34581. return result;
  34582. }
  34583. 802cad2: b240 sxtb r0, r0
  34584. 802cad4: bd38 pop {r3, r4, r5, pc}
  34585. 802cad6: bf00 nop
  34586. 802cad8: 0803fe88 .word 0x0803fe88
  34587. 802cadc: 0802c395 .word 0x0802c395
  34588. 0802cae0 <lwip_init>:
  34589. /**
  34590. * Perform Sanity check of user-configurable values, and initialize all modules.
  34591. */
  34592. void
  34593. lwip_init(void)
  34594. {
  34595. 802cae0: b508 push {r3, lr}
  34596. /* Modules initialization */
  34597. stats_init();
  34598. #if !NO_SYS
  34599. sys_init();
  34600. 802cae2: f007 ff0f bl 8034904 <sys_init>
  34601. #endif /* !NO_SYS */
  34602. mem_init();
  34603. 802cae6: f000 f80f bl 802cb08 <mem_init>
  34604. memp_init();
  34605. 802caea: f000 f95b bl 802cda4 <memp_init>
  34606. pbuf_init();
  34607. netif_init();
  34608. 802caee: f000 f9a9 bl 802ce44 <netif_init>
  34609. #endif /* LWIP_ARP */
  34610. #if LWIP_RAW
  34611. raw_init();
  34612. #endif /* LWIP_RAW */
  34613. #if LWIP_UDP
  34614. udp_init();
  34615. 802caf2: f002 fe27 bl 802f744 <udp_init>
  34616. #endif /* LWIP_UDP */
  34617. #if LWIP_TCP
  34618. tcp_init();
  34619. 802caf6: f000 fc8b bl 802d410 <tcp_init>
  34620. #endif /* LWIP_TCP */
  34621. #if LWIP_SNMP
  34622. snmp_init();
  34623. 802cafa: f005 fdc5 bl 8032688 <snmp_init>
  34624. #endif /* LWIP_DNS */
  34625. #if LWIP_TIMERS
  34626. sys_timeouts_init();
  34627. #endif /* LWIP_TIMERS */
  34628. }
  34629. 802cafe: e8bd 4008 ldmia.w sp!, {r3, lr}
  34630. #if LWIP_DNS
  34631. dns_init();
  34632. #endif /* LWIP_DNS */
  34633. #if LWIP_TIMERS
  34634. sys_timeouts_init();
  34635. 802cb02: f002 bd49 b.w 802f598 <sys_timeouts_init>
  34636. 802cb06: 0000 movs r0, r0
  34637. 0802cb08 <mem_init>:
  34638. LWIP_ASSERT("Sanity check alignment",
  34639. (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0);
  34640. /* align the heap */
  34641. ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
  34642. 802cb08: 4b0b ldr r3, [pc, #44] ; (802cb38 <mem_init+0x30>)
  34643. 802cb0a: 4a0c ldr r2, [pc, #48] ; (802cb3c <mem_init+0x34>)
  34644. mem = (struct mem *)(void *)ram;
  34645. mem->next = MEM_SIZE_ALIGNED;
  34646. mem->prev = 0;
  34647. mem->used = 0;
  34648. /* initialize the end of the heap */
  34649. ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
  34650. 802cb0c: 480c ldr r0, [pc, #48] ; (802cb40 <mem_init+0x38>)
  34651. LWIP_ASSERT("Sanity check alignment",
  34652. (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0);
  34653. /* align the heap */
  34654. ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
  34655. 802cb0e: f023 0303 bic.w r3, r3, #3
  34656. 802cb12: 6013 str r3, [r2, #0]
  34657. /* initialize the start of the heap */
  34658. mem = (struct mem *)(void *)ram;
  34659. mem->next = MEM_SIZE_ALIGNED;
  34660. 802cb14: f44f 51a0 mov.w r1, #5120 ; 0x1400
  34661. mem->prev = 0;
  34662. 802cb18: 2200 movs r2, #0
  34663. 802cb1a: 805a strh r2, [r3, #2]
  34664. mem->used = 0;
  34665. 802cb1c: 711a strb r2, [r3, #4]
  34666. /* initialize the end of the heap */
  34667. ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
  34668. 802cb1e: 185a adds r2, r3, r1
  34669. 802cb20: 6002 str r2, [r0, #0]
  34670. ram_end->used = 1;
  34671. 802cb22: 2001 movs r0, #1
  34672. 802cb24: 7110 strb r0, [r2, #4]
  34673. ram_end->next = MEM_SIZE_ALIGNED;
  34674. ram_end->prev = MEM_SIZE_ALIGNED;
  34675. 802cb26: 8051 strh r1, [r2, #2]
  34676. /* align the heap */
  34677. ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
  34678. /* initialize the start of the heap */
  34679. mem = (struct mem *)(void *)ram;
  34680. mem->next = MEM_SIZE_ALIGNED;
  34681. 802cb28: 8019 strh r1, [r3, #0]
  34682. /* initialize the lowest-free pointer to the start of the heap */
  34683. lfree = (struct mem *)(void *)ram;
  34684. MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
  34685. if(sys_mutex_new(&mem_mutex) != ERR_OK) {
  34686. 802cb2a: 4806 ldr r0, [pc, #24] ; (802cb44 <mem_init+0x3c>)
  34687. mem->prev = 0;
  34688. mem->used = 0;
  34689. /* initialize the end of the heap */
  34690. ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
  34691. ram_end->used = 1;
  34692. ram_end->next = MEM_SIZE_ALIGNED;
  34693. 802cb2c: 8011 strh r1, [r2, #0]
  34694. ram_end->prev = MEM_SIZE_ALIGNED;
  34695. /* initialize the lowest-free pointer to the start of the heap */
  34696. lfree = (struct mem *)(void *)ram;
  34697. 802cb2e: 4a06 ldr r2, [pc, #24] ; (802cb48 <mem_init+0x40>)
  34698. 802cb30: 6013 str r3, [r2, #0]
  34699. MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
  34700. if(sys_mutex_new(&mem_mutex) != ERR_OK) {
  34701. 802cb32: f007 bec9 b.w 80348c8 <sys_mutex_new>
  34702. 802cb36: bf00 nop
  34703. 802cb38: 2000fbbf .word 0x2000fbbf
  34704. 802cb3c: 20002a60 .word 0x20002a60
  34705. 802cb40: 20002a58 .word 0x20002a58
  34706. 802cb44: 20002a5c .word 0x20002a5c
  34707. 802cb48: 20002a54 .word 0x20002a54
  34708. 0802cb4c <mem_free>:
  34709. * @param rmem is the data portion of a struct mem as returned by a previous
  34710. * call to mem_malloc()
  34711. */
  34712. void
  34713. mem_free(void *rmem)
  34714. {
  34715. 802cb4c: b570 push {r4, r5, r6, lr}
  34716. struct mem *mem;
  34717. LWIP_MEM_FREE_DECL_PROTECT();
  34718. if (rmem == NULL) {
  34719. 802cb4e: 4604 mov r4, r0
  34720. 802cb50: 2800 cmp r0, #0
  34721. 802cb52: d04c beq.n 802cbee <mem_free+0xa2>
  34722. LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0);
  34723. LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
  34724. (u8_t *)rmem < (u8_t *)ram_end);
  34725. if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
  34726. 802cb54: 4b26 ldr r3, [pc, #152] ; (802cbf0 <mem_free+0xa4>)
  34727. 802cb56: 681b ldr r3, [r3, #0]
  34728. 802cb58: 4298 cmp r0, r3
  34729. 802cb5a: d303 bcc.n 802cb64 <mem_free+0x18>
  34730. 802cb5c: 4b25 ldr r3, [pc, #148] ; (802cbf4 <mem_free+0xa8>)
  34731. 802cb5e: 681b ldr r3, [r3, #0]
  34732. 802cb60: 4298 cmp r0, r3
  34733. 802cb62: d305 bcc.n 802cb70 <mem_free+0x24>
  34734. SYS_ARCH_DECL_PROTECT(lev);
  34735. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n"));
  34736. /* protect mem stats from concurrent access */
  34737. SYS_ARCH_PROTECT(lev);
  34738. 802cb64: f007 fee8 bl 8034938 <sys_arch_protect>
  34739. plug_holes(mem);
  34740. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  34741. mem_free_count = 1;
  34742. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  34743. LWIP_MEM_FREE_UNPROTECT();
  34744. }
  34745. 802cb68: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  34746. SYS_ARCH_DECL_PROTECT(lev);
  34747. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n"));
  34748. /* protect mem stats from concurrent access */
  34749. SYS_ARCH_PROTECT(lev);
  34750. MEM_STATS_INC(illegal);
  34751. SYS_ARCH_UNPROTECT(lev);
  34752. 802cb6c: f007 beee b.w 803494c <sys_arch_unprotect>
  34753. return;
  34754. }
  34755. /* protect the heap from concurrent access */
  34756. LWIP_MEM_FREE_PROTECT();
  34757. 802cb70: 4821 ldr r0, [pc, #132] ; (802cbf8 <mem_free+0xac>)
  34758. 802cb72: f007 feb5 bl 80348e0 <sys_mutex_lock>
  34759. /* Get the corresponding struct mem ... */
  34760. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  34761. /* ... which has to be in a used state ... */
  34762. LWIP_ASSERT("mem_free: mem->used", mem->used);
  34763. /* ... and is now unused. */
  34764. mem->used = 0;
  34765. 802cb76: 2300 movs r3, #0
  34766. 802cb78: f804 3c04 strb.w r3, [r4, #-4]
  34767. if (mem < lfree) {
  34768. 802cb7c: 4b1f ldr r3, [pc, #124] ; (802cbfc <mem_free+0xb0>)
  34769. LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0);
  34770. /* plug hole forward */
  34771. LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED);
  34772. nmem = (struct mem *)(void *)&ram[mem->next];
  34773. 802cb7e: f834 0c08 ldrh.w r0, [r4, #-8]
  34774. /* ... which has to be in a used state ... */
  34775. LWIP_ASSERT("mem_free: mem->used", mem->used);
  34776. /* ... and is now unused. */
  34777. mem->used = 0;
  34778. if (mem < lfree) {
  34779. 802cb82: 6819 ldr r1, [r3, #0]
  34780. return;
  34781. }
  34782. /* protect the heap from concurrent access */
  34783. LWIP_MEM_FREE_PROTECT();
  34784. /* Get the corresponding struct mem ... */
  34785. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  34786. 802cb84: f1a4 0208 sub.w r2, r4, #8
  34787. /* ... which has to be in a used state ... */
  34788. LWIP_ASSERT("mem_free: mem->used", mem->used);
  34789. /* ... and is now unused. */
  34790. mem->used = 0;
  34791. if (mem < lfree) {
  34792. 802cb88: 428a cmp r2, r1
  34793. /* the newly freed struct is now the lowest */
  34794. lfree = mem;
  34795. 802cb8a: bf38 it cc
  34796. 802cb8c: 601a strcc r2, [r3, #0]
  34797. LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0);
  34798. /* plug hole forward */
  34799. LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED);
  34800. nmem = (struct mem *)(void *)&ram[mem->next];
  34801. 802cb8e: 4b18 ldr r3, [pc, #96] ; (802cbf0 <mem_free+0xa4>)
  34802. 802cb90: 681b ldr r3, [r3, #0]
  34803. 802cb92: 1819 adds r1, r3, r0
  34804. if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {
  34805. 802cb94: 428a cmp r2, r1
  34806. 802cb96: d011 beq.n 802cbbc <mem_free+0x70>
  34807. 802cb98: 790d ldrb r5, [r1, #4]
  34808. 802cb9a: b97d cbnz r5, 802cbbc <mem_free+0x70>
  34809. 802cb9c: 4d15 ldr r5, [pc, #84] ; (802cbf4 <mem_free+0xa8>)
  34810. 802cb9e: 682d ldr r5, [r5, #0]
  34811. 802cba0: 42a9 cmp r1, r5
  34812. 802cba2: d00b beq.n 802cbbc <mem_free+0x70>
  34813. /* if mem->next is unused and not end of ram, combine mem and mem->next */
  34814. if (lfree == nmem) {
  34815. 802cba4: 4d15 ldr r5, [pc, #84] ; (802cbfc <mem_free+0xb0>)
  34816. 802cba6: 682e ldr r6, [r5, #0]
  34817. 802cba8: 428e cmp r6, r1
  34818. lfree = mem;
  34819. }
  34820. mem->next = nmem->next;
  34821. 802cbaa: 5a19 ldrh r1, [r3, r0]
  34822. nmem = (struct mem *)(void *)&ram[mem->next];
  34823. if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {
  34824. /* if mem->next is unused and not end of ram, combine mem and mem->next */
  34825. if (lfree == nmem) {
  34826. lfree = mem;
  34827. 802cbac: bf08 it eq
  34828. 802cbae: 602a streq r2, [r5, #0]
  34829. }
  34830. mem->next = nmem->next;
  34831. 802cbb0: f824 1c08 strh.w r1, [r4, #-8]
  34832. ((struct mem *)(void *)&ram[nmem->next])->prev = (mem_size_t)((u8_t *)mem - ram);
  34833. 802cbb4: 5a19 ldrh r1, [r3, r0]
  34834. 802cbb6: 1859 adds r1, r3, r1
  34835. 802cbb8: 1ad0 subs r0, r2, r3
  34836. 802cbba: 8048 strh r0, [r1, #2]
  34837. }
  34838. /* plug hole backward */
  34839. pmem = (struct mem *)(void *)&ram[mem->prev];
  34840. 802cbbc: f834 0c06 ldrh.w r0, [r4, #-6]
  34841. 802cbc0: 1819 adds r1, r3, r0
  34842. if (pmem != mem && pmem->used == 0) {
  34843. 802cbc2: 4291 cmp r1, r2
  34844. 802cbc4: d00e beq.n 802cbe4 <mem_free+0x98>
  34845. 802cbc6: 790d ldrb r5, [r1, #4]
  34846. 802cbc8: b965 cbnz r5, 802cbe4 <mem_free+0x98>
  34847. /* if mem->prev is unused, combine mem and mem->prev */
  34848. if (lfree == mem) {
  34849. 802cbca: 4d0c ldr r5, [pc, #48] ; (802cbfc <mem_free+0xb0>)
  34850. 802cbcc: 682e ldr r6, [r5, #0]
  34851. 802cbce: 4296 cmp r6, r2
  34852. lfree = pmem;
  34853. }
  34854. pmem->next = mem->next;
  34855. 802cbd0: f834 2c08 ldrh.w r2, [r4, #-8]
  34856. /* plug hole backward */
  34857. pmem = (struct mem *)(void *)&ram[mem->prev];
  34858. if (pmem != mem && pmem->used == 0) {
  34859. /* if mem->prev is unused, combine mem and mem->prev */
  34860. if (lfree == mem) {
  34861. lfree = pmem;
  34862. 802cbd4: bf08 it eq
  34863. 802cbd6: 6029 streq r1, [r5, #0]
  34864. }
  34865. pmem->next = mem->next;
  34866. 802cbd8: 521a strh r2, [r3, r0]
  34867. ((struct mem *)(void *)&ram[mem->next])->prev = (mem_size_t)((u8_t *)pmem - ram);
  34868. 802cbda: f834 2c08 ldrh.w r2, [r4, #-8]
  34869. 802cbde: 189a adds r2, r3, r2
  34870. 802cbe0: 1acb subs r3, r1, r3
  34871. 802cbe2: 8053 strh r3, [r2, #2]
  34872. /* finally, see if prev or next are free also */
  34873. plug_holes(mem);
  34874. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  34875. mem_free_count = 1;
  34876. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  34877. LWIP_MEM_FREE_UNPROTECT();
  34878. 802cbe4: 4804 ldr r0, [pc, #16] ; (802cbf8 <mem_free+0xac>)
  34879. }
  34880. 802cbe6: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  34881. /* finally, see if prev or next are free also */
  34882. plug_holes(mem);
  34883. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  34884. mem_free_count = 1;
  34885. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  34886. LWIP_MEM_FREE_UNPROTECT();
  34887. 802cbea: f007 be85 b.w 80348f8 <sys_mutex_unlock>
  34888. 802cbee: bd70 pop {r4, r5, r6, pc}
  34889. 802cbf0: 20002a60 .word 0x20002a60
  34890. 802cbf4: 20002a58 .word 0x20002a58
  34891. 802cbf8: 20002a5c .word 0x20002a5c
  34892. 802cbfc: 20002a54 .word 0x20002a54
  34893. 0802cc00 <mem_trim>:
  34894. * or NULL if newsize is > old size, in which case rmem is NOT touched
  34895. * or freed!
  34896. */
  34897. void *
  34898. mem_trim(void *rmem, mem_size_t newsize)
  34899. {
  34900. 802cc00: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  34901. /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */
  34902. LWIP_MEM_FREE_DECL_PROTECT();
  34903. /* Expand the size of the allocated memory region so that we can
  34904. adjust for alignment. */
  34905. newsize = LWIP_MEM_ALIGN_SIZE(newsize);
  34906. 802cc04: 3103 adds r1, #3
  34907. 802cc06: f64f 75fc movw r5, #65532 ; 0xfffc
  34908. 802cc0a: 400d ands r5, r1
  34909. if(newsize < MIN_SIZE_ALIGNED) {
  34910. 802cc0c: 2d0b cmp r5, #11
  34911. * or NULL if newsize is > old size, in which case rmem is NOT touched
  34912. * or freed!
  34913. */
  34914. void *
  34915. mem_trim(void *rmem, mem_size_t newsize)
  34916. {
  34917. 802cc0e: 4604 mov r4, r0
  34918. /* Expand the size of the allocated memory region so that we can
  34919. adjust for alignment. */
  34920. newsize = LWIP_MEM_ALIGN_SIZE(newsize);
  34921. if(newsize < MIN_SIZE_ALIGNED) {
  34922. 802cc10: d903 bls.n 802cc1a <mem_trim+0x1a>
  34923. /* every data block must be at least MIN_SIZE_ALIGNED long */
  34924. newsize = MIN_SIZE_ALIGNED;
  34925. }
  34926. if (newsize > MEM_SIZE_ALIGNED) {
  34927. 802cc12: f5b5 5fa0 cmp.w r5, #5120 ; 0x1400
  34928. 802cc16: d901 bls.n 802cc1c <mem_trim+0x1c>
  34929. 802cc18: e053 b.n 802ccc2 <mem_trim+0xc2>
  34930. adjust for alignment. */
  34931. newsize = LWIP_MEM_ALIGN_SIZE(newsize);
  34932. if(newsize < MIN_SIZE_ALIGNED) {
  34933. /* every data block must be at least MIN_SIZE_ALIGNED long */
  34934. newsize = MIN_SIZE_ALIGNED;
  34935. 802cc1a: 250c movs r5, #12
  34936. }
  34937. LWIP_ASSERT("mem_trim: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
  34938. (u8_t *)rmem < (u8_t *)ram_end);
  34939. if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
  34940. 802cc1c: f8df 80b8 ldr.w r8, [pc, #184] ; 802ccd8 <mem_trim+0xd8>
  34941. 802cc20: f8d8 3000 ldr.w r3, [r8]
  34942. 802cc24: 429c cmp r4, r3
  34943. 802cc26: d303 bcc.n 802cc30 <mem_trim+0x30>
  34944. 802cc28: 4a28 ldr r2, [pc, #160] ; (802cccc <mem_trim+0xcc>)
  34945. 802cc2a: 6812 ldr r2, [r2, #0]
  34946. 802cc2c: 4294 cmp r4, r2
  34947. 802cc2e: d304 bcc.n 802cc3a <mem_trim+0x3a>
  34948. SYS_ARCH_DECL_PROTECT(lev);
  34949. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_trim: illegal memory\n"));
  34950. /* protect mem stats from concurrent access */
  34951. SYS_ARCH_PROTECT(lev);
  34952. 802cc30: f007 fe82 bl 8034938 <sys_arch_protect>
  34953. MEM_STATS_INC(illegal);
  34954. SYS_ARCH_UNPROTECT(lev);
  34955. 802cc34: f007 fe8a bl 803494c <sys_arch_unprotect>
  34956. return rmem;
  34957. 802cc38: e044 b.n 802ccc4 <mem_trim+0xc4>
  34958. }
  34959. /* Get the corresponding struct mem ... */
  34960. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  34961. 802cc3a: f1a4 0608 sub.w r6, r4, #8
  34962. /* ... and its offset pointer */
  34963. ptr = (mem_size_t)((u8_t *)mem - ram);
  34964. size = mem->next - ptr - SIZEOF_STRUCT_MEM;
  34965. 802cc3e: f834 7c08 ldrh.w r7, [r4, #-8]
  34966. return rmem;
  34967. }
  34968. /* Get the corresponding struct mem ... */
  34969. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  34970. /* ... and its offset pointer */
  34971. ptr = (mem_size_t)((u8_t *)mem - ram);
  34972. 802cc42: 1af6 subs r6, r6, r3
  34973. size = mem->next - ptr - SIZEOF_STRUCT_MEM;
  34974. 802cc44: 3f08 subs r7, #8
  34975. return rmem;
  34976. }
  34977. /* Get the corresponding struct mem ... */
  34978. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  34979. /* ... and its offset pointer */
  34980. ptr = (mem_size_t)((u8_t *)mem - ram);
  34981. 802cc46: b2b6 uxth r6, r6
  34982. size = mem->next - ptr - SIZEOF_STRUCT_MEM;
  34983. 802cc48: 1bbf subs r7, r7, r6
  34984. 802cc4a: b2bf uxth r7, r7
  34985. LWIP_ASSERT("mem_trim can only shrink memory", newsize <= size);
  34986. if (newsize > size) {
  34987. 802cc4c: 42bd cmp r5, r7
  34988. 802cc4e: d838 bhi.n 802ccc2 <mem_trim+0xc2>
  34989. /* not supported */
  34990. return NULL;
  34991. }
  34992. if (newsize == size) {
  34993. 802cc50: d038 beq.n 802ccc4 <mem_trim+0xc4>
  34994. /* No change in size, simply return */
  34995. return rmem;
  34996. }
  34997. /* protect the heap from concurrent access */
  34998. LWIP_MEM_FREE_PROTECT();
  34999. 802cc52: 481f ldr r0, [pc, #124] ; (802ccd0 <mem_trim+0xd0>)
  35000. 802cc54: f007 fe44 bl 80348e0 <sys_mutex_lock>
  35001. mem2 = (struct mem *)(void *)&ram[mem->next];
  35002. 802cc58: f8d8 3000 ldr.w r3, [r8]
  35003. 802cc5c: f834 1c08 ldrh.w r1, [r4, #-8]
  35004. 802cc60: 185a adds r2, r3, r1
  35005. if(mem2->used == 0) {
  35006. 802cc62: 7910 ldrb r0, [r2, #4]
  35007. 802cc64: b978 cbnz r0, 802cc86 <mem_trim+0x86>
  35008. /* The next struct is unused, we can simply move it at little */
  35009. mem_size_t next;
  35010. /* remember the old next pointer */
  35011. next = mem2->next;
  35012. 802cc66: 5a5f ldrh r7, [r3, r1]
  35013. /* create new struct mem which is moved directly after the shrinked mem */
  35014. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  35015. 802cc68: f106 0108 add.w r1, r6, #8
  35016. 802cc6c: 186d adds r5, r5, r1
  35017. if (lfree == mem2) {
  35018. 802cc6e: 4919 ldr r1, [pc, #100] ; (802ccd4 <mem_trim+0xd4>)
  35019. 802cc70: 6808 ldr r0, [r1, #0]
  35020. /* The next struct is unused, we can simply move it at little */
  35021. mem_size_t next;
  35022. /* remember the old next pointer */
  35023. next = mem2->next;
  35024. /* create new struct mem which is moved directly after the shrinked mem */
  35025. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  35026. 802cc72: b2ad uxth r5, r5
  35027. if (lfree == mem2) {
  35028. 802cc74: 4290 cmp r0, r2
  35029. 802cc76: eb03 0205 add.w r2, r3, r5
  35030. lfree = (struct mem *)(void *)&ram[ptr2];
  35031. 802cc7a: bf08 it eq
  35032. 802cc7c: 600a streq r2, [r1, #0]
  35033. }
  35034. mem2 = (struct mem *)(void *)&ram[ptr2];
  35035. mem2->used = 0;
  35036. 802cc7e: 2100 movs r1, #0
  35037. 802cc80: 7111 strb r1, [r2, #4]
  35038. /* restore the next pointer */
  35039. mem2->next = next;
  35040. 802cc82: 535f strh r7, [r3, r5]
  35041. 802cc84: e010 b.n 802cca8 <mem_trim+0xa8>
  35042. if (mem2->next != MEM_SIZE_ALIGNED) {
  35043. ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
  35044. }
  35045. MEM_STATS_DEC_USED(used, (size - newsize));
  35046. /* no need to plug holes, we've already done that */
  35047. } else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) {
  35048. 802cc86: f105 0214 add.w r2, r5, #20
  35049. 802cc8a: 42ba cmp r2, r7
  35050. 802cc8c: d815 bhi.n 802ccba <mem_trim+0xba>
  35051. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  35052. * region that couldn't hold data, but when mem->next gets freed,
  35053. * the 2 regions would be combined, resulting in more free memory */
  35054. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  35055. mem2 = (struct mem *)(void *)&ram[ptr2];
  35056. if (mem2 < lfree) {
  35057. 802cc8e: 4811 ldr r0, [pc, #68] ; (802ccd4 <mem_trim+0xd4>)
  35058. * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem
  35059. * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED').
  35060. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  35061. * region that couldn't hold data, but when mem->next gets freed,
  35062. * the 2 regions would be combined, resulting in more free memory */
  35063. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  35064. 802cc90: f106 0208 add.w r2, r6, #8
  35065. 802cc94: 18ad adds r5, r5, r2
  35066. mem2 = (struct mem *)(void *)&ram[ptr2];
  35067. if (mem2 < lfree) {
  35068. 802cc96: 6807 ldr r7, [r0, #0]
  35069. * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem
  35070. * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED').
  35071. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  35072. * region that couldn't hold data, but when mem->next gets freed,
  35073. * the 2 regions would be combined, resulting in more free memory */
  35074. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  35075. 802cc98: b2ad uxth r5, r5
  35076. mem2 = (struct mem *)(void *)&ram[ptr2];
  35077. 802cc9a: 195a adds r2, r3, r5
  35078. if (mem2 < lfree) {
  35079. 802cc9c: 42ba cmp r2, r7
  35080. lfree = mem2;
  35081. 802cc9e: bf38 it cc
  35082. 802cca0: 6002 strcc r2, [r0, #0]
  35083. }
  35084. mem2->used = 0;
  35085. mem2->next = mem->next;
  35086. 802cca2: 5359 strh r1, [r3, r5]
  35087. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  35088. mem2 = (struct mem *)(void *)&ram[ptr2];
  35089. if (mem2 < lfree) {
  35090. lfree = mem2;
  35091. }
  35092. mem2->used = 0;
  35093. 802cca4: 2000 movs r0, #0
  35094. 802cca6: 7110 strb r0, [r2, #4]
  35095. mem2->next = mem->next;
  35096. mem2->prev = ptr;
  35097. 802cca8: 8056 strh r6, [r2, #2]
  35098. mem->next = ptr2;
  35099. 802ccaa: f824 5c08 strh.w r5, [r4, #-8]
  35100. if (mem2->next != MEM_SIZE_ALIGNED) {
  35101. 802ccae: 5b5a ldrh r2, [r3, r5]
  35102. 802ccb0: f5b2 5fa0 cmp.w r2, #5120 ; 0x1400
  35103. ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
  35104. 802ccb4: bf1c itt ne
  35105. 802ccb6: 189b addne r3, r3, r2
  35106. 802ccb8: 805d strhne r5, [r3, #2]
  35107. -> the remaining space stays unused since it is too small
  35108. } */
  35109. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  35110. mem_free_count = 1;
  35111. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35112. LWIP_MEM_FREE_UNPROTECT();
  35113. 802ccba: 4805 ldr r0, [pc, #20] ; (802ccd0 <mem_trim+0xd0>)
  35114. 802ccbc: f007 fe1c bl 80348f8 <sys_mutex_unlock>
  35115. return rmem;
  35116. 802ccc0: e000 b.n 802ccc4 <mem_trim+0xc4>
  35117. /* every data block must be at least MIN_SIZE_ALIGNED long */
  35118. newsize = MIN_SIZE_ALIGNED;
  35119. }
  35120. if (newsize > MEM_SIZE_ALIGNED) {
  35121. return NULL;
  35122. 802ccc2: 2400 movs r4, #0
  35123. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  35124. mem_free_count = 1;
  35125. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35126. LWIP_MEM_FREE_UNPROTECT();
  35127. return rmem;
  35128. }
  35129. 802ccc4: 4620 mov r0, r4
  35130. 802ccc6: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  35131. 802ccca: bf00 nop
  35132. 802cccc: 20002a58 .word 0x20002a58
  35133. 802ccd0: 20002a5c .word 0x20002a5c
  35134. 802ccd4: 20002a54 .word 0x20002a54
  35135. 802ccd8: 20002a60 .word 0x20002a60
  35136. 0802ccdc <mem_malloc>:
  35137. *
  35138. * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT).
  35139. */
  35140. void *
  35141. mem_malloc(mem_size_t size)
  35142. {
  35143. 802ccdc: b5f8 push {r3, r4, r5, r6, r7, lr}
  35144. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  35145. u8_t local_mem_free_count = 0;
  35146. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35147. LWIP_MEM_ALLOC_DECL_PROTECT();
  35148. if (size == 0) {
  35149. 802ccde: 2800 cmp r0, #0
  35150. 802cce0: d056 beq.n 802cd90 <mem_malloc+0xb4>
  35151. return NULL;
  35152. }
  35153. /* Expand the size of the allocated memory region so that we can
  35154. adjust for alignment. */
  35155. size = LWIP_MEM_ALIGN_SIZE(size);
  35156. 802cce2: 3003 adds r0, #3
  35157. 802cce4: f64f 74fc movw r4, #65532 ; 0xfffc
  35158. 802cce8: 4004 ands r4, r0
  35159. if(size < MIN_SIZE_ALIGNED) {
  35160. 802ccea: 2c0b cmp r4, #11
  35161. 802ccec: d903 bls.n 802ccf6 <mem_malloc+0x1a>
  35162. /* every data block must be at least MIN_SIZE_ALIGNED long */
  35163. size = MIN_SIZE_ALIGNED;
  35164. }
  35165. if (size > MEM_SIZE_ALIGNED) {
  35166. 802ccee: f5b4 5fa0 cmp.w r4, #5120 ; 0x1400
  35167. 802ccf2: d901 bls.n 802ccf8 <mem_malloc+0x1c>
  35168. 802ccf4: e04b b.n 802cd8e <mem_malloc+0xb2>
  35169. adjust for alignment. */
  35170. size = LWIP_MEM_ALIGN_SIZE(size);
  35171. if(size < MIN_SIZE_ALIGNED) {
  35172. /* every data block must be at least MIN_SIZE_ALIGNED long */
  35173. size = MIN_SIZE_ALIGNED;
  35174. 802ccf6: 240c movs r4, #12
  35175. if (size > MEM_SIZE_ALIGNED) {
  35176. return NULL;
  35177. }
  35178. /* protect the heap from concurrent access */
  35179. sys_mutex_lock(&mem_mutex);
  35180. 802ccf8: 4826 ldr r0, [pc, #152] ; (802cd94 <mem_malloc+0xb8>)
  35181. 802ccfa: f007 fdf1 bl 80348e0 <sys_mutex_lock>
  35182. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35183. /* Scan through the heap searching for a free block that is big enough,
  35184. * beginning with the lowest free block.
  35185. */
  35186. for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;
  35187. 802ccfe: 4b26 ldr r3, [pc, #152] ; (802cd98 <mem_malloc+0xbc>)
  35188. 802cd00: 6819 ldr r1, [r3, #0]
  35189. 802cd02: 4b26 ldr r3, [pc, #152] ; (802cd9c <mem_malloc+0xc0>)
  35190. 802cd04: 681a ldr r2, [r3, #0]
  35191. 802cd06: 1a8b subs r3, r1, r2
  35192. 802cd08: b29b uxth r3, r3
  35193. 802cd0a: f5c4 5ea0 rsb lr, r4, #5120 ; 0x1400
  35194. 802cd0e: e039 b.n 802cd84 <mem_malloc+0xa8>
  35195. ptr = ((struct mem *)(void *)&ram[ptr])->next) {
  35196. mem = (struct mem *)(void *)&ram[ptr];
  35197. 802cd10: 18d5 adds r5, r2, r3
  35198. local_mem_free_count = 1;
  35199. break;
  35200. }
  35201. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35202. if ((!mem->used) &&
  35203. 802cd12: 792f ldrb r7, [r5, #4]
  35204. 802cd14: 2f00 cmp r7, #0
  35205. 802cd16: d134 bne.n 802cd82 <mem_malloc+0xa6>
  35206. (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
  35207. 802cd18: 5ad6 ldrh r6, [r2, r3]
  35208. 802cd1a: f1a6 0008 sub.w r0, r6, #8
  35209. 802cd1e: 1ac0 subs r0, r0, r3
  35210. local_mem_free_count = 1;
  35211. break;
  35212. }
  35213. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35214. if ((!mem->used) &&
  35215. 802cd20: 42a0 cmp r0, r4
  35216. 802cd22: d32e bcc.n 802cd82 <mem_malloc+0xa6>
  35217. (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
  35218. /* mem is not used and at least perfect fit is possible:
  35219. * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */
  35220. if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) {
  35221. 802cd24: f104 0e14 add.w lr, r4, #20
  35222. 802cd28: 4570 cmp r0, lr
  35223. 802cd2a: d310 bcc.n 802cd4e <mem_malloc+0x72>
  35224. * struct mem would fit in but no data between mem2 and mem2->next
  35225. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  35226. * region that couldn't hold data, but when mem->next gets freed,
  35227. * the 2 regions would be combined, resulting in more free memory
  35228. */
  35229. ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
  35230. 802cd2c: 3408 adds r4, #8
  35231. 802cd2e: 191c adds r4, r3, r4
  35232. 802cd30: b2a4 uxth r4, r4
  35233. /* create mem2 struct */
  35234. mem2 = (struct mem *)(void *)&ram[ptr2];
  35235. 802cd32: 1910 adds r0, r2, r4
  35236. mem2->used = 0;
  35237. mem2->next = mem->next;
  35238. 802cd34: 5316 strh r6, [r2, r4]
  35239. mem2->prev = ptr;
  35240. 802cd36: 8043 strh r3, [r0, #2]
  35241. /* and insert it between mem and mem->next */
  35242. mem->next = ptr2;
  35243. 802cd38: 802c strh r4, [r5, #0]
  35244. mem->used = 1;
  35245. 802cd3a: 2301 movs r3, #1
  35246. * the 2 regions would be combined, resulting in more free memory
  35247. */
  35248. ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
  35249. /* create mem2 struct */
  35250. mem2 = (struct mem *)(void *)&ram[ptr2];
  35251. mem2->used = 0;
  35252. 802cd3c: 7107 strb r7, [r0, #4]
  35253. mem2->next = mem->next;
  35254. mem2->prev = ptr;
  35255. /* and insert it between mem and mem->next */
  35256. mem->next = ptr2;
  35257. mem->used = 1;
  35258. 802cd3e: 712b strb r3, [r5, #4]
  35259. if (mem2->next != MEM_SIZE_ALIGNED) {
  35260. 802cd40: 5b13 ldrh r3, [r2, r4]
  35261. 802cd42: f5b3 5fa0 cmp.w r3, #5120 ; 0x1400
  35262. 802cd46: d004 beq.n 802cd52 <mem_malloc+0x76>
  35263. ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
  35264. 802cd48: 18d2 adds r2, r2, r3
  35265. 802cd4a: 8054 strh r4, [r2, #2]
  35266. 802cd4c: e001 b.n 802cd52 <mem_malloc+0x76>
  35267. * take care of this).
  35268. * -> near fit or excact fit: do not split, no mem2 creation
  35269. * also can't move mem->next directly behind mem, since mem->next
  35270. * will always be used at this point!
  35271. */
  35272. mem->used = 1;
  35273. 802cd4e: 2301 movs r3, #1
  35274. 802cd50: 712b strb r3, [r5, #4]
  35275. MEM_STATS_INC_USED(used, mem->next - (mem_size_t)((u8_t *)mem - ram));
  35276. }
  35277. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  35278. mem_malloc_adjust_lfree:
  35279. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35280. if (mem == lfree) {
  35281. 802cd52: 428d cmp r5, r1
  35282. 802cd54: d10f bne.n 802cd76 <mem_malloc+0x9a>
  35283. struct mem *cur = lfree;
  35284. /* Find next free block after mem and update lowest free pointer */
  35285. while (cur->used && cur != ram_end) {
  35286. 802cd56: 4b12 ldr r3, [pc, #72] ; (802cda0 <mem_malloc+0xc4>)
  35287. 802cd58: 681a ldr r2, [r3, #0]
  35288. /* If mem_free or mem_trim have run, we have to restart since they
  35289. could have altered our current struct mem or lfree. */
  35290. goto mem_malloc_adjust_lfree;
  35291. }
  35292. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35293. cur = (struct mem *)(void *)&ram[cur->next];
  35294. 802cd5a: 4b10 ldr r3, [pc, #64] ; (802cd9c <mem_malloc+0xc0>)
  35295. 802cd5c: 6819 ldr r1, [r3, #0]
  35296. 802cd5e: 462b mov r3, r5
  35297. 802cd60: e001 b.n 802cd66 <mem_malloc+0x8a>
  35298. 802cd62: 881b ldrh r3, [r3, #0]
  35299. 802cd64: 18cb adds r3, r1, r3
  35300. mem_malloc_adjust_lfree:
  35301. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35302. if (mem == lfree) {
  35303. struct mem *cur = lfree;
  35304. /* Find next free block after mem and update lowest free pointer */
  35305. while (cur->used && cur != ram_end) {
  35306. 802cd66: 7918 ldrb r0, [r3, #4]
  35307. 802cd68: b910 cbnz r0, 802cd70 <mem_malloc+0x94>
  35308. goto mem_malloc_adjust_lfree;
  35309. }
  35310. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35311. cur = (struct mem *)(void *)&ram[cur->next];
  35312. }
  35313. lfree = cur;
  35314. 802cd6a: 4a0b ldr r2, [pc, #44] ; (802cd98 <mem_malloc+0xbc>)
  35315. 802cd6c: 6013 str r3, [r2, #0]
  35316. 802cd6e: e002 b.n 802cd76 <mem_malloc+0x9a>
  35317. mem_malloc_adjust_lfree:
  35318. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35319. if (mem == lfree) {
  35320. struct mem *cur = lfree;
  35321. /* Find next free block after mem and update lowest free pointer */
  35322. while (cur->used && cur != ram_end) {
  35323. 802cd70: 4293 cmp r3, r2
  35324. 802cd72: d1f6 bne.n 802cd62 <mem_malloc+0x86>
  35325. 802cd74: e7f9 b.n 802cd6a <mem_malloc+0x8e>
  35326. }
  35327. lfree = cur;
  35328. LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used)));
  35329. }
  35330. LWIP_MEM_ALLOC_UNPROTECT();
  35331. sys_mutex_unlock(&mem_mutex);
  35332. 802cd76: 4807 ldr r0, [pc, #28] ; (802cd94 <mem_malloc+0xb8>)
  35333. 802cd78: f007 fdbe bl 80348f8 <sys_mutex_unlock>
  35334. LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
  35335. ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
  35336. LWIP_ASSERT("mem_malloc: sanity check alignment",
  35337. (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0);
  35338. return (u8_t *)mem + SIZEOF_STRUCT_MEM;
  35339. 802cd7c: f105 0008 add.w r0, r5, #8
  35340. 802cd80: bdf8 pop {r3, r4, r5, r6, r7, pc}
  35341. /* Scan through the heap searching for a free block that is big enough,
  35342. * beginning with the lowest free block.
  35343. */
  35344. for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;
  35345. ptr = ((struct mem *)(void *)&ram[ptr])->next) {
  35346. 802cd82: 882b ldrh r3, [r5, #0]
  35347. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35348. /* Scan through the heap searching for a free block that is big enough,
  35349. * beginning with the lowest free block.
  35350. */
  35351. for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;
  35352. 802cd84: 4573 cmp r3, lr
  35353. 802cd86: dbc3 blt.n 802cd10 <mem_malloc+0x34>
  35354. } while(local_mem_free_count != 0);
  35355. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35356. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
  35357. MEM_STATS_INC(err);
  35358. LWIP_MEM_ALLOC_UNPROTECT();
  35359. sys_mutex_unlock(&mem_mutex);
  35360. 802cd88: 4802 ldr r0, [pc, #8] ; (802cd94 <mem_malloc+0xb8>)
  35361. 802cd8a: f007 fdb5 bl 80348f8 <sys_mutex_unlock>
  35362. u8_t local_mem_free_count = 0;
  35363. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  35364. LWIP_MEM_ALLOC_DECL_PROTECT();
  35365. if (size == 0) {
  35366. return NULL;
  35367. 802cd8e: 2000 movs r0, #0
  35368. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
  35369. MEM_STATS_INC(err);
  35370. LWIP_MEM_ALLOC_UNPROTECT();
  35371. sys_mutex_unlock(&mem_mutex);
  35372. return NULL;
  35373. }
  35374. 802cd90: bdf8 pop {r3, r4, r5, r6, r7, pc}
  35375. 802cd92: bf00 nop
  35376. 802cd94: 20002a5c .word 0x20002a5c
  35377. 802cd98: 20002a54 .word 0x20002a54
  35378. 802cd9c: 20002a60 .word 0x20002a60
  35379. 802cda0: 20002a58 .word 0x20002a58
  35380. 0802cda4 <memp_init>:
  35381. MEMP_STATS_AVAIL(err, i, 0);
  35382. MEMP_STATS_AVAIL(avail, i, memp_num[i]);
  35383. }
  35384. #if !MEMP_SEPARATE_POOLS
  35385. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  35386. 802cda4: 4a0e ldr r2, [pc, #56] ; (802cde0 <memp_init+0x3c>)
  35387. 802cda6: 490f ldr r1, [pc, #60] ; (802cde4 <memp_init+0x40>)
  35388. *
  35389. * Carves out memp_memory into linked lists for each pool-type.
  35390. */
  35391. void
  35392. memp_init(void)
  35393. {
  35394. 802cda8: b5f0 push {r4, r5, r6, r7, lr}
  35395. MEMP_STATS_AVAIL(err, i, 0);
  35396. MEMP_STATS_AVAIL(avail, i, memp_num[i]);
  35397. }
  35398. #if !MEMP_SEPARATE_POOLS
  35399. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  35400. 802cdaa: 2300 movs r3, #0
  35401. memp_tab[i] = NULL;
  35402. #if MEMP_SEPARATE_POOLS
  35403. memp = (struct memp*)memp_bases[i];
  35404. #endif /* MEMP_SEPARATE_POOLS */
  35405. /* create a linked list of memp elements */
  35406. for (j = 0; j < memp_num[i]; ++j) {
  35407. 802cdac: 4e0e ldr r6, [pc, #56] ; (802cde8 <memp_init+0x44>)
  35408. memp->next = memp_tab[i];
  35409. memp_tab[i] = memp;
  35410. memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
  35411. 802cdae: 4f0f ldr r7, [pc, #60] ; (802cdec <memp_init+0x48>)
  35412. MEMP_STATS_AVAIL(err, i, 0);
  35413. MEMP_STATS_AVAIL(avail, i, memp_num[i]);
  35414. }
  35415. #if !MEMP_SEPARATE_POOLS
  35416. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  35417. 802cdb0: f022 0203 bic.w r2, r2, #3
  35418. #endif /* !MEMP_SEPARATE_POOLS */
  35419. /* for every pool: */
  35420. for (i = 0; i < MEMP_MAX; ++i) {
  35421. memp_tab[i] = NULL;
  35422. 802cdb4: 461d mov r5, r3
  35423. 802cdb6: f841 5b04 str.w r5, [r1], #4
  35424. #if MEMP_SEPARATE_POOLS
  35425. memp = (struct memp*)memp_bases[i];
  35426. #endif /* MEMP_SEPARATE_POOLS */
  35427. /* create a linked list of memp elements */
  35428. for (j = 0; j < memp_num[i]; ++j) {
  35429. 802cdba: f833 c006 ldrh.w ip, [r3, r6]
  35430. 802cdbe: 2000 movs r0, #0
  35431. 802cdc0: e008 b.n 802cdd4 <memp_init+0x30>
  35432. memp->next = memp_tab[i];
  35433. 802cdc2: f851 4c04 ldr.w r4, [r1, #-4]
  35434. 802cdc6: 6014 str r4, [r2, #0]
  35435. memp_tab[i] = memp;
  35436. memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
  35437. 802cdc8: 5bdc ldrh r4, [r3, r7]
  35438. memp = (struct memp*)memp_bases[i];
  35439. #endif /* MEMP_SEPARATE_POOLS */
  35440. /* create a linked list of memp elements */
  35441. for (j = 0; j < memp_num[i]; ++j) {
  35442. memp->next = memp_tab[i];
  35443. memp_tab[i] = memp;
  35444. 802cdca: f841 2c04 str.w r2, [r1, #-4]
  35445. memp_tab[i] = NULL;
  35446. #if MEMP_SEPARATE_POOLS
  35447. memp = (struct memp*)memp_bases[i];
  35448. #endif /* MEMP_SEPARATE_POOLS */
  35449. /* create a linked list of memp elements */
  35450. for (j = 0; j < memp_num[i]; ++j) {
  35451. 802cdce: 3001 adds r0, #1
  35452. memp->next = memp_tab[i];
  35453. memp_tab[i] = memp;
  35454. memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
  35455. 802cdd0: 1912 adds r2, r2, r4
  35456. memp_tab[i] = NULL;
  35457. #if MEMP_SEPARATE_POOLS
  35458. memp = (struct memp*)memp_bases[i];
  35459. #endif /* MEMP_SEPARATE_POOLS */
  35460. /* create a linked list of memp elements */
  35461. for (j = 0; j < memp_num[i]; ++j) {
  35462. 802cdd2: b280 uxth r0, r0
  35463. 802cdd4: 4560 cmp r0, ip
  35464. 802cdd6: d1f4 bne.n 802cdc2 <memp_init+0x1e>
  35465. 802cdd8: 3302 adds r3, #2
  35466. #if !MEMP_SEPARATE_POOLS
  35467. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  35468. #endif /* !MEMP_SEPARATE_POOLS */
  35469. /* for every pool: */
  35470. for (i = 0; i < MEMP_MAX; ++i) {
  35471. 802cdda: 2b20 cmp r3, #32
  35472. 802cddc: d1eb bne.n 802cdb6 <memp_init+0x12>
  35473. #if MEMP_OVERFLOW_CHECK
  35474. memp_overflow_init();
  35475. /* check everything a first time to see if it worked */
  35476. memp_overflow_check_all();
  35477. #endif /* MEMP_OVERFLOW_CHECK */
  35478. }
  35479. 802cdde: bdf0 pop {r4, r5, r6, r7, pc}
  35480. 802cde0: 20002a67 .word 0x20002a67
  35481. 802cde4: 2000e0a4 .word 0x2000e0a4
  35482. 802cde8: 0803fe1e .word 0x0803fe1e
  35483. 802cdec: 0803fe3e .word 0x0803fe3e
  35484. 0802cdf0 <memp_malloc>:
  35485. #endif
  35486. {
  35487. struct memp *memp;
  35488. SYS_ARCH_DECL_PROTECT(old_level);
  35489. LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
  35490. 802cdf0: 280f cmp r0, #15
  35491. #if !MEMP_OVERFLOW_CHECK
  35492. memp_malloc(memp_t type)
  35493. #else
  35494. memp_malloc_fn(memp_t type, const char* file, const int line)
  35495. #endif
  35496. {
  35497. 802cdf2: b538 push {r3, r4, r5, lr}
  35498. 802cdf4: 4605 mov r5, r0
  35499. struct memp *memp;
  35500. SYS_ARCH_DECL_PROTECT(old_level);
  35501. LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
  35502. 802cdf6: d80b bhi.n 802ce10 <memp_malloc+0x20>
  35503. SYS_ARCH_PROTECT(old_level);
  35504. 802cdf8: f007 fd9e bl 8034938 <sys_arch_protect>
  35505. #if MEMP_OVERFLOW_CHECK >= 2
  35506. memp_overflow_check_all();
  35507. #endif /* MEMP_OVERFLOW_CHECK >= 2 */
  35508. memp = memp_tab[type];
  35509. 802cdfc: 4b06 ldr r3, [pc, #24] ; (802ce18 <memp_malloc+0x28>)
  35510. 802cdfe: f853 4025 ldr.w r4, [r3, r5, lsl #2]
  35511. if (memp != NULL) {
  35512. 802ce02: b114 cbz r4, 802ce0a <memp_malloc+0x1a>
  35513. memp_tab[type] = memp->next;
  35514. 802ce04: 6822 ldr r2, [r4, #0]
  35515. 802ce06: f843 2025 str.w r2, [r3, r5, lsl #2]
  35516. } else {
  35517. LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", memp_desc[type]));
  35518. MEMP_STATS_INC(err, type);
  35519. }
  35520. SYS_ARCH_UNPROTECT(old_level);
  35521. 802ce0a: f007 fd9f bl 803494c <sys_arch_unprotect>
  35522. return memp;
  35523. 802ce0e: e000 b.n 802ce12 <memp_malloc+0x22>
  35524. #endif
  35525. {
  35526. struct memp *memp;
  35527. SYS_ARCH_DECL_PROTECT(old_level);
  35528. LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
  35529. 802ce10: 2400 movs r4, #0
  35530. }
  35531. SYS_ARCH_UNPROTECT(old_level);
  35532. return memp;
  35533. }
  35534. 802ce12: 4620 mov r0, r4
  35535. 802ce14: bd38 pop {r3, r4, r5, pc}
  35536. 802ce16: bf00 nop
  35537. 802ce18: 2000e0a4 .word 0x2000e0a4
  35538. 0802ce1c <memp_free>:
  35539. * @param type the pool where to put mem
  35540. * @param mem the memp element to free
  35541. */
  35542. void
  35543. memp_free(memp_t type, void *mem)
  35544. {
  35545. 802ce1c: b538 push {r3, r4, r5, lr}
  35546. 802ce1e: 4605 mov r5, r0
  35547. struct memp *memp;
  35548. SYS_ARCH_DECL_PROTECT(old_level);
  35549. if (mem == NULL) {
  35550. 802ce20: 460c mov r4, r1
  35551. 802ce22: b159 cbz r1, 802ce3c <memp_free+0x20>
  35552. LWIP_ASSERT("memp_free: mem properly aligned",
  35553. ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);
  35554. memp = (struct memp *)(void *)((u8_t*)mem - MEMP_SIZE);
  35555. SYS_ARCH_PROTECT(old_level);
  35556. 802ce24: f007 fd88 bl 8034938 <sys_arch_protect>
  35557. #endif /* MEMP_OVERFLOW_CHECK >= 2 */
  35558. #endif /* MEMP_OVERFLOW_CHECK */
  35559. MEMP_STATS_DEC(used, type);
  35560. memp->next = memp_tab[type];
  35561. 802ce28: 4b05 ldr r3, [pc, #20] ; (802ce40 <memp_free+0x24>)
  35562. 802ce2a: f853 2025 ldr.w r2, [r3, r5, lsl #2]
  35563. 802ce2e: 6022 str r2, [r4, #0]
  35564. memp_tab[type] = memp;
  35565. 802ce30: f843 4025 str.w r4, [r3, r5, lsl #2]
  35566. #if MEMP_SANITY_CHECK
  35567. LWIP_ASSERT("memp sanity", memp_sanity());
  35568. #endif /* MEMP_SANITY_CHECK */
  35569. SYS_ARCH_UNPROTECT(old_level);
  35570. }
  35571. 802ce34: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  35572. #if MEMP_SANITY_CHECK
  35573. LWIP_ASSERT("memp sanity", memp_sanity());
  35574. #endif /* MEMP_SANITY_CHECK */
  35575. SYS_ARCH_UNPROTECT(old_level);
  35576. 802ce38: f007 bd88 b.w 803494c <sys_arch_unprotect>
  35577. 802ce3c: bd38 pop {r3, r4, r5, pc}
  35578. 802ce3e: bf00 nop
  35579. 802ce40: 2000e0a4 .word 0x2000e0a4
  35580. 0802ce44 <netif_init>:
  35581. }
  35582. #endif /* LWIP_HAVE_LOOPIF */
  35583. void
  35584. netif_init(void)
  35585. {
  35586. 802ce44: 4770 bx lr
  35587. 802ce46: 0000 movs r0, r0
  35588. 0802ce48 <netif_set_ipaddr>:
  35589. * @note call netif_set_addr() if you also want to change netmask and
  35590. * default gateway
  35591. */
  35592. void
  35593. netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr)
  35594. {
  35595. 802ce48: b570 push {r4, r5, r6, lr}
  35596. 802ce4a: 4604 mov r4, r0
  35597. #if LWIP_TCP
  35598. struct tcp_pcb *pcb;
  35599. struct tcp_pcb_listen *lpcb;
  35600. /* address is actually being changed? */
  35601. if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) {
  35602. 802ce4c: 460d mov r5, r1
  35603. 802ce4e: b941 cbnz r1, 802ce62 <netif_set_ipaddr+0x1a>
  35604. ip_addr_set(&(lpcb->local_ip), ipaddr);
  35605. }
  35606. }
  35607. }
  35608. #endif
  35609. snmp_delete_ipaddridx_tree(netif);
  35610. 802ce50: 4620 mov r0, r4
  35611. 802ce52: f004 fd99 bl 8031988 <snmp_delete_ipaddridx_tree>
  35612. snmp_delete_iprteidx_tree(0,netif);
  35613. 802ce56: 2000 movs r0, #0
  35614. 802ce58: 4621 mov r1, r4
  35615. 802ce5a: f004 fe2b bl 8031ab4 <snmp_delete_iprteidx_tree>
  35616. /* set new IP address to netif */
  35617. ip_addr_set(&(netif->ip_addr), ipaddr);
  35618. 802ce5e: b9fd cbnz r5, 802cea0 <netif_set_ipaddr+0x58>
  35619. 802ce60: e01f b.n 802cea2 <netif_set_ipaddr+0x5a>
  35620. #if LWIP_TCP
  35621. struct tcp_pcb *pcb;
  35622. struct tcp_pcb_listen *lpcb;
  35623. /* address is actually being changed? */
  35624. if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) {
  35625. 802ce62: 680a ldr r2, [r1, #0]
  35626. 802ce64: 6843 ldr r3, [r0, #4]
  35627. 802ce66: 429a cmp r2, r3
  35628. 802ce68: d0f2 beq.n 802ce50 <netif_set_ipaddr+0x8>
  35629. /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */
  35630. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
  35631. pcb = tcp_active_pcbs;
  35632. 802ce6a: 4b13 ldr r3, [pc, #76] ; (802ceb8 <netif_set_ipaddr+0x70>)
  35633. 802ce6c: 6818 ldr r0, [r3, #0]
  35634. while (pcb != NULL) {
  35635. 802ce6e: e007 b.n 802ce80 <netif_set_ipaddr+0x38>
  35636. /* PCB bound to current local interface address? */
  35637. if (ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))
  35638. 802ce70: 6802 ldr r2, [r0, #0]
  35639. 802ce72: 6863 ldr r3, [r4, #4]
  35640. 802ce74: 68c6 ldr r6, [r0, #12]
  35641. 802ce76: 429a cmp r2, r3
  35642. 802ce78: d101 bne.n 802ce7e <netif_set_ipaddr+0x36>
  35643. #endif /* LWIP_AUTOIP */
  35644. ) {
  35645. /* this connection must be aborted */
  35646. struct tcp_pcb *next = pcb->next;
  35647. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb));
  35648. tcp_abort(pcb);
  35649. 802ce7a: f000 fd89 bl 802d990 <tcp_abort>
  35650. pcb = next;
  35651. } else {
  35652. pcb = pcb->next;
  35653. 802ce7e: 4630 mov r0, r6
  35654. /* address is actually being changed? */
  35655. if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) {
  35656. /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */
  35657. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
  35658. pcb = tcp_active_pcbs;
  35659. while (pcb != NULL) {
  35660. 802ce80: 2800 cmp r0, #0
  35661. 802ce82: d1f5 bne.n 802ce70 <netif_set_ipaddr+0x28>
  35662. pcb = next;
  35663. } else {
  35664. pcb = pcb->next;
  35665. }
  35666. }
  35667. for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  35668. 802ce84: 4b0d ldr r3, [pc, #52] ; (802cebc <netif_set_ipaddr+0x74>)
  35669. 802ce86: 681b ldr r3, [r3, #0]
  35670. 802ce88: e007 b.n 802ce9a <netif_set_ipaddr+0x52>
  35671. /* PCB bound to current local interface address? */
  35672. if ((!(ip_addr_isany(&(lpcb->local_ip)))) &&
  35673. 802ce8a: 681a ldr r2, [r3, #0]
  35674. 802ce8c: b122 cbz r2, 802ce98 <netif_set_ipaddr+0x50>
  35675. 802ce8e: 6861 ldr r1, [r4, #4]
  35676. 802ce90: 428a cmp r2, r1
  35677. (ip_addr_cmp(&(lpcb->local_ip), &(netif->ip_addr)))) {
  35678. /* The PCB is listening to the old ipaddr and
  35679. * is set to listen to the new one instead */
  35680. ip_addr_set(&(lpcb->local_ip), ipaddr);
  35681. 802ce92: bf04 itt eq
  35682. 802ce94: 682a ldreq r2, [r5, #0]
  35683. 802ce96: 601a streq r2, [r3, #0]
  35684. pcb = next;
  35685. } else {
  35686. pcb = pcb->next;
  35687. }
  35688. }
  35689. for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  35690. 802ce98: 68db ldr r3, [r3, #12]
  35691. 802ce9a: 2b00 cmp r3, #0
  35692. 802ce9c: d1f5 bne.n 802ce8a <netif_set_ipaddr+0x42>
  35693. 802ce9e: e7d7 b.n 802ce50 <netif_set_ipaddr+0x8>
  35694. }
  35695. #endif
  35696. snmp_delete_ipaddridx_tree(netif);
  35697. snmp_delete_iprteidx_tree(0,netif);
  35698. /* set new IP address to netif */
  35699. ip_addr_set(&(netif->ip_addr), ipaddr);
  35700. 802cea0: 682d ldr r5, [r5, #0]
  35701. snmp_insert_ipaddridx_tree(netif);
  35702. 802cea2: 4620 mov r0, r4
  35703. }
  35704. #endif
  35705. snmp_delete_ipaddridx_tree(netif);
  35706. snmp_delete_iprteidx_tree(0,netif);
  35707. /* set new IP address to netif */
  35708. ip_addr_set(&(netif->ip_addr), ipaddr);
  35709. 802cea4: 6065 str r5, [r4, #4]
  35710. snmp_insert_ipaddridx_tree(netif);
  35711. 802cea6: f004 fd2d bl 8031904 <snmp_insert_ipaddridx_tree>
  35712. snmp_insert_iprteidx_tree(0,netif);
  35713. 802ceaa: 2000 movs r0, #0
  35714. 802ceac: 4621 mov r1, r4
  35715. netif->name[0], netif->name[1],
  35716. ip4_addr1_16(&netif->ip_addr),
  35717. ip4_addr2_16(&netif->ip_addr),
  35718. ip4_addr3_16(&netif->ip_addr),
  35719. ip4_addr4_16(&netif->ip_addr)));
  35720. }
  35721. 802ceae: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  35722. snmp_delete_ipaddridx_tree(netif);
  35723. snmp_delete_iprteidx_tree(0,netif);
  35724. /* set new IP address to netif */
  35725. ip_addr_set(&(netif->ip_addr), ipaddr);
  35726. snmp_insert_ipaddridx_tree(netif);
  35727. snmp_insert_iprteidx_tree(0,netif);
  35728. 802ceb2: f004 bdb3 b.w 8031a1c <snmp_insert_iprteidx_tree>
  35729. 802ceb6: bf00 nop
  35730. 802ceb8: 20010fdc .word 0x20010fdc
  35731. 802cebc: 20010fe4 .word 0x20010fe4
  35732. 0802cec0 <netif_set_gw>:
  35733. * @note call netif_set_addr() if you also want to change ip address and netmask
  35734. */
  35735. void
  35736. netif_set_gw(struct netif *netif, ip_addr_t *gw)
  35737. {
  35738. ip_addr_set(&(netif->gw), gw);
  35739. 802cec0: b101 cbz r1, 802cec4 <netif_set_gw+0x4>
  35740. 802cec2: 6809 ldr r1, [r1, #0]
  35741. 802cec4: 60c1 str r1, [r0, #12]
  35742. 802cec6: 4770 bx lr
  35743. 0802cec8 <netif_set_netmask>:
  35744. * @note call netif_set_addr() if you also want to change ip address and
  35745. * default gateway
  35746. */
  35747. void
  35748. netif_set_netmask(struct netif *netif, ip_addr_t *netmask)
  35749. {
  35750. 802cec8: b538 push {r3, r4, r5, lr}
  35751. 802ceca: 4604 mov r4, r0
  35752. 802cecc: 460d mov r5, r1
  35753. snmp_delete_iprteidx_tree(0, netif);
  35754. 802cece: 2000 movs r0, #0
  35755. 802ced0: 4621 mov r1, r4
  35756. 802ced2: f004 fdef bl 8031ab4 <snmp_delete_iprteidx_tree>
  35757. /* set new netmask to netif */
  35758. ip_addr_set(&(netif->netmask), netmask);
  35759. 802ced6: b105 cbz r5, 802ceda <netif_set_netmask+0x12>
  35760. 802ced8: 682d ldr r5, [r5, #0]
  35761. snmp_insert_iprteidx_tree(0, netif);
  35762. 802ceda: 2000 movs r0, #0
  35763. 802cedc: 4621 mov r1, r4
  35764. void
  35765. netif_set_netmask(struct netif *netif, ip_addr_t *netmask)
  35766. {
  35767. snmp_delete_iprteidx_tree(0, netif);
  35768. /* set new netmask to netif */
  35769. ip_addr_set(&(netif->netmask), netmask);
  35770. 802cede: 60a5 str r5, [r4, #8]
  35771. netif->name[0], netif->name[1],
  35772. ip4_addr1_16(&netif->netmask),
  35773. ip4_addr2_16(&netif->netmask),
  35774. ip4_addr3_16(&netif->netmask),
  35775. ip4_addr4_16(&netif->netmask)));
  35776. }
  35777. 802cee0: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  35778. netif_set_netmask(struct netif *netif, ip_addr_t *netmask)
  35779. {
  35780. snmp_delete_iprteidx_tree(0, netif);
  35781. /* set new netmask to netif */
  35782. ip_addr_set(&(netif->netmask), netmask);
  35783. snmp_insert_iprteidx_tree(0, netif);
  35784. 802cee4: f004 bd9a b.w 8031a1c <snmp_insert_iprteidx_tree>
  35785. 0802cee8 <netif_set_addr>:
  35786. * @param gw the new default gateway
  35787. */
  35788. void
  35789. netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
  35790. ip_addr_t *gw)
  35791. {
  35792. 802cee8: b570 push {r4, r5, r6, lr}
  35793. 802ceea: 4605 mov r5, r0
  35794. 802ceec: 4616 mov r6, r2
  35795. 802ceee: 461c mov r4, r3
  35796. netif_set_ipaddr(netif, ipaddr);
  35797. 802cef0: f7ff ffaa bl 802ce48 <netif_set_ipaddr>
  35798. netif_set_netmask(netif, netmask);
  35799. 802cef4: 4628 mov r0, r5
  35800. 802cef6: 4631 mov r1, r6
  35801. 802cef8: f7ff ffe6 bl 802cec8 <netif_set_netmask>
  35802. * @note call netif_set_addr() if you also want to change ip address and netmask
  35803. */
  35804. void
  35805. netif_set_gw(struct netif *netif, ip_addr_t *gw)
  35806. {
  35807. ip_addr_set(&(netif->gw), gw);
  35808. 802cefc: b104 cbz r4, 802cf00 <netif_set_addr+0x18>
  35809. 802cefe: 6824 ldr r4, [r4, #0]
  35810. 802cf00: 60ec str r4, [r5, #12]
  35811. 802cf02: bd70 pop {r4, r5, r6, pc}
  35812. 0802cf04 <netif_add>:
  35813. * @return netif, or NULL if failed.
  35814. */
  35815. struct netif *
  35816. netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
  35817. ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)
  35818. {
  35819. 802cf04: b5f8 push {r3, r4, r5, r6, r7, lr}
  35820. netif->loop_first = NULL;
  35821. netif->loop_last = NULL;
  35822. #endif /* ENABLE_LOOPBACK */
  35823. /* remember netif specific state information data */
  35824. netif->state = state;
  35825. 802cf06: 9e06 ldr r6, [sp, #24]
  35826. 802cf08: 61c6 str r6, [r0, #28]
  35827. netif->num = netif_num++;
  35828. 802cf0a: 4e10 ldr r6, [pc, #64] ; (802cf4c <netif_add+0x48>)
  35829. 802cf0c: 7837 ldrb r7, [r6, #0]
  35830. 802cf0e: f880 7030 strb.w r7, [r0, #48] ; 0x30
  35831. 802cf12: 3701 adds r7, #1
  35832. 802cf14: 7037 strb r7, [r6, #0]
  35833. netif->input = input;
  35834. 802cf16: 9e08 ldr r6, [sp, #32]
  35835. {
  35836. LWIP_ASSERT("No init function given", init != NULL);
  35837. /* reset new interface configuration state */
  35838. ip_addr_set_zero(&netif->ip_addr);
  35839. 802cf18: 2500 movs r5, #0
  35840. * @return netif, or NULL if failed.
  35841. */
  35842. struct netif *
  35843. netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
  35844. ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)
  35845. {
  35846. 802cf1a: 4604 mov r4, r0
  35847. LWIP_ASSERT("No init function given", init != NULL);
  35848. /* reset new interface configuration state */
  35849. ip_addr_set_zero(&netif->ip_addr);
  35850. 802cf1c: 6045 str r5, [r0, #4]
  35851. ip_addr_set_zero(&netif->netmask);
  35852. 802cf1e: 6085 str r5, [r0, #8]
  35853. ip_addr_set_zero(&netif->gw);
  35854. 802cf20: 60c5 str r5, [r0, #12]
  35855. netif->flags = 0;
  35856. 802cf22: f880 502d strb.w r5, [r0, #45] ; 0x2d
  35857. #if LWIP_DHCP
  35858. /* netif not under DHCP control by default */
  35859. netif->dhcp = NULL;
  35860. 802cf26: 6205 str r5, [r0, #32]
  35861. #endif /* ENABLE_LOOPBACK */
  35862. /* remember netif specific state information data */
  35863. netif->state = state;
  35864. netif->num = netif_num++;
  35865. netif->input = input;
  35866. 802cf28: 6106 str r6, [r0, #16]
  35867. NETIF_SET_HWADDRHINT(netif, NULL);
  35868. #if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS
  35869. netif->loop_cnt_current = 0;
  35870. #endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */
  35871. netif_set_addr(netif, ipaddr, netmask, gw);
  35872. 802cf2a: f7ff ffdd bl 802cee8 <netif_set_addr>
  35873. /* call user specified initialization function for netif */
  35874. if (init(netif) != ERR_OK) {
  35875. 802cf2e: 4620 mov r0, r4
  35876. 802cf30: 9b07 ldr r3, [sp, #28]
  35877. 802cf32: 4798 blx r3
  35878. 802cf34: b930 cbnz r0, 802cf44 <netif_add+0x40>
  35879. return NULL;
  35880. }
  35881. /* add this netif to the list */
  35882. netif->next = netif_list;
  35883. 802cf36: 4b06 ldr r3, [pc, #24] ; (802cf50 <netif_add+0x4c>)
  35884. 802cf38: 681a ldr r2, [r3, #0]
  35885. 802cf3a: 6022 str r2, [r4, #0]
  35886. netif_list = netif;
  35887. 802cf3c: 601c str r4, [r3, #0]
  35888. snmp_inc_iflist();
  35889. 802cf3e: f004 fbc5 bl 80316cc <snmp_inc_iflist>
  35890. LWIP_DEBUGF(NETIF_DEBUG, (" netmask "));
  35891. ip_addr_debug_print(NETIF_DEBUG, netmask);
  35892. LWIP_DEBUGF(NETIF_DEBUG, (" gw "));
  35893. ip_addr_debug_print(NETIF_DEBUG, gw);
  35894. LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
  35895. return netif;
  35896. 802cf42: e000 b.n 802cf46 <netif_add+0x42>
  35897. netif_set_addr(netif, ipaddr, netmask, gw);
  35898. /* call user specified initialization function for netif */
  35899. if (init(netif) != ERR_OK) {
  35900. return NULL;
  35901. 802cf44: 462c mov r4, r5
  35902. ip_addr_debug_print(NETIF_DEBUG, netmask);
  35903. LWIP_DEBUGF(NETIF_DEBUG, (" gw "));
  35904. ip_addr_debug_print(NETIF_DEBUG, gw);
  35905. LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
  35906. return netif;
  35907. }
  35908. 802cf46: 4620 mov r0, r4
  35909. 802cf48: bdf8 pop {r3, r4, r5, r6, r7, pc}
  35910. 802cf4a: bf00 nop
  35911. 802cf4c: 2000e0e4 .word 0x2000e0e4
  35912. 802cf50: 20010fd0 .word 0x20010fd0
  35913. 0802cf54 <netif_set_default>:
  35914. *
  35915. * @param netif the default network interface
  35916. */
  35917. void
  35918. netif_set_default(struct netif *netif)
  35919. {
  35920. 802cf54: b510 push {r4, lr}
  35921. if (netif == NULL) {
  35922. 802cf56: 4604 mov r4, r0
  35923. /* remove default route */
  35924. snmp_delete_iprteidx_tree(1, netif);
  35925. 802cf58: 4621 mov r1, r4
  35926. 802cf5a: 2001 movs r0, #1
  35927. * @param netif the default network interface
  35928. */
  35929. void
  35930. netif_set_default(struct netif *netif)
  35931. {
  35932. if (netif == NULL) {
  35933. 802cf5c: b914 cbnz r4, 802cf64 <netif_set_default+0x10>
  35934. /* remove default route */
  35935. snmp_delete_iprteidx_tree(1, netif);
  35936. 802cf5e: f004 fda9 bl 8031ab4 <snmp_delete_iprteidx_tree>
  35937. 802cf62: e001 b.n 802cf68 <netif_set_default+0x14>
  35938. } else {
  35939. /* install default route */
  35940. snmp_insert_iprteidx_tree(1, netif);
  35941. 802cf64: f004 fd5a bl 8031a1c <snmp_insert_iprteidx_tree>
  35942. }
  35943. netif_default = netif;
  35944. 802cf68: 4b01 ldr r3, [pc, #4] ; (802cf70 <netif_set_default+0x1c>)
  35945. 802cf6a: 601c str r4, [r3, #0]
  35946. 802cf6c: bd10 pop {r4, pc}
  35947. 802cf6e: bf00 nop
  35948. 802cf70: 20010fd4 .word 0x20010fd4
  35949. 0802cf74 <netif_set_up>:
  35950. * up once configured.
  35951. *
  35952. * @see dhcp_start()
  35953. */
  35954. void netif_set_up(struct netif *netif)
  35955. {
  35956. 802cf74: b510 push {r4, lr}
  35957. if (!(netif->flags & NETIF_FLAG_UP)) {
  35958. 802cf76: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  35959. 802cf7a: 07da lsls r2, r3, #31
  35960. * up once configured.
  35961. *
  35962. * @see dhcp_start()
  35963. */
  35964. void netif_set_up(struct netif *netif)
  35965. {
  35966. 802cf7c: 4604 mov r4, r0
  35967. if (!(netif->flags & NETIF_FLAG_UP)) {
  35968. 802cf7e: d412 bmi.n 802cfa6 <netif_set_up+0x32>
  35969. netif->flags |= NETIF_FLAG_UP;
  35970. 802cf80: f043 0301 orr.w r3, r3, #1
  35971. 802cf84: f880 302d strb.w r3, [r0, #45] ; 0x2d
  35972. #if LWIP_SNMP
  35973. snmp_get_sysuptime(&netif->ts);
  35974. 802cf88: 3038 adds r0, #56 ; 0x38
  35975. 802cf8a: f004 fb43 bl 8031614 <snmp_get_sysuptime>
  35976. * @note: Enabling DHCP on a down interface will make it come
  35977. * up once configured.
  35978. *
  35979. * @see dhcp_start()
  35980. */
  35981. void netif_set_up(struct netif *netif)
  35982. 802cf8e: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  35983. NETIF_STATUS_CALLBACK(netif);
  35984. if (netif->flags & NETIF_FLAG_LINK_UP) {
  35985. #if LWIP_ARP
  35986. /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
  35987. if (netif->flags & (NETIF_FLAG_ETHARP)) {
  35988. 802cf92: f003 0330 and.w r3, r3, #48 ; 0x30
  35989. 802cf96: 2b30 cmp r3, #48 ; 0x30
  35990. 802cf98: d105 bne.n 802cfa6 <netif_set_up+0x32>
  35991. etharp_gratuitous(netif);
  35992. 802cf9a: 4620 mov r0, r4
  35993. 802cf9c: 1d21 adds r1, r4, #4
  35994. igmp_report_groups( netif);
  35995. }
  35996. #endif /* LWIP_IGMP */
  35997. }
  35998. }
  35999. }
  36000. 802cf9e: e8bd 4010 ldmia.w sp!, {r4, lr}
  36001. if (netif->flags & NETIF_FLAG_LINK_UP) {
  36002. #if LWIP_ARP
  36003. /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
  36004. if (netif->flags & (NETIF_FLAG_ETHARP)) {
  36005. etharp_gratuitous(netif);
  36006. 802cfa2: f007 b87d b.w 80340a0 <etharp_request>
  36007. 802cfa6: bd10 pop {r4, pc}
  36008. 0802cfa8 <netif_set_down>:
  36009. * up once configured.
  36010. *
  36011. * @see dhcp_start()
  36012. */
  36013. void netif_set_down(struct netif *netif)
  36014. {
  36015. 802cfa8: b510 push {r4, lr}
  36016. if (netif->flags & NETIF_FLAG_UP) {
  36017. 802cfaa: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  36018. 802cfae: 07d9 lsls r1, r3, #31
  36019. * up once configured.
  36020. *
  36021. * @see dhcp_start()
  36022. */
  36023. void netif_set_down(struct netif *netif)
  36024. {
  36025. 802cfb0: 4604 mov r4, r0
  36026. if (netif->flags & NETIF_FLAG_UP) {
  36027. 802cfb2: d511 bpl.n 802cfd8 <netif_set_down+0x30>
  36028. netif->flags &= ~NETIF_FLAG_UP;
  36029. 802cfb4: f023 0301 bic.w r3, r3, #1
  36030. 802cfb8: f880 302d strb.w r3, [r0, #45] ; 0x2d
  36031. #if LWIP_SNMP
  36032. snmp_get_sysuptime(&netif->ts);
  36033. 802cfbc: 3038 adds r0, #56 ; 0x38
  36034. 802cfbe: f004 fb29 bl 8031614 <snmp_get_sysuptime>
  36035. #endif
  36036. #if LWIP_ARP
  36037. if (netif->flags & NETIF_FLAG_ETHARP) {
  36038. 802cfc2: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  36039. 802cfc6: f003 0320 and.w r3, r3, #32
  36040. 802cfca: b2db uxtb r3, r3
  36041. 802cfcc: b123 cbz r3, 802cfd8 <netif_set_down+0x30>
  36042. etharp_cleanup_netif(netif);
  36043. 802cfce: 4620 mov r0, r4
  36044. }
  36045. #endif /* LWIP_ARP */
  36046. NETIF_STATUS_CALLBACK(netif);
  36047. }
  36048. }
  36049. 802cfd0: e8bd 4010 ldmia.w sp!, {r4, lr}
  36050. snmp_get_sysuptime(&netif->ts);
  36051. #endif
  36052. #if LWIP_ARP
  36053. if (netif->flags & NETIF_FLAG_ETHARP) {
  36054. etharp_cleanup_netif(netif);
  36055. 802cfd4: f007 b834 b.w 8034040 <etharp_cleanup_netif>
  36056. 802cfd8: bd10 pop {r4, pc}
  36057. 0802cfda <pbuf_header>:
  36058. * @return non-zero on failure, zero on success.
  36059. *
  36060. */
  36061. u8_t
  36062. pbuf_header(struct pbuf *p, s16_t header_size_increment)
  36063. {
  36064. 802cfda: b510 push {r4, lr}
  36065. u16_t type;
  36066. void *payload;
  36067. u16_t increment_magnitude;
  36068. LWIP_ASSERT("p != NULL", p != NULL);
  36069. if ((header_size_increment == 0) || (p == NULL)) {
  36070. 802cfdc: b321 cbz r1, 802d028 <pbuf_header+0x4e>
  36071. 802cfde: b330 cbz r0, 802d02e <pbuf_header+0x54>
  36072. return 0;
  36073. }
  36074. if (header_size_increment < 0){
  36075. 802cfe0: 2900 cmp r1, #0
  36076. 802cfe2: da05 bge.n 802cff0 <pbuf_header+0x16>
  36077. increment_magnitude = -header_size_increment;
  36078. 802cfe4: 424b negs r3, r1
  36079. /* Check that we aren't going to move off the end of the pbuf */
  36080. LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
  36081. 802cfe6: 8942 ldrh r2, [r0, #10]
  36082. if ((header_size_increment == 0) || (p == NULL)) {
  36083. return 0;
  36084. }
  36085. if (header_size_increment < 0){
  36086. increment_magnitude = -header_size_increment;
  36087. 802cfe8: b29b uxth r3, r3
  36088. /* Check that we aren't going to move off the end of the pbuf */
  36089. LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
  36090. 802cfea: 429a cmp r2, r3
  36091. 802cfec: d201 bcs.n 802cff2 <pbuf_header+0x18>
  36092. 802cfee: e01d b.n 802d02c <pbuf_header+0x52>
  36093. } else {
  36094. increment_magnitude = header_size_increment;
  36095. 802cff0: b28b uxth r3, r1
  36096. LWIP_ASSERT("p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF",
  36097. (u8_t *)p->payload - increment_magnitude >= (u8_t *)p + SIZEOF_STRUCT_PBUF);
  36098. #endif
  36099. }
  36100. type = p->type;
  36101. 802cff2: 7b02 ldrb r2, [r0, #12]
  36102. /* remember current payload pointer */
  36103. payload = p->payload;
  36104. 802cff4: 6844 ldr r4, [r0, #4]
  36105. /* pbuf types containing payloads? */
  36106. if (type == PBUF_RAM || type == PBUF_POOL) {
  36107. 802cff6: b10a cbz r2, 802cffc <pbuf_header+0x22>
  36108. 802cff8: 2a03 cmp r2, #3
  36109. 802cffa: d105 bne.n 802d008 <pbuf_header+0x2e>
  36110. /* set new payload pointer */
  36111. p->payload = (u8_t *)p->payload - header_size_increment;
  36112. 802cffc: 1a64 subs r4, r4, r1
  36113. /* boundary check fails? */
  36114. if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) {
  36115. 802cffe: f100 0310 add.w r3, r0, #16
  36116. 802d002: 429c cmp r4, r3
  36117. 802d004: d312 bcc.n 802d02c <pbuf_header+0x52>
  36118. 802d006: e008 b.n 802d01a <pbuf_header+0x40>
  36119. p->payload = payload;
  36120. /* bail out unsuccesfully */
  36121. return 1;
  36122. }
  36123. /* pbuf types refering to external payloads? */
  36124. } else if (type == PBUF_REF || type == PBUF_ROM) {
  36125. 802d008: 3a01 subs r2, #1
  36126. 802d00a: 2a01 cmp r2, #1
  36127. 802d00c: d80e bhi.n 802d02c <pbuf_header+0x52>
  36128. /* hide a header in the payload? */
  36129. if ((header_size_increment < 0) && (increment_magnitude <= p->len)) {
  36130. 802d00e: 2900 cmp r1, #0
  36131. 802d010: da0c bge.n 802d02c <pbuf_header+0x52>
  36132. 802d012: 8942 ldrh r2, [r0, #10]
  36133. 802d014: 429a cmp r2, r3
  36134. 802d016: d309 bcc.n 802d02c <pbuf_header+0x52>
  36135. /* increase payload pointer */
  36136. p->payload = (u8_t *)p->payload - header_size_increment;
  36137. 802d018: 1a64 subs r4, r4, r1
  36138. /* Unknown type */
  36139. LWIP_ASSERT("bad pbuf type", 0);
  36140. return 1;
  36141. }
  36142. /* modify pbuf length fields */
  36143. p->len += header_size_increment;
  36144. 802d01a: 8943 ldrh r3, [r0, #10]
  36145. /* pbuf types refering to external payloads? */
  36146. } else if (type == PBUF_REF || type == PBUF_ROM) {
  36147. /* hide a header in the payload? */
  36148. if ((header_size_increment < 0) && (increment_magnitude <= p->len)) {
  36149. /* increase payload pointer */
  36150. p->payload = (u8_t *)p->payload - header_size_increment;
  36151. 802d01c: 6044 str r4, [r0, #4]
  36152. /* Unknown type */
  36153. LWIP_ASSERT("bad pbuf type", 0);
  36154. return 1;
  36155. }
  36156. /* modify pbuf length fields */
  36157. p->len += header_size_increment;
  36158. 802d01e: 18cb adds r3, r1, r3
  36159. 802d020: 8143 strh r3, [r0, #10]
  36160. p->tot_len += header_size_increment;
  36161. 802d022: 8903 ldrh r3, [r0, #8]
  36162. 802d024: 18c9 adds r1, r1, r3
  36163. 802d026: 8101 strh r1, [r0, #8]
  36164. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n",
  36165. (void *)payload, (void *)p->payload, header_size_increment));
  36166. return 0;
  36167. 802d028: 2000 movs r0, #0
  36168. 802d02a: bd10 pop {r4, pc}
  36169. }
  36170. if (header_size_increment < 0){
  36171. increment_magnitude = -header_size_increment;
  36172. /* Check that we aren't going to move off the end of the pbuf */
  36173. LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
  36174. 802d02c: 2001 movs r0, #1
  36175. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n",
  36176. (void *)payload, (void *)p->payload, header_size_increment));
  36177. return 0;
  36178. }
  36179. 802d02e: bd10 pop {r4, pc}
  36180. 0802d030 <pbuf_free>:
  36181. * 1->1->1 becomes .......
  36182. *
  36183. */
  36184. u8_t
  36185. pbuf_free(struct pbuf *p)
  36186. {
  36187. 802d030: b570 push {r4, r5, r6, lr}
  36188. u16_t type;
  36189. struct pbuf *q;
  36190. u8_t count;
  36191. if (p == NULL) {
  36192. 802d032: 4604 mov r4, r0
  36193. 802d034: b300 cbz r0, 802d078 <pbuf_free+0x48>
  36194. 802d036: 2500 movs r5, #0
  36195. u16_t ref;
  36196. SYS_ARCH_DECL_PROTECT(old_level);
  36197. /* Since decrementing ref cannot be guaranteed to be a single machine operation
  36198. * we must protect it. We put the new ref into a local variable to prevent
  36199. * further protection. */
  36200. SYS_ARCH_PROTECT(old_level);
  36201. 802d038: f007 fc7e bl 8034938 <sys_arch_protect>
  36202. /* all pbufs in a chain are referenced at least once */
  36203. LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
  36204. /* decrease reference count (number of pointers to pbuf) */
  36205. ref = --(p->ref);
  36206. 802d03c: 89e6 ldrh r6, [r4, #14]
  36207. 802d03e: 3e01 subs r6, #1
  36208. 802d040: b2b6 uxth r6, r6
  36209. 802d042: 81e6 strh r6, [r4, #14]
  36210. SYS_ARCH_UNPROTECT(old_level);
  36211. 802d044: f007 fc82 bl 803494c <sys_arch_unprotect>
  36212. /* this pbuf is no longer referenced to? */
  36213. if (ref == 0) {
  36214. 802d048: b9be cbnz r6, 802d07a <pbuf_free+0x4a>
  36215. /* remember next pbuf in chain for next iteration */
  36216. q = p->next;
  36217. LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p));
  36218. type = p->type;
  36219. 802d04a: 7b23 ldrb r3, [r4, #12]
  36220. ref = --(p->ref);
  36221. SYS_ARCH_UNPROTECT(old_level);
  36222. /* this pbuf is no longer referenced to? */
  36223. if (ref == 0) {
  36224. /* remember next pbuf in chain for next iteration */
  36225. q = p->next;
  36226. 802d04c: 6826 ldr r6, [r4, #0]
  36227. pc->custom_free_function(p);
  36228. } else
  36229. #endif /* LWIP_SUPPORT_CUSTOM_PBUF */
  36230. {
  36231. /* is this a pbuf from the pool? */
  36232. if (type == PBUF_POOL) {
  36233. 802d04e: 2b03 cmp r3, #3
  36234. 802d050: d101 bne.n 802d056 <pbuf_free+0x26>
  36235. memp_free(MEMP_PBUF_POOL, p);
  36236. 802d052: 200f movs r0, #15
  36237. 802d054: e003 b.n 802d05e <pbuf_free+0x2e>
  36238. /* is this a ROM or RAM referencing pbuf? */
  36239. } else if (type == PBUF_ROM || type == PBUF_REF) {
  36240. 802d056: 3b01 subs r3, #1
  36241. 802d058: 2b01 cmp r3, #1
  36242. 802d05a: d804 bhi.n 802d066 <pbuf_free+0x36>
  36243. memp_free(MEMP_PBUF, p);
  36244. 802d05c: 200e movs r0, #14
  36245. 802d05e: 4621 mov r1, r4
  36246. 802d060: f7ff fedc bl 802ce1c <memp_free>
  36247. 802d064: e002 b.n 802d06c <pbuf_free+0x3c>
  36248. /* type == PBUF_RAM */
  36249. } else {
  36250. mem_free(p);
  36251. 802d066: 4620 mov r0, r4
  36252. 802d068: f7ff fd70 bl 802cb4c <mem_free>
  36253. }
  36254. }
  36255. count++;
  36256. 802d06c: 3501 adds r5, #1
  36257. 802d06e: b2ed uxtb r5, r5
  36258. p->type == PBUF_REF || p->type == PBUF_POOL);
  36259. count = 0;
  36260. /* de-allocate all consecutive pbufs from the head of the chain that
  36261. * obtain a zero reference count after decrementing*/
  36262. while (p != NULL) {
  36263. 802d070: 4634 mov r4, r6
  36264. 802d072: 2e00 cmp r6, #0
  36265. 802d074: d1e0 bne.n 802d038 <pbuf_free+0x8>
  36266. 802d076: e000 b.n 802d07a <pbuf_free+0x4a>
  36267. if (p == NULL) {
  36268. LWIP_ASSERT("p != NULL", p != NULL);
  36269. /* if assertions are disabled, proceed with debug output */
  36270. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  36271. ("pbuf_free(p == NULL) was called.\n"));
  36272. return 0;
  36273. 802d078: 4605 mov r5, r0
  36274. }
  36275. }
  36276. PERF_STOP("pbuf_free");
  36277. /* return number of de-allocated pbufs */
  36278. return count;
  36279. }
  36280. 802d07a: 4628 mov r0, r5
  36281. 802d07c: bd70 pop {r4, r5, r6, pc}
  36282. 0802d07e <pbuf_realloc>:
  36283. *
  36284. * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain).
  36285. */
  36286. void
  36287. pbuf_realloc(struct pbuf *p, u16_t new_len)
  36288. {
  36289. 802d07e: b538 push {r3, r4, r5, lr}
  36290. p->type == PBUF_ROM ||
  36291. p->type == PBUF_RAM ||
  36292. p->type == PBUF_REF);
  36293. /* desired length larger than current length? */
  36294. if (new_len >= p->tot_len) {
  36295. 802d080: 8903 ldrh r3, [r0, #8]
  36296. 802d082: 4299 cmp r1, r3
  36297. 802d084: d220 bcs.n 802d0c8 <pbuf_realloc+0x4a>
  36298. return;
  36299. }
  36300. /* the pbuf chain grows by (new_len - p->tot_len) bytes
  36301. * (which may be negative in case of shrinking) */
  36302. grow = new_len - p->tot_len;
  36303. 802d086: 1aca subs r2, r1, r3
  36304. /* first, step over any pbufs that should remain in the chain */
  36305. rem_len = new_len;
  36306. q = p;
  36307. /* should this pbuf be kept? */
  36308. while (rem_len > q->len) {
  36309. 802d088: 460d mov r5, r1
  36310. 802d08a: 4604 mov r4, r0
  36311. 802d08c: e005 b.n 802d09a <pbuf_realloc+0x1c>
  36312. /* decrease remaining length by pbuf length */
  36313. rem_len -= q->len;
  36314. 802d08e: 1aed subs r5, r5, r3
  36315. /* decrease total length indicator */
  36316. LWIP_ASSERT("grow < max_u16_t", grow < 0xffff);
  36317. q->tot_len += (u16_t)grow;
  36318. 802d090: 8923 ldrh r3, [r4, #8]
  36319. 802d092: 18d3 adds r3, r2, r3
  36320. 802d094: 8123 strh r3, [r4, #8]
  36321. /* proceed to next pbuf in chain */
  36322. q = q->next;
  36323. 802d096: 6824 ldr r4, [r4, #0]
  36324. rem_len = new_len;
  36325. q = p;
  36326. /* should this pbuf be kept? */
  36327. while (rem_len > q->len) {
  36328. /* decrease remaining length by pbuf length */
  36329. rem_len -= q->len;
  36330. 802d098: b2ad uxth r5, r5
  36331. /* first, step over any pbufs that should remain in the chain */
  36332. rem_len = new_len;
  36333. q = p;
  36334. /* should this pbuf be kept? */
  36335. while (rem_len > q->len) {
  36336. 802d09a: 8963 ldrh r3, [r4, #10]
  36337. 802d09c: 429d cmp r5, r3
  36338. 802d09e: d8f6 bhi.n 802d08e <pbuf_realloc+0x10>
  36339. /* we have now reached the new last pbuf (in q) */
  36340. /* rem_len == desired length for pbuf q */
  36341. /* shrink allocated memory for PBUF_RAM */
  36342. /* (other types merely adjust their length fields */
  36343. if ((q->type == PBUF_RAM) && (rem_len != q->len)) {
  36344. 802d0a0: 7b22 ldrb r2, [r4, #12]
  36345. 802d0a2: b94a cbnz r2, 802d0b8 <pbuf_realloc+0x3a>
  36346. 802d0a4: 429d cmp r5, r3
  36347. 802d0a6: d007 beq.n 802d0b8 <pbuf_realloc+0x3a>
  36348. /* reallocate and adjust the length of the pbuf that will be split */
  36349. q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len);
  36350. 802d0a8: 6863 ldr r3, [r4, #4]
  36351. 802d0aa: 1b1b subs r3, r3, r4
  36352. 802d0ac: 18e9 adds r1, r5, r3
  36353. 802d0ae: 4620 mov r0, r4
  36354. 802d0b0: b289 uxth r1, r1
  36355. 802d0b2: f7ff fda5 bl 802cc00 <mem_trim>
  36356. 802d0b6: 4604 mov r4, r0
  36357. /* adjust length fields for new last pbuf */
  36358. q->len = rem_len;
  36359. q->tot_len = q->len;
  36360. /* any remaining pbufs in chain? */
  36361. if (q->next != NULL) {
  36362. 802d0b8: 6820 ldr r0, [r4, #0]
  36363. /* reallocate and adjust the length of the pbuf that will be split */
  36364. q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len);
  36365. LWIP_ASSERT("mem_trim returned q == NULL", q != NULL);
  36366. }
  36367. /* adjust length fields for new last pbuf */
  36368. q->len = rem_len;
  36369. 802d0ba: 8165 strh r5, [r4, #10]
  36370. q->tot_len = q->len;
  36371. 802d0bc: 8125 strh r5, [r4, #8]
  36372. /* any remaining pbufs in chain? */
  36373. if (q->next != NULL) {
  36374. 802d0be: b108 cbz r0, 802d0c4 <pbuf_realloc+0x46>
  36375. /* free remaining pbufs in chain */
  36376. pbuf_free(q->next);
  36377. 802d0c0: f7ff ffb6 bl 802d030 <pbuf_free>
  36378. }
  36379. /* q is last packet in chain */
  36380. q->next = NULL;
  36381. 802d0c4: 2300 movs r3, #0
  36382. 802d0c6: 6023 str r3, [r4, #0]
  36383. 802d0c8: bd38 pop {r3, r4, r5, pc}
  36384. 0802d0ca <pbuf_alloc>:
  36385. * @return the allocated pbuf. If multiple pbufs where allocated, this
  36386. * is the first pbuf of a pbuf chain.
  36387. */
  36388. struct pbuf *
  36389. pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
  36390. {
  36391. 802d0ca: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  36392. 802d0ce: 460d mov r5, r1
  36393. 802d0d0: 4617 mov r7, r2
  36394. u16_t offset;
  36395. s32_t rem_len; /* remaining length */
  36396. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length));
  36397. /* determine header offset */
  36398. switch (layer) {
  36399. 802d0d2: 2803 cmp r0, #3
  36400. 802d0d4: d87c bhi.n 802d1d0 <pbuf_alloc+0x106>
  36401. 802d0d6: e8df f000 tbb [pc, r0]
  36402. 802d0da: 0802 .short 0x0802
  36403. 802d0dc: 0604 .short 0x0604
  36404. case PBUF_TRANSPORT:
  36405. /* add room for transport (often TCP) layer header */
  36406. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
  36407. 802d0de: 2636 movs r6, #54 ; 0x36
  36408. 802d0e0: e004 b.n 802d0ec <pbuf_alloc+0x22>
  36409. /* add room for IP layer header */
  36410. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN;
  36411. break;
  36412. case PBUF_LINK:
  36413. /* add room for link layer header */
  36414. offset = PBUF_LINK_HLEN;
  36415. 802d0e2: 260e movs r6, #14
  36416. break;
  36417. 802d0e4: e002 b.n 802d0ec <pbuf_alloc+0x22>
  36418. case PBUF_RAW:
  36419. offset = 0;
  36420. 802d0e6: 2600 movs r6, #0
  36421. break;
  36422. 802d0e8: e000 b.n 802d0ec <pbuf_alloc+0x22>
  36423. /* add room for transport (often TCP) layer header */
  36424. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
  36425. break;
  36426. case PBUF_IP:
  36427. /* add room for IP layer header */
  36428. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN;
  36429. 802d0ea: 2622 movs r6, #34 ; 0x22
  36430. default:
  36431. LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0);
  36432. return NULL;
  36433. }
  36434. switch (type) {
  36435. 802d0ec: 2f03 cmp r7, #3
  36436. 802d0ee: d86f bhi.n 802d1d0 <pbuf_alloc+0x106>
  36437. 802d0f0: e8df f007 tbb [pc, r7]
  36438. 802d0f4: 025e5e46 .word 0x025e5e46
  36439. case PBUF_POOL:
  36440. /* allocate head of pbuf chain into p */
  36441. p = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
  36442. 802d0f8: 200f movs r0, #15
  36443. 802d0fa: f7ff fe79 bl 802cdf0 <memp_malloc>
  36444. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
  36445. if (p == NULL) {
  36446. 802d0fe: 4604 mov r4, r0
  36447. 802d100: b900 cbnz r0, 802d104 <pbuf_alloc+0x3a>
  36448. 802d102: e065 b.n 802d1d0 <pbuf_alloc+0x106>
  36449. }
  36450. p->type = type;
  36451. p->next = NULL;
  36452. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  36453. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  36454. 802d104: 1982 adds r2, r0, r6
  36455. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  36456. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  36457. /* the total length of the pbuf chain is the requested size */
  36458. p->tot_len = length;
  36459. /* set the length of the first pbuf in the chain */
  36460. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  36461. 802d106: 3603 adds r6, #3
  36462. 802d108: f026 0603 bic.w r6, r6, #3
  36463. }
  36464. p->type = type;
  36465. p->next = NULL;
  36466. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  36467. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  36468. 802d10c: 3213 adds r2, #19
  36469. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  36470. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  36471. /* the total length of the pbuf chain is the requested size */
  36472. p->tot_len = length;
  36473. /* set the length of the first pbuf in the chain */
  36474. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  36475. 802d10e: f5c6 66c0 rsb r6, r6, #1536 ; 0x600
  36476. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
  36477. if (p == NULL) {
  36478. PBUF_POOL_IS_EMPTY();
  36479. return NULL;
  36480. }
  36481. p->type = type;
  36482. 802d112: 2303 movs r3, #3
  36483. p->next = NULL;
  36484. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  36485. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  36486. 802d114: f022 0203 bic.w r2, r2, #3
  36487. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  36488. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  36489. /* the total length of the pbuf chain is the requested size */
  36490. p->tot_len = length;
  36491. /* set the length of the first pbuf in the chain */
  36492. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  36493. 802d118: 3604 adds r6, #4
  36494. 802d11a: 42ae cmp r6, r5
  36495. 802d11c: bfa8 it ge
  36496. 802d11e: 462e movge r6, r5
  36497. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
  36498. if (p == NULL) {
  36499. PBUF_POOL_IS_EMPTY();
  36500. return NULL;
  36501. }
  36502. p->type = type;
  36503. 802d120: 7303 strb r3, [r0, #12]
  36504. p->next = NULL;
  36505. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  36506. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  36507. 802d122: 6042 str r2, [r0, #4]
  36508. if (p == NULL) {
  36509. PBUF_POOL_IS_EMPTY();
  36510. return NULL;
  36511. }
  36512. p->type = type;
  36513. p->next = NULL;
  36514. 802d124: 2300 movs r3, #0
  36515. ((u8_t*)p->payload + p->len <=
  36516. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  36517. LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
  36518. (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );
  36519. /* set reference count (needed here in case we fail) */
  36520. p->ref = 1;
  36521. 802d126: 2201 movs r2, #1
  36522. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  36523. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  36524. /* the total length of the pbuf chain is the requested size */
  36525. p->tot_len = length;
  36526. /* set the length of the first pbuf in the chain */
  36527. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  36528. 802d128: 8146 strh r6, [r0, #10]
  36529. if (p == NULL) {
  36530. PBUF_POOL_IS_EMPTY();
  36531. return NULL;
  36532. }
  36533. p->type = type;
  36534. p->next = NULL;
  36535. 802d12a: 6003 str r3, [r0, #0]
  36536. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  36537. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  36538. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  36539. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  36540. /* the total length of the pbuf chain is the requested size */
  36541. p->tot_len = length;
  36542. 802d12c: 8105 strh r5, [r0, #8]
  36543. ((u8_t*)p->payload + p->len <=
  36544. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  36545. LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
  36546. (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );
  36547. /* set reference count (needed here in case we fail) */
  36548. p->ref = 1;
  36549. 802d12e: 81c2 strh r2, [r0, #14]
  36550. /* now allocate the tail of the pbuf chain */
  36551. /* remember first pbuf for linkage in next iteration */
  36552. r = p;
  36553. /* remaining length to be allocated */
  36554. rem_len = length - p->len;
  36555. 802d130: 1bae subs r6, r5, r6
  36556. /* any remaining pbufs to be allocated? */
  36557. while (rem_len > 0) {
  36558. 802d132: 4607 mov r7, r0
  36559. 802d134: 4698 mov r8, r3
  36560. r->next = q;
  36561. /* set total length of this pbuf and next in chain */
  36562. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  36563. q->tot_len = (u16_t)rem_len;
  36564. /* this pbuf length is pool size, unless smaller sized tail */
  36565. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  36566. 802d136: f240 6903 movw r9, #1539 ; 0x603
  36567. 802d13a: f240 6a04 movw sl, #1540 ; 0x604
  36568. /* remember first pbuf for linkage in next iteration */
  36569. r = p;
  36570. /* remaining length to be allocated */
  36571. rem_len = length - p->len;
  36572. /* any remaining pbufs to be allocated? */
  36573. while (rem_len > 0) {
  36574. 802d13e: e01c b.n 802d17a <pbuf_alloc+0xb0>
  36575. q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
  36576. 802d140: 200f movs r0, #15
  36577. 802d142: f7ff fe55 bl 802cdf0 <memp_malloc>
  36578. if (q == NULL) {
  36579. 802d146: 4605 mov r5, r0
  36580. 802d148: b918 cbnz r0, 802d152 <pbuf_alloc+0x88>
  36581. PBUF_POOL_IS_EMPTY();
  36582. /* free chain so far allocated */
  36583. pbuf_free(p);
  36584. 802d14a: 4620 mov r0, r4
  36585. 802d14c: f7ff ff70 bl 802d030 <pbuf_free>
  36586. 802d150: e03e b.n 802d1d0 <pbuf_alloc+0x106>
  36587. /* bail out unsuccesfully */
  36588. return NULL;
  36589. }
  36590. q->type = type;
  36591. 802d152: 2303 movs r3, #3
  36592. /* set total length of this pbuf and next in chain */
  36593. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  36594. q->tot_len = (u16_t)rem_len;
  36595. /* this pbuf length is pool size, unless smaller sized tail */
  36596. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  36597. q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF);
  36598. 802d154: f100 0210 add.w r2, r0, #16
  36599. /* free chain so far allocated */
  36600. pbuf_free(p);
  36601. /* bail out unsuccesfully */
  36602. return NULL;
  36603. }
  36604. q->type = type;
  36605. 802d158: 7303 strb r3, [r0, #12]
  36606. q->next = NULL;
  36607. /* make previous pbuf point to this pbuf */
  36608. r->next = q;
  36609. /* set total length of this pbuf and next in chain */
  36610. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  36611. q->tot_len = (u16_t)rem_len;
  36612. 802d15a: b2b3 uxth r3, r6
  36613. 802d15c: 8103 strh r3, [r0, #8]
  36614. /* this pbuf length is pool size, unless smaller sized tail */
  36615. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  36616. q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF);
  36617. 802d15e: 6042 str r2, [r0, #4]
  36618. r->next = q;
  36619. /* set total length of this pbuf and next in chain */
  36620. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  36621. q->tot_len = (u16_t)rem_len;
  36622. /* this pbuf length is pool size, unless smaller sized tail */
  36623. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  36624. 802d160: 454b cmp r3, r9
  36625. 802d162: bf88 it hi
  36626. 802d164: 4653 movhi r3, sl
  36627. LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
  36628. ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
  36629. LWIP_ASSERT("check p->payload + p->len does not overflow pbuf",
  36630. ((u8_t*)p->payload + p->len <=
  36631. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  36632. q->ref = 1;
  36633. 802d166: 2201 movs r2, #1
  36634. /* bail out unsuccesfully */
  36635. return NULL;
  36636. }
  36637. q->type = type;
  36638. q->flags = 0;
  36639. q->next = NULL;
  36640. 802d168: f8c0 8000 str.w r8, [r0]
  36641. pbuf_free(p);
  36642. /* bail out unsuccesfully */
  36643. return NULL;
  36644. }
  36645. q->type = type;
  36646. q->flags = 0;
  36647. 802d16c: f880 800d strb.w r8, [r0, #13]
  36648. q->next = NULL;
  36649. /* make previous pbuf point to this pbuf */
  36650. r->next = q;
  36651. 802d170: 6038 str r0, [r7, #0]
  36652. /* set total length of this pbuf and next in chain */
  36653. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  36654. q->tot_len = (u16_t)rem_len;
  36655. /* this pbuf length is pool size, unless smaller sized tail */
  36656. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  36657. 802d172: 8143 strh r3, [r0, #10]
  36658. LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
  36659. ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
  36660. LWIP_ASSERT("check p->payload + p->len does not overflow pbuf",
  36661. ((u8_t*)p->payload + p->len <=
  36662. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  36663. q->ref = 1;
  36664. 802d174: 81c2 strh r2, [r0, #14]
  36665. /* calculate remaining length to be allocated */
  36666. rem_len -= q->len;
  36667. 802d176: 1af6 subs r6, r6, r3
  36668. 802d178: 4607 mov r7, r0
  36669. /* remember first pbuf for linkage in next iteration */
  36670. r = p;
  36671. /* remaining length to be allocated */
  36672. rem_len = length - p->len;
  36673. /* any remaining pbufs to be allocated? */
  36674. while (rem_len > 0) {
  36675. 802d17a: 2e00 cmp r6, #0
  36676. 802d17c: dce0 bgt.n 802d140 <pbuf_alloc+0x76>
  36677. 802d17e: e022 b.n 802d1c6 <pbuf_alloc+0xfc>
  36678. /*r->next = NULL;*/
  36679. break;
  36680. case PBUF_RAM:
  36681. /* If pbuf is to be allocated in RAM, allocate memory for it. */
  36682. p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));
  36683. 802d180: f106 0013 add.w r0, r6, #19
  36684. 802d184: 1ceb adds r3, r5, #3
  36685. 802d186: f023 0303 bic.w r3, r3, #3
  36686. 802d18a: f020 0003 bic.w r0, r0, #3
  36687. 802d18e: 18c0 adds r0, r0, r3
  36688. 802d190: b280 uxth r0, r0
  36689. 802d192: f7ff fda3 bl 802ccdc <mem_malloc>
  36690. if (p == NULL) {
  36691. 802d196: 4604 mov r4, r0
  36692. 802d198: b1d0 cbz r0, 802d1d0 <pbuf_alloc+0x106>
  36693. return NULL;
  36694. }
  36695. /* Set up internal structure of the pbuf. */
  36696. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset));
  36697. 802d19a: 1986 adds r6, r0, r6
  36698. 802d19c: 3613 adds r6, #19
  36699. p->len = p->tot_len = length;
  36700. p->next = NULL;
  36701. 802d19e: 2300 movs r3, #0
  36702. p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));
  36703. if (p == NULL) {
  36704. return NULL;
  36705. }
  36706. /* Set up internal structure of the pbuf. */
  36707. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset));
  36708. 802d1a0: f026 0603 bic.w r6, r6, #3
  36709. 802d1a4: 6046 str r6, [r0, #4]
  36710. p->len = p->tot_len = length;
  36711. 802d1a6: 8105 strh r5, [r0, #8]
  36712. 802d1a8: 8145 strh r5, [r0, #10]
  36713. p->next = NULL;
  36714. 802d1aa: 6003 str r3, [r0, #0]
  36715. p->type = type;
  36716. 802d1ac: 7303 strb r3, [r0, #12]
  36717. 802d1ae: e00a b.n 802d1c6 <pbuf_alloc+0xfc>
  36718. /* pbuf references existing (non-volatile static constant) ROM payload? */
  36719. case PBUF_ROM:
  36720. /* pbuf references existing (externally allocated) RAM payload? */
  36721. case PBUF_REF:
  36722. /* only allocate memory for the pbuf structure */
  36723. p = (struct pbuf *)memp_malloc(MEMP_PBUF);
  36724. 802d1b0: 200e movs r0, #14
  36725. 802d1b2: f7ff fe1d bl 802cdf0 <memp_malloc>
  36726. if (p == NULL) {
  36727. 802d1b6: 4604 mov r4, r0
  36728. 802d1b8: b150 cbz r0, 802d1d0 <pbuf_alloc+0x106>
  36729. ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n",
  36730. (type == PBUF_ROM) ? "ROM" : "REF"));
  36731. return NULL;
  36732. }
  36733. /* caller must set this field properly, afterwards */
  36734. p->payload = NULL;
  36735. 802d1ba: 2300 movs r3, #0
  36736. 802d1bc: 6043 str r3, [r0, #4]
  36737. p->len = p->tot_len = length;
  36738. 802d1be: 8105 strh r5, [r0, #8]
  36739. 802d1c0: 8145 strh r5, [r0, #10]
  36740. p->next = NULL;
  36741. 802d1c2: 6003 str r3, [r0, #0]
  36742. p->type = type;
  36743. 802d1c4: 7307 strb r7, [r0, #12]
  36744. default:
  36745. LWIP_ASSERT("pbuf_alloc: erroneous type", 0);
  36746. return NULL;
  36747. }
  36748. /* set reference count */
  36749. p->ref = 1;
  36750. 802d1c6: 2301 movs r3, #1
  36751. 802d1c8: 81e3 strh r3, [r4, #14]
  36752. /* set flags */
  36753. p->flags = 0;
  36754. 802d1ca: 2300 movs r3, #0
  36755. 802d1cc: 7363 strb r3, [r4, #13]
  36756. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
  36757. return p;
  36758. 802d1ce: e000 b.n 802d1d2 <pbuf_alloc+0x108>
  36759. p->next = NULL;
  36760. p->type = type;
  36761. break;
  36762. default:
  36763. LWIP_ASSERT("pbuf_alloc: erroneous type", 0);
  36764. return NULL;
  36765. 802d1d0: 2400 movs r4, #0
  36766. p->ref = 1;
  36767. /* set flags */
  36768. p->flags = 0;
  36769. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
  36770. return p;
  36771. }
  36772. 802d1d2: 4620 mov r0, r4
  36773. 802d1d4: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  36774. 0802d1d8 <pbuf_clen>:
  36775. * @return the number of pbufs in a chain
  36776. */
  36777. u8_t
  36778. pbuf_clen(struct pbuf *p)
  36779. {
  36780. 802d1d8: 4603 mov r3, r0
  36781. u8_t len;
  36782. len = 0;
  36783. 802d1da: 2000 movs r0, #0
  36784. while (p != NULL) {
  36785. 802d1dc: e002 b.n 802d1e4 <pbuf_clen+0xc>
  36786. ++len;
  36787. 802d1de: 3001 adds r0, #1
  36788. p = p->next;
  36789. 802d1e0: 681b ldr r3, [r3, #0]
  36790. {
  36791. u8_t len;
  36792. len = 0;
  36793. while (p != NULL) {
  36794. ++len;
  36795. 802d1e2: b2c0 uxtb r0, r0
  36796. pbuf_clen(struct pbuf *p)
  36797. {
  36798. u8_t len;
  36799. len = 0;
  36800. while (p != NULL) {
  36801. 802d1e4: 2b00 cmp r3, #0
  36802. 802d1e6: d1fa bne.n 802d1de <pbuf_clen+0x6>
  36803. ++len;
  36804. p = p->next;
  36805. }
  36806. return len;
  36807. }
  36808. 802d1e8: 4770 bx lr
  36809. 0802d1ea <pbuf_ref>:
  36810. * @param p pbuf to increase reference counter of
  36811. *
  36812. */
  36813. void
  36814. pbuf_ref(struct pbuf *p)
  36815. {
  36816. 802d1ea: b510 push {r4, lr}
  36817. SYS_ARCH_DECL_PROTECT(old_level);
  36818. /* pbuf given? */
  36819. if (p != NULL) {
  36820. 802d1ec: 4604 mov r4, r0
  36821. 802d1ee: b140 cbz r0, 802d202 <pbuf_ref+0x18>
  36822. SYS_ARCH_PROTECT(old_level);
  36823. 802d1f0: f007 fba2 bl 8034938 <sys_arch_protect>
  36824. ++(p->ref);
  36825. 802d1f4: 89e3 ldrh r3, [r4, #14]
  36826. 802d1f6: 3301 adds r3, #1
  36827. 802d1f8: 81e3 strh r3, [r4, #14]
  36828. SYS_ARCH_UNPROTECT(old_level);
  36829. }
  36830. }
  36831. 802d1fa: e8bd 4010 ldmia.w sp!, {r4, lr}
  36832. SYS_ARCH_DECL_PROTECT(old_level);
  36833. /* pbuf given? */
  36834. if (p != NULL) {
  36835. SYS_ARCH_PROTECT(old_level);
  36836. ++(p->ref);
  36837. SYS_ARCH_UNPROTECT(old_level);
  36838. 802d1fe: f007 bba5 b.w 803494c <sys_arch_unprotect>
  36839. 802d202: bd10 pop {r4, pc}
  36840. 0802d204 <pbuf_cat>:
  36841. * @see pbuf_chain()
  36842. */
  36843. void
  36844. pbuf_cat(struct pbuf *h, struct pbuf *t)
  36845. {
  36846. 802d204: b510 push {r4, lr}
  36847. struct pbuf *p;
  36848. LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)",
  36849. 802d206: b168 cbz r0, 802d224 <pbuf_cat+0x20>
  36850. 802d208: b161 cbz r1, 802d224 <pbuf_cat+0x20>
  36851. 802d20a: e003 b.n 802d214 <pbuf_cat+0x10>
  36852. ((h != NULL) && (t != NULL)), return;);
  36853. /* proceed to last pbuf of chain */
  36854. for (p = h; p->next != NULL; p = p->next) {
  36855. /* add total length of second chain to all totals of first chain */
  36856. p->tot_len += t->tot_len;
  36857. 802d20c: 8904 ldrh r4, [r0, #8]
  36858. 802d20e: 191b adds r3, r3, r4
  36859. 802d210: 8103 strh r3, [r0, #8]
  36860. LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)",
  36861. ((h != NULL) && (t != NULL)), return;);
  36862. /* proceed to last pbuf of chain */
  36863. for (p = h; p->next != NULL; p = p->next) {
  36864. 802d212: 4610 mov r0, r2
  36865. 802d214: 6802 ldr r2, [r0, #0]
  36866. 802d216: 890b ldrh r3, [r1, #8]
  36867. 802d218: 2a00 cmp r2, #0
  36868. 802d21a: d1f7 bne.n 802d20c <pbuf_cat+0x8>
  36869. }
  36870. /* { p is last pbuf of first h chain, p->next == NULL } */
  36871. LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len);
  36872. LWIP_ASSERT("p->next == NULL", p->next == NULL);
  36873. /* add total length of second chain to last pbuf total of first chain */
  36874. p->tot_len += t->tot_len;
  36875. 802d21c: 8902 ldrh r2, [r0, #8]
  36876. /* chain last pbuf of head (p) with first of tail (t) */
  36877. p->next = t;
  36878. 802d21e: 6001 str r1, [r0, #0]
  36879. }
  36880. /* { p is last pbuf of first h chain, p->next == NULL } */
  36881. LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len);
  36882. LWIP_ASSERT("p->next == NULL", p->next == NULL);
  36883. /* add total length of second chain to last pbuf total of first chain */
  36884. p->tot_len += t->tot_len;
  36885. 802d220: 189b adds r3, r3, r2
  36886. 802d222: 8103 strh r3, [r0, #8]
  36887. 802d224: bd10 pop {r4, pc}
  36888. 0802d226 <pbuf_chain>:
  36889. * The ->ref field of the first pbuf of the tail chain is adjusted.
  36890. *
  36891. */
  36892. void
  36893. pbuf_chain(struct pbuf *h, struct pbuf *t)
  36894. {
  36895. 802d226: b510 push {r4, lr}
  36896. 802d228: 460c mov r4, r1
  36897. pbuf_cat(h, t);
  36898. 802d22a: f7ff ffeb bl 802d204 <pbuf_cat>
  36899. /* t is now referenced by h */
  36900. pbuf_ref(t);
  36901. 802d22e: 4620 mov r0, r4
  36902. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_chain: %p references %p\n", (void *)h, (void *)t));
  36903. }
  36904. 802d230: e8bd 4010 ldmia.w sp!, {r4, lr}
  36905. void
  36906. pbuf_chain(struct pbuf *h, struct pbuf *t)
  36907. {
  36908. pbuf_cat(h, t);
  36909. /* t is now referenced by h */
  36910. pbuf_ref(t);
  36911. 802d234: f7ff bfd9 b.w 802d1ea <pbuf_ref>
  36912. 0802d238 <pbuf_copy>:
  36913. * ERR_ARG if one of the pbufs is NULL or p_to is not big
  36914. * enough to hold p_from
  36915. */
  36916. err_t
  36917. pbuf_copy(struct pbuf *p_to, struct pbuf *p_from)
  36918. {
  36919. 802d238: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  36920. 802d23c: 460c mov r4, r1
  36921. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n",
  36922. (void*)p_to, (void*)p_from));
  36923. /* is the target big enough to hold the source? */
  36924. LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) &&
  36925. 802d23e: 4605 mov r5, r0
  36926. 802d240: b908 cbnz r0, 802d246 <pbuf_copy+0xe>
  36927. 802d242: 20f2 movs r0, #242 ; 0xf2
  36928. 802d244: e03f b.n 802d2c6 <pbuf_copy+0x8e>
  36929. 802d246: 2900 cmp r1, #0
  36930. 802d248: d0fb beq.n 802d242 <pbuf_copy+0xa>
  36931. 802d24a: 8902 ldrh r2, [r0, #8]
  36932. 802d24c: 890b ldrh r3, [r1, #8]
  36933. 802d24e: 429a cmp r2, r3
  36934. 802d250: d3f7 bcc.n 802d242 <pbuf_copy+0xa>
  36935. 802d252: 2600 movs r6, #0
  36936. 802d254: 4637 mov r7, r6
  36937. /* iterate through pbuf chain */
  36938. do
  36939. {
  36940. /* copy one part of the original chain */
  36941. if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
  36942. 802d256: f8b4 800a ldrh.w r8, [r4, #10]
  36943. 802d25a: 896b ldrh r3, [r5, #10]
  36944. len = p_from->len - offset_from;
  36945. } else {
  36946. /* current p_from does not fit into current p_to */
  36947. len = p_to->len - offset_to;
  36948. }
  36949. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  36950. 802d25c: 6861 ldr r1, [r4, #4]
  36951. 802d25e: 6868 ldr r0, [r5, #4]
  36952. /* iterate through pbuf chain */
  36953. do
  36954. {
  36955. /* copy one part of the original chain */
  36956. if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
  36957. 802d260: ebc6 0808 rsb r8, r6, r8
  36958. 802d264: 1bdb subs r3, r3, r7
  36959. 802d266: 4543 cmp r3, r8
  36960. /* complete current p_from fits into current p_to */
  36961. len = p_from->len - offset_from;
  36962. } else {
  36963. /* current p_from does not fit into current p_to */
  36964. len = p_to->len - offset_to;
  36965. 802d268: bfb4 ite lt
  36966. 802d26a: fa1f f883 uxthlt.w r8, r3
  36967. do
  36968. {
  36969. /* copy one part of the original chain */
  36970. if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
  36971. /* complete current p_from fits into current p_to */
  36972. len = p_from->len - offset_from;
  36973. 802d26e: fa1f f888 uxthge.w r8, r8
  36974. } else {
  36975. /* current p_from does not fit into current p_to */
  36976. len = p_to->len - offset_to;
  36977. }
  36978. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  36979. 802d272: 19c0 adds r0, r0, r7
  36980. 802d274: 1989 adds r1, r1, r6
  36981. 802d276: 4642 mov r2, r8
  36982. 802d278: f7f4 fb68 bl 802194c <memcpy>
  36983. offset_to += len;
  36984. offset_from += len;
  36985. 802d27c: 4446 add r6, r8
  36986. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  36987. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  36988. if (offset_from >= p_from->len) {
  36989. 802d27e: 8963 ldrh r3, [r4, #10]
  36990. /* current p_from does not fit into current p_to */
  36991. len = p_to->len - offset_to;
  36992. }
  36993. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  36994. offset_to += len;
  36995. offset_from += len;
  36996. 802d280: b2b6 uxth r6, r6
  36997. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  36998. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  36999. if (offset_from >= p_from->len) {
  37000. 802d282: 42b3 cmp r3, r6
  37001. } else {
  37002. /* current p_from does not fit into current p_to */
  37003. len = p_to->len - offset_to;
  37004. }
  37005. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  37006. offset_to += len;
  37007. 802d284: 4447 add r7, r8
  37008. if (offset_from >= p_from->len) {
  37009. /* on to next p_from (if any) */
  37010. offset_from = 0;
  37011. p_from = p_from->next;
  37012. }
  37013. if (offset_to == p_to->len) {
  37014. 802d286: 896b ldrh r3, [r5, #10]
  37015. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  37016. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  37017. if (offset_from >= p_from->len) {
  37018. /* on to next p_from (if any) */
  37019. offset_from = 0;
  37020. p_from = p_from->next;
  37021. 802d288: bf98 it ls
  37022. 802d28a: 6824 ldrls r4, [r4, #0]
  37023. } else {
  37024. /* current p_from does not fit into current p_to */
  37025. len = p_to->len - offset_to;
  37026. }
  37027. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  37028. offset_to += len;
  37029. 802d28c: b2bf uxth r7, r7
  37030. offset_from += len;
  37031. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  37032. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  37033. if (offset_from >= p_from->len) {
  37034. /* on to next p_from (if any) */
  37035. offset_from = 0;
  37036. 802d28e: bf98 it ls
  37037. 802d290: 2600 movls r6, #0
  37038. p_from = p_from->next;
  37039. }
  37040. if (offset_to == p_to->len) {
  37041. 802d292: 42bb cmp r3, r7
  37042. 802d294: d105 bne.n 802d2a2 <pbuf_copy+0x6a>
  37043. /* on to next p_to (if any) */
  37044. offset_to = 0;
  37045. p_to = p_to->next;
  37046. 802d296: 682d ldr r5, [r5, #0]
  37047. LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);
  37048. 802d298: b915 cbnz r5, 802d2a0 <pbuf_copy+0x68>
  37049. 802d29a: 2c00 cmp r4, #0
  37050. 802d29c: d1d1 bne.n 802d242 <pbuf_copy+0xa>
  37051. 802d29e: e00f b.n 802d2c0 <pbuf_copy+0x88>
  37052. offset_from = 0;
  37053. p_from = p_from->next;
  37054. }
  37055. if (offset_to == p_to->len) {
  37056. /* on to next p_to (if any) */
  37057. offset_to = 0;
  37058. 802d2a0: 2700 movs r7, #0
  37059. p_to = p_to->next;
  37060. LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);
  37061. }
  37062. if((p_from != NULL) && (p_from->len == p_from->tot_len)) {
  37063. 802d2a2: b12c cbz r4, 802d2b0 <pbuf_copy+0x78>
  37064. 802d2a4: 8962 ldrh r2, [r4, #10]
  37065. 802d2a6: 8923 ldrh r3, [r4, #8]
  37066. 802d2a8: 429a cmp r2, r3
  37067. 802d2aa: d101 bne.n 802d2b0 <pbuf_copy+0x78>
  37068. /* don't copy more than one packet! */
  37069. LWIP_ERROR("pbuf_copy() does not allow packet queues!\n",
  37070. 802d2ac: 6823 ldr r3, [r4, #0]
  37071. 802d2ae: b94b cbnz r3, 802d2c4 <pbuf_copy+0x8c>
  37072. (p_from->next == NULL), return ERR_VAL;);
  37073. }
  37074. if((p_to != NULL) && (p_to->len == p_to->tot_len)) {
  37075. 802d2b0: 896a ldrh r2, [r5, #10]
  37076. 802d2b2: 892b ldrh r3, [r5, #8]
  37077. 802d2b4: 429a cmp r2, r3
  37078. 802d2b6: d101 bne.n 802d2bc <pbuf_copy+0x84>
  37079. /* don't copy more than one packet! */
  37080. LWIP_ERROR("pbuf_copy() does not allow packet queues!\n",
  37081. 802d2b8: 682b ldr r3, [r5, #0]
  37082. 802d2ba: b91b cbnz r3, 802d2c4 <pbuf_copy+0x8c>
  37083. (p_to->next == NULL), return ERR_VAL;);
  37084. }
  37085. } while (p_from);
  37086. 802d2bc: 2c00 cmp r4, #0
  37087. 802d2be: d1ca bne.n 802d256 <pbuf_copy+0x1e>
  37088. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n"));
  37089. return ERR_OK;
  37090. 802d2c0: 4620 mov r0, r4
  37091. 802d2c2: e000 b.n 802d2c6 <pbuf_copy+0x8e>
  37092. LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);
  37093. }
  37094. if((p_from != NULL) && (p_from->len == p_from->tot_len)) {
  37095. /* don't copy more than one packet! */
  37096. LWIP_ERROR("pbuf_copy() does not allow packet queues!\n",
  37097. 802d2c4: 20fa movs r0, #250 ; 0xfa
  37098. (p_to->next == NULL), return ERR_VAL;);
  37099. }
  37100. } while (p_from);
  37101. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n"));
  37102. return ERR_OK;
  37103. }
  37104. 802d2c6: b240 sxtb r0, r0
  37105. 802d2c8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  37106. 0802d2cc <pbuf_copy_partial>:
  37107. * @param offset offset into the packet buffer from where to begin copying len bytes
  37108. * @return the number of bytes copied, or 0 on failure
  37109. */
  37110. u16_t
  37111. pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
  37112. {
  37113. 802d2cc: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  37114. 802d2d0: 4688 mov r8, r1
  37115. 802d2d2: 4616 mov r6, r2
  37116. struct pbuf *p;
  37117. u16_t left;
  37118. u16_t buf_copy_len;
  37119. u16_t copied_total = 0;
  37120. LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;);
  37121. 802d2d4: b328 cbz r0, 802d322 <pbuf_copy_partial+0x56>
  37122. LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;);
  37123. 802d2d6: b331 cbz r1, 802d326 <pbuf_copy_partial+0x5a>
  37124. 802d2d8: 2400 movs r4, #0
  37125. 802d2da: 4605 mov r5, r0
  37126. 802d2dc: 46a1 mov r9, r4
  37127. 802d2de: e01c b.n 802d31a <pbuf_copy_partial+0x4e>
  37128. return 0;
  37129. }
  37130. /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */
  37131. for(p = buf; len != 0 && p != NULL; p = p->next) {
  37132. if ((offset != 0) && (offset >= p->len)) {
  37133. 802d2e0: b12b cbz r3, 802d2ee <pbuf_copy_partial+0x22>
  37134. 802d2e2: 896a ldrh r2, [r5, #10]
  37135. 802d2e4: 4293 cmp r3, r2
  37136. 802d2e6: d302 bcc.n 802d2ee <pbuf_copy_partial+0x22>
  37137. /* don't copy from this buffer -> on to the next */
  37138. offset -= p->len;
  37139. 802d2e8: 1a9b subs r3, r3, r2
  37140. 802d2ea: b29b uxth r3, r3
  37141. 802d2ec: e014 b.n 802d318 <pbuf_copy_partial+0x4c>
  37142. } else {
  37143. /* copy from this buffer. maybe only partially. */
  37144. buf_copy_len = p->len - offset;
  37145. 802d2ee: 896f ldrh r7, [r5, #10]
  37146. if (buf_copy_len > len)
  37147. buf_copy_len = len;
  37148. /* copy the necessary parts of the buffer */
  37149. MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);
  37150. 802d2f0: 6869 ldr r1, [r5, #4]
  37151. if ((offset != 0) && (offset >= p->len)) {
  37152. /* don't copy from this buffer -> on to the next */
  37153. offset -= p->len;
  37154. } else {
  37155. /* copy from this buffer. maybe only partially. */
  37156. buf_copy_len = p->len - offset;
  37157. 802d2f2: 1aff subs r7, r7, r3
  37158. 802d2f4: b2bf uxth r7, r7
  37159. 802d2f6: 42b7 cmp r7, r6
  37160. 802d2f8: bf28 it cs
  37161. 802d2fa: 4637 movcs r7, r6
  37162. if (buf_copy_len > len)
  37163. buf_copy_len = len;
  37164. /* copy the necessary parts of the buffer */
  37165. MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);
  37166. 802d2fc: eb08 0009 add.w r0, r8, r9
  37167. 802d300: 18c9 adds r1, r1, r3
  37168. 802d302: 463a mov r2, r7
  37169. copied_total += buf_copy_len;
  37170. 802d304: 193c adds r4, r7, r4
  37171. left += buf_copy_len;
  37172. 802d306: 44b9 add r9, r7
  37173. len -= buf_copy_len;
  37174. 802d308: 1bf6 subs r6, r6, r7
  37175. /* copy from this buffer. maybe only partially. */
  37176. buf_copy_len = p->len - offset;
  37177. if (buf_copy_len > len)
  37178. buf_copy_len = len;
  37179. /* copy the necessary parts of the buffer */
  37180. MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);
  37181. 802d30a: f7f4 fb1f bl 802194c <memcpy>
  37182. copied_total += buf_copy_len;
  37183. 802d30e: b2a4 uxth r4, r4
  37184. left += buf_copy_len;
  37185. 802d310: fa1f f989 uxth.w r9, r9
  37186. len -= buf_copy_len;
  37187. 802d314: b2b6 uxth r6, r6
  37188. offset = 0;
  37189. 802d316: 2300 movs r3, #0
  37190. if((buf == NULL) || (dataptr == NULL)) {
  37191. return 0;
  37192. }
  37193. /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */
  37194. for(p = buf; len != 0 && p != NULL; p = p->next) {
  37195. 802d318: 682d ldr r5, [r5, #0]
  37196. 802d31a: b12e cbz r6, 802d328 <pbuf_copy_partial+0x5c>
  37197. 802d31c: 2d00 cmp r5, #0
  37198. 802d31e: d1df bne.n 802d2e0 <pbuf_copy_partial+0x14>
  37199. 802d320: e002 b.n 802d328 <pbuf_copy_partial+0x5c>
  37200. struct pbuf *p;
  37201. u16_t left;
  37202. u16_t buf_copy_len;
  37203. u16_t copied_total = 0;
  37204. LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;);
  37205. 802d322: 4604 mov r4, r0
  37206. 802d324: e000 b.n 802d328 <pbuf_copy_partial+0x5c>
  37207. 802d326: 460c mov r4, r1
  37208. len -= buf_copy_len;
  37209. offset = 0;
  37210. }
  37211. }
  37212. return copied_total;
  37213. }
  37214. 802d328: 4620 mov r0, r4
  37215. 802d32a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  37216. 802d32e: 0000 movs r0, r0
  37217. 0802d330 <raw_input>:
  37218. * caller).
  37219. *
  37220. */
  37221. u8_t
  37222. raw_input(struct pbuf *p, struct netif *inp)
  37223. {
  37224. 802d330: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  37225. u8_t eaten = 0;
  37226. LWIP_UNUSED_ARG(inp);
  37227. iphdr = (struct ip_hdr *)p->payload;
  37228. proto = IPH_PROTO(iphdr);
  37229. 802d334: 6843 ldr r3, [r0, #4]
  37230. /* loop through all raw pcbs until the packet is eaten by one */
  37231. /* this allows multiple pcbs to match against the packet by design */
  37232. while ((eaten == 0) && (pcb != NULL)) {
  37233. if ((pcb->protocol == proto) &&
  37234. (ip_addr_isany(&pcb->local_ip) ||
  37235. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest))) {
  37236. 802d336: f8df a074 ldr.w sl, [pc, #116] ; 802d3ac <raw_input+0x7c>
  37237. u8_t eaten = 0;
  37238. LWIP_UNUSED_ARG(inp);
  37239. iphdr = (struct ip_hdr *)p->payload;
  37240. proto = IPH_PROTO(iphdr);
  37241. 802d33a: f893 9009 ldrb.w r9, [r3, #9]
  37242. prev = NULL;
  37243. pcb = raw_pcbs;
  37244. 802d33e: 4b19 ldr r3, [pc, #100] ; (802d3a4 <raw_input+0x74>)
  37245. * caller).
  37246. *
  37247. */
  37248. u8_t
  37249. raw_input(struct pbuf *p, struct netif *inp)
  37250. {
  37251. 802d340: 4606 mov r6, r0
  37252. iphdr = (struct ip_hdr *)p->payload;
  37253. proto = IPH_PROTO(iphdr);
  37254. prev = NULL;
  37255. pcb = raw_pcbs;
  37256. 802d342: 681c ldr r4, [r3, #0]
  37257. LWIP_UNUSED_ARG(inp);
  37258. iphdr = (struct ip_hdr *)p->payload;
  37259. proto = IPH_PROTO(iphdr);
  37260. prev = NULL;
  37261. 802d344: 2500 movs r5, #0
  37262. eaten = 1;
  37263. if (prev != NULL) {
  37264. /* move the pcb to the front of raw_pcbs so that is
  37265. found faster next time */
  37266. prev->next = pcb->next;
  37267. pcb->next = raw_pcbs;
  37268. 802d346: 4698 mov r8, r3
  37269. 802d348: e023 b.n 802d392 <raw_input+0x62>
  37270. prev = NULL;
  37271. pcb = raw_pcbs;
  37272. /* loop through all raw pcbs until the packet is eaten by one */
  37273. /* this allows multiple pcbs to match against the packet by design */
  37274. while ((eaten == 0) && (pcb != NULL)) {
  37275. if ((pcb->protocol == proto) &&
  37276. 802d34a: 7c23 ldrb r3, [r4, #16]
  37277. 802d34c: 454b cmp r3, r9
  37278. 802d34e: d118 bne.n 802d382 <raw_input+0x52>
  37279. (ip_addr_isany(&pcb->local_ip) ||
  37280. 802d350: 6823 ldr r3, [r4, #0]
  37281. 802d352: b11b cbz r3, 802d35c <raw_input+0x2c>
  37282. 802d354: f8da 2000 ldr.w r2, [sl]
  37283. 802d358: 4293 cmp r3, r2
  37284. 802d35a: d112 bne.n 802d382 <raw_input+0x52>
  37285. /* broadcast filter? */
  37286. if (ip_get_option(pcb, SOF_BROADCAST) || !ip_addr_isbroadcast(&current_iphdr_dest, inp))
  37287. #endif /* IP_SOF_BROADCAST_RECV */
  37288. {
  37289. /* receive callback function available? */
  37290. if (pcb->recv != NULL) {
  37291. 802d35c: 6967 ldr r7, [r4, #20]
  37292. 802d35e: b187 cbz r7, 802d382 <raw_input+0x52>
  37293. /* the receive callback function did not eat the packet? */
  37294. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  37295. 802d360: 69a0 ldr r0, [r4, #24]
  37296. 802d362: 4b11 ldr r3, [pc, #68] ; (802d3a8 <raw_input+0x78>)
  37297. 802d364: 4621 mov r1, r4
  37298. 802d366: 4632 mov r2, r6
  37299. 802d368: 47b8 blx r7
  37300. 802d36a: b150 cbz r0, 802d382 <raw_input+0x52>
  37301. /* receive function ate the packet */
  37302. p = NULL;
  37303. eaten = 1;
  37304. if (prev != NULL) {
  37305. 802d36c: b15d cbz r5, 802d386 <raw_input+0x56>
  37306. /* move the pcb to the front of raw_pcbs so that is
  37307. found faster next time */
  37308. prev->next = pcb->next;
  37309. 802d36e: 68e3 ldr r3, [r4, #12]
  37310. 802d370: 60eb str r3, [r5, #12]
  37311. pcb->next = raw_pcbs;
  37312. 802d372: f8d8 3000 ldr.w r3, [r8]
  37313. raw_pcbs = pcb;
  37314. 802d376: f8c8 4000 str.w r4, [r8]
  37315. eaten = 1;
  37316. if (prev != NULL) {
  37317. /* move the pcb to the front of raw_pcbs so that is
  37318. found faster next time */
  37319. prev->next = pcb->next;
  37320. pcb->next = raw_pcbs;
  37321. 802d37a: 60e3 str r3, [r4, #12]
  37322. /* receive callback function available? */
  37323. if (pcb->recv != NULL) {
  37324. /* the receive callback function did not eat the packet? */
  37325. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  37326. /* receive function ate the packet */
  37327. p = NULL;
  37328. 802d37c: 2600 movs r6, #0
  37329. eaten = 1;
  37330. 802d37e: 2301 movs r3, #1
  37331. 802d380: e003 b.n 802d38a <raw_input+0x5a>
  37332. pcb = raw_pcbs;
  37333. /* loop through all raw pcbs until the packet is eaten by one */
  37334. /* this allows multiple pcbs to match against the packet by design */
  37335. while ((eaten == 0) && (pcb != NULL)) {
  37336. if ((pcb->protocol == proto) &&
  37337. (ip_addr_isany(&pcb->local_ip) ||
  37338. 802d382: 2300 movs r3, #0
  37339. 802d384: e001 b.n 802d38a <raw_input+0x5a>
  37340. if (pcb->recv != NULL) {
  37341. /* the receive callback function did not eat the packet? */
  37342. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  37343. /* receive function ate the packet */
  37344. p = NULL;
  37345. eaten = 1;
  37346. 802d386: 2301 movs r3, #1
  37347. /* receive callback function available? */
  37348. if (pcb->recv != NULL) {
  37349. /* the receive callback function did not eat the packet? */
  37350. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  37351. /* receive function ate the packet */
  37352. p = NULL;
  37353. 802d388: 462e mov r6, r5
  37354. /* no receive callback function was set for this raw PCB */
  37355. }
  37356. /* drop the packet */
  37357. }
  37358. prev = pcb;
  37359. pcb = pcb->next;
  37360. 802d38a: 68e2 ldr r2, [r4, #12]
  37361. 802d38c: 4625 mov r5, r4
  37362. prev = NULL;
  37363. pcb = raw_pcbs;
  37364. /* loop through all raw pcbs until the packet is eaten by one */
  37365. /* this allows multiple pcbs to match against the packet by design */
  37366. while ((eaten == 0) && (pcb != NULL)) {
  37367. 802d38e: b92b cbnz r3, 802d39c <raw_input+0x6c>
  37368. /* no receive callback function was set for this raw PCB */
  37369. }
  37370. /* drop the packet */
  37371. }
  37372. prev = pcb;
  37373. pcb = pcb->next;
  37374. 802d390: 4614 mov r4, r2
  37375. prev = NULL;
  37376. pcb = raw_pcbs;
  37377. /* loop through all raw pcbs until the packet is eaten by one */
  37378. /* this allows multiple pcbs to match against the packet by design */
  37379. while ((eaten == 0) && (pcb != NULL)) {
  37380. 802d392: 2c00 cmp r4, #0
  37381. 802d394: d1d9 bne.n 802d34a <raw_input+0x1a>
  37382. 802d396: 4620 mov r0, r4
  37383. 802d398: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  37384. 802d39c: 2001 movs r0, #1
  37385. }
  37386. prev = pcb;
  37387. pcb = pcb->next;
  37388. }
  37389. return eaten;
  37390. }
  37391. 802d39e: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  37392. 802d3a2: bf00 nop
  37393. 802d3a4: 2000e0e8 .word 0x2000e0e8
  37394. 802d3a8: 20010ffc .word 0x20010ffc
  37395. 802d3ac: 20011004 .word 0x20011004
  37396. 0802d3b0 <tcp_accept_null>:
  37397. LWIP_UNUSED_ARG(arg);
  37398. LWIP_UNUSED_ARG(pcb);
  37399. LWIP_UNUSED_ARG(err);
  37400. return ERR_ABRT;
  37401. }
  37402. 802d3b0: f06f 0009 mvn.w r0, #9
  37403. 802d3b4: 4770 bx lr
  37404. 802d3b6: 0000 movs r0, r0
  37405. 0802d3b8 <tcp_new_port>:
  37406. *
  37407. * @return a new (free) local TCP port number
  37408. */
  37409. static u16_t
  37410. tcp_new_port(void)
  37411. {
  37412. 802d3b8: 4b13 ldr r3, [pc, #76] ; (802d408 <tcp_new_port+0x50>)
  37413. 802d3ba: b570 push {r4, r5, r6, lr}
  37414. 802d3bc: 8818 ldrh r0, [r3, #0]
  37415. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  37416. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  37417. }
  37418. /* Check all PCB lists. */
  37419. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  37420. for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  37421. 802d3be: 4d13 ldr r5, [pc, #76] ; (802d40c <tcp_new_port+0x54>)
  37422. *
  37423. * @return a new (free) local TCP port number
  37424. */
  37425. static u16_t
  37426. tcp_new_port(void)
  37427. {
  37428. 802d3c0: f44f 4280 mov.w r2, #16384 ; 0x4000
  37429. u8_t i;
  37430. u16_t n = 0;
  37431. struct tcp_pcb *pcb;
  37432. again:
  37433. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  37434. 802d3c4: f64f 74ff movw r4, #65535 ; 0xffff
  37435. 802d3c8: 42a0 cmp r0, r4
  37436. 802d3ca: d002 beq.n 802d3d2 <tcp_new_port+0x1a>
  37437. 802d3cc: 3001 adds r0, #1
  37438. 802d3ce: b280 uxth r0, r0
  37439. 802d3d0: e001 b.n 802d3d6 <tcp_new_port+0x1e>
  37440. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  37441. 802d3d2: f44f 4040 mov.w r0, #49152 ; 0xc000
  37442. 802d3d6: 2300 movs r3, #0
  37443. }
  37444. /* Check all PCB lists. */
  37445. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  37446. for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  37447. 802d3d8: 5959 ldr r1, [r3, r5]
  37448. 802d3da: 6809 ldr r1, [r1, #0]
  37449. 802d3dc: e00b b.n 802d3f6 <tcp_new_port+0x3e>
  37450. if (pcb->local_port == tcp_port) {
  37451. 802d3de: 8b4e ldrh r6, [r1, #26]
  37452. 802d3e0: 4286 cmp r6, r0
  37453. 802d3e2: d107 bne.n 802d3f4 <tcp_new_port+0x3c>
  37454. 802d3e4: 3a01 subs r2, #1
  37455. 802d3e6: b292 uxth r2, r2
  37456. if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {
  37457. 802d3e8: 2a00 cmp r2, #0
  37458. 802d3ea: d1ed bne.n 802d3c8 <tcp_new_port+0x10>
  37459. 802d3ec: 4b06 ldr r3, [pc, #24] ; (802d408 <tcp_new_port+0x50>)
  37460. 802d3ee: 8018 strh r0, [r3, #0]
  37461. return 0;
  37462. 802d3f0: 4610 mov r0, r2
  37463. 802d3f2: bd70 pop {r4, r5, r6, pc}
  37464. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  37465. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  37466. }
  37467. /* Check all PCB lists. */
  37468. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  37469. for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  37470. 802d3f4: 68c9 ldr r1, [r1, #12]
  37471. 802d3f6: 2900 cmp r1, #0
  37472. 802d3f8: d1f1 bne.n 802d3de <tcp_new_port+0x26>
  37473. 802d3fa: 3304 adds r3, #4
  37474. again:
  37475. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  37476. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  37477. }
  37478. /* Check all PCB lists. */
  37479. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  37480. 802d3fc: 2b10 cmp r3, #16
  37481. 802d3fe: d1eb bne.n 802d3d8 <tcp_new_port+0x20>
  37482. 802d400: 4b01 ldr r3, [pc, #4] ; (802d408 <tcp_new_port+0x50>)
  37483. 802d402: 8018 strh r0, [r3, #0]
  37484. goto again;
  37485. }
  37486. }
  37487. }
  37488. return tcp_port;
  37489. }
  37490. 802d404: bd70 pop {r4, r5, r6, pc}
  37491. 802d406: bf00 nop
  37492. 802d408: 200015ec .word 0x200015ec
  37493. 802d40c: 0803fe60 .word 0x0803fe60
  37494. 0802d410 <tcp_init>:
  37495. /**
  37496. * Initialize this module.
  37497. */
  37498. void
  37499. tcp_init(void)
  37500. {
  37501. 802d410: 4770 bx lr
  37502. 802d412: 0000 movs r0, r0
  37503. 0802d414 <tcp_bind>:
  37504. * ERR_VAL if bind failed because the PCB is not in a valid state
  37505. * ERR_OK if bound
  37506. */
  37507. err_t
  37508. tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  37509. {
  37510. 802d414: b5f8 push {r3, r4, r5, r6, r7, lr}
  37511. int i;
  37512. int max_pcb_list = NUM_TCP_PCB_LISTS;
  37513. struct tcp_pcb *cpcb;
  37514. LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
  37515. 802d416: 7e03 ldrb r3, [r0, #24]
  37516. * ERR_VAL if bind failed because the PCB is not in a valid state
  37517. * ERR_OK if bound
  37518. */
  37519. err_t
  37520. tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  37521. {
  37522. 802d418: 4604 mov r4, r0
  37523. 802d41a: 460d mov r5, r1
  37524. int i;
  37525. int max_pcb_list = NUM_TCP_PCB_LISTS;
  37526. struct tcp_pcb *cpcb;
  37527. LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
  37528. 802d41c: bb33 cbnz r3, 802d46c <tcp_bind+0x58>
  37529. if (ip_get_option(pcb, SOF_REUSEADDR)) {
  37530. max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT;
  37531. }
  37532. #endif /* SO_REUSE */
  37533. if (port == 0) {
  37534. 802d41e: b91a cbnz r2, 802d428 <tcp_bind+0x14>
  37535. port = tcp_new_port();
  37536. 802d420: f7ff ffca bl 802d3b8 <tcp_new_port>
  37537. if (port == 0) {
  37538. 802d424: 4602 mov r2, r0
  37539. 802d426: b318 cbz r0, 802d470 <tcp_bind+0x5c>
  37540. }
  37541. }
  37542. /* Check if the address already is in use (on all lists) */
  37543. for (i = 0; i < max_pcb_list; i++) {
  37544. for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
  37545. 802d428: 4f14 ldr r7, [pc, #80] ; (802d47c <tcp_bind+0x68>)
  37546. * ERR_VAL if bind failed because the PCB is not in a valid state
  37547. * ERR_OK if bound
  37548. */
  37549. err_t
  37550. tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  37551. {
  37552. 802d42a: 2100 movs r1, #0
  37553. }
  37554. }
  37555. /* Check if the address already is in use (on all lists) */
  37556. for (i = 0; i < max_pcb_list; i++) {
  37557. for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
  37558. 802d42c: 59cb ldr r3, [r1, r7]
  37559. 802d42e: 681b ldr r3, [r3, #0]
  37560. 802d430: e00a b.n 802d448 <tcp_bind+0x34>
  37561. if (cpcb->local_port == port) {
  37562. 802d432: 8b58 ldrh r0, [r3, #26]
  37563. 802d434: 4290 cmp r0, r2
  37564. 802d436: d106 bne.n 802d446 <tcp_bind+0x32>
  37565. tcp_connect. */
  37566. if (!ip_get_option(pcb, SOF_REUSEADDR) ||
  37567. !ip_get_option(cpcb, SOF_REUSEADDR))
  37568. #endif /* SO_REUSE */
  37569. {
  37570. if (ip_addr_isany(&(cpcb->local_ip)) ||
  37571. 802d438: 681e ldr r6, [r3, #0]
  37572. 802d43a: b1de cbz r6, 802d474 <tcp_bind+0x60>
  37573. 802d43c: b1d5 cbz r5, 802d474 <tcp_bind+0x60>
  37574. ip_addr_isany(ipaddr) ||
  37575. 802d43e: 6828 ldr r0, [r5, #0]
  37576. 802d440: b1c0 cbz r0, 802d474 <tcp_bind+0x60>
  37577. 802d442: 4286 cmp r6, r0
  37578. 802d444: d016 beq.n 802d474 <tcp_bind+0x60>
  37579. }
  37580. }
  37581. /* Check if the address already is in use (on all lists) */
  37582. for (i = 0; i < max_pcb_list; i++) {
  37583. for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
  37584. 802d446: 68db ldr r3, [r3, #12]
  37585. 802d448: 2b00 cmp r3, #0
  37586. 802d44a: d1f2 bne.n 802d432 <tcp_bind+0x1e>
  37587. 802d44c: 3104 adds r1, #4
  37588. return ERR_BUF;
  37589. }
  37590. }
  37591. /* Check if the address already is in use (on all lists) */
  37592. for (i = 0; i < max_pcb_list; i++) {
  37593. 802d44e: 2910 cmp r1, #16
  37594. 802d450: d1ec bne.n 802d42c <tcp_bind+0x18>
  37595. }
  37596. }
  37597. }
  37598. }
  37599. if (!ip_addr_isany(ipaddr)) {
  37600. 802d452: b115 cbz r5, 802d45a <tcp_bind+0x46>
  37601. 802d454: 682b ldr r3, [r5, #0]
  37602. 802d456: b103 cbz r3, 802d45a <tcp_bind+0x46>
  37603. pcb->local_ip = *ipaddr;
  37604. 802d458: 6023 str r3, [r4, #0]
  37605. }
  37606. pcb->local_port = port;
  37607. TCP_REG(&tcp_bound_pcbs, pcb);
  37608. 802d45a: 4b09 ldr r3, [pc, #36] ; (802d480 <tcp_bind+0x6c>)
  37609. }
  37610. if (!ip_addr_isany(ipaddr)) {
  37611. pcb->local_ip = *ipaddr;
  37612. }
  37613. pcb->local_port = port;
  37614. 802d45c: 8362 strh r2, [r4, #26]
  37615. TCP_REG(&tcp_bound_pcbs, pcb);
  37616. 802d45e: 681a ldr r2, [r3, #0]
  37617. 802d460: 601c str r4, [r3, #0]
  37618. 802d462: 60e2 str r2, [r4, #12]
  37619. 802d464: f002 f8de bl 802f624 <tcp_timer_needed>
  37620. LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
  37621. return ERR_OK;
  37622. 802d468: 2000 movs r0, #0
  37623. 802d46a: e004 b.n 802d476 <tcp_bind+0x62>
  37624. {
  37625. int i;
  37626. int max_pcb_list = NUM_TCP_PCB_LISTS;
  37627. struct tcp_pcb *cpcb;
  37628. LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
  37629. 802d46c: 20fa movs r0, #250 ; 0xfa
  37630. 802d46e: e002 b.n 802d476 <tcp_bind+0x62>
  37631. #endif /* SO_REUSE */
  37632. if (port == 0) {
  37633. port = tcp_new_port();
  37634. if (port == 0) {
  37635. return ERR_BUF;
  37636. 802d470: 20fe movs r0, #254 ; 0xfe
  37637. 802d472: e000 b.n 802d476 <tcp_bind+0x62>
  37638. #endif /* SO_REUSE */
  37639. {
  37640. if (ip_addr_isany(&(cpcb->local_ip)) ||
  37641. ip_addr_isany(ipaddr) ||
  37642. ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
  37643. return ERR_USE;
  37644. 802d474: 20f8 movs r0, #248 ; 0xf8
  37645. }
  37646. pcb->local_port = port;
  37647. TCP_REG(&tcp_bound_pcbs, pcb);
  37648. LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
  37649. return ERR_OK;
  37650. }
  37651. 802d476: b240 sxtb r0, r0
  37652. 802d478: bdf8 pop {r3, r4, r5, r6, r7, pc}
  37653. 802d47a: bf00 nop
  37654. 802d47c: 0803fe60 .word 0x0803fe60
  37655. 802d480: 20010fec .word 0x20010fec
  37656. 0802d484 <tcp_listen_with_backlog>:
  37657. * called like this:
  37658. * tpcb = tcp_listen(tpcb);
  37659. */
  37660. struct tcp_pcb *
  37661. tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
  37662. {
  37663. 802d484: b538 push {r3, r4, r5, lr}
  37664. struct tcp_pcb_listen *lpcb;
  37665. LWIP_UNUSED_ARG(backlog);
  37666. LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL);
  37667. 802d486: 7e03 ldrb r3, [r0, #24]
  37668. * called like this:
  37669. * tpcb = tcp_listen(tpcb);
  37670. */
  37671. struct tcp_pcb *
  37672. tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
  37673. {
  37674. 802d488: 4604 mov r4, r0
  37675. struct tcp_pcb_listen *lpcb;
  37676. LWIP_UNUSED_ARG(backlog);
  37677. LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL);
  37678. 802d48a: b10b cbz r3, 802d490 <tcp_listen_with_backlog+0xc>
  37679. 802d48c: 2000 movs r0, #0
  37680. 802d48e: bd38 pop {r3, r4, r5, pc}
  37681. }
  37682. }
  37683. }
  37684. }
  37685. #endif /* SO_REUSE */
  37686. lpcb = (struct tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN);
  37687. 802d490: 2003 movs r0, #3
  37688. 802d492: f7ff fcad bl 802cdf0 <memp_malloc>
  37689. if (lpcb == NULL) {
  37690. 802d496: 4605 mov r5, r0
  37691. 802d498: 2800 cmp r0, #0
  37692. 802d49a: d0f7 beq.n 802d48c <tcp_listen_with_backlog+0x8>
  37693. return NULL;
  37694. }
  37695. lpcb->callback_arg = pcb->callback_arg;
  37696. 802d49c: 6923 ldr r3, [r4, #16]
  37697. 802d49e: 6103 str r3, [r0, #16]
  37698. lpcb->local_port = pcb->local_port;
  37699. 802d4a0: 8b63 ldrh r3, [r4, #26]
  37700. 802d4a2: 8343 strh r3, [r0, #26]
  37701. lpcb->state = LISTEN;
  37702. 802d4a4: 2301 movs r3, #1
  37703. 802d4a6: 7603 strb r3, [r0, #24]
  37704. lpcb->prio = pcb->prio;
  37705. 802d4a8: 7e63 ldrb r3, [r4, #25]
  37706. 802d4aa: 7643 strb r3, [r0, #25]
  37707. lpcb->so_options = pcb->so_options;
  37708. ip_set_option(lpcb, SOF_ACCEPTCONN);
  37709. 802d4ac: 7a23 ldrb r3, [r4, #8]
  37710. 802d4ae: f043 0302 orr.w r3, r3, #2
  37711. 802d4b2: 7203 strb r3, [r0, #8]
  37712. lpcb->ttl = pcb->ttl;
  37713. 802d4b4: 7aa3 ldrb r3, [r4, #10]
  37714. 802d4b6: 7283 strb r3, [r0, #10]
  37715. lpcb->tos = pcb->tos;
  37716. 802d4b8: 7a63 ldrb r3, [r4, #9]
  37717. 802d4ba: 7243 strb r3, [r0, #9]
  37718. ip_addr_copy(lpcb->local_ip, pcb->local_ip);
  37719. 802d4bc: 6823 ldr r3, [r4, #0]
  37720. 802d4be: 6003 str r3, [r0, #0]
  37721. if (pcb->local_port != 0) {
  37722. 802d4c0: 8b63 ldrh r3, [r4, #26]
  37723. 802d4c2: b1ab cbz r3, 802d4f0 <tcp_listen_with_backlog+0x6c>
  37724. TCP_RMV(&tcp_bound_pcbs, pcb);
  37725. 802d4c4: 4a11 ldr r2, [pc, #68] ; (802d50c <tcp_listen_with_backlog+0x88>)
  37726. 802d4c6: 6813 ldr r3, [r2, #0]
  37727. 802d4c8: 42a3 cmp r3, r4
  37728. 802d4ca: d101 bne.n 802d4d0 <tcp_listen_with_backlog+0x4c>
  37729. 802d4cc: 68e3 ldr r3, [r4, #12]
  37730. 802d4ce: e00c b.n 802d4ea <tcp_listen_with_backlog+0x66>
  37731. 802d4d0: 4a0f ldr r2, [pc, #60] ; (802d510 <tcp_listen_with_backlog+0x8c>)
  37732. 802d4d2: 6013 str r3, [r2, #0]
  37733. 802d4d4: e007 b.n 802d4e6 <tcp_listen_with_backlog+0x62>
  37734. 802d4d6: 68d9 ldr r1, [r3, #12]
  37735. 802d4d8: 42a1 cmp r1, r4
  37736. 802d4da: d103 bne.n 802d4e4 <tcp_listen_with_backlog+0x60>
  37737. 802d4dc: 6013 str r3, [r2, #0]
  37738. 802d4de: 68e2 ldr r2, [r4, #12]
  37739. 802d4e0: 60da str r2, [r3, #12]
  37740. 802d4e2: e003 b.n 802d4ec <tcp_listen_with_backlog+0x68>
  37741. 802d4e4: 460b mov r3, r1
  37742. 802d4e6: 2b00 cmp r3, #0
  37743. 802d4e8: d1f5 bne.n 802d4d6 <tcp_listen_with_backlog+0x52>
  37744. 802d4ea: 6013 str r3, [r2, #0]
  37745. 802d4ec: 2300 movs r3, #0
  37746. 802d4ee: 60e3 str r3, [r4, #12]
  37747. }
  37748. memp_free(MEMP_TCP_PCB, pcb);
  37749. 802d4f0: 2002 movs r0, #2
  37750. 802d4f2: 4621 mov r1, r4
  37751. 802d4f4: f7ff fc92 bl 802ce1c <memp_free>
  37752. #if LWIP_CALLBACK_API
  37753. lpcb->accept = tcp_accept_null;
  37754. 802d4f8: 4b06 ldr r3, [pc, #24] ; (802d514 <tcp_listen_with_backlog+0x90>)
  37755. 802d4fa: 616b str r3, [r5, #20]
  37756. #endif /* LWIP_CALLBACK_API */
  37757. #if TCP_LISTEN_BACKLOG
  37758. lpcb->accepts_pending = 0;
  37759. lpcb->backlog = (backlog ? backlog : 1);
  37760. #endif /* TCP_LISTEN_BACKLOG */
  37761. TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb);
  37762. 802d4fc: 4b06 ldr r3, [pc, #24] ; (802d518 <tcp_listen_with_backlog+0x94>)
  37763. 802d4fe: 681a ldr r2, [r3, #0]
  37764. 802d500: 601d str r5, [r3, #0]
  37765. 802d502: 60ea str r2, [r5, #12]
  37766. 802d504: f002 f88e bl 802f624 <tcp_timer_needed>
  37767. return (struct tcp_pcb *)lpcb;
  37768. 802d508: 4628 mov r0, r5
  37769. }
  37770. 802d50a: bd38 pop {r3, r4, r5, pc}
  37771. 802d50c: 20010fec .word 0x20010fec
  37772. 802d510: 20010fe8 .word 0x20010fe8
  37773. 802d514: 0802d3b1 .word 0x0802d3b1
  37774. 802d518: 20010fe4 .word 0x20010fe4
  37775. 0802d51c <tcp_update_rcv_ann_wnd>:
  37776. *
  37777. * Returns how much extra window would be advertised if we sent an
  37778. * update now.
  37779. */
  37780. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  37781. {
  37782. 802d51c: b530 push {r4, r5, lr}
  37783. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  37784. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  37785. 802d51e: 6b01 ldr r1, [r0, #48] ; 0x30
  37786. * Returns how much extra window would be advertised if we sent an
  37787. * update now.
  37788. */
  37789. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  37790. {
  37791. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  37792. 802d520: 8d84 ldrh r4, [r0, #44] ; 0x2c
  37793. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  37794. 802d522: 8ec5 ldrh r5, [r0, #54] ; 0x36
  37795. * Returns how much extra window would be advertised if we sent an
  37796. * update now.
  37797. */
  37798. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  37799. {
  37800. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  37801. 802d524: 6a82 ldr r2, [r0, #40] ; 0x28
  37802. *
  37803. * Returns how much extra window would be advertised if we sent an
  37804. * update now.
  37805. */
  37806. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  37807. {
  37808. 802d526: 4603 mov r3, r0
  37809. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  37810. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  37811. 802d528: f640 3068 movw r0, #2920 ; 0xb68
  37812. 802d52c: 4285 cmp r5, r0
  37813. 802d52e: bf28 it cs
  37814. 802d530: 4605 movcs r5, r0
  37815. * Returns how much extra window would be advertised if we sent an
  37816. * update now.
  37817. */
  37818. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  37819. {
  37820. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  37821. 802d532: 1a60 subs r0, r4, r1
  37822. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  37823. 802d534: 1880 adds r0, r0, r2
  37824. 802d536: 1b45 subs r5, r0, r5
  37825. 802d538: 2d00 cmp r5, #0
  37826. 802d53a: db01 blt.n 802d540 <tcp_update_rcv_ann_wnd+0x24>
  37827. /* we can advertise more window */
  37828. pcb->rcv_ann_wnd = pcb->rcv_wnd;
  37829. 802d53c: 85dc strh r4, [r3, #46] ; 0x2e
  37830. return new_right_edge - pcb->rcv_ann_right_edge;
  37831. 802d53e: bd30 pop {r4, r5, pc}
  37832. } else {
  37833. if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
  37834. 802d540: 1a50 subs r0, r2, r1
  37835. 802d542: 2800 cmp r0, #0
  37836. 802d544: f04f 0000 mov.w r0, #0
  37837. 802d548: dd01 ble.n 802d54e <tcp_update_rcv_ann_wnd+0x32>
  37838. /* Can happen due to other end sending out of advertised window,
  37839. * but within actual available (but not yet advertised) window */
  37840. pcb->rcv_ann_wnd = 0;
  37841. 802d54a: 85d8 strh r0, [r3, #46] ; 0x2e
  37842. 802d54c: bd30 pop {r4, r5, pc}
  37843. } else {
  37844. /* keep the right edge of window constant */
  37845. u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
  37846. 802d54e: 1a8a subs r2, r1, r2
  37847. LWIP_ASSERT("new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff);
  37848. pcb->rcv_ann_wnd = (u16_t)new_rcv_ann_wnd;
  37849. 802d550: 85da strh r2, [r3, #46] ; 0x2e
  37850. }
  37851. return 0;
  37852. }
  37853. }
  37854. 802d552: bd30 pop {r4, r5, pc}
  37855. 0802d554 <tcp_recved>:
  37856. LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
  37857. pcb->state != LISTEN);
  37858. LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n",
  37859. len <= 0xffff - pcb->rcv_wnd );
  37860. pcb->rcv_wnd += len;
  37861. 802d554: 8d83 ldrh r3, [r0, #44] ; 0x2c
  37862. 802d556: 18c9 adds r1, r1, r3
  37863. 802d558: b289 uxth r1, r1
  37864. if (pcb->rcv_wnd > TCP_WND) {
  37865. 802d55a: f241 63d0 movw r3, #5840 ; 0x16d0
  37866. 802d55e: 4299 cmp r1, r3
  37867. * @param pcb the tcp_pcb for which data is read
  37868. * @param len the amount of bytes that have been read by the application
  37869. */
  37870. void
  37871. tcp_recved(struct tcp_pcb *pcb, u16_t len)
  37872. {
  37873. 802d560: b510 push {r4, lr}
  37874. LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n",
  37875. len <= 0xffff - pcb->rcv_wnd );
  37876. pcb->rcv_wnd += len;
  37877. if (pcb->rcv_wnd > TCP_WND) {
  37878. pcb->rcv_wnd = TCP_WND;
  37879. 802d562: bf8c ite hi
  37880. 802d564: 8583 strhhi r3, [r0, #44] ; 0x2c
  37881. LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
  37882. pcb->state != LISTEN);
  37883. LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n",
  37884. len <= 0xffff - pcb->rcv_wnd );
  37885. pcb->rcv_wnd += len;
  37886. 802d566: 8581 strhls r1, [r0, #44] ; 0x2c
  37887. * @param pcb the tcp_pcb for which data is read
  37888. * @param len the amount of bytes that have been read by the application
  37889. */
  37890. void
  37891. tcp_recved(struct tcp_pcb *pcb, u16_t len)
  37892. {
  37893. 802d568: 4604 mov r4, r0
  37894. pcb->rcv_wnd += len;
  37895. if (pcb->rcv_wnd > TCP_WND) {
  37896. pcb->rcv_wnd = TCP_WND;
  37897. }
  37898. wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
  37899. 802d56a: f7ff ffd7 bl 802d51c <tcp_update_rcv_ann_wnd>
  37900. /* If the change in the right edge of window is significant (default
  37901. * watermark is TCP_WND/4), then send an explicit update now.
  37902. * Otherwise wait for a packet to be sent in the normal course of
  37903. * events (or more window to be available later) */
  37904. if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
  37905. 802d56e: f240 53b3 movw r3, #1459 ; 0x5b3
  37906. 802d572: 4298 cmp r0, r3
  37907. 802d574: dd08 ble.n 802d588 <tcp_recved+0x34>
  37908. tcp_ack_now(pcb);
  37909. 802d576: 7fa3 ldrb r3, [r4, #30]
  37910. tcp_output(pcb);
  37911. 802d578: 4620 mov r0, r4
  37912. /* If the change in the right edge of window is significant (default
  37913. * watermark is TCP_WND/4), then send an explicit update now.
  37914. * Otherwise wait for a packet to be sent in the normal course of
  37915. * events (or more window to be available later) */
  37916. if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
  37917. tcp_ack_now(pcb);
  37918. 802d57a: f043 0302 orr.w r3, r3, #2
  37919. 802d57e: 77a3 strb r3, [r4, #30]
  37920. tcp_output(pcb);
  37921. }
  37922. LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %"U16_F" bytes, wnd %"U16_F" (%"U16_F").\n",
  37923. len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd));
  37924. }
  37925. 802d580: e8bd 4010 ldmia.w sp!, {r4, lr}
  37926. * watermark is TCP_WND/4), then send an explicit update now.
  37927. * Otherwise wait for a packet to be sent in the normal course of
  37928. * events (or more window to be available later) */
  37929. if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
  37930. tcp_ack_now(pcb);
  37931. tcp_output(pcb);
  37932. 802d584: f001 bd90 b.w 802f0a8 <tcp_output>
  37933. 802d588: bd10 pop {r4, pc}
  37934. 0802d58a <tcp_seg_free>:
  37935. *
  37936. * @param seg single tcp_seg to free
  37937. */
  37938. void
  37939. tcp_seg_free(struct tcp_seg *seg)
  37940. {
  37941. 802d58a: b510 push {r4, lr}
  37942. if (seg != NULL) {
  37943. 802d58c: 4604 mov r4, r0
  37944. 802d58e: b148 cbz r0, 802d5a4 <tcp_seg_free+0x1a>
  37945. if (seg->p != NULL) {
  37946. 802d590: 6840 ldr r0, [r0, #4]
  37947. 802d592: b108 cbz r0, 802d598 <tcp_seg_free+0xe>
  37948. pbuf_free(seg->p);
  37949. 802d594: f7ff fd4c bl 802d030 <pbuf_free>
  37950. #if TCP_DEBUG
  37951. seg->p = NULL;
  37952. #endif /* TCP_DEBUG */
  37953. }
  37954. memp_free(MEMP_TCP_SEG, seg);
  37955. 802d598: 2004 movs r0, #4
  37956. 802d59a: 4621 mov r1, r4
  37957. }
  37958. }
  37959. 802d59c: e8bd 4010 ldmia.w sp!, {r4, lr}
  37960. pbuf_free(seg->p);
  37961. #if TCP_DEBUG
  37962. seg->p = NULL;
  37963. #endif /* TCP_DEBUG */
  37964. }
  37965. memp_free(MEMP_TCP_SEG, seg);
  37966. 802d5a0: f7ff bc3c b.w 802ce1c <memp_free>
  37967. 802d5a4: bd10 pop {r4, pc}
  37968. 0802d5a6 <tcp_segs_free>:
  37969. *
  37970. * @param seg tcp_seg list of TCP segments to free
  37971. */
  37972. void
  37973. tcp_segs_free(struct tcp_seg *seg)
  37974. {
  37975. 802d5a6: b510 push {r4, lr}
  37976. while (seg != NULL) {
  37977. 802d5a8: e003 b.n 802d5b2 <tcp_segs_free+0xc>
  37978. struct tcp_seg *next = seg->next;
  37979. 802d5aa: 6804 ldr r4, [r0, #0]
  37980. tcp_seg_free(seg);
  37981. 802d5ac: f7ff ffed bl 802d58a <tcp_seg_free>
  37982. seg = next;
  37983. 802d5b0: 4620 mov r0, r4
  37984. * @param seg tcp_seg list of TCP segments to free
  37985. */
  37986. void
  37987. tcp_segs_free(struct tcp_seg *seg)
  37988. {
  37989. while (seg != NULL) {
  37990. 802d5b2: 2800 cmp r0, #0
  37991. 802d5b4: d1f9 bne.n 802d5aa <tcp_segs_free+0x4>
  37992. struct tcp_seg *next = seg->next;
  37993. tcp_seg_free(seg);
  37994. seg = next;
  37995. }
  37996. }
  37997. 802d5b6: bd10 pop {r4, pc}
  37998. 0802d5b8 <tcp_arg>:
  37999. void
  38000. tcp_arg(struct tcp_pcb *pcb, void *arg)
  38001. {
  38002. /* This function is allowed to be called for both listen pcbs and
  38003. connection pcbs. */
  38004. pcb->callback_arg = arg;
  38005. 802d5b8: 6101 str r1, [r0, #16]
  38006. 802d5ba: 4770 bx lr
  38007. 0802d5bc <tcp_recv>:
  38008. */
  38009. void
  38010. tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv)
  38011. {
  38012. LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN);
  38013. pcb->recv = recv;
  38014. 802d5bc: 67c1 str r1, [r0, #124] ; 0x7c
  38015. 802d5be: 4770 bx lr
  38016. 0802d5c0 <tcp_sent>:
  38017. */
  38018. void
  38019. tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent)
  38020. {
  38021. LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN);
  38022. pcb->sent = sent;
  38023. 802d5c0: 6781 str r1, [r0, #120] ; 0x78
  38024. 802d5c2: 4770 bx lr
  38025. 0802d5c4 <tcp_err>:
  38026. */
  38027. void
  38028. tcp_err(struct tcp_pcb *pcb, tcp_err_fn err)
  38029. {
  38030. LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN);
  38031. pcb->errf = err;
  38032. 802d5c4: f8c0 1088 str.w r1, [r0, #136] ; 0x88
  38033. 802d5c8: 4770 bx lr
  38034. 0802d5ca <tcp_accept>:
  38035. void
  38036. tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept)
  38037. {
  38038. /* This function is allowed to be called for both listen pcbs and
  38039. connection pcbs. */
  38040. pcb->accept = accept;
  38041. 802d5ca: 6141 str r1, [r0, #20]
  38042. 802d5cc: 4770 bx lr
  38043. 0802d5ce <tcp_poll>:
  38044. void
  38045. tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval)
  38046. {
  38047. LWIP_ASSERT("invalid socket state for poll", pcb->state != LISTEN);
  38048. #if LWIP_CALLBACK_API
  38049. pcb->poll = poll;
  38050. 802d5ce: f8c0 1084 str.w r1, [r0, #132] ; 0x84
  38051. #else /* LWIP_CALLBACK_API */
  38052. LWIP_UNUSED_ARG(poll);
  38053. #endif /* LWIP_CALLBACK_API */
  38054. pcb->pollinterval = interval;
  38055. 802d5d2: f880 2020 strb.w r2, [r0, #32]
  38056. 802d5d6: 4770 bx lr
  38057. 0802d5d8 <tcp_pcb_purge>:
  38058. * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
  38059. */
  38060. void
  38061. tcp_pcb_purge(struct tcp_pcb *pcb)
  38062. {
  38063. if (pcb->state != CLOSED &&
  38064. 802d5d8: 7e03 ldrb r3, [r0, #24]
  38065. *
  38066. * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
  38067. */
  38068. void
  38069. tcp_pcb_purge(struct tcp_pcb *pcb)
  38070. {
  38071. 802d5da: b510 push {r4, lr}
  38072. 802d5dc: 4604 mov r4, r0
  38073. if (pcb->state != CLOSED &&
  38074. 802d5de: b1bb cbz r3, 802d610 <tcp_pcb_purge+0x38>
  38075. 802d5e0: 2b0a cmp r3, #10
  38076. 802d5e2: d015 beq.n 802d610 <tcp_pcb_purge+0x38>
  38077. pcb->state != TIME_WAIT &&
  38078. 802d5e4: 2b01 cmp r3, #1
  38079. 802d5e6: d013 beq.n 802d610 <tcp_pcb_purge+0x38>
  38080. }
  38081. }
  38082. #endif /* TCP_LISTEN_BACKLOG */
  38083. if (pcb->refused_data != NULL) {
  38084. 802d5e8: 6f40 ldr r0, [r0, #116] ; 0x74
  38085. 802d5ea: b118 cbz r0, 802d5f4 <tcp_pcb_purge+0x1c>
  38086. LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n"));
  38087. pbuf_free(pcb->refused_data);
  38088. 802d5ec: f7ff fd20 bl 802d030 <pbuf_free>
  38089. pcb->refused_data = NULL;
  38090. 802d5f0: 2300 movs r3, #0
  38091. 802d5f2: 6763 str r3, [r4, #116] ; 0x74
  38092. pcb->ooseq = NULL;
  38093. #endif /* TCP_QUEUE_OOSEQ */
  38094. /* Stop the retransmission timer as it will expect data on unacked
  38095. queue if it fires */
  38096. pcb->rtime = -1;
  38097. 802d5f4: f64f 73ff movw r3, #65535 ; 0xffff
  38098. 802d5f8: 86a3 strh r3, [r4, #52] ; 0x34
  38099. tcp_segs_free(pcb->unsent);
  38100. 802d5fa: 6ee0 ldr r0, [r4, #108] ; 0x6c
  38101. 802d5fc: f7ff ffd3 bl 802d5a6 <tcp_segs_free>
  38102. tcp_segs_free(pcb->unacked);
  38103. 802d600: 6f20 ldr r0, [r4, #112] ; 0x70
  38104. 802d602: f7ff ffd0 bl 802d5a6 <tcp_segs_free>
  38105. pcb->unacked = pcb->unsent = NULL;
  38106. 802d606: 2300 movs r3, #0
  38107. 802d608: 66e3 str r3, [r4, #108] ; 0x6c
  38108. 802d60a: 6723 str r3, [r4, #112] ; 0x70
  38109. #if TCP_OVERSIZE
  38110. pcb->unsent_oversize = 0;
  38111. 802d60c: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  38112. 802d610: bd10 pop {r4, pc}
  38113. 802d612: 0000 movs r0, r0
  38114. 0802d614 <tcp_slowtmr>:
  38115. u8_t pcb_reset; /* flag if a RST should be sent when removing */
  38116. err_t err;
  38117. err = ERR_OK;
  38118. ++tcp_ticks;
  38119. 802d614: 4b9c ldr r3, [pc, #624] ; (802d888 <tcp_slowtmr+0x274>)
  38120. *
  38121. * Automatically called from tcp_tmr().
  38122. */
  38123. void
  38124. tcp_slowtmr(void)
  38125. {
  38126. 802d616: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  38127. u8_t pcb_reset; /* flag if a RST should be sent when removing */
  38128. err_t err;
  38129. err = ERR_OK;
  38130. ++tcp_ticks;
  38131. 802d61a: 681a ldr r2, [r3, #0]
  38132. err_arg = pcb->callback_arg;
  38133. pcb2 = pcb;
  38134. pcb = pcb->next;
  38135. memp_free(MEMP_TCP_PCB, pcb2);
  38136. tcp_active_pcbs_changed = 0;
  38137. 802d61c: f8df 8284 ldr.w r8, [pc, #644] ; 802d8a4 <tcp_slowtmr+0x290>
  38138. u8_t pcb_reset; /* flag if a RST should be sent when removing */
  38139. err_t err;
  38140. err = ERR_OK;
  38141. ++tcp_ticks;
  38142. 802d620: 3201 adds r2, #1
  38143. 802d622: 601a str r2, [r3, #0]
  38144. ++tcp_timer_ctr;
  38145. 802d624: 4b99 ldr r3, [pc, #612] ; (802d88c <tcp_slowtmr+0x278>)
  38146. 802d626: 781a ldrb r2, [r3, #0]
  38147. 802d628: 3201 adds r2, #1
  38148. 802d62a: 701a strb r2, [r3, #0]
  38149. 802d62c: 46c1 mov r9, r8
  38150. tcp_slowtmr_start:
  38151. /* Steps through all of the active PCBs. */
  38152. prev = NULL;
  38153. pcb = tcp_active_pcbs;
  38154. 802d62e: 4b98 ldr r3, [pc, #608] ; (802d890 <tcp_slowtmr+0x27c>)
  38155. while (pcb != NULL) {
  38156. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
  38157. LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
  38158. LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
  38159. LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
  38160. if (pcb->last_timer == tcp_timer_ctr) {
  38161. 802d630: f8df a258 ldr.w sl, [pc, #600] ; 802d88c <tcp_slowtmr+0x278>
  38162. ++tcp_timer_ctr;
  38163. tcp_slowtmr_start:
  38164. /* Steps through all of the active PCBs. */
  38165. prev = NULL;
  38166. pcb = tcp_active_pcbs;
  38167. 802d634: 681c ldr r4, [r3, #0]
  38168. ++tcp_ticks;
  38169. ++tcp_timer_ctr;
  38170. tcp_slowtmr_start:
  38171. /* Steps through all of the active PCBs. */
  38172. prev = NULL;
  38173. 802d636: 2600 movs r6, #0
  38174. pcb = tcp_active_pcbs;
  38175. if (pcb == NULL) {
  38176. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
  38177. }
  38178. while (pcb != NULL) {
  38179. 802d638: e0ff b.n 802d83a <tcp_slowtmr+0x226>
  38180. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
  38181. LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
  38182. LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
  38183. LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
  38184. if (pcb->last_timer == tcp_timer_ctr) {
  38185. 802d63a: f89a 3000 ldrb.w r3, [sl]
  38186. 802d63e: f894 2021 ldrb.w r2, [r4, #33] ; 0x21
  38187. 802d642: 429a cmp r2, r3
  38188. 802d644: d101 bne.n 802d64a <tcp_slowtmr+0x36>
  38189. /* skip this pcb, we have already processed it */
  38190. pcb = pcb->next;
  38191. 802d646: 68e7 ldr r7, [r4, #12]
  38192. continue;
  38193. 802d648: e0f6 b.n 802d838 <tcp_slowtmr+0x224>
  38194. pcb->last_timer = tcp_timer_ctr;
  38195. pcb_remove = 0;
  38196. pcb_reset = 0;
  38197. if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
  38198. 802d64a: 7e21 ldrb r1, [r4, #24]
  38199. if (pcb->last_timer == tcp_timer_ctr) {
  38200. /* skip this pcb, we have already processed it */
  38201. pcb = pcb->next;
  38202. continue;
  38203. }
  38204. pcb->last_timer = tcp_timer_ctr;
  38205. 802d64c: f884 3021 strb.w r3, [r4, #33] ; 0x21
  38206. pcb_remove = 0;
  38207. pcb_reset = 0;
  38208. if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
  38209. 802d650: 2902 cmp r1, #2
  38210. 802d652: f894 2046 ldrb.w r2, [r4, #70] ; 0x46
  38211. 802d656: d101 bne.n 802d65c <tcp_slowtmr+0x48>
  38212. 802d658: 2a06 cmp r2, #6
  38213. 802d65a: d051 beq.n 802d700 <tcp_slowtmr+0xec>
  38214. ++pcb_remove;
  38215. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n"));
  38216. }
  38217. else if (pcb->nrtx == TCP_MAXRTX) {
  38218. 802d65c: 2a0c cmp r2, #12
  38219. 802d65e: d04f beq.n 802d700 <tcp_slowtmr+0xec>
  38220. ++pcb_remove;
  38221. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  38222. } else {
  38223. if (pcb->persist_backoff > 0) {
  38224. 802d660: f894 3091 ldrb.w r3, [r4, #145] ; 0x91
  38225. 802d664: b1c3 cbz r3, 802d698 <tcp_slowtmr+0x84>
  38226. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  38227. * instead of using the standard retransmission mechanism. */
  38228. pcb->persist_cnt++;
  38229. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  38230. 802d666: 498b ldr r1, [pc, #556] ; (802d894 <tcp_slowtmr+0x280>)
  38231. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  38232. } else {
  38233. if (pcb->persist_backoff > 0) {
  38234. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  38235. * instead of using the standard retransmission mechanism. */
  38236. pcb->persist_cnt++;
  38237. 802d668: f894 2090 ldrb.w r2, [r4, #144] ; 0x90
  38238. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  38239. 802d66c: 18c9 adds r1, r1, r3
  38240. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  38241. } else {
  38242. if (pcb->persist_backoff > 0) {
  38243. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  38244. * instead of using the standard retransmission mechanism. */
  38245. pcb->persist_cnt++;
  38246. 802d66e: 3201 adds r2, #1
  38247. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  38248. 802d670: f811 1c01 ldrb.w r1, [r1, #-1]
  38249. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  38250. } else {
  38251. if (pcb->persist_backoff > 0) {
  38252. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  38253. * instead of using the standard retransmission mechanism. */
  38254. pcb->persist_cnt++;
  38255. 802d674: b2d2 uxtb r2, r2
  38256. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  38257. 802d676: 4291 cmp r1, r2
  38258. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  38259. } else {
  38260. if (pcb->persist_backoff > 0) {
  38261. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  38262. * instead of using the standard retransmission mechanism. */
  38263. pcb->persist_cnt++;
  38264. 802d678: f884 2090 strb.w r2, [r4, #144] ; 0x90
  38265. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  38266. 802d67c: d900 bls.n 802d680 <tcp_slowtmr+0x6c>
  38267. 802d67e: e03d b.n 802d6fc <tcp_slowtmr+0xe8>
  38268. pcb->persist_cnt = 0;
  38269. 802d680: 2200 movs r2, #0
  38270. if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
  38271. 802d682: 2b06 cmp r3, #6
  38272. if (pcb->persist_backoff > 0) {
  38273. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  38274. * instead of using the standard retransmission mechanism. */
  38275. pcb->persist_cnt++;
  38276. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  38277. pcb->persist_cnt = 0;
  38278. 802d684: f884 2090 strb.w r2, [r4, #144] ; 0x90
  38279. if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
  38280. 802d688: d802 bhi.n 802d690 <tcp_slowtmr+0x7c>
  38281. pcb->persist_backoff++;
  38282. 802d68a: 3301 adds r3, #1
  38283. 802d68c: f884 3091 strb.w r3, [r4, #145] ; 0x91
  38284. }
  38285. tcp_zero_window_probe(pcb);
  38286. 802d690: 4620 mov r0, r4
  38287. 802d692: f001 ff04 bl 802f49e <tcp_zero_window_probe>
  38288. 802d696: e031 b.n 802d6fc <tcp_slowtmr+0xe8>
  38289. }
  38290. } else {
  38291. /* Increase the retransmission timer if it is running */
  38292. if(pcb->rtime >= 0) {
  38293. 802d698: 8ea3 ldrh r3, [r4, #52] ; 0x34
  38294. 802d69a: 0418 lsls r0, r3, #16
  38295. 802d69c: d401 bmi.n 802d6a2 <tcp_slowtmr+0x8e>
  38296. ++pcb->rtime;
  38297. 802d69e: 3301 adds r3, #1
  38298. 802d6a0: 86a3 strh r3, [r4, #52] ; 0x34
  38299. }
  38300. if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) {
  38301. 802d6a2: 6f23 ldr r3, [r4, #112] ; 0x70
  38302. 802d6a4: b353 cbz r3, 802d6fc <tcp_slowtmr+0xe8>
  38303. 802d6a6: f9b4 0034 ldrsh.w r0, [r4, #52] ; 0x34
  38304. 802d6aa: f9b4 3044 ldrsh.w r3, [r4, #68] ; 0x44
  38305. 802d6ae: 4298 cmp r0, r3
  38306. 802d6b0: db24 blt.n 802d6fc <tcp_slowtmr+0xe8>
  38307. " pcb->rto %"S16_F"\n",
  38308. pcb->rtime, pcb->rto));
  38309. /* Double retransmission time-out unless we are trying to
  38310. * connect to somebody (i.e., we are in SYN_SENT). */
  38311. if (pcb->state != SYN_SENT) {
  38312. 802d6b2: 2902 cmp r1, #2
  38313. 802d6b4: d00b beq.n 802d6ce <tcp_slowtmr+0xba>
  38314. pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
  38315. 802d6b6: f9b4 1040 ldrsh.w r1, [r4, #64] ; 0x40
  38316. 802d6ba: f9b4 3042 ldrsh.w r3, [r4, #66] ; 0x42
  38317. 802d6be: eb03 03e1 add.w r3, r3, r1, asr #3
  38318. 802d6c2: 4975 ldr r1, [pc, #468] ; (802d898 <tcp_slowtmr+0x284>)
  38319. 802d6c4: 5c8a ldrb r2, [r1, r2]
  38320. 802d6c6: fa03 f302 lsl.w r3, r3, r2
  38321. 802d6ca: f8a4 3044 strh.w r3, [r4, #68] ; 0x44
  38322. }
  38323. /* Reset the retransmission timer. */
  38324. pcb->rtime = 0;
  38325. 802d6ce: 2300 movs r3, #0
  38326. /* Reduce congestion window and ssthresh. */
  38327. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  38328. 802d6d0: f8b4 104c ldrh.w r1, [r4, #76] ; 0x4c
  38329. if (pcb->state != SYN_SENT) {
  38330. pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
  38331. }
  38332. /* Reset the retransmission timer. */
  38333. pcb->rtime = 0;
  38334. 802d6d4: 86a3 strh r3, [r4, #52] ; 0x34
  38335. /* Reduce congestion window and ssthresh. */
  38336. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  38337. 802d6d6: f8b4 3060 ldrh.w r3, [r4, #96] ; 0x60
  38338. pcb->ssthresh = eff_wnd >> 1;
  38339. 802d6da: 4299 cmp r1, r3
  38340. 802d6dc: bf28 it cs
  38341. 802d6de: 4619 movcs r1, r3
  38342. if (pcb->ssthresh < (pcb->mss << 1)) {
  38343. 802d6e0: 8ee3 ldrh r3, [r4, #54] ; 0x36
  38344. /* Reset the retransmission timer. */
  38345. pcb->rtime = 0;
  38346. /* Reduce congestion window and ssthresh. */
  38347. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  38348. pcb->ssthresh = eff_wnd >> 1;
  38349. 802d6e2: 0849 lsrs r1, r1, #1
  38350. if (pcb->ssthresh < (pcb->mss << 1)) {
  38351. 802d6e4: 005a lsls r2, r3, #1
  38352. 802d6e6: 4291 cmp r1, r2
  38353. /* Reset the retransmission timer. */
  38354. pcb->rtime = 0;
  38355. /* Reduce congestion window and ssthresh. */
  38356. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  38357. pcb->ssthresh = eff_wnd >> 1;
  38358. 802d6e8: f8a4 104e strh.w r1, [r4, #78] ; 0x4e
  38359. if (pcb->ssthresh < (pcb->mss << 1)) {
  38360. pcb->ssthresh = (pcb->mss << 1);
  38361. }
  38362. pcb->cwnd = pcb->mss;
  38363. 802d6ec: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  38364. /* Reduce congestion window and ssthresh. */
  38365. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  38366. pcb->ssthresh = eff_wnd >> 1;
  38367. if (pcb->ssthresh < (pcb->mss << 1)) {
  38368. pcb->ssthresh = (pcb->mss << 1);
  38369. 802d6f0: bfb8 it lt
  38370. 802d6f2: f8a4 204e strhlt.w r2, [r4, #78] ; 0x4e
  38371. " ssthresh %"U16_F"\n",
  38372. pcb->cwnd, pcb->ssthresh));
  38373. /* The following needs to be called AFTER cwnd is set to one
  38374. mss - STJ */
  38375. tcp_rexmit_rto(pcb);
  38376. 802d6f6: 4620 mov r0, r4
  38377. 802d6f8: f001 fe40 bl 802f37c <tcp_rexmit_rto>
  38378. pcb = pcb->next;
  38379. continue;
  38380. }
  38381. pcb->last_timer = tcp_timer_ctr;
  38382. pcb_remove = 0;
  38383. 802d6fc: 2500 movs r5, #0
  38384. 802d6fe: e000 b.n 802d702 <tcp_slowtmr+0xee>
  38385. pcb_reset = 0;
  38386. if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
  38387. ++pcb_remove;
  38388. 802d700: 2501 movs r5, #1
  38389. tcp_rexmit_rto(pcb);
  38390. }
  38391. }
  38392. }
  38393. /* Check if this PCB has stayed too long in FIN-WAIT-2 */
  38394. if (pcb->state == FIN_WAIT_2) {
  38395. 802d702: 7e23 ldrb r3, [r4, #24]
  38396. 802d704: 2b06 cmp r3, #6
  38397. 802d706: d10c bne.n 802d722 <tcp_slowtmr+0x10e>
  38398. /* If this PCB is in FIN_WAIT_2 because of SHUT_WR don't let it time out. */
  38399. if (pcb->flags & TF_RXCLOSED) {
  38400. 802d708: 7fa2 ldrb r2, [r4, #30]
  38401. 802d70a: f002 0210 and.w r2, r2, #16
  38402. 802d70e: b2d2 uxtb r2, r2
  38403. 802d710: b13a cbz r2, 802d722 <tcp_slowtmr+0x10e>
  38404. /* PCB was fully closed (either through close() or SHUT_RDWR):
  38405. normal FIN-WAIT timeout handling. */
  38406. if ((u32_t)(tcp_ticks - pcb->tmr) >
  38407. 802d712: 4a5d ldr r2, [pc, #372] ; (802d888 <tcp_slowtmr+0x274>)
  38408. 802d714: 6811 ldr r1, [r2, #0]
  38409. 802d716: 6a62 ldr r2, [r4, #36] ; 0x24
  38410. 802d718: 1a8a subs r2, r1, r2
  38411. 802d71a: 2a28 cmp r2, #40 ; 0x28
  38412. 802d71c: d901 bls.n 802d722 <tcp_slowtmr+0x10e>
  38413. TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
  38414. ++pcb_remove;
  38415. 802d71e: 3501 adds r5, #1
  38416. 802d720: b2ed uxtb r5, r5
  38417. }
  38418. }
  38419. }
  38420. /* Check if KEEPALIVE should be sent */
  38421. if(ip_get_option(pcb, SOF_KEEPALIVE) &&
  38422. 802d722: 7a27 ldrb r7, [r4, #8]
  38423. 802d724: f007 0708 and.w r7, r7, #8
  38424. 802d728: b2ff uxtb r7, r7
  38425. 802d72a: b34f cbz r7, 802d780 <tcp_slowtmr+0x16c>
  38426. 802d72c: 2b04 cmp r3, #4
  38427. 802d72e: d001 beq.n 802d734 <tcp_slowtmr+0x120>
  38428. ((pcb->state == ESTABLISHED) ||
  38429. 802d730: 2b07 cmp r3, #7
  38430. 802d732: d124 bne.n 802d77e <tcp_slowtmr+0x16a>
  38431. (pcb->state == CLOSE_WAIT))) {
  38432. if((u32_t)(tcp_ticks - pcb->tmr) >
  38433. 802d734: 4b54 ldr r3, [pc, #336] ; (802d888 <tcp_slowtmr+0x274>)
  38434. (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)
  38435. 802d736: f8d4 008c ldr.w r0, [r4, #140] ; 0x8c
  38436. /* Check if KEEPALIVE should be sent */
  38437. if(ip_get_option(pcb, SOF_KEEPALIVE) &&
  38438. ((pcb->state == ESTABLISHED) ||
  38439. (pcb->state == CLOSE_WAIT))) {
  38440. if((u32_t)(tcp_ticks - pcb->tmr) >
  38441. 802d73a: 681a ldr r2, [r3, #0]
  38442. 802d73c: 6a63 ldr r3, [r4, #36] ; 0x24
  38443. 802d73e: 1ad2 subs r2, r2, r3
  38444. (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)
  38445. 802d740: f500 2324 add.w r3, r0, #671744 ; 0xa4000
  38446. 802d744: f603 43b8 addw r3, r3, #3256 ; 0xcb8
  38447. 802d748: f44f 71fa mov.w r1, #500 ; 0x1f4
  38448. 802d74c: fbb3 f3f1 udiv r3, r3, r1
  38449. /* Check if KEEPALIVE should be sent */
  38450. if(ip_get_option(pcb, SOF_KEEPALIVE) &&
  38451. ((pcb->state == ESTABLISHED) ||
  38452. (pcb->state == CLOSE_WAIT))) {
  38453. if((u32_t)(tcp_ticks - pcb->tmr) >
  38454. 802d750: 429a cmp r2, r3
  38455. 802d752: d903 bls.n 802d75c <tcp_slowtmr+0x148>
  38456. {
  38457. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to %"U16_F".%"U16_F".%"U16_F".%"U16_F".\n",
  38458. ip4_addr1_16(&pcb->remote_ip), ip4_addr2_16(&pcb->remote_ip),
  38459. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip)));
  38460. ++pcb_remove;
  38461. 802d754: 3501 adds r5, #1
  38462. 802d756: b2ed uxtb r5, r5
  38463. ++pcb_reset;
  38464. 802d758: 2701 movs r7, #1
  38465. 802d75a: e011 b.n 802d780 <tcp_slowtmr+0x16c>
  38466. }
  38467. else if((u32_t)(tcp_ticks - pcb->tmr) >
  38468. (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
  38469. 802d75c: f894 3092 ldrb.w r3, [r4, #146] ; 0x92
  38470. 802d760: 4f4e ldr r7, [pc, #312] ; (802d89c <tcp_slowtmr+0x288>)
  38471. 802d762: fb07 0003 mla r0, r7, r3, r0
  38472. / TCP_SLOW_INTERVAL)
  38473. 802d766: fbb0 f1f1 udiv r1, r0, r1
  38474. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip)));
  38475. ++pcb_remove;
  38476. ++pcb_reset;
  38477. }
  38478. else if((u32_t)(tcp_ticks - pcb->tmr) >
  38479. 802d76a: 428a cmp r2, r1
  38480. 802d76c: d907 bls.n 802d77e <tcp_slowtmr+0x16a>
  38481. (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
  38482. / TCP_SLOW_INTERVAL)
  38483. {
  38484. tcp_keepalive(pcb);
  38485. 802d76e: 4620 mov r0, r4
  38486. 802d770: f001 fe76 bl 802f460 <tcp_keepalive>
  38487. pcb->keep_cnt_sent++;
  38488. 802d774: f894 3092 ldrb.w r3, [r4, #146] ; 0x92
  38489. 802d778: 3301 adds r3, #1
  38490. 802d77a: f884 3092 strb.w r3, [r4, #146] ; 0x92
  38491. continue;
  38492. }
  38493. pcb->last_timer = tcp_timer_ctr;
  38494. pcb_remove = 0;
  38495. pcb_reset = 0;
  38496. 802d77e: 2700 movs r7, #0
  38497. LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n"));
  38498. }
  38499. #endif /* TCP_QUEUE_OOSEQ */
  38500. /* Check if this PCB has stayed too long in SYN-RCVD */
  38501. if (pcb->state == SYN_RCVD) {
  38502. 802d780: 7e23 ldrb r3, [r4, #24]
  38503. 802d782: 2b03 cmp r3, #3
  38504. 802d784: d108 bne.n 802d798 <tcp_slowtmr+0x184>
  38505. if ((u32_t)(tcp_ticks - pcb->tmr) >
  38506. 802d786: 4b40 ldr r3, [pc, #256] ; (802d888 <tcp_slowtmr+0x274>)
  38507. 802d788: 681a ldr r2, [r3, #0]
  38508. 802d78a: 6a63 ldr r3, [r4, #36] ; 0x24
  38509. 802d78c: 1ad3 subs r3, r2, r3
  38510. 802d78e: 2b28 cmp r3, #40 ; 0x28
  38511. 802d790: d90a bls.n 802d7a8 <tcp_slowtmr+0x194>
  38512. TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
  38513. ++pcb_remove;
  38514. 802d792: 3501 adds r5, #1
  38515. 802d794: b2ed uxtb r5, r5
  38516. 802d796: e007 b.n 802d7a8 <tcp_slowtmr+0x194>
  38517. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n"));
  38518. }
  38519. }
  38520. /* Check if this PCB has stayed too long in LAST-ACK */
  38521. if (pcb->state == LAST_ACK) {
  38522. 802d798: 2b09 cmp r3, #9
  38523. 802d79a: d105 bne.n 802d7a8 <tcp_slowtmr+0x194>
  38524. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  38525. 802d79c: 4b3a ldr r3, [pc, #232] ; (802d888 <tcp_slowtmr+0x274>)
  38526. 802d79e: 681a ldr r2, [r3, #0]
  38527. 802d7a0: 6a63 ldr r3, [r4, #36] ; 0x24
  38528. 802d7a2: 1ad3 subs r3, r2, r3
  38529. 802d7a4: 2bf0 cmp r3, #240 ; 0xf0
  38530. 802d7a6: d800 bhi.n 802d7aa <tcp_slowtmr+0x196>
  38531. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n"));
  38532. }
  38533. }
  38534. /* If the PCB should be removed, do it. */
  38535. if (pcb_remove) {
  38536. 802d7a8: b345 cbz r5, 802d7fc <tcp_slowtmr+0x1e8>
  38537. struct tcp_pcb *pcb2;
  38538. tcp_err_fn err_fn;
  38539. void *err_arg;
  38540. tcp_pcb_purge(pcb);
  38541. 802d7aa: 4620 mov r0, r4
  38542. 802d7ac: f7ff ff14 bl 802d5d8 <tcp_pcb_purge>
  38543. 802d7b0: 68e3 ldr r3, [r4, #12]
  38544. /* Remove PCB from tcp_active_pcbs list. */
  38545. if (prev != NULL) {
  38546. 802d7b2: b10e cbz r6, 802d7b8 <tcp_slowtmr+0x1a4>
  38547. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
  38548. prev->next = pcb->next;
  38549. 802d7b4: 60f3 str r3, [r6, #12]
  38550. 802d7b6: e001 b.n 802d7bc <tcp_slowtmr+0x1a8>
  38551. } else {
  38552. /* This PCB was the first. */
  38553. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
  38554. tcp_active_pcbs = pcb->next;
  38555. 802d7b8: 4a35 ldr r2, [pc, #212] ; (802d890 <tcp_slowtmr+0x27c>)
  38556. 802d7ba: 6013 str r3, [r2, #0]
  38557. }
  38558. if (pcb_reset) {
  38559. 802d7bc: b14f cbz r7, 802d7d2 <tcp_slowtmr+0x1be>
  38560. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  38561. 802d7be: 8b63 ldrh r3, [r4, #26]
  38562. 802d7c0: 9300 str r3, [sp, #0]
  38563. 802d7c2: 8ba3 ldrh r3, [r4, #28]
  38564. 802d7c4: 9301 str r3, [sp, #4]
  38565. 802d7c6: 6d20 ldr r0, [r4, #80] ; 0x50
  38566. 802d7c8: 6aa1 ldr r1, [r4, #40] ; 0x28
  38567. 802d7ca: 4622 mov r2, r4
  38568. 802d7cc: 1d23 adds r3, r4, #4
  38569. 802d7ce: f001 fd8f bl 802f2f0 <tcp_rst>
  38570. pcb->local_port, pcb->remote_port);
  38571. }
  38572. err_fn = pcb->errf;
  38573. 802d7d2: f8d4 5088 ldr.w r5, [r4, #136] ; 0x88
  38574. err_arg = pcb->callback_arg;
  38575. 802d7d6: f8d4 b010 ldr.w fp, [r4, #16]
  38576. pcb2 = pcb;
  38577. pcb = pcb->next;
  38578. 802d7da: 68e7 ldr r7, [r4, #12]
  38579. memp_free(MEMP_TCP_PCB, pcb2);
  38580. 802d7dc: 2002 movs r0, #2
  38581. 802d7de: 4621 mov r1, r4
  38582. 802d7e0: f7ff fb1c bl 802ce1c <memp_free>
  38583. tcp_active_pcbs_changed = 0;
  38584. 802d7e4: 2300 movs r3, #0
  38585. 802d7e6: f888 3000 strb.w r3, [r8]
  38586. TCP_EVENT_ERR(err_fn, err_arg, ERR_ABRT);
  38587. 802d7ea: b11d cbz r5, 802d7f4 <tcp_slowtmr+0x1e0>
  38588. 802d7ec: 4658 mov r0, fp
  38589. 802d7ee: f06f 0109 mvn.w r1, #9
  38590. 802d7f2: 47a8 blx r5
  38591. if (tcp_active_pcbs_changed) {
  38592. 802d7f4: f899 3000 ldrb.w r3, [r9]
  38593. 802d7f8: b1f3 cbz r3, 802d838 <tcp_slowtmr+0x224>
  38594. 802d7fa: e718 b.n 802d62e <tcp_slowtmr+0x1a>
  38595. /* get the 'next' element now and work with 'prev' below (in case of abort) */
  38596. prev = pcb;
  38597. pcb = pcb->next;
  38598. /* We check if we should poll the connection. */
  38599. ++prev->polltmr;
  38600. 802d7fc: 7fe3 ldrb r3, [r4, #31]
  38601. if (prev->polltmr >= prev->pollinterval) {
  38602. 802d7fe: f894 2020 ldrb.w r2, [r4, #32]
  38603. goto tcp_slowtmr_start;
  38604. }
  38605. } else {
  38606. /* get the 'next' element now and work with 'prev' below (in case of abort) */
  38607. prev = pcb;
  38608. pcb = pcb->next;
  38609. 802d802: 68e7 ldr r7, [r4, #12]
  38610. /* We check if we should poll the connection. */
  38611. ++prev->polltmr;
  38612. 802d804: 3301 adds r3, #1
  38613. 802d806: b2db uxtb r3, r3
  38614. if (prev->polltmr >= prev->pollinterval) {
  38615. 802d808: 429a cmp r2, r3
  38616. /* get the 'next' element now and work with 'prev' below (in case of abort) */
  38617. prev = pcb;
  38618. pcb = pcb->next;
  38619. /* We check if we should poll the connection. */
  38620. ++prev->polltmr;
  38621. 802d80a: 77e3 strb r3, [r4, #31]
  38622. if (prev->polltmr >= prev->pollinterval) {
  38623. 802d80c: d813 bhi.n 802d836 <tcp_slowtmr+0x222>
  38624. prev->polltmr = 0;
  38625. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
  38626. tcp_active_pcbs_changed = 0;
  38627. TCP_EVENT_POLL(prev, err);
  38628. 802d80e: f8d4 3084 ldr.w r3, [r4, #132] ; 0x84
  38629. pcb = pcb->next;
  38630. /* We check if we should poll the connection. */
  38631. ++prev->polltmr;
  38632. if (prev->polltmr >= prev->pollinterval) {
  38633. prev->polltmr = 0;
  38634. 802d812: 77e5 strb r5, [r4, #31]
  38635. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
  38636. tcp_active_pcbs_changed = 0;
  38637. 802d814: f888 5000 strb.w r5, [r8]
  38638. TCP_EVENT_POLL(prev, err);
  38639. 802d818: b11b cbz r3, 802d822 <tcp_slowtmr+0x20e>
  38640. 802d81a: 6920 ldr r0, [r4, #16]
  38641. 802d81c: 4621 mov r1, r4
  38642. 802d81e: 4798 blx r3
  38643. 802d820: e000 b.n 802d824 <tcp_slowtmr+0x210>
  38644. 802d822: 4628 mov r0, r5
  38645. if (tcp_active_pcbs_changed) {
  38646. 802d824: f899 3000 ldrb.w r3, [r9]
  38647. 802d828: 2b00 cmp r3, #0
  38648. 802d82a: f47f af00 bne.w 802d62e <tcp_slowtmr+0x1a>
  38649. goto tcp_slowtmr_start;
  38650. }
  38651. /* if err == ERR_ABRT, 'prev' is already deallocated */
  38652. if (err == ERR_OK) {
  38653. 802d82e: b910 cbnz r0, 802d836 <tcp_slowtmr+0x222>
  38654. tcp_output(prev);
  38655. 802d830: 4620 mov r0, r4
  38656. 802d832: f001 fc39 bl 802f0a8 <tcp_output>
  38657. TCP_EVENT_POLL(prev, err);
  38658. if (tcp_active_pcbs_changed) {
  38659. goto tcp_slowtmr_start;
  38660. }
  38661. /* if err == ERR_ABRT, 'prev' is already deallocated */
  38662. if (err == ERR_OK) {
  38663. 802d836: 4626 mov r6, r4
  38664. prev = pcb;
  38665. pcb = pcb->next;
  38666. /* We check if we should poll the connection. */
  38667. ++prev->polltmr;
  38668. if (prev->polltmr >= prev->pollinterval) {
  38669. 802d838: 463c mov r4, r7
  38670. prev = NULL;
  38671. pcb = tcp_active_pcbs;
  38672. if (pcb == NULL) {
  38673. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
  38674. }
  38675. while (pcb != NULL) {
  38676. 802d83a: 2c00 cmp r4, #0
  38677. 802d83c: f47f aefd bne.w 802d63a <tcp_slowtmr+0x26>
  38678. }
  38679. /* Steps through all of the TIME-WAIT PCBs. */
  38680. prev = NULL;
  38681. pcb = tcp_tw_pcbs;
  38682. 802d840: 4b17 ldr r3, [pc, #92] ; (802d8a0 <tcp_slowtmr+0x28c>)
  38683. while (pcb != NULL) {
  38684. LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  38685. pcb_remove = 0;
  38686. /* Check if this PCB has stayed long enough in TIME-WAIT */
  38687. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  38688. 802d842: 4e11 ldr r6, [pc, #68] ; (802d888 <tcp_slowtmr+0x274>)
  38689. }
  38690. /* Steps through all of the TIME-WAIT PCBs. */
  38691. prev = NULL;
  38692. pcb = tcp_tw_pcbs;
  38693. 802d844: 681d ldr r5, [r3, #0]
  38694. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
  38695. prev->next = pcb->next;
  38696. } else {
  38697. /* This PCB was the first. */
  38698. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  38699. tcp_tw_pcbs = pcb->next;
  38700. 802d846: 461f mov r7, r3
  38701. /* Steps through all of the TIME-WAIT PCBs. */
  38702. prev = NULL;
  38703. pcb = tcp_tw_pcbs;
  38704. while (pcb != NULL) {
  38705. 802d848: e00f b.n 802d86a <tcp_slowtmr+0x256>
  38706. LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  38707. pcb_remove = 0;
  38708. /* Check if this PCB has stayed long enough in TIME-WAIT */
  38709. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  38710. 802d84a: 6832 ldr r2, [r6, #0]
  38711. 802d84c: 6a6b ldr r3, [r5, #36] ; 0x24
  38712. 802d84e: 1ad3 subs r3, r2, r3
  38713. 802d850: 2bf0 cmp r3, #240 ; 0xf0
  38714. 802d852: d810 bhi.n 802d876 <tcp_slowtmr+0x262>
  38715. 802d854: e00c b.n 802d870 <tcp_slowtmr+0x25c>
  38716. struct tcp_pcb *pcb2;
  38717. tcp_pcb_purge(pcb);
  38718. /* Remove PCB from tcp_tw_pcbs list. */
  38719. if (prev != NULL) {
  38720. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
  38721. prev->next = pcb->next;
  38722. 802d856: 60e2 str r2, [r4, #12]
  38723. 802d858: e000 b.n 802d85c <tcp_slowtmr+0x248>
  38724. } else {
  38725. /* This PCB was the first. */
  38726. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  38727. tcp_tw_pcbs = pcb->next;
  38728. 802d85a: 603a str r2, [r7, #0]
  38729. }
  38730. pcb2 = pcb;
  38731. pcb = pcb->next;
  38732. memp_free(MEMP_TCP_PCB, pcb2);
  38733. 802d85c: 4629 mov r1, r5
  38734. 802d85e: 2002 movs r0, #2
  38735. /* This PCB was the first. */
  38736. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  38737. tcp_tw_pcbs = pcb->next;
  38738. }
  38739. pcb2 = pcb;
  38740. pcb = pcb->next;
  38741. 802d860: f8d5 800c ldr.w r8, [r5, #12]
  38742. memp_free(MEMP_TCP_PCB, pcb2);
  38743. 802d864: f7ff fada bl 802ce1c <memp_free>
  38744. /* This PCB was the first. */
  38745. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  38746. tcp_tw_pcbs = pcb->next;
  38747. }
  38748. pcb2 = pcb;
  38749. pcb = pcb->next;
  38750. 802d868: 4645 mov r5, r8
  38751. /* Steps through all of the TIME-WAIT PCBs. */
  38752. prev = NULL;
  38753. pcb = tcp_tw_pcbs;
  38754. while (pcb != NULL) {
  38755. 802d86a: 2d00 cmp r5, #0
  38756. 802d86c: d1ed bne.n 802d84a <tcp_slowtmr+0x236>
  38757. 802d86e: e009 b.n 802d884 <tcp_slowtmr+0x270>
  38758. pcb2 = pcb;
  38759. pcb = pcb->next;
  38760. memp_free(MEMP_TCP_PCB, pcb2);
  38761. } else {
  38762. prev = pcb;
  38763. pcb = pcb->next;
  38764. 802d870: 462c mov r4, r5
  38765. 802d872: 68ed ldr r5, [r5, #12]
  38766. 802d874: e7f9 b.n 802d86a <tcp_slowtmr+0x256>
  38767. /* If the PCB should be removed, do it. */
  38768. if (pcb_remove) {
  38769. struct tcp_pcb *pcb2;
  38770. tcp_pcb_purge(pcb);
  38771. 802d876: 4628 mov r0, r5
  38772. 802d878: f7ff feae bl 802d5d8 <tcp_pcb_purge>
  38773. 802d87c: 68ea ldr r2, [r5, #12]
  38774. /* Remove PCB from tcp_tw_pcbs list. */
  38775. if (prev != NULL) {
  38776. 802d87e: 2c00 cmp r4, #0
  38777. 802d880: d1e9 bne.n 802d856 <tcp_slowtmr+0x242>
  38778. 802d882: e7ea b.n 802d85a <tcp_slowtmr+0x246>
  38779. } else {
  38780. prev = pcb;
  38781. pcb = pcb->next;
  38782. }
  38783. }
  38784. }
  38785. 802d884: e8bd 8ffe ldmia.w sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  38786. 802d888: 20010fe0 .word 0x20010fe0
  38787. 802d88c: 2000e0ed .word 0x2000e0ed
  38788. 802d890: 20010fdc .word 0x20010fdc
  38789. 802d894: 0803fe7d .word 0x0803fe7d
  38790. 802d898: 0803fe70 .word 0x0803fe70
  38791. 802d89c: 000124f8 .word 0x000124f8
  38792. 802d8a0: 20010ff0 .word 0x20010ff0
  38793. 802d8a4: 20010fd8 .word 0x20010fd8
  38794. 0802d8a8 <tcp_pcb_remove>:
  38795. * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
  38796. */
  38797. void
  38798. tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
  38799. {
  38800. TCP_RMV(pcblist, pcb);
  38801. 802d8a8: 6803 ldr r3, [r0, #0]
  38802. 802d8aa: 428b cmp r3, r1
  38803. * @param pcblist PCB list to purge.
  38804. * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
  38805. */
  38806. void
  38807. tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
  38808. {
  38809. 802d8ac: b510 push {r4, lr}
  38810. 802d8ae: 460c mov r4, r1
  38811. TCP_RMV(pcblist, pcb);
  38812. 802d8b0: d102 bne.n 802d8b8 <tcp_pcb_remove+0x10>
  38813. 802d8b2: 68cb ldr r3, [r1, #12]
  38814. 802d8b4: 6003 str r3, [r0, #0]
  38815. 802d8b6: e00d b.n 802d8d4 <tcp_pcb_remove+0x2c>
  38816. 802d8b8: 4a11 ldr r2, [pc, #68] ; (802d900 <tcp_pcb_remove+0x58>)
  38817. 802d8ba: 6013 str r3, [r2, #0]
  38818. 802d8bc: e007 b.n 802d8ce <tcp_pcb_remove+0x26>
  38819. 802d8be: 68d9 ldr r1, [r3, #12]
  38820. 802d8c0: 42a1 cmp r1, r4
  38821. 802d8c2: d103 bne.n 802d8cc <tcp_pcb_remove+0x24>
  38822. 802d8c4: 6013 str r3, [r2, #0]
  38823. 802d8c6: 68e2 ldr r2, [r4, #12]
  38824. 802d8c8: 60da str r2, [r3, #12]
  38825. 802d8ca: e003 b.n 802d8d4 <tcp_pcb_remove+0x2c>
  38826. 802d8cc: 460b mov r3, r1
  38827. 802d8ce: 2b00 cmp r3, #0
  38828. 802d8d0: d1f5 bne.n 802d8be <tcp_pcb_remove+0x16>
  38829. 802d8d2: 6013 str r3, [r2, #0]
  38830. 802d8d4: 2300 movs r3, #0
  38831. 802d8d6: 60e3 str r3, [r4, #12]
  38832. tcp_pcb_purge(pcb);
  38833. 802d8d8: 4620 mov r0, r4
  38834. 802d8da: f7ff fe7d bl 802d5d8 <tcp_pcb_purge>
  38835. /* if there is an outstanding delayed ACKs, send it */
  38836. if (pcb->state != TIME_WAIT &&
  38837. 802d8de: 7e23 ldrb r3, [r4, #24]
  38838. 802d8e0: 2b0a cmp r3, #10
  38839. 802d8e2: d00a beq.n 802d8fa <tcp_pcb_remove+0x52>
  38840. 802d8e4: 2b01 cmp r3, #1
  38841. 802d8e6: d008 beq.n 802d8fa <tcp_pcb_remove+0x52>
  38842. pcb->state != LISTEN &&
  38843. pcb->flags & TF_ACK_DELAY) {
  38844. 802d8e8: 7fa3 ldrb r3, [r4, #30]
  38845. tcp_pcb_purge(pcb);
  38846. /* if there is an outstanding delayed ACKs, send it */
  38847. if (pcb->state != TIME_WAIT &&
  38848. pcb->state != LISTEN &&
  38849. 802d8ea: 07da lsls r2, r3, #31
  38850. 802d8ec: d505 bpl.n 802d8fa <tcp_pcb_remove+0x52>
  38851. pcb->flags & TF_ACK_DELAY) {
  38852. pcb->flags |= TF_ACK_NOW;
  38853. 802d8ee: f043 0302 orr.w r3, r3, #2
  38854. 802d8f2: 77a3 strb r3, [r4, #30]
  38855. tcp_output(pcb);
  38856. 802d8f4: 4620 mov r0, r4
  38857. 802d8f6: f001 fbd7 bl 802f0a8 <tcp_output>
  38858. #if TCP_QUEUE_OOSEQ
  38859. LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL);
  38860. #endif /* TCP_QUEUE_OOSEQ */
  38861. }
  38862. pcb->state = CLOSED;
  38863. 802d8fa: 2300 movs r3, #0
  38864. 802d8fc: 7623 strb r3, [r4, #24]
  38865. 802d8fe: bd10 pop {r4, pc}
  38866. 802d900: 20010fe8 .word 0x20010fe8
  38867. 0802d904 <tcp_abandon>:
  38868. LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
  38869. pcb->state != LISTEN);
  38870. /* Figure out on which TCP PCB list we are, and remove us. If we
  38871. are in an active state, call the receive function associated with
  38872. the PCB with a NULL argument, and send an RST to the remote end. */
  38873. if (pcb->state == TIME_WAIT) {
  38874. 802d904: 7e03 ldrb r3, [r0, #24]
  38875. 802d906: 2b0a cmp r3, #10
  38876. * @param pcb the tcp_pcb to abort
  38877. * @param reset boolean to indicate whether a reset should be sent
  38878. */
  38879. void
  38880. tcp_abandon(struct tcp_pcb *pcb, int reset)
  38881. {
  38882. 802d908: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr}
  38883. 802d90c: 4604 mov r4, r0
  38884. 802d90e: 4689 mov r9, r1
  38885. LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
  38886. pcb->state != LISTEN);
  38887. /* Figure out on which TCP PCB list we are, and remove us. If we
  38888. are in an active state, call the receive function associated with
  38889. the PCB with a NULL argument, and send an RST to the remote end. */
  38890. if (pcb->state == TIME_WAIT) {
  38891. 802d910: d10a bne.n 802d928 <tcp_abandon+0x24>
  38892. tcp_pcb_remove(&tcp_tw_pcbs, pcb);
  38893. 802d912: 4621 mov r1, r4
  38894. 802d914: 481b ldr r0, [pc, #108] ; (802d984 <tcp_abandon+0x80>)
  38895. 802d916: f7ff ffc7 bl 802d8a8 <tcp_pcb_remove>
  38896. memp_free(MEMP_TCP_PCB, pcb);
  38897. 802d91a: 2002 movs r0, #2
  38898. 802d91c: 4621 mov r1, r4
  38899. tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, pcb->local_port, pcb->remote_port);
  38900. }
  38901. memp_free(MEMP_TCP_PCB, pcb);
  38902. TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT);
  38903. }
  38904. }
  38905. 802d91e: b003 add sp, #12
  38906. 802d920: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr}
  38907. /* Figure out on which TCP PCB list we are, and remove us. If we
  38908. are in an active state, call the receive function associated with
  38909. the PCB with a NULL argument, and send an RST to the remote end. */
  38910. if (pcb->state == TIME_WAIT) {
  38911. tcp_pcb_remove(&tcp_tw_pcbs, pcb);
  38912. memp_free(MEMP_TCP_PCB, pcb);
  38913. 802d924: f7ff ba7a b.w 802ce1c <memp_free>
  38914. } else {
  38915. seqno = pcb->snd_nxt;
  38916. 802d928: f8d0 8050 ldr.w r8, [r0, #80] ; 0x50
  38917. ackno = pcb->rcv_nxt;
  38918. 802d92c: 6a87 ldr r7, [r0, #40] ; 0x28
  38919. #if LWIP_CALLBACK_API
  38920. errf = pcb->errf;
  38921. 802d92e: f8d0 5088 ldr.w r5, [r0, #136] ; 0x88
  38922. #endif /* LWIP_CALLBACK_API */
  38923. errf_arg = pcb->callback_arg;
  38924. 802d932: 6906 ldr r6, [r0, #16]
  38925. TCP_PCB_REMOVE_ACTIVE(pcb);
  38926. 802d934: 4814 ldr r0, [pc, #80] ; (802d988 <tcp_abandon+0x84>)
  38927. 802d936: 4621 mov r1, r4
  38928. 802d938: f7ff ffb6 bl 802d8a8 <tcp_pcb_remove>
  38929. 802d93c: 4b13 ldr r3, [pc, #76] ; (802d98c <tcp_abandon+0x88>)
  38930. if (pcb->unacked != NULL) {
  38931. 802d93e: 6f20 ldr r0, [r4, #112] ; 0x70
  38932. ackno = pcb->rcv_nxt;
  38933. #if LWIP_CALLBACK_API
  38934. errf = pcb->errf;
  38935. #endif /* LWIP_CALLBACK_API */
  38936. errf_arg = pcb->callback_arg;
  38937. TCP_PCB_REMOVE_ACTIVE(pcb);
  38938. 802d940: 2201 movs r2, #1
  38939. 802d942: 701a strb r2, [r3, #0]
  38940. if (pcb->unacked != NULL) {
  38941. 802d944: b108 cbz r0, 802d94a <tcp_abandon+0x46>
  38942. tcp_segs_free(pcb->unacked);
  38943. 802d946: f7ff fe2e bl 802d5a6 <tcp_segs_free>
  38944. }
  38945. if (pcb->unsent != NULL) {
  38946. 802d94a: 6ee0 ldr r0, [r4, #108] ; 0x6c
  38947. 802d94c: b108 cbz r0, 802d952 <tcp_abandon+0x4e>
  38948. tcp_segs_free(pcb->unsent);
  38949. 802d94e: f7ff fe2a bl 802d5a6 <tcp_segs_free>
  38950. #if TCP_QUEUE_OOSEQ
  38951. if (pcb->ooseq != NULL) {
  38952. tcp_segs_free(pcb->ooseq);
  38953. }
  38954. #endif /* TCP_QUEUE_OOSEQ */
  38955. if (reset) {
  38956. 802d952: f1b9 0f00 cmp.w r9, #0
  38957. 802d956: d009 beq.n 802d96c <tcp_abandon+0x68>
  38958. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n"));
  38959. tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, pcb->local_port, pcb->remote_port);
  38960. 802d958: 8b63 ldrh r3, [r4, #26]
  38961. 802d95a: 9300 str r3, [sp, #0]
  38962. 802d95c: 8ba3 ldrh r3, [r4, #28]
  38963. 802d95e: 4640 mov r0, r8
  38964. 802d960: 9301 str r3, [sp, #4]
  38965. 802d962: 4639 mov r1, r7
  38966. 802d964: 4622 mov r2, r4
  38967. 802d966: 1d23 adds r3, r4, #4
  38968. 802d968: f001 fcc2 bl 802f2f0 <tcp_rst>
  38969. }
  38970. memp_free(MEMP_TCP_PCB, pcb);
  38971. 802d96c: 2002 movs r0, #2
  38972. 802d96e: 4621 mov r1, r4
  38973. 802d970: f7ff fa54 bl 802ce1c <memp_free>
  38974. TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT);
  38975. 802d974: b11d cbz r5, 802d97e <tcp_abandon+0x7a>
  38976. 802d976: 4630 mov r0, r6
  38977. 802d978: f06f 0109 mvn.w r1, #9
  38978. 802d97c: 47a8 blx r5
  38979. }
  38980. }
  38981. 802d97e: b003 add sp, #12
  38982. 802d980: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  38983. 802d984: 20010ff0 .word 0x20010ff0
  38984. 802d988: 20010fdc .word 0x20010fdc
  38985. 802d98c: 20010fd8 .word 0x20010fd8
  38986. 0802d990 <tcp_abort>:
  38987. * @param pcb the tcp pcb to abort
  38988. */
  38989. void
  38990. tcp_abort(struct tcp_pcb *pcb)
  38991. {
  38992. tcp_abandon(pcb, 1);
  38993. 802d990: 2101 movs r1, #1
  38994. 802d992: f7ff bfb7 b.w 802d904 <tcp_abandon>
  38995. 802d996: 0000 movs r0, r0
  38996. 0802d998 <tcp_close_shutdown>:
  38997. * @return ERR_OK if connection has been closed
  38998. * another err_t if closing failed and pcb is not freed
  38999. */
  39000. static err_t
  39001. tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data)
  39002. {
  39003. 802d998: b537 push {r0, r1, r2, r4, r5, lr}
  39004. 802d99a: 4604 mov r4, r0
  39005. err_t err;
  39006. if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
  39007. 802d99c: 2900 cmp r1, #0
  39008. 802d99e: d043 beq.n 802da28 <tcp_close_shutdown+0x90>
  39009. 802d9a0: 7e03 ldrb r3, [r0, #24]
  39010. 802d9a2: 2b04 cmp r3, #4
  39011. 802d9a4: d001 beq.n 802d9aa <tcp_close_shutdown+0x12>
  39012. 802d9a6: 2b07 cmp r3, #7
  39013. 802d9a8: d13e bne.n 802da28 <tcp_close_shutdown+0x90>
  39014. if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND)) {
  39015. 802d9aa: 6f63 ldr r3, [r4, #116] ; 0x74
  39016. 802d9ac: b923 cbnz r3, 802d9b8 <tcp_close_shutdown+0x20>
  39017. 802d9ae: 8da2 ldrh r2, [r4, #44] ; 0x2c
  39018. 802d9b0: f241 63d0 movw r3, #5840 ; 0x16d0
  39019. 802d9b4: 429a cmp r2, r3
  39020. 802d9b6: d037 beq.n 802da28 <tcp_close_shutdown+0x90>
  39021. side about this. */
  39022. LWIP_ASSERT("pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED);
  39023. /* don't call tcp_abort here: we must not deallocate the pcb since
  39024. that might not be expected when calling tcp_close */
  39025. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  39026. 802d9b8: 8b63 ldrh r3, [r4, #26]
  39027. 802d9ba: 6d20 ldr r0, [r4, #80] ; 0x50
  39028. 802d9bc: 9300 str r3, [sp, #0]
  39029. 802d9be: 8ba3 ldrh r3, [r4, #28]
  39030. 802d9c0: 6aa1 ldr r1, [r4, #40] ; 0x28
  39031. 802d9c2: 9301 str r3, [sp, #4]
  39032. 802d9c4: 4622 mov r2, r4
  39033. 802d9c6: 1d23 adds r3, r4, #4
  39034. 802d9c8: f001 fc92 bl 802f2f0 <tcp_rst>
  39035. pcb->local_port, pcb->remote_port);
  39036. tcp_pcb_purge(pcb);
  39037. 802d9cc: 4620 mov r0, r4
  39038. 802d9ce: f7ff fe03 bl 802d5d8 <tcp_pcb_purge>
  39039. TCP_RMV_ACTIVE(pcb);
  39040. 802d9d2: 4a42 ldr r2, [pc, #264] ; (802dadc <tcp_close_shutdown+0x144>)
  39041. 802d9d4: 6813 ldr r3, [r2, #0]
  39042. 802d9d6: 42a3 cmp r3, r4
  39043. 802d9d8: d101 bne.n 802d9de <tcp_close_shutdown+0x46>
  39044. 802d9da: 68e3 ldr r3, [r4, #12]
  39045. 802d9dc: e00c b.n 802d9f8 <tcp_close_shutdown+0x60>
  39046. 802d9de: 4a40 ldr r2, [pc, #256] ; (802dae0 <tcp_close_shutdown+0x148>)
  39047. 802d9e0: 6013 str r3, [r2, #0]
  39048. 802d9e2: e007 b.n 802d9f4 <tcp_close_shutdown+0x5c>
  39049. 802d9e4: 68d9 ldr r1, [r3, #12]
  39050. 802d9e6: 42a1 cmp r1, r4
  39051. 802d9e8: d103 bne.n 802d9f2 <tcp_close_shutdown+0x5a>
  39052. 802d9ea: 6013 str r3, [r2, #0]
  39053. 802d9ec: 68e2 ldr r2, [r4, #12]
  39054. 802d9ee: 60da str r2, [r3, #12]
  39055. 802d9f0: e003 b.n 802d9fa <tcp_close_shutdown+0x62>
  39056. 802d9f2: 460b mov r3, r1
  39057. 802d9f4: 2b00 cmp r3, #0
  39058. 802d9f6: d1f5 bne.n 802d9e4 <tcp_close_shutdown+0x4c>
  39059. 802d9f8: 6013 str r3, [r2, #0]
  39060. 802d9fa: 4b3a ldr r3, [pc, #232] ; (802dae4 <tcp_close_shutdown+0x14c>)
  39061. 802d9fc: 2201 movs r2, #1
  39062. 802d9fe: 701a strb r2, [r3, #0]
  39063. if (pcb->state == ESTABLISHED) {
  39064. 802da00: 7e23 ldrb r3, [r4, #24]
  39065. that might not be expected when calling tcp_close */
  39066. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  39067. pcb->local_port, pcb->remote_port);
  39068. tcp_pcb_purge(pcb);
  39069. TCP_RMV_ACTIVE(pcb);
  39070. 802da02: 2500 movs r5, #0
  39071. if (pcb->state == ESTABLISHED) {
  39072. 802da04: 2b04 cmp r3, #4
  39073. that might not be expected when calling tcp_close */
  39074. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  39075. pcb->local_port, pcb->remote_port);
  39076. tcp_pcb_purge(pcb);
  39077. TCP_RMV_ACTIVE(pcb);
  39078. 802da06: 60e5 str r5, [r4, #12]
  39079. if (pcb->state == ESTABLISHED) {
  39080. 802da08: d108 bne.n 802da1c <tcp_close_shutdown+0x84>
  39081. /* move to TIME_WAIT since we close actively */
  39082. pcb->state = TIME_WAIT;
  39083. 802da0a: 230a movs r3, #10
  39084. 802da0c: 7623 strb r3, [r4, #24]
  39085. TCP_REG(&tcp_tw_pcbs, pcb);
  39086. 802da0e: 4b36 ldr r3, [pc, #216] ; (802dae8 <tcp_close_shutdown+0x150>)
  39087. 802da10: 681a ldr r2, [r3, #0]
  39088. 802da12: 601c str r4, [r3, #0]
  39089. 802da14: 60e2 str r2, [r4, #12]
  39090. 802da16: f001 fe05 bl 802f624 <tcp_timer_needed>
  39091. 802da1a: e003 b.n 802da24 <tcp_close_shutdown+0x8c>
  39092. } else {
  39093. /* CLOSE_WAIT: deallocate the pcb since we already sent a RST for it */
  39094. memp_free(MEMP_TCP_PCB, pcb);
  39095. 802da1c: 2002 movs r0, #2
  39096. 802da1e: 4621 mov r1, r4
  39097. 802da20: f7ff f9fc bl 802ce1c <memp_free>
  39098. }
  39099. return ERR_OK;
  39100. 802da24: 4628 mov r0, r5
  39101. 802da26: e051 b.n 802dacc <tcp_close_shutdown+0x134>
  39102. }
  39103. }
  39104. switch (pcb->state) {
  39105. 802da28: 7e23 ldrb r3, [r4, #24]
  39106. 802da2a: 2b07 cmp r3, #7
  39107. 802da2c: d853 bhi.n 802dad6 <tcp_close_shutdown+0x13e>
  39108. 802da2e: e8df f003 tbb [pc, r3]
  39109. 802da32: 1e04 .short 0x1e04
  39110. 802da34: 523c3527 .word 0x523c3527
  39111. 802da38: 4452 .short 0x4452
  39112. * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
  39113. * or for a pcb that has been used and then entered the CLOSED state
  39114. * is erroneous, but this should never happen as the pcb has in those cases
  39115. * been freed, and so any remaining handles are bogus. */
  39116. err = ERR_OK;
  39117. if (pcb->local_port != 0) {
  39118. 802da3a: 8b63 ldrh r3, [r4, #26]
  39119. 802da3c: b1ab cbz r3, 802da6a <tcp_close_shutdown+0xd2>
  39120. TCP_RMV(&tcp_bound_pcbs, pcb);
  39121. 802da3e: 4a2b ldr r2, [pc, #172] ; (802daec <tcp_close_shutdown+0x154>)
  39122. 802da40: 6813 ldr r3, [r2, #0]
  39123. 802da42: 42a3 cmp r3, r4
  39124. 802da44: d101 bne.n 802da4a <tcp_close_shutdown+0xb2>
  39125. 802da46: 68e3 ldr r3, [r4, #12]
  39126. 802da48: e00c b.n 802da64 <tcp_close_shutdown+0xcc>
  39127. 802da4a: 4a25 ldr r2, [pc, #148] ; (802dae0 <tcp_close_shutdown+0x148>)
  39128. 802da4c: 6013 str r3, [r2, #0]
  39129. 802da4e: e007 b.n 802da60 <tcp_close_shutdown+0xc8>
  39130. 802da50: 68d9 ldr r1, [r3, #12]
  39131. 802da52: 42a1 cmp r1, r4
  39132. 802da54: d103 bne.n 802da5e <tcp_close_shutdown+0xc6>
  39133. 802da56: 6013 str r3, [r2, #0]
  39134. 802da58: 68e2 ldr r2, [r4, #12]
  39135. 802da5a: 60da str r2, [r3, #12]
  39136. 802da5c: e003 b.n 802da66 <tcp_close_shutdown+0xce>
  39137. 802da5e: 460b mov r3, r1
  39138. 802da60: 2b00 cmp r3, #0
  39139. 802da62: d1f5 bne.n 802da50 <tcp_close_shutdown+0xb8>
  39140. 802da64: 6013 str r3, [r2, #0]
  39141. 802da66: 2300 movs r3, #0
  39142. 802da68: 60e3 str r3, [r4, #12]
  39143. }
  39144. memp_free(MEMP_TCP_PCB, pcb);
  39145. 802da6a: 2002 movs r0, #2
  39146. 802da6c: e004 b.n 802da78 <tcp_close_shutdown+0xe0>
  39147. pcb = NULL;
  39148. break;
  39149. case LISTEN:
  39150. err = ERR_OK;
  39151. tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
  39152. 802da6e: 4820 ldr r0, [pc, #128] ; (802daf0 <tcp_close_shutdown+0x158>)
  39153. 802da70: 4621 mov r1, r4
  39154. 802da72: f7ff ff19 bl 802d8a8 <tcp_pcb_remove>
  39155. memp_free(MEMP_TCP_PCB_LISTEN, pcb);
  39156. 802da76: 2003 movs r0, #3
  39157. 802da78: 4621 mov r1, r4
  39158. 802da7a: f7ff f9cf bl 802ce1c <memp_free>
  39159. pcb = NULL;
  39160. break;
  39161. 802da7e: e02a b.n 802dad6 <tcp_close_shutdown+0x13e>
  39162. case SYN_SENT:
  39163. err = ERR_OK;
  39164. TCP_PCB_REMOVE_ACTIVE(pcb);
  39165. 802da80: 4621 mov r1, r4
  39166. 802da82: 4816 ldr r0, [pc, #88] ; (802dadc <tcp_close_shutdown+0x144>)
  39167. 802da84: f7ff ff10 bl 802d8a8 <tcp_pcb_remove>
  39168. 802da88: 4b16 ldr r3, [pc, #88] ; (802dae4 <tcp_close_shutdown+0x14c>)
  39169. 802da8a: 2201 movs r2, #1
  39170. memp_free(MEMP_TCP_PCB, pcb);
  39171. 802da8c: 2002 movs r0, #2
  39172. 802da8e: 4621 mov r1, r4
  39173. memp_free(MEMP_TCP_PCB_LISTEN, pcb);
  39174. pcb = NULL;
  39175. break;
  39176. case SYN_SENT:
  39177. err = ERR_OK;
  39178. TCP_PCB_REMOVE_ACTIVE(pcb);
  39179. 802da90: 701a strb r2, [r3, #0]
  39180. memp_free(MEMP_TCP_PCB, pcb);
  39181. 802da92: f7ff f9c3 bl 802ce1c <memp_free>
  39182. pcb = NULL;
  39183. snmp_inc_tcpattemptfails();
  39184. 802da96: f004 f893 bl 8031bc0 <snmp_inc_tcpattemptfails>
  39185. break;
  39186. 802da9a: e01c b.n 802dad6 <tcp_close_shutdown+0x13e>
  39187. case SYN_RCVD:
  39188. err = tcp_send_fin(pcb);
  39189. 802da9c: 4620 mov r0, r4
  39190. 802da9e: f001 fabe bl 802f01e <tcp_send_fin>
  39191. if (err == ERR_OK) {
  39192. 802daa2: b998 cbnz r0, 802dacc <tcp_close_shutdown+0x134>
  39193. snmp_inc_tcpattemptfails();
  39194. 802daa4: f004 f88c bl 8031bc0 <snmp_inc_tcpattemptfails>
  39195. 802daa8: e005 b.n 802dab6 <tcp_close_shutdown+0x11e>
  39196. pcb->state = FIN_WAIT_1;
  39197. }
  39198. break;
  39199. case ESTABLISHED:
  39200. err = tcp_send_fin(pcb);
  39201. 802daaa: 4620 mov r0, r4
  39202. 802daac: f001 fab7 bl 802f01e <tcp_send_fin>
  39203. if (err == ERR_OK) {
  39204. 802dab0: b960 cbnz r0, 802dacc <tcp_close_shutdown+0x134>
  39205. snmp_inc_tcpestabresets();
  39206. 802dab2: f004 f88d bl 8031bd0 <snmp_inc_tcpestabresets>
  39207. pcb->state = FIN_WAIT_1;
  39208. 802dab6: 2305 movs r3, #5
  39209. 802dab8: e006 b.n 802dac8 <tcp_close_shutdown+0x130>
  39210. }
  39211. break;
  39212. case CLOSE_WAIT:
  39213. err = tcp_send_fin(pcb);
  39214. 802daba: 4620 mov r0, r4
  39215. 802dabc: f001 faaf bl 802f01e <tcp_send_fin>
  39216. if (err == ERR_OK) {
  39217. 802dac0: b920 cbnz r0, 802dacc <tcp_close_shutdown+0x134>
  39218. snmp_inc_tcpestabresets();
  39219. 802dac2: f004 f885 bl 8031bd0 <snmp_inc_tcpestabresets>
  39220. pcb->state = LAST_ACK;
  39221. 802dac6: 2309 movs r3, #9
  39222. 802dac8: 7623 strb r3, [r4, #24]
  39223. 802daca: e001 b.n 802dad0 <tcp_close_shutdown+0x138>
  39224. 802dacc: b240 sxtb r0, r0
  39225. 802dace: e004 b.n 802dada <tcp_close_shutdown+0x142>
  39226. returns (unsent data is sent from tcp timer functions, also), we don't care
  39227. for the return value of tcp_output for now. */
  39228. /* @todo: When implementing SO_LINGER, this must be changed somehow:
  39229. If SOF_LINGER is set, the data should be sent and acked before close returns.
  39230. This can only be valid for sequential APIs, not for the raw API. */
  39231. tcp_output(pcb);
  39232. 802dad0: 4620 mov r0, r4
  39233. 802dad2: f001 fae9 bl 802f0a8 <tcp_output>
  39234. 802dad6: 2000 movs r0, #0
  39235. 802dad8: e7f8 b.n 802dacc <tcp_close_shutdown+0x134>
  39236. }
  39237. return err;
  39238. }
  39239. 802dada: bd3e pop {r1, r2, r3, r4, r5, pc}
  39240. 802dadc: 20010fdc .word 0x20010fdc
  39241. 802dae0: 20010fe8 .word 0x20010fe8
  39242. 802dae4: 20010fd8 .word 0x20010fd8
  39243. 802dae8: 20010ff0 .word 0x20010ff0
  39244. 802daec: 20010fec .word 0x20010fec
  39245. 802daf0: 20010fe4 .word 0x20010fe4
  39246. 0802daf4 <tcp_close>:
  39247. #if TCP_DEBUG
  39248. LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in "));
  39249. tcp_debug_print_state(pcb->state);
  39250. #endif /* TCP_DEBUG */
  39251. if (pcb->state != LISTEN) {
  39252. 802daf4: 7e03 ldrb r3, [r0, #24]
  39253. 802daf6: 2b01 cmp r3, #1
  39254. 802daf8: d003 beq.n 802db02 <tcp_close+0xe>
  39255. /* Set a flag not to receive any more data... */
  39256. pcb->flags |= TF_RXCLOSED;
  39257. 802dafa: 7f83 ldrb r3, [r0, #30]
  39258. 802dafc: f043 0310 orr.w r3, r3, #16
  39259. 802db00: 7783 strb r3, [r0, #30]
  39260. }
  39261. /* ... and close */
  39262. return tcp_close_shutdown(pcb, 1);
  39263. 802db02: 2101 movs r1, #1
  39264. 802db04: f7ff bf48 b.w 802d998 <tcp_close_shutdown>
  39265. 0802db08 <tcp_recv_null>:
  39266. * Default receive callback that is called if the user didn't register
  39267. * a recv callback for the pcb.
  39268. */
  39269. err_t
  39270. tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  39271. {
  39272. 802db08: b510 push {r4, lr}
  39273. 802db0a: 4608 mov r0, r1
  39274. LWIP_UNUSED_ARG(arg);
  39275. if (p != NULL) {
  39276. 802db0c: 4614 mov r4, r2
  39277. 802db0e: b132 cbz r2, 802db1e <tcp_recv_null+0x16>
  39278. tcp_recved(pcb, p->tot_len);
  39279. 802db10: 8911 ldrh r1, [r2, #8]
  39280. 802db12: f7ff fd1f bl 802d554 <tcp_recved>
  39281. pbuf_free(p);
  39282. 802db16: 4620 mov r0, r4
  39283. 802db18: f7ff fa8a bl 802d030 <pbuf_free>
  39284. 802db1c: e004 b.n 802db28 <tcp_recv_null+0x20>
  39285. } else if (err == ERR_OK) {
  39286. 802db1e: b91b cbnz r3, 802db28 <tcp_recv_null+0x20>
  39287. return tcp_close(pcb);
  39288. }
  39289. return ERR_OK;
  39290. }
  39291. 802db20: e8bd 4010 ldmia.w sp!, {r4, lr}
  39292. LWIP_UNUSED_ARG(arg);
  39293. if (p != NULL) {
  39294. tcp_recved(pcb, p->tot_len);
  39295. pbuf_free(p);
  39296. } else if (err == ERR_OK) {
  39297. return tcp_close(pcb);
  39298. 802db24: f7ff bfe6 b.w 802daf4 <tcp_close>
  39299. }
  39300. return ERR_OK;
  39301. }
  39302. 802db28: 2000 movs r0, #0
  39303. 802db2a: bd10 pop {r4, pc}
  39304. 0802db2c <tcp_process_refused_data>:
  39305. }
  39306. /** Pass pcb->refused_data to the recv callback */
  39307. err_t
  39308. tcp_process_refused_data(struct tcp_pcb *pcb)
  39309. {
  39310. 802db2c: b5f8 push {r3, r4, r5, r6, r7, lr}
  39311. err_t err;
  39312. u8_t refused_flags = pcb->refused_data->flags;
  39313. 802db2e: 6f45 ldr r5, [r0, #116] ; 0x74
  39314. closes the pcb */
  39315. struct pbuf *refused_data = pcb->refused_data;
  39316. pcb->refused_data = NULL;
  39317. /* Notify again application with data previously received. */
  39318. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n"));
  39319. TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);
  39320. 802db30: 6fc6 ldr r6, [r0, #124] ; 0x7c
  39321. /** Pass pcb->refused_data to the recv callback */
  39322. err_t
  39323. tcp_process_refused_data(struct tcp_pcb *pcb)
  39324. {
  39325. err_t err;
  39326. u8_t refused_flags = pcb->refused_data->flags;
  39327. 802db32: 7b6f ldrb r7, [r5, #13]
  39328. /* set pcb->refused_data to NULL in case the callback frees it and then
  39329. closes the pcb */
  39330. struct pbuf *refused_data = pcb->refused_data;
  39331. pcb->refused_data = NULL;
  39332. 802db34: 2300 movs r3, #0
  39333. }
  39334. /** Pass pcb->refused_data to the recv callback */
  39335. err_t
  39336. tcp_process_refused_data(struct tcp_pcb *pcb)
  39337. {
  39338. 802db36: 4604 mov r4, r0
  39339. err_t err;
  39340. u8_t refused_flags = pcb->refused_data->flags;
  39341. /* set pcb->refused_data to NULL in case the callback frees it and then
  39342. closes the pcb */
  39343. struct pbuf *refused_data = pcb->refused_data;
  39344. pcb->refused_data = NULL;
  39345. 802db38: 6743 str r3, [r0, #116] ; 0x74
  39346. /* Notify again application with data previously received. */
  39347. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n"));
  39348. TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);
  39349. 802db3a: b126 cbz r6, 802db46 <tcp_process_refused_data+0x1a>
  39350. 802db3c: 4621 mov r1, r4
  39351. 802db3e: 462a mov r2, r5
  39352. 802db40: 6900 ldr r0, [r0, #16]
  39353. 802db42: 47b0 blx r6
  39354. 802db44: e005 b.n 802db52 <tcp_process_refused_data+0x26>
  39355. 802db46: 4630 mov r0, r6
  39356. 802db48: 4621 mov r1, r4
  39357. 802db4a: 462a mov r2, r5
  39358. 802db4c: 4633 mov r3, r6
  39359. 802db4e: f7ff ffdb bl 802db08 <tcp_recv_null>
  39360. if (err == ERR_OK) {
  39361. 802db52: b9b0 cbnz r0, 802db82 <tcp_process_refused_data+0x56>
  39362. /* did refused_data include a FIN? */
  39363. if (refused_flags & PBUF_FLAG_TCP_FIN) {
  39364. 802db54: f007 0720 and.w r7, r7, #32
  39365. 802db58: b2ff uxtb r7, r7
  39366. 802db5a: b1bf cbz r7, 802db8c <tcp_process_refused_data+0x60>
  39367. /* correct rcv_wnd as the application won't call tcp_recved()
  39368. for the FIN's seqno */
  39369. if (pcb->rcv_wnd != TCP_WND) {
  39370. 802db5c: 8da3 ldrh r3, [r4, #44] ; 0x2c
  39371. 802db5e: f241 62d0 movw r2, #5840 ; 0x16d0
  39372. 802db62: 4293 cmp r3, r2
  39373. 802db64: d001 beq.n 802db6a <tcp_process_refused_data+0x3e>
  39374. pcb->rcv_wnd++;
  39375. 802db66: 3301 adds r3, #1
  39376. 802db68: 85a3 strh r3, [r4, #44] ; 0x2c
  39377. }
  39378. TCP_EVENT_CLOSED(pcb, err);
  39379. 802db6a: 6fe5 ldr r5, [r4, #124] ; 0x7c
  39380. 802db6c: b905 cbnz r5, 802db70 <tcp_process_refused_data+0x44>
  39381. 802db6e: e00c b.n 802db8a <tcp_process_refused_data+0x5e>
  39382. 802db70: 2200 movs r2, #0
  39383. 802db72: 6920 ldr r0, [r4, #16]
  39384. 802db74: 4621 mov r1, r4
  39385. 802db76: 4613 mov r3, r2
  39386. 802db78: 47a8 blx r5
  39387. if (err == ERR_ABRT) {
  39388. 802db7a: 300a adds r0, #10
  39389. 802db7c: d105 bne.n 802db8a <tcp_process_refused_data+0x5e>
  39390. return ERR_ABRT;
  39391. 802db7e: 20f6 movs r0, #246 ; 0xf6
  39392. 802db80: e004 b.n 802db8c <tcp_process_refused_data+0x60>
  39393. }
  39394. }
  39395. } else if (err == ERR_ABRT) {
  39396. 802db82: b240 sxtb r0, r0
  39397. 802db84: 300a adds r0, #10
  39398. 802db86: d0fa beq.n 802db7e <tcp_process_refused_data+0x52>
  39399. segment contains data). */
  39400. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n"));
  39401. return ERR_ABRT;
  39402. } else {
  39403. /* data is still refused, pbuf is still valid (go on for ACK-only packets) */
  39404. pcb->refused_data = refused_data;
  39405. 802db88: 6765 str r5, [r4, #116] ; 0x74
  39406. }
  39407. return ERR_OK;
  39408. 802db8a: 2000 movs r0, #0
  39409. }
  39410. 802db8c: b240 sxtb r0, r0
  39411. 802db8e: bdf8 pop {r3, r4, r5, r6, r7, pc}
  39412. 0802db90 <tcp_fasttmr>:
  39413. *
  39414. * Automatically called from tcp_tmr().
  39415. */
  39416. void
  39417. tcp_fasttmr(void)
  39418. {
  39419. 802db90: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  39420. struct tcp_pcb *pcb;
  39421. ++tcp_timer_ctr;
  39422. 802db94: 4b18 ldr r3, [pc, #96] ; (802dbf8 <tcp_fasttmr+0x68>)
  39423. tcp_fasttmr_start:
  39424. pcb = tcp_active_pcbs;
  39425. 802db96: 4f19 ldr r7, [pc, #100] ; (802dbfc <tcp_fasttmr+0x6c>)
  39426. void
  39427. tcp_fasttmr(void)
  39428. {
  39429. struct tcp_pcb *pcb;
  39430. ++tcp_timer_ctr;
  39431. 802db98: 781a ldrb r2, [r3, #0]
  39432. 802db9a: 3201 adds r2, #1
  39433. 802db9c: 701a strb r2, [r3, #0]
  39434. tcp_fasttmr_start:
  39435. pcb = tcp_active_pcbs;
  39436. while(pcb != NULL) {
  39437. if (pcb->last_timer != tcp_timer_ctr) {
  39438. 802db9e: 4698 mov r8, r3
  39439. struct tcp_pcb *pcb;
  39440. ++tcp_timer_ctr;
  39441. tcp_fasttmr_start:
  39442. pcb = tcp_active_pcbs;
  39443. 802dba0: 683c ldr r4, [r7, #0]
  39444. next = pcb->next;
  39445. /* If there is data which was previously "refused" by upper layer */
  39446. if (pcb->refused_data != NULL) {
  39447. tcp_active_pcbs_changed = 0;
  39448. 802dba2: 4d17 ldr r5, [pc, #92] ; (802dc00 <tcp_fasttmr+0x70>)
  39449. 802dba4: 2600 movs r6, #0
  39450. ++tcp_timer_ctr;
  39451. tcp_fasttmr_start:
  39452. pcb = tcp_active_pcbs;
  39453. while(pcb != NULL) {
  39454. 802dba6: e022 b.n 802dbee <tcp_fasttmr+0x5e>
  39455. if (pcb->last_timer != tcp_timer_ctr) {
  39456. 802dba8: f898 2000 ldrb.w r2, [r8]
  39457. 802dbac: f894 3021 ldrb.w r3, [r4, #33] ; 0x21
  39458. 802dbb0: 4293 cmp r3, r2
  39459. 802dbb2: d020 beq.n 802dbf6 <tcp_fasttmr+0x66>
  39460. struct tcp_pcb *next;
  39461. pcb->last_timer = tcp_timer_ctr;
  39462. 802dbb4: f884 2021 strb.w r2, [r4, #33] ; 0x21
  39463. /* send delayed ACKs */
  39464. if (pcb->flags & TF_ACK_DELAY) {
  39465. 802dbb8: 7fa2 ldrb r2, [r4, #30]
  39466. 802dbba: 07d1 lsls r1, r2, #31
  39467. 802dbbc: d509 bpl.n 802dbd2 <tcp_fasttmr+0x42>
  39468. LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
  39469. tcp_ack_now(pcb);
  39470. 802dbbe: f042 0202 orr.w r2, r2, #2
  39471. 802dbc2: 77a2 strb r2, [r4, #30]
  39472. tcp_output(pcb);
  39473. 802dbc4: 4620 mov r0, r4
  39474. 802dbc6: f001 fa6f bl 802f0a8 <tcp_output>
  39475. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  39476. 802dbca: 7fa3 ldrb r3, [r4, #30]
  39477. 802dbcc: f023 0303 bic.w r3, r3, #3
  39478. 802dbd0: 77a3 strb r3, [r4, #30]
  39479. }
  39480. next = pcb->next;
  39481. /* If there is data which was previously "refused" by upper layer */
  39482. if (pcb->refused_data != NULL) {
  39483. 802dbd2: 6f63 ldr r3, [r4, #116] ; 0x74
  39484. tcp_ack_now(pcb);
  39485. tcp_output(pcb);
  39486. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  39487. }
  39488. next = pcb->next;
  39489. 802dbd4: f8d4 900c ldr.w r9, [r4, #12]
  39490. /* If there is data which was previously "refused" by upper layer */
  39491. if (pcb->refused_data != NULL) {
  39492. 802dbd8: b90b cbnz r3, 802dbde <tcp_fasttmr+0x4e>
  39493. 802dbda: 464c mov r4, r9
  39494. 802dbdc: e007 b.n 802dbee <tcp_fasttmr+0x5e>
  39495. tcp_active_pcbs_changed = 0;
  39496. tcp_process_refused_data(pcb);
  39497. 802dbde: 4620 mov r0, r4
  39498. next = pcb->next;
  39499. /* If there is data which was previously "refused" by upper layer */
  39500. if (pcb->refused_data != NULL) {
  39501. tcp_active_pcbs_changed = 0;
  39502. 802dbe0: 702e strb r6, [r5, #0]
  39503. tcp_process_refused_data(pcb);
  39504. 802dbe2: f7ff ffa3 bl 802db2c <tcp_process_refused_data>
  39505. if (tcp_active_pcbs_changed) {
  39506. 802dbe6: 782b ldrb r3, [r5, #0]
  39507. 802dbe8: 2b00 cmp r3, #0
  39508. 802dbea: d1d9 bne.n 802dba0 <tcp_fasttmr+0x10>
  39509. 802dbec: e7f5 b.n 802dbda <tcp_fasttmr+0x4a>
  39510. ++tcp_timer_ctr;
  39511. tcp_fasttmr_start:
  39512. pcb = tcp_active_pcbs;
  39513. while(pcb != NULL) {
  39514. 802dbee: 2c00 cmp r4, #0
  39515. 802dbf0: d1da bne.n 802dba8 <tcp_fasttmr+0x18>
  39516. 802dbf2: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  39517. 802dbf6: e7fe b.n 802dbf6 <tcp_fasttmr+0x66>
  39518. 802dbf8: 2000e0ed .word 0x2000e0ed
  39519. 802dbfc: 20010fdc .word 0x20010fdc
  39520. 802dc00: 20010fd8 .word 0x20010fd8
  39521. 0802dc04 <tcp_tmr>:
  39522. /**
  39523. * Called periodically to dispatch TCP timers.
  39524. */
  39525. void
  39526. tcp_tmr(void)
  39527. {
  39528. 802dc04: b508 push {r3, lr}
  39529. /* Call tcp_fasttmr() every 250 ms */
  39530. tcp_fasttmr();
  39531. 802dc06: f7ff ffc3 bl 802db90 <tcp_fasttmr>
  39532. if (++tcp_timer & 1) {
  39533. 802dc0a: 4a06 ldr r2, [pc, #24] ; (802dc24 <tcp_tmr+0x20>)
  39534. 802dc0c: 7813 ldrb r3, [r2, #0]
  39535. 802dc0e: 3301 adds r3, #1
  39536. 802dc10: b2db uxtb r3, r3
  39537. 802dc12: 07d8 lsls r0, r3, #31
  39538. 802dc14: 7013 strb r3, [r2, #0]
  39539. 802dc16: d503 bpl.n 802dc20 <tcp_tmr+0x1c>
  39540. /* Call tcp_tmr() every 500 ms, i.e., every other timer
  39541. tcp_tmr() is called. */
  39542. tcp_slowtmr();
  39543. }
  39544. }
  39545. 802dc18: e8bd 4008 ldmia.w sp!, {r3, lr}
  39546. tcp_fasttmr();
  39547. if (++tcp_timer & 1) {
  39548. /* Call tcp_tmr() every 500 ms, i.e., every other timer
  39549. tcp_tmr() is called. */
  39550. tcp_slowtmr();
  39551. 802dc1c: f7ff bcfa b.w 802d614 <tcp_slowtmr>
  39552. 802dc20: bd08 pop {r3, pc}
  39553. 802dc22: bf00 nop
  39554. 802dc24: 2000e0ec .word 0x2000e0ec
  39555. 0802dc28 <tcp_next_iss>:
  39556. u32_t
  39557. tcp_next_iss(void)
  39558. {
  39559. static u32_t iss = 6510;
  39560. iss += tcp_ticks; /* XXX */
  39561. 802dc28: 4b03 ldr r3, [pc, #12] ; (802dc38 <tcp_next_iss+0x10>)
  39562. 802dc2a: 4a04 ldr r2, [pc, #16] ; (802dc3c <tcp_next_iss+0x14>)
  39563. 802dc2c: 6810 ldr r0, [r2, #0]
  39564. 802dc2e: 681a ldr r2, [r3, #0]
  39565. 802dc30: 1880 adds r0, r0, r2
  39566. 802dc32: 6018 str r0, [r3, #0]
  39567. return iss;
  39568. }
  39569. 802dc34: 4770 bx lr
  39570. 802dc36: bf00 nop
  39571. 802dc38: 200015e8 .word 0x200015e8
  39572. 802dc3c: 20010fe0 .word 0x20010fe0
  39573. 0802dc40 <tcp_alloc>:
  39574. * @param prio priority for the new pcb
  39575. * @return a new tcp_pcb that initially is in state CLOSED
  39576. */
  39577. struct tcp_pcb *
  39578. tcp_alloc(u8_t prio)
  39579. {
  39580. 802dc40: b5f8 push {r3, r4, r5, r6, r7, lr}
  39581. 802dc42: 4605 mov r5, r0
  39582. struct tcp_pcb *pcb;
  39583. u32_t iss;
  39584. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  39585. 802dc44: 2002 movs r0, #2
  39586. 802dc46: f7ff f8d3 bl 802cdf0 <memp_malloc>
  39587. if (pcb == NULL) {
  39588. 802dc4a: 4604 mov r4, r0
  39589. 802dc4c: 2800 cmp r0, #0
  39590. 802dc4e: d136 bne.n 802dcbe <tcp_alloc+0x7e>
  39591. u32_t inactivity;
  39592. inactivity = 0;
  39593. inactive = NULL;
  39594. /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
  39595. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  39596. 802dc50: 4b39 ldr r3, [pc, #228] ; (802dd38 <tcp_alloc+0xf8>)
  39597. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  39598. 802dc52: 4a3a ldr r2, [pc, #232] ; (802dd3c <tcp_alloc+0xfc>)
  39599. u32_t inactivity;
  39600. inactivity = 0;
  39601. inactive = NULL;
  39602. /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
  39603. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  39604. 802dc54: 681b ldr r3, [r3, #0]
  39605. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  39606. 802dc56: 6811 ldr r1, [r2, #0]
  39607. 802dc58: e007 b.n 802dc6a <tcp_alloc+0x2a>
  39608. 802dc5a: 6a5a ldr r2, [r3, #36] ; 0x24
  39609. 802dc5c: 1a8a subs r2, r1, r2
  39610. 802dc5e: 42a2 cmp r2, r4
  39611. 802dc60: bf34 ite cc
  39612. 802dc62: 4622 movcc r2, r4
  39613. 802dc64: 4618 movcs r0, r3
  39614. u32_t inactivity;
  39615. inactivity = 0;
  39616. inactive = NULL;
  39617. /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
  39618. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  39619. 802dc66: 68db ldr r3, [r3, #12]
  39620. 802dc68: 4614 mov r4, r2
  39621. 802dc6a: 2b00 cmp r3, #0
  39622. 802dc6c: d1f5 bne.n 802dc5a <tcp_alloc+0x1a>
  39623. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  39624. inactivity = tcp_ticks - pcb->tmr;
  39625. inactive = pcb;
  39626. }
  39627. }
  39628. if (inactive != NULL) {
  39629. 802dc6e: b108 cbz r0, 802dc74 <tcp_alloc+0x34>
  39630. LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n",
  39631. (void *)inactive, inactivity));
  39632. tcp_abort(inactive);
  39633. 802dc70: f7ff fe8e bl 802d990 <tcp_abort>
  39634. if (pcb == NULL) {
  39635. /* Try killing oldest connection in TIME-WAIT. */
  39636. LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
  39637. tcp_kill_timewait();
  39638. /* Try to allocate a tcp_pcb again. */
  39639. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  39640. 802dc74: 2002 movs r0, #2
  39641. 802dc76: f7ff f8bb bl 802cdf0 <memp_malloc>
  39642. if (pcb == NULL) {
  39643. 802dc7a: 4604 mov r4, r0
  39644. 802dc7c: b9f8 cbnz r0, 802dcbe <tcp_alloc+0x7e>
  39645. inactivity = 0;
  39646. inactive = NULL;
  39647. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  39648. if (pcb->prio <= prio &&
  39649. pcb->prio <= mprio &&
  39650. (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  39651. 802dc7e: 4a2f ldr r2, [pc, #188] ; (802dd3c <tcp_alloc+0xfc>)
  39652. mprio = TCP_PRIO_MAX;
  39653. /* We kill the oldest active connection that has lower priority than prio. */
  39654. inactivity = 0;
  39655. inactive = NULL;
  39656. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  39657. 802dc80: 4b2f ldr r3, [pc, #188] ; (802dd40 <tcp_alloc+0x100>)
  39658. if (pcb->prio <= prio &&
  39659. pcb->prio <= mprio &&
  39660. (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  39661. 802dc82: 6817 ldr r7, [r2, #0]
  39662. mprio = TCP_PRIO_MAX;
  39663. /* We kill the oldest active connection that has lower priority than prio. */
  39664. inactivity = 0;
  39665. inactive = NULL;
  39666. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  39667. 802dc84: 681b ldr r3, [r3, #0]
  39668. struct tcp_pcb *pcb, *inactive;
  39669. u32_t inactivity;
  39670. u8_t mprio;
  39671. mprio = TCP_PRIO_MAX;
  39672. 802dc86: 207f movs r0, #127 ; 0x7f
  39673. /* We kill the oldest active connection that has lower priority than prio. */
  39674. inactivity = 0;
  39675. inactive = NULL;
  39676. 802dc88: 4622 mov r2, r4
  39677. 802dc8a: e00c b.n 802dca6 <tcp_alloc+0x66>
  39678. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  39679. if (pcb->prio <= prio &&
  39680. 802dc8c: 7e59 ldrb r1, [r3, #25]
  39681. 802dc8e: 42a9 cmp r1, r5
  39682. 802dc90: d808 bhi.n 802dca4 <tcp_alloc+0x64>
  39683. 802dc92: 4281 cmp r1, r0
  39684. 802dc94: d806 bhi.n 802dca4 <tcp_alloc+0x64>
  39685. pcb->prio <= mprio &&
  39686. (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  39687. 802dc96: 6a5e ldr r6, [r3, #36] ; 0x24
  39688. 802dc98: 1bbe subs r6, r7, r6
  39689. /* We kill the oldest active connection that has lower priority than prio. */
  39690. inactivity = 0;
  39691. inactive = NULL;
  39692. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  39693. if (pcb->prio <= prio &&
  39694. pcb->prio <= mprio &&
  39695. 802dc9a: 42a6 cmp r6, r4
  39696. 802dc9c: d302 bcc.n 802dca4 <tcp_alloc+0x64>
  39697. 802dc9e: 4608 mov r0, r1
  39698. 802dca0: 4634 mov r4, r6
  39699. 802dca2: 461a mov r2, r3
  39700. mprio = TCP_PRIO_MAX;
  39701. /* We kill the oldest active connection that has lower priority than prio. */
  39702. inactivity = 0;
  39703. inactive = NULL;
  39704. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  39705. 802dca4: 68db ldr r3, [r3, #12]
  39706. 802dca6: 2b00 cmp r3, #0
  39707. 802dca8: d1f0 bne.n 802dc8c <tcp_alloc+0x4c>
  39708. inactivity = tcp_ticks - pcb->tmr;
  39709. inactive = pcb;
  39710. mprio = pcb->prio;
  39711. }
  39712. }
  39713. if (inactive != NULL) {
  39714. 802dcaa: b112 cbz r2, 802dcb2 <tcp_alloc+0x72>
  39715. LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n",
  39716. (void *)inactive, inactivity));
  39717. tcp_abort(inactive);
  39718. 802dcac: 4610 mov r0, r2
  39719. 802dcae: f7ff fe6f bl 802d990 <tcp_abort>
  39720. if (pcb == NULL) {
  39721. /* Try killing active connections with lower priority than the new one. */
  39722. LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio));
  39723. tcp_kill_prio(prio);
  39724. /* Try to allocate a tcp_pcb again. */
  39725. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  39726. 802dcb2: 2002 movs r0, #2
  39727. 802dcb4: f7ff f89c bl 802cdf0 <memp_malloc>
  39728. if (pcb != NULL) {
  39729. /* adjust err stats: timewait PCB was freed above */
  39730. MEMP_STATS_DEC(err, MEMP_TCP_PCB);
  39731. }
  39732. }
  39733. if (pcb != NULL) {
  39734. 802dcb8: 4604 mov r4, r0
  39735. 802dcba: 2800 cmp r0, #0
  39736. 802dcbc: d039 beq.n 802dd32 <tcp_alloc+0xf2>
  39737. memset(pcb, 0, sizeof(struct tcp_pcb));
  39738. 802dcbe: 2100 movs r1, #0
  39739. 802dcc0: 2294 movs r2, #148 ; 0x94
  39740. 802dcc2: 4620 mov r0, r4
  39741. 802dcc4: f7f3 fefc bl 8021ac0 <memset>
  39742. pcb->prio = prio;
  39743. pcb->snd_buf = TCP_SND_BUF;
  39744. pcb->snd_queuelen = 0;
  39745. pcb->rcv_wnd = TCP_WND;
  39746. 802dcc8: f241 62d0 movw r2, #5840 ; 0x16d0
  39747. }
  39748. }
  39749. if (pcb != NULL) {
  39750. memset(pcb, 0, sizeof(struct tcp_pcb));
  39751. pcb->prio = prio;
  39752. pcb->snd_buf = TCP_SND_BUF;
  39753. 802dccc: f246 63a8 movw r3, #26280 ; 0x66a8
  39754. 802dcd0: f8a4 3066 strh.w r3, [r4, #102] ; 0x66
  39755. pcb->snd_queuelen = 0;
  39756. pcb->rcv_wnd = TCP_WND;
  39757. 802dcd4: 85a2 strh r2, [r4, #44] ; 0x2c
  39758. }
  39759. if (pcb != NULL) {
  39760. memset(pcb, 0, sizeof(struct tcp_pcb));
  39761. pcb->prio = prio;
  39762. pcb->snd_buf = TCP_SND_BUF;
  39763. pcb->snd_queuelen = 0;
  39764. 802dcd6: 2300 movs r3, #0
  39765. pcb->rcv_wnd = TCP_WND;
  39766. pcb->rcv_ann_wnd = TCP_WND;
  39767. 802dcd8: 85e2 strh r2, [r4, #46] ; 0x2e
  39768. pcb->tos = 0;
  39769. pcb->ttl = TCP_TTL;
  39770. 802dcda: 22ff movs r2, #255 ; 0xff
  39771. MEMP_STATS_DEC(err, MEMP_TCP_PCB);
  39772. }
  39773. }
  39774. if (pcb != NULL) {
  39775. memset(pcb, 0, sizeof(struct tcp_pcb));
  39776. pcb->prio = prio;
  39777. 802dcdc: 7665 strb r5, [r4, #25]
  39778. pcb->snd_buf = TCP_SND_BUF;
  39779. pcb->snd_queuelen = 0;
  39780. 802dcde: f8a4 3068 strh.w r3, [r4, #104] ; 0x68
  39781. 802dce2: 461d mov r5, r3
  39782. pcb->rcv_wnd = TCP_WND;
  39783. pcb->rcv_ann_wnd = TCP_WND;
  39784. pcb->tos = 0;
  39785. 802dce4: 7263 strb r3, [r4, #9]
  39786. pcb->ttl = TCP_TTL;
  39787. 802dce6: 72a2 strb r2, [r4, #10]
  39788. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  39789. The send MSS is updated when an MSS option is received. */
  39790. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  39791. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  39792. pcb->sa = 0;
  39793. 802dce8: f8a4 3040 strh.w r3, [r4, #64] ; 0x40
  39794. pcb->rcv_ann_wnd = TCP_WND;
  39795. pcb->tos = 0;
  39796. pcb->ttl = TCP_TTL;
  39797. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  39798. The send MSS is updated when an MSS option is received. */
  39799. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  39800. 802dcec: f44f 7206 mov.w r2, #536 ; 0x218
  39801. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  39802. pcb->sa = 0;
  39803. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  39804. pcb->rtime = -1;
  39805. 802dcf0: f64f 73ff movw r3, #65535 ; 0xffff
  39806. pcb->rcv_ann_wnd = TCP_WND;
  39807. pcb->tos = 0;
  39808. pcb->ttl = TCP_TTL;
  39809. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  39810. The send MSS is updated when an MSS option is received. */
  39811. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  39812. 802dcf4: 86e2 strh r2, [r4, #54] ; 0x36
  39813. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  39814. pcb->sa = 0;
  39815. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  39816. pcb->rtime = -1;
  39817. 802dcf6: 86a3 strh r3, [r4, #52] ; 0x34
  39818. pcb->tos = 0;
  39819. pcb->ttl = TCP_TTL;
  39820. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  39821. The send MSS is updated when an MSS option is received. */
  39822. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  39823. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  39824. 802dcf8: 2206 movs r2, #6
  39825. pcb->sa = 0;
  39826. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  39827. pcb->rtime = -1;
  39828. pcb->cwnd = 1;
  39829. 802dcfa: 2301 movs r3, #1
  39830. 802dcfc: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  39831. pcb->tos = 0;
  39832. pcb->ttl = TCP_TTL;
  39833. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  39834. The send MSS is updated when an MSS option is received. */
  39835. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  39836. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  39837. 802dd00: f8a4 2044 strh.w r2, [r4, #68] ; 0x44
  39838. pcb->sa = 0;
  39839. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  39840. 802dd04: f8a4 2042 strh.w r2, [r4, #66] ; 0x42
  39841. pcb->rtime = -1;
  39842. pcb->cwnd = 1;
  39843. iss = tcp_next_iss();
  39844. 802dd08: f7ff ff8e bl 802dc28 <tcp_next_iss>
  39845. pcb->snd_wl2 = iss;
  39846. pcb->snd_nxt = iss;
  39847. pcb->lastack = iss;
  39848. pcb->snd_lbb = iss;
  39849. pcb->tmr = tcp_ticks;
  39850. 802dd0c: 4b0b ldr r3, [pc, #44] ; (802dd3c <tcp_alloc+0xfc>)
  39851. pcb->sa = 0;
  39852. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  39853. pcb->rtime = -1;
  39854. pcb->cwnd = 1;
  39855. iss = tcp_next_iss();
  39856. pcb->snd_wl2 = iss;
  39857. 802dd0e: 65a0 str r0, [r4, #88] ; 0x58
  39858. pcb->snd_nxt = iss;
  39859. pcb->lastack = iss;
  39860. pcb->snd_lbb = iss;
  39861. pcb->tmr = tcp_ticks;
  39862. 802dd10: 681b ldr r3, [r3, #0]
  39863. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  39864. pcb->rtime = -1;
  39865. pcb->cwnd = 1;
  39866. iss = tcp_next_iss();
  39867. pcb->snd_wl2 = iss;
  39868. pcb->snd_nxt = iss;
  39869. 802dd12: 6520 str r0, [r4, #80] ; 0x50
  39870. pcb->lastack = iss;
  39871. pcb->snd_lbb = iss;
  39872. pcb->tmr = tcp_ticks;
  39873. 802dd14: 6263 str r3, [r4, #36] ; 0x24
  39874. pcb->last_timer = tcp_timer_ctr;
  39875. 802dd16: 4b0b ldr r3, [pc, #44] ; (802dd44 <tcp_alloc+0x104>)
  39876. pcb->rtime = -1;
  39877. pcb->cwnd = 1;
  39878. iss = tcp_next_iss();
  39879. pcb->snd_wl2 = iss;
  39880. pcb->snd_nxt = iss;
  39881. pcb->lastack = iss;
  39882. 802dd18: 64a0 str r0, [r4, #72] ; 0x48
  39883. pcb->snd_lbb = iss;
  39884. pcb->tmr = tcp_ticks;
  39885. pcb->last_timer = tcp_timer_ctr;
  39886. 802dd1a: 781b ldrb r3, [r3, #0]
  39887. pcb->cwnd = 1;
  39888. iss = tcp_next_iss();
  39889. pcb->snd_wl2 = iss;
  39890. pcb->snd_nxt = iss;
  39891. pcb->lastack = iss;
  39892. pcb->snd_lbb = iss;
  39893. 802dd1c: 65e0 str r0, [r4, #92] ; 0x5c
  39894. pcb->tmr = tcp_ticks;
  39895. pcb->last_timer = tcp_timer_ctr;
  39896. 802dd1e: f884 3021 strb.w r3, [r4, #33] ; 0x21
  39897. pcb->polltmr = 0;
  39898. #if LWIP_CALLBACK_API
  39899. pcb->recv = tcp_recv_null;
  39900. 802dd22: 4b09 ldr r3, [pc, #36] ; (802dd48 <tcp_alloc+0x108>)
  39901. pcb->lastack = iss;
  39902. pcb->snd_lbb = iss;
  39903. pcb->tmr = tcp_ticks;
  39904. pcb->last_timer = tcp_timer_ctr;
  39905. pcb->polltmr = 0;
  39906. 802dd24: 77e5 strb r5, [r4, #31]
  39907. #if LWIP_CALLBACK_API
  39908. pcb->recv = tcp_recv_null;
  39909. 802dd26: 67e3 str r3, [r4, #124] ; 0x7c
  39910. #endif /* LWIP_CALLBACK_API */
  39911. /* Init KEEPALIVE timer */
  39912. pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
  39913. 802dd28: 4b08 ldr r3, [pc, #32] ; (802dd4c <tcp_alloc+0x10c>)
  39914. #if LWIP_TCP_KEEPALIVE
  39915. pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
  39916. pcb->keep_cnt = TCP_KEEPCNT_DEFAULT;
  39917. #endif /* LWIP_TCP_KEEPALIVE */
  39918. pcb->keep_cnt_sent = 0;
  39919. 802dd2a: f884 5092 strb.w r5, [r4, #146] ; 0x92
  39920. #if LWIP_CALLBACK_API
  39921. pcb->recv = tcp_recv_null;
  39922. #endif /* LWIP_CALLBACK_API */
  39923. /* Init KEEPALIVE timer */
  39924. pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
  39925. 802dd2e: f8c4 308c str.w r3, [r4, #140] ; 0x8c
  39926. #endif /* LWIP_TCP_KEEPALIVE */
  39927. pcb->keep_cnt_sent = 0;
  39928. }
  39929. return pcb;
  39930. }
  39931. 802dd32: 4620 mov r0, r4
  39932. 802dd34: bdf8 pop {r3, r4, r5, r6, r7, pc}
  39933. 802dd36: bf00 nop
  39934. 802dd38: 20010ff0 .word 0x20010ff0
  39935. 802dd3c: 20010fe0 .word 0x20010fe0
  39936. 802dd40: 20010fdc .word 0x20010fdc
  39937. 802dd44: 2000e0ed .word 0x2000e0ed
  39938. 802dd48: 0802db09 .word 0x0802db09
  39939. 802dd4c: 006ddd00 .word 0x006ddd00
  39940. 0802dd50 <tcp_new>:
  39941. * @return a new tcp_pcb that initially is in state CLOSED
  39942. */
  39943. struct tcp_pcb *
  39944. tcp_new(void)
  39945. {
  39946. return tcp_alloc(TCP_PRIO_NORMAL);
  39947. 802dd50: 2040 movs r0, #64 ; 0x40
  39948. 802dd52: f7ff bf75 b.w 802dc40 <tcp_alloc>
  39949. 0802dd56 <tcp_eff_send_mss>:
  39950. * by using ip_route to determin the netif used to send to the address and
  39951. * calculating the minimum of TCP_MSS and that netif's mtu (if set).
  39952. */
  39953. u16_t
  39954. tcp_eff_send_mss(u16_t sendmss, ip_addr_t *addr)
  39955. {
  39956. 802dd56: b510 push {r4, lr}
  39957. 802dd58: 4604 mov r4, r0
  39958. u16_t mss_s;
  39959. struct netif *outif;
  39960. outif = ip_route(addr);
  39961. 802dd5a: 4608 mov r0, r1
  39962. 802dd5c: f002 f8f2 bl 802ff44 <ip_route>
  39963. if ((outif != NULL) && (outif->mtu != 0)) {
  39964. 802dd60: b130 cbz r0, 802dd70 <tcp_eff_send_mss+0x1a>
  39965. 802dd62: 8c83 ldrh r3, [r0, #36] ; 0x24
  39966. 802dd64: b123 cbz r3, 802dd70 <tcp_eff_send_mss+0x1a>
  39967. mss_s = outif->mtu - IP_HLEN - TCP_HLEN;
  39968. 802dd66: 3b28 subs r3, #40 ; 0x28
  39969. /* RFC 1122, chap 4.2.2.6:
  39970. * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize
  39971. * We correct for TCP options in tcp_write(), and don't support IP options.
  39972. */
  39973. sendmss = LWIP_MIN(sendmss, mss_s);
  39974. 802dd68: b29b uxth r3, r3
  39975. 802dd6a: 429c cmp r4, r3
  39976. 802dd6c: bf28 it cs
  39977. 802dd6e: 461c movcs r4, r3
  39978. }
  39979. return sendmss;
  39980. }
  39981. 802dd70: 4620 mov r0, r4
  39982. 802dd72: bd10 pop {r4, pc}
  39983. 0802dd74 <tcp_parseopt>:
  39984. *
  39985. * @param pcb the tcp_pcb for which a segment arrived
  39986. */
  39987. static void
  39988. tcp_parseopt(struct tcp_pcb *pcb)
  39989. {
  39990. 802dd74: b5f8 push {r3, r4, r5, r6, r7, lr}
  39991. u8_t *opts, opt;
  39992. #if LWIP_TCP_TIMESTAMPS
  39993. u32_t tsval;
  39994. #endif
  39995. opts = (u8_t *)tcphdr + TCP_HLEN;
  39996. 802dd76: 4d1e ldr r5, [pc, #120] ; (802ddf0 <tcp_parseopt+0x7c>)
  39997. 802dd78: 682c ldr r4, [r5, #0]
  39998. *
  39999. * @param pcb the tcp_pcb for which a segment arrived
  40000. */
  40001. static void
  40002. tcp_parseopt(struct tcp_pcb *pcb)
  40003. {
  40004. 802dd7a: 4606 mov r6, r0
  40005. #endif
  40006. opts = (u8_t *)tcphdr + TCP_HLEN;
  40007. /* Parse the TCP MSS option, if present. */
  40008. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  40009. 802dd7c: 89a0 ldrh r0, [r4, #12]
  40010. 802dd7e: f7fe f81e bl 802bdbe <lwip_ntohs>
  40011. 802dd82: f3c0 300f ubfx r0, r0, #12, #16
  40012. 802dd86: 2805 cmp r0, #5
  40013. 802dd88: d931 bls.n 802ddee <tcp_parseopt+0x7a>
  40014. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  40015. 802dd8a: 682b ldr r3, [r5, #0]
  40016. 802dd8c: 8998 ldrh r0, [r3, #12]
  40017. 802dd8e: f7fe f816 bl 802bdbe <lwip_ntohs>
  40018. 802dd92: 0b00 lsrs r0, r0, #12
  40019. 802dd94: 1f41 subs r1, r0, #5
  40020. 802dd96: 0089 lsls r1, r1, #2
  40021. u8_t *opts, opt;
  40022. #if LWIP_TCP_TIMESTAMPS
  40023. u32_t tsval;
  40024. #endif
  40025. opts = (u8_t *)tcphdr + TCP_HLEN;
  40026. 802dd98: 3414 adds r4, #20
  40027. /* Parse the TCP MSS option, if present. */
  40028. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  40029. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  40030. 802dd9a: b289 uxth r1, r1
  40031. for (c = 0; c < max_c; ) {
  40032. 802dd9c: 2300 movs r3, #0
  40033. return;
  40034. }
  40035. /* An MSS option with the right option length. */
  40036. mss = (opts[c + 2] << 8) | opts[c + 3];
  40037. /* Limit the mss to the configured TCP_MSS and prevent division by zero */
  40038. pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
  40039. 802dd9e: f240 50b3 movw r0, #1459 ; 0x5b3
  40040. 802dda2: f240 55b4 movw r5, #1460 ; 0x5b4
  40041. opts = (u8_t *)tcphdr + TCP_HLEN;
  40042. /* Parse the TCP MSS option, if present. */
  40043. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  40044. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  40045. for (c = 0; c < max_c; ) {
  40046. 802dda6: e020 b.n 802ddea <tcp_parseopt+0x76>
  40047. opt = opts[c];
  40048. switch (opt) {
  40049. 802dda8: 5ce2 ldrb r2, [r4, r3]
  40050. 802ddaa: 2a01 cmp r2, #1
  40051. 802ddac: d005 beq.n 802ddba <tcp_parseopt+0x46>
  40052. 802ddae: d31e bcc.n 802ddee <tcp_parseopt+0x7a>
  40053. 802ddb0: 2a02 cmp r2, #2
  40054. 802ddb2: eb04 0203 add.w r2, r4, r3
  40055. 802ddb6: d114 bne.n 802dde2 <tcp_parseopt+0x6e>
  40056. 802ddb8: e001 b.n 802ddbe <tcp_parseopt+0x4a>
  40057. /* End of options. */
  40058. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n"));
  40059. return;
  40060. case 0x01:
  40061. /* NOP option. */
  40062. ++c;
  40063. 802ddba: 3301 adds r3, #1
  40064. 802ddbc: e014 b.n 802dde8 <tcp_parseopt+0x74>
  40065. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n"));
  40066. break;
  40067. case 0x02:
  40068. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n"));
  40069. if (opts[c + 1] != 0x04 || c + 0x04 > max_c) {
  40070. 802ddbe: 7857 ldrb r7, [r2, #1]
  40071. 802ddc0: 2f04 cmp r7, #4
  40072. 802ddc2: d114 bne.n 802ddee <tcp_parseopt+0x7a>
  40073. 802ddc4: 1cdf adds r7, r3, #3
  40074. 802ddc6: 428f cmp r7, r1
  40075. 802ddc8: da11 bge.n 802ddee <tcp_parseopt+0x7a>
  40076. /* Bad length */
  40077. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
  40078. return;
  40079. }
  40080. /* An MSS option with the right option length. */
  40081. mss = (opts[c + 2] << 8) | opts[c + 3];
  40082. 802ddca: 7897 ldrb r7, [r2, #2]
  40083. 802ddcc: 78d2 ldrb r2, [r2, #3]
  40084. 802ddce: ea42 2207 orr.w r2, r2, r7, lsl #8
  40085. /* Limit the mss to the configured TCP_MSS and prevent division by zero */
  40086. pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
  40087. 802ddd2: 1e57 subs r7, r2, #1
  40088. 802ddd4: b2bf uxth r7, r7
  40089. 802ddd6: 4287 cmp r7, r0
  40090. 802ddd8: bf88 it hi
  40091. 802ddda: 462a movhi r2, r5
  40092. 802dddc: 86f2 strh r2, [r6, #54] ; 0x36
  40093. /* Advance to next option */
  40094. c += 0x04;
  40095. 802ddde: 3304 adds r3, #4
  40096. 802dde0: e002 b.n 802dde8 <tcp_parseopt+0x74>
  40097. c += 0x0A;
  40098. break;
  40099. #endif
  40100. default:
  40101. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n"));
  40102. if (opts[c + 1] == 0) {
  40103. 802dde2: 7852 ldrb r2, [r2, #1]
  40104. 802dde4: b11a cbz r2, 802ddee <tcp_parseopt+0x7a>
  40105. and we don't process them further. */
  40106. return;
  40107. }
  40108. /* All other options have a length field, so that we easily
  40109. can skip past them. */
  40110. c += opts[c + 1];
  40111. 802dde6: 18d3 adds r3, r2, r3
  40112. 802dde8: b29b uxth r3, r3
  40113. opts = (u8_t *)tcphdr + TCP_HLEN;
  40114. /* Parse the TCP MSS option, if present. */
  40115. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  40116. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  40117. for (c = 0; c < max_c; ) {
  40118. 802ddea: 428b cmp r3, r1
  40119. 802ddec: d3dc bcc.n 802dda8 <tcp_parseopt+0x34>
  40120. 802ddee: bdf8 pop {r3, r4, r5, r6, r7, pc}
  40121. 802ddf0: 2000e0f0 .word 0x2000e0f0
  40122. 0802ddf4 <tcp_receive>:
  40123. *
  40124. * Called from tcp_process().
  40125. */
  40126. static void
  40127. tcp_receive(struct tcp_pcb *pcb)
  40128. {
  40129. 802ddf4: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  40130. u16_t ooseq_qlen;
  40131. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  40132. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  40133. if (flags & TCP_ACK) {
  40134. 802ddf8: 4ba0 ldr r3, [pc, #640] ; (802e07c <tcp_receive+0x288>)
  40135. 802ddfa: 781b ldrb r3, [r3, #0]
  40136. 802ddfc: f003 0310 and.w r3, r3, #16
  40137. 802de00: b2db uxtb r3, r3
  40138. *
  40139. * Called from tcp_process().
  40140. */
  40141. static void
  40142. tcp_receive(struct tcp_pcb *pcb)
  40143. {
  40144. 802de02: 4604 mov r4, r0
  40145. u16_t ooseq_qlen;
  40146. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  40147. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  40148. if (flags & TCP_ACK) {
  40149. 802de04: 2b00 cmp r3, #0
  40150. 802de06: f000 816b beq.w 802e0e0 <tcp_receive+0x2ec>
  40151. right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
  40152. /* Update window. */
  40153. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  40154. 802de0a: 4a9d ldr r2, [pc, #628] ; (802e080 <tcp_receive+0x28c>)
  40155. 802de0c: 6d43 ldr r3, [r0, #84] ; 0x54
  40156. 802de0e: 6812 ldr r2, [r2, #0]
  40157. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  40158. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  40159. if (flags & TCP_ACK) {
  40160. right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
  40161. 802de10: f8b0 5060 ldrh.w r5, [r0, #96] ; 0x60
  40162. 802de14: 6d81 ldr r1, [r0, #88] ; 0x58
  40163. /* Update window. */
  40164. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  40165. 802de16: 1a98 subs r0, r3, r2
  40166. 802de18: 2800 cmp r0, #0
  40167. 802de1a: db0e blt.n 802de3a <tcp_receive+0x46>
  40168. 802de1c: 4293 cmp r3, r2
  40169. 802de1e: 4b99 ldr r3, [pc, #612] ; (802e084 <tcp_receive+0x290>)
  40170. 802de20: d103 bne.n 802de2a <tcp_receive+0x36>
  40171. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  40172. 802de22: 6818 ldr r0, [r3, #0]
  40173. 802de24: 1a08 subs r0, r1, r0
  40174. 802de26: 2800 cmp r0, #0
  40175. 802de28: db07 blt.n 802de3a <tcp_receive+0x46>
  40176. 802de2a: 681b ldr r3, [r3, #0]
  40177. 802de2c: 4299 cmp r1, r3
  40178. 802de2e: d11f bne.n 802de70 <tcp_receive+0x7c>
  40179. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  40180. 802de30: 4b95 ldr r3, [pc, #596] ; (802e088 <tcp_receive+0x294>)
  40181. 802de32: 681b ldr r3, [r3, #0]
  40182. 802de34: 89db ldrh r3, [r3, #14]
  40183. 802de36: 42ab cmp r3, r5
  40184. 802de38: d91a bls.n 802de70 <tcp_receive+0x7c>
  40185. pcb->snd_wnd = tcphdr->wnd;
  40186. 802de3a: 4b93 ldr r3, [pc, #588] ; (802e088 <tcp_receive+0x294>)
  40187. /* keep track of the biggest window announced by the remote host to calculate
  40188. the maximum segment size */
  40189. if (pcb->snd_wnd_max < tcphdr->wnd) {
  40190. 802de3c: f8b4 6062 ldrh.w r6, [r4, #98] ; 0x62
  40191. /* Update window. */
  40192. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  40193. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  40194. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  40195. pcb->snd_wnd = tcphdr->wnd;
  40196. 802de40: 681b ldr r3, [r3, #0]
  40197. 802de42: 89d8 ldrh r0, [r3, #14]
  40198. /* keep track of the biggest window announced by the remote host to calculate
  40199. the maximum segment size */
  40200. if (pcb->snd_wnd_max < tcphdr->wnd) {
  40201. pcb->snd_wnd_max = tcphdr->wnd;
  40202. }
  40203. pcb->snd_wl1 = seqno;
  40204. 802de44: 6562 str r2, [r4, #84] ; 0x54
  40205. pcb->snd_wl2 = ackno;
  40206. 802de46: 4a8f ldr r2, [pc, #572] ; (802e084 <tcp_receive+0x290>)
  40207. /* Update window. */
  40208. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  40209. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  40210. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  40211. pcb->snd_wnd = tcphdr->wnd;
  40212. 802de48: f8a4 0060 strh.w r0, [r4, #96] ; 0x60
  40213. the maximum segment size */
  40214. if (pcb->snd_wnd_max < tcphdr->wnd) {
  40215. pcb->snd_wnd_max = tcphdr->wnd;
  40216. }
  40217. pcb->snd_wl1 = seqno;
  40218. pcb->snd_wl2 = ackno;
  40219. 802de4c: 6812 ldr r2, [r2, #0]
  40220. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  40221. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  40222. pcb->snd_wnd = tcphdr->wnd;
  40223. /* keep track of the biggest window announced by the remote host to calculate
  40224. the maximum segment size */
  40225. if (pcb->snd_wnd_max < tcphdr->wnd) {
  40226. 802de4e: 4286 cmp r6, r0
  40227. pcb->snd_wnd_max = tcphdr->wnd;
  40228. }
  40229. pcb->snd_wl1 = seqno;
  40230. pcb->snd_wl2 = ackno;
  40231. 802de50: 65a2 str r2, [r4, #88] ; 0x58
  40232. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  40233. pcb->snd_wnd = tcphdr->wnd;
  40234. /* keep track of the biggest window announced by the remote host to calculate
  40235. the maximum segment size */
  40236. if (pcb->snd_wnd_max < tcphdr->wnd) {
  40237. pcb->snd_wnd_max = tcphdr->wnd;
  40238. 802de52: bf38 it cc
  40239. 802de54: f8a4 0062 strhcc.w r0, [r4, #98] ; 0x62
  40240. 802de58: f894 2091 ldrb.w r2, [r4, #145] ; 0x91
  40241. }
  40242. pcb->snd_wl1 = seqno;
  40243. pcb->snd_wl2 = ackno;
  40244. if (pcb->snd_wnd == 0) {
  40245. 802de5c: b920 cbnz r0, 802de68 <tcp_receive+0x74>
  40246. if (pcb->persist_backoff == 0) {
  40247. 802de5e: b93a cbnz r2, 802de70 <tcp_receive+0x7c>
  40248. /* start persist timer */
  40249. pcb->persist_cnt = 0;
  40250. 802de60: f884 0090 strb.w r0, [r4, #144] ; 0x90
  40251. pcb->persist_backoff = 1;
  40252. 802de64: 2301 movs r3, #1
  40253. 802de66: e001 b.n 802de6c <tcp_receive+0x78>
  40254. }
  40255. } else if (pcb->persist_backoff > 0) {
  40256. 802de68: b112 cbz r2, 802de70 <tcp_receive+0x7c>
  40257. /* stop persist timer */
  40258. pcb->persist_backoff = 0;
  40259. 802de6a: 2300 movs r3, #0
  40260. 802de6c: f884 3091 strb.w r3, [r4, #145] ; 0x91
  40261. * If it only passes 1, should reset dupack counter
  40262. *
  40263. */
  40264. /* Clause 1 */
  40265. if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {
  40266. 802de70: 4b84 ldr r3, [pc, #528] ; (802e084 <tcp_receive+0x290>)
  40267. 802de72: 6ca2 ldr r2, [r4, #72] ; 0x48
  40268. 802de74: 681b ldr r3, [r3, #0]
  40269. 802de76: 1a98 subs r0, r3, r2
  40270. 802de78: 2800 cmp r0, #0
  40271. 802de7a: dc34 bgt.n 802dee6 <tcp_receive+0xf2>
  40272. pcb->acked = 0;
  40273. 802de7c: 2000 movs r0, #0
  40274. 802de7e: f8a4 0064 strh.w r0, [r4, #100] ; 0x64
  40275. /* Clause 2 */
  40276. if (tcplen == 0) {
  40277. 802de82: 4882 ldr r0, [pc, #520] ; (802e08c <tcp_receive+0x298>)
  40278. 802de84: 8800 ldrh r0, [r0, #0]
  40279. 802de86: 2800 cmp r0, #0
  40280. 802de88: f040 81f4 bne.w 802e274 <tcp_receive+0x480>
  40281. /* Clause 3 */
  40282. if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge){
  40283. 802de8c: f8b4 6060 ldrh.w r6, [r4, #96] ; 0x60
  40284. 802de90: 6da0 ldr r0, [r4, #88] ; 0x58
  40285. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  40286. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  40287. if (flags & TCP_ACK) {
  40288. right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
  40289. 802de92: 1869 adds r1, r5, r1
  40290. if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {
  40291. pcb->acked = 0;
  40292. /* Clause 2 */
  40293. if (tcplen == 0) {
  40294. /* Clause 3 */
  40295. if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge){
  40296. 802de94: 1830 adds r0, r6, r0
  40297. 802de96: 4288 cmp r0, r1
  40298. 802de98: f040 81ec bne.w 802e274 <tcp_receive+0x480>
  40299. /* Clause 4 */
  40300. if (pcb->rtime >= 0) {
  40301. 802de9c: f9b4 1034 ldrsh.w r1, [r4, #52] ; 0x34
  40302. 802dea0: 2900 cmp r1, #0
  40303. 802dea2: f2c0 81e7 blt.w 802e274 <tcp_receive+0x480>
  40304. /* Clause 5 */
  40305. if (pcb->lastack == ackno) {
  40306. 802dea6: 429a cmp r2, r3
  40307. 802dea8: f040 81e4 bne.w 802e274 <tcp_receive+0x480>
  40308. found_dupack = 1;
  40309. if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) {
  40310. 802deac: f894 2047 ldrb.w r2, [r4, #71] ; 0x47
  40311. 802deb0: 1c53 adds r3, r2, #1
  40312. 802deb2: b2db uxtb r3, r3
  40313. 802deb4: 4293 cmp r3, r2
  40314. ++pcb->dupacks;
  40315. 802deb6: bf88 it hi
  40316. 802deb8: f884 3047 strbhi.w r3, [r4, #71] ; 0x47
  40317. }
  40318. if (pcb->dupacks > 3) {
  40319. 802debc: f894 3047 ldrb.w r3, [r4, #71] ; 0x47
  40320. 802dec0: 2b03 cmp r3, #3
  40321. 802dec2: d90a bls.n 802deda <tcp_receive+0xe6>
  40322. /* Inflate the congestion window, but not if it means that
  40323. the value overflows. */
  40324. if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
  40325. 802dec4: f8b4 204c ldrh.w r2, [r4, #76] ; 0x4c
  40326. 802dec8: 8ee3 ldrh r3, [r4, #54] ; 0x36
  40327. 802deca: 18d3 adds r3, r2, r3
  40328. 802decc: b29b uxth r3, r3
  40329. 802dece: 4293 cmp r3, r2
  40330. 802ded0: f240 80b2 bls.w 802e038 <tcp_receive+0x244>
  40331. pcb->cwnd += pcb->mss;
  40332. 802ded4: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  40333. 802ded8: e0ae b.n 802e038 <tcp_receive+0x244>
  40334. }
  40335. } else if (pcb->dupacks == 3) {
  40336. 802deda: f040 80ad bne.w 802e038 <tcp_receive+0x244>
  40337. /* Do fast retransmit */
  40338. tcp_rexmit_fast(pcb);
  40339. 802dede: 4620 mov r0, r4
  40340. 802dee0: f001 fa92 bl 802f408 <tcp_rexmit_fast>
  40341. 802dee4: e0a8 b.n 802e038 <tcp_receive+0x244>
  40342. /* If Clause (1) or more is true, but not a duplicate ack, reset
  40343. * count of consecutive duplicate acks */
  40344. if (!found_dupack) {
  40345. pcb->dupacks = 0;
  40346. }
  40347. } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)){
  40348. 802dee6: 43d1 mvns r1, r2
  40349. 802dee8: 42d9 cmn r1, r3
  40350. 802deea: d47e bmi.n 802dfea <tcp_receive+0x1f6>
  40351. 802deec: 6d21 ldr r1, [r4, #80] ; 0x50
  40352. 802deee: 1a59 subs r1, r3, r1
  40353. 802def0: 2900 cmp r1, #0
  40354. 802def2: dc7a bgt.n 802dfea <tcp_receive+0x1f6>
  40355. /* We come here when the ACK acknowledges new data. */
  40356. /* Reset the "IN Fast Retransmit" flag, since we are no longer
  40357. in fast retransmit. Also reset the congestion window to the
  40358. slow start threshold. */
  40359. if (pcb->flags & TF_INFR) {
  40360. 802def4: 7fa1 ldrb r1, [r4, #30]
  40361. 802def6: f001 0004 and.w r0, r1, #4
  40362. 802defa: b2c0 uxtb r0, r0
  40363. 802defc: b130 cbz r0, 802df0c <tcp_receive+0x118>
  40364. pcb->flags &= ~TF_INFR;
  40365. 802defe: f021 0104 bic.w r1, r1, #4
  40366. 802df02: 77a1 strb r1, [r4, #30]
  40367. pcb->cwnd = pcb->ssthresh;
  40368. 802df04: f8b4 104e ldrh.w r1, [r4, #78] ; 0x4e
  40369. 802df08: f8a4 104c strh.w r1, [r4, #76] ; 0x4c
  40370. /* Reset the number of retransmissions. */
  40371. pcb->nrtx = 0;
  40372. /* Reset the retransmission time-out. */
  40373. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  40374. 802df0c: f9b4 5040 ldrsh.w r5, [r4, #64] ; 0x40
  40375. 802df10: f8b4 0042 ldrh.w r0, [r4, #66] ; 0x42
  40376. pcb->snd_buf += pcb->acked;
  40377. /* Reset the fast retransmit variables. */
  40378. pcb->dupacks = 0;
  40379. pcb->lastack = ackno;
  40380. 802df14: 64a3 str r3, [r4, #72] ; 0x48
  40381. /* Reset the number of retransmissions. */
  40382. pcb->nrtx = 0;
  40383. /* Reset the retransmission time-out. */
  40384. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  40385. 802df16: eb00 00e5 add.w r0, r0, r5, asr #3
  40386. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  40387. pcb->acked = (u16_t)(ackno - pcb->lastack);
  40388. 802df1a: 1a9a subs r2, r3, r2
  40389. /* Reset the number of retransmissions. */
  40390. pcb->nrtx = 0;
  40391. /* Reset the retransmission time-out. */
  40392. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  40393. 802df1c: f8a4 0044 strh.w r0, [r4, #68] ; 0x44
  40394. pcb->dupacks = 0;
  40395. pcb->lastack = ackno;
  40396. /* Update the congestion control variables (cwnd and
  40397. ssthresh). */
  40398. if (pcb->state >= ESTABLISHED) {
  40399. 802df20: 7e23 ldrb r3, [r4, #24]
  40400. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  40401. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  40402. pcb->acked = (u16_t)(ackno - pcb->lastack);
  40403. pcb->snd_buf += pcb->acked;
  40404. 802df22: f8b4 0066 ldrh.w r0, [r4, #102] ; 0x66
  40405. /* Reset the retransmission time-out. */
  40406. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  40407. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  40408. pcb->acked = (u16_t)(ackno - pcb->lastack);
  40409. 802df26: f8a4 2064 strh.w r2, [r4, #100] ; 0x64
  40410. pcb->flags &= ~TF_INFR;
  40411. pcb->cwnd = pcb->ssthresh;
  40412. }
  40413. /* Reset the number of retransmissions. */
  40414. pcb->nrtx = 0;
  40415. 802df2a: 2100 movs r1, #0
  40416. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  40417. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  40418. pcb->acked = (u16_t)(ackno - pcb->lastack);
  40419. pcb->snd_buf += pcb->acked;
  40420. 802df2c: 1812 adds r2, r2, r0
  40421. pcb->dupacks = 0;
  40422. pcb->lastack = ackno;
  40423. /* Update the congestion control variables (cwnd and
  40424. ssthresh). */
  40425. if (pcb->state >= ESTABLISHED) {
  40426. 802df2e: 2b03 cmp r3, #3
  40427. pcb->flags &= ~TF_INFR;
  40428. pcb->cwnd = pcb->ssthresh;
  40429. }
  40430. /* Reset the number of retransmissions. */
  40431. pcb->nrtx = 0;
  40432. 802df30: f884 1046 strb.w r1, [r4, #70] ; 0x46
  40433. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  40434. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  40435. pcb->acked = (u16_t)(ackno - pcb->lastack);
  40436. pcb->snd_buf += pcb->acked;
  40437. 802df34: f8a4 2066 strh.w r2, [r4, #102] ; 0x66
  40438. /* Reset the fast retransmit variables. */
  40439. pcb->dupacks = 0;
  40440. 802df38: f884 1047 strb.w r1, [r4, #71] ; 0x47
  40441. pcb->lastack = ackno;
  40442. /* Update the congestion control variables (cwnd and
  40443. ssthresh). */
  40444. if (pcb->state >= ESTABLISHED) {
  40445. 802df3c: d931 bls.n 802dfa2 <tcp_receive+0x1ae>
  40446. if (pcb->cwnd < pcb->ssthresh) {
  40447. 802df3e: f8b4 204e ldrh.w r2, [r4, #78] ; 0x4e
  40448. 802df42: f8b4 304c ldrh.w r3, [r4, #76] ; 0x4c
  40449. 802df46: 429a cmp r2, r3
  40450. if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
  40451. 802df48: 8ee2 ldrh r2, [r4, #54] ; 0x36
  40452. pcb->lastack = ackno;
  40453. /* Update the congestion control variables (cwnd and
  40454. ssthresh). */
  40455. if (pcb->state >= ESTABLISHED) {
  40456. if (pcb->cwnd < pcb->ssthresh) {
  40457. 802df4a: d900 bls.n 802df4e <tcp_receive+0x15a>
  40458. 802df4c: e002 b.n 802df54 <tcp_receive+0x160>
  40459. if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
  40460. pcb->cwnd += pcb->mss;
  40461. }
  40462. LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"U16_F"\n", pcb->cwnd));
  40463. } else {
  40464. u16_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);
  40465. 802df4e: 4352 muls r2, r2
  40466. 802df50: fb92 f2f3 sdiv r2, r2, r3
  40467. 802df54: 189a adds r2, r3, r2
  40468. 802df56: b292 uxth r2, r2
  40469. if (new_cwnd > pcb->cwnd) {
  40470. 802df58: 429a cmp r2, r3
  40471. 802df5a: d922 bls.n 802dfa2 <tcp_receive+0x1ae>
  40472. pcb->cwnd = new_cwnd;
  40473. 802df5c: f8a4 204c strh.w r2, [r4, #76] ; 0x4c
  40474. 802df60: e01f b.n 802dfa2 <tcp_receive+0x1ae>
  40475. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unacked\n",
  40476. ntohl(pcb->unacked->tcphdr->seqno),
  40477. ntohl(pcb->unacked->tcphdr->seqno) +
  40478. TCP_TCPLEN(pcb->unacked)));
  40479. next = pcb->unacked;
  40480. 802df62: 6f25 ldr r5, [r4, #112] ; 0x70
  40481. pcb->unacked = pcb->unacked->next;
  40482. 802df64: 682b ldr r3, [r5, #0]
  40483. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
  40484. LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
  40485. 802df66: 6868 ldr r0, [r5, #4]
  40486. ntohl(pcb->unacked->tcphdr->seqno),
  40487. ntohl(pcb->unacked->tcphdr->seqno) +
  40488. TCP_TCPLEN(pcb->unacked)));
  40489. next = pcb->unacked;
  40490. pcb->unacked = pcb->unacked->next;
  40491. 802df68: 6723 str r3, [r4, #112] ; 0x70
  40492. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
  40493. LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
  40494. 802df6a: f7ff f935 bl 802d1d8 <pbuf_clen>
  40495. /* Prevent ACK for FIN to generate a sent event */
  40496. if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) {
  40497. 802df6e: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  40498. 802df72: b153 cbz r3, 802df8a <tcp_receive+0x196>
  40499. 802df74: 68eb ldr r3, [r5, #12]
  40500. 802df76: 8998 ldrh r0, [r3, #12]
  40501. 802df78: f7fd ff21 bl 802bdbe <lwip_ntohs>
  40502. 802df7c: 07c3 lsls r3, r0, #31
  40503. 802df7e: d504 bpl.n 802df8a <tcp_receive+0x196>
  40504. pcb->acked--;
  40505. 802df80: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  40506. 802df84: 3b01 subs r3, #1
  40507. 802df86: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  40508. }
  40509. pcb->snd_queuelen -= pbuf_clen(next->p);
  40510. 802df8a: 6868 ldr r0, [r5, #4]
  40511. 802df8c: f8b4 7068 ldrh.w r7, [r4, #104] ; 0x68
  40512. 802df90: f7ff f922 bl 802d1d8 <pbuf_clen>
  40513. 802df94: 1a38 subs r0, r7, r0
  40514. 802df96: f8a4 0068 strh.w r0, [r4, #104] ; 0x68
  40515. tcp_seg_free(next);
  40516. 802df9a: 4628 mov r0, r5
  40517. 802df9c: f7ff faf5 bl 802d58a <tcp_seg_free>
  40518. 802dfa0: e000 b.n 802dfa4 <tcp_receive+0x1b0>
  40519. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  40520. /* Remove segment from the unacknowledged list if the incoming
  40521. ACK acknowlegdes them. */
  40522. while (pcb->unacked != NULL &&
  40523. TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) +
  40524. 802dfa2: 4e38 ldr r6, [pc, #224] ; (802e084 <tcp_receive+0x290>)
  40525. pcb->unacked != NULL?
  40526. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  40527. /* Remove segment from the unacknowledged list if the incoming
  40528. ACK acknowlegdes them. */
  40529. while (pcb->unacked != NULL &&
  40530. 802dfa4: 6f23 ldr r3, [r4, #112] ; 0x70
  40531. 802dfa6: b91b cbnz r3, 802dfb0 <tcp_receive+0x1bc>
  40532. }
  40533. }
  40534. /* If there's nothing left to acknowledge, stop the retransmit
  40535. timer, otherwise reset it to start again */
  40536. if(pcb->unacked == NULL)
  40537. 802dfa8: 6f22 ldr r2, [r4, #112] ; 0x70
  40538. 802dfaa: 2300 movs r3, #0
  40539. 802dfac: b9d2 cbnz r2, 802dfe4 <tcp_receive+0x1f0>
  40540. 802dfae: e015 b.n 802dfdc <tcp_receive+0x1e8>
  40541. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  40542. /* Remove segment from the unacknowledged list if the incoming
  40543. ACK acknowlegdes them. */
  40544. while (pcb->unacked != NULL &&
  40545. TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) +
  40546. 802dfb0: 68db ldr r3, [r3, #12]
  40547. 802dfb2: 6858 ldr r0, [r3, #4]
  40548. 802dfb4: f7fd ff0a bl 802bdcc <lwip_ntohl>
  40549. 802dfb8: 6f23 ldr r3, [r4, #112] ; 0x70
  40550. 802dfba: 891d ldrh r5, [r3, #8]
  40551. 802dfbc: 68db ldr r3, [r3, #12]
  40552. 802dfbe: 4607 mov r7, r0
  40553. 802dfc0: 8998 ldrh r0, [r3, #12]
  40554. 802dfc2: f7fd fefc bl 802bdbe <lwip_ntohs>
  40555. 802dfc6: 6833 ldr r3, [r6, #0]
  40556. 802dfc8: f010 0003 ands.w r0, r0, #3
  40557. 802dfcc: bf18 it ne
  40558. 802dfce: 2001 movne r0, #1
  40559. 802dfd0: 1afb subs r3, r7, r3
  40560. 802dfd2: 1828 adds r0, r5, r0
  40561. 802dfd4: 181b adds r3, r3, r0
  40562. pcb->unacked != NULL?
  40563. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  40564. /* Remove segment from the unacknowledged list if the incoming
  40565. ACK acknowlegdes them. */
  40566. while (pcb->unacked != NULL &&
  40567. 802dfd6: 2b00 cmp r3, #0
  40568. 802dfd8: ddc3 ble.n 802df62 <tcp_receive+0x16e>
  40569. 802dfda: e7e5 b.n 802dfa8 <tcp_receive+0x1b4>
  40570. }
  40571. /* If there's nothing left to acknowledge, stop the retransmit
  40572. timer, otherwise reset it to start again */
  40573. if(pcb->unacked == NULL)
  40574. pcb->rtime = -1;
  40575. 802dfdc: f64f 72ff movw r2, #65535 ; 0xffff
  40576. 802dfe0: 86a2 strh r2, [r4, #52] ; 0x34
  40577. 802dfe2: e000 b.n 802dfe6 <tcp_receive+0x1f2>
  40578. else
  40579. pcb->rtime = 0;
  40580. 802dfe4: 86a3 strh r3, [r4, #52] ; 0x34
  40581. pcb->polltmr = 0;
  40582. 802dfe6: 77e3 strb r3, [r4, #31]
  40583. 802dfe8: e026 b.n 802e038 <tcp_receive+0x244>
  40584. } else {
  40585. /* Fix bug bug #21582: out of sequence ACK, didn't really ack anything */
  40586. pcb->acked = 0;
  40587. 802dfea: 2300 movs r3, #0
  40588. 802dfec: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  40589. 802dff0: e022 b.n 802e038 <tcp_receive+0x244>
  40590. TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) {
  40591. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unsent\n",
  40592. ntohl(pcb->unsent->tcphdr->seqno), ntohl(pcb->unsent->tcphdr->seqno) +
  40593. TCP_TCPLEN(pcb->unsent)));
  40594. next = pcb->unsent;
  40595. 802dff2: 6ee5 ldr r5, [r4, #108] ; 0x6c
  40596. pcb->unsent = pcb->unsent->next;
  40597. 802dff4: 682b ldr r3, [r5, #0]
  40598. 802dff6: 66e3 str r3, [r4, #108] ; 0x6c
  40599. #if TCP_OVERSIZE
  40600. if (pcb->unsent == NULL) {
  40601. 802dff8: b90b cbnz r3, 802dffe <tcp_receive+0x20a>
  40602. pcb->unsent_oversize = 0;
  40603. 802dffa: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  40604. }
  40605. #endif /* TCP_OVERSIZE */
  40606. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
  40607. LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
  40608. 802dffe: 6868 ldr r0, [r5, #4]
  40609. 802e000: f7ff f8ea bl 802d1d8 <pbuf_clen>
  40610. /* Prevent ACK for FIN to generate a sent event */
  40611. if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) {
  40612. 802e004: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  40613. 802e008: b153 cbz r3, 802e020 <tcp_receive+0x22c>
  40614. 802e00a: 68eb ldr r3, [r5, #12]
  40615. 802e00c: 8998 ldrh r0, [r3, #12]
  40616. 802e00e: f7fd fed6 bl 802bdbe <lwip_ntohs>
  40617. 802e012: 07c7 lsls r7, r0, #31
  40618. 802e014: d504 bpl.n 802e020 <tcp_receive+0x22c>
  40619. pcb->acked--;
  40620. 802e016: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  40621. 802e01a: 3b01 subs r3, #1
  40622. 802e01c: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  40623. }
  40624. pcb->snd_queuelen -= pbuf_clen(next->p);
  40625. 802e020: 6868 ldr r0, [r5, #4]
  40626. 802e022: f8b4 7068 ldrh.w r7, [r4, #104] ; 0x68
  40627. 802e026: f7ff f8d7 bl 802d1d8 <pbuf_clen>
  40628. 802e02a: 1a38 subs r0, r7, r0
  40629. 802e02c: f8a4 0068 strh.w r0, [r4, #104] ; 0x68
  40630. tcp_seg_free(next);
  40631. 802e030: 4628 mov r0, r5
  40632. 802e032: f7ff faaa bl 802d58a <tcp_seg_free>
  40633. 802e036: e000 b.n 802e03a <tcp_receive+0x246>
  40634. strange since an "unsent" segment shouldn't be acked. The
  40635. rationale is that lwIP puts all outstanding segments on the
  40636. ->unsent list after a retransmission, so these segments may
  40637. in fact have been sent once. */
  40638. while (pcb->unsent != NULL &&
  40639. TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) +
  40640. 802e038: 4e12 ldr r6, [pc, #72] ; (802e084 <tcp_receive+0x290>)
  40641. on the list are acknowledged by the ACK. This may seem
  40642. strange since an "unsent" segment shouldn't be acked. The
  40643. rationale is that lwIP puts all outstanding segments on the
  40644. ->unsent list after a retransmission, so these segments may
  40645. in fact have been sent once. */
  40646. while (pcb->unsent != NULL &&
  40647. 802e03a: 6ee3 ldr r3, [r4, #108] ; 0x6c
  40648. 802e03c: b913 cbnz r3, 802e044 <tcp_receive+0x250>
  40649. pcb->rttest, pcb->rtseq, ackno));
  40650. /* RTT estimation calculations. This is done by checking if the
  40651. incoming segment acknowledges the segment we use to take a
  40652. round-trip time measurement. */
  40653. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  40654. 802e03e: 6ba3 ldr r3, [r4, #56] ; 0x38
  40655. 802e040: bb33 cbnz r3, 802e090 <tcp_receive+0x29c>
  40656. 802e042: e04d b.n 802e0e0 <tcp_receive+0x2ec>
  40657. strange since an "unsent" segment shouldn't be acked. The
  40658. rationale is that lwIP puts all outstanding segments on the
  40659. ->unsent list after a retransmission, so these segments may
  40660. in fact have been sent once. */
  40661. while (pcb->unsent != NULL &&
  40662. TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) +
  40663. 802e044: 68db ldr r3, [r3, #12]
  40664. 802e046: 6835 ldr r5, [r6, #0]
  40665. 802e048: 6858 ldr r0, [r3, #4]
  40666. 802e04a: f7fd febf bl 802bdcc <lwip_ntohl>
  40667. 802e04e: 6ee3 ldr r3, [r4, #108] ; 0x6c
  40668. 802e050: 891f ldrh r7, [r3, #8]
  40669. 802e052: 68db ldr r3, [r3, #12]
  40670. 802e054: 4680 mov r8, r0
  40671. 802e056: 8998 ldrh r0, [r3, #12]
  40672. 802e058: f7fd feb1 bl 802bdbe <lwip_ntohs>
  40673. 802e05c: f010 0003 ands.w r0, r0, #3
  40674. 802e060: bf18 it ne
  40675. 802e062: 2001 movne r0, #1
  40676. 802e064: ebc8 0505 rsb r5, r8, r5
  40677. 802e068: 1838 adds r0, r7, r0
  40678. 802e06a: 1a2d subs r5, r5, r0
  40679. on the list are acknowledged by the ACK. This may seem
  40680. strange since an "unsent" segment shouldn't be acked. The
  40681. rationale is that lwIP puts all outstanding segments on the
  40682. ->unsent list after a retransmission, so these segments may
  40683. in fact have been sent once. */
  40684. while (pcb->unsent != NULL &&
  40685. 802e06c: 2d00 cmp r5, #0
  40686. 802e06e: dbe6 blt.n 802e03e <tcp_receive+0x24a>
  40687. TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) +
  40688. 802e070: 6832 ldr r2, [r6, #0]
  40689. 802e072: 6d23 ldr r3, [r4, #80] ; 0x50
  40690. 802e074: 1ad3 subs r3, r2, r3
  40691. 802e076: 2b00 cmp r3, #0
  40692. 802e078: ddbb ble.n 802dff2 <tcp_receive+0x1fe>
  40693. 802e07a: e7e0 b.n 802e03e <tcp_receive+0x24a>
  40694. 802e07c: 2000e100 .word 0x2000e100
  40695. 802e080: 2000e0f4 .word 0x2000e0f4
  40696. 802e084: 2000e0fc .word 0x2000e0fc
  40697. 802e088: 2000e0f0 .word 0x2000e0f0
  40698. 802e08c: 2000e0f8 .word 0x2000e0f8
  40699. pcb->rttest, pcb->rtseq, ackno));
  40700. /* RTT estimation calculations. This is done by checking if the
  40701. incoming segment acknowledges the segment we use to take a
  40702. round-trip time measurement. */
  40703. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  40704. 802e090: 497b ldr r1, [pc, #492] ; (802e280 <tcp_receive+0x48c>)
  40705. 802e092: 6be2 ldr r2, [r4, #60] ; 0x3c
  40706. 802e094: 6809 ldr r1, [r1, #0]
  40707. 802e096: 1a52 subs r2, r2, r1
  40708. 802e098: 2a00 cmp r2, #0
  40709. 802e09a: da21 bge.n 802e0e0 <tcp_receive+0x2ec>
  40710. /* diff between this shouldn't exceed 32K since this are tcp timer ticks
  40711. and a round-trip shouldn't be that long... */
  40712. m = (s16_t)(tcp_ticks - pcb->rttest);
  40713. 802e09c: 4a79 ldr r2, [pc, #484] ; (802e284 <tcp_receive+0x490>)
  40714. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  40715. m, m * TCP_SLOW_INTERVAL));
  40716. /* This is taken directly from VJs original code in his paper */
  40717. m = m - (pcb->sa >> 3);
  40718. 802e09e: f8b4 1040 ldrh.w r1, [r4, #64] ; 0x40
  40719. incoming segment acknowledges the segment we use to take a
  40720. round-trip time measurement. */
  40721. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  40722. /* diff between this shouldn't exceed 32K since this are tcp timer ticks
  40723. and a round-trip shouldn't be that long... */
  40724. m = (s16_t)(tcp_ticks - pcb->rttest);
  40725. 802e0a2: 6812 ldr r2, [r2, #0]
  40726. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  40727. m, m * TCP_SLOW_INTERVAL));
  40728. /* This is taken directly from VJs original code in his paper */
  40729. m = m - (pcb->sa >> 3);
  40730. 802e0a4: f341 00cc sbfx r0, r1, #3, #13
  40731. incoming segment acknowledges the segment we use to take a
  40732. round-trip time measurement. */
  40733. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  40734. /* diff between this shouldn't exceed 32K since this are tcp timer ticks
  40735. and a round-trip shouldn't be that long... */
  40736. m = (s16_t)(tcp_ticks - pcb->rttest);
  40737. 802e0a8: 1ad2 subs r2, r2, r3
  40738. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  40739. m, m * TCP_SLOW_INTERVAL));
  40740. /* This is taken directly from VJs original code in his paper */
  40741. m = m - (pcb->sa >> 3);
  40742. 802e0aa: 1a12 subs r2, r2, r0
  40743. 802e0ac: b292 uxth r2, r2
  40744. 802e0ae: b293 uxth r3, r2
  40745. pcb->sa += m;
  40746. 802e0b0: 1851 adds r1, r2, r1
  40747. 802e0b2: b289 uxth r1, r1
  40748. if (m < 0) {
  40749. 802e0b4: 0418 lsls r0, r3, #16
  40750. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  40751. m, m * TCP_SLOW_INTERVAL));
  40752. /* This is taken directly from VJs original code in his paper */
  40753. m = m - (pcb->sa >> 3);
  40754. pcb->sa += m;
  40755. 802e0b6: f8a4 1040 strh.w r1, [r4, #64] ; 0x40
  40756. if (m < 0) {
  40757. 802e0ba: d501 bpl.n 802e0c0 <tcp_receive+0x2cc>
  40758. m = -m;
  40759. 802e0bc: 4253 negs r3, r2
  40760. 802e0be: b29b uxth r3, r3
  40761. }
  40762. m = m - (pcb->sv >> 2);
  40763. 802e0c0: f8b4 2042 ldrh.w r2, [r4, #66] ; 0x42
  40764. 802e0c4: f342 008d sbfx r0, r2, #2, #14
  40765. 802e0c8: 1a12 subs r2, r2, r0
  40766. pcb->sv += m;
  40767. 802e0ca: 18d3 adds r3, r2, r3
  40768. 802e0cc: b29b uxth r3, r3
  40769. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  40770. 802e0ce: f341 01cc sbfx r1, r1, #3, #13
  40771. pcb->sa += m;
  40772. if (m < 0) {
  40773. m = -m;
  40774. }
  40775. m = m - (pcb->sv >> 2);
  40776. pcb->sv += m;
  40777. 802e0d2: f8a4 3042 strh.w r3, [r4, #66] ; 0x42
  40778. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  40779. 802e0d6: 185b adds r3, r3, r1
  40780. 802e0d8: f8a4 3044 strh.w r3, [r4, #68] ; 0x44
  40781. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n",
  40782. pcb->rto, pcb->rto * TCP_SLOW_INTERVAL));
  40783. pcb->rttest = 0;
  40784. 802e0dc: 2300 movs r3, #0
  40785. 802e0de: 63a3 str r3, [r4, #56] ; 0x38
  40786. /* If the incoming segment contains data, we must process it
  40787. further unless the pcb already received a FIN.
  40788. (RFC 793, chapeter 3.9, "SEGMENT ARRIVES" in states CLOSE-WAIT, CLOSING,
  40789. LAST-ACK and TIME-WAIT: "Ignore the segment text.") */
  40790. if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) {
  40791. 802e0e0: 4b69 ldr r3, [pc, #420] ; (802e288 <tcp_receive+0x494>)
  40792. 802e0e2: 4a6a ldr r2, [pc, #424] ; (802e28c <tcp_receive+0x498>)
  40793. 802e0e4: 8818 ldrh r0, [r3, #0]
  40794. 802e0e6: 2800 cmp r0, #0
  40795. 802e0e8: f000 80b3 beq.w 802e252 <tcp_receive+0x45e>
  40796. 802e0ec: 7e23 ldrb r3, [r4, #24]
  40797. 802e0ee: 2b06 cmp r3, #6
  40798. 802e0f0: f200 80af bhi.w 802e252 <tcp_receive+0x45e>
  40799. this if the sequence number of the incoming segment is less
  40800. than rcv_nxt, and the sequence number plus the length of the
  40801. segment is larger than rcv_nxt. */
  40802. /* if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){
  40803. if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/
  40804. if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)){
  40805. 802e0f4: 6811 ldr r1, [r2, #0]
  40806. 802e0f6: 6aa3 ldr r3, [r4, #40] ; 0x28
  40807. 802e0f8: 43ca mvns r2, r1
  40808. 802e0fa: 42da cmn r2, r3
  40809. 802e0fc: d425 bmi.n 802e14a <tcp_receive+0x356>
  40810. 802e0fe: 1c5a adds r2, r3, #1
  40811. 802e100: 1a52 subs r2, r2, r1
  40812. 802e102: 1a10 subs r0, r2, r0
  40813. 802e104: 2800 cmp r0, #0
  40814. 802e106: dc20 bgt.n 802e14a <tcp_receive+0x356>
  40815. After we are done with adjusting the pbuf pointers we must
  40816. adjust the ->data pointer in the seg and the segment
  40817. length.*/
  40818. off = pcb->rcv_nxt - seqno;
  40819. 802e108: 1a59 subs r1, r3, r1
  40820. p = inseg.p;
  40821. 802e10a: 4b61 ldr r3, [pc, #388] ; (802e290 <tcp_receive+0x49c>)
  40822. 802e10c: 6858 ldr r0, [r3, #4]
  40823. LWIP_ASSERT("inseg.p != NULL", inseg.p);
  40824. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  40825. if (inseg.p->len < off) {
  40826. 802e10e: 8943 ldrh r3, [r0, #10]
  40827. 802e110: 428b cmp r3, r1
  40828. 802e112: da0a bge.n 802e12a <tcp_receive+0x336>
  40829. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  40830. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  40831. 802e114: 8902 ldrh r2, [r0, #8]
  40832. off -= p->len;
  40833. /* KJM following line changed (with addition of new_tot_len var)
  40834. to fix bug #9076
  40835. inseg.p->tot_len -= p->len; */
  40836. p->tot_len = new_tot_len;
  40837. p->len = 0;
  40838. 802e116: 2500 movs r5, #0
  40839. p = inseg.p;
  40840. LWIP_ASSERT("inseg.p != NULL", inseg.p);
  40841. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  40842. if (inseg.p->len < off) {
  40843. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  40844. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  40845. 802e118: 1a52 subs r2, r2, r1
  40846. while (p->len < off) {
  40847. 802e11a: e003 b.n 802e124 <tcp_receive+0x330>
  40848. off -= p->len;
  40849. /* KJM following line changed (with addition of new_tot_len var)
  40850. to fix bug #9076
  40851. inseg.p->tot_len -= p->len; */
  40852. p->tot_len = new_tot_len;
  40853. 802e11c: 8102 strh r2, [r0, #8]
  40854. p->len = 0;
  40855. 802e11e: 8145 strh r5, [r0, #10]
  40856. p = p->next;
  40857. 802e120: 6800 ldr r0, [r0, #0]
  40858. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  40859. if (inseg.p->len < off) {
  40860. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  40861. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  40862. while (p->len < off) {
  40863. off -= p->len;
  40864. 802e122: 1ac9 subs r1, r1, r3
  40865. LWIP_ASSERT("inseg.p != NULL", inseg.p);
  40866. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  40867. if (inseg.p->len < off) {
  40868. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  40869. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  40870. while (p->len < off) {
  40871. 802e124: 8943 ldrh r3, [r0, #10]
  40872. 802e126: 428b cmp r3, r1
  40873. 802e128: dbf8 blt.n 802e11c <tcp_receive+0x328>
  40874. if(pbuf_header(p, (s16_t)-off)) {
  40875. /* Do we need to cope with this failing? Assert for now */
  40876. LWIP_ASSERT("pbuf_header failed", 0);
  40877. }
  40878. } else {
  40879. if(pbuf_header(inseg.p, (s16_t)-off)) {
  40880. 802e12a: 4249 negs r1, r1
  40881. 802e12c: b209 sxth r1, r1
  40882. 802e12e: f7fe ff54 bl 802cfda <pbuf_header>
  40883. /* Do we need to cope with this failing? Assert for now */
  40884. LWIP_ASSERT("pbuf_header failed", 0);
  40885. }
  40886. }
  40887. inseg.len -= (u16_t)(pcb->rcv_nxt - seqno);
  40888. 802e132: 4a57 ldr r2, [pc, #348] ; (802e290 <tcp_receive+0x49c>)
  40889. 802e134: 4955 ldr r1, [pc, #340] ; (802e28c <tcp_receive+0x498>)
  40890. 802e136: 8915 ldrh r5, [r2, #8]
  40891. 802e138: 6808 ldr r0, [r1, #0]
  40892. 802e13a: 6aa3 ldr r3, [r4, #40] ; 0x28
  40893. 802e13c: 1940 adds r0, r0, r5
  40894. 802e13e: 1ac0 subs r0, r0, r3
  40895. 802e140: 8110 strh r0, [r2, #8]
  40896. inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;
  40897. 802e142: 68d2 ldr r2, [r2, #12]
  40898. 802e144: 600b str r3, [r1, #0]
  40899. 802e146: 6053 str r3, [r2, #4]
  40900. 802e148: e006 b.n 802e158 <tcp_receive+0x364>
  40901. }
  40902. else {
  40903. if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){
  40904. 802e14a: 1ac9 subs r1, r1, r3
  40905. 802e14c: 2900 cmp r1, #0
  40906. 802e14e: da03 bge.n 802e158 <tcp_receive+0x364>
  40907. /* the whole segment is < rcv_nxt */
  40908. /* must be a duplicate of a packet that has already been correctly handled */
  40909. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno));
  40910. tcp_ack_now(pcb);
  40911. 802e150: 7fa3 ldrb r3, [r4, #30]
  40912. 802e152: f043 0302 orr.w r3, r3, #2
  40913. 802e156: 77a3 strb r3, [r4, #30]
  40914. }
  40915. /* The sequence number must be within the window (above rcv_nxt
  40916. and below rcv_nxt + rcv_wnd) in order to be further
  40917. processed. */
  40918. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
  40919. 802e158: 4b4c ldr r3, [pc, #304] ; (802e28c <tcp_receive+0x498>)
  40920. 802e15a: 6aa2 ldr r2, [r4, #40] ; 0x28
  40921. 802e15c: 681b ldr r3, [r3, #0]
  40922. 802e15e: 1a99 subs r1, r3, r2
  40923. 802e160: 2900 cmp r1, #0
  40924. 802e162: db71 blt.n 802e248 <tcp_receive+0x454>
  40925. 802e164: 1c59 adds r1, r3, #1
  40926. 802e166: 8da0 ldrh r0, [r4, #44] ; 0x2c
  40927. 802e168: 1a89 subs r1, r1, r2
  40928. 802e16a: 1a09 subs r1, r1, r0
  40929. 802e16c: 2900 cmp r1, #0
  40930. 802e16e: dc6b bgt.n 802e248 <tcp_receive+0x454>
  40931. pcb->rcv_nxt + pcb->rcv_wnd - 1)){
  40932. if (pcb->rcv_nxt == seqno) {
  40933. 802e170: 429a cmp r2, r3
  40934. 802e172: d169 bne.n 802e248 <tcp_receive+0x454>
  40935. /* The incoming segment is the next in sequence. We check if
  40936. we have to trim the end of the segment and update rcv_nxt
  40937. and pass the data to the application. */
  40938. tcplen = TCP_TCPLEN(&inseg);
  40939. 802e174: 4d46 ldr r5, [pc, #280] ; (802e290 <tcp_receive+0x49c>)
  40940. 802e176: 68eb ldr r3, [r5, #12]
  40941. 802e178: 892e ldrh r6, [r5, #8]
  40942. 802e17a: 8998 ldrh r0, [r3, #12]
  40943. 802e17c: f7fd fe1f bl 802bdbe <lwip_ntohs>
  40944. 802e180: f010 0003 ands.w r0, r0, #3
  40945. 802e184: bf18 it ne
  40946. 802e186: 2001 movne r0, #1
  40947. 802e188: 4b3f ldr r3, [pc, #252] ; (802e288 <tcp_receive+0x494>)
  40948. 802e18a: 1830 adds r0, r6, r0
  40949. 802e18c: b280 uxth r0, r0
  40950. 802e18e: 8018 strh r0, [r3, #0]
  40951. if (tcplen > pcb->rcv_wnd) {
  40952. 802e190: 8da3 ldrh r3, [r4, #44] ; 0x2c
  40953. 802e192: 4283 cmp r3, r0
  40954. 802e194: d230 bcs.n 802e1f8 <tcp_receive+0x404>
  40955. LWIP_DEBUGF(TCP_INPUT_DEBUG,
  40956. ("tcp_receive: other end overran receive window"
  40957. "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n",
  40958. seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
  40959. if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
  40960. 802e196: 68eb ldr r3, [r5, #12]
  40961. 802e198: 8998 ldrh r0, [r3, #12]
  40962. 802e19a: f7fd fe10 bl 802bdbe <lwip_ntohs>
  40963. 802e19e: 07c0 lsls r0, r0, #31
  40964. 802e1a0: d50c bpl.n 802e1bc <tcp_receive+0x3c8>
  40965. /* Must remove the FIN from the header as we're trimming
  40966. * that byte of sequence-space from the packet */
  40967. TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) &~ TCP_FIN);
  40968. 802e1a2: 68ed ldr r5, [r5, #12]
  40969. 802e1a4: 89ae ldrh r6, [r5, #12]
  40970. 802e1a6: 4630 mov r0, r6
  40971. 802e1a8: f7fd fe09 bl 802bdbe <lwip_ntohs>
  40972. 802e1ac: f000 003e and.w r0, r0, #62 ; 0x3e
  40973. 802e1b0: f7fd fe00 bl 802bdb4 <lwip_htons>
  40974. 802e1b4: f426 567c bic.w r6, r6, #16128 ; 0x3f00
  40975. 802e1b8: 4330 orrs r0, r6
  40976. 802e1ba: 81a8 strh r0, [r5, #12]
  40977. }
  40978. /* Adjust length of segment to fit in the window. */
  40979. inseg.len = pcb->rcv_wnd;
  40980. 802e1bc: 8da3 ldrh r3, [r4, #44] ; 0x2c
  40981. 802e1be: 4d34 ldr r5, [pc, #208] ; (802e290 <tcp_receive+0x49c>)
  40982. 802e1c0: 812b strh r3, [r5, #8]
  40983. if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
  40984. 802e1c2: 68eb ldr r3, [r5, #12]
  40985. 802e1c4: 8998 ldrh r0, [r3, #12]
  40986. 802e1c6: f7fd fdfa bl 802bdbe <lwip_ntohs>
  40987. 802e1ca: f000 0002 and.w r0, r0, #2
  40988. 802e1ce: b280 uxth r0, r0
  40989. 802e1d0: b110 cbz r0, 802e1d8 <tcp_receive+0x3e4>
  40990. inseg.len -= 1;
  40991. 802e1d2: 892b ldrh r3, [r5, #8]
  40992. 802e1d4: 3b01 subs r3, #1
  40993. 802e1d6: 812b strh r3, [r5, #8]
  40994. }
  40995. pbuf_realloc(inseg.p, inseg.len);
  40996. 802e1d8: 6868 ldr r0, [r5, #4]
  40997. 802e1da: 8929 ldrh r1, [r5, #8]
  40998. 802e1dc: f7fe ff4f bl 802d07e <pbuf_realloc>
  40999. tcplen = TCP_TCPLEN(&inseg);
  41000. 802e1e0: 68eb ldr r3, [r5, #12]
  41001. 802e1e2: 892e ldrh r6, [r5, #8]
  41002. 802e1e4: 8998 ldrh r0, [r3, #12]
  41003. 802e1e6: f7fd fdea bl 802bdbe <lwip_ntohs>
  41004. 802e1ea: f010 0003 ands.w r0, r0, #3
  41005. 802e1ee: bf18 it ne
  41006. 802e1f0: 2001 movne r0, #1
  41007. 802e1f2: 4b25 ldr r3, [pc, #148] ; (802e288 <tcp_receive+0x494>)
  41008. 802e1f4: 1830 adds r0, r6, r0
  41009. 802e1f6: 8018 strh r0, [r3, #0]
  41010. pcb->ooseq = next;
  41011. }
  41012. }
  41013. #endif /* TCP_QUEUE_OOSEQ */
  41014. pcb->rcv_nxt = seqno + tcplen;
  41015. 802e1f8: 4b23 ldr r3, [pc, #140] ; (802e288 <tcp_receive+0x494>)
  41016. 802e1fa: 4a24 ldr r2, [pc, #144] ; (802e28c <tcp_receive+0x498>)
  41017. 802e1fc: 881b ldrh r3, [r3, #0]
  41018. 802e1fe: 6812 ldr r2, [r2, #0]
  41019. 802e200: 189a adds r2, r3, r2
  41020. 802e202: 62a2 str r2, [r4, #40] ; 0x28
  41021. /* Update the receiver's (our) window. */
  41022. LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen);
  41023. pcb->rcv_wnd -= tcplen;
  41024. 802e204: 8da2 ldrh r2, [r4, #44] ; 0x2c
  41025. 802e206: 1ad3 subs r3, r2, r3
  41026. 802e208: 85a3 strh r3, [r4, #44] ; 0x2c
  41027. tcp_update_rcv_ann_wnd(pcb);
  41028. 802e20a: 4620 mov r0, r4
  41029. 802e20c: f7ff f986 bl 802d51c <tcp_update_rcv_ann_wnd>
  41030. chains its data on this pbuf as well.
  41031. If the segment was a FIN, we set the TF_GOT_FIN flag that will
  41032. be used to indicate to the application that the remote side has
  41033. closed its end of the connection. */
  41034. if (inseg.p->tot_len > 0) {
  41035. 802e210: 4b1f ldr r3, [pc, #124] ; (802e290 <tcp_receive+0x49c>)
  41036. 802e212: 685a ldr r2, [r3, #4]
  41037. 802e214: 8911 ldrh r1, [r2, #8]
  41038. 802e216: b119 cbz r1, 802e220 <tcp_receive+0x42c>
  41039. recv_data = inseg.p;
  41040. 802e218: 491e ldr r1, [pc, #120] ; (802e294 <tcp_receive+0x4a0>)
  41041. 802e21a: 600a str r2, [r1, #0]
  41042. /* Since this pbuf now is the responsibility of the
  41043. application, we delete our reference to it so that we won't
  41044. (mistakingly) deallocate it. */
  41045. inseg.p = NULL;
  41046. 802e21c: 2200 movs r2, #0
  41047. 802e21e: 605a str r2, [r3, #4]
  41048. }
  41049. if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
  41050. 802e220: 68db ldr r3, [r3, #12]
  41051. 802e222: 8998 ldrh r0, [r3, #12]
  41052. 802e224: f7fd fdcb bl 802bdbe <lwip_ntohs>
  41053. 802e228: 07c1 lsls r1, r0, #31
  41054. 802e22a: d504 bpl.n 802e236 <tcp_receive+0x442>
  41055. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n"));
  41056. recv_flags |= TF_GOT_FIN;
  41057. 802e22c: 4b1a ldr r3, [pc, #104] ; (802e298 <tcp_receive+0x4a4>)
  41058. 802e22e: 781a ldrb r2, [r3, #0]
  41059. 802e230: f042 0220 orr.w r2, r2, #32
  41060. 802e234: 701a strb r2, [r3, #0]
  41061. }
  41062. #endif /* TCP_QUEUE_OOSEQ */
  41063. /* Acknowledge the segment(s). */
  41064. tcp_ack(pcb);
  41065. 802e236: 7fa3 ldrb r3, [r4, #30]
  41066. 802e238: 07da lsls r2, r3, #31
  41067. 802e23a: d502 bpl.n 802e242 <tcp_receive+0x44e>
  41068. 802e23c: f023 0301 bic.w r3, r3, #1
  41069. 802e240: e013 b.n 802e26a <tcp_receive+0x476>
  41070. 802e242: f043 0301 orr.w r3, r3, #1
  41071. 802e246: e012 b.n 802e26e <tcp_receive+0x47a>
  41072. } else {
  41073. /* We get here if the incoming segment is out-of-sequence. */
  41074. tcp_send_empty_ack(pcb);
  41075. 802e248: 4620 mov r0, r4
  41076. TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/
  41077. if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){
  41078. tcp_ack_now(pcb);
  41079. }
  41080. }
  41081. }
  41082. 802e24a: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  41083. /* Acknowledge the segment(s). */
  41084. tcp_ack(pcb);
  41085. } else {
  41086. /* We get here if the incoming segment is out-of-sequence. */
  41087. tcp_send_empty_ack(pcb);
  41088. 802e24e: f000 bf09 b.w 802f064 <tcp_send_empty_ack>
  41089. } else {
  41090. /* Segments with length 0 is taken care of here. Segments that
  41091. fall out of the window are ACKed. */
  41092. /*if (TCP_SEQ_GT(pcb->rcv_nxt, seqno) ||
  41093. TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/
  41094. if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){
  41095. 802e252: 6812 ldr r2, [r2, #0]
  41096. 802e254: 6aa3 ldr r3, [r4, #40] ; 0x28
  41097. 802e256: 1ad1 subs r1, r2, r3
  41098. 802e258: 2900 cmp r1, #0
  41099. 802e25a: db05 blt.n 802e268 <tcp_receive+0x474>
  41100. 802e25c: 3201 adds r2, #1
  41101. 802e25e: 8da1 ldrh r1, [r4, #44] ; 0x2c
  41102. 802e260: 1ad3 subs r3, r2, r3
  41103. 802e262: 1a5b subs r3, r3, r1
  41104. 802e264: 2b00 cmp r3, #0
  41105. 802e266: dd09 ble.n 802e27c <tcp_receive+0x488>
  41106. tcp_ack_now(pcb);
  41107. 802e268: 7fa3 ldrb r3, [r4, #30]
  41108. 802e26a: f043 0302 orr.w r3, r3, #2
  41109. 802e26e: 77a3 strb r3, [r4, #30]
  41110. 802e270: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  41111. }
  41112. }
  41113. /* If Clause (1) or more is true, but not a duplicate ack, reset
  41114. * count of consecutive duplicate acks */
  41115. if (!found_dupack) {
  41116. pcb->dupacks = 0;
  41117. 802e274: 2300 movs r3, #0
  41118. 802e276: f884 3047 strb.w r3, [r4, #71] ; 0x47
  41119. 802e27a: e6dd b.n 802e038 <tcp_receive+0x244>
  41120. 802e27c: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  41121. 802e280: 2000e0fc .word 0x2000e0fc
  41122. 802e284: 20010fe0 .word 0x20010fe0
  41123. 802e288: 2000e0f8 .word 0x2000e0f8
  41124. 802e28c: 2000e0f4 .word 0x2000e0f4
  41125. 802e290: 2000e10c .word 0x2000e10c
  41126. 802e294: 2000e104 .word 0x2000e104
  41127. 802e298: 2000e101 .word 0x2000e101
  41128. 0802e29c <tcp_input>:
  41129. * @param p received TCP segment to process (p->payload pointing to the IP header)
  41130. * @param inp network interface on which this segment was received
  41131. */
  41132. void
  41133. tcp_input(struct pbuf *p, struct netif *inp)
  41134. {
  41135. 802e29c: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  41136. 802e2a0: 4606 mov r6, r0
  41137. 802e2a2: 460f mov r7, r1
  41138. err_t err;
  41139. PERF_START;
  41140. TCP_STATS_INC(tcp.recv);
  41141. snmp_inc_tcpinsegs();
  41142. 802e2a4: f003 fc9c bl 8031be0 <snmp_inc_tcpinsegs>
  41143. iphdr = (struct ip_hdr *)p->payload;
  41144. 802e2a8: 6873 ldr r3, [r6, #4]
  41145. 802e2aa: 4aa7 ldr r2, [pc, #668] ; (802e548 <tcp_input+0x2ac>)
  41146. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  41147. 802e2ac: 4ca7 ldr r4, [pc, #668] ; (802e54c <tcp_input+0x2b0>)
  41148. PERF_START;
  41149. TCP_STATS_INC(tcp.recv);
  41150. snmp_inc_tcpinsegs();
  41151. iphdr = (struct ip_hdr *)p->payload;
  41152. 802e2ae: 6013 str r3, [r2, #0]
  41153. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  41154. 802e2b0: 781a ldrb r2, [r3, #0]
  41155. 802e2b2: f002 020f and.w r2, r2, #15
  41156. #if TCP_INPUT_DEBUG
  41157. tcp_debug_print(tcphdr);
  41158. #endif
  41159. /* remove header from payload */
  41160. if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) {
  41161. 802e2b6: 0091 lsls r1, r2, #2
  41162. TCP_STATS_INC(tcp.recv);
  41163. snmp_inc_tcpinsegs();
  41164. iphdr = (struct ip_hdr *)p->payload;
  41165. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  41166. 802e2b8: eb03 0382 add.w r3, r3, r2, lsl #2
  41167. #if TCP_INPUT_DEBUG
  41168. tcp_debug_print(tcphdr);
  41169. #endif
  41170. /* remove header from payload */
  41171. if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) {
  41172. 802e2bc: 4630 mov r0, r6
  41173. 802e2be: 4249 negs r1, r1
  41174. TCP_STATS_INC(tcp.recv);
  41175. snmp_inc_tcpinsegs();
  41176. iphdr = (struct ip_hdr *)p->payload;
  41177. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  41178. 802e2c0: 6023 str r3, [r4, #0]
  41179. #if TCP_INPUT_DEBUG
  41180. tcp_debug_print(tcphdr);
  41181. #endif
  41182. /* remove header from payload */
  41183. if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) {
  41184. 802e2c2: f7fe fe8a bl 802cfda <pbuf_header>
  41185. 802e2c6: 2800 cmp r0, #0
  41186. 802e2c8: f040 83ce bne.w 802ea68 <tcp_input+0x7cc>
  41187. 802e2cc: 8933 ldrh r3, [r6, #8]
  41188. 802e2ce: 2b13 cmp r3, #19
  41189. 802e2d0: f240 83ca bls.w 802ea68 <tcp_input+0x7cc>
  41190. TCP_STATS_INC(tcp.lenerr);
  41191. goto dropped;
  41192. }
  41193. /* Don't even process incoming broadcasts/multicasts. */
  41194. if (ip_addr_isbroadcast(&current_iphdr_dest, inp) ||
  41195. 802e2d4: 4d9e ldr r5, [pc, #632] ; (802e550 <tcp_input+0x2b4>)
  41196. 802e2d6: 4639 mov r1, r7
  41197. 802e2d8: 6828 ldr r0, [r5, #0]
  41198. 802e2da: f001 fd43 bl 802fd64 <ip4_addr_isbroadcast>
  41199. 802e2de: 2800 cmp r0, #0
  41200. 802e2e0: f040 83c2 bne.w 802ea68 <tcp_input+0x7cc>
  41201. ip_addr_ismulticast(&current_iphdr_dest)) {
  41202. 802e2e4: 682b ldr r3, [r5, #0]
  41203. 802e2e6: f003 03f0 and.w r3, r3, #240 ; 0xf0
  41204. TCP_STATS_INC(tcp.lenerr);
  41205. goto dropped;
  41206. }
  41207. /* Don't even process incoming broadcasts/multicasts. */
  41208. if (ip_addr_isbroadcast(&current_iphdr_dest, inp) ||
  41209. 802e2ea: 2be0 cmp r3, #224 ; 0xe0
  41210. 802e2ec: f000 83bc beq.w 802ea68 <tcp_input+0x7cc>
  41211. }
  41212. #endif
  41213. /* Move the payload pointer in the pbuf so that it points to the
  41214. TCP data instead of the TCP header. */
  41215. hdrlen = TCPH_HDRLEN(tcphdr);
  41216. 802e2f0: 6823 ldr r3, [r4, #0]
  41217. 802e2f2: 8998 ldrh r0, [r3, #12]
  41218. 802e2f4: f7fd fd63 bl 802bdbe <lwip_ntohs>
  41219. if(pbuf_header(p, -(hdrlen * 4))){
  41220. 802e2f8: f06f 0103 mvn.w r1, #3
  41221. 802e2fc: f3c0 3307 ubfx r3, r0, #12, #8
  41222. 802e300: 4359 muls r1, r3
  41223. 802e302: 4630 mov r0, r6
  41224. 802e304: f7fe fe69 bl 802cfda <pbuf_header>
  41225. 802e308: 4683 mov fp, r0
  41226. 802e30a: 2800 cmp r0, #0
  41227. 802e30c: f040 83ac bne.w 802ea68 <tcp_input+0x7cc>
  41228. TCP_STATS_INC(tcp.lenerr);
  41229. goto dropped;
  41230. }
  41231. /* Convert fields in TCP header to host byte order. */
  41232. tcphdr->src = ntohs(tcphdr->src);
  41233. 802e310: 6827 ldr r7, [r4, #0]
  41234. 802e312: 8838 ldrh r0, [r7, #0]
  41235. 802e314: f7fd fd53 bl 802bdbe <lwip_ntohs>
  41236. 802e318: 8038 strh r0, [r7, #0]
  41237. tcphdr->dest = ntohs(tcphdr->dest);
  41238. 802e31a: 6827 ldr r7, [r4, #0]
  41239. 802e31c: 8878 ldrh r0, [r7, #2]
  41240. 802e31e: f7fd fd4e bl 802bdbe <lwip_ntohs>
  41241. 802e322: 8078 strh r0, [r7, #2]
  41242. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  41243. 802e324: 6827 ldr r7, [r4, #0]
  41244. 802e326: 6878 ldr r0, [r7, #4]
  41245. 802e328: f7fd fd50 bl 802bdcc <lwip_ntohl>
  41246. 802e32c: 4b89 ldr r3, [pc, #548] ; (802e554 <tcp_input+0x2b8>)
  41247. 802e32e: 6078 str r0, [r7, #4]
  41248. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  41249. 802e330: 6827 ldr r7, [r4, #0]
  41250. }
  41251. /* Convert fields in TCP header to host byte order. */
  41252. tcphdr->src = ntohs(tcphdr->src);
  41253. tcphdr->dest = ntohs(tcphdr->dest);
  41254. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  41255. 802e332: 6018 str r0, [r3, #0]
  41256. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  41257. 802e334: 68b8 ldr r0, [r7, #8]
  41258. 802e336: f7fd fd49 bl 802bdcc <lwip_ntohl>
  41259. 802e33a: 4b87 ldr r3, [pc, #540] ; (802e558 <tcp_input+0x2bc>)
  41260. 802e33c: 60b8 str r0, [r7, #8]
  41261. tcphdr->wnd = ntohs(tcphdr->wnd);
  41262. 802e33e: 6827 ldr r7, [r4, #0]
  41263. /* Convert fields in TCP header to host byte order. */
  41264. tcphdr->src = ntohs(tcphdr->src);
  41265. tcphdr->dest = ntohs(tcphdr->dest);
  41266. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  41267. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  41268. 802e340: 6018 str r0, [r3, #0]
  41269. tcphdr->wnd = ntohs(tcphdr->wnd);
  41270. 802e342: 89f8 ldrh r0, [r7, #14]
  41271. 802e344: f7fd fd3b bl 802bdbe <lwip_ntohs>
  41272. 802e348: 81f8 strh r0, [r7, #14]
  41273. flags = TCPH_FLAGS(tcphdr);
  41274. 802e34a: 6823 ldr r3, [r4, #0]
  41275. 802e34c: 8998 ldrh r0, [r3, #12]
  41276. 802e34e: f7fd fd36 bl 802bdbe <lwip_ntohs>
  41277. 802e352: 4b82 ldr r3, [pc, #520] ; (802e55c <tcp_input+0x2c0>)
  41278. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  41279. 802e354: f8b6 8008 ldrh.w r8, [r6, #8]
  41280. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  41281. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  41282. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  41283. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  41284. if (pcb->remote_port == tcphdr->src &&
  41285. 802e358: 6827 ldr r7, [r4, #0]
  41286. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  41287. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  41288. tcphdr->wnd = ntohs(tcphdr->wnd);
  41289. flags = TCPH_FLAGS(tcphdr);
  41290. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  41291. 802e35a: f010 0c03 ands.w ip, r0, #3
  41292. tcphdr->dest = ntohs(tcphdr->dest);
  41293. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  41294. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  41295. tcphdr->wnd = ntohs(tcphdr->wnd);
  41296. flags = TCPH_FLAGS(tcphdr);
  41297. 802e35e: f000 013f and.w r1, r0, #63 ; 0x3f
  41298. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  41299. 802e362: bf18 it ne
  41300. 802e364: f04f 0c01 movne.w ip, #1
  41301. tcphdr->dest = ntohs(tcphdr->dest);
  41302. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  41303. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  41304. tcphdr->wnd = ntohs(tcphdr->wnd);
  41305. flags = TCPH_FLAGS(tcphdr);
  41306. 802e368: 7019 strb r1, [r3, #0]
  41307. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  41308. 802e36a: 44c4 add ip, r8
  41309. 802e36c: 4b7c ldr r3, [pc, #496] ; (802e560 <tcp_input+0x2c4>)
  41310. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  41311. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  41312. if (pcb->remote_port == tcphdr->src &&
  41313. pcb->local_port == tcphdr->dest &&
  41314. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  41315. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest)) {
  41316. 802e36e: 6829 ldr r1, [r5, #0]
  41317. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  41318. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  41319. tcphdr->wnd = ntohs(tcphdr->wnd);
  41320. flags = TCPH_FLAGS(tcphdr);
  41321. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  41322. 802e370: fa1f fc8c uxth.w ip, ip
  41323. 802e374: f8a3 c000 strh.w ip, [r3]
  41324. /* Demultiplex an incoming segment. First, we check if it is destined
  41325. for an active connection. */
  41326. prev = NULL;
  41327. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  41328. 802e378: 4b7a ldr r3, [pc, #488] ; (802e564 <tcp_input+0x2c8>)
  41329. 802e37a: f8d3 a000 ldr.w sl, [r3]
  41330. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  41331. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  41332. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  41333. if (pcb->remote_port == tcphdr->src &&
  41334. pcb->local_port == tcphdr->dest &&
  41335. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  41336. 802e37e: 4b7a ldr r3, [pc, #488] ; (802e568 <tcp_input+0x2cc>)
  41337. tcphdr->dest = ntohs(tcphdr->dest);
  41338. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  41339. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  41340. tcphdr->wnd = ntohs(tcphdr->wnd);
  41341. flags = TCPH_FLAGS(tcphdr);
  41342. 802e380: 4602 mov r2, r0
  41343. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  41344. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  41345. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  41346. if (pcb->remote_port == tcphdr->src &&
  41347. pcb->local_port == tcphdr->dest &&
  41348. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  41349. 802e382: f8d3 9000 ldr.w r9, [r3]
  41350. /* Demultiplex an incoming segment. First, we check if it is destined
  41351. for an active connection. */
  41352. prev = NULL;
  41353. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  41354. 802e386: 4654 mov r4, sl
  41355. flags = TCPH_FLAGS(tcphdr);
  41356. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  41357. /* Demultiplex an incoming segment. First, we check if it is destined
  41358. for an active connection. */
  41359. prev = NULL;
  41360. 802e388: 4658 mov r0, fp
  41361. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  41362. 802e38a: e019 b.n 802e3c0 <tcp_input+0x124>
  41363. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  41364. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  41365. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  41366. if (pcb->remote_port == tcphdr->src &&
  41367. 802e38c: 8ba5 ldrh r5, [r4, #28]
  41368. 802e38e: 883b ldrh r3, [r7, #0]
  41369. 802e390: 429d cmp r5, r3
  41370. 802e392: d113 bne.n 802e3bc <tcp_input+0x120>
  41371. 802e394: 8b65 ldrh r5, [r4, #26]
  41372. 802e396: 887b ldrh r3, [r7, #2]
  41373. 802e398: 429d cmp r5, r3
  41374. 802e39a: d10f bne.n 802e3bc <tcp_input+0x120>
  41375. pcb->local_port == tcphdr->dest &&
  41376. 802e39c: 6863 ldr r3, [r4, #4]
  41377. 802e39e: 454b cmp r3, r9
  41378. 802e3a0: d10c bne.n 802e3bc <tcp_input+0x120>
  41379. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  41380. 802e3a2: 6823 ldr r3, [r4, #0]
  41381. 802e3a4: 428b cmp r3, r1
  41382. 802e3a6: d109 bne.n 802e3bc <tcp_input+0x120>
  41383. /* Move this PCB to the front of the list so that subsequent
  41384. lookups will be faster (we exploit locality in TCP segment
  41385. arrivals). */
  41386. LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
  41387. if (prev != NULL) {
  41388. 802e3a8: 2800 cmp r0, #0
  41389. 802e3aa: f000 8382 beq.w 802eab2 <tcp_input+0x816>
  41390. prev->next = pcb->next;
  41391. 802e3ae: 68e3 ldr r3, [r4, #12]
  41392. 802e3b0: 60c3 str r3, [r0, #12]
  41393. pcb->next = tcp_active_pcbs;
  41394. tcp_active_pcbs = pcb;
  41395. 802e3b2: 4b6c ldr r3, [pc, #432] ; (802e564 <tcp_input+0x2c8>)
  41396. lookups will be faster (we exploit locality in TCP segment
  41397. arrivals). */
  41398. LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
  41399. if (prev != NULL) {
  41400. prev->next = pcb->next;
  41401. pcb->next = tcp_active_pcbs;
  41402. 802e3b4: f8c4 a00c str.w sl, [r4, #12]
  41403. tcp_active_pcbs = pcb;
  41404. 802e3b8: 601c str r4, [r3, #0]
  41405. 802e3ba: e37a b.n 802eab2 <tcp_input+0x816>
  41406. 802e3bc: 4620 mov r0, r4
  41407. /* Demultiplex an incoming segment. First, we check if it is destined
  41408. for an active connection. */
  41409. prev = NULL;
  41410. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  41411. 802e3be: 68e4 ldr r4, [r4, #12]
  41412. 802e3c0: 2c00 cmp r4, #0
  41413. 802e3c2: d1e3 bne.n 802e38c <tcp_input+0xf0>
  41414. 802e3c4: e372 b.n 802eaac <tcp_input+0x810>
  41415. if (pcb == NULL) {
  41416. /* If it did not go to an active connection, we check the connections
  41417. in the TIME-WAIT state. */
  41418. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  41419. LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  41420. if (pcb->remote_port == tcphdr->src &&
  41421. 802e3c6: 8b98 ldrh r0, [r3, #28]
  41422. 802e3c8: 883c ldrh r4, [r7, #0]
  41423. 802e3ca: 4284 cmp r4, r0
  41424. 802e3cc: d130 bne.n 802e430 <tcp_input+0x194>
  41425. pcb->local_port == tcphdr->dest &&
  41426. 802e3ce: 8b58 ldrh r0, [r3, #26]
  41427. if (pcb == NULL) {
  41428. /* If it did not go to an active connection, we check the connections
  41429. in the TIME-WAIT state. */
  41430. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  41431. LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  41432. if (pcb->remote_port == tcphdr->src &&
  41433. 802e3d0: 887d ldrh r5, [r7, #2]
  41434. 802e3d2: 4285 cmp r5, r0
  41435. 802e3d4: d12c bne.n 802e430 <tcp_input+0x194>
  41436. pcb->local_port == tcphdr->dest &&
  41437. 802e3d6: 6858 ldr r0, [r3, #4]
  41438. 802e3d8: 4548 cmp r0, r9
  41439. 802e3da: d129 bne.n 802e430 <tcp_input+0x194>
  41440. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  41441. 802e3dc: 6818 ldr r0, [r3, #0]
  41442. 802e3de: 4288 cmp r0, r1
  41443. 802e3e0: d126 bne.n 802e430 <tcp_input+0x194>
  41444. /* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */
  41445. /* RFC 793 3.9 Event Processing - Segment Arrives:
  41446. * - first check sequence number - we skip that one in TIME_WAIT (always
  41447. * acceptable since we only send ACKs)
  41448. * - second check the RST bit (... return) */
  41449. if (flags & TCP_RST) {
  41450. 802e3e2: f002 0104 and.w r1, r2, #4
  41451. 802e3e6: b2c9 uxtb r1, r1
  41452. 802e3e8: 2900 cmp r1, #0
  41453. 802e3ea: f040 833f bne.w 802ea6c <tcp_input+0x7d0>
  41454. return ERR_OK;
  41455. }
  41456. /* - fourth, check the SYN bit, */
  41457. if (flags & TCP_SYN) {
  41458. 802e3ee: f002 0102 and.w r1, r2, #2
  41459. 802e3f2: b2c9 uxtb r1, r1
  41460. 802e3f4: b159 cbz r1, 802e40e <tcp_input+0x172>
  41461. /* If an incoming segment is not acceptable, an acknowledgment
  41462. should be sent in reply */
  41463. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)) {
  41464. 802e3f6: 4a57 ldr r2, [pc, #348] ; (802e554 <tcp_input+0x2b8>)
  41465. 802e3f8: 6811 ldr r1, [r2, #0]
  41466. 802e3fa: 6a9a ldr r2, [r3, #40] ; 0x28
  41467. 802e3fc: 1a8a subs r2, r1, r2
  41468. 802e3fe: d40b bmi.n 802e418 <tcp_input+0x17c>
  41469. 802e400: 8d98 ldrh r0, [r3, #44] ; 0x2c
  41470. 802e402: 1a12 subs r2, r2, r0
  41471. 802e404: 2a00 cmp r2, #0
  41472. 802e406: dc07 bgt.n 802e418 <tcp_input+0x17c>
  41473. /* If the SYN is in the window it is an error, send a reset */
  41474. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  41475. 802e408: 9500 str r5, [sp, #0]
  41476. 802e40a: 9401 str r4, [sp, #4]
  41477. 802e40c: e041 b.n 802e492 <tcp_input+0x1f6>
  41478. tcphdr->dest, tcphdr->src);
  41479. return ERR_OK;
  41480. }
  41481. } else if (flags & TCP_FIN) {
  41482. 802e40e: 07d2 lsls r2, r2, #31
  41483. 802e410: d502 bpl.n 802e418 <tcp_input+0x17c>
  41484. /* - eighth, check the FIN bit: Remain in the TIME-WAIT state.
  41485. Restart the 2 MSL time-wait timeout.*/
  41486. pcb->tmr = tcp_ticks;
  41487. 802e412: 4a56 ldr r2, [pc, #344] ; (802e56c <tcp_input+0x2d0>)
  41488. 802e414: 6812 ldr r2, [r2, #0]
  41489. 802e416: 625a str r2, [r3, #36] ; 0x24
  41490. }
  41491. if ((tcplen > 0)) {
  41492. 802e418: f1bc 0f00 cmp.w ip, #0
  41493. 802e41c: f000 8326 beq.w 802ea6c <tcp_input+0x7d0>
  41494. /* Acknowledge data, FIN or out-of-window SYN */
  41495. pcb->flags |= TF_ACK_NOW;
  41496. 802e420: 7f9a ldrb r2, [r3, #30]
  41497. 802e422: f042 0202 orr.w r2, r2, #2
  41498. 802e426: 779a strb r2, [r3, #30]
  41499. return tcp_output(pcb);
  41500. 802e428: 4618 mov r0, r3
  41501. 802e42a: f000 fe3d bl 802f0a8 <tcp_output>
  41502. 802e42e: e31d b.n 802ea6c <tcp_input+0x7d0>
  41503. }
  41504. if (pcb == NULL) {
  41505. /* If it did not go to an active connection, we check the connections
  41506. in the TIME-WAIT state. */
  41507. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  41508. 802e430: 68db ldr r3, [r3, #12]
  41509. 802e432: 2b00 cmp r3, #0
  41510. 802e434: d1c7 bne.n 802e3c6 <tcp_input+0x12a>
  41511. }
  41512. /* Finally, if we still did not get a match, we check all PCBs that
  41513. are LISTENing for incoming connections. */
  41514. prev = NULL;
  41515. for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  41516. 802e436: 484e ldr r0, [pc, #312] ; (802e570 <tcp_input+0x2d4>)
  41517. 802e438: 6804 ldr r4, [r0, #0]
  41518. 802e43a: 4625 mov r5, r4
  41519. 802e43c: e00f b.n 802e45e <tcp_input+0x1c2>
  41520. if (lpcb->local_port == tcphdr->dest) {
  41521. 802e43e: 8b68 ldrh r0, [r5, #26]
  41522. 802e440: f8b7 8002 ldrh.w r8, [r7, #2]
  41523. 802e444: 4580 cmp r8, r0
  41524. 802e446: d108 bne.n 802e45a <tcp_input+0x1be>
  41525. /* found an ANY-match */
  41526. lpcb_any = lpcb;
  41527. lpcb_prev = prev;
  41528. }
  41529. #else /* SO_REUSE */
  41530. if (ip_addr_cmp(&(lpcb->local_ip), &current_iphdr_dest) ||
  41531. 802e448: f8d5 8000 ldr.w r8, [r5]
  41532. 802e44c: 4588 cmp r8, r1
  41533. 802e44e: f000 8342 beq.w 802ead6 <tcp_input+0x83a>
  41534. ip_addr_isany(&(lpcb->local_ip))) {
  41535. 802e452: f1b8 0f00 cmp.w r8, #0
  41536. 802e456: f000 833e beq.w 802ead6 <tcp_input+0x83a>
  41537. 802e45a: 462b mov r3, r5
  41538. }
  41539. /* Finally, if we still did not get a match, we check all PCBs that
  41540. are LISTENing for incoming connections. */
  41541. prev = NULL;
  41542. for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  41543. 802e45c: 68ed ldr r5, [r5, #12]
  41544. 802e45e: 2d00 cmp r5, #0
  41545. 802e460: d1ed bne.n 802e43e <tcp_input+0x1a2>
  41546. 802e462: e33c b.n 802eade <tcp_input+0x842>
  41547. if (lpcb != NULL) {
  41548. /* Move this PCB to the front of the list so that subsequent
  41549. lookups will be faster (we exploit locality in TCP segment
  41550. arrivals). */
  41551. if (prev != NULL) {
  41552. ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
  41553. 802e464: 68e9 ldr r1, [r5, #12]
  41554. 802e466: 60d9 str r1, [r3, #12]
  41555. /* our successor is the remainder of the listening list */
  41556. lpcb->next = tcp_listen_pcbs.listen_pcbs;
  41557. /* put this listening pcb at the head of the listening list */
  41558. tcp_listen_pcbs.listen_pcbs = lpcb;
  41559. 802e468: 4b41 ldr r3, [pc, #260] ; (802e570 <tcp_input+0x2d4>)
  41560. lookups will be faster (we exploit locality in TCP segment
  41561. arrivals). */
  41562. if (prev != NULL) {
  41563. ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
  41564. /* our successor is the remainder of the listening list */
  41565. lpcb->next = tcp_listen_pcbs.listen_pcbs;
  41566. 802e46a: 60ec str r4, [r5, #12]
  41567. /* put this listening pcb at the head of the listening list */
  41568. tcp_listen_pcbs.listen_pcbs = lpcb;
  41569. 802e46c: 601d str r5, [r3, #0]
  41570. tcp_listen_input(struct tcp_pcb_listen *pcb)
  41571. {
  41572. struct tcp_pcb *npcb;
  41573. err_t rc;
  41574. if (flags & TCP_RST) {
  41575. 802e46e: f002 0304 and.w r3, r2, #4
  41576. 802e472: b2db uxtb r3, r3
  41577. 802e474: 2b00 cmp r3, #0
  41578. 802e476: f040 82f9 bne.w 802ea6c <tcp_input+0x7d0>
  41579. return ERR_OK;
  41580. }
  41581. /* In the LISTEN state, we check for incoming SYN segments,
  41582. creates a new PCB, and responds with a SYN|ACK. */
  41583. if (flags & TCP_ACK) {
  41584. 802e47a: f002 0810 and.w r8, r2, #16
  41585. 802e47e: fa5f f888 uxtb.w r8, r8
  41586. 802e482: f1b8 0f00 cmp.w r8, #0
  41587. 802e486: d00c beq.n 802e4a2 <tcp_input+0x206>
  41588. /* For incoming segments with the ACK flag set, respond with a
  41589. RST. */
  41590. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n"));
  41591. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),
  41592. 802e488: 4b32 ldr r3, [pc, #200] ; (802e554 <tcp_input+0x2b8>)
  41593. 802e48a: 6819 ldr r1, [r3, #0]
  41594. 802e48c: 9000 str r0, [sp, #0]
  41595. 802e48e: 883b ldrh r3, [r7, #0]
  41596. 802e490: 9301 str r3, [sp, #4]
  41597. 802e492: 4b31 ldr r3, [pc, #196] ; (802e558 <tcp_input+0x2bc>)
  41598. 802e494: 6818 ldr r0, [r3, #0]
  41599. 802e496: 4461 add r1, ip
  41600. 802e498: 4a2d ldr r2, [pc, #180] ; (802e550 <tcp_input+0x2b4>)
  41601. 802e49a: 4b33 ldr r3, [pc, #204] ; (802e568 <tcp_input+0x2cc>)
  41602. 802e49c: f000 ff28 bl 802f2f0 <tcp_rst>
  41603. 802e4a0: e2e4 b.n 802ea6c <tcp_input+0x7d0>
  41604. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  41605. } else if (flags & TCP_SYN) {
  41606. 802e4a2: f002 0202 and.w r2, r2, #2
  41607. 802e4a6: b2d2 uxtb r2, r2
  41608. 802e4a8: 2a00 cmp r2, #0
  41609. 802e4aa: f000 82df beq.w 802ea6c <tcp_input+0x7d0>
  41610. if (pcb->accepts_pending >= pcb->backlog) {
  41611. LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: listen backlog exceeded for port %"U16_F"\n", tcphdr->dest));
  41612. return ERR_ABRT;
  41613. }
  41614. #endif /* TCP_LISTEN_BACKLOG */
  41615. npcb = tcp_alloc(pcb->prio);
  41616. 802e4ae: 7e68 ldrb r0, [r5, #25]
  41617. 802e4b0: f7ff fbc6 bl 802dc40 <tcp_alloc>
  41618. /* If a new PCB could not be created (probably due to lack of memory),
  41619. we don't do anything, but rely on the sender will retransmit the
  41620. SYN at a time when we have more memory available. */
  41621. if (npcb == NULL) {
  41622. 802e4b4: 4604 mov r4, r0
  41623. 802e4b6: 2800 cmp r0, #0
  41624. 802e4b8: f000 82d8 beq.w 802ea6c <tcp_input+0x7d0>
  41625. }
  41626. #if TCP_LISTEN_BACKLOG
  41627. pcb->accepts_pending++;
  41628. #endif /* TCP_LISTEN_BACKLOG */
  41629. /* Set up the new PCB. */
  41630. ip_addr_copy(npcb->local_ip, current_iphdr_dest);
  41631. 802e4bc: 4b24 ldr r3, [pc, #144] ; (802e550 <tcp_input+0x2b4>)
  41632. 802e4be: 681b ldr r3, [r3, #0]
  41633. 802e4c0: 6003 str r3, [r0, #0]
  41634. npcb->local_port = pcb->local_port;
  41635. 802e4c2: 8b6b ldrh r3, [r5, #26]
  41636. 802e4c4: 8343 strh r3, [r0, #26]
  41637. ip_addr_copy(npcb->remote_ip, current_iphdr_src);
  41638. 802e4c6: 4b28 ldr r3, [pc, #160] ; (802e568 <tcp_input+0x2cc>)
  41639. 802e4c8: 681b ldr r3, [r3, #0]
  41640. 802e4ca: 6043 str r3, [r0, #4]
  41641. npcb->remote_port = tcphdr->src;
  41642. 802e4cc: 4b1f ldr r3, [pc, #124] ; (802e54c <tcp_input+0x2b0>)
  41643. 802e4ce: 681b ldr r3, [r3, #0]
  41644. 802e4d0: 7859 ldrb r1, [r3, #1]
  41645. 802e4d2: 781a ldrb r2, [r3, #0]
  41646. 802e4d4: ea42 2201 orr.w r2, r2, r1, lsl #8
  41647. 802e4d8: 8382 strh r2, [r0, #28]
  41648. npcb->state = SYN_RCVD;
  41649. 802e4da: 2203 movs r2, #3
  41650. 802e4dc: 7602 strb r2, [r0, #24]
  41651. npcb->rcv_nxt = seqno + 1;
  41652. 802e4de: 4a1d ldr r2, [pc, #116] ; (802e554 <tcp_input+0x2b8>)
  41653. 802e4e0: 6812 ldr r2, [r2, #0]
  41654. 802e4e2: 1c51 adds r1, r2, #1
  41655. 802e4e4: 6281 str r1, [r0, #40] ; 0x28
  41656. npcb->rcv_ann_right_edge = npcb->rcv_nxt;
  41657. 802e4e6: 6301 str r1, [r0, #48] ; 0x30
  41658. npcb->snd_wnd = tcphdr->wnd;
  41659. 802e4e8: 89db ldrh r3, [r3, #14]
  41660. 802e4ea: f8a0 3060 strh.w r3, [r0, #96] ; 0x60
  41661. npcb->snd_wnd_max = tcphdr->wnd;
  41662. 802e4ee: f8a0 3062 strh.w r3, [r0, #98] ; 0x62
  41663. npcb->ssthresh = npcb->snd_wnd;
  41664. 802e4f2: f8a0 304e strh.w r3, [r0, #78] ; 0x4e
  41665. npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */
  41666. npcb->callback_arg = pcb->callback_arg;
  41667. 802e4f6: 692b ldr r3, [r5, #16]
  41668. 802e4f8: 6103 str r3, [r0, #16]
  41669. #if LWIP_CALLBACK_API
  41670. npcb->accept = pcb->accept;
  41671. 802e4fa: 696b ldr r3, [r5, #20]
  41672. npcb->rcv_nxt = seqno + 1;
  41673. npcb->rcv_ann_right_edge = npcb->rcv_nxt;
  41674. npcb->snd_wnd = tcphdr->wnd;
  41675. npcb->snd_wnd_max = tcphdr->wnd;
  41676. npcb->ssthresh = npcb->snd_wnd;
  41677. npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */
  41678. 802e4fc: 3a01 subs r2, #1
  41679. 802e4fe: 6542 str r2, [r0, #84] ; 0x54
  41680. npcb->callback_arg = pcb->callback_arg;
  41681. #if LWIP_CALLBACK_API
  41682. npcb->accept = pcb->accept;
  41683. 802e500: 6143 str r3, [r0, #20]
  41684. #endif /* LWIP_CALLBACK_API */
  41685. /* inherit socket options */
  41686. npcb->so_options = pcb->so_options & SOF_INHERITED;
  41687. 802e502: 7a2b ldrb r3, [r5, #8]
  41688. 802e504: f023 0373 bic.w r3, r3, #115 ; 0x73
  41689. 802e508: 7203 strb r3, [r0, #8]
  41690. /* Register the new PCB so that we can begin receiving segments
  41691. for it. */
  41692. TCP_REG_ACTIVE(npcb);
  41693. 802e50a: 4b16 ldr r3, [pc, #88] ; (802e564 <tcp_input+0x2c8>)
  41694. 802e50c: 681a ldr r2, [r3, #0]
  41695. 802e50e: 6018 str r0, [r3, #0]
  41696. 802e510: 60c2 str r2, [r0, #12]
  41697. 802e512: f001 f887 bl 802f624 <tcp_timer_needed>
  41698. 802e516: 4b17 ldr r3, [pc, #92] ; (802e574 <tcp_input+0x2d8>)
  41699. 802e518: 2201 movs r2, #1
  41700. /* Parse any options in the SYN. */
  41701. tcp_parseopt(npcb);
  41702. 802e51a: 4620 mov r0, r4
  41703. #endif /* LWIP_CALLBACK_API */
  41704. /* inherit socket options */
  41705. npcb->so_options = pcb->so_options & SOF_INHERITED;
  41706. /* Register the new PCB so that we can begin receiving segments
  41707. for it. */
  41708. TCP_REG_ACTIVE(npcb);
  41709. 802e51c: 701a strb r2, [r3, #0]
  41710. /* Parse any options in the SYN. */
  41711. tcp_parseopt(npcb);
  41712. 802e51e: f7ff fc29 bl 802dd74 <tcp_parseopt>
  41713. #if TCP_CALCULATE_EFF_SEND_MSS
  41714. npcb->mss = tcp_eff_send_mss(npcb->mss, &(npcb->remote_ip));
  41715. 802e522: 1d21 adds r1, r4, #4
  41716. 802e524: 8ee0 ldrh r0, [r4, #54] ; 0x36
  41717. 802e526: f7ff fc16 bl 802dd56 <tcp_eff_send_mss>
  41718. 802e52a: 86e0 strh r0, [r4, #54] ; 0x36
  41719. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  41720. snmp_inc_tcppassiveopens();
  41721. 802e52c: f003 fb40 bl 8031bb0 <snmp_inc_tcppassiveopens>
  41722. /* Send a SYN|ACK together with the MSS option. */
  41723. rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK);
  41724. 802e530: 4620 mov r0, r4
  41725. 802e532: 2112 movs r1, #18
  41726. 802e534: f000 fd28 bl 802ef88 <tcp_enqueue_flags>
  41727. if (rc != ERR_OK) {
  41728. 802e538: b120 cbz r0, 802e544 <tcp_input+0x2a8>
  41729. tcp_abandon(npcb, 0);
  41730. 802e53a: 4620 mov r0, r4
  41731. 802e53c: 4641 mov r1, r8
  41732. 802e53e: f7ff f9e1 bl 802d904 <tcp_abandon>
  41733. 802e542: e293 b.n 802ea6c <tcp_input+0x7d0>
  41734. return rc;
  41735. }
  41736. return tcp_output(npcb);
  41737. 802e544: 4620 mov r0, r4
  41738. 802e546: e770 b.n 802e42a <tcp_input+0x18e>
  41739. 802e548: 2000e108 .word 0x2000e108
  41740. 802e54c: 2000e0f0 .word 0x2000e0f0
  41741. 802e550: 20011004 .word 0x20011004
  41742. 802e554: 2000e0f4 .word 0x2000e0f4
  41743. 802e558: 2000e0fc .word 0x2000e0fc
  41744. 802e55c: 2000e100 .word 0x2000e100
  41745. 802e560: 2000e0f8 .word 0x2000e0f8
  41746. 802e564: 20010fdc .word 0x20010fdc
  41747. 802e568: 20010ffc .word 0x20010ffc
  41748. 802e56c: 20010fe0 .word 0x20010fe0
  41749. 802e570: 20010fe4 .word 0x20010fe4
  41750. 802e574: 20010fd8 .word 0x20010fd8
  41751. recv_data = NULL;
  41752. recv_flags = 0;
  41753. if (flags & TCP_PSH) {
  41754. p->flags |= PBUF_FLAG_PUSH;
  41755. 802e578: 7b73 ldrb r3, [r6, #13]
  41756. 802e57a: f043 0301 orr.w r3, r3, #1
  41757. 802e57e: 7373 strb r3, [r6, #13]
  41758. }
  41759. /* If there is data which was previously "refused" by upper layer */
  41760. if (pcb->refused_data != NULL) {
  41761. 802e580: 6f63 ldr r3, [r4, #116] ; 0x74
  41762. 802e582: b163 cbz r3, 802e59e <tcp_input+0x302>
  41763. if ((tcp_process_refused_data(pcb) == ERR_ABRT) ||
  41764. 802e584: 4620 mov r0, r4
  41765. 802e586: f7ff fad1 bl 802db2c <tcp_process_refused_data>
  41766. 802e58a: 300a adds r0, #10
  41767. 802e58c: d004 beq.n 802e598 <tcp_input+0x2fc>
  41768. 802e58e: 6f63 ldr r3, [r4, #116] ; 0x74
  41769. 802e590: b12b cbz r3, 802e59e <tcp_input+0x302>
  41770. ((pcb->refused_data != NULL) && (tcplen > 0))) {
  41771. 802e592: 4b9f ldr r3, [pc, #636] ; (802e810 <tcp_input+0x574>)
  41772. 802e594: 881b ldrh r3, [r3, #0]
  41773. 802e596: b113 cbz r3, 802e59e <tcp_input+0x302>
  41774. /* pcb has been aborted or refused data is still refused and the new
  41775. segment contains data */
  41776. TCP_STATS_INC(tcp.drop);
  41777. snmp_inc_tcpinerrs();
  41778. 802e598: f003 fb3a bl 8031c10 <snmp_inc_tcpinerrs>
  41779. goto aborted;
  41780. 802e59c: e249 b.n 802ea32 <tcp_input+0x796>
  41781. }
  41782. }
  41783. tcp_input_pcb = pcb;
  41784. 802e59e: 4b9d ldr r3, [pc, #628] ; (802e814 <tcp_input+0x578>)
  41785. 802e5a0: 601c str r4, [r3, #0]
  41786. err_t err;
  41787. err = ERR_OK;
  41788. /* Process incoming RST segments. */
  41789. if (flags & TCP_RST) {
  41790. 802e5a2: 4b9d ldr r3, [pc, #628] ; (802e818 <tcp_input+0x57c>)
  41791. 802e5a4: 781b ldrb r3, [r3, #0]
  41792. 802e5a6: f003 0204 and.w r2, r3, #4
  41793. 802e5aa: b2d2 uxtb r2, r2
  41794. 802e5ac: b1aa cbz r2, 802e5da <tcp_input+0x33e>
  41795. /* First, determine if the reset is acceptable. */
  41796. if (pcb->state == SYN_SENT) {
  41797. 802e5ae: 7e23 ldrb r3, [r4, #24]
  41798. 802e5b0: 2b02 cmp r3, #2
  41799. 802e5b2: d106 bne.n 802e5c2 <tcp_input+0x326>
  41800. if (ackno == pcb->snd_nxt) {
  41801. 802e5b4: 4b99 ldr r3, [pc, #612] ; (802e81c <tcp_input+0x580>)
  41802. 802e5b6: 681a ldr r2, [r3, #0]
  41803. 802e5b8: 6d23 ldr r3, [r4, #80] ; 0x50
  41804. 802e5ba: 429a cmp r2, r3
  41805. 802e5bc: f040 82a1 bne.w 802eb02 <tcp_input+0x866>
  41806. 802e5c0: e296 b.n 802eaf0 <tcp_input+0x854>
  41807. acceptable = 1;
  41808. }
  41809. } else {
  41810. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
  41811. 802e5c2: 4b97 ldr r3, [pc, #604] ; (802e820 <tcp_input+0x584>)
  41812. 802e5c4: 681a ldr r2, [r3, #0]
  41813. 802e5c6: 6aa3 ldr r3, [r4, #40] ; 0x28
  41814. 802e5c8: 1ad3 subs r3, r2, r3
  41815. 802e5ca: f100 829a bmi.w 802eb02 <tcp_input+0x866>
  41816. 802e5ce: 8da1 ldrh r1, [r4, #44] ; 0x2c
  41817. 802e5d0: 1a5b subs r3, r3, r1
  41818. 802e5d2: 2b00 cmp r3, #0
  41819. 802e5d4: f300 8295 bgt.w 802eb02 <tcp_input+0x866>
  41820. 802e5d8: e28a b.n 802eaf0 <tcp_input+0x854>
  41821. seqno, pcb->rcv_nxt));
  41822. return ERR_OK;
  41823. }
  41824. }
  41825. if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) {
  41826. 802e5da: f003 0302 and.w r3, r3, #2
  41827. 802e5de: b2db uxtb r3, r3
  41828. 802e5e0: b123 cbz r3, 802e5ec <tcp_input+0x350>
  41829. 802e5e2: 7e23 ldrb r3, [r4, #24]
  41830. 802e5e4: 3b02 subs r3, #2
  41831. 802e5e6: 2b01 cmp r3, #1
  41832. 802e5e8: d900 bls.n 802e5ec <tcp_input+0x350>
  41833. 802e5ea: e06b b.n 802e6c4 <tcp_input+0x428>
  41834. /* Cope with new connection attempt after remote end crashed */
  41835. tcp_ack_now(pcb);
  41836. return ERR_OK;
  41837. }
  41838. if ((pcb->flags & TF_RXCLOSED) == 0) {
  41839. 802e5ec: 7fa3 ldrb r3, [r4, #30]
  41840. 802e5ee: f003 0310 and.w r3, r3, #16
  41841. 802e5f2: b2db uxtb r3, r3
  41842. 802e5f4: b913 cbnz r3, 802e5fc <tcp_input+0x360>
  41843. /* Update the PCB (in)activity timer unless rx is closed (see tcp_shutdown) */
  41844. pcb->tmr = tcp_ticks;
  41845. 802e5f6: 4b8b ldr r3, [pc, #556] ; (802e824 <tcp_input+0x588>)
  41846. 802e5f8: 681b ldr r3, [r3, #0]
  41847. 802e5fa: 6263 str r3, [r4, #36] ; 0x24
  41848. }
  41849. pcb->keep_cnt_sent = 0;
  41850. 802e5fc: 2300 movs r3, #0
  41851. 802e5fe: f884 3092 strb.w r3, [r4, #146] ; 0x92
  41852. tcp_parseopt(pcb);
  41853. 802e602: 4620 mov r0, r4
  41854. 802e604: f7ff fbb6 bl 802dd74 <tcp_parseopt>
  41855. /* Do different things depending on the TCP state. */
  41856. switch (pcb->state) {
  41857. 802e608: 7e23 ldrb r3, [r4, #24]
  41858. 802e60a: 3b02 subs r3, #2
  41859. 802e60c: 2b07 cmp r3, #7
  41860. 802e60e: f200 8278 bhi.w 802eb02 <tcp_input+0x866>
  41861. 802e612: e8df f013 tbh [pc, r3, lsl #1]
  41862. 802e616: 0008 .short 0x0008
  41863. 802e618: 00c90077 .word 0x00c90077
  41864. 802e61c: 013000da .word 0x013000da
  41865. 802e620: 015200c9 .word 0x015200c9
  41866. 802e624: 0186 .short 0x0186
  41867. case SYN_SENT:
  41868. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
  41869. pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno)));
  41870. /* received SYN ACK with expected sequence number? */
  41871. if ((flags & TCP_ACK) && (flags & TCP_SYN)
  41872. 802e626: 4b7c ldr r3, [pc, #496] ; (802e818 <tcp_input+0x57c>)
  41873. 802e628: 781b ldrb r3, [r3, #0]
  41874. 802e62a: f003 0312 and.w r3, r3, #18
  41875. 802e62e: 2b12 cmp r3, #18
  41876. 802e630: d153 bne.n 802e6da <tcp_input+0x43e>
  41877. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  41878. 802e632: 6f23 ldr r3, [r4, #112] ; 0x70
  41879. 802e634: 4d79 ldr r5, [pc, #484] ; (802e81c <tcp_input+0x580>)
  41880. 802e636: 68db ldr r3, [r3, #12]
  41881. 802e638: 682e ldr r6, [r5, #0]
  41882. 802e63a: 6858 ldr r0, [r3, #4]
  41883. 802e63c: f7fd fbc6 bl 802bdcc <lwip_ntohl>
  41884. 802e640: 3001 adds r0, #1
  41885. 802e642: 4286 cmp r6, r0
  41886. 802e644: d149 bne.n 802e6da <tcp_input+0x43e>
  41887. pcb->snd_buf++;
  41888. 802e646: f8b4 3066 ldrh.w r3, [r4, #102] ; 0x66
  41889. pcb->snd_wnd_max = tcphdr->wnd;
  41890. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  41891. pcb->state = ESTABLISHED;
  41892. #if TCP_CALCULATE_EFF_SEND_MSS
  41893. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  41894. 802e64a: 8ee0 ldrh r0, [r4, #54] ; 0x36
  41895. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
  41896. pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno)));
  41897. /* received SYN ACK with expected sequence number? */
  41898. if ((flags & TCP_ACK) && (flags & TCP_SYN)
  41899. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  41900. pcb->snd_buf++;
  41901. 802e64c: 3301 adds r3, #1
  41902. 802e64e: f8a4 3066 strh.w r3, [r4, #102] ; 0x66
  41903. pcb->rcv_nxt = seqno + 1;
  41904. 802e652: 4b73 ldr r3, [pc, #460] ; (802e820 <tcp_input+0x584>)
  41905. 802e654: 681b ldr r3, [r3, #0]
  41906. 802e656: 1c5a adds r2, r3, #1
  41907. 802e658: 62a2 str r2, [r4, #40] ; 0x28
  41908. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  41909. 802e65a: 6322 str r2, [r4, #48] ; 0x30
  41910. pcb->lastack = ackno;
  41911. 802e65c: 682a ldr r2, [r5, #0]
  41912. 802e65e: 64a2 str r2, [r4, #72] ; 0x48
  41913. pcb->snd_wnd = tcphdr->wnd;
  41914. 802e660: 4a71 ldr r2, [pc, #452] ; (802e828 <tcp_input+0x58c>)
  41915. 802e662: 6812 ldr r2, [r2, #0]
  41916. pcb->snd_wnd_max = tcphdr->wnd;
  41917. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  41918. 802e664: 3b01 subs r3, #1
  41919. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  41920. pcb->snd_buf++;
  41921. pcb->rcv_nxt = seqno + 1;
  41922. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  41923. pcb->lastack = ackno;
  41924. pcb->snd_wnd = tcphdr->wnd;
  41925. 802e666: 89d2 ldrh r2, [r2, #14]
  41926. pcb->snd_wnd_max = tcphdr->wnd;
  41927. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  41928. 802e668: 6563 str r3, [r4, #84] ; 0x54
  41929. pcb->state = ESTABLISHED;
  41930. 802e66a: 2304 movs r3, #4
  41931. 802e66c: 7623 strb r3, [r4, #24]
  41932. #if TCP_CALCULATE_EFF_SEND_MSS
  41933. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  41934. 802e66e: 18e1 adds r1, r4, r3
  41935. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  41936. pcb->snd_buf++;
  41937. pcb->rcv_nxt = seqno + 1;
  41938. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  41939. pcb->lastack = ackno;
  41940. pcb->snd_wnd = tcphdr->wnd;
  41941. 802e670: f8a4 2060 strh.w r2, [r4, #96] ; 0x60
  41942. pcb->snd_wnd_max = tcphdr->wnd;
  41943. 802e674: f8a4 2062 strh.w r2, [r4, #98] ; 0x62
  41944. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  41945. pcb->state = ESTABLISHED;
  41946. #if TCP_CALCULATE_EFF_SEND_MSS
  41947. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  41948. 802e678: f7ff fb6d bl 802dd56 <tcp_eff_send_mss>
  41949. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  41950. /* Set ssthresh again after changing pcb->mss (already set in tcp_connect
  41951. * but for the default value of pcb->mss) */
  41952. pcb->ssthresh = pcb->mss * 10;
  41953. 802e67c: 230a movs r3, #10
  41954. 802e67e: 4343 muls r3, r0
  41955. 802e680: f8a4 304e strh.w r3, [r4, #78] ; 0x4e
  41956. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  41957. 802e684: f8b4 304c ldrh.w r3, [r4, #76] ; 0x4c
  41958. pcb->snd_wnd_max = tcphdr->wnd;
  41959. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  41960. pcb->state = ESTABLISHED;
  41961. #if TCP_CALCULATE_EFF_SEND_MSS
  41962. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  41963. 802e688: 86e0 strh r0, [r4, #54] ; 0x36
  41964. /* Set ssthresh again after changing pcb->mss (already set in tcp_connect
  41965. * but for the default value of pcb->mss) */
  41966. pcb->ssthresh = pcb->mss * 10;
  41967. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  41968. 802e68a: 2b01 cmp r3, #1
  41969. 802e68c: d101 bne.n 802e692 <tcp_input+0x3f6>
  41970. 802e68e: 0040 lsls r0, r0, #1
  41971. 802e690: b280 uxth r0, r0
  41972. LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
  41973. --pcb->snd_queuelen;
  41974. 802e692: f8b4 3068 ldrh.w r3, [r4, #104] ; 0x68
  41975. /* Set ssthresh again after changing pcb->mss (already set in tcp_connect
  41976. * but for the default value of pcb->mss) */
  41977. pcb->ssthresh = pcb->mss * 10;
  41978. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  41979. 802e696: f8a4 004c strh.w r0, [r4, #76] ; 0x4c
  41980. LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
  41981. --pcb->snd_queuelen;
  41982. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen));
  41983. rseg = pcb->unacked;
  41984. 802e69a: 6f20 ldr r0, [r4, #112] ; 0x70
  41985. * but for the default value of pcb->mss) */
  41986. pcb->ssthresh = pcb->mss * 10;
  41987. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  41988. LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
  41989. --pcb->snd_queuelen;
  41990. 802e69c: 3b01 subs r3, #1
  41991. 802e69e: f8a4 3068 strh.w r3, [r4, #104] ; 0x68
  41992. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen));
  41993. rseg = pcb->unacked;
  41994. pcb->unacked = rseg->next;
  41995. 802e6a2: 6803 ldr r3, [r0, #0]
  41996. 802e6a4: 6723 str r3, [r4, #112] ; 0x70
  41997. tcp_seg_free(rseg);
  41998. 802e6a6: f7fe ff70 bl 802d58a <tcp_seg_free>
  41999. /* If there's nothing left to acknowledge, stop the retransmit
  42000. timer, otherwise reset it to start again */
  42001. if(pcb->unacked == NULL)
  42002. 802e6aa: 6f23 ldr r3, [r4, #112] ; 0x70
  42003. 802e6ac: b91b cbnz r3, 802e6b6 <tcp_input+0x41a>
  42004. pcb->rtime = -1;
  42005. 802e6ae: f64f 73ff movw r3, #65535 ; 0xffff
  42006. 802e6b2: 86a3 strh r3, [r4, #52] ; 0x34
  42007. 802e6b4: e003 b.n 802e6be <tcp_input+0x422>
  42008. else {
  42009. pcb->rtime = 0;
  42010. 802e6b6: 2300 movs r3, #0
  42011. 802e6b8: 86a3 strh r3, [r4, #52] ; 0x34
  42012. pcb->nrtx = 0;
  42013. 802e6ba: f884 3046 strb.w r3, [r4, #70] ; 0x46
  42014. }
  42015. /* Call the user specified function to call when sucessfully
  42016. * connected. */
  42017. TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
  42018. 802e6be: f8d4 3080 ldr.w r3, [r4, #128] ; 0x80
  42019. 802e6c2: b91b cbnz r3, 802e6cc <tcp_input+0x430>
  42020. if (err == ERR_ABRT) {
  42021. return ERR_ABRT;
  42022. }
  42023. tcp_ack_now(pcb);
  42024. 802e6c4: 7fa3 ldrb r3, [r4, #30]
  42025. 802e6c6: f043 0302 orr.w r3, r3, #2
  42026. 802e6ca: e219 b.n 802eb00 <tcp_input+0x864>
  42027. pcb->nrtx = 0;
  42028. }
  42029. /* Call the user specified function to call when sucessfully
  42030. * connected. */
  42031. TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
  42032. 802e6cc: 2200 movs r2, #0
  42033. 802e6ce: 6920 ldr r0, [r4, #16]
  42034. 802e6d0: 4621 mov r1, r4
  42035. 802e6d2: 4798 blx r3
  42036. if (err == ERR_ABRT) {
  42037. 802e6d4: 300a adds r0, #10
  42038. 802e6d6: d1f5 bne.n 802e6c4 <tcp_input+0x428>
  42039. 802e6d8: e1ab b.n 802ea32 <tcp_input+0x796>
  42040. return ERR_ABRT;
  42041. }
  42042. tcp_ack_now(pcb);
  42043. }
  42044. /* received ACK? possibly a half-open connection */
  42045. else if (flags & TCP_ACK) {
  42046. 802e6da: 4b4f ldr r3, [pc, #316] ; (802e818 <tcp_input+0x57c>)
  42047. 802e6dc: 781b ldrb r3, [r3, #0]
  42048. 802e6de: f003 0310 and.w r3, r3, #16
  42049. 802e6e2: b2db uxtb r3, r3
  42050. 802e6e4: 2b00 cmp r3, #0
  42051. 802e6e6: f000 820c beq.w 802eb02 <tcp_input+0x866>
  42052. /* send a RST to bring the other side in a non-synchronized state. */
  42053. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  42054. tcphdr->dest, tcphdr->src);
  42055. 802e6ea: 4b4f ldr r3, [pc, #316] ; (802e828 <tcp_input+0x58c>)
  42056. tcp_ack_now(pcb);
  42057. }
  42058. /* received ACK? possibly a half-open connection */
  42059. else if (flags & TCP_ACK) {
  42060. /* send a RST to bring the other side in a non-synchronized state. */
  42061. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  42062. 802e6ec: 4a48 ldr r2, [pc, #288] ; (802e810 <tcp_input+0x574>)
  42063. tcphdr->dest, tcphdr->src);
  42064. 802e6ee: 681b ldr r3, [r3, #0]
  42065. tcp_ack_now(pcb);
  42066. }
  42067. /* received ACK? possibly a half-open connection */
  42068. else if (flags & TCP_ACK) {
  42069. /* send a RST to bring the other side in a non-synchronized state. */
  42070. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  42071. 802e6f0: 8811 ldrh r1, [r2, #0]
  42072. 802e6f2: 8858 ldrh r0, [r3, #2]
  42073. 802e6f4: 4a4a ldr r2, [pc, #296] ; (802e820 <tcp_input+0x584>)
  42074. 802e6f6: 6812 ldr r2, [r2, #0]
  42075. 802e6f8: 9000 str r0, [sp, #0]
  42076. 802e6fa: 881b ldrh r3, [r3, #0]
  42077. 802e6fc: 9301 str r3, [sp, #4]
  42078. 802e6fe: 4b47 ldr r3, [pc, #284] ; (802e81c <tcp_input+0x580>)
  42079. 802e700: 6818 ldr r0, [r3, #0]
  42080. 802e702: e03a b.n 802e77a <tcp_input+0x4de>
  42081. tcphdr->dest, tcphdr->src);
  42082. }
  42083. break;
  42084. case SYN_RCVD:
  42085. if (flags & TCP_ACK) {
  42086. 802e704: 4b44 ldr r3, [pc, #272] ; (802e818 <tcp_input+0x57c>)
  42087. 802e706: 781b ldrb r3, [r3, #0]
  42088. 802e708: f003 0210 and.w r2, r3, #16
  42089. 802e70c: b2d2 uxtb r2, r2
  42090. 802e70e: 2a00 cmp r2, #0
  42091. 802e710: d039 beq.n 802e786 <tcp_input+0x4ea>
  42092. /* expected ACK number? */
  42093. if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {
  42094. 802e712: 4b42 ldr r3, [pc, #264] ; (802e81c <tcp_input+0x580>)
  42095. 802e714: 6818 ldr r0, [r3, #0]
  42096. 802e716: 6ca3 ldr r3, [r4, #72] ; 0x48
  42097. 802e718: 43db mvns r3, r3
  42098. 802e71a: 42c3 cmn r3, r0
  42099. 802e71c: d423 bmi.n 802e766 <tcp_input+0x4ca>
  42100. 802e71e: 6d23 ldr r3, [r4, #80] ; 0x50
  42101. 802e720: 1ac3 subs r3, r0, r3
  42102. 802e722: 2b00 cmp r3, #0
  42103. 802e724: dc1f bgt.n 802e766 <tcp_input+0x4ca>
  42104. u16_t old_cwnd;
  42105. pcb->state = ESTABLISHED;
  42106. 802e726: 2304 movs r3, #4
  42107. 802e728: 7623 strb r3, [r4, #24]
  42108. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  42109. #if LWIP_CALLBACK_API
  42110. LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL);
  42111. #endif
  42112. /* Call the accept function. */
  42113. TCP_EVENT_ACCEPT(pcb, ERR_OK, err);
  42114. 802e72a: 6963 ldr r3, [r4, #20]
  42115. 802e72c: b903 cbnz r3, 802e730 <tcp_input+0x494>
  42116. 802e72e: e147 b.n 802e9c0 <tcp_input+0x724>
  42117. 802e730: 6920 ldr r0, [r4, #16]
  42118. 802e732: 4621 mov r1, r4
  42119. 802e734: 2200 movs r2, #0
  42120. 802e736: 4798 blx r3
  42121. if (err != ERR_OK) {
  42122. 802e738: b118 cbz r0, 802e742 <tcp_input+0x4a6>
  42123. /* If the accept function returns with an error, we abort
  42124. * the connection. */
  42125. /* Already aborted? */
  42126. if (err != ERR_ABRT) {
  42127. 802e73a: 300a adds r0, #10
  42128. 802e73c: f040 8140 bne.w 802e9c0 <tcp_input+0x724>
  42129. 802e740: e177 b.n 802ea32 <tcp_input+0x796>
  42130. return ERR_ABRT;
  42131. }
  42132. old_cwnd = pcb->cwnd;
  42133. /* If there was any data contained within this ACK,
  42134. * we'd better pass it on to the application as well. */
  42135. tcp_receive(pcb);
  42136. 802e742: 4620 mov r0, r4
  42137. if (err != ERR_ABRT) {
  42138. tcp_abort(pcb);
  42139. }
  42140. return ERR_ABRT;
  42141. }
  42142. old_cwnd = pcb->cwnd;
  42143. 802e744: f8b4 504c ldrh.w r5, [r4, #76] ; 0x4c
  42144. /* If there was any data contained within this ACK,
  42145. * we'd better pass it on to the application as well. */
  42146. tcp_receive(pcb);
  42147. 802e748: f7ff fb54 bl 802ddf4 <tcp_receive>
  42148. /* Prevent ACK for SYN to generate a sent event */
  42149. if (pcb->acked != 0) {
  42150. 802e74c: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  42151. 802e750: b113 cbz r3, 802e758 <tcp_input+0x4bc>
  42152. pcb->acked--;
  42153. 802e752: 3b01 subs r3, #1
  42154. 802e754: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  42155. }
  42156. pcb->cwnd = ((old_cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  42157. 802e758: 8ee3 ldrh r3, [r4, #54] ; 0x36
  42158. 802e75a: 2d01 cmp r5, #1
  42159. 802e75c: bf08 it eq
  42160. 802e75e: 005b lsleq r3, r3, #1
  42161. 802e760: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  42162. 802e764: e023 b.n 802e7ae <tcp_input+0x512>
  42163. pcb->state = CLOSE_WAIT;
  42164. }
  42165. } else {
  42166. /* incorrect ACK number, send RST */
  42167. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  42168. tcphdr->dest, tcphdr->src);
  42169. 802e766: 4b30 ldr r3, [pc, #192] ; (802e828 <tcp_input+0x58c>)
  42170. tcp_ack_now(pcb);
  42171. pcb->state = CLOSE_WAIT;
  42172. }
  42173. } else {
  42174. /* incorrect ACK number, send RST */
  42175. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  42176. 802e768: 4a29 ldr r2, [pc, #164] ; (802e810 <tcp_input+0x574>)
  42177. tcphdr->dest, tcphdr->src);
  42178. 802e76a: 681b ldr r3, [r3, #0]
  42179. tcp_ack_now(pcb);
  42180. pcb->state = CLOSE_WAIT;
  42181. }
  42182. } else {
  42183. /* incorrect ACK number, send RST */
  42184. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  42185. 802e76c: 8811 ldrh r1, [r2, #0]
  42186. 802e76e: 885d ldrh r5, [r3, #2]
  42187. 802e770: 4a2b ldr r2, [pc, #172] ; (802e820 <tcp_input+0x584>)
  42188. 802e772: 6812 ldr r2, [r2, #0]
  42189. 802e774: 9500 str r5, [sp, #0]
  42190. 802e776: 881b ldrh r3, [r3, #0]
  42191. 802e778: 9301 str r3, [sp, #4]
  42192. 802e77a: 1889 adds r1, r1, r2
  42193. 802e77c: 4b2b ldr r3, [pc, #172] ; (802e82c <tcp_input+0x590>)
  42194. 802e77e: 4a2c ldr r2, [pc, #176] ; (802e830 <tcp_input+0x594>)
  42195. 802e780: f000 fdb6 bl 802f2f0 <tcp_rst>
  42196. 802e784: e1bd b.n 802eb02 <tcp_input+0x866>
  42197. tcphdr->dest, tcphdr->src);
  42198. }
  42199. } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) {
  42200. 802e786: f003 0302 and.w r3, r3, #2
  42201. 802e78a: b2db uxtb r3, r3
  42202. 802e78c: 2b00 cmp r3, #0
  42203. 802e78e: f000 81b8 beq.w 802eb02 <tcp_input+0x866>
  42204. 802e792: 4a23 ldr r2, [pc, #140] ; (802e820 <tcp_input+0x584>)
  42205. 802e794: 6aa3 ldr r3, [r4, #40] ; 0x28
  42206. 802e796: 6812 ldr r2, [r2, #0]
  42207. 802e798: 3b01 subs r3, #1
  42208. 802e79a: 429a cmp r2, r3
  42209. 802e79c: f040 81b1 bne.w 802eb02 <tcp_input+0x866>
  42210. /* Looks like another copy of the SYN - retransmit our SYN-ACK */
  42211. tcp_rexmit(pcb);
  42212. 802e7a0: 4620 mov r0, r4
  42213. 802e7a2: f000 fe03 bl 802f3ac <tcp_rexmit>
  42214. 802e7a6: e1ac b.n 802eb02 <tcp_input+0x866>
  42215. }
  42216. break;
  42217. case CLOSE_WAIT:
  42218. /* FALLTHROUGH */
  42219. case ESTABLISHED:
  42220. tcp_receive(pcb);
  42221. 802e7a8: 4620 mov r0, r4
  42222. 802e7aa: f7ff fb23 bl 802ddf4 <tcp_receive>
  42223. if (recv_flags & TF_GOT_FIN) { /* passive close */
  42224. 802e7ae: 4b21 ldr r3, [pc, #132] ; (802e834 <tcp_input+0x598>)
  42225. 802e7b0: 781b ldrb r3, [r3, #0]
  42226. 802e7b2: f003 0320 and.w r3, r3, #32
  42227. 802e7b6: b2db uxtb r3, r3
  42228. 802e7b8: 2b00 cmp r3, #0
  42229. 802e7ba: f000 81a2 beq.w 802eb02 <tcp_input+0x866>
  42230. tcp_ack_now(pcb);
  42231. 802e7be: 7fa3 ldrb r3, [r4, #30]
  42232. 802e7c0: f043 0302 orr.w r3, r3, #2
  42233. 802e7c4: 77a3 strb r3, [r4, #30]
  42234. pcb->state = CLOSE_WAIT;
  42235. 802e7c6: 2307 movs r3, #7
  42236. 802e7c8: e053 b.n 802e872 <tcp_input+0x5d6>
  42237. }
  42238. break;
  42239. case FIN_WAIT_1:
  42240. tcp_receive(pcb);
  42241. 802e7ca: 4620 mov r0, r4
  42242. 802e7cc: f7ff fb12 bl 802ddf4 <tcp_receive>
  42243. if (recv_flags & TF_GOT_FIN) {
  42244. 802e7d0: 4b18 ldr r3, [pc, #96] ; (802e834 <tcp_input+0x598>)
  42245. 802e7d2: 781a ldrb r2, [r3, #0]
  42246. 802e7d4: 4b10 ldr r3, [pc, #64] ; (802e818 <tcp_input+0x57c>)
  42247. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  42248. 802e7d6: 781b ldrb r3, [r3, #0]
  42249. pcb->state = CLOSE_WAIT;
  42250. }
  42251. break;
  42252. case FIN_WAIT_1:
  42253. tcp_receive(pcb);
  42254. if (recv_flags & TF_GOT_FIN) {
  42255. 802e7d8: f002 0220 and.w r2, r2, #32
  42256. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  42257. 802e7dc: f003 0310 and.w r3, r3, #16
  42258. pcb->state = CLOSE_WAIT;
  42259. }
  42260. break;
  42261. case FIN_WAIT_1:
  42262. tcp_receive(pcb);
  42263. if (recv_flags & TF_GOT_FIN) {
  42264. 802e7e0: b2d2 uxtb r2, r2
  42265. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  42266. 802e7e2: b2db uxtb r3, r3
  42267. pcb->state = CLOSE_WAIT;
  42268. }
  42269. break;
  42270. case FIN_WAIT_1:
  42271. tcp_receive(pcb);
  42272. if (recv_flags & TF_GOT_FIN) {
  42273. 802e7e4: 2a00 cmp r2, #0
  42274. 802e7e6: d03a beq.n 802e85e <tcp_input+0x5c2>
  42275. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  42276. 802e7e8: 2b00 cmp r3, #0
  42277. 802e7ea: d032 beq.n 802e852 <tcp_input+0x5b6>
  42278. 802e7ec: 4b0b ldr r3, [pc, #44] ; (802e81c <tcp_input+0x580>)
  42279. 802e7ee: 681a ldr r2, [r3, #0]
  42280. 802e7f0: 6d23 ldr r3, [r4, #80] ; 0x50
  42281. 802e7f2: 429a cmp r2, r3
  42282. 802e7f4: d12d bne.n 802e852 <tcp_input+0x5b6>
  42283. LWIP_DEBUGF(TCP_DEBUG,
  42284. ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  42285. tcp_ack_now(pcb);
  42286. 802e7f6: 7fa3 ldrb r3, [r4, #30]
  42287. 802e7f8: f043 0302 orr.w r3, r3, #2
  42288. 802e7fc: 77a3 strb r3, [r4, #30]
  42289. tcp_pcb_purge(pcb);
  42290. 802e7fe: 4620 mov r0, r4
  42291. 802e800: f7fe feea bl 802d5d8 <tcp_pcb_purge>
  42292. TCP_RMV_ACTIVE(pcb);
  42293. 802e804: 4a0c ldr r2, [pc, #48] ; (802e838 <tcp_input+0x59c>)
  42294. 802e806: 6813 ldr r3, [r2, #0]
  42295. 802e808: 42a3 cmp r3, r4
  42296. 802e80a: d117 bne.n 802e83c <tcp_input+0x5a0>
  42297. 802e80c: e06d b.n 802e8ea <tcp_input+0x64e>
  42298. 802e80e: bf00 nop
  42299. 802e810: 2000e0f8 .word 0x2000e0f8
  42300. 802e814: 20010ff4 .word 0x20010ff4
  42301. 802e818: 2000e100 .word 0x2000e100
  42302. 802e81c: 2000e0fc .word 0x2000e0fc
  42303. 802e820: 2000e0f4 .word 0x2000e0f4
  42304. 802e824: 20010fe0 .word 0x20010fe0
  42305. 802e828: 2000e0f0 .word 0x2000e0f0
  42306. 802e82c: 20010ffc .word 0x20010ffc
  42307. 802e830: 20011004 .word 0x20011004
  42308. 802e834: 2000e101 .word 0x2000e101
  42309. 802e838: 20010fdc .word 0x20010fdc
  42310. 802e83c: 4a8e ldr r2, [pc, #568] ; (802ea78 <tcp_input+0x7dc>)
  42311. 802e83e: 6013 str r3, [r2, #0]
  42312. 802e840: e004 b.n 802e84c <tcp_input+0x5b0>
  42313. 802e842: 68d9 ldr r1, [r3, #12]
  42314. 802e844: 42a1 cmp r1, r4
  42315. 802e846: d100 bne.n 802e84a <tcp_input+0x5ae>
  42316. 802e848: e057 b.n 802e8fa <tcp_input+0x65e>
  42317. 802e84a: 460b mov r3, r1
  42318. 802e84c: 2b00 cmp r3, #0
  42319. 802e84e: d1f8 bne.n 802e842 <tcp_input+0x5a6>
  42320. 802e850: e05a b.n 802e908 <tcp_input+0x66c>
  42321. pcb->state = TIME_WAIT;
  42322. TCP_REG(&tcp_tw_pcbs, pcb);
  42323. } else {
  42324. tcp_ack_now(pcb);
  42325. 802e852: 7fa3 ldrb r3, [r4, #30]
  42326. 802e854: f043 0302 orr.w r3, r3, #2
  42327. 802e858: 77a3 strb r3, [r4, #30]
  42328. pcb->state = CLOSING;
  42329. 802e85a: 2308 movs r3, #8
  42330. 802e85c: e009 b.n 802e872 <tcp_input+0x5d6>
  42331. }
  42332. } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  42333. 802e85e: 2b00 cmp r3, #0
  42334. 802e860: f000 814f beq.w 802eb02 <tcp_input+0x866>
  42335. 802e864: 4b85 ldr r3, [pc, #532] ; (802ea7c <tcp_input+0x7e0>)
  42336. 802e866: 681a ldr r2, [r3, #0]
  42337. 802e868: 6d23 ldr r3, [r4, #80] ; 0x50
  42338. 802e86a: 429a cmp r2, r3
  42339. 802e86c: f040 8149 bne.w 802eb02 <tcp_input+0x866>
  42340. pcb->state = FIN_WAIT_2;
  42341. 802e870: 2306 movs r3, #6
  42342. 802e872: 7623 strb r3, [r4, #24]
  42343. 802e874: e145 b.n 802eb02 <tcp_input+0x866>
  42344. }
  42345. break;
  42346. case FIN_WAIT_2:
  42347. tcp_receive(pcb);
  42348. 802e876: 4620 mov r0, r4
  42349. 802e878: f7ff fabc bl 802ddf4 <tcp_receive>
  42350. if (recv_flags & TF_GOT_FIN) {
  42351. 802e87c: 4b80 ldr r3, [pc, #512] ; (802ea80 <tcp_input+0x7e4>)
  42352. 802e87e: 781b ldrb r3, [r3, #0]
  42353. 802e880: f003 0320 and.w r3, r3, #32
  42354. 802e884: b2db uxtb r3, r3
  42355. 802e886: 2b00 cmp r3, #0
  42356. 802e888: f000 813b beq.w 802eb02 <tcp_input+0x866>
  42357. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  42358. tcp_ack_now(pcb);
  42359. 802e88c: 7fa3 ldrb r3, [r4, #30]
  42360. 802e88e: f043 0302 orr.w r3, r3, #2
  42361. 802e892: 77a3 strb r3, [r4, #30]
  42362. tcp_pcb_purge(pcb);
  42363. 802e894: 4620 mov r0, r4
  42364. 802e896: f7fe fe9f bl 802d5d8 <tcp_pcb_purge>
  42365. TCP_RMV_ACTIVE(pcb);
  42366. 802e89a: 4a7a ldr r2, [pc, #488] ; (802ea84 <tcp_input+0x7e8>)
  42367. 802e89c: 6813 ldr r3, [r2, #0]
  42368. 802e89e: 42a3 cmp r3, r4
  42369. 802e8a0: d100 bne.n 802e8a4 <tcp_input+0x608>
  42370. 802e8a2: e022 b.n 802e8ea <tcp_input+0x64e>
  42371. 802e8a4: 4a74 ldr r2, [pc, #464] ; (802ea78 <tcp_input+0x7dc>)
  42372. 802e8a6: 6013 str r3, [r2, #0]
  42373. 802e8a8: e004 b.n 802e8b4 <tcp_input+0x618>
  42374. 802e8aa: 68d9 ldr r1, [r3, #12]
  42375. 802e8ac: 42a1 cmp r1, r4
  42376. 802e8ae: d100 bne.n 802e8b2 <tcp_input+0x616>
  42377. 802e8b0: e023 b.n 802e8fa <tcp_input+0x65e>
  42378. 802e8b2: 460b mov r3, r1
  42379. 802e8b4: 2b00 cmp r3, #0
  42380. 802e8b6: d1f8 bne.n 802e8aa <tcp_input+0x60e>
  42381. 802e8b8: e026 b.n 802e908 <tcp_input+0x66c>
  42382. pcb->state = TIME_WAIT;
  42383. TCP_REG(&tcp_tw_pcbs, pcb);
  42384. }
  42385. break;
  42386. case CLOSING:
  42387. tcp_receive(pcb);
  42388. 802e8ba: 4620 mov r0, r4
  42389. 802e8bc: f7ff fa9a bl 802ddf4 <tcp_receive>
  42390. if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
  42391. 802e8c0: 4b71 ldr r3, [pc, #452] ; (802ea88 <tcp_input+0x7ec>)
  42392. 802e8c2: 781b ldrb r3, [r3, #0]
  42393. 802e8c4: f003 0310 and.w r3, r3, #16
  42394. 802e8c8: b2db uxtb r3, r3
  42395. 802e8ca: 2b00 cmp r3, #0
  42396. 802e8cc: f000 8119 beq.w 802eb02 <tcp_input+0x866>
  42397. 802e8d0: 4b6a ldr r3, [pc, #424] ; (802ea7c <tcp_input+0x7e0>)
  42398. 802e8d2: 681a ldr r2, [r3, #0]
  42399. 802e8d4: 6d23 ldr r3, [r4, #80] ; 0x50
  42400. 802e8d6: 429a cmp r2, r3
  42401. 802e8d8: f040 8113 bne.w 802eb02 <tcp_input+0x866>
  42402. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  42403. tcp_pcb_purge(pcb);
  42404. 802e8dc: 4620 mov r0, r4
  42405. 802e8de: f7fe fe7b bl 802d5d8 <tcp_pcb_purge>
  42406. TCP_RMV_ACTIVE(pcb);
  42407. 802e8e2: 4a68 ldr r2, [pc, #416] ; (802ea84 <tcp_input+0x7e8>)
  42408. 802e8e4: 6813 ldr r3, [r2, #0]
  42409. 802e8e6: 42a3 cmp r3, r4
  42410. 802e8e8: d101 bne.n 802e8ee <tcp_input+0x652>
  42411. 802e8ea: 68e3 ldr r3, [r4, #12]
  42412. 802e8ec: e00c b.n 802e908 <tcp_input+0x66c>
  42413. 802e8ee: 4a62 ldr r2, [pc, #392] ; (802ea78 <tcp_input+0x7dc>)
  42414. 802e8f0: 6013 str r3, [r2, #0]
  42415. 802e8f2: e007 b.n 802e904 <tcp_input+0x668>
  42416. 802e8f4: 68d9 ldr r1, [r3, #12]
  42417. 802e8f6: 42a1 cmp r1, r4
  42418. 802e8f8: d103 bne.n 802e902 <tcp_input+0x666>
  42419. 802e8fa: 6013 str r3, [r2, #0]
  42420. 802e8fc: 68e2 ldr r2, [r4, #12]
  42421. 802e8fe: 60da str r2, [r3, #12]
  42422. 802e900: e003 b.n 802e90a <tcp_input+0x66e>
  42423. 802e902: 460b mov r3, r1
  42424. 802e904: 2b00 cmp r3, #0
  42425. 802e906: d1f5 bne.n 802e8f4 <tcp_input+0x658>
  42426. 802e908: 6013 str r3, [r2, #0]
  42427. 802e90a: 4b60 ldr r3, [pc, #384] ; (802ea8c <tcp_input+0x7f0>)
  42428. 802e90c: 2201 movs r2, #1
  42429. 802e90e: 701a strb r2, [r3, #0]
  42430. pcb->state = TIME_WAIT;
  42431. 802e910: 230a movs r3, #10
  42432. 802e912: 7623 strb r3, [r4, #24]
  42433. TCP_REG(&tcp_tw_pcbs, pcb);
  42434. 802e914: 4b5e ldr r3, [pc, #376] ; (802ea90 <tcp_input+0x7f4>)
  42435. 802e916: 681a ldr r2, [r3, #0]
  42436. 802e918: 601c str r4, [r3, #0]
  42437. 802e91a: 60e2 str r2, [r4, #12]
  42438. 802e91c: f000 fe82 bl 802f624 <tcp_timer_needed>
  42439. 802e920: e0ef b.n 802eb02 <tcp_input+0x866>
  42440. }
  42441. break;
  42442. case LAST_ACK:
  42443. tcp_receive(pcb);
  42444. 802e922: 4620 mov r0, r4
  42445. 802e924: f7ff fa66 bl 802ddf4 <tcp_receive>
  42446. if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
  42447. 802e928: 4b57 ldr r3, [pc, #348] ; (802ea88 <tcp_input+0x7ec>)
  42448. 802e92a: 781b ldrb r3, [r3, #0]
  42449. 802e92c: f003 0310 and.w r3, r3, #16
  42450. 802e930: b2db uxtb r3, r3
  42451. 802e932: 2b00 cmp r3, #0
  42452. 802e934: f000 80e5 beq.w 802eb02 <tcp_input+0x866>
  42453. 802e938: 4b50 ldr r3, [pc, #320] ; (802ea7c <tcp_input+0x7e0>)
  42454. 802e93a: 681a ldr r2, [r3, #0]
  42455. 802e93c: 6d23 ldr r3, [r4, #80] ; 0x50
  42456. 802e93e: 429a cmp r2, r3
  42457. 802e940: f040 80df bne.w 802eb02 <tcp_input+0x866>
  42458. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  42459. /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */
  42460. recv_flags |= TF_CLOSED;
  42461. 802e944: 4b4e ldr r3, [pc, #312] ; (802ea80 <tcp_input+0x7e4>)
  42462. 802e946: 781a ldrb r2, [r3, #0]
  42463. 802e948: f042 0210 orr.w r2, r2, #16
  42464. 802e94c: 701a strb r2, [r3, #0]
  42465. 802e94e: e0d8 b.n 802eb02 <tcp_input+0x866>
  42466. if (recv_flags & TF_RESET) {
  42467. /* TF_RESET means that the connection was reset by the other
  42468. end. We then call the error callback to inform the
  42469. application that the connection is dead before we
  42470. deallocate the PCB. */
  42471. TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_RST);
  42472. 802e950: f8d4 3088 ldr.w r3, [r4, #136] ; 0x88
  42473. 802e954: b19b cbz r3, 802e97e <tcp_input+0x6e2>
  42474. 802e956: 6920 ldr r0, [r4, #16]
  42475. 802e958: f06f 010a mvn.w r1, #10
  42476. 802e95c: e00e b.n 802e97c <tcp_input+0x6e0>
  42477. tcp_pcb_remove(&tcp_active_pcbs, pcb);
  42478. memp_free(MEMP_TCP_PCB, pcb);
  42479. } else if (recv_flags & TF_CLOSED) {
  42480. 802e95e: f003 0310 and.w r3, r3, #16
  42481. 802e962: b2db uxtb r3, r3
  42482. 802e964: b1a3 cbz r3, 802e990 <tcp_input+0x6f4>
  42483. /* The connection has been closed and we will deallocate the
  42484. PCB. */
  42485. if (!(pcb->flags & TF_RXCLOSED)) {
  42486. 802e966: 7fa3 ldrb r3, [r4, #30]
  42487. 802e968: f003 0310 and.w r3, r3, #16
  42488. 802e96c: b2db uxtb r3, r3
  42489. 802e96e: b933 cbnz r3, 802e97e <tcp_input+0x6e2>
  42490. /* Connection closed although the application has only shut down the
  42491. tx side: call the PCB's err callback and indicate the closure to
  42492. ensure the application doesn't continue using the PCB. */
  42493. TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_CLSD);
  42494. 802e970: f8d4 3088 ldr.w r3, [r4, #136] ; 0x88
  42495. 802e974: b11b cbz r3, 802e97e <tcp_input+0x6e2>
  42496. 802e976: 6920 ldr r0, [r4, #16]
  42497. 802e978: f06f 010b mvn.w r1, #11
  42498. 802e97c: 4798 blx r3
  42499. }
  42500. tcp_pcb_remove(&tcp_active_pcbs, pcb);
  42501. 802e97e: 4621 mov r1, r4
  42502. 802e980: 4840 ldr r0, [pc, #256] ; (802ea84 <tcp_input+0x7e8>)
  42503. 802e982: f7fe ff91 bl 802d8a8 <tcp_pcb_remove>
  42504. memp_free(MEMP_TCP_PCB, pcb);
  42505. 802e986: 2002 movs r0, #2
  42506. 802e988: 4621 mov r1, r4
  42507. 802e98a: f7fe fa47 bl 802ce1c <memp_free>
  42508. 802e98e: e050 b.n 802ea32 <tcp_input+0x796>
  42509. } else {
  42510. err = ERR_OK;
  42511. /* If the application has registered a "sent" function to be
  42512. called when new send buffer space is available, we call it
  42513. now. */
  42514. if (pcb->acked > 0) {
  42515. 802e990: f8b4 2064 ldrh.w r2, [r4, #100] ; 0x64
  42516. 802e994: b91a cbnz r2, 802e99e <tcp_input+0x702>
  42517. if (err == ERR_ABRT) {
  42518. goto aborted;
  42519. }
  42520. }
  42521. if (recv_data != NULL) {
  42522. 802e996: 4b3f ldr r3, [pc, #252] ; (802ea94 <tcp_input+0x7f8>)
  42523. 802e998: 681a ldr r2, [r3, #0]
  42524. 802e99a: b94a cbnz r2, 802e9b0 <tcp_input+0x714>
  42525. 802e99c: e026 b.n 802e9ec <tcp_input+0x750>
  42526. err = ERR_OK;
  42527. /* If the application has registered a "sent" function to be
  42528. called when new send buffer space is available, we call it
  42529. now. */
  42530. if (pcb->acked > 0) {
  42531. TCP_EVENT_SENT(pcb, pcb->acked, err);
  42532. 802e99e: 6fa3 ldr r3, [r4, #120] ; 0x78
  42533. 802e9a0: 2b00 cmp r3, #0
  42534. 802e9a2: d0f8 beq.n 802e996 <tcp_input+0x6fa>
  42535. 802e9a4: 6920 ldr r0, [r4, #16]
  42536. 802e9a6: 4621 mov r1, r4
  42537. 802e9a8: 4798 blx r3
  42538. if (err == ERR_ABRT) {
  42539. 802e9aa: 300a adds r0, #10
  42540. 802e9ac: d1f3 bne.n 802e996 <tcp_input+0x6fa>
  42541. 802e9ae: e040 b.n 802ea32 <tcp_input+0x796>
  42542. }
  42543. }
  42544. if (recv_data != NULL) {
  42545. LWIP_ASSERT("pcb->refused_data == NULL", pcb->refused_data == NULL);
  42546. if (pcb->flags & TF_RXCLOSED) {
  42547. 802e9b0: 7fa3 ldrb r3, [r4, #30]
  42548. 802e9b2: f003 0310 and.w r3, r3, #16
  42549. 802e9b6: b2db uxtb r3, r3
  42550. 802e9b8: b133 cbz r3, 802e9c8 <tcp_input+0x72c>
  42551. /* received data although already closed -> abort (send RST) to
  42552. notify the remote host that not all data has been processed */
  42553. pbuf_free(recv_data);
  42554. 802e9ba: 4610 mov r0, r2
  42555. 802e9bc: f7fe fb38 bl 802d030 <pbuf_free>
  42556. tcp_abort(pcb);
  42557. 802e9c0: 4620 mov r0, r4
  42558. 802e9c2: f7fe ffe5 bl 802d990 <tcp_abort>
  42559. goto aborted;
  42560. 802e9c6: e034 b.n 802ea32 <tcp_input+0x796>
  42561. }
  42562. /* Notify application that data has been received. */
  42563. TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);
  42564. 802e9c8: 6fe5 ldr r5, [r4, #124] ; 0x7c
  42565. 802e9ca: b11d cbz r5, 802e9d4 <tcp_input+0x738>
  42566. 802e9cc: 6920 ldr r0, [r4, #16]
  42567. 802e9ce: 4621 mov r1, r4
  42568. 802e9d0: 47a8 blx r5
  42569. 802e9d2: e004 b.n 802e9de <tcp_input+0x742>
  42570. 802e9d4: 4628 mov r0, r5
  42571. 802e9d6: 4621 mov r1, r4
  42572. 802e9d8: 462b mov r3, r5
  42573. 802e9da: f7ff f895 bl 802db08 <tcp_recv_null>
  42574. if (err == ERR_ABRT) {
  42575. 802e9de: b243 sxtb r3, r0
  42576. 802e9e0: 330a adds r3, #10
  42577. 802e9e2: d026 beq.n 802ea32 <tcp_input+0x796>
  42578. goto aborted;
  42579. }
  42580. /* If the upper layer can't receive this data, store it */
  42581. if (err != ERR_OK) {
  42582. 802e9e4: b110 cbz r0, 802e9ec <tcp_input+0x750>
  42583. pcb->refused_data = recv_data;
  42584. 802e9e6: 4b2b ldr r3, [pc, #172] ; (802ea94 <tcp_input+0x7f8>)
  42585. 802e9e8: 681b ldr r3, [r3, #0]
  42586. 802e9ea: 6763 str r3, [r4, #116] ; 0x74
  42587. }
  42588. }
  42589. /* If a FIN segment was received, we call the callback
  42590. function with a NULL buffer to indicate EOF. */
  42591. if (recv_flags & TF_GOT_FIN) {
  42592. 802e9ec: 4b24 ldr r3, [pc, #144] ; (802ea80 <tcp_input+0x7e4>)
  42593. 802e9ee: 781b ldrb r3, [r3, #0]
  42594. 802e9f0: f003 0320 and.w r3, r3, #32
  42595. 802e9f4: b2db uxtb r3, r3
  42596. 802e9f6: b1b3 cbz r3, 802ea26 <tcp_input+0x78a>
  42597. if (pcb->refused_data != NULL) {
  42598. 802e9f8: 6f63 ldr r3, [r4, #116] ; 0x74
  42599. 802e9fa: b123 cbz r3, 802ea06 <tcp_input+0x76a>
  42600. /* Delay this if we have refused data. */
  42601. pcb->refused_data->flags |= PBUF_FLAG_TCP_FIN;
  42602. 802e9fc: 7b5a ldrb r2, [r3, #13]
  42603. 802e9fe: f042 0220 orr.w r2, r2, #32
  42604. 802ea02: 735a strb r2, [r3, #13]
  42605. 802ea04: e00f b.n 802ea26 <tcp_input+0x78a>
  42606. } else {
  42607. /* correct rcv_wnd as the application won't call tcp_recved()
  42608. for the FIN's seqno */
  42609. if (pcb->rcv_wnd != TCP_WND) {
  42610. 802ea06: 8da3 ldrh r3, [r4, #44] ; 0x2c
  42611. 802ea08: f241 62d0 movw r2, #5840 ; 0x16d0
  42612. 802ea0c: 4293 cmp r3, r2
  42613. 802ea0e: d001 beq.n 802ea14 <tcp_input+0x778>
  42614. pcb->rcv_wnd++;
  42615. 802ea10: 3301 adds r3, #1
  42616. 802ea12: 85a3 strh r3, [r4, #44] ; 0x2c
  42617. }
  42618. TCP_EVENT_CLOSED(pcb, err);
  42619. 802ea14: 6fe5 ldr r5, [r4, #124] ; 0x7c
  42620. 802ea16: b135 cbz r5, 802ea26 <tcp_input+0x78a>
  42621. 802ea18: 2200 movs r2, #0
  42622. 802ea1a: 6920 ldr r0, [r4, #16]
  42623. 802ea1c: 4621 mov r1, r4
  42624. 802ea1e: 4613 mov r3, r2
  42625. 802ea20: 47a8 blx r5
  42626. if (err == ERR_ABRT) {
  42627. 802ea22: 300a adds r0, #10
  42628. 802ea24: d005 beq.n 802ea32 <tcp_input+0x796>
  42629. goto aborted;
  42630. }
  42631. }
  42632. }
  42633. tcp_input_pcb = NULL;
  42634. 802ea26: 4b1c ldr r3, [pc, #112] ; (802ea98 <tcp_input+0x7fc>)
  42635. 802ea28: 2200 movs r2, #0
  42636. /* Try to send something out. */
  42637. tcp_output(pcb);
  42638. 802ea2a: 4620 mov r0, r4
  42639. goto aborted;
  42640. }
  42641. }
  42642. }
  42643. tcp_input_pcb = NULL;
  42644. 802ea2c: 601a str r2, [r3, #0]
  42645. /* Try to send something out. */
  42646. tcp_output(pcb);
  42647. 802ea2e: f000 fb3b bl 802f0a8 <tcp_output>
  42648. }
  42649. }
  42650. /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
  42651. Below this line, 'pcb' may not be dereferenced! */
  42652. aborted:
  42653. tcp_input_pcb = NULL;
  42654. 802ea32: 4b19 ldr r3, [pc, #100] ; (802ea98 <tcp_input+0x7fc>)
  42655. recv_data = NULL;
  42656. /* give up our reference to inseg.p */
  42657. if (inseg.p != NULL)
  42658. 802ea34: 4d19 ldr r5, [pc, #100] ; (802ea9c <tcp_input+0x800>)
  42659. }
  42660. }
  42661. /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
  42662. Below this line, 'pcb' may not be dereferenced! */
  42663. aborted:
  42664. tcp_input_pcb = NULL;
  42665. 802ea36: 2400 movs r4, #0
  42666. 802ea38: 601c str r4, [r3, #0]
  42667. recv_data = NULL;
  42668. /* give up our reference to inseg.p */
  42669. if (inseg.p != NULL)
  42670. 802ea3a: 6868 ldr r0, [r5, #4]
  42671. }
  42672. /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
  42673. Below this line, 'pcb' may not be dereferenced! */
  42674. aborted:
  42675. tcp_input_pcb = NULL;
  42676. recv_data = NULL;
  42677. 802ea3c: 4b15 ldr r3, [pc, #84] ; (802ea94 <tcp_input+0x7f8>)
  42678. 802ea3e: 601c str r4, [r3, #0]
  42679. /* give up our reference to inseg.p */
  42680. if (inseg.p != NULL)
  42681. 802ea40: 2800 cmp r0, #0
  42682. 802ea42: d067 beq.n 802eb14 <tcp_input+0x878>
  42683. {
  42684. pbuf_free(inseg.p);
  42685. 802ea44: f7fe faf4 bl 802d030 <pbuf_free>
  42686. inseg.p = NULL;
  42687. 802ea48: 606c str r4, [r5, #4]
  42688. 802ea4a: e063 b.n 802eb14 <tcp_input+0x878>
  42689. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  42690. TCP_STATS_INC(tcp.proterr);
  42691. TCP_STATS_INC(tcp.drop);
  42692. tcp_rst(ackno, seqno + tcplen,
  42693. ip_current_dest_addr(), ip_current_src_addr(),
  42694. tcphdr->dest, tcphdr->src);
  42695. 802ea4c: 4b14 ldr r3, [pc, #80] ; (802eaa0 <tcp_input+0x804>)
  42696. sender. */
  42697. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
  42698. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  42699. TCP_STATS_INC(tcp.proterr);
  42700. TCP_STATS_INC(tcp.drop);
  42701. tcp_rst(ackno, seqno + tcplen,
  42702. 802ea4e: 4a15 ldr r2, [pc, #84] ; (802eaa4 <tcp_input+0x808>)
  42703. ip_current_dest_addr(), ip_current_src_addr(),
  42704. tcphdr->dest, tcphdr->src);
  42705. 802ea50: 681b ldr r3, [r3, #0]
  42706. sender. */
  42707. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
  42708. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  42709. TCP_STATS_INC(tcp.proterr);
  42710. TCP_STATS_INC(tcp.drop);
  42711. tcp_rst(ackno, seqno + tcplen,
  42712. 802ea52: 8811 ldrh r1, [r2, #0]
  42713. 802ea54: 8858 ldrh r0, [r3, #2]
  42714. 802ea56: 4a14 ldr r2, [pc, #80] ; (802eaa8 <tcp_input+0x80c>)
  42715. 802ea58: 6812 ldr r2, [r2, #0]
  42716. 802ea5a: 9000 str r0, [sp, #0]
  42717. 802ea5c: 881b ldrh r3, [r3, #0]
  42718. 802ea5e: 9301 str r3, [sp, #4]
  42719. 802ea60: 4b06 ldr r3, [pc, #24] ; (802ea7c <tcp_input+0x7e0>)
  42720. 802ea62: 1889 adds r1, r1, r2
  42721. 802ea64: 6818 ldr r0, [r3, #0]
  42722. 802ea66: e517 b.n 802e498 <tcp_input+0x1fc>
  42723. LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
  42724. PERF_STOP("tcp_input");
  42725. return;
  42726. dropped:
  42727. TCP_STATS_INC(tcp.drop);
  42728. snmp_inc_tcpinerrs();
  42729. 802ea68: f003 f8d2 bl 8031c10 <snmp_inc_tcpinerrs>
  42730. pbuf_free(p);
  42731. 802ea6c: 4630 mov r0, r6
  42732. }
  42733. 802ea6e: b003 add sp, #12
  42734. 802ea70: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  42735. PERF_STOP("tcp_input");
  42736. return;
  42737. dropped:
  42738. TCP_STATS_INC(tcp.drop);
  42739. snmp_inc_tcpinerrs();
  42740. pbuf_free(p);
  42741. 802ea74: f7fe badc b.w 802d030 <pbuf_free>
  42742. 802ea78: 20010fe8 .word 0x20010fe8
  42743. 802ea7c: 2000e0fc .word 0x2000e0fc
  42744. 802ea80: 2000e101 .word 0x2000e101
  42745. 802ea84: 20010fdc .word 0x20010fdc
  42746. 802ea88: 2000e100 .word 0x2000e100
  42747. 802ea8c: 20010fd8 .word 0x20010fd8
  42748. 802ea90: 20010ff0 .word 0x20010ff0
  42749. 802ea94: 2000e104 .word 0x2000e104
  42750. 802ea98: 20010ff4 .word 0x20010ff4
  42751. 802ea9c: 2000e10c .word 0x2000e10c
  42752. 802eaa0: 2000e0f0 .word 0x2000e0f0
  42753. 802eaa4: 2000e0f8 .word 0x2000e0f8
  42754. 802eaa8: 2000e0f4 .word 0x2000e0f4
  42755. }
  42756. if (pcb == NULL) {
  42757. /* If it did not go to an active connection, we check the connections
  42758. in the TIME-WAIT state. */
  42759. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  42760. 802eaac: 4b1b ldr r3, [pc, #108] ; (802eb1c <tcp_input+0x880>)
  42761. 802eaae: 681b ldr r3, [r3, #0]
  42762. 802eab0: e4bf b.n 802e432 <tcp_input+0x196>
  42763. tcp_debug_print_state(pcb->state);
  42764. #endif /* TCP_DEBUG */
  42765. #endif /* TCP_INPUT_DEBUG */
  42766. /* Set up a tcp_seg structure. */
  42767. inseg.next = NULL;
  42768. 802eab2: 4b1b ldr r3, [pc, #108] ; (802eb20 <tcp_input+0x884>)
  42769. 802eab4: 2100 movs r1, #0
  42770. 802eab6: 6019 str r1, [r3, #0]
  42771. inseg.len = p->tot_len;
  42772. 802eab8: f8a3 8008 strh.w r8, [r3, #8]
  42773. inseg.p = p;
  42774. 802eabc: 605e str r6, [r3, #4]
  42775. inseg.tcphdr = tcphdr;
  42776. 802eabe: 60df str r7, [r3, #12]
  42777. recv_data = NULL;
  42778. 802eac0: 4b18 ldr r3, [pc, #96] ; (802eb24 <tcp_input+0x888>)
  42779. recv_flags = 0;
  42780. if (flags & TCP_PSH) {
  42781. 802eac2: f002 0208 and.w r2, r2, #8
  42782. inseg.next = NULL;
  42783. inseg.len = p->tot_len;
  42784. inseg.p = p;
  42785. inseg.tcphdr = tcphdr;
  42786. recv_data = NULL;
  42787. 802eac6: 6019 str r1, [r3, #0]
  42788. recv_flags = 0;
  42789. 802eac8: 4b17 ldr r3, [pc, #92] ; (802eb28 <tcp_input+0x88c>)
  42790. if (flags & TCP_PSH) {
  42791. 802eaca: b2d2 uxtb r2, r2
  42792. inseg.len = p->tot_len;
  42793. inseg.p = p;
  42794. inseg.tcphdr = tcphdr;
  42795. recv_data = NULL;
  42796. recv_flags = 0;
  42797. 802eacc: 7019 strb r1, [r3, #0]
  42798. if (flags & TCP_PSH) {
  42799. 802eace: 2a00 cmp r2, #0
  42800. 802ead0: f47f ad52 bne.w 802e578 <tcp_input+0x2dc>
  42801. 802ead4: e554 b.n 802e580 <tcp_input+0x2e4>
  42802. #endif /* SO_REUSE */
  42803. if (lpcb != NULL) {
  42804. /* Move this PCB to the front of the list so that subsequent
  42805. lookups will be faster (we exploit locality in TCP segment
  42806. arrivals). */
  42807. if (prev != NULL) {
  42808. 802ead6: 2b00 cmp r3, #0
  42809. 802ead8: f47f acc4 bne.w 802e464 <tcp_input+0x1c8>
  42810. 802eadc: e4c7 b.n 802e46e <tcp_input+0x1d2>
  42811. } else {
  42812. /* If no matching PCB was found, send a TCP RST (reset) to the
  42813. sender. */
  42814. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
  42815. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  42816. 802eade: 89b8 ldrh r0, [r7, #12]
  42817. 802eae0: f7fd f96d bl 802bdbe <lwip_ntohs>
  42818. 802eae4: f000 0004 and.w r0, r0, #4
  42819. 802eae8: b280 uxth r0, r0
  42820. 802eaea: 2800 cmp r0, #0
  42821. 802eaec: d1be bne.n 802ea6c <tcp_input+0x7d0>
  42822. 802eaee: e7ad b.n 802ea4c <tcp_input+0x7b0>
  42823. }
  42824. if (acceptable) {
  42825. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n"));
  42826. LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED);
  42827. recv_flags |= TF_RESET;
  42828. 802eaf0: 4b0d ldr r3, [pc, #52] ; (802eb28 <tcp_input+0x88c>)
  42829. 802eaf2: 781a ldrb r2, [r3, #0]
  42830. 802eaf4: f042 0208 orr.w r2, r2, #8
  42831. 802eaf8: 701a strb r2, [r3, #0]
  42832. pcb->flags &= ~TF_ACK_DELAY;
  42833. 802eafa: 7fa3 ldrb r3, [r4, #30]
  42834. 802eafc: f023 0301 bic.w r3, r3, #1
  42835. 802eb00: 77a3 strb r3, [r4, #30]
  42836. tcp_input_pcb = pcb;
  42837. err = tcp_process(pcb);
  42838. /* A return value of ERR_ABRT means that tcp_abort() was called
  42839. and that the pcb has been freed. If so, we don't do anything. */
  42840. if (err != ERR_ABRT) {
  42841. if (recv_flags & TF_RESET) {
  42842. 802eb02: 4b09 ldr r3, [pc, #36] ; (802eb28 <tcp_input+0x88c>)
  42843. 802eb04: 781b ldrb r3, [r3, #0]
  42844. 802eb06: f003 0208 and.w r2, r3, #8
  42845. 802eb0a: b2d2 uxtb r2, r2
  42846. 802eb0c: 2a00 cmp r2, #0
  42847. 802eb0e: f47f af1f bne.w 802e950 <tcp_input+0x6b4>
  42848. 802eb12: e724 b.n 802e95e <tcp_input+0x6c2>
  42849. return;
  42850. dropped:
  42851. TCP_STATS_INC(tcp.drop);
  42852. snmp_inc_tcpinerrs();
  42853. pbuf_free(p);
  42854. }
  42855. 802eb14: b003 add sp, #12
  42856. 802eb16: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  42857. 802eb1a: bf00 nop
  42858. 802eb1c: 20010ff0 .word 0x20010ff0
  42859. 802eb20: 2000e10c .word 0x2000e10c
  42860. 802eb24: 2000e104 .word 0x2000e104
  42861. 802eb28: 2000e101 .word 0x2000e101
  42862. 0802eb2c <tcp_pbuf_prealloc>:
  42863. #if TCP_OVERSIZE
  42864. static struct pbuf *
  42865. tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,
  42866. u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags,
  42867. u8_t first_seg)
  42868. {
  42869. 802eb2c: b570 push {r4, r5, r6, lr}
  42870. LWIP_UNUSED_ARG(apiflags);
  42871. LWIP_UNUSED_ARG(first_seg);
  42872. /* always create MSS-sized pbufs */
  42873. alloc = max_length;
  42874. #else /* LWIP_NETIF_TX_SINGLE_PBUF */
  42875. if (length < max_length) {
  42876. 802eb2e: 4291 cmp r1, r2
  42877. #if TCP_OVERSIZE
  42878. static struct pbuf *
  42879. tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,
  42880. u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags,
  42881. u8_t first_seg)
  42882. {
  42883. 802eb30: 460c mov r4, r1
  42884. 802eb32: 461e mov r6, r3
  42885. 802eb34: 9d04 ldr r5, [sp, #16]
  42886. LWIP_UNUSED_ARG(apiflags);
  42887. LWIP_UNUSED_ARG(first_seg);
  42888. /* always create MSS-sized pbufs */
  42889. alloc = max_length;
  42890. #else /* LWIP_NETIF_TX_SINGLE_PBUF */
  42891. if (length < max_length) {
  42892. 802eb36: d21a bcs.n 802eb6e <tcp_pbuf_prealloc+0x42>
  42893. *
  42894. * Did the user set TCP_WRITE_FLAG_MORE?
  42895. *
  42896. * Will the Nagle algorithm defer transmission of this segment?
  42897. */
  42898. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  42899. 802eb38: f89d 3014 ldrb.w r3, [sp, #20]
  42900. 802eb3c: f003 0302 and.w r3, r3, #2
  42901. 802eb40: b2db uxtb r3, r3
  42902. 802eb42: b95b cbnz r3, 802eb5c <tcp_pbuf_prealloc+0x30>
  42903. (!(pcb->flags & TF_NODELAY) &&
  42904. 802eb44: 7fab ldrb r3, [r5, #30]
  42905. *
  42906. * Did the user set TCP_WRITE_FLAG_MORE?
  42907. *
  42908. * Will the Nagle algorithm defer transmission of this segment?
  42909. */
  42910. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  42911. 802eb46: f003 0340 and.w r3, r3, #64 ; 0x40
  42912. 802eb4a: b2db uxtb r3, r3
  42913. 802eb4c: b97b cbnz r3, 802eb6e <tcp_pbuf_prealloc+0x42>
  42914. (!(pcb->flags & TF_NODELAY) &&
  42915. 802eb4e: f89d 3018 ldrb.w r3, [sp, #24]
  42916. 802eb52: b11b cbz r3, 802eb5c <tcp_pbuf_prealloc+0x30>
  42917. (!first_seg ||
  42918. 802eb54: 6ee9 ldr r1, [r5, #108] ; 0x6c
  42919. 802eb56: b909 cbnz r1, 802eb5c <tcp_pbuf_prealloc+0x30>
  42920. pcb->unsent != NULL ||
  42921. 802eb58: 6f2b ldr r3, [r5, #112] ; 0x70
  42922. 802eb5a: b143 cbz r3, 802eb6e <tcp_pbuf_prealloc+0x42>
  42923. pcb->unacked != NULL))) {
  42924. alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(length + TCP_OVERSIZE));
  42925. 802eb5c: f204 51b7 addw r1, r4, #1463 ; 0x5b7
  42926. 802eb60: f021 0103 bic.w r1, r1, #3
  42927. 802eb64: 4291 cmp r1, r2
  42928. 802eb66: bfa8 it ge
  42929. 802eb68: 4611 movge r1, r2
  42930. 802eb6a: b289 uxth r1, r1
  42931. 802eb6c: e000 b.n 802eb70 <tcp_pbuf_prealloc+0x44>
  42932. * Will the Nagle algorithm defer transmission of this segment?
  42933. */
  42934. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  42935. (!(pcb->flags & TF_NODELAY) &&
  42936. (!first_seg ||
  42937. pcb->unsent != NULL ||
  42938. 802eb6e: 4621 mov r1, r4
  42939. pcb->unacked != NULL))) {
  42940. alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(length + TCP_OVERSIZE));
  42941. }
  42942. }
  42943. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  42944. p = pbuf_alloc(layer, alloc, PBUF_RAM);
  42945. 802eb70: 2200 movs r2, #0
  42946. 802eb72: f7fe faaa bl 802d0ca <pbuf_alloc>
  42947. if (p == NULL) {
  42948. 802eb76: b120 cbz r0, 802eb82 <tcp_pbuf_prealloc+0x56>
  42949. return NULL;
  42950. }
  42951. LWIP_ASSERT("need unchained pbuf", p->next == NULL);
  42952. *oversize = p->len - length;
  42953. 802eb78: 8943 ldrh r3, [r0, #10]
  42954. 802eb7a: 1b1b subs r3, r3, r4
  42955. 802eb7c: 8033 strh r3, [r6, #0]
  42956. /* trim p->len to the currently used size */
  42957. p->len = p->tot_len = length;
  42958. 802eb7e: 8104 strh r4, [r0, #8]
  42959. 802eb80: 8144 strh r4, [r0, #10]
  42960. return p;
  42961. }
  42962. 802eb82: bd70 pop {r4, r5, r6, pc}
  42963. 0802eb84 <tcp_create_segment>:
  42964. * The TCP header is filled in except ackno and wnd.
  42965. * p is freed on failure.
  42966. */
  42967. static struct tcp_seg *
  42968. tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)
  42969. {
  42970. 802eb84: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  42971. 802eb88: f89d 6020 ldrb.w r6, [sp, #32]
  42972. struct tcp_seg *seg;
  42973. u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
  42974. 802eb8c: f006 0702 and.w r7, r6, #2
  42975. 802eb90: f016 0f01 tst.w r6, #1
  42976. 802eb94: b2ff uxtb r7, r7
  42977. * The TCP header is filled in except ackno and wnd.
  42978. * p is freed on failure.
  42979. */
  42980. static struct tcp_seg *
  42981. tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)
  42982. {
  42983. 802eb96: 4680 mov r8, r0
  42984. 802eb98: 469a mov sl, r3
  42985. struct tcp_seg *seg;
  42986. u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
  42987. 802eb9a: bf0c ite eq
  42988. 802eb9c: 2300 moveq r3, #0
  42989. 802eb9e: 2304 movne r3, #4
  42990. 802eba0: 2f00 cmp r7, #0
  42991. 802eba2: bf14 ite ne
  42992. 802eba4: 270c movne r7, #12
  42993. 802eba6: 2700 moveq r7, #0
  42994. if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) {
  42995. 802eba8: 2004 movs r0, #4
  42996. * The TCP header is filled in except ackno and wnd.
  42997. * p is freed on failure.
  42998. */
  42999. static struct tcp_seg *
  43000. tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)
  43001. {
  43002. 802ebaa: 460d mov r5, r1
  43003. 802ebac: 4691 mov r9, r2
  43004. struct tcp_seg *seg;
  43005. u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
  43006. 802ebae: 18ff adds r7, r7, r3
  43007. if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) {
  43008. 802ebb0: f7fe f91e bl 802cdf0 <memp_malloc>
  43009. 802ebb4: 4604 mov r4, r0
  43010. 802ebb6: b918 cbnz r0, 802ebc0 <tcp_create_segment+0x3c>
  43011. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no memory.\n"));
  43012. pbuf_free(p);
  43013. 802ebb8: 4628 mov r0, r5
  43014. 802ebba: f7fe fa39 bl 802d030 <pbuf_free>
  43015. return NULL;
  43016. 802ebbe: e030 b.n 802ec22 <tcp_create_segment+0x9e>
  43017. }
  43018. seg->flags = optflags;
  43019. 802ebc0: 7286 strb r6, [r0, #10]
  43020. seg->next = NULL;
  43021. seg->p = p;
  43022. seg->len = p->tot_len - optlen;
  43023. 802ebc2: 892b ldrh r3, [r5, #8]
  43024. pbuf_free(p);
  43025. return NULL;
  43026. }
  43027. seg->flags = optflags;
  43028. seg->next = NULL;
  43029. seg->p = p;
  43030. 802ebc4: 6045 str r5, [r0, #4]
  43031. seg->len = p->tot_len - optlen;
  43032. 802ebc6: 1bdb subs r3, r3, r7
  43033. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no memory.\n"));
  43034. pbuf_free(p);
  43035. return NULL;
  43036. }
  43037. seg->flags = optflags;
  43038. seg->next = NULL;
  43039. 802ebc8: 2600 movs r6, #0
  43040. 802ebca: 6006 str r6, [r0, #0]
  43041. seg->p = p;
  43042. seg->len = p->tot_len - optlen;
  43043. 802ebcc: 8103 strh r3, [r0, #8]
  43044. LWIP_ASSERT("invalid optflags passed: TF_SEG_DATA_CHECKSUMMED",
  43045. (optflags & TF_SEG_DATA_CHECKSUMMED) == 0);
  43046. #endif /* TCP_CHECKSUM_ON_COPY */
  43047. /* build TCP header */
  43048. if (pbuf_header(p, TCP_HLEN)) {
  43049. 802ebce: 2114 movs r1, #20
  43050. 802ebd0: 4628 mov r0, r5
  43051. 802ebd2: f7fe fa02 bl 802cfda <pbuf_header>
  43052. 802ebd6: 4605 mov r5, r0
  43053. 802ebd8: b120 cbz r0, 802ebe4 <tcp_create_segment+0x60>
  43054. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no room for TCP header in pbuf.\n"));
  43055. TCP_STATS_INC(tcp.err);
  43056. tcp_seg_free(seg);
  43057. 802ebda: 4620 mov r0, r4
  43058. 802ebdc: f7fe fcd5 bl 802d58a <tcp_seg_free>
  43059. return NULL;
  43060. 802ebe0: 4634 mov r4, r6
  43061. 802ebe2: e01e b.n 802ec22 <tcp_create_segment+0x9e>
  43062. }
  43063. seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
  43064. 802ebe4: 6863 ldr r3, [r4, #4]
  43065. seg->tcphdr->src = htons(pcb->local_port);
  43066. 802ebe6: f8b8 001a ldrh.w r0, [r8, #26]
  43067. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no room for TCP header in pbuf.\n"));
  43068. TCP_STATS_INC(tcp.err);
  43069. tcp_seg_free(seg);
  43070. return NULL;
  43071. }
  43072. seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
  43073. 802ebea: 685e ldr r6, [r3, #4]
  43074. 802ebec: 60e6 str r6, [r4, #12]
  43075. seg->tcphdr->src = htons(pcb->local_port);
  43076. 802ebee: f7fd f8e1 bl 802bdb4 <lwip_htons>
  43077. 802ebf2: 8030 strh r0, [r6, #0]
  43078. seg->tcphdr->dest = htons(pcb->remote_port);
  43079. 802ebf4: f8b8 001c ldrh.w r0, [r8, #28]
  43080. 802ebf8: 68e6 ldr r6, [r4, #12]
  43081. 802ebfa: f7fd f8db bl 802bdb4 <lwip_htons>
  43082. 802ebfe: 8070 strh r0, [r6, #2]
  43083. seg->tcphdr->seqno = htonl(seqno);
  43084. 802ec00: 4650 mov r0, sl
  43085. 802ec02: 68e6 ldr r6, [r4, #12]
  43086. 802ec04: f7fd f8e0 bl 802bdc8 <lwip_htonl>
  43087. /* ackno is set in tcp_output */
  43088. TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags);
  43089. 802ec08: 02bf lsls r7, r7, #10
  43090. return NULL;
  43091. }
  43092. seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
  43093. seg->tcphdr->src = htons(pcb->local_port);
  43094. seg->tcphdr->dest = htons(pcb->remote_port);
  43095. seg->tcphdr->seqno = htonl(seqno);
  43096. 802ec0a: 6070 str r0, [r6, #4]
  43097. /* ackno is set in tcp_output */
  43098. TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags);
  43099. 802ec0c: f507 40a0 add.w r0, r7, #20480 ; 0x5000
  43100. 802ec10: ea40 0009 orr.w r0, r0, r9
  43101. 802ec14: 68e6 ldr r6, [r4, #12]
  43102. 802ec16: f7fd f8cd bl 802bdb4 <lwip_htons>
  43103. 802ec1a: 81b0 strh r0, [r6, #12]
  43104. /* wnd and chksum are set in tcp_output */
  43105. seg->tcphdr->urgp = 0;
  43106. 802ec1c: 68e3 ldr r3, [r4, #12]
  43107. 802ec1e: 749d strb r5, [r3, #18]
  43108. 802ec20: 74dd strb r5, [r3, #19]
  43109. return seg;
  43110. }
  43111. 802ec22: 4620 mov r0, r4
  43112. 802ec24: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  43113. 0802ec28 <tcp_output_alloc_header.constprop.0>:
  43114. static struct pbuf *
  43115. tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
  43116. u32_t seqno_be /* already in network byte order */)
  43117. {
  43118. struct tcp_hdr *tcphdr;
  43119. struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
  43120. 802ec28: 3114 adds r1, #20
  43121. * @param datalen length of tcp data to reserve in pbuf
  43122. * @param seqno_be seqno in network byte order (big-endian)
  43123. * @return pbuf with p->payload being the tcp_hdr
  43124. */
  43125. static struct pbuf *
  43126. tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
  43127. 802ec2a: b5f8 push {r3, r4, r5, r6, r7, lr}
  43128. u32_t seqno_be /* already in network byte order */)
  43129. {
  43130. struct tcp_hdr *tcphdr;
  43131. struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
  43132. 802ec2c: b289 uxth r1, r1
  43133. * @param datalen length of tcp data to reserve in pbuf
  43134. * @param seqno_be seqno in network byte order (big-endian)
  43135. * @return pbuf with p->payload being the tcp_hdr
  43136. */
  43137. static struct pbuf *
  43138. tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
  43139. 802ec2e: 4605 mov r5, r0
  43140. 802ec30: 4617 mov r7, r2
  43141. u32_t seqno_be /* already in network byte order */)
  43142. {
  43143. struct tcp_hdr *tcphdr;
  43144. struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
  43145. 802ec32: 2001 movs r0, #1
  43146. 802ec34: 2200 movs r2, #0
  43147. 802ec36: f7fe fa48 bl 802d0ca <pbuf_alloc>
  43148. if (p != NULL) {
  43149. 802ec3a: 4606 mov r6, r0
  43150. 802ec3c: b1f8 cbz r0, 802ec7e <tcp_output_alloc_header.constprop.0+0x56>
  43151. LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
  43152. (p->len >= TCP_HLEN + optlen));
  43153. tcphdr = (struct tcp_hdr *)p->payload;
  43154. 802ec3e: 6844 ldr r4, [r0, #4]
  43155. tcphdr->src = htons(pcb->local_port);
  43156. 802ec40: 8b68 ldrh r0, [r5, #26]
  43157. 802ec42: f7fd f8b7 bl 802bdb4 <lwip_htons>
  43158. 802ec46: 8020 strh r0, [r4, #0]
  43159. tcphdr->dest = htons(pcb->remote_port);
  43160. 802ec48: 8ba8 ldrh r0, [r5, #28]
  43161. 802ec4a: f7fd f8b3 bl 802bdb4 <lwip_htons>
  43162. tcphdr->seqno = seqno_be;
  43163. 802ec4e: 6067 str r7, [r4, #4]
  43164. if (p != NULL) {
  43165. LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
  43166. (p->len >= TCP_HLEN + optlen));
  43167. tcphdr = (struct tcp_hdr *)p->payload;
  43168. tcphdr->src = htons(pcb->local_port);
  43169. tcphdr->dest = htons(pcb->remote_port);
  43170. 802ec50: 8060 strh r0, [r4, #2]
  43171. tcphdr->seqno = seqno_be;
  43172. tcphdr->ackno = htonl(pcb->rcv_nxt);
  43173. 802ec52: 6aa8 ldr r0, [r5, #40] ; 0x28
  43174. 802ec54: f7fd f8b8 bl 802bdc8 <lwip_htonl>
  43175. 802ec58: 60a0 str r0, [r4, #8]
  43176. TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK);
  43177. 802ec5a: f245 0010 movw r0, #20496 ; 0x5010
  43178. 802ec5e: f7fd f8a9 bl 802bdb4 <lwip_htons>
  43179. 802ec62: 81a0 strh r0, [r4, #12]
  43180. tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  43181. 802ec64: 8de8 ldrh r0, [r5, #46] ; 0x2e
  43182. 802ec66: f7fd f8a5 bl 802bdb4 <lwip_htons>
  43183. tcphdr->chksum = 0;
  43184. 802ec6a: 2300 movs r3, #0
  43185. tcphdr->src = htons(pcb->local_port);
  43186. tcphdr->dest = htons(pcb->remote_port);
  43187. tcphdr->seqno = seqno_be;
  43188. tcphdr->ackno = htonl(pcb->rcv_nxt);
  43189. TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK);
  43190. tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  43191. 802ec6c: 81e0 strh r0, [r4, #14]
  43192. tcphdr->chksum = 0;
  43193. 802ec6e: 7423 strb r3, [r4, #16]
  43194. 802ec70: 7463 strb r3, [r4, #17]
  43195. tcphdr->urgp = 0;
  43196. 802ec72: 74a3 strb r3, [r4, #18]
  43197. 802ec74: 74e3 strb r3, [r4, #19]
  43198. /* If we're sending a packet, update the announced right window edge */
  43199. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  43200. 802ec76: 8dea ldrh r2, [r5, #46] ; 0x2e
  43201. 802ec78: 6aab ldr r3, [r5, #40] ; 0x28
  43202. 802ec7a: 18d3 adds r3, r2, r3
  43203. 802ec7c: 632b str r3, [r5, #48] ; 0x30
  43204. }
  43205. return p;
  43206. }
  43207. 802ec7e: 4630 mov r0, r6
  43208. 802ec80: bdf8 pop {r3, r4, r5, r6, r7, pc}
  43209. 0802ec82 <tcp_write>:
  43210. * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent,
  43211. * @return ERR_OK if enqueued, another err_t on error
  43212. */
  43213. err_t
  43214. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  43215. {
  43216. 802ec82: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  43217. 802ec86: b08f sub sp, #60 ; 0x3c
  43218. 802ec88: 4691 mov r9, r2
  43219. 802ec8a: 9307 str r3, [sp, #28]
  43220. u16_t pos = 0; /* position in 'arg' data */
  43221. u16_t queuelen;
  43222. u8_t optlen = 0;
  43223. u8_t optflags = 0;
  43224. #if TCP_OVERSIZE
  43225. u16_t oversize = 0;
  43226. 802ec8c: 2300 movs r3, #0
  43227. 802ec8e: f8ad 3036 strh.w r3, [sp, #54] ; 0x36
  43228. * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent,
  43229. * @return ERR_OK if enqueued, another err_t on error
  43230. */
  43231. err_t
  43232. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  43233. {
  43234. 802ec92: 4604 mov r4, r0
  43235. u8_t concat_chksum_swapped = 0;
  43236. u16_t concat_chksummed = 0;
  43237. #endif /* TCP_CHECKSUM_ON_COPY */
  43238. err_t err;
  43239. /* don't allocate segments bigger than half the maximum window we ever received */
  43240. u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2);
  43241. 802ec94: f8b0 2062 ldrh.w r2, [r0, #98] ; 0x62
  43242. 802ec98: 8ec3 ldrh r3, [r0, #54] ; 0x36
  43243. apiflags |= TCP_WRITE_FLAG_COPY;
  43244. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  43245. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n",
  43246. (void *)pcb, arg, len, (u16_t)apiflags));
  43247. LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)",
  43248. 802ec9a: 9106 str r1, [sp, #24]
  43249. 802ec9c: 2900 cmp r1, #0
  43250. 802ec9e: f000 8168 beq.w 802ef72 <tcp_write+0x2f0>
  43251. 802eca2: 7e01 ldrb r1, [r0, #24]
  43252. 802eca4: 2907 cmp r1, #7
  43253. 802eca6: f200 8166 bhi.w 802ef76 <tcp_write+0x2f4>
  43254. 802ecaa: f990 1018 ldrsb.w r1, [r0, #24]
  43255. 802ecae: f04f 5064 mov.w r0, #956301312 ; 0x39000000
  43256. 802ecb2: 4088 lsls r0, r1
  43257. 802ecb4: f140 815f bpl.w 802ef76 <tcp_write+0x2f4>
  43258. (pcb->state != CLOSE_WAIT) &&
  43259. (pcb->state != SYN_SENT) &&
  43260. (pcb->state != SYN_RCVD)) {
  43261. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n"));
  43262. return ERR_CONN;
  43263. } else if (len == 0) {
  43264. 802ecb8: f1b9 0f00 cmp.w r9, #0
  43265. 802ecbc: d00d beq.n 802ecda <tcp_write+0x58>
  43266. return ERR_OK;
  43267. }
  43268. /* fail on too much data */
  43269. if (len > pcb->snd_buf) {
  43270. 802ecbe: f8b4 1066 ldrh.w r1, [r4, #102] ; 0x66
  43271. 802ecc2: 4549 cmp r1, r9
  43272. 802ecc4: d200 bcs.n 802ecc8 <tcp_write+0x46>
  43273. 802ecc6: e003 b.n 802ecd0 <tcp_write+0x4e>
  43274. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen));
  43275. /* If total number of pbufs on the unsent/unacked queues exceeds the
  43276. * configured maximum, return an error */
  43277. /* check for configured max queuelen and possible overflow */
  43278. if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  43279. 802ecc8: f8b4 1068 ldrh.w r1, [r4, #104] ; 0x68
  43280. 802eccc: 2947 cmp r1, #71 ; 0x47
  43281. 802ecce: d904 bls.n 802ecda <tcp_write+0x58>
  43282. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_write: too long queue %"U16_F" (max %"U16_F")\n",
  43283. pcb->snd_queuelen, TCP_SND_QUEUELEN));
  43284. TCP_STATS_INC(tcp.memerr);
  43285. pcb->flags |= TF_NAGLEMEMERR;
  43286. 802ecd0: 7fa3 ldrb r3, [r4, #30]
  43287. 802ecd2: f063 037f orn r3, r3, #127 ; 0x7f
  43288. 802ecd6: 77a3 strb r3, [r4, #30]
  43289. 802ecd8: e151 b.n 802ef7e <tcp_write+0x2fc>
  43290. u8_t concat_chksum_swapped = 0;
  43291. u16_t concat_chksummed = 0;
  43292. #endif /* TCP_CHECKSUM_ON_COPY */
  43293. err_t err;
  43294. /* don't allocate segments bigger than half the maximum window we ever received */
  43295. u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2);
  43296. 802ecda: 0852 lsrs r2, r2, #1
  43297. *
  43298. * pos records progress as data is segmented.
  43299. */
  43300. /* Find the tail of the unsent queue. */
  43301. if (pcb->unsent != NULL) {
  43302. 802ecdc: 6ee6 ldr r6, [r4, #108] ; 0x6c
  43303. err = tcp_write_checks(pcb, len);
  43304. if (err != ERR_OK) {
  43305. return err;
  43306. }
  43307. queuelen = pcb->snd_queuelen;
  43308. 802ecde: f8b4 b068 ldrh.w fp, [r4, #104] ; 0x68
  43309. u8_t concat_chksum_swapped = 0;
  43310. u16_t concat_chksummed = 0;
  43311. #endif /* TCP_CHECKSUM_ON_COPY */
  43312. err_t err;
  43313. /* don't allocate segments bigger than half the maximum window we ever received */
  43314. u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2);
  43315. 802ece2: 429a cmp r2, r3
  43316. 802ece4: bf28 it cs
  43317. 802ece6: 461a movcs r2, r3
  43318. 802ece8: 920a str r2, [sp, #40] ; 0x28
  43319. *
  43320. * pos records progress as data is segmented.
  43321. */
  43322. /* Find the tail of the unsent queue. */
  43323. if (pcb->unsent != NULL) {
  43324. 802ecea: b90e cbnz r6, 802ecf0 <tcp_write+0x6e>
  43325. 802ecec: e066 b.n 802edbc <tcp_write+0x13a>
  43326. u16_t space;
  43327. u16_t unsent_optlen;
  43328. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  43329. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  43330. last_unsent = last_unsent->next);
  43331. 802ecee: 461e mov r6, r3
  43332. if (pcb->unsent != NULL) {
  43333. u16_t space;
  43334. u16_t unsent_optlen;
  43335. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  43336. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  43337. 802ecf0: 6833 ldr r3, [r6, #0]
  43338. 802ecf2: 2b00 cmp r3, #0
  43339. 802ecf4: d1fb bne.n 802ecee <tcp_write+0x6c>
  43340. last_unsent = last_unsent->next);
  43341. /* Usable space at the end of the last unsent segment */
  43342. unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
  43343. 802ecf6: 7ab3 ldrb r3, [r6, #10]
  43344. space = mss_local - (last_unsent->len + unsent_optlen);
  43345. 802ecf8: 8937 ldrh r7, [r6, #8]
  43346. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  43347. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  43348. last_unsent = last_unsent->next);
  43349. /* Usable space at the end of the last unsent segment */
  43350. unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
  43351. 802ecfa: 980a ldr r0, [sp, #40] ; 0x28
  43352. #if TCP_OVERSIZE_DBGCHECK
  43353. /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */
  43354. LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
  43355. pcb->unsent_oversize == last_unsent->oversize_left);
  43356. #endif /* TCP_OVERSIZE_DBGCHECK */
  43357. oversize = pcb->unsent_oversize;
  43358. 802ecfc: f8b4 506a ldrh.w r5, [r4, #106] ; 0x6a
  43359. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  43360. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  43361. last_unsent = last_unsent->next);
  43362. /* Usable space at the end of the last unsent segment */
  43363. unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
  43364. 802ed00: f013 0f01 tst.w r3, #1
  43365. 802ed04: f003 0302 and.w r3, r3, #2
  43366. 802ed08: bf0c ite eq
  43367. 802ed0a: 2100 moveq r1, #0
  43368. 802ed0c: 2104 movne r1, #4
  43369. 802ed0e: b2db uxtb r3, r3
  43370. 802ed10: 1bc2 subs r2, r0, r7
  43371. 802ed12: 2b00 cmp r3, #0
  43372. 802ed14: bf14 ite ne
  43373. 802ed16: 230c movne r3, #12
  43374. 802ed18: 2300 moveq r3, #0
  43375. space = mss_local - (last_unsent->len + unsent_optlen);
  43376. 802ed1a: 1a52 subs r2, r2, r1
  43377. 802ed1c: 1ad2 subs r2, r2, r3
  43378. 802ed1e: b292 uxth r2, r2
  43379. /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */
  43380. LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
  43381. pcb->unsent_oversize == last_unsent->oversize_left);
  43382. #endif /* TCP_OVERSIZE_DBGCHECK */
  43383. oversize = pcb->unsent_oversize;
  43384. if (oversize > 0) {
  43385. 802ed20: b91d cbnz r5, 802ed2a <tcp_write+0xa8>
  43386. #if TCP_OVERSIZE_DBGCHECK
  43387. /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */
  43388. LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
  43389. pcb->unsent_oversize == last_unsent->oversize_left);
  43390. #endif /* TCP_OVERSIZE_DBGCHECK */
  43391. oversize = pcb->unsent_oversize;
  43392. 802ed22: f8ad 5036 strh.w r5, [sp, #54] ; 0x36
  43393. */
  43394. err_t
  43395. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  43396. {
  43397. struct pbuf *concat_p = NULL;
  43398. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  43399. 802ed26: 462b mov r3, r5
  43400. 802ed28: e00a b.n 802ed40 <tcp_write+0xbe>
  43401. #endif /* TCP_OVERSIZE_DBGCHECK */
  43402. oversize = pcb->unsent_oversize;
  43403. if (oversize > 0) {
  43404. LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space);
  43405. seg = last_unsent;
  43406. oversize_used = oversize < len ? oversize : len;
  43407. 802ed2a: 45a9 cmp r9, r5
  43408. 802ed2c: bf34 ite cc
  43409. 802ed2e: 464b movcc r3, r9
  43410. 802ed30: 462b movcs r3, r5
  43411. pos += oversize_used;
  43412. oversize -= oversize_used;
  43413. 802ed32: 1aed subs r5, r5, r3
  43414. space -= oversize_used;
  43415. 802ed34: 1ad2 subs r2, r2, r3
  43416. if (oversize > 0) {
  43417. LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space);
  43418. seg = last_unsent;
  43419. oversize_used = oversize < len ? oversize : len;
  43420. pos += oversize_used;
  43421. oversize -= oversize_used;
  43422. 802ed36: f8ad 5036 strh.w r5, [sp, #54] ; 0x36
  43423. space -= oversize_used;
  43424. 802ed3a: b292 uxth r2, r2
  43425. oversize = pcb->unsent_oversize;
  43426. if (oversize > 0) {
  43427. LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space);
  43428. seg = last_unsent;
  43429. oversize_used = oversize < len ? oversize : len;
  43430. pos += oversize_used;
  43431. 802ed3c: 461d mov r5, r3
  43432. oversize -= oversize_used;
  43433. space -= oversize_used;
  43434. 802ed3e: 4633 mov r3, r6
  43435. *
  43436. * We don't extend segments containing SYN/FIN flags or options
  43437. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  43438. * the end.
  43439. */
  43440. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  43441. 802ed40: 454d cmp r5, r9
  43442. 802ed42: d23f bcs.n 802edc4 <tcp_write+0x142>
  43443. 802ed44: 2a00 cmp r2, #0
  43444. 802ed46: d03d beq.n 802edc4 <tcp_write+0x142>
  43445. 802ed48: 2f00 cmp r7, #0
  43446. 802ed4a: d03e beq.n 802edca <tcp_write+0x148>
  43447. seg = last_unsent;
  43448. /* Create a pbuf with a copy or reference to seglen bytes. We
  43449. * can use PBUF_RAW here since the data appears in the middle of
  43450. * a segment. A header will never be prepended. */
  43451. if (apiflags & TCP_WRITE_FLAG_COPY) {
  43452. 802ed4c: 9907 ldr r1, [sp, #28]
  43453. * We don't extend segments containing SYN/FIN flags or options
  43454. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  43455. * the end.
  43456. */
  43457. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  43458. u16_t seglen = space < len - pos ? space : len - pos;
  43459. 802ed4e: ebc5 0a09 rsb sl, r5, r9
  43460. 802ed52: 4592 cmp sl, r2
  43461. 802ed54: bfa8 it ge
  43462. 802ed56: 4692 movge sl, r2
  43463. seg = last_unsent;
  43464. /* Create a pbuf with a copy or reference to seglen bytes. We
  43465. * can use PBUF_RAW here since the data appears in the middle of
  43466. * a segment. A header will never be prepended. */
  43467. if (apiflags & TCP_WRITE_FLAG_COPY) {
  43468. 802ed58: 07cb lsls r3, r1, #31
  43469. * We don't extend segments containing SYN/FIN flags or options
  43470. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  43471. * the end.
  43472. */
  43473. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  43474. u16_t seglen = space < len - pos ? space : len - pos;
  43475. 802ed5a: fa1f f88a uxth.w r8, sl
  43476. seg = last_unsent;
  43477. /* Create a pbuf with a copy or reference to seglen bytes. We
  43478. * can use PBUF_RAW here since the data appears in the middle of
  43479. * a segment. A header will never be prepended. */
  43480. if (apiflags & TCP_WRITE_FLAG_COPY) {
  43481. 802ed5e: d514 bpl.n 802ed8a <tcp_write+0x108>
  43482. /* Data is copied */
  43483. if ((concat_p = tcp_pbuf_prealloc(PBUF_RAW, seglen, space, &oversize, pcb, apiflags, 1)) == NULL) {
  43484. 802ed60: 2301 movs r3, #1
  43485. 802ed62: 9101 str r1, [sp, #4]
  43486. 802ed64: 9302 str r3, [sp, #8]
  43487. 802ed66: 9400 str r4, [sp, #0]
  43488. 802ed68: 2003 movs r0, #3
  43489. 802ed6a: 4641 mov r1, r8
  43490. 802ed6c: f10d 0336 add.w r3, sp, #54 ; 0x36
  43491. 802ed70: f7ff fedc bl 802eb2c <tcp_pbuf_prealloc>
  43492. 802ed74: 4607 mov r7, r0
  43493. 802ed76: 2800 cmp r0, #0
  43494. 802ed78: f000 80e9 beq.w 802ef4e <tcp_write+0x2cc>
  43495. goto memerr;
  43496. }
  43497. #if TCP_OVERSIZE_DBGCHECK
  43498. last_unsent->oversize_left += oversize;
  43499. #endif /* TCP_OVERSIZE_DBGCHECK */
  43500. TCP_DATA_COPY2(concat_p->payload, (u8_t*)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped);
  43501. 802ed7c: 9a06 ldr r2, [sp, #24]
  43502. 802ed7e: 6840 ldr r0, [r0, #4]
  43503. 802ed80: 1951 adds r1, r2, r5
  43504. 802ed82: 4642 mov r2, r8
  43505. 802ed84: f7f2 fde2 bl 802194c <memcpy>
  43506. 802ed88: e00b b.n 802eda2 <tcp_write+0x120>
  43507. #if TCP_CHECKSUM_ON_COPY
  43508. concat_chksummed += seglen;
  43509. #endif /* TCP_CHECKSUM_ON_COPY */
  43510. } else {
  43511. /* Data is not copied */
  43512. if ((concat_p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) {
  43513. 802ed8a: 2003 movs r0, #3
  43514. 802ed8c: 4641 mov r1, r8
  43515. 802ed8e: 2201 movs r2, #1
  43516. 802ed90: f7fe f99b bl 802d0ca <pbuf_alloc>
  43517. 802ed94: 4607 mov r7, r0
  43518. 802ed96: 2800 cmp r0, #0
  43519. 802ed98: f000 80d9 beq.w 802ef4e <tcp_write+0x2cc>
  43520. tcp_seg_add_chksum(~inet_chksum((u8_t*)arg + pos, seglen), seglen,
  43521. &concat_chksum, &concat_chksum_swapped);
  43522. concat_chksummed += seglen;
  43523. #endif /* TCP_CHECKSUM_ON_COPY */
  43524. /* reference the non-volatile payload data */
  43525. concat_p->payload = (u8_t*)arg + pos;
  43526. 802ed9c: 9806 ldr r0, [sp, #24]
  43527. 802ed9e: 1943 adds r3, r0, r5
  43528. 802eda0: 607b str r3, [r7, #4]
  43529. }
  43530. pos += seglen;
  43531. queuelen += pbuf_clen(concat_p);
  43532. 802eda2: 4638 mov r0, r7
  43533. 802eda4: f7fe fa18 bl 802d1d8 <pbuf_clen>
  43534. #endif /* TCP_CHECKSUM_ON_COPY */
  43535. /* reference the non-volatile payload data */
  43536. concat_p->payload = (u8_t*)arg + pos;
  43537. }
  43538. pos += seglen;
  43539. 802eda8: 44a8 add r8, r5
  43540. 802edaa: fa1f f888 uxth.w r8, r8
  43541. queuelen += pbuf_clen(concat_p);
  43542. 802edae: 4458 add r0, fp
  43543. 802edb0: 46aa mov sl, r5
  43544. 802edb2: fa1f fb80 uxth.w fp, r0
  43545. #endif /* TCP_CHECKSUM_ON_COPY */
  43546. /* reference the non-volatile payload data */
  43547. concat_p->payload = (u8_t*)arg + pos;
  43548. }
  43549. pos += seglen;
  43550. 802edb6: 4645 mov r5, r8
  43551. queuelen += pbuf_clen(concat_p);
  43552. 802edb8: 4633 mov r3, r6
  43553. 802edba: e007 b.n 802edcc <tcp_write+0x14a>
  43554. u16_t queuelen;
  43555. u8_t optlen = 0;
  43556. u8_t optflags = 0;
  43557. #if TCP_OVERSIZE
  43558. u16_t oversize = 0;
  43559. u16_t oversize_used = 0;
  43560. 802edbc: 46b2 mov sl, r6
  43561. err_t
  43562. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  43563. {
  43564. struct pbuf *concat_p = NULL;
  43565. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  43566. u16_t pos = 0; /* position in 'arg' data */
  43567. 802edbe: 4635 mov r5, r6
  43568. */
  43569. err_t
  43570. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  43571. {
  43572. struct pbuf *concat_p = NULL;
  43573. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  43574. 802edc0: 4633 mov r3, r6
  43575. 802edc2: e000 b.n 802edc6 <tcp_write+0x144>
  43576. *
  43577. * We don't extend segments containing SYN/FIN flags or options
  43578. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  43579. * the end.
  43580. */
  43581. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  43582. 802edc4: 46aa mov sl, r5
  43583. * @return ERR_OK if enqueued, another err_t on error
  43584. */
  43585. err_t
  43586. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  43587. {
  43588. struct pbuf *concat_p = NULL;
  43589. 802edc6: 2700 movs r7, #0
  43590. 802edc8: e000 b.n 802edcc <tcp_write+0x14a>
  43591. *
  43592. * We don't extend segments containing SYN/FIN flags or options
  43593. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  43594. * the end.
  43595. */
  43596. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  43597. 802edca: 46aa mov sl, r5
  43598. #if TCP_CHECKSUM_ON_COPY
  43599. u16_t chksum = 0;
  43600. u8_t chksum_swapped = 0;
  43601. #endif /* TCP_CHECKSUM_ON_COPY */
  43602. if (apiflags & TCP_WRITE_FLAG_COPY) {
  43603. 802edcc: 9907 ldr r1, [sp, #28]
  43604. seg->chksum_swapped = chksum_swapped;
  43605. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  43606. #endif /* TCP_CHECKSUM_ON_COPY */
  43607. /* first segment of to-be-queued data? */
  43608. if (queue == NULL) {
  43609. 802edce: f04f 0800 mov.w r8, #0
  43610. #if TCP_CHECKSUM_ON_COPY
  43611. u16_t chksum = 0;
  43612. u8_t chksum_swapped = 0;
  43613. #endif /* TCP_CHECKSUM_ON_COPY */
  43614. if (apiflags & TCP_WRITE_FLAG_COPY) {
  43615. 802edd2: f001 0101 and.w r1, r1, #1
  43616. seg->chksum_swapped = chksum_swapped;
  43617. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  43618. #endif /* TCP_CHECKSUM_ON_COPY */
  43619. /* first segment of to-be-queued data? */
  43620. if (queue == NULL) {
  43621. 802edd6: f8cd 802c str.w r8, [sp, #44] ; 0x2c
  43622. #if TCP_CHECKSUM_ON_COPY
  43623. u16_t chksum = 0;
  43624. u8_t chksum_swapped = 0;
  43625. #endif /* TCP_CHECKSUM_ON_COPY */
  43626. if (apiflags & TCP_WRITE_FLAG_COPY) {
  43627. 802edda: 9108 str r1, [sp, #32]
  43628. 802eddc: e068 b.n 802eeb0 <tcp_write+0x22e>
  43629. * The new segments are chained together in the local 'queue'
  43630. * variable, ready to be appended to pcb->unsent.
  43631. */
  43632. while (pos < len) {
  43633. struct pbuf *p;
  43634. u16_t left = len - pos;
  43635. 802edde: ebc5 0309 rsb r3, r5, r9
  43636. u16_t max_len = mss_local - optlen;
  43637. u16_t seglen = left > max_len ? max_len : left;
  43638. 802ede2: 9a0a ldr r2, [sp, #40] ; 0x28
  43639. 802ede4: b29b uxth r3, r3
  43640. 802ede6: 4293 cmp r3, r2
  43641. 802ede8: bf38 it cc
  43642. 802edea: 461a movcc r2, r3
  43643. #if TCP_CHECKSUM_ON_COPY
  43644. u16_t chksum = 0;
  43645. u8_t chksum_swapped = 0;
  43646. #endif /* TCP_CHECKSUM_ON_COPY */
  43647. if (apiflags & TCP_WRITE_FLAG_COPY) {
  43648. 802edec: 9b08 ldr r3, [sp, #32]
  43649. */
  43650. while (pos < len) {
  43651. struct pbuf *p;
  43652. u16_t left = len - pos;
  43653. u16_t max_len = mss_local - optlen;
  43654. u16_t seglen = left > max_len ? max_len : left;
  43655. 802edee: 9209 str r2, [sp, #36] ; 0x24
  43656. #if TCP_CHECKSUM_ON_COPY
  43657. u16_t chksum = 0;
  43658. u8_t chksum_swapped = 0;
  43659. #endif /* TCP_CHECKSUM_ON_COPY */
  43660. if (apiflags & TCP_WRITE_FLAG_COPY) {
  43661. 802edf0: b1db cbz r3, 802ee2a <tcp_write+0x1a8>
  43662. /* If copy is set, memory should be allocated and data copied
  43663. * into pbuf */
  43664. if ((p = tcp_pbuf_prealloc(PBUF_TRANSPORT, seglen + optlen, mss_local, &oversize, pcb, apiflags, queue == NULL)) == NULL) {
  43665. 802edf2: f1d8 0301 rsbs r3, r8, #1
  43666. 802edf6: 9807 ldr r0, [sp, #28]
  43667. 802edf8: 9400 str r4, [sp, #0]
  43668. 802edfa: bf38 it cc
  43669. 802edfc: 2300 movcc r3, #0
  43670. 802edfe: 9001 str r0, [sp, #4]
  43671. 802ee00: 9302 str r3, [sp, #8]
  43672. 802ee02: 4611 mov r1, r2
  43673. 802ee04: 2000 movs r0, #0
  43674. 802ee06: 9a0a ldr r2, [sp, #40] ; 0x28
  43675. 802ee08: f10d 0336 add.w r3, sp, #54 ; 0x36
  43676. 802ee0c: f7ff fe8e bl 802eb2c <tcp_pbuf_prealloc>
  43677. 802ee10: 4684 mov ip, r0
  43678. 802ee12: 2800 cmp r0, #0
  43679. 802ee14: f000 809e beq.w 802ef54 <tcp_write+0x2d2>
  43680. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", seglen));
  43681. goto memerr;
  43682. }
  43683. LWIP_ASSERT("tcp_write: check that first pbuf can hold the complete seglen",
  43684. (p->len >= seglen));
  43685. TCP_DATA_COPY2((char *)p->payload + optlen, (u8_t*)arg + pos, seglen, &chksum, &chksum_swapped);
  43686. 802ee18: 9a06 ldr r2, [sp, #24]
  43687. 802ee1a: 6840 ldr r0, [r0, #4]
  43688. 802ee1c: f8cd c014 str.w ip, [sp, #20]
  43689. 802ee20: 1951 adds r1, r2, r5
  43690. 802ee22: 9a09 ldr r2, [sp, #36] ; 0x24
  43691. 802ee24: f7f2 fd92 bl 802194c <memcpy>
  43692. 802ee28: e019 b.n 802ee5e <tcp_write+0x1dc>
  43693. */
  43694. struct pbuf *p2;
  43695. #if TCP_OVERSIZE
  43696. LWIP_ASSERT("oversize == 0", oversize == 0);
  43697. #endif /* TCP_OVERSIZE */
  43698. if ((p2 = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_ROM)) == NULL) {
  43699. 802ee2a: 9808 ldr r0, [sp, #32]
  43700. 802ee2c: 9909 ldr r1, [sp, #36] ; 0x24
  43701. 802ee2e: 2201 movs r2, #1
  43702. 802ee30: f7fe f94b bl 802d0ca <pbuf_alloc>
  43703. 802ee34: 4603 mov r3, r0
  43704. 802ee36: 2800 cmp r0, #0
  43705. 802ee38: f000 808c beq.w 802ef54 <tcp_write+0x2d2>
  43706. #if TCP_CHECKSUM_ON_COPY
  43707. /* calculate the checksum of nocopy-data */
  43708. chksum = ~inet_chksum((u8_t*)arg + pos, seglen);
  43709. #endif /* TCP_CHECKSUM_ON_COPY */
  43710. /* reference the non-volatile payload data */
  43711. p2->payload = (u8_t*)arg + pos;
  43712. 802ee3c: 9806 ldr r0, [sp, #24]
  43713. 802ee3e: 1942 adds r2, r0, r5
  43714. /* Second, allocate a pbuf for the headers. */
  43715. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  43716. 802ee40: 9808 ldr r0, [sp, #32]
  43717. #if TCP_CHECKSUM_ON_COPY
  43718. /* calculate the checksum of nocopy-data */
  43719. chksum = ~inet_chksum((u8_t*)arg + pos, seglen);
  43720. #endif /* TCP_CHECKSUM_ON_COPY */
  43721. /* reference the non-volatile payload data */
  43722. p2->payload = (u8_t*)arg + pos;
  43723. 802ee42: 605a str r2, [r3, #4]
  43724. /* Second, allocate a pbuf for the headers. */
  43725. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  43726. 802ee44: 4601 mov r1, r0
  43727. 802ee46: 4602 mov r2, r0
  43728. 802ee48: 9305 str r3, [sp, #20]
  43729. 802ee4a: f7fe f93e bl 802d0ca <pbuf_alloc>
  43730. 802ee4e: 9b05 ldr r3, [sp, #20]
  43731. 802ee50: b908 cbnz r0, 802ee56 <tcp_write+0x1d4>
  43732. /* If allocation fails, we have to deallocate the data pbuf as
  43733. * well. */
  43734. pbuf_free(p2);
  43735. 802ee52: 4618 mov r0, r3
  43736. 802ee54: e013 b.n 802ee7e <tcp_write+0x1fc>
  43737. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: could not allocate memory for header pbuf\n"));
  43738. goto memerr;
  43739. }
  43740. /* Concatenate the headers and data pbufs together. */
  43741. pbuf_cat(p/*header*/, p2/*data*/);
  43742. 802ee56: 4619 mov r1, r3
  43743. 802ee58: 9005 str r0, [sp, #20]
  43744. 802ee5a: f7fe f9d3 bl 802d204 <pbuf_cat>
  43745. 802ee5e: f8dd c014 ldr.w ip, [sp, #20]
  43746. }
  43747. queuelen += pbuf_clen(p);
  43748. 802ee62: 4660 mov r0, ip
  43749. 802ee64: f8cd c014 str.w ip, [sp, #20]
  43750. 802ee68: f7fe f9b6 bl 802d1d8 <pbuf_clen>
  43751. 802ee6c: 4458 add r0, fp
  43752. 802ee6e: fa1f fb80 uxth.w fp, r0
  43753. /* Now that there are more segments queued, we check again if the
  43754. * length of the queue exceeds the configured maximum or
  43755. * overflows. */
  43756. if ((queuelen > TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  43757. 802ee72: f1bb 0f48 cmp.w fp, #72 ; 0x48
  43758. 802ee76: f8dd c014 ldr.w ip, [sp, #20]
  43759. 802ee7a: d903 bls.n 802ee84 <tcp_write+0x202>
  43760. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: queue too long %"U16_F" (%"U16_F")\n", queuelen, TCP_SND_QUEUELEN));
  43761. pbuf_free(p);
  43762. 802ee7c: 4660 mov r0, ip
  43763. 802ee7e: f7fe f8d7 bl 802d030 <pbuf_free>
  43764. goto memerr;
  43765. 802ee82: e067 b.n 802ef54 <tcp_write+0x2d2>
  43766. }
  43767. if ((seg = tcp_create_segment(pcb, p, 0, pcb->snd_lbb + pos, optflags)) == NULL) {
  43768. 802ee84: 6de3 ldr r3, [r4, #92] ; 0x5c
  43769. 802ee86: 2200 movs r2, #0
  43770. 802ee88: 18eb adds r3, r5, r3
  43771. 802ee8a: 9200 str r2, [sp, #0]
  43772. 802ee8c: 4620 mov r0, r4
  43773. 802ee8e: 4661 mov r1, ip
  43774. 802ee90: f7ff fe78 bl 802eb84 <tcp_create_segment>
  43775. 802ee94: 4603 mov r3, r0
  43776. 802ee96: 2800 cmp r0, #0
  43777. 802ee98: d05c beq.n 802ef54 <tcp_write+0x2d2>
  43778. seg->chksum_swapped = chksum_swapped;
  43779. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  43780. #endif /* TCP_CHECKSUM_ON_COPY */
  43781. /* first segment of to-be-queued data? */
  43782. if (queue == NULL) {
  43783. 802ee9a: f1b8 0f00 cmp.w r8, #0
  43784. 802ee9e: d002 beq.n 802eea6 <tcp_write+0x224>
  43785. queue = seg;
  43786. } else {
  43787. /* Attach the segment to the end of the queued segments */
  43788. LWIP_ASSERT("prev_seg != NULL", prev_seg != NULL);
  43789. prev_seg->next = seg;
  43790. 802eea0: 990b ldr r1, [sp, #44] ; 0x2c
  43791. 802eea2: 6008 str r0, [r1, #0]
  43792. 802eea4: e000 b.n 802eea8 <tcp_write+0x226>
  43793. seg->chksum_swapped = chksum_swapped;
  43794. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  43795. #endif /* TCP_CHECKSUM_ON_COPY */
  43796. /* first segment of to-be-queued data? */
  43797. if (queue == NULL) {
  43798. 802eea6: 4680 mov r8, r0
  43799. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_write: queueing %"U32_F":%"U32_F"\n",
  43800. ntohl(seg->tcphdr->seqno),
  43801. ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg)));
  43802. pos += seglen;
  43803. 802eea8: 9a09 ldr r2, [sp, #36] ; 0x24
  43804. 802eeaa: 930b str r3, [sp, #44] ; 0x2c
  43805. 802eeac: 1955 adds r5, r2, r5
  43806. 802eeae: b2ad uxth r5, r5
  43807. * Phase 3: Create new segments.
  43808. *
  43809. * The new segments are chained together in the local 'queue'
  43810. * variable, ready to be appended to pcb->unsent.
  43811. */
  43812. while (pos < len) {
  43813. 802eeb0: 454d cmp r5, r9
  43814. 802eeb2: d394 bcc.n 802edde <tcp_write+0x15c>
  43815. /*
  43816. * Phase 1: If data has been added to the preallocated tail of
  43817. * last_unsent, we update the length fields of the pbuf chain.
  43818. */
  43819. #if TCP_OVERSIZE
  43820. if (oversize_used > 0) {
  43821. 802eeb4: f1ba 0f00 cmp.w sl, #0
  43822. 802eeb8: d019 beq.n 802eeee <tcp_write+0x26c>
  43823. struct pbuf *p;
  43824. /* Bump tot_len of whole chain, len of tail */
  43825. for (p = last_unsent->p; p; p = p->next) {
  43826. 802eeba: 6875 ldr r5, [r6, #4]
  43827. 802eebc: e011 b.n 802eee2 <tcp_write+0x260>
  43828. p->tot_len += oversize_used;
  43829. 802eebe: 892a ldrh r2, [r5, #8]
  43830. 802eec0: 4452 add r2, sl
  43831. 802eec2: 812a strh r2, [r5, #8]
  43832. if (p->next == NULL) {
  43833. 802eec4: 682a ldr r2, [r5, #0]
  43834. 802eec6: b95a cbnz r2, 802eee0 <tcp_write+0x25e>
  43835. TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent);
  43836. 802eec8: 686a ldr r2, [r5, #4]
  43837. 802eeca: 8968 ldrh r0, [r5, #10]
  43838. 802eecc: 9906 ldr r1, [sp, #24]
  43839. 802eece: 9305 str r3, [sp, #20]
  43840. 802eed0: 1810 adds r0, r2, r0
  43841. 802eed2: 4652 mov r2, sl
  43842. 802eed4: f7f2 fd3a bl 802194c <memcpy>
  43843. p->len += oversize_used;
  43844. 802eed8: 896a ldrh r2, [r5, #10]
  43845. 802eeda: 9b05 ldr r3, [sp, #20]
  43846. 802eedc: 4452 add r2, sl
  43847. 802eede: 816a strh r2, [r5, #10]
  43848. */
  43849. #if TCP_OVERSIZE
  43850. if (oversize_used > 0) {
  43851. struct pbuf *p;
  43852. /* Bump tot_len of whole chain, len of tail */
  43853. for (p = last_unsent->p; p; p = p->next) {
  43854. 802eee0: 682d ldr r5, [r5, #0]
  43855. 802eee2: 2d00 cmp r5, #0
  43856. 802eee4: d1eb bne.n 802eebe <tcp_write+0x23c>
  43857. if (p->next == NULL) {
  43858. TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent);
  43859. p->len += oversize_used;
  43860. }
  43861. }
  43862. last_unsent->len += oversize_used;
  43863. 802eee6: 8932 ldrh r2, [r6, #8]
  43864. 802eee8: 4492 add sl, r2
  43865. 802eeea: f8a6 a008 strh.w sl, [r6, #8]
  43866. LWIP_ASSERT("last_unsent->oversize_left >= oversize_used",
  43867. last_unsent->oversize_left >= oversize_used);
  43868. last_unsent->oversize_left -= oversize_used;
  43869. #endif /* TCP_OVERSIZE_DBGCHECK */
  43870. }
  43871. pcb->unsent_oversize = oversize;
  43872. 802eeee: f8bd 2036 ldrh.w r2, [sp, #54] ; 0x36
  43873. 802eef2: f8a4 206a strh.w r2, [r4, #106] ; 0x6a
  43874. #endif /* TCP_OVERSIZE */
  43875. /*
  43876. * Phase 2: concat_p can be concatenated onto last_unsent->p
  43877. */
  43878. if (concat_p != NULL) {
  43879. 802eef6: b157 cbz r7, 802ef0e <tcp_write+0x28c>
  43880. LWIP_ASSERT("tcp_write: cannot concatenate when pcb->unsent is empty",
  43881. (last_unsent != NULL));
  43882. pbuf_cat(last_unsent->p, concat_p);
  43883. 802eef8: 6870 ldr r0, [r6, #4]
  43884. 802eefa: 9305 str r3, [sp, #20]
  43885. 802eefc: 4639 mov r1, r7
  43886. 802eefe: f7fe f981 bl 802d204 <pbuf_cat>
  43887. last_unsent->len += concat_p->tot_len;
  43888. 802ef02: 8939 ldrh r1, [r7, #8]
  43889. 802ef04: 8932 ldrh r2, [r6, #8]
  43890. 802ef06: 9b05 ldr r3, [sp, #20]
  43891. 802ef08: 188a adds r2, r1, r2
  43892. 802ef0a: 8132 strh r2, [r6, #8]
  43893. 802ef0c: e003 b.n 802ef16 <tcp_write+0x294>
  43894. /*
  43895. * Phase 3: Append queue to pcb->unsent. Queue may be NULL, but that
  43896. * is harmless
  43897. */
  43898. if (last_unsent == NULL) {
  43899. 802ef0e: b916 cbnz r6, 802ef16 <tcp_write+0x294>
  43900. pcb->unsent = queue;
  43901. 802ef10: f8c4 806c str.w r8, [r4, #108] ; 0x6c
  43902. 802ef14: e001 b.n 802ef1a <tcp_write+0x298>
  43903. } else {
  43904. last_unsent->next = queue;
  43905. 802ef16: f8c6 8000 str.w r8, [r6]
  43906. }
  43907. /*
  43908. * Finally update the pcb state.
  43909. */
  43910. pcb->snd_lbb += len;
  43911. 802ef1a: 6de2 ldr r2, [r4, #92] ; 0x5c
  43912. pcb->snd_buf -= len;
  43913. pcb->snd_queuelen = queuelen;
  43914. 802ef1c: f8a4 b068 strh.w fp, [r4, #104] ; 0x68
  43915. }
  43916. /*
  43917. * Finally update the pcb state.
  43918. */
  43919. pcb->snd_lbb += len;
  43920. 802ef20: 444a add r2, r9
  43921. 802ef22: 65e2 str r2, [r4, #92] ; 0x5c
  43922. pcb->snd_buf -= len;
  43923. 802ef24: f8b4 2066 ldrh.w r2, [r4, #102] ; 0x66
  43924. 802ef28: ebc9 0902 rsb r9, r9, r2
  43925. 802ef2c: f8a4 9066 strh.w r9, [r4, #102] ; 0x66
  43926. LWIP_ASSERT("tcp_write: valid queue length",
  43927. pcb->unacked != NULL || pcb->unsent != NULL);
  43928. }
  43929. /* Set the PSH flag in the last segment that we enqueued. */
  43930. if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) {
  43931. 802ef30: b333 cbz r3, 802ef80 <tcp_write+0x2fe>
  43932. 802ef32: 68dc ldr r4, [r3, #12]
  43933. 802ef34: b30c cbz r4, 802ef7a <tcp_write+0x2f8>
  43934. 802ef36: 9b07 ldr r3, [sp, #28]
  43935. 802ef38: f003 0502 and.w r5, r3, #2
  43936. 802ef3c: b2ed uxtb r5, r5
  43937. 802ef3e: b9e5 cbnz r5, 802ef7a <tcp_write+0x2f8>
  43938. TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
  43939. 802ef40: 2008 movs r0, #8
  43940. 802ef42: 89a6 ldrh r6, [r4, #12]
  43941. 802ef44: f7fc ff36 bl 802bdb4 <lwip_htons>
  43942. 802ef48: 4330 orrs r0, r6
  43943. 802ef4a: 81a0 strh r0, [r4, #12]
  43944. 802ef4c: e015 b.n 802ef7a <tcp_write+0x2f8>
  43945. */
  43946. err_t
  43947. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  43948. {
  43949. struct pbuf *concat_p = NULL;
  43950. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  43951. 802ef4e: f04f 0800 mov.w r8, #0
  43952. 802ef52: 4647 mov r7, r8
  43953. TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
  43954. }
  43955. return ERR_OK;
  43956. memerr:
  43957. pcb->flags |= TF_NAGLEMEMERR;
  43958. 802ef54: 7fa3 ldrb r3, [r4, #30]
  43959. 802ef56: f063 037f orn r3, r3, #127 ; 0x7f
  43960. 802ef5a: 77a3 strb r3, [r4, #30]
  43961. TCP_STATS_INC(tcp.memerr);
  43962. if (concat_p != NULL) {
  43963. 802ef5c: b117 cbz r7, 802ef64 <tcp_write+0x2e2>
  43964. pbuf_free(concat_p);
  43965. 802ef5e: 4638 mov r0, r7
  43966. 802ef60: f7fe f866 bl 802d030 <pbuf_free>
  43967. }
  43968. if (queue != NULL) {
  43969. 802ef64: f1b8 0f00 cmp.w r8, #0
  43970. 802ef68: d009 beq.n 802ef7e <tcp_write+0x2fc>
  43971. tcp_segs_free(queue);
  43972. 802ef6a: 4640 mov r0, r8
  43973. 802ef6c: f7fe fb1b bl 802d5a6 <tcp_segs_free>
  43974. 802ef70: e005 b.n 802ef7e <tcp_write+0x2fc>
  43975. apiflags |= TCP_WRITE_FLAG_COPY;
  43976. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  43977. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n",
  43978. (void *)pcb, arg, len, (u16_t)apiflags));
  43979. LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)",
  43980. 802ef72: 23f2 movs r3, #242 ; 0xf2
  43981. 802ef74: e004 b.n 802ef80 <tcp_write+0x2fe>
  43982. if ((pcb->state != ESTABLISHED) &&
  43983. (pcb->state != CLOSE_WAIT) &&
  43984. (pcb->state != SYN_SENT) &&
  43985. (pcb->state != SYN_RCVD)) {
  43986. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n"));
  43987. return ERR_CONN;
  43988. 802ef76: 23f3 movs r3, #243 ; 0xf3
  43989. 802ef78: e002 b.n 802ef80 <tcp_write+0x2fe>
  43990. /* Set the PSH flag in the last segment that we enqueued. */
  43991. if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) {
  43992. TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
  43993. }
  43994. return ERR_OK;
  43995. 802ef7a: 2300 movs r3, #0
  43996. 802ef7c: e000 b.n 802ef80 <tcp_write+0x2fe>
  43997. if (pcb->snd_queuelen != 0) {
  43998. LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != NULL ||
  43999. pcb->unsent != NULL);
  44000. }
  44001. LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_write: %"S16_F" (with mem err)\n", pcb->snd_queuelen));
  44002. return ERR_MEM;
  44003. 802ef7e: 23ff movs r3, #255 ; 0xff
  44004. 802ef80: b258 sxtb r0, r3
  44005. }
  44006. 802ef82: b00f add sp, #60 ; 0x3c
  44007. 802ef84: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  44008. 0802ef88 <tcp_enqueue_flags>:
  44009. LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)",
  44010. (flags & (TCP_SYN | TCP_FIN)) != 0);
  44011. /* check for configured max queuelen and possible overflow */
  44012. if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  44013. 802ef88: f8b0 3068 ldrh.w r3, [r0, #104] ; 0x68
  44014. 802ef8c: 2b47 cmp r3, #71 ; 0x47
  44015. * @param optdata pointer to TCP options, or NULL.
  44016. * @param optlen length of TCP options in bytes.
  44017. */
  44018. err_t
  44019. tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)
  44020. {
  44021. 802ef8e: b573 push {r0, r1, r4, r5, r6, lr}
  44022. 802ef90: 4604 mov r4, r0
  44023. 802ef92: 460d mov r5, r1
  44024. LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)",
  44025. (flags & (TCP_SYN | TCP_FIN)) != 0);
  44026. /* check for configured max queuelen and possible overflow */
  44027. if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  44028. 802ef94: d900 bls.n 802ef98 <tcp_enqueue_flags+0x10>
  44029. 802ef96: e014 b.n 802efc2 <tcp_enqueue_flags+0x3a>
  44030. /* tcp_enqueue_flags is always called with either SYN or FIN in flags.
  44031. * We need one available snd_buf byte to do that.
  44032. * This means we can't send FIN while snd_buf==0. A better fix would be to
  44033. * not include SYN and FIN sequence numbers in the snd_buf count. */
  44034. if (pcb->snd_buf == 0) {
  44035. 802ef98: f8b0 3066 ldrh.w r3, [r0, #102] ; 0x66
  44036. err_t
  44037. tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)
  44038. {
  44039. struct pbuf *p;
  44040. struct tcp_seg *seg;
  44041. u8_t optflags = 0;
  44042. 802ef9c: f3c1 0640 ubfx r6, r1, #1, #1
  44043. #if LWIP_TCP_TIMESTAMPS
  44044. if ((pcb->flags & TF_TIMESTAMP)) {
  44045. optflags |= TF_SEG_OPTS_TS;
  44046. }
  44047. #endif /* LWIP_TCP_TIMESTAMPS */
  44048. optlen = LWIP_TCP_OPT_LENGTH(optflags);
  44049. 802efa0: 00b1 lsls r1, r6, #2
  44050. /* tcp_enqueue_flags is always called with either SYN or FIN in flags.
  44051. * We need one available snd_buf byte to do that.
  44052. * This means we can't send FIN while snd_buf==0. A better fix would be to
  44053. * not include SYN and FIN sequence numbers in the snd_buf count. */
  44054. if (pcb->snd_buf == 0) {
  44055. 802efa2: 2b00 cmp r3, #0
  44056. 802efa4: d038 beq.n 802f018 <tcp_enqueue_flags+0x90>
  44057. TCP_STATS_INC(tcp.memerr);
  44058. return ERR_MEM;
  44059. }
  44060. /* Allocate pbuf with room for TCP header + options */
  44061. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  44062. 802efa6: 2000 movs r0, #0
  44063. 802efa8: 4602 mov r2, r0
  44064. 802efaa: f7fe f88e bl 802d0ca <pbuf_alloc>
  44065. 802efae: 4601 mov r1, r0
  44066. 802efb0: b900 cbnz r0, 802efb4 <tcp_enqueue_flags+0x2c>
  44067. 802efb2: e006 b.n 802efc2 <tcp_enqueue_flags+0x3a>
  44068. }
  44069. LWIP_ASSERT("tcp_enqueue_flags: check that first pbuf can hold optlen",
  44070. (p->len >= optlen));
  44071. /* Allocate memory for tcp_seg, and fill in fields. */
  44072. if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) {
  44073. 802efb4: 9600 str r6, [sp, #0]
  44074. 802efb6: 4620 mov r0, r4
  44075. 802efb8: 462a mov r2, r5
  44076. 802efba: 6de3 ldr r3, [r4, #92] ; 0x5c
  44077. 802efbc: f7ff fde2 bl 802eb84 <tcp_create_segment>
  44078. 802efc0: b920 cbnz r0, 802efcc <tcp_enqueue_flags+0x44>
  44079. pcb->flags |= TF_NAGLEMEMERR;
  44080. 802efc2: 7fa3 ldrb r3, [r4, #30]
  44081. 802efc4: f063 037f orn r3, r3, #127 ; 0x7f
  44082. 802efc8: 77a3 strb r3, [r4, #30]
  44083. 802efca: e025 b.n 802f018 <tcp_enqueue_flags+0x90>
  44084. ntohl(seg->tcphdr->seqno),
  44085. ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg),
  44086. (u16_t)flags));
  44087. /* Now append seg to pcb->unsent queue */
  44088. if (pcb->unsent == NULL) {
  44089. 802efcc: 6ee3 ldr r3, [r4, #108] ; 0x6c
  44090. 802efce: b913 cbnz r3, 802efd6 <tcp_enqueue_flags+0x4e>
  44091. pcb->unsent = seg;
  44092. 802efd0: 66e0 str r0, [r4, #108] ; 0x6c
  44093. 802efd2: e004 b.n 802efde <tcp_enqueue_flags+0x56>
  44094. } else {
  44095. struct tcp_seg *useg;
  44096. for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);
  44097. 802efd4: 4613 mov r3, r2
  44098. 802efd6: 681a ldr r2, [r3, #0]
  44099. 802efd8: 2a00 cmp r2, #0
  44100. 802efda: d1fb bne.n 802efd4 <tcp_enqueue_flags+0x4c>
  44101. useg->next = seg;
  44102. 802efdc: 6018 str r0, [r3, #0]
  44103. }
  44104. #if TCP_OVERSIZE
  44105. /* The new unsent tail has no space */
  44106. pcb->unsent_oversize = 0;
  44107. 802efde: 2300 movs r3, #0
  44108. #endif /* TCP_OVERSIZE */
  44109. /* SYN and FIN bump the sequence number */
  44110. if ((flags & TCP_SYN) || (flags & TCP_FIN)) {
  44111. 802efe0: 07a9 lsls r1, r5, #30
  44112. for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);
  44113. useg->next = seg;
  44114. }
  44115. #if TCP_OVERSIZE
  44116. /* The new unsent tail has no space */
  44117. pcb->unsent_oversize = 0;
  44118. 802efe2: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  44119. #endif /* TCP_OVERSIZE */
  44120. /* SYN and FIN bump the sequence number */
  44121. if ((flags & TCP_SYN) || (flags & TCP_FIN)) {
  44122. 802efe6: d007 beq.n 802eff8 <tcp_enqueue_flags+0x70>
  44123. pcb->snd_lbb++;
  44124. 802efe8: 6de3 ldr r3, [r4, #92] ; 0x5c
  44125. 802efea: 3301 adds r3, #1
  44126. 802efec: 65e3 str r3, [r4, #92] ; 0x5c
  44127. /* optlen does not influence snd_buf */
  44128. pcb->snd_buf--;
  44129. 802efee: f8b4 3066 ldrh.w r3, [r4, #102] ; 0x66
  44130. 802eff2: 3b01 subs r3, #1
  44131. 802eff4: f8a4 3066 strh.w r3, [r4, #102] ; 0x66
  44132. }
  44133. if (flags & TCP_FIN) {
  44134. 802eff8: 07ea lsls r2, r5, #31
  44135. 802effa: d503 bpl.n 802f004 <tcp_enqueue_flags+0x7c>
  44136. pcb->flags |= TF_FIN;
  44137. 802effc: 7fa3 ldrb r3, [r4, #30]
  44138. 802effe: f043 0320 orr.w r3, r3, #32
  44139. 802f002: 77a3 strb r3, [r4, #30]
  44140. }
  44141. /* update number of segments on the queues */
  44142. pcb->snd_queuelen += pbuf_clen(seg->p);
  44143. 802f004: 6840 ldr r0, [r0, #4]
  44144. 802f006: f8b4 5068 ldrh.w r5, [r4, #104] ; 0x68
  44145. 802f00a: f7fe f8e5 bl 802d1d8 <pbuf_clen>
  44146. 802f00e: 1940 adds r0, r0, r5
  44147. 802f010: f8a4 0068 strh.w r0, [r4, #104] ; 0x68
  44148. if (pcb->snd_queuelen != 0) {
  44149. LWIP_ASSERT("tcp_enqueue_flags: invalid queue length",
  44150. pcb->unacked != NULL || pcb->unsent != NULL);
  44151. }
  44152. return ERR_OK;
  44153. 802f014: 2000 movs r0, #0
  44154. 802f016: e000 b.n 802f01a <tcp_enqueue_flags+0x92>
  44155. * This means we can't send FIN while snd_buf==0. A better fix would be to
  44156. * not include SYN and FIN sequence numbers in the snd_buf count. */
  44157. if (pcb->snd_buf == 0) {
  44158. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue_flags: no send buffer available\n"));
  44159. TCP_STATS_INC(tcp.memerr);
  44160. return ERR_MEM;
  44161. 802f018: 20ff movs r0, #255 ; 0xff
  44162. LWIP_ASSERT("tcp_enqueue_flags: invalid queue length",
  44163. pcb->unacked != NULL || pcb->unsent != NULL);
  44164. }
  44165. return ERR_OK;
  44166. }
  44167. 802f01a: b240 sxtb r0, r0
  44168. 802f01c: bd7c pop {r2, r3, r4, r5, r6, pc}
  44169. 0802f01e <tcp_send_fin>:
  44170. * @param pcb the tcp_pcb over which to send a segment
  44171. * @return ERR_OK if sent, another err_t otherwise
  44172. */
  44173. err_t
  44174. tcp_send_fin(struct tcp_pcb *pcb)
  44175. {
  44176. 802f01e: b5f8 push {r3, r4, r5, r6, r7, lr}
  44177. /* first, try to add the fin to the last unsent segment */
  44178. if (pcb->unsent != NULL) {
  44179. 802f020: 6ec4 ldr r4, [r0, #108] ; 0x6c
  44180. * @param pcb the tcp_pcb over which to send a segment
  44181. * @return ERR_OK if sent, another err_t otherwise
  44182. */
  44183. err_t
  44184. tcp_send_fin(struct tcp_pcb *pcb)
  44185. {
  44186. 802f022: 4605 mov r5, r0
  44187. /* first, try to add the fin to the last unsent segment */
  44188. if (pcb->unsent != NULL) {
  44189. 802f024: b90c cbnz r4, 802f02a <tcp_send_fin+0xc>
  44190. 802f026: e00a b.n 802f03e <tcp_send_fin+0x20>
  44191. struct tcp_seg *last_unsent;
  44192. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  44193. last_unsent = last_unsent->next);
  44194. 802f028: 461c mov r4, r3
  44195. tcp_send_fin(struct tcp_pcb *pcb)
  44196. {
  44197. /* first, try to add the fin to the last unsent segment */
  44198. if (pcb->unsent != NULL) {
  44199. struct tcp_seg *last_unsent;
  44200. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  44201. 802f02a: 6823 ldr r3, [r4, #0]
  44202. 802f02c: 2b00 cmp r3, #0
  44203. 802f02e: d1fb bne.n 802f028 <tcp_send_fin+0xa>
  44204. last_unsent = last_unsent->next);
  44205. if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {
  44206. 802f030: 68e3 ldr r3, [r4, #12]
  44207. 802f032: 8998 ldrh r0, [r3, #12]
  44208. 802f034: f7fc fec3 bl 802bdbe <lwip_ntohs>
  44209. 802f038: f010 0607 ands.w r6, r0, #7
  44210. 802f03c: d005 beq.n 802f04a <tcp_send_fin+0x2c>
  44211. pcb->flags |= TF_FIN;
  44212. return ERR_OK;
  44213. }
  44214. }
  44215. /* no data, no length, flags, copy=1, no optdata */
  44216. return tcp_enqueue_flags(pcb, TCP_FIN);
  44217. 802f03e: 4628 mov r0, r5
  44218. 802f040: 2101 movs r1, #1
  44219. }
  44220. 802f042: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  44221. pcb->flags |= TF_FIN;
  44222. return ERR_OK;
  44223. }
  44224. }
  44225. /* no data, no length, flags, copy=1, no optdata */
  44226. return tcp_enqueue_flags(pcb, TCP_FIN);
  44227. 802f046: f7ff bf9f b.w 802ef88 <tcp_enqueue_flags>
  44228. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  44229. last_unsent = last_unsent->next);
  44230. if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {
  44231. /* no SYN/FIN/RST flag in the header, we can add the FIN flag */
  44232. TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN);
  44233. 802f04a: 68e4 ldr r4, [r4, #12]
  44234. 802f04c: 2001 movs r0, #1
  44235. 802f04e: 89a7 ldrh r7, [r4, #12]
  44236. 802f050: f7fc feb0 bl 802bdb4 <lwip_htons>
  44237. 802f054: 4338 orrs r0, r7
  44238. 802f056: 81a0 strh r0, [r4, #12]
  44239. pcb->flags |= TF_FIN;
  44240. 802f058: 7fab ldrb r3, [r5, #30]
  44241. 802f05a: f043 0320 orr.w r3, r3, #32
  44242. 802f05e: 77ab strb r3, [r5, #30]
  44243. return ERR_OK;
  44244. }
  44245. }
  44246. /* no data, no length, flags, copy=1, no optdata */
  44247. return tcp_enqueue_flags(pcb, TCP_FIN);
  44248. }
  44249. 802f060: 4630 mov r0, r6
  44250. 802f062: bdf8 pop {r3, r4, r5, r6, r7, pc}
  44251. 0802f064 <tcp_send_empty_ack>:
  44252. *
  44253. * @param pcb Protocol control block for the TCP connection to send the ACK
  44254. */
  44255. err_t
  44256. tcp_send_empty_ack(struct tcp_pcb *pcb)
  44257. {
  44258. 802f064: b537 push {r0, r1, r2, r4, r5, lr}
  44259. 802f066: 4604 mov r4, r0
  44260. if (pcb->flags & TF_TIMESTAMP) {
  44261. optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS);
  44262. }
  44263. #endif
  44264. p = tcp_output_alloc_header(pcb, optlen, 0, htonl(pcb->snd_nxt));
  44265. 802f068: 6d00 ldr r0, [r0, #80] ; 0x50
  44266. 802f06a: f7fc fead bl 802bdc8 <lwip_htonl>
  44267. 802f06e: 2100 movs r1, #0
  44268. 802f070: 4602 mov r2, r0
  44269. 802f072: 4620 mov r0, r4
  44270. 802f074: f7ff fdd8 bl 802ec28 <tcp_output_alloc_header.constprop.0>
  44271. if (p == NULL) {
  44272. 802f078: 4605 mov r5, r0
  44273. 802f07a: b188 cbz r0, 802f0a0 <tcp_send_empty_ack+0x3c>
  44274. }
  44275. tcphdr = (struct tcp_hdr *)p->payload;
  44276. LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
  44277. ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
  44278. /* remove ACK flags from the PCB, as we send an empty ACK now */
  44279. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  44280. 802f07c: 7fa3 ldrb r3, [r4, #30]
  44281. #endif
  44282. #if LWIP_NETIF_HWADDRHINT
  44283. ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  44284. IP_PROTO_TCP, &(pcb->addr_hint));
  44285. #else /* LWIP_NETIF_HWADDRHINT*/
  44286. ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  44287. 802f07e: 7a62 ldrb r2, [r4, #9]
  44288. }
  44289. tcphdr = (struct tcp_hdr *)p->payload;
  44290. LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
  44291. ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
  44292. /* remove ACK flags from the PCB, as we send an empty ACK now */
  44293. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  44294. 802f080: f023 0303 bic.w r3, r3, #3
  44295. #endif
  44296. #if LWIP_NETIF_HWADDRHINT
  44297. ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  44298. IP_PROTO_TCP, &(pcb->addr_hint));
  44299. #else /* LWIP_NETIF_HWADDRHINT*/
  44300. ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  44301. 802f084: 9200 str r2, [sp, #0]
  44302. 802f086: 2206 movs r2, #6
  44303. }
  44304. tcphdr = (struct tcp_hdr *)p->payload;
  44305. LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
  44306. ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
  44307. /* remove ACK flags from the PCB, as we send an empty ACK now */
  44308. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  44309. 802f088: 77a3 strb r3, [r4, #30]
  44310. #endif
  44311. #if LWIP_NETIF_HWADDRHINT
  44312. ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  44313. IP_PROTO_TCP, &(pcb->addr_hint));
  44314. #else /* LWIP_NETIF_HWADDRHINT*/
  44315. ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  44316. 802f08a: 9201 str r2, [sp, #4]
  44317. 802f08c: 7aa3 ldrb r3, [r4, #10]
  44318. 802f08e: 4621 mov r1, r4
  44319. 802f090: 1d22 adds r2, r4, #4
  44320. 802f092: f001 f8ab bl 80301ec <ip_output>
  44321. IP_PROTO_TCP);
  44322. #endif /* LWIP_NETIF_HWADDRHINT*/
  44323. pbuf_free(p);
  44324. 802f096: 4628 mov r0, r5
  44325. 802f098: f7fd ffca bl 802d030 <pbuf_free>
  44326. return ERR_OK;
  44327. 802f09c: 2000 movs r0, #0
  44328. 802f09e: e000 b.n 802f0a2 <tcp_send_empty_ack+0x3e>
  44329. #endif
  44330. p = tcp_output_alloc_header(pcb, optlen, 0, htonl(pcb->snd_nxt));
  44331. if (p == NULL) {
  44332. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n"));
  44333. return ERR_BUF;
  44334. 802f0a0: 20fe movs r0, #254 ; 0xfe
  44335. IP_PROTO_TCP);
  44336. #endif /* LWIP_NETIF_HWADDRHINT*/
  44337. pbuf_free(p);
  44338. return ERR_OK;
  44339. }
  44340. 802f0a2: b240 sxtb r0, r0
  44341. 802f0a4: bd3e pop {r1, r2, r3, r4, r5, pc}
  44342. 802f0a6: 0000 movs r0, r0
  44343. 0802f0a8 <tcp_output>:
  44344. /* First, check if we are invoked by the TCP input processing
  44345. code. If so, we do not output anything. Instead, we rely on the
  44346. input processing code to call us when input processing is done
  44347. with. */
  44348. if (tcp_input_pcb == pcb) {
  44349. 802f0a8: 4b8f ldr r3, [pc, #572] ; (802f2e8 <tcp_output+0x240>)
  44350. 802f0aa: 681b ldr r3, [r3, #0]
  44351. 802f0ac: 4283 cmp r3, r0
  44352. * @return ERR_OK if data has been sent or nothing to send
  44353. * another err_t on error
  44354. */
  44355. err_t
  44356. tcp_output(struct tcp_pcb *pcb)
  44357. {
  44358. 802f0ae: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  44359. 802f0b2: 4604 mov r4, r0
  44360. /* First, check if we are invoked by the TCP input processing
  44361. code. If so, we do not output anything. Instead, we rely on the
  44362. input processing code to call us when input processing is done
  44363. with. */
  44364. if (tcp_input_pcb == pcb) {
  44365. 802f0b4: f000 8113 beq.w 802f2de <tcp_output+0x236>
  44366. return ERR_OK;
  44367. }
  44368. wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);
  44369. 802f0b8: f8b0 304c ldrh.w r3, [r0, #76] ; 0x4c
  44370. 802f0bc: f8b0 9060 ldrh.w r9, [r0, #96] ; 0x60
  44371. seg = pcb->unsent;
  44372. 802f0c0: 6ec5 ldr r5, [r0, #108] ; 0x6c
  44373. with. */
  44374. if (tcp_input_pcb == pcb) {
  44375. return ERR_OK;
  44376. }
  44377. wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);
  44378. 802f0c2: 4599 cmp r9, r3
  44379. 802f0c4: bf28 it cs
  44380. 802f0c6: 4699 movcs r9, r3
  44381. * because the ->unsent queue is empty or because the window does
  44382. * not allow it), construct an empty ACK segment and send it.
  44383. *
  44384. * If data is to be sent, we will just piggyback the ACK (see below).
  44385. */
  44386. if (pcb->flags & TF_ACK_NOW &&
  44387. 802f0c8: 7f83 ldrb r3, [r0, #30]
  44388. 802f0ca: f003 0302 and.w r3, r3, #2
  44389. 802f0ce: b2db uxtb r3, r3
  44390. 802f0d0: b183 cbz r3, 802f0f4 <tcp_output+0x4c>
  44391. 802f0d2: b92d cbnz r5, 802f0e0 <tcp_output+0x38>
  44392. (seg == NULL ||
  44393. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  44394. return tcp_send_empty_ack(pcb);
  44395. 802f0d4: 4620 mov r0, r4
  44396. }
  44397. #endif /* TCP_OVERSIZE */
  44398. pcb->flags &= ~TF_NAGLEMEMERR;
  44399. return ERR_OK;
  44400. }
  44401. 802f0d6: b003 add sp, #12
  44402. 802f0d8: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  44403. * If data is to be sent, we will just piggyback the ACK (see below).
  44404. */
  44405. if (pcb->flags & TF_ACK_NOW &&
  44406. (seg == NULL ||
  44407. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  44408. return tcp_send_empty_ack(pcb);
  44409. 802f0dc: f7ff bfc2 b.w 802f064 <tcp_send_empty_ack>
  44410. *
  44411. * If data is to be sent, we will just piggyback the ACK (see below).
  44412. */
  44413. if (pcb->flags & TF_ACK_NOW &&
  44414. (seg == NULL ||
  44415. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  44416. 802f0e0: 68eb ldr r3, [r5, #12]
  44417. 802f0e2: 6858 ldr r0, [r3, #4]
  44418. 802f0e4: f7fc fe72 bl 802bdcc <lwip_ntohl>
  44419. 802f0e8: 892a ldrh r2, [r5, #8]
  44420. 802f0ea: 6ca3 ldr r3, [r4, #72] ; 0x48
  44421. 802f0ec: 1ad3 subs r3, r2, r3
  44422. 802f0ee: 1818 adds r0, r3, r0
  44423. * not allow it), construct an empty ACK segment and send it.
  44424. *
  44425. * If data is to be sent, we will just piggyback the ACK (see below).
  44426. */
  44427. if (pcb->flags & TF_ACK_NOW &&
  44428. (seg == NULL ||
  44429. 802f0f0: 4548 cmp r0, r9
  44430. 802f0f2: d8ef bhi.n 802f0d4 <tcp_output+0x2c>
  44431. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  44432. return tcp_send_empty_ack(pcb);
  44433. }
  44434. /* useg should point to last segment on unacked queue */
  44435. useg = pcb->unacked;
  44436. 802f0f4: 6f26 ldr r6, [r4, #112] ; 0x70
  44437. if (useg != NULL) {
  44438. 802f0f6: b90e cbnz r6, 802f0fc <tcp_output+0x54>
  44439. 802f0f8: e0d1 b.n 802f29e <tcp_output+0x1f6>
  44440. for (; useg->next != NULL; useg = useg->next);
  44441. 802f0fa: 461e mov r6, r3
  44442. 802f0fc: 6833 ldr r3, [r6, #0]
  44443. 802f0fe: 2b00 cmp r3, #0
  44444. 802f100: d1fb bne.n 802f0fa <tcp_output+0x52>
  44445. 802f102: e0cc b.n 802f29e <tcp_output+0x1f6>
  44446. }
  44447. #endif /* TCP_CWND_DEBUG */
  44448. /* data available and window allows it to be sent? */
  44449. while (seg != NULL &&
  44450. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
  44451. LWIP_ASSERT("RST not expected here!",
  44452. 802f104: 68eb ldr r3, [r5, #12]
  44453. 802f106: 8998 ldrh r0, [r3, #12]
  44454. 802f108: f7fc fe59 bl 802bdbe <lwip_ntohs>
  44455. * - if tcp_write had a memory error before (prevent delayed ACK timeout) or
  44456. * - if FIN was already enqueued for this PCB (SYN is always alone in a segment -
  44457. * either seg->next != NULL or pcb->unacked == NULL;
  44458. * RST is no sent using tcp_write/tcp_output.
  44459. */
  44460. if((tcp_do_output_nagle(pcb) == 0) &&
  44461. 802f10c: 6f23 ldr r3, [r4, #112] ; 0x70
  44462. 802f10e: b19b cbz r3, 802f138 <tcp_output+0x90>
  44463. 802f110: 7fa2 ldrb r2, [r4, #30]
  44464. 802f112: f012 0f44 tst.w r2, #68 ; 0x44
  44465. 802f116: d10f bne.n 802f138 <tcp_output+0x90>
  44466. 802f118: 6ee3 ldr r3, [r4, #108] ; 0x6c
  44467. 802f11a: b12b cbz r3, 802f128 <tcp_output+0x80>
  44468. 802f11c: 6819 ldr r1, [r3, #0]
  44469. 802f11e: b959 cbnz r1, 802f138 <tcp_output+0x90>
  44470. 802f120: 8919 ldrh r1, [r3, #8]
  44471. 802f122: 8ee3 ldrh r3, [r4, #54] ; 0x36
  44472. 802f124: 4299 cmp r1, r3
  44473. 802f126: d207 bcs.n 802f138 <tcp_output+0x90>
  44474. 802f128: f8b4 3066 ldrh.w r3, [r4, #102] ; 0x66
  44475. 802f12c: b123 cbz r3, 802f138 <tcp_output+0x90>
  44476. 802f12e: f8b4 3068 ldrh.w r3, [r4, #104] ; 0x68
  44477. 802f132: 2b47 cmp r3, #71 ; 0x47
  44478. 802f134: f240 80ce bls.w 802f2d4 <tcp_output+0x22c>
  44479. pcb->lastack,
  44480. ntohl(seg->tcphdr->seqno), pcb->lastack, i));
  44481. ++i;
  44482. #endif /* TCP_CWND_DEBUG */
  44483. pcb->unsent = seg->next;
  44484. 802f138: 682b ldr r3, [r5, #0]
  44485. 802f13a: 66e3 str r3, [r4, #108] ; 0x6c
  44486. if (pcb->state != SYN_SENT) {
  44487. 802f13c: 7e23 ldrb r3, [r4, #24]
  44488. 802f13e: 2b02 cmp r3, #2
  44489. 802f140: d00c beq.n 802f15c <tcp_output+0xb4>
  44490. TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
  44491. 802f142: 68ef ldr r7, [r5, #12]
  44492. 802f144: 2010 movs r0, #16
  44493. 802f146: f8b7 b00c ldrh.w fp, [r7, #12]
  44494. 802f14a: f7fc fe33 bl 802bdb4 <lwip_htons>
  44495. 802f14e: ea40 000b orr.w r0, r0, fp
  44496. 802f152: 81b8 strh r0, [r7, #12]
  44497. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  44498. 802f154: 7fa3 ldrb r3, [r4, #30]
  44499. 802f156: f023 0303 bic.w r3, r3, #3
  44500. 802f15a: 77a3 strb r3, [r4, #30]
  44501. u16_t len;
  44502. struct netif *netif;
  44503. u32_t *opts;
  44504. /** @bug Exclude retransmitted segments from this count. */
  44505. snmp_inc_tcpoutsegs();
  44506. 802f15c: f002 fd48 bl 8031bf0 <snmp_inc_tcpoutsegs>
  44507. /* The TCP header has already been constructed, but the ackno and
  44508. wnd fields remain. */
  44509. seg->tcphdr->ackno = htonl(pcb->rcv_nxt);
  44510. 802f160: 6aa0 ldr r0, [r4, #40] ; 0x28
  44511. 802f162: 68ef ldr r7, [r5, #12]
  44512. 802f164: f7fc fe30 bl 802bdc8 <lwip_htonl>
  44513. 802f168: 60b8 str r0, [r7, #8]
  44514. /* advertise our receive window size in this TCP segment */
  44515. seg->tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  44516. 802f16a: 8de0 ldrh r0, [r4, #46] ; 0x2e
  44517. 802f16c: 68ef ldr r7, [r5, #12]
  44518. 802f16e: f7fc fe21 bl 802bdb4 <lwip_htons>
  44519. 802f172: 81f8 strh r0, [r7, #14]
  44520. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  44521. 802f174: 8de2 ldrh r2, [r4, #46] ; 0x2e
  44522. 802f176: 6aa3 ldr r3, [r4, #40] ; 0x28
  44523. /* Add any requested options. NB MSS option is only set on SYN
  44524. packets, so ignore it here */
  44525. opts = (u32_t *)(void *)(seg->tcphdr + 1);
  44526. 802f178: 68ef ldr r7, [r5, #12]
  44527. seg->tcphdr->ackno = htonl(pcb->rcv_nxt);
  44528. /* advertise our receive window size in this TCP segment */
  44529. seg->tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  44530. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  44531. 802f17a: 18d3 adds r3, r2, r3
  44532. 802f17c: 6323 str r3, [r4, #48] ; 0x30
  44533. /* Add any requested options. NB MSS option is only set on SYN
  44534. packets, so ignore it here */
  44535. opts = (u32_t *)(void *)(seg->tcphdr + 1);
  44536. if (seg->flags & TF_SEG_OPTS_MSS) {
  44537. 802f17e: 7aab ldrb r3, [r5, #10]
  44538. 802f180: 07d8 lsls r0, r3, #31
  44539. 802f182: d509 bpl.n 802f198 <tcp_output+0xf0>
  44540. u16_t mss;
  44541. #if TCP_CALCULATE_EFF_SEND_MSS
  44542. mss = tcp_eff_send_mss(TCP_MSS, &pcb->remote_ip);
  44543. 802f184: 4641 mov r1, r8
  44544. 802f186: f240 50b4 movw r0, #1460 ; 0x5b4
  44545. 802f18a: f7fe fde4 bl 802dd56 <tcp_eff_send_mss>
  44546. #else /* TCP_CALCULATE_EFF_SEND_MSS */
  44547. mss = TCP_MSS;
  44548. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  44549. *opts = TCP_BUILD_MSS_OPTION(mss);
  44550. 802f18e: f040 7001 orr.w r0, r0, #33816576 ; 0x2040000
  44551. 802f192: f7fc fe19 bl 802bdc8 <lwip_htonl>
  44552. 802f196: 6178 str r0, [r7, #20]
  44553. }
  44554. #endif
  44555. /* Set retransmission timer running if it is not currently enabled
  44556. This must be set before checking the route. */
  44557. if (pcb->rtime == -1) {
  44558. 802f198: f9b4 3034 ldrsh.w r3, [r4, #52] ; 0x34
  44559. 802f19c: 3301 adds r3, #1
  44560. 802f19e: d101 bne.n 802f1a4 <tcp_output+0xfc>
  44561. pcb->rtime = 0;
  44562. 802f1a0: 2300 movs r3, #0
  44563. 802f1a2: 86a3 strh r3, [r4, #52] ; 0x34
  44564. }
  44565. /* If we don't have a local IP address, we get one by
  44566. calling ip_route(). */
  44567. if (ip_addr_isany(&(pcb->local_ip))) {
  44568. 802f1a4: 6823 ldr r3, [r4, #0]
  44569. 802f1a6: b92b cbnz r3, 802f1b4 <tcp_output+0x10c>
  44570. netif = ip_route(&(pcb->remote_ip));
  44571. 802f1a8: 4640 mov r0, r8
  44572. 802f1aa: f000 fecb bl 802ff44 <ip_route>
  44573. if (netif == NULL) {
  44574. 802f1ae: b310 cbz r0, 802f1f6 <tcp_output+0x14e>
  44575. return;
  44576. }
  44577. ip_addr_copy(pcb->local_ip, netif->ip_addr);
  44578. 802f1b0: 6843 ldr r3, [r0, #4]
  44579. 802f1b2: 6023 str r3, [r4, #0]
  44580. }
  44581. if (pcb->rttest == 0) {
  44582. 802f1b4: 6ba3 ldr r3, [r4, #56] ; 0x38
  44583. 802f1b6: b93b cbnz r3, 802f1c8 <tcp_output+0x120>
  44584. pcb->rttest = tcp_ticks;
  44585. 802f1b8: f8da 3000 ldr.w r3, [sl]
  44586. 802f1bc: 63a3 str r3, [r4, #56] ; 0x38
  44587. pcb->rtseq = ntohl(seg->tcphdr->seqno);
  44588. 802f1be: 68eb ldr r3, [r5, #12]
  44589. 802f1c0: 6858 ldr r0, [r3, #4]
  44590. 802f1c2: f7fc fe03 bl 802bdcc <lwip_ntohl>
  44591. 802f1c6: 63e0 str r0, [r4, #60] ; 0x3c
  44592. }
  44593. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n",
  44594. htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) +
  44595. seg->len));
  44596. len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
  44597. 802f1c8: 6868 ldr r0, [r5, #4]
  44598. 802f1ca: 68eb ldr r3, [r5, #12]
  44599. 802f1cc: 6842 ldr r2, [r0, #4]
  44600. seg->p->len -= len;
  44601. 802f1ce: 8941 ldrh r1, [r0, #10]
  44602. seg->p->tot_len -= len;
  44603. seg->p->payload = seg->tcphdr;
  44604. 802f1d0: 6043 str r3, [r0, #4]
  44605. }
  44606. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n",
  44607. htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) +
  44608. seg->len));
  44609. len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
  44610. 802f1d2: 1a9a subs r2, r3, r2
  44611. seg->p->len -= len;
  44612. 802f1d4: 1a89 subs r1, r1, r2
  44613. 802f1d6: 8141 strh r1, [r0, #10]
  44614. seg->p->tot_len -= len;
  44615. 802f1d8: 8901 ldrh r1, [r0, #8]
  44616. 802f1da: 1a8a subs r2, r1, r2
  44617. 802f1dc: 8102 strh r2, [r0, #8]
  44618. seg->p->payload = seg->tcphdr;
  44619. seg->tcphdr->chksum = 0;
  44620. 802f1de: 2200 movs r2, #0
  44621. 802f1e0: 741a strb r2, [r3, #16]
  44622. 802f1e2: 745a strb r2, [r3, #17]
  44623. #if LWIP_NETIF_HWADDRHINT
  44624. ip_output_hinted(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  44625. IP_PROTO_TCP, &(pcb->addr_hint));
  44626. #else /* LWIP_NETIF_HWADDRHINT*/
  44627. ip_output(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  44628. 802f1e4: 7a62 ldrb r2, [r4, #9]
  44629. 802f1e6: 7aa3 ldrb r3, [r4, #10]
  44630. 802f1e8: 9200 str r2, [sp, #0]
  44631. 802f1ea: 2206 movs r2, #6
  44632. 802f1ec: 9201 str r2, [sp, #4]
  44633. 802f1ee: 4621 mov r1, r4
  44634. 802f1f0: 4642 mov r2, r8
  44635. 802f1f2: f000 fffb bl 80301ec <ip_output>
  44636. TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
  44637. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  44638. }
  44639. tcp_output_segment(seg, pcb);
  44640. snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
  44641. 802f1f6: 68eb ldr r3, [r5, #12]
  44642. 802f1f8: 6858 ldr r0, [r3, #4]
  44643. 802f1fa: f7fc fde7 bl 802bdcc <lwip_ntohl>
  44644. 802f1fe: 68ea ldr r2, [r5, #12]
  44645. 802f200: f8b5 b008 ldrh.w fp, [r5, #8]
  44646. 802f204: 4607 mov r7, r0
  44647. 802f206: 8990 ldrh r0, [r2, #12]
  44648. 802f208: f7fc fdd9 bl 802bdbe <lwip_ntohs>
  44649. 802f20c: f010 0003 ands.w r0, r0, #3
  44650. 802f210: bf18 it ne
  44651. 802f212: 2001 movne r0, #1
  44652. if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
  44653. 802f214: 6d22 ldr r2, [r4, #80] ; 0x50
  44654. TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
  44655. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  44656. }
  44657. tcp_output_segment(seg, pcb);
  44658. snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
  44659. 802f216: eb0b 0300 add.w r3, fp, r0
  44660. 802f21a: 19db adds r3, r3, r7
  44661. if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
  44662. 802f21c: 1ad2 subs r2, r2, r3
  44663. 802f21e: 2a00 cmp r2, #0
  44664. pcb->snd_nxt = snd_nxt;
  44665. 802f220: bfb8 it lt
  44666. 802f222: 6523 strlt r3, [r4, #80] ; 0x50
  44667. }
  44668. /* put segment on unacknowledged list if length > 0 */
  44669. if (TCP_TCPLEN(seg) > 0) {
  44670. 802f224: 68eb ldr r3, [r5, #12]
  44671. 802f226: 892f ldrh r7, [r5, #8]
  44672. 802f228: 8998 ldrh r0, [r3, #12]
  44673. 802f22a: f7fc fdc8 bl 802bdbe <lwip_ntohs>
  44674. 802f22e: f010 0003 ands.w r0, r0, #3
  44675. 802f232: bf18 it ne
  44676. 802f234: 2001 movne r0, #1
  44677. 802f236: 1838 adds r0, r7, r0
  44678. 802f238: b360 cbz r0, 802f294 <tcp_output+0x1ec>
  44679. seg->next = NULL;
  44680. 802f23a: 2300 movs r3, #0
  44681. 802f23c: 602b str r3, [r5, #0]
  44682. /* unacked list is empty? */
  44683. if (pcb->unacked == NULL) {
  44684. 802f23e: 6f23 ldr r3, [r4, #112] ; 0x70
  44685. 802f240: b90b cbnz r3, 802f246 <tcp_output+0x19e>
  44686. pcb->unacked = seg;
  44687. 802f242: 6725 str r5, [r4, #112] ; 0x70
  44688. 802f244: e024 b.n 802f290 <tcp_output+0x1e8>
  44689. /* unacked list is not empty? */
  44690. } else {
  44691. /* In the case of fast retransmit, the packet should not go to the tail
  44692. * of the unacked queue, but rather somewhere before it. We need to check for
  44693. * this case. -STJ Jul 27, 2004 */
  44694. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  44695. 802f246: 68eb ldr r3, [r5, #12]
  44696. 802f248: 6858 ldr r0, [r3, #4]
  44697. 802f24a: f7fc fdbf bl 802bdcc <lwip_ntohl>
  44698. 802f24e: 68f3 ldr r3, [r6, #12]
  44699. 802f250: 4607 mov r7, r0
  44700. 802f252: 6858 ldr r0, [r3, #4]
  44701. 802f254: f7fc fdba bl 802bdcc <lwip_ntohl>
  44702. 802f258: 1a38 subs r0, r7, r0
  44703. 802f25a: 2800 cmp r0, #0
  44704. 802f25c: da17 bge.n 802f28e <tcp_output+0x1e6>
  44705. /* add segment to before tail of unacked list, keeping the list sorted */
  44706. struct tcp_seg **cur_seg = &(pcb->unacked);
  44707. 802f25e: f104 0770 add.w r7, r4, #112 ; 0x70
  44708. while (*cur_seg &&
  44709. 802f262: e000 b.n 802f266 <tcp_output+0x1be>
  44710. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  44711. cur_seg = &((*cur_seg)->next );
  44712. 802f264: 683f ldr r7, [r7, #0]
  44713. * of the unacked queue, but rather somewhere before it. We need to check for
  44714. * this case. -STJ Jul 27, 2004 */
  44715. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  44716. /* add segment to before tail of unacked list, keeping the list sorted */
  44717. struct tcp_seg **cur_seg = &(pcb->unacked);
  44718. while (*cur_seg &&
  44719. 802f266: 683b ldr r3, [r7, #0]
  44720. 802f268: b91b cbnz r3, 802f272 <tcp_output+0x1ca>
  44721. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  44722. cur_seg = &((*cur_seg)->next );
  44723. }
  44724. seg->next = (*cur_seg);
  44725. 802f26a: 683b ldr r3, [r7, #0]
  44726. 802f26c: 602b str r3, [r5, #0]
  44727. (*cur_seg) = seg;
  44728. 802f26e: 603d str r5, [r7, #0]
  44729. 802f270: e013 b.n 802f29a <tcp_output+0x1f2>
  44730. * this case. -STJ Jul 27, 2004 */
  44731. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  44732. /* add segment to before tail of unacked list, keeping the list sorted */
  44733. struct tcp_seg **cur_seg = &(pcb->unacked);
  44734. while (*cur_seg &&
  44735. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  44736. 802f272: 68db ldr r3, [r3, #12]
  44737. 802f274: 6858 ldr r0, [r3, #4]
  44738. 802f276: f7fc fda9 bl 802bdcc <lwip_ntohl>
  44739. 802f27a: 68eb ldr r3, [r5, #12]
  44740. 802f27c: 4683 mov fp, r0
  44741. 802f27e: 6858 ldr r0, [r3, #4]
  44742. 802f280: f7fc fda4 bl 802bdcc <lwip_ntohl>
  44743. 802f284: ebc0 000b rsb r0, r0, fp
  44744. * of the unacked queue, but rather somewhere before it. We need to check for
  44745. * this case. -STJ Jul 27, 2004 */
  44746. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  44747. /* add segment to before tail of unacked list, keeping the list sorted */
  44748. struct tcp_seg **cur_seg = &(pcb->unacked);
  44749. while (*cur_seg &&
  44750. 802f288: 2800 cmp r0, #0
  44751. 802f28a: dbeb blt.n 802f264 <tcp_output+0x1bc>
  44752. 802f28c: e7ed b.n 802f26a <tcp_output+0x1c2>
  44753. }
  44754. seg->next = (*cur_seg);
  44755. (*cur_seg) = seg;
  44756. } else {
  44757. /* add segment to tail of unacked list */
  44758. useg->next = seg;
  44759. 802f28e: 6035 str r5, [r6, #0]
  44760. 802f290: 462e mov r6, r5
  44761. 802f292: e002 b.n 802f29a <tcp_output+0x1f2>
  44762. useg = useg->next;
  44763. }
  44764. }
  44765. /* do not queue empty segments on the unacked list */
  44766. } else {
  44767. tcp_seg_free(seg);
  44768. 802f294: 4628 mov r0, r5
  44769. 802f296: f7fe f978 bl 802d58a <tcp_seg_free>
  44770. }
  44771. seg = pcb->unsent;
  44772. 802f29a: 6ee5 ldr r5, [r4, #108] ; 0x6c
  44773. 802f29c: e003 b.n 802f2a6 <tcp_output+0x1fe>
  44774. }
  44775. ip_addr_copy(pcb->local_ip, netif->ip_addr);
  44776. }
  44777. if (pcb->rttest == 0) {
  44778. pcb->rttest = tcp_ticks;
  44779. 802f29e: f8df a04c ldr.w sl, [pc, #76] ; 802f2ec <tcp_output+0x244>
  44780. packets, so ignore it here */
  44781. opts = (u32_t *)(void *)(seg->tcphdr + 1);
  44782. if (seg->flags & TF_SEG_OPTS_MSS) {
  44783. u16_t mss;
  44784. #if TCP_CALCULATE_EFF_SEND_MSS
  44785. mss = tcp_eff_send_mss(TCP_MSS, &pcb->remote_ip);
  44786. 802f2a2: f104 0804 add.w r8, r4, #4
  44787. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
  44788. ntohl(seg->tcphdr->seqno), pcb->lastack));
  44789. }
  44790. #endif /* TCP_CWND_DEBUG */
  44791. /* data available and window allows it to be sent? */
  44792. while (seg != NULL &&
  44793. 802f2a6: b915 cbnz r5, 802f2ae <tcp_output+0x206>
  44794. tcp_seg_free(seg);
  44795. }
  44796. seg = pcb->unsent;
  44797. }
  44798. #if TCP_OVERSIZE
  44799. if (pcb->unsent == NULL) {
  44800. 802f2a8: 6ee3 ldr r3, [r4, #108] ; 0x6c
  44801. 802f2aa: b973 cbnz r3, 802f2ca <tcp_output+0x222>
  44802. 802f2ac: e00b b.n 802f2c6 <tcp_output+0x21e>
  44803. ntohl(seg->tcphdr->seqno), pcb->lastack));
  44804. }
  44805. #endif /* TCP_CWND_DEBUG */
  44806. /* data available and window allows it to be sent? */
  44807. while (seg != NULL &&
  44808. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
  44809. 802f2ae: 68eb ldr r3, [r5, #12]
  44810. 802f2b0: 6858 ldr r0, [r3, #4]
  44811. 802f2b2: f7fc fd8b bl 802bdcc <lwip_ntohl>
  44812. 802f2b6: 892a ldrh r2, [r5, #8]
  44813. 802f2b8: 6ca3 ldr r3, [r4, #72] ; 0x48
  44814. 802f2ba: 1ad3 subs r3, r2, r3
  44815. 802f2bc: 1818 adds r0, r3, r0
  44816. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
  44817. ntohl(seg->tcphdr->seqno), pcb->lastack));
  44818. }
  44819. #endif /* TCP_CWND_DEBUG */
  44820. /* data available and window allows it to be sent? */
  44821. while (seg != NULL &&
  44822. 802f2be: 4548 cmp r0, r9
  44823. 802f2c0: f67f af20 bls.w 802f104 <tcp_output+0x5c>
  44824. 802f2c4: e7f0 b.n 802f2a8 <tcp_output+0x200>
  44825. seg = pcb->unsent;
  44826. }
  44827. #if TCP_OVERSIZE
  44828. if (pcb->unsent == NULL) {
  44829. /* last unsent has been removed, reset unsent_oversize */
  44830. pcb->unsent_oversize = 0;
  44831. 802f2c6: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  44832. }
  44833. #endif /* TCP_OVERSIZE */
  44834. pcb->flags &= ~TF_NAGLEMEMERR;
  44835. 802f2ca: 7fa3 ldrb r3, [r4, #30]
  44836. 802f2cc: f003 037f and.w r3, r3, #127 ; 0x7f
  44837. 802f2d0: 77a3 strb r3, [r4, #30]
  44838. return ERR_OK;
  44839. 802f2d2: e004 b.n 802f2de <tcp_output+0x236>
  44840. * - if tcp_write had a memory error before (prevent delayed ACK timeout) or
  44841. * - if FIN was already enqueued for this PCB (SYN is always alone in a segment -
  44842. * either seg->next != NULL or pcb->unacked == NULL;
  44843. * RST is no sent using tcp_write/tcp_output.
  44844. */
  44845. if((tcp_do_output_nagle(pcb) == 0) &&
  44846. 802f2d4: f012 0fa0 tst.w r2, #160 ; 0xa0
  44847. 802f2d8: f47f af2e bne.w 802f138 <tcp_output+0x90>
  44848. 802f2dc: e7e4 b.n 802f2a8 <tcp_output+0x200>
  44849. }
  44850. #endif /* TCP_OVERSIZE */
  44851. pcb->flags &= ~TF_NAGLEMEMERR;
  44852. return ERR_OK;
  44853. }
  44854. 802f2de: 2000 movs r0, #0
  44855. 802f2e0: b003 add sp, #12
  44856. 802f2e2: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  44857. 802f2e6: bf00 nop
  44858. 802f2e8: 20010ff4 .word 0x20010ff4
  44859. 802f2ec: 20010fe0 .word 0x20010fe0
  44860. 0802f2f0 <tcp_rst>:
  44861. */
  44862. void
  44863. tcp_rst(u32_t seqno, u32_t ackno,
  44864. ip_addr_t *local_ip, ip_addr_t *remote_ip,
  44865. u16_t local_port, u16_t remote_port)
  44866. {
  44867. 802f2f0: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  44868. 802f2f4: 4681 mov r9, r0
  44869. 802f2f6: 460d mov r5, r1
  44870. 802f2f8: 4690 mov r8, r2
  44871. struct pbuf *p;
  44872. struct tcp_hdr *tcphdr;
  44873. p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
  44874. 802f2fa: 2001 movs r0, #1
  44875. 802f2fc: 2114 movs r1, #20
  44876. 802f2fe: 2200 movs r2, #0
  44877. */
  44878. void
  44879. tcp_rst(u32_t seqno, u32_t ackno,
  44880. ip_addr_t *local_ip, ip_addr_t *remote_ip,
  44881. u16_t local_port, u16_t remote_port)
  44882. {
  44883. 802f300: 461f mov r7, r3
  44884. 802f302: f8bd b030 ldrh.w fp, [sp, #48] ; 0x30
  44885. 802f306: f8bd a034 ldrh.w sl, [sp, #52] ; 0x34
  44886. struct pbuf *p;
  44887. struct tcp_hdr *tcphdr;
  44888. p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
  44889. 802f30a: f7fd fede bl 802d0ca <pbuf_alloc>
  44890. if (p == NULL) {
  44891. 802f30e: 4606 mov r6, r0
  44892. 802f310: 2800 cmp r0, #0
  44893. 802f312: d030 beq.n 802f376 <tcp_rst+0x86>
  44894. return;
  44895. }
  44896. LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
  44897. (p->len >= sizeof(struct tcp_hdr)));
  44898. tcphdr = (struct tcp_hdr *)p->payload;
  44899. 802f314: 6844 ldr r4, [r0, #4]
  44900. tcphdr->src = htons(local_port);
  44901. 802f316: 4658 mov r0, fp
  44902. 802f318: f7fc fd4c bl 802bdb4 <lwip_htons>
  44903. 802f31c: 8020 strh r0, [r4, #0]
  44904. tcphdr->dest = htons(remote_port);
  44905. 802f31e: 4650 mov r0, sl
  44906. 802f320: f7fc fd48 bl 802bdb4 <lwip_htons>
  44907. 802f324: 8060 strh r0, [r4, #2]
  44908. tcphdr->seqno = htonl(seqno);
  44909. 802f326: 4648 mov r0, r9
  44910. 802f328: f7fc fd4e bl 802bdc8 <lwip_htonl>
  44911. 802f32c: 6060 str r0, [r4, #4]
  44912. tcphdr->ackno = htonl(ackno);
  44913. 802f32e: 4628 mov r0, r5
  44914. 802f330: f7fc fd4a bl 802bdc8 <lwip_htonl>
  44915. 802f334: 60a0 str r0, [r4, #8]
  44916. TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK);
  44917. 802f336: f245 0014 movw r0, #20500 ; 0x5014
  44918. 802f33a: f7fc fd3b bl 802bdb4 <lwip_htons>
  44919. tcphdr->wnd = PP_HTONS(TCP_WND);
  44920. 802f33e: 2316 movs r3, #22
  44921. 802f340: 2500 movs r5, #0
  44922. 802f342: 73a3 strb r3, [r4, #14]
  44923. 802f344: f06f 032f mvn.w r3, #47 ; 0x2f
  44924. tcphdr = (struct tcp_hdr *)p->payload;
  44925. tcphdr->src = htons(local_port);
  44926. tcphdr->dest = htons(remote_port);
  44927. tcphdr->seqno = htonl(seqno);
  44928. tcphdr->ackno = htonl(ackno);
  44929. TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK);
  44930. 802f348: 81a0 strh r0, [r4, #12]
  44931. tcphdr->wnd = PP_HTONS(TCP_WND);
  44932. 802f34a: 73e3 strb r3, [r4, #15]
  44933. tcphdr->chksum = 0;
  44934. 802f34c: 7425 strb r5, [r4, #16]
  44935. 802f34e: 7465 strb r5, [r4, #17]
  44936. tcphdr->urgp = 0;
  44937. 802f350: 74a5 strb r5, [r4, #18]
  44938. 802f352: 74e5 strb r5, [r4, #19]
  44939. #if CHECKSUM_GEN_TCP
  44940. tcphdr->chksum = inet_chksum_pseudo(p, local_ip, remote_ip,
  44941. IP_PROTO_TCP, p->tot_len);
  44942. #endif
  44943. TCP_STATS_INC(tcp.xmit);
  44944. snmp_inc_tcpoutrsts();
  44945. 802f354: f002 fc64 bl 8031c20 <snmp_inc_tcpoutrsts>
  44946. /* Send output with hardcoded TTL since we have no access to the pcb */
  44947. ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP);
  44948. 802f358: 2306 movs r3, #6
  44949. 802f35a: 9301 str r3, [sp, #4]
  44950. 802f35c: 9500 str r5, [sp, #0]
  44951. 802f35e: 4630 mov r0, r6
  44952. 802f360: 4641 mov r1, r8
  44953. 802f362: 463a mov r2, r7
  44954. 802f364: 23ff movs r3, #255 ; 0xff
  44955. 802f366: f000 ff41 bl 80301ec <ip_output>
  44956. pbuf_free(p);
  44957. 802f36a: 4630 mov r0, r6
  44958. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
  44959. }
  44960. 802f36c: b003 add sp, #12
  44961. 802f36e: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  44962. #endif
  44963. TCP_STATS_INC(tcp.xmit);
  44964. snmp_inc_tcpoutrsts();
  44965. /* Send output with hardcoded TTL since we have no access to the pcb */
  44966. ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP);
  44967. pbuf_free(p);
  44968. 802f372: f7fd be5d b.w 802d030 <pbuf_free>
  44969. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
  44970. }
  44971. 802f376: b003 add sp, #12
  44972. 802f378: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  44973. 0802f37c <tcp_rexmit_rto>:
  44974. void
  44975. tcp_rexmit_rto(struct tcp_pcb *pcb)
  44976. {
  44977. struct tcp_seg *seg;
  44978. if (pcb->unacked == NULL) {
  44979. 802f37c: 6f02 ldr r2, [r0, #112] ; 0x70
  44980. *
  44981. * @param pcb the tcp_pcb for which to re-enqueue all unacked segments
  44982. */
  44983. void
  44984. tcp_rexmit_rto(struct tcp_pcb *pcb)
  44985. {
  44986. 802f37e: b510 push {r4, lr}
  44987. struct tcp_seg *seg;
  44988. if (pcb->unacked == NULL) {
  44989. 802f380: b19a cbz r2, 802f3aa <tcp_rexmit_rto+0x2e>
  44990. 802f382: 4611 mov r1, r2
  44991. 802f384: e000 b.n 802f388 <tcp_rexmit_rto+0xc>
  44992. return;
  44993. }
  44994. /* Move all unacked segments to the head of the unsent queue */
  44995. for (seg = pcb->unacked; seg->next != NULL; seg = seg->next);
  44996. 802f386: 4619 mov r1, r3
  44997. 802f388: 680b ldr r3, [r1, #0]
  44998. 802f38a: 2b00 cmp r3, #0
  44999. 802f38c: d1fb bne.n 802f386 <tcp_rexmit_rto+0xa>
  45000. /* concatenate unsent queue after unacked queue */
  45001. seg->next = pcb->unsent;
  45002. 802f38e: 6ec4 ldr r4, [r0, #108] ; 0x6c
  45003. 802f390: 600c str r4, [r1, #0]
  45004. /* unsent queue is the concatenated queue (of unacked, unsent) */
  45005. pcb->unsent = pcb->unacked;
  45006. 802f392: 66c2 str r2, [r0, #108] ; 0x6c
  45007. /* unacked queue is now empty */
  45008. pcb->unacked = NULL;
  45009. /* last unsent hasn't changed, no need to reset unsent_oversize */
  45010. /* increment number of retransmissions */
  45011. ++pcb->nrtx;
  45012. 802f394: f890 2046 ldrb.w r2, [r0, #70] ; 0x46
  45013. /* concatenate unsent queue after unacked queue */
  45014. seg->next = pcb->unsent;
  45015. /* unsent queue is the concatenated queue (of unacked, unsent) */
  45016. pcb->unsent = pcb->unacked;
  45017. /* unacked queue is now empty */
  45018. pcb->unacked = NULL;
  45019. 802f398: 6703 str r3, [r0, #112] ; 0x70
  45020. /* last unsent hasn't changed, no need to reset unsent_oversize */
  45021. /* increment number of retransmissions */
  45022. ++pcb->nrtx;
  45023. 802f39a: 3201 adds r2, #1
  45024. 802f39c: f880 2046 strb.w r2, [r0, #70] ; 0x46
  45025. /* Don't take any RTT measurements after retransmitting. */
  45026. pcb->rttest = 0;
  45027. 802f3a0: 6383 str r3, [r0, #56] ; 0x38
  45028. /* Do the actual retransmission */
  45029. tcp_output(pcb);
  45030. }
  45031. 802f3a2: e8bd 4010 ldmia.w sp!, {r4, lr}
  45032. /* Don't take any RTT measurements after retransmitting. */
  45033. pcb->rttest = 0;
  45034. /* Do the actual retransmission */
  45035. tcp_output(pcb);
  45036. 802f3a6: f7ff be7f b.w 802f0a8 <tcp_output>
  45037. 802f3aa: bd10 pop {r4, pc}
  45038. 0802f3ac <tcp_rexmit>:
  45039. *
  45040. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  45041. */
  45042. void
  45043. tcp_rexmit(struct tcp_pcb *pcb)
  45044. {
  45045. 802f3ac: b5f8 push {r3, r4, r5, r6, r7, lr}
  45046. struct tcp_seg *seg;
  45047. struct tcp_seg **cur_seg;
  45048. if (pcb->unacked == NULL) {
  45049. 802f3ae: 6f05 ldr r5, [r0, #112] ; 0x70
  45050. *
  45051. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  45052. */
  45053. void
  45054. tcp_rexmit(struct tcp_pcb *pcb)
  45055. {
  45056. 802f3b0: 4604 mov r4, r0
  45057. struct tcp_seg *seg;
  45058. struct tcp_seg **cur_seg;
  45059. if (pcb->unacked == NULL) {
  45060. 802f3b2: 2d00 cmp r5, #0
  45061. 802f3b4: d027 beq.n 802f406 <tcp_rexmit+0x5a>
  45062. }
  45063. /* Move the first unacked segment to the unsent queue */
  45064. /* Keep the unsent queue sorted. */
  45065. seg = pcb->unacked;
  45066. pcb->unacked = seg->next;
  45067. 802f3b6: 682b ldr r3, [r5, #0]
  45068. cur_seg = &(pcb->unsent);
  45069. 802f3b8: f100 066c add.w r6, r0, #108 ; 0x6c
  45070. }
  45071. /* Move the first unacked segment to the unsent queue */
  45072. /* Keep the unsent queue sorted. */
  45073. seg = pcb->unacked;
  45074. pcb->unacked = seg->next;
  45075. 802f3bc: 6703 str r3, [r0, #112] ; 0x70
  45076. cur_seg = &(pcb->unsent);
  45077. while (*cur_seg &&
  45078. 802f3be: e000 b.n 802f3c2 <tcp_rexmit+0x16>
  45079. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  45080. cur_seg = &((*cur_seg)->next );
  45081. 802f3c0: 6836 ldr r6, [r6, #0]
  45082. /* Keep the unsent queue sorted. */
  45083. seg = pcb->unacked;
  45084. pcb->unacked = seg->next;
  45085. cur_seg = &(pcb->unsent);
  45086. while (*cur_seg &&
  45087. 802f3c2: 6833 ldr r3, [r6, #0]
  45088. 802f3c4: b92b cbnz r3, 802f3d2 <tcp_rexmit+0x26>
  45089. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  45090. cur_seg = &((*cur_seg)->next );
  45091. }
  45092. seg->next = *cur_seg;
  45093. 802f3c6: 6833 ldr r3, [r6, #0]
  45094. 802f3c8: 602b str r3, [r5, #0]
  45095. *cur_seg = seg;
  45096. 802f3ca: 6035 str r5, [r6, #0]
  45097. #if TCP_OVERSIZE
  45098. if (seg->next == NULL) {
  45099. 802f3cc: 682b ldr r3, [r5, #0]
  45100. 802f3ce: b97b cbnz r3, 802f3f0 <tcp_rexmit+0x44>
  45101. 802f3d0: e00c b.n 802f3ec <tcp_rexmit+0x40>
  45102. seg = pcb->unacked;
  45103. pcb->unacked = seg->next;
  45104. cur_seg = &(pcb->unsent);
  45105. while (*cur_seg &&
  45106. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  45107. 802f3d2: 68db ldr r3, [r3, #12]
  45108. 802f3d4: 6858 ldr r0, [r3, #4]
  45109. 802f3d6: f7fc fcf9 bl 802bdcc <lwip_ntohl>
  45110. 802f3da: 68eb ldr r3, [r5, #12]
  45111. 802f3dc: 4607 mov r7, r0
  45112. 802f3de: 6858 ldr r0, [r3, #4]
  45113. 802f3e0: f7fc fcf4 bl 802bdcc <lwip_ntohl>
  45114. 802f3e4: 1a38 subs r0, r7, r0
  45115. /* Keep the unsent queue sorted. */
  45116. seg = pcb->unacked;
  45117. pcb->unacked = seg->next;
  45118. cur_seg = &(pcb->unsent);
  45119. while (*cur_seg &&
  45120. 802f3e6: 2800 cmp r0, #0
  45121. 802f3e8: dbea blt.n 802f3c0 <tcp_rexmit+0x14>
  45122. 802f3ea: e7ec b.n 802f3c6 <tcp_rexmit+0x1a>
  45123. seg->next = *cur_seg;
  45124. *cur_seg = seg;
  45125. #if TCP_OVERSIZE
  45126. if (seg->next == NULL) {
  45127. /* the retransmitted segment is last in unsent, so reset unsent_oversize */
  45128. pcb->unsent_oversize = 0;
  45129. 802f3ec: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  45130. }
  45131. #endif /* TCP_OVERSIZE */
  45132. ++pcb->nrtx;
  45133. 802f3f0: f894 3046 ldrb.w r3, [r4, #70] ; 0x46
  45134. 802f3f4: 3301 adds r3, #1
  45135. 802f3f6: f884 3046 strb.w r3, [r4, #70] ; 0x46
  45136. /* Don't take any rtt measurements after retransmitting. */
  45137. pcb->rttest = 0;
  45138. 802f3fa: 2300 movs r3, #0
  45139. 802f3fc: 63a3 str r3, [r4, #56] ; 0x38
  45140. /* Do the actual retransmission. */
  45141. snmp_inc_tcpretranssegs();
  45142. /* No need to call tcp_output: we are always called from tcp_input()
  45143. and thus tcp_output directly returns. */
  45144. }
  45145. 802f3fe: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  45146. /* Don't take any rtt measurements after retransmitting. */
  45147. pcb->rttest = 0;
  45148. /* Do the actual retransmission. */
  45149. snmp_inc_tcpretranssegs();
  45150. 802f402: f002 bbfd b.w 8031c00 <snmp_inc_tcpretranssegs>
  45151. 802f406: bdf8 pop {r3, r4, r5, r6, r7, pc}
  45152. 0802f408 <tcp_rexmit_fast>:
  45153. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  45154. */
  45155. void
  45156. tcp_rexmit_fast(struct tcp_pcb *pcb)
  45157. {
  45158. if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {
  45159. 802f408: 6f03 ldr r3, [r0, #112] ; 0x70
  45160. *
  45161. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  45162. */
  45163. void
  45164. tcp_rexmit_fast(struct tcp_pcb *pcb)
  45165. {
  45166. 802f40a: b510 push {r4, lr}
  45167. 802f40c: 4604 mov r4, r0
  45168. if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {
  45169. 802f40e: b333 cbz r3, 802f45e <tcp_rexmit_fast+0x56>
  45170. 802f410: 7f83 ldrb r3, [r0, #30]
  45171. 802f412: f003 0304 and.w r3, r3, #4
  45172. 802f416: b2db uxtb r3, r3
  45173. 802f418: bb0b cbnz r3, 802f45e <tcp_rexmit_fast+0x56>
  45174. LWIP_DEBUGF(TCP_FR_DEBUG,
  45175. ("tcp_receive: dupacks %"U16_F" (%"U32_F
  45176. "), fast retransmit %"U32_F"\n",
  45177. (u16_t)pcb->dupacks, pcb->lastack,
  45178. ntohl(pcb->unacked->tcphdr->seqno)));
  45179. tcp_rexmit(pcb);
  45180. 802f41a: f7ff ffc7 bl 802f3ac <tcp_rexmit>
  45181. /* Set ssthresh to half of the minimum of the current
  45182. * cwnd and the advertised window */
  45183. if (pcb->cwnd > pcb->snd_wnd) {
  45184. 802f41e: f8b4 304c ldrh.w r3, [r4, #76] ; 0x4c
  45185. 802f422: f8b4 2060 ldrh.w r2, [r4, #96] ; 0x60
  45186. 802f426: 4293 cmp r3, r2
  45187. 802f428: d903 bls.n 802f432 <tcp_rexmit_fast+0x2a>
  45188. pcb->ssthresh = pcb->snd_wnd / 2;
  45189. 802f42a: 0852 lsrs r2, r2, #1
  45190. 802f42c: f8a4 204e strh.w r2, [r4, #78] ; 0x4e
  45191. 802f430: e002 b.n 802f438 <tcp_rexmit_fast+0x30>
  45192. } else {
  45193. pcb->ssthresh = pcb->cwnd / 2;
  45194. 802f432: 085b lsrs r3, r3, #1
  45195. 802f434: f8a4 304e strh.w r3, [r4, #78] ; 0x4e
  45196. }
  45197. /* The minimum value for ssthresh should be 2 MSS */
  45198. if (pcb->ssthresh < 2*pcb->mss) {
  45199. 802f438: 8ee3 ldrh r3, [r4, #54] ; 0x36
  45200. 802f43a: f8b4 104e ldrh.w r1, [r4, #78] ; 0x4e
  45201. 802f43e: 005a lsls r2, r3, #1
  45202. 802f440: 4291 cmp r1, r2
  45203. LWIP_DEBUGF(TCP_FR_DEBUG,
  45204. ("tcp_receive: The minimum value for ssthresh %"U16_F
  45205. " should be min 2 mss %"U16_F"...\n",
  45206. pcb->ssthresh, 2*pcb->mss));
  45207. pcb->ssthresh = 2*pcb->mss;
  45208. 802f442: bfb8 it lt
  45209. 802f444: f8a4 204e strhlt.w r2, [r4, #78] ; 0x4e
  45210. }
  45211. pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
  45212. 802f448: f8b4 204e ldrh.w r2, [r4, #78] ; 0x4e
  45213. 802f44c: 2103 movs r1, #3
  45214. 802f44e: fb01 2303 mla r3, r1, r3, r2
  45215. 802f452: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  45216. pcb->flags |= TF_INFR;
  45217. 802f456: 7fa3 ldrb r3, [r4, #30]
  45218. 802f458: f043 0304 orr.w r3, r3, #4
  45219. 802f45c: 77a3 strb r3, [r4, #30]
  45220. 802f45e: bd10 pop {r4, pc}
  45221. 0802f460 <tcp_keepalive>:
  45222. *
  45223. * @param pcb the tcp_pcb for which to send a keepalive packet
  45224. */
  45225. void
  45226. tcp_keepalive(struct tcp_pcb *pcb)
  45227. {
  45228. 802f460: b537 push {r0, r1, r2, r4, r5, lr}
  45229. 802f462: 4604 mov r4, r0
  45230. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip)));
  45231. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  45232. tcp_ticks, pcb->tmr, pcb->keep_cnt_sent));
  45233. p = tcp_output_alloc_header(pcb, 0, 0, htonl(pcb->snd_nxt - 1));
  45234. 802f464: 6d00 ldr r0, [r0, #80] ; 0x50
  45235. 802f466: 3801 subs r0, #1
  45236. 802f468: f7fc fcae bl 802bdc8 <lwip_htonl>
  45237. 802f46c: 2100 movs r1, #0
  45238. 802f46e: 4602 mov r2, r0
  45239. 802f470: 4620 mov r0, r4
  45240. 802f472: f7ff fbd9 bl 802ec28 <tcp_output_alloc_header.constprop.0>
  45241. if(p == NULL) {
  45242. 802f476: 4605 mov r5, r0
  45243. 802f478: b178 cbz r0, 802f49a <tcp_keepalive+0x3a>
  45244. /* Send output to IP */
  45245. #if LWIP_NETIF_HWADDRHINT
  45246. ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP,
  45247. &(pcb->addr_hint));
  45248. #else /* LWIP_NETIF_HWADDRHINT*/
  45249. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  45250. 802f47a: 2200 movs r2, #0
  45251. 802f47c: f04f 0e06 mov.w lr, #6
  45252. 802f480: e88d 4004 stmia.w sp, {r2, lr}
  45253. 802f484: 7aa3 ldrb r3, [r4, #10]
  45254. 802f486: 4621 mov r1, r4
  45255. 802f488: 1d22 adds r2, r4, #4
  45256. 802f48a: f000 feaf bl 80301ec <ip_output>
  45257. #endif /* LWIP_NETIF_HWADDRHINT*/
  45258. pbuf_free(p);
  45259. 802f48e: 4628 mov r0, r5
  45260. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n",
  45261. pcb->snd_nxt - 1, pcb->rcv_nxt));
  45262. }
  45263. 802f490: b003 add sp, #12
  45264. 802f492: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
  45265. &(pcb->addr_hint));
  45266. #else /* LWIP_NETIF_HWADDRHINT*/
  45267. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  45268. #endif /* LWIP_NETIF_HWADDRHINT*/
  45269. pbuf_free(p);
  45270. 802f496: f7fd bdcb b.w 802d030 <pbuf_free>
  45271. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n",
  45272. pcb->snd_nxt - 1, pcb->rcv_nxt));
  45273. }
  45274. 802f49a: b003 add sp, #12
  45275. 802f49c: bd30 pop {r4, r5, pc}
  45276. 0802f49e <tcp_zero_window_probe>:
  45277. *
  45278. * @param pcb the tcp_pcb for which to send a zero-window probe packet
  45279. */
  45280. void
  45281. tcp_zero_window_probe(struct tcp_pcb *pcb)
  45282. {
  45283. 802f49e: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
  45284. LWIP_DEBUGF(TCP_DEBUG,
  45285. ("tcp_zero_window_probe: tcp_ticks %"U32_F
  45286. " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  45287. tcp_ticks, pcb->tmr, pcb->keep_cnt_sent));
  45288. seg = pcb->unacked;
  45289. 802f4a2: 6f04 ldr r4, [r0, #112] ; 0x70
  45290. *
  45291. * @param pcb the tcp_pcb for which to send a zero-window probe packet
  45292. */
  45293. void
  45294. tcp_zero_window_probe(struct tcp_pcb *pcb)
  45295. {
  45296. 802f4a4: 4605 mov r5, r0
  45297. " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  45298. tcp_ticks, pcb->tmr, pcb->keep_cnt_sent));
  45299. seg = pcb->unacked;
  45300. if(seg == NULL) {
  45301. 802f4a6: b914 cbnz r4, 802f4ae <tcp_zero_window_probe+0x10>
  45302. seg = pcb->unsent;
  45303. 802f4a8: 6ec4 ldr r4, [r0, #108] ; 0x6c
  45304. }
  45305. if(seg == NULL) {
  45306. 802f4aa: 2c00 cmp r4, #0
  45307. 802f4ac: d042 beq.n 802f534 <tcp_zero_window_probe+0x96>
  45308. return;
  45309. }
  45310. is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0);
  45311. 802f4ae: 68e3 ldr r3, [r4, #12]
  45312. 802f4b0: 8998 ldrh r0, [r3, #12]
  45313. 802f4b2: f7fc fc84 bl 802bdbe <lwip_ntohs>
  45314. 802f4b6: f010 0001 ands.w r0, r0, #1
  45315. 802f4ba: d005 beq.n 802f4c8 <tcp_zero_window_probe+0x2a>
  45316. 802f4bc: 8921 ldrh r1, [r4, #8]
  45317. 802f4be: f1d1 0101 rsbs r1, r1, #1
  45318. 802f4c2: bf38 it cc
  45319. 802f4c4: 2100 movcc r1, #0
  45320. 802f4c6: e000 b.n 802f4ca <tcp_zero_window_probe+0x2c>
  45321. 802f4c8: 4601 mov r1, r0
  45322. /* we want to send one seqno: either FIN or data (no options) */
  45323. len = is_fin ? 0 : 1;
  45324. p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno);
  45325. 802f4ca: 68e3 ldr r3, [r4, #12]
  45326. }
  45327. if(seg == NULL) {
  45328. return;
  45329. }
  45330. is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0);
  45331. 802f4cc: fa5f f881 uxtb.w r8, r1
  45332. /* we want to send one seqno: either FIN or data (no options) */
  45333. len = is_fin ? 0 : 1;
  45334. p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno);
  45335. 802f4d0: 4628 mov r0, r5
  45336. 802f4d2: f081 0101 eor.w r1, r1, #1
  45337. 802f4d6: 685a ldr r2, [r3, #4]
  45338. 802f4d8: f7ff fba6 bl 802ec28 <tcp_output_alloc_header.constprop.0>
  45339. if(p == NULL) {
  45340. 802f4dc: 4606 mov r6, r0
  45341. 802f4de: 2800 cmp r0, #0
  45342. 802f4e0: d028 beq.n 802f534 <tcp_zero_window_probe+0x96>
  45343. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n"));
  45344. return;
  45345. }
  45346. tcphdr = (struct tcp_hdr *)p->payload;
  45347. 802f4e2: 6847 ldr r7, [r0, #4]
  45348. if (is_fin) {
  45349. 802f4e4: f1b8 0f00 cmp.w r8, #0
  45350. 802f4e8: d009 beq.n 802f4fe <tcp_zero_window_probe+0x60>
  45351. /* FIN segment, no data */
  45352. TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN);
  45353. 802f4ea: 89bc ldrh r4, [r7, #12]
  45354. 802f4ec: 2011 movs r0, #17
  45355. 802f4ee: f7fc fc61 bl 802bdb4 <lwip_htons>
  45356. 802f4f2: f424 547c bic.w r4, r4, #16128 ; 0x3f00
  45357. 802f4f6: b2a4 uxth r4, r4
  45358. 802f4f8: 4320 orrs r0, r4
  45359. 802f4fa: 81b8 strh r0, [r7, #12]
  45360. 802f4fc: e009 b.n 802f512 <tcp_zero_window_probe+0x74>
  45361. /* Data segment, copy in one byte from the head of the unacked queue */
  45362. char *d = ((char *)p->payload + TCP_HLEN);
  45363. /* Depending on whether the segment has already been sent (unacked) or not
  45364. (unsent), seg->p->payload points to the IP header or TCP header.
  45365. Ensure we copy the first TCP data byte: */
  45366. pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len);
  45367. 802f4fe: 6860 ldr r0, [r4, #4]
  45368. 802f500: 8923 ldrh r3, [r4, #8]
  45369. 802f502: 8902 ldrh r2, [r0, #8]
  45370. 802f504: 1ad3 subs r3, r2, r3
  45371. 802f506: f107 0114 add.w r1, r7, #20
  45372. 802f50a: 2201 movs r2, #1
  45373. 802f50c: b29b uxth r3, r3
  45374. 802f50e: f7fd fedd bl 802d2cc <pbuf_copy_partial>
  45375. /* Send output to IP */
  45376. #if LWIP_NETIF_HWADDRHINT
  45377. ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP,
  45378. &(pcb->addr_hint));
  45379. #else /* LWIP_NETIF_HWADDRHINT*/
  45380. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  45381. 802f512: 2200 movs r2, #0
  45382. 802f514: f04f 0c06 mov.w ip, #6
  45383. 802f518: e88d 1004 stmia.w sp, {r2, ip}
  45384. 802f51c: 7aab ldrb r3, [r5, #10]
  45385. 802f51e: 4630 mov r0, r6
  45386. 802f520: 4629 mov r1, r5
  45387. 802f522: 1d2a adds r2, r5, #4
  45388. 802f524: f000 fe62 bl 80301ec <ip_output>
  45389. #endif /* LWIP_NETIF_HWADDRHINT*/
  45390. pbuf_free(p);
  45391. 802f528: 4630 mov r0, r6
  45392. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F
  45393. " ackno %"U32_F".\n",
  45394. pcb->snd_nxt - 1, pcb->rcv_nxt));
  45395. }
  45396. 802f52a: b002 add sp, #8
  45397. 802f52c: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  45398. &(pcb->addr_hint));
  45399. #else /* LWIP_NETIF_HWADDRHINT*/
  45400. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  45401. #endif /* LWIP_NETIF_HWADDRHINT*/
  45402. pbuf_free(p);
  45403. 802f530: f7fd bd7e b.w 802d030 <pbuf_free>
  45404. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F
  45405. " ackno %"U32_F".\n",
  45406. pcb->snd_nxt - 1, pcb->rcv_nxt));
  45407. }
  45408. 802f534: b002 add sp, #8
  45409. 802f536: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  45410. 802f53a: 0000 movs r0, r0
  45411. 0802f53c <sys_timeout>:
  45412. sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name)
  45413. #else /* LWIP_DEBUG_TIMERNAMES */
  45414. void
  45415. sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
  45416. #endif /* LWIP_DEBUG_TIMERNAMES */
  45417. {
  45418. 802f53c: b570 push {r4, r5, r6, lr}
  45419. 802f53e: 4604 mov r4, r0
  45420. struct sys_timeo *timeout, *t;
  45421. timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
  45422. 802f540: 2009 movs r0, #9
  45423. sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name)
  45424. #else /* LWIP_DEBUG_TIMERNAMES */
  45425. void
  45426. sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
  45427. #endif /* LWIP_DEBUG_TIMERNAMES */
  45428. {
  45429. 802f542: 460d mov r5, r1
  45430. 802f544: 4616 mov r6, r2
  45431. struct sys_timeo *timeout, *t;
  45432. timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
  45433. 802f546: f7fd fc53 bl 802cdf0 <memp_malloc>
  45434. if (timeout == NULL) {
  45435. 802f54a: 4603 mov r3, r0
  45436. 802f54c: b308 cbz r0, 802f592 <sys_timeout+0x56>
  45437. timeout->handler_name = handler_name;
  45438. LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n",
  45439. (void *)timeout, msecs, handler_name, (void *)arg));
  45440. #endif /* LWIP_DEBUG_TIMERNAMES */
  45441. if (next_timeout == NULL) {
  45442. 802f54e: 4911 ldr r1, [pc, #68] ; (802f594 <sys_timeout+0x58>)
  45443. timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
  45444. if (timeout == NULL) {
  45445. LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL);
  45446. return;
  45447. }
  45448. timeout->next = NULL;
  45449. 802f550: 2200 movs r2, #0
  45450. timeout->h = handler;
  45451. timeout->arg = arg;
  45452. timeout->time = msecs;
  45453. 802f552: e880 0074 stmia.w r0, {r2, r4, r5, r6}
  45454. timeout->handler_name = handler_name;
  45455. LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n",
  45456. (void *)timeout, msecs, handler_name, (void *)arg));
  45457. #endif /* LWIP_DEBUG_TIMERNAMES */
  45458. if (next_timeout == NULL) {
  45459. 802f556: 680a ldr r2, [r1, #0]
  45460. 802f558: b902 cbnz r2, 802f55c <sys_timeout+0x20>
  45461. 802f55a: e005 b.n 802f568 <sys_timeout+0x2c>
  45462. next_timeout = timeout;
  45463. return;
  45464. }
  45465. if (next_timeout->time > msecs) {
  45466. 802f55c: 6850 ldr r0, [r2, #4]
  45467. 802f55e: 42a0 cmp r0, r4
  45468. 802f560: d90c bls.n 802f57c <sys_timeout+0x40>
  45469. next_timeout->time -= msecs;
  45470. 802f562: 1b04 subs r4, r0, r4
  45471. 802f564: 6054 str r4, [r2, #4]
  45472. timeout->next = next_timeout;
  45473. 802f566: 601a str r2, [r3, #0]
  45474. next_timeout = timeout;
  45475. 802f568: 600b str r3, [r1, #0]
  45476. 802f56a: bd70 pop {r4, r5, r6, pc}
  45477. } else {
  45478. for(t = next_timeout; t != NULL; t = t->next) {
  45479. timeout->time -= t->time;
  45480. if (t->next == NULL || t->next->time > timeout->time) {
  45481. 802f56c: 684c ldr r4, [r1, #4]
  45482. 802f56e: 4284 cmp r4, r0
  45483. 802f570: d80c bhi.n 802f58c <sys_timeout+0x50>
  45484. 802f572: 460a mov r2, r1
  45485. 802f574: e002 b.n 802f57c <sys_timeout+0x40>
  45486. if (t->next != NULL) {
  45487. t->next->time -= timeout->time;
  45488. }
  45489. timeout->next = t->next;
  45490. 802f576: 6019 str r1, [r3, #0]
  45491. t->next = timeout;
  45492. 802f578: 6013 str r3, [r2, #0]
  45493. break;
  45494. 802f57a: bd70 pop {r4, r5, r6, pc}
  45495. next_timeout->time -= msecs;
  45496. timeout->next = next_timeout;
  45497. next_timeout = timeout;
  45498. } else {
  45499. for(t = next_timeout; t != NULL; t = t->next) {
  45500. timeout->time -= t->time;
  45501. 802f57c: 6851 ldr r1, [r2, #4]
  45502. 802f57e: 6858 ldr r0, [r3, #4]
  45503. 802f580: 1a40 subs r0, r0, r1
  45504. if (t->next == NULL || t->next->time > timeout->time) {
  45505. 802f582: 6811 ldr r1, [r2, #0]
  45506. next_timeout->time -= msecs;
  45507. timeout->next = next_timeout;
  45508. next_timeout = timeout;
  45509. } else {
  45510. for(t = next_timeout; t != NULL; t = t->next) {
  45511. timeout->time -= t->time;
  45512. 802f584: 6058 str r0, [r3, #4]
  45513. if (t->next == NULL || t->next->time > timeout->time) {
  45514. 802f586: 2900 cmp r1, #0
  45515. 802f588: d1f0 bne.n 802f56c <sys_timeout+0x30>
  45516. 802f58a: e7f4 b.n 802f576 <sys_timeout+0x3a>
  45517. if (t->next != NULL) {
  45518. t->next->time -= timeout->time;
  45519. 802f58c: 1a20 subs r0, r4, r0
  45520. 802f58e: 6048 str r0, [r1, #4]
  45521. 802f590: e7f1 b.n 802f576 <sys_timeout+0x3a>
  45522. 802f592: bd70 pop {r4, r5, r6, pc}
  45523. 802f594: 2000e120 .word 0x2000e120
  45524. 0802f598 <sys_timeouts_init>:
  45525. }
  45526. #endif /* LWIP_DNS */
  45527. /** Initialize this module */
  45528. void sys_timeouts_init(void)
  45529. {
  45530. 802f598: b508 push {r3, lr}
  45531. #if IP_REASSEMBLY
  45532. sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL);
  45533. #endif /* IP_REASSEMBLY */
  45534. #if LWIP_ARP
  45535. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  45536. 802f59a: 2200 movs r2, #0
  45537. 802f59c: f241 3088 movw r0, #5000 ; 0x1388
  45538. 802f5a0: 4908 ldr r1, [pc, #32] ; (802f5c4 <sys_timeouts_init+0x2c>)
  45539. 802f5a2: f7ff ffcb bl 802f53c <sys_timeout>
  45540. #endif /* LWIP_ARP */
  45541. #if LWIP_DHCP
  45542. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  45543. 802f5a6: 2200 movs r2, #0
  45544. 802f5a8: f64e 2060 movw r0, #60000 ; 0xea60
  45545. 802f5ac: 4906 ldr r1, [pc, #24] ; (802f5c8 <sys_timeouts_init+0x30>)
  45546. 802f5ae: f7ff ffc5 bl 802f53c <sys_timeout>
  45547. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  45548. 802f5b2: 4906 ldr r1, [pc, #24] ; (802f5cc <sys_timeouts_init+0x34>)
  45549. 802f5b4: f44f 70fa mov.w r0, #500 ; 0x1f4
  45550. 802f5b8: 2200 movs r2, #0
  45551. #if NO_SYS
  45552. /* Initialise timestamp for sys_check_timeouts */
  45553. timeouts_last_time = sys_now();
  45554. #endif
  45555. }
  45556. 802f5ba: e8bd 4008 ldmia.w sp!, {r3, lr}
  45557. #if LWIP_ARP
  45558. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  45559. #endif /* LWIP_ARP */
  45560. #if LWIP_DHCP
  45561. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  45562. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  45563. 802f5be: f7ff bfbd b.w 802f53c <sys_timeout>
  45564. 802f5c2: bf00 nop
  45565. 802f5c4: 0802f609 .word 0x0802f609
  45566. 802f5c8: 0802f5ed .word 0x0802f5ed
  45567. 802f5cc: 0802f5d1 .word 0x0802f5d1
  45568. 0802f5d0 <dhcp_timer_fine>:
  45569. *
  45570. * @param arg unused argument
  45571. */
  45572. static void
  45573. dhcp_timer_fine(void *arg)
  45574. {
  45575. 802f5d0: b508 push {r3, lr}
  45576. LWIP_UNUSED_ARG(arg);
  45577. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_fine_tmr()\n"));
  45578. dhcp_fine_tmr();
  45579. 802f5d2: f7fd f9c9 bl 802c968 <dhcp_fine_tmr>
  45580. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  45581. 802f5d6: 4904 ldr r1, [pc, #16] ; (802f5e8 <dhcp_timer_fine+0x18>)
  45582. 802f5d8: f44f 70fa mov.w r0, #500 ; 0x1f4
  45583. 802f5dc: 2200 movs r2, #0
  45584. }
  45585. 802f5de: e8bd 4008 ldmia.w sp!, {r3, lr}
  45586. dhcp_timer_fine(void *arg)
  45587. {
  45588. LWIP_UNUSED_ARG(arg);
  45589. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_fine_tmr()\n"));
  45590. dhcp_fine_tmr();
  45591. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  45592. 802f5e2: f7ff bfab b.w 802f53c <sys_timeout>
  45593. 802f5e6: bf00 nop
  45594. 802f5e8: 0802f5d1 .word 0x0802f5d1
  45595. 0802f5ec <dhcp_timer_coarse>:
  45596. *
  45597. * @param arg unused argument
  45598. */
  45599. static void
  45600. dhcp_timer_coarse(void *arg)
  45601. {
  45602. 802f5ec: b508 push {r3, lr}
  45603. LWIP_UNUSED_ARG(arg);
  45604. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_coarse_tmr()\n"));
  45605. dhcp_coarse_tmr();
  45606. 802f5ee: f7fd f939 bl 802c864 <dhcp_coarse_tmr>
  45607. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  45608. 802f5f2: 4904 ldr r1, [pc, #16] ; (802f604 <dhcp_timer_coarse+0x18>)
  45609. 802f5f4: f64e 2060 movw r0, #60000 ; 0xea60
  45610. 802f5f8: 2200 movs r2, #0
  45611. }
  45612. 802f5fa: e8bd 4008 ldmia.w sp!, {r3, lr}
  45613. dhcp_timer_coarse(void *arg)
  45614. {
  45615. LWIP_UNUSED_ARG(arg);
  45616. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_coarse_tmr()\n"));
  45617. dhcp_coarse_tmr();
  45618. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  45619. 802f5fe: f7ff bf9d b.w 802f53c <sys_timeout>
  45620. 802f602: bf00 nop
  45621. 802f604: 0802f5ed .word 0x0802f5ed
  45622. 0802f608 <arp_timer>:
  45623. *
  45624. * @param arg unused argument
  45625. */
  45626. static void
  45627. arp_timer(void *arg)
  45628. {
  45629. 802f608: b508 push {r3, lr}
  45630. LWIP_UNUSED_ARG(arg);
  45631. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: etharp_tmr()\n"));
  45632. etharp_tmr();
  45633. 802f60a: f004 fcfb bl 8034004 <etharp_tmr>
  45634. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  45635. 802f60e: 4904 ldr r1, [pc, #16] ; (802f620 <arp_timer+0x18>)
  45636. 802f610: f241 3088 movw r0, #5000 ; 0x1388
  45637. 802f614: 2200 movs r2, #0
  45638. }
  45639. 802f616: e8bd 4008 ldmia.w sp!, {r3, lr}
  45640. arp_timer(void *arg)
  45641. {
  45642. LWIP_UNUSED_ARG(arg);
  45643. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: etharp_tmr()\n"));
  45644. etharp_tmr();
  45645. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  45646. 802f61a: f7ff bf8f b.w 802f53c <sys_timeout>
  45647. 802f61e: bf00 nop
  45648. 802f620: 0802f609 .word 0x0802f609
  45649. 0802f624 <tcp_timer_needed>:
  45650. */
  45651. void
  45652. tcp_timer_needed(void)
  45653. {
  45654. /* timer is off but needed again? */
  45655. if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
  45656. 802f624: 4b08 ldr r3, [pc, #32] ; (802f648 <tcp_timer_needed+0x24>)
  45657. 802f626: 681b ldr r3, [r3, #0]
  45658. 802f628: b96b cbnz r3, 802f646 <tcp_timer_needed+0x22>
  45659. 802f62a: 4b08 ldr r3, [pc, #32] ; (802f64c <tcp_timer_needed+0x28>)
  45660. 802f62c: 681b ldr r3, [r3, #0]
  45661. 802f62e: b913 cbnz r3, 802f636 <tcp_timer_needed+0x12>
  45662. 802f630: 4b07 ldr r3, [pc, #28] ; (802f650 <tcp_timer_needed+0x2c>)
  45663. 802f632: 681b ldr r3, [r3, #0]
  45664. 802f634: b13b cbz r3, 802f646 <tcp_timer_needed+0x22>
  45665. /* enable and start timer */
  45666. tcpip_tcp_timer_active = 1;
  45667. 802f636: 4b04 ldr r3, [pc, #16] ; (802f648 <tcp_timer_needed+0x24>)
  45668. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  45669. 802f638: 4906 ldr r1, [pc, #24] ; (802f654 <tcp_timer_needed+0x30>)
  45670. tcp_timer_needed(void)
  45671. {
  45672. /* timer is off but needed again? */
  45673. if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
  45674. /* enable and start timer */
  45675. tcpip_tcp_timer_active = 1;
  45676. 802f63a: 2201 movs r2, #1
  45677. 802f63c: 601a str r2, [r3, #0]
  45678. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  45679. 802f63e: 20fa movs r0, #250 ; 0xfa
  45680. 802f640: 2200 movs r2, #0
  45681. 802f642: f7ff bf7b b.w 802f53c <sys_timeout>
  45682. 802f646: 4770 bx lr
  45683. 802f648: 2000e11c .word 0x2000e11c
  45684. 802f64c: 20010fdc .word 0x20010fdc
  45685. 802f650: 20010ff0 .word 0x20010ff0
  45686. 802f654: 0802f659 .word 0x0802f659
  45687. 0802f658 <tcpip_tcp_timer>:
  45688. *
  45689. * @param arg unused argument
  45690. */
  45691. static void
  45692. tcpip_tcp_timer(void *arg)
  45693. {
  45694. 802f658: b508 push {r3, lr}
  45695. LWIP_UNUSED_ARG(arg);
  45696. /* call TCP timer handler */
  45697. tcp_tmr();
  45698. 802f65a: f7fe fad3 bl 802dc04 <tcp_tmr>
  45699. /* timer still needed? */
  45700. if (tcp_active_pcbs || tcp_tw_pcbs) {
  45701. 802f65e: 4b08 ldr r3, [pc, #32] ; (802f680 <tcpip_tcp_timer+0x28>)
  45702. 802f660: 681b ldr r3, [r3, #0]
  45703. 802f662: b913 cbnz r3, 802f66a <tcpip_tcp_timer+0x12>
  45704. 802f664: 4b07 ldr r3, [pc, #28] ; (802f684 <tcpip_tcp_timer+0x2c>)
  45705. 802f666: 681b ldr r3, [r3, #0]
  45706. 802f668: b133 cbz r3, 802f678 <tcpip_tcp_timer+0x20>
  45707. /* restart timer */
  45708. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  45709. 802f66a: 4907 ldr r1, [pc, #28] ; (802f688 <tcpip_tcp_timer+0x30>)
  45710. 802f66c: 20fa movs r0, #250 ; 0xfa
  45711. 802f66e: 2200 movs r2, #0
  45712. } else {
  45713. /* disable timer */
  45714. tcpip_tcp_timer_active = 0;
  45715. }
  45716. }
  45717. 802f670: e8bd 4008 ldmia.w sp!, {r3, lr}
  45718. /* call TCP timer handler */
  45719. tcp_tmr();
  45720. /* timer still needed? */
  45721. if (tcp_active_pcbs || tcp_tw_pcbs) {
  45722. /* restart timer */
  45723. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  45724. 802f674: f7ff bf62 b.w 802f53c <sys_timeout>
  45725. } else {
  45726. /* disable timer */
  45727. tcpip_tcp_timer_active = 0;
  45728. 802f678: 4a04 ldr r2, [pc, #16] ; (802f68c <tcpip_tcp_timer+0x34>)
  45729. 802f67a: 6013 str r3, [r2, #0]
  45730. 802f67c: bd08 pop {r3, pc}
  45731. 802f67e: bf00 nop
  45732. 802f680: 20010fdc .word 0x20010fdc
  45733. 802f684: 20010ff0 .word 0x20010ff0
  45734. 802f688: 0802f659 .word 0x0802f659
  45735. 802f68c: 2000e11c .word 0x2000e11c
  45736. 0802f690 <sys_untimeout>:
  45737. void
  45738. sys_untimeout(sys_timeout_handler handler, void *arg)
  45739. {
  45740. struct sys_timeo *prev_t, *t;
  45741. if (next_timeout == NULL) {
  45742. 802f690: 4b10 ldr r3, [pc, #64] ; (802f6d4 <sys_untimeout+0x44>)
  45743. 802f692: 681b ldr r3, [r3, #0]
  45744. * @param handler callback function that would be called by the timeout
  45745. * @param arg callback argument that would be passed to handler
  45746. */
  45747. void
  45748. sys_untimeout(sys_timeout_handler handler, void *arg)
  45749. {
  45750. 802f694: b510 push {r4, lr}
  45751. struct sys_timeo *prev_t, *t;
  45752. if (next_timeout == NULL) {
  45753. 802f696: b1e3 cbz r3, 802f6d2 <sys_untimeout+0x42>
  45754. 802f698: 2200 movs r2, #0
  45755. 802f69a: e000 b.n 802f69e <sys_untimeout+0xe>
  45756. return;
  45757. }
  45758. for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {
  45759. 802f69c: 4623 mov r3, r4
  45760. if ((t->h == handler) && (t->arg == arg)) {
  45761. 802f69e: 689c ldr r4, [r3, #8]
  45762. 802f6a0: 4284 cmp r4, r0
  45763. 802f6a2: d112 bne.n 802f6ca <sys_untimeout+0x3a>
  45764. 802f6a4: 68dc ldr r4, [r3, #12]
  45765. 802f6a6: 428c cmp r4, r1
  45766. 802f6a8: d10f bne.n 802f6ca <sys_untimeout+0x3a>
  45767. 802f6aa: 6819 ldr r1, [r3, #0]
  45768. /* We have a match */
  45769. /* Unlink from previous in list */
  45770. if (prev_t == NULL) {
  45771. 802f6ac: b902 cbnz r2, 802f6b0 <sys_untimeout+0x20>
  45772. next_timeout = t->next;
  45773. 802f6ae: 4a09 ldr r2, [pc, #36] ; (802f6d4 <sys_untimeout+0x44>)
  45774. } else {
  45775. prev_t->next = t->next;
  45776. 802f6b0: 6011 str r1, [r2, #0]
  45777. }
  45778. /* If not the last one, add time of this one back to next */
  45779. if (t->next != NULL) {
  45780. 802f6b2: 681a ldr r2, [r3, #0]
  45781. 802f6b4: b11a cbz r2, 802f6be <sys_untimeout+0x2e>
  45782. t->next->time += t->time;
  45783. 802f6b6: 6850 ldr r0, [r2, #4]
  45784. 802f6b8: 6859 ldr r1, [r3, #4]
  45785. 802f6ba: 1841 adds r1, r0, r1
  45786. 802f6bc: 6051 str r1, [r2, #4]
  45787. }
  45788. memp_free(MEMP_SYS_TIMEOUT, t);
  45789. 802f6be: 2009 movs r0, #9
  45790. 802f6c0: 4619 mov r1, r3
  45791. return;
  45792. }
  45793. }
  45794. return;
  45795. }
  45796. 802f6c2: e8bd 4010 ldmia.w sp!, {r4, lr}
  45797. }
  45798. /* If not the last one, add time of this one back to next */
  45799. if (t->next != NULL) {
  45800. t->next->time += t->time;
  45801. }
  45802. memp_free(MEMP_SYS_TIMEOUT, t);
  45803. 802f6c6: f7fd bba9 b.w 802ce1c <memp_free>
  45804. if (next_timeout == NULL) {
  45805. return;
  45806. }
  45807. for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {
  45808. 802f6ca: 681c ldr r4, [r3, #0]
  45809. 802f6cc: 461a mov r2, r3
  45810. 802f6ce: 2c00 cmp r4, #0
  45811. 802f6d0: d1e4 bne.n 802f69c <sys_untimeout+0xc>
  45812. 802f6d2: bd10 pop {r4, pc}
  45813. 802f6d4: 2000e120 .word 0x2000e120
  45814. 0802f6d8 <sys_timeouts_mbox_fetch>:
  45815. * @param mbox the mbox to fetch the message from
  45816. * @param msg the place to store the message
  45817. */
  45818. void
  45819. sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)
  45820. {
  45821. 802f6d8: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  45822. struct sys_timeo *tmptimeout;
  45823. sys_timeout_handler handler;
  45824. void *arg;
  45825. again:
  45826. if (!next_timeout) {
  45827. 802f6dc: 4e18 ldr r6, [pc, #96] ; (802f740 <sys_timeouts_mbox_fetch+0x68>)
  45828. * @param mbox the mbox to fetch the message from
  45829. * @param msg the place to store the message
  45830. */
  45831. void
  45832. sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)
  45833. {
  45834. 802f6de: 4604 mov r4, r0
  45835. 802f6e0: 460d mov r5, r1
  45836. 802f6e2: 4637 mov r7, r6
  45837. struct sys_timeo *tmptimeout;
  45838. sys_timeout_handler handler;
  45839. void *arg;
  45840. again:
  45841. if (!next_timeout) {
  45842. 802f6e4: 6832 ldr r2, [r6, #0]
  45843. 802f6e6: b92a cbnz r2, 802f6f4 <sys_timeouts_mbox_fetch+0x1c>
  45844. time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
  45845. 802f6e8: 4620 mov r0, r4
  45846. 802f6ea: 4629 mov r1, r5
  45847. } else {
  45848. next_timeout->time = 0;
  45849. }
  45850. }
  45851. }
  45852. }
  45853. 802f6ec: e8bd 43f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  45854. sys_timeout_handler handler;
  45855. void *arg;
  45856. again:
  45857. if (!next_timeout) {
  45858. time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
  45859. 802f6f0: f005 b8b4 b.w 803485c <sys_arch_mbox_fetch>
  45860. } else {
  45861. if (next_timeout->time > 0) {
  45862. 802f6f4: 6852 ldr r2, [r2, #4]
  45863. 802f6f6: b96a cbnz r2, 802f714 <sys_timeouts_mbox_fetch+0x3c>
  45864. if (time_needed == SYS_ARCH_TIMEOUT) {
  45865. /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
  45866. could be fetched. We should now call the timeout handler and
  45867. deallocate the memory allocated for the timeout. */
  45868. tmptimeout = next_timeout;
  45869. 802f6f8: 6839 ldr r1, [r7, #0]
  45870. next_timeout = tmptimeout->next;
  45871. 802f6fa: 680a ldr r2, [r1, #0]
  45872. handler = tmptimeout->h;
  45873. 802f6fc: f8d1 8008 ldr.w r8, [r1, #8]
  45874. if (time_needed == SYS_ARCH_TIMEOUT) {
  45875. /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
  45876. could be fetched. We should now call the timeout handler and
  45877. deallocate the memory allocated for the timeout. */
  45878. tmptimeout = next_timeout;
  45879. next_timeout = tmptimeout->next;
  45880. 802f700: 603a str r2, [r7, #0]
  45881. if (handler != NULL) {
  45882. LWIP_DEBUGF(TIMERS_DEBUG, ("stmf calling h=%s arg=%p\n",
  45883. tmptimeout->handler_name, arg));
  45884. }
  45885. #endif /* LWIP_DEBUG_TIMERNAMES */
  45886. memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
  45887. 802f702: 2009 movs r0, #9
  45888. could be fetched. We should now call the timeout handler and
  45889. deallocate the memory allocated for the timeout. */
  45890. tmptimeout = next_timeout;
  45891. next_timeout = tmptimeout->next;
  45892. handler = tmptimeout->h;
  45893. arg = tmptimeout->arg;
  45894. 802f704: f8d1 900c ldr.w r9, [r1, #12]
  45895. if (handler != NULL) {
  45896. LWIP_DEBUGF(TIMERS_DEBUG, ("stmf calling h=%s arg=%p\n",
  45897. tmptimeout->handler_name, arg));
  45898. }
  45899. #endif /* LWIP_DEBUG_TIMERNAMES */
  45900. memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
  45901. 802f708: f7fd fb88 bl 802ce1c <memp_free>
  45902. if (handler != NULL) {
  45903. 802f70c: f1b8 0f00 cmp.w r8, #0
  45904. 802f710: d0e8 beq.n 802f6e4 <sys_timeouts_mbox_fetch+0xc>
  45905. 802f712: e006 b.n 802f722 <sys_timeouts_mbox_fetch+0x4a>
  45906. again:
  45907. if (!next_timeout) {
  45908. time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
  45909. } else {
  45910. if (next_timeout->time > 0) {
  45911. time_needed = sys_arch_mbox_fetch(mbox, msg, next_timeout->time);
  45912. 802f714: 4620 mov r0, r4
  45913. 802f716: 4629 mov r1, r5
  45914. 802f718: f005 f8a0 bl 803485c <sys_arch_mbox_fetch>
  45915. } else {
  45916. time_needed = SYS_ARCH_TIMEOUT;
  45917. }
  45918. if (time_needed == SYS_ARCH_TIMEOUT) {
  45919. 802f71c: 1c43 adds r3, r0, #1
  45920. 802f71e: d0eb beq.n 802f6f8 <sys_timeouts_mbox_fetch+0x20>
  45921. 802f720: e002 b.n 802f728 <sys_timeouts_mbox_fetch+0x50>
  45922. memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
  45923. if (handler != NULL) {
  45924. /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the
  45925. timeout handler function. */
  45926. LOCK_TCPIP_CORE();
  45927. handler(arg);
  45928. 802f722: 4648 mov r0, r9
  45929. 802f724: 47c0 blx r8
  45930. 802f726: e7dd b.n 802f6e4 <sys_timeouts_mbox_fetch+0xc>
  45931. goto again;
  45932. } else {
  45933. /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout
  45934. occured. The time variable is set to the number of
  45935. milliseconds we waited for the message. */
  45936. if (time_needed < next_timeout->time) {
  45937. 802f728: 4b05 ldr r3, [pc, #20] ; (802f740 <sys_timeouts_mbox_fetch+0x68>)
  45938. 802f72a: 681b ldr r3, [r3, #0]
  45939. 802f72c: 6859 ldr r1, [r3, #4]
  45940. 802f72e: 4288 cmp r0, r1
  45941. next_timeout->time -= time_needed;
  45942. 802f730: bf34 ite cc
  45943. 802f732: ebc0 0201 rsbcc r2, r0, r1
  45944. } else {
  45945. next_timeout->time = 0;
  45946. 802f736: 2200 movcs r2, #0
  45947. 802f738: 605a str r2, [r3, #4]
  45948. 802f73a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  45949. 802f73e: bf00 nop
  45950. 802f740: 2000e120 .word 0x2000e120
  45951. 0802f744 <udp_init>:
  45952. /**
  45953. * Initialize this module.
  45954. */
  45955. void
  45956. udp_init(void)
  45957. {
  45958. 802f744: 4770 bx lr
  45959. 802f746: 0000 movs r0, r0
  45960. 0802f748 <udp_input>:
  45961. * @param inp network interface on which the datagram was received.
  45962. *
  45963. */
  45964. void
  45965. udp_input(struct pbuf *p, struct netif *inp)
  45966. {
  45967. 802f748: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  45968. PERF_START;
  45969. UDP_STATS_INC(udp.recv);
  45970. iphdr = (struct ip_hdr *)p->payload;
  45971. 802f74c: f8d0 9004 ldr.w r9, [r0, #4]
  45972. /* Check minimum length (IP header + UDP header)
  45973. * and move payload pointer to UDP header */
  45974. if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) {
  45975. 802f750: 8903 ldrh r3, [r0, #8]
  45976. * @param inp network interface on which the datagram was received.
  45977. *
  45978. */
  45979. void
  45980. udp_input(struct pbuf *p, struct netif *inp)
  45981. {
  45982. 802f752: 460e mov r6, r1
  45983. iphdr = (struct ip_hdr *)p->payload;
  45984. /* Check minimum length (IP header + UDP header)
  45985. * and move payload pointer to UDP header */
  45986. if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) {
  45987. 802f754: f899 1000 ldrb.w r1, [r9]
  45988. 802f758: f001 010f and.w r1, r1, #15
  45989. 802f75c: 1c8a adds r2, r1, #2
  45990. 802f75e: ebb3 0f82 cmp.w r3, r2, lsl #2
  45991. * @param inp network interface on which the datagram was received.
  45992. *
  45993. */
  45994. void
  45995. udp_input(struct pbuf *p, struct netif *inp)
  45996. {
  45997. 802f762: b085 sub sp, #20
  45998. 802f764: 4605 mov r5, r0
  45999. iphdr = (struct ip_hdr *)p->payload;
  46000. /* Check minimum length (IP header + UDP header)
  46001. * and move payload pointer to UDP header */
  46002. if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) {
  46003. 802f766: db05 blt.n 802f774 <udp_input+0x2c>
  46004. 802f768: 0089 lsls r1, r1, #2
  46005. 802f76a: 4249 negs r1, r1
  46006. 802f76c: f7fd fc35 bl 802cfda <pbuf_header>
  46007. 802f770: 4683 mov fp, r0
  46008. 802f772: b110 cbz r0, 802f77a <udp_input+0x32>
  46009. /* drop short packets */
  46010. LWIP_DEBUGF(UDP_DEBUG,
  46011. ("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len));
  46012. UDP_STATS_INC(udp.lenerr);
  46013. UDP_STATS_INC(udp.drop);
  46014. snmp_inc_udpinerrors();
  46015. 802f774: f002 fa6c bl 8031c50 <snmp_inc_udpinerrors>
  46016. 802f778: e096 b.n 802f8a8 <udp_input+0x160>
  46017. }
  46018. udphdr = (struct udp_hdr *)p->payload;
  46019. /* is broadcast packet ? */
  46020. broadcast = ip_addr_isbroadcast(&current_iphdr_dest, inp);
  46021. 802f77a: f8df a150 ldr.w sl, [pc, #336] ; 802f8cc <udp_input+0x184>
  46022. snmp_inc_udpinerrors();
  46023. pbuf_free(p);
  46024. goto end;
  46025. }
  46026. udphdr = (struct udp_hdr *)p->payload;
  46027. 802f77e: 686c ldr r4, [r5, #4]
  46028. /* is broadcast packet ? */
  46029. broadcast = ip_addr_isbroadcast(&current_iphdr_dest, inp);
  46030. 802f780: f8da 0000 ldr.w r0, [sl]
  46031. 802f784: 4631 mov r1, r6
  46032. 802f786: f000 faed bl 802fd64 <ip4_addr_isbroadcast>
  46033. 802f78a: 4680 mov r8, r0
  46034. LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len));
  46035. /* convert src and dest ports to host byte order */
  46036. src = ntohs(udphdr->src);
  46037. 802f78c: 8820 ldrh r0, [r4, #0]
  46038. 802f78e: f7fc fb16 bl 802bdbe <lwip_ntohs>
  46039. 802f792: 4607 mov r7, r0
  46040. dest = ntohs(udphdr->dest);
  46041. 802f794: 8860 ldrh r0, [r4, #2]
  46042. 802f796: f7fc fb12 bl 802bdbe <lwip_ntohs>
  46043. #if LWIP_DHCP
  46044. pcb = NULL;
  46045. /* when LWIP_DHCP is active, packets to DHCP_CLIENT_PORT may only be processed by
  46046. the dhcp module, no other UDP pcb may use the local UDP port DHCP_CLIENT_PORT */
  46047. if (dest == DHCP_CLIENT_PORT) {
  46048. 802f79a: 2844 cmp r0, #68 ; 0x44
  46049. 802f79c: d10f bne.n 802f7be <udp_input+0x76>
  46050. /* all packets for DHCP_CLIENT_PORT not coming from DHCP_SERVER_PORT are dropped! */
  46051. if (src == DHCP_SERVER_PORT) {
  46052. 802f79e: 2f43 cmp r7, #67 ; 0x43
  46053. 802f7a0: d14f bne.n 802f842 <udp_input+0xfa>
  46054. if ((inp->dhcp != NULL) && (inp->dhcp->pcb != NULL)) {
  46055. 802f7a2: 6a33 ldr r3, [r6, #32]
  46056. 802f7a4: 2b00 cmp r3, #0
  46057. 802f7a6: d04c beq.n 802f842 <udp_input+0xfa>
  46058. 802f7a8: 685c ldr r4, [r3, #4]
  46059. 802f7aa: 2c00 cmp r4, #0
  46060. 802f7ac: d049 beq.n 802f842 <udp_input+0xfa>
  46061. /* accept the packe if
  46062. (- broadcast or directed to us) -> DHCP is link-layer-addressed, local ip is always ANY!
  46063. - inp->dhcp->pcb->remote == ANY or iphdr->src */
  46064. if ((ip_addr_isany(&inp->dhcp->pcb->remote_ip) ||
  46065. 802f7ae: 6863 ldr r3, [r4, #4]
  46066. 802f7b0: 2b00 cmp r3, #0
  46067. 802f7b2: d04e beq.n 802f852 <udp_input+0x10a>
  46068. ip_addr_cmp(&(inp->dhcp->pcb->remote_ip), &current_iphdr_src))) {
  46069. 802f7b4: 4a43 ldr r2, [pc, #268] ; (802f8c4 <udp_input+0x17c>)
  46070. if (src == DHCP_SERVER_PORT) {
  46071. if ((inp->dhcp != NULL) && (inp->dhcp->pcb != NULL)) {
  46072. /* accept the packe if
  46073. (- broadcast or directed to us) -> DHCP is link-layer-addressed, local ip is always ANY!
  46074. - inp->dhcp->pcb->remote == ANY or iphdr->src */
  46075. if ((ip_addr_isany(&inp->dhcp->pcb->remote_ip) ||
  46076. 802f7b6: 6812 ldr r2, [r2, #0]
  46077. 802f7b8: 4293 cmp r3, r2
  46078. 802f7ba: d142 bne.n 802f842 <udp_input+0xfa>
  46079. 802f7bc: e049 b.n 802f852 <udp_input+0x10a>
  46080. uncon_pcb = NULL;
  46081. /* Iterate through the UDP pcb list for a matching pcb.
  46082. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  46083. * preferred. If no perfect match is found, the first unconnected pcb that
  46084. * matches the local port and ip address gets the datagram. */
  46085. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  46086. 802f7be: 4b42 ldr r3, [pc, #264] ; (802f8c8 <udp_input+0x180>)
  46087. /* compare PCB local addr+port to UDP destination addr+port */
  46088. if (pcb->local_port == dest) {
  46089. if (
  46090. (!broadcast && ip_addr_isany(&pcb->local_ip)) ||
  46091. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest) ||
  46092. 802f7c0: f8da a000 ldr.w sl, [sl]
  46093. uncon_pcb = NULL;
  46094. /* Iterate through the UDP pcb list for a matching pcb.
  46095. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  46096. * preferred. If no perfect match is found, the first unconnected pcb that
  46097. * matches the local port and ip address gets the datagram. */
  46098. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  46099. 802f7c4: f8d3 c000 ldr.w ip, [r3]
  46100. }
  46101. /* compare PCB remote addr+port to UDP source addr+port */
  46102. if ((local_match != 0) &&
  46103. (pcb->remote_port == src) &&
  46104. (ip_addr_isany(&pcb->remote_ip) ||
  46105. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  46106. 802f7c8: 4b3e ldr r3, [pc, #248] ; (802f8c4 <udp_input+0x17c>)
  46107. 802f7ca: 681b ldr r3, [r3, #0]
  46108. uncon_pcb = NULL;
  46109. /* Iterate through the UDP pcb list for a matching pcb.
  46110. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  46111. * preferred. If no perfect match is found, the first unconnected pcb that
  46112. * matches the local port and ip address gets the datagram. */
  46113. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  46114. 802f7cc: 4664 mov r4, ip
  46115. }
  46116. /* compare PCB remote addr+port to UDP source addr+port */
  46117. if ((local_match != 0) &&
  46118. (pcb->remote_port == src) &&
  46119. (ip_addr_isany(&pcb->remote_ip) ||
  46120. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  46121. 802f7ce: 9303 str r3, [sp, #12]
  46122. }
  46123. }
  46124. } else
  46125. #endif /* LWIP_DHCP */
  46126. {
  46127. prev = NULL;
  46128. 802f7d0: 4659 mov r1, fp
  46129. local_match = 0;
  46130. uncon_pcb = NULL;
  46131. 802f7d2: 465b mov r3, fp
  46132. /* Iterate through the UDP pcb list for a matching pcb.
  46133. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  46134. * preferred. If no perfect match is found, the first unconnected pcb that
  46135. * matches the local port and ip address gets the datagram. */
  46136. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  46137. 802f7d4: e032 b.n 802f83c <udp_input+0xf4>
  46138. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip), pcb->local_port,
  46139. ip4_addr1_16(&pcb->remote_ip), ip4_addr2_16(&pcb->remote_ip),
  46140. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip), pcb->remote_port));
  46141. /* compare PCB local addr+port to UDP destination addr+port */
  46142. if (pcb->local_port == dest) {
  46143. 802f7d6: 8a62 ldrh r2, [r4, #18]
  46144. 802f7d8: 4282 cmp r2, r0
  46145. 802f7da: d12d bne.n 802f838 <udp_input+0xf0>
  46146. 802f7dc: 6822 ldr r2, [r4, #0]
  46147. if (
  46148. 802f7de: f1b8 0f00 cmp.w r8, #0
  46149. 802f7e2: d100 bne.n 802f7e6 <udp_input+0x9e>
  46150. (!broadcast && ip_addr_isany(&pcb->local_ip)) ||
  46151. 802f7e4: b15a cbz r2, 802f7fe <udp_input+0xb6>
  46152. 802f7e6: 4552 cmp r2, sl
  46153. 802f7e8: d009 beq.n 802f7fe <udp_input+0xb6>
  46154. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest) ||
  46155. 802f7ea: f1b8 0f00 cmp.w r8, #0
  46156. 802f7ee: d023 beq.n 802f838 <udp_input+0xf0>
  46157. (broadcast && ip_get_option(pcb, SOF_BROADCAST) &&
  46158. (ip_addr_isany(&pcb->local_ip) ||
  46159. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  46160. #else /* IP_SOF_BROADCAST_RECV */
  46161. (broadcast &&
  46162. (ip_addr_isany(&pcb->local_ip) ||
  46163. 802f7f0: b12a cbz r2, 802f7fe <udp_input+0xb6>
  46164. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  46165. 802f7f2: ea8a 0b02 eor.w fp, sl, r2
  46166. 802f7f6: 68b2 ldr r2, [r6, #8]
  46167. (broadcast && ip_get_option(pcb, SOF_BROADCAST) &&
  46168. (ip_addr_isany(&pcb->local_ip) ||
  46169. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  46170. #else /* IP_SOF_BROADCAST_RECV */
  46171. (broadcast &&
  46172. (ip_addr_isany(&pcb->local_ip) ||
  46173. 802f7f8: ea1b 0f02 tst.w fp, r2
  46174. 802f7fc: d11c bne.n 802f838 <udp_input+0xf0>
  46175. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  46176. #endif /* IP_SOF_BROADCAST_RECV */
  46177. local_match = 1;
  46178. if ((uncon_pcb == NULL) &&
  46179. 802f7fe: 2b00 cmp r3, #0
  46180. 802f800: d158 bne.n 802f8b4 <udp_input+0x16c>
  46181. ((pcb->flags & UDP_FLAGS_CONNECTED) == 0)) {
  46182. 802f802: 7c23 ldrb r3, [r4, #16]
  46183. (broadcast &&
  46184. (ip_addr_isany(&pcb->local_ip) ||
  46185. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  46186. #endif /* IP_SOF_BROADCAST_RECV */
  46187. local_match = 1;
  46188. if ((uncon_pcb == NULL) &&
  46189. 802f804: f003 0304 and.w r3, r3, #4
  46190. 802f808: b2db uxtb r3, r3
  46191. 802f80a: 2b00 cmp r3, #0
  46192. 802f80c: bf0c ite eq
  46193. 802f80e: 4623 moveq r3, r4
  46194. 802f810: 2300 movne r3, #0
  46195. 802f812: e04f b.n 802f8b4 <udp_input+0x16c>
  46196. }
  46197. }
  46198. /* compare PCB remote addr+port to UDP source addr+port */
  46199. if ((local_match != 0) &&
  46200. (pcb->remote_port == src) &&
  46201. (ip_addr_isany(&pcb->remote_ip) ||
  46202. 802f814: f8d4 b004 ldr.w fp, [r4, #4]
  46203. 802f818: f1bb 0f00 cmp.w fp, #0
  46204. 802f81c: d101 bne.n 802f822 <udp_input+0xda>
  46205. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  46206. /* the first fully matching PCB */
  46207. if (prev != NULL) {
  46208. 802f81e: b921 cbnz r1, 802f82a <udp_input+0xe2>
  46209. 802f820: e017 b.n 802f852 <udp_input+0x10a>
  46210. }
  46211. }
  46212. /* compare PCB remote addr+port to UDP source addr+port */
  46213. if ((local_match != 0) &&
  46214. (pcb->remote_port == src) &&
  46215. (ip_addr_isany(&pcb->remote_ip) ||
  46216. 802f822: 9a03 ldr r2, [sp, #12]
  46217. 802f824: 4593 cmp fp, r2
  46218. 802f826: d107 bne.n 802f838 <udp_input+0xf0>
  46219. 802f828: e7f9 b.n 802f81e <udp_input+0xd6>
  46220. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  46221. /* the first fully matching PCB */
  46222. if (prev != NULL) {
  46223. /* move the pcb to the front of udp_pcbs so that is
  46224. found faster next time */
  46225. prev->next = pcb->next;
  46226. 802f82a: 68e3 ldr r3, [r4, #12]
  46227. 802f82c: 60cb str r3, [r1, #12]
  46228. pcb->next = udp_pcbs;
  46229. udp_pcbs = pcb;
  46230. 802f82e: 4b26 ldr r3, [pc, #152] ; (802f8c8 <udp_input+0x180>)
  46231. /* the first fully matching PCB */
  46232. if (prev != NULL) {
  46233. /* move the pcb to the front of udp_pcbs so that is
  46234. found faster next time */
  46235. prev->next = pcb->next;
  46236. pcb->next = udp_pcbs;
  46237. 802f830: f8c4 c00c str.w ip, [r4, #12]
  46238. udp_pcbs = pcb;
  46239. 802f834: 601c str r4, [r3, #0]
  46240. 802f836: e00c b.n 802f852 <udp_input+0x10a>
  46241. 802f838: 4621 mov r1, r4
  46242. uncon_pcb = NULL;
  46243. /* Iterate through the UDP pcb list for a matching pcb.
  46244. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  46245. * preferred. If no perfect match is found, the first unconnected pcb that
  46246. * matches the local port and ip address gets the datagram. */
  46247. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  46248. 802f83a: 68e4 ldr r4, [r4, #12]
  46249. 802f83c: 2c00 cmp r4, #0
  46250. 802f83e: d1ca bne.n 802f7d6 <udp_input+0x8e>
  46251. pcb = uncon_pcb;
  46252. }
  46253. }
  46254. /* Check checksum if this is a match or if it was directed at us. */
  46255. if (pcb != NULL || ip_addr_cmp(&inp->ip_addr, &current_iphdr_dest)) {
  46256. 802f840: b933 cbnz r3, 802f850 <udp_input+0x108>
  46257. 802f842: 4b22 ldr r3, [pc, #136] ; (802f8cc <udp_input+0x184>)
  46258. 802f844: 6872 ldr r2, [r6, #4]
  46259. 802f846: 681b ldr r3, [r3, #0]
  46260. 802f848: 429a cmp r2, r3
  46261. 802f84a: d12d bne.n 802f8a8 <udp_input+0x160>
  46262. 802f84c: 2400 movs r4, #0
  46263. 802f84e: e000 b.n 802f852 <udp_input+0x10a>
  46264. 802f850: 461c mov r4, r3
  46265. goto end;
  46266. }
  46267. }
  46268. #endif /* CHECKSUM_CHECK_UDP */
  46269. }
  46270. if(pbuf_header(p, -UDP_HLEN)) {
  46271. 802f852: 4628 mov r0, r5
  46272. 802f854: f06f 0107 mvn.w r1, #7
  46273. 802f858: f7fd fbbf bl 802cfda <pbuf_header>
  46274. 802f85c: 2800 cmp r0, #0
  46275. 802f85e: d189 bne.n 802f774 <udp_input+0x2c>
  46276. UDP_STATS_INC(udp.drop);
  46277. snmp_inc_udpinerrors();
  46278. pbuf_free(p);
  46279. goto end;
  46280. }
  46281. if (pcb != NULL) {
  46282. 802f860: b154 cbz r4, 802f878 <udp_input+0x130>
  46283. snmp_inc_udpindatagrams();
  46284. 802f862: f002 f9e5 bl 8031c30 <snmp_inc_udpindatagrams>
  46285. pbuf_header(p, -(s16_t)((IPH_HL(iphdr) * 4) + UDP_HLEN));
  46286. }
  46287. }
  46288. #endif /* SO_REUSE && SO_REUSE_RXTOALL */
  46289. /* callback */
  46290. if (pcb->recv != NULL) {
  46291. 802f866: 69a6 ldr r6, [r4, #24]
  46292. 802f868: b1f6 cbz r6, 802f8a8 <udp_input+0x160>
  46293. /* now the recv function is responsible for freeing p */
  46294. pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
  46295. 802f86a: 9700 str r7, [sp, #0]
  46296. 802f86c: 69e0 ldr r0, [r4, #28]
  46297. 802f86e: 4b15 ldr r3, [pc, #84] ; (802f8c4 <udp_input+0x17c>)
  46298. 802f870: 4621 mov r1, r4
  46299. 802f872: 462a mov r2, r5
  46300. 802f874: 47b0 blx r6
  46301. 802f876: e021 b.n 802f8bc <udp_input+0x174>
  46302. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n"));
  46303. #if LWIP_ICMP
  46304. /* No match was found, send ICMP destination port unreachable unless
  46305. destination address was broadcast/multicast. */
  46306. if (!broadcast &&
  46307. 802f878: f1b8 0f00 cmp.w r8, #0
  46308. 802f87c: d112 bne.n 802f8a4 <udp_input+0x15c>
  46309. !ip_addr_ismulticast(&current_iphdr_dest)) {
  46310. 802f87e: 4b13 ldr r3, [pc, #76] ; (802f8cc <udp_input+0x184>)
  46311. 802f880: 681b ldr r3, [r3, #0]
  46312. 802f882: f003 03f0 and.w r3, r3, #240 ; 0xf0
  46313. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n"));
  46314. #if LWIP_ICMP
  46315. /* No match was found, send ICMP destination port unreachable unless
  46316. destination address was broadcast/multicast. */
  46317. if (!broadcast &&
  46318. 802f886: 2be0 cmp r3, #224 ; 0xe0
  46319. 802f888: d00c beq.n 802f8a4 <udp_input+0x15c>
  46320. !ip_addr_ismulticast(&current_iphdr_dest)) {
  46321. /* move payload pointer back to ip header */
  46322. pbuf_header(p, (IPH_HL(iphdr) * 4) + UDP_HLEN);
  46323. 802f88a: f899 1000 ldrb.w r1, [r9]
  46324. 802f88e: f001 010f and.w r1, r1, #15
  46325. 802f892: 3102 adds r1, #2
  46326. 802f894: 0089 lsls r1, r1, #2
  46327. 802f896: 4628 mov r0, r5
  46328. 802f898: f7fd fb9f bl 802cfda <pbuf_header>
  46329. LWIP_ASSERT("p->payload == iphdr", (p->payload == iphdr));
  46330. icmp_dest_unreach(p, ICMP_DUR_PORT);
  46331. 802f89c: 4628 mov r0, r5
  46332. 802f89e: 2103 movs r1, #3
  46333. 802f8a0: f000 f9d2 bl 802fc48 <icmp_dest_unreach>
  46334. }
  46335. #endif /* LWIP_ICMP */
  46336. UDP_STATS_INC(udp.proterr);
  46337. UDP_STATS_INC(udp.drop);
  46338. snmp_inc_udpnoports();
  46339. 802f8a4: f002 f9cc bl 8031c40 <snmp_inc_udpnoports>
  46340. pbuf_free(p);
  46341. 802f8a8: 4628 mov r0, r5
  46342. } else {
  46343. pbuf_free(p);
  46344. }
  46345. end:
  46346. PERF_STOP("udp_input");
  46347. }
  46348. 802f8aa: b005 add sp, #20
  46349. 802f8ac: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  46350. }
  46351. #endif /* LWIP_ICMP */
  46352. UDP_STATS_INC(udp.proterr);
  46353. UDP_STATS_INC(udp.drop);
  46354. snmp_inc_udpnoports();
  46355. pbuf_free(p);
  46356. 802f8b0: f7fd bbbe b.w 802d030 <pbuf_free>
  46357. uncon_pcb = pcb;
  46358. }
  46359. }
  46360. }
  46361. /* compare PCB remote addr+port to UDP source addr+port */
  46362. if ((local_match != 0) &&
  46363. 802f8b4: 8aa2 ldrh r2, [r4, #20]
  46364. 802f8b6: 42ba cmp r2, r7
  46365. 802f8b8: d1be bne.n 802f838 <udp_input+0xf0>
  46366. 802f8ba: e7ab b.n 802f814 <udp_input+0xcc>
  46367. } else {
  46368. pbuf_free(p);
  46369. }
  46370. end:
  46371. PERF_STOP("udp_input");
  46372. }
  46373. 802f8bc: b005 add sp, #20
  46374. 802f8be: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  46375. 802f8c2: bf00 nop
  46376. 802f8c4: 20010ffc .word 0x20010ffc
  46377. 802f8c8: 20010ff8 .word 0x20010ff8
  46378. 802f8cc: 20011004 .word 0x20011004
  46379. 0802f8d0 <udp_bind>:
  46380. *
  46381. * @see udp_disconnect()
  46382. */
  46383. err_t
  46384. udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  46385. {
  46386. 802f8d0: b5f8 push {r3, r4, r5, r6, r7, lr}
  46387. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  46388. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  46389. rebind = 0;
  46390. /* Check for double bind and rebind of the same pcb */
  46391. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  46392. 802f8d2: 4b25 ldr r3, [pc, #148] ; (802f968 <udp_bind+0x98>)
  46393. *
  46394. * @see udp_disconnect()
  46395. */
  46396. err_t
  46397. udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  46398. {
  46399. 802f8d4: 4604 mov r4, r0
  46400. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  46401. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  46402. rebind = 0;
  46403. /* Check for double bind and rebind of the same pcb */
  46404. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  46405. 802f8d6: 6818 ldr r0, [r3, #0]
  46406. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = "));
  46407. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  46408. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  46409. rebind = 0;
  46410. 802f8d8: 2500 movs r5, #0
  46411. /* Check for double bind and rebind of the same pcb */
  46412. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  46413. 802f8da: 4603 mov r3, r0
  46414. 802f8dc: e012 b.n 802f904 <udp_bind+0x34>
  46415. /* is this UDP PCB already on active list? */
  46416. if (pcb == ipcb) {
  46417. 802f8de: 429c cmp r4, r3
  46418. 802f8e0: d00e beq.n 802f900 <udp_bind+0x30>
  46419. !ip_get_option(ipcb, SOF_REUSEADDR)) {
  46420. #else /* SO_REUSE */
  46421. /* port matches that of PCB in list and REUSEADDR not set -> reject */
  46422. else {
  46423. #endif /* SO_REUSE */
  46424. if ((ipcb->local_port == port) &&
  46425. 802f8e2: 8a5e ldrh r6, [r3, #18]
  46426. 802f8e4: 4296 cmp r6, r2
  46427. 802f8e6: d10c bne.n 802f902 <udp_bind+0x32>
  46428. /* IP address matches, or one is IP_ADDR_ANY? */
  46429. (ip_addr_isany(&(ipcb->local_ip)) ||
  46430. 802f8e8: 681f ldr r7, [r3, #0]
  46431. 802f8ea: b90f cbnz r7, 802f8f0 <udp_bind+0x20>
  46432. ip_addr_isany(ipaddr) ||
  46433. ip_addr_cmp(&(ipcb->local_ip), ipaddr))) {
  46434. /* other PCB already binds to this local IP and port */
  46435. LWIP_DEBUGF(UDP_DEBUG,
  46436. ("udp_bind: local port %"U16_F" already bound by another pcb\n", port));
  46437. return ERR_USE;
  46438. 802f8ec: 20f8 movs r0, #248 ; 0xf8
  46439. 802f8ee: e039 b.n 802f964 <udp_bind+0x94>
  46440. /* port matches that of PCB in list and REUSEADDR not set -> reject */
  46441. else {
  46442. #endif /* SO_REUSE */
  46443. if ((ipcb->local_port == port) &&
  46444. /* IP address matches, or one is IP_ADDR_ANY? */
  46445. (ip_addr_isany(&(ipcb->local_ip)) ||
  46446. 802f8f0: 2900 cmp r1, #0
  46447. 802f8f2: d0fb beq.n 802f8ec <udp_bind+0x1c>
  46448. ip_addr_isany(ipaddr) ||
  46449. 802f8f4: 680e ldr r6, [r1, #0]
  46450. 802f8f6: 2e00 cmp r6, #0
  46451. 802f8f8: d0f8 beq.n 802f8ec <udp_bind+0x1c>
  46452. 802f8fa: 42b7 cmp r7, r6
  46453. 802f8fc: d101 bne.n 802f902 <udp_bind+0x32>
  46454. 802f8fe: e7f5 b.n 802f8ec <udp_bind+0x1c>
  46455. /* is this UDP PCB already on active list? */
  46456. if (pcb == ipcb) {
  46457. /* pcb may occur at most once in active list */
  46458. LWIP_ASSERT("rebind == 0", rebind == 0);
  46459. /* pcb already in list, just rebind */
  46460. rebind = 1;
  46461. 802f900: 2501 movs r5, #1
  46462. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  46463. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  46464. rebind = 0;
  46465. /* Check for double bind and rebind of the same pcb */
  46466. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  46467. 802f902: 68db ldr r3, [r3, #12]
  46468. 802f904: 2b00 cmp r3, #0
  46469. 802f906: d1ea bne.n 802f8de <udp_bind+0xe>
  46470. return ERR_USE;
  46471. }
  46472. }
  46473. }
  46474. ip_addr_set(&pcb->local_ip, ipaddr);
  46475. 802f908: b101 cbz r1, 802f90c <udp_bind+0x3c>
  46476. 802f90a: 6809 ldr r1, [r1, #0]
  46477. 802f90c: 6021 str r1, [r4, #0]
  46478. /* no port specified? */
  46479. if (port == 0) {
  46480. 802f90e: b9fa cbnz r2, 802f950 <udp_bind+0x80>
  46481. 802f910: 4b16 ldr r3, [pc, #88] ; (802f96c <udp_bind+0x9c>)
  46482. 802f912: 881a ldrh r2, [r3, #0]
  46483. 802f914: f44f 4180 mov.w r1, #16384 ; 0x4000
  46484. {
  46485. u16_t n = 0;
  46486. struct udp_pcb *pcb;
  46487. again:
  46488. if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {
  46489. 802f918: f64f 76ff movw r6, #65535 ; 0xffff
  46490. 802f91c: 42b2 cmp r2, r6
  46491. 802f91e: d002 beq.n 802f926 <udp_bind+0x56>
  46492. 802f920: 3201 adds r2, #1
  46493. 802f922: b292 uxth r2, r2
  46494. 802f924: e001 b.n 802f92a <udp_bind+0x5a>
  46495. udp_port = UDP_LOCAL_PORT_RANGE_START;
  46496. 802f926: f44f 4240 mov.w r2, #49152 ; 0xc000
  46497. }
  46498. /* Check all PCBs. */
  46499. for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  46500. 802f92a: 4603 mov r3, r0
  46501. 802f92c: e00a b.n 802f944 <udp_bind+0x74>
  46502. if (pcb->local_port == udp_port) {
  46503. 802f92e: 8a5f ldrh r7, [r3, #18]
  46504. 802f930: 4297 cmp r7, r2
  46505. 802f932: d106 bne.n 802f942 <udp_bind+0x72>
  46506. 802f934: 3901 subs r1, #1
  46507. 802f936: b289 uxth r1, r1
  46508. if (++n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) {
  46509. 802f938: 2900 cmp r1, #0
  46510. 802f93a: d1ef bne.n 802f91c <udp_bind+0x4c>
  46511. 802f93c: 4b0b ldr r3, [pc, #44] ; (802f96c <udp_bind+0x9c>)
  46512. 802f93e: 801a strh r2, [r3, #0]
  46513. 802f940: e7d4 b.n 802f8ec <udp_bind+0x1c>
  46514. again:
  46515. if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {
  46516. udp_port = UDP_LOCAL_PORT_RANGE_START;
  46517. }
  46518. /* Check all PCBs. */
  46519. for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  46520. 802f942: 68db ldr r3, [r3, #12]
  46521. 802f944: 2b00 cmp r3, #0
  46522. 802f946: d1f2 bne.n 802f92e <udp_bind+0x5e>
  46523. 802f948: 4b08 ldr r3, [pc, #32] ; (802f96c <udp_bind+0x9c>)
  46524. 802f94a: 801a strh r2, [r3, #0]
  46525. ip_addr_set(&pcb->local_ip, ipaddr);
  46526. /* no port specified? */
  46527. if (port == 0) {
  46528. port = udp_new_port();
  46529. if (port == 0) {
  46530. 802f94c: 2a00 cmp r2, #0
  46531. 802f94e: d0cd beq.n 802f8ec <udp_bind+0x1c>
  46532. /* no more ports available in local range */
  46533. LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n"));
  46534. return ERR_USE;
  46535. }
  46536. }
  46537. pcb->local_port = port;
  46538. 802f950: 8262 strh r2, [r4, #18]
  46539. snmp_insert_udpidx_tree(pcb);
  46540. 802f952: 4620 mov r0, r4
  46541. 802f954: f002 f98c bl 8031c70 <snmp_insert_udpidx_tree>
  46542. /* pcb not active yet? */
  46543. if (rebind == 0) {
  46544. 802f958: b91d cbnz r5, 802f962 <udp_bind+0x92>
  46545. /* place the PCB on the active list if not already there */
  46546. pcb->next = udp_pcbs;
  46547. 802f95a: 4b03 ldr r3, [pc, #12] ; (802f968 <udp_bind+0x98>)
  46548. 802f95c: 681a ldr r2, [r3, #0]
  46549. udp_pcbs = pcb;
  46550. 802f95e: 601c str r4, [r3, #0]
  46551. pcb->local_port = port;
  46552. snmp_insert_udpidx_tree(pcb);
  46553. /* pcb not active yet? */
  46554. if (rebind == 0) {
  46555. /* place the PCB on the active list if not already there */
  46556. pcb->next = udp_pcbs;
  46557. 802f960: 60e2 str r2, [r4, #12]
  46558. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  46559. ("udp_bind: bound to %"U16_F".%"U16_F".%"U16_F".%"U16_F", port %"U16_F"\n",
  46560. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  46561. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  46562. pcb->local_port));
  46563. return ERR_OK;
  46564. 802f962: 2000 movs r0, #0
  46565. }
  46566. 802f964: b240 sxtb r0, r0
  46567. 802f966: bdf8 pop {r3, r4, r5, r6, r7, pc}
  46568. 802f968: 20010ff8 .word 0x20010ff8
  46569. 802f96c: 200015ee .word 0x200015ee
  46570. 0802f970 <udp_sendto_if>:
  46571. * @see udp_disconnect() udp_send()
  46572. */
  46573. err_t
  46574. udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,
  46575. ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif)
  46576. {
  46577. 802f970: e92d 47ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr}
  46578. 802f974: 4692 mov sl, r2
  46579. return ERR_VAL;
  46580. }
  46581. #endif /* IP_SOF_BROADCAST */
  46582. /* if the PCB is not yet bound to a port, bind it here */
  46583. if (pcb->local_port == 0) {
  46584. 802f976: 8a42 ldrh r2, [r0, #18]
  46585. * @see udp_disconnect() udp_send()
  46586. */
  46587. err_t
  46588. udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,
  46589. ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif)
  46590. {
  46591. 802f978: f8dd 8030 ldr.w r8, [sp, #48] ; 0x30
  46592. 802f97c: 4605 mov r5, r0
  46593. 802f97e: 460e mov r6, r1
  46594. 802f980: 4699 mov r9, r3
  46595. return ERR_VAL;
  46596. }
  46597. #endif /* IP_SOF_BROADCAST */
  46598. /* if the PCB is not yet bound to a port, bind it here */
  46599. if (pcb->local_port == 0) {
  46600. 802f982: b132 cbz r2, 802f992 <udp_sendto_if+0x22>
  46601. return err;
  46602. }
  46603. }
  46604. /* not enough space to add an UDP header to first pbuf in given p chain? */
  46605. if (pbuf_header(p, UDP_HLEN)) {
  46606. 802f984: 4630 mov r0, r6
  46607. 802f986: 2108 movs r1, #8
  46608. 802f988: f7fd fb27 bl 802cfda <pbuf_header>
  46609. 802f98c: b940 cbnz r0, 802f9a0 <udp_sendto_if+0x30>
  46610. 802f98e: 4634 mov r4, r6
  46611. 802f990: e013 b.n 802f9ba <udp_sendto_if+0x4a>
  46612. #endif /* IP_SOF_BROADCAST */
  46613. /* if the PCB is not yet bound to a port, bind it here */
  46614. if (pcb->local_port == 0) {
  46615. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send: not yet bound to a port, binding now\n"));
  46616. err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
  46617. 802f992: 4601 mov r1, r0
  46618. 802f994: f7ff ff9c bl 802f8d0 <udp_bind>
  46619. if (err != ERR_OK) {
  46620. 802f998: 4607 mov r7, r0
  46621. 802f99a: 2800 cmp r0, #0
  46622. 802f99c: d0f2 beq.n 802f984 <udp_sendto_if+0x14>
  46623. 802f99e: e044 b.n 802fa2a <udp_sendto_if+0xba>
  46624. }
  46625. /* not enough space to add an UDP header to first pbuf in given p chain? */
  46626. if (pbuf_header(p, UDP_HLEN)) {
  46627. /* allocate header in a separate new pbuf */
  46628. q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
  46629. 802f9a0: 2001 movs r0, #1
  46630. 802f9a2: 2108 movs r1, #8
  46631. 802f9a4: 2200 movs r2, #0
  46632. 802f9a6: f7fd fb90 bl 802d0ca <pbuf_alloc>
  46633. /* new header pbuf could not be allocated? */
  46634. if (q == NULL) {
  46635. 802f9aa: 4604 mov r4, r0
  46636. 802f9ac: 2800 cmp r0, #0
  46637. 802f9ae: d039 beq.n 802fa24 <udp_sendto_if+0xb4>
  46638. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n"));
  46639. return ERR_MEM;
  46640. }
  46641. if (p->tot_len != 0) {
  46642. 802f9b0: 8933 ldrh r3, [r6, #8]
  46643. 802f9b2: b113 cbz r3, 802f9ba <udp_sendto_if+0x4a>
  46644. /* chain header q in front of given pbuf p (only if p contains data) */
  46645. pbuf_chain(q, p);
  46646. 802f9b4: 4631 mov r1, r6
  46647. 802f9b6: f7fd fc36 bl 802d226 <pbuf_chain>
  46648. }
  46649. LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
  46650. (q->len >= sizeof(struct udp_hdr)));
  46651. /* q now represents the packet to be sent */
  46652. udphdr = (struct udp_hdr *)q->payload;
  46653. udphdr->src = htons(pcb->local_port);
  46654. 802f9ba: 8a68 ldrh r0, [r5, #18]
  46655. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p));
  46656. }
  46657. LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
  46658. (q->len >= sizeof(struct udp_hdr)));
  46659. /* q now represents the packet to be sent */
  46660. udphdr = (struct udp_hdr *)q->payload;
  46661. 802f9bc: 6867 ldr r7, [r4, #4]
  46662. udphdr->src = htons(pcb->local_port);
  46663. 802f9be: f7fc f9f9 bl 802bdb4 <lwip_htons>
  46664. 802f9c2: 8038 strh r0, [r7, #0]
  46665. udphdr->dest = htons(dst_port);
  46666. 802f9c4: 4648 mov r0, r9
  46667. 802f9c6: f7fc f9f5 bl 802bdb4 <lwip_htons>
  46668. /* in UDP, 0 checksum means 'no checksum' */
  46669. udphdr->chksum = 0x0000;
  46670. 802f9ca: 2300 movs r3, #0
  46671. LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
  46672. (q->len >= sizeof(struct udp_hdr)));
  46673. /* q now represents the packet to be sent */
  46674. udphdr = (struct udp_hdr *)q->payload;
  46675. udphdr->src = htons(pcb->local_port);
  46676. udphdr->dest = htons(dst_port);
  46677. 802f9cc: 8078 strh r0, [r7, #2]
  46678. /* in UDP, 0 checksum means 'no checksum' */
  46679. udphdr->chksum = 0x0000;
  46680. 802f9ce: 71bb strb r3, [r7, #6]
  46681. 802f9d0: 71fb strb r3, [r7, #7]
  46682. }
  46683. #endif /* LWIP_IGMP */
  46684. /* PCB local address is IP_ANY_ADDR? */
  46685. if (ip_addr_isany(&pcb->local_ip)) {
  46686. 802f9d2: 682b ldr r3, [r5, #0]
  46687. 802f9d4: b913 cbnz r3, 802f9dc <udp_sendto_if+0x6c>
  46688. /* use outgoing network interface IP address as source address */
  46689. src_ip = &(netif->ip_addr);
  46690. 802f9d6: f108 0904 add.w r9, r8, #4
  46691. 802f9da: e00a b.n 802f9f2 <udp_sendto_if+0x82>
  46692. } else {
  46693. /* check if UDP PCB local IP address is correct
  46694. * this could be an old address if netif->ip_addr has changed */
  46695. if (!ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) {
  46696. 802f9dc: f8d8 2004 ldr.w r2, [r8, #4]
  46697. 802f9e0: 4293 cmp r3, r2
  46698. 802f9e2: d005 beq.n 802f9f0 <udp_sendto_if+0x80>
  46699. /* local_ip doesn't match, drop the packet */
  46700. if (q != p) {
  46701. 802f9e4: 42b4 cmp r4, r6
  46702. 802f9e6: d01f beq.n 802fa28 <udp_sendto_if+0xb8>
  46703. /* free the header pbuf */
  46704. pbuf_free(q);
  46705. 802f9e8: 4620 mov r0, r4
  46706. 802f9ea: f7fd fb21 bl 802d030 <pbuf_free>
  46707. 802f9ee: e01b b.n 802fa28 <udp_sendto_if+0xb8>
  46708. }
  46709. #endif /* LWIP_IGMP */
  46710. /* PCB local address is IP_ANY_ADDR? */
  46711. if (ip_addr_isany(&pcb->local_ip)) {
  46712. 802f9f0: 46a9 mov r9, r5
  46713. NETIF_SET_HWADDRHINT(netif, NULL);
  46714. } else
  46715. #endif /* LWIP_UDPLITE */
  46716. { /* UDP */
  46717. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %"U16_F"\n", q->tot_len));
  46718. udphdr->len = htons(q->tot_len);
  46719. 802f9f2: 8920 ldrh r0, [r4, #8]
  46720. 802f9f4: f7fc f9de bl 802bdb4 <lwip_htons>
  46721. 802f9f8: 80b8 strh r0, [r7, #4]
  46722. #endif /* CHECKSUM_GEN_UDP */
  46723. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum));
  46724. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDP,)\n"));
  46725. /* output to IP */
  46726. NETIF_SET_HWADDRHINT(netif, &pcb->addr_hint);
  46727. err = ip_output_if(q, src_ip, dst_ip, pcb->ttl, pcb->tos, IP_PROTO_UDP, netif);
  46728. 802f9fa: 7a6a ldrb r2, [r5, #9]
  46729. 802f9fc: 7aab ldrb r3, [r5, #10]
  46730. 802f9fe: 9200 str r2, [sp, #0]
  46731. 802fa00: 2211 movs r2, #17
  46732. 802fa02: 9201 str r2, [sp, #4]
  46733. 802fa04: 4649 mov r1, r9
  46734. 802fa06: 4652 mov r2, sl
  46735. 802fa08: f8cd 8008 str.w r8, [sp, #8]
  46736. 802fa0c: 4620 mov r0, r4
  46737. 802fa0e: f000 fb9d bl 803014c <ip_output_if>
  46738. 802fa12: 4607 mov r7, r0
  46739. NETIF_SET_HWADDRHINT(netif, NULL);
  46740. }
  46741. /* TODO: must this be increased even if error occured? */
  46742. snmp_inc_udpoutdatagrams();
  46743. 802fa14: f002 f924 bl 8031c60 <snmp_inc_udpoutdatagrams>
  46744. /* did we chain a separate header pbuf earlier? */
  46745. if (q != p) {
  46746. 802fa18: 42b4 cmp r4, r6
  46747. 802fa1a: d006 beq.n 802fa2a <udp_sendto_if+0xba>
  46748. /* free the header pbuf */
  46749. pbuf_free(q);
  46750. 802fa1c: 4620 mov r0, r4
  46751. 802fa1e: f7fd fb07 bl 802d030 <pbuf_free>
  46752. 802fa22: e002 b.n 802fa2a <udp_sendto_if+0xba>
  46753. /* allocate header in a separate new pbuf */
  46754. q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
  46755. /* new header pbuf could not be allocated? */
  46756. if (q == NULL) {
  46757. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n"));
  46758. return ERR_MEM;
  46759. 802fa24: 27ff movs r7, #255 ; 0xff
  46760. 802fa26: e000 b.n 802fa2a <udp_sendto_if+0xba>
  46761. /* free the header pbuf */
  46762. pbuf_free(q);
  46763. q = NULL;
  46764. /* p is still referenced by the caller, and will live on */
  46765. }
  46766. return ERR_VAL;
  46767. 802fa28: 27fa movs r7, #250 ; 0xfa
  46768. /* p is still referenced by the caller, and will live on */
  46769. }
  46770. UDP_STATS_INC(udp.xmit);
  46771. return err;
  46772. }
  46773. 802fa2a: b278 sxtb r0, r7
  46774. 802fa2c: b004 add sp, #16
  46775. 802fa2e: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  46776. 0802fa32 <udp_sendto>:
  46777. * @see udp_disconnect() udp_send()
  46778. */
  46779. err_t
  46780. udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
  46781. ip_addr_t *dst_ip, u16_t dst_port)
  46782. {
  46783. 802fa32: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  46784. 802fa34: 4605 mov r5, r0
  46785. /* find the outgoing network interface for this packet */
  46786. #if LWIP_IGMP
  46787. netif = ip_route((ip_addr_ismulticast(dst_ip))?(&(pcb->multicast_ip)):(dst_ip));
  46788. #else
  46789. netif = ip_route(dst_ip);
  46790. 802fa36: 4610 mov r0, r2
  46791. * @see udp_disconnect() udp_send()
  46792. */
  46793. err_t
  46794. udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
  46795. ip_addr_t *dst_ip, u16_t dst_port)
  46796. {
  46797. 802fa38: 460f mov r7, r1
  46798. 802fa3a: 4614 mov r4, r2
  46799. 802fa3c: 461e mov r6, r3
  46800. /* find the outgoing network interface for this packet */
  46801. #if LWIP_IGMP
  46802. netif = ip_route((ip_addr_ismulticast(dst_ip))?(&(pcb->multicast_ip)):(dst_ip));
  46803. #else
  46804. netif = ip_route(dst_ip);
  46805. 802fa3e: f000 fa81 bl 802ff44 <ip_route>
  46806. #endif /* LWIP_IGMP */
  46807. /* no outgoing network interface could be found? */
  46808. if (netif == NULL) {
  46809. 802fa42: b138 cbz r0, 802fa54 <udp_sendto+0x22>
  46810. return ERR_RTE;
  46811. }
  46812. #if LWIP_CHECKSUM_ON_COPY
  46813. return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);
  46814. #else /* LWIP_CHECKSUM_ON_COPY */
  46815. return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);
  46816. 802fa44: 9000 str r0, [sp, #0]
  46817. 802fa46: 4639 mov r1, r7
  46818. 802fa48: 4628 mov r0, r5
  46819. 802fa4a: 4622 mov r2, r4
  46820. 802fa4c: 4633 mov r3, r6
  46821. 802fa4e: f7ff ff8f bl 802f970 <udp_sendto_if>
  46822. 802fa52: e000 b.n 802fa56 <udp_sendto+0x24>
  46823. /* no outgoing network interface could be found? */
  46824. if (netif == NULL) {
  46825. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
  46826. ip4_addr1_16(dst_ip), ip4_addr2_16(dst_ip), ip4_addr3_16(dst_ip), ip4_addr4_16(dst_ip)));
  46827. UDP_STATS_INC(udp.rterr);
  46828. return ERR_RTE;
  46829. 802fa54: 20fc movs r0, #252 ; 0xfc
  46830. #if LWIP_CHECKSUM_ON_COPY
  46831. return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);
  46832. #else /* LWIP_CHECKSUM_ON_COPY */
  46833. return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);
  46834. #endif /* LWIP_CHECKSUM_ON_COPY */
  46835. }
  46836. 802fa56: b240 sxtb r0, r0
  46837. 802fa58: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
  46838. 0802fa5a <udp_send>:
  46839. */
  46840. err_t
  46841. udp_send(struct udp_pcb *pcb, struct pbuf *p)
  46842. {
  46843. /* send to the packet using remote ip and port stored in the pcb */
  46844. return udp_sendto(pcb, p, &pcb->remote_ip, pcb->remote_port);
  46845. 802fa5a: 8a83 ldrh r3, [r0, #20]
  46846. 802fa5c: 1d02 adds r2, r0, #4
  46847. 802fa5e: f7ff bfe8 b.w 802fa32 <udp_sendto>
  46848. 802fa62: 0000 movs r0, r0
  46849. 0802fa64 <udp_connect>:
  46850. *
  46851. * @see udp_disconnect()
  46852. */
  46853. err_t
  46854. udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  46855. {
  46856. 802fa64: b570 push {r4, r5, r6, lr}
  46857. 802fa66: 4616 mov r6, r2
  46858. struct udp_pcb *ipcb;
  46859. if (pcb->local_port == 0) {
  46860. 802fa68: 8a42 ldrh r2, [r0, #18]
  46861. *
  46862. * @see udp_disconnect()
  46863. */
  46864. err_t
  46865. udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  46866. {
  46867. 802fa6a: 4604 mov r4, r0
  46868. 802fa6c: 460d mov r5, r1
  46869. struct udp_pcb *ipcb;
  46870. if (pcb->local_port == 0) {
  46871. 802fa6e: b10a cbz r2, 802fa74 <udp_connect+0x10>
  46872. if (err != ERR_OK) {
  46873. return err;
  46874. }
  46875. }
  46876. ip_addr_set(&pcb->remote_ip, ipaddr);
  46877. 802fa70: b935 cbnz r5, 802fa80 <udp_connect+0x1c>
  46878. 802fa72: e006 b.n 802fa82 <udp_connect+0x1e>
  46879. udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  46880. {
  46881. struct udp_pcb *ipcb;
  46882. if (pcb->local_port == 0) {
  46883. err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
  46884. 802fa74: 4601 mov r1, r0
  46885. 802fa76: f7ff ff2b bl 802f8d0 <udp_bind>
  46886. if (err != ERR_OK) {
  46887. 802fa7a: 2800 cmp r0, #0
  46888. 802fa7c: d0f8 beq.n 802fa70 <udp_connect+0xc>
  46889. 802fa7e: e013 b.n 802faa8 <udp_connect+0x44>
  46890. return err;
  46891. }
  46892. }
  46893. ip_addr_set(&pcb->remote_ip, ipaddr);
  46894. 802fa80: 682d ldr r5, [r5, #0]
  46895. pcb->remote_port = port;
  46896. pcb->flags |= UDP_FLAGS_CONNECTED;
  46897. 802fa82: 7c23 ldrb r3, [r4, #16]
  46898. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  46899. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  46900. pcb->local_port));
  46901. /* Insert UDP PCB into the list of active UDP PCBs. */
  46902. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  46903. 802fa84: 4a09 ldr r2, [pc, #36] ; (802faac <udp_connect+0x48>)
  46904. if (err != ERR_OK) {
  46905. return err;
  46906. }
  46907. }
  46908. ip_addr_set(&pcb->remote_ip, ipaddr);
  46909. 802fa86: 6065 str r5, [r4, #4]
  46910. pcb->remote_port = port;
  46911. pcb->flags |= UDP_FLAGS_CONNECTED;
  46912. 802fa88: f043 0304 orr.w r3, r3, #4
  46913. 802fa8c: 7423 strb r3, [r4, #16]
  46914. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  46915. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  46916. pcb->local_port));
  46917. /* Insert UDP PCB into the list of active UDP PCBs. */
  46918. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  46919. 802fa8e: 6813 ldr r3, [r2, #0]
  46920. return err;
  46921. }
  46922. }
  46923. ip_addr_set(&pcb->remote_ip, ipaddr);
  46924. pcb->remote_port = port;
  46925. 802fa90: 82a6 strh r6, [r4, #20]
  46926. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  46927. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  46928. pcb->local_port));
  46929. /* Insert UDP PCB into the list of active UDP PCBs. */
  46930. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  46931. 802fa92: 4618 mov r0, r3
  46932. 802fa94: e002 b.n 802fa9c <udp_connect+0x38>
  46933. if (pcb == ipcb) {
  46934. 802fa96: 4284 cmp r4, r0
  46935. 802fa98: d005 beq.n 802faa6 <udp_connect+0x42>
  46936. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  46937. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  46938. pcb->local_port));
  46939. /* Insert UDP PCB into the list of active UDP PCBs. */
  46940. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  46941. 802fa9a: 68c0 ldr r0, [r0, #12]
  46942. 802fa9c: 2800 cmp r0, #0
  46943. 802fa9e: d1fa bne.n 802fa96 <udp_connect+0x32>
  46944. /* already on the list, just return */
  46945. return ERR_OK;
  46946. }
  46947. }
  46948. /* PCB not yet on the list, add PCB now */
  46949. pcb->next = udp_pcbs;
  46950. 802faa0: 60e3 str r3, [r4, #12]
  46951. udp_pcbs = pcb;
  46952. 802faa2: 6014 str r4, [r2, #0]
  46953. return ERR_OK;
  46954. 802faa4: e000 b.n 802faa8 <udp_connect+0x44>
  46955. /* Insert UDP PCB into the list of active UDP PCBs. */
  46956. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  46957. if (pcb == ipcb) {
  46958. /* already on the list, just return */
  46959. return ERR_OK;
  46960. 802faa6: 2000 movs r0, #0
  46961. }
  46962. /* PCB not yet on the list, add PCB now */
  46963. pcb->next = udp_pcbs;
  46964. udp_pcbs = pcb;
  46965. return ERR_OK;
  46966. }
  46967. 802faa8: b240 sxtb r0, r0
  46968. 802faaa: bd70 pop {r4, r5, r6, pc}
  46969. 802faac: 20010ff8 .word 0x20010ff8
  46970. 0802fab0 <udp_disconnect>:
  46971. */
  46972. void
  46973. udp_disconnect(struct udp_pcb *pcb)
  46974. {
  46975. /* reset remote address association */
  46976. ip_addr_set_any(&pcb->remote_ip);
  46977. 802fab0: 2300 movs r3, #0
  46978. 802fab2: 6043 str r3, [r0, #4]
  46979. pcb->remote_port = 0;
  46980. 802fab4: 8283 strh r3, [r0, #20]
  46981. /* mark PCB as unconnected */
  46982. pcb->flags &= ~UDP_FLAGS_CONNECTED;
  46983. 802fab6: 7c03 ldrb r3, [r0, #16]
  46984. 802fab8: f023 0304 bic.w r3, r3, #4
  46985. 802fabc: 7403 strb r3, [r0, #16]
  46986. 802fabe: 4770 bx lr
  46987. 0802fac0 <udp_recv>:
  46988. */
  46989. void
  46990. udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg)
  46991. {
  46992. /* remember recv() callback and user data */
  46993. pcb->recv = recv;
  46994. 802fac0: 6181 str r1, [r0, #24]
  46995. pcb->recv_arg = recv_arg;
  46996. 802fac2: 61c2 str r2, [r0, #28]
  46997. 802fac4: 4770 bx lr
  46998. 802fac6: 0000 movs r0, r0
  46999. 0802fac8 <udp_remove>:
  47000. *
  47001. * @see udp_new()
  47002. */
  47003. void
  47004. udp_remove(struct udp_pcb *pcb)
  47005. {
  47006. 802fac8: b510 push {r4, lr}
  47007. 802faca: 4604 mov r4, r0
  47008. struct udp_pcb *pcb2;
  47009. snmp_delete_udpidx_tree(pcb);
  47010. 802facc: f002 f914 bl 8031cf8 <snmp_delete_udpidx_tree>
  47011. /* pcb to be removed is first in list? */
  47012. if (udp_pcbs == pcb) {
  47013. 802fad0: 4a0a ldr r2, [pc, #40] ; (802fafc <udp_remove+0x34>)
  47014. 802fad2: 6813 ldr r3, [r2, #0]
  47015. 802fad4: 42a3 cmp r3, r4
  47016. 802fad6: d109 bne.n 802faec <udp_remove+0x24>
  47017. /* make list start at 2nd pcb */
  47018. udp_pcbs = udp_pcbs->next;
  47019. 802fad8: 68e3 ldr r3, [r4, #12]
  47020. 802fada: 6013 str r3, [r2, #0]
  47021. 802fadc: e008 b.n 802faf0 <udp_remove+0x28>
  47022. /* pcb not 1st in list */
  47023. } else {
  47024. for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
  47025. /* find pcb in udp_pcbs list */
  47026. if (pcb2->next != NULL && pcb2->next == pcb) {
  47027. 802fade: 68da ldr r2, [r3, #12]
  47028. 802fae0: b11a cbz r2, 802faea <udp_remove+0x22>
  47029. 802fae2: 42a2 cmp r2, r4
  47030. /* remove pcb from list */
  47031. pcb2->next = pcb->next;
  47032. 802fae4: bf04 itt eq
  47033. 802fae6: 68e2 ldreq r2, [r4, #12]
  47034. 802fae8: 60da streq r2, [r3, #12]
  47035. if (udp_pcbs == pcb) {
  47036. /* make list start at 2nd pcb */
  47037. udp_pcbs = udp_pcbs->next;
  47038. /* pcb not 1st in list */
  47039. } else {
  47040. for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
  47041. 802faea: 68db ldr r3, [r3, #12]
  47042. 802faec: 2b00 cmp r3, #0
  47043. 802faee: d1f6 bne.n 802fade <udp_remove+0x16>
  47044. /* remove pcb from list */
  47045. pcb2->next = pcb->next;
  47046. }
  47047. }
  47048. }
  47049. memp_free(MEMP_UDP_PCB, pcb);
  47050. 802faf0: 2001 movs r0, #1
  47051. 802faf2: 4621 mov r1, r4
  47052. }
  47053. 802faf4: e8bd 4010 ldmia.w sp!, {r4, lr}
  47054. /* remove pcb from list */
  47055. pcb2->next = pcb->next;
  47056. }
  47057. }
  47058. }
  47059. memp_free(MEMP_UDP_PCB, pcb);
  47060. 802faf8: f7fd b990 b.w 802ce1c <memp_free>
  47061. 802fafc: 20010ff8 .word 0x20010ff8
  47062. 0802fb00 <udp_new>:
  47063. *
  47064. * @see udp_remove()
  47065. */
  47066. struct udp_pcb *
  47067. udp_new(void)
  47068. {
  47069. 802fb00: b510 push {r4, lr}
  47070. struct udp_pcb *pcb;
  47071. pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB);
  47072. 802fb02: 2001 movs r0, #1
  47073. 802fb04: f7fd f974 bl 802cdf0 <memp_malloc>
  47074. /* could allocate UDP PCB? */
  47075. if (pcb != NULL) {
  47076. 802fb08: 4604 mov r4, r0
  47077. 802fb0a: b128 cbz r0, 802fb18 <udp_new+0x18>
  47078. /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0
  47079. * which means checksum is generated over the whole datagram per default
  47080. * (recommended as default by RFC 3828). */
  47081. /* initialize PCB to all zeroes */
  47082. memset(pcb, 0, sizeof(struct udp_pcb));
  47083. 802fb0c: 2100 movs r1, #0
  47084. 802fb0e: 2220 movs r2, #32
  47085. 802fb10: f7f1 ffd6 bl 8021ac0 <memset>
  47086. pcb->ttl = UDP_TTL;
  47087. 802fb14: 23ff movs r3, #255 ; 0xff
  47088. 802fb16: 72a3 strb r3, [r4, #10]
  47089. }
  47090. return pcb;
  47091. }
  47092. 802fb18: 4620 mov r0, r4
  47093. 802fb1a: bd10 pop {r4, pc}
  47094. 0802fb1c <icmp_input>:
  47095. * @param p the icmp echo request packet, p->payload pointing to the ip header
  47096. * @param inp the netif on which this packet was received
  47097. */
  47098. void
  47099. icmp_input(struct pbuf *p, struct netif *inp)
  47100. {
  47101. 802fb1c: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  47102. 802fb20: 4604 mov r4, r0
  47103. 802fb22: b085 sub sp, #20
  47104. 802fb24: 460f mov r7, r1
  47105. struct icmp_echo_hdr *iecho;
  47106. struct ip_hdr *iphdr;
  47107. s16_t hlen;
  47108. ICMP_STATS_INC(icmp.recv);
  47109. snmp_inc_icmpinmsgs();
  47110. 802fb26: f002 f81b bl 8031b60 <snmp_inc_icmpinmsgs>
  47111. iphdr = (struct ip_hdr *)p->payload;
  47112. 802fb2a: 6865 ldr r5, [r4, #4]
  47113. hlen = IPH_HL(iphdr) * 4;
  47114. 802fb2c: f895 8000 ldrb.w r8, [r5]
  47115. 802fb30: f008 080f and.w r8, r8, #15
  47116. 802fb34: ea4f 0888 mov.w r8, r8, lsl #2
  47117. if (pbuf_header(p, -hlen) || (p->tot_len < sizeof(u16_t)*2)) {
  47118. 802fb38: f1c8 0900 rsb r9, r8, #0
  47119. 802fb3c: 4620 mov r0, r4
  47120. 802fb3e: fa0f f189 sxth.w r1, r9
  47121. 802fb42: f7fd fa4a bl 802cfda <pbuf_header>
  47122. 802fb46: 2800 cmp r0, #0
  47123. 802fb48: d172 bne.n 802fc30 <icmp_input+0x114>
  47124. 802fb4a: 8923 ldrh r3, [r4, #8]
  47125. 802fb4c: 2b03 cmp r3, #3
  47126. 802fb4e: d96f bls.n 802fc30 <icmp_input+0x114>
  47127. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len));
  47128. goto lenerr;
  47129. }
  47130. type = *((u8_t *)p->payload);
  47131. 802fb50: 6863 ldr r3, [r4, #4]
  47132. #ifdef LWIP_DEBUG
  47133. code = *(((u8_t *)p->payload)+1);
  47134. #endif /* LWIP_DEBUG */
  47135. switch (type) {
  47136. 802fb52: 781b ldrb r3, [r3, #0]
  47137. 802fb54: 2b08 cmp r3, #8
  47138. 802fb56: d165 bne.n 802fc24 <icmp_input+0x108>
  47139. #if !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING
  47140. {
  47141. int accepted = 1;
  47142. #if !LWIP_MULTICAST_PING
  47143. /* multicast destination address? */
  47144. if (ip_addr_ismulticast(&current_iphdr_dest)) {
  47145. 802fb58: 4b39 ldr r3, [pc, #228] ; (802fc40 <icmp_input+0x124>)
  47146. 802fb5a: 681e ldr r6, [r3, #0]
  47147. accepted = 0;
  47148. }
  47149. #endif /* LWIP_MULTICAST_PING */
  47150. #if !LWIP_BROADCAST_PING
  47151. /* broadcast destination address? */
  47152. if (ip_addr_isbroadcast(&current_iphdr_dest, inp)) {
  47153. 802fb5c: 4639 mov r1, r7
  47154. 802fb5e: 4630 mov r0, r6
  47155. 802fb60: f000 f900 bl 802fd64 <ip4_addr_isbroadcast>
  47156. 802fb64: 2800 cmp r0, #0
  47157. 802fb66: d15d bne.n 802fc24 <icmp_input+0x108>
  47158. #if !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING
  47159. {
  47160. int accepted = 1;
  47161. #if !LWIP_MULTICAST_PING
  47162. /* multicast destination address? */
  47163. if (ip_addr_ismulticast(&current_iphdr_dest)) {
  47164. 802fb68: f006 06f0 and.w r6, r6, #240 ; 0xf0
  47165. if (ip_addr_isbroadcast(&current_iphdr_dest, inp)) {
  47166. accepted = 0;
  47167. }
  47168. #endif /* LWIP_BROADCAST_PING */
  47169. /* broadcast or multicast destination address not acceptd? */
  47170. if (!accepted) {
  47171. 802fb6c: 2ee0 cmp r6, #224 ; 0xe0
  47172. 802fb6e: d100 bne.n 802fb72 <icmp_input+0x56>
  47173. 802fb70: e058 b.n 802fc24 <icmp_input+0x108>
  47174. return;
  47175. }
  47176. }
  47177. #endif /* !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */
  47178. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n"));
  47179. if (p->tot_len < sizeof(struct icmp_echo_hdr)) {
  47180. 802fb72: 8923 ldrh r3, [r4, #8]
  47181. 802fb74: 2b07 cmp r3, #7
  47182. 802fb76: d95b bls.n 802fc30 <icmp_input+0x114>
  47183. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n"));
  47184. goto lenerr;
  47185. }
  47186. if (inet_chksum_pbuf(p) != 0) {
  47187. 802fb78: 4620 mov r0, r4
  47188. 802fb7a: f000 f8cf bl 802fd1c <inet_chksum_pbuf>
  47189. 802fb7e: b100 cbz r0, 802fb82 <icmp_input+0x66>
  47190. 802fb80: e056 b.n 802fc30 <icmp_input+0x114>
  47191. ICMP_STATS_INC(icmp.chkerr);
  47192. snmp_inc_icmpinerrors();
  47193. return;
  47194. }
  47195. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  47196. if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) {
  47197. 802fb82: 4620 mov r0, r4
  47198. 802fb84: 2122 movs r1, #34 ; 0x22
  47199. ICMP_STATS_INC(icmp.recv);
  47200. snmp_inc_icmpinmsgs();
  47201. iphdr = (struct ip_hdr *)p->payload;
  47202. hlen = IPH_HL(iphdr) * 4;
  47203. 802fb86: fa1f f888 uxth.w r8, r8
  47204. ICMP_STATS_INC(icmp.chkerr);
  47205. snmp_inc_icmpinerrors();
  47206. return;
  47207. }
  47208. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  47209. if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) {
  47210. 802fb8a: f7fd fa26 bl 802cfda <pbuf_header>
  47211. 802fb8e: b1f8 cbz r0, 802fbd0 <icmp_input+0xb4>
  47212. /* p is not big enough to contain link headers
  47213. * allocate a new one and copy p into it
  47214. */
  47215. struct pbuf *r;
  47216. /* switch p->payload to ip header */
  47217. if (pbuf_header(p, hlen)) {
  47218. 802fb90: 4620 mov r0, r4
  47219. 802fb92: 4641 mov r1, r8
  47220. 802fb94: f7fd fa21 bl 802cfda <pbuf_header>
  47221. 802fb98: 4602 mov r2, r0
  47222. 802fb9a: 2800 cmp r0, #0
  47223. 802fb9c: d148 bne.n 802fc30 <icmp_input+0x114>
  47224. LWIP_ASSERT("icmp_input: moving p->payload to ip header failed\n", 0);
  47225. goto memerr;
  47226. }
  47227. /* allocate new packet buffer with space for link headers */
  47228. r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM);
  47229. 802fb9e: 2002 movs r0, #2
  47230. 802fba0: 8921 ldrh r1, [r4, #8]
  47231. 802fba2: f7fd fa92 bl 802d0ca <pbuf_alloc>
  47232. if (r == NULL) {
  47233. 802fba6: 4606 mov r6, r0
  47234. 802fba8: 2800 cmp r0, #0
  47235. 802fbaa: d041 beq.n 802fc30 <icmp_input+0x114>
  47236. goto memerr;
  47237. }
  47238. LWIP_ASSERT("check that first pbuf can hold struct the ICMP header",
  47239. (r->len >= hlen + sizeof(struct icmp_echo_hdr)));
  47240. /* copy the whole packet including ip header */
  47241. if (pbuf_copy(r, p) != ERR_OK) {
  47242. 802fbac: 4621 mov r1, r4
  47243. 802fbae: f7fd fb43 bl 802d238 <pbuf_copy>
  47244. 802fbb2: 2800 cmp r0, #0
  47245. 802fbb4: d13c bne.n 802fc30 <icmp_input+0x114>
  47246. LWIP_ASSERT("icmp_input: copying to new pbuf failed\n", 0);
  47247. goto memerr;
  47248. }
  47249. iphdr = (struct ip_hdr *)r->payload;
  47250. /* switch r->payload back to icmp header */
  47251. if (pbuf_header(r, -hlen)) {
  47252. 802fbb6: 4630 mov r0, r6
  47253. 802fbb8: fa0f f189 sxth.w r1, r9
  47254. /* copy the whole packet including ip header */
  47255. if (pbuf_copy(r, p) != ERR_OK) {
  47256. LWIP_ASSERT("icmp_input: copying to new pbuf failed\n", 0);
  47257. goto memerr;
  47258. }
  47259. iphdr = (struct ip_hdr *)r->payload;
  47260. 802fbbc: 6875 ldr r5, [r6, #4]
  47261. /* switch r->payload back to icmp header */
  47262. if (pbuf_header(r, -hlen)) {
  47263. 802fbbe: f7fd fa0c bl 802cfda <pbuf_header>
  47264. 802fbc2: 2800 cmp r0, #0
  47265. 802fbc4: d134 bne.n 802fc30 <icmp_input+0x114>
  47266. LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0);
  47267. goto memerr;
  47268. }
  47269. /* free the original p */
  47270. pbuf_free(p);
  47271. 802fbc6: 4620 mov r0, r4
  47272. 802fbc8: f7fd fa32 bl 802d030 <pbuf_free>
  47273. 802fbcc: 4634 mov r4, r6
  47274. 802fbce: e006 b.n 802fbde <icmp_input+0xc2>
  47275. /* we now have an identical copy of p that has room for link headers */
  47276. p = r;
  47277. } else {
  47278. /* restore p->payload to point to icmp header */
  47279. if (pbuf_header(p, -(s16_t)(PBUF_IP_HLEN + PBUF_LINK_HLEN))) {
  47280. 802fbd0: 4620 mov r0, r4
  47281. 802fbd2: f06f 0121 mvn.w r1, #33 ; 0x21
  47282. 802fbd6: f7fd fa00 bl 802cfda <pbuf_header>
  47283. 802fbda: 2800 cmp r0, #0
  47284. 802fbdc: d128 bne.n 802fc30 <icmp_input+0x114>
  47285. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  47286. /* At this point, all checks are OK. */
  47287. /* We generate an answer by switching the dest and src ip addresses,
  47288. * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
  47289. iecho = (struct icmp_echo_hdr *)p->payload;
  47290. ip_addr_copy(iphdr->src, *ip_current_dest_addr());
  47291. 802fbde: f8df 9060 ldr.w r9, [pc, #96] ; 802fc40 <icmp_input+0x124>
  47292. }
  47293. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  47294. /* At this point, all checks are OK. */
  47295. /* We generate an answer by switching the dest and src ip addresses,
  47296. * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
  47297. iecho = (struct icmp_echo_hdr *)p->payload;
  47298. 802fbe2: 6863 ldr r3, [r4, #4]
  47299. ip_addr_copy(iphdr->src, *ip_current_dest_addr());
  47300. 802fbe4: f8d9 2000 ldr.w r2, [r9]
  47301. 802fbe8: 60ea str r2, [r5, #12]
  47302. ip_addr_copy(iphdr->dest, *ip_current_src_addr());
  47303. 802fbea: 4a16 ldr r2, [pc, #88] ; (802fc44 <icmp_input+0x128>)
  47304. 802fbec: 6812 ldr r2, [r2, #0]
  47305. #else // CHECKSUM_GEN_ICMP
  47306. iecho->chksum = 0;
  47307. #endif // CHECKSUM_GEN_ICMP
  47308. */
  47309. /* Set the correct TTL and recalculate the header checksum. */
  47310. IPH_TTL_SET(iphdr, ICMP_TTL);
  47311. 802fbee: 26ff movs r6, #255 ; 0xff
  47312. /* At this point, all checks are OK. */
  47313. /* We generate an answer by switching the dest and src ip addresses,
  47314. * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
  47315. iecho = (struct icmp_echo_hdr *)p->payload;
  47316. ip_addr_copy(iphdr->src, *ip_current_dest_addr());
  47317. ip_addr_copy(iphdr->dest, *ip_current_src_addr());
  47318. 802fbf0: 612a str r2, [r5, #16]
  47319. ICMPH_TYPE_SET(iecho, ICMP_ER);
  47320. 802fbf2: 2200 movs r2, #0
  47321. 802fbf4: 701a strb r2, [r3, #0]
  47322. //-----------------------------------------------------------
  47323. // Добавил фикс 15.08.15.
  47324. // Фикс исправляет баг с пингом.
  47325. #ifdef CHECKSUM_BY_HARDWARE
  47326. iecho->chksum = 0;
  47327. 802fbf6: 709a strb r2, [r3, #2]
  47328. 802fbf8: 70da strb r2, [r3, #3]
  47329. iecho->chksum = 0;
  47330. #endif // CHECKSUM_GEN_ICMP
  47331. */
  47332. /* Set the correct TTL and recalculate the header checksum. */
  47333. IPH_TTL_SET(iphdr, ICMP_TTL);
  47334. IPH_CHKSUM_SET(iphdr, 0);
  47335. 802fbfa: 72aa strb r2, [r5, #10]
  47336. 802fbfc: 72ea strb r2, [r5, #11]
  47337. #else // CHECKSUM_GEN_ICMP
  47338. iecho->chksum = 0;
  47339. #endif // CHECKSUM_GEN_ICMP
  47340. */
  47341. /* Set the correct TTL and recalculate the header checksum. */
  47342. IPH_TTL_SET(iphdr, ICMP_TTL);
  47343. 802fbfe: 722e strb r6, [r5, #8]
  47344. IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));
  47345. #endif /* CHECKSUM_GEN_IP */
  47346. ICMP_STATS_INC(icmp.xmit);
  47347. /* increase number of messages attempted to send */
  47348. snmp_inc_icmpoutmsgs();
  47349. 802fc00: f001 ffbe bl 8031b80 <snmp_inc_icmpoutmsgs>
  47350. /* increase number of echo replies attempted to send */
  47351. snmp_inc_icmpoutechoreps();
  47352. 802fc04: f001 ffcc bl 8031ba0 <snmp_inc_icmpoutechoreps>
  47353. if(pbuf_header(p, hlen)) {
  47354. 802fc08: 4620 mov r0, r4
  47355. 802fc0a: 4641 mov r1, r8
  47356. 802fc0c: f7fd f9e5 bl 802cfda <pbuf_header>
  47357. 802fc10: 4602 mov r2, r0
  47358. 802fc12: b938 cbnz r0, 802fc24 <icmp_input+0x108>
  47359. LWIP_ASSERT("Can't move over header in packet", 0);
  47360. } else {
  47361. err_t ret;
  47362. /* send an ICMP packet, src addr is the dest addr of the curren packet */
  47363. ret = ip_output_if(p, ip_current_dest_addr(), IP_HDRINCL,
  47364. 802fc14: 2301 movs r3, #1
  47365. 802fc16: e88d 0089 stmia.w sp, {r0, r3, r7}
  47366. 802fc1a: 4620 mov r0, r4
  47367. 802fc1c: 4649 mov r1, r9
  47368. 802fc1e: 4633 mov r3, r6
  47369. 802fc20: f000 fa94 bl 803014c <ip_output_if>
  47370. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n",
  47371. (s16_t)type, (s16_t)code));
  47372. ICMP_STATS_INC(icmp.proterr);
  47373. ICMP_STATS_INC(icmp.drop);
  47374. }
  47375. pbuf_free(p);
  47376. 802fc24: 4620 mov r0, r4
  47377. pbuf_free(p);
  47378. ICMP_STATS_INC(icmp.err);
  47379. snmp_inc_icmpinerrors();
  47380. return;
  47381. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  47382. }
  47383. 802fc26: b005 add sp, #20
  47384. 802fc28: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr}
  47385. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n",
  47386. (s16_t)type, (s16_t)code));
  47387. ICMP_STATS_INC(icmp.proterr);
  47388. ICMP_STATS_INC(icmp.drop);
  47389. }
  47390. pbuf_free(p);
  47391. 802fc2c: f7fd ba00 b.w 802d030 <pbuf_free>
  47392. ICMP_STATS_INC(icmp.lenerr);
  47393. snmp_inc_icmpinerrors();
  47394. return;
  47395. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  47396. memerr:
  47397. pbuf_free(p);
  47398. 802fc30: 4620 mov r0, r4
  47399. 802fc32: f7fd f9fd bl 802d030 <pbuf_free>
  47400. ICMP_STATS_INC(icmp.err);
  47401. snmp_inc_icmpinerrors();
  47402. return;
  47403. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  47404. }
  47405. 802fc36: b005 add sp, #20
  47406. 802fc38: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr}
  47407. return;
  47408. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  47409. memerr:
  47410. pbuf_free(p);
  47411. ICMP_STATS_INC(icmp.err);
  47412. snmp_inc_icmpinerrors();
  47413. 802fc3c: f001 bf98 b.w 8031b70 <snmp_inc_icmpinerrors>
  47414. 802fc40: 20011004 .word 0x20011004
  47415. 802fc44: 20010ffc .word 0x20010ffc
  47416. 0802fc48 <icmp_dest_unreach>:
  47417. * p->payload pointing to the IP header
  47418. * @param t type of the 'unreachable' packet
  47419. */
  47420. void
  47421. icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
  47422. {
  47423. 802fc48: e92d 41ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, lr}
  47424. 802fc4c: 4607 mov r7, r0
  47425. 802fc4e: 460d mov r5, r1
  47426. /* we can use the echo header here */
  47427. struct icmp_echo_hdr *icmphdr;
  47428. ip_addr_t iphdr_src;
  47429. /* ICMP header + IP header + 8 bytes of data */
  47430. q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE,
  47431. 802fc50: 2001 movs r0, #1
  47432. 802fc52: 2124 movs r1, #36 ; 0x24
  47433. 802fc54: 2200 movs r2, #0
  47434. 802fc56: f7fd fa38 bl 802d0ca <pbuf_alloc>
  47435. PBUF_RAM);
  47436. if (q == NULL) {
  47437. 802fc5a: 4606 mov r6, r0
  47438. 802fc5c: b358 cbz r0, 802fcb6 <icmp_dest_unreach+0x6e>
  47439. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->src));
  47440. LWIP_DEBUGF(ICMP_DEBUG, (" to "));
  47441. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  47442. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  47443. icmphdr = (struct icmp_echo_hdr *)q->payload;
  47444. 802fc5e: 6844 ldr r4, [r0, #4]
  47445. return;
  47446. }
  47447. LWIP_ASSERT("check that first pbuf can hold icmp message",
  47448. (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE)));
  47449. iphdr = (struct ip_hdr *)p->payload;
  47450. 802fc60: f8d7 8004 ldr.w r8, [r7, #4]
  47451. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  47452. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  47453. icmphdr = (struct icmp_echo_hdr *)q->payload;
  47454. icmphdr->type = type;
  47455. icmphdr->code = code;
  47456. 802fc64: 7065 strb r5, [r4, #1]
  47457. LWIP_DEBUGF(ICMP_DEBUG, (" to "));
  47458. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  47459. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  47460. icmphdr = (struct icmp_echo_hdr *)q->payload;
  47461. icmphdr->type = type;
  47462. 802fc66: 2303 movs r3, #3
  47463. icmphdr->code = code;
  47464. icmphdr->id = 0;
  47465. 802fc68: 2500 movs r5, #0
  47466. LWIP_DEBUGF(ICMP_DEBUG, (" to "));
  47467. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  47468. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  47469. icmphdr = (struct icmp_echo_hdr *)q->payload;
  47470. icmphdr->type = type;
  47471. 802fc6a: 7023 strb r3, [r4, #0]
  47472. icmphdr->code = code;
  47473. icmphdr->id = 0;
  47474. 802fc6c: 7125 strb r5, [r4, #4]
  47475. 802fc6e: 7165 strb r5, [r4, #5]
  47476. icmphdr->seqno = 0;
  47477. 802fc70: 71a5 strb r5, [r4, #6]
  47478. 802fc72: 71e5 strb r5, [r4, #7]
  47479. /* copy fields from original packet */
  47480. SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload,
  47481. 802fc74: 6840 ldr r0, [r0, #4]
  47482. 802fc76: 6879 ldr r1, [r7, #4]
  47483. 802fc78: 221c movs r2, #28
  47484. 802fc7a: 3008 adds r0, #8
  47485. 802fc7c: f7f1 fe66 bl 802194c <memcpy>
  47486. IP_HLEN + ICMP_DEST_UNREACH_DATASIZE);
  47487. /* calculate checksum */
  47488. icmphdr->chksum = 0;
  47489. 802fc80: 70a5 strb r5, [r4, #2]
  47490. 802fc82: 70e5 strb r5, [r4, #3]
  47491. icmphdr->chksum = inet_chksum(icmphdr, q->len);
  47492. 802fc84: 8971 ldrh r1, [r6, #10]
  47493. 802fc86: 4620 mov r0, r4
  47494. 802fc88: f000 f842 bl 802fd10 <inet_chksum>
  47495. 802fc8c: 8060 strh r0, [r4, #2]
  47496. ICMP_STATS_INC(icmp.xmit);
  47497. /* increase number of messages attempted to send */
  47498. snmp_inc_icmpoutmsgs();
  47499. 802fc8e: f001 ff77 bl 8031b80 <snmp_inc_icmpoutmsgs>
  47500. /* increase number of destination unreachable messages attempted to send */
  47501. snmp_inc_icmpouttimeexcds();
  47502. 802fc92: f001 ff7d bl 8031b90 <snmp_inc_icmpouttimeexcds>
  47503. ip_addr_copy(iphdr_src, iphdr->src);
  47504. 802fc96: f8d8 300c ldr.w r3, [r8, #12]
  47505. 802fc9a: aa04 add r2, sp, #16
  47506. ip_output(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP);
  47507. 802fc9c: 4630 mov r0, r6
  47508. ICMP_STATS_INC(icmp.xmit);
  47509. /* increase number of messages attempted to send */
  47510. snmp_inc_icmpoutmsgs();
  47511. /* increase number of destination unreachable messages attempted to send */
  47512. snmp_inc_icmpouttimeexcds();
  47513. ip_addr_copy(iphdr_src, iphdr->src);
  47514. 802fc9e: f842 3d04 str.w r3, [r2, #-4]!
  47515. ip_output(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP);
  47516. 802fca2: 2301 movs r3, #1
  47517. 802fca4: 9301 str r3, [sp, #4]
  47518. 802fca6: 9500 str r5, [sp, #0]
  47519. 802fca8: 4629 mov r1, r5
  47520. 802fcaa: 23ff movs r3, #255 ; 0xff
  47521. 802fcac: f000 fa9e bl 80301ec <ip_output>
  47522. pbuf_free(q);
  47523. 802fcb0: 4630 mov r0, r6
  47524. 802fcb2: f7fd f9bd bl 802d030 <pbuf_free>
  47525. */
  47526. void
  47527. icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
  47528. {
  47529. icmp_send_response(p, ICMP_DUR, t);
  47530. }
  47531. 802fcb6: e8bd 81ff ldmia.w sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, pc}
  47532. 0802fcba <lwip_standard_chksum>:
  47533. * @return host order (!) lwip checksum (non-inverted Internet sum)
  47534. */
  47535. static u16_t
  47536. lwip_standard_chksum(void *dataptr, int len)
  47537. {
  47538. 802fcba: b513 push {r0, r1, r4, lr}
  47539. u8_t *pb = (u8_t *)dataptr;
  47540. u16_t *ps, t = 0;
  47541. 802fcbc: 2300 movs r3, #0
  47542. u32_t sum = 0;
  47543. int odd = ((mem_ptr_t)pb & 1);
  47544. /* Get aligned to u16_t */
  47545. if (odd && len > 0) {
  47546. 802fcbe: f010 0201 ands.w r2, r0, #1
  47547. static u16_t
  47548. lwip_standard_chksum(void *dataptr, int len)
  47549. {
  47550. u8_t *pb = (u8_t *)dataptr;
  47551. u16_t *ps, t = 0;
  47552. 802fcc2: f8ad 3006 strh.w r3, [sp, #6]
  47553. u32_t sum = 0;
  47554. int odd = ((mem_ptr_t)pb & 1);
  47555. /* Get aligned to u16_t */
  47556. if (odd && len > 0) {
  47557. 802fcc6: d006 beq.n 802fcd6 <lwip_standard_chksum+0x1c>
  47558. 802fcc8: 4299 cmp r1, r3
  47559. 802fcca: dd04 ble.n 802fcd6 <lwip_standard_chksum+0x1c>
  47560. ((u8_t *)&t)[1] = *pb++;
  47561. 802fccc: f810 3b01 ldrb.w r3, [r0], #1
  47562. len--;
  47563. 802fcd0: 3901 subs r1, #1
  47564. u32_t sum = 0;
  47565. int odd = ((mem_ptr_t)pb & 1);
  47566. /* Get aligned to u16_t */
  47567. if (odd && len > 0) {
  47568. ((u8_t *)&t)[1] = *pb++;
  47569. 802fcd2: f88d 3007 strb.w r3, [sp, #7]
  47570. static u16_t
  47571. lwip_standard_chksum(void *dataptr, int len)
  47572. {
  47573. u8_t *pb = (u8_t *)dataptr;
  47574. u16_t *ps, t = 0;
  47575. u32_t sum = 0;
  47576. 802fcd6: 2300 movs r3, #0
  47577. len--;
  47578. }
  47579. /* Add the bulk of the data */
  47580. ps = (u16_t *)(void *)pb;
  47581. while (len > 1) {
  47582. 802fcd8: e003 b.n 802fce2 <lwip_standard_chksum+0x28>
  47583. sum += *ps++;
  47584. 802fcda: f830 4b02 ldrh.w r4, [r0], #2
  47585. len -= 2;
  47586. 802fcde: 3902 subs r1, #2
  47587. }
  47588. /* Add the bulk of the data */
  47589. ps = (u16_t *)(void *)pb;
  47590. while (len > 1) {
  47591. sum += *ps++;
  47592. 802fce0: 191b adds r3, r3, r4
  47593. len--;
  47594. }
  47595. /* Add the bulk of the data */
  47596. ps = (u16_t *)(void *)pb;
  47597. while (len > 1) {
  47598. 802fce2: 2901 cmp r1, #1
  47599. 802fce4: dcf9 bgt.n 802fcda <lwip_standard_chksum+0x20>
  47600. len -= 2;
  47601. }
  47602. /* Consume left-over byte, if any */
  47603. if (len > 0) {
  47604. ((u8_t *)&t)[0] = *(u8_t *)ps;
  47605. 802fce6: bf04 itt eq
  47606. 802fce8: 7801 ldrbeq r1, [r0, #0]
  47607. 802fcea: f88d 1006 strbeq.w r1, [sp, #6]
  47608. }
  47609. /* Add end bytes */
  47610. sum += t;
  47611. 802fcee: f8bd 0006 ldrh.w r0, [sp, #6]
  47612. 802fcf2: 181b adds r3, r3, r0
  47613. /* Fold 32-bit sum to 16 bits
  47614. calling this twice is propably faster than if statements... */
  47615. sum = FOLD_U32T(sum);
  47616. 802fcf4: b298 uxth r0, r3
  47617. 802fcf6: eb00 4313 add.w r3, r0, r3, lsr #16
  47618. sum = FOLD_U32T(sum);
  47619. 802fcfa: b298 uxth r0, r3
  47620. 802fcfc: eb00 4013 add.w r0, r0, r3, lsr #16
  47621. /* Swap if alignment was odd */
  47622. if (odd) {
  47623. 802fd00: b122 cbz r2, 802fd0c <lwip_standard_chksum+0x52>
  47624. sum = SWAP_BYTES_IN_WORD(sum);
  47625. 802fd02: 0603 lsls r3, r0, #24
  47626. 802fd04: f3c0 2007 ubfx r0, r0, #8, #8
  47627. 802fd08: ea40 4013 orr.w r0, r0, r3, lsr #16
  47628. }
  47629. return (u16_t)sum;
  47630. }
  47631. 802fd0c: b280 uxth r0, r0
  47632. 802fd0e: bd1c pop {r2, r3, r4, pc}
  47633. 0802fd10 <inet_chksum>:
  47634. * @return checksum (as u16_t) to be saved directly in the protocol header
  47635. */
  47636. u16_t
  47637. inet_chksum(void *dataptr, u16_t len)
  47638. {
  47639. 802fd10: b508 push {r3, lr}
  47640. return ~LWIP_CHKSUM(dataptr, len);
  47641. 802fd12: f7ff ffd2 bl 802fcba <lwip_standard_chksum>
  47642. 802fd16: 43c0 mvns r0, r0
  47643. }
  47644. 802fd18: b280 uxth r0, r0
  47645. 802fd1a: bd08 pop {r3, pc}
  47646. 0802fd1c <inet_chksum_pbuf>:
  47647. * @param p pbuf chain over that the checksum should be calculated
  47648. * @return checksum (as u16_t) to be saved directly in the protocol header
  47649. */
  47650. u16_t
  47651. inet_chksum_pbuf(struct pbuf *p)
  47652. {
  47653. 802fd1c: b570 push {r4, r5, r6, lr}
  47654. u32_t acc;
  47655. struct pbuf *q;
  47656. u8_t swapped;
  47657. acc = 0;
  47658. swapped = 0;
  47659. 802fd1e: 2600 movs r6, #0
  47660. * @param p pbuf chain over that the checksum should be calculated
  47661. * @return checksum (as u16_t) to be saved directly in the protocol header
  47662. */
  47663. u16_t
  47664. inet_chksum_pbuf(struct pbuf *p)
  47665. {
  47666. 802fd20: 4605 mov r5, r0
  47667. u32_t acc;
  47668. struct pbuf *q;
  47669. u8_t swapped;
  47670. acc = 0;
  47671. 802fd22: 4634 mov r4, r6
  47672. swapped = 0;
  47673. for(q = p; q != NULL; q = q->next) {
  47674. 802fd24: e013 b.n 802fd4e <inet_chksum_pbuf+0x32>
  47675. acc += LWIP_CHKSUM(q->payload, q->len);
  47676. 802fd26: 8969 ldrh r1, [r5, #10]
  47677. 802fd28: 6868 ldr r0, [r5, #4]
  47678. 802fd2a: f7ff ffc6 bl 802fcba <lwip_standard_chksum>
  47679. acc = FOLD_U32T(acc);
  47680. if (q->len % 2 != 0) {
  47681. 802fd2e: 896b ldrh r3, [r5, #10]
  47682. u8_t swapped;
  47683. acc = 0;
  47684. swapped = 0;
  47685. for(q = p; q != NULL; q = q->next) {
  47686. acc += LWIP_CHKSUM(q->payload, q->len);
  47687. 802fd30: 1900 adds r0, r0, r4
  47688. acc = FOLD_U32T(acc);
  47689. 802fd32: b284 uxth r4, r0
  47690. if (q->len % 2 != 0) {
  47691. 802fd34: 07d9 lsls r1, r3, #31
  47692. acc = 0;
  47693. swapped = 0;
  47694. for(q = p; q != NULL; q = q->next) {
  47695. acc += LWIP_CHKSUM(q->payload, q->len);
  47696. acc = FOLD_U32T(acc);
  47697. 802fd36: eb04 4410 add.w r4, r4, r0, lsr #16
  47698. if (q->len % 2 != 0) {
  47699. 802fd3a: d507 bpl.n 802fd4c <inet_chksum_pbuf+0x30>
  47700. swapped = 1 - swapped;
  47701. acc = SWAP_BYTES_IN_WORD(acc);
  47702. 802fd3c: 0623 lsls r3, r4, #24
  47703. swapped = 0;
  47704. for(q = p; q != NULL; q = q->next) {
  47705. acc += LWIP_CHKSUM(q->payload, q->len);
  47706. acc = FOLD_U32T(acc);
  47707. if (q->len % 2 != 0) {
  47708. swapped = 1 - swapped;
  47709. 802fd3e: f1c6 0601 rsb r6, r6, #1
  47710. acc = SWAP_BYTES_IN_WORD(acc);
  47711. 802fd42: f3c4 2407 ubfx r4, r4, #8, #8
  47712. swapped = 0;
  47713. for(q = p; q != NULL; q = q->next) {
  47714. acc += LWIP_CHKSUM(q->payload, q->len);
  47715. acc = FOLD_U32T(acc);
  47716. if (q->len % 2 != 0) {
  47717. swapped = 1 - swapped;
  47718. 802fd46: b2f6 uxtb r6, r6
  47719. acc = SWAP_BYTES_IN_WORD(acc);
  47720. 802fd48: ea44 4413 orr.w r4, r4, r3, lsr #16
  47721. struct pbuf *q;
  47722. u8_t swapped;
  47723. acc = 0;
  47724. swapped = 0;
  47725. for(q = p; q != NULL; q = q->next) {
  47726. 802fd4c: 682d ldr r5, [r5, #0]
  47727. 802fd4e: 2d00 cmp r5, #0
  47728. 802fd50: d1e9 bne.n 802fd26 <inet_chksum_pbuf+0xa>
  47729. swapped = 1 - swapped;
  47730. acc = SWAP_BYTES_IN_WORD(acc);
  47731. }
  47732. }
  47733. if (swapped) {
  47734. 802fd52: b126 cbz r6, 802fd5e <inet_chksum_pbuf+0x42>
  47735. acc = SWAP_BYTES_IN_WORD(acc);
  47736. 802fd54: 0623 lsls r3, r4, #24
  47737. 802fd56: f3c4 2407 ubfx r4, r4, #8, #8
  47738. 802fd5a: ea44 4413 orr.w r4, r4, r3, lsr #16
  47739. }
  47740. return (u16_t)~(acc & 0xffffUL);
  47741. 802fd5e: 43e0 mvns r0, r4
  47742. }
  47743. 802fd60: b280 uxth r0, r0
  47744. 802fd62: bd70 pop {r4, r5, r6, pc}
  47745. 0802fd64 <ip4_addr_isbroadcast>:
  47746. {
  47747. ip_addr_t ipaddr;
  47748. ip4_addr_set_u32(&ipaddr, addr);
  47749. /* all ones (broadcast) or all zeroes (old skool broadcast) */
  47750. if ((~addr == IPADDR_ANY) ||
  47751. 802fd64: 1e43 subs r3, r0, #1
  47752. 802fd66: 3303 adds r3, #3
  47753. 802fd68: d811 bhi.n 802fd8e <ip4_addr_isbroadcast+0x2a>
  47754. (addr == IPADDR_ANY)) {
  47755. return 1;
  47756. /* no broadcast support on this network interface? */
  47757. } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
  47758. 802fd6a: f891 302d ldrb.w r3, [r1, #45] ; 0x2d
  47759. 802fd6e: f003 0302 and.w r3, r3, #2
  47760. 802fd72: b2db uxtb r3, r3
  47761. 802fd74: b16b cbz r3, 802fd92 <ip4_addr_isbroadcast+0x2e>
  47762. /* the given address cannot be a broadcast address
  47763. * nor can we check against any broadcast addresses */
  47764. return 0;
  47765. /* address matches network interface address exactly? => no broadcast */
  47766. } else if (addr == ip4_addr_get_u32(&netif->ip_addr)) {
  47767. 802fd76: 684a ldr r2, [r1, #4]
  47768. 802fd78: 4290 cmp r0, r2
  47769. 802fd7a: d00a beq.n 802fd92 <ip4_addr_isbroadcast+0x2e>
  47770. return 0;
  47771. /* on the same (sub) network... */
  47772. } else if (ip_addr_netcmp(&ipaddr, &(netif->ip_addr), &(netif->netmask))
  47773. 802fd7c: 688b ldr r3, [r1, #8]
  47774. 802fd7e: 4042 eors r2, r0
  47775. 802fd80: 421a tst r2, r3
  47776. 802fd82: d000 beq.n 802fd86 <ip4_addr_isbroadcast+0x22>
  47777. 802fd84: e005 b.n 802fd92 <ip4_addr_isbroadcast+0x2e>
  47778. /* ...and host identifier bits are all ones? =>... */
  47779. && ((addr & ~ip4_addr_get_u32(&netif->netmask)) ==
  47780. 802fd86: 43db mvns r3, r3
  47781. 802fd88: 4018 ands r0, r3
  47782. 802fd8a: 4298 cmp r0, r3
  47783. 802fd8c: d101 bne.n 802fd92 <ip4_addr_isbroadcast+0x2e>
  47784. ip4_addr_set_u32(&ipaddr, addr);
  47785. /* all ones (broadcast) or all zeroes (old skool broadcast) */
  47786. if ((~addr == IPADDR_ANY) ||
  47787. (addr == IPADDR_ANY)) {
  47788. return 1;
  47789. 802fd8e: 2001 movs r0, #1
  47790. 802fd90: 4770 bx lr
  47791. /* no broadcast support on this network interface? */
  47792. } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
  47793. /* the given address cannot be a broadcast address
  47794. * nor can we check against any broadcast addresses */
  47795. return 0;
  47796. 802fd92: 2000 movs r0, #0
  47797. /* => network broadcast address */
  47798. return 1;
  47799. } else {
  47800. return 0;
  47801. }
  47802. }
  47803. 802fd94: 4770 bx lr
  47804. 0802fd96 <ipaddr_aton>:
  47805. * @param addr pointer to which to save the ip address in network order
  47806. * @return 1 if cp could be converted to addr, 0 on failure
  47807. */
  47808. int
  47809. ipaddr_aton(const char *cp, ip_addr_t *addr)
  47810. {
  47811. 802fd96: b5f0 push {r4, r5, r6, r7, lr}
  47812. u8_t base;
  47813. char c;
  47814. u32_t parts[4];
  47815. u32_t *pp = parts;
  47816. c = *cp;
  47817. 802fd98: 7803 ldrb r3, [r0, #0]
  47818. * @param addr pointer to which to save the ip address in network order
  47819. * @return 1 if cp could be converted to addr, 0 on failure
  47820. */
  47821. int
  47822. ipaddr_aton(const char *cp, ip_addr_t *addr)
  47823. {
  47824. 802fd9a: b085 sub sp, #20
  47825. 802fd9c: 460e mov r6, r1
  47826. u8_t base;
  47827. char c;
  47828. u32_t parts[4];
  47829. u32_t *pp = parts;
  47830. c = *cp;
  47831. 802fd9e: 2400 movs r4, #0
  47832. * @param cp IP address in ascii represenation (e.g. "127.0.0.1")
  47833. * @param addr pointer to which to save the ip address in network order
  47834. * @return 1 if cp could be converted to addr, 0 on failure
  47835. */
  47836. int
  47837. ipaddr_aton(const char *cp, ip_addr_t *addr)
  47838. 802fda0: aa00 add r2, sp, #0
  47839. 802fda2: 18a7 adds r7, r4, r2
  47840. /*
  47841. * Collect number up to ``.''.
  47842. * Values are specified as for C:
  47843. * 0x=hex, 0=octal, 1-9=decimal.
  47844. */
  47845. if (!isdigit(c))
  47846. 802fda4: f1a3 0230 sub.w r2, r3, #48 ; 0x30
  47847. 802fda8: 2a09 cmp r2, #9
  47848. 802fdaa: d86d bhi.n 802fe88 <ipaddr_aton+0xf2>
  47849. return (0);
  47850. val = 0;
  47851. base = 10;
  47852. if (c == '0') {
  47853. 802fdac: 2b30 cmp r3, #48 ; 0x30
  47854. 802fdae: d10b bne.n 802fdc8 <ipaddr_aton+0x32>
  47855. c = *++cp;
  47856. 802fdb0: 7843 ldrb r3, [r0, #1]
  47857. if (c == 'x' || c == 'X') {
  47858. 802fdb2: 2b78 cmp r3, #120 ; 0x78
  47859. 802fdb4: d004 beq.n 802fdc0 <ipaddr_aton+0x2a>
  47860. 802fdb6: 2b58 cmp r3, #88 ; 0x58
  47861. 802fdb8: d002 beq.n 802fdc0 <ipaddr_aton+0x2a>
  47862. if (!isdigit(c))
  47863. return (0);
  47864. val = 0;
  47865. base = 10;
  47866. if (c == '0') {
  47867. c = *++cp;
  47868. 802fdba: 3001 adds r0, #1
  47869. if (c == 'x' || c == 'X') {
  47870. base = 16;
  47871. c = *++cp;
  47872. } else
  47873. base = 8;
  47874. 802fdbc: 2508 movs r5, #8
  47875. 802fdbe: e004 b.n 802fdca <ipaddr_aton+0x34>
  47876. base = 10;
  47877. if (c == '0') {
  47878. c = *++cp;
  47879. if (c == 'x' || c == 'X') {
  47880. base = 16;
  47881. c = *++cp;
  47882. 802fdc0: 7883 ldrb r3, [r0, #2]
  47883. val = 0;
  47884. base = 10;
  47885. if (c == '0') {
  47886. c = *++cp;
  47887. if (c == 'x' || c == 'X') {
  47888. base = 16;
  47889. 802fdc2: 2510 movs r5, #16
  47890. c = *++cp;
  47891. 802fdc4: 3002 adds r0, #2
  47892. 802fdc6: e000 b.n 802fdca <ipaddr_aton+0x34>
  47893. * 0x=hex, 0=octal, 1-9=decimal.
  47894. */
  47895. if (!isdigit(c))
  47896. return (0);
  47897. val = 0;
  47898. base = 10;
  47899. 802fdc8: 250a movs r5, #10
  47900. 802fdca: 4602 mov r2, r0
  47901. if (c == '0') {
  47902. c = *++cp;
  47903. if (c == 'x' || c == 'X') {
  47904. base = 16;
  47905. 802fdcc: 2000 movs r0, #0
  47906. 802fdce: e000 b.n 802fdd2 <ipaddr_aton+0x3c>
  47907. 802fdd0: 3201 adds r2, #1
  47908. c = *++cp;
  47909. } else
  47910. base = 8;
  47911. }
  47912. for (;;) {
  47913. if (isdigit(c)) {
  47914. 802fdd2: f1a3 0130 sub.w r1, r3, #48 ; 0x30
  47915. 802fdd6: 2909 cmp r1, #9
  47916. 802fdd8: d803 bhi.n 802fde2 <ipaddr_aton+0x4c>
  47917. val = (val * base) + (int)(c - '0');
  47918. 802fdda: fb05 3000 mla r0, r5, r0, r3
  47919. 802fdde: 3830 subs r0, #48 ; 0x30
  47920. 802fde0: e013 b.n 802fe0a <ipaddr_aton+0x74>
  47921. c = *++cp;
  47922. } else if (base == 16 && isxdigit(c)) {
  47923. 802fde2: 2d10 cmp r5, #16
  47924. 802fde4: d113 bne.n 802fe0e <ipaddr_aton+0x78>
  47925. 802fde6: f1a3 0161 sub.w r1, r3, #97 ; 0x61
  47926. 802fdea: b2c9 uxtb r1, r1
  47927. 802fdec: 2905 cmp r1, #5
  47928. 802fdee: d904 bls.n 802fdfa <ipaddr_aton+0x64>
  47929. 802fdf0: f1a3 0c41 sub.w ip, r3, #65 ; 0x41
  47930. 802fdf4: f1bc 0f05 cmp.w ip, #5
  47931. 802fdf8: d809 bhi.n 802fe0e <ipaddr_aton+0x78>
  47932. val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A'));
  47933. 802fdfa: 330a adds r3, #10
  47934. 802fdfc: 2919 cmp r1, #25
  47935. 802fdfe: bf8c ite hi
  47936. 802fe00: 2141 movhi r1, #65 ; 0x41
  47937. 802fe02: 2161 movls r1, #97 ; 0x61
  47938. 802fe04: 1a5b subs r3, r3, r1
  47939. 802fe06: ea43 1000 orr.w r0, r3, r0, lsl #4
  47940. c = *++cp;
  47941. 802fe0a: 7853 ldrb r3, [r2, #1]
  47942. 802fe0c: e7e0 b.n 802fdd0 <ipaddr_aton+0x3a>
  47943. } else
  47944. break;
  47945. }
  47946. if (c == '.') {
  47947. 802fe0e: 2b2e cmp r3, #46 ; 0x2e
  47948. 802fe10: d107 bne.n 802fe22 <ipaddr_aton+0x8c>
  47949. * Internet format:
  47950. * a.b.c.d
  47951. * a.b.c (with c treated as 16 bits)
  47952. * a.b (with b treated as 24 bits)
  47953. */
  47954. if (pp >= parts + 3) {
  47955. 802fe12: 2c0c cmp r4, #12
  47956. 802fe14: d038 beq.n 802fe88 <ipaddr_aton+0xf2>
  47957. return (0);
  47958. }
  47959. *pp++ = val;
  47960. 802fe16: f84d 0004 str.w r0, [sp, r4]
  47961. c = *++cp;
  47962. 802fe1a: 7853 ldrb r3, [r2, #1]
  47963. 802fe1c: 1c50 adds r0, r2, #1
  47964. 802fe1e: 3404 adds r4, #4
  47965. } else
  47966. break;
  47967. }
  47968. 802fe20: e7be b.n 802fda0 <ipaddr_aton+0xa>
  47969. 802fe22: 2b0d cmp r3, #13
  47970. 802fe24: d803 bhi.n 802fe2e <ipaddr_aton+0x98>
  47971. 802fe26: 2b09 cmp r3, #9
  47972. 802fe28: d203 bcs.n 802fe32 <ipaddr_aton+0x9c>
  47973. 802fe2a: b113 cbz r3, 802fe32 <ipaddr_aton+0x9c>
  47974. 802fe2c: e02c b.n 802fe88 <ipaddr_aton+0xf2>
  47975. 802fe2e: 2b20 cmp r3, #32
  47976. 802fe30: d12a bne.n 802fe88 <ipaddr_aton+0xf2>
  47977. }
  47978. /*
  47979. * Concoct the address according to
  47980. * the number of parts specified.
  47981. */
  47982. switch (pp - parts + 1) {
  47983. 802fe32: 466b mov r3, sp
  47984. 802fe34: 1afb subs r3, r7, r3
  47985. 802fe36: 109b asrs r3, r3, #2
  47986. 802fe38: 3301 adds r3, #1
  47987. 802fe3a: 2b04 cmp r3, #4
  47988. 802fe3c: d81f bhi.n 802fe7e <ipaddr_aton+0xe8>
  47989. 802fe3e: e8df f003 tbb [pc, r3]
  47990. 802fe42: 1e23 .short 0x1e23
  47991. 802fe44: 0a03 .short 0x0a03
  47992. 802fe46: 13 .byte 0x13
  47993. 802fe47: 00 .byte 0x00
  47994. case 1: /* a -- 32 bits */
  47995. break;
  47996. case 2: /* a.b -- 8.24 bits */
  47997. if (val > 0xffffffUL) {
  47998. 802fe48: f1b0 7f80 cmp.w r0, #16777216 ; 0x1000000
  47999. 802fe4c: d21c bcs.n 802fe88 <ipaddr_aton+0xf2>
  48000. return (0);
  48001. }
  48002. val |= parts[0] << 24;
  48003. 802fe4e: 9b00 ldr r3, [sp, #0]
  48004. 802fe50: ea40 6003 orr.w r0, r0, r3, lsl #24
  48005. break;
  48006. 802fe54: e013 b.n 802fe7e <ipaddr_aton+0xe8>
  48007. case 3: /* a.b.c -- 8.8.16 bits */
  48008. if (val > 0xffff) {
  48009. 802fe56: f5b0 3f80 cmp.w r0, #65536 ; 0x10000
  48010. 802fe5a: d215 bcs.n 802fe88 <ipaddr_aton+0xf2>
  48011. return (0);
  48012. }
  48013. val |= (parts[0] << 24) | (parts[1] << 16);
  48014. 802fe5c: 9b00 ldr r3, [sp, #0]
  48015. 802fe5e: 061a lsls r2, r3, #24
  48016. 802fe60: 9b01 ldr r3, [sp, #4]
  48017. 802fe62: ea42 4303 orr.w r3, r2, r3, lsl #16
  48018. 802fe66: e009 b.n 802fe7c <ipaddr_aton+0xe6>
  48019. break;
  48020. case 4: /* a.b.c.d -- 8.8.8.8 bits */
  48021. if (val > 0xff) {
  48022. 802fe68: 28ff cmp r0, #255 ; 0xff
  48023. 802fe6a: d80d bhi.n 802fe88 <ipaddr_aton+0xf2>
  48024. return (0);
  48025. }
  48026. val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
  48027. 802fe6c: 9b00 ldr r3, [sp, #0]
  48028. 802fe6e: 061a lsls r2, r3, #24
  48029. 802fe70: 9b01 ldr r3, [sp, #4]
  48030. 802fe72: ea42 4203 orr.w r2, r2, r3, lsl #16
  48031. 802fe76: 9b02 ldr r3, [sp, #8]
  48032. 802fe78: ea42 2303 orr.w r3, r2, r3, lsl #8
  48033. 802fe7c: 4318 orrs r0, r3
  48034. break;
  48035. default:
  48036. LWIP_ASSERT("unhandled", 0);
  48037. break;
  48038. }
  48039. if (addr) {
  48040. 802fe7e: b12e cbz r6, 802fe8c <ipaddr_aton+0xf6>
  48041. ip4_addr_set_u32(addr, htonl(val));
  48042. 802fe80: f7fb ffa2 bl 802bdc8 <lwip_htonl>
  48043. 802fe84: 6030 str r0, [r6, #0]
  48044. 802fe86: e001 b.n 802fe8c <ipaddr_aton+0xf6>
  48045. * Collect number up to ``.''.
  48046. * Values are specified as for C:
  48047. * 0x=hex, 0=octal, 1-9=decimal.
  48048. */
  48049. if (!isdigit(c))
  48050. return (0);
  48051. 802fe88: 2000 movs r0, #0
  48052. 802fe8a: e000 b.n 802fe8e <ipaddr_aton+0xf8>
  48053. break;
  48054. }
  48055. if (addr) {
  48056. ip4_addr_set_u32(addr, htonl(val));
  48057. }
  48058. return (1);
  48059. 802fe8c: 2001 movs r0, #1
  48060. }
  48061. 802fe8e: b005 add sp, #20
  48062. 802fe90: bdf0 pop {r4, r5, r6, r7, pc}
  48063. 0802fe92 <ipaddr_addr>:
  48064. * @param cp IP address in ascii represenation (e.g. "127.0.0.1")
  48065. * @return ip address in network order
  48066. */
  48067. u32_t
  48068. ipaddr_addr(const char *cp)
  48069. {
  48070. 802fe92: b507 push {r0, r1, r2, lr}
  48071. ip_addr_t val;
  48072. if (ipaddr_aton(cp, &val)) {
  48073. 802fe94: a901 add r1, sp, #4
  48074. 802fe96: f7ff ff7e bl 802fd96 <ipaddr_aton>
  48075. 802fe9a: b108 cbz r0, 802fea0 <ipaddr_addr+0xe>
  48076. return ip4_addr_get_u32(&val);
  48077. 802fe9c: 9801 ldr r0, [sp, #4]
  48078. 802fe9e: e001 b.n 802fea4 <ipaddr_addr+0x12>
  48079. }
  48080. return (IPADDR_NONE);
  48081. 802fea0: f04f 30ff mov.w r0, #4294967295
  48082. }
  48083. 802fea4: bd0e pop {r1, r2, r3, pc}
  48084. 0802fea6 <ipaddr_ntoa_r>:
  48085. * @param buflen length of buf
  48086. * @return either pointer to buf which now holds the ASCII
  48087. * representation of addr or NULL if buf was too small
  48088. */
  48089. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  48090. {
  48091. 802fea6: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  48092. u8_t rem;
  48093. u8_t n;
  48094. u8_t i;
  48095. int len = 0;
  48096. s_addr = ip4_addr_get_u32(addr);
  48097. 802feaa: 6803 ldr r3, [r0, #0]
  48098. 802feac: a802 add r0, sp, #8
  48099. * @param buf target buffer where the string is stored
  48100. * @param buflen length of buf
  48101. * @return either pointer to buf which now holds the ASCII
  48102. * representation of addr or NULL if buf was too small
  48103. */
  48104. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  48105. 802feae: f10d 0807 add.w r8, sp, #7
  48106. u8_t rem;
  48107. u8_t n;
  48108. u8_t i;
  48109. int len = 0;
  48110. s_addr = ip4_addr_get_u32(addr);
  48111. 802feb2: f840 3d04 str.w r3, [r0, #-4]!
  48112. rp = buf;
  48113. 802feb6: 460c mov r4, r1
  48114. * @param buf target buffer where the string is stored
  48115. * @param buflen length of buf
  48116. * @return either pointer to buf which now holds the ASCII
  48117. * representation of addr or NULL if buf was too small
  48118. */
  48119. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  48120. 802feb8: 3801 subs r0, #1
  48121. char *rp;
  48122. u8_t *ap;
  48123. u8_t rem;
  48124. u8_t n;
  48125. u8_t i;
  48126. int len = 0;
  48127. 802feba: 2700 movs r7, #0
  48128. rp = buf;
  48129. ap = (u8_t *)&s_addr;
  48130. for(n = 0; n < 4; n++) {
  48131. i = 0;
  48132. do {
  48133. rem = *ap % (u8_t)10;
  48134. 802febc: f04f 0c0a mov.w ip, #10
  48135. *rp++ = inv[i];
  48136. }
  48137. if (len++ >= buflen) {
  48138. return NULL;
  48139. }
  48140. *rp++ = '.';
  48141. 802fec0: f04f 092e mov.w r9, #46 ; 0x2e
  48142. 802fec4: 7843 ldrb r3, [r0, #1]
  48143. * @param buf target buffer where the string is stored
  48144. * @param buflen length of buf
  48145. * @return either pointer to buf which now holds the ASCII
  48146. * representation of addr or NULL if buf was too small
  48147. */
  48148. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  48149. 802fec6: 2500 movs r5, #0
  48150. rp = buf;
  48151. ap = (u8_t *)&s_addr;
  48152. for(n = 0; n < 4; n++) {
  48153. i = 0;
  48154. do {
  48155. rem = *ap % (u8_t)10;
  48156. 802fec8: fbb3 f6fc udiv r6, r3, ip
  48157. *ap /= (u8_t)10;
  48158. inv[i++] = '0' + rem;
  48159. 802fecc: f10d 0b08 add.w fp, sp, #8
  48160. rp = buf;
  48161. ap = (u8_t *)&s_addr;
  48162. for(n = 0; n < 4; n++) {
  48163. i = 0;
  48164. do {
  48165. rem = *ap % (u8_t)10;
  48166. 802fed0: fb0c 3a16 mls sl, ip, r6, r3
  48167. *ap /= (u8_t)10;
  48168. inv[i++] = '0' + rem;
  48169. 802fed4: eb0b 0305 add.w r3, fp, r5
  48170. 802fed8: f10a 0a30 add.w sl, sl, #48 ; 0x30
  48171. 802fedc: 3501 adds r5, #1
  48172. 802fede: f803 ac08 strb.w sl, [r3, #-8]
  48173. } while(*ap);
  48174. 802fee2: f016 03ff ands.w r3, r6, #255 ; 0xff
  48175. for(n = 0; n < 4; n++) {
  48176. i = 0;
  48177. do {
  48178. rem = *ap % (u8_t)10;
  48179. *ap /= (u8_t)10;
  48180. inv[i++] = '0' + rem;
  48181. 802fee6: b2ed uxtb r5, r5
  48182. } while(*ap);
  48183. 802fee8: d1ee bne.n 802fec8 <ipaddr_ntoa_r+0x22>
  48184. 802feea: 3d01 subs r5, #1
  48185. * @param buf target buffer where the string is stored
  48186. * @param buflen length of buf
  48187. * @return either pointer to buf which now holds the ASCII
  48188. * representation of addr or NULL if buf was too small
  48189. */
  48190. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  48191. 802feec: 1be6 subs r6, r4, r7
  48192. 802feee: f800 3f01 strb.w r3, [r0, #1]!
  48193. 802fef2: b2ed uxtb r5, r5
  48194. 802fef4: 463b mov r3, r7
  48195. 802fef6: 4637 mov r7, r6
  48196. 802fef8: e00b b.n 802ff12 <ipaddr_ntoa_r+0x6c>
  48197. 802fefa: 1e6c subs r4, r5, #1
  48198. rem = *ap % (u8_t)10;
  48199. *ap /= (u8_t)10;
  48200. inv[i++] = '0' + rem;
  48201. } while(*ap);
  48202. while(i--) {
  48203. if (len++ >= buflen) {
  48204. 802fefc: 4293 cmp r3, r2
  48205. 802fefe: b2e4 uxtb r4, r4
  48206. 802ff00: da16 bge.n 802ff30 <ipaddr_ntoa_r+0x8a>
  48207. return NULL;
  48208. }
  48209. *rp++ = inv[i];
  48210. 802ff02: f10d 0a08 add.w sl, sp, #8
  48211. 802ff06: 4455 add r5, sl
  48212. 802ff08: f815 5c08 ldrb.w r5, [r5, #-8]
  48213. 802ff0c: 54fd strb r5, [r7, r3]
  48214. 802ff0e: 3301 adds r3, #1
  48215. 802ff10: 4625 mov r5, r4
  48216. do {
  48217. rem = *ap % (u8_t)10;
  48218. *ap /= (u8_t)10;
  48219. inv[i++] = '0' + rem;
  48220. } while(*ap);
  48221. while(i--) {
  48222. 802ff12: 2dff cmp r5, #255 ; 0xff
  48223. * @param buf target buffer where the string is stored
  48224. * @param buflen length of buf
  48225. * @return either pointer to buf which now holds the ASCII
  48226. * representation of addr or NULL if buf was too small
  48227. */
  48228. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  48229. 802ff14: eb06 0403 add.w r4, r6, r3
  48230. do {
  48231. rem = *ap % (u8_t)10;
  48232. *ap /= (u8_t)10;
  48233. inv[i++] = '0' + rem;
  48234. } while(*ap);
  48235. while(i--) {
  48236. 802ff18: d1ef bne.n 802fefa <ipaddr_ntoa_r+0x54>
  48237. if (len++ >= buflen) {
  48238. return NULL;
  48239. }
  48240. *rp++ = inv[i];
  48241. }
  48242. if (len++ >= buflen) {
  48243. 802ff1a: 1c5f adds r7, r3, #1
  48244. 802ff1c: 4293 cmp r3, r2
  48245. 802ff1e: da07 bge.n 802ff30 <ipaddr_ntoa_r+0x8a>
  48246. s_addr = ip4_addr_get_u32(addr);
  48247. rp = buf;
  48248. ap = (u8_t *)&s_addr;
  48249. for(n = 0; n < 4; n++) {
  48250. 802ff20: 4540 cmp r0, r8
  48251. *rp++ = inv[i];
  48252. }
  48253. if (len++ >= buflen) {
  48254. return NULL;
  48255. }
  48256. *rp++ = '.';
  48257. 802ff22: f804 9b01 strb.w r9, [r4], #1
  48258. s_addr = ip4_addr_get_u32(addr);
  48259. rp = buf;
  48260. ap = (u8_t *)&s_addr;
  48261. for(n = 0; n < 4; n++) {
  48262. 802ff26: d1cd bne.n 802fec4 <ipaddr_ntoa_r+0x1e>
  48263. return NULL;
  48264. }
  48265. *rp++ = '.';
  48266. ap++;
  48267. }
  48268. *--rp = 0;
  48269. 802ff28: 2300 movs r3, #0
  48270. 802ff2a: f804 3c01 strb.w r3, [r4, #-1]
  48271. 802ff2e: e000 b.n 802ff32 <ipaddr_ntoa_r+0x8c>
  48272. *ap /= (u8_t)10;
  48273. inv[i++] = '0' + rem;
  48274. } while(*ap);
  48275. while(i--) {
  48276. if (len++ >= buflen) {
  48277. return NULL;
  48278. 802ff30: 2100 movs r1, #0
  48279. *rp++ = '.';
  48280. ap++;
  48281. }
  48282. *--rp = 0;
  48283. return buf;
  48284. }
  48285. 802ff32: 4608 mov r0, r1
  48286. 802ff34: e8bd 8ffe ldmia.w sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  48287. 0802ff38 <ipaddr_ntoa>:
  48288. */
  48289. char *
  48290. ipaddr_ntoa(const ip_addr_t *addr)
  48291. {
  48292. static char str[16];
  48293. return ipaddr_ntoa_r(addr, str, 16);
  48294. 802ff38: 4901 ldr r1, [pc, #4] ; (802ff40 <ipaddr_ntoa+0x8>)
  48295. 802ff3a: 2210 movs r2, #16
  48296. 802ff3c: f7ff bfb3 b.w 802fea6 <ipaddr_ntoa_r>
  48297. 802ff40: 2000e124 .word 0x2000e124
  48298. 0802ff44 <ip_route>:
  48299. return netif;
  48300. }
  48301. #endif
  48302. /* iterate through netifs */
  48303. for (netif = netif_list; netif != NULL; netif = netif->next) {
  48304. 802ff44: 4b0f ldr r3, [pc, #60] ; (802ff84 <ip_route+0x40>)
  48305. * @param dest the destination IP address for which to find the route
  48306. * @return the netif on which to send to reach dest
  48307. */
  48308. struct netif *
  48309. ip_route(ip_addr_t *dest)
  48310. {
  48311. 802ff46: b510 push {r4, lr}
  48312. return netif;
  48313. }
  48314. #endif
  48315. /* iterate through netifs */
  48316. for (netif = netif_list; netif != NULL; netif = netif->next) {
  48317. 802ff48: 681c ldr r4, [r3, #0]
  48318. 802ff4a: e00a b.n 802ff62 <ip_route+0x1e>
  48319. /* network mask matches? */
  48320. if (netif_is_up(netif)) {
  48321. 802ff4c: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  48322. 802ff50: 07d9 lsls r1, r3, #31
  48323. 802ff52: d505 bpl.n 802ff60 <ip_route+0x1c>
  48324. if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
  48325. 802ff54: 6803 ldr r3, [r0, #0]
  48326. 802ff56: 6862 ldr r2, [r4, #4]
  48327. 802ff58: 405a eors r2, r3
  48328. 802ff5a: 68a3 ldr r3, [r4, #8]
  48329. 802ff5c: 421a tst r2, r3
  48330. 802ff5e: d00e beq.n 802ff7e <ip_route+0x3a>
  48331. return netif;
  48332. }
  48333. #endif
  48334. /* iterate through netifs */
  48335. for (netif = netif_list; netif != NULL; netif = netif->next) {
  48336. 802ff60: 6824 ldr r4, [r4, #0]
  48337. 802ff62: 2c00 cmp r4, #0
  48338. 802ff64: d1f2 bne.n 802ff4c <ip_route+0x8>
  48339. /* return netif on which to forward IP packet */
  48340. return netif;
  48341. }
  48342. }
  48343. }
  48344. if ((netif_default == NULL) || (!netif_is_up(netif_default))) {
  48345. 802ff66: 4b08 ldr r3, [pc, #32] ; (802ff88 <ip_route+0x44>)
  48346. 802ff68: 681b ldr r3, [r3, #0]
  48347. 802ff6a: b12b cbz r3, 802ff78 <ip_route+0x34>
  48348. 802ff6c: f893 202d ldrb.w r2, [r3, #45] ; 0x2d
  48349. 802ff70: 07d2 lsls r2, r2, #31
  48350. 802ff72: bf48 it mi
  48351. 802ff74: 461c movmi r4, r3
  48352. 802ff76: d402 bmi.n 802ff7e <ip_route+0x3a>
  48353. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_route: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
  48354. ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
  48355. IP_STATS_INC(ip.rterr);
  48356. snmp_inc_ipoutnoroutes();
  48357. 802ff78: f001 fcbc bl 80318f4 <snmp_inc_ipoutnoroutes>
  48358. return NULL;
  48359. 802ff7c: e7ff b.n 802ff7e <ip_route+0x3a>
  48360. }
  48361. /* no matching netif found, use default netif */
  48362. return netif_default;
  48363. }
  48364. 802ff7e: 4620 mov r0, r4
  48365. 802ff80: bd10 pop {r4, pc}
  48366. 802ff82: bf00 nop
  48367. 802ff84: 20010fd0 .word 0x20010fd0
  48368. 802ff88: 20010fd4 .word 0x20010fd4
  48369. 0802ff8c <ip_input>:
  48370. * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't
  48371. * processed, but currently always returns ERR_OK)
  48372. */
  48373. err_t
  48374. ip_input(struct pbuf *p, struct netif *inp)
  48375. {
  48376. 802ff8c: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  48377. 802ff90: 4604 mov r4, r0
  48378. 802ff92: 460f mov r7, r1
  48379. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  48380. int check_ip_src=1;
  48381. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  48382. IP_STATS_INC(ip.recv);
  48383. snmp_inc_ipinreceives();
  48384. 802ff94: f001 fc6e bl 8031874 <snmp_inc_ipinreceives>
  48385. /* identify the IP header */
  48386. iphdr = (struct ip_hdr *)p->payload;
  48387. 802ff98: 6866 ldr r6, [r4, #4]
  48388. if (IPH_V(iphdr) != 4) {
  48389. 802ff9a: f896 8000 ldrb.w r8, [r6]
  48390. 802ff9e: ea4f 1318 mov.w r3, r8, lsr #4
  48391. 802ffa2: 2b04 cmp r3, #4
  48392. 802ffa4: d005 beq.n 802ffb2 <ip_input+0x26>
  48393. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", IPH_V(iphdr)));
  48394. ip_debug_print(p);
  48395. pbuf_free(p);
  48396. 802ffa6: 4620 mov r0, r4
  48397. 802ffa8: f7fd f842 bl 802d030 <pbuf_free>
  48398. IP_STATS_INC(ip.err);
  48399. IP_STATS_INC(ip.drop);
  48400. snmp_inc_ipinhdrerrors();
  48401. 802ffac: f001 fc6a bl 8031884 <snmp_inc_ipinhdrerrors>
  48402. return ERR_OK;
  48403. 802ffb0: e0be b.n 8030130 <ip_input+0x1a4>
  48404. /* obtain IP header length in number of 32-bit words */
  48405. iphdr_hlen = IPH_HL(iphdr);
  48406. /* calculate IP header length in bytes */
  48407. iphdr_hlen *= 4;
  48408. /* obtain ip length in bytes */
  48409. iphdr_len = ntohs(IPH_LEN(iphdr));
  48410. 802ffb2: 8870 ldrh r0, [r6, #2]
  48411. 802ffb4: f7fb ff03 bl 802bdbe <lwip_ntohs>
  48412. return ERR_OK;
  48413. }
  48414. #endif
  48415. /* obtain IP header length in number of 32-bit words */
  48416. iphdr_hlen = IPH_HL(iphdr);
  48417. 802ffb8: f008 080f and.w r8, r8, #15
  48418. iphdr_hlen *= 4;
  48419. /* obtain ip length in bytes */
  48420. iphdr_len = ntohs(IPH_LEN(iphdr));
  48421. /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
  48422. if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
  48423. 802ffbc: 8963 ldrh r3, [r4, #10]
  48424. #endif
  48425. /* obtain IP header length in number of 32-bit words */
  48426. iphdr_hlen = IPH_HL(iphdr);
  48427. /* calculate IP header length in bytes */
  48428. iphdr_hlen *= 4;
  48429. 802ffbe: ea4f 0888 mov.w r8, r8, lsl #2
  48430. /* obtain ip length in bytes */
  48431. iphdr_len = ntohs(IPH_LEN(iphdr));
  48432. /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
  48433. if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
  48434. 802ffc2: 4543 cmp r3, r8
  48435. /* obtain IP header length in number of 32-bit words */
  48436. iphdr_hlen = IPH_HL(iphdr);
  48437. /* calculate IP header length in bytes */
  48438. iphdr_hlen *= 4;
  48439. /* obtain ip length in bytes */
  48440. iphdr_len = ntohs(IPH_LEN(iphdr));
  48441. 802ffc4: 4601 mov r1, r0
  48442. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  48443. ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
  48444. iphdr_len, p->tot_len));
  48445. }
  48446. /* free (drop) packet pbufs */
  48447. pbuf_free(p);
  48448. 802ffc6: 4620 mov r0, r4
  48449. iphdr_hlen *= 4;
  48450. /* obtain ip length in bytes */
  48451. iphdr_len = ntohs(IPH_LEN(iphdr));
  48452. /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
  48453. if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
  48454. 802ffc8: d302 bcc.n 802ffd0 <ip_input+0x44>
  48455. 802ffca: 8923 ldrh r3, [r4, #8]
  48456. 802ffcc: 428b cmp r3, r1
  48457. 802ffce: d202 bcs.n 802ffd6 <ip_input+0x4a>
  48458. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  48459. ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
  48460. iphdr_len, p->tot_len));
  48461. }
  48462. /* free (drop) packet pbufs */
  48463. pbuf_free(p);
  48464. 802ffd0: f7fd f82e bl 802d030 <pbuf_free>
  48465. 802ffd4: e045 b.n 8030062 <ip_input+0xd6>
  48466. }
  48467. #endif
  48468. /* Trim pbuf. This should have been done at the netif layer,
  48469. * but we'll do it anyway just to be sure that its done. */
  48470. pbuf_realloc(p, iphdr_len);
  48471. 802ffd6: f7fd f852 bl 802d07e <pbuf_realloc>
  48472. /* copy IP addresses to aligned ip_addr_t */
  48473. ip_addr_copy(current_iphdr_dest, iphdr->dest);
  48474. 802ffda: 6932 ldr r2, [r6, #16]
  48475. 802ffdc: 4b56 ldr r3, [pc, #344] ; (8030138 <ip_input+0x1ac>)
  48476. }
  48477. #endif /* LWIP_AUTOIP */
  48478. }
  48479. if (first) {
  48480. first = 0;
  48481. netif = netif_list;
  48482. 802ffde: f8df b168 ldr.w fp, [pc, #360] ; 8030148 <ip_input+0x1bc>
  48483. /* Trim pbuf. This should have been done at the netif layer,
  48484. * but we'll do it anyway just to be sure that its done. */
  48485. pbuf_realloc(p, iphdr_len);
  48486. /* copy IP addresses to aligned ip_addr_t */
  48487. ip_addr_copy(current_iphdr_dest, iphdr->dest);
  48488. 802ffe2: 601a str r2, [r3, #0]
  48489. ip_addr_copy(current_iphdr_src, iphdr->src);
  48490. 802ffe4: 68f1 ldr r1, [r6, #12]
  48491. 802ffe6: 4a55 ldr r2, [pc, #340] ; (803013c <ip_input+0x1b0>)
  48492. 802ffe8: 463d mov r5, r7
  48493. 802ffea: 6011 str r1, [r2, #0]
  48494. #endif /* LWIP_IGMP */
  48495. {
  48496. /* start trying with inp. if that's not acceptable, start walking the
  48497. list of configured netifs.
  48498. 'first' is used as a boolean to mark whether we started walking the list */
  48499. int first = 1;
  48500. 802ffec: f04f 0901 mov.w r9, #1
  48501. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  48502. /* interface is up and configured? */
  48503. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  48504. /* unicast to this interface address? */
  48505. if (ip_addr_cmp(&current_iphdr_dest, &(netif->ip_addr)) ||
  48506. 802fff0: 469a mov sl, r3
  48507. ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(&netif->netmask),
  48508. ip4_addr_get_u32(&netif->ip_addr) & ip4_addr_get_u32(&netif->netmask),
  48509. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  48510. /* interface is up and configured? */
  48511. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  48512. 802fff2: f895 302d ldrb.w r3, [r5, #45] ; 0x2d
  48513. 802fff6: 07d8 lsls r0, r3, #31
  48514. 802fff8: d403 bmi.n 8030002 <ip_input+0x76>
  48515. /* break out of for loop */
  48516. break;
  48517. }
  48518. #endif /* LWIP_AUTOIP */
  48519. }
  48520. if (first) {
  48521. 802fffa: f1b9 0f00 cmp.w r9, #0
  48522. 802fffe: d10e bne.n 803001e <ip_input+0x92>
  48523. 8030000: e010 b.n 8030024 <ip_input+0x98>
  48524. ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(&netif->netmask),
  48525. ip4_addr_get_u32(&netif->ip_addr) & ip4_addr_get_u32(&netif->netmask),
  48526. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  48527. /* interface is up and configured? */
  48528. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  48529. 8030002: 686b ldr r3, [r5, #4]
  48530. 8030004: 2b00 cmp r3, #0
  48531. 8030006: d0f8 beq.n 802fffa <ip_input+0x6e>
  48532. /* unicast to this interface address? */
  48533. if (ip_addr_cmp(&current_iphdr_dest, &(netif->ip_addr)) ||
  48534. 8030008: f8da 0000 ldr.w r0, [sl]
  48535. 803000c: 4298 cmp r0, r3
  48536. 803000e: f000 8088 beq.w 8030122 <ip_input+0x196>
  48537. /* or broadcast on this interface network address? */
  48538. ip_addr_isbroadcast(&current_iphdr_dest, netif)) {
  48539. 8030012: 4629 mov r1, r5
  48540. 8030014: f7ff fea6 bl 802fd64 <ip4_addr_isbroadcast>
  48541. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  48542. /* interface is up and configured? */
  48543. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  48544. /* unicast to this interface address? */
  48545. if (ip_addr_cmp(&current_iphdr_dest, &(netif->ip_addr)) ||
  48546. 8030018: 2800 cmp r0, #0
  48547. 803001a: d0ee beq.n 802fffa <ip_input+0x6e>
  48548. 803001c: e081 b.n 8030122 <ip_input+0x196>
  48549. }
  48550. #endif /* LWIP_AUTOIP */
  48551. }
  48552. if (first) {
  48553. first = 0;
  48554. netif = netif_list;
  48555. 803001e: f8db 5000 ldr.w r5, [fp]
  48556. 8030022: e000 b.n 8030026 <ip_input+0x9a>
  48557. } else {
  48558. netif = netif->next;
  48559. 8030024: 682d ldr r5, [r5, #0]
  48560. }
  48561. if (netif == inp) {
  48562. 8030026: 42bd cmp r5, r7
  48563. netif = netif->next;
  48564. 8030028: bf08 it eq
  48565. 803002a: 682d ldreq r5, [r5, #0]
  48566. 803002c: f04f 0900 mov.w r9, #0
  48567. }
  48568. } while(netif != NULL);
  48569. 8030030: 2d00 cmp r5, #0
  48570. 8030032: d1de bne.n 802fff2 <ip_input+0x66>
  48571. 8030034: e072 b.n 803011c <ip_input+0x190>
  48572. /* remote port is DHCP server? */
  48573. if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
  48574. struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen);
  48575. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n",
  48576. ntohs(udphdr->dest)));
  48577. if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) {
  48578. 8030036: eb06 0308 add.w r3, r6, r8
  48579. 803003a: 885b ldrh r3, [r3, #2]
  48580. 803003c: f5b3 4f88 cmp.w r3, #17408 ; 0x4400
  48581. 8030040: d16f bne.n 8030122 <ip_input+0x196>
  48582. 8030042: e011 b.n 8030068 <ip_input+0xdc>
  48583. /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
  48584. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  48585. /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
  48586. if (check_ip_src && !ip_addr_isany(&current_iphdr_src))
  48587. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  48588. { if ((ip_addr_isbroadcast(&current_iphdr_src, inp)) ||
  48589. 8030044: 4639 mov r1, r7
  48590. 8030046: f7ff fe8d bl 802fd64 <ip4_addr_isbroadcast>
  48591. 803004a: b928 cbnz r0, 8030058 <ip_input+0xcc>
  48592. (ip_addr_ismulticast(&current_iphdr_src))) {
  48593. 803004c: f8d8 3000 ldr.w r3, [r8]
  48594. 8030050: f003 03f0 and.w r3, r3, #240 ; 0xf0
  48595. /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
  48596. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  48597. /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
  48598. if (check_ip_src && !ip_addr_isany(&current_iphdr_src))
  48599. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  48600. { if ((ip_addr_isbroadcast(&current_iphdr_src, inp)) ||
  48601. 8030054: 2be0 cmp r3, #224 ; 0xe0
  48602. 8030056: d108 bne.n 803006a <ip_input+0xde>
  48603. (ip_addr_ismulticast(&current_iphdr_src))) {
  48604. /* packet source is not valid */
  48605. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip_input: packet source is not valid.\n"));
  48606. /* free (drop) packet pbufs */
  48607. pbuf_free(p);
  48608. 8030058: 4620 mov r0, r4
  48609. 803005a: f7fc ffe9 bl 802d030 <pbuf_free>
  48610. IP_STATS_INC(ip.drop);
  48611. snmp_inc_ipinaddrerrors();
  48612. 803005e: f001 fc19 bl 8031894 <snmp_inc_ipinaddrerrors>
  48613. snmp_inc_ipindiscards();
  48614. 8030062: f001 fc27 bl 80318b4 <snmp_inc_ipindiscards>
  48615. return ERR_OK;
  48616. 8030066: e063 b.n 8030130 <ip_input+0x1a4>
  48617. /* remote port is DHCP server? */
  48618. if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
  48619. struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen);
  48620. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n",
  48621. ntohs(udphdr->dest)));
  48622. if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) {
  48623. 8030068: 463d mov r5, r7
  48624. return ERR_OK;
  48625. }
  48626. }
  48627. /* packet not for us? */
  48628. if (netif == NULL) {
  48629. 803006a: b93d cbnz r5, 803007c <ip_input+0xf0>
  48630. /* try to forward IP packet on (other) interfaces */
  48631. ip_forward(p, iphdr, inp);
  48632. } else
  48633. #endif /* IP_FORWARD */
  48634. {
  48635. snmp_inc_ipinaddrerrors();
  48636. 803006c: f001 fc12 bl 8031894 <snmp_inc_ipinaddrerrors>
  48637. snmp_inc_ipindiscards();
  48638. 8030070: f001 fc20 bl 80318b4 <snmp_inc_ipindiscards>
  48639. }
  48640. pbuf_free(p);
  48641. 8030074: 4620 mov r0, r4
  48642. 8030076: f7fc ffdb bl 802d030 <pbuf_free>
  48643. return ERR_OK;
  48644. 803007a: e059 b.n 8030130 <ip_input+0x1a4>
  48645. }
  48646. /* packet consists of multiple fragments? */
  48647. if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) {
  48648. 803007c: 88f3 ldrh r3, [r6, #6]
  48649. 803007e: f023 03c0 bic.w r3, r3, #192 ; 0xc0
  48650. 8030082: b29b uxth r3, r3
  48651. 8030084: b12b cbz r3, 8030092 <ip_input+0x106>
  48652. if (p == NULL) {
  48653. return ERR_OK;
  48654. }
  48655. iphdr = (struct ip_hdr *)p->payload;
  48656. #else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */
  48657. pbuf_free(p);
  48658. 8030086: 4620 mov r0, r4
  48659. 8030088: f7fc ffd2 bl 802d030 <pbuf_free>
  48660. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n",
  48661. ntohs(IPH_OFFSET(iphdr))));
  48662. IP_STATS_INC(ip.opterr);
  48663. IP_STATS_INC(ip.drop);
  48664. /* unsupported protocol feature */
  48665. snmp_inc_ipinunknownprotos();
  48666. 803008c: f001 fc0a bl 80318a4 <snmp_inc_ipinunknownprotos>
  48667. return ERR_OK;
  48668. 8030090: e04e b.n 8030130 <ip_input+0x1a4>
  48669. /* send to upper layers */
  48670. LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n"));
  48671. ip_debug_print(p);
  48672. LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
  48673. current_netif = inp;
  48674. 8030092: 4b2b ldr r3, [pc, #172] ; (8030140 <ip_input+0x1b4>)
  48675. 8030094: 601f str r7, [r3, #0]
  48676. current_header = iphdr;
  48677. 8030096: 4b2b ldr r3, [pc, #172] ; (8030144 <ip_input+0x1b8>)
  48678. #if LWIP_RAW
  48679. /* raw input did not eat the packet? */
  48680. if (raw_input(p, inp) == 0)
  48681. 8030098: 4620 mov r0, r4
  48682. 803009a: 4639 mov r1, r7
  48683. LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n"));
  48684. ip_debug_print(p);
  48685. LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
  48686. current_netif = inp;
  48687. current_header = iphdr;
  48688. 803009c: 601e str r6, [r3, #0]
  48689. #if LWIP_RAW
  48690. /* raw input did not eat the packet? */
  48691. if (raw_input(p, inp) == 0)
  48692. 803009e: f7fd f947 bl 802d330 <raw_input>
  48693. 80300a2: bb88 cbnz r0, 8030108 <ip_input+0x17c>
  48694. #endif /* LWIP_RAW */
  48695. {
  48696. switch (IPH_PROTO(iphdr)) {
  48697. 80300a4: 7a73 ldrb r3, [r6, #9]
  48698. 80300a6: 2b06 cmp r3, #6
  48699. 80300a8: d00b beq.n 80300c2 <ip_input+0x136>
  48700. 80300aa: 2b11 cmp r3, #17
  48701. 80300ac: d002 beq.n 80300b4 <ip_input+0x128>
  48702. 80300ae: 2b01 cmp r3, #1
  48703. 80300b0: d115 bne.n 80300de <ip_input+0x152>
  48704. 80300b2: e00d b.n 80300d0 <ip_input+0x144>
  48705. #if LWIP_UDP
  48706. case IP_PROTO_UDP:
  48707. #if LWIP_UDPLITE
  48708. case IP_PROTO_UDPLITE:
  48709. #endif /* LWIP_UDPLITE */
  48710. snmp_inc_ipindelivers();
  48711. 80300b4: f001 fc06 bl 80318c4 <snmp_inc_ipindelivers>
  48712. udp_input(p, inp);
  48713. 80300b8: 4620 mov r0, r4
  48714. 80300ba: 4639 mov r1, r7
  48715. 80300bc: f7ff fb44 bl 802f748 <udp_input>
  48716. break;
  48717. 80300c0: e022 b.n 8030108 <ip_input+0x17c>
  48718. #endif /* LWIP_UDP */
  48719. #if LWIP_TCP
  48720. case IP_PROTO_TCP:
  48721. snmp_inc_ipindelivers();
  48722. 80300c2: f001 fbff bl 80318c4 <snmp_inc_ipindelivers>
  48723. tcp_input(p, inp);
  48724. 80300c6: 4620 mov r0, r4
  48725. 80300c8: 4639 mov r1, r7
  48726. 80300ca: f7fe f8e7 bl 802e29c <tcp_input>
  48727. break;
  48728. 80300ce: e01b b.n 8030108 <ip_input+0x17c>
  48729. #endif /* LWIP_TCP */
  48730. #if LWIP_ICMP
  48731. case IP_PROTO_ICMP:
  48732. snmp_inc_ipindelivers();
  48733. 80300d0: f001 fbf8 bl 80318c4 <snmp_inc_ipindelivers>
  48734. icmp_input(p, inp);
  48735. 80300d4: 4620 mov r0, r4
  48736. 80300d6: 4639 mov r1, r7
  48737. 80300d8: f7ff fd20 bl 802fb1c <icmp_input>
  48738. break;
  48739. 80300dc: e014 b.n 8030108 <ip_input+0x17c>
  48740. break;
  48741. #endif /* LWIP_IGMP */
  48742. default:
  48743. #if LWIP_ICMP
  48744. /* send ICMP destination protocol unreachable unless is was a broadcast */
  48745. if (!ip_addr_isbroadcast(&current_iphdr_dest, inp) &&
  48746. 80300de: 4d16 ldr r5, [pc, #88] ; (8030138 <ip_input+0x1ac>)
  48747. 80300e0: 4639 mov r1, r7
  48748. 80300e2: 6828 ldr r0, [r5, #0]
  48749. 80300e4: f7ff fe3e bl 802fd64 <ip4_addr_isbroadcast>
  48750. 80300e8: b948 cbnz r0, 80300fe <ip_input+0x172>
  48751. !ip_addr_ismulticast(&current_iphdr_dest)) {
  48752. 80300ea: 682b ldr r3, [r5, #0]
  48753. 80300ec: f003 03f0 and.w r3, r3, #240 ; 0xf0
  48754. break;
  48755. #endif /* LWIP_IGMP */
  48756. default:
  48757. #if LWIP_ICMP
  48758. /* send ICMP destination protocol unreachable unless is was a broadcast */
  48759. if (!ip_addr_isbroadcast(&current_iphdr_dest, inp) &&
  48760. 80300f0: 2be0 cmp r3, #224 ; 0xe0
  48761. 80300f2: d004 beq.n 80300fe <ip_input+0x172>
  48762. !ip_addr_ismulticast(&current_iphdr_dest)) {
  48763. p->payload = iphdr;
  48764. 80300f4: 6066 str r6, [r4, #4]
  48765. icmp_dest_unreach(p, ICMP_DUR_PROTO);
  48766. 80300f6: 4620 mov r0, r4
  48767. 80300f8: 2102 movs r1, #2
  48768. 80300fa: f7ff fda5 bl 802fc48 <icmp_dest_unreach>
  48769. }
  48770. #endif /* LWIP_ICMP */
  48771. pbuf_free(p);
  48772. 80300fe: 4620 mov r0, r4
  48773. 8030100: f7fc ff96 bl 802d030 <pbuf_free>
  48774. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", IPH_PROTO(iphdr)));
  48775. IP_STATS_INC(ip.proterr);
  48776. IP_STATS_INC(ip.drop);
  48777. snmp_inc_ipinunknownprotos();
  48778. 8030104: f001 fbce bl 80318a4 <snmp_inc_ipinunknownprotos>
  48779. }
  48780. }
  48781. current_netif = NULL;
  48782. 8030108: 4a0d ldr r2, [pc, #52] ; (8030140 <ip_input+0x1b4>)
  48783. 803010a: 2300 movs r3, #0
  48784. 803010c: 6013 str r3, [r2, #0]
  48785. current_header = NULL;
  48786. 803010e: 4a0d ldr r2, [pc, #52] ; (8030144 <ip_input+0x1b8>)
  48787. 8030110: 6013 str r3, [r2, #0]
  48788. ip_addr_set_any(&current_iphdr_src);
  48789. 8030112: 4a0a ldr r2, [pc, #40] ; (803013c <ip_input+0x1b0>)
  48790. 8030114: 6013 str r3, [r2, #0]
  48791. ip_addr_set_any(&current_iphdr_dest);
  48792. 8030116: 4a08 ldr r2, [pc, #32] ; (8030138 <ip_input+0x1ac>)
  48793. 8030118: 6013 str r3, [r2, #0]
  48794. return ERR_OK;
  48795. 803011a: e009 b.n 8030130 <ip_input+0x1a4>
  48796. *
  48797. * #define LWIP_IP_ACCEPT_UDP_PORT(dst_port) ((dst_port) == PP_NTOHS(12345))
  48798. */
  48799. if (netif == NULL) {
  48800. /* remote port is DHCP server? */
  48801. if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
  48802. 803011c: 7a73 ldrb r3, [r6, #9]
  48803. 803011e: 2b11 cmp r3, #17
  48804. 8030120: d089 beq.n 8030036 <ip_input+0xaa>
  48805. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  48806. /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
  48807. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  48808. /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
  48809. if (check_ip_src && !ip_addr_isany(&current_iphdr_src))
  48810. 8030122: f8df 8018 ldr.w r8, [pc, #24] ; 803013c <ip_input+0x1b0>
  48811. 8030126: f8d8 0000 ldr.w r0, [r8]
  48812. 803012a: 2800 cmp r0, #0
  48813. 803012c: d09d beq.n 803006a <ip_input+0xde>
  48814. 803012e: e789 b.n 8030044 <ip_input+0xb8>
  48815. current_header = NULL;
  48816. ip_addr_set_any(&current_iphdr_src);
  48817. ip_addr_set_any(&current_iphdr_dest);
  48818. return ERR_OK;
  48819. }
  48820. 8030130: 2000 movs r0, #0
  48821. 8030132: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  48822. 8030136: bf00 nop
  48823. 8030138: 20011004 .word 0x20011004
  48824. 803013c: 20010ffc .word 0x20010ffc
  48825. 8030140: 20011000 .word 0x20011000
  48826. 8030144: 20011008 .word 0x20011008
  48827. 8030148: 20010fd0 .word 0x20010fd0
  48828. 0803014c <ip_output_if>:
  48829. */
  48830. err_t
  48831. ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
  48832. u8_t ttl, u8_t tos,
  48833. u8_t proto, struct netif *netif)
  48834. {
  48835. 803014c: e92d 47f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, r9, sl, lr}
  48836. 8030150: 4615 mov r5, r2
  48837. 8030152: 4606 mov r6, r0
  48838. 8030154: 4689 mov r9, r1
  48839. 8030156: 469a mov sl, r3
  48840. 8030158: 9f0c ldr r7, [sp, #48] ; 0x30
  48841. /* pbufs passed to IP must have a ref-count of 1 as their payload pointer
  48842. gets altered as the packet is passed down the stack */
  48843. LWIP_ASSERT("p->ref == 1", p->ref == 1);
  48844. snmp_inc_ipoutrequests();
  48845. 803015a: f001 fbbb bl 80318d4 <snmp_inc_ipoutrequests>
  48846. /* Should the IP header be generated or is it already included in p? */
  48847. if (dest != IP_HDRINCL) {
  48848. 803015e: b3b5 cbz r5, 80301ce <ip_output_if+0x82>
  48849. }
  48850. #endif /* CHECKSUM_GEN_IP_INLINE */
  48851. }
  48852. #endif /* IP_OPTIONS_SEND */
  48853. /* generate IP header */
  48854. if (pbuf_header(p, IP_HLEN)) {
  48855. 8030160: 4630 mov r0, r6
  48856. 8030162: 2114 movs r1, #20
  48857. 8030164: f7fc ff39 bl 802cfda <pbuf_header>
  48858. 8030168: 4680 mov r8, r0
  48859. 803016a: b118 cbz r0, 8030174 <ip_output_if+0x28>
  48860. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output: not enough room for IP header in pbuf\n"));
  48861. IP_STATS_INC(ip.err);
  48862. snmp_inc_ipoutdiscards();
  48863. 803016c: f001 fbba bl 80318e4 <snmp_inc_ipoutdiscards>
  48864. return ERR_BUF;
  48865. 8030170: 20fe movs r0, #254 ; 0xfe
  48866. 8030172: e036 b.n 80301e2 <ip_output_if+0x96>
  48867. }
  48868. iphdr = (struct ip_hdr *)p->payload;
  48869. 8030174: 6874 ldr r4, [r6, #4]
  48870. LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
  48871. (p->len >= sizeof(struct ip_hdr)));
  48872. IPH_TTL_SET(iphdr, ttl);
  48873. IPH_PROTO_SET(iphdr, proto);
  48874. 8030176: f89d 302c ldrb.w r3, [sp, #44] ; 0x2c
  48875. iphdr = (struct ip_hdr *)p->payload;
  48876. LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
  48877. (p->len >= sizeof(struct ip_hdr)));
  48878. IPH_TTL_SET(iphdr, ttl);
  48879. 803017a: f884 a008 strb.w sl, [r4, #8]
  48880. IPH_PROTO_SET(iphdr, proto);
  48881. 803017e: 7263 strb r3, [r4, #9]
  48882. #if CHECKSUM_GEN_IP_INLINE
  48883. chk_sum += LWIP_MAKE_U16(proto, ttl);
  48884. #endif /* CHECKSUM_GEN_IP_INLINE */
  48885. /* dest cannot be NULL here */
  48886. ip_addr_copy(iphdr->dest, *dest);
  48887. 8030180: 682b ldr r3, [r5, #0]
  48888. 8030182: 6123 str r3, [r4, #16]
  48889. #if CHECKSUM_GEN_IP_INLINE
  48890. chk_sum += ip4_addr_get_u32(&iphdr->dest) & 0xFFFF;
  48891. chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16;
  48892. #endif /* CHECKSUM_GEN_IP_INLINE */
  48893. IPH_VHL_SET(iphdr, 4, ip_hlen / 4);
  48894. 8030184: 2345 movs r3, #69 ; 0x45
  48895. 8030186: 7023 strb r3, [r4, #0]
  48896. IPH_TOS_SET(iphdr, tos);
  48897. 8030188: f89d 3028 ldrb.w r3, [sp, #40] ; 0x28
  48898. 803018c: 7063 strb r3, [r4, #1]
  48899. #if CHECKSUM_GEN_IP_INLINE
  48900. chk_sum += LWIP_MAKE_U16(tos, iphdr->_v_hl);
  48901. #endif /* CHECKSUM_GEN_IP_INLINE */
  48902. IPH_LEN_SET(iphdr, htons(p->tot_len));
  48903. 803018e: 8930 ldrh r0, [r6, #8]
  48904. 8030190: f7fb fe10 bl 802bdb4 <lwip_htons>
  48905. #if CHECKSUM_GEN_IP_INLINE
  48906. chk_sum += iphdr->_len;
  48907. #endif /* CHECKSUM_GEN_IP_INLINE */
  48908. IPH_OFFSET_SET(iphdr, 0);
  48909. 8030194: f884 8006 strb.w r8, [r4, #6]
  48910. 8030198: f884 8007 strb.w r8, [r4, #7]
  48911. IPH_ID_SET(iphdr, htons(ip_id));
  48912. 803019c: f8df 8048 ldr.w r8, [pc, #72] ; 80301e8 <ip_output_if+0x9c>
  48913. IPH_VHL_SET(iphdr, 4, ip_hlen / 4);
  48914. IPH_TOS_SET(iphdr, tos);
  48915. #if CHECKSUM_GEN_IP_INLINE
  48916. chk_sum += LWIP_MAKE_U16(tos, iphdr->_v_hl);
  48917. #endif /* CHECKSUM_GEN_IP_INLINE */
  48918. IPH_LEN_SET(iphdr, htons(p->tot_len));
  48919. 80301a0: 8060 strh r0, [r4, #2]
  48920. #if CHECKSUM_GEN_IP_INLINE
  48921. chk_sum += iphdr->_len;
  48922. #endif /* CHECKSUM_GEN_IP_INLINE */
  48923. IPH_OFFSET_SET(iphdr, 0);
  48924. IPH_ID_SET(iphdr, htons(ip_id));
  48925. 80301a2: f8b8 0000 ldrh.w r0, [r8]
  48926. 80301a6: f7fb fe05 bl 802bdb4 <lwip_htons>
  48927. 80301aa: 80a0 strh r0, [r4, #4]
  48928. #if CHECKSUM_GEN_IP_INLINE
  48929. chk_sum += iphdr->_id;
  48930. #endif /* CHECKSUM_GEN_IP_INLINE */
  48931. ++ip_id;
  48932. 80301ac: f8b8 3000 ldrh.w r3, [r8]
  48933. 80301b0: 3301 adds r3, #1
  48934. 80301b2: f8a8 3000 strh.w r3, [r8]
  48935. if (ip_addr_isany(src)) {
  48936. 80301b6: f1b9 0f00 cmp.w r9, #0
  48937. 80301ba: d002 beq.n 80301c2 <ip_output_if+0x76>
  48938. 80301bc: f8d9 3000 ldr.w r3, [r9]
  48939. 80301c0: b903 cbnz r3, 80301c4 <ip_output_if+0x78>
  48940. ip_addr_copy(iphdr->src, netif->ip_addr);
  48941. 80301c2: 687b ldr r3, [r7, #4]
  48942. } else {
  48943. /* src cannot be NULL here */
  48944. ip_addr_copy(iphdr->src, *src);
  48945. 80301c4: 60e3 str r3, [r4, #12]
  48946. chk_sum = (chk_sum >> 16) + (chk_sum & 0xFFFF);
  48947. chk_sum = (chk_sum >> 16) + chk_sum;
  48948. chk_sum = ~chk_sum;
  48949. iphdr->_chksum = chk_sum; /* network order */
  48950. #else /* CHECKSUM_GEN_IP_INLINE */
  48951. IPH_CHKSUM_SET(iphdr, 0);
  48952. 80301c6: 2300 movs r3, #0
  48953. 80301c8: 72a3 strb r3, [r4, #10]
  48954. 80301ca: 72e3 strb r3, [r4, #11]
  48955. 80301cc: e004 b.n 80301d8 <ip_output_if+0x8c>
  48956. #endif
  48957. #endif /* CHECKSUM_GEN_IP_INLINE */
  48958. } else {
  48959. /* IP header already included in p */
  48960. iphdr = (struct ip_hdr *)p->payload;
  48961. ip_addr_copy(dest_addr, iphdr->dest);
  48962. 80301ce: 6873 ldr r3, [r6, #4]
  48963. 80301d0: ad02 add r5, sp, #8
  48964. 80301d2: 691b ldr r3, [r3, #16]
  48965. 80301d4: f845 3d04 str.w r3, [r5, #-4]!
  48966. return ip_frag(p, netif, dest);
  48967. }
  48968. #endif /* IP_FRAG */
  48969. LWIP_DEBUGF(IP_DEBUG, ("netif->output()"));
  48970. return netif->output(netif, p, dest);
  48971. 80301d8: 697b ldr r3, [r7, #20]
  48972. 80301da: 4638 mov r0, r7
  48973. 80301dc: 4631 mov r1, r6
  48974. 80301de: 462a mov r2, r5
  48975. 80301e0: 4798 blx r3
  48976. }
  48977. 80301e2: b240 sxtb r0, r0
  48978. 80301e4: e8bd 87fc ldmia.w sp!, {r2, r3, r4, r5, r6, r7, r8, r9, sl, pc}
  48979. 80301e8: 2000e134 .word 0x2000e134
  48980. 080301ec <ip_output>:
  48981. * see ip_output_if() for more return values
  48982. */
  48983. err_t
  48984. ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
  48985. u8_t ttl, u8_t tos, u8_t proto)
  48986. {
  48987. 80301ec: b5f0 push {r4, r5, r6, r7, lr}
  48988. 80301ee: 4605 mov r5, r0
  48989. 80301f0: b085 sub sp, #20
  48990. /* pbufs passed to IP must have a ref-count of 1 as their payload pointer
  48991. gets altered as the packet is passed down the stack */
  48992. LWIP_ASSERT("p->ref == 1", p->ref == 1);
  48993. if ((netif = ip_route(dest)) == NULL) {
  48994. 80301f2: 4610 mov r0, r2
  48995. * see ip_output_if() for more return values
  48996. */
  48997. err_t
  48998. ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
  48999. u8_t ttl, u8_t tos, u8_t proto)
  49000. {
  49001. 80301f4: 460f mov r7, r1
  49002. 80301f6: 4614 mov r4, r2
  49003. 80301f8: 461e mov r6, r3
  49004. /* pbufs passed to IP must have a ref-count of 1 as their payload pointer
  49005. gets altered as the packet is passed down the stack */
  49006. LWIP_ASSERT("p->ref == 1", p->ref == 1);
  49007. if ((netif = ip_route(dest)) == NULL) {
  49008. 80301fa: f7ff fea3 bl 802ff44 <ip_route>
  49009. 80301fe: b168 cbz r0, 803021c <ip_output+0x30>
  49010. ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
  49011. IP_STATS_INC(ip.rterr);
  49012. return ERR_RTE;
  49013. }
  49014. return ip_output_if(p, src, dest, ttl, tos, proto, netif);
  49015. 8030200: f89d 3028 ldrb.w r3, [sp, #40] ; 0x28
  49016. 8030204: 9002 str r0, [sp, #8]
  49017. 8030206: 9300 str r3, [sp, #0]
  49018. 8030208: f89d 302c ldrb.w r3, [sp, #44] ; 0x2c
  49019. 803020c: 4628 mov r0, r5
  49020. 803020e: 9301 str r3, [sp, #4]
  49021. 8030210: 4639 mov r1, r7
  49022. 8030212: 4622 mov r2, r4
  49023. 8030214: 4633 mov r3, r6
  49024. 8030216: f7ff ff99 bl 803014c <ip_output_if>
  49025. 803021a: e000 b.n 803021e <ip_output+0x32>
  49026. if ((netif = ip_route(dest)) == NULL) {
  49027. LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
  49028. ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
  49029. IP_STATS_INC(ip.rterr);
  49030. return ERR_RTE;
  49031. 803021c: 20fc movs r0, #252 ; 0xfc
  49032. }
  49033. return ip_output_if(p, src, dest, ttl, tos, proto, netif);
  49034. }
  49035. 803021e: b240 sxtb r0, r0
  49036. 8030220: b005 add sp, #20
  49037. 8030222: bdf0 pop {r4, r5, r6, r7, pc}
  49038. 08030224 <snmp_asn1_dec_type>:
  49039. * @param type return ASN1 type
  49040. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  49041. */
  49042. err_t
  49043. snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type)
  49044. {
  49045. 8030224: b510 push {r4, lr}
  49046. u16_t plen, base;
  49047. u8_t *msg_ptr;
  49048. plen = 0;
  49049. 8030226: 2300 movs r3, #0
  49050. while (p != NULL)
  49051. 8030228: e00c b.n 8030244 <snmp_asn1_dec_type+0x20>
  49052. {
  49053. base = plen;
  49054. plen += p->len;
  49055. 803022a: 8944 ldrh r4, [r0, #10]
  49056. 803022c: 191c adds r4, r3, r4
  49057. 803022e: b2a4 uxth r4, r4
  49058. if (ofs < plen)
  49059. 8030230: 42a1 cmp r1, r4
  49060. 8030232: d205 bcs.n 8030240 <snmp_asn1_dec_type+0x1c>
  49061. {
  49062. msg_ptr = (u8_t*)p->payload;
  49063. 8030234: 6840 ldr r0, [r0, #4]
  49064. msg_ptr += ofs - base;
  49065. 8030236: 1acb subs r3, r1, r3
  49066. *type = *msg_ptr;
  49067. 8030238: 5cc3 ldrb r3, [r0, r3]
  49068. return ERR_OK;
  49069. 803023a: 2000 movs r0, #0
  49070. plen += p->len;
  49071. if (ofs < plen)
  49072. {
  49073. msg_ptr = (u8_t*)p->payload;
  49074. msg_ptr += ofs - base;
  49075. *type = *msg_ptr;
  49076. 803023c: 7013 strb r3, [r2, #0]
  49077. return ERR_OK;
  49078. 803023e: e004 b.n 803024a <snmp_asn1_dec_type+0x26>
  49079. }
  49080. p = p->next;
  49081. 8030240: 6800 ldr r0, [r0, #0]
  49082. plen = 0;
  49083. while (p != NULL)
  49084. {
  49085. base = plen;
  49086. plen += p->len;
  49087. 8030242: 4623 mov r3, r4
  49088. {
  49089. u16_t plen, base;
  49090. u8_t *msg_ptr;
  49091. plen = 0;
  49092. while (p != NULL)
  49093. 8030244: 2800 cmp r0, #0
  49094. 8030246: d1f0 bne.n 803022a <snmp_asn1_dec_type+0x6>
  49095. return ERR_OK;
  49096. }
  49097. p = p->next;
  49098. }
  49099. /* p == NULL, ofs >= plen */
  49100. return ERR_ARG;
  49101. 8030248: 20f2 movs r0, #242 ; 0xf2
  49102. }
  49103. 803024a: b240 sxtb r0, r0
  49104. 803024c: bd10 pop {r4, pc}
  49105. 0803024e <snmp_asn1_dec_length>:
  49106. * @param length return host order length, upto 64k
  49107. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  49108. */
  49109. err_t
  49110. snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length)
  49111. {
  49112. 803024e: b5f0 push {r4, r5, r6, r7, lr}
  49113. u16_t plen, base;
  49114. u8_t *msg_ptr;
  49115. plen = 0;
  49116. 8030250: 2500 movs r5, #0
  49117. while (p != NULL)
  49118. 8030252: e079 b.n 8030348 <snmp_asn1_dec_length+0xfa>
  49119. {
  49120. base = plen;
  49121. plen += p->len;
  49122. 8030254: 8944 ldrh r4, [r0, #10]
  49123. 8030256: 192c adds r4, r5, r4
  49124. 8030258: b2a4 uxth r4, r4
  49125. if (ofs < plen)
  49126. 803025a: 42a1 cmp r1, r4
  49127. 803025c: d272 bcs.n 8030344 <snmp_asn1_dec_length+0xf6>
  49128. {
  49129. msg_ptr = (u8_t*)p->payload;
  49130. 803025e: f8d0 c004 ldr.w ip, [r0, #4]
  49131. msg_ptr += ofs - base;
  49132. 8030262: 1b4f subs r7, r1, r5
  49133. 8030264: eb0c 0507 add.w r5, ip, r7
  49134. if (*msg_ptr < 0x80)
  49135. 8030268: f81c 6007 ldrb.w r6, [ip, r7]
  49136. 803026c: f016 0f80 tst.w r6, #128 ; 0x80
  49137. 8030270: d105 bne.n 803027e <snmp_asn1_dec_length+0x30>
  49138. {
  49139. /* primitive definite length format */
  49140. *octets_used = 1;
  49141. 8030272: 2101 movs r1, #1
  49142. 8030274: 7011 strb r1, [r2, #0]
  49143. *length = *msg_ptr;
  49144. 8030276: f81c 2007 ldrb.w r2, [ip, r7]
  49145. 803027a: 801a strh r2, [r3, #0]
  49146. 803027c: e05a b.n 8030334 <snmp_asn1_dec_length+0xe6>
  49147. return ERR_OK;
  49148. }
  49149. else if (*msg_ptr == 0x80)
  49150. 803027e: 2e80 cmp r6, #128 ; 0x80
  49151. 8030280: d12a bne.n 80302d8 <snmp_asn1_dec_length+0x8a>
  49152. {
  49153. /* constructed indefinite length format, termination with two zero octets */
  49154. u8_t zeros;
  49155. u8_t i;
  49156. *length = 0;
  49157. 8030282: 2600 movs r6, #0
  49158. 8030284: 801e strh r6, [r3, #0]
  49159. 8030286: e022 b.n 80302ce <snmp_asn1_dec_length+0x80>
  49160. {
  49161. i = 2;
  49162. while (i > 0)
  49163. {
  49164. i--;
  49165. (*length) += 1;
  49166. 8030288: f8b3 c000 ldrh.w ip, [r3]
  49167. ofs += 1;
  49168. 803028c: 3101 adds r1, #1
  49169. 803028e: b289 uxth r1, r1
  49170. {
  49171. i = 2;
  49172. while (i > 0)
  49173. {
  49174. i--;
  49175. (*length) += 1;
  49176. 8030290: f10c 0c01 add.w ip, ip, #1
  49177. ofs += 1;
  49178. if (ofs >= plen)
  49179. 8030294: 42a1 cmp r1, r4
  49180. {
  49181. i = 2;
  49182. while (i > 0)
  49183. {
  49184. i--;
  49185. (*length) += 1;
  49186. 8030296: f8a3 c000 strh.w ip, [r3]
  49187. ofs += 1;
  49188. if (ofs >= plen)
  49189. 803029a: d308 bcc.n 80302ae <snmp_asn1_dec_length+0x60>
  49190. {
  49191. /* next octet in next pbuf */
  49192. p = p->next;
  49193. 803029c: 6800 ldr r0, [r0, #0]
  49194. if (p == NULL) { return ERR_ARG; }
  49195. 803029e: b900 cbnz r0, 80302a2 <snmp_asn1_dec_length+0x54>
  49196. 80302a0: e04e b.n 8030340 <snmp_asn1_dec_length+0xf2>
  49197. msg_ptr = (u8_t*)p->payload;
  49198. plen += p->len;
  49199. 80302a2: f8b0 c00a ldrh.w ip, [r0, #10]
  49200. if (ofs >= plen)
  49201. {
  49202. /* next octet in next pbuf */
  49203. p = p->next;
  49204. if (p == NULL) { return ERR_ARG; }
  49205. msg_ptr = (u8_t*)p->payload;
  49206. 80302a6: 6845 ldr r5, [r0, #4]
  49207. plen += p->len;
  49208. 80302a8: 4464 add r4, ip
  49209. 80302aa: b2a4 uxth r4, r4
  49210. 80302ac: e000 b.n 80302b0 <snmp_asn1_dec_length+0x62>
  49211. }
  49212. else
  49213. {
  49214. /* next octet in same pbuf */
  49215. msg_ptr++;
  49216. 80302ae: 3501 adds r5, #1
  49217. }
  49218. if (*msg_ptr == 0)
  49219. 80302b0: f895 c000 ldrb.w ip, [r5]
  49220. 80302b4: f1bc 0f00 cmp.w ip, #0
  49221. 80302b8: d104 bne.n 80302c4 <snmp_asn1_dec_length+0x76>
  49222. {
  49223. zeros++;
  49224. 80302ba: 3601 adds r6, #1
  49225. 80302bc: b2f6 uxtb r6, r6
  49226. if (zeros == 2)
  49227. 80302be: 2e02 cmp r6, #2
  49228. 80302c0: d101 bne.n 80302c6 <snmp_asn1_dec_length+0x78>
  49229. 80302c2: e007 b.n 80302d4 <snmp_asn1_dec_length+0x86>
  49230. i = 0;
  49231. }
  49232. }
  49233. else
  49234. {
  49235. zeros = 0;
  49236. 80302c4: 2600 movs r6, #0
  49237. *length = 0;
  49238. zeros = 0;
  49239. while (zeros != 2)
  49240. {
  49241. i = 2;
  49242. while (i > 0)
  49243. 80302c6: 42b9 cmp r1, r7
  49244. 80302c8: d1de bne.n 8030288 <snmp_asn1_dec_length+0x3a>
  49245. u8_t zeros;
  49246. u8_t i;
  49247. *length = 0;
  49248. zeros = 0;
  49249. while (zeros != 2)
  49250. 80302ca: 2e02 cmp r6, #2
  49251. 80302cc: d002 beq.n 80302d4 <snmp_asn1_dec_length+0x86>
  49252. * @param octets_used returns number of octets used by the length code
  49253. * @param length return host order length, upto 64k
  49254. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  49255. */
  49256. err_t
  49257. snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length)
  49258. 80302ce: 1c8f adds r7, r1, #2
  49259. 80302d0: b2bf uxth r7, r7
  49260. 80302d2: e7d9 b.n 8030288 <snmp_asn1_dec_length+0x3a>
  49261. {
  49262. zeros = 0;
  49263. }
  49264. }
  49265. }
  49266. *octets_used = 1;
  49267. 80302d4: 2301 movs r3, #1
  49268. 80302d6: e02c b.n 8030332 <snmp_asn1_dec_length+0xe4>
  49269. return ERR_OK;
  49270. }
  49271. else if (*msg_ptr == 0x81)
  49272. 80302d8: 2e81 cmp r6, #129 ; 0x81
  49273. 80302da: d10c bne.n 80302f6 <snmp_asn1_dec_length+0xa8>
  49274. {
  49275. /* constructed definite length format, one octet */
  49276. ofs += 1;
  49277. 80302dc: 3101 adds r1, #1
  49278. if (ofs >= plen)
  49279. 80302de: b289 uxth r1, r1
  49280. 80302e0: 42a1 cmp r1, r4
  49281. 80302e2: d303 bcc.n 80302ec <snmp_asn1_dec_length+0x9e>
  49282. {
  49283. /* next octet in next pbuf */
  49284. p = p->next;
  49285. 80302e4: 6801 ldr r1, [r0, #0]
  49286. if (p == NULL) { return ERR_ARG; }
  49287. 80302e6: b359 cbz r1, 8030340 <snmp_asn1_dec_length+0xf2>
  49288. msg_ptr = (u8_t*)p->payload;
  49289. 80302e8: 684d ldr r5, [r1, #4]
  49290. 80302ea: e000 b.n 80302ee <snmp_asn1_dec_length+0xa0>
  49291. }
  49292. else
  49293. {
  49294. /* next octet in same pbuf */
  49295. msg_ptr++;
  49296. 80302ec: 3501 adds r5, #1
  49297. }
  49298. *length = *msg_ptr;
  49299. 80302ee: 7829 ldrb r1, [r5, #0]
  49300. 80302f0: 8019 strh r1, [r3, #0]
  49301. *octets_used = 2;
  49302. 80302f2: 2302 movs r3, #2
  49303. 80302f4: e01d b.n 8030332 <snmp_asn1_dec_length+0xe4>
  49304. return ERR_OK;
  49305. }
  49306. else if (*msg_ptr == 0x82)
  49307. 80302f6: 2e82 cmp r6, #130 ; 0x82
  49308. 80302f8: d11e bne.n 8030338 <snmp_asn1_dec_length+0xea>
  49309. /* constructed definite length format, two octets */
  49310. i = 2;
  49311. while (i > 0)
  49312. {
  49313. i--;
  49314. ofs += 1;
  49315. 80302fa: 1c4e adds r6, r1, #1
  49316. if (ofs >= plen)
  49317. 80302fc: b2b6 uxth r6, r6
  49318. 80302fe: 42a6 cmp r6, r4
  49319. 8030300: d201 bcs.n 8030306 <snmp_asn1_dec_length+0xb8>
  49320. plen += p->len;
  49321. }
  49322. else
  49323. {
  49324. /* next octet in same pbuf */
  49325. msg_ptr++;
  49326. 8030302: 3501 adds r5, #1
  49327. 8030304: e005 b.n 8030312 <snmp_asn1_dec_length+0xc4>
  49328. i--;
  49329. ofs += 1;
  49330. if (ofs >= plen)
  49331. {
  49332. /* next octet in next pbuf */
  49333. p = p->next;
  49334. 8030306: 6800 ldr r0, [r0, #0]
  49335. if (p == NULL) { return ERR_ARG; }
  49336. 8030308: b1d0 cbz r0, 8030340 <snmp_asn1_dec_length+0xf2>
  49337. msg_ptr = (u8_t*)p->payload;
  49338. plen += p->len;
  49339. 803030a: 8946 ldrh r6, [r0, #10]
  49340. if (ofs >= plen)
  49341. {
  49342. /* next octet in next pbuf */
  49343. p = p->next;
  49344. if (p == NULL) { return ERR_ARG; }
  49345. msg_ptr = (u8_t*)p->payload;
  49346. 803030c: 6845 ldr r5, [r0, #4]
  49347. plen += p->len;
  49348. 803030e: 19a4 adds r4, r4, r6
  49349. 8030310: b2a4 uxth r4, r4
  49350. *length |= *msg_ptr;
  49351. }
  49352. else
  49353. {
  49354. /* most significant length octet */
  49355. *length = (*msg_ptr) << 8;
  49356. 8030312: 782e ldrb r6, [r5, #0]
  49357. /* constructed definite length format, two octets */
  49358. i = 2;
  49359. while (i > 0)
  49360. {
  49361. i--;
  49362. ofs += 1;
  49363. 8030314: 3102 adds r1, #2
  49364. if (ofs >= plen)
  49365. 8030316: b289 uxth r1, r1
  49366. *length |= *msg_ptr;
  49367. }
  49368. else
  49369. {
  49370. /* most significant length octet */
  49371. *length = (*msg_ptr) << 8;
  49372. 8030318: 0236 lsls r6, r6, #8
  49373. i = 2;
  49374. while (i > 0)
  49375. {
  49376. i--;
  49377. ofs += 1;
  49378. if (ofs >= plen)
  49379. 803031a: 42a1 cmp r1, r4
  49380. *length |= *msg_ptr;
  49381. }
  49382. else
  49383. {
  49384. /* most significant length octet */
  49385. *length = (*msg_ptr) << 8;
  49386. 803031c: 801e strh r6, [r3, #0]
  49387. i = 2;
  49388. while (i > 0)
  49389. {
  49390. i--;
  49391. ofs += 1;
  49392. if (ofs >= plen)
  49393. 803031e: d201 bcs.n 8030324 <snmp_asn1_dec_length+0xd6>
  49394. plen += p->len;
  49395. }
  49396. else
  49397. {
  49398. /* next octet in same pbuf */
  49399. msg_ptr++;
  49400. 8030320: 3501 adds r5, #1
  49401. 8030322: e002 b.n 803032a <snmp_asn1_dec_length+0xdc>
  49402. i--;
  49403. ofs += 1;
  49404. if (ofs >= plen)
  49405. {
  49406. /* next octet in next pbuf */
  49407. p = p->next;
  49408. 8030324: 6801 ldr r1, [r0, #0]
  49409. if (p == NULL) { return ERR_ARG; }
  49410. 8030326: b159 cbz r1, 8030340 <snmp_asn1_dec_length+0xf2>
  49411. msg_ptr = (u8_t*)p->payload;
  49412. 8030328: 684d ldr r5, [r1, #4]
  49413. msg_ptr++;
  49414. }
  49415. if (i == 0)
  49416. {
  49417. /* least significant length octet */
  49418. *length |= *msg_ptr;
  49419. 803032a: 7829 ldrb r1, [r5, #0]
  49420. 803032c: 430e orrs r6, r1
  49421. 803032e: 801e strh r6, [r3, #0]
  49422. {
  49423. /* most significant length octet */
  49424. *length = (*msg_ptr) << 8;
  49425. }
  49426. }
  49427. *octets_used = 3;
  49428. 8030330: 2303 movs r3, #3
  49429. 8030332: 7013 strb r3, [r2, #0]
  49430. return ERR_OK;
  49431. 8030334: 2000 movs r0, #0
  49432. 8030336: e00a b.n 803034e <snmp_asn1_dec_length+0x100>
  49433. }
  49434. else
  49435. {
  49436. /* constructed definite length format 3..127 octets, this is too big (>64k) */
  49437. /** @todo: do we need to accept inefficient codings with many leading zero's? */
  49438. *octets_used = 1 + ((*msg_ptr) & 0x7f);
  49439. 8030338: f006 067f and.w r6, r6, #127 ; 0x7f
  49440. 803033c: 3601 adds r6, #1
  49441. 803033e: 7016 strb r6, [r2, #0]
  49442. return ERR_ARG;
  49443. 8030340: 20f2 movs r0, #242 ; 0xf2
  49444. 8030342: e004 b.n 803034e <snmp_asn1_dec_length+0x100>
  49445. }
  49446. }
  49447. p = p->next;
  49448. 8030344: 6800 ldr r0, [r0, #0]
  49449. plen = 0;
  49450. while (p != NULL)
  49451. {
  49452. base = plen;
  49453. plen += p->len;
  49454. 8030346: 4625 mov r5, r4
  49455. {
  49456. u16_t plen, base;
  49457. u8_t *msg_ptr;
  49458. plen = 0;
  49459. while (p != NULL)
  49460. 8030348: 2800 cmp r0, #0
  49461. 803034a: d183 bne.n 8030254 <snmp_asn1_dec_length+0x6>
  49462. 803034c: e7f8 b.n 8030340 <snmp_asn1_dec_length+0xf2>
  49463. p = p->next;
  49464. }
  49465. /* p == NULL, ofs >= plen */
  49466. return ERR_ARG;
  49467. }
  49468. 803034e: b240 sxtb r0, r0
  49469. 8030350: bdf0 pop {r4, r5, r6, r7, pc}
  49470. 08030352 <snmp_asn1_dec_u32t>:
  49471. * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
  49472. * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
  49473. */
  49474. err_t
  49475. snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value)
  49476. {
  49477. 8030352: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  49478. u16_t plen, base;
  49479. u8_t *msg_ptr;
  49480. plen = 0;
  49481. 8030356: 2500 movs r5, #0
  49482. while (p != NULL)
  49483. 8030358: e049 b.n 80303ee <snmp_asn1_dec_u32t+0x9c>
  49484. {
  49485. base = plen;
  49486. plen += p->len;
  49487. 803035a: 8944 ldrh r4, [r0, #10]
  49488. 803035c: 192c adds r4, r5, r4
  49489. 803035e: b2a4 uxth r4, r4
  49490. if (ofs < plen)
  49491. 8030360: 42a1 cmp r1, r4
  49492. 8030362: d242 bcs.n 80303ea <snmp_asn1_dec_u32t+0x98>
  49493. {
  49494. msg_ptr = (u8_t*)p->payload;
  49495. msg_ptr += ofs - base;
  49496. if ((len > 0) && (len < 6))
  49497. 8030364: 1e56 subs r6, r2, #1
  49498. {
  49499. base = plen;
  49500. plen += p->len;
  49501. if (ofs < plen)
  49502. {
  49503. msg_ptr = (u8_t*)p->payload;
  49504. 8030366: f8d0 c004 ldr.w ip, [r0, #4]
  49505. msg_ptr += ofs - base;
  49506. if ((len > 0) && (len < 6))
  49507. 803036a: b2b6 uxth r6, r6
  49508. base = plen;
  49509. plen += p->len;
  49510. if (ofs < plen)
  49511. {
  49512. msg_ptr = (u8_t*)p->payload;
  49513. msg_ptr += ofs - base;
  49514. 803036c: 1b4f subs r7, r1, r5
  49515. if ((len > 0) && (len < 6))
  49516. 803036e: 2e04 cmp r6, #4
  49517. base = plen;
  49518. plen += p->len;
  49519. if (ofs < plen)
  49520. {
  49521. msg_ptr = (u8_t*)p->payload;
  49522. msg_ptr += ofs - base;
  49523. 8030370: eb0c 0507 add.w r5, ip, r7
  49524. if ((len > 0) && (len < 6))
  49525. 8030374: d901 bls.n 803037a <snmp_asn1_dec_u32t+0x28>
  49526. *value |= *msg_ptr;
  49527. return ERR_OK;
  49528. }
  49529. else
  49530. {
  49531. return ERR_ARG;
  49532. 8030376: 20f2 movs r0, #242 ; 0xf2
  49533. 8030378: e03c b.n 80303f4 <snmp_asn1_dec_u32t+0xa2>
  49534. msg_ptr = (u8_t*)p->payload;
  49535. msg_ptr += ofs - base;
  49536. if ((len > 0) && (len < 6))
  49537. {
  49538. /* start from zero */
  49539. *value = 0;
  49540. 803037a: f04f 0800 mov.w r8, #0
  49541. 803037e: f8c3 8000 str.w r8, [r3]
  49542. if (*msg_ptr & 0x80)
  49543. 8030382: f81c 7007 ldrb.w r7, [ip, r7]
  49544. 8030386: f017 0f80 tst.w r7, #128 ; 0x80
  49545. 803038a: d1f4 bne.n 8030376 <snmp_asn1_dec_u32t+0x24>
  49546. return ERR_ARG;
  49547. }
  49548. else
  49549. {
  49550. /* positive */
  49551. if ((len > 1) && (*msg_ptr == 0))
  49552. 803038c: 2a01 cmp r2, #1
  49553. 803038e: d00e beq.n 80303ae <snmp_asn1_dec_u32t+0x5c>
  49554. 8030390: b96f cbnz r7, 80303ae <snmp_asn1_dec_u32t+0x5c>
  49555. {
  49556. /* skip leading "sign byte" octet 0x00 */
  49557. len--;
  49558. ofs += 1;
  49559. 8030392: 3101 adds r1, #1
  49560. 8030394: b289 uxth r1, r1
  49561. if (ofs >= plen)
  49562. 8030396: 42a1 cmp r1, r4
  49563. {
  49564. /* positive */
  49565. if ((len > 1) && (*msg_ptr == 0))
  49566. {
  49567. /* skip leading "sign byte" octet 0x00 */
  49568. len--;
  49569. 8030398: 4632 mov r2, r6
  49570. ofs += 1;
  49571. if (ofs >= plen)
  49572. 803039a: d307 bcc.n 80303ac <snmp_asn1_dec_u32t+0x5a>
  49573. {
  49574. /* next octet in next pbuf */
  49575. p = p->next;
  49576. 803039c: 6800 ldr r0, [r0, #0]
  49577. if (p == NULL) { return ERR_ARG; }
  49578. 803039e: 2800 cmp r0, #0
  49579. 80303a0: d0e9 beq.n 8030376 <snmp_asn1_dec_u32t+0x24>
  49580. msg_ptr = (u8_t*)p->payload;
  49581. plen += p->len;
  49582. 80303a2: 8946 ldrh r6, [r0, #10]
  49583. if (ofs >= plen)
  49584. {
  49585. /* next octet in next pbuf */
  49586. p = p->next;
  49587. if (p == NULL) { return ERR_ARG; }
  49588. msg_ptr = (u8_t*)p->payload;
  49589. 80303a4: 6845 ldr r5, [r0, #4]
  49590. plen += p->len;
  49591. 80303a6: 19a4 adds r4, r4, r6
  49592. 80303a8: b2a4 uxth r4, r4
  49593. 80303aa: e000 b.n 80303ae <snmp_asn1_dec_u32t+0x5c>
  49594. }
  49595. else
  49596. {
  49597. /* next octet in same pbuf */
  49598. msg_ptr++;
  49599. 80303ac: 3501 adds r5, #1
  49600. 80303ae: 1c4e adds r6, r1, #1
  49601. * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded
  49602. * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
  49603. * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
  49604. */
  49605. err_t
  49606. snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value)
  49607. 80303b0: 188a adds r2, r1, r2
  49608. 80303b2: b2b6 uxth r6, r6
  49609. 80303b4: b292 uxth r2, r2
  49610. 80303b6: e010 b.n 80303da <snmp_asn1_dec_u32t+0x88>
  49611. }
  49612. /* OR octets with value */
  49613. while (len > 1)
  49614. {
  49615. len--;
  49616. *value |= *msg_ptr;
  49617. 80303b8: 7829 ldrb r1, [r5, #0]
  49618. 80303ba: 430f orrs r7, r1
  49619. *value <<= 8;
  49620. 80303bc: 023f lsls r7, r7, #8
  49621. ofs += 1;
  49622. if (ofs >= plen)
  49623. 80303be: 42a6 cmp r6, r4
  49624. /* OR octets with value */
  49625. while (len > 1)
  49626. {
  49627. len--;
  49628. *value |= *msg_ptr;
  49629. *value <<= 8;
  49630. 80303c0: 601f str r7, [r3, #0]
  49631. ofs += 1;
  49632. if (ofs >= plen)
  49633. 80303c2: d307 bcc.n 80303d4 <snmp_asn1_dec_u32t+0x82>
  49634. {
  49635. /* next octet in next pbuf */
  49636. p = p->next;
  49637. 80303c4: 6800 ldr r0, [r0, #0]
  49638. if (p == NULL) { return ERR_ARG; }
  49639. 80303c6: 2800 cmp r0, #0
  49640. 80303c8: d0d5 beq.n 8030376 <snmp_asn1_dec_u32t+0x24>
  49641. msg_ptr = (u8_t*)p->payload;
  49642. plen += p->len;
  49643. 80303ca: 8941 ldrh r1, [r0, #10]
  49644. if (ofs >= plen)
  49645. {
  49646. /* next octet in next pbuf */
  49647. p = p->next;
  49648. if (p == NULL) { return ERR_ARG; }
  49649. msg_ptr = (u8_t*)p->payload;
  49650. 80303cc: 6845 ldr r5, [r0, #4]
  49651. plen += p->len;
  49652. 80303ce: 1864 adds r4, r4, r1
  49653. 80303d0: b2a4 uxth r4, r4
  49654. 80303d2: e000 b.n 80303d6 <snmp_asn1_dec_u32t+0x84>
  49655. }
  49656. else
  49657. {
  49658. /* next octet in same pbuf */
  49659. msg_ptr++;
  49660. 80303d4: 3501 adds r5, #1
  49661. 80303d6: 3601 adds r6, #1
  49662. 80303d8: b2b6 uxth r6, r6
  49663. msg_ptr++;
  49664. }
  49665. }
  49666. }
  49667. /* OR octets with value */
  49668. while (len > 1)
  49669. 80303da: 4296 cmp r6, r2
  49670. 80303dc: 681f ldr r7, [r3, #0]
  49671. 80303de: d1eb bne.n 80303b8 <snmp_asn1_dec_u32t+0x66>
  49672. {
  49673. /* next octet in same pbuf */
  49674. msg_ptr++;
  49675. }
  49676. }
  49677. *value |= *msg_ptr;
  49678. 80303e0: 782a ldrb r2, [r5, #0]
  49679. 80303e2: 4317 orrs r7, r2
  49680. 80303e4: 601f str r7, [r3, #0]
  49681. return ERR_OK;
  49682. 80303e6: 2000 movs r0, #0
  49683. 80303e8: e004 b.n 80303f4 <snmp_asn1_dec_u32t+0xa2>
  49684. else
  49685. {
  49686. return ERR_ARG;
  49687. }
  49688. }
  49689. p = p->next;
  49690. 80303ea: 6800 ldr r0, [r0, #0]
  49691. plen = 0;
  49692. while (p != NULL)
  49693. {
  49694. base = plen;
  49695. plen += p->len;
  49696. 80303ec: 4625 mov r5, r4
  49697. {
  49698. u16_t plen, base;
  49699. u8_t *msg_ptr;
  49700. plen = 0;
  49701. while (p != NULL)
  49702. 80303ee: 2800 cmp r0, #0
  49703. 80303f0: d1b3 bne.n 803035a <snmp_asn1_dec_u32t+0x8>
  49704. 80303f2: e7c0 b.n 8030376 <snmp_asn1_dec_u32t+0x24>
  49705. }
  49706. p = p->next;
  49707. }
  49708. /* p == NULL, ofs >= plen */
  49709. return ERR_ARG;
  49710. }
  49711. 80303f4: b240 sxtb r0, r0
  49712. 80303f6: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  49713. 080303fa <snmp_asn1_dec_s32t>:
  49714. *
  49715. * @note ASN coded integers are _always_ signed!
  49716. */
  49717. err_t
  49718. snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value)
  49719. {
  49720. 80303fa: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  49721. #if BYTE_ORDER == BIG_ENDIAN
  49722. u8_t *lsb_ptr = (u8_t*)value + sizeof(s32_t) - 1;
  49723. #endif
  49724. u8_t sign;
  49725. plen = 0;
  49726. 80303fe: 2500 movs r5, #0
  49727. while (p != NULL)
  49728. 8030400: e04e b.n 80304a0 <snmp_asn1_dec_s32t+0xa6>
  49729. {
  49730. base = plen;
  49731. plen += p->len;
  49732. 8030402: 8944 ldrh r4, [r0, #10]
  49733. 8030404: 192c adds r4, r5, r4
  49734. 8030406: b2a4 uxth r4, r4
  49735. if (ofs < plen)
  49736. 8030408: 42a1 cmp r1, r4
  49737. 803040a: d247 bcs.n 803049c <snmp_asn1_dec_s32t+0xa2>
  49738. {
  49739. msg_ptr = (u8_t*)p->payload;
  49740. 803040c: 6847 ldr r7, [r0, #4]
  49741. msg_ptr += ofs - base;
  49742. if ((len > 0) && (len < 5))
  49743. 803040e: f102 3cff add.w ip, r2, #4294967295
  49744. base = plen;
  49745. plen += p->len;
  49746. if (ofs < plen)
  49747. {
  49748. msg_ptr = (u8_t*)p->payload;
  49749. msg_ptr += ofs - base;
  49750. 8030412: 1b4e subs r6, r1, r5
  49751. if ((len > 0) && (len < 5))
  49752. 8030414: f1bc 0f03 cmp.w ip, #3
  49753. base = plen;
  49754. plen += p->len;
  49755. if (ofs < plen)
  49756. {
  49757. msg_ptr = (u8_t*)p->payload;
  49758. msg_ptr += ofs - base;
  49759. 8030418: eb07 0506 add.w r5, r7, r6
  49760. if ((len > 0) && (len < 5))
  49761. 803041c: d901 bls.n 8030422 <snmp_asn1_dec_s32t+0x28>
  49762. }
  49763. return ERR_OK;
  49764. }
  49765. else
  49766. {
  49767. return ERR_ARG;
  49768. 803041e: 20f2 movs r0, #242 ; 0xf2
  49769. 8030420: e041 b.n 80304a6 <snmp_asn1_dec_s32t+0xac>
  49770. {
  49771. msg_ptr = (u8_t*)p->payload;
  49772. msg_ptr += ofs - base;
  49773. if ((len > 0) && (len < 5))
  49774. {
  49775. if (*msg_ptr & 0x80)
  49776. 8030422: 57be ldrsb r6, [r7, r6]
  49777. 8030424: 2e00 cmp r6, #0
  49778. 8030426: da0b bge.n 8030440 <snmp_asn1_dec_s32t+0x46>
  49779. {
  49780. /* negative, start from -1 */
  49781. *value = -1;
  49782. 8030428: f04f 36ff mov.w r6, #4294967295
  49783. 803042c: 601e str r6, [r3, #0]
  49784. sign = 1;
  49785. 803042e: 2601 movs r6, #1
  49786. 8030430: f101 0c01 add.w ip, r1, #1
  49787. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  49788. *
  49789. * @note ASN coded integers are _always_ signed!
  49790. */
  49791. err_t
  49792. snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value)
  49793. 8030434: 1852 adds r2, r2, r1
  49794. 8030436: fa1f fc8c uxth.w ip, ip
  49795. 803043a: b292 uxth r2, r2
  49796. len--;
  49797. if (sign)
  49798. {
  49799. *lsb_ptr &= *msg_ptr;
  49800. *value <<= 8;
  49801. *lsb_ptr |= 255;
  49802. 803043c: 21ff movs r1, #255 ; 0xff
  49803. 803043e: e022 b.n 8030486 <snmp_asn1_dec_s32t+0x8c>
  49804. sign = 1;
  49805. }
  49806. else
  49807. {
  49808. /* positive, start from 0 */
  49809. *value = 0;
  49810. 8030440: 2600 movs r6, #0
  49811. 8030442: 601e str r6, [r3, #0]
  49812. 8030444: e7f4 b.n 8030430 <snmp_asn1_dec_s32t+0x36>
  49813. 8030446: f895 8000 ldrb.w r8, [r5]
  49814. }
  49815. /* OR/AND octets with value */
  49816. while (len > 1)
  49817. {
  49818. len--;
  49819. if (sign)
  49820. 803044a: b13e cbz r6, 803045c <snmp_asn1_dec_s32t+0x62>
  49821. {
  49822. *lsb_ptr &= *msg_ptr;
  49823. 803044c: ea08 0707 and.w r7, r8, r7
  49824. 8030450: 701f strb r7, [r3, #0]
  49825. *value <<= 8;
  49826. 8030452: 681f ldr r7, [r3, #0]
  49827. 8030454: 023f lsls r7, r7, #8
  49828. 8030456: 601f str r7, [r3, #0]
  49829. *lsb_ptr |= 255;
  49830. 8030458: 7019 strb r1, [r3, #0]
  49831. 803045a: e005 b.n 8030468 <snmp_asn1_dec_s32t+0x6e>
  49832. }
  49833. else
  49834. {
  49835. *lsb_ptr |= *msg_ptr;
  49836. 803045c: ea48 0707 orr.w r7, r8, r7
  49837. 8030460: 701f strb r7, [r3, #0]
  49838. *value <<= 8;
  49839. 8030462: 681f ldr r7, [r3, #0]
  49840. 8030464: 023f lsls r7, r7, #8
  49841. 8030466: 601f str r7, [r3, #0]
  49842. }
  49843. ofs += 1;
  49844. if (ofs >= plen)
  49845. 8030468: 45a4 cmp ip, r4
  49846. 803046a: d307 bcc.n 803047c <snmp_asn1_dec_s32t+0x82>
  49847. {
  49848. /* next octet in next pbuf */
  49849. p = p->next;
  49850. 803046c: 6800 ldr r0, [r0, #0]
  49851. if (p == NULL) { return ERR_ARG; }
  49852. 803046e: 2800 cmp r0, #0
  49853. 8030470: d0d5 beq.n 803041e <snmp_asn1_dec_s32t+0x24>
  49854. msg_ptr = (u8_t*)p->payload;
  49855. plen += p->len;
  49856. 8030472: 8947 ldrh r7, [r0, #10]
  49857. if (ofs >= plen)
  49858. {
  49859. /* next octet in next pbuf */
  49860. p = p->next;
  49861. if (p == NULL) { return ERR_ARG; }
  49862. msg_ptr = (u8_t*)p->payload;
  49863. 8030474: 6845 ldr r5, [r0, #4]
  49864. plen += p->len;
  49865. 8030476: 19e4 adds r4, r4, r7
  49866. 8030478: b2a4 uxth r4, r4
  49867. 803047a: e000 b.n 803047e <snmp_asn1_dec_s32t+0x84>
  49868. }
  49869. else
  49870. {
  49871. /* next octet in same pbuf */
  49872. msg_ptr++;
  49873. 803047c: 3501 adds r5, #1
  49874. 803047e: f10c 0c01 add.w ip, ip, #1
  49875. 8030482: fa1f fc8c uxth.w ip, ip
  49876. /* positive, start from 0 */
  49877. *value = 0;
  49878. sign = 0;
  49879. }
  49880. /* OR/AND octets with value */
  49881. while (len > 1)
  49882. 8030486: 4594 cmp ip, r2
  49883. 8030488: 781f ldrb r7, [r3, #0]
  49884. 803048a: d1dc bne.n 8030446 <snmp_asn1_dec_s32t+0x4c>
  49885. 803048c: 782a ldrb r2, [r5, #0]
  49886. {
  49887. /* next octet in same pbuf */
  49888. msg_ptr++;
  49889. }
  49890. }
  49891. if (sign)
  49892. 803048e: b11e cbz r6, 8030498 <snmp_asn1_dec_s32t+0x9e>
  49893. {
  49894. *lsb_ptr &= *msg_ptr;
  49895. 8030490: 4017 ands r7, r2
  49896. 8030492: 701f strb r7, [r3, #0]
  49897. }
  49898. else
  49899. {
  49900. *lsb_ptr |= *msg_ptr;
  49901. }
  49902. return ERR_OK;
  49903. 8030494: 2000 movs r0, #0
  49904. 8030496: e006 b.n 80304a6 <snmp_asn1_dec_s32t+0xac>
  49905. {
  49906. *lsb_ptr &= *msg_ptr;
  49907. }
  49908. else
  49909. {
  49910. *lsb_ptr |= *msg_ptr;
  49911. 8030498: 4317 orrs r7, r2
  49912. 803049a: e7fa b.n 8030492 <snmp_asn1_dec_s32t+0x98>
  49913. else
  49914. {
  49915. return ERR_ARG;
  49916. }
  49917. }
  49918. p = p->next;
  49919. 803049c: 6800 ldr r0, [r0, #0]
  49920. plen = 0;
  49921. while (p != NULL)
  49922. {
  49923. base = plen;
  49924. plen += p->len;
  49925. 803049e: 4625 mov r5, r4
  49926. u8_t *lsb_ptr = (u8_t*)value + sizeof(s32_t) - 1;
  49927. #endif
  49928. u8_t sign;
  49929. plen = 0;
  49930. while (p != NULL)
  49931. 80304a0: 2800 cmp r0, #0
  49932. 80304a2: d1ae bne.n 8030402 <snmp_asn1_dec_s32t+0x8>
  49933. 80304a4: e7bb b.n 803041e <snmp_asn1_dec_s32t+0x24>
  49934. }
  49935. p = p->next;
  49936. }
  49937. /* p == NULL, ofs >= plen */
  49938. return ERR_ARG;
  49939. }
  49940. 80304a6: b240 sxtb r0, r0
  49941. 80304a8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  49942. 080304ac <snmp_asn1_dec_oid>:
  49943. * @param oid return object identifier struct
  49944. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  49945. */
  49946. err_t
  49947. snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid)
  49948. {
  49949. 80304ac: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  49950. u16_t plen, base;
  49951. u8_t *msg_ptr;
  49952. s32_t *oid_ptr;
  49953. plen = 0;
  49954. 80304b0: 2600 movs r6, #0
  49955. while (p != NULL)
  49956. 80304b2: e08d b.n 80305d0 <snmp_asn1_dec_oid+0x124>
  49957. {
  49958. base = plen;
  49959. plen += p->len;
  49960. 80304b4: 8944 ldrh r4, [r0, #10]
  49961. 80304b6: 1934 adds r4, r6, r4
  49962. 80304b8: b2a4 uxth r4, r4
  49963. if (ofs < plen)
  49964. 80304ba: 42a1 cmp r1, r4
  49965. 80304bc: f080 8086 bcs.w 80305cc <snmp_asn1_dec_oid+0x120>
  49966. {
  49967. msg_ptr = (u8_t*)p->payload;
  49968. msg_ptr += ofs - base;
  49969. oid->len = 0;
  49970. 80304c0: f04f 0800 mov.w r8, #0
  49971. {
  49972. base = plen;
  49973. plen += p->len;
  49974. if (ofs < plen)
  49975. {
  49976. msg_ptr = (u8_t*)p->payload;
  49977. 80304c4: 6847 ldr r7, [r0, #4]
  49978. msg_ptr += ofs - base;
  49979. oid->len = 0;
  49980. 80304c6: f883 8000 strb.w r8, [r3]
  49981. oid_ptr = &oid->id[0];
  49982. if (len > 0)
  49983. 80304ca: b90a cbnz r2, 80304d0 <snmp_asn1_dec_oid+0x24>
  49984. }
  49985. else
  49986. {
  49987. /* accepting zero length identifiers e.g. for
  49988. getnext operation. uncommon but valid */
  49989. return ERR_OK;
  49990. 80304cc: 2000 movs r0, #0
  49991. 80304ce: e083 b.n 80305d8 <snmp_asn1_dec_oid+0x12c>
  49992. base = plen;
  49993. plen += p->len;
  49994. if (ofs < plen)
  49995. {
  49996. msg_ptr = (u8_t*)p->payload;
  49997. msg_ptr += ofs - base;
  49998. 80304d0: 1b8e subs r6, r1, r6
  49999. 80304d2: 19bd adds r5, r7, r6
  50000. oid->len = 0;
  50001. oid_ptr = &oid->id[0];
  50002. if (len > 0)
  50003. {
  50004. /* first compressed octet */
  50005. if (*msg_ptr == 0x2B)
  50006. 80304d4: f817 c006 ldrb.w ip, [r7, r6]
  50007. 80304d8: f1bc 0f2b cmp.w ip, #43 ; 0x2b
  50008. 80304dc: d103 bne.n 80304e6 <snmp_asn1_dec_oid+0x3a>
  50009. {
  50010. /* (most) common case 1.3 (iso.org) */
  50011. *oid_ptr = 1;
  50012. 80304de: 2601 movs r6, #1
  50013. 80304e0: 605e str r6, [r3, #4]
  50014. oid_ptr++;
  50015. *oid_ptr = 3;
  50016. 80304e2: 2603 movs r6, #3
  50017. 80304e4: e016 b.n 8030514 <snmp_asn1_dec_oid+0x68>
  50018. oid_ptr++;
  50019. }
  50020. else if (*msg_ptr < 40)
  50021. 80304e6: f1bc 0f27 cmp.w ip, #39 ; 0x27
  50022. 80304ea: d803 bhi.n 80304f4 <snmp_asn1_dec_oid+0x48>
  50023. {
  50024. *oid_ptr = 0;
  50025. 80304ec: f8c3 8004 str.w r8, [r3, #4]
  50026. oid_ptr++;
  50027. *oid_ptr = *msg_ptr;
  50028. 80304f0: 5dbe ldrb r6, [r7, r6]
  50029. 80304f2: e00f b.n 8030514 <snmp_asn1_dec_oid+0x68>
  50030. oid_ptr++;
  50031. }
  50032. else if (*msg_ptr < 80)
  50033. 80304f4: f1bc 0f4f cmp.w ip, #79 ; 0x4f
  50034. 80304f8: d806 bhi.n 8030508 <snmp_asn1_dec_oid+0x5c>
  50035. {
  50036. *oid_ptr = 1;
  50037. 80304fa: f04f 0c01 mov.w ip, #1
  50038. 80304fe: f8c3 c004 str.w ip, [r3, #4]
  50039. oid_ptr++;
  50040. *oid_ptr = (*msg_ptr) - 40;
  50041. 8030502: 5dbe ldrb r6, [r7, r6]
  50042. 8030504: 3e28 subs r6, #40 ; 0x28
  50043. 8030506: e005 b.n 8030514 <snmp_asn1_dec_oid+0x68>
  50044. oid_ptr++;
  50045. }
  50046. else
  50047. {
  50048. *oid_ptr = 2;
  50049. 8030508: f04f 0c02 mov.w ip, #2
  50050. 803050c: f8c3 c004 str.w ip, [r3, #4]
  50051. oid_ptr++;
  50052. *oid_ptr = (*msg_ptr) - 80;
  50053. 8030510: 5dbe ldrb r6, [r7, r6]
  50054. 8030512: 3e50 subs r6, #80 ; 0x50
  50055. {
  50056. /* accepting zero length identifiers e.g. for
  50057. getnext operation. uncommon but valid */
  50058. return ERR_OK;
  50059. }
  50060. len--;
  50061. 8030514: 3a01 subs r2, #1
  50062. *oid_ptr = 2;
  50063. oid_ptr++;
  50064. *oid_ptr = (*msg_ptr) - 80;
  50065. oid_ptr++;
  50066. }
  50067. oid->len = 2;
  50068. 8030516: 2702 movs r7, #2
  50069. {
  50070. /* accepting zero length identifiers e.g. for
  50071. getnext operation. uncommon but valid */
  50072. return ERR_OK;
  50073. }
  50074. len--;
  50075. 8030518: b292 uxth r2, r2
  50076. }
  50077. else
  50078. {
  50079. *oid_ptr = 2;
  50080. oid_ptr++;
  50081. *oid_ptr = (*msg_ptr) - 80;
  50082. 803051a: 609e str r6, [r3, #8]
  50083. oid_ptr++;
  50084. }
  50085. oid->len = 2;
  50086. 803051c: 701f strb r7, [r3, #0]
  50087. else
  50088. {
  50089. *oid_ptr = 2;
  50090. oid_ptr++;
  50091. *oid_ptr = (*msg_ptr) - 80;
  50092. oid_ptr++;
  50093. 803051e: f103 060c add.w r6, r3, #12
  50094. /* accepting zero length identifiers e.g. for
  50095. getnext operation. uncommon but valid */
  50096. return ERR_OK;
  50097. }
  50098. len--;
  50099. if (len > 0)
  50100. 8030522: 2a00 cmp r2, #0
  50101. 8030524: d04b beq.n 80305be <snmp_asn1_dec_oid+0x112>
  50102. {
  50103. ofs += 1;
  50104. 8030526: 3101 adds r1, #1
  50105. 8030528: b289 uxth r1, r1
  50106. if (ofs >= plen)
  50107. 803052a: 42a1 cmp r1, r4
  50108. 803052c: d308 bcc.n 8030540 <snmp_asn1_dec_oid+0x94>
  50109. {
  50110. /* next octet in next pbuf */
  50111. p = p->next;
  50112. 803052e: 6800 ldr r0, [r0, #0]
  50113. if (p == NULL) { return ERR_ARG; }
  50114. 8030530: b908 cbnz r0, 8030536 <snmp_asn1_dec_oid+0x8a>
  50115. 8030532: 20f2 movs r0, #242 ; 0xf2
  50116. 8030534: e050 b.n 80305d8 <snmp_asn1_dec_oid+0x12c>
  50117. msg_ptr = (u8_t*)p->payload;
  50118. plen += p->len;
  50119. 8030536: 8947 ldrh r7, [r0, #10]
  50120. if (ofs >= plen)
  50121. {
  50122. /* next octet in next pbuf */
  50123. p = p->next;
  50124. if (p == NULL) { return ERR_ARG; }
  50125. msg_ptr = (u8_t*)p->payload;
  50126. 8030538: 6845 ldr r5, [r0, #4]
  50127. plen += p->len;
  50128. 803053a: 19e4 adds r4, r4, r7
  50129. 803053c: b2a4 uxth r4, r4
  50130. 803053e: e03e b.n 80305be <snmp_asn1_dec_oid+0x112>
  50131. }
  50132. else
  50133. {
  50134. /* next octet in same pbuf */
  50135. msg_ptr++;
  50136. 8030540: 3501 adds r5, #1
  50137. 8030542: e03c b.n 80305be <snmp_asn1_dec_oid+0x112>
  50138. }
  50139. }
  50140. while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN))
  50141. {
  50142. /* sub-identifier uses multiple octets */
  50143. if (*msg_ptr & 0x80)
  50144. 8030544: 782f ldrb r7, [r5, #0]
  50145. 8030546: f017 0f80 tst.w r7, #128 ; 0x80
  50146. 803054a: d023 beq.n 8030594 <snmp_asn1_dec_oid+0xe8>
  50147. 803054c: e014 b.n 8030578 <snmp_asn1_dec_oid+0xcc>
  50148. while ((*msg_ptr & 0x80) && (len > 1))
  50149. {
  50150. len--;
  50151. sub_id = (sub_id << 7) + (*msg_ptr & ~0x80);
  50152. ofs += 1;
  50153. 803054e: 3101 adds r1, #1
  50154. 8030550: b289 uxth r1, r1
  50155. {
  50156. s32_t sub_id = 0;
  50157. while ((*msg_ptr & 0x80) && (len > 1))
  50158. {
  50159. len--;
  50160. 8030552: 3a01 subs r2, #1
  50161. sub_id = (sub_id << 7) + (*msg_ptr & ~0x80);
  50162. 8030554: f02c 0c80 bic.w ip, ip, #128 ; 0x80
  50163. ofs += 1;
  50164. if (ofs >= plen)
  50165. 8030558: 42a1 cmp r1, r4
  50166. {
  50167. s32_t sub_id = 0;
  50168. while ((*msg_ptr & 0x80) && (len > 1))
  50169. {
  50170. len--;
  50171. 803055a: b292 uxth r2, r2
  50172. sub_id = (sub_id << 7) + (*msg_ptr & ~0x80);
  50173. 803055c: eb0c 17c7 add.w r7, ip, r7, lsl #7
  50174. ofs += 1;
  50175. if (ofs >= plen)
  50176. 8030560: d308 bcc.n 8030574 <snmp_asn1_dec_oid+0xc8>
  50177. {
  50178. /* next octet in next pbuf */
  50179. p = p->next;
  50180. 8030562: 6800 ldr r0, [r0, #0]
  50181. if (p == NULL) { return ERR_ARG; }
  50182. 8030564: 2800 cmp r0, #0
  50183. 8030566: d0e4 beq.n 8030532 <snmp_asn1_dec_oid+0x86>
  50184. msg_ptr = (u8_t*)p->payload;
  50185. plen += p->len;
  50186. 8030568: f8b0 c00a ldrh.w ip, [r0, #10]
  50187. if (ofs >= plen)
  50188. {
  50189. /* next octet in next pbuf */
  50190. p = p->next;
  50191. if (p == NULL) { return ERR_ARG; }
  50192. msg_ptr = (u8_t*)p->payload;
  50193. 803056c: 6845 ldr r5, [r0, #4]
  50194. plen += p->len;
  50195. 803056e: 4464 add r4, ip
  50196. 8030570: b2a4 uxth r4, r4
  50197. 8030572: e002 b.n 803057a <snmp_asn1_dec_oid+0xce>
  50198. }
  50199. else
  50200. {
  50201. /* next octet in same pbuf */
  50202. msg_ptr++;
  50203. 8030574: 3501 adds r5, #1
  50204. 8030576: e000 b.n 803057a <snmp_asn1_dec_oid+0xce>
  50205. }
  50206. }
  50207. while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN))
  50208. {
  50209. /* sub-identifier uses multiple octets */
  50210. if (*msg_ptr & 0x80)
  50211. 8030578: 2700 movs r7, #0
  50212. {
  50213. s32_t sub_id = 0;
  50214. while ((*msg_ptr & 0x80) && (len > 1))
  50215. 803057a: f895 c000 ldrb.w ip, [r5]
  50216. 803057e: f01c 0f80 tst.w ip, #128 ; 0x80
  50217. 8030582: d02c beq.n 80305de <snmp_asn1_dec_oid+0x132>
  50218. 8030584: 2a01 cmp r2, #1
  50219. 8030586: d1e2 bne.n 803054e <snmp_asn1_dec_oid+0xa2>
  50220. 8030588: e009 b.n 803059e <snmp_asn1_dec_oid+0xf2>
  50221. }
  50222. }
  50223. if (!(*msg_ptr & 0x80) && (len > 0))
  50224. {
  50225. /* last octet sub-identifier */
  50226. len--;
  50227. 803058a: 3a01 subs r2, #1
  50228. 803058c: b292 uxth r2, r2
  50229. sub_id = (sub_id << 7) + *msg_ptr;
  50230. 803058e: eb0c 17c7 add.w r7, ip, r7, lsl #7
  50231. 8030592: e001 b.n 8030598 <snmp_asn1_dec_oid+0xec>
  50232. }
  50233. }
  50234. else
  50235. {
  50236. /* !(*msg_ptr & 0x80) sub-identifier uses single octet */
  50237. len--;
  50238. 8030594: 3a01 subs r2, #1
  50239. 8030596: b292 uxth r2, r2
  50240. *oid_ptr = *msg_ptr;
  50241. 8030598: f846 7c04 str.w r7, [r6, #-4]
  50242. }
  50243. if (len > 0)
  50244. 803059c: b162 cbz r2, 80305b8 <snmp_asn1_dec_oid+0x10c>
  50245. {
  50246. /* remaining oid bytes available ... */
  50247. ofs += 1;
  50248. 803059e: 3101 adds r1, #1
  50249. 80305a0: b289 uxth r1, r1
  50250. if (ofs >= plen)
  50251. 80305a2: 42a1 cmp r1, r4
  50252. 80305a4: d307 bcc.n 80305b6 <snmp_asn1_dec_oid+0x10a>
  50253. {
  50254. /* next octet in next pbuf */
  50255. p = p->next;
  50256. 80305a6: 6800 ldr r0, [r0, #0]
  50257. if (p == NULL) { return ERR_ARG; }
  50258. 80305a8: 2800 cmp r0, #0
  50259. 80305aa: d0c2 beq.n 8030532 <snmp_asn1_dec_oid+0x86>
  50260. msg_ptr = (u8_t*)p->payload;
  50261. plen += p->len;
  50262. 80305ac: 8947 ldrh r7, [r0, #10]
  50263. if (ofs >= plen)
  50264. {
  50265. /* next octet in next pbuf */
  50266. p = p->next;
  50267. if (p == NULL) { return ERR_ARG; }
  50268. msg_ptr = (u8_t*)p->payload;
  50269. 80305ae: 6845 ldr r5, [r0, #4]
  50270. plen += p->len;
  50271. 80305b0: 19e4 adds r4, r4, r7
  50272. 80305b2: b2a4 uxth r4, r4
  50273. 80305b4: e000 b.n 80305b8 <snmp_asn1_dec_oid+0x10c>
  50274. }
  50275. else
  50276. {
  50277. /* next octet in same pbuf */
  50278. msg_ptr++;
  50279. 80305b6: 3501 adds r5, #1
  50280. }
  50281. }
  50282. oid_ptr++;
  50283. oid->len++;
  50284. 80305b8: 781f ldrb r7, [r3, #0]
  50285. 80305ba: 3701 adds r7, #1
  50286. 80305bc: 701f strb r7, [r3, #0]
  50287. 80305be: 3604 adds r6, #4
  50288. {
  50289. /* next octet in same pbuf */
  50290. msg_ptr++;
  50291. }
  50292. }
  50293. while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN))
  50294. 80305c0: 2a00 cmp r2, #0
  50295. 80305c2: d083 beq.n 80304cc <snmp_asn1_dec_oid+0x20>
  50296. 80305c4: 781f ldrb r7, [r3, #0]
  50297. 80305c6: 2f1f cmp r7, #31
  50298. 80305c8: d9bc bls.n 8030544 <snmp_asn1_dec_oid+0x98>
  50299. 80305ca: e7b2 b.n 8030532 <snmp_asn1_dec_oid+0x86>
  50300. /* len > 0, oid->len == LWIP_SNMP_OBJ_ID_LEN or malformed encoding */
  50301. return ERR_ARG;
  50302. }
  50303. }
  50304. p = p->next;
  50305. 80305cc: 6800 ldr r0, [r0, #0]
  50306. plen = 0;
  50307. while (p != NULL)
  50308. {
  50309. base = plen;
  50310. plen += p->len;
  50311. 80305ce: 4626 mov r6, r4
  50312. u16_t plen, base;
  50313. u8_t *msg_ptr;
  50314. s32_t *oid_ptr;
  50315. plen = 0;
  50316. while (p != NULL)
  50317. 80305d0: 2800 cmp r0, #0
  50318. 80305d2: f47f af6f bne.w 80304b4 <snmp_asn1_dec_oid+0x8>
  50319. 80305d6: e7ac b.n 8030532 <snmp_asn1_dec_oid+0x86>
  50320. 80305d8: b240 sxtb r0, r0
  50321. 80305da: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  50322. {
  50323. /* next octet in same pbuf */
  50324. msg_ptr++;
  50325. }
  50326. }
  50327. if (!(*msg_ptr & 0x80) && (len > 0))
  50328. 80305de: 2a00 cmp r2, #0
  50329. 80305e0: d1d3 bne.n 803058a <snmp_asn1_dec_oid+0xde>
  50330. 80305e2: e7e9 b.n 80305b8 <snmp_asn1_dec_oid+0x10c>
  50331. 080305e4 <snmp_asn1_dec_raw>:
  50332. * @param raw return raw bytes
  50333. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  50334. */
  50335. err_t
  50336. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  50337. {
  50338. 80305e4: b5f0 push {r4, r5, r6, r7, lr}
  50339. u16_t plen, base;
  50340. u8_t *msg_ptr;
  50341. if (len > 0)
  50342. 80305e6: 2a00 cmp r2, #0
  50343. 80305e8: d12d bne.n 8030646 <snmp_asn1_dec_raw+0x62>
  50344. 80305ea: e027 b.n 803063c <snmp_asn1_dec_raw+0x58>
  50345. {
  50346. plen = 0;
  50347. while (p != NULL)
  50348. {
  50349. base = plen;
  50350. plen += p->len;
  50351. 80305ec: 8944 ldrh r4, [r0, #10]
  50352. 80305ee: 1934 adds r4, r6, r4
  50353. 80305f0: b2a4 uxth r4, r4
  50354. if (ofs < plen)
  50355. 80305f2: 42a1 cmp r1, r4
  50356. 80305f4: d224 bcs.n 8030640 <snmp_asn1_dec_raw+0x5c>
  50357. {
  50358. msg_ptr = (u8_t*)p->payload;
  50359. 80305f6: 6847 ldr r7, [r0, #4]
  50360. msg_ptr += ofs - base;
  50361. 80305f8: 1b8d subs r5, r1, r6
  50362. if (raw_len >= len)
  50363. 80305fa: 4293 cmp r3, r2
  50364. base = plen;
  50365. plen += p->len;
  50366. if (ofs < plen)
  50367. {
  50368. msg_ptr = (u8_t*)p->payload;
  50369. msg_ptr += ofs - base;
  50370. 80305fc: 443d add r5, r7
  50371. if (raw_len >= len)
  50372. 80305fe: d305 bcc.n 803060c <snmp_asn1_dec_raw+0x28>
  50373. 8030600: 9b05 ldr r3, [sp, #20]
  50374. * @param raw_len length of the raw return value
  50375. * @param raw return raw bytes
  50376. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  50377. */
  50378. err_t
  50379. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  50380. 8030602: b29e uxth r6, r3
  50381. 8030604: 18b2 adds r2, r6, r2
  50382. 8030606: b292 uxth r2, r2
  50383. 8030608: 1b89 subs r1, r1, r6
  50384. 803060a: e011 b.n 8030630 <snmp_asn1_dec_raw+0x4c>
  50385. return ERR_OK;
  50386. }
  50387. else
  50388. {
  50389. /* raw_len < len, not enough dst space */
  50390. return ERR_ARG;
  50391. 803060c: 20f2 movs r0, #242 ; 0xf2
  50392. 803060e: e01e b.n 803064e <snmp_asn1_dec_raw+0x6a>
  50393. {
  50394. while (len > 1)
  50395. {
  50396. /* copy len - 1 octets */
  50397. len--;
  50398. *raw = *msg_ptr;
  50399. 8030610: 782e ldrb r6, [r5, #0]
  50400. 8030612: f803 6b01 strb.w r6, [r3], #1
  50401. * @param raw_len length of the raw return value
  50402. * @param raw return raw bytes
  50403. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  50404. */
  50405. err_t
  50406. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  50407. 8030616: 18ce adds r6, r1, r3
  50408. /* copy len - 1 octets */
  50409. len--;
  50410. *raw = *msg_ptr;
  50411. raw++;
  50412. ofs += 1;
  50413. if (ofs >= plen)
  50414. 8030618: b2b6 uxth r6, r6
  50415. 803061a: 42a6 cmp r6, r4
  50416. 803061c: d307 bcc.n 803062e <snmp_asn1_dec_raw+0x4a>
  50417. {
  50418. /* next octet in next pbuf */
  50419. p = p->next;
  50420. 803061e: 6800 ldr r0, [r0, #0]
  50421. if (p == NULL) { return ERR_ARG; }
  50422. 8030620: 2800 cmp r0, #0
  50423. 8030622: d0f3 beq.n 803060c <snmp_asn1_dec_raw+0x28>
  50424. msg_ptr = (u8_t*)p->payload;
  50425. plen += p->len;
  50426. 8030624: 8946 ldrh r6, [r0, #10]
  50427. if (ofs >= plen)
  50428. {
  50429. /* next octet in next pbuf */
  50430. p = p->next;
  50431. if (p == NULL) { return ERR_ARG; }
  50432. msg_ptr = (u8_t*)p->payload;
  50433. 8030626: 6845 ldr r5, [r0, #4]
  50434. plen += p->len;
  50435. 8030628: 19a4 adds r4, r4, r6
  50436. 803062a: b2a4 uxth r4, r4
  50437. 803062c: e000 b.n 8030630 <snmp_asn1_dec_raw+0x4c>
  50438. }
  50439. else
  50440. {
  50441. /* next octet in same pbuf */
  50442. msg_ptr++;
  50443. 803062e: 3501 adds r5, #1
  50444. {
  50445. msg_ptr = (u8_t*)p->payload;
  50446. msg_ptr += ofs - base;
  50447. if (raw_len >= len)
  50448. {
  50449. while (len > 1)
  50450. 8030630: 1ad7 subs r7, r2, r3
  50451. 8030632: b2bf uxth r7, r7
  50452. 8030634: 2f01 cmp r7, #1
  50453. 8030636: d8eb bhi.n 8030610 <snmp_asn1_dec_raw+0x2c>
  50454. /* next octet in same pbuf */
  50455. msg_ptr++;
  50456. }
  50457. }
  50458. /* copy last octet */
  50459. *raw = *msg_ptr;
  50460. 8030638: 782a ldrb r2, [r5, #0]
  50461. 803063a: 701a strb r2, [r3, #0]
  50462. return ERR_OK;
  50463. 803063c: 2000 movs r0, #0
  50464. 803063e: e006 b.n 803064e <snmp_asn1_dec_raw+0x6a>
  50465. {
  50466. /* raw_len < len, not enough dst space */
  50467. return ERR_ARG;
  50468. }
  50469. }
  50470. p = p->next;
  50471. 8030640: 6800 ldr r0, [r0, #0]
  50472. {
  50473. plen = 0;
  50474. while (p != NULL)
  50475. {
  50476. base = plen;
  50477. plen += p->len;
  50478. 8030642: 4626 mov r6, r4
  50479. 8030644: e000 b.n 8030648 <snmp_asn1_dec_raw+0x64>
  50480. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  50481. {
  50482. u16_t plen, base;
  50483. u8_t *msg_ptr;
  50484. if (len > 0)
  50485. 8030646: 2600 movs r6, #0
  50486. {
  50487. plen = 0;
  50488. while (p != NULL)
  50489. 8030648: 2800 cmp r0, #0
  50490. 803064a: d1cf bne.n 80305ec <snmp_asn1_dec_raw+0x8>
  50491. 803064c: e7de b.n 803060c <snmp_asn1_dec_raw+0x28>
  50492. else
  50493. {
  50494. /* len == 0, empty string */
  50495. return ERR_OK;
  50496. }
  50497. }
  50498. 803064e: b240 sxtb r0, r0
  50499. 8030650: bdf0 pop {r4, r5, r6, r7, pc}
  50500. 08030652 <snmp_asn1_enc_length_cnt>:
  50501. * @param octets_needed points to the return value
  50502. */
  50503. void
  50504. snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed)
  50505. {
  50506. if (length < 0x80U)
  50507. 8030652: 287f cmp r0, #127 ; 0x7f
  50508. 8030654: d801 bhi.n 803065a <snmp_asn1_enc_length_cnt+0x8>
  50509. {
  50510. *octets_needed = 1;
  50511. 8030656: 2301 movs r3, #1
  50512. 8030658: e004 b.n 8030664 <snmp_asn1_enc_length_cnt+0x12>
  50513. }
  50514. else if (length < 0x100U)
  50515. 803065a: 28ff cmp r0, #255 ; 0xff
  50516. 803065c: d801 bhi.n 8030662 <snmp_asn1_enc_length_cnt+0x10>
  50517. {
  50518. *octets_needed = 2;
  50519. 803065e: 2302 movs r3, #2
  50520. 8030660: e000 b.n 8030664 <snmp_asn1_enc_length_cnt+0x12>
  50521. }
  50522. else
  50523. {
  50524. *octets_needed = 3;
  50525. 8030662: 2303 movs r3, #3
  50526. 8030664: 700b strb r3, [r1, #0]
  50527. 8030666: 4770 bx lr
  50528. 08030668 <snmp_asn1_enc_u32t_cnt>:
  50529. * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
  50530. */
  50531. void
  50532. snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed)
  50533. {
  50534. if (value < 0x80UL)
  50535. 8030668: 287f cmp r0, #127 ; 0x7f
  50536. 803066a: d801 bhi.n 8030670 <snmp_asn1_enc_u32t_cnt+0x8>
  50537. {
  50538. *octets_needed = 1;
  50539. 803066c: 2301 movs r3, #1
  50540. 803066e: e00e b.n 803068e <snmp_asn1_enc_u32t_cnt+0x26>
  50541. }
  50542. else if (value < 0x8000UL)
  50543. 8030670: f5b0 4f00 cmp.w r0, #32768 ; 0x8000
  50544. 8030674: d201 bcs.n 803067a <snmp_asn1_enc_u32t_cnt+0x12>
  50545. {
  50546. *octets_needed = 2;
  50547. 8030676: 2302 movs r3, #2
  50548. 8030678: e009 b.n 803068e <snmp_asn1_enc_u32t_cnt+0x26>
  50549. }
  50550. else if (value < 0x800000UL)
  50551. 803067a: f5b0 0f00 cmp.w r0, #8388608 ; 0x800000
  50552. 803067e: d201 bcs.n 8030684 <snmp_asn1_enc_u32t_cnt+0x1c>
  50553. {
  50554. *octets_needed = 3;
  50555. 8030680: 2303 movs r3, #3
  50556. 8030682: e004 b.n 803068e <snmp_asn1_enc_u32t_cnt+0x26>
  50557. }
  50558. else if (value < 0x80000000UL)
  50559. 8030684: 2800 cmp r0, #0
  50560. 8030686: db01 blt.n 803068c <snmp_asn1_enc_u32t_cnt+0x24>
  50561. {
  50562. *octets_needed = 4;
  50563. 8030688: 2304 movs r3, #4
  50564. 803068a: e000 b.n 803068e <snmp_asn1_enc_u32t_cnt+0x26>
  50565. }
  50566. else
  50567. {
  50568. *octets_needed = 5;
  50569. 803068c: 2305 movs r3, #5
  50570. 803068e: 800b strh r3, [r1, #0]
  50571. 8030690: 4770 bx lr
  50572. 08030692 <snmp_asn1_enc_s32t_cnt>:
  50573. void
  50574. snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed)
  50575. {
  50576. if (value < 0)
  50577. {
  50578. value = ~value;
  50579. 8030692: 43c3 mvns r3, r0
  50580. 8030694: 4283 cmp r3, r0
  50581. 8030696: bfa8 it ge
  50582. 8030698: 4618 movge r0, r3
  50583. }
  50584. if (value < 0x80L)
  50585. 803069a: 287f cmp r0, #127 ; 0x7f
  50586. 803069c: dc01 bgt.n 80306a2 <snmp_asn1_enc_s32t_cnt+0x10>
  50587. {
  50588. *octets_needed = 1;
  50589. 803069e: 2301 movs r3, #1
  50590. 80306a0: e00a b.n 80306b8 <snmp_asn1_enc_s32t_cnt+0x26>
  50591. }
  50592. else if (value < 0x8000L)
  50593. 80306a2: f5b0 4f00 cmp.w r0, #32768 ; 0x8000
  50594. 80306a6: da01 bge.n 80306ac <snmp_asn1_enc_s32t_cnt+0x1a>
  50595. {
  50596. *octets_needed = 2;
  50597. 80306a8: 2302 movs r3, #2
  50598. 80306aa: e005 b.n 80306b8 <snmp_asn1_enc_s32t_cnt+0x26>
  50599. }
  50600. else if (value < 0x800000L)
  50601. 80306ac: f5b0 0f00 cmp.w r0, #8388608 ; 0x800000
  50602. 80306b0: da01 bge.n 80306b6 <snmp_asn1_enc_s32t_cnt+0x24>
  50603. {
  50604. *octets_needed = 3;
  50605. 80306b2: 2303 movs r3, #3
  50606. 80306b4: e000 b.n 80306b8 <snmp_asn1_enc_s32t_cnt+0x26>
  50607. }
  50608. else
  50609. {
  50610. *octets_needed = 4;
  50611. 80306b6: 2304 movs r3, #4
  50612. 80306b8: 800b strh r3, [r1, #0]
  50613. 80306ba: 4770 bx lr
  50614. 080306bc <snmp_asn1_enc_oid_cnt>:
  50615. {
  50616. s32_t sub_id;
  50617. u8_t cnt;
  50618. cnt = 0;
  50619. if (ident_len > 1)
  50620. 80306bc: 2801 cmp r0, #1
  50621. * @param ident points to object identifier array
  50622. * @param octets_needed points to the return value
  50623. */
  50624. void
  50625. snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed)
  50626. {
  50627. 80306be: b510 push {r4, lr}
  50628. s32_t sub_id;
  50629. u8_t cnt;
  50630. cnt = 0;
  50631. if (ident_len > 1)
  50632. 80306c0: d904 bls.n 80306cc <snmp_asn1_enc_oid_cnt+0x10>
  50633. {
  50634. /* compressed prefix in one octet */
  50635. cnt++;
  50636. ident_len -= 2;
  50637. 80306c2: 3802 subs r0, #2
  50638. 80306c4: b2c0 uxtb r0, r0
  50639. ident += 2;
  50640. 80306c6: 3108 adds r1, #8
  50641. cnt = 0;
  50642. if (ident_len > 1)
  50643. {
  50644. /* compressed prefix in one octet */
  50645. cnt++;
  50646. 80306c8: 2301 movs r3, #1
  50647. 80306ca: e000 b.n 80306ce <snmp_asn1_enc_oid_cnt+0x12>
  50648. snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed)
  50649. {
  50650. s32_t sub_id;
  50651. u8_t cnt;
  50652. cnt = 0;
  50653. 80306cc: 2300 movs r3, #0
  50654. * @param ident_len object identifier array length
  50655. * @param ident points to object identifier array
  50656. * @param octets_needed points to the return value
  50657. */
  50658. void
  50659. snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed)
  50660. 80306ce: 3904 subs r1, #4
  50661. 80306d0: e008 b.n 80306e4 <snmp_asn1_enc_oid_cnt+0x28>
  50662. ident_len -= 2;
  50663. ident += 2;
  50664. }
  50665. while(ident_len > 0)
  50666. {
  50667. ident_len--;
  50668. 80306d2: 3801 subs r0, #1
  50669. sub_id = *ident;
  50670. 80306d4: f851 4f04 ldr.w r4, [r1, #4]!
  50671. ident_len -= 2;
  50672. ident += 2;
  50673. }
  50674. while(ident_len > 0)
  50675. {
  50676. ident_len--;
  50677. 80306d8: b2c0 uxtb r0, r0
  50678. sub_id >>= 7;
  50679. cnt++;
  50680. while(sub_id > 0)
  50681. {
  50682. sub_id >>= 7;
  50683. 80306da: 11e4 asrs r4, r4, #7
  50684. cnt++;
  50685. 80306dc: 3301 adds r3, #1
  50686. ident_len--;
  50687. sub_id = *ident;
  50688. sub_id >>= 7;
  50689. cnt++;
  50690. while(sub_id > 0)
  50691. 80306de: 2c00 cmp r4, #0
  50692. {
  50693. sub_id >>= 7;
  50694. cnt++;
  50695. 80306e0: b2db uxtb r3, r3
  50696. ident_len--;
  50697. sub_id = *ident;
  50698. sub_id >>= 7;
  50699. cnt++;
  50700. while(sub_id > 0)
  50701. 80306e2: dcfa bgt.n 80306da <snmp_asn1_enc_oid_cnt+0x1e>
  50702. /* compressed prefix in one octet */
  50703. cnt++;
  50704. ident_len -= 2;
  50705. ident += 2;
  50706. }
  50707. while(ident_len > 0)
  50708. 80306e4: 2800 cmp r0, #0
  50709. 80306e6: d1f4 bne.n 80306d2 <snmp_asn1_enc_oid_cnt+0x16>
  50710. sub_id >>= 7;
  50711. cnt++;
  50712. }
  50713. ident++;
  50714. }
  50715. *octets_needed = cnt;
  50716. 80306e8: 8013 strh r3, [r2, #0]
  50717. 80306ea: bd10 pop {r4, pc}
  50718. 080306ec <snmp_asn1_enc_type>:
  50719. * @param type input ASN1 type
  50720. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  50721. */
  50722. err_t
  50723. snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type)
  50724. {
  50725. 80306ec: b510 push {r4, lr}
  50726. u16_t plen, base;
  50727. u8_t *msg_ptr;
  50728. plen = 0;
  50729. 80306ee: 2300 movs r3, #0
  50730. while (p != NULL)
  50731. 80306f0: e00b b.n 803070a <snmp_asn1_enc_type+0x1e>
  50732. {
  50733. base = plen;
  50734. plen += p->len;
  50735. 80306f2: 8944 ldrh r4, [r0, #10]
  50736. 80306f4: 191c adds r4, r3, r4
  50737. 80306f6: b2a4 uxth r4, r4
  50738. if (ofs < plen)
  50739. 80306f8: 42a1 cmp r1, r4
  50740. 80306fa: d204 bcs.n 8030706 <snmp_asn1_enc_type+0x1a>
  50741. {
  50742. msg_ptr = (u8_t*)p->payload;
  50743. 80306fc: 6840 ldr r0, [r0, #4]
  50744. msg_ptr += ofs - base;
  50745. 80306fe: 1acb subs r3, r1, r3
  50746. *msg_ptr = type;
  50747. 8030700: 54c2 strb r2, [r0, r3]
  50748. return ERR_OK;
  50749. 8030702: 2000 movs r0, #0
  50750. 8030704: e004 b.n 8030710 <snmp_asn1_enc_type+0x24>
  50751. }
  50752. p = p->next;
  50753. 8030706: 6800 ldr r0, [r0, #0]
  50754. plen = 0;
  50755. while (p != NULL)
  50756. {
  50757. base = plen;
  50758. plen += p->len;
  50759. 8030708: 4623 mov r3, r4
  50760. {
  50761. u16_t plen, base;
  50762. u8_t *msg_ptr;
  50763. plen = 0;
  50764. while (p != NULL)
  50765. 803070a: 2800 cmp r0, #0
  50766. 803070c: d1f1 bne.n 80306f2 <snmp_asn1_enc_type+0x6>
  50767. return ERR_OK;
  50768. }
  50769. p = p->next;
  50770. }
  50771. /* p == NULL, ofs >= plen */
  50772. return ERR_ARG;
  50773. 803070e: 20f2 movs r0, #242 ; 0xf2
  50774. }
  50775. 8030710: b240 sxtb r0, r0
  50776. 8030712: bd10 pop {r4, pc}
  50777. 08030714 <snmp_asn1_enc_length>:
  50778. * @param length is the host order length to be encoded
  50779. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  50780. */
  50781. err_t
  50782. snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length)
  50783. {
  50784. 8030714: b5f0 push {r4, r5, r6, r7, lr}
  50785. u16_t plen, base;
  50786. u8_t *msg_ptr;
  50787. plen = 0;
  50788. 8030716: 2400 movs r4, #0
  50789. while (p != NULL)
  50790. 8030718: e03f b.n 803079a <snmp_asn1_enc_length+0x86>
  50791. {
  50792. base = plen;
  50793. plen += p->len;
  50794. 803071a: 8943 ldrh r3, [r0, #10]
  50795. 803071c: 18e3 adds r3, r4, r3
  50796. 803071e: b29b uxth r3, r3
  50797. if (ofs < plen)
  50798. 8030720: 4299 cmp r1, r3
  50799. 8030722: d238 bcs.n 8030796 <snmp_asn1_enc_length+0x82>
  50800. {
  50801. msg_ptr = (u8_t*)p->payload;
  50802. 8030724: 6845 ldr r5, [r0, #4]
  50803. msg_ptr += ofs - base;
  50804. 8030726: 1b0c subs r4, r1, r4
  50805. if (length < 0x80)
  50806. 8030728: 2a7f cmp r2, #127 ; 0x7f
  50807. base = plen;
  50808. plen += p->len;
  50809. if (ofs < plen)
  50810. {
  50811. msg_ptr = (u8_t*)p->payload;
  50812. msg_ptr += ofs - base;
  50813. 803072a: eb05 0604 add.w r6, r5, r4
  50814. if (length < 0x80)
  50815. 803072e: d801 bhi.n 8030734 <snmp_asn1_enc_length+0x20>
  50816. {
  50817. *msg_ptr = (u8_t)length;
  50818. 8030730: 552a strb r2, [r5, r4]
  50819. 8030732: e02e b.n 8030792 <snmp_asn1_enc_length+0x7e>
  50820. return ERR_OK;
  50821. }
  50822. else if (length < 0x100)
  50823. 8030734: 2aff cmp r2, #255 ; 0xff
  50824. 8030736: f101 0701 add.w r7, r1, #1
  50825. 803073a: d80d bhi.n 8030758 <snmp_asn1_enc_length+0x44>
  50826. {
  50827. *msg_ptr = 0x81;
  50828. ofs += 1;
  50829. if (ofs >= plen)
  50830. 803073c: b2bf uxth r7, r7
  50831. *msg_ptr = (u8_t)length;
  50832. return ERR_OK;
  50833. }
  50834. else if (length < 0x100)
  50835. {
  50836. *msg_ptr = 0x81;
  50837. 803073e: 2181 movs r1, #129 ; 0x81
  50838. ofs += 1;
  50839. if (ofs >= plen)
  50840. 8030740: 429f cmp r7, r3
  50841. *msg_ptr = (u8_t)length;
  50842. return ERR_OK;
  50843. }
  50844. else if (length < 0x100)
  50845. {
  50846. *msg_ptr = 0x81;
  50847. 8030742: 5529 strb r1, [r5, r4]
  50848. ofs += 1;
  50849. if (ofs >= plen)
  50850. 8030744: d305 bcc.n 8030752 <snmp_asn1_enc_length+0x3e>
  50851. {
  50852. /* next octet in next pbuf */
  50853. p = p->next;
  50854. 8030746: 6803 ldr r3, [r0, #0]
  50855. if (p == NULL) { return ERR_ARG; }
  50856. 8030748: b90b cbnz r3, 803074e <snmp_asn1_enc_length+0x3a>
  50857. 803074a: 20f2 movs r0, #242 ; 0xf2
  50858. 803074c: e028 b.n 80307a0 <snmp_asn1_enc_length+0x8c>
  50859. msg_ptr = (u8_t*)p->payload;
  50860. 803074e: 685e ldr r6, [r3, #4]
  50861. 8030750: e000 b.n 8030754 <snmp_asn1_enc_length+0x40>
  50862. }
  50863. else
  50864. {
  50865. /* next octet in same pbuf */
  50866. msg_ptr++;
  50867. 8030752: 3601 adds r6, #1
  50868. }
  50869. *msg_ptr = (u8_t)length;
  50870. 8030754: 7032 strb r2, [r6, #0]
  50871. 8030756: e01c b.n 8030792 <snmp_asn1_enc_length+0x7e>
  50872. i = 2;
  50873. while (i > 0)
  50874. {
  50875. i--;
  50876. ofs += 1;
  50877. if (ofs >= plen)
  50878. 8030758: b2bf uxth r7, r7
  50879. else
  50880. {
  50881. u8_t i;
  50882. /* length >= 0x100 && length <= 0xFFFF */
  50883. *msg_ptr = 0x82;
  50884. 803075a: f04f 0c82 mov.w ip, #130 ; 0x82
  50885. i = 2;
  50886. while (i > 0)
  50887. {
  50888. i--;
  50889. ofs += 1;
  50890. if (ofs >= plen)
  50891. 803075e: 429f cmp r7, r3
  50892. else
  50893. {
  50894. u8_t i;
  50895. /* length >= 0x100 && length <= 0xFFFF */
  50896. *msg_ptr = 0x82;
  50897. 8030760: f805 c004 strb.w ip, [r5, r4]
  50898. i = 2;
  50899. while (i > 0)
  50900. {
  50901. i--;
  50902. ofs += 1;
  50903. if (ofs >= plen)
  50904. 8030764: d201 bcs.n 803076a <snmp_asn1_enc_length+0x56>
  50905. plen += p->len;
  50906. }
  50907. else
  50908. {
  50909. /* next octet in same pbuf */
  50910. msg_ptr++;
  50911. 8030766: 1c74 adds r4, r6, #1
  50912. 8030768: e006 b.n 8030778 <snmp_asn1_enc_length+0x64>
  50913. i--;
  50914. ofs += 1;
  50915. if (ofs >= plen)
  50916. {
  50917. /* next octet in next pbuf */
  50918. p = p->next;
  50919. 803076a: 6800 ldr r0, [r0, #0]
  50920. if (p == NULL) { return ERR_ARG; }
  50921. 803076c: 2800 cmp r0, #0
  50922. 803076e: d0ec beq.n 803074a <snmp_asn1_enc_length+0x36>
  50923. msg_ptr = (u8_t*)p->payload;
  50924. plen += p->len;
  50925. 8030770: 8945 ldrh r5, [r0, #10]
  50926. if (ofs >= plen)
  50927. {
  50928. /* next octet in next pbuf */
  50929. p = p->next;
  50930. if (p == NULL) { return ERR_ARG; }
  50931. msg_ptr = (u8_t*)p->payload;
  50932. 8030772: 6844 ldr r4, [r0, #4]
  50933. plen += p->len;
  50934. 8030774: 195b adds r3, r3, r5
  50935. 8030776: b29b uxth r3, r3
  50936. *msg_ptr = 0x82;
  50937. i = 2;
  50938. while (i > 0)
  50939. {
  50940. i--;
  50941. ofs += 1;
  50942. 8030778: 3102 adds r1, #2
  50943. if (ofs >= plen)
  50944. 803077a: b289 uxth r1, r1
  50945. *msg_ptr = (u8_t)length;
  50946. }
  50947. else
  50948. {
  50949. /* most significant length octet */
  50950. *msg_ptr = (u8_t)(length >> 8);
  50951. 803077c: 0a15 lsrs r5, r2, #8
  50952. i = 2;
  50953. while (i > 0)
  50954. {
  50955. i--;
  50956. ofs += 1;
  50957. if (ofs >= plen)
  50958. 803077e: 4299 cmp r1, r3
  50959. *msg_ptr = (u8_t)length;
  50960. }
  50961. else
  50962. {
  50963. /* most significant length octet */
  50964. *msg_ptr = (u8_t)(length >> 8);
  50965. 8030780: 7025 strb r5, [r4, #0]
  50966. i = 2;
  50967. while (i > 0)
  50968. {
  50969. i--;
  50970. ofs += 1;
  50971. if (ofs >= plen)
  50972. 8030782: d201 bcs.n 8030788 <snmp_asn1_enc_length+0x74>
  50973. plen += p->len;
  50974. }
  50975. else
  50976. {
  50977. /* next octet in same pbuf */
  50978. msg_ptr++;
  50979. 8030784: 3401 adds r4, #1
  50980. 8030786: e003 b.n 8030790 <snmp_asn1_enc_length+0x7c>
  50981. i--;
  50982. ofs += 1;
  50983. if (ofs >= plen)
  50984. {
  50985. /* next octet in next pbuf */
  50986. p = p->next;
  50987. 8030788: 6803 ldr r3, [r0, #0]
  50988. if (p == NULL) { return ERR_ARG; }
  50989. 803078a: 2b00 cmp r3, #0
  50990. 803078c: d0dd beq.n 803074a <snmp_asn1_enc_length+0x36>
  50991. msg_ptr = (u8_t*)p->payload;
  50992. 803078e: 685c ldr r4, [r3, #4]
  50993. msg_ptr++;
  50994. }
  50995. if (i == 0)
  50996. {
  50997. /* least significant length octet */
  50998. *msg_ptr = (u8_t)length;
  50999. 8030790: 7022 strb r2, [r4, #0]
  51000. {
  51001. /* most significant length octet */
  51002. *msg_ptr = (u8_t)(length >> 8);
  51003. }
  51004. }
  51005. return ERR_OK;
  51006. 8030792: 2000 movs r0, #0
  51007. 8030794: e004 b.n 80307a0 <snmp_asn1_enc_length+0x8c>
  51008. }
  51009. }
  51010. p = p->next;
  51011. 8030796: 6800 ldr r0, [r0, #0]
  51012. plen = 0;
  51013. while (p != NULL)
  51014. {
  51015. base = plen;
  51016. plen += p->len;
  51017. 8030798: 461c mov r4, r3
  51018. {
  51019. u16_t plen, base;
  51020. u8_t *msg_ptr;
  51021. plen = 0;
  51022. while (p != NULL)
  51023. 803079a: 2800 cmp r0, #0
  51024. 803079c: d1bd bne.n 803071a <snmp_asn1_enc_length+0x6>
  51025. 803079e: e7d4 b.n 803074a <snmp_asn1_enc_length+0x36>
  51026. }
  51027. p = p->next;
  51028. }
  51029. /* p == NULL, ofs >= plen */
  51030. return ERR_ARG;
  51031. }
  51032. 80307a0: b240 sxtb r0, r0
  51033. 80307a2: bdf0 pop {r4, r5, r6, r7, pc}
  51034. 080307a4 <snmp_asn1_enc_u32t>:
  51035. *
  51036. * @see snmp_asn1_enc_u32t_cnt()
  51037. */
  51038. err_t
  51039. snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value)
  51040. {
  51041. 80307a4: b5f0 push {r4, r5, r6, r7, lr}
  51042. u16_t plen, base;
  51043. u8_t *msg_ptr;
  51044. plen = 0;
  51045. 80307a6: 2500 movs r5, #0
  51046. while (p != NULL)
  51047. 80307a8: e037 b.n 803081a <snmp_asn1_enc_u32t+0x76>
  51048. {
  51049. base = plen;
  51050. plen += p->len;
  51051. 80307aa: 8944 ldrh r4, [r0, #10]
  51052. 80307ac: 192c adds r4, r5, r4
  51053. 80307ae: b2a4 uxth r4, r4
  51054. if (ofs < plen)
  51055. 80307b0: 42a1 cmp r1, r4
  51056. 80307b2: d230 bcs.n 8030816 <snmp_asn1_enc_u32t+0x72>
  51057. {
  51058. msg_ptr = (u8_t*)p->payload;
  51059. 80307b4: 6847 ldr r7, [r0, #4]
  51060. msg_ptr += ofs - base;
  51061. 80307b6: 1b4e subs r6, r1, r5
  51062. if (octets_needed == 5)
  51063. 80307b8: 2a05 cmp r2, #5
  51064. base = plen;
  51065. plen += p->len;
  51066. if (ofs < plen)
  51067. {
  51068. msg_ptr = (u8_t*)p->payload;
  51069. msg_ptr += ofs - base;
  51070. 80307ba: eb07 0506 add.w r5, r7, r6
  51071. if (octets_needed == 5)
  51072. 80307be: d110 bne.n 80307e2 <snmp_asn1_enc_u32t+0x3e>
  51073. {
  51074. /* not enough bits in 'value' add leading 0x00 */
  51075. octets_needed--;
  51076. *msg_ptr = 0x00;
  51077. ofs += 1;
  51078. 80307c0: 3101 adds r1, #1
  51079. 80307c2: b289 uxth r1, r1
  51080. if (octets_needed == 5)
  51081. {
  51082. /* not enough bits in 'value' add leading 0x00 */
  51083. octets_needed--;
  51084. *msg_ptr = 0x00;
  51085. 80307c4: 2200 movs r2, #0
  51086. ofs += 1;
  51087. if (ofs >= plen)
  51088. 80307c6: 42a1 cmp r1, r4
  51089. if (octets_needed == 5)
  51090. {
  51091. /* not enough bits in 'value' add leading 0x00 */
  51092. octets_needed--;
  51093. *msg_ptr = 0x00;
  51094. 80307c8: 55ba strb r2, [r7, r6]
  51095. ofs += 1;
  51096. if (ofs >= plen)
  51097. 80307ca: d308 bcc.n 80307de <snmp_asn1_enc_u32t+0x3a>
  51098. {
  51099. /* next octet in next pbuf */
  51100. p = p->next;
  51101. 80307cc: 6800 ldr r0, [r0, #0]
  51102. if (p == NULL) { return ERR_ARG; }
  51103. 80307ce: b908 cbnz r0, 80307d4 <snmp_asn1_enc_u32t+0x30>
  51104. 80307d0: 20f2 movs r0, #242 ; 0xf2
  51105. 80307d2: e025 b.n 8030820 <snmp_asn1_enc_u32t+0x7c>
  51106. msg_ptr = (u8_t*)p->payload;
  51107. plen += p->len;
  51108. 80307d4: 8942 ldrh r2, [r0, #10]
  51109. if (ofs >= plen)
  51110. {
  51111. /* next octet in next pbuf */
  51112. p = p->next;
  51113. if (p == NULL) { return ERR_ARG; }
  51114. msg_ptr = (u8_t*)p->payload;
  51115. 80307d6: 6845 ldr r5, [r0, #4]
  51116. plen += p->len;
  51117. 80307d8: 18a4 adds r4, r4, r2
  51118. 80307da: b2a4 uxth r4, r4
  51119. 80307dc: e000 b.n 80307e0 <snmp_asn1_enc_u32t+0x3c>
  51120. }
  51121. else
  51122. {
  51123. /* next octet in same pbuf */
  51124. msg_ptr++;
  51125. 80307de: 3501 adds r5, #1
  51126. msg_ptr += ofs - base;
  51127. if (octets_needed == 5)
  51128. {
  51129. /* not enough bits in 'value' add leading 0x00 */
  51130. octets_needed--;
  51131. 80307e0: 2204 movs r2, #4
  51132. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  51133. *
  51134. * @see snmp_asn1_enc_u32t_cnt()
  51135. */
  51136. err_t
  51137. snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value)
  51138. 80307e2: 1851 adds r1, r2, r1
  51139. 80307e4: e012 b.n 803080c <snmp_asn1_enc_u32t+0x68>
  51140. msg_ptr++;
  51141. }
  51142. }
  51143. while (octets_needed > 1)
  51144. {
  51145. octets_needed--;
  51146. 80307e6: 3a01 subs r2, #1
  51147. 80307e8: b292 uxth r2, r2
  51148. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  51149. 80307ea: 00d6 lsls r6, r2, #3
  51150. 80307ec: fa23 f606 lsr.w r6, r3, r6
  51151. 80307f0: 702e strb r6, [r5, #0]
  51152. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  51153. *
  51154. * @see snmp_asn1_enc_u32t_cnt()
  51155. */
  51156. err_t
  51157. snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value)
  51158. 80307f2: 1a8e subs r6, r1, r2
  51159. while (octets_needed > 1)
  51160. {
  51161. octets_needed--;
  51162. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  51163. ofs += 1;
  51164. if (ofs >= plen)
  51165. 80307f4: b2b6 uxth r6, r6
  51166. 80307f6: 42a6 cmp r6, r4
  51167. 80307f8: d307 bcc.n 803080a <snmp_asn1_enc_u32t+0x66>
  51168. {
  51169. /* next octet in next pbuf */
  51170. p = p->next;
  51171. 80307fa: 6800 ldr r0, [r0, #0]
  51172. if (p == NULL) { return ERR_ARG; }
  51173. 80307fc: 2800 cmp r0, #0
  51174. 80307fe: d0e7 beq.n 80307d0 <snmp_asn1_enc_u32t+0x2c>
  51175. msg_ptr = (u8_t*)p->payload;
  51176. plen += p->len;
  51177. 8030800: 8946 ldrh r6, [r0, #10]
  51178. if (ofs >= plen)
  51179. {
  51180. /* next octet in next pbuf */
  51181. p = p->next;
  51182. if (p == NULL) { return ERR_ARG; }
  51183. msg_ptr = (u8_t*)p->payload;
  51184. 8030802: 6845 ldr r5, [r0, #4]
  51185. plen += p->len;
  51186. 8030804: 19a4 adds r4, r4, r6
  51187. 8030806: b2a4 uxth r4, r4
  51188. 8030808: e000 b.n 803080c <snmp_asn1_enc_u32t+0x68>
  51189. }
  51190. else
  51191. {
  51192. /* next octet in same pbuf */
  51193. msg_ptr++;
  51194. 803080a: 3501 adds r5, #1
  51195. {
  51196. /* next octet in same pbuf */
  51197. msg_ptr++;
  51198. }
  51199. }
  51200. while (octets_needed > 1)
  51201. 803080c: 2a01 cmp r2, #1
  51202. 803080e: d8ea bhi.n 80307e6 <snmp_asn1_enc_u32t+0x42>
  51203. /* next octet in same pbuf */
  51204. msg_ptr++;
  51205. }
  51206. }
  51207. /* (only) one least significant octet */
  51208. *msg_ptr = (u8_t)value;
  51209. 8030810: 702b strb r3, [r5, #0]
  51210. return ERR_OK;
  51211. 8030812: 2000 movs r0, #0
  51212. 8030814: e004 b.n 8030820 <snmp_asn1_enc_u32t+0x7c>
  51213. }
  51214. p = p->next;
  51215. 8030816: 6800 ldr r0, [r0, #0]
  51216. plen = 0;
  51217. while (p != NULL)
  51218. {
  51219. base = plen;
  51220. plen += p->len;
  51221. 8030818: 4625 mov r5, r4
  51222. {
  51223. u16_t plen, base;
  51224. u8_t *msg_ptr;
  51225. plen = 0;
  51226. while (p != NULL)
  51227. 803081a: 2800 cmp r0, #0
  51228. 803081c: d1c5 bne.n 80307aa <snmp_asn1_enc_u32t+0x6>
  51229. 803081e: e7d7 b.n 80307d0 <snmp_asn1_enc_u32t+0x2c>
  51230. }
  51231. p = p->next;
  51232. }
  51233. /* p == NULL, ofs >= plen */
  51234. return ERR_ARG;
  51235. }
  51236. 8030820: b240 sxtb r0, r0
  51237. 8030822: bdf0 pop {r4, r5, r6, r7, pc}
  51238. 08030824 <snmp_asn1_enc_s32t>:
  51239. *
  51240. * @see snmp_asn1_enc_s32t_cnt()
  51241. */
  51242. err_t
  51243. snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value)
  51244. {
  51245. 8030824: b5f0 push {r4, r5, r6, r7, lr}
  51246. u16_t plen, base;
  51247. u8_t *msg_ptr;
  51248. plen = 0;
  51249. 8030826: 2600 movs r6, #0
  51250. while (p != NULL)
  51251. 8030828: e024 b.n 8030874 <snmp_asn1_enc_s32t+0x50>
  51252. {
  51253. base = plen;
  51254. plen += p->len;
  51255. 803082a: 8944 ldrh r4, [r0, #10]
  51256. 803082c: 1934 adds r4, r6, r4
  51257. 803082e: b2a4 uxth r4, r4
  51258. if (ofs < plen)
  51259. 8030830: 42a1 cmp r1, r4
  51260. 8030832: d21d bcs.n 8030870 <snmp_asn1_enc_s32t+0x4c>
  51261. {
  51262. msg_ptr = (u8_t*)p->payload;
  51263. 8030834: 6847 ldr r7, [r0, #4]
  51264. msg_ptr += ofs - base;
  51265. 8030836: 1b8d subs r5, r1, r6
  51266. 8030838: 197d adds r5, r7, r5
  51267. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  51268. *
  51269. * @see snmp_asn1_enc_s32t_cnt()
  51270. */
  51271. err_t
  51272. snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value)
  51273. 803083a: 1851 adds r1, r2, r1
  51274. if (ofs < plen)
  51275. {
  51276. msg_ptr = (u8_t*)p->payload;
  51277. msg_ptr += ofs - base;
  51278. while (octets_needed > 1)
  51279. 803083c: e013 b.n 8030866 <snmp_asn1_enc_s32t+0x42>
  51280. {
  51281. octets_needed--;
  51282. 803083e: 3a01 subs r2, #1
  51283. 8030840: b292 uxth r2, r2
  51284. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  51285. 8030842: 00d6 lsls r6, r2, #3
  51286. 8030844: fa43 f606 asr.w r6, r3, r6
  51287. 8030848: 702e strb r6, [r5, #0]
  51288. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  51289. *
  51290. * @see snmp_asn1_enc_s32t_cnt()
  51291. */
  51292. err_t
  51293. snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value)
  51294. 803084a: 1a8e subs r6, r1, r2
  51295. while (octets_needed > 1)
  51296. {
  51297. octets_needed--;
  51298. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  51299. ofs += 1;
  51300. if (ofs >= plen)
  51301. 803084c: b2b6 uxth r6, r6
  51302. 803084e: 42a6 cmp r6, r4
  51303. 8030850: d308 bcc.n 8030864 <snmp_asn1_enc_s32t+0x40>
  51304. {
  51305. /* next octet in next pbuf */
  51306. p = p->next;
  51307. 8030852: 6800 ldr r0, [r0, #0]
  51308. if (p == NULL) { return ERR_ARG; }
  51309. 8030854: b908 cbnz r0, 803085a <snmp_asn1_enc_s32t+0x36>
  51310. 8030856: 20f2 movs r0, #242 ; 0xf2
  51311. 8030858: e00f b.n 803087a <snmp_asn1_enc_s32t+0x56>
  51312. msg_ptr = (u8_t*)p->payload;
  51313. plen += p->len;
  51314. 803085a: 8946 ldrh r6, [r0, #10]
  51315. if (ofs >= plen)
  51316. {
  51317. /* next octet in next pbuf */
  51318. p = p->next;
  51319. if (p == NULL) { return ERR_ARG; }
  51320. msg_ptr = (u8_t*)p->payload;
  51321. 803085c: 6845 ldr r5, [r0, #4]
  51322. plen += p->len;
  51323. 803085e: 19a4 adds r4, r4, r6
  51324. 8030860: b2a4 uxth r4, r4
  51325. 8030862: e000 b.n 8030866 <snmp_asn1_enc_s32t+0x42>
  51326. }
  51327. else
  51328. {
  51329. /* next octet in same pbuf */
  51330. msg_ptr++;
  51331. 8030864: 3501 adds r5, #1
  51332. if (ofs < plen)
  51333. {
  51334. msg_ptr = (u8_t*)p->payload;
  51335. msg_ptr += ofs - base;
  51336. while (octets_needed > 1)
  51337. 8030866: 2a01 cmp r2, #1
  51338. 8030868: d8e9 bhi.n 803083e <snmp_asn1_enc_s32t+0x1a>
  51339. /* next octet in same pbuf */
  51340. msg_ptr++;
  51341. }
  51342. }
  51343. /* (only) one least significant octet */
  51344. *msg_ptr = (u8_t)value;
  51345. 803086a: 702b strb r3, [r5, #0]
  51346. return ERR_OK;
  51347. 803086c: 2000 movs r0, #0
  51348. 803086e: e004 b.n 803087a <snmp_asn1_enc_s32t+0x56>
  51349. }
  51350. p = p->next;
  51351. 8030870: 6800 ldr r0, [r0, #0]
  51352. plen = 0;
  51353. while (p != NULL)
  51354. {
  51355. base = plen;
  51356. plen += p->len;
  51357. 8030872: 4626 mov r6, r4
  51358. {
  51359. u16_t plen, base;
  51360. u8_t *msg_ptr;
  51361. plen = 0;
  51362. while (p != NULL)
  51363. 8030874: 2800 cmp r0, #0
  51364. 8030876: d1d8 bne.n 803082a <snmp_asn1_enc_s32t+0x6>
  51365. 8030878: e7ed b.n 8030856 <snmp_asn1_enc_s32t+0x32>
  51366. }
  51367. p = p->next;
  51368. }
  51369. /* p == NULL, ofs >= plen */
  51370. return ERR_ARG;
  51371. }
  51372. 803087a: b240 sxtb r0, r0
  51373. 803087c: bdf0 pop {r4, r5, r6, r7, pc}
  51374. 0803087e <snmp_asn1_enc_oid>:
  51375. * @param ident points to object identifier array
  51376. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  51377. */
  51378. err_t
  51379. snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident)
  51380. {
  51381. 803087e: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  51382. u16_t plen, base;
  51383. u8_t *msg_ptr;
  51384. plen = 0;
  51385. 8030882: 2500 movs r5, #0
  51386. while (p != NULL)
  51387. 8030884: e068 b.n 8030958 <snmp_asn1_enc_oid+0xda>
  51388. {
  51389. base = plen;
  51390. plen += p->len;
  51391. 8030886: 8944 ldrh r4, [r0, #10]
  51392. 8030888: 192c adds r4, r5, r4
  51393. 803088a: b2a4 uxth r4, r4
  51394. if (ofs < plen)
  51395. 803088c: 42a1 cmp r1, r4
  51396. 803088e: d261 bcs.n 8030954 <snmp_asn1_enc_oid+0xd6>
  51397. {
  51398. msg_ptr = (u8_t*)p->payload;
  51399. 8030890: 6846 ldr r6, [r0, #4]
  51400. msg_ptr += ofs - base;
  51401. 8030892: 1b4d subs r5, r1, r5
  51402. if (ident_len > 1)
  51403. 8030894: 2a01 cmp r2, #1
  51404. base = plen;
  51405. plen += p->len;
  51406. if (ofs < plen)
  51407. {
  51408. msg_ptr = (u8_t*)p->payload;
  51409. msg_ptr += ofs - base;
  51410. 8030896: eb06 0805 add.w r8, r6, r5
  51411. if (ident_len > 1)
  51412. 803089a: d801 bhi.n 80308a0 <snmp_asn1_enc_oid+0x22>
  51413. }
  51414. else
  51415. {
  51416. /* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */
  51417. /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */
  51418. return ERR_ARG;
  51419. 803089c: 20f2 movs r0, #242 ; 0xf2
  51420. 803089e: e05e b.n 803095e <snmp_asn1_enc_oid+0xe0>
  51421. msg_ptr = (u8_t*)p->payload;
  51422. msg_ptr += ofs - base;
  51423. if (ident_len > 1)
  51424. {
  51425. if ((ident[0] == 1) && (ident[1] == 3))
  51426. 80308a0: f8d3 c000 ldr.w ip, [r3]
  51427. 80308a4: f1bc 0f01 cmp.w ip, #1
  51428. 80308a8: d105 bne.n 80308b6 <snmp_asn1_enc_oid+0x38>
  51429. 80308aa: 685f ldr r7, [r3, #4]
  51430. 80308ac: 2f03 cmp r7, #3
  51431. 80308ae: d102 bne.n 80308b6 <snmp_asn1_enc_oid+0x38>
  51432. {
  51433. /* compressed (most common) prefix .iso.org */
  51434. *msg_ptr = 0x2b;
  51435. 80308b0: 272b movs r7, #43 ; 0x2b
  51436. 80308b2: 5577 strb r7, [r6, r5]
  51437. 80308b4: e006 b.n 80308c4 <snmp_asn1_enc_oid+0x46>
  51438. }
  51439. else
  51440. {
  51441. /* calculate prefix */
  51442. *msg_ptr = (u8_t)((ident[0] * 40) + ident[1]);
  51443. 80308b6: 685f ldr r7, [r3, #4]
  51444. 80308b8: f04f 0928 mov.w r9, #40 ; 0x28
  51445. 80308bc: fb09 7c0c mla ip, r9, ip, r7
  51446. 80308c0: f806 c005 strb.w ip, [r6, r5]
  51447. }
  51448. ofs += 1;
  51449. 80308c4: 3101 adds r1, #1
  51450. 80308c6: b289 uxth r1, r1
  51451. if (ofs >= plen)
  51452. 80308c8: 42a1 cmp r1, r4
  51453. 80308ca: d307 bcc.n 80308dc <snmp_asn1_enc_oid+0x5e>
  51454. {
  51455. /* next octet in next pbuf */
  51456. p = p->next;
  51457. 80308cc: 6800 ldr r0, [r0, #0]
  51458. if (p == NULL) { return ERR_ARG; }
  51459. 80308ce: 2800 cmp r0, #0
  51460. 80308d0: d0e4 beq.n 803089c <snmp_asn1_enc_oid+0x1e>
  51461. msg_ptr = (u8_t*)p->payload;
  51462. plen += p->len;
  51463. 80308d2: 8946 ldrh r6, [r0, #10]
  51464. if (ofs >= plen)
  51465. {
  51466. /* next octet in next pbuf */
  51467. p = p->next;
  51468. if (p == NULL) { return ERR_ARG; }
  51469. msg_ptr = (u8_t*)p->payload;
  51470. 80308d4: 6845 ldr r5, [r0, #4]
  51471. plen += p->len;
  51472. 80308d6: 19a4 adds r4, r4, r6
  51473. 80308d8: b2a4 uxth r4, r4
  51474. 80308da: e001 b.n 80308e0 <snmp_asn1_enc_oid+0x62>
  51475. }
  51476. else
  51477. {
  51478. /* next octet in same pbuf */
  51479. msg_ptr++;
  51480. 80308dc: f108 0501 add.w r5, r8, #1
  51481. }
  51482. ident_len -= 2;
  51483. 80308e0: 3a02 subs r2, #2
  51484. 80308e2: b2d2 uxtb r2, r2
  51485. * @param ident_len object identifier array length
  51486. * @param ident points to object identifier array
  51487. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  51488. */
  51489. err_t
  51490. snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident)
  51491. 80308e4: 3304 adds r3, #4
  51492. {
  51493. /* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */
  51494. /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */
  51495. return ERR_ARG;
  51496. }
  51497. while (ident_len > 0)
  51498. 80308e6: e031 b.n 803094c <snmp_asn1_enc_oid+0xce>
  51499. {
  51500. s32_t sub_id;
  51501. u8_t shift, tail;
  51502. ident_len--;
  51503. 80308e8: 3a01 subs r2, #1
  51504. sub_id = *ident;
  51505. 80308ea: f853 cf04 ldr.w ip, [r3, #4]!
  51506. while (ident_len > 0)
  51507. {
  51508. s32_t sub_id;
  51509. u8_t shift, tail;
  51510. ident_len--;
  51511. 80308ee: b2d2 uxtb r2, r2
  51512. sub_id = *ident;
  51513. 80308f0: 261c movs r6, #28
  51514. tail = 0;
  51515. 80308f2: 2700 movs r7, #0
  51516. shift = 28;
  51517. while(shift > 0)
  51518. {
  51519. u8_t code;
  51520. code = (u8_t)(sub_id >> shift);
  51521. 80308f4: fa4c f806 asr.w r8, ip, r6
  51522. if ((code != 0) || (tail != 0))
  51523. 80308f8: f018 0fff tst.w r8, #255 ; 0xff
  51524. 80308fc: d100 bne.n 8030900 <snmp_asn1_enc_oid+0x82>
  51525. 80308fe: b18f cbz r7, 8030924 <snmp_asn1_enc_oid+0xa6>
  51526. {
  51527. tail = 1;
  51528. *msg_ptr = code | 0x80;
  51529. ofs += 1;
  51530. 8030900: 3101 adds r1, #1
  51531. 8030902: b289 uxth r1, r1
  51532. code = (u8_t)(sub_id >> shift);
  51533. if ((code != 0) || (tail != 0))
  51534. {
  51535. tail = 1;
  51536. *msg_ptr = code | 0x80;
  51537. 8030904: f048 0880 orr.w r8, r8, #128 ; 0x80
  51538. ofs += 1;
  51539. if (ofs >= plen)
  51540. 8030908: 42a1 cmp r1, r4
  51541. code = (u8_t)(sub_id >> shift);
  51542. if ((code != 0) || (tail != 0))
  51543. {
  51544. tail = 1;
  51545. *msg_ptr = code | 0x80;
  51546. 803090a: f885 8000 strb.w r8, [r5]
  51547. ofs += 1;
  51548. if (ofs >= plen)
  51549. 803090e: d307 bcc.n 8030920 <snmp_asn1_enc_oid+0xa2>
  51550. {
  51551. /* next octet in next pbuf */
  51552. p = p->next;
  51553. 8030910: 6800 ldr r0, [r0, #0]
  51554. if (p == NULL) { return ERR_ARG; }
  51555. 8030912: 2800 cmp r0, #0
  51556. 8030914: d0c2 beq.n 803089c <snmp_asn1_enc_oid+0x1e>
  51557. msg_ptr = (u8_t*)p->payload;
  51558. plen += p->len;
  51559. 8030916: 8947 ldrh r7, [r0, #10]
  51560. if (ofs >= plen)
  51561. {
  51562. /* next octet in next pbuf */
  51563. p = p->next;
  51564. if (p == NULL) { return ERR_ARG; }
  51565. msg_ptr = (u8_t*)p->payload;
  51566. 8030918: 6845 ldr r5, [r0, #4]
  51567. plen += p->len;
  51568. 803091a: 19e4 adds r4, r4, r7
  51569. 803091c: b2a4 uxth r4, r4
  51570. 803091e: e000 b.n 8030922 <snmp_asn1_enc_oid+0xa4>
  51571. }
  51572. else
  51573. {
  51574. /* next octet in same pbuf */
  51575. msg_ptr++;
  51576. 8030920: 3501 adds r5, #1
  51577. u8_t code;
  51578. code = (u8_t)(sub_id >> shift);
  51579. if ((code != 0) || (tail != 0))
  51580. {
  51581. tail = 1;
  51582. 8030922: 2701 movs r7, #1
  51583. ident_len--;
  51584. sub_id = *ident;
  51585. tail = 0;
  51586. shift = 28;
  51587. while(shift > 0)
  51588. 8030924: 3e07 subs r6, #7
  51589. 8030926: d1e5 bne.n 80308f4 <snmp_asn1_enc_oid+0x76>
  51590. msg_ptr++;
  51591. }
  51592. }
  51593. shift -= 7;
  51594. }
  51595. *msg_ptr = (u8_t)sub_id & 0x7F;
  51596. 8030928: f00c 0c7f and.w ip, ip, #127 ; 0x7f
  51597. 803092c: f885 c000 strb.w ip, [r5]
  51598. if (ident_len > 0)
  51599. 8030930: b172 cbz r2, 8030950 <snmp_asn1_enc_oid+0xd2>
  51600. {
  51601. ofs += 1;
  51602. 8030932: 3101 adds r1, #1
  51603. 8030934: b289 uxth r1, r1
  51604. if (ofs >= plen)
  51605. 8030936: 42a1 cmp r1, r4
  51606. 8030938: d307 bcc.n 803094a <snmp_asn1_enc_oid+0xcc>
  51607. {
  51608. /* next octet in next pbuf */
  51609. p = p->next;
  51610. 803093a: 6800 ldr r0, [r0, #0]
  51611. if (p == NULL) { return ERR_ARG; }
  51612. 803093c: 2800 cmp r0, #0
  51613. 803093e: d0ad beq.n 803089c <snmp_asn1_enc_oid+0x1e>
  51614. msg_ptr = (u8_t*)p->payload;
  51615. plen += p->len;
  51616. 8030940: 8946 ldrh r6, [r0, #10]
  51617. if (ofs >= plen)
  51618. {
  51619. /* next octet in next pbuf */
  51620. p = p->next;
  51621. if (p == NULL) { return ERR_ARG; }
  51622. msg_ptr = (u8_t*)p->payload;
  51623. 8030942: 6845 ldr r5, [r0, #4]
  51624. plen += p->len;
  51625. 8030944: 19a4 adds r4, r4, r6
  51626. 8030946: b2a4 uxth r4, r4
  51627. 8030948: e000 b.n 803094c <snmp_asn1_enc_oid+0xce>
  51628. }
  51629. else
  51630. {
  51631. /* next octet in same pbuf */
  51632. msg_ptr++;
  51633. 803094a: 3501 adds r5, #1
  51634. {
  51635. /* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */
  51636. /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */
  51637. return ERR_ARG;
  51638. }
  51639. while (ident_len > 0)
  51640. 803094c: 2a00 cmp r2, #0
  51641. 803094e: d1cb bne.n 80308e8 <snmp_asn1_enc_oid+0x6a>
  51642. }
  51643. }
  51644. /* proceed to next sub-identifier */
  51645. ident++;
  51646. }
  51647. return ERR_OK;
  51648. 8030950: 2000 movs r0, #0
  51649. 8030952: e004 b.n 803095e <snmp_asn1_enc_oid+0xe0>
  51650. }
  51651. p = p->next;
  51652. 8030954: 6800 ldr r0, [r0, #0]
  51653. plen = 0;
  51654. while (p != NULL)
  51655. {
  51656. base = plen;
  51657. plen += p->len;
  51658. 8030956: 4625 mov r5, r4
  51659. {
  51660. u16_t plen, base;
  51661. u8_t *msg_ptr;
  51662. plen = 0;
  51663. while (p != NULL)
  51664. 8030958: 2800 cmp r0, #0
  51665. 803095a: d194 bne.n 8030886 <snmp_asn1_enc_oid+0x8>
  51666. 803095c: e79e b.n 803089c <snmp_asn1_enc_oid+0x1e>
  51667. }
  51668. p = p->next;
  51669. }
  51670. /* p == NULL, ofs >= plen */
  51671. return ERR_ARG;
  51672. }
  51673. 803095e: b240 sxtb r0, r0
  51674. 8030960: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  51675. 08030964 <snmp_asn1_enc_raw>:
  51676. * @param raw points raw data
  51677. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  51678. */
  51679. err_t
  51680. snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw)
  51681. {
  51682. 8030964: b5f0 push {r4, r5, r6, r7, lr}
  51683. u16_t plen, base;
  51684. u8_t *msg_ptr;
  51685. plen = 0;
  51686. 8030966: 2600 movs r6, #0
  51687. while (p != NULL)
  51688. 8030968: e025 b.n 80309b6 <snmp_asn1_enc_raw+0x52>
  51689. {
  51690. base = plen;
  51691. plen += p->len;
  51692. 803096a: 8944 ldrh r4, [r0, #10]
  51693. 803096c: 1934 adds r4, r6, r4
  51694. 803096e: b2a4 uxth r4, r4
  51695. if (ofs < plen)
  51696. 8030970: 42a1 cmp r1, r4
  51697. 8030972: d21e bcs.n 80309b2 <snmp_asn1_enc_raw+0x4e>
  51698. {
  51699. msg_ptr = (u8_t*)p->payload;
  51700. 8030974: 6847 ldr r7, [r0, #4]
  51701. msg_ptr += ofs - base;
  51702. 8030976: 1b8d subs r5, r1, r6
  51703. 8030978: 197d adds r5, r7, r5
  51704. * @param raw_len raw data length
  51705. * @param raw points raw data
  51706. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  51707. */
  51708. err_t
  51709. snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw)
  51710. 803097a: 1851 adds r1, r2, r1
  51711. if (ofs < plen)
  51712. {
  51713. msg_ptr = (u8_t*)p->payload;
  51714. msg_ptr += ofs - base;
  51715. while (raw_len > 1)
  51716. 803097c: e012 b.n 80309a4 <snmp_asn1_enc_raw+0x40>
  51717. {
  51718. /* copy raw_len - 1 octets */
  51719. raw_len--;
  51720. 803097e: 3a01 subs r2, #1
  51721. *msg_ptr = *raw;
  51722. 8030980: f813 6b01 ldrb.w r6, [r3], #1
  51723. msg_ptr += ofs - base;
  51724. while (raw_len > 1)
  51725. {
  51726. /* copy raw_len - 1 octets */
  51727. raw_len--;
  51728. 8030984: b292 uxth r2, r2
  51729. *msg_ptr = *raw;
  51730. 8030986: 702e strb r6, [r5, #0]
  51731. * @param raw_len raw data length
  51732. * @param raw points raw data
  51733. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  51734. */
  51735. err_t
  51736. snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw)
  51737. 8030988: 1a8e subs r6, r1, r2
  51738. /* copy raw_len - 1 octets */
  51739. raw_len--;
  51740. *msg_ptr = *raw;
  51741. raw++;
  51742. ofs += 1;
  51743. if (ofs >= plen)
  51744. 803098a: b2b6 uxth r6, r6
  51745. 803098c: 42a6 cmp r6, r4
  51746. 803098e: d308 bcc.n 80309a2 <snmp_asn1_enc_raw+0x3e>
  51747. {
  51748. /* next octet in next pbuf */
  51749. p = p->next;
  51750. 8030990: 6800 ldr r0, [r0, #0]
  51751. if (p == NULL) { return ERR_ARG; }
  51752. 8030992: b908 cbnz r0, 8030998 <snmp_asn1_enc_raw+0x34>
  51753. 8030994: 20f2 movs r0, #242 ; 0xf2
  51754. 8030996: e012 b.n 80309be <snmp_asn1_enc_raw+0x5a>
  51755. msg_ptr = (u8_t*)p->payload;
  51756. plen += p->len;
  51757. 8030998: 8946 ldrh r6, [r0, #10]
  51758. if (ofs >= plen)
  51759. {
  51760. /* next octet in next pbuf */
  51761. p = p->next;
  51762. if (p == NULL) { return ERR_ARG; }
  51763. msg_ptr = (u8_t*)p->payload;
  51764. 803099a: 6845 ldr r5, [r0, #4]
  51765. plen += p->len;
  51766. 803099c: 19a4 adds r4, r4, r6
  51767. 803099e: b2a4 uxth r4, r4
  51768. 80309a0: e000 b.n 80309a4 <snmp_asn1_enc_raw+0x40>
  51769. }
  51770. else
  51771. {
  51772. /* next octet in same pbuf */
  51773. msg_ptr++;
  51774. 80309a2: 3501 adds r5, #1
  51775. if (ofs < plen)
  51776. {
  51777. msg_ptr = (u8_t*)p->payload;
  51778. msg_ptr += ofs - base;
  51779. while (raw_len > 1)
  51780. 80309a4: 2a01 cmp r2, #1
  51781. 80309a6: d8ea bhi.n 803097e <snmp_asn1_enc_raw+0x1a>
  51782. {
  51783. /* next octet in same pbuf */
  51784. msg_ptr++;
  51785. }
  51786. }
  51787. if (raw_len > 0)
  51788. 80309a8: b142 cbz r2, 80309bc <snmp_asn1_enc_raw+0x58>
  51789. {
  51790. /* copy last or single octet */
  51791. *msg_ptr = *raw;
  51792. 80309aa: 781b ldrb r3, [r3, #0]
  51793. }
  51794. return ERR_OK;
  51795. 80309ac: 2000 movs r0, #0
  51796. }
  51797. }
  51798. if (raw_len > 0)
  51799. {
  51800. /* copy last or single octet */
  51801. *msg_ptr = *raw;
  51802. 80309ae: 702b strb r3, [r5, #0]
  51803. 80309b0: e005 b.n 80309be <snmp_asn1_enc_raw+0x5a>
  51804. }
  51805. return ERR_OK;
  51806. }
  51807. p = p->next;
  51808. 80309b2: 6800 ldr r0, [r0, #0]
  51809. plen = 0;
  51810. while (p != NULL)
  51811. {
  51812. base = plen;
  51813. plen += p->len;
  51814. 80309b4: 4626 mov r6, r4
  51815. {
  51816. u16_t plen, base;
  51817. u8_t *msg_ptr;
  51818. plen = 0;
  51819. while (p != NULL)
  51820. 80309b6: 2800 cmp r0, #0
  51821. 80309b8: d1d7 bne.n 803096a <snmp_asn1_enc_raw+0x6>
  51822. 80309ba: e7eb b.n 8030994 <snmp_asn1_enc_raw+0x30>
  51823. if (raw_len > 0)
  51824. {
  51825. /* copy last or single octet */
  51826. *msg_ptr = *raw;
  51827. }
  51828. return ERR_OK;
  51829. 80309bc: 4610 mov r0, r2
  51830. }
  51831. p = p->next;
  51832. }
  51833. /* p == NULL, ofs >= plen */
  51834. return ERR_ARG;
  51835. }
  51836. 80309be: b240 sxtb r0, r0
  51837. 80309c0: bdf0 pop {r4, r5, r6, r7, pc}
  51838. 080309c2 <noleafs_get_object_def>:
  51839. void
  51840. noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  51841. {
  51842. LWIP_UNUSED_ARG(ident_len);
  51843. LWIP_UNUSED_ARG(ident);
  51844. od->instance = MIB_OBJECT_NONE;
  51845. 80309c2: 2300 movs r3, #0
  51846. 80309c4: 7013 strb r3, [r2, #0]
  51847. 80309c6: 4770 bx lr
  51848. 080309c8 <noleafs_get_value>:
  51849. }
  51850. void
  51851. noleafs_get_value(struct obj_def *od, u16_t len, void *value)
  51852. {
  51853. 80309c8: 4770 bx lr
  51854. 080309ca <noleafs_set_test>:
  51855. LWIP_UNUSED_ARG(od);
  51856. LWIP_UNUSED_ARG(len);
  51857. LWIP_UNUSED_ARG(value);
  51858. /* can't set */
  51859. return 0;
  51860. }
  51861. 80309ca: 2000 movs r0, #0
  51862. 80309cc: 4770 bx lr
  51863. 080309ce <noleafs_set_value>:
  51864. void
  51865. noleafs_set_value(struct obj_def *od, u16_t len, void *value)
  51866. {
  51867. 80309ce: 4770 bx lr
  51868. 080309d0 <system_get_object_def>:
  51869. u8_t id;
  51870. /* return to object name, adding index depth (1) */
  51871. ident_len += 1;
  51872. ident -= 1;
  51873. if (ident_len == 2)
  51874. 80309d0: 2801 cmp r0, #1
  51875. 80309d2: d145 bne.n 8030a60 <system_get_object_def+0x90>
  51876. {
  51877. od->id_inst_len = ident_len;
  51878. 80309d4: 2002 movs r0, #2
  51879. {
  51880. u8_t id;
  51881. /* return to object name, adding index depth (1) */
  51882. ident_len += 1;
  51883. ident -= 1;
  51884. 80309d6: 1f0b subs r3, r1, #4
  51885. if (ident_len == 2)
  51886. {
  51887. od->id_inst_len = ident_len;
  51888. 80309d8: 7190 strb r0, [r2, #6]
  51889. od->id_inst_ptr = ident;
  51890. 80309da: 6093 str r3, [r2, #8]
  51891. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  51892. id = (u8_t)ident[0];
  51893. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def system.%"U16_F".0\n",(u16_t)id));
  51894. switch (id)
  51895. 80309dc: f811 3c04 ldrb.w r3, [r1, #-4]
  51896. 80309e0: 3b01 subs r3, #1
  51897. 80309e2: 2b06 cmp r3, #6
  51898. 80309e4: d83c bhi.n 8030a60 <system_get_object_def+0x90>
  51899. 80309e6: e8df f003 tbb [pc, r3]
  51900. 80309ea: 0b04 .short 0x0b04
  51901. 80309ec: 2a221a14 .word 0x2a221a14
  51902. 80309f0: 34 .byte 0x34
  51903. 80309f1: 00 .byte 0x00
  51904. {
  51905. case 1: /* sysDescr */
  51906. od->instance = MIB_OBJECT_SCALAR;
  51907. 80309f2: 2301 movs r3, #1
  51908. 80309f4: 7013 strb r3, [r2, #0]
  51909. od->access = MIB_OBJECT_READ_ONLY;
  51910. 80309f6: 7053 strb r3, [r2, #1]
  51911. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  51912. 80309f8: 2304 movs r3, #4
  51913. 80309fa: 7093 strb r3, [r2, #2]
  51914. od->v_len = *sysdescr_len_ptr;
  51915. 80309fc: 4b1a ldr r3, [pc, #104] ; (8030a68 <system_get_object_def+0x98>)
  51916. 80309fe: e025 b.n 8030a4c <system_get_object_def+0x7c>
  51917. break;
  51918. case 2: /* sysObjectID */
  51919. od->instance = MIB_OBJECT_SCALAR;
  51920. 8030a00: 2301 movs r3, #1
  51921. 8030a02: 7013 strb r3, [r2, #0]
  51922. od->access = MIB_OBJECT_READ_ONLY;
  51923. 8030a04: 7053 strb r3, [r2, #1]
  51924. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
  51925. 8030a06: 2306 movs r3, #6
  51926. 8030a08: 7093 strb r3, [r2, #2]
  51927. od->v_len = sysobjid.len * sizeof(s32_t);
  51928. 8030a0a: 4b18 ldr r3, [pc, #96] ; (8030a6c <system_get_object_def+0x9c>)
  51929. 8030a0c: 781b ldrb r3, [r3, #0]
  51930. 8030a0e: 009b lsls r3, r3, #2
  51931. 8030a10: e024 b.n 8030a5c <system_get_object_def+0x8c>
  51932. break;
  51933. case 3: /* sysUpTime */
  51934. od->instance = MIB_OBJECT_SCALAR;
  51935. 8030a12: 2301 movs r3, #1
  51936. 8030a14: 7013 strb r3, [r2, #0]
  51937. od->access = MIB_OBJECT_READ_ONLY;
  51938. 8030a16: 7053 strb r3, [r2, #1]
  51939. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS);
  51940. 8030a18: 2343 movs r3, #67 ; 0x43
  51941. 8030a1a: 7093 strb r3, [r2, #2]
  51942. 8030a1c: e01d b.n 8030a5a <system_get_object_def+0x8a>
  51943. od->v_len = sizeof(u32_t);
  51944. break;
  51945. case 4: /* sysContact */
  51946. od->instance = MIB_OBJECT_SCALAR;
  51947. 8030a1e: 2301 movs r3, #1
  51948. 8030a20: 7013 strb r3, [r2, #0]
  51949. od->access = MIB_OBJECT_READ_WRITE;
  51950. 8030a22: 2303 movs r3, #3
  51951. 8030a24: 7053 strb r3, [r2, #1]
  51952. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  51953. 8030a26: 2304 movs r3, #4
  51954. 8030a28: 7093 strb r3, [r2, #2]
  51955. od->v_len = *syscontact_len_ptr;
  51956. 8030a2a: 4b11 ldr r3, [pc, #68] ; (8030a70 <system_get_object_def+0xa0>)
  51957. 8030a2c: e00e b.n 8030a4c <system_get_object_def+0x7c>
  51958. break;
  51959. case 5: /* sysName */
  51960. od->instance = MIB_OBJECT_SCALAR;
  51961. 8030a2e: 2301 movs r3, #1
  51962. 8030a30: 7013 strb r3, [r2, #0]
  51963. od->access = MIB_OBJECT_READ_WRITE;
  51964. 8030a32: 2303 movs r3, #3
  51965. 8030a34: 7053 strb r3, [r2, #1]
  51966. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  51967. 8030a36: 2304 movs r3, #4
  51968. 8030a38: 7093 strb r3, [r2, #2]
  51969. od->v_len = *sysname_len_ptr;
  51970. 8030a3a: 4b0e ldr r3, [pc, #56] ; (8030a74 <system_get_object_def+0xa4>)
  51971. 8030a3c: e006 b.n 8030a4c <system_get_object_def+0x7c>
  51972. break;
  51973. case 6: /* sysLocation */
  51974. od->instance = MIB_OBJECT_SCALAR;
  51975. 8030a3e: 2301 movs r3, #1
  51976. 8030a40: 7013 strb r3, [r2, #0]
  51977. od->access = MIB_OBJECT_READ_WRITE;
  51978. 8030a42: 2303 movs r3, #3
  51979. 8030a44: 7053 strb r3, [r2, #1]
  51980. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  51981. 8030a46: 2304 movs r3, #4
  51982. 8030a48: 7093 strb r3, [r2, #2]
  51983. od->v_len = *syslocation_len_ptr;
  51984. 8030a4a: 4b0b ldr r3, [pc, #44] ; (8030a78 <system_get_object_def+0xa8>)
  51985. 8030a4c: 681b ldr r3, [r3, #0]
  51986. 8030a4e: 781b ldrb r3, [r3, #0]
  51987. 8030a50: e004 b.n 8030a5c <system_get_object_def+0x8c>
  51988. break;
  51989. case 7: /* sysServices */
  51990. od->instance = MIB_OBJECT_SCALAR;
  51991. 8030a52: 2301 movs r3, #1
  51992. 8030a54: 7013 strb r3, [r2, #0]
  51993. od->access = MIB_OBJECT_READ_ONLY;
  51994. 8030a56: 7053 strb r3, [r2, #1]
  51995. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  51996. 8030a58: 7090 strb r0, [r2, #2]
  51997. od->v_len = sizeof(s32_t);
  51998. 8030a5a: 2304 movs r3, #4
  51999. 8030a5c: 8093 strh r3, [r2, #4]
  52000. break;
  52001. 8030a5e: 4770 bx lr
  52002. };
  52003. }
  52004. else
  52005. {
  52006. LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def: no scalar\n"));
  52007. od->instance = MIB_OBJECT_NONE;
  52008. 8030a60: 2300 movs r3, #0
  52009. 8030a62: 7013 strb r3, [r2, #0]
  52010. 8030a64: 4770 bx lr
  52011. 8030a66: bf00 nop
  52012. 8030a68: 2000180c .word 0x2000180c
  52013. 8030a6c: 200016bc .word 0x200016bc
  52014. 8030a70: 20001668 .word 0x20001668
  52015. 8030a74: 20001664 .word 0x20001664
  52016. 8030a78: 20001850 .word 0x20001850
  52017. 08030a7c <interfaces_get_object_def>:
  52018. interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  52019. {
  52020. /* return to object name, adding index depth (1) */
  52021. ident_len += 1;
  52022. ident -= 1;
  52023. if (ident_len == 2)
  52024. 8030a7c: 2801 cmp r0, #1
  52025. 8030a7e: d109 bne.n 8030a94 <interfaces_get_object_def+0x18>
  52026. {
  52027. od->id_inst_len = ident_len;
  52028. 8030a80: 2302 movs r3, #2
  52029. 8030a82: 7193 strb r3, [r2, #6]
  52030. static void
  52031. interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  52032. {
  52033. /* return to object name, adding index depth (1) */
  52034. ident_len += 1;
  52035. ident -= 1;
  52036. 8030a84: 3904 subs r1, #4
  52037. od->id_inst_len = ident_len;
  52038. od->id_inst_ptr = ident;
  52039. od->instance = MIB_OBJECT_SCALAR;
  52040. od->access = MIB_OBJECT_READ_ONLY;
  52041. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  52042. 8030a86: 7093 strb r3, [r2, #2]
  52043. od->v_len = sizeof(s32_t);
  52044. 8030a88: 2304 movs r3, #4
  52045. ident_len += 1;
  52046. ident -= 1;
  52047. if (ident_len == 2)
  52048. {
  52049. od->id_inst_len = ident_len;
  52050. od->id_inst_ptr = ident;
  52051. 8030a8a: 6091 str r1, [r2, #8]
  52052. od->instance = MIB_OBJECT_SCALAR;
  52053. 8030a8c: 7010 strb r0, [r2, #0]
  52054. od->access = MIB_OBJECT_READ_ONLY;
  52055. 8030a8e: 7050 strb r0, [r2, #1]
  52056. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  52057. od->v_len = sizeof(s32_t);
  52058. 8030a90: 8093 strh r3, [r2, #4]
  52059. 8030a92: 4770 bx lr
  52060. }
  52061. else
  52062. {
  52063. LWIP_DEBUGF(SNMP_MIB_DEBUG,("interfaces_get_object_def: no scalar\n"));
  52064. od->instance = MIB_OBJECT_NONE;
  52065. 8030a94: 2300 movs r3, #0
  52066. 8030a96: 7013 strb r3, [r2, #0]
  52067. 8030a98: 4770 bx lr
  52068. 8030a9a: 0000 movs r0, r0
  52069. 08030a9c <interfaces_get_value>:
  52070. */
  52071. static void
  52072. interfaces_get_value(struct obj_def *od, u16_t len, void *value)
  52073. {
  52074. LWIP_UNUSED_ARG(len);
  52075. if (od->id_inst_ptr[0] == 1)
  52076. 8030a9c: 6883 ldr r3, [r0, #8]
  52077. 8030a9e: 681b ldr r3, [r3, #0]
  52078. 8030aa0: 2b01 cmp r3, #1
  52079. 8030aa2: d102 bne.n 8030aaa <interfaces_get_value+0xe>
  52080. {
  52081. s32_t *sint_ptr = (s32_t*)value;
  52082. *sint_ptr = iflist_root.count;
  52083. 8030aa4: 4b01 ldr r3, [pc, #4] ; (8030aac <interfaces_get_value+0x10>)
  52084. 8030aa6: 8b9b ldrh r3, [r3, #28]
  52085. 8030aa8: 6013 str r3, [r2, #0]
  52086. 8030aaa: 4770 bx lr
  52087. 8030aac: 2000169c .word 0x2000169c
  52088. 08030ab0 <ip_get_value>:
  52089. {
  52090. u8_t id;
  52091. LWIP_UNUSED_ARG(len);
  52092. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  52093. id = (u8_t)od->id_inst_ptr[0];
  52094. 8030ab0: 6883 ldr r3, [r0, #8]
  52095. switch (id)
  52096. 8030ab2: 781b ldrb r3, [r3, #0]
  52097. 8030ab4: 3b01 subs r3, #1
  52098. 8030ab6: 2b16 cmp r3, #22
  52099. 8030ab8: d836 bhi.n 8030b28 <ip_get_value+0x78>
  52100. 8030aba: e8df f003 tbb [pc, r3]
  52101. 8030abe: 0e0c .short 0x0e0c
  52102. 8030ac0: 16141210 .word 0x16141210
  52103. 8030ac4: 1e1c1a18 .word 0x1e1c1a18
  52104. 8030ac8: 26242220 .word 0x26242220
  52105. 8030acc: 2e2c2a28 .word 0x2e2c2a28
  52106. 8030ad0: 35353530 .word 0x35353530
  52107. 8030ad4: 32 .byte 0x32
  52108. 8030ad5: 00 .byte 0x00
  52109. #if IP_FORWARD
  52110. /* forwarding */
  52111. *sint_ptr = 1;
  52112. #else
  52113. /* not-forwarding */
  52114. *sint_ptr = 2;
  52115. 8030ad6: 2302 movs r3, #2
  52116. 8030ad8: e025 b.n 8030b26 <ip_get_value+0x76>
  52117. }
  52118. break;
  52119. case 2: /* ipDefaultTTL */
  52120. {
  52121. s32_t *sint_ptr = (s32_t*)value;
  52122. *sint_ptr = IP_DEFAULT_TTL;
  52123. 8030ada: 23ff movs r3, #255 ; 0xff
  52124. 8030adc: e023 b.n 8030b26 <ip_get_value+0x76>
  52125. }
  52126. break;
  52127. case 3: /* ipInReceives */
  52128. {
  52129. u32_t *uint_ptr = (u32_t*)value;
  52130. *uint_ptr = ipinreceives;
  52131. 8030ade: 4b13 ldr r3, [pc, #76] ; (8030b2c <ip_get_value+0x7c>)
  52132. 8030ae0: e020 b.n 8030b24 <ip_get_value+0x74>
  52133. }
  52134. break;
  52135. case 4: /* ipInHdrErrors */
  52136. {
  52137. u32_t *uint_ptr = (u32_t*)value;
  52138. *uint_ptr = ipinhdrerrors;
  52139. 8030ae2: 4b13 ldr r3, [pc, #76] ; (8030b30 <ip_get_value+0x80>)
  52140. 8030ae4: e01e b.n 8030b24 <ip_get_value+0x74>
  52141. }
  52142. break;
  52143. case 5: /* ipInAddrErrors */
  52144. {
  52145. u32_t *uint_ptr = (u32_t*)value;
  52146. *uint_ptr = ipinaddrerrors;
  52147. 8030ae6: 4b13 ldr r3, [pc, #76] ; (8030b34 <ip_get_value+0x84>)
  52148. 8030ae8: e01c b.n 8030b24 <ip_get_value+0x74>
  52149. }
  52150. break;
  52151. case 6: /* ipForwDatagrams */
  52152. {
  52153. u32_t *uint_ptr = (u32_t*)value;
  52154. *uint_ptr = ipforwdatagrams;
  52155. 8030aea: 4b13 ldr r3, [pc, #76] ; (8030b38 <ip_get_value+0x88>)
  52156. 8030aec: e01a b.n 8030b24 <ip_get_value+0x74>
  52157. }
  52158. break;
  52159. case 7: /* ipInUnknownProtos */
  52160. {
  52161. u32_t *uint_ptr = (u32_t*)value;
  52162. *uint_ptr = ipinunknownprotos;
  52163. 8030aee: 4b13 ldr r3, [pc, #76] ; (8030b3c <ip_get_value+0x8c>)
  52164. 8030af0: e018 b.n 8030b24 <ip_get_value+0x74>
  52165. }
  52166. break;
  52167. case 8: /* ipInDiscards */
  52168. {
  52169. u32_t *uint_ptr = (u32_t*)value;
  52170. *uint_ptr = ipindiscards;
  52171. 8030af2: 4b13 ldr r3, [pc, #76] ; (8030b40 <ip_get_value+0x90>)
  52172. 8030af4: e016 b.n 8030b24 <ip_get_value+0x74>
  52173. }
  52174. break;
  52175. case 9: /* ipInDelivers */
  52176. {
  52177. u32_t *uint_ptr = (u32_t*)value;
  52178. *uint_ptr = ipindelivers;
  52179. 8030af6: 4b13 ldr r3, [pc, #76] ; (8030b44 <ip_get_value+0x94>)
  52180. 8030af8: e014 b.n 8030b24 <ip_get_value+0x74>
  52181. }
  52182. break;
  52183. case 10: /* ipOutRequests */
  52184. {
  52185. u32_t *uint_ptr = (u32_t*)value;
  52186. *uint_ptr = ipoutrequests;
  52187. 8030afa: 4b13 ldr r3, [pc, #76] ; (8030b48 <ip_get_value+0x98>)
  52188. 8030afc: e012 b.n 8030b24 <ip_get_value+0x74>
  52189. }
  52190. break;
  52191. case 11: /* ipOutDiscards */
  52192. {
  52193. u32_t *uint_ptr = (u32_t*)value;
  52194. *uint_ptr = ipoutdiscards;
  52195. 8030afe: 4b13 ldr r3, [pc, #76] ; (8030b4c <ip_get_value+0x9c>)
  52196. 8030b00: e010 b.n 8030b24 <ip_get_value+0x74>
  52197. }
  52198. break;
  52199. case 12: /* ipOutNoRoutes */
  52200. {
  52201. u32_t *uint_ptr = (u32_t*)value;
  52202. *uint_ptr = ipoutnoroutes;
  52203. 8030b02: 4b13 ldr r3, [pc, #76] ; (8030b50 <ip_get_value+0xa0>)
  52204. 8030b04: e00e b.n 8030b24 <ip_get_value+0x74>
  52205. {
  52206. s32_t *sint_ptr = (s32_t*)value;
  52207. #if IP_REASSEMBLY
  52208. *sint_ptr = IP_REASS_MAXAGE;
  52209. #else
  52210. *sint_ptr = 0;
  52211. 8030b06: 2300 movs r3, #0
  52212. 8030b08: e00d b.n 8030b26 <ip_get_value+0x76>
  52213. }
  52214. break;
  52215. case 14: /* ipReasmReqds */
  52216. {
  52217. u32_t *uint_ptr = (u32_t*)value;
  52218. *uint_ptr = ipreasmreqds;
  52219. 8030b0a: 4b12 ldr r3, [pc, #72] ; (8030b54 <ip_get_value+0xa4>)
  52220. 8030b0c: e00a b.n 8030b24 <ip_get_value+0x74>
  52221. }
  52222. break;
  52223. case 15: /* ipReasmOKs */
  52224. {
  52225. u32_t *uint_ptr = (u32_t*)value;
  52226. *uint_ptr = ipreasmoks;
  52227. 8030b0e: 4b12 ldr r3, [pc, #72] ; (8030b58 <ip_get_value+0xa8>)
  52228. 8030b10: e008 b.n 8030b24 <ip_get_value+0x74>
  52229. }
  52230. break;
  52231. case 16: /* ipReasmFails */
  52232. {
  52233. u32_t *uint_ptr = (u32_t*)value;
  52234. *uint_ptr = ipreasmfails;
  52235. 8030b12: 4b12 ldr r3, [pc, #72] ; (8030b5c <ip_get_value+0xac>)
  52236. 8030b14: e006 b.n 8030b24 <ip_get_value+0x74>
  52237. }
  52238. break;
  52239. case 17: /* ipFragOKs */
  52240. {
  52241. u32_t *uint_ptr = (u32_t*)value;
  52242. *uint_ptr = ipfragoks;
  52243. 8030b16: 4b12 ldr r3, [pc, #72] ; (8030b60 <ip_get_value+0xb0>)
  52244. 8030b18: e004 b.n 8030b24 <ip_get_value+0x74>
  52245. }
  52246. break;
  52247. case 18: /* ipFragFails */
  52248. {
  52249. u32_t *uint_ptr = (u32_t*)value;
  52250. *uint_ptr = ipfragfails;
  52251. 8030b1a: 4b12 ldr r3, [pc, #72] ; (8030b64 <ip_get_value+0xb4>)
  52252. 8030b1c: e002 b.n 8030b24 <ip_get_value+0x74>
  52253. }
  52254. break;
  52255. case 19: /* ipFragCreates */
  52256. {
  52257. u32_t *uint_ptr = (u32_t*)value;
  52258. *uint_ptr = ipfragcreates;
  52259. 8030b1e: 4b12 ldr r3, [pc, #72] ; (8030b68 <ip_get_value+0xb8>)
  52260. 8030b20: e000 b.n 8030b24 <ip_get_value+0x74>
  52261. break;
  52262. case 23: /* ipRoutingDiscards */
  52263. /** @todo can lwIP discard routes at all?? hardwire this to 0?? */
  52264. {
  52265. u32_t *uint_ptr = (u32_t*)value;
  52266. *uint_ptr = iproutingdiscards;
  52267. 8030b22: 4b12 ldr r3, [pc, #72] ; (8030b6c <ip_get_value+0xbc>)
  52268. 8030b24: 681b ldr r3, [r3, #0]
  52269. 8030b26: 6013 str r3, [r2, #0]
  52270. 8030b28: 4770 bx lr
  52271. 8030b2a: bf00 nop
  52272. 8030b2c: 2000e1e4 .word 0x2000e1e4
  52273. 8030b30: 2000e16c .word 0x2000e16c
  52274. 8030b34: 2000e150 .word 0x2000e150
  52275. 8030b38: 2000e26c .word 0x2000e26c
  52276. 8030b3c: 2000e1ac .word 0x2000e1ac
  52277. 8030b40: 2000e238 .word 0x2000e238
  52278. 8030b44: 2000e270 .word 0x2000e270
  52279. 8030b48: 2000e258 .word 0x2000e258
  52280. 8030b4c: 2000e1fc .word 0x2000e1fc
  52281. 8030b50: 2000e27c .word 0x2000e27c
  52282. 8030b54: 2000e1cc .word 0x2000e1cc
  52283. 8030b58: 2000e178 .word 0x2000e178
  52284. 8030b5c: 2000e22c .word 0x2000e22c
  52285. 8030b60: 2000e13c .word 0x2000e13c
  52286. 8030b64: 2000e1a8 .word 0x2000e1a8
  52287. 8030b68: 2000e248 .word 0x2000e248
  52288. 8030b6c: 2000e234 .word 0x2000e234
  52289. 08030b70 <ip_set_test>:
  52290. s32_t *sint_ptr = (s32_t*)value;
  52291. LWIP_UNUSED_ARG(len);
  52292. set_ok = 0;
  52293. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  52294. id = (u8_t)od->id_inst_ptr[0];
  52295. 8030b70: 6883 ldr r3, [r0, #8]
  52296. switch (id)
  52297. 8030b72: 781b ldrb r3, [r3, #0]
  52298. 8030b74: 2b01 cmp r3, #1
  52299. 8030b76: d002 beq.n 8030b7e <ip_set_test+0xe>
  52300. 8030b78: 2b02 cmp r3, #2
  52301. 8030b7a: d109 bne.n 8030b90 <ip_set_test+0x20>
  52302. 8030b7c: e002 b.n 8030b84 <ip_set_test+0x14>
  52303. #if IP_FORWARD
  52304. /* forwarding */
  52305. if (*sint_ptr == 1)
  52306. #else
  52307. /* not-forwarding */
  52308. if (*sint_ptr == 2)
  52309. 8030b7e: 6810 ldr r0, [r2, #0]
  52310. {
  52311. u8_t id, set_ok;
  52312. s32_t *sint_ptr = (s32_t*)value;
  52313. LWIP_UNUSED_ARG(len);
  52314. set_ok = 0;
  52315. 8030b80: 2802 cmp r0, #2
  52316. 8030b82: e001 b.n 8030b88 <ip_set_test+0x18>
  52317. {
  52318. set_ok = 1;
  52319. }
  52320. break;
  52321. case 2: /* ipDefaultTTL */
  52322. if (*sint_ptr == IP_DEFAULT_TTL)
  52323. 8030b84: 6810 ldr r0, [r2, #0]
  52324. {
  52325. u8_t id, set_ok;
  52326. s32_t *sint_ptr = (s32_t*)value;
  52327. LWIP_UNUSED_ARG(len);
  52328. set_ok = 0;
  52329. 8030b86: 28ff cmp r0, #255 ; 0xff
  52330. 8030b88: bf14 ite ne
  52331. 8030b8a: 2000 movne r0, #0
  52332. 8030b8c: 2001 moveq r0, #1
  52333. 8030b8e: 4770 bx lr
  52334. 8030b90: 2000 movs r0, #0
  52335. set_ok = 1;
  52336. }
  52337. break;
  52338. };
  52339. return set_ok;
  52340. }
  52341. 8030b92: 4770 bx lr
  52342. 08030b94 <ip_rteentry_get_object_def>:
  52343. /* return to object name, adding index depth (4) */
  52344. ident_len += 4;
  52345. ident -= 4;
  52346. if (ident_len == 5)
  52347. 8030b94: 2801 cmp r0, #1
  52348. 8030b96: d12c bne.n 8030bf2 <ip_rteentry_get_object_def+0x5e>
  52349. {
  52350. od->id_inst_len = ident_len;
  52351. 8030b98: 2305 movs r3, #5
  52352. 8030b9a: 7193 strb r3, [r2, #6]
  52353. {
  52354. u8_t id;
  52355. /* return to object name, adding index depth (4) */
  52356. ident_len += 4;
  52357. ident -= 4;
  52358. 8030b9c: f1a1 0310 sub.w r3, r1, #16
  52359. if (ident_len == 5)
  52360. {
  52361. od->id_inst_len = ident_len;
  52362. od->id_inst_ptr = ident;
  52363. 8030ba0: 6093 str r3, [r2, #8]
  52364. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  52365. id = (u8_t)ident[0];
  52366. switch (id)
  52367. 8030ba2: f811 3c10 ldrb.w r3, [r1, #-16]
  52368. 8030ba6: 3b01 subs r3, #1
  52369. 8030ba8: 2b0c cmp r3, #12
  52370. 8030baa: d822 bhi.n 8030bf2 <ip_rteentry_get_object_def+0x5e>
  52371. 8030bac: e8df f003 tbb [pc, r3]
  52372. 8030bb0: 0d0d0d07 .word 0x0d0d0d07
  52373. 8030bb4: 0d070d0d .word 0x0d070d0d
  52374. 8030bb8: 0d070d11 .word 0x0d070d11
  52375. 8030bbc: 18 .byte 0x18
  52376. 8030bbd: 00 .byte 0x00
  52377. {
  52378. case 1: /* ipRouteDest */
  52379. case 7: /* ipRouteNextHop */
  52380. case 11: /* ipRouteMask */
  52381. od->instance = MIB_OBJECT_TAB;
  52382. 8030bbe: 2302 movs r3, #2
  52383. 8030bc0: 7013 strb r3, [r2, #0]
  52384. od->access = MIB_OBJECT_READ_WRITE;
  52385. 8030bc2: 2303 movs r3, #3
  52386. 8030bc4: 7053 strb r3, [r2, #1]
  52387. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  52388. 8030bc6: 2340 movs r3, #64 ; 0x40
  52389. 8030bc8: e007 b.n 8030bda <ip_rteentry_get_object_def+0x46>
  52390. case 5: /* ipRouteMetric3 */
  52391. case 6: /* ipRouteMetric4 */
  52392. case 8: /* ipRouteType */
  52393. case 10: /* ipRouteAge */
  52394. case 12: /* ipRouteMetric5 */
  52395. od->instance = MIB_OBJECT_TAB;
  52396. 8030bca: 2302 movs r3, #2
  52397. 8030bcc: 7013 strb r3, [r2, #0]
  52398. od->access = MIB_OBJECT_READ_WRITE;
  52399. 8030bce: 2103 movs r1, #3
  52400. 8030bd0: e002 b.n 8030bd8 <ip_rteentry_get_object_def+0x44>
  52401. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  52402. od->v_len = sizeof(s32_t);
  52403. break;
  52404. case 9: /* ipRouteProto */
  52405. od->instance = MIB_OBJECT_TAB;
  52406. 8030bd2: 2302 movs r3, #2
  52407. 8030bd4: 7013 strb r3, [r2, #0]
  52408. od->access = MIB_OBJECT_READ_ONLY;
  52409. 8030bd6: 2101 movs r1, #1
  52410. 8030bd8: 7051 strb r1, [r2, #1]
  52411. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  52412. 8030bda: 7093 strb r3, [r2, #2]
  52413. od->v_len = sizeof(s32_t);
  52414. 8030bdc: 2304 movs r3, #4
  52415. 8030bde: e006 b.n 8030bee <ip_rteentry_get_object_def+0x5a>
  52416. break;
  52417. case 13: /* ipRouteInfo */
  52418. /** @note returning zeroDotZero (0.0) no routing protocol specific MIB */
  52419. od->instance = MIB_OBJECT_TAB;
  52420. 8030be0: 2302 movs r3, #2
  52421. 8030be2: 7013 strb r3, [r2, #0]
  52422. od->access = MIB_OBJECT_READ_ONLY;
  52423. 8030be4: 2301 movs r3, #1
  52424. 8030be6: 7053 strb r3, [r2, #1]
  52425. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
  52426. 8030be8: 2306 movs r3, #6
  52427. 8030bea: 7093 strb r3, [r2, #2]
  52428. od->v_len = iprouteinfo.len * sizeof(s32_t);
  52429. 8030bec: 2308 movs r3, #8
  52430. 8030bee: 8093 strh r3, [r2, #4]
  52431. break;
  52432. 8030bf0: 4770 bx lr
  52433. }
  52434. }
  52435. else
  52436. {
  52437. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_rteentry_get_object_def: no scalar\n"));
  52438. od->instance = MIB_OBJECT_NONE;
  52439. 8030bf2: 2300 movs r3, #0
  52440. 8030bf4: 7013 strb r3, [r2, #0]
  52441. 8030bf6: 4770 bx lr
  52442. 08030bf8 <icmp_get_object_def>:
  52443. icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  52444. {
  52445. /* return to object name, adding index depth (1) */
  52446. ident_len += 1;
  52447. ident -= 1;
  52448. if ((ident_len == 2) &&
  52449. 8030bf8: 2801 cmp r0, #1
  52450. 8030bfa: d110 bne.n 8030c1e <icmp_get_object_def+0x26>
  52451. (ident[0] > 0) && (ident[0] < 27))
  52452. 8030bfc: f851 3c04 ldr.w r3, [r1, #-4]
  52453. icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  52454. {
  52455. /* return to object name, adding index depth (1) */
  52456. ident_len += 1;
  52457. ident -= 1;
  52458. if ((ident_len == 2) &&
  52459. 8030c00: 2b00 cmp r3, #0
  52460. 8030c02: dd0c ble.n 8030c1e <icmp_get_object_def+0x26>
  52461. (ident[0] > 0) && (ident[0] < 27))
  52462. 8030c04: 2b1a cmp r3, #26
  52463. 8030c06: dc0a bgt.n 8030c1e <icmp_get_object_def+0x26>
  52464. {
  52465. od->id_inst_len = ident_len;
  52466. 8030c08: 2302 movs r3, #2
  52467. 8030c0a: 7193 strb r3, [r2, #6]
  52468. od->id_inst_ptr = ident;
  52469. od->instance = MIB_OBJECT_SCALAR;
  52470. od->access = MIB_OBJECT_READ_ONLY;
  52471. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  52472. 8030c0c: 2341 movs r3, #65 ; 0x41
  52473. static void
  52474. icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  52475. {
  52476. /* return to object name, adding index depth (1) */
  52477. ident_len += 1;
  52478. ident -= 1;
  52479. 8030c0e: 3904 subs r1, #4
  52480. od->id_inst_len = ident_len;
  52481. od->id_inst_ptr = ident;
  52482. od->instance = MIB_OBJECT_SCALAR;
  52483. od->access = MIB_OBJECT_READ_ONLY;
  52484. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  52485. 8030c10: 7093 strb r3, [r2, #2]
  52486. od->v_len = sizeof(u32_t);
  52487. 8030c12: 2304 movs r3, #4
  52488. ident -= 1;
  52489. if ((ident_len == 2) &&
  52490. (ident[0] > 0) && (ident[0] < 27))
  52491. {
  52492. od->id_inst_len = ident_len;
  52493. od->id_inst_ptr = ident;
  52494. 8030c14: 6091 str r1, [r2, #8]
  52495. od->instance = MIB_OBJECT_SCALAR;
  52496. 8030c16: 7010 strb r0, [r2, #0]
  52497. od->access = MIB_OBJECT_READ_ONLY;
  52498. 8030c18: 7050 strb r0, [r2, #1]
  52499. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  52500. od->v_len = sizeof(u32_t);
  52501. 8030c1a: 8093 strh r3, [r2, #4]
  52502. 8030c1c: 4770 bx lr
  52503. }
  52504. else
  52505. {
  52506. LWIP_DEBUGF(SNMP_MIB_DEBUG,("icmp_get_object_def: no scalar\n"));
  52507. od->instance = MIB_OBJECT_NONE;
  52508. 8030c1e: 2300 movs r3, #0
  52509. 8030c20: 7013 strb r3, [r2, #0]
  52510. 8030c22: 4770 bx lr
  52511. 08030c24 <icmp_get_value>:
  52512. u32_t *uint_ptr = (u32_t*)value;
  52513. u8_t id;
  52514. LWIP_UNUSED_ARG(len);
  52515. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  52516. id = (u8_t)od->id_inst_ptr[0];
  52517. 8030c24: 6883 ldr r3, [r0, #8]
  52518. switch (id)
  52519. 8030c26: 781b ldrb r3, [r3, #0]
  52520. 8030c28: 3b01 subs r3, #1
  52521. 8030c2a: 2b19 cmp r3, #25
  52522. 8030c2c: d843 bhi.n 8030cb6 <icmp_get_value+0x92>
  52523. 8030c2e: e8df f003 tbb [pc, r3]
  52524. 8030c32: 0f0d .short 0x0f0d
  52525. 8030c34: 17151311 .word 0x17151311
  52526. 8030c38: 1f1d1b19 .word 0x1f1d1b19
  52527. 8030c3c: 27252321 .word 0x27252321
  52528. 8030c40: 2f2d2b29 .word 0x2f2d2b29
  52529. 8030c44: 37353331 .word 0x37353331
  52530. 8030c48: 3f3d3b39 .word 0x3f3d3b39
  52531. {
  52532. case 1: /* icmpInMsgs */
  52533. *uint_ptr = icmpinmsgs;
  52534. 8030c4c: 4b1a ldr r3, [pc, #104] ; (8030cb8 <icmp_get_value+0x94>)
  52535. 8030c4e: e030 b.n 8030cb2 <icmp_get_value+0x8e>
  52536. break;
  52537. case 2: /* icmpInErrors */
  52538. *uint_ptr = icmpinerrors;
  52539. 8030c50: 4b1a ldr r3, [pc, #104] ; (8030cbc <icmp_get_value+0x98>)
  52540. 8030c52: e02e b.n 8030cb2 <icmp_get_value+0x8e>
  52541. break;
  52542. case 3: /* icmpInDestUnreachs */
  52543. *uint_ptr = icmpindestunreachs;
  52544. 8030c54: 4b1a ldr r3, [pc, #104] ; (8030cc0 <icmp_get_value+0x9c>)
  52545. 8030c56: e02c b.n 8030cb2 <icmp_get_value+0x8e>
  52546. break;
  52547. case 4: /* icmpInTimeExcds */
  52548. *uint_ptr = icmpintimeexcds;
  52549. 8030c58: 4b1a ldr r3, [pc, #104] ; (8030cc4 <icmp_get_value+0xa0>)
  52550. 8030c5a: e02a b.n 8030cb2 <icmp_get_value+0x8e>
  52551. break;
  52552. case 5: /* icmpInParmProbs */
  52553. *uint_ptr = icmpinparmprobs;
  52554. 8030c5c: 4b1a ldr r3, [pc, #104] ; (8030cc8 <icmp_get_value+0xa4>)
  52555. 8030c5e: e028 b.n 8030cb2 <icmp_get_value+0x8e>
  52556. break;
  52557. case 6: /* icmpInSrcQuenchs */
  52558. *uint_ptr = icmpinsrcquenchs;
  52559. 8030c60: 4b1a ldr r3, [pc, #104] ; (8030ccc <icmp_get_value+0xa8>)
  52560. 8030c62: e026 b.n 8030cb2 <icmp_get_value+0x8e>
  52561. break;
  52562. case 7: /* icmpInRedirects */
  52563. *uint_ptr = icmpinredirects;
  52564. 8030c64: 4b1a ldr r3, [pc, #104] ; (8030cd0 <icmp_get_value+0xac>)
  52565. 8030c66: e024 b.n 8030cb2 <icmp_get_value+0x8e>
  52566. break;
  52567. case 8: /* icmpInEchos */
  52568. *uint_ptr = icmpinechos;
  52569. 8030c68: 4b1a ldr r3, [pc, #104] ; (8030cd4 <icmp_get_value+0xb0>)
  52570. 8030c6a: e022 b.n 8030cb2 <icmp_get_value+0x8e>
  52571. break;
  52572. case 9: /* icmpInEchoReps */
  52573. *uint_ptr = icmpinechoreps;
  52574. 8030c6c: 4b1a ldr r3, [pc, #104] ; (8030cd8 <icmp_get_value+0xb4>)
  52575. 8030c6e: e020 b.n 8030cb2 <icmp_get_value+0x8e>
  52576. break;
  52577. case 10: /* icmpInTimestamps */
  52578. *uint_ptr = icmpintimestamps;
  52579. 8030c70: 4b1a ldr r3, [pc, #104] ; (8030cdc <icmp_get_value+0xb8>)
  52580. 8030c72: e01e b.n 8030cb2 <icmp_get_value+0x8e>
  52581. break;
  52582. case 11: /* icmpInTimestampReps */
  52583. *uint_ptr = icmpintimestampreps;
  52584. 8030c74: 4b1a ldr r3, [pc, #104] ; (8030ce0 <icmp_get_value+0xbc>)
  52585. 8030c76: e01c b.n 8030cb2 <icmp_get_value+0x8e>
  52586. break;
  52587. case 12: /* icmpInAddrMasks */
  52588. *uint_ptr = icmpinaddrmasks;
  52589. 8030c78: 4b1a ldr r3, [pc, #104] ; (8030ce4 <icmp_get_value+0xc0>)
  52590. 8030c7a: e01a b.n 8030cb2 <icmp_get_value+0x8e>
  52591. break;
  52592. case 13: /* icmpInAddrMaskReps */
  52593. *uint_ptr = icmpinaddrmaskreps;
  52594. 8030c7c: 4b1a ldr r3, [pc, #104] ; (8030ce8 <icmp_get_value+0xc4>)
  52595. 8030c7e: e018 b.n 8030cb2 <icmp_get_value+0x8e>
  52596. break;
  52597. case 14: /* icmpOutMsgs */
  52598. *uint_ptr = icmpoutmsgs;
  52599. 8030c80: 4b1a ldr r3, [pc, #104] ; (8030cec <icmp_get_value+0xc8>)
  52600. 8030c82: e016 b.n 8030cb2 <icmp_get_value+0x8e>
  52601. break;
  52602. case 15: /* icmpOutErrors */
  52603. *uint_ptr = icmpouterrors;
  52604. 8030c84: 4b1a ldr r3, [pc, #104] ; (8030cf0 <icmp_get_value+0xcc>)
  52605. 8030c86: e014 b.n 8030cb2 <icmp_get_value+0x8e>
  52606. break;
  52607. case 16: /* icmpOutDestUnreachs */
  52608. *uint_ptr = icmpoutdestunreachs;
  52609. 8030c88: 4b1a ldr r3, [pc, #104] ; (8030cf4 <icmp_get_value+0xd0>)
  52610. 8030c8a: e012 b.n 8030cb2 <icmp_get_value+0x8e>
  52611. break;
  52612. case 17: /* icmpOutTimeExcds */
  52613. *uint_ptr = icmpouttimeexcds;
  52614. 8030c8c: 4b1a ldr r3, [pc, #104] ; (8030cf8 <icmp_get_value+0xd4>)
  52615. 8030c8e: e010 b.n 8030cb2 <icmp_get_value+0x8e>
  52616. break;
  52617. case 18: /* icmpOutParmProbs */
  52618. *uint_ptr = icmpoutparmprobs;
  52619. 8030c90: 4b1a ldr r3, [pc, #104] ; (8030cfc <icmp_get_value+0xd8>)
  52620. 8030c92: e00e b.n 8030cb2 <icmp_get_value+0x8e>
  52621. break;
  52622. case 19: /* icmpOutSrcQuenchs */
  52623. *uint_ptr = icmpoutsrcquenchs;
  52624. 8030c94: 4b1a ldr r3, [pc, #104] ; (8030d00 <icmp_get_value+0xdc>)
  52625. 8030c96: e00c b.n 8030cb2 <icmp_get_value+0x8e>
  52626. break;
  52627. case 20: /* icmpOutRedirects */
  52628. *uint_ptr = icmpoutredirects;
  52629. 8030c98: 4b1a ldr r3, [pc, #104] ; (8030d04 <icmp_get_value+0xe0>)
  52630. 8030c9a: e00a b.n 8030cb2 <icmp_get_value+0x8e>
  52631. break;
  52632. case 21: /* icmpOutEchos */
  52633. *uint_ptr = icmpoutechos;
  52634. 8030c9c: 4b1a ldr r3, [pc, #104] ; (8030d08 <icmp_get_value+0xe4>)
  52635. 8030c9e: e008 b.n 8030cb2 <icmp_get_value+0x8e>
  52636. break;
  52637. case 22: /* icmpOutEchoReps */
  52638. *uint_ptr = icmpoutechoreps;
  52639. 8030ca0: 4b1a ldr r3, [pc, #104] ; (8030d0c <icmp_get_value+0xe8>)
  52640. 8030ca2: e006 b.n 8030cb2 <icmp_get_value+0x8e>
  52641. break;
  52642. case 23: /* icmpOutTimestamps */
  52643. *uint_ptr = icmpouttimestamps;
  52644. 8030ca4: 4b1a ldr r3, [pc, #104] ; (8030d10 <icmp_get_value+0xec>)
  52645. 8030ca6: e004 b.n 8030cb2 <icmp_get_value+0x8e>
  52646. break;
  52647. case 24: /* icmpOutTimestampReps */
  52648. *uint_ptr = icmpouttimestampreps;
  52649. 8030ca8: 4b1a ldr r3, [pc, #104] ; (8030d14 <icmp_get_value+0xf0>)
  52650. 8030caa: e002 b.n 8030cb2 <icmp_get_value+0x8e>
  52651. break;
  52652. case 25: /* icmpOutAddrMasks */
  52653. *uint_ptr = icmpoutaddrmasks;
  52654. 8030cac: 4b1a ldr r3, [pc, #104] ; (8030d18 <icmp_get_value+0xf4>)
  52655. 8030cae: e000 b.n 8030cb2 <icmp_get_value+0x8e>
  52656. break;
  52657. case 26: /* icmpOutAddrMaskReps */
  52658. *uint_ptr = icmpoutaddrmaskreps;
  52659. 8030cb0: 4b1a ldr r3, [pc, #104] ; (8030d1c <icmp_get_value+0xf8>)
  52660. 8030cb2: 681b ldr r3, [r3, #0]
  52661. 8030cb4: 6013 str r3, [r2, #0]
  52662. 8030cb6: 4770 bx lr
  52663. 8030cb8: 2000e174 .word 0x2000e174
  52664. 8030cbc: 2000e170 .word 0x2000e170
  52665. 8030cc0: 2000e14c .word 0x2000e14c
  52666. 8030cc4: 2000e230 .word 0x2000e230
  52667. 8030cc8: 2000e264 .word 0x2000e264
  52668. 8030ccc: 2000e15c .word 0x2000e15c
  52669. 8030cd0: 2000e188 .word 0x2000e188
  52670. 8030cd4: 2000e228 .word 0x2000e228
  52671. 8030cd8: 2000e1a0 .word 0x2000e1a0
  52672. 8030cdc: 2000e190 .word 0x2000e190
  52673. 8030ce0: 2000e1d0 .word 0x2000e1d0
  52674. 8030ce4: 2000e268 .word 0x2000e268
  52675. 8030ce8: 2000e204 .word 0x2000e204
  52676. 8030cec: 2000e1f4 .word 0x2000e1f4
  52677. 8030cf0: 2000e278 .word 0x2000e278
  52678. 8030cf4: 2000e20c .word 0x2000e20c
  52679. 8030cf8: 2000e1c0 .word 0x2000e1c0
  52680. 8030cfc: 2000e184 .word 0x2000e184
  52681. 8030d00: 2000e1d8 .word 0x2000e1d8
  52682. 8030d04: 2000e194 .word 0x2000e194
  52683. 8030d08: 2000e274 .word 0x2000e274
  52684. 8030d0c: 2000e214 .word 0x2000e214
  52685. 8030d10: 2000e1e0 .word 0x2000e1e0
  52686. 8030d14: 2000e1c4 .word 0x2000e1c4
  52687. 8030d18: 2000e18c .word 0x2000e18c
  52688. 8030d1c: 2000e1ec .word 0x2000e1ec
  52689. 08030d20 <tcp_get_value>:
  52690. s32_t *sint_ptr = (s32_t*)value;
  52691. u8_t id;
  52692. LWIP_UNUSED_ARG(len);
  52693. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  52694. id = (u8_t)od->id_inst_ptr[0];
  52695. 8030d20: 6883 ldr r3, [r0, #8]
  52696. switch (id)
  52697. 8030d22: 781b ldrb r3, [r3, #0]
  52698. 8030d24: 3b01 subs r3, #1
  52699. 8030d26: 2b0e cmp r3, #14
  52700. 8030d28: d836 bhi.n 8030d98 <tcp_get_value+0x78>
  52701. 8030d2a: e8df f003 tbb [pc, r3]
  52702. 8030d2e: 0a08 .short 0x0a08
  52703. 8030d30: 1412100d .word 0x1412100d
  52704. 8030d34: 2a1a1816 .word 0x2a1a1816
  52705. 8030d38: 30352e2c .word 0x30352e2c
  52706. 8030d3c: 32 .byte 0x32
  52707. 8030d3d: 00 .byte 0x00
  52708. {
  52709. case 1: /* tcpRtoAlgorithm, vanj(4) */
  52710. *sint_ptr = 4;
  52711. 8030d3e: 2304 movs r3, #4
  52712. 8030d40: e029 b.n 8030d96 <tcp_get_value+0x76>
  52713. break;
  52714. case 2: /* tcpRtoMin */
  52715. /* @todo not the actual value, a guess,
  52716. needs to be calculated */
  52717. *sint_ptr = 1000;
  52718. 8030d42: f44f 737a mov.w r3, #1000 ; 0x3e8
  52719. 8030d46: e026 b.n 8030d96 <tcp_get_value+0x76>
  52720. break;
  52721. case 3: /* tcpRtoMax */
  52722. /* @todo not the actual value, a guess,
  52723. needs to be calculated */
  52724. *sint_ptr = 60000;
  52725. 8030d48: f64e 2360 movw r3, #60000 ; 0xea60
  52726. 8030d4c: e023 b.n 8030d96 <tcp_get_value+0x76>
  52727. break;
  52728. case 4: /* tcpMaxConn */
  52729. *sint_ptr = MEMP_NUM_TCP_PCB;
  52730. 8030d4e: 230c movs r3, #12
  52731. 8030d50: e021 b.n 8030d96 <tcp_get_value+0x76>
  52732. break;
  52733. case 5: /* tcpActiveOpens */
  52734. *uint_ptr = tcpactiveopens;
  52735. 8030d52: 4b12 ldr r3, [pc, #72] ; (8030d9c <tcp_get_value+0x7c>)
  52736. 8030d54: e01e b.n 8030d94 <tcp_get_value+0x74>
  52737. break;
  52738. case 6: /* tcpPassiveOpens */
  52739. *uint_ptr = tcppassiveopens;
  52740. 8030d56: 4b12 ldr r3, [pc, #72] ; (8030da0 <tcp_get_value+0x80>)
  52741. 8030d58: e01c b.n 8030d94 <tcp_get_value+0x74>
  52742. break;
  52743. case 7: /* tcpAttemptFails */
  52744. *uint_ptr = tcpattemptfails;
  52745. 8030d5a: 4b12 ldr r3, [pc, #72] ; (8030da4 <tcp_get_value+0x84>)
  52746. 8030d5c: e01a b.n 8030d94 <tcp_get_value+0x74>
  52747. break;
  52748. case 8: /* tcpEstabResets */
  52749. *uint_ptr = tcpestabresets;
  52750. 8030d5e: 4b12 ldr r3, [pc, #72] ; (8030da8 <tcp_get_value+0x88>)
  52751. 8030d60: e018 b.n 8030d94 <tcp_get_value+0x74>
  52752. break;
  52753. case 9: /* tcpCurrEstab */
  52754. {
  52755. u16_t tcpcurrestab = 0;
  52756. struct tcp_pcb *pcb = tcp_active_pcbs;
  52757. 8030d62: 4b12 ldr r3, [pc, #72] ; (8030dac <tcp_get_value+0x8c>)
  52758. case 8: /* tcpEstabResets */
  52759. *uint_ptr = tcpestabresets;
  52760. break;
  52761. case 9: /* tcpCurrEstab */
  52762. {
  52763. u16_t tcpcurrestab = 0;
  52764. 8030d64: 2100 movs r1, #0
  52765. struct tcp_pcb *pcb = tcp_active_pcbs;
  52766. 8030d66: 681b ldr r3, [r3, #0]
  52767. while (pcb != NULL)
  52768. 8030d68: e007 b.n 8030d7a <tcp_get_value+0x5a>
  52769. {
  52770. if ((pcb->state == ESTABLISHED) ||
  52771. 8030d6a: 7e18 ldrb r0, [r3, #24]
  52772. 8030d6c: 2804 cmp r0, #4
  52773. 8030d6e: d001 beq.n 8030d74 <tcp_get_value+0x54>
  52774. 8030d70: 2807 cmp r0, #7
  52775. 8030d72: d101 bne.n 8030d78 <tcp_get_value+0x58>
  52776. (pcb->state == CLOSE_WAIT))
  52777. {
  52778. tcpcurrestab++;
  52779. 8030d74: 3101 adds r1, #1
  52780. 8030d76: b289 uxth r1, r1
  52781. }
  52782. pcb = pcb->next;
  52783. 8030d78: 68db ldr r3, [r3, #12]
  52784. break;
  52785. case 9: /* tcpCurrEstab */
  52786. {
  52787. u16_t tcpcurrestab = 0;
  52788. struct tcp_pcb *pcb = tcp_active_pcbs;
  52789. while (pcb != NULL)
  52790. 8030d7a: 2b00 cmp r3, #0
  52791. 8030d7c: d1f5 bne.n 8030d6a <tcp_get_value+0x4a>
  52792. {
  52793. tcpcurrestab++;
  52794. }
  52795. pcb = pcb->next;
  52796. }
  52797. *uint_ptr = tcpcurrestab;
  52798. 8030d7e: 6011 str r1, [r2, #0]
  52799. }
  52800. break;
  52801. 8030d80: 4770 bx lr
  52802. case 10: /* tcpInSegs */
  52803. *uint_ptr = tcpinsegs;
  52804. 8030d82: 4b0b ldr r3, [pc, #44] ; (8030db0 <tcp_get_value+0x90>)
  52805. 8030d84: e006 b.n 8030d94 <tcp_get_value+0x74>
  52806. break;
  52807. case 11: /* tcpOutSegs */
  52808. *uint_ptr = tcpoutsegs;
  52809. 8030d86: 4b0b ldr r3, [pc, #44] ; (8030db4 <tcp_get_value+0x94>)
  52810. 8030d88: e004 b.n 8030d94 <tcp_get_value+0x74>
  52811. break;
  52812. case 12: /* tcpRetransSegs */
  52813. *uint_ptr = tcpretranssegs;
  52814. 8030d8a: 4b0b ldr r3, [pc, #44] ; (8030db8 <tcp_get_value+0x98>)
  52815. 8030d8c: e002 b.n 8030d94 <tcp_get_value+0x74>
  52816. break;
  52817. case 14: /* tcpInErrs */
  52818. *uint_ptr = tcpinerrs;
  52819. 8030d8e: 4b0b ldr r3, [pc, #44] ; (8030dbc <tcp_get_value+0x9c>)
  52820. 8030d90: e000 b.n 8030d94 <tcp_get_value+0x74>
  52821. break;
  52822. case 15: /* tcpOutRsts */
  52823. *uint_ptr = tcpoutrsts;
  52824. 8030d92: 4b0b ldr r3, [pc, #44] ; (8030dc0 <tcp_get_value+0xa0>)
  52825. 8030d94: 681b ldr r3, [r3, #0]
  52826. 8030d96: 6013 str r3, [r2, #0]
  52827. 8030d98: 4770 bx lr
  52828. 8030d9a: bf00 nop
  52829. 8030d9c: 2000e168 .word 0x2000e168
  52830. 8030da0: 2000e19c .word 0x2000e19c
  52831. 8030da4: 2000e1e8 .word 0x2000e1e8
  52832. 8030da8: 2000e17c .word 0x2000e17c
  52833. 8030dac: 20010fdc .word 0x20010fdc
  52834. 8030db0: 2000e1f8 .word 0x2000e1f8
  52835. 8030db4: 2000e244 .word 0x2000e244
  52836. 8030db8: 2000e218 .word 0x2000e218
  52837. 8030dbc: 2000e1a4 .word 0x2000e1a4
  52838. 8030dc0: 2000e208 .word 0x2000e208
  52839. 08030dc4 <udp_get_object_def>:
  52840. udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  52841. {
  52842. /* return to object name, adding index depth (1) */
  52843. ident_len += 1;
  52844. ident -= 1;
  52845. if ((ident_len == 2) &&
  52846. 8030dc4: 2801 cmp r0, #1
  52847. 8030dc6: d110 bne.n 8030dea <udp_get_object_def+0x26>
  52848. (ident[0] > 0) && (ident[0] < 6))
  52849. 8030dc8: f851 3c04 ldr.w r3, [r1, #-4]
  52850. udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  52851. {
  52852. /* return to object name, adding index depth (1) */
  52853. ident_len += 1;
  52854. ident -= 1;
  52855. if ((ident_len == 2) &&
  52856. 8030dcc: 2b00 cmp r3, #0
  52857. 8030dce: dd0c ble.n 8030dea <udp_get_object_def+0x26>
  52858. (ident[0] > 0) && (ident[0] < 6))
  52859. 8030dd0: 2b05 cmp r3, #5
  52860. 8030dd2: dc0a bgt.n 8030dea <udp_get_object_def+0x26>
  52861. {
  52862. od->id_inst_len = ident_len;
  52863. 8030dd4: 2302 movs r3, #2
  52864. 8030dd6: 7193 strb r3, [r2, #6]
  52865. od->id_inst_ptr = ident;
  52866. od->instance = MIB_OBJECT_SCALAR;
  52867. od->access = MIB_OBJECT_READ_ONLY;
  52868. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  52869. 8030dd8: 2341 movs r3, #65 ; 0x41
  52870. static void
  52871. udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  52872. {
  52873. /* return to object name, adding index depth (1) */
  52874. ident_len += 1;
  52875. ident -= 1;
  52876. 8030dda: 3904 subs r1, #4
  52877. od->id_inst_len = ident_len;
  52878. od->id_inst_ptr = ident;
  52879. od->instance = MIB_OBJECT_SCALAR;
  52880. od->access = MIB_OBJECT_READ_ONLY;
  52881. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  52882. 8030ddc: 7093 strb r3, [r2, #2]
  52883. od->v_len = sizeof(u32_t);
  52884. 8030dde: 2304 movs r3, #4
  52885. ident -= 1;
  52886. if ((ident_len == 2) &&
  52887. (ident[0] > 0) && (ident[0] < 6))
  52888. {
  52889. od->id_inst_len = ident_len;
  52890. od->id_inst_ptr = ident;
  52891. 8030de0: 6091 str r1, [r2, #8]
  52892. od->instance = MIB_OBJECT_SCALAR;
  52893. 8030de2: 7010 strb r0, [r2, #0]
  52894. od->access = MIB_OBJECT_READ_ONLY;
  52895. 8030de4: 7050 strb r0, [r2, #1]
  52896. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  52897. od->v_len = sizeof(u32_t);
  52898. 8030de6: 8093 strh r3, [r2, #4]
  52899. 8030de8: 4770 bx lr
  52900. }
  52901. else
  52902. {
  52903. LWIP_DEBUGF(SNMP_MIB_DEBUG,("udp_get_object_def: no scalar\n"));
  52904. od->instance = MIB_OBJECT_NONE;
  52905. 8030dea: 2300 movs r3, #0
  52906. 8030dec: 7013 strb r3, [r2, #0]
  52907. 8030dee: 4770 bx lr
  52908. 08030df0 <udp_get_value>:
  52909. u32_t *uint_ptr = (u32_t*)value;
  52910. u8_t id;
  52911. LWIP_UNUSED_ARG(len);
  52912. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  52913. id = (u8_t)od->id_inst_ptr[0];
  52914. 8030df0: 6883 ldr r3, [r0, #8]
  52915. switch (id)
  52916. 8030df2: 781b ldrb r3, [r3, #0]
  52917. 8030df4: 3b01 subs r3, #1
  52918. 8030df6: 2b03 cmp r3, #3
  52919. 8030df8: d80c bhi.n 8030e14 <udp_get_value+0x24>
  52920. 8030dfa: e8df f003 tbb [pc, r3]
  52921. 8030dfe: 0402 .short 0x0402
  52922. 8030e00: 0806 .short 0x0806
  52923. {
  52924. case 1: /* udpInDatagrams */
  52925. *uint_ptr = udpindatagrams;
  52926. 8030e02: 4b05 ldr r3, [pc, #20] ; (8030e18 <udp_get_value+0x28>)
  52927. 8030e04: e004 b.n 8030e10 <udp_get_value+0x20>
  52928. break;
  52929. case 2: /* udpNoPorts */
  52930. *uint_ptr = udpnoports;
  52931. 8030e06: 4b05 ldr r3, [pc, #20] ; (8030e1c <udp_get_value+0x2c>)
  52932. 8030e08: e002 b.n 8030e10 <udp_get_value+0x20>
  52933. break;
  52934. case 3: /* udpInErrors */
  52935. *uint_ptr = udpinerrors;
  52936. 8030e0a: 4b05 ldr r3, [pc, #20] ; (8030e20 <udp_get_value+0x30>)
  52937. 8030e0c: e000 b.n 8030e10 <udp_get_value+0x20>
  52938. break;
  52939. case 4: /* udpOutDatagrams */
  52940. *uint_ptr = udpoutdatagrams;
  52941. 8030e0e: 4b05 ldr r3, [pc, #20] ; (8030e24 <udp_get_value+0x34>)
  52942. 8030e10: 681b ldr r3, [r3, #0]
  52943. 8030e12: 6013 str r3, [r2, #0]
  52944. 8030e14: 4770 bx lr
  52945. 8030e16: bf00 nop
  52946. 8030e18: 2000e224 .word 0x2000e224
  52947. 8030e1c: 2000e1dc .word 0x2000e1dc
  52948. 8030e20: 2000e24c .word 0x2000e24c
  52949. 8030e24: 2000e1d4 .word 0x2000e1d4
  52950. 08030e28 <snmp_get_value>:
  52951. u32_t *uint_ptr = (u32_t*)value;
  52952. u8_t id;
  52953. LWIP_UNUSED_ARG(len);
  52954. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  52955. id = (u8_t)od->id_inst_ptr[0];
  52956. 8030e28: 6883 ldr r3, [r0, #8]
  52957. switch (id)
  52958. 8030e2a: 781b ldrb r3, [r3, #0]
  52959. 8030e2c: 3b01 subs r3, #1
  52960. 8030e2e: 2b1d cmp r3, #29
  52961. 8030e30: d84b bhi.n 8030eca <snmp_get_value+0xa2>
  52962. 8030e32: e8df f003 tbb [pc, r3]
  52963. 8030e36: 110f .short 0x110f
  52964. 8030e38: 19171513 .word 0x19171513
  52965. 8030e3c: 1f1d1b4a .word 0x1f1d1b4a
  52966. 8030e40: 27252321 .word 0x27252321
  52967. 8030e44: 2f2d2b29 .word 0x2f2d2b29
  52968. 8030e48: 37353331 .word 0x37353331
  52969. 8030e4c: 3d3b394a .word 0x3d3b394a
  52970. 8030e50: 4643413f .word 0x4643413f
  52971. {
  52972. case 1: /* snmpInPkts */
  52973. *uint_ptr = snmpinpkts;
  52974. 8030e54: 4b1d ldr r3, [pc, #116] ; (8030ecc <snmp_get_value+0xa4>)
  52975. 8030e56: e032 b.n 8030ebe <snmp_get_value+0x96>
  52976. break;
  52977. case 2: /* snmpOutPkts */
  52978. *uint_ptr = snmpoutpkts;
  52979. 8030e58: 4b1d ldr r3, [pc, #116] ; (8030ed0 <snmp_get_value+0xa8>)
  52980. 8030e5a: e030 b.n 8030ebe <snmp_get_value+0x96>
  52981. break;
  52982. case 3: /* snmpInBadVersions */
  52983. *uint_ptr = snmpinbadversions;
  52984. 8030e5c: 4b1d ldr r3, [pc, #116] ; (8030ed4 <snmp_get_value+0xac>)
  52985. 8030e5e: e02e b.n 8030ebe <snmp_get_value+0x96>
  52986. break;
  52987. case 4: /* snmpInBadCommunityNames */
  52988. *uint_ptr = snmpinbadcommunitynames;
  52989. 8030e60: 4b1d ldr r3, [pc, #116] ; (8030ed8 <snmp_get_value+0xb0>)
  52990. 8030e62: e02c b.n 8030ebe <snmp_get_value+0x96>
  52991. break;
  52992. case 5: /* snmpInBadCommunityUses */
  52993. *uint_ptr = snmpinbadcommunityuses;
  52994. 8030e64: 4b1d ldr r3, [pc, #116] ; (8030edc <snmp_get_value+0xb4>)
  52995. 8030e66: e02a b.n 8030ebe <snmp_get_value+0x96>
  52996. break;
  52997. case 6: /* snmpInASNParseErrs */
  52998. *uint_ptr = snmpinasnparseerrs;
  52999. 8030e68: 4b1d ldr r3, [pc, #116] ; (8030ee0 <snmp_get_value+0xb8>)
  53000. 8030e6a: e028 b.n 8030ebe <snmp_get_value+0x96>
  53001. break;
  53002. case 8: /* snmpInTooBigs */
  53003. *uint_ptr = snmpintoobigs;
  53004. 8030e6c: 4b1d ldr r3, [pc, #116] ; (8030ee4 <snmp_get_value+0xbc>)
  53005. 8030e6e: e026 b.n 8030ebe <snmp_get_value+0x96>
  53006. break;
  53007. case 9: /* snmpInNoSuchNames */
  53008. *uint_ptr = snmpinnosuchnames;
  53009. 8030e70: 4b1d ldr r3, [pc, #116] ; (8030ee8 <snmp_get_value+0xc0>)
  53010. 8030e72: e024 b.n 8030ebe <snmp_get_value+0x96>
  53011. break;
  53012. case 10: /* snmpInBadValues */
  53013. *uint_ptr = snmpinbadvalues;
  53014. 8030e74: 4b1d ldr r3, [pc, #116] ; (8030eec <snmp_get_value+0xc4>)
  53015. 8030e76: e022 b.n 8030ebe <snmp_get_value+0x96>
  53016. break;
  53017. case 11: /* snmpInReadOnlys */
  53018. *uint_ptr = snmpinreadonlys;
  53019. 8030e78: 4b1d ldr r3, [pc, #116] ; (8030ef0 <snmp_get_value+0xc8>)
  53020. 8030e7a: e020 b.n 8030ebe <snmp_get_value+0x96>
  53021. break;
  53022. case 12: /* snmpInGenErrs */
  53023. *uint_ptr = snmpingenerrs;
  53024. 8030e7c: 4b1d ldr r3, [pc, #116] ; (8030ef4 <snmp_get_value+0xcc>)
  53025. 8030e7e: e01e b.n 8030ebe <snmp_get_value+0x96>
  53026. break;
  53027. case 13: /* snmpInTotalReqVars */
  53028. *uint_ptr = snmpintotalreqvars;
  53029. 8030e80: 4b1d ldr r3, [pc, #116] ; (8030ef8 <snmp_get_value+0xd0>)
  53030. 8030e82: e01c b.n 8030ebe <snmp_get_value+0x96>
  53031. break;
  53032. case 14: /* snmpInTotalSetVars */
  53033. *uint_ptr = snmpintotalsetvars;
  53034. 8030e84: 4b1d ldr r3, [pc, #116] ; (8030efc <snmp_get_value+0xd4>)
  53035. 8030e86: e01a b.n 8030ebe <snmp_get_value+0x96>
  53036. break;
  53037. case 15: /* snmpInGetRequests */
  53038. *uint_ptr = snmpingetrequests;
  53039. 8030e88: 4b1d ldr r3, [pc, #116] ; (8030f00 <snmp_get_value+0xd8>)
  53040. 8030e8a: e018 b.n 8030ebe <snmp_get_value+0x96>
  53041. break;
  53042. case 16: /* snmpInGetNexts */
  53043. *uint_ptr = snmpingetnexts;
  53044. 8030e8c: 4b1d ldr r3, [pc, #116] ; (8030f04 <snmp_get_value+0xdc>)
  53045. 8030e8e: e016 b.n 8030ebe <snmp_get_value+0x96>
  53046. break;
  53047. case 17: /* snmpInSetRequests */
  53048. *uint_ptr = snmpinsetrequests;
  53049. 8030e90: 4b1d ldr r3, [pc, #116] ; (8030f08 <snmp_get_value+0xe0>)
  53050. 8030e92: e014 b.n 8030ebe <snmp_get_value+0x96>
  53051. break;
  53052. case 18: /* snmpInGetResponses */
  53053. *uint_ptr = snmpingetresponses;
  53054. 8030e94: 4b1d ldr r3, [pc, #116] ; (8030f0c <snmp_get_value+0xe4>)
  53055. 8030e96: e012 b.n 8030ebe <snmp_get_value+0x96>
  53056. break;
  53057. case 19: /* snmpInTraps */
  53058. *uint_ptr = snmpintraps;
  53059. 8030e98: 4b1d ldr r3, [pc, #116] ; (8030f10 <snmp_get_value+0xe8>)
  53060. 8030e9a: e010 b.n 8030ebe <snmp_get_value+0x96>
  53061. break;
  53062. case 20: /* snmpOutTooBigs */
  53063. *uint_ptr = snmpouttoobigs;
  53064. 8030e9c: 4b1d ldr r3, [pc, #116] ; (8030f14 <snmp_get_value+0xec>)
  53065. 8030e9e: e00e b.n 8030ebe <snmp_get_value+0x96>
  53066. break;
  53067. case 21: /* snmpOutNoSuchNames */
  53068. *uint_ptr = snmpoutnosuchnames;
  53069. 8030ea0: 4b1d ldr r3, [pc, #116] ; (8030f18 <snmp_get_value+0xf0>)
  53070. 8030ea2: e00c b.n 8030ebe <snmp_get_value+0x96>
  53071. break;
  53072. case 22: /* snmpOutBadValues */
  53073. *uint_ptr = snmpoutbadvalues;
  53074. 8030ea4: 4b1d ldr r3, [pc, #116] ; (8030f1c <snmp_get_value+0xf4>)
  53075. 8030ea6: e00a b.n 8030ebe <snmp_get_value+0x96>
  53076. break;
  53077. case 24: /* snmpOutGenErrs */
  53078. *uint_ptr = snmpoutgenerrs;
  53079. 8030ea8: 4b1d ldr r3, [pc, #116] ; (8030f20 <snmp_get_value+0xf8>)
  53080. 8030eaa: e008 b.n 8030ebe <snmp_get_value+0x96>
  53081. break;
  53082. case 25: /* snmpOutGetRequests */
  53083. *uint_ptr = snmpoutgetrequests;
  53084. 8030eac: 4b1d ldr r3, [pc, #116] ; (8030f24 <snmp_get_value+0xfc>)
  53085. 8030eae: e006 b.n 8030ebe <snmp_get_value+0x96>
  53086. break;
  53087. case 26: /* snmpOutGetNexts */
  53088. *uint_ptr = snmpoutgetnexts;
  53089. 8030eb0: 4b1d ldr r3, [pc, #116] ; (8030f28 <snmp_get_value+0x100>)
  53090. 8030eb2: e004 b.n 8030ebe <snmp_get_value+0x96>
  53091. break;
  53092. case 27: /* snmpOutSetRequests */
  53093. *uint_ptr = snmpoutsetrequests;
  53094. 8030eb4: 4b1d ldr r3, [pc, #116] ; (8030f2c <snmp_get_value+0x104>)
  53095. 8030eb6: e002 b.n 8030ebe <snmp_get_value+0x96>
  53096. break;
  53097. case 28: /* snmpOutGetResponses */
  53098. *uint_ptr = snmpoutgetresponses;
  53099. 8030eb8: 4b1d ldr r3, [pc, #116] ; (8030f30 <snmp_get_value+0x108>)
  53100. 8030eba: e000 b.n 8030ebe <snmp_get_value+0x96>
  53101. break;
  53102. case 29: /* snmpOutTraps */
  53103. *uint_ptr = snmpouttraps;
  53104. 8030ebc: 4b1d ldr r3, [pc, #116] ; (8030f34 <snmp_get_value+0x10c>)
  53105. 8030ebe: 681b ldr r3, [r3, #0]
  53106. 8030ec0: e002 b.n 8030ec8 <snmp_get_value+0xa0>
  53107. break;
  53108. case 30: /* snmpEnableAuthenTraps */
  53109. *uint_ptr = *snmpenableauthentraps_ptr;
  53110. 8030ec2: 4b1d ldr r3, [pc, #116] ; (8030f38 <snmp_get_value+0x110>)
  53111. 8030ec4: 681b ldr r3, [r3, #0]
  53112. 8030ec6: 781b ldrb r3, [r3, #0]
  53113. 8030ec8: 6013 str r3, [r2, #0]
  53114. 8030eca: 4770 bx lr
  53115. 8030ecc: 2000e180 .word 0x2000e180
  53116. 8030ed0: 2000e250 .word 0x2000e250
  53117. 8030ed4: 2000e23c .word 0x2000e23c
  53118. 8030ed8: 2000e154 .word 0x2000e154
  53119. 8030edc: 2000e158 .word 0x2000e158
  53120. 8030ee0: 2000e240 .word 0x2000e240
  53121. 8030ee4: 2000e200 .word 0x2000e200
  53122. 8030ee8: 2000e280 .word 0x2000e280
  53123. 8030eec: 2000e21c .word 0x2000e21c
  53124. 8030ef0: 2000e1f0 .word 0x2000e1f0
  53125. 8030ef4: 2000e1c8 .word 0x2000e1c8
  53126. 8030ef8: 2000e220 .word 0x2000e220
  53127. 8030efc: 2000e160 .word 0x2000e160
  53128. 8030f00: 2000e1b4 .word 0x2000e1b4
  53129. 8030f04: 2000e138 .word 0x2000e138
  53130. 8030f08: 2000e25c .word 0x2000e25c
  53131. 8030f0c: 2000e1b0 .word 0x2000e1b0
  53132. 8030f10: 2000e148 .word 0x2000e148
  53133. 8030f14: 2000e198 .word 0x2000e198
  53134. 8030f18: 2000e164 .word 0x2000e164
  53135. 8030f1c: 2000e144 .word 0x2000e144
  53136. 8030f20: 2000e284 .word 0x2000e284
  53137. 8030f24: 2000e1bc .word 0x2000e1bc
  53138. 8030f28: 2000e254 .word 0x2000e254
  53139. 8030f2c: 2000e260 .word 0x2000e260
  53140. 8030f30: 2000e140 .word 0x2000e140
  53141. 8030f34: 2000e1b8 .word 0x2000e1b8
  53142. 8030f38: 20001768 .word 0x20001768
  53143. 08030f3c <snmp_set_value>:
  53144. {
  53145. u8_t id;
  53146. LWIP_UNUSED_ARG(len);
  53147. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  53148. id = (u8_t)od->id_inst_ptr[0];
  53149. 8030f3c: 6883 ldr r3, [r0, #8]
  53150. if (id == 30)
  53151. 8030f3e: 781b ldrb r3, [r3, #0]
  53152. 8030f40: 2b1e cmp r3, #30
  53153. 8030f42: d103 bne.n 8030f4c <snmp_set_value+0x10>
  53154. {
  53155. /* snmpEnableAuthenTraps */
  53156. /* @todo @fixme: which kind of pointer is 'value'? s32_t or u8_t??? */
  53157. u8_t *ptr = (u8_t*)value;
  53158. *snmpenableauthentraps_ptr = *ptr;
  53159. 8030f44: 4b02 ldr r3, [pc, #8] ; (8030f50 <snmp_set_value+0x14>)
  53160. 8030f46: 7812 ldrb r2, [r2, #0]
  53161. 8030f48: 681b ldr r3, [r3, #0]
  53162. 8030f4a: 701a strb r2, [r3, #0]
  53163. 8030f4c: 4770 bx lr
  53164. 8030f4e: bf00 nop
  53165. 8030f50: 20001768 .word 0x20001768
  53166. 08030f54 <ifentry_get_object_def>:
  53167. u8_t id;
  53168. /* return to object name, adding index depth (1) */
  53169. ident_len += 1;
  53170. ident -= 1;
  53171. if (ident_len == 2)
  53172. 8030f54: 2801 cmp r0, #1
  53173. * @param ident points to objectname.index
  53174. * @param od points to object definition.
  53175. */
  53176. static void
  53177. ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  53178. {
  53179. 8030f56: b513 push {r0, r1, r4, lr}
  53180. 8030f58: 4614 mov r4, r2
  53181. u8_t id;
  53182. /* return to object name, adding index depth (1) */
  53183. ident_len += 1;
  53184. ident -= 1;
  53185. if (ident_len == 2)
  53186. 8030f5a: d149 bne.n 8030ff0 <ifentry_get_object_def+0x9c>
  53187. {
  53188. od->id_inst_len = ident_len;
  53189. 8030f5c: 2302 movs r3, #2
  53190. 8030f5e: 7193 strb r3, [r2, #6]
  53191. {
  53192. u8_t id;
  53193. /* return to object name, adding index depth (1) */
  53194. ident_len += 1;
  53195. ident -= 1;
  53196. 8030f60: 1f0a subs r2, r1, #4
  53197. if (ident_len == 2)
  53198. {
  53199. od->id_inst_len = ident_len;
  53200. od->id_inst_ptr = ident;
  53201. 8030f62: 60a2 str r2, [r4, #8]
  53202. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  53203. id = (u8_t)ident[0];
  53204. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ifentry.%"U16_F"\n",(u16_t)id));
  53205. switch (id)
  53206. 8030f64: f811 2c04 ldrb.w r2, [r1, #-4]
  53207. 8030f68: 3a01 subs r2, #1
  53208. 8030f6a: 2a15 cmp r2, #21
  53209. 8030f6c: d840 bhi.n 8030ff0 <ifentry_get_object_def+0x9c>
  53210. 8030f6e: e8df f002 tbb [pc, r2]
  53211. 8030f72: 0e0b .short 0x0e0b
  53212. 8030f74: 19140b0b .word 0x19140b0b
  53213. 8030f78: 302b0b27 .word 0x302b0b27
  53214. 8030f7c: 30303030 .word 0x30303030
  53215. 8030f80: 30303030 .word 0x30303030
  53216. 8030f84: 37143030 .word 0x37143030
  53217. {
  53218. case 1: /* ifIndex */
  53219. case 3: /* ifType */
  53220. case 4: /* ifMtu */
  53221. case 8: /* ifOperStatus */
  53222. od->instance = MIB_OBJECT_TAB;
  53223. 8030f88: 7023 strb r3, [r4, #0]
  53224. od->access = MIB_OBJECT_READ_ONLY;
  53225. 8030f8a: 2201 movs r2, #1
  53226. 8030f8c: e01a b.n 8030fc4 <ifentry_get_object_def+0x70>
  53227. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  53228. od->v_len = sizeof(s32_t);
  53229. break;
  53230. case 2: /* ifDescr */
  53231. od->instance = MIB_OBJECT_TAB;
  53232. od->access = MIB_OBJECT_READ_ONLY;
  53233. 8030f8e: 2201 movs r2, #1
  53234. 8030f90: 7062 strb r2, [r4, #1]
  53235. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  53236. 8030f92: 2204 movs r2, #4
  53237. od->access = MIB_OBJECT_READ_ONLY;
  53238. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  53239. od->v_len = sizeof(s32_t);
  53240. break;
  53241. case 2: /* ifDescr */
  53242. od->instance = MIB_OBJECT_TAB;
  53243. 8030f94: 7023 strb r3, [r4, #0]
  53244. od->access = MIB_OBJECT_READ_ONLY;
  53245. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  53246. 8030f96: 70a2 strb r2, [r4, #2]
  53247. 8030f98: e028 b.n 8030fec <ifentry_get_object_def+0x98>
  53248. /** @todo this should be some sort of sizeof(struct netif.name) */
  53249. od->v_len = 2;
  53250. break;
  53251. case 5: /* ifSpeed */
  53252. case 21: /* ifOutQLen */
  53253. od->instance = MIB_OBJECT_TAB;
  53254. 8030f9a: 7023 strb r3, [r4, #0]
  53255. od->access = MIB_OBJECT_READ_ONLY;
  53256. 8030f9c: 2301 movs r3, #1
  53257. 8030f9e: 7063 strb r3, [r4, #1]
  53258. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE);
  53259. 8030fa0: 2342 movs r3, #66 ; 0x42
  53260. 8030fa2: e01a b.n 8030fda <ifentry_get_object_def+0x86>
  53261. break;
  53262. case 6: /* ifPhysAddress */
  53263. {
  53264. struct netif *netif;
  53265. snmp_ifindextonetif(ident[1], &netif);
  53266. 8030fa4: 6808 ldr r0, [r1, #0]
  53267. 8030fa6: a901 add r1, sp, #4
  53268. 8030fa8: f001 f800 bl 8031fac <snmp_ifindextonetif>
  53269. od->instance = MIB_OBJECT_TAB;
  53270. 8030fac: 2302 movs r3, #2
  53271. 8030fae: 7023 strb r3, [r4, #0]
  53272. od->access = MIB_OBJECT_READ_ONLY;
  53273. 8030fb0: 2301 movs r3, #1
  53274. 8030fb2: 7063 strb r3, [r4, #1]
  53275. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  53276. 8030fb4: 2304 movs r3, #4
  53277. 8030fb6: 70a3 strb r3, [r4, #2]
  53278. od->v_len = netif->hwaddr_len;
  53279. 8030fb8: 9b01 ldr r3, [sp, #4]
  53280. 8030fba: f893 3026 ldrb.w r3, [r3, #38] ; 0x26
  53281. 8030fbe: e015 b.n 8030fec <ifentry_get_object_def+0x98>
  53282. }
  53283. break;
  53284. case 7: /* ifAdminStatus */
  53285. od->instance = MIB_OBJECT_TAB;
  53286. 8030fc0: 7023 strb r3, [r4, #0]
  53287. od->access = MIB_OBJECT_READ_WRITE;
  53288. 8030fc2: 2203 movs r2, #3
  53289. 8030fc4: 7062 strb r2, [r4, #1]
  53290. 8030fc6: e008 b.n 8030fda <ifentry_get_object_def+0x86>
  53291. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  53292. od->v_len = sizeof(s32_t);
  53293. break;
  53294. case 9: /* ifLastChange */
  53295. od->instance = MIB_OBJECT_TAB;
  53296. 8030fc8: 7023 strb r3, [r4, #0]
  53297. od->access = MIB_OBJECT_READ_ONLY;
  53298. 8030fca: 2301 movs r3, #1
  53299. 8030fcc: 7063 strb r3, [r4, #1]
  53300. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS);
  53301. 8030fce: 2343 movs r3, #67 ; 0x43
  53302. 8030fd0: e003 b.n 8030fda <ifentry_get_object_def+0x86>
  53303. case 16: /* ifOutOctets */
  53304. case 17: /* ifOutUcastPkts */
  53305. case 18: /* ifOutNUcastPkts */
  53306. case 19: /* ifOutDiscarts */
  53307. case 20: /* ifOutErrors */
  53308. od->instance = MIB_OBJECT_TAB;
  53309. 8030fd2: 7023 strb r3, [r4, #0]
  53310. od->access = MIB_OBJECT_READ_ONLY;
  53311. 8030fd4: 2301 movs r3, #1
  53312. 8030fd6: 7063 strb r3, [r4, #1]
  53313. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  53314. 8030fd8: 2341 movs r3, #65 ; 0x41
  53315. 8030fda: 70a3 strb r3, [r4, #2]
  53316. od->v_len = sizeof(u32_t);
  53317. 8030fdc: 2304 movs r3, #4
  53318. 8030fde: e005 b.n 8030fec <ifentry_get_object_def+0x98>
  53319. break;
  53320. case 22: /* ifSpecific */
  53321. /** @note returning zeroDotZero (0.0) no media specific MIB support */
  53322. od->instance = MIB_OBJECT_TAB;
  53323. 8030fe0: 7023 strb r3, [r4, #0]
  53324. od->access = MIB_OBJECT_READ_ONLY;
  53325. 8030fe2: 2301 movs r3, #1
  53326. 8030fe4: 7063 strb r3, [r4, #1]
  53327. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
  53328. 8030fe6: 2306 movs r3, #6
  53329. 8030fe8: 70a3 strb r3, [r4, #2]
  53330. od->v_len = ifspecific.len * sizeof(s32_t);
  53331. 8030fea: 2308 movs r3, #8
  53332. 8030fec: 80a3 strh r3, [r4, #4]
  53333. break;
  53334. 8030fee: e001 b.n 8030ff4 <ifentry_get_object_def+0xa0>
  53335. };
  53336. }
  53337. else
  53338. {
  53339. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ifentry_get_object_def: no scalar\n"));
  53340. od->instance = MIB_OBJECT_NONE;
  53341. 8030ff0: 2300 movs r3, #0
  53342. 8030ff2: 7023 strb r3, [r4, #0]
  53343. }
  53344. }
  53345. 8030ff4: bd1c pop {r2, r3, r4, pc}
  53346. 8030ff6: 0000 movs r0, r0
  53347. 08030ff8 <udpentry_get_value>:
  53348. }
  53349. }
  53350. static void
  53351. udpentry_get_value(struct obj_def *od, u16_t len, void *value)
  53352. {
  53353. 8030ff8: b537 push {r0, r1, r2, r4, r5, lr}
  53354. 8030ffa: 4604 mov r4, r0
  53355. struct udp_pcb *pcb;
  53356. ip_addr_t ip;
  53357. u16_t port;
  53358. LWIP_UNUSED_ARG(len);
  53359. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53360. 8030ffc: 6880 ldr r0, [r0, #8]
  53361. 8030ffe: a901 add r1, sp, #4
  53362. 8031000: 3004 adds r0, #4
  53363. }
  53364. }
  53365. static void
  53366. udpentry_get_value(struct obj_def *od, u16_t len, void *value)
  53367. {
  53368. 8031002: 4615 mov r5, r2
  53369. struct udp_pcb *pcb;
  53370. ip_addr_t ip;
  53371. u16_t port;
  53372. LWIP_UNUSED_ARG(len);
  53373. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53374. 8031004: f000 fff0 bl 8031fe8 <snmp_oidtoip>
  53375. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  53376. port = (u16_t)od->id_inst_ptr[5];
  53377. 8031008: 68a1 ldr r1, [r4, #8]
  53378. pcb = udp_pcbs;
  53379. 803100a: 4b0c ldr r3, [pc, #48] ; (803103c <udpentry_get_value+0x44>)
  53380. u16_t port;
  53381. LWIP_UNUSED_ARG(len);
  53382. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53383. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  53384. port = (u16_t)od->id_inst_ptr[5];
  53385. 803100c: 8a8a ldrh r2, [r1, #20]
  53386. pcb = udp_pcbs;
  53387. 803100e: 681b ldr r3, [r3, #0]
  53388. while ((pcb != NULL) &&
  53389. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  53390. 8031010: 9801 ldr r0, [sp, #4]
  53391. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53392. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  53393. port = (u16_t)od->id_inst_ptr[5];
  53394. pcb = udp_pcbs;
  53395. while ((pcb != NULL) &&
  53396. 8031012: e000 b.n 8031016 <udpentry_get_value+0x1e>
  53397. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  53398. (pcb->local_port == port)))
  53399. {
  53400. pcb = pcb->next;
  53401. 8031014: 68db ldr r3, [r3, #12]
  53402. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53403. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  53404. port = (u16_t)od->id_inst_ptr[5];
  53405. pcb = udp_pcbs;
  53406. while ((pcb != NULL) &&
  53407. 8031016: b17b cbz r3, 8031038 <udpentry_get_value+0x40>
  53408. 8031018: 681c ldr r4, [r3, #0]
  53409. 803101a: 4284 cmp r4, r0
  53410. 803101c: d1fa bne.n 8031014 <udpentry_get_value+0x1c>
  53411. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  53412. (pcb->local_port == port)))
  53413. 803101e: 8a5c ldrh r4, [r3, #18]
  53414. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  53415. port = (u16_t)od->id_inst_ptr[5];
  53416. pcb = udp_pcbs;
  53417. while ((pcb != NULL) &&
  53418. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  53419. 8031020: 4294 cmp r4, r2
  53420. 8031022: d1f7 bne.n 8031014 <udpentry_get_value+0x1c>
  53421. 8031024: e003 b.n 803102e <udpentry_get_value+0x36>
  53422. switch (id)
  53423. {
  53424. case 1: /* udpLocalAddress */
  53425. {
  53426. ip_addr_t *dst = (ip_addr_t*)value;
  53427. *dst = pcb->local_ip;
  53428. 8031026: 6028 str r0, [r5, #0]
  53429. }
  53430. break;
  53431. 8031028: e006 b.n 8031038 <udpentry_get_value+0x40>
  53432. case 2: /* udpLocalPort */
  53433. {
  53434. s32_t *sint_ptr = (s32_t*)value;
  53435. *sint_ptr = pcb->local_port;
  53436. 803102a: 602a str r2, [r5, #0]
  53437. }
  53438. break;
  53439. 803102c: e004 b.n 8031038 <udpentry_get_value+0x40>
  53440. if (pcb != NULL)
  53441. {
  53442. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  53443. id = (u8_t)od->id_inst_ptr[0];
  53444. switch (id)
  53445. 803102e: 780b ldrb r3, [r1, #0]
  53446. 8031030: 2b01 cmp r3, #1
  53447. 8031032: d0f8 beq.n 8031026 <udpentry_get_value+0x2e>
  53448. 8031034: 2b02 cmp r3, #2
  53449. 8031036: d0f8 beq.n 803102a <udpentry_get_value+0x32>
  53450. *sint_ptr = pcb->local_port;
  53451. }
  53452. break;
  53453. }
  53454. }
  53455. }
  53456. 8031038: bd3e pop {r1, r2, r3, r4, r5, pc}
  53457. 803103a: bf00 nop
  53458. 803103c: 20010ff8 .word 0x20010ff8
  53459. 08031040 <ip_addrentry_get_value>:
  53460. }
  53461. }
  53462. static void
  53463. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  53464. {
  53465. 8031040: b573 push {r0, r1, r4, r5, r6, lr}
  53466. 8031042: 4606 mov r6, r0
  53467. u16_t ifidx;
  53468. ip_addr_t ip;
  53469. struct netif *netif = netif_list;
  53470. LWIP_UNUSED_ARG(len);
  53471. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53472. 8031044: 6880 ldr r0, [r0, #8]
  53473. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  53474. {
  53475. u8_t id;
  53476. u16_t ifidx;
  53477. ip_addr_t ip;
  53478. struct netif *netif = netif_list;
  53479. 8031046: 4b18 ldr r3, [pc, #96] ; (80310a8 <ip_addrentry_get_value+0x68>)
  53480. LWIP_UNUSED_ARG(len);
  53481. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53482. 8031048: a901 add r1, sp, #4
  53483. 803104a: 3004 adds r0, #4
  53484. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  53485. {
  53486. u8_t id;
  53487. u16_t ifidx;
  53488. ip_addr_t ip;
  53489. struct netif *netif = netif_list;
  53490. 803104c: 681c ldr r4, [r3, #0]
  53491. }
  53492. }
  53493. static void
  53494. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  53495. {
  53496. 803104e: 4615 mov r5, r2
  53497. u16_t ifidx;
  53498. ip_addr_t ip;
  53499. struct netif *netif = netif_list;
  53500. LWIP_UNUSED_ARG(len);
  53501. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53502. 8031050: f000 ffca bl 8031fe8 <snmp_oidtoip>
  53503. ifidx = 0;
  53504. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  53505. 8031054: 9901 ldr r1, [sp, #4]
  53506. ip_addr_t ip;
  53507. struct netif *netif = netif_list;
  53508. LWIP_UNUSED_ARG(len);
  53509. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53510. ifidx = 0;
  53511. 8031056: 2300 movs r3, #0
  53512. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  53513. 8031058: e002 b.n 8031060 <ip_addrentry_get_value+0x20>
  53514. {
  53515. netif = netif->next;
  53516. ifidx++;
  53517. 803105a: 3301 adds r3, #1
  53518. LWIP_UNUSED_ARG(len);
  53519. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53520. ifidx = 0;
  53521. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  53522. {
  53523. netif = netif->next;
  53524. 803105c: 6824 ldr r4, [r4, #0]
  53525. ifidx++;
  53526. 803105e: b29b uxth r3, r3
  53527. struct netif *netif = netif_list;
  53528. LWIP_UNUSED_ARG(len);
  53529. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  53530. ifidx = 0;
  53531. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  53532. 8031060: b304 cbz r4, 80310a4 <ip_addrentry_get_value+0x64>
  53533. 8031062: 6862 ldr r2, [r4, #4]
  53534. 8031064: 4291 cmp r1, r2
  53535. 8031066: d1f8 bne.n 803105a <ip_addrentry_get_value+0x1a>
  53536. 8031068: e00a b.n 8031080 <ip_addrentry_get_value+0x40>
  53537. switch (id)
  53538. {
  53539. case 1: /* ipAdEntAddr */
  53540. {
  53541. ip_addr_t *dst = (ip_addr_t*)value;
  53542. *dst = netif->ip_addr;
  53543. 803106a: 6863 ldr r3, [r4, #4]
  53544. 803106c: e006 b.n 803107c <ip_addrentry_get_value+0x3c>
  53545. }
  53546. break;
  53547. case 2: /* ipAdEntIfIndex */
  53548. {
  53549. s32_t *sint_ptr = (s32_t*)value;
  53550. *sint_ptr = ifidx + 1;
  53551. 803106e: 3301 adds r3, #1
  53552. 8031070: e004 b.n 803107c <ip_addrentry_get_value+0x3c>
  53553. }
  53554. break;
  53555. case 3: /* ipAdEntNetMask */
  53556. {
  53557. ip_addr_t *dst = (ip_addr_t*)value;
  53558. *dst = netif->netmask;
  53559. 8031072: 68a3 ldr r3, [r4, #8]
  53560. 8031074: e002 b.n 803107c <ip_addrentry_get_value+0x3c>
  53561. {
  53562. s32_t *sint_ptr = (s32_t*)value;
  53563. /* lwIP oddity, there's no broadcast
  53564. address in the netif we can rely on */
  53565. *sint_ptr = IPADDR_BROADCAST & 1;
  53566. 8031076: 2301 movs r3, #1
  53567. 8031078: e000 b.n 803107c <ip_addrentry_get_value+0x3c>
  53568. *sint_ptr = (IP_HLEN + ((IP_REASS_MAX_PBUFS/2) *
  53569. (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN - IP_HLEN)));
  53570. #else
  53571. /** @todo returning MTU would be a bad thing and
  53572. returning a wild guess like '576' isn't good either */
  53573. *sint_ptr = 0;
  53574. 803107a: 2300 movs r3, #0
  53575. 803107c: 602b str r3, [r5, #0]
  53576. #endif
  53577. }
  53578. break;
  53579. 803107e: e011 b.n 80310a4 <ip_addrentry_get_value+0x64>
  53580. }
  53581. if (netif != NULL)
  53582. {
  53583. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  53584. id = (u8_t)od->id_inst_ptr[0];
  53585. 8031080: 68b2 ldr r2, [r6, #8]
  53586. switch (id)
  53587. 8031082: 7812 ldrb r2, [r2, #0]
  53588. 8031084: 3a01 subs r2, #1
  53589. 8031086: 2a04 cmp r2, #4
  53590. 8031088: d80c bhi.n 80310a4 <ip_addrentry_get_value+0x64>
  53591. 803108a: a101 add r1, pc, #4 ; (adr r1, 8031090 <ip_addrentry_get_value+0x50>)
  53592. 803108c: f851 f022 ldr.w pc, [r1, r2, lsl #2]
  53593. 8031090: 0803106b .word 0x0803106b
  53594. 8031094: 0803106f .word 0x0803106f
  53595. 8031098: 08031073 .word 0x08031073
  53596. 803109c: 08031077 .word 0x08031077
  53597. 80310a0: 0803107b .word 0x0803107b
  53598. #endif
  53599. }
  53600. break;
  53601. }
  53602. }
  53603. }
  53604. 80310a4: bd7c pop {r2, r3, r4, r5, r6, pc}
  53605. 80310a6: bf00 nop
  53606. 80310a8: 20010fd0 .word 0x20010fd0
  53607. 080310ac <ip_ntomentry_get_value>:
  53608. }
  53609. }
  53610. static void
  53611. ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
  53612. {
  53613. 80310ac: b530 push {r4, r5, lr}
  53614. struct netif *netif;
  53615. LWIP_UNUSED_ARG(len);
  53616. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  53617. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  53618. 80310ae: 6883 ldr r3, [r0, #8]
  53619. }
  53620. }
  53621. static void
  53622. ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
  53623. {
  53624. 80310b0: b085 sub sp, #20
  53625. 80310b2: 4605 mov r5, r0
  53626. struct netif *netif;
  53627. LWIP_UNUSED_ARG(len);
  53628. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  53629. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  53630. 80310b4: a903 add r1, sp, #12
  53631. 80310b6: 6858 ldr r0, [r3, #4]
  53632. }
  53633. }
  53634. static void
  53635. ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
  53636. {
  53637. 80310b8: 4614 mov r4, r2
  53638. struct netif *netif;
  53639. LWIP_UNUSED_ARG(len);
  53640. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  53641. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  53642. 80310ba: f000 ff77 bl 8031fac <snmp_ifindextonetif>
  53643. snmp_oidtoip(&od->id_inst_ptr[2], &ip);
  53644. 80310be: 68a8 ldr r0, [r5, #8]
  53645. 80310c0: a902 add r1, sp, #8
  53646. 80310c2: 3008 adds r0, #8
  53647. 80310c4: f000 ff90 bl 8031fe8 <snmp_oidtoip>
  53648. #if LWIP_ARP /** @todo implement a netif_find_addr */
  53649. if (etharp_find_addr(netif, &ip, &ethaddr_ret, &ipaddr_ret) > -1)
  53650. 80310c8: 9803 ldr r0, [sp, #12]
  53651. 80310ca: a902 add r1, sp, #8
  53652. 80310cc: 466a mov r2, sp
  53653. 80310ce: ab01 add r3, sp, #4
  53654. 80310d0: f002 ffca bl 8034068 <etharp_find_addr>
  53655. 80310d4: 2800 cmp r0, #0
  53656. 80310d6: db15 blt.n 8031104 <ip_ntomentry_get_value+0x58>
  53657. {
  53658. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  53659. id = (u8_t)od->id_inst_ptr[0];
  53660. 80310d8: 68ab ldr r3, [r5, #8]
  53661. switch (id)
  53662. 80310da: 781a ldrb r2, [r3, #0]
  53663. 80310dc: 3a01 subs r2, #1
  53664. 80310de: 2a03 cmp r2, #3
  53665. 80310e0: d810 bhi.n 8031104 <ip_ntomentry_get_value+0x58>
  53666. 80310e2: e8df f002 tbb [pc, r2]
  53667. 80310e6: 0402 .short 0x0402
  53668. 80310e8: 0d0a .short 0x0d0a
  53669. {
  53670. case 1: /* ipNetToMediaIfIndex */
  53671. {
  53672. s32_t *sint_ptr = (s32_t*)value;
  53673. *sint_ptr = od->id_inst_ptr[1];
  53674. 80310ea: 685b ldr r3, [r3, #4]
  53675. 80310ec: e009 b.n 8031102 <ip_ntomentry_get_value+0x56>
  53676. break;
  53677. case 2: /* ipNetToMediaPhysAddress */
  53678. {
  53679. struct eth_addr *dst = (struct eth_addr*)value;
  53680. *dst = *ethaddr_ret;
  53681. 80310ee: 9b00 ldr r3, [sp, #0]
  53682. 80310f0: 681a ldr r2, [r3, #0]
  53683. 80310f2: 6022 str r2, [r4, #0]
  53684. 80310f4: 889b ldrh r3, [r3, #4]
  53685. 80310f6: 80a3 strh r3, [r4, #4]
  53686. }
  53687. break;
  53688. 80310f8: e004 b.n 8031104 <ip_ntomentry_get_value+0x58>
  53689. case 3: /* ipNetToMediaNetAddress */
  53690. {
  53691. ip_addr_t *dst = (ip_addr_t*)value;
  53692. *dst = *ipaddr_ret;
  53693. 80310fa: 9b01 ldr r3, [sp, #4]
  53694. 80310fc: 681b ldr r3, [r3, #0]
  53695. 80310fe: e000 b.n 8031102 <ip_ntomentry_get_value+0x56>
  53696. break;
  53697. case 4: /* ipNetToMediaType */
  53698. {
  53699. s32_t *sint_ptr = (s32_t*)value;
  53700. /* dynamic (?) */
  53701. *sint_ptr = 3;
  53702. 8031100: 2303 movs r3, #3
  53703. 8031102: 6023 str r3, [r4, #0]
  53704. }
  53705. break;
  53706. }
  53707. }
  53708. #endif /* LWIP_ARP */
  53709. }
  53710. 8031104: b005 add sp, #20
  53711. 8031106: bd30 pop {r4, r5, pc}
  53712. 08031108 <atentry_get_value>:
  53713. }
  53714. }
  53715. static void
  53716. atentry_get_value(struct obj_def *od, u16_t len, void *value)
  53717. {
  53718. 8031108: b530 push {r4, r5, lr}
  53719. struct netif *netif;
  53720. LWIP_UNUSED_ARG(len);
  53721. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  53722. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  53723. 803110a: 6883 ldr r3, [r0, #8]
  53724. }
  53725. }
  53726. static void
  53727. atentry_get_value(struct obj_def *od, u16_t len, void *value)
  53728. {
  53729. 803110c: b085 sub sp, #20
  53730. 803110e: 4605 mov r5, r0
  53731. struct netif *netif;
  53732. LWIP_UNUSED_ARG(len);
  53733. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  53734. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  53735. 8031110: a903 add r1, sp, #12
  53736. 8031112: 6858 ldr r0, [r3, #4]
  53737. }
  53738. }
  53739. static void
  53740. atentry_get_value(struct obj_def *od, u16_t len, void *value)
  53741. {
  53742. 8031114: 4614 mov r4, r2
  53743. struct netif *netif;
  53744. LWIP_UNUSED_ARG(len);
  53745. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  53746. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  53747. 8031116: f000 ff49 bl 8031fac <snmp_ifindextonetif>
  53748. snmp_oidtoip(&od->id_inst_ptr[2], &ip);
  53749. 803111a: 68a8 ldr r0, [r5, #8]
  53750. 803111c: a902 add r1, sp, #8
  53751. 803111e: 3008 adds r0, #8
  53752. 8031120: f000 ff62 bl 8031fe8 <snmp_oidtoip>
  53753. #if LWIP_ARP /** @todo implement a netif_find_addr */
  53754. if (etharp_find_addr(netif, &ip, &ethaddr_ret, &ipaddr_ret) > -1)
  53755. 8031124: 9803 ldr r0, [sp, #12]
  53756. 8031126: a902 add r1, sp, #8
  53757. 8031128: 466a mov r2, sp
  53758. 803112a: ab01 add r3, sp, #4
  53759. 803112c: f002 ff9c bl 8034068 <etharp_find_addr>
  53760. 8031130: 2800 cmp r0, #0
  53761. 8031132: db12 blt.n 803115a <atentry_get_value+0x52>
  53762. {
  53763. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  53764. id = (u8_t)od->id_inst_ptr[0];
  53765. 8031134: 68aa ldr r2, [r5, #8]
  53766. switch (id)
  53767. 8031136: 7813 ldrb r3, [r2, #0]
  53768. 8031138: 2b02 cmp r3, #2
  53769. 803113a: d005 beq.n 8031148 <atentry_get_value+0x40>
  53770. 803113c: 2b03 cmp r3, #3
  53771. 803113e: d009 beq.n 8031154 <atentry_get_value+0x4c>
  53772. 8031140: 2b01 cmp r3, #1
  53773. 8031142: d10a bne.n 803115a <atentry_get_value+0x52>
  53774. {
  53775. case 1: /* atIfIndex */
  53776. {
  53777. s32_t *sint_ptr = (s32_t*)value;
  53778. *sint_ptr = od->id_inst_ptr[1];
  53779. 8031144: 6853 ldr r3, [r2, #4]
  53780. 8031146: e007 b.n 8031158 <atentry_get_value+0x50>
  53781. break;
  53782. case 2: /* atPhysAddress */
  53783. {
  53784. struct eth_addr *dst = (struct eth_addr*)value;
  53785. *dst = *ethaddr_ret;
  53786. 8031148: 9b00 ldr r3, [sp, #0]
  53787. 803114a: 681a ldr r2, [r3, #0]
  53788. 803114c: 6022 str r2, [r4, #0]
  53789. 803114e: 889b ldrh r3, [r3, #4]
  53790. 8031150: 80a3 strh r3, [r4, #4]
  53791. }
  53792. break;
  53793. 8031152: e002 b.n 803115a <atentry_get_value+0x52>
  53794. case 3: /* atNetAddress */
  53795. {
  53796. ip_addr_t *dst = (ip_addr_t*)value;
  53797. *dst = *ipaddr_ret;
  53798. 8031154: 9b01 ldr r3, [sp, #4]
  53799. 8031156: 681b ldr r3, [r3, #0]
  53800. 8031158: 6023 str r3, [r4, #0]
  53801. }
  53802. break;
  53803. }
  53804. }
  53805. #endif /* LWIP_ARP */
  53806. }
  53807. 803115a: b005 add sp, #20
  53808. 803115c: bd30 pop {r4, r5, pc}
  53809. 803115e: 0000 movs r0, r0
  53810. 08031160 <system_set_test>:
  53811. u8_t id, set_ok;
  53812. LWIP_UNUSED_ARG(value);
  53813. set_ok = 0;
  53814. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  53815. id = (u8_t)od->id_inst_ptr[0];
  53816. 8031160: 6883 ldr r3, [r0, #8]
  53817. switch (id)
  53818. 8031162: 781b ldrb r3, [r3, #0]
  53819. 8031164: 2b05 cmp r3, #5
  53820. 8031166: d007 beq.n 8031178 <system_set_test+0x18>
  53821. 8031168: 2b06 cmp r3, #6
  53822. 803116a: d00f beq.n 803118c <system_set_test+0x2c>
  53823. 803116c: 2b04 cmp r3, #4
  53824. 803116e: d111 bne.n 8031194 <system_set_test+0x34>
  53825. {
  53826. case 4: /* sysContact */
  53827. if ((syscontact_ptr != syscontact_default) &&
  53828. 8031170: 4b09 ldr r3, [pc, #36] ; (8031198 <system_set_test+0x38>)
  53829. 8031172: 681a ldr r2, [r3, #0]
  53830. 8031174: 4b09 ldr r3, [pc, #36] ; (803119c <system_set_test+0x3c>)
  53831. 8031176: e002 b.n 803117e <system_set_test+0x1e>
  53832. {
  53833. set_ok = 1;
  53834. }
  53835. break;
  53836. case 5: /* sysName */
  53837. if ((sysname_ptr != sysname_default) &&
  53838. 8031178: 4b09 ldr r3, [pc, #36] ; (80311a0 <system_set_test+0x40>)
  53839. 803117a: 681a ldr r2, [r3, #0]
  53840. 803117c: 4b09 ldr r3, [pc, #36] ; (80311a4 <system_set_test+0x44>)
  53841. 803117e: 429a cmp r2, r3
  53842. 8031180: d008 beq.n 8031194 <system_set_test+0x34>
  53843. system_set_test(struct obj_def *od, u16_t len, void *value)
  53844. {
  53845. u8_t id, set_ok;
  53846. LWIP_UNUSED_ARG(value);
  53847. set_ok = 0;
  53848. 8031182: 29ff cmp r1, #255 ; 0xff
  53849. 8031184: bf8c ite hi
  53850. 8031186: 2000 movhi r0, #0
  53851. 8031188: 2001 movls r0, #1
  53852. 803118a: 4770 bx lr
  53853. {
  53854. set_ok = 1;
  53855. }
  53856. break;
  53857. case 6: /* sysLocation */
  53858. if ((syslocation_ptr != syslocation_default) &&
  53859. 803118c: 4b06 ldr r3, [pc, #24] ; (80311a8 <system_set_test+0x48>)
  53860. 803118e: 681a ldr r2, [r3, #0]
  53861. 8031190: 4b06 ldr r3, [pc, #24] ; (80311ac <system_set_test+0x4c>)
  53862. 8031192: e7f4 b.n 803117e <system_set_test+0x1e>
  53863. system_set_test(struct obj_def *od, u16_t len, void *value)
  53864. {
  53865. u8_t id, set_ok;
  53866. LWIP_UNUSED_ARG(value);
  53867. set_ok = 0;
  53868. 8031194: 2000 movs r0, #0
  53869. set_ok = 1;
  53870. }
  53871. break;
  53872. };
  53873. return set_ok;
  53874. }
  53875. 8031196: 4770 bx lr
  53876. 8031198: 200017e4 .word 0x200017e4
  53877. 803119c: 08040288 .word 0x08040288
  53878. 80311a0: 20001770 .word 0x20001770
  53879. 80311a4: 0803ffa0 .word 0x0803ffa0
  53880. 80311a8: 200018fc .word 0x200018fc
  53881. 80311ac: 0803ffd0 .word 0x0803ffd0
  53882. 080311b0 <atentry_get_object_def>:
  53883. {
  53884. /* return to object name, adding index depth (5) */
  53885. ident_len += 5;
  53886. ident -= 5;
  53887. if (ident_len == 6)
  53888. 80311b0: 2801 cmp r0, #1
  53889. 80311b2: d120 bne.n 80311f6 <atentry_get_object_def+0x46>
  53890. {
  53891. od->id_inst_len = ident_len;
  53892. 80311b4: 2006 movs r0, #6
  53893. static void
  53894. atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  53895. {
  53896. /* return to object name, adding index depth (5) */
  53897. ident_len += 5;
  53898. ident -= 5;
  53899. 80311b6: f1a1 0314 sub.w r3, r1, #20
  53900. if (ident_len == 6)
  53901. {
  53902. od->id_inst_len = ident_len;
  53903. 80311ba: 7190 strb r0, [r2, #6]
  53904. od->id_inst_ptr = ident;
  53905. 80311bc: 6093 str r3, [r2, #8]
  53906. switch (ident[0])
  53907. 80311be: f851 3c14 ldr.w r3, [r1, #-20]
  53908. 80311c2: 2b02 cmp r3, #2
  53909. 80311c4: d008 beq.n 80311d8 <atentry_get_object_def+0x28>
  53910. 80311c6: 2b03 cmp r3, #3
  53911. 80311c8: d00d beq.n 80311e6 <atentry_get_object_def+0x36>
  53912. 80311ca: 2b01 cmp r3, #1
  53913. 80311cc: d113 bne.n 80311f6 <atentry_get_object_def+0x46>
  53914. {
  53915. case 1: /* atIfIndex */
  53916. od->instance = MIB_OBJECT_TAB;
  53917. 80311ce: 2302 movs r3, #2
  53918. od->access = MIB_OBJECT_READ_WRITE;
  53919. 80311d0: 2103 movs r1, #3
  53920. od->id_inst_ptr = ident;
  53921. switch (ident[0])
  53922. {
  53923. case 1: /* atIfIndex */
  53924. od->instance = MIB_OBJECT_TAB;
  53925. 80311d2: 7013 strb r3, [r2, #0]
  53926. od->access = MIB_OBJECT_READ_WRITE;
  53927. 80311d4: 7051 strb r1, [r2, #1]
  53928. 80311d6: e00a b.n 80311ee <atentry_get_object_def+0x3e>
  53929. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  53930. od->v_len = sizeof(s32_t);
  53931. break;
  53932. case 2: /* atPhysAddress */
  53933. od->instance = MIB_OBJECT_TAB;
  53934. 80311d8: 7013 strb r3, [r2, #0]
  53935. od->access = MIB_OBJECT_READ_WRITE;
  53936. 80311da: 2303 movs r3, #3
  53937. 80311dc: 7053 strb r3, [r2, #1]
  53938. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  53939. 80311de: 2304 movs r3, #4
  53940. 80311e0: 7093 strb r3, [r2, #2]
  53941. od->v_len = 6; /** @todo try to use netif::hwaddr_len */
  53942. 80311e2: 8090 strh r0, [r2, #4]
  53943. break;
  53944. 80311e4: 4770 bx lr
  53945. case 3: /* atNetAddress */
  53946. od->instance = MIB_OBJECT_TAB;
  53947. 80311e6: 2102 movs r1, #2
  53948. od->access = MIB_OBJECT_READ_WRITE;
  53949. 80311e8: 7053 strb r3, [r2, #1]
  53950. od->access = MIB_OBJECT_READ_WRITE;
  53951. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  53952. od->v_len = 6; /** @todo try to use netif::hwaddr_len */
  53953. break;
  53954. case 3: /* atNetAddress */
  53955. od->instance = MIB_OBJECT_TAB;
  53956. 80311ea: 7011 strb r1, [r2, #0]
  53957. od->access = MIB_OBJECT_READ_WRITE;
  53958. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  53959. 80311ec: 2340 movs r3, #64 ; 0x40
  53960. 80311ee: 7093 strb r3, [r2, #2]
  53961. od->v_len = 4;
  53962. 80311f0: 2304 movs r3, #4
  53963. 80311f2: 8093 strh r3, [r2, #4]
  53964. break;
  53965. 80311f4: 4770 bx lr
  53966. }
  53967. }
  53968. else
  53969. {
  53970. LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no scalar\n"));
  53971. od->instance = MIB_OBJECT_NONE;
  53972. 80311f6: 2300 movs r3, #0
  53973. 80311f8: 7013 strb r3, [r2, #0]
  53974. 80311fa: 4770 bx lr
  53975. 080311fc <ip_get_object_def>:
  53976. u8_t id;
  53977. /* return to object name, adding index depth (1) */
  53978. ident_len += 1;
  53979. ident -= 1;
  53980. if (ident_len == 2)
  53981. 80311fc: 2801 cmp r0, #1
  53982. #endif /* LWIP_ARP */
  53983. }
  53984. static void
  53985. ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  53986. {
  53987. 80311fe: b510 push {r4, lr}
  53988. u8_t id;
  53989. /* return to object name, adding index depth (1) */
  53990. ident_len += 1;
  53991. ident -= 1;
  53992. if (ident_len == 2)
  53993. 8031200: d121 bne.n 8031246 <ip_get_object_def+0x4a>
  53994. {
  53995. od->id_inst_len = ident_len;
  53996. 8031202: 2402 movs r4, #2
  53997. {
  53998. u8_t id;
  53999. /* return to object name, adding index depth (1) */
  54000. ident_len += 1;
  54001. ident -= 1;
  54002. 8031204: 1f0b subs r3, r1, #4
  54003. if (ident_len == 2)
  54004. {
  54005. od->id_inst_len = ident_len;
  54006. 8031206: 7194 strb r4, [r2, #6]
  54007. od->id_inst_ptr = ident;
  54008. 8031208: 6093 str r3, [r2, #8]
  54009. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  54010. id = (u8_t)ident[0];
  54011. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ip.%"U16_F".0\n",(u16_t)id));
  54012. switch (id)
  54013. 803120a: f811 3c04 ldrb.w r3, [r1, #-4]
  54014. 803120e: 2b17 cmp r3, #23
  54015. 8031210: d819 bhi.n 8031246 <ip_get_object_def+0x4a>
  54016. 8031212: 490e ldr r1, [pc, #56] ; (803124c <ip_get_object_def+0x50>)
  54017. 8031214: 4099 lsls r1, r3
  54018. 8031216: d40b bmi.n 8031230 <ip_get_object_def+0x34>
  54019. 8031218: f44f 2180 mov.w r1, #262144 ; 0x40000
  54020. 803121c: 4099 lsls r1, r3
  54021. 803121e: d40c bmi.n 803123a <ip_get_object_def+0x3e>
  54022. 8031220: f04f 41c0 mov.w r1, #1610612736 ; 0x60000000
  54023. 8031224: 4099 lsls r1, r3
  54024. 8031226: d50e bpl.n 8031246 <ip_get_object_def+0x4a>
  54025. {
  54026. case 1: /* ipForwarding */
  54027. case 2: /* ipDefaultTTL */
  54028. od->instance = MIB_OBJECT_SCALAR;
  54029. od->access = MIB_OBJECT_READ_WRITE;
  54030. 8031228: 2303 movs r3, #3
  54031. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ip.%"U16_F".0\n",(u16_t)id));
  54032. switch (id)
  54033. {
  54034. case 1: /* ipForwarding */
  54035. case 2: /* ipDefaultTTL */
  54036. od->instance = MIB_OBJECT_SCALAR;
  54037. 803122a: 7010 strb r0, [r2, #0]
  54038. od->access = MIB_OBJECT_READ_WRITE;
  54039. 803122c: 7053 strb r3, [r2, #1]
  54040. 803122e: e006 b.n 803123e <ip_get_object_def+0x42>
  54041. case 18: /* ipFragFails */
  54042. case 19: /* ipFragCreates */
  54043. case 23: /* ipRoutingDiscards */
  54044. od->instance = MIB_OBJECT_SCALAR;
  54045. od->access = MIB_OBJECT_READ_ONLY;
  54046. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  54047. 8031230: 2341 movs r3, #65 ; 0x41
  54048. case 16: /* ipReasmFails */
  54049. case 17: /* ipFragOKs */
  54050. case 18: /* ipFragFails */
  54051. case 19: /* ipFragCreates */
  54052. case 23: /* ipRoutingDiscards */
  54053. od->instance = MIB_OBJECT_SCALAR;
  54054. 8031232: 7010 strb r0, [r2, #0]
  54055. od->access = MIB_OBJECT_READ_ONLY;
  54056. 8031234: 7050 strb r0, [r2, #1]
  54057. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  54058. 8031236: 7093 strb r3, [r2, #2]
  54059. 8031238: e002 b.n 8031240 <ip_get_object_def+0x44>
  54060. od->v_len = sizeof(u32_t);
  54061. break;
  54062. case 13: /* ipReasmTimeout */
  54063. od->instance = MIB_OBJECT_SCALAR;
  54064. 803123a: 7010 strb r0, [r2, #0]
  54065. od->access = MIB_OBJECT_READ_ONLY;
  54066. 803123c: 7050 strb r0, [r2, #1]
  54067. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  54068. 803123e: 7094 strb r4, [r2, #2]
  54069. od->v_len = sizeof(s32_t);
  54070. 8031240: 2304 movs r3, #4
  54071. 8031242: 8093 strh r3, [r2, #4]
  54072. break;
  54073. 8031244: bd10 pop {r4, pc}
  54074. };
  54075. }
  54076. else
  54077. {
  54078. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_object_def: no scalar\n"));
  54079. od->instance = MIB_OBJECT_NONE;
  54080. 8031246: 2300 movs r3, #0
  54081. 8031248: 7013 strb r3, [r2, #0]
  54082. 803124a: bd10 pop {r4, pc}
  54083. 803124c: 1ffbf100 .word 0x1ffbf100
  54084. 08031250 <ip_addrentry_get_object_def>:
  54085. {
  54086. /* return to object name, adding index depth (4) */
  54087. ident_len += 4;
  54088. ident -= 4;
  54089. if (ident_len == 5)
  54090. 8031250: 2801 cmp r0, #1
  54091. 8031252: d11c bne.n 803128e <ip_addrentry_get_object_def+0x3e>
  54092. {
  54093. u8_t id;
  54094. od->id_inst_len = ident_len;
  54095. 8031254: 2305 movs r3, #5
  54096. 8031256: 7193 strb r3, [r2, #6]
  54097. static void
  54098. ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  54099. {
  54100. /* return to object name, adding index depth (4) */
  54101. ident_len += 4;
  54102. ident -= 4;
  54103. 8031258: f1a1 0310 sub.w r3, r1, #16
  54104. if (ident_len == 5)
  54105. {
  54106. u8_t id;
  54107. od->id_inst_len = ident_len;
  54108. od->id_inst_ptr = ident;
  54109. 803125c: 6093 str r3, [r2, #8]
  54110. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  54111. id = (u8_t)ident[0];
  54112. switch (id)
  54113. 803125e: f811 3c10 ldrb.w r3, [r1, #-16]
  54114. 8031262: 2b05 cmp r3, #5
  54115. 8031264: d813 bhi.n 803128e <ip_addrentry_get_object_def+0x3e>
  54116. 8031266: f04f 5130 mov.w r1, #738197504 ; 0x2c000000
  54117. 803126a: 4099 lsls r1, r3
  54118. 803126c: d408 bmi.n 8031280 <ip_addrentry_get_object_def+0x30>
  54119. 803126e: f04f 41a0 mov.w r1, #1342177280 ; 0x50000000
  54120. 8031272: 4099 lsls r1, r3
  54121. 8031274: d50b bpl.n 803128e <ip_addrentry_get_object_def+0x3e>
  54122. {
  54123. case 1: /* ipAdEntAddr */
  54124. case 3: /* ipAdEntNetMask */
  54125. od->instance = MIB_OBJECT_TAB;
  54126. 8031276: 2302 movs r3, #2
  54127. 8031278: 7013 strb r3, [r2, #0]
  54128. od->access = MIB_OBJECT_READ_ONLY;
  54129. 803127a: 7050 strb r0, [r2, #1]
  54130. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  54131. 803127c: 2340 movs r3, #64 ; 0x40
  54132. 803127e: e002 b.n 8031286 <ip_addrentry_get_object_def+0x36>
  54133. od->v_len = 4;
  54134. break;
  54135. case 2: /* ipAdEntIfIndex */
  54136. case 4: /* ipAdEntBcastAddr */
  54137. case 5: /* ipAdEntReasmMaxSize */
  54138. od->instance = MIB_OBJECT_TAB;
  54139. 8031280: 2302 movs r3, #2
  54140. 8031282: 7013 strb r3, [r2, #0]
  54141. od->access = MIB_OBJECT_READ_ONLY;
  54142. 8031284: 7050 strb r0, [r2, #1]
  54143. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  54144. 8031286: 7093 strb r3, [r2, #2]
  54145. od->v_len = sizeof(s32_t);
  54146. 8031288: 2304 movs r3, #4
  54147. 803128a: 8093 strh r3, [r2, #4]
  54148. break;
  54149. 803128c: 4770 bx lr
  54150. }
  54151. }
  54152. else
  54153. {
  54154. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_addrentry_get_object_def: no scalar\n"));
  54155. od->instance = MIB_OBJECT_NONE;
  54156. 803128e: 2300 movs r3, #0
  54157. 8031290: 7013 strb r3, [r2, #0]
  54158. 8031292: 4770 bx lr
  54159. 08031294 <ip_ntomentry_get_object_def>:
  54160. {
  54161. /* return to object name, adding index depth (5) */
  54162. ident_len += 5;
  54163. ident -= 5;
  54164. if (ident_len == 6)
  54165. 8031294: 2801 cmp r0, #1
  54166. 8031296: d123 bne.n 80312e0 <ip_ntomentry_get_object_def+0x4c>
  54167. {
  54168. u8_t id;
  54169. od->id_inst_len = ident_len;
  54170. 8031298: 2306 movs r3, #6
  54171. 803129a: 7193 strb r3, [r2, #6]
  54172. static void
  54173. ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  54174. {
  54175. /* return to object name, adding index depth (5) */
  54176. ident_len += 5;
  54177. ident -= 5;
  54178. 803129c: f1a1 0314 sub.w r3, r1, #20
  54179. if (ident_len == 6)
  54180. {
  54181. u8_t id;
  54182. od->id_inst_len = ident_len;
  54183. od->id_inst_ptr = ident;
  54184. 80312a0: 6093 str r3, [r2, #8]
  54185. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  54186. id = (u8_t)ident[0];
  54187. switch (id)
  54188. 80312a2: f811 3c14 ldrb.w r3, [r1, #-20]
  54189. 80312a6: 3b01 subs r3, #1
  54190. 80312a8: 2b03 cmp r3, #3
  54191. 80312aa: d819 bhi.n 80312e0 <ip_ntomentry_get_object_def+0x4c>
  54192. 80312ac: e8df f003 tbb [pc, r3]
  54193. 80312b0: 020f0702 .word 0x020f0702
  54194. {
  54195. case 1: /* ipNetToMediaIfIndex */
  54196. case 4: /* ipNetToMediaType */
  54197. od->instance = MIB_OBJECT_TAB;
  54198. 80312b4: 2302 movs r3, #2
  54199. od->access = MIB_OBJECT_READ_WRITE;
  54200. 80312b6: 2103 movs r1, #3
  54201. id = (u8_t)ident[0];
  54202. switch (id)
  54203. {
  54204. case 1: /* ipNetToMediaIfIndex */
  54205. case 4: /* ipNetToMediaType */
  54206. od->instance = MIB_OBJECT_TAB;
  54207. 80312b8: 7013 strb r3, [r2, #0]
  54208. od->access = MIB_OBJECT_READ_WRITE;
  54209. 80312ba: 7051 strb r1, [r2, #1]
  54210. 80312bc: e00c b.n 80312d8 <ip_ntomentry_get_object_def+0x44>
  54211. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  54212. od->v_len = sizeof(s32_t);
  54213. break;
  54214. case 2: /* ipNetToMediaPhysAddress */
  54215. od->instance = MIB_OBJECT_TAB;
  54216. 80312be: 2302 movs r3, #2
  54217. 80312c0: 7013 strb r3, [r2, #0]
  54218. od->access = MIB_OBJECT_READ_WRITE;
  54219. 80312c2: 2303 movs r3, #3
  54220. 80312c4: 7053 strb r3, [r2, #1]
  54221. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  54222. 80312c6: 2304 movs r3, #4
  54223. 80312c8: 7093 strb r3, [r2, #2]
  54224. od->v_len = 6; /** @todo try to use netif::hwaddr_len */
  54225. 80312ca: 2306 movs r3, #6
  54226. 80312cc: e006 b.n 80312dc <ip_ntomentry_get_object_def+0x48>
  54227. break;
  54228. case 3: /* ipNetToMediaNetAddress */
  54229. od->instance = MIB_OBJECT_TAB;
  54230. 80312ce: 2302 movs r3, #2
  54231. 80312d0: 7013 strb r3, [r2, #0]
  54232. od->access = MIB_OBJECT_READ_WRITE;
  54233. 80312d2: 2303 movs r3, #3
  54234. 80312d4: 7053 strb r3, [r2, #1]
  54235. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  54236. 80312d6: 2340 movs r3, #64 ; 0x40
  54237. 80312d8: 7093 strb r3, [r2, #2]
  54238. od->v_len = 4;
  54239. 80312da: 2304 movs r3, #4
  54240. 80312dc: 8093 strh r3, [r2, #4]
  54241. break;
  54242. 80312de: 4770 bx lr
  54243. }
  54244. }
  54245. else
  54246. {
  54247. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no scalar\n"));
  54248. od->instance = MIB_OBJECT_NONE;
  54249. 80312e0: 2300 movs r3, #0
  54250. 80312e2: 7013 strb r3, [r2, #0]
  54251. 80312e4: 4770 bx lr
  54252. 80312e6: 0000 movs r0, r0
  54253. 080312e8 <tcp_get_object_def>:
  54254. u8_t id;
  54255. /* return to object name, adding index depth (1) */
  54256. ident_len += 1;
  54257. ident -= 1;
  54258. if (ident_len == 2)
  54259. 80312e8: 2801 cmp r0, #1
  54260. #if LWIP_TCP
  54261. /** @todo tcp grp */
  54262. static void
  54263. tcp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  54264. {
  54265. 80312ea: b510 push {r4, lr}
  54266. u8_t id;
  54267. /* return to object name, adding index depth (1) */
  54268. ident_len += 1;
  54269. ident -= 1;
  54270. if (ident_len == 2)
  54271. 80312ec: d121 bne.n 8031332 <tcp_get_object_def+0x4a>
  54272. {
  54273. od->id_inst_len = ident_len;
  54274. 80312ee: 2402 movs r4, #2
  54275. {
  54276. u8_t id;
  54277. /* return to object name, adding index depth (1) */
  54278. ident_len += 1;
  54279. ident -= 1;
  54280. 80312f0: 1f0b subs r3, r1, #4
  54281. if (ident_len == 2)
  54282. {
  54283. od->id_inst_len = ident_len;
  54284. 80312f2: 7194 strb r4, [r2, #6]
  54285. od->id_inst_ptr = ident;
  54286. 80312f4: 6093 str r3, [r2, #8]
  54287. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  54288. id = (u8_t)ident[0];
  54289. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def tcp.%"U16_F".0\n",(u16_t)id));
  54290. switch (id)
  54291. 80312f6: f811 3c04 ldrb.w r3, [r1, #-4]
  54292. 80312fa: 2b0f cmp r3, #15
  54293. 80312fc: d819 bhi.n 8031332 <tcp_get_object_def+0x4a>
  54294. 80312fe: 490e ldr r1, [pc, #56] ; (8031338 <tcp_get_object_def+0x50>)
  54295. 8031300: 4099 lsls r1, r3
  54296. 8031302: d40b bmi.n 803131c <tcp_get_object_def+0x34>
  54297. 8031304: f44f 0180 mov.w r1, #4194304 ; 0x400000
  54298. 8031308: 4099 lsls r1, r3
  54299. 803130a: d40b bmi.n 8031324 <tcp_get_object_def+0x3c>
  54300. 803130c: f04f 41f0 mov.w r1, #2013265920 ; 0x78000000
  54301. 8031310: 4099 lsls r1, r3
  54302. 8031312: d50e bpl.n 8031332 <tcp_get_object_def+0x4a>
  54303. {
  54304. case 1: /* tcpRtoAlgorithm */
  54305. case 2: /* tcpRtoMin */
  54306. case 3: /* tcpRtoMax */
  54307. case 4: /* tcpMaxConn */
  54308. od->instance = MIB_OBJECT_SCALAR;
  54309. 8031314: 7010 strb r0, [r2, #0]
  54310. od->access = MIB_OBJECT_READ_ONLY;
  54311. 8031316: 7050 strb r0, [r2, #1]
  54312. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  54313. 8031318: 7094 strb r4, [r2, #2]
  54314. 803131a: e007 b.n 803132c <tcp_get_object_def+0x44>
  54315. case 10: /* tcpInSegs */
  54316. case 11: /* tcpOutSegs */
  54317. case 12: /* tcpRetransSegs */
  54318. case 14: /* tcpInErrs */
  54319. case 15: /* tcpOutRsts */
  54320. od->instance = MIB_OBJECT_SCALAR;
  54321. 803131c: 7010 strb r0, [r2, #0]
  54322. od->access = MIB_OBJECT_READ_ONLY;
  54323. 803131e: 7050 strb r0, [r2, #1]
  54324. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  54325. 8031320: 2341 movs r3, #65 ; 0x41
  54326. 8031322: e002 b.n 803132a <tcp_get_object_def+0x42>
  54327. od->v_len = sizeof(u32_t);
  54328. break;
  54329. case 9: /* tcpCurrEstab */
  54330. od->instance = MIB_OBJECT_TAB;
  54331. 8031324: 7014 strb r4, [r2, #0]
  54332. od->access = MIB_OBJECT_READ_ONLY;
  54333. 8031326: 7050 strb r0, [r2, #1]
  54334. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE);
  54335. 8031328: 2342 movs r3, #66 ; 0x42
  54336. 803132a: 7093 strb r3, [r2, #2]
  54337. od->v_len = sizeof(u32_t);
  54338. 803132c: 2304 movs r3, #4
  54339. 803132e: 8093 strh r3, [r2, #4]
  54340. break;
  54341. 8031330: bd10 pop {r4, pc}
  54342. };
  54343. }
  54344. else
  54345. {
  54346. LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_object_def: no scalar\n"));
  54347. od->instance = MIB_OBJECT_NONE;
  54348. 8031332: 2300 movs r3, #0
  54349. 8031334: 7013 strb r3, [r2, #0]
  54350. 8031336: bd10 pop {r4, pc}
  54351. 8031338: 07bb0000 .word 0x07bb0000
  54352. 0803133c <udpentry_get_object_def>:
  54353. {
  54354. /* return to object name, adding index depth (5) */
  54355. ident_len += 5;
  54356. ident -= 5;
  54357. if (ident_len == 6)
  54358. 803133c: 2801 cmp r0, #1
  54359. 803133e: d116 bne.n 803136e <udpentry_get_object_def+0x32>
  54360. {
  54361. od->id_inst_len = ident_len;
  54362. 8031340: 2306 movs r3, #6
  54363. 8031342: 7193 strb r3, [r2, #6]
  54364. static void
  54365. udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  54366. {
  54367. /* return to object name, adding index depth (5) */
  54368. ident_len += 5;
  54369. ident -= 5;
  54370. 8031344: f1a1 0314 sub.w r3, r1, #20
  54371. if (ident_len == 6)
  54372. {
  54373. od->id_inst_len = ident_len;
  54374. od->id_inst_ptr = ident;
  54375. 8031348: 6093 str r3, [r2, #8]
  54376. switch (ident[0])
  54377. 803134a: f851 3c14 ldr.w r3, [r1, #-20]
  54378. 803134e: 2b01 cmp r3, #1
  54379. 8031350: d002 beq.n 8031358 <udpentry_get_object_def+0x1c>
  54380. 8031352: 2b02 cmp r3, #2
  54381. 8031354: d10b bne.n 803136e <udpentry_get_object_def+0x32>
  54382. 8031356: e004 b.n 8031362 <udpentry_get_object_def+0x26>
  54383. {
  54384. case 1: /* udpLocalAddress */
  54385. od->instance = MIB_OBJECT_TAB;
  54386. 8031358: 2102 movs r1, #2
  54387. od->access = MIB_OBJECT_READ_ONLY;
  54388. 803135a: 7053 strb r3, [r2, #1]
  54389. od->id_inst_ptr = ident;
  54390. switch (ident[0])
  54391. {
  54392. case 1: /* udpLocalAddress */
  54393. od->instance = MIB_OBJECT_TAB;
  54394. 803135c: 7011 strb r1, [r2, #0]
  54395. od->access = MIB_OBJECT_READ_ONLY;
  54396. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  54397. 803135e: 2340 movs r3, #64 ; 0x40
  54398. 8031360: e001 b.n 8031366 <udpentry_get_object_def+0x2a>
  54399. od->v_len = 4;
  54400. break;
  54401. case 2: /* udpLocalPort */
  54402. od->instance = MIB_OBJECT_TAB;
  54403. 8031362: 7013 strb r3, [r2, #0]
  54404. od->access = MIB_OBJECT_READ_ONLY;
  54405. 8031364: 7050 strb r0, [r2, #1]
  54406. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  54407. 8031366: 7093 strb r3, [r2, #2]
  54408. od->v_len = sizeof(s32_t);
  54409. 8031368: 2304 movs r3, #4
  54410. 803136a: 8093 strh r3, [r2, #4]
  54411. break;
  54412. 803136c: 4770 bx lr
  54413. }
  54414. }
  54415. else
  54416. {
  54417. LWIP_DEBUGF(SNMP_MIB_DEBUG,("udpentry_get_object_def: no scalar\n"));
  54418. od->instance = MIB_OBJECT_NONE;
  54419. 803136e: 2300 movs r3, #0
  54420. 8031370: 7013 strb r3, [r2, #0]
  54421. 8031372: 4770 bx lr
  54422. 08031374 <snmp_get_object_def>:
  54423. snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  54424. {
  54425. /* return to object name, adding index depth (1) */
  54426. ident_len += 1;
  54427. ident -= 1;
  54428. if (ident_len == 2)
  54429. 8031374: 2801 cmp r0, #1
  54430. }
  54431. }
  54432. static void
  54433. snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  54434. {
  54435. 8031376: b510 push {r4, lr}
  54436. /* return to object name, adding index depth (1) */
  54437. ident_len += 1;
  54438. ident -= 1;
  54439. if (ident_len == 2)
  54440. 8031378: d119 bne.n 80313ae <snmp_get_object_def+0x3a>
  54441. {
  54442. u8_t id;
  54443. od->id_inst_len = ident_len;
  54444. 803137a: 2302 movs r3, #2
  54445. 803137c: 7193 strb r3, [r2, #6]
  54446. static void
  54447. snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  54448. {
  54449. /* return to object name, adding index depth (1) */
  54450. ident_len += 1;
  54451. ident -= 1;
  54452. 803137e: 1f0c subs r4, r1, #4
  54453. od->id_inst_len = ident_len;
  54454. od->id_inst_ptr = ident;
  54455. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  54456. id = (u8_t)ident[0];
  54457. switch (id)
  54458. 8031380: f811 1c04 ldrb.w r1, [r1, #-4]
  54459. if (ident_len == 2)
  54460. {
  54461. u8_t id;
  54462. od->id_inst_len = ident_len;
  54463. od->id_inst_ptr = ident;
  54464. 8031384: 6094 str r4, [r2, #8]
  54465. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  54466. id = (u8_t)ident[0];
  54467. switch (id)
  54468. 8031386: 291e cmp r1, #30
  54469. 8031388: d811 bhi.n 80313ae <snmp_get_object_def+0x3a>
  54470. 803138a: 4c0a ldr r4, [pc, #40] ; (80313b4 <snmp_get_object_def+0x40>)
  54471. 803138c: 408c lsls r4, r1
  54472. 803138e: d403 bmi.n 8031398 <snmp_get_object_def+0x24>
  54473. 8031390: fa13 f101 lsls.w r1, r3, r1
  54474. 8031394: d404 bmi.n 80313a0 <snmp_get_object_def+0x2c>
  54475. 8031396: e00a b.n 80313ae <snmp_get_object_def+0x3a>
  54476. case 25: /* snmpOutGetRequests */
  54477. case 26: /* snmpOutGetNexts */
  54478. case 27: /* snmpOutSetRequests */
  54479. case 28: /* snmpOutGetResponses */
  54480. case 29: /* snmpOutTraps */
  54481. od->instance = MIB_OBJECT_SCALAR;
  54482. 8031398: 7010 strb r0, [r2, #0]
  54483. od->access = MIB_OBJECT_READ_ONLY;
  54484. 803139a: 7050 strb r0, [r2, #1]
  54485. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  54486. 803139c: 2341 movs r3, #65 ; 0x41
  54487. 803139e: e002 b.n 80313a6 <snmp_get_object_def+0x32>
  54488. od->v_len = sizeof(u32_t);
  54489. break;
  54490. case 30: /* snmpEnableAuthenTraps */
  54491. od->instance = MIB_OBJECT_SCALAR;
  54492. od->access = MIB_OBJECT_READ_WRITE;
  54493. 80313a0: 2103 movs r1, #3
  54494. od->access = MIB_OBJECT_READ_ONLY;
  54495. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  54496. od->v_len = sizeof(u32_t);
  54497. break;
  54498. case 30: /* snmpEnableAuthenTraps */
  54499. od->instance = MIB_OBJECT_SCALAR;
  54500. 80313a2: 7010 strb r0, [r2, #0]
  54501. od->access = MIB_OBJECT_READ_WRITE;
  54502. 80313a4: 7051 strb r1, [r2, #1]
  54503. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  54504. 80313a6: 7093 strb r3, [r2, #2]
  54505. od->v_len = sizeof(s32_t);
  54506. 80313a8: 2304 movs r3, #4
  54507. 80313aa: 8093 strh r3, [r2, #4]
  54508. break;
  54509. 80313ac: bd10 pop {r4, pc}
  54510. };
  54511. }
  54512. else
  54513. {
  54514. LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_object_def: no scalar\n"));
  54515. od->instance = MIB_OBJECT_NONE;
  54516. 80313ae: 2300 movs r3, #0
  54517. 80313b0: 7013 strb r3, [r2, #0]
  54518. 80313b2: bd10 pop {r4, pc}
  54519. 80313b4: 7efffefc .word 0x7efffefc
  54520. 080313b8 <snmp_set_test>:
  54521. u8_t id, set_ok;
  54522. LWIP_UNUSED_ARG(len);
  54523. set_ok = 0;
  54524. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  54525. id = (u8_t)od->id_inst_ptr[0];
  54526. 80313b8: 6883 ldr r3, [r0, #8]
  54527. if (id == 30)
  54528. 80313ba: 781b ldrb r3, [r3, #0]
  54529. 80313bc: 2b1e cmp r3, #30
  54530. 80313be: d10f bne.n 80313e0 <snmp_set_test+0x28>
  54531. {
  54532. /* snmpEnableAuthenTraps */
  54533. s32_t *sint_ptr = (s32_t*)value;
  54534. if (snmpenableauthentraps_ptr != &snmpenableauthentraps_default)
  54535. 80313c0: 4b08 ldr r3, [pc, #32] ; (80313e4 <snmp_set_test+0x2c>)
  54536. 80313c2: 6810 ldr r0, [r2, #0]
  54537. 80313c4: 6819 ldr r1, [r3, #0]
  54538. 80313c6: 4b08 ldr r3, [pc, #32] ; (80313e8 <snmp_set_test+0x30>)
  54539. 80313c8: 4299 cmp r1, r3
  54540. 80313ca: d005 beq.n 80313d8 <snmp_set_test+0x20>
  54541. {
  54542. /* we should have writable non-volatile mem here */
  54543. if ((*sint_ptr == 1) || (*sint_ptr == 2))
  54544. 80313cc: 3801 subs r0, #1
  54545. snmp_set_test(struct obj_def *od, u16_t len, void *value)
  54546. {
  54547. u8_t id, set_ok;
  54548. LWIP_UNUSED_ARG(len);
  54549. set_ok = 0;
  54550. 80313ce: 2801 cmp r0, #1
  54551. 80313d0: bf8c ite hi
  54552. 80313d2: 2000 movhi r0, #0
  54553. 80313d4: 2001 movls r0, #1
  54554. 80313d6: 4770 bx lr
  54555. 80313d8: 1e83 subs r3, r0, #2
  54556. 80313da: 4258 negs r0, r3
  54557. 80313dc: 4158 adcs r0, r3
  54558. 80313de: 4770 bx lr
  54559. 80313e0: 2000 movs r0, #0
  54560. set_ok = 1;
  54561. }
  54562. }
  54563. }
  54564. return set_ok;
  54565. }
  54566. 80313e2: 4770 bx lr
  54567. 80313e4: 20001768 .word 0x20001768
  54568. 80313e8: 08040084 .word 0x08040084
  54569. 080313ec <ocstrncpy>:
  54570. * @param dst points to destination
  54571. * @param src points to source
  54572. * @param n number of octets to copy.
  54573. */
  54574. void ocstrncpy(u8_t *dst, u8_t *src, u16_t n)
  54575. {
  54576. 80313ec: b510 push {r4, lr}
  54577. u16_t i = n;
  54578. while (i > 0) {
  54579. 80313ee: 2300 movs r3, #0
  54580. 80313f0: e002 b.n 80313f8 <ocstrncpy+0xc>
  54581. i--;
  54582. *dst++ = *src++;
  54583. 80313f2: 5ccc ldrb r4, [r1, r3]
  54584. 80313f4: 54c4 strb r4, [r0, r3]
  54585. 80313f6: 3301 adds r3, #1
  54586. * @param n number of octets to copy.
  54587. */
  54588. void ocstrncpy(u8_t *dst, u8_t *src, u16_t n)
  54589. {
  54590. u16_t i = n;
  54591. while (i > 0) {
  54592. 80313f8: b29c uxth r4, r3
  54593. 80313fa: 42a2 cmp r2, r4
  54594. 80313fc: d1f9 bne.n 80313f2 <ocstrncpy+0x6>
  54595. i--;
  54596. *dst++ = *src++;
  54597. }
  54598. }
  54599. 80313fe: bd10 pop {r4, pc}
  54600. 08031400 <system_set_value>:
  54601. {
  54602. u8_t id;
  54603. LWIP_ASSERT("invalid len", len <= 0xff);
  54604. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  54605. id = (u8_t)od->id_inst_ptr[0];
  54606. 8031400: 6883 ldr r3, [r0, #8]
  54607. switch (id)
  54608. 8031402: 781b ldrb r3, [r3, #0]
  54609. 8031404: 2b05 cmp r3, #5
  54610. return set_ok;
  54611. }
  54612. static void
  54613. system_set_value(struct obj_def *od, u16_t len, void *value)
  54614. {
  54615. 8031406: b510 push {r4, lr}
  54616. 8031408: 460c mov r4, r1
  54617. 803140a: 4611 mov r1, r2
  54618. u8_t id;
  54619. LWIP_ASSERT("invalid len", len <= 0xff);
  54620. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  54621. id = (u8_t)od->id_inst_ptr[0];
  54622. switch (id)
  54623. 803140c: d00a beq.n 8031424 <system_set_value+0x24>
  54624. 803140e: 2b06 cmp r3, #6
  54625. 8031410: d00f beq.n 8031432 <system_set_value+0x32>
  54626. 8031412: 2b04 cmp r3, #4
  54627. 8031414: d115 bne.n 8031442 <system_set_value+0x42>
  54628. {
  54629. case 4: /* sysContact */
  54630. ocstrncpy(syscontact_ptr, (u8_t*)value, len);
  54631. 8031416: 4b0b ldr r3, [pc, #44] ; (8031444 <system_set_value+0x44>)
  54632. 8031418: 4622 mov r2, r4
  54633. 803141a: 6818 ldr r0, [r3, #0]
  54634. 803141c: f7ff ffe6 bl 80313ec <ocstrncpy>
  54635. *syscontact_len_ptr = (u8_t)len;
  54636. 8031420: 4b09 ldr r3, [pc, #36] ; (8031448 <system_set_value+0x48>)
  54637. 8031422: e00c b.n 803143e <system_set_value+0x3e>
  54638. break;
  54639. case 5: /* sysName */
  54640. ocstrncpy(sysname_ptr, (u8_t*)value, len);
  54641. 8031424: 4b09 ldr r3, [pc, #36] ; (803144c <system_set_value+0x4c>)
  54642. 8031426: 4622 mov r2, r4
  54643. 8031428: 6818 ldr r0, [r3, #0]
  54644. 803142a: f7ff ffdf bl 80313ec <ocstrncpy>
  54645. *sysname_len_ptr = (u8_t)len;
  54646. 803142e: 4b08 ldr r3, [pc, #32] ; (8031450 <system_set_value+0x50>)
  54647. 8031430: e005 b.n 803143e <system_set_value+0x3e>
  54648. break;
  54649. case 6: /* sysLocation */
  54650. ocstrncpy(syslocation_ptr, (u8_t*)value, len);
  54651. 8031432: 4b08 ldr r3, [pc, #32] ; (8031454 <system_set_value+0x54>)
  54652. 8031434: 4622 mov r2, r4
  54653. 8031436: 6818 ldr r0, [r3, #0]
  54654. 8031438: f7ff ffd8 bl 80313ec <ocstrncpy>
  54655. *syslocation_len_ptr = (u8_t)len;
  54656. 803143c: 4b06 ldr r3, [pc, #24] ; (8031458 <system_set_value+0x58>)
  54657. 803143e: 681b ldr r3, [r3, #0]
  54658. 8031440: 701c strb r4, [r3, #0]
  54659. 8031442: bd10 pop {r4, pc}
  54660. 8031444: 200017e4 .word 0x200017e4
  54661. 8031448: 20001668 .word 0x20001668
  54662. 803144c: 20001770 .word 0x20001770
  54663. 8031450: 20001664 .word 0x20001664
  54664. 8031454: 200018fc .word 0x200018fc
  54665. 8031458: 20001850 .word 0x20001850
  54666. 0803145c <objectidncpy>:
  54667. *
  54668. * @param dst points to destination
  54669. * @param src points to source
  54670. * @param n number of sub identifiers to copy.
  54671. */
  54672. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  54673. 803145c: 3904 subs r1, #4
  54674. {
  54675. u8_t i = n;
  54676. while(i > 0) {
  54677. 803145e: e005 b.n 803146c <objectidncpy+0x10>
  54678. i--;
  54679. *dst++ = *src++;
  54680. 8031460: f851 3f04 ldr.w r3, [r1, #4]!
  54681. */
  54682. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  54683. {
  54684. u8_t i = n;
  54685. while(i > 0) {
  54686. i--;
  54687. 8031464: 3a01 subs r2, #1
  54688. *dst++ = *src++;
  54689. 8031466: f840 3b04 str.w r3, [r0], #4
  54690. */
  54691. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  54692. {
  54693. u8_t i = n;
  54694. while(i > 0) {
  54695. i--;
  54696. 803146a: b2d2 uxtb r2, r2
  54697. * @param n number of sub identifiers to copy.
  54698. */
  54699. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  54700. {
  54701. u8_t i = n;
  54702. while(i > 0) {
  54703. 803146c: 2a00 cmp r2, #0
  54704. 803146e: d1f7 bne.n 8031460 <objectidncpy+0x4>
  54705. i--;
  54706. *dst++ = *src++;
  54707. }
  54708. }
  54709. 8031470: 4770 bx lr
  54710. 8031472: 0000 movs r0, r0
  54711. 08031474 <ifentry_get_value>:
  54712. * @param len return value space (in bytes)
  54713. * @param value points to (varbind) space to copy value into.
  54714. */
  54715. static void
  54716. ifentry_get_value(struct obj_def *od, u16_t len, void *value)
  54717. {
  54718. 8031474: b573 push {r0, r1, r4, r5, r6, lr}
  54719. struct netif *netif;
  54720. u8_t id;
  54721. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  54722. 8031476: 6883 ldr r3, [r0, #8]
  54723. * @param len return value space (in bytes)
  54724. * @param value points to (varbind) space to copy value into.
  54725. */
  54726. static void
  54727. ifentry_get_value(struct obj_def *od, u16_t len, void *value)
  54728. {
  54729. 8031478: 4606 mov r6, r0
  54730. 803147a: 460d mov r5, r1
  54731. struct netif *netif;
  54732. u8_t id;
  54733. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  54734. 803147c: 6858 ldr r0, [r3, #4]
  54735. 803147e: a901 add r1, sp, #4
  54736. * @param len return value space (in bytes)
  54737. * @param value points to (varbind) space to copy value into.
  54738. */
  54739. static void
  54740. ifentry_get_value(struct obj_def *od, u16_t len, void *value)
  54741. {
  54742. 8031480: 4614 mov r4, r2
  54743. struct netif *netif;
  54744. u8_t id;
  54745. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  54746. 8031482: f000 fd93 bl 8031fac <snmp_ifindextonetif>
  54747. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  54748. id = (u8_t)od->id_inst_ptr[0];
  54749. 8031486: 68b3 ldr r3, [r6, #8]
  54750. switch (id)
  54751. 8031488: 781a ldrb r2, [r3, #0]
  54752. 803148a: 3a01 subs r2, #1
  54753. 803148c: 2a15 cmp r2, #21
  54754. 803148e: d85c bhi.n 803154a <ifentry_get_value+0xd6>
  54755. 8031490: e8df f002 tbb [pc, r2]
  54756. 8031494: 15110d0b .word 0x15110d0b
  54757. 8031498: 2e221b18 .word 0x2e221b18
  54758. 803149c: 403d3a37 .word 0x403d3a37
  54759. 80314a0: 46525243 .word 0x46525243
  54760. 80314a4: 524f4c49 .word 0x524f4c49
  54761. 80314a8: 5552 .short 0x5552
  54762. {
  54763. case 1: /* ifIndex */
  54764. {
  54765. s32_t *sint_ptr = (s32_t*)value;
  54766. *sint_ptr = od->id_inst_ptr[1];
  54767. 80314aa: 685b ldr r3, [r3, #4]
  54768. 80314ac: e045 b.n 803153a <ifentry_get_value+0xc6>
  54769. }
  54770. break;
  54771. case 2: /* ifDescr */
  54772. ocstrncpy((u8_t*)value, (u8_t*)netif->name, len);
  54773. 80314ae: 9901 ldr r1, [sp, #4]
  54774. 80314b0: 4620 mov r0, r4
  54775. 80314b2: 312e adds r1, #46 ; 0x2e
  54776. 80314b4: e00c b.n 80314d0 <ifentry_get_value+0x5c>
  54777. break;
  54778. case 3: /* ifType */
  54779. {
  54780. s32_t *sint_ptr = (s32_t*)value;
  54781. *sint_ptr = netif->link_type;
  54782. 80314b6: 9b01 ldr r3, [sp, #4]
  54783. 80314b8: f893 3031 ldrb.w r3, [r3, #49] ; 0x31
  54784. 80314bc: e03d b.n 803153a <ifentry_get_value+0xc6>
  54785. }
  54786. break;
  54787. case 4: /* ifMtu */
  54788. {
  54789. s32_t *sint_ptr = (s32_t*)value;
  54790. *sint_ptr = netif->mtu;
  54791. 80314be: 9b01 ldr r3, [sp, #4]
  54792. 80314c0: 8c9b ldrh r3, [r3, #36] ; 0x24
  54793. 80314c2: e03a b.n 803153a <ifentry_get_value+0xc6>
  54794. }
  54795. break;
  54796. case 5: /* ifSpeed */
  54797. {
  54798. u32_t *uint_ptr = (u32_t*)value;
  54799. *uint_ptr = netif->link_speed;
  54800. 80314c4: 9b01 ldr r3, [sp, #4]
  54801. 80314c6: 6b5b ldr r3, [r3, #52] ; 0x34
  54802. 80314c8: e037 b.n 803153a <ifentry_get_value+0xc6>
  54803. }
  54804. break;
  54805. case 6: /* ifPhysAddress */
  54806. ocstrncpy((u8_t*)value, netif->hwaddr, len);
  54807. 80314ca: 9901 ldr r1, [sp, #4]
  54808. 80314cc: 4620 mov r0, r4
  54809. 80314ce: 3127 adds r1, #39 ; 0x27
  54810. 80314d0: 462a mov r2, r5
  54811. 80314d2: f7ff ff8b bl 80313ec <ocstrncpy>
  54812. break;
  54813. 80314d6: e038 b.n 803154a <ifentry_get_value+0xd6>
  54814. case 7: /* ifAdminStatus */
  54815. {
  54816. s32_t *sint_ptr = (s32_t*)value;
  54817. if (netif_is_up(netif))
  54818. 80314d8: 9b01 ldr r3, [sp, #4]
  54819. 80314da: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
  54820. 80314de: 07d9 lsls r1, r3, #31
  54821. 80314e0: d50d bpl.n 80314fe <ifentry_get_value+0x8a>
  54822. {
  54823. if (netif_is_link_up(netif))
  54824. 80314e2: f003 0310 and.w r3, r3, #16
  54825. 80314e6: b2db uxtb r3, r3
  54826. 80314e8: b103 cbz r3, 80314ec <ifentry_get_value+0x78>
  54827. 80314ea: e006 b.n 80314fa <ifentry_get_value+0x86>
  54828. {
  54829. *sint_ptr = 1; /* up */
  54830. }
  54831. else
  54832. {
  54833. *sint_ptr = 7; /* lowerLayerDown */
  54834. 80314ec: 2307 movs r3, #7
  54835. 80314ee: e024 b.n 803153a <ifentry_get_value+0xc6>
  54836. }
  54837. break;
  54838. case 8: /* ifOperStatus */
  54839. {
  54840. s32_t *sint_ptr = (s32_t*)value;
  54841. if (netif_is_up(netif))
  54842. 80314f0: 9b01 ldr r3, [sp, #4]
  54843. 80314f2: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
  54844. 80314f6: 07da lsls r2, r3, #31
  54845. 80314f8: d501 bpl.n 80314fe <ifentry_get_value+0x8a>
  54846. {
  54847. *sint_ptr = 1;
  54848. 80314fa: 2301 movs r3, #1
  54849. 80314fc: e01d b.n 803153a <ifentry_get_value+0xc6>
  54850. }
  54851. else
  54852. {
  54853. *sint_ptr = 2;
  54854. 80314fe: 2302 movs r3, #2
  54855. 8031500: e01b b.n 803153a <ifentry_get_value+0xc6>
  54856. }
  54857. break;
  54858. case 9: /* ifLastChange */
  54859. {
  54860. u32_t *uint_ptr = (u32_t*)value;
  54861. *uint_ptr = netif->ts;
  54862. 8031502: 9b01 ldr r3, [sp, #4]
  54863. 8031504: 6b9b ldr r3, [r3, #56] ; 0x38
  54864. 8031506: e018 b.n 803153a <ifentry_get_value+0xc6>
  54865. }
  54866. break;
  54867. case 10: /* ifInOctets */
  54868. {
  54869. u32_t *uint_ptr = (u32_t*)value;
  54870. *uint_ptr = netif->ifinoctets;
  54871. 8031508: 9b01 ldr r3, [sp, #4]
  54872. 803150a: 6bdb ldr r3, [r3, #60] ; 0x3c
  54873. 803150c: e015 b.n 803153a <ifentry_get_value+0xc6>
  54874. }
  54875. break;
  54876. case 11: /* ifInUcastPkts */
  54877. {
  54878. u32_t *uint_ptr = (u32_t*)value;
  54879. *uint_ptr = netif->ifinucastpkts;
  54880. 803150e: 9b01 ldr r3, [sp, #4]
  54881. 8031510: 6c1b ldr r3, [r3, #64] ; 0x40
  54882. 8031512: e012 b.n 803153a <ifentry_get_value+0xc6>
  54883. }
  54884. break;
  54885. case 12: /* ifInNUcastPkts */
  54886. {
  54887. u32_t *uint_ptr = (u32_t*)value;
  54888. *uint_ptr = netif->ifinnucastpkts;
  54889. 8031514: 9b01 ldr r3, [sp, #4]
  54890. 8031516: 6c5b ldr r3, [r3, #68] ; 0x44
  54891. 8031518: e00f b.n 803153a <ifentry_get_value+0xc6>
  54892. }
  54893. break;
  54894. case 13: /* ifInDiscarts */
  54895. {
  54896. u32_t *uint_ptr = (u32_t*)value;
  54897. *uint_ptr = netif->ifindiscards;
  54898. 803151a: 9b01 ldr r3, [sp, #4]
  54899. 803151c: 6c9b ldr r3, [r3, #72] ; 0x48
  54900. 803151e: e00c b.n 803153a <ifentry_get_value+0xc6>
  54901. }
  54902. break;
  54903. case 16: /* ifOutOctets */
  54904. {
  54905. u32_t *uint_ptr = (u32_t*)value;
  54906. *uint_ptr = netif->ifoutoctets;
  54907. 8031520: 9b01 ldr r3, [sp, #4]
  54908. 8031522: 6cdb ldr r3, [r3, #76] ; 0x4c
  54909. 8031524: e009 b.n 803153a <ifentry_get_value+0xc6>
  54910. }
  54911. break;
  54912. case 17: /* ifOutUcastPkts */
  54913. {
  54914. u32_t *uint_ptr = (u32_t*)value;
  54915. *uint_ptr = netif->ifoutucastpkts;
  54916. 8031526: 9b01 ldr r3, [sp, #4]
  54917. 8031528: 6d1b ldr r3, [r3, #80] ; 0x50
  54918. 803152a: e006 b.n 803153a <ifentry_get_value+0xc6>
  54919. }
  54920. break;
  54921. case 18: /* ifOutNUcastPkts */
  54922. {
  54923. u32_t *uint_ptr = (u32_t*)value;
  54924. *uint_ptr = netif->ifoutnucastpkts;
  54925. 803152c: 9b01 ldr r3, [sp, #4]
  54926. 803152e: 6d5b ldr r3, [r3, #84] ; 0x54
  54927. 8031530: e003 b.n 803153a <ifentry_get_value+0xc6>
  54928. }
  54929. break;
  54930. case 19: /* ifOutDiscarts */
  54931. {
  54932. u32_t *uint_ptr = (u32_t*)value;
  54933. *uint_ptr = netif->ifoutdiscards;
  54934. 8031532: 9b01 ldr r3, [sp, #4]
  54935. 8031534: 6d9b ldr r3, [r3, #88] ; 0x58
  54936. 8031536: e000 b.n 803153a <ifentry_get_value+0xc6>
  54937. break;
  54938. case 21: /* ifOutQLen */
  54939. /** @todo figure out if this must be 0 (no queue) or 1? */
  54940. {
  54941. u32_t *uint_ptr = (u32_t*)value;
  54942. *uint_ptr = 0;
  54943. 8031538: 2300 movs r3, #0
  54944. 803153a: 6023 str r3, [r4, #0]
  54945. }
  54946. break;
  54947. 803153c: e005 b.n 803154a <ifentry_get_value+0xd6>
  54948. case 22: /* ifSpecific */
  54949. objectidncpy((s32_t*)value, (s32_t*)ifspecific.id, (u8_t)(len / sizeof(s32_t)));
  54950. 803153e: 4620 mov r0, r4
  54951. 8031540: 4902 ldr r1, [pc, #8] ; (803154c <ifentry_get_value+0xd8>)
  54952. 8031542: f3c5 0287 ubfx r2, r5, #2, #8
  54953. 8031546: f7ff ff89 bl 803145c <objectidncpy>
  54954. break;
  54955. };
  54956. }
  54957. 803154a: bd7c pop {r2, r3, r4, r5, r6, pc}
  54958. 803154c: 0804010c .word 0x0804010c
  54959. 08031550 <ip_rteentry_get_value>:
  54960. }
  54961. }
  54962. static void
  54963. ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
  54964. {
  54965. 8031550: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  54966. struct netif *netif;
  54967. ip_addr_t dest;
  54968. s32_t *ident;
  54969. u8_t id;
  54970. ident = od->id_inst_ptr;
  54971. 8031552: 6885 ldr r5, [r0, #8]
  54972. }
  54973. }
  54974. static void
  54975. ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
  54976. {
  54977. 8031554: 460f mov r7, r1
  54978. ip_addr_t dest;
  54979. s32_t *ident;
  54980. u8_t id;
  54981. ident = od->id_inst_ptr;
  54982. snmp_oidtoip(&ident[1], &dest);
  54983. 8031556: 1d28 adds r0, r5, #4
  54984. 8031558: a901 add r1, sp, #4
  54985. }
  54986. }
  54987. static void
  54988. ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
  54989. {
  54990. 803155a: 4614 mov r4, r2
  54991. ip_addr_t dest;
  54992. s32_t *ident;
  54993. u8_t id;
  54994. ident = od->id_inst_ptr;
  54995. snmp_oidtoip(&ident[1], &dest);
  54996. 803155c: f000 fd44 bl 8031fe8 <snmp_oidtoip>
  54997. if (ip_addr_isany(&dest))
  54998. 8031560: 9b01 ldr r3, [sp, #4]
  54999. 8031562: b91b cbnz r3, 803156c <ip_rteentry_get_value+0x1c>
  55000. {
  55001. /* ip_route() uses default netif for default route */
  55002. netif = netif_default;
  55003. 8031564: 4a23 ldr r2, [pc, #140] ; (80315f4 <ip_rteentry_get_value+0xa4>)
  55004. 8031566: 6810 ldr r0, [r2, #0]
  55005. !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
  55006. {
  55007. netif = netif->next;
  55008. }
  55009. }
  55010. if (netif != NULL)
  55011. 8031568: b960 cbnz r0, 8031584 <ip_rteentry_get_value+0x34>
  55012. 803156a: e041 b.n 80315f0 <ip_rteentry_get_value+0xa0>
  55013. netif = netif_default;
  55014. }
  55015. else
  55016. {
  55017. /* not using ip_route(), need exact match! */
  55018. netif = netif_list;
  55019. 803156c: 4a22 ldr r2, [pc, #136] ; (80315f8 <ip_rteentry_get_value+0xa8>)
  55020. 803156e: 6810 ldr r0, [r2, #0]
  55021. while ((netif != NULL) &&
  55022. 8031570: e000 b.n 8031574 <ip_rteentry_get_value+0x24>
  55023. !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
  55024. {
  55025. netif = netif->next;
  55026. 8031572: 6800 ldr r0, [r0, #0]
  55027. }
  55028. else
  55029. {
  55030. /* not using ip_route(), need exact match! */
  55031. netif = netif_list;
  55032. while ((netif != NULL) &&
  55033. 8031574: 2800 cmp r0, #0
  55034. 8031576: d03b beq.n 80315f0 <ip_rteentry_get_value+0xa0>
  55035. !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
  55036. 8031578: 6846 ldr r6, [r0, #4]
  55037. 803157a: ea83 0206 eor.w r2, r3, r6
  55038. 803157e: 6886 ldr r6, [r0, #8]
  55039. }
  55040. else
  55041. {
  55042. /* not using ip_route(), need exact match! */
  55043. netif = netif_list;
  55044. while ((netif != NULL) &&
  55045. 8031580: 4232 tst r2, r6
  55046. 8031582: d1f6 bne.n 8031572 <ip_rteentry_get_value+0x22>
  55047. }
  55048. if (netif != NULL)
  55049. {
  55050. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  55051. id = (u8_t)ident[0];
  55052. switch (id)
  55053. 8031584: 782d ldrb r5, [r5, #0]
  55054. 8031586: 3d01 subs r5, #1
  55055. 8031588: 2d0c cmp r5, #12
  55056. 803158a: d831 bhi.n 80315f0 <ip_rteentry_get_value+0xa0>
  55057. 803158c: e8df f005 tbb [pc, r5]
  55058. 8031590: 14110d07 .word 0x14110d07
  55059. 8031594: 1c171414 .word 0x1c171414
  55060. 8031598: 14252321 .word 0x14252321
  55061. 803159c: 2a .byte 0x2a
  55062. 803159d: 00 .byte 0x00
  55063. {
  55064. case 1: /* ipRouteDest */
  55065. {
  55066. ip_addr_t *dst = (ip_addr_t*)value;
  55067. if (ip_addr_isany(&dest))
  55068. 803159e: b903 cbnz r3, 80315a2 <ip_rteentry_get_value+0x52>
  55069. 80315a0: e01e b.n 80315e0 <ip_rteentry_get_value+0x90>
  55070. ip_addr_set_zero(dst);
  55071. }
  55072. else
  55073. {
  55074. /* netifs have netaddress dest */
  55075. ip_addr_get_network(dst, &netif->ip_addr, &netif->netmask);
  55076. 80315a2: 6882 ldr r2, [r0, #8]
  55077. 80315a4: 6843 ldr r3, [r0, #4]
  55078. 80315a6: 4013 ands r3, r2
  55079. 80315a8: e01a b.n 80315e0 <ip_rteentry_get_value+0x90>
  55080. break;
  55081. case 2: /* ipRouteIfIndex */
  55082. {
  55083. s32_t *sint_ptr = (s32_t*)value;
  55084. snmp_netiftoifindex(netif, sint_ptr);
  55085. 80315aa: 4621 mov r1, r4
  55086. 80315ac: f000 fd0c bl 8031fc8 <snmp_netiftoifindex>
  55087. }
  55088. break;
  55089. 80315b0: e01e b.n 80315f0 <ip_rteentry_get_value+0xa0>
  55090. case 3: /* ipRouteMetric1 */
  55091. {
  55092. s32_t *sint_ptr = (s32_t*)value;
  55093. if (ip_addr_isany(&dest))
  55094. 80315b2: b983 cbnz r3, 80315d6 <ip_rteentry_get_value+0x86>
  55095. {
  55096. /* default rte has metric 1 */
  55097. *sint_ptr = 1;
  55098. 80315b4: 2301 movs r3, #1
  55099. 80315b6: e013 b.n 80315e0 <ip_rteentry_get_value+0x90>
  55100. case 6: /* ipRouteMetric4 */
  55101. case 12: /* ipRouteMetric5 */
  55102. {
  55103. s32_t *sint_ptr = (s32_t*)value;
  55104. /* not used */
  55105. *sint_ptr = -1;
  55106. 80315b8: f04f 33ff mov.w r3, #4294967295
  55107. 80315bc: e010 b.n 80315e0 <ip_rteentry_get_value+0x90>
  55108. break;
  55109. case 7: /* ipRouteNextHop */
  55110. {
  55111. ip_addr_t *dst = (ip_addr_t*)value;
  55112. if (ip_addr_isany(&dest))
  55113. 80315be: b90b cbnz r3, 80315c4 <ip_rteentry_get_value+0x74>
  55114. {
  55115. /* default rte: gateway */
  55116. *dst = netif->gw;
  55117. 80315c0: 68c3 ldr r3, [r0, #12]
  55118. 80315c2: e00d b.n 80315e0 <ip_rteentry_get_value+0x90>
  55119. }
  55120. else
  55121. {
  55122. /* other rtes: netif ip_addr */
  55123. *dst = netif->ip_addr;
  55124. 80315c4: 6843 ldr r3, [r0, #4]
  55125. 80315c6: e00b b.n 80315e0 <ip_rteentry_get_value+0x90>
  55126. break;
  55127. case 8: /* ipRouteType */
  55128. {
  55129. s32_t *sint_ptr = (s32_t*)value;
  55130. if (ip_addr_isany(&dest))
  55131. 80315c8: b90b cbnz r3, 80315ce <ip_rteentry_get_value+0x7e>
  55132. {
  55133. /* default rte is indirect */
  55134. *sint_ptr = 4;
  55135. 80315ca: 2304 movs r3, #4
  55136. 80315cc: e008 b.n 80315e0 <ip_rteentry_get_value+0x90>
  55137. }
  55138. else
  55139. {
  55140. /* other rtes are direct */
  55141. *sint_ptr = 3;
  55142. 80315ce: 2303 movs r3, #3
  55143. 80315d0: e006 b.n 80315e0 <ip_rteentry_get_value+0x90>
  55144. break;
  55145. case 9: /* ipRouteProto */
  55146. {
  55147. s32_t *sint_ptr = (s32_t*)value;
  55148. /* locally defined routes */
  55149. *sint_ptr = 2;
  55150. 80315d2: 2302 movs r3, #2
  55151. 80315d4: e004 b.n 80315e0 <ip_rteentry_get_value+0x90>
  55152. case 10: /* ipRouteAge */
  55153. {
  55154. s32_t *sint_ptr = (s32_t*)value;
  55155. /** @todo (sysuptime - timestamp last change) / 100
  55156. @see snmp_insert_iprteidx_tree() */
  55157. *sint_ptr = 0;
  55158. 80315d6: 2300 movs r3, #0
  55159. 80315d8: e002 b.n 80315e0 <ip_rteentry_get_value+0x90>
  55160. break;
  55161. case 11: /* ipRouteMask */
  55162. {
  55163. ip_addr_t *dst = (ip_addr_t*)value;
  55164. if (ip_addr_isany(&dest))
  55165. 80315da: b903 cbnz r3, 80315de <ip_rteentry_get_value+0x8e>
  55166. 80315dc: e000 b.n 80315e0 <ip_rteentry_get_value+0x90>
  55167. ip_addr_set_zero(dst);
  55168. }
  55169. else
  55170. {
  55171. /* other rtes use netmask */
  55172. *dst = netif->netmask;
  55173. 80315de: 6883 ldr r3, [r0, #8]
  55174. 80315e0: 6023 str r3, [r4, #0]
  55175. 80315e2: e005 b.n 80315f0 <ip_rteentry_get_value+0xa0>
  55176. }
  55177. }
  55178. break;
  55179. case 13: /* ipRouteInfo */
  55180. objectidncpy((s32_t*)value, (s32_t*)iprouteinfo.id, (u8_t)(len / sizeof(s32_t)));
  55181. 80315e4: 4620 mov r0, r4
  55182. 80315e6: 4905 ldr r1, [pc, #20] ; (80315fc <ip_rteentry_get_value+0xac>)
  55183. 80315e8: f3c7 0287 ubfx r2, r7, #2, #8
  55184. 80315ec: f7ff ff36 bl 803145c <objectidncpy>
  55185. break;
  55186. }
  55187. }
  55188. }
  55189. 80315f0: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
  55190. 80315f2: bf00 nop
  55191. 80315f4: 20010fd4 .word 0x20010fd4
  55192. 80315f8: 20010fd0 .word 0x20010fd0
  55193. 80315fc: 0803ff20 .word 0x0803ff20
  55194. 08031600 <snmp_set_sysdesr>:
  55195. * @param str if non-NULL then copy str pointer
  55196. * @param len points to string length, excluding zero terminator
  55197. */
  55198. void snmp_set_sysdesr(u8_t *str, u8_t *len)
  55199. {
  55200. if (str != NULL)
  55201. 8031600: b118 cbz r0, 803160a <snmp_set_sysdesr+0xa>
  55202. {
  55203. sysdescr_ptr = str;
  55204. 8031602: 4b02 ldr r3, [pc, #8] ; (803160c <snmp_set_sysdesr+0xc>)
  55205. 8031604: 6018 str r0, [r3, #0]
  55206. sysdescr_len_ptr = len;
  55207. 8031606: 4b02 ldr r3, [pc, #8] ; (8031610 <snmp_set_sysdesr+0x10>)
  55208. 8031608: 6019 str r1, [r3, #0]
  55209. 803160a: 4770 bx lr
  55210. 803160c: 20001790 .word 0x20001790
  55211. 8031610: 2000180c .word 0x2000180c
  55212. 08031614 <snmp_get_sysuptime>:
  55213. {
  55214. sysuptime+=value;
  55215. }
  55216. void snmp_get_sysuptime(u32_t *value)
  55217. {
  55218. 8031614: b510 push {r4, lr}
  55219. 8031616: 4604 mov r4, r0
  55220. SNMP_GET_SYSUPTIME(sysuptime);
  55221. 8031618: f003 f975 bl 8034906 <sys_now>
  55222. 803161c: 230a movs r3, #10
  55223. 803161e: 4a03 ldr r2, [pc, #12] ; (803162c <snmp_get_sysuptime+0x18>)
  55224. 8031620: fbb0 f0f3 udiv r0, r0, r3
  55225. 8031624: 6010 str r0, [r2, #0]
  55226. *value = sysuptime;
  55227. 8031626: 6020 str r0, [r4, #0]
  55228. 8031628: bd10 pop {r4, pc}
  55229. 803162a: bf00 nop
  55230. 803162c: 2000e210 .word 0x2000e210
  55231. 08031630 <system_get_value>:
  55232. * @param len return value space (in bytes)
  55233. * @param value points to (varbind) space to copy value into.
  55234. */
  55235. static void
  55236. system_get_value(struct obj_def *od, u16_t len, void *value)
  55237. {
  55238. 8031630: 4613 mov r3, r2
  55239. u8_t id;
  55240. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  55241. id = (u8_t)od->id_inst_ptr[0];
  55242. 8031632: 6882 ldr r2, [r0, #8]
  55243. switch (id)
  55244. 8031634: 7812 ldrb r2, [r2, #0]
  55245. 8031636: 3a01 subs r2, #1
  55246. * @param len return value space (in bytes)
  55247. * @param value points to (varbind) space to copy value into.
  55248. */
  55249. static void
  55250. system_get_value(struct obj_def *od, u16_t len, void *value)
  55251. {
  55252. 8031638: b510 push {r4, lr}
  55253. 803163a: 460c mov r4, r1
  55254. u8_t id;
  55255. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  55256. id = (u8_t)od->id_inst_ptr[0];
  55257. switch (id)
  55258. 803163c: 2a06 cmp r2, #6
  55259. 803163e: d825 bhi.n 803168c <system_get_value+0x5c>
  55260. 8031640: e8df f002 tbb [pc, r2]
  55261. 8031644: 140f0704 .word 0x140f0704
  55262. 8031648: 1a17 .short 0x1a17
  55263. 803164a: 22 .byte 0x22
  55264. 803164b: 00 .byte 0x00
  55265. {
  55266. case 1: /* sysDescr */
  55267. ocstrncpy((u8_t*)value, sysdescr_ptr, len);
  55268. 803164c: 4618 mov r0, r3
  55269. 803164e: 4b10 ldr r3, [pc, #64] ; (8031690 <system_get_value+0x60>)
  55270. 8031650: e014 b.n 803167c <system_get_value+0x4c>
  55271. break;
  55272. case 2: /* sysObjectID */
  55273. objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t)));
  55274. 8031652: 4910 ldr r1, [pc, #64] ; (8031694 <system_get_value+0x64>)
  55275. 8031654: 4618 mov r0, r3
  55276. 8031656: f3c4 0287 ubfx r2, r4, #2, #8
  55277. s32_t *sint_ptr = (s32_t*)value;
  55278. *sint_ptr = sysservices;
  55279. }
  55280. break;
  55281. };
  55282. }
  55283. 803165a: e8bd 4010 ldmia.w sp!, {r4, lr}
  55284. {
  55285. case 1: /* sysDescr */
  55286. ocstrncpy((u8_t*)value, sysdescr_ptr, len);
  55287. break;
  55288. case 2: /* sysObjectID */
  55289. objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t)));
  55290. 803165e: f7ff befd b.w 803145c <objectidncpy>
  55291. break;
  55292. case 3: /* sysUpTime */
  55293. {
  55294. snmp_get_sysuptime((u32_t*)value);
  55295. 8031662: 4618 mov r0, r3
  55296. s32_t *sint_ptr = (s32_t*)value;
  55297. *sint_ptr = sysservices;
  55298. }
  55299. break;
  55300. };
  55301. }
  55302. 8031664: e8bd 4010 ldmia.w sp!, {r4, lr}
  55303. case 2: /* sysObjectID */
  55304. objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t)));
  55305. break;
  55306. case 3: /* sysUpTime */
  55307. {
  55308. snmp_get_sysuptime((u32_t*)value);
  55309. 8031668: f7ff bfd4 b.w 8031614 <snmp_get_sysuptime>
  55310. }
  55311. break;
  55312. case 4: /* sysContact */
  55313. ocstrncpy((u8_t*)value, syscontact_ptr, len);
  55314. 803166c: 4618 mov r0, r3
  55315. 803166e: 4b0a ldr r3, [pc, #40] ; (8031698 <system_get_value+0x68>)
  55316. 8031670: e004 b.n 803167c <system_get_value+0x4c>
  55317. break;
  55318. case 5: /* sysName */
  55319. ocstrncpy((u8_t*)value, sysname_ptr, len);
  55320. 8031672: 4618 mov r0, r3
  55321. 8031674: 4b09 ldr r3, [pc, #36] ; (803169c <system_get_value+0x6c>)
  55322. 8031676: e001 b.n 803167c <system_get_value+0x4c>
  55323. break;
  55324. case 6: /* sysLocation */
  55325. ocstrncpy((u8_t*)value, syslocation_ptr, len);
  55326. 8031678: 4618 mov r0, r3
  55327. 803167a: 4b09 ldr r3, [pc, #36] ; (80316a0 <system_get_value+0x70>)
  55328. 803167c: 6819 ldr r1, [r3, #0]
  55329. 803167e: 4622 mov r2, r4
  55330. s32_t *sint_ptr = (s32_t*)value;
  55331. *sint_ptr = sysservices;
  55332. }
  55333. break;
  55334. };
  55335. }
  55336. 8031680: e8bd 4010 ldmia.w sp!, {r4, lr}
  55337. break;
  55338. case 5: /* sysName */
  55339. ocstrncpy((u8_t*)value, sysname_ptr, len);
  55340. break;
  55341. case 6: /* sysLocation */
  55342. ocstrncpy((u8_t*)value, syslocation_ptr, len);
  55343. 8031684: f7ff beb2 b.w 80313ec <ocstrncpy>
  55344. break;
  55345. case 7: /* sysServices */
  55346. {
  55347. s32_t *sint_ptr = (s32_t*)value;
  55348. *sint_ptr = sysservices;
  55349. 8031688: 2248 movs r2, #72 ; 0x48
  55350. 803168a: 601a str r2, [r3, #0]
  55351. 803168c: bd10 pop {r4, pc}
  55352. 803168e: bf00 nop
  55353. 8031690: 20001790 .word 0x20001790
  55354. 8031694: 200016c0 .word 0x200016c0
  55355. 8031698: 200017e4 .word 0x200017e4
  55356. 803169c: 20001770 .word 0x20001770
  55357. 80316a0: 200018fc .word 0x200018fc
  55358. 080316a4 <snmp_set_syscontact>:
  55359. * @param ocstr if non-NULL then copy str pointer
  55360. * @param ocstrlen points to string length, excluding zero terminator
  55361. */
  55362. void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen)
  55363. {
  55364. if (ocstr != NULL)
  55365. 80316a4: b118 cbz r0, 80316ae <snmp_set_syscontact+0xa>
  55366. {
  55367. syscontact_ptr = ocstr;
  55368. 80316a6: 4b02 ldr r3, [pc, #8] ; (80316b0 <snmp_set_syscontact+0xc>)
  55369. 80316a8: 6018 str r0, [r3, #0]
  55370. syscontact_len_ptr = ocstrlen;
  55371. 80316aa: 4b02 ldr r3, [pc, #8] ; (80316b4 <snmp_set_syscontact+0x10>)
  55372. 80316ac: 6019 str r1, [r3, #0]
  55373. 80316ae: 4770 bx lr
  55374. 80316b0: 200017e4 .word 0x200017e4
  55375. 80316b4: 20001668 .word 0x20001668
  55376. 080316b8 <snmp_set_syslocation>:
  55377. * @param ocstr if non-NULL then copy str pointer
  55378. * @param ocstrlen points to string length, excluding zero terminator
  55379. */
  55380. void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen)
  55381. {
  55382. if (ocstr != NULL)
  55383. 80316b8: b118 cbz r0, 80316c2 <snmp_set_syslocation+0xa>
  55384. {
  55385. syslocation_ptr = ocstr;
  55386. 80316ba: 4b02 ldr r3, [pc, #8] ; (80316c4 <snmp_set_syslocation+0xc>)
  55387. 80316bc: 6018 str r0, [r3, #0]
  55388. syslocation_len_ptr = ocstrlen;
  55389. 80316be: 4b02 ldr r3, [pc, #8] ; (80316c8 <snmp_set_syslocation+0x10>)
  55390. 80316c0: 6019 str r1, [r3, #0]
  55391. 80316c2: 4770 bx lr
  55392. 80316c4: 200018fc .word 0x200018fc
  55393. 80316c8: 20001850 .word 0x20001850
  55394. 080316cc <snmp_inc_iflist>:
  55395. {
  55396. (ni->ifoutdiscards)++;
  55397. }
  55398. void snmp_inc_iflist(void)
  55399. {
  55400. 80316cc: b507 push {r0, r1, r2, lr}
  55401. struct mib_list_node *if_node = NULL;
  55402. snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
  55403. 80316ce: 4806 ldr r0, [pc, #24] ; (80316e8 <snmp_inc_iflist+0x1c>)
  55404. (ni->ifoutdiscards)++;
  55405. }
  55406. void snmp_inc_iflist(void)
  55407. {
  55408. struct mib_list_node *if_node = NULL;
  55409. 80316d0: aa02 add r2, sp, #8
  55410. snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
  55411. 80316d2: 8b81 ldrh r1, [r0, #28]
  55412. (ni->ifoutdiscards)++;
  55413. }
  55414. void snmp_inc_iflist(void)
  55415. {
  55416. struct mib_list_node *if_node = NULL;
  55417. 80316d4: 2300 movs r3, #0
  55418. 80316d6: f842 3d04 str.w r3, [r2, #-4]!
  55419. snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
  55420. 80316da: 3101 adds r1, #1
  55421. 80316dc: f000 fccc bl 8032078 <snmp_mib_node_insert>
  55422. /* enable getnext traversal on filled table */
  55423. iftable.maxlength = 1;
  55424. 80316e0: 4b02 ldr r3, [pc, #8] ; (80316ec <snmp_inc_iflist+0x20>)
  55425. 80316e2: 2201 movs r2, #1
  55426. 80316e4: 825a strh r2, [r3, #18]
  55427. }
  55428. 80316e6: bd0e pop {r1, r2, r3, pc}
  55429. 80316e8: 2000169c .word 0x2000169c
  55430. 80316ec: 20001814 .word 0x20001814
  55431. 080316f0 <snmp_insert_arpidx_tree>:
  55432. /**
  55433. * Inserts ARP table indexes (.xIfIndex.xNetAddress)
  55434. * into arp table index trees (both atTable and ipNetToMediaTable).
  55435. */
  55436. void snmp_insert_arpidx_tree(struct netif *ni, ip_addr_t *ip)
  55437. {
  55438. 80316f0: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  55439. 80316f4: b086 sub sp, #24
  55440. 80316f6: 460c mov r4, r1
  55441. struct mib_list_node *at_node;
  55442. s32_t arpidx[5];
  55443. u8_t level, tree;
  55444. LWIP_ASSERT("ni != NULL", ni != NULL);
  55445. snmp_netiftoifindex(ni, &arpidx[0]);
  55446. 80316f8: a901 add r1, sp, #4
  55447. 80316fa: f000 fc65 bl 8031fc8 <snmp_netiftoifindex>
  55448. snmp_iptooid(ip, &arpidx[1]);
  55449. 80316fe: 4620 mov r0, r4
  55450. 8031700: a902 add r1, sp, #8
  55451. 8031702: f000 fc7e bl 8032002 <snmp_iptooid>
  55452. for (tree = 0; tree < 2; tree++)
  55453. {
  55454. if (tree == 0)
  55455. {
  55456. at_rn = &arptree_root;
  55457. 8031706: f8df 80a0 ldr.w r8, [pc, #160] ; 80317a8 <snmp_insert_arpidx_tree+0xb8>
  55458. LWIP_ASSERT("ni != NULL", ni != NULL);
  55459. snmp_netiftoifindex(ni, &arpidx[0]);
  55460. snmp_iptooid(ip, &arpidx[1]);
  55461. for (tree = 0; tree < 2; tree++)
  55462. 803170a: 2500 movs r5, #0
  55463. {
  55464. if (tree == 0)
  55465. {
  55466. at_rn = &arptree_root;
  55467. 803170c: 4c1f ldr r4, [pc, #124] ; (803178c <snmp_insert_arpidx_tree+0x9c>)
  55468. else
  55469. {
  55470. at_rn->get_object_def = ip_ntomentry_get_object_def;
  55471. at_rn->get_value = ip_ntomentry_get_value;
  55472. }
  55473. at_rn->set_test = noleafs_set_test;
  55474. 803170e: f8df 909c ldr.w r9, [pc, #156] ; 80317ac <snmp_insert_arpidx_tree+0xbc>
  55475. at_rn->set_value = noleafs_set_value;
  55476. 8031712: f8df a09c ldr.w sl, [pc, #156] ; 80317b0 <snmp_insert_arpidx_tree+0xc0>
  55477. for (tree = 0; tree < 2; tree++)
  55478. {
  55479. if (tree == 0)
  55480. {
  55481. at_rn = &arptree_root;
  55482. 8031716: 2d00 cmp r5, #0
  55483. 8031718: bf18 it ne
  55484. 803171a: 4644 movne r4, r8
  55485. }
  55486. else
  55487. {
  55488. at_rn = &ipntomtree_root;
  55489. 803171c: 2600 movs r6, #0
  55490. }
  55491. for (level = 0; level < 5; level++)
  55492. {
  55493. at_node = NULL;
  55494. 803171e: 2300 movs r3, #0
  55495. 8031720: 9300 str r3, [sp, #0]
  55496. snmp_mib_node_insert(at_rn, arpidx[level], &at_node);
  55497. 8031722: ab01 add r3, sp, #4
  55498. 8031724: 4620 mov r0, r4
  55499. 8031726: f853 1026 ldr.w r1, [r3, r6, lsl #2]
  55500. 803172a: aa00 add r2, sp, #0
  55501. 803172c: b2f7 uxtb r7, r6
  55502. 803172e: f000 fca3 bl 8032078 <snmp_mib_node_insert>
  55503. if ((level != 4) && (at_node != NULL))
  55504. 8031732: 2f04 cmp r7, #4
  55505. 8031734: d01d beq.n 8031772 <snmp_insert_arpidx_tree+0x82>
  55506. 8031736: 9b00 ldr r3, [sp, #0]
  55507. 8031738: b1db cbz r3, 8031772 <snmp_insert_arpidx_tree+0x82>
  55508. {
  55509. if (at_node->nptr == NULL)
  55510. 803173a: 68dc ldr r4, [r3, #12]
  55511. 803173c: b9cc cbnz r4, 8031772 <snmp_insert_arpidx_tree+0x82>
  55512. {
  55513. at_rn = snmp_mib_lrn_alloc();
  55514. 803173e: f000 fc79 bl 8032034 <snmp_mib_lrn_alloc>
  55515. at_node->nptr = (struct mib_node*)at_rn;
  55516. 8031742: 9b00 ldr r3, [sp, #0]
  55517. snmp_mib_node_insert(at_rn, arpidx[level], &at_node);
  55518. if ((level != 4) && (at_node != NULL))
  55519. {
  55520. if (at_node->nptr == NULL)
  55521. {
  55522. at_rn = snmp_mib_lrn_alloc();
  55523. 8031744: 4604 mov r4, r0
  55524. at_node->nptr = (struct mib_node*)at_rn;
  55525. 8031746: 60d8 str r0, [r3, #12]
  55526. if (at_rn != NULL)
  55527. 8031748: b920 cbnz r0, 8031754 <snmp_insert_arpidx_tree+0x64>
  55528. LWIP_ASSERT("ni != NULL", ni != NULL);
  55529. snmp_netiftoifindex(ni, &arpidx[0]);
  55530. snmp_iptooid(ip, &arpidx[1]);
  55531. for (tree = 0; tree < 2; tree++)
  55532. 803174a: 3501 adds r5, #1
  55533. 803174c: b2ed uxtb r5, r5
  55534. 803174e: 2d02 cmp r5, #2
  55535. 8031750: d1dc bne.n 803170c <snmp_insert_arpidx_tree+0x1c>
  55536. 8031752: e012 b.n 803177a <snmp_insert_arpidx_tree+0x8a>
  55537. {
  55538. at_rn = snmp_mib_lrn_alloc();
  55539. at_node->nptr = (struct mib_node*)at_rn;
  55540. if (at_rn != NULL)
  55541. {
  55542. if (level == 3)
  55543. 8031754: 2f03 cmp r7, #3
  55544. 8031756: d10c bne.n 8031772 <snmp_insert_arpidx_tree+0x82>
  55545. {
  55546. if (tree == 0)
  55547. 8031758: b91d cbnz r5, 8031762 <snmp_insert_arpidx_tree+0x72>
  55548. {
  55549. at_rn->get_object_def = atentry_get_object_def;
  55550. 803175a: 4b0d ldr r3, [pc, #52] ; (8031790 <snmp_insert_arpidx_tree+0xa0>)
  55551. 803175c: 6003 str r3, [r0, #0]
  55552. at_rn->get_value = atentry_get_value;
  55553. 803175e: 4b0d ldr r3, [pc, #52] ; (8031794 <snmp_insert_arpidx_tree+0xa4>)
  55554. 8031760: e002 b.n 8031768 <snmp_insert_arpidx_tree+0x78>
  55555. }
  55556. else
  55557. {
  55558. at_rn->get_object_def = ip_ntomentry_get_object_def;
  55559. 8031762: 4b0d ldr r3, [pc, #52] ; (8031798 <snmp_insert_arpidx_tree+0xa8>)
  55560. 8031764: 6003 str r3, [r0, #0]
  55561. at_rn->get_value = ip_ntomentry_get_value;
  55562. 8031766: 4b0d ldr r3, [pc, #52] ; (803179c <snmp_insert_arpidx_tree+0xac>)
  55563. 8031768: 6063 str r3, [r4, #4]
  55564. }
  55565. at_rn->set_test = noleafs_set_test;
  55566. 803176a: f8c4 9008 str.w r9, [r4, #8]
  55567. at_rn->set_value = noleafs_set_value;
  55568. 803176e: f8c4 a00c str.w sl, [r4, #12]
  55569. 8031772: 3601 adds r6, #1
  55570. }
  55571. else
  55572. {
  55573. at_rn = &ipntomtree_root;
  55574. }
  55575. for (level = 0; level < 5; level++)
  55576. 8031774: 2e05 cmp r6, #5
  55577. 8031776: d1d2 bne.n 803171e <snmp_insert_arpidx_tree+0x2e>
  55578. 8031778: e7e7 b.n 803174a <snmp_insert_arpidx_tree+0x5a>
  55579. }
  55580. }
  55581. }
  55582. }
  55583. /* enable getnext traversal on filled tables */
  55584. at.maxlength = 1;
  55585. 803177a: 4a09 ldr r2, [pc, #36] ; (80317a0 <snmp_insert_arpidx_tree+0xb0>)
  55586. 803177c: 2301 movs r3, #1
  55587. 803177e: 8253 strh r3, [r2, #18]
  55588. ipntomtable.maxlength = 1;
  55589. 8031780: 4a08 ldr r2, [pc, #32] ; (80317a4 <snmp_insert_arpidx_tree+0xb4>)
  55590. 8031782: 8253 strh r3, [r2, #18]
  55591. }
  55592. 8031784: b006 add sp, #24
  55593. 8031786: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  55594. 803178a: bf00 nop
  55595. 803178c: 200017e8 .word 0x200017e8
  55596. 8031790: 080311b1 .word 0x080311b1
  55597. 8031794: 08031109 .word 0x08031109
  55598. 8031798: 08031295 .word 0x08031295
  55599. 803179c: 080310ad .word 0x080310ad
  55600. 80317a0: 2000160c .word 0x2000160c
  55601. 80317a4: 200015f0 .word 0x200015f0
  55602. 80317a8: 200018d8 .word 0x200018d8
  55603. 80317ac: 080309cb .word 0x080309cb
  55604. 80317b0: 080309cf .word 0x080309cf
  55605. 080317b4 <snmp_delete_arpidx_tree>:
  55606. /**
  55607. * Removes ARP table indexes (.xIfIndex.xNetAddress)
  55608. * from arp table index trees.
  55609. */
  55610. void snmp_delete_arpidx_tree(struct netif *ni, ip_addr_t *ip)
  55611. {
  55612. 80317b4: b5f0 push {r4, r5, r6, r7, lr}
  55613. 80317b6: b091 sub sp, #68 ; 0x44
  55614. 80317b8: 460c mov r4, r1
  55615. struct mib_list_rootnode *at_rn, *next, *del_rn[5];
  55616. struct mib_list_node *at_n, *del_n[5];
  55617. s32_t arpidx[5];
  55618. u8_t fc, tree, level, del_cnt;
  55619. snmp_netiftoifindex(ni, &arpidx[0]);
  55620. 80317ba: a90b add r1, sp, #44 ; 0x2c
  55621. 80317bc: f000 fc04 bl 8031fc8 <snmp_netiftoifindex>
  55622. snmp_iptooid(ip, &arpidx[1]);
  55623. 80317c0: 4620 mov r0, r4
  55624. 80317c2: a90c add r1, sp, #48 ; 0x30
  55625. 80317c4: f000 fc1d bl 8032002 <snmp_iptooid>
  55626. for (tree = 0; tree < 2; tree++)
  55627. 80317c8: 2700 movs r7, #0
  55628. {
  55629. /* mark nodes for deletion */
  55630. if (tree == 0)
  55631. {
  55632. at_rn = &arptree_root;
  55633. 80317ca: 4b26 ldr r3, [pc, #152] ; (8031864 <snmp_delete_arpidx_tree+0xb0>)
  55634. 80317cc: 4d26 ldr r5, [pc, #152] ; (8031868 <snmp_delete_arpidx_tree+0xb4>)
  55635. }
  55636. else
  55637. {
  55638. at_rn = &ipntomtree_root;
  55639. 80317ce: 2600 movs r6, #0
  55640. for (tree = 0; tree < 2; tree++)
  55641. {
  55642. /* mark nodes for deletion */
  55643. if (tree == 0)
  55644. {
  55645. at_rn = &arptree_root;
  55646. 80317d0: 2f00 cmp r7, #0
  55647. 80317d2: bf08 it eq
  55648. 80317d4: 461d moveq r5, r3
  55649. }
  55650. else
  55651. {
  55652. at_rn = &ipntomtree_root;
  55653. 80317d6: 4634 mov r4, r6
  55654. }
  55655. level = 0;
  55656. del_cnt = 0;
  55657. while ((level < 5) && (at_rn != NULL))
  55658. {
  55659. fc = snmp_mib_node_find(at_rn, arpidx[level], &at_n);
  55660. 80317d8: ab0b add r3, sp, #44 ; 0x2c
  55661. 80317da: 4628 mov r0, r5
  55662. 80317dc: 58f1 ldr r1, [r6, r3]
  55663. 80317de: aa00 add r2, sp, #0
  55664. 80317e0: f000 fc85 bl 80320ee <snmp_mib_node_find>
  55665. 80317e4: b2c0 uxtb r0, r0
  55666. if (fc == 0)
  55667. 80317e6: b198 cbz r0, 8031810 <snmp_delete_arpidx_tree+0x5c>
  55668. {
  55669. /* arpidx[level] does not exist */
  55670. del_cnt = 0;
  55671. at_rn = NULL;
  55672. }
  55673. else if (fc == 1)
  55674. 80317e8: 2801 cmp r0, #1
  55675. 80317ea: d10b bne.n 8031804 <snmp_delete_arpidx_tree+0x50>
  55676. {
  55677. del_rn[del_cnt] = at_rn;
  55678. 80317ec: ab10 add r3, sp, #64 ; 0x40
  55679. 80317ee: eb03 0284 add.w r2, r3, r4, lsl #2
  55680. del_n[del_cnt] = at_n;
  55681. 80317f2: 9b00 ldr r3, [sp, #0]
  55682. del_cnt = 0;
  55683. at_rn = NULL;
  55684. }
  55685. else if (fc == 1)
  55686. {
  55687. del_rn[del_cnt] = at_rn;
  55688. 80317f4: f842 5c3c str.w r5, [r2, #-60]
  55689. del_n[del_cnt] = at_n;
  55690. del_cnt++;
  55691. 80317f8: 3401 adds r4, #1
  55692. at_rn = NULL;
  55693. }
  55694. else if (fc == 1)
  55695. {
  55696. del_rn[del_cnt] = at_rn;
  55697. del_n[del_cnt] = at_n;
  55698. 80317fa: f842 3c28 str.w r3, [r2, #-40]
  55699. del_cnt++;
  55700. 80317fe: b2e4 uxtb r4, r4
  55701. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  55702. 8031800: 68dd ldr r5, [r3, #12]
  55703. 8031802: e007 b.n 8031814 <snmp_delete_arpidx_tree+0x60>
  55704. }
  55705. else if (fc == 2)
  55706. 8031804: 2802 cmp r0, #2
  55707. 8031806: d105 bne.n 8031814 <snmp_delete_arpidx_tree+0x60>
  55708. {
  55709. /* reset delete (2 or more childs) */
  55710. del_cnt = 0;
  55711. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  55712. 8031808: 9b00 ldr r3, [sp, #0]
  55713. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  55714. }
  55715. else if (fc == 2)
  55716. {
  55717. /* reset delete (2 or more childs) */
  55718. del_cnt = 0;
  55719. 803180a: 2400 movs r4, #0
  55720. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  55721. 803180c: 68dd ldr r5, [r3, #12]
  55722. 803180e: e001 b.n 8031814 <snmp_delete_arpidx_tree+0x60>
  55723. {
  55724. fc = snmp_mib_node_find(at_rn, arpidx[level], &at_n);
  55725. if (fc == 0)
  55726. {
  55727. /* arpidx[level] does not exist */
  55728. del_cnt = 0;
  55729. 8031810: 4604 mov r4, r0
  55730. at_rn = NULL;
  55731. 8031812: 4605 mov r5, r0
  55732. 8031814: 3604 adds r6, #4
  55733. {
  55734. at_rn = &ipntomtree_root;
  55735. }
  55736. level = 0;
  55737. del_cnt = 0;
  55738. while ((level < 5) && (at_rn != NULL))
  55739. 8031816: 2e14 cmp r6, #20
  55740. 8031818: d011 beq.n 803183e <snmp_delete_arpidx_tree+0x8a>
  55741. 803181a: 2d00 cmp r5, #0
  55742. 803181c: d1dc bne.n 80317d8 <snmp_delete_arpidx_tree+0x24>
  55743. 803181e: e00e b.n 803183e <snmp_delete_arpidx_tree+0x8a>
  55744. level++;
  55745. }
  55746. /* delete marked index nodes */
  55747. while (del_cnt > 0)
  55748. {
  55749. del_cnt--;
  55750. 8031820: 3c01 subs r4, #1
  55751. 8031822: b2e4 uxtb r4, r4
  55752. at_rn = del_rn[del_cnt];
  55753. 8031824: aa10 add r2, sp, #64 ; 0x40
  55754. 8031826: eb02 0384 add.w r3, r2, r4, lsl #2
  55755. at_n = del_n[del_cnt];
  55756. 803182a: f853 1c28 ldr.w r1, [r3, #-40]
  55757. /* delete marked index nodes */
  55758. while (del_cnt > 0)
  55759. {
  55760. del_cnt--;
  55761. at_rn = del_rn[del_cnt];
  55762. 803182e: f853 0c3c ldr.w r0, [r3, #-60]
  55763. at_n = del_n[del_cnt];
  55764. 8031832: 9100 str r1, [sp, #0]
  55765. next = snmp_mib_node_delete(at_rn, at_n);
  55766. 8031834: f000 fc75 bl 8032122 <snmp_mib_node_delete>
  55767. if (next != NULL)
  55768. 8031838: b108 cbz r0, 803183e <snmp_delete_arpidx_tree+0x8a>
  55769. {
  55770. LWIP_ASSERT("next_count == 0",next->count == 0);
  55771. snmp_mib_lrn_free(next);
  55772. 803183a: f000 fc19 bl 8032070 <snmp_mib_lrn_free>
  55773. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  55774. }
  55775. level++;
  55776. }
  55777. /* delete marked index nodes */
  55778. while (del_cnt > 0)
  55779. 803183e: 2c00 cmp r4, #0
  55780. 8031840: d1ee bne.n 8031820 <snmp_delete_arpidx_tree+0x6c>
  55781. u8_t fc, tree, level, del_cnt;
  55782. snmp_netiftoifindex(ni, &arpidx[0]);
  55783. snmp_iptooid(ip, &arpidx[1]);
  55784. for (tree = 0; tree < 2; tree++)
  55785. 8031842: 3701 adds r7, #1
  55786. 8031844: b2ff uxtb r7, r7
  55787. 8031846: 2f02 cmp r7, #2
  55788. 8031848: d1bf bne.n 80317ca <snmp_delete_arpidx_tree+0x16>
  55789. snmp_mib_lrn_free(next);
  55790. }
  55791. }
  55792. }
  55793. /* disable getnext traversal on empty tables */
  55794. if(arptree_root.count == 0) at.maxlength = 0;
  55795. 803184a: 4b06 ldr r3, [pc, #24] ; (8031864 <snmp_delete_arpidx_tree+0xb0>)
  55796. 803184c: 8b9b ldrh r3, [r3, #28]
  55797. 803184e: b90b cbnz r3, 8031854 <snmp_delete_arpidx_tree+0xa0>
  55798. 8031850: 4b06 ldr r3, [pc, #24] ; (803186c <snmp_delete_arpidx_tree+0xb8>)
  55799. 8031852: 825c strh r4, [r3, #18]
  55800. if(ipntomtree_root.count == 0) ipntomtable.maxlength = 0;
  55801. 8031854: 4b04 ldr r3, [pc, #16] ; (8031868 <snmp_delete_arpidx_tree+0xb4>)
  55802. 8031856: 8b9b ldrh r3, [r3, #28]
  55803. 8031858: b90b cbnz r3, 803185e <snmp_delete_arpidx_tree+0xaa>
  55804. 803185a: 4a05 ldr r2, [pc, #20] ; (8031870 <snmp_delete_arpidx_tree+0xbc>)
  55805. 803185c: 8253 strh r3, [r2, #18]
  55806. }
  55807. 803185e: b011 add sp, #68 ; 0x44
  55808. 8031860: bdf0 pop {r4, r5, r6, r7, pc}
  55809. 8031862: bf00 nop
  55810. 8031864: 200017e8 .word 0x200017e8
  55811. 8031868: 200018d8 .word 0x200018d8
  55812. 803186c: 2000160c .word 0x2000160c
  55813. 8031870: 200015f0 .word 0x200015f0
  55814. 08031874 <snmp_inc_ipinreceives>:
  55815. void snmp_inc_ipinreceives(void)
  55816. {
  55817. ipinreceives++;
  55818. 8031874: 4b02 ldr r3, [pc, #8] ; (8031880 <snmp_inc_ipinreceives+0xc>)
  55819. 8031876: 681a ldr r2, [r3, #0]
  55820. 8031878: 3201 adds r2, #1
  55821. 803187a: 601a str r2, [r3, #0]
  55822. 803187c: 4770 bx lr
  55823. 803187e: bf00 nop
  55824. 8031880: 2000e1e4 .word 0x2000e1e4
  55825. 08031884 <snmp_inc_ipinhdrerrors>:
  55826. }
  55827. void snmp_inc_ipinhdrerrors(void)
  55828. {
  55829. ipinhdrerrors++;
  55830. 8031884: 4b02 ldr r3, [pc, #8] ; (8031890 <snmp_inc_ipinhdrerrors+0xc>)
  55831. 8031886: 681a ldr r2, [r3, #0]
  55832. 8031888: 3201 adds r2, #1
  55833. 803188a: 601a str r2, [r3, #0]
  55834. 803188c: 4770 bx lr
  55835. 803188e: bf00 nop
  55836. 8031890: 2000e16c .word 0x2000e16c
  55837. 08031894 <snmp_inc_ipinaddrerrors>:
  55838. }
  55839. void snmp_inc_ipinaddrerrors(void)
  55840. {
  55841. ipinaddrerrors++;
  55842. 8031894: 4b02 ldr r3, [pc, #8] ; (80318a0 <snmp_inc_ipinaddrerrors+0xc>)
  55843. 8031896: 681a ldr r2, [r3, #0]
  55844. 8031898: 3201 adds r2, #1
  55845. 803189a: 601a str r2, [r3, #0]
  55846. 803189c: 4770 bx lr
  55847. 803189e: bf00 nop
  55848. 80318a0: 2000e150 .word 0x2000e150
  55849. 080318a4 <snmp_inc_ipinunknownprotos>:
  55850. ipforwdatagrams++;
  55851. }
  55852. void snmp_inc_ipinunknownprotos(void)
  55853. {
  55854. ipinunknownprotos++;
  55855. 80318a4: 4b02 ldr r3, [pc, #8] ; (80318b0 <snmp_inc_ipinunknownprotos+0xc>)
  55856. 80318a6: 681a ldr r2, [r3, #0]
  55857. 80318a8: 3201 adds r2, #1
  55858. 80318aa: 601a str r2, [r3, #0]
  55859. 80318ac: 4770 bx lr
  55860. 80318ae: bf00 nop
  55861. 80318b0: 2000e1ac .word 0x2000e1ac
  55862. 080318b4 <snmp_inc_ipindiscards>:
  55863. }
  55864. void snmp_inc_ipindiscards(void)
  55865. {
  55866. ipindiscards++;
  55867. 80318b4: 4b02 ldr r3, [pc, #8] ; (80318c0 <snmp_inc_ipindiscards+0xc>)
  55868. 80318b6: 681a ldr r2, [r3, #0]
  55869. 80318b8: 3201 adds r2, #1
  55870. 80318ba: 601a str r2, [r3, #0]
  55871. 80318bc: 4770 bx lr
  55872. 80318be: bf00 nop
  55873. 80318c0: 2000e238 .word 0x2000e238
  55874. 080318c4 <snmp_inc_ipindelivers>:
  55875. }
  55876. void snmp_inc_ipindelivers(void)
  55877. {
  55878. ipindelivers++;
  55879. 80318c4: 4b02 ldr r3, [pc, #8] ; (80318d0 <snmp_inc_ipindelivers+0xc>)
  55880. 80318c6: 681a ldr r2, [r3, #0]
  55881. 80318c8: 3201 adds r2, #1
  55882. 80318ca: 601a str r2, [r3, #0]
  55883. 80318cc: 4770 bx lr
  55884. 80318ce: bf00 nop
  55885. 80318d0: 2000e270 .word 0x2000e270
  55886. 080318d4 <snmp_inc_ipoutrequests>:
  55887. }
  55888. void snmp_inc_ipoutrequests(void)
  55889. {
  55890. ipoutrequests++;
  55891. 80318d4: 4b02 ldr r3, [pc, #8] ; (80318e0 <snmp_inc_ipoutrequests+0xc>)
  55892. 80318d6: 681a ldr r2, [r3, #0]
  55893. 80318d8: 3201 adds r2, #1
  55894. 80318da: 601a str r2, [r3, #0]
  55895. 80318dc: 4770 bx lr
  55896. 80318de: bf00 nop
  55897. 80318e0: 2000e258 .word 0x2000e258
  55898. 080318e4 <snmp_inc_ipoutdiscards>:
  55899. }
  55900. void snmp_inc_ipoutdiscards(void)
  55901. {
  55902. ipoutdiscards++;
  55903. 80318e4: 4b02 ldr r3, [pc, #8] ; (80318f0 <snmp_inc_ipoutdiscards+0xc>)
  55904. 80318e6: 681a ldr r2, [r3, #0]
  55905. 80318e8: 3201 adds r2, #1
  55906. 80318ea: 601a str r2, [r3, #0]
  55907. 80318ec: 4770 bx lr
  55908. 80318ee: bf00 nop
  55909. 80318f0: 2000e1fc .word 0x2000e1fc
  55910. 080318f4 <snmp_inc_ipoutnoroutes>:
  55911. }
  55912. void snmp_inc_ipoutnoroutes(void)
  55913. {
  55914. ipoutnoroutes++;
  55915. 80318f4: 4b02 ldr r3, [pc, #8] ; (8031900 <snmp_inc_ipoutnoroutes+0xc>)
  55916. 80318f6: 681a ldr r2, [r3, #0]
  55917. 80318f8: 3201 adds r2, #1
  55918. 80318fa: 601a str r2, [r3, #0]
  55919. 80318fc: 4770 bx lr
  55920. 80318fe: bf00 nop
  55921. 8031900: 2000e27c .word 0x2000e27c
  55922. 08031904 <snmp_insert_ipaddridx_tree>:
  55923. /**
  55924. * Inserts ipAddrTable indexes (.ipAdEntAddr)
  55925. * into index tree.
  55926. */
  55927. void snmp_insert_ipaddridx_tree(struct netif *ni)
  55928. {
  55929. 8031904: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  55930. 8031908: b086 sub sp, #24
  55931. struct mib_list_node *ipa_node;
  55932. s32_t ipaddridx[4];
  55933. u8_t level;
  55934. LWIP_ASSERT("ni != NULL", ni != NULL);
  55935. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  55936. 803190a: 3004 adds r0, #4
  55937. 803190c: a902 add r1, sp, #8
  55938. 803190e: f000 fb78 bl 8032002 <snmp_iptooid>
  55939. level = 0;
  55940. ipa_rn = &ipaddrtree_root;
  55941. 8031912: 4c17 ldr r4, [pc, #92] ; (8031970 <snmp_insert_ipaddridx_tree+0x6c>)
  55942. ipa_node->nptr = (struct mib_node*)ipa_rn;
  55943. if (ipa_rn != NULL)
  55944. {
  55945. if (level == 2)
  55946. {
  55947. ipa_rn->get_object_def = ip_addrentry_get_object_def;
  55948. 8031914: 4f17 ldr r7, [pc, #92] ; (8031974 <snmp_insert_ipaddridx_tree+0x70>)
  55949. ipa_rn->get_value = ip_addrentry_get_value;
  55950. 8031916: f8df 806c ldr.w r8, [pc, #108] ; 8031984 <snmp_insert_ipaddridx_tree+0x80>
  55951. struct mib_list_node *ipa_node;
  55952. s32_t ipaddridx[4];
  55953. u8_t level;
  55954. LWIP_ASSERT("ni != NULL", ni != NULL);
  55955. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  55956. 803191a: 2500 movs r5, #0
  55957. level = 0;
  55958. ipa_rn = &ipaddrtree_root;
  55959. while (level < 4)
  55960. {
  55961. ipa_node = NULL;
  55962. 803191c: 2300 movs r3, #0
  55963. 803191e: 9301 str r3, [sp, #4]
  55964. snmp_mib_node_insert(ipa_rn, ipaddridx[level], &ipa_node);
  55965. 8031920: ab02 add r3, sp, #8
  55966. 8031922: 4620 mov r0, r4
  55967. 8031924: f853 1025 ldr.w r1, [r3, r5, lsl #2]
  55968. 8031928: aa01 add r2, sp, #4
  55969. 803192a: b2ee uxtb r6, r5
  55970. 803192c: f000 fba4 bl 8032078 <snmp_mib_node_insert>
  55971. if ((level != 3) && (ipa_node != NULL))
  55972. 8031930: 2e03 cmp r6, #3
  55973. 8031932: d015 beq.n 8031960 <snmp_insert_ipaddridx_tree+0x5c>
  55974. 8031934: 9b01 ldr r3, [sp, #4]
  55975. 8031936: b19b cbz r3, 8031960 <snmp_insert_ipaddridx_tree+0x5c>
  55976. {
  55977. if (ipa_node->nptr == NULL)
  55978. 8031938: 68dc ldr r4, [r3, #12]
  55979. 803193a: b98c cbnz r4, 8031960 <snmp_insert_ipaddridx_tree+0x5c>
  55980. {
  55981. ipa_rn = snmp_mib_lrn_alloc();
  55982. 803193c: f000 fb7a bl 8032034 <snmp_mib_lrn_alloc>
  55983. ipa_node->nptr = (struct mib_node*)ipa_rn;
  55984. 8031940: 9b01 ldr r3, [sp, #4]
  55985. snmp_mib_node_insert(ipa_rn, ipaddridx[level], &ipa_node);
  55986. if ((level != 3) && (ipa_node != NULL))
  55987. {
  55988. if (ipa_node->nptr == NULL)
  55989. {
  55990. ipa_rn = snmp_mib_lrn_alloc();
  55991. 8031942: 4604 mov r4, r0
  55992. ipa_node->nptr = (struct mib_node*)ipa_rn;
  55993. 8031944: 60d8 str r0, [r3, #12]
  55994. if (ipa_rn != NULL)
  55995. 8031946: b918 cbnz r0, 8031950 <snmp_insert_ipaddridx_tree+0x4c>
  55996. }
  55997. }
  55998. level++;
  55999. }
  56000. /* enable getnext traversal on filled table */
  56001. ipaddrtable.maxlength = 1;
  56002. 8031948: 4b0b ldr r3, [pc, #44] ; (8031978 <snmp_insert_ipaddridx_tree+0x74>)
  56003. 803194a: 2201 movs r2, #1
  56004. 803194c: 825a strh r2, [r3, #18]
  56005. 803194e: e00b b.n 8031968 <snmp_insert_ipaddridx_tree+0x64>
  56006. {
  56007. ipa_rn = snmp_mib_lrn_alloc();
  56008. ipa_node->nptr = (struct mib_node*)ipa_rn;
  56009. if (ipa_rn != NULL)
  56010. {
  56011. if (level == 2)
  56012. 8031950: 2e02 cmp r6, #2
  56013. 8031952: d105 bne.n 8031960 <snmp_insert_ipaddridx_tree+0x5c>
  56014. {
  56015. ipa_rn->get_object_def = ip_addrentry_get_object_def;
  56016. ipa_rn->get_value = ip_addrentry_get_value;
  56017. ipa_rn->set_test = noleafs_set_test;
  56018. 8031954: 4b09 ldr r3, [pc, #36] ; (803197c <snmp_insert_ipaddridx_tree+0x78>)
  56019. if (ipa_rn != NULL)
  56020. {
  56021. if (level == 2)
  56022. {
  56023. ipa_rn->get_object_def = ip_addrentry_get_object_def;
  56024. ipa_rn->get_value = ip_addrentry_get_value;
  56025. 8031956: e880 0180 stmia.w r0, {r7, r8}
  56026. ipa_rn->set_test = noleafs_set_test;
  56027. 803195a: 6083 str r3, [r0, #8]
  56028. ipa_rn->set_value = noleafs_set_value;
  56029. 803195c: 4b08 ldr r3, [pc, #32] ; (8031980 <snmp_insert_ipaddridx_tree+0x7c>)
  56030. 803195e: 60c3 str r3, [r0, #12]
  56031. 8031960: 3501 adds r5, #1
  56032. LWIP_ASSERT("ni != NULL", ni != NULL);
  56033. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  56034. level = 0;
  56035. ipa_rn = &ipaddrtree_root;
  56036. while (level < 4)
  56037. 8031962: 2d04 cmp r5, #4
  56038. 8031964: d1da bne.n 803191c <snmp_insert_ipaddridx_tree+0x18>
  56039. 8031966: e7ef b.n 8031948 <snmp_insert_ipaddridx_tree+0x44>
  56040. }
  56041. level++;
  56042. }
  56043. /* enable getnext traversal on filled table */
  56044. ipaddrtable.maxlength = 1;
  56045. }
  56046. 8031968: b006 add sp, #24
  56047. 803196a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  56048. 803196e: bf00 nop
  56049. 8031970: 20001744 .word 0x20001744
  56050. 8031974: 08031251 .word 0x08031251
  56051. 8031978: 200017c8 .word 0x200017c8
  56052. 803197c: 080309cb .word 0x080309cb
  56053. 8031980: 080309cf .word 0x080309cf
  56054. 8031984: 08031041 .word 0x08031041
  56055. 08031988 <snmp_delete_ipaddridx_tree>:
  56056. /**
  56057. * Removes ipAddrTable indexes (.ipAdEntAddr)
  56058. * from index tree.
  56059. */
  56060. void snmp_delete_ipaddridx_tree(struct netif *ni)
  56061. {
  56062. 8031988: b570 push {r4, r5, r6, lr}
  56063. 803198a: b08e sub sp, #56 ; 0x38
  56064. struct mib_list_node *ipa_n, *del_n[4];
  56065. s32_t ipaddridx[4];
  56066. u8_t fc, level, del_cnt;
  56067. LWIP_ASSERT("ni != NULL", ni != NULL);
  56068. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  56069. 803198c: 3004 adds r0, #4
  56070. 803198e: a90a add r1, sp, #40 ; 0x28
  56071. 8031990: f000 fb37 bl 8032002 <snmp_iptooid>
  56072. 8031994: 2600 movs r6, #0
  56073. /* mark nodes for deletion */
  56074. level = 0;
  56075. del_cnt = 0;
  56076. ipa_rn = &ipaddrtree_root;
  56077. 8031996: 4d1f ldr r5, [pc, #124] ; (8031a14 <snmp_delete_ipaddridx_tree+0x8c>)
  56078. LWIP_ASSERT("ni != NULL", ni != NULL);
  56079. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  56080. /* mark nodes for deletion */
  56081. level = 0;
  56082. del_cnt = 0;
  56083. 8031998: 4634 mov r4, r6
  56084. ipa_rn = &ipaddrtree_root;
  56085. while ((level < 4) && (ipa_rn != NULL))
  56086. {
  56087. fc = snmp_mib_node_find(ipa_rn, ipaddridx[level], &ipa_n);
  56088. 803199a: ab0a add r3, sp, #40 ; 0x28
  56089. 803199c: 4628 mov r0, r5
  56090. 803199e: 58f1 ldr r1, [r6, r3]
  56091. 80319a0: aa01 add r2, sp, #4
  56092. 80319a2: f000 fba4 bl 80320ee <snmp_mib_node_find>
  56093. 80319a6: b2c0 uxtb r0, r0
  56094. if (fc == 0)
  56095. 80319a8: b198 cbz r0, 80319d2 <snmp_delete_ipaddridx_tree+0x4a>
  56096. {
  56097. /* ipaddridx[level] does not exist */
  56098. del_cnt = 0;
  56099. ipa_rn = NULL;
  56100. }
  56101. else if (fc == 1)
  56102. 80319aa: 2801 cmp r0, #1
  56103. 80319ac: d10b bne.n 80319c6 <snmp_delete_ipaddridx_tree+0x3e>
  56104. {
  56105. del_rn[del_cnt] = ipa_rn;
  56106. 80319ae: ab0e add r3, sp, #56 ; 0x38
  56107. 80319b0: eb03 0284 add.w r2, r3, r4, lsl #2
  56108. del_n[del_cnt] = ipa_n;
  56109. 80319b4: 9b01 ldr r3, [sp, #4]
  56110. del_cnt = 0;
  56111. ipa_rn = NULL;
  56112. }
  56113. else if (fc == 1)
  56114. {
  56115. del_rn[del_cnt] = ipa_rn;
  56116. 80319b6: f842 5c30 str.w r5, [r2, #-48]
  56117. del_n[del_cnt] = ipa_n;
  56118. del_cnt++;
  56119. 80319ba: 3401 adds r4, #1
  56120. ipa_rn = NULL;
  56121. }
  56122. else if (fc == 1)
  56123. {
  56124. del_rn[del_cnt] = ipa_rn;
  56125. del_n[del_cnt] = ipa_n;
  56126. 80319bc: f842 3c20 str.w r3, [r2, #-32]
  56127. del_cnt++;
  56128. 80319c0: b2e4 uxtb r4, r4
  56129. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  56130. 80319c2: 68dd ldr r5, [r3, #12]
  56131. 80319c4: e007 b.n 80319d6 <snmp_delete_ipaddridx_tree+0x4e>
  56132. }
  56133. else if (fc == 2)
  56134. 80319c6: 2802 cmp r0, #2
  56135. 80319c8: d105 bne.n 80319d6 <snmp_delete_ipaddridx_tree+0x4e>
  56136. {
  56137. /* reset delete (2 or more childs) */
  56138. del_cnt = 0;
  56139. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  56140. 80319ca: 9b01 ldr r3, [sp, #4]
  56141. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  56142. }
  56143. else if (fc == 2)
  56144. {
  56145. /* reset delete (2 or more childs) */
  56146. del_cnt = 0;
  56147. 80319cc: 2400 movs r4, #0
  56148. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  56149. 80319ce: 68dd ldr r5, [r3, #12]
  56150. 80319d0: e001 b.n 80319d6 <snmp_delete_ipaddridx_tree+0x4e>
  56151. {
  56152. fc = snmp_mib_node_find(ipa_rn, ipaddridx[level], &ipa_n);
  56153. if (fc == 0)
  56154. {
  56155. /* ipaddridx[level] does not exist */
  56156. del_cnt = 0;
  56157. 80319d2: 4604 mov r4, r0
  56158. ipa_rn = NULL;
  56159. 80319d4: 4605 mov r5, r0
  56160. /* mark nodes for deletion */
  56161. level = 0;
  56162. del_cnt = 0;
  56163. ipa_rn = &ipaddrtree_root;
  56164. while ((level < 4) && (ipa_rn != NULL))
  56165. 80319d6: 2e0c cmp r6, #12
  56166. 80319d8: d012 beq.n 8031a00 <snmp_delete_ipaddridx_tree+0x78>
  56167. 80319da: 3604 adds r6, #4
  56168. 80319dc: 2d00 cmp r5, #0
  56169. 80319de: d1dc bne.n 803199a <snmp_delete_ipaddridx_tree+0x12>
  56170. 80319e0: e00e b.n 8031a00 <snmp_delete_ipaddridx_tree+0x78>
  56171. level++;
  56172. }
  56173. /* delete marked index nodes */
  56174. while (del_cnt > 0)
  56175. {
  56176. del_cnt--;
  56177. 80319e2: 3c01 subs r4, #1
  56178. 80319e4: b2e4 uxtb r4, r4
  56179. ipa_rn = del_rn[del_cnt];
  56180. 80319e6: aa0e add r2, sp, #56 ; 0x38
  56181. 80319e8: eb02 0384 add.w r3, r2, r4, lsl #2
  56182. ipa_n = del_n[del_cnt];
  56183. 80319ec: f853 1c20 ldr.w r1, [r3, #-32]
  56184. /* delete marked index nodes */
  56185. while (del_cnt > 0)
  56186. {
  56187. del_cnt--;
  56188. ipa_rn = del_rn[del_cnt];
  56189. 80319f0: f853 0c30 ldr.w r0, [r3, #-48]
  56190. ipa_n = del_n[del_cnt];
  56191. 80319f4: 9101 str r1, [sp, #4]
  56192. next = snmp_mib_node_delete(ipa_rn, ipa_n);
  56193. 80319f6: f000 fb94 bl 8032122 <snmp_mib_node_delete>
  56194. if (next != NULL)
  56195. 80319fa: b108 cbz r0, 8031a00 <snmp_delete_ipaddridx_tree+0x78>
  56196. {
  56197. LWIP_ASSERT("next_count == 0",next->count == 0);
  56198. snmp_mib_lrn_free(next);
  56199. 80319fc: f000 fb38 bl 8032070 <snmp_mib_lrn_free>
  56200. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  56201. }
  56202. level++;
  56203. }
  56204. /* delete marked index nodes */
  56205. while (del_cnt > 0)
  56206. 8031a00: 2c00 cmp r4, #0
  56207. 8031a02: d1ee bne.n 80319e2 <snmp_delete_ipaddridx_tree+0x5a>
  56208. LWIP_ASSERT("next_count == 0",next->count == 0);
  56209. snmp_mib_lrn_free(next);
  56210. }
  56211. }
  56212. /* disable getnext traversal on empty table */
  56213. if (ipaddrtree_root.count == 0) ipaddrtable.maxlength = 0;
  56214. 8031a04: 4b03 ldr r3, [pc, #12] ; (8031a14 <snmp_delete_ipaddridx_tree+0x8c>)
  56215. 8031a06: 8b9b ldrh r3, [r3, #28]
  56216. 8031a08: b90b cbnz r3, 8031a0e <snmp_delete_ipaddridx_tree+0x86>
  56217. 8031a0a: 4b03 ldr r3, [pc, #12] ; (8031a18 <snmp_delete_ipaddridx_tree+0x90>)
  56218. 8031a0c: 825c strh r4, [r3, #18]
  56219. }
  56220. 8031a0e: b00e add sp, #56 ; 0x38
  56221. 8031a10: bd70 pop {r4, r5, r6, pc}
  56222. 8031a12: bf00 nop
  56223. 8031a14: 20001744 .word 0x20001744
  56224. 8031a18: 200017c8 .word 0x200017c8
  56225. 08031a1c <snmp_insert_iprteidx_tree>:
  56226. *
  56227. * @todo record sysuptime for _this_ route when it is installed
  56228. * (needed for ipRouteAge) in the netif.
  56229. */
  56230. void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni)
  56231. {
  56232. 8031a1c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  56233. 8031a20: b086 sub sp, #24
  56234. u8_t insert = 0;
  56235. ip_addr_t dst;
  56236. if (dflt != 0)
  56237. 8031a22: b110 cbz r0, 8031a2a <snmp_insert_iprteidx_tree+0xe>
  56238. {
  56239. /* the default route 0.0.0.0 */
  56240. ip_addr_set_any(&dst);
  56241. 8031a24: 2300 movs r3, #0
  56242. 8031a26: 9300 str r3, [sp, #0]
  56243. 8031a28: e02b b.n 8031a82 <snmp_insert_iprteidx_tree+0x66>
  56244. insert = 1;
  56245. }
  56246. else
  56247. {
  56248. /* route to the network address */
  56249. ip_addr_get_network(&dst, &ni->ip_addr, &ni->netmask);
  56250. 8031a2a: 688a ldr r2, [r1, #8]
  56251. 8031a2c: 684b ldr r3, [r1, #4]
  56252. 8031a2e: 4013 ands r3, r2
  56253. 8031a30: 9300 str r3, [sp, #0]
  56254. /* exclude 0.0.0.0 network (reserved for default rte) */
  56255. if (!ip_addr_isany(&dst)) {
  56256. 8031a32: bb33 cbnz r3, 8031a82 <snmp_insert_iprteidx_tree+0x66>
  56257. 8031a34: e021 b.n 8031a7a <snmp_insert_iprteidx_tree+0x5e>
  56258. snmp_iptooid(&dst, &iprteidx[0]);
  56259. level = 0;
  56260. iprte_rn = &iprtetree_root;
  56261. while (level < 4)
  56262. {
  56263. iprte_node = NULL;
  56264. 8031a36: 2300 movs r3, #0
  56265. 8031a38: 9301 str r3, [sp, #4]
  56266. snmp_mib_node_insert(iprte_rn, iprteidx[level], &iprte_node);
  56267. 8031a3a: ab02 add r3, sp, #8
  56268. 8031a3c: 4620 mov r0, r4
  56269. 8031a3e: f853 1025 ldr.w r1, [r3, r5, lsl #2]
  56270. 8031a42: aa01 add r2, sp, #4
  56271. 8031a44: b2ee uxtb r6, r5
  56272. 8031a46: f000 fb17 bl 8032078 <snmp_mib_node_insert>
  56273. if ((level != 3) && (iprte_node != NULL))
  56274. 8031a4a: 2e03 cmp r6, #3
  56275. 8031a4c: d012 beq.n 8031a74 <snmp_insert_iprteidx_tree+0x58>
  56276. 8031a4e: 9b01 ldr r3, [sp, #4]
  56277. 8031a50: b183 cbz r3, 8031a74 <snmp_insert_iprteidx_tree+0x58>
  56278. {
  56279. if (iprte_node->nptr == NULL)
  56280. 8031a52: 68dc ldr r4, [r3, #12]
  56281. 8031a54: b974 cbnz r4, 8031a74 <snmp_insert_iprteidx_tree+0x58>
  56282. {
  56283. iprte_rn = snmp_mib_lrn_alloc();
  56284. 8031a56: f000 faed bl 8032034 <snmp_mib_lrn_alloc>
  56285. iprte_node->nptr = (struct mib_node*)iprte_rn;
  56286. 8031a5a: 9b01 ldr r3, [sp, #4]
  56287. snmp_mib_node_insert(iprte_rn, iprteidx[level], &iprte_node);
  56288. if ((level != 3) && (iprte_node != NULL))
  56289. {
  56290. if (iprte_node->nptr == NULL)
  56291. {
  56292. iprte_rn = snmp_mib_lrn_alloc();
  56293. 8031a5c: 4604 mov r4, r0
  56294. iprte_node->nptr = (struct mib_node*)iprte_rn;
  56295. 8031a5e: 60d8 str r0, [r3, #12]
  56296. if (iprte_rn != NULL)
  56297. 8031a60: b158 cbz r0, 8031a7a <snmp_insert_iprteidx_tree+0x5e>
  56298. {
  56299. if (level == 2)
  56300. 8031a62: 2e02 cmp r6, #2
  56301. 8031a64: d106 bne.n 8031a74 <snmp_insert_iprteidx_tree+0x58>
  56302. {
  56303. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  56304. iprte_rn->get_value = ip_rteentry_get_value;
  56305. iprte_rn->set_test = noleafs_set_test;
  56306. 8031a66: 4b0d ldr r3, [pc, #52] ; (8031a9c <snmp_insert_iprteidx_tree+0x80>)
  56307. iprte_node->nptr = (struct mib_node*)iprte_rn;
  56308. if (iprte_rn != NULL)
  56309. {
  56310. if (level == 2)
  56311. {
  56312. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  56313. 8031a68: f8c0 8000 str.w r8, [r0]
  56314. iprte_rn->get_value = ip_rteentry_get_value;
  56315. iprte_rn->set_test = noleafs_set_test;
  56316. 8031a6c: 6083 str r3, [r0, #8]
  56317. iprte_rn->set_value = noleafs_set_value;
  56318. 8031a6e: 4b0c ldr r3, [pc, #48] ; (8031aa0 <snmp_insert_iprteidx_tree+0x84>)
  56319. if (iprte_rn != NULL)
  56320. {
  56321. if (level == 2)
  56322. {
  56323. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  56324. iprte_rn->get_value = ip_rteentry_get_value;
  56325. 8031a70: 6047 str r7, [r0, #4]
  56326. iprte_rn->set_test = noleafs_set_test;
  56327. iprte_rn->set_value = noleafs_set_value;
  56328. 8031a72: 60c3 str r3, [r0, #12]
  56329. 8031a74: 3501 adds r5, #1
  56330. u8_t level;
  56331. snmp_iptooid(&dst, &iprteidx[0]);
  56332. level = 0;
  56333. iprte_rn = &iprtetree_root;
  56334. while (level < 4)
  56335. 8031a76: 2d04 cmp r5, #4
  56336. 8031a78: d1dd bne.n 8031a36 <snmp_insert_iprteidx_tree+0x1a>
  56337. }
  56338. level++;
  56339. }
  56340. }
  56341. /* enable getnext traversal on filled table */
  56342. iprtetable.maxlength = 1;
  56343. 8031a7a: 4b0a ldr r3, [pc, #40] ; (8031aa4 <snmp_insert_iprteidx_tree+0x88>)
  56344. 8031a7c: 2201 movs r2, #1
  56345. 8031a7e: 825a strh r2, [r3, #18]
  56346. 8031a80: e009 b.n 8031a96 <snmp_insert_iprteidx_tree+0x7a>
  56347. struct mib_list_rootnode *iprte_rn;
  56348. struct mib_list_node *iprte_node;
  56349. s32_t iprteidx[4];
  56350. u8_t level;
  56351. snmp_iptooid(&dst, &iprteidx[0]);
  56352. 8031a82: 4668 mov r0, sp
  56353. 8031a84: a902 add r1, sp, #8
  56354. 8031a86: f000 fabc bl 8032002 <snmp_iptooid>
  56355. 8031a8a: 2500 movs r5, #0
  56356. level = 0;
  56357. iprte_rn = &iprtetree_root;
  56358. 8031a8c: 4c06 ldr r4, [pc, #24] ; (8031aa8 <snmp_insert_iprteidx_tree+0x8c>)
  56359. iprte_node->nptr = (struct mib_node*)iprte_rn;
  56360. if (iprte_rn != NULL)
  56361. {
  56362. if (level == 2)
  56363. {
  56364. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  56365. 8031a8e: f8df 8020 ldr.w r8, [pc, #32] ; 8031ab0 <snmp_insert_iprteidx_tree+0x94>
  56366. iprte_rn->get_value = ip_rteentry_get_value;
  56367. 8031a92: 4f06 ldr r7, [pc, #24] ; (8031aac <snmp_insert_iprteidx_tree+0x90>)
  56368. 8031a94: e7cf b.n 8031a36 <snmp_insert_iprteidx_tree+0x1a>
  56369. level++;
  56370. }
  56371. }
  56372. /* enable getnext traversal on filled table */
  56373. iprtetable.maxlength = 1;
  56374. }
  56375. 8031a96: b006 add sp, #24
  56376. 8031a98: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  56377. 8031a9c: 080309cb .word 0x080309cb
  56378. 8031aa0: 080309cf .word 0x080309cf
  56379. 8031aa4: 20001830 .word 0x20001830
  56380. 8031aa8: 20001674 .word 0x20001674
  56381. 8031aac: 08031551 .word 0x08031551
  56382. 8031ab0: 08030b95 .word 0x08030b95
  56383. 08031ab4 <snmp_delete_iprteidx_tree>:
  56384. * @param dflt non-zero for the default rte, zero for network rte
  56385. * @param ni points to network interface for this rte or NULL
  56386. * for default route to be removed.
  56387. */
  56388. void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni)
  56389. {
  56390. 8031ab4: b570 push {r4, r5, r6, lr}
  56391. 8031ab6: b08e sub sp, #56 ; 0x38
  56392. u8_t del = 0;
  56393. ip_addr_t dst;
  56394. if (dflt != 0)
  56395. 8031ab8: b110 cbz r0, 8031ac0 <snmp_delete_iprteidx_tree+0xc>
  56396. {
  56397. /* the default route 0.0.0.0 */
  56398. ip_addr_set_any(&dst);
  56399. 8031aba: 2300 movs r3, #0
  56400. 8031abc: 9300 str r3, [sp, #0]
  56401. 8031abe: e041 b.n 8031b44 <snmp_delete_iprteidx_tree+0x90>
  56402. del = 1;
  56403. }
  56404. else
  56405. {
  56406. /* route to the network address */
  56407. ip_addr_get_network(&dst, &ni->ip_addr, &ni->netmask);
  56408. 8031ac0: 688a ldr r2, [r1, #8]
  56409. 8031ac2: 684b ldr r3, [r1, #4]
  56410. 8031ac4: 4013 ands r3, r2
  56411. 8031ac6: 9300 str r3, [sp, #0]
  56412. /* exclude 0.0.0.0 network (reserved for default rte) */
  56413. if (!ip_addr_isany(&dst)) {
  56414. 8031ac8: 2b00 cmp r3, #0
  56415. 8031aca: d13b bne.n 8031b44 <snmp_delete_iprteidx_tree+0x90>
  56416. 8031acc: e034 b.n 8031b38 <snmp_delete_iprteidx_tree+0x84>
  56417. level = 0;
  56418. del_cnt = 0;
  56419. iprte_rn = &iprtetree_root;
  56420. while ((level < 4) && (iprte_rn != NULL))
  56421. {
  56422. fc = snmp_mib_node_find(iprte_rn, iprteidx[level], &iprte_n);
  56423. 8031ace: ab0a add r3, sp, #40 ; 0x28
  56424. 8031ad0: 4628 mov r0, r5
  56425. 8031ad2: 58f1 ldr r1, [r6, r3]
  56426. 8031ad4: aa01 add r2, sp, #4
  56427. 8031ad6: f000 fb0a bl 80320ee <snmp_mib_node_find>
  56428. 8031ada: b2c0 uxtb r0, r0
  56429. if (fc == 0)
  56430. 8031adc: b198 cbz r0, 8031b06 <snmp_delete_iprteidx_tree+0x52>
  56431. {
  56432. /* iprteidx[level] does not exist */
  56433. del_cnt = 0;
  56434. iprte_rn = NULL;
  56435. }
  56436. else if (fc == 1)
  56437. 8031ade: 2801 cmp r0, #1
  56438. 8031ae0: d10b bne.n 8031afa <snmp_delete_iprteidx_tree+0x46>
  56439. {
  56440. del_rn[del_cnt] = iprte_rn;
  56441. 8031ae2: ab0e add r3, sp, #56 ; 0x38
  56442. 8031ae4: eb03 0284 add.w r2, r3, r4, lsl #2
  56443. del_n[del_cnt] = iprte_n;
  56444. 8031ae8: 9b01 ldr r3, [sp, #4]
  56445. del_cnt = 0;
  56446. iprte_rn = NULL;
  56447. }
  56448. else if (fc == 1)
  56449. {
  56450. del_rn[del_cnt] = iprte_rn;
  56451. 8031aea: f842 5c30 str.w r5, [r2, #-48]
  56452. del_n[del_cnt] = iprte_n;
  56453. del_cnt++;
  56454. 8031aee: 3401 adds r4, #1
  56455. iprte_rn = NULL;
  56456. }
  56457. else if (fc == 1)
  56458. {
  56459. del_rn[del_cnt] = iprte_rn;
  56460. del_n[del_cnt] = iprte_n;
  56461. 8031af0: f842 3c20 str.w r3, [r2, #-32]
  56462. del_cnt++;
  56463. 8031af4: b2e4 uxtb r4, r4
  56464. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  56465. 8031af6: 68dd ldr r5, [r3, #12]
  56466. 8031af8: e007 b.n 8031b0a <snmp_delete_iprteidx_tree+0x56>
  56467. }
  56468. else if (fc == 2)
  56469. 8031afa: 2802 cmp r0, #2
  56470. 8031afc: d105 bne.n 8031b0a <snmp_delete_iprteidx_tree+0x56>
  56471. {
  56472. /* reset delete (2 or more childs) */
  56473. del_cnt = 0;
  56474. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  56475. 8031afe: 9b01 ldr r3, [sp, #4]
  56476. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  56477. }
  56478. else if (fc == 2)
  56479. {
  56480. /* reset delete (2 or more childs) */
  56481. del_cnt = 0;
  56482. 8031b00: 2400 movs r4, #0
  56483. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  56484. 8031b02: 68dd ldr r5, [r3, #12]
  56485. 8031b04: e001 b.n 8031b0a <snmp_delete_iprteidx_tree+0x56>
  56486. {
  56487. fc = snmp_mib_node_find(iprte_rn, iprteidx[level], &iprte_n);
  56488. if (fc == 0)
  56489. {
  56490. /* iprteidx[level] does not exist */
  56491. del_cnt = 0;
  56492. 8031b06: 4604 mov r4, r0
  56493. iprte_rn = NULL;
  56494. 8031b08: 4605 mov r5, r0
  56495. snmp_iptooid(&dst, &iprteidx[0]);
  56496. /* mark nodes for deletion */
  56497. level = 0;
  56498. del_cnt = 0;
  56499. iprte_rn = &iprtetree_root;
  56500. while ((level < 4) && (iprte_rn != NULL))
  56501. 8031b0a: 2e0c cmp r6, #12
  56502. 8031b0c: d012 beq.n 8031b34 <snmp_delete_iprteidx_tree+0x80>
  56503. 8031b0e: 3604 adds r6, #4
  56504. 8031b10: 2d00 cmp r5, #0
  56505. 8031b12: d1dc bne.n 8031ace <snmp_delete_iprteidx_tree+0x1a>
  56506. 8031b14: e00e b.n 8031b34 <snmp_delete_iprteidx_tree+0x80>
  56507. level++;
  56508. }
  56509. /* delete marked index nodes */
  56510. while (del_cnt > 0)
  56511. {
  56512. del_cnt--;
  56513. 8031b16: 3c01 subs r4, #1
  56514. 8031b18: b2e4 uxtb r4, r4
  56515. iprte_rn = del_rn[del_cnt];
  56516. 8031b1a: aa0e add r2, sp, #56 ; 0x38
  56517. 8031b1c: eb02 0384 add.w r3, r2, r4, lsl #2
  56518. iprte_n = del_n[del_cnt];
  56519. 8031b20: f853 1c20 ldr.w r1, [r3, #-32]
  56520. /* delete marked index nodes */
  56521. while (del_cnt > 0)
  56522. {
  56523. del_cnt--;
  56524. iprte_rn = del_rn[del_cnt];
  56525. 8031b24: f853 0c30 ldr.w r0, [r3, #-48]
  56526. iprte_n = del_n[del_cnt];
  56527. 8031b28: 9101 str r1, [sp, #4]
  56528. next = snmp_mib_node_delete(iprte_rn, iprte_n);
  56529. 8031b2a: f000 fafa bl 8032122 <snmp_mib_node_delete>
  56530. if (next != NULL)
  56531. 8031b2e: b108 cbz r0, 8031b34 <snmp_delete_iprteidx_tree+0x80>
  56532. {
  56533. LWIP_ASSERT("next_count == 0",next->count == 0);
  56534. snmp_mib_lrn_free(next);
  56535. 8031b30: f000 fa9e bl 8032070 <snmp_mib_lrn_free>
  56536. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  56537. }
  56538. level++;
  56539. }
  56540. /* delete marked index nodes */
  56541. while (del_cnt > 0)
  56542. 8031b34: 2c00 cmp r4, #0
  56543. 8031b36: d1ee bne.n 8031b16 <snmp_delete_iprteidx_tree+0x62>
  56544. snmp_mib_lrn_free(next);
  56545. }
  56546. }
  56547. }
  56548. /* disable getnext traversal on empty table */
  56549. if (iprtetree_root.count == 0) iprtetable.maxlength = 0;
  56550. 8031b38: 4b07 ldr r3, [pc, #28] ; (8031b58 <snmp_delete_iprteidx_tree+0xa4>)
  56551. 8031b3a: 8b9b ldrh r3, [r3, #28]
  56552. 8031b3c: b953 cbnz r3, 8031b54 <snmp_delete_iprteidx_tree+0xa0>
  56553. 8031b3e: 4a07 ldr r2, [pc, #28] ; (8031b5c <snmp_delete_iprteidx_tree+0xa8>)
  56554. 8031b40: 8253 strh r3, [r2, #18]
  56555. 8031b42: e007 b.n 8031b54 <snmp_delete_iprteidx_tree+0xa0>
  56556. struct mib_list_rootnode *iprte_rn, *next, *del_rn[4];
  56557. struct mib_list_node *iprte_n, *del_n[4];
  56558. s32_t iprteidx[4];
  56559. u8_t fc, level, del_cnt;
  56560. snmp_iptooid(&dst, &iprteidx[0]);
  56561. 8031b44: 4668 mov r0, sp
  56562. 8031b46: a90a add r1, sp, #40 ; 0x28
  56563. 8031b48: 2600 movs r6, #0
  56564. 8031b4a: f000 fa5a bl 8032002 <snmp_iptooid>
  56565. /* mark nodes for deletion */
  56566. level = 0;
  56567. del_cnt = 0;
  56568. 8031b4e: 4634 mov r4, r6
  56569. iprte_rn = &iprtetree_root;
  56570. 8031b50: 4d01 ldr r5, [pc, #4] ; (8031b58 <snmp_delete_iprteidx_tree+0xa4>)
  56571. 8031b52: e7bc b.n 8031ace <snmp_delete_iprteidx_tree+0x1a>
  56572. }
  56573. }
  56574. }
  56575. /* disable getnext traversal on empty table */
  56576. if (iprtetree_root.count == 0) iprtetable.maxlength = 0;
  56577. }
  56578. 8031b54: b00e add sp, #56 ; 0x38
  56579. 8031b56: bd70 pop {r4, r5, r6, pc}
  56580. 8031b58: 20001674 .word 0x20001674
  56581. 8031b5c: 20001830 .word 0x20001830
  56582. 08031b60 <snmp_inc_icmpinmsgs>:
  56583. void snmp_inc_icmpinmsgs(void)
  56584. {
  56585. icmpinmsgs++;
  56586. 8031b60: 4b02 ldr r3, [pc, #8] ; (8031b6c <snmp_inc_icmpinmsgs+0xc>)
  56587. 8031b62: 681a ldr r2, [r3, #0]
  56588. 8031b64: 3201 adds r2, #1
  56589. 8031b66: 601a str r2, [r3, #0]
  56590. 8031b68: 4770 bx lr
  56591. 8031b6a: bf00 nop
  56592. 8031b6c: 2000e174 .word 0x2000e174
  56593. 08031b70 <snmp_inc_icmpinerrors>:
  56594. }
  56595. void snmp_inc_icmpinerrors(void)
  56596. {
  56597. icmpinerrors++;
  56598. 8031b70: 4b02 ldr r3, [pc, #8] ; (8031b7c <snmp_inc_icmpinerrors+0xc>)
  56599. 8031b72: 681a ldr r2, [r3, #0]
  56600. 8031b74: 3201 adds r2, #1
  56601. 8031b76: 601a str r2, [r3, #0]
  56602. 8031b78: 4770 bx lr
  56603. 8031b7a: bf00 nop
  56604. 8031b7c: 2000e170 .word 0x2000e170
  56605. 08031b80 <snmp_inc_icmpoutmsgs>:
  56606. icmpinaddrmaskreps++;
  56607. }
  56608. void snmp_inc_icmpoutmsgs(void)
  56609. {
  56610. icmpoutmsgs++;
  56611. 8031b80: 4b02 ldr r3, [pc, #8] ; (8031b8c <snmp_inc_icmpoutmsgs+0xc>)
  56612. 8031b82: 681a ldr r2, [r3, #0]
  56613. 8031b84: 3201 adds r2, #1
  56614. 8031b86: 601a str r2, [r3, #0]
  56615. 8031b88: 4770 bx lr
  56616. 8031b8a: bf00 nop
  56617. 8031b8c: 2000e1f4 .word 0x2000e1f4
  56618. 08031b90 <snmp_inc_icmpouttimeexcds>:
  56619. icmpoutdestunreachs++;
  56620. }
  56621. void snmp_inc_icmpouttimeexcds(void)
  56622. {
  56623. icmpouttimeexcds++;
  56624. 8031b90: 4b02 ldr r3, [pc, #8] ; (8031b9c <snmp_inc_icmpouttimeexcds+0xc>)
  56625. 8031b92: 681a ldr r2, [r3, #0]
  56626. 8031b94: 3201 adds r2, #1
  56627. 8031b96: 601a str r2, [r3, #0]
  56628. 8031b98: 4770 bx lr
  56629. 8031b9a: bf00 nop
  56630. 8031b9c: 2000e1c0 .word 0x2000e1c0
  56631. 08031ba0 <snmp_inc_icmpoutechoreps>:
  56632. icmpoutechos++;
  56633. }
  56634. void snmp_inc_icmpoutechoreps(void)
  56635. {
  56636. icmpoutechoreps++;
  56637. 8031ba0: 4b02 ldr r3, [pc, #8] ; (8031bac <snmp_inc_icmpoutechoreps+0xc>)
  56638. 8031ba2: 681a ldr r2, [r3, #0]
  56639. 8031ba4: 3201 adds r2, #1
  56640. 8031ba6: 601a str r2, [r3, #0]
  56641. 8031ba8: 4770 bx lr
  56642. 8031baa: bf00 nop
  56643. 8031bac: 2000e214 .word 0x2000e214
  56644. 08031bb0 <snmp_inc_tcppassiveopens>:
  56645. tcpactiveopens++;
  56646. }
  56647. void snmp_inc_tcppassiveopens(void)
  56648. {
  56649. tcppassiveopens++;
  56650. 8031bb0: 4b02 ldr r3, [pc, #8] ; (8031bbc <snmp_inc_tcppassiveopens+0xc>)
  56651. 8031bb2: 681a ldr r2, [r3, #0]
  56652. 8031bb4: 3201 adds r2, #1
  56653. 8031bb6: 601a str r2, [r3, #0]
  56654. 8031bb8: 4770 bx lr
  56655. 8031bba: bf00 nop
  56656. 8031bbc: 2000e19c .word 0x2000e19c
  56657. 08031bc0 <snmp_inc_tcpattemptfails>:
  56658. }
  56659. void snmp_inc_tcpattemptfails(void)
  56660. {
  56661. tcpattemptfails++;
  56662. 8031bc0: 4b02 ldr r3, [pc, #8] ; (8031bcc <snmp_inc_tcpattemptfails+0xc>)
  56663. 8031bc2: 681a ldr r2, [r3, #0]
  56664. 8031bc4: 3201 adds r2, #1
  56665. 8031bc6: 601a str r2, [r3, #0]
  56666. 8031bc8: 4770 bx lr
  56667. 8031bca: bf00 nop
  56668. 8031bcc: 2000e1e8 .word 0x2000e1e8
  56669. 08031bd0 <snmp_inc_tcpestabresets>:
  56670. }
  56671. void snmp_inc_tcpestabresets(void)
  56672. {
  56673. tcpestabresets++;
  56674. 8031bd0: 4b02 ldr r3, [pc, #8] ; (8031bdc <snmp_inc_tcpestabresets+0xc>)
  56675. 8031bd2: 681a ldr r2, [r3, #0]
  56676. 8031bd4: 3201 adds r2, #1
  56677. 8031bd6: 601a str r2, [r3, #0]
  56678. 8031bd8: 4770 bx lr
  56679. 8031bda: bf00 nop
  56680. 8031bdc: 2000e17c .word 0x2000e17c
  56681. 08031be0 <snmp_inc_tcpinsegs>:
  56682. }
  56683. void snmp_inc_tcpinsegs(void)
  56684. {
  56685. tcpinsegs++;
  56686. 8031be0: 4b02 ldr r3, [pc, #8] ; (8031bec <snmp_inc_tcpinsegs+0xc>)
  56687. 8031be2: 681a ldr r2, [r3, #0]
  56688. 8031be4: 3201 adds r2, #1
  56689. 8031be6: 601a str r2, [r3, #0]
  56690. 8031be8: 4770 bx lr
  56691. 8031bea: bf00 nop
  56692. 8031bec: 2000e1f8 .word 0x2000e1f8
  56693. 08031bf0 <snmp_inc_tcpoutsegs>:
  56694. }
  56695. void snmp_inc_tcpoutsegs(void)
  56696. {
  56697. tcpoutsegs++;
  56698. 8031bf0: 4b02 ldr r3, [pc, #8] ; (8031bfc <snmp_inc_tcpoutsegs+0xc>)
  56699. 8031bf2: 681a ldr r2, [r3, #0]
  56700. 8031bf4: 3201 adds r2, #1
  56701. 8031bf6: 601a str r2, [r3, #0]
  56702. 8031bf8: 4770 bx lr
  56703. 8031bfa: bf00 nop
  56704. 8031bfc: 2000e244 .word 0x2000e244
  56705. 08031c00 <snmp_inc_tcpretranssegs>:
  56706. }
  56707. void snmp_inc_tcpretranssegs(void)
  56708. {
  56709. tcpretranssegs++;
  56710. 8031c00: 4b02 ldr r3, [pc, #8] ; (8031c0c <snmp_inc_tcpretranssegs+0xc>)
  56711. 8031c02: 681a ldr r2, [r3, #0]
  56712. 8031c04: 3201 adds r2, #1
  56713. 8031c06: 601a str r2, [r3, #0]
  56714. 8031c08: 4770 bx lr
  56715. 8031c0a: bf00 nop
  56716. 8031c0c: 2000e218 .word 0x2000e218
  56717. 08031c10 <snmp_inc_tcpinerrs>:
  56718. }
  56719. void snmp_inc_tcpinerrs(void)
  56720. {
  56721. tcpinerrs++;
  56722. 8031c10: 4b02 ldr r3, [pc, #8] ; (8031c1c <snmp_inc_tcpinerrs+0xc>)
  56723. 8031c12: 681a ldr r2, [r3, #0]
  56724. 8031c14: 3201 adds r2, #1
  56725. 8031c16: 601a str r2, [r3, #0]
  56726. 8031c18: 4770 bx lr
  56727. 8031c1a: bf00 nop
  56728. 8031c1c: 2000e1a4 .word 0x2000e1a4
  56729. 08031c20 <snmp_inc_tcpoutrsts>:
  56730. }
  56731. void snmp_inc_tcpoutrsts(void)
  56732. {
  56733. tcpoutrsts++;
  56734. 8031c20: 4b02 ldr r3, [pc, #8] ; (8031c2c <snmp_inc_tcpoutrsts+0xc>)
  56735. 8031c22: 681a ldr r2, [r3, #0]
  56736. 8031c24: 3201 adds r2, #1
  56737. 8031c26: 601a str r2, [r3, #0]
  56738. 8031c28: 4770 bx lr
  56739. 8031c2a: bf00 nop
  56740. 8031c2c: 2000e208 .word 0x2000e208
  56741. 08031c30 <snmp_inc_udpindatagrams>:
  56742. }
  56743. void snmp_inc_udpindatagrams(void)
  56744. {
  56745. udpindatagrams++;
  56746. 8031c30: 4b02 ldr r3, [pc, #8] ; (8031c3c <snmp_inc_udpindatagrams+0xc>)
  56747. 8031c32: 681a ldr r2, [r3, #0]
  56748. 8031c34: 3201 adds r2, #1
  56749. 8031c36: 601a str r2, [r3, #0]
  56750. 8031c38: 4770 bx lr
  56751. 8031c3a: bf00 nop
  56752. 8031c3c: 2000e224 .word 0x2000e224
  56753. 08031c40 <snmp_inc_udpnoports>:
  56754. }
  56755. void snmp_inc_udpnoports(void)
  56756. {
  56757. udpnoports++;
  56758. 8031c40: 4b02 ldr r3, [pc, #8] ; (8031c4c <snmp_inc_udpnoports+0xc>)
  56759. 8031c42: 681a ldr r2, [r3, #0]
  56760. 8031c44: 3201 adds r2, #1
  56761. 8031c46: 601a str r2, [r3, #0]
  56762. 8031c48: 4770 bx lr
  56763. 8031c4a: bf00 nop
  56764. 8031c4c: 2000e1dc .word 0x2000e1dc
  56765. 08031c50 <snmp_inc_udpinerrors>:
  56766. }
  56767. void snmp_inc_udpinerrors(void)
  56768. {
  56769. udpinerrors++;
  56770. 8031c50: 4b02 ldr r3, [pc, #8] ; (8031c5c <snmp_inc_udpinerrors+0xc>)
  56771. 8031c52: 681a ldr r2, [r3, #0]
  56772. 8031c54: 3201 adds r2, #1
  56773. 8031c56: 601a str r2, [r3, #0]
  56774. 8031c58: 4770 bx lr
  56775. 8031c5a: bf00 nop
  56776. 8031c5c: 2000e24c .word 0x2000e24c
  56777. 08031c60 <snmp_inc_udpoutdatagrams>:
  56778. }
  56779. void snmp_inc_udpoutdatagrams(void)
  56780. {
  56781. udpoutdatagrams++;
  56782. 8031c60: 4b02 ldr r3, [pc, #8] ; (8031c6c <snmp_inc_udpoutdatagrams+0xc>)
  56783. 8031c62: 681a ldr r2, [r3, #0]
  56784. 8031c64: 3201 adds r2, #1
  56785. 8031c66: 601a str r2, [r3, #0]
  56786. 8031c68: 4770 bx lr
  56787. 8031c6a: bf00 nop
  56788. 8031c6c: 2000e1d4 .word 0x2000e1d4
  56789. 08031c70 <snmp_insert_udpidx_tree>:
  56790. /**
  56791. * Inserts udpTable indexes (.udpLocalAddress.udpLocalPort)
  56792. * into index tree.
  56793. */
  56794. void snmp_insert_udpidx_tree(struct udp_pcb *pcb)
  56795. {
  56796. 8031c70: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  56797. 8031c74: 4604 mov r4, r0
  56798. 8031c76: b086 sub sp, #24
  56799. struct mib_list_node *udp_node;
  56800. s32_t udpidx[5];
  56801. u8_t level;
  56802. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  56803. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  56804. 8031c78: a901 add r1, sp, #4
  56805. 8031c7a: f000 f9c2 bl 8032002 <snmp_iptooid>
  56806. udpidx[4] = pcb->local_port;
  56807. 8031c7e: 8a63 ldrh r3, [r4, #18]
  56808. udp_node->nptr = (struct mib_node*)udp_rn;
  56809. if (udp_rn != NULL)
  56810. {
  56811. if (level == 3)
  56812. {
  56813. udp_rn->get_object_def = udpentry_get_object_def;
  56814. 8031c80: 4f17 ldr r7, [pc, #92] ; (8031ce0 <snmp_insert_udpidx_tree+0x70>)
  56815. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  56816. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  56817. udpidx[4] = pcb->local_port;
  56818. udp_rn = &udp_root;
  56819. 8031c82: 4c18 ldr r4, [pc, #96] ; (8031ce4 <snmp_insert_udpidx_tree+0x74>)
  56820. if (udp_rn != NULL)
  56821. {
  56822. if (level == 3)
  56823. {
  56824. udp_rn->get_object_def = udpentry_get_object_def;
  56825. udp_rn->get_value = udpentry_get_value;
  56826. 8031c84: f8df 806c ldr.w r8, [pc, #108] ; 8031cf4 <snmp_insert_udpidx_tree+0x84>
  56827. s32_t udpidx[5];
  56828. u8_t level;
  56829. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  56830. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  56831. udpidx[4] = pcb->local_port;
  56832. 8031c88: 9305 str r3, [sp, #20]
  56833. 8031c8a: 2500 movs r5, #0
  56834. udp_rn = &udp_root;
  56835. for (level = 0; level < 5; level++)
  56836. {
  56837. udp_node = NULL;
  56838. 8031c8c: 2300 movs r3, #0
  56839. 8031c8e: 9300 str r3, [sp, #0]
  56840. snmp_mib_node_insert(udp_rn, udpidx[level], &udp_node);
  56841. 8031c90: ab01 add r3, sp, #4
  56842. 8031c92: 4620 mov r0, r4
  56843. 8031c94: f853 1025 ldr.w r1, [r3, r5, lsl #2]
  56844. 8031c98: 466a mov r2, sp
  56845. 8031c9a: b2ee uxtb r6, r5
  56846. 8031c9c: f000 f9ec bl 8032078 <snmp_mib_node_insert>
  56847. if ((level != 4) && (udp_node != NULL))
  56848. 8031ca0: 2e04 cmp r6, #4
  56849. 8031ca2: d015 beq.n 8031cd0 <snmp_insert_udpidx_tree+0x60>
  56850. 8031ca4: 9b00 ldr r3, [sp, #0]
  56851. 8031ca6: b19b cbz r3, 8031cd0 <snmp_insert_udpidx_tree+0x60>
  56852. {
  56853. if (udp_node->nptr == NULL)
  56854. 8031ca8: 68dc ldr r4, [r3, #12]
  56855. 8031caa: b98c cbnz r4, 8031cd0 <snmp_insert_udpidx_tree+0x60>
  56856. {
  56857. udp_rn = snmp_mib_lrn_alloc();
  56858. 8031cac: f000 f9c2 bl 8032034 <snmp_mib_lrn_alloc>
  56859. udp_node->nptr = (struct mib_node*)udp_rn;
  56860. 8031cb0: 9b00 ldr r3, [sp, #0]
  56861. snmp_mib_node_insert(udp_rn, udpidx[level], &udp_node);
  56862. if ((level != 4) && (udp_node != NULL))
  56863. {
  56864. if (udp_node->nptr == NULL)
  56865. {
  56866. udp_rn = snmp_mib_lrn_alloc();
  56867. 8031cb2: 4604 mov r4, r0
  56868. udp_node->nptr = (struct mib_node*)udp_rn;
  56869. 8031cb4: 60d8 str r0, [r3, #12]
  56870. if (udp_rn != NULL)
  56871. 8031cb6: b918 cbnz r0, 8031cc0 <snmp_insert_udpidx_tree+0x50>
  56872. {
  56873. udp_rn = (struct mib_list_rootnode*)udp_node->nptr;
  56874. }
  56875. }
  56876. }
  56877. udptable.maxlength = 1;
  56878. 8031cb8: 4b0b ldr r3, [pc, #44] ; (8031ce8 <snmp_insert_udpidx_tree+0x78>)
  56879. 8031cba: 2201 movs r2, #1
  56880. 8031cbc: 825a strh r2, [r3, #18]
  56881. 8031cbe: e00b b.n 8031cd8 <snmp_insert_udpidx_tree+0x68>
  56882. {
  56883. udp_rn = snmp_mib_lrn_alloc();
  56884. udp_node->nptr = (struct mib_node*)udp_rn;
  56885. if (udp_rn != NULL)
  56886. {
  56887. if (level == 3)
  56888. 8031cc0: 2e03 cmp r6, #3
  56889. 8031cc2: d105 bne.n 8031cd0 <snmp_insert_udpidx_tree+0x60>
  56890. {
  56891. udp_rn->get_object_def = udpentry_get_object_def;
  56892. udp_rn->get_value = udpentry_get_value;
  56893. udp_rn->set_test = noleafs_set_test;
  56894. 8031cc4: 4b09 ldr r3, [pc, #36] ; (8031cec <snmp_insert_udpidx_tree+0x7c>)
  56895. if (udp_rn != NULL)
  56896. {
  56897. if (level == 3)
  56898. {
  56899. udp_rn->get_object_def = udpentry_get_object_def;
  56900. udp_rn->get_value = udpentry_get_value;
  56901. 8031cc6: e880 0180 stmia.w r0, {r7, r8}
  56902. udp_rn->set_test = noleafs_set_test;
  56903. 8031cca: 6083 str r3, [r0, #8]
  56904. udp_rn->set_value = noleafs_set_value;
  56905. 8031ccc: 4b08 ldr r3, [pc, #32] ; (8031cf0 <snmp_insert_udpidx_tree+0x80>)
  56906. 8031cce: 60c3 str r3, [r0, #12]
  56907. 8031cd0: 3501 adds r5, #1
  56908. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  56909. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  56910. udpidx[4] = pcb->local_port;
  56911. udp_rn = &udp_root;
  56912. for (level = 0; level < 5; level++)
  56913. 8031cd2: 2d05 cmp r5, #5
  56914. 8031cd4: d1da bne.n 8031c8c <snmp_insert_udpidx_tree+0x1c>
  56915. 8031cd6: e7ef b.n 8031cb8 <snmp_insert_udpidx_tree+0x48>
  56916. udp_rn = (struct mib_list_rootnode*)udp_node->nptr;
  56917. }
  56918. }
  56919. }
  56920. udptable.maxlength = 1;
  56921. }
  56922. 8031cd8: b006 add sp, #24
  56923. 8031cda: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  56924. 8031cde: bf00 nop
  56925. 8031ce0: 0803133d .word 0x0803133d
  56926. 8031ce4: 20001644 .word 0x20001644
  56927. 8031ce8: 20001628 .word 0x20001628
  56928. 8031cec: 080309cb .word 0x080309cb
  56929. 8031cf0: 080309cf .word 0x080309cf
  56930. 8031cf4: 08030ff9 .word 0x08030ff9
  56931. 08031cf8 <snmp_delete_udpidx_tree>:
  56932. /**
  56933. * Removes udpTable indexes (.udpLocalAddress.udpLocalPort)
  56934. * from index tree.
  56935. */
  56936. void snmp_delete_udpidx_tree(struct udp_pcb *pcb)
  56937. {
  56938. 8031cf8: b570 push {r4, r5, r6, lr}
  56939. 8031cfa: 4604 mov r4, r0
  56940. 8031cfc: b090 sub sp, #64 ; 0x40
  56941. struct mib_list_node *udp_n, *del_n[5];
  56942. s32_t udpidx[5];
  56943. u8_t bindings, fc, level, del_cnt;
  56944. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  56945. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  56946. 8031cfe: a90b add r1, sp, #44 ; 0x2c
  56947. 8031d00: f000 f97f bl 8032002 <snmp_iptooid>
  56948. udpidx[4] = pcb->local_port;
  56949. 8031d04: 8a61 ldrh r1, [r4, #18]
  56950. /* count PCBs for a given binding
  56951. (e.g. when reusing ports or for temp output PCBs) */
  56952. bindings = 0;
  56953. npcb = udp_pcbs;
  56954. 8031d06: 4b2a ldr r3, [pc, #168] ; (8031db0 <snmp_delete_udpidx_tree+0xb8>)
  56955. s32_t udpidx[5];
  56956. u8_t bindings, fc, level, del_cnt;
  56957. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  56958. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  56959. udpidx[4] = pcb->local_port;
  56960. 8031d08: 910f str r1, [sp, #60] ; 0x3c
  56961. /* count PCBs for a given binding
  56962. (e.g. when reusing ports or for temp output PCBs) */
  56963. bindings = 0;
  56964. npcb = udp_pcbs;
  56965. 8031d0a: 681b ldr r3, [r3, #0]
  56966. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  56967. udpidx[4] = pcb->local_port;
  56968. /* count PCBs for a given binding
  56969. (e.g. when reusing ports or for temp output PCBs) */
  56970. bindings = 0;
  56971. 8031d0c: 2200 movs r2, #0
  56972. npcb = udp_pcbs;
  56973. while ((npcb != NULL))
  56974. 8031d0e: e009 b.n 8031d24 <snmp_delete_udpidx_tree+0x2c>
  56975. {
  56976. if (ip_addr_cmp(&npcb->local_ip, &pcb->local_ip) &&
  56977. 8031d10: 681d ldr r5, [r3, #0]
  56978. 8031d12: 6820 ldr r0, [r4, #0]
  56979. 8031d14: 4285 cmp r5, r0
  56980. 8031d16: d104 bne.n 8031d22 <snmp_delete_udpidx_tree+0x2a>
  56981. (npcb->local_port == udpidx[4]))
  56982. 8031d18: 8a58 ldrh r0, [r3, #18]
  56983. (e.g. when reusing ports or for temp output PCBs) */
  56984. bindings = 0;
  56985. npcb = udp_pcbs;
  56986. while ((npcb != NULL))
  56987. {
  56988. if (ip_addr_cmp(&npcb->local_ip, &pcb->local_ip) &&
  56989. 8031d1a: 4288 cmp r0, r1
  56990. 8031d1c: d101 bne.n 8031d22 <snmp_delete_udpidx_tree+0x2a>
  56991. (npcb->local_port == udpidx[4]))
  56992. {
  56993. bindings++;
  56994. 8031d1e: 3201 adds r2, #1
  56995. 8031d20: b2d2 uxtb r2, r2
  56996. }
  56997. npcb = npcb->next;
  56998. 8031d22: 68db ldr r3, [r3, #12]
  56999. /* count PCBs for a given binding
  57000. (e.g. when reusing ports or for temp output PCBs) */
  57001. bindings = 0;
  57002. npcb = udp_pcbs;
  57003. while ((npcb != NULL))
  57004. 8031d24: 2b00 cmp r3, #0
  57005. 8031d26: d1f3 bne.n 8031d10 <snmp_delete_udpidx_tree+0x18>
  57006. {
  57007. bindings++;
  57008. }
  57009. npcb = npcb->next;
  57010. }
  57011. if (bindings == 1)
  57012. 8031d28: 2a01 cmp r2, #1
  57013. 8031d2a: d004 beq.n 8031d36 <snmp_delete_udpidx_tree+0x3e>
  57014. snmp_mib_lrn_free(next);
  57015. }
  57016. }
  57017. }
  57018. /* disable getnext traversal on empty table */
  57019. if (udp_root.count == 0) udptable.maxlength = 0;
  57020. 8031d2c: 4b21 ldr r3, [pc, #132] ; (8031db4 <snmp_delete_udpidx_tree+0xbc>)
  57021. 8031d2e: 8b9b ldrh r3, [r3, #28]
  57022. 8031d30: 2b00 cmp r3, #0
  57023. 8031d32: d039 beq.n 8031da8 <snmp_delete_udpidx_tree+0xb0>
  57024. 8031d34: e03a b.n 8031dac <snmp_delete_udpidx_tree+0xb4>
  57025. {
  57026. /* selectively remove */
  57027. /* mark nodes for deletion */
  57028. level = 0;
  57029. del_cnt = 0;
  57030. udp_rn = &udp_root;
  57031. 8031d36: 4d1f ldr r5, [pc, #124] ; (8031db4 <snmp_delete_udpidx_tree+0xbc>)
  57032. {
  57033. bindings++;
  57034. }
  57035. npcb = npcb->next;
  57036. }
  57037. if (bindings == 1)
  57038. 8031d38: 461e mov r6, r3
  57039. 8031d3a: 461c mov r4, r3
  57040. level = 0;
  57041. del_cnt = 0;
  57042. udp_rn = &udp_root;
  57043. while ((level < 5) && (udp_rn != NULL))
  57044. {
  57045. fc = snmp_mib_node_find(udp_rn, udpidx[level], &udp_n);
  57046. 8031d3c: ab0b add r3, sp, #44 ; 0x2c
  57047. 8031d3e: 4628 mov r0, r5
  57048. 8031d40: 58f1 ldr r1, [r6, r3]
  57049. 8031d42: 466a mov r2, sp
  57050. 8031d44: f000 f9d3 bl 80320ee <snmp_mib_node_find>
  57051. 8031d48: b2c0 uxtb r0, r0
  57052. if (fc == 0)
  57053. 8031d4a: b198 cbz r0, 8031d74 <snmp_delete_udpidx_tree+0x7c>
  57054. {
  57055. /* udpidx[level] does not exist */
  57056. del_cnt = 0;
  57057. udp_rn = NULL;
  57058. }
  57059. else if (fc == 1)
  57060. 8031d4c: 2801 cmp r0, #1
  57061. 8031d4e: d10b bne.n 8031d68 <snmp_delete_udpidx_tree+0x70>
  57062. {
  57063. del_rn[del_cnt] = udp_rn;
  57064. 8031d50: ab10 add r3, sp, #64 ; 0x40
  57065. 8031d52: eb03 0284 add.w r2, r3, r4, lsl #2
  57066. del_n[del_cnt] = udp_n;
  57067. 8031d56: 9b00 ldr r3, [sp, #0]
  57068. del_cnt = 0;
  57069. udp_rn = NULL;
  57070. }
  57071. else if (fc == 1)
  57072. {
  57073. del_rn[del_cnt] = udp_rn;
  57074. 8031d58: f842 5c3c str.w r5, [r2, #-60]
  57075. del_n[del_cnt] = udp_n;
  57076. del_cnt++;
  57077. 8031d5c: 3401 adds r4, #1
  57078. udp_rn = NULL;
  57079. }
  57080. else if (fc == 1)
  57081. {
  57082. del_rn[del_cnt] = udp_rn;
  57083. del_n[del_cnt] = udp_n;
  57084. 8031d5e: f842 3c28 str.w r3, [r2, #-40]
  57085. del_cnt++;
  57086. 8031d62: b2e4 uxtb r4, r4
  57087. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  57088. 8031d64: 68dd ldr r5, [r3, #12]
  57089. 8031d66: e007 b.n 8031d78 <snmp_delete_udpidx_tree+0x80>
  57090. }
  57091. else if (fc == 2)
  57092. 8031d68: 2802 cmp r0, #2
  57093. 8031d6a: d105 bne.n 8031d78 <snmp_delete_udpidx_tree+0x80>
  57094. {
  57095. /* reset delete (2 or more childs) */
  57096. del_cnt = 0;
  57097. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  57098. 8031d6c: 9b00 ldr r3, [sp, #0]
  57099. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  57100. }
  57101. else if (fc == 2)
  57102. {
  57103. /* reset delete (2 or more childs) */
  57104. del_cnt = 0;
  57105. 8031d6e: 2400 movs r4, #0
  57106. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  57107. 8031d70: 68dd ldr r5, [r3, #12]
  57108. 8031d72: e001 b.n 8031d78 <snmp_delete_udpidx_tree+0x80>
  57109. {
  57110. fc = snmp_mib_node_find(udp_rn, udpidx[level], &udp_n);
  57111. if (fc == 0)
  57112. {
  57113. /* udpidx[level] does not exist */
  57114. del_cnt = 0;
  57115. 8031d74: 4604 mov r4, r0
  57116. udp_rn = NULL;
  57117. 8031d76: 4605 mov r5, r0
  57118. /* selectively remove */
  57119. /* mark nodes for deletion */
  57120. level = 0;
  57121. del_cnt = 0;
  57122. udp_rn = &udp_root;
  57123. while ((level < 5) && (udp_rn != NULL))
  57124. 8031d78: 2e10 cmp r6, #16
  57125. 8031d7a: d012 beq.n 8031da2 <snmp_delete_udpidx_tree+0xaa>
  57126. 8031d7c: 3604 adds r6, #4
  57127. 8031d7e: 2d00 cmp r5, #0
  57128. 8031d80: d1dc bne.n 8031d3c <snmp_delete_udpidx_tree+0x44>
  57129. 8031d82: e00e b.n 8031da2 <snmp_delete_udpidx_tree+0xaa>
  57130. level++;
  57131. }
  57132. /* delete marked index nodes */
  57133. while (del_cnt > 0)
  57134. {
  57135. del_cnt--;
  57136. 8031d84: 3c01 subs r4, #1
  57137. 8031d86: b2e4 uxtb r4, r4
  57138. udp_rn = del_rn[del_cnt];
  57139. 8031d88: aa10 add r2, sp, #64 ; 0x40
  57140. 8031d8a: eb02 0384 add.w r3, r2, r4, lsl #2
  57141. udp_n = del_n[del_cnt];
  57142. 8031d8e: f853 1c28 ldr.w r1, [r3, #-40]
  57143. /* delete marked index nodes */
  57144. while (del_cnt > 0)
  57145. {
  57146. del_cnt--;
  57147. udp_rn = del_rn[del_cnt];
  57148. 8031d92: f853 0c3c ldr.w r0, [r3, #-60]
  57149. udp_n = del_n[del_cnt];
  57150. 8031d96: 9100 str r1, [sp, #0]
  57151. next = snmp_mib_node_delete(udp_rn, udp_n);
  57152. 8031d98: f000 f9c3 bl 8032122 <snmp_mib_node_delete>
  57153. if (next != NULL)
  57154. 8031d9c: b108 cbz r0, 8031da2 <snmp_delete_udpidx_tree+0xaa>
  57155. {
  57156. LWIP_ASSERT("next_count == 0",next->count == 0);
  57157. snmp_mib_lrn_free(next);
  57158. 8031d9e: f000 f967 bl 8032070 <snmp_mib_lrn_free>
  57159. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  57160. }
  57161. level++;
  57162. }
  57163. /* delete marked index nodes */
  57164. while (del_cnt > 0)
  57165. 8031da2: 2c00 cmp r4, #0
  57166. 8031da4: d1ee bne.n 8031d84 <snmp_delete_udpidx_tree+0x8c>
  57167. 8031da6: e7c1 b.n 8031d2c <snmp_delete_udpidx_tree+0x34>
  57168. snmp_mib_lrn_free(next);
  57169. }
  57170. }
  57171. }
  57172. /* disable getnext traversal on empty table */
  57173. if (udp_root.count == 0) udptable.maxlength = 0;
  57174. 8031da8: 4a03 ldr r2, [pc, #12] ; (8031db8 <snmp_delete_udpidx_tree+0xc0>)
  57175. 8031daa: 8253 strh r3, [r2, #18]
  57176. }
  57177. 8031dac: b010 add sp, #64 ; 0x40
  57178. 8031dae: bd70 pop {r4, r5, r6, pc}
  57179. 8031db0: 20010ff8 .word 0x20010ff8
  57180. 8031db4: 20001644 .word 0x20001644
  57181. 8031db8: 20001628 .word 0x20001628
  57182. 08031dbc <snmp_inc_snmpinpkts>:
  57183. void snmp_inc_snmpinpkts(void)
  57184. {
  57185. snmpinpkts++;
  57186. 8031dbc: 4b02 ldr r3, [pc, #8] ; (8031dc8 <snmp_inc_snmpinpkts+0xc>)
  57187. 8031dbe: 681a ldr r2, [r3, #0]
  57188. 8031dc0: 3201 adds r2, #1
  57189. 8031dc2: 601a str r2, [r3, #0]
  57190. 8031dc4: 4770 bx lr
  57191. 8031dc6: bf00 nop
  57192. 8031dc8: 2000e180 .word 0x2000e180
  57193. 08031dcc <snmp_inc_snmpoutpkts>:
  57194. }
  57195. void snmp_inc_snmpoutpkts(void)
  57196. {
  57197. snmpoutpkts++;
  57198. 8031dcc: 4b02 ldr r3, [pc, #8] ; (8031dd8 <snmp_inc_snmpoutpkts+0xc>)
  57199. 8031dce: 681a ldr r2, [r3, #0]
  57200. 8031dd0: 3201 adds r2, #1
  57201. 8031dd2: 601a str r2, [r3, #0]
  57202. 8031dd4: 4770 bx lr
  57203. 8031dd6: bf00 nop
  57204. 8031dd8: 2000e250 .word 0x2000e250
  57205. 08031ddc <snmp_inc_snmpinbadversions>:
  57206. }
  57207. void snmp_inc_snmpinbadversions(void)
  57208. {
  57209. snmpinbadversions++;
  57210. 8031ddc: 4b02 ldr r3, [pc, #8] ; (8031de8 <snmp_inc_snmpinbadversions+0xc>)
  57211. 8031dde: 681a ldr r2, [r3, #0]
  57212. 8031de0: 3201 adds r2, #1
  57213. 8031de2: 601a str r2, [r3, #0]
  57214. 8031de4: 4770 bx lr
  57215. 8031de6: bf00 nop
  57216. 8031de8: 2000e23c .word 0x2000e23c
  57217. 08031dec <snmp_inc_snmpinbadcommunitynames>:
  57218. }
  57219. void snmp_inc_snmpinbadcommunitynames(void)
  57220. {
  57221. snmpinbadcommunitynames++;
  57222. 8031dec: 4b02 ldr r3, [pc, #8] ; (8031df8 <snmp_inc_snmpinbadcommunitynames+0xc>)
  57223. 8031dee: 681a ldr r2, [r3, #0]
  57224. 8031df0: 3201 adds r2, #1
  57225. 8031df2: 601a str r2, [r3, #0]
  57226. 8031df4: 4770 bx lr
  57227. 8031df6: bf00 nop
  57228. 8031df8: 2000e154 .word 0x2000e154
  57229. 08031dfc <snmp_inc_snmpinasnparseerrs>:
  57230. snmpinbadcommunityuses++;
  57231. }
  57232. void snmp_inc_snmpinasnparseerrs(void)
  57233. {
  57234. snmpinasnparseerrs++;
  57235. 8031dfc: 4b02 ldr r3, [pc, #8] ; (8031e08 <snmp_inc_snmpinasnparseerrs+0xc>)
  57236. 8031dfe: 681a ldr r2, [r3, #0]
  57237. 8031e00: 3201 adds r2, #1
  57238. 8031e02: 601a str r2, [r3, #0]
  57239. 8031e04: 4770 bx lr
  57240. 8031e06: bf00 nop
  57241. 8031e08: 2000e240 .word 0x2000e240
  57242. 08031e0c <snmp_inc_snmpintoobigs>:
  57243. }
  57244. void snmp_inc_snmpintoobigs(void)
  57245. {
  57246. snmpintoobigs++;
  57247. 8031e0c: 4b02 ldr r3, [pc, #8] ; (8031e18 <snmp_inc_snmpintoobigs+0xc>)
  57248. 8031e0e: 681a ldr r2, [r3, #0]
  57249. 8031e10: 3201 adds r2, #1
  57250. 8031e12: 601a str r2, [r3, #0]
  57251. 8031e14: 4770 bx lr
  57252. 8031e16: bf00 nop
  57253. 8031e18: 2000e200 .word 0x2000e200
  57254. 08031e1c <snmp_inc_snmpinnosuchnames>:
  57255. }
  57256. void snmp_inc_snmpinnosuchnames(void)
  57257. {
  57258. snmpinnosuchnames++;
  57259. 8031e1c: 4b02 ldr r3, [pc, #8] ; (8031e28 <snmp_inc_snmpinnosuchnames+0xc>)
  57260. 8031e1e: 681a ldr r2, [r3, #0]
  57261. 8031e20: 3201 adds r2, #1
  57262. 8031e22: 601a str r2, [r3, #0]
  57263. 8031e24: 4770 bx lr
  57264. 8031e26: bf00 nop
  57265. 8031e28: 2000e280 .word 0x2000e280
  57266. 08031e2c <snmp_inc_snmpinbadvalues>:
  57267. }
  57268. void snmp_inc_snmpinbadvalues(void)
  57269. {
  57270. snmpinbadvalues++;
  57271. 8031e2c: 4b02 ldr r3, [pc, #8] ; (8031e38 <snmp_inc_snmpinbadvalues+0xc>)
  57272. 8031e2e: 681a ldr r2, [r3, #0]
  57273. 8031e30: 3201 adds r2, #1
  57274. 8031e32: 601a str r2, [r3, #0]
  57275. 8031e34: 4770 bx lr
  57276. 8031e36: bf00 nop
  57277. 8031e38: 2000e21c .word 0x2000e21c
  57278. 08031e3c <snmp_inc_snmpinreadonlys>:
  57279. }
  57280. void snmp_inc_snmpinreadonlys(void)
  57281. {
  57282. snmpinreadonlys++;
  57283. 8031e3c: 4b02 ldr r3, [pc, #8] ; (8031e48 <snmp_inc_snmpinreadonlys+0xc>)
  57284. 8031e3e: 681a ldr r2, [r3, #0]
  57285. 8031e40: 3201 adds r2, #1
  57286. 8031e42: 601a str r2, [r3, #0]
  57287. 8031e44: 4770 bx lr
  57288. 8031e46: bf00 nop
  57289. 8031e48: 2000e1f0 .word 0x2000e1f0
  57290. 08031e4c <snmp_inc_snmpingenerrs>:
  57291. }
  57292. void snmp_inc_snmpingenerrs(void)
  57293. {
  57294. snmpingenerrs++;
  57295. 8031e4c: 4b02 ldr r3, [pc, #8] ; (8031e58 <snmp_inc_snmpingenerrs+0xc>)
  57296. 8031e4e: 681a ldr r2, [r3, #0]
  57297. 8031e50: 3201 adds r2, #1
  57298. 8031e52: 601a str r2, [r3, #0]
  57299. 8031e54: 4770 bx lr
  57300. 8031e56: bf00 nop
  57301. 8031e58: 2000e1c8 .word 0x2000e1c8
  57302. 08031e5c <snmp_add_snmpintotalreqvars>:
  57303. }
  57304. void snmp_add_snmpintotalreqvars(u8_t value)
  57305. {
  57306. snmpintotalreqvars += value;
  57307. 8031e5c: 4b02 ldr r3, [pc, #8] ; (8031e68 <snmp_add_snmpintotalreqvars+0xc>)
  57308. 8031e5e: 681a ldr r2, [r3, #0]
  57309. 8031e60: 1880 adds r0, r0, r2
  57310. 8031e62: 6018 str r0, [r3, #0]
  57311. 8031e64: 4770 bx lr
  57312. 8031e66: bf00 nop
  57313. 8031e68: 2000e220 .word 0x2000e220
  57314. 08031e6c <snmp_add_snmpintotalsetvars>:
  57315. }
  57316. void snmp_add_snmpintotalsetvars(u8_t value)
  57317. {
  57318. snmpintotalsetvars += value;
  57319. 8031e6c: 4b02 ldr r3, [pc, #8] ; (8031e78 <snmp_add_snmpintotalsetvars+0xc>)
  57320. 8031e6e: 681a ldr r2, [r3, #0]
  57321. 8031e70: 1880 adds r0, r0, r2
  57322. 8031e72: 6018 str r0, [r3, #0]
  57323. 8031e74: 4770 bx lr
  57324. 8031e76: bf00 nop
  57325. 8031e78: 2000e160 .word 0x2000e160
  57326. 08031e7c <snmp_inc_snmpingetrequests>:
  57327. }
  57328. void snmp_inc_snmpingetrequests(void)
  57329. {
  57330. snmpingetrequests++;
  57331. 8031e7c: 4b02 ldr r3, [pc, #8] ; (8031e88 <snmp_inc_snmpingetrequests+0xc>)
  57332. 8031e7e: 681a ldr r2, [r3, #0]
  57333. 8031e80: 3201 adds r2, #1
  57334. 8031e82: 601a str r2, [r3, #0]
  57335. 8031e84: 4770 bx lr
  57336. 8031e86: bf00 nop
  57337. 8031e88: 2000e1b4 .word 0x2000e1b4
  57338. 08031e8c <snmp_inc_snmpingetnexts>:
  57339. }
  57340. void snmp_inc_snmpingetnexts(void)
  57341. {
  57342. snmpingetnexts++;
  57343. 8031e8c: 4b02 ldr r3, [pc, #8] ; (8031e98 <snmp_inc_snmpingetnexts+0xc>)
  57344. 8031e8e: 681a ldr r2, [r3, #0]
  57345. 8031e90: 3201 adds r2, #1
  57346. 8031e92: 601a str r2, [r3, #0]
  57347. 8031e94: 4770 bx lr
  57348. 8031e96: bf00 nop
  57349. 8031e98: 2000e138 .word 0x2000e138
  57350. 08031e9c <snmp_inc_snmpinsetrequests>:
  57351. }
  57352. void snmp_inc_snmpinsetrequests(void)
  57353. {
  57354. snmpinsetrequests++;
  57355. 8031e9c: 4b02 ldr r3, [pc, #8] ; (8031ea8 <snmp_inc_snmpinsetrequests+0xc>)
  57356. 8031e9e: 681a ldr r2, [r3, #0]
  57357. 8031ea0: 3201 adds r2, #1
  57358. 8031ea2: 601a str r2, [r3, #0]
  57359. 8031ea4: 4770 bx lr
  57360. 8031ea6: bf00 nop
  57361. 8031ea8: 2000e25c .word 0x2000e25c
  57362. 08031eac <snmp_inc_snmpingetresponses>:
  57363. }
  57364. void snmp_inc_snmpingetresponses(void)
  57365. {
  57366. snmpingetresponses++;
  57367. 8031eac: 4b02 ldr r3, [pc, #8] ; (8031eb8 <snmp_inc_snmpingetresponses+0xc>)
  57368. 8031eae: 681a ldr r2, [r3, #0]
  57369. 8031eb0: 3201 adds r2, #1
  57370. 8031eb2: 601a str r2, [r3, #0]
  57371. 8031eb4: 4770 bx lr
  57372. 8031eb6: bf00 nop
  57373. 8031eb8: 2000e1b0 .word 0x2000e1b0
  57374. 08031ebc <snmp_inc_snmpintraps>:
  57375. }
  57376. void snmp_inc_snmpintraps(void)
  57377. {
  57378. snmpintraps++;
  57379. 8031ebc: 4b02 ldr r3, [pc, #8] ; (8031ec8 <snmp_inc_snmpintraps+0xc>)
  57380. 8031ebe: 681a ldr r2, [r3, #0]
  57381. 8031ec0: 3201 adds r2, #1
  57382. 8031ec2: 601a str r2, [r3, #0]
  57383. 8031ec4: 4770 bx lr
  57384. 8031ec6: bf00 nop
  57385. 8031ec8: 2000e148 .word 0x2000e148
  57386. 08031ecc <snmp_inc_snmpouttoobigs>:
  57387. }
  57388. void snmp_inc_snmpouttoobigs(void)
  57389. {
  57390. snmpouttoobigs++;
  57391. 8031ecc: 4b02 ldr r3, [pc, #8] ; (8031ed8 <snmp_inc_snmpouttoobigs+0xc>)
  57392. 8031ece: 681a ldr r2, [r3, #0]
  57393. 8031ed0: 3201 adds r2, #1
  57394. 8031ed2: 601a str r2, [r3, #0]
  57395. 8031ed4: 4770 bx lr
  57396. 8031ed6: bf00 nop
  57397. 8031ed8: 2000e198 .word 0x2000e198
  57398. 08031edc <snmp_inc_snmpoutnosuchnames>:
  57399. }
  57400. void snmp_inc_snmpoutnosuchnames(void)
  57401. {
  57402. snmpoutnosuchnames++;
  57403. 8031edc: 4b02 ldr r3, [pc, #8] ; (8031ee8 <snmp_inc_snmpoutnosuchnames+0xc>)
  57404. 8031ede: 681a ldr r2, [r3, #0]
  57405. 8031ee0: 3201 adds r2, #1
  57406. 8031ee2: 601a str r2, [r3, #0]
  57407. 8031ee4: 4770 bx lr
  57408. 8031ee6: bf00 nop
  57409. 8031ee8: 2000e164 .word 0x2000e164
  57410. 08031eec <snmp_inc_snmpoutbadvalues>:
  57411. }
  57412. void snmp_inc_snmpoutbadvalues(void)
  57413. {
  57414. snmpoutbadvalues++;
  57415. 8031eec: 4b02 ldr r3, [pc, #8] ; (8031ef8 <snmp_inc_snmpoutbadvalues+0xc>)
  57416. 8031eee: 681a ldr r2, [r3, #0]
  57417. 8031ef0: 3201 adds r2, #1
  57418. 8031ef2: 601a str r2, [r3, #0]
  57419. 8031ef4: 4770 bx lr
  57420. 8031ef6: bf00 nop
  57421. 8031ef8: 2000e144 .word 0x2000e144
  57422. 08031efc <snmp_inc_snmpoutgenerrs>:
  57423. }
  57424. void snmp_inc_snmpoutgenerrs(void)
  57425. {
  57426. snmpoutgenerrs++;
  57427. 8031efc: 4b02 ldr r3, [pc, #8] ; (8031f08 <snmp_inc_snmpoutgenerrs+0xc>)
  57428. 8031efe: 681a ldr r2, [r3, #0]
  57429. 8031f00: 3201 adds r2, #1
  57430. 8031f02: 601a str r2, [r3, #0]
  57431. 8031f04: 4770 bx lr
  57432. 8031f06: bf00 nop
  57433. 8031f08: 2000e284 .word 0x2000e284
  57434. 08031f0c <snmp_inc_snmpoutgetresponses>:
  57435. snmpoutsetrequests++;
  57436. }
  57437. void snmp_inc_snmpoutgetresponses(void)
  57438. {
  57439. snmpoutgetresponses++;
  57440. 8031f0c: 4b02 ldr r3, [pc, #8] ; (8031f18 <snmp_inc_snmpoutgetresponses+0xc>)
  57441. 8031f0e: 681a ldr r2, [r3, #0]
  57442. 8031f10: 3201 adds r2, #1
  57443. 8031f12: 601a str r2, [r3, #0]
  57444. 8031f14: 4770 bx lr
  57445. 8031f16: bf00 nop
  57446. 8031f18: 2000e140 .word 0x2000e140
  57447. 08031f1c <snmp_inc_snmpouttraps>:
  57448. }
  57449. void snmp_inc_snmpouttraps(void)
  57450. {
  57451. snmpouttraps++;
  57452. 8031f1c: 4b02 ldr r3, [pc, #8] ; (8031f28 <snmp_inc_snmpouttraps+0xc>)
  57453. 8031f1e: 681a ldr r2, [r3, #0]
  57454. 8031f20: 3201 adds r2, #1
  57455. 8031f22: 601a str r2, [r3, #0]
  57456. 8031f24: 4770 bx lr
  57457. 8031f26: bf00 nop
  57458. 8031f28: 2000e1b8 .word 0x2000e1b8
  57459. 08031f2c <snmp_get_snmpgrpid_ptr>:
  57460. }
  57461. void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid)
  57462. {
  57463. *oid = &snmpgrp_id;
  57464. 8031f2c: 4b01 ldr r3, [pc, #4] ; (8031f34 <snmp_get_snmpgrpid_ptr+0x8>)
  57465. 8031f2e: 6003 str r3, [r0, #0]
  57466. 8031f30: 4770 bx lr
  57467. 8031f32: bf00 nop
  57468. 8031f34: 20001854 .word 0x20001854
  57469. 08031f38 <snmp_get_snmpenableauthentraps>:
  57470. }
  57471. }
  57472. void snmp_get_snmpenableauthentraps(u8_t *value)
  57473. {
  57474. *value = *snmpenableauthentraps_ptr;
  57475. 8031f38: 4b02 ldr r3, [pc, #8] ; (8031f44 <snmp_get_snmpenableauthentraps+0xc>)
  57476. 8031f3a: 681b ldr r3, [r3, #0]
  57477. 8031f3c: 781b ldrb r3, [r3, #0]
  57478. 8031f3e: 7003 strb r3, [r0, #0]
  57479. 8031f40: 4770 bx lr
  57480. 8031f42: bf00 nop
  57481. 8031f44: 20001768 .word 0x20001768
  57482. 08031f48 <push_node>:
  57483. /**
  57484. * Pushes nse struct onto stack.
  57485. */
  57486. static void
  57487. push_node(struct nse* node)
  57488. {
  57489. 8031f48: b530 push {r4, r5, lr}
  57490. LWIP_ASSERT("node_stack_cnt < NODE_STACK_SIZE",node_stack_cnt < NODE_STACK_SIZE);
  57491. LWIP_DEBUGF(SNMP_MIB_DEBUG,("push_node() node=%p id=%"S32_F"\n",(void*)(node->r_ptr),node->r_id));
  57492. if (node_stack_cnt < NODE_STACK_SIZE)
  57493. 8031f4a: 4d07 ldr r5, [pc, #28] ; (8031f68 <push_node+0x20>)
  57494. 8031f4c: 782b ldrb r3, [r5, #0]
  57495. 8031f4e: 2b1f cmp r3, #31
  57496. 8031f50: d808 bhi.n 8031f64 <push_node+0x1c>
  57497. {
  57498. node_stack[node_stack_cnt] = *node;
  57499. 8031f52: 4a06 ldr r2, [pc, #24] ; (8031f6c <push_node+0x24>)
  57500. 8031f54: 240c movs r4, #12
  57501. 8031f56: fb04 2403 mla r4, r4, r3, r2
  57502. 8031f5a: c807 ldmia r0, {r0, r1, r2}
  57503. 8031f5c: e884 0007 stmia.w r4, {r0, r1, r2}
  57504. node_stack_cnt++;
  57505. 8031f60: 3301 adds r3, #1
  57506. 8031f62: 702b strb r3, [r5, #0]
  57507. 8031f64: bd30 pop {r4, r5, pc}
  57508. 8031f66: bf00 nop
  57509. 8031f68: 2000e288 .word 0x2000e288
  57510. 8031f6c: 2000e28c .word 0x2000e28c
  57511. 08031f70 <empty_table>:
  57512. empty_table(struct mib_node *node)
  57513. {
  57514. u8_t node_type;
  57515. u8_t empty = 0;
  57516. if (node != NULL)
  57517. 8031f70: b1d0 cbz r0, 8031fa8 <empty_table+0x38>
  57518. {
  57519. node_type = node->node_type;
  57520. 8031f72: 7c03 ldrb r3, [r0, #16]
  57521. if (node_type == MIB_NODE_LR)
  57522. 8031f74: 2b04 cmp r3, #4
  57523. 8031f76: d105 bne.n 8031f84 <empty_table+0x14>
  57524. {
  57525. struct mib_list_rootnode *lrn;
  57526. lrn = (struct mib_list_rootnode *)node;
  57527. if ((lrn->count == 0) || (lrn->head == NULL))
  57528. 8031f78: 8b83 ldrh r3, [r0, #28]
  57529. 8031f7a: b903 cbnz r3, 8031f7e <empty_table+0xe>
  57530. 8031f7c: e009 b.n 8031f92 <empty_table+0x22>
  57531. 8031f7e: 6943 ldr r3, [r0, #20]
  57532. 8031f80: b13b cbz r3, 8031f92 <empty_table+0x22>
  57533. 8031f82: e010 b.n 8031fa6 <empty_table+0x36>
  57534. {
  57535. empty = 1;
  57536. }
  57537. }
  57538. else if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
  57539. 8031f84: 1e9a subs r2, r3, #2
  57540. 8031f86: 2a01 cmp r2, #1
  57541. 8031f88: d805 bhi.n 8031f96 <empty_table+0x26>
  57542. {
  57543. struct mib_array_node *an;
  57544. an = (struct mib_array_node *)node;
  57545. if ((an->maxlength == 0) || (an->nptr == NULL))
  57546. 8031f8a: 8a43 ldrh r3, [r0, #18]
  57547. 8031f8c: b10b cbz r3, 8031f92 <empty_table+0x22>
  57548. 8031f8e: 6980 ldr r0, [r0, #24]
  57549. 8031f90: e004 b.n 8031f9c <empty_table+0x2c>
  57550. {
  57551. empty = 1;
  57552. 8031f92: 2001 movs r0, #1
  57553. 8031f94: 4770 bx lr
  57554. }
  57555. }
  57556. else if (node_type == MIB_NODE_EX)
  57557. 8031f96: 2b05 cmp r3, #5
  57558. 8031f98: d105 bne.n 8031fa6 <empty_table+0x36>
  57559. {
  57560. struct mib_external_node *en;
  57561. en = (struct mib_external_node *)node;
  57562. if (en->tree_levels == 0)
  57563. 8031f9a: 7e00 ldrb r0, [r0, #24]
  57564. */
  57565. static u8_t
  57566. empty_table(struct mib_node *node)
  57567. {
  57568. u8_t node_type;
  57569. u8_t empty = 0;
  57570. 8031f9c: f1d0 0001 rsbs r0, r0, #1
  57571. 8031fa0: bf38 it cc
  57572. 8031fa2: 2000 movcc r0, #0
  57573. 8031fa4: 4770 bx lr
  57574. 8031fa6: 2000 movs r0, #0
  57575. empty = 1;
  57576. }
  57577. }
  57578. }
  57579. return empty;
  57580. }
  57581. 8031fa8: 4770 bx lr
  57582. 8031faa: 0000 movs r0, r0
  57583. 08031fac <snmp_ifindextonetif>:
  57584. * @param netif points to returned netif struct pointer
  57585. */
  57586. void
  57587. snmp_ifindextonetif(s32_t ifindex, struct netif **netif)
  57588. {
  57589. struct netif *nif = netif_list;
  57590. 8031fac: 4b05 ldr r3, [pc, #20] ; (8031fc4 <snmp_ifindextonetif+0x18>)
  57591. s32_t i, ifidx;
  57592. ifidx = ifindex - 1;
  57593. 8031fae: 3801 subs r0, #1
  57594. * @param netif points to returned netif struct pointer
  57595. */
  57596. void
  57597. snmp_ifindextonetif(s32_t ifindex, struct netif **netif)
  57598. {
  57599. struct netif *nif = netif_list;
  57600. 8031fb0: 681b ldr r3, [r3, #0]
  57601. s32_t i, ifidx;
  57602. ifidx = ifindex - 1;
  57603. i = 0;
  57604. 8031fb2: 2200 movs r2, #0
  57605. while ((nif != NULL) && (i < ifidx))
  57606. 8031fb4: e001 b.n 8031fba <snmp_ifindextonetif+0xe>
  57607. {
  57608. nif = nif->next;
  57609. 8031fb6: 681b ldr r3, [r3, #0]
  57610. i++;
  57611. 8031fb8: 3201 adds r2, #1
  57612. struct netif *nif = netif_list;
  57613. s32_t i, ifidx;
  57614. ifidx = ifindex - 1;
  57615. i = 0;
  57616. while ((nif != NULL) && (i < ifidx))
  57617. 8031fba: b10b cbz r3, 8031fc0 <snmp_ifindextonetif+0x14>
  57618. 8031fbc: 4282 cmp r2, r0
  57619. 8031fbe: dbfa blt.n 8031fb6 <snmp_ifindextonetif+0xa>
  57620. {
  57621. nif = nif->next;
  57622. i++;
  57623. }
  57624. *netif = nif;
  57625. 8031fc0: 600b str r3, [r1, #0]
  57626. 8031fc2: 4770 bx lr
  57627. 8031fc4: 20010fd0 .word 0x20010fd0
  57628. 08031fc8 <snmp_netiftoifindex>:
  57629. * @param ifidx points to s32_t object sub-identifier
  57630. */
  57631. void
  57632. snmp_netiftoifindex(struct netif *netif, s32_t *ifidx)
  57633. {
  57634. struct netif *nif = netif_list;
  57635. 8031fc8: 4b06 ldr r3, [pc, #24] ; (8031fe4 <snmp_netiftoifindex+0x1c>)
  57636. u16_t i;
  57637. i = 0;
  57638. 8031fca: 2200 movs r2, #0
  57639. * @param ifidx points to s32_t object sub-identifier
  57640. */
  57641. void
  57642. snmp_netiftoifindex(struct netif *netif, s32_t *ifidx)
  57643. {
  57644. struct netif *nif = netif_list;
  57645. 8031fcc: 681b ldr r3, [r3, #0]
  57646. u16_t i;
  57647. i = 0;
  57648. while ((nif != NULL) && (nif != netif))
  57649. 8031fce: e001 b.n 8031fd4 <snmp_netiftoifindex+0xc>
  57650. {
  57651. nif = nif->next;
  57652. 8031fd0: 681b ldr r3, [r3, #0]
  57653. i++;
  57654. 8031fd2: b292 uxth r2, r2
  57655. 8031fd4: 3201 adds r2, #1
  57656. {
  57657. struct netif *nif = netif_list;
  57658. u16_t i;
  57659. i = 0;
  57660. while ((nif != NULL) && (nif != netif))
  57661. 8031fd6: b90b cbnz r3, 8031fdc <snmp_netiftoifindex+0x14>
  57662. {
  57663. nif = nif->next;
  57664. i++;
  57665. }
  57666. *ifidx = i+1;
  57667. 8031fd8: 600a str r2, [r1, #0]
  57668. 8031fda: 4770 bx lr
  57669. {
  57670. struct netif *nif = netif_list;
  57671. u16_t i;
  57672. i = 0;
  57673. while ((nif != NULL) && (nif != netif))
  57674. 8031fdc: 4283 cmp r3, r0
  57675. 8031fde: d1f7 bne.n 8031fd0 <snmp_netiftoifindex+0x8>
  57676. 8031fe0: e7fa b.n 8031fd8 <snmp_netiftoifindex+0x10>
  57677. 8031fe2: bf00 nop
  57678. 8031fe4: 20010fd0 .word 0x20010fd0
  57679. 08031fe8 <snmp_oidtoip>:
  57680. * @param ip points to output struct
  57681. */
  57682. void
  57683. snmp_oidtoip(s32_t *ident, ip_addr_t *ip)
  57684. {
  57685. IP4_ADDR(ip, ident[0], ident[1], ident[2], ident[3]);
  57686. 8031fe8: 7802 ldrb r2, [r0, #0]
  57687. 8031fea: 68c3 ldr r3, [r0, #12]
  57688. 8031fec: ea42 6303 orr.w r3, r2, r3, lsl #24
  57689. 8031ff0: 7a02 ldrb r2, [r0, #8]
  57690. 8031ff2: ea43 4302 orr.w r3, r3, r2, lsl #16
  57691. 8031ff6: 6842 ldr r2, [r0, #4]
  57692. 8031ff8: 0612 lsls r2, r2, #24
  57693. 8031ffa: ea43 4312 orr.w r3, r3, r2, lsr #16
  57694. 8031ffe: 600b str r3, [r1, #0]
  57695. 8032000: 4770 bx lr
  57696. 08032002 <snmp_iptooid>:
  57697. * @param ident points to s32_t ident[4] output
  57698. */
  57699. void
  57700. snmp_iptooid(ip_addr_t *ip, s32_t *ident)
  57701. {
  57702. ident[0] = ip4_addr1(ip);
  57703. 8032002: 7803 ldrb r3, [r0, #0]
  57704. 8032004: 600b str r3, [r1, #0]
  57705. ident[1] = ip4_addr2(ip);
  57706. 8032006: 7843 ldrb r3, [r0, #1]
  57707. 8032008: 604b str r3, [r1, #4]
  57708. ident[2] = ip4_addr3(ip);
  57709. 803200a: 7883 ldrb r3, [r0, #2]
  57710. 803200c: 608b str r3, [r1, #8]
  57711. ident[3] = ip4_addr4(ip);
  57712. 803200e: 78c3 ldrb r3, [r0, #3]
  57713. 8032010: 60cb str r3, [r1, #12]
  57714. 8032012: 4770 bx lr
  57715. 08032014 <snmp_mib_ln_alloc>:
  57716. }
  57717. struct mib_list_node *
  57718. snmp_mib_ln_alloc(s32_t id)
  57719. {
  57720. 8032014: b510 push {r4, lr}
  57721. 8032016: 4604 mov r4, r0
  57722. struct mib_list_node *ln;
  57723. ln = (struct mib_list_node *)memp_malloc(MEMP_SNMP_NODE);
  57724. 8032018: 200b movs r0, #11
  57725. 803201a: f7fa fee9 bl 802cdf0 <memp_malloc>
  57726. if (ln != NULL)
  57727. 803201e: b120 cbz r0, 803202a <snmp_mib_ln_alloc+0x16>
  57728. {
  57729. ln->prev = NULL;
  57730. 8032020: 2300 movs r3, #0
  57731. 8032022: 6003 str r3, [r0, #0]
  57732. ln->next = NULL;
  57733. 8032024: 6043 str r3, [r0, #4]
  57734. ln->objid = id;
  57735. 8032026: 6084 str r4, [r0, #8]
  57736. ln->nptr = NULL;
  57737. 8032028: 60c3 str r3, [r0, #12]
  57738. }
  57739. return ln;
  57740. }
  57741. 803202a: bd10 pop {r4, pc}
  57742. 0803202c <snmp_mib_ln_free>:
  57743. void
  57744. snmp_mib_ln_free(struct mib_list_node *ln)
  57745. {
  57746. 803202c: 4601 mov r1, r0
  57747. memp_free(MEMP_SNMP_NODE, ln);
  57748. 803202e: 200b movs r0, #11
  57749. 8032030: f7fa bef4 b.w 802ce1c <memp_free>
  57750. 08032034 <snmp_mib_lrn_alloc>:
  57751. }
  57752. struct mib_list_rootnode *
  57753. snmp_mib_lrn_alloc(void)
  57754. {
  57755. 8032034: b508 push {r3, lr}
  57756. struct mib_list_rootnode *lrn;
  57757. lrn = (struct mib_list_rootnode*)memp_malloc(MEMP_SNMP_ROOTNODE);
  57758. 8032036: 200a movs r0, #10
  57759. 8032038: f7fa feda bl 802cdf0 <memp_malloc>
  57760. if (lrn != NULL)
  57761. 803203c: b170 cbz r0, 803205c <snmp_mib_lrn_alloc+0x28>
  57762. {
  57763. lrn->get_object_def = noleafs_get_object_def;
  57764. 803203e: 4b08 ldr r3, [pc, #32] ; (8032060 <snmp_mib_lrn_alloc+0x2c>)
  57765. 8032040: 6003 str r3, [r0, #0]
  57766. lrn->get_value = noleafs_get_value;
  57767. 8032042: 4b08 ldr r3, [pc, #32] ; (8032064 <snmp_mib_lrn_alloc+0x30>)
  57768. 8032044: 6043 str r3, [r0, #4]
  57769. lrn->set_test = noleafs_set_test;
  57770. 8032046: 4b08 ldr r3, [pc, #32] ; (8032068 <snmp_mib_lrn_alloc+0x34>)
  57771. 8032048: 6083 str r3, [r0, #8]
  57772. lrn->set_value = noleafs_set_value;
  57773. 803204a: 4b08 ldr r3, [pc, #32] ; (803206c <snmp_mib_lrn_alloc+0x38>)
  57774. 803204c: 60c3 str r3, [r0, #12]
  57775. lrn->node_type = MIB_NODE_LR;
  57776. 803204e: 2304 movs r3, #4
  57777. 8032050: 7403 strb r3, [r0, #16]
  57778. lrn->maxlength = 0;
  57779. 8032052: 2300 movs r3, #0
  57780. 8032054: 8243 strh r3, [r0, #18]
  57781. lrn->head = NULL;
  57782. 8032056: 6143 str r3, [r0, #20]
  57783. lrn->tail = NULL;
  57784. 8032058: 6183 str r3, [r0, #24]
  57785. lrn->count = 0;
  57786. 803205a: 8383 strh r3, [r0, #28]
  57787. }
  57788. return lrn;
  57789. }
  57790. 803205c: bd08 pop {r3, pc}
  57791. 803205e: bf00 nop
  57792. 8032060: 080309c3 .word 0x080309c3
  57793. 8032064: 080309c9 .word 0x080309c9
  57794. 8032068: 080309cb .word 0x080309cb
  57795. 803206c: 080309cf .word 0x080309cf
  57796. 08032070 <snmp_mib_lrn_free>:
  57797. void
  57798. snmp_mib_lrn_free(struct mib_list_rootnode *lrn)
  57799. {
  57800. 8032070: 4601 mov r1, r0
  57801. memp_free(MEMP_SNMP_ROOTNODE, lrn);
  57802. 8032072: 200a movs r0, #10
  57803. 8032074: f7fa bed2 b.w 802ce1c <memp_free>
  57804. 08032078 <snmp_mib_node_insert>:
  57805. * used for constructing the tree.
  57806. * @return -1 if failed, 1 if inserted, 2 if present.
  57807. */
  57808. s8_t
  57809. snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn)
  57810. {
  57811. 8032078: b5f8 push {r3, r4, r5, r6, r7, lr}
  57812. 803207a: 4605 mov r5, r0
  57813. 803207c: 4616 mov r6, r2
  57814. LWIP_ASSERT("rn != NULL",rn != NULL);
  57815. /* -1 = malloc failure, 0 = not inserted, 1 = inserted, 2 = was present */
  57816. insert = 0;
  57817. if (rn->head == NULL)
  57818. 803207e: 696c ldr r4, [r5, #20]
  57819. * used for constructing the tree.
  57820. * @return -1 if failed, 1 if inserted, 2 if present.
  57821. */
  57822. s8_t
  57823. snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn)
  57824. {
  57825. 8032080: 4608 mov r0, r1
  57826. LWIP_ASSERT("rn != NULL",rn != NULL);
  57827. /* -1 = malloc failure, 0 = not inserted, 1 = inserted, 2 = was present */
  57828. insert = 0;
  57829. if (rn->head == NULL)
  57830. 8032082: b93c cbnz r4, 8032094 <snmp_mib_node_insert+0x1c>
  57831. {
  57832. /* empty list, add first node */
  57833. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc empty list objid==%"S32_F"\n",objid));
  57834. nn = snmp_mib_ln_alloc(objid);
  57835. 8032084: f7ff ffc6 bl 8032014 <snmp_mib_ln_alloc>
  57836. if (nn != NULL)
  57837. 8032088: b350 cbz r0, 80320e0 <snmp_mib_node_insert+0x68>
  57838. {
  57839. rn->head = nn;
  57840. 803208a: 6168 str r0, [r5, #20]
  57841. rn->tail = nn;
  57842. 803208c: 61a8 str r0, [r5, #24]
  57843. *insn = nn;
  57844. 803208e: 6030 str r0, [r6, #0]
  57845. 8032090: e021 b.n 80320d6 <snmp_mib_node_insert+0x5e>
  57846. *insn = n;
  57847. insert = 2;
  57848. }
  57849. else if (n->objid < objid)
  57850. {
  57851. if (n->next == NULL)
  57852. 8032092: 463c mov r4, r7
  57853. struct mib_list_node *n;
  57854. /* at least one node is present */
  57855. n = rn->head;
  57856. while ((n != NULL) && (insert == 0))
  57857. {
  57858. if (n->objid == objid)
  57859. 8032094: 68a3 ldr r3, [r4, #8]
  57860. 8032096: 4283 cmp r3, r0
  57861. 8032098: d102 bne.n 80320a0 <snmp_mib_node_insert+0x28>
  57862. {
  57863. /* node is already there */
  57864. LWIP_DEBUGF(SNMP_MIB_DEBUG,("node already there objid==%"S32_F"\n",objid));
  57865. *insn = n;
  57866. 803209a: 6034 str r4, [r6, #0]
  57867. insert = 2;
  57868. 803209c: 2302 movs r3, #2
  57869. 803209e: e023 b.n 80320e8 <snmp_mib_node_insert+0x70>
  57870. }
  57871. else if (n->objid < objid)
  57872. 80320a0: da0a bge.n 80320b8 <snmp_mib_node_insert+0x40>
  57873. {
  57874. if (n->next == NULL)
  57875. 80320a2: 6867 ldr r7, [r4, #4]
  57876. 80320a4: 2f00 cmp r7, #0
  57877. 80320a6: d1f4 bne.n 8032092 <snmp_mib_node_insert+0x1a>
  57878. {
  57879. /* alloc and insert at the tail */
  57880. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins tail objid==%"S32_F"\n",objid));
  57881. nn = snmp_mib_ln_alloc(objid);
  57882. 80320a8: f7ff ffb4 bl 8032014 <snmp_mib_ln_alloc>
  57883. if (nn != NULL)
  57884. 80320ac: b1d8 cbz r0, 80320e6 <snmp_mib_node_insert+0x6e>
  57885. {
  57886. nn->next = NULL;
  57887. nn->prev = n;
  57888. 80320ae: e880 0090 stmia.w r0, {r4, r7}
  57889. n->next = nn;
  57890. 80320b2: 6060 str r0, [r4, #4]
  57891. rn->tail = nn;
  57892. 80320b4: 61a8 str r0, [r5, #24]
  57893. 80320b6: e00b b.n 80320d0 <snmp_mib_node_insert+0x58>
  57894. else
  57895. {
  57896. /* n->objid > objid */
  57897. /* alloc and insert between n->prev and n */
  57898. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins n->prev, objid==%"S32_F", n\n",objid));
  57899. nn = snmp_mib_ln_alloc(objid);
  57900. 80320b8: f7ff ffac bl 8032014 <snmp_mib_ln_alloc>
  57901. if (nn != NULL)
  57902. 80320bc: b198 cbz r0, 80320e6 <snmp_mib_node_insert+0x6e>
  57903. {
  57904. if (n->prev == NULL)
  57905. 80320be: 6822 ldr r2, [r4, #0]
  57906. {
  57907. /* insert at the head */
  57908. nn->next = n;
  57909. nn->prev = NULL;
  57910. 80320c0: e880 0014 stmia.w r0, {r2, r4}
  57911. /* alloc and insert between n->prev and n */
  57912. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins n->prev, objid==%"S32_F", n\n",objid));
  57913. nn = snmp_mib_ln_alloc(objid);
  57914. if (nn != NULL)
  57915. {
  57916. if (n->prev == NULL)
  57917. 80320c4: b90a cbnz r2, 80320ca <snmp_mib_node_insert+0x52>
  57918. {
  57919. /* insert at the head */
  57920. nn->next = n;
  57921. nn->prev = NULL;
  57922. rn->head = nn;
  57923. 80320c6: 6168 str r0, [r5, #20]
  57924. 80320c8: e001 b.n 80320ce <snmp_mib_node_insert+0x56>
  57925. else
  57926. {
  57927. /* insert in the middle */
  57928. nn->next = n;
  57929. nn->prev = n->prev;
  57930. n->prev->next = nn;
  57931. 80320ca: 6822 ldr r2, [r4, #0]
  57932. 80320cc: 6050 str r0, [r2, #4]
  57933. n->prev = nn;
  57934. 80320ce: 6020 str r0, [r4, #0]
  57935. }
  57936. *insn = nn;
  57937. 80320d0: 6030 str r0, [r6, #0]
  57938. insert = 1;
  57939. 80320d2: 2301 movs r3, #1
  57940. 80320d4: e008 b.n 80320e8 <snmp_mib_node_insert+0x70>
  57941. }
  57942. }
  57943. }
  57944. if (insert == 1)
  57945. {
  57946. rn->count += 1;
  57947. 80320d6: 8bab ldrh r3, [r5, #28]
  57948. 80320d8: 3301 adds r3, #1
  57949. 80320da: 83ab strh r3, [r5, #28]
  57950. 80320dc: 2301 movs r3, #1
  57951. 80320de: e000 b.n 80320e2 <snmp_mib_node_insert+0x6a>
  57952. *insn = nn;
  57953. insert = 1;
  57954. }
  57955. else
  57956. {
  57957. insert = -1;
  57958. 80320e0: 23ff movs r3, #255 ; 0xff
  57959. if (insert == 1)
  57960. {
  57961. rn->count += 1;
  57962. }
  57963. LWIP_ASSERT("insert != 0",insert != 0);
  57964. return insert;
  57965. 80320e2: b258 sxtb r0, r3
  57966. 80320e4: bdf8 pop {r3, r4, r5, r6, r7, pc}
  57967. insert = 1;
  57968. }
  57969. else
  57970. {
  57971. /* insertion failure */
  57972. insert = -1;
  57973. 80320e6: 23ff movs r3, #255 ; 0xff
  57974. }
  57975. }
  57976. }
  57977. }
  57978. if (insert == 1)
  57979. 80320e8: 2b01 cmp r3, #1
  57980. 80320ea: d1fa bne.n 80320e2 <snmp_mib_node_insert+0x6a>
  57981. 80320ec: e7f3 b.n 80320d6 <snmp_mib_node_insert+0x5e>
  57982. 080320ee <snmp_mib_node_find>:
  57983. {
  57984. s8_t fc;
  57985. struct mib_list_node *n;
  57986. LWIP_ASSERT("rn != NULL",rn != NULL);
  57987. n = rn->head;
  57988. 80320ee: 6943 ldr r3, [r0, #20]
  57989. while ((n != NULL) && (n->objid != objid))
  57990. 80320f0: e000 b.n 80320f4 <snmp_mib_node_find+0x6>
  57991. {
  57992. n = n->next;
  57993. 80320f2: 685b ldr r3, [r3, #4]
  57994. s8_t fc;
  57995. struct mib_list_node *n;
  57996. LWIP_ASSERT("rn != NULL",rn != NULL);
  57997. n = rn->head;
  57998. while ((n != NULL) && (n->objid != objid))
  57999. 80320f4: b16b cbz r3, 8032112 <snmp_mib_node_find+0x24>
  58000. 80320f6: 6898 ldr r0, [r3, #8]
  58001. 80320f8: 4288 cmp r0, r1
  58002. 80320fa: d1fa bne.n 80320f2 <snmp_mib_node_find+0x4>
  58003. }
  58004. if (n == NULL)
  58005. {
  58006. fc = 0;
  58007. }
  58008. else if (n->nptr == NULL)
  58009. 80320fc: 68d9 ldr r1, [r3, #12]
  58010. 80320fe: b161 cbz r1, 803211a <snmp_mib_node_find+0x2c>
  58011. }
  58012. else
  58013. {
  58014. struct mib_list_rootnode *r;
  58015. if (n->nptr->node_type == MIB_NODE_LR)
  58016. 8032100: 7c08 ldrb r0, [r1, #16]
  58017. 8032102: 2804 cmp r0, #4
  58018. 8032104: d107 bne.n 8032116 <snmp_mib_node_find+0x28>
  58019. {
  58020. r = (struct mib_list_rootnode *)n->nptr;
  58021. if (r->count > 1)
  58022. 8032106: 8b88 ldrh r0, [r1, #28]
  58023. {
  58024. /* can't delete node */
  58025. fc = 2;
  58026. 8032108: 2801 cmp r0, #1
  58027. 803210a: bf94 ite ls
  58028. 803210c: 2001 movls r0, #1
  58029. 803210e: 2002 movhi r0, #2
  58030. 8032110: e004 b.n 803211c <snmp_mib_node_find+0x2e>
  58031. {
  58032. n = n->next;
  58033. }
  58034. if (n == NULL)
  58035. {
  58036. fc = 0;
  58037. 8032112: 4618 mov r0, r3
  58038. 8032114: e002 b.n 803211c <snmp_mib_node_find+0x2e>
  58039. }
  58040. }
  58041. else
  58042. {
  58043. /* other node type */
  58044. fc = 3;
  58045. 8032116: 2003 movs r0, #3
  58046. 8032118: e000 b.n 803211c <snmp_mib_node_find+0x2e>
  58047. fc = 0;
  58048. }
  58049. else if (n->nptr == NULL)
  58050. {
  58051. /* leaf, can delete node */
  58052. fc = 1;
  58053. 803211a: 2001 movs r0, #1
  58054. {
  58055. /* other node type */
  58056. fc = 3;
  58057. }
  58058. }
  58059. *fn = n;
  58060. 803211c: 6013 str r3, [r2, #0]
  58061. return fc;
  58062. }
  58063. 803211e: b240 sxtb r0, r0
  58064. 8032120: 4770 bx lr
  58065. 08032122 <snmp_mib_node_delete>:
  58066. * @param n points to the node to delete
  58067. * @return the nptr to be freed by caller
  58068. */
  58069. struct mib_list_rootnode *
  58070. snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n)
  58071. {
  58072. 8032122: b538 push {r3, r4, r5, lr}
  58073. LWIP_ASSERT("rn != NULL",rn != NULL);
  58074. LWIP_ASSERT("n != NULL",n != NULL);
  58075. /* caller must remove this sub-tree */
  58076. next = (struct mib_list_rootnode*)(n->nptr);
  58077. rn->count -= 1;
  58078. 8032124: 8b83 ldrh r3, [r0, #28]
  58079. LWIP_ASSERT("rn != NULL",rn != NULL);
  58080. LWIP_ASSERT("n != NULL",n != NULL);
  58081. /* caller must remove this sub-tree */
  58082. next = (struct mib_list_rootnode*)(n->nptr);
  58083. 8032126: 68cd ldr r5, [r1, #12]
  58084. rn->count -= 1;
  58085. 8032128: 3b01 subs r3, #1
  58086. 803212a: 8383 strh r3, [r0, #28]
  58087. if (n == rn->head)
  58088. 803212c: 6943 ldr r3, [r0, #20]
  58089. 803212e: 4299 cmp r1, r3
  58090. * @param n points to the node to delete
  58091. * @return the nptr to be freed by caller
  58092. */
  58093. struct mib_list_rootnode *
  58094. snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n)
  58095. {
  58096. 8032130: 4604 mov r4, r0
  58097. /* caller must remove this sub-tree */
  58098. next = (struct mib_list_rootnode*)(n->nptr);
  58099. rn->count -= 1;
  58100. if (n == rn->head)
  58101. 8032132: d105 bne.n 8032140 <snmp_mib_node_delete+0x1e>
  58102. {
  58103. rn->head = n->next;
  58104. 8032134: 684b ldr r3, [r1, #4]
  58105. 8032136: 6143 str r3, [r0, #20]
  58106. if (n->next != NULL)
  58107. 8032138: b17b cbz r3, 803215a <snmp_mib_node_delete+0x38>
  58108. {
  58109. /* not last node, new list begin */
  58110. n->next->prev = NULL;
  58111. 803213a: 2200 movs r2, #0
  58112. 803213c: 601a str r2, [r3, #0]
  58113. 803213e: e00c b.n 803215a <snmp_mib_node_delete+0x38>
  58114. }
  58115. }
  58116. else if (n == rn->tail)
  58117. 8032140: 6983 ldr r3, [r0, #24]
  58118. 8032142: 4299 cmp r1, r3
  58119. 8032144: 680b ldr r3, [r1, #0]
  58120. 8032146: d104 bne.n 8032152 <snmp_mib_node_delete+0x30>
  58121. {
  58122. rn->tail = n->prev;
  58123. 8032148: 6183 str r3, [r0, #24]
  58124. if (n->prev != NULL)
  58125. 803214a: b133 cbz r3, 803215a <snmp_mib_node_delete+0x38>
  58126. {
  58127. /* not last node, new list end */
  58128. n->prev->next = NULL;
  58129. 803214c: 2200 movs r2, #0
  58130. 803214e: 605a str r2, [r3, #4]
  58131. 8032150: e003 b.n 803215a <snmp_mib_node_delete+0x38>
  58132. }
  58133. }
  58134. else
  58135. {
  58136. /* node must be in the middle */
  58137. n->prev->next = n->next;
  58138. 8032152: 684a ldr r2, [r1, #4]
  58139. 8032154: 605a str r2, [r3, #4]
  58140. n->next->prev = n->prev;
  58141. 8032156: 684a ldr r2, [r1, #4]
  58142. 8032158: 6013 str r3, [r2, #0]
  58143. }
  58144. LWIP_DEBUGF(SNMP_MIB_DEBUG,("free list objid==%"S32_F"\n",n->objid));
  58145. snmp_mib_ln_free(n);
  58146. 803215a: 4608 mov r0, r1
  58147. 803215c: f7ff ff66 bl 803202c <snmp_mib_ln_free>
  58148. if (rn->count == 0)
  58149. 8032160: 8ba3 ldrh r3, [r4, #28]
  58150. 8032162: b90b cbnz r3, 8032168 <snmp_mib_node_delete+0x46>
  58151. {
  58152. rn->head = NULL;
  58153. 8032164: 6163 str r3, [r4, #20]
  58154. rn->tail = NULL;
  58155. 8032166: 61a3 str r3, [r4, #24]
  58156. }
  58157. return next;
  58158. }
  58159. 8032168: 4628 mov r0, r5
  58160. 803216a: bd38 pop {r3, r4, r5, pc}
  58161. 0803216c <snmp_search_tree>:
  58162. * @param np points to the found object instance (return)
  58163. * @return pointer to the requested parent (!) node if success, NULL otherwise
  58164. */
  58165. struct mib_node *
  58166. snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
  58167. {
  58168. 803216c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  58169. 8032170: 4604 mov r4, r0
  58170. 8032172: b085 sub sp, #20
  58171. 8032174: 460d mov r5, r1
  58172. 8032176: 461e mov r6, r3
  58173. * @param ident points to the array of sub identifiers
  58174. * @param np points to the found object instance (return)
  58175. * @return pointer to the requested parent (!) node if success, NULL otherwise
  58176. */
  58177. struct mib_node *
  58178. snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
  58179. 8032178: f102 0804 add.w r8, r2, #4
  58180. {
  58181. u8_t node_type, ext_level;
  58182. ext_level = 0;
  58183. 803217c: f04f 0b00 mov.w fp, #0
  58184. LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F"\n",(void*)node,*ident));
  58185. while (node != NULL)
  58186. 8032180: e068 b.n 8032254 <snmp_search_tree+0xe8>
  58187. {
  58188. node_type = node->node_type;
  58189. 8032182: 7c23 ldrb r3, [r4, #16]
  58190. if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
  58191. 8032184: 1e9a subs r2, r3, #2
  58192. 8032186: 2a01 cmp r2, #1
  58193. 8032188: d812 bhi.n 80321b0 <snmp_search_tree+0x44>
  58194. {
  58195. struct mib_array_node *an;
  58196. u16_t i;
  58197. if (ident_len > 0)
  58198. 803218a: b90d cbnz r5, 8032190 <snmp_search_tree+0x24>
  58199. }
  58200. else
  58201. {
  58202. /* search failed, short object identifier (nosuchname) */
  58203. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed, short object identifier\n"));
  58204. return NULL;
  58205. 803218c: 2000 movs r0, #0
  58206. 803218e: e06a b.n 8032266 <snmp_search_tree+0xfa>
  58207. if (ident_len > 0)
  58208. {
  58209. /* array node (internal ROM or RAM, fixed length) */
  58210. an = (struct mib_array_node *)node;
  58211. i = 0;
  58212. while ((i < an->maxlength) && (an->objid[i] != *ident))
  58213. 8032190: 8a67 ldrh r7, [r4, #18]
  58214. 8032192: 2300 movs r3, #0
  58215. 8032194: b29a uxth r2, r3
  58216. 8032196: 42ba cmp r2, r7
  58217. 8032198: d2f8 bcs.n 803218c <snmp_search_tree+0x20>
  58218. 803219a: 009a lsls r2, r3, #2
  58219. 803219c: 6961 ldr r1, [r4, #20]
  58220. 803219e: 5888 ldr r0, [r1, r2]
  58221. 80321a0: f858 1c04 ldr.w r1, [r8, #-4]
  58222. 80321a4: 3301 adds r3, #1
  58223. 80321a6: 4288 cmp r0, r1
  58224. 80321a8: d1f4 bne.n 8032194 <snmp_search_tree+0x28>
  58225. }
  58226. if (i < an->maxlength)
  58227. {
  58228. /* found it, if available proceed to child, otherwise inspect leaf */
  58229. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
  58230. if (an->nptr[i] == NULL)
  58231. 80321aa: 69a3 ldr r3, [r4, #24]
  58232. 80321ac: 589b ldr r3, [r3, r2]
  58233. 80321ae: e057 b.n 8032260 <snmp_search_tree+0xf4>
  58234. /* search failed, short object identifier (nosuchname) */
  58235. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed, short object identifier\n"));
  58236. return NULL;
  58237. }
  58238. }
  58239. else if(node_type == MIB_NODE_LR)
  58240. 80321b0: 2b04 cmp r3, #4
  58241. 80321b2: d10c bne.n 80321ce <snmp_search_tree+0x62>
  58242. {
  58243. struct mib_list_rootnode *lrn;
  58244. struct mib_list_node *ln;
  58245. if (ident_len > 0)
  58246. 80321b4: 2d00 cmp r5, #0
  58247. 80321b6: d0e9 beq.n 803218c <snmp_search_tree+0x20>
  58248. {
  58249. /* list root node (internal 'RAM', variable length) */
  58250. lrn = (struct mib_list_rootnode *)node;
  58251. ln = lrn->head;
  58252. 80321b8: 6963 ldr r3, [r4, #20]
  58253. /* iterate over list, head to tail */
  58254. while ((ln != NULL) && (ln->objid != *ident))
  58255. 80321ba: e000 b.n 80321be <snmp_search_tree+0x52>
  58256. {
  58257. ln = ln->next;
  58258. 80321bc: 685b ldr r3, [r3, #4]
  58259. {
  58260. /* list root node (internal 'RAM', variable length) */
  58261. lrn = (struct mib_list_rootnode *)node;
  58262. ln = lrn->head;
  58263. /* iterate over list, head to tail */
  58264. while ((ln != NULL) && (ln->objid != *ident))
  58265. 80321be: 2b00 cmp r3, #0
  58266. 80321c0: d0e4 beq.n 803218c <snmp_search_tree+0x20>
  58267. 80321c2: 6899 ldr r1, [r3, #8]
  58268. 80321c4: f858 2c04 ldr.w r2, [r8, #-4]
  58269. 80321c8: 4291 cmp r1, r2
  58270. 80321ca: d1f7 bne.n 80321bc <snmp_search_tree+0x50>
  58271. 80321cc: e047 b.n 803225e <snmp_search_tree+0xf2>
  58272. /* search failed, short object identifier (nosuchname) */
  58273. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln search failed, short object identifier\n"));
  58274. return NULL;
  58275. }
  58276. }
  58277. else if(node_type == MIB_NODE_EX)
  58278. 80321ce: 2b05 cmp r3, #5
  58279. 80321d0: d12e bne.n 8032230 <snmp_search_tree+0xc4>
  58280. {
  58281. struct mib_external_node *en;
  58282. u16_t i, len;
  58283. if (ident_len > 0)
  58284. 80321d2: 2d00 cmp r5, #0
  58285. 80321d4: d0da beq.n 803218c <snmp_search_tree+0x20>
  58286. {
  58287. /* external node (addressing and access via functions) */
  58288. en = (struct mib_external_node *)node;
  58289. i = 0;
  58290. len = en->level_length(en->addr_inf,ext_level);
  58291. 80321d6: 69e3 ldr r3, [r4, #28]
  58292. 80321d8: 6960 ldr r0, [r4, #20]
  58293. 80321da: 4659 mov r1, fp
  58294. 80321dc: 4798 blx r3
  58295. if (ident_len > 0)
  58296. {
  58297. /* external node (addressing and access via functions) */
  58298. en = (struct mib_external_node *)node;
  58299. i = 0;
  58300. 80321de: f04f 0900 mov.w r9, #0
  58301. len = en->level_length(en->addr_inf,ext_level);
  58302. 80321e2: 4684 mov ip, r0
  58303. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) != 0))
  58304. 80321e4: e003 b.n 80321ee <snmp_search_tree+0x82>
  58305. {
  58306. i++;
  58307. 80321e6: f109 0901 add.w r9, r9, #1
  58308. 80321ea: fa1f f989 uxth.w r9, r9
  58309. /* external node (addressing and access via functions) */
  58310. en = (struct mib_external_node *)node;
  58311. i = 0;
  58312. len = en->level_length(en->addr_inf,ext_level);
  58313. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) != 0))
  58314. 80321ee: 45e1 cmp r9, ip
  58315. 80321f0: d0cc beq.n 803218c <snmp_search_tree+0x20>
  58316. 80321f2: 6960 ldr r0, [r4, #20]
  58317. 80321f4: f858 3c04 ldr.w r3, [r8, #-4]
  58318. 80321f8: 6a27 ldr r7, [r4, #32]
  58319. 80321fa: f8cd c004 str.w ip, [sp, #4]
  58320. 80321fe: 4659 mov r1, fp
  58321. 8032200: 464a mov r2, r9
  58322. 8032202: 47b8 blx r7
  58323. 8032204: f8dd c004 ldr.w ip, [sp, #4]
  58324. 8032208: 2800 cmp r0, #0
  58325. 803220a: d1ec bne.n 80321e6 <snmp_search_tree+0x7a>
  58326. {
  58327. i++;
  58328. }
  58329. if (i < len)
  58330. 803220c: 45e1 cmp r9, ip
  58331. 803220e: d2bd bcs.n 803218c <snmp_search_tree+0x20>
  58332. {
  58333. s32_t debug_id;
  58334. en->get_objid(en->addr_inf,ext_level,i,&debug_id);
  58335. 8032210: 4659 mov r1, fp
  58336. 8032212: ab03 add r3, sp, #12
  58337. 8032214: 6a67 ldr r7, [r4, #36] ; 0x24
  58338. 8032216: 6960 ldr r0, [r4, #20]
  58339. 8032218: 464a mov r2, r9
  58340. 803221a: 47b8 blx r7
  58341. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid==%"S32_F" *ident==%"S32_F"\n",debug_id,*ident));
  58342. if ((ext_level + 1) == en->tree_levels)
  58343. 803221c: 7e23 ldrb r3, [r4, #24]
  58344. 803221e: f10b 0b01 add.w fp, fp, #1
  58345. 8032222: 459b cmp fp, r3
  58346. 8032224: d100 bne.n 8032228 <snmp_search_tree+0xbc>
  58347. 8032226: e00b b.n 8032240 <snmp_search_tree+0xd4>
  58348. else
  58349. {
  58350. /* found it, proceed to child */
  58351. ident_len--;
  58352. ident++;
  58353. ext_level++;
  58354. 8032228: fa5f fb8b uxtb.w fp, fp
  58355. 803222c: 4623 mov r3, r4
  58356. 803222e: e00c b.n 803224a <snmp_search_tree+0xde>
  58357. /* search failed, short object identifier (nosuchname) */
  58358. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed, short object identifier\n"));
  58359. return NULL;
  58360. }
  58361. }
  58362. else if (node_type == MIB_NODE_SC)
  58363. 8032230: 2b01 cmp r3, #1
  58364. 8032232: d1ab bne.n 803218c <snmp_search_tree+0x20>
  58365. {
  58366. mib_scalar_node *sn;
  58367. sn = (mib_scalar_node *)node;
  58368. if ((ident_len == 1) && (*ident == 0))
  58369. 8032234: 2d01 cmp r5, #1
  58370. 8032236: d1a9 bne.n 803218c <snmp_search_tree+0x20>
  58371. 8032238: f8da 3000 ldr.w r3, [sl]
  58372. 803223c: 2b00 cmp r3, #0
  58373. 803223e: d1a5 bne.n 803218c <snmp_search_tree+0x20>
  58374. {
  58375. np->ident_len = ident_len;
  58376. 8032240: 7035 strb r5, [r6, #0]
  58377. np->ident = ident;
  58378. 8032242: f8c6 a004 str.w sl, [r6, #4]
  58379. return (struct mib_node*)sn;
  58380. 8032246: 4620 mov r0, r4
  58381. 8032248: e00d b.n 8032266 <snmp_search_tree+0xfa>
  58382. 803224a: 3d01 subs r5, #1
  58383. 803224c: b2ed uxtb r5, r5
  58384. 803224e: f108 0804 add.w r8, r8, #4
  58385. 8032252: 461c mov r4, r3
  58386. * @param ident points to the array of sub identifiers
  58387. * @param np points to the found object instance (return)
  58388. * @return pointer to the requested parent (!) node if success, NULL otherwise
  58389. */
  58390. struct mib_node *
  58391. snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
  58392. 8032254: f1a8 0a04 sub.w sl, r8, #4
  58393. {
  58394. u8_t node_type, ext_level;
  58395. ext_level = 0;
  58396. LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F"\n",(void*)node,*ident));
  58397. while (node != NULL)
  58398. 8032258: 2c00 cmp r4, #0
  58399. 803225a: d192 bne.n 8032182 <snmp_search_tree+0x16>
  58400. 803225c: e796 b.n 803218c <snmp_search_tree+0x20>
  58401. }
  58402. if (ln != NULL)
  58403. {
  58404. /* found it, proceed to child */;
  58405. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
  58406. if (ln->nptr == NULL)
  58407. 803225e: 68db ldr r3, [r3, #12]
  58408. 8032260: 2b00 cmp r3, #0
  58409. 8032262: d1f2 bne.n 803224a <snmp_search_tree+0xde>
  58410. 8032264: e7ec b.n 8032240 <snmp_search_tree+0xd4>
  58411. }
  58412. }
  58413. /* done, found nothing */
  58414. LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node==%p\n",(void*)node));
  58415. return NULL;
  58416. }
  58417. 8032266: b005 add sp, #20
  58418. 8032268: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  58419. 0803226c <snmp_expand_tree>:
  58420. /**
  58421. * Tree expansion.
  58422. */
  58423. struct mib_node *
  58424. snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  58425. {
  58426. 803226c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  58427. 8032270: 461d mov r5, r3
  58428. 8032272: b08b sub sp, #44 ; 0x2c
  58429. u8_t node_type, ext_level, climb_tree;
  58430. ext_level = 0;
  58431. /* reset node stack */
  58432. node_stack_cnt = 0;
  58433. 8032274: 4ba4 ldr r3, [pc, #656] ; (8032508 <snmp_expand_tree+0x29c>)
  58434. 8032276: f04f 0a00 mov.w sl, #0
  58435. j = (u8_t)i + 1;
  58436. if (j < len)
  58437. {
  58438. /* right node is the current external node */
  58439. cur_node.r_ptr = node;
  58440. en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
  58441. 803227a: af08 add r7, sp, #32
  58442. /**
  58443. * Tree expansion.
  58444. */
  58445. struct mib_node *
  58446. snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  58447. {
  58448. 803227c: 4604 mov r4, r0
  58449. 803227e: 460e mov r6, r1
  58450. 8032280: 4690 mov r8, r2
  58451. u8_t node_type, ext_level, climb_tree;
  58452. ext_level = 0;
  58453. /* reset node stack */
  58454. node_stack_cnt = 0;
  58455. 8032282: f883 a000 strb.w sl, [r3]
  58456. j = (u8_t)i + 1;
  58457. if (j < len)
  58458. {
  58459. /* right node is the current external node */
  58460. cur_node.r_ptr = node;
  58461. en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
  58462. 8032286: 9705 str r7, [sp, #20]
  58463. u8_t node_type, ext_level, climb_tree;
  58464. ext_level = 0;
  58465. /* reset node stack */
  58466. node_stack_cnt = 0;
  58467. while (node != NULL)
  58468. 8032288: e19c b.n 80325c4 <snmp_expand_tree+0x358>
  58469. {
  58470. climb_tree = 0;
  58471. node_type = node->node_type;
  58472. 803228a: 7c23 ldrb r3, [r4, #16]
  58473. if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
  58474. 803228c: 1e9a subs r2, r3, #2
  58475. 803228e: 2a01 cmp r2, #1
  58476. 8032290: f200 808f bhi.w 80323b2 <snmp_expand_tree+0x146>
  58477. 8032294: 8a67 ldrh r7, [r4, #18]
  58478. struct mib_array_node *an;
  58479. u16_t i;
  58480. /* array node (internal ROM or RAM, fixed length) */
  58481. an = (struct mib_array_node *)node;
  58482. if (ident_len > 0)
  58483. 8032296: b90e cbnz r6, 803229c <snmp_expand_tree+0x30>
  58484. else
  58485. {
  58486. u8_t j;
  58487. /* ident_len == 0, complete with leftmost '.thing' */
  58488. j = 0;
  58489. while ((j < an->maxlength) && empty_table(an->nptr[j]))
  58490. 8032298: 46b1 mov r9, r6
  58491. 803229a: e06f b.n 803237c <snmp_expand_tree+0x110>
  58492. /* array node (internal ROM or RAM, fixed length) */
  58493. an = (struct mib_array_node *)node;
  58494. if (ident_len > 0)
  58495. {
  58496. i = 0;
  58497. while ((i < an->maxlength) && (an->objid[i] < *ident))
  58498. 803229c: f04f 0c00 mov.w ip, #0
  58499. 80322a0: fa1f f28c uxth.w r2, ip
  58500. 80322a4: 42ba cmp r2, r7
  58501. 80322a6: f080 8168 bcs.w 803257a <snmp_expand_tree+0x30e>
  58502. 80322aa: 6963 ldr r3, [r4, #20]
  58503. 80322ac: f853 102c ldr.w r1, [r3, ip, lsl #2]
  58504. 80322b0: f8d8 3000 ldr.w r3, [r8]
  58505. 80322b4: 4299 cmp r1, r3
  58506. 80322b6: ea4f 098c mov.w r9, ip, lsl #2
  58507. 80322ba: f10c 0c01 add.w ip, ip, #1
  58508. 80322be: dbef blt.n 80322a0 <snmp_expand_tree+0x34>
  58509. }
  58510. if (i < an->maxlength)
  58511. {
  58512. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
  58513. /* add identifier to oidret */
  58514. oidret->id[oidret->len] = an->objid[i];
  58515. 80322c0: 782b ldrb r3, [r5, #0]
  58516. 80322c2: eb05 0783 add.w r7, r5, r3, lsl #2
  58517. 80322c6: 6079 str r1, [r7, #4]
  58518. (oidret->len)++;
  58519. 80322c8: 1c59 adds r1, r3, #1
  58520. 80322ca: 7029 strb r1, [r5, #0]
  58521. if (an->nptr[i] == NULL)
  58522. 80322cc: f8d4 b018 ldr.w fp, [r4, #24]
  58523. 80322d0: f85b 0009 ldr.w r0, [fp, r9]
  58524. 80322d4: b998 cbnz r0, 80322fe <snmp_expand_tree+0x92>
  58525. {
  58526. LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
  58527. /* leaf node (e.g. in a fixed size table) */
  58528. if (an->objid[i] > *ident)
  58529. 80322d6: 6960 ldr r0, [r4, #20]
  58530. 80322d8: f850 6009 ldr.w r6, [r0, r9]
  58531. 80322dc: f8d8 0000 ldr.w r0, [r8]
  58532. 80322e0: 4286 cmp r6, r0
  58533. 80322e2: f300 8173 bgt.w 80325cc <snmp_expand_tree+0x360>
  58534. {
  58535. return (struct mib_node*)an;
  58536. }
  58537. else if ((i + 1) < an->maxlength)
  58538. 80322e6: 8a60 ldrh r0, [r4, #18]
  58539. {
  58540. /* an->objid[i] == *ident */
  58541. (oidret->len)--;
  58542. 80322e8: 702b strb r3, [r5, #0]
  58543. /* leaf node (e.g. in a fixed size table) */
  58544. if (an->objid[i] > *ident)
  58545. {
  58546. return (struct mib_node*)an;
  58547. }
  58548. else if ((i + 1) < an->maxlength)
  58549. 80322ea: 3201 adds r2, #1
  58550. 80322ec: 4282 cmp r2, r0
  58551. 80322ee: f280 8144 bge.w 803257a <snmp_expand_tree+0x30e>
  58552. {
  58553. /* an->objid[i] == *ident */
  58554. (oidret->len)--;
  58555. oidret->id[oidret->len] = an->objid[i + 1];
  58556. 80322f2: 6963 ldr r3, [r4, #20]
  58557. 80322f4: f853 302c ldr.w r3, [r3, ip, lsl #2]
  58558. (oidret->len)++;
  58559. 80322f8: 7029 strb r1, [r5, #0]
  58560. }
  58561. else if ((i + 1) < an->maxlength)
  58562. {
  58563. /* an->objid[i] == *ident */
  58564. (oidret->len)--;
  58565. oidret->id[oidret->len] = an->objid[i + 1];
  58566. 80322fa: 607b str r3, [r7, #4]
  58567. 80322fc: e166 b.n 80325cc <snmp_expand_tree+0x360>
  58568. struct nse cur_node;
  58569. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  58570. /* non-leaf, store right child ptr and id */
  58571. LWIP_ASSERT("i < 0xff", i < 0xff);
  58572. j = (u8_t)i + 1;
  58573. 80322fe: 3201 adds r2, #1
  58574. while ((j < an->maxlength) && (empty_table(an->nptr[j])))
  58575. 8032300: 8a61 ldrh r1, [r4, #18]
  58576. struct nse cur_node;
  58577. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  58578. /* non-leaf, store right child ptr and id */
  58579. LWIP_ASSERT("i < 0xff", i < 0xff);
  58580. j = (u8_t)i + 1;
  58581. 8032302: fa5f fc82 uxtb.w ip, r2
  58582. while ((j < an->maxlength) && (empty_table(an->nptr[j])))
  58583. 8032306: 2700 movs r7, #0
  58584. /**
  58585. * Tree expansion.
  58586. */
  58587. struct mib_node *
  58588. snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  58589. 8032308: eb0c 0307 add.w r3, ip, r7
  58590. 803230c: b2db uxtb r3, r3
  58591. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  58592. /* non-leaf, store right child ptr and id */
  58593. LWIP_ASSERT("i < 0xff", i < 0xff);
  58594. j = (u8_t)i + 1;
  58595. while ((j < an->maxlength) && (empty_table(an->nptr[j])))
  58596. 803230e: 428b cmp r3, r1
  58597. 8032310: d21a bcs.n 8032348 <snmp_expand_tree+0xdc>
  58598. 8032312: b21b sxth r3, r3
  58599. 8032314: 009a lsls r2, r3, #2
  58600. 8032316: f85b 3023 ldr.w r3, [fp, r3, lsl #2]
  58601. 803231a: 9104 str r1, [sp, #16]
  58602. 803231c: 4618 mov r0, r3
  58603. 803231e: 9203 str r2, [sp, #12]
  58604. 8032320: 9302 str r3, [sp, #8]
  58605. 8032322: f8cd c004 str.w ip, [sp, #4]
  58606. 8032326: f7ff fe23 bl 8031f70 <empty_table>
  58607. 803232a: 3701 adds r7, #1
  58608. 803232c: 9904 ldr r1, [sp, #16]
  58609. 803232e: 9a03 ldr r2, [sp, #12]
  58610. 8032330: 9b02 ldr r3, [sp, #8]
  58611. 8032332: f8dd c004 ldr.w ip, [sp, #4]
  58612. 8032336: 2800 cmp r0, #0
  58613. 8032338: d1e6 bne.n 8032308 <snmp_expand_tree+0x9c>
  58614. {
  58615. j++;
  58616. }
  58617. if (j < an->maxlength)
  58618. {
  58619. cur_node.r_ptr = an->nptr[j];
  58620. 803233a: 9307 str r3, [sp, #28]
  58621. cur_node.r_id = an->objid[j];
  58622. 803233c: 6963 ldr r3, [r4, #20]
  58623. 803233e: 589b ldr r3, [r3, r2]
  58624. cur_node.r_nl = 0;
  58625. 8032340: f88d 0024 strb.w r0, [sp, #36] ; 0x24
  58626. j++;
  58627. }
  58628. if (j < an->maxlength)
  58629. {
  58630. cur_node.r_ptr = an->nptr[j];
  58631. cur_node.r_id = an->objid[j];
  58632. 8032344: 9308 str r3, [sp, #32]
  58633. 8032346: e001 b.n 803234c <snmp_expand_tree+0xe0>
  58634. cur_node.r_nl = 0;
  58635. }
  58636. else
  58637. {
  58638. cur_node.r_ptr = NULL;
  58639. 8032348: 2300 movs r3, #0
  58640. 803234a: 9307 str r3, [sp, #28]
  58641. }
  58642. push_node(&cur_node);
  58643. 803234c: a807 add r0, sp, #28
  58644. 803234e: f7ff fdfb bl 8031f48 <push_node>
  58645. if (an->objid[i] == *ident)
  58646. 8032352: 6963 ldr r3, [r4, #20]
  58647. 8032354: f853 2009 ldr.w r2, [r3, r9]
  58648. 8032358: f8d8 3000 ldr.w r3, [r8]
  58649. 803235c: 429a cmp r2, r3
  58650. 803235e: d104 bne.n 803236a <snmp_expand_tree+0xfe>
  58651. {
  58652. ident_len--;
  58653. 8032360: 3e01 subs r6, #1
  58654. 8032362: b2f6 uxtb r6, r6
  58655. ident++;
  58656. 8032364: f108 0804 add.w r8, r8, #4
  58657. 8032368: e000 b.n 803236c <snmp_expand_tree+0x100>
  58658. }
  58659. else
  58660. {
  58661. /* an->objid[i] < *ident */
  58662. ident_len = 0;
  58663. 803236a: 2600 movs r6, #0
  58664. }
  58665. /* follow next child pointer */
  58666. node = an->nptr[i];
  58667. 803236c: 69a3 ldr r3, [r4, #24]
  58668. 803236e: f853 3009 ldr.w r3, [r3, r9]
  58669. 8032372: e140 b.n 80325f6 <snmp_expand_tree+0x38a>
  58670. u8_t j;
  58671. /* ident_len == 0, complete with leftmost '.thing' */
  58672. j = 0;
  58673. while ((j < an->maxlength) && empty_table(an->nptr[j]))
  58674. {
  58675. j++;
  58676. 8032374: f109 0901 add.w r9, r9, #1
  58677. 8032378: fa5f f989 uxtb.w r9, r9
  58678. else
  58679. {
  58680. u8_t j;
  58681. /* ident_len == 0, complete with leftmost '.thing' */
  58682. j = 0;
  58683. while ((j < an->maxlength) && empty_table(an->nptr[j]))
  58684. 803237c: 45b9 cmp r9, r7
  58685. 803237e: f080 80fc bcs.w 803257a <snmp_expand_tree+0x30e>
  58686. 8032382: fa0f f289 sxth.w r2, r9
  58687. 8032386: 69a3 ldr r3, [r4, #24]
  58688. 8032388: f853 0022 ldr.w r0, [r3, r2, lsl #2]
  58689. 803238c: ea4f 0b82 mov.w fp, r2, lsl #2
  58690. 8032390: f7ff fdee bl 8031f70 <empty_table>
  58691. 8032394: 2800 cmp r0, #0
  58692. 8032396: d1ed bne.n 8032374 <snmp_expand_tree+0x108>
  58693. j++;
  58694. }
  58695. if (j < an->maxlength)
  58696. {
  58697. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->objid[j]==%"S32_F"\n",an->objid[j]));
  58698. oidret->id[oidret->len] = an->objid[j];
  58699. 8032398: 6962 ldr r2, [r4, #20]
  58700. 803239a: 782b ldrb r3, [r5, #0]
  58701. 803239c: f852 100b ldr.w r1, [r2, fp]
  58702. 80323a0: eb05 0283 add.w r2, r5, r3, lsl #2
  58703. (oidret->len)++;
  58704. 80323a4: 3301 adds r3, #1
  58705. 80323a6: 702b strb r3, [r5, #0]
  58706. if (an->nptr[j] == NULL)
  58707. 80323a8: 69a3 ldr r3, [r4, #24]
  58708. j++;
  58709. }
  58710. if (j < an->maxlength)
  58711. {
  58712. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->objid[j]==%"S32_F"\n",an->objid[j]));
  58713. oidret->id[oidret->len] = an->objid[j];
  58714. 80323aa: 6051 str r1, [r2, #4]
  58715. (oidret->len)++;
  58716. if (an->nptr[j] == NULL)
  58717. 80323ac: f853 300b ldr.w r3, [r3, fp]
  58718. 80323b0: e11f b.n 80325f2 <snmp_expand_tree+0x386>
  58719. /* j == an->maxlength */
  58720. climb_tree = 1;
  58721. }
  58722. }
  58723. }
  58724. else if(node_type == MIB_NODE_LR)
  58725. 80323b2: 2b04 cmp r3, #4
  58726. 80323b4: d14c bne.n 8032450 <snmp_expand_tree+0x1e4>
  58727. 80323b6: 6967 ldr r7, [r4, #20]
  58728. struct mib_list_rootnode *lrn;
  58729. struct mib_list_node *ln;
  58730. /* list root node (internal 'RAM', variable length) */
  58731. lrn = (struct mib_list_rootnode *)node;
  58732. if (ident_len > 0)
  58733. 80323b8: 2e00 cmp r6, #0
  58734. 80323ba: d040 beq.n 803243e <snmp_expand_tree+0x1d2>
  58735. {
  58736. ln = lrn->head;
  58737. /* iterate over list, head to tail */
  58738. while ((ln != NULL) && (ln->objid < *ident))
  58739. 80323bc: e000 b.n 80323c0 <snmp_expand_tree+0x154>
  58740. {
  58741. ln = ln->next;
  58742. 80323be: 687f ldr r7, [r7, #4]
  58743. lrn = (struct mib_list_rootnode *)node;
  58744. if (ident_len > 0)
  58745. {
  58746. ln = lrn->head;
  58747. /* iterate over list, head to tail */
  58748. while ((ln != NULL) && (ln->objid < *ident))
  58749. 80323c0: 2f00 cmp r7, #0
  58750. 80323c2: f000 80da beq.w 803257a <snmp_expand_tree+0x30e>
  58751. 80323c6: 68ba ldr r2, [r7, #8]
  58752. 80323c8: f8d8 3000 ldr.w r3, [r8]
  58753. 80323cc: 429a cmp r2, r3
  58754. 80323ce: dbf6 blt.n 80323be <snmp_expand_tree+0x152>
  58755. ln = ln->next;
  58756. }
  58757. if (ln != NULL)
  58758. {
  58759. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
  58760. oidret->id[oidret->len] = ln->objid;
  58761. 80323d0: 782b ldrb r3, [r5, #0]
  58762. 80323d2: eb05 0183 add.w r1, r5, r3, lsl #2
  58763. 80323d6: 604a str r2, [r1, #4]
  58764. (oidret->len)++;
  58765. 80323d8: 1c5a adds r2, r3, #1
  58766. 80323da: 702a strb r2, [r5, #0]
  58767. if (ln->nptr == NULL)
  58768. 80323dc: 68f8 ldr r0, [r7, #12]
  58769. 80323de: b978 cbnz r0, 8032400 <snmp_expand_tree+0x194>
  58770. {
  58771. /* leaf node */
  58772. if (ln->objid > *ident)
  58773. 80323e0: 68b8 ldr r0, [r7, #8]
  58774. 80323e2: f8d8 6000 ldr.w r6, [r8]
  58775. 80323e6: 42b0 cmp r0, r6
  58776. 80323e8: f300 80f0 bgt.w 80325cc <snmp_expand_tree+0x360>
  58777. {
  58778. return (struct mib_node*)lrn;
  58779. }
  58780. else if (ln->next != NULL)
  58781. 80323ec: 6878 ldr r0, [r7, #4]
  58782. {
  58783. /* ln->objid == *ident */
  58784. (oidret->len)--;
  58785. 80323ee: 702b strb r3, [r5, #0]
  58786. /* leaf node */
  58787. if (ln->objid > *ident)
  58788. {
  58789. return (struct mib_node*)lrn;
  58790. }
  58791. else if (ln->next != NULL)
  58792. 80323f0: 2800 cmp r0, #0
  58793. 80323f2: f000 80c2 beq.w 803257a <snmp_expand_tree+0x30e>
  58794. {
  58795. /* ln->objid == *ident */
  58796. (oidret->len)--;
  58797. oidret->id[oidret->len] = ln->next->objid;
  58798. 80323f6: 687b ldr r3, [r7, #4]
  58799. 80323f8: 689b ldr r3, [r3, #8]
  58800. (oidret->len)++;
  58801. 80323fa: 702a strb r2, [r5, #0]
  58802. }
  58803. else if (ln->next != NULL)
  58804. {
  58805. /* ln->objid == *ident */
  58806. (oidret->len)--;
  58807. oidret->id[oidret->len] = ln->next->objid;
  58808. 80323fc: 604b str r3, [r1, #4]
  58809. 80323fe: e0e5 b.n 80325cc <snmp_expand_tree+0x360>
  58810. {
  58811. struct mib_list_node *jn;
  58812. struct nse cur_node;
  58813. /* non-leaf, store right child ptr and id */
  58814. jn = ln->next;
  58815. 8032400: 687c ldr r4, [r7, #4]
  58816. while ((jn != NULL) && empty_table(jn->nptr))
  58817. 8032402: e000 b.n 8032406 <snmp_expand_tree+0x19a>
  58818. {
  58819. jn = jn->next;
  58820. 8032404: 6864 ldr r4, [r4, #4]
  58821. struct mib_list_node *jn;
  58822. struct nse cur_node;
  58823. /* non-leaf, store right child ptr and id */
  58824. jn = ln->next;
  58825. while ((jn != NULL) && empty_table(jn->nptr))
  58826. 8032406: 2c00 cmp r4, #0
  58827. 8032408: f000 80e9 beq.w 80325de <snmp_expand_tree+0x372>
  58828. 803240c: f8d4 900c ldr.w r9, [r4, #12]
  58829. 8032410: 4648 mov r0, r9
  58830. 8032412: f7ff fdad bl 8031f70 <empty_table>
  58831. 8032416: 2800 cmp r0, #0
  58832. 8032418: d1f4 bne.n 8032404 <snmp_expand_tree+0x198>
  58833. 803241a: e0d9 b.n 80325d0 <snmp_expand_tree+0x364>
  58834. }
  58835. else
  58836. {
  58837. cur_node.r_ptr = NULL;
  58838. }
  58839. push_node(&cur_node);
  58840. 803241c: a807 add r0, sp, #28
  58841. 803241e: f7ff fd93 bl 8031f48 <push_node>
  58842. if (ln->objid == *ident)
  58843. 8032422: 68ba ldr r2, [r7, #8]
  58844. 8032424: f8d8 3000 ldr.w r3, [r8]
  58845. 8032428: 429a cmp r2, r3
  58846. 803242a: d104 bne.n 8032436 <snmp_expand_tree+0x1ca>
  58847. {
  58848. ident_len--;
  58849. 803242c: 3e01 subs r6, #1
  58850. 803242e: b2f6 uxtb r6, r6
  58851. ident++;
  58852. 8032430: f108 0804 add.w r8, r8, #4
  58853. 8032434: e000 b.n 8032438 <snmp_expand_tree+0x1cc>
  58854. }
  58855. else
  58856. {
  58857. /* ln->objid < *ident */
  58858. ident_len = 0;
  58859. 8032436: 2600 movs r6, #0
  58860. }
  58861. /* follow next child pointer */
  58862. node = ln->nptr;
  58863. 8032438: 68fb ldr r3, [r7, #12]
  58864. 803243a: e0dc b.n 80325f6 <snmp_expand_tree+0x38a>
  58865. struct mib_list_node *jn;
  58866. /* ident_len == 0, complete with leftmost '.thing' */
  58867. jn = lrn->head;
  58868. while ((jn != NULL) && empty_table(jn->nptr))
  58869. {
  58870. jn = jn->next;
  58871. 803243c: 687f ldr r7, [r7, #4]
  58872. else
  58873. {
  58874. struct mib_list_node *jn;
  58875. /* ident_len == 0, complete with leftmost '.thing' */
  58876. jn = lrn->head;
  58877. while ((jn != NULL) && empty_table(jn->nptr))
  58878. 803243e: 2f00 cmp r7, #0
  58879. 8032440: f000 809b beq.w 803257a <snmp_expand_tree+0x30e>
  58880. 8032444: 68f8 ldr r0, [r7, #12]
  58881. 8032446: f7ff fd93 bl 8031f70 <empty_table>
  58882. 803244a: 2800 cmp r0, #0
  58883. 803244c: d1f6 bne.n 803243c <snmp_expand_tree+0x1d0>
  58884. 803244e: e0c8 b.n 80325e2 <snmp_expand_tree+0x376>
  58885. /* jn == NULL */
  58886. climb_tree = 1;
  58887. }
  58888. }
  58889. }
  58890. else if(node_type == MIB_NODE_EX)
  58891. 8032450: 2b05 cmp r3, #5
  58892. 8032452: f040 8086 bne.w 8032562 <snmp_expand_tree+0x2f6>
  58893. struct mib_external_node *en;
  58894. s32_t ex_id;
  58895. /* external node (addressing and access via functions) */
  58896. en = (struct mib_external_node *)node;
  58897. if (ident_len > 0)
  58898. 8032456: 2e00 cmp r6, #0
  58899. 8032458: d06e beq.n 8032538 <snmp_expand_tree+0x2cc>
  58900. {
  58901. u16_t i, len;
  58902. i = 0;
  58903. len = en->level_length(en->addr_inf,ext_level);
  58904. 803245a: 69e3 ldr r3, [r4, #28]
  58905. 803245c: 6960 ldr r0, [r4, #20]
  58906. 803245e: 4651 mov r1, sl
  58907. 8032460: 4798 blx r3
  58908. en = (struct mib_external_node *)node;
  58909. if (ident_len > 0)
  58910. {
  58911. u16_t i, len;
  58912. i = 0;
  58913. 8032462: f04f 0900 mov.w r9, #0
  58914. len = en->level_length(en->addr_inf,ext_level);
  58915. 8032466: 4683 mov fp, r0
  58916. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) < 0))
  58917. 8032468: e003 b.n 8032472 <snmp_expand_tree+0x206>
  58918. {
  58919. i++;
  58920. 803246a: f109 0901 add.w r9, r9, #1
  58921. 803246e: fa1f f989 uxth.w r9, r9
  58922. {
  58923. u16_t i, len;
  58924. i = 0;
  58925. len = en->level_length(en->addr_inf,ext_level);
  58926. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) < 0))
  58927. 8032472: 45d9 cmp r9, fp
  58928. 8032474: f000 8081 beq.w 803257a <snmp_expand_tree+0x30e>
  58929. 8032478: 6a27 ldr r7, [r4, #32]
  58930. 803247a: 6960 ldr r0, [r4, #20]
  58931. 803247c: f8d8 3000 ldr.w r3, [r8]
  58932. 8032480: 4651 mov r1, sl
  58933. 8032482: 464a mov r2, r9
  58934. 8032484: 47b8 blx r7
  58935. 8032486: 2800 cmp r0, #0
  58936. 8032488: dbef blt.n 803246a <snmp_expand_tree+0x1fe>
  58937. {
  58938. i++;
  58939. }
  58940. if (i < len)
  58941. 803248a: 45d9 cmp r9, fp
  58942. 803248c: d275 bcs.n 803257a <snmp_expand_tree+0x30e>
  58943. {
  58944. /* add identifier to oidret */
  58945. en->get_objid(en->addr_inf,ext_level,i,&ex_id);
  58946. 803248e: 4651 mov r1, sl
  58947. 8032490: 464a mov r2, r9
  58948. 8032492: ab06 add r3, sp, #24
  58949. 8032494: 6a67 ldr r7, [r4, #36] ; 0x24
  58950. 8032496: 6960 ldr r0, [r4, #20]
  58951. 8032498: 47b8 blx r7
  58952. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,ex_id,*ident));
  58953. oidret->id[oidret->len] = ex_id;
  58954. 803249a: 782b ldrb r3, [r5, #0]
  58955. 803249c: 9a06 ldr r2, [sp, #24]
  58956. 803249e: eb05 0183 add.w r1, r5, r3, lsl #2
  58957. (oidret->len)++;
  58958. if ((ext_level + 1) == en->tree_levels)
  58959. 80324a2: f10a 0c01 add.w ip, sl, #1
  58960. if (i < len)
  58961. {
  58962. /* add identifier to oidret */
  58963. en->get_objid(en->addr_inf,ext_level,i,&ex_id);
  58964. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,ex_id,*ident));
  58965. oidret->id[oidret->len] = ex_id;
  58966. 80324a6: 604a str r2, [r1, #4]
  58967. (oidret->len)++;
  58968. 80324a8: 1c59 adds r1, r3, #1
  58969. 80324aa: 7029 strb r1, [r5, #0]
  58970. if ((ext_level + 1) == en->tree_levels)
  58971. 80324ac: 7e21 ldrb r1, [r4, #24]
  58972. 80324ae: 458c cmp ip, r1
  58973. 80324b0: d118 bne.n 80324e4 <snmp_expand_tree+0x278>
  58974. {
  58975. LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
  58976. /* leaf node */
  58977. if (ex_id > *ident)
  58978. 80324b2: f8d8 1000 ldr.w r1, [r8]
  58979. 80324b6: 428a cmp r2, r1
  58980. 80324b8: f300 8088 bgt.w 80325cc <snmp_expand_tree+0x360>
  58981. {
  58982. return (struct mib_node*)en;
  58983. }
  58984. else if ((i + 1) < len)
  58985. 80324bc: f109 0201 add.w r2, r9, #1
  58986. 80324c0: 455a cmp r2, fp
  58987. 80324c2: da0d bge.n 80324e0 <snmp_expand_tree+0x274>
  58988. {
  58989. /* ex_id == *ident */
  58990. en->get_objid(en->addr_inf,ext_level,i + 1,&ex_id);
  58991. 80324c4: ab06 add r3, sp, #24
  58992. 80324c6: 6a66 ldr r6, [r4, #36] ; 0x24
  58993. 80324c8: 6960 ldr r0, [r4, #20]
  58994. 80324ca: 4651 mov r1, sl
  58995. 80324cc: b292 uxth r2, r2
  58996. 80324ce: 47b0 blx r6
  58997. (oidret->len)--;
  58998. 80324d0: 782b ldrb r3, [r5, #0]
  58999. 80324d2: 3b01 subs r3, #1
  59000. oidret->id[oidret->len] = ex_id;
  59001. 80324d4: b2db uxtb r3, r3
  59002. 80324d6: eb05 0583 add.w r5, r5, r3, lsl #2
  59003. 80324da: 9b06 ldr r3, [sp, #24]
  59004. 80324dc: 606b str r3, [r5, #4]
  59005. 80324de: e075 b.n 80325cc <snmp_expand_tree+0x360>
  59006. return (struct mib_node*)en;
  59007. }
  59008. else
  59009. {
  59010. /* (i + 1) == len */
  59011. (oidret->len)--;
  59012. 80324e0: 702b strb r3, [r5, #0]
  59013. 80324e2: e04a b.n 803257a <snmp_expand_tree+0x30e>
  59014. struct nse cur_node;
  59015. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  59016. /* non-leaf, store right child ptr and id */
  59017. LWIP_ASSERT("i < 0xff", i < 0xff);
  59018. j = (u8_t)i + 1;
  59019. 80324e4: f109 0201 add.w r2, r9, #1
  59020. if (j < len)
  59021. 80324e8: b2d2 uxtb r2, r2
  59022. 80324ea: 455a cmp r2, fp
  59023. 80324ec: d20e bcs.n 803250c <snmp_expand_tree+0x2a0>
  59024. {
  59025. /* right node is the current external node */
  59026. cur_node.r_ptr = node;
  59027. 80324ee: 9407 str r4, [sp, #28]
  59028. en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
  59029. 80324f0: 6960 ldr r0, [r4, #20]
  59030. 80324f2: 9b05 ldr r3, [sp, #20]
  59031. 80324f4: f8cd c004 str.w ip, [sp, #4]
  59032. 80324f8: 4651 mov r1, sl
  59033. 80324fa: 6a67 ldr r7, [r4, #36] ; 0x24
  59034. 80324fc: 47b8 blx r7
  59035. cur_node.r_nl = ext_level + 1;
  59036. 80324fe: f8dd c004 ldr.w ip, [sp, #4]
  59037. 8032502: f88d c024 strb.w ip, [sp, #36] ; 0x24
  59038. 8032506: e003 b.n 8032510 <snmp_expand_tree+0x2a4>
  59039. 8032508: 2000e288 .word 0x2000e288
  59040. }
  59041. else
  59042. {
  59043. cur_node.r_ptr = NULL;
  59044. 803250c: 2300 movs r3, #0
  59045. 803250e: 9307 str r3, [sp, #28]
  59046. }
  59047. push_node(&cur_node);
  59048. 8032510: a807 add r0, sp, #28
  59049. 8032512: f7ff fd19 bl 8031f48 <push_node>
  59050. if (en->ident_cmp(en->addr_inf,ext_level,i,*ident) == 0)
  59051. 8032516: 6a27 ldr r7, [r4, #32]
  59052. 8032518: 6960 ldr r0, [r4, #20]
  59053. 803251a: f8d8 3000 ldr.w r3, [r8]
  59054. 803251e: 4651 mov r1, sl
  59055. 8032520: 464a mov r2, r9
  59056. 8032522: 47b8 blx r7
  59057. 8032524: b920 cbnz r0, 8032530 <snmp_expand_tree+0x2c4>
  59058. {
  59059. ident_len--;
  59060. 8032526: 3e01 subs r6, #1
  59061. 8032528: b2f6 uxtb r6, r6
  59062. ident++;
  59063. 803252a: f108 0804 add.w r8, r8, #4
  59064. 803252e: e000 b.n 8032532 <snmp_expand_tree+0x2c6>
  59065. }
  59066. else
  59067. {
  59068. /* external id < *ident */
  59069. ident_len = 0;
  59070. 8032530: 2600 movs r6, #0
  59071. }
  59072. /* proceed to child */
  59073. ext_level++;
  59074. 8032532: f10a 0a01 add.w sl, sl, #1
  59075. 8032536: e011 b.n 803255c <snmp_expand_tree+0x2f0>
  59076. }
  59077. }
  59078. else
  59079. {
  59080. /* ident_len == 0, complete with leftmost '.thing' */
  59081. en->get_objid(en->addr_inf,ext_level,0,&ex_id);
  59082. 8032538: 4651 mov r1, sl
  59083. 803253a: 4632 mov r2, r6
  59084. 803253c: ab06 add r3, sp, #24
  59085. 803253e: 6a67 ldr r7, [r4, #36] ; 0x24
  59086. 8032540: 6960 ldr r0, [r4, #20]
  59087. 8032542: 47b8 blx r7
  59088. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left en->objid==%"S32_F"\n",ex_id));
  59089. oidret->id[oidret->len] = ex_id;
  59090. 8032544: 782b ldrb r3, [r5, #0]
  59091. 8032546: 9a06 ldr r2, [sp, #24]
  59092. 8032548: eb05 0183 add.w r1, r5, r3, lsl #2
  59093. (oidret->len)++;
  59094. 803254c: 3301 adds r3, #1
  59095. else
  59096. {
  59097. /* ident_len == 0, complete with leftmost '.thing' */
  59098. en->get_objid(en->addr_inf,ext_level,0,&ex_id);
  59099. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left en->objid==%"S32_F"\n",ex_id));
  59100. oidret->id[oidret->len] = ex_id;
  59101. 803254e: 604a str r2, [r1, #4]
  59102. (oidret->len)++;
  59103. 8032550: 702b strb r3, [r5, #0]
  59104. if ((ext_level + 1) == en->tree_levels)
  59105. 8032552: 7e23 ldrb r3, [r4, #24]
  59106. 8032554: f10a 0a01 add.w sl, sl, #1
  59107. 8032558: 459a cmp sl, r3
  59108. 803255a: d037 beq.n 80325cc <snmp_expand_tree+0x360>
  59109. return (struct mib_node*)en;
  59110. }
  59111. else
  59112. {
  59113. /* no leaf, proceed to child */
  59114. ext_level++;
  59115. 803255c: fa5f fa8a uxtb.w sl, sl
  59116. 8032560: e030 b.n 80325c4 <snmp_expand_tree+0x358>
  59117. }
  59118. }
  59119. }
  59120. else if(node_type == MIB_NODE_SC)
  59121. 8032562: 2b01 cmp r3, #1
  59122. 8032564: d001 beq.n 803256a <snmp_expand_tree+0x2fe>
  59123. }
  59124. else
  59125. {
  59126. /* unknown/unhandled node_type */
  59127. LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node_type %"U16_F" unkown\n",(u16_t)node_type));
  59128. return NULL;
  59129. 8032566: 2000 movs r0, #0
  59130. 8032568: e047 b.n 80325fa <snmp_expand_tree+0x38e>
  59131. {
  59132. mib_scalar_node *sn;
  59133. /* scalar node */
  59134. sn = (mib_scalar_node *)node;
  59135. if (ident_len > 0)
  59136. 803256a: b936 cbnz r6, 803257a <snmp_expand_tree+0x30e>
  59137. climb_tree = 1;
  59138. }
  59139. else
  59140. {
  59141. /* ident_len == 0, complete object identifier */
  59142. oidret->id[oidret->len] = 0;
  59143. 803256c: 782b ldrb r3, [r5, #0]
  59144. 803256e: eb05 0283 add.w r2, r5, r3, lsl #2
  59145. (oidret->len)++;
  59146. 8032572: 3301 adds r3, #1
  59147. climb_tree = 1;
  59148. }
  59149. else
  59150. {
  59151. /* ident_len == 0, complete object identifier */
  59152. oidret->id[oidret->len] = 0;
  59153. 8032574: 6056 str r6, [r2, #4]
  59154. (oidret->len)++;
  59155. 8032576: 702b strb r3, [r5, #0]
  59156. 8032578: e028 b.n 80325cc <snmp_expand_tree+0x360>
  59157. 803257a: 4921 ldr r1, [pc, #132] ; (8032600 <snmp_expand_tree+0x394>)
  59158. struct nse child;
  59159. /* find right child ptr */
  59160. child.r_ptr = NULL;
  59161. child.r_id = 0;
  59162. child.r_nl = 0;
  59163. 803257c: f04f 0a00 mov.w sl, #0
  59164. 8032580: 780b ldrb r3, [r1, #0]
  59165. pop_node(struct nse* node)
  59166. {
  59167. if (node_stack_cnt > 0)
  59168. {
  59169. node_stack_cnt--;
  59170. *node = node_stack[node_stack_cnt];
  59171. 8032582: 4920 ldr r1, [pc, #128] ; (8032604 <snmp_expand_tree+0x398>)
  59172. {
  59173. struct nse child;
  59174. /* find right child ptr */
  59175. child.r_ptr = NULL;
  59176. child.r_id = 0;
  59177. 8032584: 4652 mov r2, sl
  59178. if (climb_tree)
  59179. {
  59180. struct nse child;
  59181. /* find right child ptr */
  59182. child.r_ptr = NULL;
  59183. 8032586: 4654 mov r4, sl
  59184. pop_node(struct nse* node)
  59185. {
  59186. if (node_stack_cnt > 0)
  59187. {
  59188. node_stack_cnt--;
  59189. *node = node_stack[node_stack_cnt];
  59190. 8032588: 260c movs r6, #12
  59191. /* find right child ptr */
  59192. child.r_ptr = NULL;
  59193. child.r_id = 0;
  59194. child.r_nl = 0;
  59195. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  59196. 803258a: e00b b.n 80325a4 <snmp_expand_tree+0x338>
  59197. static void
  59198. pop_node(struct nse* node)
  59199. {
  59200. if (node_stack_cnt > 0)
  59201. {
  59202. node_stack_cnt--;
  59203. 803258c: 3b01 subs r3, #1
  59204. 803258e: b2db uxtb r3, r3
  59205. *node = node_stack[node_stack_cnt];
  59206. 8032590: fb06 f203 mul.w r2, r6, r3
  59207. 8032594: 1888 adds r0, r1, r2
  59208. 8032596: 588c ldr r4, [r1, r2]
  59209. 8032598: f890 a008 ldrb.w sl, [r0, #8]
  59210. 803259c: 6842 ldr r2, [r0, #4]
  59211. child.r_nl = 0;
  59212. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  59213. {
  59214. pop_node(&child);
  59215. /* trim returned oid */
  59216. (oidret->len)--;
  59217. 803259e: 7828 ldrb r0, [r5, #0]
  59218. 80325a0: 3801 subs r0, #1
  59219. 80325a2: 7028 strb r0, [r5, #0]
  59220. /* find right child ptr */
  59221. child.r_ptr = NULL;
  59222. child.r_id = 0;
  59223. child.r_nl = 0;
  59224. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  59225. 80325a4: b91b cbnz r3, 80325ae <snmp_expand_tree+0x342>
  59226. 80325a6: 4f16 ldr r7, [pc, #88] ; (8032600 <snmp_expand_tree+0x394>)
  59227. 80325a8: 703b strb r3, [r7, #0]
  59228. {
  59229. pop_node(&child);
  59230. /* trim returned oid */
  59231. (oidret->len)--;
  59232. }
  59233. if (child.r_ptr != NULL)
  59234. 80325aa: b924 cbnz r4, 80325b6 <snmp_expand_tree+0x34a>
  59235. 80325ac: e7db b.n 8032566 <snmp_expand_tree+0x2fa>
  59236. /* find right child ptr */
  59237. child.r_ptr = NULL;
  59238. child.r_id = 0;
  59239. child.r_nl = 0;
  59240. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  59241. 80325ae: 2c00 cmp r4, #0
  59242. 80325b0: d0ec beq.n 803258c <snmp_expand_tree+0x320>
  59243. 80325b2: 4913 ldr r1, [pc, #76] ; (8032600 <snmp_expand_tree+0x394>)
  59244. 80325b4: 700b strb r3, [r1, #0]
  59245. }
  59246. if (child.r_ptr != NULL)
  59247. {
  59248. /* incoming ident is useless beyond this point */
  59249. ident_len = 0;
  59250. oidret->id[oidret->len] = child.r_id;
  59251. 80325b6: 782b ldrb r3, [r5, #0]
  59252. 80325b8: eb05 0183 add.w r1, r5, r3, lsl #2
  59253. oidret->len++;
  59254. 80325bc: 3301 adds r3, #1
  59255. }
  59256. if (child.r_ptr != NULL)
  59257. {
  59258. /* incoming ident is useless beyond this point */
  59259. ident_len = 0;
  59260. oidret->id[oidret->len] = child.r_id;
  59261. 80325be: 604a str r2, [r1, #4]
  59262. oidret->len++;
  59263. 80325c0: 702b strb r3, [r5, #0]
  59264. (oidret->len)--;
  59265. }
  59266. if (child.r_ptr != NULL)
  59267. {
  59268. /* incoming ident is useless beyond this point */
  59269. ident_len = 0;
  59270. 80325c2: 2600 movs r6, #0
  59271. u8_t node_type, ext_level, climb_tree;
  59272. ext_level = 0;
  59273. /* reset node stack */
  59274. node_stack_cnt = 0;
  59275. while (node != NULL)
  59276. 80325c4: 2c00 cmp r4, #0
  59277. 80325c6: f47f ae60 bne.w 803228a <snmp_expand_tree+0x1e>
  59278. 80325ca: e7cc b.n 8032566 <snmp_expand_tree+0x2fa>
  59279. if (jn != NULL)
  59280. {
  59281. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
  59282. oidret->id[oidret->len] = jn->objid;
  59283. (oidret->len)++;
  59284. if (jn->nptr == NULL)
  59285. 80325cc: 4620 mov r0, r4
  59286. 80325ce: e014 b.n 80325fa <snmp_expand_tree+0x38e>
  59287. jn = jn->next;
  59288. }
  59289. if (jn != NULL)
  59290. {
  59291. cur_node.r_ptr = jn->nptr;
  59292. cur_node.r_id = jn->objid;
  59293. 80325d0: 68a3 ldr r3, [r4, #8]
  59294. {
  59295. jn = jn->next;
  59296. }
  59297. if (jn != NULL)
  59298. {
  59299. cur_node.r_ptr = jn->nptr;
  59300. 80325d2: f8cd 901c str.w r9, [sp, #28]
  59301. cur_node.r_id = jn->objid;
  59302. 80325d6: 9308 str r3, [sp, #32]
  59303. cur_node.r_nl = 0;
  59304. 80325d8: f88d 0024 strb.w r0, [sp, #36] ; 0x24
  59305. 80325dc: e71e b.n 803241c <snmp_expand_tree+0x1b0>
  59306. }
  59307. else
  59308. {
  59309. cur_node.r_ptr = NULL;
  59310. 80325de: 9407 str r4, [sp, #28]
  59311. 80325e0: e71c b.n 803241c <snmp_expand_tree+0x1b0>
  59312. jn = jn->next;
  59313. }
  59314. if (jn != NULL)
  59315. {
  59316. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
  59317. oidret->id[oidret->len] = jn->objid;
  59318. 80325e2: 782b ldrb r3, [r5, #0]
  59319. 80325e4: 68ba ldr r2, [r7, #8]
  59320. 80325e6: eb05 0183 add.w r1, r5, r3, lsl #2
  59321. (oidret->len)++;
  59322. 80325ea: 3301 adds r3, #1
  59323. 80325ec: 702b strb r3, [r5, #0]
  59324. if (jn->nptr == NULL)
  59325. 80325ee: 68fb ldr r3, [r7, #12]
  59326. jn = jn->next;
  59327. }
  59328. if (jn != NULL)
  59329. {
  59330. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
  59331. oidret->id[oidret->len] = jn->objid;
  59332. 80325f0: 604a str r2, [r1, #4]
  59333. (oidret->len)++;
  59334. if (jn->nptr == NULL)
  59335. 80325f2: 2b00 cmp r3, #0
  59336. 80325f4: d0ea beq.n 80325cc <snmp_expand_tree+0x360>
  59337. (oidret->len)--;
  59338. }
  59339. if (child.r_ptr != NULL)
  59340. {
  59341. /* incoming ident is useless beyond this point */
  59342. ident_len = 0;
  59343. 80325f6: 461c mov r4, r3
  59344. 80325f8: e7e4 b.n 80325c4 <snmp_expand_tree+0x358>
  59345. }
  59346. }
  59347. /* done, found nothing */
  59348. LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node==%p\n",(void*)node));
  59349. return NULL;
  59350. }
  59351. 80325fa: b00b add sp, #44 ; 0x2c
  59352. 80325fc: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  59353. 8032600: 2000e288 .word 0x2000e288
  59354. 8032604: 2000e28c .word 0x2000e28c
  59355. 08032608 <snmp_iso_prefix_tst>:
  59356. * @return 1 if it matches, 0 otherwise
  59357. */
  59358. u8_t
  59359. snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident)
  59360. {
  59361. if ((ident_len > 3) &&
  59362. 8032608: 2803 cmp r0, #3
  59363. 803260a: d90d bls.n 8032628 <snmp_iso_prefix_tst+0x20>
  59364. 803260c: 680b ldr r3, [r1, #0]
  59365. 803260e: 2b01 cmp r3, #1
  59366. 8032610: d10a bne.n 8032628 <snmp_iso_prefix_tst+0x20>
  59367. (ident[0] == 1) && (ident[1] == 3) &&
  59368. 8032612: 684b ldr r3, [r1, #4]
  59369. 8032614: 2b03 cmp r3, #3
  59370. 8032616: d107 bne.n 8032628 <snmp_iso_prefix_tst+0x20>
  59371. 8032618: 688b ldr r3, [r1, #8]
  59372. 803261a: 2b06 cmp r3, #6
  59373. 803261c: d104 bne.n 8032628 <snmp_iso_prefix_tst+0x20>
  59374. (ident[2] == 6) && (ident[3] == 1))
  59375. 803261e: 68c8 ldr r0, [r1, #12]
  59376. {
  59377. return 1;
  59378. 8032620: 1e43 subs r3, r0, #1
  59379. 8032622: 4258 negs r0, r3
  59380. 8032624: 4158 adcs r0, r3
  59381. 8032626: 4770 bx lr
  59382. }
  59383. else
  59384. {
  59385. return 0;
  59386. 8032628: 2000 movs r0, #0
  59387. }
  59388. }
  59389. 803262a: 4770 bx lr
  59390. 0803262c <snmp_iso_prefix_expand>:
  59391. i = 0;
  59392. prefix_ptr = &prefix[0];
  59393. ret_ptr = &oidret->id[0];
  59394. ident_len = ((ident_len < 4)?ident_len:4);
  59395. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  59396. 803262c: 2300 movs r3, #0
  59397. *
  59398. * @note ident_len 0 is allowed, expanding to the first known object id!!
  59399. */
  59400. u8_t
  59401. snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  59402. {
  59403. 803262e: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  59404. s32_t *ret_ptr;
  59405. u8_t i;
  59406. i = 0;
  59407. prefix_ptr = &prefix[0];
  59408. ret_ptr = &oidret->id[0];
  59409. 8032632: 1d15 adds r5, r2, #4
  59410. ident_len = ((ident_len < 4)?ident_len:4);
  59411. 8032634: 2804 cmp r0, #4
  59412. 8032636: bf34 ite cc
  59413. 8032638: 4680 movcc r8, r0
  59414. 803263a: f04f 0804 movcs.w r8, #4
  59415. {
  59416. const s32_t *prefix_ptr;
  59417. s32_t *ret_ptr;
  59418. u8_t i;
  59419. i = 0;
  59420. 803263e: 461c mov r4, r3
  59421. * @return 1 if it matches, 0 otherwise
  59422. *
  59423. * @note ident_len 0 is allowed, expanding to the first known object id!!
  59424. */
  59425. u8_t
  59426. snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  59427. 8032640: 4f10 ldr r7, [pc, #64] ; (8032684 <snmp_iso_prefix_expand+0x58>)
  59428. i = 0;
  59429. prefix_ptr = &prefix[0];
  59430. ret_ptr = &oidret->id[0];
  59431. ident_len = ((ident_len < 4)?ident_len:4);
  59432. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  59433. 8032642: e003 b.n 803264c <snmp_iso_prefix_expand+0x20>
  59434. {
  59435. *ret_ptr++ = *prefix_ptr++;
  59436. ident++;
  59437. i++;
  59438. 8032644: 3401 adds r4, #1
  59439. prefix_ptr = &prefix[0];
  59440. ret_ptr = &oidret->id[0];
  59441. ident_len = ((ident_len < 4)?ident_len:4);
  59442. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  59443. {
  59444. *ret_ptr++ = *prefix_ptr++;
  59445. 8032646: 50ee str r6, [r5, r3]
  59446. ident++;
  59447. i++;
  59448. 8032648: b2e4 uxtb r4, r4
  59449. 803264a: 3304 adds r3, #4
  59450. i = 0;
  59451. prefix_ptr = &prefix[0];
  59452. ret_ptr = &oidret->id[0];
  59453. ident_len = ((ident_len < 4)?ident_len:4);
  59454. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  59455. 803264c: 4544 cmp r4, r8
  59456. * @return 1 if it matches, 0 otherwise
  59457. *
  59458. * @note ident_len 0 is allowed, expanding to the first known object id!!
  59459. */
  59460. u8_t
  59461. snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  59462. 803264e: eb05 0c03 add.w ip, r5, r3
  59463. 8032652: eb07 0603 add.w r6, r7, r3
  59464. i = 0;
  59465. prefix_ptr = &prefix[0];
  59466. ret_ptr = &oidret->id[0];
  59467. ident_len = ((ident_len < 4)?ident_len:4);
  59468. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  59469. 8032656: d101 bne.n 803265c <snmp_iso_prefix_expand+0x30>
  59470. 8032658: 2300 movs r3, #0
  59471. 803265a: e00c b.n 8032676 <snmp_iso_prefix_expand+0x4a>
  59472. 803265c: 59de ldr r6, [r3, r7]
  59473. 803265e: 58c8 ldr r0, [r1, r3]
  59474. 8032660: 42b0 cmp r0, r6
  59475. 8032662: ddef ble.n 8032644 <snmp_iso_prefix_expand+0x18>
  59476. return 1;
  59477. }
  59478. else
  59479. {
  59480. /* i != ident_len */
  59481. return 0;
  59482. 8032664: 2000 movs r0, #0
  59483. 8032666: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  59484. if (i == ident_len)
  59485. {
  59486. /* match, complete missing bits */
  59487. while (i < 4)
  59488. {
  59489. *ret_ptr++ = *prefix_ptr++;
  59490. 803266a: 58f1 ldr r1, [r6, r3]
  59491. i++;
  59492. 803266c: 3401 adds r4, #1
  59493. if (i == ident_len)
  59494. {
  59495. /* match, complete missing bits */
  59496. while (i < 4)
  59497. {
  59498. *ret_ptr++ = *prefix_ptr++;
  59499. 803266e: f84c 1003 str.w r1, [ip, r3]
  59500. i++;
  59501. 8032672: b2e4 uxtb r4, r4
  59502. 8032674: 3304 adds r3, #4
  59503. i++;
  59504. }
  59505. if (i == ident_len)
  59506. {
  59507. /* match, complete missing bits */
  59508. while (i < 4)
  59509. 8032676: 2c03 cmp r4, #3
  59510. 8032678: d9f7 bls.n 803266a <snmp_iso_prefix_expand+0x3e>
  59511. {
  59512. *ret_ptr++ = *prefix_ptr++;
  59513. i++;
  59514. }
  59515. oidret->len = i;
  59516. 803267a: 7014 strb r4, [r2, #0]
  59517. return 1;
  59518. 803267c: 2001 movs r0, #1
  59519. else
  59520. {
  59521. /* i != ident_len */
  59522. return 0;
  59523. }
  59524. }
  59525. 803267e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  59526. 8032682: bf00 nop
  59527. 8032684: 0804079c .word 0x0804079c
  59528. 08032688 <snmp_init>:
  59529. * Starts SNMP Agent.
  59530. * Allocates UDP pcb and binds it to IP_ADDR_ANY port 161.
  59531. */
  59532. void
  59533. snmp_init(void)
  59534. {
  59535. 8032688: b510 push {r4, lr}
  59536. struct snmp_msg_pstat *msg_ps;
  59537. u8_t i;
  59538. snmp1_pcb = udp_new();
  59539. 803268a: f7fd fa39 bl 802fb00 <udp_new>
  59540. 803268e: 4c0b ldr r4, [pc, #44] ; (80326bc <snmp_init+0x34>)
  59541. 8032690: 6020 str r0, [r4, #0]
  59542. if (snmp1_pcb != NULL)
  59543. 8032692: b140 cbz r0, 80326a6 <snmp_init+0x1e>
  59544. {
  59545. udp_recv(snmp1_pcb, snmp_recv, (void *)SNMP_IN_PORT);
  59546. 8032694: 490a ldr r1, [pc, #40] ; (80326c0 <snmp_init+0x38>)
  59547. 8032696: 22a1 movs r2, #161 ; 0xa1
  59548. 8032698: f7fd fa12 bl 802fac0 <udp_recv>
  59549. udp_bind(snmp1_pcb, IP_ADDR_ANY, SNMP_IN_PORT);
  59550. 803269c: 6820 ldr r0, [r4, #0]
  59551. 803269e: 4909 ldr r1, [pc, #36] ; (80326c4 <snmp_init+0x3c>)
  59552. 80326a0: 22a1 movs r2, #161 ; 0xa1
  59553. 80326a2: f7fd f915 bl 802f8d0 <udp_bind>
  59554. }
  59555. msg_ps = &msg_input_list[0];
  59556. for (i=0; i<SNMP_CONCURRENT_REQUESTS; i++)
  59557. {
  59558. msg_ps->state = SNMP_MSG_EMPTY;
  59559. 80326a6: 4b08 ldr r3, [pc, #32] ; (80326c8 <snmp_init+0x40>)
  59560. 80326a8: 2200 movs r2, #0
  59561. 80326aa: f883 205a strb.w r2, [r3, #90] ; 0x5a
  59562. msg_ps->error_index = 0;
  59563. 80326ae: 615a str r2, [r3, #20]
  59564. msg_ps->error_status = SNMP_ES_NOERROR;
  59565. 80326b0: 611a str r2, [r3, #16]
  59566. msg_ps++;
  59567. }
  59568. trap_msg.pcb = snmp1_pcb;
  59569. 80326b2: 4b02 ldr r3, [pc, #8] ; (80326bc <snmp_init+0x34>)
  59570. 80326b4: 681a ldr r2, [r3, #0]
  59571. 80326b6: 4b05 ldr r3, [pc, #20] ; (80326cc <snmp_init+0x44>)
  59572. 80326b8: 601a str r2, [r3, #0]
  59573. 80326ba: bd10 pop {r4, pc}
  59574. 80326bc: 2001100c .word 0x2001100c
  59575. 80326c0: 08033235 .word 0x08033235
  59576. 80326c4: 0803fe88 .word 0x0803fe88
  59577. 80326c8: 20011010 .word 0x20011010
  59578. 80326cc: 20011148 .word 0x20011148
  59579. 080326d0 <snmp_varbind_alloc>:
  59580. return ERR_OK;
  59581. }
  59582. struct snmp_varbind*
  59583. snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len)
  59584. {
  59585. 80326d0: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  59586. 80326d4: 4680 mov r8, r0
  59587. struct snmp_varbind *vb;
  59588. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  59589. 80326d6: 200c movs r0, #12
  59590. return ERR_OK;
  59591. }
  59592. struct snmp_varbind*
  59593. snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len)
  59594. {
  59595. 80326d8: 4689 mov r9, r1
  59596. 80326da: 4617 mov r7, r2
  59597. struct snmp_varbind *vb;
  59598. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  59599. 80326dc: f7fa fb88 bl 802cdf0 <memp_malloc>
  59600. if (vb != NULL)
  59601. 80326e0: 4604 mov r4, r0
  59602. 80326e2: 2800 cmp r0, #0
  59603. 80326e4: d032 beq.n 803274c <snmp_varbind_alloc+0x7c>
  59604. {
  59605. u8_t i;
  59606. vb->next = NULL;
  59607. 80326e6: 2300 movs r3, #0
  59608. 80326e8: 6003 str r3, [r0, #0]
  59609. vb->prev = NULL;
  59610. 80326ea: 6043 str r3, [r0, #4]
  59611. i = oid->len;
  59612. 80326ec: f898 5000 ldrb.w r5, [r8]
  59613. vb->ident_len = i;
  59614. 80326f0: 7205 strb r5, [r0, #8]
  59615. if (i > 0)
  59616. 80326f2: b1ad cbz r5, 8032720 <snmp_varbind_alloc+0x50>
  59617. {
  59618. LWIP_ASSERT("SNMP_MAX_TREE_DEPTH is configured too low", i <= SNMP_MAX_TREE_DEPTH);
  59619. /* allocate array of s32_t for our object identifier */
  59620. vb->ident = (s32_t*)memp_malloc(MEMP_SNMP_VALUE);
  59621. 80326f4: 200d movs r0, #13
  59622. 80326f6: f7fa fb7b bl 802cdf0 <memp_malloc>
  59623. 80326fa: 4606 mov r6, r0
  59624. 80326fc: 60e0 str r0, [r4, #12]
  59625. if (vb->ident == NULL)
  59626. 80326fe: b928 cbnz r0, 803270c <snmp_varbind_alloc+0x3c>
  59627. {
  59628. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate ident value space\n"));
  59629. memp_free(MEMP_SNMP_VARBIND, vb);
  59630. 8032700: 4621 mov r1, r4
  59631. 8032702: 200c movs r0, #12
  59632. 8032704: f7fa fb8a bl 802ce1c <memp_free>
  59633. return NULL;
  59634. 8032708: 4634 mov r4, r6
  59635. 803270a: e01f b.n 803274c <snmp_varbind_alloc+0x7c>
  59636. }
  59637. while(i > 0)
  59638. {
  59639. i--;
  59640. 803270c: 3d01 subs r5, #1
  59641. 803270e: b2ed uxtb r5, r5
  59642. vb->ident[i] = oid->id[i];
  59643. 8032710: eb08 0385 add.w r3, r8, r5, lsl #2
  59644. 8032714: 685b ldr r3, [r3, #4]
  59645. 8032716: f846 3025 str.w r3, [r6, r5, lsl #2]
  59646. {
  59647. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate ident value space\n"));
  59648. memp_free(MEMP_SNMP_VARBIND, vb);
  59649. return NULL;
  59650. }
  59651. while(i > 0)
  59652. 803271a: 2d00 cmp r5, #0
  59653. 803271c: d1f6 bne.n 803270c <snmp_varbind_alloc+0x3c>
  59654. 803271e: e000 b.n 8032722 <snmp_varbind_alloc+0x52>
  59655. }
  59656. }
  59657. else
  59658. {
  59659. /* i == 0, pass zero length object identifier */
  59660. vb->ident = NULL;
  59661. 8032720: 60c5 str r5, [r0, #12]
  59662. }
  59663. vb->value_type = type;
  59664. 8032722: f884 9010 strb.w r9, [r4, #16]
  59665. vb->value_len = len;
  59666. 8032726: 7467 strb r7, [r4, #17]
  59667. if (len > 0)
  59668. 8032728: b17f cbz r7, 803274a <snmp_varbind_alloc+0x7a>
  59669. {
  59670. LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE);
  59671. /* allocate raw bytes for our object value */
  59672. vb->value = memp_malloc(MEMP_SNMP_VALUE);
  59673. 803272a: 200d movs r0, #13
  59674. 803272c: f7fa fb60 bl 802cdf0 <memp_malloc>
  59675. 8032730: 6160 str r0, [r4, #20]
  59676. if (vb->value == NULL)
  59677. 8032732: b958 cbnz r0, 803274c <snmp_varbind_alloc+0x7c>
  59678. {
  59679. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate value space\n"));
  59680. if (vb->ident != NULL)
  59681. 8032734: 68e1 ldr r1, [r4, #12]
  59682. 8032736: b111 cbz r1, 803273e <snmp_varbind_alloc+0x6e>
  59683. {
  59684. memp_free(MEMP_SNMP_VALUE, vb->ident);
  59685. 8032738: 200d movs r0, #13
  59686. 803273a: f7fa fb6f bl 802ce1c <memp_free>
  59687. }
  59688. memp_free(MEMP_SNMP_VARBIND, vb);
  59689. 803273e: 4621 mov r1, r4
  59690. 8032740: 200c movs r0, #12
  59691. 8032742: f7fa fb6b bl 802ce1c <memp_free>
  59692. return NULL;
  59693. 8032746: 2400 movs r4, #0
  59694. 8032748: e000 b.n 803274c <snmp_varbind_alloc+0x7c>
  59695. }
  59696. }
  59697. else
  59698. {
  59699. /* ASN1_NUL type, or zero length ASN1_OC_STR */
  59700. vb->value = NULL;
  59701. 803274a: 6167 str r7, [r4, #20]
  59702. else
  59703. {
  59704. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate varbind space\n"));
  59705. }
  59706. return vb;
  59707. }
  59708. 803274c: 4620 mov r0, r4
  59709. 803274e: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  59710. 08032752 <snmp_varbind_free>:
  59711. void
  59712. snmp_varbind_free(struct snmp_varbind *vb)
  59713. {
  59714. if (vb->value != NULL )
  59715. 8032752: 6941 ldr r1, [r0, #20]
  59716. return vb;
  59717. }
  59718. void
  59719. snmp_varbind_free(struct snmp_varbind *vb)
  59720. {
  59721. 8032754: b510 push {r4, lr}
  59722. 8032756: 4604 mov r4, r0
  59723. if (vb->value != NULL )
  59724. 8032758: b111 cbz r1, 8032760 <snmp_varbind_free+0xe>
  59725. {
  59726. memp_free(MEMP_SNMP_VALUE, vb->value);
  59727. 803275a: 200d movs r0, #13
  59728. 803275c: f7fa fb5e bl 802ce1c <memp_free>
  59729. }
  59730. if (vb->ident != NULL )
  59731. 8032760: 68e1 ldr r1, [r4, #12]
  59732. 8032762: b111 cbz r1, 803276a <snmp_varbind_free+0x18>
  59733. {
  59734. memp_free(MEMP_SNMP_VALUE, vb->ident);
  59735. 8032764: 200d movs r0, #13
  59736. 8032766: f7fa fb59 bl 802ce1c <memp_free>
  59737. }
  59738. memp_free(MEMP_SNMP_VARBIND, vb);
  59739. 803276a: 200c movs r0, #12
  59740. 803276c: 4621 mov r1, r4
  59741. }
  59742. 803276e: e8bd 4010 ldmia.w sp!, {r4, lr}
  59743. }
  59744. if (vb->ident != NULL )
  59745. {
  59746. memp_free(MEMP_SNMP_VALUE, vb->ident);
  59747. }
  59748. memp_free(MEMP_SNMP_VARBIND, vb);
  59749. 8032772: f7fa bb53 b.w 802ce1c <memp_free>
  59750. 08032776 <snmp_varbind_list_free>:
  59751. }
  59752. void
  59753. snmp_varbind_list_free(struct snmp_varbind_root *root)
  59754. {
  59755. 8032776: b538 push {r3, r4, r5, lr}
  59756. 8032778: 4604 mov r4, r0
  59757. struct snmp_varbind *vb, *prev;
  59758. vb = root->tail;
  59759. 803277a: 6840 ldr r0, [r0, #4]
  59760. while ( vb != NULL )
  59761. 803277c: e003 b.n 8032786 <snmp_varbind_list_free+0x10>
  59762. {
  59763. prev = vb->prev;
  59764. 803277e: 6845 ldr r5, [r0, #4]
  59765. snmp_varbind_free(vb);
  59766. 8032780: f7ff ffe7 bl 8032752 <snmp_varbind_free>
  59767. vb = prev;
  59768. 8032784: 4628 mov r0, r5
  59769. snmp_varbind_list_free(struct snmp_varbind_root *root)
  59770. {
  59771. struct snmp_varbind *vb, *prev;
  59772. vb = root->tail;
  59773. while ( vb != NULL )
  59774. 8032786: 2800 cmp r0, #0
  59775. 8032788: d1f9 bne.n 803277e <snmp_varbind_list_free+0x8>
  59776. {
  59777. prev = vb->prev;
  59778. snmp_varbind_free(vb);
  59779. vb = prev;
  59780. }
  59781. root->count = 0;
  59782. 803278a: 7220 strb r0, [r4, #8]
  59783. root->head = NULL;
  59784. 803278c: 6020 str r0, [r4, #0]
  59785. root->tail = NULL;
  59786. 803278e: 6060 str r0, [r4, #4]
  59787. 8032790: bd38 pop {r3, r4, r5, pc}
  59788. 08032792 <snmp_error_response>:
  59789. //snmp_coldstart_trap();
  59790. }
  59791. static void
  59792. snmp_error_response(struct snmp_msg_pstat *msg_ps, u8_t error)
  59793. {
  59794. 8032792: b570 push {r4, r5, r6, lr}
  59795. 8032794: 4604 mov r4, r0
  59796. /* move names back from outvb to invb */
  59797. int v;
  59798. struct snmp_varbind *vbi = msg_ps->invb.head;
  59799. struct snmp_varbind *vbo = msg_ps->outvb.head;
  59800. for (v=0; v<msg_ps->vb_idx; v++) {
  59801. 8032796: 2200 movs r2, #0
  59802. //snmp_coldstart_trap();
  59803. }
  59804. static void
  59805. snmp_error_response(struct snmp_msg_pstat *msg_ps, u8_t error)
  59806. {
  59807. 8032798: 460e mov r6, r1
  59808. /* move names back from outvb to invb */
  59809. int v;
  59810. struct snmp_varbind *vbi = msg_ps->invb.head;
  59811. 803279a: f8d0 0100 ldr.w r0, [r0, #256] ; 0x100
  59812. struct snmp_varbind *vbo = msg_ps->outvb.head;
  59813. 803279e: f8d4 310c ldr.w r3, [r4, #268] ; 0x10c
  59814. for (v=0; v<msg_ps->vb_idx; v++) {
  59815. vbi->ident_len = vbo->ident_len;
  59816. vbo->ident_len = 0;
  59817. 80327a2: 4611 mov r1, r2
  59818. {
  59819. /* move names back from outvb to invb */
  59820. int v;
  59821. struct snmp_varbind *vbi = msg_ps->invb.head;
  59822. struct snmp_varbind *vbo = msg_ps->outvb.head;
  59823. for (v=0; v<msg_ps->vb_idx; v++) {
  59824. 80327a4: e008 b.n 80327b8 <snmp_error_response+0x26>
  59825. vbi->ident_len = vbo->ident_len;
  59826. 80327a6: 7a1d ldrb r5, [r3, #8]
  59827. 80327a8: 7205 strb r5, [r0, #8]
  59828. vbo->ident_len = 0;
  59829. vbi->ident = vbo->ident;
  59830. 80327aa: 68dd ldr r5, [r3, #12]
  59831. int v;
  59832. struct snmp_varbind *vbi = msg_ps->invb.head;
  59833. struct snmp_varbind *vbo = msg_ps->outvb.head;
  59834. for (v=0; v<msg_ps->vb_idx; v++) {
  59835. vbi->ident_len = vbo->ident_len;
  59836. vbo->ident_len = 0;
  59837. 80327ac: 7219 strb r1, [r3, #8]
  59838. vbi->ident = vbo->ident;
  59839. 80327ae: 60c5 str r5, [r0, #12]
  59840. vbo->ident = NULL;
  59841. 80327b0: 60d9 str r1, [r3, #12]
  59842. vbi = vbi->next;
  59843. 80327b2: 6800 ldr r0, [r0, #0]
  59844. vbo = vbo->next;
  59845. 80327b4: 681b ldr r3, [r3, #0]
  59846. {
  59847. /* move names back from outvb to invb */
  59848. int v;
  59849. struct snmp_varbind *vbi = msg_ps->invb.head;
  59850. struct snmp_varbind *vbo = msg_ps->outvb.head;
  59851. for (v=0; v<msg_ps->vb_idx; v++) {
  59852. 80327b6: 3201 adds r2, #1
  59853. 80327b8: f894 50f8 ldrb.w r5, [r4, #248] ; 0xf8
  59854. 80327bc: 42aa cmp r2, r5
  59855. 80327be: dbf2 blt.n 80327a6 <snmp_error_response+0x14>
  59856. vbo->ident = NULL;
  59857. vbi = vbi->next;
  59858. vbo = vbo->next;
  59859. }
  59860. /* free outvb */
  59861. snmp_varbind_list_free(&msg_ps->outvb);
  59862. 80327c0: f504 7586 add.w r5, r4, #268 ; 0x10c
  59863. 80327c4: 4628 mov r0, r5
  59864. 80327c6: f7ff ffd6 bl 8032776 <snmp_varbind_list_free>
  59865. /* we send invb back */
  59866. msg_ps->outvb = msg_ps->invb;
  59867. 80327ca: f504 7380 add.w r3, r4, #256 ; 0x100
  59868. 80327ce: e893 0007 ldmia.w r3, {r0, r1, r2}
  59869. msg_ps->invb.head = NULL;
  59870. 80327d2: 2300 movs r3, #0
  59871. msg_ps->invb.tail = NULL;
  59872. msg_ps->invb.count = 0;
  59873. msg_ps->error_status = error;
  59874. /* error index must be 0 for error too big */
  59875. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  59876. 80327d4: 2e01 cmp r6, #1
  59877. }
  59878. /* free outvb */
  59879. snmp_varbind_list_free(&msg_ps->outvb);
  59880. /* we send invb back */
  59881. msg_ps->outvb = msg_ps->invb;
  59882. msg_ps->invb.head = NULL;
  59883. 80327d6: f8c4 3100 str.w r3, [r4, #256] ; 0x100
  59884. msg_ps->invb.tail = NULL;
  59885. 80327da: f8c4 3104 str.w r3, [r4, #260] ; 0x104
  59886. msg_ps->invb.count = 0;
  59887. 80327de: f884 3108 strb.w r3, [r4, #264] ; 0x108
  59888. msg_ps->error_status = error;
  59889. /* error index must be 0 for error too big */
  59890. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  59891. 80327e2: bf18 it ne
  59892. 80327e4: f894 30f8 ldrbne.w r3, [r4, #248] ; 0xf8
  59893. /* we send invb back */
  59894. msg_ps->outvb = msg_ps->invb;
  59895. msg_ps->invb.head = NULL;
  59896. msg_ps->invb.tail = NULL;
  59897. msg_ps->invb.count = 0;
  59898. msg_ps->error_status = error;
  59899. 80327e8: 6126 str r6, [r4, #16]
  59900. /* error index must be 0 for error too big */
  59901. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  59902. 80327ea: bf18 it ne
  59903. 80327ec: 3301 addne r3, #1
  59904. vbo = vbo->next;
  59905. }
  59906. /* free outvb */
  59907. snmp_varbind_list_free(&msg_ps->outvb);
  59908. /* we send invb back */
  59909. msg_ps->outvb = msg_ps->invb;
  59910. 80327ee: e885 0007 stmia.w r5, {r0, r1, r2}
  59911. msg_ps->invb.head = NULL;
  59912. msg_ps->invb.tail = NULL;
  59913. msg_ps->invb.count = 0;
  59914. msg_ps->error_status = error;
  59915. /* error index must be 0 for error too big */
  59916. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  59917. 80327f2: 6163 str r3, [r4, #20]
  59918. snmp_send_response(msg_ps);
  59919. 80327f4: 4620 mov r0, r4
  59920. 80327f6: f001 f873 bl 80338e0 <snmp_send_response>
  59921. snmp_varbind_list_free(&msg_ps->outvb);
  59922. 80327fa: 4628 mov r0, r5
  59923. 80327fc: f7ff ffbb bl 8032776 <snmp_varbind_list_free>
  59924. msg_ps->state = SNMP_MSG_EMPTY;
  59925. 8032800: 2300 movs r3, #0
  59926. 8032802: f884 305a strb.w r3, [r4, #90] ; 0x5a
  59927. 8032806: bd70 pop {r4, r5, r6, pc}
  59928. 08032808 <snmp_ok_response>:
  59929. }
  59930. static void
  59931. snmp_ok_response(struct snmp_msg_pstat *msg_ps)
  59932. {
  59933. 8032808: b510 push {r4, lr}
  59934. 803280a: 4604 mov r4, r0
  59935. err_t err_ret;
  59936. err_ret = snmp_send_response(msg_ps);
  59937. 803280c: f001 f868 bl 80338e0 <snmp_send_response>
  59938. else
  59939. {
  59940. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event = %"S32_F"\n",msg_ps->error_status));
  59941. }
  59942. /* free varbinds (if available) */
  59943. snmp_varbind_list_free(&msg_ps->invb);
  59944. 8032810: f504 7080 add.w r0, r4, #256 ; 0x100
  59945. 8032814: f7ff ffaf bl 8032776 <snmp_varbind_list_free>
  59946. snmp_varbind_list_free(&msg_ps->outvb);
  59947. 8032818: f504 7086 add.w r0, r4, #268 ; 0x10c
  59948. 803281c: f7ff ffab bl 8032776 <snmp_varbind_list_free>
  59949. msg_ps->state = SNMP_MSG_EMPTY;
  59950. 8032820: 2300 movs r3, #0
  59951. 8032822: f884 305a strb.w r3, [r4, #90] ; 0x5a
  59952. 8032826: bd10 pop {r4, pc}
  59953. 08032828 <snmp_varbind_tail_add>:
  59954. }
  59955. void
  59956. snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb)
  59957. {
  59958. if (root->count == 0)
  59959. 8032828: 7a03 ldrb r3, [r0, #8]
  59960. 803282a: b90b cbnz r3, 8032830 <snmp_varbind_tail_add+0x8>
  59961. {
  59962. /* add first varbind to list */
  59963. root->head = vb;
  59964. 803282c: 6001 str r1, [r0, #0]
  59965. 803282e: e002 b.n 8032836 <snmp_varbind_tail_add+0xe>
  59966. root->tail = vb;
  59967. }
  59968. else
  59969. {
  59970. /* add nth varbind to list tail */
  59971. root->tail->next = vb;
  59972. 8032830: 6843 ldr r3, [r0, #4]
  59973. 8032832: 6019 str r1, [r3, #0]
  59974. vb->prev = root->tail;
  59975. 8032834: 604b str r3, [r1, #4]
  59976. root->tail = vb;
  59977. }
  59978. root->count += 1;
  59979. 8032836: 7a03 ldrb r3, [r0, #8]
  59980. else
  59981. {
  59982. /* add nth varbind to list tail */
  59983. root->tail->next = vb;
  59984. vb->prev = root->tail;
  59985. root->tail = vb;
  59986. 8032838: 6041 str r1, [r0, #4]
  59987. }
  59988. root->count += 1;
  59989. 803283a: 3301 adds r3, #1
  59990. 803283c: 7203 strb r3, [r0, #8]
  59991. 803283e: 4770 bx lr
  59992. 08032840 <snmp_msg_event>:
  59993. *
  59994. * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1)
  59995. */
  59996. void
  59997. snmp_msg_event(u8_t request_id)
  59998. {
  59999. 8032840: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  60000. struct snmp_msg_pstat *msg_ps;
  60001. if (request_id < SNMP_CONCURRENT_REQUESTS)
  60002. 8032844: 4605 mov r5, r0
  60003. *
  60004. * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1)
  60005. */
  60006. void
  60007. snmp_msg_event(u8_t request_id)
  60008. {
  60009. 8032846: b0a7 sub sp, #156 ; 0x9c
  60010. struct snmp_msg_pstat *msg_ps;
  60011. if (request_id < SNMP_CONCURRENT_REQUESTS)
  60012. 8032848: 2800 cmp r0, #0
  60013. 803284a: f040 8390 bne.w 8032f6e <snmp_msg_event+0x72e>
  60014. {
  60015. msg_ps = &msg_input_list[request_id];
  60016. if (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ)
  60017. 803284e: 4cb2 ldr r4, [pc, #712] ; (8032b18 <snmp_msg_event+0x2d8>)
  60018. 8032850: 7aa6 ldrb r6, [r4, #10]
  60019. 8032852: 2e01 cmp r6, #1
  60020. 8032854: f040 80d4 bne.w 8032a00 <snmp_msg_event+0x1c0>
  60021. static void
  60022. snmp_msg_getnext_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
  60023. {
  60024. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
  60025. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  60026. 8032858: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  60027. 803285c: 2b07 cmp r3, #7
  60028. 803285e: d125 bne.n 80328ac <snmp_msg_event+0x6c>
  60029. /* get_object_def() answer*/
  60030. en = msg_ps->ext_mib_node;
  60031. /* translate answer into a known lifeform */
  60032. en->get_object_def_a(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1], &msg_ps->ext_object_def);
  60033. 8032860: f894 2074 ldrb.w r2, [r4, #116] ; 0x74
  60034. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  60035. {
  60036. struct mib_external_node *en;
  60037. /* get_object_def() answer*/
  60038. en = msg_ps->ext_mib_node;
  60039. 8032864: f8d4 805c ldr.w r8, [r4, #92] ; 0x5c
  60040. /* translate answer into a known lifeform */
  60041. en->get_object_def_a(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1], &msg_ps->ext_object_def);
  60042. 8032868: eb04 0282 add.w r2, r4, r2, lsl #2
  60043. 803286c: 4631 mov r1, r6
  60044. 803286e: 3274 adds r2, #116 ; 0x74
  60045. 8032870: f104 0368 add.w r3, r4, #104 ; 0x68
  60046. 8032874: f8d8 7038 ldr.w r7, [r8, #56] ; 0x38
  60047. 8032878: 47b8 blx r7
  60048. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  60049. 803287a: f894 0068 ldrb.w r0, [r4, #104] ; 0x68
  60050. 803287e: b148 cbz r0, 8032894 <snmp_msg_event+0x54>
  60051. {
  60052. msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE;
  60053. 8032880: 2308 movs r3, #8
  60054. 8032882: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60055. en->get_value_q(request_id, &msg_ps->ext_object_def);
  60056. 8032886: f8d8 302c ldr.w r3, [r8, #44] ; 0x2c
  60057. 803288a: 4628 mov r0, r5
  60058. 803288c: f104 0168 add.w r1, r4, #104 ; 0x68
  60059. 8032890: 4798 blx r3
  60060. 8032892: e0a6 b.n 80329e2 <snmp_msg_event+0x1a2>
  60061. }
  60062. else
  60063. {
  60064. en->get_object_def_pc(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1]);
  60065. 8032894: f894 2074 ldrb.w r2, [r4, #116] ; 0x74
  60066. 8032898: f8d8 3048 ldr.w r3, [r8, #72] ; 0x48
  60067. 803289c: eb04 0282 add.w r2, r4, r2, lsl #2
  60068. 80328a0: 4631 mov r1, r6
  60069. 80328a2: 3274 adds r2, #116 ; 0x74
  60070. 80328a4: 4798 blx r3
  60071. /* search failed, object id points to unknown object (nosuchname) */
  60072. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  60073. 80328a6: 4620 mov r0, r4
  60074. 80328a8: 2102 movs r1, #2
  60075. 80328aa: e02a b.n 8032902 <snmp_msg_event+0xc2>
  60076. }
  60077. }
  60078. else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE)
  60079. 80328ac: 2b08 cmp r3, #8
  60080. 80328ae: f040 8098 bne.w 80329e2 <snmp_msg_event+0x1a2>
  60081. /* get_value() answer */
  60082. en = msg_ps->ext_mib_node;
  60083. LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff);
  60084. vb = snmp_varbind_alloc(&msg_ps->ext_oid,
  60085. 80328b2: f104 0074 add.w r0, r4, #116 ; 0x74
  60086. 80328b6: f894 106a ldrb.w r1, [r4, #106] ; 0x6a
  60087. 80328ba: f894 206c ldrb.w r2, [r4, #108] ; 0x6c
  60088. {
  60089. struct mib_external_node *en;
  60090. struct snmp_varbind *vb;
  60091. /* get_value() answer */
  60092. en = msg_ps->ext_mib_node;
  60093. 80328be: f8d4 805c ldr.w r8, [r4, #92] ; 0x5c
  60094. LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff);
  60095. vb = snmp_varbind_alloc(&msg_ps->ext_oid,
  60096. 80328c2: f7ff ff05 bl 80326d0 <snmp_varbind_alloc>
  60097. msg_ps->ext_object_def.asn_type,
  60098. (u8_t)msg_ps->ext_object_def.v_len);
  60099. if (vb != NULL)
  60100. 80328c6: 4607 mov r7, r0
  60101. 80328c8: b1a0 cbz r0, 80328f4 <snmp_msg_event+0xb4>
  60102. {
  60103. en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
  60104. 80328ca: 697b ldr r3, [r7, #20]
  60105. 80328cc: f8d8 c03c ldr.w ip, [r8, #60] ; 0x3c
  60106. 80328d0: 7c7a ldrb r2, [r7, #17]
  60107. 80328d2: 4628 mov r0, r5
  60108. 80328d4: f104 0168 add.w r1, r4, #104 ; 0x68
  60109. 80328d8: 47e0 blx ip
  60110. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  60111. 80328da: f504 7086 add.w r0, r4, #268 ; 0x10c
  60112. 80328de: 4639 mov r1, r7
  60113. 80328e0: f7ff ffa2 bl 8032828 <snmp_varbind_tail_add>
  60114. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  60115. msg_ps->vb_idx += 1;
  60116. 80328e4: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  60117. (u8_t)msg_ps->ext_object_def.v_len);
  60118. if (vb != NULL)
  60119. {
  60120. en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
  60121. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  60122. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  60123. 80328e8: f884 605a strb.w r6, [r4, #90] ; 0x5a
  60124. msg_ps->vb_idx += 1;
  60125. 80328ec: 3301 adds r3, #1
  60126. 80328ee: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  60127. 80328f2: e076 b.n 80329e2 <snmp_msg_event+0x1a2>
  60128. }
  60129. else
  60130. {
  60131. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  60132. 80328f4: f104 0168 add.w r1, r4, #104 ; 0x68
  60133. 80328f8: f8d8 304c ldr.w r3, [r8, #76] ; 0x4c
  60134. 80328fc: 4798 blx r3
  60135. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n"));
  60136. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  60137. 80328fe: 4620 mov r0, r4
  60138. 8032900: 4631 mov r1, r6
  60139. 8032902: f7ff ff46 bl 8032792 <snmp_error_response>
  60140. 8032906: e06c b.n 80329e2 <snmp_msg_event+0x1a2>
  60141. (msg_ps->vb_idx < msg_ps->invb.count))
  60142. {
  60143. struct mib_node *mn;
  60144. struct snmp_obj_id oid;
  60145. if (msg_ps->vb_idx == 0)
  60146. 8032908: b913 cbnz r3, 8032910 <snmp_msg_event+0xd0>
  60147. {
  60148. msg_ps->vb_ptr = msg_ps->invb.head;
  60149. 803290a: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  60150. 803290e: e002 b.n 8032916 <snmp_msg_event+0xd6>
  60151. }
  60152. else
  60153. {
  60154. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  60155. 8032910: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60156. 8032914: 681b ldr r3, [r3, #0]
  60157. 8032916: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  60158. }
  60159. if (snmp_iso_prefix_expand(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident, &oid))
  60160. 803291a: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60161. 803291e: aa05 add r2, sp, #20
  60162. 8032920: 7a18 ldrb r0, [r3, #8]
  60163. 8032922: 68d9 ldr r1, [r3, #12]
  60164. 8032924: f7ff fe82 bl 803262c <snmp_iso_prefix_expand>
  60165. 8032928: 2800 cmp r0, #0
  60166. 803292a: f000 82ff beq.w 8032f2c <snmp_msg_event+0x6ec>
  60167. {
  60168. if (msg_ps->vb_ptr->ident_len > 3)
  60169. 803292e: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60170. 8032932: 7a19 ldrb r1, [r3, #8]
  60171. 8032934: 2903 cmp r1, #3
  60172. 8032936: d905 bls.n 8032944 <snmp_msg_event+0x104>
  60173. {
  60174. /* can offset ident_len and ident */
  60175. mn = snmp_expand_tree((struct mib_node*)&internet,
  60176. 8032938: 68da ldr r2, [r3, #12]
  60177. 803293a: 4878 ldr r0, [pc, #480] ; (8032b1c <snmp_msg_event+0x2dc>)
  60178. 803293c: 3904 subs r1, #4
  60179. 803293e: b2c9 uxtb r1, r1
  60180. 8032940: 3210 adds r2, #16
  60181. 8032942: e002 b.n 803294a <snmp_msg_event+0x10a>
  60182. msg_ps->vb_ptr->ident + 4, &oid);
  60183. }
  60184. else
  60185. {
  60186. /* can't offset ident_len -4, ident + 4 */
  60187. mn = snmp_expand_tree((struct mib_node*)&internet, 0, NULL, &oid);
  60188. 8032944: 2100 movs r1, #0
  60189. 8032946: 4875 ldr r0, [pc, #468] ; (8032b1c <snmp_msg_event+0x2dc>)
  60190. 8032948: 460a mov r2, r1
  60191. 803294a: ab05 add r3, sp, #20
  60192. 803294c: f7ff fc8e bl 803226c <snmp_expand_tree>
  60193. 8032950: 4605 mov r5, r0
  60194. }
  60195. else
  60196. {
  60197. mn = NULL;
  60198. }
  60199. if (mn != NULL)
  60200. 8032952: 2800 cmp r0, #0
  60201. 8032954: f000 82ea beq.w 8032f2c <snmp_msg_event+0x6ec>
  60202. {
  60203. if (mn->node_type == MIB_NODE_EX)
  60204. 8032958: 7c03 ldrb r3, [r0, #16]
  60205. 803295a: 2b05 cmp r3, #5
  60206. 803295c: d113 bne.n 8032986 <snmp_msg_event+0x146>
  60207. {
  60208. /* external object */
  60209. struct mib_external_node *en = (struct mib_external_node*)mn;
  60210. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  60211. 803295e: 2307 movs r3, #7
  60212. /* save en && args in msg_ps!! */
  60213. msg_ps->ext_mib_node = en;
  60214. 8032960: 65e0 str r0, [r4, #92] ; 0x5c
  60215. msg_ps->ext_oid = oid;
  60216. 8032962: a905 add r1, sp, #20
  60217. 8032964: 2284 movs r2, #132 ; 0x84
  60218. 8032966: 486e ldr r0, [pc, #440] ; (8032b20 <snmp_msg_event+0x2e0>)
  60219. if (mn->node_type == MIB_NODE_EX)
  60220. {
  60221. /* external object */
  60222. struct mib_external_node *en = (struct mib_external_node*)mn;
  60223. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  60224. 8032968: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60225. /* save en && args in msg_ps!! */
  60226. msg_ps->ext_mib_node = en;
  60227. msg_ps->ext_oid = oid;
  60228. 803296c: f7ee ffee bl 802194c <memcpy>
  60229. en->get_object_def_q(en->addr_inf, request_id, 1, &oid.id[oid.len - 1]);
  60230. 8032970: f89d 3014 ldrb.w r3, [sp, #20]
  60231. 8032974: 6aae ldr r6, [r5, #40] ; 0x28
  60232. 8032976: 6968 ldr r0, [r5, #20]
  60233. 8032978: ad05 add r5, sp, #20
  60234. 803297a: 2100 movs r1, #0
  60235. 803297c: 2201 movs r2, #1
  60236. 803297e: eb05 0383 add.w r3, r5, r3, lsl #2
  60237. 8032982: 47b0 blx r6
  60238. 8032984: e02e b.n 80329e4 <snmp_msg_event+0x1a4>
  60239. {
  60240. /* internal object */
  60241. struct obj_def object_def;
  60242. struct snmp_varbind *vb;
  60243. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  60244. 8032986: 2302 movs r3, #2
  60245. mn->get_object_def(1, &oid.id[oid.len - 1], &object_def);
  60246. 8032988: f89d 1014 ldrb.w r1, [sp, #20]
  60247. {
  60248. /* internal object */
  60249. struct obj_def object_def;
  60250. struct snmp_varbind *vb;
  60251. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  60252. 803298c: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60253. mn->get_object_def(1, &oid.id[oid.len - 1], &object_def);
  60254. 8032990: af05 add r7, sp, #20
  60255. 8032992: 6803 ldr r3, [r0, #0]
  60256. 8032994: eb07 0181 add.w r1, r7, r1, lsl #2
  60257. 8032998: 2001 movs r0, #1
  60258. 803299a: aa02 add r2, sp, #8
  60259. 803299c: 4798 blx r3
  60260. LWIP_ASSERT("invalid length", object_def.v_len <= 0xff);
  60261. vb = snmp_varbind_alloc(&oid, object_def.asn_type, (u8_t)object_def.v_len);
  60262. 803299e: a805 add r0, sp, #20
  60263. 80329a0: f89d 100a ldrb.w r1, [sp, #10]
  60264. 80329a4: f89d 200c ldrb.w r2, [sp, #12]
  60265. 80329a8: f7ff fe92 bl 80326d0 <snmp_varbind_alloc>
  60266. if (vb != NULL)
  60267. 80329ac: 4606 mov r6, r0
  60268. 80329ae: b1a8 cbz r0, 80329dc <snmp_msg_event+0x19c>
  60269. {
  60270. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  60271. 80329b0: 2303 movs r3, #3
  60272. 80329b2: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60273. mn->get_value(&object_def, object_def.v_len, vb->value);
  60274. 80329b6: 686b ldr r3, [r5, #4]
  60275. 80329b8: f8bd 100c ldrh.w r1, [sp, #12]
  60276. 80329bc: 6972 ldr r2, [r6, #20]
  60277. 80329be: a802 add r0, sp, #8
  60278. 80329c0: 4798 blx r3
  60279. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  60280. 80329c2: 4858 ldr r0, [pc, #352] ; (8032b24 <snmp_msg_event+0x2e4>)
  60281. 80329c4: 4631 mov r1, r6
  60282. 80329c6: f7ff ff2f bl 8032828 <snmp_varbind_tail_add>
  60283. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  60284. 80329ca: 2301 movs r3, #1
  60285. 80329cc: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60286. msg_ps->vb_idx += 1;
  60287. 80329d0: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  60288. 80329d4: 3301 adds r3, #1
  60289. 80329d6: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  60290. 80329da: e003 b.n 80329e4 <snmp_msg_event+0x1a4>
  60291. }
  60292. else
  60293. {
  60294. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv couldn't allocate outvb space\n"));
  60295. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  60296. 80329dc: 484e ldr r0, [pc, #312] ; (8032b18 <snmp_msg_event+0x2d8>)
  60297. 80329de: 2101 movs r1, #1
  60298. 80329e0: e2a6 b.n 8032f30 <snmp_msg_event+0x6f0>
  60299. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n"));
  60300. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  60301. }
  60302. }
  60303. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  60304. 80329e2: 4c4d ldr r4, [pc, #308] ; (8032b18 <snmp_msg_event+0x2d8>)
  60305. 80329e4: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  60306. 80329e8: 2b01 cmp r3, #1
  60307. 80329ea: f040 82c0 bne.w 8032f6e <snmp_msg_event+0x72e>
  60308. (msg_ps->vb_idx < msg_ps->invb.count))
  60309. 80329ee: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  60310. 80329f2: f894 2108 ldrb.w r2, [r4, #264] ; 0x108
  60311. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n"));
  60312. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  60313. }
  60314. }
  60315. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  60316. 80329f6: 4293 cmp r3, r2
  60317. 80329f8: d386 bcc.n 8032908 <snmp_msg_event+0xc8>
  60318. 80329fa: e2a7 b.n 8032f4c <snmp_msg_event+0x70c>
  60319. }
  60320. }
  60321. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  60322. (msg_ps->vb_idx == msg_ps->invb.count))
  60323. {
  60324. snmp_ok_response(msg_ps);
  60325. 80329fc: 4846 ldr r0, [pc, #280] ; (8032b18 <snmp_msg_event+0x2d8>)
  60326. 80329fe: e292 b.n 8032f26 <snmp_msg_event+0x6e6>
  60327. msg_ps = &msg_input_list[request_id];
  60328. if (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ)
  60329. {
  60330. snmp_msg_getnext_event(request_id, msg_ps);
  60331. }
  60332. else if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
  60333. 8032a00: 2e00 cmp r6, #0
  60334. 8032a02: f040 8126 bne.w 8032c52 <snmp_msg_event+0x412>
  60335. static void
  60336. snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
  60337. {
  60338. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_get_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
  60339. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  60340. 8032a06: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  60341. 8032a0a: 2b07 cmp r3, #7
  60342. 8032a0c: d122 bne.n 8032a54 <snmp_msg_event+0x214>
  60343. {
  60344. struct mib_external_node *en;
  60345. struct snmp_name_ptr np;
  60346. /* get_object_def() answer*/
  60347. en = msg_ps->ext_mib_node;
  60348. 8032a0e: 6de5 ldr r5, [r4, #92] ; 0x5c
  60349. np = msg_ps->ext_name_ptr;
  60350. 8032a10: f894 9060 ldrb.w r9, [r4, #96] ; 0x60
  60351. 8032a14: f8d4 8064 ldr.w r8, [r4, #100] ; 0x64
  60352. /* translate answer into a known lifeform */
  60353. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  60354. 8032a18: 6baf ldr r7, [r5, #56] ; 0x38
  60355. 8032a1a: f104 0368 add.w r3, r4, #104 ; 0x68
  60356. 8032a1e: 4649 mov r1, r9
  60357. 8032a20: 4642 mov r2, r8
  60358. 8032a22: 47b8 blx r7
  60359. if ((msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) &&
  60360. 8032a24: f894 3068 ldrb.w r3, [r4, #104] ; 0x68
  60361. 8032a28: b163 cbz r3, 8032a44 <snmp_msg_event+0x204>
  60362. (msg_ps->ext_object_def.access & MIB_ACCESS_READ))
  60363. 8032a2a: f894 3069 ldrb.w r3, [r4, #105] ; 0x69
  60364. en = msg_ps->ext_mib_node;
  60365. np = msg_ps->ext_name_ptr;
  60366. /* translate answer into a known lifeform */
  60367. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  60368. if ((msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) &&
  60369. 8032a2e: 07da lsls r2, r3, #31
  60370. 8032a30: d508 bpl.n 8032a44 <snmp_msg_event+0x204>
  60371. (msg_ps->ext_object_def.access & MIB_ACCESS_READ))
  60372. {
  60373. msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE;
  60374. 8032a32: 2308 movs r3, #8
  60375. 8032a34: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60376. en->get_value_q(request_id, &msg_ps->ext_object_def);
  60377. 8032a38: 6aeb ldr r3, [r5, #44] ; 0x2c
  60378. 8032a3a: 4630 mov r0, r6
  60379. 8032a3c: f104 0168 add.w r1, r4, #104 ; 0x68
  60380. 8032a40: 4798 blx r3
  60381. 8032a42: e0f7 b.n 8032c34 <snmp_msg_event+0x3f4>
  60382. }
  60383. else
  60384. {
  60385. en->get_object_def_pc(request_id, np.ident_len, np.ident);
  60386. 8032a44: 2000 movs r0, #0
  60387. 8032a46: 4649 mov r1, r9
  60388. 8032a48: 6cab ldr r3, [r5, #72] ; 0x48
  60389. 8032a4a: 4642 mov r2, r8
  60390. 8032a4c: 4798 blx r3
  60391. /* search failed, object id points to unknown object (nosuchname) */
  60392. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  60393. 8032a4e: 4832 ldr r0, [pc, #200] ; (8032b18 <snmp_msg_event+0x2d8>)
  60394. 8032a50: 2102 movs r1, #2
  60395. 8032a52: e059 b.n 8032b08 <snmp_msg_event+0x2c8>
  60396. }
  60397. }
  60398. else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE)
  60399. 8032a54: 2b08 cmp r3, #8
  60400. 8032a56: f040 80ed bne.w 8032c34 <snmp_msg_event+0x3f4>
  60401. /* get_value() answer */
  60402. en = msg_ps->ext_mib_node;
  60403. /* allocate output varbind */
  60404. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  60405. 8032a5a: 200c movs r0, #12
  60406. {
  60407. struct mib_external_node *en;
  60408. struct snmp_varbind *vb;
  60409. /* get_value() answer */
  60410. en = msg_ps->ext_mib_node;
  60411. 8032a5c: f8d4 805c ldr.w r8, [r4, #92] ; 0x5c
  60412. /* allocate output varbind */
  60413. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  60414. 8032a60: f7fa f9c6 bl 802cdf0 <memp_malloc>
  60415. if (vb != NULL)
  60416. 8032a64: 4605 mov r5, r0
  60417. 8032a66: 2800 cmp r0, #0
  60418. 8032a68: d047 beq.n 8032afa <snmp_msg_event+0x2ba>
  60419. {
  60420. vb->next = NULL;
  60421. 8032a6a: 6006 str r6, [r0, #0]
  60422. vb->prev = NULL;
  60423. 8032a6c: 6046 str r6, [r0, #4]
  60424. /* move name from invb to outvb */
  60425. vb->ident = msg_ps->vb_ptr->ident;
  60426. 8032a6e: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60427. 8032a72: 68da ldr r2, [r3, #12]
  60428. vb->ident_len = msg_ps->vb_ptr->ident_len;
  60429. 8032a74: 7a1b ldrb r3, [r3, #8]
  60430. {
  60431. vb->next = NULL;
  60432. vb->prev = NULL;
  60433. /* move name from invb to outvb */
  60434. vb->ident = msg_ps->vb_ptr->ident;
  60435. 8032a76: 60c2 str r2, [r0, #12]
  60436. vb->ident_len = msg_ps->vb_ptr->ident_len;
  60437. 8032a78: 7203 strb r3, [r0, #8]
  60438. /* ensure this memory is refereced once only */
  60439. msg_ps->vb_ptr->ident = NULL;
  60440. 8032a7a: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60441. msg_ps->vb_ptr->ident_len = 0;
  60442. 8032a7e: 721e strb r6, [r3, #8]
  60443. /* move name from invb to outvb */
  60444. vb->ident = msg_ps->vb_ptr->ident;
  60445. vb->ident_len = msg_ps->vb_ptr->ident_len;
  60446. /* ensure this memory is refereced once only */
  60447. msg_ps->vb_ptr->ident = NULL;
  60448. 8032a80: 60de str r6, [r3, #12]
  60449. msg_ps->vb_ptr->ident_len = 0;
  60450. vb->value_type = msg_ps->ext_object_def.asn_type;
  60451. 8032a82: f894 306a ldrb.w r3, [r4, #106] ; 0x6a
  60452. 8032a86: 7403 strb r3, [r0, #16]
  60453. LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff);
  60454. vb->value_len = (u8_t)msg_ps->ext_object_def.v_len;
  60455. 8032a88: f894 706c ldrb.w r7, [r4, #108] ; 0x6c
  60456. 8032a8c: 7447 strb r7, [r0, #17]
  60457. if (vb->value_len > 0)
  60458. 8032a8e: b1ef cbz r7, 8032acc <snmp_msg_event+0x28c>
  60459. {
  60460. LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE);
  60461. vb->value = memp_malloc(MEMP_SNMP_VALUE);
  60462. 8032a90: 200d movs r0, #13
  60463. 8032a92: f7fa f9ad bl 802cdf0 <memp_malloc>
  60464. 8032a96: 4603 mov r3, r0
  60465. 8032a98: 6168 str r0, [r5, #20]
  60466. if (vb->value != NULL)
  60467. 8032a9a: b138 cbz r0, 8032aac <snmp_msg_event+0x26c>
  60468. {
  60469. en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
  60470. 8032a9c: f8d8 703c ldr.w r7, [r8, #60] ; 0x3c
  60471. 8032aa0: 7c6a ldrb r2, [r5, #17]
  60472. 8032aa2: 4630 mov r0, r6
  60473. 8032aa4: f104 0168 add.w r1, r4, #104 ; 0x68
  60474. 8032aa8: 47b8 blx r7
  60475. 8032aaa: e018 b.n 8032ade <snmp_msg_event+0x29e>
  60476. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  60477. msg_ps->vb_idx += 1;
  60478. }
  60479. else
  60480. {
  60481. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  60482. 8032aac: f8d8 304c ldr.w r3, [r8, #76] ; 0x4c
  60483. 8032ab0: f104 0168 add.w r1, r4, #104 ; 0x68
  60484. 8032ab4: 4798 blx r3
  60485. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no variable space\n"));
  60486. msg_ps->vb_ptr->ident = vb->ident;
  60487. 8032ab6: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60488. 8032aba: 68ea ldr r2, [r5, #12]
  60489. 8032abc: 60da str r2, [r3, #12]
  60490. msg_ps->vb_ptr->ident_len = vb->ident_len;
  60491. 8032abe: 7a2a ldrb r2, [r5, #8]
  60492. memp_free(MEMP_SNMP_VARBIND, vb);
  60493. 8032ac0: 200c movs r0, #12
  60494. else
  60495. {
  60496. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  60497. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no variable space\n"));
  60498. msg_ps->vb_ptr->ident = vb->ident;
  60499. msg_ps->vb_ptr->ident_len = vb->ident_len;
  60500. 8032ac2: 721a strb r2, [r3, #8]
  60501. memp_free(MEMP_SNMP_VARBIND, vb);
  60502. 8032ac4: 4629 mov r1, r5
  60503. 8032ac6: f7fa f9a9 bl 802ce1c <memp_free>
  60504. 8032aca: e01b b.n 8032b04 <snmp_msg_event+0x2c4>
  60505. }
  60506. }
  60507. else
  60508. {
  60509. /* vb->value_len == 0, empty value (e.g. empty string) */
  60510. en->get_value_a(request_id, &msg_ps->ext_object_def, 0, NULL);
  60511. 8032acc: f8d8 603c ldr.w r6, [r8, #60] ; 0x3c
  60512. 8032ad0: 4638 mov r0, r7
  60513. 8032ad2: f104 0168 add.w r1, r4, #104 ; 0x68
  60514. 8032ad6: 463a mov r2, r7
  60515. 8032ad8: 463b mov r3, r7
  60516. 8032ada: 47b0 blx r6
  60517. vb->value = NULL;
  60518. 8032adc: 616f str r7, [r5, #20]
  60519. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  60520. 8032ade: f504 7086 add.w r0, r4, #268 ; 0x10c
  60521. 8032ae2: 4629 mov r1, r5
  60522. 8032ae4: f7ff fea0 bl 8032828 <snmp_varbind_tail_add>
  60523. /* search again (if vb_idx < msg_ps->invb.count) */
  60524. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  60525. 8032ae8: 2301 movs r3, #1
  60526. 8032aea: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60527. msg_ps->vb_idx += 1;
  60528. 8032aee: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  60529. 8032af2: 3301 adds r3, #1
  60530. 8032af4: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  60531. 8032af8: e09c b.n 8032c34 <snmp_msg_event+0x3f4>
  60532. }
  60533. }
  60534. else
  60535. {
  60536. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  60537. 8032afa: f8d8 304c ldr.w r3, [r8, #76] ; 0x4c
  60538. 8032afe: f104 0168 add.w r1, r4, #104 ; 0x68
  60539. 8032b02: 4798 blx r3
  60540. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  60541. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  60542. 8032b04: 4620 mov r0, r4
  60543. 8032b06: 2101 movs r1, #1
  60544. 8032b08: f7ff fe43 bl 8032792 <snmp_error_response>
  60545. 8032b0c: e092 b.n 8032c34 <snmp_msg_event+0x3f4>
  60546. (msg_ps->vb_idx < msg_ps->invb.count))
  60547. {
  60548. struct mib_node *mn;
  60549. struct snmp_name_ptr np;
  60550. if (msg_ps->vb_idx == 0)
  60551. 8032b0e: b95b cbnz r3, 8032b28 <snmp_msg_event+0x2e8>
  60552. {
  60553. msg_ps->vb_ptr = msg_ps->invb.head;
  60554. 8032b10: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  60555. 8032b14: e00b b.n 8032b2e <snmp_msg_event+0x2ee>
  60556. 8032b16: bf00 nop
  60557. 8032b18: 20011010 .word 0x20011010
  60558. 8032b1c: 080406b4 .word 0x080406b4
  60559. 8032b20: 20011084 .word 0x20011084
  60560. 8032b24: 2001111c .word 0x2001111c
  60561. }
  60562. else
  60563. {
  60564. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  60565. 8032b28: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60566. 8032b2c: 681b ldr r3, [r3, #0]
  60567. 8032b2e: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  60568. }
  60569. /** test object identifier for .iso.org.dod.internet prefix */
  60570. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  60571. 8032b32: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60572. 8032b36: 7a18 ldrb r0, [r3, #8]
  60573. 8032b38: 68d9 ldr r1, [r3, #12]
  60574. 8032b3a: f7ff fd65 bl 8032608 <snmp_iso_prefix_tst>
  60575. 8032b3e: 2800 cmp r0, #0
  60576. 8032b40: d073 beq.n 8032c2a <snmp_msg_event+0x3ea>
  60577. {
  60578. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  60579. 8032b42: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60580. 8032b46: 48a6 ldr r0, [pc, #664] ; (8032de0 <snmp_msg_event+0x5a0>)
  60581. 8032b48: 7a19 ldrb r1, [r3, #8]
  60582. 8032b4a: 68da ldr r2, [r3, #12]
  60583. 8032b4c: 3904 subs r1, #4
  60584. 8032b4e: b2c9 uxtb r1, r1
  60585. 8032b50: 3210 adds r2, #16
  60586. 8032b52: 466b mov r3, sp
  60587. 8032b54: f7ff fb0a bl 803216c <snmp_search_tree>
  60588. msg_ps->vb_ptr->ident + 4, &np);
  60589. if (mn != NULL)
  60590. 8032b58: 4606 mov r6, r0
  60591. 8032b5a: 2800 cmp r0, #0
  60592. 8032b5c: d065 beq.n 8032c2a <snmp_msg_event+0x3ea>
  60593. {
  60594. if (mn->node_type == MIB_NODE_EX)
  60595. 8032b5e: 7c03 ldrb r3, [r0, #16]
  60596. 8032b60: 2b05 cmp r3, #5
  60597. 8032b62: d110 bne.n 8032b86 <snmp_msg_event+0x346>
  60598. /* external object */
  60599. struct mib_external_node *en = (struct mib_external_node*)mn;
  60600. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  60601. /* save en && args in msg_ps!! */
  60602. msg_ps->ext_mib_node = en;
  60603. 8032b64: 65e0 str r0, [r4, #92] ; 0x5c
  60604. if (mn->node_type == MIB_NODE_EX)
  60605. {
  60606. /* external object */
  60607. struct mib_external_node *en = (struct mib_external_node*)mn;
  60608. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  60609. 8032b66: 2307 movs r3, #7
  60610. /* save en && args in msg_ps!! */
  60611. msg_ps->ext_mib_node = en;
  60612. msg_ps->ext_name_ptr = np;
  60613. 8032b68: e898 0003 ldmia.w r8, {r0, r1}
  60614. if (mn->node_type == MIB_NODE_EX)
  60615. {
  60616. /* external object */
  60617. struct mib_external_node *en = (struct mib_external_node*)mn;
  60618. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  60619. 8032b6c: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60620. /* save en && args in msg_ps!! */
  60621. msg_ps->ext_mib_node = en;
  60622. msg_ps->ext_name_ptr = np;
  60623. 8032b70: 4b9c ldr r3, [pc, #624] ; (8032de4 <snmp_msg_event+0x5a4>)
  60624. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  60625. 8032b72: f89d 2000 ldrb.w r2, [sp]
  60626. struct mib_external_node *en = (struct mib_external_node*)mn;
  60627. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  60628. /* save en && args in msg_ps!! */
  60629. msg_ps->ext_mib_node = en;
  60630. msg_ps->ext_name_ptr = np;
  60631. 8032b76: e883 0003 stmia.w r3, {r0, r1}
  60632. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  60633. 8032b7a: 2100 movs r1, #0
  60634. 8032b7c: 6ab5 ldr r5, [r6, #40] ; 0x28
  60635. 8032b7e: 6970 ldr r0, [r6, #20]
  60636. 8032b80: 9b01 ldr r3, [sp, #4]
  60637. 8032b82: 47a8 blx r5
  60638. 8032b84: e058 b.n 8032c38 <snmp_msg_event+0x3f8>
  60639. else
  60640. {
  60641. /* internal object */
  60642. struct obj_def object_def;
  60643. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  60644. 8032b86: 2302 movs r3, #2
  60645. 8032b88: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60646. mn->get_object_def(np.ident_len, np.ident, &object_def);
  60647. 8032b8c: 6803 ldr r3, [r0, #0]
  60648. 8032b8e: 9901 ldr r1, [sp, #4]
  60649. 8032b90: f89d 0000 ldrb.w r0, [sp]
  60650. 8032b94: aa02 add r2, sp, #8
  60651. 8032b96: 4798 blx r3
  60652. if ((object_def.instance != MIB_OBJECT_NONE) &&
  60653. 8032b98: f89d 3008 ldrb.w r3, [sp, #8]
  60654. 8032b9c: 2b00 cmp r3, #0
  60655. 8032b9e: d044 beq.n 8032c2a <snmp_msg_event+0x3ea>
  60656. (object_def.access & MIB_ACCESS_READ))
  60657. 8032ba0: f89d 3009 ldrb.w r3, [sp, #9]
  60658. /* internal object */
  60659. struct obj_def object_def;
  60660. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  60661. mn->get_object_def(np.ident_len, np.ident, &object_def);
  60662. if ((object_def.instance != MIB_OBJECT_NONE) &&
  60663. 8032ba4: 07db lsls r3, r3, #31
  60664. 8032ba6: f100 81c6 bmi.w 8032f36 <snmp_msg_event+0x6f6>
  60665. 8032baa: e03e b.n 8032c2a <snmp_msg_event+0x3ea>
  60666. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  60667. /* allocate output varbind */
  60668. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  60669. if (vb != NULL)
  60670. {
  60671. vb->next = NULL;
  60672. 8032bac: 2200 movs r2, #0
  60673. 8032bae: 602a str r2, [r5, #0]
  60674. vb->prev = NULL;
  60675. 8032bb0: 606a str r2, [r5, #4]
  60676. /* move name from invb to outvb */
  60677. vb->ident = msg_ps->vb_ptr->ident;
  60678. 8032bb2: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60679. 8032bb6: 68d9 ldr r1, [r3, #12]
  60680. vb->ident_len = msg_ps->vb_ptr->ident_len;
  60681. 8032bb8: 7a1b ldrb r3, [r3, #8]
  60682. {
  60683. vb->next = NULL;
  60684. vb->prev = NULL;
  60685. /* move name from invb to outvb */
  60686. vb->ident = msg_ps->vb_ptr->ident;
  60687. 8032bba: 60e9 str r1, [r5, #12]
  60688. vb->ident_len = msg_ps->vb_ptr->ident_len;
  60689. 8032bbc: 722b strb r3, [r5, #8]
  60690. /* ensure this memory is refereced once only */
  60691. msg_ps->vb_ptr->ident = NULL;
  60692. 8032bbe: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60693. msg_ps->vb_ptr->ident_len = 0;
  60694. 8032bc2: 721a strb r2, [r3, #8]
  60695. /* move name from invb to outvb */
  60696. vb->ident = msg_ps->vb_ptr->ident;
  60697. vb->ident_len = msg_ps->vb_ptr->ident_len;
  60698. /* ensure this memory is refereced once only */
  60699. msg_ps->vb_ptr->ident = NULL;
  60700. 8032bc4: 60da str r2, [r3, #12]
  60701. msg_ps->vb_ptr->ident_len = 0;
  60702. vb->value_type = object_def.asn_type;
  60703. 8032bc6: f89d 300a ldrb.w r3, [sp, #10]
  60704. 8032bca: 742b strb r3, [r5, #16]
  60705. LWIP_ASSERT("invalid length", object_def.v_len <= 0xff);
  60706. vb->value_len = (u8_t)object_def.v_len;
  60707. 8032bcc: f89d 300c ldrb.w r3, [sp, #12]
  60708. 8032bd0: 746b strb r3, [r5, #17]
  60709. if (vb->value_len > 0)
  60710. 8032bd2: b1bb cbz r3, 8032c04 <snmp_msg_event+0x3c4>
  60711. {
  60712. LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low",
  60713. vb->value_len <= SNMP_MAX_VALUE_SIZE);
  60714. vb->value = memp_malloc(MEMP_SNMP_VALUE);
  60715. 8032bd4: 200d movs r0, #13
  60716. 8032bd6: f7fa f90b bl 802cdf0 <memp_malloc>
  60717. 8032bda: 4602 mov r2, r0
  60718. 8032bdc: 6168 str r0, [r5, #20]
  60719. if (vb->value != NULL)
  60720. 8032bde: b120 cbz r0, 8032bea <snmp_msg_event+0x3aa>
  60721. {
  60722. mn->get_value(&object_def, vb->value_len, vb->value);
  60723. 8032be0: 6877 ldr r7, [r6, #4]
  60724. 8032be2: 7c69 ldrb r1, [r5, #17]
  60725. 8032be4: a802 add r0, sp, #8
  60726. 8032be6: 47b8 blx r7
  60727. 8032be8: e00d b.n 8032c06 <snmp_msg_event+0x3c6>
  60728. msg_ps->vb_idx += 1;
  60729. }
  60730. else
  60731. {
  60732. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate variable space\n"));
  60733. msg_ps->vb_ptr->ident = vb->ident;
  60734. 8032bea: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60735. 8032bee: 68e9 ldr r1, [r5, #12]
  60736. 8032bf0: 60d9 str r1, [r3, #12]
  60737. msg_ps->vb_ptr->ident_len = vb->ident_len;
  60738. 8032bf2: 7a29 ldrb r1, [r5, #8]
  60739. vb->ident = NULL;
  60740. 8032bf4: 60e8 str r0, [r5, #12]
  60741. }
  60742. else
  60743. {
  60744. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate variable space\n"));
  60745. msg_ps->vb_ptr->ident = vb->ident;
  60746. msg_ps->vb_ptr->ident_len = vb->ident_len;
  60747. 8032bf6: 7219 strb r1, [r3, #8]
  60748. vb->ident = NULL;
  60749. vb->ident_len = 0;
  60750. 8032bf8: 7228 strb r0, [r5, #8]
  60751. memp_free(MEMP_SNMP_VARBIND, vb);
  60752. 8032bfa: 4629 mov r1, r5
  60753. 8032bfc: 200c movs r0, #12
  60754. 8032bfe: f7fa f90d bl 802ce1c <memp_free>
  60755. 8032c02: e00d b.n 8032c20 <snmp_msg_event+0x3e0>
  60756. }
  60757. }
  60758. else
  60759. {
  60760. /* vb->value_len == 0, empty value (e.g. empty string) */
  60761. vb->value = NULL;
  60762. 8032c04: 616b str r3, [r5, #20]
  60763. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  60764. 8032c06: 4878 ldr r0, [pc, #480] ; (8032de8 <snmp_msg_event+0x5a8>)
  60765. 8032c08: 4629 mov r1, r5
  60766. 8032c0a: f7ff fe0d bl 8032828 <snmp_varbind_tail_add>
  60767. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  60768. 8032c0e: 2301 movs r3, #1
  60769. 8032c10: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60770. msg_ps->vb_idx += 1;
  60771. 8032c14: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  60772. 8032c18: 3301 adds r3, #1
  60773. 8032c1a: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  60774. 8032c1e: e003 b.n 8032c28 <snmp_msg_event+0x3e8>
  60775. }
  60776. }
  60777. else
  60778. {
  60779. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate outvb space\n"));
  60780. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  60781. 8032c20: 4872 ldr r0, [pc, #456] ; (8032dec <snmp_msg_event+0x5ac>)
  60782. 8032c22: 2101 movs r1, #1
  60783. 8032c24: f7ff fdb5 bl 8032792 <snmp_error_response>
  60784. }
  60785. else
  60786. {
  60787. mn = NULL;
  60788. }
  60789. if (mn == NULL)
  60790. 8032c28: b936 cbnz r6, 8032c38 <snmp_msg_event+0x3f8>
  60791. {
  60792. /* mn == NULL, noSuchName */
  60793. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  60794. 8032c2a: 4870 ldr r0, [pc, #448] ; (8032dec <snmp_msg_event+0x5ac>)
  60795. 8032c2c: 2102 movs r1, #2
  60796. 8032c2e: f7ff fdb0 bl 8032792 <snmp_error_response>
  60797. 8032c32: e001 b.n 8032c38 <snmp_msg_event+0x3f8>
  60798. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  60799. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  60800. }
  60801. }
  60802. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  60803. 8032c34: 4c6d ldr r4, [pc, #436] ; (8032dec <snmp_msg_event+0x5ac>)
  60804. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  60805. }
  60806. /** test object identifier for .iso.org.dod.internet prefix */
  60807. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  60808. {
  60809. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  60810. 8032c36: 46e8 mov r8, sp
  60811. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  60812. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  60813. }
  60814. }
  60815. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  60816. 8032c38: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  60817. 8032c3c: 2b01 cmp r3, #1
  60818. 8032c3e: f040 8196 bne.w 8032f6e <snmp_msg_event+0x72e>
  60819. (msg_ps->vb_idx < msg_ps->invb.count))
  60820. 8032c42: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  60821. 8032c46: f894 2108 ldrb.w r2, [r4, #264] ; 0x108
  60822. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  60823. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  60824. }
  60825. }
  60826. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  60827. 8032c4a: 4293 cmp r3, r2
  60828. 8032c4c: f4ff af5f bcc.w 8032b0e <snmp_msg_event+0x2ce>
  60829. 8032c50: e17c b.n 8032f4c <snmp_msg_event+0x70c>
  60830. }
  60831. else if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
  60832. {
  60833. snmp_msg_get_event(request_id, msg_ps);
  60834. }
  60835. else if(msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
  60836. 8032c52: 2e03 cmp r6, #3
  60837. 8032c54: f040 818b bne.w 8032f6e <snmp_msg_event+0x72e>
  60838. static void
  60839. snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
  60840. {
  60841. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_set_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
  60842. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  60843. 8032c58: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  60844. 8032c5c: 2b07 cmp r3, #7
  60845. 8032c5e: d11b bne.n 8032c98 <snmp_msg_event+0x458>
  60846. {
  60847. struct mib_external_node *en;
  60848. struct snmp_name_ptr np;
  60849. /* get_object_def() answer*/
  60850. en = msg_ps->ext_mib_node;
  60851. 8032c60: 6de6 ldr r6, [r4, #92] ; 0x5c
  60852. np = msg_ps->ext_name_ptr;
  60853. 8032c62: f894 9060 ldrb.w r9, [r4, #96] ; 0x60
  60854. 8032c66: f8d4 8064 ldr.w r8, [r4, #100] ; 0x64
  60855. /* translate answer into a known lifeform */
  60856. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  60857. 8032c6a: 6bb7 ldr r7, [r6, #56] ; 0x38
  60858. 8032c6c: 4649 mov r1, r9
  60859. 8032c6e: 4642 mov r2, r8
  60860. 8032c70: f104 0368 add.w r3, r4, #104 ; 0x68
  60861. 8032c74: 47b8 blx r7
  60862. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  60863. 8032c76: f894 0068 ldrb.w r0, [r4, #104] ; 0x68
  60864. 8032c7a: b140 cbz r0, 8032c8e <snmp_msg_event+0x44e>
  60865. {
  60866. msg_ps->state = SNMP_MSG_EXTERNAL_SET_TEST;
  60867. 8032c7c: 2309 movs r3, #9
  60868. 8032c7e: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60869. en->set_test_q(request_id, &msg_ps->ext_object_def);
  60870. 8032c82: 6b33 ldr r3, [r6, #48] ; 0x30
  60871. 8032c84: 4628 mov r0, r5
  60872. 8032c86: f104 0168 add.w r1, r4, #104 ; 0x68
  60873. 8032c8a: 4798 blx r3
  60874. 8032c8c: e0d5 b.n 8032e3a <snmp_msg_event+0x5fa>
  60875. }
  60876. else
  60877. {
  60878. en->get_object_def_pc(request_id, np.ident_len, np.ident);
  60879. 8032c8e: 6cb3 ldr r3, [r6, #72] ; 0x48
  60880. 8032c90: 4649 mov r1, r9
  60881. 8032c92: 4642 mov r2, r8
  60882. 8032c94: 4798 blx r3
  60883. 8032c96: e023 b.n 8032ce0 <snmp_msg_event+0x4a0>
  60884. /* search failed, object id points to unknown object (nosuchname) */
  60885. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  60886. }
  60887. }
  60888. else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_TEST)
  60889. 8032c98: 2b09 cmp r3, #9
  60890. 8032c9a: d124 bne.n 8032ce6 <snmp_msg_event+0x4a6>
  60891. struct mib_external_node *en;
  60892. /* set_test() answer*/
  60893. en = msg_ps->ext_mib_node;
  60894. if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE)
  60895. 8032c9c: f894 3069 ldrb.w r3, [r4, #105] ; 0x69
  60896. else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_TEST)
  60897. {
  60898. struct mib_external_node *en;
  60899. /* set_test() answer*/
  60900. en = msg_ps->ext_mib_node;
  60901. 8032ca0: 6de5 ldr r5, [r4, #92] ; 0x5c
  60902. if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE)
  60903. 8032ca2: f003 0302 and.w r3, r3, #2
  60904. 8032ca6: b2db uxtb r3, r3
  60905. 8032ca8: b1b3 cbz r3, 8032cd8 <snmp_msg_event+0x498>
  60906. {
  60907. if ((msg_ps->ext_object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  60908. 8032caa: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60909. 8032cae: f894 106a ldrb.w r1, [r4, #106] ; 0x6a
  60910. 8032cb2: 7c1a ldrb r2, [r3, #16]
  60911. 8032cb4: 4291 cmp r1, r2
  60912. 8032cb6: d108 bne.n 8032cca <snmp_msg_event+0x48a>
  60913. (en->set_test_a(request_id,&msg_ps->ext_object_def,
  60914. 8032cb8: 7c5a ldrb r2, [r3, #17]
  60915. 8032cba: 6c2e ldr r6, [r5, #64] ; 0x40
  60916. 8032cbc: 695b ldr r3, [r3, #20]
  60917. 8032cbe: f104 0168 add.w r1, r4, #104 ; 0x68
  60918. 8032cc2: 47b0 blx r6
  60919. /* set_test() answer*/
  60920. en = msg_ps->ext_mib_node;
  60921. if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE)
  60922. {
  60923. if ((msg_ps->ext_object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  60924. 8032cc4: b108 cbz r0, 8032cca <snmp_msg_event+0x48a>
  60925. (en->set_test_a(request_id,&msg_ps->ext_object_def,
  60926. msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
  60927. {
  60928. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  60929. 8032cc6: 2301 movs r3, #1
  60930. 8032cc8: e040 b.n 8032d4c <snmp_msg_event+0x50c>
  60931. msg_ps->vb_idx += 1;
  60932. }
  60933. else
  60934. {
  60935. en->set_test_pc(request_id,&msg_ps->ext_object_def);
  60936. 8032cca: 2000 movs r0, #0
  60937. 8032ccc: 4948 ldr r1, [pc, #288] ; (8032df0 <snmp_msg_event+0x5b0>)
  60938. 8032cce: 6d2b ldr r3, [r5, #80] ; 0x50
  60939. 8032cd0: 4798 blx r3
  60940. /* bad value */
  60941. snmp_error_response(msg_ps,SNMP_ES_BADVALUE);
  60942. 8032cd2: 4846 ldr r0, [pc, #280] ; (8032dec <snmp_msg_event+0x5ac>)
  60943. 8032cd4: 2103 movs r1, #3
  60944. 8032cd6: e029 b.n 8032d2c <snmp_msg_event+0x4ec>
  60945. }
  60946. }
  60947. else
  60948. {
  60949. en->set_test_pc(request_id,&msg_ps->ext_object_def);
  60950. 8032cd8: 6d2b ldr r3, [r5, #80] ; 0x50
  60951. 8032cda: f104 0168 add.w r1, r4, #104 ; 0x68
  60952. 8032cde: 4798 blx r3
  60953. /* object not available for set */
  60954. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  60955. 8032ce0: 4620 mov r0, r4
  60956. 8032ce2: 2102 movs r1, #2
  60957. 8032ce4: e022 b.n 8032d2c <snmp_msg_event+0x4ec>
  60958. }
  60959. }
  60960. else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF_S)
  60961. 8032ce6: 2b0a cmp r3, #10
  60962. 8032ce8: d123 bne.n 8032d32 <snmp_msg_event+0x4f2>
  60963. {
  60964. struct mib_external_node *en;
  60965. struct snmp_name_ptr np;
  60966. /* get_object_def() answer*/
  60967. en = msg_ps->ext_mib_node;
  60968. 8032cea: 6de6 ldr r6, [r4, #92] ; 0x5c
  60969. np = msg_ps->ext_name_ptr;
  60970. 8032cec: f894 9060 ldrb.w r9, [r4, #96] ; 0x60
  60971. 8032cf0: f8d4 8064 ldr.w r8, [r4, #100] ; 0x64
  60972. /* translate answer into a known lifeform */
  60973. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  60974. 8032cf4: 6bb7 ldr r7, [r6, #56] ; 0x38
  60975. 8032cf6: 4649 mov r1, r9
  60976. 8032cf8: 4642 mov r2, r8
  60977. 8032cfa: f104 0368 add.w r3, r4, #104 ; 0x68
  60978. 8032cfe: 47b8 blx r7
  60979. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  60980. 8032d00: f894 0068 ldrb.w r0, [r4, #104] ; 0x68
  60981. 8032d04: b160 cbz r0, 8032d20 <snmp_msg_event+0x4e0>
  60982. {
  60983. msg_ps->state = SNMP_MSG_EXTERNAL_SET_VALUE;
  60984. 8032d06: 230b movs r3, #11
  60985. 8032d08: f884 305a strb.w r3, [r4, #90] ; 0x5a
  60986. en->set_value_q(request_id, &msg_ps->ext_object_def,
  60987. msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  60988. 8032d0c: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  60989. /* translate answer into a known lifeform */
  60990. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  60991. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  60992. {
  60993. msg_ps->state = SNMP_MSG_EXTERNAL_SET_VALUE;
  60994. en->set_value_q(request_id, &msg_ps->ext_object_def,
  60995. 8032d10: 6b76 ldr r6, [r6, #52] ; 0x34
  60996. 8032d12: 7c5a ldrb r2, [r3, #17]
  60997. 8032d14: 695b ldr r3, [r3, #20]
  60998. 8032d16: 4628 mov r0, r5
  60999. 8032d18: f104 0168 add.w r1, r4, #104 ; 0x68
  61000. 8032d1c: 47b0 blx r6
  61001. 8032d1e: e08c b.n 8032e3a <snmp_msg_event+0x5fa>
  61002. msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  61003. }
  61004. else
  61005. {
  61006. en->get_object_def_pc(request_id, np.ident_len, np.ident);
  61007. 8032d20: 4649 mov r1, r9
  61008. 8032d22: 6cb3 ldr r3, [r6, #72] ; 0x48
  61009. 8032d24: 4642 mov r2, r8
  61010. 8032d26: 4798 blx r3
  61011. /* set_value failed, object has disappeared for some odd reason?? */
  61012. snmp_error_response(msg_ps,SNMP_ES_GENERROR);
  61013. 8032d28: 4620 mov r0, r4
  61014. 8032d2a: 2105 movs r1, #5
  61015. 8032d2c: f7ff fd31 bl 8032792 <snmp_error_response>
  61016. 8032d30: e083 b.n 8032e3a <snmp_msg_event+0x5fa>
  61017. }
  61018. }
  61019. else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_VALUE)
  61020. 8032d32: 2b0b cmp r3, #11
  61021. 8032d34: f040 8081 bne.w 8032e3a <snmp_msg_event+0x5fa>
  61022. struct mib_external_node *en;
  61023. /** set_value_a() */
  61024. en = msg_ps->ext_mib_node;
  61025. en->set_value_a(request_id, &msg_ps->ext_object_def,
  61026. msg_ps->vb_ptr->value_len, msg_ps->vb_ptr->value);
  61027. 8032d38: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  61028. {
  61029. struct mib_external_node *en;
  61030. /** set_value_a() */
  61031. en = msg_ps->ext_mib_node;
  61032. en->set_value_a(request_id, &msg_ps->ext_object_def,
  61033. 8032d3c: 6de2 ldr r2, [r4, #92] ; 0x5c
  61034. 8032d3e: f104 0168 add.w r1, r4, #104 ; 0x68
  61035. 8032d42: 6c55 ldr r5, [r2, #68] ; 0x44
  61036. 8032d44: 7c5a ldrb r2, [r3, #17]
  61037. 8032d46: 695b ldr r3, [r3, #20]
  61038. 8032d48: 47a8 blx r5
  61039. msg_ps->vb_ptr->value_len, msg_ps->vb_ptr->value);
  61040. /** @todo use set_value_pc() if toobig */
  61041. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  61042. 8032d4a: 2306 movs r3, #6
  61043. 8032d4c: f884 305a strb.w r3, [r4, #90] ; 0x5a
  61044. msg_ps->vb_idx += 1;
  61045. 8032d50: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  61046. 8032d54: 3301 adds r3, #1
  61047. 8032d56: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  61048. 8032d5a: e06e b.n 8032e3a <snmp_msg_event+0x5fa>
  61049. (msg_ps->vb_idx < msg_ps->invb.count))
  61050. {
  61051. struct mib_node *mn;
  61052. struct snmp_name_ptr np;
  61053. if (msg_ps->vb_idx == 0)
  61054. 8032d5c: b912 cbnz r2, 8032d64 <snmp_msg_event+0x524>
  61055. {
  61056. msg_ps->vb_ptr = msg_ps->invb.head;
  61057. 8032d5e: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  61058. 8032d62: e002 b.n 8032d6a <snmp_msg_event+0x52a>
  61059. }
  61060. else
  61061. {
  61062. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  61063. 8032d64: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  61064. 8032d68: 681b ldr r3, [r3, #0]
  61065. 8032d6a: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  61066. }
  61067. /** test object identifier for .iso.org.dod.internet prefix */
  61068. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  61069. 8032d6e: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  61070. 8032d72: 7a18 ldrb r0, [r3, #8]
  61071. 8032d74: 68d9 ldr r1, [r3, #12]
  61072. 8032d76: f7ff fc47 bl 8032608 <snmp_iso_prefix_tst>
  61073. 8032d7a: 2800 cmp r0, #0
  61074. 8032d7c: d058 beq.n 8032e30 <snmp_msg_event+0x5f0>
  61075. {
  61076. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  61077. 8032d7e: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  61078. 8032d82: 4817 ldr r0, [pc, #92] ; (8032de0 <snmp_msg_event+0x5a0>)
  61079. 8032d84: 7a19 ldrb r1, [r3, #8]
  61080. 8032d86: 68da ldr r2, [r3, #12]
  61081. 8032d88: 3904 subs r1, #4
  61082. 8032d8a: b2c9 uxtb r1, r1
  61083. 8032d8c: 3210 adds r2, #16
  61084. 8032d8e: 466b mov r3, sp
  61085. 8032d90: f7ff f9ec bl 803216c <snmp_search_tree>
  61086. msg_ps->vb_ptr->ident + 4, &np);
  61087. if (mn != NULL)
  61088. 8032d94: 4605 mov r5, r0
  61089. 8032d96: 2800 cmp r0, #0
  61090. 8032d98: d04a beq.n 8032e30 <snmp_msg_event+0x5f0>
  61091. {
  61092. if (mn->node_type == MIB_NODE_EX)
  61093. 8032d9a: 7c03 ldrb r3, [r0, #16]
  61094. 8032d9c: 2b05 cmp r3, #5
  61095. 8032d9e: d110 bne.n 8032dc2 <snmp_msg_event+0x582>
  61096. /* external object */
  61097. struct mib_external_node *en = (struct mib_external_node*)mn;
  61098. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  61099. /* save en && args in msg_ps!! */
  61100. msg_ps->ext_mib_node = en;
  61101. 8032da0: 65e0 str r0, [r4, #92] ; 0x5c
  61102. if (mn->node_type == MIB_NODE_EX)
  61103. {
  61104. /* external object */
  61105. struct mib_external_node *en = (struct mib_external_node*)mn;
  61106. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  61107. 8032da2: 2307 movs r3, #7
  61108. /* save en && args in msg_ps!! */
  61109. msg_ps->ext_mib_node = en;
  61110. msg_ps->ext_name_ptr = np;
  61111. 8032da4: e896 0003 ldmia.w r6, {r0, r1}
  61112. if (mn->node_type == MIB_NODE_EX)
  61113. {
  61114. /* external object */
  61115. struct mib_external_node *en = (struct mib_external_node*)mn;
  61116. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  61117. 8032da8: f884 305a strb.w r3, [r4, #90] ; 0x5a
  61118. /* save en && args in msg_ps!! */
  61119. msg_ps->ext_mib_node = en;
  61120. msg_ps->ext_name_ptr = np;
  61121. 8032dac: 4b0d ldr r3, [pc, #52] ; (8032de4 <snmp_msg_event+0x5a4>)
  61122. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  61123. 8032dae: f89d 2000 ldrb.w r2, [sp]
  61124. struct mib_external_node *en = (struct mib_external_node*)mn;
  61125. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  61126. /* save en && args in msg_ps!! */
  61127. msg_ps->ext_mib_node = en;
  61128. msg_ps->ext_name_ptr = np;
  61129. 8032db2: e883 0003 stmia.w r3, {r0, r1}
  61130. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  61131. 8032db6: 2100 movs r1, #0
  61132. 8032db8: 6aaf ldr r7, [r5, #40] ; 0x28
  61133. 8032dba: 6968 ldr r0, [r5, #20]
  61134. 8032dbc: 9b01 ldr r3, [sp, #4]
  61135. 8032dbe: 47b8 blx r7
  61136. 8032dc0: e03d b.n 8032e3e <snmp_msg_event+0x5fe>
  61137. else
  61138. {
  61139. /* internal object */
  61140. struct obj_def object_def;
  61141. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  61142. 8032dc2: 2702 movs r7, #2
  61143. 8032dc4: f884 705a strb.w r7, [r4, #90] ; 0x5a
  61144. mn->get_object_def(np.ident_len, np.ident, &object_def);
  61145. 8032dc8: 6803 ldr r3, [r0, #0]
  61146. 8032dca: 9901 ldr r1, [sp, #4]
  61147. 8032dcc: f89d 0000 ldrb.w r0, [sp]
  61148. 8032dd0: aa02 add r2, sp, #8
  61149. 8032dd2: 4798 blx r3
  61150. if (object_def.instance != MIB_OBJECT_NONE)
  61151. 8032dd4: f89d 3008 ldrb.w r3, [sp, #8]
  61152. 8032dd8: 2b00 cmp r3, #0
  61153. 8032dda: f040 80b9 bne.w 8032f50 <snmp_msg_event+0x710>
  61154. 8032dde: e027 b.n 8032e30 <snmp_msg_event+0x5f0>
  61155. 8032de0: 080406b4 .word 0x080406b4
  61156. 8032de4: 20011070 .word 0x20011070
  61157. 8032de8: 2001111c .word 0x2001111c
  61158. 8032dec: 20011010 .word 0x20011010
  61159. 8032df0: 20011078 .word 0x20011078
  61160. {
  61161. msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
  61162. if (object_def.access & MIB_ACCESS_WRITE)
  61163. {
  61164. if ((object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  61165. 8032df4: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  61166. 8032df8: f89d 100a ldrb.w r1, [sp, #10]
  61167. 8032dfc: 7c1a ldrb r2, [r3, #16]
  61168. 8032dfe: 4291 cmp r1, r2
  61169. 8032e00: d10e bne.n 8032e20 <snmp_msg_event+0x5e0>
  61170. (mn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
  61171. 8032e02: 68af ldr r7, [r5, #8]
  61172. 8032e04: 7c59 ldrb r1, [r3, #17]
  61173. 8032e06: 695a ldr r2, [r3, #20]
  61174. 8032e08: a802 add r0, sp, #8
  61175. 8032e0a: 47b8 blx r7
  61176. {
  61177. msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
  61178. if (object_def.access & MIB_ACCESS_WRITE)
  61179. {
  61180. if ((object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  61181. 8032e0c: b140 cbz r0, 8032e20 <snmp_msg_event+0x5e0>
  61182. (mn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
  61183. {
  61184. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  61185. 8032e0e: 2301 movs r3, #1
  61186. 8032e10: f884 305a strb.w r3, [r4, #90] ; 0x5a
  61187. msg_ps->vb_idx += 1;
  61188. 8032e14: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  61189. 8032e18: 3301 adds r3, #1
  61190. 8032e1a: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  61191. 8032e1e: e006 b.n 8032e2e <snmp_msg_event+0x5ee>
  61192. }
  61193. else
  61194. {
  61195. /* bad value */
  61196. snmp_error_response(msg_ps,SNMP_ES_BADVALUE);
  61197. 8032e20: 4854 ldr r0, [pc, #336] ; (8032f74 <snmp_msg_event+0x734>)
  61198. 8032e22: 2103 movs r1, #3
  61199. 8032e24: e001 b.n 8032e2a <snmp_msg_event+0x5ea>
  61200. }
  61201. }
  61202. else
  61203. {
  61204. /* object not available for set */
  61205. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  61206. 8032e26: 4853 ldr r0, [pc, #332] ; (8032f74 <snmp_msg_event+0x734>)
  61207. 8032e28: 4639 mov r1, r7
  61208. 8032e2a: f7ff fcb2 bl 8032792 <snmp_error_response>
  61209. }
  61210. else
  61211. {
  61212. mn = NULL;
  61213. }
  61214. if (mn == NULL)
  61215. 8032e2e: b935 cbnz r5, 8032e3e <snmp_msg_event+0x5fe>
  61216. {
  61217. /* mn == NULL, noSuchName */
  61218. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  61219. 8032e30: 4850 ldr r0, [pc, #320] ; (8032f74 <snmp_msg_event+0x734>)
  61220. 8032e32: 2102 movs r1, #2
  61221. 8032e34: f7ff fcad bl 8032792 <snmp_error_response>
  61222. 8032e38: e001 b.n 8032e3e <snmp_msg_event+0x5fe>
  61223. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  61224. msg_ps->vb_idx += 1;
  61225. }
  61226. /* test all values before setting */
  61227. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  61228. 8032e3a: 4c4e ldr r4, [pc, #312] ; (8032f74 <snmp_msg_event+0x734>)
  61229. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  61230. }
  61231. /** test object identifier for .iso.org.dod.internet prefix */
  61232. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  61233. {
  61234. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  61235. 8032e3c: 466e mov r6, sp
  61236. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  61237. msg_ps->vb_idx += 1;
  61238. }
  61239. /* test all values before setting */
  61240. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  61241. 8032e3e: f894 205a ldrb.w r2, [r4, #90] ; 0x5a
  61242. 8032e42: 4b4c ldr r3, [pc, #304] ; (8032f74 <snmp_msg_event+0x734>)
  61243. 8032e44: 2a01 cmp r2, #1
  61244. 8032e46: d151 bne.n 8032eec <snmp_msg_event+0x6ac>
  61245. (msg_ps->vb_idx < msg_ps->invb.count))
  61246. 8032e48: f894 20f8 ldrb.w r2, [r4, #248] ; 0xf8
  61247. 8032e4c: f894 1108 ldrb.w r1, [r4, #264] ; 0x108
  61248. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  61249. msg_ps->vb_idx += 1;
  61250. }
  61251. /* test all values before setting */
  61252. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  61253. 8032e50: 428a cmp r2, r1
  61254. 8032e52: d383 bcc.n 8032d5c <snmp_msg_event+0x51c>
  61255. 8032e54: e088 b.n 8032f68 <snmp_msg_event+0x728>
  61256. }
  61257. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  61258. (msg_ps->vb_idx == msg_ps->invb.count))
  61259. {
  61260. msg_ps->vb_idx = 0;
  61261. 8032e56: 2200 movs r2, #0
  61262. 8032e58: f883 20f8 strb.w r2, [r3, #248] ; 0xf8
  61263. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  61264. 8032e5c: 2206 movs r2, #6
  61265. 8032e5e: f883 205a strb.w r2, [r3, #90] ; 0x5a
  61266. 8032e62: e043 b.n 8032eec <snmp_msg_event+0x6ac>
  61267. (msg_ps->vb_idx < msg_ps->invb.count))
  61268. {
  61269. struct mib_node *mn;
  61270. struct snmp_name_ptr np;
  61271. if (msg_ps->vb_idx == 0)
  61272. 8032e64: b913 cbnz r3, 8032e6c <snmp_msg_event+0x62c>
  61273. {
  61274. msg_ps->vb_ptr = msg_ps->invb.head;
  61275. 8032e66: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  61276. 8032e6a: e002 b.n 8032e72 <snmp_msg_event+0x632>
  61277. }
  61278. else
  61279. {
  61280. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  61281. 8032e6c: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  61282. 8032e70: 681b ldr r3, [r3, #0]
  61283. 8032e72: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  61284. }
  61285. /* skip iso prefix test, was done previously while settesting() */
  61286. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  61287. 8032e76: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  61288. 8032e7a: 483f ldr r0, [pc, #252] ; (8032f78 <snmp_msg_event+0x738>)
  61289. 8032e7c: 7a19 ldrb r1, [r3, #8]
  61290. 8032e7e: 68da ldr r2, [r3, #12]
  61291. 8032e80: 3904 subs r1, #4
  61292. 8032e82: b2c9 uxtb r1, r1
  61293. 8032e84: 3210 adds r2, #16
  61294. 8032e86: 466b mov r3, sp
  61295. 8032e88: f7ff f970 bl 803216c <snmp_search_tree>
  61296. msg_ps->vb_ptr->ident + 4, &np);
  61297. /* check if object is still available
  61298. (e.g. external hot-plug thingy present?) */
  61299. if (mn != NULL)
  61300. 8032e8c: 4605 mov r5, r0
  61301. 8032e8e: 2800 cmp r0, #0
  61302. 8032e90: d02e beq.n 8032ef0 <snmp_msg_event+0x6b0>
  61303. {
  61304. if (mn->node_type == MIB_NODE_EX)
  61305. 8032e92: 7c03 ldrb r3, [r0, #16]
  61306. 8032e94: 2b05 cmp r3, #5
  61307. 8032e96: d110 bne.n 8032eba <snmp_msg_event+0x67a>
  61308. /* external object */
  61309. struct mib_external_node *en = (struct mib_external_node*)mn;
  61310. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  61311. /* save en && args in msg_ps!! */
  61312. msg_ps->ext_mib_node = en;
  61313. 8032e98: 65e0 str r0, [r4, #92] ; 0x5c
  61314. if (mn->node_type == MIB_NODE_EX)
  61315. {
  61316. /* external object */
  61317. struct mib_external_node *en = (struct mib_external_node*)mn;
  61318. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  61319. 8032e9a: 230a movs r3, #10
  61320. /* save en && args in msg_ps!! */
  61321. msg_ps->ext_mib_node = en;
  61322. msg_ps->ext_name_ptr = np;
  61323. 8032e9c: e896 0003 ldmia.w r6, {r0, r1}
  61324. if (mn->node_type == MIB_NODE_EX)
  61325. {
  61326. /* external object */
  61327. struct mib_external_node *en = (struct mib_external_node*)mn;
  61328. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  61329. 8032ea0: f884 305a strb.w r3, [r4, #90] ; 0x5a
  61330. /* save en && args in msg_ps!! */
  61331. msg_ps->ext_mib_node = en;
  61332. msg_ps->ext_name_ptr = np;
  61333. 8032ea4: 4b35 ldr r3, [pc, #212] ; (8032f7c <snmp_msg_event+0x73c>)
  61334. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  61335. 8032ea6: f89d 2000 ldrb.w r2, [sp]
  61336. struct mib_external_node *en = (struct mib_external_node*)mn;
  61337. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  61338. /* save en && args in msg_ps!! */
  61339. msg_ps->ext_mib_node = en;
  61340. msg_ps->ext_name_ptr = np;
  61341. 8032eaa: e883 0003 stmia.w r3, {r0, r1}
  61342. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  61343. 8032eae: 2100 movs r1, #0
  61344. 8032eb0: 6aaf ldr r7, [r5, #40] ; 0x28
  61345. 8032eb2: 6968 ldr r0, [r5, #20]
  61346. 8032eb4: 9b01 ldr r3, [sp, #4]
  61347. 8032eb6: 47b8 blx r7
  61348. 8032eb8: e01a b.n 8032ef0 <snmp_msg_event+0x6b0>
  61349. else
  61350. {
  61351. /* internal object */
  61352. struct obj_def object_def;
  61353. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF_S;
  61354. 8032eba: 2305 movs r3, #5
  61355. 8032ebc: f884 305a strb.w r3, [r4, #90] ; 0x5a
  61356. mn->get_object_def(np.ident_len, np.ident, &object_def);
  61357. 8032ec0: 6803 ldr r3, [r0, #0]
  61358. 8032ec2: 9901 ldr r1, [sp, #4]
  61359. 8032ec4: f89d 0000 ldrb.w r0, [sp]
  61360. 8032ec8: aa02 add r2, sp, #8
  61361. 8032eca: 4798 blx r3
  61362. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  61363. 8032ecc: 2306 movs r3, #6
  61364. 8032ece: f884 305a strb.w r3, [r4, #90] ; 0x5a
  61365. mn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  61366. 8032ed2: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  61367. 8032ed6: 68ed ldr r5, [r5, #12]
  61368. 8032ed8: 7c59 ldrb r1, [r3, #17]
  61369. 8032eda: 695a ldr r2, [r3, #20]
  61370. 8032edc: a802 add r0, sp, #8
  61371. 8032ede: 47a8 blx r5
  61372. msg_ps->vb_idx += 1;
  61373. 8032ee0: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  61374. 8032ee4: 3301 adds r3, #1
  61375. 8032ee6: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  61376. 8032eea: e001 b.n 8032ef0 <snmp_msg_event+0x6b0>
  61377. msg_ps->vb_idx = 0;
  61378. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  61379. }
  61380. /* set all values "atomically" (be as "atomic" as possible) */
  61381. while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  61382. 8032eec: 4c21 ldr r4, [pc, #132] ; (8032f74 <snmp_msg_event+0x734>)
  61383. else
  61384. {
  61385. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  61386. }
  61387. /* skip iso prefix test, was done previously while settesting() */
  61388. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  61389. 8032eee: 466e mov r6, sp
  61390. msg_ps->vb_idx = 0;
  61391. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  61392. }
  61393. /* set all values "atomically" (be as "atomic" as possible) */
  61394. while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  61395. 8032ef0: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  61396. 8032ef4: 4d1f ldr r5, [pc, #124] ; (8032f74 <snmp_msg_event+0x734>)
  61397. 8032ef6: 2b06 cmp r3, #6
  61398. 8032ef8: d139 bne.n 8032f6e <snmp_msg_event+0x72e>
  61399. (msg_ps->vb_idx < msg_ps->invb.count))
  61400. 8032efa: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  61401. 8032efe: f894 2108 ldrb.w r2, [r4, #264] ; 0x108
  61402. msg_ps->vb_idx = 0;
  61403. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  61404. }
  61405. /* set all values "atomically" (be as "atomic" as possible) */
  61406. while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  61407. 8032f02: 4293 cmp r3, r2
  61408. 8032f04: d3ae bcc.n 8032e64 <snmp_msg_event+0x624>
  61409. 8032f06: e031 b.n 8032f6c <snmp_msg_event+0x72c>
  61410. (msg_ps->vb_idx == msg_ps->invb.count))
  61411. {
  61412. /* simply echo the input if we can set it
  61413. @todo do we need to return the actual value?
  61414. e.g. if value is silently modified or behaves sticky? */
  61415. msg_ps->outvb = msg_ps->invb;
  61416. 8032f08: f505 7280 add.w r2, r5, #256 ; 0x100
  61417. 8032f0c: ca07 ldmia r2, {r0, r1, r2}
  61418. 8032f0e: f505 7386 add.w r3, r5, #268 ; 0x10c
  61419. 8032f12: e883 0007 stmia.w r3, {r0, r1, r2}
  61420. msg_ps->invb.head = NULL;
  61421. 8032f16: 2300 movs r3, #0
  61422. 8032f18: f8c5 3100 str.w r3, [r5, #256] ; 0x100
  61423. msg_ps->invb.tail = NULL;
  61424. 8032f1c: f8c5 3104 str.w r3, [r5, #260] ; 0x104
  61425. msg_ps->invb.count = 0;
  61426. 8032f20: f885 3108 strb.w r3, [r5, #264] ; 0x108
  61427. snmp_ok_response(msg_ps);
  61428. 8032f24: 4628 mov r0, r5
  61429. 8032f26: f7ff fc6f bl 8032808 <snmp_ok_response>
  61430. 8032f2a: e020 b.n 8032f6e <snmp_msg_event+0x72e>
  61431. }
  61432. }
  61433. if (mn == NULL)
  61434. {
  61435. /* mn == NULL, noSuchName */
  61436. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  61437. 8032f2c: 4811 ldr r0, [pc, #68] ; (8032f74 <snmp_msg_event+0x734>)
  61438. 8032f2e: 2102 movs r1, #2
  61439. 8032f30: f7ff fc2f bl 8032792 <snmp_error_response>
  61440. 8032f34: e556 b.n 80329e4 <snmp_msg_event+0x1a4>
  61441. }
  61442. if (mn != NULL)
  61443. {
  61444. struct snmp_varbind *vb;
  61445. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  61446. 8032f36: 2303 movs r3, #3
  61447. /* allocate output varbind */
  61448. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  61449. 8032f38: 200c movs r0, #12
  61450. }
  61451. if (mn != NULL)
  61452. {
  61453. struct snmp_varbind *vb;
  61454. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  61455. 8032f3a: f884 305a strb.w r3, [r4, #90] ; 0x5a
  61456. /* allocate output varbind */
  61457. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  61458. 8032f3e: f7f9 ff57 bl 802cdf0 <memp_malloc>
  61459. if (vb != NULL)
  61460. 8032f42: 4605 mov r5, r0
  61461. 8032f44: 2800 cmp r0, #0
  61462. 8032f46: f47f ae31 bne.w 8032bac <snmp_msg_event+0x36c>
  61463. 8032f4a: e669 b.n 8032c20 <snmp_msg_event+0x3e0>
  61464. {
  61465. /* mn == NULL, noSuchName */
  61466. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  61467. }
  61468. }
  61469. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  61470. 8032f4c: d10f bne.n 8032f6e <snmp_msg_event+0x72e>
  61471. 8032f4e: e555 b.n 80329fc <snmp_msg_event+0x1bc>
  61472. /* search failed, object id points to unknown object (nosuchname) */
  61473. mn = NULL;
  61474. }
  61475. if (mn != NULL)
  61476. {
  61477. msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
  61478. 8032f50: 2304 movs r3, #4
  61479. 8032f52: f884 305a strb.w r3, [r4, #90] ; 0x5a
  61480. if (object_def.access & MIB_ACCESS_WRITE)
  61481. 8032f56: f89d 3009 ldrb.w r3, [sp, #9]
  61482. 8032f5a: f003 0302 and.w r3, r3, #2
  61483. 8032f5e: b2db uxtb r3, r3
  61484. 8032f60: 2b00 cmp r3, #0
  61485. 8032f62: f47f af47 bne.w 8032df4 <snmp_msg_event+0x5b4>
  61486. 8032f66: e75e b.n 8032e26 <snmp_msg_event+0x5e6>
  61487. /* mn == NULL, noSuchName */
  61488. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  61489. }
  61490. }
  61491. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  61492. 8032f68: d1c0 bne.n 8032eec <snmp_msg_event+0x6ac>
  61493. 8032f6a: e774 b.n 8032e56 <snmp_msg_event+0x616>
  61494. mn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  61495. msg_ps->vb_idx += 1;
  61496. }
  61497. }
  61498. }
  61499. if ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  61500. 8032f6c: d0cc beq.n 8032f08 <snmp_msg_event+0x6c8>
  61501. else if(msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
  61502. {
  61503. snmp_msg_set_event(request_id, msg_ps);
  61504. }
  61505. }
  61506. }
  61507. 8032f6e: b027 add sp, #156 ; 0x9c
  61508. 8032f70: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  61509. 8032f74: 20011010 .word 0x20011010
  61510. 8032f78: 080406b4 .word 0x080406b4
  61511. 8032f7c: 20011070 .word 0x20011070
  61512. 08032f80 <snmp_pdu_dec_varbindlist>:
  61513. return ERR_OK;
  61514. }
  61515. static err_t
  61516. snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
  61517. {
  61518. 8032f80: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  61519. 8032f84: b0c7 sub sp, #284 ; 0x11c
  61520. u16_t len, vb_len;
  61521. u8_t len_octets;
  61522. u8_t type;
  61523. /* variable binding list */
  61524. snmp_asn1_dec_type(p, ofs, &type);
  61525. 8032f86: f10d 070b add.w r7, sp, #11
  61526. return ERR_OK;
  61527. }
  61528. static err_t
  61529. snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
  61530. {
  61531. 8032f8a: 468a mov sl, r1
  61532. 8032f8c: 4691 mov r9, r2
  61533. u16_t len, vb_len;
  61534. u8_t len_octets;
  61535. u8_t type;
  61536. /* variable binding list */
  61537. snmp_asn1_dec_type(p, ofs, &type);
  61538. 8032f8e: 463a mov r2, r7
  61539. return ERR_OK;
  61540. }
  61541. static err_t
  61542. snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
  61543. {
  61544. 8032f90: 4604 mov r4, r0
  61545. 8032f92: 461d mov r5, r3
  61546. u8_t len_octets;
  61547. u8_t type;
  61548. /* variable binding list */
  61549. snmp_asn1_dec_type(p, ofs, &type);
  61550. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &vb_len);
  61551. 8032f94: f10d 060e add.w r6, sp, #14
  61552. u16_t len, vb_len;
  61553. u8_t len_octets;
  61554. u8_t type;
  61555. /* variable binding list */
  61556. snmp_asn1_dec_type(p, ofs, &type);
  61557. 8032f98: f7fd f944 bl 8030224 <snmp_asn1_dec_type>
  61558. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &vb_len);
  61559. 8032f9c: f10a 0101 add.w r1, sl, #1
  61560. 8032fa0: 4620 mov r0, r4
  61561. 8032fa2: b289 uxth r1, r1
  61562. 8032fa4: f10d 020a add.w r2, sp, #10
  61563. 8032fa8: 4633 mov r3, r6
  61564. 8032faa: f7fd f950 bl 803024e <snmp_asn1_dec_length>
  61565. if ((derr != ERR_OK) ||
  61566. 8032fae: b910 cbnz r0, 8032fb6 <snmp_pdu_dec_varbindlist+0x36>
  61567. 8032fb0: 783b ldrb r3, [r7, #0]
  61568. 8032fb2: 2b30 cmp r3, #48 ; 0x30
  61569. 8032fb4: d002 beq.n 8032fbc <snmp_pdu_dec_varbindlist+0x3c>
  61570. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
  61571. {
  61572. snmp_inc_snmpinasnparseerrs();
  61573. 8032fb6: f7fe ff21 bl 8031dfc <snmp_inc_snmpinasnparseerrs>
  61574. 8032fba: e02b b.n 8033014 <snmp_pdu_dec_varbindlist+0x94>
  61575. return ERR_ARG;
  61576. }
  61577. ofs += (1 + len_octets);
  61578. 8032fbc: f89d 800a ldrb.w r8, [sp, #10]
  61579. /* start with empty list */
  61580. m_stat->invb.count = 0;
  61581. 8032fc0: f885 0108 strb.w r0, [r5, #264] ; 0x108
  61582. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
  61583. {
  61584. snmp_inc_snmpinasnparseerrs();
  61585. return ERR_ARG;
  61586. }
  61587. ofs += (1 + len_octets);
  61588. 8032fc4: f108 0801 add.w r8, r8, #1
  61589. 8032fc8: 44d0 add r8, sl
  61590. 8032fca: fa1f f888 uxth.w r8, r8
  61591. /* start with empty list */
  61592. m_stat->invb.count = 0;
  61593. m_stat->invb.head = NULL;
  61594. 8032fce: f8c5 0100 str.w r0, [r5, #256] ; 0x100
  61595. m_stat->invb.tail = NULL;
  61596. 8032fd2: f8c5 0104 str.w r0, [r5, #260] ; 0x104
  61597. while (vb_len > 0)
  61598. 8032fd6: e118 b.n 803320a <snmp_pdu_dec_varbindlist+0x28a>
  61599. {
  61600. struct snmp_obj_id oid, oid_value;
  61601. struct snmp_varbind *vb;
  61602. snmp_asn1_dec_type(p, ofs, &type);
  61603. 8032fd8: 4641 mov r1, r8
  61604. 8032fda: 463a mov r2, r7
  61605. 8032fdc: 4620 mov r0, r4
  61606. 8032fde: f7fd f921 bl 8030224 <snmp_asn1_dec_type>
  61607. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  61608. 8032fe2: f108 0101 add.w r1, r8, #1
  61609. 8032fe6: 4620 mov r0, r4
  61610. 8032fe8: b289 uxth r1, r1
  61611. 8032fea: f10d 020a add.w r2, sp, #10
  61612. 8032fee: ab03 add r3, sp, #12
  61613. 8032ff0: f7fd f92d bl 803024e <snmp_asn1_dec_length>
  61614. if ((derr != ERR_OK) ||
  61615. 8032ff4: b940 cbnz r0, 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61616. 8032ff6: 783b ldrb r3, [r7, #0]
  61617. 8032ff8: 2b30 cmp r3, #48 ; 0x30
  61618. 8032ffa: d105 bne.n 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61619. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) ||
  61620. (len == 0) || (len > vb_len))
  61621. 8032ffc: f8bd 200c ldrh.w r2, [sp, #12]
  61622. struct snmp_varbind *vb;
  61623. snmp_asn1_dec_type(p, ofs, &type);
  61624. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  61625. if ((derr != ERR_OK) ||
  61626. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) ||
  61627. 8033000: b112 cbz r2, 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61628. (len == 0) || (len > vb_len))
  61629. 8033002: 8833 ldrh r3, [r6, #0]
  61630. 8033004: 429a cmp r2, r3
  61631. 8033006: d907 bls.n 8033018 <snmp_pdu_dec_varbindlist+0x98>
  61632. {
  61633. snmp_inc_snmpinasnparseerrs();
  61634. 8033008: f7fe fef8 bl 8031dfc <snmp_inc_snmpinasnparseerrs>
  61635. /* free varbinds (if available) */
  61636. snmp_varbind_list_free(&m_stat->invb);
  61637. 803300c: f505 7080 add.w r0, r5, #256 ; 0x100
  61638. 8033010: f7ff fbb1 bl 8032776 <snmp_varbind_list_free>
  61639. 8033014: 20f2 movs r0, #242 ; 0xf2
  61640. 8033016: e109 b.n 803322c <snmp_pdu_dec_varbindlist+0x2ac>
  61641. return ERR_ARG;
  61642. }
  61643. ofs += (1 + len_octets);
  61644. 8033018: f89d 200a ldrb.w r2, [sp, #10]
  61645. 803301c: 4490 add r8, r2
  61646. 803301e: fa1f f888 uxth.w r8, r8
  61647. 8033022: f108 0a01 add.w sl, r8, #1
  61648. vb_len -= (1 + len_octets);
  61649. 8033026: 43d2 mvns r2, r2
  61650. snmp_inc_snmpinasnparseerrs();
  61651. /* free varbinds (if available) */
  61652. snmp_varbind_list_free(&m_stat->invb);
  61653. return ERR_ARG;
  61654. }
  61655. ofs += (1 + len_octets);
  61656. 8033028: fa1f fa8a uxth.w sl, sl
  61657. vb_len -= (1 + len_octets);
  61658. 803302c: 189b adds r3, r3, r2
  61659. snmp_asn1_dec_type(p, ofs, &type);
  61660. 803302e: 4651 mov r1, sl
  61661. 8033030: 463a mov r2, r7
  61662. 8033032: 4620 mov r0, r4
  61663. /* free varbinds (if available) */
  61664. snmp_varbind_list_free(&m_stat->invb);
  61665. return ERR_ARG;
  61666. }
  61667. ofs += (1 + len_octets);
  61668. vb_len -= (1 + len_octets);
  61669. 8033034: 8033 strh r3, [r6, #0]
  61670. snmp_asn1_dec_type(p, ofs, &type);
  61671. 8033036: f7fd f8f5 bl 8030224 <snmp_asn1_dec_type>
  61672. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  61673. 803303a: f108 0102 add.w r1, r8, #2
  61674. 803303e: 4620 mov r0, r4
  61675. 8033040: b289 uxth r1, r1
  61676. 8033042: f10d 020a add.w r2, sp, #10
  61677. 8033046: ab03 add r3, sp, #12
  61678. 8033048: f7fd f901 bl 803024e <snmp_asn1_dec_length>
  61679. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID)))
  61680. 803304c: 2800 cmp r0, #0
  61681. 803304e: d1db bne.n 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61682. 8033050: 783b ldrb r3, [r7, #0]
  61683. 8033052: 2b06 cmp r3, #6
  61684. 8033054: d1d8 bne.n 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61685. snmp_inc_snmpinasnparseerrs();
  61686. /* free varbinds (if available) */
  61687. snmp_varbind_list_free(&m_stat->invb);
  61688. return ERR_ARG;
  61689. }
  61690. derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid);
  61691. 8033056: f89d 100a ldrb.w r1, [sp, #10]
  61692. 803305a: f8bd 200c ldrh.w r2, [sp, #12]
  61693. 803305e: 3101 adds r1, #1
  61694. 8033060: 4451 add r1, sl
  61695. 8033062: 4620 mov r0, r4
  61696. 8033064: b289 uxth r1, r1
  61697. 8033066: ab04 add r3, sp, #16
  61698. 8033068: f7fd fa20 bl 80304ac <snmp_asn1_dec_oid>
  61699. if (derr != ERR_OK)
  61700. 803306c: 2800 cmp r0, #0
  61701. 803306e: d1cb bne.n 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61702. snmp_inc_snmpinasnparseerrs();
  61703. /* free varbinds (if available) */
  61704. snmp_varbind_list_free(&m_stat->invb);
  61705. return ERR_ARG;
  61706. }
  61707. ofs += (1 + len_octets + len);
  61708. 8033070: f89d 300a ldrb.w r3, [sp, #10]
  61709. 8033074: f8bd 200c ldrh.w r2, [sp, #12]
  61710. 8033078: 1899 adds r1, r3, r2
  61711. 803307a: 448a add sl, r1
  61712. 803307c: fa1f fa8a uxth.w sl, sl
  61713. vb_len -= (1 + len_octets + len);
  61714. 8033080: 8831 ldrh r1, [r6, #0]
  61715. snmp_inc_snmpinasnparseerrs();
  61716. /* free varbinds (if available) */
  61717. snmp_varbind_list_free(&m_stat->invb);
  61718. return ERR_ARG;
  61719. }
  61720. ofs += (1 + len_octets + len);
  61721. 8033082: f10a 0801 add.w r8, sl, #1
  61722. vb_len -= (1 + len_octets + len);
  61723. 8033086: 1a8a subs r2, r1, r2
  61724. snmp_inc_snmpinasnparseerrs();
  61725. /* free varbinds (if available) */
  61726. snmp_varbind_list_free(&m_stat->invb);
  61727. return ERR_ARG;
  61728. }
  61729. ofs += (1 + len_octets + len);
  61730. 8033088: fa1f f888 uxth.w r8, r8
  61731. vb_len -= (1 + len_octets + len);
  61732. 803308c: 43db mvns r3, r3
  61733. 803308e: 18d3 adds r3, r2, r3
  61734. snmp_asn1_dec_type(p, ofs, &type);
  61735. 8033090: 4641 mov r1, r8
  61736. 8033092: 463a mov r2, r7
  61737. 8033094: 4620 mov r0, r4
  61738. /* free varbinds (if available) */
  61739. snmp_varbind_list_free(&m_stat->invb);
  61740. return ERR_ARG;
  61741. }
  61742. ofs += (1 + len_octets + len);
  61743. vb_len -= (1 + len_octets + len);
  61744. 8033096: 8033 strh r3, [r6, #0]
  61745. snmp_asn1_dec_type(p, ofs, &type);
  61746. 8033098: f7fd f8c4 bl 8030224 <snmp_asn1_dec_type>
  61747. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  61748. 803309c: f10a 0102 add.w r1, sl, #2
  61749. 80330a0: 4620 mov r0, r4
  61750. 80330a2: b289 uxth r1, r1
  61751. 80330a4: f10d 020a add.w r2, sp, #10
  61752. 80330a8: ab03 add r3, sp, #12
  61753. 80330aa: f7fd f8d0 bl 803024e <snmp_asn1_dec_length>
  61754. if (derr != ERR_OK)
  61755. 80330ae: 2800 cmp r0, #0
  61756. 80330b0: d1aa bne.n 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61757. /* free varbinds (if available) */
  61758. snmp_varbind_list_free(&m_stat->invb);
  61759. return ERR_ARG;
  61760. }
  61761. switch (type)
  61762. 80330b2: 7839 ldrb r1, [r7, #0]
  61763. 80330b4: 2906 cmp r1, #6
  61764. 80330b6: d047 beq.n 8033148 <snmp_pdu_dec_varbindlist+0x1c8>
  61765. 80330b8: d805 bhi.n 80330c6 <snmp_pdu_dec_varbindlist+0x146>
  61766. 80330ba: 2904 cmp r1, #4
  61767. 80330bc: d036 beq.n 803312c <snmp_pdu_dec_varbindlist+0x1ac>
  61768. 80330be: d839 bhi.n 8033134 <snmp_pdu_dec_varbindlist+0x1b4>
  61769. 80330c0: 2902 cmp r1, #2
  61770. 80330c2: d1a1 bne.n 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61771. 80330c4: e009 b.n 80330da <snmp_pdu_dec_varbindlist+0x15a>
  61772. 80330c6: 2943 cmp r1, #67 ; 0x43
  61773. 80330c8: d804 bhi.n 80330d4 <snmp_pdu_dec_varbindlist+0x154>
  61774. 80330ca: 2941 cmp r1, #65 ; 0x41
  61775. 80330cc: d219 bcs.n 8033102 <snmp_pdu_dec_varbindlist+0x182>
  61776. 80330ce: 2940 cmp r1, #64 ; 0x40
  61777. 80330d0: d19a bne.n 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61778. 80330d2: e069 b.n 80331a8 <snmp_pdu_dec_varbindlist+0x228>
  61779. 80330d4: 2944 cmp r1, #68 ; 0x44
  61780. 80330d6: d197 bne.n 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61781. 80330d8: e028 b.n 803312c <snmp_pdu_dec_varbindlist+0x1ac>
  61782. {
  61783. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
  61784. vb = snmp_varbind_alloc(&oid, type, sizeof(s32_t));
  61785. 80330da: a804 add r0, sp, #16
  61786. 80330dc: 2204 movs r2, #4
  61787. 80330de: f7ff faf7 bl 80326d0 <snmp_varbind_alloc>
  61788. if (vb != NULL)
  61789. 80330e2: 4683 mov fp, r0
  61790. 80330e4: 2800 cmp r0, #0
  61791. 80330e6: d08f beq.n 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61792. {
  61793. s32_t *vptr = (s32_t*)vb->value;
  61794. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, vptr);
  61795. 80330e8: f89d 100a ldrb.w r1, [sp, #10]
  61796. 80330ec: f8bd 200c ldrh.w r2, [sp, #12]
  61797. 80330f0: f8db 3014 ldr.w r3, [fp, #20]
  61798. 80330f4: 3101 adds r1, #1
  61799. 80330f6: 4441 add r1, r8
  61800. 80330f8: 4620 mov r0, r4
  61801. 80330fa: b289 uxth r1, r1
  61802. 80330fc: f7fd f97d bl 80303fa <snmp_asn1_dec_s32t>
  61803. 8033100: e06b b.n 80331da <snmp_pdu_dec_varbindlist+0x25a>
  61804. }
  61805. break;
  61806. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
  61807. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
  61808. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
  61809. vb = snmp_varbind_alloc(&oid, type, sizeof(u32_t));
  61810. 8033102: a804 add r0, sp, #16
  61811. 8033104: 2204 movs r2, #4
  61812. 8033106: f7ff fae3 bl 80326d0 <snmp_varbind_alloc>
  61813. if (vb != NULL)
  61814. 803310a: 4683 mov fp, r0
  61815. 803310c: 2800 cmp r0, #0
  61816. 803310e: f43f af7b beq.w 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61817. {
  61818. u32_t *vptr = (u32_t*)vb->value;
  61819. derr = snmp_asn1_dec_u32t(p, ofs + 1 + len_octets, len, vptr);
  61820. 8033112: f89d 100a ldrb.w r1, [sp, #10]
  61821. 8033116: f8bd 200c ldrh.w r2, [sp, #12]
  61822. 803311a: f8db 3014 ldr.w r3, [fp, #20]
  61823. 803311e: 3101 adds r1, #1
  61824. 8033120: 4441 add r1, r8
  61825. 8033122: 4620 mov r0, r4
  61826. 8033124: b289 uxth r1, r1
  61827. 8033126: f7fd f914 bl 8030352 <snmp_asn1_dec_u32t>
  61828. 803312a: e056 b.n 80331da <snmp_pdu_dec_varbindlist+0x25a>
  61829. }
  61830. break;
  61831. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
  61832. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
  61833. LWIP_ASSERT("invalid length", len <= 0xff);
  61834. vb = snmp_varbind_alloc(&oid, type, (u8_t)len);
  61835. 803312c: a804 add r0, sp, #16
  61836. 803312e: f89d 200c ldrb.w r2, [sp, #12]
  61837. 8033132: e03f b.n 80331b4 <snmp_pdu_dec_varbindlist+0x234>
  61838. {
  61839. derr = ERR_ARG;
  61840. }
  61841. break;
  61842. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
  61843. vb = snmp_varbind_alloc(&oid, type, 0);
  61844. 8033134: 2105 movs r1, #5
  61845. 8033136: a804 add r0, sp, #16
  61846. 8033138: 2200 movs r2, #0
  61847. 803313a: f7ff fac9 bl 80326d0 <snmp_varbind_alloc>
  61848. if (vb != NULL)
  61849. 803313e: 4601 mov r1, r0
  61850. 8033140: 2800 cmp r0, #0
  61851. 8033142: f43f af61 beq.w 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61852. 8033146: e02a b.n 803319e <snmp_pdu_dec_varbindlist+0x21e>
  61853. {
  61854. derr = ERR_ARG;
  61855. }
  61856. break;
  61857. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
  61858. derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid_value);
  61859. 8033148: f89d 100a ldrb.w r1, [sp, #10]
  61860. 803314c: f8bd 200c ldrh.w r2, [sp, #12]
  61861. 8033150: 3101 adds r1, #1
  61862. 8033152: 4441 add r1, r8
  61863. 8033154: 4620 mov r0, r4
  61864. 8033156: b289 uxth r1, r1
  61865. 8033158: ab25 add r3, sp, #148 ; 0x94
  61866. 803315a: f7fd f9a7 bl 80304ac <snmp_asn1_dec_oid>
  61867. if (derr == ERR_OK)
  61868. 803315e: 2800 cmp r0, #0
  61869. 8033160: f47f af52 bne.w 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61870. {
  61871. vb = snmp_varbind_alloc(&oid, type, oid_value.len * sizeof(s32_t));
  61872. 8033164: f89d 2094 ldrb.w r2, [sp, #148] ; 0x94
  61873. 8033168: 7839 ldrb r1, [r7, #0]
  61874. 803316a: 0092 lsls r2, r2, #2
  61875. 803316c: a804 add r0, sp, #16
  61876. 803316e: f002 02fc and.w r2, r2, #252 ; 0xfc
  61877. 8033172: f7ff faad bl 80326d0 <snmp_varbind_alloc>
  61878. if (vb != NULL)
  61879. 8033176: 4601 mov r1, r0
  61880. 8033178: 2800 cmp r0, #0
  61881. 803317a: f43f af45 beq.w 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61882. {
  61883. u8_t i = oid_value.len;
  61884. 803317e: f89d 3094 ldrb.w r3, [sp, #148] ; 0x94
  61885. s32_t *vptr = (s32_t*)vb->value;
  61886. 8033182: 6940 ldr r0, [r0, #20]
  61887. while(i > 0)
  61888. 8033184: e009 b.n 803319a <snmp_pdu_dec_varbindlist+0x21a>
  61889. {
  61890. i--;
  61891. 8033186: 3b01 subs r3, #1
  61892. 8033188: b2db uxtb r3, r3
  61893. vptr[i] = oid_value.id[i];
  61894. 803318a: f50d 7e8c add.w lr, sp, #280 ; 0x118
  61895. 803318e: eb0e 0283 add.w r2, lr, r3, lsl #2
  61896. 8033192: f852 2c80 ldr.w r2, [r2, #-128]
  61897. 8033196: f840 2023 str.w r2, [r0, r3, lsl #2]
  61898. if (vb != NULL)
  61899. {
  61900. u8_t i = oid_value.len;
  61901. s32_t *vptr = (s32_t*)vb->value;
  61902. while(i > 0)
  61903. 803319a: 2b00 cmp r3, #0
  61904. 803319c: d1f3 bne.n 8033186 <snmp_pdu_dec_varbindlist+0x206>
  61905. {
  61906. i--;
  61907. vptr[i] = oid_value.id[i];
  61908. }
  61909. snmp_varbind_tail_add(&m_stat->invb, vb);
  61910. 803319e: f505 7080 add.w r0, r5, #256 ; 0x100
  61911. 80331a2: f7ff fb41 bl 8032828 <snmp_varbind_tail_add>
  61912. 80331a6: e022 b.n 80331ee <snmp_pdu_dec_varbindlist+0x26e>
  61913. derr = ERR_ARG;
  61914. }
  61915. }
  61916. break;
  61917. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
  61918. if (len == 4)
  61919. 80331a8: f8bd 200c ldrh.w r2, [sp, #12]
  61920. 80331ac: 2a04 cmp r2, #4
  61921. 80331ae: f47f af2b bne.w 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61922. {
  61923. /* must be exactly 4 octets! */
  61924. vb = snmp_varbind_alloc(&oid, type, 4);
  61925. 80331b2: a804 add r0, sp, #16
  61926. 80331b4: f7ff fa8c bl 80326d0 <snmp_varbind_alloc>
  61927. if (vb != NULL)
  61928. 80331b8: 4683 mov fp, r0
  61929. 80331ba: 2800 cmp r0, #0
  61930. 80331bc: f43f af24 beq.w 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61931. {
  61932. derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, (u8_t*)vb->value);
  61933. 80331c0: f89d 100a ldrb.w r1, [sp, #10]
  61934. 80331c4: 7c43 ldrb r3, [r0, #17]
  61935. 80331c6: 6940 ldr r0, [r0, #20]
  61936. 80331c8: f8bd 200c ldrh.w r2, [sp, #12]
  61937. 80331cc: 9000 str r0, [sp, #0]
  61938. 80331ce: 3101 adds r1, #1
  61939. 80331d0: 4441 add r1, r8
  61940. 80331d2: 4620 mov r0, r4
  61941. 80331d4: b289 uxth r1, r1
  61942. 80331d6: f7fd fa05 bl 80305e4 <snmp_asn1_dec_raw>
  61943. 80331da: 4682 mov sl, r0
  61944. snmp_varbind_tail_add(&m_stat->invb, vb);
  61945. 80331dc: 4659 mov r1, fp
  61946. 80331de: f505 7080 add.w r0, r5, #256 ; 0x100
  61947. 80331e2: f7ff fb21 bl 8032828 <snmp_varbind_tail_add>
  61948. break;
  61949. default:
  61950. derr = ERR_ARG;
  61951. break;
  61952. }
  61953. if (derr != ERR_OK)
  61954. 80331e6: f1ba 0f00 cmp.w sl, #0
  61955. 80331ea: f47f af0d bne.w 8033008 <snmp_pdu_dec_varbindlist+0x88>
  61956. snmp_inc_snmpinasnparseerrs();
  61957. /* free varbinds (if available) */
  61958. snmp_varbind_list_free(&m_stat->invb);
  61959. return ERR_ARG;
  61960. }
  61961. ofs += (1 + len_octets + len);
  61962. 80331ee: f8bd 200c ldrh.w r2, [sp, #12]
  61963. 80331f2: f89d 300a ldrb.w r3, [sp, #10]
  61964. 80331f6: 1c51 adds r1, r2, #1
  61965. 80331f8: 1859 adds r1, r3, r1
  61966. 80331fa: 4488 add r8, r1
  61967. vb_len -= (1 + len_octets + len);
  61968. 80331fc: 8831 ldrh r1, [r6, #0]
  61969. 80331fe: 43db mvns r3, r3
  61970. 8033200: 1a8a subs r2, r1, r2
  61971. 8033202: 18d3 adds r3, r2, r3
  61972. snmp_inc_snmpinasnparseerrs();
  61973. /* free varbinds (if available) */
  61974. snmp_varbind_list_free(&m_stat->invb);
  61975. return ERR_ARG;
  61976. }
  61977. ofs += (1 + len_octets + len);
  61978. 8033204: fa1f f888 uxth.w r8, r8
  61979. vb_len -= (1 + len_octets + len);
  61980. 8033208: 8033 strh r3, [r6, #0]
  61981. /* start with empty list */
  61982. m_stat->invb.count = 0;
  61983. m_stat->invb.head = NULL;
  61984. m_stat->invb.tail = NULL;
  61985. while (vb_len > 0)
  61986. 803320a: 8833 ldrh r3, [r6, #0]
  61987. 803320c: 2b00 cmp r3, #0
  61988. 803320e: f47f aee3 bne.w 8032fd8 <snmp_pdu_dec_varbindlist+0x58>
  61989. }
  61990. ofs += (1 + len_octets + len);
  61991. vb_len -= (1 + len_octets + len);
  61992. }
  61993. if (m_stat->rt == SNMP_ASN1_PDU_SET_REQ)
  61994. 8033212: 7aab ldrb r3, [r5, #10]
  61995. 8033214: f895 0108 ldrb.w r0, [r5, #264] ; 0x108
  61996. 8033218: 2b03 cmp r3, #3
  61997. 803321a: d102 bne.n 8033222 <snmp_pdu_dec_varbindlist+0x2a2>
  61998. {
  61999. snmp_add_snmpintotalsetvars(m_stat->invb.count);
  62000. 803321c: f7fe fe26 bl 8031e6c <snmp_add_snmpintotalsetvars>
  62001. 8033220: e001 b.n 8033226 <snmp_pdu_dec_varbindlist+0x2a6>
  62002. }
  62003. else
  62004. {
  62005. snmp_add_snmpintotalreqvars(m_stat->invb.count);
  62006. 8033222: f7fe fe1b bl 8031e5c <snmp_add_snmpintotalreqvars>
  62007. }
  62008. *ofs_ret = ofs;
  62009. 8033226: f8a9 8000 strh.w r8, [r9]
  62010. return ERR_OK;
  62011. 803322a: 2000 movs r0, #0
  62012. }
  62013. 803322c: b240 sxtb r0, r0
  62014. 803322e: b047 add sp, #284 ; 0x11c
  62015. 8033230: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  62016. 08033234 <snmp_recv>:
  62017. /* lwIP UDP receive callback function */
  62018. static void
  62019. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  62020. {
  62021. 8033234: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  62022. LWIP_UNUSED_ARG(arg);
  62023. /* traverse input message process list, look for SNMP_MSG_EMPTY */
  62024. msg_ps = &msg_input_list[0];
  62025. req_idx = 0;
  62026. while ((req_idx < SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY))
  62027. 8033238: 4da3 ldr r5, [pc, #652] ; (80334c8 <snmp_recv+0x294>)
  62028. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  62029. {
  62030. volatile struct snmp_msg_pstat *msg_ps;
  62031. u8_t req_idx;
  62032. err_t err_ret;
  62033. u16_t payload_len = p->tot_len;
  62034. 803323a: 8917 ldrh r7, [r2, #8]
  62035. LWIP_UNUSED_ARG(arg);
  62036. /* traverse input message process list, look for SNMP_MSG_EMPTY */
  62037. msg_ps = &msg_input_list[0];
  62038. req_idx = 0;
  62039. while ((req_idx < SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY))
  62040. 803323c: f895 605a ldrb.w r6, [r5, #90] ; 0x5a
  62041. /* lwIP UDP receive callback function */
  62042. static void
  62043. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  62044. {
  62045. 8033240: b087 sub sp, #28
  62046. 8033242: 4699 mov r9, r3
  62047. volatile struct snmp_msg_pstat *msg_ps;
  62048. u8_t req_idx;
  62049. err_t err_ret;
  62050. u16_t payload_len = p->tot_len;
  62051. u16_t payload_ofs = 0;
  62052. u16_t varbind_ofs = 0;
  62053. 8033244: 2300 movs r3, #0
  62054. /* lwIP UDP receive callback function */
  62055. static void
  62056. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  62057. {
  62058. 8033246: 4688 mov r8, r1
  62059. 8033248: 4614 mov r4, r2
  62060. volatile struct snmp_msg_pstat *msg_ps;
  62061. u8_t req_idx;
  62062. err_t err_ret;
  62063. u16_t payload_len = p->tot_len;
  62064. u16_t payload_ofs = 0;
  62065. u16_t varbind_ofs = 0;
  62066. 803324a: f8ad 3010 strh.w r3, [sp, #16]
  62067. LWIP_UNUSED_ARG(arg);
  62068. /* traverse input message process list, look for SNMP_MSG_EMPTY */
  62069. msg_ps = &msg_input_list[0];
  62070. req_idx = 0;
  62071. while ((req_idx < SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY))
  62072. 803324e: 2e00 cmp r6, #0
  62073. 8033250: f000 81aa beq.w 80335a8 <snmp_recv+0x374>
  62074. msg_ps++;
  62075. }
  62076. if (req_idx == SNMP_CONCURRENT_REQUESTS)
  62077. {
  62078. /* exceeding number of concurrent requests */
  62079. pbuf_free(p);
  62080. 8033254: 4620 mov r0, r4
  62081. 8033256: f7f9 feeb bl 802d030 <pbuf_free>
  62082. 803325a: e1d6 b.n 803360a <snmp_recv+0x3d6>
  62083. ofs_base = ofs;
  62084. snmp_asn1_dec_type(p, ofs, &type);
  62085. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  62086. if ((derr != ERR_OK) ||
  62087. (pdu_len != (1 + len_octets + len)) ||
  62088. 803325c: f89d 600e ldrb.w r6, [sp, #14]
  62089. 8033260: f8bd 3012 ldrh.w r3, [sp, #18]
  62090. 8033264: 1c75 adds r5, r6, #1
  62091. 8033266: 18eb adds r3, r5, r3
  62092. s32_t version;
  62093. ofs_base = ofs;
  62094. snmp_asn1_dec_type(p, ofs, &type);
  62095. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  62096. if ((derr != ERR_OK) ||
  62097. 8033268: 429f cmp r7, r3
  62098. 803326a: f040 80c4 bne.w 80333f6 <snmp_recv+0x1c2>
  62099. (pdu_len != (1 + len_octets + len)) ||
  62100. 803326e: f89d 300f ldrb.w r3, [sp, #15]
  62101. 8033272: 2b30 cmp r3, #48 ; 0x30
  62102. 8033274: d000 beq.n 8033278 <snmp_recv+0x44>
  62103. 8033276: e0be b.n 80333f6 <snmp_recv+0x1c2>
  62104. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
  62105. {
  62106. snmp_inc_snmpinasnparseerrs();
  62107. return ERR_ARG;
  62108. }
  62109. ofs += (1 + len_octets);
  62110. 8033278: b2ad uxth r5, r5
  62111. snmp_asn1_dec_type(p, ofs, &type);
  62112. 803327a: 4629 mov r1, r5
  62113. 803327c: f10d 020f add.w r2, sp, #15
  62114. 8033280: 4620 mov r0, r4
  62115. 8033282: f7fc ffcf bl 8030224 <snmp_asn1_dec_type>
  62116. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  62117. 8033286: 4620 mov r0, r4
  62118. 8033288: 1cb1 adds r1, r6, #2
  62119. 803328a: f10d 020e add.w r2, sp, #14
  62120. 803328e: f10d 0312 add.w r3, sp, #18
  62121. 8033292: f7fc ffdc bl 803024e <snmp_asn1_dec_length>
  62122. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  62123. 8033296: 2800 cmp r0, #0
  62124. 8033298: f040 80ad bne.w 80333f6 <snmp_recv+0x1c2>
  62125. 803329c: f89d 300f ldrb.w r3, [sp, #15]
  62126. 80332a0: 2b02 cmp r3, #2
  62127. 80332a2: f040 80a8 bne.w 80333f6 <snmp_recv+0x1c2>
  62128. {
  62129. /* can't decode or no integer (version) */
  62130. snmp_inc_snmpinasnparseerrs();
  62131. return ERR_ARG;
  62132. }
  62133. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &version);
  62134. 80332a6: f89d 100e ldrb.w r1, [sp, #14]
  62135. 80332aa: f8bd 2012 ldrh.w r2, [sp, #18]
  62136. 80332ae: 3101 adds r1, #1
  62137. 80332b0: 4620 mov r0, r4
  62138. 80332b2: 1869 adds r1, r5, r1
  62139. 80332b4: ab05 add r3, sp, #20
  62140. 80332b6: f7fd f8a0 bl 80303fa <snmp_asn1_dec_s32t>
  62141. if (derr != ERR_OK)
  62142. 80332ba: 2800 cmp r0, #0
  62143. 80332bc: f040 809b bne.w 80333f6 <snmp_recv+0x1c2>
  62144. {
  62145. /* can't decode */
  62146. snmp_inc_snmpinasnparseerrs();
  62147. return ERR_ARG;
  62148. }
  62149. if (version != 0)
  62150. 80332c0: 9b05 ldr r3, [sp, #20]
  62151. 80332c2: b113 cbz r3, 80332ca <snmp_recv+0x96>
  62152. {
  62153. /* not version 1 */
  62154. snmp_inc_snmpinbadversions();
  62155. 80332c4: f7fe fd8a bl 8031ddc <snmp_inc_snmpinbadversions>
  62156. 80332c8: e7c4 b.n 8033254 <snmp_recv+0x20>
  62157. return ERR_ARG;
  62158. }
  62159. ofs += (1 + len_octets + len);
  62160. 80332ca: f89d 200e ldrb.w r2, [sp, #14]
  62161. 80332ce: f8bd 3012 ldrh.w r3, [sp, #18]
  62162. 80332d2: 18d3 adds r3, r2, r3
  62163. 80332d4: 18ed adds r5, r5, r3
  62164. 80332d6: b2ad uxth r5, r5
  62165. 80332d8: 1c6e adds r6, r5, #1
  62166. 80332da: b2b6 uxth r6, r6
  62167. snmp_asn1_dec_type(p, ofs, &type);
  62168. 80332dc: 4631 mov r1, r6
  62169. 80332de: f10d 020f add.w r2, sp, #15
  62170. 80332e2: 4620 mov r0, r4
  62171. 80332e4: f7fc ff9e bl 8030224 <snmp_asn1_dec_type>
  62172. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  62173. 80332e8: 1ca9 adds r1, r5, #2
  62174. 80332ea: 4620 mov r0, r4
  62175. 80332ec: b289 uxth r1, r1
  62176. 80332ee: f10d 020e add.w r2, sp, #14
  62177. 80332f2: f10d 0312 add.w r3, sp, #18
  62178. 80332f6: f7fc ffaa bl 803024e <snmp_asn1_dec_length>
  62179. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR)))
  62180. 80332fa: 2800 cmp r0, #0
  62181. 80332fc: d17b bne.n 80333f6 <snmp_recv+0x1c2>
  62182. 80332fe: f89d 300f ldrb.w r3, [sp, #15]
  62183. 8033302: 2b04 cmp r3, #4
  62184. 8033304: d177 bne.n 80333f6 <snmp_recv+0x1c2>
  62185. {
  62186. /* can't decode or no octet string (community) */
  62187. snmp_inc_snmpinasnparseerrs();
  62188. return ERR_ARG;
  62189. }
  62190. derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, SNMP_COMMUNITY_STR_LEN, m_stat->community);
  62191. 8033306: f89d 100e ldrb.w r1, [sp, #14]
  62192. 803330a: 4d70 ldr r5, [pc, #448] ; (80334cc <snmp_recv+0x298>)
  62193. 803330c: f8bd 2012 ldrh.w r2, [sp, #18]
  62194. 8033310: 9500 str r5, [sp, #0]
  62195. 8033312: 3101 adds r1, #1
  62196. 8033314: 1871 adds r1, r6, r1
  62197. 8033316: 4620 mov r0, r4
  62198. 8033318: b289 uxth r1, r1
  62199. 803331a: 2340 movs r3, #64 ; 0x40
  62200. 803331c: f7fd f962 bl 80305e4 <snmp_asn1_dec_raw>
  62201. if (derr != ERR_OK)
  62202. 8033320: 2800 cmp r0, #0
  62203. 8033322: d168 bne.n 80333f6 <snmp_recv+0x1c2>
  62204. {
  62205. snmp_inc_snmpinasnparseerrs();
  62206. return ERR_ARG;
  62207. }
  62208. /* add zero terminator */
  62209. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  62210. 8033324: f8bd 3012 ldrh.w r3, [sp, #18]
  62211. m_stat->community[len] = 0;
  62212. 8033328: f1a5 0218 sub.w r2, r5, #24
  62213. {
  62214. snmp_inc_snmpinasnparseerrs();
  62215. return ERR_ARG;
  62216. }
  62217. /* add zero terminator */
  62218. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  62219. 803332c: 2b40 cmp r3, #64 ; 0x40
  62220. 803332e: bf28 it cs
  62221. 8033330: 2340 movcs r3, #64 ; 0x40
  62222. m_stat->community[len] = 0;
  62223. 8033332: 18d1 adds r1, r2, r3
  62224. snmp_inc_snmpinbadcommunitynames();
  62225. snmp_authfail_trap();
  62226. return ERR_ARG;
  62227. }*/
  62228. ofs += (1 + len_octets + len);
  62229. 8033334: f89d 200e ldrb.w r2, [sp, #14]
  62230. {
  62231. snmp_inc_snmpinasnparseerrs();
  62232. return ERR_ARG;
  62233. }
  62234. /* add zero terminator */
  62235. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  62236. 8033338: f8ad 3012 strh.w r3, [sp, #18]
  62237. m_stat->community[len] = 0;
  62238. m_stat->com_strlen = (u8_t)len;
  62239. 803333c: f885 3041 strb.w r3, [r5, #65] ; 0x41
  62240. snmp_inc_snmpinbadcommunitynames();
  62241. snmp_authfail_trap();
  62242. return ERR_ARG;
  62243. }*/
  62244. ofs += (1 + len_octets + len);
  62245. 8033340: 189b adds r3, r3, r2
  62246. 8033342: 18f6 adds r6, r6, r3
  62247. 8033344: b2b6 uxth r6, r6
  62248. 8033346: f106 0801 add.w r8, r6, #1
  62249. 803334a: fa1f f888 uxth.w r8, r8
  62250. snmp_inc_snmpinasnparseerrs();
  62251. return ERR_ARG;
  62252. }
  62253. /* add zero terminator */
  62254. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  62255. m_stat->community[len] = 0;
  62256. 803334e: 7608 strb r0, [r1, #24]
  62257. snmp_authfail_trap();
  62258. return ERR_ARG;
  62259. }*/
  62260. ofs += (1 + len_octets + len);
  62261. snmp_asn1_dec_type(p, ofs, &type);
  62262. 8033350: f10d 020f add.w r2, sp, #15
  62263. 8033354: 4641 mov r1, r8
  62264. 8033356: 4620 mov r0, r4
  62265. 8033358: f7fc ff64 bl 8030224 <snmp_asn1_dec_type>
  62266. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  62267. 803335c: 1cb1 adds r1, r6, #2
  62268. 803335e: 4620 mov r0, r4
  62269. 8033360: b289 uxth r1, r1
  62270. 8033362: f10d 020e add.w r2, sp, #14
  62271. 8033366: f10d 0312 add.w r3, sp, #18
  62272. 803336a: f7fc ff70 bl 803024e <snmp_asn1_dec_length>
  62273. if (derr != ERR_OK)
  62274. 803336e: 2800 cmp r0, #0
  62275. 8033370: d141 bne.n 80333f6 <snmp_recv+0x1c2>
  62276. return ERR_ARG;
  62277. }
  62278. /* FIX for write/read communuty */
  62279. /* GetRequest PDU */
  62280. if (type == (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ))
  62281. 8033372: f89d 300f ldrb.w r3, [sp, #15]
  62282. 8033376: 2ba0 cmp r3, #160 ; 0xa0
  62283. 8033378: d10f bne.n 803339a <snmp_recv+0x166>
  62284. {
  62285. if (strncmp(sSettings.sSnmp.readCommunity, (const char*)m_stat->community, strlen(sSettings.sSnmp.readCommunity)) != 0
  62286. 803337a: 4855 ldr r0, [pc, #340] ; (80334d0 <snmp_recv+0x29c>)
  62287. 803337c: f7ee fd78 bl 8021e70 <strlen>
  62288. 8033380: 4629 mov r1, r5
  62289. 8033382: 4602 mov r2, r0
  62290. 8033384: 4852 ldr r0, [pc, #328] ; (80334d0 <snmp_recv+0x29c>)
  62291. 8033386: f7ee fdd5 bl 8021f34 <strncmp>
  62292. 803338a: b120 cbz r0, 8033396 <snmp_recv+0x162>
  62293. || (strlen(sSettings.sSnmp.readCommunity) != strlen((const char*)m_stat->community)) )
  62294. {
  62295. snmp_inc_snmpinbadcommunitynames();
  62296. 803338c: f7fe fd2e bl 8031dec <snmp_inc_snmpinbadcommunitynames>
  62297. snmp_authfail_trap();
  62298. 8033390: f000 fd7e bl 8033e90 <snmp_authfail_trap>
  62299. 8033394: e75e b.n 8033254 <snmp_recv+0x20>
  62300. /* FIX for write/read communuty */
  62301. /* GetRequest PDU */
  62302. if (type == (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ))
  62303. {
  62304. if (strncmp(sSettings.sSnmp.readCommunity, (const char*)m_stat->community, strlen(sSettings.sSnmp.readCommunity)) != 0
  62305. || (strlen(sSettings.sSnmp.readCommunity) != strlen((const char*)m_stat->community)) )
  62306. 8033396: 484e ldr r0, [pc, #312] ; (80334d0 <snmp_recv+0x29c>)
  62307. 8033398: e00c b.n 80333b4 <snmp_recv+0x180>
  62308. snmp_authfail_trap();
  62309. return ERR_ARG;
  62310. }
  62311. }
  62312. /* SetRequest PDU */
  62313. else if (type == (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ))
  62314. 803339a: 2ba3 cmp r3, #163 ; 0xa3
  62315. 803339c: d112 bne.n 80333c4 <snmp_recv+0x190>
  62316. {
  62317. if (strncmp(sSettings.sSnmp.writeCommunity, (const char*)m_stat->community, strlen(sSettings.sSnmp.writeCommunity)) != 0
  62318. 803339e: 484d ldr r0, [pc, #308] ; (80334d4 <snmp_recv+0x2a0>)
  62319. 80333a0: f7ee fd66 bl 8021e70 <strlen>
  62320. 80333a4: 4629 mov r1, r5
  62321. 80333a6: 4602 mov r2, r0
  62322. 80333a8: 484a ldr r0, [pc, #296] ; (80334d4 <snmp_recv+0x2a0>)
  62323. 80333aa: f7ee fdc3 bl 8021f34 <strncmp>
  62324. 80333ae: 2800 cmp r0, #0
  62325. 80333b0: d1ec bne.n 803338c <snmp_recv+0x158>
  62326. || (strlen(sSettings.sSnmp.writeCommunity) != strlen((const char*)m_stat->community)) )
  62327. 80333b2: 4848 ldr r0, [pc, #288] ; (80334d4 <snmp_recv+0x2a0>)
  62328. 80333b4: f7ee fd5c bl 8021e70 <strlen>
  62329. 80333b8: 4606 mov r6, r0
  62330. 80333ba: 4628 mov r0, r5
  62331. 80333bc: f7ee fd58 bl 8021e70 <strlen>
  62332. 80333c0: 4286 cmp r6, r0
  62333. 80333c2: d1e3 bne.n 803338c <snmp_recv+0x158>
  62334. snmp_authfail_trap();
  62335. return ERR_ARG;
  62336. }
  62337. }
  62338. switch(type)
  62339. 80333c4: f89d 300f ldrb.w r3, [sp, #15]
  62340. 80333c8: 3ba0 subs r3, #160 ; 0xa0
  62341. 80333ca: 2b04 cmp r3, #4
  62342. 80333cc: d813 bhi.n 80333f6 <snmp_recv+0x1c2>
  62343. 80333ce: e8df f003 tbb [pc, r3]
  62344. 80333d2: 0603 .short 0x0603
  62345. 80333d4: 0c09 .short 0x0c09
  62346. 80333d6: 0f .byte 0x0f
  62347. 80333d7: 00 .byte 0x00
  62348. {
  62349. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ):
  62350. // GetRequest PDU
  62351. snmp_inc_snmpingetrequests();
  62352. 80333d8: f7fe fd50 bl 8031e7c <snmp_inc_snmpingetrequests>
  62353. 80333dc: e100 b.n 80335e0 <snmp_recv+0x3ac>
  62354. derr = ERR_OK;
  62355. break;
  62356. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_NEXT_REQ):
  62357. // GetNextRequest PDU
  62358. snmp_inc_snmpingetnexts();
  62359. 80333de: f7fe fd55 bl 8031e8c <snmp_inc_snmpingetnexts>
  62360. 80333e2: e0fd b.n 80335e0 <snmp_recv+0x3ac>
  62361. derr = ERR_OK;
  62362. break;
  62363. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP):
  62364. // GetResponse PDU
  62365. snmp_inc_snmpingetresponses();
  62366. 80333e4: f7fe fd62 bl 8031eac <snmp_inc_snmpingetresponses>
  62367. 80333e8: e734 b.n 8033254 <snmp_recv+0x20>
  62368. derr = ERR_ARG;
  62369. break;
  62370. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ):
  62371. // SetRequest PDU
  62372. snmp_inc_snmpinsetrequests();
  62373. 80333ea: f7fe fd57 bl 8031e9c <snmp_inc_snmpinsetrequests>
  62374. 80333ee: e0f7 b.n 80335e0 <snmp_recv+0x3ac>
  62375. derr = ERR_OK;
  62376. break;
  62377. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP):
  62378. // Trap PDU
  62379. snmp_inc_snmpintraps();
  62380. 80333f0: f7fe fd64 bl 8031ebc <snmp_inc_snmpintraps>
  62381. 80333f4: e72e b.n 8033254 <snmp_recv+0x20>
  62382. derr = ERR_ARG;
  62383. break;
  62384. default:
  62385. snmp_inc_snmpinasnparseerrs();
  62386. 80333f6: f7fe fd01 bl 8031dfc <snmp_inc_snmpinasnparseerrs>
  62387. 80333fa: e72b b.n 8033254 <snmp_recv+0x20>
  62388. {
  62389. /* decoded PDU length does not equal actual payload length */
  62390. snmp_inc_snmpinasnparseerrs();
  62391. return ERR_ARG;
  62392. }
  62393. snmp_asn1_dec_type(p, ofs, &type);
  62394. 80333fc: 4631 mov r1, r6
  62395. 80333fe: f10d 020f add.w r2, sp, #15
  62396. 8033402: 4620 mov r0, r4
  62397. 8033404: f7fc ff0e bl 8030224 <snmp_asn1_dec_type>
  62398. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  62399. 8033408: f108 0102 add.w r1, r8, #2
  62400. 803340c: 4620 mov r0, r4
  62401. 803340e: b289 uxth r1, r1
  62402. 8033410: f10d 020e add.w r2, sp, #14
  62403. 8033414: f10d 0312 add.w r3, sp, #18
  62404. 8033418: f7fc ff19 bl 803024e <snmp_asn1_dec_length>
  62405. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  62406. 803341c: 2800 cmp r0, #0
  62407. 803341e: d1ea bne.n 80333f6 <snmp_recv+0x1c2>
  62408. 8033420: f89d 300f ldrb.w r3, [sp, #15]
  62409. 8033424: 2b02 cmp r3, #2
  62410. 8033426: d1e6 bne.n 80333f6 <snmp_recv+0x1c2>
  62411. {
  62412. /* can't decode or no integer (request ID) */
  62413. snmp_inc_snmpinasnparseerrs();
  62414. return ERR_ARG;
  62415. }
  62416. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->rid);
  62417. 8033428: f89d 100e ldrb.w r1, [sp, #14]
  62418. 803342c: f8bd 2012 ldrh.w r2, [sp, #18]
  62419. 8033430: 3101 adds r1, #1
  62420. 8033432: 1871 adds r1, r6, r1
  62421. 8033434: 4620 mov r0, r4
  62422. 8033436: b289 uxth r1, r1
  62423. 8033438: f105 030c add.w r3, r5, #12
  62424. 803343c: f7fc ffdd bl 80303fa <snmp_asn1_dec_s32t>
  62425. if (derr != ERR_OK)
  62426. 8033440: 2800 cmp r0, #0
  62427. 8033442: d1d8 bne.n 80333f6 <snmp_recv+0x1c2>
  62428. {
  62429. /* can't decode */
  62430. snmp_inc_snmpinasnparseerrs();
  62431. return ERR_ARG;
  62432. }
  62433. ofs += (1 + len_octets + len);
  62434. 8033444: f89d 200e ldrb.w r2, [sp, #14]
  62435. 8033448: f8bd 3012 ldrh.w r3, [sp, #18]
  62436. 803344c: 18d3 adds r3, r2, r3
  62437. 803344e: 18f6 adds r6, r6, r3
  62438. 8033450: b2b6 uxth r6, r6
  62439. 8033452: 1c77 adds r7, r6, #1
  62440. 8033454: b2bf uxth r7, r7
  62441. snmp_asn1_dec_type(p, ofs, &type);
  62442. 8033456: 4639 mov r1, r7
  62443. 8033458: f10d 020f add.w r2, sp, #15
  62444. 803345c: 4620 mov r0, r4
  62445. 803345e: f7fc fee1 bl 8030224 <snmp_asn1_dec_type>
  62446. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  62447. 8033462: 1cb1 adds r1, r6, #2
  62448. 8033464: 4620 mov r0, r4
  62449. 8033466: b289 uxth r1, r1
  62450. 8033468: f10d 020e add.w r2, sp, #14
  62451. 803346c: f10d 0312 add.w r3, sp, #18
  62452. 8033470: f7fc feed bl 803024e <snmp_asn1_dec_length>
  62453. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  62454. 8033474: 2800 cmp r0, #0
  62455. 8033476: d1be bne.n 80333f6 <snmp_recv+0x1c2>
  62456. 8033478: f89d 300f ldrb.w r3, [sp, #15]
  62457. 803347c: 2b02 cmp r3, #2
  62458. 803347e: d1ba bne.n 80333f6 <snmp_recv+0x1c2>
  62459. snmp_inc_snmpinasnparseerrs();
  62460. return ERR_ARG;
  62461. }
  62462. /* must be noError (0) for incoming requests.
  62463. log errors for mib-2 completeness and for debug purposes */
  62464. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_status);
  62465. 8033480: f89d 100e ldrb.w r1, [sp, #14]
  62466. 8033484: f8bd 2012 ldrh.w r2, [sp, #18]
  62467. 8033488: 3101 adds r1, #1
  62468. 803348a: 1879 adds r1, r7, r1
  62469. 803348c: 4620 mov r0, r4
  62470. 803348e: b289 uxth r1, r1
  62471. 8033490: f105 0310 add.w r3, r5, #16
  62472. 8033494: f7fc ffb1 bl 80303fa <snmp_asn1_dec_s32t>
  62473. if (derr != ERR_OK)
  62474. 8033498: 2800 cmp r0, #0
  62475. 803349a: d1ac bne.n 80333f6 <snmp_recv+0x1c2>
  62476. {
  62477. /* can't decode */
  62478. snmp_inc_snmpinasnparseerrs();
  62479. return ERR_ARG;
  62480. }
  62481. switch (m_stat->error_status)
  62482. 803349c: 692b ldr r3, [r5, #16]
  62483. 803349e: 3b01 subs r3, #1
  62484. 80334a0: 2b04 cmp r3, #4
  62485. 80334a2: d81b bhi.n 80334dc <snmp_recv+0x2a8>
  62486. 80334a4: e8df f003 tbb [pc, r3]
  62487. 80334a8: 0c090603 .word 0x0c090603
  62488. 80334ac: 18 .byte 0x18
  62489. 80334ad: 00 .byte 0x00
  62490. {
  62491. case SNMP_ES_TOOBIG:
  62492. snmp_inc_snmpintoobigs();
  62493. 80334ae: f7fe fcad bl 8031e0c <snmp_inc_snmpintoobigs>
  62494. 80334b2: e013 b.n 80334dc <snmp_recv+0x2a8>
  62495. break;
  62496. case SNMP_ES_NOSUCHNAME:
  62497. snmp_inc_snmpinnosuchnames();
  62498. 80334b4: f7fe fcb2 bl 8031e1c <snmp_inc_snmpinnosuchnames>
  62499. 80334b8: e010 b.n 80334dc <snmp_recv+0x2a8>
  62500. break;
  62501. case SNMP_ES_BADVALUE:
  62502. snmp_inc_snmpinbadvalues();
  62503. 80334ba: f7fe fcb7 bl 8031e2c <snmp_inc_snmpinbadvalues>
  62504. 80334be: e00d b.n 80334dc <snmp_recv+0x2a8>
  62505. break;
  62506. case SNMP_ES_READONLY:
  62507. snmp_inc_snmpinreadonlys();
  62508. 80334c0: f7fe fcbc bl 8031e3c <snmp_inc_snmpinreadonlys>
  62509. 80334c4: e00a b.n 80334dc <snmp_recv+0x2a8>
  62510. 80334c6: bf00 nop
  62511. 80334c8: 20011010 .word 0x20011010
  62512. 80334cc: 20011028 .word 0x20011028
  62513. 80334d0: 2000e9e8 .word 0x2000e9e8
  62514. 80334d4: 2000e9fc .word 0x2000e9fc
  62515. break;
  62516. case SNMP_ES_GENERROR:
  62517. snmp_inc_snmpingenerrs();
  62518. 80334d8: f7fe fcb8 bl 8031e4c <snmp_inc_snmpingenerrs>
  62519. break;
  62520. }
  62521. ofs += (1 + len_octets + len);
  62522. 80334dc: f89d 200e ldrb.w r2, [sp, #14]
  62523. 80334e0: f8bd 3012 ldrh.w r3, [sp, #18]
  62524. 80334e4: 18d3 adds r3, r2, r3
  62525. 80334e6: 18ff adds r7, r7, r3
  62526. 80334e8: b2bf uxth r7, r7
  62527. 80334ea: 1c7d adds r5, r7, #1
  62528. 80334ec: b2ad uxth r5, r5
  62529. snmp_asn1_dec_type(p, ofs, &type);
  62530. 80334ee: 4629 mov r1, r5
  62531. 80334f0: f10d 020f add.w r2, sp, #15
  62532. 80334f4: 4620 mov r0, r4
  62533. 80334f6: f7fc fe95 bl 8030224 <snmp_asn1_dec_type>
  62534. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  62535. 80334fa: 1cb9 adds r1, r7, #2
  62536. 80334fc: 4620 mov r0, r4
  62537. 80334fe: b289 uxth r1, r1
  62538. 8033500: f10d 020e add.w r2, sp, #14
  62539. 8033504: f10d 0312 add.w r3, sp, #18
  62540. 8033508: f7fc fea1 bl 803024e <snmp_asn1_dec_length>
  62541. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  62542. 803350c: 2800 cmp r0, #0
  62543. 803350e: f47f af72 bne.w 80333f6 <snmp_recv+0x1c2>
  62544. 8033512: f89d 300f ldrb.w r3, [sp, #15]
  62545. 8033516: 2b02 cmp r3, #2
  62546. 8033518: f47f af6d bne.w 80333f6 <snmp_recv+0x1c2>
  62547. snmp_inc_snmpinasnparseerrs();
  62548. return ERR_ARG;
  62549. }
  62550. /* must be 0 for incoming requests.
  62551. decode anyway to catch bad integers (and dirty tricks) */
  62552. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_index);
  62553. 803351c: f89d 100e ldrb.w r1, [sp, #14]
  62554. 8033520: f8bd 2012 ldrh.w r2, [sp, #18]
  62555. 8033524: 4b3a ldr r3, [pc, #232] ; (8033610 <snmp_recv+0x3dc>)
  62556. 8033526: 3101 adds r1, #1
  62557. 8033528: 1869 adds r1, r5, r1
  62558. 803352a: 4620 mov r0, r4
  62559. 803352c: b289 uxth r1, r1
  62560. 803352e: f7fc ff64 bl 80303fa <snmp_asn1_dec_s32t>
  62561. if (derr != ERR_OK)
  62562. 8033532: 2800 cmp r0, #0
  62563. 8033534: f47f af5f bne.w 80333f6 <snmp_recv+0x1c2>
  62564. {
  62565. /* can't decode */
  62566. snmp_inc_snmpinasnparseerrs();
  62567. return ERR_ARG;
  62568. }
  62569. ofs += (1 + len_octets + len);
  62570. 8033538: f8bd 3012 ldrh.w r3, [sp, #18]
  62571. 803353c: f89d 200e ldrb.w r2, [sp, #14]
  62572. 8033540: 3301 adds r3, #1
  62573. 8033542: 189b adds r3, r3, r2
  62574. 8033544: 18ed adds r5, r5, r3
  62575. /* check total length, version, community, pdu type */
  62576. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  62577. /* Only accept requests and requests without error (be robust) */
  62578. /* Reject response and trap headers or error requests as input! */
  62579. if ((err_ret != ERR_OK) ||
  62580. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  62581. 8033546: 4b33 ldr r3, [pc, #204] ; (8033614 <snmp_recv+0x3e0>)
  62582. /* can't decode */
  62583. snmp_inc_snmpinasnparseerrs();
  62584. return ERR_ARG;
  62585. }
  62586. ofs += (1 + len_octets + len);
  62587. *ofs_ret = ofs;
  62588. 8033548: f8ad 5010 strh.w r5, [sp, #16]
  62589. /* check total length, version, community, pdu type */
  62590. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  62591. /* Only accept requests and requests without error (be robust) */
  62592. /* Reject response and trap headers or error requests as input! */
  62593. if ((err_ret != ERR_OK) ||
  62594. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  62595. 803354c: 7a9a ldrb r2, [r3, #10]
  62596. /* check total length, version, community, pdu type */
  62597. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  62598. /* Only accept requests and requests without error (be robust) */
  62599. /* Reject response and trap headers or error requests as input! */
  62600. if ((err_ret != ERR_OK) ||
  62601. 803354e: b132 cbz r2, 803355e <snmp_recv+0x32a>
  62602. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  62603. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  62604. 8033550: 7a9a ldrb r2, [r3, #10]
  62605. /* check total length, version, community, pdu type */
  62606. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  62607. /* Only accept requests and requests without error (be robust) */
  62608. /* Reject response and trap headers or error requests as input! */
  62609. if ((err_ret != ERR_OK) ||
  62610. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  62611. 8033552: 2a01 cmp r2, #1
  62612. 8033554: d003 beq.n 803355e <snmp_recv+0x32a>
  62613. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  62614. (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
  62615. 8033556: 7a9a ldrb r2, [r3, #10]
  62616. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  62617. /* Only accept requests and requests without error (be robust) */
  62618. /* Reject response and trap headers or error requests as input! */
  62619. if ((err_ret != ERR_OK) ||
  62620. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  62621. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  62622. 8033558: 2a03 cmp r2, #3
  62623. 803355a: f47f ae7b bne.w 8033254 <snmp_recv+0x20>
  62624. (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
  62625. ((msg_ps->error_status != SNMP_ES_NOERROR) ||
  62626. 803355e: 691b ldr r3, [r3, #16]
  62627. 8033560: 4d2c ldr r5, [pc, #176] ; (8033614 <snmp_recv+0x3e0>)
  62628. /* Only accept requests and requests without error (be robust) */
  62629. /* Reject response and trap headers or error requests as input! */
  62630. if ((err_ret != ERR_OK) ||
  62631. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  62632. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  62633. (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
  62634. 8033562: 2b00 cmp r3, #0
  62635. 8033564: f47f ae76 bne.w 8033254 <snmp_recv+0x20>
  62636. ((msg_ps->error_status != SNMP_ES_NOERROR) ||
  62637. (msg_ps->error_index != 0)) )
  62638. 8033568: 696b ldr r3, [r5, #20]
  62639. /* Reject response and trap headers or error requests as input! */
  62640. if ((err_ret != ERR_OK) ||
  62641. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  62642. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  62643. (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
  62644. ((msg_ps->error_status != SNMP_ES_NOERROR) ||
  62645. 803356a: 2b00 cmp r3, #0
  62646. 803356c: f47f ae72 bne.w 8033254 <snmp_recv+0x20>
  62647. }
  62648. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv ok, community %s\n", msg_ps->community));
  62649. /* Builds a list of variable bindings. Copy the varbinds from the pbuf
  62650. chain to glue them when these are divided over two or more pbuf's. */
  62651. err_ret = snmp_pdu_dec_varbindlist(p, varbind_ofs, &varbind_ofs, msg_ps);
  62652. 8033570: aa06 add r2, sp, #24
  62653. 8033572: 4620 mov r0, r4
  62654. 8033574: f832 1d08 ldrh.w r1, [r2, #-8]!
  62655. 8033578: 462b mov r3, r5
  62656. 803357a: f7ff fd01 bl 8032f80 <snmp_pdu_dec_varbindlist>
  62657. 803357e: 4606 mov r6, r0
  62658. /* we've decoded the incoming message, release input msg now */
  62659. pbuf_free(p);
  62660. 8033580: 4620 mov r0, r4
  62661. 8033582: f7f9 fd55 bl 802d030 <pbuf_free>
  62662. if ((err_ret != ERR_OK) || (msg_ps->invb.count == 0))
  62663. 8033586: 2e00 cmp r6, #0
  62664. 8033588: d13f bne.n 803360a <snmp_recv+0x3d6>
  62665. 803358a: f895 3108 ldrb.w r3, [r5, #264] ; 0x108
  62666. 803358e: 2b00 cmp r3, #0
  62667. 8033590: d03b beq.n 803360a <snmp_recv+0x3d6>
  62668. }
  62669. msg_ps->error_status = SNMP_ES_NOERROR;
  62670. msg_ps->error_index = 0;
  62671. /* find object for each variable binding */
  62672. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  62673. 8033592: 2301 movs r3, #1
  62674. (errors are only returned for a specific varbind failure) */
  62675. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_dec_varbindlist() failed\n"));
  62676. return;
  62677. }
  62678. msg_ps->error_status = SNMP_ES_NOERROR;
  62679. 8033594: 612e str r6, [r5, #16]
  62680. msg_ps->vb_idx = 0;
  62681. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
  62682. /* handle input event and as much objects as possible in one go */
  62683. snmp_msg_event(req_idx);
  62684. 8033596: 4630 mov r0, r6
  62685. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_dec_varbindlist() failed\n"));
  62686. return;
  62687. }
  62688. msg_ps->error_status = SNMP_ES_NOERROR;
  62689. msg_ps->error_index = 0;
  62690. 8033598: 616e str r6, [r5, #20]
  62691. /* find object for each variable binding */
  62692. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  62693. 803359a: f885 305a strb.w r3, [r5, #90] ; 0x5a
  62694. /* first variable binding from list to inspect */
  62695. msg_ps->vb_idx = 0;
  62696. 803359e: f885 60f8 strb.w r6, [r5, #248] ; 0xf8
  62697. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
  62698. /* handle input event and as much objects as possible in one go */
  62699. snmp_msg_event(req_idx);
  62700. 80335a2: f7ff f94d bl 8032840 <snmp_msg_event>
  62701. 80335a6: e030 b.n 803360a <snmp_recv+0x3d6>
  62702. pbuf_free(p);
  62703. return;
  62704. }
  62705. /* accepting request */
  62706. snmp_inc_snmpinpkts();
  62707. 80335a8: f7fe fc08 bl 8031dbc <snmp_inc_snmpinpkts>
  62708. /* record used 'protocol control block' */
  62709. msg_ps->pcb = pcb;
  62710. /* source address (network order) */
  62711. msg_ps->sip = *addr;
  62712. 80335ac: f8d9 3000 ldr.w r3, [r9]
  62713. }
  62714. /* accepting request */
  62715. snmp_inc_snmpinpkts();
  62716. /* record used 'protocol control block' */
  62717. msg_ps->pcb = pcb;
  62718. 80335b0: f8c5 8000 str.w r8, [r5]
  62719. /* source address (network order) */
  62720. msg_ps->sip = *addr;
  62721. 80335b4: 606b str r3, [r5, #4]
  62722. /* source port (host order (lwIP oddity)) */
  62723. msg_ps->sp = port;
  62724. 80335b6: f8bd 3038 ldrh.w r3, [sp, #56] ; 0x38
  62725. u8_t len_octets;
  62726. u8_t type;
  62727. s32_t version;
  62728. ofs_base = ofs;
  62729. snmp_asn1_dec_type(p, ofs, &type);
  62730. 80335ba: 4631 mov r1, r6
  62731. /* record used 'protocol control block' */
  62732. msg_ps->pcb = pcb;
  62733. /* source address (network order) */
  62734. msg_ps->sip = *addr;
  62735. /* source port (host order (lwIP oddity)) */
  62736. msg_ps->sp = port;
  62737. 80335bc: 812b strh r3, [r5, #8]
  62738. u8_t len_octets;
  62739. u8_t type;
  62740. s32_t version;
  62741. ofs_base = ofs;
  62742. snmp_asn1_dec_type(p, ofs, &type);
  62743. 80335be: f10d 020f add.w r2, sp, #15
  62744. 80335c2: 4620 mov r0, r4
  62745. 80335c4: f7fc fe2e bl 8030224 <snmp_asn1_dec_type>
  62746. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  62747. 80335c8: 4620 mov r0, r4
  62748. 80335ca: 2101 movs r1, #1
  62749. 80335cc: f10d 020e add.w r2, sp, #14
  62750. 80335d0: f10d 0312 add.w r3, sp, #18
  62751. 80335d4: f7fc fe3b bl 803024e <snmp_asn1_dec_length>
  62752. if ((derr != ERR_OK) ||
  62753. 80335d8: 2800 cmp r0, #0
  62754. 80335da: f43f ae3f beq.w 803325c <snmp_recv+0x28>
  62755. 80335de: e70a b.n 80333f6 <snmp_recv+0x1c2>
  62756. if (derr != ERR_OK)
  62757. {
  62758. /* unsupported input PDU for this agent (no parse error) */
  62759. return ERR_ARG;
  62760. }
  62761. m_stat->rt = type & 0x1F;
  62762. 80335e0: f89d 300f ldrb.w r3, [sp, #15]
  62763. 80335e4: 4d0b ldr r5, [pc, #44] ; (8033614 <snmp_recv+0x3e0>)
  62764. 80335e6: f003 031f and.w r3, r3, #31
  62765. 80335ea: 72ab strb r3, [r5, #10]
  62766. ofs += (1 + len_octets);
  62767. 80335ec: f89d 300e ldrb.w r3, [sp, #14]
  62768. 80335f0: 4498 add r8, r3
  62769. 80335f2: fa1f f888 uxth.w r8, r8
  62770. 80335f6: f108 0601 add.w r6, r8, #1
  62771. 80335fa: b2b6 uxth r6, r6
  62772. if (len != (pdu_len - (ofs - ofs_base)))
  62773. 80335fc: f8bd 3012 ldrh.w r3, [sp, #18]
  62774. 8033600: 1bbf subs r7, r7, r6
  62775. 8033602: 42bb cmp r3, r7
  62776. 8033604: f43f aefa beq.w 80333fc <snmp_recv+0x1c8>
  62777. 8033608: e6f5 b.n 80333f6 <snmp_recv+0x1c2>
  62778. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
  62779. /* handle input event and as much objects as possible in one go */
  62780. snmp_msg_event(req_idx);
  62781. }
  62782. 803360a: b007 add sp, #28
  62783. 803360c: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  62784. 8033610: 20011024 .word 0x20011024
  62785. 8033614: 20011010 .word 0x20011010
  62786. 08033618 <snmp_varbind_list_sum>:
  62787. * @param root points to the root of the variable binding list
  62788. * @return the required lenght for encoding the variable bindings
  62789. */
  62790. static u16_t
  62791. snmp_varbind_list_sum(struct snmp_varbind_root *root)
  62792. {
  62793. 8033618: b5f8 push {r3, r4, r5, r6, r7, lr}
  62794. struct snmp_varbind *vb;
  62795. u32_t *uint_ptr;
  62796. s32_t *sint_ptr;
  62797. u16_t tot_len;
  62798. tot_len = 0;
  62799. 803361a: 2500 movs r5, #0
  62800. * @param root points to the root of the variable binding list
  62801. * @return the required lenght for encoding the variable bindings
  62802. */
  62803. static u16_t
  62804. snmp_varbind_list_sum(struct snmp_varbind_root *root)
  62805. {
  62806. 803361c: 4606 mov r6, r0
  62807. u32_t *uint_ptr;
  62808. s32_t *sint_ptr;
  62809. u16_t tot_len;
  62810. tot_len = 0;
  62811. vb = root->tail;
  62812. 803361e: 6844 ldr r4, [r0, #4]
  62813. sint_ptr = (s32_t*)vb->value;
  62814. snmp_asn1_enc_oid_cnt(vb->value_len / sizeof(s32_t), sint_ptr, &vb->vlen);
  62815. break;
  62816. default:
  62817. /* unsupported type */
  62818. vb->vlen = 0;
  62819. 8033620: 462f mov r7, r5
  62820. s32_t *sint_ptr;
  62821. u16_t tot_len;
  62822. tot_len = 0;
  62823. vb = root->tail;
  62824. while ( vb != NULL )
  62825. 8033622: e051 b.n 80336c8 <snmp_varbind_list_sum+0xb0>
  62826. {
  62827. /* encoded value lenght depends on type */
  62828. switch (vb->value_type)
  62829. 8033624: 7c23 ldrb r3, [r4, #16]
  62830. 8033626: 2b06 cmp r3, #6
  62831. 8033628: d020 beq.n 803366c <snmp_varbind_list_sum+0x54>
  62832. 803362a: d805 bhi.n 8033638 <snmp_varbind_list_sum+0x20>
  62833. 803362c: 2b02 cmp r3, #2
  62834. 803362e: d00c beq.n 803364a <snmp_varbind_list_sum+0x32>
  62835. 8033630: d324 bcc.n 803367c <snmp_varbind_list_sum+0x64>
  62836. 8033632: 2b04 cmp r3, #4
  62837. 8033634: d322 bcc.n 803367c <snmp_varbind_list_sum+0x64>
  62838. 8033636: e016 b.n 8033666 <snmp_varbind_list_sum+0x4e>
  62839. 8033638: 2b43 cmp r3, #67 ; 0x43
  62840. 803363a: d803 bhi.n 8033644 <snmp_varbind_list_sum+0x2c>
  62841. 803363c: 2b41 cmp r3, #65 ; 0x41
  62842. 803363e: d20b bcs.n 8033658 <snmp_varbind_list_sum+0x40>
  62843. 8033640: 2b40 cmp r3, #64 ; 0x40
  62844. 8033642: e000 b.n 8033646 <snmp_varbind_list_sum+0x2e>
  62845. 8033644: 2b44 cmp r3, #68 ; 0x44
  62846. 8033646: d119 bne.n 803367c <snmp_varbind_list_sum+0x64>
  62847. 8033648: e00d b.n 8033666 <snmp_varbind_list_sum+0x4e>
  62848. {
  62849. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
  62850. sint_ptr = (s32_t*)vb->value;
  62851. snmp_asn1_enc_s32t_cnt(*sint_ptr, &vb->vlen);
  62852. 803364a: 6963 ldr r3, [r4, #20]
  62853. 803364c: f104 0120 add.w r1, r4, #32
  62854. 8033650: 6818 ldr r0, [r3, #0]
  62855. 8033652: f7fd f81e bl 8030692 <snmp_asn1_enc_s32t_cnt>
  62856. break;
  62857. 8033656: e012 b.n 803367e <snmp_varbind_list_sum+0x66>
  62858. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
  62859. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
  62860. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
  62861. uint_ptr = (u32_t*)vb->value;
  62862. snmp_asn1_enc_u32t_cnt(*uint_ptr, &vb->vlen);
  62863. 8033658: 6963 ldr r3, [r4, #20]
  62864. 803365a: f104 0120 add.w r1, r4, #32
  62865. 803365e: 6818 ldr r0, [r3, #0]
  62866. 8033660: f7fd f802 bl 8030668 <snmp_asn1_enc_u32t_cnt>
  62867. break;
  62868. 8033664: e00b b.n 803367e <snmp_varbind_list_sum+0x66>
  62869. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
  62870. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
  62871. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
  62872. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
  62873. vb->vlen = vb->value_len;
  62874. 8033666: 7c63 ldrb r3, [r4, #17]
  62875. 8033668: 8423 strh r3, [r4, #32]
  62876. break;
  62877. 803366a: e008 b.n 803367e <snmp_varbind_list_sum+0x66>
  62878. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
  62879. sint_ptr = (s32_t*)vb->value;
  62880. snmp_asn1_enc_oid_cnt(vb->value_len / sizeof(s32_t), sint_ptr, &vb->vlen);
  62881. 803366c: 7c60 ldrb r0, [r4, #17]
  62882. 803366e: 6961 ldr r1, [r4, #20]
  62883. 8033670: 0880 lsrs r0, r0, #2
  62884. 8033672: f104 0220 add.w r2, r4, #32
  62885. 8033676: f7fd f821 bl 80306bc <snmp_asn1_enc_oid_cnt>
  62886. break;
  62887. 803367a: e000 b.n 803367e <snmp_varbind_list_sum+0x66>
  62888. default:
  62889. /* unsupported type */
  62890. vb->vlen = 0;
  62891. 803367c: 8427 strh r7, [r4, #32]
  62892. break;
  62893. };
  62894. /* encoding length of value length field */
  62895. snmp_asn1_enc_length_cnt(vb->vlen, &vb->vlenlen);
  62896. 803367e: 8c20 ldrh r0, [r4, #32]
  62897. 8033680: f104 011a add.w r1, r4, #26
  62898. 8033684: f7fc ffe5 bl 8030652 <snmp_asn1_enc_length_cnt>
  62899. snmp_asn1_enc_oid_cnt(vb->ident_len, vb->ident, &vb->olen);
  62900. 8033688: f104 021e add.w r2, r4, #30
  62901. 803368c: 7a20 ldrb r0, [r4, #8]
  62902. 803368e: 68e1 ldr r1, [r4, #12]
  62903. 8033690: f7fd f814 bl 80306bc <snmp_asn1_enc_oid_cnt>
  62904. snmp_asn1_enc_length_cnt(vb->olen, &vb->olenlen);
  62905. 8033694: 8be0 ldrh r0, [r4, #30]
  62906. 8033696: f104 0119 add.w r1, r4, #25
  62907. 803369a: f7fc ffda bl 8030652 <snmp_asn1_enc_length_cnt>
  62908. vb->seqlen = 1 + vb->vlenlen + vb->vlen;
  62909. 803369e: 8be3 ldrh r3, [r4, #30]
  62910. 80336a0: 8c20 ldrh r0, [r4, #32]
  62911. 80336a2: 18c0 adds r0, r0, r3
  62912. 80336a4: 7ea3 ldrb r3, [r4, #26]
  62913. vb->seqlen += 1 + vb->olenlen + vb->olen;
  62914. 80336a6: 3002 adds r0, #2
  62915. 80336a8: 18c0 adds r0, r0, r3
  62916. 80336aa: 7e63 ldrb r3, [r4, #25]
  62917. 80336ac: 18c0 adds r0, r0, r3
  62918. 80336ae: b280 uxth r0, r0
  62919. 80336b0: 83a0 strh r0, [r4, #28]
  62920. snmp_asn1_enc_length_cnt(vb->seqlen, &vb->seqlenlen);
  62921. 80336b2: f104 0118 add.w r1, r4, #24
  62922. 80336b6: f7fc ffcc bl 8030652 <snmp_asn1_enc_length_cnt>
  62923. /* varbind seq */
  62924. tot_len += 1 + vb->seqlenlen + vb->seqlen;
  62925. 80336ba: 8ba3 ldrh r3, [r4, #28]
  62926. 80336bc: 7e22 ldrb r2, [r4, #24]
  62927. vb = vb->prev;
  62928. 80336be: 6864 ldr r4, [r4, #4]
  62929. vb->seqlen = 1 + vb->vlenlen + vb->vlen;
  62930. vb->seqlen += 1 + vb->olenlen + vb->olen;
  62931. snmp_asn1_enc_length_cnt(vb->seqlen, &vb->seqlenlen);
  62932. /* varbind seq */
  62933. tot_len += 1 + vb->seqlenlen + vb->seqlen;
  62934. 80336c0: 3301 adds r3, #1
  62935. 80336c2: 189b adds r3, r3, r2
  62936. 80336c4: 18ed adds r5, r5, r3
  62937. 80336c6: b2ad uxth r5, r5
  62938. s32_t *sint_ptr;
  62939. u16_t tot_len;
  62940. tot_len = 0;
  62941. vb = root->tail;
  62942. while ( vb != NULL )
  62943. 80336c8: 2c00 cmp r4, #0
  62944. 80336ca: d1ab bne.n 8033624 <snmp_varbind_list_sum+0xc>
  62945. vb = vb->prev;
  62946. }
  62947. /* varbind-list seq */
  62948. root->seqlen = tot_len;
  62949. snmp_asn1_enc_length_cnt(root->seqlen, &root->seqlenlen);
  62950. 80336cc: 4628 mov r0, r5
  62951. vb = vb->prev;
  62952. }
  62953. /* varbind-list seq */
  62954. root->seqlen = tot_len;
  62955. 80336ce: 8175 strh r5, [r6, #10]
  62956. snmp_asn1_enc_length_cnt(root->seqlen, &root->seqlenlen);
  62957. 80336d0: f106 0109 add.w r1, r6, #9
  62958. 80336d4: f7fc ffbd bl 8030652 <snmp_asn1_enc_length_cnt>
  62959. tot_len += 1 + root->seqlenlen;
  62960. 80336d8: 7a73 ldrb r3, [r6, #9]
  62961. 80336da: 3301 adds r3, #1
  62962. 80336dc: 18e8 adds r0, r5, r3
  62963. return tot_len;
  62964. }
  62965. 80336de: b280 uxth r0, r0
  62966. 80336e0: bdf8 pop {r3, r4, r5, r6, r7, pc}
  62967. 80336e2: 0000 movs r0, r0
  62968. 080336e4 <snmp_resp_header_sum>:
  62969. * @param rhl points to returned header lengths
  62970. * @return the required lenght for encoding the response header
  62971. */
  62972. static u16_t
  62973. snmp_resp_header_sum(struct snmp_msg_pstat *m_stat, u16_t vb_len)
  62974. {
  62975. 80336e4: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  62976. 80336e8: 4604 mov r4, r0
  62977. u16_t tot_len;
  62978. struct snmp_resp_header_lengths *rhl;
  62979. rhl = &m_stat->rhl;
  62980. tot_len = vb_len;
  62981. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  62982. 80336ea: f500 758c add.w r5, r0, #280 ; 0x118
  62983. * @param rhl points to returned header lengths
  62984. * @return the required lenght for encoding the response header
  62985. */
  62986. static u16_t
  62987. snmp_resp_header_sum(struct snmp_msg_pstat *m_stat, u16_t vb_len)
  62988. {
  62989. 80336ee: 460f mov r7, r1
  62990. u16_t tot_len;
  62991. struct snmp_resp_header_lengths *rhl;
  62992. rhl = &m_stat->rhl;
  62993. tot_len = vb_len;
  62994. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  62995. 80336f0: 6940 ldr r0, [r0, #20]
  62996. 80336f2: f504 7190 add.w r1, r4, #288 ; 0x120
  62997. 80336f6: f7fc ffcc bl 8030692 <snmp_asn1_enc_s32t_cnt>
  62998. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  62999. 80336fa: f8b4 0120 ldrh.w r0, [r4, #288] ; 0x120
  63000. 80336fe: 4629 mov r1, r5
  63001. 8033700: f7fc ffa7 bl 8030652 <snmp_asn1_enc_length_cnt>
  63002. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  63003. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  63004. 8033704: 6920 ldr r0, [r4, #16]
  63005. rhl = &m_stat->rhl;
  63006. tot_len = vb_len;
  63007. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  63008. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  63009. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  63010. 8033706: f894 8118 ldrb.w r8, [r4, #280] ; 0x118
  63011. 803370a: f8b4 a120 ldrh.w sl, [r4, #288] ; 0x120
  63012. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  63013. 803370e: f504 7191 add.w r1, r4, #290 ; 0x122
  63014. 8033712: f7fc ffbe bl 8030692 <snmp_asn1_enc_s32t_cnt>
  63015. snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
  63016. 8033716: 1c69 adds r1, r5, #1
  63017. 8033718: f8b4 0122 ldrh.w r0, [r4, #290] ; 0x122
  63018. 803371c: f7fc ff99 bl 8030652 <snmp_asn1_enc_length_cnt>
  63019. tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
  63020. 8033720: f8b4 9122 ldrh.w r9, [r4, #290] ; 0x122
  63021. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  63022. 8033724: 68e0 ldr r0, [r4, #12]
  63023. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  63024. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  63025. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  63026. snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
  63027. tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
  63028. 8033726: f894 6119 ldrb.w r6, [r4, #281] ; 0x119
  63029. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  63030. 803372a: f504 7192 add.w r1, r4, #292 ; 0x124
  63031. 803372e: f7fc ffb0 bl 8030692 <snmp_asn1_enc_s32t_cnt>
  63032. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  63033. 8033732: f8b4 0124 ldrh.w r0, [r4, #292] ; 0x124
  63034. 8033736: f504 718d add.w r1, r4, #282 ; 0x11a
  63035. 803373a: f7fc ff8a bl 8030652 <snmp_asn1_enc_length_cnt>
  63036. rhl = &m_stat->rhl;
  63037. tot_len = vb_len;
  63038. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  63039. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  63040. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  63041. 803373e: 44d1 add r9, sl
  63042. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  63043. snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
  63044. tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
  63045. 8033740: f8b4 3124 ldrh.w r3, [r4, #292] ; 0x124
  63046. 8033744: f109 0903 add.w r9, r9, #3
  63047. 8033748: 4499 add r9, r3
  63048. 803374a: fa18 f889 uxtah r8, r8, r9
  63049. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  63050. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  63051. tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
  63052. 803374e: f894 311a ldrb.w r3, [r4, #282] ; 0x11a
  63053. 8033752: 4446 add r6, r8
  63054. 8033754: 18f6 adds r6, r6, r3
  63055. 8033756: fa17 f686 uxtah r6, r7, r6
  63056. 803375a: b2b6 uxth r6, r6
  63057. rhl->pdulen = tot_len;
  63058. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  63059. 803375c: 1ce9 adds r1, r5, #3
  63060. 803375e: 4630 mov r0, r6
  63061. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  63062. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  63063. tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
  63064. rhl->pdulen = tot_len;
  63065. 8033760: f8a4 6126 strh.w r6, [r4, #294] ; 0x126
  63066. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  63067. 8033764: f7fc ff75 bl 8030652 <snmp_asn1_enc_length_cnt>
  63068. tot_len += 1 + rhl->pdulenlen;
  63069. rhl->comlen = m_stat->com_strlen;
  63070. 8033768: f894 0059 ldrb.w r0, [r4, #89] ; 0x59
  63071. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  63072. tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
  63073. rhl->pdulen = tot_len;
  63074. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  63075. tot_len += 1 + rhl->pdulenlen;
  63076. 803376c: f894 811b ldrb.w r8, [r4, #283] ; 0x11b
  63077. rhl->comlen = m_stat->com_strlen;
  63078. 8033770: f8a4 0128 strh.w r0, [r4, #296] ; 0x128
  63079. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  63080. 8033774: f504 718e add.w r1, r4, #284 ; 0x11c
  63081. 8033778: f7fc ff6b bl 8030652 <snmp_asn1_enc_length_cnt>
  63082. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  63083. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  63084. 803377c: 4b14 ldr r3, [pc, #80] ; (80337d0 <snmp_resp_header_sum+0xec>)
  63085. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  63086. tot_len += 1 + rhl->pdulenlen;
  63087. rhl->comlen = m_stat->com_strlen;
  63088. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  63089. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  63090. 803377e: f894 711c ldrb.w r7, [r4, #284] ; 0x11c
  63091. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  63092. 8033782: 6818 ldr r0, [r3, #0]
  63093. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  63094. tot_len += 1 + rhl->pdulenlen;
  63095. rhl->comlen = m_stat->com_strlen;
  63096. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  63097. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  63098. 8033784: f8b4 9128 ldrh.w r9, [r4, #296] ; 0x128
  63099. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  63100. 8033788: f504 7195 add.w r1, r4, #298 ; 0x12a
  63101. 803378c: f7fc ff81 bl 8030692 <snmp_asn1_enc_s32t_cnt>
  63102. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  63103. 8033790: 1d69 adds r1, r5, #5
  63104. 8033792: f8b4 012a ldrh.w r0, [r4, #298] ; 0x12a
  63105. 8033796: f7fc ff5c bl 8030652 <snmp_asn1_enc_length_cnt>
  63106. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  63107. tot_len += 1 + rhl->pdulenlen;
  63108. rhl->comlen = m_stat->com_strlen;
  63109. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  63110. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  63111. 803379a: f8b4 512a ldrh.w r5, [r4, #298] ; 0x12a
  63112. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  63113. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  63114. tot_len += 1 + rhl->verlen + rhl->verlenlen;
  63115. 803379e: f894 311d ldrb.w r3, [r4, #285] ; 0x11d
  63116. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  63117. tot_len += 1 + rhl->pdulenlen;
  63118. rhl->comlen = m_stat->com_strlen;
  63119. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  63120. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  63121. 80337a2: 444d add r5, r9
  63122. 80337a4: 3503 adds r5, #3
  63123. 80337a6: 4445 add r5, r8
  63124. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  63125. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  63126. tot_len += 1 + rhl->verlen + rhl->verlenlen;
  63127. 80337a8: 197d adds r5, r7, r5
  63128. 80337aa: 18ed adds r5, r5, r3
  63129. 80337ac: fa16 f585 uxtah r5, r6, r5
  63130. 80337b0: b2ad uxth r5, r5
  63131. rhl->seqlen = tot_len;
  63132. snmp_asn1_enc_length_cnt(rhl->seqlen, &rhl->seqlenlen);
  63133. 80337b2: 4628 mov r0, r5
  63134. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  63135. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  63136. tot_len += 1 + rhl->verlen + rhl->verlenlen;
  63137. rhl->seqlen = tot_len;
  63138. 80337b4: f8a4 512c strh.w r5, [r4, #300] ; 0x12c
  63139. snmp_asn1_enc_length_cnt(rhl->seqlen, &rhl->seqlenlen);
  63140. 80337b8: f504 718f add.w r1, r4, #286 ; 0x11e
  63141. 80337bc: f7fc ff49 bl 8030652 <snmp_asn1_enc_length_cnt>
  63142. tot_len += 1 + rhl->seqlenlen;
  63143. 80337c0: f894 311e ldrb.w r3, [r4, #286] ; 0x11e
  63144. 80337c4: 3301 adds r3, #1
  63145. 80337c6: 18e8 adds r0, r5, r3
  63146. return tot_len;
  63147. }
  63148. 80337c8: b280 uxth r0, r0
  63149. 80337ca: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  63150. 80337ce: bf00 nop
  63151. 80337d0: 080407ac .word 0x080407ac
  63152. 080337d4 <snmp_varbind_list_enc>:
  63153. /**
  63154. * Encodes varbind list from head to tail.
  63155. */
  63156. static u16_t
  63157. snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs)
  63158. {
  63159. 80337d4: b570 push {r4, r5, r6, lr}
  63160. 80337d6: 4616 mov r6, r2
  63161. 80337d8: 4604 mov r4, r0
  63162. s32_t *sint_ptr;
  63163. u32_t *uint_ptr;
  63164. u8_t *raw_ptr;
  63165. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  63166. ofs += 1;
  63167. 80337da: 3601 adds r6, #1
  63168. /**
  63169. * Encodes varbind list from head to tail.
  63170. */
  63171. static u16_t
  63172. snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs)
  63173. {
  63174. 80337dc: 460d mov r5, r1
  63175. struct snmp_varbind *vb;
  63176. s32_t *sint_ptr;
  63177. u32_t *uint_ptr;
  63178. u8_t *raw_ptr;
  63179. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  63180. 80337de: 4608 mov r0, r1
  63181. ofs += 1;
  63182. 80337e0: b2b6 uxth r6, r6
  63183. struct snmp_varbind *vb;
  63184. s32_t *sint_ptr;
  63185. u32_t *uint_ptr;
  63186. u8_t *raw_ptr;
  63187. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  63188. 80337e2: 4611 mov r1, r2
  63189. 80337e4: 2230 movs r2, #48 ; 0x30
  63190. 80337e6: f7fc ff81 bl 80306ec <snmp_asn1_enc_type>
  63191. ofs += 1;
  63192. snmp_asn1_enc_length(p, ofs, root->seqlen);
  63193. 80337ea: 4628 mov r0, r5
  63194. 80337ec: 4631 mov r1, r6
  63195. 80337ee: 8962 ldrh r2, [r4, #10]
  63196. 80337f0: f7fc ff90 bl 8030714 <snmp_asn1_enc_length>
  63197. ofs += root->seqlenlen;
  63198. 80337f4: 7a63 ldrb r3, [r4, #9]
  63199. 80337f6: e064 b.n 80338c2 <snmp_varbind_list_enc+0xee>
  63200. vb = root->head;
  63201. while ( vb != NULL )
  63202. {
  63203. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  63204. 80337f8: 4631 mov r1, r6
  63205. ofs += 1;
  63206. 80337fa: 3601 adds r6, #1
  63207. ofs += root->seqlenlen;
  63208. vb = root->head;
  63209. while ( vb != NULL )
  63210. {
  63211. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  63212. 80337fc: 2230 movs r2, #48 ; 0x30
  63213. ofs += 1;
  63214. 80337fe: b2b6 uxth r6, r6
  63215. ofs += root->seqlenlen;
  63216. vb = root->head;
  63217. while ( vb != NULL )
  63218. {
  63219. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  63220. 8033800: 4628 mov r0, r5
  63221. 8033802: f7fc ff73 bl 80306ec <snmp_asn1_enc_type>
  63222. ofs += 1;
  63223. snmp_asn1_enc_length(p, ofs, vb->seqlen);
  63224. 8033806: 4631 mov r1, r6
  63225. 8033808: 8ba2 ldrh r2, [r4, #28]
  63226. 803380a: 4628 mov r0, r5
  63227. 803380c: f7fc ff82 bl 8030714 <snmp_asn1_enc_length>
  63228. ofs += vb->seqlenlen;
  63229. 8033810: 7e23 ldrb r3, [r4, #24]
  63230. 8033812: 18f6 adds r6, r6, r3
  63231. 8033814: b2b6 uxth r6, r6
  63232. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  63233. 8033816: 4631 mov r1, r6
  63234. ofs += 1;
  63235. 8033818: 3601 adds r6, #1
  63236. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  63237. ofs += 1;
  63238. snmp_asn1_enc_length(p, ofs, vb->seqlen);
  63239. ofs += vb->seqlenlen;
  63240. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  63241. 803381a: 2206 movs r2, #6
  63242. ofs += 1;
  63243. 803381c: b2b6 uxth r6, r6
  63244. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  63245. ofs += 1;
  63246. snmp_asn1_enc_length(p, ofs, vb->seqlen);
  63247. ofs += vb->seqlenlen;
  63248. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  63249. 803381e: 4628 mov r0, r5
  63250. 8033820: f7fc ff64 bl 80306ec <snmp_asn1_enc_type>
  63251. ofs += 1;
  63252. snmp_asn1_enc_length(p, ofs, vb->olen);
  63253. 8033824: 4631 mov r1, r6
  63254. 8033826: 8be2 ldrh r2, [r4, #30]
  63255. 8033828: 4628 mov r0, r5
  63256. 803382a: f7fc ff73 bl 8030714 <snmp_asn1_enc_length>
  63257. ofs += vb->olenlen;
  63258. 803382e: 7e63 ldrb r3, [r4, #25]
  63259. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  63260. 8033830: 7a22 ldrb r2, [r4, #8]
  63261. ofs += vb->seqlenlen;
  63262. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  63263. ofs += 1;
  63264. snmp_asn1_enc_length(p, ofs, vb->olen);
  63265. ofs += vb->olenlen;
  63266. 8033832: 18f6 adds r6, r6, r3
  63267. 8033834: b2b6 uxth r6, r6
  63268. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  63269. 8033836: 4631 mov r1, r6
  63270. 8033838: 68e3 ldr r3, [r4, #12]
  63271. 803383a: 4628 mov r0, r5
  63272. 803383c: f7fd f81f bl 803087e <snmp_asn1_enc_oid>
  63273. ofs += vb->olen;
  63274. 8033840: 8be3 ldrh r3, [r4, #30]
  63275. snmp_asn1_enc_type(p, ofs, vb->value_type);
  63276. 8033842: 7c22 ldrb r2, [r4, #16]
  63277. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  63278. ofs += 1;
  63279. snmp_asn1_enc_length(p, ofs, vb->olen);
  63280. ofs += vb->olenlen;
  63281. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  63282. ofs += vb->olen;
  63283. 8033844: 18f6 adds r6, r6, r3
  63284. 8033846: b2b6 uxth r6, r6
  63285. snmp_asn1_enc_type(p, ofs, vb->value_type);
  63286. 8033848: 4631 mov r1, r6
  63287. ofs += 1;
  63288. 803384a: 3601 adds r6, #1
  63289. 803384c: b2b6 uxth r6, r6
  63290. snmp_asn1_enc_length(p, ofs, vb->olen);
  63291. ofs += vb->olenlen;
  63292. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  63293. ofs += vb->olen;
  63294. snmp_asn1_enc_type(p, ofs, vb->value_type);
  63295. 803384e: 4628 mov r0, r5
  63296. 8033850: f7fc ff4c bl 80306ec <snmp_asn1_enc_type>
  63297. ofs += 1;
  63298. snmp_asn1_enc_length(p, ofs, vb->vlen);
  63299. 8033854: 4631 mov r1, r6
  63300. 8033856: 4628 mov r0, r5
  63301. 8033858: 8c22 ldrh r2, [r4, #32]
  63302. 803385a: f7fc ff5b bl 8030714 <snmp_asn1_enc_length>
  63303. ofs += vb->vlenlen;
  63304. 803385e: 7ea3 ldrb r3, [r4, #26]
  63305. 8033860: 18f6 adds r6, r6, r3
  63306. switch (vb->value_type)
  63307. 8033862: 7c23 ldrb r3, [r4, #16]
  63308. 8033864: 2b40 cmp r3, #64 ; 0x40
  63309. ofs += vb->olen;
  63310. snmp_asn1_enc_type(p, ofs, vb->value_type);
  63311. ofs += 1;
  63312. snmp_asn1_enc_length(p, ofs, vb->vlen);
  63313. ofs += vb->vlenlen;
  63314. 8033866: b2b6 uxth r6, r6
  63315. switch (vb->value_type)
  63316. 8033868: d01c beq.n 80338a4 <snmp_varbind_list_enc+0xd0>
  63317. 803386a: d806 bhi.n 803387a <snmp_varbind_list_enc+0xa6>
  63318. 803386c: 2b04 cmp r3, #4
  63319. 803386e: d019 beq.n 80338a4 <snmp_varbind_list_enc+0xd0>
  63320. 8033870: 2b06 cmp r3, #6
  63321. 8033872: d01e beq.n 80338b2 <snmp_varbind_list_enc+0xde>
  63322. 8033874: 2b02 cmp r3, #2
  63323. 8033876: d123 bne.n 80338c0 <snmp_varbind_list_enc+0xec>
  63324. 8033878: e004 b.n 8033884 <snmp_varbind_list_enc+0xb0>
  63325. 803387a: 2b43 cmp r3, #67 ; 0x43
  63326. 803387c: d90a bls.n 8033894 <snmp_varbind_list_enc+0xc0>
  63327. 803387e: 2b44 cmp r3, #68 ; 0x44
  63328. 8033880: d11e bne.n 80338c0 <snmp_varbind_list_enc+0xec>
  63329. 8033882: e00f b.n 80338a4 <snmp_varbind_list_enc+0xd0>
  63330. {
  63331. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
  63332. sint_ptr = (s32_t*)vb->value;
  63333. snmp_asn1_enc_s32t(p, ofs, vb->vlen, *sint_ptr);
  63334. 8033884: 6963 ldr r3, [r4, #20]
  63335. 8033886: 8c22 ldrh r2, [r4, #32]
  63336. 8033888: 681b ldr r3, [r3, #0]
  63337. 803388a: 4628 mov r0, r5
  63338. 803388c: 4631 mov r1, r6
  63339. 803388e: f7fc ffc9 bl 8030824 <snmp_asn1_enc_s32t>
  63340. break;
  63341. 8033892: e015 b.n 80338c0 <snmp_varbind_list_enc+0xec>
  63342. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
  63343. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
  63344. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
  63345. uint_ptr = (u32_t*)vb->value;
  63346. snmp_asn1_enc_u32t(p, ofs, vb->vlen, *uint_ptr);
  63347. 8033894: 6963 ldr r3, [r4, #20]
  63348. 8033896: 8c22 ldrh r2, [r4, #32]
  63349. 8033898: 681b ldr r3, [r3, #0]
  63350. 803389a: 4628 mov r0, r5
  63351. 803389c: 4631 mov r1, r6
  63352. 803389e: f7fc ff81 bl 80307a4 <snmp_asn1_enc_u32t>
  63353. break;
  63354. 80338a2: e00d b.n 80338c0 <snmp_varbind_list_enc+0xec>
  63355. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
  63356. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
  63357. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
  63358. raw_ptr = (u8_t*)vb->value;
  63359. snmp_asn1_enc_raw(p, ofs, vb->vlen, raw_ptr);
  63360. 80338a4: 4628 mov r0, r5
  63361. 80338a6: 4631 mov r1, r6
  63362. 80338a8: 8c22 ldrh r2, [r4, #32]
  63363. 80338aa: 6963 ldr r3, [r4, #20]
  63364. 80338ac: f7fd f85a bl 8030964 <snmp_asn1_enc_raw>
  63365. break;
  63366. 80338b0: e006 b.n 80338c0 <snmp_varbind_list_enc+0xec>
  63367. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
  63368. break;
  63369. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
  63370. sint_ptr = (s32_t*)vb->value;
  63371. snmp_asn1_enc_oid(p, ofs, vb->value_len / sizeof(s32_t), sint_ptr);
  63372. 80338b2: 7c62 ldrb r2, [r4, #17]
  63373. 80338b4: 6963 ldr r3, [r4, #20]
  63374. 80338b6: 4628 mov r0, r5
  63375. 80338b8: 4631 mov r1, r6
  63376. 80338ba: 0892 lsrs r2, r2, #2
  63377. 80338bc: f7fc ffdf bl 803087e <snmp_asn1_enc_oid>
  63378. break;
  63379. default:
  63380. /* unsupported type */
  63381. break;
  63382. };
  63383. ofs += vb->vlen;
  63384. 80338c0: 8c23 ldrh r3, [r4, #32]
  63385. vb = vb->next;
  63386. 80338c2: 6824 ldr r4, [r4, #0]
  63387. break;
  63388. default:
  63389. /* unsupported type */
  63390. break;
  63391. };
  63392. ofs += vb->vlen;
  63393. 80338c4: 18f6 adds r6, r6, r3
  63394. 80338c6: b2b6 uxth r6, r6
  63395. ofs += 1;
  63396. snmp_asn1_enc_length(p, ofs, root->seqlen);
  63397. ofs += root->seqlenlen;
  63398. vb = root->head;
  63399. while ( vb != NULL )
  63400. 80338c8: 2c00 cmp r4, #0
  63401. 80338ca: d195 bne.n 80337f8 <snmp_varbind_list_enc+0x24>
  63402. };
  63403. ofs += vb->vlen;
  63404. vb = vb->next;
  63405. }
  63406. return ofs;
  63407. }
  63408. 80338cc: 4630 mov r0, r6
  63409. 80338ce: bd70 pop {r4, r5, r6, pc}
  63410. 080338d0 <snmp_trap_dst_ip_set>:
  63411. * @param dst IPv4 address in host order.
  63412. */
  63413. void
  63414. snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst)
  63415. {
  63416. if (dst_idx < SNMP_TRAP_DESTINATIONS)
  63417. 80338d0: b918 cbnz r0, 80338da <snmp_trap_dst_ip_set+0xa>
  63418. {
  63419. ip_addr_set(&trap_dst[dst_idx].dip, dst);
  63420. 80338d2: b101 cbz r1, 80338d6 <snmp_trap_dst_ip_set+0x6>
  63421. 80338d4: 6809 ldr r1, [r1, #0]
  63422. 80338d6: 4b01 ldr r3, [pc, #4] ; (80338dc <snmp_trap_dst_ip_set+0xc>)
  63423. 80338d8: 6019 str r1, [r3, #0]
  63424. 80338da: 4770 bx lr
  63425. 80338dc: 20011140 .word 0x20011140
  63426. 080338e0 <snmp_send_response>:
  63427. * @note the caller is responsible for filling in outvb in the m_stat
  63428. * and provide error-status and index (except for tooBig errors) ...
  63429. */
  63430. err_t
  63431. snmp_send_response(struct snmp_msg_pstat *m_stat)
  63432. {
  63433. 80338e0: b5f0 push {r4, r5, r6, r7, lr}
  63434. 80338e2: 4604 mov r4, r0
  63435. 80338e4: b085 sub sp, #20
  63436. struct snmp_varbind_root emptyvb = {NULL, NULL, 0, 0, 0};
  63437. 80338e6: 220c movs r2, #12
  63438. 80338e8: 2100 movs r1, #0
  63439. 80338ea: a801 add r0, sp, #4
  63440. struct pbuf *p;
  63441. u16_t tot_len;
  63442. err_t err;
  63443. /* pass 0, calculate length fields */
  63444. tot_len = snmp_varbind_list_sum(&m_stat->outvb);
  63445. 80338ec: f504 7686 add.w r6, r4, #268 ; 0x10c
  63446. * and provide error-status and index (except for tooBig errors) ...
  63447. */
  63448. err_t
  63449. snmp_send_response(struct snmp_msg_pstat *m_stat)
  63450. {
  63451. struct snmp_varbind_root emptyvb = {NULL, NULL, 0, 0, 0};
  63452. 80338f0: f7ee f8e6 bl 8021ac0 <memset>
  63453. struct pbuf *p;
  63454. u16_t tot_len;
  63455. err_t err;
  63456. /* pass 0, calculate length fields */
  63457. tot_len = snmp_varbind_list_sum(&m_stat->outvb);
  63458. 80338f4: 4630 mov r0, r6
  63459. 80338f6: f7ff fe8f bl 8033618 <snmp_varbind_list_sum>
  63460. 80338fa: 4601 mov r1, r0
  63461. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  63462. 80338fc: 4620 mov r0, r4
  63463. 80338fe: f7ff fef1 bl 80336e4 <snmp_resp_header_sum>
  63464. /* try allocating pbuf(s) for complete response */
  63465. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  63466. 8033902: 2203 movs r2, #3
  63467. u16_t tot_len;
  63468. err_t err;
  63469. /* pass 0, calculate length fields */
  63470. tot_len = snmp_varbind_list_sum(&m_stat->outvb);
  63471. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  63472. 8033904: 4601 mov r1, r0
  63473. /* try allocating pbuf(s) for complete response */
  63474. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  63475. 8033906: 2000 movs r0, #0
  63476. 8033908: f7f9 fbdf bl 802d0ca <pbuf_alloc>
  63477. if (p == NULL)
  63478. 803390c: 4605 mov r5, r0
  63479. 803390e: b990 cbnz r0, 8033936 <snmp_send_response+0x56>
  63480. {
  63481. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() tooBig\n"));
  63482. /* can't construct reply, return error-status tooBig */
  63483. m_stat->error_status = SNMP_ES_TOOBIG;
  63484. 8033910: 2301 movs r3, #1
  63485. 8033912: 6123 str r3, [r4, #16]
  63486. m_stat->error_index = 0;
  63487. 8033914: 6160 str r0, [r4, #20]
  63488. /* pass 0, recalculate lengths, for empty varbind-list */
  63489. tot_len = snmp_varbind_list_sum(&emptyvb);
  63490. 8033916: a801 add r0, sp, #4
  63491. 8033918: f7ff fe7e bl 8033618 <snmp_varbind_list_sum>
  63492. 803391c: 4601 mov r1, r0
  63493. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  63494. 803391e: 4620 mov r0, r4
  63495. 8033920: f7ff fee0 bl 80336e4 <snmp_resp_header_sum>
  63496. /* retry allocation once for header and empty varbind-list */
  63497. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  63498. 8033924: 2203 movs r2, #3
  63499. /* can't construct reply, return error-status tooBig */
  63500. m_stat->error_status = SNMP_ES_TOOBIG;
  63501. m_stat->error_index = 0;
  63502. /* pass 0, recalculate lengths, for empty varbind-list */
  63503. tot_len = snmp_varbind_list_sum(&emptyvb);
  63504. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  63505. 8033926: 4601 mov r1, r0
  63506. /* retry allocation once for header and empty varbind-list */
  63507. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  63508. 8033928: 4628 mov r0, r5
  63509. 803392a: f7f9 fbce bl 802d0ca <pbuf_alloc>
  63510. }
  63511. if (p != NULL)
  63512. 803392e: 4605 mov r5, r0
  63513. 8033930: 2800 cmp r0, #0
  63514. 8033932: f000 80dc beq.w 8033aee <snmp_send_response+0x20e>
  63515. snmp_resp_header_enc(struct snmp_msg_pstat *m_stat, struct pbuf *p)
  63516. {
  63517. u16_t ofs;
  63518. ofs = 0;
  63519. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  63520. 8033936: 2100 movs r1, #0
  63521. 8033938: 2230 movs r2, #48 ; 0x30
  63522. 803393a: 4628 mov r0, r5
  63523. 803393c: f7fc fed6 bl 80306ec <snmp_asn1_enc_type>
  63524. ofs += 1;
  63525. snmp_asn1_enc_length(p, ofs, m_stat->rhl.seqlen);
  63526. 8033940: 2101 movs r1, #1
  63527. 8033942: f8b4 212c ldrh.w r2, [r4, #300] ; 0x12c
  63528. 8033946: 4628 mov r0, r5
  63529. 8033948: f7fc fee4 bl 8030714 <snmp_asn1_enc_length>
  63530. ofs += m_stat->rhl.seqlenlen;
  63531. 803394c: f894 711e ldrb.w r7, [r4, #286] ; 0x11e
  63532. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63533. 8033950: 2202 movs r2, #2
  63534. 8033952: 1c79 adds r1, r7, #1
  63535. 8033954: 4628 mov r0, r5
  63536. ofs += 1;
  63537. 8033956: 3702 adds r7, #2
  63538. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  63539. ofs += 1;
  63540. snmp_asn1_enc_length(p, ofs, m_stat->rhl.seqlen);
  63541. ofs += m_stat->rhl.seqlenlen;
  63542. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63543. 8033958: f7fc fec8 bl 80306ec <snmp_asn1_enc_type>
  63544. ofs += 1;
  63545. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  63546. 803395c: 4639 mov r1, r7
  63547. 803395e: f8b4 212a ldrh.w r2, [r4, #298] ; 0x12a
  63548. 8033962: 4628 mov r0, r5
  63549. 8033964: f7fc fed6 bl 8030714 <snmp_asn1_enc_length>
  63550. ofs += m_stat->rhl.verlenlen;
  63551. 8033968: f894 311d ldrb.w r3, [r4, #285] ; 0x11d
  63552. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  63553. 803396c: f8b4 212a ldrh.w r2, [r4, #298] ; 0x12a
  63554. ofs += m_stat->rhl.seqlenlen;
  63555. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63556. ofs += 1;
  63557. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  63558. ofs += m_stat->rhl.verlenlen;
  63559. 8033970: 18ff adds r7, r7, r3
  63560. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  63561. 8033972: 4b61 ldr r3, [pc, #388] ; (8033af8 <snmp_send_response+0x218>)
  63562. 8033974: 4639 mov r1, r7
  63563. 8033976: 681b ldr r3, [r3, #0]
  63564. 8033978: 4628 mov r0, r5
  63565. 803397a: f7fc ff53 bl 8030824 <snmp_asn1_enc_s32t>
  63566. ofs += m_stat->rhl.verlen;
  63567. 803397e: f8b4 312a ldrh.w r3, [r4, #298] ; 0x12a
  63568. 8033982: 18ff adds r7, r7, r3
  63569. 8033984: b2bf uxth r7, r7
  63570. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  63571. 8033986: 4639 mov r1, r7
  63572. ofs += 1;
  63573. 8033988: 3701 adds r7, #1
  63574. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  63575. ofs += m_stat->rhl.verlenlen;
  63576. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  63577. ofs += m_stat->rhl.verlen;
  63578. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  63579. 803398a: 2204 movs r2, #4
  63580. ofs += 1;
  63581. 803398c: b2bf uxth r7, r7
  63582. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  63583. ofs += m_stat->rhl.verlenlen;
  63584. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  63585. ofs += m_stat->rhl.verlen;
  63586. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  63587. 803398e: 4628 mov r0, r5
  63588. 8033990: f7fc feac bl 80306ec <snmp_asn1_enc_type>
  63589. ofs += 1;
  63590. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  63591. 8033994: 4639 mov r1, r7
  63592. 8033996: f8b4 2128 ldrh.w r2, [r4, #296] ; 0x128
  63593. 803399a: 4628 mov r0, r5
  63594. 803399c: f7fc feba bl 8030714 <snmp_asn1_enc_length>
  63595. ofs += m_stat->rhl.comlenlen;
  63596. 80339a0: f894 311c ldrb.w r3, [r4, #284] ; 0x11c
  63597. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  63598. 80339a4: f8b4 2128 ldrh.w r2, [r4, #296] ; 0x128
  63599. ofs += m_stat->rhl.verlen;
  63600. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  63601. ofs += 1;
  63602. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  63603. ofs += m_stat->rhl.comlenlen;
  63604. 80339a8: 18ff adds r7, r7, r3
  63605. 80339aa: b2bf uxth r7, r7
  63606. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  63607. 80339ac: 4639 mov r1, r7
  63608. 80339ae: f104 0318 add.w r3, r4, #24
  63609. 80339b2: 4628 mov r0, r5
  63610. 80339b4: f7fc ffd6 bl 8030964 <snmp_asn1_enc_raw>
  63611. ofs += m_stat->rhl.comlen;
  63612. 80339b8: f8b4 3128 ldrh.w r3, [r4, #296] ; 0x128
  63613. 80339bc: 18ff adds r7, r7, r3
  63614. 80339be: b2bf uxth r7, r7
  63615. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  63616. 80339c0: 4639 mov r1, r7
  63617. ofs += 1;
  63618. 80339c2: 3701 adds r7, #1
  63619. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  63620. ofs += m_stat->rhl.comlenlen;
  63621. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  63622. ofs += m_stat->rhl.comlen;
  63623. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  63624. 80339c4: 22a2 movs r2, #162 ; 0xa2
  63625. ofs += 1;
  63626. 80339c6: b2bf uxth r7, r7
  63627. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  63628. ofs += m_stat->rhl.comlenlen;
  63629. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  63630. ofs += m_stat->rhl.comlen;
  63631. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  63632. 80339c8: 4628 mov r0, r5
  63633. 80339ca: f7fc fe8f bl 80306ec <snmp_asn1_enc_type>
  63634. ofs += 1;
  63635. snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);
  63636. 80339ce: 4639 mov r1, r7
  63637. 80339d0: f8b4 2126 ldrh.w r2, [r4, #294] ; 0x126
  63638. 80339d4: 4628 mov r0, r5
  63639. 80339d6: f7fc fe9d bl 8030714 <snmp_asn1_enc_length>
  63640. ofs += m_stat->rhl.pdulenlen;
  63641. 80339da: f894 311b ldrb.w r3, [r4, #283] ; 0x11b
  63642. 80339de: 18ff adds r7, r7, r3
  63643. 80339e0: b2bf uxth r7, r7
  63644. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63645. 80339e2: 4639 mov r1, r7
  63646. ofs += 1;
  63647. 80339e4: 3701 adds r7, #1
  63648. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  63649. ofs += 1;
  63650. snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);
  63651. ofs += m_stat->rhl.pdulenlen;
  63652. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63653. 80339e6: 2202 movs r2, #2
  63654. ofs += 1;
  63655. 80339e8: b2bf uxth r7, r7
  63656. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  63657. ofs += 1;
  63658. snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);
  63659. ofs += m_stat->rhl.pdulenlen;
  63660. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63661. 80339ea: 4628 mov r0, r5
  63662. 80339ec: f7fc fe7e bl 80306ec <snmp_asn1_enc_type>
  63663. ofs += 1;
  63664. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  63665. 80339f0: 4639 mov r1, r7
  63666. 80339f2: f8b4 2124 ldrh.w r2, [r4, #292] ; 0x124
  63667. 80339f6: 4628 mov r0, r5
  63668. 80339f8: f7fc fe8c bl 8030714 <snmp_asn1_enc_length>
  63669. ofs += m_stat->rhl.ridlenlen;
  63670. 80339fc: f894 311a ldrb.w r3, [r4, #282] ; 0x11a
  63671. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  63672. 8033a00: f8b4 2124 ldrh.w r2, [r4, #292] ; 0x124
  63673. ofs += m_stat->rhl.pdulenlen;
  63674. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63675. ofs += 1;
  63676. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  63677. ofs += m_stat->rhl.ridlenlen;
  63678. 8033a04: 18ff adds r7, r7, r3
  63679. 8033a06: b2bf uxth r7, r7
  63680. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  63681. 8033a08: 4639 mov r1, r7
  63682. 8033a0a: 68e3 ldr r3, [r4, #12]
  63683. 8033a0c: 4628 mov r0, r5
  63684. 8033a0e: f7fc ff09 bl 8030824 <snmp_asn1_enc_s32t>
  63685. ofs += m_stat->rhl.ridlen;
  63686. 8033a12: f8b4 3124 ldrh.w r3, [r4, #292] ; 0x124
  63687. 8033a16: 18ff adds r7, r7, r3
  63688. 8033a18: b2bf uxth r7, r7
  63689. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63690. 8033a1a: 4639 mov r1, r7
  63691. ofs += 1;
  63692. 8033a1c: 3701 adds r7, #1
  63693. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  63694. ofs += m_stat->rhl.ridlenlen;
  63695. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  63696. ofs += m_stat->rhl.ridlen;
  63697. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63698. 8033a1e: 2202 movs r2, #2
  63699. ofs += 1;
  63700. 8033a20: b2bf uxth r7, r7
  63701. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  63702. ofs += m_stat->rhl.ridlenlen;
  63703. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  63704. ofs += m_stat->rhl.ridlen;
  63705. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63706. 8033a22: 4628 mov r0, r5
  63707. 8033a24: f7fc fe62 bl 80306ec <snmp_asn1_enc_type>
  63708. ofs += 1;
  63709. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  63710. 8033a28: 4639 mov r1, r7
  63711. 8033a2a: f8b4 2122 ldrh.w r2, [r4, #290] ; 0x122
  63712. 8033a2e: 4628 mov r0, r5
  63713. 8033a30: f7fc fe70 bl 8030714 <snmp_asn1_enc_length>
  63714. ofs += m_stat->rhl.errstatlenlen;
  63715. 8033a34: f894 3119 ldrb.w r3, [r4, #281] ; 0x119
  63716. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  63717. 8033a38: f8b4 2122 ldrh.w r2, [r4, #290] ; 0x122
  63718. ofs += m_stat->rhl.ridlen;
  63719. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63720. ofs += 1;
  63721. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  63722. ofs += m_stat->rhl.errstatlenlen;
  63723. 8033a3c: 18ff adds r7, r7, r3
  63724. 8033a3e: b2bf uxth r7, r7
  63725. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  63726. 8033a40: 4639 mov r1, r7
  63727. 8033a42: 6923 ldr r3, [r4, #16]
  63728. 8033a44: 4628 mov r0, r5
  63729. 8033a46: f7fc feed bl 8030824 <snmp_asn1_enc_s32t>
  63730. ofs += m_stat->rhl.errstatlen;
  63731. 8033a4a: f8b4 3122 ldrh.w r3, [r4, #290] ; 0x122
  63732. 8033a4e: 18ff adds r7, r7, r3
  63733. 8033a50: b2bf uxth r7, r7
  63734. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63735. 8033a52: 4639 mov r1, r7
  63736. ofs += 1;
  63737. 8033a54: 3701 adds r7, #1
  63738. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  63739. ofs += m_stat->rhl.errstatlenlen;
  63740. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  63741. ofs += m_stat->rhl.errstatlen;
  63742. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63743. 8033a56: 2202 movs r2, #2
  63744. ofs += 1;
  63745. 8033a58: b2bf uxth r7, r7
  63746. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  63747. ofs += m_stat->rhl.errstatlenlen;
  63748. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  63749. ofs += m_stat->rhl.errstatlen;
  63750. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63751. 8033a5a: 4628 mov r0, r5
  63752. 8033a5c: f7fc fe46 bl 80306ec <snmp_asn1_enc_type>
  63753. ofs += 1;
  63754. snmp_asn1_enc_length(p, ofs, m_stat->rhl.erridxlen);
  63755. 8033a60: 4639 mov r1, r7
  63756. 8033a62: f8b4 2120 ldrh.w r2, [r4, #288] ; 0x120
  63757. 8033a66: 4628 mov r0, r5
  63758. 8033a68: f7fc fe54 bl 8030714 <snmp_asn1_enc_length>
  63759. ofs += m_stat->rhl.erridxlenlen;
  63760. 8033a6c: f894 3118 ldrb.w r3, [r4, #280] ; 0x118
  63761. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.erridxlen, m_stat->error_index);
  63762. 8033a70: f8b4 2120 ldrh.w r2, [r4, #288] ; 0x120
  63763. ofs += m_stat->rhl.errstatlen;
  63764. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  63765. ofs += 1;
  63766. snmp_asn1_enc_length(p, ofs, m_stat->rhl.erridxlen);
  63767. ofs += m_stat->rhl.erridxlenlen;
  63768. 8033a74: 18ff adds r7, r7, r3
  63769. 8033a76: b2bf uxth r7, r7
  63770. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.erridxlen, m_stat->error_index);
  63771. 8033a78: 4639 mov r1, r7
  63772. 8033a7a: 6963 ldr r3, [r4, #20]
  63773. 8033a7c: 4628 mov r0, r5
  63774. 8033a7e: f7fc fed1 bl 8030824 <snmp_asn1_enc_s32t>
  63775. ofs += m_stat->rhl.erridxlen;
  63776. 8033a82: f8b4 3120 ldrh.w r3, [r4, #288] ; 0x120
  63777. 8033a86: 18fa adds r2, r7, r3
  63778. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() p != NULL\n"));
  63779. /* pass 1, size error, encode packet ino the pbuf(s) */
  63780. ofs = snmp_resp_header_enc(m_stat, p);
  63781. snmp_varbind_list_enc(&m_stat->outvb, p, ofs);
  63782. 8033a88: 4630 mov r0, r6
  63783. 8033a8a: 4629 mov r1, r5
  63784. 8033a8c: b292 uxth r2, r2
  63785. 8033a8e: f7ff fea1 bl 80337d4 <snmp_varbind_list_enc>
  63786. switch (m_stat->error_status)
  63787. 8033a92: 6923 ldr r3, [r4, #16]
  63788. 8033a94: 3b01 subs r3, #1
  63789. 8033a96: 2b04 cmp r3, #4
  63790. 8033a98: d80f bhi.n 8033aba <snmp_send_response+0x1da>
  63791. 8033a9a: e8df f003 tbb [pc, r3]
  63792. 8033a9e: 0603 .short 0x0603
  63793. 8033aa0: 0e09 .short 0x0e09
  63794. 8033aa2: 0c .byte 0x0c
  63795. 8033aa3: 00 .byte 0x00
  63796. {
  63797. case SNMP_ES_TOOBIG:
  63798. snmp_inc_snmpouttoobigs();
  63799. 8033aa4: f7fe fa12 bl 8031ecc <snmp_inc_snmpouttoobigs>
  63800. break;
  63801. 8033aa8: e007 b.n 8033aba <snmp_send_response+0x1da>
  63802. case SNMP_ES_NOSUCHNAME:
  63803. snmp_inc_snmpoutnosuchnames();
  63804. 8033aaa: f7fe fa17 bl 8031edc <snmp_inc_snmpoutnosuchnames>
  63805. break;
  63806. 8033aae: e004 b.n 8033aba <snmp_send_response+0x1da>
  63807. case SNMP_ES_BADVALUE:
  63808. snmp_inc_snmpoutbadvalues();
  63809. 8033ab0: f7fe fa1c bl 8031eec <snmp_inc_snmpoutbadvalues>
  63810. break;
  63811. 8033ab4: e001 b.n 8033aba <snmp_send_response+0x1da>
  63812. case SNMP_ES_GENERROR:
  63813. snmp_inc_snmpoutgenerrs();
  63814. 8033ab6: f7fe fa21 bl 8031efc <snmp_inc_snmpoutgenerrs>
  63815. break;
  63816. }
  63817. snmp_inc_snmpoutgetresponses();
  63818. 8033aba: f7fe fa27 bl 8031f0c <snmp_inc_snmpoutgetresponses>
  63819. snmp_inc_snmpoutpkts();
  63820. 8033abe: f7fe f985 bl 8031dcc <snmp_inc_snmpoutpkts>
  63821. /** @todo do we need separate rx and tx pcbs for threaded case? */
  63822. /** connect to the originating source */
  63823. udp_connect(m_stat->pcb, &m_stat->sip, m_stat->sp);
  63824. 8033ac2: 8922 ldrh r2, [r4, #8]
  63825. 8033ac4: 6820 ldr r0, [r4, #0]
  63826. 8033ac6: 1d21 adds r1, r4, #4
  63827. 8033ac8: f7fb ffcc bl 802fa64 <udp_connect>
  63828. err = udp_send(m_stat->pcb, p);
  63829. 8033acc: 4629 mov r1, r5
  63830. 8033ace: 6820 ldr r0, [r4, #0]
  63831. 8033ad0: f7fb ffc3 bl 802fa5a <udp_send>
  63832. /** @todo release some memory, retry and return tooBig? tooMuchHassle? */
  63833. err = ERR_MEM;
  63834. }
  63835. else
  63836. {
  63837. err = ERR_OK;
  63838. 8033ad4: f1b0 3fff cmp.w r0, #4294967295
  63839. 8033ad8: bf0c ite eq
  63840. 8033ada: f04f 36ff moveq.w r6, #4294967295
  63841. 8033ade: 2600 movne r6, #0
  63842. }
  63843. /** disassociate remote address and port with this pcb */
  63844. udp_disconnect(m_stat->pcb);
  63845. 8033ae0: 6820 ldr r0, [r4, #0]
  63846. 8033ae2: f7fb ffe5 bl 802fab0 <udp_disconnect>
  63847. pbuf_free(p);
  63848. 8033ae6: 4628 mov r0, r5
  63849. 8033ae8: f7f9 faa2 bl 802d030 <pbuf_free>
  63850. 8033aec: e000 b.n 8033af0 <snmp_send_response+0x210>
  63851. }
  63852. else
  63853. {
  63854. /* first pbuf alloc try or retry alloc failed
  63855. very low on memory, couldn't return tooBig */
  63856. return ERR_MEM;
  63857. 8033aee: 26ff movs r6, #255 ; 0xff
  63858. }
  63859. }
  63860. 8033af0: b270 sxtb r0, r6
  63861. 8033af2: b005 add sp, #20
  63862. 8033af4: bdf0 pop {r4, r5, r6, r7, pc}
  63863. 8033af6: bf00 nop
  63864. 8033af8: 080407ac .word 0x080407ac
  63865. 08033afc <snmp_send_trap>:
  63866. * and .iso.org.dod.internet.private.enterprises.yourenterprise
  63867. * (sysObjectID) for specific traps.
  63868. */
  63869. err_t
  63870. snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap)
  63871. {
  63872. 8033afc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  63873. struct pbuf *p;
  63874. u16_t i,tot_len;
  63875. for (i=0, td = &trap_dst[0]; i<SNMP_TRAP_DESTINATIONS; i++, td++)
  63876. {
  63877. if ((td->enable != 0) && !ip_addr_isany(&td->dip))
  63878. 8033b00: 4b11 ldr r3, [pc, #68] ; (8033b48 <snmp_send_trap+0x4c>)
  63879. * and .iso.org.dod.internet.private.enterprises.yourenterprise
  63880. * (sysObjectID) for specific traps.
  63881. */
  63882. err_t
  63883. snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap)
  63884. {
  63885. 8033b02: 4617 mov r7, r2
  63886. struct pbuf *p;
  63887. u16_t i,tot_len;
  63888. for (i=0, td = &trap_dst[0]; i<SNMP_TRAP_DESTINATIONS; i++, td++)
  63889. {
  63890. if ((td->enable != 0) && !ip_addr_isany(&td->dip))
  63891. 8033b04: 791a ldrb r2, [r3, #4]
  63892. * and .iso.org.dod.internet.private.enterprises.yourenterprise
  63893. * (sysObjectID) for specific traps.
  63894. */
  63895. err_t
  63896. snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap)
  63897. {
  63898. 8033b06: b085 sub sp, #20
  63899. 8033b08: 4605 mov r5, r0
  63900. 8033b0a: 460e mov r6, r1
  63901. struct pbuf *p;
  63902. u16_t i,tot_len;
  63903. for (i=0, td = &trap_dst[0]; i<SNMP_TRAP_DESTINATIONS; i++, td++)
  63904. {
  63905. if ((td->enable != 0) && !ip_addr_isany(&td->dip))
  63906. 8033b0c: 2a00 cmp r2, #0
  63907. 8033b0e: f000 81b8 beq.w 8033e82 <snmp_send_trap+0x386>
  63908. 8033b12: 6818 ldr r0, [r3, #0]
  63909. 8033b14: 2800 cmp r0, #0
  63910. 8033b16: f000 81b4 beq.w 8033e82 <snmp_send_trap+0x386>
  63911. {
  63912. /* network order trap destination */
  63913. ip_addr_copy(trap_msg.dip, td->dip);
  63914. 8033b1a: 4c0c ldr r4, [pc, #48] ; (8033b4c <snmp_send_trap+0x50>)
  63915. 8033b1c: 6060 str r0, [r4, #4]
  63916. /* lookup current source address for this dst */
  63917. dst_if = ip_route(&td->dip);
  63918. 8033b1e: 4618 mov r0, r3
  63919. 8033b20: f7fc fa10 bl 802ff44 <ip_route>
  63920. ip_addr_copy(dst_ip, dst_if->ip_addr);
  63921. 8033b24: 6843 ldr r3, [r0, #4]
  63922. /* @todo: what about IPv6? */
  63923. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  63924. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  63925. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  63926. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  63927. trap_msg.gen_trap = generic_trap;
  63928. 8033b26: 6125 str r5, [r4, #16]
  63929. /* lookup current source address for this dst */
  63930. dst_if = ip_route(&td->dip);
  63931. ip_addr_copy(dst_ip, dst_if->ip_addr);
  63932. /* @todo: what about IPv6? */
  63933. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  63934. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  63935. 8033b28: f3c3 2207 ubfx r2, r3, #8, #8
  63936. ip_addr_copy(trap_msg.dip, td->dip);
  63937. /* lookup current source address for this dst */
  63938. dst_if = ip_route(&td->dip);
  63939. ip_addr_copy(dst_ip, dst_if->ip_addr);
  63940. /* @todo: what about IPv6? */
  63941. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  63942. 8033b2c: 7323 strb r3, [r4, #12]
  63943. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  63944. 8033b2e: 7362 strb r2, [r4, #13]
  63945. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  63946. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  63947. trap_msg.gen_trap = generic_trap;
  63948. trap_msg.spc_trap = specific_trap;
  63949. if (generic_trap == SNMP_GENTRAP_ENTERPRISESPC)
  63950. 8033b30: 2d06 cmp r5, #6
  63951. dst_if = ip_route(&td->dip);
  63952. ip_addr_copy(dst_ip, dst_if->ip_addr);
  63953. /* @todo: what about IPv6? */
  63954. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  63955. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  63956. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  63957. 8033b32: f3c3 4207 ubfx r2, r3, #16, #8
  63958. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  63959. 8033b36: f3c3 6307 ubfx r3, r3, #24, #8
  63960. dst_if = ip_route(&td->dip);
  63961. ip_addr_copy(dst_ip, dst_if->ip_addr);
  63962. /* @todo: what about IPv6? */
  63963. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  63964. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  63965. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  63966. 8033b3a: 73a2 strb r2, [r4, #14]
  63967. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  63968. 8033b3c: 73e3 strb r3, [r4, #15]
  63969. trap_msg.gen_trap = generic_trap;
  63970. trap_msg.spc_trap = specific_trap;
  63971. 8033b3e: 6167 str r7, [r4, #20]
  63972. if (generic_trap == SNMP_GENTRAP_ENTERPRISESPC)
  63973. 8033b40: d106 bne.n 8033b50 <snmp_send_trap+0x54>
  63974. {
  63975. /* enterprise-Specific trap */
  63976. trap_msg.enterprise = eoid;
  63977. 8033b42: 60a6 str r6, [r4, #8]
  63978. 8033b44: e008 b.n 8033b58 <snmp_send_trap+0x5c>
  63979. 8033b46: bf00 nop
  63980. 8033b48: 20011140 .word 0x20011140
  63981. 8033b4c: 20011148 .word 0x20011148
  63982. }
  63983. else
  63984. {
  63985. /* generic (MIB-II) trap */
  63986. snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
  63987. 8033b50: f104 0008 add.w r0, r4, #8
  63988. 8033b54: f7fe f9ea bl 8031f2c <snmp_get_snmpgrpid_ptr>
  63989. }
  63990. snmp_get_sysuptime(&trap_msg.ts);
  63991. 8033b58: 48bb ldr r0, [pc, #748] ; (8033e48 <snmp_send_trap+0x34c>)
  63992. struct snmp_trap_header_lengths *thl;
  63993. thl = &m_trap->thl;
  63994. tot_len = vb_len;
  63995. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  63996. 8033b5a: 4cbc ldr r4, [pc, #752] ; (8033e4c <snmp_send_trap+0x350>)
  63997. else
  63998. {
  63999. /* generic (MIB-II) trap */
  64000. snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
  64001. }
  64002. snmp_get_sysuptime(&trap_msg.ts);
  64003. 8033b5c: f7fd fd5a bl 8031614 <snmp_get_sysuptime>
  64004. /* pass 0, calculate length fields */
  64005. tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
  64006. 8033b60: 48bb ldr r0, [pc, #748] ; (8033e50 <snmp_send_trap+0x354>)
  64007. 8033b62: f7ff fd59 bl 8033618 <snmp_varbind_list_sum>
  64008. struct snmp_trap_header_lengths *thl;
  64009. thl = &m_trap->thl;
  64010. tot_len = vb_len;
  64011. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  64012. 8033b66: f104 0132 add.w r1, r4, #50 ; 0x32
  64013. snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
  64014. }
  64015. snmp_get_sysuptime(&trap_msg.ts);
  64016. /* pass 0, calculate length fields */
  64017. tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
  64018. 8033b6a: 4606 mov r6, r0
  64019. struct snmp_trap_header_lengths *thl;
  64020. thl = &m_trap->thl;
  64021. tot_len = vb_len;
  64022. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  64023. 8033b6c: 69a0 ldr r0, [r4, #24]
  64024. 8033b6e: f7fc fd7b bl 8030668 <snmp_asn1_enc_u32t_cnt>
  64025. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  64026. 8033b72: 8e60 ldrh r0, [r4, #50] ; 0x32
  64027. 8033b74: f104 0128 add.w r1, r4, #40 ; 0x28
  64028. 8033b78: f7fc fd6b bl 8030652 <snmp_asn1_enc_length_cnt>
  64029. tot_len += 1 + thl->tslen + thl->tslenlen;
  64030. 8033b7c: f8b4 c032 ldrh.w ip, [r4, #50] ; 0x32
  64031. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  64032. 8033b80: 6960 ldr r0, [r4, #20]
  64033. 8033b82: f8cd c004 str.w ip, [sp, #4]
  64034. 8033b86: f104 0134 add.w r1, r4, #52 ; 0x34
  64035. thl = &m_trap->thl;
  64036. tot_len = vb_len;
  64037. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  64038. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  64039. tot_len += 1 + thl->tslen + thl->tslenlen;
  64040. 8033b8a: f894 9028 ldrb.w r9, [r4, #40] ; 0x28
  64041. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  64042. 8033b8e: f7fc fd80 bl 8030692 <snmp_asn1_enc_s32t_cnt>
  64043. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  64044. 8033b92: 8ea0 ldrh r0, [r4, #52] ; 0x34
  64045. 8033b94: f104 0129 add.w r1, r4, #41 ; 0x29
  64046. 8033b98: f7fc fd5b bl 8030652 <snmp_asn1_enc_length_cnt>
  64047. tot_len += 1 + thl->strplen + thl->strplenlen;
  64048. 8033b9c: 8ea3 ldrh r3, [r4, #52] ; 0x34
  64049. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  64050. 8033b9e: 6920 ldr r0, [r4, #16]
  64051. 8033ba0: 9302 str r3, [sp, #8]
  64052. 8033ba2: f104 0136 add.w r1, r4, #54 ; 0x36
  64053. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  64054. tot_len += 1 + thl->tslen + thl->tslenlen;
  64055. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  64056. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  64057. tot_len += 1 + thl->strplen + thl->strplenlen;
  64058. 8033ba6: f894 8029 ldrb.w r8, [r4, #41] ; 0x29
  64059. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  64060. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  64061. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  64062. thl->aaddrlen = 4;
  64063. 8033baa: 2504 movs r5, #4
  64064. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  64065. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  64066. tot_len += 1 + thl->strplen + thl->strplenlen;
  64067. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  64068. 8033bac: f7fc fd71 bl 8030692 <snmp_asn1_enc_s32t_cnt>
  64069. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  64070. 8033bb0: 8ee0 ldrh r0, [r4, #54] ; 0x36
  64071. 8033bb2: f104 012a add.w r1, r4, #42 ; 0x2a
  64072. 8033bb6: f7fc fd4c bl 8030652 <snmp_asn1_enc_length_cnt>
  64073. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  64074. thl->aaddrlen = 4;
  64075. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  64076. 8033bba: 4628 mov r0, r5
  64077. 8033bbc: f104 012b add.w r1, r4, #43 ; 0x2b
  64078. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  64079. tot_len += 1 + thl->strplen + thl->strplenlen;
  64080. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  64081. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  64082. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  64083. 8033bc0: f8b4 b036 ldrh.w fp, [r4, #54] ; 0x36
  64084. 8033bc4: f894 702a ldrb.w r7, [r4, #42] ; 0x2a
  64085. thl->aaddrlen = 4;
  64086. 8033bc8: 8725 strh r5, [r4, #56] ; 0x38
  64087. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  64088. 8033bca: f7fc fd42 bl 8030652 <snmp_asn1_enc_length_cnt>
  64089. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  64090. 8033bce: f894 202b ldrb.w r2, [r4, #43] ; 0x2b
  64091. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  64092. 8033bd2: 68a1 ldr r1, [r4, #8]
  64093. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  64094. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  64095. thl->aaddrlen = 4;
  64096. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  64097. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  64098. 8033bd4: 9203 str r2, [sp, #12]
  64099. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  64100. 8033bd6: f811 0b04 ldrb.w r0, [r1], #4
  64101. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  64102. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  64103. thl->aaddrlen = 4;
  64104. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  64105. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  64106. 8033bda: f8b4 a038 ldrh.w sl, [r4, #56] ; 0x38
  64107. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  64108. 8033bde: f104 023a add.w r2, r4, #58 ; 0x3a
  64109. 8033be2: f7fc fd6b bl 80306bc <snmp_asn1_enc_oid_cnt>
  64110. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  64111. 8033be6: 8f60 ldrh r0, [r4, #58] ; 0x3a
  64112. 8033be8: f104 012c add.w r1, r4, #44 ; 0x2c
  64113. 8033bec: f7fc fd31 bl 8030652 <snmp_asn1_enc_length_cnt>
  64114. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  64115. tot_len += 1 + thl->tslen + thl->tslenlen;
  64116. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  64117. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  64118. tot_len += 1 + thl->strplen + thl->strplenlen;
  64119. 8033bf0: f8dd c004 ldr.w ip, [sp, #4]
  64120. 8033bf4: 9b02 ldr r3, [sp, #8]
  64121. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  64122. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  64123. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  64124. 8033bf6: 8f62 ldrh r2, [r4, #58] ; 0x3a
  64125. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  64126. tot_len += 1 + thl->tslen + thl->tslenlen;
  64127. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  64128. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  64129. tot_len += 1 + thl->strplen + thl->strplenlen;
  64130. 8033bf8: 4463 add r3, ip
  64131. 8033bfa: 3305 adds r3, #5
  64132. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  64133. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  64134. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  64135. 8033bfc: 449b add fp, r3
  64136. 8033bfe: 44da add sl, fp
  64137. 8033c00: fa12 fa8a uxtah sl, r2, sl
  64138. thl->aaddrlen = 4;
  64139. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  64140. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  64141. 8033c04: 44d1 add r9, sl
  64142. 8033c06: 44c8 add r8, r9
  64143. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  64144. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  64145. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  64146. 8033c08: 9b03 ldr r3, [sp, #12]
  64147. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  64148. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  64149. thl->aaddrlen = 4;
  64150. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  64151. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  64152. 8033c0a: fa17 f788 uxtah r7, r7, r8
  64153. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  64154. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  64155. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  64156. 8033c0e: 19df adds r7, r3, r7
  64157. 8033c10: f894 302c ldrb.w r3, [r4, #44] ; 0x2c
  64158. 8033c14: 18ff adds r7, r7, r3
  64159. 8033c16: fa16 f687 uxtah r6, r6, r7
  64160. 8033c1a: b2b6 uxth r6, r6
  64161. thl->pdulen = tot_len;
  64162. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  64163. 8033c1c: 4630 mov r0, r6
  64164. 8033c1e: f104 012d add.w r1, r4, #45 ; 0x2d
  64165. tot_len += 1 + thl->pdulenlen;
  64166. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  64167. 8033c22: 2706 movs r7, #6
  64168. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  64169. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  64170. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  64171. thl->pdulen = tot_len;
  64172. 8033c24: 87a6 strh r6, [r4, #60] ; 0x3c
  64173. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  64174. 8033c26: f7fc fd14 bl 8030652 <snmp_asn1_enc_length_cnt>
  64175. tot_len += 1 + thl->pdulenlen;
  64176. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  64177. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  64178. 8033c2a: 4638 mov r0, r7
  64179. 8033c2c: f104 012e add.w r1, r4, #46 ; 0x2e
  64180. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  64181. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  64182. thl->pdulen = tot_len;
  64183. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  64184. tot_len += 1 + thl->pdulenlen;
  64185. 8033c30: f894 a02d ldrb.w sl, [r4, #45] ; 0x2d
  64186. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  64187. 8033c34: 87e7 strh r7, [r4, #62] ; 0x3e
  64188. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  64189. 8033c36: f7fc fd0c bl 8030652 <snmp_asn1_enc_length_cnt>
  64190. tot_len += 1 + thl->comlenlen + thl->comlen;
  64191. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  64192. 8033c3a: 4b86 ldr r3, [pc, #536] ; (8033e54 <snmp_send_trap+0x358>)
  64193. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  64194. tot_len += 1 + thl->pdulenlen;
  64195. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  64196. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  64197. tot_len += 1 + thl->comlenlen + thl->comlen;
  64198. 8033c3c: f894 902e ldrb.w r9, [r4, #46] ; 0x2e
  64199. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  64200. 8033c40: f8d3 8000 ldr.w r8, [r3]
  64201. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  64202. tot_len += 1 + thl->pdulenlen;
  64203. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  64204. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  64205. tot_len += 1 + thl->comlenlen + thl->comlen;
  64206. 8033c44: f8b4 b03e ldrh.w fp, [r4, #62] ; 0x3e
  64207. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  64208. 8033c48: 4640 mov r0, r8
  64209. 8033c4a: f104 0140 add.w r1, r4, #64 ; 0x40
  64210. 8033c4e: f7fc fd20 bl 8030692 <snmp_asn1_enc_s32t_cnt>
  64211. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  64212. 8033c52: f8b4 0040 ldrh.w r0, [r4, #64] ; 0x40
  64213. 8033c56: f104 012f add.w r1, r4, #47 ; 0x2f
  64214. 8033c5a: f7fc fcfa bl 8030652 <snmp_asn1_enc_length_cnt>
  64215. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  64216. tot_len += 1 + thl->pdulenlen;
  64217. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  64218. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  64219. tot_len += 1 + thl->comlenlen + thl->comlen;
  64220. 8033c5e: f8b4 3040 ldrh.w r3, [r4, #64] ; 0x40
  64221. 8033c62: 449b add fp, r3
  64222. 8033c64: f10b 0b03 add.w fp, fp, #3
  64223. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  64224. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  64225. tot_len += 1 + thl->verlen + thl->verlenlen;
  64226. 8033c68: f894 302f ldrb.w r3, [r4, #47] ; 0x2f
  64227. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  64228. tot_len += 1 + thl->pdulenlen;
  64229. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  64230. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  64231. tot_len += 1 + thl->comlenlen + thl->comlen;
  64232. 8033c6c: 44da add sl, fp
  64233. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  64234. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  64235. tot_len += 1 + thl->verlen + thl->verlenlen;
  64236. 8033c6e: 44d1 add r9, sl
  64237. 8033c70: 4499 add r9, r3
  64238. 8033c72: fa16 f689 uxtah r6, r6, r9
  64239. 8033c76: b2b6 uxth r6, r6
  64240. thl->seqlen = tot_len;
  64241. snmp_asn1_enc_length_cnt(thl->seqlen, &thl->seqlenlen);
  64242. 8033c78: 4630 mov r0, r6
  64243. 8033c7a: f104 0130 add.w r1, r4, #48 ; 0x30
  64244. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  64245. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  64246. tot_len += 1 + thl->verlen + thl->verlenlen;
  64247. thl->seqlen = tot_len;
  64248. 8033c7e: f8a4 6042 strh.w r6, [r4, #66] ; 0x42
  64249. snmp_asn1_enc_length_cnt(thl->seqlen, &thl->seqlenlen);
  64250. 8033c82: f7fc fce6 bl 8030652 <snmp_asn1_enc_length_cnt>
  64251. tot_len += 1 + thl->seqlenlen;
  64252. 8033c86: f894 3030 ldrb.w r3, [r4, #48] ; 0x30
  64253. 8033c8a: 3301 adds r3, #1
  64254. 8033c8c: 18f1 adds r1, r6, r3
  64255. /* pass 0, calculate length fields */
  64256. tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
  64257. tot_len = snmp_trap_header_sum(&trap_msg, tot_len);
  64258. /* allocate pbuf(s) */
  64259. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  64260. 8033c8e: 2000 movs r0, #0
  64261. 8033c90: b289 uxth r1, r1
  64262. 8033c92: 2203 movs r2, #3
  64263. 8033c94: f7f9 fa19 bl 802d0ca <pbuf_alloc>
  64264. if (p != NULL)
  64265. 8033c98: 4606 mov r6, r0
  64266. 8033c9a: 2800 cmp r0, #0
  64267. 8033c9c: f000 80f3 beq.w 8033e86 <snmp_send_trap+0x38a>
  64268. snmp_trap_header_enc(struct snmp_msg_trap *m_trap, struct pbuf *p)
  64269. {
  64270. u16_t ofs;
  64271. ofs = 0;
  64272. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  64273. 8033ca0: 2100 movs r1, #0
  64274. 8033ca2: 2230 movs r2, #48 ; 0x30
  64275. 8033ca4: f7fc fd22 bl 80306ec <snmp_asn1_enc_type>
  64276. ofs += 1;
  64277. snmp_asn1_enc_length(p, ofs, m_trap->thl.seqlen);
  64278. 8033ca8: 2101 movs r1, #1
  64279. 8033caa: f8b4 2042 ldrh.w r2, [r4, #66] ; 0x42
  64280. 8033cae: 4630 mov r0, r6
  64281. 8033cb0: f7fc fd30 bl 8030714 <snmp_asn1_enc_length>
  64282. ofs += m_trap->thl.seqlenlen;
  64283. 8033cb4: f894 9030 ldrb.w r9, [r4, #48] ; 0x30
  64284. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64285. 8033cb8: 2202 movs r2, #2
  64286. 8033cba: f109 0101 add.w r1, r9, #1
  64287. 8033cbe: 4630 mov r0, r6
  64288. ofs += 1;
  64289. 8033cc0: f109 0902 add.w r9, r9, #2
  64290. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  64291. ofs += 1;
  64292. snmp_asn1_enc_length(p, ofs, m_trap->thl.seqlen);
  64293. ofs += m_trap->thl.seqlenlen;
  64294. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64295. 8033cc4: f7fc fd12 bl 80306ec <snmp_asn1_enc_type>
  64296. ofs += 1;
  64297. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  64298. 8033cc8: 4649 mov r1, r9
  64299. 8033cca: f8b4 2040 ldrh.w r2, [r4, #64] ; 0x40
  64300. 8033cce: 4630 mov r0, r6
  64301. 8033cd0: f7fc fd20 bl 8030714 <snmp_asn1_enc_length>
  64302. ofs += m_trap->thl.verlenlen;
  64303. 8033cd4: f894 302f ldrb.w r3, [r4, #47] ; 0x2f
  64304. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  64305. 8033cd8: f8b4 2040 ldrh.w r2, [r4, #64] ; 0x40
  64306. ofs += m_trap->thl.seqlenlen;
  64307. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64308. ofs += 1;
  64309. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  64310. ofs += m_trap->thl.verlenlen;
  64311. 8033cdc: 4499 add r9, r3
  64312. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  64313. 8033cde: 4649 mov r1, r9
  64314. 8033ce0: 4643 mov r3, r8
  64315. 8033ce2: 4630 mov r0, r6
  64316. 8033ce4: f7fc fd9e bl 8030824 <snmp_asn1_enc_s32t>
  64317. ofs += m_trap->thl.verlen;
  64318. 8033ce8: f8b4 3040 ldrh.w r3, [r4, #64] ; 0x40
  64319. 8033cec: 4499 add r9, r3
  64320. 8033cee: fa1f f989 uxth.w r9, r9
  64321. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  64322. 8033cf2: 462a mov r2, r5
  64323. ofs += 1;
  64324. 8033cf4: f109 0501 add.w r5, r9, #1
  64325. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  64326. ofs += m_trap->thl.verlenlen;
  64327. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  64328. ofs += m_trap->thl.verlen;
  64329. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  64330. 8033cf8: 4649 mov r1, r9
  64331. ofs += 1;
  64332. 8033cfa: b2ad uxth r5, r5
  64333. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  64334. ofs += m_trap->thl.verlenlen;
  64335. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  64336. ofs += m_trap->thl.verlen;
  64337. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  64338. 8033cfc: 4630 mov r0, r6
  64339. 8033cfe: f7fc fcf5 bl 80306ec <snmp_asn1_enc_type>
  64340. ofs += 1;
  64341. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  64342. 8033d02: 4629 mov r1, r5
  64343. 8033d04: 8fe2 ldrh r2, [r4, #62] ; 0x3e
  64344. 8033d06: 4630 mov r0, r6
  64345. 8033d08: f7fc fd04 bl 8030714 <snmp_asn1_enc_length>
  64346. ofs += m_trap->thl.comlenlen;
  64347. 8033d0c: f894 302e ldrb.w r3, [r4, #46] ; 0x2e
  64348. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  64349. 8033d10: 8fe2 ldrh r2, [r4, #62] ; 0x3e
  64350. ofs += m_trap->thl.verlen;
  64351. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  64352. ofs += 1;
  64353. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  64354. ofs += m_trap->thl.comlenlen;
  64355. 8033d12: 18ed adds r5, r5, r3
  64356. 8033d14: b2ad uxth r5, r5
  64357. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  64358. 8033d16: 4629 mov r1, r5
  64359. 8033d18: 4b4f ldr r3, [pc, #316] ; (8033e58 <snmp_send_trap+0x35c>)
  64360. 8033d1a: 4630 mov r0, r6
  64361. 8033d1c: f7fc fe22 bl 8030964 <snmp_asn1_enc_raw>
  64362. ofs += m_trap->thl.comlen;
  64363. 8033d20: 8fe3 ldrh r3, [r4, #62] ; 0x3e
  64364. 8033d22: 18ed adds r5, r5, r3
  64365. 8033d24: b2ad uxth r5, r5
  64366. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  64367. 8033d26: 4629 mov r1, r5
  64368. ofs += 1;
  64369. 8033d28: 3501 adds r5, #1
  64370. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  64371. ofs += m_trap->thl.comlenlen;
  64372. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  64373. ofs += m_trap->thl.comlen;
  64374. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  64375. 8033d2a: 22a4 movs r2, #164 ; 0xa4
  64376. ofs += 1;
  64377. 8033d2c: b2ad uxth r5, r5
  64378. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  64379. ofs += m_trap->thl.comlenlen;
  64380. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  64381. ofs += m_trap->thl.comlen;
  64382. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  64383. 8033d2e: 4630 mov r0, r6
  64384. 8033d30: f7fc fcdc bl 80306ec <snmp_asn1_enc_type>
  64385. ofs += 1;
  64386. snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);
  64387. 8033d34: 4629 mov r1, r5
  64388. 8033d36: 8fa2 ldrh r2, [r4, #60] ; 0x3c
  64389. 8033d38: 4630 mov r0, r6
  64390. 8033d3a: f7fc fceb bl 8030714 <snmp_asn1_enc_length>
  64391. ofs += m_trap->thl.pdulenlen;
  64392. 8033d3e: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  64393. 8033d42: 18ed adds r5, r5, r3
  64394. 8033d44: b2ad uxth r5, r5
  64395. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  64396. 8033d46: 4629 mov r1, r5
  64397. ofs += 1;
  64398. 8033d48: 3501 adds r5, #1
  64399. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  64400. ofs += 1;
  64401. snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);
  64402. ofs += m_trap->thl.pdulenlen;
  64403. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  64404. 8033d4a: 463a mov r2, r7
  64405. ofs += 1;
  64406. 8033d4c: b2ad uxth r5, r5
  64407. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  64408. ofs += 1;
  64409. snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);
  64410. ofs += m_trap->thl.pdulenlen;
  64411. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  64412. 8033d4e: 4630 mov r0, r6
  64413. 8033d50: f7fc fccc bl 80306ec <snmp_asn1_enc_type>
  64414. ofs += 1;
  64415. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  64416. 8033d54: 4629 mov r1, r5
  64417. 8033d56: 8f62 ldrh r2, [r4, #58] ; 0x3a
  64418. 8033d58: 4630 mov r0, r6
  64419. 8033d5a: f7fc fcdb bl 8030714 <snmp_asn1_enc_length>
  64420. ofs += m_trap->thl.eidlenlen;
  64421. 8033d5e: f894 302c ldrb.w r3, [r4, #44] ; 0x2c
  64422. 8033d62: 18ed adds r5, r5, r3
  64423. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  64424. 8033d64: 68a3 ldr r3, [r4, #8]
  64425. ofs += m_trap->thl.pdulenlen;
  64426. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  64427. ofs += 1;
  64428. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  64429. ofs += m_trap->thl.eidlenlen;
  64430. 8033d66: b2ad uxth r5, r5
  64431. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  64432. 8033d68: 4629 mov r1, r5
  64433. 8033d6a: f813 2b04 ldrb.w r2, [r3], #4
  64434. 8033d6e: 4630 mov r0, r6
  64435. 8033d70: f7fc fd85 bl 803087e <snmp_asn1_enc_oid>
  64436. ofs += m_trap->thl.eidlen;
  64437. 8033d74: 8f63 ldrh r3, [r4, #58] ; 0x3a
  64438. 8033d76: 18ed adds r5, r5, r3
  64439. 8033d78: b2ad uxth r5, r5
  64440. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  64441. 8033d7a: 4629 mov r1, r5
  64442. ofs += 1;
  64443. 8033d7c: 3501 adds r5, #1
  64444. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  64445. ofs += m_trap->thl.eidlenlen;
  64446. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  64447. ofs += m_trap->thl.eidlen;
  64448. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  64449. 8033d7e: 2240 movs r2, #64 ; 0x40
  64450. ofs += 1;
  64451. 8033d80: b2ad uxth r5, r5
  64452. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  64453. ofs += m_trap->thl.eidlenlen;
  64454. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  64455. ofs += m_trap->thl.eidlen;
  64456. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  64457. 8033d82: 4630 mov r0, r6
  64458. 8033d84: f7fc fcb2 bl 80306ec <snmp_asn1_enc_type>
  64459. ofs += 1;
  64460. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  64461. 8033d88: 4629 mov r1, r5
  64462. 8033d8a: 8f22 ldrh r2, [r4, #56] ; 0x38
  64463. 8033d8c: 4630 mov r0, r6
  64464. 8033d8e: f7fc fcc1 bl 8030714 <snmp_asn1_enc_length>
  64465. ofs += m_trap->thl.aaddrlenlen;
  64466. 8033d92: f894 302b ldrb.w r3, [r4, #43] ; 0x2b
  64467. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  64468. 8033d96: 8f22 ldrh r2, [r4, #56] ; 0x38
  64469. ofs += m_trap->thl.eidlen;
  64470. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  64471. ofs += 1;
  64472. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  64473. ofs += m_trap->thl.aaddrlenlen;
  64474. 8033d98: 18ed adds r5, r5, r3
  64475. 8033d9a: b2ad uxth r5, r5
  64476. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  64477. 8033d9c: 4629 mov r1, r5
  64478. 8033d9e: f104 030c add.w r3, r4, #12
  64479. 8033da2: 4630 mov r0, r6
  64480. 8033da4: f7fc fdde bl 8030964 <snmp_asn1_enc_raw>
  64481. ofs += m_trap->thl.aaddrlen;
  64482. 8033da8: 8f23 ldrh r3, [r4, #56] ; 0x38
  64483. 8033daa: 18ed adds r5, r5, r3
  64484. 8033dac: b2ad uxth r5, r5
  64485. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64486. 8033dae: 4629 mov r1, r5
  64487. ofs += 1;
  64488. 8033db0: 3501 adds r5, #1
  64489. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  64490. ofs += m_trap->thl.aaddrlenlen;
  64491. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  64492. ofs += m_trap->thl.aaddrlen;
  64493. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64494. 8033db2: 2202 movs r2, #2
  64495. ofs += 1;
  64496. 8033db4: b2ad uxth r5, r5
  64497. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  64498. ofs += m_trap->thl.aaddrlenlen;
  64499. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  64500. ofs += m_trap->thl.aaddrlen;
  64501. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64502. 8033db6: 4630 mov r0, r6
  64503. 8033db8: f7fc fc98 bl 80306ec <snmp_asn1_enc_type>
  64504. ofs += 1;
  64505. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  64506. 8033dbc: 4629 mov r1, r5
  64507. 8033dbe: 8ee2 ldrh r2, [r4, #54] ; 0x36
  64508. 8033dc0: 4630 mov r0, r6
  64509. 8033dc2: f7fc fca7 bl 8030714 <snmp_asn1_enc_length>
  64510. ofs += m_trap->thl.gtrplenlen;
  64511. 8033dc6: f894 302a ldrb.w r3, [r4, #42] ; 0x2a
  64512. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  64513. 8033dca: 8ee2 ldrh r2, [r4, #54] ; 0x36
  64514. ofs += m_trap->thl.aaddrlen;
  64515. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64516. ofs += 1;
  64517. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  64518. ofs += m_trap->thl.gtrplenlen;
  64519. 8033dcc: 18ed adds r5, r5, r3
  64520. 8033dce: b2ad uxth r5, r5
  64521. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  64522. 8033dd0: 4629 mov r1, r5
  64523. 8033dd2: 6923 ldr r3, [r4, #16]
  64524. 8033dd4: 4630 mov r0, r6
  64525. 8033dd6: f7fc fce5 bl 80307a4 <snmp_asn1_enc_u32t>
  64526. ofs += m_trap->thl.gtrplen;
  64527. 8033dda: 8ee3 ldrh r3, [r4, #54] ; 0x36
  64528. 8033ddc: 18ed adds r5, r5, r3
  64529. 8033dde: b2ad uxth r5, r5
  64530. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64531. 8033de0: 4629 mov r1, r5
  64532. ofs += 1;
  64533. 8033de2: 3501 adds r5, #1
  64534. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  64535. ofs += m_trap->thl.gtrplenlen;
  64536. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  64537. ofs += m_trap->thl.gtrplen;
  64538. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64539. 8033de4: 2202 movs r2, #2
  64540. ofs += 1;
  64541. 8033de6: b2ad uxth r5, r5
  64542. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  64543. ofs += m_trap->thl.gtrplenlen;
  64544. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  64545. ofs += m_trap->thl.gtrplen;
  64546. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64547. 8033de8: 4630 mov r0, r6
  64548. 8033dea: f7fc fc7f bl 80306ec <snmp_asn1_enc_type>
  64549. ofs += 1;
  64550. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  64551. 8033dee: 4629 mov r1, r5
  64552. 8033df0: 8ea2 ldrh r2, [r4, #52] ; 0x34
  64553. 8033df2: 4630 mov r0, r6
  64554. 8033df4: f7fc fc8e bl 8030714 <snmp_asn1_enc_length>
  64555. ofs += m_trap->thl.strplenlen;
  64556. 8033df8: f894 3029 ldrb.w r3, [r4, #41] ; 0x29
  64557. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  64558. 8033dfc: 8ea2 ldrh r2, [r4, #52] ; 0x34
  64559. ofs += m_trap->thl.gtrplen;
  64560. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  64561. ofs += 1;
  64562. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  64563. ofs += m_trap->thl.strplenlen;
  64564. 8033dfe: 18ed adds r5, r5, r3
  64565. 8033e00: b2ad uxth r5, r5
  64566. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  64567. 8033e02: 4629 mov r1, r5
  64568. 8033e04: 6963 ldr r3, [r4, #20]
  64569. 8033e06: 4630 mov r0, r6
  64570. 8033e08: f7fc fccc bl 80307a4 <snmp_asn1_enc_u32t>
  64571. ofs += m_trap->thl.strplen;
  64572. 8033e0c: 8ea3 ldrh r3, [r4, #52] ; 0x34
  64573. 8033e0e: 18ed adds r5, r5, r3
  64574. 8033e10: b2ad uxth r5, r5
  64575. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  64576. 8033e12: 4629 mov r1, r5
  64577. ofs += 1;
  64578. 8033e14: 3501 adds r5, #1
  64579. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  64580. ofs += m_trap->thl.strplenlen;
  64581. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  64582. ofs += m_trap->thl.strplen;
  64583. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  64584. 8033e16: 2243 movs r2, #67 ; 0x43
  64585. ofs += 1;
  64586. 8033e18: b2ad uxth r5, r5
  64587. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  64588. ofs += m_trap->thl.strplenlen;
  64589. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  64590. ofs += m_trap->thl.strplen;
  64591. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  64592. 8033e1a: 4630 mov r0, r6
  64593. 8033e1c: f7fc fc66 bl 80306ec <snmp_asn1_enc_type>
  64594. ofs += 1;
  64595. snmp_asn1_enc_length(p, ofs, m_trap->thl.tslen);
  64596. 8033e20: 4629 mov r1, r5
  64597. 8033e22: 8e62 ldrh r2, [r4, #50] ; 0x32
  64598. 8033e24: 4630 mov r0, r6
  64599. 8033e26: f7fc fc75 bl 8030714 <snmp_asn1_enc_length>
  64600. ofs += m_trap->thl.tslenlen;
  64601. 8033e2a: f894 3028 ldrb.w r3, [r4, #40] ; 0x28
  64602. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.tslen, m_trap->ts);
  64603. 8033e2e: 8e62 ldrh r2, [r4, #50] ; 0x32
  64604. ofs += m_trap->thl.strplen;
  64605. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  64606. ofs += 1;
  64607. snmp_asn1_enc_length(p, ofs, m_trap->thl.tslen);
  64608. ofs += m_trap->thl.tslenlen;
  64609. 8033e30: 18ed adds r5, r5, r3
  64610. 8033e32: b2ad uxth r5, r5
  64611. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.tslen, m_trap->ts);
  64612. 8033e34: 4629 mov r1, r5
  64613. 8033e36: 69a3 ldr r3, [r4, #24]
  64614. 8033e38: 4630 mov r0, r6
  64615. 8033e3a: f7fc fcb3 bl 80307a4 <snmp_asn1_enc_u32t>
  64616. ofs += m_trap->thl.tslen;
  64617. 8033e3e: 8e63 ldrh r3, [r4, #50] ; 0x32
  64618. 8033e40: 18ea adds r2, r5, r3
  64619. {
  64620. u16_t ofs;
  64621. /* pass 1, encode packet ino the pbuf(s) */
  64622. ofs = snmp_trap_header_enc(&trap_msg, p);
  64623. snmp_varbind_list_enc(&trap_msg.outvb, p, ofs);
  64624. 8033e42: 4631 mov r1, r6
  64625. 8033e44: e00a b.n 8033e5c <snmp_send_trap+0x360>
  64626. 8033e46: bf00 nop
  64627. 8033e48: 20011160 .word 0x20011160
  64628. 8033e4c: 20011148 .word 0x20011148
  64629. 8033e50: 20011164 .word 0x20011164
  64630. 8033e54: 080407ac .word 0x080407ac
  64631. 8033e58: 080407b0 .word 0x080407b0
  64632. 8033e5c: b292 uxth r2, r2
  64633. 8033e5e: f104 001c add.w r0, r4, #28
  64634. 8033e62: f7ff fcb7 bl 80337d4 <snmp_varbind_list_enc>
  64635. snmp_inc_snmpouttraps();
  64636. 8033e66: f7fe f859 bl 8031f1c <snmp_inc_snmpouttraps>
  64637. snmp_inc_snmpoutpkts();
  64638. 8033e6a: f7fd ffaf bl 8031dcc <snmp_inc_snmpoutpkts>
  64639. /** send to the TRAP destination */
  64640. udp_sendto(trap_msg.pcb, p, &trap_msg.dip, SNMP_TRAP_PORT);
  64641. 8033e6e: 4622 mov r2, r4
  64642. 8033e70: 4631 mov r1, r6
  64643. 8033e72: f852 0b04 ldr.w r0, [r2], #4
  64644. 8033e76: 23a2 movs r3, #162 ; 0xa2
  64645. 8033e78: f7fb fddb bl 802fa32 <udp_sendto>
  64646. pbuf_free(p);
  64647. 8033e7c: 4630 mov r0, r6
  64648. 8033e7e: f7f9 f8d7 bl 802d030 <pbuf_free>
  64649. {
  64650. return ERR_MEM;
  64651. }
  64652. }
  64653. }
  64654. return ERR_OK;
  64655. 8033e82: 2000 movs r0, #0
  64656. 8033e84: e000 b.n 8033e88 <snmp_send_trap+0x38c>
  64657. pbuf_free(p);
  64658. }
  64659. else
  64660. {
  64661. return ERR_MEM;
  64662. 8033e86: 20ff movs r0, #255 ; 0xff
  64663. }
  64664. }
  64665. }
  64666. return ERR_OK;
  64667. }
  64668. 8033e88: b240 sxtb r0, r0
  64669. 8033e8a: b005 add sp, #20
  64670. 8033e8c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  64671. 08033e90 <snmp_authfail_trap>:
  64672. snmp_send_trap(SNMP_GENTRAP_COLDSTART, NULL, 0);
  64673. }
  64674. void
  64675. snmp_authfail_trap(void)
  64676. {
  64677. 8033e90: b507 push {r0, r1, r2, lr}
  64678. u8_t enable;
  64679. snmp_get_snmpenableauthentraps(&enable);
  64680. 8033e92: f10d 0007 add.w r0, sp, #7
  64681. 8033e96: f7fe f84f bl 8031f38 <snmp_get_snmpenableauthentraps>
  64682. if (enable == 1)
  64683. 8033e9a: f89d 3007 ldrb.w r3, [sp, #7]
  64684. 8033e9e: 2b01 cmp r3, #1
  64685. 8033ea0: d109 bne.n 8033eb6 <snmp_authfail_trap+0x26>
  64686. {
  64687. trap_msg.outvb.head = NULL;
  64688. 8033ea2: 2100 movs r1, #0
  64689. 8033ea4: 4b04 ldr r3, [pc, #16] ; (8033eb8 <snmp_authfail_trap+0x28>)
  64690. trap_msg.outvb.tail = NULL;
  64691. trap_msg.outvb.count = 0;
  64692. snmp_send_trap(SNMP_GENTRAP_AUTHFAIL, NULL, 0);
  64693. 8033ea6: 2004 movs r0, #4
  64694. 8033ea8: 460a mov r2, r1
  64695. {
  64696. u8_t enable;
  64697. snmp_get_snmpenableauthentraps(&enable);
  64698. if (enable == 1)
  64699. {
  64700. trap_msg.outvb.head = NULL;
  64701. 8033eaa: 61d9 str r1, [r3, #28]
  64702. trap_msg.outvb.tail = NULL;
  64703. 8033eac: 6219 str r1, [r3, #32]
  64704. trap_msg.outvb.count = 0;
  64705. 8033eae: f883 1024 strb.w r1, [r3, #36] ; 0x24
  64706. snmp_send_trap(SNMP_GENTRAP_AUTHFAIL, NULL, 0);
  64707. 8033eb2: f7ff fe23 bl 8033afc <snmp_send_trap>
  64708. }
  64709. }
  64710. 8033eb6: bd0e pop {r1, r2, r3, pc}
  64711. 8033eb8: 20011148 .word 0x20011148
  64712. 08033ebc <etharp_send_ip>:
  64713. * @params dst the destination MAC address to be copied into the ethernet header
  64714. * @return ERR_OK if the packet was sent, any other err_t on failure
  64715. */
  64716. static err_t
  64717. etharp_send_ip(struct netif *netif, struct pbuf *p, struct eth_addr *src, struct eth_addr *dst)
  64718. {
  64719. 8033ebc: b5f8 push {r3, r4, r5, r6, r7, lr}
  64720. struct eth_hdr *ethhdr = (struct eth_hdr *)p->payload;
  64721. 8033ebe: 684c ldr r4, [r1, #4]
  64722. * @params dst the destination MAC address to be copied into the ethernet header
  64723. * @return ERR_OK if the packet was sent, any other err_t on failure
  64724. */
  64725. static err_t
  64726. etharp_send_ip(struct netif *netif, struct pbuf *p, struct eth_addr *src, struct eth_addr *dst)
  64727. {
  64728. 8033ec0: 4606 mov r6, r0
  64729. 8033ec2: 460d mov r5, r1
  64730. 8033ec4: 4617 mov r7, r2
  64731. struct eth_hdr *ethhdr = (struct eth_hdr *)p->payload;
  64732. LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!",
  64733. (netif->hwaddr_len == ETHARP_HWADDR_LEN));
  64734. ETHADDR32_COPY(&ethhdr->dest, dst);
  64735. 8033ec6: 4619 mov r1, r3
  64736. 8033ec8: 2206 movs r2, #6
  64737. 8033eca: 4620 mov r0, r4
  64738. 8033ecc: f7ed fd3e bl 802194c <memcpy>
  64739. ETHADDR16_COPY(&ethhdr->src, src);
  64740. 8033ed0: 4639 mov r1, r7
  64741. 8033ed2: 1da0 adds r0, r4, #6
  64742. 8033ed4: 2206 movs r2, #6
  64743. 8033ed6: f7ed fd39 bl 802194c <memcpy>
  64744. ethhdr->type = PP_HTONS(ETHTYPE_IP);
  64745. 8033eda: 2308 movs r3, #8
  64746. 8033edc: 7323 strb r3, [r4, #12]
  64747. 8033ede: 2300 movs r3, #0
  64748. 8033ee0: 7363 strb r3, [r4, #13]
  64749. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_send_ip: sending packet %p\n", (void *)p));
  64750. /* send the packet */
  64751. return netif->linkoutput(netif, p);
  64752. 8033ee2: 69b3 ldr r3, [r6, #24]
  64753. 8033ee4: 4630 mov r0, r6
  64754. 8033ee6: 4629 mov r1, r5
  64755. 8033ee8: 4798 blx r3
  64756. }
  64757. 8033eea: bdf8 pop {r3, r4, r5, r6, r7, pc}
  64758. 08033eec <etharp_free_entry>:
  64759. #endif /* ARP_QUEUEING */
  64760. /** Clean up ARP table entries */
  64761. static void
  64762. etharp_free_entry(int i)
  64763. {
  64764. 8033eec: b570 push {r4, r5, r6, lr}
  64765. /* remove from SNMP ARP index tree */
  64766. snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr);
  64767. 8033eee: 4d0b ldr r5, [pc, #44] ; (8033f1c <etharp_free_entry+0x30>)
  64768. 8033ef0: 2414 movs r4, #20
  64769. 8033ef2: 4344 muls r4, r0
  64770. 8033ef4: 1929 adds r1, r5, r4
  64771. #endif /* ARP_QUEUEING */
  64772. /** Clean up ARP table entries */
  64773. static void
  64774. etharp_free_entry(int i)
  64775. {
  64776. 8033ef6: 4606 mov r6, r0
  64777. /* remove from SNMP ARP index tree */
  64778. snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr);
  64779. 8033ef8: 3104 adds r1, #4
  64780. 8033efa: 6848 ldr r0, [r1, #4]
  64781. 8033efc: f7fd fc5a bl 80317b4 <snmp_delete_arpidx_tree>
  64782. /* and empty packet queue */
  64783. if (arp_table[i].q != NULL) {
  64784. 8033f00: 5928 ldr r0, [r5, r4]
  64785. 8033f02: b118 cbz r0, 8033f0c <etharp_free_entry+0x20>
  64786. /* remove all queued packets */
  64787. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_free_entry: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].q)));
  64788. free_etharp_q(arp_table[i].q);
  64789. 8033f04: f7f9 f894 bl 802d030 <pbuf_free>
  64790. arp_table[i].q = NULL;
  64791. 8033f08: 2300 movs r3, #0
  64792. 8033f0a: 512b str r3, [r5, r4]
  64793. }
  64794. /* recycle entry for re-use */
  64795. arp_table[i].state = ETHARP_STATE_EMPTY;
  64796. 8033f0c: 2314 movs r3, #20
  64797. 8033f0e: fb03 5506 mla r5, r3, r6, r5
  64798. 8033f12: 2300 movs r3, #0
  64799. 8033f14: 74ab strb r3, [r5, #18]
  64800. 8033f16: 3510 adds r5, #16
  64801. 8033f18: bd70 pop {r4, r5, r6, pc}
  64802. 8033f1a: bf00 nop
  64803. 8033f1c: 2000e410 .word 0x2000e410
  64804. 08033f20 <etharp_find_entry>:
  64805. * @return The ARP entry index that matched or is created, ERR_MEM if no
  64806. * entry is found or could be recycled.
  64807. */
  64808. static s8_t
  64809. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  64810. {
  64811. 8033f20: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  64812. s8_t empty = ARP_TABLE_SIZE;
  64813. u8_t i = 0, age_pending = 0, age_stable = 0;
  64814. /* oldest entry with packets on queue */
  64815. s8_t old_queue = ARP_TABLE_SIZE;
  64816. /* its age */
  64817. u8_t age_queue = 0;
  64818. 8033f24: 2500 movs r5, #0
  64819. {
  64820. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  64821. s8_t empty = ARP_TABLE_SIZE;
  64822. u8_t i = 0, age_pending = 0, age_stable = 0;
  64823. /* oldest entry with packets on queue */
  64824. s8_t old_queue = ARP_TABLE_SIZE;
  64825. 8033f26: 240a movs r4, #10
  64826. 8033f28: 4a35 ldr r2, [pc, #212] ; (8034000 <etharp_find_entry+0xe0>)
  64827. * @return The ARP entry index that matched or is created, ERR_MEM if no
  64828. * entry is found or could be recycled.
  64829. */
  64830. static s8_t
  64831. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  64832. {
  64833. 8033f2a: 9101 str r1, [sp, #4]
  64834. 8033f2c: 4606 mov r6, r0
  64835. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  64836. s8_t empty = ARP_TABLE_SIZE;
  64837. u8_t i = 0, age_pending = 0, age_stable = 0;
  64838. 8033f2e: 46a8 mov r8, r5
  64839. 8033f30: 46aa mov sl, r5
  64840. * 4) remember the oldest pending entry with queued packets (if any)
  64841. * 5) search for a matching IP entry, either pending or stable
  64842. * until 5 matches, or all entries are searched for.
  64843. */
  64844. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  64845. 8033f32: 462b mov r3, r5
  64846. */
  64847. static s8_t
  64848. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  64849. {
  64850. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  64851. s8_t empty = ARP_TABLE_SIZE;
  64852. 8033f34: 4627 mov r7, r4
  64853. * entry is found or could be recycled.
  64854. */
  64855. static s8_t
  64856. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  64857. {
  64858. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  64859. 8033f36: 46a4 mov ip, r4
  64860. 8033f38: 46a3 mov fp, r4
  64861. */
  64862. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  64863. u8_t state = arp_table[i].state;
  64864. /* no empty entry found yet and now we do find one? */
  64865. if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) {
  64866. 8033f3a: 2f0a cmp r7, #10
  64867. * 5) search for a matching IP entry, either pending or stable
  64868. * until 5 matches, or all entries are searched for.
  64869. */
  64870. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  64871. u8_t state = arp_table[i].state;
  64872. 8033f3c: f892 9012 ldrb.w r9, [r2, #18]
  64873. /* no empty entry found yet and now we do find one? */
  64874. if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) {
  64875. 8033f40: d104 bne.n 8033f4c <etharp_find_entry+0x2c>
  64876. 8033f42: f1b9 0f00 cmp.w r9, #0
  64877. 8033f46: d104 bne.n 8033f52 <etharp_find_entry+0x32>
  64878. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_find_entry: found empty entry %"U16_F"\n", (u16_t)i));
  64879. /* remember first empty entry */
  64880. empty = i;
  64881. 8033f48: b2df uxtb r7, r3
  64882. 8033f4a: e023 b.n 8033f94 <etharp_find_entry+0x74>
  64883. } else if (state != ETHARP_STATE_EMPTY) {
  64884. 8033f4c: f1b9 0f00 cmp.w r9, #0
  64885. 8033f50: d020 beq.n 8033f94 <etharp_find_entry+0x74>
  64886. LWIP_ASSERT("state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE",
  64887. state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE);
  64888. /* if given, does IP address match IP address in ARP entry? */
  64889. if (ipaddr && ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) {
  64890. 8033f52: b12e cbz r6, 8033f60 <etharp_find_entry+0x40>
  64891. 8033f54: 6830 ldr r0, [r6, #0]
  64892. 8033f56: 6851 ldr r1, [r2, #4]
  64893. 8033f58: 4288 cmp r0, r1
  64894. 8033f5a: d101 bne.n 8033f60 <etharp_find_entry+0x40>
  64895. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: found matching entry %"U16_F"\n", (u16_t)i));
  64896. /* found exact IP address match, simply bail out */
  64897. return i;
  64898. 8033f5c: 4618 mov r0, r3
  64899. 8033f5e: e04b b.n 8033ff8 <etharp_find_entry+0xd8>
  64900. }
  64901. /* pending entry? */
  64902. if (state == ETHARP_STATE_PENDING) {
  64903. 8033f60: f1b9 0f01 cmp.w r9, #1
  64904. 8033f64: d10e bne.n 8033f84 <etharp_find_entry+0x64>
  64905. /* pending with queued packets? */
  64906. if (arp_table[i].q != NULL) {
  64907. 8033f66: 6810 ldr r0, [r2, #0]
  64908. if (arp_table[i].ctime >= age_queue) {
  64909. 8033f68: f892 9013 ldrb.w r9, [r2, #19]
  64910. return i;
  64911. }
  64912. /* pending entry? */
  64913. if (state == ETHARP_STATE_PENDING) {
  64914. /* pending with queued packets? */
  64915. if (arp_table[i].q != NULL) {
  64916. 8033f6c: b120 cbz r0, 8033f78 <etharp_find_entry+0x58>
  64917. if (arp_table[i].ctime >= age_queue) {
  64918. 8033f6e: 45a9 cmp r9, r5
  64919. 8033f70: d310 bcc.n 8033f94 <etharp_find_entry+0x74>
  64920. old_queue = i;
  64921. 8033f72: b2dc uxtb r4, r3
  64922. 8033f74: 464d mov r5, r9
  64923. 8033f76: e00d b.n 8033f94 <etharp_find_entry+0x74>
  64924. age_queue = arp_table[i].ctime;
  64925. }
  64926. } else
  64927. /* pending without queued packets? */
  64928. {
  64929. if (arp_table[i].ctime >= age_pending) {
  64930. 8033f78: 45d1 cmp r9, sl
  64931. 8033f7a: d30b bcc.n 8033f94 <etharp_find_entry+0x74>
  64932. old_pending = i;
  64933. 8033f7c: fa5f fb83 uxtb.w fp, r3
  64934. 8033f80: 46ca mov sl, r9
  64935. 8033f82: e007 b.n 8033f94 <etharp_find_entry+0x74>
  64936. age_pending = arp_table[i].ctime;
  64937. }
  64938. }
  64939. /* stable entry? */
  64940. } else if (state >= ETHARP_STATE_STABLE) {
  64941. 8033f84: d906 bls.n 8033f94 <etharp_find_entry+0x74>
  64942. /* don't record old_stable for static entries since they never expire */
  64943. if (state < ETHARP_STATE_STATIC)
  64944. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  64945. {
  64946. /* remember entry with oldest stable entry in oldest, its age in maxtime */
  64947. if (arp_table[i].ctime >= age_stable) {
  64948. 8033f86: f892 9013 ldrb.w r9, [r2, #19]
  64949. 8033f8a: 45c1 cmp r9, r8
  64950. old_stable = i;
  64951. 8033f8c: bf24 itt cs
  64952. 8033f8e: fa5f fc83 uxtbcs.w ip, r3
  64953. 8033f92: 46c8 movcs r8, r9
  64954. * 4) remember the oldest pending entry with queued packets (if any)
  64955. * 5) search for a matching IP entry, either pending or stable
  64956. * until 5 matches, or all entries are searched for.
  64957. */
  64958. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  64959. 8033f94: 3301 adds r3, #1
  64960. 8033f96: b2db uxtb r3, r3
  64961. 8033f98: 3214 adds r2, #20
  64962. 8033f9a: 2b0a cmp r3, #10
  64963. 8033f9c: d1cd bne.n 8033f3a <etharp_find_entry+0x1a>
  64964. }
  64965. }
  64966. /* { we have no match } => try to create a new entry */
  64967. /* don't create new entry, only search? */
  64968. if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) ||
  64969. 8033f9e: 9a01 ldr r2, [sp, #4]
  64970. 8033fa0: f002 0302 and.w r3, r2, #2
  64971. 8033fa4: b2db uxtb r3, r3
  64972. 8033fa6: bb33 cbnz r3, 8033ff6 <etharp_find_entry+0xd6>
  64973. 8033fa8: 2f0a cmp r7, #10
  64974. 8033faa: d102 bne.n 8033fb2 <etharp_find_entry+0x92>
  64975. /* or no empty entry found and not allowed to recycle? */
  64976. ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) {
  64977. 8033fac: 07d3 lsls r3, r2, #31
  64978. 8033fae: d402 bmi.n 8033fb6 <etharp_find_entry+0x96>
  64979. 8033fb0: e021 b.n 8033ff6 <etharp_find_entry+0xd6>
  64980. * { ETHARP_FLAG_TRY_HARD is set at this point }
  64981. */
  64982. /* 1) empty entry available? */
  64983. if (empty < ARP_TABLE_SIZE) {
  64984. i = empty;
  64985. 8033fb2: b2fc uxtb r4, r7
  64986. 8033fb4: e011 b.n 8033fda <etharp_find_entry+0xba>
  64987. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting empty entry %"U16_F"\n", (u16_t)i));
  64988. } else {
  64989. /* 2) found recyclable stable entry? */
  64990. if (old_stable < ARP_TABLE_SIZE) {
  64991. 8033fb6: f1bc 0f0a cmp.w ip, #10
  64992. 8033fba: d002 beq.n 8033fc2 <etharp_find_entry+0xa2>
  64993. /* recycle oldest stable*/
  64994. i = old_stable;
  64995. 8033fbc: fa5f f48c uxtb.w r4, ip
  64996. 8033fc0: e008 b.n 8033fd4 <etharp_find_entry+0xb4>
  64997. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest stable entry %"U16_F"\n", (u16_t)i));
  64998. /* no queued packets should exist on stable entries */
  64999. LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL);
  65000. /* 3) found recyclable pending entry without queued packets? */
  65001. } else if (old_pending < ARP_TABLE_SIZE) {
  65002. 8033fc2: f1bb 0f0a cmp.w fp, #10
  65003. 8033fc6: d002 beq.n 8033fce <etharp_find_entry+0xae>
  65004. /* recycle oldest pending */
  65005. i = old_pending;
  65006. 8033fc8: fa5f f48b uxtb.w r4, fp
  65007. 8033fcc: e002 b.n 8033fd4 <etharp_find_entry+0xb4>
  65008. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %"U16_F" (without queue)\n", (u16_t)i));
  65009. /* 4) found recyclable pending entry with queued packets? */
  65010. } else if (old_queue < ARP_TABLE_SIZE) {
  65011. 8033fce: 2c0a cmp r4, #10
  65012. 8033fd0: d011 beq.n 8033ff6 <etharp_find_entry+0xd6>
  65013. /* recycle oldest pending (queued packets are free in etharp_free_entry) */
  65014. i = old_queue;
  65015. 8033fd2: b2e4 uxtb r4, r4
  65016. return (s8_t)ERR_MEM;
  65017. }
  65018. /* { empty or recyclable entry found } */
  65019. LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
  65020. etharp_free_entry(i);
  65021. 8033fd4: 4620 mov r0, r4
  65022. 8033fd6: f7ff ff89 bl 8033eec <etharp_free_entry>
  65023. 8033fda: 4b09 ldr r3, [pc, #36] ; (8034000 <etharp_find_entry+0xe0>)
  65024. LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
  65025. LWIP_ASSERT("arp_table[i].state == ETHARP_STATE_EMPTY",
  65026. arp_table[i].state == ETHARP_STATE_EMPTY);
  65027. /* IP address given? */
  65028. if (ipaddr != NULL) {
  65029. 8033fdc: b126 cbz r6, 8033fe8 <etharp_find_entry+0xc8>
  65030. /* set IP address */
  65031. ip_addr_copy(arp_table[i].ipaddr, *ipaddr);
  65032. 8033fde: 2214 movs r2, #20
  65033. 8033fe0: 6831 ldr r1, [r6, #0]
  65034. 8033fe2: fb02 3204 mla r2, r2, r4, r3
  65035. 8033fe6: 6051 str r1, [r2, #4]
  65036. }
  65037. arp_table[i].ctime = 0;
  65038. 8033fe8: 2214 movs r2, #20
  65039. 8033fea: fb02 3304 mla r3, r2, r4, r3
  65040. 8033fee: 2200 movs r2, #0
  65041. 8033ff0: 74da strb r2, [r3, #19]
  65042. return (err_t)i;
  65043. 8033ff2: 4620 mov r0, r4
  65044. 8033ff4: e000 b.n 8033ff8 <etharp_find_entry+0xd8>
  65045. /* don't create new entry, only search? */
  65046. if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) ||
  65047. /* or no empty entry found and not allowed to recycle? */
  65048. ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) {
  65049. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty entry found and not allowed to recycle\n"));
  65050. return (s8_t)ERR_MEM;
  65051. 8033ff6: 20ff movs r0, #255 ; 0xff
  65052. /* set IP address */
  65053. ip_addr_copy(arp_table[i].ipaddr, *ipaddr);
  65054. }
  65055. arp_table[i].ctime = 0;
  65056. return (err_t)i;
  65057. }
  65058. 8033ff8: b240 sxtb r0, r0
  65059. 8033ffa: e8bd 8ffe ldmia.w sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  65060. 8033ffe: bf00 nop
  65061. 8034000: 2000e410 .word 0x2000e410
  65062. 08034004 <etharp_tmr>:
  65063. * This function should be called every ETHARP_TMR_INTERVAL milliseconds (5 seconds),
  65064. * in order to expire entries in the ARP table.
  65065. */
  65066. void
  65067. etharp_tmr(void)
  65068. {
  65069. 8034004: b570 push {r4, r5, r6, lr}
  65070. 8034006: 4c0d ldr r4, [pc, #52] ; (803403c <etharp_tmr+0x38>)
  65071. 8034008: 2500 movs r5, #0
  65072. etharp_free_entry(i);
  65073. }
  65074. else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING) {
  65075. /* Reset state to stable, so that the next transmitted packet will
  65076. re-send an ARP request. */
  65077. arp_table[i].state = ETHARP_STATE_STABLE;
  65078. 803400a: 2602 movs r6, #2
  65079. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
  65080. /* remove expired entries from the ARP table */
  65081. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  65082. u8_t state = arp_table[i].state;
  65083. if (state != ETHARP_STATE_EMPTY
  65084. 803400c: 7ca3 ldrb r3, [r4, #18]
  65085. 803400e: b183 cbz r3, 8034032 <etharp_tmr+0x2e>
  65086. #if ETHARP_SUPPORT_STATIC_ENTRIES
  65087. && (state != ETHARP_STATE_STATIC)
  65088. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  65089. ) {
  65090. arp_table[i].ctime++;
  65091. 8034010: 7ce2 ldrb r2, [r4, #19]
  65092. 8034012: 3201 adds r2, #1
  65093. 8034014: b2d2 uxtb r2, r2
  65094. if ((arp_table[i].ctime >= ARP_MAXAGE) ||
  65095. 8034016: 2aef cmp r2, #239 ; 0xef
  65096. if (state != ETHARP_STATE_EMPTY
  65097. #if ETHARP_SUPPORT_STATIC_ENTRIES
  65098. && (state != ETHARP_STATE_STATIC)
  65099. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  65100. ) {
  65101. arp_table[i].ctime++;
  65102. 8034018: 74e2 strb r2, [r4, #19]
  65103. if ((arp_table[i].ctime >= ARP_MAXAGE) ||
  65104. 803401a: d803 bhi.n 8034024 <etharp_tmr+0x20>
  65105. 803401c: 2b01 cmp r3, #1
  65106. 803401e: d105 bne.n 803402c <etharp_tmr+0x28>
  65107. ((arp_table[i].state == ETHARP_STATE_PENDING) &&
  65108. 8034020: 2a01 cmp r2, #1
  65109. 8034022: d906 bls.n 8034032 <etharp_tmr+0x2e>
  65110. (arp_table[i].ctime >= ARP_MAXPENDING))) {
  65111. /* pending or stable entry has become old! */
  65112. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %"U16_F".\n",
  65113. arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", (u16_t)i));
  65114. /* clean up entries that have just been expired */
  65115. etharp_free_entry(i);
  65116. 8034024: 4628 mov r0, r5
  65117. 8034026: f7ff ff61 bl 8033eec <etharp_free_entry>
  65118. 803402a: e002 b.n 8034032 <etharp_tmr+0x2e>
  65119. }
  65120. else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING) {
  65121. 803402c: 2b03 cmp r3, #3
  65122. /* Reset state to stable, so that the next transmitted packet will
  65123. re-send an ARP request. */
  65124. arp_table[i].state = ETHARP_STATE_STABLE;
  65125. 803402e: bf08 it eq
  65126. 8034030: 74a6 strbeq r6, [r4, #18]
  65127. 8034032: 3501 adds r5, #1
  65128. 8034034: 3414 adds r4, #20
  65129. {
  65130. u8_t i;
  65131. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
  65132. /* remove expired entries from the ARP table */
  65133. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  65134. 8034036: 2d0a cmp r5, #10
  65135. 8034038: d1e8 bne.n 803400c <etharp_tmr+0x8>
  65136. /* resend an ARP query here? */
  65137. }
  65138. #endif /* ARP_QUEUEING */
  65139. }
  65140. }
  65141. }
  65142. 803403a: bd70 pop {r4, r5, r6, pc}
  65143. 803403c: 2000e410 .word 0x2000e410
  65144. 08034040 <etharp_cleanup_netif>:
  65145. * Remove all ARP table entries of the specified netif.
  65146. *
  65147. * @param netif points to a network interface
  65148. */
  65149. void etharp_cleanup_netif(struct netif *netif)
  65150. {
  65151. 8034040: b570 push {r4, r5, r6, lr}
  65152. 8034042: 4d08 ldr r5, [pc, #32] ; (8034064 <etharp_cleanup_netif+0x24>)
  65153. 8034044: 4606 mov r6, r0
  65154. 8034046: 2400 movs r4, #0
  65155. u8_t i;
  65156. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  65157. u8_t state = arp_table[i].state;
  65158. if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) {
  65159. 8034048: 7cab ldrb r3, [r5, #18]
  65160. 803404a: b12b cbz r3, 8034058 <etharp_cleanup_netif+0x18>
  65161. 803404c: 68ab ldr r3, [r5, #8]
  65162. 803404e: 42b3 cmp r3, r6
  65163. 8034050: d102 bne.n 8034058 <etharp_cleanup_netif+0x18>
  65164. etharp_free_entry(i);
  65165. 8034052: 4620 mov r0, r4
  65166. 8034054: f7ff ff4a bl 8033eec <etharp_free_entry>
  65167. 8034058: 3401 adds r4, #1
  65168. 803405a: 3514 adds r5, #20
  65169. */
  65170. void etharp_cleanup_netif(struct netif *netif)
  65171. {
  65172. u8_t i;
  65173. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  65174. 803405c: 2c0a cmp r4, #10
  65175. 803405e: d1f3 bne.n 8034048 <etharp_cleanup_netif+0x8>
  65176. u8_t state = arp_table[i].state;
  65177. if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) {
  65178. etharp_free_entry(i);
  65179. }
  65180. }
  65181. }
  65182. 8034060: bd70 pop {r4, r5, r6, pc}
  65183. 8034062: bf00 nop
  65184. 8034064: 2000e410 .word 0x2000e410
  65185. 08034068 <etharp_find_addr>:
  65186. * @return table index if found, -1 otherwise
  65187. */
  65188. s8_t
  65189. etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
  65190. struct eth_addr **eth_ret, ip_addr_t **ip_ret)
  65191. {
  65192. 8034068: b5f8 push {r3, r4, r5, r6, r7, lr}
  65193. LWIP_ASSERT("eth_ret != NULL && ip_ret != NULL",
  65194. eth_ret != NULL && ip_ret != NULL);
  65195. LWIP_UNUSED_ARG(netif);
  65196. i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY);
  65197. 803406a: 4608 mov r0, r1
  65198. 803406c: 2102 movs r1, #2
  65199. * @return table index if found, -1 otherwise
  65200. */
  65201. s8_t
  65202. etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
  65203. struct eth_addr **eth_ret, ip_addr_t **ip_ret)
  65204. {
  65205. 803406e: 4616 mov r6, r2
  65206. 8034070: 461f mov r7, r3
  65207. LWIP_ASSERT("eth_ret != NULL && ip_ret != NULL",
  65208. eth_ret != NULL && ip_ret != NULL);
  65209. LWIP_UNUSED_ARG(netif);
  65210. i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY);
  65211. 8034072: f7ff ff55 bl 8033f20 <etharp_find_entry>
  65212. if((i >= 0) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {
  65213. 8034076: 2800 cmp r0, #0
  65214. 8034078: db0c blt.n 8034094 <etharp_find_addr+0x2c>
  65215. 803407a: 2414 movs r4, #20
  65216. 803407c: 4d07 ldr r5, [pc, #28] ; (803409c <etharp_find_addr+0x34>)
  65217. 803407e: 4344 muls r4, r0
  65218. 8034080: 1929 adds r1, r5, r4
  65219. 8034082: 7c8b ldrb r3, [r1, #18]
  65220. 8034084: 2b01 cmp r3, #1
  65221. 8034086: d905 bls.n 8034094 <etharp_find_addr+0x2c>
  65222. *eth_ret = &arp_table[i].ethaddr;
  65223. 8034088: 460c mov r4, r1
  65224. 803408a: 340c adds r4, #12
  65225. *ip_ret = &arp_table[i].ipaddr;
  65226. 803408c: 3104 adds r1, #4
  65227. LWIP_UNUSED_ARG(netif);
  65228. i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY);
  65229. if((i >= 0) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {
  65230. *eth_ret = &arp_table[i].ethaddr;
  65231. 803408e: 6034 str r4, [r6, #0]
  65232. *ip_ret = &arp_table[i].ipaddr;
  65233. 8034090: 6039 str r1, [r7, #0]
  65234. return i;
  65235. 8034092: e000 b.n 8034096 <etharp_find_addr+0x2e>
  65236. }
  65237. return -1;
  65238. 8034094: 20ff movs r0, #255 ; 0xff
  65239. }
  65240. 8034096: b240 sxtb r0, r0
  65241. 8034098: bdf8 pop {r3, r4, r5, r6, r7, pc}
  65242. 803409a: bf00 nop
  65243. 803409c: 2000e410 .word 0x2000e410
  65244. 080340a0 <etharp_request>:
  65245. * ERR_MEM if the ARP packet couldn't be allocated
  65246. * any other err_t on failure
  65247. */
  65248. err_t
  65249. etharp_request(struct netif *netif, ip_addr_t *ipaddr)
  65250. {
  65251. 80340a0: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  65252. #endif /* LWIP_AUTOIP */
  65253. LWIP_ASSERT("netif != NULL", netif != NULL);
  65254. /* allocate a pbuf for the outgoing ARP request packet */
  65255. p = pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM);
  65256. 80340a4: 2200 movs r2, #0
  65257. * ERR_MEM if the ARP packet couldn't be allocated
  65258. * any other err_t on failure
  65259. */
  65260. err_t
  65261. etharp_request(struct netif *netif, ip_addr_t *ipaddr)
  65262. {
  65263. 80340a6: 4606 mov r6, r0
  65264. 80340a8: 4688 mov r8, r1
  65265. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n"));
  65266. return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
  65267. (struct eth_addr *)netif->hwaddr, &netif->ip_addr, &ethzero,
  65268. 80340aa: f100 0727 add.w r7, r0, #39 ; 0x27
  65269. 80340ae: f100 0904 add.w r9, r0, #4
  65270. #endif /* LWIP_AUTOIP */
  65271. LWIP_ASSERT("netif != NULL", netif != NULL);
  65272. /* allocate a pbuf for the outgoing ARP request packet */
  65273. p = pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM);
  65274. 80340b2: 212a movs r1, #42 ; 0x2a
  65275. 80340b4: 2003 movs r0, #3
  65276. 80340b6: f7f9 f808 bl 802d0ca <pbuf_alloc>
  65277. /* could allocate a pbuf for an ARP request? */
  65278. if (p == NULL) {
  65279. 80340ba: 4605 mov r5, r0
  65280. 80340bc: 2800 cmp r0, #0
  65281. 80340be: d03c beq.n 803413a <etharp_request+0x9a>
  65282. return ERR_MEM;
  65283. }
  65284. LWIP_ASSERT("check that first pbuf can hold struct etharp_hdr",
  65285. (p->len >= SIZEOF_ETHARP_PACKET));
  65286. ethhdr = (struct eth_hdr *)p->payload;
  65287. 80340c0: 6844 ldr r4, [r0, #4]
  65288. hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR);
  65289. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n"));
  65290. hdr->opcode = htons(opcode);
  65291. 80340c2: 2001 movs r0, #1
  65292. 80340c4: f7f7 fe76 bl 802bdb4 <lwip_htons>
  65293. * 'sender IP address' MUST be sent using link-layer broadcast instead of
  65294. * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */
  65295. ethdst_hwaddr = ip_addr_islinklocal(ipsrc_addr) ? (u8_t*)(ethbroadcast.addr) : ethdst_addr->addr;
  65296. #endif /* LWIP_AUTOIP */
  65297. /* Write the ARP MAC-Addresses */
  65298. ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr);
  65299. 80340c8: 4639 mov r1, r7
  65300. (p->len >= SIZEOF_ETHARP_PACKET));
  65301. ethhdr = (struct eth_hdr *)p->payload;
  65302. hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR);
  65303. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n"));
  65304. hdr->opcode = htons(opcode);
  65305. 80340ca: 82a0 strh r0, [r4, #20]
  65306. * 'sender IP address' MUST be sent using link-layer broadcast instead of
  65307. * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */
  65308. ethdst_hwaddr = ip_addr_islinklocal(ipsrc_addr) ? (u8_t*)(ethbroadcast.addr) : ethdst_addr->addr;
  65309. #endif /* LWIP_AUTOIP */
  65310. /* Write the ARP MAC-Addresses */
  65311. ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr);
  65312. 80340cc: 2206 movs r2, #6
  65313. 80340ce: f104 0016 add.w r0, r4, #22
  65314. 80340d2: f7ed fc3b bl 802194c <memcpy>
  65315. ETHADDR16_COPY(&hdr->dhwaddr, hwdst_addr);
  65316. 80340d6: 2206 movs r2, #6
  65317. 80340d8: f104 0020 add.w r0, r4, #32
  65318. 80340dc: 4919 ldr r1, [pc, #100] ; (8034144 <etharp_request+0xa4>)
  65319. 80340de: f7ed fc35 bl 802194c <memcpy>
  65320. /* Write the Ethernet MAC-Addresses */
  65321. #if LWIP_AUTOIP
  65322. ETHADDR16_COPY(&ethhdr->dest, ethdst_hwaddr);
  65323. #else /* LWIP_AUTOIP */
  65324. ETHADDR16_COPY(&ethhdr->dest, ethdst_addr);
  65325. 80340e2: 2206 movs r2, #6
  65326. 80340e4: 4620 mov r0, r4
  65327. 80340e6: 4918 ldr r1, [pc, #96] ; (8034148 <etharp_request+0xa8>)
  65328. 80340e8: f7ed fc30 bl 802194c <memcpy>
  65329. #endif /* LWIP_AUTOIP */
  65330. ETHADDR16_COPY(&ethhdr->src, ethsrc_addr);
  65331. 80340ec: 1da0 adds r0, r4, #6
  65332. 80340ee: 4639 mov r1, r7
  65333. 80340f0: 2206 movs r2, #6
  65334. 80340f2: f7ed fc2b bl 802194c <memcpy>
  65335. /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without
  65336. * structure packing. */
  65337. IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr);
  65338. 80340f6: 4649 mov r1, r9
  65339. 80340f8: 2204 movs r2, #4
  65340. 80340fa: f104 001c add.w r0, r4, #28
  65341. 80340fe: f7ed fc25 bl 802194c <memcpy>
  65342. IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
  65343. 8034102: 4641 mov r1, r8
  65344. 8034104: 2204 movs r2, #4
  65345. 8034106: f104 0026 add.w r0, r4, #38 ; 0x26
  65346. 803410a: f7ed fc1f bl 802194c <memcpy>
  65347. hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
  65348. 803410e: 2300 movs r3, #0
  65349. 8034110: 2201 movs r2, #1
  65350. 8034112: 73a3 strb r3, [r4, #14]
  65351. 8034114: 73e2 strb r2, [r4, #15]
  65352. hdr->proto = PP_HTONS(ETHTYPE_IP);
  65353. 8034116: 7463 strb r3, [r4, #17]
  65354. 8034118: 2208 movs r2, #8
  65355. /* set hwlen and protolen */
  65356. hdr->hwlen = ETHARP_HWADDR_LEN;
  65357. 803411a: 2306 movs r3, #6
  65358. hdr->protolen = sizeof(ip_addr_t);
  65359. 803411c: 2104 movs r1, #4
  65360. * structure packing. */
  65361. IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr);
  65362. IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
  65363. hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
  65364. hdr->proto = PP_HTONS(ETHTYPE_IP);
  65365. 803411e: 7422 strb r2, [r4, #16]
  65366. /* set hwlen and protolen */
  65367. hdr->hwlen = ETHARP_HWADDR_LEN;
  65368. hdr->protolen = sizeof(ip_addr_t);
  65369. 8034120: 74e1 strb r1, [r4, #19]
  65370. ethhdr->type = PP_HTONS(ETHTYPE_ARP);
  65371. 8034122: 7322 strb r2, [r4, #12]
  65372. IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
  65373. hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
  65374. hdr->proto = PP_HTONS(ETHTYPE_IP);
  65375. /* set hwlen and protolen */
  65376. hdr->hwlen = ETHARP_HWADDR_LEN;
  65377. 8034124: 74a3 strb r3, [r4, #18]
  65378. hdr->protolen = sizeof(ip_addr_t);
  65379. ethhdr->type = PP_HTONS(ETHTYPE_ARP);
  65380. 8034126: 7363 strb r3, [r4, #13]
  65381. /* send ARP query */
  65382. result = netif->linkoutput(netif, p);
  65383. 8034128: 69b3 ldr r3, [r6, #24]
  65384. 803412a: 4630 mov r0, r6
  65385. 803412c: 4629 mov r1, r5
  65386. 803412e: 4798 blx r3
  65387. 8034130: 4604 mov r4, r0
  65388. ETHARP_STATS_INC(etharp.xmit);
  65389. /* free ARP query packet */
  65390. pbuf_free(p);
  65391. 8034132: 4628 mov r0, r5
  65392. 8034134: f7f8 ff7c bl 802d030 <pbuf_free>
  65393. 8034138: e000 b.n 803413c <etharp_request+0x9c>
  65394. /* could allocate a pbuf for an ARP request? */
  65395. if (p == NULL) {
  65396. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  65397. ("etharp_raw: could not allocate pbuf for ARP request.\n"));
  65398. ETHARP_STATS_INC(etharp.memerr);
  65399. return ERR_MEM;
  65400. 803413a: 24ff movs r4, #255 ; 0xff
  65401. {
  65402. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n"));
  65403. return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
  65404. (struct eth_addr *)netif->hwaddr, &netif->ip_addr, &ethzero,
  65405. ipaddr, ARP_REQUEST);
  65406. }
  65407. 803413c: b260 sxtb r0, r4
  65408. 803413e: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  65409. 8034142: bf00 nop
  65410. 8034144: 080407bd .word 0x080407bd
  65411. 8034148: 080407b7 .word 0x080407b7
  65412. 0803414c <etharp_query>:
  65413. * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
  65414. *
  65415. */
  65416. err_t
  65417. etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
  65418. {
  65419. 803414c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  65420. 8034150: 4607 mov r7, r0
  65421. 8034152: 460e mov r6, r1
  65422. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  65423. err_t result = ERR_MEM;
  65424. s8_t i; /* ARP entry index */
  65425. /* non-unicast address? */
  65426. if (ip_addr_isbroadcast(ipaddr, netif) ||
  65427. 8034154: 6808 ldr r0, [r1, #0]
  65428. 8034156: 4639 mov r1, r7
  65429. * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
  65430. *
  65431. */
  65432. err_t
  65433. etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
  65434. {
  65435. 8034158: 4615 mov r5, r2
  65436. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  65437. err_t result = ERR_MEM;
  65438. s8_t i; /* ARP entry index */
  65439. /* non-unicast address? */
  65440. if (ip_addr_isbroadcast(ipaddr, netif) ||
  65441. 803415a: f7fb fe03 bl 802fd64 <ip4_addr_isbroadcast>
  65442. 803415e: 2800 cmp r0, #0
  65443. 8034160: d157 bne.n 8034212 <etharp_query+0xc6>
  65444. ip_addr_ismulticast(ipaddr) ||
  65445. 8034162: 6833 ldr r3, [r6, #0]
  65446. 8034164: f003 02f0 and.w r2, r3, #240 ; 0xf0
  65447. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  65448. err_t result = ERR_MEM;
  65449. s8_t i; /* ARP entry index */
  65450. /* non-unicast address? */
  65451. if (ip_addr_isbroadcast(ipaddr, netif) ||
  65452. 8034168: 2ae0 cmp r2, #224 ; 0xe0
  65453. 803416a: d052 beq.n 8034212 <etharp_query+0xc6>
  65454. ip_addr_ismulticast(ipaddr) ||
  65455. ip_addr_isany(ipaddr)) {
  65456. 803416c: 2b00 cmp r3, #0
  65457. 803416e: d050 beq.n 8034212 <etharp_query+0xc6>
  65458. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n"));
  65459. return ERR_ARG;
  65460. }
  65461. /* find entry in ARP cache, ask to create entry if queueing packet */
  65462. i = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD);
  65463. 8034170: 2101 movs r1, #1
  65464. 8034172: 4630 mov r0, r6
  65465. 8034174: f7ff fed4 bl 8033f20 <etharp_find_entry>
  65466. /* could not find or create entry? */
  65467. if (i < 0) {
  65468. 8034178: 1e04 subs r4, r0, #0
  65469. 803417a: db4f blt.n 803421c <etharp_query+0xd0>
  65470. }
  65471. return (err_t)i;
  65472. }
  65473. /* mark a fresh entry as pending (we just sent a request) */
  65474. if (arp_table[i].state == ETHARP_STATE_EMPTY) {
  65475. 803417c: 4931 ldr r1, [pc, #196] ; (8034244 <etharp_query+0xf8>)
  65476. 803417e: 2214 movs r2, #20
  65477. 8034180: fb02 1304 mla r3, r2, r4, r1
  65478. 8034184: 3310 adds r3, #16
  65479. 8034186: 7898 ldrb r0, [r3, #2]
  65480. 8034188: b908 cbnz r0, 803418e <etharp_query+0x42>
  65481. arp_table[i].state = ETHARP_STATE_PENDING;
  65482. 803418a: 2001 movs r0, #1
  65483. 803418c: 7098 strb r0, [r3, #2]
  65484. LWIP_ASSERT("arp_table[i].state == PENDING or STABLE",
  65485. ((arp_table[i].state == ETHARP_STATE_PENDING) ||
  65486. (arp_table[i].state >= ETHARP_STATE_STABLE)));
  65487. /* do we have a pending entry? or an implicit query request? */
  65488. if ((arp_table[i].state == ETHARP_STATE_PENDING) || (q == NULL)) {
  65489. 803418e: fb02 1204 mla r2, r2, r4, r1
  65490. 8034192: 7c93 ldrb r3, [r2, #18]
  65491. 8034194: 2b01 cmp r3, #1
  65492. 8034196: d000 beq.n 803419a <etharp_query+0x4e>
  65493. 8034198: b935 cbnz r5, 80341a8 <etharp_query+0x5c>
  65494. /* try to resolve it; send out ARP request */
  65495. result = etharp_request(netif, ipaddr);
  65496. 803419a: 4638 mov r0, r7
  65497. 803419c: 4631 mov r1, r6
  65498. 803419e: f7ff ff7f bl 80340a0 <etharp_request>
  65499. 80341a2: 4602 mov r2, r0
  65500. /* ARP request couldn't be sent */
  65501. /* We don't re-send arp request in etharp_tmr, but we still queue packets,
  65502. since this failure could be temporary, and the next packet calling
  65503. etharp_query again could lead to sending the queued packets. */
  65504. }
  65505. if (q == NULL) {
  65506. 80341a4: b90d cbnz r5, 80341aa <etharp_query+0x5e>
  65507. 80341a6: e036 b.n 8034216 <etharp_query+0xca>
  65508. */
  65509. err_t
  65510. etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
  65511. {
  65512. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  65513. err_t result = ERR_MEM;
  65514. 80341a8: 22ff movs r2, #255 ; 0xff
  65515. }
  65516. /* packet given? */
  65517. LWIP_ASSERT("q != NULL", q != NULL);
  65518. /* stable entry? */
  65519. if (arp_table[i].state >= ETHARP_STATE_STABLE) {
  65520. 80341aa: 2314 movs r3, #20
  65521. 80341ac: 4925 ldr r1, [pc, #148] ; (8034244 <etharp_query+0xf8>)
  65522. 80341ae: 4363 muls r3, r4
  65523. 80341b0: 18c8 adds r0, r1, r3
  65524. 80341b2: 7c80 ldrb r0, [r0, #18]
  65525. 80341b4: 2801 cmp r0, #1
  65526. 80341b6: d90b bls.n 80341d0 <etharp_query+0x84>
  65527. /* we have a valid IP->Ethernet address mapping */
  65528. ETHARP_SET_HINT(netif, i);
  65529. 80341b8: 4a23 ldr r2, [pc, #140] ; (8034248 <etharp_query+0xfc>)
  65530. /* send the packet */
  65531. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  65532. 80341ba: 18cb adds r3, r1, r3
  65533. /* packet given? */
  65534. LWIP_ASSERT("q != NULL", q != NULL);
  65535. /* stable entry? */
  65536. if (arp_table[i].state >= ETHARP_STATE_STABLE) {
  65537. /* we have a valid IP->Ethernet address mapping */
  65538. ETHARP_SET_HINT(netif, i);
  65539. 80341bc: 7014 strb r4, [r2, #0]
  65540. /* send the packet */
  65541. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  65542. 80341be: 4638 mov r0, r7
  65543. 80341c0: 4629 mov r1, r5
  65544. 80341c2: f107 0227 add.w r2, r7, #39 ; 0x27
  65545. 80341c6: 330c adds r3, #12
  65546. 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));
  65547. result = ERR_MEM;
  65548. }
  65549. }
  65550. return result;
  65551. }
  65552. 80341c8: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  65553. /* stable entry? */
  65554. if (arp_table[i].state >= ETHARP_STATE_STABLE) {
  65555. /* we have a valid IP->Ethernet address mapping */
  65556. ETHARP_SET_HINT(netif, i);
  65557. /* send the packet */
  65558. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  65559. 80341cc: f7ff be76 b.w 8033ebc <etharp_send_ip>
  65560. /* pending entry? (either just created or already pending */
  65561. } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
  65562. 80341d0: d123 bne.n 803421a <etharp_query+0xce>
  65563. 80341d2: 462b mov r3, r5
  65564. 80341d4: e003 b.n 80341de <etharp_query+0x92>
  65565. * to copy the whole queue into a new PBUF_RAM (see bug #11400)
  65566. * PBUF_ROMs can be left as they are, since ROM must not get changed. */
  65567. p = q;
  65568. while (p) {
  65569. LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0));
  65570. if(p->type != PBUF_ROM) {
  65571. 80341d6: 7b1a ldrb r2, [r3, #12]
  65572. 80341d8: 2a01 cmp r2, #1
  65573. 80341da: d128 bne.n 803422e <etharp_query+0xe2>
  65574. copy_needed = 1;
  65575. break;
  65576. }
  65577. p = p->next;
  65578. 80341dc: 681b ldr r3, [r3, #0]
  65579. int copy_needed = 0;
  65580. /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but
  65581. * to copy the whole queue into a new PBUF_RAM (see bug #11400)
  65582. * PBUF_ROMs can be left as they are, since ROM must not get changed. */
  65583. p = q;
  65584. while (p) {
  65585. 80341de: 2b00 cmp r3, #0
  65586. 80341e0: d1f9 bne.n 80341d6 <etharp_query+0x8a>
  65587. 80341e2: e01e b.n 8034222 <etharp_query+0xd6>
  65588. }
  65589. if(copy_needed) {
  65590. /* copy the whole packet into new pbufs */
  65591. p = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
  65592. if(p != NULL) {
  65593. if (pbuf_copy(p, q) != ERR_OK) {
  65594. 80341e4: 4629 mov r1, r5
  65595. 80341e6: f7f9 f827 bl 802d238 <pbuf_copy>
  65596. 80341ea: b120 cbz r0, 80341f6 <etharp_query+0xaa>
  65597. pbuf_free(p);
  65598. 80341ec: 4630 mov r0, r6
  65599. 80341ee: f7f8 ff1f bl 802d030 <pbuf_free>
  65600. 80341f2: e024 b.n 803423e <etharp_query+0xf2>
  65601. /* referencing the old pbuf is enough */
  65602. p = q;
  65603. pbuf_ref(p);
  65604. }
  65605. /* packet could be taken over? */
  65606. if (p != NULL) {
  65607. 80341f4: 462e mov r6, r5
  65608. 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));
  65609. result = ERR_MEM;
  65610. }
  65611. #else /* ARP_QUEUEING */
  65612. /* always queue one packet per ARP request only, freeing a previously queued packet */
  65613. if (arp_table[i].q != NULL) {
  65614. 80341f6: 2314 movs r3, #20
  65615. 80341f8: 4a12 ldr r2, [pc, #72] ; (8034244 <etharp_query+0xf8>)
  65616. 80341fa: fb03 f104 mul.w r1, r3, r4
  65617. 80341fe: 4615 mov r5, r2
  65618. 8034200: 5850 ldr r0, [r2, r1]
  65619. 8034202: 461f mov r7, r3
  65620. 8034204: b108 cbz r0, 803420a <etharp_query+0xbe>
  65621. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: dropped previously queued packet %p for ARP entry %"S16_F"\n", (void *)q, (s16_t)i));
  65622. pbuf_free(arp_table[i].q);
  65623. 8034206: f7f8 ff13 bl 802d030 <pbuf_free>
  65624. }
  65625. arp_table[i].q = p;
  65626. 803420a: 437c muls r4, r7
  65627. 803420c: 512e str r6, [r5, r4]
  65628. result = ERR_OK;
  65629. 803420e: 2400 movs r4, #0
  65630. 8034210: e004 b.n 803421c <etharp_query+0xd0>
  65631. /* non-unicast address? */
  65632. if (ip_addr_isbroadcast(ipaddr, netif) ||
  65633. ip_addr_ismulticast(ipaddr) ||
  65634. ip_addr_isany(ipaddr)) {
  65635. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n"));
  65636. return ERR_ARG;
  65637. 8034212: 24f2 movs r4, #242 ; 0xf2
  65638. 8034214: e002 b.n 803421c <etharp_query+0xd0>
  65639. /* We don't re-send arp request in etharp_tmr, but we still queue packets,
  65640. since this failure could be temporary, and the next packet calling
  65641. etharp_query again could lead to sending the queued packets. */
  65642. }
  65643. if (q == NULL) {
  65644. return result;
  65645. 8034216: 4604 mov r4, r0
  65646. 8034218: e000 b.n 803421c <etharp_query+0xd0>
  65647. /* we have a valid IP->Ethernet address mapping */
  65648. ETHARP_SET_HINT(netif, i);
  65649. /* send the packet */
  65650. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  65651. /* pending entry? (either just created or already pending */
  65652. } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
  65653. 803421a: 4614 mov r4, r2
  65654. 803421c: b260 sxtb r0, r4
  65655. 803421e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  65656. }
  65657. }
  65658. } else {
  65659. /* referencing the old pbuf is enough */
  65660. p = q;
  65661. pbuf_ref(p);
  65662. 8034222: 4628 mov r0, r5
  65663. 8034224: f7f8 ffe1 bl 802d1ea <pbuf_ref>
  65664. }
  65665. /* packet could be taken over? */
  65666. if (p != NULL) {
  65667. 8034228: 2d00 cmp r5, #0
  65668. 803422a: d1e3 bne.n 80341f4 <etharp_query+0xa8>
  65669. 803422c: e007 b.n 803423e <etharp_query+0xf2>
  65670. }
  65671. p = p->next;
  65672. }
  65673. if(copy_needed) {
  65674. /* copy the whole packet into new pbufs */
  65675. p = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
  65676. 803422e: 2003 movs r0, #3
  65677. 8034230: 8919 ldrh r1, [r3, #8]
  65678. 8034232: 2200 movs r2, #0
  65679. 8034234: f7f8 ff49 bl 802d0ca <pbuf_alloc>
  65680. if(p != NULL) {
  65681. 8034238: 4606 mov r6, r0
  65682. 803423a: 2800 cmp r0, #0
  65683. 803423c: d1d2 bne.n 80341e4 <etharp_query+0x98>
  65684. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i));
  65685. #endif /* ARP_QUEUEING */
  65686. } else {
  65687. ETHARP_STATS_INC(etharp.memerr);
  65688. 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));
  65689. result = ERR_MEM;
  65690. 803423e: 24ff movs r4, #255 ; 0xff
  65691. 8034240: e7ec b.n 803421c <etharp_query+0xd0>
  65692. 8034242: bf00 nop
  65693. 8034244: 2000e410 .word 0x2000e410
  65694. 8034248: 2000e40c .word 0x2000e40c
  65695. 0803424c <etharp_output_to_arp_index>:
  65696. /** Just a small helper function that sends a pbuf to an ethernet address
  65697. * in the arp_table specified by the index 'arp_idx'.
  65698. */
  65699. static err_t
  65700. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  65701. {
  65702. 803424c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  65703. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  65704. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  65705. /* if arp table entry is about to expire: re-request it,
  65706. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  65707. network with ARP requests if this address is used frequently. */
  65708. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  65709. 8034250: 4b10 ldr r3, [pc, #64] ; (8034294 <etharp_output_to_arp_index+0x48>)
  65710. /** Just a small helper function that sends a pbuf to an ethernet address
  65711. * in the arp_table specified by the index 'arp_idx'.
  65712. */
  65713. static err_t
  65714. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  65715. {
  65716. 8034252: 4615 mov r5, r2
  65717. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  65718. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  65719. /* if arp table entry is about to expire: re-request it,
  65720. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  65721. network with ARP requests if this address is used frequently. */
  65722. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  65723. 8034254: 2214 movs r2, #20
  65724. /** Just a small helper function that sends a pbuf to an ethernet address
  65725. * in the arp_table specified by the index 'arp_idx'.
  65726. */
  65727. static err_t
  65728. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  65729. {
  65730. 8034256: 460e mov r6, r1
  65731. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  65732. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  65733. /* if arp table entry is about to expire: re-request it,
  65734. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  65735. network with ARP requests if this address is used frequently. */
  65736. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  65737. 8034258: fb02 3105 mla r1, r2, r5, r3
  65738. /** Just a small helper function that sends a pbuf to an ethernet address
  65739. * in the arp_table specified by the index 'arp_idx'.
  65740. */
  65741. static err_t
  65742. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  65743. {
  65744. 803425c: 4607 mov r7, r0
  65745. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  65746. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  65747. /* if arp table entry is about to expire: re-request it,
  65748. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  65749. network with ARP requests if this address is used frequently. */
  65750. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  65751. 803425e: 7c8a ldrb r2, [r1, #18]
  65752. 8034260: 2a02 cmp r2, #2
  65753. 8034262: f101 0410 add.w r4, r1, #16
  65754. 8034266: d108 bne.n 803427a <etharp_output_to_arp_index+0x2e>
  65755. 8034268: 7cca ldrb r2, [r1, #19]
  65756. 803426a: 2ae3 cmp r2, #227 ; 0xe3
  65757. 803426c: d905 bls.n 803427a <etharp_output_to_arp_index+0x2e>
  65758. (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED)) {
  65759. if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) {
  65760. 803426e: 3104 adds r1, #4
  65761. 8034270: f7ff ff16 bl 80340a0 <etharp_request>
  65762. 8034274: b908 cbnz r0, 803427a <etharp_output_to_arp_index+0x2e>
  65763. arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING;
  65764. 8034276: 2303 movs r3, #3
  65765. 8034278: 70a3 strb r3, [r4, #2]
  65766. }
  65767. }
  65768. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr),
  65769. 803427a: 4b06 ldr r3, [pc, #24] ; (8034294 <etharp_output_to_arp_index+0x48>)
  65770. 803427c: 2214 movs r2, #20
  65771. 803427e: fb02 3305 mla r3, r2, r5, r3
  65772. 8034282: 4638 mov r0, r7
  65773. 8034284: 4631 mov r1, r6
  65774. 8034286: f107 0227 add.w r2, r7, #39 ; 0x27
  65775. 803428a: 330c adds r3, #12
  65776. &arp_table[arp_idx].ethaddr);
  65777. }
  65778. 803428c: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  65779. if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) {
  65780. arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING;
  65781. }
  65782. }
  65783. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr),
  65784. 8034290: f7ff be14 b.w 8033ebc <etharp_send_ip>
  65785. 8034294: 2000e410 .word 0x2000e410
  65786. 08034298 <etharp_output>:
  65787. * - ERR_RTE No route to destination (no gateway to external networks),
  65788. * or the return type of either etharp_query() or etharp_send_ip().
  65789. */
  65790. err_t
  65791. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  65792. {
  65793. 8034298: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  65794. 803429a: 4604 mov r4, r0
  65795. 803429c: 460e mov r6, r1
  65796. LWIP_ASSERT("netif != NULL", netif != NULL);
  65797. LWIP_ASSERT("q != NULL", q != NULL);
  65798. LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
  65799. /* make room for Ethernet header - should not fail */
  65800. if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
  65801. 803429e: 4608 mov r0, r1
  65802. 80342a0: 210e movs r1, #14
  65803. * - ERR_RTE No route to destination (no gateway to external networks),
  65804. * or the return type of either etharp_query() or etharp_send_ip().
  65805. */
  65806. err_t
  65807. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  65808. {
  65809. 80342a2: 4615 mov r5, r2
  65810. LWIP_ASSERT("netif != NULL", netif != NULL);
  65811. LWIP_ASSERT("q != NULL", q != NULL);
  65812. LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
  65813. /* make room for Ethernet header - should not fail */
  65814. if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
  65815. 80342a4: f7f8 fe99 bl 802cfda <pbuf_header>
  65816. 80342a8: 2800 cmp r0, #0
  65817. 80342aa: d163 bne.n 8034374 <etharp_output+0xdc>
  65818. /* Determine on destination hardware address. Broadcasts and multicasts
  65819. * are special, other IP addresses are looked up in the ARP table. */
  65820. /* broadcast destination IP address? */
  65821. if (ip_addr_isbroadcast(ipaddr, netif)) {
  65822. 80342ac: 6828 ldr r0, [r5, #0]
  65823. 80342ae: 4621 mov r1, r4
  65824. 80342b0: f7fb fd58 bl 802fd64 <ip4_addr_isbroadcast>
  65825. 80342b4: 2800 cmp r0, #0
  65826. 80342b6: d155 bne.n 8034364 <etharp_output+0xcc>
  65827. /* broadcast on Ethernet also */
  65828. dest = (struct eth_addr *)&ethbroadcast;
  65829. /* multicast destination IP address? */
  65830. } else if (ip_addr_ismulticast(ipaddr)) {
  65831. 80342b8: 682b ldr r3, [r5, #0]
  65832. 80342ba: f003 02f0 and.w r2, r3, #240 ; 0xf0
  65833. 80342be: 2ae0 cmp r2, #224 ; 0xe0
  65834. 80342c0: d114 bne.n 80342ec <etharp_output+0x54>
  65835. /* Hash IP multicast address to MAC address.*/
  65836. mcastaddr.addr[0] = LL_MULTICAST_ADDR_0;
  65837. 80342c2: 2301 movs r3, #1
  65838. 80342c4: f88d 3000 strb.w r3, [sp]
  65839. mcastaddr.addr[1] = LL_MULTICAST_ADDR_1;
  65840. mcastaddr.addr[2] = LL_MULTICAST_ADDR_2;
  65841. 80342c8: 235e movs r3, #94 ; 0x5e
  65842. 80342ca: f88d 3002 strb.w r3, [sp, #2]
  65843. mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
  65844. 80342ce: 786b ldrb r3, [r5, #1]
  65845. dest = (struct eth_addr *)&ethbroadcast;
  65846. /* multicast destination IP address? */
  65847. } else if (ip_addr_ismulticast(ipaddr)) {
  65848. /* Hash IP multicast address to MAC address.*/
  65849. mcastaddr.addr[0] = LL_MULTICAST_ADDR_0;
  65850. mcastaddr.addr[1] = LL_MULTICAST_ADDR_1;
  65851. 80342d0: f88d 0001 strb.w r0, [sp, #1]
  65852. mcastaddr.addr[2] = LL_MULTICAST_ADDR_2;
  65853. mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
  65854. 80342d4: f003 037f and.w r3, r3, #127 ; 0x7f
  65855. 80342d8: f88d 3003 strb.w r3, [sp, #3]
  65856. mcastaddr.addr[4] = ip4_addr3(ipaddr);
  65857. 80342dc: 78ab ldrb r3, [r5, #2]
  65858. 80342de: f88d 3004 strb.w r3, [sp, #4]
  65859. mcastaddr.addr[5] = ip4_addr4(ipaddr);
  65860. 80342e2: 78eb ldrb r3, [r5, #3]
  65861. 80342e4: f88d 3005 strb.w r3, [sp, #5]
  65862. /* destination Ethernet address is multicast */
  65863. dest = &mcastaddr;
  65864. 80342e8: 466b mov r3, sp
  65865. 80342ea: e03c b.n 8034366 <etharp_output+0xce>
  65866. /* unicast destination IP address? */
  65867. } else {
  65868. s8_t i;
  65869. /* outside local network? if so, this can neither be a global broadcast nor
  65870. a subnet broadcast. */
  65871. if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask)) &&
  65872. 80342ec: 6862 ldr r2, [r4, #4]
  65873. 80342ee: ea83 0102 eor.w r1, r3, r2
  65874. 80342f2: 68a2 ldr r2, [r4, #8]
  65875. 80342f4: 4211 tst r1, r2
  65876. 80342f6: d009 beq.n 803430c <etharp_output+0x74>
  65877. !ip_addr_islinklocal(ipaddr)) {
  65878. 80342f8: b29b uxth r3, r3
  65879. /* unicast destination IP address? */
  65880. } else {
  65881. s8_t i;
  65882. /* outside local network? if so, this can neither be a global broadcast nor
  65883. a subnet broadcast. */
  65884. if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask)) &&
  65885. 80342fa: f64f 62a9 movw r2, #65193 ; 0xfea9
  65886. 80342fe: 4293 cmp r3, r2
  65887. 8034300: d004 beq.n 803430c <etharp_output+0x74>
  65888. router for forwarding". */
  65889. if (!ip_addr_islinklocal(&iphdr->src))
  65890. #endif /* LWIP_AUTOIP */
  65891. {
  65892. /* interface has default gateway? */
  65893. if (!ip_addr_isany(&netif->gw)) {
  65894. 8034302: 68e3 ldr r3, [r4, #12]
  65895. 8034304: f104 010c add.w r1, r4, #12
  65896. 8034308: b90b cbnz r3, 803430e <etharp_output+0x76>
  65897. 803430a: e035 b.n 8034378 <etharp_output+0xe0>
  65898. /* unicast destination IP address? */
  65899. } else {
  65900. s8_t i;
  65901. /* outside local network? if so, this can neither be a global broadcast nor
  65902. a subnet broadcast. */
  65903. if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask)) &&
  65904. 803430c: 4629 mov r1, r5
  65905. if (netif->addr_hint != NULL) {
  65906. /* per-pcb cached entry was given */
  65907. u8_t etharp_cached_entry = *(netif->addr_hint);
  65908. if (etharp_cached_entry < ARP_TABLE_SIZE) {
  65909. #endif /* LWIP_NETIF_HWADDRHINT */
  65910. if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
  65911. 803430e: 4b1c ldr r3, [pc, #112] ; (8034380 <etharp_output+0xe8>)
  65912. 8034310: 781a ldrb r2, [r3, #0]
  65913. 8034312: 4b1c ldr r3, [pc, #112] ; (8034384 <etharp_output+0xec>)
  65914. 8034314: 2014 movs r0, #20
  65915. 8034316: fb00 3302 mla r3, r0, r2, r3
  65916. 803431a: 7c98 ldrb r0, [r3, #18]
  65917. 803431c: 2801 cmp r0, #1
  65918. 803431e: d904 bls.n 803432a <etharp_output+0x92>
  65919. 8034320: 6808 ldr r0, [r1, #0]
  65920. 8034322: 685b ldr r3, [r3, #4]
  65921. 8034324: 4298 cmp r0, r3
  65922. 8034326: d100 bne.n 803432a <etharp_output+0x92>
  65923. 8034328: e00d b.n 8034346 <etharp_output+0xae>
  65924. 803432a: 2300 movs r3, #0
  65925. * @return
  65926. * - ERR_RTE No route to destination (no gateway to external networks),
  65927. * or the return type of either etharp_query() or etharp_send_ip().
  65928. */
  65929. err_t
  65930. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  65931. 803432c: 4f15 ldr r7, [pc, #84] ; (8034384 <etharp_output+0xec>)
  65932. if (netif->addr_hint != NULL) {
  65933. /* per-pcb cached entry was given */
  65934. u8_t etharp_cached_entry = *(netif->addr_hint);
  65935. if (etharp_cached_entry < ARP_TABLE_SIZE) {
  65936. #endif /* LWIP_NETIF_HWADDRHINT */
  65937. if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
  65938. 803432e: 461a mov r2, r3
  65939. * @return
  65940. * - ERR_RTE No route to destination (no gateway to external networks),
  65941. * or the return type of either etharp_query() or etharp_send_ip().
  65942. */
  65943. err_t
  65944. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  65945. 8034330: 18f8 adds r0, r7, r3
  65946. #endif /* LWIP_NETIF_HWADDRHINT */
  65947. /* find stable entry: do this here since this is a critical path for
  65948. throughput and etharp_find_entry() is kind of slow */
  65949. for (i = 0; i < ARP_TABLE_SIZE; i++) {
  65950. if ((arp_table[i].state >= ETHARP_STATE_STABLE) &&
  65951. 8034332: 7c85 ldrb r5, [r0, #18]
  65952. 8034334: 2d01 cmp r5, #1
  65953. 8034336: d90b bls.n 8034350 <etharp_output+0xb8>
  65954. 8034338: 680d ldr r5, [r1, #0]
  65955. 803433a: 6840 ldr r0, [r0, #4]
  65956. 803433c: 4285 cmp r5, r0
  65957. 803433e: d107 bne.n 8034350 <etharp_output+0xb8>
  65958. (ip_addr_cmp(dst_addr, &arp_table[i].ipaddr))) {
  65959. /* found an existing, stable entry */
  65960. ETHARP_SET_HINT(netif, i);
  65961. 8034340: 4b0f ldr r3, [pc, #60] ; (8034380 <etharp_output+0xe8>)
  65962. 8034342: b2d2 uxtb r2, r2
  65963. 8034344: 701a strb r2, [r3, #0]
  65964. return etharp_output_to_arp_index(netif, q, i);
  65965. 8034346: 4620 mov r0, r4
  65966. 8034348: 4631 mov r1, r6
  65967. 803434a: f7ff ff7f bl 803424c <etharp_output_to_arp_index>
  65968. 803434e: e014 b.n 803437a <etharp_output+0xe2>
  65969. 8034350: 3314 adds r3, #20
  65970. }
  65971. #endif /* LWIP_NETIF_HWADDRHINT */
  65972. /* find stable entry: do this here since this is a critical path for
  65973. throughput and etharp_find_entry() is kind of slow */
  65974. for (i = 0; i < ARP_TABLE_SIZE; i++) {
  65975. 8034352: 3201 adds r2, #1
  65976. 8034354: 2bc8 cmp r3, #200 ; 0xc8
  65977. 8034356: b2d2 uxtb r2, r2
  65978. 8034358: d1ea bne.n 8034330 <etharp_output+0x98>
  65979. return etharp_output_to_arp_index(netif, q, i);
  65980. }
  65981. }
  65982. /* no stable entry found, use the (slower) query function:
  65983. queue on destination Ethernet address belonging to ipaddr */
  65984. return etharp_query(netif, dst_addr, q);
  65985. 803435a: 4620 mov r0, r4
  65986. 803435c: 4632 mov r2, r6
  65987. 803435e: f7ff fef5 bl 803414c <etharp_query>
  65988. 8034362: e00a b.n 803437a <etharp_output+0xe2>
  65989. * are special, other IP addresses are looked up in the ARP table. */
  65990. /* broadcast destination IP address? */
  65991. if (ip_addr_isbroadcast(ipaddr, netif)) {
  65992. /* broadcast on Ethernet also */
  65993. dest = (struct eth_addr *)&ethbroadcast;
  65994. 8034364: 4b08 ldr r3, [pc, #32] ; (8034388 <etharp_output+0xf0>)
  65995. }
  65996. /* continuation for multicast/broadcast destinations */
  65997. /* obtain source Ethernet address of the given interface */
  65998. /* send packet directly on the link */
  65999. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest);
  66000. 8034366: 4620 mov r0, r4
  66001. 8034368: 4631 mov r1, r6
  66002. 803436a: f104 0227 add.w r2, r4, #39 ; 0x27
  66003. 803436e: f7ff fda5 bl 8033ebc <etharp_send_ip>
  66004. 8034372: e002 b.n 803437a <etharp_output+0xe2>
  66005. if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
  66006. /* bail out */
  66007. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  66008. ("etharp_output: could not allocate room for header.\n"));
  66009. LINK_STATS_INC(link.lenerr);
  66010. return ERR_BUF;
  66011. 8034374: 20fe movs r0, #254 ; 0xfe
  66012. 8034376: e000 b.n 803437a <etharp_output+0xe2>
  66013. /* send to hardware address of default gateway IP address */
  66014. dst_addr = &(netif->gw);
  66015. /* no default gateway available */
  66016. } else {
  66017. /* no route to destination error (default gateway missing) */
  66018. return ERR_RTE;
  66019. 8034378: 20fc movs r0, #252 ; 0xfc
  66020. /* continuation for multicast/broadcast destinations */
  66021. /* obtain source Ethernet address of the given interface */
  66022. /* send packet directly on the link */
  66023. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest);
  66024. }
  66025. 803437a: b240 sxtb r0, r0
  66026. 803437c: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
  66027. 803437e: bf00 nop
  66028. 8034380: 2000e40c .word 0x2000e40c
  66029. 8034384: 2000e410 .word 0x2000e410
  66030. 8034388: 080407b7 .word 0x080407b7
  66031. 0803438c <ethernet_input>:
  66032. * @param p the recevied packet, p->payload pointing to the ethernet header
  66033. * @param netif the network interface on which the packet was received
  66034. */
  66035. err_t
  66036. ethernet_input(struct pbuf *p, struct netif *netif)
  66037. {
  66038. 803438c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  66039. u16_t type;
  66040. #if LWIP_ARP || ETHARP_SUPPORT_VLAN
  66041. s16_t ip_hdr_offset = SIZEOF_ETH_HDR;
  66042. #endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
  66043. if (p->len <= SIZEOF_ETH_HDR) {
  66044. 8034390: 8943 ldrh r3, [r0, #10]
  66045. 8034392: 2b0e cmp r3, #14
  66046. * @param p the recevied packet, p->payload pointing to the ethernet header
  66047. * @param netif the network interface on which the packet was received
  66048. */
  66049. err_t
  66050. ethernet_input(struct pbuf *p, struct netif *netif)
  66051. {
  66052. 8034394: b087 sub sp, #28
  66053. 8034396: 4604 mov r4, r0
  66054. 8034398: 460d mov r5, r1
  66055. u16_t type;
  66056. #if LWIP_ARP || ETHARP_SUPPORT_VLAN
  66057. s16_t ip_hdr_offset = SIZEOF_ETH_HDR;
  66058. #endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
  66059. if (p->len <= SIZEOF_ETH_HDR) {
  66060. 803439a: f240 80ed bls.w 8034578 <ethernet_input+0x1ec>
  66061. ETHARP_STATS_INC(etharp.drop);
  66062. goto free_and_return;
  66063. }
  66064. /* points to packet payload, which starts with an Ethernet header */
  66065. ethhdr = (struct eth_hdr *)p->payload;
  66066. 803439e: 6840 ldr r0, [r0, #4]
  66067. #if LWIP_ARP_FILTER_NETIF
  66068. netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, htons(type));
  66069. #endif /* LWIP_ARP_FILTER_NETIF*/
  66070. if (ethhdr->dest.addr[0] & 1) {
  66071. 80343a0: 7803 ldrb r3, [r0, #0]
  66072. (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4], (unsigned)ethhdr->dest.addr[5],
  66073. (unsigned)ethhdr->src.addr[0], (unsigned)ethhdr->src.addr[1], (unsigned)ethhdr->src.addr[2],
  66074. (unsigned)ethhdr->src.addr[3], (unsigned)ethhdr->src.addr[4], (unsigned)ethhdr->src.addr[5],
  66075. (unsigned)htons(ethhdr->type)));
  66076. type = ethhdr->type;
  66077. 80343a2: 8986 ldrh r6, [r0, #12]
  66078. #if LWIP_ARP_FILTER_NETIF
  66079. netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, htons(type));
  66080. #endif /* LWIP_ARP_FILTER_NETIF*/
  66081. if (ethhdr->dest.addr[0] & 1) {
  66082. 80343a4: 07da lsls r2, r3, #31
  66083. 80343a6: d513 bpl.n 80343d0 <ethernet_input+0x44>
  66084. /* this might be a multicast or broadcast packet */
  66085. if (ethhdr->dest.addr[0] == LL_MULTICAST_ADDR_0) {
  66086. 80343a8: 2b01 cmp r3, #1
  66087. 80343aa: d108 bne.n 80343be <ethernet_input+0x32>
  66088. if ((ethhdr->dest.addr[1] == LL_MULTICAST_ADDR_1) &&
  66089. 80343ac: 7843 ldrb r3, [r0, #1]
  66090. 80343ae: b97b cbnz r3, 80343d0 <ethernet_input+0x44>
  66091. 80343b0: 7883 ldrb r3, [r0, #2]
  66092. 80343b2: 2b5e cmp r3, #94 ; 0x5e
  66093. 80343b4: d10c bne.n 80343d0 <ethernet_input+0x44>
  66094. (ethhdr->dest.addr[2] == LL_MULTICAST_ADDR_2)) {
  66095. /* mark the pbuf as link-layer multicast */
  66096. p->flags |= PBUF_FLAG_LLMCAST;
  66097. 80343b6: 7b63 ldrb r3, [r4, #13]
  66098. 80343b8: f043 0310 orr.w r3, r3, #16
  66099. 80343bc: e007 b.n 80343ce <ethernet_input+0x42>
  66100. }
  66101. } else if (eth_addr_cmp(&ethhdr->dest, &ethbroadcast)) {
  66102. 80343be: 4972 ldr r1, [pc, #456] ; (8034588 <ethernet_input+0x1fc>)
  66103. 80343c0: 2206 movs r2, #6
  66104. 80343c2: f7ed fa91 bl 80218e8 <memcmp>
  66105. 80343c6: b918 cbnz r0, 80343d0 <ethernet_input+0x44>
  66106. /* mark the pbuf as link-layer broadcast */
  66107. p->flags |= PBUF_FLAG_LLBCAST;
  66108. 80343c8: 7b63 ldrb r3, [r4, #13]
  66109. 80343ca: f043 0308 orr.w r3, r3, #8
  66110. 80343ce: 7363 strb r3, [r4, #13]
  66111. }
  66112. }
  66113. switch (type) {
  66114. 80343d0: 2e08 cmp r6, #8
  66115. 80343d2: d004 beq.n 80343de <ethernet_input+0x52>
  66116. 80343d4: f5b6 6fc1 cmp.w r6, #1544 ; 0x608
  66117. 80343d8: f040 80ce bne.w 8034578 <ethernet_input+0x1ec>
  66118. 80343dc: e014 b.n 8034408 <ethernet_input+0x7c>
  66119. #if LWIP_ARP
  66120. /* IP packet? */
  66121. case PP_HTONS(ETHTYPE_IP):
  66122. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  66123. 80343de: f895 302d ldrb.w r3, [r5, #45] ; 0x2d
  66124. 80343e2: f003 0320 and.w r3, r3, #32
  66125. 80343e6: b2db uxtb r3, r3
  66126. 80343e8: 2b00 cmp r3, #0
  66127. 80343ea: f000 80c5 beq.w 8034578 <ethernet_input+0x1ec>
  66128. #if ETHARP_TRUST_IP_MAC
  66129. /* update ARP table */
  66130. etharp_ip_input(netif, p);
  66131. #endif /* ETHARP_TRUST_IP_MAC */
  66132. /* skip Ethernet header */
  66133. if(pbuf_header(p, -ip_hdr_offset)) {
  66134. 80343ee: 4620 mov r0, r4
  66135. 80343f0: f06f 010d mvn.w r1, #13
  66136. 80343f4: f7f8 fdf1 bl 802cfda <pbuf_header>
  66137. 80343f8: 2800 cmp r0, #0
  66138. 80343fa: f040 80bd bne.w 8034578 <ethernet_input+0x1ec>
  66139. LWIP_ASSERT("Can't move over header in packet", 0);
  66140. goto free_and_return;
  66141. } else {
  66142. /* pass to IP layer */
  66143. ip_input(p, netif);
  66144. 80343fe: 4620 mov r0, r4
  66145. 8034400: 4629 mov r1, r5
  66146. 8034402: f7fb fdc3 bl 802ff8c <ip_input>
  66147. }
  66148. break;
  66149. 8034406: e0ba b.n 803457e <ethernet_input+0x1f2>
  66150. case PP_HTONS(ETHTYPE_ARP):
  66151. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  66152. 8034408: f895 302d ldrb.w r3, [r5, #45] ; 0x2d
  66153. 803440c: f003 0320 and.w r3, r3, #32
  66154. 8034410: b2db uxtb r3, r3
  66155. 8034412: 2b00 cmp r3, #0
  66156. 8034414: f000 80b0 beq.w 8034578 <ethernet_input+0x1ec>
  66157. LWIP_ERROR("netif != NULL", (netif != NULL), return;);
  66158. /* drop short ARP packets: we have to check for p->len instead of p->tot_len here
  66159. since a struct etharp_hdr is pointed to p->payload, so it musn't be chained! */
  66160. if (p->len < SIZEOF_ETHARP_PACKET) {
  66161. 8034418: 8963 ldrh r3, [r4, #10]
  66162. 803441a: 2b29 cmp r3, #41 ; 0x29
  66163. 803441c: d800 bhi.n 8034420 <ethernet_input+0x94>
  66164. 803441e: e0ab b.n 8034578 <ethernet_input+0x1ec>
  66165. ETHARP_STATS_INC(etharp.drop);
  66166. pbuf_free(p);
  66167. return;
  66168. }
  66169. ethhdr = (struct eth_hdr *)p->payload;
  66170. 8034420: 6866 ldr r6, [r4, #4]
  66171. hdr = (struct etharp_hdr *)(((u8_t*)ethhdr) + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR);
  66172. }
  66173. #endif /* ETHARP_SUPPORT_VLAN */
  66174. /* RFC 826 "Packet Reception": */
  66175. if ((hdr->hwtype != PP_HTONS(HWTYPE_ETHERNET)) ||
  66176. 8034422: 89f3 ldrh r3, [r6, #14]
  66177. 8034424: f5b3 7f80 cmp.w r3, #256 ; 0x100
  66178. 8034428: f040 80a6 bne.w 8034578 <ethernet_input+0x1ec>
  66179. 803442c: 7cb3 ldrb r3, [r6, #18]
  66180. 803442e: 2b06 cmp r3, #6
  66181. 8034430: f040 80a2 bne.w 8034578 <ethernet_input+0x1ec>
  66182. (hdr->hwlen != ETHARP_HWADDR_LEN) ||
  66183. 8034434: 7cf7 ldrb r7, [r6, #19]
  66184. 8034436: 2f04 cmp r7, #4
  66185. 8034438: f040 809e bne.w 8034578 <ethernet_input+0x1ec>
  66186. (hdr->protolen != sizeof(ip_addr_t)) ||
  66187. 803443c: 8a33 ldrh r3, [r6, #16]
  66188. 803443e: 2b08 cmp r3, #8
  66189. 8034440: f040 809a bne.w 8034578 <ethernet_input+0x1ec>
  66190. autoip_arp_reply(netif, hdr);
  66191. #endif /* LWIP_AUTOIP */
  66192. /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without
  66193. * structure packing (not using structure copy which breaks strict-aliasing rules). */
  66194. IPADDR2_COPY(&sipaddr, &hdr->sipaddr);
  66195. 8034444: f106 0a1c add.w sl, r6, #28
  66196. 8034448: 4651 mov r1, sl
  66197. 803444a: 463a mov r2, r7
  66198. 803444c: a804 add r0, sp, #16
  66199. 803444e: f7ed fa7d bl 802194c <memcpy>
  66200. IPADDR2_COPY(&dipaddr, &hdr->dipaddr);
  66201. 8034452: f106 0226 add.w r2, r6, #38 ; 0x26
  66202. 8034456: 9203 str r2, [sp, #12]
  66203. 8034458: 4611 mov r1, r2
  66204. 803445a: a805 add r0, sp, #20
  66205. 803445c: 463a mov r2, r7
  66206. 803445e: f7ed fa75 bl 802194c <memcpy>
  66207. /* this interface is not configured? */
  66208. if (ip_addr_isany(&netif->ip_addr)) {
  66209. 8034462: 686b ldr r3, [r5, #4]
  66210. 8034464: b12b cbz r3, 8034472 <ethernet_input+0xe6>
  66211. for_us = 0;
  66212. } else {
  66213. /* ARP packet directed to us? */
  66214. for_us = (u8_t)ip_addr_cmp(&dipaddr, &(netif->ip_addr));
  66215. 8034466: 9a05 ldr r2, [sp, #20]
  66216. 8034468: 1ad1 subs r1, r2, r3
  66217. 803446a: 424a negs r2, r1
  66218. 803446c: 414a adcs r2, r1
  66219. 803446e: 9201 str r2, [sp, #4]
  66220. 8034470: e000 b.n 8034474 <ethernet_input+0xe8>
  66221. IPADDR2_COPY(&sipaddr, &hdr->sipaddr);
  66222. IPADDR2_COPY(&dipaddr, &hdr->dipaddr);
  66223. /* this interface is not configured? */
  66224. if (ip_addr_isany(&netif->ip_addr)) {
  66225. for_us = 0;
  66226. 8034472: 9301 str r3, [sp, #4]
  66227. /* ARP message directed to us?
  66228. -> add IP address in ARP cache; assume requester wants to talk to us,
  66229. can result in directly sending the queued packets for this host.
  66230. ARP message not directed to us?
  66231. -> update the source IP address in the cache, if present */
  66232. etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
  66233. 8034474: 9b01 ldr r3, [sp, #4]
  66234. 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",
  66235. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  66236. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  66237. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  66238. /* non-unicast address? */
  66239. if (ip_addr_isany(ipaddr) ||
  66240. 8034476: 9804 ldr r0, [sp, #16]
  66241. /* ARP message directed to us?
  66242. -> add IP address in ARP cache; assume requester wants to talk to us,
  66243. can result in directly sending the queued packets for this host.
  66244. ARP message not directed to us?
  66245. -> update the source IP address in the cache, if present */
  66246. etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
  66247. 8034478: f106 0716 add.w r7, r6, #22
  66248. 803447c: 2b00 cmp r3, #0
  66249. 803447e: bf0c ite eq
  66250. 8034480: f04f 0802 moveq.w r8, #2
  66251. 8034484: f04f 0801 movne.w r8, #1
  66252. case PP_HTONS(ETHTYPE_ARP):
  66253. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  66254. goto free_and_return;
  66255. }
  66256. /* pass p to ARP module */
  66257. etharp_arp_input(netif, (struct eth_addr*)(netif->hwaddr), p);
  66258. 8034488: f105 0927 add.w r9, r5, #39 ; 0x27
  66259. 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",
  66260. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  66261. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  66262. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  66263. /* non-unicast address? */
  66264. if (ip_addr_isany(ipaddr) ||
  66265. 803448c: 2800 cmp r0, #0
  66266. 803448e: d03d beq.n 803450c <ethernet_input+0x180>
  66267. ip_addr_isbroadcast(ipaddr, netif) ||
  66268. 8034490: 4629 mov r1, r5
  66269. 8034492: f7fb fc67 bl 802fd64 <ip4_addr_isbroadcast>
  66270. 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",
  66271. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  66272. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  66273. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  66274. /* non-unicast address? */
  66275. if (ip_addr_isany(ipaddr) ||
  66276. 8034496: 9002 str r0, [sp, #8]
  66277. 8034498: 2800 cmp r0, #0
  66278. 803449a: d137 bne.n 803450c <ethernet_input+0x180>
  66279. ip_addr_isbroadcast(ipaddr, netif) ||
  66280. ip_addr_ismulticast(ipaddr)) {
  66281. 803449c: 9a04 ldr r2, [sp, #16]
  66282. 803449e: f002 02f0 and.w r2, r2, #240 ; 0xf0
  66283. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  66284. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  66285. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  66286. /* non-unicast address? */
  66287. if (ip_addr_isany(ipaddr) ||
  66288. ip_addr_isbroadcast(ipaddr, netif) ||
  66289. 80344a2: 2ae0 cmp r2, #224 ; 0xe0
  66290. 80344a4: d032 beq.n 803450c <ethernet_input+0x180>
  66291. ip_addr_ismulticast(ipaddr)) {
  66292. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: will not add non-unicast IP address to ARP cache\n"));
  66293. return ERR_ARG;
  66294. }
  66295. /* find or create ARP entry */
  66296. i = etharp_find_entry(ipaddr, flags);
  66297. 80344a6: a804 add r0, sp, #16
  66298. 80344a8: 4641 mov r1, r8
  66299. 80344aa: f7ff fd39 bl 8033f20 <etharp_find_entry>
  66300. /* bail out if no entry could be found */
  66301. if (i < 0) {
  66302. 80344ae: 2800 cmp r0, #0
  66303. 80344b0: db2c blt.n 803450c <ethernet_input+0x180>
  66304. arp_table[i].state = ETHARP_STATE_STATIC;
  66305. } else
  66306. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  66307. {
  66308. /* mark it stable */
  66309. arp_table[i].state = ETHARP_STATE_STABLE;
  66310. 80344b2: 4b36 ldr r3, [pc, #216] ; (803458c <ethernet_input+0x200>)
  66311. 80344b4: f04f 0814 mov.w r8, #20
  66312. 80344b8: fb08 f800 mul.w r8, r8, r0
  66313. 80344bc: eb03 0108 add.w r1, r3, r8
  66314. 80344c0: 2202 movs r2, #2
  66315. 80344c2: 748a strb r2, [r1, #18]
  66316. }
  66317. /* record network interface */
  66318. arp_table[i].netif = netif;
  66319. 80344c4: 608d str r5, [r1, #8]
  66320. arp_table[i].state = ETHARP_STATE_STATIC;
  66321. } else
  66322. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  66323. {
  66324. /* mark it stable */
  66325. arp_table[i].state = ETHARP_STATE_STABLE;
  66326. 80344c6: f101 0b10 add.w fp, r1, #16
  66327. }
  66328. /* record network interface */
  66329. arp_table[i].netif = netif;
  66330. /* insert in SNMP ARP index tree */
  66331. snmp_insert_arpidx_tree(netif, &arp_table[i].ipaddr);
  66332. 80344ca: 4628 mov r0, r5
  66333. 80344cc: 3104 adds r1, #4
  66334. 80344ce: 9300 str r3, [sp, #0]
  66335. 80344d0: f7fd f90e bl 80316f0 <snmp_insert_arpidx_tree>
  66336. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"\n", (s16_t)i));
  66337. /* update address */
  66338. ETHADDR32_COPY(&arp_table[i].ethaddr, ethaddr);
  66339. 80344d4: 9b00 ldr r3, [sp, #0]
  66340. 80344d6: eb03 0008 add.w r0, r3, r8
  66341. 80344da: 2206 movs r2, #6
  66342. 80344dc: 300c adds r0, #12
  66343. 80344de: 4639 mov r1, r7
  66344. 80344e0: f7ed fa34 bl 802194c <memcpy>
  66345. /* reset time stamp */
  66346. arp_table[i].ctime = 0;
  66347. 80344e4: 9a02 ldr r2, [sp, #8]
  66348. 80344e6: f88b 2003 strb.w r2, [fp, #3]
  66349. /* get the packet pointer */
  66350. p = q->p;
  66351. /* now queue entry can be freed */
  66352. memp_free(MEMP_ARP_QUEUE, q);
  66353. #else /* ARP_QUEUEING */
  66354. if (arp_table[i].q != NULL) {
  66355. 80344ea: 9b00 ldr r3, [sp, #0]
  66356. 80344ec: f853 b008 ldr.w fp, [r3, r8]
  66357. 80344f0: f1bb 0f00 cmp.w fp, #0
  66358. 80344f4: d00a beq.n 803450c <ethernet_input+0x180>
  66359. struct pbuf *p = arp_table[i].q;
  66360. arp_table[i].q = NULL;
  66361. 80344f6: f843 2008 str.w r2, [r3, r8]
  66362. #endif /* ARP_QUEUEING */
  66363. /* send the queued IP packet */
  66364. etharp_send_ip(netif, p, (struct eth_addr*)(netif->hwaddr), ethaddr);
  66365. 80344fa: 4628 mov r0, r5
  66366. 80344fc: 4659 mov r1, fp
  66367. 80344fe: 464a mov r2, r9
  66368. 8034500: 463b mov r3, r7
  66369. 8034502: f7ff fcdb bl 8033ebc <etharp_send_ip>
  66370. /* free the queued IP packet */
  66371. pbuf_free(p);
  66372. 8034506: 4658 mov r0, fp
  66373. 8034508: f7f8 fd92 bl 802d030 <pbuf_free>
  66374. -> update the source IP address in the cache, if present */
  66375. etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
  66376. for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY);
  66377. /* now act on the message itself */
  66378. switch (hdr->opcode) {
  66379. 803450c: 8ab3 ldrh r3, [r6, #20]
  66380. 803450e: f5b3 7f80 cmp.w r3, #256 ; 0x100
  66381. 8034512: d003 beq.n 803451c <ethernet_input+0x190>
  66382. 8034514: f5b3 7f00 cmp.w r3, #512 ; 0x200
  66383. 8034518: d12e bne.n 8034578 <ethernet_input+0x1ec>
  66384. 803451a: e029 b.n 8034570 <ethernet_input+0x1e4>
  66385. * reply. In any case, we time-stamp any existing ARP entry,
  66386. * and possiby send out an IP packet that was queued on it. */
  66387. LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: incoming ARP request\n"));
  66388. /* ARP request for our address? */
  66389. if (for_us) {
  66390. 803451c: 9b01 ldr r3, [sp, #4]
  66391. 803451e: b35b cbz r3, 8034578 <ethernet_input+0x1ec>
  66392. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: replying to ARP request for our IP address\n"));
  66393. /* Re-use pbuf to send ARP reply.
  66394. Since we are re-using an existing pbuf, we can't call etharp_raw since
  66395. that would allocate a new pbuf. */
  66396. hdr->opcode = htons(ARP_REPLY);
  66397. 8034520: 2002 movs r0, #2
  66398. 8034522: f7f7 fc47 bl 802bdb4 <lwip_htons>
  66399. 8034526: 82b0 strh r0, [r6, #20]
  66400. IPADDR2_COPY(&hdr->dipaddr, &hdr->sipaddr);
  66401. 8034528: 4651 mov r1, sl
  66402. 803452a: 2204 movs r2, #4
  66403. 803452c: 9803 ldr r0, [sp, #12]
  66404. 803452e: f7ed fa0d bl 802194c <memcpy>
  66405. IPADDR2_COPY(&hdr->sipaddr, &netif->ip_addr);
  66406. 8034532: 1d29 adds r1, r5, #4
  66407. 8034534: 2204 movs r2, #4
  66408. 8034536: 4650 mov r0, sl
  66409. 8034538: f7ed fa08 bl 802194c <memcpy>
  66410. * 'sender IP address' MUST be sent using link-layer broadcast instead of
  66411. * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */
  66412. ethdst_hwaddr = ip_addr_islinklocal(&netif->ip_addr) ? (u8_t*)(ethbroadcast.addr) : hdr->shwaddr.addr;
  66413. #endif /* LWIP_AUTOIP */
  66414. ETHADDR16_COPY(&hdr->dhwaddr, &hdr->shwaddr);
  66415. 803453c: 4639 mov r1, r7
  66416. 803453e: 2206 movs r2, #6
  66417. 8034540: f106 0020 add.w r0, r6, #32
  66418. 8034544: f7ed fa02 bl 802194c <memcpy>
  66419. #if LWIP_AUTOIP
  66420. ETHADDR16_COPY(&ethhdr->dest, ethdst_hwaddr);
  66421. #else /* LWIP_AUTOIP */
  66422. ETHADDR16_COPY(&ethhdr->dest, &hdr->shwaddr);
  66423. 8034548: 4639 mov r1, r7
  66424. 803454a: 2206 movs r2, #6
  66425. 803454c: 4630 mov r0, r6
  66426. 803454e: f7ed f9fd bl 802194c <memcpy>
  66427. #endif /* LWIP_AUTOIP */
  66428. ETHADDR16_COPY(&hdr->shwaddr, ethaddr);
  66429. 8034552: 4649 mov r1, r9
  66430. 8034554: 2206 movs r2, #6
  66431. 8034556: 4638 mov r0, r7
  66432. 8034558: f7ed f9f8 bl 802194c <memcpy>
  66433. ETHADDR16_COPY(&ethhdr->src, ethaddr);
  66434. 803455c: 4649 mov r1, r9
  66435. 803455e: 1db0 adds r0, r6, #6
  66436. 8034560: 2206 movs r2, #6
  66437. 8034562: f7ed f9f3 bl 802194c <memcpy>
  66438. /* hwtype, hwaddr_len, proto, protolen and the type in the ethernet header
  66439. are already correct, we tested that before */
  66440. /* return ARP reply */
  66441. netif->linkoutput(netif, p);
  66442. 8034566: 69ab ldr r3, [r5, #24]
  66443. 8034568: 4628 mov r0, r5
  66444. 803456a: 4621 mov r1, r4
  66445. 803456c: 4798 blx r3
  66446. 803456e: e003 b.n 8034578 <ethernet_input+0x1ec>
  66447. #if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
  66448. /* DHCP wants to know about ARP replies from any host with an
  66449. * IP address also offered to us by the DHCP server. We do not
  66450. * want to take a duplicate IP address on a single network.
  66451. * @todo How should we handle redundant (fail-over) interfaces? */
  66452. dhcp_arp_reply(netif, &sipaddr);
  66453. 8034570: 4628 mov r0, r5
  66454. 8034572: a904 add r1, sp, #16
  66455. 8034574: f7f8 f8f4 bl 802c760 <dhcp_arp_reply>
  66456. /* This means the pbuf is freed or consumed,
  66457. so the caller doesn't have to free it again */
  66458. return ERR_OK;
  66459. free_and_return:
  66460. pbuf_free(p);
  66461. 8034578: 4620 mov r0, r4
  66462. 803457a: f7f8 fd59 bl 802d030 <pbuf_free>
  66463. return ERR_OK;
  66464. }
  66465. 803457e: 2000 movs r0, #0
  66466. 8034580: b007 add sp, #28
  66467. 8034582: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  66468. 8034586: bf00 nop
  66469. 8034588: 080407b7 .word 0x080407b7
  66470. 803458c: 2000e410 .word 0x2000e410
  66471. 08034590 <arp_timer>:
  66472. return ERR_OK;
  66473. }
  66474. static void arp_timer(void *arg)
  66475. {
  66476. 8034590: b508 push {r3, lr}
  66477. etharp_tmr();
  66478. 8034592: f7ff fd37 bl 8034004 <etharp_tmr>
  66479. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  66480. 8034596: 4904 ldr r1, [pc, #16] ; (80345a8 <arp_timer+0x18>)
  66481. 8034598: f241 3088 movw r0, #5000 ; 0x1388
  66482. 803459c: 2200 movs r2, #0
  66483. }
  66484. 803459e: e8bd 4008 ldmia.w sp!, {r3, lr}
  66485. static void arp_timer(void *arg)
  66486. {
  66487. etharp_tmr();
  66488. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  66489. 80345a2: f7fa bfcb b.w 802f53c <sys_timeout>
  66490. 80345a6: bf00 nop
  66491. 80345a8: 08034591 .word 0x08034591
  66492. 080345ac <ethernetif_input>:
  66493. }
  66494. }
  66495. */
  66496. void ethernetif_input(void * pvParameters)
  66497. {
  66498. 80345ac: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  66499. struct pbuf *p;
  66500. for( ;; )
  66501. {
  66502. if(xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
  66503. 80345b0: f8df 80c4 ldr.w r8, [pc, #196] ; 8034678 <ethernetif_input+0xcc>
  66504. }
  66505. }
  66506. */
  66507. void ethernetif_input(void * pvParameters)
  66508. {
  66509. 80345b4: b085 sub sp, #20
  66510. struct pbuf *p;
  66511. for( ;; )
  66512. {
  66513. if(xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
  66514. 80345b6: 2100 movs r1, #0
  66515. 80345b8: 2264 movs r2, #100 ; 0x64
  66516. 80345ba: f8d8 0000 ldr.w r0, [r8]
  66517. 80345be: 460b mov r3, r1
  66518. 80345c0: f7f4 fdd4 bl 802916c <xQueueGenericReceive>
  66519. 80345c4: 2801 cmp r0, #1
  66520. 80345c6: d1f6 bne.n 80345b6 <ethernetif_input+0xa>
  66521. }
  66522. }
  66523. /* Release descriptors to DMA */
  66524. /* Check if received frame with multiple DMA buffer segments */
  66525. if (DMA_RX_FRAME_infos->Seg_Count > 1)
  66526. 80345c8: f8df a0b0 ldr.w sl, [pc, #176] ; 803467c <ethernetif_input+0xd0>
  66527. /* Clear Segment_Count */
  66528. DMA_RX_FRAME_infos->Seg_Count =0;
  66529. /* When Rx Buffer unavailable flag is set: clear it and resume reception */
  66530. if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET)
  66531. 80345cc: f8df 90b0 ldr.w r9, [pc, #176] ; 8034680 <ethernetif_input+0xd4>
  66532. __IO ETH_DMADESCTypeDef *DMARxNextDesc;
  66533. p = NULL;
  66534. /* Get received frame */
  66535. frame = ETH_Get_Received_Frame_interrupt();
  66536. 80345d0: a801 add r0, sp, #4
  66537. 80345d2: f000 ff45 bl 8035460 <ETH_Get_Received_Frame_interrupt>
  66538. 80345d6: 9e03 ldr r6, [sp, #12]
  66539. /* check that frame has no error */
  66540. if ((frame.descriptor->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET)
  66541. 80345d8: 6837 ldr r7, [r6, #0]
  66542. 80345da: f417 4700 ands.w r7, r7, #32768 ; 0x8000
  66543. 80345de: d001 beq.n 80345e4 <ethernetif_input+0x38>
  66544. uint32_t l=0,i =0;
  66545. FrameTypeDef frame;
  66546. u8 *buffer;
  66547. __IO ETH_DMADESCTypeDef *DMARxNextDesc;
  66548. p = NULL;
  66549. 80345e0: 2400 movs r4, #0
  66550. 80345e2: e016 b.n 8034612 <ethernetif_input+0x66>
  66551. /* Obtain the size of the packet and put it into the "len" variable. */
  66552. len = frame.length;
  66553. buffer = (u8 *)frame.buffer;
  66554. /* We allocate a pbuf chain of pbufs from the pool. */
  66555. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  66556. 80345e4: 2003 movs r0, #3
  66557. 80345e6: f8bd 1004 ldrh.w r1, [sp, #4]
  66558. if ((frame.descriptor->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET)
  66559. {
  66560. /* Obtain the size of the packet and put it into the "len" variable. */
  66561. len = frame.length;
  66562. buffer = (u8 *)frame.buffer;
  66563. 80345ea: f8dd b008 ldr.w fp, [sp, #8]
  66564. /* We allocate a pbuf chain of pbufs from the pool. */
  66565. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  66566. 80345ee: 4602 mov r2, r0
  66567. 80345f0: f7f8 fd6b bl 802d0ca <pbuf_alloc>
  66568. /* Copy received frame from ethernet driver buffer to stack buffer */
  66569. if (p != NULL)
  66570. 80345f4: 4604 mov r4, r0
  66571. 80345f6: 2800 cmp r0, #0
  66572. 80345f8: d0f2 beq.n 80345e0 <ethernetif_input+0x34>
  66573. 80345fa: 4605 mov r5, r0
  66574. {
  66575. for (q = p; q != NULL; q = q->next)
  66576. {
  66577. memcpy((u8_t*)q->payload, (u8_t*)&buffer[l], q->len);
  66578. 80345fc: 6868 ldr r0, [r5, #4]
  66579. 80345fe: 896a ldrh r2, [r5, #10]
  66580. 8034600: eb0b 0107 add.w r1, fp, r7
  66581. 8034604: f7ed f9a2 bl 802194c <memcpy>
  66582. l = l + q->len;
  66583. 8034608: 896b ldrh r3, [r5, #10]
  66584. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  66585. /* Copy received frame from ethernet driver buffer to stack buffer */
  66586. if (p != NULL)
  66587. {
  66588. for (q = p; q != NULL; q = q->next)
  66589. 803460a: 682d ldr r5, [r5, #0]
  66590. {
  66591. memcpy((u8_t*)q->payload, (u8_t*)&buffer[l], q->len);
  66592. l = l + q->len;
  66593. 803460c: 18ff adds r7, r7, r3
  66594. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  66595. /* Copy received frame from ethernet driver buffer to stack buffer */
  66596. if (p != NULL)
  66597. {
  66598. for (q = p; q != NULL; q = q->next)
  66599. 803460e: 2d00 cmp r5, #0
  66600. 8034610: d1f4 bne.n 80345fc <ethernetif_input+0x50>
  66601. }
  66602. }
  66603. /* Release descriptors to DMA */
  66604. /* Check if received frame with multiple DMA buffer segments */
  66605. if (DMA_RX_FRAME_infos->Seg_Count > 1)
  66606. 8034612: f8da 3000 ldr.w r3, [sl]
  66607. 8034616: 689a ldr r2, [r3, #8]
  66608. 8034618: 2a01 cmp r2, #1
  66609. {
  66610. DMARxNextDesc = DMA_RX_FRAME_infos->FS_Rx_Desc;
  66611. 803461a: bf88 it hi
  66612. 803461c: 681e ldrhi r6, [r3, #0]
  66613. }
  66614. /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  66615. for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++)
  66616. {
  66617. DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
  66618. 803461e: f04f 4000 mov.w r0, #2147483648 ; 0x80000000
  66619. uint32_t l=0,i =0;
  66620. FrameTypeDef frame;
  66621. u8 *buffer;
  66622. __IO ETH_DMADESCTypeDef *DMARxNextDesc;
  66623. p = NULL;
  66624. 8034622: 2200 movs r2, #0
  66625. 8034624: e002 b.n 803462c <ethernetif_input+0x80>
  66626. }
  66627. /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  66628. for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++)
  66629. {
  66630. DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
  66631. 8034626: 6030 str r0, [r6, #0]
  66632. DMARxNextDesc = (ETH_DMADESCTypeDef *)(DMARxNextDesc->Buffer2NextDescAddr);
  66633. 8034628: 68f6 ldr r6, [r6, #12]
  66634. {
  66635. DMARxNextDesc = frame.descriptor;
  66636. }
  66637. /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  66638. for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++)
  66639. 803462a: 3201 adds r2, #1
  66640. 803462c: 6899 ldr r1, [r3, #8]
  66641. 803462e: 428a cmp r2, r1
  66642. 8034630: d3f9 bcc.n 8034626 <ethernetif_input+0x7a>
  66643. DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
  66644. DMARxNextDesc = (ETH_DMADESCTypeDef *)(DMARxNextDesc->Buffer2NextDescAddr);
  66645. }
  66646. /* Clear Segment_Count */
  66647. DMA_RX_FRAME_infos->Seg_Count =0;
  66648. 8034632: 2200 movs r2, #0
  66649. 8034634: 609a str r2, [r3, #8]
  66650. /* When Rx Buffer unavailable flag is set: clear it and resume reception */
  66651. if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET)
  66652. 8034636: f8d9 3000 ldr.w r3, [r9]
  66653. 803463a: 061b lsls r3, r3, #24
  66654. 803463c: d504 bpl.n 8034648 <ethernetif_input+0x9c>
  66655. {
  66656. /* Clear RBUS ETHERNET DMA flag */
  66657. ETH->DMASR = ETH_DMASR_RBUS;
  66658. 803463e: 2380 movs r3, #128 ; 0x80
  66659. 8034640: f8c9 3000 str.w r3, [r9]
  66660. /* Resume DMA reception */
  66661. ETH->DMARPDR = 0;
  66662. 8034644: 4b0a ldr r3, [pc, #40] ; (8034670 <ethernetif_input+0xc4>)
  66663. 8034646: 601a str r2, [r3, #0]
  66664. {
  66665. if(xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
  66666. {
  66667. GET_NEXT_FRAGMENT:
  66668. p = low_level_input( s_pxNetIf );
  66669. if (p != NULL)
  66670. 8034648: 2c00 cmp r4, #0
  66671. 803464a: d0b4 beq.n 80345b6 <ethernetif_input+0xa>
  66672. {
  66673. if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf))
  66674. 803464c: 4b09 ldr r3, [pc, #36] ; (8034674 <ethernetif_input+0xc8>)
  66675. 803464e: 6819 ldr r1, [r3, #0]
  66676. 8034650: 4620 mov r0, r4
  66677. 8034652: 690b ldr r3, [r1, #16]
  66678. 8034654: 4798 blx r3
  66679. 8034656: 4601 mov r1, r0
  66680. 8034658: b118 cbz r0, 8034662 <ethernetif_input+0xb6>
  66681. {
  66682. pbuf_free(p);
  66683. 803465a: 4620 mov r0, r4
  66684. 803465c: f7f8 fce8 bl 802d030 <pbuf_free>
  66685. 8034660: e7a9 b.n 80345b6 <ethernetif_input+0xa>
  66686. p=NULL;
  66687. }
  66688. else
  66689. {
  66690. xSemaphoreTake(s_xSemaphore, 0);
  66691. 8034662: f8d8 0000 ldr.w r0, [r8]
  66692. 8034666: 460a mov r2, r1
  66693. 8034668: 460b mov r3, r1
  66694. 803466a: f7f4 fd7f bl 802916c <xQueueGenericReceive>
  66695. goto GET_NEXT_FRAGMENT;
  66696. 803466e: e7af b.n 80345d0 <ethernetif_input+0x24>
  66697. 8034670: 40029008 .word 0x40029008
  66698. 8034674: 2000e4d8 .word 0x2000e4d8
  66699. 8034678: 2000e4dc .word 0x2000e4dc
  66700. 803467c: 200132d0 .word 0x200132d0
  66701. 8034680: 40029014 .word 0x40029014
  66702. 08034684 <low_level_output>:
  66703. * to become availale since the stack doesn't retry to send a packet
  66704. * dropped because of memory failure (except for the TCP timers).
  66705. */
  66706. static err_t low_level_output(struct netif *netif, struct pbuf *p)
  66707. {
  66708. 8034684: b570 push {r4, r5, r6, lr}
  66709. static SemaphoreHandle_t xTxSemaphore = NULL;
  66710. struct pbuf *q;
  66711. uint32_t l = 0;
  66712. u8 *buffer ;
  66713. if (xTxSemaphore == NULL)
  66714. 8034686: 4e19 ldr r6, [pc, #100] ; (80346ec <low_level_output+0x68>)
  66715. 8034688: 6835 ldr r5, [r6, #0]
  66716. * to become availale since the stack doesn't retry to send a packet
  66717. * dropped because of memory failure (except for the TCP timers).
  66718. */
  66719. static err_t low_level_output(struct netif *netif, struct pbuf *p)
  66720. {
  66721. 803468a: 460c mov r4, r1
  66722. static SemaphoreHandle_t xTxSemaphore = NULL;
  66723. struct pbuf *q;
  66724. uint32_t l = 0;
  66725. u8 *buffer ;
  66726. if (xTxSemaphore == NULL)
  66727. 803468c: b95d cbnz r5, 80346a6 <low_level_output+0x22>
  66728. {
  66729. vSemaphoreCreateBinary (xTxSemaphore);
  66730. 803468e: 2001 movs r0, #1
  66731. 8034690: 4629 mov r1, r5
  66732. 8034692: 2203 movs r2, #3
  66733. 8034694: f7f4 fbed bl 8028e72 <xQueueGenericCreate>
  66734. 8034698: 6030 str r0, [r6, #0]
  66735. 803469a: b120 cbz r0, 80346a6 <low_level_output+0x22>
  66736. 803469c: 4629 mov r1, r5
  66737. 803469e: 462a mov r2, r5
  66738. 80346a0: 462b mov r3, r5
  66739. 80346a2: f7f4 fc23 bl 8028eec <xQueueGenericSend>
  66740. }
  66741. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  66742. 80346a6: 4b11 ldr r3, [pc, #68] ; (80346ec <low_level_output+0x68>)
  66743. 80346a8: 2100 movs r1, #0
  66744. 80346aa: 6818 ldr r0, [r3, #0]
  66745. 80346ac: 22fa movs r2, #250 ; 0xfa
  66746. 80346ae: 460b mov r3, r1
  66747. 80346b0: f7f4 fd5c bl 802916c <xQueueGenericReceive>
  66748. 80346b4: b1c0 cbz r0, 80346e8 <low_level_output+0x64>
  66749. {
  66750. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  66751. 80346b6: 4b0e ldr r3, [pc, #56] ; (80346f0 <low_level_output+0x6c>)
  66752. 80346b8: 681b ldr r3, [r3, #0]
  66753. static err_t low_level_output(struct netif *netif, struct pbuf *p)
  66754. {
  66755. static SemaphoreHandle_t xTxSemaphore = NULL;
  66756. struct pbuf *q;
  66757. uint32_t l = 0;
  66758. 80346ba: 2500 movs r5, #0
  66759. vSemaphoreCreateBinary (xTxSemaphore);
  66760. }
  66761. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  66762. {
  66763. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  66764. 80346bc: 689e ldr r6, [r3, #8]
  66765. 80346be: e007 b.n 80346d0 <low_level_output+0x4c>
  66766. for(q = p; q != NULL; q = q->next)
  66767. {
  66768. memcpy((u8_t*)&buffer[l], q->payload, q->len);
  66769. 80346c0: 1970 adds r0, r6, r5
  66770. 80346c2: 6861 ldr r1, [r4, #4]
  66771. 80346c4: 8962 ldrh r2, [r4, #10]
  66772. 80346c6: f7ed f941 bl 802194c <memcpy>
  66773. l = l + q->len;
  66774. 80346ca: 8963 ldrh r3, [r4, #10]
  66775. }
  66776. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  66777. {
  66778. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  66779. for(q = p; q != NULL; q = q->next)
  66780. 80346cc: 6824 ldr r4, [r4, #0]
  66781. {
  66782. memcpy((u8_t*)&buffer[l], q->payload, q->len);
  66783. l = l + q->len;
  66784. 80346ce: 18ed adds r5, r5, r3
  66785. }
  66786. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  66787. {
  66788. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  66789. for(q = p; q != NULL; q = q->next)
  66790. 80346d0: 2c00 cmp r4, #0
  66791. 80346d2: d1f5 bne.n 80346c0 <low_level_output+0x3c>
  66792. {
  66793. memcpy((u8_t*)&buffer[l], q->payload, q->len);
  66794. l = l + q->len;
  66795. }
  66796. ETH_Prepare_Transmit_Descriptors(l);
  66797. 80346d4: b2a8 uxth r0, r5
  66798. 80346d6: f000 ff13 bl 8035500 <ETH_Prepare_Transmit_Descriptors>
  66799. xSemaphoreGive(xTxSemaphore);
  66800. 80346da: 4b04 ldr r3, [pc, #16] ; (80346ec <low_level_output+0x68>)
  66801. 80346dc: 4621 mov r1, r4
  66802. 80346de: 6818 ldr r0, [r3, #0]
  66803. 80346e0: 4622 mov r2, r4
  66804. 80346e2: 4623 mov r3, r4
  66805. 80346e4: f7f4 fc02 bl 8028eec <xQueueGenericSend>
  66806. }
  66807. return ERR_OK;
  66808. }
  66809. 80346e8: 2000 movs r0, #0
  66810. 80346ea: bd70 pop {r4, r5, r6, pc}
  66811. 80346ec: 2000e4e0 .word 0x2000e4e0
  66812. 80346f0: 20011464 .word 0x20011464
  66813. 080346f4 <ethernetif_init>:
  66814. #if LWIP_NETIF_HOSTNAME
  66815. /* Initialize interface hostname */
  66816. netif->hostname = "lwip";
  66817. #endif /* LWIP_NETIF_HOSTNAME */
  66818. netif->name[0] = IFNAME0;
  66819. 80346f4: 2373 movs r3, #115 ; 0x73
  66820. * @return ERR_OK if the loopif is initialized
  66821. * ERR_MEM if private data couldn't be allocated
  66822. * any other err_t on error
  66823. */
  66824. err_t ethernetif_init(struct netif *netif)
  66825. {
  66826. 80346f6: b530 push {r4, r5, lr}
  66827. #if LWIP_NETIF_HOSTNAME
  66828. /* Initialize interface hostname */
  66829. netif->hostname = "lwip";
  66830. #endif /* LWIP_NETIF_HOSTNAME */
  66831. netif->name[0] = IFNAME0;
  66832. 80346f8: f880 302e strb.w r3, [r0, #46] ; 0x2e
  66833. netif->name[1] = IFNAME1;
  66834. 80346fc: 2374 movs r3, #116 ; 0x74
  66835. 80346fe: f880 302f strb.w r3, [r0, #47] ; 0x2f
  66836. netif->output = etharp_output;
  66837. 8034702: 4b37 ldr r3, [pc, #220] ; (80347e0 <ethernetif_init+0xec>)
  66838. netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  66839. s_pxNetIf =netif;
  66840. /* create binary semaphore used for informing ethernetif of frame reception */
  66841. if (s_xSemaphore == NULL)
  66842. 8034704: 4d37 ldr r5, [pc, #220] ; (80347e4 <ethernetif_init+0xf0>)
  66843. #endif /* LWIP_NETIF_HOSTNAME */
  66844. netif->name[0] = IFNAME0;
  66845. netif->name[1] = IFNAME1;
  66846. netif->output = etharp_output;
  66847. 8034706: 6143 str r3, [r0, #20]
  66848. netif->linkoutput = low_level_output;
  66849. 8034708: 4b37 ldr r3, [pc, #220] ; (80347e8 <ethernetif_init+0xf4>)
  66850. * @return ERR_OK if the loopif is initialized
  66851. * ERR_MEM if private data couldn't be allocated
  66852. * any other err_t on error
  66853. */
  66854. err_t ethernetif_init(struct netif *netif)
  66855. {
  66856. 803470a: b087 sub sp, #28
  66857. netif->name[0] = IFNAME0;
  66858. netif->name[1] = IFNAME1;
  66859. netif->output = etharp_output;
  66860. netif->linkoutput = low_level_output;
  66861. 803470c: 6183 str r3, [r0, #24]
  66862. {
  66863. uint8_t mac[6];
  66864. uint32_t i;
  66865. /* set netif MAC hardware address length */
  66866. netif->hwaddr_len = ETHARP_HWADDR_LEN;
  66867. 803470e: 2306 movs r3, #6
  66868. * @return ERR_OK if the loopif is initialized
  66869. * ERR_MEM if private data couldn't be allocated
  66870. * any other err_t on error
  66871. */
  66872. err_t ethernetif_init(struct netif *netif)
  66873. {
  66874. 8034710: 4604 mov r4, r0
  66875. {
  66876. uint8_t mac[6];
  66877. uint32_t i;
  66878. /* set netif MAC hardware address length */
  66879. netif->hwaddr_len = ETHARP_HWADDR_LEN;
  66880. 8034712: f880 3026 strb.w r3, [r0, #38] ; 0x26
  66881. /* set netif MAC hardware address */
  66882. SETTINGS_GetMac(mac);
  66883. 8034716: a804 add r0, sp, #16
  66884. 8034718: f7f3 fff6 bl 8028708 <SETTINGS_GetMac>
  66885. netif->hwaddr[0] = mac[0];
  66886. 803471c: f89d 3010 ldrb.w r3, [sp, #16]
  66887. netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  66888. s_pxNetIf =netif;
  66889. /* create binary semaphore used for informing ethernetif of frame reception */
  66890. if (s_xSemaphore == NULL)
  66891. 8034720: 6829 ldr r1, [r5, #0]
  66892. /* set netif MAC hardware address */
  66893. SETTINGS_GetMac(mac);
  66894. netif->hwaddr[0] = mac[0];
  66895. 8034722: f884 3027 strb.w r3, [r4, #39] ; 0x27
  66896. netif->hwaddr[1] = mac[1];
  66897. 8034726: f89d 3011 ldrb.w r3, [sp, #17]
  66898. 803472a: f884 3028 strb.w r3, [r4, #40] ; 0x28
  66899. netif->hwaddr[2] = mac[2];
  66900. 803472e: f89d 3012 ldrb.w r3, [sp, #18]
  66901. 8034732: f884 3029 strb.w r3, [r4, #41] ; 0x29
  66902. netif->hwaddr[3] = mac[3];
  66903. 8034736: f89d 3013 ldrb.w r3, [sp, #19]
  66904. 803473a: f884 302a strb.w r3, [r4, #42] ; 0x2a
  66905. netif->hwaddr[4] = mac[4];
  66906. 803473e: f89d 3014 ldrb.w r3, [sp, #20]
  66907. 8034742: f884 302b strb.w r3, [r4, #43] ; 0x2b
  66908. netif->hwaddr[5] = mac[5];
  66909. 8034746: f89d 3015 ldrb.w r3, [sp, #21]
  66910. 803474a: f884 302c strb.w r3, [r4, #44] ; 0x2c
  66911. /* set netif maximum transfer unit */
  66912. netif->mtu = 1500;
  66913. 803474e: f240 53dc movw r3, #1500 ; 0x5dc
  66914. 8034752: 84a3 strh r3, [r4, #36] ; 0x24
  66915. /* Accept broadcast address and ARP traffic */
  66916. netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  66917. 8034754: 2322 movs r3, #34 ; 0x22
  66918. 8034756: f884 302d strb.w r3, [r4, #45] ; 0x2d
  66919. s_pxNetIf =netif;
  66920. 803475a: 4b24 ldr r3, [pc, #144] ; (80347ec <ethernetif_init+0xf8>)
  66921. 803475c: 601c str r4, [r3, #0]
  66922. /* create binary semaphore used for informing ethernetif of frame reception */
  66923. if (s_xSemaphore == NULL)
  66924. 803475e: b919 cbnz r1, 8034768 <ethernetif_init+0x74>
  66925. {
  66926. s_xSemaphore= xSemaphoreCreateCounting(20,0);
  66927. 8034760: 2014 movs r0, #20
  66928. 8034762: f7f4 fbad bl 8028ec0 <xQueueCreateCountingSemaphore>
  66929. 8034766: 6028 str r0, [r5, #0]
  66930. }
  66931. /* initialize MAC address in ethernet MAC */
  66932. ETH_MACAddressConfig(ETH_MAC_Address0, netif->hwaddr);
  66933. 8034768: f104 0127 add.w r1, r4, #39 ; 0x27
  66934. 803476c: 2000 movs r0, #0
  66935. 803476e: f000 fe5f bl 8035430 <ETH_MACAddressConfig>
  66936. /* Initialize Tx Descriptors list: Chain Mode */
  66937. ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
  66938. 8034772: 481f ldr r0, [pc, #124] ; (80347f0 <ethernetif_init+0xfc>)
  66939. 8034774: 491f ldr r1, [pc, #124] ; (80347f4 <ethernetif_init+0x100>)
  66940. /* Enable Ethernet Rx interrrupt */
  66941. {
  66942. for(i=0; i<ETH_RXBUFNB; i++)
  66943. {
  66944. ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
  66945. 8034776: 4d20 ldr r5, [pc, #128] ; (80347f8 <ethernetif_init+0x104>)
  66946. /* initialize MAC address in ethernet MAC */
  66947. ETH_MACAddressConfig(ETH_MAC_Address0, netif->hwaddr);
  66948. /* Initialize Tx Descriptors list: Chain Mode */
  66949. ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
  66950. 8034778: 2205 movs r2, #5
  66951. 803477a: f000 ff47 bl 803560c <ETH_DMATxDescChainInit>
  66952. /* Initialize Rx Descriptors list: Chain Mode */
  66953. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  66954. 803477e: 481e ldr r0, [pc, #120] ; (80347f8 <ethernetif_init+0x104>)
  66955. 8034780: 491e ldr r1, [pc, #120] ; (80347fc <ethernetif_init+0x108>)
  66956. 8034782: 2205 movs r2, #5
  66957. 8034784: f000 ff16 bl 80355b4 <ETH_DMARxDescChainInit>
  66958. /* Enable Ethernet Rx interrrupt */
  66959. {
  66960. for(i=0; i<ETH_RXBUFNB; i++)
  66961. 8034788: 2400 movs r4, #0
  66962. {
  66963. ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
  66964. 803478a: eb05 1044 add.w r0, r5, r4, lsl #5
  66965. 803478e: 2101 movs r1, #1
  66966. /* Initialize Rx Descriptors list: Chain Mode */
  66967. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  66968. /* Enable Ethernet Rx interrrupt */
  66969. {
  66970. for(i=0; i<ETH_RXBUFNB; i++)
  66971. 8034790: 3401 adds r4, #1
  66972. {
  66973. ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
  66974. 8034792: f000 ff61 bl 8035658 <ETH_DMARxDescReceiveITConfig>
  66975. /* Initialize Rx Descriptors list: Chain Mode */
  66976. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  66977. /* Enable Ethernet Rx interrrupt */
  66978. {
  66979. for(i=0; i<ETH_RXBUFNB; i++)
  66980. 8034796: 2c05 cmp r4, #5
  66981. 8034798: d1f7 bne.n 803478a <ethernetif_init+0x96>
  66982. #ifdef CHECKSUM_BY_HARDWARE
  66983. /* Enable the checksum insertion for the Tx frames */
  66984. {
  66985. for(i=0; i<ETH_TXBUFNB; i++)
  66986. {
  66987. ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
  66988. 803479a: 4d15 ldr r5, [pc, #84] ; (80347f0 <ethernetif_init+0xfc>)
  66989. /* Initialize Rx Descriptors list: Chain Mode */
  66990. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  66991. /* Enable Ethernet Rx interrrupt */
  66992. {
  66993. for(i=0; i<ETH_RXBUFNB; i++)
  66994. 803479c: 2400 movs r4, #0
  66995. #ifdef CHECKSUM_BY_HARDWARE
  66996. /* Enable the checksum insertion for the Tx frames */
  66997. {
  66998. for(i=0; i<ETH_TXBUFNB; i++)
  66999. {
  67000. ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
  67001. 803479e: eb05 1044 add.w r0, r5, r4, lsl #5
  67002. 80347a2: f44f 0140 mov.w r1, #12582912 ; 0xc00000
  67003. }
  67004. #ifdef CHECKSUM_BY_HARDWARE
  67005. /* Enable the checksum insertion for the Tx frames */
  67006. {
  67007. for(i=0; i<ETH_TXBUFNB; i++)
  67008. 80347a6: 3401 adds r4, #1
  67009. {
  67010. ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
  67011. 80347a8: f000 ff52 bl 8035650 <ETH_DMATxDescChecksumInsertionConfig>
  67012. }
  67013. #ifdef CHECKSUM_BY_HARDWARE
  67014. /* Enable the checksum insertion for the Tx frames */
  67015. {
  67016. for(i=0; i<ETH_TXBUFNB; i++)
  67017. 80347ac: 2c05 cmp r4, #5
  67018. 80347ae: d1f6 bne.n 803479e <ethernetif_init+0xaa>
  67019. }
  67020. }
  67021. #endif
  67022. /* create the task that handles the ETH_MAC */
  67023. xTaskCreate(ethernetif_input, "Eth_if", netifINTERFACE_TASK_STACK_SIZE, NULL,
  67024. 80347b0: 2400 movs r4, #0
  67025. 80347b2: 2304 movs r3, #4
  67026. 80347b4: 2296 movs r2, #150 ; 0x96
  67027. 80347b6: e88d 0018 stmia.w sp, {r3, r4}
  67028. 80347ba: 4911 ldr r1, [pc, #68] ; (8034800 <ethernetif_init+0x10c>)
  67029. 80347bc: 9402 str r4, [sp, #8]
  67030. 80347be: 4623 mov r3, r4
  67031. 80347c0: 9403 str r4, [sp, #12]
  67032. 80347c2: 4810 ldr r0, [pc, #64] ; (8034804 <ethernetif_init+0x110>)
  67033. 80347c4: f7f4 fddc bl 8029380 <xTaskGenericCreate>
  67034. netifINTERFACE_TASK_PRIORITY,NULL);
  67035. /* Enable MAC and DMA transmission and reception */
  67036. ETH_Start();
  67037. 80347c8: f000 ff9c bl 8035704 <ETH_Start>
  67038. /* initialize the hardware */
  67039. low_level_init(netif);
  67040. etharp_init();
  67041. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  67042. 80347cc: f241 3088 movw r0, #5000 ; 0x1388
  67043. 80347d0: 490d ldr r1, [pc, #52] ; (8034808 <ethernetif_init+0x114>)
  67044. 80347d2: 4622 mov r2, r4
  67045. 80347d4: f7fa feb2 bl 802f53c <sys_timeout>
  67046. return ERR_OK;
  67047. }
  67048. 80347d8: 4620 mov r0, r4
  67049. 80347da: b007 add sp, #28
  67050. 80347dc: bd30 pop {r4, r5, pc}
  67051. 80347de: bf00 nop
  67052. 80347e0: 08034299 .word 0x08034299
  67053. 80347e4: 2000e4dc .word 0x2000e4dc
  67054. 80347e8: 08034685 .word 0x08034685
  67055. 80347ec: 2000e4d8 .word 0x2000e4d8
  67056. 80347f0: 20011468 .word 0x20011468
  67057. 80347f4: 20013374 .word 0x20013374
  67058. 80347f8: 200132d4 .word 0x200132d4
  67059. 80347fc: 20011508 .word 0x20011508
  67060. 8034800: 080407c3 .word 0x080407c3
  67061. 8034804: 080345ad .word 0x080345ad
  67062. 8034808: 08034591 .word 0x08034591
  67063. 0803480c <sys_mbox_new>:
  67064. * int size -- Size of elements in the mailbox
  67065. * Outputs:
  67066. * sys_mbox_t -- Handle to new mailbox
  67067. *---------------------------------------------------------------------------*/
  67068. err_t sys_mbox_new( sys_mbox_t *pxMailBox, int iSize )
  67069. {
  67070. 803480c: b510 push {r4, lr}
  67071. err_t xReturn = ERR_MEM;
  67072. *pxMailBox = xQueueCreate( iSize, sizeof( void * ) );
  67073. 803480e: 2200 movs r2, #0
  67074. * int size -- Size of elements in the mailbox
  67075. * Outputs:
  67076. * sys_mbox_t -- Handle to new mailbox
  67077. *---------------------------------------------------------------------------*/
  67078. err_t sys_mbox_new( sys_mbox_t *pxMailBox, int iSize )
  67079. {
  67080. 8034810: 4604 mov r4, r0
  67081. err_t xReturn = ERR_MEM;
  67082. *pxMailBox = xQueueCreate( iSize, sizeof( void * ) );
  67083. 8034812: 4608 mov r0, r1
  67084. 8034814: 2104 movs r1, #4
  67085. 8034816: f7f4 fb2c bl 8028e72 <xQueueGenericCreate>
  67086. 803481a: 6020 str r0, [r4, #0]
  67087. xReturn = ERR_OK;
  67088. SYS_STATS_INC_USED( mbox );
  67089. }
  67090. return xReturn;
  67091. }
  67092. 803481c: 2800 cmp r0, #0
  67093. 803481e: bf14 ite ne
  67094. 8034820: 2000 movne r0, #0
  67095. 8034822: f06f 0000 mvneq.w r0, #0
  67096. 8034826: bd10 pop {r4, pc}
  67097. 08034828 <sys_mbox_trypost>:
  67098. * Outputs:
  67099. * err_t -- ERR_OK if message posted, else ERR_MEM
  67100. * if not.
  67101. *---------------------------------------------------------------------------*/
  67102. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  67103. {
  67104. 8034828: b51f push {r0, r1, r2, r3, r4, lr}
  67105. err_t xReturn;
  67106. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  67107. if( xInsideISR != pdFALSE )
  67108. 803482a: 4a0b ldr r2, [pc, #44] ; (8034858 <sys_mbox_trypost+0x30>)
  67109. * Outputs:
  67110. * err_t -- ERR_OK if message posted, else ERR_MEM
  67111. * if not.
  67112. *---------------------------------------------------------------------------*/
  67113. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  67114. {
  67115. 803482c: 9101 str r1, [sp, #4]
  67116. err_t xReturn;
  67117. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  67118. if( xInsideISR != pdFALSE )
  67119. 803482e: 6812 ldr r2, [r2, #0]
  67120. {
  67121. xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
  67122. 8034830: 6800 ldr r0, [r0, #0]
  67123. * if not.
  67124. *---------------------------------------------------------------------------*/
  67125. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  67126. {
  67127. err_t xReturn;
  67128. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  67129. 8034832: 2300 movs r3, #0
  67130. 8034834: 9303 str r3, [sp, #12]
  67131. if( xInsideISR != pdFALSE )
  67132. {
  67133. xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
  67134. 8034836: a901 add r1, sp, #4
  67135. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  67136. {
  67137. err_t xReturn;
  67138. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  67139. if( xInsideISR != pdFALSE )
  67140. 8034838: b11a cbz r2, 8034842 <sys_mbox_trypost+0x1a>
  67141. {
  67142. xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
  67143. 803483a: aa03 add r2, sp, #12
  67144. 803483c: f7f4 fc1a bl 8029074 <xQueueGenericSendFromISR>
  67145. 8034840: e002 b.n 8034848 <sys_mbox_trypost+0x20>
  67146. }
  67147. else
  67148. {
  67149. xReturn = xQueueSend( *pxMailBox, &pxMessageToPost, ( TickType_t ) 0 );
  67150. 8034842: 4613 mov r3, r2
  67151. 8034844: f7f4 fb52 bl 8028eec <xQueueGenericSend>
  67152. 8034848: b2c0 uxtb r0, r0
  67153. xReturn = ERR_MEM;
  67154. SYS_STATS_INC( mbox.err );
  67155. }
  67156. return xReturn;
  67157. }
  67158. 803484a: 3801 subs r0, #1
  67159. 803484c: bf18 it ne
  67160. 803484e: f06f 0000 mvnne.w r0, #0
  67161. 8034852: b005 add sp, #20
  67162. 8034854: bd00 pop {pc}
  67163. 8034856: bf00 nop
  67164. 8034858: 2000e4e4 .word 0x2000e4e4
  67165. 0803485c <sys_arch_mbox_fetch>:
  67166. * Outputs:
  67167. * u32_t -- SYS_ARCH_TIMEOUT if timeout, else number
  67168. * of milliseconds until received.
  67169. *---------------------------------------------------------------------------*/
  67170. u32_t sys_arch_mbox_fetch( sys_mbox_t *pxMailBox, void **ppvBuffer, u32_t ulTimeOut )
  67171. {
  67172. 803485c: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
  67173. 8034860: 4607 mov r7, r0
  67174. 8034862: 460c mov r4, r1
  67175. 8034864: 4690 mov r8, r2
  67176. void *pvDummy;
  67177. TickType_t xStartTime, xEndTime, xElapsed;
  67178. unsigned long ulReturn;
  67179. xStartTime = xTaskGetTickCount();
  67180. 8034866: f7f4 fef3 bl 8029650 <xTaskGetTickCount>
  67181. 803486a: 4605 mov r5, r0
  67182. if( NULL == ppvBuffer )
  67183. 803486c: b904 cbnz r4, 8034870 <sys_arch_mbox_fetch+0x14>
  67184. {
  67185. ppvBuffer = &pvDummy;
  67186. 803486e: ac01 add r4, sp, #4
  67187. }
  67188. if( ulTimeOut != 0UL )
  67189. 8034870: f1b8 0f00 cmp.w r8, #0
  67190. 8034874: d015 beq.n 80348a2 <sys_arch_mbox_fetch+0x46>
  67191. {
  67192. configASSERT( xInsideISR == ( portBASE_TYPE ) 0 );
  67193. 8034876: 4b13 ldr r3, [pc, #76] ; (80348c4 <sys_arch_mbox_fetch+0x68>)
  67194. 8034878: 681e ldr r6, [r3, #0]
  67195. 803487a: b116 cbz r6, 8034882 <sys_arch_mbox_fetch+0x26>
  67196. 803487c: f7f5 fbdc bl 802a038 <ulPortSetInterruptMask>
  67197. 8034880: e7fe b.n 8034880 <sys_arch_mbox_fetch+0x24>
  67198. if( pdTRUE == xQueueReceive( *pxMailBox, &( *ppvBuffer ), ulTimeOut/ portTICK_PERIOD_MS ) )
  67199. 8034882: 6838 ldr r0, [r7, #0]
  67200. 8034884: 4621 mov r1, r4
  67201. 8034886: 4642 mov r2, r8
  67202. 8034888: 4633 mov r3, r6
  67203. 803488a: f7f4 fc6f bl 802916c <xQueueGenericReceive>
  67204. 803488e: 2801 cmp r0, #1
  67205. 8034890: d103 bne.n 803489a <sys_arch_mbox_fetch+0x3e>
  67206. {
  67207. xEndTime = xTaskGetTickCount();
  67208. 8034892: f7f4 fedd bl 8029650 <xTaskGetTickCount>
  67209. xElapsed = ( xEndTime - xStartTime ) * portTICK_PERIOD_MS;
  67210. 8034896: 1b40 subs r0, r0, r5
  67211. 8034898: e011 b.n 80348be <sys_arch_mbox_fetch+0x62>
  67212. ulReturn = xElapsed;
  67213. }
  67214. else
  67215. {
  67216. /* Timed out. */
  67217. *ppvBuffer = NULL;
  67218. 803489a: 6026 str r6, [r4, #0]
  67219. ulReturn = SYS_ARCH_TIMEOUT;
  67220. 803489c: f04f 30ff mov.w r0, #4294967295
  67221. 80348a0: e00d b.n 80348be <sys_arch_mbox_fetch+0x62>
  67222. }
  67223. }
  67224. else
  67225. {
  67226. while( pdTRUE != xQueueReceive( *pxMailBox, &( *ppvBuffer ), portMAX_DELAY ) );
  67227. 80348a2: 2300 movs r3, #0
  67228. 80348a4: 6838 ldr r0, [r7, #0]
  67229. 80348a6: 4621 mov r1, r4
  67230. 80348a8: f04f 32ff mov.w r2, #4294967295
  67231. 80348ac: f7f4 fc5e bl 802916c <xQueueGenericReceive>
  67232. 80348b0: 2801 cmp r0, #1
  67233. 80348b2: d1f6 bne.n 80348a2 <sys_arch_mbox_fetch+0x46>
  67234. xEndTime = xTaskGetTickCount();
  67235. 80348b4: f7f4 fecc bl 8029650 <xTaskGetTickCount>
  67236. xElapsed = ( xEndTime - xStartTime ) * portTICK_PERIOD_MS;
  67237. if( xElapsed == 0UL )
  67238. 80348b8: 1b40 subs r0, r0, r5
  67239. 80348ba: bf08 it eq
  67240. 80348bc: 2001 moveq r0, #1
  67241. ulReturn = xElapsed;
  67242. }
  67243. return ulReturn;
  67244. }
  67245. 80348be: e8bd 81fc ldmia.w sp!, {r2, r3, r4, r5, r6, r7, r8, pc}
  67246. 80348c2: bf00 nop
  67247. 80348c4: 2000e4e4 .word 0x2000e4e4
  67248. 080348c8 <sys_mutex_new>:
  67249. /** Create a new mutex
  67250. * @param mutex pointer to the mutex to create
  67251. * @return a new mutex */
  67252. err_t sys_mutex_new( sys_mutex_t *pxMutex )
  67253. {
  67254. 80348c8: b510 push {r4, lr}
  67255. 80348ca: 4604 mov r4, r0
  67256. err_t xReturn = ERR_MEM;
  67257. *pxMutex = xSemaphoreCreateMutex();
  67258. 80348cc: 2001 movs r0, #1
  67259. 80348ce: f7f4 fba7 bl 8029020 <xQueueCreateMutex>
  67260. 80348d2: 6020 str r0, [r4, #0]
  67261. {
  67262. SYS_STATS_INC( mutex.err );
  67263. }
  67264. return xReturn;
  67265. }
  67266. 80348d4: 2800 cmp r0, #0
  67267. 80348d6: bf14 ite ne
  67268. 80348d8: 2000 movne r0, #0
  67269. 80348da: f06f 0000 mvneq.w r0, #0
  67270. 80348de: bd10 pop {r4, pc}
  67271. 080348e0 <sys_mutex_lock>:
  67272. /** Lock a mutex
  67273. * @param mutex the mutex to lock */
  67274. void sys_mutex_lock( sys_mutex_t *pxMutex )
  67275. {
  67276. 80348e0: b510 push {r4, lr}
  67277. 80348e2: 4604 mov r4, r0
  67278. while( xSemaphoreTake( *pxMutex, portMAX_DELAY ) != pdPASS );
  67279. 80348e4: 2100 movs r1, #0
  67280. 80348e6: 6820 ldr r0, [r4, #0]
  67281. 80348e8: f04f 32ff mov.w r2, #4294967295
  67282. 80348ec: 460b mov r3, r1
  67283. 80348ee: f7f4 fc3d bl 802916c <xQueueGenericReceive>
  67284. 80348f2: 2801 cmp r0, #1
  67285. 80348f4: d1f6 bne.n 80348e4 <sys_mutex_lock+0x4>
  67286. }
  67287. 80348f6: bd10 pop {r4, pc}
  67288. 080348f8 <sys_mutex_unlock>:
  67289. /** Unlock a mutex
  67290. * @param mutex the mutex to unlock */
  67291. void sys_mutex_unlock(sys_mutex_t *pxMutex )
  67292. {
  67293. xSemaphoreGive( *pxMutex );
  67294. 80348f8: 2100 movs r1, #0
  67295. 80348fa: 6800 ldr r0, [r0, #0]
  67296. 80348fc: 460a mov r2, r1
  67297. 80348fe: 460b mov r3, r1
  67298. 8034900: f7f4 baf4 b.w 8028eec <xQueueGenericSend>
  67299. 08034904 <sys_init>:
  67300. *---------------------------------------------------------------------------*
  67301. * Description:
  67302. * Initialize sys arch
  67303. *---------------------------------------------------------------------------*/
  67304. void sys_init(void)
  67305. {
  67306. 8034904: 4770 bx lr
  67307. 08034906 <sys_now>:
  67308. }
  67309. u32_t sys_now(void)
  67310. {
  67311. return xTaskGetTickCount();
  67312. 8034906: f7f4 bea3 b.w 8029650 <xTaskGetTickCount>
  67313. 0803490a <sys_thread_new>:
  67314. * int prio -- Thread priority
  67315. * Outputs:
  67316. * sys_thread_t -- Pointer to per-thread timeouts.
  67317. *---------------------------------------------------------------------------*/
  67318. sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority )
  67319. {
  67320. 803490a: b570 push {r4, r5, r6, lr}
  67321. 803490c: b086 sub sp, #24
  67322. 803490e: 4606 mov r6, r0
  67323. TaskHandle_t xCreatedTask;
  67324. portBASE_TYPE xResult;
  67325. sys_thread_t xReturn;
  67326. xResult = xTaskCreate( pxThread, pcName, iStackSize, pvArg, iPriority, &xCreatedTask );
  67327. 8034910: 9c0a ldr r4, [sp, #40] ; 0x28
  67328. * int prio -- Thread priority
  67329. * Outputs:
  67330. * sys_thread_t -- Pointer to per-thread timeouts.
  67331. *---------------------------------------------------------------------------*/
  67332. sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority )
  67333. {
  67334. 8034912: 4615 mov r5, r2
  67335. TaskHandle_t xCreatedTask;
  67336. portBASE_TYPE xResult;
  67337. sys_thread_t xReturn;
  67338. xResult = xTaskCreate( pxThread, pcName, iStackSize, pvArg, iPriority, &xCreatedTask );
  67339. 8034914: 9400 str r4, [sp, #0]
  67340. 8034916: aa05 add r2, sp, #20
  67341. 8034918: 2400 movs r4, #0
  67342. 803491a: 9201 str r2, [sp, #4]
  67343. 803491c: 9402 str r4, [sp, #8]
  67344. 803491e: b29a uxth r2, r3
  67345. 8034920: 9403 str r4, [sp, #12]
  67346. 8034922: 4608 mov r0, r1
  67347. 8034924: 462b mov r3, r5
  67348. 8034926: 4631 mov r1, r6
  67349. 8034928: f7f4 fd2a bl 8029380 <xTaskGenericCreate>
  67350. if( xResult == pdPASS )
  67351. 803492c: 2801 cmp r0, #1
  67352. {
  67353. xReturn = xCreatedTask;
  67354. 803492e: bf0c ite eq
  67355. 8034930: 9805 ldreq r0, [sp, #20]
  67356. }
  67357. else
  67358. {
  67359. xReturn = NULL;
  67360. 8034932: 4620 movne r0, r4
  67361. }
  67362. return xReturn;
  67363. }
  67364. 8034934: b006 add sp, #24
  67365. 8034936: bd70 pop {r4, r5, r6, pc}
  67366. 08034938 <sys_arch_protect>:
  67367. * operating system.
  67368. * Outputs:
  67369. * sys_prot_t -- Previous protection level (not used here)
  67370. *---------------------------------------------------------------------------*/
  67371. sys_prot_t sys_arch_protect( void )
  67372. {
  67373. 8034938: b508 push {r3, lr}
  67374. if( xInsideISR == pdFALSE )
  67375. 803493a: 4b03 ldr r3, [pc, #12] ; (8034948 <sys_arch_protect+0x10>)
  67376. 803493c: 681b ldr r3, [r3, #0]
  67377. 803493e: b90b cbnz r3, 8034944 <sys_arch_protect+0xc>
  67378. {
  67379. taskENTER_CRITICAL();
  67380. 8034940: f7f5 fb82 bl 802a048 <vPortEnterCritical>
  67381. }
  67382. return ( sys_prot_t ) 1;
  67383. }
  67384. 8034944: 2001 movs r0, #1
  67385. 8034946: bd08 pop {r3, pc}
  67386. 8034948: 2000e4e4 .word 0x2000e4e4
  67387. 0803494c <sys_arch_unprotect>:
  67388. * sys_prot_t -- Previous protection level (not used here)
  67389. *---------------------------------------------------------------------------*/
  67390. void sys_arch_unprotect( sys_prot_t xValue )
  67391. {
  67392. (void) xValue;
  67393. if( xInsideISR == pdFALSE )
  67394. 803494c: 4b02 ldr r3, [pc, #8] ; (8034958 <sys_arch_unprotect+0xc>)
  67395. 803494e: 681b ldr r3, [r3, #0]
  67396. 8034950: b90b cbnz r3, 8034956 <sys_arch_unprotect+0xa>
  67397. {
  67398. taskEXIT_CRITICAL();
  67399. 8034952: f7f5 bba5 b.w 802a0a0 <vPortExitCritical>
  67400. 8034956: 4770 bx lr
  67401. 8034958: 2000e4e4 .word 0x2000e4e4
  67402. 0803495c <vTaskWebReinit>:
  67403. * Если флаг не устанавливается в положенное время, то сбрасывается
  67404. * флаг sSettings.sFlags.netsettingsChanged, сохраняется вся структура
  67405. * настроек в памяти и контроллер перезагружается.
  67406. */
  67407. void vTaskWebReinit(void * pvParameters)
  67408. {
  67409. 803495c: b538 push {r3, r4, r5, lr}
  67410. static uint16_t timeCounter = 0;
  67411. for (;;)
  67412. {
  67413. /* Контроль времени работы задачи */
  67414. if (timeCounter++ > TIME_COUNTER_10_MIN)
  67415. 803495e: 4c20 ldr r4, [pc, #128] ; (80349e0 <vTaskWebReinit+0x84>)
  67416. if (fConfirmWebParams)
  67417. {
  67418. fConfirmWebParams = false;
  67419. /* Сохраняем временные сетевые настройки в постоянные */
  67420. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  67421. 8034960: 4d20 ldr r5, [pc, #128] ; (80349e4 <vTaskWebReinit+0x88>)
  67422. static uint16_t timeCounter = 0;
  67423. for (;;)
  67424. {
  67425. /* Контроль времени работы задачи */
  67426. if (timeCounter++ > TIME_COUNTER_10_MIN)
  67427. 8034962: 8823 ldrh r3, [r4, #0]
  67428. 8034964: 1c5a adds r2, r3, #1
  67429. 8034966: f5b3 7f16 cmp.w r3, #600 ; 0x258
  67430. 803496a: 8022 strh r2, [r4, #0]
  67431. 803496c: d914 bls.n 8034998 <vTaskWebReinit+0x3c>
  67432. {
  67433. SetWebReinitFlag(false);
  67434. 803496e: 2000 movs r0, #0
  67435. 8034970: f7f3 faee bl 8027f50 <SetWebReinitFlag>
  67436. HTTP_SaveSettings();
  67437. 8034974: f7f7 f979 bl 802bc6a <HTTP_SaveSettings>
  67438. vTaskDelay(1010);
  67439. 8034978: f240 30f2 movw r0, #1010 ; 0x3f2
  67440. 803497c: f7f4 ff9a bl 80298b4 <vTaskDelay>
  67441. 8034980: f3bf 8f4f dsb sy
  67442. (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  67443. 8034984: 4a18 ldr r2, [pc, #96] ; (80349e8 <vTaskWebReinit+0x8c>)
  67444. 8034986: 4b19 ldr r3, [pc, #100] ; (80349ec <vTaskWebReinit+0x90>)
  67445. 8034988: 68d1 ldr r1, [r2, #12]
  67446. 803498a: f401 61e0 and.w r1, r1, #1792 ; 0x700
  67447. 803498e: 430b orrs r3, r1
  67448. __STATIC_INLINE void NVIC_SystemReset(void)
  67449. //static inline void NVIC_SystemReset(void)
  67450. {
  67451. __DSB(); /* Ensure all outstanding memory accesses included
  67452. buffered write are completed before reset */
  67453. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  67454. 8034990: 60d3 str r3, [r2, #12]
  67455. 8034992: f3bf 8f4f dsb sy
  67456. 8034996: e7fe b.n 8034996 <vTaskWebReinit+0x3a>
  67457. NVIC_SystemReset();
  67458. }
  67459. if (fConfirmWebParams)
  67460. 8034998: 4b15 ldr r3, [pc, #84] ; (80349f0 <vTaskWebReinit+0x94>)
  67461. 803499a: 781a ldrb r2, [r3, #0]
  67462. 803499c: b1d2 cbz r2, 80349d4 <vTaskWebReinit+0x78>
  67463. {
  67464. fConfirmWebParams = false;
  67465. 803499e: 2200 movs r2, #0
  67466. /* Сохраняем временные сетевые настройки в постоянные */
  67467. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  67468. strcpy(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip);
  67469. 80349a0: 4814 ldr r0, [pc, #80] ; (80349f4 <vTaskWebReinit+0x98>)
  67470. NVIC_SystemReset();
  67471. }
  67472. if (fConfirmWebParams)
  67473. {
  67474. fConfirmWebParams = false;
  67475. 80349a2: 701a strb r2, [r3, #0]
  67476. /* Сохраняем временные сетевые настройки в постоянные */
  67477. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  67478. 80349a4: f895 3063 ldrb.w r3, [r5, #99] ; 0x63
  67479. strcpy(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip);
  67480. 80349a8: f100 0131 add.w r1, r0, #49 ; 0x31
  67481. if (fConfirmWebParams)
  67482. {
  67483. fConfirmWebParams = false;
  67484. /* Сохраняем временные сетевые настройки в постоянные */
  67485. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  67486. 80349ac: f885 3032 strb.w r3, [r5, #50] ; 0x32
  67487. strcpy(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip);
  67488. 80349b0: f7ed fa00 bl 8021db4 <strcpy>
  67489. strcpy(sSettings.sWebParams.gate, sSettings.sWebTempParams.gate);
  67490. 80349b4: 4810 ldr r0, [pc, #64] ; (80349f8 <vTaskWebReinit+0x9c>)
  67491. 80349b6: f100 0131 add.w r1, r0, #49 ; 0x31
  67492. 80349ba: f7ed f9fb bl 8021db4 <strcpy>
  67493. strcpy(sSettings.sWebParams.mask, sSettings.sWebTempParams.mask);
  67494. 80349be: 480f ldr r0, [pc, #60] ; (80349fc <vTaskWebReinit+0xa0>)
  67495. 80349c0: f100 0131 add.w r1, r0, #49 ; 0x31
  67496. 80349c4: f7ed f9f6 bl 8021db4 <strcpy>
  67497. HTTP_SaveSettings();
  67498. 80349c8: f7f7 f94f bl 802bc6a <HTTP_SaveSettings>
  67499. vTaskDelete(xHandleWebReinit);
  67500. 80349cc: 4b0c ldr r3, [pc, #48] ; (8034a00 <vTaskWebReinit+0xa4>)
  67501. 80349ce: 6818 ldr r0, [r3, #0]
  67502. 80349d0: f7f4 fdae bl 8029530 <vTaskDelete>
  67503. }
  67504. vTaskDelay(1000);
  67505. 80349d4: f44f 707a mov.w r0, #1000 ; 0x3e8
  67506. 80349d8: f7f4 ff6c bl 80298b4 <vTaskDelay>
  67507. }
  67508. 80349dc: e7c1 b.n 8034962 <vTaskWebReinit+0x6>
  67509. 80349de: bf00 nop
  67510. 80349e0: 2000e4f4 .word 0x2000e4f4
  67511. 80349e4: 2000e8e4 .word 0x2000e8e4
  67512. 80349e8: e000ed00 .word 0xe000ed00
  67513. 80349ec: 05fa0004 .word 0x05fa0004
  67514. 80349f0: 200028ac .word 0x200028ac
  67515. 80349f4: 2000e8e6 .word 0x2000e8e6
  67516. 80349f8: 2000e8f6 .word 0x2000e8f6
  67517. 80349fc: 2000e906 .word 0x2000e906
  67518. 8034a00: 2000e4ec .word 0x2000e4ec
  67519. 08034a04 <LwIP_DHCP_task>:
  67520. * @brief LwIP_DHCP_Process_Handle
  67521. * @param None
  67522. * @retval None
  67523. */
  67524. void LwIP_DHCP_task(void * pvParameters)
  67525. {
  67526. 8034a04: b530 push {r4, r5, lr}
  67527. DHCP_state = DHCP_TIMEOUT;
  67528. /* Stop DHCP */
  67529. dhcp_stop(&xnetif);
  67530. if (sSettings.sFlags.netsettingsChanged == true)
  67531. 8034a06: 4d48 ldr r5, [pc, #288] ; (8034b28 <LwIP_DHCP_task+0x124>)
  67532. * @brief LwIP_DHCP_Process_Handle
  67533. * @param None
  67534. * @retval None
  67535. */
  67536. void LwIP_DHCP_task(void * pvParameters)
  67537. {
  67538. 8034a08: b085 sub sp, #20
  67539. struct ip_addr ipaddr;
  67540. struct ip_addr netmask;
  67541. struct ip_addr gw;
  67542. uint8_t DHCP_state;
  67543. DHCP_state = DHCP_START;
  67544. 8034a0a: 2400 movs r4, #0
  67545. for (;;)
  67546. {
  67547. switch (DHCP_state)
  67548. 8034a0c: b11c cbz r4, 8034a16 <LwIP_DHCP_task+0x12>
  67549. 8034a0e: 2c01 cmp r4, #1
  67550. 8034a10: f040 8085 bne.w 8034b1e <LwIP_DHCP_task+0x11a>
  67551. 8034a14: e004 b.n 8034a20 <LwIP_DHCP_task+0x1c>
  67552. {
  67553. case DHCP_START:
  67554. {
  67555. dhcp_start(&xnetif);
  67556. 8034a16: 4845 ldr r0, [pc, #276] ; (8034b2c <LwIP_DHCP_task+0x128>)
  67557. 8034a18: f7f8 f80e bl 802ca38 <dhcp_start>
  67558. DHCP_state = DHCP_WAIT_ADDRESS;
  67559. 8034a1c: 2401 movs r4, #1
  67560. //PRINT_USART("\n\rLooking for DHCP server please wait...\n\r");
  67561. }
  67562. break;
  67563. 8034a1e: e07e b.n 8034b1e <LwIP_DHCP_task+0x11a>
  67564. case DHCP_WAIT_ADDRESS:
  67565. {
  67566. /* Read the new IP address */
  67567. ipaddr = xnetif.ip_addr;
  67568. 8034a20: 4842 ldr r0, [pc, #264] ; (8034b2c <LwIP_DHCP_task+0x128>)
  67569. netmask = xnetif.netmask;
  67570. 8034a22: 6882 ldr r2, [r0, #8]
  67571. break;
  67572. case DHCP_WAIT_ADDRESS:
  67573. {
  67574. /* Read the new IP address */
  67575. ipaddr = xnetif.ip_addr;
  67576. 8034a24: 6843 ldr r3, [r0, #4]
  67577. netmask = xnetif.netmask;
  67578. 8034a26: 9202 str r2, [sp, #8]
  67579. gw = xnetif.gw;
  67580. 8034a28: 68c2 ldr r2, [r0, #12]
  67581. break;
  67582. case DHCP_WAIT_ADDRESS:
  67583. {
  67584. /* Read the new IP address */
  67585. ipaddr = xnetif.ip_addr;
  67586. 8034a2a: 9301 str r3, [sp, #4]
  67587. netmask = xnetif.netmask;
  67588. gw = xnetif.gw;
  67589. 8034a2c: 9203 str r2, [sp, #12]
  67590. if (ipaddr.addr != 0)
  67591. 8034a2e: 2b00 cmp r3, #0
  67592. 8034a30: d045 beq.n 8034abe <LwIP_DHCP_task+0xba>
  67593. {
  67594. DHCP_state = DHCP_ADDRESS_ASSIGNED;
  67595. dhcp_stop(&xnetif);
  67596. 8034a32: f7f7 ffe9 bl 802ca08 <dhcp_stop>
  67597. /* Сохранение полученных сетевый параметров */
  67598. /* Если настройки изменили, то сохраняем во временные настройки */
  67599. if (sSettings.sFlags.netsettingsChanged == true)
  67600. 8034a36: f895 32fc ldrb.w r3, [r5, #764] ; 0x2fc
  67601. {
  67602. sprintf(sSettings.sWebTempParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  67603. 8034a3a: a801 add r0, sp, #4
  67604. DHCP_state = DHCP_ADDRESS_ASSIGNED;
  67605. dhcp_stop(&xnetif);
  67606. /* Сохранение полученных сетевый параметров */
  67607. /* Если настройки изменили, то сохраняем во временные настройки */
  67608. if (sSettings.sFlags.netsettingsChanged == true)
  67609. 8034a3c: b103 cbz r3, 8034a40 <LwIP_DHCP_task+0x3c>
  67610. 8034a3e: e01b b.n 8034a78 <LwIP_DHCP_task+0x74>
  67611. sprintf(sSettings.sWebTempParams.mask, "%s", ipaddr_ntoa(&netmask));
  67612. sprintf(sSettings.sWebTempParams.gate, "%s", ipaddr_ntoa(&gw));
  67613. }
  67614. else
  67615. {
  67616. sprintf(sSettings.sWebParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  67617. 8034a40: f7fb fa7a bl 802ff38 <ipaddr_ntoa>
  67618. 8034a44: 493a ldr r1, [pc, #232] ; (8034b30 <LwIP_DHCP_task+0x12c>)
  67619. 8034a46: 4602 mov r2, r0
  67620. 8034a48: 483a ldr r0, [pc, #232] ; (8034b34 <LwIP_DHCP_task+0x130>)
  67621. 8034a4a: f7f2 fe7b bl 8027744 <tfp_sprintf>
  67622. sprintf(sSettings.sWebParams.mask, "%s", ipaddr_ntoa(&netmask));
  67623. 8034a4e: a802 add r0, sp, #8
  67624. 8034a50: f7fb fa72 bl 802ff38 <ipaddr_ntoa>
  67625. 8034a54: 4936 ldr r1, [pc, #216] ; (8034b30 <LwIP_DHCP_task+0x12c>)
  67626. 8034a56: 4602 mov r2, r0
  67627. 8034a58: 4837 ldr r0, [pc, #220] ; (8034b38 <LwIP_DHCP_task+0x134>)
  67628. 8034a5a: f7f2 fe73 bl 8027744 <tfp_sprintf>
  67629. sprintf(sSettings.sWebParams.gate, "%s", ipaddr_ntoa(&gw));
  67630. 8034a5e: a803 add r0, sp, #12
  67631. 8034a60: f7fb fa6a bl 802ff38 <ipaddr_ntoa>
  67632. 8034a64: 4932 ldr r1, [pc, #200] ; (8034b30 <LwIP_DHCP_task+0x12c>)
  67633. 8034a66: 4602 mov r2, r0
  67634. 8034a68: 4834 ldr r0, [pc, #208] ; (8034b3c <LwIP_DHCP_task+0x138>)
  67635. 8034a6a: f7f2 fe6b bl 8027744 <tfp_sprintf>
  67636. /* Обновляем временные настройки */
  67637. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  67638. 8034a6e: f895 3032 ldrb.w r3, [r5, #50] ; 0x32
  67639. sprintf(sSettings.sWebTempParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  67640. 8034a72: a801 add r0, sp, #4
  67641. sprintf(sSettings.sWebParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  67642. sprintf(sSettings.sWebParams.mask, "%s", ipaddr_ntoa(&netmask));
  67643. sprintf(sSettings.sWebParams.gate, "%s", ipaddr_ntoa(&gw));
  67644. /* Обновляем временные настройки */
  67645. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  67646. 8034a74: f885 3063 strb.w r3, [r5, #99] ; 0x63
  67647. sprintf(sSettings.sWebTempParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  67648. 8034a78: f7fb fa5e bl 802ff38 <ipaddr_ntoa>
  67649. 8034a7c: 492c ldr r1, [pc, #176] ; (8034b30 <LwIP_DHCP_task+0x12c>)
  67650. 8034a7e: 4602 mov r2, r0
  67651. 8034a80: 482f ldr r0, [pc, #188] ; (8034b40 <LwIP_DHCP_task+0x13c>)
  67652. 8034a82: f7f2 fe5f bl 8027744 <tfp_sprintf>
  67653. sprintf(sSettings.sWebTempParams.mask, "%s", ipaddr_ntoa(&netmask));
  67654. 8034a86: a802 add r0, sp, #8
  67655. 8034a88: f7fb fa56 bl 802ff38 <ipaddr_ntoa>
  67656. 8034a8c: 4928 ldr r1, [pc, #160] ; (8034b30 <LwIP_DHCP_task+0x12c>)
  67657. 8034a8e: 4602 mov r2, r0
  67658. 8034a90: 482c ldr r0, [pc, #176] ; (8034b44 <LwIP_DHCP_task+0x140>)
  67659. 8034a92: f7f2 fe57 bl 8027744 <tfp_sprintf>
  67660. sprintf(sSettings.sWebTempParams.gate, "%s", ipaddr_ntoa(&gw));
  67661. 8034a96: a803 add r0, sp, #12
  67662. 8034a98: f7fb fa4e bl 802ff38 <ipaddr_ntoa>
  67663. 8034a9c: 4924 ldr r1, [pc, #144] ; (8034b30 <LwIP_DHCP_task+0x12c>)
  67664. 8034a9e: 4602 mov r2, r0
  67665. 8034aa0: 4829 ldr r0, [pc, #164] ; (8034b48 <LwIP_DHCP_task+0x144>)
  67666. 8034aa2: f7f2 fe4f bl 8027744 <tfp_sprintf>
  67667. PRINT_USART("Gateway: ");
  67668. PRINT_USART(ipaddr_ntoa(&gw));
  67669. PRINT_USART("\n\r");
  67670. vTaskDelay(50);
  67671. 8034aa6: 2032 movs r0, #50 ; 0x32
  67672. 8034aa8: f7f4 ff04 bl 80298b4 <vTaskDelay>
  67673. /* Установлен динамический IP, можно отправить трап о перезагрузке устройства */
  67674. SNMP_SendUserTrap(DEVICE_REBOOTED);
  67675. 8034aac: 2004 movs r0, #4
  67676. 8034aae: f000 f9bb bl 8034e28 <SNMP_SendUserTrap>
  67677. vTaskDelete(xHandleDHCP);
  67678. 8034ab2: 4b26 ldr r3, [pc, #152] ; (8034b4c <LwIP_DHCP_task+0x148>)
  67679. 8034ab4: 6818 ldr r0, [r3, #0]
  67680. 8034ab6: f7f4 fd3b bl 8029530 <vTaskDelete>
  67681. netmask = xnetif.netmask;
  67682. gw = xnetif.gw;
  67683. if (ipaddr.addr != 0)
  67684. {
  67685. DHCP_state = DHCP_ADDRESS_ASSIGNED;
  67686. 8034aba: 2402 movs r4, #2
  67687. 8034abc: e02f b.n 8034b1e <LwIP_DHCP_task+0x11a>
  67688. vTaskDelete(xHandleDHCP);
  67689. }
  67690. else
  67691. {
  67692. /* DHCP timeout */
  67693. if (xnetif.dhcp->tries > MAX_DHCP_TRIES)
  67694. 8034abe: 6a03 ldr r3, [r0, #32]
  67695. 8034ac0: 7b5b ldrb r3, [r3, #13]
  67696. 8034ac2: 2b03 cmp r3, #3
  67697. 8034ac4: d92b bls.n 8034b1e <LwIP_DHCP_task+0x11a>
  67698. {
  67699. DHCP_state = DHCP_TIMEOUT;
  67700. /* Stop DHCP */
  67701. dhcp_stop(&xnetif);
  67702. 8034ac6: f7f7 ff9f bl 802ca08 <dhcp_stop>
  67703. if (sSettings.sFlags.netsettingsChanged == true)
  67704. 8034aca: f895 32fc ldrb.w r3, [r5, #764] ; 0x2fc
  67705. 8034ace: b14b cbz r3, 8034ae4 <LwIP_DHCP_task+0xe0>
  67706. {
  67707. ipaddr.addr = ipaddr_addr(sSettings.sWebTempParams.ip);
  67708. 8034ad0: 481b ldr r0, [pc, #108] ; (8034b40 <LwIP_DHCP_task+0x13c>)
  67709. 8034ad2: f7fb f9de bl 802fe92 <ipaddr_addr>
  67710. 8034ad6: 9001 str r0, [sp, #4]
  67711. netmask.addr = ipaddr_addr(sSettings.sWebTempParams.mask);
  67712. 8034ad8: 481a ldr r0, [pc, #104] ; (8034b44 <LwIP_DHCP_task+0x140>)
  67713. 8034ada: f7fb f9da bl 802fe92 <ipaddr_addr>
  67714. 8034ade: 9002 str r0, [sp, #8]
  67715. gw.addr = ipaddr_addr(sSettings.sWebTempParams.gate);
  67716. 8034ae0: 4819 ldr r0, [pc, #100] ; (8034b48 <LwIP_DHCP_task+0x144>)
  67717. 8034ae2: e008 b.n 8034af6 <LwIP_DHCP_task+0xf2>
  67718. }
  67719. else
  67720. {
  67721. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  67722. 8034ae4: 4813 ldr r0, [pc, #76] ; (8034b34 <LwIP_DHCP_task+0x130>)
  67723. 8034ae6: f7fb f9d4 bl 802fe92 <ipaddr_addr>
  67724. 8034aea: 9001 str r0, [sp, #4]
  67725. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  67726. 8034aec: 4812 ldr r0, [pc, #72] ; (8034b38 <LwIP_DHCP_task+0x134>)
  67727. 8034aee: f7fb f9d0 bl 802fe92 <ipaddr_addr>
  67728. 8034af2: 9002 str r0, [sp, #8]
  67729. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  67730. 8034af4: 4811 ldr r0, [pc, #68] ; (8034b3c <LwIP_DHCP_task+0x138>)
  67731. 8034af6: f7fb f9cc bl 802fe92 <ipaddr_addr>
  67732. }
  67733. /* Static address used */
  67734. netif_set_addr(&xnetif, &ipaddr , &netmask, &gw);
  67735. 8034afa: a901 add r1, sp, #4
  67736. 8034afc: aa02 add r2, sp, #8
  67737. 8034afe: ab03 add r3, sp, #12
  67738. }
  67739. else
  67740. {
  67741. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  67742. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  67743. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  67744. 8034b00: 9003 str r0, [sp, #12]
  67745. }
  67746. /* Static address used */
  67747. netif_set_addr(&xnetif, &ipaddr , &netmask, &gw);
  67748. 8034b02: 480a ldr r0, [pc, #40] ; (8034b2c <LwIP_DHCP_task+0x128>)
  67749. 8034b04: f7f8 f9f0 bl 802cee8 <netif_set_addr>
  67750. PRINT_USART("DHCP timeout\n\r");
  67751. PRINT_USART("\n\rStatic IP address\n\r");
  67752. PRINT_USART(ipaddr_ntoa(&ipaddr));
  67753. PRINT_USART("\n\r");
  67754. vTaskDelay(50);
  67755. 8034b08: 2032 movs r0, #50 ; 0x32
  67756. 8034b0a: f7f4 fed3 bl 80298b4 <vTaskDelay>
  67757. /* Установлен статический IP, можно отправить трап о перезагрузке устройства */
  67758. SNMP_SendUserTrap(DEVICE_REBOOTED);
  67759. 8034b0e: 2004 movs r0, #4
  67760. 8034b10: f000 f98a bl 8034e28 <SNMP_SendUserTrap>
  67761. vTaskDelete(xHandleDHCP);
  67762. 8034b14: 4b0d ldr r3, [pc, #52] ; (8034b4c <LwIP_DHCP_task+0x148>)
  67763. 8034b16: 6818 ldr r0, [r3, #0]
  67764. 8034b18: f7f4 fd0a bl 8029530 <vTaskDelete>
  67765. else
  67766. {
  67767. /* DHCP timeout */
  67768. if (xnetif.dhcp->tries > MAX_DHCP_TRIES)
  67769. {
  67770. DHCP_state = DHCP_TIMEOUT;
  67771. 8034b1c: 2403 movs r4, #3
  67772. break;
  67773. default: break;
  67774. }
  67775. vTaskDelay(250);
  67776. 8034b1e: 20fa movs r0, #250 ; 0xfa
  67777. 8034b20: f7f4 fec8 bl 80298b4 <vTaskDelay>
  67778. }
  67779. 8034b24: e772 b.n 8034a0c <LwIP_DHCP_task+0x8>
  67780. 8034b26: bf00 nop
  67781. 8034b28: 2000e8e4 .word 0x2000e8e4
  67782. 8034b2c: 2001118c .word 0x2001118c
  67783. 8034b30: 08035e67 .word 0x08035e67
  67784. 8034b34: 2000e8e6 .word 0x2000e8e6
  67785. 8034b38: 2000e906 .word 0x2000e906
  67786. 8034b3c: 2000e8f6 .word 0x2000e8f6
  67787. 8034b40: 2000e917 .word 0x2000e917
  67788. 8034b44: 2000e937 .word 0x2000e937
  67789. 8034b48: 2000e927 .word 0x2000e927
  67790. 8034b4c: 2000e4f0 .word 0x2000e4f0
  67791. 08034b50 <LwIP_Init>:
  67792. TaskHandle_t xHandleWebReinit = NULL;
  67793. bool dhcp = false;
  67794. void LwIP_Init(void)
  67795. {
  67796. 8034b50: b530 push {r4, r5, lr}
  67797. struct ip_addr ipaddr;
  67798. struct ip_addr netmask;
  67799. struct ip_addr gw;
  67800. char str[20];
  67801. tcpip_init( NULL, NULL );
  67802. 8034b52: 2000 movs r0, #0
  67803. sSettings.sFlags.netsettingsChanged = false;
  67804. 8034b54: 4c36 ldr r4, [pc, #216] ; (8034c30 <LwIP_Init+0xe0>)
  67805. TaskHandle_t xHandleWebReinit = NULL;
  67806. bool dhcp = false;
  67807. void LwIP_Init(void)
  67808. {
  67809. 8034b56: b08d sub sp, #52 ; 0x34
  67810. struct ip_addr ipaddr;
  67811. struct ip_addr netmask;
  67812. struct ip_addr gw;
  67813. char str[20];
  67814. tcpip_init( NULL, NULL );
  67815. 8034b58: 4601 mov r1, r0
  67816. 8034b5a: f7f7 f909 bl 802bd70 <tcpip_init>
  67817. }
  67818. }
  67819. /* Настройки не менялись, используем обычне настройки из флеш памяти */
  67820. else
  67821. {
  67822. if (sSettings.sWebParams.dhcpEnable)
  67823. 8034b5e: f894 5032 ldrb.w r5, [r4, #50] ; 0x32
  67824. struct ip_addr netmask;
  67825. struct ip_addr gw;
  67826. char str[20];
  67827. tcpip_init( NULL, NULL );
  67828. sSettings.sFlags.netsettingsChanged = false;
  67829. 8034b62: 2300 movs r3, #0
  67830. 8034b64: f884 32fc strb.w r3, [r4, #764] ; 0x2fc
  67831. }
  67832. }
  67833. /* Настройки не менялись, используем обычне настройки из флеш памяти */
  67834. else
  67835. {
  67836. if (sSettings.sWebParams.dhcpEnable)
  67837. 8034b68: b125 cbz r5, 8034b74 <LwIP_Init+0x24>
  67838. {
  67839. ipaddr.addr = 0;
  67840. 8034b6a: 9304 str r3, [sp, #16]
  67841. netmask.addr = 0;
  67842. 8034b6c: 9305 str r3, [sp, #20]
  67843. gw.addr = 0;
  67844. 8034b6e: 9306 str r3, [sp, #24]
  67845. netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  67846. 8034b70: 9300 str r3, [sp, #0]
  67847. 8034b72: e028 b.n 8034bc6 <LwIP_Init+0x76>
  67848. netif_set_default(&xnetif);
  67849. netif_set_up(&xnetif);
  67850. }
  67851. else
  67852. {
  67853. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  67854. 8034b74: 1ca0 adds r0, r4, #2
  67855. 8034b76: f7fb f98c bl 802fe92 <ipaddr_addr>
  67856. 8034b7a: 9004 str r0, [sp, #16]
  67857. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  67858. 8034b7c: f104 0022 add.w r0, r4, #34 ; 0x22
  67859. 8034b80: f7fb f987 bl 802fe92 <ipaddr_addr>
  67860. 8034b84: 9005 str r0, [sp, #20]
  67861. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  67862. 8034b86: f104 0012 add.w r0, r4, #18
  67863. 8034b8a: f7fb f982 bl 802fe92 <ipaddr_addr>
  67864. /* Обновляем временные настройки */
  67865. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  67866. 8034b8e: f894 3032 ldrb.w r3, [r4, #50] ; 0x32
  67867. }
  67868. else
  67869. {
  67870. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  67871. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  67872. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  67873. 8034b92: 9006 str r0, [sp, #24]
  67874. /* Обновляем временные настройки */
  67875. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  67876. strcpy(sSettings.sWebTempParams.ip, sSettings.sWebParams.ip);
  67877. 8034b94: 1ca1 adds r1, r4, #2
  67878. 8034b96: f104 0033 add.w r0, r4, #51 ; 0x33
  67879. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  67880. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  67881. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  67882. /* Обновляем временные настройки */
  67883. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  67884. 8034b9a: f884 3063 strb.w r3, [r4, #99] ; 0x63
  67885. strcpy(sSettings.sWebTempParams.ip, sSettings.sWebParams.ip);
  67886. 8034b9e: f7ed f909 bl 8021db4 <strcpy>
  67887. strcpy(sSettings.sWebTempParams.mask, sSettings.sWebParams.mask);
  67888. 8034ba2: f104 0122 add.w r1, r4, #34 ; 0x22
  67889. 8034ba6: f104 0053 add.w r0, r4, #83 ; 0x53
  67890. 8034baa: f7ed f903 bl 8021db4 <strcpy>
  67891. strcpy(sSettings.sWebTempParams.gate, sSettings.sWebParams.gate);
  67892. 8034bae: f104 0112 add.w r1, r4, #18
  67893. 8034bb2: f104 0043 add.w r0, r4, #67 ; 0x43
  67894. 8034bb6: f7ed f8fd bl 8021db4 <strcpy>
  67895. sprintf(str, " %s\n\r", sSettings.sWebParams.ip);
  67896. 8034bba: a807 add r0, sp, #28
  67897. 8034bbc: 491d ldr r1, [pc, #116] ; (8034c34 <LwIP_Init+0xe4>)
  67898. 8034bbe: 1ca2 adds r2, r4, #2
  67899. 8034bc0: f7f2 fdc0 bl 8027744 <tfp_sprintf>
  67900. PRINT_USART("\n\rStatic IP address \n\r");
  67901. PRINT_USART(str);
  67902. netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  67903. 8034bc4: 9500 str r5, [sp, #0]
  67904. 8034bc6: 4b1c ldr r3, [pc, #112] ; (8034c38 <LwIP_Init+0xe8>)
  67905. 8034bc8: 481c ldr r0, [pc, #112] ; (8034c3c <LwIP_Init+0xec>)
  67906. 8034bca: 9301 str r3, [sp, #4]
  67907. 8034bcc: 4b1c ldr r3, [pc, #112] ; (8034c40 <LwIP_Init+0xf0>)
  67908. 8034bce: a904 add r1, sp, #16
  67909. 8034bd0: aa05 add r2, sp, #20
  67910. 8034bd2: 9302 str r3, [sp, #8]
  67911. 8034bd4: ab06 add r3, sp, #24
  67912. 8034bd6: f7f8 f995 bl 802cf04 <netif_add>
  67913. netif_set_default(&xnetif);
  67914. 8034bda: 4818 ldr r0, [pc, #96] ; (8034c3c <LwIP_Init+0xec>)
  67915. 8034bdc: f7f8 f9ba bl 802cf54 <netif_set_default>
  67916. netif_set_up(&xnetif);
  67917. 8034be0: 4816 ldr r0, [pc, #88] ; (8034c3c <LwIP_Init+0xec>)
  67918. 8034be2: f7f8 f9c7 bl 802cf74 <netif_set_up>
  67919. }
  67920. if (sSettings.sWebParams.dhcpEnable) {
  67921. 8034be6: 4b12 ldr r3, [pc, #72] ; (8034c30 <LwIP_Init+0xe0>)
  67922. 8034be8: f893 3032 ldrb.w r3, [r3, #50] ; 0x32
  67923. 8034bec: b17b cbz r3, 8034c0e <LwIP_Init+0xbe>
  67924. xTaskCreate(LwIP_DHCP_task, "DHCPClient", configMINIMAL_STACK_SIZE * 2, NULL,
  67925. 8034bee: 2302 movs r3, #2
  67926. 8034bf0: 9300 str r3, [sp, #0]
  67927. 8034bf2: 4b14 ldr r3, [pc, #80] ; (8034c44 <LwIP_Init+0xf4>)
  67928. 8034bf4: 4814 ldr r0, [pc, #80] ; (8034c48 <LwIP_Init+0xf8>)
  67929. 8034bf6: 9301 str r3, [sp, #4]
  67930. 8034bf8: 2300 movs r3, #0
  67931. 8034bfa: 9302 str r3, [sp, #8]
  67932. 8034bfc: 9303 str r3, [sp, #12]
  67933. 8034bfe: f44f 7280 mov.w r2, #256 ; 0x100
  67934. 8034c02: 4912 ldr r1, [pc, #72] ; (8034c4c <LwIP_Init+0xfc>)
  67935. 8034c04: f7f4 fbbc bl 8029380 <xTaskGenericCreate>
  67936. tskIDLE_PRIORITY + 2, &xHandleDHCP);
  67937. dhcp = true;
  67938. 8034c08: 4b11 ldr r3, [pc, #68] ; (8034c50 <LwIP_Init+0x100>)
  67939. 8034c0a: 2201 movs r2, #1
  67940. 8034c0c: 701a strb r2, [r3, #0]
  67941. }
  67942. }
  67943. /* Если настройки изменились, запускаем задачу по отсчету времени реакции пользователя*/
  67944. if (sSettings.sFlags.netsettingsChanged == true)
  67945. 8034c0e: 4b08 ldr r3, [pc, #32] ; (8034c30 <LwIP_Init+0xe0>)
  67946. 8034c10: f893 32fc ldrb.w r3, [r3, #764] ; 0x2fc
  67947. 8034c14: b153 cbz r3, 8034c2c <LwIP_Init+0xdc>
  67948. xTaskCreate(vTaskWebReinit, "webReinit", configMINIMAL_STACK_SIZE, NULL,
  67949. 8034c16: 4a0f ldr r2, [pc, #60] ; (8034c54 <LwIP_Init+0x104>)
  67950. 8034c18: 480f ldr r0, [pc, #60] ; (8034c58 <LwIP_Init+0x108>)
  67951. 8034c1a: 9201 str r2, [sp, #4]
  67952. 8034c1c: 2300 movs r3, #0
  67953. 8034c1e: 9300 str r3, [sp, #0]
  67954. 8034c20: 9302 str r3, [sp, #8]
  67955. 8034c22: 9303 str r3, [sp, #12]
  67956. 8034c24: 490d ldr r1, [pc, #52] ; (8034c5c <LwIP_Init+0x10c>)
  67957. 8034c26: 2280 movs r2, #128 ; 0x80
  67958. 8034c28: f7f4 fbaa bl 8029380 <xTaskGenericCreate>
  67959. tskIDLE_PRIORITY, &xHandleWebReinit);
  67960. }
  67961. 8034c2c: b00d add sp, #52 ; 0x34
  67962. 8034c2e: bd30 pop {r4, r5, pc}
  67963. 8034c30: 2000e8e4 .word 0x2000e8e4
  67964. 8034c34: 080407ca .word 0x080407ca
  67965. 8034c38: 080346f5 .word 0x080346f5
  67966. 8034c3c: 2001118c .word 0x2001118c
  67967. 8034c40: 0802bd31 .word 0x0802bd31
  67968. 8034c44: 2000e4f0 .word 0x2000e4f0
  67969. 8034c48: 08034a05 .word 0x08034a05
  67970. 8034c4c: 080407d0 .word 0x080407d0
  67971. 8034c50: 2000e4e8 .word 0x2000e4e8
  67972. 8034c54: 2000e4ec .word 0x2000e4ec
  67973. 8034c58: 0803495d .word 0x0803495d
  67974. 8034c5c: 080407db .word 0x080407db
  67975. 08034c60 <GetStateWebReinit>:
  67976. /**
  67977. * @brief Возвращает true если сетевые параметры изменились
  67978. */
  67979. bool GetStateWebReinit(void)
  67980. {
  67981. 8034c60: b510 push {r4, lr}
  67982. /* Статус dhcp изменился? */
  67983. if (sSettings.sWebParams.dhcpEnable != sSettings.sWebTempParams.dhcpEnable)
  67984. 8034c62: 4c12 ldr r4, [pc, #72] ; (8034cac <GetStateWebReinit+0x4c>)
  67985. 8034c64: f894 2032 ldrb.w r2, [r4, #50] ; 0x32
  67986. 8034c68: f894 3063 ldrb.w r3, [r4, #99] ; 0x63
  67987. 8034c6c: 429a cmp r2, r3
  67988. 8034c6e: d004 beq.n 8034c7a <GetStateWebReinit+0x1a>
  67989. {
  67990. /* Включили dhcp */
  67991. if (sSettings.sWebTempParams.dhcpEnable == 1)
  67992. {
  67993. /* Устанавилваем флаг */
  67994. SetWebReinitFlag(true);
  67995. 8034c70: 2001 movs r0, #1
  67996. 8034c72: f7f3 f96d bl 8027f50 <SetWebReinitFlag>
  67997. return true;
  67998. 8034c76: 2001 movs r0, #1
  67999. 8034c78: bd10 pop {r4, pc}
  68000. return true;
  68001. }
  68002. }
  68003. /* Изменился IP? */
  68004. if (strstr(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip) == 0)
  68005. 8034c7a: 1ca0 adds r0, r4, #2
  68006. 8034c7c: f104 0133 add.w r1, r4, #51 ; 0x33
  68007. 8034c80: f7ed fb76 bl 8022370 <strstr>
  68008. 8034c84: 2800 cmp r0, #0
  68009. 8034c86: d0f3 beq.n 8034c70 <GetStateWebReinit+0x10>
  68010. SetWebReinitFlag(true);
  68011. return true;
  68012. }
  68013. /* Изменился шлюз? */
  68014. if (strstr(sSettings.sWebParams.gate, sSettings.sWebTempParams.gate) == 0)
  68015. 8034c88: f104 0012 add.w r0, r4, #18
  68016. 8034c8c: f104 0143 add.w r1, r4, #67 ; 0x43
  68017. 8034c90: f7ed fb6e bl 8022370 <strstr>
  68018. 8034c94: 2800 cmp r0, #0
  68019. 8034c96: d0eb beq.n 8034c70 <GetStateWebReinit+0x10>
  68020. SetWebReinitFlag(true);
  68021. return true;
  68022. }
  68023. /* Изменилась маска? */
  68024. if (strstr(sSettings.sWebParams.mask, sSettings.sWebTempParams.mask) == 0)
  68025. 8034c98: f104 0022 add.w r0, r4, #34 ; 0x22
  68026. 8034c9c: f104 0153 add.w r1, r4, #83 ; 0x53
  68027. 8034ca0: f7ed fb66 bl 8022370 <strstr>
  68028. 8034ca4: 2800 cmp r0, #0
  68029. 8034ca6: d0e3 beq.n 8034c70 <GetStateWebReinit+0x10>
  68030. /* Устанавилваем флаг */
  68031. SetWebReinitFlag(true);
  68032. return true;
  68033. }
  68034. return false;
  68035. 8034ca8: 2000 movs r0, #0
  68036. }
  68037. 8034caa: bd10 pop {r4, pc}
  68038. 8034cac: 2000e8e4 .word 0x2000e8e4
  68039. 08034cb0 <signals_set_test>:
  68040. {
  68041. u8_t id, set_ok;
  68042. LWIP_UNUSED_ARG(value);
  68043. set_ok = 0;
  68044. id = od->id_inst_ptr[0];
  68045. 8034cb0: 6883 ldr r3, [r0, #8]
  68046. switch (id)
  68047. 8034cb2: 781b ldrb r3, [r3, #0]
  68048. 8034cb4: 2b02 cmp r3, #2
  68049. 8034cb6: d001 beq.n 8034cbc <signals_set_test+0xc>
  68050. 8034cb8: 2b03 cmp r3, #3
  68051. 8034cba: d103 bne.n 8034cc4 <signals_set_test+0x14>
  68052. static u8_t signals_set_test (struct obj_def *od, u16_t len, void *value)
  68053. {
  68054. u8_t id, set_ok;
  68055. LWIP_UNUSED_ARG(value);
  68056. set_ok = 0;
  68057. 8034cbc: 1f0b subs r3, r1, #4
  68058. 8034cbe: 4258 negs r0, r3
  68059. 8034cc0: 4158 adcs r0, r3
  68060. 8034cc2: 4770 bx lr
  68061. 8034cc4: 2000 movs r0, #0
  68062. }
  68063. break;
  68064. };
  68065. return set_ok;
  68066. }
  68067. 8034cc6: 4770 bx lr
  68068. 08034cc8 <signals_get_value>:
  68069. \param len - длина переменной в байтах
  68070. \param value - указатель на значение переменной
  68071. \return нет
  68072. ------------------------------------------------------------------------------*/
  68073. static void signals_get_value (struct obj_def *od, u16_t len, void *value)
  68074. {
  68075. 8034cc8: 4613 mov r3, r2
  68076. u8_t id;
  68077. id = od->id_inst_ptr[0];
  68078. 8034cca: 6882 ldr r2, [r0, #8]
  68079. switch (id)
  68080. 8034ccc: 7812 ldrb r2, [r2, #0]
  68081. 8034cce: 3a01 subs r2, #1
  68082. \param len - длина переменной в байтах
  68083. \param value - указатель на значение переменной
  68084. \return нет
  68085. ------------------------------------------------------------------------------*/
  68086. static void signals_get_value (struct obj_def *od, u16_t len, void *value)
  68087. {
  68088. 8034cd0: b510 push {r4, lr}
  68089. 8034cd2: 460c mov r4, r1
  68090. u8_t id;
  68091. id = od->id_inst_ptr[0];
  68092. switch (id)
  68093. 8034cd4: 2a0c cmp r2, #12
  68094. 8034cd6: d812 bhi.n 8034cfe <signals_get_value+0x36>
  68095. 8034cd8: e8df f002 tbb [pc, r2]
  68096. 8034cdc: 0a07070a .word 0x0a07070a
  68097. 8034ce0: 0a0a0a0a .word 0x0a0a0a0a
  68098. 8034ce4: 0a0a0a0a .word 0x0a0a0a0a
  68099. 8034ce8: 0a .byte 0x0a
  68100. 8034ce9: 00 .byte 0x00
  68101. break;
  68102. case 2: /* RestoreSignal */
  68103. *((s32_t*)value) = 0;
  68104. break;
  68105. case 3: /* RebootSignal */
  68106. *((s32_t*)value) = 0;
  68107. 8034cea: 2200 movs r2, #0
  68108. 8034cec: 601a str r2, [r3, #0]
  68109. break;
  68110. 8034cee: bd10 pop {r4, pc}
  68111. break;
  68112. case 12: /* BatCap */
  68113. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  68114. break;
  68115. case 13: /* ConnectMonitor */
  68116. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  68117. 8034cf0: 4903 ldr r1, [pc, #12] ; (8034d00 <signals_get_value+0x38>)
  68118. 8034cf2: 4618 mov r0, r3
  68119. 8034cf4: 4622 mov r2, r4
  68120. break;
  68121. default :
  68122. break;
  68123. };
  68124. }
  68125. 8034cf6: e8bd 4010 ldmia.w sp!, {r4, lr}
  68126. break;
  68127. case 12: /* BatCap */
  68128. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  68129. break;
  68130. case 13: /* ConnectMonitor */
  68131. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  68132. 8034cfa: f7fc bb77 b.w 80313ec <ocstrncpy>
  68133. 8034cfe: bd10 pop {r4, pc}
  68134. 8034d00: 200112d8 .word 0x200112d8
  68135. 08034d04 <signals_get_object_def>:
  68136. u8_t id;
  68137. /* return to object name, adding index depth (1) */
  68138. ident_len += 1;
  68139. ident -= 1;
  68140. if (ident_len == 2)
  68141. 8034d04: 2801 cmp r0, #1
  68142. \param ident - points to objectname.0 (object id trailer)
  68143. \param od - points to object definition. указатель на описание переменной
  68144. \return нет
  68145. ------------------------------------------------------------------------------*/
  68146. static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od)
  68147. {
  68148. 8034d06: b538 push {r3, r4, r5, lr}
  68149. 8034d08: 4614 mov r4, r2
  68150. u8_t id;
  68151. /* return to object name, adding index depth (1) */
  68152. ident_len += 1;
  68153. ident -= 1;
  68154. if (ident_len == 2)
  68155. 8034d0a: d16b bne.n 8034de4 <signals_get_object_def+0xe0>
  68156. {
  68157. od->id_inst_len = ident_len;
  68158. 8034d0c: 2302 movs r3, #2
  68159. 8034d0e: 7193 strb r3, [r2, #6]
  68160. {
  68161. u8_t id;
  68162. /* return to object name, adding index depth (1) */
  68163. ident_len += 1;
  68164. ident -= 1;
  68165. 8034d10: 1f0b subs r3, r1, #4
  68166. if (ident_len == 2)
  68167. {
  68168. od->id_inst_len = ident_len;
  68169. od->id_inst_ptr = ident;
  68170. 8034d12: 6093 str r3, [r2, #8]
  68171. id = ident[0];
  68172. switch (id)
  68173. 8034d14: f811 3c04 ldrb.w r3, [r1, #-4]
  68174. 8034d18: 3b01 subs r3, #1
  68175. 8034d1a: 2b0c cmp r3, #12
  68176. 8034d1c: d862 bhi.n 8034de4 <signals_get_object_def+0xe0>
  68177. 8034d1e: e8df f003 tbb [pc, r3]
  68178. 8034d22: 0d07 .short 0x0d07
  68179. 8034d24: 2a241e12 .word 0x2a241e12
  68180. 8034d28: 423c3630 .word 0x423c3630
  68181. 8034d2c: 4e48 .short 0x4e48
  68182. 8034d2e: 54 .byte 0x54
  68183. 8034d2f: 00 .byte 0x00
  68184. {
  68185. case 1: /* FWVersion */
  68186. GetVersionStr(paramStr, &paramLength);
  68187. 8034d30: 4d2e ldr r5, [pc, #184] ; (8034dec <signals_get_object_def+0xe8>)
  68188. 8034d32: 482f ldr r0, [pc, #188] ; (8034df0 <signals_get_object_def+0xec>)
  68189. 8034d34: 4629 mov r1, r5
  68190. 8034d36: f7f2 fef1 bl 8027b1c <GetVersionStr>
  68191. 8034d3a: e04b b.n 8034dd4 <signals_get_object_def+0xd0>
  68192. od->access = MIB_OBJECT_READ_ONLY;
  68193. od->asn_type = SNMP_ASN1_OC_STR;
  68194. od->v_len = paramLength;
  68195. break;
  68196. case 2: /* RestoreSignal */
  68197. GetRestore(paramStr, &paramLength);
  68198. 8034d3c: 482c ldr r0, [pc, #176] ; (8034df0 <signals_get_object_def+0xec>)
  68199. 8034d3e: 492b ldr r1, [pc, #172] ; (8034dec <signals_get_object_def+0xe8>)
  68200. 8034d40: f7f3 f8ca bl 8027ed8 <GetRestore>
  68201. 8034d44: e003 b.n 8034d4e <signals_get_object_def+0x4a>
  68202. od->access = MIB_OBJECT_READ_WRITE;
  68203. od->asn_type = SNMP_ASN1_INTEG;
  68204. od->v_len = sizeof(s32_t);
  68205. break;
  68206. case 3: /* RebootSignal */
  68207. GetReboot(paramStr, &paramLength);
  68208. 8034d46: 482a ldr r0, [pc, #168] ; (8034df0 <signals_get_object_def+0xec>)
  68209. 8034d48: 4928 ldr r1, [pc, #160] ; (8034dec <signals_get_object_def+0xe8>)
  68210. 8034d4a: f7f3 f8d3 bl 8027ef4 <GetReboot>
  68211. od->instance = MIB_OBJECT_SCALAR;
  68212. 8034d4e: 2301 movs r3, #1
  68213. 8034d50: 7023 strb r3, [r4, #0]
  68214. od->access = MIB_OBJECT_READ_WRITE;
  68215. 8034d52: 2303 movs r3, #3
  68216. 8034d54: 7063 strb r3, [r4, #1]
  68217. od->asn_type = SNMP_ASN1_INTEG;
  68218. 8034d56: 2302 movs r3, #2
  68219. 8034d58: 70a3 strb r3, [r4, #2]
  68220. od->v_len = sizeof(s32_t);
  68221. 8034d5a: 2304 movs r3, #4
  68222. 8034d5c: e040 b.n 8034de0 <signals_get_object_def+0xdc>
  68223. break;
  68224. case 4: /* IntTemp */
  68225. GetInternalTempStr(paramStr, &paramLength);
  68226. 8034d5e: 4d23 ldr r5, [pc, #140] ; (8034dec <signals_get_object_def+0xe8>)
  68227. 8034d60: 4823 ldr r0, [pc, #140] ; (8034df0 <signals_get_object_def+0xec>)
  68228. 8034d62: 4629 mov r1, r5
  68229. 8034d64: f7f2 fd92 bl 802788c <GetInternalTempStr>
  68230. 8034d68: e034 b.n 8034dd4 <signals_get_object_def+0xd0>
  68231. od->access = MIB_OBJECT_READ_ONLY;
  68232. od->asn_type = SNMP_ASN1_OC_STR;
  68233. od->v_len = paramLength;
  68234. break;
  68235. case 5: /* LineFailBit */
  68236. GetLineFailBitStr(paramStr, &paramLength);
  68237. 8034d6a: 4d20 ldr r5, [pc, #128] ; (8034dec <signals_get_object_def+0xe8>)
  68238. 8034d6c: 4820 ldr r0, [pc, #128] ; (8034df0 <signals_get_object_def+0xec>)
  68239. 8034d6e: 4629 mov r1, r5
  68240. 8034d70: f7f2 fcf4 bl 802775c <GetLineFailBitStr>
  68241. 8034d74: e02e b.n 8034dd4 <signals_get_object_def+0xd0>
  68242. od->access = MIB_OBJECT_READ_ONLY;
  68243. od->asn_type = SNMP_ASN1_OC_STR;
  68244. od->v_len = paramLength;
  68245. break;
  68246. case 6: /* LowBatBit */
  68247. GetLowBatteryBitStr(paramStr, &paramLength);
  68248. 8034d76: 4d1d ldr r5, [pc, #116] ; (8034dec <signals_get_object_def+0xe8>)
  68249. 8034d78: 481d ldr r0, [pc, #116] ; (8034df0 <signals_get_object_def+0xec>)
  68250. 8034d7a: 4629 mov r1, r5
  68251. 8034d7c: f7f2 fcf3 bl 8027766 <GetLowBatteryBitStr>
  68252. 8034d80: e028 b.n 8034dd4 <signals_get_object_def+0xd0>
  68253. od->access = MIB_OBJECT_READ_ONLY;
  68254. od->asn_type = SNMP_ASN1_OC_STR;
  68255. od->v_len = paramLength;
  68256. break;
  68257. case 7: /* InFreq */
  68258. GetInputFreqStr(paramStr, &paramLength);
  68259. 8034d82: 4d1a ldr r5, [pc, #104] ; (8034dec <signals_get_object_def+0xe8>)
  68260. 8034d84: 481a ldr r0, [pc, #104] ; (8034df0 <signals_get_object_def+0xec>)
  68261. 8034d86: 4629 mov r1, r5
  68262. 8034d88: f7f2 fcf2 bl 8027770 <GetInputFreqStr>
  68263. 8034d8c: e022 b.n 8034dd4 <signals_get_object_def+0xd0>
  68264. od->access = MIB_OBJECT_READ_ONLY;
  68265. od->asn_type = SNMP_ASN1_OC_STR;
  68266. od->v_len = paramLength;
  68267. break;
  68268. case 8: /* OutFreq */
  68269. GetOutputFreqStr(paramStr, &paramLength);
  68270. 8034d8e: 4d17 ldr r5, [pc, #92] ; (8034dec <signals_get_object_def+0xe8>)
  68271. 8034d90: 4817 ldr r0, [pc, #92] ; (8034df0 <signals_get_object_def+0xec>)
  68272. 8034d92: 4629 mov r1, r5
  68273. 8034d94: f7f2 fd02 bl 802779c <GetOutputFreqStr>
  68274. 8034d98: e01c b.n 8034dd4 <signals_get_object_def+0xd0>
  68275. od->access = MIB_OBJECT_READ_ONLY;
  68276. od->asn_type = SNMP_ASN1_OC_STR;
  68277. od->v_len = paramLength;
  68278. break;
  68279. case 9: /* InVoltVAC */
  68280. GetInputVoltageStr(paramStr, &paramLength);
  68281. 8034d9a: 4d14 ldr r5, [pc, #80] ; (8034dec <signals_get_object_def+0xe8>)
  68282. 8034d9c: 4814 ldr r0, [pc, #80] ; (8034df0 <signals_get_object_def+0xec>)
  68283. 8034d9e: 4629 mov r1, r5
  68284. 8034da0: f7f2 fd12 bl 80277c8 <GetInputVoltageStr>
  68285. 8034da4: e016 b.n 8034dd4 <signals_get_object_def+0xd0>
  68286. od->access = MIB_OBJECT_READ_ONLY;
  68287. od->asn_type = SNMP_ASN1_OC_STR;
  68288. od->v_len = paramLength;
  68289. break;
  68290. case 10: /* OutVoltVAC */
  68291. GetOutputVoltageStr(paramStr, &paramLength);
  68292. 8034da6: 4d11 ldr r5, [pc, #68] ; (8034dec <signals_get_object_def+0xe8>)
  68293. 8034da8: 4811 ldr r0, [pc, #68] ; (8034df0 <signals_get_object_def+0xec>)
  68294. 8034daa: 4629 mov r1, r5
  68295. 8034dac: f7f2 fd22 bl 80277f4 <GetOutputVoltageStr>
  68296. 8034db0: e010 b.n 8034dd4 <signals_get_object_def+0xd0>
  68297. od->access = MIB_OBJECT_READ_ONLY;
  68298. od->asn_type = SNMP_ASN1_OC_STR;
  68299. od->v_len = paramLength;
  68300. break;
  68301. case 11: /* Power */
  68302. GetPowerStr(paramStr, &paramLength);
  68303. 8034db2: 4d0e ldr r5, [pc, #56] ; (8034dec <signals_get_object_def+0xe8>)
  68304. 8034db4: 480e ldr r0, [pc, #56] ; (8034df0 <signals_get_object_def+0xec>)
  68305. 8034db6: 4629 mov r1, r5
  68306. 8034db8: f7f2 fd32 bl 8027820 <GetPowerStr>
  68307. 8034dbc: e00a b.n 8034dd4 <signals_get_object_def+0xd0>
  68308. od->access = MIB_OBJECT_READ_ONLY;
  68309. od->asn_type = SNMP_ASN1_OC_STR;
  68310. od->v_len = paramLength;
  68311. break;
  68312. case 12: /* BatCap */
  68313. GetBatCapacityStr(paramStr, &paramLength);
  68314. 8034dbe: 4d0b ldr r5, [pc, #44] ; (8034dec <signals_get_object_def+0xe8>)
  68315. 8034dc0: 480b ldr r0, [pc, #44] ; (8034df0 <signals_get_object_def+0xec>)
  68316. 8034dc2: 4629 mov r1, r5
  68317. 8034dc4: f7f2 fd3e bl 8027844 <GetBatCapacityStr>
  68318. 8034dc8: e004 b.n 8034dd4 <signals_get_object_def+0xd0>
  68319. od->access = MIB_OBJECT_READ_ONLY;
  68320. od->asn_type = SNMP_ASN1_OC_STR;
  68321. od->v_len = paramLength;
  68322. break;
  68323. case 13: /* ConnectMonitor */
  68324. GetConnectMonitorStr(paramStr, &paramLength);
  68325. 8034dca: 4d08 ldr r5, [pc, #32] ; (8034dec <signals_get_object_def+0xe8>)
  68326. 8034dcc: 4808 ldr r0, [pc, #32] ; (8034df0 <signals_get_object_def+0xec>)
  68327. 8034dce: 4629 mov r1, r5
  68328. 8034dd0: f7f2 fd7c bl 80278cc <GetConnectMonitorStr>
  68329. od->instance = MIB_OBJECT_SCALAR;
  68330. 8034dd4: 2301 movs r3, #1
  68331. 8034dd6: 7023 strb r3, [r4, #0]
  68332. od->access = MIB_OBJECT_READ_ONLY;
  68333. 8034dd8: 7063 strb r3, [r4, #1]
  68334. od->asn_type = SNMP_ASN1_OC_STR;
  68335. 8034dda: 2304 movs r3, #4
  68336. 8034ddc: 70a3 strb r3, [r4, #2]
  68337. od->v_len = paramLength;
  68338. 8034dde: 782b ldrb r3, [r5, #0]
  68339. 8034de0: 80a3 strh r3, [r4, #4]
  68340. break;
  68341. 8034de2: bd38 pop {r3, r4, r5, pc}
  68342. };
  68343. }
  68344. else
  68345. {
  68346. LWIP_DEBUGF(SNMP_MIB_DEBUG,("planar_get_object_def: no scalar\n"));
  68347. od->instance = MIB_OBJECT_NONE;
  68348. 8034de4: 2300 movs r3, #0
  68349. 8034de6: 7023 strb r3, [r4, #0]
  68350. 8034de8: bd38 pop {r3, r4, r5, pc}
  68351. 8034dea: bf00 nop
  68352. 8034dec: 2000e4f6 .word 0x2000e4f6
  68353. 8034df0: 200112d8 .word 0x200112d8
  68354. 08034df4 <signals_set_value>:
  68355. \param len - длина переменной в байтах
  68356. \param value - указатель на значение переменной
  68357. \return нет
  68358. ------------------------------------------------------------------------------*/
  68359. static void signals_set_value (struct obj_def *od, u16_t len, void *value)
  68360. {
  68361. 8034df4: b508 push {r3, lr}
  68362. u8_t id;
  68363. uint32_t val;
  68364. id = od->id_inst_ptr[0];
  68365. val = *((s32_t*)value);
  68366. 8034df6: 6813 ldr r3, [r2, #0]
  68367. static void signals_set_value (struct obj_def *od, u16_t len, void *value)
  68368. {
  68369. u8_t id;
  68370. uint32_t val;
  68371. id = od->id_inst_ptr[0];
  68372. 8034df8: 6882 ldr r2, [r0, #8]
  68373. val = *((s32_t*)value);
  68374. switch (id)
  68375. 8034dfa: 7812 ldrb r2, [r2, #0]
  68376. 8034dfc: 2a02 cmp r2, #2
  68377. 8034dfe: d002 beq.n 8034e06 <signals_set_value+0x12>
  68378. 8034e00: 2a03 cmp r2, #3
  68379. 8034e02: d110 bne.n 8034e26 <signals_set_value+0x32>
  68380. 8034e04: e008 b.n 8034e18 <signals_set_value+0x24>
  68381. {
  68382. case 2: /* RestoreSignal */
  68383. if (val == 1) {
  68384. 8034e06: 2b01 cmp r3, #1
  68385. 8034e08: d10d bne.n 8034e26 <signals_set_value+0x32>
  68386. SNMP_SendUserTrap(DEVICE_RESTORED);
  68387. 8034e0a: 2003 movs r0, #3
  68388. 8034e0c: f000 f80c bl 8034e28 <SNMP_SendUserTrap>
  68389. break;
  68390. default :
  68391. break;
  68392. };
  68393. }
  68394. 8034e10: e8bd 4008 ldmia.w sp!, {r3, lr}
  68395. switch (id)
  68396. {
  68397. case 2: /* RestoreSignal */
  68398. if (val == 1) {
  68399. SNMP_SendUserTrap(DEVICE_RESTORED);
  68400. HTTP_ResetSettings();
  68401. 8034e14: f7f6 bf22 b.w 802bc5c <HTTP_ResetSettings>
  68402. }
  68403. break;
  68404. case 3: /* RebootSignal */
  68405. if (val == 1)
  68406. 8034e18: 2b01 cmp r3, #1
  68407. 8034e1a: d104 bne.n 8034e26 <signals_set_value+0x32>
  68408. HTTP_StartResetTask(false);
  68409. 8034e1c: 2000 movs r0, #0
  68410. break;
  68411. default :
  68412. break;
  68413. };
  68414. }
  68415. 8034e1e: e8bd 4008 ldmia.w sp!, {r3, lr}
  68416. HTTP_ResetSettings();
  68417. }
  68418. break;
  68419. case 3: /* RebootSignal */
  68420. if (val == 1)
  68421. HTTP_StartResetTask(false);
  68422. 8034e22: f7f6 bf2b b.w 802bc7c <HTTP_StartResetTask>
  68423. 8034e26: bd08 pop {r3, pc}
  68424. 08034e28 <SNMP_SendUserTrap>:
  68425. * FIFO буфера.
  68426. * Если в настройках трапа отправка отключена, то трап игнорируется.
  68427. * @retval
  68428. */
  68429. void SNMP_SendUserTrap(uint8_t trapName)
  68430. {
  68431. 8034e28: b51f push {r0, r1, r2, r3, r4, lr}
  68432. uint16_t availableSpace;
  68433. uint8_t dummyTrap;
  68434. if (traps[trapName].trapEnable)
  68435. 8034e2a: 4b0d ldr r3, [pc, #52] ; (8034e60 <SNMP_SendUserTrap+0x38>)
  68436. * FIFO буфера.
  68437. * Если в настройках трапа отправка отключена, то трап игнорируется.
  68438. * @retval
  68439. */
  68440. void SNMP_SendUserTrap(uint8_t trapName)
  68441. {
  68442. 8034e2c: f88d 0007 strb.w r0, [sp, #7]
  68443. uint16_t availableSpace;
  68444. uint8_t dummyTrap;
  68445. if (traps[trapName].trapEnable)
  68446. 8034e30: eb03 00c0 add.w r0, r3, r0, lsl #3
  68447. 8034e34: 78c3 ldrb r3, [r0, #3]
  68448. 8034e36: b193 cbz r3, 8034e5e <SNMP_SendUserTrap+0x36>
  68449. {
  68450. availableSpace = uxQueueSpacesAvailable(SNMP_TrapQueue);
  68451. 8034e38: 4c0a ldr r4, [pc, #40] ; (8034e64 <SNMP_SendUserTrap+0x3c>)
  68452. 8034e3a: 6820 ldr r0, [r4, #0]
  68453. 8034e3c: f7f4 fa39 bl 80292b2 <uxQueueSpacesAvailable>
  68454. if (availableSpace == 0)
  68455. 8034e40: b282 uxth r2, r0
  68456. 8034e42: b92a cbnz r2, 8034e50 <SNMP_SendUserTrap+0x28>
  68457. xQueueReceive(SNMP_TrapQueue, &dummyTrap, 0);
  68458. 8034e44: 6820 ldr r0, [r4, #0]
  68459. 8034e46: f10d 010f add.w r1, sp, #15
  68460. 8034e4a: 4613 mov r3, r2
  68461. 8034e4c: f7f4 f98e bl 802916c <xQueueGenericReceive>
  68462. xQueueSend(SNMP_TrapQueue, &trapName, 0);
  68463. 8034e50: 2200 movs r2, #0
  68464. 8034e52: 6820 ldr r0, [r4, #0]
  68465. 8034e54: f10d 0107 add.w r1, sp, #7
  68466. 8034e58: 4613 mov r3, r2
  68467. 8034e5a: f7f4 f847 bl 8028eec <xQueueGenericSend>
  68468. }
  68469. }
  68470. 8034e5e: bd1f pop {r0, r1, r2, r3, r4, pc}
  68471. 8034e60: 200113dc .word 0x200113dc
  68472. 8034e64: 200113d8 .word 0x200113d8
  68473. 08034e68 <SNMP_SetObjDescr>:
  68474. * @brief Установить SNMP Descriptor
  68475. * @retval
  68476. */
  68477. // TODO
  68478. void SNMP_SetObjDescr(void)
  68479. {
  68480. 8034e68: b538 push {r3, r4, r5, lr}
  68481. static uint8_t len;
  68482. strcpy(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysName);
  68483. 8034e6a: 4c15 ldr r4, [pc, #84] ; (8034ec0 <SNMP_SetObjDescr+0x58>)
  68484. strcat(sSettings.sSnmp.sysDescr, " ");
  68485. 8034e6c: 4d15 ldr r5, [pc, #84] ; (8034ec4 <SNMP_SetObjDescr+0x5c>)
  68486. // TODO
  68487. void SNMP_SetObjDescr(void)
  68488. {
  68489. static uint8_t len;
  68490. strcpy(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysName);
  68491. 8034e6e: f104 01fa add.w r1, r4, #250 ; 0xfa
  68492. 8034e72: 4620 mov r0, r4
  68493. 8034e74: f7ec ff9e bl 8021db4 <strcpy>
  68494. strcat(sSettings.sSnmp.sysDescr, " ");
  68495. 8034e78: 4629 mov r1, r5
  68496. 8034e7a: 4620 mov r0, r4
  68497. 8034e7c: f7ec fe86 bl 8021b8c <strcat>
  68498. strcat(sSettings.sSnmp.sysDescr, VERSION);
  68499. 8034e80: 4620 mov r0, r4
  68500. 8034e82: 4911 ldr r1, [pc, #68] ; (8034ec8 <SNMP_SetObjDescr+0x60>)
  68501. 8034e84: f7ec fe82 bl 8021b8c <strcat>
  68502. strcat(sSettings.sSnmp.sysDescr, " ");
  68503. 8034e88: 4629 mov r1, r5
  68504. 8034e8a: 4620 mov r0, r4
  68505. 8034e8c: f7ec fe7e bl 8021b8c <strcat>
  68506. strcat(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysContact);
  68507. 8034e90: f104 01c8 add.w r1, r4, #200 ; 0xc8
  68508. 8034e94: 4620 mov r0, r4
  68509. 8034e96: f7ec fe79 bl 8021b8c <strcat>
  68510. strcat(sSettings.sSnmp.sysDescr, " ");
  68511. 8034e9a: 4629 mov r1, r5
  68512. 8034e9c: 4620 mov r0, r4
  68513. 8034e9e: f7ec fe75 bl 8021b8c <strcat>
  68514. strcat(sSettings.sSnmp.sysDescr, sSettings.sInfo.serialNumber);
  68515. 8034ea2: 490a ldr r1, [pc, #40] ; (8034ecc <SNMP_SetObjDescr+0x64>)
  68516. 8034ea4: 4620 mov r0, r4
  68517. 8034ea6: f7ec fe71 bl 8021b8c <strcat>
  68518. len = strlen(sSettings.sSnmp.sysDescr);
  68519. 8034eaa: 4620 mov r0, r4
  68520. 8034eac: f7ec ffe0 bl 8021e70 <strlen>
  68521. 8034eb0: 4907 ldr r1, [pc, #28] ; (8034ed0 <SNMP_SetObjDescr+0x68>)
  68522. 8034eb2: 7008 strb r0, [r1, #0]
  68523. snmp_set_sysdesr((u8_t*)sSettings.sSnmp.sysDescr, &len);
  68524. 8034eb4: 4620 mov r0, r4
  68525. }
  68526. 8034eb6: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  68527. strcat(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysContact);
  68528. strcat(sSettings.sSnmp.sysDescr, " ");
  68529. strcat(sSettings.sSnmp.sysDescr, sSettings.sInfo.serialNumber);
  68530. len = strlen(sSettings.sSnmp.sysDescr);
  68531. snmp_set_sysdesr((u8_t*)sSettings.sSnmp.sysDescr, &len);
  68532. 8034eba: f7fc bba1 b.w 8031600 <snmp_set_sysdesr>
  68533. 8034ebe: bf00 nop
  68534. 8034ec0: 2000e948 .word 0x2000e948
  68535. 8034ec4: 08035f57 .word 0x08035f57
  68536. 8034ec8: 08035e85 .word 0x08035e85
  68537. 8034ecc: 2000eb62 .word 0x2000eb62
  68538. 8034ed0: 2000e4f7 .word 0x2000e4f7
  68539. 08034ed4 <SNMP_SetSysContact>:
  68540. /**
  68541. * @brief Установить SNMP SysContact
  68542. * @retval
  68543. */
  68544. void SNMP_SetSysContact(char *con)
  68545. {
  68546. 8034ed4: b510 push {r4, lr}
  68547. 8034ed6: 4604 mov r4, r0
  68548. static uint8_t len;
  68549. len = strlen(con);
  68550. 8034ed8: f7ec ffca bl 8021e70 <strlen>
  68551. 8034edc: 4903 ldr r1, [pc, #12] ; (8034eec <SNMP_SetSysContact+0x18>)
  68552. 8034ede: 7008 strb r0, [r1, #0]
  68553. snmp_set_syscontact((u8_t*)con, &len);
  68554. 8034ee0: 4620 mov r0, r4
  68555. }
  68556. 8034ee2: e8bd 4010 ldmia.w sp!, {r4, lr}
  68557. void SNMP_SetSysContact(char *con)
  68558. {
  68559. static uint8_t len;
  68560. len = strlen(con);
  68561. snmp_set_syscontact((u8_t*)con, &len);
  68562. 8034ee6: f7fc bbdd b.w 80316a4 <snmp_set_syscontact>
  68563. 8034eea: bf00 nop
  68564. 8034eec: 2000e4f8 .word 0x2000e4f8
  68565. 08034ef0 <SNMP_SetSysLocation>:
  68566. /**
  68567. * @brief Установить SNMP SysLocation
  68568. * @retval
  68569. */
  68570. void SNMP_SetSysLocation(char *loc)
  68571. {
  68572. 8034ef0: b510 push {r4, lr}
  68573. 8034ef2: 4604 mov r4, r0
  68574. static uint8_t len;
  68575. len = strlen(loc);
  68576. 8034ef4: f7ec ffbc bl 8021e70 <strlen>
  68577. 8034ef8: 4903 ldr r1, [pc, #12] ; (8034f08 <SNMP_SetSysLocation+0x18>)
  68578. 8034efa: 7008 strb r0, [r1, #0]
  68579. snmp_set_syslocation((u8_t*)loc, &len);
  68580. 8034efc: 4620 mov r0, r4
  68581. }
  68582. 8034efe: e8bd 4010 ldmia.w sp!, {r4, lr}
  68583. void SNMP_SetSysLocation(char *loc)
  68584. {
  68585. static uint8_t len;
  68586. len = strlen(loc);
  68587. snmp_set_syslocation((u8_t*)loc, &len);
  68588. 8034f02: f7fc bbd9 b.w 80316b8 <snmp_set_syslocation>
  68589. 8034f06: bf00 nop
  68590. 8034f08: 2000e4f9 .word 0x2000e4f9
  68591. 08034f0c <SNMP_SetManagerIP>:
  68592. /**
  68593. * @brief Установить SNMP SysManagerIP
  68594. * @retval
  68595. */
  68596. void SNMP_SetManagerIP(char *ip)
  68597. {
  68598. 8034f0c: b510 push {r4, lr}
  68599. static ip_addr_t trap_addr;
  68600. ipaddr_aton(ip, &trap_addr);
  68601. 8034f0e: 4c05 ldr r4, [pc, #20] ; (8034f24 <SNMP_SetManagerIP+0x18>)
  68602. 8034f10: 4621 mov r1, r4
  68603. 8034f12: f7fa ff40 bl 802fd96 <ipaddr_aton>
  68604. snmp_trap_dst_ip_set(0, &trap_addr);
  68605. 8034f16: 2000 movs r0, #0
  68606. 8034f18: 4621 mov r1, r4
  68607. }
  68608. 8034f1a: e8bd 4010 ldmia.w sp!, {r4, lr}
  68609. void SNMP_SetManagerIP(char *ip)
  68610. {
  68611. static ip_addr_t trap_addr;
  68612. ipaddr_aton(ip, &trap_addr);
  68613. snmp_trap_dst_ip_set(0, &trap_addr);
  68614. 8034f1e: f7fe bcd7 b.w 80338d0 <snmp_trap_dst_ip_set>
  68615. 8034f22: bf00 nop
  68616. 8034f24: 2000e4fc .word 0x2000e4fc
  68617. 08034f28 <recv>:
  68618. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  68619. }
  68620. static void recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
  68621. struct ip_addr *addr, u16_t port)
  68622. {
  68623. 8034f28: b570 push {r4, r5, r6, lr}
  68624. 8034f2a: 4616 mov r6, r2
  68625. time_t t;
  68626. int utcSec = 0;
  68627. TM_RTC_t data;
  68628. if (p->len == sizeof(struct sntp_packet))
  68629. 8034f2c: 8952 ldrh r2, [r2, #10]
  68630. 8034f2e: 2a30 cmp r2, #48 ; 0x30
  68631. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  68632. }
  68633. static void recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
  68634. struct ip_addr *addr, u16_t port)
  68635. {
  68636. 8034f30: b094 sub sp, #80 ; 0x50
  68637. time_t t;
  68638. int utcSec = 0;
  68639. TM_RTC_t data;
  68640. if (p->len == sizeof(struct sntp_packet))
  68641. 8034f32: d149 bne.n 8034fc8 <recv+0xa0>
  68642. {
  68643. int i;
  68644. struct sntp_packet aligned;
  68645. //myassert(p->len == p->tot_len); /* don't accept chained pbuf */
  68646. memcpy(&aligned, p->payload, sizeof(aligned));
  68647. 8034f34: a808 add r0, sp, #32
  68648. 8034f36: 6871 ldr r1, [r6, #4]
  68649. 8034f38: f7ec fd08 bl 802194c <memcpy>
  68650. i = (aligned.status >> 3) & 7;
  68651. 8034f3c: f89d 3020 ldrb.w r3, [sp, #32]
  68652. if ((i < 1) || (i > 4)) /* SNTP version 1..4 */
  68653. 8034f40: f3c3 02c2 ubfx r2, r3, #3, #3
  68654. 8034f44: 3a01 subs r2, #1
  68655. 8034f46: 2a03 cmp r2, #3
  68656. 8034f48: d83e bhi.n 8034fc8 <recv+0xa0>
  68657. goto out;
  68658. i = aligned.status & 7;
  68659. if ((i != 4) && (i != 5)) /* mode 4 or 5: server or broadcast */
  68660. 8034f4a: f003 0307 and.w r3, r3, #7
  68661. 8034f4e: 3b04 subs r3, #4
  68662. 8034f50: 2b01 cmp r3, #1
  68663. 8034f52: d839 bhi.n 8034fc8 <recv+0xa0>
  68664. goto out;
  68665. if (aligned.xmt == 0)
  68666. 8034f54: e9dd 4512 ldrd r4, r5, [sp, #72] ; 0x48
  68667. 8034f58: ea54 0305 orrs.w r3, r4, r5
  68668. 8034f5c: d034 beq.n 8034fc8 <recv+0xa0>
  68669. goto out;
  68670. utcSec = (int)(3600.0*sSettings.sSNTP.timeZone);
  68671. 8034f5e: 4b20 ldr r3, [pc, #128] ; (8034fe0 <recv+0xb8>)
  68672. 8034f60: f8d3 0374 ldr.w r0, [r3, #884] ; 0x374
  68673. 8034f64: f7eb fad8 bl 8020518 <__aeabi_f2d>
  68674. 8034f68: a31b add r3, pc, #108 ; (adr r3, 8034fd8 <recv+0xb0>)
  68675. 8034f6a: e9d3 2300 ldrd r2, r3, [r3]
  68676. 8034f6e: f7eb fb27 bl 80205c0 <__aeabi_dmul>
  68677. 8034f72: f7eb fdbf bl 8020af4 <__aeabi_d2iz>
  68678. 8034f76: 4605 mov r5, r0
  68679. t = (ntohl(aligned.xmt) - 2208988800 + utcSec );
  68680. 8034f78: 4620 mov r0, r4
  68681. 8034f7a: f7f6 ff27 bl 802bdcc <lwip_ntohl>
  68682. 8034f7e: 4b19 ldr r3, [pc, #100] ; (8034fe4 <recv+0xbc>)
  68683. 8034f80: 18eb adds r3, r5, r3
  68684. TM_RTC_SetDataTimeUnix((uint32_t)t);
  68685. 8034f82: 1818 adds r0, r3, r0
  68686. 8034f84: f7f1 fb9c bl 80266c0 <TM_RTC_SetDataTimeUnix>
  68687. /* Сохраним время последней синхронизации */
  68688. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  68689. 8034f88: a804 add r0, sp, #16
  68690. 8034f8a: 2100 movs r1, #0
  68691. 8034f8c: f7f1 fa7c bl 8026488 <TM_RTC_GetDateTime>
  68692. memset(sSettings.sSNTP.data, 0, sizeof(sSettings.sSNTP.data));
  68693. 8034f90: 2100 movs r1, #0
  68694. 8034f92: 221e movs r2, #30
  68695. 8034f94: 4814 ldr r0, [pc, #80] ; (8034fe8 <recv+0xc0>)
  68696. 8034f96: f7ec fd93 bl 8021ac0 <memset>
  68697. sprintf(sSettings.sSNTP.data, "%02d.%02d.%02d %02d:%02d:%02d",
  68698. 8034f9a: f89d 1019 ldrb.w r1, [sp, #25]
  68699. 8034f9e: f89d 2017 ldrb.w r2, [sp, #23]
  68700. 8034fa2: 9100 str r1, [sp, #0]
  68701. 8034fa4: f89d 1015 ldrb.w r1, [sp, #21]
  68702. 8034fa8: f89d 3018 ldrb.w r3, [sp, #24]
  68703. 8034fac: 9101 str r1, [sp, #4]
  68704. 8034fae: f89d 1014 ldrb.w r1, [sp, #20]
  68705. 8034fb2: 480d ldr r0, [pc, #52] ; (8034fe8 <recv+0xc0>)
  68706. 8034fb4: 9102 str r1, [sp, #8]
  68707. 8034fb6: f89d 1010 ldrb.w r1, [sp, #16]
  68708. 8034fba: 9103 str r1, [sp, #12]
  68709. 8034fbc: 490b ldr r1, [pc, #44] ; (8034fec <recv+0xc4>)
  68710. 8034fbe: f7f2 fbc1 bl 8027744 <tfp_sprintf>
  68711. data.date, data.month, data.year,
  68712. data.hours, data.minutes, data.seconds);
  68713. timeout = VALID_TIMEOUT;
  68714. 8034fc2: 4a0b ldr r2, [pc, #44] ; (8034ff0 <recv+0xc8>)
  68715. 8034fc4: 4b0b ldr r3, [pc, #44] ; (8034ff4 <recv+0xcc>)
  68716. 8034fc6: 601a str r2, [r3, #0]
  68717. }
  68718. out:
  68719. pbuf_free(p);
  68720. 8034fc8: 4630 mov r0, r6
  68721. 8034fca: f7f8 f831 bl 802d030 <pbuf_free>
  68722. }
  68723. 8034fce: b014 add sp, #80 ; 0x50
  68724. 8034fd0: bd70 pop {r4, r5, r6, pc}
  68725. 8034fd2: bf00 nop
  68726. 8034fd4: f3af 8000 nop.w
  68727. 8034fd8: 00000000 .word 0x00000000
  68728. 8034fdc: 40ac2000 .word 0x40ac2000
  68729. 8034fe0: 2000e8e4 .word 0x2000e8e4
  68730. 8034fe4: 7c558180 .word 0x7c558180
  68731. 8034fe8: 2000ec39 .word 0x2000ec39
  68732. 8034fec: 08040974 .word 0x08040974
  68733. 8034ff0: 01b77400 .word 0x01b77400
  68734. 8034ff4: 2000e508 .word 0x2000e508
  68735. 08034ff8 <SNTP_Enable>:
  68736. void SNTP_Enable(bool enable)
  68737. {
  68738. 8034ff8: b538 push {r3, r4, r5, lr}
  68739. if (enable)
  68740. 8034ffa: 4605 mov r5, r0
  68741. 8034ffc: 4c0f ldr r4, [pc, #60] ; (803503c <SNTP_Enable+0x44>)
  68742. 8034ffe: b1b8 cbz r0, 8035030 <SNTP_Enable+0x38>
  68743. {
  68744. if (upcb == 0)
  68745. 8035000: 6825 ldr r5, [r4, #0]
  68746. 8035002: b9d5 cbnz r5, 803503a <SNTP_Enable+0x42>
  68747. {
  68748. err_t ret;
  68749. upcb = udp_new();
  68750. 8035004: f7fa fd7c bl 802fb00 <udp_new>
  68751. 8035008: 6020 str r0, [r4, #0]
  68752. if (upcb != 0)
  68753. 803500a: b1b0 cbz r0, 803503a <SNTP_Enable+0x42>
  68754. {
  68755. ret = udp_bind(upcb, IP_ADDR_ANY, port);
  68756. 803500c: 227b movs r2, #123 ; 0x7b
  68757. 803500e: 490c ldr r1, [pc, #48] ; (8035040 <SNTP_Enable+0x48>)
  68758. 8035010: f7fa fc5e bl 802f8d0 <udp_bind>
  68759. if (ret != ERR_OK)
  68760. 8035014: 4602 mov r2, r0
  68761. {
  68762. udp_remove(upcb);
  68763. 8035016: 6820 ldr r0, [r4, #0]
  68764. upcb = udp_new();
  68765. if (upcb != 0)
  68766. {
  68767. ret = udp_bind(upcb, IP_ADDR_ANY, port);
  68768. if (ret != ERR_OK)
  68769. 8035018: b11a cbz r2, 8035022 <SNTP_Enable+0x2a>
  68770. {
  68771. udp_remove(upcb);
  68772. 803501a: f7fa fd55 bl 802fac8 <udp_remove>
  68773. upcb = 0;
  68774. 803501e: 6025 str r5, [r4, #0]
  68775. 8035020: e002 b.n 8035028 <SNTP_Enable+0x30>
  68776. }
  68777. else
  68778. {
  68779. udp_recv(upcb, recv, 0);
  68780. 8035022: 4908 ldr r1, [pc, #32] ; (8035044 <SNTP_Enable+0x4c>)
  68781. 8035024: f7fa fd4c bl 802fac0 <udp_recv>
  68782. }
  68783. timeout = 0;
  68784. 8035028: 4b07 ldr r3, [pc, #28] ; (8035048 <SNTP_Enable+0x50>)
  68785. 803502a: 2200 movs r2, #0
  68786. 803502c: 601a str r2, [r3, #0]
  68787. 803502e: bd38 pop {r3, r4, r5, pc}
  68788. }
  68789. }
  68790. }
  68791. else if (upcb != 0)
  68792. 8035030: 6820 ldr r0, [r4, #0]
  68793. 8035032: b110 cbz r0, 803503a <SNTP_Enable+0x42>
  68794. {
  68795. udp_remove(upcb);
  68796. 8035034: f7fa fd48 bl 802fac8 <udp_remove>
  68797. upcb = 0;
  68798. 8035038: 6025 str r5, [r4, #0]
  68799. 803503a: bd38 pop {r3, r4, r5, pc}
  68800. 803503c: 2000e504 .word 0x2000e504
  68801. 8035040: 0803fe88 .word 0x0803fe88
  68802. 8035044: 08034f29 .word 0x08034f29
  68803. 8035048: 2000e508 .word 0x2000e508
  68804. 0803504c <SNTP_SetServerAddr>:
  68805. {
  68806. return upcb != 0;
  68807. }
  68808. void SNTP_SetServerAddr(char *addr)
  68809. {
  68810. 803504c: b508 push {r3, lr}
  68811. server.addr = ipaddr_addr(addr);
  68812. 803504e: f7fa ff20 bl 802fe92 <ipaddr_addr>
  68813. 8035052: 4b01 ldr r3, [pc, #4] ; (8035058 <SNTP_SetServerAddr+0xc>)
  68814. 8035054: 6018 str r0, [r3, #0]
  68815. 8035056: bd08 pop {r3, pc}
  68816. 8035058: 2000e500 .word 0x2000e500
  68817. 0803505c <SNTP_Init>:
  68818. /**
  68819. * @brief Инициализация SNTP.
  68820. * @retval
  68821. */
  68822. void SNTP_Init(void)
  68823. {
  68824. 803505c: b508 push {r3, lr}
  68825. SNTP_SetServerAddr(sSettings.sSNTP.ip);
  68826. 803505e: 4805 ldr r0, [pc, #20] ; (8035074 <SNTP_Init+0x18>)
  68827. 8035060: f7ff fff4 bl 803504c <SNTP_SetServerAddr>
  68828. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  68829. 8035064: 4b04 ldr r3, [pc, #16] ; (8035078 <SNTP_Init+0x1c>)
  68830. 8035066: f893 0344 ldrb.w r0, [r3, #836] ; 0x344
  68831. }
  68832. 803506a: e8bd 4008 ldmia.w sp!, {r3, lr}
  68833. void SNTP_Init(void)
  68834. {
  68835. SNTP_SetServerAddr(sSettings.sSNTP.ip);
  68836. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  68837. 803506e: f7ff bfc3 b.w 8034ff8 <SNTP_Enable>
  68838. 8035072: bf00 nop
  68839. 8035074: 2000ec29 .word 0x2000ec29
  68840. 8035078: 2000e8e4 .word 0x2000e8e4
  68841. 0803507c <SNTP_Poll>:
  68842. pbuf_free(psend);
  68843. }
  68844. }
  68845. void SNTP_Poll(void)
  68846. {
  68847. 803507c: b530 push {r4, r5, lr}
  68848. if (upcb)
  68849. 803507e: 4d15 ldr r5, [pc, #84] ; (80350d4 <SNTP_Poll+0x58>)
  68850. 8035080: 682b ldr r3, [r5, #0]
  68851. pbuf_free(psend);
  68852. }
  68853. }
  68854. void SNTP_Poll(void)
  68855. {
  68856. 8035082: b08d sub sp, #52 ; 0x34
  68857. if (upcb)
  68858. 8035084: b31b cbz r3, 80350ce <SNTP_Poll+0x52>
  68859. static void send_request(void)
  68860. {
  68861. struct sntp_packet packet;
  68862. struct pbuf* psend;
  68863. memset(&packet, 0, sizeof(packet));
  68864. 8035086: 2100 movs r1, #0
  68865. 8035088: 2230 movs r2, #48 ; 0x30
  68866. 803508a: 4668 mov r0, sp
  68867. 803508c: f7ec fd18 bl 8021ac0 <memset>
  68868. packet.status = (3 << 3) /* SNTP vesion 3 */ | (3 << 0); /* Mode: client */
  68869. 8035090: 231b movs r3, #27
  68870. psend = pbuf_alloc(PBUF_RAW, sizeof(packet), PBUF_REF);
  68871. 8035092: 2003 movs r0, #3
  68872. 8035094: 2130 movs r1, #48 ; 0x30
  68873. 8035096: 2202 movs r2, #2
  68874. static void send_request(void)
  68875. {
  68876. struct sntp_packet packet;
  68877. struct pbuf* psend;
  68878. memset(&packet, 0, sizeof(packet));
  68879. packet.status = (3 << 3) /* SNTP vesion 3 */ | (3 << 0); /* Mode: client */
  68880. 8035098: f88d 3000 strb.w r3, [sp]
  68881. psend = pbuf_alloc(PBUF_RAW, sizeof(packet), PBUF_REF);
  68882. 803509c: f7f8 f815 bl 802d0ca <pbuf_alloc>
  68883. if (psend != 0)
  68884. 80350a0: 4604 mov r4, r0
  68885. 80350a2: b1a0 cbz r0, 80350ce <SNTP_Poll+0x52>
  68886. {
  68887. psend->payload = &packet;
  68888. 80350a4: ab00 add r3, sp, #0
  68889. 80350a6: 6043 str r3, [r0, #4]
  68890. timeout = (udp_sendto(upcb, psend, &server, port) == ERR_OK) ? SENT_TIMEOUT : SENDFAIL_TIMEOUT;
  68891. 80350a8: 4621 mov r1, r4
  68892. 80350aa: 4a0b ldr r2, [pc, #44] ; (80350d8 <SNTP_Poll+0x5c>)
  68893. 80350ac: 6828 ldr r0, [r5, #0]
  68894. 80350ae: 237b movs r3, #123 ; 0x7b
  68895. 80350b0: f7fa fcbf bl 802fa32 <udp_sendto>
  68896. 80350b4: f64e 2360 movw r3, #60000 ; 0xea60
  68897. 80350b8: f241 3288 movw r2, #5000 ; 0x1388
  68898. 80350bc: 4907 ldr r1, [pc, #28] ; (80350dc <SNTP_Poll+0x60>)
  68899. 80350be: 2800 cmp r0, #0
  68900. 80350c0: bf14 ite ne
  68901. 80350c2: 4610 movne r0, r2
  68902. 80350c4: 4618 moveq r0, r3
  68903. 80350c6: 6008 str r0, [r1, #0]
  68904. pbuf_free(psend);
  68905. 80350c8: 4620 mov r0, r4
  68906. 80350ca: f7f7 ffb1 bl 802d030 <pbuf_free>
  68907. void SNTP_Poll(void)
  68908. {
  68909. if (upcb)
  68910. send_request();
  68911. }
  68912. 80350ce: b00d add sp, #52 ; 0x34
  68913. 80350d0: bd30 pop {r4, r5, pc}
  68914. 80350d2: bf00 nop
  68915. 80350d4: 2000e504 .word 0x2000e504
  68916. 80350d8: 2000e500 .word 0x2000e500
  68917. 80350dc: 2000e508 .word 0x2000e508
  68918. 080350e0 <vTaskPeriodicSynchro>:
  68919. * @brief Периодическая синхронизация времени.
  68920. * Выполняется раз в сутки с 0 часов.
  68921. * @retval
  68922. */
  68923. void vTaskPeriodicSynchro(void *arg)
  68924. {
  68925. 80350e0: b530 push {r4, r5, lr}
  68926. static uint8_t fSinhro = 0;
  68927. for (;;)
  68928. {
  68929. vTaskDelay(10000);
  68930. if (sSettings.sSNTP.sntpEnable)
  68931. 80350e2: 4d0f ldr r5, [pc, #60] ; (8035120 <vTaskPeriodicSynchro+0x40>)
  68932. fSinhro = 1;
  68933. //printf("Periodic time sinhro\n\r");
  68934. }
  68935. if (data.hours > 1)
  68936. fSinhro = 0;
  68937. 80350e4: 4c0f ldr r4, [pc, #60] ; (8035124 <vTaskPeriodicSynchro+0x44>)
  68938. * @brief Периодическая синхронизация времени.
  68939. * Выполняется раз в сутки с 0 часов.
  68940. * @retval
  68941. */
  68942. void vTaskPeriodicSynchro(void *arg)
  68943. {
  68944. 80350e6: b085 sub sp, #20
  68945. static uint8_t fSinhro = 0;
  68946. for (;;)
  68947. {
  68948. vTaskDelay(10000);
  68949. 80350e8: f242 7010 movw r0, #10000 ; 0x2710
  68950. 80350ec: f7f4 fbe2 bl 80298b4 <vTaskDelay>
  68951. if (sSettings.sSNTP.sntpEnable)
  68952. 80350f0: f895 3344 ldrb.w r3, [r5, #836] ; 0x344
  68953. 80350f4: 2b00 cmp r3, #0
  68954. 80350f6: d0f7 beq.n 80350e8 <vTaskPeriodicSynchro+0x8>
  68955. {
  68956. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  68957. 80350f8: 4668 mov r0, sp
  68958. 80350fa: 2100 movs r1, #0
  68959. 80350fc: f7f1 f9c4 bl 8026488 <TM_RTC_GetDateTime>
  68960. /* Если пришло время синхронизации */
  68961. if ((data.hours == 0) && (fSinhro == 0))
  68962. 8035100: f89d 3005 ldrb.w r3, [sp, #5]
  68963. 8035104: b92b cbnz r3, 8035112 <vTaskPeriodicSynchro+0x32>
  68964. 8035106: 7823 ldrb r3, [r4, #0]
  68965. 8035108: b91b cbnz r3, 8035112 <vTaskPeriodicSynchro+0x32>
  68966. {
  68967. SNTP_Poll();
  68968. 803510a: f7ff ffb7 bl 803507c <SNTP_Poll>
  68969. fSinhro = 1;
  68970. 803510e: 2301 movs r3, #1
  68971. 8035110: 7023 strb r3, [r4, #0]
  68972. //printf("Periodic time sinhro\n\r");
  68973. }
  68974. if (data.hours > 1)
  68975. 8035112: f89d 3005 ldrb.w r3, [sp, #5]
  68976. 8035116: 2b01 cmp r3, #1
  68977. 8035118: d9e6 bls.n 80350e8 <vTaskPeriodicSynchro+0x8>
  68978. fSinhro = 0;
  68979. 803511a: 2300 movs r3, #0
  68980. 803511c: 7023 strb r3, [r4, #0]
  68981. 803511e: e7e3 b.n 80350e8 <vTaskPeriodicSynchro+0x8>
  68982. 8035120: 2000e8e4 .word 0x2000e8e4
  68983. 8035124: 2000e50c .word 0x2000e50c
  68984. 08035128 <vTaskOnceSynchro>:
  68985. /**
  68986. * @brief Синхронизация времени единоразово при включении контроллера
  68987. * @retval
  68988. */
  68989. void vTaskOnceSynchro(void *arg)
  68990. {
  68991. 8035128: b538 push {r3, r4, r5, lr}
  68992. for (;;)
  68993. {
  68994. if (sSettings.sSNTP.sntpEnable)
  68995. 803512a: 4d07 ldr r5, [pc, #28] ; (8035148 <vTaskOnceSynchro+0x20>)
  68996. 803512c: 4c07 ldr r4, [pc, #28] ; (803514c <vTaskOnceSynchro+0x24>)
  68997. 803512e: f895 3344 ldrb.w r3, [r5, #836] ; 0x344
  68998. 8035132: b12b cbz r3, 8035140 <vTaskOnceSynchro+0x18>
  68999. {
  69000. vTaskDelay(7000);
  69001. 8035134: f641 3058 movw r0, #7000 ; 0x1b58
  69002. 8035138: f7f4 fbbc bl 80298b4 <vTaskDelay>
  69003. SNTP_Poll();
  69004. 803513c: f7ff ff9e bl 803507c <SNTP_Poll>
  69005. //printf("Once time sinhro\n\r");
  69006. vTaskDelete(xHandleSntpOnceSinhro);
  69007. }
  69008. else
  69009. vTaskDelete(xHandleSntpOnceSinhro);
  69010. 8035140: 6820 ldr r0, [r4, #0]
  69011. 8035142: f7f4 f9f5 bl 8029530 <vTaskDelete>
  69012. 8035146: e7f2 b.n 803512e <vTaskOnceSynchro+0x6>
  69013. 8035148: 2000e8e4 .word 0x2000e8e4
  69014. 803514c: 200028a0 .word 0x200028a0
  69015. 08035150 <ETH_BSP_Config>:
  69016. * @brief ETH_BSP_Config
  69017. * @param None
  69018. * @retval None
  69019. */
  69020. void ETH_BSP_Config(void)
  69021. {
  69022. 8035150: b570 push {r4, r5, r6, lr}
  69023. {
  69024. volatile uint32_t i;
  69025. GPIO_InitTypeDef GPIO_InitStructure;
  69026. /* Enable GPIOs clocks */
  69027. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB
  69028. 8035152: 2007 movs r0, #7
  69029. * @brief ETH_BSP_Config
  69030. * @param None
  69031. * @retval None
  69032. */
  69033. void ETH_BSP_Config(void)
  69034. {
  69035. 8035154: b0b4 sub sp, #208 ; 0xd0
  69036. {
  69037. volatile uint32_t i;
  69038. GPIO_InitTypeDef GPIO_InitStructure;
  69039. /* Enable GPIOs clocks */
  69040. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB
  69041. 8035156: 2101 movs r1, #1
  69042. 8035158: f7f0 faf8 bl 802574c <RCC_AHB1PeriphClockCmd>
  69043. | RCC_AHB1Periph_GPIOC, ENABLE);
  69044. /* Enable SYSCFG clock */
  69045. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  69046. 803515c: 2101 movs r1, #1
  69047. 803515e: f44f 4080 mov.w r0, #16384 ; 0x4000
  69048. 8035162: f7f0 fb17 bl 8025794 <RCC_APB2PeriphClockCmd>
  69049. /* MII/RMII Media interface selection --------------------------------------*/
  69050. SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
  69051. 8035166: 2001 movs r0, #1
  69052. 8035168: f7f0 fd08 bl 8025b7c <SYSCFG_ETH_MediaInterfaceConfig>
  69053. ETH_RST_PIN -------> PE2 - замена на PE13
  69054. */
  69055. /* Configure PA1,PA2 and PA7 */
  69056. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  69057. 803516c: 2386 movs r3, #134 ; 0x86
  69058. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  69059. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  69060. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  69061. 803516e: 2400 movs r4, #0
  69062. */
  69063. /* Configure PA1,PA2 and PA7 */
  69064. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  69065. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  69066. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  69067. 8035170: 2502 movs r5, #2
  69068. ETH_RST_PIN -------> PE2 - замена на PE13
  69069. */
  69070. /* Configure PA1,PA2 and PA7 */
  69071. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  69072. 8035172: 9303 str r3, [sp, #12]
  69073. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  69074. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  69075. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  69076. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  69077. GPIO_Init(GPIOA, &GPIO_InitStructure);
  69078. 8035174: 4864 ldr r0, [pc, #400] ; (8035308 <ETH_BSP_Config+0x1b8>)
  69079. */
  69080. /* Configure PA1,PA2 and PA7 */
  69081. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  69082. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  69083. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  69084. 8035176: f88d 5010 strb.w r5, [sp, #16]
  69085. */
  69086. /* Configure PA1,PA2 and PA7 */
  69087. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  69088. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  69089. 803517a: 2303 movs r3, #3
  69090. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  69091. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  69092. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  69093. GPIO_Init(GPIOA, &GPIO_InitStructure);
  69094. 803517c: a903 add r1, sp, #12
  69095. */
  69096. /* Configure PA1,PA2 and PA7 */
  69097. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  69098. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  69099. 803517e: f88d 3011 strb.w r3, [sp, #17]
  69100. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  69101. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  69102. 8035182: f88d 4012 strb.w r4, [sp, #18]
  69103. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  69104. 8035186: f88d 4013 strb.w r4, [sp, #19]
  69105. GPIO_Init(GPIOA, &GPIO_InitStructure);
  69106. 803518a: f7f0 f9ff bl 802558c <GPIO_Init>
  69107. GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
  69108. 803518e: 2101 movs r1, #1
  69109. 8035190: 220b movs r2, #11
  69110. 8035192: 485d ldr r0, [pc, #372] ; (8035308 <ETH_BSP_Config+0x1b8>)
  69111. 8035194: f7f0 fa43 bl 802561e <GPIO_PinAFConfig>
  69112. GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
  69113. 8035198: 220b movs r2, #11
  69114. 803519a: 485b ldr r0, [pc, #364] ; (8035308 <ETH_BSP_Config+0x1b8>)
  69115. 803519c: 4629 mov r1, r5
  69116. 803519e: f7f0 fa3e bl 802561e <GPIO_PinAFConfig>
  69117. GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
  69118. 80351a2: 220b movs r2, #11
  69119. 80351a4: 2107 movs r1, #7
  69120. 80351a6: 4858 ldr r0, [pc, #352] ; (8035308 <ETH_BSP_Config+0x1b8>)
  69121. 80351a8: f7f0 fa39 bl 802561e <GPIO_PinAFConfig>
  69122. /* Configure PB10,PB11,PB12 and PB13 */
  69123. GPIO_InitStructure.GPIO_Pin = /* GPIO_Pin_10 | */ GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
  69124. 80351ac: f44f 5360 mov.w r3, #14336 ; 0x3800
  69125. GPIO_Init(GPIOB, &GPIO_InitStructure);
  69126. 80351b0: 4856 ldr r0, [pc, #344] ; (803530c <ETH_BSP_Config+0x1bc>)
  69127. GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
  69128. GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
  69129. GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
  69130. /* Configure PB10,PB11,PB12 and PB13 */
  69131. GPIO_InitStructure.GPIO_Pin = /* GPIO_Pin_10 | */ GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
  69132. 80351b2: 9303 str r3, [sp, #12]
  69133. GPIO_Init(GPIOB, &GPIO_InitStructure);
  69134. 80351b4: a903 add r1, sp, #12
  69135. 80351b6: f7f0 f9e9 bl 802558c <GPIO_Init>
  69136. //GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_ETH);
  69137. GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);
  69138. 80351ba: 210b movs r1, #11
  69139. 80351bc: 460a mov r2, r1
  69140. 80351be: 4853 ldr r0, [pc, #332] ; (803530c <ETH_BSP_Config+0x1bc>)
  69141. 80351c0: f7f0 fa2d bl 802561e <GPIO_PinAFConfig>
  69142. GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);
  69143. 80351c4: 210c movs r1, #12
  69144. 80351c6: 220b movs r2, #11
  69145. 80351c8: 4850 ldr r0, [pc, #320] ; (803530c <ETH_BSP_Config+0x1bc>)
  69146. 80351ca: f7f0 fa28 bl 802561e <GPIO_PinAFConfig>
  69147. GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);
  69148. 80351ce: 220b movs r2, #11
  69149. 80351d0: 210d movs r1, #13
  69150. 80351d2: 484e ldr r0, [pc, #312] ; (803530c <ETH_BSP_Config+0x1bc>)
  69151. 80351d4: f7f0 fa23 bl 802561e <GPIO_PinAFConfig>
  69152. /* Configure PC1, PC4 and PC5 */
  69153. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
  69154. 80351d8: 2332 movs r3, #50 ; 0x32
  69155. GPIO_Init(GPIOC, &GPIO_InitStructure);
  69156. 80351da: 484d ldr r0, [pc, #308] ; (8035310 <ETH_BSP_Config+0x1c0>)
  69157. GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);
  69158. GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);
  69159. GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);
  69160. /* Configure PC1, PC4 and PC5 */
  69161. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
  69162. 80351dc: 9303 str r3, [sp, #12]
  69163. GPIO_Init(GPIOC, &GPIO_InitStructure);
  69164. 80351de: a903 add r1, sp, #12
  69165. 80351e0: f7f0 f9d4 bl 802558c <GPIO_Init>
  69166. GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
  69167. 80351e4: 484a ldr r0, [pc, #296] ; (8035310 <ETH_BSP_Config+0x1c0>)
  69168. 80351e6: 2101 movs r1, #1
  69169. 80351e8: 220b movs r2, #11
  69170. 80351ea: f7f0 fa18 bl 802561e <GPIO_PinAFConfig>
  69171. GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  69172. 80351ee: 4848 ldr r0, [pc, #288] ; (8035310 <ETH_BSP_Config+0x1c0>)
  69173. 80351f0: 2104 movs r1, #4
  69174. 80351f2: 220b movs r2, #11
  69175. 80351f4: f7f0 fa13 bl 802561e <GPIO_PinAFConfig>
  69176. GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
  69177. 80351f8: 220b movs r2, #11
  69178. 80351fa: 4845 ldr r0, [pc, #276] ; (8035310 <ETH_BSP_Config+0x1c0>)
  69179. 80351fc: 2105 movs r1, #5
  69180. 80351fe: f7f0 fa0e bl 802561e <GPIO_PinAFConfig>
  69181. /* Configure the PHY RST pin */
  69182. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  69183. 8035202: f44f 5600 mov.w r6, #8192 ; 0x2000
  69184. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  69185. 8035206: 2301 movs r3, #1
  69186. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  69187. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  69188. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  69189. GPIO_Init(GPIOE, &GPIO_InitStructure);
  69190. 8035208: 4842 ldr r0, [pc, #264] ; (8035314 <ETH_BSP_Config+0x1c4>)
  69191. GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  69192. GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
  69193. /* Configure the PHY RST pin */
  69194. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  69195. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  69196. 803520a: f88d 3010 strb.w r3, [sp, #16]
  69197. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  69198. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  69199. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  69200. GPIO_Init(GPIOE, &GPIO_InitStructure);
  69201. 803520e: a903 add r1, sp, #12
  69202. /* Configure the PHY RST pin */
  69203. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  69204. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  69205. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  69206. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  69207. 8035210: f88d 3013 strb.w r3, [sp, #19]
  69208. GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
  69209. GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  69210. GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
  69211. /* Configure the PHY RST pin */
  69212. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  69213. 8035214: 9603 str r6, [sp, #12]
  69214. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  69215. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  69216. 8035216: f88d 4012 strb.w r4, [sp, #18]
  69217. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  69218. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  69219. 803521a: f88d 5011 strb.w r5, [sp, #17]
  69220. GPIO_Init(GPIOE, &GPIO_InitStructure);
  69221. 803521e: f7f0 f9b5 bl 802558c <GPIO_Init>
  69222. GPIO_ResetBits(GPIOE, GPIO_Pin_13);
  69223. 8035222: 483c ldr r0, [pc, #240] ; (8035314 <ETH_BSP_Config+0x1c4>)
  69224. 8035224: 4631 mov r1, r6
  69225. 8035226: f7f0 f9f8 bl 802561a <GPIO_ResetBits>
  69226. for (i = 0; i < 20000; i++);
  69227. 803522a: 9401 str r4, [sp, #4]
  69228. 803522c: f644 631f movw r3, #19999 ; 0x4e1f
  69229. 8035230: e002 b.n 8035238 <ETH_BSP_Config+0xe8>
  69230. 8035232: 9a01 ldr r2, [sp, #4]
  69231. 8035234: 3201 adds r2, #1
  69232. 8035236: 9201 str r2, [sp, #4]
  69233. 8035238: 9a01 ldr r2, [sp, #4]
  69234. 803523a: 429a cmp r2, r3
  69235. 803523c: d9f9 bls.n 8035232 <ETH_BSP_Config+0xe2>
  69236. GPIO_SetBits(GPIOE, GPIO_Pin_13);
  69237. 803523e: 4835 ldr r0, [pc, #212] ; (8035314 <ETH_BSP_Config+0x1c4>)
  69238. 8035240: f44f 5100 mov.w r1, #8192 ; 0x2000
  69239. 8035244: f7f0 f9e7 bl 8025616 <GPIO_SetBits>
  69240. for (i = 0; i < 20000; i++);
  69241. 8035248: 2300 movs r3, #0
  69242. 803524a: 9301 str r3, [sp, #4]
  69243. 803524c: f644 631f movw r3, #19999 ; 0x4e1f
  69244. 8035250: e002 b.n 8035258 <ETH_BSP_Config+0x108>
  69245. 8035252: 9a01 ldr r2, [sp, #4]
  69246. 8035254: 3201 adds r2, #1
  69247. 8035256: 9201 str r2, [sp, #4]
  69248. 8035258: 9a01 ldr r2, [sp, #4]
  69249. 803525a: 429a cmp r2, r3
  69250. 803525c: d9f9 bls.n 8035252 <ETH_BSP_Config+0x102>
  69251. static void ETH_MACDMA_Config(void)
  69252. {
  69253. ETH_InitTypeDef ETH_InitStructure;
  69254. /* Enable ETHERNET clock */
  69255. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
  69256. 803525e: f04f 6060 mov.w r0, #234881024 ; 0xe000000
  69257. 8035262: 2101 movs r1, #1
  69258. 8035264: f7f0 fa72 bl 802574c <RCC_AHB1PeriphClockCmd>
  69259. RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);
  69260. /* Reset ETHERNET on AHB Bus */
  69261. ETH_DeInit();
  69262. 8035268: f000 f868 bl 803533c <ETH_DeInit>
  69263. /* Software reset */
  69264. ETH_SoftwareReset();
  69265. 803526c: f000 f9fe bl 803566c <ETH_SoftwareReset>
  69266. /* Wait for software reset */
  69267. while (ETH_GetSoftwareResetStatus() == SET);
  69268. 8035270: f000 fa04 bl 803567c <ETH_GetSoftwareResetStatus>
  69269. 8035274: 2801 cmp r0, #1
  69270. 8035276: d0fb beq.n 8035270 <ETH_BSP_Config+0x120>
  69271. /* ETHERNET Configuration --------------------------------------------------*/
  69272. /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
  69273. ETH_StructInit(&ETH_InitStructure);
  69274. 8035278: a805 add r0, sp, #20
  69275. 803527a: f000 f86c bl 8035356 <ETH_StructInit>
  69276. //ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
  69277. // ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
  69278. // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
  69279. ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  69280. ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
  69281. 803527e: f44f 7300 mov.w r3, #512 ; 0x200
  69282. 8035282: 930f str r3, [sp, #60] ; 0x3c
  69283. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  69284. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  69285. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  69286. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  69287. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  69288. 8035284: f04f 7300 mov.w r3, #33554432 ; 0x2000000
  69289. 8035288: 9326 str r3, [sp, #152] ; 0x98
  69290. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  69291. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  69292. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  69293. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  69294. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  69295. 803528a: 932e str r3, [sp, #184] ; 0xb8
  69296. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  69297. 803528c: f44f 3380 mov.w r3, #65536 ; 0x10000
  69298. 8035290: 932f str r3, [sp, #188] ; 0xbc
  69299. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  69300. 8035292: f44f 0380 mov.w r3, #4194304 ; 0x400000
  69301. /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
  69302. ETH_StructInit(&ETH_InitStructure);
  69303. /* Fill ETH_InitStructure parametrs */
  69304. /*------------------------ MAC -----------------------------------*/
  69305. ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  69306. 8035296: 2501 movs r5, #1
  69307. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  69308. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  69309. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  69310. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  69311. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  69312. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  69313. 8035298: f44f 1200 mov.w r2, #2097152 ; 0x200000
  69314. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  69315. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  69316. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  69317. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  69318. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  69319. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  69320. 803529c: 9330 str r3, [sp, #192] ; 0xc0
  69321. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  69322. 803529e: f44f 5300 mov.w r3, #8192 ; 0x2000
  69323. ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  69324. //ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
  69325. // ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
  69326. // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
  69327. ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  69328. 80352a2: 2400 movs r4, #0
  69329. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  69330. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  69331. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  69332. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  69333. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  69334. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  69335. 80352a4: 9228 str r2, [sp, #160] ; 0xa0
  69336. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  69337. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  69338. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  69339. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  69340. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  69341. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  69342. 80352a6: 9331 str r3, [sp, #196] ; 0xc4
  69343. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  69344. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  69345. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  69346. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  69347. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  69348. 80352a8: 2204 movs r2, #4
  69349. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  69350. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  69351. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  69352. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  69353. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  69354. 80352aa: f44f 4380 mov.w r3, #16384 ; 0x4000
  69355. /* Configure Ethernet */
  69356. EthInitStatus = ETH_Init(&ETH_InitStructure, LAN8720_PHY_ADDRESS);
  69357. 80352ae: 4629 mov r1, r5
  69358. 80352b0: a805 add r0, sp, #20
  69359. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  69360. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  69361. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  69362. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  69363. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  69364. 80352b2: 922d str r2, [sp, #180] ; 0xb4
  69365. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  69366. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  69367. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  69368. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  69369. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  69370. 80352b4: 9333 str r3, [sp, #204] ; 0xcc
  69371. /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
  69372. ETH_StructInit(&ETH_InitStructure);
  69373. /* Fill ETH_InitStructure parametrs */
  69374. /*------------------------ MAC -----------------------------------*/
  69375. ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  69376. 80352b6: 9505 str r5, [sp, #20]
  69377. //ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
  69378. // ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
  69379. // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
  69380. ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  69381. 80352b8: 940c str r4, [sp, #48] ; 0x30
  69382. ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
  69383. ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
  69384. 80352ba: 9410 str r4, [sp, #64] ; 0x40
  69385. ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;
  69386. 80352bc: 9413 str r4, [sp, #76] ; 0x4c
  69387. ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;
  69388. 80352be: 9416 str r4, [sp, #88] ; 0x58
  69389. ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
  69390. 80352c0: 9418 str r4, [sp, #96] ; 0x60
  69391. ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
  69392. 80352c2: 9419 str r4, [sp, #100] ; 0x64
  69393. ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
  69394. 80352c4: 941a str r4, [sp, #104] ; 0x68
  69395. /*------------------------ DMA -----------------------------------*/
  69396. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  69397. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  69398. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  69399. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  69400. 80352c6: 9425 str r4, [sp, #148] ; 0x94
  69401. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  69402. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  69403. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  69404. 80352c8: 942a str r4, [sp, #168] ; 0xa8
  69405. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  69406. 80352ca: 942b str r4, [sp, #172] ; 0xac
  69407. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  69408. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  69409. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  69410. /* Configure Ethernet */
  69411. EthInitStatus = ETH_Init(&ETH_InitStructure, LAN8720_PHY_ADDRESS);
  69412. 80352cc: f000 fa80 bl 80357d0 <ETH_Init>
  69413. 80352d0: 4e11 ldr r6, [pc, #68] ; (8035318 <ETH_BSP_Config+0x1c8>)
  69414. /* Enable the Ethernet Rx Interrupt */
  69415. ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE);
  69416. 80352d2: 4629 mov r1, r5
  69417. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  69418. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  69419. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  69420. /* Configure Ethernet */
  69421. EthInitStatus = ETH_Init(&ETH_InitStructure, LAN8720_PHY_ADDRESS);
  69422. 80352d4: 6030 str r0, [r6, #0]
  69423. /* Enable the Ethernet Rx Interrupt */
  69424. ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE);
  69425. 80352d6: 4811 ldr r0, [pc, #68] ; (803531c <ETH_BSP_Config+0x1cc>)
  69426. 80352d8: f000 f9e2 bl 80356a0 <ETH_DMAITConfig>
  69427. void ETH_NVIC_Config(void)
  69428. {
  69429. NVIC_InitTypeDef NVIC_InitStructure;
  69430. /* 2 bit for pre-emption priority, 2 bits for subpriority */
  69431. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  69432. 80352dc: f44f 7040 mov.w r0, #768 ; 0x300
  69433. 80352e0: f7ef ffd4 bl 802528c <NVIC_PriorityGroupConfig>
  69434. /* Enable the Ethernet global Interrupt */
  69435. NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
  69436. 80352e4: 233d movs r3, #61 ; 0x3d
  69437. 80352e6: f88d 3008 strb.w r3, [sp, #8]
  69438. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
  69439. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  69440. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  69441. NVIC_Init(&NVIC_InitStructure);
  69442. 80352ea: a802 add r0, sp, #8
  69443. /* 2 bit for pre-emption priority, 2 bits for subpriority */
  69444. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  69445. /* Enable the Ethernet global Interrupt */
  69446. NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
  69447. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
  69448. 80352ec: 2305 movs r3, #5
  69449. 80352ee: f88d 3009 strb.w r3, [sp, #9]
  69450. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  69451. 80352f2: f88d 400a strb.w r4, [sp, #10]
  69452. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  69453. 80352f6: f88d 500b strb.w r5, [sp, #11]
  69454. NVIC_Init(&NVIC_InitStructure);
  69455. 80352fa: f7ef ffd1 bl 80252a0 <NVIC_Init>
  69456. ETH_MACDMA_Config();
  69457. /* Config NVIC for Ethernet */
  69458. ETH_NVIC_Config();
  69459. if (EthInitStatus == 0) {
  69460. 80352fe: 6833 ldr r3, [r6, #0]
  69461. 8035300: b903 cbnz r3, 8035304 <ETH_BSP_Config+0x1b4>
  69462. 8035302: e7fe b.n 8035302 <ETH_BSP_Config+0x1b2>
  69463. // LCD_DisplayStringLine(Line5, (uint8_t*)" Ethernet Init ");
  69464. // LCD_DisplayStringLine(Line6, (uint8_t*)" failed ");
  69465. // STM_EVAL_LEDOn(LED5);
  69466. while(1);
  69467. }
  69468. }
  69469. 8035304: b034 add sp, #208 ; 0xd0
  69470. 8035306: bd70 pop {r4, r5, r6, pc}
  69471. 8035308: 40020000 .word 0x40020000
  69472. 803530c: 40020400 .word 0x40020400
  69473. 8035310: 40020800 .word 0x40020800
  69474. 8035314: 40021000 .word 0x40021000
  69475. 8035318: 2000e510 .word 0x2000e510
  69476. 803531c: 00010040 .word 0x00010040
  69477. 08035320 <ETH_Delay>:
  69478. * @brief Inserts a delay time.
  69479. * @param nCount: specifies the delay time length.
  69480. * @retval None
  69481. */
  69482. static void ETH_Delay(__IO uint32_t nCount)
  69483. {
  69484. 8035320: b084 sub sp, #16
  69485. __IO uint32_t index = 0;
  69486. 8035322: 2300 movs r3, #0
  69487. * @brief Inserts a delay time.
  69488. * @param nCount: specifies the delay time length.
  69489. * @retval None
  69490. */
  69491. static void ETH_Delay(__IO uint32_t nCount)
  69492. {
  69493. 8035324: 9001 str r0, [sp, #4]
  69494. __IO uint32_t index = 0;
  69495. 8035326: 9303 str r3, [sp, #12]
  69496. for(index = nCount; index != 0; index--)
  69497. 8035328: 9b01 ldr r3, [sp, #4]
  69498. 803532a: e001 b.n 8035330 <ETH_Delay+0x10>
  69499. 803532c: 9b03 ldr r3, [sp, #12]
  69500. 803532e: 3b01 subs r3, #1
  69501. 8035330: 9303 str r3, [sp, #12]
  69502. 8035332: 9b03 ldr r3, [sp, #12]
  69503. 8035334: 2b00 cmp r3, #0
  69504. 8035336: d1f9 bne.n 803532c <ETH_Delay+0xc>
  69505. {
  69506. }
  69507. }
  69508. 8035338: b004 add sp, #16
  69509. 803533a: 4770 bx lr
  69510. 0803533c <ETH_DeInit>:
  69511. * @brief Deinitializes the ETHERNET peripheral registers to their default reset values.
  69512. * @param None
  69513. * @retval None
  69514. */
  69515. void ETH_DeInit(void)
  69516. {
  69517. 803533c: b508 push {r3, lr}
  69518. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE);
  69519. 803533e: 2101 movs r1, #1
  69520. 8035340: f04f 7000 mov.w r0, #33554432 ; 0x2000000
  69521. 8035344: f7f0 fa32 bl 80257ac <RCC_AHB1PeriphResetCmd>
  69522. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE);
  69523. 8035348: f04f 7000 mov.w r0, #33554432 ; 0x2000000
  69524. 803534c: 2100 movs r1, #0
  69525. }
  69526. 803534e: e8bd 4008 ldmia.w sp!, {r3, lr}
  69527. * @retval None
  69528. */
  69529. void ETH_DeInit(void)
  69530. {
  69531. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE);
  69532. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE);
  69533. 8035352: f7f0 ba2b b.w 80257ac <RCC_AHB1PeriphResetCmd>
  69534. 08035356 <ETH_StructInit>:
  69535. /* Ethernet interframe gap set to 96 bits */
  69536. ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit;
  69537. /* Carrier Sense Enabled in Half-Duplex mode */
  69538. ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable;
  69539. /* PHY speed configured to 100Mbit/s */
  69540. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  69541. 8035356: f44f 4280 mov.w r2, #16384 ; 0x4000
  69542. 803535a: 6142 str r2, [r0, #20]
  69543. /* Receive own Frames in Half-Duplex mode enabled */
  69544. ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable;
  69545. /* MAC MII loopback disabled */
  69546. ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  69547. /* Full-Duplex mode selected */
  69548. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  69549. 803535c: f44f 6200 mov.w r2, #2048 ; 0x800
  69550. 8035360: 6202 str r2, [r0, #32]
  69551. /* Receive all frames disabled */
  69552. ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable;
  69553. /* Source address filtering (on the optional MAC addresses) disabled */
  69554. ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable;
  69555. /* Do not forward control frames that do not pass the address filtering */
  69556. ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll;
  69557. 8035362: 2240 movs r2, #64 ; 0x40
  69558. 8035364: 6402 str r2, [r0, #64] ; 0x40
  69559. /* Disable reception of Broadcast frames */
  69560. ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;
  69561. 8035366: 2220 movs r2, #32
  69562. 8035368: 6442 str r2, [r0, #68] ; 0x44
  69563. /* Initialize hash table high and low regs */
  69564. ETH_InitStruct->ETH_HashTableHigh = 0x0;
  69565. ETH_InitStruct->ETH_HashTableLow = 0x0;
  69566. /* Flow control config (flow control disabled)*/
  69567. ETH_InitStruct->ETH_PauseTime = 0x0;
  69568. ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable;
  69569. 803536a: 2280 movs r2, #128 ; 0x80
  69570. {
  69571. /* ETH_InitStruct members default value */
  69572. /*------------------------ MAC Configuration ---------------------------*/
  69573. /* PHY Auto-negotiation enabled */
  69574. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  69575. 803536c: 2301 movs r3, #1
  69576. /* Initialize hash table high and low regs */
  69577. ETH_InitStruct->ETH_HashTableHigh = 0x0;
  69578. ETH_InitStruct->ETH_HashTableLow = 0x0;
  69579. /* Flow control config (flow control disabled)*/
  69580. ETH_InitStruct->ETH_PauseTime = 0x0;
  69581. ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable;
  69582. 803536e: 6642 str r2, [r0, #100] ; 0x64
  69583. ETH_InitStruct->ETH_VLANTagIdentifier = 0x0;
  69584. /*---------------------- DMA Configuration -------------------------------*/
  69585. /* Drops frames with with TCP/IP checksum errors */
  69586. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  69587. 8035370: f04f 6280 mov.w r2, #67108864 ; 0x4000000
  69588. {
  69589. /* ETH_InitStruct members default value */
  69590. /*------------------------ MAC Configuration ---------------------------*/
  69591. /* PHY Auto-negotiation enabled */
  69592. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  69593. 8035374: 6003 str r3, [r0, #0]
  69594. ETH_InitStruct->ETH_VLANTagIdentifier = 0x0;
  69595. /*---------------------- DMA Configuration -------------------------------*/
  69596. /* Drops frames with with TCP/IP checksum errors */
  69597. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  69598. 8035376: f8c0 2080 str.w r2, [r0, #128] ; 0x80
  69599. /*------------------------ MAC Configuration ---------------------------*/
  69600. /* PHY Auto-negotiation enabled */
  69601. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  69602. /* MAC watchdog enabled: cuts-off long frame */
  69603. ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable;
  69604. 803537a: 2300 movs r3, #0
  69605. /*---------------------- DMA Configuration -------------------------------*/
  69606. /* Drops frames with with TCP/IP checksum errors */
  69607. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  69608. /* Store and forward mode enabled for receive */
  69609. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  69610. 803537c: f04f 7200 mov.w r2, #33554432 ; 0x2000000
  69611. /*------------------------ MAC Configuration ---------------------------*/
  69612. /* PHY Auto-negotiation enabled */
  69613. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  69614. /* MAC watchdog enabled: cuts-off long frame */
  69615. ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable;
  69616. 8035380: 6043 str r3, [r0, #4]
  69617. /* MAC Jabber enabled in Half-duplex mode */
  69618. ETH_InitStruct->ETH_Jabber = ETH_Jabber_Enable;
  69619. 8035382: 6083 str r3, [r0, #8]
  69620. /* Ethernet interframe gap set to 96 bits */
  69621. ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit;
  69622. 8035384: 60c3 str r3, [r0, #12]
  69623. /* Carrier Sense Enabled in Half-Duplex mode */
  69624. ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable;
  69625. 8035386: 6103 str r3, [r0, #16]
  69626. /* PHY speed configured to 100Mbit/s */
  69627. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  69628. /* Receive own Frames in Half-Duplex mode enabled */
  69629. ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable;
  69630. 8035388: 6183 str r3, [r0, #24]
  69631. /* MAC MII loopback disabled */
  69632. ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  69633. 803538a: 61c3 str r3, [r0, #28]
  69634. /* Full-Duplex mode selected */
  69635. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  69636. /* IPv4 and TCP/UDP/ICMP frame Checksum Offload disabled */
  69637. ETH_InitStruct->ETH_ChecksumOffload = ETH_ChecksumOffload_Disable;
  69638. 803538c: 6243 str r3, [r0, #36] ; 0x24
  69639. /* Retry Transmission enabled for half-duplex mode */
  69640. ETH_InitStruct->ETH_RetryTransmission = ETH_RetryTransmission_Enable;
  69641. 803538e: 6283 str r3, [r0, #40] ; 0x28
  69642. /* Automatic PAD/CRC strip disabled*/
  69643. ETH_InitStruct->ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
  69644. 8035390: 62c3 str r3, [r0, #44] ; 0x2c
  69645. /* half-duplex mode retransmission Backoff time_limit = 10 slot times*/
  69646. ETH_InitStruct->ETH_BackOffLimit = ETH_BackOffLimit_10;
  69647. 8035392: 6303 str r3, [r0, #48] ; 0x30
  69648. /* half-duplex mode Deferral check disabled */
  69649. ETH_InitStruct->ETH_DeferralCheck = ETH_DeferralCheck_Disable;
  69650. 8035394: 6343 str r3, [r0, #52] ; 0x34
  69651. /* Receive all frames disabled */
  69652. ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable;
  69653. 8035396: 6383 str r3, [r0, #56] ; 0x38
  69654. /* Source address filtering (on the optional MAC addresses) disabled */
  69655. ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable;
  69656. 8035398: 63c3 str r3, [r0, #60] ; 0x3c
  69657. /* Do not forward control frames that do not pass the address filtering */
  69658. ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll;
  69659. /* Disable reception of Broadcast frames */
  69660. ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;
  69661. /* Normal Destination address filtering (not reverse addressing) */
  69662. ETH_InitStruct->ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal;
  69663. 803539a: 6483 str r3, [r0, #72] ; 0x48
  69664. /* Promiscuous address filtering mode disabled */
  69665. ETH_InitStruct->ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
  69666. 803539c: 64c3 str r3, [r0, #76] ; 0x4c
  69667. /* Perfect address filtering for multicast addresses */
  69668. ETH_InitStruct->ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
  69669. 803539e: 6503 str r3, [r0, #80] ; 0x50
  69670. /* Perfect address filtering for unicast addresses */
  69671. ETH_InitStruct->ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
  69672. 80353a0: 6543 str r3, [r0, #84] ; 0x54
  69673. /* Initialize hash table high and low regs */
  69674. ETH_InitStruct->ETH_HashTableHigh = 0x0;
  69675. 80353a2: 6583 str r3, [r0, #88] ; 0x58
  69676. ETH_InitStruct->ETH_HashTableLow = 0x0;
  69677. 80353a4: 65c3 str r3, [r0, #92] ; 0x5c
  69678. /* Flow control config (flow control disabled)*/
  69679. ETH_InitStruct->ETH_PauseTime = 0x0;
  69680. 80353a6: 6603 str r3, [r0, #96] ; 0x60
  69681. ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable;
  69682. ETH_InitStruct->ETH_PauseLowThreshold = ETH_PauseLowThreshold_Minus4;
  69683. 80353a8: 6683 str r3, [r0, #104] ; 0x68
  69684. ETH_InitStruct->ETH_UnicastPauseFrameDetect = ETH_UnicastPauseFrameDetect_Disable;
  69685. 80353aa: 66c3 str r3, [r0, #108] ; 0x6c
  69686. ETH_InitStruct->ETH_ReceiveFlowControl = ETH_ReceiveFlowControl_Disable;
  69687. 80353ac: 6703 str r3, [r0, #112] ; 0x70
  69688. ETH_InitStruct->ETH_TransmitFlowControl = ETH_TransmitFlowControl_Disable;
  69689. 80353ae: 6743 str r3, [r0, #116] ; 0x74
  69690. /* VLANtag config (VLAN field not checked) */
  69691. ETH_InitStruct->ETH_VLANTagComparison = ETH_VLANTagComparison_16Bit;
  69692. 80353b0: 6783 str r3, [r0, #120] ; 0x78
  69693. ETH_InitStruct->ETH_VLANTagIdentifier = 0x0;
  69694. 80353b2: 67c3 str r3, [r0, #124] ; 0x7c
  69695. /*---------------------- DMA Configuration -------------------------------*/
  69696. /* Drops frames with with TCP/IP checksum errors */
  69697. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  69698. /* Store and forward mode enabled for receive */
  69699. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  69700. 80353b4: f8c0 2084 str.w r2, [r0, #132] ; 0x84
  69701. ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes;
  69702. /* Disable Operate on second frame (transmit a second frame to FIFO without
  69703. waiting status of previous frame*/
  69704. ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable;
  69705. /* DMA works on 32-bit aligned start source and destinations addresses */
  69706. ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  69707. 80353b8: f8c0 20a4 str.w r2, [r0, #164] ; 0xa4
  69708. /* Enabled Fixed Burst Mode (mix of INC4, INC8, INC16 and SINGLE DMA transactions */
  69709. ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Enable;
  69710. 80353bc: f44f 3280 mov.w r2, #65536 ; 0x10000
  69711. 80353c0: f8c0 20a8 str.w r2, [r0, #168] ; 0xa8
  69712. /* DMA transfer max burst length = 32 beats = 32 x 32bits */
  69713. ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  69714. 80353c4: f44f 0280 mov.w r2, #4194304 ; 0x400000
  69715. /* Store and forward mode enabled for receive */
  69716. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  69717. /* Flush received frame that created FIFO overflow */
  69718. ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Enable;
  69719. /* Store and forward mode enabled for transmit */
  69720. ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  69721. 80353c8: f44f 1100 mov.w r1, #2097152 ; 0x200000
  69722. /* DMA works on 32-bit aligned start source and destinations addresses */
  69723. ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  69724. /* Enabled Fixed Burst Mode (mix of INC4, INC8, INC16 and SINGLE DMA transactions */
  69725. ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Enable;
  69726. /* DMA transfer max burst length = 32 beats = 32 x 32bits */
  69727. ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  69728. 80353cc: f8c0 20ac str.w r2, [r0, #172] ; 0xac
  69729. ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  69730. 80353d0: f44f 5200 mov.w r2, #8192 ; 0x2000
  69731. /* Drops frames with with TCP/IP checksum errors */
  69732. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  69733. /* Store and forward mode enabled for receive */
  69734. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  69735. /* Flush received frame that created FIFO overflow */
  69736. ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Enable;
  69737. 80353d4: f8c0 3088 str.w r3, [r0, #136] ; 0x88
  69738. /* Store and forward mode enabled for transmit */
  69739. ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  69740. 80353d8: f8c0 108c str.w r1, [r0, #140] ; 0x8c
  69741. /* Threshold TXFIFO level set to 64 bytes (used when threshold mode is enabled) */
  69742. ETH_InitStruct->ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes;
  69743. 80353dc: f8c0 3090 str.w r3, [r0, #144] ; 0x90
  69744. /* Disable forwarding frames with errors (short frames, CRC,...)*/
  69745. ETH_InitStruct->ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  69746. 80353e0: f8c0 3094 str.w r3, [r0, #148] ; 0x94
  69747. /* Disable undersized good frames */
  69748. ETH_InitStruct->ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  69749. 80353e4: f8c0 3098 str.w r3, [r0, #152] ; 0x98
  69750. /* Threshold RXFIFO level set to 64 bytes (used when Cut-through mode is enabled) */
  69751. ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes;
  69752. 80353e8: f8c0 309c str.w r3, [r0, #156] ; 0x9c
  69753. /* Disable Operate on second frame (transmit a second frame to FIFO without
  69754. waiting status of previous frame*/
  69755. ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable;
  69756. 80353ec: f8c0 30a0 str.w r3, [r0, #160] ; 0xa0
  69757. ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  69758. /* Enabled Fixed Burst Mode (mix of INC4, INC8, INC16 and SINGLE DMA transactions */
  69759. ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Enable;
  69760. /* DMA transfer max burst length = 32 beats = 32 x 32bits */
  69761. ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  69762. ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  69763. 80353f0: f8c0 20b0 str.w r2, [r0, #176] ; 0xb0
  69764. /* DMA Ring mode skip length = 0 */
  69765. ETH_InitStruct->ETH_DescriptorSkipLength = 0x0;
  69766. 80353f4: f8c0 30b4 str.w r3, [r0, #180] ; 0xb4
  69767. /* Equal priority (round-robin) between transmit and receive DMA engines */
  69768. ETH_InitStruct->ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_1_1;
  69769. 80353f8: f8c0 30b8 str.w r3, [r0, #184] ; 0xb8
  69770. 80353fc: 4770 bx lr
  69771. 80353fe: 0000 movs r0, r0
  69772. 08035400 <ETH_MACTransmissionCmd>:
  69773. * @param NewState: new state of the MAC transmission.
  69774. * This parameter can be: ENABLE or DISABLE.
  69775. * @retval None
  69776. */
  69777. void ETH_MACTransmissionCmd(FunctionalState NewState)
  69778. {
  69779. 8035400: 4b04 ldr r3, [pc, #16] ; (8035414 <ETH_MACTransmissionCmd+0x14>)
  69780. assert_param(IS_FUNCTIONAL_STATE(NewState));
  69781. if (NewState != DISABLE)
  69782. {
  69783. /* Enable the MAC transmission */
  69784. ETH->MACCR |= ETH_MACCR_TE;
  69785. 8035402: 681a ldr r2, [r3, #0]
  69786. void ETH_MACTransmissionCmd(FunctionalState NewState)
  69787. {
  69788. /* Check the parameters */
  69789. assert_param(IS_FUNCTIONAL_STATE(NewState));
  69790. if (NewState != DISABLE)
  69791. 8035404: b110 cbz r0, 803540c <ETH_MACTransmissionCmd+0xc>
  69792. {
  69793. /* Enable the MAC transmission */
  69794. ETH->MACCR |= ETH_MACCR_TE;
  69795. 8035406: f042 0208 orr.w r2, r2, #8
  69796. 803540a: e001 b.n 8035410 <ETH_MACTransmissionCmd+0x10>
  69797. }
  69798. else
  69799. {
  69800. /* Disable the MAC transmission */
  69801. ETH->MACCR &= ~ETH_MACCR_TE;
  69802. 803540c: f022 0208 bic.w r2, r2, #8
  69803. 8035410: 601a str r2, [r3, #0]
  69804. 8035412: 4770 bx lr
  69805. 8035414: 40028000 .word 0x40028000
  69806. 08035418 <ETH_MACReceptionCmd>:
  69807. * @param NewState: new state of the MAC reception.
  69808. * This parameter can be: ENABLE or DISABLE.
  69809. * @retval None
  69810. */
  69811. void ETH_MACReceptionCmd(FunctionalState NewState)
  69812. {
  69813. 8035418: 4b04 ldr r3, [pc, #16] ; (803542c <ETH_MACReceptionCmd+0x14>)
  69814. assert_param(IS_FUNCTIONAL_STATE(NewState));
  69815. if (NewState != DISABLE)
  69816. {
  69817. /* Enable the MAC reception */
  69818. ETH->MACCR |= ETH_MACCR_RE;
  69819. 803541a: 681a ldr r2, [r3, #0]
  69820. void ETH_MACReceptionCmd(FunctionalState NewState)
  69821. {
  69822. /* Check the parameters */
  69823. assert_param(IS_FUNCTIONAL_STATE(NewState));
  69824. if (NewState != DISABLE)
  69825. 803541c: b110 cbz r0, 8035424 <ETH_MACReceptionCmd+0xc>
  69826. {
  69827. /* Enable the MAC reception */
  69828. ETH->MACCR |= ETH_MACCR_RE;
  69829. 803541e: f042 0204 orr.w r2, r2, #4
  69830. 8035422: e001 b.n 8035428 <ETH_MACReceptionCmd+0x10>
  69831. }
  69832. else
  69833. {
  69834. /* Disable the MAC reception */
  69835. ETH->MACCR &= ~ETH_MACCR_RE;
  69836. 8035424: f022 0204 bic.w r2, r2, #4
  69837. 8035428: 601a str r2, [r3, #0]
  69838. 803542a: 4770 bx lr
  69839. 803542c: 40028000 .word 0x40028000
  69840. 08035430 <ETH_MACAddressConfig>:
  69841. uint32_t tmpreg;
  69842. /* Check the parameters */
  69843. assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr));
  69844. /* Calculate the selected MAC address high register */
  69845. tmpreg = ((uint32_t)Addr[5] << 8) | (uint32_t)Addr[4];
  69846. 8035430: 790b ldrb r3, [r1, #4]
  69847. 8035432: 794a ldrb r2, [r1, #5]
  69848. 8035434: ea43 2202 orr.w r2, r3, r2, lsl #8
  69849. /* Load the selected MAC address high register */
  69850. (*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr)) = tmpreg;
  69851. 8035438: 4b07 ldr r3, [pc, #28] ; (8035458 <ETH_MACAddressConfig+0x28>)
  69852. 803543a: 50c2 str r2, [r0, r3]
  69853. /* Calculate the selected MAC address low register */
  69854. tmpreg = ((uint32_t)Addr[3] << 24) | ((uint32_t)Addr[2] << 16) | ((uint32_t)Addr[1] << 8) | Addr[0];
  69855. 803543c: 788a ldrb r2, [r1, #2]
  69856. 803543e: 78cb ldrb r3, [r1, #3]
  69857. 8035440: 0412 lsls r2, r2, #16
  69858. 8035442: ea42 6203 orr.w r2, r2, r3, lsl #24
  69859. 8035446: 780b ldrb r3, [r1, #0]
  69860. 8035448: 431a orrs r2, r3
  69861. 803544a: 784b ldrb r3, [r1, #1]
  69862. 803544c: ea42 2203 orr.w r2, r2, r3, lsl #8
  69863. /* Load the selected MAC address low register */
  69864. (*(__IO uint32_t *) (ETH_MAC_ADDR_LBASE + MacAddr)) = tmpreg;
  69865. 8035450: 4b02 ldr r3, [pc, #8] ; (803545c <ETH_MACAddressConfig+0x2c>)
  69866. 8035452: 50c2 str r2, [r0, r3]
  69867. 8035454: 4770 bx lr
  69868. 8035456: bf00 nop
  69869. 8035458: 40028040 .word 0x40028040
  69870. 803545c: 40028044 .word 0x40028044
  69871. 08035460 <ETH_Get_Received_Frame_interrupt>:
  69872. * the receive frame (should be used with interrupt mode only)
  69873. * @param None
  69874. * @retval Structure of type FrameTypeDef
  69875. */
  69876. FrameTypeDef ETH_Get_Received_Frame_interrupt(void)
  69877. {
  69878. 8035460: b537 push {r0, r1, r2, r4, r5, lr}
  69879. FrameTypeDef frame={0,0,0};
  69880. __IO uint32_t descriptor_scan_counter = 0;
  69881. 8035462: 2300 movs r3, #0
  69882. 8035464: 9301 str r3, [sp, #4]
  69883. /* check if first segment in frame */
  69884. if(((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&&
  69885. ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET))
  69886. {
  69887. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  69888. 8035466: 4b24 ldr r3, [pc, #144] ; (80354f8 <ETH_Get_Received_Frame_interrupt+0x98>)
  69889. 8035468: 681a ldr r2, [r3, #0]
  69890. 803546a: 4b24 ldr r3, [pc, #144] ; (80354fc <ETH_Get_Received_Frame_interrupt+0x9c>)
  69891. DMA_RX_FRAME_infos->Seg_Count = 1;
  69892. 803546c: 2401 movs r4, #1
  69893. 803546e: 681b ldr r3, [r3, #0]
  69894. {
  69895. FrameTypeDef frame={0,0,0};
  69896. __IO uint32_t descriptor_scan_counter = 0;
  69897. /* scan descriptors owned by CPU */
  69898. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  69899. 8035470: e033 b.n 80354da <ETH_Get_Received_Frame_interrupt+0x7a>
  69900. (descriptor_scan_counter<ETH_RXBUFNB))
  69901. {
  69902. /* Just by security */
  69903. descriptor_scan_counter++;
  69904. 8035472: 9901 ldr r1, [sp, #4]
  69905. 8035474: 3101 adds r1, #1
  69906. 8035476: 9101 str r1, [sp, #4]
  69907. /* check if first segment in frame */
  69908. if(((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&&
  69909. 8035478: 6819 ldr r1, [r3, #0]
  69910. 803547a: 0589 lsls r1, r1, #22
  69911. 803547c: d505 bpl.n 803548a <ETH_Get_Received_Frame_interrupt+0x2a>
  69912. ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET))
  69913. 803547e: 6819 ldr r1, [r3, #0]
  69914. /* Just by security */
  69915. descriptor_scan_counter++;
  69916. /* check if first segment in frame */
  69917. if(((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&&
  69918. 8035480: 05c9 lsls r1, r1, #23
  69919. 8035482: d402 bmi.n 803548a <ETH_Get_Received_Frame_interrupt+0x2a>
  69920. ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET))
  69921. {
  69922. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  69923. 8035484: 6013 str r3, [r2, #0]
  69924. DMA_RX_FRAME_infos->Seg_Count = 1;
  69925. 8035486: 6094 str r4, [r2, #8]
  69926. 8035488: e009 b.n 803549e <ETH_Get_Received_Frame_interrupt+0x3e>
  69927. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  69928. }
  69929. /* check if intermediate segment */
  69930. else if (((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET)&&
  69931. 803548a: 6819 ldr r1, [r3, #0]
  69932. 803548c: 05c9 lsls r1, r1, #23
  69933. 803548e: d408 bmi.n 80354a2 <ETH_Get_Received_Frame_interrupt+0x42>
  69934. ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) == (uint32_t)RESET))
  69935. 8035490: 6819 ldr r1, [r3, #0]
  69936. DMA_RX_FRAME_infos->Seg_Count = 1;
  69937. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  69938. }
  69939. /* check if intermediate segment */
  69940. else if (((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET)&&
  69941. 8035492: 0589 lsls r1, r1, #22
  69942. 8035494: d500 bpl.n 8035498 <ETH_Get_Received_Frame_interrupt+0x38>
  69943. 8035496: e004 b.n 80354a2 <ETH_Get_Received_Frame_interrupt+0x42>
  69944. ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) == (uint32_t)RESET))
  69945. {
  69946. (DMA_RX_FRAME_infos->Seg_Count) ++;
  69947. 8035498: 6891 ldr r1, [r2, #8]
  69948. 803549a: 3101 adds r1, #1
  69949. 803549c: 6091 str r1, [r2, #8]
  69950. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  69951. 803549e: 68db ldr r3, [r3, #12]
  69952. 80354a0: e01b b.n 80354da <ETH_Get_Received_Frame_interrupt+0x7a>
  69953. 80354a2: 4a16 ldr r2, [pc, #88] ; (80354fc <ETH_Get_Received_Frame_interrupt+0x9c>)
  69954. 80354a4: 6013 str r3, [r2, #0]
  69955. /* should be last segment */
  69956. else
  69957. {
  69958. /* last segment */
  69959. DMA_RX_FRAME_infos->LS_Rx_Desc = DMARxDescToGet;
  69960. 80354a6: 4a14 ldr r2, [pc, #80] ; (80354f8 <ETH_Get_Received_Frame_interrupt+0x98>)
  69961. 80354a8: 6812 ldr r2, [r2, #0]
  69962. 80354aa: 6053 str r3, [r2, #4]
  69963. (DMA_RX_FRAME_infos->Seg_Count)++;
  69964. 80354ac: 6891 ldr r1, [r2, #8]
  69965. 80354ae: 3101 adds r1, #1
  69966. 80354b0: 6091 str r1, [r2, #8]
  69967. /* first segment is last segment */
  69968. if ((DMA_RX_FRAME_infos->Seg_Count)==1)
  69969. 80354b2: 6891 ldr r1, [r2, #8]
  69970. 80354b4: 2901 cmp r1, #1
  69971. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  69972. 80354b6: bf08 it eq
  69973. 80354b8: 6013 streq r3, [r2, #0]
  69974. /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
  69975. frame.length = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4;
  69976. 80354ba: 6819 ldr r1, [r3, #0]
  69977. /* Get the address of the buffer start address */
  69978. /* Check if more than one segment in the frame */
  69979. if (DMA_RX_FRAME_infos->Seg_Count >1)
  69980. 80354bc: 6894 ldr r4, [r2, #8]
  69981. /* first segment is last segment */
  69982. if ((DMA_RX_FRAME_infos->Seg_Count)==1)
  69983. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  69984. /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
  69985. frame.length = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4;
  69986. 80354be: f3c1 410d ubfx r1, r1, #16, #14
  69987. 80354c2: 3904 subs r1, #4
  69988. /* Get the address of the buffer start address */
  69989. /* Check if more than one segment in the frame */
  69990. if (DMA_RX_FRAME_infos->Seg_Count >1)
  69991. 80354c4: 2c01 cmp r4, #1
  69992. {
  69993. frame.buffer =(DMA_RX_FRAME_infos->FS_Rx_Desc)->Buffer1Addr;
  69994. 80354c6: bf8a itet hi
  69995. 80354c8: 6812 ldrhi r2, [r2, #0]
  69996. }
  69997. else
  69998. {
  69999. frame.buffer = DMARxDescToGet->Buffer1Addr;
  70000. 80354ca: 689a ldrls r2, [r3, #8]
  70001. /* Get the address of the buffer start address */
  70002. /* Check if more than one segment in the frame */
  70003. if (DMA_RX_FRAME_infos->Seg_Count >1)
  70004. {
  70005. frame.buffer =(DMA_RX_FRAME_infos->FS_Rx_Desc)->Buffer1Addr;
  70006. 80354cc: 6892 ldrhi r2, [r2, #8]
  70007. }
  70008. frame.descriptor = DMARxDescToGet;
  70009. /* Update the ETHERNET DMA global Rx descriptor with next Rx descriptor */
  70010. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  70011. 80354ce: 4c0b ldr r4, [pc, #44] ; (80354fc <ETH_Get_Received_Frame_interrupt+0x9c>)
  70012. 80354d0: 68dd ldr r5, [r3, #12]
  70013. /* Return Frame */
  70014. return (frame);
  70015. 80354d2: e880 0006 stmia.w r0, {r1, r2}
  70016. }
  70017. frame.descriptor = DMARxDescToGet;
  70018. /* Update the ETHERNET DMA global Rx descriptor with next Rx descriptor */
  70019. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  70020. 80354d6: 6025 str r5, [r4, #0]
  70021. 80354d8: e007 b.n 80354ea <ETH_Get_Received_Frame_interrupt+0x8a>
  70022. {
  70023. FrameTypeDef frame={0,0,0};
  70024. __IO uint32_t descriptor_scan_counter = 0;
  70025. /* scan descriptors owned by CPU */
  70026. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  70027. 80354da: 6819 ldr r1, [r3, #0]
  70028. 80354dc: 2900 cmp r1, #0
  70029. 80354de: da06 bge.n 80354ee <ETH_Get_Received_Frame_interrupt+0x8e>
  70030. 80354e0: 4a06 ldr r2, [pc, #24] ; (80354fc <ETH_Get_Received_Frame_interrupt+0x9c>)
  70031. 80354e2: 6013 str r3, [r2, #0]
  70032. /* Return Frame */
  70033. return (frame);
  70034. }
  70035. }
  70036. return (frame);
  70037. 80354e4: 2300 movs r3, #0
  70038. 80354e6: 6003 str r3, [r0, #0]
  70039. 80354e8: 6043 str r3, [r0, #4]
  70040. 80354ea: 6083 str r3, [r0, #8]
  70041. 80354ec: e003 b.n 80354f6 <ETH_Get_Received_Frame_interrupt+0x96>
  70042. FrameTypeDef frame={0,0,0};
  70043. __IO uint32_t descriptor_scan_counter = 0;
  70044. /* scan descriptors owned by CPU */
  70045. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  70046. (descriptor_scan_counter<ETH_RXBUFNB))
  70047. 80354ee: 9901 ldr r1, [sp, #4]
  70048. {
  70049. FrameTypeDef frame={0,0,0};
  70050. __IO uint32_t descriptor_scan_counter = 0;
  70051. /* scan descriptors owned by CPU */
  70052. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  70053. 80354f0: 2904 cmp r1, #4
  70054. 80354f2: d9be bls.n 8035472 <ETH_Get_Received_Frame_interrupt+0x12>
  70055. 80354f4: e7f4 b.n 80354e0 <ETH_Get_Received_Frame_interrupt+0x80>
  70056. /* Return Frame */
  70057. return (frame);
  70058. }
  70059. }
  70060. return (frame);
  70061. }
  70062. 80354f6: bd3e pop {r1, r2, r3, r4, r5, pc}
  70063. 80354f8: 200132d0 .word 0x200132d0
  70064. 80354fc: 20011460 .word 0x20011460
  70065. 08035500 <ETH_Prepare_Transmit_Descriptors>:
  70066. {
  70067. uint32_t buf_count =0, size=0,i=0;
  70068. __IO ETH_DMADESCTypeDef *DMATxNextDesc;
  70069. /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  70070. if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
  70071. 8035500: 4b29 ldr r3, [pc, #164] ; (80355a8 <ETH_Prepare_Transmit_Descriptors+0xa8>)
  70072. 8035502: 681b ldr r3, [r3, #0]
  70073. 8035504: 681a ldr r2, [r3, #0]
  70074. 8035506: 2a00 cmp r2, #0
  70075. * @brief Prepares DMA Tx descriptors to transmit an ethernet frame
  70076. * @param FrameLength : length of the frame to send
  70077. * @retval error status
  70078. */
  70079. uint32_t ETH_Prepare_Transmit_Descriptors(u16 FrameLength)
  70080. {
  70081. 8035508: b5f0 push {r4, r5, r6, r7, lr}
  70082. uint32_t buf_count =0, size=0,i=0;
  70083. __IO ETH_DMADESCTypeDef *DMATxNextDesc;
  70084. /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  70085. if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
  70086. 803550a: db48 blt.n 803559e <ETH_Prepare_Transmit_Descriptors+0x9e>
  70087. return ETH_ERROR;
  70088. }
  70089. DMATxNextDesc = DMATxDescToSet;
  70090. if (FrameLength > ETH_TX_BUF_SIZE)
  70091. 803550c: f240 52f4 movw r2, #1524 ; 0x5f4
  70092. 8035510: 4290 cmp r0, r2
  70093. 8035512: d917 bls.n 8035544 <ETH_Prepare_Transmit_Descriptors+0x44>
  70094. {
  70095. buf_count = FrameLength/ETH_TX_BUF_SIZE;
  70096. 8035514: fbb0 f4f2 udiv r4, r0, r2
  70097. if (FrameLength%ETH_TX_BUF_SIZE) buf_count++;
  70098. 8035518: fb02 0214 mls r2, r2, r4, r0
  70099. 803551c: b292 uxth r2, r2
  70100. DMATxNextDesc = DMATxDescToSet;
  70101. if (FrameLength > ETH_TX_BUF_SIZE)
  70102. {
  70103. buf_count = FrameLength/ETH_TX_BUF_SIZE;
  70104. 803551e: b2a1 uxth r1, r4
  70105. if (FrameLength%ETH_TX_BUF_SIZE) buf_count++;
  70106. 8035520: b10a cbz r2, 8035526 <ETH_Prepare_Transmit_Descriptors+0x26>
  70107. 8035522: 3101 adds r1, #1
  70108. 8035524: e001 b.n 803552a <ETH_Prepare_Transmit_Descriptors+0x2a>
  70109. }
  70110. else buf_count =1;
  70111. if (buf_count ==1)
  70112. 8035526: 2901 cmp r1, #1
  70113. 8035528: d00c beq.n 8035544 <ETH_Prepare_Transmit_Descriptors+0x44>
  70114. if (i== (buf_count-1))
  70115. {
  70116. /* Setting the last segment bit */
  70117. DMATxNextDesc->Status |= ETH_DMATxDesc_LS;
  70118. size = FrameLength - (buf_count-1)*ETH_TX_BUF_SIZE;
  70119. 803552a: 4d20 ldr r5, [pc, #128] ; (80355ac <ETH_Prepare_Transmit_Descriptors+0xac>)
  70120. 803552c: f200 50f4 addw r0, r0, #1524 ; 0x5f4
  70121. 8035530: fb05 0501 mla r5, r5, r1, r0
  70122. DMATxNextDesc->ControlBufferSize = (size & ETH_DMATxDesc_TBS1);
  70123. 8035534: 04ed lsls r5, r5, #19
  70124. 8035536: 0ced lsrs r5, r5, #19
  70125. 8035538: 461a mov r2, r3
  70126. 803553a: 2000 movs r0, #0
  70127. /* Setting the first segment bit */
  70128. DMATxDescToSet->Status |= ETH_DMATxDesc_FS;
  70129. }
  70130. /* Program size */
  70131. DMATxNextDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATxDesc_TBS1);
  70132. 803553c: f240 56f4 movw r6, #1524 ; 0x5f4
  70133. if (i== (buf_count-1))
  70134. 8035540: 1e4f subs r7, r1, #1
  70135. 8035542: e00c b.n 803555e <ETH_Prepare_Transmit_Descriptors+0x5e>
  70136. else buf_count =1;
  70137. if (buf_count ==1)
  70138. {
  70139. /*set LAST and FIRST segment */
  70140. DMATxDescToSet->Status |=ETH_DMATxDesc_FS|ETH_DMATxDesc_LS;
  70141. 8035544: 681a ldr r2, [r3, #0]
  70142. /* Set frame size */
  70143. DMATxDescToSet->ControlBufferSize = (FrameLength& ETH_DMATxDesc_TBS1);
  70144. 8035546: 04c0 lsls r0, r0, #19
  70145. else buf_count =1;
  70146. if (buf_count ==1)
  70147. {
  70148. /*set LAST and FIRST segment */
  70149. DMATxDescToSet->Status |=ETH_DMATxDesc_FS|ETH_DMATxDesc_LS;
  70150. 8035548: f042 5240 orr.w r2, r2, #805306368 ; 0x30000000
  70151. /* Set frame size */
  70152. DMATxDescToSet->ControlBufferSize = (FrameLength& ETH_DMATxDesc_TBS1);
  70153. 803554c: 0cc0 lsrs r0, r0, #19
  70154. else buf_count =1;
  70155. if (buf_count ==1)
  70156. {
  70157. /*set LAST and FIRST segment */
  70158. DMATxDescToSet->Status |=ETH_DMATxDesc_FS|ETH_DMATxDesc_LS;
  70159. 803554e: 601a str r2, [r3, #0]
  70160. /* Set frame size */
  70161. DMATxDescToSet->ControlBufferSize = (FrameLength& ETH_DMATxDesc_TBS1);
  70162. 8035550: 6058 str r0, [r3, #4]
  70163. /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
  70164. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  70165. 8035552: 681a ldr r2, [r3, #0]
  70166. 8035554: f042 4200 orr.w r2, r2, #2147483648 ; 0x80000000
  70167. 8035558: 601a str r2, [r3, #0]
  70168. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  70169. 803555a: 68da ldr r2, [r3, #12]
  70170. 803555c: e014 b.n 8035588 <ETH_Prepare_Transmit_Descriptors+0x88>
  70171. }
  70172. else
  70173. {
  70174. for (i=0; i< buf_count; i++)
  70175. {
  70176. if (i==0)
  70177. 803555e: b918 cbnz r0, 8035568 <ETH_Prepare_Transmit_Descriptors+0x68>
  70178. {
  70179. /* Setting the first segment bit */
  70180. DMATxDescToSet->Status |= ETH_DMATxDesc_FS;
  70181. 8035560: 681c ldr r4, [r3, #0]
  70182. 8035562: f044 5480 orr.w r4, r4, #268435456 ; 0x10000000
  70183. 8035566: 601c str r4, [r3, #0]
  70184. }
  70185. /* Program size */
  70186. DMATxNextDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATxDesc_TBS1);
  70187. if (i== (buf_count-1))
  70188. 8035568: 42b8 cmp r0, r7
  70189. /* Setting the first segment bit */
  70190. DMATxDescToSet->Status |= ETH_DMATxDesc_FS;
  70191. }
  70192. /* Program size */
  70193. DMATxNextDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATxDesc_TBS1);
  70194. 803556a: 6056 str r6, [r2, #4]
  70195. if (i== (buf_count-1))
  70196. 803556c: d104 bne.n 8035578 <ETH_Prepare_Transmit_Descriptors+0x78>
  70197. {
  70198. /* Setting the last segment bit */
  70199. DMATxNextDesc->Status |= ETH_DMATxDesc_LS;
  70200. 803556e: 6814 ldr r4, [r2, #0]
  70201. 8035570: f044 5400 orr.w r4, r4, #536870912 ; 0x20000000
  70202. 8035574: 6014 str r4, [r2, #0]
  70203. size = FrameLength - (buf_count-1)*ETH_TX_BUF_SIZE;
  70204. DMATxNextDesc->ControlBufferSize = (size & ETH_DMATxDesc_TBS1);
  70205. 8035576: 6055 str r5, [r2, #4]
  70206. }
  70207. /*give back descriptor to DMA */
  70208. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  70209. 8035578: 6814 ldr r4, [r2, #0]
  70210. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  70211. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  70212. }
  70213. else
  70214. {
  70215. for (i=0; i< buf_count; i++)
  70216. 803557a: 3001 adds r0, #1
  70217. size = FrameLength - (buf_count-1)*ETH_TX_BUF_SIZE;
  70218. DMATxNextDesc->ControlBufferSize = (size & ETH_DMATxDesc_TBS1);
  70219. }
  70220. /*give back descriptor to DMA */
  70221. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  70222. 803557c: f044 4400 orr.w r4, r4, #2147483648 ; 0x80000000
  70223. 8035580: 6014 str r4, [r2, #0]
  70224. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  70225. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  70226. }
  70227. else
  70228. {
  70229. for (i=0; i< buf_count; i++)
  70230. 8035582: 4288 cmp r0, r1
  70231. }
  70232. /*give back descriptor to DMA */
  70233. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  70234. DMATxNextDesc = (ETH_DMADESCTypeDef *)(DMATxNextDesc->Buffer2NextDescAddr);
  70235. 8035584: 68d2 ldr r2, [r2, #12]
  70236. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  70237. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  70238. }
  70239. else
  70240. {
  70241. for (i=0; i< buf_count; i++)
  70242. 8035586: d3ea bcc.n 803555e <ETH_Prepare_Transmit_Descriptors+0x5e>
  70243. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  70244. DMATxNextDesc = (ETH_DMADESCTypeDef *)(DMATxNextDesc->Buffer2NextDescAddr);
  70245. /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
  70246. }
  70247. DMATxDescToSet = DMATxNextDesc ;
  70248. 8035588: 4b07 ldr r3, [pc, #28] ; (80355a8 <ETH_Prepare_Transmit_Descriptors+0xa8>)
  70249. 803558a: 601a str r2, [r3, #0]
  70250. }
  70251. /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
  70252. if ((ETH->DMASR & ETH_DMASR_TBUS) != (u32)RESET)
  70253. 803558c: 4b08 ldr r3, [pc, #32] ; (80355b0 <ETH_Prepare_Transmit_Descriptors+0xb0>)
  70254. 803558e: 695a ldr r2, [r3, #20]
  70255. 8035590: 0750 lsls r0, r2, #29
  70256. 8035592: d506 bpl.n 80355a2 <ETH_Prepare_Transmit_Descriptors+0xa2>
  70257. {
  70258. /* Clear TBUS ETHERNET DMA flag */
  70259. ETH->DMASR = ETH_DMASR_TBUS;
  70260. 8035594: 2204 movs r2, #4
  70261. 8035596: 615a str r2, [r3, #20]
  70262. /* Resume DMA transmission*/
  70263. ETH->DMATPDR = 0;
  70264. 8035598: 2200 movs r2, #0
  70265. 803559a: 605a str r2, [r3, #4]
  70266. 803559c: e001 b.n 80355a2 <ETH_Prepare_Transmit_Descriptors+0xa2>
  70267. /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  70268. if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
  70269. {
  70270. /* Return ERROR: OWN bit set */
  70271. return ETH_ERROR;
  70272. 803559e: 2000 movs r0, #0
  70273. 80355a0: bdf0 pop {r4, r5, r6, r7, pc}
  70274. /* Resume DMA transmission*/
  70275. ETH->DMATPDR = 0;
  70276. }
  70277. /* Return SUCCESS */
  70278. return ETH_SUCCESS;
  70279. 80355a2: 2001 movs r0, #1
  70280. }
  70281. 80355a4: bdf0 pop {r4, r5, r6, r7, pc}
  70282. 80355a6: bf00 nop
  70283. 80355a8: 20011464 .word 0x20011464
  70284. 80355ac: fffffa0c .word 0xfffffa0c
  70285. 80355b0: 40029000 .word 0x40029000
  70286. 080355b4 <ETH_DMARxDescChainInit>:
  70287. {
  70288. uint32_t i = 0;
  70289. ETH_DMADESCTypeDef *DMARxDesc;
  70290. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  70291. DMARxDescToGet = DMARxDescTab;
  70292. 80355b4: 4b11 ldr r3, [pc, #68] ; (80355fc <ETH_DMARxDescChainInit+0x48>)
  70293. * @param RxBuff: Pointer on the first RxBuffer list
  70294. * @param RxBuffCount: Number of the used Rx desc in the list
  70295. * @retval None
  70296. */
  70297. void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount)
  70298. {
  70299. 80355b6: b5f0 push {r4, r5, r6, r7, lr}
  70300. uint32_t i = 0;
  70301. ETH_DMADESCTypeDef *DMARxDesc;
  70302. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  70303. DMARxDescToGet = DMARxDescTab;
  70304. 80355b8: 6018 str r0, [r3, #0]
  70305. /* Fill each DMARxDesc descriptor with the right values */
  70306. for(i=0; i < RxBuffCount; i++)
  70307. 80355ba: 2400 movs r4, #0
  70308. * @param DMARxDescTab: Pointer on the first Rx desc list
  70309. * @param RxBuff: Pointer on the first RxBuffer list
  70310. * @param RxBuffCount: Number of the used Rx desc in the list
  70311. * @retval None
  70312. */
  70313. void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount)
  70314. 80355bc: f100 0320 add.w r3, r0, #32
  70315. for(i=0; i < RxBuffCount; i++)
  70316. {
  70317. /* Get the pointer on the ith member of the Rx Desc list */
  70318. DMARxDesc = DMARxDescTab+i;
  70319. /* Set Own bit of the Rx descriptor Status */
  70320. DMARxDesc->Status = ETH_DMARxDesc_OWN;
  70321. 80355c0: f04f 4500 mov.w r5, #2147483648 ; 0x80000000
  70322. /* Set Buffer1 size and Second Address Chained bit */
  70323. DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_RX_BUF_SIZE;
  70324. 80355c4: f244 56f4 movw r6, #17908 ; 0x45f4
  70325. /* Set Buffer1 address pointer */
  70326. DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_RX_BUF_SIZE]);
  70327. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  70328. if(i < (RxBuffCount-1))
  70329. 80355c8: 1e57 subs r7, r2, #1
  70330. ETH_DMADESCTypeDef *DMARxDesc;
  70331. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  70332. DMARxDescToGet = DMARxDescTab;
  70333. /* Fill each DMARxDesc descriptor with the right values */
  70334. for(i=0; i < RxBuffCount; i++)
  70335. 80355ca: e00f b.n 80355ec <ETH_DMARxDescChainInit+0x38>
  70336. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  70337. if(i < (RxBuffCount-1))
  70338. {
  70339. /* Set next descriptor address register with next descriptor base address */
  70340. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1);
  70341. 80355cc: 42bc cmp r4, r7
  70342. 80355ce: bf2c ite cs
  70343. 80355d0: 4684 movcs ip, r0
  70344. 80355d2: 469c movcc ip, r3
  70345. DMARxDesc->Status = ETH_DMARxDesc_OWN;
  70346. /* Set Buffer1 size and Second Address Chained bit */
  70347. DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_RX_BUF_SIZE;
  70348. /* Set Buffer1 address pointer */
  70349. DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_RX_BUF_SIZE]);
  70350. 80355d4: f843 1c18 str.w r1, [r3, #-24]
  70351. for(i=0; i < RxBuffCount; i++)
  70352. {
  70353. /* Get the pointer on the ith member of the Rx Desc list */
  70354. DMARxDesc = DMARxDescTab+i;
  70355. /* Set Own bit of the Rx descriptor Status */
  70356. DMARxDesc->Status = ETH_DMARxDesc_OWN;
  70357. 80355d8: f843 5c20 str.w r5, [r3, #-32]
  70358. /* Set Buffer1 size and Second Address Chained bit */
  70359. DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_RX_BUF_SIZE;
  70360. 80355dc: f843 6c1c str.w r6, [r3, #-28]
  70361. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  70362. if(i < (RxBuffCount-1))
  70363. {
  70364. /* Set next descriptor address register with next descriptor base address */
  70365. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1);
  70366. 80355e0: f843 cc14 str.w ip, [r3, #-20]
  70367. ETH_DMADESCTypeDef *DMARxDesc;
  70368. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  70369. DMARxDescToGet = DMARxDescTab;
  70370. /* Fill each DMARxDesc descriptor with the right values */
  70371. for(i=0; i < RxBuffCount; i++)
  70372. 80355e4: 3401 adds r4, #1
  70373. 80355e6: 3320 adds r3, #32
  70374. 80355e8: f201 51f4 addw r1, r1, #1524 ; 0x5f4
  70375. 80355ec: 4294 cmp r4, r2
  70376. 80355ee: d1ed bne.n 80355cc <ETH_DMARxDescChainInit+0x18>
  70377. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab);
  70378. }
  70379. }
  70380. /* Set Receive Descriptor List Address Register */
  70381. ETH->DMARDLAR = (uint32_t) DMARxDescTab;
  70382. 80355f0: 4b03 ldr r3, [pc, #12] ; (8035600 <ETH_DMARxDescChainInit+0x4c>)
  70383. DMA_RX_FRAME_infos = &RX_Frame_Descriptor;
  70384. 80355f2: 4a04 ldr r2, [pc, #16] ; (8035604 <ETH_DMARxDescChainInit+0x50>)
  70385. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab);
  70386. }
  70387. }
  70388. /* Set Receive Descriptor List Address Register */
  70389. ETH->DMARDLAR = (uint32_t) DMARxDescTab;
  70390. 80355f4: 60d8 str r0, [r3, #12]
  70391. DMA_RX_FRAME_infos = &RX_Frame_Descriptor;
  70392. 80355f6: 4b04 ldr r3, [pc, #16] ; (8035608 <ETH_DMARxDescChainInit+0x54>)
  70393. 80355f8: 601a str r2, [r3, #0]
  70394. 80355fa: bdf0 pop {r4, r5, r6, r7, pc}
  70395. 80355fc: 20011460 .word 0x20011460
  70396. 8035600: 40029000 .word 0x40029000
  70397. 8035604: 20011454 .word 0x20011454
  70398. 8035608: 200132d0 .word 0x200132d0
  70399. 0803560c <ETH_DMATxDescChainInit>:
  70400. {
  70401. uint32_t i = 0;
  70402. ETH_DMADESCTypeDef *DMATxDesc;
  70403. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  70404. DMATxDescToSet = DMATxDescTab;
  70405. 803560c: 4b0e ldr r3, [pc, #56] ; (8035648 <ETH_DMATxDescChainInit+0x3c>)
  70406. * @param TxBuff: Pointer on the first TxBuffer list
  70407. * @param TxBuffCount: Number of the used Tx desc in the list
  70408. * @retval None
  70409. */
  70410. void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount)
  70411. {
  70412. 803560e: b5f0 push {r4, r5, r6, r7, lr}
  70413. uint32_t i = 0;
  70414. ETH_DMADESCTypeDef *DMATxDesc;
  70415. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  70416. DMATxDescToSet = DMATxDescTab;
  70417. 8035610: 6018 str r0, [r3, #0]
  70418. /* Fill each DMATxDesc descriptor with the right values */
  70419. for(i=0; i < TxBuffCount; i++)
  70420. 8035612: 2400 movs r4, #0
  70421. * @param DMATxDescTab: Pointer on the first Tx desc list
  70422. * @param TxBuff: Pointer on the first TxBuffer list
  70423. * @param TxBuffCount: Number of the used Tx desc in the list
  70424. * @retval None
  70425. */
  70426. void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount)
  70427. 8035614: f100 0320 add.w r3, r0, #32
  70428. for(i=0; i < TxBuffCount; i++)
  70429. {
  70430. /* Get the pointer on the ith member of the Tx Desc list */
  70431. DMATxDesc = DMATxDescTab + i;
  70432. /* Set Second Address Chained bit */
  70433. DMATxDesc->Status = ETH_DMATxDesc_TCH;
  70434. 8035618: f44f 1580 mov.w r5, #1048576 ; 0x100000
  70435. /* Set Buffer1 address pointer */
  70436. DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_TX_BUF_SIZE]);
  70437. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  70438. if(i < (TxBuffCount-1))
  70439. 803561c: 1e56 subs r6, r2, #1
  70440. ETH_DMADESCTypeDef *DMATxDesc;
  70441. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  70442. DMATxDescToSet = DMATxDescTab;
  70443. /* Fill each DMATxDesc descriptor with the right values */
  70444. for(i=0; i < TxBuffCount; i++)
  70445. 803561e: e00d b.n 803563c <ETH_DMATxDescChainInit+0x30>
  70446. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  70447. if(i < (TxBuffCount-1))
  70448. {
  70449. /* Set next descriptor address register with next descriptor base address */
  70450. DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1);
  70451. 8035620: 42b4 cmp r4, r6
  70452. 8035622: bf2c ite cs
  70453. 8035624: 4607 movcs r7, r0
  70454. 8035626: 461f movcc r7, r3
  70455. DMATxDesc = DMATxDescTab + i;
  70456. /* Set Second Address Chained bit */
  70457. DMATxDesc->Status = ETH_DMATxDesc_TCH;
  70458. /* Set Buffer1 address pointer */
  70459. DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_TX_BUF_SIZE]);
  70460. 8035628: f843 1c18 str.w r1, [r3, #-24]
  70461. for(i=0; i < TxBuffCount; i++)
  70462. {
  70463. /* Get the pointer on the ith member of the Tx Desc list */
  70464. DMATxDesc = DMATxDescTab + i;
  70465. /* Set Second Address Chained bit */
  70466. DMATxDesc->Status = ETH_DMATxDesc_TCH;
  70467. 803562c: f843 5c20 str.w r5, [r3, #-32]
  70468. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  70469. if(i < (TxBuffCount-1))
  70470. {
  70471. /* Set next descriptor address register with next descriptor base address */
  70472. DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1);
  70473. 8035630: f843 7c14 str.w r7, [r3, #-20]
  70474. ETH_DMADESCTypeDef *DMATxDesc;
  70475. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  70476. DMATxDescToSet = DMATxDescTab;
  70477. /* Fill each DMATxDesc descriptor with the right values */
  70478. for(i=0; i < TxBuffCount; i++)
  70479. 8035634: 3401 adds r4, #1
  70480. 8035636: 3320 adds r3, #32
  70481. 8035638: f201 51f4 addw r1, r1, #1524 ; 0x5f4
  70482. 803563c: 4294 cmp r4, r2
  70483. 803563e: d1ef bne.n 8035620 <ETH_DMATxDescChainInit+0x14>
  70484. DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab;
  70485. }
  70486. }
  70487. /* Set Transmit Desciptor List Address Register */
  70488. ETH->DMATDLAR = (uint32_t) DMATxDescTab;
  70489. 8035640: 4b02 ldr r3, [pc, #8] ; (803564c <ETH_DMATxDescChainInit+0x40>)
  70490. 8035642: 6118 str r0, [r3, #16]
  70491. 8035644: bdf0 pop {r4, r5, r6, r7, pc}
  70492. 8035646: bf00 nop
  70493. 8035648: 20011464 .word 0x20011464
  70494. 803564c: 40029000 .word 0x40029000
  70495. 08035650 <ETH_DMATxDescChecksumInsertionConfig>:
  70496. {
  70497. /* Check the parameters */
  70498. assert_param(IS_ETH_DMA_TXDESC_CHECKSUM(DMATxDesc_Checksum));
  70499. /* Set the selected DMA Tx desc checksum insertion control */
  70500. DMATxDesc->Status |= DMATxDesc_Checksum;
  70501. 8035650: 6803 ldr r3, [r0, #0]
  70502. 8035652: 4319 orrs r1, r3
  70503. 8035654: 6001 str r1, [r0, #0]
  70504. 8035656: 4770 bx lr
  70505. 08035658 <ETH_DMARxDescReceiveITConfig>:
  70506. * @param NewState: new state of the specified DMA Rx Desc interrupt.
  70507. * This parameter can be: ENABLE or DISABLE.
  70508. * @retval None
  70509. */
  70510. void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState)
  70511. {
  70512. 8035658: 6843 ldr r3, [r0, #4]
  70513. /* Check the parameters */
  70514. assert_param(IS_FUNCTIONAL_STATE(NewState));
  70515. if (NewState != DISABLE)
  70516. 803565a: b111 cbz r1, 8035662 <ETH_DMARxDescReceiveITConfig+0xa>
  70517. {
  70518. /* Enable the DMA Rx Desc receive interrupt */
  70519. DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_DIC);
  70520. 803565c: f023 4300 bic.w r3, r3, #2147483648 ; 0x80000000
  70521. 8035660: e001 b.n 8035666 <ETH_DMARxDescReceiveITConfig+0xe>
  70522. }
  70523. else
  70524. {
  70525. /* Disable the DMA Rx Desc receive interrupt */
  70526. DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_DIC;
  70527. 8035662: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000
  70528. 8035666: 6043 str r3, [r0, #4]
  70529. 8035668: 4770 bx lr
  70530. 803566a: 0000 movs r0, r0
  70531. 0803566c <ETH_SoftwareReset>:
  70532. */
  70533. void ETH_SoftwareReset(void)
  70534. {
  70535. /* Set the SWR bit: resets all MAC subsystem internal registers and logic */
  70536. /* After reset all the registers holds their respective reset values */
  70537. ETH->DMABMR |= ETH_DMABMR_SR;
  70538. 803566c: 4b02 ldr r3, [pc, #8] ; (8035678 <ETH_SoftwareReset+0xc>)
  70539. 803566e: 681a ldr r2, [r3, #0]
  70540. 8035670: f042 0201 orr.w r2, r2, #1
  70541. 8035674: 601a str r2, [r3, #0]
  70542. 8035676: 4770 bx lr
  70543. 8035678: 40029000 .word 0x40029000
  70544. 0803567c <ETH_GetSoftwareResetStatus>:
  70545. * @retval The new state of DMA Bus Mode register SR bit (SET or RESET).
  70546. */
  70547. FlagStatus ETH_GetSoftwareResetStatus(void)
  70548. {
  70549. FlagStatus bitstatus = RESET;
  70550. if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET)
  70551. 803567c: 4b02 ldr r3, [pc, #8] ; (8035688 <ETH_GetSoftwareResetStatus+0xc>)
  70552. 803567e: 6818 ldr r0, [r3, #0]
  70553. else
  70554. {
  70555. bitstatus = RESET;
  70556. }
  70557. return bitstatus;
  70558. }
  70559. 8035680: f000 0001 and.w r0, r0, #1
  70560. 8035684: 4770 bx lr
  70561. 8035686: bf00 nop
  70562. 8035688: 40029000 .word 0x40029000
  70563. 0803568c <ETH_GetDMAFlagStatus>:
  70564. FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG)
  70565. {
  70566. FlagStatus bitstatus = RESET;
  70567. /* Check the parameters */
  70568. assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_FLAG));
  70569. if ((ETH->DMASR & ETH_DMA_FLAG) != (uint32_t)RESET)
  70570. 803568c: 4b03 ldr r3, [pc, #12] ; (803569c <ETH_GetDMAFlagStatus+0x10>)
  70571. 803568e: 695b ldr r3, [r3, #20]
  70572. 8035690: 4218 tst r0, r3
  70573. else
  70574. {
  70575. bitstatus = RESET;
  70576. }
  70577. return bitstatus;
  70578. }
  70579. 8035692: bf0c ite eq
  70580. 8035694: 2000 moveq r0, #0
  70581. 8035696: 2001 movne r0, #1
  70582. 8035698: 4770 bx lr
  70583. 803569a: bf00 nop
  70584. 803569c: 40029000 .word 0x40029000
  70585. 080356a0 <ETH_DMAITConfig>:
  70586. * @param NewState: new state of the specified ETHERNET DMA interrupts.
  70587. * This parameter can be: ENABLE or DISABLE.
  70588. * @retval None
  70589. */
  70590. void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState)
  70591. {
  70592. 80356a0: 4b04 ldr r3, [pc, #16] ; (80356b4 <ETH_DMAITConfig+0x14>)
  70593. assert_param(IS_FUNCTIONAL_STATE(NewState));
  70594. if (NewState != DISABLE)
  70595. {
  70596. /* Enable the selected ETHERNET DMA interrupts */
  70597. ETH->DMAIER |= ETH_DMA_IT;
  70598. 80356a2: 69da ldr r2, [r3, #28]
  70599. {
  70600. /* Check the parameters */
  70601. assert_param(IS_ETH_DMA_IT(ETH_DMA_IT));
  70602. assert_param(IS_FUNCTIONAL_STATE(NewState));
  70603. if (NewState != DISABLE)
  70604. 80356a4: b109 cbz r1, 80356aa <ETH_DMAITConfig+0xa>
  70605. {
  70606. /* Enable the selected ETHERNET DMA interrupts */
  70607. ETH->DMAIER |= ETH_DMA_IT;
  70608. 80356a6: 4310 orrs r0, r2
  70609. 80356a8: e001 b.n 80356ae <ETH_DMAITConfig+0xe>
  70610. }
  70611. else
  70612. {
  70613. /* Disable the selected ETHERNET DMA interrupts */
  70614. ETH->DMAIER &=(~(uint32_t)ETH_DMA_IT);
  70615. 80356aa: ea22 0000 bic.w r0, r2, r0
  70616. 80356ae: 61d8 str r0, [r3, #28]
  70617. 80356b0: 4770 bx lr
  70618. 80356b2: bf00 nop
  70619. 80356b4: 40029000 .word 0x40029000
  70620. 080356b8 <ETH_DMAClearITPendingBit>:
  70621. {
  70622. /* Check the parameters */
  70623. assert_param(IS_ETH_DMA_IT(ETH_DMA_IT));
  70624. /* Clear the selected ETHERNET DMA IT */
  70625. ETH->DMASR = (uint32_t) ETH_DMA_IT;
  70626. 80356b8: 4b01 ldr r3, [pc, #4] ; (80356c0 <ETH_DMAClearITPendingBit+0x8>)
  70627. 80356ba: 6158 str r0, [r3, #20]
  70628. 80356bc: 4770 bx lr
  70629. 80356be: bf00 nop
  70630. 80356c0: 40029000 .word 0x40029000
  70631. 080356c4 <ETH_FlushTransmitFIFO>:
  70632. * @retval None
  70633. */
  70634. void ETH_FlushTransmitFIFO(void)
  70635. {
  70636. /* Set the Flush Transmit FIFO bit */
  70637. ETH->DMAOMR |= ETH_DMAOMR_FTF;
  70638. 80356c4: 4b02 ldr r3, [pc, #8] ; (80356d0 <ETH_FlushTransmitFIFO+0xc>)
  70639. 80356c6: 699a ldr r2, [r3, #24]
  70640. 80356c8: f442 1280 orr.w r2, r2, #1048576 ; 0x100000
  70641. 80356cc: 619a str r2, [r3, #24]
  70642. 80356ce: 4770 bx lr
  70643. 80356d0: 40029000 .word 0x40029000
  70644. 080356d4 <ETH_DMATransmissionCmd>:
  70645. * @param NewState: new state of the DMA transmission.
  70646. * This parameter can be: ENABLE or DISABLE.
  70647. * @retval None
  70648. */
  70649. void ETH_DMATransmissionCmd(FunctionalState NewState)
  70650. {
  70651. 80356d4: 4b04 ldr r3, [pc, #16] ; (80356e8 <ETH_DMATransmissionCmd+0x14>)
  70652. assert_param(IS_FUNCTIONAL_STATE(NewState));
  70653. if (NewState != DISABLE)
  70654. {
  70655. /* Enable the DMA transmission */
  70656. ETH->DMAOMR |= ETH_DMAOMR_ST;
  70657. 80356d6: 699a ldr r2, [r3, #24]
  70658. void ETH_DMATransmissionCmd(FunctionalState NewState)
  70659. {
  70660. /* Check the parameters */
  70661. assert_param(IS_FUNCTIONAL_STATE(NewState));
  70662. if (NewState != DISABLE)
  70663. 80356d8: b110 cbz r0, 80356e0 <ETH_DMATransmissionCmd+0xc>
  70664. {
  70665. /* Enable the DMA transmission */
  70666. ETH->DMAOMR |= ETH_DMAOMR_ST;
  70667. 80356da: f442 5200 orr.w r2, r2, #8192 ; 0x2000
  70668. 80356de: e001 b.n 80356e4 <ETH_DMATransmissionCmd+0x10>
  70669. }
  70670. else
  70671. {
  70672. /* Disable the DMA transmission */
  70673. ETH->DMAOMR &= ~ETH_DMAOMR_ST;
  70674. 80356e0: f422 5200 bic.w r2, r2, #8192 ; 0x2000
  70675. 80356e4: 619a str r2, [r3, #24]
  70676. 80356e6: 4770 bx lr
  70677. 80356e8: 40029000 .word 0x40029000
  70678. 080356ec <ETH_DMAReceptionCmd>:
  70679. * @param NewState: new state of the DMA reception.
  70680. * This parameter can be: ENABLE or DISABLE.
  70681. * @retval None
  70682. */
  70683. void ETH_DMAReceptionCmd(FunctionalState NewState)
  70684. {
  70685. 80356ec: 4b04 ldr r3, [pc, #16] ; (8035700 <ETH_DMAReceptionCmd+0x14>)
  70686. assert_param(IS_FUNCTIONAL_STATE(NewState));
  70687. if (NewState != DISABLE)
  70688. {
  70689. /* Enable the DMA reception */
  70690. ETH->DMAOMR |= ETH_DMAOMR_SR;
  70691. 80356ee: 699a ldr r2, [r3, #24]
  70692. void ETH_DMAReceptionCmd(FunctionalState NewState)
  70693. {
  70694. /* Check the parameters */
  70695. assert_param(IS_FUNCTIONAL_STATE(NewState));
  70696. if (NewState != DISABLE)
  70697. 80356f0: b110 cbz r0, 80356f8 <ETH_DMAReceptionCmd+0xc>
  70698. {
  70699. /* Enable the DMA reception */
  70700. ETH->DMAOMR |= ETH_DMAOMR_SR;
  70701. 80356f2: f042 0202 orr.w r2, r2, #2
  70702. 80356f6: e001 b.n 80356fc <ETH_DMAReceptionCmd+0x10>
  70703. }
  70704. else
  70705. {
  70706. /* Disable the DMA reception */
  70707. ETH->DMAOMR &= ~ETH_DMAOMR_SR;
  70708. 80356f8: f022 0202 bic.w r2, r2, #2
  70709. 80356fc: 619a str r2, [r3, #24]
  70710. 80356fe: 4770 bx lr
  70711. 8035700: 40029000 .word 0x40029000
  70712. 08035704 <ETH_Start>:
  70713. * @brief Enables ENET MAC and DMA reception/transmission
  70714. * @param None
  70715. * @retval None
  70716. */
  70717. void ETH_Start(void)
  70718. {
  70719. 8035704: b508 push {r3, lr}
  70720. /* Enable transmit state machine of the MAC for transmission on the MII */
  70721. ETH_MACTransmissionCmd(ENABLE);
  70722. 8035706: 2001 movs r0, #1
  70723. 8035708: f7ff fe7a bl 8035400 <ETH_MACTransmissionCmd>
  70724. /* Flush Transmit FIFO */
  70725. ETH_FlushTransmitFIFO();
  70726. 803570c: f7ff ffda bl 80356c4 <ETH_FlushTransmitFIFO>
  70727. /* Enable receive state machine of the MAC for reception from the MII */
  70728. ETH_MACReceptionCmd(ENABLE);
  70729. 8035710: 2001 movs r0, #1
  70730. 8035712: f7ff fe81 bl 8035418 <ETH_MACReceptionCmd>
  70731. /* Start DMA transmission */
  70732. ETH_DMATransmissionCmd(ENABLE);
  70733. 8035716: 2001 movs r0, #1
  70734. 8035718: f7ff ffdc bl 80356d4 <ETH_DMATransmissionCmd>
  70735. /* Start DMA reception */
  70736. ETH_DMAReceptionCmd(ENABLE);
  70737. 803571c: 2001 movs r0, #1
  70738. }
  70739. 803571e: e8bd 4008 ldmia.w sp!, {r3, lr}
  70740. ETH_MACReceptionCmd(ENABLE);
  70741. /* Start DMA transmission */
  70742. ETH_DMATransmissionCmd(ENABLE);
  70743. /* Start DMA reception */
  70744. ETH_DMAReceptionCmd(ENABLE);
  70745. 8035722: f7ff bfe3 b.w 80356ec <ETH_DMAReceptionCmd>
  70746. 8035726: 0000 movs r0, r0
  70747. 08035728 <ETH_ReadPHYRegister>:
  70748. * @arg More PHY register could be read depending on the used PHY
  70749. * @retval ETH_ERROR: in case of timeout
  70750. * MAC MIIDR register value: Data read from the selected PHY register (correct read )
  70751. */
  70752. uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg)
  70753. {
  70754. 8035728: b082 sub sp, #8
  70755. uint32_t tmpreg = 0;
  70756. __IO uint32_t timeout = 0;
  70757. 803572a: 2300 movs r3, #0
  70758. 803572c: 9301 str r3, [sp, #4]
  70759. /* Check the parameters */
  70760. assert_param(IS_ETH_PHY_ADDRESS(PHYAddress));
  70761. assert_param(IS_ETH_PHY_REG(PHYReg));
  70762. /* Get the ETHERNET MACMIIAR value */
  70763. tmpreg = ETH->MACMIIAR;
  70764. 803572e: 4b11 ldr r3, [pc, #68] ; (8035774 <ETH_ReadPHYRegister+0x4c>)
  70765. 8035730: 691a ldr r2, [r3, #16]
  70766. /* Keep only the CSR Clock Range CR[2:0] bits value */
  70767. tmpreg &= ~MACMIIAR_CR_MASK;
  70768. /* Prepare the MII address register value */
  70769. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  70770. 8035732: 06c0 lsls r0, r0, #27
  70771. assert_param(IS_ETH_PHY_REG(PHYReg));
  70772. /* Get the ETHERNET MACMIIAR value */
  70773. tmpreg = ETH->MACMIIAR;
  70774. /* Keep only the CSR Clock Range CR[2:0] bits value */
  70775. tmpreg &= ~MACMIIAR_CR_MASK;
  70776. 8035734: f002 021c and.w r2, r2, #28
  70777. /* Prepare the MII address register value */
  70778. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  70779. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  70780. 8035738: 0189 lsls r1, r1, #6
  70781. /* Get the ETHERNET MACMIIAR value */
  70782. tmpreg = ETH->MACMIIAR;
  70783. /* Keep only the CSR Clock Range CR[2:0] bits value */
  70784. tmpreg &= ~MACMIIAR_CR_MASK;
  70785. /* Prepare the MII address register value */
  70786. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  70787. 803573a: ea42 4210 orr.w r2, r2, r0, lsr #16
  70788. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  70789. 803573e: f401 61f8 and.w r1, r1, #1984 ; 0x7c0
  70790. tmpreg &= ~ETH_MACMIIAR_MW; /* Set the read mode */
  70791. 8035742: 430a orrs r2, r1
  70792. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  70793. 8035744: f042 0201 orr.w r2, r2, #1
  70794. /* Write the result value into the MII Address register */
  70795. ETH->MACMIIAR = tmpreg;
  70796. 8035748: 611a str r2, [r3, #16]
  70797. /* Check for the Busy flag */
  70798. do
  70799. {
  70800. timeout++;
  70801. tmpreg = ETH->MACMIIAR;
  70802. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
  70803. 803574a: 4a0b ldr r2, [pc, #44] ; (8035778 <ETH_ReadPHYRegister+0x50>)
  70804. /* Write the result value into the MII Address register */
  70805. ETH->MACMIIAR = tmpreg;
  70806. /* Check for the Busy flag */
  70807. do
  70808. {
  70809. timeout++;
  70810. 803574c: 9901 ldr r1, [sp, #4]
  70811. 803574e: 3101 adds r1, #1
  70812. 8035750: 9101 str r1, [sp, #4]
  70813. tmpreg = ETH->MACMIIAR;
  70814. 8035752: 6919 ldr r1, [r3, #16]
  70815. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
  70816. 8035754: 07c9 lsls r1, r1, #31
  70817. 8035756: d502 bpl.n 803575e <ETH_ReadPHYRegister+0x36>
  70818. 8035758: 9901 ldr r1, [sp, #4]
  70819. 803575a: 4291 cmp r1, r2
  70820. 803575c: d9f6 bls.n 803574c <ETH_ReadPHYRegister+0x24>
  70821. /* Return ERROR in case of timeout */
  70822. if(timeout == PHY_READ_TO)
  70823. 803575e: 4b07 ldr r3, [pc, #28] ; (803577c <ETH_ReadPHYRegister+0x54>)
  70824. 8035760: 9a01 ldr r2, [sp, #4]
  70825. 8035762: 429a cmp r2, r3
  70826. {
  70827. return (uint16_t)ETH_ERROR;
  70828. }
  70829. /* Return data register value */
  70830. return (uint16_t)(ETH->MACMIIDR);
  70831. 8035764: bf1d ittte ne
  70832. 8035766: 4b03 ldrne r3, [pc, #12] ; (8035774 <ETH_ReadPHYRegister+0x4c>)
  70833. 8035768: 6958 ldrne r0, [r3, #20]
  70834. 803576a: b280 uxthne r0, r0
  70835. tmpreg = ETH->MACMIIAR;
  70836. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
  70837. /* Return ERROR in case of timeout */
  70838. if(timeout == PHY_READ_TO)
  70839. {
  70840. return (uint16_t)ETH_ERROR;
  70841. 803576c: 2000 moveq r0, #0
  70842. }
  70843. /* Return data register value */
  70844. return (uint16_t)(ETH->MACMIIDR);
  70845. }
  70846. 803576e: b002 add sp, #8
  70847. 8035770: 4770 bx lr
  70848. 8035772: bf00 nop
  70849. 8035774: 40028000 .word 0x40028000
  70850. 8035778: 0004fffe .word 0x0004fffe
  70851. 803577c: 0004ffff .word 0x0004ffff
  70852. 08035780 <ETH_WritePHYRegister>:
  70853. * @param PHYValue: the value to write
  70854. * @retval ETH_ERROR: in case of timeout
  70855. * ETH_SUCCESS: for correct write
  70856. */
  70857. uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue)
  70858. {
  70859. 8035780: b513 push {r0, r1, r4, lr}
  70860. uint32_t tmpreg = 0;
  70861. __IO uint32_t timeout = 0;
  70862. 8035782: 2300 movs r3, #0
  70863. 8035784: 9301 str r3, [sp, #4]
  70864. /* Check the parameters */
  70865. assert_param(IS_ETH_PHY_ADDRESS(PHYAddress));
  70866. assert_param(IS_ETH_PHY_REG(PHYReg));
  70867. /* Get the ETHERNET MACMIIAR value */
  70868. tmpreg = ETH->MACMIIAR;
  70869. 8035786: 4b0f ldr r3, [pc, #60] ; (80357c4 <ETH_WritePHYRegister+0x44>)
  70870. 8035788: 691c ldr r4, [r3, #16]
  70871. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  70872. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  70873. tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */
  70874. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  70875. /* Give the value to the MII data register */
  70876. ETH->MACMIIDR = PHYValue;
  70877. 803578a: 615a str r2, [r3, #20]
  70878. assert_param(IS_ETH_PHY_REG(PHYReg));
  70879. /* Get the ETHERNET MACMIIAR value */
  70880. tmpreg = ETH->MACMIIAR;
  70881. /* Keep only the CSR Clock Range CR[2:0] bits value */
  70882. tmpreg &= ~MACMIIAR_CR_MASK;
  70883. 803578c: f004 041c and.w r4, r4, #28
  70884. /* Prepare the MII register address value */
  70885. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  70886. 8035790: f044 0403 orr.w r4, r4, #3
  70887. 8035794: 06c0 lsls r0, r0, #27
  70888. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  70889. 8035796: 0189 lsls r1, r1, #6
  70890. 8035798: ea44 4410 orr.w r4, r4, r0, lsr #16
  70891. 803579c: f401 61f8 and.w r1, r1, #1984 ; 0x7c0
  70892. tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */
  70893. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  70894. 80357a0: 430c orrs r4, r1
  70895. /* Check for the Busy flag */
  70896. do
  70897. {
  70898. timeout++;
  70899. tmpreg = ETH->MACMIIAR;
  70900. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO));
  70901. 80357a2: 4a09 ldr r2, [pc, #36] ; (80357c8 <ETH_WritePHYRegister+0x48>)
  70902. tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */
  70903. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  70904. /* Give the value to the MII data register */
  70905. ETH->MACMIIDR = PHYValue;
  70906. /* Write the result value into the MII Address register */
  70907. ETH->MACMIIAR = tmpreg;
  70908. 80357a4: 611c str r4, [r3, #16]
  70909. /* Check for the Busy flag */
  70910. do
  70911. {
  70912. timeout++;
  70913. 80357a6: 9901 ldr r1, [sp, #4]
  70914. 80357a8: 3101 adds r1, #1
  70915. 80357aa: 9101 str r1, [sp, #4]
  70916. tmpreg = ETH->MACMIIAR;
  70917. 80357ac: 6919 ldr r1, [r3, #16]
  70918. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO));
  70919. 80357ae: 07c8 lsls r0, r1, #31
  70920. 80357b0: d502 bpl.n 80357b8 <ETH_WritePHYRegister+0x38>
  70921. 80357b2: 9901 ldr r1, [sp, #4]
  70922. 80357b4: 4291 cmp r1, r2
  70923. 80357b6: d9f6 bls.n 80357a6 <ETH_WritePHYRegister+0x26>
  70924. /* Return ERROR in case of timeout */
  70925. if(timeout == PHY_WRITE_TO)
  70926. 80357b8: 9801 ldr r0, [sp, #4]
  70927. return ETH_ERROR;
  70928. }
  70929. /* Return SUCCESS */
  70930. return ETH_SUCCESS;
  70931. }
  70932. 80357ba: 4b04 ldr r3, [pc, #16] ; (80357cc <ETH_WritePHYRegister+0x4c>)
  70933. 80357bc: 1ac0 subs r0, r0, r3
  70934. 80357be: bf18 it ne
  70935. 80357c0: 2001 movne r0, #1
  70936. 80357c2: bd1c pop {r2, r3, r4, pc}
  70937. 80357c4: 40028000 .word 0x40028000
  70938. 80357c8: 0004fffe .word 0x0004fffe
  70939. 80357cc: 0004ffff .word 0x0004ffff
  70940. 080357d0 <ETH_Init>:
  70941. * @param PHYAddress: external PHY address
  70942. * @retval ETH_ERROR: Ethernet initialization failed
  70943. * ETH_SUCCESS: Ethernet successfully initialized
  70944. */
  70945. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  70946. {
  70947. 80357d0: b5f0 push {r4, r5, r6, r7, lr}
  70948. 80357d2: b087 sub sp, #28
  70949. uint32_t RegValue = 0, tmpreg = 0;
  70950. __IO uint32_t i = 0;
  70951. 80357d4: 2300 movs r3, #0
  70952. assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength));
  70953. assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration));
  70954. /*-------------------------------- MAC Config ------------------------------*/
  70955. /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/
  70956. /* Get the ETHERNET MACMIIAR value */
  70957. tmpreg = ETH->MACMIIAR;
  70958. 80357d6: 4f90 ldr r7, [pc, #576] ; (8035a18 <ETH_Init+0x248>)
  70959. * ETH_SUCCESS: Ethernet successfully initialized
  70960. */
  70961. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  70962. {
  70963. uint32_t RegValue = 0, tmpreg = 0;
  70964. __IO uint32_t i = 0;
  70965. 80357d8: 9300 str r3, [sp, #0]
  70966. * @param PHYAddress: external PHY address
  70967. * @retval ETH_ERROR: Ethernet initialization failed
  70968. * ETH_SUCCESS: Ethernet successfully initialized
  70969. */
  70970. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  70971. {
  70972. 80357da: 4604 mov r4, r0
  70973. uint32_t RegValue = 0, tmpreg = 0;
  70974. __IO uint32_t i = 0;
  70975. RCC_ClocksTypeDef rcc_clocks;
  70976. uint32_t hclk = 60000000;
  70977. __IO uint32_t timeout = 0;
  70978. 80357dc: 9301 str r3, [sp, #4]
  70979. /* Get the ETHERNET MACMIIAR value */
  70980. tmpreg = ETH->MACMIIAR;
  70981. /* Clear CSR Clock Range CR[2:0] bits */
  70982. tmpreg &= MACMIIAR_CR_MASK;
  70983. /* Get hclk frequency value */
  70984. RCC_GetClocksFreq(&rcc_clocks);
  70985. 80357de: a802 add r0, sp, #8
  70986. * @param PHYAddress: external PHY address
  70987. * @retval ETH_ERROR: Ethernet initialization failed
  70988. * ETH_SUCCESS: Ethernet successfully initialized
  70989. */
  70990. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  70991. {
  70992. 80357e0: 460e mov r6, r1
  70993. assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength));
  70994. assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration));
  70995. /*-------------------------------- MAC Config ------------------------------*/
  70996. /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/
  70997. /* Get the ETHERNET MACMIIAR value */
  70998. tmpreg = ETH->MACMIIAR;
  70999. 80357e2: 693d ldr r5, [r7, #16]
  71000. /* Clear CSR Clock Range CR[2:0] bits */
  71001. tmpreg &= MACMIIAR_CR_MASK;
  71002. /* Get hclk frequency value */
  71003. RCC_GetClocksFreq(&rcc_clocks);
  71004. 80357e4: f7ef ff4e bl 8025684 <RCC_GetClocksFreq>
  71005. hclk = rcc_clocks.HCLK_Frequency;
  71006. 80357e8: 9b03 ldr r3, [sp, #12]
  71007. /* Set CR bits depending on hclk value */
  71008. if((hclk >= 20000000)&&(hclk < 35000000))
  71009. 80357ea: 4a8c ldr r2, [pc, #560] ; (8035a1c <ETH_Init+0x24c>)
  71010. 80357ec: 498c ldr r1, [pc, #560] ; (8035a20 <ETH_Init+0x250>)
  71011. 80357ee: 189a adds r2, r3, r2
  71012. 80357f0: 428a cmp r2, r1
  71013. /*-------------------------------- MAC Config ------------------------------*/
  71014. /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/
  71015. /* Get the ETHERNET MACMIIAR value */
  71016. tmpreg = ETH->MACMIIAR;
  71017. /* Clear CSR Clock Range CR[2:0] bits */
  71018. tmpreg &= MACMIIAR_CR_MASK;
  71019. 80357f2: f025 051c bic.w r5, r5, #28
  71020. /* Get hclk frequency value */
  71021. RCC_GetClocksFreq(&rcc_clocks);
  71022. hclk = rcc_clocks.HCLK_Frequency;
  71023. /* Set CR bits depending on hclk value */
  71024. if((hclk >= 20000000)&&(hclk < 35000000))
  71025. 80357f6: d802 bhi.n 80357fe <ETH_Init+0x2e>
  71026. {
  71027. /* CSR Clock Range between 20-35 MHz */
  71028. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div16;
  71029. 80357f8: f045 0508 orr.w r5, r5, #8
  71030. 80357fc: e015 b.n 803582a <ETH_Init+0x5a>
  71031. }
  71032. else if((hclk >= 35000000)&&(hclk < 60000000))
  71033. 80357fe: 4a89 ldr r2, [pc, #548] ; (8035a24 <ETH_Init+0x254>)
  71034. 8035800: 4989 ldr r1, [pc, #548] ; (8035a28 <ETH_Init+0x258>)
  71035. 8035802: 189a adds r2, r3, r2
  71036. 8035804: 428a cmp r2, r1
  71037. 8035806: d802 bhi.n 803580e <ETH_Init+0x3e>
  71038. {
  71039. /* CSR Clock Range between 35-60 MHz */
  71040. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div26;
  71041. 8035808: f045 050c orr.w r5, r5, #12
  71042. 803580c: e00d b.n 803582a <ETH_Init+0x5a>
  71043. }
  71044. else if((hclk >= 60000000)&&(hclk < 100000000))
  71045. 803580e: 4a87 ldr r2, [pc, #540] ; (8035a2c <ETH_Init+0x25c>)
  71046. 8035810: 4987 ldr r1, [pc, #540] ; (8035a30 <ETH_Init+0x260>)
  71047. 8035812: 189a adds r2, r3, r2
  71048. 8035814: 428a cmp r2, r1
  71049. 8035816: d908 bls.n 803582a <ETH_Init+0x5a>
  71050. {
  71051. /* CSR Clock Range between 60-100 MHz */
  71052. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div42;
  71053. }
  71054. else if((hclk >= 100000000)&&(hclk < 150000000))
  71055. 8035818: 4a86 ldr r2, [pc, #536] ; (8035a34 <ETH_Init+0x264>)
  71056. 803581a: 189a adds r2, r3, r2
  71057. 803581c: 4b86 ldr r3, [pc, #536] ; (8035a38 <ETH_Init+0x268>)
  71058. 803581e: 429a cmp r2, r3
  71059. {
  71060. /* CSR Clock Range between 100-150 MHz */
  71061. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div62;
  71062. 8035820: bf94 ite ls
  71063. 8035822: f045 0504 orrls.w r5, r5, #4
  71064. }
  71065. else /* ((hclk >= 150000000)&&(hclk <= 168000000)) */
  71066. {
  71067. /* CSR Clock Range between 150-168 MHz */
  71068. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div102;
  71069. 8035826: f045 0510 orrhi.w r5, r5, #16
  71070. }
  71071. /* Write to ETHERNET MAC MIIAR: Configure the ETHERNET CSR Clock Range */
  71072. ETH->MACMIIAR = (uint32_t)tmpreg;
  71073. 803582a: 613d str r5, [r7, #16]
  71074. /*-------------------- PHY initialization and configuration ----------------*/
  71075. /* Put the PHY in reset mode */
  71076. if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_Reset)))
  71077. 803582c: 4630 mov r0, r6
  71078. 803582e: 2100 movs r1, #0
  71079. 8035830: f44f 4200 mov.w r2, #32768 ; 0x8000
  71080. 8035834: f7ff ffa4 bl 8035780 <ETH_WritePHYRegister>
  71081. 8035838: b908 cbnz r0, 803583e <ETH_Init+0x6e>
  71082. {
  71083. /* Return ERROR in case of write timeout */
  71084. return ETH_ERROR;
  71085. 803583a: 2000 movs r0, #0
  71086. 803583c: e0e9 b.n 8035a12 <ETH_Init+0x242>
  71087. }
  71088. /* Delay to assure PHY reset */
  71089. _eth_delay_(PHY_RESET_DELAY);
  71090. 803583e: 487f ldr r0, [pc, #508] ; (8035a3c <ETH_Init+0x26c>)
  71091. 8035840: f7ff fd6e bl 8035320 <ETH_Delay>
  71092. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  71093. 8035844: 6821 ldr r1, [r4, #0]
  71094. 8035846: 2900 cmp r1, #0
  71095. 8035848: d050 beq.n 80358ec <ETH_Init+0x11c>
  71096. {
  71097. /* We wait for linked status... */
  71098. do
  71099. {
  71100. timeout++;
  71101. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  71102. 803584a: 4d7d ldr r5, [pc, #500] ; (8035a40 <ETH_Init+0x270>)
  71103. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  71104. {
  71105. /* We wait for linked status... */
  71106. do
  71107. {
  71108. timeout++;
  71109. 803584c: 9b01 ldr r3, [sp, #4]
  71110. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  71111. 803584e: 4630 mov r0, r6
  71112. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  71113. {
  71114. /* We wait for linked status... */
  71115. do
  71116. {
  71117. timeout++;
  71118. 8035850: 3301 adds r3, #1
  71119. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  71120. 8035852: 2101 movs r1, #1
  71121. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  71122. {
  71123. /* We wait for linked status... */
  71124. do
  71125. {
  71126. timeout++;
  71127. 8035854: 9301 str r3, [sp, #4]
  71128. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  71129. 8035856: f7ff ff67 bl 8035728 <ETH_ReadPHYRegister>
  71130. 803585a: f000 0004 and.w r0, r0, #4
  71131. 803585e: b280 uxth r0, r0
  71132. 8035860: b910 cbnz r0, 8035868 <ETH_Init+0x98>
  71133. 8035862: 9b01 ldr r3, [sp, #4]
  71134. 8035864: 42ab cmp r3, r5
  71135. 8035866: d9f1 bls.n 803584c <ETH_Init+0x7c>
  71136. /* Return ERROR in case of timeout */
  71137. if(timeout == PHY_READ_TO)
  71138. 8035868: 9a01 ldr r2, [sp, #4]
  71139. 803586a: 4b76 ldr r3, [pc, #472] ; (8035a44 <ETH_Init+0x274>)
  71140. 803586c: 429a cmp r2, r3
  71141. 803586e: d0e4 beq.n 803583a <ETH_Init+0x6a>
  71142. {
  71143. return ETH_ERROR;
  71144. }
  71145. /* Reset Timeout counter */
  71146. timeout = 0;
  71147. 8035870: 2100 movs r1, #0
  71148. /* Enable Auto-Negotiation */
  71149. if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation)))
  71150. 8035872: 4630 mov r0, r6
  71151. 8035874: f44f 5280 mov.w r2, #4096 ; 0x1000
  71152. {
  71153. return ETH_ERROR;
  71154. }
  71155. /* Reset Timeout counter */
  71156. timeout = 0;
  71157. 8035878: 9101 str r1, [sp, #4]
  71158. /* Enable Auto-Negotiation */
  71159. if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation)))
  71160. 803587a: f7ff ff81 bl 8035780 <ETH_WritePHYRegister>
  71161. 803587e: 2800 cmp r0, #0
  71162. 8035880: d0db beq.n 803583a <ETH_Init+0x6a>
  71163. /* Wait until the auto-negotiation will be completed */
  71164. do
  71165. {
  71166. timeout++;
  71167. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  71168. 8035882: 4d6f ldr r5, [pc, #444] ; (8035a40 <ETH_Init+0x270>)
  71169. }
  71170. /* Wait until the auto-negotiation will be completed */
  71171. do
  71172. {
  71173. timeout++;
  71174. 8035884: 9b01 ldr r3, [sp, #4]
  71175. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  71176. 8035886: 4630 mov r0, r6
  71177. }
  71178. /* Wait until the auto-negotiation will be completed */
  71179. do
  71180. {
  71181. timeout++;
  71182. 8035888: 3301 adds r3, #1
  71183. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  71184. 803588a: 2101 movs r1, #1
  71185. }
  71186. /* Wait until the auto-negotiation will be completed */
  71187. do
  71188. {
  71189. timeout++;
  71190. 803588c: 9301 str r3, [sp, #4]
  71191. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  71192. 803588e: f7ff ff4b bl 8035728 <ETH_ReadPHYRegister>
  71193. 8035892: f000 0020 and.w r0, r0, #32
  71194. 8035896: b280 uxth r0, r0
  71195. 8035898: b910 cbnz r0, 80358a0 <ETH_Init+0xd0>
  71196. 803589a: 9b01 ldr r3, [sp, #4]
  71197. 803589c: 42ab cmp r3, r5
  71198. 803589e: d9f1 bls.n 8035884 <ETH_Init+0xb4>
  71199. /* Return ERROR in case of timeout */
  71200. if(timeout == PHY_READ_TO)
  71201. 80358a0: 9a01 ldr r2, [sp, #4]
  71202. 80358a2: 4b68 ldr r3, [pc, #416] ; (8035a44 <ETH_Init+0x274>)
  71203. 80358a4: 429a cmp r2, r3
  71204. 80358a6: d0c8 beq.n 803583a <ETH_Init+0x6a>
  71205. {
  71206. return ETH_ERROR;
  71207. }
  71208. /* Reset Timeout counter */
  71209. timeout = 0;
  71210. 80358a8: 2500 movs r5, #0
  71211. /* Read the result of the auto-negotiation */
  71212. RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR);
  71213. 80358aa: 211f movs r1, #31
  71214. 80358ac: 4630 mov r0, r6
  71215. {
  71216. return ETH_ERROR;
  71217. }
  71218. /* Reset Timeout counter */
  71219. timeout = 0;
  71220. 80358ae: 9501 str r5, [sp, #4]
  71221. /* Read the result of the auto-negotiation */
  71222. RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR);
  71223. 80358b0: f7ff ff3a bl 8035728 <ETH_ReadPHYRegister>
  71224. switch (RegValue & PHY_DUPLEX_SPEED_STATUS_MASK)
  71225. 80358b4: f000 001c and.w r0, r0, #28
  71226. 80358b8: 2808 cmp r0, #8
  71227. 80358ba: d00b beq.n 80358d4 <ETH_Init+0x104>
  71228. 80358bc: d802 bhi.n 80358c4 <ETH_Init+0xf4>
  71229. 80358be: 2804 cmp r0, #4
  71230. 80358c0: d123 bne.n 803590a <ETH_Init+0x13a>
  71231. 80358c2: e010 b.n 80358e6 <ETH_Init+0x116>
  71232. 80358c4: 280e cmp r0, #14
  71233. 80358c6: d00a beq.n 80358de <ETH_Init+0x10e>
  71234. 80358c8: 2812 cmp r0, #18
  71235. 80358ca: d11e bne.n 803590a <ETH_Init+0x13a>
  71236. {
  71237. case PHY_100BTX_FULL:
  71238. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  71239. 80358cc: f44f 6300 mov.w r3, #2048 ; 0x800
  71240. 80358d0: 6223 str r3, [r4, #32]
  71241. 80358d2: e000 b.n 80358d6 <ETH_Init+0x106>
  71242. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  71243. break;
  71244. case PHY_100BTX_HALF:
  71245. ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
  71246. 80358d4: 6225 str r5, [r4, #32]
  71247. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  71248. 80358d6: f44f 4380 mov.w r3, #16384 ; 0x4000
  71249. 80358da: 6163 str r3, [r4, #20]
  71250. break;
  71251. 80358dc: e015 b.n 803590a <ETH_Init+0x13a>
  71252. case PHY_10M_FULL:
  71253. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  71254. 80358de: f44f 6300 mov.w r3, #2048 ; 0x800
  71255. 80358e2: 6223 str r3, [r4, #32]
  71256. 80358e4: e000 b.n 80358e8 <ETH_Init+0x118>
  71257. ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
  71258. break;
  71259. case PHY_10M_HALF:
  71260. ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
  71261. 80358e6: 6225 str r5, [r4, #32]
  71262. ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
  71263. 80358e8: 6165 str r5, [r4, #20]
  71264. break;
  71265. 80358ea: e00e b.n 803590a <ETH_Init+0x13a>
  71266. break;
  71267. }
  71268. }
  71269. else
  71270. {
  71271. if(!ETH_WritePHYRegister(PHYAddress, PHY_BCR, ((uint16_t)(ETH_InitStruct->ETH_Mode >> 3) |
  71272. 80358ec: 6a22 ldr r2, [r4, #32]
  71273. (uint16_t)(ETH_InitStruct->ETH_Speed >> 1))))
  71274. 80358ee: 6963 ldr r3, [r4, #20]
  71275. break;
  71276. }
  71277. }
  71278. else
  71279. {
  71280. if(!ETH_WritePHYRegister(PHYAddress, PHY_BCR, ((uint16_t)(ETH_InitStruct->ETH_Mode >> 3) |
  71281. 80358f0: 08d2 lsrs r2, r2, #3
  71282. 80358f2: ea42 0253 orr.w r2, r2, r3, lsr #1
  71283. 80358f6: 4630 mov r0, r6
  71284. 80358f8: b292 uxth r2, r2
  71285. 80358fa: f7ff ff41 bl 8035780 <ETH_WritePHYRegister>
  71286. 80358fe: 2800 cmp r0, #0
  71287. 8035900: d09b beq.n 803583a <ETH_Init+0x6a>
  71288. {
  71289. /* Return ERROR in case of write timeout */
  71290. return ETH_ERROR;
  71291. }
  71292. /* Delay to assure PHY configuration */
  71293. _eth_delay_(PHY_CONFIG_DELAY);
  71294. 8035902: f06f 407f mvn.w r0, #4278190080 ; 0xff000000
  71295. 8035906: f7ff fd0b bl 8035320 <ETH_Delay>
  71296. }
  71297. /*------------------------ ETHERNET MACCR Configuration --------------------*/
  71298. /* Get the ETHERNET MACCR value */
  71299. tmpreg = ETH->MACCR;
  71300. 803590a: 4b43 ldr r3, [pc, #268] ; (8035a18 <ETH_Init+0x248>)
  71301. /* Clear WD, PCE, PS, TE and RE bits */
  71302. tmpreg &= MACCR_CLEAR_MASK;
  71303. 803590c: 4a4e ldr r2, [pc, #312] ; (8035a48 <ETH_Init+0x278>)
  71304. _eth_delay_(PHY_CONFIG_DELAY);
  71305. }
  71306. /*------------------------ ETHERNET MACCR Configuration --------------------*/
  71307. /* Get the ETHERNET MACCR value */
  71308. tmpreg = ETH->MACCR;
  71309. 803590e: 6819 ldr r1, [r3, #0]
  71310. /* Set the IPCO bit according to ETH_ChecksumOffload value */
  71311. /* Set the DR bit according to ETH_RetryTransmission value */
  71312. /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */
  71313. /* Set the BL bit according to ETH_BackOffLimit value */
  71314. /* Set the DC bit according to ETH_DeferralCheck value */
  71315. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog |
  71316. 8035910: 68a0 ldr r0, [r4, #8]
  71317. }
  71318. /*------------------------ ETHERNET MACCR Configuration --------------------*/
  71319. /* Get the ETHERNET MACCR value */
  71320. tmpreg = ETH->MACCR;
  71321. /* Clear WD, PCE, PS, TE and RE bits */
  71322. tmpreg &= MACCR_CLEAR_MASK;
  71323. 8035912: 400a ands r2, r1
  71324. /* Set the IPCO bit according to ETH_ChecksumOffload value */
  71325. /* Set the DR bit according to ETH_RetryTransmission value */
  71326. /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */
  71327. /* Set the BL bit according to ETH_BackOffLimit value */
  71328. /* Set the DC bit according to ETH_DeferralCheck value */
  71329. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog |
  71330. 8035914: 6861 ldr r1, [r4, #4]
  71331. 8035916: 4308 orrs r0, r1
  71332. ETH_InitStruct->ETH_Jabber |
  71333. 8035918: 68e1 ldr r1, [r4, #12]
  71334. 803591a: 4308 orrs r0, r1
  71335. ETH_InitStruct->ETH_InterFrameGap |
  71336. 803591c: 6921 ldr r1, [r4, #16]
  71337. 803591e: 4308 orrs r0, r1
  71338. ETH_InitStruct->ETH_CarrierSense |
  71339. 8035920: 6961 ldr r1, [r4, #20]
  71340. 8035922: 4308 orrs r0, r1
  71341. ETH_InitStruct->ETH_Speed |
  71342. 8035924: 69a1 ldr r1, [r4, #24]
  71343. 8035926: 4308 orrs r0, r1
  71344. ETH_InitStruct->ETH_ReceiveOwn |
  71345. 8035928: 69e1 ldr r1, [r4, #28]
  71346. 803592a: 4308 orrs r0, r1
  71347. ETH_InitStruct->ETH_LoopbackMode |
  71348. 803592c: 6a21 ldr r1, [r4, #32]
  71349. 803592e: 4308 orrs r0, r1
  71350. ETH_InitStruct->ETH_Mode |
  71351. 8035930: 6a61 ldr r1, [r4, #36] ; 0x24
  71352. 8035932: 4308 orrs r0, r1
  71353. ETH_InitStruct->ETH_ChecksumOffload |
  71354. 8035934: 6aa1 ldr r1, [r4, #40] ; 0x28
  71355. 8035936: 4308 orrs r0, r1
  71356. ETH_InitStruct->ETH_RetryTransmission |
  71357. 8035938: 6ae1 ldr r1, [r4, #44] ; 0x2c
  71358. 803593a: 4308 orrs r0, r1
  71359. ETH_InitStruct->ETH_AutomaticPadCRCStrip |
  71360. 803593c: 6b21 ldr r1, [r4, #48] ; 0x30
  71361. 803593e: 4308 orrs r0, r1
  71362. /* Set the IPCO bit according to ETH_ChecksumOffload value */
  71363. /* Set the DR bit according to ETH_RetryTransmission value */
  71364. /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */
  71365. /* Set the BL bit according to ETH_BackOffLimit value */
  71366. /* Set the DC bit according to ETH_DeferralCheck value */
  71367. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog |
  71368. 8035940: 6b61 ldr r1, [r4, #52] ; 0x34
  71369. 8035942: 4301 orrs r1, r0
  71370. 8035944: 430a orrs r2, r1
  71371. ETH_InitStruct->ETH_RetryTransmission |
  71372. ETH_InitStruct->ETH_AutomaticPadCRCStrip |
  71373. ETH_InitStruct->ETH_BackOffLimit |
  71374. ETH_InitStruct->ETH_DeferralCheck);
  71375. /* Write to ETHERNET MACCR */
  71376. ETH->MACCR = (uint32_t)tmpreg;
  71377. 8035946: 601a str r2, [r3, #0]
  71378. /* Set the DAIF bit according to ETH_DestinationAddrFilter value */
  71379. /* Set the PR bit according to ETH_PromiscuousMode value */
  71380. /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */
  71381. /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */
  71382. /* Write to ETHERNET MACFFR */
  71383. ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll |
  71384. 8035948: 6ba2 ldr r2, [r4, #56] ; 0x38
  71385. 803594a: 6be1 ldr r1, [r4, #60] ; 0x3c
  71386. 803594c: 4311 orrs r1, r2
  71387. ETH_InitStruct->ETH_SourceAddrFilter |
  71388. 803594e: 6c22 ldr r2, [r4, #64] ; 0x40
  71389. 8035950: 4311 orrs r1, r2
  71390. ETH_InitStruct->ETH_PassControlFrames |
  71391. 8035952: 6c62 ldr r2, [r4, #68] ; 0x44
  71392. 8035954: 4311 orrs r1, r2
  71393. ETH_InitStruct->ETH_BroadcastFramesReception |
  71394. 8035956: 6ca2 ldr r2, [r4, #72] ; 0x48
  71395. 8035958: 4311 orrs r1, r2
  71396. ETH_InitStruct->ETH_DestinationAddrFilter |
  71397. 803595a: 6ce2 ldr r2, [r4, #76] ; 0x4c
  71398. 803595c: 4311 orrs r1, r2
  71399. ETH_InitStruct->ETH_PromiscuousMode |
  71400. 803595e: 6d22 ldr r2, [r4, #80] ; 0x50
  71401. 8035960: 4311 orrs r1, r2
  71402. /* Set the DAIF bit according to ETH_DestinationAddrFilter value */
  71403. /* Set the PR bit according to ETH_PromiscuousMode value */
  71404. /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */
  71405. /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */
  71406. /* Write to ETHERNET MACFFR */
  71407. ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll |
  71408. 8035962: 6d62 ldr r2, [r4, #84] ; 0x54
  71409. 8035964: 430a orrs r2, r1
  71410. 8035966: 605a str r2, [r3, #4]
  71411. ETH_InitStruct->ETH_PromiscuousMode |
  71412. ETH_InitStruct->ETH_MulticastFramesFilter |
  71413. ETH_InitStruct->ETH_UnicastFramesFilter);
  71414. /*--------------- ETHERNET MACHTHR and MACHTLR Configuration ---------------*/
  71415. /* Write to ETHERNET MACHTHR */
  71416. ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh;
  71417. 8035968: 6da2 ldr r2, [r4, #88] ; 0x58
  71418. 803596a: 609a str r2, [r3, #8]
  71419. /* Write to ETHERNET MACHTLR */
  71420. ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow;
  71421. 803596c: 6de2 ldr r2, [r4, #92] ; 0x5c
  71422. 803596e: 60da str r2, [r3, #12]
  71423. /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
  71424. /* Set the PLT bit according to ETH_PauseLowThreshold value */
  71425. /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
  71426. /* Set the RFE bit according to ETH_ReceiveFlowControl value */
  71427. /* Set the TFE bit according to ETH_TransmitFlowControl value */
  71428. tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) |
  71429. 8035970: 6e62 ldr r2, [r4, #100] ; 0x64
  71430. 8035972: 6ea1 ldr r1, [r4, #104] ; 0x68
  71431. ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh;
  71432. /* Write to ETHERNET MACHTLR */
  71433. ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow;
  71434. /*----------------------- ETHERNET MACFCR Configuration --------------------*/
  71435. /* Get the ETHERNET MACFCR value */
  71436. tmpreg = ETH->MACFCR;
  71437. 8035974: 6998 ldr r0, [r3, #24]
  71438. /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
  71439. /* Set the PLT bit according to ETH_PauseLowThreshold value */
  71440. /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
  71441. /* Set the RFE bit according to ETH_ReceiveFlowControl value */
  71442. /* Set the TFE bit according to ETH_TransmitFlowControl value */
  71443. tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) |
  71444. 8035976: 4311 orrs r1, r2
  71445. ETH_InitStruct->ETH_ZeroQuantaPause |
  71446. 8035978: 6ee2 ldr r2, [r4, #108] ; 0x6c
  71447. 803597a: 4311 orrs r1, r2
  71448. ETH_InitStruct->ETH_PauseLowThreshold |
  71449. 803597c: 6f22 ldr r2, [r4, #112] ; 0x70
  71450. 803597e: 4311 orrs r1, r2
  71451. ETH_InitStruct->ETH_UnicastPauseFrameDetect |
  71452. 8035980: 6f62 ldr r2, [r4, #116] ; 0x74
  71453. 8035982: 4311 orrs r1, r2
  71454. ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow;
  71455. /*----------------------- ETHERNET MACFCR Configuration --------------------*/
  71456. /* Get the ETHERNET MACFCR value */
  71457. tmpreg = ETH->MACFCR;
  71458. /* Clear xx bits */
  71459. tmpreg &= MACFCR_CLEAR_MASK;
  71460. 8035984: f64f 7241 movw r2, #65345 ; 0xff41
  71461. 8035988: 4002 ands r2, r0
  71462. /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
  71463. /* Set the PLT bit according to ETH_PauseLowThreshold value */
  71464. /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
  71465. /* Set the RFE bit according to ETH_ReceiveFlowControl value */
  71466. /* Set the TFE bit according to ETH_TransmitFlowControl value */
  71467. tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) |
  71468. 803598a: 430a orrs r2, r1
  71469. 803598c: 6e21 ldr r1, [r4, #96] ; 0x60
  71470. 803598e: ea42 4101 orr.w r1, r2, r1, lsl #16
  71471. ETH_InitStruct->ETH_PauseLowThreshold |
  71472. ETH_InitStruct->ETH_UnicastPauseFrameDetect |
  71473. ETH_InitStruct->ETH_ReceiveFlowControl |
  71474. ETH_InitStruct->ETH_TransmitFlowControl);
  71475. /* Write to ETHERNET MACFCR */
  71476. ETH->MACFCR = (uint32_t)tmpreg;
  71477. 8035992: 6199 str r1, [r3, #24]
  71478. /*----------------------- ETHERNET MACVLANTR Configuration -----------------*/
  71479. /* Set the ETV bit according to ETH_VLANTagComparison value */
  71480. /* Set the VL bit according to ETH_VLANTagIdentifier value */
  71481. ETH->MACVLANTR = (uint32_t)(ETH_InitStruct->ETH_VLANTagComparison |
  71482. 8035994: 6fe1 ldr r1, [r4, #124] ; 0x7c
  71483. 8035996: 6fa2 ldr r2, [r4, #120] ; 0x78
  71484. 8035998: 430a orrs r2, r1
  71485. 803599a: 61da str r2, [r3, #28]
  71486. ETH_InitStruct->ETH_VLANTagIdentifier);
  71487. /*-------------------------------- DMA Config ------------------------------*/
  71488. /*----------------------- ETHERNET DMAOMR Configuration --------------------*/
  71489. /* Get the ETHERNET DMAOMR value */
  71490. tmpreg = ETH->DMAOMR;
  71491. 803599c: f503 5380 add.w r3, r3, #4096 ; 0x1000
  71492. /* Clear xx bits */
  71493. tmpreg &= DMAOMR_CLEAR_MASK;
  71494. 80359a0: 4a2a ldr r2, [pc, #168] ; (8035a4c <ETH_Init+0x27c>)
  71495. ETH_InitStruct->ETH_VLANTagIdentifier);
  71496. /*-------------------------------- DMA Config ------------------------------*/
  71497. /*----------------------- ETHERNET DMAOMR Configuration --------------------*/
  71498. /* Get the ETHERNET DMAOMR value */
  71499. tmpreg = ETH->DMAOMR;
  71500. 80359a2: 6999 ldr r1, [r3, #24]
  71501. /* Set the TTC bit according to ETH_TransmitThresholdControl value */
  71502. /* Set the FEF bit according to ETH_ForwardErrorFrames value */
  71503. /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
  71504. /* Set the RTC bit according to ETH_ReceiveThresholdControl value */
  71505. /* Set the OSF bit according to ETH_SecondFrameOperate value */
  71506. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
  71507. 80359a4: f8d4 0084 ldr.w r0, [r4, #132] ; 0x84
  71508. /*-------------------------------- DMA Config ------------------------------*/
  71509. /*----------------------- ETHERNET DMAOMR Configuration --------------------*/
  71510. /* Get the ETHERNET DMAOMR value */
  71511. tmpreg = ETH->DMAOMR;
  71512. /* Clear xx bits */
  71513. tmpreg &= DMAOMR_CLEAR_MASK;
  71514. 80359a8: 400a ands r2, r1
  71515. /* Set the TTC bit according to ETH_TransmitThresholdControl value */
  71516. /* Set the FEF bit according to ETH_ForwardErrorFrames value */
  71517. /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
  71518. /* Set the RTC bit according to ETH_ReceiveThresholdControl value */
  71519. /* Set the OSF bit according to ETH_SecondFrameOperate value */
  71520. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
  71521. 80359aa: f8d4 1080 ldr.w r1, [r4, #128] ; 0x80
  71522. 80359ae: 4308 orrs r0, r1
  71523. ETH_InitStruct->ETH_ReceiveStoreForward |
  71524. 80359b0: f8d4 1088 ldr.w r1, [r4, #136] ; 0x88
  71525. 80359b4: 4308 orrs r0, r1
  71526. ETH_InitStruct->ETH_FlushReceivedFrame |
  71527. 80359b6: f8d4 108c ldr.w r1, [r4, #140] ; 0x8c
  71528. 80359ba: 4308 orrs r0, r1
  71529. ETH_InitStruct->ETH_TransmitStoreForward |
  71530. 80359bc: f8d4 1090 ldr.w r1, [r4, #144] ; 0x90
  71531. 80359c0: 4308 orrs r0, r1
  71532. ETH_InitStruct->ETH_TransmitThresholdControl |
  71533. 80359c2: f8d4 1094 ldr.w r1, [r4, #148] ; 0x94
  71534. 80359c6: 4308 orrs r0, r1
  71535. ETH_InitStruct->ETH_ForwardErrorFrames |
  71536. 80359c8: f8d4 1098 ldr.w r1, [r4, #152] ; 0x98
  71537. 80359cc: 4308 orrs r0, r1
  71538. ETH_InitStruct->ETH_ForwardUndersizedGoodFrames |
  71539. 80359ce: f8d4 109c ldr.w r1, [r4, #156] ; 0x9c
  71540. 80359d2: 4308 orrs r0, r1
  71541. /* Set the TTC bit according to ETH_TransmitThresholdControl value */
  71542. /* Set the FEF bit according to ETH_ForwardErrorFrames value */
  71543. /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
  71544. /* Set the RTC bit according to ETH_ReceiveThresholdControl value */
  71545. /* Set the OSF bit according to ETH_SecondFrameOperate value */
  71546. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
  71547. 80359d4: f8d4 10a0 ldr.w r1, [r4, #160] ; 0xa0
  71548. 80359d8: 4301 orrs r1, r0
  71549. 80359da: 430a orrs r2, r1
  71550. ETH_InitStruct->ETH_ForwardErrorFrames |
  71551. ETH_InitStruct->ETH_ForwardUndersizedGoodFrames |
  71552. ETH_InitStruct->ETH_ReceiveThresholdControl |
  71553. ETH_InitStruct->ETH_SecondFrameOperate);
  71554. /* Write to ETHERNET DMAOMR */
  71555. ETH->DMAOMR = (uint32_t)tmpreg;
  71556. 80359dc: 619a str r2, [r3, #24]
  71557. /* Set the FB bit according to ETH_FixedBurst value */
  71558. /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
  71559. /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
  71560. /* Set the DSL bit according to ETH_DesciptorSkipLength value */
  71561. /* Set the PR and DA bits according to ETH_DMAArbitration value */
  71562. ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
  71563. 80359de: f8d4 20a8 ldr.w r2, [r4, #168] ; 0xa8
  71564. 80359e2: f8d4 10a4 ldr.w r1, [r4, #164] ; 0xa4
  71565. 80359e6: 4311 orrs r1, r2
  71566. ETH_InitStruct->ETH_FixedBurst |
  71567. ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */
  71568. 80359e8: f8d4 20ac ldr.w r2, [r4, #172] ; 0xac
  71569. /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
  71570. /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
  71571. /* Set the DSL bit according to ETH_DesciptorSkipLength value */
  71572. /* Set the PR and DA bits according to ETH_DMAArbitration value */
  71573. ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
  71574. ETH_InitStruct->ETH_FixedBurst |
  71575. 80359ec: f441 0100 orr.w r1, r1, #8388608 ; 0x800000
  71576. ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */
  71577. 80359f0: 4311 orrs r1, r2
  71578. ETH_InitStruct->ETH_TxDMABurstLength |
  71579. 80359f2: f8d4 20b0 ldr.w r2, [r4, #176] ; 0xb0
  71580. 80359f6: 4311 orrs r1, r2
  71581. (ETH_InitStruct->ETH_DescriptorSkipLength << 2) |
  71582. 80359f8: f8d4 20b8 ldr.w r2, [r4, #184] ; 0xb8
  71583. 80359fc: 430a orrs r2, r1
  71584. 80359fe: f8d4 10b4 ldr.w r1, [r4, #180] ; 0xb4
  71585. /* Set the FB bit according to ETH_FixedBurst value */
  71586. /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
  71587. /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
  71588. /* Set the DSL bit according to ETH_DesciptorSkipLength value */
  71589. /* Set the PR and DA bits according to ETH_DMAArbitration value */
  71590. ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
  71591. 8035a02: ea42 0281 orr.w r2, r2, r1, lsl #2
  71592. 8035a06: 601a str r2, [r3, #0]
  71593. ETH_InitStruct->ETH_DMAArbitration |
  71594. ETH_DMABMR_USP); /* Enable use of separate PBL for Rx and Tx */
  71595. #ifdef USE_ENHANCED_DMA_DESCRIPTORS
  71596. /* Enable the Enhanced DMA descriptors */
  71597. ETH->DMABMR |= ETH_DMABMR_EDE;
  71598. 8035a08: 681a ldr r2, [r3, #0]
  71599. 8035a0a: f042 0280 orr.w r2, r2, #128 ; 0x80
  71600. 8035a0e: 601a str r2, [r3, #0]
  71601. #endif /* USE_ENHANCED_DMA_DESCRIPTORS */
  71602. /* Return Ethernet configuration success */
  71603. return ETH_SUCCESS;
  71604. 8035a10: 2001 movs r0, #1
  71605. }
  71606. 8035a12: b007 add sp, #28
  71607. 8035a14: bdf0 pop {r4, r5, r6, r7, pc}
  71608. 8035a16: bf00 nop
  71609. 8035a18: 40028000 .word 0x40028000
  71610. 8035a1c: feced300 .word 0xfeced300
  71611. 8035a20: 00e4e1bf .word 0x00e4e1bf
  71612. 8035a24: fde9f140 .word 0xfde9f140
  71613. 8035a28: 017d783f .word 0x017d783f
  71614. 8035a2c: fc6c7900 .word 0xfc6c7900
  71615. 8035a30: 026259ff .word 0x026259ff
  71616. 8035a34: fa0a1f00 .word 0xfa0a1f00
  71617. 8035a38: 02faf07f .word 0x02faf07f
  71618. 8035a3c: 000fffff .word 0x000fffff
  71619. 8035a40: 0004fffe .word 0x0004fffe
  71620. 8035a44: 0004ffff .word 0x0004ffff
  71621. 8035a48: ff20810f .word 0xff20810f
  71622. 8035a4c: f8de3f23 .word 0xf8de3f23
  71623. 08035a50 <_sbrk>:
  71624. extern char _ebss; // Defined by the linker
  71625. extern char __bss_end__;
  71626. static char *heap_end;
  71627. char *prev_heap_end;
  71628. if (heap_end == 0) {
  71629. 8035a50: 4b0a ldr r3, [pc, #40] ; (8035a7c <_sbrk+0x2c>)
  71630. 8035a52: 681a ldr r2, [r3, #0]
  71631. 8035a54: b90a cbnz r2, 8035a5a <_sbrk+0xa>
  71632. //heap_end = &_ebss;
  71633. heap_end = &__bss_end__;
  71634. 8035a56: 4a0a ldr r2, [pc, #40] ; (8035a80 <_sbrk+0x30>)
  71635. 8035a58: 601a str r2, [r3, #0]
  71636. }
  71637. prev_heap_end = heap_end;
  71638. 8035a5a: 681b ldr r3, [r3, #0]
  71639. */
  71640. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
  71641. {
  71642. register uint32_t result;
  71643. __ASM volatile ("MRS %0, msp\n" : "=r" (result) );
  71644. 8035a5c: f3ef 8208 mrs r2, MSP
  71645. char * stack = (char*) __get_MSP();
  71646. if (heap_end + incr > stack)
  71647. 8035a60: 1818 adds r0, r3, r0
  71648. 8035a62: 4290 cmp r0, r2
  71649. 8035a64: d905 bls.n 8035a72 <_sbrk+0x22>
  71650. {
  71651. _write (STDERR_FILENO, "Heap and stack collision\n", 25);
  71652. errno = ENOMEM;
  71653. 8035a66: 4b07 ldr r3, [pc, #28] ; (8035a84 <_sbrk+0x34>)
  71654. 8035a68: 220c movs r2, #12
  71655. 8035a6a: 601a str r2, [r3, #0]
  71656. return (caddr_t) -1;
  71657. 8035a6c: f04f 33ff mov.w r3, #4294967295
  71658. 8035a70: e001 b.n 8035a76 <_sbrk+0x26>
  71659. //abort ();
  71660. }
  71661. heap_end += incr;
  71662. 8035a72: 4a02 ldr r2, [pc, #8] ; (8035a7c <_sbrk+0x2c>)
  71663. 8035a74: 6010 str r0, [r2, #0]
  71664. return (caddr_t) prev_heap_end;
  71665. }
  71666. 8035a76: 4618 mov r0, r3
  71667. 8035a78: 4770 bx lr
  71668. 8035a7a: bf00 nop
  71669. 8035a7c: 2000e514 .word 0x2000e514
  71670. 8035a80: 2001523c .word 0x2001523c
  71671. 8035a84: 20015138 .word 0x20015138
  71672. 08035a88 <Reset_Handler>:
  71673. .weak Reset_Handler
  71674. .type Reset_Handler, %function
  71675. Reset_Handler:
  71676. /* Copy the data segment initializers from flash to SRAM */
  71677. movs r1, #0
  71678. 8035a88: 2100 movs r1, #0
  71679. b LoopCopyDataInit
  71680. 8035a8a: f000 b804 b.w 8035a96 <LoopCopyDataInit>
  71681. 08035a8e <CopyDataInit>:
  71682. CopyDataInit:
  71683. ldr r3, =_sidata
  71684. 8035a8e: 4b0d ldr r3, [pc, #52] ; (8035ac4 <LoopFillZerobss+0x16>)
  71685. ldr r3, [r3, r1]
  71686. 8035a90: 585b ldr r3, [r3, r1]
  71687. str r3, [r0, r1]
  71688. 8035a92: 5043 str r3, [r0, r1]
  71689. adds r1, r1, #4
  71690. 8035a94: 3104 adds r1, #4
  71691. 08035a96 <LoopCopyDataInit>:
  71692. LoopCopyDataInit:
  71693. ldr r0, =_sdata
  71694. 8035a96: 480c ldr r0, [pc, #48] ; (8035ac8 <LoopFillZerobss+0x1a>)
  71695. ldr r3, =_edata
  71696. 8035a98: 4b0c ldr r3, [pc, #48] ; (8035acc <LoopFillZerobss+0x1e>)
  71697. adds r2, r0, r1
  71698. 8035a9a: 1842 adds r2, r0, r1
  71699. cmp r2, r3
  71700. 8035a9c: 429a cmp r2, r3
  71701. bcc CopyDataInit
  71702. 8035a9e: f4ff aff6 bcc.w 8035a8e <CopyDataInit>
  71703. ldr r2, =_sbss
  71704. 8035aa2: 4a0b ldr r2, [pc, #44] ; (8035ad0 <LoopFillZerobss+0x22>)
  71705. b LoopFillZerobss
  71706. 8035aa4: f000 b803 b.w 8035aae <LoopFillZerobss>
  71707. 08035aa8 <FillZerobss>:
  71708. /* Zero fill the bss segment. */
  71709. FillZerobss:
  71710. movs r3, #0
  71711. 8035aa8: 2300 movs r3, #0
  71712. str r3, [r2], #4
  71713. 8035aaa: f842 3b04 str.w r3, [r2], #4
  71714. 08035aae <LoopFillZerobss>:
  71715. LoopFillZerobss:
  71716. ldr r3, = _ebss
  71717. 8035aae: 4b09 ldr r3, [pc, #36] ; (8035ad4 <LoopFillZerobss+0x26>)
  71718. cmp r2, r3
  71719. 8035ab0: 429a cmp r2, r3
  71720. bcc FillZerobss
  71721. 8035ab2: f4ff aff9 bcc.w 8035aa8 <FillZerobss>
  71722. /* Call the clock system intitialization function.*/
  71723. bl SystemInit
  71724. 8035ab6: f7f0 f965 bl 8025d84 <SystemInit>
  71725. /* Call static constructors */
  71726. bl __libc_init_array
  71727. 8035aba: f7eb fee9 bl 8021890 <__libc_init_array>
  71728. /* Call the application's entry point.*/
  71729. bl main
  71730. 8035abe: f7f1 f9dd bl 8026e7c <main>
  71731. bx lr
  71732. 8035ac2: 4770 bx lr
  71733. /* Copy the data segment initializers from flash to SRAM */
  71734. movs r1, #0
  71735. b LoopCopyDataInit
  71736. CopyDataInit:
  71737. ldr r3, =_sidata
  71738. 8035ac4: 08040a10 .word 0x08040a10
  71739. ldr r3, [r3, r1]
  71740. str r3, [r0, r1]
  71741. adds r1, r1, #4
  71742. LoopCopyDataInit:
  71743. ldr r0, =_sdata
  71744. 8035ac8: 20000000 .word 0x20000000
  71745. ldr r3, =_edata
  71746. 8035acc: 20001900 .word 0x20001900
  71747. adds r2, r0, r1
  71748. cmp r2, r3
  71749. bcc CopyDataInit
  71750. ldr r2, =_sbss
  71751. 8035ad0: 20001900 .word 0x20001900
  71752. FillZerobss:
  71753. movs r3, #0
  71754. str r3, [r2], #4
  71755. LoopFillZerobss:
  71756. ldr r3, = _ebss
  71757. 8035ad4: 2001523c .word 0x2001523c
  71758. 08035ad8 <ADC_IRQHandler>:
  71759. * @retval None
  71760. */
  71761. .section .text.Default_Handler,"ax",%progbits
  71762. Default_Handler:
  71763. Infinite_Loop:
  71764. b Infinite_Loop
  71765. 8035ad8: f7ff bffe b.w 8035ad8 <ADC_IRQHandler>
  71766. 08035adc <_ctype_>:
  71767. 8035adc: 2000 2020 2020 2020 2020 2828 2828 2028 . (((((
  71768. 8035aec: 2020 2020 2020 2020 2020 2020 2020 2020
  71769. 8035afc: 8820 1010 1010 1010 1010 1010 1010 1010 ...............
  71770. 8035b0c: 0410 0404 0404 0404 0404 1004 1010 1010 ................
  71771. 8035b1c: 1010 4141 4141 4141 0101 0101 0101 0101 ..AAAAAA........
  71772. 8035b2c: 0101 0101 0101 0101 0101 0101 1010 1010 ................
  71773. 8035b3c: 1010 4242 4242 4242 0202 0202 0202 0202 ..BBBBBB........
  71774. 8035b4c: 0202 0202 0202 0202 0202 0202 1010 1010 ................
  71775. 8035b5c: 0020 0000 0000 0000 0000 0000 0000 0000 ...............
  71776. 8035b6c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  71777. 8035b7c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  71778. 8035b8c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  71779. 8035b9c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  71780. 8035bac: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  71781. 8035bbc: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  71782. 8035bcc: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  71783. 8035bdc: 0000 0000 ....
  71784. 08035be0 <tinytens>:
  71785. 8035be0: 89bc 97d8 d2b2 3c9c a733 d5a8 f623 3949 .......<3...#.I9
  71786. 8035bf0: a73d 44f4 0ffd 32a5 979d cf8c ba08 255b =..D...2......[%
  71787. 8035c00: 6f43 64ac 0628 0e18 Co.d(...
  71788. 08035c08 <p05.5261>:
  71789. 8035c08: 0005 0000 0019 0000 007d 0000 0000 0000 ........}.......
  71790. 08035c18 <__mprec_tens>:
  71791. 8035c18: 0000 0000 0000 3ff0 0000 0000 0000 4024 .......?......$@
  71792. 8035c28: 0000 0000 0000 4059 0000 0000 4000 408f ......Y@.....@.@
  71793. 8035c38: 0000 0000 8800 40c3 0000 0000 6a00 40f8 .......@.....j.@
  71794. 8035c48: 0000 0000 8480 412e 0000 0000 12d0 4163 .......A......cA
  71795. 8035c58: 0000 0000 d784 4197 0000 0000 cd65 41cd .......A....e..A
  71796. 8035c68: 0000 2000 a05f 4202 0000 e800 4876 4237 ... _..B....vH7B
  71797. 8035c78: 0000 a200 1a94 426d 0000 e540 309c 42a2 ......mB..@..0.B
  71798. 8035c88: 0000 1e90 bcc4 42d6 0000 2634 6bf5 430c .......B..4&.k.C
  71799. 8035c98: 8000 37e0 c379 4341 a000 85d8 3457 4376 ...7y.AC....W4vC
  71800. 8035ca8: c800 674e c16d 43ab 3d00 6091 58e4 43e1 ..Ngm..C.=.`.X.C
  71801. 8035cb8: 8c40 78b5 af1d 4415 ef50 d6e2 1ae4 444b @..x...DP.....KD
  71802. 8035cc8: d592 064d f0cf 4480 4af6 c7e1 2d02 44b5 ..M....D.J...-.D
  71803. 8035cd8: 9db4 79d9 7843 44ea ...yCx.D
  71804. 08035ce0 <__mprec_tinytens>:
  71805. 8035ce0: 89bc 97d8 d2b2 3c9c a733 d5a8 f623 3949 .......<3...#.I9
  71806. 8035cf0: a73d 44f4 0ffd 32a5 979d cf8c ba08 255b =..D...2......[%
  71807. 8035d00: 6f43 64ac 0628 0ac8 Co.d(...
  71808. 08035d08 <__mprec_bigtens>:
  71809. 8035d08: 8000 37e0 c379 4341 6e17 b505 b8b5 4693 ...7y.AC.n.....F
  71810. 8035d18: f9f5 e93f 4f03 4d38 1d32 f930 7748 5a82 ..?..O8M2.0.Hw.Z
  71811. 8035d28: bf3c 7f73 4fdd 7515 454c 5f44 6c42 6e69 <.s..O.uLED_Blin
  71812. 8035d38: 006b 7542 7474 6e6f 0073 6e73 7074 6e4f k.Buttons.sntpOn
  71813. 8035d48: 6563 6953 686e 6f72 7300 746e 5070 7265 ceSinhro.sntpPer
  71814. 8035d58: 6f69 6964 5363 6e69 7268 006f 6e49 7469 iodicSinhro.Init
  71815. 8035d68: 6154 6b73 4800 7261 4664 7561 746c 0a3a Task.HardFault:.
  71816. 8035d78: 000d 0d0a 6552 6967 7473 7265 3a73 0d0a ....Registers:..
  71817. 8035d88: 5300 2050 2020 2020 2020 2020 3020 2578 .SP 0x%
  71818. 8035d98: 3830 786c 0d0a 5200 2030 2020 2020 2020 08lx...R0
  71819. 8035da8: 2020 3020 2578 3830 786c 0d0a 5200 2031 0x%08lx...R1
  71820. 8035db8: 2020 2020 2020 2020 3020 2578 3830 786c 0x%08lx
  71821. 8035dc8: 0d0a 5200 2032 2020 2020 2020 2020 3020 ...R2 0
  71822. 8035dd8: 2578 3830 786c 0d0a 5200 2033 2020 2020 x%08lx...R3
  71823. 8035de8: 2020 2020 3020 2578 3830 786c 0d0a 5200 0x%08lx...R
  71824. 8035df8: 3231 2020 2020 2020 2020 3020 2578 3830 12 0x%08
  71825. 8035e08: 786c 0d0a 4c00 2052 2020 2020 2020 2020 lx...LR
  71826. 8035e18: 3020 2578 3830 786c 0d0a 5000 2043 2020 0x%08lx...PC
  71827. 8035e28: 2020 2020 2020 3020 2578 3830 786c 0d0a 0x%08lx..
  71828. 8035e38: 5000 5253 2020 2020 2020 2020 3020 2578 .PSR 0x%
  71829. 8035e48: 3830 786c 0d0a 2500 2e30 6631 2500 0064 08lx...%0.1f.%d.
  71830. 8035e58: 3025 6934 252d 3230 2d69 3025 6932 2500 %04i-%02i-%02i.%
  71831. 8035e68: 0073 6425 d020 d0b4 2ebd 2520 2064 87d1 s.%d ..... %d ..
  71832. 8035e78: 202e 6425 d020 d0bc d0b8 2ebd 3100 302e . %d ........1.0
  71833. 8035e88: 7400 7572 0065 6166 736c 0065 6e6f 2d00 .true.false.on.-
  71834. 8035e98: 3130 252d 3230 3a69 3025 6932 2500 3230 01-%02i:%02i.%02
  71835. 8035ea8: 2d69 3025 6932 252d 3230 2d69 3130 002d i-%02i-%02i-01-.
  71836. 8035eb8: 3931 2e32 3631 2e38 2e31 0032 3931 2e32 192.168.1.2.192.
  71837. 8035ec8: 3631 2e38 2e31 0031 3532 2e35 3532 2e35 168.1.1.255.255.
  71838. 8035ed8: 3532 2e35 0030 7570 6c62 6369 4200 2d54 255.0.public.BT-
  71839. 8035ee8: 3736 3130 3000 302e 302e 302e 3000 2e38 6701.0.0.0.0.08.
  71840. 8035ef8: 3730 322e 3130 0036 4345 342d 2d43 4434 07.2016.EC-4C-4D
  71841. 8035f08: 302d 2d30 3030 302d 0041 4e4b 302d 2d33 -00-00-0A.KN-03-
  71842. 8035f18: 3030 3030 0031 6461 696d 006e 3231 3433 00001.admin.1234
  71843. 8035f28: 0035 7375 7265 3100 3332 0034 3838 312e 5.user.1234.88.1
  71844. 8035f38: 3734 322e 3435 322e 3533 6e00 6e6f 0065 47.254.235.none.
  71845. 8035f48: 3231 2e37 2e30 2e30 0031 3254 4b4f 2000 127.0.0.1.T2OK.
  71846. 8035f58: 7200 7165 6575 7473 745f 7361 006b 3151 .request_task.Q1
  71847. 8035f68: 000d 4c54 000d 0054 0d51 5300 5200 4300 ..TL..T.Q..S.R.C
  71848. 8035f78: 000d 5443 000d 0d49 4600 000d 4449 454c ..CT..I..F..IDLE
  71849. 8035f88: 0900 6325 2509 0975 7525 2509 0d75 000a ..%c.%u.%u.%u...
  71850. 8035f98: 6d54 2072 7653 0063 Tmr Svc.
  71851. 08035fa0 <data__rotek_png>:
  71852. 8035fa0: 722f 746f 6b65 702e 676e 0000 5448 5054 /rotek.png..HTTP
  71853. 8035fb0: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  71854. 8035fc0: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  71855. 8035fd0: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  71856. 8035fe0: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  71857. 8035ff0: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  71858. 8036000: 6e65 2d74 654c 676e 6874 203a 3935 3935 ent-Length: 5959
  71859. 8036010: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  71860. 8036020: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  71861. 8036030: 3a65 6920 616d 6567 702f 676e 0a0d 6143 e: image/png..Ca
  71862. 8036040: 6863 2d65 6f43 746e 6f72 3a6c 7020 6972 che-Control: pri
  71863. 8036050: 6176 6574 202c 616d 2d78 6761 3d65 3638 vate, max-age=86
  71864. 8036060: 3034 0d30 0d0a 890a 4e50 0d47 1a0a 000a 400.....PNG.....
  71865. 8036070: 0000 490d 4448 0052 0100 0057 0000 08ae ...IHDR...W.....
  71866. 8036080: 0006 0000 db82 7d4e 0000 0e17 4449 5441 ......N}....IDAT
  71867. 8036090: da78 9ded ac7d 672c c059 a1cf 7a80 3285 x...}.,gY....z.2
  71868. 80360a0: 4b45 1014 4db6 a62d ae0a b68a 52d8 45c7 EK...M-......R.E
  71869. 80360b0: 4131 1b2d 1045 0b7a 7a53 bc69 6060 634d 1A-.E.z.Szi.``Mc
  71870. 80360c0: d894 c326 6c55 d2ac c6c5 285e 2c91 951f ..&.Ul....^(.,..
  71871. 80360d0: 4a92 885d 4ad5 dd02 6a3f 9352 1ba2 36ac .J]..J..?jR....6
  71872. 80360e0: a246 011b 6d69 e76b 72d2 71fb 7729 df7d F...imk..r.q)w}.
  71873. 80360f0: 7793 9c75 cece 9fbc b333 7e7b fc7f 6f72 .wu.....3.{~..ro
  71874. 8036100: 39ce fb3b bf39 e67d 9e79 79f7 9677 e5cb .9;.9.}.y..yw...
  71875. 8036110: 000e f800 1785 0001 b900 0002 5720 0000 ............ W..
  71876. 8036120: 0ae4 0000 15c8 0000 02b9 2000 0057 4000 ........... W..@
  71877. 8036130: 00ae c800 0015 b900 0002 7200 0005 ae40 ...........r..@.
  71878. 8036140: 0000 15c8 0000 2b90 0000 0572 4000 00ae .......+..r..@..
  71879. 8036150: 8000 015c 9000 002b 7200 0005 e400 000a ..\...+..r......
  71880. 8036160: 5c80 0001 2b90 0000 5720 0000 0ae4 8000 .\...+.. W......
  71881. 8036170: 015c 0000 02b9 2000 0057 e400 000a c800 \...... W.......
  71882. 8036180: 0015 b900 0002 5720 0000 eae4 c19f 5f6b ...... W......k_
  71883. 8036190: 96b7 8fdd bede 440d 3882 9a47 ff23 def3 .......D.8G.#...
  71884. 80361a0: 3c96 d6df ed38 377d 7e56 009e c824 3375 .<..8.}7V~..$.u3
  71885. 80361b0: dae5 8c17 1304 5cc1 b4b0 de40 aa6e 138e .......\..@.n...
  71886. 80361c0: 4d23 0ae4 75c8 ca3f 4655 89a5 6192 2966 #M...u?.UF...af)
  71887. 80361d0: 3ad3 7532 44fc 1fdd 4522 80ae b75c ae56 .:2u.D.."E..\.V.
  71888. 80361e0: 8ab1 974e 202d 3b45 a644 15c8 eb90 c936 ..N.- E;D.....6.
  71889. 80361f0: 4655 8b8f a496 645a 3441 5c8b b901 ba6e UF....ZdA4.\..n.
  71890. 8036200: bb5c d524 b4b2 08c1 22b9 4057 9bae d724 \.$......"W@..$.
  71891. 8036210: a1d8 5530 2cc5 2450 231b e457 c801 cbb5 ..0U.,P$.#W.....
  71892. 8036220: 9572 da97 0763 cdd1 edd5 1557 48ff 5db3 r...c.....W..H.]
  71893. 8036230: 512b 9bb7 e63b 2364 0ae4 5c80 26bb bed7 +Q..;.d#...\.&..
  71894. 8036240: 0a45 5320 ae05 47a1 45b1 78ea 8b13 844e E. S...G.E.x..N.
  71895. 8036250: 3f6c bd16 2b90 d720 caee 6475 7971 54df l?...+ ...udqy.T
  71896. 8036260: 2951 48b1 8c27 2b91 7200 5b6d 13ae a943 Q).H'..+.rm[..C.
  71897. 8036270: 95b6 ecdf 3c59 08d6 02b9 d720 e5a6 191a ....Y<.... .....
  71898. 8036280: 38e4 1d67 1a2a 0cf5 d922 7ef9 2c10 0572 .8g.*..."..~.,r.
  71899. 8036290: dae4 b91d 8aea b5d5 a9dd 9857 1023 9c7b ..........W.#.{.
  71900. 80362a0: 302b ccd4 cec9 7db7 017e 0572 dae4 b90d +0.....}~.r.....
  71901. 80362b0: 8aea 6675 a521 caa1 ce77 722c 63b8 c28b ..uf!...w.,r.c..
  71902. 80362c0: a458 04ba 75f6 8b04 015c b6b9 572f b15d X....u..\.../W].
  71903. 80362d0: 86a6 9d42 faee ea5f 189a bd16 adf6 9160 ..B..._.......`.
  71904. 80362e0: 202b 4d57 06b9 ec14 53d4 532b d2a4 a105 + WM.....S+S....
  71905. 80362f0: 6f57 4a65 3af4 ec52 a46b e609 15c8 2b90 WoeJ.:R.k......+
  71906. 8036300: f572 58cd 6443 8efd 892e 34cd 69a3 c11d r..XCd.....4.i..
  71907. 8036310: 904e 202b e457 8bea 07a1 f6b1 2d03 f55f N.+ W........-_.
  71908. 8036320: d4bd 4755 09b0 0572 8ae4 7d5c 59e4 4733 ..UG..r...\}.Y3G
  71909. 8036330: 8eb1 bb76 b435 7525 6c14 4db6 041d 15c8 ..v.5.%u.l.M....
  71910. 8036340: ab90 5c81 0a3d 2eb6 1acf 88d7 6279 9059 ...\=.......ybY.
  71911. 8036350: 6b4a 0be6 e6ac 8c0a 872c d76e 122d 13a8 Jk......,.n.-...
  71912. 8036360: 0cec 02b9 4572 a1ae 01d2 4f23 0c8b 4bf2 ....rE....#O...K
  71913. 8036370: 5d62 af1f e749 5d41 4007 f0e2 91fc 202b b]..I.A].@....+
  71914. 8036380: e457 56ba 8b8e e89a 87d2 2758 2e01 4db1 W..V......X'...M
  71915. 8036390: ba96 09d6 5c76 1e93 9088 202b 7dd7 5726 ....v\....+ .}&W
  71916. 80363a0: c147 35a6 a185 51c8 f3ac 9606 eac4 752e G..5...Q.......u
  71917. 80363b0: 13ad 7cec bb9b 9007 202b e6d7 5ae4 c457 ...|....+ ...ZW.
  71918. 80363c0: 1d8a b472 8ba6 9a0c da9a af35 bfc9 dd56 ..r.......5...V.
  71919. 80363d0: 87b6 015c eeb9 b933 0a5a b536 074c 01a4 ..\...3.Z.6.L...
  71920. 80363e0: a5e6 9e46 0ae6 f6b8 8eb0 35b7 457a 80ae ..F........5zE..
  71921. 80363f0: 9b5c 6b91 d45d abda dad8 c7c5 8322 2155 \..k].......".U!
  71922. 8036400: 6749 b5d8 f6e9 3ad9 1d82 7e7a 905d 202b Ig.....:..z~].+
  71923. 8036410: 6dd7 ab95 60a1 8b13 f9cb e2ba 8e97 2358 .m...`........X#
  71924. 8036420: fc75 376c 52ec 9d57 d61e 22c8 f732 ea91 u.l7.RW...."2...
  71925. 8036430: 0d58 f1ad 58c5 ae3d 2ab4 afda 6b91 8824 X....X=..*...k$.
  71926. 8036440: a905 2c60 8198 9277 6bc2 323e bdbc 07ae ..`,..w..k>2....
  71927. 8036450: de5c 1ebf 7572 ec17 22c2 ab3a 074b 1ac4 \...ru...":.K...
  71928. 8036460: 542d 52b6 19b5 5873 d827 4589 baf4 20f0 -T.R..sX'..E...
  71929. 8036470: a6d7 a956 f38d 65ef 5c89 7523 cf82 4b05 ..V....e.\#u...K
  71930. 8036480: ce08 f0a8 cffa 6e0c 2bab 89d7 63e5 04cb .......n.+...c..
  71931. 8036490: 227d 7757 f6b9 842d 73d3 85ec 049d 4892 }"Ww..-..s.....H
  71932. 80364a0: 22dd c481 48b2 5a95 14a4 5f5c 50fb d7c8 ."...H.Z..\_.P..
  71933. 80364b0: ca3e b5c9 70e7 8212 713d 5ce1 0ccd 3b6e >....p..=q.\..n;
  71934. 80364c0: 280e c5d6 ac4a d5c8 b05d 4555 be9b 36c5 .(..J...].UE...6
  71935. 80364d0: 332f 8b8f 6c0c 9377 2c8d 1b3b be6c 5c4c /3...lw..,;.l.L\
  71936. 80364e0: 5b0a ddc3 e696 082d c6b9 24ea 7445 90ed .[....-....$Et..
  71937. 80364f0: 473f 8e7b 6f51 0af1 f6c4 63ea 6eae ce4f ?G{.Qo.....c.nO.
  71938. 8036500: 93d5 1760 6d86 914a fae5 26fb aac4 5823 ..`..mJ....&..#X
  71939. 8036510: 22db b4d5 39e2 e887 0e2b 77ca e07c cb33 ."...9..+..w|.3.
  71940. 8036520: 5f0b 3177 6b92 4587 fce1 1d8c 5ea3 621f ._w1.k.E.....^.b
  71941. 8036530: 169d 8ac5 dd5c dae4 b8b3 1fb4 1659 7478 ....\.......Y.xt
  71942. 8036540: a897 3aae 7a01 8f25 6875 0ab8 a6cb 7607 ...:.z%.uh.....v
  71943. 8036550: 916c b052 185d dd31 716d cd98 bf99 07fd l.R.].1.mq......
  71944. 8036560: ae88 8a1d d339 f0d4 91f6 b167 e84e 7016 ....9.....g.N..p
  71945. 8036570: ab6c 9430 cf4c d230 aaad 8fb8 fd76 892e l.0.L.0.....v...
  71946. 8036580: 348d cd66 6dd6 bd97 8c30 a344 5d00 8b03 .4f..m..0.D..]..
  71947. 8036590: e536 8cfa bd3f d10d 43b5 90ea 5d1f 9c94 6...?....C...]..
  71948. 80365a0: 7ddb 9cc3 6ead 018a 3ab9 7608 5862 ef05 .}...n...:.vbX..
  71949. 80365b0: 885b a7ac 06d1 5b65 8a14 3a35 fa0e 8b1e [.....e[..5:....
  71950. 80365c0: 3354 d3cf 5ab2 c51f a3f8 de87 ec85 679a T3...Z.........g
  71951. 80365d0: 3858 e72f 510e 8baf 1358 5cfa ca3d 20b5 X8/..Q..X..\=..
  71952. 80365e0: 45d8 915d f0a6 a9f7 a445 f13b c8b4 f7c0 .E].....E.;.....
  71953. 80365f0: c098 a2c8 5548 fcf5 be6d 9018 feeb 5fa4 ....HU..m......_
  71954. 8036600: 2738 a36d d8de ac52 c959 4063 beae 7ae4 8'm...R.Y.c@...z
  71955. 8036610: fae0 4ee9 d4dd 57fd e9bc 45ad cf21 f2ea ...N...W...E!...
  71956. 8036620: 059b d719 6cb5 1af9 52e2 d827 61be 73ce .....l...R'..a.s
  71957. 8036630: 2161 d344 892f a2c4 accd 508a cd72 9537 a!D./......Pr.7.
  71958. 8036640: 102f f7a3 814e 65be 99b4 68f8 42b5 feae /...N..e...h.B..
  71959. 8036650: dae5 7213 891d 9c76 a4a5 144c eff2 72f2 ...r..v...L....r
  71960. 8036660: 2715 4ee1 ce5d dcf1 2e4b 8937 7d74 720f .'.N]...K.7.t}.r
  71961. 8036670: 5919 a244 8255 0c8b dda3 7038 80a7 61af .YD.U.....8p...a
  71962. 8036680: 3a35 cd72 8454 5654 8938 241d 6b1b 5a92 5:r.T.TV8..$.k.Z
  71963. 8036690: 0de4 0363 ab4c b1e8 f267 e7af 22d0 b5ea ..c.L...g...."..
  71964. 80366a0: eb15 cd7c 8a7b 2b5c 845e 87fc 5532 881f ..|.{.\+^...2U..
  71965. 80366b0: b455 9b61 598f b90a ab66 88e3 7093 ab26 U.a..Y..f....p&.
  71966. 80366c0: dfcb d577 f7fb 2c84 795b 62f2 8f91 2563 ..w....,[y.b..c%
  71967. 80366d0: 9cd7 8d60 5f8a f43f dff6 79da afe5 dc1c ..`.._?....y....
  71968. 80366e0: c9f9 5e37 23ba 6bee 95e7 bfaf ef64 1e98 ..7^.#.k....d...
  71969. 80366f0: 440a 4599 c4b7 593a 9e66 2cbe 8666 6b51 .D.E..:Yf..,f.Qk
  71970. 8036700: e388 7f2e cde2 56bf 0276 6af6 ba4e 52c8 .......Vv..jN..R
  71971. 8036710: b1b0 49e6 3a9d 8244 1a3b dd8f f8a5 9be4 ...I.:D.;.......
  71972. 8036720: e2d4 78f1 b56b ae42 27ff 9ed7 d6fa bb1a ...xk.B..'......
  71973. 8036730: d38a f217 14e4 9412 258f 2215 564c 1c97 .........%."LV..
  71974. 8036740: e235 8b4a 7d42 a5f9 bebf ae56 1fa2 e773 5.J.B}....V...s.
  71975. 8036750: 5ffc f64d e67e a970 f7dd cb24 2799 9ab9 ._M.~.p...$..'..
  71976. 8036760: fd2c 849d ab92 6443 fb13 4cae 98e7 563a ,.....Cd...L..:V
  71977. 8036770: 7dcf ee3e b038 675c 9c0d 13a7 b706 cbd4 .}>.8.\g........
  71978. 8036780: dd35 bc94 9092 5ce4 ba46 5fa7 e1fd 96bd 5......\F.._....
  71979. 8036790: b29f 97e2 a894 5ca9 166b 4444 7d16 a6bb .......\k.DD.}..
  71980. 80367a0: 9cb2 8c5a 3465 9c79 e2ae 6ed6 92ef 8def ..Z.e4y....n....
  71981. 80367b0: 914d b2c3 6dca 0512 0c2e b223 9190 1462 M....m....#...b.
  71982. 80367c0: ae58 f3a1 c9d8 a980 db58 d725 08b2 ecf7 X.......X.%.....
  71983. 80367d0: 8e2b 9dec 52d0 e72e 3c1d 2d64 9ad7 7608 +....R...<d-...v
  71984. 80367e0: 49ee 3396 5cc3 2ce9 a760 1c40 b8e2 bce7 .I.3.\.,`.@.....
  71985. 80367f0: 4af3 a89b f5d2 5692 b8e7 2f21 27db f281 .J.....V..!/.'..
  71986. 8036800: 55c4 9e44 ab9e 4769 3240 e460 b6a0 475c .UD...iG@2`...\G
  71987. 8036810: 52db 1531 9d72 890b 42a6 7da8 b91b dfca .R1.r....B.}....
  71988. 8036820: b619 f97e a592 b90f 169a 7c9e adcd 5ffd ..~........|..._
  71989. 8036830: 7d9e cddd 972e b6d6 98c5 c034 fb65 83b0 .}........4.e...
  71990. 8036840: e197 7a45 531e 3e2b bb87 d720 5c9c b9fb ..Ez.S+>.. ..\..
  71991. 8036850: d542 5738 4ac0 bf2d f351 9fb7 28f8 5982 B.8W.J-.Q....(.Y
  71992. 8036860: 10a6 4216 e3ae 6895 e575 26ba 9045 806e ...B...hu..&E.n.
  71993. 8036870: 275c 9116 3aeb 3646 68cb 850b 91ac c9e5 \'...:F6.h......
  71994. 8036880: 0717 ab90 2569 34dc d195 eb76 7155 6b86 ....i%.4..v.Uq.k
  71995. 8036890: c8c8 4235 0dae 62b7 d019 2753 fc90 a7c0 ..5B...b..S'....
  71996. 80368a0: 70aa 0f35 5a2d d119 810a b6f6 ae58 36b3 .p5.-Z......X..6
  71997. 80368b0: 0e17 d214 4b01 ee8d 2680 3ae5 841e 14eb .....K...&.:....
  71998. 80368c0: b7e8 d620 c799 bae7 341c e9dc 5c80 621b .. ......4...\.b
  71999. 80368d0: b425 07dc 1135 dbd2 5ceb 3108 4961 5cca %...5....\.1aI.\
  72000. 80368e0: 2076 c954 44b5 33b0 82c3 1b53 ed72 5892 v T..D.3..S.r..X
  72001. 80368f0: 0ee7 099f 28d3 e473 b2f9 167d 8d38 fa11 .....(s...}.8...
  72002. 8036900: 3cf2 8a74 39c2 457a edae 75c8 290f f93d .<t..9zE...u.)=.
  72003. 8036910: 14af ae60 79c1 b3e2 2a0a 9d8e 8949 68cb ..`..y...*..I..h
  72004. 8036920: 4cb6 9aae 7a4b 5b4d a6ab f386 756f dae5 .L..KzM[....ou..
  72005. 8036930: 436b 32aa 5ac7 d3d2 9aea 4b9b fe07 9adb kC.2.Z.....K....
  72006. 8036940: 524c 9352 8fc0 c437 038e cfb6 95b5 2bdc LRR...7........+
  72007. 8036950: 7572 e4bb 3a77 414e 65ae b1f7 5b27 4829 ru..w:NA.e..'[)H
  72008. 8036960: 3d5f 427b f1ae b91a ebf6 f496 e87a 982e _={B........z...
  72009. 8036970: f639 36a2 203a b65b 95c1 ab44 f23e 36ad 9..6: [...D.>..6
  72010. 8036980: 5791 145d ba15 7fc1 82da e35c f38a edaf .W].......\.....
  72011. 8036990: 1a82 0d72 d724 62b4 b91d a8f7 1577 cad9 ..r.$..b....w...
  72012. 80369a0: aa7c bc8f caad c6ff b905 2d8e cb06 ee84 |..........-....
  72013. 80369b0: 6d8b 407d 5cb6 b74d 6a26 6d75 3792 c2f9 .m}@.\M.&jum.7..
  72014. 80369c0: 0c5c 6fda 6ff0 3663 d442 a742 8b00 5a08 \..o.oc6B.B....Z
  72015. 80369d0: 6b96 586c 8824 7894 b927 84ee 50c8 7bae .klX$..x'....P.{
  72016. 80369e0: 009d d2ea f7be 8b8a 1b2f 4929 16ba 620c ......../.)I...b
  72017. 80369f0: 8dcb 6304 de8b 9b52 c37d 1f5a 2d90 d823 ...c..R.}.Z..-#.
  72018. 8036a00: 8235 95b5 30eb 09c0 ba1e bfc1 1ded da07 5....0..........
  72019. 8036a10: 514c 90f4 736b ed72 445b d904 0f9a f690 LQ..ksr.[D......
  72020. 8036a20: 59e5 ae4e 423b 7bae d3b9 6895 225d 1fda .YN.;B.{...h]"..
  72021. 8036a30: cb7f 4ce1 15e6 c50d 3a67 b042 a1e7 7fd1 ...L....g:B.....
  72022. 8036a40: 56de ab31 dbd0 2aea d357 fc66 e7a1 6663 .V1....*W.f...cf
  72023. 8036a50: 3b81 4c1b c187 d194 b00f e081 32dc 9f02 .;.L.........2..
  72024. 8036a60: d720 0b66 a65a b879 a7a9 fa0f 391e eeb9 .f.Z.y......9..
  72025. 8036a70: 3ffd 8b97 6d4a e12f 7e64 30b1 a654 09aa .?..Jm/.d~.0T...
  72026. 8036a80: 6e7f 9c58 1c4a fd1b 1f5b 2d90 dcbe 2c7c .nX.J...[..-..|,
  72027. 8036a90: 348f 17cd 0166 b872 e9a6 d0ab b3fd cca6 .4..f.r.........
  72028. 8036aa0: c52d 391a c54c 21ea e6d7 3ae4 5c33 9daf -..9L..!...:3\..
  72029. 8036ab0: 4458 2326 bc75 d551 9b9b eb93 bbff bcf4 XD&#u.Q.........
  72030. 8036ac0: f5e0 b66f 422a b9c8 6a06 c1a6 3578 a620 ..o.*B...j..x5 .
  72031. 8036ad0: 55d0 b7d0 cb58 363f 3b4c 2eb8 1d7b 1c56 .U..X.?6L;..{.V.
  72032. 8036ae0: 3527 fe1c c7b2 0ecb a6ff 6a8f 34f2 d450 '5.........j.4P.
  72033. 8036af0: b214 1e0a 7fb2 67d6 a360 1afb 1236 22bd .......g`...6.."
  72034. 8036b00: 7b57 86c6 4691 1964 2c49 690a b184 646e W{...Fd.I,.i..nd
  72035. 8036b10: e420 8f9a 8d66 0e3a 9464 2226 54d9 faae ...f.:.d.&".T..
  72036. 8036b20: 912a c4eb 8262 c2d6 6871 e98b ec80 c6be *...b...qh......
  72037. 8036b30: 5792 4dd7 b309 11c0 6ea0 64c4 343b a77a .W.M.....n.d;4z.
  72038. 8036b40: 5103 cfb1 9c94 14ae 26d3 57a2 6ae4 d0cf .Q.......&.W.j..
  72039. 8036b50: ef22 b53a e378 15fa ff09 d14a b92a 4f16 ".:.x.....J.*..O
  72040. 8036b60: a36e 6d6f a139 2e4b cdad b5c9 772a f0ba n.om9.K.....*w..
  72041. 8036b70: 53b8 136e b203 8ea7 3572 6969 d9b2 69af .Sn.....r5ii...i
  72042. 8036b80: 0832 2053 cd33 6715 0683 ebaa 9e81 7f6b 2.S 3..g......k.
  72043. 8036b90: a04d 8593 5e8e ab91 913d 65c5 6257 8df9 M....^..=..eWb..
  72044. 8036ba0: 175f acf1 630a df5a a2ac 3580 8934 d446 _....cZ....54.F.
  72045. 8036bb0: b20a e554 2746 b79e ef14 b6ed 2037 48db ..T.F'......7 .H
  72046. 8036bc0: 15d8 badb 45d4 a382 91c0 9752 6406 7977 .....E....R..dwy
  72047. 8036bd0: 185b cb1f 6367 dae4 0acc 99ad 1145 6162 [...gc......E.ba
  72048. 8036be0: 1559 189e 965c 3525 cd72 8157 0667 ec51 Y...\.%5r.W.g.Q.
  72049. 8036bf0: a2a2 a0ab 7b6a 85f0 be63 d435 ec80 d778 ....j{..c.5...x.
  72050. 8036c00: 9edf 9359 89c2 b7d7 52b9 6cb0 eff2 80d2 ..Y......R.l....
  72051. 8036c10: 2eec f731 5858 4e34 207b 3757 1646 ad79 ..1.XX4N{ W7F.y.
  72052. 8036c20: 61c4 b33d 8449 a992 e76f 855e ad5c 2b24 .a=.I...o.^.\.$+
  72053. 8036c30: abb7 2831 c564 5b16 bb8a 0a76 21a4 1ae4 ..1(d..[..v..!..
  72054. 8036c40: 0662 8584 5c14 e7ab 07a1 7764 ba89 3ae7 b....\....dw...:
  72055. 8036c50: 1909 22bd 70d7 81a9 6599 3af4 c8d5 6539 ...".p...e.:..9e
  72056. 8036c60: 1f16 58b2 4a33 8ad1 64b4 9714 25db 2aa1 ...X3J...d...%.*
  72057. 8036c70: 9d6a faec f5d9 c435 6c80 e5a3 0db4 2109 j.....5..l.....!
  72058. 8036c80: 68b3 09fb ecb9 9375 9ae5 fc0e c716 a28c .h....u.........
  72059. 8036c90: e457 ceea e2d4 ae1b 292e d63f fa90 32c4 W........)?....2
  72060. 8036ca0: d222 14a9 3a27 9702 9c91 01da b477 1ada "...':......w...
  72061. 8036cb0: a07c 3dbf dcf8 df70 df2c b203 728d f2ae |..=..p.,....r..
  72062. 8036cc0: a48b b121 03f6 b65f 0e9b 4ec8 5836 f1ae ..!..._....N6X..
  72063. 8036cd0: 6fc0 8427 b1d1 6b91 a5d8 33b0 3c87 8e99 .o'....k...3.<..
  72064. 8036ce0: 7b04 b24a 91a6 42ec 1073 5688 22d4 6ea7 .{J....Bs..V.".n
  72065. 8036cf0: 96c9 12ad 4eb9 862c b8c1 ceae 42ca d16c .....N,......Bl.
  72066. 8036d00: bf2d 3a44 d628 1a26 7bfc 2c1b 5ed7 9cc0 -.D:(.&..{.,.^..
  72067. 8036d10: 0cf2 36b9 7233 6170 0df1 d3a7 620e 0972 ...63rpa.....br.
  72068. 8036d20: 1c37 dfac 36d9 edcb 30c0 5c34 de57 f9d3 7....6...04\W...
  72069. 8036d30: 9776 5b2d e3ab f46a 6691 6286 e935 3573 v.-[..j..f.b5.s5
  72070. 8036d40: 0d99 ed3b 5c88 0e17 9aab 7642 b40a bdb9 ..;..\....Bv....
  72071. 8036d50: c84b 014e 435f 6269 1ae4 ae5e 6589 5675 K.N._Cib..^..euV
  72072. 8036d60: 5be7 3273 bf08 a68b bcae bab3 b1d9 1252 .[s2..........R.
  72073. 8036d70: be2f daf2 d6ba d4a9 ae42 edba e358 00dd /.......B...X...
  72074. 8036d80: 1abb 9404 d4eb fdf1 a26d dfc1 47a6 6db7 ........m....G.m
  72075. 8036d90: 0d66 3ea4 c866 99b5 d961 cb0b 3408 ccd1 f..>f...a....4..
  72076. 8036da0: f695 203b 48d8 3fa3 1330 9d72 44d6 91ad ..; .H.?0.r..D..
  72077. 8036db0: 5ca5 8d23 3368 2109 35d7 5b83 a35c a1d5 .\#.h3.!.5.[\...
  72078. 8036dc0: f787 a9a4 ff06 4b7e 0763 1a9b 9d74 8ef9 ......~Kc...t...
  72079. 8036dd0: 915e 336b d7b9 5cba 6e97 7343 301a cd8a ^.k3...\.nCs.0..
  72080. 8036de0: 58e7 35a7 aaf9 aeda ef82 723d 75d4 5645 .X.5......=r.uEV
  72081. 8036df0: 0b5d 64d5 1e4d de36 b40d 971f e8a7 316d ]..dM.6.......m1
  72082. 8036e00: b0f0 736d 9d43 6502 919f 8a91 bad8 da2e ..msC..e........
  72083. 8036e10: a0d1 ae99 0588 6d72 b226 399b 9114 ab74 ......rm&..9..t.
  72084. 8036e20: 99ff c967 1546 07b3 eeaa 36a7 3d8a 8afb ..g.F......6.=..
  72085. 8036e30: ae23 021d 229d 9727 c5b9 3809 b1f6 057b #...."'....8..{.
  72086. 8036e40: 0e6c d5c8 f6ff 992f 0f43 c8eb 5f22 5897 l...../.C..."_.X
  72087. 8036e50: 768a d9a8 5069 f977 995a 958b 0c63 a32d .v..iPw.Z...c.-.
  72088. 8036e60: 2eca b5ca e5f8 ab12 2cf7 435d 91dc 397c .........,]C..|9
  72089. 8036e70: d720 d8ad 30a0 cc75 0d7b 2f2d e73f 9db9 ....0u.{.-/?...
  72090. 8036e80: 860e c325 d387 375c cd81 4fe5 26bf 9dfa ..%...\7...O.&..
  72091. 8036e90: 08d5 3c76 df28 7671 e553 800a 5b5c fdd8 ..v<(.qvS...\[..
  72092. 8036ea0: 4eb5 8960 0446 ef3c ee48 a4ca b698 8bf6 .N`.F.<.H.......
  72093. 8036eb0: bce5 8783 ad8a c85a 9015 722b cab5 6663 ......Z...+r..cf
  72094. 8036ec0: f703 0245 a0e9 16dd 9b18 4802 f15c f798 ..E........H\...
  72095. 8036ed0: 8b04 015c 22b9 90d7 03dd f2ba 39ea 980c ..\..".......9..
  72096. 8036ee0: d970 b2f1 f9a7 8cd8 6f22 d8b9 a1c0 0b15 p......."o......
  72097. 8036ef0: 02b9 4572 daae ac3d bdba 3d87 3395 150d ..rE..=....=.3..
  72098. 8036f00: 66c9 5206 77cd ac37 e45b 3550 c0ff dfa8 .f.R.w7.[.P5....
  72099. 8036f10: b912 7202 ae45 fdb6 7373 49c3 8948 14ea ...rE...ss.IH...
  72100. 8036f20: 21f0 d35a 838e e2b2 5555 365e 16dd 22c1 .!Z.....UU^6..."
  72101. 8036f30: 400c ddae ab92 0f6e 666b f8d1 5abc 3339 .@....n.kf...Z93
  72102. 8036f40: f752 d551 bddc 2f9a c930 09b5 5cf9 9b02 R.Q..../0....\..
  72103. 8036f50: cc59 ddb0 c128 0c22 ae40 93dd e9ab 024e Y...(.".@.....N.
  72104. 8036f60: 8ebd 507d 037a 69fd 89f7 fae1 64f4 0453 ..}Pz..i.....dS.
  72105. 8036f70: 308b b900 5376 a6ae 2203 1dc6 4068 0c8f .0..vS..."..h@..
  72106. 8036f80: 163b 1ac6 7651 3ae6 1463 02b9 4572 d6ae ;...Qv.:c...rE..
  72107. 8036f90: a883 3507 b55b 1034 9aa9 81b6 0625 9ec7 ...5[.4.....%...
  72108. 8036fa0: 98fb 8a65 015c 22b9 b2d7 ce08 9174 d4c0 ..e.\.."....t...
  72109. 8036fb0: c0f3 aa8f b125 67a1 4691 cf25 617f a913 ....%..g.F%..a..
  72110. 8036fc0: 5723 ae40 d5c8 7c66 badf 7668 da25 87be #W@...f|..hv%...
  72111. 8036fd0: 3508 d819 66ed 3ae0 b48b b04c f3b6 9146 .5...f.:..L...F.
  72112. 8036fe0: 202b e457 bf6a 6029 174d b8c0 ae62 ac40 + W.j.)`M...b.@.
  72113. 8036ff0: 9e7e 2f9f d2e0 e5c6 166b 9969 c760 c72e ~../....k.i.`...
  72114. 8037000: ae44 5c80 6b91 96d7 b6ba ee31 9d70 8760 D..\.k....1.p.`.
  72115. 8037010: 5e21 e463 c80a 7f75 d5ca 3aa6 c5df b125 !^c...u....:..%.
  72116. 8037020: 043e 859b 94e8 ae40 5c80 aff7 8b5c 5d92 >.....@..\..\..]
  72117. 8037030: 2474 6d52 5ba2 df21 35a6 7221 e405 5c8a t$Rm.[!..5!r...\
  72118. 8037040: 3343 6834 f7e0 69b9 d25e 73c2 bbed 5ce6 C34h...i^..s...\
  72119. 8037050: 2b91 5720 6ae4 cd13 5aae 7ca5 b447 750b .+ W.j...Z.|G..u
  72120. 8037060: 64dc c5b0 f393 2b91 5720 aae4 db2b 0ed5 .d.....+ W..+...
  72121. 8037070: 7503 0573 12f2 a99d 74c8 59d5 dbd0 1f2f .us......t.Y../.
  72122. 8037080: e476 c80a 0015 9000 002b 7200 0005 ae40 v.......+..r..@.
  72123. 8037090: 0000 5c80 0001 2b90 0000 0572 0000 0ae4 ...\...+..r.....
  72124. 80370a0: 8000 015c 9000 002b 2000 0057 e400 000a ..\...+.. W.....
  72125. 80370b0: 5c80 0001 b900 0002 5720 0000 0ae4 0000 .\...... W......
  72126. 80370c0: 15c8 0000 02b9 2000 0057 4000 00ae c800 ....... W..@....
  72127. 80370d0: 0015 b900 0002 7200 0005 ae40 0000 15c8 .......r..@.....
  72128. 80370e0: 0000 2b90 0000 0572 4000 00ae fb00 ae5c ...+..r..@....\.
  72129. 80370f0: f63f 6685 ca79 1883 db0e 3781 001f 6b90 ?..fy......7...k
  72130. 8037100: b940 75b6 9aff 3f92 cb76 ad45 89c3 d002 @..u...?v.E.....
  72131. 8037110: b96d 761e eb90 0433 0917 283e 82f8 41e0 m..v..3...>(...A
  72132. 8037120: 49c1 23c1 7f82 dc13 7822 e087 0d79 f5cb .I.#...."x..y...
  72133. 8037130: 824d 3af3 d72c 0b97 412e 00ae 2bdb 8bd7 M..:,....A...+..
  72134. 8037140: 9905 5c85 2e9f 4cb8 9ff0 a582 2706 d704 ...\...L.....'..
  72135. 8037150: be0b 01bb 1eb9 7c10 7045 60a7 83b7 dd72 .......|Ep.`..r.
  72136. 8037160: dc15 f821 e09a c859 6015 e4fb 103a 213c ..!...Y..`..:.<!
  72137. 8037170: d478 ae50 2c3f 27f8 a94d 7916 7058 6079 x.P.?,.'M..yXpy`
  72138. 8037180: beb9 7727 077f 283b 37d7 9608 f78a 5722 ..'w..;(.7...."W
  72139. 8037190: ed80 eb92 054b 04c7 854b 5cae 417f 8df0 ....K...K..\.A..
  72140. 80371a0: 3082 25bf bcf8 dde0 5f82 5c14 7820 e0b5 .0.%....._.\ x..
  72141. 80371b0: e0b0 2a13 5045 ec94 089f 169e ae40 122f ...*EP......@./.
  72142. 80371c0: cf1c cfdd 5557 db24 b915 101e 47fc ae4e ....WU$......GN.
  72143. 80371d0: 098f 40ce 00ae 21db d3d7 5f05 89ca 5755 ...@...!..._..UW
  72144. 80371e0: 03ae 13c1 4905 2ade a738 5446 11cf 255c .....I.*8.FT..\%
  72145. 80371f0: b478 db70 01a3 7ae4 8953 8fc8 4874 57ae x.p....zS...tH.W
  72146. 8037200: c4e5 e2ba e466 b00a 72f9 76fd dfc1 c415 ....f....r.v....
  72147. 8037210: 2dfa b90d 88ca bff0 390b 43d4 b206 a17a .-.......9.C..z.
  72148. 8037220: cbe0 e225 d4bb 5ca3 57cf b4c5 7de2 571c ..%....\.W...}.W
  72149. 8037230: bf8f b96d 40be bc70 ae44 0b92 2b91 e6c0 ..m..@p.D....+..
  72150. 8037240: 75ca 7057 4163 92ac 35fb 7ae4 4e6b 3256 .uWpcA...5.zkNV2
  72151. 8037250: fd7a 0359 9d51 f82e 35d7 d839 0baf ef9e z.Y.Q....59.....
  72152. 8037260: ae41 c532 5770 ae45 93f7 901d c7eb 88d7 A.2.pWE.........
  72153. 8037270: 3255 3c17 b90d 6c02 5ca6 b77f ac44 a0b2 U2.<...l.\..D...
  72154. 8037280: 73f5 7235 141d f544 061b 9292 8129 162f .s5r..D.....)./.
  72155. 8037290: ff6e 42a1 f6de 1e03 fae4 dc96 bef1 7829 n..B..........)x
  72156. 80372a0: b148 648a aa4f 705c 725b 4f3d 5270 5489 H..dO.\p[r=OpR.T
  72157. 80372b0: fbfe e290 399b 1ec1 ae42 9b00 5727 72d9 .....9..B...'W.r
  72158. 80372c0: b275 d620 ea93 75e7 088b 32fe ae27 5fbf u. ....u...2'.._
  72159. 80372d0: 885b 6f2a ba89 20b3 ebd6 efd4 277e 33f7 [.*o... ....~'.3
  72160. 80372e0: 8b99 cd3d ae41 12cf 2d7c bc77 723b 3bbf ..=.A...|-w.;r.;
  72161. 80372f0: fb96 5df9 8f06 a7dd 655c d5eb 399d 1e89 ...]....\e...9..
  72162. 8037300: fdcb 8eee cfdc 13ef 8a9c 015c 4736 17ae ..........\.6G..
  72163. 8037310: 08a8 18b5 1eb5 58d6 f5a1 155c ae09 f504 .......X..\.....
  72164. 8037320: 9acb 7a72 e0a6 0573 7eb1 d724 1a77 ba15 ..rz..s..~$.w...
  72165. 8037330: 2e08 9073 7beb f70b 4eb3 92ae 05a4 1eb9 ..s..{...N......
  72166. 8037340: a42c d600 55c9 0d72 0572 0cd8 9eb9 72a5 ,....Ur.r......r
  72167. 8037350: 45aa beb1 7347 ebf9 152f a3f2 d4cf d310 .E..Gs../.......
  72168. 8037360: 8229 174f 76a4 fa8b fe79 feef f72c 4ffb ).O..v..y...,..O
  72169. 8037370: ca58 0cf5 63c1 7206 57bd ba45 c94d 3bf5 X....c.r.WE.M..;
  72170. 8037380: 5f05 9035 e3eb b382 2b90 3340 bd72 7f30 ._5......+@3r.0.
  72171. 8037390: 6ef9 73c0 f704 8894 a8f5 6cc1 7c81 fe43 .n.s.......l.|C.
  72172. 80373a0: 68df 4948 a646 1637 f684 35d9 7e52 ee5b .hHIF.7....5R~[.
  72173. 80373b0: fe6f 52d9 7fae 525e aabc ab92 f7e4 941b o..R..^R........
  72174. 80373c0: 91eb e292 9555 255c e453 100a ae56 26df ....U.\%S...V..&
  72175. 80373d0: 46b8 4ab5 171d 639c d620 0453 2f9f eb11 .F.J...c .S../..
  72176. 80373e0: d467 74ef fae5 92e1 697c 4715 220b dbfb g..t....|i.G."..
  72177. 80373f0: 268a 0bfe 510b a9b1 7f5c 4d6a 4067 5c9d .&...Q..\.jMg@.\
  72178. 8037400: 531f 6f11 b968 48be a8f0 5c85 0325 0ae4 .S.oh..H...\%...
  72179. 8037410: 4e10 b7ae c417 45f8 5c25 b91d 2d1e ab11 .N.....E%\...-..
  72180. 8037420: 6fec 603d 1538 7f2b 7ee9 8d75 ae90 482e .o=`8.+..~u....H
  72181. 8037430: 1fec b754 bac0 7fbf e169 4def 2ae4 530b ..T.....i..M.*.S
  72182. 8037440: 4b73 4ab9 d53e 5c80 b93f 9c46 723a 5bbd sK.J>..\?.F.:r.[
  72183. 8037450: 0a70 0572 2308 a4d7 9044 ac7f d621 9577 p.r..#..D...!.w.
  72184. 8037460: eedc 6a4b 9665 c8e9 7cc1 7ae4 8543 de8c ..Kje....|.zC...
  72185. 8037470: 905d 3dd7 bfaa 4ab5 7160 e661 8980 0f5c ]..=...J`qa...\.
  72186. 8037480: f455 eab4 75c8 eea9 943f 2f5c b5c8 d95e U....u..?.\/..^.
  72187. 8037490: 55c8 1872 02b9 9184 6cab fffa 495c d4fb .Ur......l..\I..
  72188. 80374a0: 2a6b 7924 e091 92c9 0245 5967 73ce e7cd k*$y....E.gY.s..
  72189. 80374b0: 6f5c 235b b7a2 a417 eff5 456a 9d56 df20 \o[#......jEV. .
  72190. 80374c0: 996a 3d73 7055 079f ceb9 8a4b 3e6c 2ae4 j.s=Up....K.l>.*
  72191. 80374d0: 0317 55dc 4d21 b95d 2fde 9088 402b 8298 ...U!M]../..+@..
  72192. 80374e0: 19d6 8782 b20b 4fbc 3df0 c31a 9658 572a .......O.=..X.*W
  72193. 80374f0: ae7b b0c3 7cec c0b7 3531 35bf a12f 8583 {....|..15.5/...
  72194. 8037500: a725 0472 59e1 c59a 8fa8 6ee5 9377 5c81 %.r..Y.....nw..\
  72195. 8037510: a9af bc99 2ba5 65d7 12e5 7b5e 26b9 c215 .....+.e..^{.&..
  72196. 8037520: 9134 e4ab e45a 100a 5bae 6de0 9725 b7f9 4...Z....[.m%...
  72197. 8037530: c8a9 f576 cf37 7c13 f0a5 4f37 48aa 65d6 ..v.7..|..7O.H.e
  72198. 8037540: 8227 3eaa d7d7 9e0a fdcc 01ee 4795 6dd5 '..>.........G.m
  72199. 8037550: fffc 45ba eb9f 0bf7 f71e d728 52ff b091 ...E......(..R..
  72200. 8037560: b92f 5b3e af70 b947 109e 04bc 02b9 9184 /.>[p.G.........
  72201. 8037570: 94ab 5fe8 0897 a476 7f7e 64a0 cb18 1653 ..._..v.~..d..S.
  72202. 8037580: 3809 f36c b652 eb42 8555 5909 6252 1ae7 .8l.R.B.U..YRb..
  72203. 8037590: fe34 5717 3d68 5357 53ae 998d 26b1 9572 4..Wh=WS.S...&r.
  72204. 80375a0: a1fc b947 5d5e 4b23 b953 6e4a ae45 e100 ..G.^]#KS.JnE...
  72205. 80375b0: 1116 5f3c 50f0 9e41 0b8f 447e 5370 5889 ..<_.PA...~DpS.X
  72206. 80375c0: f3af 87b8 a0d6 3664 f1c0 d4c2 9fa9 1036 ......d6......6.
  72207. 80375d0: 4beb ab0a 74b3 0b67 4abc 2073 a9b7 1f5c .K...tg..Js ..\.
  72208. 80375e0: 1157 abb1 cf5c f350 7d59 55cb 6af2 0ae4 W...\.P.Y}.U.j..
  72209. 80375f0: 6e10 d685 4b1b fa24 4988 ab2f 06c3 7f85 .n...K$..I/.....
  72210. 8037600: 46b5 324c fd7a 0379 cab1 b4bd a5fe dfd0 .FL2z.y.........
  72211. 8037610: 02fa b90d c2ca ddd3 729a e995 9b89 2715 .........r.....'
  72212. 8037620: 6f34 69f3 720f 94fd 28a6 a84f ae19 0792 4o.i.r...(O.....
  72213. 8037630: 6f34 8f73 e9e0 15c8 dc20 d7f2 28b2 cf35 4os..... ....(5.
  72214. 8037640: aabc d597 ae41 2e2f 73cc ed5d f040 0306 ....A./..s].@...
  72215. 8037650: feb1 daa0 70b4 9a59 ad6b eb96 cb61 656d .....pY.k...a.me
  72216. 8037660: f84c 0719 c6b9 929a e174 c89d 2015 5c9c L.......t.... .\
  72217. 8037670: 134f 797c 588d 4165 85eb b701 2ed6 89db O.|y.XeA........
  72218. 8037680: e640 cf40 28d6 fd5e c39e 044e c872 fdcb @.@..(^...N.r...
  72219. 8037690: 9206 57bc e4f5 50de 78f2 b8ab 6d5b 68bc ...W...P.x..[m.h
  72220. 80376a0: d72a d453 563c 495d 213e 41b8 af71 edc1 *.S.<V]I>!.Aq...
  72221. 80376b0: 141e 177c 0572 3708 65b8 3250 f03e d511 ..|.r..7.eP2>...
  72222. 80376c0: b58a 5013 abae b43d 978e b044 0bb7 54ae ...P..=...D....T
  72223. 80376d0: 3fbf ed5f 25a5 cda3 af8f 7bc9 6f5e 87b0 .?_..%.....{^o..
  72224. 80376e0: b5d6 1186 69a8 35ce 61cf b90b 321e 408c .....i.5.a...2.@
  72225. 80376f0: 726d 2bae 43ae 00ae a761 bd62 b6cf cae5 mr.+.C..a.b.....
  72226. 8037700: ae51 be92 eec3 8faf ee18 fafe 0603 d379 Q.............y.
  72227. 8037710: dcfc 33d6 0f15 de1b 01f6 2915 caeb 54f5 ...3.......)...T
  72228. 8037720: ecd5 226f 87c8 6705 ee2a bc32 1cad 7dae ..o"...g*.2....}
  72229. 8037730: 720e 0805 5727 6339 1fe0 5c95 f0af 9e31 .r..'W9c...\..1.
  72230. 8037740: 40d0 3bae f2ea f2f9 90c2 2aea a84e f568 .@.;.......*N.h.
  72231. 8037750: ed74 fd35 dd4f a65e c629 7206 a3fd 7206 t.5.O.^.)..r...r
  72232. 8037760: 45ad 8b3e 015c cec2 7d73 bad9 81f1 c80d .E>.\...s}......
  72233. 8037770: 3f35 fb14 9522 94df 5a83 541e fa82 5a86 5?.."....Z.T...Z
  72234. 8037780: fb06 8217 a877 012e 21b3 76d5 bfbb c3fa ....w....!.v....
  72235. 8037790: b0df 60ec a270 9800 3ff3 637f aecb 24e6 ...`p....?.c...$
  72236. 80377a0: 24ed 0000 0000 4549 444e 42ae 8260 .$....IEND.B`.
  72237. 080377ae <data__main_js>:
  72238. 80377ae: 6d2f 6961 2e6e 736a 0000 0000 5448 5054 /main.js....HTTP
  72239. 80377be: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  72240. 80377ce: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  72241. 80377de: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  72242. 80377ee: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  72243. 80377fe: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  72244. 803780e: 6e65 2d74 654c 676e 6874 203a 3239 3136 ent-Length: 9261
  72245. 803781e: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  72246. 803782e: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  72247. 803783e: 3a65 6120 7070 696c 6163 6974 6e6f 782f e: application/x
  72248. 803784e: 6a2d 7661 7361 7263 7069 0d74 430a 6e6f -javascript..Con
  72249. 803785e: 6574 746e 452d 636e 646f 6e69 3a67 6720 tent-Encoding: g
  72250. 803786e: 697a 0d70 430a 6361 6568 432d 6e6f 7274 zip..Cache-Contr
  72251. 803787e: 6c6f 203a 7270 7669 7461 2c65 6d20 7861 ol: private, max
  72252. 803788e: 612d 6567 383d 3436 3030 0a0d 0a0d 8b1f -age=86400......
  72253. 803789e: 0008 0000 0000 0a04 7dcd 737b c71c e791 .........}{s....
  72254. 80378ae: 6957 caf4 b4e0 31a6 f018 c921 6833 804c Wi.....1..!.3hL.
  72255. 80378be: 490f 23dc 1e29 4909 0bbb 88c2 d47e 34cc .I.#)..I....~..4
  72256. 80378ce: d331 ea3d 21ee 1308 9088 ddec 46f5 b1d8 1.=..!.......F..
  72257. 80378de: f3ba dc5d 6c5d f3ec fbbf f693 3e99 f25a ..].]l.......>Z.
  72258. 80378ee: 11c9 09f7 6f80 bf74 aacc aeea 19ee 9080 .....ot.........
  72259. 80378fe: dde4 08bd 988b caae 657a 6665 abe5 c3ca ........zeef....
  72260. 803790e: 1279 7116 589a b56f e77c 2645 798a 5896 y..q.Xo.|.E&.y.X
  72261. 803791e: 1a51 a7ce 2922 233a dc51 0899 79fa e8f3 Q..."):#Q....y..
  72262. 803792e: 046e 9388 86a1 fa1f b891 e49b cad4 e4ef n...............
  72263. 803793e: d1c5 7444 99d2 c61f 91c5 75d7 a84b e5a0 ..Dt.......uK...
  72264. 803794e: 78bc 67e6 e856 fccd 172c 4fef bf52 3568 .x.gV...,..OR.h5
  72265. 803795e: 9de0 3c7e b56c b6c2 e9d7 735e 36b6 bc56 ..~<l.....^s.6V.
  72266. 803796e: ee95 9f62 9f61 89ba c3bc 8938 c3d2 264e ..b.a.....8...N&
  72267. 803797e: 9b3e bc8b 3f78 a7f3 65a2 2fab e9db ad47 >...x?...e./..G.
  72268. 803798e: 39c0 6939 f319 fc8c 7fc2 e79f a98a d30c .99i............
  72269. 803799e: 45ac f8fd aede ba1f e851 c9c6 10fe ddad .E......Q.......
  72270. 80379ae: 5e74 1fc8 c3b3 0dcc 62fc f43f a867 444c t^.......b?.g.LD
  72271. 80379be: 5fb6 e988 8a8c 788a 262a 5862 f9b8 f4c3 ._.....x*&bX....
  72272. 80379ce: 6450 7e6e 6513 3b22 73da af03 0fdb fd36 Pdn~.e";.s....6.
  72273. 80379de: 44ce a324 dc62 da0f a76d cec4 b06e 4c67 .D$.b...m...n.gL
  72274. 80379ee: 1c26 f08b 71e0 17e1 9302 70a9 e1f9 fdce &....q.....p....
  72275. 80379fe: 617b a826 e818 09a4 5e06 07b9 e2b2 dab6 {a&......^......
  72276. 8037a0e: ac12 4478 d1fb dc72 09b0 b6a3 65aa f147 ..xD..r......eG.
  72277. 8037a1e: e033 1682 761b 1178 8034 f7e7 cec3 ce30 3....vx.4.....0.
  72278. 8037a2e: e2f2 38d6 449e 277d f8e8 99b3 2248 04fe ...8.D}'....H"..
  72279. 8037a3e: 5564 f4e7 2115 d504 e51c 5a8a 1bbe 6e2c dU...!.....Z..,n
  72280. 8037a4e: d74e 5bd5 c51a 6cf9 1fe2 c179 b1f1 4c1d N..[...l..y....L
  72281. 8037a5e: f0d2 aec0 2168 b454 bc10 1691 a202 1b85 ....h!T.........
  72282. 8037a6e: d2e7 7042 5a59 1b08 90b4 2288 d817 64c8 ..BpYZ....."...d
  72283. 8037a7e: ef94 6387 193f 2c09 3b1e 8982 0481 22ed ...c?..,.;....."
  72284. 8037a8e: 0b9b f3db 4096 aead 98ae e2a5 08b9 85e7 .....@..........
  72285. 8037a9e: 9c88 cb17 414a 3cbf df41 f633 caf5 3626 ....JA.<A.3...&6
  72286. 8037aae: 8ac5 cf23 d206 4727 7a6b f61e e6d6 eb6c ..#...'Gkz....l.
  72287. 8037abe: 97f4 ffa7 f4e7 e9f5 4fef f25f 57df 75ae .........O_..W.u
  72288. 8037ace: 9bfa afd3 becf 4eb4 70ff 39f6 bc57 0542 .......N.p.9W.B.
  72289. 8037ade: f7fd 851a 5f67 be9c fb3a 3e09 7d7f f3f6 ....g_..:..>.}..
  72290. 8037aee: bfb3 50b2 f2fa 8bec 9fb3 f200 141b 457e ...P..........~E
  72291. 8037afe: af05 f3f0 6757 857f 7f7f cdc3 b1bf 12d0 ....Wg..........
  72292. 8037b0e: 7fa0 12a0 fdb4 7a35 9cf8 d0ea 17ec eb1d ......5z........
  72293. 8037b1e: 7ff4 2770 3b3f 657d 0001 58a3 fd68 4053 ..p'?;}e...Xh.S@
  72294. 8037b2e: f4fe 27ec dc34 a8af b3ef a1bf 9c19 dcfd ...'4...........
  72295. 8037b3e: fd3a 45b5 9fc3 9c01 0160 d1bd 30b5 d7f9 :..E....`....0..
  72296. 8037b4e: 45a8 ce83 fae6 6b6c b7d3 99c6 7a18 9876 .E....lk.....zv.
  72297. 8037b5e: a026 69ab 1c27 b6c5 4e15 3cfc ecf7 48a0 &..i'....N.<...H
  72298. 8037b6e: fc2c 16b7 0ed1 f664 e9d6 2d3f d69b bae6 ,.....d...?-....
  72299. 8037b7e: b5bf 0eb9 6dac 015d 6b5f 1489 d1a4 6811 .....m]._k.....h
  72300. 8037b8e: 173a 7159 8053 c1c2 6e31 32bd ea24 907e :.YqS...1n.2$.~.
  72301. 8037b9e: 2246 eddf 39ee a2ae b7db 4d5a 3bc4 8e20 F"...9....ZM.; .
  72302. 8037bae: 4e52 a7a1 27e9 24fe b486 3080 8454 5a0a RN...'.$...0T..Z
  72303. 8037bbe: 2177 5c25 0ee1 91dd 763b f763 7ba9 4ee0 w!%\....;vc..{.N
  72304. 8037bce: 69dc f7df 1fd0 3618 0fda e9d3 9e74 ea40 .i.....6....t.@.
  72305. 8037bde: 0ed9 00e4 0f4a b8b3 b510 90e2 a78a e27e ....J.........~.
  72306. 8037bee: b163 1f77 2e02 15aa 455c a889 5c95 c943 c.w.....\E...\C.
  72307. 8037bfe: 56b0 1d72 a325 c95a 940d a98c 9e24 51f9 .Vr.%.Z.....$..Q
  72308. 8037c0e: e194 a62b d1af 7e21 953d f990 7e01 d01f ..+...!~=....~..
  72309. 8037c1e: 2cef 07df 9ec2 d701 3b8e 0551 34b3 f02b .,.......;Q..4+.
  72310. 8037c2e: 5539 079f 2b02 b260 884d 157e a3ff 346d 9U...+`.M.~...m4
  72311. 8037c3e: 670e d3b6 c961 a225 e3e3 4296 b893 90fb .g..a.%....B....
  72312. 8037c4e: 1606 de79 bb1a 75b6 e1f7 a81a 37f7 9420 ..y....u.....7 .
  72313. 8037c5e: 6757 585f 03a0 914d a3bf 205f 97b8 83b6 Wg_X..M..._ ....
  72314. 8037c6e: e8c6 c37c 1771 88bb bb17 1bf8 c070 9edf ..|.q.......p...
  72315. 8037c7e: effe 3437 ea7c a7da ad2f bfd3 1e27 fd38 ..74|.../...'.8.
  72316. 8037c8e: 7e8a 1a4a 3c97 baf2 d41a 2571 4422 07e2 .~J..<....q%"D..
  72317. 8037c9e: 1113 4b55 5d5a b25d 83a4 f985 da3c 7dbe ..UKZ]].....<..}
  72318. 8037cae: e3f7 92c7 3ef9 0c57 6cb4 0f4d d3e6 6440 .....>W..lM...@d
  72319. 8037cbe: 09ad 203a 3eba 1cfb 742c b6d9 93db a419 ..: .>..,t......
  72320. 8037cce: 8e12 2cde 5b0e ea53 efe1 3388 2c2c d88e ...,.[S....3,,..
  72321. 8037cde: 35fb 2571 f990 f2d2 10c3 7f88 bf53 10cb .5q%........S...
  72322. 8037cee: 521d ffaf ecc2 42cf 7ac0 e0fc 43fe a36b .R.....B.z...Ck.
  72323. 8037cfe: 53c2 39b9 c9b5 aef8 08fd 6ee4 aadd 7dc8 .S.9.......n...}
  72324. 8037d0e: 3761 0d6b d702 94fe e138 16c2 0915 4b45 a7k.....8.....EK
  72325. 8037d1e: 05a7 58d6 a518 236a b696 f301 d05c b866 ...X..j#....\.f.
  72326. 8037d2e: 0db4 ebd8 3682 a5a3 c06d 6580 a49b 2412 .....6..m..e...$
  72327. 8037d3e: a48b 27cd d4a6 4a81 2541 f4cf bcf2 c49e ...'...JA%......
  72328. 8037d4e: 3de0 72c5 89e6 9f6d 03fe 2c64 019d 412f .=.r..m...d,../A
  72329. 8037d5e: af71 10c1 80bf 85c4 0730 4057 e37a b0b4 q.......0.W@z...
  72330. 8037d6e: 41db 5edb ddb1 1ff5 aeb5 d8de aeed d8dd .A.^............
  72331. 8037d7e: be3b 3f8a f7d7 cff0 f70f 778e 1bbb 037b ;..?.......w..{.
  72332. 8037d8e: c9fe 0cff 279c 7f9d b81f d6b7 053b 35f4 .....'......;..5
  72333. 8037d9e: 7ea8 fccf 5cc9 8338 6e95 05af c486 9297 .~...\8..n......
  72334. 8037dae: 6bb9 fa41 4c1c 5359 1c49 d217 1162 8ab7 .kA..LYSI...b...
  72335. 8037dbe: fec5 108d 36bb 7dd8 7512 daf6 41ad ac4f .....6.}.u...AO.
  72336. 8037dce: 9e0d 6d44 f067 5d47 8d4d 2e6d 26b9 211c ..Dmg.G]M.m..&.!
  72337. 8037dde: 3feb 2da2 d7f5 bc7e f6bd 7b17 b7ed 97d6 .?.-..~....{....
  72338. 8037dee: 0fd3 ac9d e35f 6758 a13a fa43 d39b 82df ...._.Xg:.C.....
  72339. 8037dfe: f9f9 2754 80e5 80d4 b2df f978 1d05 00ea ..T'......x.....
  72340. 8037e0e: 8906 457d f624 9535 99f2 724e 35f5 06a9 ..}E$.5...Nr.5..
  72341. 8037e1e: 13a4 457c 075a 09b4 eceb a1af fc3d c425 ..|EZ.......=.%.
  72342. 8037e2e: cfdb 376d 23fa 6e6c 0f3e 71a6 3ef1 e1ce ..m7.#ln>..q.>..
  72343. 8037e3e: c71c 52af 5a1b e9f6 312f c61c 1a95 548b ...R.Z../1.....T
  72344. 8037e4e: ce40 467e b553 bf48 29a1 3fe2 ce4c 94d4 @.~FS.H..).?L...
  72345. 8037e5e: ad58 2ba9 bf46 45a3 6c0c d207 641e 1497 X..+F..E.l...d..
  72346. 8037e6e: b5b3 c138 56b9 d27e 18f9 41d3 ce97 0348 ..8..V~....A..H.
  72347. 8037e7e: 77c8 edaf 5249 f3a5 04b1 d457 36eb 85d5 .w..IR....W..6..
  72348. 8037e8e: 7501 854a a410 b91d 2812 a6e8 5872 3757 .uJ......(..rXW7
  72349. 8037e9e: de9d da32 5697 5694 95a1 6cfe 3fd0 a78c ..2..V.V...l.?..
  72350. 8037eae: cfe8 dfee 2983 6a40 1bb8 534a ea21 5697 .....)@j..JS!..V
  72351. 8037ebe: 2a11 2c3f d98a 6923 0d1c 7112 d568 7a8b .*?,..#i...qh..z
  72352. 8037ece: b454 830d 99ef b3f8 828f 22a7 5a2c fdf6 T..........",Z..
  72353. 8037ede: cc38 3cd2 161d 821d d9dd 0879 20ad 1a02 8..<......y.. ..
  72354. 8037eee: d244 5c0a 85df c631 816a a3e8 2130 e79d D..\..1.j...0!..
  72355. 8037efe: 2728 4603 c82e 1ad3 f614 baec 45e7 cc30 ('.F.........E0.
  72356. 8037f0e: c000 0e16 2b50 4050 f3c0 bddc edda 9e7a ....P+P@......z.
  72357. 8037f1e: b418 8766 ddd1 56fc 659a 9b18 f3c1 b019 ..f....V.e......
  72358. 8037f2e: 762d f3c4 b5c2 6775 c250 a38b 4899 5687 -v....ugP....H.V
  72359. 8037f3e: bab8 921a 984c b51c c722 81e9 f22c 9614 ....L..."...,...
  72360. 8037f4e: 24e6 b51d 3bec 9659 a342 4e71 dd30 761c .$...;Y.B.qN0..v
  72361. 8037f5e: 698c b1f5 f2ba d3f0 98db 3016 a61d a4f3 .i.........0....
  72362. 8037f6e: 3b58 7ccc e0da 58a5 e526 a180 5c60 e726 X;.|...X&...`\&.
  72363. 8037f7e: 9502 e610 6450 4217 df9b 84c1 7ac9 32c3 ....Pd.B.....z.2
  72364. 8037f8e: 583d 3043 4315 0858 9377 3c48 ea67 0d00 =XC0.CX.w.H<g...
  72365. 8037f9e: 1a49 9fdb 7fa0 84d6 c01f 6d78 b67b 8e35 I.........xm{.5.
  72366. 8037fae: 48a3 3624 a1cd ba84 0c24 de06 8a2e 0e2c .H$6....$.....,.
  72367. 8037fbe: 8e60 dd90 4b97 c6e5 7ead deb2 1253 4970 `....K...~..S.pI
  72368. 8037fce: 92ef 2ffc 879a b882 08c4 043c fb54 3f22 .../......<.T."?
  72369. 8037fde: 6722 54c2 b85c 1344 82f0 4255 6f13 43f4 "g.T\.D...UB.o.C
  72370. 8037fee: c4c6 cac4 7e67 bfb2 9fb1 f70e 32af 08c6 ....g~.......2..
  72371. 8037ffe: ecce 63c6 5c3e a503 5914 613a c590 2d29 ...c>\...Y:a..)-
  72372. 803800e: 8aef dee0 95d0 2d1a d313 99f4 8658 c679 .......-....X.y.
  72373. 803801e: ea85 02e8 8728 bf4f b772 08eb 3e5b 12bb ....(.O.r...[>..
  72374. 803802e: 0df8 3453 2ee1 8198 b6a2 1886 926c 12c5 ..S4........l...
  72375. 803803e: 966c 04b4 3f5e 0b17 206f e589 3c2b 328f l...^?..o ..+<.2
  72376. 803804e: 4c96 9162 1a3a d48c 8b24 f546 4922 012c .Lb.:...$.F."I,.
  72377. 803805e: 1130 a8dd dd56 825f 0839 8acf 2e1e 6d01 0...V._.9......m
  72378. 803806e: fb48 d84a 3e94 1ba1 747d 3771 d781 7a09 H.J..>..}tq7...z
  72379. 803807e: 4b53 4b4b 38c8 3ba5 786e b05e eaba 0243 SKKK.8.;nx^...C.
  72380. 803808e: 74ad f007 b0be 8b31 a26d a383 4105 53de .t....1.m....A.S
  72381. 803809e: 2b00 0004 a051 699c a425 d934 71d7 0400 .+..Q..i%.4..q..
  72382. 80380ae: a85b d60f 4ad6 b8b9 b306 7604 500d 3952 [....J.....v.PR9
  72383. 80380be: 0294 3837 3771 35c4 d263 2d64 ff6a 1616 ..78q7.5c.d-j...
  72384. 80380ce: 375e 591e 6a0e 157b f222 a252 2c8b cbda ^7.Y.j{.".R..,..
  72385. 80380de: 4ec2 b27d 2f79 2d03 aff9 cb9c 9405 184c .N}.y/.-......L.
  72386. 80380ee: 39e0 01bc 8d46 017d 8194 cca6 e28f 6e79 .9..F.}.......yn
  72387. 80380fe: 0a20 fa16 6182 e8ca 4c32 8bf7 8df8 0966 ....a..2L....f.
  72388. 803810e: 6950 5fd4 f006 2c90 0be0 ab26 643a c0b7 Pi._...,..&.:d..
  72389. 803811e: 7045 9112 2ce6 b92f d5af bf6c 0345 f59e Ep...,/...l.E...
  72390. 803812e: e1e5 ece5 012f 6c6f 9c4d 530c c465 3c35 ..../.olM..Se.5<
  72391. 803813e: d241 03eb 80fd 80d9 18ed f2e9 fcd1 8c03 A...............
  72392. 803814e: 52ca f8f6 6790 8e08 5d5a 7ca8 9596 456f .R...g..Z].|..oE
  72393. 803815e: 220d fd4c 2aff 3b14 bca8 7ca4 7293 aa4e ."L..*.;...|.rN.
  72394. 803816e: d9fb b35f 19a1 1cd5 f527 b036 e1b5 8100 .._.....'.6.....
  72395. 803817e: 85df 62d4 7ff6 2d7c 7cf5 cf76 7abd 7b63 ...b..|-.|v..zc{
  72396. 803818e: 04f8 d1d8 7bf0 07d8 61a4 c3c3 dec0 e906 .....{...a......
  72397. 803819e: 913d 4723 668b 7d58 df12 72cd 6279 ed91 =.#G.fX}...ryb..
  72398. 80381ae: fd32 c1ff 8178 bf39 7fe2 bb27 2a54 77fc 2...x.9...'.T*.w
  72399. 80381be: 3841 2c7f e5cb 2c35 de7c e90b 3d62 52fb A8.,..5,|...b=.R
  72400. 80381ce: 2e5a da4d 801c c9eb 437f 24e5 d8f7 6a84 Z.M......C.$...j
  72401. 80381de: 377d 02e3 9ea1 7d3f d1fc ef83 5965 f3a8 }7....?}....eY..
  72402. 80381ee: f2e4 8606 c1fd 1d9d 1a5b 6419 2473 9917 ........[..ds$..
  72403. 80381fe: 1c17 71b7 7f45 ccd1 1bf0 8666 803f 41e5 ...qE.....f.?..A
  72404. 803820e: e98b d070 45a9 4956 6665 70e0 096b 25b2 ..p..EVIef.pk..%
  72405. 803821e: ada0 b52f 801d 5b89 dc1f 232d 6e31 a8a8 ../....[..-#1n..
  72406. 803822e: 0e13 885f f612 4364 c7c5 19f1 df7a 4cda .._...dC....z..L
  72407. 803823e: 9d2d 5fe9 df48 1b3b d2a9 f39f f06b 6fec -.._H.;.....k..o
  72408. 803824e: 89d8 c6c9 e9b6 d7d5 abc6 62e3 410e 7e9a ...........b.A.~
  72409. 803825e: 49cf 4440 dd90 8aff 48dd 0bff fc26 f14f .I@D.....H..&.O.
  72410. 803826e: da4b 4bcc b71c 80df 30f6 7cf0 3a46 f7cf K..K.....0.|F:..
  72411. 803827e: 3d5b f856 722b 9160 8b33 0f22 6ad2 c8a7 [=V.+r`.3."..j..
  72412. 803828e: 6bc2 7d14 f675 a5d3 638e 3f1e b41c 1d02 .k.}u....c.?....
  72413. 803829e: abfc b4db 99e7 97b9 c627 5a40 26bb 0631 ........'.@Z.&1.
  72414. 80382ae: 2250 5812 6494 f6fe a59e 6471 2b75 b801 P".X.d....qdu+..
  72415. 80382be: f13d 29b3 8a31 6d8e 0422 6321 d05a 10cd =..)1..m".!cZ...
  72416. 80382ce: 4348 2c08 6186 07cd 9c2c 39ee 7d82 a79d HC.,.a..,..9.}..
  72417. 80382de: 9c69 9150 957b fdbc 68ad 6375 3373 b670 i.P.{....hucs3p.
  72418. 80382ee: 02b6 fa2d d544 083f aa50 5006 f2fc b8c3 ..-.D.?.P..P....
  72419. 80382fe: c708 8c44 9fa1 ab0b 0bdb 23c0 7d07 d8fe ..D........#.}..
  72420. 803830e: 19e8 0c11 2690 da37 1f49 89fa 9898 0bd3 .....&7.I.......
  72421. 803831e: 9ee0 5e79 82dc 8445 a8f3 a58f b471 c616 ..y^..E.....q...
  72422. 803832e: 9a54 54c1 bfe5 606e 75e8 677e 67ea ed07 T..T..n`.u~g.g..
  72423. 803833e: 9ab0 f811 9fc8 8fe6 6204 f9a5 4218 0b4e .........b...BN.
  72424. 803834e: 9b0b e47e 4269 3164 dbb0 fdf7 dc62 7cc9 ..~.iBd1....b..|
  72425. 803835e: 6844 40a7 a95d 969f abfa 5c42 27c7 ba04 Dh.@].....B\.'..
  72426. 803836e: 9c37 bd7e 3ae0 7044 e4bd c75d 17ad 6b5c 7.~..:Dp..]...\k
  72427. 803837e: 2016 509a 5887 7828 09a7 d571 43e9 6e6e . .P.X(x..q..Cnn
  72428. 803838e: c2df 54fe 6cba 3c2d 7dbd 69cb 4dc3 4bfe ...T.l-<.}.i.M.K
  72429. 803839e: 1eb6 5f6f 7800 04db b154 f3e4 55bb dc00 ..o_.x..T....U..
  72430. 80383ae: 7ff7 b9c1 3a4e 0e96 9f3c 4adf d443 219a ....N:..<..JC..!
  72431. 80383be: 7d4c 0b7e 1254 0ff0 8078 14d9 b0a1 6c1a L}~.T...x......l
  72432. 80383ce: b030 ff4f 7827 0e9e d7fa 0390 8ec4 f02a 0.O.'x........*.
  72433. 80383de: b568 1e6e 10cd 73a3 9eec fa7d 219f fe0c h.n....s..}..!..
  72434. 80383ee: 2592 1d05 2f47 e1d9 25f7 d220 2f34 34ac .%..G/...% .4/.4
  72435. 80383fe: 6eb3 c3ce 4703 918e 4793 36a8 ab48 2bbe .n...G...G.6H..+
  72436. 803840e: 1cd7 fa0c 140f c10e f6b9 7a92 67ff 9fc8 ...........z.g..
  72437. 803841e: 82df 7fef 214f fa47 fec1 4c6c 4be8 69db ....O!G...lL.K.i
  72438. 803842e: 5a37 232f 818c 1d6d a75b 89ff 8ee6 294e 7Z/#..m.[.....N)
  72439. 803843e: 8a2e 175e 6e9b 6060 8402 111b 401e 9444 ..^..n``.....@D.
  72440. 803844e: b0ca 2be5 a786 503d fef1 fcda f46b 00a0 ...+..=P....k...
  72441. 803845e: a42a 9956 e701 aa37 a860 ffdd 797d 518b *.V...7.`...}y.Q
  72442. 803846e: 5d45 e349 a913 e704 ae37 f181 73ce 557c E]I.....7....s|U
  72443. 803847e: b176 ed88 b23a 02c1 0690 f03b 8066 5a76 v...:.....;.f.vZ
  72444. 803848e: de35 e695 8d5a bb35 06b0 34e9 27f3 a988 5...Z.5....4.'..
  72445. 803849e: e1c2 908a 3903 695c a03b 4246 24a9 8d31 .....9\i;.FB.$1.
  72446. 80384ae: fa3d e41a 33f0 b72d 66e5 1a21 fa7c 03aa =....3-..f!.|...
  72447. 80384be: 76a1 70fe 6037 3a1e 8627 0d7e f189 9110 .v.p7`.:'.~.....
  72448. 80384ce: 9250 a568 1914 79c7 6691 2c47 6645 f4a8 P.h....y.fG,Ef..
  72449. 80384de: b6ec cd5f 6211 9b16 60a4 71f6 f90a 9bc0 .._..b...`.q....
  72450. 80384ee: d121 db3c e566 f43a 1c02 23f8 dc41 ce1d !.<.f.:....#A...
  72451. 80384fe: 61e1 a784 9f02 6600 dcad 69f3 a9af 1264 .a.....f...i..d.
  72452. 803850e: d3c3 c35c 6cbd 7398 04ca 19e9 1591 9627 ..\..l.s......'.
  72453. 803851e: aff2 89c2 83a9 8dcf 4db0 1e01 a044 f776 .........M..D.v.
  72454. 803852e: 7adc 58d8 7055 d9ba 7bf8 ee55 87f5 6e88 .z.XUp...{U....n
  72455. 803853e: f21b dc2b f68d c1f4 b7d3 dd9d f70f 6e1f ..+............n
  72456. 803854e: da3f bfbe 4ae7 e438 8c1d 99f7 f612 36ed ?....J8........6
  72457. 803855e: da22 38b5 810b 2160 1bbb 90e8 c501 e033 "..8..`!......3.
  72458. 803856e: 018e 2165 c1e5 0a70 e2c9 7728 b93e 60f3 ..e!..p...(w>..`
  72459. 803857e: 6f67 c3a1 ee0d aaf0 90ee 4037 4875 1785 go........7@uH..
  72460. 803858e: f874 f6c9 8fbd 2cef 7876 3b95 5384 ce5e t......,vx.;.S^.
  72461. 803859e: 7490 6611 5a23 90cd f59c f517 7b79 e77b .t.f#Z......y{{.
  72462. 80385ae: cece fbdd ba4b 86bd 176e cb89 420c e709 ....K...n....B..
  72463. 80385be: d404 2b7d 0f4d 7862 9758 f4b8 9c6d 4b9d ..}+M.bxX...m..K
  72464. 80385ce: 998a 7429 59b3 0e96 89e3 99cf 3a56 84f3 ..)t.Y......V:..
  72465. 80385de: 2dda af2b 4c35 a084 031c a1ce 0390 df55 .-+.5L........U.
  72466. 80385ee: 00c8 089a d33f 3e7c 938d f102 fc7c 19eb ....?.|>....|...
  72467. 80385fe: 68ec 0db2 3212 e25c 93c7 b78a b598 720a .h...2\........r
  72468. 803860e: 831a ca1f 43c8 2692 4582 790d a551 5b0d .....C.&.E.yQ..[
  72469. 803861e: f7a1 e6ca 6378 f4eb 41bf 7c1a 5d0e 420e ....xc...A.|.].B
  72470. 803862e: 6282 94e2 f26e 3a73 4e4f b77f 8eb9 ce7a .b..n.s:ON....z.
  72471. 803863e: 5176 1ee9 d870 898a ffc5 45ae e862 27cf vQ..p......Eb..'
  72472. 803864e: b205 285e c61d 5804 231b 8072 1ccc 83a4 ..^(...X.#r.....
  72473. 803865e: 23fc 842b 82bf 7ebc 1329 3640 1667 2ceb .#+....~).@6g..,
  72474. 803866e: 4d9e bf6c 9886 28e1 59e9 6621 b226 1a3e .Ml....(.Y!f&.>.
  72475. 803867e: 57fc bf3e 1a58 34e1 6681 05f9 4766 22ff .W>.X..4.f..fG."
  72476. 803868e: 00f1 febf 2756 c8a5 126c 1a53 d035 d503 ....V'..l.S.5...
  72477. 803869e: cd86 4a8c 5b9b 4b2e fe9c 6525 a957 f8fa ...J.[.K..%eW...
  72478. 80386ae: 3452 4621 09c4 2168 1809 3fa5 3a72 c548 R4!F..h!...?r:H.
  72479. 80386be: a19d 074a ef19 366b 0944 83a7 f78c 1f35 ..J...k6D.....5.
  72480. 80386ce: 84a1 41d3 24c6 350e 8423 9348 d831 d820 ...A.$.5#.H.1. .
  72481. 80386de: 970d 044b 2171 6290 e1e8 4085 498a 1747 ..K.q!.b...@.IG.
  72482. 80386ee: 5502 775c dcae 5895 4fc9 2bbe 1b21 4ae7 .U\w...X.O.+!..J
  72483. 80386fe: ca02 0878 7ee1 2df9 37f4 90f9 9d27 31bd ..x..~.-.7..'..1
  72484. 803870e: e341 a170 a108 f6df dc36 dcea 0632 659d A.p.....6...2..e
  72485. 803871e: d9e2 1bb7 e914 7c8d aed8 d79d 0525 c8a0 .......|....%...
  72486. 803872e: 7b5f f1eb 7427 d646 7e62 42d2 f529 4d6a _{..'tF.b~.B).jM
  72487. 803873e: 86ac 5ba9 a080 d6eb 9f6e 776a 7452 0307 ...[....n.jwRt..
  72488. 803874e: d600 0e08 445a e9e1 2418 c6db 85e4 3179 ....ZD...$....y1
  72489. 803875e: 6f7c 123f f421 1a45 9359 806a 15f3 86b9 |o?.!.E.Y.j.....
  72490. 803876e: d85d dd38 547e 39a5 4846 0c73 7ec9 fb18 ].8.~T.9FHs..~..
  72491. 803877e: 2dd9 d9b4 102e 73a2 adc3 ab8d 0eef 6ff0 .-.....s.......o
  72492. 803878e: eaf7 a075 7f0e 786e 385e bd08 ee8d 3bc6 ..u...nx^8.....;
  72493. 803879e: 8dbd 2e8d b27d bced bdd1 5b06 a908 8f7e ....}......[..~.
  72494. 80387ae: bf11 464a 619d 4e96 a96f 5abe dae1 d77b ..JF.a.No..Z..{.
  72495. 80387be: 83df 8e91 396a f702 6dae 2325 712d ead9 ....j9...m%#-q..
  72496. 80387ce: c32a 330c 81c7 7c86 4a97 bd3e 9fea 0bfe *..3...|.J>.....
  72497. 80387de: 864b ce6f 94be b1fe e9fe 277f 5641 8629 K.o........'AV).
  72498. 80387ee: 687d 648b ff1e ecfe 27cb 13d9 e604 7204 }h.d.....'.....r
  72499. 80387fe: 3527 863a b9c4 41c2 aaba 1dd8 b5ee 866d '5:....A......m.
  72500. 803880e: fd60 4463 088a 08f2 3421 20cb 3125 db6a `.cD....!4. %1j.
  72501. 803881e: da8b b170 a821 8de9 e51c 67a9 5293 5c6b ..p.!......g.Rk\
  72502. 803882e: 166f 2a5f 6b35 dc8c 43c4 36eb 1e58 5ed9 o._*5k...C.6X..^
  72503. 803883e: ca63 a5ce 2ddf 87e8 5b38 fbf9 043e 0c36 c....-..8[..>.6.
  72504. 803884e: aab4 c3e0 9e74 a021 6aae 04e3 4271 d27c ....t.!..j..qB|.
  72505. 803885e: a734 0c79 9301 ece5 94e5 f4a4 5b54 1cd8 4.y.........T[..
  72506. 803886e: 75fd 4ffa a53b c36a 6d69 3b2d 3317 cfaf .u.O;.j.im-;.3..
  72507. 803887e: 6e4b e49b 8232 c087 0e00 2927 bd19 1166 Kn..2.....')..f.
  72508. 803888e: 4ca5 f252 8c10 f843 7cac cf04 1b72 e804 .LR...C..|..r...
  72509. 803889e: 6dc6 13bb 48e6 0557 6ab0 2276 b926 3960 .m...HW..jv"&.`9
  72510. 80388ae: e07c 90d9 7e6f 028f b1c0 668c 03ac 4fb8 |...o~.....f...O
  72511. 80388be: 8724 ce33 14c3 ded6 ed73 c8b6 ae91 5a2b $.3.....s.....+Z
  72512. 80388ce: 19cd ce4d dcd5 41a0 27f6 0e1d 2077 4fa1 ..M....A.'..w .O
  72513. 80388de: c41a fd9e ce2c 20e3 ed86 d47e 21d3 09d9 ....,.. ..~..!..
  72514. 80388ee: 2030 d1f9 33d3 34ad ce3a 3445 8575 d209 0 ...3.4:.E4u...
  72515. 80388fe: b0eb 988a 4a32 601b d5d2 532e 276d e666 ....2J.`...Sm'f.
  72516. 803890e: 6d61 d41b a3e9 175c ff89 1e2c 60f9 ced8 am....\...,..`..
  72517. 803891e: a11c ede3 ce11 383b 7d9c 5d08 9504 423f ......;8.}.]..?B
  72518. 803892e: eac2 c7fd ef77 6558 d0ea 641a f20b 976e ....w.Xe...d..n.
  72519. 803893e: 82b4 4f3d 844e 9df5 462c b9a0 bce8 3d9d ..=ON...,F.....=
  72520. 803894e: 027b 7c5e 59d2 44e7 959c ca8d e7d2 f9c0 {.^|.Y.D........
  72521. 803895e: c547 2918 906c 2001 6b93 e10b 496c 0b2b G..)l.. .k..lI+.
  72522. 803896e: ca19 3665 1213 e62b af50 68e1 20a0 3cbe ..e6..+.P..h. .<
  72523. 803897e: 49b3 2977 de63 78cd 7c1e e00f 1d52 0457 .Iw)c..x.|..R.W.
  72524. 803898e: d4a4 cbd7 e640 9427 8432 e962 80b7 626f ....@.'.2.b...ob
  72525. 803899e: 2714 e93b b3cc ba37 e7b3 1f70 9a42 b291 .';...7...p.B...
  72526. 80389ae: 394f c09f 500d 53a5 9143 00bf ecd5 f179 O9...P.SC.....y.
  72527. 80389be: 0e38 1026 0e31 9653 4585 de41 e1eb b91c 8.&.1.S..EA.....
  72528. 80389ce: 761c 97d9 fd65 9f5a dee6 4a51 16b1 16c0 .v..e.Z...QJ....
  72529. 80389de: 9068 8993 c5e1 9d34 ba22 9d98 9565 25ae h.....4."...e..%
  72530. 80389ee: 89f1 8da1 505c 9a6d 8760 7e54 a928 e4a3 ....\Pm.`.T~(...
  72531. 80389fe: 3506 4853 a84b 057a 2e81 9ba4 b096 1a8d .5SHK.z.........
  72532. 8038a0e: 2e02 b907 195a d545 57c8 206b a3c8 bb2b ....Z.E..Wk ..+.
  72533. 8038a1e: db2a ab5d 5c81 065f bd72 8206 b92c 5ec5 *.]..\_.r...,..^
  72534. 8038a2e: 106e 1448 ae53 dc8c b6e9 dd0f 8373 b34a n.H.S.......s.J.
  72535. 8038a3e: 56b4 4f8a 5a59 184d 59b0 53ca a32d b277 .V.OYZM..Y.S-.w.
  72536. 8038a4e: f013 a705 52c2 0e03 e9d8 d1e2 1521 f8a9 .....R......!...
  72537. 8038a5e: 2e9c 4fa4 ae2a 2847 5cc1 c054 5663 b339 ...O*.G(.\T.cV9.
  72538. 8038a6e: 0ae5 30ca 0297 e150 dd36 0aa7 e969 0e4a ...0..P.6...i.J.
  72539. 8038a7e: 9956 8775 aa91 7192 a329 050a 6aaa 0a21 V.u....q)....j!.
  72540. 8038a8e: 2988 5fa1 4c55 acf4 48f3 5456 d266 e642 .)._UL...HVTf.B.
  72541. 8038a9e: ec12 ee42 911a 4be0 c340 fbe8 d016 de30 ..B....K@.....0.
  72542. 8038aae: fa18 5f5f 9c06 ecc3 b2d8 0312 1fa0 5b23 ..__..........#[
  72543. 8038abe: a74b 78dc a438 f264 9b0d e730 6b40 97e4 K..x8.d...0.@k..
  72544. 8038ace: 84d5 f2ff 3d03 2f9f 1a53 a680 7180 e4b5 .....=./S....q..
  72545. 8038ade: 9bd6 09f4 2e89 616c 73d9 dd29 4296 014a ......la.s)..BJ.
  72546. 8038aee: b4b5 d6aa 6349 720a 4b31 919b 6433 845e ....Ic.r1K..3d^.
  72547. 8038afe: ab25 1df9 d17c 715a 1ab0 91ae 7d0e 3152 %...|.Zq.....}R1
  72548. 8038b0e: d519 3006 527d 2371 4335 cf63 562c 3408 ...0}Rq#5Cc.,V.4
  72549. 8038b1e: 631a 2ed1 93b1 6674 6e3b ea2d 52ed 64d7 .c....tf;n-..R.d
  72550. 8038b2e: 52a8 14de 0046 c530 9619 d258 f2b4 8bc5 .R..F.0...X.....
  72551. 8038b3e: 351b 5623 526b c1df 6577 c06a 4714 40fb .5#VkR..wej..G.@
  72552. 8038b4e: 6ee0 e54d a29a 45a2 8e39 cef9 2791 a8c8 .nM....E9....'..
  72553. 8038b5e: 2caa e063 0b96 1309 75e4 44a5 b32f cb96 .,c......u.D/...
  72554. 8038b6e: 12a8 bf66 bf42 ad59 094a 7860 34a8 46b3 ..f.B.Y.J.`x.4.F
  72555. 8038b7e: 650f 0f39 87e1 f532 3ebf 2c88 0025 8648 .e9...2..>.,%.H.
  72556. 8038b8e: e284 e682 5c20 9546 38b5 5036 dfcc d154 .... \F..86P..T.
  72557. 8038b9e: 668c 2ea3 ca3f a9ef 126c 6882 b644 a001 .f..?...l..hD...
  72558. 8038bae: a84a 3e72 f7cb 69cb 0636 d5af e069 9865 J.r>...i6...i.e.
  72559. 8038bbe: 4022 ad89 3b25 6fff 0f47 678f 7271 7d33 "@..%;.oG..gqr3}
  72560. 8038bce: 632e 7629 76ce 954a c89b 5c76 62a5 1b42 .c)v.vJ...v\.bB.
  72561. 8038bde: 2a57 ba90 e72b 6cb8 298d e511 8305 f7a0 W*..+..l.)......
  72562. 8038bee: c4e2 4bb5 c835 2186 4261 9d20 fcdc f534 ...K5..!aB ...4.
  72563. 8038bfe: 5ca5 044e 325a 2166 6f66 496a 1e30 c0bc .\N.Z2f!fojI0...
  72564. 8038c0e: ac36 78b9 4fea 37f2 d035 9e70 f64a bb24 6..x.O.75.p.J.$.
  72565. 8038c1e: 5aae 7e4f 68f3 1fc7 b651 ae22 289b 8ee5 .ZO~.h..Q."..(..
  72566. 8038c2e: 1cd2 7543 6de3 e720 55cd 3e15 fe1a d54e ..Cu.m ..U.>..N.
  72567. 8038c3e: e250 7c04 92cf 1391 71c0 aae9 8981 0d41 P..|.....q....A.
  72568. 8038c4e: 2c0f 7a6c 855d 344e 3395 3049 8b9f 121b .,lz].N4.3I0....
  72569. 8038c5e: c504 7004 9a6a 3a5a ce77 81d3 6981 3d4e ...pj.Z:w....iN=
  72570. 8038c6e: 1f84 31b4 c5bf 2c89 5b9b a3d5 1d3a ca65 ...1...,.[..:.e.
  72571. 8038c7e: 746c 322e 8928 1a11 5472 579b 6b69 3035 lt.2(...rT.Wik50
  72572. 8038c8e: 8127 2929 62b7 bb64 7a4d b9af 48aa e9a5 '.)).bd.Mz...H..
  72573. 8038c9e: 69be bacc f7eb 634d be9a 7b22 39ad 20a6 .i....Mc.."{.9.
  72574. 8038cae: 96d4 4cf4 7229 bb76 b186 0eb2 2f93 7b7f ...L)rv....../.{
  72575. 8038cbe: 41cb f6da 33c7 da98 8097 0dbb 6559 8dcb .A...3......Ye..
  72576. 8038cce: 0082 43bc eace 887b 0820 a978 ed8d 2174 ...C..{. .x...t!
  72577. 8038cde: 6183 1d37 058e b104 c684 9ae5 2268 53ee .a7.........h".S
  72578. 8038cee: a7f1 ec54 eeee 1391 12e4 dd5d e8fe 373e ..T.......]...>7
  72579. 8038cfe: 8c7b e95c f7c9 0eef 1efa 1a27 d39b 0ffa {.\.......'.....
  72580. 8038d0e: 88e2 7616 39f9 13a1 9ff8 d872 8cd1 b950 ...v.9....r...P.
  72581. 8038d1e: f438 90f2 bf0a 3755 2073 fb9e 1840 7666 8.....U7s ..@.fv
  72582. 8038d2e: 3a1e 4570 1187 4c6a 811c aca8 7770 2857 .:pE..jL....pwW(
  72583. 8038d3e: c07c 17ed 43b6 fa37 2356 6a20 8975 e0f9 |....C7.V# ju...
  72584. 8038d4e: cffa f379 e8a1 f2c3 e8f9 9746 8f9a 6e06 ..y.......F....n
  72585. 8038d5e: e7cc 2944 395a 54f8 9d24 38c3 c62a ef9b ..D)Z9.T$..8*...
  72586. 8038d6e: f3be 7843 70b5 c1fe c6fc 27a9 d7b5 43ba ..Cx.p.....'...C
  72587. 8038d7e: 239d 480d 9b09 c5af 1170 2801 d84d e057 .#.H....p..(M.W.
  72588. 8038d8e: 7b69 7a12 85c7 781d f1ac f62f 503f 0557 i{.z...x../.?PW.
  72589. 8038d9e: 367a ee3b d84f e51b 45b3 514b dc6e a673 z6;.O....EKQn.s.
  72590. 8038dae: 1486 d6c7 9df7 bbe9 570c 9797 a99f 4754 .........W....TG
  72591. 8038dbe: 019b 308b 9532 a870 df59 a689 3282 6a5c ...02.p.Y....2\j
  72592. 8038dce: 905c 1d96 ebea 68d2 200c 8fd2 c2e8 6eb4 \......h. .....n
  72593. 8038dde: df43 54fb 6a80 329f a800 7f82 40a0 aa5e C..T.j.2.....@^.
  72594. 8038dee: 12a6 8bf9 6e8a 0bca 5cd6 7ea8 9eab 2571 .....n...\.~..q%
  72595. 8038dfe: 56fb 4d91 f2f8 88ae eddc db7b ee8f 3fef .V.M......{....?
  72596. 8038e0e: 73ba b3db 64ff bc38 bdd1 b5d1 d955 df9f .s...d8.....U...
  72597. 8038e1e: 77b9 a3ef a94f ebb8 d747 d411 a090 3c1f .w..O...G......<
  72598. 8038e2e: 73ba 01e7 af4a 0b5d 2ec3 9780 1968 32b5 .s..J.].....h..2
  72599. 8038e3e: e17d 4917 b578 dc14 ed25 4e78 46ee 9d57 }..Ix...%.xN.FW.
  72600. 8038e4e: e6a4 077d 0397 b9b7 82f7 bd17 8f9f 05e7 ..}.............
  72601. 8038e5e: 5331 05ef 5ba5 aef4 926c d7a0 1131 422a 1S...[..l...1.*B
  72602. 8038e6e: 63a0 3fea ac45 9d64 b66a b8ae aa9c 2bd1 .c.?E.d.j......+
  72603. 8038e7e: 7b57 d122 8fb8 936e 3828 b0ba 389f a739 W{"...n.(8...89.
  72604. 8038e8e: 891f 13a1 9ab7 c9cd 4709 5c91 4215 e784 .........G.\.B..
  72605. 8038e9e: c3f7 8e7d c00a fd65 3ee1 febb abbd a5f8 ..}...e..>......
  72606. 8038eae: fbfd b5de 52be 2894 559e e4a4 21f5 81ed .....R.(.U...!..
  72607. 8038ebe: 784f b893 ef95 bd93 f2ee 0025 5266 8a3e Ox........%.fR>.
  72608. 8038ece: c1d5 e279 762e 4ea5 aafc 3827 8c52 7486 ..y..v.N..'8R..t
  72609. 8038ede: 7bca 39fe 1b0d 4073 1b4b b211 3a78 369f .{.9..s@K...x:.6
  72610. 8038eee: 0755 f3f2 9c7b 32c0 9ff5 15d7 d531 45c2 U...{..2....1..E
  72611. 8038efe: 18be 8e64 fcff cd0d e891 d3c3 8a53 1c1f ..d.........S...
  72612. 8038f0e: dc2c 9a82 6733 b9e2 2d80 807f 14d3 09ba ,...3g...-......
  72613. 8038f1e: 4a72 4c79 a03f 1497 3ab8 2594 f4b3 de10 rJyL?....:.%....
  72614. 8038f2e: 2973 74c6 5a4f 734d b374 170c f05b c32c s).tOZMst...[.,.
  72615. 8038f3e: 08db 68fd 74ff b5e4 35fc 07ff b3a1 c21e ...h.t...5......
  72616. 8038f4e: 6d6f 9223 83fe 8fb0 331b 36fc 66c1 626d om#......3.6.fmb
  72617. 8038f5e: bbba 03be 2ec0 a8dc 16e4 3036 8acb 1797 ..........60....
  72618. 8038f6e: a3b4 7d76 ba41 56dd 6077 d077 758c ba2c ..v}A..Vw`w..u,.
  72619. 8038f7e: 3271 3723 9f23 25c7 a576 c59e cd7e bf61 q2#7#..%v...~.a.
  72620. 8038f8e: 8ec8 0c5e 87d9 40cd 24b0 6870 4221 beef ..^....@.$ph!B..
  72621. 8038f9e: e608 6201 7990 1e0f d0e1 424f a131 2490 ...b.y....OB1..$
  72622. 8038fae: 60be c19d 0bef e5df 0108 0589 86d5 7e4e .`............N~
  72623. 8038fbe: 03dc 3fa2 0c10 b214 8b8a cf46 90e8 1cc2 ...?......F.....
  72624. 8038fce: aac6 f36a 0d6c cfe1 425b cd73 cc83 3e20 ..j.l...[Bs... >
  72625. 8038fde: 79ba 9745 31c2 f2a1 0c2d 95f2 d0fa 7ddf .yE..1..-......}
  72626. 8038fee: 40ed 3417 4427 4843 c345 a5dd bb91 efeb .@.4'DCHE.......
  72627. 8038ffe: 4ac1 b04a ba18 e4c8 020a bb06 dc30 196d .JJ.........0.m.
  72628. 803900e: 1d14 0b34 c990 e709 3f0f 21c9 98e9 436e ..4......?.!..nC
  72629. 803901e: 7c52 c472 142a 949c 69cd 8ba2 1166 712e R|r.*....i..f..q
  72630. 803902e: e90d 251a 82ba f538 fed5 d040 b827 e813 ...%..8...@.'...
  72631. 803903e: f962 564b d4df 8c93 3bd5 4a2f 9195 d9c2 b.KV.....;/J....
  72632. 803904e: 84cf 79b2 6370 428b bc4f c4dd 1d4a bbd6 ...ypc.BO...J...
  72633. 803905e: 8b6e e149 8d4b 7599 5805 6652 16cd 2b4f n.I.K..u.XRf..O+
  72634. 803906e: 8512 4f1f 5756 83b9 4c0a 6f16 8cc2 1551 ...OVW...L.o..Q.
  72635. 803907e: 0ce9 f55e 8e26 872e 73b4 a8d7 ae94 02da ..^.&....s......
  72636. 803908e: bdaf 2e47 686f 1457 6ad5 8b4c c5b4 b0eb ..G.ohW..jL.....
  72637. 803909e: ce7d c7ad 5d0e 1834 66eb d1b5 3f68 6211 }....]4..f..h?.b
  72638. 80390ae: 51d3 6234 1f1c d28b d8df 3536 3e93 5c99 .Q4b......65.>.\
  72639. 80390be: eff0 1f63 0527 4de6 42bf 821c e7ea 5814 ..c.'..M.B.....X
  72640. 80390ce: 9fe4 ebad 3837 700e a0be a95b b3b3 6f12 ....78.p..[....o
  72641. 80390de: 5d9b 8287 d79d e1df 244b f38c dca6 ead9 .]......K$......
  72642. 80390ee: 1f1e 5b07 f5de 56f7 6f57 bbbc 9345 6ef9 ...[...VWo..E..n
  72643. 80390fe: bc44 4714 f3bc 6a06 8a28 d157 2514 f027 D..G...j(.W..%'.
  72644. 803910e: 36dd 2c3c 8a42 e904 ca64 d46a b376 50cc .6<,B...d.j.v..P
  72645. 803911e: 4c7d 6fb6 b750 c8d2 ee1e d5ad 4496 9245 }L.oP........DE.
  72646. 803912e: 54b0 206f bc55 725b aba3 ae44 acec 1945 .To U.[r..D...E.
  72647. 803913e: 4bc2 244e c9a8 4cd5 a671 6634 3404 1d2a .KN$...Lq.4f.4*.
  72648. 803914e: 16b1 e6d8 2809 6850 5065 708e be3f b856 .....(PheP.p?.V.
  72649. 803915e: 306c 1339 3873 4523 9ce1 b463 e71f 7c0f l09.s8#E..c....|
  72650. 803916e: 72e4 f473 461a 62bd 6d21 fb75 4ad2 10ab .rs..F.b!mu..J..
  72651. 803917e: 00a6 a86a cf28 abc2 975d 0f7f 2927 c762 ..j.(...]...')b.
  72652. 803918e: 1f9d 6dbe 994e 56d1 6c1e d354 ab37 3cb5 ...mN..V.lT.7..<
  72653. 803919e: 4724 dc9f f335 52da 8700 3919 70c2 729d $G..5..R...9.p.r
  72654. 80391ae: 2f71 a91c dec7 f3fe fb07 de9f e9b9 bfa9 q/..............
  72655. 80391be: c7c7 4e2f eafa 8777 3d65 a9d4 ea28 5255 ../N..w.e=..(.UR
  72656. 80391ce: 61a9 0e11 94b4 2f26 490e 486e 0f30 58ef .a....&/.InH0..X
  72657. 80391de: 6cac 0190 00dd b086 8824 5e93 11bd 78bd .l......$..^...x
  72658. 80391ee: 44b3 2278 e416 d8ca 3550 fcbc 89e6 9b69 .Dx"....P5....i.
  72659. 80391fe: c2f4 2c19 bf81 1260 1324 121b 269c eb01 ...,..`.$....&..
  72660. 803920e: 2e34 398c 1797 7cc2 b20f a7a4 9168 1acf 4..9...|....h...
  72661. 803921e: 1a2c 1b46 33b4 5de6 13f9 2cd2 42cf c825 ,.F..3.]...,.B%.
  72662. 803922e: 4517 12ec 372e 51a9 7569 93cd 670a 09ce .E...7.Qiu...g..
  72663. 803923e: 45f5 e526 0cc3 434f 9221 5089 7733 28d6 .E&...OC!..P3w.(
  72664. 803924e: 7b33 4c83 f3e3 26ff 042b a6b8 9d46 509c 3{.L...&+...F..P
  72665. 803925e: c5f6 4f0e b6bb 244a 1ffe 33ee 3bae 028c ...O..J$...3.;..
  72666. 803926e: 42ad 9051 2e54 674d 500c b468 4093 939e .BQ.T.Mg.Ph..@..
  72667. 803927e: 19bb 19ec ae70 8ea0 c21a 815c a016 4aa9 ....p.....\....J
  72668. 803928e: 6d26 2f79 b340 68c6 d8fa 91c7 dac9 1e0c &my/@..h........
  72669. 803929e: e984 eadb 9c52 5d79 35b9 82aa 23f4 8aba ....R.y].5...#..
  72670. 80392ae: 7446 1adf 4291 bfcc f69c ebd5 876f bf6f Ft...B......o.o.
  72671. 80392be: a5d3 d1ff 39e5 e33c ea32 e914 f707 6477 .....9<.2.....wd
  72672. 80392ce: 0422 4e64 3b15 390e ccef dbf3 7236 4522 ".dN.;.9....6r"E
  72673. 80392de: b942 1f19 ba3f 408b 6e3a 934d 13f2 5720 B...?..@:nM... W
  72674. 80392ee: 3c76 fbb0 7896 8b3e f761 6a03 d32c 2360 v<...x>.a..j,.`#
  72675. 80392fe: 852a 3642 5146 8b24 1504 3721 8fdb ea13 *.B6FQ$...!7....
  72676. 803930e: 164d a90e c730 467b e099 5884 b5c6 6eb1 M...0.{F...X...n
  72677. 803931e: 1123 f6a4 14e2 4c4f 1c65 f7ae e49f 23eb #.....OLe......#
  72678. 803932e: 1b4c 2219 2294 a7d8 10dc 92e8 4781 2e5f L..".".......G_.
  72679. 803933e: 5c1f 0d50 d464 d79a e8e2 0844 92e8 6b0b .\P.d.....D....k
  72680. 803934e: e4ea a108 0723 2945 edad 040d a44d 0afe ....#.E)....M...
  72681. 803935e: a341 2dc8 4f99 b826 2df8 c626 6954 c08b A..-.O&..-&.Ti..
  72682. 803936e: 87dd 72fb 0907 52e5 9604 a1c2 ce86 1216 ...r...R........
  72683. 803937e: 4ba1 0514 1b12 0d61 2145 0217 6348 6777 .K....a.E!..Hcwg
  72684. 803938e: 773c eead dac6 fa9f dac9 5dbb dbab d1ed <w.........]....
  72685. 803939e: 36ff 6c2c 4d9e a48a a126 8b8f 0278 374a .6,l.M..&...x.J7
  72686. 80393ae: 213f e6a6 72fc 6d57 2ac2 ccf8 bbda 09ca ?!...rWm.*......
  72687. 80393be: 3a0b 3f63 e8ff 2130 41a6 fb28 15a8 8a42 .:c?..0!.A(...B.
  72688. 80393ce: f8af e6c8 bd22 7f0a ca3c 02ec bfd7 f465 ...."...<.....e.
  72689. 80393de: 7254 b97c 2c54 715e 7eb4 0dba a49c b427 Tr|.T,^q.~....'.
  72690. 80393ee: 7b03 e4c3 2d3a 2cee 141f 4f25 f85d 24c8 .{..:-.,..%O]..$
  72691. 80393fe: 731a 4ab0 21f5 74e5 4fc0 ed2f 4b23 a042 .s.J.!.t.O/.#KB.
  72692. 803940e: f8d6 3e3a 5dd6 99c1 84a1 9a7a b3ec 08aa ..:>.]....z.....
  72693. 803941e: 0f41 e360 1ceb d260 25e2 fd20 006a 3e41 A.`...`..% .j.A>
  72694. 803942e: 93a4 ca5d d818 8d63 1213 a086 545a 9ce2 ..]...c.....ZT..
  72695. 803943e: b294 4008 c61e 6d27 5951 dea4 950b dc13 ...@..'mQY......
  72696. 803944e: a493 e3e3 b895 362a f72f d7c1 4ca7 3687 ......*6/....L.6
  72697. 803945e: b910 1a16 2c5f 4063 fafe 625b f406 0bae ...._,c@..[b....
  72698. 803946e: a108 8fa4 2dcb 456e 492e f98f daac b521 .....-nE.I....!.
  72699. 803947e: 30d1 76c9 c8f7 8acc 9768 666f 21e9 3202 .0.v....h.of.!.2
  72700. 803948e: e78f 8a33 8324 cbf1 aba4 7121 0792 c789 ..3.$.....!q....
  72701. 803949e: f0ef c8e5 ea34 290f 0adf 32b9 c539 3975 ....4..)...29.u9
  72702. 80394ae: ffb8 ee98 3c71 2386 2e93 a09d 6602 0005 ....q<.#.....f..
  72703. 80394be: 10bd 1799 d838 0a94 22e2 e3a0 d547 6c33 ....8...."..G.3l
  72704. 80394ce: 17d8 2a6d 18fa c044 e930 e8fb 329a a28b ..m*..D.0....2..
  72705. 80394de: 7d16 5252 89d8 30bb 733d 0a2d e7cf db10 .}RR...0=s-.....
  72706. 80394ee: eaea 8a92 882a bab0 c36a 156a 38c3 33c1 ....*...j.j..8.3
  72707. 80394fe: 2b4c a5fa 5287 8010 cbca cde6 f9f3 b8f8 L+...R..........
  72708. 803950e: aaaa 198c c49d 7f02 7994 ea0c edfc ebe6 .........y......
  72709. 803951e: 6e5d a6e2 31b8 7446 ee14 33b9 e4fc 05d3 ]n...1Ft...3....
  72710. 803952e: 3816 b5b2 c33e 81d1 8fcf dd1f d22b 7d0f .8..>.......+..}
  72711. 803953e: 765c e1d1 a730 953f 6c55 bd8a 648f ffb5 \v..0.?.Ul...d..
  72712. 803954e: c738 7feb 664a 65a3 706a d609 e480 f923 8...Jf.ejp....#.
  72713. 803955e: 9668 15a4 4df4 744f 074d ded3 3064 1a61 h....MOtM...d0a.
  72714. 803956e: 4d2c 8cf6 c1f6 ed9b 7b66 4cfd 4e0a 254a ,M......f{.L.NJ%
  72715. 803957e: b9c3 7f80 cd86 c0f9 9ee7 32c8 1e9e 053e ...........2..>.
  72716. 803958e: d291 7578 33f5 1bcf 6062 3f9c 4228 4d46 ..xu.3..b`.?(BFM
  72717. 803959e: 2c88 e430 4185 c32e 2678 7bd3 768c c16f .,0..A..x&.{.vo.
  72718. 80395ae: 5692 7526 0e0e 0a7d f529 6914 2e69 fbda .V&u..}.)..ii...
  72719. 80395be: cfd4 842d f374 3c16 d29f 03ba d35d 2923 ..-.t..<....].#)
  72720. 80395ce: 1546 fb1e 5592 910f cbd6 a80f 3e20 b32a F....U...... >*.
  72721. 80395de: bded ea03 1249 7a1f e760 41a6 7c78 4a61 ....I..z`..Ax|aJ
  72722. 80395ee: 4e51 2529 6048 f277 7a71 8b78 a6d2 d444 QN)%H`w.qzx...D.
  72723. 80395fe: 710a 301d 0100 66c2 ca06 624e 88ac e802 .q.0...f..Nb....
  72724. 803960e: e16f 4881 4e5e 56cc 5c8a 7e0a 5a0f ab07 o..H^N.V.\.~.Z..
  72725. 803961e: 07ab c2b8 4000 14f0 d204 392d 7419 4074 .....@....-9.tt@
  72726. 803962e: 07fa 6848 9ad9 9acc 92c6 93b0 417a d3b1 ..Hh........zA..
  72727. 803963e: 415b 4fff 0931 27a3 3663 e14f 3211 6530 [A.O1..'c6O..20e
  72728. 803964e: 4af6 5550 c4b5 d196 aa35 1252 2c86 20bd .JPU....5.R..,.
  72729. 803965e: 15cd 560d a65c 83b2 d7d9 08c0 3808 6f6d ...V\........8mo
  72730. 803966e: 3845 18c5 c372 8622 27e5 5a50 83f6 82d4 E8..r."..'PZ....
  72731. 803967e: 4131 8db7 29ad 4b79 eb90 1564 4890 c0a2 1A...)yK..d..H..
  72732. 803968e: 838b 90d6 449c 841d 209b 1676 7b02 1b8c .....D... v..{..
  72733. 803969e: 5019 0b43 af38 4e11 e7b0 7088 b080 18cc .PC.8..N...p....
  72734. 80396ae: d2df 5541 0b0b 61cf 390a 250c 2247 4c79 ..AU...a.9.%G"yL
  72735. 80396be: 4e8d 6a83 0151 0055 2989 a9d5 c954 3803 .N.jQ.U..)..T..8
  72736. 80396ce: 7181 c278 5901 4112 0485 b0f8 854a 1bcb .qx..Y.A....J...
  72737. 80396de: 0a4a e010 c90c 90be 638a f4f3 cd01 3810 J........c.....8
  72738. 80396ee: 4d82 2126 dd0c deb1 1ad0 4841 a866 1fed .M&!......AHf...
  72739. 80396fe: a87b 3b1a 440d 28d4 715e 4c4f 64e7 1f63 {..;.D.(^qOL.dc.
  72740. 803970e: 258c 5058 af63 1614 5c84 a9c4 16ef 2ad8 .%XPc....\.....*
  72741. 803971e: 630d 819c 8591 7d2b c263 c750 6762 fd31 .c....+}c.P.bg1.
  72742. 803972e: 88b4 2d85 71b8 7025 fb4c 4fa5 72b3 1ef6 ...-.q%pL..O.r..
  72743. 803973e: 5e56 3213 eef4 be8d 309a 1da4 9b1b abc7 V^.2.....0......
  72744. 803974e: 06c6 dba5 4a06 8641 0a9c 6e1b d227 a137 .....JA....n'.7.
  72745. 803975e: bbab ca06 fc2a 46b3 f645 2466 5049 00ee ....*..FE.f$IP..
  72746. 803976e: 517a 093c 244f 543c 0cf4 6488 c432 ea7b zQ<.O$<T...d2.{.
  72747. 803977e: 60ec 9656 4552 c332 cb89 86c9 3e52 4356 .`V.RE2.....R>VC
  72748. 803978e: 95c2 3ec6 f211 21b1 0cc4 418a cab2 fee1 ...>...!...A....
  72749. 803979e: e80e d259 3c30 916f f427 1765 8517 40fa ..Y.0<o.'.e....@
  72750. 80397ae: 53a3 d233 2567 9feb b5f4 7fa8 90f6 a269 .S3.g%........i.
  72751. 80397be: 52e9 9feb d140 6a05 dea7 a90b 943b 3758 .R..@..j....;.X7
  72752. 80397ce: 0d66 c5a1 a6f3 b359 5edc 7536 0ed8 3791 f.....Y..^6u...7
  72753. 80397de: 365c 11f5 7d4f d7b4 c91f 8013 2f78 1dda \6..O}......x/..
  72754. 80397ee: bdd1 5296 a66d bf69 42a0 07b2 e47a a3be ...Rm.i..B..z...
  72755. 80397fe: 9607 cde4 4252 5f03 3d0d d721 20a2 415e ....RB._.=!.. ^A
  72756. 803980e: ac62 5382 8f89 33d8 0ed9 c10f 0962 5a15 b..S...3....b..Z
  72757. 803981e: 35c1 30b4 c6d7 1fd3 3827 dffd 19a4 9a19 .5.0....'8......
  72758. 803982e: ef8e 68e2 a789 2206 6b38 e554 9774 57da ...h..."8kT.t..W
  72759. 803983e: 8087 ce34 9c61 0be1 c859 f7d2 feb5 27a3 ..4.a...Y......'
  72760. 803984e: fb79 ff18 b5bd d23e 82e2 0aa8 c90f 0ac2 y.....>.........
  72761. 803985e: e3c0 2406 121d ae3c 7b85 3f1f b216 6ae7 ...$..<..{.?...j
  72762. 803986e: 2d3c bd26 27f5 fa39 bb30 51e0 7a02 42e6 <-&..'9.0..Q.z.B
  72763. 803987e: 4576 1f6f 5f52 98fa 3aab ee31 92f2 7d58 vEo.R_...:1...X}
  72764. 803988e: 4624 9e77 5acf 93f6 0127 9c3f 7f46 bb5d $Fw..Z..'.?.F.].
  72765. 803989e: 48f6 7a9f 2ecd e3a4 c492 a967 e883 a6f3 .H.z......g.....
  72766. 80398ae: 9cea c879 4138 1be9 647b c426 8c2a 4518 ..y.8A..{d&.*..E
  72767. 80398be: 32b8 b768 00e9 1e54 6606 46af 069f b838 .2h...T..f.F..8.
  72768. 80398ce: 81b3 b321 06ff d006 4d69 970e 4067 3fd5 ..!.....iM..g@.?
  72769. 80398de: 4afb 2778 c971 107d fe96 480d e58f f54d .Jx'q.}....H..M.
  72770. 80398ee: 9ede 4f57 39a6 6e8c ef78 b6de 7e4b a08d ..WO.9.nx...K~..
  72771. 80398fe: 830c 1786 0e50 2d32 0e51 a80d a7d1 45ce ....P.2-Q......E
  72772. 803990e: e809 4c12 1717 14e1 08d7 0a5c 13c4 f483 ...L......\.....
  72773. 803991e: 255d 4011 8979 b33a 1439 2a39 8eaf 4623 ]%.@y.:.9.9*..#F
  72774. 803992e: 32c1 ae55 0386 05e7 8ce6 1dbc 41e5 bad1 .2U..........A..
  72775. 803993e: 1320 0e2e 3a66 e951 b8a6 859f 9fd0 aff4 ...f:Q.........
  72776. 803994e: 6592 2129 411b 179f 3174 0251 1129 81b3 .e)!.A..t1Q.)...
  72777. 803995e: b100 23bc 6abe 2f48 c581 bb84 af62 a42f ...#.jH/....b./.
  72778. 803996e: 8008 8706 0d2f 21e9 11c2 08e1 ef85 4b19 ..../..!.......K
  72779. 803997e: 5dc2 8d3d fa71 c4ad 6d93 b2f3 e54a 58d5 .]=.q....m..J..X
  72780. 803998e: 5c0b a658 a82f 12b6 9772 2e50 0c3c ba1c .\X./...r.P.<...
  72781. 803999e: ae06 cb92 84ff f406 0d68 40e1 46cb 6744 ........h..@.FDg
  72782. 80399ae: 2770 3343 c469 7da3 9388 d2eb 2103 a5e2 p'C3i..}.....!..
  72783. 80399be: 2f04 0433 06b0 8127 59fc 86e2 31bc c36e ./3...'..Y...1n.
  72784. 80399ce: 31c0 d006 1682 a593 8c77 0636 6c57 2a6b .1......w.6.Wlk*
  72785. 80399de: d8a2 e247 4727 6de4 7d6b 49eb a572 c577 ..G.'G.mk}.Ir.w.
  72786. 80399ee: bfe6 dbd5 dcc1 eb67 93ca 1364 e0d9 1607 ......g...d.....
  72787. 80399fe: 45de 1342 a1b2 b272 f0a1 1b0e 58bf 057c .EB...r......X|.
  72788. 8039a0e: 9352 6a9c 0cd5 cd1e 8b11 352a 4356 e856 R..j......*5VCV.
  72789. 8039a1e: 3409 dfc6 d2ba b7b3 65ec f2e3 5668 1695 .4.......e..hV..
  72790. 8039a2e: db8f b90c a57d 921d 46a0 9794 b2e6 28b5 ....}....F.....(
  72791. 8039a3e: 7182 ea22 add1 0c80 f2f4 9e8b 2ed4 023f .q"...........?.
  72792. 8039a4e: e1e9 5d2c 0801 0548 f283 ca36 9fa1 6425 ..,]..H...6...%d
  72793. 8039a5e: 20e0 d182 25ab a3fc b50b 4f25 0107 572c . ...%....%O..,W
  72794. 8039a6e: 2ddc 0861 ea7d 8a1f 20e0 d42e 829b 88db .-a.}.... ......
  72795. 8039a7e: b29d 8f1f 5e5f ef07 a092 a7e6 1bd8 4335 ...._^........5C
  72796. 8039a8e: 96af e11e fbbd 7bce b6f4 bc0a 23ae 056f .......{.....#o.
  72797. 8039a9e: 1fcf 92ac 82b6 70d6 e071 46f4 7982 0628 .......pq..F.y(.
  72798. 8039aae: 1b2b ff14 298b 9781 657d f1f0 715b 056e +....)..}e..[qn.
  72799. 8039abe: f482 b859 2220 5128 6f96 99e1 bc93 8b88 ..Y. "(Q.o......
  72800. 8039ace: 4e78 273a f9ae 192e 8ade 5950 00a4 e60e xN:'......PY....
  72801. 8039ade: d623 a0b7 c697 3d1f deb6 0141 879e 9286 #......=..A.....
  72802. 8039aee: ab0b 7567 f615 58d2 2413 7970 e252 de92 ..gu...X.$pyR...
  72803. 8039afe: 7fba 7351 9bde df6f fdf3 7928 dd78 4686 ..Qs..o...(yx..F
  72804. 8039b0e: d107 887b 5323 6e05 7c29 59fc e37b d01d ..{.#S.n)|.Y{...
  72805. 8039b1e: eea9 5aba e98f f6fd 9f5b 4479 e168 605a ...Z....[.yDh.Z`
  72806. 8039b2e: 3c8c f6ac 3b63 fccb caa3 8183 da07 b827 .<..c;........'.
  72807. 8039b3e: 08f0 c78b 77f3 4771 d780 b76d 3dd3 8244 .....wqG..m..=D.
  72808. 8039b4e: 1376 5b55 000d 513a 2afb afdf 6ba0 bbde v.U[..:Q.*...k..
  72809. 8039b5e: 7b41 07b6 a679 b45e f070 7c75 5c2c 7d2c A{..y.^.p.u|,\,}
  72810. 8039b6e: 7a20 4e07 7ccf a284 5a4e 887c 3d69 ea2b z.N.|..NZ|.i=+.
  72811. 8039b7e: 9b87 25da 0fd7 b4a5 df42 a730 48f7 51c1 ...%....B.0..H.Q
  72812. 8039b8e: 953f a23e 2d15 5c8e fbb2 9543 9734 f537 ?.>..-.\..C.4.7.
  72813. 8039b9e: 8367 8256 f970 5aac 7604 4241 daef d8b7 g.V.p..Z.vAB....
  72814. 8039bae: 8c2f 5873 50fe 6904 d5ef 601b 42d5 7bca /.sX.P.i...`.B.{
  72815. 8039bbe: 4f1f a6e3 cbe4 37a0 81af e930 9657 c2f8 .O.....7..0.W...
  72816. 8039bce: 300b 176e 7087 4bc4 7a8f a713 3c67 4470 .0n..p.K.z..g<pD
  72817. 8039bde: 5c2f 39a8 c016 760b 22a4 b88c 1baa e599 /\.9...v."......
  72818. 8039bee: 514f 0c5e 2560 a52e 6847 daee 5db1 13e7 OQ^.`%..Gh...]..
  72819. 8039bfe: 422f e20a 8d79 f030 cd79 b630 050c 7bf3 /B..y.0.y.0....{
  72820. 8039c0e: f0e4 ec08 1922 c7ea 8e40 56e4 0f7b 0e2e ...."...@..V{...
  72821. 8039c1e: 3ebb 0d94 8757 b1ad 4ed6 e9e1 bae8 fef4 .>..W....N......
  72822. 8039c2e: da07 d2a9 bc3a cb9b 894a 46ee e15d 7065 ....:...J..F].ep
  72823. 8039c3e: e64a f57d 893c 02e6 79f2 862a dd30 128b J.}.<....y*.0...
  72824. 8039c4e: 2d99 e73a daa9 1d21 3a42 b1c3 d839 7a31 .-:...!.B:..9.1z
  72825. 8039c5e: a4cd e824 7f1e bdd9 87a9 907d c434 9dcf ..$.......}.4...
  72826. 8039c6e: 0de8 0544 c136 48ac 9120 c19e 8d7b 503d ..D.6..H ...{.=P
  72827. 8039c7e: eac5 719a c16f 5342 652b 05e9 8b53 effe ...qo.BS+e..S...
  72828. 8039c8e: c023 2452 9265 80b4 e0b8 15dc 6048 fdb5 #.R$e.......H`..
  72829. 8039c9e: 13d3 e53b 5267 591b 7abf b997 0f1f 8bec ..;.gR.Y.z......
  72830. 8039cae: e7bc a5d2 4655 a403 30d6 7178 f4a2 a707 ....UF...0xq....
  72831. 8039cbe: ffff 1200 611b 6ebc 0063 2f00 .....a.nc..
  72832. 08039cc9 <data__login_html>:
  72833. 8039cc9: 6c2f 676f 6e69 682e 6d74 006c 5448 5054 /login.html.HTTP
  72834. 8039cd9: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  72835. 8039ce9: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  72836. 8039cf9: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  72837. 8039d09: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  72838. 8039d19: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  72839. 8039d29: 6e65 2d74 654c 676e 6874 203a 3835 0d37 ent-Length: 587.
  72840. 8039d39: 430a 6e6f 656e 7463 6f69 3a6e 4320 6f6c .Connection: Clo
  72841. 8039d49: 6573 0a0d 6f43 746e 6e65 2d74 7974 6570 se..Content-type
  72842. 8039d59: 203a 6574 7478 682f 6d74 0d6c 430a 6e6f : text/html..Con
  72843. 8039d69: 6574 746e 452d 636e 646f 6e69 3a67 6720 tent-Encoding: g
  72844. 8039d79: 697a 0d70 0d0a 1f0a 088b 0000 0000 0400 zip.............
  72845. 8039d89: 7d0a cd54 d46e 1030 157e 2463 754e 7bb7 .}T.n.0.~.c$Nu.{
  72846. 8039d99: a841 91c4 e950 1381 401c a382 cc93 5c6e A...P....@....n\
  72847. 8039da9: db1c 93d8 eeec e2ad 09c0 c409 2415 015e .............$^.
  72848. 8039db9: 03d1 8845 433e 8df6 2718 6ddb a423 e21e ..E.>C...'.m#...
  72849. 8039dc9: d8f5 e333 67ef d9b4 a7bd 4fcf be5e 7179 ..3..g.....O^.yq
  72850. 8039dd9: 6aca 4c6c a59e 1995 9765 7392 408a 7955 .jlL....e..s.@Uy
  72851. 8039de9: 00d6 562a 2ad6 4044 5bc9 885c 7447 9c37 ..*V.*D@.[\.Gt7.
  72852. 8039df9: 88d6 c05e 56bb 9277 16bf 9eaf 1388 78d7 ..^..Vw........x
  72853. 8039e09: ba85 c030 e959 822c 92a5 a767 aa12 5c25 ..0.Y.,...g...%\
  72854. 8039e19: 5917 80d5 9de4 9586 0177 e56f 74ad b585 .Y......w.o..t..
  72855. 8039e29: a0ac 25d3 2188 d038 a356 4656 52c4 9019 ...%.!8.V.VF.R..
  72856. 8039e39: 83f3 ad46 d375 fb36 8db8 8610 d140 f293 ..F.u.6.....@...
  72857. 8039e49: 9e88 8d40 f206 5bfe d57f edff b72f fbef ..@....[..../...
  72858. 8039e59: edab 7f79 fb49 6c8b de36 4665 b7db 0eac ..y.I..l6.eF....
  72859. 8039e69: 90b0 51bc 1eda 3196 1672 48c0 711e 2063 ...Q...1r..H.qc
  72860. 8039e79: 00d6 9d48 1962 47b4 1b86 704f d611 3b38 ..H.b..G..Op..8;
  72861. 8039e89: 9d53 4f1a 8b39 94a1 383c 8703 9167 6792 S..O9...<8..g..g
  72862. 8039e99: 39e3 466d 0ad1 6d57 acf2 1dd2 8d2b 518a .9mF..Wm....+..Q
  72863. 8039ea9: ab72 42ba 3605 88fe 160a 35aa 1d78 f42e r..B.6.....5x...
  72864. 8039eb9: 2a1a ce81 a753 6aff ea44 6108 cabc b533 .*..S..jD..a..3.
  72865. 8039ec9: 7e83 949f 5b1b b71b 0974 a282 aa8f eba7 .~...[..t.......
  72866. 8039ed9: 76ad a0ab a7bc 4c46 9257 dcef baa1 9e7a .v....FLW.....z.
  72867. 8039ee9: 9ff7 9ffb a97b f57e b63f 481f 4fba 65c4 ....{.~.?..H.O.e
  72868. 8039ef9: c13e 95e3 c305 f586 c19a f014 9578 d3b8 >...........x...
  72869. 8039f09: c2f9 8685 12a9 b3b5 1392 a4c6 52f4 4673 .............RsF
  72870. 8039f19: 5393 423b 5de0 ee4c 39ef 2b68 0952 1a55 .S;B.]L..9h+R.U.
  72871. 8039f29: d055 143b eaec de78 257f 2f3f 8f92 0fc7 U.;...x..%?/....
  72872. 8039f39: 116c e3fd 366c e524 b699 bdbe d26d 63be l...l6$.....m..c
  72873. 8039f49: 25ea 4b12 8932 d093 e869 1406 ff23 96dd .%.K2...i...#...
  72874. 8039f59: ca06 5d80 dcd2 f9f1 7243 0d35 1a40 408b ...]....Cr5.@..@
  72875. 8039f69: 4570 cbd0 8f1a fcd9 afc8 a8a7 593c a04a pE..........<YJ.
  72876. 8039f79: 93be e752 ec04 f6cf 5de3 52b0 caf6 ea85 ..R......].R....
  72877. 8039f89: 684e 4937 9dc9 01e1 0536 b397 d909 16d8 Nh7I....6.......
  72878. 8039f99: be8d b011 cb40 13e8 683e bf42 ace1 a653 ....@...>hB...S.
  72879. 8039fa9: 2a25 17fd f802 cc9b 24bd b30a ca24 3e74 %*.......$..$.t>
  72880. 8039fb9: 1376 ce33 6ceb 17f8 07f8 a233 8ac5 0415 v.3..l....3.....
  72881. 8039fc9: 0000 ..
  72882. 08039fcb <Content_Length>:
  72883. 8039fcb: 6f43 746e 6e65 2d74 654c 676e 6874 203a Content-Length:
  72884. 8039fdb: 1800 .
  72885. 08039fdc <file__rotek_png>:
  72886. 8039fdc: a018 0803 5fa0 0803 5fac 0803 1802 0000 ....._..._......
  72887. 8039fec: 0001 0000 ....
  72888. 08039ff0 <file__index_html>:
  72889. 8039ff0: c2d0 0803 a3c7 0803 a3d3 0803 04d0 0000 ................
  72890. 803a000: 0001 0000 ....
  72891. 0803a004 <file__info_html>:
  72892. 803a004: 9ff0 0803 f5e3 0803 f5ef 0803 04f5 0000 ................
  72893. 803a014: 0001 0000 ....
  72894. 0803a018 <file__role_js>:
  72895. 803a018: cd3c 0803 b9a5 0803 b9b1 0803 091f 0000 <...............
  72896. 803a028: 0001 0000 5825 4c00 676f 756f 5474 726d ....%X.LogoutTmr
  72897. 803a038: 2600 6c00 676f 6e69 003d 6170 7373 6f77 .&.login=.passwo
  72898. 803a048: 6472 003d 5448 5054 312f 302e 3220 3030 rd=.HTTP/1.0 200
  72899. 803a058: 4f20 0d4b 430a 6e6f 6574 746e 542d 7079 OK..Content-Typ
  72900. 803a068: 3a65 6574 7478 682f 6d74 0d6c 530a 7465 e:text/html..Set
  72901. 803a078: 432d 6f6f 696b 3a65 7520 616e 656d 003d -Cookie: uname=.
  72902. 803a088: 0a0d 6553 2d74 6f43 6b6f 6569 203a 6469 ..Set-Cookie: id
  72903. 803a098: 003d 0a0d 6553 2d74 6f43 6b6f 6569 203a =...Set-Cookie:
  72904. 803a0a8: 6f72 656c 003d 213c 4f44 5443 5059 2045 role=.<!DOCTYPE
  72905. 803a0b8: 7468 6c6d 3c3e 7468 6c6d 6c20 6e61 3d67 html><html lang=
  72906. 803a0c8: 3c3e 6568 6461 3c3e 656d 6174 6820 7474 ><head><meta htt
  72907. 803a0d8: 2d70 7165 6975 3d76 7222 6665 6572 6873 p-equiv="refresh
  72908. 803a0e8: 2022 6f63 746e 6e65 3d74 3022 753b 6c72 " content="0;url
  72909. 803a0f8: 2f3d 6e69 6564 2e78 7468 6c6d 2f22 3c3e =/index.html"/><
  72910. 803a108: 682f 6165 3e64 2f3c 7468 6c6d 0d3e 0d0a /head></html>...
  72911. 803a118: 000a 90d0 b4d0 bcd0 b8d0 bdd0 b8d0 81d1 ................
  72912. 803a128: 82d1 80d1 b0d0 82d1 bed0 80d1 d000 d09f ................
  72913. 803a138: d0be d1bb d08c d0b7 d0be d0b2 d1b0 d082 ................
  72914. 803a148: d0b5 d1bb 008c 6f72 6574 756b 7370 3b00 ......rotekups.;
  72915. 803a158: 4800 5454 0050 6572 6461 635f 6d6f 756d .HTTP.read_commu
  72916. 803a168: 696e 7974 003d 7277 7469 5f65 6f63 6d6d nity=.write_comm
  72917. 803a178: 6e75 7469 3d79 6d00 6e61 6761 7265 5049 unity=.managerIP
  72918. 803a188: 003d 616d 616e 6567 4972 3250 003d 616d =.managerIP2=.ma
  72919. 803a198: 616e 6567 4972 3350 003d 616d 616e 6567 nagerIP3=.manage
  72920. 803a1a8: 4972 3450 003d 616d 616e 6567 4972 3550 rIP4=.managerIP5
  72921. 803a1b8: 003d 6864 7063 003d 7069 6461 7264 003d =.dhcp=.ipaddr=.
  72922. 803a1c8: 7767 003d 616d 6b73 003d 7372 655f 616e gw=.mask=.rs_ena
  72923. 803a1d8: 6c62 6465 003d 7372 735f 7265 6576 3d72 bled=.rs_server=
  72924. 803a1e8: 7200 5f73 6f70 7472 003d 7372 705f 6477 .rs_port=.rs_pwd
  72925. 803a1f8: 003d 7372 6b5f 7965 003d 6964 3d31 7200 =.rs_key=.di1=.r
  72926. 803a208: 316f 003d 6f72 3d32 6e00 7074 003d 746e o1=.ro2=.ntp=.nt
  72927. 803a218: 7370 7265 6976 3d70 7400 6d69 3d65 7500 pservip=.time=.u
  72928. 803a228: 6374 003d 003f 7270 646f 7461 3d65 4800 tc=.?.prodate=.H
  72929. 803a238: 5454 2f50 2e31 2030 3032 2030 4b4f 0a0d TTP/1.0 200 OK..
  72930. 803a248: 6f43 746e 6e65 2d74 7954 6570 743a 7865 Content-Type:tex
  72931. 803a258: 2f74 7468 6c6d 0a0d 0a0d 7254 6575 6f00 t/html....True.o
  72932. 803a268: 6e77 7265 003d 7973 4c73 636f 7461 6f69 wner=.sysLocatio
  72933. 803a278: 3d6e 6300 6d6f 656d 746e 003d 4547 2054 n=.comment=.GET
  72934. 803a288: 6d2f 6961 2e6e 7363 0073 4547 2054 722f /main.css.GET /r
  72935. 803a298: 746f 6b65 702e 676e 4700 5445 2f20 6166 otek.png.GET /fa
  72936. 803a2a8: 6976 6f63 2e6e 6369 006f 4547 2054 722f vicon.ico.GET /r
  72937. 803a2b8: 6c6f 2e65 736a 5000 534f 2054 6c2f 676f ole.js.POST /log
  72938. 803a2c8: 6e69 632e 6967 2f00 6f6c 6967 2e6e 7468 in.cgi./login.ht
  72939. 803a2d8: 6c6d 5400 6f6f 6c20 6e6f 2067 4f50 5453 ml.Too long POST
  72940. 803a2e8: 7220 7165 6575 7473 0d21 000a 4547 2054 request!...GET
  72941. 803a2f8: 6d2f 6961 2e6e 736a 4700 5445 2f20 6573 /main.js.GET /se
  72942. 803a308: 7474 6e69 7367 682e 6d74 006c 4547 2054 ttings.html.GET
  72943. 803a318: 692f 666e 2e6f 7468 6c6d 4700 5445 2f20 /info.html.GET /
  72944. 803a328: 6567 4a74 6f73 2e6e 6763 0069 4547 2054 getJson.cgi.GET
  72945. 803a338: 732f 7465 6974 676e 2e73 6763 0069 4547 /settings.cgi.GE
  72946. 803a348: 2054 692f 666e 2e6f 6763 0069 4547 2054 T /info.cgi.GET
  72947. 803a358: 722f 7365 7465 632e 6967 4700 5445 2f20 /reset.cgi.GET /
  72948. 803a368: 6572 6f62 746f 632e 6967 4700 5445 2f20 reboot.cgi.GET /
  72949. 803a378: 6f63 666e 7269 2e6d 6763 0069 692f 646e confirm.cgi./ind
  72950. 803a388: 7865 682e 6d74 006c 4f50 5453 2f20 6863 ex.html.POST /ch
  72951. 803a398: 6365 706b 6477 632e 6967 4700 5445 2f20 eckpwd.cgi.GET /
  72952. 803a3a8: 6573 5074 6f72 6164 6574 632e 6967 4700 setProdate.cgi.G
  72953. 803a3b8: 5445 2f20 7270 676f 6e6f 632e 6967 2f00 ET /progon.cgi.
  72954. 0803a3c7 <data__index_html>:
  72955. 803a3c7: 692f 646e 7865 682e 6d74 006c 5448 5054 /index.html.HTTP
  72956. 803a3d7: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  72957. 803a3e7: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  72958. 803a3f7: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  72959. 803a407: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  72960. 803a417: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  72961. 803a427: 6e65 2d74 654c 676e 6874 203a 3031 3036 ent-Length: 1060
  72962. 803a437: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  72963. 803a447: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  72964. 803a457: 3a65 7420 7865 2f74 7468 6c6d 0a0d 6f43 e: text/html..Co
  72965. 803a467: 746e 6e65 2d74 6e45 6f63 6964 676e 203a ntent-Encoding:
  72966. 803a477: 7a67 7069 0a0d 0a0d 8b1f 0008 0000 0000 gzip............
  72967. 803a487: 0a04 56ad 6f5b 351c fe14 662b 92fa 9948 ...V[o.5..+f..H.
  72968. 803a497: aa6c 12aa 9d82 4291 a45a 513e 8a21 29e0 l......BZ.>Q!..)
  72969. 803a4a7: cef2 3378 3c4e da97 ddde 5bec 409a 0a0b ..x3N<.....[.@..
  72970. 803a4b7: 1162 a812 802f 2fc4 8148 5c85 e936 f05f b.../../H..\6._.
  72971. 803a4c7: 23fc db3e 6499 1ddb 8b42 9878 19cb dcfb .#>..d..B.x.....
  72972. 803a4d7: f3be 339d beee ef73 8da3 3e4f 787f 649f ...3..s...O>.x.d
  72973. 803a4e7: 173a d771 89de c5a0 1456 9004 4d18 6ee3 :.q.....V....M.n
  72974. 803a4f7: 34ce 4925 a546 3a62 060a 1fba 8bbe f735 .4%IF.b:......5.
  72975. 803a507: d335 0aba e3d9 1f01 c146 e167 f5a3 a370 5.......F.g...p.
  72976. 803a517: 2bcc 79aa b04f 2480 a165 0159 0795 23f7 .+.yO..$e.Y....#
  72977. 803a527: 6e96 46b1 a0a9 8b39 2182 a367 94aa 6e7a .n.F..9..!g...zn
  72978. 803a537: 88df 3aa7 528b e436 0b09 b09d 0bc2 39ae ...:.R6........9
  72979. 803a547: a115 a84a d160 95ed ee9c 7cf2 5f90 03c9 ..J.`......|._..
  72980. 803a557: a4c5 2813 465c 706b b9a1 2c16 bf36 a398 ...(\Fkp...,6...
  72981. 803a567: cf7a 991c 9999 fbd6 5ef5 d87d f8ed ae95 z........^}.....
  72982. 803a577: c5e0 c90e eb24 4147 794e 9ab1 1528 c910 ....$.GANy..(...
  72983. 803a587: 1444 3d28 4c16 8c65 d869 8951 95e4 7a26 D.(=.Le.i.Q...&z
  72984. 803a597: 215c cd58 7576 9b67 a90e 1aff 2510 2893 \!X.vug......%.(
  72985. 803a5a7: a590 ab60 0adb 3b9b 3bfe 3c5e bd64 1d32 ..`....;.;^<d.2.
  72986. 803a5b7: ddc7 0f94 2249 52a8 5051 61d0 4a8f 1fe2 ....I".RQP.a.J..
  72987. 803a5c7: ca61 74fa 7420 f623 2ef9 434b 565d b4b0 a..t t#...KC]V..
  72988. 803a5d7: 13a0 8b5a fa4c b8a5 2f4b e743 ca45 5776 ..Z.L...K/C.E.vW
  72989. 803a5e7: b96d a000 21f7 adca c6d2 7142 4cc1 6f73 m....!....Bq.Lso
  72990. 803a5f7: 6e34 8405 c8a7 1599 9083 36a3 5b97 a207 4n.........6.[..
  72991. 803a607: 47d1 4d70 7844 bbf5 4bed c80c 746e 134c .GpMDx...K..ntL.
  72992. 803a617: 87cd 6f28 e81b 1836 3eab 026f d23c d8bc ..(o..6..>o.<...
  72993. 803a627: 3e52 d8fc 84fc 3d5a 55b1 1732 c4e6 9a9c R>....Z=.U2.....
  72994. 803a637: 9f63 ebc3 bc6a 97e8 ca8d 7373 7f5e 2e61 c...j.....ss^.a.
  72995. 803a647: 32a0 f283 7353 4f5c 95da ae32 2974 8dc7 .2..Ss\O..2.t)..
  72996. 803a657: 8fde 01f5 ce74 8c41 ebb3 9dfd 9801 21ef ....t.A........!
  72997. 803a667: 839b 247f 5569 7801 da87 9725 4581 bb76 ...$iU.x..%..Ev.
  72998. 803a677: 4f35 9e7c 5daf 0b45 8826 37bb 86d5 9cee 5O|..]E.&..7....
  72999. 803a687: bf75 6b64 240b 0fbc b0f5 591c 8e7f 5186 u.dk.$.....Y...Q
  73000. 803a697: 9490 94a2 91ef fd5b ddfe bbb5 d996 3a0a ......[........:
  73001. 803a6a7: ad4d 2a72 4277 722a 8dba 8e85 895d 7989 M.r*wB*r....]..y
  73002. 803a6b7: 516e 2804 90cf b1e0 2539 25e6 d970 ae47 nQ.(....9%.%p.G.
  73003. 803a6c7: eb10 5909 df32 87d7 f780 feac 5b16 6ea6 ...Y2........[.n
  73004. 803a6d7: 74d3 3179 1f71 a59a 6c30 db6b 8d58 2f57 .ty1q...0lk.X.W/
  73005. 803a6e7: 5ee8 34a8 3db5 25a2 34ae dd86 512f 3fba .^.4.=.%.4../Q.?
  73006. 803a6f7: f160 4cc2 1e09 e647 7a25 626e 6cfe 90dc `..L..G.%znb.l..
  73007. 803a707: 4fa5 37d7 0be0 adbb cf86 d2c5 7d71 2ae3 .O.7........q}.*
  73008. 803a717: bf01 71da af46 1f0c 77fe f7d3 c5fe 1374 ...qF....w....t.
  73009. 803a727: 11f3 01b0 8e20 4083 800f c4b5 8bc9 becd .... ..@........
  73010. 803a737: 8f64 83db f06d 78c9 329a 58db 941e d8eb d...m..x.2.X....
  73011. 803a747: c8df 3945 37d0 f0f8 d146 e62a 4077 607b ..E9.7..F.*.w@{`
  73012. 803a757: 42fe db25 ad02 7646 7856 b44a fa20 2a2b .B%...FvVxJ. .+*
  73013. 803a767: 8a72 f826 0c1a 2139 85e8 8a29 6c74 2d66 r.&...9!..).tlf-
  73014. 803a777: 5729 9979 a1da 62dd 35ab 6be1 53d3 a0b0 )Wy....b.5.k.S..
  73015. 803a787: 027e 3d2c 271f 6a9e 2e6d 912c c6de fa07 ~.,=.'.jm.,.....
  73016. 803a797: 3c1e b903 ae9b 0027 37e4 7b08 1f36 050c .<....'..7.{6...
  73017. 803a7a7: 6e60 835d c0f7 4dc8 7306 e2d2 0a98 f32a `n]....M.s....*.
  73018. 803a7b7: dcb6 8e3a 2de3 a0e3 61ad a03f 335a 5e39 ..:..-...a?.Z39^
  73019. 803a7c7: d968 773b 6492 b5ad cb65 2b9d c4a7 877c h.;w.d..e..+..|.
  73020. 803a7d7: 5034 330b 75c3 4f56 ef5c 3862 49a1 44d1 4P.3.uVO\.b8.I.D
  73021. 803a7e7: 102f a83d 2ae8 8184 06e8 c2fa 78fc 269b /.=..*.......x.&
  73022. 803a7f7: 01fd f2a3 d7d4 fea4 c166 42fe f663 dea8 ........f..Bc...
  73023. 803a807: a84c 25fd d4b5 92ff 88e1 c0f5 6dcd 4c3b L..%.........m;L
  73024. 803a817: 91ce 1a01 1f69 9a8c f261 114c 3239 f370 ....i...a.L.92p.
  73025. 803a827: 8db6 bca7 9828 d4dc ff2c 1707 17ff 7ac5 ....(...,......z
  73026. 803a837: 5037 a7cc b3f1 29a3 5468 857f a7d8 2690 7P.....)hT.....&
  73027. 803a847: 8204 8d6d cd99 1ec8 5e23 c1d8 0ee0 af11 ..m.....#^......
  73028. 803a857: 300f 938b 39e6 14db 6fac e267 5a02 32af .0...9...og..Z.2
  73029. 803a867: fe6a dccf c7f1 3784 6938 83b8 abca 8d27 j......78i....'.
  73030. 803a877: b51b 94e2 fa6a ce21 0f0d a58a 95e5 4a8a ....j.!........J
  73031. 803a887: ab9a 198f 9806 96ca df96 8c47 70ee 6083 ..........G..p.`
  73032. 803a897: a9dd 6fef d09c 6b2e 0a05 0000 ...o...k....
  73033. 0803a8a3 <data__settings_html>:
  73034. 803a8a3: 732f 7465 6974 676e 2e73 7468 6c6d 0000 /settings.html..
  73035. 803a8b3: 5448 5054 312f 312e 3220 3030 4f20 0d4b HTTP/1.1 200 OK.
  73036. 803a8c3: 530a 7265 6576 3a72 6c20 4977 2f50 2e31 .Server: lwIP/1.
  73037. 803a8d3: 2e33 2031 6828 7474 3a70 2f2f 6173 6176 3.1 (http://sava
  73038. 803a8e3: 6e6e 6861 6e2e 6e6f 6e67 2e75 726f 2f67 nnah.nongnu.org/
  73039. 803a8f3: 7270 6a6f 6365 7374 6c2f 6977 2970 0a0d projects/lwip)..
  73040. 803a903: 6f43 746e 6e65 2d74 654c 676e 6874 203a Content-Length:
  73041. 803a913: 3134 3636 0a0d 6f43 6e6e 6365 6974 6e6f 4166..Connection
  73042. 803a923: 203a 6c43 736f 0d65 430a 6e6f 6574 746e : Close..Content
  73043. 803a933: 742d 7079 3a65 7420 7865 2f74 7468 6c6d -type: text/html
  73044. 803a943: 0a0d 6f43 746e 6e65 2d74 6e45 6f63 6964 ..Content-Encodi
  73045. 803a953: 676e 203a 7a67 7069 0a0d 0a0d 8b1f 0008 ng: gzip........
  73046. 803a963: 0000 0000 0a04 5bdd 73eb d713 ff15 1657 .......[.s....W.
  73047. 803a973: 66d1 31ec 2d92 783f 5245 0527 e19a 1243 .f.1.-?xER'...C.
  73048. 803a983: 3826 f34d 5989 6b4b 836b abb4 56ae 6e36 &8M..YKkk....V6n
  73049. 803a993: 1986 490c 199b 6268 6908 9432 a010 2fcf ...I..hb.i2..../
  73050. 803a9a3: 0d69 61e6 e36c 0bfc ffab bfa8 b9df 5f77 i..al.........w_
  73051. 803a9b3: 5696 6016 e97f d907 b8fb 9cf7 cf73 9cfb .V.`........s...
  73052. 803a9c3: b77b e874 07f4 66a7 393f c677 fba8 46cd {.t....f?9w....F
  73053. 803a9d3: c4a5 46bf 74c3 ca16 1cb9 2cee 56b3 3529 ...F.t.....,.V)5
  73054. 803a9e3: df2d aa34 d375 5b6b 397e f1d7 f3e7 f1c7 -.4.u.k[~9......
  73055. 803a9f3: 9e4e 7dd6 95bf 7eb7 b1df cb17 dfb9 3fe5 N..}...~.......?
  73056. 803aa03: 277a ca7f b66d df4c 6b9e 3958 eaa3 be3a z'..m.L..kX9..:.
  73057. 803aa13: 60e5 d9ca 6533 b6ab 8560 1c93 69b3 7395 .`..3e..`....i.s
  73058. 803aa23: b68b d4b5 3d72 313f c96e f9ae 72f5 5acd ....r=?1n....r.Z
  73059. 803aa33: abb4 5e56 8e6e 8ed8 dbed 2366 aedf 0d9a ..V^n.....f#....
  73060. 803aa43: 5cab d23c 2f34 cdd9 334e efba 2db4 6e4f .\<.4/..N3...-On
  73061. 803aa53: a04c 4f2c 8500 fb6f ab0d fc12 ac10 5775 L.,O..o.......uW
  73062. 803aa63: 57ba 57bb 9d82 45e0 19b0 946c d5c6 529b .W.W...E..l....R
  73063. 803aa73: 76c3 1a2e cf75 2f9a 9ae7 eda6 aa14 76ed .v..u../.......v
  73064. 803aa83: f0ce 46ac d739 97f6 561b 6ebb 3e59 b4e0 ...F9....V.nY>..
  73065. 803aa93: 9eab f2dd 7f0d 05b9 7d62 92eb fe3f b9a9 ........b}..?...
  73066. 803aaa3: aa68 39a7 eda3 cb55 cf39 586d 4f85 18db h..9..U.9.mX.O..
  73067. 803aab3: ae3c e39e b142 ce6c 2dad 4a57 7b35 b0d1 <...B.l..-WJ5{..
  73068. 803aac3: e56b d55c 38ed 7e7e 33c9 185b 7a9a 7358 k.\..8~~.3[..zXs
  73069. 803aad3: 1c97 6b3c 8255 a03b a5f3 77a6 d82b 9e0a ..<kU.;....w+...
  73070. 803aae3: af76 c118 eea3 e0b5 2e09 1aaf cfc1 127c v.............|.
  73071. 803aaf3: 0d3c 079e c16b f77a 5e0a c33c 4bdd fba3 <...k.z..^<..K..
  73072. 803ab03: f0a7 5185 b76a 274c d081 34e9 2ce7 572f ...Qj.L'...4.,/W
  73073. 803ab13: 0199 7879 3153 2bba b298 a989 832f 8527 ..yxS1.+..../.'.
  73074. 803ab23: 78d2 e40b 9a82 4904 ab75 f17a 56a3 f4cd .x.....Iu.z..V..
  73075. 803ab33: 73ad b826 2952 bbcd d35e ab30 edbe 503a .s&.R)..^.0...:P
  73076. 803ab43: 0308 af32 58bb cb50 936d 2045 56fb 18f0 ..2..XP.m.E .V..
  73077. 803ab53: 9f30 1b04 abdd 53c1 b952 1c26 eadf 30de 0......SR.&....0
  73078. 803ab63: 74f0 fbab 11b5 ee3c 817e 3db5 d609 6970 .t....<.~..=..pi
  73079. 803ab73: 1ac8 059e c11b 81b6 8f87 c940 200e b960 ..........@.. `.
  73080. 803ab83: dab8 e8e0 831f 8a7b db34 7569 597c 6b4d ......{.4.iu|YMk
  73081. 803ab93: 96a9 72d3 8168 25ac c3d7 b57d cb81 8e72 ...rh..%..}...r.
  73082. 803aba3: e604 68a9 4590 68ce cc35 55aa 1b77 cb35 ...h.E.h5..Uw.5.
  73083. 803abb3: e72b 2a00 2622 df1a 1770 076c b3e2 00ff +..*"&..p.l.....
  73084. 803abc3: 4ea9 604e e649 86a5 2ce5 ef40 c572 39a3 .NN`I....,@.r..9
  73085. 803abd3: e943 8466 52a6 f39a 4fd4 a391 61b4 e3ae C.f..R...O...a..
  73086. 803abe3: 2efb 88a0 1b6c db6e 73ca 8442 ce63 0c77 ....l.n..sB.c.w.
  73087. 803abf3: f2fc 9835 b411 76d3 2d16 b7cf f340 d9a2 ..5....v.-..@...
  73088. 803ac03: 00e8 706d cc0f 96da af25 2ae5 2946 ba09 ..mp....%..*F)..
  73089. 803ac13: 99dd da6b 09b4 bcb5 5410 53bb 5aad 76ed ..k......T.S.Z.v
  73090. 803ac23: 9602 54eb 761b 22f5 d094 3bf2 039e 84fb ...T.v."...;....
  73091. 803ac33: ceec 7c7d 647a c8f4 62a1 d51a 60cf 1afa ..}|zd...b...`..
  73092. 803ac43: 0cb8 7519 406f e36c 5a64 fb28 0358 4a34 ...uo@l.dZ(.X.4J
  73093. 803ac53: 5cc7 339c 303d ff82 35f2 de6b 34ec f0fc .\.3=0...5k..4..
  73094. 803ac63: de76 64be f2d5 1bbe 722a 4e6a ba9e 854f v..d....*rjN..O.
  73095. 803ac73: 8ea3 4a57 36a6 db32 59a9 0a97 2c74 b2d1 ..WJ.62..Y..t,..
  73096. 803ac83: 0520 8497 6998 c22a 8719 6b15 969b c9d3 ....i*....k....
  73097. 803ac93: 10db 1eae 69da 6c84 7101 4521 54b8 79a3 .....i.l.q!E.T.y
  73098. 803aca3: 8151 f771 5c45 cad1 46b0 d3be baca 15d7 Q.q.E\...F......
  73099. 803acb3: 8e76 ce4f 8b81 6df3 a167 a69d 1697 08b0 v.O....mg.......
  73100. 803acc3: d5ff abcf 0d70 a1bb ced8 abbc 5420 ef82 ....p....... T..
  73101. 803acd3: d661 079f 903b 36c1 f1f4 d48f fef2 eba8 a...;..6........
  73102. 803ace3: db76 bd77 70e5 5fde d7ba e730 2425 15b7 v.w..p._..0.%$..
  73103. 803acf3: 1f8f c0ef f747 8c88 a59e c605 db6b af17 ....G.......k...
  73104. 803ad03: 5e0b 8bd4 097d e3c6 5812 e549 4285 b0da .^..}....XI..B..
  73105. 803ad13: 5876 7e77 bdce 3644 be13 3d18 f35f ba02 vXw~..D6...=_...
  73106. 803ad23: da14 c47f ea9b 1d82 82fb cf77 62cc e862 ..........w..bb.
  73107. 803ad33: 7cd5 0e73 30c3 6b49 ba86 0357 6d04 1cfc .|s..0Ik..W..m..
  73108. 803ad43: a302 498b ff72 db70 b669 ed62 6c57 359f ...Ir.p.i.b.Wl.5
  73109. 803ad53: 72e7 f395 bfef 2e77 4366 8e6a b8ed 781d .r....w.fCj....x
  73110. 803ad63: e0a3 1801 05f6 0b3c d0dc 72a6 e0a6 26dd ......<....r...&
  73111. 803ad73: 9d84 ea21 8ec3 2fe5 1e71 0235 f8d6 7bb8 ..!..../q.5....{
  73112. 803ad83: 763d 7b61 ca2a 0461 c61e 0d29 8ae0 d7d8 =va{*.a...).....
  73113. 803ad93: 064a 9e89 eb59 58d8 87ec 9cef fb3e f9d1 J...Y..X....>...
  73114. 803ada3: 418c 8f8e c3a5 8aa3 dc8b 6a4e 2ec9 53a9 .A........Nj...S
  73115. 803adb3: 6934 8146 70cb 96f0 6a48 be11 61db a5ac 4iF..p..Hj...a..
  73116. 803adc3: 3448 f9b7 21b2 09e6 0edd 1999 feb9 20d4 H4...!.........
  73117. 803add3: 2e46 6da3 cb89 1637 b73c cbb3 abd4 c36e F..m..7.<.....n.
  73118. 803ade3: 3460 50b9 e0bc 5fce a498 cd00 ab39 4061 `4.P..._....9.a@
  73119. 803adf3: 1857 1d4f 2e13 ecef 48b9 3dfe 85c3 e4dd W.O......H.=....
  73120. 803ae03: 0316 115c c3a6 29d9 7b62 a4a6 241c 7123 ..\....)b{...$#q
  73121. 803ae13: 9d04 1a0a 7f7b 25f2 8141 e572 83f1 70d0 ....{..%A.r....p
  73122. 803ae23: d1fa 193b ec81 9ec1 7822 e0f2 0608 bb09 ..;....."x......
  73123. 803ae33: 2628 9573 f7ad 7923 486a a792 8e0e 9064 (&s...#yjH....d.
  73124. 803ae43: 8bb0 a9e4 2481 0f4f f249 c1f4 0c91 7612 .....$O.I......v
  73125. 803ae53: 3c91 903d 99e4 4921 8e46 5075 0c9a 7612 .<=...!IF.uP...v
  73126. 803ae63: 3c91 9113 13dc 7a0a 37d4 9e69 e21e 85f3 .<.....z.7i.....
  73127. 803ae73: dbaa 766c 5590 672f ecaf 8c43 9033 abc9 ..lv.U/g..C.3...
  73128. 803ae83: fb71 b2be 64dd d5a8 7eed 4c9a e2cc 2705 q....d...~.L...'
  73129. 803ae93: 612c b3c9 6b7d e598 cc7c 0781 9eb8 421e ,a..}k..|......B
  73130. 803aea3: 82d4 1e7a 5ff7 1291 f261 186f 554b 0b60 ..z.._..a.o.KU`.
  73131. 803aeb3: b87d f1f6 7d10 63b6 181f f703 dfcb a7d7 }....}.c........
  73132. 803aec3: 9243 6522 d49b 20b1 8db8 66f4 4105 9517 C."e... ...f.A..
  73133. 803aed3: 620a 4bea 5115 0175 38c0 9f5c 8146 52c6 .b.K.Qu..8\.F..R
  73134. 803aee3: 042d 3721 9358 eaaf 1f26 b6d9 8f5f 21aa -.!7X...&..._..!
  73135. 803aef3: c015 b951 d5d5 dbe3 d308 582f 31d6 06da ..Q......./X.1..
  73136. 803af03: d54f 718b c24e a910 7d55 7955 9c09 055a O..qN...U}Uy..Z.
  73137. 803af13: c5f1 0147 5fcb 6adb a820 4b69 d9aa 50c8 ..G.._.j .iK...P
  73138. 803af23: 2e18 42e4 bfc7 3054 94a9 16dc a2f3 6730 ...B..T0......0g
  73139. 803af33: 322f 2332 d8af 9032 ddd0 7e0c 8d2c f7ab /22#..2....~,...
  73140. 803af43: c7bb 67c1 5533 6631 9291 63c5 15c6 9276 ...g3U1f...c..v.
  73141. 803af53: 5209 c134 d28a e171 e840 13e8 8da2 1b98 .R4...q.@.......
  73142. 803af63: da05 8c41 0fbf b0ce 7a8a 3311 bafd bbaa ..A......z.3....
  73143. 803af73: 81f6 dfed cb0b 5077 a26a 0b48 c936 68ec ......wPj.H.6..h
  73144. 803af83: af15 76c2 d5cf 976c 618b 7ed9 da07 f2c4 ...v..l..a.~....
  73145. 803af93: 4372 5d4a 1768 68d2 8a14 68ac df58 3e49 rCJ]h..h...hX.I>
  73146. 803afa3: 299d 640c 2cec 5f79 0217 99e2 f388 99fc .).d.,y_........
  73147. 803afb3: 81d9 d4d2 86fa a0f4 beaf 2e79 3ba2 4df5 ..........y..;.M
  73148. 803afc3: fe2e 169f ae3e 2e0d c6ad bcfd 6499 09db ....>........d..
  73149. 803afd3: 67b3 ba4e 3387 33db df31 972f 3496 d63b .gN..3.31./..4;.
  73150. 803afe3: 28d1 d086 d2bd 6e89 dce8 2454 a4ad 51b2 .(.....n..T$...Q
  73151. 803aff3: baa9 3a59 8e85 5ea5 696d 22cf a857 ebd2 ..Y:...^mi."W...
  73152. 803b003: 02ec d3c0 fee0 8fbc cace 28c8 7e6a a394 ...........(j~..
  73153. 803b013: e83b 5c8e 4a83 554b 9c6e 973d 4687 113f ;..\.JKUn.=..F?.
  73154. 803b023: b9c7 ca22 8d0d 91df 3192 f9a9 62e8 34e9 .."......1...b.4
  73155. 803b033: b143 1138 ed0e 5996 a1ab d406 15da 1f91 C.8....Y........
  73156. 803b043: 8fba 0634 8ea0 63ba a1da 45ae 93b0 08ec ..4....c...E....
  73157. 803b053: 10b9 4982 7f2d 648f 243c c549 7d43 ba17 ...I-..d<$I.C}..
  73158. 803b063: 04ba 0be9 434b fd93 b825 15f6 609b 4efb ....KC..%....`.N
  73159. 803b073: 892c 8450 aae2 910f b34d 317d cc9b 2ee0 ,.P.....M.}1....
  73160. 803b083: 919c 26f8 c136 eed0 0dc2 6043 b02c 62fd ...&6.....C`,..b
  73161. 803b093: a2aa 5143 d72a ad21 a349 d753 2944 a2c5 ..CQ*.!.I.S.D)..
  73162. 803b0a3: 552e dd43 2e18 6095 1685 b556 d480 ef27 .UC....`..V...'.
  73163. 803b0b3: b578 915a c1b5 10a0 0ab6 cecf e4e6 7e36 x.Z...........6~
  73164. 803b0c3: 1c68 ff52 8041 21ce 811e 57bd dfc5 253f h.R.A..!...W..?%
  73165. 803b0d3: 994f a847 9c2e 0c6e 2d86 ad39 61fd 4cdf O.G...n..-9..a.L
  73166. 803b0e3: afb7 4994 8422 13df 5f5d 6dd3 4447 0312 ...I"...]_.mGD..
  73167. 803b0f3: 9f50 87aa 71a5 0405 b91d 01d7 1dfd f7ec P....q..........
  73168. 803b103: 9a67 b055 0099 2eca 0ee8 9ebb c16b 7473 g.U.........k.st
  73169. 803b113: be9d 1f66 40f4 4510 9340 ff09 7d00 da8d ..f..@.E@....}..
  73170. 803b123: 490c 4762 b5a8 e6c1 7ee8 571a 3d5a ad33 .IbG.....~.WZ=3.
  73171. 803b133: 2f60 d0ed d759 0beb 6a3e a2b9 8d0d 14bc `/..Y...>j......
  73172. 803b143: 5ca9 2bf7 1466 f1aa b11c f5ef 7f84 012b .\.+f.........+.
  73173. 803b153: 1c51 047a 686f c471 a924 c088 9fd6 9071 Q.z.ohq.$.....q.
  73174. 803b163: 4902 e038 7a41 7112 914a 4925 6c98 1c44 .I8.Az.qJ.%I.lD.
  73175. 803b173: 7128 03b1 1beb f6cf 96d2 bb3e af29 34ef (q........>.)..4
  73176. 803b183: 841e facd fee4 9a06 afb8 2eef c5b0 f795 ................
  73177. 803b193: 39ac 65d7 efc3 7147 c9b4 9d9d cce7 df71 .9.e..Gq......q.
  73178. 803b1a3: 7e14 f647 e871 76f3 b36f cbb0 6d89 0896 .~G.q..vo....m..
  73179. 803b1b3: b241 0ca0 9a13 4bd7 427f 6b3f 5aa8 0c49 A......K.B?k.ZI.
  73180. 803b1c3: 6b4c d233 ed75 37d1 be18 11a5 55fe 67e4 Lk3.u..7.....U.g
  73181. 803b1d3: 637a ac57 9200 ab37 ea06 04ab d530 8d6b zcW...7.....0.k.
  73182. 803b1e3: 2952 e0b8 3118 b784 111f 0d8d a4ba 7b43 R)...1........C{
  73183. 803b1f3: d4a3 6bd1 b05f 961c d8c6 9228 2725 e3ee ...k_.....(.%'..
  73184. 803b203: 1234 649d d3bb 244e 5292 c694 de8c d1c5 4..d..N$.R......
  73185. 803b213: 8d84 3e03 d65b 26dc 6be8 5852 c04c b856 ...>[..&.kRXL.V.
  73186. 803b223: cdee 8046 0b92 937c 3064 5f81 2f25 83f1 ..F...|.d0._%/..
  73187. 803b233: 4430 a9a4 9bd5 6ac3 ac23 9d27 0665 808d 0D.....j#.'.e...
  73188. 803b243: f57a e820 9854 2a23 6dd5 7ba2 b7d3 851d z. .T.#*.m.{....
  73189. 803b253: c8e5 6546 7326 db13 af91 744e 23b4 0a19 ..Fe&s....Nt.#..
  73190. 803b263: d52f 08ad 4615 8808 c6e9 69be d67f b45e /....F.....i..^.
  73191. 803b273: 7406 64ff fa2b f609 b812 78e3 9450 050a .t.d+......xP...
  73192. 803b283: a511 0bbc ed29 0575 40d4 845a 906c eb84 ....).u..@Z.l...
  73193. 803b293: 2a1f fd87 4f5b c7ba 8bfc 425b b046 3cc1 .*..[O....[BF..<
  73194. 803b2a3: 8180 ed4c 22c4 dca9 972f 5090 8ee3 1d5f ..L.."../..P.._.
  73195. 803b2b3: 6e60 02ff 2b2d 1628 e31e 42f7 06ea bda4 `n..-+(....B....
  73196. 803b2c3: 43d8 0012 d769 63d2 ba79 a59f 2db5 0dad .C..i..cy....-..
  73197. 803b2d3: af8a 9b82 e37c eec5 553e 38be 9859 55c8 ....|...>U.8Y..U
  73198. 803b2e3: de46 6f7d c0d6 c9f5 8989 2351 49f8 3bfa F.}o......Q#.I.;
  73199. 803b2f3: 9adc ed61 79b9 80c4 a02a 02c9 3d9e 5fc3 ..a..y..*....=._
  73200. 803b303: 5edd fb8a e920 590e 58be 404c 2a2c 9288 .^.. ..Y.XL@,*..
  73201. 803b313: 836f 58cb 81a3 6912 7503 b5d1 9fee 1783 o..X...i.u......
  73202. 803b323: fd00 2000 f1b7 8102 7fae 26f7 9c5f 0048 ... .......&_.H.
  73203. 803b333: 509c bf00 2cc1 f492 5582 c640 13bc b4f1 .P...,...U@.....
  73204. 803b343: 6a13 aad6 1414 9e52 ce65 1e3a 3acf 66ae .j....R.e.:..:.f
  73205. 803b353: 443d ce6d 0ba3 0560 04d4 0345 c584 459d =Dm...`...E....E
  73206. 803b363: 4f84 39ad 43e8 608d ff21 560e 9f45 70ee .O.9.C.`!..VE..p
  73207. 803b373: 7e10 31d0 d0a4 d419 8b1d 1cf1 d70b 8524 .~.1..........$.
  73208. 803b383: 1bce 3e43 431a aa3e ff20 e993 b72d 41bb ..C>.C>. ...-..A
  73209. 803b393: 8e14 8064 21b8 87a9 ee7c 0d42 9db8 158a ..d..!..|.B.....
  73210. 803b3a3: ae67 2665 38c6 30a3 82de 6657 567f 0b35 g.e&.8.0..Wf.V5.
  73211. 803b3b3: c787 1376 ad94 1663 3c6a fee0 f02b b762 ..v...c.j<..+.b.
  73212. 803b3c3: 133c 74ef 778c e15a c55d 2dcc 5191 5db2 <..t.wZ.]..-.Q.]
  73213. 803b3d3: 83d2 293f 5121 766f b110 4c4b 1443 6bbc ..?)!Qov..KLC..k
  73214. 803b3e3: 0479 dc16 a264 2a9e fbc0 b32b 3a99 4539 y...d..*..+..:9E
  73215. 803b3f3: f9ab 7ba1 f103 73f7 92cc 3583 30fa 93cb ...{...s...5.0..
  73216. 803b403: 1001 c322 529b dfc4 2214 639e 5bd1 676c .."..R...".c.[lg
  73217. 803b413: 9082 629b 1026 7757 1f25 a2ac cde7 3a86 ...b&.Ww%......:
  73218. 803b423: bc29 530d b6a4 24c0 2bc9 cca2 9444 70b0 )..S...$.+..D..p
  73219. 803b433: e06d 080f 7307 a037 0009 d00e 6c19 2883 m....s7......l.(
  73220. 803b443: c132 cd26 335c 191f 831d cd31 f643 45df 2.&.\3....1.C..E
  73221. 803b453: 8007 ae8b f28d dd4c c11b 2077 1d42 11f9 ......L...w B...
  73222. 803b463: 43a1 bad7 31d7 5339 91de 001f a5b7 16cc .C...19S........
  73223. 803b473: 831b b1a5 fc0f 18ad 0ee3 1e8f 0489 8c71 ..............q.
  73224. 803b483: 2b0a 5fc4 c3b9 0476 2321 5605 a04f fa00 .+._..v.!#.VO...
  73225. 803b493: b45e 9285 5acf bc68 31ce cded 2720 9a48 ^....Zh..1.. 'H.
  73226. 803b4a3: 4100 f77f 1006 ceb0 c9c0 a02c 075c 7592 .A........,.\..u
  73227. 803b4b3: e15e 7a29 d241 83ca c3bb 8a9d 1bfb b3c1 ^.)zA...........
  73228. 803b4c3: 442c 9cb1 b4c6 ee9c 8d90 63c1 4041 4bc7 ,D.........cA@.K
  73229. 803b4d3: f179 8387 045f e78d 81ff 681e ac06 3f76 y..._......h..v?
  73230. 803b4e3: 63c7 6a1a 52e6 22a6 197b 2ad3 9777 c132 .c.j.R."{..*w.2.
  73231. 803b4f3: 2514 fa1f 97e2 2b3c ed41 f7a7 1a67 c388 .%....<+A...g...
  73232. 803b503: f867 0ebb 3764 6d65 6af0 fa82 eea7 7c95 g...d7em.j.....|
  73233. 803b513: 9f70 1a8a 2a64 6c79 4025 5628 10f2 020b p...d*yl%@(V....
  73234. 803b523: 007f a811 38b2 db11 d8f5 a874 205a 0f23 .....8....t.Z #.
  73235. 803b533: a7b5 3708 cb40 d55d 8162 af18 eee2 c05b ...7@.].b.....[.
  73236. 803b543: a303 5308 89d3 120e 1eae b472 d358 764a ...S......r.X.Jv
  73237. 803b553: 98a0 4c8e d819 4884 8768 b99c 89c3 fe9b ...L...Hh.......
  73238. 803b563: 3bde 7876 da63 7de1 be4b 8e6b 4451 d731 .;vxc..}K.k.QD1.
  73239. 803b573: 6bb0 0a02 e418 bb48 1de2 9010 6c03 0afb .k....H......l..
  73240. 803b583: 6b95 2fdd 5f31 749c ca36 e1d0 a500 4950 .k./1_.t6.....PI
  73241. 803b593: b95f 900d edd8 1001 4cd2 8edf c385 2bd3 _........L.....+
  73242. 803b5a3: 19ff a02a 6af2 a0e2 43c8 5d5a d866 299c ..*..j...CZ]f..)
  73243. 803b5b3: 4b1c 9a20 819e 91ad b65a a84d 081c 59dc .K .....Z.M....Y
  73244. 803b5c3: c614 6771 c74c c41d 4e5b a263 0a05 3c29 ..qgL...[Nc...)<
  73245. 803b5d3: f6b4 a782 2d42 defa fe9a 174c 8713 31c8 ....B-....L....1
  73246. 803b5e3: 221d 81a9 31b4 5f86 25e6 90ff 647b 024d ."...1._.%..{dM.
  73247. 803b5f3: d99e a509 7280 db20 e206 3ef8 e3a6 543b .....r ....>..;T
  73248. 803b603: d31d 3420 9100 5c22 ea54 b281 8034 3764 .. 4.."\T...4.d7
  73249. 803b613: 0aef 7dde a403 0eb0 bbf9 c59e 3884 18e9 ...}.........8..
  73250. 803b623: 49d3 7fc7 48b5 6660 f200 9490 f403 ae0e .I...H`f........
  73251. 803b633: 6659 c7a1 ab89 d07b a111 9e5d 2502 c79b Yf....{...]..%..
  73252. 803b643: 90d0 d64c 889c f675 d284 5586 3b78 760a ..L...u....Ux;.v
  73253. 803b653: c00d a261 0400 037e 7704 3348 2d0d 5a91 ..a...~..wH3.-.Z
  73254. 803b663: 158d 6a75 4b75 3080 2038 551f 5c41 4f28 ..ujuK.08 .UA\(O
  73255. 803b673: 7487 b9f1 f0ab 6ab9 40fb 93bc ac84 b06f .t.....j.@....o.
  73256. 803b683: 2824 167b 127f e1d9 5158 53fb e9aa 7e3a $({.....XQ.S..:~
  73257. 803b693: 5b20 f084 3c00 ca52 8641 7823 4f30 c54f [...<R.A.#x0OO.
  73258. 803b6a3: ac0e 07ee c0be e10a 45fa b1f5 7178 74f7 .........E..xq.t
  73259. 803b6b3: 9948 13c8 362e 764c 41ef 2a1c d108 de9f H....6Lv.A.*....
  73260. 803b6c3: 1e12 4f2a 0ebb 5235 e2d1 c2ef 1c53 c557 ..*O..5R....S.W.
  73261. 803b6d3: 2208 86db d2e1 a024 316c 78aa 5773 880a ."....$.l1.xsW..
  73262. 803b6e3: f644 828f 4065 7ff6 281f 24e5 7eec fc25 D...e@...(.$.~%.
  73263. 803b6f3: 4e82 4a17 2339 19ee 76f8 c2d3 bca1 9c59 .N.J9#...v....Y.
  73264. 803b703: 1e64 71f1 10ca 501b 76bb 91b7 0490 a1f7 d..q...P.v......
  73265. 803b713: dced 85e0 c551 536b 305e 09b9 d14e 3d93 ....Q.kS^0..N..=
  73266. 803b723: de62 39e0 1f8f b8ab 989f cd96 9e12 d62d b..9..........-.
  73267. 803b733: 641b bab8 1f10 ed09 f02d c6a9 cf62 94c3 .d......-...b...
  73268. 803b743: c943 b433 c70a ca80 4d28 5444 2679 4724 C.3.....(MDTy&$G
  73269. 803b753: 2996 7932 9035 a8cc 3e91 189c 8493 2c2a .)2y5....>....*,
  73270. 803b763: 097d 9d4d ae64 4fd7 9b36 eee1 9a54 7eb4 }.M.d..O6...T..~
  73271. 803b773: 43c4 e40f a270 89de 6e8c 2e07 95e3 3f5b .C..p....n....[?
  73272. 803b783: 177b 11a0 c562 c4c9 ac6d d29b fc6f 8700 {...b...m...o...
  73273. 803b793: bc37 d50c 513c 4c2c 1e4e 142d e4a7 ab97 7...<Q,LN.-.....
  73274. 803b7a3: 4a00 d0b1 3df6 efd3 2734 5e0b 4b27 8f57 .J...=..4'.^'KW.
  73275. 803b7b3: 2f1f a714 158f 6726 0ba6 5393 6de8 de61 ./....&g...S.ma.
  73276. 803b7c3: 2be4 43cf c440 a9bc e661 5cb9 cc03 36e8 .+.C@...a..\...6
  73277. 803b7d3: d0a2 7835 94b5 6519 03db 5bba 7b7e c1d9 ..5x...e...[~{..
  73278. 803b7e3: cb71 e150 4f92 4a06 0d8c 6630 f418 2f7f q.P..O.J..0f.../
  73279. 803b7f3: 38d1 9af8 fbe7 f3e1 5fbb 8030 92c0 fd53 .8......._0...S.
  73280. 803b803: 57ce a235 b63d 9376 e654 9a8c 96dd 25ce .W5.=.v.T......%
  73281. 803b813: d40f aba8 2f48 db7b ea39 cb49 af90 ca2d ....H/{.9.I...-.
  73282. 803b823: f939 e3ce 7164 e262 9897 cc33 5bc6 b3cb 9...dqb...3..[..
  73283. 803b833: a69b 3cb7 2ce0 3abc ff44 1c1b 6d0e e3ab ...<.,.:D....m..
  73284. 803b843: 68f0 83b2 ac27 9929 a7aa 6837 dc86 d9f0 .h..'.)...7h....
  73285. 803b853: 967d 7e9f b556 e1f1 a55a fa75 6c88 e567 }..~V...Z.u..lg.
  73286. 803b863: f7a8 d405 1607 ccec 7454 696f 1d5c 19f9 ........Ttoi\...
  73287. 803b873: cbe2 f912 2530 65fd c0c9 9559 9fd3 7fbc ....0%.e..Y.....
  73288. 803b883: e3e1 bf33 cc2e fce2 0175 7514 235a d99f ..3.....u..uZ#..
  73289. 803b893: 93b5 b439 e4c9 f63c 7c11 7328 75ca da2f ..9...<..|(s.u/.
  73290. 803b8a3: fb56 a1e4 cb89 6fa3 f22f 7f8c 28e8 cb7e V......o/....(~.
  73291. 803b8b3: 130f c6de 3940 8efb dd13 db60 462f 7d64 ....@9....`./Fd}
  73292. 803b8c3: 1b7a b461 9b00 0f95 e60e d43b d756 1919 z.a.......;.V...
  73293. 803b8d3: 0cfd f347 6de7 39af 4fc2 982d 33d9 5713 ..G..m.9.O-..3.W
  73294. 803b8e3: a99b ae68 be49 bd24 0607 a875 3f29 1968 ..h.I.$...u.)?h.
  73295. 803b8f3: 03ee 5f90 46e5 7adf fe2b e1a0 6932 c6a9 ..._.F.z+...2i..
  73296. 803b903: 59df a5f4 4385 cfe2 466c b261 96f8 00a7 .Y...C..lFa.....
  73297. 803b913: 8475 5d27 ef46 c5d0 1369 b381 1beb fe97 u.']F...i.......
  73298. 803b923: 0523 2c65 bede 4318 1846 d238 d9f1 be12 #.e,...CF.8.....
  73299. 803b933: 7072 0a97 b70d c72a 0be9 fbea d822 f27d rp....*.....".}.
  73300. 803b943: 8273 c5cb 7972 f2c1 bd4f 767b 9f04 e06d s...ry..O.{v..m.
  73301. 803b953: 815d e927 56b1 ce5c 01c2 1ce0 88fb a475 ].'..V\.......u.
  73302. 803b963: 4d68 268d cbf0 512e 025f 7e4c c1fc 02d7 hM.&...Q_.L~....
  73303. 803b973: 48e6 dc0c c804 3d91 3218 5207 2a2f 908e .H.....=.2.R/*..
  73304. 803b983: f26d 5221 2f0f 20f4 2c61 8c47 9a1c 1d18 m.!R./. a,G.....
  73305. 803b993: fcbd f276 2773 357e 3ff6 79bf e6c4 3645 ..v.s'~5.?.y..E6
  73306. 803b9a3: 0000 ..
  73307. 0803b9a5 <data__role_js>:
  73308. 803b9a5: 722f 6c6f 2e65 736a 0000 0000 5448 5054 /role.js....HTTP
  73309. 803b9b5: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  73310. 803b9c5: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  73311. 803b9d5: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  73312. 803b9e5: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  73313. 803b9f5: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  73314. 803ba05: 6e65 2d74 654c 676e 6874 203a 3132 3930 ent-Length: 2109
  73315. 803ba15: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  73316. 803ba25: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  73317. 803ba35: 3a65 6120 7070 696c 6163 6974 6e6f 782f e: application/x
  73318. 803ba45: 6a2d 7661 7361 7263 7069 0d74 430a 6e6f -javascript..Con
  73319. 803ba55: 6574 746e 452d 636e 646f 6e69 3a67 6720 tent-Encoding: g
  73320. 803ba65: 697a 0d70 430a 6361 6568 432d 6e6f 7274 zip..Cache-Contr
  73321. 803ba75: 6c6f 203a 7270 7669 7461 2c65 6d20 7861 ol: private, max
  73322. 803ba85: 612d 6567 383d 3436 3030 0a0d 0a0d 8b1f -age=86400......
  73323. 803ba95: 0008 0000 0000 0a04 58bd 6ee1 b91b 7e11 .........X.n...~
  73324. 803baa5: 3595 e0ef 46ec adeb bb94 88a6 6b36 7621 .5...F......6k!v
  73325. 803bab5: 8bd2 760f c41c f43e c30a b830 6524 bcf1 ...v..>...0.$e..
  73326. 803bac5: 6e5a 94b9 d56d 5016 d01c ed5f 3eaf fb40 Zn..m..P.._..>@.
  73327. 803bad5: 450a 0771 47f4 67db df90 1fa8 bbb9 4ad2 .Eq..G.g.......J
  73328. 803bae5: 93b6 3fa0 c40a 3481 921c 99c3 be6f d199 ...?...4....o...
  73329. 803baf5: 9270 2333 ee55 e97d e0d3 0b46 d133 c7b9 p.3#U.}...F.3...
  73330. 803bb05: 9b15 458c a26e 6173 64de 7ec2 99dc 71ee ...En.sa.d.~...q
  73331. 803bb15: cc68 8d86 cb3e bb14 b990 7634 cb1f d504 h...>.....4v....
  73332. 803bb25: b97b fa11 6692 91be a163 2626 d908 34a4 {....f..c.&&...4
  73333. 803bb35: bc6a 356b 15a1 f2d6 14a4 a166 52db 7b09 j.k5......f..R.{
  73334. 803bb45: abe2 05d6 3a99 9c3f 7f18 5461 28a6 feff .....:?...aT.(..
  73335. 803bb55: ff60 62b5 c13e 2e1a d888 1cb9 ce90 3501 `..b>..........5
  73336. 803bb65: 48a3 9cd3 b1ab 841f 9be4 c737 6c24 c4cc .H........7.$l..
  73337. 803bb75: 2e76 6132 aec4 1752 f852 ab44 904c 5c20 v.2a..R.R.D.L. \
  73338. 803bb85: 4a15 d10e c495 5709 8c11 d6a5 d121 8b48 .J.....W....!.H.
  73339. 803bb95: 4261 817e 24ab 98be 4671 4166 d1b8 7a5b aB~..$..qFfA..[z
  73340. 803bba5: 65a0 0d10 90d3 3705 5497 3c7b 49e6 147d .e.....7.T{<.I}.
  73341. 803bbb5: 7dac 4c6b 41f1 6efc 4a22 c833 95c5 2ab7 .}kL.A.n"J3....*
  73342. 803bbc5: 5bea ad51 0afc b861 df14 a61f 083f 7c66 .[Q...a.....?.f|
  73343. 803bbd5: 2072 5699 1aa5 c89a 396e 7e3e 8d6f 548e r .V....n9>~o..T
  73344. 803bbe5: 7221 0d3f b869 0dd1 7b62 889b cc21 a0b5 !r?.i...b{..!...
  73345. 803bbf5: 5a7c 6a1a 1b04 fcd1 245c e7ad 9d7f 3c24 |Z.j....\$....$<
  73346. 803bc05: 0a72 5647 7361 17d3 5810 49e5 3e19 76eb r.GVas...X.I.>.v
  73347. 803bc15: 4493 fc0c 8ae2 95ef 4abb dc6b d4ed 42cb .D.......Jk....B
  73348. 803bc25: a5e5 1638 26d7 cd24 2461 cc49 10b4 e86a ..8..&$.a$I...j.
  73349. 803bc35: cdb1 164d a2d1 a6c8 0f3e 3e82 2e83 0adc ..M.....>..>....
  73350. 803bc45: 9dd7 e4fb d68d 934a 9820 dcc1 e452 6fdc ......J. ...R..o
  73351. 803bc55: 9485 7e72 b4a4 cc43 6950 3edf 4d20 001e ..r~..C.Pi.> M..
  73352. 803bc65: b95b dd33 68cd be59 63a3 ac84 16c4 ba9a [.3..hY..c......
  73353. 803bc75: b1b0 1ba4 97b3 9469 fc89 8cdc d662 04e9 ......i.....b...
  73354. 803bc85: 09e9 8d3b f070 4b9b 74a0 965f e446 fb42 ..;.p..K.t_.F.B.
  73355. 803bc95: 6584 5d92 e0ac baa0 8ccd 6964 fd61 18ca .e.]......dia...
  73356. 803bca5: d32d a989 87cf 5977 c0f2 971a 25d6 0380 -.....wY.....%..
  73357. 803bcb5: e209 4af2 361a 7072 a5a7 3420 7aa3 925c ...J.6rp.. 4.z\.
  73358. 803bcc5: 0bbe b27a 0d84 472d 5951 4864 f20c 0905 ..z...-GQYdH....
  73359. 803bcd5: 7a4e b1a7 cebd fb29 e1dc 4e24 8f11 988b Nz....)...$N....
  73360. 803bce5: 53d9 9eb8 bcca 1898 041c d7b5 ba7a bee7 .S..........z...
  73361. 803bcf5: c821 682c 69eb 5191 2959 707d 9d1f acc6 !.,h.i.QY)}p....
  73362. 803bd05: 2497 e06c 46ec b552 b4de 3bb4 5b24 123d .$l..FR....;$[=.
  73363. 803bd15: 3ff4 03a1 5995 502b a530 184e b724 5c73 .?...Y+P0.N.$.s\
  73364. 803bd25: e2c8 a856 cb98 b826 6d2c 1a9e f07b 1350 ..V...&.,m..{.P.
  73365. 803bd35: 8e54 f130 ac97 1309 9847 29dc 6122 fc27 T.0.....G..)"a'.
  73366. 803bd45: d9b4 6092 1c87 e2fa 7ba4 249a a834 67b9 ...`.....{.$4..g
  73367. 803bd55: 8b92 d192 4042 3bde 660d 9495 6590 e1da ....B@.;.f...e..
  73368. 803bd65: 8da1 ad6d 4bac 8768 a424 ef53 dd4d 6cc9 ..m..Kh.$.S.M..l
  73369. 803bd75: dbbb 6bdc ed13 e035 0b1f d280 831c 7ca0 ...k..5........|
  73370. 803bd85: 6161 3ee0 9d05 9eaf bb77 d94f 4b53 2140 aa.>....w.O.SK@!
  73371. 803bd95: 784f c487 b89e 102e d2fb 199e f519 c1cd Ox..............
  73372. 803bda5: 11f1 9300 039f 0bce 56c0 485e d2f8 15b6 .........V^H....
  73373. 803bdb5: 815a d6eb ad55 cb91 8fa3 9347 ebd0 bcf6 Z...U.....G.....
  73374. 803bdc5: 696f f5ee fc5e ebaa bb75 fb7d e7af bae1 oi..^...u.}.....
  73375. 803bdd5: f5b8 1864 edfa e1d1 ff3b 42ff 1533 24af ..d.....;..B3..$
  73376. 803bde5: e404 8c8a 4da7 22b4 4412 2a85 60fc 4780 .....M.".D.*.`.G
  73377. 803bdf5: 480c ff1f 126f 3ecb 9296 d22a 1d15 0672 .H..o..>..*...r.
  73378. 803be05: f97f b38d a583 2d87 5961 fafe 5528 a059 .......-aY..(UY.
  73379. 803be15: 50d1 f7c4 8b29 51ae 1d16 c580 4bac 82a2 .P..)..Q.....K..
  73380. 803be25: 52ea 96f8 96e1 1594 a984 2c2f 212f 1f57 .R......../,/!W.
  73381. 803be35: 21e4 1236 e2ec 329d 3872 8145 4620 044f .!6....2r8E. FO.
  73382. 803be45: ba9e 3d04 85c9 4c01 e20c 9e5d 9455 0a8a ...=...L..].U...
  73383. 803be55: 7031 778c 2cd6 ae44 05f8 35fd ea29 0c22 1p.w.,D....5).".
  73384. 803be65: 1d42 7fba a16a 50d5 d466 49f1 58eb 2e2e B...j..Pf..I.X..
  73385. 803be75: 1325 ed67 e6d5 87ec 3e96 4172 042e 033f %.g......>rA..?.
  73386. 803be85: 0f1b 1ea5 dec3 d2c6 09b3 1aa8 b3d5 6a59 ..............Yj
  73387. 803be95: 7f4e bd74 62be 6b89 e6b8 d53d 6c74 1811 N.t..b.k..=.tl..
  73388. 803bea5: d4dc 8844 964f bcc2 bf6e d24e c5fa 3316 ..D.O...n.N....3
  73389. 803beb5: b8f9 fc70 f5e6 581e 971c dad5 fbb3 626b ..p....X......kb
  73390. 803bec5: 654c 5b36 cc5e 9305 9a63 ab1d 991d 3d53 Le6[^...c.....S=
  73391. 803bed5: e4b5 5d5b d3e6 6ded 37a4 b352 cbce 2d67 ..[]...m.7R...g-
  73392. 803bee5: 4afa f29d 7ab1 ed5d ee5e 1cf2 d05c e07c .J...z].^...\.|.
  73393. 803bef5: ed21 2c0d 37b5 2958 651e c861 db12 450f !..,.7X).ea....E
  73394. 803bf05: 280e 0f82 fd7a 5c6e 13f3 f97b 5d32 47da .(..z.n\..{.2].G
  73395. 803bf15: a6b5 b753 80f7 b696 a9c9 32d8 0e69 2c24 ..S........2i.$,
  73396. 803bf25: 92ed 0d0e 7e81 16d6 acf6 17b0 8734 1bae .....~......4...
  73397. 803bf35: febc f4ec 0196 4dc9 f621 741c d565 eca7 .......M!..te...
  73398. 803bf45: eba8 6cca f0c7 2792 7434 549f cb61 9956 ...l...'4t.Ta.V.
  73399. 803bf55: 83a4 7fb4 0b33 58c9 2594 173d e644 7b5e ....3..X.%=.D.^{
  73400. 803bf65: f6fd 6fd6 8d7f b56a ac84 d1dd def7 2c8a ...o..j........,
  73401. 803bf75: de53 946f f8ce ca06 4925 99cf 50ca 3fea S.o.....%I...P.?
  73402. 803bf85: 6071 96ad 2f90 ddba 2f17 3f9e 5bb7 fa0d q`.../.../.?.[..
  73403. 803bf95: cf8a bcda c450 e1f6 6870 4ef7 7674 caff ....P...ph.Ntv..
  73404. 803bfa5: 0e95 9ee4 efe5 9dd1 a702 1268 3abc bc39 ..........h..:9.
  73405. 803bfb5: 3eef 7bec bc30 1276 5f8a f92b 16ab f6f1 .>.{0.v.._+.....
  73406. 803bfc5: 25b6 0db2 ede2 4aed 9833 5d34 a2de 17f2 .%.....J3.4]....
  73407. 803bfd5: 43e8 7473 702c a7e9 c97b 7c20 a165 2113 .Cst,p..{. |e..!
  73408. 803bfe5: 8deb 6db2 9215 8b92 c3eb 7621 b23f 3492 ...m......!v?..4
  73409. 803bff5: aff1 9de2 e926 6ded 5177 eb73 a5f6 8ce9 ....&..mwQs.....
  73410. 803c005: d3b6 b838 7541 c1b5 493d 6051 1597 8d36 ..8.Au..=IQ`..6.
  73411. 803c015: 9d3b 2eb4 5bac 59bd 48d5 bdd6 bb79 5f65 ;....[.Y.H..y.e_
  73412. 803c025: 17de 34dc 7b57 9974 7e4c bbaf 074d 4ba4 ...4W{t.L~..M..K
  73413. 803c035: 84fa 1d04 84ba ea67 8b23 74ea 7ea1 ab6a ......g.#..t.~j.
  73414. 803c045: ad80 7ebd 7410 0448 57e0 03a2 9b95 1f91 ...~.tH..W......
  73415. 803c055: 7a74 d495 fda9 927a bf65 28c5 3101 16f1 tz....z.e..(.1..
  73416. 803c065: 6f9a 44d5 6e97 7f77 3b21 3990 b79a e975 .o.D.nw.!;.9..u.
  73417. 803c075: 4091 b980 ce95 165c f937 98d5 24df 0f28 .@....\.7....$(.
  73418. 803c085: d245 a954 a298 5e27 6a14 dad8 789e 47d0 E.T...'^.j...x.G
  73419. 803c095: 7862 d549 aa35 695f 68a6 5572 9941 d334 bxI.5._i.hrUA.4.
  73420. 803c0a5: f484 5a08 e685 d410 d71b 56ef 050d 88fa ...Z.......V....
  73421. 803c0b5: 4ba7 09a6 cf3a d7c5 794f 0c53 af7f 7172 .K..:...OyS...rq
  73422. 803c0c5: 1c38 7c82 2661 4158 f16c 65a0 2f8e 18b6 8..|a&XAl..e./..
  73423. 803c0d5: 7ace 0264 d96b 99f3 cb56 fd1c dbf0 83e3 .zd.k...V.......
  73424. 803c0e5: c4fd c515 ccd9 e20f 9e1a b72a a155 661d ..........*.U..f
  73425. 803c0f5: 6600 e405 8f1b bca3 3a62 e614 2cc7 e9cd .f......b:...,..
  73426. 803c105: f225 ddb5 a234 35eb f6a2 662e 8938 b665 %...4..5...f8.e.
  73427. 803c115: cfdc 9756 ba29 5643 610f d03f 5a4b 2d32 ..V.).CV.a?.KZ2-
  73428. 803c125: d30b 54bf fb92 7e18 c848 3190 d3cd fcc8 ...T...~H..1....
  73429. 803c135: 772f ba7f e3fb 3ffc 9ff3 9f3c 5a74 3b99 /w.....?..<.tZ.;
  73430. 803c145: 19b1 7809 c092 50ee 9bb9 d00b dbad 32d9 ...x...P.......2
  73431. 803c155: 234c 65f0 4c3d 7c12 cd63 d1d0 a216 63be L#.e=L.|c......c
  73432. 803c165: d98c c91d fb8c 0c88 83b5 42cf 0690 59b3 ...........B...Y
  73433. 803c175: 46b8 2b38 2d39 9acd 377f acbe 5708 7262 .F8+9-...7...Wbr
  73434. 803c185: c572 e5a2 35c2 7017 0f09 d4c6 e91a 5a38 r....5.p......8Z
  73435. 803c195: dc72 b2de 7731 cc1d 4596 1627 782a 94a6 r...1w...E'.*x..
  73436. 803c1a5: 9c5d 356b c581 9d96 8dab cd35 3545 2f17 ].k5......5.E5./
  73437. 803c1b5: 1d94 af07 2caa d718 81b5 478f 80af 6965 .....,.....G..ei
  73438. 803c1c5: b564 9177 18c7 56bd a98f c8cb 6f3d 53b9 d.w....V....=o.S
  73439. 803c1d5: 0f1f 063a e332 2d66 9100 9fb5 9a9a c3dc ..:.2.f-........
  73440. 803c1e5: 16df e3b7 dead f992 d0a5 7046 d31b 0db6 ..........Fp....
  73441. 803c1f5: fe64 8b37 bb81 e71f 98ff 7cff 87f7 4ff9 d.7........|...O
  73442. 803c205: 7ff3 fdde f778 ab67 7c86 cd6b 3547 4810 ....x.g..|k.G5.H
  73443. 803c215: e888 7e2f 7856 3a42 b52b a510 43a6 849e ../~VxB:+....C..
  73444. 803c225: f04f c28b d093 149b f01c 502d 0343 7700 O.........-PC..w
  73445. 803c235: 0615 c5c0 4eca 7346 b226 f71d 2a9a 98ca .....NFs&....*..
  73446. 803c245: 9a2a 5944 f28b cde2 a1fc 5f07 9d51 0da3 *.DY......._Q...
  73447. 803c255: bd6d 0ed8 96ef c688 e354 8997 317d 0934 m.......T...}14.
  73448. 803c265: 65f9 0801 35f0 fc57 6e15 d7f8 e7fc bff9 .e...5W..n......
  73449. 803c275: 7fe7 8bb7 83ff aa03 7c67 d9f7 e06e e1ad ........g|..n...
  73450. 803c285: 5528 8a7c 2d0c a711 811d 50c1 6aa0 5c2d (U|..-.....P.j-\
  73451. 803c295: 16e0 4d99 77a9 8b8a 1312 e2e0 97f7 e521 ...M.w........!.
  73452. 803c2a5: 2f62 5bf7 f259 0cd1 ad73 5aea b58a d6f6 b/.[Y...s..Z....
  73453. 803c2b5: b619 c494 36ab 3168 9756 4aa2 fc6e 35ba .....6h1V..Jn..5
  73454. 803c2c5: ff8b 220b 3862 10e8 0013 1400 ..."b8.....
  73455. 0803c2d0 <file__history_html>:
  73456. 803c2d0: cd14 0803 c2e4 0803 c2f4 0803 04bd 0000 ................
  73457. 803c2e0: 0001 0000 ....
  73458. 0803c2e4 <data__history_html>:
  73459. 803c2e4: 682f 7369 6f74 7972 682e 6d74 006c 0000 /history.html...
  73460. 803c2f4: 5448 5054 312f 312e 3220 3030 4f20 0d4b HTTP/1.1 200 OK.
  73461. 803c304: 530a 7265 6576 3a72 6c20 4977 2f50 2e31 .Server: lwIP/1.
  73462. 803c314: 2e33 2031 6828 7474 3a70 2f2f 6173 6176 3.1 (http://sava
  73463. 803c324: 6e6e 6861 6e2e 6e6f 6e67 2e75 726f 2f67 nnah.nongnu.org/
  73464. 803c334: 7270 6a6f 6365 7374 6c2f 6977 2970 0a0d projects/lwip)..
  73465. 803c344: 6f43 746e 6e65 2d74 654c 676e 6874 203a Content-Length:
  73466. 803c354: 3031 3134 0a0d 6f43 6e6e 6365 6974 6e6f 1041..Connection
  73467. 803c364: 203a 6c43 736f 0d65 430a 6e6f 6574 746e : Close..Content
  73468. 803c374: 742d 7079 3a65 7420 7865 2f74 7468 6c6d -type: text/html
  73469. 803c384: 0a0d 6f43 746e 6e65 2d74 6e45 6f63 6964 ..Content-Encodi
  73470. 803c394: 676e 203a 7a67 7069 0a0d 0a0d 8b1f 0008 ng: gzip........
  73471. 803c3a4: 0000 0000 0a04 568d 6ecd 46db 7e10 8615 .......V.n.F.~..
  73472. 803c3b4: 0c09 1011 0b25 14bd c895 50a0 0873 a050 ....%......Ps.P.
  73473. 803c3c4: fa01 e683 ac14 11c8 f1b9 9772 5dd9 5652 ..........r..]RV
  73474. 803c3d4: 02eb fa49 4393 040a 21e8 a5ed fa28 6e06 ..I..C...!..(..n
  73475. 803c3e4: 0301 eb4e 19e4 6f96 59d4 a92e b5d2 fae0 ..N....o.Y......
  73476. 803c3f4: 7160 667f 6676 f9be c666 5b8b 7d1f fcb2 `q.fvf..f..[.}..
  73477. 803c404: e1ec 7b83 ae5e 160b ec2f c7af cf08 df22 ...{^.../.....".
  73478. 803c414: 1dc7 3490 145e 89a0 e497 2a44 91d0 e95f ...4^.....D*.._.
  73479. 803c424: f875 de3e a7b5 d6b9 0865 2a4f 475a 97fe u.>.....e.O*ZG..
  73480. 803c434: e7e1 861f 514b 4494 15d3 df03 044b c0d7 ....KQ.D....K...
  73481. 803c444: e551 bdfe d208 7a0c 4e25 880a 9afc a6c2 Q......z%N......
  73482. 803c454: 5214 e40f 3436 79d5 4294 134d db08 98cd .R..64.y.BM.....
  73483. 803c464: aa72 6129 4aa1 8308 3668 c82e 2d31 62aa r.)a.J..h6..1-.b
  73484. 803c474: afb7 c814 4376 64d0 8874 3426 0cd5 f362 ....vC.dt.&4..b.
  73485. 803c484: f9ba 79b6 de6a 539a b7f3 3cd7 ef33 1fcc ...yj..S...<3...
  73486. 803c494: cbcd b9e6 3739 166f 2753 60b2 1f94 b979 ....97o.S'.`..y.
  73487. 803c4a4: 7584 17e4 f284 a249 ef94 6049 af91 96f4 .u....I...I`....
  73488. 803c4b4: ca81 3401 a83e 4912 ed4b 6de9 5e89 386b ...4>..IK..m.^k8
  73489. 803c4c4: d3d6 a4c7 ee26 f7d4 4c94 5f22 060a c793 ....&....L"_....
  73490. 803c4d4: 850a eea7 171c bb0e 4895 f1b7 a522 97b5 .........H.."...
  73491. 803c4e4: a230 e454 5273 88af dcf4 4c27 4d61 a62a 0.T.sR....'LaM*.
  73492. 803c4f4: edfb 1e9a 1a43 516a 4be2 7457 fb42 4822 ....C.jQ.KWtB."H
  73493. 803c504: 1577 482f 3ae7 29e5 4f1c de6c 4910 8367 w./H.:.).Ol..Ig.
  73494. 803c514: 4c89 5f58 fe08 33e1 6ffd 71af f7db 8a68 .LX_...3.o.q..h.
  73495. 803c524: 0331 42af 498a 44ea d62b a3eb bd73 b847 1..B.I.D+...s.G.
  73496. 803c534: d274 1176 6423 0d7b e6c7 7337 708a 9a9f t.v.#d{...7s.p..
  73497. 803c544: 730b 3cd6 9e6f 2f36 759d 3f2b 41d4 6906 .s.<o.6/.u+?.A.i
  73498. 803c554: 33ca fce5 cd8d a8af ccf6 602a de82 bf98 .3........*`....
  73499. 803c564: f9cc 357e d7ca 57a2 c5f9 6dbc 33be 50ef ..~5...W...m.3.P
  73500. 803c574: 02e5 7f95 e730 abcd 4afd 5539 c85a 65ed ....0....J9UZ..e
  73501. 803c584: 4868 69a2 4c8d f21c 5fe3 69f5 2585 20e0 hH.i.L..._.i.%.
  73502. 803c594: c01b 91bf 2ca4 f811 b516 d48e 4588 bb3e .....,.......E>.
  73503. 803c5a4: caf4 9615 fde1 8930 32da 9434 4aa0 55c1 ......0..24..J.U
  73504. 803c5b4: c3eb 3da2 5f6a 576d fcbb f3b9 6cce 11cf ...=j_mW.....l..
  73505. 803c5c4: a8b4 a71d b4b4 3ecb 6559 d18e 3efc f820 .......>Ye...> .
  73506. 803c5d4: 1219 df3c 6127 4691 5ee0 5561 9b9c 52fd ..<.'a.F.^aU...R
  73507. 803c5e4: db3f 698a 985e 6bb3 7e64 e842 cccf 8585 ?..i^..kd~B.....
  73508. 803c5f4: dadd 5a99 7077 b6d5 6d0a def9 d446 ffa1 ...Zwp...m..F...
  73509. 803c604: 2528 589a b582 f637 616b 6fc0 4bcb b20b (%.X..7.ka.o.K..
  73510. 803c614: a2a5 1505 c86b 5016 847f a37c 7619 a412 ....k..P..|..v..
  73511. 803c624: 1f67 4ae9 30f3 a293 d5b2 aab1 16b4 707c g..J.0........|p
  73512. 803c634: d9e3 aedb 7c9c f04f d184 28e4 33f2 0fd0 .....|O....(.3..
  73513. 803c644: 0648 59a3 4a80 24aa 23dc 9292 a730 0a69 H..Y.J.$.#..0.i.
  73514. 803c654: cb1c 5659 8648 0393 9e46 6254 d58e 128b ..YVH...F.Tb....
  73515. 803c664: 9ce8 3d7b 6ef6 a66c 5094 76b7 33ae 5683 ..{=.nl..P.v.3.V
  73516. 803c674: bca4 6462 91c8 6492 bb94 e3a0 e505 3565 ..bd...d......e5
  73517. 803c684: 3b6c ff1d 292a a9b1 24a2 5876 bf45 9ec2 l;..*)...$vXE...
  73518. 803c694: f334 03e3 52be 7ce5 3eea 4e2e ab8b 6295 4....R.|.>.N...b
  73519. 803c6a4: a0b4 c6d8 770e b5c1 dfc8 3f14 fd8e ffee .....w.....?....
  73520. 803c6b4: 9303 02fb 39bb 7d7a 4a92 623b 73ee ba3d .....9z}.J;b.s=.
  73521. 803c6c4: 3a33 7cc0 f9e8 7fce 0db7 b626 2efd 58dd 3:.|......&....X
  73522. 803c6d4: ae09 5a85 09b6 d93d dd05 b465 dde3 e8fe ...Z..=...e.....
  73523. 803c6e4: 494b 220b 21b7 35e5 0d48 03a9 653c a482 KI.".!.5H...<e..
  73524. 803c6f4: 3a8f 0f3a b598 6262 31f5 755e f6ae 26dd .::...bb.1^u...&
  73525. 803c704: e8c9 eb5d 4476 7318 8f5e 67dd a027 eeea ..].vD.s^..g'...
  73526. 803c714: e35c 84d1 18a6 ad87 e6df b6fb 6281 626d \............bmb
  73527. 803c724: fc3f 33d1 7a7f 4fcb d8bf f151 2352 ba9f ?..3.z.O..Q.R#..
  73528. 803c734: 72a9 c183 ced4 cbb5 e983 ad5a 4fb8 2cc5 .r........Z..O.,
  73529. 803c744: df18 f919 80c9 c16c f044 d823 d322 8c71 ......l.D.#.".q.
  73530. 803c754: 2bad 8d8e f054 0411 c35f c9c9 a208 ce0d .+..T..._.......
  73531. 803c764: b121 4099 e48d e60c 1db5 1171 504c 2961 !..@......q.LPa)
  73532. 803c774: 9452 c980 a726 3e49 a097 c92b d9fd 7e7b R...&.I>..+...{~
  73533. 803c784: f114 a3bb dcde f320 31ff 135a 4156 8c10 ...... ..1Z.VA..
  73534. 803c794: cd6f 0f82 416a ef53 1bf0 425b 4ced 4ac6 o...jAS...[B.L.J
  73535. 803c7a4: ff6d f96b bd07 325e c546 0008 2f00 m.k...^2F....
  73536. 0803c7b1 <data__favicon_ico>:
  73537. 803c7b1: 662f 7661 6369 6e6f 692e 6f63 0000 0000 /favicon.ico....
  73538. 803c7c1: 5448 5054 312f 312e 3220 3030 4f20 0d4b HTTP/1.1 200 OK.
  73539. 803c7d1: 530a 7265 6576 3a72 6c20 4977 2f50 2e31 .Server: lwIP/1.
  73540. 803c7e1: 2e33 2031 6828 7474 3a70 2f2f 6173 6176 3.1 (http://sava
  73541. 803c7f1: 6e6e 6861 6e2e 6e6f 6e67 2e75 726f 2f67 nnah.nongnu.org/
  73542. 803c801: 7270 6a6f 6365 7374 6c2f 6977 2970 0a0d projects/lwip)..
  73543. 803c811: 6f43 746e 6e65 2d74 654c 676e 6874 203a Content-Length:
  73544. 803c821: 3131 3035 0a0d 6f43 6e6e 6365 6974 6e6f 1150..Connection
  73545. 803c831: 203a 6c43 736f 0d65 430a 6e6f 6574 746e : Close..Content
  73546. 803c841: 742d 7079 3a65 6920 616d 6567 782f 692d -type: image/x-i
  73547. 803c851: 6f63 0d6e 430a 6361 6568 432d 6e6f 7274 con..Cache-Contr
  73548. 803c861: 6c6f 203a 7270 7669 7461 2c65 6d20 7861 ol: private, max
  73549. 803c871: 612d 6567 383d 3436 3030 0a0d 0a0d 0000 -age=86400......
  73550. 803c881: 0001 0001 1010 0000 0000 0020 0468 0000 .......... .h...
  73551. 803c891: 0016 0000 0028 0000 0010 0000 0020 0000 ....(....... ...
  73552. 803c8a1: 0001 0020 0000 0000 0440 0000 0000 0000 .. .....@.......
  73553. 803c8b1: 0000 0000 0000 0000 0000 0000 ffff 01ff ................
  73554. 803c8c1: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  73555. 803c8d1: ffff 01ff ffff 01ff d2d2 ffd2 d2d2 ffd2 ................
  73556. 803c8e1: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  73557. 803c8f1: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  73558. 803c901: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  73559. 803c911: 8d8d ff8d 8484 ff84 8989 ff89 8989 ff89 ................
  73560. 803c921: 8484 ff84 8d8d ff8d ffff 01ff ffff 01ff ................
  73561. 803c931: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  73562. 803c941: ffff 01ff ffff 01ff a4a4 ffa4 8484 ff84 ................
  73563. 803c951: aeae ffae ffff 01ff ffff 01ff ffff 01ff ................
  73564. 803c961: ffff 01ff aeae ffae 8484 ff84 a4a4 ffa4 ................
  73565. 803c971: ffff 01ff ffff 01ff 8181 ff81 ffff 01ff ................
  73566. 803c981: ffff 01ff a0a0 ffa0 9a9a ff9a ffff 01ff ................
  73567. 803c991: c7c7 ffc7 8f8f ff8f 8585 ff85 8585 ff85 ................
  73568. 803c9a1: 8f8f ff8f caca ffca ffff 01ff d5d5 ffd5 ................
  73569. 803c9b1: ffff 01ff 7777 ff77 ffff 01ff ffff 01ff ....www.........
  73570. 803c9c1: d5d5 ffd5 8484 ff84 ffff 01ff a8a8 ffa8 ................
  73571. 803c9d1: 8c8c ff8c bbbb ffbb ffff 01ff ffff 01ff ................
  73572. 803c9e1: baba ffba afaf ffaf ffff 01ff ffff 01ff ................
  73573. 803c9f1: 6465 ff5b ffff 01ff ffff 01ff ffff 01ff ed[.............
  73574. 803ca01: 9898 ff98 b0b0 ffb0 d5d5 ffd5 8484 ff84 ................
  73575. 803ca11: dada ffda 9595 ff95 8484 ff84 9d9d ff9d ................
  73576. 803ca21: d7d7 ffd7 ffff 01ff 9898 ff97 7a7b ff73 ............{zs.
  73577. 803ca31: cedb ff79 c0d2 ff55 ffff 01ff ffff 01ff ..y...U.........
  73578. 803ca41: 9393 ff93 ffff 01ff a4a4 ffa4 bebe ffbe ................
  73579. 803ca51: bdbd ffbd d1d1 ffd1 ffff 01ff ffff 01ff ................
  73580. 803ca61: b4b5 ffae 5f5f ff5d 979d ff6b c0d2 ff55 ....__]...k...U.
  73581. 803ca71: ffff 01ff b5c9 ff35 ffff 01ff ffff 01ff ......5.........
  73582. 803ca81: f0f0 fff0 ffff 01ff f1f1 fff1 ffff 01ff ................
  73583. 803ca91: d5d5 ffd5 cfd0 ffce 8585 ff85 6060 ff60 ............```.
  73584. 803caa1: 9194 ff85 b5ca ff37 ffff 01ff b9cc ff41 ......7.......A.
  73585. 803cab1: ffff 01ff b4c9 ff33 ffff 01ff 6262 ff62 ......3.....bbb.
  73586. 803cac1: 5d5e ff5c 5c5c ff5c 5d5e ff5c 6161 ff60 ^]\.\\\.^]\.aa`.
  73587. 803cad1: 6567 ff5b 8486 ff7b ffff 01ff ffff 01ff ge[...{.........
  73588. 803cae1: ffff 01ff b5ca ff37 ffff 01ff b9cc ff41 ......7.......A.
  73589. 803caf1: ffff 01ff b4c9 ff33 ffff 01ff ffff 01ff ......3.........
  73590. 803cb01: b5c9 ff35 ffff 01ff c0d2 ff55 ffff 01ff ..5.......U.....
  73591. 803cb11: c4d4 ff5e c3d4 ff5c ffff 01ff ffff 01ff ..^...\.........
  73592. 803cb21: c3d4 ff5c c4d4 ff5e cedb ff79 c0d2 ff55 ..\...^...y...U.
  73593. 803cb31: ffff 01ff b5c9 ff35 ffff 01ff ffff 01ff ......5.........
  73594. 803cb41: c0d1 ff54 cfdc ff7d ffff 01ff b4c9 ff33 ..T...}.......3.
  73595. 803cb51: ffff 01ff bed0 ff50 b4c9 ff33 b4c9 ff33 ......P...3...3.
  73596. 803cb61: c0d2 ff55 ffff 01ff b4c9 ff33 ffff 01ff ..U.......3.....
  73597. 803cb71: cedb ff79 c0d2 ff55 ffff 01ff ffff 01ff ..y...U.........
  73598. 803cb81: ffff 01ff b4c9 ff33 ffff 01ff cad9 ff6f ......3.......o.
  73599. 803cb91: b9cc ff41 d6e1 ff8f ffff 01ff ffff 01ff ..A.............
  73600. 803cba1: d5e0 ff8c b9cc ff40 cedb ff79 ffff 01ff ......@...y.....
  73601. 803cbb1: b4c9 ff33 ffff 01ff ffff 01ff ffff 01ff ..3.............
  73602. 803cbc1: ffff 01ff c5d5 ff62 c1d2 ff58 ffff 01ff ......b...X.....
  73603. 803cbd1: ffff 01ff bbce ff46 b5c9 ff35 b5c9 ff35 ......F...5...5.
  73604. 803cbe1: bbce ff46 ffff 01ff ffff 01ff c0d2 ff55 ..F...........U.
  73605. 803cbf1: c5d5 ff62 ffff 01ff ffff 01ff ffff 01ff ..b.............
  73606. 803cc01: ffff 01ff ffff 01ff c8d7 ff69 b4c9 ff33 ..........i...3.
  73607. 803cc11: cedb ff79 ffff 01ff ffff 01ff ffff 01ff ..y.............
  73608. 803cc21: ffff 01ff cedb ff79 b4c9 ff33 c8d7 ff69 ......y...3...i.
  73609. 803cc31: ffff 01ff ffff 01ff ffff 01ff ffff 0dff ................
  73610. 803cc41: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  73611. 803cc51: b9cd ff42 b4c9 ff33 b7cb ff3b b7cb ff3b ..B...3...;...;.
  73612. 803cc61: b4c9 ff33 b9cd ff42 ffff 01ff ffff 01ff ..3...B.........
  73613. 803cc71: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  73614. 803cc81: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  73615. 803cc91: ffff 01ff ffff 01ff e4eb ffb5 e4eb ffb5 ................
  73616. 803cca1: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  73617. 803ccb1: ffff 01ff ffff 01ff ffff 01ff 0000 ffff ................
  73618. 803ccc1: 0000 ffff 0000 ffff 0000 ffff 0000 ffff ................
  73619. 803ccd1: 0000 ffff 0000 ffff 0000 ffff 0000 ffff ................
  73620. 803cce1: 0000 ffff 0000 ffff 0000 ffff 0000 ffff ................
  73621. 803ccf1: 0000 ffff 0000 ffff 0000 ffff 0000 5000 ...............
  73622. 0803cd00 <file__main_css>:
  73623. 803cd00: cd50 0803 cd64 0803 cd70 0803 2873 0000 P...d...p...s(..
  73624. 803cd10: 0001 0000 ....
  73625. 0803cd14 <file__favicon_ico>:
  73626. 803cd14: 0000 0000 c7b1 0803 c7c1 0803 053c 0000 ............<...
  73627. 803cd24: 0001 0000 ....
  73628. 0803cd28 <file__settings_html>:
  73629. 803cd28: 9fdc 0803 a8a3 0803 a8b3 0803 10f2 0000 ................
  73630. 803cd38: 0001 0000 ....
  73631. 0803cd3c <file__main_js>:
  73632. 803cd3c: cd00 0803 77ae 0803 77ba 0803 250f 0000 .....w...w...%..
  73633. 803cd4c: 0001 0000 ....
  73634. 0803cd50 <file__login_html>:
  73635. 803cd50: a004 0803 9cc9 0803 9cd5 0803 02f6 0000 ................
  73636. 803cd60: 0001 0000 ....
  73637. 0803cd64 <data__main_css>:
  73638. 803cd64: 6d2f 6961 2e6e 7363 0073 0000 5448 5054 /main.css...HTTP
  73639. 803cd74: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  73640. 803cd84: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  73641. 803cd94: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  73642. 803cda4: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  73643. 803cdb4: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  73644. 803cdc4: 6e65 2d74 654c 676e 6874 203a 3031 3431 ent-Length: 1014
  73645. 803cdd4: 0d34 430a 6e6f 656e 7463 6f69 3a6e 4320 4..Connection: C
  73646. 803cde4: 6f6c 6573 0a0d 6f43 746e 6e65 2d74 7974 lose..Content-ty
  73647. 803cdf4: 6570 203a 6574 7478 632f 7373 0a0d 6f43 pe: text/css..Co
  73648. 803ce04: 746e 6e65 2d74 6e45 6f63 6964 676e 203a ntent-Encoding:
  73649. 803ce14: 7a67 7069 0a0d 6143 6863 2d65 6f43 746e gzip..Cache-Cont
  73650. 803ce24: 6f72 3a6c 7020 6972 6176 6574 202c 616d rol: private, ma
  73651. 803ce34: 2d78 6761 3d65 3638 3034 0d30 0d0a 1f0a x-age=86400.....
  73652. 803ce44: 088b 0000 0000 0400 d50a db7d 238e 7239 ..........}..#9r
  73653. 803ce54: afe8 53c8 e3e8 6dae a349 dd5b d854 3d82 ...S...mI.[.T..=
  73654. 803ce64: 2beb 05e0 d80c d4fb 2c6e 5252 94aa 92db .+......n,RR....
  73655. 803ce74: 9052 bab2 47ab 3fd6 0618 180c 3838 ecbe R....G.?....88..
  73656. 803ce84: f80f fa57 1c93 3257 64c8 d4a6 7ded de38 ..W...W2.d...}8.
  73657. 803ce94: 99da f251 8c12 0608 c183 9060 f1fc 7f17 ..Q.......`.....
  73658. 803cea4: d9d4 fb96 b64d 7e2e fbce c3f3 f3a1 dc69 ....M..~......i.
  73659. 803ceb4: f41f 9d47 ec7f fafc ffaf f3be c537 df3c ..G.........7.<.
  73660. 803cec4: 721e 7af8 aa2e 517e e8fe 76ca f17e 7f63 .r.z..~Q...v~.c.
  73661. 803ced4: 3e5d dd97 5f6c f315 de75 0ecd 22c5 2eef ]>..l_..u...."..
  73662. 803cee4: 2af2 d62b ee87 78b2 679e aabb b728 f3f8 .*+....x.g..(...
  73663. 803cef4: 9f65 9777 5965 fbe5 2aee 16cf 9ff8 7de7 e.w.eY...*.....}
  73664. 803cf04: b2f9 6eeb 62b2 dddb dbe4 ee97 fb36 3dd4 ...n.b......6..=
  73665. 803cf14: 73e4 71aa d978 b26c 97fd a2e3 ec38 d9d6 .s.qx.l.....8...
  73666. 803cf24: e997 5d6c 3fce fa9e 5d87 9db1 af95 cebf ..l].?...]......
  73667. 803cf34: 1ff6 8bbb f6e5 2cb8 55b7 50ef 597d d3e7 .......,.U.P}Y..
  73668. 803cf44: 02a2 e602 3ea7 9940 fb65 e1ee 0665 ecff .....>@.e...e...
  73669. 803cf54: bb8e 50f2 c420 3ee9 675f f155 3f29 33f5 ...P ..>_gU.)?.3
  73670. 803cf64: e268 de53 cfed 6daa 597f 5fce f40e 6a73 h.S....m.Y._..sj
  73671. 803cf74: ae7e 4fca 2080 7a82 175a 994f b966 ca6f ~..O. .zZ.O.f.o.
  73672. 803cf84: 563f 6bf9 5bd5 f3e4 0f72 a180 6d85 05b9 ?V.k.[..r....m..
  73673. 803cf94: 00e8 b7b5 b6c8 f9cf 57be 016c 954c 082f .........Wl.L./.
  73674. 803cfa4: 943e 665c eb2f 3f8a ed8a 8cb2 77f2 02fb >.\f/..?.....w..
  73675. 803cfb4: 8e49 0f52 f32f 7e79 4438 9fa9 fdb3 d8b6 I.R./.y~8D......
  73676. 803cfc4: bb3e 63d4 cfb5 42b6 b668 775e e3fa 2743 >..c...Bh.^w..C'
  73677. 803cfd4: 0ecf 1439 95e8 152f ee33 f2a7 4bb5 841c ..9.../.3....K..
  73678. 803cfe4: 9d1f bb62 a97b f4ba f7ef 97d5 fe5d 43cb ..b.{.......]..C
  73679. 803cff4: ed9e abe7 c70f e7de f67c a8b1 d97a 076e ........|...z.n.
  73680. 803d004: d929 9e76 612b e2d9 b999 fc76 2abc bcaa ).v.+a....v..*..
  73681. 803d014: d877 9465 79f9 ed9f ef88 97dd bf75 66ca w.e..y......u..f
  73682. 803d024: a6c0 71c3 1c5d 67b4 2f98 f9d2 ea7d 69f5 ...q]..g./..}..i
  73683. 803d034: 44b6 e849 774b 411f b27a 74fd 5656 53ab .DI.Kw.Az..tVV.S
  73684. 803d044: 79b1 aeee e7f3 bb7c ce38 3dca ca08 7074 .y....|.8..=..tp
  73685. 803d054: efe2 b56e 56e8 e3ab 5b2e 802c 4876 555e ..n..V...[,.vH^U
  73686. 803d064: 359b c08b db32 eb14 d32f dd3f d917 fbba .5..2.../.?.....
  73687. 803d074: f957 53fa 120e 7599 c00f de94 df21 cb17 W..S...u....!...
  73688. 803d084: 2547 3a8b 00ed de92 16cb 7bbf 5439 e1d3 G%.:.......{9T..
  73689. 803d094: f060 b1e6 39b7 92f4 a739 b959 72f8 7e84 `....9..9.Y..r.~
  73690. 803d0a4: 2e79 d3b6 e3c1 9b2c 447f b602 de8b 5cbc y.....,..D.....\
  73691. 803d0b4: fb97 d5e9 df9f f9ff 7f4f 7c31 af94 78f1 ........O.1|...x
  73692. 803d0c4: 88fc b3b2 975c 7b9f a65f f987 5cbe 1faf ....\..{_....\..
  73693. 803d0d4: 7957 bcf1 96e2 d94e a2cb bb28 6cf3 29fb Wy....N...(..l.)
  73694. 803d0e4: 743b fb77 79f2 bd0f fddb 0304 74a7 5ec2 ;tw..y.......t.^
  73695. 803d0f4: d76c 36c5 91ef 3fcc 08a2 2d01 1eeb f788 l..6...?...-....
  73696. 803d104: 76f3 833a c55e 065c 5d04 bd53 3f7d 5187 .v:.^.\..]S.}?.Q
  73697. 803d114: 0d00 3e1d 3b5c c810 6d73 7077 bf7a 162a ...>\;..smwpz.*.
  73698. 803d124: 7c8b a1fb e55b 181b 554e 941e 653b 1ac7 .|..[...NU..;e..
  73699. 803d134: 245d bb4f 9f6c ab6f 3653 1195 4d93 f059 ]$O.l.o.S6...MY.
  73700. 803d144: a241 0510 81e8 366c bfdb 8aaf 9d6a 907f A.....l6....j...
  73701. 803d154: eade 2741 e556 3a66 bddc 1676 33f0 9c5f ..A'V.f:..v..3_.
  73702. 803d164: dd66 5772 60f1 003f db9e ee67 cfb3 95cc f.rW.`?...g.....
  73703. 803d174: 01bb e474 5950 bfdc cbbd 9d37 23c1 6c0f ..t.PY....7..#.l
  73704. 803d184: a6e8 28e9 9cdf ff80 8f1f e2c2 c0c1 c376 ...(..........v.
  73705. 803d194: 6af4 1cb9 0e9c bca0 1244 6bb0 f7a7 3783 .j......D..k...7
  73706. 803d1a4: 5527 1e00 ddd2 9bcd 6247 f4ac a0c7 b791 'U......Gb......
  73707. 803d1b4: 38a8 72aa ed37 6ff5 75a0 0480 11c4 bd55 .8.r7..o.u....U.
  73708. 803d1c4: 88fe 3e52 133d a7e7 d07b d768 ed47 29f1 ..R>=...{.h.G..)
  73709. 803d1d4: f9b3 eac4 494e 021a 9341 eec1 b4f5 1fda ....NI..A.......
  73710. 803d1e4: cb5d 8e2a cca0 807a ca32 f633 b022 181b ].*...z.2.3."...
  73711. 803d1f4: 0af8 58f2 8cfe 523f e979 d3e4 140e 8a2c ...X..?Ry.....,.
  73712. 803d204: f430 e659 ca31 aa5e 34f2 412f 7f2d 2d9c 0.Y.1.^..4/A-..-
  73713. 803d214: de40 1872 9b13 305d 3668 b6e5 a1a4 75dc @.r...]0h6.....u
  73714. 803d224: 0cbf 01fb d3fb 05ec df88 5976 f865 ccbe ..........vYe...
  73715. 803d234: a0d7 7dac 6e9b 2090 a7c7 76c5 e305 92ae ...}.n. ...v....
  73716. 803d244: 2181 025f a3c9 a9f7 1438 75b3 2dae 6880 .!_.....8..u.-.h
  73717. 803d254: 4803 ac56 8124 984b 5897 08fd 380e 59e4 .HV.$.K..X...8.Y
  73718. 803d264: b177 e2d6 0fe4 1b8c c127 ca80 20ab 3a05 w.......'.... .:
  73719. 803d274: 5370 4954 c6d5 1ff5 2fe7 03fb e68c 595d pSTI...../....]Y
  73720. 803d284: 1f40 05ec f79d f930 8064 e2dd d743 eb34 @.....0.d...C.4.
  73721. 803d294: 8f12 4952 faf4 e8c9 f9d2 9f2a 847f 0a7e ..RI......*...~.
  73722. 803d2a4: d8b0 3067 3df2 a612 591b 25cf de3b a564 ..g0.=...Y.%;.d.
  73723. 803d2b4: 782b 686d dfda 6cbe f966 c3fe aa74 5662 +xmh...lf...t.bV
  73724. 803d2c4: b76c 1f30 ece1 b3d9 c99d ab0c 8695 1df1 l.0.............
  73725. 803d2d4: 5696 25b9 3269 c4ed 8673 f141 267f 4ecd .V.%i2..s.A..&.N
  73726. 803d2e4: 9b5d 0859 7b85 e459 85eb b4e5 e060 e529 ].Y..{Y.....`.).
  73727. 803d2f4: 1e84 d828 be79 104e 54db cfc1 2de3 2033 ..(.y.N..T...-3
  73728. 803d304: ed4c c7a4 aa7a 9f94 ba68 a60f 9c34 9bff L...z...h...4...
  73729. 803d314: cd0b 1072 9e69 7b45 5955 c1ae d154 10b9 ..r.i.E{UY..T...
  73730. 803d324: 6a2b 1692 79a3 5971 6abc f719 0aed 58c0 +j...yqY.j.....X
  73731. 803d334: 0303 ba0a b96b 297e ae16 945c 2b5c 2b5e ....k.~)..\.\+^+
  73732. 803d344: d538 8b22 6f75 ee55 9f8b c211 b3ba 2070 8.".uoU.......p
  73733. 803d354: e96b 015a a8c7 02ad 1536 0424 693c a22b k.Z.....6.$.<i+.
  73734. 803d364: 3660 02e5 3926 12b6 bb14 4d20 820b a179 `6..&9.... M..y.
  73735. 803d374: f8f9 24d3 3303 5a71 675e 43bb 8a6e c904 ...$.3qZ^g.Cn...
  73736. 803d384: 7151 45b6 c2a3 1892 0d16 b8cb 7766 5819 Qq.E........fw.X
  73737. 803d394: 9a7a 1fc7 6f5a 6d97 0451 80c1 f9f0 452e z...Zo.mQ......E
  73738. 803d3a4: ed0b cfcb 8b9a 393f 4dd9 60cf ad4d d073 ......?9.M.`M.s.
  73739. 803d3b4: 34a1 4c33 e87f c0fc 0fb2 3266 4a29 de1d .43L......f2)J..
  73740. 803d3c4: dc66 8519 4f11 2622 592b 04e1 873d ba06 f....O"&+Y..=...
  73741. 803d3d4: 5c4c 8c20 e9bb 64cd faf7 c547 5766 abee L\ ....d..G.fW..
  73742. 803d3e4: 5b6c 923d c48d c886 6d1e c79a c5cf 5aa2 l[=......m.....Z
  73743. 803d3f4: 0db1 f325 72f3 3cb9 dda9 d60f a99a ceb1 ..%..r.<........
  73744. 803d404: 6097 7289 4f1b 247d 248a 0d57 1eba 0441 .`.r.O}$.$W...A.
  73745. 803d414: 3058 2e55 4f8a b44f 38b6 0372 c9a3 eecd X0U..OO..8r.....
  73746. 803d424: ed55 7b99 2dfc 0db3 e695 de92 9986 ecbe U..{.-..........
  73747. 803d434: 6fd7 40f7 c7ca 6efe 7cfb e9dd 8541 6f4e .o.@...n.|..A.No
  73748. 803d444: ff88 96de 7dbd 860e 806d ccb9 a8ca 9cdd .....}..m.......
  73749. 803d454: f1e2 70d0 ce0e 7661 3186 f32f 37b2 6d02 ...p..av.1/..7.m
  73750. 803d464: d956 d74b a649 fa9e d368 4d80 c9b7 d77e V.K.I...h..M..~.
  73751. 803d474: bf75 2561 bfc4 1967 1a2c 44a8 d1f9 0309 u.a%..g.,..D....
  73752. 803d484: 83db f1c2 cf5b 218f 91f4 c3f0 50f0 b053 ....[..!.....PS.
  73753. 803d494: 4717 0050 d24c 9aac 1f72 6428 5a8f b2cc .GP.L...r.(d.Z..
  73754. 803d4a4: a741 3777 f80e cbe5 4332 7786 b500 7f73 A.w7....2C.w..s.
  73755. 803d4b4: bd07 f065 9637 0c64 77b2 1583 07be f66c ..e.7.d..w....l.
  73756. 803d4c4: 36bb e3b0 02ef 1c0b 036e 043a 7efe ae13 .6......n.:..~..
  73757. 803d4d4: 8aa0 cf40 371c c330 737a 791f 19c3 faba ..@..70.zs.y....
  73758. 803d4e4: 6d33 0aea 0602 23cc c78d b655 0d00 e830 3m.....#..U...0.
  73759. 803d4f4: e9a0 b28c 7fba 659e 076f fc5d 8feb 63ae .......eo.]....c
  73760. 803d504: 1d48 3c85 4583 42da e3ad f8f1 9b2e b5dd H..<.E.B........
  73761. 803d514: 3597 59cb 8d54 bf62 f084 d2c4 31d7 0d9d .5.YT.b......1..
  73762. 803d524: a387 47bb 0223 619c 0957 4e8a 0e0c 8015 ...G#..aW..N....
  73763. 803d534: 7762 d777 1a8c 89f0 db16 72b0 b584 f28f bww........r....
  73764. 803d544: df30 0588 c579 5994 14cb 0087 17a9 773f 0...y..Y......?w
  73765. 803d554: 52cb 7855 7ace 68fc 5f25 e072 923f 6acc .RUx.z.h%_r.?..j
  73766. 803d564: b44c c0c9 8e31 69b1 caa8 8a78 45e5 126a L...1..i..x..Ej.
  73767. 803d574: d0d5 26a3 0ae8 1508 7219 29c5 1c38 b07c ...&.....r.)8.|.
  73768. 803d584: e488 60c6 a062 c525 51e0 1c7d ecbc 2aa3 ...`b.%..Q}....*
  73769. 803d594: 82d0 3f77 7dd4 ae18 b88a 1845 a7db b62c ..w?.}....E...,.
  73770. 803d5a4: 5f9c 0d60 9fbf 8ac3 71f1 c39d 0c52 c02d ._`......q..R.-.
  73771. 803d5b4: 8e6c 8d6b 00fe 5596 f08a 8274 8823 a935 l.k....U..t.#.5.
  73772. 803d5c4: 1242 8927 dc76 3464 de59 404c 714c ae41 B.'.v.d4Y.L@LqA.
  73773. 803d5d4: 8398 e9da ca1c b175 5ce8 860d 70d9 d796 ......u..\...p..
  73774. 803d5e4: 7601 f7c6 84c0 4175 fa1a f2a5 6494 a833 .v....uA.....d3.
  73775. 803d5f4: 6609 23e6 27aa 1ee2 ff6b 0811 ebbe 5884 .f.#.'..k......X
  73776. 803d604: 1894 8139 d405 a5fa ff5d 90de eb03 00c3 ..9.....].......
  73777. 803d614: 5a4f 668a 5587 78be 19fc 221c fc8b 5a15 OZ.f.U.x..."...Z
  73778. 803d624: 9d1c 6e68 8585 911d 8ca4 7571 1d9d c871 ..hn......qu..q.
  73779. 803d634: 1961 4b0c 76e6 97e9 cf19 3575 0592 2ba4 a..K.v....u5...+
  73780. 803d644: 9447 9865 6324 c68a e302 2660 1fd1 ec7f G.e.$c....`&....
  73781. 803d654: b26c 9ed7 0949 65a5 4244 d545 2a9e 2d34 l...I..eDBE..*4-
  73782. 803d664: aa9e 13fd 45f8 efd0 ceb2 d24d 25ca 84e1 .....E....M..%..
  73783. 803d674: 951b 4972 14be 958e 94a8 f24b 173e 3fc4 ..rI......K.>..?
  73784. 803d684: 9f18 c9fd fee8 6ee6 1938 6bc7 0de9 1c78 .......n8..k..x.
  73785. 803d694: 74c0 f611 2f52 717b 2c59 2716 d8c5 a2b4 .t..R/{qY,.'....
  73786. 803d6a4: b556 3aba 8068 0828 2e19 aa28 7422 8a06 V..:h.(...(."t..
  73787. 803d6b4: ffb0 255d a6d0 62cb fe0f f9a7 58aa 5503 ..]%...b.....X.U
  73788. 803d6c4: 3d8e c5ed 331c 87a0 7cc8 0b3d bdae 839c .=...3...|=.....
  73789. 803d6d4: 5847 2885 c3ed 874f f9e1 2ba2 5915 29e4 GX.(..O....+.Y.)
  73790. 803d6e4: 2c28 f1d3 48ef 6c22 927e 1d5b 93ae 8a9e (,...H"l~.[.....
  73791. 803d6f4: 2004 4e4c 5030 efc0 ec0b 89ab 3259 a953 . LN0P......Y2S.
  73792. 803d704: 99b5 ce4e be94 6664 a6aa 8a93 4d54 e997 ..N...df....TM..
  73793. 803d714: 9305 06d4 02b1 1a86 688e baf4 df86 4229 .........h....)B
  73794. 803d724: acb4 73c9 f8d8 3abc 8919 44bc 873d 0267 ...s...:...D=.g.
  73795. 803d734: 9717 fda7 1e49 9ab3 3b64 9e6a b454 38bd ....I...d;j.T..8
  73796. 803d744: f2a7 9a14 1c28 2451 0620 afda 81e0 762b ....(.Q$ .....+v
  73797. 803d754: 57a6 dba7 d56a 972b f43d bf01 172d eb8b .W..j.+.=...-...
  73798. 803d764: 5894 2c3c 4fe1 9021 d00f 4c31 850c 699a .X<,.O!...1L...i
  73799. 803d774: b570 c1bc 40bf 593e f4bf ca77 432a 0ad3 p....@>Y..w.*C..
  73800. 803d784: 5352 df2d e12f 554f 9fe6 eafe f1a7 06af RS-./.OU........
  73801. 803d794: b9e9 0c8c ef01 7233 1f33 f9ab 0c0e f7e9 ......3r3.......
  73802. 803d7a4: 75f3 3876 e2fc f097 f7b3 cfc1 8744 bc0a .uv8........D...
  73803. 803d7b4: 73f7 a337 ccb2 9940 cd97 6c56 f266 535f .s7...@...Vlf._S
  73804. 803d7c4: a77a 045a ba50 ba92 520a c1cf c1ce cc25 z.Z.P....R....%.
  73805. 803d7d4: 0936 c67b 8809 2863 2ff4 c2f2 9bac ff60 6.{...c(./....`.
  73806. 803d7e4: 9d05 3a52 bdd2 60e4 9a39 c503 3a95 d701 ..R:...`9....:..
  73807. 803d7f4: a9a8 b6c7 133e 4e04 5db1 3b09 9f04 6b72 ....>..N.].;..rk
  73808. 803d804: f6a2 c307 de37 0d5f 065e 16f4 c9fe 5f26 ....7._.^.....&_
  73809. 803d814: 5914 7c07 79d7 edbe 6d80 79d9 a7eb bba4 .Y.|.y...m.y....
  73810. 803d824: 305b aff8 328f 0cb4 c6d4 0b19 5d97 8dbe [0...2.......]..
  73811. 803d834: e22f 2523 bb8f 4dfa 0765 9d07 88f0 7801 /.#%...Me......x
  73812. 803d844: 7151 836f e79d a160 0cca 30d0 3c40 4f0e Qqo...`....0@<.O
  73813. 803d854: d7a2 19c2 5553 ac24 94fb 5205 b2d0 955c ....SU$....R..\.
  73814. 803d864: 5b45 1521 14db baa4 488a 7240 da85 b920 E[!......H@r.. .
  73815. 803d874: 75ee 234a c901 5a15 f725 e262 173e 9d82 .uJ#...Z%.b.>...
  73816. 803d884: 90c2 c229 1f4d 8a75 515c 24cb 673b 3235 ..).M.u.\Q.$;g52
  73817. 803d894: 552c f573 35ad a71d df16 f35d db9b 3c74 ,Us..5....]...t<
  73818. 803d8a4: e6fd 5d36 a0cd 9d4d d987 57ea 59ed cceb ..6]..M....W.Y..
  73819. 803d8b4: bf14 5316 5550 be62 237c bfa3 a2ad f3e1 ...SPUb.|#......
  73820. 803d8c4: 5677 7d5c aa23 578e 4adf aba3 5b68 1e54 wV\}#..W.J..h[T.
  73821. 803d8d4: e2f3 79a1 d7a8 6c99 36d0 ea33 bd05 5413 ...y...l.63....T
  73822. 803d8e4: 1e6c a6c8 6145 5072 79b1 9f70 18a9 f04d l...EarP.yp...M.
  73823. 803d8f4: 8430 bb61 9c09 b0e2 41e7 9d9a f0f5 1740 0.a......A....@.
  73824. 803d904: 6e1e 89b9 979b 1864 a0e1 cf27 31e4 93d4 .n....d...'..1..
  73825. 803d914: b2b8 afa8 6071 0d7b 13bd 0fb4 eb8b 3628 ....q`{.......(6
  73826. 803d924: cc50 dfba cc3b b770 cdaa 3185 b9bc 4806 P...;.p....1...H
  73827. 803d934: 0be7 7a09 da3d ec56 ae32 0ce0 fdc4 b264 ...z=.V.2.....d.
  73828. 803d944: 5dca fb12 6157 26aa af87 122d a691 8314 .]..Wa.&..-.....
  73829. 803d954: 0157 60f6 ff60 3751 704d d9e1 09a1 498a W..``.Q7Mp.....I
  73830. 803d964: de04 cdbb 3acb d0a5 ee12 7ef8 1597 64c2 .....:.....~...d
  73831. 803d974: 0228 fd4f bec5 81dc 67b7 71db c0bf f08f (.O......g.q....
  73832. 803d984: 0cfc 1441 d252 cf52 78ac d3ea 6736 4050 ..A.R.R..x..6gP@
  73833. 803d994: 9ed2 30b2 fa35 d44c 24a3 4258 4d33 3dba ...05.L..$XB3M.=
  73834. 803d9a4: db67 1e56 32d2 7223 68bb a117 8364 38bf g.V..2#r.h..d..8
  73835. 803d9b4: 4ec1 22ef ae15 1da1 9607 f09c b539 a41e .N."........9...
  73836. 803d9c4: b4ee d8bd 9d31 83de 8380 05cd 5f3d 73ab ....1.......=_.s
  73837. 803d9d4: 1694 3ec5 fe81 81d6 c3d0 b90d 8397 0f1b ...>............
  73838. 803d9e4: 69b6 eb3b 40d4 ccda 500b c5b2 615b aa29 .i;..@...P..[a).
  73839. 803d9f4: 71cc a9cf ce1e 8a20 382d 0d65 d913 6bdf .q.... .-8e....k
  73840. 803da04: a4f2 0267 bc5a af66 ef37 2ef3 c4a1 6e97 ..g.Z.f.7......n
  73841. 803da14: a483 3874 5707 b830 286a 392b 3c5c d626 ..t8.W0.j(+9\<&.
  73842. 803da24: c411 5da3 f046 913b d4d4 afe0 66a3 019c ...]F.;......f..
  73843. 803da34: 1b8a 38f0 c968 0509 d066 a26c 054c e1e5 ...8h...f.l.L...
  73844. 803da44: 8f75 cbb6 af82 ce83 e521 5e0b 848c 6be8 u.......!..^...k
  73845. 803da54: 5321 e696 7d8d 8641 cb9d 306d 74f3 2ae4 !S...}A...m0.t.*
  73846. 803da64: fdff 4dfe 4cc4 3dcf d482 6dd1 661b 18ae ...M.L.=...m.f..
  73847. 803da74: e98d bad4 a8c5 54e5 e81b 0456 ff9a 19ea .......T..V.....
  73848. 803da84: 5325 f508 846d 7a08 de18 f5b1 88ee fee3 %S..m..z........
  73849. 803da94: 3936 49a6 8857 d6f0 c14e 61b2 a98e 0b62 69.IW...N..a..b.
  73850. 803daa4: 2119 2da8 442a 110b b660 ed7d 85f8 ac15 .!.-*D..`.}.....
  73851. 803dab4: 84fd 60f5 e0d8 3505 04dc c34e 31dc 36c2 ...`...5..N..1.6
  73852. 803dac4: 87e8 b619 bfe7 9a9a 25f3 f2e2 b1ae c4da .........%......
  73853. 803dad4: 4576 33de ad4b 5661 412c 4432 aa9d 89e4 vE.3K.aV,A2D....
  73854. 803dae4: 2a38 aec5 ee49 9a36 3ba8 472c 3151 d237 8*..I.6..;,GQ17.
  73855. 803daf4: f522 30cb 8ea5 96f4 4556 7956 09a9 ea4a "..0....VEVy..J.
  73856. 803db04: aa94 aa7d 2f42 4d8c 5596 f059 eff2 ae07 ..}.B/.M.UY.....
  73857. 803db14: e7f4 f585 90bc fb6a aa88 9437 970c 8843 ......j...7...C.
  73858. 803db24: 7332 257a f11f f856 fb20 31e1 9ac2 128b 2sz%..V. ..1....
  73859. 803db34: 0daf f5b7 eeb0 68f1 9959 bd93 6808 2781 .......hY....h.'
  73860. 803db44: abd1 286a 4149 7931 4e12 cb9e f566 f006 ..j(IA1y.N..f...
  73861. 803db54: 5931 bada 0b25 f1f5 e8a5 fa76 abb0 9cf7 1Y..%.....v.....
  73862. 803db64: a6eb 7b05 12a0 2d36 e944 78a9 16c8 b683 ...{..6-D..x....
  73863. 803db74: ddcc 0972 cc5e 00ee 8c35 8483 16fd 60eb ..r.^...5......`
  73864. 803db84: e0a1 b342 ecbd b155 666e 0953 c4b6 eb61 ..B...U.nfS...a.
  73865. 803db94: dd0f 9d1f b45b 79c4 785e dfa0 29b4 11c0 ....[..y^x...)..
  73866. 803dba4: 5c88 5582 0428 a08c 42b4 2264 9fc5 60ea .\.U(....Bd"...`
  73867. 803dbb4: 11d1 5d60 ec41 6242 ce2b 8b38 8722 fb3b ..`]A.Bb+.8.".;.
  73868. 803dbc4: 4fec 217d 03a4 7961 6e4d 1ab5 e928 bba3 .O}!..ayMn..(...
  73869. 803dbd4: ddc9 3dcd 0ab8 8405 7c76 b5ca c977 27b6 ...=....v|..w..'
  73870. 803dbe4: 19ac b06a a360 8212 651b d499 5b8d fe32 ..j.`....e...[2.
  73871. 803dbf4: 550a b27e c829 8c41 1c22 1fe0 f53e cfc1 .U~.).A."...>...
  73872. 803dc04: e105 c876 43c5 09f6 5620 835b f427 40c6 ..v..C.. V[.'..@
  73873. 803dc14: 8f1d 1ca3 4eff b314 1bd0 f975 63bf 3bb3 .....N....u..c.;
  73874. 803dc24: 66e8 d938 a2c5 1a5d 708c 8de8 8224 7261 .f8...]..p..$.ar
  73875. 803dc34: 46f7 8fea 6525 410c 0c8a d269 090c 4f67 .F..%e.A..i...gO
  73876. 803dc44: 8516 a4d1 813f 1c0a e862 0262 1590 a846 ....?...b.b...F.
  73877. 803dc54: dc4a abdf a0be 5132 64e2 07cc 694a 80b4 J.....2Q.d..Ji..
  73878. 803dc64: 47bf 3e51 87aa 27c5 1449 c040 e3b0 bc48 .GQ>...'I.@...H.
  73879. 803dc74: bbf8 cac2 eaf5 2ba7 e20c 15ee 7540 9d80 .......+....@u..
  73880. 803dc84: 7fa0 4283 bbad 03ba 60fc 2817 6735 e8c6 ...B.....`.(5g..
  73881. 803dc94: f754 2912 b724 997c 7aaf 71d8 5e10 c9bd T..)$.|..z.q.^..
  73882. 803dca4: c5b6 05ee b883 2dcb 1b6c e536 a184 6e7c .......-l.6...|n
  73883. 803dcb4: fa79 6102 10c0 8c0a 3361 0f24 ca1c 4891 y..a....a3$....H
  73884. 803dcc4: f43d 896a 0271 c444 1392 50dc 55ec f4e3 =.j.q.D....P.U..
  73885. 803dcd4: 326a 8099 67b7 5e06 0ccd de36 9950 e3b1 j2...g.^..6.P...
  73886. 803dce4: ccdb 2ae4 9302 f537 4a51 3175 fc3e 5d6c ...*..7.QJu1>.l]
  73887. 803dcf4: d575 db96 97f5 840e 6f8f a3ab c2ec c44b u........o....K.
  73888. 803dd04: d3ee 9acb 91b6 89c1 3f0a 6e83 0539 9395 .........?.n9...
  73889. 803dd14: dece f4ce 16ee fc36 dbd4 d16b f669 87e1 ......6...k.i...
  73890. 803dd24: b27b d918 53eb 7d86 ee08 c94d 0d89 d678 {....S.}..M...x.
  73891. 803dd34: dfdd 24f3 ba3c 7ed8 9bb7 2bac 3051 dc32 ...$<..~...+Q02.
  73892. 803dd44: 140a 8443 0f9d c603 6e93 ca1f b59e b11f ..C......n......
  73893. 803dd54: 17b4 946d 0def 8604 0dfb 1863 b052 8cff ..m.......c.R...
  73894. 803dd64: 1301 0dbc 18ed 2ebb 4b58 5872 6a94 8a5a ........XKrX.jZ.
  73895. 803dd74: c1b6 29d1 4ff2 de7a e7a1 9d60 e2db 960e ...).Oz...`.....
  73896. 803dd84: ac4e 20c8 1ec8 0830 d191 bd89 046e 79e4 N.. ..0.....n..y
  73897. 803dd94: 4a7e b0d5 98c2 0468 43c1 8210 9913 0f54 ~J....h..C....T.
  73898. 803dda4: 1871 ed84 885e 568d 884d 882a 8061 4197 q...^..VM.*.a..A
  73899. 803ddb4: c6e9 6850 ae93 0641 afb6 3bf2 53fc 1bc5 ..Ph..A....;.S..
  73900. 803ddc4: 1dc4 b8f0 c3ad 054a 70b1 b5d3 03b0 ecde ......J..p......
  73901. 803ddd4: 98b9 86fb 4336 5099 d3a1 ccbd 10d4 ae5c ....6C.P......\.
  73902. 803dde4: 0da8 143a ce37 4167 14c8 030e ed46 1409 ..:.7.gA....F...
  73903. 803ddf4: 0b36 7cc3 b78d c1f7 51a5 3fbe 92aa 4eac 6..|.....Q.?...N
  73904. 803de04: 89ca 99cf eb50 a514 6f5a 9294 6deb 7271 ....P...Zo...mqr
  73905. 803de14: 04dc 32a7 8864 13ce 7f68 210b 478e 231d ...2d...h..!.G.#
  73906. 803de24: 2223 0e58 84bb 6027 c682 d3a3 0131 3206 #"X...'`....1..2
  73907. 803de34: c21e 7cf2 2670 1728 9f9c 4a09 3907 1d41 ...|p&(....J.9A.
  73908. 803de44: 6039 9413 b496 5ca0 e47c a826 6710 3506 9`.....\|.&..g.5
  73909. 803de54: 63e3 4139 38cd d6d3 05b4 7a5d cbb9 deb7 .c9A.8....]z....
  73910. 803de64: 2853 c1fe f9f4 96a2 7aa2 a8ea 48b9 b1c0 S(.......z...H..
  73911. 803de74: bf6e a0b9 ab30 48ad 9ecc b2b6 4331 31ac n...0..H....1C.1
  73912. 803de84: 54fb f9e0 8e24 474f f41b 7443 c972 6a18 .T..$.OG..Ctr..j
  73913. 803de94: 383d f536 872c 6494 92ef c426 4e60 b083 =86.,..d..&.`N..
  73914. 803dea4: 45bc 09fe b28e 8ef1 4eb8 7e6d 337b 85cc .E.......Nm~{3..
  73915. 803deb4: 20f8 6e88 e6ba 886c 8686 581d 3bb2 a03a . .n..l....X.;:.
  73916. 803dec4: b736 038b 4a38 c972 10d4 0c5c 13fc bb18 6...8Jr...\.....
  73917. 803ded4: 15e2 7ee2 50e9 74d8 b308 e827 5022 7651 ...~.P.t..'."PQv
  73918. 803dee4: f059 d300 19ea 1425 3784 8461 9827 2f64 Y.....%..7a.'.d/
  73919. 803def4: b478 634a c7f1 9530 cb79 734f 8a29 a6af x.Jc..0.y.Os)...
  73920. 803df04: 7198 5fff a706 2f5f d774 2cd9 a7b7 fa66 .q._.._/t..,..f.
  73921. 803df14: a00f c2e4 3460 833e a6a4 b042 cc0f 0196 ....`4>...B.....
  73922. 803df24: b8db 116a 7fcb 6227 44de 1e73 b9ae 62dc ..j...'b.Ds....b
  73923. 803df34: ebc5 21ca 1760 1504 fa8d 0993 0260 9eab ...!`.......`...
  73924. 803df44: 39fa 3133 ad5a 3b35 cf9f ba75 e3c0 7e57 .931Z.5;..u...W~
  73925. 803df54: d132 99c5 fe9f e5d9 5c67 8a6e 4d4e c2dc 2.......g\n.NM..
  73926. 803df64: c428 58fe a1f0 6768 f0f9 2014 8001 58ad (..X..hg... ...X
  73927. 803df74: 80b7 053e c5d7 0f07 96eb 925e 4ad9 cdcb ..>.......^..J..
  73928. 803df84: cdcd 5a79 9160 2122 c823 3505 e9e8 59b4 ..yZ`."!#..5...Y
  73929. 803df94: 872a 4e5c 1a89 64ba 644c d5b9 1001 b2a8 *.\N...dLd......
  73930. 803dfa4: 766e 0a71 1108 3aaa b31c 6e8a 1b0f 3ab3 nvq....:...n...:
  73931. 803dfb4: 83b8 1f1d f6a8 c50d 574f 300b 169c 5dbf ........OW.0...]
  73932. 803dfc4: 6ec1 094f 3fc7 1acd ccc1 34a6 f117 c7cc .nO..?.....4....
  73933. 803dfd4: 8db3 9b1c f580 2e3f e0e6 a05f e92c 056c ......?..._.,.l.
  73934. 803dfe4: 24a5 924b 917e 7f1c b16c 2eb3 103a 6857 .$K.~...l...:.Wh
  73935. 803dff4: a542 5171 3da8 318d 35c1 1d69 6ff6 3841 B.qQ.=.1.5i..oA8
  73936. 803e004: 3ffe ad5e 87d4 dd8c 53be 7199 217b 3dc8 .?^......S.q{!.=
  73937. 803e014: 356f 4ff0 f3eb 2b04 7aac ac6b 6bc7 0cb6 o5.O...+.zk..k..
  73938. 803e024: 0fbc 3632 2e3c a102 61fb 176e 442c 15a3 ..26<....an.,D..
  73939. 803e034: c201 de28 bb47 d00e 8af0 3be7 a920 8d71 ..(.G......; .q.
  73940. 803e044: 28ae 2d5a adb8 1d01 e271 0a0c d333 6b02 .(Z-....q...3..k
  73941. 803e054: c738 349c 139b 4ac2 1293 0110 692c 1dad 8..4...J....,i..
  73942. 803e064: 8e14 5a18 2b6f 6d28 e3f8 b23b c75e c272 ...Zo+(m..;.^.r.
  73943. 803e074: 4a6e 9f39 30ae c822 7c33 bde8 481e 825a nJ9..0".3|...HZ.
  73944. 803e084: 5db6 d74f e3db 8f14 3311 ae28 417d 2a3d .]O......3(.}A=*
  73945. 803e094: b172 9088 9b84 b85e e1ae 06d1 e20f 3f63 r.....^.......c?
  73946. 803e0a4: 8a32 07af 9865 516a 85e2 7b18 1270 cf46 2...e.jQ...{p.F.
  73947. 803e0b4: 4b9e 068a 03e6 4c47 d8a6 f583 5314 7f9c .K....GL.....S..
  73948. 803e0c4: f51e 2e60 bc1f 54ed 62ab a8fb aa69 a9bc ..`....T.b..i...
  73949. 803e0d4: 9055 8863 22b0 1d9f 147b cfd1 2524 1a21 U.c.."..{...$%!.
  73950. 803e0e4: 0970 7d4a a3da c1a8 1708 738f 4278 5c80 p.J}.......sxB.\
  73951. 803e0f4: 58aa 1cd6 17ae 1dc4 0356 8ce7 cc49 7808 .X......V...I..x
  73952. 803e104: 04d8 e717 0276 8e19 90c2 9d01 9a6c 32ca ....v.......l..2
  73953. 803e114: f577 2680 c1f5 fd7b 00fa 1097 9870 4f84 w..&..{.....p..O
  73954. 803e124: d9a2 a201 e8f5 67d0 ff2f 5604 01de 167a .......g/..V..z.
  73955. 803e134: ecd6 44e2 4102 5880 3864 0dcb e3a1 62cb ...D.A.Xd8.....b
  73956. 803e144: 7b0d d3dd bd6c 655b c56f f6cf 5bcb 5040 .{..l.[eo....[@P
  73957. 803e154: 6b19 2288 f118 fab7 fae6 10b7 8915 2f42 .k."..........B/
  73958. 803e164: 9d6b b8a3 cf4e 2f1a 0e52 fa66 bea0 b965 k...N../R.f...e.
  73959. 803e174: 34c2 a2c2 6e49 6159 369a e412 c98a b1e2 .4..InYa.6......
  73960. 803e184: 1579 1170 f9da fe2d 7ea9 cc14 05b3 85fe y.p...-..~......
  73961. 803e194: 6bc8 f0ff d188 9fe5 26a6 7369 5e99 1518 .k.......&is.^..
  73962. 803e1a4: befb a5e6 f5a8 6d99 cd15 59e2 f1b0 1302 .......m...Y....
  73963. 803e1b4: e920 5393 9a58 7adc 3e6b 8533 c9a7 ad6d ..SX..zk>3...m.
  73964. 803e1c4: 98ca 8836 72b5 49a4 35ec 715f 033f 0446 ..6..r.I.5_q?.F.
  73965. 803e1d4: 4cea a529 5ce6 2631 5ceb a229 2ecf 44f4 .L)..\1&.\)....D
  73966. 803e1e4: 8c8c df3d 2430 8de2 f420 39ff a07f 0b2e ..=.0$.. ..9....
  73967. 803e1f4: 6554 64f5 ab59 90e3 27c0 e34a aac1 a048 Te.dY....'J...H.
  73968. 803e204: 0bc7 6d3e 4385 c5aa 60bb 6347 e1ca 69a0 ..>m.C...`Gc...i
  73969. 803e214: b7a6 e935 68ec 8294 c8ed 608f 6630 9cb0 ..5..h.....`0f..
  73970. 803e224: 5720 d2be fa3f cdd5 3dfd aa78 f22d 7c3a W..?....=x.-.:|
  73971. 803e234: d058 b605 371b 2b2a 2ac9 2209 455d 8b95 X....7*+.*."]E..
  73972. 803e244: 4564 84ab 16e2 9279 b009 a3f1 21a3 8539 dE....y......!9.
  73973. 803e254: afa5 4094 67d3 f0a6 b934 fef5 9931 a3ed ...@.g..4...1...
  73974. 803e264: 0851 1c6b 4a8d 4cb8 4d9f 4343 b58b 200f Q.k..J.L.MCC...
  73975. 803e274: a529 9cd4 2601 3ffc aa57 3469 b9ca 50bc )....&.?W.i4...P
  73976. 803e284: 12b6 2303 931a ad5a d036 f860 3205 2709 ...#..Z.6.`..2.'
  73977. 803e294: 70b6 329b 47f7 691c d5d0 7407 5562 ea23 .p.2.G.i...tbU#.
  73978. 803e2a4: 8121 838d 929a 9f16 ef59 9771 dca7 32b5 !.......Y.q....2
  73979. 803e2b4: 33ed 2adb 3a5e 1da6 3fb4 e0cc e076 495a .3.*^:...?..v.ZI
  73980. 803e2c4: 6476 1b35 2200 0e5e 559e c6d1 9717 8c64 vd5.."^..U....d.
  73981. 803e2d4: 0953 e0c1 a075 765c 8e2b 54be 9b0b 215d S...u.\v+..T..]!
  73982. 803e2e4: 9147 7451 06f5 5a13 5128 ba48 052e abc9 G.Qt...Z(QH.....
  73983. 803e2f4: 3482 3e69 95bf 5336 85ac 5f38 95aa 533a .4i>..6S..8_..:S
  73984. 803e304: 32ec 1760 3129 97c7 da73 15cc 8a54 e8cf .2`.)1..s...T...
  73985. 803e314: 5f18 b19e b4bd f2b8 e2e0 dff2 fe08 aa7f ._..............
  73986. 803e324: 1cfa df5d 03ac 7763 6aba c982 cb3c e027 ..]...cw.j..<.'.
  73987. 803e334: 8bf0 67b5 0eb3 1ae4 59ac a863 3dda 6234 ...g.....Yc..=4b
  73988. 803e344: 996b 7246 3ce2 7c65 a2b2 511d 8ab5 7567 k.Fr.<e|...Q..gu
  73989. 803e354: 5c60 2943 5b4f 9367 c3c9 e262 27ce daab `\C)O[g...b..'..
  73990. 803e364: b87f 8c9f 1621 4705 0c6b 69ce 1e07 8dac ....!..Gk..i....
  73991. 803e374: edd9 51ac c973 151a a08d 995a f0e5 e369 ...Qs.....Z...i.
  73992. 803e384: 2f9a f464 dc50 1f9e 69f3 7cd2 2b7e a66d ./d.P....i.|~+m.
  73993. 803e394: 8b58 f800 ad52 99d4 9762 6b01 43d7 c931 X...R...b..k.C1.
  73994. 803e3a4: 7a8d 2e28 14a8 2937 5a8a 76f9 1145 5717 .z(...7).Z.vE..W
  73995. 803e3b4: 5c1e fe0a e58c 0355 a4df 6e87 b3e6 1bfb .\....U....n....
  73996. 803e3c4: fee7 e917 1b6f 91f0 d21e b1fa c136 09c0 ....o.......6...
  73997. 803e3d4: 3e1e 16c1 0ea1 c9c5 eced 917e 937d a212 .>........~.}...
  73998. 803e3e4: 091a da90 3431 8356 ecc6 0ad0 9432 f5d9 ....14V.....2...
  73999. 803e3f4: 762a 8508 ce55 9d6a b8a0 99d2 3956 e1e3 *v..U.j.....V9..
  74000. 803e404: b06c ada8 6ea9 b21f b899 0267 6e58 f2e8 l....n....g.Xn..
  74001. 803e414: 4ca0 b5e7 2170 69a5 40d2 f99a 70e2 6468 .L..p!.i.@...phd
  74002. 803e424: 2f90 1461 d04c 1f8c 09c9 7c42 3366 a625 ./a.L.....B|f3%.
  74003. 803e434: 518c 0d05 346d e2d3 34c1 6312 b48a 93ab .Q..m4...4.c....
  74004. 803e444: f1a0 5d46 9412 fa52 469a 587a 5db8 048b ..F]..R..FzX.]..
  74005. 803e454: 9565 8be2 9f00 1fd1 e021 e546 9b31 160f e.......!.F.1...
  74006. 803e464: a2ee 5506 4d1e 3503 1cd6 b952 7359 9bc4 ...U.M.5..R.Ys..
  74007. 803e474: 3afc f2a8 1b3c c18d 1841 6cd7 60b6 06b8 .:..<...A..l.`..
  74008. 803e484: 8f2b aa18 07f6 8329 a65a b411 4f38 9df9 +.....).Z...8O..
  74009. 803e494: 68ac ab45 f156 2eac 6b89 e528 7569 cf92 .hE.V....k(.iu..
  74010. 803e4a4: ee1f 1a86 a6a6 9a2e cdc5 cdfd c390 7a6a ..............jz
  74011. 803e4b4: 3831 5637 2079 6636 b3b7 a526 1a57 b541 187Vy 6f..&.W.A.
  74012. 803e4c4: cb32 d3e1 35c6 c85f 9828 3db8 703f a4d3 2....5_.(..=?p..
  74013. 803e4d4: fcf9 da56 b14c 0116 a5f0 a95a c533 032e ..V.L.....Z.3...
  74014. 803e4e4: aed6 6272 1b92 4eb5 505c 6e29 0fd2 f2b5 ..rb...N\P)n....
  74015. 803e4f4: baed 2e27 3cae 14b8 19fc 540d df03 84a4 ..'..<.....T....
  74016. 803e504: 8396 316c 9589 db50 8f80 90f4 8fd6 89b5 ..l1..P.........
  74017. 803e514: 60b7 a0a2 1d33 8b8c 78c9 fe39 1b26 6b86 .`..3....x9.&..k
  74018. 803e524: 1ab0 808a e76a 3290 f389 d88c 5944 f4ca ....j..2....DY..
  74019. 803e534: 3554 983b 6ae2 3567 5450 6941 2b4e f9a0 T5;..jg5PTAiN+..
  74020. 803e544: 78c3 8a30 c88d 3e6c 187a 76e9 1455 a7d2 .x0...l>z..vU...
  74021. 803e554: 83aa 6907 96d4 e81b 3cad 1051 c8d6 026b ...i.....<Q...k.
  74022. 803e564: c6d4 d725 0b5a 7cbb a319 a27a fcc6 4f28 ..%.Z..|..z...(O
  74023. 803e574: e512 dbb3 32a8 9aa5 dcfb 6a17 cba3 ba94 .....2.....j....
  74024. 803e584: 5408 d2bb 8889 d46d 5139 a539 49b5 c427 .T....m.9Q9..I'.
  74025. 803e594: dbc5 4e35 5a54 bfa9 f810 7d19 0313 526f ..5NTZ.....}..oR
  74026. 803e5a4: 8b37 9b87 a4f1 d936 2a92 0e48 48ec 68db 7.....6..*H..H.h
  74027. 803e5b4: 66f5 836d 0031 f81c 4e6e a8db 425b e8ae .fm.1...nN..[B..
  74028. 803e5c4: b743 8f84 c015 ca5f 5269 9804 dca0 0971 C....._.iR....q.
  74029. 803e5d4: 205e 7b1a 9a8f 356e 2eab b0dc 4e66 1884 ^ .{..n5....fN..
  74030. 803e5e4: 10d6 03b2 308e 9616 9ddb 6326 79d2 0d98 .....0....&c.y..
  74031. 803e5f4: 8515 f947 707c cc33 6238 dcce 07ee aef7 ..G.|p3.8b......
  74032. 803e604: 7be7 e668 65cc 096c c576 79cd ca46 5316 .{h..el.v..yF..S
  74033. 803e614: 0093 5112 22ed e86d f416 6ee1 1ab7 18ee ...Q."m....n....
  74034. 803e624: 7013 90e2 a44b ddc0 d870 6b1f 38dc 3ec4 .p..K...p..k.8.>
  74035. 803e634: a6ed be78 a05b dedc c2de 2101 4ab9 835a ..x.[......!.JZ.
  74036. 803e644: a8d0 0410 c04a a8b1 6ae1 e458 d436 1fd2 ....J....jX.6...
  74037. 803e654: 81af 4283 5e28 c714 aac5 0c2c f743 1457 ...B(^....,.C.W.
  74038. 803e664: b3e9 8f08 8ba0 a5e9 1b05 9fe9 d4be c0cd ................
  74039. 803e674: e30e 4dd2 f54b 1f30 621f 6894 8a3c 63b8 ...MK.0..b.h<..c
  74040. 803e684: 61c4 55d4 77db 2ff8 d803 d627 a3a8 4e2c .a.U.w./..'...,N
  74041. 803e694: d64d 5932 ba89 3f1e acaa e9a7 c8e8 0f72 M.2Y...?......r.
  74042. 803e6a4: 1b42 6a99 2b89 730c 3ba9 df90 6b92 b788 B..j.+.s.;...k..
  74043. 803e6b4: b629 9751 e26e 0310 0ea0 8fa6 b3c5 6ba1 ).Q.n..........k
  74044. 803e6c4: 2386 7678 e351 6d58 0091 9c1c 70ba 5102 .#xvQ.Xm.....p.Q
  74045. 803e6d4: 73bb 1822 d4d5 051e d781 f9ca 1e48 8d03 .s".........H...
  74046. 803e6e4: 7d88 c717 3956 e571 35e3 6f78 44a0 5251 .}..V9q..5xo.DQR
  74047. 803e6f4: 2e0c 8dde c318 ade8 cf9f a181 cbe0 0e00 ................
  74048. 803e704: 18a6 0d40 2778 de34 58b9 d822 772c 9557 ..@.x'4..X".,wW.
  74049. 803e714: 2b9c 167b e201 aa3d 6389 9302 b054 8190 .+{...=..c..T...
  74050. 803e724: 3bd8 8c6c 1d3c ca36 3c59 4d10 7697 51f2 .;l.<.6.Y<.M.v.Q
  74051. 803e734: ba4c 3889 9c11 3cea 4154 1a08 628b 8e18 L..8...<TA...b..
  74052. 803e744: d107 1a6a 8ae8 bc91 fe00 640c aaf7 9fc8 ..j........d....
  74053. 803e754: 45c1 2e26 ff3e bb37 7620 431a 29a1 38ec .E&.>.7. v.C.).8
  74054. 803e764: fe11 70dc 14fc a9af a9ff b57c cd9a f49d ...p......|.....
  74055. 803e774: 576a 2a57 121a 4ccf 4863 f1a0 01a3 a616 jWW*...LcH......
  74056. 803e784: 3c2a 56be e299 e994 9b9a e0fe 1f16 d079 *<.V..........y.
  74057. 803e794: e858 807c 097f 95ec 2059 1dca 14b8 32cd X.|.....Y .....2
  74058. 803e7a4: 2f0b 1664 7e25 8c2e 8e3b 4f64 8808 1f8a ./d.%~..;.dO....
  74059. 803e7b4: 4af6 c632 213a 4daa 5d65 319f 783f 3c5a .J2.:!.Me].1?xZ<
  74060. 803e7c4: 9b86 b7f7 d9b7 7f32 70d0 b840 e838 703b ......2..p@.8.;p
  74061. 803e7d4: c2ea d9e9 720e e286 e0f9 4538 7877 d377 .....r....8Ewxw.
  74062. 803e7e4: 8d1d ddc7 6dfe 0d70 39d0 5ae2 4501 f8d4 .....mp..9.Z.E..
  74063. 803e7f4: dd49 496c f1c3 01bf b9fe b1b2 3ab4 72d9 I.lI.........:.r
  74064. 803e804: 08a7 c943 e390 20b7 1ac7 0fe0 993f 7063 ..C.... ....?.cp
  74065. 803e814: 6e8f 564a f5bc 8d05 09f3 e8f9 2a54 2c1d .nJV........T*.,
  74066. 803e824: 0f33 b8a0 be69 1643 9c02 90a3 1f69 0eb6 3...i.C.....i...
  74067. 803e834: 5ad1 f6e8 f871 9a96 1f4b 5592 3333 1075 .Z..q...K..U33u.
  74068. 803e844: ccd0 b745 453a 878d 3ef7 c679 bbc8 ba1a ..E.:E...>y.....
  74069. 803e854: fb28 0ef0 c52e e3f5 993a 454b cc12 00d6 (.......:.KE....
  74070. 803e864: ba4a 5050 1cdf c642 0277 bf98 d1d9 31f7 J.PP..B.w......1
  74071. 803e874: 70c5 6538 0ca7 37c7 1448 a808 9e17 3c52 .p8e...7H.....R<
  74072. 803e884: 08de 48f7 4ad4 8c1a 5f87 8be3 f531 359e ...H.J..._..1..5
  74073. 803e894: 23b7 41ca 1d4d 74c5 43c4 a80d 0dfe 851c .#.AM..t.C......
  74074. 803e8a4: 6539 b6a8 548f d8c5 64a0 bdc7 e787 f276 9e...T...d....v.
  74075. 803e8b4: ca5f 23e3 10fa be88 821e e3c7 3ae0 ba0f _..#.........:..
  74076. 803e8c4: 8b91 0e1f 13a2 8f83 482c 0193 b610 d381 ........,H......
  74077. 803e8d4: fc42 8439 87e7 baf0 ac7b b781 3849 d05e B.9.....{...I8^.
  74078. 803e8e4: e0b4 45df e9d2 2e93 b64b 5677 0559 8722 ...E....K.wVY.".
  74079. 803e8f4: bd27 a9fc 9123 fc96 427e df4b 8e31 ed87 '...#...~BK.1...
  74080. 803e904: a3c3 f67d a741 8fb0 eaf4 7d46 c6f2 c050 ..}.A.....F}..P.
  74081. 803e914: 19cf b380 1e41 f82d db3f 61d9 f8f7 23c3 ....A.-.?..a...#
  74082. 803e924: f5bd ac52 78f1 bcba e393 5dcf ad88 6782 ..R..x.....]...g
  74083. 803e934: e1ee 7ea2 2c6f 0240 0e5d 786d 2be5 61c1 ...~o,@.].mx.+.a
  74084. 803e944: c70d 1e2d ee26 eeb8 cf18 02bc e147 d4bc ..-.&.......G...
  74085. 803e954: cf81 a474 b1ba 7dee e1d6 c32a b51b 9ca8 ..t....}..*.....
  74086. 803e964: 11af aad6 f8b8 c39b dddc 3d0d c34a 035b ...........=J.[.
  74087. 803e974: 5b18 fd94 2747 6e82 c2e2 10c9 c6e0 4e08 .[..G'.n.......N
  74088. 803e984: 3cd1 fc30 ac26 c8a7 1333 74fa 8b7f b57f .<0.&...3..t....
  74089. 803e994: 4daa 5ccb f5e8 acb8 312c 3eff 259b 341b .M.\....,1.>.%.4
  74090. 803e9a4: 51d9 6dd3 5af1 581a d328 e1ae a5da e772 .Q.m.Z.X(.....r.
  74091. 803e9b4: 6e3a 67a8 2ecd c238 be37 0983 8e5e e1e1 :n.g..8.7...^...
  74092. 803e9c4: a50d 11e1 5bbe a9be cbd4 9381 1a15 46c1 .....[.........F
  74093. 803e9d4: 5d60 5b06 d202 34f7 42fe 8955 ac1d 1563 `].[...4.BU...c.
  74094. 803e9e4: b747 4a91 1f30 4354 9605 fdc6 8de8 a439 G..J0.TC......9.
  74095. 803e9f4: 4cd7 0d5c 397d 7f7a c385 df08 eaf6 c20a .L\.}9z.........
  74096. 803ea04: bb51 707f 5cf2 ac83 ecf8 f6a1 cb93 2b33 Q..p.\........3+
  74097. 803ea14: 5d2d 4865 d3df 137c 8aa8 2d64 68b2 3b03 -]eH..|...d-.h.;
  74098. 803ea24: 8c71 4257 e8e8 a672 70ad 8e18 bdd4 70f1 q.WB..r..p.....p
  74099. 803ea34: b2b8 fe67 f4a3 8e12 6a2c ec3f ba35 c897 ..g.....,j?.5...
  74100. 803ea44: eea0 4b57 a532 f3d1 7477 54c8 347a abba ..WK2...wt.Tz4..
  74101. 803ea54: 8de2 c036 0f13 955a ddd0 04df 8f11 ea0c ..6...Z.........
  74102. 803ea64: 82e4 cdef a539 2241 0495 7015 d467 c7bf ....9.A"...pg...
  74103. 803ea74: 9123 f34c fc64 1106 2f38 8e6f 689f 0d88 #.L.d...8/o..h..
  74104. 803ea84: 0ea8 c4bd 3223 e465 c8d7 4028 9dae 0dbd ....#2e...(@....
  74105. 803ea94: 76d3 8d70 67f2 f070 107c f700 8137 bf8c .vp..gp.|...7...
  74106. 803eaa4: afac 813e 2cd8 c0e8 5c2c f2d3 c6ea 0d17 ..>..,..,\......
  74107. 803eab4: ed29 d263 d496 7eeb 9aba b592 1a38 74df ).c....~....8..t
  74108. 803eac4: 1f6f fff0 7bfd 15b4 cba3 a327 c332 356b o....{....'.2.k5
  74109. 803ead4: 51b5 81dd 1927 1f1e 0252 1055 9f03 1186 .Q..'...R.U.....
  74110. 803eae4: c51c 1dc5 33ec fe07 86d1 d347 3bcb dc6a .....3....G..;j.
  74111. 803eaf4: f755 4de7 ef7b f419 9101 4a75 ecae 4da1 U..M{.....uJ...M
  74112. 803eb04: 8039 3df7 36c6 ae40 55ad 0951 3fe3 3cf6 9..=.6@..UQ..?.<
  74113. 803eb14: 1e0d 0cc8 f439 debf b7fe 0ddd 808f b3e1 ....9...........
  74114. 803eb24: e079 9ac5 abe7 0d72 42ae 4230 cae8 87ce y.....r..B0B....
  74115. 803eb34: 5807 c8ce 38d5 88c3 7803 9372 309d 8ae9 .X...8...xr..0..
  74116. 803eb44: 7151 a4f3 1c1a 6f50 ac68 0756 c8da c15f Qq....Poh.V..._.
  74117. 803eb54: 5bbc 5b18 6c59 e333 551d 0109 d633 f5d2 .[.[Yl3..U..3...
  74118. 803eb64: c41e de58 0ba1 e1d3 bfa5 ce05 e993 4db3 ..X............M
  74119. 803eb74: 4416 d9bd b82b a418 2789 c1a6 5b94 0034 .D..+....'...[4.
  74120. 803eb84: 3f5c 7529 5542 af8a 0610 eac8 75b1 115a \?)uBU.......uZ.
  74121. 803eb94: 3e80 dc49 ae32 4ccb 8e34 4713 07e9 c7d7 .>I.2..L4..G....
  74122. 803eba4: 0f50 8681 6781 373e 0f79 86de d6cd 821f P....g>7y.......
  74123. 803ebb4: bae6 5161 d978 5ab0 96b5 6040 05ad a5b0 ..aQx..Z..@`....
  74124. 803ebc4: 00b0 83a2 b3ff 625a 278c bdf5 56d7 6dd6 ......Zb.'...V.m
  74125. 803ebd4: 257e cce2 5540 6c4d 9873 0c19 a2f5 384e ~%..@UMls.....N8
  74126. 803ebe4: 506a dda1 96e1 c184 9022 ec3f 02dd dd34 jP......".?...4.
  74127. 803ebf4: c2f9 9746 9aeb ee12 d052 b29f b486 5f1a ..F.....R......_
  74128. 803ec04: a0b3 af14 0d39 4a04 8cd0 5d44 f7ce bad4 ....9..J..D]....
  74129. 803ec14: b515 0fa1 f418 0f0f 204a 577b 9443 39df ........J {WC..9
  74130. 803ec24: 04ec 7783 c88c 00d1 17c1 3cbd 0447 2913 ...w.......<G..)
  74131. 803ec34: 5f2e 8b1e cf1a e983 c1a0 a509 106c 1e68 ._..........l.h.
  74132. 803ec44: 64a9 8263 36a2 306d cf75 10fd 34a9 3bdd .dc..6m0u....4.;
  74133. 803ec54: a4fa dbb8 f499 e2fd 8292 aece 2797 c786 .............'..
  74134. 803ec64: 5385 5663 11c9 6d78 9445 54c0 9619 f608 .ScV..xmE..T....
  74135. 803ec74: 3451 b7e6 a800 52cb 8a02 a429 2768 d21e Q4.....R..).h'..
  74136. 803ec84: 5474 4d77 1679 a340 4cbf 839e ac95 72e9 tTwMy.@..L.....r
  74137. 803ec94: 657d d75d 539b a7a0 c940 0dd0 c55f 8edc }e]..S..@..._...
  74138. 803eca4: 1c3e 6aff d176 0d56 067a ccc5 dbd0 31a5 >..jv.V.z......1
  74139. 803ecb4: 2449 0644 00f8 5b8c f874 66fc 6a87 6fe8 I$D....[t..f.j.o
  74140. 803ecc4: bec1 82ea f84d adb2 e816 a8da 21af 6ed5 ....M........!.n
  74141. 803ecd4: 57c1 52ca 588b ef38 16e6 b4e8 550c 436d .W.R.X8......UmC
  74142. 803ece4: 9816 16b1 1d9a 5701 81aa 25f7 7c9c 2be5 .......W...%.|.+
  74143. 803ecf4: e0d8 abca 2ab2 5f96 a8c8 984b ec51 b0e6 .....*._..K.Q...
  74144. 803ed04: adbe f09b 0a45 c979 6982 e1eb 4a05 00c7 ....E.y..i...J..
  74145. 803ed14: 4733 3c29 0979 6e47 6fd9 9ecc b11d d17d 3G)<y.Gn.o....}.
  74146. 803ed24: 125d d258 78de f994 1ad4 603c ea3e 44e5 ].X..x....<`>..D
  74147. 803ed34: 7150 4b88 6508 f92a ec03 86ea 9b5a db58 Pq.K.e*.....Z.X.
  74148. 803ed44: 389c e6a7 9a27 e288 900a 1360 790f eb54 .8..'.....`..yT.
  74149. 803ed54: fabe 89e2 c3c0 7f95 f3d2 d8e0 f020 c5cc ............ ...
  74150. 803ed64: 5d31 e788 c201 262d f56c 42e2 5a48 20e5 1]....-&l..BHZ.
  74151. 803ed74: 6c5d e309 5030 d046 ef06 bd5e f0ec 8cc6 ]l..0PF...^.....
  74152. 803ed84: 83bf bdf7 48e0 1eb7 a738 01cd c8a9 772b .....H..8.....+w
  74153. 803ed94: 6eb8 f7c6 4b1d e09f 7700 f06e 38cd 1af0 .n...K...wn..8..
  74154. 803eda4: ebb5 b0ea 825f 46f2 e0e0 beb2 5b87 7e6b ...._..F.....[k~
  74155. 803edb4: c15f 961b 0cf0 f562 5ca9 c357 fdae 051a _.....b..\W.....
  74156. 803edc4: e35f 6be0 3f12 3e5f 5e8c 872f e657 26c1 _..k.?_>.^/.W..&
  74157. 803edd4: bb40 2643 6501 0e9f 5a04 3047 ef2f 5af0 @.C&.e...ZG0/..Z
  74158. 803ede4: 5f45 4ec1 6e6d d2e1 286d 1760 d881 663d E_.Nmn..m(`...=f
  74159. 803edf4: d459 b378 be90 a5d6 0a57 2d1d de6c 35ef Y.x.....W..-l..5
  74160. 803ee04: 2543 f71c 8b34 01fd c570 e151 8d71 0b94 C%..4...p.Q.q...
  74161. 803ee14: 1419 28ca e3ba 8587 ddcb d162 2ec4 367d ...(......b...}6
  74162. 803ee24: a0d9 c16f b3c0 9f8f 0f7b e803 7d11 ecaf ..o.....{....}..
  74163. 803ee34: 5d81 7099 78f9 5cf9 4f4a d2a9 4783 e3dc .].p.x.\JO...G..
  74164. 803ee44: 86eb cdf0 6b36 f53b 1e1f addc 6f84 ce37 ....6k;......o7.
  74165. 803ee54: fa43 0f70 0fe6 a35c d7c4 e91f 4705 a776 C.p...\......Gv.
  74166. 803ee64: af13 6fbf 95cb 0aab bed4 c88c 4797 693d ...o.........G=i
  74167. 803ee74: 39c0 c89e 7400 60df e1d3 9a85 8668 e6f7 .9...t.`....h...
  74168. 803ee84: 62eb b1fe 8e8b ceec 8925 517a f042 b4c4 .b......%.zQB...
  74169. 803ee94: 9a0e fdc1 78af 296b 30f2 fb6b 4132 e82c .....xk).0k.2A,.
  74170. 803eea4: 3af9 d05a 415d b815 b222 91d8 7616 d31a .:Z.]A.."....v..
  74171. 803eeb4: 5a99 8b5e a2dc a1ed 337d c3ba 42b9 8ffb .Z^.....}3...B..
  74172. 803eec4: c264 4eab 22bd add1 1b22 05e7 3cbf 4bf5 d..N.".."....<.K
  74173. 803eed4: e05c 6ec7 902a 2911 20a3 5790 5e51 9cbc \..n*..). .WQ^..
  74174. 803eee4: 45c7 a3b0 0fa7 5f2a 0705 3fb5 54f9 2e7d .E....*_...?.T}.
  74175. 803eef4: 6039 df34 5418 8dc2 733e 0b4b 0020 b836 9`4..T..>sK. .6.
  74176. 803ef04: 1f34 68ab 552e e10f 3bf3 470b 1265 4d7a 4..h.U...;.Ge.zM
  74177. 803ef14: dbcc b0aa 1611 07b9 033c 9f9d 6efd 7f09 ........<....n..
  74178. 803ef24: e751 7f19 3e68 3fc3 47cd 856b 201f 0410 Q...h>.?.Gk.. ..
  74179. 803ef34: 71c9 b701 3850 1e14 0504 82c7 7ea7 07b6 .q..P8.......~..
  74180. 803ef44: 0b1d c28f 00b0 b7c8 dcf8 d2eb d3a0 2f2b ..............+/
  74181. 803ef54: 7833 0f24 0274 d775 f0b6 b932 12be 8795 3x$.t.u...2.....
  74182. 803ef64: 6899 3922 1d5d e556 b867 0999 92de 7b97 .h"9].V.g......{
  74183. 803ef74: 1596 b5b8 63a7 8f4c da32 8944 2f00 12e2 .....cL.2.D../..
  74184. 803ef84: 7ef1 0fc1 1eca 3bd5 8aa6 70f4 b540 45e3 .~.....;...p@..E
  74185. 803ef94: bb1f 21b4 248b 21a7 e40f c824 af01 7f81 ...!.$.!..$.....
  74186. 803efa4: 596f 8d19 2992 80a5 7a24 a425 0437 e06a oY...)..$z%.7.j.
  74187. 803efb4: 3235 d478 e473 7626 6f0e 2ce0 1d21 aa6a 52x.s.&v.o.,!.j.
  74188. 803efc4: a07c a223 6a96 162d f1be 3d04 a25e 6538 |.#..j-....=^.8e
  74189. 803efd4: 089b 025c c42a 111e 9ce1 83a0 c8c8 e2f4 ..\.*...........
  74190. 803efe4: bb65 9ade 0db9 b1b5 cb09 23ad 37b4 abc5 e..........#.7..
  74191. 803eff4: 0550 69a8 7306 4a02 5ea9 5682 de9b 2d40 P..i.s.J.^.V..@-
  74192. 803f004: af42 6ad3 0911 a5a9 cb91 2138 aa46 f1d3 B..j......8!F...
  74193. 803f014: 33ea 8045 1f37 9788 e869 38cc 55ed 0d4f .3E.7...i..8.UO.
  74194. 803f024: 8a51 8724 34ec 40ed 4559 9b56 6066 b6da Q.$..4.@YEV.f`..
  74195. 803f034: e8e9 2320 dea2 6af7 8b80 8a90 1918 4b76 .. #...j......vK
  74196. 803f044: a007 c07f 90c8 698e 0a49 e35a 67f0 1c15 .......iI.Z..g..
  74197. 803f054: 6fac 4589 890a d2c1 4289 e7ad c043 a8d4 .o.E.....B..C...
  74198. 803f064: e21d 71a8 49af 9359 48dc c1aa 0843 2c65 ...q.IY..H..C.e,
  74199. 803f074: bf98 b432 950c 3d2c ed2d e393 1557 ad22 ..2...,=-...W.".
  74200. 803f084: 82f8 9a65 1053 7c4f 73ff a990 a97e ac31 ..e.S.O|.s..~.1.
  74201. 803f094: 8cca 538a 21cf 67df dbae b2d9 fbc3 33ad ...S.!.g.......3
  74202. 803f0a4: 00b6 6d09 773f 7b87 caaf 760f 492f 173a ...m?w.{...v/I:.
  74203. 803f0b4: 1ba6 2f61 b1c9 6e9b 57a7 5c7a b42f 3858 ..a/...n.Wz\/.X8
  74204. 803f0c4: 0864 0561 a461 6094 8782 3bf1 f788 84a2 d.a.a..`...;....
  74205. 803f0d4: 00b8 1207 5cb7 8a05 94b5 2147 3a7e 9202 .....\....G!~:..
  74206. 803f0e4: 7247 62ff 7f88 a82d d43a af9a a01f cda6 Gr.b..-.:.......
  74207. 803f0f4: ebd4 ec3d 2e06 4d4c 32e4 38e5 ac39 56e2 ..=...LM.2.89..V
  74208. 803f104: 75fd 68f6 1061 bd0c 8b91 c53a 7155 5158 .u.ha.....:.UqXQ
  74209. 803f114: 9f90 6605 4ae3 5683 cdec 9825 dde1 1e0a ...f.J.V..%.....
  74210. 803f124: 9f25 c356 64c9 4845 9cf9 561a ab26 12b9 %.V..dEH...V&...
  74211. 803f134: 6d77 edc2 4142 886a 636a 3168 7811 86e6 wm..BAj.jch1.x..
  74212. 803f144: 2a12 adc3 b5b7 b8a1 96b7 00b9 d34c f7d6 .*..........L...
  74213. 803f154: 887c aa7f 6527 e920 d891 fde7 7f4f 3c69 |...'e .....O.i<
  74214. 803f164: 3ee2 8748 0b76 f79e 17f9 2490 497a afc2 .>H.v......$zI..
  74215. 803f174: 8242 1455 405e 8516 e17c a01d f3d6 0771 B.U.^@..|.....q.
  74216. 803f184: 0f9e b8bb da19 5cd1 3e77 bd24 8190 cd21 .......\w>$...!.
  74217. 803f194: 193b 64f4 e107 cd36 bb37 cbea 6d51 da30 ;..d..6.7...Qm0.
  74218. 803f1a4: c6d4 842e 59bd dd42 82d9 fdce 8ac9 d41d .....YB.........
  74219. 803f1b4: 041c 60b6 9111 fd5d 5662 9d1a 5843 ebc6 ...`..].bV..CX..
  74220. 803f1c4: 3092 4896 04f8 8aef e0e7 a306 1760 f77d .0.H........`.}.
  74221. 803f1d4: 1507 bdb8 53be d016 0ee6 31d9 c244 1f5c .....S.....1D.\.
  74222. 803f1e4: 4d69 f7d5 ef0f 28f5 9f01 69ba a1cc 6b37 iM.....(...i..7k
  74223. 803f1f4: 6de9 b7e7 bf70 9fae e90b 36ee f07e 06b5 .m..p......6~...
  74224. 803f204: 7e30 c227 bff4 2c68 fe63 b59a 71b4 2196 0~'...h,c....q.!
  74225. 803f214: 7d8b 434e 703b 1ee9 caec dd84 fb02 4c04 .}NC;p.........L
  74226. 803f224: 748b 1216 4f57 f15b 827e 3eae 0ae8 cbf1 .t..WO[.~..>....
  74227. 803f234: 3058 e59d 1be0 77c1 d84f fd6e afe3 f4ff X0.....wO.n.....
  74228. 803f244: 9ff5 9fe1 f8ff affa ff5f 8feb 111b 185d ........_.....].
  74229. 803f254: 8e3e ebae fe40 009d 1bfc fbfd 5ff7 e5ff >...@........_..
  74230. 803f264: efeb 032f 4e35 fa80 a80f 7ffe febf 65cb ../.5N.........e
  74231. 803f274: 2600 0009 f9ff dff5 febe d7e7 c3df ffbf .&..............
  74232. 803f284: ebeb 03ff 2eb2 3504 bebc 8a48 9746 1b15 .......5..H.F...
  74233. 803f294: 565f 726c ebad 5e37 800c f153 3ea2 2a18 _Vlr..7^..S..>.*
  74234. 803f2a4: 17dd 2ce2 763d 6951 29d7 9517 3df6 b4e0 ...,=vQi.)...=..
  74235. 803f2b4: f388 a02f 36f5 e145 6754 1302 fa49 9451 ../..6E.Tg..I.Q.
  74236. 803f2c4: de07 0864 6df2 e1d5 f60c 9b63 d099 d488 ..d..m....c.....
  74237. 803f2d4: 0dde 5a24 36c0 8042 0837 d76b 472d 16e6 ..$Z.6B.7.k.-G..
  74238. 803f2e4: 6c20 068c e6a3 cad4 0dd5 3378 d9e2 820d l........x3....
  74239. 803f2f4: 05a4 e8fb 6ba3 0770 dfb1 9d95 4d92 538d .....kp......M.S
  74240. 803f304: 0a38 7a3b 5875 1147 6a0f 992d 8ab5 057a 8.;zuXG..j-...z.
  74241. 803f314: f260 c0ba 431f 5e4c 9b66 fd62 7a65 b6c8 `....CL^f.b.ez..
  74242. 803f324: 7807 64e3 605f 441c ceb1 437f e1ae 6b04 .x.d_`.D...C...k
  74243. 803f334: e6dc 0480 99e2 ecd2 152f 7cea d755 38fd ......../..|U..8
  74244. 803f344: 0c89 d964 7ba0 905b e4a0 dc0d 329e 4b78 ..d..{[......2xK
  74245. 803f354: 3752 0e66 8dae 8517 75a2 19a2 8385 bb2a R7f......u....*.
  74246. 803f364: 6aab b6b3 5bbe b589 360c 727b 8608 760a .j...[...6{r...v
  74247. 803f374: d486 a963 3e9e 8f7c db29 db67 3e79 fae5 ..c..>|.).g.y>..
  74248. 803f384: 2191 2a7f f877 8c9a 9bb7 accc a530 bbb7 .!.*w.......0...
  74249. 803f394: 9ab8 1644 3d90 bb02 db5b cf7c d478 75d3 ..D..=..[.|.x..u
  74250. 803f3a4: 03e4 584b e0ae 0c1d 915a e104 5b3c 64f0 ..KX....Z...<[.d
  74251. 803f3b4: 6b67 20ce c3de 229b 9c9b b261 d8fb 41c1 gk. ..."..a....A
  74252. 803f3c4: 8353 96c6 3df1 ada1 d811 fd16 189b 5d96 S....=.........]
  74253. 803f3d4: 28d6 b026 d2be 04cd e68d 970b 8f10 4c6a .(&...........jL
  74254. 803f3e4: b7b0 1cc8 e1ca 1545 aa79 e825 8467 595e ......E.y.%.g.^Y
  74255. 803f3f4: 2475 5091 e387 046d 6dbe 586d 9d76 2568 u$.P..m..mmXv.h%
  74256. 803f404: d2ae 06ed 3e90 a1a3 4412 6da3 41d0 a0d1 .....>...D.m.A..
  74257. 803f414: 0833 05ea c582 44aa 8d50 2bc1 0566 c29c 3......DP..+f...
  74258. 803f424: 3d74 dab2 25aa ae57 0b8c 3dc9 9181 4730 t=...%W....=..0G
  74259. 803f434: c16f 5976 c33c 3c51 7cb0 296b eef4 5aa8 o.vY<.Q<.|k)...Z
  74260. 803f444: bc36 26b6 629f 11a2 cd32 8862 0fda da23 6..&.b..2.b...#.
  74261. 803f454: d1e1 d771 42fb ad4f 4dbb deba 3eab 6e8b ..q..BO..M...>.n
  74262. 803f464: 50b9 8fc7 a1b1 eac7 d50e 3597 7a3f abc0 .P.........5?z..
  74263. 803f474: de51 42ca ece5 62c6 8c7f 18c7 bae0 40d9 Q..B...b.......@
  74264. 803f484: 4df5 f231 c203 81a9 1074 277d 7e67 9f2c .M1.....t.}'g~,.
  74265. 803f494: 74fa 8804 e697 f95d 2c88 1f8c 707e 42b2 .t....]..,..~p.B
  74266. 803f4a4: 8a26 39d4 5cfe 9b96 ac29 40ef 86bd 5b9a &..9.\..)..@...[
  74267. 803f4b4: 414c 8fc2 6505 7c3a f783 bfc6 ff81 c62b LA...e:|......+.
  74268. 803f4c4: 61b4 dd0a 5a76 744d 496d e067 d5d0 dbfe .a..vZMtmIg.....
  74269. 803f4d4: 6fd1 e5cb f56f 2d35 9a8a 0086 4838 da1f .o..o.5-....8H..
  74270. 803f4e4: c9f4 9bc3 18d6 164b 89a6 28ec 9620 1906 ......K....( ...
  74271. 803f4f4: 318c 0077 3cf1 b24b 2955 c635 f566 2f29 .1w..<K.U)5.f.)/
  74272. 803f504: 0e83 a9a1 b7e9 fdb7 0421 19eb 9ab8 1e33 ........!.....3.
  74273. 803f514: 47f5 dfb7 ab82 0d47 508e d478 a3f4 0e8e .G....G..Px.....
  74274. 803f524: 9130 4dcb d310 1289 214a 40f2 a498 d1fa 0..M....J!.@....
  74275. 803f534: e965 07d2 ee1c 7d26 d240 a734 9319 fe87 e.....&}@.4.....
  74276. 803f544: 3348 03a8 6334 ee34 7fdf 591f 4b13 7e96 H3..4c4....Y.K.~
  74277. 803f554: 5910 51fa 1947 67dc cab8 227f 9b9b d91e .Y.QG..g..."....
  74278. 803f564: c15a 54cb 43fd a7b9 dd74 6fc0 db72 e3f8 Z..T.C..t..or...
  74279. 803f574: 62a4 d00e 0ad6 1269 0c78 d613 187e 0642 .b....i.x...~.B.
  74280. 803f584: 8c86 45aa 63d6 13c6 6663 f16d 75d5 d670 ...E.c..cfm..up.
  74281. 803f594: 2d60 e8fb 02ac cdde ed16 e1a1 28e1 8f33 `-...........(3.
  74282. 803f5a4: e6b4 e828 3379 4f89 f4eb c1c7 a7e6 4f99 ..(.y3.O.......O
  74283. 803f5b4: fd45 14c1 ab0b c045 b3f2 d1c6 43f7 9f94 E.....E......C..
  74284. 803f5c4: ad74 e913 ed2d ea7a 71b0 451c 57eb 8f36 t...-.z..q.E.W6.
  74285. 803f5d4: 26a1 8547 fa7c b56f 5e30 2574 009c 2f00 .&G.|.o.0^t%...
  74286. 0803f5e3 <data__info_html>:
  74287. 803f5e3: 692f 666e 2e6f 7468 6c6d 0000 5448 5054 /info.html..HTTP
  74288. 803f5f3: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  74289. 803f603: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  74290. 803f613: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  74291. 803f623: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  74292. 803f633: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  74293. 803f643: 6e65 2d74 654c 676e 6874 203a 3031 3739 ent-Length: 1097
  74294. 803f653: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  74295. 803f663: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  74296. 803f673: 3a65 7420 7865 2f74 7468 6c6d 0a0d 6f43 e: text/html..Co
  74297. 803f683: 746e 6e65 2d74 6e45 6f63 6964 676e 203a ntent-Encoding:
  74298. 803f693: 7a67 7069 0a0d 0a0d 8b1f 0008 0000 0000 gzip............
  74299. 803f6a3: 0a04 569d 6edd 36db 7e14 5615 69bb 2881 ...V.n.6.~.V.i.(
  74300. 803f6b3: 766e 6035 8096 0b22 028a 56eb 1d60 5db0 nv5`.."....V`..]
  74301. 803f6c3: b415 db44 256c 9352 c728 4bbe add2 68bb ..D.l%R.(..K...h
  74302. 803f6d3: 0e81 30c1 4114 aed7 827b 6b74 b4b6 d389 ...0.A..{.tk....
  74303. 803f6e3: a057 68de 21df 272d 9c5e e7ec 3642 c88f W..h.!-'^...B6..
  74304. 803f6f3: f7f3 ef9d aa1c e57b cf93 efd7 7d7e 8367 ......{.....~}g.
  74305. 803f703: 4d0d c59e fa5d 1965 8357 0828 0920 c69e .M..].e.W.(. ...
  74306. 803f713: 5cdd ce18 2192 2b2f a261 36a0 f0fd ec23 .\...!/+a..6..#.
  74307. 803f723: b7b9 6343 508a 537c 51cb 7c14 7e15 2379 ..Cc.P|S.Q.|.~y#
  74308. 803f733: d75c c179 ec8d 2265 8960 4656 a828 dadc \.y...e"`.VF(...
  74309. 803f743: 4488 103a 92ad b9e2 8288 1491 859b cd2e .D:.............
  74310. 803f753: 7399 329b c335 1528 9923 d088 2b09 4952 .s.25.(.#....+RI
  74311. 803f763: 7923 5616 cf09 b444 92b6 b1f3 ebcc 2e7c #y.V..D.......|.
  74312. 803f773: 95d7 9d28 e1c0 ba32 170e 9a46 c44c 99f6 ..(...2...F.L...
  74313. 803f783: 369d dadf 6693 1ecb fddb 91e6 6c3d 769e .6...f......=l.v
  74314. 803f793: 7e3b 9baf f549 0d80 d14b 828f 4b9c 9ab5 ;~..I...K....K..
  74315. 803f7a3: 5554 4ac0 4591 6541 9926 86a8 1842 aa58 TU.J.EAe&...B.X.
  74316. 803f7b3: 5292 8616 4999 7081 188d ce9b 3e7d fee2 .R...I.p....}>..
  74317. 803f7c3: c06d 32aa 8289 6752 f562 857e 1dc3 1eff m..2..Rgb.~.....
  74318. 803f7d3: 0f0b 4f5a 93a7 9bb8 11ca 324b 555e a051 ..ZO......K2^UQ.
  74319. 803f7e3: a8f8 4bc7 ffe6 54c2 79f4 999d ec56 b1cb ...K...T.y..V...
  74320. 803f7f3: 4348 0ba3 3a58 13a7 4592 fa51 b8ad 67cb HC..X:...EQ....g
  74321. 803f803: 4ba1 8a95 2af1 0c15 7a10 991f 681e 858a .K...*...z...h..
  74322. 803f813: 81e3 f699 d5b7 20f8 3260 ce45 d542 44a1 ....... `2E.B..D
  74323. 803f823: 6675 eb47 d5ac 7047 446d fa58 b4d3 0188 ufG...GpmDX.....
  74324. 803f833: 52d9 b1c7 097d b774 3eec 3e50 7668 ad9a .R..}.t..>P>hv..
  74325. 803f843: b1e6 4ef7 cfe7 80ea 463a 41aa e3e5 ed8d ...N....:F.A....
  74326. 803f853: 50cf 26db 7b05 df62 77da 70f6 9ab9 7d54 .P.&.{b..w.p..T}
  74327. 803f863: 98bd 4f22 1c8c 4a81 0bcb 894c ddff 50f5 .."O...J..L....P
  74328. 803f873: 4656 9397 f3d6 cd4f 7843 229d a3e4 9f53 VF....O.Cx."..S.
  74329. 803f883: 1a9d f7dc 9d90 7f81 e4b3 0145 1de0 336a ..........E...j3
  74330. 803f893: 0336 e18b 05da b1de 05d1 8498 88f1 3267 6.............g2
  74331. 803f8a3: 2345 1568 f4f6 8098 0f26 5d7d 6ee6 8bfb E#h.....&.}].n..
  74332. 803f8b3: 6ecf a1df 02dc f946 1568 2e05 64d3 0320 .n....F.h....d .
  74333. 803f8c3: c686 6a1a b898 71b9 7a17 8886 d6dd 0bc7 ...j...q.z......
  74334. 803f8d3: b0b3 1ce6 bd32 d9d0 61c2 3dcf d253 fd12 ....2....a.=S...
  74335. 803f8e3: 5597 8705 0fed d701 801e ce9e 3f00 47b2 .U...........?.G
  74336. 803f8f3: d6a8 fa16 8861 e8c0 5634 d5ae a78d 33ad ....a...4V.....3
  74337. 803f903: b690 955e 0256 9459 838e 1776 1de8 e3d8 ..^.V.Y...v.....
  74338. 803f913: 29e6 7573 8d7f db1e aaa1 4c1b b30a c754 .)su.......L..T.
  74339. 803f923: 5c65 4617 34e6 dc02 e741 7bd4 ed89 8473 e\.F.4..A..{..s.
  74340. 803f933: 06f6 8f36 279a 3373 a78e 153a 52d9 1f8d ..6..'s3..:..R..
  74341. 803f943: 9ec1 bb1d eccf 477b 43a0 a7fb 8dfd 108c ......{G.C......
  74342. 803f953: b0a5 5fda 5330 1a94 5895 7aee 7097 b668 ..._0S...X.z.ph.
  74343. 803f963: 3a69 5030 c5f9 6282 737f ca24 d50a 1659 i:0P...b.s$...Y.
  74344. 803f973: edc3 eb1b 1c0c 437a 3468 0bdb 397a 784f ......zCh4..z9Ox
  74345. 803f983: 529a 9ebf f5cf 3915 87b4 fce0 79b4 df6c .R.....9.....yl.
  74346. 803f993: 1032 c4f1 0ef5 c355 4823 63a9 29aa c9d7 2.....U.#H.c.)..
  74347. 803f9a3: 6ef4 ac01 d45d 6e0e 2e09 7a98 6ad4 5dc5 .n..]..n...z.j.]
  74348. 803f9b3: 8aa9 ecfa 0ab0 c9d0 6734 a6f5 296a 5b3c ........4g..j)<[
  74349. 803f9c3: 86ce 9105 2431 6356 8188 7c75 099c c035 ....1$Vc..u|..5.
  74350. 803f9d3: 0dfc aed6 1cd3 1f3d 73fb 14ca 9f00 f7d8 ......=..s......
  74351. 803f9e3: 8e78 fcf0 3081 c8a6 e0e6 c39f 26a8 a7d5 x....0.......&..
  74352. 803f9f3: 713a e11d 29fb 4b9b 37ff a21e 31f4 4781 :q...).K.7...1.G
  74353. 803fa03: 76c4 e863 e690 8788 62f1 1240 639d e202 .vc......b@..c..
  74354. 803fa13: 21de e7a0 7fc2 a20d b6d3 c5ca f72d a3cc .!..........-...
  74355. 803fa23: 7cd5 30ef c77a 6bec 1002 11e0 0e05 d120 .|.0z..k...... .
  74356. 803fa33: a3e8 fffa 4f6e 6540 1090 d059 7759 5d55 ....nO@e..Y.YwU]
  74357. 803fa43: 9ada 9fbe a18f aa74 ca70 b41e 0ffb 05f6 ......t.p.......
  74358. 803fa53: 300b 5f65 3dda 7f66 8f81 e15f 2f71 5a58 .0e_.=f..._.q/XZ
  74359. 803fa63: e5d5 57dd d517 fcbd 0ec2 b4bc 4871 7975 ...W........qHuy
  74360. 803fa73: b4f3 75a8 24dc bb8b dabd ad18 5766 17ac ...u.$......fW..
  74361. 803fa83: a602 9255 e4c9 6e01 6157 52ea aab1 e5ee ..U....nWa.R....
  74362. 803fa93: dcd2 b8c2 7abc e56d daca b6fc 19eb f0c5 .....zm.........
  74363. 803faa3: 4584 7329 4e5e f590 0c2b efa3 ae00 6507 .E)s^N..+......e
  74364. 803fab3: e687 3789 3a0a dd13 e7f1 45af e63f c5fe ...7.:.....E?...
  74365. 803fac3: ef05 0fbe 2f16 4bf8 62b5 c49a 8537 7ab9 ...../.K.b..7..z
  74366. 803fad3: e3ed 9fb3 f404 f56d 2017 d96f 6b71 0009 ......m.. o.qk..
  74367. 803fae3: 4800 5454 2f50 2e31 2030 3032 2030 4b4f .HTTP/1.0 200 OK
  74368. 803faf3: 0a0d 6f43 746e 6e65 2d74 7954 6570 743a ..Content-Type:t
  74369. 803fb03: 7865 2f74 7468 6c6d 0a0d 0a0d 7b00 4122 ext/html.....{"A
  74370. 803fb13: 2243 223a 2200 222c 4344 3a22 0022 2c22 C":".","DC":".",
  74371. 803fb23: 6922 5f6e 7266 7165 3a22 0022 2c22 6f22 "in_freq":".","o
  74372. 803fb33: 7475 665f 6572 2271 223a 2200 222c 7770 ut_freq":".","pw
  74373. 803fb43: 2272 223a 2200 222c 696c 656e 665f 6961 r":".","line_fai
  74374. 803fb53: 226c 223a 2200 222c 6f6c 5f77 6162 7474 l":".","low_batt
  74375. 803fb63: 7265 2279 223a 2200 222c 6162 5f74 6163 ery":".","bat_ca
  74376. 803fb73: 2270 223a 2200 222c 6e69 656e 5f72 6574 p":".","inner_te
  74377. 803fb83: 706d 3a22 0022 2c22 6222 7461 745f 6d69 mp":".","bat_tim
  74378. 803fb93: 5f65 656c 7466 3a22 0022 2c22 6c22 616f e_left":".","loa
  74379. 803fba3: 5f64 6f6d 696e 6f74 2272 223a 2200 222c d_monitor":".","
  74380. 803fbb3: 6574 706d 6d5f 6e6f 7469 726f 3a22 0022 temp_monitor":".
  74381. 803fbc3: 2c22 6322 6e6f 656e 7463 6d5f 6e6f 7469 ","connect_monit
  74382. 803fbd3: 726f 3a22 0022 2c22 6122 616c 6d72 3a22 or":".","alarm":
  74383. 803fbe3: 0022 2c22 6e22 7465 6573 7474 6e69 7367 ".","netsettings
  74384. 803fbf3: 635f 6168 676e 6465 3a22 0022 7d22 7b00 _changed":"."}.{
  74385. 803fc03: 7222 6165 5f64 6f63 6d6d 6e75 7469 2279 "read_community"
  74386. 803fc13: 223a 2200 222c 7277 7469 5f65 6f63 6d6d :".","write_comm
  74387. 803fc23: 6e75 7469 2279 223a 2200 222c 616d 616e unity":".","mana
  74388. 803fc33: 6567 4972 2250 223a 2200 222c 616d 616e gerIP":".","mana
  74389. 803fc43: 6567 4972 3250 3a22 0022 2c22 6d22 6e61 gerIP2":".","man
  74390. 803fc53: 6761 7265 5049 2233 223a 2200 222c 616d agerIP3":".","ma
  74391. 803fc63: 616e 6567 4972 3450 3a22 0022 2c22 6d22 nagerIP4":".","m
  74392. 803fc73: 6e61 6761 7265 5049 2235 223a 2200 222c anagerIP5":".","
  74393. 803fc83: 6964 2231 223a 2200 222c 6f72 2231 223a di1":".","ro1":"
  74394. 803fc93: 2200 222c 6f72 2232 223a 2200 222c 7069 .","ro2":".","ip
  74395. 803fca3: 6461 7264 3a22 0022 2c22 6722 2277 223a addr":".","gw":"
  74396. 803fcb3: 2200 222c 616d 6b73 3a22 0022 2c22 6422 .","mask":".","d
  74397. 803fcc3: 6368 2270 003a 222c 7372 735f 7265 6576 hcp":.,"rs_serve
  74398. 803fcd3: 2272 223a 2200 222c 7372 705f 726f 2274 r":".","rs_port"
  74399. 803fce3: 223a 2200 222c 7372 705f 6477 3a22 0022 :".","rs_pwd":".
  74400. 803fcf3: 2c22 7222 5f73 656b 2279 223a 2200 222c ","rs_key":".","
  74401. 803fd03: 7372 655f 616e 6c62 6465 3a22 2c00 6422 rs_enabled":.,"d
  74402. 803fd13: 7461 2265 223a 2200 222c 6974 656d 3a22 ate":".","time":
  74403. 803fd23: 0022 2c22 6e22 7074 3a22 0022 2c22 6e22 ".","ntp":".","n
  74404. 803fd33: 7074 6573 7672 7069 3a22 0022 2c22 7522 tpservip":".","u
  74405. 803fd43: 6374 3a22 0022 2c22 7522 6d74 3a22 0022 tc":".","utm":".
  74406. 803fd53: 2c22 6c22 7361 7374 6e79 7463 6d69 2265 ","lastsynctime"
  74407. 803fd63: 223a 7b00 7522 7470 6d69 2265 223a 2200 :".{"uptime":"."
  74408. 803fd73: 222c 6f6d 6564 226c 223a 2200 222c 7270 ,"model":".","pr
  74409. 803fd83: 646f 7461 2265 223a 2200 222c 7766 6576 odate":".","fwve
  74410. 803fd93: 7372 6f69 226e 223a 2200 222c 616d 6163 rsion":".","maca
  74411. 803fda3: 6464 2272 223a 2200 222c 6573 6e72 226f ddr":".","serno"
  74412. 803fdb3: 223a 2200 222c 776f 656e 2272 223a 2200 :".","owner":"."
  74413. 803fdc3: 222c 7973 4c73 636f 7461 6f69 226e 223a ,"sysLocation":"
  74414. 803fdd3: 2200 222c 6f63 6d6d 6e65 2274 223a 2200 .","comment":"."
  74415. 803fde3: 222c 7075 5f73 6f6d 6564 226c 223a 2200 ,"ups_model":"."
  74416. 803fdf3: 222c 7075 5f73 7766 6576 7372 6f69 226e ,"ups_fwversion"
  74417. 803fe03: 223a 5200 6265 6f6f 5474 7361 006b 6374 :".RebootTask.tc
  74418. 803fe13: 6970 5f70 6874 6572 6461 0400 pip_thread.
  74419. 0803fe1e <memp_num>:
  74420. 803fe1e: 0004 0006 000c 0005 0019 0010 0006 0008 ................
  74421. 803fe2e: 0014 000a 001e 0032 0005 0009 0032 0019 ......2.....2...
  74422. 0803fe3e <memp_sizes>:
  74423. 803fe3e: 001c 0020 0094 001c 0010 0010 002c 0014 .. .........,...
  74424. 803fe4e: 0014 0010 0020 0010 0024 0080 0010 0614 .... ...$.......
  74425. 803fe5e: 0000 ..
  74426. 0803fe60 <tcp_pcb_lists>:
  74427. 803fe60: 0fe4 2001 0fec 2001 0fdc 2001 0ff0 2001 ... ... ... ...
  74428. 0803fe70 <tcp_backoff>:
  74429. 803fe70: 0201 0403 0605 0707 0707 0707 0307 .............
  74430. 0803fe7d <tcp_persist_backoff>:
  74431. 803fe7d: 0603 180c 6030 ff78 ....0`x
  74432. 0803fe84 <ip_addr_broadcast>:
  74433. 803fe84: ffff ffff ....
  74434. 0803fe88 <ip_addr_any>:
  74435. 803fe88: 0000 0000 ....
  74436. 0803fe8c <syslocation_len_default>:
  74437. 803fe8c: 0000 0000 ....
  74438. 0803fe90 <snmp_scalar>:
  74439. 803fe90: 1375 0803 0e29 0803 13b9 0803 0f3d 0803 u...).......=...
  74440. 803fea0: 0001 0000 ....
  74441. 0803fea4 <udpentry_nodes>:
  74442. 803fea4: 1644 2000 1644 2000 D.. D..
  74443. 0803feac <attable>:
  74444. 803feac: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74445. 803febc: 0002 0001 ffdc 0803 0104 0804 ............
  74446. 0803fec8 <mib2_nodes>:
  74447. 803fec8: 06d4 0804 029c 0804 160c 2000 0778 0804 ........... x...
  74448. 803fed8: 009c 0804 026c 0804 04c8 0804 0038 0804 ....l.......8...
  74449. 0803fee8 <iprteentry_nodes>:
  74450. 803fee8: 1674 2000 1674 2000 1674 2000 1674 2000 t.. t.. t.. t..
  74451. 803fef8: 1674 2000 1674 2000 1674 2000 1674 2000 t.. t.. t.. t..
  74452. 803ff08: 1674 2000 1674 2000 1674 2000 1674 2000 t.. t.. t.. t..
  74453. 803ff18: 1674 2000 t..
  74454. 0803ff1c <iprouteinfo>:
  74455. 803ff1c: 0002 0000 0000 0000 0000 0000 0000 0000 ................
  74456. 803ff2c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74457. 803ff3c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74458. 803ff4c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74459. 803ff5c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74460. 803ff6c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74461. 803ff7c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74462. 803ff8c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74463. 803ff9c: 0000 0000 ....
  74464. 0803ffa0 <sysname_default>:
  74465. 803ffa0: 5146 4e44 752d 6b6e 0000 0000 FQDN-unk....
  74466. 0803ffac <ipntomentry_ids>:
  74467. 803ffac: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74468. 0803ffbc <interfaces_scalar>:
  74469. 803ffbc: 0a7d 0803 0a9d 0803 09cb 0803 09cf 0803 }...............
  74470. 803ffcc: 0001 0000 ....
  74471. 0803ffd0 <syslocation_default>:
  74472. 803ffd0: 0000 0000 ....
  74473. 0803ffd4 <interfaces_ids>:
  74474. 803ffd4: 0001 0000 0002 0000 ........
  74475. 0803ffdc <attable_id>:
  74476. 803ffdc: 0001 0000 ....
  74477. 0803ffe0 <mgmt>:
  74478. 803ffe0: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74479. 803fff0: 0002 0001 06d0 0804 04c4 0804 ............
  74480. 0803fffc <mib2_ids>:
  74481. 803fffc: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74482. 804000c: 0005 0000 0006 0000 0007 0000 000b 0000 ................
  74483. 0804001c <mib2>:
  74484. 804001c: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74485. 804002c: 0002 0008 fffc 0803 fec8 0803 ............
  74486. 08040038 <snmp>:
  74487. 8040038: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74488. 8040048: 0002 001c 05bc 0804 0454 0804 ........T...
  74489. 08040054 <tcp_scalar>:
  74490. 8040054: 12e9 0803 0d21 0803 09cb 0803 09cf 0803 ....!...........
  74491. 8040064: 0001 0000 ....
  74492. 08040068 <sys_tem_nodes>:
  74493. 8040068: 01a8 0804 01a8 0804 01a8 0804 01a8 0804 ................
  74494. 8040078: 01a8 0804 01a8 0804 01a8 0804 ............
  74495. 08040084 <snmpenableauthentraps_default>:
  74496. 8040084: 0002 0000 ....
  74497. 08040088 <udp_nodes>:
  74498. 8040088: 00f0 0804 00f0 0804 00f0 0804 00f0 0804 ................
  74499. 8040098: 1628 2000 (..
  74500. 0804009c <icmp>:
  74501. 804009c: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74502. 80400ac: 0002 001a 0368 0804 01f8 0804 ....h.......
  74503. 080400b8 <ip_scalar>:
  74504. 80400b8: 11fd 0803 0ab1 0803 0b71 0803 09cf 0803 ........q.......
  74505. 80400c8: 0001 0000 ....
  74506. 080400cc <udpentry_ids>:
  74507. 80400cc: 0001 0000 0002 0000 ........
  74508. 080400d4 <ipntomentry>:
  74509. 80400d4: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74510. 80400e4: 0002 0004 ffac 0803 028c 0804 ............
  74511. 080400f0 <udp_scalar>:
  74512. 80400f0: 0dc5 0803 0df1 0803 09cb 0803 09cf 0803 ................
  74513. 8040100: 0001 0000 ....
  74514. 08040104 <attable_node>:
  74515. 8040104: 018c 0804 ....
  74516. 08040108 <ifspecific>:
  74517. 8040108: 0002 0000 0000 0000 0000 0000 0000 0000 ................
  74518. 8040118: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74519. 8040128: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74520. 8040138: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74521. 8040148: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74522. 8040158: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74523. 8040168: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74524. 8040178: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74525. 8040188: 0000 0000 ....
  74526. 0804018c <atentry>:
  74527. 804018c: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74528. 804019c: 0002 0003 02ec 0804 03e4 0804 ............
  74529. 080401a8 <sys_tem_scalar>:
  74530. 80401a8: 09d1 0803 1631 0803 1161 0803 1401 0803 ....1...a.......
  74531. 80401b8: 0001 0000 ....
  74532. 080401bc <tcp_nodes>:
  74533. 80401bc: 0054 0804 0054 0804 0054 0804 0054 0804 T...T...T...T...
  74534. 80401cc: 0054 0804 0054 0804 0054 0804 0054 0804 T...T...T...T...
  74535. 80401dc: 0054 0804 0054 0804 0054 0804 0054 0804 T...T...T...T...
  74536. 80401ec: 1774 2000 0054 0804 0054 0804 t.. T...T...
  74537. 080401f8 <icmp_nodes>:
  74538. 80401f8: 06a0 0804 06a0 0804 06a0 0804 06a0 0804 ................
  74539. 8040208: 06a0 0804 06a0 0804 06a0 0804 06a0 0804 ................
  74540. 8040218: 06a0 0804 06a0 0804 06a0 0804 06a0 0804 ................
  74541. 8040228: 06a0 0804 06a0 0804 06a0 0804 06a0 0804 ................
  74542. 8040238: 06a0 0804 06a0 0804 06a0 0804 06a0 0804 ................
  74543. 8040248: 06a0 0804 06a0 0804 06a0 0804 06a0 0804 ................
  74544. 8040258: 06a0 0804 06a0 0804 ........
  74545. 08040260 <sysdescr_len_default>:
  74546. 8040260: 0004 0000 ....
  74547. 08040264 <interfaces_nodes>:
  74548. 8040264: ffbc 0803 1814 2000 .......
  74549. 0804026c <tcp>:
  74550. 804026c: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74551. 804027c: 0002 000f 0418 0804 01bc 0804 ............
  74552. 08040288 <syscontact_default>:
  74553. 8040288: 0000 0000 ....
  74554. 0804028c <ipntomentry_nodes>:
  74555. 804028c: 18d8 2000 18d8 2000 18d8 2000 18d8 2000 ... ... ... ...
  74556. 0804029c <interfaces>:
  74557. 804029c: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74558. 80402ac: 0002 0002 ffd4 0803 0264 0804 ........d...
  74559. 080402b8 <iprteentry_ids>:
  74560. 80402b8: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74561. 80402c8: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  74562. 80402d8: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  74563. 80402e8: 000d 0000 ....
  74564. 080402ec <atentry_ids>:
  74565. 80402ec: 0001 0000 0002 0000 0003 0000 ............
  74566. 080402f8 <tcpconnentry_nodes>:
  74567. 80402f8: 179c 2000 179c 2000 179c 2000 179c 2000 ... ... ... ...
  74568. 8040308: 179c 2000 ...
  74569. 0804030c <ip_nodes>:
  74570. 804030c: 00b8 0804 00b8 0804 00b8 0804 00b8 0804 ................
  74571. 804031c: 00b8 0804 00b8 0804 00b8 0804 00b8 0804 ................
  74572. 804032c: 00b8 0804 00b8 0804 00b8 0804 00b8 0804 ................
  74573. 804033c: 00b8 0804 00b8 0804 00b8 0804 00b8 0804 ................
  74574. 804034c: 00b8 0804 00b8 0804 00b8 0804 17c8 2000 ...............
  74575. 804035c: 1830 2000 15f0 2000 00b8 0804 0.. ... ....
  74576. 08040368 <icmp_ids>:
  74577. 8040368: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74578. 8040378: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  74579. 8040388: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  74580. 8040398: 000d 0000 000e 0000 000f 0000 0010 0000 ................
  74581. 80403a8: 0011 0000 0012 0000 0013 0000 0014 0000 ................
  74582. 80403b8: 0015 0000 0016 0000 0017 0000 0018 0000 ................
  74583. 80403c8: 0019 0000 001a 0000 ........
  74584. 080403d0 <udp_ids>:
  74585. 80403d0: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74586. 80403e0: 0005 0000 ....
  74587. 080403e4 <atentry_nodes>:
  74588. 80403e4: 17e8 2000 17e8 2000 17e8 2000 ... ... ...
  74589. 080403f0 <ipaddrentry_nodes>:
  74590. 80403f0: 1744 2000 1744 2000 1744 2000 1744 2000 D.. D.. D.. D..
  74591. 8040400: 1744 2000 D..
  74592. 08040404 <ipaddrentry_ids>:
  74593. 8040404: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74594. 8040414: 0005 0000 ....
  74595. 08040418 <tcp_ids>:
  74596. 8040418: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74597. 8040428: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  74598. 8040438: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  74599. 8040448: 000d 0000 000e 0000 000f 0000 ............
  74600. 08040454 <snmp_nodes>:
  74601. 8040454: fe90 0803 fe90 0803 fe90 0803 fe90 0803 ................
  74602. 8040464: fe90 0803 fe90 0803 fe90 0803 fe90 0803 ................
  74603. 8040474: fe90 0803 fe90 0803 fe90 0803 fe90 0803 ................
  74604. 8040484: fe90 0803 fe90 0803 fe90 0803 fe90 0803 ................
  74605. 8040494: fe90 0803 fe90 0803 fe90 0803 fe90 0803 ................
  74606. 80404a4: fe90 0803 fe90 0803 fe90 0803 fe90 0803 ................
  74607. 80404b4: fe90 0803 fe90 0803 fe90 0803 fe90 0803 ................
  74608. 080404c4 <mgmt_nodes>:
  74609. 80404c4: 001c 0804 ....
  74610. 080404c8 <udp>:
  74611. 80404c8: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74612. 80404d8: 0002 0005 03d0 0804 0088 0804 ............
  74613. 080404e4 <iprteentry>:
  74614. 80404e4: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74615. 80404f4: 0002 000d 02b8 0804 fee8 0803 ............
  74616. 08040500 <ifentry>:
  74617. 8040500: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74618. 8040510: 0002 0016 0648 0804 0720 0804 ....H... ...
  74619. 0804051c <udpentry>:
  74620. 804051c: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74621. 804052c: 0002 0002 00cc 0804 fea4 0803 ............
  74622. 08040538 <ip_ids>:
  74623. 8040538: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74624. 8040548: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  74625. 8040558: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  74626. 8040568: 000d 0000 000e 0000 000f 0000 0010 0000 ................
  74627. 8040578: 0011 0000 0012 0000 0013 0000 0014 0000 ................
  74628. 8040588: 0015 0000 0016 0000 0017 0000 ............
  74629. 08040594 <sysdescr_default>:
  74630. 8040594: 776c 5049 0800 lwIP.
  74631. 08040599 <sysname_len_default>:
  74632. 8040599: 0008 c300 ...
  74633. 0804059c <tcpconnentry>:
  74634. 804059c: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74635. 80405ac: 0002 0005 070c 0804 02f8 0804 ............
  74636. 080405b8 <syscontact_len_default>:
  74637. 80405b8: 0000 0000 ....
  74638. 080405bc <snmp_ids>:
  74639. 80405bc: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74640. 80405cc: 0005 0000 0006 0000 0008 0000 0009 0000 ................
  74641. 80405dc: 000a 0000 000b 0000 000c 0000 000d 0000 ................
  74642. 80405ec: 000e 0000 000f 0000 0010 0000 0011 0000 ................
  74643. 80405fc: 0012 0000 0013 0000 0014 0000 0015 0000 ................
  74644. 804060c: 0016 0000 0018 0000 0019 0000 001a 0000 ................
  74645. 804061c: 001b 0000 001c 0000 001d 0000 001e 0000 ................
  74646. 0804062c <sys_tem_ids>:
  74647. 804062c: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74648. 804063c: 0005 0000 0006 0000 0007 0000 ............
  74649. 08040648 <ifentry_ids>:
  74650. 8040648: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74651. 8040658: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  74652. 8040668: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  74653. 8040678: 000d 0000 000e 0000 000f 0000 0010 0000 ................
  74654. 8040688: 0011 0000 0012 0000 0013 0000 0014 0000 ................
  74655. 8040698: 0015 0000 0016 0000 ........
  74656. 080406a0 <icmp_scalar>:
  74657. 80406a0: 0bf9 0803 0c25 0803 09cb 0803 09cf 0803 ....%...........
  74658. 80406b0: 0001 0000 ....
  74659. 080406b4 <internet>:
  74660. 80406b4: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74661. 80406c4: 0002 0002 17bc 2000 0794 0804 ....... ....
  74662. 080406d0 <mgmt_ids>:
  74663. 80406d0: 0001 0000 ....
  74664. 080406d4 <sys_tem>:
  74665. 80406d4: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74666. 80406e4: 0002 0007 062c 0804 0068 0804 ....,...h...
  74667. 080406f0 <ipaddrentry>:
  74668. 80406f0: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74669. 8040700: 0002 0005 0404 0804 03f0 0804 ............
  74670. 0804070c <tcpconnentry_ids>:
  74671. 804070c: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74672. 804071c: 0005 0000 ....
  74673. 08040720 <ifentry_nodes>:
  74674. 8040720: 169c 2000 169c 2000 169c 2000 169c 2000 ... ... ... ...
  74675. 8040730: 169c 2000 169c 2000 169c 2000 169c 2000 ... ... ... ...
  74676. 8040740: 169c 2000 169c 2000 169c 2000 169c 2000 ... ... ... ...
  74677. 8040750: 169c 2000 169c 2000 169c 2000 169c 2000 ... ... ... ...
  74678. 8040760: 169c 2000 169c 2000 169c 2000 169c 2000 ... ... ... ...
  74679. 8040770: 169c 2000 169c 2000 ... ...
  74680. 08040778 <mib2_ip>:
  74681. 8040778: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74682. 8040788: 0002 0017 0538 0804 030c 0804 ....8.......
  74683. 08040794 <internet_nodes>:
  74684. 8040794: ffe0 0803 0830 0804 ....0...
  74685. 0804079c <prefix>:
  74686. 804079c: 0001 0000 0003 0000 0006 0000 0001 0000 ................
  74687. 080407ac <snmp_version>:
  74688. 80407ac: 0000 0000 ....
  74689. 080407b0 <snmp_publiccommunity>:
  74690. 80407b0: 7570 6c62 6369 ff00 public.
  74691. 080407b7 <ethbroadcast>:
  74692. 80407b7: ffff ffff ffff ......
  74693. 080407bd <ethzero>:
  74694. 80407bd: 0000 0000 0000 7445 5f68 6669 2000 7325 ......Eth_if. %s
  74695. 80407cd: 0d0a 4400 4348 4350 696c 6e65 0074 6577 ...DHCPClient.we
  74696. 80407dd: 5262 6965 696e 0074 6552 6e69 7469 6557 bReinit.ReinitWe
  74697. 80407ed: 0062 0400 b..
  74698. 080407f0 <mib_pivate_nodes>:
  74699. 80407f0: 0904 0804 ....
  74700. 080407f4 <bt6701_nodes>:
  74701. 80407f4: 0870 0804 p...
  74702. 080407f8 <signals_nodes>:
  74703. 80407f8: 0924 0804 0924 0804 0924 0804 0924 0804 $...$...$...$...
  74704. 8040808: 0924 0804 0924 0804 0924 0804 0924 0804 $...$...$...$...
  74705. 8040818: 0924 0804 0924 0804 0924 0804 0924 0804 $...$...$...$...
  74706. 8040828: 0924 0804 $...
  74707. 0804082c <rotek_ids>:
  74708. 804082c: 038f 0000 ....
  74709. 08040830 <mib_private>:
  74710. 8040830: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74711. 8040840: 0002 0001 08fc 0804 07f0 0804 ............
  74712. 0804084c <bt6701>:
  74713. 804084c: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74714. 804085c: 0002 0001 08f8 0804 07f4 0804 ............
  74715. 08040868 <enterprises_ids>:
  74716. 8040868: a318 0000 ....
  74717. 0804086c <rotek_nodes>:
  74718. 804086c: 093c 0804 <...
  74719. 08040870 <signals>:
  74720. 8040870: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74721. 8040880: 0002 000d 088c 0804 07f8 0804 ............
  74722. 0804088c <signals_ids>:
  74723. 804088c: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  74724. 804089c: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  74725. 80408ac: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  74726. 80408bc: 000d 0000 0000 0000 0000 0000 0000 0000 ................
  74727. 80408cc: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74728. 80408dc: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  74729. 80408ec: 0000 0000 0000 0000 0000 0000 ............
  74730. 080408f8 <bt6701_ids>:
  74731. 80408f8: 0001 0000 ....
  74732. 080408fc <mib_private_ids>:
  74733. 80408fc: 0001 0000 ....
  74734. 08040900 <enterprises_nodes>:
  74735. 8040900: 0958 0804 X...
  74736. 08040904 <enterprises>:
  74737. 8040904: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74738. 8040914: 0002 0001 0868 0804 0900 0804 ....h.......
  74739. 08040920 <swt_ids>:
  74740. 8040920: 0001 0000 ....
  74741. 08040924 <signals_var>:
  74742. 8040924: 4d05 0803 4cc9 0803 4cb1 0803 4df5 0803 .M...L...L...M..
  74743. 8040934: 0001 0000 ....
  74744. 08040938 <swt_nodes>:
  74745. 8040938: 084c 0804 L...
  74746. 0804093c <swt>:
  74747. 804093c: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74748. 804094c: 0002 0001 0920 0804 0938 0804 .... ...8...
  74749. 08040958 <rotek>:
  74750. 8040958: 09c3 0803 09c9 0803 09cb 0803 09cf 0803 ................
  74751. 8040968: 0002 0001 082c 0804 086c 0804 3025 6432 ....,...l...%02d
  74752. 8040978: 252e 3230 2e64 3025 6432 2520 3230 3a64 .%02d.%02d %02d:
  74753. 8040988: 3025 6432 253a 3230 0064 6425 252e 2e64 %02d:%02d.%d.%d.
  74754. 8040998: 6425 2520 3a64 6425 253a 2064 0d0a 0000 %d %d:%d:%d ....
  74755. 80409a8: 666e 0000 6e69 7469 0079 0000 6e61 0000 nf..inity...an..
  74756. 80409b8: 4241 4443 4645 0000 6261 6463 6665 0000 ABCDEF..abcdef..
  74757. 80409c8: 3130 3332 3534 3736 3938 0000 0043 0000 0123456789..C...
  74758. 80409d8: 4f50 4953 0058 0000 0000 0000 002e 0000 POSIX...........
  74759. 080409e8 <_init>:
  74760. 80409e8: b5f8 push {r3, r4, r5, r6, r7, lr}
  74761. 80409ea: bf00 nop
  74762. 80409ec: bcf8 pop {r3, r4, r5, r6, r7}
  74763. 80409ee: bc08 pop {r3}
  74764. 80409f0: 469e mov lr, r3
  74765. 80409f2: 4770 bx lr
  74766. 080409f4 <_fini>:
  74767. 80409f4: b5f8 push {r3, r4, r5, r6, r7, lr}
  74768. 80409f6: bf00 nop
  74769. 80409f8: bcf8 pop {r3, r4, r5, r6, r7}
  74770. 80409fa: bc08 pop {r3}
  74771. 80409fc: 469e mov lr, r3
  74772. 80409fe: 4770 bx lr